diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.lock b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.lock new file mode 100644 index 0000000..e69de29 diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.log b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.log new file mode 100644 index 0000000..bbaaf1b --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.log @@ -0,0 +1,6141 @@ +!SESSION 2017-09-08 14:44:44.575 ----------------------------------------------- +eclipse.buildId=4.6.3.M20170301-0400 +java.version=1.8.0_141 +java.vendor=Oracle Corporation +BootLoader constants: OS=win32, ARCH=x86_64, WS=win32, NL=en_GB +Framework arguments: -product org.eclipse.epp.package.cpp.product +Command-line arguments: -os win32 -ws win32 -arch x86_64 -product org.eclipse.epp.package.cpp.product + +!ENTRY org.eclipse.egit.ui 2 0 2017-09-08 14:48:21.251 +!MESSAGE Warning: The environment variable HOME is not set. The following directory will be used to store the Git +user global configuration and to define the default location to store repositories: 'H:\'. If this is +not correct please set the HOME environment variable and restart Eclipse. Otherwise Git for Windows and +EGit might behave differently since they see different configuration options. +This warning can be switched off on the Team > Git > Confirmations and Warnings preference page. + +!ENTRY org.eclipse.equinox.registry 4 1 2017-09-08 14:48:25.183 +!MESSAGE Executable extension definition for "resolver" not found. + +!ENTRY org.eclipse.equinox.registry 4 1 2017-09-08 14:48:25.322 +!MESSAGE Executable extension definition for "resolver" not found. + +!ENTRY org.eclipse.equinox.registry 4 1 2017-09-08 14:48:25.330 +!MESSAGE Executable extension definition for "resolver" not found. + +!ENTRY fr.ac6.mcu.ide 1 1 2017-09-08 14:48:25.505 +!MESSAGE Started RMI Server, listening on port 21112 + +!ENTRY org.eclipse.cdt.core 1 0 2017-09-08 14:58:57.757 +!MESSAGE Indexed 'hsb-mrts' (27 sources, 27 headers) in 1,29 sec: 3.867 declarations; 12.223 references; 11 unresolved inclusions; 17 syntax errors; 4.206 unresolved names (21%) + +!ENTRY org.tigris.subversion.subclipse.core 4 0 2017-09-08 14:59:01.005 +!MESSAGE Could not auto-share project hsb-mrts +!STACK 1 +org.tigris.subversion.subclipse.core.SVNException: Provided SVN information does not match that on disk for project 'hsb-mrts'. + at org.tigris.subversion.subclipse.core.resources.SVNWorkspaceRoot.setSharing(SVNWorkspaceRoot.java:206) + at org.tigris.subversion.subclipse.core.SVNTeamProviderType$AutoShareJob.autoconnectSVNProject(SVNTeamProviderType.java:140) + at org.tigris.subversion.subclipse.core.SVNTeamProviderType$AutoShareJob.run(SVNTeamProviderType.java:106) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +!SUBENTRY 1 org.tigris.subversion.subclipse.core 4 4 2017-09-08 14:59:01.006 +!MESSAGE Provided SVN information does not match that on disk for project 'hsb-mrts'. + +!ENTRY org.eclipse.equinox.p2.metadata.repository 4 1000 2017-09-08 15:16:56.277 +!MESSAGE No repository found at http://matclipse.eclipselabs.org.codespot.com/git.update/. + +!ENTRY org.eclipse.equinox.p2.metadata.repository 4 1000 2017-09-08 15:17:01.405 +!MESSAGE No repository found at https://github.com/krystophny/matclipse.git/git.update. + +!ENTRY org.eclipse.equinox.p2.metadata.repository 4 1000 2017-09-08 15:17:09.290 +!MESSAGE No repository found at https://github.com/krystophny/matclipse.git. +!SESSION 2017-09-08 15:45:13.165 ----------------------------------------------- +eclipse.buildId=4.6.3.M20170301-0400 +java.version=1.8.0_141 +java.vendor=Oracle Corporation +BootLoader constants: OS=win32, ARCH=x86_64, WS=win32, NL=en_GB +Framework arguments: -product org.eclipse.epp.package.cpp.product +Command-line arguments: -os win32 -ws win32 -arch x86_64 -product org.eclipse.epp.package.cpp.product + +!ENTRY org.eclipse.egit.ui 2 0 2017-09-08 15:45:23.895 +!MESSAGE Warning: The environment variable HOME is not set. The following directory will be used to store the Git +user global configuration and to define the default location to store repositories: 'H:\'. If this is +not correct please set the HOME environment variable and restart Eclipse. Otherwise Git for Windows and +EGit might behave differently since they see different configuration options. +This warning can be switched off on the Team > Git > Confirmations and Warnings preference page. + +!ENTRY org.eclipse.equinox.registry 4 1 2017-09-08 15:45:26.752 +!MESSAGE Executable extension definition for "resolver" not found. + +!ENTRY org.eclipse.equinox.registry 4 1 2017-09-08 15:45:26.892 +!MESSAGE Executable extension definition for "resolver" not found. + +!ENTRY org.eclipse.equinox.registry 4 1 2017-09-08 15:45:26.924 +!MESSAGE Executable extension definition for "resolver" not found. + +!ENTRY fr.ac6.mcu.ide 1 1 2017-09-08 15:45:26.971 +!MESSAGE Started RMI Server, listening on port 21112 + +!ENTRY org.eclipse.cdt.core 1 0 2017-09-08 15:47:31.744 +!MESSAGE Indexed 'hsb-mrts' (1 sources, 0 headers) in 0,153 sec: 7 declarations; 12 references; 2 unresolved inclusions; 0 syntax errors; 4 unresolved names (17%) + +!ENTRY org.tigris.subversion.subclipse.core 4 0 2017-09-08 15:47:34.871 +!MESSAGE Could not auto-share project hsb-mrts +!STACK 1 +org.tigris.subversion.subclipse.core.SVNException: Provided SVN information does not match that on disk for project 'hsb-mrts'. + at org.tigris.subversion.subclipse.core.resources.SVNWorkspaceRoot.setSharing(SVNWorkspaceRoot.java:206) + at org.tigris.subversion.subclipse.core.SVNTeamProviderType$AutoShareJob.autoconnectSVNProject(SVNTeamProviderType.java:140) + at org.tigris.subversion.subclipse.core.SVNTeamProviderType$AutoShareJob.run(SVNTeamProviderType.java:106) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +!SUBENTRY 1 org.tigris.subversion.subclipse.core 4 4 2017-09-08 15:47:34.871 +!MESSAGE Provided SVN information does not match that on disk for project 'hsb-mrts'. + +!ENTRY org.tigris.subversion.subclipse.core 4 0 2017-09-08 15:51:29.102 +!MESSAGE Could not auto-share project FreeRTOS +!STACK 1 +org.tigris.subversion.subclipse.core.SVNException: Provided SVN information does not match that on disk for project 'FreeRTOS'. + at org.tigris.subversion.subclipse.core.resources.SVNWorkspaceRoot.setSharing(SVNWorkspaceRoot.java:206) + at org.tigris.subversion.subclipse.core.SVNTeamProviderType$AutoShareJob.autoconnectSVNProject(SVNTeamProviderType.java:140) + at org.tigris.subversion.subclipse.core.SVNTeamProviderType$AutoShareJob.run(SVNTeamProviderType.java:106) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +!SUBENTRY 1 org.tigris.subversion.subclipse.core 4 4 2017-09-08 15:51:29.102 +!MESSAGE Provided SVN information does not match that on disk for project 'FreeRTOS'. + +!ENTRY org.eclipse.ui.navigator 4 0 2017-09-08 15:54:42.662 +!MESSAGE Cannot add P/hsb-mrts to the list of segments in P/hsb-mrts::P/FreeRTOS:: as a parent. +!STACK 0 +org.eclipse.ui.internal.navigator.NavigatorContentServiceContentProvider$CyclicPathException: Cannot add P/hsb-mrts to the list of segments in P/hsb-mrts::P/FreeRTOS:: as a parent. + at org.eclipse.ui.internal.navigator.NavigatorContentServiceContentProvider$TreePathCompiler.addParent(NavigatorContentServiceContentProvider.java:539) + at org.eclipse.ui.internal.navigator.NavigatorContentServiceContentProvider.findPaths(NavigatorContentServiceContentProvider.java:602) + at org.eclipse.ui.internal.navigator.NavigatorContentServiceContentProvider.findPaths(NavigatorContentServiceContentProvider.java:603) + at org.eclipse.ui.internal.navigator.NavigatorContentServiceContentProvider.getParents(NavigatorContentServiceContentProvider.java:330) + at org.eclipse.jface.viewers.AbstractTreeViewer.getParentElement(AbstractTreeViewer.java:1694) + at org.eclipse.jface.viewers.TreeViewer.getParentElement(TreeViewer.java:558) + at org.eclipse.jface.viewers.AbstractTreeViewer.internalExpand(AbstractTreeViewer.java:1631) + at org.eclipse.jface.viewers.AbstractTreeViewer.setExpandedElements(AbstractTreeViewer.java:2410) + at org.eclipse.ui.internal.navigator.framelist.TreeViewerFrameSource.frameChanged(TreeViewerFrameSource.java:72) + at org.eclipse.ui.internal.navigator.CommonNavigatorFrameSource.frameChanged(CommonNavigatorFrameSource.java:52) + at org.eclipse.ui.internal.navigator.framelist.TreeViewerFrameSource.handlePropertyChange(TreeViewerFrameSource.java:171) + at org.eclipse.ui.internal.navigator.framelist.TreeViewerFrameSource$1.propertyChange(TreeViewerFrameSource.java:48) + at org.eclipse.ui.internal.navigator.framelist.FrameList.firePropertyChange(FrameList.java:90) + at org.eclipse.ui.internal.navigator.framelist.FrameList.setCurrent(FrameList.java:205) + at org.eclipse.ui.internal.navigator.framelist.FrameList.gotoFrame(FrameList.java:162) + at org.eclipse.ui.internal.navigator.framelist.GoIntoAction.run(GoIntoAction.java:51) + at org.eclipse.jface.action.Action.runWithEvent(Action.java:473) + at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:565) + at org.eclipse.jface.action.ActionContributionItem.lambda$4(ActionContributionItem.java:397) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4418) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1079) + at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4236) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3824) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) + +!ENTRY org.eclipse.ui.navigator 4 0 2017-09-08 15:54:42.665 +!MESSAGE Cannot add P/hsb-mrts to the list of segments in P/hsb-mrts::P/STM32F10x_StdPeriph_Lib_V3.5.0:: as a parent. +!STACK 0 +org.eclipse.ui.internal.navigator.NavigatorContentServiceContentProvider$CyclicPathException: Cannot add P/hsb-mrts to the list of segments in P/hsb-mrts::P/STM32F10x_StdPeriph_Lib_V3.5.0:: as a parent. + at org.eclipse.ui.internal.navigator.NavigatorContentServiceContentProvider$TreePathCompiler.addParent(NavigatorContentServiceContentProvider.java:539) + at org.eclipse.ui.internal.navigator.NavigatorContentServiceContentProvider.findPaths(NavigatorContentServiceContentProvider.java:602) + at org.eclipse.ui.internal.navigator.NavigatorContentServiceContentProvider.findPaths(NavigatorContentServiceContentProvider.java:603) + at org.eclipse.ui.internal.navigator.NavigatorContentServiceContentProvider.getParents(NavigatorContentServiceContentProvider.java:330) + at org.eclipse.jface.viewers.AbstractTreeViewer.getParentElement(AbstractTreeViewer.java:1694) + at org.eclipse.jface.viewers.TreeViewer.getParentElement(TreeViewer.java:558) + at org.eclipse.jface.viewers.AbstractTreeViewer.internalExpand(AbstractTreeViewer.java:1631) + at org.eclipse.jface.viewers.AbstractTreeViewer.setExpandedElements(AbstractTreeViewer.java:2410) + at org.eclipse.ui.internal.navigator.framelist.TreeViewerFrameSource.frameChanged(TreeViewerFrameSource.java:72) + at org.eclipse.ui.internal.navigator.CommonNavigatorFrameSource.frameChanged(CommonNavigatorFrameSource.java:52) + at org.eclipse.ui.internal.navigator.framelist.TreeViewerFrameSource.handlePropertyChange(TreeViewerFrameSource.java:171) + at org.eclipse.ui.internal.navigator.framelist.TreeViewerFrameSource$1.propertyChange(TreeViewerFrameSource.java:48) + at org.eclipse.ui.internal.navigator.framelist.FrameList.firePropertyChange(FrameList.java:90) + at org.eclipse.ui.internal.navigator.framelist.FrameList.setCurrent(FrameList.java:205) + at org.eclipse.ui.internal.navigator.framelist.FrameList.gotoFrame(FrameList.java:162) + at org.eclipse.ui.internal.navigator.framelist.GoIntoAction.run(GoIntoAction.java:51) + at org.eclipse.jface.action.Action.runWithEvent(Action.java:473) + at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:565) + at org.eclipse.jface.action.ActionContributionItem.lambda$4(ActionContributionItem.java:397) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4418) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1079) + at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4236) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3824) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) + +!ENTRY org.eclipse.equinox.p2.metadata.repository 4 1000 2017-09-08 16:12:01.177 +!MESSAGE No repository found at http://matclipse.eclipselabs.org.codespot.com/git.update/. + +!ENTRY org.eclipse.equinox.p2.metadata.repository 4 1000 2017-09-08 16:12:04.667 +!MESSAGE No repository found at https://github.com/krystophny/matclipse.git/git.update. + +!ENTRY org.eclipse.equinox.p2.metadata.repository 4 1000 2017-09-08 16:12:16.821 +!MESSAGE No repository found at https://github.com/krystophny/matclipse.git. +!SESSION 2017-09-11 08:26:07.133 ----------------------------------------------- +eclipse.buildId=4.6.3.M20170301-0400 +java.version=1.8.0_141 +java.vendor=Oracle Corporation +BootLoader constants: OS=win32, ARCH=x86_64, WS=win32, NL=en_GB +Framework arguments: -product org.eclipse.epp.package.cpp.product +Command-line arguments: -os win32 -ws win32 -arch x86_64 -product org.eclipse.epp.package.cpp.product + +!ENTRY org.eclipse.egit.ui 2 0 2017-09-11 08:26:17.516 +!MESSAGE Warning: The environment variable HOME is not set. The following directory will be used to store the Git +user global configuration and to define the default location to store repositories: 'H:\'. If this is +not correct please set the HOME environment variable and restart Eclipse. Otherwise Git for Windows and +EGit might behave differently since they see different configuration options. +This warning can be switched off on the Team > Git > Confirmations and Warnings preference page. + +!ENTRY org.eclipse.equinox.registry 4 1 2017-09-11 08:26:24.895 +!MESSAGE Executable extension definition for "resolver" not found. + +!ENTRY org.eclipse.equinox.registry 4 1 2017-09-11 08:26:25.005 +!MESSAGE Executable extension definition for "resolver" not found. + +!ENTRY org.eclipse.equinox.registry 4 1 2017-09-11 08:26:25.034 +!MESSAGE Executable extension definition for "resolver" not found. + +!ENTRY fr.ac6.mcu.ide 1 1 2017-09-11 08:26:25.148 +!MESSAGE Started RMI Server, listening on port 21112 + +!ENTRY org.eclipse.equinox.p2.metadata.repository 4 1000 2017-09-11 09:06:45.690 +!MESSAGE No repository found at http://matclipse.eclipselabs.org.codespot.com/git.update/. + +!ENTRY org.eclipse.equinox.p2.metadata.repository 4 1000 2017-09-11 09:06:49.226 +!MESSAGE No repository found at https://github.com/krystophny/matclipse.git/git.update. + +!ENTRY org.eclipse.equinox.p2.metadata.repository 4 1000 2017-09-11 09:06:54.742 +!MESSAGE No repository found at https://github.com/krystophny/matclipse.git. + +!ENTRY org.eclipse.cdt.ui 2 0 2017-09-11 09:08:45.264 +!MESSAGE Default project not found in New C/C++ Project Wizard + +!ENTRY org.eclipse.cdt.core 1 0 2017-09-11 09:09:09.313 +!MESSAGE Indexed 'STM32F10x_StdPeriph_Lib_V3.5.0' (25 sources, 26 headers) in 1,67 sec: 3.704 declarations; 25.673 references; 3 unresolved inclusions; 18 syntax errors; 7.152 unresolved names (20%) + +!ENTRY org.eclipse.cdt.core 1 0 2017-09-11 09:21:17.228 +!MESSAGE Indexed 'STM32F10x_StdPeriph_Lib_V3.5.0' (25 sources, 34 headers) in 0,73 sec: 3.948 declarations; 33.473 references; 0 unresolved inclusions; 1 syntax errors; 0 unresolved names (0%) + +!ENTRY org.eclipse.cdt.core 1 0 2017-09-11 09:26:27.290 +!MESSAGE Indexed 'STM32F10x_StdPeriph_Lib_V3.5.0' (25 sources, 34 headers) in 0,68 sec: 4.045 declarations; 34.050 references; 0 unresolved inclusions; 0 syntax errors; 0 unresolved names (0%) + +!ENTRY org.eclipse.cdt.core 1 0 2017-09-11 09:33:33.030 +!MESSAGE Indexed 'STM32F10x_StdPeriph_Lib_V3.5.0' (25 sources, 34 headers) in 0,626 sec: 4.045 declarations; 34.050 references; 0 unresolved inclusions; 0 syntax errors; 0 unresolved names (0%) + +!ENTRY org.eclipse.core.jobs 4 2 2017-09-12 09:07:51.828 +!MESSAGE An internal error occurred during: "Update validate job". +!STACK 0 +java.lang.IllegalStateException: BundleContext is no longer valid + at org.eclipse.osgi.internal.framework.BundleContextImpl.checkValid(BundleContextImpl.java:984) + at org.eclipse.osgi.internal.framework.BundleContextImpl.getServiceReference(BundleContextImpl.java:559) + at org.eclipse.osgi.internal.framework.BundleContextImpl.getServiceReference(BundleContextImpl.java:1011) + at org.eclipse.equinox.internal.p2.core.helpers.ServiceHelper.getService(ServiceHelper.java:27) + at org.eclipse.equinox.internal.p2.repository.helpers.AbstractRepositoryManager.getSharedPreferences(AbstractRepositoryManager.java:512) + at org.eclipse.equinox.internal.p2.repository.helpers.AbstractRepositoryManager.restoreRepositories(AbstractRepositoryManager.java:1016) + at org.eclipse.equinox.internal.p2.repository.helpers.AbstractRepositoryManager.getRepositoryProperty(AbstractRepositoryManager.java:564) + at org.eclipse.oomph.p2.internal.core.CachingRepositoryManager.loadRepository(CachingRepositoryManager.java:229) + at org.eclipse.oomph.p2.internal.core.CachingRepositoryManager$Metadata.loadRepository(CachingRepositoryManager.java:463) + at org.eclipse.equinox.internal.p2.metadata.repository.MetadataRepositoryManager.loadRepository(MetadataRepositoryManager.java:96) + at org.eclipse.equinox.internal.p2.metadata.repository.MetadataRepositoryManager.loadRepository(MetadataRepositoryManager.java:92) + at org.eclipse.equinox.p2.engine.ProvisioningContext.loadMetadataRepository(ProvisioningContext.java:211) + at org.eclipse.equinox.p2.engine.ProvisioningContext.getLoadedMetadataRepositories(ProvisioningContext.java:194) + at org.eclipse.equinox.p2.engine.ProvisioningContext.getMetadata(ProvisioningContext.java:275) + at org.eclipse.equinox.internal.p2.director.SimplePlanner.updatesFor(SimplePlanner.java:784) + at org.eclipse.equinox.p2.operations.UpdateOperation.updatesFor(UpdateOperation.java:142) + at org.eclipse.equinox.p2.operations.UpdateOperation.computeProfileChangeRequest(UpdateOperation.java:179) + at org.eclipse.equinox.p2.operations.UpdateOperation$1.run(UpdateOperation.java:323) + at org.eclipse.equinox.internal.p2.operations.SearchForUpdatesResolutionJob.runModal(SearchForUpdatesResolutionJob.java:37) + at org.eclipse.equinox.p2.operations.ProfileChangeOperation.resolveModal(ProfileChangeOperation.java:115) + at org.eclipse.equinox.internal.p2.ui.sdk.scheduler.AutomaticUpdater.updatesAvailable(AutomaticUpdater.java:111) + at org.eclipse.equinox.internal.p2.ui.sdk.scheduler.AutomaticUpdater.updatesAvailable(AutomaticUpdater.java:92) + at org.eclipse.equinox.internal.p2.ui.sdk.scheduler.AutomaticUpdater$6.run(AutomaticUpdater.java:351) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +!SESSION 2017-09-12 09:07:52.126 ----------------------------------------------- +eclipse.buildId=4.6.3.M20170301-0400 +java.version=1.8.0_141 +java.vendor=Oracle Corporation +BootLoader constants: OS=win32, ARCH=x86_64, WS=win32, NL=en_GB +Framework arguments: -product org.eclipse.epp.package.cpp.product +Command-line arguments: -os win32 -ws win32 -arch x86_64 -product org.eclipse.epp.package.cpp.product + +!ENTRY org.eclipse.equinox.registry 4 1 2017-09-12 09:08:38.957 +!MESSAGE Executable extension definition for "resolver" not found. + +!ENTRY org.eclipse.equinox.registry 4 1 2017-09-12 09:08:38.962 +!MESSAGE Executable extension definition for "resolver" not found. + +!ENTRY org.eclipse.equinox.registry 4 1 2017-09-12 09:08:38.964 +!MESSAGE Executable extension definition for "resolver" not found. + +!ENTRY org.eclipse.egit.ui 2 0 2017-09-12 09:08:39.709 +!MESSAGE Warning: The environment variable HOME is not set. The following directory will be used to store the Git +user global configuration and to define the default location to store repositories: 'H:\'. If this is +not correct please set the HOME environment variable and restart Eclipse. Otherwise Git for Windows and +EGit might behave differently since they see different configuration options. +This warning can be switched off on the Team > Git > Confirmations and Warnings preference page. + +!ENTRY fr.ac6.mcu.ide 1 1 2017-09-12 09:08:43.021 +!MESSAGE Started RMI Server, listening on port 21112 + +!ENTRY org.eclipse.cdt.ui 2 0 2017-09-12 09:15:59.971 +!MESSAGE Default project not found in New C/C++ Project Wizard + +!ENTRY org.eclipse.cdt.core 4 0 2017-09-12 09:16:09.244 +!MESSAGE Error: Cannot run program "gcc": Launching failed +!STACK 0 +java.io.IOException: Cannot run program "gcc": Launching failed + at org.eclipse.cdt.utils.spawner.Spawner.exec(Spawner.java:349) + at org.eclipse.cdt.utils.spawner.Spawner.(Spawner.java:91) + at org.eclipse.cdt.utils.spawner.ProcessFactory.exec(ProcessFactory.java:91) + at org.eclipse.cdt.core.CommandLauncher.execute(CommandLauncher.java:194) + at org.eclipse.cdt.internal.core.BuildRunnerHelper.build(BuildRunnerHelper.java:263) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector.runProgramForLanguage(AbstractBuiltinSpecsDetector.java:759) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector.runForLanguage(AbstractBuiltinSpecsDetector.java:689) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector.runForEachLanguage(AbstractBuiltinSpecsDetector.java:562) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector$1.runInWorkspace(AbstractBuiltinSpecsDetector.java:496) + at org.eclipse.core.internal.resources.InternalWorkspaceJob.run(InternalWorkspaceJob.java:39) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) + +!ENTRY org.eclipse.cdt.core 4 0 2017-09-12 09:16:09.335 +!MESSAGE Error: Cannot run program "g++": Launching failed +!STACK 0 +java.io.IOException: Cannot run program "g++": Launching failed + at org.eclipse.cdt.utils.spawner.Spawner.exec(Spawner.java:349) + at org.eclipse.cdt.utils.spawner.Spawner.(Spawner.java:91) + at org.eclipse.cdt.utils.spawner.ProcessFactory.exec(ProcessFactory.java:91) + at org.eclipse.cdt.core.CommandLauncher.execute(CommandLauncher.java:194) + at org.eclipse.cdt.internal.core.BuildRunnerHelper.build(BuildRunnerHelper.java:263) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector.runProgramForLanguage(AbstractBuiltinSpecsDetector.java:759) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector.runForLanguage(AbstractBuiltinSpecsDetector.java:689) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector.runForEachLanguage(AbstractBuiltinSpecsDetector.java:562) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector$1.runInWorkspace(AbstractBuiltinSpecsDetector.java:496) + at org.eclipse.core.internal.resources.InternalWorkspaceJob.run(InternalWorkspaceJob.java:39) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) + +!ENTRY org.eclipse.cdt.core 4 0 2017-09-12 09:16:09.477 +!MESSAGE Error: Cannot run program "gcc": Launching failed +!STACK 0 +java.io.IOException: Cannot run program "gcc": Launching failed + at org.eclipse.cdt.utils.spawner.Spawner.exec(Spawner.java:349) + at org.eclipse.cdt.utils.spawner.Spawner.(Spawner.java:91) + at org.eclipse.cdt.utils.spawner.ProcessFactory.exec(ProcessFactory.java:91) + at org.eclipse.cdt.core.CommandLauncher.execute(CommandLauncher.java:194) + at org.eclipse.cdt.internal.core.BuildRunnerHelper.build(BuildRunnerHelper.java:263) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector.runProgramForLanguage(AbstractBuiltinSpecsDetector.java:759) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector.runForLanguage(AbstractBuiltinSpecsDetector.java:689) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector.runForEachLanguage(AbstractBuiltinSpecsDetector.java:562) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector$1.runInWorkspace(AbstractBuiltinSpecsDetector.java:496) + at org.eclipse.core.internal.resources.InternalWorkspaceJob.run(InternalWorkspaceJob.java:39) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) + +!ENTRY org.eclipse.cdt.core 4 0 2017-09-12 09:16:09.793 +!MESSAGE Error: Cannot run program "g++": Launching failed +!STACK 0 +java.io.IOException: Cannot run program "g++": Launching failed + at org.eclipse.cdt.utils.spawner.Spawner.exec(Spawner.java:349) + at org.eclipse.cdt.utils.spawner.Spawner.(Spawner.java:91) + at org.eclipse.cdt.utils.spawner.ProcessFactory.exec(ProcessFactory.java:91) + at org.eclipse.cdt.core.CommandLauncher.execute(CommandLauncher.java:194) + at org.eclipse.cdt.internal.core.BuildRunnerHelper.build(BuildRunnerHelper.java:263) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector.runProgramForLanguage(AbstractBuiltinSpecsDetector.java:759) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector.runForLanguage(AbstractBuiltinSpecsDetector.java:689) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector.runForEachLanguage(AbstractBuiltinSpecsDetector.java:562) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector$1.runInWorkspace(AbstractBuiltinSpecsDetector.java:496) + at org.eclipse.core.internal.resources.InternalWorkspaceJob.run(InternalWorkspaceJob.java:39) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) + +!ENTRY org.eclipse.cdt.core 1 0 2017-09-12 09:16:12.683 +!MESSAGE Indexed 'FreeRTOS' (124 sources, 150 headers) in 3,29 sec: 13.159 declarations; 25.365 references; 228 unresolved inclusions; 3.302 syntax errors; 5.391 unresolved names (12%) + +!ENTRY org.eclipse.cdt.core 1 0 2017-09-12 09:36:07.287 +!MESSAGE Indexed 'hsb-mrts' (2 sources, 44 headers) in 0,198 sec: 1.386 declarations; 2.613 references; 0 unresolved inclusions; 0 syntax errors; 0 unresolved names (0%) + +!ENTRY org.eclipse.equinox.p2.transport.ecf 4 1002 2017-09-12 10:06:52.324 +!MESSAGE Unable to connect to repository http://download.eclipse.org/releases/neon/compositeContent.xml +!STACK 0 +java.net.ConnectException: Connection timed out: connect + at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) + at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source) + at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source) + at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source) + at java.net.AbstractPlainSocketImpl.connect(Unknown Source) + at java.net.PlainSocketImpl.connect(Unknown Source) + at java.net.SocksSocketImpl.connect(Unknown Source) + at java.net.Socket.connect(Unknown Source) + at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:117) + at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:177) + at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:304) + at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:611) + at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:446) + at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:863) + at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82) + at org.eclipse.ecf.provider.filetransfer.httpclient4.HttpClientFileSystemBrowser.runRequest(HttpClientFileSystemBrowser.java:263) + at org.eclipse.ecf.provider.filetransfer.browse.AbstractFileSystemBrowser$DirectoryJob.run(AbstractFileSystemBrowser.java:69) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) + +!ENTRY org.eclipse.equinox.p2.transport.ecf 2 0 2017-09-12 10:08:03.209 +!MESSAGE Connection to http://download.eclipse.org/tools/cdt/releases/9.2/r.1/site.xml failed on Connection timed out: connect. Retry attempt 0 started +!STACK 0 +java.net.ConnectException: Connection timed out: connect + at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) + at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source) + at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source) + at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source) + at java.net.AbstractPlainSocketImpl.connect(Unknown Source) + at java.net.PlainSocketImpl.connect(Unknown Source) + at java.net.SocksSocketImpl.connect(Unknown Source) + at java.net.Socket.connect(Unknown Source) + at org.eclipse.ecf.internal.provider.filetransfer.httpclient4.ECFHttpClientProtocolSocketFactory.connectSocket(ECFHttpClientProtocolSocketFactory.java:86) + at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:177) + at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:144) + at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:131) + at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:611) + at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:446) + at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:863) + at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82) + at org.eclipse.ecf.provider.filetransfer.httpclient4.HttpClientRetrieveFileTransfer.performConnect(HttpClientRetrieveFileTransfer.java:1084) + at org.eclipse.ecf.provider.filetransfer.httpclient4.HttpClientRetrieveFileTransfer.access$0(HttpClientRetrieveFileTransfer.java:1075) + at org.eclipse.ecf.provider.filetransfer.httpclient4.HttpClientRetrieveFileTransfer$1.performFileTransfer(HttpClientRetrieveFileTransfer.java:1071) + at org.eclipse.ecf.filetransfer.FileTransferJob.run(FileTransferJob.java:74) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) + +!ENTRY org.eclipse.equinox.p2.core 4 0 2017-09-12 10:08:12.866 +!MESSAGE Provisioning exception +!STACK 1 +org.eclipse.equinox.p2.core.ProvisionException: No repository found at http://download.eclipse.org/tools/cdt/releases/9.2/r.1. + at org.eclipse.equinox.internal.p2.repository.helpers.AbstractRepositoryManager.fail(AbstractRepositoryManager.java:395) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.oomph.util.ReflectUtil.invokeMethod(ReflectUtil.java:117) + at org.eclipse.oomph.p2.internal.core.CachingRepositoryManager.fail(CachingRepositoryManager.java:340) + at org.eclipse.oomph.p2.internal.core.CachingRepositoryManager.loadRepository(CachingRepositoryManager.java:239) + at org.eclipse.oomph.p2.internal.core.CachingRepositoryManager$Metadata.loadRepository(CachingRepositoryManager.java:463) + at org.eclipse.equinox.internal.p2.metadata.repository.MetadataRepositoryManager.loadRepository(MetadataRepositoryManager.java:96) + at org.eclipse.equinox.internal.p2.metadata.repository.MetadataRepositoryManager.loadRepository(MetadataRepositoryManager.java:92) + at org.eclipse.equinox.internal.p2.metadata.repository.CompositeMetadataRepository.addChild(CompositeMetadataRepository.java:166) + at org.eclipse.equinox.internal.p2.metadata.repository.CompositeMetadataRepository.(CompositeMetadataRepository.java:106) + at org.eclipse.equinox.internal.p2.metadata.repository.CompositeMetadataRepositoryFactory.load(CompositeMetadataRepositoryFactory.java:122) + at org.eclipse.equinox.internal.p2.metadata.repository.MetadataRepositoryManager.factoryLoad(MetadataRepositoryManager.java:57) + at org.eclipse.equinox.internal.p2.repository.helpers.AbstractRepositoryManager.loadRepository(AbstractRepositoryManager.java:768) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.oomph.util.ReflectUtil.invokeMethod(ReflectUtil.java:117) + at org.eclipse.oomph.p2.internal.core.CachingRepositoryManager.loadRepository(CachingRepositoryManager.java:396) + at org.eclipse.oomph.p2.internal.core.CachingRepositoryManager.loadRepository(CachingRepositoryManager.java:199) + at org.eclipse.oomph.p2.internal.core.CachingRepositoryManager$Metadata.loadRepository(CachingRepositoryManager.java:463) + at org.eclipse.equinox.internal.p2.metadata.repository.MetadataRepositoryManager.loadRepository(MetadataRepositoryManager.java:96) + at org.eclipse.equinox.internal.p2.metadata.repository.MetadataRepositoryManager.loadRepository(MetadataRepositoryManager.java:92) + at org.eclipse.equinox.internal.p2.updatechecker.UpdateChecker.getAvailableRepositories(UpdateChecker.java:152) + at org.eclipse.equinox.internal.p2.updatechecker.UpdateChecker.checkForUpdates(UpdateChecker.java:130) + at org.eclipse.equinox.internal.p2.updatechecker.UpdateChecker$UpdateCheckThread.run(UpdateChecker.java:74) +!SUBENTRY 1 org.eclipse.equinox.p2.metadata.repository 4 1000 2017-09-12 10:08:12.866 +!MESSAGE No repository found at http://download.eclipse.org/tools/cdt/releases/9.2/r.1. + +!ENTRY org.eclipse.equinox.p2.transport.ecf 2 0 2017-09-12 10:09:20.853 +!MESSAGE Connection to http://download.eclipse.org/mylyn/drops/3.23.0/v20170614-2003/site.xml failed on Connection timed out: connect. Retry attempt 0 started +!STACK 0 +java.net.ConnectException: Connection timed out: connect + at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) + at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source) + at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source) + at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source) + at java.net.AbstractPlainSocketImpl.connect(Unknown Source) + at java.net.PlainSocketImpl.connect(Unknown Source) + at java.net.SocksSocketImpl.connect(Unknown Source) + at java.net.Socket.connect(Unknown Source) + at org.eclipse.ecf.internal.provider.filetransfer.httpclient4.ECFHttpClientProtocolSocketFactory.connectSocket(ECFHttpClientProtocolSocketFactory.java:86) + at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:177) + at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:144) + at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:131) + at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:611) + at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:446) + at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:863) + at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82) + at org.eclipse.ecf.provider.filetransfer.httpclient4.HttpClientRetrieveFileTransfer.performConnect(HttpClientRetrieveFileTransfer.java:1084) + at org.eclipse.ecf.provider.filetransfer.httpclient4.HttpClientRetrieveFileTransfer.access$0(HttpClientRetrieveFileTransfer.java:1075) + at org.eclipse.ecf.provider.filetransfer.httpclient4.HttpClientRetrieveFileTransfer$1.performFileTransfer(HttpClientRetrieveFileTransfer.java:1071) + at org.eclipse.ecf.filetransfer.FileTransferJob.run(FileTransferJob.java:74) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) + +!ENTRY org.eclipse.equinox.p2.core 4 0 2017-09-12 10:09:42.075 +!MESSAGE Provisioning exception +!STACK 1 +org.eclipse.equinox.p2.core.ProvisionException: Unable to connect to repository http://download.eclipse.org/mylyn/drops/3.23.0/v20170614-2003/site.xml + at org.eclipse.equinox.internal.p2.updatesite.UpdateSite.loadActualSiteFile(UpdateSite.java:236) + at org.eclipse.equinox.internal.p2.updatesite.UpdateSite.load(UpdateSite.java:147) + at org.eclipse.equinox.internal.p2.updatesite.metadata.UpdateSiteMetadataRepositoryFactory.initializeRepository(UpdateSiteMetadataRepositoryFactory.java:99) + at org.eclipse.equinox.internal.p2.updatesite.metadata.UpdateSiteMetadataRepositoryFactory.load(UpdateSiteMetadataRepositoryFactory.java:59) + at org.eclipse.equinox.internal.p2.metadata.repository.MetadataRepositoryManager.factoryLoad(MetadataRepositoryManager.java:57) + at org.eclipse.equinox.internal.p2.repository.helpers.AbstractRepositoryManager.loadRepository(AbstractRepositoryManager.java:768) + at sun.reflect.GeneratedMethodAccessor73.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.oomph.util.ReflectUtil.invokeMethod(ReflectUtil.java:117) + at org.eclipse.oomph.p2.internal.core.CachingRepositoryManager.loadRepository(CachingRepositoryManager.java:396) + at org.eclipse.oomph.p2.internal.core.CachingRepositoryManager.loadRepository(CachingRepositoryManager.java:199) + at org.eclipse.oomph.p2.internal.core.CachingRepositoryManager$Metadata.loadRepository(CachingRepositoryManager.java:463) + at org.eclipse.equinox.internal.p2.metadata.repository.MetadataRepositoryManager.loadRepository(MetadataRepositoryManager.java:96) + at org.eclipse.equinox.internal.p2.metadata.repository.MetadataRepositoryManager.loadRepository(MetadataRepositoryManager.java:92) + at org.eclipse.equinox.internal.p2.metadata.repository.CompositeMetadataRepository.addChild(CompositeMetadataRepository.java:166) + at org.eclipse.equinox.internal.p2.metadata.repository.CompositeMetadataRepository.(CompositeMetadataRepository.java:106) + at org.eclipse.equinox.internal.p2.metadata.repository.CompositeMetadataRepositoryFactory.load(CompositeMetadataRepositoryFactory.java:122) + at org.eclipse.equinox.internal.p2.metadata.repository.MetadataRepositoryManager.factoryLoad(MetadataRepositoryManager.java:57) + at org.eclipse.equinox.internal.p2.repository.helpers.AbstractRepositoryManager.loadRepository(AbstractRepositoryManager.java:768) + at sun.reflect.GeneratedMethodAccessor73.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.oomph.util.ReflectUtil.invokeMethod(ReflectUtil.java:117) + at org.eclipse.oomph.p2.internal.core.CachingRepositoryManager.loadRepository(CachingRepositoryManager.java:396) + at org.eclipse.oomph.p2.internal.core.CachingRepositoryManager.loadRepository(CachingRepositoryManager.java:199) + at org.eclipse.oomph.p2.internal.core.CachingRepositoryManager$Metadata.loadRepository(CachingRepositoryManager.java:463) + at org.eclipse.equinox.internal.p2.metadata.repository.MetadataRepositoryManager.loadRepository(MetadataRepositoryManager.java:96) + at org.eclipse.equinox.internal.p2.metadata.repository.MetadataRepositoryManager.loadRepository(MetadataRepositoryManager.java:92) + at org.eclipse.equinox.internal.p2.updatechecker.UpdateChecker.getAvailableRepositories(UpdateChecker.java:152) + at org.eclipse.equinox.internal.p2.updatechecker.UpdateChecker.checkForUpdates(UpdateChecker.java:130) + at org.eclipse.equinox.internal.p2.updatechecker.UpdateChecker$UpdateCheckThread.run(UpdateChecker.java:74) +Caused by: java.net.ConnectException: Connection timed out: connect + at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) + at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source) + at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source) + at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source) + at java.net.AbstractPlainSocketImpl.connect(Unknown Source) + at java.net.PlainSocketImpl.connect(Unknown Source) + at java.net.SocksSocketImpl.connect(Unknown Source) + at java.net.Socket.connect(Unknown Source) + at org.eclipse.ecf.internal.provider.filetransfer.httpclient4.ECFHttpClientProtocolSocketFactory.connectSocket(ECFHttpClientProtocolSocketFactory.java:86) + at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:177) + at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:144) + at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:131) + at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:611) + at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:446) + at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:863) + at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82) + at org.eclipse.ecf.provider.filetransfer.httpclient4.HttpClientRetrieveFileTransfer.performConnect(HttpClientRetrieveFileTransfer.java:1084) + at org.eclipse.ecf.provider.filetransfer.httpclient4.HttpClientRetrieveFileTransfer.access$0(HttpClientRetrieveFileTransfer.java:1075) + at org.eclipse.ecf.provider.filetransfer.httpclient4.HttpClientRetrieveFileTransfer$1.performFileTransfer(HttpClientRetrieveFileTransfer.java:1071) + at org.eclipse.ecf.filetransfer.FileTransferJob.run(FileTransferJob.java:74) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +!SUBENTRY 1 org.eclipse.equinox.p2.transport.ecf 4 1002 2017-09-12 10:09:42.076 +!MESSAGE Unable to connect to repository http://download.eclipse.org/mylyn/drops/3.23.0/v20170614-2003/site.xml +!STACK 0 +java.net.ConnectException: Connection timed out: connect + at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) + at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source) + at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source) + at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source) + at java.net.AbstractPlainSocketImpl.connect(Unknown Source) + at java.net.PlainSocketImpl.connect(Unknown Source) + at java.net.SocksSocketImpl.connect(Unknown Source) + at java.net.Socket.connect(Unknown Source) + at org.eclipse.ecf.internal.provider.filetransfer.httpclient4.ECFHttpClientProtocolSocketFactory.connectSocket(ECFHttpClientProtocolSocketFactory.java:86) + at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:177) + at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:144) + at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:131) + at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:611) + at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:446) + at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:863) + at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82) + at org.eclipse.ecf.provider.filetransfer.httpclient4.HttpClientRetrieveFileTransfer.performConnect(HttpClientRetrieveFileTransfer.java:1084) + at org.eclipse.ecf.provider.filetransfer.httpclient4.HttpClientRetrieveFileTransfer.access$0(HttpClientRetrieveFileTransfer.java:1075) + at org.eclipse.ecf.provider.filetransfer.httpclient4.HttpClientRetrieveFileTransfer$1.performFileTransfer(HttpClientRetrieveFileTransfer.java:1071) + at org.eclipse.ecf.filetransfer.FileTransferJob.run(FileTransferJob.java:74) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) + +!ENTRY org.eclipse.equinox.p2.core 4 0 2017-09-12 10:11:55.240 +!MESSAGE Provisioning exception +!STACK 1 +org.eclipse.equinox.p2.core.ProvisionException: Unable to connect to repository http://download.eclipse.org/birt/update-site/4.4/content.xml + at org.eclipse.equinox.internal.p2.repository.CacheManager.createCache(CacheManager.java:243) + at org.eclipse.equinox.internal.p2.metadata.repository.SimpleMetadataRepositoryFactory.getLocalFile(SimpleMetadataRepositoryFactory.java:66) + at org.eclipse.equinox.internal.p2.metadata.repository.SimpleMetadataRepositoryFactory.load(SimpleMetadataRepositoryFactory.java:88) + at org.eclipse.equinox.internal.p2.metadata.repository.MetadataRepositoryManager.factoryLoad(MetadataRepositoryManager.java:57) + at org.eclipse.equinox.internal.p2.repository.helpers.AbstractRepositoryManager.loadRepository(AbstractRepositoryManager.java:768) + at sun.reflect.GeneratedMethodAccessor73.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.oomph.util.ReflectUtil.invokeMethod(ReflectUtil.java:117) + at org.eclipse.oomph.p2.internal.core.CachingRepositoryManager.loadRepository(CachingRepositoryManager.java:396) + at org.eclipse.oomph.p2.internal.core.CachingRepositoryManager.loadRepository(CachingRepositoryManager.java:199) + at org.eclipse.oomph.p2.internal.core.CachingRepositoryManager$Metadata.loadRepository(CachingRepositoryManager.java:463) + at org.eclipse.equinox.internal.p2.metadata.repository.MetadataRepositoryManager.loadRepository(MetadataRepositoryManager.java:96) + at org.eclipse.equinox.internal.p2.metadata.repository.MetadataRepositoryManager.loadRepository(MetadataRepositoryManager.java:92) + at org.eclipse.equinox.internal.p2.metadata.repository.CompositeMetadataRepository.addChild(CompositeMetadataRepository.java:166) + at org.eclipse.equinox.internal.p2.metadata.repository.CompositeMetadataRepository.(CompositeMetadataRepository.java:106) + at org.eclipse.equinox.internal.p2.metadata.repository.CompositeMetadataRepositoryFactory.load(CompositeMetadataRepositoryFactory.java:122) + at org.eclipse.equinox.internal.p2.metadata.repository.MetadataRepositoryManager.factoryLoad(MetadataRepositoryManager.java:57) + at org.eclipse.equinox.internal.p2.repository.helpers.AbstractRepositoryManager.loadRepository(AbstractRepositoryManager.java:768) + at sun.reflect.GeneratedMethodAccessor73.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.oomph.util.ReflectUtil.invokeMethod(ReflectUtil.java:117) + at org.eclipse.oomph.p2.internal.core.CachingRepositoryManager.loadRepository(CachingRepositoryManager.java:396) + at org.eclipse.oomph.p2.internal.core.CachingRepositoryManager.loadRepository(CachingRepositoryManager.java:199) + at org.eclipse.oomph.p2.internal.core.CachingRepositoryManager$Metadata.loadRepository(CachingRepositoryManager.java:463) + at org.eclipse.equinox.internal.p2.metadata.repository.MetadataRepositoryManager.loadRepository(MetadataRepositoryManager.java:96) + at org.eclipse.equinox.internal.p2.metadata.repository.MetadataRepositoryManager.loadRepository(MetadataRepositoryManager.java:92) + at org.eclipse.equinox.internal.p2.updatechecker.UpdateChecker.getAvailableRepositories(UpdateChecker.java:152) + at org.eclipse.equinox.internal.p2.updatechecker.UpdateChecker.checkForUpdates(UpdateChecker.java:130) + at org.eclipse.equinox.internal.p2.updatechecker.UpdateChecker$UpdateCheckThread.run(UpdateChecker.java:74) +Caused by: java.net.ConnectException: Connection timed out: connect + at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) + at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source) + at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source) + at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source) + at java.net.AbstractPlainSocketImpl.connect(Unknown Source) + at java.net.PlainSocketImpl.connect(Unknown Source) + at java.net.SocksSocketImpl.connect(Unknown Source) + at java.net.Socket.connect(Unknown Source) + at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:117) + at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:177) + at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:304) + at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:611) + at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:446) + at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:863) + at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82) + at org.eclipse.ecf.provider.filetransfer.httpclient4.HttpClientFileSystemBrowser.runRequest(HttpClientFileSystemBrowser.java:263) + at org.eclipse.ecf.provider.filetransfer.browse.AbstractFileSystemBrowser$DirectoryJob.run(AbstractFileSystemBrowser.java:69) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +!SUBENTRY 1 org.eclipse.equinox.p2.transport.ecf 4 1002 2017-09-12 10:11:55.241 +!MESSAGE Unable to connect to repository http://download.eclipse.org/birt/update-site/4.4/content.xml +!STACK 0 +java.net.ConnectException: Connection timed out: connect + at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) + at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source) + at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source) + at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source) + at java.net.AbstractPlainSocketImpl.connect(Unknown Source) + at java.net.PlainSocketImpl.connect(Unknown Source) + at java.net.SocksSocketImpl.connect(Unknown Source) + at java.net.Socket.connect(Unknown Source) + at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:117) + at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:177) + at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:304) + at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:611) + at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:446) + at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:863) + at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82) + at org.eclipse.ecf.provider.filetransfer.httpclient4.HttpClientFileSystemBrowser.runRequest(HttpClientFileSystemBrowser.java:263) + at org.eclipse.ecf.provider.filetransfer.browse.AbstractFileSystemBrowser$DirectoryJob.run(AbstractFileSystemBrowser.java:69) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) + +!ENTRY org.eclipse.equinox.p2.metadata.repository 4 1000 2017-09-12 10:11:57.128 +!MESSAGE No repository found at http://matclipse.eclipselabs.org.codespot.com/git.update/. + +!ENTRY org.eclipse.equinox.p2.metadata.repository 4 1000 2017-09-12 10:12:01.109 +!MESSAGE No repository found at https://github.com/krystophny/matclipse.git/git.update. + +!ENTRY org.eclipse.equinox.p2.metadata.repository 4 1000 2017-09-12 10:12:26.969 +!MESSAGE No repository found at https://github.com/krystophny/matclipse.git. + +!ENTRY org.eclipse.equinox.p2.metadata.repository 4 1000 2017-09-12 10:12:49.179 +!MESSAGE No repository found at http://download.eclipse.org/oomph/updates/milestone/latest. +!SESSION 2017-09-12 12:27:57.274 ----------------------------------------------- +eclipse.buildId=4.6.3.M20170301-0400 +java.version=1.8.0_141 +java.vendor=Oracle Corporation +BootLoader constants: OS=win32, ARCH=x86_64, WS=win32, NL=en_GB +Framework arguments: -product org.eclipse.epp.package.cpp.product -product org.eclipse.epp.package.cpp.product -product org.eclipse.epp.package.cpp.product -product org.eclipse.epp.package.cpp.product +Command-line arguments: -os win32 -ws win32 -arch x86_64 -product org.eclipse.epp.package.cpp.product -product org.eclipse.epp.package.cpp.product -product org.eclipse.epp.package.cpp.product -data C:\workspace\0387-hsb-mrts\trunk\S - Software\0 - HSB MRTS Kathode-MCP\3 - Implementation\0 - Code -product org.eclipse.epp.package.cpp.product + +!ENTRY org.eclipse.equinox.registry 4 1 2017-09-12 12:28:03.941 +!MESSAGE Executable extension definition for "resolver" not found. + +!ENTRY org.eclipse.equinox.registry 4 1 2017-09-12 12:28:03.945 +!MESSAGE Executable extension definition for "resolver" not found. + +!ENTRY org.eclipse.equinox.registry 4 1 2017-09-12 12:28:03.947 +!MESSAGE Executable extension definition for "resolver" not found. + +!ENTRY org.eclipse.egit.ui 2 0 2017-09-12 12:28:05.237 +!MESSAGE Warning: The environment variable HOME is not set. The following directory will be used to store the Git +user global configuration and to define the default location to store repositories: 'H:\'. If this is +not correct please set the HOME environment variable and restart Eclipse. Otherwise Git for Windows and +EGit might behave differently since they see different configuration options. +This warning can be switched off on the Team > Git > Confirmations and Warnings preference page. + +!ENTRY org.eclipse.cdt.core 4 0 2017-09-12 12:28:06.253 +!MESSAGE Error: Cannot run program "gcc": Launching failed +!STACK 0 +java.io.IOException: Cannot run program "gcc": Launching failed + at org.eclipse.cdt.utils.spawner.Spawner.exec(Spawner.java:349) + at org.eclipse.cdt.utils.spawner.Spawner.(Spawner.java:91) + at org.eclipse.cdt.utils.spawner.ProcessFactory.exec(ProcessFactory.java:91) + at org.eclipse.cdt.core.CommandLauncher.execute(CommandLauncher.java:194) + at org.eclipse.cdt.internal.core.BuildRunnerHelper.build(BuildRunnerHelper.java:263) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector.runProgramForLanguage(AbstractBuiltinSpecsDetector.java:759) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector.runForLanguage(AbstractBuiltinSpecsDetector.java:689) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector.runForEachLanguage(AbstractBuiltinSpecsDetector.java:562) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector$1.runInWorkspace(AbstractBuiltinSpecsDetector.java:496) + at org.eclipse.core.internal.resources.InternalWorkspaceJob.run(InternalWorkspaceJob.java:39) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) + +!ENTRY org.eclipse.cdt.core 4 0 2017-09-12 12:28:06.393 +!MESSAGE Error: Cannot run program "g++": Launching failed +!STACK 0 +java.io.IOException: Cannot run program "g++": Launching failed + at org.eclipse.cdt.utils.spawner.Spawner.exec(Spawner.java:349) + at org.eclipse.cdt.utils.spawner.Spawner.(Spawner.java:91) + at org.eclipse.cdt.utils.spawner.ProcessFactory.exec(ProcessFactory.java:91) + at org.eclipse.cdt.core.CommandLauncher.execute(CommandLauncher.java:194) + at org.eclipse.cdt.internal.core.BuildRunnerHelper.build(BuildRunnerHelper.java:263) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector.runProgramForLanguage(AbstractBuiltinSpecsDetector.java:759) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector.runForLanguage(AbstractBuiltinSpecsDetector.java:689) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector.runForEachLanguage(AbstractBuiltinSpecsDetector.java:562) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector$1.runInWorkspace(AbstractBuiltinSpecsDetector.java:496) + at org.eclipse.core.internal.resources.InternalWorkspaceJob.run(InternalWorkspaceJob.java:39) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) + +!ENTRY org.eclipse.cdt.core 4 0 2017-09-12 12:28:06.505 +!MESSAGE Error: Cannot run program "gcc": Launching failed +!STACK 0 +java.io.IOException: Cannot run program "gcc": Launching failed + at org.eclipse.cdt.utils.spawner.Spawner.exec(Spawner.java:349) + at org.eclipse.cdt.utils.spawner.Spawner.(Spawner.java:91) + at org.eclipse.cdt.utils.spawner.ProcessFactory.exec(ProcessFactory.java:91) + at org.eclipse.cdt.core.CommandLauncher.execute(CommandLauncher.java:194) + at org.eclipse.cdt.internal.core.BuildRunnerHelper.build(BuildRunnerHelper.java:263) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector.runProgramForLanguage(AbstractBuiltinSpecsDetector.java:759) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector.runForLanguage(AbstractBuiltinSpecsDetector.java:689) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector.runForEachLanguage(AbstractBuiltinSpecsDetector.java:562) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector$1.runInWorkspace(AbstractBuiltinSpecsDetector.java:496) + at org.eclipse.core.internal.resources.InternalWorkspaceJob.run(InternalWorkspaceJob.java:39) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) + +!ENTRY org.eclipse.cdt.core 4 0 2017-09-12 12:28:06.572 +!MESSAGE Error: Cannot run program "g++": Launching failed +!STACK 0 +java.io.IOException: Cannot run program "g++": Launching failed + at org.eclipse.cdt.utils.spawner.Spawner.exec(Spawner.java:349) + at org.eclipse.cdt.utils.spawner.Spawner.(Spawner.java:91) + at org.eclipse.cdt.utils.spawner.ProcessFactory.exec(ProcessFactory.java:91) + at org.eclipse.cdt.core.CommandLauncher.execute(CommandLauncher.java:194) + at org.eclipse.cdt.internal.core.BuildRunnerHelper.build(BuildRunnerHelper.java:263) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector.runProgramForLanguage(AbstractBuiltinSpecsDetector.java:759) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector.runForLanguage(AbstractBuiltinSpecsDetector.java:689) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector.runForEachLanguage(AbstractBuiltinSpecsDetector.java:562) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector$1.runInWorkspace(AbstractBuiltinSpecsDetector.java:496) + at org.eclipse.core.internal.resources.InternalWorkspaceJob.run(InternalWorkspaceJob.java:39) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) + +!ENTRY fr.ac6.mcu.ide 1 1 2017-09-12 12:28:09.225 +!MESSAGE Started RMI Server, listening on port 21112 + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:37:33.025 +!MESSAGE Unhandled event loop exception +!STACK 0 +org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.IllegalStateException: startLine (45) does not match endLine (44)) + at org.eclipse.swt.SWT.error(SWT.java:4533) + at org.eclipse.swt.SWT.error(SWT.java:4448) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:185) + at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4211) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3827) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) +Caused by: java.lang.IllegalStateException: startLine (45) does not match endLine (44) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.internal.text.source.DiffPainter.redraw(DiffPainter.java:379) + at org.eclipse.jface.internal.text.source.DiffPainter.access$2(DiffPainter.java:378) + at org.eclipse.jface.internal.text.source.DiffPainter$2.run(DiffPainter.java:368) + at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:182) + ... 23 more + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:37:33.429 +!MESSAGE Unhandled event loop exception +!STACK 0 +org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.IllegalStateException: startLine (45) does not match endLine (44)) + at org.eclipse.swt.SWT.error(SWT.java:4533) + at org.eclipse.swt.SWT.error(SWT.java:4448) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:185) + at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4211) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3827) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) +Caused by: java.lang.IllegalStateException: startLine (45) does not match endLine (44) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.internal.text.source.DiffPainter.redraw(DiffPainter.java:379) + at org.eclipse.jface.internal.text.source.DiffPainter.access$2(DiffPainter.java:378) + at org.eclipse.jface.internal.text.source.DiffPainter$2.run(DiffPainter.java:368) + at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:182) + ... 23 more + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:37:33.830 +!MESSAGE Unhandled event loop exception +!STACK 0 +org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.IllegalStateException: startLine (45) does not match endLine (44)) + at org.eclipse.swt.SWT.error(SWT.java:4533) + at org.eclipse.swt.SWT.error(SWT.java:4448) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:185) + at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4211) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3827) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) +Caused by: java.lang.IllegalStateException: startLine (45) does not match endLine (44) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.internal.text.source.DiffPainter.redraw(DiffPainter.java:379) + at org.eclipse.jface.internal.text.source.DiffPainter.access$2(DiffPainter.java:378) + at org.eclipse.jface.internal.text.source.DiffPainter$2.run(DiffPainter.java:368) + at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:182) + ... 23 more + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:37:34.327 +!MESSAGE Unhandled event loop exception +!STACK 0 +org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.IllegalStateException: startLine (45) does not match endLine (44)) + at org.eclipse.swt.SWT.error(SWT.java:4533) + at org.eclipse.swt.SWT.error(SWT.java:4448) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:185) + at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4211) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3827) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) +Caused by: java.lang.IllegalStateException: startLine (45) does not match endLine (44) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.internal.text.source.DiffPainter.redraw(DiffPainter.java:379) + at org.eclipse.jface.internal.text.source.DiffPainter.access$2(DiffPainter.java:378) + at org.eclipse.jface.internal.text.source.DiffPainter$2.run(DiffPainter.java:368) + at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:182) + ... 23 more + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:37:34.332 +!MESSAGE Unhandled event loop exception +!STACK 0 +org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.IllegalStateException: startLine (45) does not match endLine (44)) + at org.eclipse.swt.SWT.error(SWT.java:4533) + at org.eclipse.swt.SWT.error(SWT.java:4448) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:185) + at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4211) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3827) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) +Caused by: java.lang.IllegalStateException: startLine (45) does not match endLine (44) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.text.source.LineNumberRulerColumn$1.run(LineNumberRulerColumn.java:417) + at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:182) + ... 23 more + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:37:34.349 +!MESSAGE Unhandled event loop exception +!STACK 0 +org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.IllegalStateException: startLine (45) does not match endLine (44)) + at org.eclipse.swt.SWT.error(SWT.java:4533) + at org.eclipse.swt.SWT.error(SWT.java:4448) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:185) + at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4211) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3827) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) +Caused by: java.lang.IllegalStateException: startLine (45) does not match endLine (44) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.text.source.LineNumberRulerColumn$1.run(LineNumberRulerColumn.java:417) + at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:182) + ... 23 more + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:37:35.219 +!MESSAGE Unhandled event loop exception +!STACK 0 +java.lang.IllegalStateException: startLine (45) does not match endLine (44) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.text.source.LineNumberRulerColumn$InternalListener.viewportChanged(LineNumberRulerColumn.java:76) + at org.eclipse.jface.text.TextViewer.updateViewportListeners(TextViewer.java:2977) + at org.eclipse.jface.text.TextViewer$ViewportGuard.widgetSelected(TextViewer.java:326) + at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:249) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4418) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1079) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1103) + at org.eclipse.swt.widgets.Widget.sendSelectionEvent(Widget.java:1120) + at org.eclipse.swt.widgets.ScrollBar.wmScrollChild(ScrollBar.java:1079) + at org.eclipse.swt.widgets.Scrollable.wmScroll(Scrollable.java:580) + at org.eclipse.swt.widgets.Scrollable.WM_VSCROLL(Scrollable.java:385) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4886) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.SendMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.SendMessage(OS.java:3305) + at org.eclipse.swt.widgets.Scrollable.wmScrollWheel(Scrollable.java:480) + at org.eclipse.swt.widgets.Scrollable.WM_MOUSEWHEEL(Scrollable.java:361) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4847) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2552) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3822) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:37:35.244 +!MESSAGE Unhandled event loop exception +!STACK 0 +java.lang.IllegalStateException: startLine (45) does not match endLine (44) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.text.source.LineNumberRulerColumn$InternalListener.viewportChanged(LineNumberRulerColumn.java:76) + at org.eclipse.jface.text.TextViewer.updateViewportListeners(TextViewer.java:2977) + at org.eclipse.jface.text.TextViewer$ViewportGuard.widgetSelected(TextViewer.java:326) + at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:249) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4418) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1079) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1103) + at org.eclipse.swt.widgets.Widget.sendSelectionEvent(Widget.java:1120) + at org.eclipse.swt.widgets.ScrollBar.wmScrollChild(ScrollBar.java:1079) + at org.eclipse.swt.widgets.Scrollable.wmScroll(Scrollable.java:580) + at org.eclipse.swt.widgets.Scrollable.WM_VSCROLL(Scrollable.java:385) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4886) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.SendMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.SendMessage(OS.java:3305) + at org.eclipse.swt.widgets.Scrollable.wmScrollWheel(Scrollable.java:480) + at org.eclipse.swt.widgets.Scrollable.WM_MOUSEWHEEL(Scrollable.java:361) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4847) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2552) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3822) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:37:35.267 +!MESSAGE Unhandled event loop exception +!STACK 0 +java.lang.IllegalStateException: startLine (45) does not match endLine (44) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.text.source.LineNumberRulerColumn$InternalListener.viewportChanged(LineNumberRulerColumn.java:76) + at org.eclipse.jface.text.TextViewer.updateViewportListeners(TextViewer.java:2977) + at org.eclipse.jface.text.TextViewer$ViewportGuard.widgetSelected(TextViewer.java:326) + at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:249) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4418) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1079) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1103) + at org.eclipse.swt.widgets.Widget.sendSelectionEvent(Widget.java:1120) + at org.eclipse.swt.widgets.ScrollBar.wmScrollChild(ScrollBar.java:1079) + at org.eclipse.swt.widgets.Scrollable.wmScroll(Scrollable.java:580) + at org.eclipse.swt.widgets.Scrollable.WM_VSCROLL(Scrollable.java:385) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4886) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.SendMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.SendMessage(OS.java:3305) + at org.eclipse.swt.widgets.Scrollable.wmScrollWheel(Scrollable.java:480) + at org.eclipse.swt.widgets.Scrollable.WM_MOUSEWHEEL(Scrollable.java:361) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4847) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2552) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3822) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:37:35.292 +!MESSAGE Unhandled event loop exception +!STACK 0 +java.lang.IllegalStateException: startLine (45) does not match endLine (44) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.text.source.LineNumberRulerColumn$InternalListener.viewportChanged(LineNumberRulerColumn.java:76) + at org.eclipse.jface.text.TextViewer.updateViewportListeners(TextViewer.java:2977) + at org.eclipse.jface.text.TextViewer$ViewportGuard.widgetSelected(TextViewer.java:326) + at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:249) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4418) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1079) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1103) + at org.eclipse.swt.widgets.Widget.sendSelectionEvent(Widget.java:1120) + at org.eclipse.swt.widgets.ScrollBar.wmScrollChild(ScrollBar.java:1079) + at org.eclipse.swt.widgets.Scrollable.wmScroll(Scrollable.java:580) + at org.eclipse.swt.widgets.Scrollable.WM_VSCROLL(Scrollable.java:385) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4886) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.SendMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.SendMessage(OS.java:3305) + at org.eclipse.swt.widgets.Scrollable.wmScrollWheel(Scrollable.java:480) + at org.eclipse.swt.widgets.Scrollable.WM_MOUSEWHEEL(Scrollable.java:361) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4847) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2552) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3822) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:37:35.315 +!MESSAGE Unhandled event loop exception +!STACK 0 +java.lang.IllegalStateException: startLine (45) does not match endLine (44) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.text.source.LineNumberRulerColumn$InternalListener.viewportChanged(LineNumberRulerColumn.java:76) + at org.eclipse.jface.text.TextViewer.updateViewportListeners(TextViewer.java:2977) + at org.eclipse.jface.text.TextViewer$ViewportGuard.widgetSelected(TextViewer.java:326) + at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:249) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4418) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1079) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1103) + at org.eclipse.swt.widgets.Widget.sendSelectionEvent(Widget.java:1120) + at org.eclipse.swt.widgets.ScrollBar.wmScrollChild(ScrollBar.java:1079) + at org.eclipse.swt.widgets.Scrollable.wmScroll(Scrollable.java:580) + at org.eclipse.swt.widgets.Scrollable.WM_VSCROLL(Scrollable.java:385) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4886) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.SendMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.SendMessage(OS.java:3305) + at org.eclipse.swt.widgets.Scrollable.wmScrollWheel(Scrollable.java:480) + at org.eclipse.swt.widgets.Scrollable.WM_MOUSEWHEEL(Scrollable.java:361) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4847) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2552) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3822) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:37:37.996 +!MESSAGE Unhandled event loop exception +!STACK 0 +org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.IllegalStateException: startLine (46) does not match endLine (45)) + at org.eclipse.swt.SWT.error(SWT.java:4533) + at org.eclipse.swt.SWT.error(SWT.java:4448) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:185) + at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4211) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3827) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) +Caused by: java.lang.IllegalStateException: startLine (46) does not match endLine (45) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.internal.text.source.DiffPainter.redraw(DiffPainter.java:379) + at org.eclipse.jface.internal.text.source.DiffPainter.access$2(DiffPainter.java:378) + at org.eclipse.jface.internal.text.source.DiffPainter$2.run(DiffPainter.java:368) + at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:182) + ... 23 more + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:37:38.440 +!MESSAGE Unhandled event loop exception +!STACK 0 +org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.IllegalStateException: startLine (47) does not match endLine (46)) + at org.eclipse.swt.SWT.error(SWT.java:4533) + at org.eclipse.swt.SWT.error(SWT.java:4448) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:185) + at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4211) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3827) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) +Caused by: java.lang.IllegalStateException: startLine (47) does not match endLine (46) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.internal.text.source.DiffPainter.redraw(DiffPainter.java:379) + at org.eclipse.jface.internal.text.source.DiffPainter.access$2(DiffPainter.java:378) + at org.eclipse.jface.internal.text.source.DiffPainter$2.run(DiffPainter.java:368) + at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:182) + ... 23 more + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:37:41.475 +!MESSAGE Unhandled event loop exception +!STACK 0 +org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.IllegalStateException: startLine (47) does not match endLine (46)) + at org.eclipse.swt.SWT.error(SWT.java:4533) + at org.eclipse.swt.SWT.error(SWT.java:4448) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:185) + at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4211) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3827) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) +Caused by: java.lang.IllegalStateException: startLine (47) does not match endLine (46) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.text.source.LineNumberRulerColumn$1.run(LineNumberRulerColumn.java:417) + at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:182) + ... 23 more + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:37:43.349 +!MESSAGE Unhandled event loop exception +!STACK 0 +org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.IllegalStateException: startLine (47) does not match endLine (46)) + at org.eclipse.swt.SWT.error(SWT.java:4533) + at org.eclipse.swt.SWT.error(SWT.java:4448) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:185) + at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4211) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3827) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) +Caused by: java.lang.IllegalStateException: startLine (47) does not match endLine (46) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.text.source.LineNumberRulerColumn$1.run(LineNumberRulerColumn.java:417) + at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:182) + ... 23 more + +!ENTRY org.eclipse.cdt.ui 4 4 2017-09-12 12:37:44.959 +!MESSAGE Error +!STACK 0 +org.eclipse.jface.text.BadLocationException + at org.eclipse.jface.text.AbstractDocument.get(AbstractDocument.java:964) + at org.eclipse.core.internal.filebuffers.SynchronizableDocument.get(SynchronizableDocument.java:127) + at org.eclipse.cdt.internal.ui.text.LineComparator.getHash(LineComparator.java:84) + at org.eclipse.cdt.internal.ui.text.LineComparator.rangesEqual(LineComparator.java:60) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.isRangeEqual(RangeComparatorLCS.java:57) + at org.eclipse.compare.internal.core.LCS.longestCommonSubsequence(LCS.java:80) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.longestCommonSubsequence(RangeComparatorLCS.java:186) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.findDifferences(RangeComparatorLCS.java:31) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:98) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:82) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:67) + at org.eclipse.cdt.internal.ui.util.EditorUtility$1.getChangedLineRegions(EditorUtility.java:948) + at org.eclipse.cdt.internal.ui.util.EditorUtility$1.run(EditorUtility.java:924) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.cdt.internal.ui.util.EditorUtility.calculateChangedLineRegions(EditorUtility.java:899) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider.performSaveActions(CDocumentProvider.java:970) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider.commitWorkingCopy(CDocumentProvider.java:887) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider$2.execute(CDocumentProvider.java:919) + at org.eclipse.ui.editors.text.TextFileDocumentProvider$DocumentProviderOperation.run(TextFileDocumentProvider.java:130) + at org.eclipse.ui.actions.WorkspaceModifyDelegatingOperation.execute(WorkspaceModifyDelegatingOperation.java:67) + at org.eclipse.ui.actions.WorkspaceModifyOperation.lambda$0(WorkspaceModifyOperation.java:107) + at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2240) + at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2267) + at org.eclipse.ui.actions.WorkspaceModifyOperation.run(WorkspaceModifyOperation.java:128) + at org.eclipse.ui.internal.editors.text.WorkspaceOperationRunner.run(WorkspaceOperationRunner.java:73) + at org.eclipse.ui.internal.editors.text.WorkspaceOperationRunner.run(WorkspaceOperationRunner.java:63) + at org.eclipse.ui.editors.text.TextFileDocumentProvider.executeOperation(TextFileDocumentProvider.java:458) + at org.eclipse.ui.editors.text.TextFileDocumentProvider.saveDocument(TextFileDocumentProvider.java:761) + at org.eclipse.ui.texteditor.AbstractTextEditor.performSave(AbstractTextEditor.java:5025) + at org.eclipse.ui.texteditor.AbstractTextEditor.doSave(AbstractTextEditor.java:4820) + at org.eclipse.ui.texteditor.AbstractTextEditor$TextEditorSavable.doSave(AbstractTextEditor.java:7117) + at org.eclipse.ui.Saveable.doSave(Saveable.java:220) + at org.eclipse.ui.internal.SaveableHelper.doSaveModel(SaveableHelper.java:358) + at org.eclipse.ui.internal.SaveableHelper$3.run(SaveableHelper.java:202) + at org.eclipse.ui.internal.SaveableHelper$5.run(SaveableHelper.java:286) + at org.eclipse.jface.operation.ModalContext.runInCurrentThread(ModalContext.java:437) + at org.eclipse.jface.operation.ModalContext.run(ModalContext.java:353) + at org.eclipse.ui.internal.WorkbenchWindow$14.run(WorkbenchWindow.java:2184) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70) + at org.eclipse.ui.internal.WorkbenchWindow.run(WorkbenchWindow.java:2180) + at org.eclipse.ui.internal.SaveableHelper.runProgressMonitorOperation(SaveableHelper.java:294) + at org.eclipse.ui.internal.SaveableHelper.runProgressMonitorOperation(SaveableHelper.java:272) + at org.eclipse.ui.internal.SaveableHelper.saveModels(SaveableHelper.java:214) + at org.eclipse.ui.internal.SaveableHelper.savePart(SaveableHelper.java:149) + at org.eclipse.ui.internal.WorkbenchPage.saveSaveable(WorkbenchPage.java:3904) + at org.eclipse.ui.internal.WorkbenchPage.saveEditor(WorkbenchPage.java:3918) + at org.eclipse.ui.internal.handlers.SaveHandler.execute(SaveHandler.java:54) + at org.eclipse.ui.internal.handlers.HandlerProxy.execute(HandlerProxy.java:295) + at org.eclipse.ui.internal.handlers.E4HandlerProxy.execute(E4HandlerProxy.java:90) + at sun.reflect.GeneratedMethodAccessor53.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55) + at org.eclipse.e4.core.internal.di.InjectorImpl.invokeUsingClass(InjectorImpl.java:282) + at org.eclipse.e4.core.internal.di.InjectorImpl.invoke(InjectorImpl.java:264) + at org.eclipse.e4.core.contexts.ContextInjectionFactory.invoke(ContextInjectionFactory.java:132) + at org.eclipse.e4.core.commands.internal.HandlerServiceHandler.execute(HandlerServiceHandler.java:152) + at org.eclipse.core.commands.Command.executeWithChecks(Command.java:494) + at org.eclipse.core.commands.ParameterizedCommand.executeWithChecks(ParameterizedCommand.java:488) + at org.eclipse.e4.core.commands.internal.HandlerServiceImpl.executeHandler(HandlerServiceImpl.java:210) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.executeCommand(KeyBindingDispatcher.java:286) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.press(KeyBindingDispatcher.java:507) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.processKeyEvent(KeyBindingDispatcher.java:558) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.filterKeySequenceBindings(KeyBindingDispatcher.java:378) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.access$0(KeyBindingDispatcher.java:324) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher$KeyDownFilter.handleEvent(KeyBindingDispatcher.java:86) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.filterEvent(Display.java:1270) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1078) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1103) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1088) + at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1130) + at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1126) + at org.eclipse.swt.widgets.Widget.wmChar(Widget.java:1547) + at org.eclipse.swt.widgets.Control.WM_CHAR(Control.java:4918) + at org.eclipse.swt.widgets.Canvas.WM_CHAR(Canvas.java:364) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4799) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2552) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3822) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) + +!ENTRY org.eclipse.cdt.ui 4 4 2017-09-12 12:37:44.962 +!MESSAGE Error +!STACK 0 +org.eclipse.jface.text.BadLocationException + at org.eclipse.jface.text.AbstractDocument.get(AbstractDocument.java:964) + at org.eclipse.core.internal.filebuffers.SynchronizableDocument.get(SynchronizableDocument.java:127) + at org.eclipse.cdt.internal.ui.text.LineComparator.getHash(LineComparator.java:84) + at org.eclipse.cdt.internal.ui.text.LineComparator.rangesEqual(LineComparator.java:60) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.isRangeEqual(RangeComparatorLCS.java:57) + at org.eclipse.compare.internal.core.LCS.find_middle_snake(LCS.java:305) + at org.eclipse.compare.internal.core.LCS.lcs_rec(LCS.java:133) + at org.eclipse.compare.internal.core.LCS.longestCommonSubsequence(LCS.java:91) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.longestCommonSubsequence(RangeComparatorLCS.java:186) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.findDifferences(RangeComparatorLCS.java:31) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:98) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:82) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:67) + at org.eclipse.cdt.internal.ui.util.EditorUtility$1.getChangedLineRegions(EditorUtility.java:948) + at org.eclipse.cdt.internal.ui.util.EditorUtility$1.run(EditorUtility.java:924) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.cdt.internal.ui.util.EditorUtility.calculateChangedLineRegions(EditorUtility.java:899) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider.performSaveActions(CDocumentProvider.java:970) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider.commitWorkingCopy(CDocumentProvider.java:887) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider$2.execute(CDocumentProvider.java:919) + at org.eclipse.ui.editors.text.TextFileDocumentProvider$DocumentProviderOperation.run(TextFileDocumentProvider.java:130) + at org.eclipse.ui.actions.WorkspaceModifyDelegatingOperation.execute(WorkspaceModifyDelegatingOperation.java:67) + at org.eclipse.ui.actions.WorkspaceModifyOperation.lambda$0(WorkspaceModifyOperation.java:107) + at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2240) + at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2267) + at org.eclipse.ui.actions.WorkspaceModifyOperation.run(WorkspaceModifyOperation.java:128) + at org.eclipse.ui.internal.editors.text.WorkspaceOperationRunner.run(WorkspaceOperationRunner.java:73) + at org.eclipse.ui.internal.editors.text.WorkspaceOperationRunner.run(WorkspaceOperationRunner.java:63) + at org.eclipse.ui.editors.text.TextFileDocumentProvider.executeOperation(TextFileDocumentProvider.java:458) + at org.eclipse.ui.editors.text.TextFileDocumentProvider.saveDocument(TextFileDocumentProvider.java:761) + at org.eclipse.ui.texteditor.AbstractTextEditor.performSave(AbstractTextEditor.java:5025) + at org.eclipse.ui.texteditor.AbstractTextEditor.doSave(AbstractTextEditor.java:4820) + at org.eclipse.ui.texteditor.AbstractTextEditor$TextEditorSavable.doSave(AbstractTextEditor.java:7117) + at org.eclipse.ui.Saveable.doSave(Saveable.java:220) + at org.eclipse.ui.internal.SaveableHelper.doSaveModel(SaveableHelper.java:358) + at org.eclipse.ui.internal.SaveableHelper$3.run(SaveableHelper.java:202) + at org.eclipse.ui.internal.SaveableHelper$5.run(SaveableHelper.java:286) + at org.eclipse.jface.operation.ModalContext.runInCurrentThread(ModalContext.java:437) + at org.eclipse.jface.operation.ModalContext.run(ModalContext.java:353) + at org.eclipse.ui.internal.WorkbenchWindow$14.run(WorkbenchWindow.java:2184) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70) + at org.eclipse.ui.internal.WorkbenchWindow.run(WorkbenchWindow.java:2180) + at org.eclipse.ui.internal.SaveableHelper.runProgressMonitorOperation(SaveableHelper.java:294) + at org.eclipse.ui.internal.SaveableHelper.runProgressMonitorOperation(SaveableHelper.java:272) + at org.eclipse.ui.internal.SaveableHelper.saveModels(SaveableHelper.java:214) + at org.eclipse.ui.internal.SaveableHelper.savePart(SaveableHelper.java:149) + at org.eclipse.ui.internal.WorkbenchPage.saveSaveable(WorkbenchPage.java:3904) + at org.eclipse.ui.internal.WorkbenchPage.saveEditor(WorkbenchPage.java:3918) + at org.eclipse.ui.internal.handlers.SaveHandler.execute(SaveHandler.java:54) + at org.eclipse.ui.internal.handlers.HandlerProxy.execute(HandlerProxy.java:295) + at org.eclipse.ui.internal.handlers.E4HandlerProxy.execute(E4HandlerProxy.java:90) + at sun.reflect.GeneratedMethodAccessor53.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55) + at org.eclipse.e4.core.internal.di.InjectorImpl.invokeUsingClass(InjectorImpl.java:282) + at org.eclipse.e4.core.internal.di.InjectorImpl.invoke(InjectorImpl.java:264) + at org.eclipse.e4.core.contexts.ContextInjectionFactory.invoke(ContextInjectionFactory.java:132) + at org.eclipse.e4.core.commands.internal.HandlerServiceHandler.execute(HandlerServiceHandler.java:152) + at org.eclipse.core.commands.Command.executeWithChecks(Command.java:494) + at org.eclipse.core.commands.ParameterizedCommand.executeWithChecks(ParameterizedCommand.java:488) + at org.eclipse.e4.core.commands.internal.HandlerServiceImpl.executeHandler(HandlerServiceImpl.java:210) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.executeCommand(KeyBindingDispatcher.java:286) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.press(KeyBindingDispatcher.java:507) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.processKeyEvent(KeyBindingDispatcher.java:558) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.filterKeySequenceBindings(KeyBindingDispatcher.java:378) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.access$0(KeyBindingDispatcher.java:324) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher$KeyDownFilter.handleEvent(KeyBindingDispatcher.java:86) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.filterEvent(Display.java:1270) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1078) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1103) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1088) + at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1130) + at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1126) + at org.eclipse.swt.widgets.Widget.wmChar(Widget.java:1547) + at org.eclipse.swt.widgets.Control.WM_CHAR(Control.java:4918) + at org.eclipse.swt.widgets.Canvas.WM_CHAR(Canvas.java:364) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4799) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2552) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3822) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) + +!ENTRY org.eclipse.cdt.ui 4 4 2017-09-12 12:37:44.966 +!MESSAGE Error +!STACK 0 +org.eclipse.jface.text.BadLocationException + at org.eclipse.jface.text.AbstractDocument.get(AbstractDocument.java:964) + at org.eclipse.core.internal.filebuffers.SynchronizableDocument.get(SynchronizableDocument.java:127) + at org.eclipse.cdt.internal.ui.text.LineComparator.getHash(LineComparator.java:84) + at org.eclipse.cdt.internal.ui.text.LineComparator.rangesEqual(LineComparator.java:60) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.isRangeEqual(RangeComparatorLCS.java:57) + at org.eclipse.compare.internal.core.LCS.find_middle_snake(LCS.java:305) + at org.eclipse.compare.internal.core.LCS.lcs_rec(LCS.java:133) + at org.eclipse.compare.internal.core.LCS.longestCommonSubsequence(LCS.java:91) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.longestCommonSubsequence(RangeComparatorLCS.java:186) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.findDifferences(RangeComparatorLCS.java:31) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:98) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:82) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:67) + at org.eclipse.cdt.internal.ui.util.EditorUtility$1.getChangedLineRegions(EditorUtility.java:948) + at org.eclipse.cdt.internal.ui.util.EditorUtility$1.run(EditorUtility.java:924) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.cdt.internal.ui.util.EditorUtility.calculateChangedLineRegions(EditorUtility.java:899) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider.performSaveActions(CDocumentProvider.java:970) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider.commitWorkingCopy(CDocumentProvider.java:887) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider$2.execute(CDocumentProvider.java:919) + at org.eclipse.ui.editors.text.TextFileDocumentProvider$DocumentProviderOperation.run(TextFileDocumentProvider.java:130) + at org.eclipse.ui.actions.WorkspaceModifyDelegatingOperation.execute(WorkspaceModifyDelegatingOperation.java:67) + at org.eclipse.ui.actions.WorkspaceModifyOperation.lambda$0(WorkspaceModifyOperation.java:107) + at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2240) + at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2267) + at org.eclipse.ui.actions.WorkspaceModifyOperation.run(WorkspaceModifyOperation.java:128) + at org.eclipse.ui.internal.editors.text.WorkspaceOperationRunner.run(WorkspaceOperationRunner.java:73) + at org.eclipse.ui.internal.editors.text.WorkspaceOperationRunner.run(WorkspaceOperationRunner.java:63) + at org.eclipse.ui.editors.text.TextFileDocumentProvider.executeOperation(TextFileDocumentProvider.java:458) + at org.eclipse.ui.editors.text.TextFileDocumentProvider.saveDocument(TextFileDocumentProvider.java:761) + at org.eclipse.ui.texteditor.AbstractTextEditor.performSave(AbstractTextEditor.java:5025) + at org.eclipse.ui.texteditor.AbstractTextEditor.doSave(AbstractTextEditor.java:4820) + at org.eclipse.ui.texteditor.AbstractTextEditor$TextEditorSavable.doSave(AbstractTextEditor.java:7117) + at org.eclipse.ui.Saveable.doSave(Saveable.java:220) + at org.eclipse.ui.internal.SaveableHelper.doSaveModel(SaveableHelper.java:358) + at org.eclipse.ui.internal.SaveableHelper$3.run(SaveableHelper.java:202) + at org.eclipse.ui.internal.SaveableHelper$5.run(SaveableHelper.java:286) + at org.eclipse.jface.operation.ModalContext.runInCurrentThread(ModalContext.java:437) + at org.eclipse.jface.operation.ModalContext.run(ModalContext.java:353) + at org.eclipse.ui.internal.WorkbenchWindow$14.run(WorkbenchWindow.java:2184) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70) + at org.eclipse.ui.internal.WorkbenchWindow.run(WorkbenchWindow.java:2180) + at org.eclipse.ui.internal.SaveableHelper.runProgressMonitorOperation(SaveableHelper.java:294) + at org.eclipse.ui.internal.SaveableHelper.runProgressMonitorOperation(SaveableHelper.java:272) + at org.eclipse.ui.internal.SaveableHelper.saveModels(SaveableHelper.java:214) + at org.eclipse.ui.internal.SaveableHelper.savePart(SaveableHelper.java:149) + at org.eclipse.ui.internal.WorkbenchPage.saveSaveable(WorkbenchPage.java:3904) + at org.eclipse.ui.internal.WorkbenchPage.saveEditor(WorkbenchPage.java:3918) + at org.eclipse.ui.internal.handlers.SaveHandler.execute(SaveHandler.java:54) + at org.eclipse.ui.internal.handlers.HandlerProxy.execute(HandlerProxy.java:295) + at org.eclipse.ui.internal.handlers.E4HandlerProxy.execute(E4HandlerProxy.java:90) + at sun.reflect.GeneratedMethodAccessor53.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55) + at org.eclipse.e4.core.internal.di.InjectorImpl.invokeUsingClass(InjectorImpl.java:282) + at org.eclipse.e4.core.internal.di.InjectorImpl.invoke(InjectorImpl.java:264) + at org.eclipse.e4.core.contexts.ContextInjectionFactory.invoke(ContextInjectionFactory.java:132) + at org.eclipse.e4.core.commands.internal.HandlerServiceHandler.execute(HandlerServiceHandler.java:152) + at org.eclipse.core.commands.Command.executeWithChecks(Command.java:494) + at org.eclipse.core.commands.ParameterizedCommand.executeWithChecks(ParameterizedCommand.java:488) + at org.eclipse.e4.core.commands.internal.HandlerServiceImpl.executeHandler(HandlerServiceImpl.java:210) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.executeCommand(KeyBindingDispatcher.java:286) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.press(KeyBindingDispatcher.java:507) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.processKeyEvent(KeyBindingDispatcher.java:558) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.filterKeySequenceBindings(KeyBindingDispatcher.java:378) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.access$0(KeyBindingDispatcher.java:324) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher$KeyDownFilter.handleEvent(KeyBindingDispatcher.java:86) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.filterEvent(Display.java:1270) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1078) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1103) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1088) + at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1130) + at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1126) + at org.eclipse.swt.widgets.Widget.wmChar(Widget.java:1547) + at org.eclipse.swt.widgets.Control.WM_CHAR(Control.java:4918) + at org.eclipse.swt.widgets.Canvas.WM_CHAR(Canvas.java:364) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4799) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2552) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3822) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) + +!ENTRY org.eclipse.cdt.ui 4 4 2017-09-12 12:37:44.969 +!MESSAGE Error +!STACK 0 +org.eclipse.jface.text.BadLocationException + at org.eclipse.jface.text.AbstractDocument.get(AbstractDocument.java:964) + at org.eclipse.core.internal.filebuffers.SynchronizableDocument.get(SynchronizableDocument.java:127) + at org.eclipse.cdt.internal.ui.text.LineComparator.getHash(LineComparator.java:84) + at org.eclipse.cdt.internal.ui.text.LineComparator.rangesEqual(LineComparator.java:60) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.compactAndShiftLCS(RangeComparatorLCS.java:169) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.longestCommonSubsequence(RangeComparatorLCS.java:189) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.findDifferences(RangeComparatorLCS.java:31) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:98) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:82) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:67) + at org.eclipse.cdt.internal.ui.util.EditorUtility$1.getChangedLineRegions(EditorUtility.java:948) + at org.eclipse.cdt.internal.ui.util.EditorUtility$1.run(EditorUtility.java:924) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.cdt.internal.ui.util.EditorUtility.calculateChangedLineRegions(EditorUtility.java:899) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider.performSaveActions(CDocumentProvider.java:970) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider.commitWorkingCopy(CDocumentProvider.java:887) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider$2.execute(CDocumentProvider.java:919) + at org.eclipse.ui.editors.text.TextFileDocumentProvider$DocumentProviderOperation.run(TextFileDocumentProvider.java:130) + at org.eclipse.ui.actions.WorkspaceModifyDelegatingOperation.execute(WorkspaceModifyDelegatingOperation.java:67) + at org.eclipse.ui.actions.WorkspaceModifyOperation.lambda$0(WorkspaceModifyOperation.java:107) + at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2240) + at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2267) + at org.eclipse.ui.actions.WorkspaceModifyOperation.run(WorkspaceModifyOperation.java:128) + at org.eclipse.ui.internal.editors.text.WorkspaceOperationRunner.run(WorkspaceOperationRunner.java:73) + at org.eclipse.ui.internal.editors.text.WorkspaceOperationRunner.run(WorkspaceOperationRunner.java:63) + at org.eclipse.ui.editors.text.TextFileDocumentProvider.executeOperation(TextFileDocumentProvider.java:458) + at org.eclipse.ui.editors.text.TextFileDocumentProvider.saveDocument(TextFileDocumentProvider.java:761) + at org.eclipse.ui.texteditor.AbstractTextEditor.performSave(AbstractTextEditor.java:5025) + at org.eclipse.ui.texteditor.AbstractTextEditor.doSave(AbstractTextEditor.java:4820) + at org.eclipse.ui.texteditor.AbstractTextEditor$TextEditorSavable.doSave(AbstractTextEditor.java:7117) + at org.eclipse.ui.Saveable.doSave(Saveable.java:220) + at org.eclipse.ui.internal.SaveableHelper.doSaveModel(SaveableHelper.java:358) + at org.eclipse.ui.internal.SaveableHelper$3.run(SaveableHelper.java:202) + at org.eclipse.ui.internal.SaveableHelper$5.run(SaveableHelper.java:286) + at org.eclipse.jface.operation.ModalContext.runInCurrentThread(ModalContext.java:437) + at org.eclipse.jface.operation.ModalContext.run(ModalContext.java:353) + at org.eclipse.ui.internal.WorkbenchWindow$14.run(WorkbenchWindow.java:2184) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70) + at org.eclipse.ui.internal.WorkbenchWindow.run(WorkbenchWindow.java:2180) + at org.eclipse.ui.internal.SaveableHelper.runProgressMonitorOperation(SaveableHelper.java:294) + at org.eclipse.ui.internal.SaveableHelper.runProgressMonitorOperation(SaveableHelper.java:272) + at org.eclipse.ui.internal.SaveableHelper.saveModels(SaveableHelper.java:214) + at org.eclipse.ui.internal.SaveableHelper.savePart(SaveableHelper.java:149) + at org.eclipse.ui.internal.WorkbenchPage.saveSaveable(WorkbenchPage.java:3904) + at org.eclipse.ui.internal.WorkbenchPage.saveEditor(WorkbenchPage.java:3918) + at org.eclipse.ui.internal.handlers.SaveHandler.execute(SaveHandler.java:54) + at org.eclipse.ui.internal.handlers.HandlerProxy.execute(HandlerProxy.java:295) + at org.eclipse.ui.internal.handlers.E4HandlerProxy.execute(E4HandlerProxy.java:90) + at sun.reflect.GeneratedMethodAccessor53.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55) + at org.eclipse.e4.core.internal.di.InjectorImpl.invokeUsingClass(InjectorImpl.java:282) + at org.eclipse.e4.core.internal.di.InjectorImpl.invoke(InjectorImpl.java:264) + at org.eclipse.e4.core.contexts.ContextInjectionFactory.invoke(ContextInjectionFactory.java:132) + at org.eclipse.e4.core.commands.internal.HandlerServiceHandler.execute(HandlerServiceHandler.java:152) + at org.eclipse.core.commands.Command.executeWithChecks(Command.java:494) + at org.eclipse.core.commands.ParameterizedCommand.executeWithChecks(ParameterizedCommand.java:488) + at org.eclipse.e4.core.commands.internal.HandlerServiceImpl.executeHandler(HandlerServiceImpl.java:210) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.executeCommand(KeyBindingDispatcher.java:286) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.press(KeyBindingDispatcher.java:507) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.processKeyEvent(KeyBindingDispatcher.java:558) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.filterKeySequenceBindings(KeyBindingDispatcher.java:378) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.access$0(KeyBindingDispatcher.java:324) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher$KeyDownFilter.handleEvent(KeyBindingDispatcher.java:86) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.filterEvent(Display.java:1270) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1078) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1103) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1088) + at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1130) + at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1126) + at org.eclipse.swt.widgets.Widget.wmChar(Widget.java:1547) + at org.eclipse.swt.widgets.Control.WM_CHAR(Control.java:4918) + at org.eclipse.swt.widgets.Canvas.WM_CHAR(Canvas.java:364) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4799) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2552) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3822) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:37:45.012 +!MESSAGE Unhandled event loop exception +!STACK 0 +org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.IllegalStateException: startLine (47) does not match endLine (46)) + at org.eclipse.swt.SWT.error(SWT.java:4533) + at org.eclipse.swt.SWT.error(SWT.java:4448) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:185) + at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4211) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3827) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) +Caused by: java.lang.IllegalStateException: startLine (47) does not match endLine (46) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.text.source.LineNumberRulerColumn$1.run(LineNumberRulerColumn.java:417) + at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:182) + ... 23 more + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:37:45.693 +!MESSAGE Unhandled event loop exception +!STACK 0 +org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.IllegalStateException: startLine (47) does not match endLine (46)) + at org.eclipse.swt.SWT.error(SWT.java:4533) + at org.eclipse.swt.SWT.error(SWT.java:4448) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:185) + at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4211) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3827) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) +Caused by: java.lang.IllegalStateException: startLine (47) does not match endLine (46) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.internal.text.source.DiffPainter.redraw(DiffPainter.java:379) + at org.eclipse.jface.internal.text.source.DiffPainter.access$2(DiffPainter.java:378) + at org.eclipse.jface.internal.text.source.DiffPainter$2.run(DiffPainter.java:368) + at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:182) + ... 23 more + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:37:45.697 +!MESSAGE Unhandled event loop exception +!STACK 0 +org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.IllegalStateException: startLine (47) does not match endLine (46)) + at org.eclipse.swt.SWT.error(SWT.java:4533) + at org.eclipse.swt.SWT.error(SWT.java:4448) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:185) + at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4211) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3827) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) +Caused by: java.lang.IllegalStateException: startLine (47) does not match endLine (46) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.text.source.LineNumberRulerColumn$1.run(LineNumberRulerColumn.java:417) + at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:182) + ... 23 more + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:37:45.858 +!MESSAGE Unhandled event loop exception +!STACK 0 +org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.IllegalStateException: startLine (47) does not match endLine (46)) + at org.eclipse.swt.SWT.error(SWT.java:4533) + at org.eclipse.swt.SWT.error(SWT.java:4448) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:185) + at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4211) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3827) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) +Caused by: java.lang.IllegalStateException: startLine (47) does not match endLine (46) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.text.source.LineNumberRulerColumn$1.run(LineNumberRulerColumn.java:417) + at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:182) + ... 23 more + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:37:52.816 +!MESSAGE Unhandled event loop exception +!STACK 0 +org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.IllegalStateException: startLine (46) does not match endLine (45)) + at org.eclipse.swt.SWT.error(SWT.java:4533) + at org.eclipse.swt.SWT.error(SWT.java:4448) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:185) + at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4211) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3827) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) +Caused by: java.lang.IllegalStateException: startLine (46) does not match endLine (45) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.internal.text.source.DiffPainter.redraw(DiffPainter.java:379) + at org.eclipse.jface.internal.text.source.DiffPainter.access$2(DiffPainter.java:378) + at org.eclipse.jface.internal.text.source.DiffPainter$2.run(DiffPainter.java:368) + at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:182) + ... 23 more + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:37:53.367 +!MESSAGE Unhandled event loop exception +!STACK 0 +org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.IllegalStateException: startLine (46) does not match endLine (45)) + at org.eclipse.swt.SWT.error(SWT.java:4533) + at org.eclipse.swt.SWT.error(SWT.java:4448) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:185) + at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4211) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3827) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) +Caused by: java.lang.IllegalStateException: startLine (46) does not match endLine (45) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.text.source.LineNumberRulerColumn$1.run(LineNumberRulerColumn.java:417) + at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:182) + ... 23 more + +!ENTRY org.eclipse.cdt.ui 4 4 2017-09-12 12:37:54.184 +!MESSAGE Error +!STACK 0 +org.eclipse.jface.text.BadLocationException + at org.eclipse.jface.text.AbstractDocument.get(AbstractDocument.java:964) + at org.eclipse.core.internal.filebuffers.SynchronizableDocument.get(SynchronizableDocument.java:127) + at org.eclipse.cdt.internal.ui.text.LineComparator.getHash(LineComparator.java:84) + at org.eclipse.cdt.internal.ui.text.LineComparator.rangesEqual(LineComparator.java:60) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.isRangeEqual(RangeComparatorLCS.java:57) + at org.eclipse.compare.internal.core.LCS.longestCommonSubsequence(LCS.java:80) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.longestCommonSubsequence(RangeComparatorLCS.java:186) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.findDifferences(RangeComparatorLCS.java:31) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:98) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:82) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:67) + at org.eclipse.cdt.internal.ui.util.EditorUtility$1.getChangedLineRegions(EditorUtility.java:948) + at org.eclipse.cdt.internal.ui.util.EditorUtility$1.run(EditorUtility.java:924) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.cdt.internal.ui.util.EditorUtility.calculateChangedLineRegions(EditorUtility.java:899) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider.performSaveActions(CDocumentProvider.java:970) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider.commitWorkingCopy(CDocumentProvider.java:887) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider$2.execute(CDocumentProvider.java:919) + at org.eclipse.ui.editors.text.TextFileDocumentProvider$DocumentProviderOperation.run(TextFileDocumentProvider.java:130) + at org.eclipse.ui.actions.WorkspaceModifyDelegatingOperation.execute(WorkspaceModifyDelegatingOperation.java:67) + at org.eclipse.ui.actions.WorkspaceModifyOperation.lambda$0(WorkspaceModifyOperation.java:107) + at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2240) + at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2267) + at org.eclipse.ui.actions.WorkspaceModifyOperation.run(WorkspaceModifyOperation.java:128) + at org.eclipse.ui.internal.editors.text.WorkspaceOperationRunner.run(WorkspaceOperationRunner.java:73) + at org.eclipse.ui.internal.editors.text.WorkspaceOperationRunner.run(WorkspaceOperationRunner.java:63) + at org.eclipse.ui.editors.text.TextFileDocumentProvider.executeOperation(TextFileDocumentProvider.java:458) + at org.eclipse.ui.editors.text.TextFileDocumentProvider.saveDocument(TextFileDocumentProvider.java:761) + at org.eclipse.ui.texteditor.AbstractTextEditor.performSave(AbstractTextEditor.java:5025) + at org.eclipse.ui.texteditor.AbstractTextEditor.doSave(AbstractTextEditor.java:4820) + at org.eclipse.ui.texteditor.AbstractTextEditor$TextEditorSavable.doSave(AbstractTextEditor.java:7117) + at org.eclipse.ui.Saveable.doSave(Saveable.java:220) + at org.eclipse.ui.internal.SaveableHelper.doSaveModel(SaveableHelper.java:358) + at org.eclipse.ui.internal.SaveableHelper$3.run(SaveableHelper.java:202) + at org.eclipse.ui.internal.SaveableHelper$5.run(SaveableHelper.java:286) + at org.eclipse.jface.operation.ModalContext.runInCurrentThread(ModalContext.java:437) + at org.eclipse.jface.operation.ModalContext.run(ModalContext.java:353) + at org.eclipse.ui.internal.WorkbenchWindow$14.run(WorkbenchWindow.java:2184) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70) + at org.eclipse.ui.internal.WorkbenchWindow.run(WorkbenchWindow.java:2180) + at org.eclipse.ui.internal.SaveableHelper.runProgressMonitorOperation(SaveableHelper.java:294) + at org.eclipse.ui.internal.SaveableHelper.runProgressMonitorOperation(SaveableHelper.java:272) + at org.eclipse.ui.internal.SaveableHelper.saveModels(SaveableHelper.java:214) + at org.eclipse.ui.internal.SaveableHelper.savePart(SaveableHelper.java:149) + at org.eclipse.ui.internal.WorkbenchPage.saveSaveable(WorkbenchPage.java:3904) + at org.eclipse.ui.internal.WorkbenchPage.saveEditor(WorkbenchPage.java:3918) + at org.eclipse.ui.internal.handlers.SaveHandler.execute(SaveHandler.java:54) + at org.eclipse.ui.internal.handlers.HandlerProxy.execute(HandlerProxy.java:295) + at org.eclipse.ui.internal.handlers.E4HandlerProxy.execute(E4HandlerProxy.java:90) + at sun.reflect.GeneratedMethodAccessor53.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55) + at org.eclipse.e4.core.internal.di.InjectorImpl.invokeUsingClass(InjectorImpl.java:282) + at org.eclipse.e4.core.internal.di.InjectorImpl.invoke(InjectorImpl.java:264) + at org.eclipse.e4.core.contexts.ContextInjectionFactory.invoke(ContextInjectionFactory.java:132) + at org.eclipse.e4.core.commands.internal.HandlerServiceHandler.execute(HandlerServiceHandler.java:152) + at org.eclipse.core.commands.Command.executeWithChecks(Command.java:494) + at org.eclipse.core.commands.ParameterizedCommand.executeWithChecks(ParameterizedCommand.java:488) + at org.eclipse.e4.core.commands.internal.HandlerServiceImpl.executeHandler(HandlerServiceImpl.java:210) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.executeCommand(KeyBindingDispatcher.java:286) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.press(KeyBindingDispatcher.java:507) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.processKeyEvent(KeyBindingDispatcher.java:558) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.filterKeySequenceBindings(KeyBindingDispatcher.java:378) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.access$0(KeyBindingDispatcher.java:324) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher$KeyDownFilter.handleEvent(KeyBindingDispatcher.java:86) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.filterEvent(Display.java:1270) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1078) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1103) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1088) + at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1130) + at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1126) + at org.eclipse.swt.widgets.Widget.wmChar(Widget.java:1547) + at org.eclipse.swt.widgets.Control.WM_CHAR(Control.java:4918) + at org.eclipse.swt.widgets.Canvas.WM_CHAR(Canvas.java:364) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4799) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2552) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3822) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) + +!ENTRY org.eclipse.cdt.ui 4 4 2017-09-12 12:37:54.187 +!MESSAGE Error +!STACK 0 +org.eclipse.jface.text.BadLocationException + at org.eclipse.jface.text.AbstractDocument.get(AbstractDocument.java:964) + at org.eclipse.core.internal.filebuffers.SynchronizableDocument.get(SynchronizableDocument.java:127) + at org.eclipse.cdt.internal.ui.text.LineComparator.getHash(LineComparator.java:84) + at org.eclipse.cdt.internal.ui.text.LineComparator.rangesEqual(LineComparator.java:60) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.isRangeEqual(RangeComparatorLCS.java:57) + at org.eclipse.compare.internal.core.LCS.find_middle_snake(LCS.java:305) + at org.eclipse.compare.internal.core.LCS.lcs_rec(LCS.java:133) + at org.eclipse.compare.internal.core.LCS.longestCommonSubsequence(LCS.java:91) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.longestCommonSubsequence(RangeComparatorLCS.java:186) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.findDifferences(RangeComparatorLCS.java:31) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:98) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:82) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:67) + at org.eclipse.cdt.internal.ui.util.EditorUtility$1.getChangedLineRegions(EditorUtility.java:948) + at org.eclipse.cdt.internal.ui.util.EditorUtility$1.run(EditorUtility.java:924) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.cdt.internal.ui.util.EditorUtility.calculateChangedLineRegions(EditorUtility.java:899) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider.performSaveActions(CDocumentProvider.java:970) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider.commitWorkingCopy(CDocumentProvider.java:887) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider$2.execute(CDocumentProvider.java:919) + at org.eclipse.ui.editors.text.TextFileDocumentProvider$DocumentProviderOperation.run(TextFileDocumentProvider.java:130) + at org.eclipse.ui.actions.WorkspaceModifyDelegatingOperation.execute(WorkspaceModifyDelegatingOperation.java:67) + at org.eclipse.ui.actions.WorkspaceModifyOperation.lambda$0(WorkspaceModifyOperation.java:107) + at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2240) + at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2267) + at org.eclipse.ui.actions.WorkspaceModifyOperation.run(WorkspaceModifyOperation.java:128) + at org.eclipse.ui.internal.editors.text.WorkspaceOperationRunner.run(WorkspaceOperationRunner.java:73) + at org.eclipse.ui.internal.editors.text.WorkspaceOperationRunner.run(WorkspaceOperationRunner.java:63) + at org.eclipse.ui.editors.text.TextFileDocumentProvider.executeOperation(TextFileDocumentProvider.java:458) + at org.eclipse.ui.editors.text.TextFileDocumentProvider.saveDocument(TextFileDocumentProvider.java:761) + at org.eclipse.ui.texteditor.AbstractTextEditor.performSave(AbstractTextEditor.java:5025) + at org.eclipse.ui.texteditor.AbstractTextEditor.doSave(AbstractTextEditor.java:4820) + at org.eclipse.ui.texteditor.AbstractTextEditor$TextEditorSavable.doSave(AbstractTextEditor.java:7117) + at org.eclipse.ui.Saveable.doSave(Saveable.java:220) + at org.eclipse.ui.internal.SaveableHelper.doSaveModel(SaveableHelper.java:358) + at org.eclipse.ui.internal.SaveableHelper$3.run(SaveableHelper.java:202) + at org.eclipse.ui.internal.SaveableHelper$5.run(SaveableHelper.java:286) + at org.eclipse.jface.operation.ModalContext.runInCurrentThread(ModalContext.java:437) + at org.eclipse.jface.operation.ModalContext.run(ModalContext.java:353) + at org.eclipse.ui.internal.WorkbenchWindow$14.run(WorkbenchWindow.java:2184) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70) + at org.eclipse.ui.internal.WorkbenchWindow.run(WorkbenchWindow.java:2180) + at org.eclipse.ui.internal.SaveableHelper.runProgressMonitorOperation(SaveableHelper.java:294) + at org.eclipse.ui.internal.SaveableHelper.runProgressMonitorOperation(SaveableHelper.java:272) + at org.eclipse.ui.internal.SaveableHelper.saveModels(SaveableHelper.java:214) + at org.eclipse.ui.internal.SaveableHelper.savePart(SaveableHelper.java:149) + at org.eclipse.ui.internal.WorkbenchPage.saveSaveable(WorkbenchPage.java:3904) + at org.eclipse.ui.internal.WorkbenchPage.saveEditor(WorkbenchPage.java:3918) + at org.eclipse.ui.internal.handlers.SaveHandler.execute(SaveHandler.java:54) + at org.eclipse.ui.internal.handlers.HandlerProxy.execute(HandlerProxy.java:295) + at org.eclipse.ui.internal.handlers.E4HandlerProxy.execute(E4HandlerProxy.java:90) + at sun.reflect.GeneratedMethodAccessor53.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55) + at org.eclipse.e4.core.internal.di.InjectorImpl.invokeUsingClass(InjectorImpl.java:282) + at org.eclipse.e4.core.internal.di.InjectorImpl.invoke(InjectorImpl.java:264) + at org.eclipse.e4.core.contexts.ContextInjectionFactory.invoke(ContextInjectionFactory.java:132) + at org.eclipse.e4.core.commands.internal.HandlerServiceHandler.execute(HandlerServiceHandler.java:152) + at org.eclipse.core.commands.Command.executeWithChecks(Command.java:494) + at org.eclipse.core.commands.ParameterizedCommand.executeWithChecks(ParameterizedCommand.java:488) + at org.eclipse.e4.core.commands.internal.HandlerServiceImpl.executeHandler(HandlerServiceImpl.java:210) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.executeCommand(KeyBindingDispatcher.java:286) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.press(KeyBindingDispatcher.java:507) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.processKeyEvent(KeyBindingDispatcher.java:558) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.filterKeySequenceBindings(KeyBindingDispatcher.java:378) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.access$0(KeyBindingDispatcher.java:324) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher$KeyDownFilter.handleEvent(KeyBindingDispatcher.java:86) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.filterEvent(Display.java:1270) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1078) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1103) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1088) + at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1130) + at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1126) + at org.eclipse.swt.widgets.Widget.wmChar(Widget.java:1547) + at org.eclipse.swt.widgets.Control.WM_CHAR(Control.java:4918) + at org.eclipse.swt.widgets.Canvas.WM_CHAR(Canvas.java:364) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4799) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2552) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3822) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) + +!ENTRY org.eclipse.cdt.ui 4 4 2017-09-12 12:37:54.190 +!MESSAGE Error +!STACK 0 +org.eclipse.jface.text.BadLocationException + at org.eclipse.jface.text.AbstractDocument.get(AbstractDocument.java:964) + at org.eclipse.core.internal.filebuffers.SynchronizableDocument.get(SynchronizableDocument.java:127) + at org.eclipse.cdt.internal.ui.text.LineComparator.getHash(LineComparator.java:84) + at org.eclipse.cdt.internal.ui.text.LineComparator.rangesEqual(LineComparator.java:60) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.isRangeEqual(RangeComparatorLCS.java:57) + at org.eclipse.compare.internal.core.LCS.find_middle_snake(LCS.java:262) + at org.eclipse.compare.internal.core.LCS.lcs_rec(LCS.java:133) + at org.eclipse.compare.internal.core.LCS.longestCommonSubsequence(LCS.java:91) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.longestCommonSubsequence(RangeComparatorLCS.java:186) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.findDifferences(RangeComparatorLCS.java:31) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:98) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:82) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:67) + at org.eclipse.cdt.internal.ui.util.EditorUtility$1.getChangedLineRegions(EditorUtility.java:948) + at org.eclipse.cdt.internal.ui.util.EditorUtility$1.run(EditorUtility.java:924) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.cdt.internal.ui.util.EditorUtility.calculateChangedLineRegions(EditorUtility.java:899) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider.performSaveActions(CDocumentProvider.java:970) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider.commitWorkingCopy(CDocumentProvider.java:887) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider$2.execute(CDocumentProvider.java:919) + at org.eclipse.ui.editors.text.TextFileDocumentProvider$DocumentProviderOperation.run(TextFileDocumentProvider.java:130) + at org.eclipse.ui.actions.WorkspaceModifyDelegatingOperation.execute(WorkspaceModifyDelegatingOperation.java:67) + at org.eclipse.ui.actions.WorkspaceModifyOperation.lambda$0(WorkspaceModifyOperation.java:107) + at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2240) + at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2267) + at org.eclipse.ui.actions.WorkspaceModifyOperation.run(WorkspaceModifyOperation.java:128) + at org.eclipse.ui.internal.editors.text.WorkspaceOperationRunner.run(WorkspaceOperationRunner.java:73) + at org.eclipse.ui.internal.editors.text.WorkspaceOperationRunner.run(WorkspaceOperationRunner.java:63) + at org.eclipse.ui.editors.text.TextFileDocumentProvider.executeOperation(TextFileDocumentProvider.java:458) + at org.eclipse.ui.editors.text.TextFileDocumentProvider.saveDocument(TextFileDocumentProvider.java:761) + at org.eclipse.ui.texteditor.AbstractTextEditor.performSave(AbstractTextEditor.java:5025) + at org.eclipse.ui.texteditor.AbstractTextEditor.doSave(AbstractTextEditor.java:4820) + at org.eclipse.ui.texteditor.AbstractTextEditor$TextEditorSavable.doSave(AbstractTextEditor.java:7117) + at org.eclipse.ui.Saveable.doSave(Saveable.java:220) + at org.eclipse.ui.internal.SaveableHelper.doSaveModel(SaveableHelper.java:358) + at org.eclipse.ui.internal.SaveableHelper$3.run(SaveableHelper.java:202) + at org.eclipse.ui.internal.SaveableHelper$5.run(SaveableHelper.java:286) + at org.eclipse.jface.operation.ModalContext.runInCurrentThread(ModalContext.java:437) + at org.eclipse.jface.operation.ModalContext.run(ModalContext.java:353) + at org.eclipse.ui.internal.WorkbenchWindow$14.run(WorkbenchWindow.java:2184) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70) + at org.eclipse.ui.internal.WorkbenchWindow.run(WorkbenchWindow.java:2180) + at org.eclipse.ui.internal.SaveableHelper.runProgressMonitorOperation(SaveableHelper.java:294) + at org.eclipse.ui.internal.SaveableHelper.runProgressMonitorOperation(SaveableHelper.java:272) + at org.eclipse.ui.internal.SaveableHelper.saveModels(SaveableHelper.java:214) + at org.eclipse.ui.internal.SaveableHelper.savePart(SaveableHelper.java:149) + at org.eclipse.ui.internal.WorkbenchPage.saveSaveable(WorkbenchPage.java:3904) + at org.eclipse.ui.internal.WorkbenchPage.saveEditor(WorkbenchPage.java:3918) + at org.eclipse.ui.internal.handlers.SaveHandler.execute(SaveHandler.java:54) + at org.eclipse.ui.internal.handlers.HandlerProxy.execute(HandlerProxy.java:295) + at org.eclipse.ui.internal.handlers.E4HandlerProxy.execute(E4HandlerProxy.java:90) + at sun.reflect.GeneratedMethodAccessor53.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55) + at org.eclipse.e4.core.internal.di.InjectorImpl.invokeUsingClass(InjectorImpl.java:282) + at org.eclipse.e4.core.internal.di.InjectorImpl.invoke(InjectorImpl.java:264) + at org.eclipse.e4.core.contexts.ContextInjectionFactory.invoke(ContextInjectionFactory.java:132) + at org.eclipse.e4.core.commands.internal.HandlerServiceHandler.execute(HandlerServiceHandler.java:152) + at org.eclipse.core.commands.Command.executeWithChecks(Command.java:494) + at org.eclipse.core.commands.ParameterizedCommand.executeWithChecks(ParameterizedCommand.java:488) + at org.eclipse.e4.core.commands.internal.HandlerServiceImpl.executeHandler(HandlerServiceImpl.java:210) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.executeCommand(KeyBindingDispatcher.java:286) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.press(KeyBindingDispatcher.java:507) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.processKeyEvent(KeyBindingDispatcher.java:558) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.filterKeySequenceBindings(KeyBindingDispatcher.java:378) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.access$0(KeyBindingDispatcher.java:324) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher$KeyDownFilter.handleEvent(KeyBindingDispatcher.java:86) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.filterEvent(Display.java:1270) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1078) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1103) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1088) + at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1130) + at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1126) + at org.eclipse.swt.widgets.Widget.wmChar(Widget.java:1547) + at org.eclipse.swt.widgets.Control.WM_CHAR(Control.java:4918) + at org.eclipse.swt.widgets.Canvas.WM_CHAR(Canvas.java:364) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4799) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2552) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3822) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) + +!ENTRY org.eclipse.cdt.ui 4 4 2017-09-12 12:37:54.193 +!MESSAGE Error +!STACK 0 +org.eclipse.jface.text.BadLocationException + at org.eclipse.jface.text.AbstractDocument.get(AbstractDocument.java:964) + at org.eclipse.core.internal.filebuffers.SynchronizableDocument.get(SynchronizableDocument.java:127) + at org.eclipse.cdt.internal.ui.text.LineComparator.getHash(LineComparator.java:84) + at org.eclipse.cdt.internal.ui.text.LineComparator.rangesEqual(LineComparator.java:60) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.isRangeEqual(RangeComparatorLCS.java:57) + at org.eclipse.compare.internal.core.LCS.find_middle_snake(LCS.java:305) + at org.eclipse.compare.internal.core.LCS.lcs_rec(LCS.java:133) + at org.eclipse.compare.internal.core.LCS.longestCommonSubsequence(LCS.java:91) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.longestCommonSubsequence(RangeComparatorLCS.java:186) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.findDifferences(RangeComparatorLCS.java:31) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:98) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:82) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:67) + at org.eclipse.cdt.internal.ui.util.EditorUtility$1.getChangedLineRegions(EditorUtility.java:948) + at org.eclipse.cdt.internal.ui.util.EditorUtility$1.run(EditorUtility.java:924) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.cdt.internal.ui.util.EditorUtility.calculateChangedLineRegions(EditorUtility.java:899) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider.performSaveActions(CDocumentProvider.java:970) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider.commitWorkingCopy(CDocumentProvider.java:887) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider$2.execute(CDocumentProvider.java:919) + at org.eclipse.ui.editors.text.TextFileDocumentProvider$DocumentProviderOperation.run(TextFileDocumentProvider.java:130) + at org.eclipse.ui.actions.WorkspaceModifyDelegatingOperation.execute(WorkspaceModifyDelegatingOperation.java:67) + at org.eclipse.ui.actions.WorkspaceModifyOperation.lambda$0(WorkspaceModifyOperation.java:107) + at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2240) + at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2267) + at org.eclipse.ui.actions.WorkspaceModifyOperation.run(WorkspaceModifyOperation.java:128) + at org.eclipse.ui.internal.editors.text.WorkspaceOperationRunner.run(WorkspaceOperationRunner.java:73) + at org.eclipse.ui.internal.editors.text.WorkspaceOperationRunner.run(WorkspaceOperationRunner.java:63) + at org.eclipse.ui.editors.text.TextFileDocumentProvider.executeOperation(TextFileDocumentProvider.java:458) + at org.eclipse.ui.editors.text.TextFileDocumentProvider.saveDocument(TextFileDocumentProvider.java:761) + at org.eclipse.ui.texteditor.AbstractTextEditor.performSave(AbstractTextEditor.java:5025) + at org.eclipse.ui.texteditor.AbstractTextEditor.doSave(AbstractTextEditor.java:4820) + at org.eclipse.ui.texteditor.AbstractTextEditor$TextEditorSavable.doSave(AbstractTextEditor.java:7117) + at org.eclipse.ui.Saveable.doSave(Saveable.java:220) + at org.eclipse.ui.internal.SaveableHelper.doSaveModel(SaveableHelper.java:358) + at org.eclipse.ui.internal.SaveableHelper$3.run(SaveableHelper.java:202) + at org.eclipse.ui.internal.SaveableHelper$5.run(SaveableHelper.java:286) + at org.eclipse.jface.operation.ModalContext.runInCurrentThread(ModalContext.java:437) + at org.eclipse.jface.operation.ModalContext.run(ModalContext.java:353) + at org.eclipse.ui.internal.WorkbenchWindow$14.run(WorkbenchWindow.java:2184) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70) + at org.eclipse.ui.internal.WorkbenchWindow.run(WorkbenchWindow.java:2180) + at org.eclipse.ui.internal.SaveableHelper.runProgressMonitorOperation(SaveableHelper.java:294) + at org.eclipse.ui.internal.SaveableHelper.runProgressMonitorOperation(SaveableHelper.java:272) + at org.eclipse.ui.internal.SaveableHelper.saveModels(SaveableHelper.java:214) + at org.eclipse.ui.internal.SaveableHelper.savePart(SaveableHelper.java:149) + at org.eclipse.ui.internal.WorkbenchPage.saveSaveable(WorkbenchPage.java:3904) + at org.eclipse.ui.internal.WorkbenchPage.saveEditor(WorkbenchPage.java:3918) + at org.eclipse.ui.internal.handlers.SaveHandler.execute(SaveHandler.java:54) + at org.eclipse.ui.internal.handlers.HandlerProxy.execute(HandlerProxy.java:295) + at org.eclipse.ui.internal.handlers.E4HandlerProxy.execute(E4HandlerProxy.java:90) + at sun.reflect.GeneratedMethodAccessor53.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55) + at org.eclipse.e4.core.internal.di.InjectorImpl.invokeUsingClass(InjectorImpl.java:282) + at org.eclipse.e4.core.internal.di.InjectorImpl.invoke(InjectorImpl.java:264) + at org.eclipse.e4.core.contexts.ContextInjectionFactory.invoke(ContextInjectionFactory.java:132) + at org.eclipse.e4.core.commands.internal.HandlerServiceHandler.execute(HandlerServiceHandler.java:152) + at org.eclipse.core.commands.Command.executeWithChecks(Command.java:494) + at org.eclipse.core.commands.ParameterizedCommand.executeWithChecks(ParameterizedCommand.java:488) + at org.eclipse.e4.core.commands.internal.HandlerServiceImpl.executeHandler(HandlerServiceImpl.java:210) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.executeCommand(KeyBindingDispatcher.java:286) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.press(KeyBindingDispatcher.java:507) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.processKeyEvent(KeyBindingDispatcher.java:558) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.filterKeySequenceBindings(KeyBindingDispatcher.java:378) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.access$0(KeyBindingDispatcher.java:324) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher$KeyDownFilter.handleEvent(KeyBindingDispatcher.java:86) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.filterEvent(Display.java:1270) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1078) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1103) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1088) + at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1130) + at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1126) + at org.eclipse.swt.widgets.Widget.wmChar(Widget.java:1547) + at org.eclipse.swt.widgets.Control.WM_CHAR(Control.java:4918) + at org.eclipse.swt.widgets.Canvas.WM_CHAR(Canvas.java:364) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4799) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2552) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3822) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) + +!ENTRY org.eclipse.cdt.ui 4 4 2017-09-12 12:37:54.196 +!MESSAGE Error +!STACK 0 +org.eclipse.jface.text.BadLocationException + at org.eclipse.jface.text.AbstractDocument.get(AbstractDocument.java:964) + at org.eclipse.core.internal.filebuffers.SynchronizableDocument.get(SynchronizableDocument.java:127) + at org.eclipse.cdt.internal.ui.text.LineComparator.getHash(LineComparator.java:84) + at org.eclipse.cdt.internal.ui.text.LineComparator.rangesEqual(LineComparator.java:60) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.isRangeEqual(RangeComparatorLCS.java:57) + at org.eclipse.compare.internal.core.LCS.find_middle_snake(LCS.java:305) + at org.eclipse.compare.internal.core.LCS.lcs_rec(LCS.java:133) + at org.eclipse.compare.internal.core.LCS.lcs_rec(LCS.java:150) + at org.eclipse.compare.internal.core.LCS.longestCommonSubsequence(LCS.java:91) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.longestCommonSubsequence(RangeComparatorLCS.java:186) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.findDifferences(RangeComparatorLCS.java:31) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:98) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:82) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:67) + at org.eclipse.cdt.internal.ui.util.EditorUtility$1.getChangedLineRegions(EditorUtility.java:948) + at org.eclipse.cdt.internal.ui.util.EditorUtility$1.run(EditorUtility.java:924) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.cdt.internal.ui.util.EditorUtility.calculateChangedLineRegions(EditorUtility.java:899) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider.performSaveActions(CDocumentProvider.java:970) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider.commitWorkingCopy(CDocumentProvider.java:887) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider$2.execute(CDocumentProvider.java:919) + at org.eclipse.ui.editors.text.TextFileDocumentProvider$DocumentProviderOperation.run(TextFileDocumentProvider.java:130) + at org.eclipse.ui.actions.WorkspaceModifyDelegatingOperation.execute(WorkspaceModifyDelegatingOperation.java:67) + at org.eclipse.ui.actions.WorkspaceModifyOperation.lambda$0(WorkspaceModifyOperation.java:107) + at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2240) + at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2267) + at org.eclipse.ui.actions.WorkspaceModifyOperation.run(WorkspaceModifyOperation.java:128) + at org.eclipse.ui.internal.editors.text.WorkspaceOperationRunner.run(WorkspaceOperationRunner.java:73) + at org.eclipse.ui.internal.editors.text.WorkspaceOperationRunner.run(WorkspaceOperationRunner.java:63) + at org.eclipse.ui.editors.text.TextFileDocumentProvider.executeOperation(TextFileDocumentProvider.java:458) + at org.eclipse.ui.editors.text.TextFileDocumentProvider.saveDocument(TextFileDocumentProvider.java:761) + at org.eclipse.ui.texteditor.AbstractTextEditor.performSave(AbstractTextEditor.java:5025) + at org.eclipse.ui.texteditor.AbstractTextEditor.doSave(AbstractTextEditor.java:4820) + at org.eclipse.ui.texteditor.AbstractTextEditor$TextEditorSavable.doSave(AbstractTextEditor.java:7117) + at org.eclipse.ui.Saveable.doSave(Saveable.java:220) + at org.eclipse.ui.internal.SaveableHelper.doSaveModel(SaveableHelper.java:358) + at org.eclipse.ui.internal.SaveableHelper$3.run(SaveableHelper.java:202) + at org.eclipse.ui.internal.SaveableHelper$5.run(SaveableHelper.java:286) + at org.eclipse.jface.operation.ModalContext.runInCurrentThread(ModalContext.java:437) + at org.eclipse.jface.operation.ModalContext.run(ModalContext.java:353) + at org.eclipse.ui.internal.WorkbenchWindow$14.run(WorkbenchWindow.java:2184) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70) + at org.eclipse.ui.internal.WorkbenchWindow.run(WorkbenchWindow.java:2180) + at org.eclipse.ui.internal.SaveableHelper.runProgressMonitorOperation(SaveableHelper.java:294) + at org.eclipse.ui.internal.SaveableHelper.runProgressMonitorOperation(SaveableHelper.java:272) + at org.eclipse.ui.internal.SaveableHelper.saveModels(SaveableHelper.java:214) + at org.eclipse.ui.internal.SaveableHelper.savePart(SaveableHelper.java:149) + at org.eclipse.ui.internal.WorkbenchPage.saveSaveable(WorkbenchPage.java:3904) + at org.eclipse.ui.internal.WorkbenchPage.saveEditor(WorkbenchPage.java:3918) + at org.eclipse.ui.internal.handlers.SaveHandler.execute(SaveHandler.java:54) + at org.eclipse.ui.internal.handlers.HandlerProxy.execute(HandlerProxy.java:295) + at org.eclipse.ui.internal.handlers.E4HandlerProxy.execute(E4HandlerProxy.java:90) + at sun.reflect.GeneratedMethodAccessor53.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55) + at org.eclipse.e4.core.internal.di.InjectorImpl.invokeUsingClass(InjectorImpl.java:282) + at org.eclipse.e4.core.internal.di.InjectorImpl.invoke(InjectorImpl.java:264) + at org.eclipse.e4.core.contexts.ContextInjectionFactory.invoke(ContextInjectionFactory.java:132) + at org.eclipse.e4.core.commands.internal.HandlerServiceHandler.execute(HandlerServiceHandler.java:152) + at org.eclipse.core.commands.Command.executeWithChecks(Command.java:494) + at org.eclipse.core.commands.ParameterizedCommand.executeWithChecks(ParameterizedCommand.java:488) + at org.eclipse.e4.core.commands.internal.HandlerServiceImpl.executeHandler(HandlerServiceImpl.java:210) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.executeCommand(KeyBindingDispatcher.java:286) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.press(KeyBindingDispatcher.java:507) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.processKeyEvent(KeyBindingDispatcher.java:558) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.filterKeySequenceBindings(KeyBindingDispatcher.java:378) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.access$0(KeyBindingDispatcher.java:324) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher$KeyDownFilter.handleEvent(KeyBindingDispatcher.java:86) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.filterEvent(Display.java:1270) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1078) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1103) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1088) + at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1130) + at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1126) + at org.eclipse.swt.widgets.Widget.wmChar(Widget.java:1547) + at org.eclipse.swt.widgets.Control.WM_CHAR(Control.java:4918) + at org.eclipse.swt.widgets.Canvas.WM_CHAR(Canvas.java:364) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4799) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2552) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3822) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) + +!ENTRY org.eclipse.cdt.ui 4 4 2017-09-12 12:37:54.199 +!MESSAGE Error +!STACK 0 +org.eclipse.jface.text.BadLocationException + at org.eclipse.jface.text.AbstractDocument.get(AbstractDocument.java:964) + at org.eclipse.core.internal.filebuffers.SynchronizableDocument.get(SynchronizableDocument.java:127) + at org.eclipse.cdt.internal.ui.text.LineComparator.getHash(LineComparator.java:84) + at org.eclipse.cdt.internal.ui.text.LineComparator.rangesEqual(LineComparator.java:60) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.isRangeEqual(RangeComparatorLCS.java:57) + at org.eclipse.compare.internal.core.LCS.find_middle_snake(LCS.java:305) + at org.eclipse.compare.internal.core.LCS.lcs_rec(LCS.java:133) + at org.eclipse.compare.internal.core.LCS.lcs_rec(LCS.java:150) + at org.eclipse.compare.internal.core.LCS.longestCommonSubsequence(LCS.java:91) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.longestCommonSubsequence(RangeComparatorLCS.java:186) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.findDifferences(RangeComparatorLCS.java:31) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:98) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:82) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:67) + at org.eclipse.cdt.internal.ui.util.EditorUtility$1.getChangedLineRegions(EditorUtility.java:948) + at org.eclipse.cdt.internal.ui.util.EditorUtility$1.run(EditorUtility.java:924) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.cdt.internal.ui.util.EditorUtility.calculateChangedLineRegions(EditorUtility.java:899) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider.performSaveActions(CDocumentProvider.java:970) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider.commitWorkingCopy(CDocumentProvider.java:887) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider$2.execute(CDocumentProvider.java:919) + at org.eclipse.ui.editors.text.TextFileDocumentProvider$DocumentProviderOperation.run(TextFileDocumentProvider.java:130) + at org.eclipse.ui.actions.WorkspaceModifyDelegatingOperation.execute(WorkspaceModifyDelegatingOperation.java:67) + at org.eclipse.ui.actions.WorkspaceModifyOperation.lambda$0(WorkspaceModifyOperation.java:107) + at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2240) + at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2267) + at org.eclipse.ui.actions.WorkspaceModifyOperation.run(WorkspaceModifyOperation.java:128) + at org.eclipse.ui.internal.editors.text.WorkspaceOperationRunner.run(WorkspaceOperationRunner.java:73) + at org.eclipse.ui.internal.editors.text.WorkspaceOperationRunner.run(WorkspaceOperationRunner.java:63) + at org.eclipse.ui.editors.text.TextFileDocumentProvider.executeOperation(TextFileDocumentProvider.java:458) + at org.eclipse.ui.editors.text.TextFileDocumentProvider.saveDocument(TextFileDocumentProvider.java:761) + at org.eclipse.ui.texteditor.AbstractTextEditor.performSave(AbstractTextEditor.java:5025) + at org.eclipse.ui.texteditor.AbstractTextEditor.doSave(AbstractTextEditor.java:4820) + at org.eclipse.ui.texteditor.AbstractTextEditor$TextEditorSavable.doSave(AbstractTextEditor.java:7117) + at org.eclipse.ui.Saveable.doSave(Saveable.java:220) + at org.eclipse.ui.internal.SaveableHelper.doSaveModel(SaveableHelper.java:358) + at org.eclipse.ui.internal.SaveableHelper$3.run(SaveableHelper.java:202) + at org.eclipse.ui.internal.SaveableHelper$5.run(SaveableHelper.java:286) + at org.eclipse.jface.operation.ModalContext.runInCurrentThread(ModalContext.java:437) + at org.eclipse.jface.operation.ModalContext.run(ModalContext.java:353) + at org.eclipse.ui.internal.WorkbenchWindow$14.run(WorkbenchWindow.java:2184) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70) + at org.eclipse.ui.internal.WorkbenchWindow.run(WorkbenchWindow.java:2180) + at org.eclipse.ui.internal.SaveableHelper.runProgressMonitorOperation(SaveableHelper.java:294) + at org.eclipse.ui.internal.SaveableHelper.runProgressMonitorOperation(SaveableHelper.java:272) + at org.eclipse.ui.internal.SaveableHelper.saveModels(SaveableHelper.java:214) + at org.eclipse.ui.internal.SaveableHelper.savePart(SaveableHelper.java:149) + at org.eclipse.ui.internal.WorkbenchPage.saveSaveable(WorkbenchPage.java:3904) + at org.eclipse.ui.internal.WorkbenchPage.saveEditor(WorkbenchPage.java:3918) + at org.eclipse.ui.internal.handlers.SaveHandler.execute(SaveHandler.java:54) + at org.eclipse.ui.internal.handlers.HandlerProxy.execute(HandlerProxy.java:295) + at org.eclipse.ui.internal.handlers.E4HandlerProxy.execute(E4HandlerProxy.java:90) + at sun.reflect.GeneratedMethodAccessor53.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55) + at org.eclipse.e4.core.internal.di.InjectorImpl.invokeUsingClass(InjectorImpl.java:282) + at org.eclipse.e4.core.internal.di.InjectorImpl.invoke(InjectorImpl.java:264) + at org.eclipse.e4.core.contexts.ContextInjectionFactory.invoke(ContextInjectionFactory.java:132) + at org.eclipse.e4.core.commands.internal.HandlerServiceHandler.execute(HandlerServiceHandler.java:152) + at org.eclipse.core.commands.Command.executeWithChecks(Command.java:494) + at org.eclipse.core.commands.ParameterizedCommand.executeWithChecks(ParameterizedCommand.java:488) + at org.eclipse.e4.core.commands.internal.HandlerServiceImpl.executeHandler(HandlerServiceImpl.java:210) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.executeCommand(KeyBindingDispatcher.java:286) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.press(KeyBindingDispatcher.java:507) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.processKeyEvent(KeyBindingDispatcher.java:558) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.filterKeySequenceBindings(KeyBindingDispatcher.java:378) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.access$0(KeyBindingDispatcher.java:324) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher$KeyDownFilter.handleEvent(KeyBindingDispatcher.java:86) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.filterEvent(Display.java:1270) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1078) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1103) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1088) + at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1130) + at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1126) + at org.eclipse.swt.widgets.Widget.wmChar(Widget.java:1547) + at org.eclipse.swt.widgets.Control.WM_CHAR(Control.java:4918) + at org.eclipse.swt.widgets.Canvas.WM_CHAR(Canvas.java:364) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4799) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2552) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3822) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) + +!ENTRY org.eclipse.cdt.ui 4 4 2017-09-12 12:37:54.202 +!MESSAGE Error +!STACK 0 +org.eclipse.jface.text.BadLocationException + at org.eclipse.jface.text.AbstractDocument.get(AbstractDocument.java:964) + at org.eclipse.core.internal.filebuffers.SynchronizableDocument.get(SynchronizableDocument.java:127) + at org.eclipse.cdt.internal.ui.text.LineComparator.getHash(LineComparator.java:84) + at org.eclipse.cdt.internal.ui.text.LineComparator.rangesEqual(LineComparator.java:60) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.compactAndShiftLCS(RangeComparatorLCS.java:169) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.longestCommonSubsequence(RangeComparatorLCS.java:189) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.findDifferences(RangeComparatorLCS.java:31) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:98) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:82) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:67) + at org.eclipse.cdt.internal.ui.util.EditorUtility$1.getChangedLineRegions(EditorUtility.java:948) + at org.eclipse.cdt.internal.ui.util.EditorUtility$1.run(EditorUtility.java:924) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.cdt.internal.ui.util.EditorUtility.calculateChangedLineRegions(EditorUtility.java:899) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider.performSaveActions(CDocumentProvider.java:970) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider.commitWorkingCopy(CDocumentProvider.java:887) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider$2.execute(CDocumentProvider.java:919) + at org.eclipse.ui.editors.text.TextFileDocumentProvider$DocumentProviderOperation.run(TextFileDocumentProvider.java:130) + at org.eclipse.ui.actions.WorkspaceModifyDelegatingOperation.execute(WorkspaceModifyDelegatingOperation.java:67) + at org.eclipse.ui.actions.WorkspaceModifyOperation.lambda$0(WorkspaceModifyOperation.java:107) + at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2240) + at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2267) + at org.eclipse.ui.actions.WorkspaceModifyOperation.run(WorkspaceModifyOperation.java:128) + at org.eclipse.ui.internal.editors.text.WorkspaceOperationRunner.run(WorkspaceOperationRunner.java:73) + at org.eclipse.ui.internal.editors.text.WorkspaceOperationRunner.run(WorkspaceOperationRunner.java:63) + at org.eclipse.ui.editors.text.TextFileDocumentProvider.executeOperation(TextFileDocumentProvider.java:458) + at org.eclipse.ui.editors.text.TextFileDocumentProvider.saveDocument(TextFileDocumentProvider.java:761) + at org.eclipse.ui.texteditor.AbstractTextEditor.performSave(AbstractTextEditor.java:5025) + at org.eclipse.ui.texteditor.AbstractTextEditor.doSave(AbstractTextEditor.java:4820) + at org.eclipse.ui.texteditor.AbstractTextEditor$TextEditorSavable.doSave(AbstractTextEditor.java:7117) + at org.eclipse.ui.Saveable.doSave(Saveable.java:220) + at org.eclipse.ui.internal.SaveableHelper.doSaveModel(SaveableHelper.java:358) + at org.eclipse.ui.internal.SaveableHelper$3.run(SaveableHelper.java:202) + at org.eclipse.ui.internal.SaveableHelper$5.run(SaveableHelper.java:286) + at org.eclipse.jface.operation.ModalContext.runInCurrentThread(ModalContext.java:437) + at org.eclipse.jface.operation.ModalContext.run(ModalContext.java:353) + at org.eclipse.ui.internal.WorkbenchWindow$14.run(WorkbenchWindow.java:2184) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70) + at org.eclipse.ui.internal.WorkbenchWindow.run(WorkbenchWindow.java:2180) + at org.eclipse.ui.internal.SaveableHelper.runProgressMonitorOperation(SaveableHelper.java:294) + at org.eclipse.ui.internal.SaveableHelper.runProgressMonitorOperation(SaveableHelper.java:272) + at org.eclipse.ui.internal.SaveableHelper.saveModels(SaveableHelper.java:214) + at org.eclipse.ui.internal.SaveableHelper.savePart(SaveableHelper.java:149) + at org.eclipse.ui.internal.WorkbenchPage.saveSaveable(WorkbenchPage.java:3904) + at org.eclipse.ui.internal.WorkbenchPage.saveEditor(WorkbenchPage.java:3918) + at org.eclipse.ui.internal.handlers.SaveHandler.execute(SaveHandler.java:54) + at org.eclipse.ui.internal.handlers.HandlerProxy.execute(HandlerProxy.java:295) + at org.eclipse.ui.internal.handlers.E4HandlerProxy.execute(E4HandlerProxy.java:90) + at sun.reflect.GeneratedMethodAccessor53.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55) + at org.eclipse.e4.core.internal.di.InjectorImpl.invokeUsingClass(InjectorImpl.java:282) + at org.eclipse.e4.core.internal.di.InjectorImpl.invoke(InjectorImpl.java:264) + at org.eclipse.e4.core.contexts.ContextInjectionFactory.invoke(ContextInjectionFactory.java:132) + at org.eclipse.e4.core.commands.internal.HandlerServiceHandler.execute(HandlerServiceHandler.java:152) + at org.eclipse.core.commands.Command.executeWithChecks(Command.java:494) + at org.eclipse.core.commands.ParameterizedCommand.executeWithChecks(ParameterizedCommand.java:488) + at org.eclipse.e4.core.commands.internal.HandlerServiceImpl.executeHandler(HandlerServiceImpl.java:210) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.executeCommand(KeyBindingDispatcher.java:286) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.press(KeyBindingDispatcher.java:507) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.processKeyEvent(KeyBindingDispatcher.java:558) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.filterKeySequenceBindings(KeyBindingDispatcher.java:378) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.access$0(KeyBindingDispatcher.java:324) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher$KeyDownFilter.handleEvent(KeyBindingDispatcher.java:86) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.filterEvent(Display.java:1270) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1078) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1103) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1088) + at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1130) + at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1126) + at org.eclipse.swt.widgets.Widget.wmChar(Widget.java:1547) + at org.eclipse.swt.widgets.Control.WM_CHAR(Control.java:4918) + at org.eclipse.swt.widgets.Canvas.WM_CHAR(Canvas.java:364) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4799) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2552) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3822) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:37:54.243 +!MESSAGE Unhandled event loop exception +!STACK 0 +org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.IllegalStateException: startLine (46) does not match endLine (45)) + at org.eclipse.swt.SWT.error(SWT.java:4533) + at org.eclipse.swt.SWT.error(SWT.java:4448) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:185) + at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4211) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3827) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) +Caused by: java.lang.IllegalStateException: startLine (46) does not match endLine (45) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.text.source.LineNumberRulerColumn$1.run(LineNumberRulerColumn.java:417) + at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:182) + ... 23 more + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:37:54.824 +!MESSAGE Unhandled event loop exception +!STACK 0 +org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.IllegalStateException: startLine (46) does not match endLine (45)) + at org.eclipse.swt.SWT.error(SWT.java:4533) + at org.eclipse.swt.SWT.error(SWT.java:4448) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:185) + at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4211) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3827) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) +Caused by: java.lang.IllegalStateException: startLine (46) does not match endLine (45) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.internal.text.source.DiffPainter.redraw(DiffPainter.java:379) + at org.eclipse.jface.internal.text.source.DiffPainter.access$2(DiffPainter.java:378) + at org.eclipse.jface.internal.text.source.DiffPainter$2.run(DiffPainter.java:368) + at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:182) + ... 23 more + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:37:54.828 +!MESSAGE Unhandled event loop exception +!STACK 0 +org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.IllegalStateException: startLine (46) does not match endLine (45)) + at org.eclipse.swt.SWT.error(SWT.java:4533) + at org.eclipse.swt.SWT.error(SWT.java:4448) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:185) + at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4211) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3827) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) +Caused by: java.lang.IllegalStateException: startLine (46) does not match endLine (45) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.text.source.LineNumberRulerColumn$1.run(LineNumberRulerColumn.java:417) + at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:182) + ... 23 more + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:37:54.877 +!MESSAGE Unhandled event loop exception +!STACK 0 +org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.IllegalStateException: startLine (46) does not match endLine (45)) + at org.eclipse.swt.SWT.error(SWT.java:4533) + at org.eclipse.swt.SWT.error(SWT.java:4448) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:185) + at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4211) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3827) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) +Caused by: java.lang.IllegalStateException: startLine (46) does not match endLine (45) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.text.source.LineNumberRulerColumn$1.run(LineNumberRulerColumn.java:417) + at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:182) + ... 23 more + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:41:36.958 +!MESSAGE Unhandled event loop exception +!STACK 0 +java.lang.IllegalStateException: startLine (46) does not match endLine (45) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.access$10(LineNumberRulerColumn.java:675) + at org.eclipse.jface.text.source.LineNumberRulerColumn$4.paintControl(LineNumberRulerColumn.java:617) + at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:231) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4418) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1079) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1103) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1088) + at org.eclipse.swt.widgets.Composite.WM_PAINT(Composite.java:1688) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4856) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5123) + at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2552) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3822) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:41:37.629 +!MESSAGE Unhandled event loop exception +!STACK 0 +java.lang.IllegalStateException: startLine (46) does not match endLine (45) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.text.source.LineNumberRulerColumn$InternalListener.viewportChanged(LineNumberRulerColumn.java:76) + at org.eclipse.jface.text.TextViewer.updateViewportListeners(TextViewer.java:2977) + at org.eclipse.jface.text.TextViewer$ViewportGuard.widgetSelected(TextViewer.java:326) + at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:249) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4418) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1079) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1103) + at org.eclipse.swt.widgets.Widget.sendSelectionEvent(Widget.java:1120) + at org.eclipse.swt.widgets.ScrollBar.wmScrollChild(ScrollBar.java:1079) + at org.eclipse.swt.widgets.Scrollable.wmScroll(Scrollable.java:580) + at org.eclipse.swt.widgets.Scrollable.WM_VSCROLL(Scrollable.java:385) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4886) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.SendMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.SendMessage(OS.java:3305) + at org.eclipse.swt.widgets.Scrollable.wmScrollWheel(Scrollable.java:480) + at org.eclipse.swt.widgets.Scrollable.WM_MOUSEWHEEL(Scrollable.java:361) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4847) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2552) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3822) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:41:37.654 +!MESSAGE Unhandled event loop exception +!STACK 0 +java.lang.IllegalStateException: startLine (46) does not match endLine (45) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.text.source.LineNumberRulerColumn$InternalListener.viewportChanged(LineNumberRulerColumn.java:76) + at org.eclipse.jface.text.TextViewer.updateViewportListeners(TextViewer.java:2977) + at org.eclipse.jface.text.TextViewer$ViewportGuard.widgetSelected(TextViewer.java:326) + at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:249) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4418) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1079) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1103) + at org.eclipse.swt.widgets.Widget.sendSelectionEvent(Widget.java:1120) + at org.eclipse.swt.widgets.ScrollBar.wmScrollChild(ScrollBar.java:1079) + at org.eclipse.swt.widgets.Scrollable.wmScroll(Scrollable.java:580) + at org.eclipse.swt.widgets.Scrollable.WM_VSCROLL(Scrollable.java:385) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4886) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.SendMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.SendMessage(OS.java:3305) + at org.eclipse.swt.widgets.Scrollable.wmScrollWheel(Scrollable.java:480) + at org.eclipse.swt.widgets.Scrollable.WM_MOUSEWHEEL(Scrollable.java:361) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4847) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2552) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3822) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:41:37.677 +!MESSAGE Unhandled event loop exception +!STACK 0 +java.lang.IllegalStateException: startLine (46) does not match endLine (45) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.text.source.LineNumberRulerColumn$InternalListener.viewportChanged(LineNumberRulerColumn.java:76) + at org.eclipse.jface.text.TextViewer.updateViewportListeners(TextViewer.java:2977) + at org.eclipse.jface.text.TextViewer$ViewportGuard.widgetSelected(TextViewer.java:326) + at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:249) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4418) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1079) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1103) + at org.eclipse.swt.widgets.Widget.sendSelectionEvent(Widget.java:1120) + at org.eclipse.swt.widgets.ScrollBar.wmScrollChild(ScrollBar.java:1079) + at org.eclipse.swt.widgets.Scrollable.wmScroll(Scrollable.java:580) + at org.eclipse.swt.widgets.Scrollable.WM_VSCROLL(Scrollable.java:385) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4886) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.SendMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.SendMessage(OS.java:3305) + at org.eclipse.swt.widgets.Scrollable.wmScrollWheel(Scrollable.java:480) + at org.eclipse.swt.widgets.Scrollable.WM_MOUSEWHEEL(Scrollable.java:361) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4847) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2552) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3822) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:41:37.702 +!MESSAGE Unhandled event loop exception +!STACK 0 +java.lang.IllegalStateException: startLine (46) does not match endLine (45) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.text.source.LineNumberRulerColumn$InternalListener.viewportChanged(LineNumberRulerColumn.java:76) + at org.eclipse.jface.text.TextViewer.updateViewportListeners(TextViewer.java:2977) + at org.eclipse.jface.text.TextViewer$ViewportGuard.widgetSelected(TextViewer.java:326) + at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:249) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4418) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1079) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1103) + at org.eclipse.swt.widgets.Widget.sendSelectionEvent(Widget.java:1120) + at org.eclipse.swt.widgets.ScrollBar.wmScrollChild(ScrollBar.java:1079) + at org.eclipse.swt.widgets.Scrollable.wmScroll(Scrollable.java:580) + at org.eclipse.swt.widgets.Scrollable.WM_VSCROLL(Scrollable.java:385) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4886) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.SendMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.SendMessage(OS.java:3305) + at org.eclipse.swt.widgets.Scrollable.wmScrollWheel(Scrollable.java:480) + at org.eclipse.swt.widgets.Scrollable.WM_MOUSEWHEEL(Scrollable.java:361) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4847) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2552) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3822) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:41:37.733 +!MESSAGE Unhandled event loop exception +!STACK 0 +java.lang.IllegalStateException: startLine (46) does not match endLine (45) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.text.source.LineNumberRulerColumn$InternalListener.viewportChanged(LineNumberRulerColumn.java:76) + at org.eclipse.jface.text.TextViewer.updateViewportListeners(TextViewer.java:2977) + at org.eclipse.jface.text.TextViewer$ViewportGuard.widgetSelected(TextViewer.java:326) + at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:249) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4418) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1079) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1103) + at org.eclipse.swt.widgets.Widget.sendSelectionEvent(Widget.java:1120) + at org.eclipse.swt.widgets.ScrollBar.wmScrollChild(ScrollBar.java:1079) + at org.eclipse.swt.widgets.Scrollable.wmScroll(Scrollable.java:580) + at org.eclipse.swt.widgets.Scrollable.WM_VSCROLL(Scrollable.java:385) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4886) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.SendMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.SendMessage(OS.java:3305) + at org.eclipse.swt.widgets.Scrollable.wmScrollWheel(Scrollable.java:480) + at org.eclipse.swt.widgets.Scrollable.WM_MOUSEWHEEL(Scrollable.java:361) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4847) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2552) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3822) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:41:38.009 +!MESSAGE Unhandled event loop exception +!STACK 0 +org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.IllegalStateException: startLine (46) does not match endLine (45)) + at org.eclipse.swt.SWT.error(SWT.java:4533) + at org.eclipse.swt.SWT.error(SWT.java:4448) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:185) + at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4211) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3827) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) +Caused by: java.lang.IllegalStateException: startLine (46) does not match endLine (45) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.text.source.LineNumberRulerColumn$1.run(LineNumberRulerColumn.java:417) + at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:182) + ... 23 more + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:41:48.947 +!MESSAGE Unhandled event loop exception +!STACK 0 +java.lang.IllegalStateException: startLine (46) does not match endLine (45) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.access$10(LineNumberRulerColumn.java:675) + at org.eclipse.jface.text.source.LineNumberRulerColumn$4.paintControl(LineNumberRulerColumn.java:617) + at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:231) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4418) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1079) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1103) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1088) + at org.eclipse.swt.widgets.Composite.WM_PAINT(Composite.java:1688) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4856) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5123) + at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2552) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3822) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:42:12.274 +!MESSAGE Unhandled event loop exception +!STACK 0 +java.lang.IllegalStateException: startLine (46) does not match endLine (45) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.access$10(LineNumberRulerColumn.java:675) + at org.eclipse.jface.text.source.LineNumberRulerColumn$4.paintControl(LineNumberRulerColumn.java:617) + at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:231) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4418) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1079) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1103) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1088) + at org.eclipse.swt.widgets.Composite.WM_PAINT(Composite.java:1688) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4856) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5123) + at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2552) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3822) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:42:17.361 +!MESSAGE Unhandled event loop exception +!STACK 0 +org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.IllegalStateException: startLine (46) does not match endLine (45)) + at org.eclipse.swt.SWT.error(SWT.java:4533) + at org.eclipse.swt.SWT.error(SWT.java:4448) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:185) + at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4211) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3827) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) +Caused by: java.lang.IllegalStateException: startLine (46) does not match endLine (45) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.text.source.LineNumberRulerColumn$1.run(LineNumberRulerColumn.java:417) + at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:182) + ... 23 more + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:42:21.062 +!MESSAGE Unhandled event loop exception +!STACK 0 +java.lang.IllegalStateException: startLine (46) does not match endLine (45) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.access$10(LineNumberRulerColumn.java:675) + at org.eclipse.jface.text.source.LineNumberRulerColumn$4.paintControl(LineNumberRulerColumn.java:617) + at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:231) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4418) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1079) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1103) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1088) + at org.eclipse.swt.widgets.Composite.WM_PAINT(Composite.java:1688) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4856) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5123) + at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2552) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3822) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:42:22.055 +!MESSAGE Unhandled event loop exception +!STACK 0 +org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.IllegalStateException: startLine (46) does not match endLine (45)) + at org.eclipse.swt.SWT.error(SWT.java:4533) + at org.eclipse.swt.SWT.error(SWT.java:4448) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:185) + at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4211) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3827) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) +Caused by: java.lang.IllegalStateException: startLine (46) does not match endLine (45) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.text.source.LineNumberRulerColumn$1.run(LineNumberRulerColumn.java:417) + at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:182) + ... 23 more + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:42:24.427 +!MESSAGE Unhandled event loop exception +!STACK 0 +java.lang.IllegalStateException: startLine (46) does not match endLine (45) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.access$10(LineNumberRulerColumn.java:675) + at org.eclipse.jface.text.source.LineNumberRulerColumn$4.paintControl(LineNumberRulerColumn.java:617) + at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:231) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4418) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1079) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1103) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1088) + at org.eclipse.swt.widgets.Composite.WM_PAINT(Composite.java:1688) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4856) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5123) + at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2552) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3822) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:42:27.445 +!MESSAGE Unhandled event loop exception +!STACK 0 +org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.IllegalStateException: startLine (46) does not match endLine (45)) + at org.eclipse.swt.SWT.error(SWT.java:4533) + at org.eclipse.swt.SWT.error(SWT.java:4448) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:185) + at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4211) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3827) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) +Caused by: java.lang.IllegalStateException: startLine (46) does not match endLine (45) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.text.source.LineNumberRulerColumn$1.run(LineNumberRulerColumn.java:417) + at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:182) + ... 23 more + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:42:28.566 +!MESSAGE Unhandled event loop exception +!STACK 0 +org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.IllegalStateException: startLine (46) does not match endLine (45)) + at org.eclipse.swt.SWT.error(SWT.java:4533) + at org.eclipse.swt.SWT.error(SWT.java:4448) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:185) + at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4211) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3827) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) +Caused by: java.lang.IllegalStateException: startLine (46) does not match endLine (45) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.text.source.LineNumberRulerColumn$1.run(LineNumberRulerColumn.java:417) + at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:182) + ... 23 more + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:42:53.093 +!MESSAGE Unhandled event loop exception +!STACK 0 +org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.IllegalStateException: startLine (46) does not match endLine (45)) + at org.eclipse.swt.SWT.error(SWT.java:4533) + at org.eclipse.swt.SWT.error(SWT.java:4448) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:185) + at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4211) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3827) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) +Caused by: java.lang.IllegalStateException: startLine (46) does not match endLine (45) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.text.source.LineNumberRulerColumn$1.run(LineNumberRulerColumn.java:417) + at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:182) + ... 23 more + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:42:53.188 +!MESSAGE Unhandled event loop exception +!STACK 0 +java.lang.IllegalStateException: startLine (46) does not match endLine (45) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.access$10(LineNumberRulerColumn.java:675) + at org.eclipse.jface.text.source.LineNumberRulerColumn$4.paintControl(LineNumberRulerColumn.java:617) + at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:231) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4418) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1079) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1103) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1088) + at org.eclipse.swt.widgets.Composite.WM_PAINT(Composite.java:1688) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4856) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5123) + at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2552) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3822) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:42:53.515 +!MESSAGE Unhandled event loop exception +!STACK 0 +java.lang.IllegalStateException: startLine (46) does not match endLine (45) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.text.source.LineNumberRulerColumn$InternalListener.viewportChanged(LineNumberRulerColumn.java:76) + at org.eclipse.jface.text.TextViewer.updateViewportListeners(TextViewer.java:2977) + at org.eclipse.jface.text.TextViewer$ViewportGuard.widgetSelected(TextViewer.java:326) + at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:249) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4418) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1079) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1103) + at org.eclipse.swt.widgets.Widget.sendSelectionEvent(Widget.java:1120) + at org.eclipse.swt.widgets.ScrollBar.wmScrollChild(ScrollBar.java:1079) + at org.eclipse.swt.widgets.Scrollable.wmScroll(Scrollable.java:580) + at org.eclipse.swt.widgets.Scrollable.WM_VSCROLL(Scrollable.java:385) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4886) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.SendMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.SendMessage(OS.java:3305) + at org.eclipse.swt.widgets.Scrollable.wmScrollWheel(Scrollable.java:480) + at org.eclipse.swt.widgets.Scrollable.WM_MOUSEWHEEL(Scrollable.java:361) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4847) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2552) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3822) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:42:53.547 +!MESSAGE Unhandled event loop exception +!STACK 0 +java.lang.IllegalStateException: startLine (46) does not match endLine (45) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.text.source.LineNumberRulerColumn$InternalListener.viewportChanged(LineNumberRulerColumn.java:76) + at org.eclipse.jface.text.TextViewer.updateViewportListeners(TextViewer.java:2977) + at org.eclipse.jface.text.TextViewer$ViewportGuard.widgetSelected(TextViewer.java:326) + at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:249) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4418) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1079) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1103) + at org.eclipse.swt.widgets.Widget.sendSelectionEvent(Widget.java:1120) + at org.eclipse.swt.widgets.ScrollBar.wmScrollChild(ScrollBar.java:1079) + at org.eclipse.swt.widgets.Scrollable.wmScroll(Scrollable.java:580) + at org.eclipse.swt.widgets.Scrollable.WM_VSCROLL(Scrollable.java:385) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4886) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.SendMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.SendMessage(OS.java:3305) + at org.eclipse.swt.widgets.Scrollable.wmScrollWheel(Scrollable.java:480) + at org.eclipse.swt.widgets.Scrollable.WM_MOUSEWHEEL(Scrollable.java:361) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4847) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2552) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3822) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:42:53.580 +!MESSAGE Unhandled event loop exception +!STACK 0 +java.lang.IllegalStateException: startLine (46) does not match endLine (45) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.text.source.LineNumberRulerColumn$InternalListener.viewportChanged(LineNumberRulerColumn.java:76) + at org.eclipse.jface.text.TextViewer.updateViewportListeners(TextViewer.java:2977) + at org.eclipse.jface.text.TextViewer$ViewportGuard.widgetSelected(TextViewer.java:326) + at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:249) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4418) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1079) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1103) + at org.eclipse.swt.widgets.Widget.sendSelectionEvent(Widget.java:1120) + at org.eclipse.swt.widgets.ScrollBar.wmScrollChild(ScrollBar.java:1079) + at org.eclipse.swt.widgets.Scrollable.wmScroll(Scrollable.java:580) + at org.eclipse.swt.widgets.Scrollable.WM_VSCROLL(Scrollable.java:385) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4886) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.SendMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.SendMessage(OS.java:3305) + at org.eclipse.swt.widgets.Scrollable.wmScrollWheel(Scrollable.java:480) + at org.eclipse.swt.widgets.Scrollable.WM_MOUSEWHEEL(Scrollable.java:361) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4847) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2552) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3822) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:42:53.619 +!MESSAGE Unhandled event loop exception +!STACK 0 +java.lang.IllegalStateException: startLine (46) does not match endLine (45) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.text.source.LineNumberRulerColumn$InternalListener.viewportChanged(LineNumberRulerColumn.java:76) + at org.eclipse.jface.text.TextViewer.updateViewportListeners(TextViewer.java:2977) + at org.eclipse.jface.text.TextViewer$ViewportGuard.widgetSelected(TextViewer.java:326) + at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:249) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4418) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1079) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1103) + at org.eclipse.swt.widgets.Widget.sendSelectionEvent(Widget.java:1120) + at org.eclipse.swt.widgets.ScrollBar.wmScrollChild(ScrollBar.java:1079) + at org.eclipse.swt.widgets.Scrollable.wmScroll(Scrollable.java:580) + at org.eclipse.swt.widgets.Scrollable.WM_VSCROLL(Scrollable.java:385) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4886) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.SendMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.SendMessage(OS.java:3305) + at org.eclipse.swt.widgets.Scrollable.wmScrollWheel(Scrollable.java:480) + at org.eclipse.swt.widgets.Scrollable.WM_MOUSEWHEEL(Scrollable.java:361) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4847) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2552) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3822) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:42:53.659 +!MESSAGE Unhandled event loop exception +!STACK 0 +java.lang.IllegalStateException: startLine (46) does not match endLine (45) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.text.source.LineNumberRulerColumn$InternalListener.viewportChanged(LineNumberRulerColumn.java:76) + at org.eclipse.jface.text.TextViewer.updateViewportListeners(TextViewer.java:2977) + at org.eclipse.jface.text.TextViewer$ViewportGuard.widgetSelected(TextViewer.java:326) + at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:249) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4418) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1079) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1103) + at org.eclipse.swt.widgets.Widget.sendSelectionEvent(Widget.java:1120) + at org.eclipse.swt.widgets.ScrollBar.wmScrollChild(ScrollBar.java:1079) + at org.eclipse.swt.widgets.Scrollable.wmScroll(Scrollable.java:580) + at org.eclipse.swt.widgets.Scrollable.WM_VSCROLL(Scrollable.java:385) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4886) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.SendMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.SendMessage(OS.java:3305) + at org.eclipse.swt.widgets.Scrollable.wmScrollWheel(Scrollable.java:480) + at org.eclipse.swt.widgets.Scrollable.WM_MOUSEWHEEL(Scrollable.java:361) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4847) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2552) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3822) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:42:54.011 +!MESSAGE Unhandled event loop exception +!STACK 0 +java.lang.IllegalStateException: startLine (46) does not match endLine (45) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.text.source.LineNumberRulerColumn$InternalListener.viewportChanged(LineNumberRulerColumn.java:76) + at org.eclipse.jface.text.TextViewer.updateViewportListeners(TextViewer.java:2977) + at org.eclipse.jface.text.TextViewer$ViewportGuard.widgetSelected(TextViewer.java:326) + at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:249) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4418) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1079) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1103) + at org.eclipse.swt.widgets.Widget.sendSelectionEvent(Widget.java:1120) + at org.eclipse.swt.widgets.ScrollBar.wmScrollChild(ScrollBar.java:1079) + at org.eclipse.swt.widgets.Scrollable.wmScroll(Scrollable.java:580) + at org.eclipse.swt.widgets.Scrollable.WM_VSCROLL(Scrollable.java:385) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4886) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.SendMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.SendMessage(OS.java:3305) + at org.eclipse.swt.widgets.Scrollable.wmScrollWheel(Scrollable.java:480) + at org.eclipse.swt.widgets.Scrollable.WM_MOUSEWHEEL(Scrollable.java:361) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4847) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2552) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3822) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:42:54.038 +!MESSAGE Unhandled event loop exception +!STACK 0 +java.lang.IllegalStateException: startLine (46) does not match endLine (45) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.text.source.LineNumberRulerColumn$InternalListener.viewportChanged(LineNumberRulerColumn.java:76) + at org.eclipse.jface.text.TextViewer.updateViewportListeners(TextViewer.java:2977) + at org.eclipse.jface.text.TextViewer$ViewportGuard.widgetSelected(TextViewer.java:326) + at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:249) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4418) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1079) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1103) + at org.eclipse.swt.widgets.Widget.sendSelectionEvent(Widget.java:1120) + at org.eclipse.swt.widgets.ScrollBar.wmScrollChild(ScrollBar.java:1079) + at org.eclipse.swt.widgets.Scrollable.wmScroll(Scrollable.java:580) + at org.eclipse.swt.widgets.Scrollable.WM_VSCROLL(Scrollable.java:385) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4886) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.SendMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.SendMessage(OS.java:3305) + at org.eclipse.swt.widgets.Scrollable.wmScrollWheel(Scrollable.java:480) + at org.eclipse.swt.widgets.Scrollable.WM_MOUSEWHEEL(Scrollable.java:361) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4847) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2552) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3822) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:42:54.060 +!MESSAGE Unhandled event loop exception +!STACK 0 +java.lang.IllegalStateException: startLine (46) does not match endLine (45) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.text.source.LineNumberRulerColumn$InternalListener.viewportChanged(LineNumberRulerColumn.java:76) + at org.eclipse.jface.text.TextViewer.updateViewportListeners(TextViewer.java:2977) + at org.eclipse.jface.text.TextViewer$ViewportGuard.widgetSelected(TextViewer.java:326) + at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:249) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4418) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1079) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1103) + at org.eclipse.swt.widgets.Widget.sendSelectionEvent(Widget.java:1120) + at org.eclipse.swt.widgets.ScrollBar.wmScrollChild(ScrollBar.java:1079) + at org.eclipse.swt.widgets.Scrollable.wmScroll(Scrollable.java:580) + at org.eclipse.swt.widgets.Scrollable.WM_VSCROLL(Scrollable.java:385) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4886) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.SendMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.SendMessage(OS.java:3305) + at org.eclipse.swt.widgets.Scrollable.wmScrollWheel(Scrollable.java:480) + at org.eclipse.swt.widgets.Scrollable.WM_MOUSEWHEEL(Scrollable.java:361) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4847) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2552) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3822) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:42:54.083 +!MESSAGE Unhandled event loop exception +!STACK 0 +java.lang.IllegalStateException: startLine (46) does not match endLine (45) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.text.source.LineNumberRulerColumn$InternalListener.viewportChanged(LineNumberRulerColumn.java:76) + at org.eclipse.jface.text.TextViewer.updateViewportListeners(TextViewer.java:2977) + at org.eclipse.jface.text.TextViewer$ViewportGuard.widgetSelected(TextViewer.java:326) + at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:249) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4418) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1079) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1103) + at org.eclipse.swt.widgets.Widget.sendSelectionEvent(Widget.java:1120) + at org.eclipse.swt.widgets.ScrollBar.wmScrollChild(ScrollBar.java:1079) + at org.eclipse.swt.widgets.Scrollable.wmScroll(Scrollable.java:580) + at org.eclipse.swt.widgets.Scrollable.WM_VSCROLL(Scrollable.java:385) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4886) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.SendMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.SendMessage(OS.java:3305) + at org.eclipse.swt.widgets.Scrollable.wmScrollWheel(Scrollable.java:480) + at org.eclipse.swt.widgets.Scrollable.WM_MOUSEWHEEL(Scrollable.java:361) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4847) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2552) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3822) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:42:58.530 +!MESSAGE Unhandled event loop exception +!STACK 0 +org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.IllegalStateException: startLine (47) does not match endLine (46)) + at org.eclipse.swt.SWT.error(SWT.java:4533) + at org.eclipse.swt.SWT.error(SWT.java:4448) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:185) + at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4211) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3827) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) +Caused by: java.lang.IllegalStateException: startLine (47) does not match endLine (46) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.internal.text.source.DiffPainter.redraw(DiffPainter.java:379) + at org.eclipse.jface.internal.text.source.DiffPainter.access$2(DiffPainter.java:378) + at org.eclipse.jface.internal.text.source.DiffPainter$2.run(DiffPainter.java:368) + at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:182) + ... 23 more + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:42:58.943 +!MESSAGE Unhandled event loop exception +!STACK 0 +org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.IllegalStateException: startLine (47) does not match endLine (46)) + at org.eclipse.swt.SWT.error(SWT.java:4533) + at org.eclipse.swt.SWT.error(SWT.java:4448) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:185) + at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4211) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3827) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) +Caused by: java.lang.IllegalStateException: startLine (47) does not match endLine (46) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.internal.text.source.DiffPainter.redraw(DiffPainter.java:379) + at org.eclipse.jface.internal.text.source.DiffPainter.access$2(DiffPainter.java:378) + at org.eclipse.jface.internal.text.source.DiffPainter$2.run(DiffPainter.java:368) + at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:182) + ... 23 more + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:43:00.610 +!MESSAGE Unhandled event loop exception +!STACK 0 +org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.IllegalStateException: startLine (47) does not match endLine (46)) + at org.eclipse.swt.SWT.error(SWT.java:4533) + at org.eclipse.swt.SWT.error(SWT.java:4448) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:185) + at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4211) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3827) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) +Caused by: java.lang.IllegalStateException: startLine (47) does not match endLine (46) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.text.source.LineNumberRulerColumn$1.run(LineNumberRulerColumn.java:417) + at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:182) + ... 23 more + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:43:01.308 +!MESSAGE Unhandled event loop exception +!STACK 0 +org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.IllegalStateException: startLine (47) does not match endLine (46)) + at org.eclipse.swt.SWT.error(SWT.java:4533) + at org.eclipse.swt.SWT.error(SWT.java:4448) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:185) + at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4211) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3827) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) +Caused by: java.lang.IllegalStateException: startLine (47) does not match endLine (46) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.text.source.LineNumberRulerColumn$1.run(LineNumberRulerColumn.java:417) + at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:182) + ... 23 more + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:43:04.620 +!MESSAGE Unhandled event loop exception +!STACK 0 +org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.IllegalStateException: startLine (47) does not match endLine (46)) + at org.eclipse.swt.SWT.error(SWT.java:4533) + at org.eclipse.swt.SWT.error(SWT.java:4448) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:185) + at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4211) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3827) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) +Caused by: java.lang.IllegalStateException: startLine (47) does not match endLine (46) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.text.source.LineNumberRulerColumn$1.run(LineNumberRulerColumn.java:417) + at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:182) + ... 23 more + +!ENTRY org.eclipse.cdt.ui 4 4 2017-09-12 12:43:05.120 +!MESSAGE Error +!STACK 0 +org.eclipse.jface.text.BadLocationException + at org.eclipse.jface.text.AbstractDocument.get(AbstractDocument.java:964) + at org.eclipse.core.internal.filebuffers.SynchronizableDocument.get(SynchronizableDocument.java:127) + at org.eclipse.cdt.internal.ui.text.LineComparator.getHash(LineComparator.java:84) + at org.eclipse.cdt.internal.ui.text.LineComparator.rangesEqual(LineComparator.java:60) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.isRangeEqual(RangeComparatorLCS.java:57) + at org.eclipse.compare.internal.core.LCS.longestCommonSubsequence(LCS.java:80) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.longestCommonSubsequence(RangeComparatorLCS.java:186) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.findDifferences(RangeComparatorLCS.java:31) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:98) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:82) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:67) + at org.eclipse.cdt.internal.ui.util.EditorUtility$1.getChangedLineRegions(EditorUtility.java:948) + at org.eclipse.cdt.internal.ui.util.EditorUtility$1.run(EditorUtility.java:924) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.cdt.internal.ui.util.EditorUtility.calculateChangedLineRegions(EditorUtility.java:899) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider.performSaveActions(CDocumentProvider.java:970) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider.commitWorkingCopy(CDocumentProvider.java:887) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider$2.execute(CDocumentProvider.java:919) + at org.eclipse.ui.editors.text.TextFileDocumentProvider$DocumentProviderOperation.run(TextFileDocumentProvider.java:130) + at org.eclipse.ui.actions.WorkspaceModifyDelegatingOperation.execute(WorkspaceModifyDelegatingOperation.java:67) + at org.eclipse.ui.actions.WorkspaceModifyOperation.lambda$0(WorkspaceModifyOperation.java:107) + at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2240) + at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2267) + at org.eclipse.ui.actions.WorkspaceModifyOperation.run(WorkspaceModifyOperation.java:128) + at org.eclipse.ui.internal.editors.text.WorkspaceOperationRunner.run(WorkspaceOperationRunner.java:73) + at org.eclipse.ui.internal.editors.text.WorkspaceOperationRunner.run(WorkspaceOperationRunner.java:63) + at org.eclipse.ui.editors.text.TextFileDocumentProvider.executeOperation(TextFileDocumentProvider.java:458) + at org.eclipse.ui.editors.text.TextFileDocumentProvider.saveDocument(TextFileDocumentProvider.java:761) + at org.eclipse.ui.texteditor.AbstractTextEditor.performSave(AbstractTextEditor.java:5025) + at org.eclipse.ui.texteditor.AbstractTextEditor.doSave(AbstractTextEditor.java:4820) + at org.eclipse.ui.texteditor.AbstractTextEditor$TextEditorSavable.doSave(AbstractTextEditor.java:7117) + at org.eclipse.ui.Saveable.doSave(Saveable.java:220) + at org.eclipse.ui.internal.SaveableHelper.doSaveModel(SaveableHelper.java:358) + at org.eclipse.ui.internal.SaveableHelper$3.run(SaveableHelper.java:202) + at org.eclipse.ui.internal.SaveableHelper$5.run(SaveableHelper.java:286) + at org.eclipse.jface.operation.ModalContext.runInCurrentThread(ModalContext.java:437) + at org.eclipse.jface.operation.ModalContext.run(ModalContext.java:353) + at org.eclipse.ui.internal.WorkbenchWindow$14.run(WorkbenchWindow.java:2184) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70) + at org.eclipse.ui.internal.WorkbenchWindow.run(WorkbenchWindow.java:2180) + at org.eclipse.ui.internal.SaveableHelper.runProgressMonitorOperation(SaveableHelper.java:294) + at org.eclipse.ui.internal.SaveableHelper.runProgressMonitorOperation(SaveableHelper.java:272) + at org.eclipse.ui.internal.SaveableHelper.saveModels(SaveableHelper.java:214) + at org.eclipse.ui.internal.SaveableHelper.savePart(SaveableHelper.java:149) + at org.eclipse.ui.internal.WorkbenchPage.saveSaveable(WorkbenchPage.java:3904) + at org.eclipse.ui.internal.WorkbenchPage.saveEditor(WorkbenchPage.java:3918) + at org.eclipse.ui.internal.handlers.SaveHandler.execute(SaveHandler.java:54) + at org.eclipse.ui.internal.handlers.HandlerProxy.execute(HandlerProxy.java:295) + at org.eclipse.ui.internal.handlers.E4HandlerProxy.execute(E4HandlerProxy.java:90) + at sun.reflect.GeneratedMethodAccessor53.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55) + at org.eclipse.e4.core.internal.di.InjectorImpl.invokeUsingClass(InjectorImpl.java:282) + at org.eclipse.e4.core.internal.di.InjectorImpl.invoke(InjectorImpl.java:264) + at org.eclipse.e4.core.contexts.ContextInjectionFactory.invoke(ContextInjectionFactory.java:132) + at org.eclipse.e4.core.commands.internal.HandlerServiceHandler.execute(HandlerServiceHandler.java:152) + at org.eclipse.core.commands.Command.executeWithChecks(Command.java:494) + at org.eclipse.core.commands.ParameterizedCommand.executeWithChecks(ParameterizedCommand.java:488) + at org.eclipse.e4.core.commands.internal.HandlerServiceImpl.executeHandler(HandlerServiceImpl.java:210) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.executeCommand(KeyBindingDispatcher.java:286) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.press(KeyBindingDispatcher.java:507) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.processKeyEvent(KeyBindingDispatcher.java:558) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.filterKeySequenceBindings(KeyBindingDispatcher.java:378) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.access$0(KeyBindingDispatcher.java:324) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher$KeyDownFilter.handleEvent(KeyBindingDispatcher.java:86) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.filterEvent(Display.java:1270) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1078) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1103) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1088) + at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1130) + at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1126) + at org.eclipse.swt.widgets.Widget.wmChar(Widget.java:1547) + at org.eclipse.swt.widgets.Control.WM_CHAR(Control.java:4918) + at org.eclipse.swt.widgets.Canvas.WM_CHAR(Canvas.java:364) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4799) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2552) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3822) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) + +!ENTRY org.eclipse.cdt.ui 4 4 2017-09-12 12:43:05.123 +!MESSAGE Error +!STACK 0 +org.eclipse.jface.text.BadLocationException + at org.eclipse.jface.text.AbstractDocument.get(AbstractDocument.java:964) + at org.eclipse.core.internal.filebuffers.SynchronizableDocument.get(SynchronizableDocument.java:127) + at org.eclipse.cdt.internal.ui.text.LineComparator.getHash(LineComparator.java:84) + at org.eclipse.cdt.internal.ui.text.LineComparator.rangesEqual(LineComparator.java:60) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.isRangeEqual(RangeComparatorLCS.java:57) + at org.eclipse.compare.internal.core.LCS.find_middle_snake(LCS.java:305) + at org.eclipse.compare.internal.core.LCS.lcs_rec(LCS.java:133) + at org.eclipse.compare.internal.core.LCS.longestCommonSubsequence(LCS.java:91) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.longestCommonSubsequence(RangeComparatorLCS.java:186) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.findDifferences(RangeComparatorLCS.java:31) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:98) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:82) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:67) + at org.eclipse.cdt.internal.ui.util.EditorUtility$1.getChangedLineRegions(EditorUtility.java:948) + at org.eclipse.cdt.internal.ui.util.EditorUtility$1.run(EditorUtility.java:924) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.cdt.internal.ui.util.EditorUtility.calculateChangedLineRegions(EditorUtility.java:899) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider.performSaveActions(CDocumentProvider.java:970) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider.commitWorkingCopy(CDocumentProvider.java:887) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider$2.execute(CDocumentProvider.java:919) + at org.eclipse.ui.editors.text.TextFileDocumentProvider$DocumentProviderOperation.run(TextFileDocumentProvider.java:130) + at org.eclipse.ui.actions.WorkspaceModifyDelegatingOperation.execute(WorkspaceModifyDelegatingOperation.java:67) + at org.eclipse.ui.actions.WorkspaceModifyOperation.lambda$0(WorkspaceModifyOperation.java:107) + at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2240) + at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2267) + at org.eclipse.ui.actions.WorkspaceModifyOperation.run(WorkspaceModifyOperation.java:128) + at org.eclipse.ui.internal.editors.text.WorkspaceOperationRunner.run(WorkspaceOperationRunner.java:73) + at org.eclipse.ui.internal.editors.text.WorkspaceOperationRunner.run(WorkspaceOperationRunner.java:63) + at org.eclipse.ui.editors.text.TextFileDocumentProvider.executeOperation(TextFileDocumentProvider.java:458) + at org.eclipse.ui.editors.text.TextFileDocumentProvider.saveDocument(TextFileDocumentProvider.java:761) + at org.eclipse.ui.texteditor.AbstractTextEditor.performSave(AbstractTextEditor.java:5025) + at org.eclipse.ui.texteditor.AbstractTextEditor.doSave(AbstractTextEditor.java:4820) + at org.eclipse.ui.texteditor.AbstractTextEditor$TextEditorSavable.doSave(AbstractTextEditor.java:7117) + at org.eclipse.ui.Saveable.doSave(Saveable.java:220) + at org.eclipse.ui.internal.SaveableHelper.doSaveModel(SaveableHelper.java:358) + at org.eclipse.ui.internal.SaveableHelper$3.run(SaveableHelper.java:202) + at org.eclipse.ui.internal.SaveableHelper$5.run(SaveableHelper.java:286) + at org.eclipse.jface.operation.ModalContext.runInCurrentThread(ModalContext.java:437) + at org.eclipse.jface.operation.ModalContext.run(ModalContext.java:353) + at org.eclipse.ui.internal.WorkbenchWindow$14.run(WorkbenchWindow.java:2184) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70) + at org.eclipse.ui.internal.WorkbenchWindow.run(WorkbenchWindow.java:2180) + at org.eclipse.ui.internal.SaveableHelper.runProgressMonitorOperation(SaveableHelper.java:294) + at org.eclipse.ui.internal.SaveableHelper.runProgressMonitorOperation(SaveableHelper.java:272) + at org.eclipse.ui.internal.SaveableHelper.saveModels(SaveableHelper.java:214) + at org.eclipse.ui.internal.SaveableHelper.savePart(SaveableHelper.java:149) + at org.eclipse.ui.internal.WorkbenchPage.saveSaveable(WorkbenchPage.java:3904) + at org.eclipse.ui.internal.WorkbenchPage.saveEditor(WorkbenchPage.java:3918) + at org.eclipse.ui.internal.handlers.SaveHandler.execute(SaveHandler.java:54) + at org.eclipse.ui.internal.handlers.HandlerProxy.execute(HandlerProxy.java:295) + at org.eclipse.ui.internal.handlers.E4HandlerProxy.execute(E4HandlerProxy.java:90) + at sun.reflect.GeneratedMethodAccessor53.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55) + at org.eclipse.e4.core.internal.di.InjectorImpl.invokeUsingClass(InjectorImpl.java:282) + at org.eclipse.e4.core.internal.di.InjectorImpl.invoke(InjectorImpl.java:264) + at org.eclipse.e4.core.contexts.ContextInjectionFactory.invoke(ContextInjectionFactory.java:132) + at org.eclipse.e4.core.commands.internal.HandlerServiceHandler.execute(HandlerServiceHandler.java:152) + at org.eclipse.core.commands.Command.executeWithChecks(Command.java:494) + at org.eclipse.core.commands.ParameterizedCommand.executeWithChecks(ParameterizedCommand.java:488) + at org.eclipse.e4.core.commands.internal.HandlerServiceImpl.executeHandler(HandlerServiceImpl.java:210) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.executeCommand(KeyBindingDispatcher.java:286) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.press(KeyBindingDispatcher.java:507) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.processKeyEvent(KeyBindingDispatcher.java:558) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.filterKeySequenceBindings(KeyBindingDispatcher.java:378) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.access$0(KeyBindingDispatcher.java:324) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher$KeyDownFilter.handleEvent(KeyBindingDispatcher.java:86) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.filterEvent(Display.java:1270) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1078) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1103) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1088) + at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1130) + at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1126) + at org.eclipse.swt.widgets.Widget.wmChar(Widget.java:1547) + at org.eclipse.swt.widgets.Control.WM_CHAR(Control.java:4918) + at org.eclipse.swt.widgets.Canvas.WM_CHAR(Canvas.java:364) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4799) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2552) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3822) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) + +!ENTRY org.eclipse.cdt.ui 4 4 2017-09-12 12:43:05.126 +!MESSAGE Error +!STACK 0 +org.eclipse.jface.text.BadLocationException + at org.eclipse.jface.text.AbstractDocument.get(AbstractDocument.java:964) + at org.eclipse.core.internal.filebuffers.SynchronizableDocument.get(SynchronizableDocument.java:127) + at org.eclipse.cdt.internal.ui.text.LineComparator.getHash(LineComparator.java:84) + at org.eclipse.cdt.internal.ui.text.LineComparator.rangesEqual(LineComparator.java:60) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.isRangeEqual(RangeComparatorLCS.java:57) + at org.eclipse.compare.internal.core.LCS.find_middle_snake(LCS.java:262) + at org.eclipse.compare.internal.core.LCS.lcs_rec(LCS.java:133) + at org.eclipse.compare.internal.core.LCS.longestCommonSubsequence(LCS.java:91) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.longestCommonSubsequence(RangeComparatorLCS.java:186) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.findDifferences(RangeComparatorLCS.java:31) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:98) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:82) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:67) + at org.eclipse.cdt.internal.ui.util.EditorUtility$1.getChangedLineRegions(EditorUtility.java:948) + at org.eclipse.cdt.internal.ui.util.EditorUtility$1.run(EditorUtility.java:924) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.cdt.internal.ui.util.EditorUtility.calculateChangedLineRegions(EditorUtility.java:899) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider.performSaveActions(CDocumentProvider.java:970) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider.commitWorkingCopy(CDocumentProvider.java:887) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider$2.execute(CDocumentProvider.java:919) + at org.eclipse.ui.editors.text.TextFileDocumentProvider$DocumentProviderOperation.run(TextFileDocumentProvider.java:130) + at org.eclipse.ui.actions.WorkspaceModifyDelegatingOperation.execute(WorkspaceModifyDelegatingOperation.java:67) + at org.eclipse.ui.actions.WorkspaceModifyOperation.lambda$0(WorkspaceModifyOperation.java:107) + at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2240) + at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2267) + at org.eclipse.ui.actions.WorkspaceModifyOperation.run(WorkspaceModifyOperation.java:128) + at org.eclipse.ui.internal.editors.text.WorkspaceOperationRunner.run(WorkspaceOperationRunner.java:73) + at org.eclipse.ui.internal.editors.text.WorkspaceOperationRunner.run(WorkspaceOperationRunner.java:63) + at org.eclipse.ui.editors.text.TextFileDocumentProvider.executeOperation(TextFileDocumentProvider.java:458) + at org.eclipse.ui.editors.text.TextFileDocumentProvider.saveDocument(TextFileDocumentProvider.java:761) + at org.eclipse.ui.texteditor.AbstractTextEditor.performSave(AbstractTextEditor.java:5025) + at org.eclipse.ui.texteditor.AbstractTextEditor.doSave(AbstractTextEditor.java:4820) + at org.eclipse.ui.texteditor.AbstractTextEditor$TextEditorSavable.doSave(AbstractTextEditor.java:7117) + at org.eclipse.ui.Saveable.doSave(Saveable.java:220) + at org.eclipse.ui.internal.SaveableHelper.doSaveModel(SaveableHelper.java:358) + at org.eclipse.ui.internal.SaveableHelper$3.run(SaveableHelper.java:202) + at org.eclipse.ui.internal.SaveableHelper$5.run(SaveableHelper.java:286) + at org.eclipse.jface.operation.ModalContext.runInCurrentThread(ModalContext.java:437) + at org.eclipse.jface.operation.ModalContext.run(ModalContext.java:353) + at org.eclipse.ui.internal.WorkbenchWindow$14.run(WorkbenchWindow.java:2184) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70) + at org.eclipse.ui.internal.WorkbenchWindow.run(WorkbenchWindow.java:2180) + at org.eclipse.ui.internal.SaveableHelper.runProgressMonitorOperation(SaveableHelper.java:294) + at org.eclipse.ui.internal.SaveableHelper.runProgressMonitorOperation(SaveableHelper.java:272) + at org.eclipse.ui.internal.SaveableHelper.saveModels(SaveableHelper.java:214) + at org.eclipse.ui.internal.SaveableHelper.savePart(SaveableHelper.java:149) + at org.eclipse.ui.internal.WorkbenchPage.saveSaveable(WorkbenchPage.java:3904) + at org.eclipse.ui.internal.WorkbenchPage.saveEditor(WorkbenchPage.java:3918) + at org.eclipse.ui.internal.handlers.SaveHandler.execute(SaveHandler.java:54) + at org.eclipse.ui.internal.handlers.HandlerProxy.execute(HandlerProxy.java:295) + at org.eclipse.ui.internal.handlers.E4HandlerProxy.execute(E4HandlerProxy.java:90) + at sun.reflect.GeneratedMethodAccessor53.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55) + at org.eclipse.e4.core.internal.di.InjectorImpl.invokeUsingClass(InjectorImpl.java:282) + at org.eclipse.e4.core.internal.di.InjectorImpl.invoke(InjectorImpl.java:264) + at org.eclipse.e4.core.contexts.ContextInjectionFactory.invoke(ContextInjectionFactory.java:132) + at org.eclipse.e4.core.commands.internal.HandlerServiceHandler.execute(HandlerServiceHandler.java:152) + at org.eclipse.core.commands.Command.executeWithChecks(Command.java:494) + at org.eclipse.core.commands.ParameterizedCommand.executeWithChecks(ParameterizedCommand.java:488) + at org.eclipse.e4.core.commands.internal.HandlerServiceImpl.executeHandler(HandlerServiceImpl.java:210) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.executeCommand(KeyBindingDispatcher.java:286) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.press(KeyBindingDispatcher.java:507) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.processKeyEvent(KeyBindingDispatcher.java:558) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.filterKeySequenceBindings(KeyBindingDispatcher.java:378) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.access$0(KeyBindingDispatcher.java:324) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher$KeyDownFilter.handleEvent(KeyBindingDispatcher.java:86) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.filterEvent(Display.java:1270) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1078) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1103) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1088) + at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1130) + at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1126) + at org.eclipse.swt.widgets.Widget.wmChar(Widget.java:1547) + at org.eclipse.swt.widgets.Control.WM_CHAR(Control.java:4918) + at org.eclipse.swt.widgets.Canvas.WM_CHAR(Canvas.java:364) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4799) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2552) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3822) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) + +!ENTRY org.eclipse.cdt.ui 4 4 2017-09-12 12:43:05.129 +!MESSAGE Error +!STACK 0 +org.eclipse.jface.text.BadLocationException + at org.eclipse.jface.text.AbstractDocument.get(AbstractDocument.java:964) + at org.eclipse.core.internal.filebuffers.SynchronizableDocument.get(SynchronizableDocument.java:127) + at org.eclipse.cdt.internal.ui.text.LineComparator.getHash(LineComparator.java:84) + at org.eclipse.cdt.internal.ui.text.LineComparator.rangesEqual(LineComparator.java:60) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.isRangeEqual(RangeComparatorLCS.java:57) + at org.eclipse.compare.internal.core.LCS.find_middle_snake(LCS.java:305) + at org.eclipse.compare.internal.core.LCS.lcs_rec(LCS.java:133) + at org.eclipse.compare.internal.core.LCS.longestCommonSubsequence(LCS.java:91) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.longestCommonSubsequence(RangeComparatorLCS.java:186) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.findDifferences(RangeComparatorLCS.java:31) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:98) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:82) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:67) + at org.eclipse.cdt.internal.ui.util.EditorUtility$1.getChangedLineRegions(EditorUtility.java:948) + at org.eclipse.cdt.internal.ui.util.EditorUtility$1.run(EditorUtility.java:924) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.cdt.internal.ui.util.EditorUtility.calculateChangedLineRegions(EditorUtility.java:899) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider.performSaveActions(CDocumentProvider.java:970) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider.commitWorkingCopy(CDocumentProvider.java:887) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider$2.execute(CDocumentProvider.java:919) + at org.eclipse.ui.editors.text.TextFileDocumentProvider$DocumentProviderOperation.run(TextFileDocumentProvider.java:130) + at org.eclipse.ui.actions.WorkspaceModifyDelegatingOperation.execute(WorkspaceModifyDelegatingOperation.java:67) + at org.eclipse.ui.actions.WorkspaceModifyOperation.lambda$0(WorkspaceModifyOperation.java:107) + at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2240) + at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2267) + at org.eclipse.ui.actions.WorkspaceModifyOperation.run(WorkspaceModifyOperation.java:128) + at org.eclipse.ui.internal.editors.text.WorkspaceOperationRunner.run(WorkspaceOperationRunner.java:73) + at org.eclipse.ui.internal.editors.text.WorkspaceOperationRunner.run(WorkspaceOperationRunner.java:63) + at org.eclipse.ui.editors.text.TextFileDocumentProvider.executeOperation(TextFileDocumentProvider.java:458) + at org.eclipse.ui.editors.text.TextFileDocumentProvider.saveDocument(TextFileDocumentProvider.java:761) + at org.eclipse.ui.texteditor.AbstractTextEditor.performSave(AbstractTextEditor.java:5025) + at org.eclipse.ui.texteditor.AbstractTextEditor.doSave(AbstractTextEditor.java:4820) + at org.eclipse.ui.texteditor.AbstractTextEditor$TextEditorSavable.doSave(AbstractTextEditor.java:7117) + at org.eclipse.ui.Saveable.doSave(Saveable.java:220) + at org.eclipse.ui.internal.SaveableHelper.doSaveModel(SaveableHelper.java:358) + at org.eclipse.ui.internal.SaveableHelper$3.run(SaveableHelper.java:202) + at org.eclipse.ui.internal.SaveableHelper$5.run(SaveableHelper.java:286) + at org.eclipse.jface.operation.ModalContext.runInCurrentThread(ModalContext.java:437) + at org.eclipse.jface.operation.ModalContext.run(ModalContext.java:353) + at org.eclipse.ui.internal.WorkbenchWindow$14.run(WorkbenchWindow.java:2184) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70) + at org.eclipse.ui.internal.WorkbenchWindow.run(WorkbenchWindow.java:2180) + at org.eclipse.ui.internal.SaveableHelper.runProgressMonitorOperation(SaveableHelper.java:294) + at org.eclipse.ui.internal.SaveableHelper.runProgressMonitorOperation(SaveableHelper.java:272) + at org.eclipse.ui.internal.SaveableHelper.saveModels(SaveableHelper.java:214) + at org.eclipse.ui.internal.SaveableHelper.savePart(SaveableHelper.java:149) + at org.eclipse.ui.internal.WorkbenchPage.saveSaveable(WorkbenchPage.java:3904) + at org.eclipse.ui.internal.WorkbenchPage.saveEditor(WorkbenchPage.java:3918) + at org.eclipse.ui.internal.handlers.SaveHandler.execute(SaveHandler.java:54) + at org.eclipse.ui.internal.handlers.HandlerProxy.execute(HandlerProxy.java:295) + at org.eclipse.ui.internal.handlers.E4HandlerProxy.execute(E4HandlerProxy.java:90) + at sun.reflect.GeneratedMethodAccessor53.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55) + at org.eclipse.e4.core.internal.di.InjectorImpl.invokeUsingClass(InjectorImpl.java:282) + at org.eclipse.e4.core.internal.di.InjectorImpl.invoke(InjectorImpl.java:264) + at org.eclipse.e4.core.contexts.ContextInjectionFactory.invoke(ContextInjectionFactory.java:132) + at org.eclipse.e4.core.commands.internal.HandlerServiceHandler.execute(HandlerServiceHandler.java:152) + at org.eclipse.core.commands.Command.executeWithChecks(Command.java:494) + at org.eclipse.core.commands.ParameterizedCommand.executeWithChecks(ParameterizedCommand.java:488) + at org.eclipse.e4.core.commands.internal.HandlerServiceImpl.executeHandler(HandlerServiceImpl.java:210) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.executeCommand(KeyBindingDispatcher.java:286) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.press(KeyBindingDispatcher.java:507) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.processKeyEvent(KeyBindingDispatcher.java:558) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.filterKeySequenceBindings(KeyBindingDispatcher.java:378) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.access$0(KeyBindingDispatcher.java:324) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher$KeyDownFilter.handleEvent(KeyBindingDispatcher.java:86) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.filterEvent(Display.java:1270) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1078) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1103) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1088) + at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1130) + at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1126) + at org.eclipse.swt.widgets.Widget.wmChar(Widget.java:1547) + at org.eclipse.swt.widgets.Control.WM_CHAR(Control.java:4918) + at org.eclipse.swt.widgets.Canvas.WM_CHAR(Canvas.java:364) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4799) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2552) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3822) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) + +!ENTRY org.eclipse.cdt.ui 4 4 2017-09-12 12:43:05.132 +!MESSAGE Error +!STACK 0 +org.eclipse.jface.text.BadLocationException + at org.eclipse.jface.text.AbstractDocument.get(AbstractDocument.java:964) + at org.eclipse.core.internal.filebuffers.SynchronizableDocument.get(SynchronizableDocument.java:127) + at org.eclipse.cdt.internal.ui.text.LineComparator.getHash(LineComparator.java:84) + at org.eclipse.cdt.internal.ui.text.LineComparator.rangesEqual(LineComparator.java:60) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.isRangeEqual(RangeComparatorLCS.java:57) + at org.eclipse.compare.internal.core.LCS.find_middle_snake(LCS.java:305) + at org.eclipse.compare.internal.core.LCS.lcs_rec(LCS.java:133) + at org.eclipse.compare.internal.core.LCS.lcs_rec(LCS.java:150) + at org.eclipse.compare.internal.core.LCS.longestCommonSubsequence(LCS.java:91) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.longestCommonSubsequence(RangeComparatorLCS.java:186) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.findDifferences(RangeComparatorLCS.java:31) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:98) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:82) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:67) + at org.eclipse.cdt.internal.ui.util.EditorUtility$1.getChangedLineRegions(EditorUtility.java:948) + at org.eclipse.cdt.internal.ui.util.EditorUtility$1.run(EditorUtility.java:924) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.cdt.internal.ui.util.EditorUtility.calculateChangedLineRegions(EditorUtility.java:899) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider.performSaveActions(CDocumentProvider.java:970) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider.commitWorkingCopy(CDocumentProvider.java:887) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider$2.execute(CDocumentProvider.java:919) + at org.eclipse.ui.editors.text.TextFileDocumentProvider$DocumentProviderOperation.run(TextFileDocumentProvider.java:130) + at org.eclipse.ui.actions.WorkspaceModifyDelegatingOperation.execute(WorkspaceModifyDelegatingOperation.java:67) + at org.eclipse.ui.actions.WorkspaceModifyOperation.lambda$0(WorkspaceModifyOperation.java:107) + at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2240) + at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2267) + at org.eclipse.ui.actions.WorkspaceModifyOperation.run(WorkspaceModifyOperation.java:128) + at org.eclipse.ui.internal.editors.text.WorkspaceOperationRunner.run(WorkspaceOperationRunner.java:73) + at org.eclipse.ui.internal.editors.text.WorkspaceOperationRunner.run(WorkspaceOperationRunner.java:63) + at org.eclipse.ui.editors.text.TextFileDocumentProvider.executeOperation(TextFileDocumentProvider.java:458) + at org.eclipse.ui.editors.text.TextFileDocumentProvider.saveDocument(TextFileDocumentProvider.java:761) + at org.eclipse.ui.texteditor.AbstractTextEditor.performSave(AbstractTextEditor.java:5025) + at org.eclipse.ui.texteditor.AbstractTextEditor.doSave(AbstractTextEditor.java:4820) + at org.eclipse.ui.texteditor.AbstractTextEditor$TextEditorSavable.doSave(AbstractTextEditor.java:7117) + at org.eclipse.ui.Saveable.doSave(Saveable.java:220) + at org.eclipse.ui.internal.SaveableHelper.doSaveModel(SaveableHelper.java:358) + at org.eclipse.ui.internal.SaveableHelper$3.run(SaveableHelper.java:202) + at org.eclipse.ui.internal.SaveableHelper$5.run(SaveableHelper.java:286) + at org.eclipse.jface.operation.ModalContext.runInCurrentThread(ModalContext.java:437) + at org.eclipse.jface.operation.ModalContext.run(ModalContext.java:353) + at org.eclipse.ui.internal.WorkbenchWindow$14.run(WorkbenchWindow.java:2184) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70) + at org.eclipse.ui.internal.WorkbenchWindow.run(WorkbenchWindow.java:2180) + at org.eclipse.ui.internal.SaveableHelper.runProgressMonitorOperation(SaveableHelper.java:294) + at org.eclipse.ui.internal.SaveableHelper.runProgressMonitorOperation(SaveableHelper.java:272) + at org.eclipse.ui.internal.SaveableHelper.saveModels(SaveableHelper.java:214) + at org.eclipse.ui.internal.SaveableHelper.savePart(SaveableHelper.java:149) + at org.eclipse.ui.internal.WorkbenchPage.saveSaveable(WorkbenchPage.java:3904) + at org.eclipse.ui.internal.WorkbenchPage.saveEditor(WorkbenchPage.java:3918) + at org.eclipse.ui.internal.handlers.SaveHandler.execute(SaveHandler.java:54) + at org.eclipse.ui.internal.handlers.HandlerProxy.execute(HandlerProxy.java:295) + at org.eclipse.ui.internal.handlers.E4HandlerProxy.execute(E4HandlerProxy.java:90) + at sun.reflect.GeneratedMethodAccessor53.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55) + at org.eclipse.e4.core.internal.di.InjectorImpl.invokeUsingClass(InjectorImpl.java:282) + at org.eclipse.e4.core.internal.di.InjectorImpl.invoke(InjectorImpl.java:264) + at org.eclipse.e4.core.contexts.ContextInjectionFactory.invoke(ContextInjectionFactory.java:132) + at org.eclipse.e4.core.commands.internal.HandlerServiceHandler.execute(HandlerServiceHandler.java:152) + at org.eclipse.core.commands.Command.executeWithChecks(Command.java:494) + at org.eclipse.core.commands.ParameterizedCommand.executeWithChecks(ParameterizedCommand.java:488) + at org.eclipse.e4.core.commands.internal.HandlerServiceImpl.executeHandler(HandlerServiceImpl.java:210) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.executeCommand(KeyBindingDispatcher.java:286) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.press(KeyBindingDispatcher.java:507) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.processKeyEvent(KeyBindingDispatcher.java:558) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.filterKeySequenceBindings(KeyBindingDispatcher.java:378) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.access$0(KeyBindingDispatcher.java:324) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher$KeyDownFilter.handleEvent(KeyBindingDispatcher.java:86) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.filterEvent(Display.java:1270) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1078) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1103) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1088) + at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1130) + at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1126) + at org.eclipse.swt.widgets.Widget.wmChar(Widget.java:1547) + at org.eclipse.swt.widgets.Control.WM_CHAR(Control.java:4918) + at org.eclipse.swt.widgets.Canvas.WM_CHAR(Canvas.java:364) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4799) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2552) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3822) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) + +!ENTRY org.eclipse.cdt.ui 4 4 2017-09-12 12:43:05.135 +!MESSAGE Error +!STACK 0 +org.eclipse.jface.text.BadLocationException + at org.eclipse.jface.text.AbstractDocument.get(AbstractDocument.java:964) + at org.eclipse.core.internal.filebuffers.SynchronizableDocument.get(SynchronizableDocument.java:127) + at org.eclipse.cdt.internal.ui.text.LineComparator.getHash(LineComparator.java:84) + at org.eclipse.cdt.internal.ui.text.LineComparator.rangesEqual(LineComparator.java:60) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.isRangeEqual(RangeComparatorLCS.java:57) + at org.eclipse.compare.internal.core.LCS.find_middle_snake(LCS.java:305) + at org.eclipse.compare.internal.core.LCS.lcs_rec(LCS.java:133) + at org.eclipse.compare.internal.core.LCS.lcs_rec(LCS.java:150) + at org.eclipse.compare.internal.core.LCS.longestCommonSubsequence(LCS.java:91) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.longestCommonSubsequence(RangeComparatorLCS.java:186) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.findDifferences(RangeComparatorLCS.java:31) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:98) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:82) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:67) + at org.eclipse.cdt.internal.ui.util.EditorUtility$1.getChangedLineRegions(EditorUtility.java:948) + at org.eclipse.cdt.internal.ui.util.EditorUtility$1.run(EditorUtility.java:924) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.cdt.internal.ui.util.EditorUtility.calculateChangedLineRegions(EditorUtility.java:899) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider.performSaveActions(CDocumentProvider.java:970) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider.commitWorkingCopy(CDocumentProvider.java:887) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider$2.execute(CDocumentProvider.java:919) + at org.eclipse.ui.editors.text.TextFileDocumentProvider$DocumentProviderOperation.run(TextFileDocumentProvider.java:130) + at org.eclipse.ui.actions.WorkspaceModifyDelegatingOperation.execute(WorkspaceModifyDelegatingOperation.java:67) + at org.eclipse.ui.actions.WorkspaceModifyOperation.lambda$0(WorkspaceModifyOperation.java:107) + at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2240) + at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2267) + at org.eclipse.ui.actions.WorkspaceModifyOperation.run(WorkspaceModifyOperation.java:128) + at org.eclipse.ui.internal.editors.text.WorkspaceOperationRunner.run(WorkspaceOperationRunner.java:73) + at org.eclipse.ui.internal.editors.text.WorkspaceOperationRunner.run(WorkspaceOperationRunner.java:63) + at org.eclipse.ui.editors.text.TextFileDocumentProvider.executeOperation(TextFileDocumentProvider.java:458) + at org.eclipse.ui.editors.text.TextFileDocumentProvider.saveDocument(TextFileDocumentProvider.java:761) + at org.eclipse.ui.texteditor.AbstractTextEditor.performSave(AbstractTextEditor.java:5025) + at org.eclipse.ui.texteditor.AbstractTextEditor.doSave(AbstractTextEditor.java:4820) + at org.eclipse.ui.texteditor.AbstractTextEditor$TextEditorSavable.doSave(AbstractTextEditor.java:7117) + at org.eclipse.ui.Saveable.doSave(Saveable.java:220) + at org.eclipse.ui.internal.SaveableHelper.doSaveModel(SaveableHelper.java:358) + at org.eclipse.ui.internal.SaveableHelper$3.run(SaveableHelper.java:202) + at org.eclipse.ui.internal.SaveableHelper$5.run(SaveableHelper.java:286) + at org.eclipse.jface.operation.ModalContext.runInCurrentThread(ModalContext.java:437) + at org.eclipse.jface.operation.ModalContext.run(ModalContext.java:353) + at org.eclipse.ui.internal.WorkbenchWindow$14.run(WorkbenchWindow.java:2184) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70) + at org.eclipse.ui.internal.WorkbenchWindow.run(WorkbenchWindow.java:2180) + at org.eclipse.ui.internal.SaveableHelper.runProgressMonitorOperation(SaveableHelper.java:294) + at org.eclipse.ui.internal.SaveableHelper.runProgressMonitorOperation(SaveableHelper.java:272) + at org.eclipse.ui.internal.SaveableHelper.saveModels(SaveableHelper.java:214) + at org.eclipse.ui.internal.SaveableHelper.savePart(SaveableHelper.java:149) + at org.eclipse.ui.internal.WorkbenchPage.saveSaveable(WorkbenchPage.java:3904) + at org.eclipse.ui.internal.WorkbenchPage.saveEditor(WorkbenchPage.java:3918) + at org.eclipse.ui.internal.handlers.SaveHandler.execute(SaveHandler.java:54) + at org.eclipse.ui.internal.handlers.HandlerProxy.execute(HandlerProxy.java:295) + at org.eclipse.ui.internal.handlers.E4HandlerProxy.execute(E4HandlerProxy.java:90) + at sun.reflect.GeneratedMethodAccessor53.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55) + at org.eclipse.e4.core.internal.di.InjectorImpl.invokeUsingClass(InjectorImpl.java:282) + at org.eclipse.e4.core.internal.di.InjectorImpl.invoke(InjectorImpl.java:264) + at org.eclipse.e4.core.contexts.ContextInjectionFactory.invoke(ContextInjectionFactory.java:132) + at org.eclipse.e4.core.commands.internal.HandlerServiceHandler.execute(HandlerServiceHandler.java:152) + at org.eclipse.core.commands.Command.executeWithChecks(Command.java:494) + at org.eclipse.core.commands.ParameterizedCommand.executeWithChecks(ParameterizedCommand.java:488) + at org.eclipse.e4.core.commands.internal.HandlerServiceImpl.executeHandler(HandlerServiceImpl.java:210) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.executeCommand(KeyBindingDispatcher.java:286) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.press(KeyBindingDispatcher.java:507) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.processKeyEvent(KeyBindingDispatcher.java:558) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.filterKeySequenceBindings(KeyBindingDispatcher.java:378) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.access$0(KeyBindingDispatcher.java:324) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher$KeyDownFilter.handleEvent(KeyBindingDispatcher.java:86) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.filterEvent(Display.java:1270) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1078) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1103) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1088) + at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1130) + at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1126) + at org.eclipse.swt.widgets.Widget.wmChar(Widget.java:1547) + at org.eclipse.swt.widgets.Control.WM_CHAR(Control.java:4918) + at org.eclipse.swt.widgets.Canvas.WM_CHAR(Canvas.java:364) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4799) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2552) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3822) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) + +!ENTRY org.eclipse.cdt.ui 4 4 2017-09-12 12:43:05.137 +!MESSAGE Error +!STACK 0 +org.eclipse.jface.text.BadLocationException + at org.eclipse.jface.text.AbstractDocument.get(AbstractDocument.java:964) + at org.eclipse.core.internal.filebuffers.SynchronizableDocument.get(SynchronizableDocument.java:127) + at org.eclipse.cdt.internal.ui.text.LineComparator.getHash(LineComparator.java:84) + at org.eclipse.cdt.internal.ui.text.LineComparator.rangesEqual(LineComparator.java:60) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.compactAndShiftLCS(RangeComparatorLCS.java:169) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.longestCommonSubsequence(RangeComparatorLCS.java:189) + at org.eclipse.compare.rangedifferencer.RangeComparatorLCS.findDifferences(RangeComparatorLCS.java:31) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:98) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:82) + at org.eclipse.compare.rangedifferencer.RangeDifferencer.findDifferences(RangeDifferencer.java:67) + at org.eclipse.cdt.internal.ui.util.EditorUtility$1.getChangedLineRegions(EditorUtility.java:948) + at org.eclipse.cdt.internal.ui.util.EditorUtility$1.run(EditorUtility.java:924) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.cdt.internal.ui.util.EditorUtility.calculateChangedLineRegions(EditorUtility.java:899) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider.performSaveActions(CDocumentProvider.java:970) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider.commitWorkingCopy(CDocumentProvider.java:887) + at org.eclipse.cdt.internal.ui.editor.CDocumentProvider$2.execute(CDocumentProvider.java:919) + at org.eclipse.ui.editors.text.TextFileDocumentProvider$DocumentProviderOperation.run(TextFileDocumentProvider.java:130) + at org.eclipse.ui.actions.WorkspaceModifyDelegatingOperation.execute(WorkspaceModifyDelegatingOperation.java:67) + at org.eclipse.ui.actions.WorkspaceModifyOperation.lambda$0(WorkspaceModifyOperation.java:107) + at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2240) + at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2267) + at org.eclipse.ui.actions.WorkspaceModifyOperation.run(WorkspaceModifyOperation.java:128) + at org.eclipse.ui.internal.editors.text.WorkspaceOperationRunner.run(WorkspaceOperationRunner.java:73) + at org.eclipse.ui.internal.editors.text.WorkspaceOperationRunner.run(WorkspaceOperationRunner.java:63) + at org.eclipse.ui.editors.text.TextFileDocumentProvider.executeOperation(TextFileDocumentProvider.java:458) + at org.eclipse.ui.editors.text.TextFileDocumentProvider.saveDocument(TextFileDocumentProvider.java:761) + at org.eclipse.ui.texteditor.AbstractTextEditor.performSave(AbstractTextEditor.java:5025) + at org.eclipse.ui.texteditor.AbstractTextEditor.doSave(AbstractTextEditor.java:4820) + at org.eclipse.ui.texteditor.AbstractTextEditor$TextEditorSavable.doSave(AbstractTextEditor.java:7117) + at org.eclipse.ui.Saveable.doSave(Saveable.java:220) + at org.eclipse.ui.internal.SaveableHelper.doSaveModel(SaveableHelper.java:358) + at org.eclipse.ui.internal.SaveableHelper$3.run(SaveableHelper.java:202) + at org.eclipse.ui.internal.SaveableHelper$5.run(SaveableHelper.java:286) + at org.eclipse.jface.operation.ModalContext.runInCurrentThread(ModalContext.java:437) + at org.eclipse.jface.operation.ModalContext.run(ModalContext.java:353) + at org.eclipse.ui.internal.WorkbenchWindow$14.run(WorkbenchWindow.java:2184) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70) + at org.eclipse.ui.internal.WorkbenchWindow.run(WorkbenchWindow.java:2180) + at org.eclipse.ui.internal.SaveableHelper.runProgressMonitorOperation(SaveableHelper.java:294) + at org.eclipse.ui.internal.SaveableHelper.runProgressMonitorOperation(SaveableHelper.java:272) + at org.eclipse.ui.internal.SaveableHelper.saveModels(SaveableHelper.java:214) + at org.eclipse.ui.internal.SaveableHelper.savePart(SaveableHelper.java:149) + at org.eclipse.ui.internal.WorkbenchPage.saveSaveable(WorkbenchPage.java:3904) + at org.eclipse.ui.internal.WorkbenchPage.saveEditor(WorkbenchPage.java:3918) + at org.eclipse.ui.internal.handlers.SaveHandler.execute(SaveHandler.java:54) + at org.eclipse.ui.internal.handlers.HandlerProxy.execute(HandlerProxy.java:295) + at org.eclipse.ui.internal.handlers.E4HandlerProxy.execute(E4HandlerProxy.java:90) + at sun.reflect.GeneratedMethodAccessor53.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55) + at org.eclipse.e4.core.internal.di.InjectorImpl.invokeUsingClass(InjectorImpl.java:282) + at org.eclipse.e4.core.internal.di.InjectorImpl.invoke(InjectorImpl.java:264) + at org.eclipse.e4.core.contexts.ContextInjectionFactory.invoke(ContextInjectionFactory.java:132) + at org.eclipse.e4.core.commands.internal.HandlerServiceHandler.execute(HandlerServiceHandler.java:152) + at org.eclipse.core.commands.Command.executeWithChecks(Command.java:494) + at org.eclipse.core.commands.ParameterizedCommand.executeWithChecks(ParameterizedCommand.java:488) + at org.eclipse.e4.core.commands.internal.HandlerServiceImpl.executeHandler(HandlerServiceImpl.java:210) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.executeCommand(KeyBindingDispatcher.java:286) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.press(KeyBindingDispatcher.java:507) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.processKeyEvent(KeyBindingDispatcher.java:558) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.filterKeySequenceBindings(KeyBindingDispatcher.java:378) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.access$0(KeyBindingDispatcher.java:324) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher$KeyDownFilter.handleEvent(KeyBindingDispatcher.java:86) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.filterEvent(Display.java:1270) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1078) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1103) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1088) + at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1130) + at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1126) + at org.eclipse.swt.widgets.Widget.wmChar(Widget.java:1547) + at org.eclipse.swt.widgets.Control.WM_CHAR(Control.java:4918) + at org.eclipse.swt.widgets.Canvas.WM_CHAR(Canvas.java:364) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4799) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2552) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3822) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:43:05.179 +!MESSAGE Unhandled event loop exception +!STACK 0 +org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.IllegalStateException: startLine (47) does not match endLine (46)) + at org.eclipse.swt.SWT.error(SWT.java:4533) + at org.eclipse.swt.SWT.error(SWT.java:4448) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:185) + at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4211) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3827) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) +Caused by: java.lang.IllegalStateException: startLine (47) does not match endLine (46) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.text.source.LineNumberRulerColumn$1.run(LineNumberRulerColumn.java:417) + at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:182) + ... 23 more + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:43:05.762 +!MESSAGE Unhandled event loop exception +!STACK 0 +org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.IllegalStateException: startLine (47) does not match endLine (46)) + at org.eclipse.swt.SWT.error(SWT.java:4533) + at org.eclipse.swt.SWT.error(SWT.java:4448) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:185) + at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4211) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3827) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) +Caused by: java.lang.IllegalStateException: startLine (47) does not match endLine (46) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.internal.text.source.DiffPainter.redraw(DiffPainter.java:379) + at org.eclipse.jface.internal.text.source.DiffPainter.access$2(DiffPainter.java:378) + at org.eclipse.jface.internal.text.source.DiffPainter$2.run(DiffPainter.java:368) + at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:182) + ... 23 more + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:43:05.766 +!MESSAGE Unhandled event loop exception +!STACK 0 +org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.IllegalStateException: startLine (47) does not match endLine (46)) + at org.eclipse.swt.SWT.error(SWT.java:4533) + at org.eclipse.swt.SWT.error(SWT.java:4448) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:185) + at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4211) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3827) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) +Caused by: java.lang.IllegalStateException: startLine (47) does not match endLine (46) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.text.source.LineNumberRulerColumn$1.run(LineNumberRulerColumn.java:417) + at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:182) + ... 23 more + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:43:06.125 +!MESSAGE Unhandled event loop exception +!STACK 0 +org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.IllegalStateException: startLine (47) does not match endLine (46)) + at org.eclipse.swt.SWT.error(SWT.java:4533) + at org.eclipse.swt.SWT.error(SWT.java:4448) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:185) + at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4211) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3827) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) +Caused by: java.lang.IllegalStateException: startLine (47) does not match endLine (46) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.text.source.LineNumberRulerColumn$1.run(LineNumberRulerColumn.java:417) + at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:182) + ... 23 more + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:43:07.545 +!MESSAGE Unhandled event loop exception +!STACK 0 +java.lang.IllegalStateException: startLine (47) does not match endLine (46) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.access$10(LineNumberRulerColumn.java:675) + at org.eclipse.jface.text.source.LineNumberRulerColumn$4.paintControl(LineNumberRulerColumn.java:617) + at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:231) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4418) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1079) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1103) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1088) + at org.eclipse.swt.widgets.Composite.WM_PAINT(Composite.java:1688) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4856) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5123) + at org.eclipse.swt.internal.win32.OS.CallWindowProcW(Native Method) + at org.eclipse.swt.internal.win32.OS.CallWindowProc(OS.java:2446) + at org.eclipse.swt.widgets.Tree.callWindowProc(Tree.java:1552) + at org.eclipse.swt.widgets.Tree.WM_LBUTTONDOWN(Tree.java:6759) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4835) + at org.eclipse.swt.widgets.Tree.windowProc(Tree.java:6074) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110) + at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2552) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3822) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:43:14.966 +!MESSAGE Unhandled event loop exception +!STACK 0 +java.lang.IllegalStateException: startLine (47) does not match endLine (46) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.access$10(LineNumberRulerColumn.java:675) + at org.eclipse.jface.text.source.LineNumberRulerColumn$4.paintControl(LineNumberRulerColumn.java:617) + at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:231) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4418) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1079) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1103) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1088) + at org.eclipse.swt.widgets.Composite.WM_PAINT(Composite.java:1688) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4856) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5123) + at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2552) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3822) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:43:17.404 +!MESSAGE Unhandled event loop exception +!STACK 0 +java.lang.IllegalStateException: startLine (47) does not match endLine (46) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.access$10(LineNumberRulerColumn.java:675) + at org.eclipse.jface.text.source.LineNumberRulerColumn$4.paintControl(LineNumberRulerColumn.java:617) + at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:231) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4418) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1079) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1103) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1088) + at org.eclipse.swt.widgets.Composite.WM_PAINT(Composite.java:1688) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4856) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5123) + at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2552) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3822) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:43:17.428 +!MESSAGE Unhandled event loop exception +!STACK 0 +java.lang.IllegalStateException: startLine (47) does not match endLine (46) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.access$10(LineNumberRulerColumn.java:675) + at org.eclipse.jface.text.source.LineNumberRulerColumn$4.paintControl(LineNumberRulerColumn.java:617) + at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:231) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4418) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1079) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1103) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1088) + at org.eclipse.swt.widgets.Composite.WM_PAINT(Composite.java:1688) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:4856) + at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:5123) + at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method) + at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2552) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3822) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:43:23.952 +!MESSAGE Unhandled event loop exception +!STACK 0 +org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.IllegalStateException: startLine (47) does not match endLine (46)) + at org.eclipse.swt.SWT.error(SWT.java:4533) + at org.eclipse.swt.SWT.error(SWT.java:4448) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:185) + at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4211) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3827) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) +Caused by: java.lang.IllegalStateException: startLine (47) does not match endLine (46) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.text.source.LineNumberRulerColumn$1.run(LineNumberRulerColumn.java:417) + at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:182) + ... 23 more + +!ENTRY org.eclipse.ui 4 0 2017-09-12 12:43:24.651 +!MESSAGE Unhandled event loop exception +!STACK 0 +org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.IllegalStateException: startLine (47) does not match endLine (46)) + at org.eclipse.swt.SWT.error(SWT.java:4533) + at org.eclipse.swt.SWT.error(SWT.java:4448) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:185) + at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4211) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3827) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.lang.reflect.Method.invoke(Unknown Source) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) +Caused by: java.lang.IllegalStateException: startLine (47) does not match endLine (46) + at org.eclipse.jface.text.projection.ProjectionMapping.toImageLine(ProjectionMapping.java:459) + at org.eclipse.jface.text.TextViewer.modelLine2WidgetLine(TextViewer.java:5123) + at org.eclipse.jface.text.JFaceTextUtil.modelLineToWidgetLine(JFaceTextUtil.java:247) + at org.eclipse.jface.internal.text.source.DiffPainter.paintLine(DiffPainter.java:216) + at org.eclipse.jface.internal.text.source.DiffPainter.paint(DiffPainter.java:156) + at org.eclipse.jface.text.source.LineNumberChangeRulerColumn.doPaint(LineNumberChangeRulerColumn.java:172) + at org.eclipse.jface.text.source.LineNumberRulerColumn.doubleBufferPaint(LineNumberRulerColumn.java:705) + at org.eclipse.jface.text.source.LineNumberRulerColumn.redraw(LineNumberRulerColumn.java:880) + at org.eclipse.jface.text.source.LineNumberRulerColumn$1.run(LineNumberRulerColumn.java:417) + at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:182) + ... 23 more + +!ENTRY org.eclipse.cdt.core 4 0 2017-09-12 12:44:47.476 +!MESSAGE Error: Cannot run program "arm-none-eabi-gcc": Launching failed +!STACK 0 +java.io.IOException: Cannot run program "arm-none-eabi-gcc": Launching failed + at org.eclipse.cdt.utils.spawner.Spawner.exec(Spawner.java:349) + at org.eclipse.cdt.utils.spawner.Spawner.(Spawner.java:91) + at org.eclipse.cdt.utils.spawner.ProcessFactory.exec(ProcessFactory.java:91) + at org.eclipse.cdt.core.CommandLauncher.execute(CommandLauncher.java:194) + at org.eclipse.cdt.internal.core.BuildRunnerHelper.build(BuildRunnerHelper.java:263) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector.runProgramForLanguage(AbstractBuiltinSpecsDetector.java:759) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector.runForLanguage(AbstractBuiltinSpecsDetector.java:689) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector.runForEachLanguage(AbstractBuiltinSpecsDetector.java:562) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector$1.runInWorkspace(AbstractBuiltinSpecsDetector.java:496) + at org.eclipse.core.internal.resources.InternalWorkspaceJob.run(InternalWorkspaceJob.java:39) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) + +!ENTRY org.eclipse.cdt.core 4 0 2017-09-12 12:44:47.550 +!MESSAGE Error: Cannot run program "arm-none-eabi-g++": Launching failed +!STACK 0 +java.io.IOException: Cannot run program "arm-none-eabi-g++": Launching failed + at org.eclipse.cdt.utils.spawner.Spawner.exec(Spawner.java:349) + at org.eclipse.cdt.utils.spawner.Spawner.(Spawner.java:91) + at org.eclipse.cdt.utils.spawner.ProcessFactory.exec(ProcessFactory.java:91) + at org.eclipse.cdt.core.CommandLauncher.execute(CommandLauncher.java:194) + at org.eclipse.cdt.internal.core.BuildRunnerHelper.build(BuildRunnerHelper.java:263) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector.runProgramForLanguage(AbstractBuiltinSpecsDetector.java:759) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector.runForLanguage(AbstractBuiltinSpecsDetector.java:689) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector.runForEachLanguage(AbstractBuiltinSpecsDetector.java:562) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector$1.runInWorkspace(AbstractBuiltinSpecsDetector.java:496) + at org.eclipse.core.internal.resources.InternalWorkspaceJob.run(InternalWorkspaceJob.java:39) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) + +!ENTRY org.eclipse.cdt.core 4 0 2017-09-12 12:44:47.607 +!MESSAGE Error: Cannot run program "arm-none-eabi-gcc": Launching failed +!STACK 0 +java.io.IOException: Cannot run program "arm-none-eabi-gcc": Launching failed + at org.eclipse.cdt.utils.spawner.Spawner.exec(Spawner.java:349) + at org.eclipse.cdt.utils.spawner.Spawner.(Spawner.java:91) + at org.eclipse.cdt.utils.spawner.ProcessFactory.exec(ProcessFactory.java:91) + at org.eclipse.cdt.core.CommandLauncher.execute(CommandLauncher.java:194) + at org.eclipse.cdt.internal.core.BuildRunnerHelper.build(BuildRunnerHelper.java:263) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector.runProgramForLanguage(AbstractBuiltinSpecsDetector.java:759) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector.runForLanguage(AbstractBuiltinSpecsDetector.java:689) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector.runForEachLanguage(AbstractBuiltinSpecsDetector.java:562) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector$1.runInWorkspace(AbstractBuiltinSpecsDetector.java:496) + at org.eclipse.core.internal.resources.InternalWorkspaceJob.run(InternalWorkspaceJob.java:39) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) + +!ENTRY org.eclipse.cdt.core 4 0 2017-09-12 12:44:47.660 +!MESSAGE Error: Cannot run program "arm-none-eabi-g++": Launching failed +!STACK 0 +java.io.IOException: Cannot run program "arm-none-eabi-g++": Launching failed + at org.eclipse.cdt.utils.spawner.Spawner.exec(Spawner.java:349) + at org.eclipse.cdt.utils.spawner.Spawner.(Spawner.java:91) + at org.eclipse.cdt.utils.spawner.ProcessFactory.exec(ProcessFactory.java:91) + at org.eclipse.cdt.core.CommandLauncher.execute(CommandLauncher.java:194) + at org.eclipse.cdt.internal.core.BuildRunnerHelper.build(BuildRunnerHelper.java:263) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector.runProgramForLanguage(AbstractBuiltinSpecsDetector.java:759) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector.runForLanguage(AbstractBuiltinSpecsDetector.java:689) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector.runForEachLanguage(AbstractBuiltinSpecsDetector.java:562) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector$1.runInWorkspace(AbstractBuiltinSpecsDetector.java:496) + at org.eclipse.core.internal.resources.InternalWorkspaceJob.run(InternalWorkspaceJob.java:39) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) + +!ENTRY org.eclipse.cdt.core 4 0 2017-09-12 12:44:47.720 +!MESSAGE Error: Cannot run program "arm-none-eabi-gcc": Launching failed +!STACK 0 +java.io.IOException: Cannot run program "arm-none-eabi-gcc": Launching failed + at org.eclipse.cdt.utils.spawner.Spawner.exec(Spawner.java:349) + at org.eclipse.cdt.utils.spawner.Spawner.(Spawner.java:91) + at org.eclipse.cdt.utils.spawner.ProcessFactory.exec(ProcessFactory.java:91) + at org.eclipse.cdt.core.CommandLauncher.execute(CommandLauncher.java:194) + at org.eclipse.cdt.internal.core.BuildRunnerHelper.build(BuildRunnerHelper.java:263) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector.runProgramForLanguage(AbstractBuiltinSpecsDetector.java:759) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector.runForLanguage(AbstractBuiltinSpecsDetector.java:689) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector.runForEachLanguage(AbstractBuiltinSpecsDetector.java:562) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector$1.runInWorkspace(AbstractBuiltinSpecsDetector.java:496) + at org.eclipse.core.internal.resources.InternalWorkspaceJob.run(InternalWorkspaceJob.java:39) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) + +!ENTRY org.eclipse.cdt.core 4 0 2017-09-12 12:44:47.777 +!MESSAGE Error: Cannot run program "arm-none-eabi-g++": Launching failed +!STACK 0 +java.io.IOException: Cannot run program "arm-none-eabi-g++": Launching failed + at org.eclipse.cdt.utils.spawner.Spawner.exec(Spawner.java:349) + at org.eclipse.cdt.utils.spawner.Spawner.(Spawner.java:91) + at org.eclipse.cdt.utils.spawner.ProcessFactory.exec(ProcessFactory.java:91) + at org.eclipse.cdt.core.CommandLauncher.execute(CommandLauncher.java:194) + at org.eclipse.cdt.internal.core.BuildRunnerHelper.build(BuildRunnerHelper.java:263) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector.runProgramForLanguage(AbstractBuiltinSpecsDetector.java:759) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector.runForLanguage(AbstractBuiltinSpecsDetector.java:689) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector.runForEachLanguage(AbstractBuiltinSpecsDetector.java:562) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector$1.runInWorkspace(AbstractBuiltinSpecsDetector.java:496) + at org.eclipse.core.internal.resources.InternalWorkspaceJob.run(InternalWorkspaceJob.java:39) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) + +!ENTRY org.eclipse.cdt.core 4 0 2017-09-12 12:44:47.837 +!MESSAGE Error: Cannot run program "arm-none-eabi-gcc": Launching failed +!STACK 0 +java.io.IOException: Cannot run program "arm-none-eabi-gcc": Launching failed + at org.eclipse.cdt.utils.spawner.Spawner.exec(Spawner.java:349) + at org.eclipse.cdt.utils.spawner.Spawner.(Spawner.java:91) + at org.eclipse.cdt.utils.spawner.ProcessFactory.exec(ProcessFactory.java:91) + at org.eclipse.cdt.core.CommandLauncher.execute(CommandLauncher.java:194) + at org.eclipse.cdt.internal.core.BuildRunnerHelper.build(BuildRunnerHelper.java:263) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector.runProgramForLanguage(AbstractBuiltinSpecsDetector.java:759) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector.runForLanguage(AbstractBuiltinSpecsDetector.java:689) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector.runForEachLanguage(AbstractBuiltinSpecsDetector.java:562) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector$1.runInWorkspace(AbstractBuiltinSpecsDetector.java:496) + at org.eclipse.core.internal.resources.InternalWorkspaceJob.run(InternalWorkspaceJob.java:39) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) + +!ENTRY org.eclipse.cdt.core 4 0 2017-09-12 12:44:47.898 +!MESSAGE Error: Cannot run program "arm-none-eabi-g++": Launching failed +!STACK 0 +java.io.IOException: Cannot run program "arm-none-eabi-g++": Launching failed + at org.eclipse.cdt.utils.spawner.Spawner.exec(Spawner.java:349) + at org.eclipse.cdt.utils.spawner.Spawner.(Spawner.java:91) + at org.eclipse.cdt.utils.spawner.ProcessFactory.exec(ProcessFactory.java:91) + at org.eclipse.cdt.core.CommandLauncher.execute(CommandLauncher.java:194) + at org.eclipse.cdt.internal.core.BuildRunnerHelper.build(BuildRunnerHelper.java:263) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector.runProgramForLanguage(AbstractBuiltinSpecsDetector.java:759) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector.runForLanguage(AbstractBuiltinSpecsDetector.java:689) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector.runForEachLanguage(AbstractBuiltinSpecsDetector.java:562) + at org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector$1.runInWorkspace(AbstractBuiltinSpecsDetector.java:496) + at org.eclipse.core.internal.resources.InternalWorkspaceJob.run(InternalWorkspaceJob.java:39) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) + +!ENTRY org.eclipse.cdt.core 1 0 2017-09-12 12:44:47.913 +!MESSAGE Indexed 'HAL' (0 sources, 0 headers) in 0 sec: 0 declarations; 0 references; 0 unresolved inclusions; 0 syntax errors; 0 unresolved names (0%) + +!ENTRY org.tigris.subversion.subclipse.core 4 0 2017-09-12 12:44:47.916 +!MESSAGE Could not auto-share project HAL +!STACK 1 +org.tigris.subversion.subclipse.core.SVNException: Provided SVN information does not match that on disk for project 'HAL'. + at org.tigris.subversion.subclipse.core.resources.SVNWorkspaceRoot.setSharing(SVNWorkspaceRoot.java:206) + at org.tigris.subversion.subclipse.core.SVNTeamProviderType$AutoShareJob.autoconnectSVNProject(SVNTeamProviderType.java:140) + at org.tigris.subversion.subclipse.core.SVNTeamProviderType$AutoShareJob.run(SVNTeamProviderType.java:106) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +!SUBENTRY 1 org.tigris.subversion.subclipse.core 4 4 2017-09-12 12:44:47.917 +!MESSAGE Provided SVN information does not match that on disk for project 'HAL'. + +!ENTRY org.eclipse.equinox.p2.metadata.repository 4 1000 2017-09-12 12:49:35.678 +!MESSAGE No repository found at http://matclipse.eclipselabs.org.codespot.com/git.update/. + +!ENTRY org.eclipse.equinox.p2.metadata.repository 4 1000 2017-09-12 12:49:39.306 +!MESSAGE No repository found at https://github.com/krystophny/matclipse.git/git.update. + +!ENTRY org.eclipse.equinox.p2.metadata.repository 4 1000 2017-09-12 12:49:44.671 +!MESSAGE No repository found at https://github.com/krystophny/matclipse.git. diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.mylyn/repositories.xml.zip b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.mylyn/repositories.xml.zip new file mode 100644 index 0000000..2235d06 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.mylyn/repositories.xml.zip differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/com.collabnet.ee.tracker.core/repositoryConfigurations b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/com.collabnet.ee.tracker.core/repositoryConfigurations new file mode 100644 index 0000000..4170ef3 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/com.collabnet.ee.tracker.core/repositoryConfigurations differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/com.collabnet.ee.tracker.ui/dialog_settings.xml b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/com.collabnet.ee.tracker.ui/dialog_settings.xml new file mode 100644 index 0000000..1ef2b05 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/com.collabnet.ee.tracker.ui/dialog_settings.xml @@ -0,0 +1,3 @@ + +
+
diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.core/.log b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.core/.log new file mode 100644 index 0000000..5c45ce5 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.core/.log @@ -0,0 +1,5 @@ +*** SESSION sep. 08, 2017 14:48:18.37 ------------------------------------------ +*** SESSION sep. 08, 2017 15:45:22.37 ------------------------------------------ +*** SESSION sep. 11, 2017 08:26:16.00 ------------------------------------------ +*** SESSION sep. 12, 2017 09:08:37.66 ------------------------------------------ +*** SESSION sep. 12, 2017 12:28:02.99 ------------------------------------------ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.core/FreeRTOS.1505200569341.pdom b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.core/FreeRTOS.1505200569341.pdom new file mode 100644 index 0000000..ae30443 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.core/FreeRTOS.1505200569341.pdom differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.core/FreeRTOS.language.settings.xml b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.core/FreeRTOS.language.settings.xml new file mode 100644 index 0000000..d55248d --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.core/FreeRTOS.language.settings.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.core/HAL.1505213087904.pdom b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.core/HAL.1505213087904.pdom new file mode 100644 index 0000000..6147cf6 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.core/HAL.1505213087904.pdom differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.core/HAL.language.settings.xml b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.core/HAL.language.settings.xml new file mode 100644 index 0000000..379756f --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.core/HAL.language.settings.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.core/STM32F10x_StdPeriph_Lib_V3.5.0.1505113747629.pdom b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.core/STM32F10x_StdPeriph_Lib_V3.5.0.1505113747629.pdom new file mode 100644 index 0000000..e7b6712 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.core/STM32F10x_StdPeriph_Lib_V3.5.0.1505113747629.pdom differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.core/STM32F10x_StdPeriph_Lib_V3.5.0.language.settings.xml b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.core/STM32F10x_StdPeriph_Lib_V3.5.0.language.settings.xml new file mode 100644 index 0000000..91d5f40 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.core/STM32F10x_StdPeriph_Lib_V3.5.0.language.settings.xml @@ -0,0 +1,4241 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.core/hsb-mrts.1504878451559.pdom b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.core/hsb-mrts.1504878451559.pdom new file mode 100644 index 0000000..773bd24 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.core/hsb-mrts.1504878451559.pdom differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.core/hsb-mrts.language.settings.xml b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.core/hsb-mrts.language.settings.xml new file mode 100644 index 0000000..27be8e2 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.core/hsb-mrts.language.settings.xml @@ -0,0 +1,4241 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.core/shareddefaults.xml b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.core/shareddefaults.xml new file mode 100644 index 0000000..b7189d7 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.core/shareddefaults.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c @@ -0,0 +1 @@ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.make.core/specs.cpp b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.make.core/specs.cpp new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.make.core/specs.cpp @@ -0,0 +1 @@ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.make.ui/dialog_settings.xml b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.make.ui/dialog_settings.xml new file mode 100644 index 0000000..9e62c4b --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.make.ui/dialog_settings.xml @@ -0,0 +1,5 @@ + +
+
+
+
diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.c new file mode 100644 index 0000000..e69de29 diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.ui/FreeRTOS.build.log b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.ui/FreeRTOS.build.log new file mode 100644 index 0000000..f7a3dd5 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.ui/FreeRTOS.build.log @@ -0,0 +1,2 @@ +Build stopped +() \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.ui/STM32F10x_StdPeriph_Lib_V3.5.0.build.log b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.ui/STM32F10x_StdPeriph_Lib_V3.5.0.build.log new file mode 100644 index 0000000..33604b2 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.ui/STM32F10x_StdPeriph_Lib_V3.5.0.build.log @@ -0,0 +1,15 @@ +10:07:11 **** Build of configuration Debug for project STM32F10x_StdPeriph_Lib_V3.5.0 **** +make all +Building file: ../Libraries/STM32F10x_StdPeriph_Driver/src/misc.c +Invoking: MCU GCC Compiler +C:\workspace\0387-hsb-mrts\trunk\S - Software\0 - HSB MRTS Kathode-MCP\3 - Implementation\0 - Code\STM32F10x_StdPeriph_Lib_V3.5.0\Debug +arm-none-eabi-gcc -mthumb -mfloat-abi=soft -I"C:/workspace/0387-hsb-mrts/trunk/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc" -I"C:/workspace/0387-hsb-mrts/trunk/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport" -I"C:/workspace/0387-hsb-mrts/trunk/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x" -O2 -g3 -Wall -Werror -fmessage-length=0 -ffunction-sections -c -MMD -MP -MF"Libraries/STM32F10x_StdPeriph_Driver/src/misc.d" -MT"Libraries/STM32F10x_StdPeriph_Driver/src/misc.o" -o "Libraries/STM32F10x_StdPeriph_Driver/src/misc.o" "../Libraries/STM32F10x_StdPeriph_Driver/src/misc.c" +../Libraries/STM32F10x_StdPeriph_Driver/src/misc.c: In function 'NVIC_PriorityGroupConfig': +../Libraries/STM32F10x_StdPeriph_Driver/src/misc.c:99:3: error: implicit declaration of function 'assert_param' [-Werror=implicit-function-declaration] + assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup)); + ^ +cc1.exe: all warnings being treated as errors +make: *** [Libraries/STM32F10x_StdPeriph_Driver/src/misc.o] Error 1 + +10:07:11 Build Finished (took 655ms) + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.ui/dialog_settings.xml b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.ui/dialog_settings.xml new file mode 100644 index 0000000..2259bf0 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.ui/dialog_settings.xml @@ -0,0 +1,28 @@ + +
+ + + + + + + + + + + +
+
+
+ + + + + +
+
+ +
+
+
+
diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.ui/global-build.log b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.ui/global-build.log new file mode 100644 index 0000000..194c385 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.ui/global-build.log @@ -0,0 +1,23 @@ +12:43:23 **** Build of configuration Debug for project hsb-mrts **** +make All +Building file: ../src/main.c +Invoking: MCU GCC Compiler +C:\workspace\0387-hsb-mrts\trunk\S - Software\0 - HSB MRTS Kathode-MCP\3 - Implementation\0 - Code\hsb-mrts\Debug +arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -mfloat-abi=soft -DSTM32F107VCTx -DSTM32F1 -DSTM32 -DDEBUG -I"C:/workspace/0387-hsb-mrts/trunk/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/hsb-mrts/inc" -I"C:/workspace/0387-hsb-mrts/trunk/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CM3" -I"C:/workspace/0387-hsb-mrts/trunk/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/include" -O0 -g3 -Wall -fmessage-length=0 -ffunction-sections -c -MMD -MP -MF"src/main.d" -MT"src/main.o" -o "src/main.o" "../src/main.c" +Finished building: ../src/main.c + +Building target: hsb-mrts.elf +Invoking: MCU GCC Linker +arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -mfloat-abi=soft -Wl,-Map=output.map -Wl,--gc-sections -o "hsb-mrts.elf" @"objects.list" -lm +src/freeRTOSFixes.o: In function `_init': +C:\workspace\0387-hsb-mrts\trunk\S - Software\0 - HSB MRTS Kathode-MCP\3 - Implementation\0 - Code\hsb-mrts\Debug/../src/freeRTOSFixes.c:61: multiple definition of `_init' +c:/users/mmi/.p2/pool/plugins/fr.ac6.mcu.externaltools.arm-none.win32_1.13.3.201707031232/tools/compiler/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m/crti.o:(.init+0x0): first defined here +startup/sysmem.o: In function `_sbrk': +C:\workspace\0387-hsb-mrts\trunk\S - Software\0 - HSB MRTS Kathode-MCP\3 - Implementation\0 - Code\hsb-mrts\Debug/../startup/sysmem.c:63: multiple definition of `_sbrk' +src/freeRTOSFixes.o:freeRTOSFixes.c:(.text._sbrk+0x0): first defined here +c:/users/mmi/.p2/pool/plugins/fr.ac6.mcu.externaltools.arm-none.win32_1.13.3.201707031232/tools/compiler/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libc.a(lib_a-exit.o): In function `exit': +exit.c:(.text.exit+0x16): undefined reference to `_exit' +src/main.o: In function `main': +C:\workspace\0387-hsb-mrts\trunk\S - Software\0 - HSB MRTS Kathode-MCP\3 - Implementation\0 - Code\hsb-mrts\Debug/../src/main.c:72: undefined reference to `vTaskStartScheduler' +collect2.exe: error: ld returned 1 exit status +make: *** [hsb-mrts.elf] Error 1 diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.ui/hsb-mrts.build.log b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.ui/hsb-mrts.build.log new file mode 100644 index 0000000..8aaa4b9 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.cdt.ui/hsb-mrts.build.log @@ -0,0 +1,26 @@ +12:43:23 **** Build of configuration Debug for project hsb-mrts **** +make All +Building file: ../src/main.c +Invoking: MCU GCC Compiler +C:\workspace\0387-hsb-mrts\trunk\S - Software\0 - HSB MRTS Kathode-MCP\3 - Implementation\0 - Code\hsb-mrts\Debug +arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -mfloat-abi=soft -DSTM32F107VCTx -DSTM32F1 -DSTM32 -DDEBUG -I"C:/workspace/0387-hsb-mrts/trunk/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/hsb-mrts/inc" -I"C:/workspace/0387-hsb-mrts/trunk/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CM3" -I"C:/workspace/0387-hsb-mrts/trunk/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/include" -O0 -g3 -Wall -fmessage-length=0 -ffunction-sections -c -MMD -MP -MF"src/main.d" -MT"src/main.o" -o "src/main.o" "../src/main.c" +Finished building: ../src/main.c + +Building target: hsb-mrts.elf +Invoking: MCU GCC Linker +arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -mfloat-abi=soft -Wl,-Map=output.map -Wl,--gc-sections -o "hsb-mrts.elf" @"objects.list" -lm +src/freeRTOSFixes.o: In function `_init': +C:\workspace\0387-hsb-mrts\trunk\S - Software\0 - HSB MRTS Kathode-MCP\3 - Implementation\0 - Code\hsb-mrts\Debug/../src/freeRTOSFixes.c:61: multiple definition of `_init' +c:/users/mmi/.p2/pool/plugins/fr.ac6.mcu.externaltools.arm-none.win32_1.13.3.201707031232/tools/compiler/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m/crti.o:(.init+0x0): first defined here +startup/sysmem.o: In function `_sbrk': +C:\workspace\0387-hsb-mrts\trunk\S - Software\0 - HSB MRTS Kathode-MCP\3 - Implementation\0 - Code\hsb-mrts\Debug/../startup/sysmem.c:63: multiple definition of `_sbrk' +src/freeRTOSFixes.o:freeRTOSFixes.c:(.text._sbrk+0x0): first defined here +c:/users/mmi/.p2/pool/plugins/fr.ac6.mcu.externaltools.arm-none.win32_1.13.3.201707031232/tools/compiler/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libc.a(lib_a-exit.o): In function `exit': +exit.c:(.text.exit+0x16): undefined reference to `_exit' +src/main.o: In function `main': +C:\workspace\0387-hsb-mrts\trunk\S - Software\0 - HSB MRTS Kathode-MCP\3 - Implementation\0 - Code\hsb-mrts\Debug/../src/main.c:72: undefined reference to `vTaskStartScheduler' +collect2.exe: error: ld returned 1 exit status +make: *** [hsb-mrts.elf] Error 1 + +12:43:23 Build Finished (took 846ms) + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/10/b03a60089d9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/10/b03a60089d9400171201ed9ff9474498 new file mode 100644 index 0000000..e1b89ae --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/10/b03a60089d9400171201ed9ff9474498 @@ -0,0 +1,68 @@ +;/* +; FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. +; All rights reserved +; +; +; *************************************************************************** +; * * +; * FreeRTOS tutorial books are available in pdf and paperback. * +; * Complete, revised, and edited pdf reference manuals are also * +; * available. * +; * * +; * Purchasing FreeRTOS documentation will not only help you, by * +; * ensuring you get running as quickly as possible and with an * +; * in-depth knowledge of how to use FreeRTOS, it will also help * +; * the FreeRTOS project to continue with its mission of providing * +; * professional grade, cross platform, de facto standard solutions * +; * for microcontrollers - completely free of charge! * +; * * +; * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * +; * * +; * Thank you for using FreeRTOS, and thank you for your support! * +; * * +; *************************************************************************** +; +; +; This file is part of the FreeRTOS distribution. +; +; FreeRTOS is free software; you can redistribute it and/or modify it under +; the terms of the GNU General Public License (version 2) as published by the +; Free Software Foundation AND MODIFIED BY the FreeRTOS exception. +; >>>NOTE<<< The modification to the GPL is included to allow you to +; distribute a combined work that includes FreeRTOS without being obliged to +; provide the source code for proprietary components outside of the FreeRTOS +; kernel. FreeRTOS is distributed in the hope that it will be useful, but +; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +; more details. You should have received a copy of the GNU General Public +; License and the FreeRTOS license exception along with FreeRTOS; if not it +; can be viewed here: http://www.freertos.org/a00114.html and also obtained +; by writing to Richard Barry, contact details for whom are available on the +; FreeRTOS WEB site. +; +; 1 tab == 4 spaces! +; +; http://www.FreeRTOS.org - Documentation, latest information, license and +; contact details. +; +; http://www.SafeRTOS.com - A version that is certified for use in safety +; critical systems. +; +; http://www.OpenRTOS.com - Commercial support, development, porting, +; licensing and training services. +;*/ + .GLB _vSoftwareInterruptISR + .GLB _vSoftwareInterruptEntry + + .SECTION P,CODE + +_vSoftwareInterruptEntry: + + BRA _vSoftwareInterruptISR + + .RVECTOR 27, _vSoftwareInterruptEntry + + .END + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/13/60543d439a970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/13/60543d439a970017138fe0bf747e5677 new file mode 100644 index 0000000..633479a --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/13/60543d439a970017138fe0bf747e5677 @@ -0,0 +1,210 @@ +/* +****************************************************************************** +** +** File : LinkerScript.ld +** +** Author : Auto-generated by Ac6 System Workbench +** +** Abstract : Linker script for STM32F107VCTx Device from STM32F1 series +** 64Kbytes RAM +** 256Kbytes ROM +** +** Set heap size, stack size and stack location according +** to application requirements. +** +** Set memory bank area and size if external memory is used. +** +** Target : STMicroelectronics STM32 +** +** Distribution: The file is distributed “as is,” without any warranty +** of any kind. +** +***************************************************************************** +** @attention +** +**

© COPYRIGHT(c) 2017 Ac6

+** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** 1. Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** 3. Neither the name of Ac6 nor the names of its contributors +** may be used to endorse or promote products derived from this software +** without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +***************************************************************************** +*/ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = 0x20010000; /* end of RAM */ + +_Min_Heap_Size = 0; /* required amount of heap */ +_Min_Stack_Size = 0x400; /* required amount of stack */ + +/* Memories definition */ +MEMORY +{ + RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K + ROM (rx) : ORIGIN = 0x8000000, LENGTH = 256K +} + +/* Sections */ +SECTIONS +{ + /* The startup code into ROM memory */ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } >ROM + + /* The program code and other data into ROM memory */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + } >ROM + + /* Constant data into ROM memory*/ + .rodata : + { + . = ALIGN(4); + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + . = ALIGN(4); + } >ROM + + .ARM.extab : { + . = ALIGN(4); + *(.ARM.extab* .gnu.linkonce.armextab.*) + . = ALIGN(4); + } >ROM + + .ARM : { + . = ALIGN(4); + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + . = ALIGN(4); + } >ROM + + .preinit_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + . = ALIGN(4); + } >ROM + + .init_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + . = ALIGN(4); + } >ROM + + .fini_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + . = ALIGN(4); + } >ROM + + /* Used by the startup to initialize data */ + _sidata = LOADADDR(.data); + + /* Initialized data sections into RAM memory */ + .data : + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + } >RAM AT> ROM + + + /* Uninitialized data section into RAM memory */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM + + /* User_heap_stack section, used to check that there is enough RAM left */ + ._user_heap_stack : + { + . = ALIGN(8); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(8); + } >RAM + + + + /* Remove information from the compiler libraries */ +/* /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } +*/ + .ARM.attributes 0 : { *(.ARM.attributes) } + + GROUP{ + libgcc.a + libg.a + libc.a + libm.a + libnosys.a + } +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/14/e046308296970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/14/e046308296970017138fe0bf747e5677 new file mode 100644 index 0000000..6503f2f --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/14/e046308296970017138fe0bf747e5677 @@ -0,0 +1,134 @@ +ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +heap_4.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +STM32_CORE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) \ +-I$(STM32_CORE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -fno-common -mcpu=cortex-m3 -mthumb $(RELEASE_DEFINES) $(INCLUDES) +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -nostartfiles -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map +release: export LDARCHIVES := -L. -L$(STM32_STDPERIPH_ROOT) -lSTM_StdPeriph -lhsb_mrts_release +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -f hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + rm -rf obj_release + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +else + +vpath %.c \ +src \ +startup \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport + +vpath %.s \ +startup +vpath %.o \ +obj_release + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) $(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)/$@ + +$(OBJ_DIR): + mkdir -p $@ + +endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/15/913f67089d9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/15/913f67089d9400171201ed9ff9474498 new file mode 100644 index 0000000..e725ca2 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/15/913f67089d9400171201ed9ff9474498 @@ -0,0 +1,214 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the MSP430 port. + *----------------------------------------------------------*/ + +/* Constants required for hardware setup. The tick ISR runs off the ACLK, +not the MCLK. */ +#define portACLK_FREQUENCY_HZ ( ( TickType_t ) 32768 ) +#define portINITIAL_CRITICAL_NESTING ( ( uint16_t ) 10 ) +#define portFLAGS_INT_ENABLED ( ( StackType_t ) 0x08 ) + +/* We require the address of the pxCurrentTCB variable, but don't want to know +any details of its type. */ +typedef void TCB_t; +extern volatile TCB_t * volatile pxCurrentTCB; + +/* Each task maintains a count of the critical section nesting depth. Each +time a critical section is entered the count is incremented. Each time a +critical section is exited the count is decremented - with interrupts only +being re-enabled if the count is zero. + +usCriticalNesting will get set to zero when the scheduler starts, but must +not be initialised to zero as this will cause problems during the startup +sequence. */ +volatile uint16_t usCriticalNesting = portINITIAL_CRITICAL_NESTING; +/*-----------------------------------------------------------*/ + + +/* + * Sets up the periodic ISR used for the RTOS tick. This uses timer 0, but + * could have alternatively used the watchdog timer or timer 1. + */ +void prvSetupTimerInterrupt( void ); +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been called. + * + * See the header file portable.h. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* + Place a few bytes of known values on the bottom of the stack. + This is just useful for debugging and can be included if required. + + *pxTopOfStack = ( StackType_t ) 0x1111; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x2222; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x3333; + pxTopOfStack--; + */ + + /* The msp430 automatically pushes the PC then SR onto the stack before + executing an ISR. We want the stack to look just as if this has happened + so place a pointer to the start of the task on the stack first - followed + by the flags we want the task to use when it starts up. */ + *pxTopOfStack = ( StackType_t ) pxCode; + pxTopOfStack--; + *pxTopOfStack = portFLAGS_INT_ENABLED; + pxTopOfStack--; + + /* Next the general purpose registers. */ + *pxTopOfStack = ( StackType_t ) 0x4444; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x5555; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x6666; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x7777; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x8888; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x9999; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xaaaa; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xbbbb; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xcccc; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xdddd; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xeeee; + pxTopOfStack--; + + /* When the task starts is will expect to find the function parameter in + R15. */ + *pxTopOfStack = ( StackType_t ) pvParameters; + pxTopOfStack--; + + /* A variable is used to keep track of the critical section nesting. + This variable has to be stored as part of the task context and is + initially set to zero. */ + *pxTopOfStack = ( StackType_t ) portNO_CRITICAL_SECTION_NESTING; + + /* Return a pointer to the top of the stack we have generated so this can + be stored in the task control block for the task. */ + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the MSP430 port will get stopped. If required simply + disable the tick interrupt here. */ +} +/*-----------------------------------------------------------*/ + +/* + * Hardware initialisation to generate the RTOS tick. This uses timer 0 + * but could alternatively use the watchdog timer or timer 1. + */ +void prvSetupTimerInterrupt( void ) +{ + /* Ensure the timer is stopped. */ + TACTL = 0; + + /* Run the timer of the ACLK. */ + TACTL = TASSEL_1; + + /* Clear everything to start with. */ + TACTL |= TACLR; + + /* Set the compare match value according to the tick rate we want. */ + TACCR0 = portACLK_FREQUENCY_HZ / configTICK_RATE_HZ; + + /* Enable the interrupts. */ + TACCTL0 = CCIE; + + /* Start up clean. */ + TACTL |= TACLR; + + /* Up mode. */ + TACTL |= MC_1; +} +/*-----------------------------------------------------------*/ + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/15/d0714f089d9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/15/d0714f089d9400171201ed9ff9474498 new file mode 100644 index 0000000..7a75209 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/15/d0714f089d9400171201ed9ff9474498 @@ -0,0 +1,286 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* +Changes from V1.00: + + + Call to taskYIELD() from within tick ISR has been replaced by the more + efficient portSWITCH_CONTEXT(). + + ISR function definitions renamed to include the prv prefix. + +Changes from V2.6.1 + + + Replaced the sUsingPreemption variable with the configUSE_PREEMPTION + macro to be consistent with the later ports. +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the Flashlite 186 + * port. + *----------------------------------------------------------*/ + +#include +#include +#include + +#include "FreeRTOS.h" +#include "task.h" +#include "portasm.h" + +/*lint -e950 Non ANSI reserved words okay in this file only. */ + +#define portTIMER_EOI_TYPE ( 8 ) +#define portRESET_PIC() portOUTPUT_WORD( ( uint16_t ) 0xff22, portTIMER_EOI_TYPE ) +#define portTIMER_INT_NUMBER 0x12 + +#define portTIMER_1_CONTROL_REGISTER ( ( uint16_t ) 0xff5e ) +#define portTIMER_0_CONTROL_REGISTER ( ( uint16_t ) 0xff56 ) +#define portTIMER_INTERRUPT_ENABLE ( ( uint16_t ) 0x2000 ) + +/* Setup the hardware to generate the required tick frequency. */ +static void prvSetTickFrequency( uint32_t ulTickRateHz ); + +/* Set the hardware back to the state as per before the scheduler started. */ +static void prvExitFunction( void ); + +/* The ISR used depends on whether the preemptive or cooperative scheduler +is being used. */ +#if( configUSE_PREEMPTION == 1 ) + /* Tick service routine used by the scheduler when preemptive scheduling is + being used. */ + static void __interrupt __far prvPreemptiveTick( void ); +#else + /* Tick service routine used by the scheduler when cooperative scheduling is + being used. */ + static void __interrupt __far prvNonPreemptiveTick( void ); +#endif + +/* Trap routine used by taskYIELD() to manually cause a context switch. */ +static void __interrupt __far prvYieldProcessor( void ); + +/*lint -e956 File scopes necessary here. */ + +/* Set true when the vectors are set so the scheduler will service the tick. */ +static BaseType_t xSchedulerRunning = pdFALSE; + +/* Points to the original routine installed on the vector we use for manual +context switches. This is then used to restore the original routine during +prvExitFunction(). */ +static void ( __interrupt __far *pxOldSwitchISR )(); + +/* Used to restore the original DOS context when the scheduler is ended. */ +static jmp_buf xJumpBuf; + +/*lint +e956 */ + +/*-----------------------------------------------------------*/ +BaseType_t xPortStartScheduler( void ) +{ + /* This is called with interrupts already disabled. */ + + /* Remember what was on the interrupts we are going to use + so we can put them back later if required. */ + pxOldSwitchISR = _dos_getvect( portSWITCH_INT_NUMBER ); + + /* Put our manual switch (yield) function on a known + vector. */ + _dos_setvect( portSWITCH_INT_NUMBER, prvYieldProcessor ); + + #if( configUSE_PREEMPTION == 1 ) + { + /* Put our tick switch function on the timer interrupt. */ + _dos_setvect( portTIMER_INT_NUMBER, prvPreemptiveTick ); + } + #else + { + /* We want the timer interrupt to just increment the tick count. */ + _dos_setvect( portTIMER_INT_NUMBER, prvNonPreemptiveTick ); + } + #endif + + prvSetTickFrequency( configTICK_RATE_HZ ); + + /* Clean up function if we want to return to DOS. */ + if( setjmp( xJumpBuf ) != 0 ) + { + prvExitFunction(); + xSchedulerRunning = pdFALSE; + } + else + { + xSchedulerRunning = pdTRUE; + + /* Kick off the scheduler by setting up the context of the first task. */ + portFIRST_CONTEXT(); + } + + return xSchedulerRunning; +} +/*-----------------------------------------------------------*/ + +/* The ISR used depends on whether the preemptive or cooperative scheduler +is being used. */ +#if( configUSE_PREEMPTION == 1 ) + static void __interrupt __far prvPreemptiveTick( void ) + { + /* Get the scheduler to update the task states following the tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Switch in the context of the next task to be run. */ + portSWITCH_CONTEXT(); + } + + /* Reset the PIC ready for the next time. */ + portRESET_PIC(); + } +#else + static void __interrupt __far prvNonPreemptiveTick( void ) + { + /* Same as preemptive tick, but the cooperative scheduler is being used + so we don't have to switch in the context of the next task. */ + xTaskIncrementTick(); + portRESET_PIC(); + } +#endif +/*-----------------------------------------------------------*/ + +static void __interrupt __far prvYieldProcessor( void ) +{ + /* Switch in the context of the next task to be run. */ + portSWITCH_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Jump back to the processor state prior to starting the + scheduler. This means we are not going to be using a + task stack frame so the task can be deleted. */ + longjmp( xJumpBuf, 1 ); +} +/*-----------------------------------------------------------*/ + +static void prvExitFunction( void ) +{ +const uint16_t usTimerDisable = 0x0000; +uint16_t usTimer0Control; + + /* Interrupts should be disabled here anyway - but no + harm in making sure. */ + portDISABLE_INTERRUPTS(); + if( xSchedulerRunning == pdTRUE ) + { + /* Put back the switch interrupt routines that was in place + before the scheduler started. */ + _dos_setvect( portSWITCH_INT_NUMBER, pxOldSwitchISR ); + } + + /* Disable the timer used for the tick to ensure the scheduler is + not called before restoring interrupts. There was previously nothing + on this timer so there is no old ISR to restore. */ + portOUTPUT_WORD( portTIMER_1_CONTROL_REGISTER, usTimerDisable ); + + /* Restart the DOS tick. */ + usTimer0Control = portINPUT_WORD( portTIMER_0_CONTROL_REGISTER ); + usTimer0Control |= portTIMER_INTERRUPT_ENABLE; + portOUTPUT_WORD( portTIMER_0_CONTROL_REGISTER, usTimer0Control ); + + + portENABLE_INTERRUPTS(); +} +/*-----------------------------------------------------------*/ + +static void prvSetTickFrequency( uint32_t ulTickRateHz ) +{ +const uint16_t usMaxCountRegister = 0xff5a; +const uint16_t usTimerPriorityRegister = 0xff32; +const uint16_t usTimerEnable = 0xC000; +const uint16_t usRetrigger = 0x0001; +const uint16_t usTimerHighPriority = 0x0000; +uint16_t usTimer0Control; + +/* ( CPU frequency / 4 ) / clock 2 max count [inpw( 0xff62 ) = 7] */ + +const uint32_t ulClockFrequency = ( uint32_t ) 0x7f31a0UL; + +uint32_t ulTimerCount = ulClockFrequency / ulTickRateHz; + + portOUTPUT_WORD( portTIMER_1_CONTROL_REGISTER, usTimerEnable | portTIMER_INTERRUPT_ENABLE | usRetrigger ); + portOUTPUT_WORD( usMaxCountRegister, ( uint16_t ) ulTimerCount ); + portOUTPUT_WORD( usTimerPriorityRegister, usTimerHighPriority ); + + /* Stop the DOS tick - don't do this if you want to maintain a TOD clock. */ + usTimer0Control = portINPUT_WORD( portTIMER_0_CONTROL_REGISTER ); + usTimer0Control &= ~portTIMER_INTERRUPT_ENABLE; + portOUTPUT_WORD( portTIMER_0_CONTROL_REGISTER, usTimer0Control ); +} + + +/*lint +e950 */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/16/70be1b619c970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/16/70be1b619c970017138fe0bf747e5677 new file mode 100644 index 0000000..7966c55 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/16/70be1b619c970017138fe0bf747e5677 @@ -0,0 +1,205 @@ +/* +****************************************************************************** +** +** File : LinkerScript.ld +** +** Author : Auto-generated by Ac6 System Workbench +** +** Abstract : Linker script for STM32F107VCTx Device from STM32F1 series +** 64Kbytes RAM +** 256Kbytes ROM +** +** Set heap size, stack size and stack location according +** to application requirements. +** +** Set memory bank area and size if external memory is used. +** +** Target : STMicroelectronics STM32 +** +** Distribution: The file is distributed “as is,” without any warranty +** of any kind. +** +***************************************************************************** +** @attention +** +**

© COPYRIGHT(c) 2017 Ac6

+** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** 1. Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** 3. Neither the name of Ac6 nor the names of its contributors +** may be used to endorse or promote products derived from this software +** without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +***************************************************************************** +*/ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = 0x20010000; /* end of RAM */ + +_Min_Heap_Size = 0; /* required amount of heap */ +_Min_Stack_Size = 0x400; /* required amount of stack */ + +/* Memories definition */ +MEMORY +{ + RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K + ROM (rx) : ORIGIN = 0x8000000, LENGTH = 256K +} + +/* Sections */ +SECTIONS +{ + /* The startup code into ROM memory */ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } >ROM + + /* The program code and other data into ROM memory */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + } >ROM + + /* Constant data into ROM memory*/ + .rodata : + { + . = ALIGN(4); + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + . = ALIGN(4); + } >ROM + + .ARM.extab : { + . = ALIGN(4); + *(.ARM.extab* .gnu.linkonce.armextab.*) + . = ALIGN(4); + } >ROM + + .ARM : { + . = ALIGN(4); + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + . = ALIGN(4); + } >ROM + + .preinit_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + . = ALIGN(4); + } >ROM + + .init_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + . = ALIGN(4); + } >ROM + + .fini_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + . = ALIGN(4); + } >ROM + + /* Used by the startup to initialize data */ + _sidata = LOADADDR(.data); + + /* Initialized data sections into RAM memory */ + .data : + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + } >RAM AT> ROM + + + /* Uninitialized data section into RAM memory */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM + + /* User_heap_stack section, used to check that there is enough RAM left */ + ._user_heap_stack : + { + . = ALIGN(8); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(8); + } >RAM + + + + /* Remove information from the compiler libraries */ +/* /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } +*/ + GROUP (libc.a) + + .ARM.attributes 0 : { *(.ARM.attributes) } + +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/17/7087a577c596001713a7ede92b37d6f1 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/17/7087a577c596001713a7ede92b37d6f1 new file mode 100644 index 0000000..e0bd197 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/17/7087a577c596001713a7ede92b37d6f1 @@ -0,0 +1,59 @@ +# STM support library + +SRC_DIR = Libraries/STM32F10x_StdPeriph_Driver/src/ +INC_DIR = Libraries/STM32F10x_StdPeriph_Driver/inc/ Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/ +OBJ_DIR = Libraries/STM32F10x_StdPeriph_Driver/obj + +CROSS_COMPILE = arm-none-eabi- + +CC = $(CROSS_COMPILE)gcc +CCFLAGS = -xc -c -O2 -g -fno-common -mcpu=cortex-m3 -mthumb -DUSE_FULL_ASSERT -I$(INC_DIR) -I. + +AR = $(CROSS_COMPILE)ar +ARFLAGS = rs + +OBJECTS = \ +misc.o \ +stm32f10x_adc.o \ +stm32f10x_bkp.o \ +stm32f10x_can.o \ +stm32f10x_cec.o \ +stm32f10x_crc.o \ +stm32f10x_dac.o \ +stm32f10x_dbgmcu.o \ +stm32f10x_dma.o \ +stm32f10x_exti.o \ +stm32f10x_flash.o \ +stm32f10x_fsmc.o \ +stm32f10x_gpio.o \ +stm32f10x_i2c.o \ +stm32f10x_iwdg.o \ +stm32f10x_pwr.o \ +stm32f10x_rcc.o \ +stm32f10x_rtc.o \ +stm32f10x_sdio.o \ +stm32f10x_spi.o \ +stm32f10x_tim.o \ +stm32f10x_usart.o \ +stm32f10x_wwdg.o + +LIBRARY = libSTM_StdPeriph.a + +vpath %.c $(SRC_DIR) +vpath %.o $(OBJ_DIR) + +all: $(LIBRARY) + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +clean: + rm -rf $(LIBRARY) $(OBJ_DIR) + +$(OBJ_DIR): + mkdir -p $@ + +.PHONY: all clean diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/17/d01261a19e970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/17/d01261a19e970017138fe0bf747e5677 new file mode 100644 index 0000000..b1f8fb5 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/17/d01261a19e970017138fe0bf747e5677 @@ -0,0 +1,85 @@ +// ----------------------------------------------------------------------------- +/// @file main.c +/// @brief Description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @file main.c +/// @ingroup {group_name} + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + +// FreeRTOS includes +#include "FreeRTOS.h" +#include "task.h" + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + +/* The time between cycles of the 'check' functionality (defined within the +tick hook. */ +#define mainCHECK_DELAY ( ( TickType_t ) 5000 / portTICK_PERIOD_MS ) + +// ----------------------------------------------------------------------------- +// Type definitions +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// File-scope variables +// ----------------------------------------------------------------------------- + +/* Variable that counts at 20KHz to provide the time base for the run time +stats. */ +unsigned long ulRunTimeStatsClock = 0UL; + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function definitions +// ----------------------------------------------------------------------------- + +void _init(void) {return;} +char * sbrk( size_t x ) +{ + /* Just to remove compiler warning. */ + ( void ) x; + return NULL; +} + +int main (void) +{ + + + /* Start the scheduler. */ + vTaskStartScheduler(); + + /* Will only get here if there was insufficient memory to create the idle + task. The idle task is created within vTaskStartScheduler(). */ + for( ;; ); + + + return -1; +} + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/18/30d76e8d9c9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/18/30d76e8d9c9400171201ed9ff9474498 new file mode 100644 index 0000000..e69de29 diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/1b/90f040af8697001713a7ede92b37d6f1 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/1b/90f040af8697001713a7ede92b37d6f1 new file mode 100644 index 0000000..088f28d --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/1b/90f040af8697001713a7ede92b37d6f1 @@ -0,0 +1,55 @@ +// ----------------------------------------------------------------------------- +/// @file main.c +/// @brief Description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @file main.c +/// @ingroup {group_name} + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Type definitions +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// File-scope variables +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function definitions +// ----------------------------------------------------------------------------- diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/1b/b33a60089d9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/1b/b33a60089d9400171201ed9ff9474498 new file mode 100644 index 0000000..e1b89ae --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/1b/b33a60089d9400171201ed9ff9474498 @@ -0,0 +1,68 @@ +;/* +; FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. +; All rights reserved +; +; +; *************************************************************************** +; * * +; * FreeRTOS tutorial books are available in pdf and paperback. * +; * Complete, revised, and edited pdf reference manuals are also * +; * available. * +; * * +; * Purchasing FreeRTOS documentation will not only help you, by * +; * ensuring you get running as quickly as possible and with an * +; * in-depth knowledge of how to use FreeRTOS, it will also help * +; * the FreeRTOS project to continue with its mission of providing * +; * professional grade, cross platform, de facto standard solutions * +; * for microcontrollers - completely free of charge! * +; * * +; * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * +; * * +; * Thank you for using FreeRTOS, and thank you for your support! * +; * * +; *************************************************************************** +; +; +; This file is part of the FreeRTOS distribution. +; +; FreeRTOS is free software; you can redistribute it and/or modify it under +; the terms of the GNU General Public License (version 2) as published by the +; Free Software Foundation AND MODIFIED BY the FreeRTOS exception. +; >>>NOTE<<< The modification to the GPL is included to allow you to +; distribute a combined work that includes FreeRTOS without being obliged to +; provide the source code for proprietary components outside of the FreeRTOS +; kernel. FreeRTOS is distributed in the hope that it will be useful, but +; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +; more details. You should have received a copy of the GNU General Public +; License and the FreeRTOS license exception along with FreeRTOS; if not it +; can be viewed here: http://www.freertos.org/a00114.html and also obtained +; by writing to Richard Barry, contact details for whom are available on the +; FreeRTOS WEB site. +; +; 1 tab == 4 spaces! +; +; http://www.FreeRTOS.org - Documentation, latest information, license and +; contact details. +; +; http://www.SafeRTOS.com - A version that is certified for use in safety +; critical systems. +; +; http://www.OpenRTOS.com - Commercial support, development, porting, +; licensing and training services. +;*/ + .GLB _vSoftwareInterruptISR + .GLB _vSoftwareInterruptEntry + + .SECTION P,CODE + +_vSoftwareInterruptEntry: + + BRA _vSoftwareInterruptISR + + .RVECTOR 27, _vSoftwareInterruptEntry + + .END + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/1b/f04cd04dc596001713a7ede92b37d6f1 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/1b/f04cd04dc596001713a7ede92b37d6f1 new file mode 100644 index 0000000..1fd8a10 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/1b/f04cd04dc596001713a7ede92b37d6f1 @@ -0,0 +1,59 @@ +# STM support library + +SRC_DIR = Libraries/STM32F10x_StdPeriph_Driver/src/ +INC_DIR = Libraries/STM32F10x_StdPeriph_Driver/inc/ Libraries/CMSIS/DeviceSupport/ST/STM32F10x/ +OBJ_DIR = Libraries/STM32F10x_StdPeriph_Driver/obj + +CROSS_COMPILE = arm-none-eabi- + +CC = $(CROSS_COMPILE)gcc +CCFLAGS = -xc -c -O2 -g -fno-common -mcpu=cortex-m3 -mthumb -DUSE_FULL_ASSERT -I$(INC_DIR) -I. + +AR = $(CROSS_COMPILE)ar +ARFLAGS = rs + +OBJECTS = \ +misc.o \ +stm32f10x_adc.o \ +stm32f10x_bkp.o \ +stm32f10x_can.o \ +stm32f10x_cec.o \ +stm32f10x_crc.o \ +stm32f10x_dac.o \ +stm32f10x_dbgmcu.o \ +stm32f10x_dma.o \ +stm32f10x_exti.o \ +stm32f10x_flash.o \ +stm32f10x_fsmc.o \ +stm32f10x_gpio.o \ +stm32f10x_i2c.o \ +stm32f10x_iwdg.o \ +stm32f10x_pwr.o \ +stm32f10x_rcc.o \ +stm32f10x_rtc.o \ +stm32f10x_sdio.o \ +stm32f10x_spi.o \ +stm32f10x_tim.o \ +stm32f10x_usart.o \ +stm32f10x_wwdg.o + +LIBRARY = libSTM_StdPeriph.a + +vpath %.c $(SRC_DIR) +vpath %.o $(OBJ_DIR) + +all: $(LIBRARY) + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +clean: + rm -rf $(LIBRARY) $(OBJ_DIR) + +$(OBJ_DIR): + mkdir -p $@ + +.PHONY: all clean diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/1c/e087b0b5a69700171090ed03afc2ec65 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/1c/e087b0b5a69700171090ed03afc2ec65 new file mode 100644 index 0000000..2d5d5ee --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/1c/e087b0b5a69700171090ed03afc2ec65 @@ -0,0 +1,110 @@ +// ----------------------------------------------------------------------------- +/// @file freeRTOSFixes.c +/// @brief Description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @file freeRTOSFixes.c +/// @ingroup {group_name} + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + +#include +#include +#include + +#include "task.h" +#include "freeRTOSFixes.h" + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Type definitions +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// File-scope variables +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function definitions +// ----------------------------------------------------------------------------- + +void _init(void) {return;} + +void OS_logTaskInfo(xTaskHandle taskHandle) +{ + unsigned portBASE_TYPE highWaterMark; + char text[128]; + + snprintf(text, sizeof(text), "Task %s\n", pcTaskGetTaskName(taskHandle)); +// Shell_sendString(text); + + highWaterMark = uxTaskGetStackHighWaterMark(taskHandle); +// snprintf(text, sizeof(text), "Stack high water mark : %lu long words\n", highWaterMark); +// Shell_sendString(text); +} + +// Implementation for libc, needed for printf related functions. +caddr_t _sbrk(int incr) +{ + extern char _end; + static char* heap_end; + char* prev_heap_end; + + if(heap_end == 0) + { + heap_end = &_end; + } + + prev_heap_end = heap_end; + heap_end += incr; + return (caddr_t)prev_heap_end; +} + +// Stack overflow hook +void vApplicationStackOverflowHook(xTaskHandle xTask, signed portCHAR* pcTaskName) +{ +// Logger_fatal(FATALCODE_STACKOVERFLOW); +} + +// Malloc failed hook +void vApplicationMallocFailedHook(void) +{ +// Logger_fatal(FATALCODE_MALLOCFAILED); +} + +// Assert for StdPeriph library +void assert_failed(uint8_t* file, uint32_t line) +{ +// Logger_log((char*)file, "", line, LOGTYPE_ERROR, "assert failed"); +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/1e/708acde292970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/1e/708acde292970017138fe0bf747e5677 new file mode 100644 index 0000000..bdfd808 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/1e/708acde292970017138fe0bf747e5677 @@ -0,0 +1,128 @@ +ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +heap_4.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -fno-common -mcpu=cortex-m3 -mthumb $(RELEASE_DEFINES) $(INCLUDES) +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -nostartfiles -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map +release: export LDARCHIVES := -L. -lSTM_StdPeriph +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -f hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + rm -rf obj_release + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +else + +vpath %.c \ +src \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ +$(STM32_DEVICE_SUPPORT_DIR) + +vpath %.s $(STARTER_SCRIPT_DIR) +vpath %.o $(OBJ_DIR) + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) #$(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +#$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) +# $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)/$@ + +$(OBJ_DIR): + mkdir -p $@ + +endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/1e/a0f564089d9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/1e/a0f564089d9400171201ed9ff9474498 new file mode 100644 index 0000000..117f764 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/1e/a0f564089d9400171201ed9ff9474498 @@ -0,0 +1,313 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the SH2A port. + *----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Library includes. */ +#include "string.h" + +/*-----------------------------------------------------------*/ + +/* The SR assigned to a newly created task. The only important thing in this +value is for all interrupts to be enabled. */ +#define portINITIAL_SR ( 0UL ) + +/* Dimensions the array into which the floating point context is saved. +Allocate enough space for FPR0 to FPR15, FPUL and FPSCR, each of which is 4 +bytes big. If this number is changed then the 72 in portasm.src also needs +changing. */ +#define portFLOP_REGISTERS_TO_STORE ( 18 ) +#define portFLOP_STORAGE_SIZE ( portFLOP_REGISTERS_TO_STORE * 4 ) + +#if( configSUPPORT_DYNAMIC_ALLOCATION == 0 ) + #error configSUPPORT_DYNAMIC_ALLOCATION must be 1 to use this port. +#endif + +/*-----------------------------------------------------------*/ + +/* + * The TRAPA handler used to force a context switch. + */ +void vPortYield( void ); + +/* + * Function to start the first task executing - defined in portasm.src. + */ +extern void vPortStartFirstTask( void ); + +/* + * Obtains the current GBR value - defined in portasm.src. + */ +extern uint32_t ulPortGetGBR( void ); + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Mark the end of the stack - used for debugging only and can be removed. */ + *pxTopOfStack = 0x11111111UL; + pxTopOfStack--; + *pxTopOfStack = 0x22222222UL; + pxTopOfStack--; + *pxTopOfStack = 0x33333333UL; + pxTopOfStack--; + + /* SR. */ + *pxTopOfStack = portINITIAL_SR; + pxTopOfStack--; + + /* PC. */ + *pxTopOfStack = ( uint32_t ) pxCode; + pxTopOfStack--; + + /* PR. */ + *pxTopOfStack = 15; + pxTopOfStack--; + + /* 14. */ + *pxTopOfStack = 14; + pxTopOfStack--; + + /* R13. */ + *pxTopOfStack = 13; + pxTopOfStack--; + + /* R12. */ + *pxTopOfStack = 12; + pxTopOfStack--; + + /* R11. */ + *pxTopOfStack = 11; + pxTopOfStack--; + + /* R10. */ + *pxTopOfStack = 10; + pxTopOfStack--; + + /* R9. */ + *pxTopOfStack = 9; + pxTopOfStack--; + + /* R8. */ + *pxTopOfStack = 8; + pxTopOfStack--; + + /* R7. */ + *pxTopOfStack = 7; + pxTopOfStack--; + + /* R6. */ + *pxTopOfStack = 6; + pxTopOfStack--; + + /* R5. */ + *pxTopOfStack = 5; + pxTopOfStack--; + + /* R4. */ + *pxTopOfStack = ( uint32_t ) pvParameters; + pxTopOfStack--; + + /* R3. */ + *pxTopOfStack = 3; + pxTopOfStack--; + + /* R2. */ + *pxTopOfStack = 2; + pxTopOfStack--; + + /* R1. */ + *pxTopOfStack = 1; + pxTopOfStack--; + + /* R0 */ + *pxTopOfStack = 0; + pxTopOfStack--; + + /* MACL. */ + *pxTopOfStack = 16; + pxTopOfStack--; + + /* MACH. */ + *pxTopOfStack = 17; + pxTopOfStack--; + + /* GBR. */ + *pxTopOfStack = ulPortGetGBR(); + + /* GBR = global base register. + VBR = vector base register. + TBR = jump table base register. + R15 is the stack pointer. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void vApplicationSetupTimerInterrupt( void ); + + /* Call an application function to set up the timer that will generate the + tick interrupt. This way the application can decide which peripheral to + use. A demo application is provided to show a suitable example. */ + vApplicationSetupTimerInterrupt(); + + /* Start the first task. This will only restore the standard registers and + not the flop registers. This does not really matter though because the only + flop register that is initialised to a particular value is fpscr, and it is + only initialised to the current value, which will still be the current value + when the first task starts executing. */ + trapa( portSTART_SCHEDULER_TRAP_NO ); + + /* Should not get here. */ + return pdFAIL; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented as there is nothing to return to. */ +} +/*-----------------------------------------------------------*/ + +void vPortYield( void ) +{ +int32_t lInterruptMask; + + /* Ensure the yield trap runs at the same priority as the other interrupts + that can cause a context switch. */ + lInterruptMask = get_imask(); + + /* taskYIELD() can only be called from a task, not an interrupt, so the + current interrupt mask can only be 0 or portKERNEL_INTERRUPT_PRIORITY and + the mask can be set without risk of accidentally lowering the mask value. */ + set_imask( portKERNEL_INTERRUPT_PRIORITY ); + + trapa( portYIELD_TRAP_NO ); + + /* Restore the interrupt mask to whatever it was previously (when the + function was entered). */ + set_imask( ( int ) lInterruptMask ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortUsesFloatingPoint( TaskHandle_t xTask ) +{ +uint32_t *pulFlopBuffer; +BaseType_t xReturn; +extern void * volatile pxCurrentTCB; + + /* This function tells the kernel that the task referenced by xTask is + going to use the floating point registers and therefore requires the + floating point registers saved as part of its context. */ + + /* Passing NULL as xTask is used to indicate that the calling task is the + subject task - so pxCurrentTCB is the task handle. */ + if( xTask == NULL ) + { + xTask = ( TaskHandle_t ) pxCurrentTCB; + } + + /* Allocate a buffer large enough to hold all the flop registers. */ + pulFlopBuffer = ( uint32_t * ) pvPortMalloc( portFLOP_STORAGE_SIZE ); + + if( pulFlopBuffer != NULL ) + { + /* Start with the registers in a benign state. */ + memset( ( void * ) pulFlopBuffer, 0x00, portFLOP_STORAGE_SIZE ); + + /* The first thing to get saved in the buffer is the FPSCR value - + initialise this to the current FPSCR value. */ + *pulFlopBuffer = get_fpscr(); + + /* Use the task tag to point to the flop buffer. Pass pointer to just + above the buffer because the flop save routine uses a pre-decrement. */ + vTaskSetApplicationTaskTag( xTask, ( void * ) ( pulFlopBuffer + portFLOP_REGISTERS_TO_STORE ) ); + xReturn = pdPASS; + } + else + { + xReturn = pdFAIL; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/1f/e0f72ac796970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/1f/e0f72ac796970017138fe0bf747e5677 new file mode 100644 index 0000000..988ba78 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/1f/e0f72ac796970017138fe0bf747e5677 @@ -0,0 +1,115 @@ +// ----------------------------------------------------------------------------- +/// @file FreeRTOSConfig.h +/// @brief File description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @defgroup {group_name} {group_description} +/// Description + +/// @file FreeRTOSConfig.h +/// @ingroup {group_name} + + +#ifndef FREERTOSCONFIG_H_ +#define FREERTOSCONFIG_H_ + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + +#define configUSE_PREEMPTION 1 +#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0 +#define configUSE_TICKLESS_IDLE 0 +#define configCPU_CLOCK_HZ ((unsigned long) 120000000) +#define configTICK_RATE_HZ ((portTickType) 1000) +#define configMAX_PRIORITIES ((unsigned portBASE_TYPE) 5) +#define configMINIMAL_STACK_SIZE ((unsigned short) 768) +#define configTOTAL_HEAP_SIZE ((size_t) 0xF600) +#define configMAX_TASK_NAME_LEN (16) +#define configUSE_TRACE_FACILITY 0 +#define configUSE_16_BIT_TICKS 0 +#define configIDLE_SHOULD_YIELD 1 +#define configUSE_MUTEXES 1 +#define configUSE_RECURSIVE_MUTEXES 0 +#define configUSE_COUNTING_SEMAPHORES 0 +#define configUSE_ALTERNATIVE_API 0 /* Deprecated! */ +#define configQUEUE_REGISTRY_SIZE (10) + +/* Hook function related definitions. */ +#define configUSE_IDLE_HOOK 0 +#define configUSE_TICK_HOOK 0 +#define configCHECK_FOR_STACK_OVERFLOW 2 +#define configUSE_MALLOC_FAILED_HOOK 1 + +/* Run time stats gathering related definitions. */ +#define configGENERATE_RUN_TIME_STATS 0 + +/* Co-routine related definitions. */ +#define configUSE_CO_ROUTINES 0 +#define configMAX_CO_ROUTINE_PRIORITIES (1) + +/* Software timer related definitions. */ +#define configUSE_TIMERS 1 +#define configTIMER_TASK_PRIORITY (4) +#define configTIMER_QUEUE_LENGTH (10) +#define configTIMER_TASK_STACK_DEPTH configMINIMAL_STACK_SIZE + +/* Interrupt nesting behaviour configuration. */ +#define configKERNEL_INTERRUPT_PRIORITY 255 +#define configMAX_SYSCALL_INTERRUPT_PRIORITY 191 + +/* Define to trap errors during development. */ +#define configASSERT( x ) if( ( x ) == 0 ) for(;;) + +/* Optional functions - most linkers will remove unused functions anyway. */ +#define INCLUDE_vTaskPrioritySet 1 +#define INCLUDE_uxTaskPriorityGet 1 +#define INCLUDE_vTaskDelete 1 +#define INCLUDE_vTaskSuspend 1 +#define INCLUDE_xResumeFromISR 1 +#define INCLUDE_vTaskDelayUntil 1 +#define INCLUDE_vTaskDelay 1 +#define INCLUDE_xTaskGetSchedulerState 1 +#define INCLUDE_xTaskGetCurrentTaskHandle 1 +#define INCLUDE_uxTaskGetStackHighWaterMark 1 +#define INCLUDE_xTaskGetIdleTaskHandle 0 +#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0 +#define INCLUDE_pcTaskGetTaskName 1 +#define INCLUDE_eTaskGetState 0 + +#define vPortSVCHandler SVC_Handler +#define xPortPendSVHandler PendSV_Handler +#define xPortSysTickHandler SysTick_Handler + +// ----------------------------------------------------------------------------- +// Type definitions. +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + +#endif /* FREERTOSCONFIG_H_ */ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/2/50f0d3299b970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/2/50f0d3299b970017138fe0bf747e5677 new file mode 100644 index 0000000..4b424bb --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/2/50f0d3299b970017138fe0bf747e5677 @@ -0,0 +1,134 @@ +ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +heap_4.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +STM32_CORE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) \ +-I$(STM32_CORE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -fno-exceptions -mcpu=cortex-m3 -mthumb $(RELEASE_DEFINES) $(INCLUDES) +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -nostartfiles -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map +release: export LDARCHIVES := -L. -L$(STM32_STDPERIPH_ROOT) -lSTM_StdPeriph -lhsb_mrts_release +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -f hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + rm -rf obj_release + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +else + +vpath %.c \ +src \ +startup \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport + +vpath %.s \ +startup +vpath %.o \ +obj_release + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) $(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)/$@ + +$(OBJ_DIR): + mkdir -p $@ + +endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/2/b071679399970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/2/b071679399970017138fe0bf747e5677 new file mode 100644 index 0000000..cafdc27 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/2/b071679399970017138fe0bf747e5677 @@ -0,0 +1,134 @@ +ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +heap_4.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +STM32_CORE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) \ +-I$(STM32_CORE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -fno-common -mcpu=cortex-m3 -mthumb $(RELEASE_DEFINES) $(INCLUDES) +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -nostartfiles -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map -lc +release: export LDARCHIVES := -L. -L$(STM32_STDPERIPH_ROOT) -lSTM_StdPeriph -lhsb_mrts_release +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -f hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + rm -rf obj_release + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +else + +vpath %.c \ +src \ +startup \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport + +vpath %.s \ +startup +vpath %.o \ +obj_release + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) $(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)/$@ + +$(OBJ_DIR): + mkdir -p $@ + +endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/21/3045438ec096001713a7ede92b37d6f1 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/21/3045438ec096001713a7ede92b37d6f1 new file mode 100644 index 0000000..22eb719 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/21/3045438ec096001713a7ede92b37d6f1 @@ -0,0 +1,59 @@ +# STM support library + +SRC_DIR = Libraries/STM32F10x_StdPeriph_Driver/src/ +INC_DIR = Libraries/STM32F10x_StdPeriph_Driver/inc/ +OBJ_DIR = Libraries/STM32F10x_StdPeriph_Driver/obj + +CROSS_COMPILE = arm-none-eabi- + +CC = $(CROSS_COMPILE)gcc +CCFLAGS = -xc -c -O2 -g -fno-common -mcpu=cortex-m3 -mthumb -DUSE_FULL_ASSERT -I$(INC_DIR) -I. + +AR = $(CROSS_COMPILE)ar +ARFLAGS = rs + +OBJECTS = \ +misc.o \ +stm32f10x_adc.o \ +stm32f10x_bkp.o \ +stm32f10x_can.o \ +stm32f10x_cec.o \ +stm32f10x_crc.o \ +stm32f10x_dac.o \ +stm32f10x_dbgmcu.o \ +stm32f10x_dma.o \ +stm32f10x_exti.o \ +stm32f10x_flash.o \ +stm32f10x_fsmc.o \ +stm32f10x_gpio.o \ +stm32f10x_i2c.o \ +stm32f10x_iwdg.o \ +stm32f10x_pwr.o \ +stm32f10x_rcc.o \ +stm32f10x_rtc.o \ +stm32f10x_sdio.o \ +stm32f10x_spi.o \ +stm32f10x_tim.o \ +stm32f10x_usart.o \ +stm32f10x_wwdg.o + +LIBRARY = libSTM_StdPeriph.a + +vpath %.c $(SRC_DIR) +vpath %.o $(OBJ_DIR) + +all: $(LIBRARY) + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +clean: + rm -rf $(LIBRARY) $(OBJ_DIR) + +$(OBJ_DIR): + mkdir -p $@ + +.PHONY: all clean diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/21/8063d53f95970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/21/8063d53f95970017138fe0bf747e5677 new file mode 100644 index 0000000..f46550b --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/21/8063d53f95970017138fe0bf747e5677 @@ -0,0 +1,128 @@ +ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +heap_4.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -fno-common -mcpu=cortex-m3 -mthumb $(RELEASE_DEFINES) $(INCLUDES) +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -nostartfiles -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map +release: export LDARCHIVES := -L. -L$(STM32_STDPERIPH_ROOT) -lSTM_StdPeriph +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -f hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + rm -rf obj_release + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +else + +vpath %.c \ +src \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x + +vpath %.s $(STARTER_SCRIPT_DIR) +vpath %.o $(OBJ_DIR) + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) $(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)/$@ + +$(OBJ_DIR): + mkdir -p $@ + +endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/22/109261c1ba96001713a7ede92b37d6f1 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/22/109261c1ba96001713a7ede92b37d6f1 new file mode 100644 index 0000000..e69de29 diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/22/10ae0146a69700171090ed03afc2ec65 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/22/10ae0146a69700171090ed03afc2ec65 new file mode 100644 index 0000000..edd992a --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/22/10ae0146a69700171090ed03afc2ec65 @@ -0,0 +1,84 @@ +// ----------------------------------------------------------------------------- +/// @file main.c +/// @brief Description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @file main.c +/// @ingroup {group_name} + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + +// FreeRTOS includes +#include "FreeRTOS.h" +#include "task.h" +#include "freeRTOSFixes.h" + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + +/* The time between cycles of the 'check' functionality (defined within the +tick hook. */ +#define mainCHECK_DELAY ( ( TickType_t ) 5000 / portTICK_PERIOD_MS ) + +// ----------------------------------------------------------------------------- +// Type definitions +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// File-scope variables +// ----------------------------------------------------------------------------- + +/* Variable that counts at 20KHz to provide the time base for the run time +stats. */ +unsigned long ulRunTimeStatsClock = 0UL; + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function definitions +// ----------------------------------------------------------------------------- + + +int main (void) +{ + + + /* Start the scheduler. */ + vTaskStartScheduler(); + + /* Will only get here if there was insufficient memory to create the idle + task. The idle task is created within vTaskStartScheduler(). */ + for( ;; ); + + + return -1; +} + +void vApplicationTickHook () +{ + +} + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/23/943f67089d9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/23/943f67089d9400171201ed9ff9474498 new file mode 100644 index 0000000..8bd888e --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/23/943f67089d9400171201ed9ff9474498 @@ -0,0 +1,174 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT int +#define portSTACK_TYPE uint16_t +#define portBASE_TYPE short + +typedef portSTACK_TYPE StackType_t; +typedef short BaseType_t; +typedef unsigned short UBaseType_t; + + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif + +/*-----------------------------------------------------------*/ + +/* Interrupt control macros. */ +#define portDISABLE_INTERRUPTS() _DINT(); _NOP() +#define portENABLE_INTERRUPTS() _EINT(); +/*-----------------------------------------------------------*/ + +/* Critical section control macros. */ +#define portNO_CRITICAL_SECTION_NESTING ( ( uint16_t ) 0 ) + +#define portENTER_CRITICAL() \ +{ \ +extern volatile uint16_t usCriticalNesting; \ + \ + portDISABLE_INTERRUPTS(); \ + \ + /* Now interrupts are disabled usCriticalNesting can be accessed */ \ + /* directly. Increment ulCriticalNesting to keep a count of how many */ \ + /* times portENTER_CRITICAL() has been called. */ \ + usCriticalNesting++; \ +} + +#define portEXIT_CRITICAL() \ +{ \ +extern volatile uint16_t usCriticalNesting; \ + \ + if( usCriticalNesting > portNO_CRITICAL_SECTION_NESTING ) \ + { \ + /* Decrement the nesting count as we are leaving a critical section. */ \ + usCriticalNesting--; \ + \ + /* If the nesting level has reached zero then interrupts should be */ \ + /* re-enabled. */ \ + if( usCriticalNesting == portNO_CRITICAL_SECTION_NESTING ) \ + { \ + portENABLE_INTERRUPTS(); \ + } \ + } \ +} +/*-----------------------------------------------------------*/ + +/* Task utilities. */ + +/* + * Manual context switch called by portYIELD or taskYIELD. + */ +extern void vPortYield( void ); +#define portYIELD() vPortYield() +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 2 +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portNOP() +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) __toplevel + +#if configINTERRUPT_EXAMPLE_METHOD == 2 + +extern void vTaskSwitchContext( void ); +#define portYIELD_FROM_ISR( x ) if( x ) vTaskSwitchContext() + +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/23/f020e0759a970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/23/f020e0759a970017138fe0bf747e5677 new file mode 100644 index 0000000..7ac426f --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/23/f020e0759a970017138fe0bf747e5677 @@ -0,0 +1,210 @@ +/* +****************************************************************************** +** +** File : LinkerScript.ld +** +** Author : Auto-generated by Ac6 System Workbench +** +** Abstract : Linker script for STM32F107VCTx Device from STM32F1 series +** 64Kbytes RAM +** 256Kbytes ROM +** +** Set heap size, stack size and stack location according +** to application requirements. +** +** Set memory bank area and size if external memory is used. +** +** Target : STMicroelectronics STM32 +** +** Distribution: The file is distributed “as is,” without any warranty +** of any kind. +** +***************************************************************************** +** @attention +** +**

© COPYRIGHT(c) 2017 Ac6

+** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** 1. Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** 3. Neither the name of Ac6 nor the names of its contributors +** may be used to endorse or promote products derived from this software +** without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +***************************************************************************** +*/ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = 0x20010000; /* end of RAM */ + +_Min_Heap_Size = 0; /* required amount of heap */ +_Min_Stack_Size = 0x400; /* required amount of stack */ + +/* Memories definition */ +MEMORY +{ + RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K + ROM (rx) : ORIGIN = 0x8000000, LENGTH = 256K +} + +/* Sections */ +SECTIONS +{ + /* The startup code into ROM memory */ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } >ROM + + /* The program code and other data into ROM memory */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + } >ROM + + /* Constant data into ROM memory*/ + .rodata : + { + . = ALIGN(4); + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + . = ALIGN(4); + } >ROM + + .ARM.extab : { + . = ALIGN(4); + *(.ARM.extab* .gnu.linkonce.armextab.*) + . = ALIGN(4); + } >ROM + + .ARM : { + . = ALIGN(4); + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + . = ALIGN(4); + } >ROM + + .preinit_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + . = ALIGN(4); + } >ROM + + .init_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + . = ALIGN(4); + } >ROM + + .fini_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + . = ALIGN(4); + } >ROM + + /* Used by the startup to initialize data */ + _sidata = LOADADDR(.data); + + /* Initialized data sections into RAM memory */ + .data : + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + } >RAM AT> ROM + + + /* Uninitialized data section into RAM memory */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM + + /* User_heap_stack section, used to check that there is enough RAM left */ + ._user_heap_stack : + { + . = ALIGN(8); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(8); + } >RAM + + + + /* Remove information from the compiler libraries */ +/* /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } +*/ + .ARM.attributes 0 : { *(.ARM.attributes) } + + GROUP + ( + libgcc.a + libc.a + libm.a + libnosys.a + ) +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/2d/1046668d99970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/2d/1046668d99970017138fe0bf747e5677 new file mode 100644 index 0000000..6503f2f --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/2d/1046668d99970017138fe0bf747e5677 @@ -0,0 +1,134 @@ +ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +heap_4.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +STM32_CORE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) \ +-I$(STM32_CORE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -fno-common -mcpu=cortex-m3 -mthumb $(RELEASE_DEFINES) $(INCLUDES) +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -nostartfiles -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map +release: export LDARCHIVES := -L. -L$(STM32_STDPERIPH_ROOT) -lSTM_StdPeriph -lhsb_mrts_release +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -f hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + rm -rf obj_release + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +else + +vpath %.c \ +src \ +startup \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport + +vpath %.s \ +startup +vpath %.o \ +obj_release + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) $(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)/$@ + +$(OBJ_DIR): + mkdir -p $@ + +endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/2d/d0ecd4e48a970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/2d/d0ecd4e48a970017138fe0bf747e5677 new file mode 100644 index 0000000..bca136d --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/2d/d0ecd4e48a970017138fe0bf747e5677 @@ -0,0 +1,53 @@ +// ----------------------------------------------------------------------------- +/// @file FreeRTOSConfig.h +/// @brief File description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @defgroup {group_name} {group_description} +/// Description + +/// @file FreeRTOSConfig.h +/// @ingroup {group_name} + + +#ifndef FREERTOSCONFIG_H_ +#define FREERTOSCONFIG_H_ + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Type definitions. +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + +#endif /* FREERTOSCONFIG_H_ */ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/2e/3064587f95970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/2e/3064587f95970017138fe0bf747e5677 new file mode 100644 index 0000000..7299a2c --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/2e/3064587f95970017138fe0bf747e5677 @@ -0,0 +1,131 @@ +ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +heap_4.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +STM32_CORE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) \ +-I$(STM32_CORE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -fno-common -mcpu=cortex-m3 -mthumb $(RELEASE_DEFINES) $(INCLUDES) +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -nostartfiles -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map +release: export LDARCHIVES := -L. -L$(STM32_STDPERIPH_ROOT) -lSTM_StdPeriph +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -f hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + rm -rf obj_release + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +else + +vpath %.c \ +src \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport + +vpath %.s $(STARTER_SCRIPT_DIR) +vpath %.o $(OBJ_DIR) + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) $(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)/$@ + +$(OBJ_DIR): + mkdir -p $@ + +endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/2e/c59d56089d9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/2e/c59d56089d9400171201ed9ff9474498 new file mode 100644 index 0000000..432069b --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/2e/c59d56089d9400171201ed9ff9474498 @@ -0,0 +1,187 @@ +; +;/* +; FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. +; All rights reserved +; +; +; *************************************************************************** +; * * +; * FreeRTOS tutorial books are available in pdf and paperback. * +; * Complete, revised, and edited pdf reference manuals are also * +; * available. * +; * * +; * Purchasing FreeRTOS documentation will not only help you, by * +; * ensuring you get running as quickly as possible and with an * +; * in-depth knowledge of how to use FreeRTOS, it will also help * +; * the FreeRTOS project to continue with its mission of providing * +; * professional grade, cross platform, de facto standard solutions * +; * for microcontrollers - completely free of charge! * +; * * +; * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * +; * * +; * Thank you for using FreeRTOS, and thank you for your support! * +; * * +; *************************************************************************** +; +; +; This file is part of the FreeRTOS distribution. +; +; FreeRTOS is free software; you can redistribute it and/or modify it under +; the terms of the GNU General Public License (version 2) as published by the +; Free Software Foundation AND MODIFIED BY the FreeRTOS exception. +; >>>NOTE<<< The modification to the GPL is included to allow you to +; distribute a combined work that includes FreeRTOS without being obliged to +; provide the source code for proprietary components outside of the FreeRTOS +; kernel. FreeRTOS is distributed in the hope that it will be useful, but +; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +; more details. You should have received a copy of the GNU General Public +; License and the FreeRTOS license exception along with FreeRTOS; if not it +; can be viewed here: http://www.freertos.org/a00114.html and also obtained +; by writing to Richard Barry, contact details for whom are available on the +; FreeRTOS WEB site. +; +; 1 tab == 4 spaces! +; +; http://www.FreeRTOS.org - Documentation, latest information, license and +; contact details. +; +; http://www.SafeRTOS.com - A version that is certified for use in safety +; critical systems. +; +; http://www.OpenRTOS.com - Commercial support, development, porting, +; licensing and training services. +;*/ + +; * The definition of the "register test" tasks, as described at the top of +; * main.c + + .include data_model.h + + .global xTaskIncrementTick + .global vTaskSwitchContext + .global vPortSetupTimerInterrupt + .global pxCurrentTCB + .global usCriticalNesting + + .def vPortPreemptiveTickISR + .def vPortCooperativeTickISR + .def vPortYield + .def xPortStartScheduler + +;----------------------------------------------------------- + +portSAVE_CONTEXT .macro + + ;Save the remaining registers. + pushm_x #12, r15 + mov.w &usCriticalNesting, r14 + push_x r14 + mov_x &pxCurrentTCB, r12 + mov_x sp, 0( r12 ) + .endm +;----------------------------------------------------------- + +portRESTORE_CONTEXT .macro + + mov_x &pxCurrentTCB, r12 + mov_x @r12, sp + pop_x r15 + mov.w r15, &usCriticalNesting + popm_x #12, r15 + nop + pop.w sr + nop + ret_x + .endm +;----------------------------------------------------------- + +;* +;* The RTOS tick ISR. +;* +;* If the cooperative scheduler is in use this simply increments the tick +;* count. +;* +;* If the preemptive scheduler is in use a context switch can also occur. +;*/ + + .text + .align 2 + +vPortPreemptiveTickISR: .asmfunc + + ; The sr is not saved in portSAVE_CONTEXT() because vPortYield() needs + ;to save it manually before it gets modified (interrupts get disabled). + push.w sr + portSAVE_CONTEXT + + call_x #xTaskIncrementTick + call_x #vTaskSwitchContext + + portRESTORE_CONTEXT + .endasmfunc +;----------------------------------------------------------- + + .align 2 + +vPortCooperativeTickISR: .asmfunc + + ; The sr is not saved in portSAVE_CONTEXT() because vPortYield() needs + ;to save it manually before it gets modified (interrupts get disabled). + push.w sr + portSAVE_CONTEXT + + call_x #xTaskIncrementTick + + portRESTORE_CONTEXT + + .endasmfunc +;----------------------------------------------------------- + +; +; Manual context switch called by the portYIELD() macro. +; + + .align 2 + +vPortYield: .asmfunc + + ; The sr needs saving before it is modified. + push.w sr + + ; Now the SR is stacked we can disable interrupts. + dint + nop + + ; Save the context of the current task. + portSAVE_CONTEXT + + ; Select the next task to run. + call_x #vTaskSwitchContext + + ; Restore the context of the new task. + portRESTORE_CONTEXT + .endasmfunc +;----------------------------------------------------------- + + +; +; Start off the scheduler by initialising the RTOS tick timer, then restoring +; the context of the first task. +; + + .align 2 + +xPortStartScheduler: .asmfunc + + ; Setup the hardware to generate the tick. Interrupts are disabled + ; when this function is called. + call_x #vPortSetupTimerInterrupt + + ; Restore the context of the first task that is going to run. + portRESTORE_CONTEXT + .endasmfunc +;----------------------------------------------------------- + + .end + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/2f/60d93568c696001713a7ede92b37d6f1 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/2f/60d93568c696001713a7ede92b37d6f1 new file mode 100644 index 0000000..dd35f9a --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/2f/60d93568c696001713a7ede92b37d6f1 @@ -0,0 +1,61 @@ +# STM support library + +SRC_DIR = Libraries/STM32F10x_StdPeriph_Driver/src/ +INC_DIR = Libraries/STM32F10x_StdPeriph_Driver/inc/ +DEV_DIR = Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/ +COR_DIR = Libraries/CMSIS/CM3/CoreSupport/ +OBJ_DIR = Libraries/STM32F10x_StdPeriph_Driver/obj + +CROSS_COMPILE = arm-none-eabi- + +CC = $(CROSS_COMPILE)gcc +CCFLAGS = -c -O2 -g -fno-common -mcpu=cortex-m3 -mthumb -DUSE_FULL_ASSERT -I$(INC_DIR) -I$(DEV_DIR) -I$(COR_DIR) -I. -Werror=implicit-function-declaration + +AR = $(CROSS_COMPILE)ar +ARFLAGS = rs + +OBJECTS = \ +misc.o \ +stm32f10x_adc.o \ +stm32f10x_bkp.o \ +stm32f10x_can.o \ +stm32f10x_cec.o \ +stm32f10x_crc.o \ +stm32f10x_dac.o \ +stm32f10x_dbgmcu.o \ +stm32f10x_dma.o \ +stm32f10x_exti.o \ +stm32f10x_flash.o \ +stm32f10x_fsmc.o \ +stm32f10x_gpio.o \ +stm32f10x_i2c.o \ +stm32f10x_iwdg.o \ +stm32f10x_pwr.o \ +stm32f10x_rcc.o \ +stm32f10x_rtc.o \ +stm32f10x_sdio.o \ +stm32f10x_spi.o \ +stm32f10x_tim.o \ +stm32f10x_usart.o \ +stm32f10x_wwdg.o + +LIBRARY = libSTM_StdPeriph.a + +vpath %.c $(SRC_DIR) +vpath %.o $(OBJ_DIR) + +all: $(LIBRARY) + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +clean: + rm -rf $(LIBRARY) $(OBJ_DIR) + +$(OBJ_DIR): + mkdir -p $@ + +.PHONY: all clean diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/2f/e0db17be97970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/2f/e0db17be97970017138fe0bf747e5677 new file mode 100644 index 0000000..ec25c63 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/2f/e0db17be97970017138fe0bf747e5677 @@ -0,0 +1,75 @@ +// ----------------------------------------------------------------------------- +/// @file main.c +/// @brief Description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @file main.c +/// @ingroup {group_name} + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + +// FreeRTOS includes +#include "FreeRTOS.h" +#include "task.h" + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Type definitions +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// File-scope variables +// ----------------------------------------------------------------------------- + +/* Variable that counts at 20KHz to provide the time base for the run time +stats. */ +unsigned long ulRunTimeStatsClock = 0UL; + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function definitions +// ----------------------------------------------------------------------------- + + +int main (void) +{ + + + /* Start the scheduler. */ + vTaskStartScheduler(); + + /* Will only get here if there was insufficient memory to create the idle + task. The idle task is created within vTaskStartScheduler(). */ + for( ;; ); + + + return -1; +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/3/a0728d6c95970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/3/a0728d6c95970017138fe0bf747e5677 new file mode 100644 index 0000000..4397713 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/3/a0728d6c95970017138fe0bf747e5677 @@ -0,0 +1,131 @@ +ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +heap_4.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +STM32_CORE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) +-I$(STM32_CORE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -fno-common -mcpu=cortex-m3 -mthumb $(RELEASE_DEFINES) $(INCLUDES) +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -nostartfiles -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map +release: export LDARCHIVES := -L. -L$(STM32_STDPERIPH_ROOT) -lSTM_StdPeriph +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -f hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + rm -rf obj_release + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +else + +vpath %.c \ +src \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport + +vpath %.s $(STARTER_SCRIPT_DIR) +vpath %.o $(OBJ_DIR) + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) $(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)/$@ + +$(OBJ_DIR): + mkdir -p $@ + +endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/3/a0e9abc39e970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/3/a0e9abc39e970017138fe0bf747e5677 new file mode 100644 index 0000000..fc57b4f --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/3/a0e9abc39e970017138fe0bf747e5677 @@ -0,0 +1,89 @@ +// ----------------------------------------------------------------------------- +/// @file main.c +/// @brief Description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @file main.c +/// @ingroup {group_name} + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + +// FreeRTOS includes +#include "FreeRTOS.h" +#include "task.h" + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + +/* The time between cycles of the 'check' functionality (defined within the +tick hook. */ +#define mainCHECK_DELAY ( ( TickType_t ) 5000 / portTICK_PERIOD_MS ) + +// ----------------------------------------------------------------------------- +// Type definitions +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// File-scope variables +// ----------------------------------------------------------------------------- + +/* Variable that counts at 20KHz to provide the time base for the run time +stats. */ +unsigned long ulRunTimeStatsClock = 0UL; + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function definitions +// ----------------------------------------------------------------------------- + +void _init(void) {return;} +char * _sbrk( size_t x ) +{ + /* Just to remove compiler warning. */ + ( void ) x; + return NULL; +} + +int main (void) +{ + + + /* Start the scheduler. */ + vTaskStartScheduler(); + + /* Will only get here if there was insufficient memory to create the idle + task. The idle task is created within vTaskStartScheduler(). */ + for( ;; ); + + + return -1; +} + +void vApplicationTickHook () +{ + +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/3/c003ae83c696001713a7ede92b37d6f1 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/3/c003ae83c696001713a7ede92b37d6f1 new file mode 100644 index 0000000..5901c13 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/3/c003ae83c696001713a7ede92b37d6f1 @@ -0,0 +1,61 @@ +# STM support library + +SRC_DIR = Libraries/STM32F10x_StdPeriph_Driver/src/ +INC_DIR = Libraries/STM32F10x_StdPeriph_Driver/inc/ +DEV_DIR = Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/ +COR_DIR = Libraries/CMSIS/CM3/CoreSupport/ +OBJ_DIR = Libraries/STM32F10x_StdPeriph_Driver/obj + +CROSS_COMPILE = arm-none-eabi- + +CC = $(CROSS_COMPILE)gcc +CCFLAGS = -c -O2 -g -fno-common -mcpu=cortex-m3 -mthumb -DUSE_FULL_ASSERT -I$(INC_DIR) -I$(DEV_DIR) -I$(COR_DIR) -I. -Werror + +AR = $(CROSS_COMPILE)ar +ARFLAGS = rs + +OBJECTS = \ +misc.o \ +stm32f10x_adc.o \ +stm32f10x_bkp.o \ +stm32f10x_can.o \ +stm32f10x_cec.o \ +stm32f10x_crc.o \ +stm32f10x_dac.o \ +stm32f10x_dbgmcu.o \ +stm32f10x_dma.o \ +stm32f10x_exti.o \ +stm32f10x_flash.o \ +stm32f10x_fsmc.o \ +stm32f10x_gpio.o \ +stm32f10x_i2c.o \ +stm32f10x_iwdg.o \ +stm32f10x_pwr.o \ +stm32f10x_rcc.o \ +stm32f10x_rtc.o \ +stm32f10x_sdio.o \ +stm32f10x_spi.o \ +stm32f10x_tim.o \ +stm32f10x_usart.o \ +stm32f10x_wwdg.o + +LIBRARY = libSTM_StdPeriph.a + +vpath %.c $(SRC_DIR) +vpath %.o $(OBJ_DIR) + +all: $(LIBRARY) + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +clean: + rm -rf $(LIBRARY) $(OBJ_DIR) + +$(OBJ_DIR): + mkdir -p $@ + +.PHONY: all clean diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/3/c30e59089d9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/3/c30e59089d9400171201ed9ff9474498 new file mode 100644 index 0000000..b634724 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/3/c30e59089d9400171201ed9ff9474498 @@ -0,0 +1,157 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 4 +#define portSTACK_GROWTH -1 +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +/*-----------------------------------------------------------*/ + +uint32_t ulPortSetIPL( uint32_t ); +#define portDISABLE_INTERRUPTS() ulPortSetIPL( configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#define portENABLE_INTERRUPTS() ulPortSetIPL( 0 ) + + +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() + +extern UBaseType_t uxPortSetInterruptMaskFromISR( void ); +extern void vPortClearInterruptMaskFromISR( UBaseType_t ); +#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortSetIPL( configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedStatusRegister ) ulPortSetIPL( uxSavedStatusRegister ) + +/*-----------------------------------------------------------*/ + +/* Task utilities. */ +#define portNOP() asm volatile ( "nop" ) + +/* Context switches are requested using the force register. */ +#define portYIELD() INTC_SFRC = 0x3E; portNOP(); portNOP(); portNOP(); portNOP(); portNOP() + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) __attribute__((noreturn)) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*-----------------------------------------------------------*/ + +#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired != pdFALSE ) \ + { \ + portYIELD(); \ + } + + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/3/f02aa8b9c196001713a7ede92b37d6f1 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/3/f02aa8b9c196001713a7ede92b37d6f1 new file mode 100644 index 0000000..22eb719 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/3/f02aa8b9c196001713a7ede92b37d6f1 @@ -0,0 +1,59 @@ +# STM support library + +SRC_DIR = Libraries/STM32F10x_StdPeriph_Driver/src/ +INC_DIR = Libraries/STM32F10x_StdPeriph_Driver/inc/ +OBJ_DIR = Libraries/STM32F10x_StdPeriph_Driver/obj + +CROSS_COMPILE = arm-none-eabi- + +CC = $(CROSS_COMPILE)gcc +CCFLAGS = -xc -c -O2 -g -fno-common -mcpu=cortex-m3 -mthumb -DUSE_FULL_ASSERT -I$(INC_DIR) -I. + +AR = $(CROSS_COMPILE)ar +ARFLAGS = rs + +OBJECTS = \ +misc.o \ +stm32f10x_adc.o \ +stm32f10x_bkp.o \ +stm32f10x_can.o \ +stm32f10x_cec.o \ +stm32f10x_crc.o \ +stm32f10x_dac.o \ +stm32f10x_dbgmcu.o \ +stm32f10x_dma.o \ +stm32f10x_exti.o \ +stm32f10x_flash.o \ +stm32f10x_fsmc.o \ +stm32f10x_gpio.o \ +stm32f10x_i2c.o \ +stm32f10x_iwdg.o \ +stm32f10x_pwr.o \ +stm32f10x_rcc.o \ +stm32f10x_rtc.o \ +stm32f10x_sdio.o \ +stm32f10x_spi.o \ +stm32f10x_tim.o \ +stm32f10x_usart.o \ +stm32f10x_wwdg.o + +LIBRARY = libSTM_StdPeriph.a + +vpath %.c $(SRC_DIR) +vpath %.o $(OBJ_DIR) + +all: $(LIBRARY) + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +clean: + rm -rf $(LIBRARY) $(OBJ_DIR) + +$(OBJ_DIR): + mkdir -p $@ + +.PHONY: all clean diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/31/90144a679c970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/31/90144a679c970017138fe0bf747e5677 new file mode 100644 index 0000000..b503836 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/31/90144a679c970017138fe0bf747e5677 @@ -0,0 +1,205 @@ +/* +****************************************************************************** +** +** File : LinkerScript.ld +** +** Author : Auto-generated by Ac6 System Workbench +** +** Abstract : Linker script for STM32F107VCTx Device from STM32F1 series +** 64Kbytes RAM +** 256Kbytes ROM +** +** Set heap size, stack size and stack location according +** to application requirements. +** +** Set memory bank area and size if external memory is used. +** +** Target : STMicroelectronics STM32 +** +** Distribution: The file is distributed “as is,” without any warranty +** of any kind. +** +***************************************************************************** +** @attention +** +**

© COPYRIGHT(c) 2017 Ac6

+** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** 1. Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** 3. Neither the name of Ac6 nor the names of its contributors +** may be used to endorse or promote products derived from this software +** without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +***************************************************************************** +*/ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = 0x20010000; /* end of RAM */ + +_Min_Heap_Size = 0; /* required amount of heap */ +_Min_Stack_Size = 0x400; /* required amount of stack */ + +/* Memories definition */ +MEMORY +{ + RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K + ROM (rx) : ORIGIN = 0x8000000, LENGTH = 256K +} + +/* Sections */ +SECTIONS +{ + /* The startup code into ROM memory */ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } >ROM + + /* The program code and other data into ROM memory */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + } >ROM + + /* Constant data into ROM memory*/ + .rodata : + { + . = ALIGN(4); + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + . = ALIGN(4); + } >ROM + + .ARM.extab : { + . = ALIGN(4); + *(.ARM.extab* .gnu.linkonce.armextab.*) + . = ALIGN(4); + } >ROM + + .ARM : { + . = ALIGN(4); + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + . = ALIGN(4); + } >ROM + + .preinit_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + . = ALIGN(4); + } >ROM + + .init_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + . = ALIGN(4); + } >ROM + + .fini_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + . = ALIGN(4); + } >ROM + + /* Used by the startup to initialize data */ + _sidata = LOADADDR(.data); + + /* Initialized data sections into RAM memory */ + .data : + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + } >RAM AT> ROM + + + /* Uninitialized data section into RAM memory */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM + + /* User_heap_stack section, used to check that there is enough RAM left */ + ._user_heap_stack : + { + . = ALIGN(8); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(8); + } >RAM + + + + /* Remove information from the compiler libraries */ +/* /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } +*/ + GROUP: (libc.a) + + .ARM.attributes 0 : { *(.ARM.attributes) } + +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/32/f0559841a59700171090ed03afc2ec65 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/32/f0559841a59700171090ed03afc2ec65 new file mode 100644 index 0000000..c35ffeb --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/32/f0559841a59700171090ed03afc2ec65 @@ -0,0 +1,55 @@ +// ----------------------------------------------------------------------------- +/// @file freeRTOSFixes.c +/// @brief Description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @file freeRTOSFixes.c +/// @ingroup {group_name} + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Type definitions +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// File-scope variables +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function definitions +// ----------------------------------------------------------------------------- diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/34/d043e162fa96001713a7ede92b37d6f1 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/34/d043e162fa96001713a7ede92b37d6f1 new file mode 100644 index 0000000..f573253 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/34/d043e162fa96001713a7ede92b37d6f1 @@ -0,0 +1,202 @@ +/* +****************************************************************************** +** +** File : LinkerScript.ld +** +** Author : Auto-generated by Ac6 System Workbench +** +** Abstract : Linker script for STM32F107VCTx Device from STM32F1 series +** 64Kbytes RAM +** 256Kbytes ROM +** +** Set heap size, stack size and stack location according +** to application requirements. +** +** Set memory bank area and size if external memory is used. +** +** Target : STMicroelectronics STM32 +** +** Distribution: The file is distributed “as is,” without any warranty +** of any kind. +** +***************************************************************************** +** @attention +** +**

© COPYRIGHT(c) 2017 Ac6

+** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** 1. Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** 3. Neither the name of Ac6 nor the names of its contributors +** may be used to endorse or promote products derived from this software +** without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +***************************************************************************** +*/ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = 0x20010000; /* end of RAM */ + +_Min_Heap_Size = 0; /* required amount of heap */ +_Min_Stack_Size = 0x400; /* required amount of stack */ + +/* Memories definition */ +MEMORY +{ + RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K + ROM (rx) : ORIGIN = 0x8000000, LENGTH = 256K +} + +/* Sections */ +SECTIONS +{ + /* The startup code into ROM memory */ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } >ROM + + /* The program code and other data into ROM memory */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + } >ROM + + /* Constant data into ROM memory*/ + .rodata : + { + . = ALIGN(4); + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + . = ALIGN(4); + } >ROM + + .ARM.extab : { + . = ALIGN(4); + *(.ARM.extab* .gnu.linkonce.armextab.*) + . = ALIGN(4); + } >ROM + + .ARM : { + . = ALIGN(4); + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + . = ALIGN(4); + } >ROM + + .preinit_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + . = ALIGN(4); + } >ROM + + .init_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + . = ALIGN(4); + } >ROM + + .fini_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + . = ALIGN(4); + } >ROM + + /* Used by the startup to initialize data */ + _sidata = LOADADDR(.data); + + /* Initialized data sections into RAM memory */ + .data : + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + } >RAM AT> ROM + + + /* Uninitialized data section into RAM memory */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM + + /* User_heap_stack section, used to check that there is enough RAM left */ + ._user_heap_stack : + { + . = ALIGN(8); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(8); + } >RAM + + + + /* Remove information from the compiler libraries */ + /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } + + .ARM.attributes 0 : { *(.ARM.attributes) } +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/38/20ce3f6fa59700171090ed03afc2ec65 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/38/20ce3f6fa59700171090ed03afc2ec65 new file mode 100644 index 0000000..664088c --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/38/20ce3f6fa59700171090ed03afc2ec65 @@ -0,0 +1,94 @@ +// ----------------------------------------------------------------------------- +/// @file main.c +/// @brief Description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @file main.c +/// @ingroup {group_name} + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + +// FreeRTOS includes +#include "FreeRTOS.h" +#include "task.h" + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + +/* The time between cycles of the 'check' functionality (defined within the +tick hook. */ +#define mainCHECK_DELAY ( ( TickType_t ) 5000 / portTICK_PERIOD_MS ) + +// ----------------------------------------------------------------------------- +// Type definitions +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// File-scope variables +// ----------------------------------------------------------------------------- + +/* Variable that counts at 20KHz to provide the time base for the run time +stats. */ +unsigned long ulRunTimeStatsClock = 0UL; + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function definitions +// ----------------------------------------------------------------------------- + +void _init(void) {return;} +char * _sbrk( size_t x ) +{ + /* Just to remove compiler warning. */ + ( void ) x; + return NULL; +} + +int main (void) +{ + + + /* Start the scheduler. */ + vTaskStartScheduler(); + + /* Will only get here if there was insufficient memory to create the idle + task. The idle task is created within vTaskStartScheduler(). */ + for( ;; ); + + + return -1; +} + +void vApplicationTickHook () +{ + +} + +void vApplicationStackOverflowHook () +{ + +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/3a/50e2af9ba69700171090ed03afc2ec65 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/3a/50e2af9ba69700171090ed03afc2ec65 new file mode 100644 index 0000000..5a681ef --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/3a/50e2af9ba69700171090ed03afc2ec65 @@ -0,0 +1,109 @@ +// ----------------------------------------------------------------------------- +/// @file freeRTOSFixes.c +/// @brief Description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @file freeRTOSFixes.c +/// @ingroup {group_name} + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + +#include +#include +#include + +#include "freeRTOSFixes.h" + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Type definitions +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// File-scope variables +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function definitions +// ----------------------------------------------------------------------------- + +void _init(void) {return;} + +void OS_logTaskInfo(xTaskHandle taskHandle) +{ + unsigned portBASE_TYPE highWaterMark; + char text[128]; + + snprintf(text, sizeof(text), "Task %s\n", pcTaskGetTaskName(taskHandle)); +// Shell_sendString(text); + + highWaterMark = uxTaskGetStackHighWaterMark(taskHandle); +// snprintf(text, sizeof(text), "Stack high water mark : %lu long words\n", highWaterMark); +// Shell_sendString(text); +} + +// Implementation for libc, needed for printf related functions. +caddr_t _sbrk(int incr) +{ + extern char _end; + static char* heap_end; + char* prev_heap_end; + + if(heap_end == 0) + { + heap_end = &_end; + } + + prev_heap_end = heap_end; + heap_end += incr; + return (caddr_t)prev_heap_end; +} + +// Stack overflow hook +void vApplicationStackOverflowHook(xTaskHandle xTask, signed portCHAR* pcTaskName) +{ +// Logger_fatal(FATALCODE_STACKOVERFLOW); +} + +// Malloc failed hook +void vApplicationMallocFailedHook(void) +{ +// Logger_fatal(FATALCODE_MALLOCFAILED); +} + +// Assert for StdPeriph library +void assert_failed(uint8_t* file, uint32_t line) +{ +// Logger_log((char*)file, "", line, LOGTYPE_ERROR, "assert failed"); +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/3c/f04aa2cea59700171090ed03afc2ec65 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/3c/f04aa2cea59700171090ed03afc2ec65 new file mode 100644 index 0000000..6e97578 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/3c/f04aa2cea59700171090ed03afc2ec65 @@ -0,0 +1,135 @@ +ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +freeRTOSFixes.c \ +heap_4.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +STM32_CORE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) \ +-I$(STM32_CORE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -lc -lm -fno-common -mcpu=cortex-m3 -mthumb $(RELEASE_DEFINES) $(INCLUDES) +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -nostartfiles -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map +release: export LDARCHIVES := -L. -L$(STM32_STDPERIPH_ROOT) -lSTM_StdPeriph -lhsb_mrts_release +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -f hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + rm -rf obj_release + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +else + +vpath %.c \ +src \ +startup \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport + +vpath %.s \ +startup +vpath %.o \ +obj_release + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) $(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)/$@ + +$(OBJ_DIR): + mkdir -p $@ + +endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/3d/90f93f4bcf96001713a7ede92b37d6f1 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/3d/90f93f4bcf96001713a7ede92b37d6f1 new file mode 100644 index 0000000..cca8b97 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/3d/90f93f4bcf96001713a7ede92b37d6f1 @@ -0,0 +1,68 @@ +# STM support library + +STM32_STDPERIPH_INC = Libraries/STM32F10x_StdPeriph_Driver/inc/ +CORE_DIR = Libraries/CMSIS/CM3/CoreSupport/ +DEVICE_SUPPORT_DIR = Libraries/CMSIS/CM3/DrviceSupport/ST/STM32F10x + +SRC_DIR = Libraries/STM32F10x_StdPeriph_Driver/src/ + +INCLUDE_DIRS = \ +-I$(STM32_STDPERIPH_INC) \ +-I$(CIRE_DIR) \ +-I$(DEVICE_SUPPORT_DIR) \ + +OBJ_DIR = Libraries/STM32F10x_StdPeriph_Driver/obj + +CROSS_COMPILE = arm-none-eabi- + +CC = $(CROSS_COMPILE)gcc +CCFLAGS = -c -O2 -g -fno-common -mcpu=cortex-m3 -mthumb -DUSE_FULL_ASSERT -I$(INCLUDE_DIRS)-I. -Wall -Werror -D"assert_param(expr)=((void)0)" + +AR = $(CROSS_COMPILE)ar +ARFLAGS = rs + +OBJECTS = \ +misc.o \ +stm32f10x_adc.o \ +stm32f10x_bkp.o \ +stm32f10x_can.o \ +stm32f10x_cec.o \ +stm32f10x_crc.o \ +stm32f10x_dac.o \ +stm32f10x_dbgmcu.o \ +stm32f10x_dma.o \ +stm32f10x_exti.o \ +stm32f10x_flash.o \ +stm32f10x_fsmc.o \ +stm32f10x_gpio.o \ +stm32f10x_i2c.o \ +stm32f10x_iwdg.o \ +stm32f10x_pwr.o \ +stm32f10x_rcc.o \ +stm32f10x_rtc.o \ +stm32f10x_sdio.o \ +stm32f10x_spi.o \ +stm32f10x_tim.o \ +stm32f10x_usart.o \ +stm32f10x_wwdg.o + +LIBRARY = libSTM_StdPeriph.a + +vpath %.c $(SRC_DIR) +vpath %.o $(OBJ_DIR) + +all: $(LIBRARY) + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +clean: + rm -rf $(LIBRARY) $(OBJ_DIR) + +$(OBJ_DIR): + mkdir -p $@ + +.PHONY: all clean diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/3f/c02c54089d9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/3f/c02c54089d9400171201ed9ff9474498 new file mode 100644 index 0000000..ea1b9e2 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/3f/c02c54089d9400171201ed9ff9474498 @@ -0,0 +1,162 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* +Changes from V1.00: + + + pxPortInitialiseStack() now initialises the stack of new tasks to the + same format used by the compiler. This allows the compiler generated + interrupt mechanism to be used for context switches. + +Changes from V2.6.1 + + + Move usPortCheckFreeStackSpace() to tasks.c. +*/ + + +#include +#include +#include "FreeRTOS.h" + +/*-----------------------------------------------------------*/ + +/* See header file for description. */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +StackType_t DS_Reg = 0; + + /* Place a few bytes of known values on the bottom of the stack. + This is just useful for debugging. */ + + *pxTopOfStack = 0x1111; + pxTopOfStack--; + *pxTopOfStack = 0x2222; + pxTopOfStack--; + *pxTopOfStack = 0x3333; + pxTopOfStack--; + *pxTopOfStack = 0x4444; + pxTopOfStack--; + *pxTopOfStack = 0x5555; + pxTopOfStack--; + + + /*lint -e950 -e611 -e923 Lint doesn't like this much - but nothing I can do about it. */ + + /* We are going to start the scheduler using a return from interrupt + instruction to load the program counter, so first there would be the + function call with parameters preamble. */ + + *pxTopOfStack = FP_SEG( pvParameters ); + pxTopOfStack--; + *pxTopOfStack = FP_OFF( pvParameters ); + pxTopOfStack--; + *pxTopOfStack = FP_SEG( pxCode ); + pxTopOfStack--; + *pxTopOfStack = FP_OFF( pxCode ); + pxTopOfStack--; + + /* Next the status register and interrupt return address. */ + *pxTopOfStack = portINITIAL_SW; + pxTopOfStack--; + *pxTopOfStack = FP_SEG( pxCode ); + pxTopOfStack--; + *pxTopOfStack = FP_OFF( pxCode ); + pxTopOfStack--; + + /* The remaining registers would be pushed on the stack by our context + switch function. These are loaded with values simply to make debugging + easier. */ + *pxTopOfStack = ( StackType_t ) 0xAAAA; /* AX */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xBBBB; /* BX */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xCCCC; /* CX */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xDDDD; /* DX */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xEEEE; /* ES */ + pxTopOfStack--; + + /* We need the true data segment. */ + __asm{ MOV DS_Reg, DS }; + + *pxTopOfStack = DS_Reg; /* DS */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x0123; /* SI */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xDDDD; /* DI */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xBBBB; /* BP */ + + /*lint +e950 +e611 +e923 */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/42/2077d4d592970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/42/2077d4d592970017138fe0bf747e5677 new file mode 100644 index 0000000..005115a --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/42/2077d4d592970017138fe0bf747e5677 @@ -0,0 +1,128 @@ +ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +heap_4.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -fno-common -mcpu=cortex-m3 -mthumb $(RELEASE_DEFINES) $(INCLUDES) +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -nostartfiles -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map +release: export LDARCHIVES := -L. -L$(STM32_STDPERIPH_ROOT) -lSTM_StdPeriph +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -f hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + rm -rf obj_release + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +else + +vpath %.c \ +src \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ +$(STM32_DEVICE_SUPPORT_DIR) + +vpath %.s $(STARTER_SCRIPT_DIR) +vpath %.o $(OBJ_DIR) + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) #$(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +#$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) +# $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)/$@ + +$(OBJ_DIR): + mkdir -p $@ + +endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/42/a08462089d9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/42/a08462089d9400171201ed9ff9474498 new file mode 100644 index 0000000..e1b89ae --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/42/a08462089d9400171201ed9ff9474498 @@ -0,0 +1,68 @@ +;/* +; FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. +; All rights reserved +; +; +; *************************************************************************** +; * * +; * FreeRTOS tutorial books are available in pdf and paperback. * +; * Complete, revised, and edited pdf reference manuals are also * +; * available. * +; * * +; * Purchasing FreeRTOS documentation will not only help you, by * +; * ensuring you get running as quickly as possible and with an * +; * in-depth knowledge of how to use FreeRTOS, it will also help * +; * the FreeRTOS project to continue with its mission of providing * +; * professional grade, cross platform, de facto standard solutions * +; * for microcontrollers - completely free of charge! * +; * * +; * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * +; * * +; * Thank you for using FreeRTOS, and thank you for your support! * +; * * +; *************************************************************************** +; +; +; This file is part of the FreeRTOS distribution. +; +; FreeRTOS is free software; you can redistribute it and/or modify it under +; the terms of the GNU General Public License (version 2) as published by the +; Free Software Foundation AND MODIFIED BY the FreeRTOS exception. +; >>>NOTE<<< The modification to the GPL is included to allow you to +; distribute a combined work that includes FreeRTOS without being obliged to +; provide the source code for proprietary components outside of the FreeRTOS +; kernel. FreeRTOS is distributed in the hope that it will be useful, but +; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +; more details. You should have received a copy of the GNU General Public +; License and the FreeRTOS license exception along with FreeRTOS; if not it +; can be viewed here: http://www.freertos.org/a00114.html and also obtained +; by writing to Richard Barry, contact details for whom are available on the +; FreeRTOS WEB site. +; +; 1 tab == 4 spaces! +; +; http://www.FreeRTOS.org - Documentation, latest information, license and +; contact details. +; +; http://www.SafeRTOS.com - A version that is certified for use in safety +; critical systems. +; +; http://www.OpenRTOS.com - Commercial support, development, porting, +; licensing and training services. +;*/ + .GLB _vSoftwareInterruptISR + .GLB _vSoftwareInterruptEntry + + .SECTION P,CODE + +_vSoftwareInterruptEntry: + + BRA _vSoftwareInterruptISR + + .RVECTOR 27, _vSoftwareInterruptEntry + + .END + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/43/50c0ca58a59700171090ed03afc2ec65 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/43/50c0ca58a59700171090ed03afc2ec65 new file mode 100644 index 0000000..c6d6feb --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/43/50c0ca58a59700171090ed03afc2ec65 @@ -0,0 +1,53 @@ +// ----------------------------------------------------------------------------- +/// @file freeRTOSFixes.h +/// @brief File description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @defgroup {group_name} {group_description} +/// Description + +/// @file freeRTOSFixes.h +/// @ingroup {group_name} + + +#ifndef FREERTOSFIXES_H_ +#define FREERTOSFIXES_H_ + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Type definitions. +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + +#endif /* FREERTOSFIXES_H_ */ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/43/a06973519c970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/43/a06973519c970017138fe0bf747e5677 new file mode 100644 index 0000000..429fe39 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/43/a06973519c970017138fe0bf747e5677 @@ -0,0 +1,204 @@ +/* +****************************************************************************** +** +** File : LinkerScript.ld +** +** Author : Auto-generated by Ac6 System Workbench +** +** Abstract : Linker script for STM32F107VCTx Device from STM32F1 series +** 64Kbytes RAM +** 256Kbytes ROM +** +** Set heap size, stack size and stack location according +** to application requirements. +** +** Set memory bank area and size if external memory is used. +** +** Target : STMicroelectronics STM32 +** +** Distribution: The file is distributed “as is,” without any warranty +** of any kind. +** +***************************************************************************** +** @attention +** +**

© COPYRIGHT(c) 2017 Ac6

+** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** 1. Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** 3. Neither the name of Ac6 nor the names of its contributors +** may be used to endorse or promote products derived from this software +** without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +***************************************************************************** +*/ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = 0x20010000; /* end of RAM */ + +_Min_Heap_Size = 0; /* required amount of heap */ +_Min_Stack_Size = 0x400; /* required amount of stack */ + +/* Memories definition */ +MEMORY +{ + RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K + ROM (rx) : ORIGIN = 0x8000000, LENGTH = 256K +} + +/* Sections */ +SECTIONS +{ + /* The startup code into ROM memory */ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } >ROM + + /* The program code and other data into ROM memory */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + } >ROM + + /* Constant data into ROM memory*/ + .rodata : + { + . = ALIGN(4); + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + . = ALIGN(4); + } >ROM + + .ARM.extab : { + . = ALIGN(4); + *(.ARM.extab* .gnu.linkonce.armextab.*) + . = ALIGN(4); + } >ROM + + .ARM : { + . = ALIGN(4); + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + . = ALIGN(4); + } >ROM + + .preinit_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + . = ALIGN(4); + } >ROM + + .init_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + . = ALIGN(4); + } >ROM + + .fini_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + . = ALIGN(4); + } >ROM + + /* Used by the startup to initialize data */ + _sidata = LOADADDR(.data); + + /* Initialized data sections into RAM memory */ + .data : + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + } >RAM AT> ROM + + + /* Uninitialized data section into RAM memory */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM + + /* User_heap_stack section, used to check that there is enough RAM left */ + ._user_heap_stack : + { + . = ALIGN(8); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(8); + } >RAM + + + + /* Remove information from the compiler libraries */ +/* /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } +*/ + GROUP (libc.a) + .ARM.attributes 0 : { *(.ARM.attributes) } + +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/45/90205ca3cf96001713a7ede92b37d6f1 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/45/90205ca3cf96001713a7ede92b37d6f1 new file mode 100644 index 0000000..a7b2914 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/45/90205ca3cf96001713a7ede92b37d6f1 @@ -0,0 +1,68 @@ +# STM support library + +STM32_STDPERIPH_INC = Libraries/STM32F10x_StdPeriph_Driver/inc/ +CORE_DIR = Libraries/CMSIS/CM3/CoreSupport/ +DEVICE_SUPPORT_DIR = Libraries/CMSIS/CM3/DrviceSupport/ST/STM32F10x + +SRC_DIR = Libraries/STM32F10x_StdPeriph_Driver/src/ + +INCLUDE_DIRS = \ +-I$(STM32_STDPERIPH_INC) \ +-I$(CIRE_DIR) \ +#-I$(DEVICE_SUPPORT_DIR) \ + +OBJ_DIR = Libraries/STM32F10x_StdPeriph_Driver/obj + +CROSS_COMPILE = arm-none-eabi- + +CC = $(CROSS_COMPILE)gcc +CCFLAGS = -c -O2 -g -fno-common -mcpu=cortex-m3 -mthumb -DUSE_FULL_ASSERT $(INCLUDE_DIRS) -I. -Wall -Werror -D"assert_param(expr)=((void)0)" + +AR = $(CROSS_COMPILE)ar +ARFLAGS = rs + +OBJECTS = \ +misc.o \ +stm32f10x_adc.o \ +stm32f10x_bkp.o \ +stm32f10x_can.o \ +stm32f10x_cec.o \ +stm32f10x_crc.o \ +stm32f10x_dac.o \ +stm32f10x_dbgmcu.o \ +stm32f10x_dma.o \ +stm32f10x_exti.o \ +stm32f10x_flash.o \ +stm32f10x_fsmc.o \ +stm32f10x_gpio.o \ +stm32f10x_i2c.o \ +stm32f10x_iwdg.o \ +stm32f10x_pwr.o \ +stm32f10x_rcc.o \ +stm32f10x_rtc.o \ +stm32f10x_sdio.o \ +stm32f10x_spi.o \ +stm32f10x_tim.o \ +stm32f10x_usart.o \ +stm32f10x_wwdg.o + +LIBRARY = libSTM_StdPeriph.a + +vpath %.c $(SRC_DIR) +vpath %.o $(OBJ_DIR) + +all: $(LIBRARY) + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +clean: + rm -rf $(LIBRARY) $(OBJ_DIR) + +$(OBJ_DIR): + mkdir -p $@ + +.PHONY: all clean diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/46/2015665098970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/46/2015665098970017138fe0bf747e5677 new file mode 100644 index 0000000..e3b4045 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/46/2015665098970017138fe0bf747e5677 @@ -0,0 +1,78 @@ +// ----------------------------------------------------------------------------- +/// @file main.c +/// @brief Description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @file main.c +/// @ingroup {group_name} + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + +// FreeRTOS includes +#include "FreeRTOS.h" +#include "task.h" + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + +/* The time between cycles of the 'check' functionality (defined within the +tick hook. */ +#define mainCHECK_DELAY ( ( TickType_t ) 5000 / portTICK_PERIOD_MS ) + +// ----------------------------------------------------------------------------- +// Type definitions +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// File-scope variables +// ----------------------------------------------------------------------------- + +/* Variable that counts at 20KHz to provide the time base for the run time +stats. */ +unsigned long ulRunTimeStatsClock = 0UL; + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function definitions +// ----------------------------------------------------------------------------- + + +int main (void) +{ + + + /* Start the scheduler. */ + vTaskStartScheduler(); + + /* Will only get here if there was insufficient memory to create the idle + task. The idle task is created within vTaskStartScheduler(). */ + for( ;; ); + + + return -1; +} + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/46/402bb61390970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/46/402bb61390970017138fe0bf747e5677 new file mode 100644 index 0000000..74ed2c4 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/46/402bb61390970017138fe0bf747e5677 @@ -0,0 +1,126 @@ +ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +heap_4.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -fno-common -mcpu=cortex-m3 -mthumb $(RELEASE_DEFINES) $(INCLUDES) +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -nostartfiles -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map +release: export LDARCHIVES := -L. -L$(STM32_STDPERIPH_ROOT) -lSTM_StdPeriph +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -rf $(OBJ_DIR) hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +else + +vpath %.c \ +src \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ +$(STM32_DEVICE_SUPPORT_DIR) +vpath %.s $(STARTER_SCRIPT_DIR) +vpath %.o $(OBJ_DIR) + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) #$(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +#$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) +# $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)$@ + +$(OBJ_DIR): + mkdir -p $@ + +endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/47/b1c95d089d9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/47/b1c95d089d9400171201ed9ff9474498 new file mode 100644 index 0000000..4acc091 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/47/b1c95d089d9400171201ed9ff9474498 @@ -0,0 +1,688 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the RX100 port. + *----------------------------------------------------------*/ + +/* Standard C includes. */ +#include "limits.h" + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Library includes. */ +#include "string.h" + +/* Hardware specifics. */ +#include "iodefine.h" + +/*-----------------------------------------------------------*/ + +/* Tasks should start with interrupts enabled and in Supervisor mode, therefore +PSW is set with U and I set, and PM and IPL clear. */ +#define portINITIAL_PSW ( ( StackType_t ) 0x00030000 ) + +/* The peripheral clock is divided by this value before being supplying the +CMT. */ +#if ( configUSE_TICKLESS_IDLE == 0 ) + /* If tickless idle is not used then the divisor can be fixed. */ + #define portCLOCK_DIVISOR 8UL +#elif ( configPERIPHERAL_CLOCK_HZ >= 12000000 ) + #define portCLOCK_DIVISOR 512UL +#elif ( configPERIPHERAL_CLOCK_HZ >= 6000000 ) + #define portCLOCK_DIVISOR 128UL +#elif ( configPERIPHERAL_CLOCK_HZ >= 1000000 ) + #define portCLOCK_DIVISOR 32UL +#else + #define portCLOCK_DIVISOR 8UL +#endif + + +/* Keys required to lock and unlock access to certain system registers +respectively. */ +#define portUNLOCK_KEY 0xA50B +#define portLOCK_KEY 0xA500 + +/*-----------------------------------------------------------*/ + +/* The following lines are to ensure vSoftwareInterruptEntry can be referenced, + and therefore installed in the vector table, when the FreeRTOS code is built +as a library. */ +extern BaseType_t vSoftwareInterruptEntry; +const BaseType_t * p_vSoftwareInterruptEntry = &vSoftwareInterruptEntry; + +/*-----------------------------------------------------------*/ + +/* + * Function to start the first task executing - written in asm code as direct + * access to registers is required. + */ +static void prvStartFirstTask( void ); + +/* + * Software interrupt handler. Performs the actual context switch (saving and + * restoring of registers). Written in asm code as direct register access is + * required. + */ +static void prvYieldHandler( void ); + +/* + * The entry point for the software interrupt handler. This is the function + * that calls the inline asm function prvYieldHandler(). It is installed in + * the vector table, but the code that installs it is in prvYieldHandler rather + * than using a #pragma. + */ +void vSoftwareInterruptISR( void ); + +/* + * Sets up the periodic ISR used for the RTOS tick using the CMT. + * The application writer can define configSETUP_TICK_INTERRUPT() (in + * FreeRTOSConfig.h) such that their own tick interrupt configuration is used + * in place of prvSetupTimerInterrupt(). + */ +static void prvSetupTimerInterrupt( void ); +#ifndef configSETUP_TICK_INTERRUPT + /* The user has not provided their own tick interrupt configuration so use + the definition in this file (which uses the interval timer). */ + #define configSETUP_TICK_INTERRUPT() prvSetupTimerInterrupt() +#endif /* configSETUP_TICK_INTERRUPT */ + +/* + * Called after the sleep mode registers have been configured, prvSleep() + * executes the pre and post sleep macros, and actually calls the wait + * instruction. + */ +#if configUSE_TICKLESS_IDLE == 1 + static void prvSleep( TickType_t xExpectedIdleTime ); +#endif /* configUSE_TICKLESS_IDLE */ + +/*-----------------------------------------------------------*/ + +/* These is accessed by the inline assembler functions. */ +extern void *pxCurrentTCB; +extern void vTaskSwitchContext( void ); + +/*-----------------------------------------------------------*/ + +/* Calculate how many clock increments make up a single tick period. */ +static const uint32_t ulMatchValueForOneTick = ( ( configPERIPHERAL_CLOCK_HZ / portCLOCK_DIVISOR ) / configTICK_RATE_HZ ); + +#if configUSE_TICKLESS_IDLE == 1 + + /* Holds the maximum number of ticks that can be suppressed - which is + basically how far into the future an interrupt can be generated. Set + during initialisation. This is the maximum possible value that the + compare match register can hold divided by ulMatchValueForOneTick. */ + static const TickType_t xMaximumPossibleSuppressedTicks = USHRT_MAX / ( ( configPERIPHERAL_CLOCK_HZ / portCLOCK_DIVISOR ) / configTICK_RATE_HZ ); + + /* Flag set from the tick interrupt to allow the sleep processing to know if + sleep mode was exited because of a tick interrupt, or an interrupt + generated by something else. */ + static volatile uint32_t ulTickFlag = pdFALSE; + + /* The CMT counter is stopped temporarily each time it is re-programmed. + The following constant offsets the CMT counter match value by the number of + CMT counts that would typically be missed while the counter was stopped to + compensate for the lost time. The large difference between the divided CMT + clock and the CPU clock means it is likely ulStoppedTimerCompensation will + equal zero - and be optimised away. */ + static const uint32_t ulStoppedTimerCompensation = 100UL / ( configCPU_CLOCK_HZ / ( configPERIPHERAL_CLOCK_HZ / portCLOCK_DIVISOR ) ); + +#endif + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Offset to end up on 8 byte boundary. */ + pxTopOfStack--; + + /* R0 is not included as it is the stack pointer. */ + *pxTopOfStack = 0x00; + pxTopOfStack--; + *pxTopOfStack = 0x00; + pxTopOfStack--; + *pxTopOfStack = portINITIAL_PSW; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; + + /* When debugging it can be useful if every register is set to a known + value. Otherwise code space can be saved by just setting the registers + that need to be set. */ + #ifdef USE_FULL_REGISTER_INITIALISATION + { + pxTopOfStack--; + *pxTopOfStack = 0x12345678; /* r15. */ + pxTopOfStack--; + *pxTopOfStack = 0xaaaabbbb; + pxTopOfStack--; + *pxTopOfStack = 0xdddddddd; + pxTopOfStack--; + *pxTopOfStack = 0xcccccccc; + pxTopOfStack--; + *pxTopOfStack = 0xbbbbbbbb; + pxTopOfStack--; + *pxTopOfStack = 0xaaaaaaaa; + pxTopOfStack--; + *pxTopOfStack = 0x99999999; + pxTopOfStack--; + *pxTopOfStack = 0x88888888; + pxTopOfStack--; + *pxTopOfStack = 0x77777777; + pxTopOfStack--; + *pxTopOfStack = 0x66666666; + pxTopOfStack--; + *pxTopOfStack = 0x55555555; + pxTopOfStack--; + *pxTopOfStack = 0x44444444; + pxTopOfStack--; + *pxTopOfStack = 0x33333333; + pxTopOfStack--; + *pxTopOfStack = 0x22222222; + pxTopOfStack--; + } + #else + { + /* Leave space for the registers that will get popped from the stack + when the task first starts executing. */ + pxTopOfStack -= 15; + } + #endif + + *pxTopOfStack = ( StackType_t ) pvParameters; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = 0x12345678; /* Accumulator. */ + pxTopOfStack--; + *pxTopOfStack = 0x87654321; /* Accumulator. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* Use pxCurrentTCB just so it does not get optimised away. */ + if( pxCurrentTCB != NULL ) + { + /* Call an application function to set up the timer that will generate + the tick interrupt. This way the application can decide which + peripheral to use. If tickless mode is used then the default + implementation defined in this file (which uses CMT0) should not be + overridden. */ + configSETUP_TICK_INTERRUPT(); + + /* Enable the software interrupt. */ + _IEN( _ICU_SWINT ) = 1; + + /* Ensure the software interrupt is clear. */ + _IR( _ICU_SWINT ) = 0; + + /* Ensure the software interrupt is set to the kernel priority. */ + _IPR( _ICU_SWINT ) = configKERNEL_INTERRUPT_PRIORITY; + + /* Start the first task. */ + prvStartFirstTask(); + } + + /* Execution should not reach here as the tasks are now running! + prvSetupTimerInterrupt() is called here to prevent the compiler outputting + a warning about a statically declared function not being referenced in the + case that the application writer has provided their own tick interrupt + configuration routine (and defined configSETUP_TICK_INTERRUPT() such that + their own routine will be called in place of prvSetupTimerInterrupt()). */ + prvSetupTimerInterrupt(); + + /* Just to make sure the function is not optimised away. */ + ( void ) vSoftwareInterruptISR(); + + /* Should not get here. */ + return pdFAIL; +} +/*-----------------------------------------------------------*/ + +#pragma inline_asm prvStartFirstTask +static void prvStartFirstTask( void ) +{ + /* When starting the scheduler there is nothing that needs moving to the + interrupt stack because the function is not called from an interrupt. + Just ensure the current stack is the user stack. */ + SETPSW U + + /* Obtain the location of the stack associated with which ever task + pxCurrentTCB is currently pointing to. */ + MOV.L #_pxCurrentTCB, R15 + MOV.L [R15], R15 + MOV.L [R15], R0 + + /* Restore the registers from the stack of the task pointed to by + pxCurrentTCB. */ + POP R15 + MVTACLO R15 /* Accumulator low 32 bits. */ + POP R15 + MVTACHI R15 /* Accumulator high 32 bits. */ + POPM R1-R15 /* R1 to R15 - R0 is not included as it is the SP. */ + RTE /* This pops the remaining registers. */ + NOP + NOP +} +/*-----------------------------------------------------------*/ + +#pragma interrupt ( prvTickISR( vect = configTICK_VECTOR, enable ) ) +void prvTickISR( void ) +{ + /* Increment the tick, and perform any processing the new tick value + necessitates. */ + set_ipl( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + { + if( xTaskIncrementTick() != pdFALSE ) + { + taskYIELD(); + } + } + set_ipl( configKERNEL_INTERRUPT_PRIORITY ); + + #if configUSE_TICKLESS_IDLE == 1 + { + /* The CPU woke because of a tick. */ + ulTickFlag = pdTRUE; + + /* If this is the first tick since exiting tickless mode then the CMT + compare match value needs resetting. */ + CMT0.CMCOR = ( uint16_t ) ulMatchValueForOneTick; + } + #endif +} +/*-----------------------------------------------------------*/ + +void vSoftwareInterruptISR( void ) +{ + prvYieldHandler(); +} +/*-----------------------------------------------------------*/ + +#pragma inline_asm prvYieldHandler +static void prvYieldHandler( void ) +{ + /* Re-enable interrupts. */ + SETPSW I + + /* Move the data that was automatically pushed onto the interrupt stack + when the interrupt occurred from the interrupt stack to the user stack. + + R15 is saved before it is clobbered. */ + PUSH.L R15 + + /* Read the user stack pointer. */ + MVFC USP, R15 + + /* Move the address down to the data being moved. */ + SUB #12, R15 + MVTC R15, USP + + /* Copy the data across. */ + MOV.L [ R0 ], [ R15 ] ; R15 + MOV.L 4[ R0 ], 4[ R15 ] ; PC + MOV.L 8[ R0 ], 8[ R15 ] ; PSW + + /* Move the interrupt stack pointer to its new correct position. */ + ADD #12, R0 + + /* All the rest of the registers are saved directly to the user stack. */ + SETPSW U + + /* Save the rest of the general registers (R15 has been saved already). */ + PUSHM R1-R14 + + /* Save the accumulator. */ + MVFACHI R15 + PUSH.L R15 + MVFACMI R15 ; Middle order word. + SHLL #16, R15 ; Shifted left as it is restored to the low order word. + PUSH.L R15 + + /* Save the stack pointer to the TCB. */ + MOV.L #_pxCurrentTCB, R15 + MOV.L [ R15 ], R15 + MOV.L R0, [ R15 ] + + /* Ensure the interrupt mask is set to the syscall priority while the + kernel structures are being accessed. */ + MVTIPL #configMAX_SYSCALL_INTERRUPT_PRIORITY + + /* Select the next task to run. */ + BSR.A _vTaskSwitchContext + + /* Reset the interrupt mask as no more data structure access is + required. */ + MVTIPL #configKERNEL_INTERRUPT_PRIORITY + + /* Load the stack pointer of the task that is now selected as the Running + state task from its TCB. */ + MOV.L #_pxCurrentTCB,R15 + MOV.L [ R15 ], R15 + MOV.L [ R15 ], R0 + + /* Restore the context of the new task. The PSW (Program Status Word) and + PC will be popped by the RTE instruction. */ + POP R15 + MVTACLO R15 + POP R15 + MVTACHI R15 + POPM R1-R15 + RTE + NOP + NOP +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( pxCurrentTCB == NULL ); + + /* The following line is just to prevent the symbol getting optimised away. */ + ( void ) vTaskSwitchContext(); +} +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt( void ) +{ + /* Unlock. */ + SYSTEM.PRCR.WORD = portUNLOCK_KEY; + + /* Enable CMT0. */ + MSTP( CMT0 ) = 0; + + /* Lock again. */ + SYSTEM.PRCR.WORD = portLOCK_KEY; + + /* Interrupt on compare match. */ + CMT0.CMCR.BIT.CMIE = 1; + + /* Set the compare match value. */ + CMT0.CMCOR = ( uint16_t ) ulMatchValueForOneTick; + + /* Divide the PCLK. */ + #if portCLOCK_DIVISOR == 512 + { + CMT0.CMCR.BIT.CKS = 3; + } + #elif portCLOCK_DIVISOR == 128 + { + CMT0.CMCR.BIT.CKS = 2; + } + #elif portCLOCK_DIVISOR == 32 + { + CMT0.CMCR.BIT.CKS = 1; + } + #elif portCLOCK_DIVISOR == 8 + { + CMT0.CMCR.BIT.CKS = 0; + } + #else + { + #error Invalid portCLOCK_DIVISOR setting + } + #endif + + + /* Enable the interrupt... */ + _IEN( _CMT0_CMI0 ) = 1; + + /* ...and set its priority to the application defined kernel priority. */ + _IPR( _CMT0_CMI0 ) = configKERNEL_INTERRUPT_PRIORITY; + + /* Start the timer. */ + CMT.CMSTR0.BIT.STR0 = 1; +} +/*-----------------------------------------------------------*/ + +#if configUSE_TICKLESS_IDLE == 1 + + static void prvSleep( TickType_t xExpectedIdleTime ) + { + /* Allow the application to define some pre-sleep processing. */ + configPRE_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* xExpectedIdleTime being set to 0 by configPRE_SLEEP_PROCESSING() + means the application defined code has already executed the WAIT + instruction. */ + if( xExpectedIdleTime > 0 ) + { + wait(); + } + + /* Allow the application to define some post sleep processing. */ + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + } + +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +#if configUSE_TICKLESS_IDLE == 1 + + void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulMatchValue, ulCompleteTickPeriods, ulCurrentCount; + eSleepModeStatus eSleepAction; + + /* THIS FUNCTION IS CALLED WITH THE SCHEDULER SUSPENDED. */ + + /* Make sure the CMT reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Calculate the reload value required to wait xExpectedIdleTime tick + periods. */ + ulMatchValue = ulMatchValueForOneTick * xExpectedIdleTime; + if( ulMatchValue > ulStoppedTimerCompensation ) + { + /* Compensate for the fact that the CMT is going to be stopped + momentarily. */ + ulMatchValue -= ulStoppedTimerCompensation; + } + + /* Stop the CMT momentarily. The time the CMT is stopped for is + accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + CMT.CMSTR0.BIT.STR0 = 0; + while( CMT.CMSTR0.BIT.STR0 == 1 ) + { + /* Nothing to do here. */ + } + + /* Critical section using the global interrupt bit as the i bit is + automatically reset by the WAIT instruction. */ + clrpsw_i(); + + /* The tick flag is set to false before sleeping. If it is true when + sleep mode is exited then sleep mode was probably exited because the + tick was suppressed for the entire xExpectedIdleTime period. */ + ulTickFlag = pdFALSE; + + /* If a context switch is pending then abandon the low power entry as + the context switch might have been pended by an external interrupt that + requires processing. */ + eSleepAction = eTaskConfirmSleepModeStatus(); + if( eSleepAction == eAbortSleep ) + { + /* Restart tick. */ + CMT.CMSTR0.BIT.STR0 = 1; + setpsw_i(); + } + else if( eSleepAction == eNoTasksWaitingTimeout ) + { + /* Protection off. */ + SYSTEM.PRCR.WORD = portUNLOCK_KEY; + + /* Ready for software standby with all clocks stopped. */ + SYSTEM.SBYCR.BIT.SSBY = 1; + + /* Protection on. */ + SYSTEM.PRCR.WORD = portLOCK_KEY; + + /* Sleep until something happens. Calling prvSleep() will + automatically reset the i bit in the PSW. */ + prvSleep( xExpectedIdleTime ); + + /* Restart the CMT. */ + CMT.CMSTR0.BIT.STR0 = 1; + } + else + { + /* Protection off. */ + SYSTEM.PRCR.WORD = portUNLOCK_KEY; + + /* Ready for deep sleep mode. */ + SYSTEM.MSTPCRC.BIT.DSLPE = 1; + SYSTEM.MSTPCRA.BIT.MSTPA28 = 1; + SYSTEM.SBYCR.BIT.SSBY = 0; + + /* Protection on. */ + SYSTEM.PRCR.WORD = portLOCK_KEY; + + /* Adjust the match value to take into account that the current + time slice is already partially complete. */ + ulMatchValue -= ( uint32_t ) CMT0.CMCNT; + CMT0.CMCOR = ( uint16_t ) ulMatchValue; + + /* Restart the CMT to count up to the new match value. */ + CMT0.CMCNT = 0; + CMT.CMSTR0.BIT.STR0 = 1; + + /* Sleep until something happens. Calling prvSleep() will + automatically reset the i bit in the PSW. */ + prvSleep( xExpectedIdleTime ); + + /* Stop CMT. Again, the time the SysTick is stopped for is + accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + CMT.CMSTR0.BIT.STR0 = 0; + while( CMT.CMSTR0.BIT.STR0 == 1 ) + { + /* Nothing to do here. */ + } + + ulCurrentCount = ( uint32_t ) CMT0.CMCNT; + + if( ulTickFlag != pdFALSE ) + { + /* The tick interrupt has already executed, although because + this function is called with the scheduler suspended the actual + tick processing will not occur until after this function has + exited. Reset the match value with whatever remains of this + tick period. */ + ulMatchValue = ulMatchValueForOneTick - ulCurrentCount; + CMT0.CMCOR = ( uint16_t ) ulMatchValue; + + /* The tick interrupt handler will already have pended the tick + processing in the kernel. As the pending tick will be + processed as soon as this function exits, the tick value + maintained by the tick is stepped forward by one less than the + time spent sleeping. The actual stepping of the tick appears + later in this function. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. + How many complete tick periods passed while the processor was + sleeping? */ + ulCompleteTickPeriods = ulCurrentCount / ulMatchValueForOneTick; + + /* The match value is set to whatever fraction of a single tick + period remains. */ + ulMatchValue = ulCurrentCount - ( ulCompleteTickPeriods * ulMatchValueForOneTick ); + CMT0.CMCOR = ( uint16_t ) ulMatchValue; + } + + /* Restart the CMT so it runs up to the match value. The match value + will get set to the value required to generate exactly one tick period + the next time the CMT interrupt executes. */ + CMT0.CMCNT = 0; + CMT.CMSTR0.BIT.STR0 = 1; + + /* Wind the tick forward by the number of tick periods that the CPU + remained in a low power state. */ + vTaskStepTick( ulCompleteTickPeriods ); + } + } + +#endif /* configUSE_TICKLESS_IDLE */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/4d/a00efa4491970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/4d/a00efa4491970017138fe0bf747e5677 new file mode 100644 index 0000000..f8840cd --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/4d/a00efa4491970017138fe0bf747e5677 @@ -0,0 +1,126 @@ +ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +heap_4.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -fno-common -mcpu=cortex-m3 -mthumb $(RELEASE_DEFINES) $(INCLUDES) +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -nostartfiles -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map +release: export LDARCHIVES := -L. -L$(STM32_STDPERIPH_ROOT) -lSTM_StdPeriph +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -rf $(OBJ_DIR) hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +else + +vpath %.c \ +src \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ +$(STM32_DEVICE_SUPPORT_DIR) +vpath %.s $(STARTER_SCRIPT_DIR) +vpath %.o $(OBJ_DIR) + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) #$(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +#$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) +# $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)/$@ + +$(OBJ_DIR): + mkdir -p $@ + +endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/4d/b017422591970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/4d/b017422591970017138fe0bf747e5677 new file mode 100644 index 0000000..0bd9215 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/4d/b017422591970017138fe0bf747e5677 @@ -0,0 +1,126 @@ +ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +heap_4.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -fno-common -mcpu=cortex-m3 -mthumb $(RELEASE_DEFINES) $(INCLUDES) +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -nostartfiles -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map +release: export LDARCHIVES := -L. -L$(STM32_STDPERIPH_ROOT) -lSTM_StdPeriph +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -rf $(OBJ_DIR) hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +else + +vpath %.c \ +src \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ + +vpath %.s $(STARTER_SCRIPT_DIR) +vpath %.o $(OBJ_DIR) + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) #$(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +#$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) +# $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)/$@ + +$(OBJ_DIR): + mkdir -p $@ + +endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/4d/c12c54089d9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/4d/c12c54089d9400171201ed9ff9474498 new file mode 100644 index 0000000..631d68e --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/4d/c12c54089d9400171201ed9ff9474498 @@ -0,0 +1,651 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the ARM CM4F port. + *----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#ifndef __TI_VFP_SUPPORT__ + #error This port can only be used when the project options are configured to enable hardware floating point support. +#endif + +#if configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 + #error configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html +#endif + +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#else + /* The way the SysTick is clocked is not modified in case it is not the same + as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 0 ) +#endif + +/* Constants required to manipulate the core. Registers first... */ +#define portNVIC_SYSTICK_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( * ( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( * ( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SYSPRI2_REG ( * ( ( volatile uint32_t * ) 0xe000ed20 ) ) +/* ...then bits in the registers. */ +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) + +#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( * ( ( volatile uint32_t * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */ +#define portVECTACTIVE_MASK ( 0xFFUL ) + +/* Constants required to manipulate the VFP. */ +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating point context control register. */ +#define portASPEN_AND_LSPEN_BITS ( 0x3UL << 30UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) +#define portINITIAL_EXEC_RETURN ( 0xfffffffd ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have +occurred while the SysTick counter is stopped during tickless idle +calculations. */ +#define portMISSED_COUNTS_FACTOR ( 45UL ) + +/* For strict compliance with the Cortex-M spec the task start address should +have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ +#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) + +/* Required to allow portasm.asm access the configMAX_SYSCALL_INTERRUPT_PRIORITY +setting. */ +const uint32_t ulMaxSyscallInterruptPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY; + +/* Each task maintains its own interrupt status in the critical nesting +variable. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortSysTickHandler( void ); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +extern void vPortStartFirstTask( void ); + +/* + * Turn the VFP on. + */ +extern void vPortEnableVFP( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* + * The number of SysTick increments that make up one tick period. + */ +#if configUSE_TICKLESS_IDLE == 1 + static uint32_t ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * The maximum number of tick periods that can be suppressed is limited by the + * 24 bit resolution of the SysTick timer. + */ +#if configUSE_TICKLESS_IDLE == 1 + static uint32_t xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Compensate for the CPU cycles that pass while the SysTick is stopped (low + * power functionality only. + */ +#if configUSE_TICKLESS_IDLE == 1 + static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static uint8_t ucMaxSysCallPriority = 0; + static uint32_t ulMaxPRIGROUPValue = 0; + static const volatile uint8_t * const pcInterruptPriorityRegisters = ( uint8_t * ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + interrupt. */ + + /* Offset added to account for the way the MCU uses the stack on entry/exit + of interrupts, and to ensure alignment. */ + pxTopOfStack--; + + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) prvTaskExitError; /* LR */ + + /* Save code space by skipping register initialisation. */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + + /* A save method is being used that requires each task to maintain its + own exec return value. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXEC_RETURN; + + pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + for( ;; ); +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + #if( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( uint8_t * ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + functions can be called. ISR safe functions are those that end in + "FromISR". FreeRTOS maintains separate thread and ISR API functions to + ensure interrupt entry is as fast and simple as possible. + + Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( uint8_t ) 0x01; + } + + /* Shift the priority group value back to its position within the AIRCR + register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* conifgASSERT_DEFINED */ + + /* Make PendSV and SysTick the lowest priority interrupts. */ + portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI; + portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Ensure the VFP is enabled - it should be anyway. */ + vPortEnableVFP(); + + /* Lazy save always. */ + *( portFPCCR ) |= portASPEN_AND_LSPEN_BITS; + + /* Start the first task. */ + vPortStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + assert() if it is being called from an interrupt context. Only API + functions that end in "FromISR" can be used in an interrupt. Only assert if + the critical nesting count is 1 to protect against recursive calls if the + assert function also uses a critical section. */ + if( uxCriticalNesting == 1 ) + { + configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + /* The SysTick runs at the lowest interrupt priority, so when this interrupt + executes all interrupts must be unmasked. There is therefore no need to + save and then restore the interrupt mask value as its value is already + known. */ + ( void ) portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* A context switch is required. Context switching is performed in + the PendSV interrupt. Pend the PendSV interrupt. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( 0 ); +} +/*-----------------------------------------------------------*/ + +#if configUSE_TICKLESS_IDLE == 1 + + #pragma WEAK( vPortSuppressTicksAndSleep ) + void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickCTRL; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Stop the SysTick momentarily. The time the SysTick is stopped for + is accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG &= ~portNVIC_SYSTICK_ENABLE_BIT; + + /* Calculate the reload value required to wait xExpectedIdleTime + tick periods. -1 is used because this code will execute part way + through one of the tick periods. */ + ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + method as that will mask interrupts that should exit sleep mode. */ + __asm( " cpsid i" ); + __asm( " dsb" ); + __asm( " isb" ); + + + /* If a context switch is pending or a task is waiting for the scheduler + to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Restart from whatever is left in the count register to complete + this tick period. */ + portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Reset the reload register to the value required for normal tick + periods. */ + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + + /* Re-enable interrupts - see comments above __disable_interrupt() + call above. */ + __asm( " cpsie i" ); + } + else + { + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + set its parameter to 0 to indicate that its implementation contains + its own wait for interrupt or wait for event instruction, and so wfi + should not be executed again. However, the original expected idle + time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + if( xModifiableIdleTime > 0 ) + { + __asm( " dsb" ); + __asm( " wfi" ); + __asm( " isb" ); + } + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Stop SysTick. Again, the time the SysTick is stopped for is + accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + ulSysTickCTRL = portNVIC_SYSTICK_CTRL_REG; + portNVIC_SYSTICK_CTRL_REG = ( ulSysTickCTRL & ~portNVIC_SYSTICK_ENABLE_BIT ); + + /* Re-enable interrupts - see comments above __disable_interrupt() + call above. */ + __asm( " cpsie i" ); + + if( ( ulSysTickCTRL & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt has already executed, and the SysTick + count reloaded with ulReloadValue. Reset the + portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick + period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + underflowed because the post sleep hook did something + that took too long. */ + if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* The tick interrupt handler will already have pended the tick + processing in the kernel. As the pending tick will be + processed as soon as this function exits, the tick value + maintained by the tick is stepped forward by one less than the + time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. + Work out how long the sleep lasted rounded to complete tick + periods (not the ulReload value which accounted for part + ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* How many complete tick periods passed while the processor + was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG + again, then set portNVIC_SYSTICK_LOAD_REG back to its standard + value. The critical section is used to ensure the tick interrupt + can only execute once in the case that the reload register is near + zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portENTER_CRITICAL(); + { + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + vTaskStepTick( ulCompleteTickPeriods ); + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + portEXIT_CRITICAL(); + } + } + +#endif /* #if configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +#pragma WEAK( vPortSetupTimerInterrupt ) +void vPortSetupTimerInterrupt( void ) +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if configUSE_TICKLESS_IDLE == 1 + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); +} +/*-----------------------------------------------------------*/ + +#if( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + extern uint32_t ulPortGetIPSR( void ); + uint32_t ulCurrentInterrupt; + uint8_t ucCurrentPriority; + + ulCurrentInterrupt = ulPortGetIPSR(); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + an interrupt that has been assigned a priority above + configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + function. ISR safe FreeRTOS API functions must *only* be called + from interrupts that have been assigned a priority at or below + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Numerically low interrupt priority numbers represent logically high + interrupt priorities, therefore the priority of the interrupt must + be set to a value equal to or numerically *higher* than + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Interrupts that use the FreeRTOS API must not be left at their + default priority of zero as that is the highest possible priority, + which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + and therefore also guaranteed to be invalid. + + FreeRTOS maintains separate thread and ISR API functions to ensure + interrupt entry is as fast and simple as possible. + + The following links provide detailed information: + http://www.freertos.org/RTOS-Cortex-M3-M4.html + http://www.freertos.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + that define each interrupt's priority to be split between bits that + define the interrupt's pre-emption priority bits and bits that define + the interrupt's sub-priority. For simplicity all bits must be defined + to be pre-emption priority bits. The following assertion will fail if + this is not the case (if some bits represent a sub-priority). + + If the application only uses CMSIS libraries for interrupt + configuration then the correct setting can be achieved on all Cortex-M + devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + scheduler. Note however that some vendor specific peripheral libraries + assume a non-zero priority group setting, in which cases using a value + of zero will result in unpredicable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ + + + + + + + + + + + + + + + + + + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/4e/001d6fb39e970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/4e/001d6fb39e970017138fe0bf747e5677 new file mode 100644 index 0000000..44ac131 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/4e/001d6fb39e970017138fe0bf747e5677 @@ -0,0 +1,85 @@ +// ----------------------------------------------------------------------------- +/// @file main.c +/// @brief Description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @file main.c +/// @ingroup {group_name} + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + +// FreeRTOS includes +#include "FreeRTOS.h" +#include "task.h" + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + +/* The time between cycles of the 'check' functionality (defined within the +tick hook. */ +#define mainCHECK_DELAY ( ( TickType_t ) 5000 / portTICK_PERIOD_MS ) + +// ----------------------------------------------------------------------------- +// Type definitions +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// File-scope variables +// ----------------------------------------------------------------------------- + +/* Variable that counts at 20KHz to provide the time base for the run time +stats. */ +unsigned long ulRunTimeStatsClock = 0UL; + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function definitions +// ----------------------------------------------------------------------------- + +void _init(void) {return;} +char * _sbrk( size_t x ) +{ + /* Just to remove compiler warning. */ + ( void ) x; + return NULL; +} + +int main (void) +{ + + + /* Start the scheduler. */ + vTaskStartScheduler(); + + /* Will only get here if there was insufficient memory to create the idle + task. The idle task is created within vTaskStartScheduler(). */ + for( ;; ); + + + return -1; +} + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/4f/50afefd9cf96001713a7ede92b37d6f1 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/4f/50afefd9cf96001713a7ede92b37d6f1 new file mode 100644 index 0000000..1175d22 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/4f/50afefd9cf96001713a7ede92b37d6f1 @@ -0,0 +1,69 @@ +# STM support library + +STM32_STDPERIPH_INC = Libraries/STM32F10x_StdPeriph_Driver/inc/ +CORE_DIR = Libraries/CMSIS/CM3/CoreSupport/ +DEVICE_SUPPORT_DIR = Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x + +SRC_DIR = Libraries/STM32F10x_StdPeriph_Driver/src/ + +INCLUDE_DIRS = \ +-I$(DEVICE_SUPPORT_DIR) \ +-I$(STM32_STDPERIPH_INC) \ +-I$(CIRE_DIR) \ + + +OBJ_DIR = Libraries/STM32F10x_StdPeriph_Driver/obj + +CROSS_COMPILE = arm-none-eabi- + +CC = $(CROSS_COMPILE)gcc +CCFLAGS = -c -O2 -g -fno-common -mcpu=cortex-m3 -mthumb -DUSE_FULL_ASSERT $(INCLUDE_DIRS) -I. -Wall -Werror -D"assert_param(expr)=((void)0)" + +AR = $(CROSS_COMPILE)ar +ARFLAGS = rs + +OBJECTS = \ +misc.o \ +stm32f10x_adc.o \ +stm32f10x_bkp.o \ +stm32f10x_can.o \ +stm32f10x_cec.o \ +stm32f10x_crc.o \ +stm32f10x_dac.o \ +stm32f10x_dbgmcu.o \ +stm32f10x_dma.o \ +stm32f10x_exti.o \ +stm32f10x_flash.o \ +stm32f10x_fsmc.o \ +stm32f10x_gpio.o \ +stm32f10x_i2c.o \ +stm32f10x_iwdg.o \ +stm32f10x_pwr.o \ +stm32f10x_rcc.o \ +stm32f10x_rtc.o \ +stm32f10x_sdio.o \ +stm32f10x_spi.o \ +stm32f10x_tim.o \ +stm32f10x_usart.o \ +stm32f10x_wwdg.o + +LIBRARY = libSTM_StdPeriph.a + +vpath %.c $(SRC_DIR) +vpath %.o $(OBJ_DIR) + +all: $(LIBRARY) + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +clean: + rm -rf $(LIBRARY) $(OBJ_DIR) + +$(OBJ_DIR): + mkdir -p $@ + +.PHONY: all clean diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/4f/b4585b089d9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/4f/b4585b089d9400171201ed9ff9474498 new file mode 100644 index 0000000..b424e46 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/4f/b4585b089d9400171201ed9ff9474498 @@ -0,0 +1,244 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint8_t +#define portBASE_TYPE char + +typedef portSTACK_TYPE StackType_t; +typedef signed char BaseType_t; +typedef unsigned char UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 1 +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portYIELD() __asm( "swi" ); +#define portNOP() __asm( "nop" ); +/*-----------------------------------------------------------*/ + +/* Critical section handling. */ +#define portENABLE_INTERRUPTS() __asm( "cli" ) +#define portDISABLE_INTERRUPTS() __asm( "sei" ) + +/* + * Disable interrupts before incrementing the count of critical section nesting. + * The nesting count is maintained so we know when interrupts should be + * re-enabled. Once interrupts are disabled the nesting count can be accessed + * directly. Each task maintains its own nesting count. + */ +#define portENTER_CRITICAL() \ +{ \ + extern volatile UBaseType_t uxCriticalNesting; \ + \ + portDISABLE_INTERRUPTS(); \ + uxCriticalNesting++; \ +} + +/* + * Interrupts are disabled so we can access the nesting count directly. If the + * nesting is found to be 0 (no nesting) then we are leaving the critical + * section and interrupts can be re-enabled. + */ +#define portEXIT_CRITICAL() \ +{ \ + extern volatile UBaseType_t uxCriticalNesting; \ + \ + uxCriticalNesting--; \ + if( uxCriticalNesting == 0 ) \ + { \ + portENABLE_INTERRUPTS(); \ + } \ +} +/*-----------------------------------------------------------*/ + +/* Task utilities. */ + +/* + * These macros are very simple as the processor automatically saves and + * restores its registers as interrupts are entered and exited. In + * addition to the (automatically stacked) registers we also stack the + * critical nesting count. Each task maintains its own critical nesting + * count as it is legitimate for a task to yield from within a critical + * section. If the banked memory model is being used then the PPAGE + * register is also stored as part of the tasks context. + */ + +#ifdef BANKED_MODEL + /* + * Load the stack pointer for the task, then pull the critical nesting + * count and PPAGE register from the stack. The remains of the + * context are restored by the RTI instruction. + */ + #define portRESTORE_CONTEXT() \ + { \ + extern volatile void * pxCurrentTCB; \ + extern volatile UBaseType_t uxCriticalNesting; \ + \ + __asm( "ldx pxCurrentTCB" ); \ + __asm( "lds 0, x" ); \ + __asm( "pula" ); \ + __asm( "staa uxCriticalNesting" ); \ + __asm( "pula" ); \ + __asm( "staa 0x30" ); /* 0x30 = PPAGE */ \ + } + + /* + * By the time this macro is called the processor has already stacked the + * registers. Simply stack the nesting count and PPAGE value, then save + * the task stack pointer. + */ + #define portSAVE_CONTEXT() \ + { \ + extern volatile void * pxCurrentTCB; \ + extern volatile UBaseType_t uxCriticalNesting; \ + \ + __asm( "ldaa 0x30" ); /* 0x30 = PPAGE */ \ + __asm( "psha" ); \ + __asm( "ldaa uxCriticalNesting" ); \ + __asm( "psha" ); \ + __asm( "ldx pxCurrentTCB" ); \ + __asm( "sts 0, x" ); \ + } +#else + + /* + * These macros are as per the BANKED versions above, but without saving + * and restoring the PPAGE register. + */ + + #define portRESTORE_CONTEXT() \ + { \ + extern volatile void * pxCurrentTCB; \ + extern volatile UBaseType_t uxCriticalNesting; \ + \ + __asm( "ldx pxCurrentTCB" ); \ + __asm( "lds 0, x" ); \ + __asm( "pula" ); \ + __asm( "staa uxCriticalNesting" ); \ + } + + #define portSAVE_CONTEXT() \ + { \ + extern volatile void * pxCurrentTCB; \ + extern volatile UBaseType_t uxCriticalNesting; \ + \ + __asm( "ldaa uxCriticalNesting" ); \ + __asm( "psha" ); \ + __asm( "ldx pxCurrentTCB" ); \ + __asm( "sts 0, x" ); \ + } +#endif + +/* + * Utility macro to call macros above in correct order in order to perform a + * task switch from within a standard ISR. This macro can only be used if + * the ISR does not use any local (stack) variables. If the ISR uses stack + * variables portYIELD() should be used in it's place. + */ +#define portTASK_SWITCH_FROM_ISR() \ + portSAVE_CONTEXT(); \ + vTaskSwitchContext(); \ + portRESTORE_CONTEXT(); + + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/54/a0f7fb9195970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/54/a0f7fb9195970017138fe0bf747e5677 new file mode 100644 index 0000000..ead8d4b --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/54/a0f7fb9195970017138fe0bf747e5677 @@ -0,0 +1,132 @@ +ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +heap_4.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +STM32_CORE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) \ +-I$(STM32_CORE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -fno-common -mcpu=cortex-m3 -mthumb $(RELEASE_DEFINES) $(INCLUDES) +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -nostartfiles -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map +release: export LDARCHIVES := -L. -L$(STM32_STDPERIPH_ROOT) -lSTM_StdPeriph +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -f hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + rm -rf obj_release + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +else + +vpath %.c \ +src \ +startup \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport + +vpath %.s $(STARTER_SCRIPT_DIR) +vpath %.o $(OBJ_DIR) + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) $(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)/$@ + +$(OBJ_DIR): + mkdir -p $@ + +endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/57/a38462089d9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/57/a38462089d9400171201ed9ff9474498 new file mode 100644 index 0000000..40abfc8 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/57/a38462089d9400171201ed9ff9474498 @@ -0,0 +1,68 @@ +;/* +; FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. +; All rights reserved +; +; +; *************************************************************************** +; * * +; * FreeRTOS tutorial books are available in pdf and paperback. * +; * Complete, revised, and edited pdf reference manuals are also * +; * available. * +; * * +; * Purchasing FreeRTOS documentation will not only help you, by * +; * ensuring you get running as quickly as possible and with an * +; * in-depth knowledge of how to use FreeRTOS, it will also help * +; * the FreeRTOS project to continue with its mission of providing * +; * professional grade, cross platform, de facto standard solutions * +; * for microcontrollers - completely free of charge! * +; * * +; * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * +; * * +; * Thank you for using FreeRTOS, and thank you for your support! * +; * * +; *************************************************************************** +; +; +; This file is part of the FreeRTOS distribution. +; +; FreeRTOS is free software; you can redistribute it and/or modify it under +; the terms of the GNU General Public License (version 2) as published by the +; Free Software Foundation AND MODIFIED BY the FreeRTOS exception. +; >>>NOTE<<< The modification to the GPL is included to allow you to +; distribute a combined work that includes FreeRTOS without being obliged to +; provide the source code for proprietary components outside of the FreeRTOS +; kernel. FreeRTOS is distributed in the hope that it will be useful, but +; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +; more details. You should have received a copy of the GNU General Public +; License and the FreeRTOS license exception along with FreeRTOS; if not it +; can be viewed here: http://www.freertos.org/a00114.html and also obtained +; by writing to Richard Barry, contact details for whom are available on the +; FreeRTOS WEB site. +; +; 1 tab == 4 spaces! +; +; http://www.FreeRTOS.org - Documentation, latest information, license and +; contact details. +; +; http://www.SafeRTOS.com - A version that is certified for use in safety +; critical systems. +; +; http://www.OpenRTOS.com - Commercial support, development, porting, +; licensing and training services. +;*/ + .GLB _vSoftwareInterruptISR + .GLB _vSoftwareInterruptEntry + + .SECTION P,CODE + +_vSoftwareInterruptEntry: + + BRA _vSoftwareInterruptISR + + .RVECTOR 27, _vSoftwareInterruptEntry + + .END + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/58/9018f8dbc696001713a7ede92b37d6f1 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/58/9018f8dbc696001713a7ede92b37d6f1 new file mode 100644 index 0000000..d9283bf --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/58/9018f8dbc696001713a7ede92b37d6f1 @@ -0,0 +1,61 @@ +# STM support library + +SRC_DIR = Libraries/STM32F10x_StdPeriph_Driver/src/ +INC_DIR = Libraries/STM32F10x_StdPeriph_Driver/inc/ +DEV_DIR = Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/ +COR_DIR = Libraries/CMSIS/CM3/CoreSupport/ +OBJ_DIR = Libraries/STM32F10x_StdPeriph_Driver/obj + +CROSS_COMPILE = arm-none-eabi- + +CC = $(CROSS_COMPILE)gcc +CCFLAGS = -c -O2 -g -fno-common -mcpu=cortex-m3 -mthumb -DUSE_FULL_ASSERT -I$(INC_DIR) -I$(DEV_DIR) -I$(COR_DIR) -I. -Wall -Werror + +AR = $(CROSS_COMPILE)ar +ARFLAGS = rs + +OBJECTS = \ +misc.o \ +stm32f10x_adc.o \ +stm32f10x_bkp.o \ +stm32f10x_can.o \ +stm32f10x_cec.o \ +stm32f10x_crc.o \ +stm32f10x_dac.o \ +stm32f10x_dbgmcu.o \ +stm32f10x_dma.o \ +stm32f10x_exti.o \ +stm32f10x_flash.o \ +stm32f10x_fsmc.o \ +stm32f10x_gpio.o \ +stm32f10x_i2c.o \ +stm32f10x_iwdg.o \ +stm32f10x_pwr.o \ +stm32f10x_rcc.o \ +stm32f10x_rtc.o \ +stm32f10x_sdio.o \ +stm32f10x_spi.o \ +stm32f10x_tim.o \ +stm32f10x_usart.o \ +stm32f10x_wwdg.o + +LIBRARY = libSTM_StdPeriph.a + +vpath %.c $(SRC_DIR) +vpath %.o $(OBJ_DIR) + +all: $(LIBRARY) + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +clean: + rm -rf $(LIBRARY) $(OBJ_DIR) + +$(OBJ_DIR): + mkdir -p $@ + +.PHONY: all clean diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/58/b43a60089d9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/58/b43a60089d9400171201ed9ff9474498 new file mode 100644 index 0000000..fed2a71 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/58/b43a60089d9400171201ed9ff9474498 @@ -0,0 +1,183 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Hardware specifics. */ +#include "machine.h" + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions - these are a bit legacy and not really used now, other than +portSTACK_TYPE and portBASE_TYPE. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 8 /* Could make four, according to manual. */ +#define portSTACK_GROWTH -1 +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portNOP() nop() + +#pragma inline_asm vPortYield +static void vPortYield( void ) +{ + /* Save clobbered register - may not actually be necessary if inline asm + functions are considered to use the same rules as function calls by the + compiler. */ + PUSH.L R5 + /* Set ITU SWINTR. */ + MOV.L #553696, R5 + MOV.B #1, [R5] + /* Read back to ensure the value is taken before proceeding. */ + MOV.L [R5], R5 + /* Restore clobbered register to its previous value. */ + POP R5 +} +#define portYIELD() vPortYield() +#define portYIELD_FROM_ISR( x ) if( x != pdFALSE ) portYIELD() + +/* These macros should not be called directly, but through the +taskENTER_CRITICAL() and taskEXIT_CRITICAL() macros. An extra check is +performed if configASSERT() is defined to ensure an assertion handler does not +inadvertently attempt to lower the IPL when the call to assert was triggered +because the IPL value was found to be above configMAX_SYSCALL_INTERRUPT_PRIORITY +when an ISR safe FreeRTOS API function was executed. ISR safe FreeRTOS API +functions are those that end in FromISR. FreeRTOS maintains a separate +interrupt API to ensure API function and interrupt entry is as fast and as +simple as possible. */ +#define portENABLE_INTERRUPTS() set_ipl( ( long ) 0 ) +#ifdef configASSERT + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() configASSERT( ( get_ipl() <= configMAX_SYSCALL_INTERRUPT_PRIORITY ) ) + #define portDISABLE_INTERRUPTS() if( get_ipl() < configMAX_SYSCALL_INTERRUPT_PRIORITY ) set_ipl( ( long ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#else + #define portDISABLE_INTERRUPTS() set_ipl( ( long ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#endif + +/* Critical nesting counts are stored in the TCB. */ +#define portCRITICAL_NESTING_IN_TCB ( 1 ) + +/* The critical nesting functions defined within tasks.c. */ +extern void vTaskEnterCritical( void ); +extern void vTaskExitCritical( void ); +#define portENTER_CRITICAL() vTaskEnterCritical() +#define portEXIT_CRITICAL() vTaskExitCritical() + +/* As this port allows interrupt nesting... */ +#define portSET_INTERRUPT_MASK_FROM_ISR() get_ipl(); set_ipl( ( long ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ) set_ipl( ( long ) uxSavedInterruptStatus ) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/5a/c39d56089d9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/5a/c39d56089d9400171201ed9ff9474498 new file mode 100644 index 0000000..b6081e9 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/5a/c39d56089d9400171201ed9ff9474498 @@ -0,0 +1,80 @@ +;/* +; FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. +; All rights reserved +; +; +; *************************************************************************** +; * * +; * FreeRTOS tutorial books are available in pdf and paperback. * +; * Complete, revised, and edited pdf reference manuals are also * +; * available. * +; * * +; * Purchasing FreeRTOS documentation will not only help you, by * +; * ensuring you get running as quickly as possible and with an * +; * in-depth knowledge of how to use FreeRTOS, it will also help * +; * the FreeRTOS project to continue with its mission of providing * +; * professional grade, cross platform, de facto standard solutions * +; * for microcontrollers - completely free of charge! * +; * * +; * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * +; * * +; * Thank you for using FreeRTOS, and thank you for your support! * +; * * +; *************************************************************************** +; +; +; This file is part of the FreeRTOS distribution. +; +; FreeRTOS is free software; you can redistribute it and/or modify it under +; the terms of the GNU General Public License (version 2) as published by the +; Free Software Foundation AND MODIFIED BY the FreeRTOS exception. +; >>>NOTE<<< The modification to the GPL is included to allow you to +; distribute a combined work that includes FreeRTOS without being obliged to +; provide the source code for proprietary components outside of the FreeRTOS +; kernel. FreeRTOS is distributed in the hope that it will be useful, but +; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +; more details. You should have received a copy of the GNU General Public +; License and the FreeRTOS license exception along with FreeRTOS; if not it +; can be viewed here: http://www.freertos.org/a00114.html and also obtained +; by writing to Richard Barry, contact details for whom are available on the +; FreeRTOS WEB site. +; +; 1 tab == 4 spaces! +; +; http://www.FreeRTOS.org - Documentation, latest information, license and +; contact details. +; +; http://www.SafeRTOS.com - A version that is certified for use in safety +; critical systems. +; +; http://www.OpenRTOS.com - Commercial support, development, porting, +; licensing and training services. +;*/ + + .if $DEFINED( __LARGE_DATA_MODEL__ ) + .define "pushm.a", pushm_x + .define "popm.a", popm_x + .define "push.a", push_x + .define "pop.a", pop_x + .define "mov.a", mov_x + .else + .define "pushm.w", pushm_x + .define "popm.w", popm_x + .define "push.w", push_x + .define "pop.w", pop_x + .define "mov.w", mov_x + .endif + + .if $DEFINED( __LARGE_CODE_MODEL__ ) + .define "calla", call_x + .define "reta", ret_x + .else + .define "call", call_x + .define "ret", ret_x + .endif + + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/5b/207d611bcf96001713a7ede92b37d6f1 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/5b/207d611bcf96001713a7ede92b37d6f1 new file mode 100644 index 0000000..7852bcd --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/5b/207d611bcf96001713a7ede92b37d6f1 @@ -0,0 +1,61 @@ +# STM support library + +SRC_DIR = Libraries/STM32F10x_StdPeriph_Driver/src/ +INC_DIR = Libraries/STM32F10x_StdPeriph_Driver/inc/ +DEV_DIR = Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/ +COR_DIR = Libraries/CMSIS/CM3/CoreSupport/ +OBJ_DIR = Libraries/STM32F10x_StdPeriph_Driver/obj + +CROSS_COMPILE = arm-none-eabi- + +CC = $(CROSS_COMPILE)gcc +CCFLAGS = -c -O2 -g -fno-common -mcpu=cortex-m3 -mthumb -DUSE_FULL_ASSERT -I$(INC_DIR) -I$(DEV_DIR) -I$(COR_DIR) -I. -Wall -Werror -D"assert_param(expr)=((void)0)" + +AR = $(CROSS_COMPILE)ar +ARFLAGS = rs + +OBJECTS = \ +misc.o \ +stm32f10x_adc.o \ +stm32f10x_bkp.o \ +stm32f10x_can.o \ +stm32f10x_cec.o \ +stm32f10x_crc.o \ +stm32f10x_dac.o \ +stm32f10x_dbgmcu.o \ +stm32f10x_dma.o \ +stm32f10x_exti.o \ +stm32f10x_flash.o \ +stm32f10x_fsmc.o \ +stm32f10x_gpio.o \ +stm32f10x_i2c.o \ +stm32f10x_iwdg.o \ +stm32f10x_pwr.o \ +stm32f10x_rcc.o \ +stm32f10x_rtc.o \ +stm32f10x_sdio.o \ +stm32f10x_spi.o \ +stm32f10x_tim.o \ +stm32f10x_usart.o \ +stm32f10x_wwdg.o + +LIBRARY = libSTM_StdPeriph.a + +vpath %.c $(SRC_DIR) +vpath %.o $(OBJ_DIR) + +all: $(LIBRARY) + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +clean: + rm -rf $(LIBRARY) $(OBJ_DIR) + +$(OBJ_DIR): + mkdir -p $@ + +.PHONY: all clean diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/5d/505d46499c970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/5d/505d46499c970017138fe0bf747e5677 new file mode 100644 index 0000000..f65034d --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/5d/505d46499c970017138fe0bf747e5677 @@ -0,0 +1,203 @@ +/* +****************************************************************************** +** +** File : LinkerScript.ld +** +** Author : Auto-generated by Ac6 System Workbench +** +** Abstract : Linker script for STM32F107VCTx Device from STM32F1 series +** 64Kbytes RAM +** 256Kbytes ROM +** +** Set heap size, stack size and stack location according +** to application requirements. +** +** Set memory bank area and size if external memory is used. +** +** Target : STMicroelectronics STM32 +** +** Distribution: The file is distributed “as is,” without any warranty +** of any kind. +** +***************************************************************************** +** @attention +** +**

© COPYRIGHT(c) 2017 Ac6

+** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** 1. Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** 3. Neither the name of Ac6 nor the names of its contributors +** may be used to endorse or promote products derived from this software +** without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +***************************************************************************** +*/ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = 0x20010000; /* end of RAM */ + +_Min_Heap_Size = 0; /* required amount of heap */ +_Min_Stack_Size = 0x400; /* required amount of stack */ + +/* Memories definition */ +MEMORY +{ + RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K + ROM (rx) : ORIGIN = 0x8000000, LENGTH = 256K +} + +/* Sections */ +SECTIONS +{ + /* The startup code into ROM memory */ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } >ROM + + /* The program code and other data into ROM memory */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + } >ROM + + /* Constant data into ROM memory*/ + .rodata : + { + . = ALIGN(4); + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + . = ALIGN(4); + } >ROM + + .ARM.extab : { + . = ALIGN(4); + *(.ARM.extab* .gnu.linkonce.armextab.*) + . = ALIGN(4); + } >ROM + + .ARM : { + . = ALIGN(4); + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + . = ALIGN(4); + } >ROM + + .preinit_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + . = ALIGN(4); + } >ROM + + .init_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + . = ALIGN(4); + } >ROM + + .fini_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + . = ALIGN(4); + } >ROM + + /* Used by the startup to initialize data */ + _sidata = LOADADDR(.data); + + /* Initialized data sections into RAM memory */ + .data : + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + } >RAM AT> ROM + + + /* Uninitialized data section into RAM memory */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM + + /* User_heap_stack section, used to check that there is enough RAM left */ + ._user_heap_stack : + { + . = ALIGN(8); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(8); + } >RAM + + + + /* Remove information from the compiler libraries */ +/* /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } +*/ + .ARM.attributes 0 : { *(.ARM.attributes) } + +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/5d/c0c2d04595970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/5d/c0c2d04595970017138fe0bf747e5677 new file mode 100644 index 0000000..c261c50 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/5d/c0c2d04595970017138fe0bf747e5677 @@ -0,0 +1,129 @@ +ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +heap_4.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -fno-common -mcpu=cortex-m3 -mthumb $(RELEASE_DEFINES) $(INCLUDES) +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -nostartfiles -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map +release: export LDARCHIVES := -L. -L$(STM32_STDPERIPH_ROOT) -lSTM_StdPeriph +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -f hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + rm -rf obj_release + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +else + +vpath %.c \ +src \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport + +vpath %.s $(STARTER_SCRIPT_DIR) +vpath %.o $(OBJ_DIR) + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) $(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)/$@ + +$(OBJ_DIR): + mkdir -p $@ + +endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/5e/4091b8c598970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/5e/4091b8c598970017138fe0bf747e5677 new file mode 100644 index 0000000..3a8474b --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/5e/4091b8c598970017138fe0bf747e5677 @@ -0,0 +1,78 @@ +// ----------------------------------------------------------------------------- +/// @file main.c +/// @brief Description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @file main.c +/// @ingroup {group_name} + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + +// FreeRTOS includes +#include "FreeRTOS.h" +#include "task.h" + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + +/* The time between cycles of the 'check' functionality (defined within the +tick hook. */ +#define mainCHECK_DELAY ( ( TickType_t ) 5000 / portTICK_PERIOD_MS ) + +// ----------------------------------------------------------------------------- +// Type definitions +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// File-scope variables +// ----------------------------------------------------------------------------- + +/* Variable that counts at 20KHz to provide the time base for the run time +stats. */ +unsigned long ulRunTimeStatsClock = 0UL; + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function definitions +// ----------------------------------------------------------------------------- + + +int main (void) +{ + + + /* Start the scheduler. */ + //vTaskStartScheduler(); + + /* Will only get here if there was insufficient memory to create the idle + task. The idle task is created within vTaskStartScheduler(). */ + for( ;; ); + + + return -1; +} + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/5f/10c19b949b970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/5f/10c19b949b970017138fe0bf747e5677 new file mode 100644 index 0000000..954271c --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/5f/10c19b949b970017138fe0bf747e5677 @@ -0,0 +1,134 @@ +ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +heap_4.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +STM32_CORE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) \ +-I$(STM32_CORE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -fno-common -mcpu=cortex-m3 -mthumb --specs=nosys.specs $(RELEASE_DEFINES) $(INCLUDES) +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -nostartfiles -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map +release: export LDARCHIVES := -L. -L$(STM32_STDPERIPH_ROOT) -lSTM_StdPeriph -lhsb_mrts_release +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -f hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + rm -rf obj_release + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +else + +vpath %.c \ +src \ +startup \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport + +vpath %.s \ +startup +vpath %.o \ +obj_release + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) $(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)/$@ + +$(OBJ_DIR): + mkdir -p $@ + +endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/5f/3075539e9f9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/5f/3075539e9f9400171201ed9ff9474498 new file mode 100644 index 0000000..e69de29 diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/6/a0e577f293970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/6/a0e577f293970017138fe0bf747e5677 new file mode 100644 index 0000000..05c0853 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/6/a0e577f293970017138fe0bf747e5677 @@ -0,0 +1,130 @@ +ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +heap_4.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -fno-common -mcpu=cortex-m3 -mthumb $(RELEASE_DEFINES) $(INCLUDES) +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -nostartfiles -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map +release: export LDARCHIVES := -L. -L$(STM32_STDPERIPH_ROOT) -lSTM_StdPeriph +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -f hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + rm -rf obj_release + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +else + +vpath %.c \ +src \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ +$(STM32_DEVICE_SUPPORT_DIR) +vpath %.h \ +inc \ +../FreeRTOS/Source/include +vpath %.s $(STARTER_SCRIPT_DIR) +vpath %.o $(OBJ_DIR) + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) #$(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +#$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) +# $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)/$@ + +$(OBJ_DIR): + mkdir -p $@ + +endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/61/300ba9adc596001713a7ede92b37d6f1 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/61/300ba9adc596001713a7ede92b37d6f1 new file mode 100644 index 0000000..f6eb85d --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/61/300ba9adc596001713a7ede92b37d6f1 @@ -0,0 +1,61 @@ +# STM support library + +SRC_DIR = Libraries/STM32F10x_StdPeriph_Driver/src/ +INC_DIR = \ +Libraries/STM32F10x_StdPeriph_Driver/inc/ \ +Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/ +OBJ_DIR = Libraries/STM32F10x_StdPeriph_Driver/obj + +CROSS_COMPILE = arm-none-eabi- + +CC = $(CROSS_COMPILE)gcc +CCFLAGS = -c -O2 -g -fno-common -mcpu=cortex-m3 -mthumb -DUSE_FULL_ASSERT -I$(INC_DIR) -I. + +AR = $(CROSS_COMPILE)ar +ARFLAGS = rs + +OBJECTS = \ +misc.o \ +stm32f10x_adc.o \ +stm32f10x_bkp.o \ +stm32f10x_can.o \ +stm32f10x_cec.o \ +stm32f10x_crc.o \ +stm32f10x_dac.o \ +stm32f10x_dbgmcu.o \ +stm32f10x_dma.o \ +stm32f10x_exti.o \ +stm32f10x_flash.o \ +stm32f10x_fsmc.o \ +stm32f10x_gpio.o \ +stm32f10x_i2c.o \ +stm32f10x_iwdg.o \ +stm32f10x_pwr.o \ +stm32f10x_rcc.o \ +stm32f10x_rtc.o \ +stm32f10x_sdio.o \ +stm32f10x_spi.o \ +stm32f10x_tim.o \ +stm32f10x_usart.o \ +stm32f10x_wwdg.o + +LIBRARY = libSTM_StdPeriph.a + +vpath %.c $(SRC_DIR) +vpath %.o $(OBJ_DIR) + +all: $(LIBRARY) + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +clean: + rm -rf $(LIBRARY) $(OBJ_DIR) + +$(OBJ_DIR): + mkdir -p $@ + +.PHONY: all clean diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/62/70d56222a59700171090ed03afc2ec65 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/62/70d56222a59700171090ed03afc2ec65 new file mode 100644 index 0000000..e69de29 diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/62/f01a400499970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/62/f01a400499970017138fe0bf747e5677 new file mode 100644 index 0000000..3c87d2d --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/62/f01a400499970017138fe0bf747e5677 @@ -0,0 +1,134 @@ +ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +heap_4.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +STM32_CORE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) \ +-I$(STM32_CORE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -fno-common -mcpu=cortex-m3 -mthumb $(RELEASE_DEFINES) $(INCLUDES) -lc +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -nostartfiles -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map +release: export LDARCHIVES := -L. -L$(STM32_STDPERIPH_ROOT) -lSTM_StdPeriph -lhsb_mrts_release +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -f hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + rm -rf obj_release + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +else + +vpath %.c \ +src \ +startup \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport + +vpath %.s \ +startup +vpath %.o \ +obj_release + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) $(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)/$@ + +$(OBJ_DIR): + mkdir -p $@ + +endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/63/20668c6192970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/63/20668c6192970017138fe0bf747e5677 new file mode 100644 index 0000000..005115a --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/63/20668c6192970017138fe0bf747e5677 @@ -0,0 +1,128 @@ +ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +heap_4.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -fno-common -mcpu=cortex-m3 -mthumb $(RELEASE_DEFINES) $(INCLUDES) +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -nostartfiles -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map +release: export LDARCHIVES := -L. -L$(STM32_STDPERIPH_ROOT) -lSTM_StdPeriph +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -f hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + rm -rf obj_release + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +else + +vpath %.c \ +src \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ +$(STM32_DEVICE_SUPPORT_DIR) + +vpath %.s $(STARTER_SCRIPT_DIR) +vpath %.o $(OBJ_DIR) + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) #$(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +#$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) +# $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)/$@ + +$(OBJ_DIR): + mkdir -p $@ + +endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/63/503131f090970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/63/503131f090970017138fe0bf747e5677 new file mode 100644 index 0000000..dc718cc --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/63/503131f090970017138fe0bf747e5677 @@ -0,0 +1,126 @@ +ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +heap_4.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -fno-common -mcpu=cortex-m3 -mthumb $(RELEASE_DEFINES) $(INCLUDES) +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -nostartfiles -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map +release: export LDARCHIVES := -L. -L$(STM32_STDPERIPH_ROOT) -lSTM_StdPeriph +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -rf $(OBJ_DIR) hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +else + +VPATH %.c \ +src \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ +$(STM32_DEVICE_SUPPORT_DIR) +vpath %.s $(STARTER_SCRIPT_DIR) +vpath %.o $(OBJ_DIR) + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) #$(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +#$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) +# $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)/$@ + +$(OBJ_DIR): + mkdir -p $@ + +endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/63/d04edb749f9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/63/d04edb749f9400171201ed9ff9474498 new file mode 100644 index 0000000..e69de29 diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/64/d0551c91c096001713a7ede92b37d6f1 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/64/d0551c91c096001713a7ede92b37d6f1 new file mode 100644 index 0000000..bdf491b --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/64/d0551c91c096001713a7ede92b37d6f1 @@ -0,0 +1,59 @@ +# STM support library + +SRC_DIR = Libraries/STM32F10x_StdPeriph_Driver/src +INC_DIR = Libraries/STM32F10x_StdPeriph_Driver/inc +OBJ_DIR = Libraries/STM32F10x_StdPeriph_Driver/obj + +CROSS_COMPILE = arm-none-eabi- + +CC = $(CROSS_COMPILE)gcc +CCFLAGS = -xc -c -O2 -g -fno-common -mcpu=cortex-m3 -mthumb -DUSE_FULL_ASSERT -I$(INC_DIR) -I. + +AR = $(CROSS_COMPILE)ar +ARFLAGS = rs + +OBJECTS = \ +misc.o \ +stm32f10x_adc.o \ +stm32f10x_bkp.o \ +stm32f10x_can.o \ +stm32f10x_cec.o \ +stm32f10x_crc.o \ +stm32f10x_dac.o \ +stm32f10x_dbgmcu.o \ +stm32f10x_dma.o \ +stm32f10x_exti.o \ +stm32f10x_flash.o \ +stm32f10x_fsmc.o \ +stm32f10x_gpio.o \ +stm32f10x_i2c.o \ +stm32f10x_iwdg.o \ +stm32f10x_pwr.o \ +stm32f10x_rcc.o \ +stm32f10x_rtc.o \ +stm32f10x_sdio.o \ +stm32f10x_spi.o \ +stm32f10x_tim.o \ +stm32f10x_usart.o \ +stm32f10x_wwdg.o + +LIBRARY = libSTM_StdPeriph.a + +vpath %.c $(SRC_DIR) +vpath %.o $(OBJ_DIR) + +all: $(LIBRARY) + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +clean: + rm -rf $(LIBRARY) $(OBJ_DIR) + +$(OBJ_DIR): + mkdir -p $@ + +.PHONY: all clean diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/65/40eb5c6ec096001713a7ede92b37d6f1 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/65/40eb5c6ec096001713a7ede92b37d6f1 new file mode 100644 index 0000000..6848596 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/65/40eb5c6ec096001713a7ede92b37d6f1 @@ -0,0 +1,59 @@ +# STM support library + +SRC_DIR = STM32F10x_StdPeriph_Driver/src/ +INC_DIR = STM32F10x_StdPeriph_Driver/inc/ +OBJ_DIR = STM32F10x_StdPeriph_Driver/obj + +CROSS_COMPILE = arm-none-eabi- + +CC = $(CROSS_COMPILE)gcc +CCFLAGS = -xc -c -O2 -g -fno-common -mcpu=cortex-m3 -mthumb -DUSE_FULL_ASSERT -I$(INC_DIR) -I. + +AR = $(CROSS_COMPILE)ar +ARFLAGS = rs + +OBJECTS = \ +misc.o \ +stm32f10x_adc.o \ +stm32f10x_bkp.o \ +stm32f10x_can.o \ +stm32f10x_cec.o \ +stm32f10x_crc.o \ +stm32f10x_dac.o \ +stm32f10x_dbgmcu.o \ +stm32f10x_dma.o \ +stm32f10x_exti.o \ +stm32f10x_flash.o \ +stm32f10x_fsmc.o \ +stm32f10x_gpio.o \ +stm32f10x_i2c.o \ +stm32f10x_iwdg.o \ +stm32f10x_pwr.o \ +stm32f10x_rcc.o \ +stm32f10x_rtc.o \ +stm32f10x_sdio.o \ +stm32f10x_spi.o \ +stm32f10x_tim.o \ +stm32f10x_usart.o \ +stm32f10x_wwdg.o + +LIBRARY = libSTM_StdPeriph.a + +vpath %.c $(SRC_DIR) +vpath %.o $(OBJ_DIR) + +all: $(LIBRARY) + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +clean: + rm -rf $(LIBRARY) $(OBJ_DIR) + +$(OBJ_DIR): + mkdir -p $@ + +.PHONY: all clean diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/65/c22c54089d9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/65/c22c54089d9400171201ed9ff9474498 new file mode 100644 index 0000000..a392583 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/65/c22c54089d9400171201ed9ff9474498 @@ -0,0 +1,207 @@ +;/* +; FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. +; All rights reserved +; +; VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. +; +; This file is part of the FreeRTOS distribution. +; +; FreeRTOS is free software; you can redistribute it and/or modify it under +; the terms of the GNU General Public License (version 2) as published by the +; Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. +; +; *************************************************************************** +; >>! NOTE: The modification to the GPL is included to allow you to !<< +; >>! distribute a combined work that includes FreeRTOS without being !<< +; >>! obliged to provide the source code for proprietary components !<< +; >>! outside of the FreeRTOS kernel. !<< +; *************************************************************************** +; +; FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY +; WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +; FOR A PARTICULAR PURPOSE. Full license text is available on the following +; link: http://www.freertos.org/a00114.html +; +; *************************************************************************** +; * * +; * FreeRTOS provides completely free yet professionally developed, * +; * robust, strictly quality controlled, supported, and cross * +; * platform software that is more than just the market leader, it * +; * is the industry's de facto standard. * +; * * +; * Help yourself get started quickly while simultaneously helping * +; * to support the FreeRTOS project by purchasing a FreeRTOS * +; * tutorial book, reference manual, or both: * +; * http://www.FreeRTOS.org/Documentation * +; * * +; *************************************************************************** +; +; http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading +; the FAQ page "My application does not run, what could be wrong?". Have you +; defined configASSERT()? +; +; http://www.FreeRTOS.org/support - In return for receiving this top quality +; embedded software for free we request you assist our global community by +; participating in the support forum. +; +; http://www.FreeRTOS.org/training - Investing in training allows your team to +; be as productive as possible as early as possible. Now you can receive +; FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers +; Ltd, and the world's leading authority on the world's leading RTOS. +; +; http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, +; including FreeRTOS+Trace - an indispensable productivity tool, a DOS +; compatible FAT file system, and our tiny thread aware UDP/IP stack. +; +; http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. +; Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. +; +; http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High +; Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS +; licenses offer ticketed support, indemnification and commercial middleware. +; +; http://www.SafeRTOS.com - High Integrity Systems also provide a safety +; engineered and independently SIL3 certified version for use in safety and +; mission critical applications that require provable dependability. +; +; 1 tab == 4 spaces! +;*/ + + .thumb + + .ref pxCurrentTCB + .ref vTaskSwitchContext + .ref ulMaxSyscallInterruptPriority + + .def xPortPendSVHandler + .def ulPortGetIPSR + .def vPortSVCHandler + .def vPortStartFirstTask + .def vPortEnableVFP + +NVICOffsetConst: .word 0xE000ED08 +CPACRConst: .word 0xE000ED88 +pxCurrentTCBConst: .word pxCurrentTCB +ulMaxSyscallInterruptPriorityConst: .word ulMaxSyscallInterruptPriority + +; ----------------------------------------------------------- + + .align 4 +ulPortGetIPSR: .asmfunc + mrs r0, ipsr + bx r14 + .endasmfunc + ; ----------------------------------------------------------- + + .align 4 +vPortSetInterruptMask: .asmfunc + push {r0} + ldr r0, ulMaxSyscallInterruptPriorityConst + msr basepri, r0 + pop {r0} + bx r14 + .endasmfunc +; ----------------------------------------------------------- + + .align 4 +xPortPendSVHandler: .asmfunc + mrs r0, psp + isb + + ;/* Get the location of the current TCB. */ + ldr r3, pxCurrentTCBConst + ldr r2, [r3] + + ;/* Is the task using the FPU context? If so, push high vfp registers. */ + tst r14, #0x10 + it eq + vstmdbeq r0!, {s16-s31} + + ;/* Save the core registers. */ + stmdb r0!, {r4-r11, r14} + + ;/* Save the new top of stack into the first member of the TCB. */ + str r0, [r2] + + stmdb sp!, {r3} + ldr r0, ulMaxSyscallInterruptPriorityConst + ldr r1, [r0] + msr basepri, r1 + dsb + isb + bl vTaskSwitchContext + mov r0, #0 + msr basepri, r0 + ldmia sp!, {r3} + + ;/* The first item in pxCurrentTCB is the task top of stack. */ + ldr r1, [r3] + ldr r0, [r1] + + ;/* Pop the core registers. */ + ldmia r0!, {r4-r11, r14} + + ;/* Is the task using the FPU context? If so, pop the high vfp registers + ;too. */ + tst r14, #0x10 + it eq + vldmiaeq r0!, {s16-s31} + + msr psp, r0 + isb + bx r14 + .endasmfunc + +; ----------------------------------------------------------- + + .align 4 +vPortSVCHandler: .asmfunc + ;/* Get the location of the current TCB. */ + ldr r3, pxCurrentTCBConst + ldr r1, [r3] + ldr r0, [r1] + ;/* Pop the core registers. */ + ldmia r0!, {r4-r11, r14} + msr psp, r0 + isb + mov r0, #0 + msr basepri, r0 + bx r14 + .endasmfunc + +; ----------------------------------------------------------- + + .align 4 +vPortStartFirstTask: .asmfunc + ;/* Use the NVIC offset register to locate the stack. */ + ldr r0, NVICOffsetConst + ldr r0, [r0] + ldr r0, [r0] + ;/* Set the msp back to the start of the stack. */ + msr msp, r0 + ;/* Call SVC to start the first task. */ + cpsie i + cpsie f + dsb + isb + svc #0 + .endasmfunc + +; ----------------------------------------------------------- + + .align 4 +vPortEnableVFP: .asmfunc + ;/* The FPU enable bits are in the CPACR. */ + ldr.w r0, CPACRConst + ldr r1, [r0] + + ;/* Enable CP10 and CP11 coprocessors, then save back. */ + orr r1, r1, #( 0xf << 20 ) + str r1, [r0] + bx r14 + .endasmfunc + + .end + +; ----------------------------------------------------------- + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/67/1008565d95970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/67/1008565d95970017138fe0bf747e5677 new file mode 100644 index 0000000..49d389a --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/67/1008565d95970017138fe0bf747e5677 @@ -0,0 +1,129 @@ +ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +heap_4.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -fno-common -mcpu=cortex-m3 -mthumb $(RELEASE_DEFINES) $(INCLUDES) +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -nostartfiles -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map +release: export LDARCHIVES := -L. -L$(STM32_STDPERIPH_ROOT) -lSTM_StdPeriph +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -f hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + rm -rf obj_release + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +else + +vpath %.c \ +src \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport + +vpath %.s $(STARTER_SCRIPT_DIR) +vpath %.o $(OBJ_DIR) + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) $(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)/$@ + +$(OBJ_DIR): + mkdir -p $@ + +endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/68/205525549a970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/68/205525549a970017138fe0bf747e5677 new file mode 100644 index 0000000..f8d3525 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/68/205525549a970017138fe0bf747e5677 @@ -0,0 +1,211 @@ +/* +****************************************************************************** +** +** File : LinkerScript.ld +** +** Author : Auto-generated by Ac6 System Workbench +** +** Abstract : Linker script for STM32F107VCTx Device from STM32F1 series +** 64Kbytes RAM +** 256Kbytes ROM +** +** Set heap size, stack size and stack location according +** to application requirements. +** +** Set memory bank area and size if external memory is used. +** +** Target : STMicroelectronics STM32 +** +** Distribution: The file is distributed “as is,” without any warranty +** of any kind. +** +***************************************************************************** +** @attention +** +**

© COPYRIGHT(c) 2017 Ac6

+** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** 1. Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** 3. Neither the name of Ac6 nor the names of its contributors +** may be used to endorse or promote products derived from this software +** without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +***************************************************************************** +*/ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = 0x20010000; /* end of RAM */ + +_Min_Heap_Size = 0; /* required amount of heap */ +_Min_Stack_Size = 0x400; /* required amount of stack */ + +/* Memories definition */ +MEMORY +{ + RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K + ROM (rx) : ORIGIN = 0x8000000, LENGTH = 256K +} + +/* Sections */ +SECTIONS +{ + /* The startup code into ROM memory */ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } >ROM + + /* The program code and other data into ROM memory */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + } >ROM + + /* Constant data into ROM memory*/ + .rodata : + { + . = ALIGN(4); + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + . = ALIGN(4); + } >ROM + + .ARM.extab : { + . = ALIGN(4); + *(.ARM.extab* .gnu.linkonce.armextab.*) + . = ALIGN(4); + } >ROM + + .ARM : { + . = ALIGN(4); + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + . = ALIGN(4); + } >ROM + + .preinit_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + . = ALIGN(4); + } >ROM + + .init_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + . = ALIGN(4); + } >ROM + + .fini_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + . = ALIGN(4); + } >ROM + + /* Used by the startup to initialize data */ + _sidata = LOADADDR(.data); + + /* Initialized data sections into RAM memory */ + .data : + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + } >RAM AT> ROM + + + /* Uninitialized data section into RAM memory */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM + + /* User_heap_stack section, used to check that there is enough RAM left */ + ._user_heap_stack : + { + . = ALIGN(8); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(8); + } >RAM + + + + /* Remove information from the compiler libraries */ +/* /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } +*/ + .ARM.attributes 0 : { *(.ARM.attributes) } + + GROUP + ( + libgcc.a + libg.a + libc.a + libm.a + libnosys.a + ) +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/68/d1e251089d9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/68/d1e251089d9400171201ed9ff9474498 new file mode 100644 index 0000000..c7cbdf0 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/68/d1e251089d9400171201ed9ff9474498 @@ -0,0 +1,330 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* +Changes from V2.6.1 + + + Replaced the sUsingPreemption variable with the configUSE_PREEMPTION + macro to be consistent with the later ports. + +Changes from V4.0.1 + + + Add function prvSetTickFrequencyDefault() to set the DOS tick back to + its proper value when the scheduler exits. +*/ + +#include +#include +#include + +#include "FreeRTOS.h" +#include "task.h" +#include "portasm.h" + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the industrial + * PC port. + *----------------------------------------------------------*/ + +/*lint -e950 Non ANSI reserved words okay in this file only. */ + +#define portTIMER_INT_NUMBER 0x08 + +/* Setup hardware for required tick interrupt rate. */ +static void prvSetTickFrequency( uint32_t ulTickRateHz ); + +/* Restore hardware to as it was prior to starting the scheduler. */ +static void prvExitFunction( void ); + +/* Either chain to the DOS tick (which itself clears the PIC) or clear the PIC +directly. We chain to the DOS tick as close as possible to the standard DOS +tick rate. */ +static void prvPortResetPIC( void ); + +/* The ISR used depends on whether the preemptive or cooperative +scheduler is being used. */ +#if( configUSE_PREEMPTION == 1 ) + /* Tick service routine used by the scheduler when preemptive scheduling is + being used. */ + static void __interrupt __far prvPreemptiveTick( void ); +#else + /* Tick service routine used by the scheduler when cooperative scheduling is + being used. */ + static void __interrupt __far prvNonPreemptiveTick( void ); +#endif + +/* Trap routine used by taskYIELD() to manually cause a context switch. */ +static void __interrupt __far prvYieldProcessor( void ); + +/* Set the tick frequency back so the floppy drive works correctly when the +scheduler exits. */ +static void prvSetTickFrequencyDefault( void ); + +/*lint -e956 File scopes necessary here. */ + +/* Used to signal when to chain to the DOS tick, and when to just clear the PIC ourselves. */ +static int16_t sDOSTickCounter; + +/* Set true when the vectors are set so the scheduler will service the tick. */ +static BaseType_t xSchedulerRunning = pdFALSE; + +/* Points to the original routine installed on the vector we use for manual context switches. This is then used to restore the original routine during prvExitFunction(). */ +static void ( __interrupt __far *pxOldSwitchISR )(); + +/* Points to the original routine installed on the vector we use to chain to the DOS tick. This is then used to restore the original routine during prvExitFunction(). */ +static void ( __interrupt __far *pxOldSwitchISRPlus1 )(); + +/* Used to restore the original DOS context when the scheduler is ended. */ +static jmp_buf xJumpBuf; + +/*lint +e956 */ + +/*-----------------------------------------------------------*/ +BaseType_t xPortStartScheduler( void ) +{ +pxISR pxOriginalTickISR; + + /* This is called with interrupts already disabled. */ + + /* Remember what was on the interrupts we are going to use + so we can put them back later if required. */ + pxOldSwitchISR = _dos_getvect( portSWITCH_INT_NUMBER ); + pxOriginalTickISR = _dos_getvect( portTIMER_INT_NUMBER ); + pxOldSwitchISRPlus1 = _dos_getvect( portSWITCH_INT_NUMBER + 1 ); + + prvSetTickFrequency( configTICK_RATE_HZ ); + + /* Put our manual switch (yield) function on a known + vector. */ + _dos_setvect( portSWITCH_INT_NUMBER, prvYieldProcessor ); + + /* Put the old tick on a different interrupt number so we can + call it when we want. */ + _dos_setvect( portSWITCH_INT_NUMBER + 1, pxOriginalTickISR ); + + /* The ISR used depends on whether the preemptive or cooperative + scheduler is being used. */ + #if( configUSE_PREEMPTION == 1 ) + { + /* Put our tick switch function on the timer interrupt. */ + _dos_setvect( portTIMER_INT_NUMBER, prvPreemptiveTick ); + } + #else + { + /* We want the timer interrupt to just increment the tick count. */ + _dos_setvect( portTIMER_INT_NUMBER, prvNonPreemptiveTick ); + } + #endif + + /* Setup a counter that is used to call the DOS interrupt as close + to it's original frequency as can be achieved given our chosen tick + frequency. */ + sDOSTickCounter = portTICKS_PER_DOS_TICK; + + /* Clean up function if we want to return to DOS. */ + if( setjmp( xJumpBuf ) != 0 ) + { + prvExitFunction(); + xSchedulerRunning = pdFALSE; + } + else + { + xSchedulerRunning = pdTRUE; + + /* Kick off the scheduler by setting up the context of the first task. */ + portFIRST_CONTEXT(); + } + + return xSchedulerRunning; +} +/*-----------------------------------------------------------*/ + +/* The ISR used depends on whether the preemptive or cooperative +scheduler is being used. */ +#if( configUSE_PREEMPTION == 1 ) + static void __interrupt __far prvPreemptiveTick( void ) + { + /* Get the scheduler to update the task states following the tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Switch in the context of the next task to be run. */ + portSWITCH_CONTEXT(); + } + + /* Reset the PIC ready for the next time. */ + prvPortResetPIC(); + } +#else + static void __interrupt __far prvNonPreemptiveTick( void ) + { + /* Same as preemptive tick, but the cooperative scheduler is being used + so we don't have to switch in the context of the next task. */ + xTaskIncrementTick(); + prvPortResetPIC(); + } +#endif +/*-----------------------------------------------------------*/ + +static void __interrupt __far prvYieldProcessor( void ) +{ + /* Switch in the context of the next task to be run. */ + portSWITCH_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +static void prvPortResetPIC( void ) +{ + /* We are going to call the DOS tick interrupt at as close a + frequency to the normal DOS tick as possible. */ + + /* WE SHOULD NOT DO THIS IF YIELD WAS CALLED. */ + --sDOSTickCounter; + if( sDOSTickCounter <= 0 ) + { + sDOSTickCounter = ( int16_t ) portTICKS_PER_DOS_TICK; + __asm{ int portSWITCH_INT_NUMBER + 1 }; + } + else + { + /* Reset the PIC as the DOS tick is not being called to + do it. */ + __asm + { + mov al, 20H + out 20H, al + }; + } +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Jump back to the processor state prior to starting the + scheduler. This means we are not going to be using a + task stack frame so the task can be deleted. */ + longjmp( xJumpBuf, 1 ); +} +/*-----------------------------------------------------------*/ + +static void prvExitFunction( void ) +{ +void ( __interrupt __far *pxOriginalTickISR )(); + + /* Interrupts should be disabled here anyway - but no + harm in making sure. */ + portDISABLE_INTERRUPTS(); + if( xSchedulerRunning == pdTRUE ) + { + /* Set the DOS tick back onto the timer ticker. */ + pxOriginalTickISR = _dos_getvect( portSWITCH_INT_NUMBER + 1 ); + _dos_setvect( portTIMER_INT_NUMBER, pxOriginalTickISR ); + prvSetTickFrequencyDefault(); + + /* Put back the switch interrupt routines that was in place + before the scheduler started. */ + _dos_setvect( portSWITCH_INT_NUMBER, pxOldSwitchISR ); + _dos_setvect( portSWITCH_INT_NUMBER + 1, pxOldSwitchISRPlus1 ); + } + /* The tick timer is back how DOS wants it. We can re-enable + interrupts without the scheduler being called. */ + portENABLE_INTERRUPTS(); +} +/*-----------------------------------------------------------*/ + +static void prvSetTickFrequency( uint32_t ulTickRateHz ) +{ +const uint16_t usPIT_MODE = ( uint16_t ) 0x43; +const uint16_t usPIT0 = ( uint16_t ) 0x40; +const uint32_t ulPIT_CONST = ( uint32_t ) 1193180UL; +const uint16_t us8254_CTR0_MODE3 = ( uint16_t ) 0x36; +uint32_t ulOutput; + + /* Setup the 8245 to tick at the wanted frequency. */ + portOUTPUT_BYTE( usPIT_MODE, us8254_CTR0_MODE3 ); + ulOutput = ulPIT_CONST / ulTickRateHz; + portOUTPUT_BYTE( usPIT0, ( uint16_t )( ulOutput & ( uint32_t ) 0xff ) ); + ulOutput >>= 8; + portOUTPUT_BYTE( usPIT0, ( uint16_t ) ( ulOutput & ( uint32_t ) 0xff ) ); +} +/*-----------------------------------------------------------*/ + +static void prvSetTickFrequencyDefault( void ) +{ +const uint16_t usPIT_MODE = ( uint16_t ) 0x43; +const uint16_t usPIT0 = ( uint16_t ) 0x40; +const uint16_t us8254_CTR0_MODE3 = ( uint16_t ) 0x36; + + portOUTPUT_BYTE( usPIT_MODE, us8254_CTR0_MODE3 ); + portOUTPUT_BYTE( usPIT0,0 ); + portOUTPUT_BYTE( usPIT0,0 ); +} + + +/*lint +e950 */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/69/20ee0531c796001713a7ede92b37d6f1 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/69/20ee0531c796001713a7ede92b37d6f1 new file mode 100644 index 0000000..e48468e --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/69/20ee0531c796001713a7ede92b37d6f1 @@ -0,0 +1,8336 @@ +/** + ****************************************************************************** + * @file stm32f10x.h + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief CMSIS Cortex-M3 Device Peripheral Access Layer Header File. + * This file contains all the peripheral register's definitions, bits + * definitions and memory mapping for STM32F10x Connectivity line, + * High density, High density value line, Medium density, + * Medium density Value line, Low density, Low density Value line + * and XL-density devices. + * + * The file is the unique include file that the application programmer + * is using in the C source code, usually in main.c. This file contains: + * - Configuration section that allows to select: + * - The device used in the target application + * - To use or not the peripheral’s drivers in application code(i.e. + * code will be based on direct access to peripheral’s registers + * rather than drivers API), this option is controlled by + * "#define USE_STDPERIPH_DRIVER" + * - To change few application-specific parameters such as the HSE + * crystal frequency + * - Data structures and the address mapping for all peripherals + * - Peripheral's registers declarations and bits definition + * - Macros to access peripheral’s registers hardware + * + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f10x + * @{ + */ + +#ifndef __STM32F10x_H +#define __STM32F10x_H + +#ifdef __cplusplus + extern "C" { +#endif + +/** @addtogroup Library_configuration_section + * @{ + */ + +/* Uncomment the line below according to the target STM32 device used in your + application + */ + +#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD) && !defined (STM32F10X_HD_VL) && !defined (STM32F10X_XL) && !defined (STM32F10X_CL) + /* #define STM32F10X_LD */ /*!< STM32F10X_LD: STM32 Low density devices */ + /* #define STM32F10X_LD_VL */ /*!< STM32F10X_LD_VL: STM32 Low density Value Line devices */ + /* #define STM32F10X_MD */ /*!< STM32F10X_MD: STM32 Medium density devices */ + /* #define STM32F10X_MD_VL */ /*!< STM32F10X_MD_VL: STM32 Medium density Value Line devices */ + /* #define STM32F10X_HD */ /*!< STM32F10X_HD: STM32 High density devices */ + /* #define STM32F10X_HD_VL */ /*!< STM32F10X_HD_VL: STM32 High density value line devices */ + /* #define STM32F10X_XL */ /*!< STM32F10X_XL: STM32 XL-density devices */ + #define STM32F10X_CL /*!< STM32F10X_CL: STM32 Connectivity line devices */ +#endif +/* Tip: To avoid modifying this file each time you need to switch between these + devices, you can define the device in your toolchain compiler preprocessor. + + - Low-density devices are STM32F101xx, STM32F102xx and STM32F103xx microcontrollers + where the Flash memory density ranges between 16 and 32 Kbytes. + - Low-density value line devices are STM32F100xx microcontrollers where the Flash + memory density ranges between 16 and 32 Kbytes. + - Medium-density devices are STM32F101xx, STM32F102xx and STM32F103xx microcontrollers + where the Flash memory density ranges between 64 and 128 Kbytes. + - Medium-density value line devices are STM32F100xx microcontrollers where the + Flash memory density ranges between 64 and 128 Kbytes. + - High-density devices are STM32F101xx and STM32F103xx microcontrollers where + the Flash memory density ranges between 256 and 512 Kbytes. + - High-density value line devices are STM32F100xx microcontrollers where the + Flash memory density ranges between 256 and 512 Kbytes. + - XL-density devices are STM32F101xx and STM32F103xx microcontrollers where + the Flash memory density ranges between 512 and 1024 Kbytes. + - Connectivity line devices are STM32F105xx and STM32F107xx microcontrollers. + */ + +#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD) && !defined (STM32F10X_HD_VL) && !defined (STM32F10X_XL) && !defined (STM32F10X_CL) + #error "Please select first the target STM32F10x device used in your application (in stm32f10x.h file)" +#endif + +#if !defined USE_STDPERIPH_DRIVER +/** + * @brief Comment the line below if you will not use the peripherals drivers. + In this case, these drivers will not be included and the application code will + be based on direct access to peripherals registers + */ + /*#define USE_STDPERIPH_DRIVER*/ +#endif + +/** + * @brief In the following line adjust the value of External High Speed oscillator (HSE) + used in your application + + Tip: To avoid modifying this file each time you need to use different HSE, you + can define the HSE value in your toolchain compiler preprocessor. + */ +#if !defined HSE_VALUE + #ifdef STM32F10X_CL + #define HSE_VALUE ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */ + #else + #define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */ + #endif /* STM32F10X_CL */ +#endif /* HSE_VALUE */ + + +/** + * @brief In the following line adjust the External High Speed oscillator (HSE) Startup + Timeout value + */ +#define HSE_STARTUP_TIMEOUT ((uint16_t)0x0500) /*!< Time out for HSE start up */ + +#define HSI_VALUE ((uint32_t)8000000) /*!< Value of the Internal oscillator in Hz*/ + +/** + * @brief STM32F10x Standard Peripheral Library version number + */ +#define __STM32F10X_STDPERIPH_VERSION_MAIN (0x03) /*!< [31:24] main version */ +#define __STM32F10X_STDPERIPH_VERSION_SUB1 (0x05) /*!< [23:16] sub1 version */ +#define __STM32F10X_STDPERIPH_VERSION_SUB2 (0x00) /*!< [15:8] sub2 version */ +#define __STM32F10X_STDPERIPH_VERSION_RC (0x00) /*!< [7:0] release candidate */ +#define __STM32F10X_STDPERIPH_VERSION ( (__STM32F10X_STDPERIPH_VERSION_MAIN << 24)\ + |(__STM32F10X_STDPERIPH_VERSION_SUB1 << 16)\ + |(__STM32F10X_STDPERIPH_VERSION_SUB2 << 8)\ + |(__STM32F10X_STDPERIPH_VERSION_RC)) + +/** + * @} + */ + +/** @addtogroup Configuration_section_for_CMSIS + * @{ + */ + +/** + * @brief Configuration of the Cortex-M3 Processor and Core Peripherals + */ +#ifdef STM32F10X_XL + #define __MPU_PRESENT 1 /*!< STM32 XL-density devices provide an MPU */ +#else + #define __MPU_PRESENT 0 /*!< Other STM32 devices does not provide an MPU */ +#endif /* STM32F10X_XL */ +#define __NVIC_PRIO_BITS 4 /*!< STM32 uses 4 Bits for the Priority Levels */ +#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */ + +/** + * @brief STM32F10x Interrupt Number Definition, according to the selected device + * in @ref Library_configuration_section + */ +typedef enum IRQn +{ +/****** Cortex-M3 Processor Exceptions Numbers ***************************************************/ + NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ + MemoryManagement_IRQn = -12, /*!< 4 Cortex-M3 Memory Management Interrupt */ + BusFault_IRQn = -11, /*!< 5 Cortex-M3 Bus Fault Interrupt */ + UsageFault_IRQn = -10, /*!< 6 Cortex-M3 Usage Fault Interrupt */ + SVCall_IRQn = -5, /*!< 11 Cortex-M3 SV Call Interrupt */ + DebugMonitor_IRQn = -4, /*!< 12 Cortex-M3 Debug Monitor Interrupt */ + PendSV_IRQn = -2, /*!< 14 Cortex-M3 Pend SV Interrupt */ + SysTick_IRQn = -1, /*!< 15 Cortex-M3 System Tick Interrupt */ + +/****** STM32 specific Interrupt Numbers *********************************************************/ + WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */ + PVD_IRQn = 1, /*!< PVD through EXTI Line detection Interrupt */ + TAMPER_IRQn = 2, /*!< Tamper Interrupt */ + RTC_IRQn = 3, /*!< RTC global Interrupt */ + FLASH_IRQn = 4, /*!< FLASH global Interrupt */ + RCC_IRQn = 5, /*!< RCC global Interrupt */ + EXTI0_IRQn = 6, /*!< EXTI Line0 Interrupt */ + EXTI1_IRQn = 7, /*!< EXTI Line1 Interrupt */ + EXTI2_IRQn = 8, /*!< EXTI Line2 Interrupt */ + EXTI3_IRQn = 9, /*!< EXTI Line3 Interrupt */ + EXTI4_IRQn = 10, /*!< EXTI Line4 Interrupt */ + DMA1_Channel1_IRQn = 11, /*!< DMA1 Channel 1 global Interrupt */ + DMA1_Channel2_IRQn = 12, /*!< DMA1 Channel 2 global Interrupt */ + DMA1_Channel3_IRQn = 13, /*!< DMA1 Channel 3 global Interrupt */ + DMA1_Channel4_IRQn = 14, /*!< DMA1 Channel 4 global Interrupt */ + DMA1_Channel5_IRQn = 15, /*!< DMA1 Channel 5 global Interrupt */ + DMA1_Channel6_IRQn = 16, /*!< DMA1 Channel 6 global Interrupt */ + DMA1_Channel7_IRQn = 17, /*!< DMA1 Channel 7 global Interrupt */ + +#ifdef STM32F10X_LD + ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ + USB_HP_CAN1_TX_IRQn = 19, /*!< USB Device High Priority or CAN1 TX Interrupts */ + USB_LP_CAN1_RX0_IRQn = 20, /*!< USB Device Low Priority or CAN1 RX0 Interrupts */ + CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ + CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ + EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ + TIM1_BRK_IRQn = 24, /*!< TIM1 Break Interrupt */ + TIM1_UP_IRQn = 25, /*!< TIM1 Update Interrupt */ + TIM1_TRG_COM_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt */ + TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ + TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ + TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ + I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ + I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ + SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ + USART1_IRQn = 37, /*!< USART1 global Interrupt */ + USART2_IRQn = 38, /*!< USART2 global Interrupt */ + EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ + RTCAlarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ + USBWakeUp_IRQn = 42 /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */ +#endif /* STM32F10X_LD */ + +#ifdef STM32F10X_LD_VL + ADC1_IRQn = 18, /*!< ADC1 global Interrupt */ + EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ + TIM1_BRK_TIM15_IRQn = 24, /*!< TIM1 Break and TIM15 Interrupts */ + TIM1_UP_TIM16_IRQn = 25, /*!< TIM1 Update and TIM16 Interrupts */ + TIM1_TRG_COM_TIM17_IRQn = 26, /*!< TIM1 Trigger and Commutation and TIM17 Interrupt */ + TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ + TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ + TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ + I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ + I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ + SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ + USART1_IRQn = 37, /*!< USART1 global Interrupt */ + USART2_IRQn = 38, /*!< USART2 global Interrupt */ + EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ + RTCAlarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ + CEC_IRQn = 42, /*!< HDMI-CEC Interrupt */ + TIM6_DAC_IRQn = 54, /*!< TIM6 and DAC underrun Interrupt */ + TIM7_IRQn = 55 /*!< TIM7 Interrupt */ +#endif /* STM32F10X_LD_VL */ + +#ifdef STM32F10X_MD + ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ + USB_HP_CAN1_TX_IRQn = 19, /*!< USB Device High Priority or CAN1 TX Interrupts */ + USB_LP_CAN1_RX0_IRQn = 20, /*!< USB Device Low Priority or CAN1 RX0 Interrupts */ + CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ + CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ + EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ + TIM1_BRK_IRQn = 24, /*!< TIM1 Break Interrupt */ + TIM1_UP_IRQn = 25, /*!< TIM1 Update Interrupt */ + TIM1_TRG_COM_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt */ + TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ + TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ + TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ + TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ + I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ + I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ + I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ + I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ + SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ + SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ + USART1_IRQn = 37, /*!< USART1 global Interrupt */ + USART2_IRQn = 38, /*!< USART2 global Interrupt */ + USART3_IRQn = 39, /*!< USART3 global Interrupt */ + EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ + RTCAlarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ + USBWakeUp_IRQn = 42 /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */ +#endif /* STM32F10X_MD */ + +#ifdef STM32F10X_MD_VL + ADC1_IRQn = 18, /*!< ADC1 global Interrupt */ + EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ + TIM1_BRK_TIM15_IRQn = 24, /*!< TIM1 Break and TIM15 Interrupts */ + TIM1_UP_TIM16_IRQn = 25, /*!< TIM1 Update and TIM16 Interrupts */ + TIM1_TRG_COM_TIM17_IRQn = 26, /*!< TIM1 Trigger and Commutation and TIM17 Interrupt */ + TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ + TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ + TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ + TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ + I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ + I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ + I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ + I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ + SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ + SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ + USART1_IRQn = 37, /*!< USART1 global Interrupt */ + USART2_IRQn = 38, /*!< USART2 global Interrupt */ + USART3_IRQn = 39, /*!< USART3 global Interrupt */ + EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ + RTCAlarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ + CEC_IRQn = 42, /*!< HDMI-CEC Interrupt */ + TIM6_DAC_IRQn = 54, /*!< TIM6 and DAC underrun Interrupt */ + TIM7_IRQn = 55 /*!< TIM7 Interrupt */ +#endif /* STM32F10X_MD_VL */ + +#ifdef STM32F10X_HD + ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ + USB_HP_CAN1_TX_IRQn = 19, /*!< USB Device High Priority or CAN1 TX Interrupts */ + USB_LP_CAN1_RX0_IRQn = 20, /*!< USB Device Low Priority or CAN1 RX0 Interrupts */ + CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ + CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ + EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ + TIM1_BRK_IRQn = 24, /*!< TIM1 Break Interrupt */ + TIM1_UP_IRQn = 25, /*!< TIM1 Update Interrupt */ + TIM1_TRG_COM_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt */ + TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ + TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ + TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ + TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ + I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ + I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ + I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ + I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ + SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ + SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ + USART1_IRQn = 37, /*!< USART1 global Interrupt */ + USART2_IRQn = 38, /*!< USART2 global Interrupt */ + USART3_IRQn = 39, /*!< USART3 global Interrupt */ + EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ + RTCAlarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ + USBWakeUp_IRQn = 42, /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */ + TIM8_BRK_IRQn = 43, /*!< TIM8 Break Interrupt */ + TIM8_UP_IRQn = 44, /*!< TIM8 Update Interrupt */ + TIM8_TRG_COM_IRQn = 45, /*!< TIM8 Trigger and Commutation Interrupt */ + TIM8_CC_IRQn = 46, /*!< TIM8 Capture Compare Interrupt */ + ADC3_IRQn = 47, /*!< ADC3 global Interrupt */ + FSMC_IRQn = 48, /*!< FSMC global Interrupt */ + SDIO_IRQn = 49, /*!< SDIO global Interrupt */ + TIM5_IRQn = 50, /*!< TIM5 global Interrupt */ + SPI3_IRQn = 51, /*!< SPI3 global Interrupt */ + UART4_IRQn = 52, /*!< UART4 global Interrupt */ + UART5_IRQn = 53, /*!< UART5 global Interrupt */ + TIM6_IRQn = 54, /*!< TIM6 global Interrupt */ + TIM7_IRQn = 55, /*!< TIM7 global Interrupt */ + DMA2_Channel1_IRQn = 56, /*!< DMA2 Channel 1 global Interrupt */ + DMA2_Channel2_IRQn = 57, /*!< DMA2 Channel 2 global Interrupt */ + DMA2_Channel3_IRQn = 58, /*!< DMA2 Channel 3 global Interrupt */ + DMA2_Channel4_5_IRQn = 59 /*!< DMA2 Channel 4 and Channel 5 global Interrupt */ +#endif /* STM32F10X_HD */ + +#ifdef STM32F10X_HD_VL + ADC1_IRQn = 18, /*!< ADC1 global Interrupt */ + EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ + TIM1_BRK_TIM15_IRQn = 24, /*!< TIM1 Break and TIM15 Interrupts */ + TIM1_UP_TIM16_IRQn = 25, /*!< TIM1 Update and TIM16 Interrupts */ + TIM1_TRG_COM_TIM17_IRQn = 26, /*!< TIM1 Trigger and Commutation and TIM17 Interrupt */ + TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ + TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ + TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ + TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ + I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ + I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ + I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ + I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ + SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ + SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ + USART1_IRQn = 37, /*!< USART1 global Interrupt */ + USART2_IRQn = 38, /*!< USART2 global Interrupt */ + USART3_IRQn = 39, /*!< USART3 global Interrupt */ + EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ + RTCAlarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ + CEC_IRQn = 42, /*!< HDMI-CEC Interrupt */ + TIM12_IRQn = 43, /*!< TIM12 global Interrupt */ + TIM13_IRQn = 44, /*!< TIM13 global Interrupt */ + TIM14_IRQn = 45, /*!< TIM14 global Interrupt */ + TIM5_IRQn = 50, /*!< TIM5 global Interrupt */ + SPI3_IRQn = 51, /*!< SPI3 global Interrupt */ + UART4_IRQn = 52, /*!< UART4 global Interrupt */ + UART5_IRQn = 53, /*!< UART5 global Interrupt */ + TIM6_DAC_IRQn = 54, /*!< TIM6 and DAC underrun Interrupt */ + TIM7_IRQn = 55, /*!< TIM7 Interrupt */ + DMA2_Channel1_IRQn = 56, /*!< DMA2 Channel 1 global Interrupt */ + DMA2_Channel2_IRQn = 57, /*!< DMA2 Channel 2 global Interrupt */ + DMA2_Channel3_IRQn = 58, /*!< DMA2 Channel 3 global Interrupt */ + DMA2_Channel4_5_IRQn = 59, /*!< DMA2 Channel 4 and Channel 5 global Interrupt */ + DMA2_Channel5_IRQn = 60 /*!< DMA2 Channel 5 global Interrupt (DMA2 Channel 5 is + mapped at position 60 only if the MISC_REMAP bit in + the AFIO_MAPR2 register is set) */ +#endif /* STM32F10X_HD_VL */ + +#ifdef STM32F10X_XL + ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ + USB_HP_CAN1_TX_IRQn = 19, /*!< USB Device High Priority or CAN1 TX Interrupts */ + USB_LP_CAN1_RX0_IRQn = 20, /*!< USB Device Low Priority or CAN1 RX0 Interrupts */ + CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ + CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ + EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ + TIM1_BRK_TIM9_IRQn = 24, /*!< TIM1 Break Interrupt and TIM9 global Interrupt */ + TIM1_UP_TIM10_IRQn = 25, /*!< TIM1 Update Interrupt and TIM10 global Interrupt */ + TIM1_TRG_COM_TIM11_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt and TIM11 global interrupt */ + TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ + TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ + TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ + TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ + I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ + I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ + I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ + I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ + SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ + SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ + USART1_IRQn = 37, /*!< USART1 global Interrupt */ + USART2_IRQn = 38, /*!< USART2 global Interrupt */ + USART3_IRQn = 39, /*!< USART3 global Interrupt */ + EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ + RTCAlarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ + USBWakeUp_IRQn = 42, /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */ + TIM8_BRK_TIM12_IRQn = 43, /*!< TIM8 Break Interrupt and TIM12 global Interrupt */ + TIM8_UP_TIM13_IRQn = 44, /*!< TIM8 Update Interrupt and TIM13 global Interrupt */ + TIM8_TRG_COM_TIM14_IRQn = 45, /*!< TIM8 Trigger and Commutation Interrupt and TIM14 global interrupt */ + TIM8_CC_IRQn = 46, /*!< TIM8 Capture Compare Interrupt */ + ADC3_IRQn = 47, /*!< ADC3 global Interrupt */ + FSMC_IRQn = 48, /*!< FSMC global Interrupt */ + SDIO_IRQn = 49, /*!< SDIO global Interrupt */ + TIM5_IRQn = 50, /*!< TIM5 global Interrupt */ + SPI3_IRQn = 51, /*!< SPI3 global Interrupt */ + UART4_IRQn = 52, /*!< UART4 global Interrupt */ + UART5_IRQn = 53, /*!< UART5 global Interrupt */ + TIM6_IRQn = 54, /*!< TIM6 global Interrupt */ + TIM7_IRQn = 55, /*!< TIM7 global Interrupt */ + DMA2_Channel1_IRQn = 56, /*!< DMA2 Channel 1 global Interrupt */ + DMA2_Channel2_IRQn = 57, /*!< DMA2 Channel 2 global Interrupt */ + DMA2_Channel3_IRQn = 58, /*!< DMA2 Channel 3 global Interrupt */ + DMA2_Channel4_5_IRQn = 59 /*!< DMA2 Channel 4 and Channel 5 global Interrupt */ +#endif /* STM32F10X_XL */ + +#ifdef STM32F10X_CL + ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ + CAN1_TX_IRQn = 19, /*!< USB Device High Priority or CAN1 TX Interrupts */ + CAN1_RX0_IRQn = 20, /*!< USB Device Low Priority or CAN1 RX0 Interrupts */ + CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ + CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ + EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ + TIM1_BRK_IRQn = 24, /*!< TIM1 Break Interrupt */ + TIM1_UP_IRQn = 25, /*!< TIM1 Update Interrupt */ + TIM1_TRG_COM_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt */ + TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ + TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ + TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ + TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ + I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ + I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ + I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ + I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ + SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ + SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ + USART1_IRQn = 37, /*!< USART1 global Interrupt */ + USART2_IRQn = 38, /*!< USART2 global Interrupt */ + USART3_IRQn = 39, /*!< USART3 global Interrupt */ + EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ + RTCAlarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ + OTG_FS_WKUP_IRQn = 42, /*!< USB OTG FS WakeUp from suspend through EXTI Line Interrupt */ + TIM5_IRQn = 50, /*!< TIM5 global Interrupt */ + SPI3_IRQn = 51, /*!< SPI3 global Interrupt */ + UART4_IRQn = 52, /*!< UART4 global Interrupt */ + UART5_IRQn = 53, /*!< UART5 global Interrupt */ + TIM6_IRQn = 54, /*!< TIM6 global Interrupt */ + TIM7_IRQn = 55, /*!< TIM7 global Interrupt */ + DMA2_Channel1_IRQn = 56, /*!< DMA2 Channel 1 global Interrupt */ + DMA2_Channel2_IRQn = 57, /*!< DMA2 Channel 2 global Interrupt */ + DMA2_Channel3_IRQn = 58, /*!< DMA2 Channel 3 global Interrupt */ + DMA2_Channel4_IRQn = 59, /*!< DMA2 Channel 4 global Interrupt */ + DMA2_Channel5_IRQn = 60, /*!< DMA2 Channel 5 global Interrupt */ + ETH_IRQn = 61, /*!< Ethernet global Interrupt */ + ETH_WKUP_IRQn = 62, /*!< Ethernet Wakeup through EXTI line Interrupt */ + CAN2_TX_IRQn = 63, /*!< CAN2 TX Interrupt */ + CAN2_RX0_IRQn = 64, /*!< CAN2 RX0 Interrupt */ + CAN2_RX1_IRQn = 65, /*!< CAN2 RX1 Interrupt */ + CAN2_SCE_IRQn = 66, /*!< CAN2 SCE Interrupt */ + OTG_FS_IRQn = 67 /*!< USB OTG FS global Interrupt */ +#endif /* STM32F10X_CL */ +} IRQn_Type; + +/** + * @} + */ + +#include "core_cm3.h" +#include "system_stm32f10x.h" +#include + +/** @addtogroup Exported_types + * @{ + */ + +/*!< STM32F10x Standard Peripheral Library old types (maintained for legacy purpose) */ +typedef int32_t s32; +typedef int16_t s16; +typedef int8_t s8; + +typedef const int32_t sc32; /*!< Read Only */ +typedef const int16_t sc16; /*!< Read Only */ +typedef const int8_t sc8; /*!< Read Only */ + +typedef __IO int32_t vs32; +typedef __IO int16_t vs16; +typedef __IO int8_t vs8; + +typedef __I int32_t vsc32; /*!< Read Only */ +typedef __I int16_t vsc16; /*!< Read Only */ +typedef __I int8_t vsc8; /*!< Read Only */ + +typedef uint32_t u32; +typedef uint16_t u16; +typedef uint8_t u8; + +typedef const uint32_t uc32; /*!< Read Only */ +typedef const uint16_t uc16; /*!< Read Only */ +typedef const uint8_t uc8; /*!< Read Only */ + +typedef __IO uint32_t vu32; +typedef __IO uint16_t vu16; +typedef __IO uint8_t vu8; + +typedef __I uint32_t vuc32; /*!< Read Only */ +typedef __I uint16_t vuc16; /*!< Read Only */ +typedef __I uint8_t vuc8; /*!< Read Only */ + +typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus; + +typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState; +#define IS_FUNCTIONAL_STATE(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE)) + +typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrorStatus; + +/*!< STM32F10x Standard Peripheral Library old definitions (maintained for legacy purpose) */ +#define HSEStartUp_TimeOut HSE_STARTUP_TIMEOUT +#define HSE_Value HSE_VALUE +#define HSI_Value HSI_VALUE +/** + * @} + */ + +/** @addtogroup Peripheral_registers_structures + * @{ + */ + +/** + * @brief Analog to Digital Converter + */ + +typedef struct +{ + __IO uint32_t SR; + __IO uint32_t CR1; + __IO uint32_t CR2; + __IO uint32_t SMPR1; + __IO uint32_t SMPR2; + __IO uint32_t JOFR1; + __IO uint32_t JOFR2; + __IO uint32_t JOFR3; + __IO uint32_t JOFR4; + __IO uint32_t HTR; + __IO uint32_t LTR; + __IO uint32_t SQR1; + __IO uint32_t SQR2; + __IO uint32_t SQR3; + __IO uint32_t JSQR; + __IO uint32_t JDR1; + __IO uint32_t JDR2; + __IO uint32_t JDR3; + __IO uint32_t JDR4; + __IO uint32_t DR; +} ADC_TypeDef; + +/** + * @brief Backup Registers + */ + +typedef struct +{ + uint32_t RESERVED0; + __IO uint16_t DR1; + uint16_t RESERVED1; + __IO uint16_t DR2; + uint16_t RESERVED2; + __IO uint16_t DR3; + uint16_t RESERVED3; + __IO uint16_t DR4; + uint16_t RESERVED4; + __IO uint16_t DR5; + uint16_t RESERVED5; + __IO uint16_t DR6; + uint16_t RESERVED6; + __IO uint16_t DR7; + uint16_t RESERVED7; + __IO uint16_t DR8; + uint16_t RESERVED8; + __IO uint16_t DR9; + uint16_t RESERVED9; + __IO uint16_t DR10; + uint16_t RESERVED10; + __IO uint16_t RTCCR; + uint16_t RESERVED11; + __IO uint16_t CR; + uint16_t RESERVED12; + __IO uint16_t CSR; + uint16_t RESERVED13[5]; + __IO uint16_t DR11; + uint16_t RESERVED14; + __IO uint16_t DR12; + uint16_t RESERVED15; + __IO uint16_t DR13; + uint16_t RESERVED16; + __IO uint16_t DR14; + uint16_t RESERVED17; + __IO uint16_t DR15; + uint16_t RESERVED18; + __IO uint16_t DR16; + uint16_t RESERVED19; + __IO uint16_t DR17; + uint16_t RESERVED20; + __IO uint16_t DR18; + uint16_t RESERVED21; + __IO uint16_t DR19; + uint16_t RESERVED22; + __IO uint16_t DR20; + uint16_t RESERVED23; + __IO uint16_t DR21; + uint16_t RESERVED24; + __IO uint16_t DR22; + uint16_t RESERVED25; + __IO uint16_t DR23; + uint16_t RESERVED26; + __IO uint16_t DR24; + uint16_t RESERVED27; + __IO uint16_t DR25; + uint16_t RESERVED28; + __IO uint16_t DR26; + uint16_t RESERVED29; + __IO uint16_t DR27; + uint16_t RESERVED30; + __IO uint16_t DR28; + uint16_t RESERVED31; + __IO uint16_t DR29; + uint16_t RESERVED32; + __IO uint16_t DR30; + uint16_t RESERVED33; + __IO uint16_t DR31; + uint16_t RESERVED34; + __IO uint16_t DR32; + uint16_t RESERVED35; + __IO uint16_t DR33; + uint16_t RESERVED36; + __IO uint16_t DR34; + uint16_t RESERVED37; + __IO uint16_t DR35; + uint16_t RESERVED38; + __IO uint16_t DR36; + uint16_t RESERVED39; + __IO uint16_t DR37; + uint16_t RESERVED40; + __IO uint16_t DR38; + uint16_t RESERVED41; + __IO uint16_t DR39; + uint16_t RESERVED42; + __IO uint16_t DR40; + uint16_t RESERVED43; + __IO uint16_t DR41; + uint16_t RESERVED44; + __IO uint16_t DR42; + uint16_t RESERVED45; +} BKP_TypeDef; + +/** + * @brief Controller Area Network TxMailBox + */ + +typedef struct +{ + __IO uint32_t TIR; + __IO uint32_t TDTR; + __IO uint32_t TDLR; + __IO uint32_t TDHR; +} CAN_TxMailBox_TypeDef; + +/** + * @brief Controller Area Network FIFOMailBox + */ + +typedef struct +{ + __IO uint32_t RIR; + __IO uint32_t RDTR; + __IO uint32_t RDLR; + __IO uint32_t RDHR; +} CAN_FIFOMailBox_TypeDef; + +/** + * @brief Controller Area Network FilterRegister + */ + +typedef struct +{ + __IO uint32_t FR1; + __IO uint32_t FR2; +} CAN_FilterRegister_TypeDef; + +/** + * @brief Controller Area Network + */ + +typedef struct +{ + __IO uint32_t MCR; + __IO uint32_t MSR; + __IO uint32_t TSR; + __IO uint32_t RF0R; + __IO uint32_t RF1R; + __IO uint32_t IER; + __IO uint32_t ESR; + __IO uint32_t BTR; + uint32_t RESERVED0[88]; + CAN_TxMailBox_TypeDef sTxMailBox[3]; + CAN_FIFOMailBox_TypeDef sFIFOMailBox[2]; + uint32_t RESERVED1[12]; + __IO uint32_t FMR; + __IO uint32_t FM1R; + uint32_t RESERVED2; + __IO uint32_t FS1R; + uint32_t RESERVED3; + __IO uint32_t FFA1R; + uint32_t RESERVED4; + __IO uint32_t FA1R; + uint32_t RESERVED5[8]; +#ifndef STM32F10X_CL + CAN_FilterRegister_TypeDef sFilterRegister[14]; +#else + CAN_FilterRegister_TypeDef sFilterRegister[28]; +#endif /* STM32F10X_CL */ +} CAN_TypeDef; + +/** + * @brief Consumer Electronics Control (CEC) + */ +typedef struct +{ + __IO uint32_t CFGR; + __IO uint32_t OAR; + __IO uint32_t PRES; + __IO uint32_t ESR; + __IO uint32_t CSR; + __IO uint32_t TXD; + __IO uint32_t RXD; +} CEC_TypeDef; + +/** + * @brief CRC calculation unit + */ + +typedef struct +{ + __IO uint32_t DR; + __IO uint8_t IDR; + uint8_t RESERVED0; + uint16_t RESERVED1; + __IO uint32_t CR; +} CRC_TypeDef; + +/** + * @brief Digital to Analog Converter + */ + +typedef struct +{ + __IO uint32_t CR; + __IO uint32_t SWTRIGR; + __IO uint32_t DHR12R1; + __IO uint32_t DHR12L1; + __IO uint32_t DHR8R1; + __IO uint32_t DHR12R2; + __IO uint32_t DHR12L2; + __IO uint32_t DHR8R2; + __IO uint32_t DHR12RD; + __IO uint32_t DHR12LD; + __IO uint32_t DHR8RD; + __IO uint32_t DOR1; + __IO uint32_t DOR2; +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) + __IO uint32_t SR; +#endif +} DAC_TypeDef; + +/** + * @brief Debug MCU + */ + +typedef struct +{ + __IO uint32_t IDCODE; + __IO uint32_t CR; +}DBGMCU_TypeDef; + +/** + * @brief DMA Controller + */ + +typedef struct +{ + __IO uint32_t CCR; + __IO uint32_t CNDTR; + __IO uint32_t CPAR; + __IO uint32_t CMAR; +} DMA_Channel_TypeDef; + +typedef struct +{ + __IO uint32_t ISR; + __IO uint32_t IFCR; +} DMA_TypeDef; + +/** + * @brief Ethernet MAC + */ + +typedef struct +{ + __IO uint32_t MACCR; + __IO uint32_t MACFFR; + __IO uint32_t MACHTHR; + __IO uint32_t MACHTLR; + __IO uint32_t MACMIIAR; + __IO uint32_t MACMIIDR; + __IO uint32_t MACFCR; + __IO uint32_t MACVLANTR; /* 8 */ + uint32_t RESERVED0[2]; + __IO uint32_t MACRWUFFR; /* 11 */ + __IO uint32_t MACPMTCSR; + uint32_t RESERVED1[2]; + __IO uint32_t MACSR; /* 15 */ + __IO uint32_t MACIMR; + __IO uint32_t MACA0HR; + __IO uint32_t MACA0LR; + __IO uint32_t MACA1HR; + __IO uint32_t MACA1LR; + __IO uint32_t MACA2HR; + __IO uint32_t MACA2LR; + __IO uint32_t MACA3HR; + __IO uint32_t MACA3LR; /* 24 */ + uint32_t RESERVED2[40]; + __IO uint32_t MMCCR; /* 65 */ + __IO uint32_t MMCRIR; + __IO uint32_t MMCTIR; + __IO uint32_t MMCRIMR; + __IO uint32_t MMCTIMR; /* 69 */ + uint32_t RESERVED3[14]; + __IO uint32_t MMCTGFSCCR; /* 84 */ + __IO uint32_t MMCTGFMSCCR; + uint32_t RESERVED4[5]; + __IO uint32_t MMCTGFCR; + uint32_t RESERVED5[10]; + __IO uint32_t MMCRFCECR; + __IO uint32_t MMCRFAECR; + uint32_t RESERVED6[10]; + __IO uint32_t MMCRGUFCR; + uint32_t RESERVED7[334]; + __IO uint32_t PTPTSCR; + __IO uint32_t PTPSSIR; + __IO uint32_t PTPTSHR; + __IO uint32_t PTPTSLR; + __IO uint32_t PTPTSHUR; + __IO uint32_t PTPTSLUR; + __IO uint32_t PTPTSAR; + __IO uint32_t PTPTTHR; + __IO uint32_t PTPTTLR; + uint32_t RESERVED8[567]; + __IO uint32_t DMABMR; + __IO uint32_t DMATPDR; + __IO uint32_t DMARPDR; + __IO uint32_t DMARDLAR; + __IO uint32_t DMATDLAR; + __IO uint32_t DMASR; + __IO uint32_t DMAOMR; + __IO uint32_t DMAIER; + __IO uint32_t DMAMFBOCR; + uint32_t RESERVED9[9]; + __IO uint32_t DMACHTDR; + __IO uint32_t DMACHRDR; + __IO uint32_t DMACHTBAR; + __IO uint32_t DMACHRBAR; +} ETH_TypeDef; + +/** + * @brief External Interrupt/Event Controller + */ + +typedef struct +{ + __IO uint32_t IMR; + __IO uint32_t EMR; + __IO uint32_t RTSR; + __IO uint32_t FTSR; + __IO uint32_t SWIER; + __IO uint32_t PR; +} EXTI_TypeDef; + +/** + * @brief FLASH Registers + */ + +typedef struct +{ + __IO uint32_t ACR; + __IO uint32_t KEYR; + __IO uint32_t OPTKEYR; + __IO uint32_t SR; + __IO uint32_t CR; + __IO uint32_t AR; + __IO uint32_t RESERVED; + __IO uint32_t OBR; + __IO uint32_t WRPR; +#ifdef STM32F10X_XL + uint32_t RESERVED1[8]; + __IO uint32_t KEYR2; + uint32_t RESERVED2; + __IO uint32_t SR2; + __IO uint32_t CR2; + __IO uint32_t AR2; +#endif /* STM32F10X_XL */ +} FLASH_TypeDef; + +/** + * @brief Option Bytes Registers + */ + +typedef struct +{ + __IO uint16_t RDP; + __IO uint16_t USER; + __IO uint16_t Data0; + __IO uint16_t Data1; + __IO uint16_t WRP0; + __IO uint16_t WRP1; + __IO uint16_t WRP2; + __IO uint16_t WRP3; +} OB_TypeDef; + +/** + * @brief Flexible Static Memory Controller + */ + +typedef struct +{ + __IO uint32_t BTCR[8]; +} FSMC_Bank1_TypeDef; + +/** + * @brief Flexible Static Memory Controller Bank1E + */ + +typedef struct +{ + __IO uint32_t BWTR[7]; +} FSMC_Bank1E_TypeDef; + +/** + * @brief Flexible Static Memory Controller Bank2 + */ + +typedef struct +{ + __IO uint32_t PCR2; + __IO uint32_t SR2; + __IO uint32_t PMEM2; + __IO uint32_t PATT2; + uint32_t RESERVED0; + __IO uint32_t ECCR2; +} FSMC_Bank2_TypeDef; + +/** + * @brief Flexible Static Memory Controller Bank3 + */ + +typedef struct +{ + __IO uint32_t PCR3; + __IO uint32_t SR3; + __IO uint32_t PMEM3; + __IO uint32_t PATT3; + uint32_t RESERVED0; + __IO uint32_t ECCR3; +} FSMC_Bank3_TypeDef; + +/** + * @brief Flexible Static Memory Controller Bank4 + */ + +typedef struct +{ + __IO uint32_t PCR4; + __IO uint32_t SR4; + __IO uint32_t PMEM4; + __IO uint32_t PATT4; + __IO uint32_t PIO4; +} FSMC_Bank4_TypeDef; + +/** + * @brief General Purpose I/O + */ + +typedef struct +{ + __IO uint32_t CRL; + __IO uint32_t CRH; + __IO uint32_t IDR; + __IO uint32_t ODR; + __IO uint32_t BSRR; + __IO uint32_t BRR; + __IO uint32_t LCKR; +} GPIO_TypeDef; + +/** + * @brief Alternate Function I/O + */ + +typedef struct +{ + __IO uint32_t EVCR; + __IO uint32_t MAPR; + __IO uint32_t EXTICR[4]; + uint32_t RESERVED0; + __IO uint32_t MAPR2; +} AFIO_TypeDef; +/** + * @brief Inter Integrated Circuit Interface + */ + +typedef struct +{ + __IO uint16_t CR1; + uint16_t RESERVED0; + __IO uint16_t CR2; + uint16_t RESERVED1; + __IO uint16_t OAR1; + uint16_t RESERVED2; + __IO uint16_t OAR2; + uint16_t RESERVED3; + __IO uint16_t DR; + uint16_t RESERVED4; + __IO uint16_t SR1; + uint16_t RESERVED5; + __IO uint16_t SR2; + uint16_t RESERVED6; + __IO uint16_t CCR; + uint16_t RESERVED7; + __IO uint16_t TRISE; + uint16_t RESERVED8; +} I2C_TypeDef; + +/** + * @brief Independent WATCHDOG + */ + +typedef struct +{ + __IO uint32_t KR; + __IO uint32_t PR; + __IO uint32_t RLR; + __IO uint32_t SR; +} IWDG_TypeDef; + +/** + * @brief Power Control + */ + +typedef struct +{ + __IO uint32_t CR; + __IO uint32_t CSR; +} PWR_TypeDef; + +/** + * @brief Reset and Clock Control + */ + +typedef struct +{ + __IO uint32_t CR; + __IO uint32_t CFGR; + __IO uint32_t CIR; + __IO uint32_t APB2RSTR; + __IO uint32_t APB1RSTR; + __IO uint32_t AHBENR; + __IO uint32_t APB2ENR; + __IO uint32_t APB1ENR; + __IO uint32_t BDCR; + __IO uint32_t CSR; + +#ifdef STM32F10X_CL + __IO uint32_t AHBRSTR; + __IO uint32_t CFGR2; +#endif /* STM32F10X_CL */ + +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) + uint32_t RESERVED0; + __IO uint32_t CFGR2; +#endif /* STM32F10X_LD_VL || STM32F10X_MD_VL || STM32F10X_HD_VL */ +} RCC_TypeDef; + +/** + * @brief Real-Time Clock + */ + +typedef struct +{ + __IO uint16_t CRH; + uint16_t RESERVED0; + __IO uint16_t CRL; + uint16_t RESERVED1; + __IO uint16_t PRLH; + uint16_t RESERVED2; + __IO uint16_t PRLL; + uint16_t RESERVED3; + __IO uint16_t DIVH; + uint16_t RESERVED4; + __IO uint16_t DIVL; + uint16_t RESERVED5; + __IO uint16_t CNTH; + uint16_t RESERVED6; + __IO uint16_t CNTL; + uint16_t RESERVED7; + __IO uint16_t ALRH; + uint16_t RESERVED8; + __IO uint16_t ALRL; + uint16_t RESERVED9; +} RTC_TypeDef; + +/** + * @brief SD host Interface + */ + +typedef struct +{ + __IO uint32_t POWER; + __IO uint32_t CLKCR; + __IO uint32_t ARG; + __IO uint32_t CMD; + __I uint32_t RESPCMD; + __I uint32_t RESP1; + __I uint32_t RESP2; + __I uint32_t RESP3; + __I uint32_t RESP4; + __IO uint32_t DTIMER; + __IO uint32_t DLEN; + __IO uint32_t DCTRL; + __I uint32_t DCOUNT; + __I uint32_t STA; + __IO uint32_t ICR; + __IO uint32_t MASK; + uint32_t RESERVED0[2]; + __I uint32_t FIFOCNT; + uint32_t RESERVED1[13]; + __IO uint32_t FIFO; +} SDIO_TypeDef; + +/** + * @brief Serial Peripheral Interface + */ + +typedef struct +{ + __IO uint16_t CR1; + uint16_t RESERVED0; + __IO uint16_t CR2; + uint16_t RESERVED1; + __IO uint16_t SR; + uint16_t RESERVED2; + __IO uint16_t DR; + uint16_t RESERVED3; + __IO uint16_t CRCPR; + uint16_t RESERVED4; + __IO uint16_t RXCRCR; + uint16_t RESERVED5; + __IO uint16_t TXCRCR; + uint16_t RESERVED6; + __IO uint16_t I2SCFGR; + uint16_t RESERVED7; + __IO uint16_t I2SPR; + uint16_t RESERVED8; +} SPI_TypeDef; + +/** + * @brief TIM + */ + +typedef struct +{ + __IO uint16_t CR1; + uint16_t RESERVED0; + __IO uint16_t CR2; + uint16_t RESERVED1; + __IO uint16_t SMCR; + uint16_t RESERVED2; + __IO uint16_t DIER; + uint16_t RESERVED3; + __IO uint16_t SR; + uint16_t RESERVED4; + __IO uint16_t EGR; + uint16_t RESERVED5; + __IO uint16_t CCMR1; + uint16_t RESERVED6; + __IO uint16_t CCMR2; + uint16_t RESERVED7; + __IO uint16_t CCER; + uint16_t RESERVED8; + __IO uint16_t CNT; + uint16_t RESERVED9; + __IO uint16_t PSC; + uint16_t RESERVED10; + __IO uint16_t ARR; + uint16_t RESERVED11; + __IO uint16_t RCR; + uint16_t RESERVED12; + __IO uint16_t CCR1; + uint16_t RESERVED13; + __IO uint16_t CCR2; + uint16_t RESERVED14; + __IO uint16_t CCR3; + uint16_t RESERVED15; + __IO uint16_t CCR4; + uint16_t RESERVED16; + __IO uint16_t BDTR; + uint16_t RESERVED17; + __IO uint16_t DCR; + uint16_t RESERVED18; + __IO uint16_t DMAR; + uint16_t RESERVED19; +} TIM_TypeDef; + +/** + * @brief Universal Synchronous Asynchronous Receiver Transmitter + */ + +typedef struct +{ + __IO uint16_t SR; + uint16_t RESERVED0; + __IO uint16_t DR; + uint16_t RESERVED1; + __IO uint16_t BRR; + uint16_t RESERVED2; + __IO uint16_t CR1; + uint16_t RESERVED3; + __IO uint16_t CR2; + uint16_t RESERVED4; + __IO uint16_t CR3; + uint16_t RESERVED5; + __IO uint16_t GTPR; + uint16_t RESERVED6; +} USART_TypeDef; + +/** + * @brief Window WATCHDOG + */ + +typedef struct +{ + __IO uint32_t CR; + __IO uint32_t CFR; + __IO uint32_t SR; +} WWDG_TypeDef; + +/** + * @} + */ + +/** @addtogroup Peripheral_memory_map + * @{ + */ + + +#define FLASH_BASE ((uint32_t)0x08000000) /*!< FLASH base address in the alias region */ +#define SRAM_BASE ((uint32_t)0x20000000) /*!< SRAM base address in the alias region */ +#define PERIPH_BASE ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */ + +#define SRAM_BB_BASE ((uint32_t)0x22000000) /*!< SRAM base address in the bit-band region */ +#define PERIPH_BB_BASE ((uint32_t)0x42000000) /*!< Peripheral base address in the bit-band region */ + +#define FSMC_R_BASE ((uint32_t)0xA0000000) /*!< FSMC registers base address */ + +/*!< Peripheral memory map */ +#define APB1PERIPH_BASE PERIPH_BASE +#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000) +#define AHBPERIPH_BASE (PERIPH_BASE + 0x20000) + +#define TIM2_BASE (APB1PERIPH_BASE + 0x0000) +#define TIM3_BASE (APB1PERIPH_BASE + 0x0400) +#define TIM4_BASE (APB1PERIPH_BASE + 0x0800) +#define TIM5_BASE (APB1PERIPH_BASE + 0x0C00) +#define TIM6_BASE (APB1PERIPH_BASE + 0x1000) +#define TIM7_BASE (APB1PERIPH_BASE + 0x1400) +#define TIM12_BASE (APB1PERIPH_BASE + 0x1800) +#define TIM13_BASE (APB1PERIPH_BASE + 0x1C00) +#define TIM14_BASE (APB1PERIPH_BASE + 0x2000) +#define RTC_BASE (APB1PERIPH_BASE + 0x2800) +#define WWDG_BASE (APB1PERIPH_BASE + 0x2C00) +#define IWDG_BASE (APB1PERIPH_BASE + 0x3000) +#define SPI2_BASE (APB1PERIPH_BASE + 0x3800) +#define SPI3_BASE (APB1PERIPH_BASE + 0x3C00) +#define USART2_BASE (APB1PERIPH_BASE + 0x4400) +#define USART3_BASE (APB1PERIPH_BASE + 0x4800) +#define UART4_BASE (APB1PERIPH_BASE + 0x4C00) +#define UART5_BASE (APB1PERIPH_BASE + 0x5000) +#define I2C1_BASE (APB1PERIPH_BASE + 0x5400) +#define I2C2_BASE (APB1PERIPH_BASE + 0x5800) +#define CAN1_BASE (APB1PERIPH_BASE + 0x6400) +#define CAN2_BASE (APB1PERIPH_BASE + 0x6800) +#define BKP_BASE (APB1PERIPH_BASE + 0x6C00) +#define PWR_BASE (APB1PERIPH_BASE + 0x7000) +#define DAC_BASE (APB1PERIPH_BASE + 0x7400) +#define CEC_BASE (APB1PERIPH_BASE + 0x7800) + +#define AFIO_BASE (APB2PERIPH_BASE + 0x0000) +#define EXTI_BASE (APB2PERIPH_BASE + 0x0400) +#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800) +#define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00) +#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000) +#define GPIOD_BASE (APB2PERIPH_BASE + 0x1400) +#define GPIOE_BASE (APB2PERIPH_BASE + 0x1800) +#define GPIOF_BASE (APB2PERIPH_BASE + 0x1C00) +#define GPIOG_BASE (APB2PERIPH_BASE + 0x2000) +#define ADC1_BASE (APB2PERIPH_BASE + 0x2400) +#define ADC2_BASE (APB2PERIPH_BASE + 0x2800) +#define TIM1_BASE (APB2PERIPH_BASE + 0x2C00) +#define SPI1_BASE (APB2PERIPH_BASE + 0x3000) +#define TIM8_BASE (APB2PERIPH_BASE + 0x3400) +#define USART1_BASE (APB2PERIPH_BASE + 0x3800) +#define ADC3_BASE (APB2PERIPH_BASE + 0x3C00) +#define TIM15_BASE (APB2PERIPH_BASE + 0x4000) +#define TIM16_BASE (APB2PERIPH_BASE + 0x4400) +#define TIM17_BASE (APB2PERIPH_BASE + 0x4800) +#define TIM9_BASE (APB2PERIPH_BASE + 0x4C00) +#define TIM10_BASE (APB2PERIPH_BASE + 0x5000) +#define TIM11_BASE (APB2PERIPH_BASE + 0x5400) + +#define SDIO_BASE (PERIPH_BASE + 0x18000) + +#define DMA1_BASE (AHBPERIPH_BASE + 0x0000) +#define DMA1_Channel1_BASE (AHBPERIPH_BASE + 0x0008) +#define DMA1_Channel2_BASE (AHBPERIPH_BASE + 0x001C) +#define DMA1_Channel3_BASE (AHBPERIPH_BASE + 0x0030) +#define DMA1_Channel4_BASE (AHBPERIPH_BASE + 0x0044) +#define DMA1_Channel5_BASE (AHBPERIPH_BASE + 0x0058) +#define DMA1_Channel6_BASE (AHBPERIPH_BASE + 0x006C) +#define DMA1_Channel7_BASE (AHBPERIPH_BASE + 0x0080) +#define DMA2_BASE (AHBPERIPH_BASE + 0x0400) +#define DMA2_Channel1_BASE (AHBPERIPH_BASE + 0x0408) +#define DMA2_Channel2_BASE (AHBPERIPH_BASE + 0x041C) +#define DMA2_Channel3_BASE (AHBPERIPH_BASE + 0x0430) +#define DMA2_Channel4_BASE (AHBPERIPH_BASE + 0x0444) +#define DMA2_Channel5_BASE (AHBPERIPH_BASE + 0x0458) +#define RCC_BASE (AHBPERIPH_BASE + 0x1000) +#define CRC_BASE (AHBPERIPH_BASE + 0x3000) + +#define FLASH_R_BASE (AHBPERIPH_BASE + 0x2000) /*!< Flash registers base address */ +#define OB_BASE ((uint32_t)0x1FFFF800) /*!< Flash Option Bytes base address */ + +#define ETH_BASE (AHBPERIPH_BASE + 0x8000) +#define ETH_MAC_BASE (ETH_BASE) +#define ETH_MMC_BASE (ETH_BASE + 0x0100) +#define ETH_PTP_BASE (ETH_BASE + 0x0700) +#define ETH_DMA_BASE (ETH_BASE + 0x1000) + +#define FSMC_Bank1_R_BASE (FSMC_R_BASE + 0x0000) /*!< FSMC Bank1 registers base address */ +#define FSMC_Bank1E_R_BASE (FSMC_R_BASE + 0x0104) /*!< FSMC Bank1E registers base address */ +#define FSMC_Bank2_R_BASE (FSMC_R_BASE + 0x0060) /*!< FSMC Bank2 registers base address */ +#define FSMC_Bank3_R_BASE (FSMC_R_BASE + 0x0080) /*!< FSMC Bank3 registers base address */ +#define FSMC_Bank4_R_BASE (FSMC_R_BASE + 0x00A0) /*!< FSMC Bank4 registers base address */ + +#define DBGMCU_BASE ((uint32_t)0xE0042000) /*!< Debug MCU registers base address */ + +/** + * @} + */ + +/** @addtogroup Peripheral_declaration + * @{ + */ + +#define TIM2 ((TIM_TypeDef *) TIM2_BASE) +#define TIM3 ((TIM_TypeDef *) TIM3_BASE) +#define TIM4 ((TIM_TypeDef *) TIM4_BASE) +#define TIM5 ((TIM_TypeDef *) TIM5_BASE) +#define TIM6 ((TIM_TypeDef *) TIM6_BASE) +#define TIM7 ((TIM_TypeDef *) TIM7_BASE) +#define TIM12 ((TIM_TypeDef *) TIM12_BASE) +#define TIM13 ((TIM_TypeDef *) TIM13_BASE) +#define TIM14 ((TIM_TypeDef *) TIM14_BASE) +#define RTC ((RTC_TypeDef *) RTC_BASE) +#define WWDG ((WWDG_TypeDef *) WWDG_BASE) +#define IWDG ((IWDG_TypeDef *) IWDG_BASE) +#define SPI2 ((SPI_TypeDef *) SPI2_BASE) +#define SPI3 ((SPI_TypeDef *) SPI3_BASE) +#define USART2 ((USART_TypeDef *) USART2_BASE) +#define USART3 ((USART_TypeDef *) USART3_BASE) +#define UART4 ((USART_TypeDef *) UART4_BASE) +#define UART5 ((USART_TypeDef *) UART5_BASE) +#define I2C1 ((I2C_TypeDef *) I2C1_BASE) +#define I2C2 ((I2C_TypeDef *) I2C2_BASE) +#define CAN1 ((CAN_TypeDef *) CAN1_BASE) +#define CAN2 ((CAN_TypeDef *) CAN2_BASE) +#define BKP ((BKP_TypeDef *) BKP_BASE) +#define PWR ((PWR_TypeDef *) PWR_BASE) +#define DAC ((DAC_TypeDef *) DAC_BASE) +#define CEC ((CEC_TypeDef *) CEC_BASE) +#define AFIO ((AFIO_TypeDef *) AFIO_BASE) +#define EXTI ((EXTI_TypeDef *) EXTI_BASE) +#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) +#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE) +#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE) +#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE) +#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE) +#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE) +#define GPIOG ((GPIO_TypeDef *) GPIOG_BASE) +#define ADC1 ((ADC_TypeDef *) ADC1_BASE) +#define ADC2 ((ADC_TypeDef *) ADC2_BASE) +#define TIM1 ((TIM_TypeDef *) TIM1_BASE) +#define SPI1 ((SPI_TypeDef *) SPI1_BASE) +#define TIM8 ((TIM_TypeDef *) TIM8_BASE) +#define USART1 ((USART_TypeDef *) USART1_BASE) +#define ADC3 ((ADC_TypeDef *) ADC3_BASE) +#define TIM15 ((TIM_TypeDef *) TIM15_BASE) +#define TIM16 ((TIM_TypeDef *) TIM16_BASE) +#define TIM17 ((TIM_TypeDef *) TIM17_BASE) +#define TIM9 ((TIM_TypeDef *) TIM9_BASE) +#define TIM10 ((TIM_TypeDef *) TIM10_BASE) +#define TIM11 ((TIM_TypeDef *) TIM11_BASE) +#define SDIO ((SDIO_TypeDef *) SDIO_BASE) +#define DMA1 ((DMA_TypeDef *) DMA1_BASE) +#define DMA2 ((DMA_TypeDef *) DMA2_BASE) +#define DMA1_Channel1 ((DMA_Channel_TypeDef *) DMA1_Channel1_BASE) +#define DMA1_Channel2 ((DMA_Channel_TypeDef *) DMA1_Channel2_BASE) +#define DMA1_Channel3 ((DMA_Channel_TypeDef *) DMA1_Channel3_BASE) +#define DMA1_Channel4 ((DMA_Channel_TypeDef *) DMA1_Channel4_BASE) +#define DMA1_Channel5 ((DMA_Channel_TypeDef *) DMA1_Channel5_BASE) +#define DMA1_Channel6 ((DMA_Channel_TypeDef *) DMA1_Channel6_BASE) +#define DMA1_Channel7 ((DMA_Channel_TypeDef *) DMA1_Channel7_BASE) +#define DMA2_Channel1 ((DMA_Channel_TypeDef *) DMA2_Channel1_BASE) +#define DMA2_Channel2 ((DMA_Channel_TypeDef *) DMA2_Channel2_BASE) +#define DMA2_Channel3 ((DMA_Channel_TypeDef *) DMA2_Channel3_BASE) +#define DMA2_Channel4 ((DMA_Channel_TypeDef *) DMA2_Channel4_BASE) +#define DMA2_Channel5 ((DMA_Channel_TypeDef *) DMA2_Channel5_BASE) +#define RCC ((RCC_TypeDef *) RCC_BASE) +#define CRC ((CRC_TypeDef *) CRC_BASE) +#define FLASH ((FLASH_TypeDef *) FLASH_R_BASE) +#define OB ((OB_TypeDef *) OB_BASE) +#define ETH ((ETH_TypeDef *) ETH_BASE) +#define FSMC_Bank1 ((FSMC_Bank1_TypeDef *) FSMC_Bank1_R_BASE) +#define FSMC_Bank1E ((FSMC_Bank1E_TypeDef *) FSMC_Bank1E_R_BASE) +#define FSMC_Bank2 ((FSMC_Bank2_TypeDef *) FSMC_Bank2_R_BASE) +#define FSMC_Bank3 ((FSMC_Bank3_TypeDef *) FSMC_Bank3_R_BASE) +#define FSMC_Bank4 ((FSMC_Bank4_TypeDef *) FSMC_Bank4_R_BASE) +#define DBGMCU ((DBGMCU_TypeDef *) DBGMCU_BASE) + +/** + * @} + */ + +/** @addtogroup Exported_constants + * @{ + */ + + /** @addtogroup Peripheral_Registers_Bits_Definition + * @{ + */ + +/******************************************************************************/ +/* Peripheral Registers_Bits_Definition */ +/******************************************************************************/ + +/******************************************************************************/ +/* */ +/* CRC calculation unit */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for CRC_DR register *********************/ +#define CRC_DR_DR ((uint32_t)0xFFFFFFFF) /*!< Data register bits */ + + +/******************* Bit definition for CRC_IDR register ********************/ +#define CRC_IDR_IDR ((uint8_t)0xFF) /*!< General-purpose 8-bit data register bits */ + + +/******************** Bit definition for CRC_CR register ********************/ +#define CRC_CR_RESET ((uint8_t)0x01) /*!< RESET bit */ + +/******************************************************************************/ +/* */ +/* Power Control */ +/* */ +/******************************************************************************/ + +/******************** Bit definition for PWR_CR register ********************/ +#define PWR_CR_LPDS ((uint16_t)0x0001) /*!< Low-Power Deepsleep */ +#define PWR_CR_PDDS ((uint16_t)0x0002) /*!< Power Down Deepsleep */ +#define PWR_CR_CWUF ((uint16_t)0x0004) /*!< Clear Wakeup Flag */ +#define PWR_CR_CSBF ((uint16_t)0x0008) /*!< Clear Standby Flag */ +#define PWR_CR_PVDE ((uint16_t)0x0010) /*!< Power Voltage Detector Enable */ + +#define PWR_CR_PLS ((uint16_t)0x00E0) /*!< PLS[2:0] bits (PVD Level Selection) */ +#define PWR_CR_PLS_0 ((uint16_t)0x0020) /*!< Bit 0 */ +#define PWR_CR_PLS_1 ((uint16_t)0x0040) /*!< Bit 1 */ +#define PWR_CR_PLS_2 ((uint16_t)0x0080) /*!< Bit 2 */ + +/*!< PVD level configuration */ +#define PWR_CR_PLS_2V2 ((uint16_t)0x0000) /*!< PVD level 2.2V */ +#define PWR_CR_PLS_2V3 ((uint16_t)0x0020) /*!< PVD level 2.3V */ +#define PWR_CR_PLS_2V4 ((uint16_t)0x0040) /*!< PVD level 2.4V */ +#define PWR_CR_PLS_2V5 ((uint16_t)0x0060) /*!< PVD level 2.5V */ +#define PWR_CR_PLS_2V6 ((uint16_t)0x0080) /*!< PVD level 2.6V */ +#define PWR_CR_PLS_2V7 ((uint16_t)0x00A0) /*!< PVD level 2.7V */ +#define PWR_CR_PLS_2V8 ((uint16_t)0x00C0) /*!< PVD level 2.8V */ +#define PWR_CR_PLS_2V9 ((uint16_t)0x00E0) /*!< PVD level 2.9V */ + +#define PWR_CR_DBP ((uint16_t)0x0100) /*!< Disable Backup Domain write protection */ + + +/******************* Bit definition for PWR_CSR register ********************/ +#define PWR_CSR_WUF ((uint16_t)0x0001) /*!< Wakeup Flag */ +#define PWR_CSR_SBF ((uint16_t)0x0002) /*!< Standby Flag */ +#define PWR_CSR_PVDO ((uint16_t)0x0004) /*!< PVD Output */ +#define PWR_CSR_EWUP ((uint16_t)0x0100) /*!< Enable WKUP pin */ + +/******************************************************************************/ +/* */ +/* Backup registers */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for BKP_DR1 register ********************/ +#define BKP_DR1_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR2 register ********************/ +#define BKP_DR2_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR3 register ********************/ +#define BKP_DR3_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR4 register ********************/ +#define BKP_DR4_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR5 register ********************/ +#define BKP_DR5_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR6 register ********************/ +#define BKP_DR6_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR7 register ********************/ +#define BKP_DR7_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR8 register ********************/ +#define BKP_DR8_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR9 register ********************/ +#define BKP_DR9_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR10 register *******************/ +#define BKP_DR10_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR11 register *******************/ +#define BKP_DR11_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR12 register *******************/ +#define BKP_DR12_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR13 register *******************/ +#define BKP_DR13_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR14 register *******************/ +#define BKP_DR14_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR15 register *******************/ +#define BKP_DR15_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR16 register *******************/ +#define BKP_DR16_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR17 register *******************/ +#define BKP_DR17_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/****************** Bit definition for BKP_DR18 register ********************/ +#define BKP_DR18_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR19 register *******************/ +#define BKP_DR19_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR20 register *******************/ +#define BKP_DR20_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR21 register *******************/ +#define BKP_DR21_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR22 register *******************/ +#define BKP_DR22_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR23 register *******************/ +#define BKP_DR23_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR24 register *******************/ +#define BKP_DR24_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR25 register *******************/ +#define BKP_DR25_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR26 register *******************/ +#define BKP_DR26_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR27 register *******************/ +#define BKP_DR27_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR28 register *******************/ +#define BKP_DR28_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR29 register *******************/ +#define BKP_DR29_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR30 register *******************/ +#define BKP_DR30_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR31 register *******************/ +#define BKP_DR31_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR32 register *******************/ +#define BKP_DR32_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR33 register *******************/ +#define BKP_DR33_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR34 register *******************/ +#define BKP_DR34_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR35 register *******************/ +#define BKP_DR35_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR36 register *******************/ +#define BKP_DR36_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR37 register *******************/ +#define BKP_DR37_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR38 register *******************/ +#define BKP_DR38_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR39 register *******************/ +#define BKP_DR39_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR40 register *******************/ +#define BKP_DR40_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR41 register *******************/ +#define BKP_DR41_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR42 register *******************/ +#define BKP_DR42_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/****************** Bit definition for BKP_RTCCR register *******************/ +#define BKP_RTCCR_CAL ((uint16_t)0x007F) /*!< Calibration value */ +#define BKP_RTCCR_CCO ((uint16_t)0x0080) /*!< Calibration Clock Output */ +#define BKP_RTCCR_ASOE ((uint16_t)0x0100) /*!< Alarm or Second Output Enable */ +#define BKP_RTCCR_ASOS ((uint16_t)0x0200) /*!< Alarm or Second Output Selection */ + +/******************** Bit definition for BKP_CR register ********************/ +#define BKP_CR_TPE ((uint8_t)0x01) /*!< TAMPER pin enable */ +#define BKP_CR_TPAL ((uint8_t)0x02) /*!< TAMPER pin active level */ + +/******************* Bit definition for BKP_CSR register ********************/ +#define BKP_CSR_CTE ((uint16_t)0x0001) /*!< Clear Tamper event */ +#define BKP_CSR_CTI ((uint16_t)0x0002) /*!< Clear Tamper Interrupt */ +#define BKP_CSR_TPIE ((uint16_t)0x0004) /*!< TAMPER Pin interrupt enable */ +#define BKP_CSR_TEF ((uint16_t)0x0100) /*!< Tamper Event Flag */ +#define BKP_CSR_TIF ((uint16_t)0x0200) /*!< Tamper Interrupt Flag */ + +/******************************************************************************/ +/* */ +/* Reset and Clock Control */ +/* */ +/******************************************************************************/ + +/******************** Bit definition for RCC_CR register ********************/ +#define RCC_CR_HSION ((uint32_t)0x00000001) /*!< Internal High Speed clock enable */ +#define RCC_CR_HSIRDY ((uint32_t)0x00000002) /*!< Internal High Speed clock ready flag */ +#define RCC_CR_HSITRIM ((uint32_t)0x000000F8) /*!< Internal High Speed clock trimming */ +#define RCC_CR_HSICAL ((uint32_t)0x0000FF00) /*!< Internal High Speed clock Calibration */ +#define RCC_CR_HSEON ((uint32_t)0x00010000) /*!< External High Speed clock enable */ +#define RCC_CR_HSERDY ((uint32_t)0x00020000) /*!< External High Speed clock ready flag */ +#define RCC_CR_HSEBYP ((uint32_t)0x00040000) /*!< External High Speed clock Bypass */ +#define RCC_CR_CSSON ((uint32_t)0x00080000) /*!< Clock Security System enable */ +#define RCC_CR_PLLON ((uint32_t)0x01000000) /*!< PLL enable */ +#define RCC_CR_PLLRDY ((uint32_t)0x02000000) /*!< PLL clock ready flag */ + +#ifdef STM32F10X_CL + #define RCC_CR_PLL2ON ((uint32_t)0x04000000) /*!< PLL2 enable */ + #define RCC_CR_PLL2RDY ((uint32_t)0x08000000) /*!< PLL2 clock ready flag */ + #define RCC_CR_PLL3ON ((uint32_t)0x10000000) /*!< PLL3 enable */ + #define RCC_CR_PLL3RDY ((uint32_t)0x20000000) /*!< PLL3 clock ready flag */ +#endif /* STM32F10X_CL */ + +/******************* Bit definition for RCC_CFGR register *******************/ +/*!< SW configuration */ +#define RCC_CFGR_SW ((uint32_t)0x00000003) /*!< SW[1:0] bits (System clock Switch) */ +#define RCC_CFGR_SW_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define RCC_CFGR_SW_1 ((uint32_t)0x00000002) /*!< Bit 1 */ + +#define RCC_CFGR_SW_HSI ((uint32_t)0x00000000) /*!< HSI selected as system clock */ +#define RCC_CFGR_SW_HSE ((uint32_t)0x00000001) /*!< HSE selected as system clock */ +#define RCC_CFGR_SW_PLL ((uint32_t)0x00000002) /*!< PLL selected as system clock */ + +/*!< SWS configuration */ +#define RCC_CFGR_SWS ((uint32_t)0x0000000C) /*!< SWS[1:0] bits (System Clock Switch Status) */ +#define RCC_CFGR_SWS_0 ((uint32_t)0x00000004) /*!< Bit 0 */ +#define RCC_CFGR_SWS_1 ((uint32_t)0x00000008) /*!< Bit 1 */ + +#define RCC_CFGR_SWS_HSI ((uint32_t)0x00000000) /*!< HSI oscillator used as system clock */ +#define RCC_CFGR_SWS_HSE ((uint32_t)0x00000004) /*!< HSE oscillator used as system clock */ +#define RCC_CFGR_SWS_PLL ((uint32_t)0x00000008) /*!< PLL used as system clock */ + +/*!< HPRE configuration */ +#define RCC_CFGR_HPRE ((uint32_t)0x000000F0) /*!< HPRE[3:0] bits (AHB prescaler) */ +#define RCC_CFGR_HPRE_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define RCC_CFGR_HPRE_1 ((uint32_t)0x00000020) /*!< Bit 1 */ +#define RCC_CFGR_HPRE_2 ((uint32_t)0x00000040) /*!< Bit 2 */ +#define RCC_CFGR_HPRE_3 ((uint32_t)0x00000080) /*!< Bit 3 */ + +#define RCC_CFGR_HPRE_DIV1 ((uint32_t)0x00000000) /*!< SYSCLK not divided */ +#define RCC_CFGR_HPRE_DIV2 ((uint32_t)0x00000080) /*!< SYSCLK divided by 2 */ +#define RCC_CFGR_HPRE_DIV4 ((uint32_t)0x00000090) /*!< SYSCLK divided by 4 */ +#define RCC_CFGR_HPRE_DIV8 ((uint32_t)0x000000A0) /*!< SYSCLK divided by 8 */ +#define RCC_CFGR_HPRE_DIV16 ((uint32_t)0x000000B0) /*!< SYSCLK divided by 16 */ +#define RCC_CFGR_HPRE_DIV64 ((uint32_t)0x000000C0) /*!< SYSCLK divided by 64 */ +#define RCC_CFGR_HPRE_DIV128 ((uint32_t)0x000000D0) /*!< SYSCLK divided by 128 */ +#define RCC_CFGR_HPRE_DIV256 ((uint32_t)0x000000E0) /*!< SYSCLK divided by 256 */ +#define RCC_CFGR_HPRE_DIV512 ((uint32_t)0x000000F0) /*!< SYSCLK divided by 512 */ + +/*!< PPRE1 configuration */ +#define RCC_CFGR_PPRE1 ((uint32_t)0x00000700) /*!< PRE1[2:0] bits (APB1 prescaler) */ +#define RCC_CFGR_PPRE1_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define RCC_CFGR_PPRE1_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define RCC_CFGR_PPRE1_2 ((uint32_t)0x00000400) /*!< Bit 2 */ + +#define RCC_CFGR_PPRE1_DIV1 ((uint32_t)0x00000000) /*!< HCLK not divided */ +#define RCC_CFGR_PPRE1_DIV2 ((uint32_t)0x00000400) /*!< HCLK divided by 2 */ +#define RCC_CFGR_PPRE1_DIV4 ((uint32_t)0x00000500) /*!< HCLK divided by 4 */ +#define RCC_CFGR_PPRE1_DIV8 ((uint32_t)0x00000600) /*!< HCLK divided by 8 */ +#define RCC_CFGR_PPRE1_DIV16 ((uint32_t)0x00000700) /*!< HCLK divided by 16 */ + +/*!< PPRE2 configuration */ +#define RCC_CFGR_PPRE2 ((uint32_t)0x00003800) /*!< PRE2[2:0] bits (APB2 prescaler) */ +#define RCC_CFGR_PPRE2_0 ((uint32_t)0x00000800) /*!< Bit 0 */ +#define RCC_CFGR_PPRE2_1 ((uint32_t)0x00001000) /*!< Bit 1 */ +#define RCC_CFGR_PPRE2_2 ((uint32_t)0x00002000) /*!< Bit 2 */ + +#define RCC_CFGR_PPRE2_DIV1 ((uint32_t)0x00000000) /*!< HCLK not divided */ +#define RCC_CFGR_PPRE2_DIV2 ((uint32_t)0x00002000) /*!< HCLK divided by 2 */ +#define RCC_CFGR_PPRE2_DIV4 ((uint32_t)0x00002800) /*!< HCLK divided by 4 */ +#define RCC_CFGR_PPRE2_DIV8 ((uint32_t)0x00003000) /*!< HCLK divided by 8 */ +#define RCC_CFGR_PPRE2_DIV16 ((uint32_t)0x00003800) /*!< HCLK divided by 16 */ + +/*!< ADCPPRE configuration */ +#define RCC_CFGR_ADCPRE ((uint32_t)0x0000C000) /*!< ADCPRE[1:0] bits (ADC prescaler) */ +#define RCC_CFGR_ADCPRE_0 ((uint32_t)0x00004000) /*!< Bit 0 */ +#define RCC_CFGR_ADCPRE_1 ((uint32_t)0x00008000) /*!< Bit 1 */ + +#define RCC_CFGR_ADCPRE_DIV2 ((uint32_t)0x00000000) /*!< PCLK2 divided by 2 */ +#define RCC_CFGR_ADCPRE_DIV4 ((uint32_t)0x00004000) /*!< PCLK2 divided by 4 */ +#define RCC_CFGR_ADCPRE_DIV6 ((uint32_t)0x00008000) /*!< PCLK2 divided by 6 */ +#define RCC_CFGR_ADCPRE_DIV8 ((uint32_t)0x0000C000) /*!< PCLK2 divided by 8 */ + +#define RCC_CFGR_PLLSRC ((uint32_t)0x00010000) /*!< PLL entry clock source */ + +#define RCC_CFGR_PLLXTPRE ((uint32_t)0x00020000) /*!< HSE divider for PLL entry */ + +/*!< PLLMUL configuration */ +#define RCC_CFGR_PLLMULL ((uint32_t)0x003C0000) /*!< PLLMUL[3:0] bits (PLL multiplication factor) */ +#define RCC_CFGR_PLLMULL_0 ((uint32_t)0x00040000) /*!< Bit 0 */ +#define RCC_CFGR_PLLMULL_1 ((uint32_t)0x00080000) /*!< Bit 1 */ +#define RCC_CFGR_PLLMULL_2 ((uint32_t)0x00100000) /*!< Bit 2 */ +#define RCC_CFGR_PLLMULL_3 ((uint32_t)0x00200000) /*!< Bit 3 */ + +#ifdef STM32F10X_CL + #define RCC_CFGR_PLLSRC_HSI_Div2 ((uint32_t)0x00000000) /*!< HSI clock divided by 2 selected as PLL entry clock source */ + #define RCC_CFGR_PLLSRC_PREDIV1 ((uint32_t)0x00010000) /*!< PREDIV1 clock selected as PLL entry clock source */ + + #define RCC_CFGR_PLLXTPRE_PREDIV1 ((uint32_t)0x00000000) /*!< PREDIV1 clock not divided for PLL entry */ + #define RCC_CFGR_PLLXTPRE_PREDIV1_Div2 ((uint32_t)0x00020000) /*!< PREDIV1 clock divided by 2 for PLL entry */ + + #define RCC_CFGR_PLLMULL4 ((uint32_t)0x00080000) /*!< PLL input clock * 4 */ + #define RCC_CFGR_PLLMULL5 ((uint32_t)0x000C0000) /*!< PLL input clock * 5 */ + #define RCC_CFGR_PLLMULL6 ((uint32_t)0x00100000) /*!< PLL input clock * 6 */ + #define RCC_CFGR_PLLMULL7 ((uint32_t)0x00140000) /*!< PLL input clock * 7 */ + #define RCC_CFGR_PLLMULL8 ((uint32_t)0x00180000) /*!< PLL input clock * 8 */ + #define RCC_CFGR_PLLMULL9 ((uint32_t)0x001C0000) /*!< PLL input clock * 9 */ + #define RCC_CFGR_PLLMULL6_5 ((uint32_t)0x00340000) /*!< PLL input clock * 6.5 */ + + #define RCC_CFGR_OTGFSPRE ((uint32_t)0x00400000) /*!< USB OTG FS prescaler */ + +/*!< MCO configuration */ + #define RCC_CFGR_MCO ((uint32_t)0x0F000000) /*!< MCO[3:0] bits (Microcontroller Clock Output) */ + #define RCC_CFGR_MCO_0 ((uint32_t)0x01000000) /*!< Bit 0 */ + #define RCC_CFGR_MCO_1 ((uint32_t)0x02000000) /*!< Bit 1 */ + #define RCC_CFGR_MCO_2 ((uint32_t)0x04000000) /*!< Bit 2 */ + #define RCC_CFGR_MCO_3 ((uint32_t)0x08000000) /*!< Bit 3 */ + + #define RCC_CFGR_MCO_NOCLOCK ((uint32_t)0x00000000) /*!< No clock */ + #define RCC_CFGR_MCO_SYSCLK ((uint32_t)0x04000000) /*!< System clock selected as MCO source */ + #define RCC_CFGR_MCO_HSI ((uint32_t)0x05000000) /*!< HSI clock selected as MCO source */ + #define RCC_CFGR_MCO_HSE ((uint32_t)0x06000000) /*!< HSE clock selected as MCO source */ + #define RCC_CFGR_MCO_PLLCLK_Div2 ((uint32_t)0x07000000) /*!< PLL clock divided by 2 selected as MCO source */ + #define RCC_CFGR_MCO_PLL2CLK ((uint32_t)0x08000000) /*!< PLL2 clock selected as MCO source*/ + #define RCC_CFGR_MCO_PLL3CLK_Div2 ((uint32_t)0x09000000) /*!< PLL3 clock divided by 2 selected as MCO source*/ + #define RCC_CFGR_MCO_Ext_HSE ((uint32_t)0x0A000000) /*!< XT1 external 3-25 MHz oscillator clock selected as MCO source */ + #define RCC_CFGR_MCO_PLL3CLK ((uint32_t)0x0B000000) /*!< PLL3 clock selected as MCO source */ +#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) + #define RCC_CFGR_PLLSRC_HSI_Div2 ((uint32_t)0x00000000) /*!< HSI clock divided by 2 selected as PLL entry clock source */ + #define RCC_CFGR_PLLSRC_PREDIV1 ((uint32_t)0x00010000) /*!< PREDIV1 clock selected as PLL entry clock source */ + + #define RCC_CFGR_PLLXTPRE_PREDIV1 ((uint32_t)0x00000000) /*!< PREDIV1 clock not divided for PLL entry */ + #define RCC_CFGR_PLLXTPRE_PREDIV1_Div2 ((uint32_t)0x00020000) /*!< PREDIV1 clock divided by 2 for PLL entry */ + + #define RCC_CFGR_PLLMULL2 ((uint32_t)0x00000000) /*!< PLL input clock*2 */ + #define RCC_CFGR_PLLMULL3 ((uint32_t)0x00040000) /*!< PLL input clock*3 */ + #define RCC_CFGR_PLLMULL4 ((uint32_t)0x00080000) /*!< PLL input clock*4 */ + #define RCC_CFGR_PLLMULL5 ((uint32_t)0x000C0000) /*!< PLL input clock*5 */ + #define RCC_CFGR_PLLMULL6 ((uint32_t)0x00100000) /*!< PLL input clock*6 */ + #define RCC_CFGR_PLLMULL7 ((uint32_t)0x00140000) /*!< PLL input clock*7 */ + #define RCC_CFGR_PLLMULL8 ((uint32_t)0x00180000) /*!< PLL input clock*8 */ + #define RCC_CFGR_PLLMULL9 ((uint32_t)0x001C0000) /*!< PLL input clock*9 */ + #define RCC_CFGR_PLLMULL10 ((uint32_t)0x00200000) /*!< PLL input clock10 */ + #define RCC_CFGR_PLLMULL11 ((uint32_t)0x00240000) /*!< PLL input clock*11 */ + #define RCC_CFGR_PLLMULL12 ((uint32_t)0x00280000) /*!< PLL input clock*12 */ + #define RCC_CFGR_PLLMULL13 ((uint32_t)0x002C0000) /*!< PLL input clock*13 */ + #define RCC_CFGR_PLLMULL14 ((uint32_t)0x00300000) /*!< PLL input clock*14 */ + #define RCC_CFGR_PLLMULL15 ((uint32_t)0x00340000) /*!< PLL input clock*15 */ + #define RCC_CFGR_PLLMULL16 ((uint32_t)0x00380000) /*!< PLL input clock*16 */ + +/*!< MCO configuration */ + #define RCC_CFGR_MCO ((uint32_t)0x07000000) /*!< MCO[2:0] bits (Microcontroller Clock Output) */ + #define RCC_CFGR_MCO_0 ((uint32_t)0x01000000) /*!< Bit 0 */ + #define RCC_CFGR_MCO_1 ((uint32_t)0x02000000) /*!< Bit 1 */ + #define RCC_CFGR_MCO_2 ((uint32_t)0x04000000) /*!< Bit 2 */ + + #define RCC_CFGR_MCO_NOCLOCK ((uint32_t)0x00000000) /*!< No clock */ + #define RCC_CFGR_MCO_SYSCLK ((uint32_t)0x04000000) /*!< System clock selected as MCO source */ + #define RCC_CFGR_MCO_HSI ((uint32_t)0x05000000) /*!< HSI clock selected as MCO source */ + #define RCC_CFGR_MCO_HSE ((uint32_t)0x06000000) /*!< HSE clock selected as MCO source */ + #define RCC_CFGR_MCO_PLL ((uint32_t)0x07000000) /*!< PLL clock divided by 2 selected as MCO source */ +#else + #define RCC_CFGR_PLLSRC_HSI_Div2 ((uint32_t)0x00000000) /*!< HSI clock divided by 2 selected as PLL entry clock source */ + #define RCC_CFGR_PLLSRC_HSE ((uint32_t)0x00010000) /*!< HSE clock selected as PLL entry clock source */ + + #define RCC_CFGR_PLLXTPRE_HSE ((uint32_t)0x00000000) /*!< HSE clock not divided for PLL entry */ + #define RCC_CFGR_PLLXTPRE_HSE_Div2 ((uint32_t)0x00020000) /*!< HSE clock divided by 2 for PLL entry */ + + #define RCC_CFGR_PLLMULL2 ((uint32_t)0x00000000) /*!< PLL input clock*2 */ + #define RCC_CFGR_PLLMULL3 ((uint32_t)0x00040000) /*!< PLL input clock*3 */ + #define RCC_CFGR_PLLMULL4 ((uint32_t)0x00080000) /*!< PLL input clock*4 */ + #define RCC_CFGR_PLLMULL5 ((uint32_t)0x000C0000) /*!< PLL input clock*5 */ + #define RCC_CFGR_PLLMULL6 ((uint32_t)0x00100000) /*!< PLL input clock*6 */ + #define RCC_CFGR_PLLMULL7 ((uint32_t)0x00140000) /*!< PLL input clock*7 */ + #define RCC_CFGR_PLLMULL8 ((uint32_t)0x00180000) /*!< PLL input clock*8 */ + #define RCC_CFGR_PLLMULL9 ((uint32_t)0x001C0000) /*!< PLL input clock*9 */ + #define RCC_CFGR_PLLMULL10 ((uint32_t)0x00200000) /*!< PLL input clock10 */ + #define RCC_CFGR_PLLMULL11 ((uint32_t)0x00240000) /*!< PLL input clock*11 */ + #define RCC_CFGR_PLLMULL12 ((uint32_t)0x00280000) /*!< PLL input clock*12 */ + #define RCC_CFGR_PLLMULL13 ((uint32_t)0x002C0000) /*!< PLL input clock*13 */ + #define RCC_CFGR_PLLMULL14 ((uint32_t)0x00300000) /*!< PLL input clock*14 */ + #define RCC_CFGR_PLLMULL15 ((uint32_t)0x00340000) /*!< PLL input clock*15 */ + #define RCC_CFGR_PLLMULL16 ((uint32_t)0x00380000) /*!< PLL input clock*16 */ + #define RCC_CFGR_USBPRE ((uint32_t)0x00400000) /*!< USB Device prescaler */ + +/*!< MCO configuration */ + #define RCC_CFGR_MCO ((uint32_t)0x07000000) /*!< MCO[2:0] bits (Microcontroller Clock Output) */ + #define RCC_CFGR_MCO_0 ((uint32_t)0x01000000) /*!< Bit 0 */ + #define RCC_CFGR_MCO_1 ((uint32_t)0x02000000) /*!< Bit 1 */ + #define RCC_CFGR_MCO_2 ((uint32_t)0x04000000) /*!< Bit 2 */ + + #define RCC_CFGR_MCO_NOCLOCK ((uint32_t)0x00000000) /*!< No clock */ + #define RCC_CFGR_MCO_SYSCLK ((uint32_t)0x04000000) /*!< System clock selected as MCO source */ + #define RCC_CFGR_MCO_HSI ((uint32_t)0x05000000) /*!< HSI clock selected as MCO source */ + #define RCC_CFGR_MCO_HSE ((uint32_t)0x06000000) /*!< HSE clock selected as MCO source */ + #define RCC_CFGR_MCO_PLL ((uint32_t)0x07000000) /*!< PLL clock divided by 2 selected as MCO source */ +#endif /* STM32F10X_CL */ + +/*!<****************** Bit definition for RCC_CIR register ********************/ +#define RCC_CIR_LSIRDYF ((uint32_t)0x00000001) /*!< LSI Ready Interrupt flag */ +#define RCC_CIR_LSERDYF ((uint32_t)0x00000002) /*!< LSE Ready Interrupt flag */ +#define RCC_CIR_HSIRDYF ((uint32_t)0x00000004) /*!< HSI Ready Interrupt flag */ +#define RCC_CIR_HSERDYF ((uint32_t)0x00000008) /*!< HSE Ready Interrupt flag */ +#define RCC_CIR_PLLRDYF ((uint32_t)0x00000010) /*!< PLL Ready Interrupt flag */ +#define RCC_CIR_CSSF ((uint32_t)0x00000080) /*!< Clock Security System Interrupt flag */ +#define RCC_CIR_LSIRDYIE ((uint32_t)0x00000100) /*!< LSI Ready Interrupt Enable */ +#define RCC_CIR_LSERDYIE ((uint32_t)0x00000200) /*!< LSE Ready Interrupt Enable */ +#define RCC_CIR_HSIRDYIE ((uint32_t)0x00000400) /*!< HSI Ready Interrupt Enable */ +#define RCC_CIR_HSERDYIE ((uint32_t)0x00000800) /*!< HSE Ready Interrupt Enable */ +#define RCC_CIR_PLLRDYIE ((uint32_t)0x00001000) /*!< PLL Ready Interrupt Enable */ +#define RCC_CIR_LSIRDYC ((uint32_t)0x00010000) /*!< LSI Ready Interrupt Clear */ +#define RCC_CIR_LSERDYC ((uint32_t)0x00020000) /*!< LSE Ready Interrupt Clear */ +#define RCC_CIR_HSIRDYC ((uint32_t)0x00040000) /*!< HSI Ready Interrupt Clear */ +#define RCC_CIR_HSERDYC ((uint32_t)0x00080000) /*!< HSE Ready Interrupt Clear */ +#define RCC_CIR_PLLRDYC ((uint32_t)0x00100000) /*!< PLL Ready Interrupt Clear */ +#define RCC_CIR_CSSC ((uint32_t)0x00800000) /*!< Clock Security System Interrupt Clear */ + +#ifdef STM32F10X_CL + #define RCC_CIR_PLL2RDYF ((uint32_t)0x00000020) /*!< PLL2 Ready Interrupt flag */ + #define RCC_CIR_PLL3RDYF ((uint32_t)0x00000040) /*!< PLL3 Ready Interrupt flag */ + #define RCC_CIR_PLL2RDYIE ((uint32_t)0x00002000) /*!< PLL2 Ready Interrupt Enable */ + #define RCC_CIR_PLL3RDYIE ((uint32_t)0x00004000) /*!< PLL3 Ready Interrupt Enable */ + #define RCC_CIR_PLL2RDYC ((uint32_t)0x00200000) /*!< PLL2 Ready Interrupt Clear */ + #define RCC_CIR_PLL3RDYC ((uint32_t)0x00400000) /*!< PLL3 Ready Interrupt Clear */ +#endif /* STM32F10X_CL */ + +/***************** Bit definition for RCC_APB2RSTR register *****************/ +#define RCC_APB2RSTR_AFIORST ((uint32_t)0x00000001) /*!< Alternate Function I/O reset */ +#define RCC_APB2RSTR_IOPARST ((uint32_t)0x00000004) /*!< I/O port A reset */ +#define RCC_APB2RSTR_IOPBRST ((uint32_t)0x00000008) /*!< I/O port B reset */ +#define RCC_APB2RSTR_IOPCRST ((uint32_t)0x00000010) /*!< I/O port C reset */ +#define RCC_APB2RSTR_IOPDRST ((uint32_t)0x00000020) /*!< I/O port D reset */ +#define RCC_APB2RSTR_ADC1RST ((uint32_t)0x00000200) /*!< ADC 1 interface reset */ + +#if !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD_VL) +#define RCC_APB2RSTR_ADC2RST ((uint32_t)0x00000400) /*!< ADC 2 interface reset */ +#endif + +#define RCC_APB2RSTR_TIM1RST ((uint32_t)0x00000800) /*!< TIM1 Timer reset */ +#define RCC_APB2RSTR_SPI1RST ((uint32_t)0x00001000) /*!< SPI 1 reset */ +#define RCC_APB2RSTR_USART1RST ((uint32_t)0x00004000) /*!< USART1 reset */ + +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) +#define RCC_APB2RSTR_TIM15RST ((uint32_t)0x00010000) /*!< TIM15 Timer reset */ +#define RCC_APB2RSTR_TIM16RST ((uint32_t)0x00020000) /*!< TIM16 Timer reset */ +#define RCC_APB2RSTR_TIM17RST ((uint32_t)0x00040000) /*!< TIM17 Timer reset */ +#endif + +#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) + #define RCC_APB2RSTR_IOPERST ((uint32_t)0x00000040) /*!< I/O port E reset */ +#endif /* STM32F10X_LD && STM32F10X_LD_VL */ + +#if defined (STM32F10X_HD) || defined (STM32F10X_XL) + #define RCC_APB2RSTR_IOPFRST ((uint32_t)0x00000080) /*!< I/O port F reset */ + #define RCC_APB2RSTR_IOPGRST ((uint32_t)0x00000100) /*!< I/O port G reset */ + #define RCC_APB2RSTR_TIM8RST ((uint32_t)0x00002000) /*!< TIM8 Timer reset */ + #define RCC_APB2RSTR_ADC3RST ((uint32_t)0x00008000) /*!< ADC3 interface reset */ +#endif + +#if defined (STM32F10X_HD_VL) + #define RCC_APB2RSTR_IOPFRST ((uint32_t)0x00000080) /*!< I/O port F reset */ + #define RCC_APB2RSTR_IOPGRST ((uint32_t)0x00000100) /*!< I/O port G reset */ +#endif + +#ifdef STM32F10X_XL + #define RCC_APB2RSTR_TIM9RST ((uint32_t)0x00080000) /*!< TIM9 Timer reset */ + #define RCC_APB2RSTR_TIM10RST ((uint32_t)0x00100000) /*!< TIM10 Timer reset */ + #define RCC_APB2RSTR_TIM11RST ((uint32_t)0x00200000) /*!< TIM11 Timer reset */ +#endif /* STM32F10X_XL */ + +/***************** Bit definition for RCC_APB1RSTR register *****************/ +#define RCC_APB1RSTR_TIM2RST ((uint32_t)0x00000001) /*!< Timer 2 reset */ +#define RCC_APB1RSTR_TIM3RST ((uint32_t)0x00000002) /*!< Timer 3 reset */ +#define RCC_APB1RSTR_WWDGRST ((uint32_t)0x00000800) /*!< Window Watchdog reset */ +#define RCC_APB1RSTR_USART2RST ((uint32_t)0x00020000) /*!< USART 2 reset */ +#define RCC_APB1RSTR_I2C1RST ((uint32_t)0x00200000) /*!< I2C 1 reset */ + +#if !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD_VL) +#define RCC_APB1RSTR_CAN1RST ((uint32_t)0x02000000) /*!< CAN1 reset */ +#endif + +#define RCC_APB1RSTR_BKPRST ((uint32_t)0x08000000) /*!< Backup interface reset */ +#define RCC_APB1RSTR_PWRRST ((uint32_t)0x10000000) /*!< Power interface reset */ + +#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) + #define RCC_APB1RSTR_TIM4RST ((uint32_t)0x00000004) /*!< Timer 4 reset */ + #define RCC_APB1RSTR_SPI2RST ((uint32_t)0x00004000) /*!< SPI 2 reset */ + #define RCC_APB1RSTR_USART3RST ((uint32_t)0x00040000) /*!< USART 3 reset */ + #define RCC_APB1RSTR_I2C2RST ((uint32_t)0x00400000) /*!< I2C 2 reset */ +#endif /* STM32F10X_LD && STM32F10X_LD_VL */ + +#if defined (STM32F10X_HD) || defined (STM32F10X_MD) || defined (STM32F10X_LD) || defined (STM32F10X_XL) + #define RCC_APB1RSTR_USBRST ((uint32_t)0x00800000) /*!< USB Device reset */ +#endif + +#if defined (STM32F10X_HD) || defined (STM32F10X_CL) || defined (STM32F10X_XL) + #define RCC_APB1RSTR_TIM5RST ((uint32_t)0x00000008) /*!< Timer 5 reset */ + #define RCC_APB1RSTR_TIM6RST ((uint32_t)0x00000010) /*!< Timer 6 reset */ + #define RCC_APB1RSTR_TIM7RST ((uint32_t)0x00000020) /*!< Timer 7 reset */ + #define RCC_APB1RSTR_SPI3RST ((uint32_t)0x00008000) /*!< SPI 3 reset */ + #define RCC_APB1RSTR_UART4RST ((uint32_t)0x00080000) /*!< UART 4 reset */ + #define RCC_APB1RSTR_UART5RST ((uint32_t)0x00100000) /*!< UART 5 reset */ + #define RCC_APB1RSTR_DACRST ((uint32_t)0x20000000) /*!< DAC interface reset */ +#endif + +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) + #define RCC_APB1RSTR_TIM6RST ((uint32_t)0x00000010) /*!< Timer 6 reset */ + #define RCC_APB1RSTR_TIM7RST ((uint32_t)0x00000020) /*!< Timer 7 reset */ + #define RCC_APB1RSTR_DACRST ((uint32_t)0x20000000) /*!< DAC interface reset */ + #define RCC_APB1RSTR_CECRST ((uint32_t)0x40000000) /*!< CEC interface reset */ +#endif + +#if defined (STM32F10X_HD_VL) + #define RCC_APB1RSTR_TIM5RST ((uint32_t)0x00000008) /*!< Timer 5 reset */ + #define RCC_APB1RSTR_TIM12RST ((uint32_t)0x00000040) /*!< TIM12 Timer reset */ + #define RCC_APB1RSTR_TIM13RST ((uint32_t)0x00000080) /*!< TIM13 Timer reset */ + #define RCC_APB1RSTR_TIM14RST ((uint32_t)0x00000100) /*!< TIM14 Timer reset */ + #define RCC_APB1RSTR_SPI3RST ((uint32_t)0x00008000) /*!< SPI 3 reset */ + #define RCC_APB1RSTR_UART4RST ((uint32_t)0x00080000) /*!< UART 4 reset */ + #define RCC_APB1RSTR_UART5RST ((uint32_t)0x00100000) /*!< UART 5 reset */ +#endif + +#ifdef STM32F10X_CL + #define RCC_APB1RSTR_CAN2RST ((uint32_t)0x04000000) /*!< CAN2 reset */ +#endif /* STM32F10X_CL */ + +#ifdef STM32F10X_XL + #define RCC_APB1RSTR_TIM12RST ((uint32_t)0x00000040) /*!< TIM12 Timer reset */ + #define RCC_APB1RSTR_TIM13RST ((uint32_t)0x00000080) /*!< TIM13 Timer reset */ + #define RCC_APB1RSTR_TIM14RST ((uint32_t)0x00000100) /*!< TIM14 Timer reset */ +#endif /* STM32F10X_XL */ + +/****************** Bit definition for RCC_AHBENR register ******************/ +#define RCC_AHBENR_DMA1EN ((uint16_t)0x0001) /*!< DMA1 clock enable */ +#define RCC_AHBENR_SRAMEN ((uint16_t)0x0004) /*!< SRAM interface clock enable */ +#define RCC_AHBENR_FLITFEN ((uint16_t)0x0010) /*!< FLITF clock enable */ +#define RCC_AHBENR_CRCEN ((uint16_t)0x0040) /*!< CRC clock enable */ + +#if defined (STM32F10X_HD) || defined (STM32F10X_CL) || defined (STM32F10X_HD_VL) + #define RCC_AHBENR_DMA2EN ((uint16_t)0x0002) /*!< DMA2 clock enable */ +#endif + +#if defined (STM32F10X_HD) || defined (STM32F10X_XL) + #define RCC_AHBENR_FSMCEN ((uint16_t)0x0100) /*!< FSMC clock enable */ + #define RCC_AHBENR_SDIOEN ((uint16_t)0x0400) /*!< SDIO clock enable */ +#endif + +#if defined (STM32F10X_HD_VL) + #define RCC_AHBENR_FSMCEN ((uint16_t)0x0100) /*!< FSMC clock enable */ +#endif + +#ifdef STM32F10X_CL + #define RCC_AHBENR_OTGFSEN ((uint32_t)0x00001000) /*!< USB OTG FS clock enable */ + #define RCC_AHBENR_ETHMACEN ((uint32_t)0x00004000) /*!< ETHERNET MAC clock enable */ + #define RCC_AHBENR_ETHMACTXEN ((uint32_t)0x00008000) /*!< ETHERNET MAC Tx clock enable */ + #define RCC_AHBENR_ETHMACRXEN ((uint32_t)0x00010000) /*!< ETHERNET MAC Rx clock enable */ +#endif /* STM32F10X_CL */ + +/****************** Bit definition for RCC_APB2ENR register *****************/ +#define RCC_APB2ENR_AFIOEN ((uint32_t)0x00000001) /*!< Alternate Function I/O clock enable */ +#define RCC_APB2ENR_IOPAEN ((uint32_t)0x00000004) /*!< I/O port A clock enable */ +#define RCC_APB2ENR_IOPBEN ((uint32_t)0x00000008) /*!< I/O port B clock enable */ +#define RCC_APB2ENR_IOPCEN ((uint32_t)0x00000010) /*!< I/O port C clock enable */ +#define RCC_APB2ENR_IOPDEN ((uint32_t)0x00000020) /*!< I/O port D clock enable */ +#define RCC_APB2ENR_ADC1EN ((uint32_t)0x00000200) /*!< ADC 1 interface clock enable */ + +#if !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD_VL) +#define RCC_APB2ENR_ADC2EN ((uint32_t)0x00000400) /*!< ADC 2 interface clock enable */ +#endif + +#define RCC_APB2ENR_TIM1EN ((uint32_t)0x00000800) /*!< TIM1 Timer clock enable */ +#define RCC_APB2ENR_SPI1EN ((uint32_t)0x00001000) /*!< SPI 1 clock enable */ +#define RCC_APB2ENR_USART1EN ((uint32_t)0x00004000) /*!< USART1 clock enable */ + +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) +#define RCC_APB2ENR_TIM15EN ((uint32_t)0x00010000) /*!< TIM15 Timer clock enable */ +#define RCC_APB2ENR_TIM16EN ((uint32_t)0x00020000) /*!< TIM16 Timer clock enable */ +#define RCC_APB2ENR_TIM17EN ((uint32_t)0x00040000) /*!< TIM17 Timer clock enable */ +#endif + +#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) + #define RCC_APB2ENR_IOPEEN ((uint32_t)0x00000040) /*!< I/O port E clock enable */ +#endif /* STM32F10X_LD && STM32F10X_LD_VL */ + +#if defined (STM32F10X_HD) || defined (STM32F10X_XL) + #define RCC_APB2ENR_IOPFEN ((uint32_t)0x00000080) /*!< I/O port F clock enable */ + #define RCC_APB2ENR_IOPGEN ((uint32_t)0x00000100) /*!< I/O port G clock enable */ + #define RCC_APB2ENR_TIM8EN ((uint32_t)0x00002000) /*!< TIM8 Timer clock enable */ + #define RCC_APB2ENR_ADC3EN ((uint32_t)0x00008000) /*!< DMA1 clock enable */ +#endif + +#if defined (STM32F10X_HD_VL) + #define RCC_APB2ENR_IOPFEN ((uint32_t)0x00000080) /*!< I/O port F clock enable */ + #define RCC_APB2ENR_IOPGEN ((uint32_t)0x00000100) /*!< I/O port G clock enable */ +#endif + +#ifdef STM32F10X_XL + #define RCC_APB2ENR_TIM9EN ((uint32_t)0x00080000) /*!< TIM9 Timer clock enable */ + #define RCC_APB2ENR_TIM10EN ((uint32_t)0x00100000) /*!< TIM10 Timer clock enable */ + #define RCC_APB2ENR_TIM11EN ((uint32_t)0x00200000) /*!< TIM11 Timer clock enable */ +#endif + +/***************** Bit definition for RCC_APB1ENR register ******************/ +#define RCC_APB1ENR_TIM2EN ((uint32_t)0x00000001) /*!< Timer 2 clock enabled*/ +#define RCC_APB1ENR_TIM3EN ((uint32_t)0x00000002) /*!< Timer 3 clock enable */ +#define RCC_APB1ENR_WWDGEN ((uint32_t)0x00000800) /*!< Window Watchdog clock enable */ +#define RCC_APB1ENR_USART2EN ((uint32_t)0x00020000) /*!< USART 2 clock enable */ +#define RCC_APB1ENR_I2C1EN ((uint32_t)0x00200000) /*!< I2C 1 clock enable */ + +#if !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD_VL) +#define RCC_APB1ENR_CAN1EN ((uint32_t)0x02000000) /*!< CAN1 clock enable */ +#endif + +#define RCC_APB1ENR_BKPEN ((uint32_t)0x08000000) /*!< Backup interface clock enable */ +#define RCC_APB1ENR_PWREN ((uint32_t)0x10000000) /*!< Power interface clock enable */ + +#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) + #define RCC_APB1ENR_TIM4EN ((uint32_t)0x00000004) /*!< Timer 4 clock enable */ + #define RCC_APB1ENR_SPI2EN ((uint32_t)0x00004000) /*!< SPI 2 clock enable */ + #define RCC_APB1ENR_USART3EN ((uint32_t)0x00040000) /*!< USART 3 clock enable */ + #define RCC_APB1ENR_I2C2EN ((uint32_t)0x00400000) /*!< I2C 2 clock enable */ +#endif /* STM32F10X_LD && STM32F10X_LD_VL */ + +#if defined (STM32F10X_HD) || defined (STM32F10X_MD) || defined (STM32F10X_LD) + #define RCC_APB1ENR_USBEN ((uint32_t)0x00800000) /*!< USB Device clock enable */ +#endif + +#if defined (STM32F10X_HD) || defined (STM32F10X_CL) + #define RCC_APB1ENR_TIM5EN ((uint32_t)0x00000008) /*!< Timer 5 clock enable */ + #define RCC_APB1ENR_TIM6EN ((uint32_t)0x00000010) /*!< Timer 6 clock enable */ + #define RCC_APB1ENR_TIM7EN ((uint32_t)0x00000020) /*!< Timer 7 clock enable */ + #define RCC_APB1ENR_SPI3EN ((uint32_t)0x00008000) /*!< SPI 3 clock enable */ + #define RCC_APB1ENR_UART4EN ((uint32_t)0x00080000) /*!< UART 4 clock enable */ + #define RCC_APB1ENR_UART5EN ((uint32_t)0x00100000) /*!< UART 5 clock enable */ + #define RCC_APB1ENR_DACEN ((uint32_t)0x20000000) /*!< DAC interface clock enable */ +#endif + +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) + #define RCC_APB1ENR_TIM6EN ((uint32_t)0x00000010) /*!< Timer 6 clock enable */ + #define RCC_APB1ENR_TIM7EN ((uint32_t)0x00000020) /*!< Timer 7 clock enable */ + #define RCC_APB1ENR_DACEN ((uint32_t)0x20000000) /*!< DAC interface clock enable */ + #define RCC_APB1ENR_CECEN ((uint32_t)0x40000000) /*!< CEC interface clock enable */ +#endif + +#ifdef STM32F10X_HD_VL + #define RCC_APB1ENR_TIM5EN ((uint32_t)0x00000008) /*!< Timer 5 clock enable */ + #define RCC_APB1ENR_TIM12EN ((uint32_t)0x00000040) /*!< TIM12 Timer clock enable */ + #define RCC_APB1ENR_TIM13EN ((uint32_t)0x00000080) /*!< TIM13 Timer clock enable */ + #define RCC_APB1ENR_TIM14EN ((uint32_t)0x00000100) /*!< TIM14 Timer clock enable */ + #define RCC_APB1ENR_SPI3EN ((uint32_t)0x00008000) /*!< SPI 3 clock enable */ + #define RCC_APB1ENR_UART4EN ((uint32_t)0x00080000) /*!< UART 4 clock enable */ + #define RCC_APB1ENR_UART5EN ((uint32_t)0x00100000) /*!< UART 5 clock enable */ +#endif /* STM32F10X_HD_VL */ + +#ifdef STM32F10X_CL + #define RCC_APB1ENR_CAN2EN ((uint32_t)0x04000000) /*!< CAN2 clock enable */ +#endif /* STM32F10X_CL */ + +#ifdef STM32F10X_XL + #define RCC_APB1ENR_TIM12EN ((uint32_t)0x00000040) /*!< TIM12 Timer clock enable */ + #define RCC_APB1ENR_TIM13EN ((uint32_t)0x00000080) /*!< TIM13 Timer clock enable */ + #define RCC_APB1ENR_TIM14EN ((uint32_t)0x00000100) /*!< TIM14 Timer clock enable */ +#endif /* STM32F10X_XL */ + +/******************* Bit definition for RCC_BDCR register *******************/ +#define RCC_BDCR_LSEON ((uint32_t)0x00000001) /*!< External Low Speed oscillator enable */ +#define RCC_BDCR_LSERDY ((uint32_t)0x00000002) /*!< External Low Speed oscillator Ready */ +#define RCC_BDCR_LSEBYP ((uint32_t)0x00000004) /*!< External Low Speed oscillator Bypass */ + +#define RCC_BDCR_RTCSEL ((uint32_t)0x00000300) /*!< RTCSEL[1:0] bits (RTC clock source selection) */ +#define RCC_BDCR_RTCSEL_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define RCC_BDCR_RTCSEL_1 ((uint32_t)0x00000200) /*!< Bit 1 */ + +/*!< RTC congiguration */ +#define RCC_BDCR_RTCSEL_NOCLOCK ((uint32_t)0x00000000) /*!< No clock */ +#define RCC_BDCR_RTCSEL_LSE ((uint32_t)0x00000100) /*!< LSE oscillator clock used as RTC clock */ +#define RCC_BDCR_RTCSEL_LSI ((uint32_t)0x00000200) /*!< LSI oscillator clock used as RTC clock */ +#define RCC_BDCR_RTCSEL_HSE ((uint32_t)0x00000300) /*!< HSE oscillator clock divided by 128 used as RTC clock */ + +#define RCC_BDCR_RTCEN ((uint32_t)0x00008000) /*!< RTC clock enable */ +#define RCC_BDCR_BDRST ((uint32_t)0x00010000) /*!< Backup domain software reset */ + +/******************* Bit definition for RCC_CSR register ********************/ +#define RCC_CSR_LSION ((uint32_t)0x00000001) /*!< Internal Low Speed oscillator enable */ +#define RCC_CSR_LSIRDY ((uint32_t)0x00000002) /*!< Internal Low Speed oscillator Ready */ +#define RCC_CSR_RMVF ((uint32_t)0x01000000) /*!< Remove reset flag */ +#define RCC_CSR_PINRSTF ((uint32_t)0x04000000) /*!< PIN reset flag */ +#define RCC_CSR_PORRSTF ((uint32_t)0x08000000) /*!< POR/PDR reset flag */ +#define RCC_CSR_SFTRSTF ((uint32_t)0x10000000) /*!< Software Reset flag */ +#define RCC_CSR_IWDGRSTF ((uint32_t)0x20000000) /*!< Independent Watchdog reset flag */ +#define RCC_CSR_WWDGRSTF ((uint32_t)0x40000000) /*!< Window watchdog reset flag */ +#define RCC_CSR_LPWRRSTF ((uint32_t)0x80000000) /*!< Low-Power reset flag */ + +#ifdef STM32F10X_CL +/******************* Bit definition for RCC_AHBRSTR register ****************/ + #define RCC_AHBRSTR_OTGFSRST ((uint32_t)0x00001000) /*!< USB OTG FS reset */ + #define RCC_AHBRSTR_ETHMACRST ((uint32_t)0x00004000) /*!< ETHERNET MAC reset */ + +/******************* Bit definition for RCC_CFGR2 register ******************/ +/*!< PREDIV1 configuration */ + #define RCC_CFGR2_PREDIV1 ((uint32_t)0x0000000F) /*!< PREDIV1[3:0] bits */ + #define RCC_CFGR2_PREDIV1_0 ((uint32_t)0x00000001) /*!< Bit 0 */ + #define RCC_CFGR2_PREDIV1_1 ((uint32_t)0x00000002) /*!< Bit 1 */ + #define RCC_CFGR2_PREDIV1_2 ((uint32_t)0x00000004) /*!< Bit 2 */ + #define RCC_CFGR2_PREDIV1_3 ((uint32_t)0x00000008) /*!< Bit 3 */ + + #define RCC_CFGR2_PREDIV1_DIV1 ((uint32_t)0x00000000) /*!< PREDIV1 input clock not divided */ + #define RCC_CFGR2_PREDIV1_DIV2 ((uint32_t)0x00000001) /*!< PREDIV1 input clock divided by 2 */ + #define RCC_CFGR2_PREDIV1_DIV3 ((uint32_t)0x00000002) /*!< PREDIV1 input clock divided by 3 */ + #define RCC_CFGR2_PREDIV1_DIV4 ((uint32_t)0x00000003) /*!< PREDIV1 input clock divided by 4 */ + #define RCC_CFGR2_PREDIV1_DIV5 ((uint32_t)0x00000004) /*!< PREDIV1 input clock divided by 5 */ + #define RCC_CFGR2_PREDIV1_DIV6 ((uint32_t)0x00000005) /*!< PREDIV1 input clock divided by 6 */ + #define RCC_CFGR2_PREDIV1_DIV7 ((uint32_t)0x00000006) /*!< PREDIV1 input clock divided by 7 */ + #define RCC_CFGR2_PREDIV1_DIV8 ((uint32_t)0x00000007) /*!< PREDIV1 input clock divided by 8 */ + #define RCC_CFGR2_PREDIV1_DIV9 ((uint32_t)0x00000008) /*!< PREDIV1 input clock divided by 9 */ + #define RCC_CFGR2_PREDIV1_DIV10 ((uint32_t)0x00000009) /*!< PREDIV1 input clock divided by 10 */ + #define RCC_CFGR2_PREDIV1_DIV11 ((uint32_t)0x0000000A) /*!< PREDIV1 input clock divided by 11 */ + #define RCC_CFGR2_PREDIV1_DIV12 ((uint32_t)0x0000000B) /*!< PREDIV1 input clock divided by 12 */ + #define RCC_CFGR2_PREDIV1_DIV13 ((uint32_t)0x0000000C) /*!< PREDIV1 input clock divided by 13 */ + #define RCC_CFGR2_PREDIV1_DIV14 ((uint32_t)0x0000000D) /*!< PREDIV1 input clock divided by 14 */ + #define RCC_CFGR2_PREDIV1_DIV15 ((uint32_t)0x0000000E) /*!< PREDIV1 input clock divided by 15 */ + #define RCC_CFGR2_PREDIV1_DIV16 ((uint32_t)0x0000000F) /*!< PREDIV1 input clock divided by 16 */ + +/*!< PREDIV2 configuration */ + #define RCC_CFGR2_PREDIV2 ((uint32_t)0x000000F0) /*!< PREDIV2[3:0] bits */ + #define RCC_CFGR2_PREDIV2_0 ((uint32_t)0x00000010) /*!< Bit 0 */ + #define RCC_CFGR2_PREDIV2_1 ((uint32_t)0x00000020) /*!< Bit 1 */ + #define RCC_CFGR2_PREDIV2_2 ((uint32_t)0x00000040) /*!< Bit 2 */ + #define RCC_CFGR2_PREDIV2_3 ((uint32_t)0x00000080) /*!< Bit 3 */ + + #define RCC_CFGR2_PREDIV2_DIV1 ((uint32_t)0x00000000) /*!< PREDIV2 input clock not divided */ + #define RCC_CFGR2_PREDIV2_DIV2 ((uint32_t)0x00000010) /*!< PREDIV2 input clock divided by 2 */ + #define RCC_CFGR2_PREDIV2_DIV3 ((uint32_t)0x00000020) /*!< PREDIV2 input clock divided by 3 */ + #define RCC_CFGR2_PREDIV2_DIV4 ((uint32_t)0x00000030) /*!< PREDIV2 input clock divided by 4 */ + #define RCC_CFGR2_PREDIV2_DIV5 ((uint32_t)0x00000040) /*!< PREDIV2 input clock divided by 5 */ + #define RCC_CFGR2_PREDIV2_DIV6 ((uint32_t)0x00000050) /*!< PREDIV2 input clock divided by 6 */ + #define RCC_CFGR2_PREDIV2_DIV7 ((uint32_t)0x00000060) /*!< PREDIV2 input clock divided by 7 */ + #define RCC_CFGR2_PREDIV2_DIV8 ((uint32_t)0x00000070) /*!< PREDIV2 input clock divided by 8 */ + #define RCC_CFGR2_PREDIV2_DIV9 ((uint32_t)0x00000080) /*!< PREDIV2 input clock divided by 9 */ + #define RCC_CFGR2_PREDIV2_DIV10 ((uint32_t)0x00000090) /*!< PREDIV2 input clock divided by 10 */ + #define RCC_CFGR2_PREDIV2_DIV11 ((uint32_t)0x000000A0) /*!< PREDIV2 input clock divided by 11 */ + #define RCC_CFGR2_PREDIV2_DIV12 ((uint32_t)0x000000B0) /*!< PREDIV2 input clock divided by 12 */ + #define RCC_CFGR2_PREDIV2_DIV13 ((uint32_t)0x000000C0) /*!< PREDIV2 input clock divided by 13 */ + #define RCC_CFGR2_PREDIV2_DIV14 ((uint32_t)0x000000D0) /*!< PREDIV2 input clock divided by 14 */ + #define RCC_CFGR2_PREDIV2_DIV15 ((uint32_t)0x000000E0) /*!< PREDIV2 input clock divided by 15 */ + #define RCC_CFGR2_PREDIV2_DIV16 ((uint32_t)0x000000F0) /*!< PREDIV2 input clock divided by 16 */ + +/*!< PLL2MUL configuration */ + #define RCC_CFGR2_PLL2MUL ((uint32_t)0x00000F00) /*!< PLL2MUL[3:0] bits */ + #define RCC_CFGR2_PLL2MUL_0 ((uint32_t)0x00000100) /*!< Bit 0 */ + #define RCC_CFGR2_PLL2MUL_1 ((uint32_t)0x00000200) /*!< Bit 1 */ + #define RCC_CFGR2_PLL2MUL_2 ((uint32_t)0x00000400) /*!< Bit 2 */ + #define RCC_CFGR2_PLL2MUL_3 ((uint32_t)0x00000800) /*!< Bit 3 */ + + #define RCC_CFGR2_PLL2MUL8 ((uint32_t)0x00000600) /*!< PLL2 input clock * 8 */ + #define RCC_CFGR2_PLL2MUL9 ((uint32_t)0x00000700) /*!< PLL2 input clock * 9 */ + #define RCC_CFGR2_PLL2MUL10 ((uint32_t)0x00000800) /*!< PLL2 input clock * 10 */ + #define RCC_CFGR2_PLL2MUL11 ((uint32_t)0x00000900) /*!< PLL2 input clock * 11 */ + #define RCC_CFGR2_PLL2MUL12 ((uint32_t)0x00000A00) /*!< PLL2 input clock * 12 */ + #define RCC_CFGR2_PLL2MUL13 ((uint32_t)0x00000B00) /*!< PLL2 input clock * 13 */ + #define RCC_CFGR2_PLL2MUL14 ((uint32_t)0x00000C00) /*!< PLL2 input clock * 14 */ + #define RCC_CFGR2_PLL2MUL16 ((uint32_t)0x00000E00) /*!< PLL2 input clock * 16 */ + #define RCC_CFGR2_PLL2MUL20 ((uint32_t)0x00000F00) /*!< PLL2 input clock * 20 */ + +/*!< PLL3MUL configuration */ + #define RCC_CFGR2_PLL3MUL ((uint32_t)0x0000F000) /*!< PLL3MUL[3:0] bits */ + #define RCC_CFGR2_PLL3MUL_0 ((uint32_t)0x00001000) /*!< Bit 0 */ + #define RCC_CFGR2_PLL3MUL_1 ((uint32_t)0x00002000) /*!< Bit 1 */ + #define RCC_CFGR2_PLL3MUL_2 ((uint32_t)0x00004000) /*!< Bit 2 */ + #define RCC_CFGR2_PLL3MUL_3 ((uint32_t)0x00008000) /*!< Bit 3 */ + + #define RCC_CFGR2_PLL3MUL8 ((uint32_t)0x00006000) /*!< PLL3 input clock * 8 */ + #define RCC_CFGR2_PLL3MUL9 ((uint32_t)0x00007000) /*!< PLL3 input clock * 9 */ + #define RCC_CFGR2_PLL3MUL10 ((uint32_t)0x00008000) /*!< PLL3 input clock * 10 */ + #define RCC_CFGR2_PLL3MUL11 ((uint32_t)0x00009000) /*!< PLL3 input clock * 11 */ + #define RCC_CFGR2_PLL3MUL12 ((uint32_t)0x0000A000) /*!< PLL3 input clock * 12 */ + #define RCC_CFGR2_PLL3MUL13 ((uint32_t)0x0000B000) /*!< PLL3 input clock * 13 */ + #define RCC_CFGR2_PLL3MUL14 ((uint32_t)0x0000C000) /*!< PLL3 input clock * 14 */ + #define RCC_CFGR2_PLL3MUL16 ((uint32_t)0x0000E000) /*!< PLL3 input clock * 16 */ + #define RCC_CFGR2_PLL3MUL20 ((uint32_t)0x0000F000) /*!< PLL3 input clock * 20 */ + + #define RCC_CFGR2_PREDIV1SRC ((uint32_t)0x00010000) /*!< PREDIV1 entry clock source */ + #define RCC_CFGR2_PREDIV1SRC_PLL2 ((uint32_t)0x00010000) /*!< PLL2 selected as PREDIV1 entry clock source */ + #define RCC_CFGR2_PREDIV1SRC_HSE ((uint32_t)0x00000000) /*!< HSE selected as PREDIV1 entry clock source */ + #define RCC_CFGR2_I2S2SRC ((uint32_t)0x00020000) /*!< I2S2 entry clock source */ + #define RCC_CFGR2_I2S3SRC ((uint32_t)0x00040000) /*!< I2S3 clock source */ +#endif /* STM32F10X_CL */ + +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) +/******************* Bit definition for RCC_CFGR2 register ******************/ +/*!< PREDIV1 configuration */ + #define RCC_CFGR2_PREDIV1 ((uint32_t)0x0000000F) /*!< PREDIV1[3:0] bits */ + #define RCC_CFGR2_PREDIV1_0 ((uint32_t)0x00000001) /*!< Bit 0 */ + #define RCC_CFGR2_PREDIV1_1 ((uint32_t)0x00000002) /*!< Bit 1 */ + #define RCC_CFGR2_PREDIV1_2 ((uint32_t)0x00000004) /*!< Bit 2 */ + #define RCC_CFGR2_PREDIV1_3 ((uint32_t)0x00000008) /*!< Bit 3 */ + + #define RCC_CFGR2_PREDIV1_DIV1 ((uint32_t)0x00000000) /*!< PREDIV1 input clock not divided */ + #define RCC_CFGR2_PREDIV1_DIV2 ((uint32_t)0x00000001) /*!< PREDIV1 input clock divided by 2 */ + #define RCC_CFGR2_PREDIV1_DIV3 ((uint32_t)0x00000002) /*!< PREDIV1 input clock divided by 3 */ + #define RCC_CFGR2_PREDIV1_DIV4 ((uint32_t)0x00000003) /*!< PREDIV1 input clock divided by 4 */ + #define RCC_CFGR2_PREDIV1_DIV5 ((uint32_t)0x00000004) /*!< PREDIV1 input clock divided by 5 */ + #define RCC_CFGR2_PREDIV1_DIV6 ((uint32_t)0x00000005) /*!< PREDIV1 input clock divided by 6 */ + #define RCC_CFGR2_PREDIV1_DIV7 ((uint32_t)0x00000006) /*!< PREDIV1 input clock divided by 7 */ + #define RCC_CFGR2_PREDIV1_DIV8 ((uint32_t)0x00000007) /*!< PREDIV1 input clock divided by 8 */ + #define RCC_CFGR2_PREDIV1_DIV9 ((uint32_t)0x00000008) /*!< PREDIV1 input clock divided by 9 */ + #define RCC_CFGR2_PREDIV1_DIV10 ((uint32_t)0x00000009) /*!< PREDIV1 input clock divided by 10 */ + #define RCC_CFGR2_PREDIV1_DIV11 ((uint32_t)0x0000000A) /*!< PREDIV1 input clock divided by 11 */ + #define RCC_CFGR2_PREDIV1_DIV12 ((uint32_t)0x0000000B) /*!< PREDIV1 input clock divided by 12 */ + #define RCC_CFGR2_PREDIV1_DIV13 ((uint32_t)0x0000000C) /*!< PREDIV1 input clock divided by 13 */ + #define RCC_CFGR2_PREDIV1_DIV14 ((uint32_t)0x0000000D) /*!< PREDIV1 input clock divided by 14 */ + #define RCC_CFGR2_PREDIV1_DIV15 ((uint32_t)0x0000000E) /*!< PREDIV1 input clock divided by 15 */ + #define RCC_CFGR2_PREDIV1_DIV16 ((uint32_t)0x0000000F) /*!< PREDIV1 input clock divided by 16 */ +#endif + +/******************************************************************************/ +/* */ +/* General Purpose and Alternate Function I/O */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for GPIO_CRL register *******************/ +#define GPIO_CRL_MODE ((uint32_t)0x33333333) /*!< Port x mode bits */ + +#define GPIO_CRL_MODE0 ((uint32_t)0x00000003) /*!< MODE0[1:0] bits (Port x mode bits, pin 0) */ +#define GPIO_CRL_MODE0_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define GPIO_CRL_MODE0_1 ((uint32_t)0x00000002) /*!< Bit 1 */ + +#define GPIO_CRL_MODE1 ((uint32_t)0x00000030) /*!< MODE1[1:0] bits (Port x mode bits, pin 1) */ +#define GPIO_CRL_MODE1_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define GPIO_CRL_MODE1_1 ((uint32_t)0x00000020) /*!< Bit 1 */ + +#define GPIO_CRL_MODE2 ((uint32_t)0x00000300) /*!< MODE2[1:0] bits (Port x mode bits, pin 2) */ +#define GPIO_CRL_MODE2_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define GPIO_CRL_MODE2_1 ((uint32_t)0x00000200) /*!< Bit 1 */ + +#define GPIO_CRL_MODE3 ((uint32_t)0x00003000) /*!< MODE3[1:0] bits (Port x mode bits, pin 3) */ +#define GPIO_CRL_MODE3_0 ((uint32_t)0x00001000) /*!< Bit 0 */ +#define GPIO_CRL_MODE3_1 ((uint32_t)0x00002000) /*!< Bit 1 */ + +#define GPIO_CRL_MODE4 ((uint32_t)0x00030000) /*!< MODE4[1:0] bits (Port x mode bits, pin 4) */ +#define GPIO_CRL_MODE4_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define GPIO_CRL_MODE4_1 ((uint32_t)0x00020000) /*!< Bit 1 */ + +#define GPIO_CRL_MODE5 ((uint32_t)0x00300000) /*!< MODE5[1:0] bits (Port x mode bits, pin 5) */ +#define GPIO_CRL_MODE5_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define GPIO_CRL_MODE5_1 ((uint32_t)0x00200000) /*!< Bit 1 */ + +#define GPIO_CRL_MODE6 ((uint32_t)0x03000000) /*!< MODE6[1:0] bits (Port x mode bits, pin 6) */ +#define GPIO_CRL_MODE6_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define GPIO_CRL_MODE6_1 ((uint32_t)0x02000000) /*!< Bit 1 */ + +#define GPIO_CRL_MODE7 ((uint32_t)0x30000000) /*!< MODE7[1:0] bits (Port x mode bits, pin 7) */ +#define GPIO_CRL_MODE7_0 ((uint32_t)0x10000000) /*!< Bit 0 */ +#define GPIO_CRL_MODE7_1 ((uint32_t)0x20000000) /*!< Bit 1 */ + +#define GPIO_CRL_CNF ((uint32_t)0xCCCCCCCC) /*!< Port x configuration bits */ + +#define GPIO_CRL_CNF0 ((uint32_t)0x0000000C) /*!< CNF0[1:0] bits (Port x configuration bits, pin 0) */ +#define GPIO_CRL_CNF0_0 ((uint32_t)0x00000004) /*!< Bit 0 */ +#define GPIO_CRL_CNF0_1 ((uint32_t)0x00000008) /*!< Bit 1 */ + +#define GPIO_CRL_CNF1 ((uint32_t)0x000000C0) /*!< CNF1[1:0] bits (Port x configuration bits, pin 1) */ +#define GPIO_CRL_CNF1_0 ((uint32_t)0x00000040) /*!< Bit 0 */ +#define GPIO_CRL_CNF1_1 ((uint32_t)0x00000080) /*!< Bit 1 */ + +#define GPIO_CRL_CNF2 ((uint32_t)0x00000C00) /*!< CNF2[1:0] bits (Port x configuration bits, pin 2) */ +#define GPIO_CRL_CNF2_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define GPIO_CRL_CNF2_1 ((uint32_t)0x00000800) /*!< Bit 1 */ + +#define GPIO_CRL_CNF3 ((uint32_t)0x0000C000) /*!< CNF3[1:0] bits (Port x configuration bits, pin 3) */ +#define GPIO_CRL_CNF3_0 ((uint32_t)0x00004000) /*!< Bit 0 */ +#define GPIO_CRL_CNF3_1 ((uint32_t)0x00008000) /*!< Bit 1 */ + +#define GPIO_CRL_CNF4 ((uint32_t)0x000C0000) /*!< CNF4[1:0] bits (Port x configuration bits, pin 4) */ +#define GPIO_CRL_CNF4_0 ((uint32_t)0x00040000) /*!< Bit 0 */ +#define GPIO_CRL_CNF4_1 ((uint32_t)0x00080000) /*!< Bit 1 */ + +#define GPIO_CRL_CNF5 ((uint32_t)0x00C00000) /*!< CNF5[1:0] bits (Port x configuration bits, pin 5) */ +#define GPIO_CRL_CNF5_0 ((uint32_t)0x00400000) /*!< Bit 0 */ +#define GPIO_CRL_CNF5_1 ((uint32_t)0x00800000) /*!< Bit 1 */ + +#define GPIO_CRL_CNF6 ((uint32_t)0x0C000000) /*!< CNF6[1:0] bits (Port x configuration bits, pin 6) */ +#define GPIO_CRL_CNF6_0 ((uint32_t)0x04000000) /*!< Bit 0 */ +#define GPIO_CRL_CNF6_1 ((uint32_t)0x08000000) /*!< Bit 1 */ + +#define GPIO_CRL_CNF7 ((uint32_t)0xC0000000) /*!< CNF7[1:0] bits (Port x configuration bits, pin 7) */ +#define GPIO_CRL_CNF7_0 ((uint32_t)0x40000000) /*!< Bit 0 */ +#define GPIO_CRL_CNF7_1 ((uint32_t)0x80000000) /*!< Bit 1 */ + +/******************* Bit definition for GPIO_CRH register *******************/ +#define GPIO_CRH_MODE ((uint32_t)0x33333333) /*!< Port x mode bits */ + +#define GPIO_CRH_MODE8 ((uint32_t)0x00000003) /*!< MODE8[1:0] bits (Port x mode bits, pin 8) */ +#define GPIO_CRH_MODE8_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define GPIO_CRH_MODE8_1 ((uint32_t)0x00000002) /*!< Bit 1 */ + +#define GPIO_CRH_MODE9 ((uint32_t)0x00000030) /*!< MODE9[1:0] bits (Port x mode bits, pin 9) */ +#define GPIO_CRH_MODE9_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define GPIO_CRH_MODE9_1 ((uint32_t)0x00000020) /*!< Bit 1 */ + +#define GPIO_CRH_MODE10 ((uint32_t)0x00000300) /*!< MODE10[1:0] bits (Port x mode bits, pin 10) */ +#define GPIO_CRH_MODE10_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define GPIO_CRH_MODE10_1 ((uint32_t)0x00000200) /*!< Bit 1 */ + +#define GPIO_CRH_MODE11 ((uint32_t)0x00003000) /*!< MODE11[1:0] bits (Port x mode bits, pin 11) */ +#define GPIO_CRH_MODE11_0 ((uint32_t)0x00001000) /*!< Bit 0 */ +#define GPIO_CRH_MODE11_1 ((uint32_t)0x00002000) /*!< Bit 1 */ + +#define GPIO_CRH_MODE12 ((uint32_t)0x00030000) /*!< MODE12[1:0] bits (Port x mode bits, pin 12) */ +#define GPIO_CRH_MODE12_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define GPIO_CRH_MODE12_1 ((uint32_t)0x00020000) /*!< Bit 1 */ + +#define GPIO_CRH_MODE13 ((uint32_t)0x00300000) /*!< MODE13[1:0] bits (Port x mode bits, pin 13) */ +#define GPIO_CRH_MODE13_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define GPIO_CRH_MODE13_1 ((uint32_t)0x00200000) /*!< Bit 1 */ + +#define GPIO_CRH_MODE14 ((uint32_t)0x03000000) /*!< MODE14[1:0] bits (Port x mode bits, pin 14) */ +#define GPIO_CRH_MODE14_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define GPIO_CRH_MODE14_1 ((uint32_t)0x02000000) /*!< Bit 1 */ + +#define GPIO_CRH_MODE15 ((uint32_t)0x30000000) /*!< MODE15[1:0] bits (Port x mode bits, pin 15) */ +#define GPIO_CRH_MODE15_0 ((uint32_t)0x10000000) /*!< Bit 0 */ +#define GPIO_CRH_MODE15_1 ((uint32_t)0x20000000) /*!< Bit 1 */ + +#define GPIO_CRH_CNF ((uint32_t)0xCCCCCCCC) /*!< Port x configuration bits */ + +#define GPIO_CRH_CNF8 ((uint32_t)0x0000000C) /*!< CNF8[1:0] bits (Port x configuration bits, pin 8) */ +#define GPIO_CRH_CNF8_0 ((uint32_t)0x00000004) /*!< Bit 0 */ +#define GPIO_CRH_CNF8_1 ((uint32_t)0x00000008) /*!< Bit 1 */ + +#define GPIO_CRH_CNF9 ((uint32_t)0x000000C0) /*!< CNF9[1:0] bits (Port x configuration bits, pin 9) */ +#define GPIO_CRH_CNF9_0 ((uint32_t)0x00000040) /*!< Bit 0 */ +#define GPIO_CRH_CNF9_1 ((uint32_t)0x00000080) /*!< Bit 1 */ + +#define GPIO_CRH_CNF10 ((uint32_t)0x00000C00) /*!< CNF10[1:0] bits (Port x configuration bits, pin 10) */ +#define GPIO_CRH_CNF10_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define GPIO_CRH_CNF10_1 ((uint32_t)0x00000800) /*!< Bit 1 */ + +#define GPIO_CRH_CNF11 ((uint32_t)0x0000C000) /*!< CNF11[1:0] bits (Port x configuration bits, pin 11) */ +#define GPIO_CRH_CNF11_0 ((uint32_t)0x00004000) /*!< Bit 0 */ +#define GPIO_CRH_CNF11_1 ((uint32_t)0x00008000) /*!< Bit 1 */ + +#define GPIO_CRH_CNF12 ((uint32_t)0x000C0000) /*!< CNF12[1:0] bits (Port x configuration bits, pin 12) */ +#define GPIO_CRH_CNF12_0 ((uint32_t)0x00040000) /*!< Bit 0 */ +#define GPIO_CRH_CNF12_1 ((uint32_t)0x00080000) /*!< Bit 1 */ + +#define GPIO_CRH_CNF13 ((uint32_t)0x00C00000) /*!< CNF13[1:0] bits (Port x configuration bits, pin 13) */ +#define GPIO_CRH_CNF13_0 ((uint32_t)0x00400000) /*!< Bit 0 */ +#define GPIO_CRH_CNF13_1 ((uint32_t)0x00800000) /*!< Bit 1 */ + +#define GPIO_CRH_CNF14 ((uint32_t)0x0C000000) /*!< CNF14[1:0] bits (Port x configuration bits, pin 14) */ +#define GPIO_CRH_CNF14_0 ((uint32_t)0x04000000) /*!< Bit 0 */ +#define GPIO_CRH_CNF14_1 ((uint32_t)0x08000000) /*!< Bit 1 */ + +#define GPIO_CRH_CNF15 ((uint32_t)0xC0000000) /*!< CNF15[1:0] bits (Port x configuration bits, pin 15) */ +#define GPIO_CRH_CNF15_0 ((uint32_t)0x40000000) /*!< Bit 0 */ +#define GPIO_CRH_CNF15_1 ((uint32_t)0x80000000) /*!< Bit 1 */ + +/*!<****************** Bit definition for GPIO_IDR register *******************/ +#define GPIO_IDR_IDR0 ((uint16_t)0x0001) /*!< Port input data, bit 0 */ +#define GPIO_IDR_IDR1 ((uint16_t)0x0002) /*!< Port input data, bit 1 */ +#define GPIO_IDR_IDR2 ((uint16_t)0x0004) /*!< Port input data, bit 2 */ +#define GPIO_IDR_IDR3 ((uint16_t)0x0008) /*!< Port input data, bit 3 */ +#define GPIO_IDR_IDR4 ((uint16_t)0x0010) /*!< Port input data, bit 4 */ +#define GPIO_IDR_IDR5 ((uint16_t)0x0020) /*!< Port input data, bit 5 */ +#define GPIO_IDR_IDR6 ((uint16_t)0x0040) /*!< Port input data, bit 6 */ +#define GPIO_IDR_IDR7 ((uint16_t)0x0080) /*!< Port input data, bit 7 */ +#define GPIO_IDR_IDR8 ((uint16_t)0x0100) /*!< Port input data, bit 8 */ +#define GPIO_IDR_IDR9 ((uint16_t)0x0200) /*!< Port input data, bit 9 */ +#define GPIO_IDR_IDR10 ((uint16_t)0x0400) /*!< Port input data, bit 10 */ +#define GPIO_IDR_IDR11 ((uint16_t)0x0800) /*!< Port input data, bit 11 */ +#define GPIO_IDR_IDR12 ((uint16_t)0x1000) /*!< Port input data, bit 12 */ +#define GPIO_IDR_IDR13 ((uint16_t)0x2000) /*!< Port input data, bit 13 */ +#define GPIO_IDR_IDR14 ((uint16_t)0x4000) /*!< Port input data, bit 14 */ +#define GPIO_IDR_IDR15 ((uint16_t)0x8000) /*!< Port input data, bit 15 */ + +/******************* Bit definition for GPIO_ODR register *******************/ +#define GPIO_ODR_ODR0 ((uint16_t)0x0001) /*!< Port output data, bit 0 */ +#define GPIO_ODR_ODR1 ((uint16_t)0x0002) /*!< Port output data, bit 1 */ +#define GPIO_ODR_ODR2 ((uint16_t)0x0004) /*!< Port output data, bit 2 */ +#define GPIO_ODR_ODR3 ((uint16_t)0x0008) /*!< Port output data, bit 3 */ +#define GPIO_ODR_ODR4 ((uint16_t)0x0010) /*!< Port output data, bit 4 */ +#define GPIO_ODR_ODR5 ((uint16_t)0x0020) /*!< Port output data, bit 5 */ +#define GPIO_ODR_ODR6 ((uint16_t)0x0040) /*!< Port output data, bit 6 */ +#define GPIO_ODR_ODR7 ((uint16_t)0x0080) /*!< Port output data, bit 7 */ +#define GPIO_ODR_ODR8 ((uint16_t)0x0100) /*!< Port output data, bit 8 */ +#define GPIO_ODR_ODR9 ((uint16_t)0x0200) /*!< Port output data, bit 9 */ +#define GPIO_ODR_ODR10 ((uint16_t)0x0400) /*!< Port output data, bit 10 */ +#define GPIO_ODR_ODR11 ((uint16_t)0x0800) /*!< Port output data, bit 11 */ +#define GPIO_ODR_ODR12 ((uint16_t)0x1000) /*!< Port output data, bit 12 */ +#define GPIO_ODR_ODR13 ((uint16_t)0x2000) /*!< Port output data, bit 13 */ +#define GPIO_ODR_ODR14 ((uint16_t)0x4000) /*!< Port output data, bit 14 */ +#define GPIO_ODR_ODR15 ((uint16_t)0x8000) /*!< Port output data, bit 15 */ + +/****************** Bit definition for GPIO_BSRR register *******************/ +#define GPIO_BSRR_BS0 ((uint32_t)0x00000001) /*!< Port x Set bit 0 */ +#define GPIO_BSRR_BS1 ((uint32_t)0x00000002) /*!< Port x Set bit 1 */ +#define GPIO_BSRR_BS2 ((uint32_t)0x00000004) /*!< Port x Set bit 2 */ +#define GPIO_BSRR_BS3 ((uint32_t)0x00000008) /*!< Port x Set bit 3 */ +#define GPIO_BSRR_BS4 ((uint32_t)0x00000010) /*!< Port x Set bit 4 */ +#define GPIO_BSRR_BS5 ((uint32_t)0x00000020) /*!< Port x Set bit 5 */ +#define GPIO_BSRR_BS6 ((uint32_t)0x00000040) /*!< Port x Set bit 6 */ +#define GPIO_BSRR_BS7 ((uint32_t)0x00000080) /*!< Port x Set bit 7 */ +#define GPIO_BSRR_BS8 ((uint32_t)0x00000100) /*!< Port x Set bit 8 */ +#define GPIO_BSRR_BS9 ((uint32_t)0x00000200) /*!< Port x Set bit 9 */ +#define GPIO_BSRR_BS10 ((uint32_t)0x00000400) /*!< Port x Set bit 10 */ +#define GPIO_BSRR_BS11 ((uint32_t)0x00000800) /*!< Port x Set bit 11 */ +#define GPIO_BSRR_BS12 ((uint32_t)0x00001000) /*!< Port x Set bit 12 */ +#define GPIO_BSRR_BS13 ((uint32_t)0x00002000) /*!< Port x Set bit 13 */ +#define GPIO_BSRR_BS14 ((uint32_t)0x00004000) /*!< Port x Set bit 14 */ +#define GPIO_BSRR_BS15 ((uint32_t)0x00008000) /*!< Port x Set bit 15 */ + +#define GPIO_BSRR_BR0 ((uint32_t)0x00010000) /*!< Port x Reset bit 0 */ +#define GPIO_BSRR_BR1 ((uint32_t)0x00020000) /*!< Port x Reset bit 1 */ +#define GPIO_BSRR_BR2 ((uint32_t)0x00040000) /*!< Port x Reset bit 2 */ +#define GPIO_BSRR_BR3 ((uint32_t)0x00080000) /*!< Port x Reset bit 3 */ +#define GPIO_BSRR_BR4 ((uint32_t)0x00100000) /*!< Port x Reset bit 4 */ +#define GPIO_BSRR_BR5 ((uint32_t)0x00200000) /*!< Port x Reset bit 5 */ +#define GPIO_BSRR_BR6 ((uint32_t)0x00400000) /*!< Port x Reset bit 6 */ +#define GPIO_BSRR_BR7 ((uint32_t)0x00800000) /*!< Port x Reset bit 7 */ +#define GPIO_BSRR_BR8 ((uint32_t)0x01000000) /*!< Port x Reset bit 8 */ +#define GPIO_BSRR_BR9 ((uint32_t)0x02000000) /*!< Port x Reset bit 9 */ +#define GPIO_BSRR_BR10 ((uint32_t)0x04000000) /*!< Port x Reset bit 10 */ +#define GPIO_BSRR_BR11 ((uint32_t)0x08000000) /*!< Port x Reset bit 11 */ +#define GPIO_BSRR_BR12 ((uint32_t)0x10000000) /*!< Port x Reset bit 12 */ +#define GPIO_BSRR_BR13 ((uint32_t)0x20000000) /*!< Port x Reset bit 13 */ +#define GPIO_BSRR_BR14 ((uint32_t)0x40000000) /*!< Port x Reset bit 14 */ +#define GPIO_BSRR_BR15 ((uint32_t)0x80000000) /*!< Port x Reset bit 15 */ + +/******************* Bit definition for GPIO_BRR register *******************/ +#define GPIO_BRR_BR0 ((uint16_t)0x0001) /*!< Port x Reset bit 0 */ +#define GPIO_BRR_BR1 ((uint16_t)0x0002) /*!< Port x Reset bit 1 */ +#define GPIO_BRR_BR2 ((uint16_t)0x0004) /*!< Port x Reset bit 2 */ +#define GPIO_BRR_BR3 ((uint16_t)0x0008) /*!< Port x Reset bit 3 */ +#define GPIO_BRR_BR4 ((uint16_t)0x0010) /*!< Port x Reset bit 4 */ +#define GPIO_BRR_BR5 ((uint16_t)0x0020) /*!< Port x Reset bit 5 */ +#define GPIO_BRR_BR6 ((uint16_t)0x0040) /*!< Port x Reset bit 6 */ +#define GPIO_BRR_BR7 ((uint16_t)0x0080) /*!< Port x Reset bit 7 */ +#define GPIO_BRR_BR8 ((uint16_t)0x0100) /*!< Port x Reset bit 8 */ +#define GPIO_BRR_BR9 ((uint16_t)0x0200) /*!< Port x Reset bit 9 */ +#define GPIO_BRR_BR10 ((uint16_t)0x0400) /*!< Port x Reset bit 10 */ +#define GPIO_BRR_BR11 ((uint16_t)0x0800) /*!< Port x Reset bit 11 */ +#define GPIO_BRR_BR12 ((uint16_t)0x1000) /*!< Port x Reset bit 12 */ +#define GPIO_BRR_BR13 ((uint16_t)0x2000) /*!< Port x Reset bit 13 */ +#define GPIO_BRR_BR14 ((uint16_t)0x4000) /*!< Port x Reset bit 14 */ +#define GPIO_BRR_BR15 ((uint16_t)0x8000) /*!< Port x Reset bit 15 */ + +/****************** Bit definition for GPIO_LCKR register *******************/ +#define GPIO_LCKR_LCK0 ((uint32_t)0x00000001) /*!< Port x Lock bit 0 */ +#define GPIO_LCKR_LCK1 ((uint32_t)0x00000002) /*!< Port x Lock bit 1 */ +#define GPIO_LCKR_LCK2 ((uint32_t)0x00000004) /*!< Port x Lock bit 2 */ +#define GPIO_LCKR_LCK3 ((uint32_t)0x00000008) /*!< Port x Lock bit 3 */ +#define GPIO_LCKR_LCK4 ((uint32_t)0x00000010) /*!< Port x Lock bit 4 */ +#define GPIO_LCKR_LCK5 ((uint32_t)0x00000020) /*!< Port x Lock bit 5 */ +#define GPIO_LCKR_LCK6 ((uint32_t)0x00000040) /*!< Port x Lock bit 6 */ +#define GPIO_LCKR_LCK7 ((uint32_t)0x00000080) /*!< Port x Lock bit 7 */ +#define GPIO_LCKR_LCK8 ((uint32_t)0x00000100) /*!< Port x Lock bit 8 */ +#define GPIO_LCKR_LCK9 ((uint32_t)0x00000200) /*!< Port x Lock bit 9 */ +#define GPIO_LCKR_LCK10 ((uint32_t)0x00000400) /*!< Port x Lock bit 10 */ +#define GPIO_LCKR_LCK11 ((uint32_t)0x00000800) /*!< Port x Lock bit 11 */ +#define GPIO_LCKR_LCK12 ((uint32_t)0x00001000) /*!< Port x Lock bit 12 */ +#define GPIO_LCKR_LCK13 ((uint32_t)0x00002000) /*!< Port x Lock bit 13 */ +#define GPIO_LCKR_LCK14 ((uint32_t)0x00004000) /*!< Port x Lock bit 14 */ +#define GPIO_LCKR_LCK15 ((uint32_t)0x00008000) /*!< Port x Lock bit 15 */ +#define GPIO_LCKR_LCKK ((uint32_t)0x00010000) /*!< Lock key */ + +/*----------------------------------------------------------------------------*/ + +/****************** Bit definition for AFIO_EVCR register *******************/ +#define AFIO_EVCR_PIN ((uint8_t)0x0F) /*!< PIN[3:0] bits (Pin selection) */ +#define AFIO_EVCR_PIN_0 ((uint8_t)0x01) /*!< Bit 0 */ +#define AFIO_EVCR_PIN_1 ((uint8_t)0x02) /*!< Bit 1 */ +#define AFIO_EVCR_PIN_2 ((uint8_t)0x04) /*!< Bit 2 */ +#define AFIO_EVCR_PIN_3 ((uint8_t)0x08) /*!< Bit 3 */ + +/*!< PIN configuration */ +#define AFIO_EVCR_PIN_PX0 ((uint8_t)0x00) /*!< Pin 0 selected */ +#define AFIO_EVCR_PIN_PX1 ((uint8_t)0x01) /*!< Pin 1 selected */ +#define AFIO_EVCR_PIN_PX2 ((uint8_t)0x02) /*!< Pin 2 selected */ +#define AFIO_EVCR_PIN_PX3 ((uint8_t)0x03) /*!< Pin 3 selected */ +#define AFIO_EVCR_PIN_PX4 ((uint8_t)0x04) /*!< Pin 4 selected */ +#define AFIO_EVCR_PIN_PX5 ((uint8_t)0x05) /*!< Pin 5 selected */ +#define AFIO_EVCR_PIN_PX6 ((uint8_t)0x06) /*!< Pin 6 selected */ +#define AFIO_EVCR_PIN_PX7 ((uint8_t)0x07) /*!< Pin 7 selected */ +#define AFIO_EVCR_PIN_PX8 ((uint8_t)0x08) /*!< Pin 8 selected */ +#define AFIO_EVCR_PIN_PX9 ((uint8_t)0x09) /*!< Pin 9 selected */ +#define AFIO_EVCR_PIN_PX10 ((uint8_t)0x0A) /*!< Pin 10 selected */ +#define AFIO_EVCR_PIN_PX11 ((uint8_t)0x0B) /*!< Pin 11 selected */ +#define AFIO_EVCR_PIN_PX12 ((uint8_t)0x0C) /*!< Pin 12 selected */ +#define AFIO_EVCR_PIN_PX13 ((uint8_t)0x0D) /*!< Pin 13 selected */ +#define AFIO_EVCR_PIN_PX14 ((uint8_t)0x0E) /*!< Pin 14 selected */ +#define AFIO_EVCR_PIN_PX15 ((uint8_t)0x0F) /*!< Pin 15 selected */ + +#define AFIO_EVCR_PORT ((uint8_t)0x70) /*!< PORT[2:0] bits (Port selection) */ +#define AFIO_EVCR_PORT_0 ((uint8_t)0x10) /*!< Bit 0 */ +#define AFIO_EVCR_PORT_1 ((uint8_t)0x20) /*!< Bit 1 */ +#define AFIO_EVCR_PORT_2 ((uint8_t)0x40) /*!< Bit 2 */ + +/*!< PORT configuration */ +#define AFIO_EVCR_PORT_PA ((uint8_t)0x00) /*!< Port A selected */ +#define AFIO_EVCR_PORT_PB ((uint8_t)0x10) /*!< Port B selected */ +#define AFIO_EVCR_PORT_PC ((uint8_t)0x20) /*!< Port C selected */ +#define AFIO_EVCR_PORT_PD ((uint8_t)0x30) /*!< Port D selected */ +#define AFIO_EVCR_PORT_PE ((uint8_t)0x40) /*!< Port E selected */ + +#define AFIO_EVCR_EVOE ((uint8_t)0x80) /*!< Event Output Enable */ + +/****************** Bit definition for AFIO_MAPR register *******************/ +#define AFIO_MAPR_SPI1_REMAP ((uint32_t)0x00000001) /*!< SPI1 remapping */ +#define AFIO_MAPR_I2C1_REMAP ((uint32_t)0x00000002) /*!< I2C1 remapping */ +#define AFIO_MAPR_USART1_REMAP ((uint32_t)0x00000004) /*!< USART1 remapping */ +#define AFIO_MAPR_USART2_REMAP ((uint32_t)0x00000008) /*!< USART2 remapping */ + +#define AFIO_MAPR_USART3_REMAP ((uint32_t)0x00000030) /*!< USART3_REMAP[1:0] bits (USART3 remapping) */ +#define AFIO_MAPR_USART3_REMAP_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define AFIO_MAPR_USART3_REMAP_1 ((uint32_t)0x00000020) /*!< Bit 1 */ + +/* USART3_REMAP configuration */ +#define AFIO_MAPR_USART3_REMAP_NOREMAP ((uint32_t)0x00000000) /*!< No remap (TX/PB10, RX/PB11, CK/PB12, CTS/PB13, RTS/PB14) */ +#define AFIO_MAPR_USART3_REMAP_PARTIALREMAP ((uint32_t)0x00000010) /*!< Partial remap (TX/PC10, RX/PC11, CK/PC12, CTS/PB13, RTS/PB14) */ +#define AFIO_MAPR_USART3_REMAP_FULLREMAP ((uint32_t)0x00000030) /*!< Full remap (TX/PD8, RX/PD9, CK/PD10, CTS/PD11, RTS/PD12) */ + +#define AFIO_MAPR_TIM1_REMAP ((uint32_t)0x000000C0) /*!< TIM1_REMAP[1:0] bits (TIM1 remapping) */ +#define AFIO_MAPR_TIM1_REMAP_0 ((uint32_t)0x00000040) /*!< Bit 0 */ +#define AFIO_MAPR_TIM1_REMAP_1 ((uint32_t)0x00000080) /*!< Bit 1 */ + +/*!< TIM1_REMAP configuration */ +#define AFIO_MAPR_TIM1_REMAP_NOREMAP ((uint32_t)0x00000000) /*!< No remap (ETR/PA12, CH1/PA8, CH2/PA9, CH3/PA10, CH4/PA11, BKIN/PB12, CH1N/PB13, CH2N/PB14, CH3N/PB15) */ +#define AFIO_MAPR_TIM1_REMAP_PARTIALREMAP ((uint32_t)0x00000040) /*!< Partial remap (ETR/PA12, CH1/PA8, CH2/PA9, CH3/PA10, CH4/PA11, BKIN/PA6, CH1N/PA7, CH2N/PB0, CH3N/PB1) */ +#define AFIO_MAPR_TIM1_REMAP_FULLREMAP ((uint32_t)0x000000C0) /*!< Full remap (ETR/PE7, CH1/PE9, CH2/PE11, CH3/PE13, CH4/PE14, BKIN/PE15, CH1N/PE8, CH2N/PE10, CH3N/PE12) */ + +#define AFIO_MAPR_TIM2_REMAP ((uint32_t)0x00000300) /*!< TIM2_REMAP[1:0] bits (TIM2 remapping) */ +#define AFIO_MAPR_TIM2_REMAP_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define AFIO_MAPR_TIM2_REMAP_1 ((uint32_t)0x00000200) /*!< Bit 1 */ + +/*!< TIM2_REMAP configuration */ +#define AFIO_MAPR_TIM2_REMAP_NOREMAP ((uint32_t)0x00000000) /*!< No remap (CH1/ETR/PA0, CH2/PA1, CH3/PA2, CH4/PA3) */ +#define AFIO_MAPR_TIM2_REMAP_PARTIALREMAP1 ((uint32_t)0x00000100) /*!< Partial remap (CH1/ETR/PA15, CH2/PB3, CH3/PA2, CH4/PA3) */ +#define AFIO_MAPR_TIM2_REMAP_PARTIALREMAP2 ((uint32_t)0x00000200) /*!< Partial remap (CH1/ETR/PA0, CH2/PA1, CH3/PB10, CH4/PB11) */ +#define AFIO_MAPR_TIM2_REMAP_FULLREMAP ((uint32_t)0x00000300) /*!< Full remap (CH1/ETR/PA15, CH2/PB3, CH3/PB10, CH4/PB11) */ + +#define AFIO_MAPR_TIM3_REMAP ((uint32_t)0x00000C00) /*!< TIM3_REMAP[1:0] bits (TIM3 remapping) */ +#define AFIO_MAPR_TIM3_REMAP_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define AFIO_MAPR_TIM3_REMAP_1 ((uint32_t)0x00000800) /*!< Bit 1 */ + +/*!< TIM3_REMAP configuration */ +#define AFIO_MAPR_TIM3_REMAP_NOREMAP ((uint32_t)0x00000000) /*!< No remap (CH1/PA6, CH2/PA7, CH3/PB0, CH4/PB1) */ +#define AFIO_MAPR_TIM3_REMAP_PARTIALREMAP ((uint32_t)0x00000800) /*!< Partial remap (CH1/PB4, CH2/PB5, CH3/PB0, CH4/PB1) */ +#define AFIO_MAPR_TIM3_REMAP_FULLREMAP ((uint32_t)0x00000C00) /*!< Full remap (CH1/PC6, CH2/PC7, CH3/PC8, CH4/PC9) */ + +#define AFIO_MAPR_TIM4_REMAP ((uint32_t)0x00001000) /*!< TIM4_REMAP bit (TIM4 remapping) */ + +#define AFIO_MAPR_CAN_REMAP ((uint32_t)0x00006000) /*!< CAN_REMAP[1:0] bits (CAN Alternate function remapping) */ +#define AFIO_MAPR_CAN_REMAP_0 ((uint32_t)0x00002000) /*!< Bit 0 */ +#define AFIO_MAPR_CAN_REMAP_1 ((uint32_t)0x00004000) /*!< Bit 1 */ + +/*!< CAN_REMAP configuration */ +#define AFIO_MAPR_CAN_REMAP_REMAP1 ((uint32_t)0x00000000) /*!< CANRX mapped to PA11, CANTX mapped to PA12 */ +#define AFIO_MAPR_CAN_REMAP_REMAP2 ((uint32_t)0x00004000) /*!< CANRX mapped to PB8, CANTX mapped to PB9 */ +#define AFIO_MAPR_CAN_REMAP_REMAP3 ((uint32_t)0x00006000) /*!< CANRX mapped to PD0, CANTX mapped to PD1 */ + +#define AFIO_MAPR_PD01_REMAP ((uint32_t)0x00008000) /*!< Port D0/Port D1 mapping on OSC_IN/OSC_OUT */ +#define AFIO_MAPR_TIM5CH4_IREMAP ((uint32_t)0x00010000) /*!< TIM5 Channel4 Internal Remap */ +#define AFIO_MAPR_ADC1_ETRGINJ_REMAP ((uint32_t)0x00020000) /*!< ADC 1 External Trigger Injected Conversion remapping */ +#define AFIO_MAPR_ADC1_ETRGREG_REMAP ((uint32_t)0x00040000) /*!< ADC 1 External Trigger Regular Conversion remapping */ +#define AFIO_MAPR_ADC2_ETRGINJ_REMAP ((uint32_t)0x00080000) /*!< ADC 2 External Trigger Injected Conversion remapping */ +#define AFIO_MAPR_ADC2_ETRGREG_REMAP ((uint32_t)0x00100000) /*!< ADC 2 External Trigger Regular Conversion remapping */ + +/*!< SWJ_CFG configuration */ +#define AFIO_MAPR_SWJ_CFG ((uint32_t)0x07000000) /*!< SWJ_CFG[2:0] bits (Serial Wire JTAG configuration) */ +#define AFIO_MAPR_SWJ_CFG_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define AFIO_MAPR_SWJ_CFG_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define AFIO_MAPR_SWJ_CFG_2 ((uint32_t)0x04000000) /*!< Bit 2 */ + +#define AFIO_MAPR_SWJ_CFG_RESET ((uint32_t)0x00000000) /*!< Full SWJ (JTAG-DP + SW-DP) : Reset State */ +#define AFIO_MAPR_SWJ_CFG_NOJNTRST ((uint32_t)0x01000000) /*!< Full SWJ (JTAG-DP + SW-DP) but without JNTRST */ +#define AFIO_MAPR_SWJ_CFG_JTAGDISABLE ((uint32_t)0x02000000) /*!< JTAG-DP Disabled and SW-DP Enabled */ +#define AFIO_MAPR_SWJ_CFG_DISABLE ((uint32_t)0x04000000) /*!< JTAG-DP Disabled and SW-DP Disabled */ + +#ifdef STM32F10X_CL +/*!< ETH_REMAP configuration */ + #define AFIO_MAPR_ETH_REMAP ((uint32_t)0x00200000) /*!< SPI3_REMAP bit (Ethernet MAC I/O remapping) */ + +/*!< CAN2_REMAP configuration */ + #define AFIO_MAPR_CAN2_REMAP ((uint32_t)0x00400000) /*!< CAN2_REMAP bit (CAN2 I/O remapping) */ + +/*!< MII_RMII_SEL configuration */ + #define AFIO_MAPR_MII_RMII_SEL ((uint32_t)0x00800000) /*!< MII_RMII_SEL bit (Ethernet MII or RMII selection) */ + +/*!< SPI3_REMAP configuration */ + #define AFIO_MAPR_SPI3_REMAP ((uint32_t)0x10000000) /*!< SPI3_REMAP bit (SPI3 remapping) */ + +/*!< TIM2ITR1_IREMAP configuration */ + #define AFIO_MAPR_TIM2ITR1_IREMAP ((uint32_t)0x20000000) /*!< TIM2ITR1_IREMAP bit (TIM2 internal trigger 1 remapping) */ + +/*!< PTP_PPS_REMAP configuration */ + #define AFIO_MAPR_PTP_PPS_REMAP ((uint32_t)0x40000000) /*!< PTP_PPS_REMAP bit (Ethernet PTP PPS remapping) */ +#endif + +/***************** Bit definition for AFIO_EXTICR1 register *****************/ +#define AFIO_EXTICR1_EXTI0 ((uint16_t)0x000F) /*!< EXTI 0 configuration */ +#define AFIO_EXTICR1_EXTI1 ((uint16_t)0x00F0) /*!< EXTI 1 configuration */ +#define AFIO_EXTICR1_EXTI2 ((uint16_t)0x0F00) /*!< EXTI 2 configuration */ +#define AFIO_EXTICR1_EXTI3 ((uint16_t)0xF000) /*!< EXTI 3 configuration */ + +/*!< EXTI0 configuration */ +#define AFIO_EXTICR1_EXTI0_PA ((uint16_t)0x0000) /*!< PA[0] pin */ +#define AFIO_EXTICR1_EXTI0_PB ((uint16_t)0x0001) /*!< PB[0] pin */ +#define AFIO_EXTICR1_EXTI0_PC ((uint16_t)0x0002) /*!< PC[0] pin */ +#define AFIO_EXTICR1_EXTI0_PD ((uint16_t)0x0003) /*!< PD[0] pin */ +#define AFIO_EXTICR1_EXTI0_PE ((uint16_t)0x0004) /*!< PE[0] pin */ +#define AFIO_EXTICR1_EXTI0_PF ((uint16_t)0x0005) /*!< PF[0] pin */ +#define AFIO_EXTICR1_EXTI0_PG ((uint16_t)0x0006) /*!< PG[0] pin */ + +/*!< EXTI1 configuration */ +#define AFIO_EXTICR1_EXTI1_PA ((uint16_t)0x0000) /*!< PA[1] pin */ +#define AFIO_EXTICR1_EXTI1_PB ((uint16_t)0x0010) /*!< PB[1] pin */ +#define AFIO_EXTICR1_EXTI1_PC ((uint16_t)0x0020) /*!< PC[1] pin */ +#define AFIO_EXTICR1_EXTI1_PD ((uint16_t)0x0030) /*!< PD[1] pin */ +#define AFIO_EXTICR1_EXTI1_PE ((uint16_t)0x0040) /*!< PE[1] pin */ +#define AFIO_EXTICR1_EXTI1_PF ((uint16_t)0x0050) /*!< PF[1] pin */ +#define AFIO_EXTICR1_EXTI1_PG ((uint16_t)0x0060) /*!< PG[1] pin */ + +/*!< EXTI2 configuration */ +#define AFIO_EXTICR1_EXTI2_PA ((uint16_t)0x0000) /*!< PA[2] pin */ +#define AFIO_EXTICR1_EXTI2_PB ((uint16_t)0x0100) /*!< PB[2] pin */ +#define AFIO_EXTICR1_EXTI2_PC ((uint16_t)0x0200) /*!< PC[2] pin */ +#define AFIO_EXTICR1_EXTI2_PD ((uint16_t)0x0300) /*!< PD[2] pin */ +#define AFIO_EXTICR1_EXTI2_PE ((uint16_t)0x0400) /*!< PE[2] pin */ +#define AFIO_EXTICR1_EXTI2_PF ((uint16_t)0x0500) /*!< PF[2] pin */ +#define AFIO_EXTICR1_EXTI2_PG ((uint16_t)0x0600) /*!< PG[2] pin */ + +/*!< EXTI3 configuration */ +#define AFIO_EXTICR1_EXTI3_PA ((uint16_t)0x0000) /*!< PA[3] pin */ +#define AFIO_EXTICR1_EXTI3_PB ((uint16_t)0x1000) /*!< PB[3] pin */ +#define AFIO_EXTICR1_EXTI3_PC ((uint16_t)0x2000) /*!< PC[3] pin */ +#define AFIO_EXTICR1_EXTI3_PD ((uint16_t)0x3000) /*!< PD[3] pin */ +#define AFIO_EXTICR1_EXTI3_PE ((uint16_t)0x4000) /*!< PE[3] pin */ +#define AFIO_EXTICR1_EXTI3_PF ((uint16_t)0x5000) /*!< PF[3] pin */ +#define AFIO_EXTICR1_EXTI3_PG ((uint16_t)0x6000) /*!< PG[3] pin */ + +/***************** Bit definition for AFIO_EXTICR2 register *****************/ +#define AFIO_EXTICR2_EXTI4 ((uint16_t)0x000F) /*!< EXTI 4 configuration */ +#define AFIO_EXTICR2_EXTI5 ((uint16_t)0x00F0) /*!< EXTI 5 configuration */ +#define AFIO_EXTICR2_EXTI6 ((uint16_t)0x0F00) /*!< EXTI 6 configuration */ +#define AFIO_EXTICR2_EXTI7 ((uint16_t)0xF000) /*!< EXTI 7 configuration */ + +/*!< EXTI4 configuration */ +#define AFIO_EXTICR2_EXTI4_PA ((uint16_t)0x0000) /*!< PA[4] pin */ +#define AFIO_EXTICR2_EXTI4_PB ((uint16_t)0x0001) /*!< PB[4] pin */ +#define AFIO_EXTICR2_EXTI4_PC ((uint16_t)0x0002) /*!< PC[4] pin */ +#define AFIO_EXTICR2_EXTI4_PD ((uint16_t)0x0003) /*!< PD[4] pin */ +#define AFIO_EXTICR2_EXTI4_PE ((uint16_t)0x0004) /*!< PE[4] pin */ +#define AFIO_EXTICR2_EXTI4_PF ((uint16_t)0x0005) /*!< PF[4] pin */ +#define AFIO_EXTICR2_EXTI4_PG ((uint16_t)0x0006) /*!< PG[4] pin */ + +/* EXTI5 configuration */ +#define AFIO_EXTICR2_EXTI5_PA ((uint16_t)0x0000) /*!< PA[5] pin */ +#define AFIO_EXTICR2_EXTI5_PB ((uint16_t)0x0010) /*!< PB[5] pin */ +#define AFIO_EXTICR2_EXTI5_PC ((uint16_t)0x0020) /*!< PC[5] pin */ +#define AFIO_EXTICR2_EXTI5_PD ((uint16_t)0x0030) /*!< PD[5] pin */ +#define AFIO_EXTICR2_EXTI5_PE ((uint16_t)0x0040) /*!< PE[5] pin */ +#define AFIO_EXTICR2_EXTI5_PF ((uint16_t)0x0050) /*!< PF[5] pin */ +#define AFIO_EXTICR2_EXTI5_PG ((uint16_t)0x0060) /*!< PG[5] pin */ + +/*!< EXTI6 configuration */ +#define AFIO_EXTICR2_EXTI6_PA ((uint16_t)0x0000) /*!< PA[6] pin */ +#define AFIO_EXTICR2_EXTI6_PB ((uint16_t)0x0100) /*!< PB[6] pin */ +#define AFIO_EXTICR2_EXTI6_PC ((uint16_t)0x0200) /*!< PC[6] pin */ +#define AFIO_EXTICR2_EXTI6_PD ((uint16_t)0x0300) /*!< PD[6] pin */ +#define AFIO_EXTICR2_EXTI6_PE ((uint16_t)0x0400) /*!< PE[6] pin */ +#define AFIO_EXTICR2_EXTI6_PF ((uint16_t)0x0500) /*!< PF[6] pin */ +#define AFIO_EXTICR2_EXTI6_PG ((uint16_t)0x0600) /*!< PG[6] pin */ + +/*!< EXTI7 configuration */ +#define AFIO_EXTICR2_EXTI7_PA ((uint16_t)0x0000) /*!< PA[7] pin */ +#define AFIO_EXTICR2_EXTI7_PB ((uint16_t)0x1000) /*!< PB[7] pin */ +#define AFIO_EXTICR2_EXTI7_PC ((uint16_t)0x2000) /*!< PC[7] pin */ +#define AFIO_EXTICR2_EXTI7_PD ((uint16_t)0x3000) /*!< PD[7] pin */ +#define AFIO_EXTICR2_EXTI7_PE ((uint16_t)0x4000) /*!< PE[7] pin */ +#define AFIO_EXTICR2_EXTI7_PF ((uint16_t)0x5000) /*!< PF[7] pin */ +#define AFIO_EXTICR2_EXTI7_PG ((uint16_t)0x6000) /*!< PG[7] pin */ + +/***************** Bit definition for AFIO_EXTICR3 register *****************/ +#define AFIO_EXTICR3_EXTI8 ((uint16_t)0x000F) /*!< EXTI 8 configuration */ +#define AFIO_EXTICR3_EXTI9 ((uint16_t)0x00F0) /*!< EXTI 9 configuration */ +#define AFIO_EXTICR3_EXTI10 ((uint16_t)0x0F00) /*!< EXTI 10 configuration */ +#define AFIO_EXTICR3_EXTI11 ((uint16_t)0xF000) /*!< EXTI 11 configuration */ + +/*!< EXTI8 configuration */ +#define AFIO_EXTICR3_EXTI8_PA ((uint16_t)0x0000) /*!< PA[8] pin */ +#define AFIO_EXTICR3_EXTI8_PB ((uint16_t)0x0001) /*!< PB[8] pin */ +#define AFIO_EXTICR3_EXTI8_PC ((uint16_t)0x0002) /*!< PC[8] pin */ +#define AFIO_EXTICR3_EXTI8_PD ((uint16_t)0x0003) /*!< PD[8] pin */ +#define AFIO_EXTICR3_EXTI8_PE ((uint16_t)0x0004) /*!< PE[8] pin */ +#define AFIO_EXTICR3_EXTI8_PF ((uint16_t)0x0005) /*!< PF[8] pin */ +#define AFIO_EXTICR3_EXTI8_PG ((uint16_t)0x0006) /*!< PG[8] pin */ + +/*!< EXTI9 configuration */ +#define AFIO_EXTICR3_EXTI9_PA ((uint16_t)0x0000) /*!< PA[9] pin */ +#define AFIO_EXTICR3_EXTI9_PB ((uint16_t)0x0010) /*!< PB[9] pin */ +#define AFIO_EXTICR3_EXTI9_PC ((uint16_t)0x0020) /*!< PC[9] pin */ +#define AFIO_EXTICR3_EXTI9_PD ((uint16_t)0x0030) /*!< PD[9] pin */ +#define AFIO_EXTICR3_EXTI9_PE ((uint16_t)0x0040) /*!< PE[9] pin */ +#define AFIO_EXTICR3_EXTI9_PF ((uint16_t)0x0050) /*!< PF[9] pin */ +#define AFIO_EXTICR3_EXTI9_PG ((uint16_t)0x0060) /*!< PG[9] pin */ + +/*!< EXTI10 configuration */ +#define AFIO_EXTICR3_EXTI10_PA ((uint16_t)0x0000) /*!< PA[10] pin */ +#define AFIO_EXTICR3_EXTI10_PB ((uint16_t)0x0100) /*!< PB[10] pin */ +#define AFIO_EXTICR3_EXTI10_PC ((uint16_t)0x0200) /*!< PC[10] pin */ +#define AFIO_EXTICR3_EXTI10_PD ((uint16_t)0x0300) /*!< PD[10] pin */ +#define AFIO_EXTICR3_EXTI10_PE ((uint16_t)0x0400) /*!< PE[10] pin */ +#define AFIO_EXTICR3_EXTI10_PF ((uint16_t)0x0500) /*!< PF[10] pin */ +#define AFIO_EXTICR3_EXTI10_PG ((uint16_t)0x0600) /*!< PG[10] pin */ + +/*!< EXTI11 configuration */ +#define AFIO_EXTICR3_EXTI11_PA ((uint16_t)0x0000) /*!< PA[11] pin */ +#define AFIO_EXTICR3_EXTI11_PB ((uint16_t)0x1000) /*!< PB[11] pin */ +#define AFIO_EXTICR3_EXTI11_PC ((uint16_t)0x2000) /*!< PC[11] pin */ +#define AFIO_EXTICR3_EXTI11_PD ((uint16_t)0x3000) /*!< PD[11] pin */ +#define AFIO_EXTICR3_EXTI11_PE ((uint16_t)0x4000) /*!< PE[11] pin */ +#define AFIO_EXTICR3_EXTI11_PF ((uint16_t)0x5000) /*!< PF[11] pin */ +#define AFIO_EXTICR3_EXTI11_PG ((uint16_t)0x6000) /*!< PG[11] pin */ + +/***************** Bit definition for AFIO_EXTICR4 register *****************/ +#define AFIO_EXTICR4_EXTI12 ((uint16_t)0x000F) /*!< EXTI 12 configuration */ +#define AFIO_EXTICR4_EXTI13 ((uint16_t)0x00F0) /*!< EXTI 13 configuration */ +#define AFIO_EXTICR4_EXTI14 ((uint16_t)0x0F00) /*!< EXTI 14 configuration */ +#define AFIO_EXTICR4_EXTI15 ((uint16_t)0xF000) /*!< EXTI 15 configuration */ + +/* EXTI12 configuration */ +#define AFIO_EXTICR4_EXTI12_PA ((uint16_t)0x0000) /*!< PA[12] pin */ +#define AFIO_EXTICR4_EXTI12_PB ((uint16_t)0x0001) /*!< PB[12] pin */ +#define AFIO_EXTICR4_EXTI12_PC ((uint16_t)0x0002) /*!< PC[12] pin */ +#define AFIO_EXTICR4_EXTI12_PD ((uint16_t)0x0003) /*!< PD[12] pin */ +#define AFIO_EXTICR4_EXTI12_PE ((uint16_t)0x0004) /*!< PE[12] pin */ +#define AFIO_EXTICR4_EXTI12_PF ((uint16_t)0x0005) /*!< PF[12] pin */ +#define AFIO_EXTICR4_EXTI12_PG ((uint16_t)0x0006) /*!< PG[12] pin */ + +/* EXTI13 configuration */ +#define AFIO_EXTICR4_EXTI13_PA ((uint16_t)0x0000) /*!< PA[13] pin */ +#define AFIO_EXTICR4_EXTI13_PB ((uint16_t)0x0010) /*!< PB[13] pin */ +#define AFIO_EXTICR4_EXTI13_PC ((uint16_t)0x0020) /*!< PC[13] pin */ +#define AFIO_EXTICR4_EXTI13_PD ((uint16_t)0x0030) /*!< PD[13] pin */ +#define AFIO_EXTICR4_EXTI13_PE ((uint16_t)0x0040) /*!< PE[13] pin */ +#define AFIO_EXTICR4_EXTI13_PF ((uint16_t)0x0050) /*!< PF[13] pin */ +#define AFIO_EXTICR4_EXTI13_PG ((uint16_t)0x0060) /*!< PG[13] pin */ + +/*!< EXTI14 configuration */ +#define AFIO_EXTICR4_EXTI14_PA ((uint16_t)0x0000) /*!< PA[14] pin */ +#define AFIO_EXTICR4_EXTI14_PB ((uint16_t)0x0100) /*!< PB[14] pin */ +#define AFIO_EXTICR4_EXTI14_PC ((uint16_t)0x0200) /*!< PC[14] pin */ +#define AFIO_EXTICR4_EXTI14_PD ((uint16_t)0x0300) /*!< PD[14] pin */ +#define AFIO_EXTICR4_EXTI14_PE ((uint16_t)0x0400) /*!< PE[14] pin */ +#define AFIO_EXTICR4_EXTI14_PF ((uint16_t)0x0500) /*!< PF[14] pin */ +#define AFIO_EXTICR4_EXTI14_PG ((uint16_t)0x0600) /*!< PG[14] pin */ + +/*!< EXTI15 configuration */ +#define AFIO_EXTICR4_EXTI15_PA ((uint16_t)0x0000) /*!< PA[15] pin */ +#define AFIO_EXTICR4_EXTI15_PB ((uint16_t)0x1000) /*!< PB[15] pin */ +#define AFIO_EXTICR4_EXTI15_PC ((uint16_t)0x2000) /*!< PC[15] pin */ +#define AFIO_EXTICR4_EXTI15_PD ((uint16_t)0x3000) /*!< PD[15] pin */ +#define AFIO_EXTICR4_EXTI15_PE ((uint16_t)0x4000) /*!< PE[15] pin */ +#define AFIO_EXTICR4_EXTI15_PF ((uint16_t)0x5000) /*!< PF[15] pin */ +#define AFIO_EXTICR4_EXTI15_PG ((uint16_t)0x6000) /*!< PG[15] pin */ + +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) +/****************** Bit definition for AFIO_MAPR2 register ******************/ +#define AFIO_MAPR2_TIM15_REMAP ((uint32_t)0x00000001) /*!< TIM15 remapping */ +#define AFIO_MAPR2_TIM16_REMAP ((uint32_t)0x00000002) /*!< TIM16 remapping */ +#define AFIO_MAPR2_TIM17_REMAP ((uint32_t)0x00000004) /*!< TIM17 remapping */ +#define AFIO_MAPR2_CEC_REMAP ((uint32_t)0x00000008) /*!< CEC remapping */ +#define AFIO_MAPR2_TIM1_DMA_REMAP ((uint32_t)0x00000010) /*!< TIM1_DMA remapping */ +#endif + +#ifdef STM32F10X_HD_VL +#define AFIO_MAPR2_TIM13_REMAP ((uint32_t)0x00000100) /*!< TIM13 remapping */ +#define AFIO_MAPR2_TIM14_REMAP ((uint32_t)0x00000200) /*!< TIM14 remapping */ +#define AFIO_MAPR2_FSMC_NADV_REMAP ((uint32_t)0x00000400) /*!< FSMC NADV remapping */ +#define AFIO_MAPR2_TIM67_DAC_DMA_REMAP ((uint32_t)0x00000800) /*!< TIM6/TIM7 and DAC DMA remapping */ +#define AFIO_MAPR2_TIM12_REMAP ((uint32_t)0x00001000) /*!< TIM12 remapping */ +#define AFIO_MAPR2_MISC_REMAP ((uint32_t)0x00002000) /*!< Miscellaneous remapping */ +#endif + +#ifdef STM32F10X_XL +/****************** Bit definition for AFIO_MAPR2 register ******************/ +#define AFIO_MAPR2_TIM9_REMAP ((uint32_t)0x00000020) /*!< TIM9 remapping */ +#define AFIO_MAPR2_TIM10_REMAP ((uint32_t)0x00000040) /*!< TIM10 remapping */ +#define AFIO_MAPR2_TIM11_REMAP ((uint32_t)0x00000080) /*!< TIM11 remapping */ +#define AFIO_MAPR2_TIM13_REMAP ((uint32_t)0x00000100) /*!< TIM13 remapping */ +#define AFIO_MAPR2_TIM14_REMAP ((uint32_t)0x00000200) /*!< TIM14 remapping */ +#define AFIO_MAPR2_FSMC_NADV_REMAP ((uint32_t)0x00000400) /*!< FSMC NADV remapping */ +#endif + +/******************************************************************************/ +/* */ +/* SystemTick */ +/* */ +/******************************************************************************/ + +/***************** Bit definition for SysTick_CTRL register *****************/ +#define SysTick_CTRL_ENABLE ((uint32_t)0x00000001) /*!< Counter enable */ +#define SysTick_CTRL_TICKINT ((uint32_t)0x00000002) /*!< Counting down to 0 pends the SysTick handler */ +#define SysTick_CTRL_CLKSOURCE ((uint32_t)0x00000004) /*!< Clock source */ +#define SysTick_CTRL_COUNTFLAG ((uint32_t)0x00010000) /*!< Count Flag */ + +/***************** Bit definition for SysTick_LOAD register *****************/ +#define SysTick_LOAD_RELOAD ((uint32_t)0x00FFFFFF) /*!< Value to load into the SysTick Current Value Register when the counter reaches 0 */ + +/***************** Bit definition for SysTick_VAL register ******************/ +#define SysTick_VAL_CURRENT ((uint32_t)0x00FFFFFF) /*!< Current value at the time the register is accessed */ + +/***************** Bit definition for SysTick_CALIB register ****************/ +#define SysTick_CALIB_TENMS ((uint32_t)0x00FFFFFF) /*!< Reload value to use for 10ms timing */ +#define SysTick_CALIB_SKEW ((uint32_t)0x40000000) /*!< Calibration value is not exactly 10 ms */ +#define SysTick_CALIB_NOREF ((uint32_t)0x80000000) /*!< The reference clock is not provided */ + +/******************************************************************************/ +/* */ +/* Nested Vectored Interrupt Controller */ +/* */ +/******************************************************************************/ + +/****************** Bit definition for NVIC_ISER register *******************/ +#define NVIC_ISER_SETENA ((uint32_t)0xFFFFFFFF) /*!< Interrupt set enable bits */ +#define NVIC_ISER_SETENA_0 ((uint32_t)0x00000001) /*!< bit 0 */ +#define NVIC_ISER_SETENA_1 ((uint32_t)0x00000002) /*!< bit 1 */ +#define NVIC_ISER_SETENA_2 ((uint32_t)0x00000004) /*!< bit 2 */ +#define NVIC_ISER_SETENA_3 ((uint32_t)0x00000008) /*!< bit 3 */ +#define NVIC_ISER_SETENA_4 ((uint32_t)0x00000010) /*!< bit 4 */ +#define NVIC_ISER_SETENA_5 ((uint32_t)0x00000020) /*!< bit 5 */ +#define NVIC_ISER_SETENA_6 ((uint32_t)0x00000040) /*!< bit 6 */ +#define NVIC_ISER_SETENA_7 ((uint32_t)0x00000080) /*!< bit 7 */ +#define NVIC_ISER_SETENA_8 ((uint32_t)0x00000100) /*!< bit 8 */ +#define NVIC_ISER_SETENA_9 ((uint32_t)0x00000200) /*!< bit 9 */ +#define NVIC_ISER_SETENA_10 ((uint32_t)0x00000400) /*!< bit 10 */ +#define NVIC_ISER_SETENA_11 ((uint32_t)0x00000800) /*!< bit 11 */ +#define NVIC_ISER_SETENA_12 ((uint32_t)0x00001000) /*!< bit 12 */ +#define NVIC_ISER_SETENA_13 ((uint32_t)0x00002000) /*!< bit 13 */ +#define NVIC_ISER_SETENA_14 ((uint32_t)0x00004000) /*!< bit 14 */ +#define NVIC_ISER_SETENA_15 ((uint32_t)0x00008000) /*!< bit 15 */ +#define NVIC_ISER_SETENA_16 ((uint32_t)0x00010000) /*!< bit 16 */ +#define NVIC_ISER_SETENA_17 ((uint32_t)0x00020000) /*!< bit 17 */ +#define NVIC_ISER_SETENA_18 ((uint32_t)0x00040000) /*!< bit 18 */ +#define NVIC_ISER_SETENA_19 ((uint32_t)0x00080000) /*!< bit 19 */ +#define NVIC_ISER_SETENA_20 ((uint32_t)0x00100000) /*!< bit 20 */ +#define NVIC_ISER_SETENA_21 ((uint32_t)0x00200000) /*!< bit 21 */ +#define NVIC_ISER_SETENA_22 ((uint32_t)0x00400000) /*!< bit 22 */ +#define NVIC_ISER_SETENA_23 ((uint32_t)0x00800000) /*!< bit 23 */ +#define NVIC_ISER_SETENA_24 ((uint32_t)0x01000000) /*!< bit 24 */ +#define NVIC_ISER_SETENA_25 ((uint32_t)0x02000000) /*!< bit 25 */ +#define NVIC_ISER_SETENA_26 ((uint32_t)0x04000000) /*!< bit 26 */ +#define NVIC_ISER_SETENA_27 ((uint32_t)0x08000000) /*!< bit 27 */ +#define NVIC_ISER_SETENA_28 ((uint32_t)0x10000000) /*!< bit 28 */ +#define NVIC_ISER_SETENA_29 ((uint32_t)0x20000000) /*!< bit 29 */ +#define NVIC_ISER_SETENA_30 ((uint32_t)0x40000000) /*!< bit 30 */ +#define NVIC_ISER_SETENA_31 ((uint32_t)0x80000000) /*!< bit 31 */ + +/****************** Bit definition for NVIC_ICER register *******************/ +#define NVIC_ICER_CLRENA ((uint32_t)0xFFFFFFFF) /*!< Interrupt clear-enable bits */ +#define NVIC_ICER_CLRENA_0 ((uint32_t)0x00000001) /*!< bit 0 */ +#define NVIC_ICER_CLRENA_1 ((uint32_t)0x00000002) /*!< bit 1 */ +#define NVIC_ICER_CLRENA_2 ((uint32_t)0x00000004) /*!< bit 2 */ +#define NVIC_ICER_CLRENA_3 ((uint32_t)0x00000008) /*!< bit 3 */ +#define NVIC_ICER_CLRENA_4 ((uint32_t)0x00000010) /*!< bit 4 */ +#define NVIC_ICER_CLRENA_5 ((uint32_t)0x00000020) /*!< bit 5 */ +#define NVIC_ICER_CLRENA_6 ((uint32_t)0x00000040) /*!< bit 6 */ +#define NVIC_ICER_CLRENA_7 ((uint32_t)0x00000080) /*!< bit 7 */ +#define NVIC_ICER_CLRENA_8 ((uint32_t)0x00000100) /*!< bit 8 */ +#define NVIC_ICER_CLRENA_9 ((uint32_t)0x00000200) /*!< bit 9 */ +#define NVIC_ICER_CLRENA_10 ((uint32_t)0x00000400) /*!< bit 10 */ +#define NVIC_ICER_CLRENA_11 ((uint32_t)0x00000800) /*!< bit 11 */ +#define NVIC_ICER_CLRENA_12 ((uint32_t)0x00001000) /*!< bit 12 */ +#define NVIC_ICER_CLRENA_13 ((uint32_t)0x00002000) /*!< bit 13 */ +#define NVIC_ICER_CLRENA_14 ((uint32_t)0x00004000) /*!< bit 14 */ +#define NVIC_ICER_CLRENA_15 ((uint32_t)0x00008000) /*!< bit 15 */ +#define NVIC_ICER_CLRENA_16 ((uint32_t)0x00010000) /*!< bit 16 */ +#define NVIC_ICER_CLRENA_17 ((uint32_t)0x00020000) /*!< bit 17 */ +#define NVIC_ICER_CLRENA_18 ((uint32_t)0x00040000) /*!< bit 18 */ +#define NVIC_ICER_CLRENA_19 ((uint32_t)0x00080000) /*!< bit 19 */ +#define NVIC_ICER_CLRENA_20 ((uint32_t)0x00100000) /*!< bit 20 */ +#define NVIC_ICER_CLRENA_21 ((uint32_t)0x00200000) /*!< bit 21 */ +#define NVIC_ICER_CLRENA_22 ((uint32_t)0x00400000) /*!< bit 22 */ +#define NVIC_ICER_CLRENA_23 ((uint32_t)0x00800000) /*!< bit 23 */ +#define NVIC_ICER_CLRENA_24 ((uint32_t)0x01000000) /*!< bit 24 */ +#define NVIC_ICER_CLRENA_25 ((uint32_t)0x02000000) /*!< bit 25 */ +#define NVIC_ICER_CLRENA_26 ((uint32_t)0x04000000) /*!< bit 26 */ +#define NVIC_ICER_CLRENA_27 ((uint32_t)0x08000000) /*!< bit 27 */ +#define NVIC_ICER_CLRENA_28 ((uint32_t)0x10000000) /*!< bit 28 */ +#define NVIC_ICER_CLRENA_29 ((uint32_t)0x20000000) /*!< bit 29 */ +#define NVIC_ICER_CLRENA_30 ((uint32_t)0x40000000) /*!< bit 30 */ +#define NVIC_ICER_CLRENA_31 ((uint32_t)0x80000000) /*!< bit 31 */ + +/****************** Bit definition for NVIC_ISPR register *******************/ +#define NVIC_ISPR_SETPEND ((uint32_t)0xFFFFFFFF) /*!< Interrupt set-pending bits */ +#define NVIC_ISPR_SETPEND_0 ((uint32_t)0x00000001) /*!< bit 0 */ +#define NVIC_ISPR_SETPEND_1 ((uint32_t)0x00000002) /*!< bit 1 */ +#define NVIC_ISPR_SETPEND_2 ((uint32_t)0x00000004) /*!< bit 2 */ +#define NVIC_ISPR_SETPEND_3 ((uint32_t)0x00000008) /*!< bit 3 */ +#define NVIC_ISPR_SETPEND_4 ((uint32_t)0x00000010) /*!< bit 4 */ +#define NVIC_ISPR_SETPEND_5 ((uint32_t)0x00000020) /*!< bit 5 */ +#define NVIC_ISPR_SETPEND_6 ((uint32_t)0x00000040) /*!< bit 6 */ +#define NVIC_ISPR_SETPEND_7 ((uint32_t)0x00000080) /*!< bit 7 */ +#define NVIC_ISPR_SETPEND_8 ((uint32_t)0x00000100) /*!< bit 8 */ +#define NVIC_ISPR_SETPEND_9 ((uint32_t)0x00000200) /*!< bit 9 */ +#define NVIC_ISPR_SETPEND_10 ((uint32_t)0x00000400) /*!< bit 10 */ +#define NVIC_ISPR_SETPEND_11 ((uint32_t)0x00000800) /*!< bit 11 */ +#define NVIC_ISPR_SETPEND_12 ((uint32_t)0x00001000) /*!< bit 12 */ +#define NVIC_ISPR_SETPEND_13 ((uint32_t)0x00002000) /*!< bit 13 */ +#define NVIC_ISPR_SETPEND_14 ((uint32_t)0x00004000) /*!< bit 14 */ +#define NVIC_ISPR_SETPEND_15 ((uint32_t)0x00008000) /*!< bit 15 */ +#define NVIC_ISPR_SETPEND_16 ((uint32_t)0x00010000) /*!< bit 16 */ +#define NVIC_ISPR_SETPEND_17 ((uint32_t)0x00020000) /*!< bit 17 */ +#define NVIC_ISPR_SETPEND_18 ((uint32_t)0x00040000) /*!< bit 18 */ +#define NVIC_ISPR_SETPEND_19 ((uint32_t)0x00080000) /*!< bit 19 */ +#define NVIC_ISPR_SETPEND_20 ((uint32_t)0x00100000) /*!< bit 20 */ +#define NVIC_ISPR_SETPEND_21 ((uint32_t)0x00200000) /*!< bit 21 */ +#define NVIC_ISPR_SETPEND_22 ((uint32_t)0x00400000) /*!< bit 22 */ +#define NVIC_ISPR_SETPEND_23 ((uint32_t)0x00800000) /*!< bit 23 */ +#define NVIC_ISPR_SETPEND_24 ((uint32_t)0x01000000) /*!< bit 24 */ +#define NVIC_ISPR_SETPEND_25 ((uint32_t)0x02000000) /*!< bit 25 */ +#define NVIC_ISPR_SETPEND_26 ((uint32_t)0x04000000) /*!< bit 26 */ +#define NVIC_ISPR_SETPEND_27 ((uint32_t)0x08000000) /*!< bit 27 */ +#define NVIC_ISPR_SETPEND_28 ((uint32_t)0x10000000) /*!< bit 28 */ +#define NVIC_ISPR_SETPEND_29 ((uint32_t)0x20000000) /*!< bit 29 */ +#define NVIC_ISPR_SETPEND_30 ((uint32_t)0x40000000) /*!< bit 30 */ +#define NVIC_ISPR_SETPEND_31 ((uint32_t)0x80000000) /*!< bit 31 */ + +/****************** Bit definition for NVIC_ICPR register *******************/ +#define NVIC_ICPR_CLRPEND ((uint32_t)0xFFFFFFFF) /*!< Interrupt clear-pending bits */ +#define NVIC_ICPR_CLRPEND_0 ((uint32_t)0x00000001) /*!< bit 0 */ +#define NVIC_ICPR_CLRPEND_1 ((uint32_t)0x00000002) /*!< bit 1 */ +#define NVIC_ICPR_CLRPEND_2 ((uint32_t)0x00000004) /*!< bit 2 */ +#define NVIC_ICPR_CLRPEND_3 ((uint32_t)0x00000008) /*!< bit 3 */ +#define NVIC_ICPR_CLRPEND_4 ((uint32_t)0x00000010) /*!< bit 4 */ +#define NVIC_ICPR_CLRPEND_5 ((uint32_t)0x00000020) /*!< bit 5 */ +#define NVIC_ICPR_CLRPEND_6 ((uint32_t)0x00000040) /*!< bit 6 */ +#define NVIC_ICPR_CLRPEND_7 ((uint32_t)0x00000080) /*!< bit 7 */ +#define NVIC_ICPR_CLRPEND_8 ((uint32_t)0x00000100) /*!< bit 8 */ +#define NVIC_ICPR_CLRPEND_9 ((uint32_t)0x00000200) /*!< bit 9 */ +#define NVIC_ICPR_CLRPEND_10 ((uint32_t)0x00000400) /*!< bit 10 */ +#define NVIC_ICPR_CLRPEND_11 ((uint32_t)0x00000800) /*!< bit 11 */ +#define NVIC_ICPR_CLRPEND_12 ((uint32_t)0x00001000) /*!< bit 12 */ +#define NVIC_ICPR_CLRPEND_13 ((uint32_t)0x00002000) /*!< bit 13 */ +#define NVIC_ICPR_CLRPEND_14 ((uint32_t)0x00004000) /*!< bit 14 */ +#define NVIC_ICPR_CLRPEND_15 ((uint32_t)0x00008000) /*!< bit 15 */ +#define NVIC_ICPR_CLRPEND_16 ((uint32_t)0x00010000) /*!< bit 16 */ +#define NVIC_ICPR_CLRPEND_17 ((uint32_t)0x00020000) /*!< bit 17 */ +#define NVIC_ICPR_CLRPEND_18 ((uint32_t)0x00040000) /*!< bit 18 */ +#define NVIC_ICPR_CLRPEND_19 ((uint32_t)0x00080000) /*!< bit 19 */ +#define NVIC_ICPR_CLRPEND_20 ((uint32_t)0x00100000) /*!< bit 20 */ +#define NVIC_ICPR_CLRPEND_21 ((uint32_t)0x00200000) /*!< bit 21 */ +#define NVIC_ICPR_CLRPEND_22 ((uint32_t)0x00400000) /*!< bit 22 */ +#define NVIC_ICPR_CLRPEND_23 ((uint32_t)0x00800000) /*!< bit 23 */ +#define NVIC_ICPR_CLRPEND_24 ((uint32_t)0x01000000) /*!< bit 24 */ +#define NVIC_ICPR_CLRPEND_25 ((uint32_t)0x02000000) /*!< bit 25 */ +#define NVIC_ICPR_CLRPEND_26 ((uint32_t)0x04000000) /*!< bit 26 */ +#define NVIC_ICPR_CLRPEND_27 ((uint32_t)0x08000000) /*!< bit 27 */ +#define NVIC_ICPR_CLRPEND_28 ((uint32_t)0x10000000) /*!< bit 28 */ +#define NVIC_ICPR_CLRPEND_29 ((uint32_t)0x20000000) /*!< bit 29 */ +#define NVIC_ICPR_CLRPEND_30 ((uint32_t)0x40000000) /*!< bit 30 */ +#define NVIC_ICPR_CLRPEND_31 ((uint32_t)0x80000000) /*!< bit 31 */ + +/****************** Bit definition for NVIC_IABR register *******************/ +#define NVIC_IABR_ACTIVE ((uint32_t)0xFFFFFFFF) /*!< Interrupt active flags */ +#define NVIC_IABR_ACTIVE_0 ((uint32_t)0x00000001) /*!< bit 0 */ +#define NVIC_IABR_ACTIVE_1 ((uint32_t)0x00000002) /*!< bit 1 */ +#define NVIC_IABR_ACTIVE_2 ((uint32_t)0x00000004) /*!< bit 2 */ +#define NVIC_IABR_ACTIVE_3 ((uint32_t)0x00000008) /*!< bit 3 */ +#define NVIC_IABR_ACTIVE_4 ((uint32_t)0x00000010) /*!< bit 4 */ +#define NVIC_IABR_ACTIVE_5 ((uint32_t)0x00000020) /*!< bit 5 */ +#define NVIC_IABR_ACTIVE_6 ((uint32_t)0x00000040) /*!< bit 6 */ +#define NVIC_IABR_ACTIVE_7 ((uint32_t)0x00000080) /*!< bit 7 */ +#define NVIC_IABR_ACTIVE_8 ((uint32_t)0x00000100) /*!< bit 8 */ +#define NVIC_IABR_ACTIVE_9 ((uint32_t)0x00000200) /*!< bit 9 */ +#define NVIC_IABR_ACTIVE_10 ((uint32_t)0x00000400) /*!< bit 10 */ +#define NVIC_IABR_ACTIVE_11 ((uint32_t)0x00000800) /*!< bit 11 */ +#define NVIC_IABR_ACTIVE_12 ((uint32_t)0x00001000) /*!< bit 12 */ +#define NVIC_IABR_ACTIVE_13 ((uint32_t)0x00002000) /*!< bit 13 */ +#define NVIC_IABR_ACTIVE_14 ((uint32_t)0x00004000) /*!< bit 14 */ +#define NVIC_IABR_ACTIVE_15 ((uint32_t)0x00008000) /*!< bit 15 */ +#define NVIC_IABR_ACTIVE_16 ((uint32_t)0x00010000) /*!< bit 16 */ +#define NVIC_IABR_ACTIVE_17 ((uint32_t)0x00020000) /*!< bit 17 */ +#define NVIC_IABR_ACTIVE_18 ((uint32_t)0x00040000) /*!< bit 18 */ +#define NVIC_IABR_ACTIVE_19 ((uint32_t)0x00080000) /*!< bit 19 */ +#define NVIC_IABR_ACTIVE_20 ((uint32_t)0x00100000) /*!< bit 20 */ +#define NVIC_IABR_ACTIVE_21 ((uint32_t)0x00200000) /*!< bit 21 */ +#define NVIC_IABR_ACTIVE_22 ((uint32_t)0x00400000) /*!< bit 22 */ +#define NVIC_IABR_ACTIVE_23 ((uint32_t)0x00800000) /*!< bit 23 */ +#define NVIC_IABR_ACTIVE_24 ((uint32_t)0x01000000) /*!< bit 24 */ +#define NVIC_IABR_ACTIVE_25 ((uint32_t)0x02000000) /*!< bit 25 */ +#define NVIC_IABR_ACTIVE_26 ((uint32_t)0x04000000) /*!< bit 26 */ +#define NVIC_IABR_ACTIVE_27 ((uint32_t)0x08000000) /*!< bit 27 */ +#define NVIC_IABR_ACTIVE_28 ((uint32_t)0x10000000) /*!< bit 28 */ +#define NVIC_IABR_ACTIVE_29 ((uint32_t)0x20000000) /*!< bit 29 */ +#define NVIC_IABR_ACTIVE_30 ((uint32_t)0x40000000) /*!< bit 30 */ +#define NVIC_IABR_ACTIVE_31 ((uint32_t)0x80000000) /*!< bit 31 */ + +/****************** Bit definition for NVIC_PRI0 register *******************/ +#define NVIC_IPR0_PRI_0 ((uint32_t)0x000000FF) /*!< Priority of interrupt 0 */ +#define NVIC_IPR0_PRI_1 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 1 */ +#define NVIC_IPR0_PRI_2 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 2 */ +#define NVIC_IPR0_PRI_3 ((uint32_t)0xFF000000) /*!< Priority of interrupt 3 */ + +/****************** Bit definition for NVIC_PRI1 register *******************/ +#define NVIC_IPR1_PRI_4 ((uint32_t)0x000000FF) /*!< Priority of interrupt 4 */ +#define NVIC_IPR1_PRI_5 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 5 */ +#define NVIC_IPR1_PRI_6 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 6 */ +#define NVIC_IPR1_PRI_7 ((uint32_t)0xFF000000) /*!< Priority of interrupt 7 */ + +/****************** Bit definition for NVIC_PRI2 register *******************/ +#define NVIC_IPR2_PRI_8 ((uint32_t)0x000000FF) /*!< Priority of interrupt 8 */ +#define NVIC_IPR2_PRI_9 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 9 */ +#define NVIC_IPR2_PRI_10 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 10 */ +#define NVIC_IPR2_PRI_11 ((uint32_t)0xFF000000) /*!< Priority of interrupt 11 */ + +/****************** Bit definition for NVIC_PRI3 register *******************/ +#define NVIC_IPR3_PRI_12 ((uint32_t)0x000000FF) /*!< Priority of interrupt 12 */ +#define NVIC_IPR3_PRI_13 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 13 */ +#define NVIC_IPR3_PRI_14 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 14 */ +#define NVIC_IPR3_PRI_15 ((uint32_t)0xFF000000) /*!< Priority of interrupt 15 */ + +/****************** Bit definition for NVIC_PRI4 register *******************/ +#define NVIC_IPR4_PRI_16 ((uint32_t)0x000000FF) /*!< Priority of interrupt 16 */ +#define NVIC_IPR4_PRI_17 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 17 */ +#define NVIC_IPR4_PRI_18 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 18 */ +#define NVIC_IPR4_PRI_19 ((uint32_t)0xFF000000) /*!< Priority of interrupt 19 */ + +/****************** Bit definition for NVIC_PRI5 register *******************/ +#define NVIC_IPR5_PRI_20 ((uint32_t)0x000000FF) /*!< Priority of interrupt 20 */ +#define NVIC_IPR5_PRI_21 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 21 */ +#define NVIC_IPR5_PRI_22 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 22 */ +#define NVIC_IPR5_PRI_23 ((uint32_t)0xFF000000) /*!< Priority of interrupt 23 */ + +/****************** Bit definition for NVIC_PRI6 register *******************/ +#define NVIC_IPR6_PRI_24 ((uint32_t)0x000000FF) /*!< Priority of interrupt 24 */ +#define NVIC_IPR6_PRI_25 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 25 */ +#define NVIC_IPR6_PRI_26 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 26 */ +#define NVIC_IPR6_PRI_27 ((uint32_t)0xFF000000) /*!< Priority of interrupt 27 */ + +/****************** Bit definition for NVIC_PRI7 register *******************/ +#define NVIC_IPR7_PRI_28 ((uint32_t)0x000000FF) /*!< Priority of interrupt 28 */ +#define NVIC_IPR7_PRI_29 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 29 */ +#define NVIC_IPR7_PRI_30 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 30 */ +#define NVIC_IPR7_PRI_31 ((uint32_t)0xFF000000) /*!< Priority of interrupt 31 */ + +/****************** Bit definition for SCB_CPUID register *******************/ +#define SCB_CPUID_REVISION ((uint32_t)0x0000000F) /*!< Implementation defined revision number */ +#define SCB_CPUID_PARTNO ((uint32_t)0x0000FFF0) /*!< Number of processor within family */ +#define SCB_CPUID_Constant ((uint32_t)0x000F0000) /*!< Reads as 0x0F */ +#define SCB_CPUID_VARIANT ((uint32_t)0x00F00000) /*!< Implementation defined variant number */ +#define SCB_CPUID_IMPLEMENTER ((uint32_t)0xFF000000) /*!< Implementer code. ARM is 0x41 */ + +/******************* Bit definition for SCB_ICSR register *******************/ +#define SCB_ICSR_VECTACTIVE ((uint32_t)0x000001FF) /*!< Active ISR number field */ +#define SCB_ICSR_RETTOBASE ((uint32_t)0x00000800) /*!< All active exceptions minus the IPSR_current_exception yields the empty set */ +#define SCB_ICSR_VECTPENDING ((uint32_t)0x003FF000) /*!< Pending ISR number field */ +#define SCB_ICSR_ISRPENDING ((uint32_t)0x00400000) /*!< Interrupt pending flag */ +#define SCB_ICSR_ISRPREEMPT ((uint32_t)0x00800000) /*!< It indicates that a pending interrupt becomes active in the next running cycle */ +#define SCB_ICSR_PENDSTCLR ((uint32_t)0x02000000) /*!< Clear pending SysTick bit */ +#define SCB_ICSR_PENDSTSET ((uint32_t)0x04000000) /*!< Set pending SysTick bit */ +#define SCB_ICSR_PENDSVCLR ((uint32_t)0x08000000) /*!< Clear pending pendSV bit */ +#define SCB_ICSR_PENDSVSET ((uint32_t)0x10000000) /*!< Set pending pendSV bit */ +#define SCB_ICSR_NMIPENDSET ((uint32_t)0x80000000) /*!< Set pending NMI bit */ + +/******************* Bit definition for SCB_VTOR register *******************/ +#define SCB_VTOR_TBLOFF ((uint32_t)0x1FFFFF80) /*!< Vector table base offset field */ +#define SCB_VTOR_TBLBASE ((uint32_t)0x20000000) /*!< Table base in code(0) or RAM(1) */ + +/*!<***************** Bit definition for SCB_AIRCR register *******************/ +#define SCB_AIRCR_VECTRESET ((uint32_t)0x00000001) /*!< System Reset bit */ +#define SCB_AIRCR_VECTCLRACTIVE ((uint32_t)0x00000002) /*!< Clear active vector bit */ +#define SCB_AIRCR_SYSRESETREQ ((uint32_t)0x00000004) /*!< Requests chip control logic to generate a reset */ + +#define SCB_AIRCR_PRIGROUP ((uint32_t)0x00000700) /*!< PRIGROUP[2:0] bits (Priority group) */ +#define SCB_AIRCR_PRIGROUP_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define SCB_AIRCR_PRIGROUP_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define SCB_AIRCR_PRIGROUP_2 ((uint32_t)0x00000400) /*!< Bit 2 */ + +/* prority group configuration */ +#define SCB_AIRCR_PRIGROUP0 ((uint32_t)0x00000000) /*!< Priority group=0 (7 bits of pre-emption priority, 1 bit of subpriority) */ +#define SCB_AIRCR_PRIGROUP1 ((uint32_t)0x00000100) /*!< Priority group=1 (6 bits of pre-emption priority, 2 bits of subpriority) */ +#define SCB_AIRCR_PRIGROUP2 ((uint32_t)0x00000200) /*!< Priority group=2 (5 bits of pre-emption priority, 3 bits of subpriority) */ +#define SCB_AIRCR_PRIGROUP3 ((uint32_t)0x00000300) /*!< Priority group=3 (4 bits of pre-emption priority, 4 bits of subpriority) */ +#define SCB_AIRCR_PRIGROUP4 ((uint32_t)0x00000400) /*!< Priority group=4 (3 bits of pre-emption priority, 5 bits of subpriority) */ +#define SCB_AIRCR_PRIGROUP5 ((uint32_t)0x00000500) /*!< Priority group=5 (2 bits of pre-emption priority, 6 bits of subpriority) */ +#define SCB_AIRCR_PRIGROUP6 ((uint32_t)0x00000600) /*!< Priority group=6 (1 bit of pre-emption priority, 7 bits of subpriority) */ +#define SCB_AIRCR_PRIGROUP7 ((uint32_t)0x00000700) /*!< Priority group=7 (no pre-emption priority, 8 bits of subpriority) */ + +#define SCB_AIRCR_ENDIANESS ((uint32_t)0x00008000) /*!< Data endianness bit */ +#define SCB_AIRCR_VECTKEY ((uint32_t)0xFFFF0000) /*!< Register key (VECTKEY) - Reads as 0xFA05 (VECTKEYSTAT) */ + +/******************* Bit definition for SCB_SCR register ********************/ +#define SCB_SCR_SLEEPONEXIT ((uint8_t)0x02) /*!< Sleep on exit bit */ +#define SCB_SCR_SLEEPDEEP ((uint8_t)0x04) /*!< Sleep deep bit */ +#define SCB_SCR_SEVONPEND ((uint8_t)0x10) /*!< Wake up from WFE */ + +/******************** Bit definition for SCB_CCR register *******************/ +#define SCB_CCR_NONBASETHRDENA ((uint16_t)0x0001) /*!< Thread mode can be entered from any level in Handler mode by controlled return value */ +#define SCB_CCR_USERSETMPEND ((uint16_t)0x0002) /*!< Enables user code to write the Software Trigger Interrupt register to trigger (pend) a Main exception */ +#define SCB_CCR_UNALIGN_TRP ((uint16_t)0x0008) /*!< Trap for unaligned access */ +#define SCB_CCR_DIV_0_TRP ((uint16_t)0x0010) /*!< Trap on Divide by 0 */ +#define SCB_CCR_BFHFNMIGN ((uint16_t)0x0100) /*!< Handlers running at priority -1 and -2 */ +#define SCB_CCR_STKALIGN ((uint16_t)0x0200) /*!< On exception entry, the SP used prior to the exception is adjusted to be 8-byte aligned */ + +/******************* Bit definition for SCB_SHPR register ********************/ +#define SCB_SHPR_PRI_N ((uint32_t)0x000000FF) /*!< Priority of system handler 4,8, and 12. Mem Manage, reserved and Debug Monitor */ +#define SCB_SHPR_PRI_N1 ((uint32_t)0x0000FF00) /*!< Priority of system handler 5,9, and 13. Bus Fault, reserved and reserved */ +#define SCB_SHPR_PRI_N2 ((uint32_t)0x00FF0000) /*!< Priority of system handler 6,10, and 14. Usage Fault, reserved and PendSV */ +#define SCB_SHPR_PRI_N3 ((uint32_t)0xFF000000) /*!< Priority of system handler 7,11, and 15. Reserved, SVCall and SysTick */ + +/****************** Bit definition for SCB_SHCSR register *******************/ +#define SCB_SHCSR_MEMFAULTACT ((uint32_t)0x00000001) /*!< MemManage is active */ +#define SCB_SHCSR_BUSFAULTACT ((uint32_t)0x00000002) /*!< BusFault is active */ +#define SCB_SHCSR_USGFAULTACT ((uint32_t)0x00000008) /*!< UsageFault is active */ +#define SCB_SHCSR_SVCALLACT ((uint32_t)0x00000080) /*!< SVCall is active */ +#define SCB_SHCSR_MONITORACT ((uint32_t)0x00000100) /*!< Monitor is active */ +#define SCB_SHCSR_PENDSVACT ((uint32_t)0x00000400) /*!< PendSV is active */ +#define SCB_SHCSR_SYSTICKACT ((uint32_t)0x00000800) /*!< SysTick is active */ +#define SCB_SHCSR_USGFAULTPENDED ((uint32_t)0x00001000) /*!< Usage Fault is pended */ +#define SCB_SHCSR_MEMFAULTPENDED ((uint32_t)0x00002000) /*!< MemManage is pended */ +#define SCB_SHCSR_BUSFAULTPENDED ((uint32_t)0x00004000) /*!< Bus Fault is pended */ +#define SCB_SHCSR_SVCALLPENDED ((uint32_t)0x00008000) /*!< SVCall is pended */ +#define SCB_SHCSR_MEMFAULTENA ((uint32_t)0x00010000) /*!< MemManage enable */ +#define SCB_SHCSR_BUSFAULTENA ((uint32_t)0x00020000) /*!< Bus Fault enable */ +#define SCB_SHCSR_USGFAULTENA ((uint32_t)0x00040000) /*!< UsageFault enable */ + +/******************* Bit definition for SCB_CFSR register *******************/ +/*!< MFSR */ +#define SCB_CFSR_IACCVIOL ((uint32_t)0x00000001) /*!< Instruction access violation */ +#define SCB_CFSR_DACCVIOL ((uint32_t)0x00000002) /*!< Data access violation */ +#define SCB_CFSR_MUNSTKERR ((uint32_t)0x00000008) /*!< Unstacking error */ +#define SCB_CFSR_MSTKERR ((uint32_t)0x00000010) /*!< Stacking error */ +#define SCB_CFSR_MMARVALID ((uint32_t)0x00000080) /*!< Memory Manage Address Register address valid flag */ +/*!< BFSR */ +#define SCB_CFSR_IBUSERR ((uint32_t)0x00000100) /*!< Instruction bus error flag */ +#define SCB_CFSR_PRECISERR ((uint32_t)0x00000200) /*!< Precise data bus error */ +#define SCB_CFSR_IMPRECISERR ((uint32_t)0x00000400) /*!< Imprecise data bus error */ +#define SCB_CFSR_UNSTKERR ((uint32_t)0x00000800) /*!< Unstacking error */ +#define SCB_CFSR_STKERR ((uint32_t)0x00001000) /*!< Stacking error */ +#define SCB_CFSR_BFARVALID ((uint32_t)0x00008000) /*!< Bus Fault Address Register address valid flag */ +/*!< UFSR */ +#define SCB_CFSR_UNDEFINSTR ((uint32_t)0x00010000) /*!< The processor attempt to execute an undefined instruction */ +#define SCB_CFSR_INVSTATE ((uint32_t)0x00020000) /*!< Invalid combination of EPSR and instruction */ +#define SCB_CFSR_INVPC ((uint32_t)0x00040000) /*!< Attempt to load EXC_RETURN into pc illegally */ +#define SCB_CFSR_NOCP ((uint32_t)0x00080000) /*!< Attempt to use a coprocessor instruction */ +#define SCB_CFSR_UNALIGNED ((uint32_t)0x01000000) /*!< Fault occurs when there is an attempt to make an unaligned memory access */ +#define SCB_CFSR_DIVBYZERO ((uint32_t)0x02000000) /*!< Fault occurs when SDIV or DIV instruction is used with a divisor of 0 */ + +/******************* Bit definition for SCB_HFSR register *******************/ +#define SCB_HFSR_VECTTBL ((uint32_t)0x00000002) /*!< Fault occurs because of vector table read on exception processing */ +#define SCB_HFSR_FORCED ((uint32_t)0x40000000) /*!< Hard Fault activated when a configurable Fault was received and cannot activate */ +#define SCB_HFSR_DEBUGEVT ((uint32_t)0x80000000) /*!< Fault related to debug */ + +/******************* Bit definition for SCB_DFSR register *******************/ +#define SCB_DFSR_HALTED ((uint8_t)0x01) /*!< Halt request flag */ +#define SCB_DFSR_BKPT ((uint8_t)0x02) /*!< BKPT flag */ +#define SCB_DFSR_DWTTRAP ((uint8_t)0x04) /*!< Data Watchpoint and Trace (DWT) flag */ +#define SCB_DFSR_VCATCH ((uint8_t)0x08) /*!< Vector catch flag */ +#define SCB_DFSR_EXTERNAL ((uint8_t)0x10) /*!< External debug request flag */ + +/******************* Bit definition for SCB_MMFAR register ******************/ +#define SCB_MMFAR_ADDRESS ((uint32_t)0xFFFFFFFF) /*!< Mem Manage fault address field */ + +/******************* Bit definition for SCB_BFAR register *******************/ +#define SCB_BFAR_ADDRESS ((uint32_t)0xFFFFFFFF) /*!< Bus fault address field */ + +/******************* Bit definition for SCB_afsr register *******************/ +#define SCB_AFSR_IMPDEF ((uint32_t)0xFFFFFFFF) /*!< Implementation defined */ + +/******************************************************************************/ +/* */ +/* External Interrupt/Event Controller */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for EXTI_IMR register *******************/ +#define EXTI_IMR_MR0 ((uint32_t)0x00000001) /*!< Interrupt Mask on line 0 */ +#define EXTI_IMR_MR1 ((uint32_t)0x00000002) /*!< Interrupt Mask on line 1 */ +#define EXTI_IMR_MR2 ((uint32_t)0x00000004) /*!< Interrupt Mask on line 2 */ +#define EXTI_IMR_MR3 ((uint32_t)0x00000008) /*!< Interrupt Mask on line 3 */ +#define EXTI_IMR_MR4 ((uint32_t)0x00000010) /*!< Interrupt Mask on line 4 */ +#define EXTI_IMR_MR5 ((uint32_t)0x00000020) /*!< Interrupt Mask on line 5 */ +#define EXTI_IMR_MR6 ((uint32_t)0x00000040) /*!< Interrupt Mask on line 6 */ +#define EXTI_IMR_MR7 ((uint32_t)0x00000080) /*!< Interrupt Mask on line 7 */ +#define EXTI_IMR_MR8 ((uint32_t)0x00000100) /*!< Interrupt Mask on line 8 */ +#define EXTI_IMR_MR9 ((uint32_t)0x00000200) /*!< Interrupt Mask on line 9 */ +#define EXTI_IMR_MR10 ((uint32_t)0x00000400) /*!< Interrupt Mask on line 10 */ +#define EXTI_IMR_MR11 ((uint32_t)0x00000800) /*!< Interrupt Mask on line 11 */ +#define EXTI_IMR_MR12 ((uint32_t)0x00001000) /*!< Interrupt Mask on line 12 */ +#define EXTI_IMR_MR13 ((uint32_t)0x00002000) /*!< Interrupt Mask on line 13 */ +#define EXTI_IMR_MR14 ((uint32_t)0x00004000) /*!< Interrupt Mask on line 14 */ +#define EXTI_IMR_MR15 ((uint32_t)0x00008000) /*!< Interrupt Mask on line 15 */ +#define EXTI_IMR_MR16 ((uint32_t)0x00010000) /*!< Interrupt Mask on line 16 */ +#define EXTI_IMR_MR17 ((uint32_t)0x00020000) /*!< Interrupt Mask on line 17 */ +#define EXTI_IMR_MR18 ((uint32_t)0x00040000) /*!< Interrupt Mask on line 18 */ +#define EXTI_IMR_MR19 ((uint32_t)0x00080000) /*!< Interrupt Mask on line 19 */ + +/******************* Bit definition for EXTI_EMR register *******************/ +#define EXTI_EMR_MR0 ((uint32_t)0x00000001) /*!< Event Mask on line 0 */ +#define EXTI_EMR_MR1 ((uint32_t)0x00000002) /*!< Event Mask on line 1 */ +#define EXTI_EMR_MR2 ((uint32_t)0x00000004) /*!< Event Mask on line 2 */ +#define EXTI_EMR_MR3 ((uint32_t)0x00000008) /*!< Event Mask on line 3 */ +#define EXTI_EMR_MR4 ((uint32_t)0x00000010) /*!< Event Mask on line 4 */ +#define EXTI_EMR_MR5 ((uint32_t)0x00000020) /*!< Event Mask on line 5 */ +#define EXTI_EMR_MR6 ((uint32_t)0x00000040) /*!< Event Mask on line 6 */ +#define EXTI_EMR_MR7 ((uint32_t)0x00000080) /*!< Event Mask on line 7 */ +#define EXTI_EMR_MR8 ((uint32_t)0x00000100) /*!< Event Mask on line 8 */ +#define EXTI_EMR_MR9 ((uint32_t)0x00000200) /*!< Event Mask on line 9 */ +#define EXTI_EMR_MR10 ((uint32_t)0x00000400) /*!< Event Mask on line 10 */ +#define EXTI_EMR_MR11 ((uint32_t)0x00000800) /*!< Event Mask on line 11 */ +#define EXTI_EMR_MR12 ((uint32_t)0x00001000) /*!< Event Mask on line 12 */ +#define EXTI_EMR_MR13 ((uint32_t)0x00002000) /*!< Event Mask on line 13 */ +#define EXTI_EMR_MR14 ((uint32_t)0x00004000) /*!< Event Mask on line 14 */ +#define EXTI_EMR_MR15 ((uint32_t)0x00008000) /*!< Event Mask on line 15 */ +#define EXTI_EMR_MR16 ((uint32_t)0x00010000) /*!< Event Mask on line 16 */ +#define EXTI_EMR_MR17 ((uint32_t)0x00020000) /*!< Event Mask on line 17 */ +#define EXTI_EMR_MR18 ((uint32_t)0x00040000) /*!< Event Mask on line 18 */ +#define EXTI_EMR_MR19 ((uint32_t)0x00080000) /*!< Event Mask on line 19 */ + +/****************** Bit definition for EXTI_RTSR register *******************/ +#define EXTI_RTSR_TR0 ((uint32_t)0x00000001) /*!< Rising trigger event configuration bit of line 0 */ +#define EXTI_RTSR_TR1 ((uint32_t)0x00000002) /*!< Rising trigger event configuration bit of line 1 */ +#define EXTI_RTSR_TR2 ((uint32_t)0x00000004) /*!< Rising trigger event configuration bit of line 2 */ +#define EXTI_RTSR_TR3 ((uint32_t)0x00000008) /*!< Rising trigger event configuration bit of line 3 */ +#define EXTI_RTSR_TR4 ((uint32_t)0x00000010) /*!< Rising trigger event configuration bit of line 4 */ +#define EXTI_RTSR_TR5 ((uint32_t)0x00000020) /*!< Rising trigger event configuration bit of line 5 */ +#define EXTI_RTSR_TR6 ((uint32_t)0x00000040) /*!< Rising trigger event configuration bit of line 6 */ +#define EXTI_RTSR_TR7 ((uint32_t)0x00000080) /*!< Rising trigger event configuration bit of line 7 */ +#define EXTI_RTSR_TR8 ((uint32_t)0x00000100) /*!< Rising trigger event configuration bit of line 8 */ +#define EXTI_RTSR_TR9 ((uint32_t)0x00000200) /*!< Rising trigger event configuration bit of line 9 */ +#define EXTI_RTSR_TR10 ((uint32_t)0x00000400) /*!< Rising trigger event configuration bit of line 10 */ +#define EXTI_RTSR_TR11 ((uint32_t)0x00000800) /*!< Rising trigger event configuration bit of line 11 */ +#define EXTI_RTSR_TR12 ((uint32_t)0x00001000) /*!< Rising trigger event configuration bit of line 12 */ +#define EXTI_RTSR_TR13 ((uint32_t)0x00002000) /*!< Rising trigger event configuration bit of line 13 */ +#define EXTI_RTSR_TR14 ((uint32_t)0x00004000) /*!< Rising trigger event configuration bit of line 14 */ +#define EXTI_RTSR_TR15 ((uint32_t)0x00008000) /*!< Rising trigger event configuration bit of line 15 */ +#define EXTI_RTSR_TR16 ((uint32_t)0x00010000) /*!< Rising trigger event configuration bit of line 16 */ +#define EXTI_RTSR_TR17 ((uint32_t)0x00020000) /*!< Rising trigger event configuration bit of line 17 */ +#define EXTI_RTSR_TR18 ((uint32_t)0x00040000) /*!< Rising trigger event configuration bit of line 18 */ +#define EXTI_RTSR_TR19 ((uint32_t)0x00080000) /*!< Rising trigger event configuration bit of line 19 */ + +/****************** Bit definition for EXTI_FTSR register *******************/ +#define EXTI_FTSR_TR0 ((uint32_t)0x00000001) /*!< Falling trigger event configuration bit of line 0 */ +#define EXTI_FTSR_TR1 ((uint32_t)0x00000002) /*!< Falling trigger event configuration bit of line 1 */ +#define EXTI_FTSR_TR2 ((uint32_t)0x00000004) /*!< Falling trigger event configuration bit of line 2 */ +#define EXTI_FTSR_TR3 ((uint32_t)0x00000008) /*!< Falling trigger event configuration bit of line 3 */ +#define EXTI_FTSR_TR4 ((uint32_t)0x00000010) /*!< Falling trigger event configuration bit of line 4 */ +#define EXTI_FTSR_TR5 ((uint32_t)0x00000020) /*!< Falling trigger event configuration bit of line 5 */ +#define EXTI_FTSR_TR6 ((uint32_t)0x00000040) /*!< Falling trigger event configuration bit of line 6 */ +#define EXTI_FTSR_TR7 ((uint32_t)0x00000080) /*!< Falling trigger event configuration bit of line 7 */ +#define EXTI_FTSR_TR8 ((uint32_t)0x00000100) /*!< Falling trigger event configuration bit of line 8 */ +#define EXTI_FTSR_TR9 ((uint32_t)0x00000200) /*!< Falling trigger event configuration bit of line 9 */ +#define EXTI_FTSR_TR10 ((uint32_t)0x00000400) /*!< Falling trigger event configuration bit of line 10 */ +#define EXTI_FTSR_TR11 ((uint32_t)0x00000800) /*!< Falling trigger event configuration bit of line 11 */ +#define EXTI_FTSR_TR12 ((uint32_t)0x00001000) /*!< Falling trigger event configuration bit of line 12 */ +#define EXTI_FTSR_TR13 ((uint32_t)0x00002000) /*!< Falling trigger event configuration bit of line 13 */ +#define EXTI_FTSR_TR14 ((uint32_t)0x00004000) /*!< Falling trigger event configuration bit of line 14 */ +#define EXTI_FTSR_TR15 ((uint32_t)0x00008000) /*!< Falling trigger event configuration bit of line 15 */ +#define EXTI_FTSR_TR16 ((uint32_t)0x00010000) /*!< Falling trigger event configuration bit of line 16 */ +#define EXTI_FTSR_TR17 ((uint32_t)0x00020000) /*!< Falling trigger event configuration bit of line 17 */ +#define EXTI_FTSR_TR18 ((uint32_t)0x00040000) /*!< Falling trigger event configuration bit of line 18 */ +#define EXTI_FTSR_TR19 ((uint32_t)0x00080000) /*!< Falling trigger event configuration bit of line 19 */ + +/****************** Bit definition for EXTI_SWIER register ******************/ +#define EXTI_SWIER_SWIER0 ((uint32_t)0x00000001) /*!< Software Interrupt on line 0 */ +#define EXTI_SWIER_SWIER1 ((uint32_t)0x00000002) /*!< Software Interrupt on line 1 */ +#define EXTI_SWIER_SWIER2 ((uint32_t)0x00000004) /*!< Software Interrupt on line 2 */ +#define EXTI_SWIER_SWIER3 ((uint32_t)0x00000008) /*!< Software Interrupt on line 3 */ +#define EXTI_SWIER_SWIER4 ((uint32_t)0x00000010) /*!< Software Interrupt on line 4 */ +#define EXTI_SWIER_SWIER5 ((uint32_t)0x00000020) /*!< Software Interrupt on line 5 */ +#define EXTI_SWIER_SWIER6 ((uint32_t)0x00000040) /*!< Software Interrupt on line 6 */ +#define EXTI_SWIER_SWIER7 ((uint32_t)0x00000080) /*!< Software Interrupt on line 7 */ +#define EXTI_SWIER_SWIER8 ((uint32_t)0x00000100) /*!< Software Interrupt on line 8 */ +#define EXTI_SWIER_SWIER9 ((uint32_t)0x00000200) /*!< Software Interrupt on line 9 */ +#define EXTI_SWIER_SWIER10 ((uint32_t)0x00000400) /*!< Software Interrupt on line 10 */ +#define EXTI_SWIER_SWIER11 ((uint32_t)0x00000800) /*!< Software Interrupt on line 11 */ +#define EXTI_SWIER_SWIER12 ((uint32_t)0x00001000) /*!< Software Interrupt on line 12 */ +#define EXTI_SWIER_SWIER13 ((uint32_t)0x00002000) /*!< Software Interrupt on line 13 */ +#define EXTI_SWIER_SWIER14 ((uint32_t)0x00004000) /*!< Software Interrupt on line 14 */ +#define EXTI_SWIER_SWIER15 ((uint32_t)0x00008000) /*!< Software Interrupt on line 15 */ +#define EXTI_SWIER_SWIER16 ((uint32_t)0x00010000) /*!< Software Interrupt on line 16 */ +#define EXTI_SWIER_SWIER17 ((uint32_t)0x00020000) /*!< Software Interrupt on line 17 */ +#define EXTI_SWIER_SWIER18 ((uint32_t)0x00040000) /*!< Software Interrupt on line 18 */ +#define EXTI_SWIER_SWIER19 ((uint32_t)0x00080000) /*!< Software Interrupt on line 19 */ + +/******************* Bit definition for EXTI_PR register ********************/ +#define EXTI_PR_PR0 ((uint32_t)0x00000001) /*!< Pending bit for line 0 */ +#define EXTI_PR_PR1 ((uint32_t)0x00000002) /*!< Pending bit for line 1 */ +#define EXTI_PR_PR2 ((uint32_t)0x00000004) /*!< Pending bit for line 2 */ +#define EXTI_PR_PR3 ((uint32_t)0x00000008) /*!< Pending bit for line 3 */ +#define EXTI_PR_PR4 ((uint32_t)0x00000010) /*!< Pending bit for line 4 */ +#define EXTI_PR_PR5 ((uint32_t)0x00000020) /*!< Pending bit for line 5 */ +#define EXTI_PR_PR6 ((uint32_t)0x00000040) /*!< Pending bit for line 6 */ +#define EXTI_PR_PR7 ((uint32_t)0x00000080) /*!< Pending bit for line 7 */ +#define EXTI_PR_PR8 ((uint32_t)0x00000100) /*!< Pending bit for line 8 */ +#define EXTI_PR_PR9 ((uint32_t)0x00000200) /*!< Pending bit for line 9 */ +#define EXTI_PR_PR10 ((uint32_t)0x00000400) /*!< Pending bit for line 10 */ +#define EXTI_PR_PR11 ((uint32_t)0x00000800) /*!< Pending bit for line 11 */ +#define EXTI_PR_PR12 ((uint32_t)0x00001000) /*!< Pending bit for line 12 */ +#define EXTI_PR_PR13 ((uint32_t)0x00002000) /*!< Pending bit for line 13 */ +#define EXTI_PR_PR14 ((uint32_t)0x00004000) /*!< Pending bit for line 14 */ +#define EXTI_PR_PR15 ((uint32_t)0x00008000) /*!< Pending bit for line 15 */ +#define EXTI_PR_PR16 ((uint32_t)0x00010000) /*!< Pending bit for line 16 */ +#define EXTI_PR_PR17 ((uint32_t)0x00020000) /*!< Pending bit for line 17 */ +#define EXTI_PR_PR18 ((uint32_t)0x00040000) /*!< Pending bit for line 18 */ +#define EXTI_PR_PR19 ((uint32_t)0x00080000) /*!< Pending bit for line 19 */ + +/******************************************************************************/ +/* */ +/* DMA Controller */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for DMA_ISR register ********************/ +#define DMA_ISR_GIF1 ((uint32_t)0x00000001) /*!< Channel 1 Global interrupt flag */ +#define DMA_ISR_TCIF1 ((uint32_t)0x00000002) /*!< Channel 1 Transfer Complete flag */ +#define DMA_ISR_HTIF1 ((uint32_t)0x00000004) /*!< Channel 1 Half Transfer flag */ +#define DMA_ISR_TEIF1 ((uint32_t)0x00000008) /*!< Channel 1 Transfer Error flag */ +#define DMA_ISR_GIF2 ((uint32_t)0x00000010) /*!< Channel 2 Global interrupt flag */ +#define DMA_ISR_TCIF2 ((uint32_t)0x00000020) /*!< Channel 2 Transfer Complete flag */ +#define DMA_ISR_HTIF2 ((uint32_t)0x00000040) /*!< Channel 2 Half Transfer flag */ +#define DMA_ISR_TEIF2 ((uint32_t)0x00000080) /*!< Channel 2 Transfer Error flag */ +#define DMA_ISR_GIF3 ((uint32_t)0x00000100) /*!< Channel 3 Global interrupt flag */ +#define DMA_ISR_TCIF3 ((uint32_t)0x00000200) /*!< Channel 3 Transfer Complete flag */ +#define DMA_ISR_HTIF3 ((uint32_t)0x00000400) /*!< Channel 3 Half Transfer flag */ +#define DMA_ISR_TEIF3 ((uint32_t)0x00000800) /*!< Channel 3 Transfer Error flag */ +#define DMA_ISR_GIF4 ((uint32_t)0x00001000) /*!< Channel 4 Global interrupt flag */ +#define DMA_ISR_TCIF4 ((uint32_t)0x00002000) /*!< Channel 4 Transfer Complete flag */ +#define DMA_ISR_HTIF4 ((uint32_t)0x00004000) /*!< Channel 4 Half Transfer flag */ +#define DMA_ISR_TEIF4 ((uint32_t)0x00008000) /*!< Channel 4 Transfer Error flag */ +#define DMA_ISR_GIF5 ((uint32_t)0x00010000) /*!< Channel 5 Global interrupt flag */ +#define DMA_ISR_TCIF5 ((uint32_t)0x00020000) /*!< Channel 5 Transfer Complete flag */ +#define DMA_ISR_HTIF5 ((uint32_t)0x00040000) /*!< Channel 5 Half Transfer flag */ +#define DMA_ISR_TEIF5 ((uint32_t)0x00080000) /*!< Channel 5 Transfer Error flag */ +#define DMA_ISR_GIF6 ((uint32_t)0x00100000) /*!< Channel 6 Global interrupt flag */ +#define DMA_ISR_TCIF6 ((uint32_t)0x00200000) /*!< Channel 6 Transfer Complete flag */ +#define DMA_ISR_HTIF6 ((uint32_t)0x00400000) /*!< Channel 6 Half Transfer flag */ +#define DMA_ISR_TEIF6 ((uint32_t)0x00800000) /*!< Channel 6 Transfer Error flag */ +#define DMA_ISR_GIF7 ((uint32_t)0x01000000) /*!< Channel 7 Global interrupt flag */ +#define DMA_ISR_TCIF7 ((uint32_t)0x02000000) /*!< Channel 7 Transfer Complete flag */ +#define DMA_ISR_HTIF7 ((uint32_t)0x04000000) /*!< Channel 7 Half Transfer flag */ +#define DMA_ISR_TEIF7 ((uint32_t)0x08000000) /*!< Channel 7 Transfer Error flag */ + +/******************* Bit definition for DMA_IFCR register *******************/ +#define DMA_IFCR_CGIF1 ((uint32_t)0x00000001) /*!< Channel 1 Global interrupt clear */ +#define DMA_IFCR_CTCIF1 ((uint32_t)0x00000002) /*!< Channel 1 Transfer Complete clear */ +#define DMA_IFCR_CHTIF1 ((uint32_t)0x00000004) /*!< Channel 1 Half Transfer clear */ +#define DMA_IFCR_CTEIF1 ((uint32_t)0x00000008) /*!< Channel 1 Transfer Error clear */ +#define DMA_IFCR_CGIF2 ((uint32_t)0x00000010) /*!< Channel 2 Global interrupt clear */ +#define DMA_IFCR_CTCIF2 ((uint32_t)0x00000020) /*!< Channel 2 Transfer Complete clear */ +#define DMA_IFCR_CHTIF2 ((uint32_t)0x00000040) /*!< Channel 2 Half Transfer clear */ +#define DMA_IFCR_CTEIF2 ((uint32_t)0x00000080) /*!< Channel 2 Transfer Error clear */ +#define DMA_IFCR_CGIF3 ((uint32_t)0x00000100) /*!< Channel 3 Global interrupt clear */ +#define DMA_IFCR_CTCIF3 ((uint32_t)0x00000200) /*!< Channel 3 Transfer Complete clear */ +#define DMA_IFCR_CHTIF3 ((uint32_t)0x00000400) /*!< Channel 3 Half Transfer clear */ +#define DMA_IFCR_CTEIF3 ((uint32_t)0x00000800) /*!< Channel 3 Transfer Error clear */ +#define DMA_IFCR_CGIF4 ((uint32_t)0x00001000) /*!< Channel 4 Global interrupt clear */ +#define DMA_IFCR_CTCIF4 ((uint32_t)0x00002000) /*!< Channel 4 Transfer Complete clear */ +#define DMA_IFCR_CHTIF4 ((uint32_t)0x00004000) /*!< Channel 4 Half Transfer clear */ +#define DMA_IFCR_CTEIF4 ((uint32_t)0x00008000) /*!< Channel 4 Transfer Error clear */ +#define DMA_IFCR_CGIF5 ((uint32_t)0x00010000) /*!< Channel 5 Global interrupt clear */ +#define DMA_IFCR_CTCIF5 ((uint32_t)0x00020000) /*!< Channel 5 Transfer Complete clear */ +#define DMA_IFCR_CHTIF5 ((uint32_t)0x00040000) /*!< Channel 5 Half Transfer clear */ +#define DMA_IFCR_CTEIF5 ((uint32_t)0x00080000) /*!< Channel 5 Transfer Error clear */ +#define DMA_IFCR_CGIF6 ((uint32_t)0x00100000) /*!< Channel 6 Global interrupt clear */ +#define DMA_IFCR_CTCIF6 ((uint32_t)0x00200000) /*!< Channel 6 Transfer Complete clear */ +#define DMA_IFCR_CHTIF6 ((uint32_t)0x00400000) /*!< Channel 6 Half Transfer clear */ +#define DMA_IFCR_CTEIF6 ((uint32_t)0x00800000) /*!< Channel 6 Transfer Error clear */ +#define DMA_IFCR_CGIF7 ((uint32_t)0x01000000) /*!< Channel 7 Global interrupt clear */ +#define DMA_IFCR_CTCIF7 ((uint32_t)0x02000000) /*!< Channel 7 Transfer Complete clear */ +#define DMA_IFCR_CHTIF7 ((uint32_t)0x04000000) /*!< Channel 7 Half Transfer clear */ +#define DMA_IFCR_CTEIF7 ((uint32_t)0x08000000) /*!< Channel 7 Transfer Error clear */ + +/******************* Bit definition for DMA_CCR1 register *******************/ +#define DMA_CCR1_EN ((uint16_t)0x0001) /*!< Channel enable*/ +#define DMA_CCR1_TCIE ((uint16_t)0x0002) /*!< Transfer complete interrupt enable */ +#define DMA_CCR1_HTIE ((uint16_t)0x0004) /*!< Half Transfer interrupt enable */ +#define DMA_CCR1_TEIE ((uint16_t)0x0008) /*!< Transfer error interrupt enable */ +#define DMA_CCR1_DIR ((uint16_t)0x0010) /*!< Data transfer direction */ +#define DMA_CCR1_CIRC ((uint16_t)0x0020) /*!< Circular mode */ +#define DMA_CCR1_PINC ((uint16_t)0x0040) /*!< Peripheral increment mode */ +#define DMA_CCR1_MINC ((uint16_t)0x0080) /*!< Memory increment mode */ + +#define DMA_CCR1_PSIZE ((uint16_t)0x0300) /*!< PSIZE[1:0] bits (Peripheral size) */ +#define DMA_CCR1_PSIZE_0 ((uint16_t)0x0100) /*!< Bit 0 */ +#define DMA_CCR1_PSIZE_1 ((uint16_t)0x0200) /*!< Bit 1 */ + +#define DMA_CCR1_MSIZE ((uint16_t)0x0C00) /*!< MSIZE[1:0] bits (Memory size) */ +#define DMA_CCR1_MSIZE_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define DMA_CCR1_MSIZE_1 ((uint16_t)0x0800) /*!< Bit 1 */ + +#define DMA_CCR1_PL ((uint16_t)0x3000) /*!< PL[1:0] bits(Channel Priority level) */ +#define DMA_CCR1_PL_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define DMA_CCR1_PL_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define DMA_CCR1_MEM2MEM ((uint16_t)0x4000) /*!< Memory to memory mode */ + +/******************* Bit definition for DMA_CCR2 register *******************/ +#define DMA_CCR2_EN ((uint16_t)0x0001) /*!< Channel enable */ +#define DMA_CCR2_TCIE ((uint16_t)0x0002) /*!< Transfer complete interrupt enable */ +#define DMA_CCR2_HTIE ((uint16_t)0x0004) /*!< Half Transfer interrupt enable */ +#define DMA_CCR2_TEIE ((uint16_t)0x0008) /*!< Transfer error interrupt enable */ +#define DMA_CCR2_DIR ((uint16_t)0x0010) /*!< Data transfer direction */ +#define DMA_CCR2_CIRC ((uint16_t)0x0020) /*!< Circular mode */ +#define DMA_CCR2_PINC ((uint16_t)0x0040) /*!< Peripheral increment mode */ +#define DMA_CCR2_MINC ((uint16_t)0x0080) /*!< Memory increment mode */ + +#define DMA_CCR2_PSIZE ((uint16_t)0x0300) /*!< PSIZE[1:0] bits (Peripheral size) */ +#define DMA_CCR2_PSIZE_0 ((uint16_t)0x0100) /*!< Bit 0 */ +#define DMA_CCR2_PSIZE_1 ((uint16_t)0x0200) /*!< Bit 1 */ + +#define DMA_CCR2_MSIZE ((uint16_t)0x0C00) /*!< MSIZE[1:0] bits (Memory size) */ +#define DMA_CCR2_MSIZE_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define DMA_CCR2_MSIZE_1 ((uint16_t)0x0800) /*!< Bit 1 */ + +#define DMA_CCR2_PL ((uint16_t)0x3000) /*!< PL[1:0] bits (Channel Priority level) */ +#define DMA_CCR2_PL_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define DMA_CCR2_PL_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define DMA_CCR2_MEM2MEM ((uint16_t)0x4000) /*!< Memory to memory mode */ + +/******************* Bit definition for DMA_CCR3 register *******************/ +#define DMA_CCR3_EN ((uint16_t)0x0001) /*!< Channel enable */ +#define DMA_CCR3_TCIE ((uint16_t)0x0002) /*!< Transfer complete interrupt enable */ +#define DMA_CCR3_HTIE ((uint16_t)0x0004) /*!< Half Transfer interrupt enable */ +#define DMA_CCR3_TEIE ((uint16_t)0x0008) /*!< Transfer error interrupt enable */ +#define DMA_CCR3_DIR ((uint16_t)0x0010) /*!< Data transfer direction */ +#define DMA_CCR3_CIRC ((uint16_t)0x0020) /*!< Circular mode */ +#define DMA_CCR3_PINC ((uint16_t)0x0040) /*!< Peripheral increment mode */ +#define DMA_CCR3_MINC ((uint16_t)0x0080) /*!< Memory increment mode */ + +#define DMA_CCR3_PSIZE ((uint16_t)0x0300) /*!< PSIZE[1:0] bits (Peripheral size) */ +#define DMA_CCR3_PSIZE_0 ((uint16_t)0x0100) /*!< Bit 0 */ +#define DMA_CCR3_PSIZE_1 ((uint16_t)0x0200) /*!< Bit 1 */ + +#define DMA_CCR3_MSIZE ((uint16_t)0x0C00) /*!< MSIZE[1:0] bits (Memory size) */ +#define DMA_CCR3_MSIZE_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define DMA_CCR3_MSIZE_1 ((uint16_t)0x0800) /*!< Bit 1 */ + +#define DMA_CCR3_PL ((uint16_t)0x3000) /*!< PL[1:0] bits (Channel Priority level) */ +#define DMA_CCR3_PL_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define DMA_CCR3_PL_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define DMA_CCR3_MEM2MEM ((uint16_t)0x4000) /*!< Memory to memory mode */ + +/*!<****************** Bit definition for DMA_CCR4 register *******************/ +#define DMA_CCR4_EN ((uint16_t)0x0001) /*!< Channel enable */ +#define DMA_CCR4_TCIE ((uint16_t)0x0002) /*!< Transfer complete interrupt enable */ +#define DMA_CCR4_HTIE ((uint16_t)0x0004) /*!< Half Transfer interrupt enable */ +#define DMA_CCR4_TEIE ((uint16_t)0x0008) /*!< Transfer error interrupt enable */ +#define DMA_CCR4_DIR ((uint16_t)0x0010) /*!< Data transfer direction */ +#define DMA_CCR4_CIRC ((uint16_t)0x0020) /*!< Circular mode */ +#define DMA_CCR4_PINC ((uint16_t)0x0040) /*!< Peripheral increment mode */ +#define DMA_CCR4_MINC ((uint16_t)0x0080) /*!< Memory increment mode */ + +#define DMA_CCR4_PSIZE ((uint16_t)0x0300) /*!< PSIZE[1:0] bits (Peripheral size) */ +#define DMA_CCR4_PSIZE_0 ((uint16_t)0x0100) /*!< Bit 0 */ +#define DMA_CCR4_PSIZE_1 ((uint16_t)0x0200) /*!< Bit 1 */ + +#define DMA_CCR4_MSIZE ((uint16_t)0x0C00) /*!< MSIZE[1:0] bits (Memory size) */ +#define DMA_CCR4_MSIZE_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define DMA_CCR4_MSIZE_1 ((uint16_t)0x0800) /*!< Bit 1 */ + +#define DMA_CCR4_PL ((uint16_t)0x3000) /*!< PL[1:0] bits (Channel Priority level) */ +#define DMA_CCR4_PL_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define DMA_CCR4_PL_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define DMA_CCR4_MEM2MEM ((uint16_t)0x4000) /*!< Memory to memory mode */ + +/****************** Bit definition for DMA_CCR5 register *******************/ +#define DMA_CCR5_EN ((uint16_t)0x0001) /*!< Channel enable */ +#define DMA_CCR5_TCIE ((uint16_t)0x0002) /*!< Transfer complete interrupt enable */ +#define DMA_CCR5_HTIE ((uint16_t)0x0004) /*!< Half Transfer interrupt enable */ +#define DMA_CCR5_TEIE ((uint16_t)0x0008) /*!< Transfer error interrupt enable */ +#define DMA_CCR5_DIR ((uint16_t)0x0010) /*!< Data transfer direction */ +#define DMA_CCR5_CIRC ((uint16_t)0x0020) /*!< Circular mode */ +#define DMA_CCR5_PINC ((uint16_t)0x0040) /*!< Peripheral increment mode */ +#define DMA_CCR5_MINC ((uint16_t)0x0080) /*!< Memory increment mode */ + +#define DMA_CCR5_PSIZE ((uint16_t)0x0300) /*!< PSIZE[1:0] bits (Peripheral size) */ +#define DMA_CCR5_PSIZE_0 ((uint16_t)0x0100) /*!< Bit 0 */ +#define DMA_CCR5_PSIZE_1 ((uint16_t)0x0200) /*!< Bit 1 */ + +#define DMA_CCR5_MSIZE ((uint16_t)0x0C00) /*!< MSIZE[1:0] bits (Memory size) */ +#define DMA_CCR5_MSIZE_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define DMA_CCR5_MSIZE_1 ((uint16_t)0x0800) /*!< Bit 1 */ + +#define DMA_CCR5_PL ((uint16_t)0x3000) /*!< PL[1:0] bits (Channel Priority level) */ +#define DMA_CCR5_PL_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define DMA_CCR5_PL_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define DMA_CCR5_MEM2MEM ((uint16_t)0x4000) /*!< Memory to memory mode enable */ + +/******************* Bit definition for DMA_CCR6 register *******************/ +#define DMA_CCR6_EN ((uint16_t)0x0001) /*!< Channel enable */ +#define DMA_CCR6_TCIE ((uint16_t)0x0002) /*!< Transfer complete interrupt enable */ +#define DMA_CCR6_HTIE ((uint16_t)0x0004) /*!< Half Transfer interrupt enable */ +#define DMA_CCR6_TEIE ((uint16_t)0x0008) /*!< Transfer error interrupt enable */ +#define DMA_CCR6_DIR ((uint16_t)0x0010) /*!< Data transfer direction */ +#define DMA_CCR6_CIRC ((uint16_t)0x0020) /*!< Circular mode */ +#define DMA_CCR6_PINC ((uint16_t)0x0040) /*!< Peripheral increment mode */ +#define DMA_CCR6_MINC ((uint16_t)0x0080) /*!< Memory increment mode */ + +#define DMA_CCR6_PSIZE ((uint16_t)0x0300) /*!< PSIZE[1:0] bits (Peripheral size) */ +#define DMA_CCR6_PSIZE_0 ((uint16_t)0x0100) /*!< Bit 0 */ +#define DMA_CCR6_PSIZE_1 ((uint16_t)0x0200) /*!< Bit 1 */ + +#define DMA_CCR6_MSIZE ((uint16_t)0x0C00) /*!< MSIZE[1:0] bits (Memory size) */ +#define DMA_CCR6_MSIZE_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define DMA_CCR6_MSIZE_1 ((uint16_t)0x0800) /*!< Bit 1 */ + +#define DMA_CCR6_PL ((uint16_t)0x3000) /*!< PL[1:0] bits (Channel Priority level) */ +#define DMA_CCR6_PL_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define DMA_CCR6_PL_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define DMA_CCR6_MEM2MEM ((uint16_t)0x4000) /*!< Memory to memory mode */ + +/******************* Bit definition for DMA_CCR7 register *******************/ +#define DMA_CCR7_EN ((uint16_t)0x0001) /*!< Channel enable */ +#define DMA_CCR7_TCIE ((uint16_t)0x0002) /*!< Transfer complete interrupt enable */ +#define DMA_CCR7_HTIE ((uint16_t)0x0004) /*!< Half Transfer interrupt enable */ +#define DMA_CCR7_TEIE ((uint16_t)0x0008) /*!< Transfer error interrupt enable */ +#define DMA_CCR7_DIR ((uint16_t)0x0010) /*!< Data transfer direction */ +#define DMA_CCR7_CIRC ((uint16_t)0x0020) /*!< Circular mode */ +#define DMA_CCR7_PINC ((uint16_t)0x0040) /*!< Peripheral increment mode */ +#define DMA_CCR7_MINC ((uint16_t)0x0080) /*!< Memory increment mode */ + +#define DMA_CCR7_PSIZE , ((uint16_t)0x0300) /*!< PSIZE[1:0] bits (Peripheral size) */ +#define DMA_CCR7_PSIZE_0 ((uint16_t)0x0100) /*!< Bit 0 */ +#define DMA_CCR7_PSIZE_1 ((uint16_t)0x0200) /*!< Bit 1 */ + +#define DMA_CCR7_MSIZE ((uint16_t)0x0C00) /*!< MSIZE[1:0] bits (Memory size) */ +#define DMA_CCR7_MSIZE_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define DMA_CCR7_MSIZE_1 ((uint16_t)0x0800) /*!< Bit 1 */ + +#define DMA_CCR7_PL ((uint16_t)0x3000) /*!< PL[1:0] bits (Channel Priority level) */ +#define DMA_CCR7_PL_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define DMA_CCR7_PL_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define DMA_CCR7_MEM2MEM ((uint16_t)0x4000) /*!< Memory to memory mode enable */ + +/****************** Bit definition for DMA_CNDTR1 register ******************/ +#define DMA_CNDTR1_NDT ((uint16_t)0xFFFF) /*!< Number of data to Transfer */ + +/****************** Bit definition for DMA_CNDTR2 register ******************/ +#define DMA_CNDTR2_NDT ((uint16_t)0xFFFF) /*!< Number of data to Transfer */ + +/****************** Bit definition for DMA_CNDTR3 register ******************/ +#define DMA_CNDTR3_NDT ((uint16_t)0xFFFF) /*!< Number of data to Transfer */ + +/****************** Bit definition for DMA_CNDTR4 register ******************/ +#define DMA_CNDTR4_NDT ((uint16_t)0xFFFF) /*!< Number of data to Transfer */ + +/****************** Bit definition for DMA_CNDTR5 register ******************/ +#define DMA_CNDTR5_NDT ((uint16_t)0xFFFF) /*!< Number of data to Transfer */ + +/****************** Bit definition for DMA_CNDTR6 register ******************/ +#define DMA_CNDTR6_NDT ((uint16_t)0xFFFF) /*!< Number of data to Transfer */ + +/****************** Bit definition for DMA_CNDTR7 register ******************/ +#define DMA_CNDTR7_NDT ((uint16_t)0xFFFF) /*!< Number of data to Transfer */ + +/****************** Bit definition for DMA_CPAR1 register *******************/ +#define DMA_CPAR1_PA ((uint32_t)0xFFFFFFFF) /*!< Peripheral Address */ + +/****************** Bit definition for DMA_CPAR2 register *******************/ +#define DMA_CPAR2_PA ((uint32_t)0xFFFFFFFF) /*!< Peripheral Address */ + +/****************** Bit definition for DMA_CPAR3 register *******************/ +#define DMA_CPAR3_PA ((uint32_t)0xFFFFFFFF) /*!< Peripheral Address */ + + +/****************** Bit definition for DMA_CPAR4 register *******************/ +#define DMA_CPAR4_PA ((uint32_t)0xFFFFFFFF) /*!< Peripheral Address */ + +/****************** Bit definition for DMA_CPAR5 register *******************/ +#define DMA_CPAR5_PA ((uint32_t)0xFFFFFFFF) /*!< Peripheral Address */ + +/****************** Bit definition for DMA_CPAR6 register *******************/ +#define DMA_CPAR6_PA ((uint32_t)0xFFFFFFFF) /*!< Peripheral Address */ + + +/****************** Bit definition for DMA_CPAR7 register *******************/ +#define DMA_CPAR7_PA ((uint32_t)0xFFFFFFFF) /*!< Peripheral Address */ + +/****************** Bit definition for DMA_CMAR1 register *******************/ +#define DMA_CMAR1_MA ((uint32_t)0xFFFFFFFF) /*!< Memory Address */ + +/****************** Bit definition for DMA_CMAR2 register *******************/ +#define DMA_CMAR2_MA ((uint32_t)0xFFFFFFFF) /*!< Memory Address */ + +/****************** Bit definition for DMA_CMAR3 register *******************/ +#define DMA_CMAR3_MA ((uint32_t)0xFFFFFFFF) /*!< Memory Address */ + + +/****************** Bit definition for DMA_CMAR4 register *******************/ +#define DMA_CMAR4_MA ((uint32_t)0xFFFFFFFF) /*!< Memory Address */ + +/****************** Bit definition for DMA_CMAR5 register *******************/ +#define DMA_CMAR5_MA ((uint32_t)0xFFFFFFFF) /*!< Memory Address */ + +/****************** Bit definition for DMA_CMAR6 register *******************/ +#define DMA_CMAR6_MA ((uint32_t)0xFFFFFFFF) /*!< Memory Address */ + +/****************** Bit definition for DMA_CMAR7 register *******************/ +#define DMA_CMAR7_MA ((uint32_t)0xFFFFFFFF) /*!< Memory Address */ + +/******************************************************************************/ +/* */ +/* Analog to Digital Converter */ +/* */ +/******************************************************************************/ + +/******************** Bit definition for ADC_SR register ********************/ +#define ADC_SR_AWD ((uint8_t)0x01) /*!< Analog watchdog flag */ +#define ADC_SR_EOC ((uint8_t)0x02) /*!< End of conversion */ +#define ADC_SR_JEOC ((uint8_t)0x04) /*!< Injected channel end of conversion */ +#define ADC_SR_JSTRT ((uint8_t)0x08) /*!< Injected channel Start flag */ +#define ADC_SR_STRT ((uint8_t)0x10) /*!< Regular channel Start flag */ + +/******************* Bit definition for ADC_CR1 register ********************/ +#define ADC_CR1_AWDCH ((uint32_t)0x0000001F) /*!< AWDCH[4:0] bits (Analog watchdog channel select bits) */ +#define ADC_CR1_AWDCH_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define ADC_CR1_AWDCH_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define ADC_CR1_AWDCH_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define ADC_CR1_AWDCH_3 ((uint32_t)0x00000008) /*!< Bit 3 */ +#define ADC_CR1_AWDCH_4 ((uint32_t)0x00000010) /*!< Bit 4 */ + +#define ADC_CR1_EOCIE ((uint32_t)0x00000020) /*!< Interrupt enable for EOC */ +#define ADC_CR1_AWDIE ((uint32_t)0x00000040) /*!< Analog Watchdog interrupt enable */ +#define ADC_CR1_JEOCIE ((uint32_t)0x00000080) /*!< Interrupt enable for injected channels */ +#define ADC_CR1_SCAN ((uint32_t)0x00000100) /*!< Scan mode */ +#define ADC_CR1_AWDSGL ((uint32_t)0x00000200) /*!< Enable the watchdog on a single channel in scan mode */ +#define ADC_CR1_JAUTO ((uint32_t)0x00000400) /*!< Automatic injected group conversion */ +#define ADC_CR1_DISCEN ((uint32_t)0x00000800) /*!< Discontinuous mode on regular channels */ +#define ADC_CR1_JDISCEN ((uint32_t)0x00001000) /*!< Discontinuous mode on injected channels */ + +#define ADC_CR1_DISCNUM ((uint32_t)0x0000E000) /*!< DISCNUM[2:0] bits (Discontinuous mode channel count) */ +#define ADC_CR1_DISCNUM_0 ((uint32_t)0x00002000) /*!< Bit 0 */ +#define ADC_CR1_DISCNUM_1 ((uint32_t)0x00004000) /*!< Bit 1 */ +#define ADC_CR1_DISCNUM_2 ((uint32_t)0x00008000) /*!< Bit 2 */ + +#define ADC_CR1_DUALMOD ((uint32_t)0x000F0000) /*!< DUALMOD[3:0] bits (Dual mode selection) */ +#define ADC_CR1_DUALMOD_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define ADC_CR1_DUALMOD_1 ((uint32_t)0x00020000) /*!< Bit 1 */ +#define ADC_CR1_DUALMOD_2 ((uint32_t)0x00040000) /*!< Bit 2 */ +#define ADC_CR1_DUALMOD_3 ((uint32_t)0x00080000) /*!< Bit 3 */ + +#define ADC_CR1_JAWDEN ((uint32_t)0x00400000) /*!< Analog watchdog enable on injected channels */ +#define ADC_CR1_AWDEN ((uint32_t)0x00800000) /*!< Analog watchdog enable on regular channels */ + + +/******************* Bit definition for ADC_CR2 register ********************/ +#define ADC_CR2_ADON ((uint32_t)0x00000001) /*!< A/D Converter ON / OFF */ +#define ADC_CR2_CONT ((uint32_t)0x00000002) /*!< Continuous Conversion */ +#define ADC_CR2_CAL ((uint32_t)0x00000004) /*!< A/D Calibration */ +#define ADC_CR2_RSTCAL ((uint32_t)0x00000008) /*!< Reset Calibration */ +#define ADC_CR2_DMA ((uint32_t)0x00000100) /*!< Direct Memory access mode */ +#define ADC_CR2_ALIGN ((uint32_t)0x00000800) /*!< Data Alignment */ + +#define ADC_CR2_JEXTSEL ((uint32_t)0x00007000) /*!< JEXTSEL[2:0] bits (External event select for injected group) */ +#define ADC_CR2_JEXTSEL_0 ((uint32_t)0x00001000) /*!< Bit 0 */ +#define ADC_CR2_JEXTSEL_1 ((uint32_t)0x00002000) /*!< Bit 1 */ +#define ADC_CR2_JEXTSEL_2 ((uint32_t)0x00004000) /*!< Bit 2 */ + +#define ADC_CR2_JEXTTRIG ((uint32_t)0x00008000) /*!< External Trigger Conversion mode for injected channels */ + +#define ADC_CR2_EXTSEL ((uint32_t)0x000E0000) /*!< EXTSEL[2:0] bits (External Event Select for regular group) */ +#define ADC_CR2_EXTSEL_0 ((uint32_t)0x00020000) /*!< Bit 0 */ +#define ADC_CR2_EXTSEL_1 ((uint32_t)0x00040000) /*!< Bit 1 */ +#define ADC_CR2_EXTSEL_2 ((uint32_t)0x00080000) /*!< Bit 2 */ + +#define ADC_CR2_EXTTRIG ((uint32_t)0x00100000) /*!< External Trigger Conversion mode for regular channels */ +#define ADC_CR2_JSWSTART ((uint32_t)0x00200000) /*!< Start Conversion of injected channels */ +#define ADC_CR2_SWSTART ((uint32_t)0x00400000) /*!< Start Conversion of regular channels */ +#define ADC_CR2_TSVREFE ((uint32_t)0x00800000) /*!< Temperature Sensor and VREFINT Enable */ + +/****************** Bit definition for ADC_SMPR1 register *******************/ +#define ADC_SMPR1_SMP10 ((uint32_t)0x00000007) /*!< SMP10[2:0] bits (Channel 10 Sample time selection) */ +#define ADC_SMPR1_SMP10_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define ADC_SMPR1_SMP10_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define ADC_SMPR1_SMP10_2 ((uint32_t)0x00000004) /*!< Bit 2 */ + +#define ADC_SMPR1_SMP11 ((uint32_t)0x00000038) /*!< SMP11[2:0] bits (Channel 11 Sample time selection) */ +#define ADC_SMPR1_SMP11_0 ((uint32_t)0x00000008) /*!< Bit 0 */ +#define ADC_SMPR1_SMP11_1 ((uint32_t)0x00000010) /*!< Bit 1 */ +#define ADC_SMPR1_SMP11_2 ((uint32_t)0x00000020) /*!< Bit 2 */ + +#define ADC_SMPR1_SMP12 ((uint32_t)0x000001C0) /*!< SMP12[2:0] bits (Channel 12 Sample time selection) */ +#define ADC_SMPR1_SMP12_0 ((uint32_t)0x00000040) /*!< Bit 0 */ +#define ADC_SMPR1_SMP12_1 ((uint32_t)0x00000080) /*!< Bit 1 */ +#define ADC_SMPR1_SMP12_2 ((uint32_t)0x00000100) /*!< Bit 2 */ + +#define ADC_SMPR1_SMP13 ((uint32_t)0x00000E00) /*!< SMP13[2:0] bits (Channel 13 Sample time selection) */ +#define ADC_SMPR1_SMP13_0 ((uint32_t)0x00000200) /*!< Bit 0 */ +#define ADC_SMPR1_SMP13_1 ((uint32_t)0x00000400) /*!< Bit 1 */ +#define ADC_SMPR1_SMP13_2 ((uint32_t)0x00000800) /*!< Bit 2 */ + +#define ADC_SMPR1_SMP14 ((uint32_t)0x00007000) /*!< SMP14[2:0] bits (Channel 14 Sample time selection) */ +#define ADC_SMPR1_SMP14_0 ((uint32_t)0x00001000) /*!< Bit 0 */ +#define ADC_SMPR1_SMP14_1 ((uint32_t)0x00002000) /*!< Bit 1 */ +#define ADC_SMPR1_SMP14_2 ((uint32_t)0x00004000) /*!< Bit 2 */ + +#define ADC_SMPR1_SMP15 ((uint32_t)0x00038000) /*!< SMP15[2:0] bits (Channel 15 Sample time selection) */ +#define ADC_SMPR1_SMP15_0 ((uint32_t)0x00008000) /*!< Bit 0 */ +#define ADC_SMPR1_SMP15_1 ((uint32_t)0x00010000) /*!< Bit 1 */ +#define ADC_SMPR1_SMP15_2 ((uint32_t)0x00020000) /*!< Bit 2 */ + +#define ADC_SMPR1_SMP16 ((uint32_t)0x001C0000) /*!< SMP16[2:0] bits (Channel 16 Sample time selection) */ +#define ADC_SMPR1_SMP16_0 ((uint32_t)0x00040000) /*!< Bit 0 */ +#define ADC_SMPR1_SMP16_1 ((uint32_t)0x00080000) /*!< Bit 1 */ +#define ADC_SMPR1_SMP16_2 ((uint32_t)0x00100000) /*!< Bit 2 */ + +#define ADC_SMPR1_SMP17 ((uint32_t)0x00E00000) /*!< SMP17[2:0] bits (Channel 17 Sample time selection) */ +#define ADC_SMPR1_SMP17_0 ((uint32_t)0x00200000) /*!< Bit 0 */ +#define ADC_SMPR1_SMP17_1 ((uint32_t)0x00400000) /*!< Bit 1 */ +#define ADC_SMPR1_SMP17_2 ((uint32_t)0x00800000) /*!< Bit 2 */ + +/****************** Bit definition for ADC_SMPR2 register *******************/ +#define ADC_SMPR2_SMP0 ((uint32_t)0x00000007) /*!< SMP0[2:0] bits (Channel 0 Sample time selection) */ +#define ADC_SMPR2_SMP0_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define ADC_SMPR2_SMP0_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define ADC_SMPR2_SMP0_2 ((uint32_t)0x00000004) /*!< Bit 2 */ + +#define ADC_SMPR2_SMP1 ((uint32_t)0x00000038) /*!< SMP1[2:0] bits (Channel 1 Sample time selection) */ +#define ADC_SMPR2_SMP1_0 ((uint32_t)0x00000008) /*!< Bit 0 */ +#define ADC_SMPR2_SMP1_1 ((uint32_t)0x00000010) /*!< Bit 1 */ +#define ADC_SMPR2_SMP1_2 ((uint32_t)0x00000020) /*!< Bit 2 */ + +#define ADC_SMPR2_SMP2 ((uint32_t)0x000001C0) /*!< SMP2[2:0] bits (Channel 2 Sample time selection) */ +#define ADC_SMPR2_SMP2_0 ((uint32_t)0x00000040) /*!< Bit 0 */ +#define ADC_SMPR2_SMP2_1 ((uint32_t)0x00000080) /*!< Bit 1 */ +#define ADC_SMPR2_SMP2_2 ((uint32_t)0x00000100) /*!< Bit 2 */ + +#define ADC_SMPR2_SMP3 ((uint32_t)0x00000E00) /*!< SMP3[2:0] bits (Channel 3 Sample time selection) */ +#define ADC_SMPR2_SMP3_0 ((uint32_t)0x00000200) /*!< Bit 0 */ +#define ADC_SMPR2_SMP3_1 ((uint32_t)0x00000400) /*!< Bit 1 */ +#define ADC_SMPR2_SMP3_2 ((uint32_t)0x00000800) /*!< Bit 2 */ + +#define ADC_SMPR2_SMP4 ((uint32_t)0x00007000) /*!< SMP4[2:0] bits (Channel 4 Sample time selection) */ +#define ADC_SMPR2_SMP4_0 ((uint32_t)0x00001000) /*!< Bit 0 */ +#define ADC_SMPR2_SMP4_1 ((uint32_t)0x00002000) /*!< Bit 1 */ +#define ADC_SMPR2_SMP4_2 ((uint32_t)0x00004000) /*!< Bit 2 */ + +#define ADC_SMPR2_SMP5 ((uint32_t)0x00038000) /*!< SMP5[2:0] bits (Channel 5 Sample time selection) */ +#define ADC_SMPR2_SMP5_0 ((uint32_t)0x00008000) /*!< Bit 0 */ +#define ADC_SMPR2_SMP5_1 ((uint32_t)0x00010000) /*!< Bit 1 */ +#define ADC_SMPR2_SMP5_2 ((uint32_t)0x00020000) /*!< Bit 2 */ + +#define ADC_SMPR2_SMP6 ((uint32_t)0x001C0000) /*!< SMP6[2:0] bits (Channel 6 Sample time selection) */ +#define ADC_SMPR2_SMP6_0 ((uint32_t)0x00040000) /*!< Bit 0 */ +#define ADC_SMPR2_SMP6_1 ((uint32_t)0x00080000) /*!< Bit 1 */ +#define ADC_SMPR2_SMP6_2 ((uint32_t)0x00100000) /*!< Bit 2 */ + +#define ADC_SMPR2_SMP7 ((uint32_t)0x00E00000) /*!< SMP7[2:0] bits (Channel 7 Sample time selection) */ +#define ADC_SMPR2_SMP7_0 ((uint32_t)0x00200000) /*!< Bit 0 */ +#define ADC_SMPR2_SMP7_1 ((uint32_t)0x00400000) /*!< Bit 1 */ +#define ADC_SMPR2_SMP7_2 ((uint32_t)0x00800000) /*!< Bit 2 */ + +#define ADC_SMPR2_SMP8 ((uint32_t)0x07000000) /*!< SMP8[2:0] bits (Channel 8 Sample time selection) */ +#define ADC_SMPR2_SMP8_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define ADC_SMPR2_SMP8_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define ADC_SMPR2_SMP8_2 ((uint32_t)0x04000000) /*!< Bit 2 */ + +#define ADC_SMPR2_SMP9 ((uint32_t)0x38000000) /*!< SMP9[2:0] bits (Channel 9 Sample time selection) */ +#define ADC_SMPR2_SMP9_0 ((uint32_t)0x08000000) /*!< Bit 0 */ +#define ADC_SMPR2_SMP9_1 ((uint32_t)0x10000000) /*!< Bit 1 */ +#define ADC_SMPR2_SMP9_2 ((uint32_t)0x20000000) /*!< Bit 2 */ + +/****************** Bit definition for ADC_JOFR1 register *******************/ +#define ADC_JOFR1_JOFFSET1 ((uint16_t)0x0FFF) /*!< Data offset for injected channel 1 */ + +/****************** Bit definition for ADC_JOFR2 register *******************/ +#define ADC_JOFR2_JOFFSET2 ((uint16_t)0x0FFF) /*!< Data offset for injected channel 2 */ + +/****************** Bit definition for ADC_JOFR3 register *******************/ +#define ADC_JOFR3_JOFFSET3 ((uint16_t)0x0FFF) /*!< Data offset for injected channel 3 */ + +/****************** Bit definition for ADC_JOFR4 register *******************/ +#define ADC_JOFR4_JOFFSET4 ((uint16_t)0x0FFF) /*!< Data offset for injected channel 4 */ + +/******************* Bit definition for ADC_HTR register ********************/ +#define ADC_HTR_HT ((uint16_t)0x0FFF) /*!< Analog watchdog high threshold */ + +/******************* Bit definition for ADC_LTR register ********************/ +#define ADC_LTR_LT ((uint16_t)0x0FFF) /*!< Analog watchdog low threshold */ + +/******************* Bit definition for ADC_SQR1 register *******************/ +#define ADC_SQR1_SQ13 ((uint32_t)0x0000001F) /*!< SQ13[4:0] bits (13th conversion in regular sequence) */ +#define ADC_SQR1_SQ13_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define ADC_SQR1_SQ13_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define ADC_SQR1_SQ13_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define ADC_SQR1_SQ13_3 ((uint32_t)0x00000008) /*!< Bit 3 */ +#define ADC_SQR1_SQ13_4 ((uint32_t)0x00000010) /*!< Bit 4 */ + +#define ADC_SQR1_SQ14 ((uint32_t)0x000003E0) /*!< SQ14[4:0] bits (14th conversion in regular sequence) */ +#define ADC_SQR1_SQ14_0 ((uint32_t)0x00000020) /*!< Bit 0 */ +#define ADC_SQR1_SQ14_1 ((uint32_t)0x00000040) /*!< Bit 1 */ +#define ADC_SQR1_SQ14_2 ((uint32_t)0x00000080) /*!< Bit 2 */ +#define ADC_SQR1_SQ14_3 ((uint32_t)0x00000100) /*!< Bit 3 */ +#define ADC_SQR1_SQ14_4 ((uint32_t)0x00000200) /*!< Bit 4 */ + +#define ADC_SQR1_SQ15 ((uint32_t)0x00007C00) /*!< SQ15[4:0] bits (15th conversion in regular sequence) */ +#define ADC_SQR1_SQ15_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define ADC_SQR1_SQ15_1 ((uint32_t)0x00000800) /*!< Bit 1 */ +#define ADC_SQR1_SQ15_2 ((uint32_t)0x00001000) /*!< Bit 2 */ +#define ADC_SQR1_SQ15_3 ((uint32_t)0x00002000) /*!< Bit 3 */ +#define ADC_SQR1_SQ15_4 ((uint32_t)0x00004000) /*!< Bit 4 */ + +#define ADC_SQR1_SQ16 ((uint32_t)0x000F8000) /*!< SQ16[4:0] bits (16th conversion in regular sequence) */ +#define ADC_SQR1_SQ16_0 ((uint32_t)0x00008000) /*!< Bit 0 */ +#define ADC_SQR1_SQ16_1 ((uint32_t)0x00010000) /*!< Bit 1 */ +#define ADC_SQR1_SQ16_2 ((uint32_t)0x00020000) /*!< Bit 2 */ +#define ADC_SQR1_SQ16_3 ((uint32_t)0x00040000) /*!< Bit 3 */ +#define ADC_SQR1_SQ16_4 ((uint32_t)0x00080000) /*!< Bit 4 */ + +#define ADC_SQR1_L ((uint32_t)0x00F00000) /*!< L[3:0] bits (Regular channel sequence length) */ +#define ADC_SQR1_L_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define ADC_SQR1_L_1 ((uint32_t)0x00200000) /*!< Bit 1 */ +#define ADC_SQR1_L_2 ((uint32_t)0x00400000) /*!< Bit 2 */ +#define ADC_SQR1_L_3 ((uint32_t)0x00800000) /*!< Bit 3 */ + +/******************* Bit definition for ADC_SQR2 register *******************/ +#define ADC_SQR2_SQ7 ((uint32_t)0x0000001F) /*!< SQ7[4:0] bits (7th conversion in regular sequence) */ +#define ADC_SQR2_SQ7_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define ADC_SQR2_SQ7_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define ADC_SQR2_SQ7_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define ADC_SQR2_SQ7_3 ((uint32_t)0x00000008) /*!< Bit 3 */ +#define ADC_SQR2_SQ7_4 ((uint32_t)0x00000010) /*!< Bit 4 */ + +#define ADC_SQR2_SQ8 ((uint32_t)0x000003E0) /*!< SQ8[4:0] bits (8th conversion in regular sequence) */ +#define ADC_SQR2_SQ8_0 ((uint32_t)0x00000020) /*!< Bit 0 */ +#define ADC_SQR2_SQ8_1 ((uint32_t)0x00000040) /*!< Bit 1 */ +#define ADC_SQR2_SQ8_2 ((uint32_t)0x00000080) /*!< Bit 2 */ +#define ADC_SQR2_SQ8_3 ((uint32_t)0x00000100) /*!< Bit 3 */ +#define ADC_SQR2_SQ8_4 ((uint32_t)0x00000200) /*!< Bit 4 */ + +#define ADC_SQR2_SQ9 ((uint32_t)0x00007C00) /*!< SQ9[4:0] bits (9th conversion in regular sequence) */ +#define ADC_SQR2_SQ9_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define ADC_SQR2_SQ9_1 ((uint32_t)0x00000800) /*!< Bit 1 */ +#define ADC_SQR2_SQ9_2 ((uint32_t)0x00001000) /*!< Bit 2 */ +#define ADC_SQR2_SQ9_3 ((uint32_t)0x00002000) /*!< Bit 3 */ +#define ADC_SQR2_SQ9_4 ((uint32_t)0x00004000) /*!< Bit 4 */ + +#define ADC_SQR2_SQ10 ((uint32_t)0x000F8000) /*!< SQ10[4:0] bits (10th conversion in regular sequence) */ +#define ADC_SQR2_SQ10_0 ((uint32_t)0x00008000) /*!< Bit 0 */ +#define ADC_SQR2_SQ10_1 ((uint32_t)0x00010000) /*!< Bit 1 */ +#define ADC_SQR2_SQ10_2 ((uint32_t)0x00020000) /*!< Bit 2 */ +#define ADC_SQR2_SQ10_3 ((uint32_t)0x00040000) /*!< Bit 3 */ +#define ADC_SQR2_SQ10_4 ((uint32_t)0x00080000) /*!< Bit 4 */ + +#define ADC_SQR2_SQ11 ((uint32_t)0x01F00000) /*!< SQ11[4:0] bits (11th conversion in regular sequence) */ +#define ADC_SQR2_SQ11_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define ADC_SQR2_SQ11_1 ((uint32_t)0x00200000) /*!< Bit 1 */ +#define ADC_SQR2_SQ11_2 ((uint32_t)0x00400000) /*!< Bit 2 */ +#define ADC_SQR2_SQ11_3 ((uint32_t)0x00800000) /*!< Bit 3 */ +#define ADC_SQR2_SQ11_4 ((uint32_t)0x01000000) /*!< Bit 4 */ + +#define ADC_SQR2_SQ12 ((uint32_t)0x3E000000) /*!< SQ12[4:0] bits (12th conversion in regular sequence) */ +#define ADC_SQR2_SQ12_0 ((uint32_t)0x02000000) /*!< Bit 0 */ +#define ADC_SQR2_SQ12_1 ((uint32_t)0x04000000) /*!< Bit 1 */ +#define ADC_SQR2_SQ12_2 ((uint32_t)0x08000000) /*!< Bit 2 */ +#define ADC_SQR2_SQ12_3 ((uint32_t)0x10000000) /*!< Bit 3 */ +#define ADC_SQR2_SQ12_4 ((uint32_t)0x20000000) /*!< Bit 4 */ + +/******************* Bit definition for ADC_SQR3 register *******************/ +#define ADC_SQR3_SQ1 ((uint32_t)0x0000001F) /*!< SQ1[4:0] bits (1st conversion in regular sequence) */ +#define ADC_SQR3_SQ1_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define ADC_SQR3_SQ1_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define ADC_SQR3_SQ1_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define ADC_SQR3_SQ1_3 ((uint32_t)0x00000008) /*!< Bit 3 */ +#define ADC_SQR3_SQ1_4 ((uint32_t)0x00000010) /*!< Bit 4 */ + +#define ADC_SQR3_SQ2 ((uint32_t)0x000003E0) /*!< SQ2[4:0] bits (2nd conversion in regular sequence) */ +#define ADC_SQR3_SQ2_0 ((uint32_t)0x00000020) /*!< Bit 0 */ +#define ADC_SQR3_SQ2_1 ((uint32_t)0x00000040) /*!< Bit 1 */ +#define ADC_SQR3_SQ2_2 ((uint32_t)0x00000080) /*!< Bit 2 */ +#define ADC_SQR3_SQ2_3 ((uint32_t)0x00000100) /*!< Bit 3 */ +#define ADC_SQR3_SQ2_4 ((uint32_t)0x00000200) /*!< Bit 4 */ + +#define ADC_SQR3_SQ3 ((uint32_t)0x00007C00) /*!< SQ3[4:0] bits (3rd conversion in regular sequence) */ +#define ADC_SQR3_SQ3_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define ADC_SQR3_SQ3_1 ((uint32_t)0x00000800) /*!< Bit 1 */ +#define ADC_SQR3_SQ3_2 ((uint32_t)0x00001000) /*!< Bit 2 */ +#define ADC_SQR3_SQ3_3 ((uint32_t)0x00002000) /*!< Bit 3 */ +#define ADC_SQR3_SQ3_4 ((uint32_t)0x00004000) /*!< Bit 4 */ + +#define ADC_SQR3_SQ4 ((uint32_t)0x000F8000) /*!< SQ4[4:0] bits (4th conversion in regular sequence) */ +#define ADC_SQR3_SQ4_0 ((uint32_t)0x00008000) /*!< Bit 0 */ +#define ADC_SQR3_SQ4_1 ((uint32_t)0x00010000) /*!< Bit 1 */ +#define ADC_SQR3_SQ4_2 ((uint32_t)0x00020000) /*!< Bit 2 */ +#define ADC_SQR3_SQ4_3 ((uint32_t)0x00040000) /*!< Bit 3 */ +#define ADC_SQR3_SQ4_4 ((uint32_t)0x00080000) /*!< Bit 4 */ + +#define ADC_SQR3_SQ5 ((uint32_t)0x01F00000) /*!< SQ5[4:0] bits (5th conversion in regular sequence) */ +#define ADC_SQR3_SQ5_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define ADC_SQR3_SQ5_1 ((uint32_t)0x00200000) /*!< Bit 1 */ +#define ADC_SQR3_SQ5_2 ((uint32_t)0x00400000) /*!< Bit 2 */ +#define ADC_SQR3_SQ5_3 ((uint32_t)0x00800000) /*!< Bit 3 */ +#define ADC_SQR3_SQ5_4 ((uint32_t)0x01000000) /*!< Bit 4 */ + +#define ADC_SQR3_SQ6 ((uint32_t)0x3E000000) /*!< SQ6[4:0] bits (6th conversion in regular sequence) */ +#define ADC_SQR3_SQ6_0 ((uint32_t)0x02000000) /*!< Bit 0 */ +#define ADC_SQR3_SQ6_1 ((uint32_t)0x04000000) /*!< Bit 1 */ +#define ADC_SQR3_SQ6_2 ((uint32_t)0x08000000) /*!< Bit 2 */ +#define ADC_SQR3_SQ6_3 ((uint32_t)0x10000000) /*!< Bit 3 */ +#define ADC_SQR3_SQ6_4 ((uint32_t)0x20000000) /*!< Bit 4 */ + +/******************* Bit definition for ADC_JSQR register *******************/ +#define ADC_JSQR_JSQ1 ((uint32_t)0x0000001F) /*!< JSQ1[4:0] bits (1st conversion in injected sequence) */ +#define ADC_JSQR_JSQ1_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define ADC_JSQR_JSQ1_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define ADC_JSQR_JSQ1_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define ADC_JSQR_JSQ1_3 ((uint32_t)0x00000008) /*!< Bit 3 */ +#define ADC_JSQR_JSQ1_4 ((uint32_t)0x00000010) /*!< Bit 4 */ + +#define ADC_JSQR_JSQ2 ((uint32_t)0x000003E0) /*!< JSQ2[4:0] bits (2nd conversion in injected sequence) */ +#define ADC_JSQR_JSQ2_0 ((uint32_t)0x00000020) /*!< Bit 0 */ +#define ADC_JSQR_JSQ2_1 ((uint32_t)0x00000040) /*!< Bit 1 */ +#define ADC_JSQR_JSQ2_2 ((uint32_t)0x00000080) /*!< Bit 2 */ +#define ADC_JSQR_JSQ2_3 ((uint32_t)0x00000100) /*!< Bit 3 */ +#define ADC_JSQR_JSQ2_4 ((uint32_t)0x00000200) /*!< Bit 4 */ + +#define ADC_JSQR_JSQ3 ((uint32_t)0x00007C00) /*!< JSQ3[4:0] bits (3rd conversion in injected sequence) */ +#define ADC_JSQR_JSQ3_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define ADC_JSQR_JSQ3_1 ((uint32_t)0x00000800) /*!< Bit 1 */ +#define ADC_JSQR_JSQ3_2 ((uint32_t)0x00001000) /*!< Bit 2 */ +#define ADC_JSQR_JSQ3_3 ((uint32_t)0x00002000) /*!< Bit 3 */ +#define ADC_JSQR_JSQ3_4 ((uint32_t)0x00004000) /*!< Bit 4 */ + +#define ADC_JSQR_JSQ4 ((uint32_t)0x000F8000) /*!< JSQ4[4:0] bits (4th conversion in injected sequence) */ +#define ADC_JSQR_JSQ4_0 ((uint32_t)0x00008000) /*!< Bit 0 */ +#define ADC_JSQR_JSQ4_1 ((uint32_t)0x00010000) /*!< Bit 1 */ +#define ADC_JSQR_JSQ4_2 ((uint32_t)0x00020000) /*!< Bit 2 */ +#define ADC_JSQR_JSQ4_3 ((uint32_t)0x00040000) /*!< Bit 3 */ +#define ADC_JSQR_JSQ4_4 ((uint32_t)0x00080000) /*!< Bit 4 */ + +#define ADC_JSQR_JL ((uint32_t)0x00300000) /*!< JL[1:0] bits (Injected Sequence length) */ +#define ADC_JSQR_JL_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define ADC_JSQR_JL_1 ((uint32_t)0x00200000) /*!< Bit 1 */ + +/******************* Bit definition for ADC_JDR1 register *******************/ +#define ADC_JDR1_JDATA ((uint16_t)0xFFFF) /*!< Injected data */ + +/******************* Bit definition for ADC_JDR2 register *******************/ +#define ADC_JDR2_JDATA ((uint16_t)0xFFFF) /*!< Injected data */ + +/******************* Bit definition for ADC_JDR3 register *******************/ +#define ADC_JDR3_JDATA ((uint16_t)0xFFFF) /*!< Injected data */ + +/******************* Bit definition for ADC_JDR4 register *******************/ +#define ADC_JDR4_JDATA ((uint16_t)0xFFFF) /*!< Injected data */ + +/******************** Bit definition for ADC_DR register ********************/ +#define ADC_DR_DATA ((uint32_t)0x0000FFFF) /*!< Regular data */ +#define ADC_DR_ADC2DATA ((uint32_t)0xFFFF0000) /*!< ADC2 data */ + +/******************************************************************************/ +/* */ +/* Digital to Analog Converter */ +/* */ +/******************************************************************************/ + +/******************** Bit definition for DAC_CR register ********************/ +#define DAC_CR_EN1 ((uint32_t)0x00000001) /*!< DAC channel1 enable */ +#define DAC_CR_BOFF1 ((uint32_t)0x00000002) /*!< DAC channel1 output buffer disable */ +#define DAC_CR_TEN1 ((uint32_t)0x00000004) /*!< DAC channel1 Trigger enable */ + +#define DAC_CR_TSEL1 ((uint32_t)0x00000038) /*!< TSEL1[2:0] (DAC channel1 Trigger selection) */ +#define DAC_CR_TSEL1_0 ((uint32_t)0x00000008) /*!< Bit 0 */ +#define DAC_CR_TSEL1_1 ((uint32_t)0x00000010) /*!< Bit 1 */ +#define DAC_CR_TSEL1_2 ((uint32_t)0x00000020) /*!< Bit 2 */ + +#define DAC_CR_WAVE1 ((uint32_t)0x000000C0) /*!< WAVE1[1:0] (DAC channel1 noise/triangle wave generation enable) */ +#define DAC_CR_WAVE1_0 ((uint32_t)0x00000040) /*!< Bit 0 */ +#define DAC_CR_WAVE1_1 ((uint32_t)0x00000080) /*!< Bit 1 */ + +#define DAC_CR_MAMP1 ((uint32_t)0x00000F00) /*!< MAMP1[3:0] (DAC channel1 Mask/Amplitude selector) */ +#define DAC_CR_MAMP1_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define DAC_CR_MAMP1_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define DAC_CR_MAMP1_2 ((uint32_t)0x00000400) /*!< Bit 2 */ +#define DAC_CR_MAMP1_3 ((uint32_t)0x00000800) /*!< Bit 3 */ + +#define DAC_CR_DMAEN1 ((uint32_t)0x00001000) /*!< DAC channel1 DMA enable */ +#define DAC_CR_EN2 ((uint32_t)0x00010000) /*!< DAC channel2 enable */ +#define DAC_CR_BOFF2 ((uint32_t)0x00020000) /*!< DAC channel2 output buffer disable */ +#define DAC_CR_TEN2 ((uint32_t)0x00040000) /*!< DAC channel2 Trigger enable */ + +#define DAC_CR_TSEL2 ((uint32_t)0x00380000) /*!< TSEL2[2:0] (DAC channel2 Trigger selection) */ +#define DAC_CR_TSEL2_0 ((uint32_t)0x00080000) /*!< Bit 0 */ +#define DAC_CR_TSEL2_1 ((uint32_t)0x00100000) /*!< Bit 1 */ +#define DAC_CR_TSEL2_2 ((uint32_t)0x00200000) /*!< Bit 2 */ + +#define DAC_CR_WAVE2 ((uint32_t)0x00C00000) /*!< WAVE2[1:0] (DAC channel2 noise/triangle wave generation enable) */ +#define DAC_CR_WAVE2_0 ((uint32_t)0x00400000) /*!< Bit 0 */ +#define DAC_CR_WAVE2_1 ((uint32_t)0x00800000) /*!< Bit 1 */ + +#define DAC_CR_MAMP2 ((uint32_t)0x0F000000) /*!< MAMP2[3:0] (DAC channel2 Mask/Amplitude selector) */ +#define DAC_CR_MAMP2_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define DAC_CR_MAMP2_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define DAC_CR_MAMP2_2 ((uint32_t)0x04000000) /*!< Bit 2 */ +#define DAC_CR_MAMP2_3 ((uint32_t)0x08000000) /*!< Bit 3 */ + +#define DAC_CR_DMAEN2 ((uint32_t)0x10000000) /*!< DAC channel2 DMA enabled */ + +/***************** Bit definition for DAC_SWTRIGR register ******************/ +#define DAC_SWTRIGR_SWTRIG1 ((uint8_t)0x01) /*!< DAC channel1 software trigger */ +#define DAC_SWTRIGR_SWTRIG2 ((uint8_t)0x02) /*!< DAC channel2 software trigger */ + +/***************** Bit definition for DAC_DHR12R1 register ******************/ +#define DAC_DHR12R1_DACC1DHR ((uint16_t)0x0FFF) /*!< DAC channel1 12-bit Right aligned data */ + +/***************** Bit definition for DAC_DHR12L1 register ******************/ +#define DAC_DHR12L1_DACC1DHR ((uint16_t)0xFFF0) /*!< DAC channel1 12-bit Left aligned data */ + +/****************** Bit definition for DAC_DHR8R1 register ******************/ +#define DAC_DHR8R1_DACC1DHR ((uint8_t)0xFF) /*!< DAC channel1 8-bit Right aligned data */ + +/***************** Bit definition for DAC_DHR12R2 register ******************/ +#define DAC_DHR12R2_DACC2DHR ((uint16_t)0x0FFF) /*!< DAC channel2 12-bit Right aligned data */ + +/***************** Bit definition for DAC_DHR12L2 register ******************/ +#define DAC_DHR12L2_DACC2DHR ((uint16_t)0xFFF0) /*!< DAC channel2 12-bit Left aligned data */ + +/****************** Bit definition for DAC_DHR8R2 register ******************/ +#define DAC_DHR8R2_DACC2DHR ((uint8_t)0xFF) /*!< DAC channel2 8-bit Right aligned data */ + +/***************** Bit definition for DAC_DHR12RD register ******************/ +#define DAC_DHR12RD_DACC1DHR ((uint32_t)0x00000FFF) /*!< DAC channel1 12-bit Right aligned data */ +#define DAC_DHR12RD_DACC2DHR ((uint32_t)0x0FFF0000) /*!< DAC channel2 12-bit Right aligned data */ + +/***************** Bit definition for DAC_DHR12LD register ******************/ +#define DAC_DHR12LD_DACC1DHR ((uint32_t)0x0000FFF0) /*!< DAC channel1 12-bit Left aligned data */ +#define DAC_DHR12LD_DACC2DHR ((uint32_t)0xFFF00000) /*!< DAC channel2 12-bit Left aligned data */ + +/****************** Bit definition for DAC_DHR8RD register ******************/ +#define DAC_DHR8RD_DACC1DHR ((uint16_t)0x00FF) /*!< DAC channel1 8-bit Right aligned data */ +#define DAC_DHR8RD_DACC2DHR ((uint16_t)0xFF00) /*!< DAC channel2 8-bit Right aligned data */ + +/******************* Bit definition for DAC_DOR1 register *******************/ +#define DAC_DOR1_DACC1DOR ((uint16_t)0x0FFF) /*!< DAC channel1 data output */ + +/******************* Bit definition for DAC_DOR2 register *******************/ +#define DAC_DOR2_DACC2DOR ((uint16_t)0x0FFF) /*!< DAC channel2 data output */ + +/******************** Bit definition for DAC_SR register ********************/ +#define DAC_SR_DMAUDR1 ((uint32_t)0x00002000) /*!< DAC channel1 DMA underrun flag */ +#define DAC_SR_DMAUDR2 ((uint32_t)0x20000000) /*!< DAC channel2 DMA underrun flag */ + +/******************************************************************************/ +/* */ +/* CEC */ +/* */ +/******************************************************************************/ +/******************** Bit definition for CEC_CFGR register ******************/ +#define CEC_CFGR_PE ((uint16_t)0x0001) /*!< Peripheral Enable */ +#define CEC_CFGR_IE ((uint16_t)0x0002) /*!< Interrupt Enable */ +#define CEC_CFGR_BTEM ((uint16_t)0x0004) /*!< Bit Timing Error Mode */ +#define CEC_CFGR_BPEM ((uint16_t)0x0008) /*!< Bit Period Error Mode */ + +/******************** Bit definition for CEC_OAR register ******************/ +#define CEC_OAR_OA ((uint16_t)0x000F) /*!< OA[3:0]: Own Address */ +#define CEC_OAR_OA_0 ((uint16_t)0x0001) /*!< Bit 0 */ +#define CEC_OAR_OA_1 ((uint16_t)0x0002) /*!< Bit 1 */ +#define CEC_OAR_OA_2 ((uint16_t)0x0004) /*!< Bit 2 */ +#define CEC_OAR_OA_3 ((uint16_t)0x0008) /*!< Bit 3 */ + +/******************** Bit definition for CEC_PRES register ******************/ +#define CEC_PRES_PRES ((uint16_t)0x3FFF) /*!< Prescaler Counter Value */ + +/******************** Bit definition for CEC_ESR register ******************/ +#define CEC_ESR_BTE ((uint16_t)0x0001) /*!< Bit Timing Error */ +#define CEC_ESR_BPE ((uint16_t)0x0002) /*!< Bit Period Error */ +#define CEC_ESR_RBTFE ((uint16_t)0x0004) /*!< Rx Block Transfer Finished Error */ +#define CEC_ESR_SBE ((uint16_t)0x0008) /*!< Start Bit Error */ +#define CEC_ESR_ACKE ((uint16_t)0x0010) /*!< Block Acknowledge Error */ +#define CEC_ESR_LINE ((uint16_t)0x0020) /*!< Line Error */ +#define CEC_ESR_TBTFE ((uint16_t)0x0040) /*!< Tx Block Transfer Finished Error */ + +/******************** Bit definition for CEC_CSR register ******************/ +#define CEC_CSR_TSOM ((uint16_t)0x0001) /*!< Tx Start Of Message */ +#define CEC_CSR_TEOM ((uint16_t)0x0002) /*!< Tx End Of Message */ +#define CEC_CSR_TERR ((uint16_t)0x0004) /*!< Tx Error */ +#define CEC_CSR_TBTRF ((uint16_t)0x0008) /*!< Tx Byte Transfer Request or Block Transfer Finished */ +#define CEC_CSR_RSOM ((uint16_t)0x0010) /*!< Rx Start Of Message */ +#define CEC_CSR_REOM ((uint16_t)0x0020) /*!< Rx End Of Message */ +#define CEC_CSR_RERR ((uint16_t)0x0040) /*!< Rx Error */ +#define CEC_CSR_RBTF ((uint16_t)0x0080) /*!< Rx Block Transfer Finished */ + +/******************** Bit definition for CEC_TXD register ******************/ +#define CEC_TXD_TXD ((uint16_t)0x00FF) /*!< Tx Data register */ + +/******************** Bit definition for CEC_RXD register ******************/ +#define CEC_RXD_RXD ((uint16_t)0x00FF) /*!< Rx Data register */ + +/******************************************************************************/ +/* */ +/* TIM */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for TIM_CR1 register ********************/ +#define TIM_CR1_CEN ((uint16_t)0x0001) /*!< Counter enable */ +#define TIM_CR1_UDIS ((uint16_t)0x0002) /*!< Update disable */ +#define TIM_CR1_URS ((uint16_t)0x0004) /*!< Update request source */ +#define TIM_CR1_OPM ((uint16_t)0x0008) /*!< One pulse mode */ +#define TIM_CR1_DIR ((uint16_t)0x0010) /*!< Direction */ + +#define TIM_CR1_CMS ((uint16_t)0x0060) /*!< CMS[1:0] bits (Center-aligned mode selection) */ +#define TIM_CR1_CMS_0 ((uint16_t)0x0020) /*!< Bit 0 */ +#define TIM_CR1_CMS_1 ((uint16_t)0x0040) /*!< Bit 1 */ + +#define TIM_CR1_ARPE ((uint16_t)0x0080) /*!< Auto-reload preload enable */ + +#define TIM_CR1_CKD ((uint16_t)0x0300) /*!< CKD[1:0] bits (clock division) */ +#define TIM_CR1_CKD_0 ((uint16_t)0x0100) /*!< Bit 0 */ +#define TIM_CR1_CKD_1 ((uint16_t)0x0200) /*!< Bit 1 */ + +/******************* Bit definition for TIM_CR2 register ********************/ +#define TIM_CR2_CCPC ((uint16_t)0x0001) /*!< Capture/Compare Preloaded Control */ +#define TIM_CR2_CCUS ((uint16_t)0x0004) /*!< Capture/Compare Control Update Selection */ +#define TIM_CR2_CCDS ((uint16_t)0x0008) /*!< Capture/Compare DMA Selection */ + +#define TIM_CR2_MMS ((uint16_t)0x0070) /*!< MMS[2:0] bits (Master Mode Selection) */ +#define TIM_CR2_MMS_0 ((uint16_t)0x0010) /*!< Bit 0 */ +#define TIM_CR2_MMS_1 ((uint16_t)0x0020) /*!< Bit 1 */ +#define TIM_CR2_MMS_2 ((uint16_t)0x0040) /*!< Bit 2 */ + +#define TIM_CR2_TI1S ((uint16_t)0x0080) /*!< TI1 Selection */ +#define TIM_CR2_OIS1 ((uint16_t)0x0100) /*!< Output Idle state 1 (OC1 output) */ +#define TIM_CR2_OIS1N ((uint16_t)0x0200) /*!< Output Idle state 1 (OC1N output) */ +#define TIM_CR2_OIS2 ((uint16_t)0x0400) /*!< Output Idle state 2 (OC2 output) */ +#define TIM_CR2_OIS2N ((uint16_t)0x0800) /*!< Output Idle state 2 (OC2N output) */ +#define TIM_CR2_OIS3 ((uint16_t)0x1000) /*!< Output Idle state 3 (OC3 output) */ +#define TIM_CR2_OIS3N ((uint16_t)0x2000) /*!< Output Idle state 3 (OC3N output) */ +#define TIM_CR2_OIS4 ((uint16_t)0x4000) /*!< Output Idle state 4 (OC4 output) */ + +/******************* Bit definition for TIM_SMCR register *******************/ +#define TIM_SMCR_SMS ((uint16_t)0x0007) /*!< SMS[2:0] bits (Slave mode selection) */ +#define TIM_SMCR_SMS_0 ((uint16_t)0x0001) /*!< Bit 0 */ +#define TIM_SMCR_SMS_1 ((uint16_t)0x0002) /*!< Bit 1 */ +#define TIM_SMCR_SMS_2 ((uint16_t)0x0004) /*!< Bit 2 */ + +#define TIM_SMCR_TS ((uint16_t)0x0070) /*!< TS[2:0] bits (Trigger selection) */ +#define TIM_SMCR_TS_0 ((uint16_t)0x0010) /*!< Bit 0 */ +#define TIM_SMCR_TS_1 ((uint16_t)0x0020) /*!< Bit 1 */ +#define TIM_SMCR_TS_2 ((uint16_t)0x0040) /*!< Bit 2 */ + +#define TIM_SMCR_MSM ((uint16_t)0x0080) /*!< Master/slave mode */ + +#define TIM_SMCR_ETF ((uint16_t)0x0F00) /*!< ETF[3:0] bits (External trigger filter) */ +#define TIM_SMCR_ETF_0 ((uint16_t)0x0100) /*!< Bit 0 */ +#define TIM_SMCR_ETF_1 ((uint16_t)0x0200) /*!< Bit 1 */ +#define TIM_SMCR_ETF_2 ((uint16_t)0x0400) /*!< Bit 2 */ +#define TIM_SMCR_ETF_3 ((uint16_t)0x0800) /*!< Bit 3 */ + +#define TIM_SMCR_ETPS ((uint16_t)0x3000) /*!< ETPS[1:0] bits (External trigger prescaler) */ +#define TIM_SMCR_ETPS_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define TIM_SMCR_ETPS_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define TIM_SMCR_ECE ((uint16_t)0x4000) /*!< External clock enable */ +#define TIM_SMCR_ETP ((uint16_t)0x8000) /*!< External trigger polarity */ + +/******************* Bit definition for TIM_DIER register *******************/ +#define TIM_DIER_UIE ((uint16_t)0x0001) /*!< Update interrupt enable */ +#define TIM_DIER_CC1IE ((uint16_t)0x0002) /*!< Capture/Compare 1 interrupt enable */ +#define TIM_DIER_CC2IE ((uint16_t)0x0004) /*!< Capture/Compare 2 interrupt enable */ +#define TIM_DIER_CC3IE ((uint16_t)0x0008) /*!< Capture/Compare 3 interrupt enable */ +#define TIM_DIER_CC4IE ((uint16_t)0x0010) /*!< Capture/Compare 4 interrupt enable */ +#define TIM_DIER_COMIE ((uint16_t)0x0020) /*!< COM interrupt enable */ +#define TIM_DIER_TIE ((uint16_t)0x0040) /*!< Trigger interrupt enable */ +#define TIM_DIER_BIE ((uint16_t)0x0080) /*!< Break interrupt enable */ +#define TIM_DIER_UDE ((uint16_t)0x0100) /*!< Update DMA request enable */ +#define TIM_DIER_CC1DE ((uint16_t)0x0200) /*!< Capture/Compare 1 DMA request enable */ +#define TIM_DIER_CC2DE ((uint16_t)0x0400) /*!< Capture/Compare 2 DMA request enable */ +#define TIM_DIER_CC3DE ((uint16_t)0x0800) /*!< Capture/Compare 3 DMA request enable */ +#define TIM_DIER_CC4DE ((uint16_t)0x1000) /*!< Capture/Compare 4 DMA request enable */ +#define TIM_DIER_COMDE ((uint16_t)0x2000) /*!< COM DMA request enable */ +#define TIM_DIER_TDE ((uint16_t)0x4000) /*!< Trigger DMA request enable */ + +/******************** Bit definition for TIM_SR register ********************/ +#define TIM_SR_UIF ((uint16_t)0x0001) /*!< Update interrupt Flag */ +#define TIM_SR_CC1IF ((uint16_t)0x0002) /*!< Capture/Compare 1 interrupt Flag */ +#define TIM_SR_CC2IF ((uint16_t)0x0004) /*!< Capture/Compare 2 interrupt Flag */ +#define TIM_SR_CC3IF ((uint16_t)0x0008) /*!< Capture/Compare 3 interrupt Flag */ +#define TIM_SR_CC4IF ((uint16_t)0x0010) /*!< Capture/Compare 4 interrupt Flag */ +#define TIM_SR_COMIF ((uint16_t)0x0020) /*!< COM interrupt Flag */ +#define TIM_SR_TIF ((uint16_t)0x0040) /*!< Trigger interrupt Flag */ +#define TIM_SR_BIF ((uint16_t)0x0080) /*!< Break interrupt Flag */ +#define TIM_SR_CC1OF ((uint16_t)0x0200) /*!< Capture/Compare 1 Overcapture Flag */ +#define TIM_SR_CC2OF ((uint16_t)0x0400) /*!< Capture/Compare 2 Overcapture Flag */ +#define TIM_SR_CC3OF ((uint16_t)0x0800) /*!< Capture/Compare 3 Overcapture Flag */ +#define TIM_SR_CC4OF ((uint16_t)0x1000) /*!< Capture/Compare 4 Overcapture Flag */ + +/******************* Bit definition for TIM_EGR register ********************/ +#define TIM_EGR_UG ((uint8_t)0x01) /*!< Update Generation */ +#define TIM_EGR_CC1G ((uint8_t)0x02) /*!< Capture/Compare 1 Generation */ +#define TIM_EGR_CC2G ((uint8_t)0x04) /*!< Capture/Compare 2 Generation */ +#define TIM_EGR_CC3G ((uint8_t)0x08) /*!< Capture/Compare 3 Generation */ +#define TIM_EGR_CC4G ((uint8_t)0x10) /*!< Capture/Compare 4 Generation */ +#define TIM_EGR_COMG ((uint8_t)0x20) /*!< Capture/Compare Control Update Generation */ +#define TIM_EGR_TG ((uint8_t)0x40) /*!< Trigger Generation */ +#define TIM_EGR_BG ((uint8_t)0x80) /*!< Break Generation */ + +/****************** Bit definition for TIM_CCMR1 register *******************/ +#define TIM_CCMR1_CC1S ((uint16_t)0x0003) /*!< CC1S[1:0] bits (Capture/Compare 1 Selection) */ +#define TIM_CCMR1_CC1S_0 ((uint16_t)0x0001) /*!< Bit 0 */ +#define TIM_CCMR1_CC1S_1 ((uint16_t)0x0002) /*!< Bit 1 */ + +#define TIM_CCMR1_OC1FE ((uint16_t)0x0004) /*!< Output Compare 1 Fast enable */ +#define TIM_CCMR1_OC1PE ((uint16_t)0x0008) /*!< Output Compare 1 Preload enable */ + +#define TIM_CCMR1_OC1M ((uint16_t)0x0070) /*!< OC1M[2:0] bits (Output Compare 1 Mode) */ +#define TIM_CCMR1_OC1M_0 ((uint16_t)0x0010) /*!< Bit 0 */ +#define TIM_CCMR1_OC1M_1 ((uint16_t)0x0020) /*!< Bit 1 */ +#define TIM_CCMR1_OC1M_2 ((uint16_t)0x0040) /*!< Bit 2 */ + +#define TIM_CCMR1_OC1CE ((uint16_t)0x0080) /*!< Output Compare 1Clear Enable */ + +#define TIM_CCMR1_CC2S ((uint16_t)0x0300) /*!< CC2S[1:0] bits (Capture/Compare 2 Selection) */ +#define TIM_CCMR1_CC2S_0 ((uint16_t)0x0100) /*!< Bit 0 */ +#define TIM_CCMR1_CC2S_1 ((uint16_t)0x0200) /*!< Bit 1 */ + +#define TIM_CCMR1_OC2FE ((uint16_t)0x0400) /*!< Output Compare 2 Fast enable */ +#define TIM_CCMR1_OC2PE ((uint16_t)0x0800) /*!< Output Compare 2 Preload enable */ + +#define TIM_CCMR1_OC2M ((uint16_t)0x7000) /*!< OC2M[2:0] bits (Output Compare 2 Mode) */ +#define TIM_CCMR1_OC2M_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define TIM_CCMR1_OC2M_1 ((uint16_t)0x2000) /*!< Bit 1 */ +#define TIM_CCMR1_OC2M_2 ((uint16_t)0x4000) /*!< Bit 2 */ + +#define TIM_CCMR1_OC2CE ((uint16_t)0x8000) /*!< Output Compare 2 Clear Enable */ + +/*----------------------------------------------------------------------------*/ + +#define TIM_CCMR1_IC1PSC ((uint16_t)0x000C) /*!< IC1PSC[1:0] bits (Input Capture 1 Prescaler) */ +#define TIM_CCMR1_IC1PSC_0 ((uint16_t)0x0004) /*!< Bit 0 */ +#define TIM_CCMR1_IC1PSC_1 ((uint16_t)0x0008) /*!< Bit 1 */ + +#define TIM_CCMR1_IC1F ((uint16_t)0x00F0) /*!< IC1F[3:0] bits (Input Capture 1 Filter) */ +#define TIM_CCMR1_IC1F_0 ((uint16_t)0x0010) /*!< Bit 0 */ +#define TIM_CCMR1_IC1F_1 ((uint16_t)0x0020) /*!< Bit 1 */ +#define TIM_CCMR1_IC1F_2 ((uint16_t)0x0040) /*!< Bit 2 */ +#define TIM_CCMR1_IC1F_3 ((uint16_t)0x0080) /*!< Bit 3 */ + +#define TIM_CCMR1_IC2PSC ((uint16_t)0x0C00) /*!< IC2PSC[1:0] bits (Input Capture 2 Prescaler) */ +#define TIM_CCMR1_IC2PSC_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define TIM_CCMR1_IC2PSC_1 ((uint16_t)0x0800) /*!< Bit 1 */ + +#define TIM_CCMR1_IC2F ((uint16_t)0xF000) /*!< IC2F[3:0] bits (Input Capture 2 Filter) */ +#define TIM_CCMR1_IC2F_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define TIM_CCMR1_IC2F_1 ((uint16_t)0x2000) /*!< Bit 1 */ +#define TIM_CCMR1_IC2F_2 ((uint16_t)0x4000) /*!< Bit 2 */ +#define TIM_CCMR1_IC2F_3 ((uint16_t)0x8000) /*!< Bit 3 */ + +/****************** Bit definition for TIM_CCMR2 register *******************/ +#define TIM_CCMR2_CC3S ((uint16_t)0x0003) /*!< CC3S[1:0] bits (Capture/Compare 3 Selection) */ +#define TIM_CCMR2_CC3S_0 ((uint16_t)0x0001) /*!< Bit 0 */ +#define TIM_CCMR2_CC3S_1 ((uint16_t)0x0002) /*!< Bit 1 */ + +#define TIM_CCMR2_OC3FE ((uint16_t)0x0004) /*!< Output Compare 3 Fast enable */ +#define TIM_CCMR2_OC3PE ((uint16_t)0x0008) /*!< Output Compare 3 Preload enable */ + +#define TIM_CCMR2_OC3M ((uint16_t)0x0070) /*!< OC3M[2:0] bits (Output Compare 3 Mode) */ +#define TIM_CCMR2_OC3M_0 ((uint16_t)0x0010) /*!< Bit 0 */ +#define TIM_CCMR2_OC3M_1 ((uint16_t)0x0020) /*!< Bit 1 */ +#define TIM_CCMR2_OC3M_2 ((uint16_t)0x0040) /*!< Bit 2 */ + +#define TIM_CCMR2_OC3CE ((uint16_t)0x0080) /*!< Output Compare 3 Clear Enable */ + +#define TIM_CCMR2_CC4S ((uint16_t)0x0300) /*!< CC4S[1:0] bits (Capture/Compare 4 Selection) */ +#define TIM_CCMR2_CC4S_0 ((uint16_t)0x0100) /*!< Bit 0 */ +#define TIM_CCMR2_CC4S_1 ((uint16_t)0x0200) /*!< Bit 1 */ + +#define TIM_CCMR2_OC4FE ((uint16_t)0x0400) /*!< Output Compare 4 Fast enable */ +#define TIM_CCMR2_OC4PE ((uint16_t)0x0800) /*!< Output Compare 4 Preload enable */ + +#define TIM_CCMR2_OC4M ((uint16_t)0x7000) /*!< OC4M[2:0] bits (Output Compare 4 Mode) */ +#define TIM_CCMR2_OC4M_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define TIM_CCMR2_OC4M_1 ((uint16_t)0x2000) /*!< Bit 1 */ +#define TIM_CCMR2_OC4M_2 ((uint16_t)0x4000) /*!< Bit 2 */ + +#define TIM_CCMR2_OC4CE ((uint16_t)0x8000) /*!< Output Compare 4 Clear Enable */ + +/*----------------------------------------------------------------------------*/ + +#define TIM_CCMR2_IC3PSC ((uint16_t)0x000C) /*!< IC3PSC[1:0] bits (Input Capture 3 Prescaler) */ +#define TIM_CCMR2_IC3PSC_0 ((uint16_t)0x0004) /*!< Bit 0 */ +#define TIM_CCMR2_IC3PSC_1 ((uint16_t)0x0008) /*!< Bit 1 */ + +#define TIM_CCMR2_IC3F ((uint16_t)0x00F0) /*!< IC3F[3:0] bits (Input Capture 3 Filter) */ +#define TIM_CCMR2_IC3F_0 ((uint16_t)0x0010) /*!< Bit 0 */ +#define TIM_CCMR2_IC3F_1 ((uint16_t)0x0020) /*!< Bit 1 */ +#define TIM_CCMR2_IC3F_2 ((uint16_t)0x0040) /*!< Bit 2 */ +#define TIM_CCMR2_IC3F_3 ((uint16_t)0x0080) /*!< Bit 3 */ + +#define TIM_CCMR2_IC4PSC ((uint16_t)0x0C00) /*!< IC4PSC[1:0] bits (Input Capture 4 Prescaler) */ +#define TIM_CCMR2_IC4PSC_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define TIM_CCMR2_IC4PSC_1 ((uint16_t)0x0800) /*!< Bit 1 */ + +#define TIM_CCMR2_IC4F ((uint16_t)0xF000) /*!< IC4F[3:0] bits (Input Capture 4 Filter) */ +#define TIM_CCMR2_IC4F_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define TIM_CCMR2_IC4F_1 ((uint16_t)0x2000) /*!< Bit 1 */ +#define TIM_CCMR2_IC4F_2 ((uint16_t)0x4000) /*!< Bit 2 */ +#define TIM_CCMR2_IC4F_3 ((uint16_t)0x8000) /*!< Bit 3 */ + +/******************* Bit definition for TIM_CCER register *******************/ +#define TIM_CCER_CC1E ((uint16_t)0x0001) /*!< Capture/Compare 1 output enable */ +#define TIM_CCER_CC1P ((uint16_t)0x0002) /*!< Capture/Compare 1 output Polarity */ +#define TIM_CCER_CC1NE ((uint16_t)0x0004) /*!< Capture/Compare 1 Complementary output enable */ +#define TIM_CCER_CC1NP ((uint16_t)0x0008) /*!< Capture/Compare 1 Complementary output Polarity */ +#define TIM_CCER_CC2E ((uint16_t)0x0010) /*!< Capture/Compare 2 output enable */ +#define TIM_CCER_CC2P ((uint16_t)0x0020) /*!< Capture/Compare 2 output Polarity */ +#define TIM_CCER_CC2NE ((uint16_t)0x0040) /*!< Capture/Compare 2 Complementary output enable */ +#define TIM_CCER_CC2NP ((uint16_t)0x0080) /*!< Capture/Compare 2 Complementary output Polarity */ +#define TIM_CCER_CC3E ((uint16_t)0x0100) /*!< Capture/Compare 3 output enable */ +#define TIM_CCER_CC3P ((uint16_t)0x0200) /*!< Capture/Compare 3 output Polarity */ +#define TIM_CCER_CC3NE ((uint16_t)0x0400) /*!< Capture/Compare 3 Complementary output enable */ +#define TIM_CCER_CC3NP ((uint16_t)0x0800) /*!< Capture/Compare 3 Complementary output Polarity */ +#define TIM_CCER_CC4E ((uint16_t)0x1000) /*!< Capture/Compare 4 output enable */ +#define TIM_CCER_CC4P ((uint16_t)0x2000) /*!< Capture/Compare 4 output Polarity */ +#define TIM_CCER_CC4NP ((uint16_t)0x8000) /*!< Capture/Compare 4 Complementary output Polarity */ + +/******************* Bit definition for TIM_CNT register ********************/ +#define TIM_CNT_CNT ((uint16_t)0xFFFF) /*!< Counter Value */ + +/******************* Bit definition for TIM_PSC register ********************/ +#define TIM_PSC_PSC ((uint16_t)0xFFFF) /*!< Prescaler Value */ + +/******************* Bit definition for TIM_ARR register ********************/ +#define TIM_ARR_ARR ((uint16_t)0xFFFF) /*!< actual auto-reload Value */ + +/******************* Bit definition for TIM_RCR register ********************/ +#define TIM_RCR_REP ((uint8_t)0xFF) /*!< Repetition Counter Value */ + +/******************* Bit definition for TIM_CCR1 register *******************/ +#define TIM_CCR1_CCR1 ((uint16_t)0xFFFF) /*!< Capture/Compare 1 Value */ + +/******************* Bit definition for TIM_CCR2 register *******************/ +#define TIM_CCR2_CCR2 ((uint16_t)0xFFFF) /*!< Capture/Compare 2 Value */ + +/******************* Bit definition for TIM_CCR3 register *******************/ +#define TIM_CCR3_CCR3 ((uint16_t)0xFFFF) /*!< Capture/Compare 3 Value */ + +/******************* Bit definition for TIM_CCR4 register *******************/ +#define TIM_CCR4_CCR4 ((uint16_t)0xFFFF) /*!< Capture/Compare 4 Value */ + +/******************* Bit definition for TIM_BDTR register *******************/ +#define TIM_BDTR_DTG ((uint16_t)0x00FF) /*!< DTG[0:7] bits (Dead-Time Generator set-up) */ +#define TIM_BDTR_DTG_0 ((uint16_t)0x0001) /*!< Bit 0 */ +#define TIM_BDTR_DTG_1 ((uint16_t)0x0002) /*!< Bit 1 */ +#define TIM_BDTR_DTG_2 ((uint16_t)0x0004) /*!< Bit 2 */ +#define TIM_BDTR_DTG_3 ((uint16_t)0x0008) /*!< Bit 3 */ +#define TIM_BDTR_DTG_4 ((uint16_t)0x0010) /*!< Bit 4 */ +#define TIM_BDTR_DTG_5 ((uint16_t)0x0020) /*!< Bit 5 */ +#define TIM_BDTR_DTG_6 ((uint16_t)0x0040) /*!< Bit 6 */ +#define TIM_BDTR_DTG_7 ((uint16_t)0x0080) /*!< Bit 7 */ + +#define TIM_BDTR_LOCK ((uint16_t)0x0300) /*!< LOCK[1:0] bits (Lock Configuration) */ +#define TIM_BDTR_LOCK_0 ((uint16_t)0x0100) /*!< Bit 0 */ +#define TIM_BDTR_LOCK_1 ((uint16_t)0x0200) /*!< Bit 1 */ + +#define TIM_BDTR_OSSI ((uint16_t)0x0400) /*!< Off-State Selection for Idle mode */ +#define TIM_BDTR_OSSR ((uint16_t)0x0800) /*!< Off-State Selection for Run mode */ +#define TIM_BDTR_BKE ((uint16_t)0x1000) /*!< Break enable */ +#define TIM_BDTR_BKP ((uint16_t)0x2000) /*!< Break Polarity */ +#define TIM_BDTR_AOE ((uint16_t)0x4000) /*!< Automatic Output enable */ +#define TIM_BDTR_MOE ((uint16_t)0x8000) /*!< Main Output enable */ + +/******************* Bit definition for TIM_DCR register ********************/ +#define TIM_DCR_DBA ((uint16_t)0x001F) /*!< DBA[4:0] bits (DMA Base Address) */ +#define TIM_DCR_DBA_0 ((uint16_t)0x0001) /*!< Bit 0 */ +#define TIM_DCR_DBA_1 ((uint16_t)0x0002) /*!< Bit 1 */ +#define TIM_DCR_DBA_2 ((uint16_t)0x0004) /*!< Bit 2 */ +#define TIM_DCR_DBA_3 ((uint16_t)0x0008) /*!< Bit 3 */ +#define TIM_DCR_DBA_4 ((uint16_t)0x0010) /*!< Bit 4 */ + +#define TIM_DCR_DBL ((uint16_t)0x1F00) /*!< DBL[4:0] bits (DMA Burst Length) */ +#define TIM_DCR_DBL_0 ((uint16_t)0x0100) /*!< Bit 0 */ +#define TIM_DCR_DBL_1 ((uint16_t)0x0200) /*!< Bit 1 */ +#define TIM_DCR_DBL_2 ((uint16_t)0x0400) /*!< Bit 2 */ +#define TIM_DCR_DBL_3 ((uint16_t)0x0800) /*!< Bit 3 */ +#define TIM_DCR_DBL_4 ((uint16_t)0x1000) /*!< Bit 4 */ + +/******************* Bit definition for TIM_DMAR register *******************/ +#define TIM_DMAR_DMAB ((uint16_t)0xFFFF) /*!< DMA register for burst accesses */ + +/******************************************************************************/ +/* */ +/* Real-Time Clock */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for RTC_CRH register ********************/ +#define RTC_CRH_SECIE ((uint8_t)0x01) /*!< Second Interrupt Enable */ +#define RTC_CRH_ALRIE ((uint8_t)0x02) /*!< Alarm Interrupt Enable */ +#define RTC_CRH_OWIE ((uint8_t)0x04) /*!< OverfloW Interrupt Enable */ + +/******************* Bit definition for RTC_CRL register ********************/ +#define RTC_CRL_SECF ((uint8_t)0x01) /*!< Second Flag */ +#define RTC_CRL_ALRF ((uint8_t)0x02) /*!< Alarm Flag */ +#define RTC_CRL_OWF ((uint8_t)0x04) /*!< OverfloW Flag */ +#define RTC_CRL_RSF ((uint8_t)0x08) /*!< Registers Synchronized Flag */ +#define RTC_CRL_CNF ((uint8_t)0x10) /*!< Configuration Flag */ +#define RTC_CRL_RTOFF ((uint8_t)0x20) /*!< RTC operation OFF */ + +/******************* Bit definition for RTC_PRLH register *******************/ +#define RTC_PRLH_PRL ((uint16_t)0x000F) /*!< RTC Prescaler Reload Value High */ + +/******************* Bit definition for RTC_PRLL register *******************/ +#define RTC_PRLL_PRL ((uint16_t)0xFFFF) /*!< RTC Prescaler Reload Value Low */ + +/******************* Bit definition for RTC_DIVH register *******************/ +#define RTC_DIVH_RTC_DIV ((uint16_t)0x000F) /*!< RTC Clock Divider High */ + +/******************* Bit definition for RTC_DIVL register *******************/ +#define RTC_DIVL_RTC_DIV ((uint16_t)0xFFFF) /*!< RTC Clock Divider Low */ + +/******************* Bit definition for RTC_CNTH register *******************/ +#define RTC_CNTH_RTC_CNT ((uint16_t)0xFFFF) /*!< RTC Counter High */ + +/******************* Bit definition for RTC_CNTL register *******************/ +#define RTC_CNTL_RTC_CNT ((uint16_t)0xFFFF) /*!< RTC Counter Low */ + +/******************* Bit definition for RTC_ALRH register *******************/ +#define RTC_ALRH_RTC_ALR ((uint16_t)0xFFFF) /*!< RTC Alarm High */ + +/******************* Bit definition for RTC_ALRL register *******************/ +#define RTC_ALRL_RTC_ALR ((uint16_t)0xFFFF) /*!< RTC Alarm Low */ + +/******************************************************************************/ +/* */ +/* Independent WATCHDOG */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for IWDG_KR register ********************/ +#define IWDG_KR_KEY ((uint16_t)0xFFFF) /*!< Key value (write only, read 0000h) */ + +/******************* Bit definition for IWDG_PR register ********************/ +#define IWDG_PR_PR ((uint8_t)0x07) /*!< PR[2:0] (Prescaler divider) */ +#define IWDG_PR_PR_0 ((uint8_t)0x01) /*!< Bit 0 */ +#define IWDG_PR_PR_1 ((uint8_t)0x02) /*!< Bit 1 */ +#define IWDG_PR_PR_2 ((uint8_t)0x04) /*!< Bit 2 */ + +/******************* Bit definition for IWDG_RLR register *******************/ +#define IWDG_RLR_RL ((uint16_t)0x0FFF) /*!< Watchdog counter reload value */ + +/******************* Bit definition for IWDG_SR register ********************/ +#define IWDG_SR_PVU ((uint8_t)0x01) /*!< Watchdog prescaler value update */ +#define IWDG_SR_RVU ((uint8_t)0x02) /*!< Watchdog counter reload value update */ + +/******************************************************************************/ +/* */ +/* Window WATCHDOG */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for WWDG_CR register ********************/ +#define WWDG_CR_T ((uint8_t)0x7F) /*!< T[6:0] bits (7-Bit counter (MSB to LSB)) */ +#define WWDG_CR_T0 ((uint8_t)0x01) /*!< Bit 0 */ +#define WWDG_CR_T1 ((uint8_t)0x02) /*!< Bit 1 */ +#define WWDG_CR_T2 ((uint8_t)0x04) /*!< Bit 2 */ +#define WWDG_CR_T3 ((uint8_t)0x08) /*!< Bit 3 */ +#define WWDG_CR_T4 ((uint8_t)0x10) /*!< Bit 4 */ +#define WWDG_CR_T5 ((uint8_t)0x20) /*!< Bit 5 */ +#define WWDG_CR_T6 ((uint8_t)0x40) /*!< Bit 6 */ + +#define WWDG_CR_WDGA ((uint8_t)0x80) /*!< Activation bit */ + +/******************* Bit definition for WWDG_CFR register *******************/ +#define WWDG_CFR_W ((uint16_t)0x007F) /*!< W[6:0] bits (7-bit window value) */ +#define WWDG_CFR_W0 ((uint16_t)0x0001) /*!< Bit 0 */ +#define WWDG_CFR_W1 ((uint16_t)0x0002) /*!< Bit 1 */ +#define WWDG_CFR_W2 ((uint16_t)0x0004) /*!< Bit 2 */ +#define WWDG_CFR_W3 ((uint16_t)0x0008) /*!< Bit 3 */ +#define WWDG_CFR_W4 ((uint16_t)0x0010) /*!< Bit 4 */ +#define WWDG_CFR_W5 ((uint16_t)0x0020) /*!< Bit 5 */ +#define WWDG_CFR_W6 ((uint16_t)0x0040) /*!< Bit 6 */ + +#define WWDG_CFR_WDGTB ((uint16_t)0x0180) /*!< WDGTB[1:0] bits (Timer Base) */ +#define WWDG_CFR_WDGTB0 ((uint16_t)0x0080) /*!< Bit 0 */ +#define WWDG_CFR_WDGTB1 ((uint16_t)0x0100) /*!< Bit 1 */ + +#define WWDG_CFR_EWI ((uint16_t)0x0200) /*!< Early Wakeup Interrupt */ + +/******************* Bit definition for WWDG_SR register ********************/ +#define WWDG_SR_EWIF ((uint8_t)0x01) /*!< Early Wakeup Interrupt Flag */ + +/******************************************************************************/ +/* */ +/* Flexible Static Memory Controller */ +/* */ +/******************************************************************************/ + +/****************** Bit definition for FSMC_BCR1 register *******************/ +#define FSMC_BCR1_MBKEN ((uint32_t)0x00000001) /*!< Memory bank enable bit */ +#define FSMC_BCR1_MUXEN ((uint32_t)0x00000002) /*!< Address/data multiplexing enable bit */ + +#define FSMC_BCR1_MTYP ((uint32_t)0x0000000C) /*!< MTYP[1:0] bits (Memory type) */ +#define FSMC_BCR1_MTYP_0 ((uint32_t)0x00000004) /*!< Bit 0 */ +#define FSMC_BCR1_MTYP_1 ((uint32_t)0x00000008) /*!< Bit 1 */ + +#define FSMC_BCR1_MWID ((uint32_t)0x00000030) /*!< MWID[1:0] bits (Memory data bus width) */ +#define FSMC_BCR1_MWID_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define FSMC_BCR1_MWID_1 ((uint32_t)0x00000020) /*!< Bit 1 */ + +#define FSMC_BCR1_FACCEN ((uint32_t)0x00000040) /*!< Flash access enable */ +#define FSMC_BCR1_BURSTEN ((uint32_t)0x00000100) /*!< Burst enable bit */ +#define FSMC_BCR1_WAITPOL ((uint32_t)0x00000200) /*!< Wait signal polarity bit */ +#define FSMC_BCR1_WRAPMOD ((uint32_t)0x00000400) /*!< Wrapped burst mode support */ +#define FSMC_BCR1_WAITCFG ((uint32_t)0x00000800) /*!< Wait timing configuration */ +#define FSMC_BCR1_WREN ((uint32_t)0x00001000) /*!< Write enable bit */ +#define FSMC_BCR1_WAITEN ((uint32_t)0x00002000) /*!< Wait enable bit */ +#define FSMC_BCR1_EXTMOD ((uint32_t)0x00004000) /*!< Extended mode enable */ +#define FSMC_BCR1_ASYNCWAIT ((uint32_t)0x00008000) /*!< Asynchronous wait */ +#define FSMC_BCR1_CBURSTRW ((uint32_t)0x00080000) /*!< Write burst enable */ + +/****************** Bit definition for FSMC_BCR2 register *******************/ +#define FSMC_BCR2_MBKEN ((uint32_t)0x00000001) /*!< Memory bank enable bit */ +#define FSMC_BCR2_MUXEN ((uint32_t)0x00000002) /*!< Address/data multiplexing enable bit */ + +#define FSMC_BCR2_MTYP ((uint32_t)0x0000000C) /*!< MTYP[1:0] bits (Memory type) */ +#define FSMC_BCR2_MTYP_0 ((uint32_t)0x00000004) /*!< Bit 0 */ +#define FSMC_BCR2_MTYP_1 ((uint32_t)0x00000008) /*!< Bit 1 */ + +#define FSMC_BCR2_MWID ((uint32_t)0x00000030) /*!< MWID[1:0] bits (Memory data bus width) */ +#define FSMC_BCR2_MWID_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define FSMC_BCR2_MWID_1 ((uint32_t)0x00000020) /*!< Bit 1 */ + +#define FSMC_BCR2_FACCEN ((uint32_t)0x00000040) /*!< Flash access enable */ +#define FSMC_BCR2_BURSTEN ((uint32_t)0x00000100) /*!< Burst enable bit */ +#define FSMC_BCR2_WAITPOL ((uint32_t)0x00000200) /*!< Wait signal polarity bit */ +#define FSMC_BCR2_WRAPMOD ((uint32_t)0x00000400) /*!< Wrapped burst mode support */ +#define FSMC_BCR2_WAITCFG ((uint32_t)0x00000800) /*!< Wait timing configuration */ +#define FSMC_BCR2_WREN ((uint32_t)0x00001000) /*!< Write enable bit */ +#define FSMC_BCR2_WAITEN ((uint32_t)0x00002000) /*!< Wait enable bit */ +#define FSMC_BCR2_EXTMOD ((uint32_t)0x00004000) /*!< Extended mode enable */ +#define FSMC_BCR2_ASYNCWAIT ((uint32_t)0x00008000) /*!< Asynchronous wait */ +#define FSMC_BCR2_CBURSTRW ((uint32_t)0x00080000) /*!< Write burst enable */ + +/****************** Bit definition for FSMC_BCR3 register *******************/ +#define FSMC_BCR3_MBKEN ((uint32_t)0x00000001) /*!< Memory bank enable bit */ +#define FSMC_BCR3_MUXEN ((uint32_t)0x00000002) /*!< Address/data multiplexing enable bit */ + +#define FSMC_BCR3_MTYP ((uint32_t)0x0000000C) /*!< MTYP[1:0] bits (Memory type) */ +#define FSMC_BCR3_MTYP_0 ((uint32_t)0x00000004) /*!< Bit 0 */ +#define FSMC_BCR3_MTYP_1 ((uint32_t)0x00000008) /*!< Bit 1 */ + +#define FSMC_BCR3_MWID ((uint32_t)0x00000030) /*!< MWID[1:0] bits (Memory data bus width) */ +#define FSMC_BCR3_MWID_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define FSMC_BCR3_MWID_1 ((uint32_t)0x00000020) /*!< Bit 1 */ + +#define FSMC_BCR3_FACCEN ((uint32_t)0x00000040) /*!< Flash access enable */ +#define FSMC_BCR3_BURSTEN ((uint32_t)0x00000100) /*!< Burst enable bit */ +#define FSMC_BCR3_WAITPOL ((uint32_t)0x00000200) /*!< Wait signal polarity bit. */ +#define FSMC_BCR3_WRAPMOD ((uint32_t)0x00000400) /*!< Wrapped burst mode support */ +#define FSMC_BCR3_WAITCFG ((uint32_t)0x00000800) /*!< Wait timing configuration */ +#define FSMC_BCR3_WREN ((uint32_t)0x00001000) /*!< Write enable bit */ +#define FSMC_BCR3_WAITEN ((uint32_t)0x00002000) /*!< Wait enable bit */ +#define FSMC_BCR3_EXTMOD ((uint32_t)0x00004000) /*!< Extended mode enable */ +#define FSMC_BCR3_ASYNCWAIT ((uint32_t)0x00008000) /*!< Asynchronous wait */ +#define FSMC_BCR3_CBURSTRW ((uint32_t)0x00080000) /*!< Write burst enable */ + +/****************** Bit definition for FSMC_BCR4 register *******************/ +#define FSMC_BCR4_MBKEN ((uint32_t)0x00000001) /*!< Memory bank enable bit */ +#define FSMC_BCR4_MUXEN ((uint32_t)0x00000002) /*!< Address/data multiplexing enable bit */ + +#define FSMC_BCR4_MTYP ((uint32_t)0x0000000C) /*!< MTYP[1:0] bits (Memory type) */ +#define FSMC_BCR4_MTYP_0 ((uint32_t)0x00000004) /*!< Bit 0 */ +#define FSMC_BCR4_MTYP_1 ((uint32_t)0x00000008) /*!< Bit 1 */ + +#define FSMC_BCR4_MWID ((uint32_t)0x00000030) /*!< MWID[1:0] bits (Memory data bus width) */ +#define FSMC_BCR4_MWID_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define FSMC_BCR4_MWID_1 ((uint32_t)0x00000020) /*!< Bit 1 */ + +#define FSMC_BCR4_FACCEN ((uint32_t)0x00000040) /*!< Flash access enable */ +#define FSMC_BCR4_BURSTEN ((uint32_t)0x00000100) /*!< Burst enable bit */ +#define FSMC_BCR4_WAITPOL ((uint32_t)0x00000200) /*!< Wait signal polarity bit */ +#define FSMC_BCR4_WRAPMOD ((uint32_t)0x00000400) /*!< Wrapped burst mode support */ +#define FSMC_BCR4_WAITCFG ((uint32_t)0x00000800) /*!< Wait timing configuration */ +#define FSMC_BCR4_WREN ((uint32_t)0x00001000) /*!< Write enable bit */ +#define FSMC_BCR4_WAITEN ((uint32_t)0x00002000) /*!< Wait enable bit */ +#define FSMC_BCR4_EXTMOD ((uint32_t)0x00004000) /*!< Extended mode enable */ +#define FSMC_BCR4_ASYNCWAIT ((uint32_t)0x00008000) /*!< Asynchronous wait */ +#define FSMC_BCR4_CBURSTRW ((uint32_t)0x00080000) /*!< Write burst enable */ + +/****************** Bit definition for FSMC_BTR1 register ******************/ +#define FSMC_BTR1_ADDSET ((uint32_t)0x0000000F) /*!< ADDSET[3:0] bits (Address setup phase duration) */ +#define FSMC_BTR1_ADDSET_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define FSMC_BTR1_ADDSET_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define FSMC_BTR1_ADDSET_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define FSMC_BTR1_ADDSET_3 ((uint32_t)0x00000008) /*!< Bit 3 */ + +#define FSMC_BTR1_ADDHLD ((uint32_t)0x000000F0) /*!< ADDHLD[3:0] bits (Address-hold phase duration) */ +#define FSMC_BTR1_ADDHLD_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define FSMC_BTR1_ADDHLD_1 ((uint32_t)0x00000020) /*!< Bit 1 */ +#define FSMC_BTR1_ADDHLD_2 ((uint32_t)0x00000040) /*!< Bit 2 */ +#define FSMC_BTR1_ADDHLD_3 ((uint32_t)0x00000080) /*!< Bit 3 */ + +#define FSMC_BTR1_DATAST ((uint32_t)0x0000FF00) /*!< DATAST [3:0] bits (Data-phase duration) */ +#define FSMC_BTR1_DATAST_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define FSMC_BTR1_DATAST_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define FSMC_BTR1_DATAST_2 ((uint32_t)0x00000400) /*!< Bit 2 */ +#define FSMC_BTR1_DATAST_3 ((uint32_t)0x00000800) /*!< Bit 3 */ + +#define FSMC_BTR1_BUSTURN ((uint32_t)0x000F0000) /*!< BUSTURN[3:0] bits (Bus turnaround phase duration) */ +#define FSMC_BTR1_BUSTURN_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define FSMC_BTR1_BUSTURN_1 ((uint32_t)0x00020000) /*!< Bit 1 */ +#define FSMC_BTR1_BUSTURN_2 ((uint32_t)0x00040000) /*!< Bit 2 */ +#define FSMC_BTR1_BUSTURN_3 ((uint32_t)0x00080000) /*!< Bit 3 */ + +#define FSMC_BTR1_CLKDIV ((uint32_t)0x00F00000) /*!< CLKDIV[3:0] bits (Clock divide ratio) */ +#define FSMC_BTR1_CLKDIV_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define FSMC_BTR1_CLKDIV_1 ((uint32_t)0x00200000) /*!< Bit 1 */ +#define FSMC_BTR1_CLKDIV_2 ((uint32_t)0x00400000) /*!< Bit 2 */ +#define FSMC_BTR1_CLKDIV_3 ((uint32_t)0x00800000) /*!< Bit 3 */ + +#define FSMC_BTR1_DATLAT ((uint32_t)0x0F000000) /*!< DATLA[3:0] bits (Data latency) */ +#define FSMC_BTR1_DATLAT_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define FSMC_BTR1_DATLAT_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define FSMC_BTR1_DATLAT_2 ((uint32_t)0x04000000) /*!< Bit 2 */ +#define FSMC_BTR1_DATLAT_3 ((uint32_t)0x08000000) /*!< Bit 3 */ + +#define FSMC_BTR1_ACCMOD ((uint32_t)0x30000000) /*!< ACCMOD[1:0] bits (Access mode) */ +#define FSMC_BTR1_ACCMOD_0 ((uint32_t)0x10000000) /*!< Bit 0 */ +#define FSMC_BTR1_ACCMOD_1 ((uint32_t)0x20000000) /*!< Bit 1 */ + +/****************** Bit definition for FSMC_BTR2 register *******************/ +#define FSMC_BTR2_ADDSET ((uint32_t)0x0000000F) /*!< ADDSET[3:0] bits (Address setup phase duration) */ +#define FSMC_BTR2_ADDSET_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define FSMC_BTR2_ADDSET_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define FSMC_BTR2_ADDSET_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define FSMC_BTR2_ADDSET_3 ((uint32_t)0x00000008) /*!< Bit 3 */ + +#define FSMC_BTR2_ADDHLD ((uint32_t)0x000000F0) /*!< ADDHLD[3:0] bits (Address-hold phase duration) */ +#define FSMC_BTR2_ADDHLD_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define FSMC_BTR2_ADDHLD_1 ((uint32_t)0x00000020) /*!< Bit 1 */ +#define FSMC_BTR2_ADDHLD_2 ((uint32_t)0x00000040) /*!< Bit 2 */ +#define FSMC_BTR2_ADDHLD_3 ((uint32_t)0x00000080) /*!< Bit 3 */ + +#define FSMC_BTR2_DATAST ((uint32_t)0x0000FF00) /*!< DATAST [3:0] bits (Data-phase duration) */ +#define FSMC_BTR2_DATAST_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define FSMC_BTR2_DATAST_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define FSMC_BTR2_DATAST_2 ((uint32_t)0x00000400) /*!< Bit 2 */ +#define FSMC_BTR2_DATAST_3 ((uint32_t)0x00000800) /*!< Bit 3 */ + +#define FSMC_BTR2_BUSTURN ((uint32_t)0x000F0000) /*!< BUSTURN[3:0] bits (Bus turnaround phase duration) */ +#define FSMC_BTR2_BUSTURN_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define FSMC_BTR2_BUSTURN_1 ((uint32_t)0x00020000) /*!< Bit 1 */ +#define FSMC_BTR2_BUSTURN_2 ((uint32_t)0x00040000) /*!< Bit 2 */ +#define FSMC_BTR2_BUSTURN_3 ((uint32_t)0x00080000) /*!< Bit 3 */ + +#define FSMC_BTR2_CLKDIV ((uint32_t)0x00F00000) /*!< CLKDIV[3:0] bits (Clock divide ratio) */ +#define FSMC_BTR2_CLKDIV_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define FSMC_BTR2_CLKDIV_1 ((uint32_t)0x00200000) /*!< Bit 1 */ +#define FSMC_BTR2_CLKDIV_2 ((uint32_t)0x00400000) /*!< Bit 2 */ +#define FSMC_BTR2_CLKDIV_3 ((uint32_t)0x00800000) /*!< Bit 3 */ + +#define FSMC_BTR2_DATLAT ((uint32_t)0x0F000000) /*!< DATLA[3:0] bits (Data latency) */ +#define FSMC_BTR2_DATLAT_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define FSMC_BTR2_DATLAT_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define FSMC_BTR2_DATLAT_2 ((uint32_t)0x04000000) /*!< Bit 2 */ +#define FSMC_BTR2_DATLAT_3 ((uint32_t)0x08000000) /*!< Bit 3 */ + +#define FSMC_BTR2_ACCMOD ((uint32_t)0x30000000) /*!< ACCMOD[1:0] bits (Access mode) */ +#define FSMC_BTR2_ACCMOD_0 ((uint32_t)0x10000000) /*!< Bit 0 */ +#define FSMC_BTR2_ACCMOD_1 ((uint32_t)0x20000000) /*!< Bit 1 */ + +/******************* Bit definition for FSMC_BTR3 register *******************/ +#define FSMC_BTR3_ADDSET ((uint32_t)0x0000000F) /*!< ADDSET[3:0] bits (Address setup phase duration) */ +#define FSMC_BTR3_ADDSET_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define FSMC_BTR3_ADDSET_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define FSMC_BTR3_ADDSET_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define FSMC_BTR3_ADDSET_3 ((uint32_t)0x00000008) /*!< Bit 3 */ + +#define FSMC_BTR3_ADDHLD ((uint32_t)0x000000F0) /*!< ADDHLD[3:0] bits (Address-hold phase duration) */ +#define FSMC_BTR3_ADDHLD_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define FSMC_BTR3_ADDHLD_1 ((uint32_t)0x00000020) /*!< Bit 1 */ +#define FSMC_BTR3_ADDHLD_2 ((uint32_t)0x00000040) /*!< Bit 2 */ +#define FSMC_BTR3_ADDHLD_3 ((uint32_t)0x00000080) /*!< Bit 3 */ + +#define FSMC_BTR3_DATAST ((uint32_t)0x0000FF00) /*!< DATAST [3:0] bits (Data-phase duration) */ +#define FSMC_BTR3_DATAST_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define FSMC_BTR3_DATAST_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define FSMC_BTR3_DATAST_2 ((uint32_t)0x00000400) /*!< Bit 2 */ +#define FSMC_BTR3_DATAST_3 ((uint32_t)0x00000800) /*!< Bit 3 */ + +#define FSMC_BTR3_BUSTURN ((uint32_t)0x000F0000) /*!< BUSTURN[3:0] bits (Bus turnaround phase duration) */ +#define FSMC_BTR3_BUSTURN_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define FSMC_BTR3_BUSTURN_1 ((uint32_t)0x00020000) /*!< Bit 1 */ +#define FSMC_BTR3_BUSTURN_2 ((uint32_t)0x00040000) /*!< Bit 2 */ +#define FSMC_BTR3_BUSTURN_3 ((uint32_t)0x00080000) /*!< Bit 3 */ + +#define FSMC_BTR3_CLKDIV ((uint32_t)0x00F00000) /*!< CLKDIV[3:0] bits (Clock divide ratio) */ +#define FSMC_BTR3_CLKDIV_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define FSMC_BTR3_CLKDIV_1 ((uint32_t)0x00200000) /*!< Bit 1 */ +#define FSMC_BTR3_CLKDIV_2 ((uint32_t)0x00400000) /*!< Bit 2 */ +#define FSMC_BTR3_CLKDIV_3 ((uint32_t)0x00800000) /*!< Bit 3 */ + +#define FSMC_BTR3_DATLAT ((uint32_t)0x0F000000) /*!< DATLA[3:0] bits (Data latency) */ +#define FSMC_BTR3_DATLAT_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define FSMC_BTR3_DATLAT_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define FSMC_BTR3_DATLAT_2 ((uint32_t)0x04000000) /*!< Bit 2 */ +#define FSMC_BTR3_DATLAT_3 ((uint32_t)0x08000000) /*!< Bit 3 */ + +#define FSMC_BTR3_ACCMOD ((uint32_t)0x30000000) /*!< ACCMOD[1:0] bits (Access mode) */ +#define FSMC_BTR3_ACCMOD_0 ((uint32_t)0x10000000) /*!< Bit 0 */ +#define FSMC_BTR3_ACCMOD_1 ((uint32_t)0x20000000) /*!< Bit 1 */ + +/****************** Bit definition for FSMC_BTR4 register *******************/ +#define FSMC_BTR4_ADDSET ((uint32_t)0x0000000F) /*!< ADDSET[3:0] bits (Address setup phase duration) */ +#define FSMC_BTR4_ADDSET_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define FSMC_BTR4_ADDSET_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define FSMC_BTR4_ADDSET_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define FSMC_BTR4_ADDSET_3 ((uint32_t)0x00000008) /*!< Bit 3 */ + +#define FSMC_BTR4_ADDHLD ((uint32_t)0x000000F0) /*!< ADDHLD[3:0] bits (Address-hold phase duration) */ +#define FSMC_BTR4_ADDHLD_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define FSMC_BTR4_ADDHLD_1 ((uint32_t)0x00000020) /*!< Bit 1 */ +#define FSMC_BTR4_ADDHLD_2 ((uint32_t)0x00000040) /*!< Bit 2 */ +#define FSMC_BTR4_ADDHLD_3 ((uint32_t)0x00000080) /*!< Bit 3 */ + +#define FSMC_BTR4_DATAST ((uint32_t)0x0000FF00) /*!< DATAST [3:0] bits (Data-phase duration) */ +#define FSMC_BTR4_DATAST_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define FSMC_BTR4_DATAST_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define FSMC_BTR4_DATAST_2 ((uint32_t)0x00000400) /*!< Bit 2 */ +#define FSMC_BTR4_DATAST_3 ((uint32_t)0x00000800) /*!< Bit 3 */ + +#define FSMC_BTR4_BUSTURN ((uint32_t)0x000F0000) /*!< BUSTURN[3:0] bits (Bus turnaround phase duration) */ +#define FSMC_BTR4_BUSTURN_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define FSMC_BTR4_BUSTURN_1 ((uint32_t)0x00020000) /*!< Bit 1 */ +#define FSMC_BTR4_BUSTURN_2 ((uint32_t)0x00040000) /*!< Bit 2 */ +#define FSMC_BTR4_BUSTURN_3 ((uint32_t)0x00080000) /*!< Bit 3 */ + +#define FSMC_BTR4_CLKDIV ((uint32_t)0x00F00000) /*!< CLKDIV[3:0] bits (Clock divide ratio) */ +#define FSMC_BTR4_CLKDIV_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define FSMC_BTR4_CLKDIV_1 ((uint32_t)0x00200000) /*!< Bit 1 */ +#define FSMC_BTR4_CLKDIV_2 ((uint32_t)0x00400000) /*!< Bit 2 */ +#define FSMC_BTR4_CLKDIV_3 ((uint32_t)0x00800000) /*!< Bit 3 */ + +#define FSMC_BTR4_DATLAT ((uint32_t)0x0F000000) /*!< DATLA[3:0] bits (Data latency) */ +#define FSMC_BTR4_DATLAT_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define FSMC_BTR4_DATLAT_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define FSMC_BTR4_DATLAT_2 ((uint32_t)0x04000000) /*!< Bit 2 */ +#define FSMC_BTR4_DATLAT_3 ((uint32_t)0x08000000) /*!< Bit 3 */ + +#define FSMC_BTR4_ACCMOD ((uint32_t)0x30000000) /*!< ACCMOD[1:0] bits (Access mode) */ +#define FSMC_BTR4_ACCMOD_0 ((uint32_t)0x10000000) /*!< Bit 0 */ +#define FSMC_BTR4_ACCMOD_1 ((uint32_t)0x20000000) /*!< Bit 1 */ + +/****************** Bit definition for FSMC_BWTR1 register ******************/ +#define FSMC_BWTR1_ADDSET ((uint32_t)0x0000000F) /*!< ADDSET[3:0] bits (Address setup phase duration) */ +#define FSMC_BWTR1_ADDSET_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define FSMC_BWTR1_ADDSET_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define FSMC_BWTR1_ADDSET_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define FSMC_BWTR1_ADDSET_3 ((uint32_t)0x00000008) /*!< Bit 3 */ + +#define FSMC_BWTR1_ADDHLD ((uint32_t)0x000000F0) /*!< ADDHLD[3:0] bits (Address-hold phase duration) */ +#define FSMC_BWTR1_ADDHLD_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define FSMC_BWTR1_ADDHLD_1 ((uint32_t)0x00000020) /*!< Bit 1 */ +#define FSMC_BWTR1_ADDHLD_2 ((uint32_t)0x00000040) /*!< Bit 2 */ +#define FSMC_BWTR1_ADDHLD_3 ((uint32_t)0x00000080) /*!< Bit 3 */ + +#define FSMC_BWTR1_DATAST ((uint32_t)0x0000FF00) /*!< DATAST [3:0] bits (Data-phase duration) */ +#define FSMC_BWTR1_DATAST_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define FSMC_BWTR1_DATAST_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define FSMC_BWTR1_DATAST_2 ((uint32_t)0x00000400) /*!< Bit 2 */ +#define FSMC_BWTR1_DATAST_3 ((uint32_t)0x00000800) /*!< Bit 3 */ + +#define FSMC_BWTR1_CLKDIV ((uint32_t)0x00F00000) /*!< CLKDIV[3:0] bits (Clock divide ratio) */ +#define FSMC_BWTR1_CLKDIV_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define FSMC_BWTR1_CLKDIV_1 ((uint32_t)0x00200000) /*!< Bit 1 */ +#define FSMC_BWTR1_CLKDIV_2 ((uint32_t)0x00400000) /*!< Bit 2 */ +#define FSMC_BWTR1_CLKDIV_3 ((uint32_t)0x00800000) /*!< Bit 3 */ + +#define FSMC_BWTR1_DATLAT ((uint32_t)0x0F000000) /*!< DATLA[3:0] bits (Data latency) */ +#define FSMC_BWTR1_DATLAT_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define FSMC_BWTR1_DATLAT_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define FSMC_BWTR1_DATLAT_2 ((uint32_t)0x04000000) /*!< Bit 2 */ +#define FSMC_BWTR1_DATLAT_3 ((uint32_t)0x08000000) /*!< Bit 3 */ + +#define FSMC_BWTR1_ACCMOD ((uint32_t)0x30000000) /*!< ACCMOD[1:0] bits (Access mode) */ +#define FSMC_BWTR1_ACCMOD_0 ((uint32_t)0x10000000) /*!< Bit 0 */ +#define FSMC_BWTR1_ACCMOD_1 ((uint32_t)0x20000000) /*!< Bit 1 */ + +/****************** Bit definition for FSMC_BWTR2 register ******************/ +#define FSMC_BWTR2_ADDSET ((uint32_t)0x0000000F) /*!< ADDSET[3:0] bits (Address setup phase duration) */ +#define FSMC_BWTR2_ADDSET_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define FSMC_BWTR2_ADDSET_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define FSMC_BWTR2_ADDSET_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define FSMC_BWTR2_ADDSET_3 ((uint32_t)0x00000008) /*!< Bit 3 */ + +#define FSMC_BWTR2_ADDHLD ((uint32_t)0x000000F0) /*!< ADDHLD[3:0] bits (Address-hold phase duration) */ +#define FSMC_BWTR2_ADDHLD_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define FSMC_BWTR2_ADDHLD_1 ((uint32_t)0x00000020) /*!< Bit 1 */ +#define FSMC_BWTR2_ADDHLD_2 ((uint32_t)0x00000040) /*!< Bit 2 */ +#define FSMC_BWTR2_ADDHLD_3 ((uint32_t)0x00000080) /*!< Bit 3 */ + +#define FSMC_BWTR2_DATAST ((uint32_t)0x0000FF00) /*!< DATAST [3:0] bits (Data-phase duration) */ +#define FSMC_BWTR2_DATAST_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define FSMC_BWTR2_DATAST_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define FSMC_BWTR2_DATAST_2 ((uint32_t)0x00000400) /*!< Bit 2 */ +#define FSMC_BWTR2_DATAST_3 ((uint32_t)0x00000800) /*!< Bit 3 */ + +#define FSMC_BWTR2_CLKDIV ((uint32_t)0x00F00000) /*!< CLKDIV[3:0] bits (Clock divide ratio) */ +#define FSMC_BWTR2_CLKDIV_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define FSMC_BWTR2_CLKDIV_1 ((uint32_t)0x00200000) /*!< Bit 1*/ +#define FSMC_BWTR2_CLKDIV_2 ((uint32_t)0x00400000) /*!< Bit 2 */ +#define FSMC_BWTR2_CLKDIV_3 ((uint32_t)0x00800000) /*!< Bit 3 */ + +#define FSMC_BWTR2_DATLAT ((uint32_t)0x0F000000) /*!< DATLA[3:0] bits (Data latency) */ +#define FSMC_BWTR2_DATLAT_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define FSMC_BWTR2_DATLAT_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define FSMC_BWTR2_DATLAT_2 ((uint32_t)0x04000000) /*!< Bit 2 */ +#define FSMC_BWTR2_DATLAT_3 ((uint32_t)0x08000000) /*!< Bit 3 */ + +#define FSMC_BWTR2_ACCMOD ((uint32_t)0x30000000) /*!< ACCMOD[1:0] bits (Access mode) */ +#define FSMC_BWTR2_ACCMOD_0 ((uint32_t)0x10000000) /*!< Bit 0 */ +#define FSMC_BWTR2_ACCMOD_1 ((uint32_t)0x20000000) /*!< Bit 1 */ + +/****************** Bit definition for FSMC_BWTR3 register ******************/ +#define FSMC_BWTR3_ADDSET ((uint32_t)0x0000000F) /*!< ADDSET[3:0] bits (Address setup phase duration) */ +#define FSMC_BWTR3_ADDSET_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define FSMC_BWTR3_ADDSET_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define FSMC_BWTR3_ADDSET_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define FSMC_BWTR3_ADDSET_3 ((uint32_t)0x00000008) /*!< Bit 3 */ + +#define FSMC_BWTR3_ADDHLD ((uint32_t)0x000000F0) /*!< ADDHLD[3:0] bits (Address-hold phase duration) */ +#define FSMC_BWTR3_ADDHLD_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define FSMC_BWTR3_ADDHLD_1 ((uint32_t)0x00000020) /*!< Bit 1 */ +#define FSMC_BWTR3_ADDHLD_2 ((uint32_t)0x00000040) /*!< Bit 2 */ +#define FSMC_BWTR3_ADDHLD_3 ((uint32_t)0x00000080) /*!< Bit 3 */ + +#define FSMC_BWTR3_DATAST ((uint32_t)0x0000FF00) /*!< DATAST [3:0] bits (Data-phase duration) */ +#define FSMC_BWTR3_DATAST_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define FSMC_BWTR3_DATAST_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define FSMC_BWTR3_DATAST_2 ((uint32_t)0x00000400) /*!< Bit 2 */ +#define FSMC_BWTR3_DATAST_3 ((uint32_t)0x00000800) /*!< Bit 3 */ + +#define FSMC_BWTR3_CLKDIV ((uint32_t)0x00F00000) /*!< CLKDIV[3:0] bits (Clock divide ratio) */ +#define FSMC_BWTR3_CLKDIV_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define FSMC_BWTR3_CLKDIV_1 ((uint32_t)0x00200000) /*!< Bit 1 */ +#define FSMC_BWTR3_CLKDIV_2 ((uint32_t)0x00400000) /*!< Bit 2 */ +#define FSMC_BWTR3_CLKDIV_3 ((uint32_t)0x00800000) /*!< Bit 3 */ + +#define FSMC_BWTR3_DATLAT ((uint32_t)0x0F000000) /*!< DATLA[3:0] bits (Data latency) */ +#define FSMC_BWTR3_DATLAT_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define FSMC_BWTR3_DATLAT_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define FSMC_BWTR3_DATLAT_2 ((uint32_t)0x04000000) /*!< Bit 2 */ +#define FSMC_BWTR3_DATLAT_3 ((uint32_t)0x08000000) /*!< Bit 3 */ + +#define FSMC_BWTR3_ACCMOD ((uint32_t)0x30000000) /*!< ACCMOD[1:0] bits (Access mode) */ +#define FSMC_BWTR3_ACCMOD_0 ((uint32_t)0x10000000) /*!< Bit 0 */ +#define FSMC_BWTR3_ACCMOD_1 ((uint32_t)0x20000000) /*!< Bit 1 */ + +/****************** Bit definition for FSMC_BWTR4 register ******************/ +#define FSMC_BWTR4_ADDSET ((uint32_t)0x0000000F) /*!< ADDSET[3:0] bits (Address setup phase duration) */ +#define FSMC_BWTR4_ADDSET_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define FSMC_BWTR4_ADDSET_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define FSMC_BWTR4_ADDSET_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define FSMC_BWTR4_ADDSET_3 ((uint32_t)0x00000008) /*!< Bit 3 */ + +#define FSMC_BWTR4_ADDHLD ((uint32_t)0x000000F0) /*!< ADDHLD[3:0] bits (Address-hold phase duration) */ +#define FSMC_BWTR4_ADDHLD_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define FSMC_BWTR4_ADDHLD_1 ((uint32_t)0x00000020) /*!< Bit 1 */ +#define FSMC_BWTR4_ADDHLD_2 ((uint32_t)0x00000040) /*!< Bit 2 */ +#define FSMC_BWTR4_ADDHLD_3 ((uint32_t)0x00000080) /*!< Bit 3 */ + +#define FSMC_BWTR4_DATAST ((uint32_t)0x0000FF00) /*!< DATAST [3:0] bits (Data-phase duration) */ +#define FSMC_BWTR4_DATAST_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define FSMC_BWTR4_DATAST_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define FSMC_BWTR4_DATAST_2 ((uint32_t)0x00000400) /*!< Bit 2 */ +#define FSMC_BWTR4_DATAST_3 ((uint32_t)0x00000800) /*!< Bit 3 */ + +#define FSMC_BWTR4_CLKDIV ((uint32_t)0x00F00000) /*!< CLKDIV[3:0] bits (Clock divide ratio) */ +#define FSMC_BWTR4_CLKDIV_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define FSMC_BWTR4_CLKDIV_1 ((uint32_t)0x00200000) /*!< Bit 1 */ +#define FSMC_BWTR4_CLKDIV_2 ((uint32_t)0x00400000) /*!< Bit 2 */ +#define FSMC_BWTR4_CLKDIV_3 ((uint32_t)0x00800000) /*!< Bit 3 */ + +#define FSMC_BWTR4_DATLAT ((uint32_t)0x0F000000) /*!< DATLA[3:0] bits (Data latency) */ +#define FSMC_BWTR4_DATLAT_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define FSMC_BWTR4_DATLAT_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define FSMC_BWTR4_DATLAT_2 ((uint32_t)0x04000000) /*!< Bit 2 */ +#define FSMC_BWTR4_DATLAT_3 ((uint32_t)0x08000000) /*!< Bit 3 */ + +#define FSMC_BWTR4_ACCMOD ((uint32_t)0x30000000) /*!< ACCMOD[1:0] bits (Access mode) */ +#define FSMC_BWTR4_ACCMOD_0 ((uint32_t)0x10000000) /*!< Bit 0 */ +#define FSMC_BWTR4_ACCMOD_1 ((uint32_t)0x20000000) /*!< Bit 1 */ + +/****************** Bit definition for FSMC_PCR2 register *******************/ +#define FSMC_PCR2_PWAITEN ((uint32_t)0x00000002) /*!< Wait feature enable bit */ +#define FSMC_PCR2_PBKEN ((uint32_t)0x00000004) /*!< PC Card/NAND Flash memory bank enable bit */ +#define FSMC_PCR2_PTYP ((uint32_t)0x00000008) /*!< Memory type */ + +#define FSMC_PCR2_PWID ((uint32_t)0x00000030) /*!< PWID[1:0] bits (NAND Flash databus width) */ +#define FSMC_PCR2_PWID_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define FSMC_PCR2_PWID_1 ((uint32_t)0x00000020) /*!< Bit 1 */ + +#define FSMC_PCR2_ECCEN ((uint32_t)0x00000040) /*!< ECC computation logic enable bit */ + +#define FSMC_PCR2_TCLR ((uint32_t)0x00001E00) /*!< TCLR[3:0] bits (CLE to RE delay) */ +#define FSMC_PCR2_TCLR_0 ((uint32_t)0x00000200) /*!< Bit 0 */ +#define FSMC_PCR2_TCLR_1 ((uint32_t)0x00000400) /*!< Bit 1 */ +#define FSMC_PCR2_TCLR_2 ((uint32_t)0x00000800) /*!< Bit 2 */ +#define FSMC_PCR2_TCLR_3 ((uint32_t)0x00001000) /*!< Bit 3 */ + +#define FSMC_PCR2_TAR ((uint32_t)0x0001E000) /*!< TAR[3:0] bits (ALE to RE delay) */ +#define FSMC_PCR2_TAR_0 ((uint32_t)0x00002000) /*!< Bit 0 */ +#define FSMC_PCR2_TAR_1 ((uint32_t)0x00004000) /*!< Bit 1 */ +#define FSMC_PCR2_TAR_2 ((uint32_t)0x00008000) /*!< Bit 2 */ +#define FSMC_PCR2_TAR_3 ((uint32_t)0x00010000) /*!< Bit 3 */ + +#define FSMC_PCR2_ECCPS ((uint32_t)0x000E0000) /*!< ECCPS[1:0] bits (ECC page size) */ +#define FSMC_PCR2_ECCPS_0 ((uint32_t)0x00020000) /*!< Bit 0 */ +#define FSMC_PCR2_ECCPS_1 ((uint32_t)0x00040000) /*!< Bit 1 */ +#define FSMC_PCR2_ECCPS_2 ((uint32_t)0x00080000) /*!< Bit 2 */ + +/****************** Bit definition for FSMC_PCR3 register *******************/ +#define FSMC_PCR3_PWAITEN ((uint32_t)0x00000002) /*!< Wait feature enable bit */ +#define FSMC_PCR3_PBKEN ((uint32_t)0x00000004) /*!< PC Card/NAND Flash memory bank enable bit */ +#define FSMC_PCR3_PTYP ((uint32_t)0x00000008) /*!< Memory type */ + +#define FSMC_PCR3_PWID ((uint32_t)0x00000030) /*!< PWID[1:0] bits (NAND Flash databus width) */ +#define FSMC_PCR3_PWID_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define FSMC_PCR3_PWID_1 ((uint32_t)0x00000020) /*!< Bit 1 */ + +#define FSMC_PCR3_ECCEN ((uint32_t)0x00000040) /*!< ECC computation logic enable bit */ + +#define FSMC_PCR3_TCLR ((uint32_t)0x00001E00) /*!< TCLR[3:0] bits (CLE to RE delay) */ +#define FSMC_PCR3_TCLR_0 ((uint32_t)0x00000200) /*!< Bit 0 */ +#define FSMC_PCR3_TCLR_1 ((uint32_t)0x00000400) /*!< Bit 1 */ +#define FSMC_PCR3_TCLR_2 ((uint32_t)0x00000800) /*!< Bit 2 */ +#define FSMC_PCR3_TCLR_3 ((uint32_t)0x00001000) /*!< Bit 3 */ + +#define FSMC_PCR3_TAR ((uint32_t)0x0001E000) /*!< TAR[3:0] bits (ALE to RE delay) */ +#define FSMC_PCR3_TAR_0 ((uint32_t)0x00002000) /*!< Bit 0 */ +#define FSMC_PCR3_TAR_1 ((uint32_t)0x00004000) /*!< Bit 1 */ +#define FSMC_PCR3_TAR_2 ((uint32_t)0x00008000) /*!< Bit 2 */ +#define FSMC_PCR3_TAR_3 ((uint32_t)0x00010000) /*!< Bit 3 */ + +#define FSMC_PCR3_ECCPS ((uint32_t)0x000E0000) /*!< ECCPS[2:0] bits (ECC page size) */ +#define FSMC_PCR3_ECCPS_0 ((uint32_t)0x00020000) /*!< Bit 0 */ +#define FSMC_PCR3_ECCPS_1 ((uint32_t)0x00040000) /*!< Bit 1 */ +#define FSMC_PCR3_ECCPS_2 ((uint32_t)0x00080000) /*!< Bit 2 */ + +/****************** Bit definition for FSMC_PCR4 register *******************/ +#define FSMC_PCR4_PWAITEN ((uint32_t)0x00000002) /*!< Wait feature enable bit */ +#define FSMC_PCR4_PBKEN ((uint32_t)0x00000004) /*!< PC Card/NAND Flash memory bank enable bit */ +#define FSMC_PCR4_PTYP ((uint32_t)0x00000008) /*!< Memory type */ + +#define FSMC_PCR4_PWID ((uint32_t)0x00000030) /*!< PWID[1:0] bits (NAND Flash databus width) */ +#define FSMC_PCR4_PWID_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define FSMC_PCR4_PWID_1 ((uint32_t)0x00000020) /*!< Bit 1 */ + +#define FSMC_PCR4_ECCEN ((uint32_t)0x00000040) /*!< ECC computation logic enable bit */ + +#define FSMC_PCR4_TCLR ((uint32_t)0x00001E00) /*!< TCLR[3:0] bits (CLE to RE delay) */ +#define FSMC_PCR4_TCLR_0 ((uint32_t)0x00000200) /*!< Bit 0 */ +#define FSMC_PCR4_TCLR_1 ((uint32_t)0x00000400) /*!< Bit 1 */ +#define FSMC_PCR4_TCLR_2 ((uint32_t)0x00000800) /*!< Bit 2 */ +#define FSMC_PCR4_TCLR_3 ((uint32_t)0x00001000) /*!< Bit 3 */ + +#define FSMC_PCR4_TAR ((uint32_t)0x0001E000) /*!< TAR[3:0] bits (ALE to RE delay) */ +#define FSMC_PCR4_TAR_0 ((uint32_t)0x00002000) /*!< Bit 0 */ +#define FSMC_PCR4_TAR_1 ((uint32_t)0x00004000) /*!< Bit 1 */ +#define FSMC_PCR4_TAR_2 ((uint32_t)0x00008000) /*!< Bit 2 */ +#define FSMC_PCR4_TAR_3 ((uint32_t)0x00010000) /*!< Bit 3 */ + +#define FSMC_PCR4_ECCPS ((uint32_t)0x000E0000) /*!< ECCPS[2:0] bits (ECC page size) */ +#define FSMC_PCR4_ECCPS_0 ((uint32_t)0x00020000) /*!< Bit 0 */ +#define FSMC_PCR4_ECCPS_1 ((uint32_t)0x00040000) /*!< Bit 1 */ +#define FSMC_PCR4_ECCPS_2 ((uint32_t)0x00080000) /*!< Bit 2 */ + +/******************* Bit definition for FSMC_SR2 register *******************/ +#define FSMC_SR2_IRS ((uint8_t)0x01) /*!< Interrupt Rising Edge status */ +#define FSMC_SR2_ILS ((uint8_t)0x02) /*!< Interrupt Level status */ +#define FSMC_SR2_IFS ((uint8_t)0x04) /*!< Interrupt Falling Edge status */ +#define FSMC_SR2_IREN ((uint8_t)0x08) /*!< Interrupt Rising Edge detection Enable bit */ +#define FSMC_SR2_ILEN ((uint8_t)0x10) /*!< Interrupt Level detection Enable bit */ +#define FSMC_SR2_IFEN ((uint8_t)0x20) /*!< Interrupt Falling Edge detection Enable bit */ +#define FSMC_SR2_FEMPT ((uint8_t)0x40) /*!< FIFO empty */ + +/******************* Bit definition for FSMC_SR3 register *******************/ +#define FSMC_SR3_IRS ((uint8_t)0x01) /*!< Interrupt Rising Edge status */ +#define FSMC_SR3_ILS ((uint8_t)0x02) /*!< Interrupt Level status */ +#define FSMC_SR3_IFS ((uint8_t)0x04) /*!< Interrupt Falling Edge status */ +#define FSMC_SR3_IREN ((uint8_t)0x08) /*!< Interrupt Rising Edge detection Enable bit */ +#define FSMC_SR3_ILEN ((uint8_t)0x10) /*!< Interrupt Level detection Enable bit */ +#define FSMC_SR3_IFEN ((uint8_t)0x20) /*!< Interrupt Falling Edge detection Enable bit */ +#define FSMC_SR3_FEMPT ((uint8_t)0x40) /*!< FIFO empty */ + +/******************* Bit definition for FSMC_SR4 register *******************/ +#define FSMC_SR4_IRS ((uint8_t)0x01) /*!< Interrupt Rising Edge status */ +#define FSMC_SR4_ILS ((uint8_t)0x02) /*!< Interrupt Level status */ +#define FSMC_SR4_IFS ((uint8_t)0x04) /*!< Interrupt Falling Edge status */ +#define FSMC_SR4_IREN ((uint8_t)0x08) /*!< Interrupt Rising Edge detection Enable bit */ +#define FSMC_SR4_ILEN ((uint8_t)0x10) /*!< Interrupt Level detection Enable bit */ +#define FSMC_SR4_IFEN ((uint8_t)0x20) /*!< Interrupt Falling Edge detection Enable bit */ +#define FSMC_SR4_FEMPT ((uint8_t)0x40) /*!< FIFO empty */ + +/****************** Bit definition for FSMC_PMEM2 register ******************/ +#define FSMC_PMEM2_MEMSET2 ((uint32_t)0x000000FF) /*!< MEMSET2[7:0] bits (Common memory 2 setup time) */ +#define FSMC_PMEM2_MEMSET2_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define FSMC_PMEM2_MEMSET2_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define FSMC_PMEM2_MEMSET2_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define FSMC_PMEM2_MEMSET2_3 ((uint32_t)0x00000008) /*!< Bit 3 */ +#define FSMC_PMEM2_MEMSET2_4 ((uint32_t)0x00000010) /*!< Bit 4 */ +#define FSMC_PMEM2_MEMSET2_5 ((uint32_t)0x00000020) /*!< Bit 5 */ +#define FSMC_PMEM2_MEMSET2_6 ((uint32_t)0x00000040) /*!< Bit 6 */ +#define FSMC_PMEM2_MEMSET2_7 ((uint32_t)0x00000080) /*!< Bit 7 */ + +#define FSMC_PMEM2_MEMWAIT2 ((uint32_t)0x0000FF00) /*!< MEMWAIT2[7:0] bits (Common memory 2 wait time) */ +#define FSMC_PMEM2_MEMWAIT2_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define FSMC_PMEM2_MEMWAIT2_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define FSMC_PMEM2_MEMWAIT2_2 ((uint32_t)0x00000400) /*!< Bit 2 */ +#define FSMC_PMEM2_MEMWAIT2_3 ((uint32_t)0x00000800) /*!< Bit 3 */ +#define FSMC_PMEM2_MEMWAIT2_4 ((uint32_t)0x00001000) /*!< Bit 4 */ +#define FSMC_PMEM2_MEMWAIT2_5 ((uint32_t)0x00002000) /*!< Bit 5 */ +#define FSMC_PMEM2_MEMWAIT2_6 ((uint32_t)0x00004000) /*!< Bit 6 */ +#define FSMC_PMEM2_MEMWAIT2_7 ((uint32_t)0x00008000) /*!< Bit 7 */ + +#define FSMC_PMEM2_MEMHOLD2 ((uint32_t)0x00FF0000) /*!< MEMHOLD2[7:0] bits (Common memory 2 hold time) */ +#define FSMC_PMEM2_MEMHOLD2_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define FSMC_PMEM2_MEMHOLD2_1 ((uint32_t)0x00020000) /*!< Bit 1 */ +#define FSMC_PMEM2_MEMHOLD2_2 ((uint32_t)0x00040000) /*!< Bit 2 */ +#define FSMC_PMEM2_MEMHOLD2_3 ((uint32_t)0x00080000) /*!< Bit 3 */ +#define FSMC_PMEM2_MEMHOLD2_4 ((uint32_t)0x00100000) /*!< Bit 4 */ +#define FSMC_PMEM2_MEMHOLD2_5 ((uint32_t)0x00200000) /*!< Bit 5 */ +#define FSMC_PMEM2_MEMHOLD2_6 ((uint32_t)0x00400000) /*!< Bit 6 */ +#define FSMC_PMEM2_MEMHOLD2_7 ((uint32_t)0x00800000) /*!< Bit 7 */ + +#define FSMC_PMEM2_MEMHIZ2 ((uint32_t)0xFF000000) /*!< MEMHIZ2[7:0] bits (Common memory 2 databus HiZ time) */ +#define FSMC_PMEM2_MEMHIZ2_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define FSMC_PMEM2_MEMHIZ2_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define FSMC_PMEM2_MEMHIZ2_2 ((uint32_t)0x04000000) /*!< Bit 2 */ +#define FSMC_PMEM2_MEMHIZ2_3 ((uint32_t)0x08000000) /*!< Bit 3 */ +#define FSMC_PMEM2_MEMHIZ2_4 ((uint32_t)0x10000000) /*!< Bit 4 */ +#define FSMC_PMEM2_MEMHIZ2_5 ((uint32_t)0x20000000) /*!< Bit 5 */ +#define FSMC_PMEM2_MEMHIZ2_6 ((uint32_t)0x40000000) /*!< Bit 6 */ +#define FSMC_PMEM2_MEMHIZ2_7 ((uint32_t)0x80000000) /*!< Bit 7 */ + +/****************** Bit definition for FSMC_PMEM3 register ******************/ +#define FSMC_PMEM3_MEMSET3 ((uint32_t)0x000000FF) /*!< MEMSET3[7:0] bits (Common memory 3 setup time) */ +#define FSMC_PMEM3_MEMSET3_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define FSMC_PMEM3_MEMSET3_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define FSMC_PMEM3_MEMSET3_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define FSMC_PMEM3_MEMSET3_3 ((uint32_t)0x00000008) /*!< Bit 3 */ +#define FSMC_PMEM3_MEMSET3_4 ((uint32_t)0x00000010) /*!< Bit 4 */ +#define FSMC_PMEM3_MEMSET3_5 ((uint32_t)0x00000020) /*!< Bit 5 */ +#define FSMC_PMEM3_MEMSET3_6 ((uint32_t)0x00000040) /*!< Bit 6 */ +#define FSMC_PMEM3_MEMSET3_7 ((uint32_t)0x00000080) /*!< Bit 7 */ + +#define FSMC_PMEM3_MEMWAIT3 ((uint32_t)0x0000FF00) /*!< MEMWAIT3[7:0] bits (Common memory 3 wait time) */ +#define FSMC_PMEM3_MEMWAIT3_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define FSMC_PMEM3_MEMWAIT3_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define FSMC_PMEM3_MEMWAIT3_2 ((uint32_t)0x00000400) /*!< Bit 2 */ +#define FSMC_PMEM3_MEMWAIT3_3 ((uint32_t)0x00000800) /*!< Bit 3 */ +#define FSMC_PMEM3_MEMWAIT3_4 ((uint32_t)0x00001000) /*!< Bit 4 */ +#define FSMC_PMEM3_MEMWAIT3_5 ((uint32_t)0x00002000) /*!< Bit 5 */ +#define FSMC_PMEM3_MEMWAIT3_6 ((uint32_t)0x00004000) /*!< Bit 6 */ +#define FSMC_PMEM3_MEMWAIT3_7 ((uint32_t)0x00008000) /*!< Bit 7 */ + +#define FSMC_PMEM3_MEMHOLD3 ((uint32_t)0x00FF0000) /*!< MEMHOLD3[7:0] bits (Common memory 3 hold time) */ +#define FSMC_PMEM3_MEMHOLD3_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define FSMC_PMEM3_MEMHOLD3_1 ((uint32_t)0x00020000) /*!< Bit 1 */ +#define FSMC_PMEM3_MEMHOLD3_2 ((uint32_t)0x00040000) /*!< Bit 2 */ +#define FSMC_PMEM3_MEMHOLD3_3 ((uint32_t)0x00080000) /*!< Bit 3 */ +#define FSMC_PMEM3_MEMHOLD3_4 ((uint32_t)0x00100000) /*!< Bit 4 */ +#define FSMC_PMEM3_MEMHOLD3_5 ((uint32_t)0x00200000) /*!< Bit 5 */ +#define FSMC_PMEM3_MEMHOLD3_6 ((uint32_t)0x00400000) /*!< Bit 6 */ +#define FSMC_PMEM3_MEMHOLD3_7 ((uint32_t)0x00800000) /*!< Bit 7 */ + +#define FSMC_PMEM3_MEMHIZ3 ((uint32_t)0xFF000000) /*!< MEMHIZ3[7:0] bits (Common memory 3 databus HiZ time) */ +#define FSMC_PMEM3_MEMHIZ3_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define FSMC_PMEM3_MEMHIZ3_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define FSMC_PMEM3_MEMHIZ3_2 ((uint32_t)0x04000000) /*!< Bit 2 */ +#define FSMC_PMEM3_MEMHIZ3_3 ((uint32_t)0x08000000) /*!< Bit 3 */ +#define FSMC_PMEM3_MEMHIZ3_4 ((uint32_t)0x10000000) /*!< Bit 4 */ +#define FSMC_PMEM3_MEMHIZ3_5 ((uint32_t)0x20000000) /*!< Bit 5 */ +#define FSMC_PMEM3_MEMHIZ3_6 ((uint32_t)0x40000000) /*!< Bit 6 */ +#define FSMC_PMEM3_MEMHIZ3_7 ((uint32_t)0x80000000) /*!< Bit 7 */ + +/****************** Bit definition for FSMC_PMEM4 register ******************/ +#define FSMC_PMEM4_MEMSET4 ((uint32_t)0x000000FF) /*!< MEMSET4[7:0] bits (Common memory 4 setup time) */ +#define FSMC_PMEM4_MEMSET4_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define FSMC_PMEM4_MEMSET4_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define FSMC_PMEM4_MEMSET4_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define FSMC_PMEM4_MEMSET4_3 ((uint32_t)0x00000008) /*!< Bit 3 */ +#define FSMC_PMEM4_MEMSET4_4 ((uint32_t)0x00000010) /*!< Bit 4 */ +#define FSMC_PMEM4_MEMSET4_5 ((uint32_t)0x00000020) /*!< Bit 5 */ +#define FSMC_PMEM4_MEMSET4_6 ((uint32_t)0x00000040) /*!< Bit 6 */ +#define FSMC_PMEM4_MEMSET4_7 ((uint32_t)0x00000080) /*!< Bit 7 */ + +#define FSMC_PMEM4_MEMWAIT4 ((uint32_t)0x0000FF00) /*!< MEMWAIT4[7:0] bits (Common memory 4 wait time) */ +#define FSMC_PMEM4_MEMWAIT4_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define FSMC_PMEM4_MEMWAIT4_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define FSMC_PMEM4_MEMWAIT4_2 ((uint32_t)0x00000400) /*!< Bit 2 */ +#define FSMC_PMEM4_MEMWAIT4_3 ((uint32_t)0x00000800) /*!< Bit 3 */ +#define FSMC_PMEM4_MEMWAIT4_4 ((uint32_t)0x00001000) /*!< Bit 4 */ +#define FSMC_PMEM4_MEMWAIT4_5 ((uint32_t)0x00002000) /*!< Bit 5 */ +#define FSMC_PMEM4_MEMWAIT4_6 ((uint32_t)0x00004000) /*!< Bit 6 */ +#define FSMC_PMEM4_MEMWAIT4_7 ((uint32_t)0x00008000) /*!< Bit 7 */ + +#define FSMC_PMEM4_MEMHOLD4 ((uint32_t)0x00FF0000) /*!< MEMHOLD4[7:0] bits (Common memory 4 hold time) */ +#define FSMC_PMEM4_MEMHOLD4_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define FSMC_PMEM4_MEMHOLD4_1 ((uint32_t)0x00020000) /*!< Bit 1 */ +#define FSMC_PMEM4_MEMHOLD4_2 ((uint32_t)0x00040000) /*!< Bit 2 */ +#define FSMC_PMEM4_MEMHOLD4_3 ((uint32_t)0x00080000) /*!< Bit 3 */ +#define FSMC_PMEM4_MEMHOLD4_4 ((uint32_t)0x00100000) /*!< Bit 4 */ +#define FSMC_PMEM4_MEMHOLD4_5 ((uint32_t)0x00200000) /*!< Bit 5 */ +#define FSMC_PMEM4_MEMHOLD4_6 ((uint32_t)0x00400000) /*!< Bit 6 */ +#define FSMC_PMEM4_MEMHOLD4_7 ((uint32_t)0x00800000) /*!< Bit 7 */ + +#define FSMC_PMEM4_MEMHIZ4 ((uint32_t)0xFF000000) /*!< MEMHIZ4[7:0] bits (Common memory 4 databus HiZ time) */ +#define FSMC_PMEM4_MEMHIZ4_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define FSMC_PMEM4_MEMHIZ4_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define FSMC_PMEM4_MEMHIZ4_2 ((uint32_t)0x04000000) /*!< Bit 2 */ +#define FSMC_PMEM4_MEMHIZ4_3 ((uint32_t)0x08000000) /*!< Bit 3 */ +#define FSMC_PMEM4_MEMHIZ4_4 ((uint32_t)0x10000000) /*!< Bit 4 */ +#define FSMC_PMEM4_MEMHIZ4_5 ((uint32_t)0x20000000) /*!< Bit 5 */ +#define FSMC_PMEM4_MEMHIZ4_6 ((uint32_t)0x40000000) /*!< Bit 6 */ +#define FSMC_PMEM4_MEMHIZ4_7 ((uint32_t)0x80000000) /*!< Bit 7 */ + +/****************** Bit definition for FSMC_PATT2 register ******************/ +#define FSMC_PATT2_ATTSET2 ((uint32_t)0x000000FF) /*!< ATTSET2[7:0] bits (Attribute memory 2 setup time) */ +#define FSMC_PATT2_ATTSET2_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define FSMC_PATT2_ATTSET2_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define FSMC_PATT2_ATTSET2_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define FSMC_PATT2_ATTSET2_3 ((uint32_t)0x00000008) /*!< Bit 3 */ +#define FSMC_PATT2_ATTSET2_4 ((uint32_t)0x00000010) /*!< Bit 4 */ +#define FSMC_PATT2_ATTSET2_5 ((uint32_t)0x00000020) /*!< Bit 5 */ +#define FSMC_PATT2_ATTSET2_6 ((uint32_t)0x00000040) /*!< Bit 6 */ +#define FSMC_PATT2_ATTSET2_7 ((uint32_t)0x00000080) /*!< Bit 7 */ + +#define FSMC_PATT2_ATTWAIT2 ((uint32_t)0x0000FF00) /*!< ATTWAIT2[7:0] bits (Attribute memory 2 wait time) */ +#define FSMC_PATT2_ATTWAIT2_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define FSMC_PATT2_ATTWAIT2_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define FSMC_PATT2_ATTWAIT2_2 ((uint32_t)0x00000400) /*!< Bit 2 */ +#define FSMC_PATT2_ATTWAIT2_3 ((uint32_t)0x00000800) /*!< Bit 3 */ +#define FSMC_PATT2_ATTWAIT2_4 ((uint32_t)0x00001000) /*!< Bit 4 */ +#define FSMC_PATT2_ATTWAIT2_5 ((uint32_t)0x00002000) /*!< Bit 5 */ +#define FSMC_PATT2_ATTWAIT2_6 ((uint32_t)0x00004000) /*!< Bit 6 */ +#define FSMC_PATT2_ATTWAIT2_7 ((uint32_t)0x00008000) /*!< Bit 7 */ + +#define FSMC_PATT2_ATTHOLD2 ((uint32_t)0x00FF0000) /*!< ATTHOLD2[7:0] bits (Attribute memory 2 hold time) */ +#define FSMC_PATT2_ATTHOLD2_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define FSMC_PATT2_ATTHOLD2_1 ((uint32_t)0x00020000) /*!< Bit 1 */ +#define FSMC_PATT2_ATTHOLD2_2 ((uint32_t)0x00040000) /*!< Bit 2 */ +#define FSMC_PATT2_ATTHOLD2_3 ((uint32_t)0x00080000) /*!< Bit 3 */ +#define FSMC_PATT2_ATTHOLD2_4 ((uint32_t)0x00100000) /*!< Bit 4 */ +#define FSMC_PATT2_ATTHOLD2_5 ((uint32_t)0x00200000) /*!< Bit 5 */ +#define FSMC_PATT2_ATTHOLD2_6 ((uint32_t)0x00400000) /*!< Bit 6 */ +#define FSMC_PATT2_ATTHOLD2_7 ((uint32_t)0x00800000) /*!< Bit 7 */ + +#define FSMC_PATT2_ATTHIZ2 ((uint32_t)0xFF000000) /*!< ATTHIZ2[7:0] bits (Attribute memory 2 databus HiZ time) */ +#define FSMC_PATT2_ATTHIZ2_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define FSMC_PATT2_ATTHIZ2_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define FSMC_PATT2_ATTHIZ2_2 ((uint32_t)0x04000000) /*!< Bit 2 */ +#define FSMC_PATT2_ATTHIZ2_3 ((uint32_t)0x08000000) /*!< Bit 3 */ +#define FSMC_PATT2_ATTHIZ2_4 ((uint32_t)0x10000000) /*!< Bit 4 */ +#define FSMC_PATT2_ATTHIZ2_5 ((uint32_t)0x20000000) /*!< Bit 5 */ +#define FSMC_PATT2_ATTHIZ2_6 ((uint32_t)0x40000000) /*!< Bit 6 */ +#define FSMC_PATT2_ATTHIZ2_7 ((uint32_t)0x80000000) /*!< Bit 7 */ + +/****************** Bit definition for FSMC_PATT3 register ******************/ +#define FSMC_PATT3_ATTSET3 ((uint32_t)0x000000FF) /*!< ATTSET3[7:0] bits (Attribute memory 3 setup time) */ +#define FSMC_PATT3_ATTSET3_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define FSMC_PATT3_ATTSET3_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define FSMC_PATT3_ATTSET3_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define FSMC_PATT3_ATTSET3_3 ((uint32_t)0x00000008) /*!< Bit 3 */ +#define FSMC_PATT3_ATTSET3_4 ((uint32_t)0x00000010) /*!< Bit 4 */ +#define FSMC_PATT3_ATTSET3_5 ((uint32_t)0x00000020) /*!< Bit 5 */ +#define FSMC_PATT3_ATTSET3_6 ((uint32_t)0x00000040) /*!< Bit 6 */ +#define FSMC_PATT3_ATTSET3_7 ((uint32_t)0x00000080) /*!< Bit 7 */ + +#define FSMC_PATT3_ATTWAIT3 ((uint32_t)0x0000FF00) /*!< ATTWAIT3[7:0] bits (Attribute memory 3 wait time) */ +#define FSMC_PATT3_ATTWAIT3_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define FSMC_PATT3_ATTWAIT3_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define FSMC_PATT3_ATTWAIT3_2 ((uint32_t)0x00000400) /*!< Bit 2 */ +#define FSMC_PATT3_ATTWAIT3_3 ((uint32_t)0x00000800) /*!< Bit 3 */ +#define FSMC_PATT3_ATTWAIT3_4 ((uint32_t)0x00001000) /*!< Bit 4 */ +#define FSMC_PATT3_ATTWAIT3_5 ((uint32_t)0x00002000) /*!< Bit 5 */ +#define FSMC_PATT3_ATTWAIT3_6 ((uint32_t)0x00004000) /*!< Bit 6 */ +#define FSMC_PATT3_ATTWAIT3_7 ((uint32_t)0x00008000) /*!< Bit 7 */ + +#define FSMC_PATT3_ATTHOLD3 ((uint32_t)0x00FF0000) /*!< ATTHOLD3[7:0] bits (Attribute memory 3 hold time) */ +#define FSMC_PATT3_ATTHOLD3_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define FSMC_PATT3_ATTHOLD3_1 ((uint32_t)0x00020000) /*!< Bit 1 */ +#define FSMC_PATT3_ATTHOLD3_2 ((uint32_t)0x00040000) /*!< Bit 2 */ +#define FSMC_PATT3_ATTHOLD3_3 ((uint32_t)0x00080000) /*!< Bit 3 */ +#define FSMC_PATT3_ATTHOLD3_4 ((uint32_t)0x00100000) /*!< Bit 4 */ +#define FSMC_PATT3_ATTHOLD3_5 ((uint32_t)0x00200000) /*!< Bit 5 */ +#define FSMC_PATT3_ATTHOLD3_6 ((uint32_t)0x00400000) /*!< Bit 6 */ +#define FSMC_PATT3_ATTHOLD3_7 ((uint32_t)0x00800000) /*!< Bit 7 */ + +#define FSMC_PATT3_ATTHIZ3 ((uint32_t)0xFF000000) /*!< ATTHIZ3[7:0] bits (Attribute memory 3 databus HiZ time) */ +#define FSMC_PATT3_ATTHIZ3_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define FSMC_PATT3_ATTHIZ3_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define FSMC_PATT3_ATTHIZ3_2 ((uint32_t)0x04000000) /*!< Bit 2 */ +#define FSMC_PATT3_ATTHIZ3_3 ((uint32_t)0x08000000) /*!< Bit 3 */ +#define FSMC_PATT3_ATTHIZ3_4 ((uint32_t)0x10000000) /*!< Bit 4 */ +#define FSMC_PATT3_ATTHIZ3_5 ((uint32_t)0x20000000) /*!< Bit 5 */ +#define FSMC_PATT3_ATTHIZ3_6 ((uint32_t)0x40000000) /*!< Bit 6 */ +#define FSMC_PATT3_ATTHIZ3_7 ((uint32_t)0x80000000) /*!< Bit 7 */ + +/****************** Bit definition for FSMC_PATT4 register ******************/ +#define FSMC_PATT4_ATTSET4 ((uint32_t)0x000000FF) /*!< ATTSET4[7:0] bits (Attribute memory 4 setup time) */ +#define FSMC_PATT4_ATTSET4_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define FSMC_PATT4_ATTSET4_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define FSMC_PATT4_ATTSET4_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define FSMC_PATT4_ATTSET4_3 ((uint32_t)0x00000008) /*!< Bit 3 */ +#define FSMC_PATT4_ATTSET4_4 ((uint32_t)0x00000010) /*!< Bit 4 */ +#define FSMC_PATT4_ATTSET4_5 ((uint32_t)0x00000020) /*!< Bit 5 */ +#define FSMC_PATT4_ATTSET4_6 ((uint32_t)0x00000040) /*!< Bit 6 */ +#define FSMC_PATT4_ATTSET4_7 ((uint32_t)0x00000080) /*!< Bit 7 */ + +#define FSMC_PATT4_ATTWAIT4 ((uint32_t)0x0000FF00) /*!< ATTWAIT4[7:0] bits (Attribute memory 4 wait time) */ +#define FSMC_PATT4_ATTWAIT4_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define FSMC_PATT4_ATTWAIT4_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define FSMC_PATT4_ATTWAIT4_2 ((uint32_t)0x00000400) /*!< Bit 2 */ +#define FSMC_PATT4_ATTWAIT4_3 ((uint32_t)0x00000800) /*!< Bit 3 */ +#define FSMC_PATT4_ATTWAIT4_4 ((uint32_t)0x00001000) /*!< Bit 4 */ +#define FSMC_PATT4_ATTWAIT4_5 ((uint32_t)0x00002000) /*!< Bit 5 */ +#define FSMC_PATT4_ATTWAIT4_6 ((uint32_t)0x00004000) /*!< Bit 6 */ +#define FSMC_PATT4_ATTWAIT4_7 ((uint32_t)0x00008000) /*!< Bit 7 */ + +#define FSMC_PATT4_ATTHOLD4 ((uint32_t)0x00FF0000) /*!< ATTHOLD4[7:0] bits (Attribute memory 4 hold time) */ +#define FSMC_PATT4_ATTHOLD4_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define FSMC_PATT4_ATTHOLD4_1 ((uint32_t)0x00020000) /*!< Bit 1 */ +#define FSMC_PATT4_ATTHOLD4_2 ((uint32_t)0x00040000) /*!< Bit 2 */ +#define FSMC_PATT4_ATTHOLD4_3 ((uint32_t)0x00080000) /*!< Bit 3 */ +#define FSMC_PATT4_ATTHOLD4_4 ((uint32_t)0x00100000) /*!< Bit 4 */ +#define FSMC_PATT4_ATTHOLD4_5 ((uint32_t)0x00200000) /*!< Bit 5 */ +#define FSMC_PATT4_ATTHOLD4_6 ((uint32_t)0x00400000) /*!< Bit 6 */ +#define FSMC_PATT4_ATTHOLD4_7 ((uint32_t)0x00800000) /*!< Bit 7 */ + +#define FSMC_PATT4_ATTHIZ4 ((uint32_t)0xFF000000) /*!< ATTHIZ4[7:0] bits (Attribute memory 4 databus HiZ time) */ +#define FSMC_PATT4_ATTHIZ4_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define FSMC_PATT4_ATTHIZ4_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define FSMC_PATT4_ATTHIZ4_2 ((uint32_t)0x04000000) /*!< Bit 2 */ +#define FSMC_PATT4_ATTHIZ4_3 ((uint32_t)0x08000000) /*!< Bit 3 */ +#define FSMC_PATT4_ATTHIZ4_4 ((uint32_t)0x10000000) /*!< Bit 4 */ +#define FSMC_PATT4_ATTHIZ4_5 ((uint32_t)0x20000000) /*!< Bit 5 */ +#define FSMC_PATT4_ATTHIZ4_6 ((uint32_t)0x40000000) /*!< Bit 6 */ +#define FSMC_PATT4_ATTHIZ4_7 ((uint32_t)0x80000000) /*!< Bit 7 */ + +/****************** Bit definition for FSMC_PIO4 register *******************/ +#define FSMC_PIO4_IOSET4 ((uint32_t)0x000000FF) /*!< IOSET4[7:0] bits (I/O 4 setup time) */ +#define FSMC_PIO4_IOSET4_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define FSMC_PIO4_IOSET4_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define FSMC_PIO4_IOSET4_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define FSMC_PIO4_IOSET4_3 ((uint32_t)0x00000008) /*!< Bit 3 */ +#define FSMC_PIO4_IOSET4_4 ((uint32_t)0x00000010) /*!< Bit 4 */ +#define FSMC_PIO4_IOSET4_5 ((uint32_t)0x00000020) /*!< Bit 5 */ +#define FSMC_PIO4_IOSET4_6 ((uint32_t)0x00000040) /*!< Bit 6 */ +#define FSMC_PIO4_IOSET4_7 ((uint32_t)0x00000080) /*!< Bit 7 */ + +#define FSMC_PIO4_IOWAIT4 ((uint32_t)0x0000FF00) /*!< IOWAIT4[7:0] bits (I/O 4 wait time) */ +#define FSMC_PIO4_IOWAIT4_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define FSMC_PIO4_IOWAIT4_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define FSMC_PIO4_IOWAIT4_2 ((uint32_t)0x00000400) /*!< Bit 2 */ +#define FSMC_PIO4_IOWAIT4_3 ((uint32_t)0x00000800) /*!< Bit 3 */ +#define FSMC_PIO4_IOWAIT4_4 ((uint32_t)0x00001000) /*!< Bit 4 */ +#define FSMC_PIO4_IOWAIT4_5 ((uint32_t)0x00002000) /*!< Bit 5 */ +#define FSMC_PIO4_IOWAIT4_6 ((uint32_t)0x00004000) /*!< Bit 6 */ +#define FSMC_PIO4_IOWAIT4_7 ((uint32_t)0x00008000) /*!< Bit 7 */ + +#define FSMC_PIO4_IOHOLD4 ((uint32_t)0x00FF0000) /*!< IOHOLD4[7:0] bits (I/O 4 hold time) */ +#define FSMC_PIO4_IOHOLD4_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define FSMC_PIO4_IOHOLD4_1 ((uint32_t)0x00020000) /*!< Bit 1 */ +#define FSMC_PIO4_IOHOLD4_2 ((uint32_t)0x00040000) /*!< Bit 2 */ +#define FSMC_PIO4_IOHOLD4_3 ((uint32_t)0x00080000) /*!< Bit 3 */ +#define FSMC_PIO4_IOHOLD4_4 ((uint32_t)0x00100000) /*!< Bit 4 */ +#define FSMC_PIO4_IOHOLD4_5 ((uint32_t)0x00200000) /*!< Bit 5 */ +#define FSMC_PIO4_IOHOLD4_6 ((uint32_t)0x00400000) /*!< Bit 6 */ +#define FSMC_PIO4_IOHOLD4_7 ((uint32_t)0x00800000) /*!< Bit 7 */ + +#define FSMC_PIO4_IOHIZ4 ((uint32_t)0xFF000000) /*!< IOHIZ4[7:0] bits (I/O 4 databus HiZ time) */ +#define FSMC_PIO4_IOHIZ4_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define FSMC_PIO4_IOHIZ4_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define FSMC_PIO4_IOHIZ4_2 ((uint32_t)0x04000000) /*!< Bit 2 */ +#define FSMC_PIO4_IOHIZ4_3 ((uint32_t)0x08000000) /*!< Bit 3 */ +#define FSMC_PIO4_IOHIZ4_4 ((uint32_t)0x10000000) /*!< Bit 4 */ +#define FSMC_PIO4_IOHIZ4_5 ((uint32_t)0x20000000) /*!< Bit 5 */ +#define FSMC_PIO4_IOHIZ4_6 ((uint32_t)0x40000000) /*!< Bit 6 */ +#define FSMC_PIO4_IOHIZ4_7 ((uint32_t)0x80000000) /*!< Bit 7 */ + +/****************** Bit definition for FSMC_ECCR2 register ******************/ +#define FSMC_ECCR2_ECC2 ((uint32_t)0xFFFFFFFF) /*!< ECC result */ + +/****************** Bit definition for FSMC_ECCR3 register ******************/ +#define FSMC_ECCR3_ECC3 ((uint32_t)0xFFFFFFFF) /*!< ECC result */ + +/******************************************************************************/ +/* */ +/* SD host Interface */ +/* */ +/******************************************************************************/ + +/****************** Bit definition for SDIO_POWER register ******************/ +#define SDIO_POWER_PWRCTRL ((uint8_t)0x03) /*!< PWRCTRL[1:0] bits (Power supply control bits) */ +#define SDIO_POWER_PWRCTRL_0 ((uint8_t)0x01) /*!< Bit 0 */ +#define SDIO_POWER_PWRCTRL_1 ((uint8_t)0x02) /*!< Bit 1 */ + +/****************** Bit definition for SDIO_CLKCR register ******************/ +#define SDIO_CLKCR_CLKDIV ((uint16_t)0x00FF) /*!< Clock divide factor */ +#define SDIO_CLKCR_CLKEN ((uint16_t)0x0100) /*!< Clock enable bit */ +#define SDIO_CLKCR_PWRSAV ((uint16_t)0x0200) /*!< Power saving configuration bit */ +#define SDIO_CLKCR_BYPASS ((uint16_t)0x0400) /*!< Clock divider bypass enable bit */ + +#define SDIO_CLKCR_WIDBUS ((uint16_t)0x1800) /*!< WIDBUS[1:0] bits (Wide bus mode enable bit) */ +#define SDIO_CLKCR_WIDBUS_0 ((uint16_t)0x0800) /*!< Bit 0 */ +#define SDIO_CLKCR_WIDBUS_1 ((uint16_t)0x1000) /*!< Bit 1 */ + +#define SDIO_CLKCR_NEGEDGE ((uint16_t)0x2000) /*!< SDIO_CK dephasing selection bit */ +#define SDIO_CLKCR_HWFC_EN ((uint16_t)0x4000) /*!< HW Flow Control enable */ + +/******************* Bit definition for SDIO_ARG register *******************/ +#define SDIO_ARG_CMDARG ((uint32_t)0xFFFFFFFF) /*!< Command argument */ + +/******************* Bit definition for SDIO_CMD register *******************/ +#define SDIO_CMD_CMDINDEX ((uint16_t)0x003F) /*!< Command Index */ + +#define SDIO_CMD_WAITRESP ((uint16_t)0x00C0) /*!< WAITRESP[1:0] bits (Wait for response bits) */ +#define SDIO_CMD_WAITRESP_0 ((uint16_t)0x0040) /*!< Bit 0 */ +#define SDIO_CMD_WAITRESP_1 ((uint16_t)0x0080) /*!< Bit 1 */ + +#define SDIO_CMD_WAITINT ((uint16_t)0x0100) /*!< CPSM Waits for Interrupt Request */ +#define SDIO_CMD_WAITPEND ((uint16_t)0x0200) /*!< CPSM Waits for ends of data transfer (CmdPend internal signal) */ +#define SDIO_CMD_CPSMEN ((uint16_t)0x0400) /*!< Command path state machine (CPSM) Enable bit */ +#define SDIO_CMD_SDIOSUSPEND ((uint16_t)0x0800) /*!< SD I/O suspend command */ +#define SDIO_CMD_ENCMDCOMPL ((uint16_t)0x1000) /*!< Enable CMD completion */ +#define SDIO_CMD_NIEN ((uint16_t)0x2000) /*!< Not Interrupt Enable */ +#define SDIO_CMD_CEATACMD ((uint16_t)0x4000) /*!< CE-ATA command */ + +/***************** Bit definition for SDIO_RESPCMD register *****************/ +#define SDIO_RESPCMD_RESPCMD ((uint8_t)0x3F) /*!< Response command index */ + +/****************** Bit definition for SDIO_RESP0 register ******************/ +#define SDIO_RESP0_CARDSTATUS0 ((uint32_t)0xFFFFFFFF) /*!< Card Status */ + +/****************** Bit definition for SDIO_RESP1 register ******************/ +#define SDIO_RESP1_CARDSTATUS1 ((uint32_t)0xFFFFFFFF) /*!< Card Status */ + +/****************** Bit definition for SDIO_RESP2 register ******************/ +#define SDIO_RESP2_CARDSTATUS2 ((uint32_t)0xFFFFFFFF) /*!< Card Status */ + +/****************** Bit definition for SDIO_RESP3 register ******************/ +#define SDIO_RESP3_CARDSTATUS3 ((uint32_t)0xFFFFFFFF) /*!< Card Status */ + +/****************** Bit definition for SDIO_RESP4 register ******************/ +#define SDIO_RESP4_CARDSTATUS4 ((uint32_t)0xFFFFFFFF) /*!< Card Status */ + +/****************** Bit definition for SDIO_DTIMER register *****************/ +#define SDIO_DTIMER_DATATIME ((uint32_t)0xFFFFFFFF) /*!< Data timeout period. */ + +/****************** Bit definition for SDIO_DLEN register *******************/ +#define SDIO_DLEN_DATALENGTH ((uint32_t)0x01FFFFFF) /*!< Data length value */ + +/****************** Bit definition for SDIO_DCTRL register ******************/ +#define SDIO_DCTRL_DTEN ((uint16_t)0x0001) /*!< Data transfer enabled bit */ +#define SDIO_DCTRL_DTDIR ((uint16_t)0x0002) /*!< Data transfer direction selection */ +#define SDIO_DCTRL_DTMODE ((uint16_t)0x0004) /*!< Data transfer mode selection */ +#define SDIO_DCTRL_DMAEN ((uint16_t)0x0008) /*!< DMA enabled bit */ + +#define SDIO_DCTRL_DBLOCKSIZE ((uint16_t)0x00F0) /*!< DBLOCKSIZE[3:0] bits (Data block size) */ +#define SDIO_DCTRL_DBLOCKSIZE_0 ((uint16_t)0x0010) /*!< Bit 0 */ +#define SDIO_DCTRL_DBLOCKSIZE_1 ((uint16_t)0x0020) /*!< Bit 1 */ +#define SDIO_DCTRL_DBLOCKSIZE_2 ((uint16_t)0x0040) /*!< Bit 2 */ +#define SDIO_DCTRL_DBLOCKSIZE_3 ((uint16_t)0x0080) /*!< Bit 3 */ + +#define SDIO_DCTRL_RWSTART ((uint16_t)0x0100) /*!< Read wait start */ +#define SDIO_DCTRL_RWSTOP ((uint16_t)0x0200) /*!< Read wait stop */ +#define SDIO_DCTRL_RWMOD ((uint16_t)0x0400) /*!< Read wait mode */ +#define SDIO_DCTRL_SDIOEN ((uint16_t)0x0800) /*!< SD I/O enable functions */ + +/****************** Bit definition for SDIO_DCOUNT register *****************/ +#define SDIO_DCOUNT_DATACOUNT ((uint32_t)0x01FFFFFF) /*!< Data count value */ + +/****************** Bit definition for SDIO_STA register ********************/ +#define SDIO_STA_CCRCFAIL ((uint32_t)0x00000001) /*!< Command response received (CRC check failed) */ +#define SDIO_STA_DCRCFAIL ((uint32_t)0x00000002) /*!< Data block sent/received (CRC check failed) */ +#define SDIO_STA_CTIMEOUT ((uint32_t)0x00000004) /*!< Command response timeout */ +#define SDIO_STA_DTIMEOUT ((uint32_t)0x00000008) /*!< Data timeout */ +#define SDIO_STA_TXUNDERR ((uint32_t)0x00000010) /*!< Transmit FIFO underrun error */ +#define SDIO_STA_RXOVERR ((uint32_t)0x00000020) /*!< Received FIFO overrun error */ +#define SDIO_STA_CMDREND ((uint32_t)0x00000040) /*!< Command response received (CRC check passed) */ +#define SDIO_STA_CMDSENT ((uint32_t)0x00000080) /*!< Command sent (no response required) */ +#define SDIO_STA_DATAEND ((uint32_t)0x00000100) /*!< Data end (data counter, SDIDCOUNT, is zero) */ +#define SDIO_STA_STBITERR ((uint32_t)0x00000200) /*!< Start bit not detected on all data signals in wide bus mode */ +#define SDIO_STA_DBCKEND ((uint32_t)0x00000400) /*!< Data block sent/received (CRC check passed) */ +#define SDIO_STA_CMDACT ((uint32_t)0x00000800) /*!< Command transfer in progress */ +#define SDIO_STA_TXACT ((uint32_t)0x00001000) /*!< Data transmit in progress */ +#define SDIO_STA_RXACT ((uint32_t)0x00002000) /*!< Data receive in progress */ +#define SDIO_STA_TXFIFOHE ((uint32_t)0x00004000) /*!< Transmit FIFO Half Empty: at least 8 words can be written into the FIFO */ +#define SDIO_STA_RXFIFOHF ((uint32_t)0x00008000) /*!< Receive FIFO Half Full: there are at least 8 words in the FIFO */ +#define SDIO_STA_TXFIFOF ((uint32_t)0x00010000) /*!< Transmit FIFO full */ +#define SDIO_STA_RXFIFOF ((uint32_t)0x00020000) /*!< Receive FIFO full */ +#define SDIO_STA_TXFIFOE ((uint32_t)0x00040000) /*!< Transmit FIFO empty */ +#define SDIO_STA_RXFIFOE ((uint32_t)0x00080000) /*!< Receive FIFO empty */ +#define SDIO_STA_TXDAVL ((uint32_t)0x00100000) /*!< Data available in transmit FIFO */ +#define SDIO_STA_RXDAVL ((uint32_t)0x00200000) /*!< Data available in receive FIFO */ +#define SDIO_STA_SDIOIT ((uint32_t)0x00400000) /*!< SDIO interrupt received */ +#define SDIO_STA_CEATAEND ((uint32_t)0x00800000) /*!< CE-ATA command completion signal received for CMD61 */ + +/******************* Bit definition for SDIO_ICR register *******************/ +#define SDIO_ICR_CCRCFAILC ((uint32_t)0x00000001) /*!< CCRCFAIL flag clear bit */ +#define SDIO_ICR_DCRCFAILC ((uint32_t)0x00000002) /*!< DCRCFAIL flag clear bit */ +#define SDIO_ICR_CTIMEOUTC ((uint32_t)0x00000004) /*!< CTIMEOUT flag clear bit */ +#define SDIO_ICR_DTIMEOUTC ((uint32_t)0x00000008) /*!< DTIMEOUT flag clear bit */ +#define SDIO_ICR_TXUNDERRC ((uint32_t)0x00000010) /*!< TXUNDERR flag clear bit */ +#define SDIO_ICR_RXOVERRC ((uint32_t)0x00000020) /*!< RXOVERR flag clear bit */ +#define SDIO_ICR_CMDRENDC ((uint32_t)0x00000040) /*!< CMDREND flag clear bit */ +#define SDIO_ICR_CMDSENTC ((uint32_t)0x00000080) /*!< CMDSENT flag clear bit */ +#define SDIO_ICR_DATAENDC ((uint32_t)0x00000100) /*!< DATAEND flag clear bit */ +#define SDIO_ICR_STBITERRC ((uint32_t)0x00000200) /*!< STBITERR flag clear bit */ +#define SDIO_ICR_DBCKENDC ((uint32_t)0x00000400) /*!< DBCKEND flag clear bit */ +#define SDIO_ICR_SDIOITC ((uint32_t)0x00400000) /*!< SDIOIT flag clear bit */ +#define SDIO_ICR_CEATAENDC ((uint32_t)0x00800000) /*!< CEATAEND flag clear bit */ + +/****************** Bit definition for SDIO_MASK register *******************/ +#define SDIO_MASK_CCRCFAILIE ((uint32_t)0x00000001) /*!< Command CRC Fail Interrupt Enable */ +#define SDIO_MASK_DCRCFAILIE ((uint32_t)0x00000002) /*!< Data CRC Fail Interrupt Enable */ +#define SDIO_MASK_CTIMEOUTIE ((uint32_t)0x00000004) /*!< Command TimeOut Interrupt Enable */ +#define SDIO_MASK_DTIMEOUTIE ((uint32_t)0x00000008) /*!< Data TimeOut Interrupt Enable */ +#define SDIO_MASK_TXUNDERRIE ((uint32_t)0x00000010) /*!< Tx FIFO UnderRun Error Interrupt Enable */ +#define SDIO_MASK_RXOVERRIE ((uint32_t)0x00000020) /*!< Rx FIFO OverRun Error Interrupt Enable */ +#define SDIO_MASK_CMDRENDIE ((uint32_t)0x00000040) /*!< Command Response Received Interrupt Enable */ +#define SDIO_MASK_CMDSENTIE ((uint32_t)0x00000080) /*!< Command Sent Interrupt Enable */ +#define SDIO_MASK_DATAENDIE ((uint32_t)0x00000100) /*!< Data End Interrupt Enable */ +#define SDIO_MASK_STBITERRIE ((uint32_t)0x00000200) /*!< Start Bit Error Interrupt Enable */ +#define SDIO_MASK_DBCKENDIE ((uint32_t)0x00000400) /*!< Data Block End Interrupt Enable */ +#define SDIO_MASK_CMDACTIE ((uint32_t)0x00000800) /*!< Command Acting Interrupt Enable */ +#define SDIO_MASK_TXACTIE ((uint32_t)0x00001000) /*!< Data Transmit Acting Interrupt Enable */ +#define SDIO_MASK_RXACTIE ((uint32_t)0x00002000) /*!< Data receive acting interrupt enabled */ +#define SDIO_MASK_TXFIFOHEIE ((uint32_t)0x00004000) /*!< Tx FIFO Half Empty interrupt Enable */ +#define SDIO_MASK_RXFIFOHFIE ((uint32_t)0x00008000) /*!< Rx FIFO Half Full interrupt Enable */ +#define SDIO_MASK_TXFIFOFIE ((uint32_t)0x00010000) /*!< Tx FIFO Full interrupt Enable */ +#define SDIO_MASK_RXFIFOFIE ((uint32_t)0x00020000) /*!< Rx FIFO Full interrupt Enable */ +#define SDIO_MASK_TXFIFOEIE ((uint32_t)0x00040000) /*!< Tx FIFO Empty interrupt Enable */ +#define SDIO_MASK_RXFIFOEIE ((uint32_t)0x00080000) /*!< Rx FIFO Empty interrupt Enable */ +#define SDIO_MASK_TXDAVLIE ((uint32_t)0x00100000) /*!< Data available in Tx FIFO interrupt Enable */ +#define SDIO_MASK_RXDAVLIE ((uint32_t)0x00200000) /*!< Data available in Rx FIFO interrupt Enable */ +#define SDIO_MASK_SDIOITIE ((uint32_t)0x00400000) /*!< SDIO Mode Interrupt Received interrupt Enable */ +#define SDIO_MASK_CEATAENDIE ((uint32_t)0x00800000) /*!< CE-ATA command completion signal received Interrupt Enable */ + +/***************** Bit definition for SDIO_FIFOCNT register *****************/ +#define SDIO_FIFOCNT_FIFOCOUNT ((uint32_t)0x00FFFFFF) /*!< Remaining number of words to be written to or read from the FIFO */ + +/****************** Bit definition for SDIO_FIFO register *******************/ +#define SDIO_FIFO_FIFODATA ((uint32_t)0xFFFFFFFF) /*!< Receive and transmit FIFO data */ + +/******************************************************************************/ +/* */ +/* USB Device FS */ +/* */ +/******************************************************************************/ + +/*!< Endpoint-specific registers */ +/******************* Bit definition for USB_EP0R register *******************/ +#define USB_EP0R_EA ((uint16_t)0x000F) /*!< Endpoint Address */ + +#define USB_EP0R_STAT_TX ((uint16_t)0x0030) /*!< STAT_TX[1:0] bits (Status bits, for transmission transfers) */ +#define USB_EP0R_STAT_TX_0 ((uint16_t)0x0010) /*!< Bit 0 */ +#define USB_EP0R_STAT_TX_1 ((uint16_t)0x0020) /*!< Bit 1 */ + +#define USB_EP0R_DTOG_TX ((uint16_t)0x0040) /*!< Data Toggle, for transmission transfers */ +#define USB_EP0R_CTR_TX ((uint16_t)0x0080) /*!< Correct Transfer for transmission */ +#define USB_EP0R_EP_KIND ((uint16_t)0x0100) /*!< Endpoint Kind */ + +#define USB_EP0R_EP_TYPE ((uint16_t)0x0600) /*!< EP_TYPE[1:0] bits (Endpoint type) */ +#define USB_EP0R_EP_TYPE_0 ((uint16_t)0x0200) /*!< Bit 0 */ +#define USB_EP0R_EP_TYPE_1 ((uint16_t)0x0400) /*!< Bit 1 */ + +#define USB_EP0R_SETUP ((uint16_t)0x0800) /*!< Setup transaction completed */ + +#define USB_EP0R_STAT_RX ((uint16_t)0x3000) /*!< STAT_RX[1:0] bits (Status bits, for reception transfers) */ +#define USB_EP0R_STAT_RX_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define USB_EP0R_STAT_RX_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define USB_EP0R_DTOG_RX ((uint16_t)0x4000) /*!< Data Toggle, for reception transfers */ +#define USB_EP0R_CTR_RX ((uint16_t)0x8000) /*!< Correct Transfer for reception */ + +/******************* Bit definition for USB_EP1R register *******************/ +#define USB_EP1R_EA ((uint16_t)0x000F) /*!< Endpoint Address */ + +#define USB_EP1R_STAT_TX ((uint16_t)0x0030) /*!< STAT_TX[1:0] bits (Status bits, for transmission transfers) */ +#define USB_EP1R_STAT_TX_0 ((uint16_t)0x0010) /*!< Bit 0 */ +#define USB_EP1R_STAT_TX_1 ((uint16_t)0x0020) /*!< Bit 1 */ + +#define USB_EP1R_DTOG_TX ((uint16_t)0x0040) /*!< Data Toggle, for transmission transfers */ +#define USB_EP1R_CTR_TX ((uint16_t)0x0080) /*!< Correct Transfer for transmission */ +#define USB_EP1R_EP_KIND ((uint16_t)0x0100) /*!< Endpoint Kind */ + +#define USB_EP1R_EP_TYPE ((uint16_t)0x0600) /*!< EP_TYPE[1:0] bits (Endpoint type) */ +#define USB_EP1R_EP_TYPE_0 ((uint16_t)0x0200) /*!< Bit 0 */ +#define USB_EP1R_EP_TYPE_1 ((uint16_t)0x0400) /*!< Bit 1 */ + +#define USB_EP1R_SETUP ((uint16_t)0x0800) /*!< Setup transaction completed */ + +#define USB_EP1R_STAT_RX ((uint16_t)0x3000) /*!< STAT_RX[1:0] bits (Status bits, for reception transfers) */ +#define USB_EP1R_STAT_RX_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define USB_EP1R_STAT_RX_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define USB_EP1R_DTOG_RX ((uint16_t)0x4000) /*!< Data Toggle, for reception transfers */ +#define USB_EP1R_CTR_RX ((uint16_t)0x8000) /*!< Correct Transfer for reception */ + +/******************* Bit definition for USB_EP2R register *******************/ +#define USB_EP2R_EA ((uint16_t)0x000F) /*!< Endpoint Address */ + +#define USB_EP2R_STAT_TX ((uint16_t)0x0030) /*!< STAT_TX[1:0] bits (Status bits, for transmission transfers) */ +#define USB_EP2R_STAT_TX_0 ((uint16_t)0x0010) /*!< Bit 0 */ +#define USB_EP2R_STAT_TX_1 ((uint16_t)0x0020) /*!< Bit 1 */ + +#define USB_EP2R_DTOG_TX ((uint16_t)0x0040) /*!< Data Toggle, for transmission transfers */ +#define USB_EP2R_CTR_TX ((uint16_t)0x0080) /*!< Correct Transfer for transmission */ +#define USB_EP2R_EP_KIND ((uint16_t)0x0100) /*!< Endpoint Kind */ + +#define USB_EP2R_EP_TYPE ((uint16_t)0x0600) /*!< EP_TYPE[1:0] bits (Endpoint type) */ +#define USB_EP2R_EP_TYPE_0 ((uint16_t)0x0200) /*!< Bit 0 */ +#define USB_EP2R_EP_TYPE_1 ((uint16_t)0x0400) /*!< Bit 1 */ + +#define USB_EP2R_SETUP ((uint16_t)0x0800) /*!< Setup transaction completed */ + +#define USB_EP2R_STAT_RX ((uint16_t)0x3000) /*!< STAT_RX[1:0] bits (Status bits, for reception transfers) */ +#define USB_EP2R_STAT_RX_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define USB_EP2R_STAT_RX_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define USB_EP2R_DTOG_RX ((uint16_t)0x4000) /*!< Data Toggle, for reception transfers */ +#define USB_EP2R_CTR_RX ((uint16_t)0x8000) /*!< Correct Transfer for reception */ + +/******************* Bit definition for USB_EP3R register *******************/ +#define USB_EP3R_EA ((uint16_t)0x000F) /*!< Endpoint Address */ + +#define USB_EP3R_STAT_TX ((uint16_t)0x0030) /*!< STAT_TX[1:0] bits (Status bits, for transmission transfers) */ +#define USB_EP3R_STAT_TX_0 ((uint16_t)0x0010) /*!< Bit 0 */ +#define USB_EP3R_STAT_TX_1 ((uint16_t)0x0020) /*!< Bit 1 */ + +#define USB_EP3R_DTOG_TX ((uint16_t)0x0040) /*!< Data Toggle, for transmission transfers */ +#define USB_EP3R_CTR_TX ((uint16_t)0x0080) /*!< Correct Transfer for transmission */ +#define USB_EP3R_EP_KIND ((uint16_t)0x0100) /*!< Endpoint Kind */ + +#define USB_EP3R_EP_TYPE ((uint16_t)0x0600) /*!< EP_TYPE[1:0] bits (Endpoint type) */ +#define USB_EP3R_EP_TYPE_0 ((uint16_t)0x0200) /*!< Bit 0 */ +#define USB_EP3R_EP_TYPE_1 ((uint16_t)0x0400) /*!< Bit 1 */ + +#define USB_EP3R_SETUP ((uint16_t)0x0800) /*!< Setup transaction completed */ + +#define USB_EP3R_STAT_RX ((uint16_t)0x3000) /*!< STAT_RX[1:0] bits (Status bits, for reception transfers) */ +#define USB_EP3R_STAT_RX_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define USB_EP3R_STAT_RX_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define USB_EP3R_DTOG_RX ((uint16_t)0x4000) /*!< Data Toggle, for reception transfers */ +#define USB_EP3R_CTR_RX ((uint16_t)0x8000) /*!< Correct Transfer for reception */ + +/******************* Bit definition for USB_EP4R register *******************/ +#define USB_EP4R_EA ((uint16_t)0x000F) /*!< Endpoint Address */ + +#define USB_EP4R_STAT_TX ((uint16_t)0x0030) /*!< STAT_TX[1:0] bits (Status bits, for transmission transfers) */ +#define USB_EP4R_STAT_TX_0 ((uint16_t)0x0010) /*!< Bit 0 */ +#define USB_EP4R_STAT_TX_1 ((uint16_t)0x0020) /*!< Bit 1 */ + +#define USB_EP4R_DTOG_TX ((uint16_t)0x0040) /*!< Data Toggle, for transmission transfers */ +#define USB_EP4R_CTR_TX ((uint16_t)0x0080) /*!< Correct Transfer for transmission */ +#define USB_EP4R_EP_KIND ((uint16_t)0x0100) /*!< Endpoint Kind */ + +#define USB_EP4R_EP_TYPE ((uint16_t)0x0600) /*!< EP_TYPE[1:0] bits (Endpoint type) */ +#define USB_EP4R_EP_TYPE_0 ((uint16_t)0x0200) /*!< Bit 0 */ +#define USB_EP4R_EP_TYPE_1 ((uint16_t)0x0400) /*!< Bit 1 */ + +#define USB_EP4R_SETUP ((uint16_t)0x0800) /*!< Setup transaction completed */ + +#define USB_EP4R_STAT_RX ((uint16_t)0x3000) /*!< STAT_RX[1:0] bits (Status bits, for reception transfers) */ +#define USB_EP4R_STAT_RX_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define USB_EP4R_STAT_RX_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define USB_EP4R_DTOG_RX ((uint16_t)0x4000) /*!< Data Toggle, for reception transfers */ +#define USB_EP4R_CTR_RX ((uint16_t)0x8000) /*!< Correct Transfer for reception */ + +/******************* Bit definition for USB_EP5R register *******************/ +#define USB_EP5R_EA ((uint16_t)0x000F) /*!< Endpoint Address */ + +#define USB_EP5R_STAT_TX ((uint16_t)0x0030) /*!< STAT_TX[1:0] bits (Status bits, for transmission transfers) */ +#define USB_EP5R_STAT_TX_0 ((uint16_t)0x0010) /*!< Bit 0 */ +#define USB_EP5R_STAT_TX_1 ((uint16_t)0x0020) /*!< Bit 1 */ + +#define USB_EP5R_DTOG_TX ((uint16_t)0x0040) /*!< Data Toggle, for transmission transfers */ +#define USB_EP5R_CTR_TX ((uint16_t)0x0080) /*!< Correct Transfer for transmission */ +#define USB_EP5R_EP_KIND ((uint16_t)0x0100) /*!< Endpoint Kind */ + +#define USB_EP5R_EP_TYPE ((uint16_t)0x0600) /*!< EP_TYPE[1:0] bits (Endpoint type) */ +#define USB_EP5R_EP_TYPE_0 ((uint16_t)0x0200) /*!< Bit 0 */ +#define USB_EP5R_EP_TYPE_1 ((uint16_t)0x0400) /*!< Bit 1 */ + +#define USB_EP5R_SETUP ((uint16_t)0x0800) /*!< Setup transaction completed */ + +#define USB_EP5R_STAT_RX ((uint16_t)0x3000) /*!< STAT_RX[1:0] bits (Status bits, for reception transfers) */ +#define USB_EP5R_STAT_RX_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define USB_EP5R_STAT_RX_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define USB_EP5R_DTOG_RX ((uint16_t)0x4000) /*!< Data Toggle, for reception transfers */ +#define USB_EP5R_CTR_RX ((uint16_t)0x8000) /*!< Correct Transfer for reception */ + +/******************* Bit definition for USB_EP6R register *******************/ +#define USB_EP6R_EA ((uint16_t)0x000F) /*!< Endpoint Address */ + +#define USB_EP6R_STAT_TX ((uint16_t)0x0030) /*!< STAT_TX[1:0] bits (Status bits, for transmission transfers) */ +#define USB_EP6R_STAT_TX_0 ((uint16_t)0x0010) /*!< Bit 0 */ +#define USB_EP6R_STAT_TX_1 ((uint16_t)0x0020) /*!< Bit 1 */ + +#define USB_EP6R_DTOG_TX ((uint16_t)0x0040) /*!< Data Toggle, for transmission transfers */ +#define USB_EP6R_CTR_TX ((uint16_t)0x0080) /*!< Correct Transfer for transmission */ +#define USB_EP6R_EP_KIND ((uint16_t)0x0100) /*!< Endpoint Kind */ + +#define USB_EP6R_EP_TYPE ((uint16_t)0x0600) /*!< EP_TYPE[1:0] bits (Endpoint type) */ +#define USB_EP6R_EP_TYPE_0 ((uint16_t)0x0200) /*!< Bit 0 */ +#define USB_EP6R_EP_TYPE_1 ((uint16_t)0x0400) /*!< Bit 1 */ + +#define USB_EP6R_SETUP ((uint16_t)0x0800) /*!< Setup transaction completed */ + +#define USB_EP6R_STAT_RX ((uint16_t)0x3000) /*!< STAT_RX[1:0] bits (Status bits, for reception transfers) */ +#define USB_EP6R_STAT_RX_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define USB_EP6R_STAT_RX_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define USB_EP6R_DTOG_RX ((uint16_t)0x4000) /*!< Data Toggle, for reception transfers */ +#define USB_EP6R_CTR_RX ((uint16_t)0x8000) /*!< Correct Transfer for reception */ + +/******************* Bit definition for USB_EP7R register *******************/ +#define USB_EP7R_EA ((uint16_t)0x000F) /*!< Endpoint Address */ + +#define USB_EP7R_STAT_TX ((uint16_t)0x0030) /*!< STAT_TX[1:0] bits (Status bits, for transmission transfers) */ +#define USB_EP7R_STAT_TX_0 ((uint16_t)0x0010) /*!< Bit 0 */ +#define USB_EP7R_STAT_TX_1 ((uint16_t)0x0020) /*!< Bit 1 */ + +#define USB_EP7R_DTOG_TX ((uint16_t)0x0040) /*!< Data Toggle, for transmission transfers */ +#define USB_EP7R_CTR_TX ((uint16_t)0x0080) /*!< Correct Transfer for transmission */ +#define USB_EP7R_EP_KIND ((uint16_t)0x0100) /*!< Endpoint Kind */ + +#define USB_EP7R_EP_TYPE ((uint16_t)0x0600) /*!< EP_TYPE[1:0] bits (Endpoint type) */ +#define USB_EP7R_EP_TYPE_0 ((uint16_t)0x0200) /*!< Bit 0 */ +#define USB_EP7R_EP_TYPE_1 ((uint16_t)0x0400) /*!< Bit 1 */ + +#define USB_EP7R_SETUP ((uint16_t)0x0800) /*!< Setup transaction completed */ + +#define USB_EP7R_STAT_RX ((uint16_t)0x3000) /*!< STAT_RX[1:0] bits (Status bits, for reception transfers) */ +#define USB_EP7R_STAT_RX_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define USB_EP7R_STAT_RX_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define USB_EP7R_DTOG_RX ((uint16_t)0x4000) /*!< Data Toggle, for reception transfers */ +#define USB_EP7R_CTR_RX ((uint16_t)0x8000) /*!< Correct Transfer for reception */ + +/*!< Common registers */ +/******************* Bit definition for USB_CNTR register *******************/ +#define USB_CNTR_FRES ((uint16_t)0x0001) /*!< Force USB Reset */ +#define USB_CNTR_PDWN ((uint16_t)0x0002) /*!< Power down */ +#define USB_CNTR_LP_MODE ((uint16_t)0x0004) /*!< Low-power mode */ +#define USB_CNTR_FSUSP ((uint16_t)0x0008) /*!< Force suspend */ +#define USB_CNTR_RESUME ((uint16_t)0x0010) /*!< Resume request */ +#define USB_CNTR_ESOFM ((uint16_t)0x0100) /*!< Expected Start Of Frame Interrupt Mask */ +#define USB_CNTR_SOFM ((uint16_t)0x0200) /*!< Start Of Frame Interrupt Mask */ +#define USB_CNTR_RESETM ((uint16_t)0x0400) /*!< RESET Interrupt Mask */ +#define USB_CNTR_SUSPM ((uint16_t)0x0800) /*!< Suspend mode Interrupt Mask */ +#define USB_CNTR_WKUPM ((uint16_t)0x1000) /*!< Wakeup Interrupt Mask */ +#define USB_CNTR_ERRM ((uint16_t)0x2000) /*!< Error Interrupt Mask */ +#define USB_CNTR_PMAOVRM ((uint16_t)0x4000) /*!< Packet Memory Area Over / Underrun Interrupt Mask */ +#define USB_CNTR_CTRM ((uint16_t)0x8000) /*!< Correct Transfer Interrupt Mask */ + +/******************* Bit definition for USB_ISTR register *******************/ +#define USB_ISTR_EP_ID ((uint16_t)0x000F) /*!< Endpoint Identifier */ +#define USB_ISTR_DIR ((uint16_t)0x0010) /*!< Direction of transaction */ +#define USB_ISTR_ESOF ((uint16_t)0x0100) /*!< Expected Start Of Frame */ +#define USB_ISTR_SOF ((uint16_t)0x0200) /*!< Start Of Frame */ +#define USB_ISTR_RESET ((uint16_t)0x0400) /*!< USB RESET request */ +#define USB_ISTR_SUSP ((uint16_t)0x0800) /*!< Suspend mode request */ +#define USB_ISTR_WKUP ((uint16_t)0x1000) /*!< Wake up */ +#define USB_ISTR_ERR ((uint16_t)0x2000) /*!< Error */ +#define USB_ISTR_PMAOVR ((uint16_t)0x4000) /*!< Packet Memory Area Over / Underrun */ +#define USB_ISTR_CTR ((uint16_t)0x8000) /*!< Correct Transfer */ + +/******************* Bit definition for USB_FNR register ********************/ +#define USB_FNR_FN ((uint16_t)0x07FF) /*!< Frame Number */ +#define USB_FNR_LSOF ((uint16_t)0x1800) /*!< Lost SOF */ +#define USB_FNR_LCK ((uint16_t)0x2000) /*!< Locked */ +#define USB_FNR_RXDM ((uint16_t)0x4000) /*!< Receive Data - Line Status */ +#define USB_FNR_RXDP ((uint16_t)0x8000) /*!< Receive Data + Line Status */ + +/****************** Bit definition for USB_DADDR register *******************/ +#define USB_DADDR_ADD ((uint8_t)0x7F) /*!< ADD[6:0] bits (Device Address) */ +#define USB_DADDR_ADD0 ((uint8_t)0x01) /*!< Bit 0 */ +#define USB_DADDR_ADD1 ((uint8_t)0x02) /*!< Bit 1 */ +#define USB_DADDR_ADD2 ((uint8_t)0x04) /*!< Bit 2 */ +#define USB_DADDR_ADD3 ((uint8_t)0x08) /*!< Bit 3 */ +#define USB_DADDR_ADD4 ((uint8_t)0x10) /*!< Bit 4 */ +#define USB_DADDR_ADD5 ((uint8_t)0x20) /*!< Bit 5 */ +#define USB_DADDR_ADD6 ((uint8_t)0x40) /*!< Bit 6 */ + +#define USB_DADDR_EF ((uint8_t)0x80) /*!< Enable Function */ + +/****************** Bit definition for USB_BTABLE register ******************/ +#define USB_BTABLE_BTABLE ((uint16_t)0xFFF8) /*!< Buffer Table */ + +/*!< Buffer descriptor table */ +/***************** Bit definition for USB_ADDR0_TX register *****************/ +#define USB_ADDR0_TX_ADDR0_TX ((uint16_t)0xFFFE) /*!< Transmission Buffer Address 0 */ + +/***************** Bit definition for USB_ADDR1_TX register *****************/ +#define USB_ADDR1_TX_ADDR1_TX ((uint16_t)0xFFFE) /*!< Transmission Buffer Address 1 */ + +/***************** Bit definition for USB_ADDR2_TX register *****************/ +#define USB_ADDR2_TX_ADDR2_TX ((uint16_t)0xFFFE) /*!< Transmission Buffer Address 2 */ + +/***************** Bit definition for USB_ADDR3_TX register *****************/ +#define USB_ADDR3_TX_ADDR3_TX ((uint16_t)0xFFFE) /*!< Transmission Buffer Address 3 */ + +/***************** Bit definition for USB_ADDR4_TX register *****************/ +#define USB_ADDR4_TX_ADDR4_TX ((uint16_t)0xFFFE) /*!< Transmission Buffer Address 4 */ + +/***************** Bit definition for USB_ADDR5_TX register *****************/ +#define USB_ADDR5_TX_ADDR5_TX ((uint16_t)0xFFFE) /*!< Transmission Buffer Address 5 */ + +/***************** Bit definition for USB_ADDR6_TX register *****************/ +#define USB_ADDR6_TX_ADDR6_TX ((uint16_t)0xFFFE) /*!< Transmission Buffer Address 6 */ + +/***************** Bit definition for USB_ADDR7_TX register *****************/ +#define USB_ADDR7_TX_ADDR7_TX ((uint16_t)0xFFFE) /*!< Transmission Buffer Address 7 */ + +/*----------------------------------------------------------------------------*/ + +/***************** Bit definition for USB_COUNT0_TX register ****************/ +#define USB_COUNT0_TX_COUNT0_TX ((uint16_t)0x03FF) /*!< Transmission Byte Count 0 */ + +/***************** Bit definition for USB_COUNT1_TX register ****************/ +#define USB_COUNT1_TX_COUNT1_TX ((uint16_t)0x03FF) /*!< Transmission Byte Count 1 */ + +/***************** Bit definition for USB_COUNT2_TX register ****************/ +#define USB_COUNT2_TX_COUNT2_TX ((uint16_t)0x03FF) /*!< Transmission Byte Count 2 */ + +/***************** Bit definition for USB_COUNT3_TX register ****************/ +#define USB_COUNT3_TX_COUNT3_TX ((uint16_t)0x03FF) /*!< Transmission Byte Count 3 */ + +/***************** Bit definition for USB_COUNT4_TX register ****************/ +#define USB_COUNT4_TX_COUNT4_TX ((uint16_t)0x03FF) /*!< Transmission Byte Count 4 */ + +/***************** Bit definition for USB_COUNT5_TX register ****************/ +#define USB_COUNT5_TX_COUNT5_TX ((uint16_t)0x03FF) /*!< Transmission Byte Count 5 */ + +/***************** Bit definition for USB_COUNT6_TX register ****************/ +#define USB_COUNT6_TX_COUNT6_TX ((uint16_t)0x03FF) /*!< Transmission Byte Count 6 */ + +/***************** Bit definition for USB_COUNT7_TX register ****************/ +#define USB_COUNT7_TX_COUNT7_TX ((uint16_t)0x03FF) /*!< Transmission Byte Count 7 */ + +/*----------------------------------------------------------------------------*/ + +/**************** Bit definition for USB_COUNT0_TX_0 register ***************/ +#define USB_COUNT0_TX_0_COUNT0_TX_0 ((uint32_t)0x000003FF) /*!< Transmission Byte Count 0 (low) */ + +/**************** Bit definition for USB_COUNT0_TX_1 register ***************/ +#define USB_COUNT0_TX_1_COUNT0_TX_1 ((uint32_t)0x03FF0000) /*!< Transmission Byte Count 0 (high) */ + +/**************** Bit definition for USB_COUNT1_TX_0 register ***************/ +#define USB_COUNT1_TX_0_COUNT1_TX_0 ((uint32_t)0x000003FF) /*!< Transmission Byte Count 1 (low) */ + +/**************** Bit definition for USB_COUNT1_TX_1 register ***************/ +#define USB_COUNT1_TX_1_COUNT1_TX_1 ((uint32_t)0x03FF0000) /*!< Transmission Byte Count 1 (high) */ + +/**************** Bit definition for USB_COUNT2_TX_0 register ***************/ +#define USB_COUNT2_TX_0_COUNT2_TX_0 ((uint32_t)0x000003FF) /*!< Transmission Byte Count 2 (low) */ + +/**************** Bit definition for USB_COUNT2_TX_1 register ***************/ +#define USB_COUNT2_TX_1_COUNT2_TX_1 ((uint32_t)0x03FF0000) /*!< Transmission Byte Count 2 (high) */ + +/**************** Bit definition for USB_COUNT3_TX_0 register ***************/ +#define USB_COUNT3_TX_0_COUNT3_TX_0 ((uint16_t)0x000003FF) /*!< Transmission Byte Count 3 (low) */ + +/**************** Bit definition for USB_COUNT3_TX_1 register ***************/ +#define USB_COUNT3_TX_1_COUNT3_TX_1 ((uint16_t)0x03FF0000) /*!< Transmission Byte Count 3 (high) */ + +/**************** Bit definition for USB_COUNT4_TX_0 register ***************/ +#define USB_COUNT4_TX_0_COUNT4_TX_0 ((uint32_t)0x000003FF) /*!< Transmission Byte Count 4 (low) */ + +/**************** Bit definition for USB_COUNT4_TX_1 register ***************/ +#define USB_COUNT4_TX_1_COUNT4_TX_1 ((uint32_t)0x03FF0000) /*!< Transmission Byte Count 4 (high) */ + +/**************** Bit definition for USB_COUNT5_TX_0 register ***************/ +#define USB_COUNT5_TX_0_COUNT5_TX_0 ((uint32_t)0x000003FF) /*!< Transmission Byte Count 5 (low) */ + +/**************** Bit definition for USB_COUNT5_TX_1 register ***************/ +#define USB_COUNT5_TX_1_COUNT5_TX_1 ((uint32_t)0x03FF0000) /*!< Transmission Byte Count 5 (high) */ + +/**************** Bit definition for USB_COUNT6_TX_0 register ***************/ +#define USB_COUNT6_TX_0_COUNT6_TX_0 ((uint32_t)0x000003FF) /*!< Transmission Byte Count 6 (low) */ + +/**************** Bit definition for USB_COUNT6_TX_1 register ***************/ +#define USB_COUNT6_TX_1_COUNT6_TX_1 ((uint32_t)0x03FF0000) /*!< Transmission Byte Count 6 (high) */ + +/**************** Bit definition for USB_COUNT7_TX_0 register ***************/ +#define USB_COUNT7_TX_0_COUNT7_TX_0 ((uint32_t)0x000003FF) /*!< Transmission Byte Count 7 (low) */ + +/**************** Bit definition for USB_COUNT7_TX_1 register ***************/ +#define USB_COUNT7_TX_1_COUNT7_TX_1 ((uint32_t)0x03FF0000) /*!< Transmission Byte Count 7 (high) */ + +/*----------------------------------------------------------------------------*/ + +/***************** Bit definition for USB_ADDR0_RX register *****************/ +#define USB_ADDR0_RX_ADDR0_RX ((uint16_t)0xFFFE) /*!< Reception Buffer Address 0 */ + +/***************** Bit definition for USB_ADDR1_RX register *****************/ +#define USB_ADDR1_RX_ADDR1_RX ((uint16_t)0xFFFE) /*!< Reception Buffer Address 1 */ + +/***************** Bit definition for USB_ADDR2_RX register *****************/ +#define USB_ADDR2_RX_ADDR2_RX ((uint16_t)0xFFFE) /*!< Reception Buffer Address 2 */ + +/***************** Bit definition for USB_ADDR3_RX register *****************/ +#define USB_ADDR3_RX_ADDR3_RX ((uint16_t)0xFFFE) /*!< Reception Buffer Address 3 */ + +/***************** Bit definition for USB_ADDR4_RX register *****************/ +#define USB_ADDR4_RX_ADDR4_RX ((uint16_t)0xFFFE) /*!< Reception Buffer Address 4 */ + +/***************** Bit definition for USB_ADDR5_RX register *****************/ +#define USB_ADDR5_RX_ADDR5_RX ((uint16_t)0xFFFE) /*!< Reception Buffer Address 5 */ + +/***************** Bit definition for USB_ADDR6_RX register *****************/ +#define USB_ADDR6_RX_ADDR6_RX ((uint16_t)0xFFFE) /*!< Reception Buffer Address 6 */ + +/***************** Bit definition for USB_ADDR7_RX register *****************/ +#define USB_ADDR7_RX_ADDR7_RX ((uint16_t)0xFFFE) /*!< Reception Buffer Address 7 */ + +/*----------------------------------------------------------------------------*/ + +/***************** Bit definition for USB_COUNT0_RX register ****************/ +#define USB_COUNT0_RX_COUNT0_RX ((uint16_t)0x03FF) /*!< Reception Byte Count */ + +#define USB_COUNT0_RX_NUM_BLOCK ((uint16_t)0x7C00) /*!< NUM_BLOCK[4:0] bits (Number of blocks) */ +#define USB_COUNT0_RX_NUM_BLOCK_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define USB_COUNT0_RX_NUM_BLOCK_1 ((uint16_t)0x0800) /*!< Bit 1 */ +#define USB_COUNT0_RX_NUM_BLOCK_2 ((uint16_t)0x1000) /*!< Bit 2 */ +#define USB_COUNT0_RX_NUM_BLOCK_3 ((uint16_t)0x2000) /*!< Bit 3 */ +#define USB_COUNT0_RX_NUM_BLOCK_4 ((uint16_t)0x4000) /*!< Bit 4 */ + +#define USB_COUNT0_RX_BLSIZE ((uint16_t)0x8000) /*!< BLock SIZE */ + +/***************** Bit definition for USB_COUNT1_RX register ****************/ +#define USB_COUNT1_RX_COUNT1_RX ((uint16_t)0x03FF) /*!< Reception Byte Count */ + +#define USB_COUNT1_RX_NUM_BLOCK ((uint16_t)0x7C00) /*!< NUM_BLOCK[4:0] bits (Number of blocks) */ +#define USB_COUNT1_RX_NUM_BLOCK_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define USB_COUNT1_RX_NUM_BLOCK_1 ((uint16_t)0x0800) /*!< Bit 1 */ +#define USB_COUNT1_RX_NUM_BLOCK_2 ((uint16_t)0x1000) /*!< Bit 2 */ +#define USB_COUNT1_RX_NUM_BLOCK_3 ((uint16_t)0x2000) /*!< Bit 3 */ +#define USB_COUNT1_RX_NUM_BLOCK_4 ((uint16_t)0x4000) /*!< Bit 4 */ + +#define USB_COUNT1_RX_BLSIZE ((uint16_t)0x8000) /*!< BLock SIZE */ + +/***************** Bit definition for USB_COUNT2_RX register ****************/ +#define USB_COUNT2_RX_COUNT2_RX ((uint16_t)0x03FF) /*!< Reception Byte Count */ + +#define USB_COUNT2_RX_NUM_BLOCK ((uint16_t)0x7C00) /*!< NUM_BLOCK[4:0] bits (Number of blocks) */ +#define USB_COUNT2_RX_NUM_BLOCK_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define USB_COUNT2_RX_NUM_BLOCK_1 ((uint16_t)0x0800) /*!< Bit 1 */ +#define USB_COUNT2_RX_NUM_BLOCK_2 ((uint16_t)0x1000) /*!< Bit 2 */ +#define USB_COUNT2_RX_NUM_BLOCK_3 ((uint16_t)0x2000) /*!< Bit 3 */ +#define USB_COUNT2_RX_NUM_BLOCK_4 ((uint16_t)0x4000) /*!< Bit 4 */ + +#define USB_COUNT2_RX_BLSIZE ((uint16_t)0x8000) /*!< BLock SIZE */ + +/***************** Bit definition for USB_COUNT3_RX register ****************/ +#define USB_COUNT3_RX_COUNT3_RX ((uint16_t)0x03FF) /*!< Reception Byte Count */ + +#define USB_COUNT3_RX_NUM_BLOCK ((uint16_t)0x7C00) /*!< NUM_BLOCK[4:0] bits (Number of blocks) */ +#define USB_COUNT3_RX_NUM_BLOCK_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define USB_COUNT3_RX_NUM_BLOCK_1 ((uint16_t)0x0800) /*!< Bit 1 */ +#define USB_COUNT3_RX_NUM_BLOCK_2 ((uint16_t)0x1000) /*!< Bit 2 */ +#define USB_COUNT3_RX_NUM_BLOCK_3 ((uint16_t)0x2000) /*!< Bit 3 */ +#define USB_COUNT3_RX_NUM_BLOCK_4 ((uint16_t)0x4000) /*!< Bit 4 */ + +#define USB_COUNT3_RX_BLSIZE ((uint16_t)0x8000) /*!< BLock SIZE */ + +/***************** Bit definition for USB_COUNT4_RX register ****************/ +#define USB_COUNT4_RX_COUNT4_RX ((uint16_t)0x03FF) /*!< Reception Byte Count */ + +#define USB_COUNT4_RX_NUM_BLOCK ((uint16_t)0x7C00) /*!< NUM_BLOCK[4:0] bits (Number of blocks) */ +#define USB_COUNT4_RX_NUM_BLOCK_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define USB_COUNT4_RX_NUM_BLOCK_1 ((uint16_t)0x0800) /*!< Bit 1 */ +#define USB_COUNT4_RX_NUM_BLOCK_2 ((uint16_t)0x1000) /*!< Bit 2 */ +#define USB_COUNT4_RX_NUM_BLOCK_3 ((uint16_t)0x2000) /*!< Bit 3 */ +#define USB_COUNT4_RX_NUM_BLOCK_4 ((uint16_t)0x4000) /*!< Bit 4 */ + +#define USB_COUNT4_RX_BLSIZE ((uint16_t)0x8000) /*!< BLock SIZE */ + +/***************** Bit definition for USB_COUNT5_RX register ****************/ +#define USB_COUNT5_RX_COUNT5_RX ((uint16_t)0x03FF) /*!< Reception Byte Count */ + +#define USB_COUNT5_RX_NUM_BLOCK ((uint16_t)0x7C00) /*!< NUM_BLOCK[4:0] bits (Number of blocks) */ +#define USB_COUNT5_RX_NUM_BLOCK_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define USB_COUNT5_RX_NUM_BLOCK_1 ((uint16_t)0x0800) /*!< Bit 1 */ +#define USB_COUNT5_RX_NUM_BLOCK_2 ((uint16_t)0x1000) /*!< Bit 2 */ +#define USB_COUNT5_RX_NUM_BLOCK_3 ((uint16_t)0x2000) /*!< Bit 3 */ +#define USB_COUNT5_RX_NUM_BLOCK_4 ((uint16_t)0x4000) /*!< Bit 4 */ + +#define USB_COUNT5_RX_BLSIZE ((uint16_t)0x8000) /*!< BLock SIZE */ + +/***************** Bit definition for USB_COUNT6_RX register ****************/ +#define USB_COUNT6_RX_COUNT6_RX ((uint16_t)0x03FF) /*!< Reception Byte Count */ + +#define USB_COUNT6_RX_NUM_BLOCK ((uint16_t)0x7C00) /*!< NUM_BLOCK[4:0] bits (Number of blocks) */ +#define USB_COUNT6_RX_NUM_BLOCK_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define USB_COUNT6_RX_NUM_BLOCK_1 ((uint16_t)0x0800) /*!< Bit 1 */ +#define USB_COUNT6_RX_NUM_BLOCK_2 ((uint16_t)0x1000) /*!< Bit 2 */ +#define USB_COUNT6_RX_NUM_BLOCK_3 ((uint16_t)0x2000) /*!< Bit 3 */ +#define USB_COUNT6_RX_NUM_BLOCK_4 ((uint16_t)0x4000) /*!< Bit 4 */ + +#define USB_COUNT6_RX_BLSIZE ((uint16_t)0x8000) /*!< BLock SIZE */ + +/***************** Bit definition for USB_COUNT7_RX register ****************/ +#define USB_COUNT7_RX_COUNT7_RX ((uint16_t)0x03FF) /*!< Reception Byte Count */ + +#define USB_COUNT7_RX_NUM_BLOCK ((uint16_t)0x7C00) /*!< NUM_BLOCK[4:0] bits (Number of blocks) */ +#define USB_COUNT7_RX_NUM_BLOCK_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define USB_COUNT7_RX_NUM_BLOCK_1 ((uint16_t)0x0800) /*!< Bit 1 */ +#define USB_COUNT7_RX_NUM_BLOCK_2 ((uint16_t)0x1000) /*!< Bit 2 */ +#define USB_COUNT7_RX_NUM_BLOCK_3 ((uint16_t)0x2000) /*!< Bit 3 */ +#define USB_COUNT7_RX_NUM_BLOCK_4 ((uint16_t)0x4000) /*!< Bit 4 */ + +#define USB_COUNT7_RX_BLSIZE ((uint16_t)0x8000) /*!< BLock SIZE */ + +/*----------------------------------------------------------------------------*/ + +/**************** Bit definition for USB_COUNT0_RX_0 register ***************/ +#define USB_COUNT0_RX_0_COUNT0_RX_0 ((uint32_t)0x000003FF) /*!< Reception Byte Count (low) */ + +#define USB_COUNT0_RX_0_NUM_BLOCK_0 ((uint32_t)0x00007C00) /*!< NUM_BLOCK_0[4:0] bits (Number of blocks) (low) */ +#define USB_COUNT0_RX_0_NUM_BLOCK_0_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define USB_COUNT0_RX_0_NUM_BLOCK_0_1 ((uint32_t)0x00000800) /*!< Bit 1 */ +#define USB_COUNT0_RX_0_NUM_BLOCK_0_2 ((uint32_t)0x00001000) /*!< Bit 2 */ +#define USB_COUNT0_RX_0_NUM_BLOCK_0_3 ((uint32_t)0x00002000) /*!< Bit 3 */ +#define USB_COUNT0_RX_0_NUM_BLOCK_0_4 ((uint32_t)0x00004000) /*!< Bit 4 */ + +#define USB_COUNT0_RX_0_BLSIZE_0 ((uint32_t)0x00008000) /*!< BLock SIZE (low) */ + +/**************** Bit definition for USB_COUNT0_RX_1 register ***************/ +#define USB_COUNT0_RX_1_COUNT0_RX_1 ((uint32_t)0x03FF0000) /*!< Reception Byte Count (high) */ + +#define USB_COUNT0_RX_1_NUM_BLOCK_1 ((uint32_t)0x7C000000) /*!< NUM_BLOCK_1[4:0] bits (Number of blocks) (high) */ +#define USB_COUNT0_RX_1_NUM_BLOCK_1_0 ((uint32_t)0x04000000) /*!< Bit 1 */ +#define USB_COUNT0_RX_1_NUM_BLOCK_1_1 ((uint32_t)0x08000000) /*!< Bit 1 */ +#define USB_COUNT0_RX_1_NUM_BLOCK_1_2 ((uint32_t)0x10000000) /*!< Bit 2 */ +#define USB_COUNT0_RX_1_NUM_BLOCK_1_3 ((uint32_t)0x20000000) /*!< Bit 3 */ +#define USB_COUNT0_RX_1_NUM_BLOCK_1_4 ((uint32_t)0x40000000) /*!< Bit 4 */ + +#define USB_COUNT0_RX_1_BLSIZE_1 ((uint32_t)0x80000000) /*!< BLock SIZE (high) */ + +/**************** Bit definition for USB_COUNT1_RX_0 register ***************/ +#define USB_COUNT1_RX_0_COUNT1_RX_0 ((uint32_t)0x000003FF) /*!< Reception Byte Count (low) */ + +#define USB_COUNT1_RX_0_NUM_BLOCK_0 ((uint32_t)0x00007C00) /*!< NUM_BLOCK_0[4:0] bits (Number of blocks) (low) */ +#define USB_COUNT1_RX_0_NUM_BLOCK_0_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define USB_COUNT1_RX_0_NUM_BLOCK_0_1 ((uint32_t)0x00000800) /*!< Bit 1 */ +#define USB_COUNT1_RX_0_NUM_BLOCK_0_2 ((uint32_t)0x00001000) /*!< Bit 2 */ +#define USB_COUNT1_RX_0_NUM_BLOCK_0_3 ((uint32_t)0x00002000) /*!< Bit 3 */ +#define USB_COUNT1_RX_0_NUM_BLOCK_0_4 ((uint32_t)0x00004000) /*!< Bit 4 */ + +#define USB_COUNT1_RX_0_BLSIZE_0 ((uint32_t)0x00008000) /*!< BLock SIZE (low) */ + +/**************** Bit definition for USB_COUNT1_RX_1 register ***************/ +#define USB_COUNT1_RX_1_COUNT1_RX_1 ((uint32_t)0x03FF0000) /*!< Reception Byte Count (high) */ + +#define USB_COUNT1_RX_1_NUM_BLOCK_1 ((uint32_t)0x7C000000) /*!< NUM_BLOCK_1[4:0] bits (Number of blocks) (high) */ +#define USB_COUNT1_RX_1_NUM_BLOCK_1_0 ((uint32_t)0x04000000) /*!< Bit 0 */ +#define USB_COUNT1_RX_1_NUM_BLOCK_1_1 ((uint32_t)0x08000000) /*!< Bit 1 */ +#define USB_COUNT1_RX_1_NUM_BLOCK_1_2 ((uint32_t)0x10000000) /*!< Bit 2 */ +#define USB_COUNT1_RX_1_NUM_BLOCK_1_3 ((uint32_t)0x20000000) /*!< Bit 3 */ +#define USB_COUNT1_RX_1_NUM_BLOCK_1_4 ((uint32_t)0x40000000) /*!< Bit 4 */ + +#define USB_COUNT1_RX_1_BLSIZE_1 ((uint32_t)0x80000000) /*!< BLock SIZE (high) */ + +/**************** Bit definition for USB_COUNT2_RX_0 register ***************/ +#define USB_COUNT2_RX_0_COUNT2_RX_0 ((uint32_t)0x000003FF) /*!< Reception Byte Count (low) */ + +#define USB_COUNT2_RX_0_NUM_BLOCK_0 ((uint32_t)0x00007C00) /*!< NUM_BLOCK_0[4:0] bits (Number of blocks) (low) */ +#define USB_COUNT2_RX_0_NUM_BLOCK_0_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define USB_COUNT2_RX_0_NUM_BLOCK_0_1 ((uint32_t)0x00000800) /*!< Bit 1 */ +#define USB_COUNT2_RX_0_NUM_BLOCK_0_2 ((uint32_t)0x00001000) /*!< Bit 2 */ +#define USB_COUNT2_RX_0_NUM_BLOCK_0_3 ((uint32_t)0x00002000) /*!< Bit 3 */ +#define USB_COUNT2_RX_0_NUM_BLOCK_0_4 ((uint32_t)0x00004000) /*!< Bit 4 */ + +#define USB_COUNT2_RX_0_BLSIZE_0 ((uint32_t)0x00008000) /*!< BLock SIZE (low) */ + +/**************** Bit definition for USB_COUNT2_RX_1 register ***************/ +#define USB_COUNT2_RX_1_COUNT2_RX_1 ((uint32_t)0x03FF0000) /*!< Reception Byte Count (high) */ + +#define USB_COUNT2_RX_1_NUM_BLOCK_1 ((uint32_t)0x7C000000) /*!< NUM_BLOCK_1[4:0] bits (Number of blocks) (high) */ +#define USB_COUNT2_RX_1_NUM_BLOCK_1_0 ((uint32_t)0x04000000) /*!< Bit 0 */ +#define USB_COUNT2_RX_1_NUM_BLOCK_1_1 ((uint32_t)0x08000000) /*!< Bit 1 */ +#define USB_COUNT2_RX_1_NUM_BLOCK_1_2 ((uint32_t)0x10000000) /*!< Bit 2 */ +#define USB_COUNT2_RX_1_NUM_BLOCK_1_3 ((uint32_t)0x20000000) /*!< Bit 3 */ +#define USB_COUNT2_RX_1_NUM_BLOCK_1_4 ((uint32_t)0x40000000) /*!< Bit 4 */ + +#define USB_COUNT2_RX_1_BLSIZE_1 ((uint32_t)0x80000000) /*!< BLock SIZE (high) */ + +/**************** Bit definition for USB_COUNT3_RX_0 register ***************/ +#define USB_COUNT3_RX_0_COUNT3_RX_0 ((uint32_t)0x000003FF) /*!< Reception Byte Count (low) */ + +#define USB_COUNT3_RX_0_NUM_BLOCK_0 ((uint32_t)0x00007C00) /*!< NUM_BLOCK_0[4:0] bits (Number of blocks) (low) */ +#define USB_COUNT3_RX_0_NUM_BLOCK_0_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define USB_COUNT3_RX_0_NUM_BLOCK_0_1 ((uint32_t)0x00000800) /*!< Bit 1 */ +#define USB_COUNT3_RX_0_NUM_BLOCK_0_2 ((uint32_t)0x00001000) /*!< Bit 2 */ +#define USB_COUNT3_RX_0_NUM_BLOCK_0_3 ((uint32_t)0x00002000) /*!< Bit 3 */ +#define USB_COUNT3_RX_0_NUM_BLOCK_0_4 ((uint32_t)0x00004000) /*!< Bit 4 */ + +#define USB_COUNT3_RX_0_BLSIZE_0 ((uint32_t)0x00008000) /*!< BLock SIZE (low) */ + +/**************** Bit definition for USB_COUNT3_RX_1 register ***************/ +#define USB_COUNT3_RX_1_COUNT3_RX_1 ((uint32_t)0x03FF0000) /*!< Reception Byte Count (high) */ + +#define USB_COUNT3_RX_1_NUM_BLOCK_1 ((uint32_t)0x7C000000) /*!< NUM_BLOCK_1[4:0] bits (Number of blocks) (high) */ +#define USB_COUNT3_RX_1_NUM_BLOCK_1_0 ((uint32_t)0x04000000) /*!< Bit 0 */ +#define USB_COUNT3_RX_1_NUM_BLOCK_1_1 ((uint32_t)0x08000000) /*!< Bit 1 */ +#define USB_COUNT3_RX_1_NUM_BLOCK_1_2 ((uint32_t)0x10000000) /*!< Bit 2 */ +#define USB_COUNT3_RX_1_NUM_BLOCK_1_3 ((uint32_t)0x20000000) /*!< Bit 3 */ +#define USB_COUNT3_RX_1_NUM_BLOCK_1_4 ((uint32_t)0x40000000) /*!< Bit 4 */ + +#define USB_COUNT3_RX_1_BLSIZE_1 ((uint32_t)0x80000000) /*!< BLock SIZE (high) */ + +/**************** Bit definition for USB_COUNT4_RX_0 register ***************/ +#define USB_COUNT4_RX_0_COUNT4_RX_0 ((uint32_t)0x000003FF) /*!< Reception Byte Count (low) */ + +#define USB_COUNT4_RX_0_NUM_BLOCK_0 ((uint32_t)0x00007C00) /*!< NUM_BLOCK_0[4:0] bits (Number of blocks) (low) */ +#define USB_COUNT4_RX_0_NUM_BLOCK_0_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define USB_COUNT4_RX_0_NUM_BLOCK_0_1 ((uint32_t)0x00000800) /*!< Bit 1 */ +#define USB_COUNT4_RX_0_NUM_BLOCK_0_2 ((uint32_t)0x00001000) /*!< Bit 2 */ +#define USB_COUNT4_RX_0_NUM_BLOCK_0_3 ((uint32_t)0x00002000) /*!< Bit 3 */ +#define USB_COUNT4_RX_0_NUM_BLOCK_0_4 ((uint32_t)0x00004000) /*!< Bit 4 */ + +#define USB_COUNT4_RX_0_BLSIZE_0 ((uint32_t)0x00008000) /*!< BLock SIZE (low) */ + +/**************** Bit definition for USB_COUNT4_RX_1 register ***************/ +#define USB_COUNT4_RX_1_COUNT4_RX_1 ((uint32_t)0x03FF0000) /*!< Reception Byte Count (high) */ + +#define USB_COUNT4_RX_1_NUM_BLOCK_1 ((uint32_t)0x7C000000) /*!< NUM_BLOCK_1[4:0] bits (Number of blocks) (high) */ +#define USB_COUNT4_RX_1_NUM_BLOCK_1_0 ((uint32_t)0x04000000) /*!< Bit 0 */ +#define USB_COUNT4_RX_1_NUM_BLOCK_1_1 ((uint32_t)0x08000000) /*!< Bit 1 */ +#define USB_COUNT4_RX_1_NUM_BLOCK_1_2 ((uint32_t)0x10000000) /*!< Bit 2 */ +#define USB_COUNT4_RX_1_NUM_BLOCK_1_3 ((uint32_t)0x20000000) /*!< Bit 3 */ +#define USB_COUNT4_RX_1_NUM_BLOCK_1_4 ((uint32_t)0x40000000) /*!< Bit 4 */ + +#define USB_COUNT4_RX_1_BLSIZE_1 ((uint32_t)0x80000000) /*!< BLock SIZE (high) */ + +/**************** Bit definition for USB_COUNT5_RX_0 register ***************/ +#define USB_COUNT5_RX_0_COUNT5_RX_0 ((uint32_t)0x000003FF) /*!< Reception Byte Count (low) */ + +#define USB_COUNT5_RX_0_NUM_BLOCK_0 ((uint32_t)0x00007C00) /*!< NUM_BLOCK_0[4:0] bits (Number of blocks) (low) */ +#define USB_COUNT5_RX_0_NUM_BLOCK_0_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define USB_COUNT5_RX_0_NUM_BLOCK_0_1 ((uint32_t)0x00000800) /*!< Bit 1 */ +#define USB_COUNT5_RX_0_NUM_BLOCK_0_2 ((uint32_t)0x00001000) /*!< Bit 2 */ +#define USB_COUNT5_RX_0_NUM_BLOCK_0_3 ((uint32_t)0x00002000) /*!< Bit 3 */ +#define USB_COUNT5_RX_0_NUM_BLOCK_0_4 ((uint32_t)0x00004000) /*!< Bit 4 */ + +#define USB_COUNT5_RX_0_BLSIZE_0 ((uint32_t)0x00008000) /*!< BLock SIZE (low) */ + +/**************** Bit definition for USB_COUNT5_RX_1 register ***************/ +#define USB_COUNT5_RX_1_COUNT5_RX_1 ((uint32_t)0x03FF0000) /*!< Reception Byte Count (high) */ + +#define USB_COUNT5_RX_1_NUM_BLOCK_1 ((uint32_t)0x7C000000) /*!< NUM_BLOCK_1[4:0] bits (Number of blocks) (high) */ +#define USB_COUNT5_RX_1_NUM_BLOCK_1_0 ((uint32_t)0x04000000) /*!< Bit 0 */ +#define USB_COUNT5_RX_1_NUM_BLOCK_1_1 ((uint32_t)0x08000000) /*!< Bit 1 */ +#define USB_COUNT5_RX_1_NUM_BLOCK_1_2 ((uint32_t)0x10000000) /*!< Bit 2 */ +#define USB_COUNT5_RX_1_NUM_BLOCK_1_3 ((uint32_t)0x20000000) /*!< Bit 3 */ +#define USB_COUNT5_RX_1_NUM_BLOCK_1_4 ((uint32_t)0x40000000) /*!< Bit 4 */ + +#define USB_COUNT5_RX_1_BLSIZE_1 ((uint32_t)0x80000000) /*!< BLock SIZE (high) */ + +/*************** Bit definition for USB_COUNT6_RX_0 register ***************/ +#define USB_COUNT6_RX_0_COUNT6_RX_0 ((uint32_t)0x000003FF) /*!< Reception Byte Count (low) */ + +#define USB_COUNT6_RX_0_NUM_BLOCK_0 ((uint32_t)0x00007C00) /*!< NUM_BLOCK_0[4:0] bits (Number of blocks) (low) */ +#define USB_COUNT6_RX_0_NUM_BLOCK_0_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define USB_COUNT6_RX_0_NUM_BLOCK_0_1 ((uint32_t)0x00000800) /*!< Bit 1 */ +#define USB_COUNT6_RX_0_NUM_BLOCK_0_2 ((uint32_t)0x00001000) /*!< Bit 2 */ +#define USB_COUNT6_RX_0_NUM_BLOCK_0_3 ((uint32_t)0x00002000) /*!< Bit 3 */ +#define USB_COUNT6_RX_0_NUM_BLOCK_0_4 ((uint32_t)0x00004000) /*!< Bit 4 */ + +#define USB_COUNT6_RX_0_BLSIZE_0 ((uint32_t)0x00008000) /*!< BLock SIZE (low) */ + +/**************** Bit definition for USB_COUNT6_RX_1 register ***************/ +#define USB_COUNT6_RX_1_COUNT6_RX_1 ((uint32_t)0x03FF0000) /*!< Reception Byte Count (high) */ + +#define USB_COUNT6_RX_1_NUM_BLOCK_1 ((uint32_t)0x7C000000) /*!< NUM_BLOCK_1[4:0] bits (Number of blocks) (high) */ +#define USB_COUNT6_RX_1_NUM_BLOCK_1_0 ((uint32_t)0x04000000) /*!< Bit 0 */ +#define USB_COUNT6_RX_1_NUM_BLOCK_1_1 ((uint32_t)0x08000000) /*!< Bit 1 */ +#define USB_COUNT6_RX_1_NUM_BLOCK_1_2 ((uint32_t)0x10000000) /*!< Bit 2 */ +#define USB_COUNT6_RX_1_NUM_BLOCK_1_3 ((uint32_t)0x20000000) /*!< Bit 3 */ +#define USB_COUNT6_RX_1_NUM_BLOCK_1_4 ((uint32_t)0x40000000) /*!< Bit 4 */ + +#define USB_COUNT6_RX_1_BLSIZE_1 ((uint32_t)0x80000000) /*!< BLock SIZE (high) */ + +/*************** Bit definition for USB_COUNT7_RX_0 register ****************/ +#define USB_COUNT7_RX_0_COUNT7_RX_0 ((uint32_t)0x000003FF) /*!< Reception Byte Count (low) */ + +#define USB_COUNT7_RX_0_NUM_BLOCK_0 ((uint32_t)0x00007C00) /*!< NUM_BLOCK_0[4:0] bits (Number of blocks) (low) */ +#define USB_COUNT7_RX_0_NUM_BLOCK_0_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define USB_COUNT7_RX_0_NUM_BLOCK_0_1 ((uint32_t)0x00000800) /*!< Bit 1 */ +#define USB_COUNT7_RX_0_NUM_BLOCK_0_2 ((uint32_t)0x00001000) /*!< Bit 2 */ +#define USB_COUNT7_RX_0_NUM_BLOCK_0_3 ((uint32_t)0x00002000) /*!< Bit 3 */ +#define USB_COUNT7_RX_0_NUM_BLOCK_0_4 ((uint32_t)0x00004000) /*!< Bit 4 */ + +#define USB_COUNT7_RX_0_BLSIZE_0 ((uint32_t)0x00008000) /*!< BLock SIZE (low) */ + +/*************** Bit definition for USB_COUNT7_RX_1 register ****************/ +#define USB_COUNT7_RX_1_COUNT7_RX_1 ((uint32_t)0x03FF0000) /*!< Reception Byte Count (high) */ + +#define USB_COUNT7_RX_1_NUM_BLOCK_1 ((uint32_t)0x7C000000) /*!< NUM_BLOCK_1[4:0] bits (Number of blocks) (high) */ +#define USB_COUNT7_RX_1_NUM_BLOCK_1_0 ((uint32_t)0x04000000) /*!< Bit 0 */ +#define USB_COUNT7_RX_1_NUM_BLOCK_1_1 ((uint32_t)0x08000000) /*!< Bit 1 */ +#define USB_COUNT7_RX_1_NUM_BLOCK_1_2 ((uint32_t)0x10000000) /*!< Bit 2 */ +#define USB_COUNT7_RX_1_NUM_BLOCK_1_3 ((uint32_t)0x20000000) /*!< Bit 3 */ +#define USB_COUNT7_RX_1_NUM_BLOCK_1_4 ((uint32_t)0x40000000) /*!< Bit 4 */ + +#define USB_COUNT7_RX_1_BLSIZE_1 ((uint32_t)0x80000000) /*!< BLock SIZE (high) */ + +/******************************************************************************/ +/* */ +/* Controller Area Network */ +/* */ +/******************************************************************************/ + +/*!< CAN control and status registers */ +/******************* Bit definition for CAN_MCR register ********************/ +#define CAN_MCR_INRQ ((uint16_t)0x0001) /*!< Initialization Request */ +#define CAN_MCR_SLEEP ((uint16_t)0x0002) /*!< Sleep Mode Request */ +#define CAN_MCR_TXFP ((uint16_t)0x0004) /*!< Transmit FIFO Priority */ +#define CAN_MCR_RFLM ((uint16_t)0x0008) /*!< Receive FIFO Locked Mode */ +#define CAN_MCR_NART ((uint16_t)0x0010) /*!< No Automatic Retransmission */ +#define CAN_MCR_AWUM ((uint16_t)0x0020) /*!< Automatic Wakeup Mode */ +#define CAN_MCR_ABOM ((uint16_t)0x0040) /*!< Automatic Bus-Off Management */ +#define CAN_MCR_TTCM ((uint16_t)0x0080) /*!< Time Triggered Communication Mode */ +#define CAN_MCR_RESET ((uint16_t)0x8000) /*!< CAN software master reset */ + +/******************* Bit definition for CAN_MSR register ********************/ +#define CAN_MSR_INAK ((uint16_t)0x0001) /*!< Initialization Acknowledge */ +#define CAN_MSR_SLAK ((uint16_t)0x0002) /*!< Sleep Acknowledge */ +#define CAN_MSR_ERRI ((uint16_t)0x0004) /*!< Error Interrupt */ +#define CAN_MSR_WKUI ((uint16_t)0x0008) /*!< Wakeup Interrupt */ +#define CAN_MSR_SLAKI ((uint16_t)0x0010) /*!< Sleep Acknowledge Interrupt */ +#define CAN_MSR_TXM ((uint16_t)0x0100) /*!< Transmit Mode */ +#define CAN_MSR_RXM ((uint16_t)0x0200) /*!< Receive Mode */ +#define CAN_MSR_SAMP ((uint16_t)0x0400) /*!< Last Sample Point */ +#define CAN_MSR_RX ((uint16_t)0x0800) /*!< CAN Rx Signal */ + +/******************* Bit definition for CAN_TSR register ********************/ +#define CAN_TSR_RQCP0 ((uint32_t)0x00000001) /*!< Request Completed Mailbox0 */ +#define CAN_TSR_TXOK0 ((uint32_t)0x00000002) /*!< Transmission OK of Mailbox0 */ +#define CAN_TSR_ALST0 ((uint32_t)0x00000004) /*!< Arbitration Lost for Mailbox0 */ +#define CAN_TSR_TERR0 ((uint32_t)0x00000008) /*!< Transmission Error of Mailbox0 */ +#define CAN_TSR_ABRQ0 ((uint32_t)0x00000080) /*!< Abort Request for Mailbox0 */ +#define CAN_TSR_RQCP1 ((uint32_t)0x00000100) /*!< Request Completed Mailbox1 */ +#define CAN_TSR_TXOK1 ((uint32_t)0x00000200) /*!< Transmission OK of Mailbox1 */ +#define CAN_TSR_ALST1 ((uint32_t)0x00000400) /*!< Arbitration Lost for Mailbox1 */ +#define CAN_TSR_TERR1 ((uint32_t)0x00000800) /*!< Transmission Error of Mailbox1 */ +#define CAN_TSR_ABRQ1 ((uint32_t)0x00008000) /*!< Abort Request for Mailbox 1 */ +#define CAN_TSR_RQCP2 ((uint32_t)0x00010000) /*!< Request Completed Mailbox2 */ +#define CAN_TSR_TXOK2 ((uint32_t)0x00020000) /*!< Transmission OK of Mailbox 2 */ +#define CAN_TSR_ALST2 ((uint32_t)0x00040000) /*!< Arbitration Lost for mailbox 2 */ +#define CAN_TSR_TERR2 ((uint32_t)0x00080000) /*!< Transmission Error of Mailbox 2 */ +#define CAN_TSR_ABRQ2 ((uint32_t)0x00800000) /*!< Abort Request for Mailbox 2 */ +#define CAN_TSR_CODE ((uint32_t)0x03000000) /*!< Mailbox Code */ + +#define CAN_TSR_TME ((uint32_t)0x1C000000) /*!< TME[2:0] bits */ +#define CAN_TSR_TME0 ((uint32_t)0x04000000) /*!< Transmit Mailbox 0 Empty */ +#define CAN_TSR_TME1 ((uint32_t)0x08000000) /*!< Transmit Mailbox 1 Empty */ +#define CAN_TSR_TME2 ((uint32_t)0x10000000) /*!< Transmit Mailbox 2 Empty */ + +#define CAN_TSR_LOW ((uint32_t)0xE0000000) /*!< LOW[2:0] bits */ +#define CAN_TSR_LOW0 ((uint32_t)0x20000000) /*!< Lowest Priority Flag for Mailbox 0 */ +#define CAN_TSR_LOW1 ((uint32_t)0x40000000) /*!< Lowest Priority Flag for Mailbox 1 */ +#define CAN_TSR_LOW2 ((uint32_t)0x80000000) /*!< Lowest Priority Flag for Mailbox 2 */ + +/******************* Bit definition for CAN_RF0R register *******************/ +#define CAN_RF0R_FMP0 ((uint8_t)0x03) /*!< FIFO 0 Message Pending */ +#define CAN_RF0R_FULL0 ((uint8_t)0x08) /*!< FIFO 0 Full */ +#define CAN_RF0R_FOVR0 ((uint8_t)0x10) /*!< FIFO 0 Overrun */ +#define CAN_RF0R_RFOM0 ((uint8_t)0x20) /*!< Release FIFO 0 Output Mailbox */ + +/******************* Bit definition for CAN_RF1R register *******************/ +#define CAN_RF1R_FMP1 ((uint8_t)0x03) /*!< FIFO 1 Message Pending */ +#define CAN_RF1R_FULL1 ((uint8_t)0x08) /*!< FIFO 1 Full */ +#define CAN_RF1R_FOVR1 ((uint8_t)0x10) /*!< FIFO 1 Overrun */ +#define CAN_RF1R_RFOM1 ((uint8_t)0x20) /*!< Release FIFO 1 Output Mailbox */ + +/******************** Bit definition for CAN_IER register *******************/ +#define CAN_IER_TMEIE ((uint32_t)0x00000001) /*!< Transmit Mailbox Empty Interrupt Enable */ +#define CAN_IER_FMPIE0 ((uint32_t)0x00000002) /*!< FIFO Message Pending Interrupt Enable */ +#define CAN_IER_FFIE0 ((uint32_t)0x00000004) /*!< FIFO Full Interrupt Enable */ +#define CAN_IER_FOVIE0 ((uint32_t)0x00000008) /*!< FIFO Overrun Interrupt Enable */ +#define CAN_IER_FMPIE1 ((uint32_t)0x00000010) /*!< FIFO Message Pending Interrupt Enable */ +#define CAN_IER_FFIE1 ((uint32_t)0x00000020) /*!< FIFO Full Interrupt Enable */ +#define CAN_IER_FOVIE1 ((uint32_t)0x00000040) /*!< FIFO Overrun Interrupt Enable */ +#define CAN_IER_EWGIE ((uint32_t)0x00000100) /*!< Error Warning Interrupt Enable */ +#define CAN_IER_EPVIE ((uint32_t)0x00000200) /*!< Error Passive Interrupt Enable */ +#define CAN_IER_BOFIE ((uint32_t)0x00000400) /*!< Bus-Off Interrupt Enable */ +#define CAN_IER_LECIE ((uint32_t)0x00000800) /*!< Last Error Code Interrupt Enable */ +#define CAN_IER_ERRIE ((uint32_t)0x00008000) /*!< Error Interrupt Enable */ +#define CAN_IER_WKUIE ((uint32_t)0x00010000) /*!< Wakeup Interrupt Enable */ +#define CAN_IER_SLKIE ((uint32_t)0x00020000) /*!< Sleep Interrupt Enable */ + +/******************** Bit definition for CAN_ESR register *******************/ +#define CAN_ESR_EWGF ((uint32_t)0x00000001) /*!< Error Warning Flag */ +#define CAN_ESR_EPVF ((uint32_t)0x00000002) /*!< Error Passive Flag */ +#define CAN_ESR_BOFF ((uint32_t)0x00000004) /*!< Bus-Off Flag */ + +#define CAN_ESR_LEC ((uint32_t)0x00000070) /*!< LEC[2:0] bits (Last Error Code) */ +#define CAN_ESR_LEC_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define CAN_ESR_LEC_1 ((uint32_t)0x00000020) /*!< Bit 1 */ +#define CAN_ESR_LEC_2 ((uint32_t)0x00000040) /*!< Bit 2 */ + +#define CAN_ESR_TEC ((uint32_t)0x00FF0000) /*!< Least significant byte of the 9-bit Transmit Error Counter */ +#define CAN_ESR_REC ((uint32_t)0xFF000000) /*!< Receive Error Counter */ + +/******************* Bit definition for CAN_BTR register ********************/ +#define CAN_BTR_BRP ((uint32_t)0x000003FF) /*!< Baud Rate Prescaler */ +#define CAN_BTR_TS1 ((uint32_t)0x000F0000) /*!< Time Segment 1 */ +#define CAN_BTR_TS2 ((uint32_t)0x00700000) /*!< Time Segment 2 */ +#define CAN_BTR_SJW ((uint32_t)0x03000000) /*!< Resynchronization Jump Width */ +#define CAN_BTR_LBKM ((uint32_t)0x40000000) /*!< Loop Back Mode (Debug) */ +#define CAN_BTR_SILM ((uint32_t)0x80000000) /*!< Silent Mode */ + +/*!< Mailbox registers */ +/****************** Bit definition for CAN_TI0R register ********************/ +#define CAN_TI0R_TXRQ ((uint32_t)0x00000001) /*!< Transmit Mailbox Request */ +#define CAN_TI0R_RTR ((uint32_t)0x00000002) /*!< Remote Transmission Request */ +#define CAN_TI0R_IDE ((uint32_t)0x00000004) /*!< Identifier Extension */ +#define CAN_TI0R_EXID ((uint32_t)0x001FFFF8) /*!< Extended Identifier */ +#define CAN_TI0R_STID ((uint32_t)0xFFE00000) /*!< Standard Identifier or Extended Identifier */ + +/****************** Bit definition for CAN_TDT0R register *******************/ +#define CAN_TDT0R_DLC ((uint32_t)0x0000000F) /*!< Data Length Code */ +#define CAN_TDT0R_TGT ((uint32_t)0x00000100) /*!< Transmit Global Time */ +#define CAN_TDT0R_TIME ((uint32_t)0xFFFF0000) /*!< Message Time Stamp */ + +/****************** Bit definition for CAN_TDL0R register *******************/ +#define CAN_TDL0R_DATA0 ((uint32_t)0x000000FF) /*!< Data byte 0 */ +#define CAN_TDL0R_DATA1 ((uint32_t)0x0000FF00) /*!< Data byte 1 */ +#define CAN_TDL0R_DATA2 ((uint32_t)0x00FF0000) /*!< Data byte 2 */ +#define CAN_TDL0R_DATA3 ((uint32_t)0xFF000000) /*!< Data byte 3 */ + +/****************** Bit definition for CAN_TDH0R register *******************/ +#define CAN_TDH0R_DATA4 ((uint32_t)0x000000FF) /*!< Data byte 4 */ +#define CAN_TDH0R_DATA5 ((uint32_t)0x0000FF00) /*!< Data byte 5 */ +#define CAN_TDH0R_DATA6 ((uint32_t)0x00FF0000) /*!< Data byte 6 */ +#define CAN_TDH0R_DATA7 ((uint32_t)0xFF000000) /*!< Data byte 7 */ + +/******************* Bit definition for CAN_TI1R register *******************/ +#define CAN_TI1R_TXRQ ((uint32_t)0x00000001) /*!< Transmit Mailbox Request */ +#define CAN_TI1R_RTR ((uint32_t)0x00000002) /*!< Remote Transmission Request */ +#define CAN_TI1R_IDE ((uint32_t)0x00000004) /*!< Identifier Extension */ +#define CAN_TI1R_EXID ((uint32_t)0x001FFFF8) /*!< Extended Identifier */ +#define CAN_TI1R_STID ((uint32_t)0xFFE00000) /*!< Standard Identifier or Extended Identifier */ + +/******************* Bit definition for CAN_TDT1R register ******************/ +#define CAN_TDT1R_DLC ((uint32_t)0x0000000F) /*!< Data Length Code */ +#define CAN_TDT1R_TGT ((uint32_t)0x00000100) /*!< Transmit Global Time */ +#define CAN_TDT1R_TIME ((uint32_t)0xFFFF0000) /*!< Message Time Stamp */ + +/******************* Bit definition for CAN_TDL1R register ******************/ +#define CAN_TDL1R_DATA0 ((uint32_t)0x000000FF) /*!< Data byte 0 */ +#define CAN_TDL1R_DATA1 ((uint32_t)0x0000FF00) /*!< Data byte 1 */ +#define CAN_TDL1R_DATA2 ((uint32_t)0x00FF0000) /*!< Data byte 2 */ +#define CAN_TDL1R_DATA3 ((uint32_t)0xFF000000) /*!< Data byte 3 */ + +/******************* Bit definition for CAN_TDH1R register ******************/ +#define CAN_TDH1R_DATA4 ((uint32_t)0x000000FF) /*!< Data byte 4 */ +#define CAN_TDH1R_DATA5 ((uint32_t)0x0000FF00) /*!< Data byte 5 */ +#define CAN_TDH1R_DATA6 ((uint32_t)0x00FF0000) /*!< Data byte 6 */ +#define CAN_TDH1R_DATA7 ((uint32_t)0xFF000000) /*!< Data byte 7 */ + +/******************* Bit definition for CAN_TI2R register *******************/ +#define CAN_TI2R_TXRQ ((uint32_t)0x00000001) /*!< Transmit Mailbox Request */ +#define CAN_TI2R_RTR ((uint32_t)0x00000002) /*!< Remote Transmission Request */ +#define CAN_TI2R_IDE ((uint32_t)0x00000004) /*!< Identifier Extension */ +#define CAN_TI2R_EXID ((uint32_t)0x001FFFF8) /*!< Extended identifier */ +#define CAN_TI2R_STID ((uint32_t)0xFFE00000) /*!< Standard Identifier or Extended Identifier */ + +/******************* Bit definition for CAN_TDT2R register ******************/ +#define CAN_TDT2R_DLC ((uint32_t)0x0000000F) /*!< Data Length Code */ +#define CAN_TDT2R_TGT ((uint32_t)0x00000100) /*!< Transmit Global Time */ +#define CAN_TDT2R_TIME ((uint32_t)0xFFFF0000) /*!< Message Time Stamp */ + +/******************* Bit definition for CAN_TDL2R register ******************/ +#define CAN_TDL2R_DATA0 ((uint32_t)0x000000FF) /*!< Data byte 0 */ +#define CAN_TDL2R_DATA1 ((uint32_t)0x0000FF00) /*!< Data byte 1 */ +#define CAN_TDL2R_DATA2 ((uint32_t)0x00FF0000) /*!< Data byte 2 */ +#define CAN_TDL2R_DATA3 ((uint32_t)0xFF000000) /*!< Data byte 3 */ + +/******************* Bit definition for CAN_TDH2R register ******************/ +#define CAN_TDH2R_DATA4 ((uint32_t)0x000000FF) /*!< Data byte 4 */ +#define CAN_TDH2R_DATA5 ((uint32_t)0x0000FF00) /*!< Data byte 5 */ +#define CAN_TDH2R_DATA6 ((uint32_t)0x00FF0000) /*!< Data byte 6 */ +#define CAN_TDH2R_DATA7 ((uint32_t)0xFF000000) /*!< Data byte 7 */ + +/******************* Bit definition for CAN_RI0R register *******************/ +#define CAN_RI0R_RTR ((uint32_t)0x00000002) /*!< Remote Transmission Request */ +#define CAN_RI0R_IDE ((uint32_t)0x00000004) /*!< Identifier Extension */ +#define CAN_RI0R_EXID ((uint32_t)0x001FFFF8) /*!< Extended Identifier */ +#define CAN_RI0R_STID ((uint32_t)0xFFE00000) /*!< Standard Identifier or Extended Identifier */ + +/******************* Bit definition for CAN_RDT0R register ******************/ +#define CAN_RDT0R_DLC ((uint32_t)0x0000000F) /*!< Data Length Code */ +#define CAN_RDT0R_FMI ((uint32_t)0x0000FF00) /*!< Filter Match Index */ +#define CAN_RDT0R_TIME ((uint32_t)0xFFFF0000) /*!< Message Time Stamp */ + +/******************* Bit definition for CAN_RDL0R register ******************/ +#define CAN_RDL0R_DATA0 ((uint32_t)0x000000FF) /*!< Data byte 0 */ +#define CAN_RDL0R_DATA1 ((uint32_t)0x0000FF00) /*!< Data byte 1 */ +#define CAN_RDL0R_DATA2 ((uint32_t)0x00FF0000) /*!< Data byte 2 */ +#define CAN_RDL0R_DATA3 ((uint32_t)0xFF000000) /*!< Data byte 3 */ + +/******************* Bit definition for CAN_RDH0R register ******************/ +#define CAN_RDH0R_DATA4 ((uint32_t)0x000000FF) /*!< Data byte 4 */ +#define CAN_RDH0R_DATA5 ((uint32_t)0x0000FF00) /*!< Data byte 5 */ +#define CAN_RDH0R_DATA6 ((uint32_t)0x00FF0000) /*!< Data byte 6 */ +#define CAN_RDH0R_DATA7 ((uint32_t)0xFF000000) /*!< Data byte 7 */ + +/******************* Bit definition for CAN_RI1R register *******************/ +#define CAN_RI1R_RTR ((uint32_t)0x00000002) /*!< Remote Transmission Request */ +#define CAN_RI1R_IDE ((uint32_t)0x00000004) /*!< Identifier Extension */ +#define CAN_RI1R_EXID ((uint32_t)0x001FFFF8) /*!< Extended identifier */ +#define CAN_RI1R_STID ((uint32_t)0xFFE00000) /*!< Standard Identifier or Extended Identifier */ + +/******************* Bit definition for CAN_RDT1R register ******************/ +#define CAN_RDT1R_DLC ((uint32_t)0x0000000F) /*!< Data Length Code */ +#define CAN_RDT1R_FMI ((uint32_t)0x0000FF00) /*!< Filter Match Index */ +#define CAN_RDT1R_TIME ((uint32_t)0xFFFF0000) /*!< Message Time Stamp */ + +/******************* Bit definition for CAN_RDL1R register ******************/ +#define CAN_RDL1R_DATA0 ((uint32_t)0x000000FF) /*!< Data byte 0 */ +#define CAN_RDL1R_DATA1 ((uint32_t)0x0000FF00) /*!< Data byte 1 */ +#define CAN_RDL1R_DATA2 ((uint32_t)0x00FF0000) /*!< Data byte 2 */ +#define CAN_RDL1R_DATA3 ((uint32_t)0xFF000000) /*!< Data byte 3 */ + +/******************* Bit definition for CAN_RDH1R register ******************/ +#define CAN_RDH1R_DATA4 ((uint32_t)0x000000FF) /*!< Data byte 4 */ +#define CAN_RDH1R_DATA5 ((uint32_t)0x0000FF00) /*!< Data byte 5 */ +#define CAN_RDH1R_DATA6 ((uint32_t)0x00FF0000) /*!< Data byte 6 */ +#define CAN_RDH1R_DATA7 ((uint32_t)0xFF000000) /*!< Data byte 7 */ + +/*!< CAN filter registers */ +/******************* Bit definition for CAN_FMR register ********************/ +#define CAN_FMR_FINIT ((uint8_t)0x01) /*!< Filter Init Mode */ + +/******************* Bit definition for CAN_FM1R register *******************/ +#define CAN_FM1R_FBM ((uint16_t)0x3FFF) /*!< Filter Mode */ +#define CAN_FM1R_FBM0 ((uint16_t)0x0001) /*!< Filter Init Mode bit 0 */ +#define CAN_FM1R_FBM1 ((uint16_t)0x0002) /*!< Filter Init Mode bit 1 */ +#define CAN_FM1R_FBM2 ((uint16_t)0x0004) /*!< Filter Init Mode bit 2 */ +#define CAN_FM1R_FBM3 ((uint16_t)0x0008) /*!< Filter Init Mode bit 3 */ +#define CAN_FM1R_FBM4 ((uint16_t)0x0010) /*!< Filter Init Mode bit 4 */ +#define CAN_FM1R_FBM5 ((uint16_t)0x0020) /*!< Filter Init Mode bit 5 */ +#define CAN_FM1R_FBM6 ((uint16_t)0x0040) /*!< Filter Init Mode bit 6 */ +#define CAN_FM1R_FBM7 ((uint16_t)0x0080) /*!< Filter Init Mode bit 7 */ +#define CAN_FM1R_FBM8 ((uint16_t)0x0100) /*!< Filter Init Mode bit 8 */ +#define CAN_FM1R_FBM9 ((uint16_t)0x0200) /*!< Filter Init Mode bit 9 */ +#define CAN_FM1R_FBM10 ((uint16_t)0x0400) /*!< Filter Init Mode bit 10 */ +#define CAN_FM1R_FBM11 ((uint16_t)0x0800) /*!< Filter Init Mode bit 11 */ +#define CAN_FM1R_FBM12 ((uint16_t)0x1000) /*!< Filter Init Mode bit 12 */ +#define CAN_FM1R_FBM13 ((uint16_t)0x2000) /*!< Filter Init Mode bit 13 */ + +/******************* Bit definition for CAN_FS1R register *******************/ +#define CAN_FS1R_FSC ((uint16_t)0x3FFF) /*!< Filter Scale Configuration */ +#define CAN_FS1R_FSC0 ((uint16_t)0x0001) /*!< Filter Scale Configuration bit 0 */ +#define CAN_FS1R_FSC1 ((uint16_t)0x0002) /*!< Filter Scale Configuration bit 1 */ +#define CAN_FS1R_FSC2 ((uint16_t)0x0004) /*!< Filter Scale Configuration bit 2 */ +#define CAN_FS1R_FSC3 ((uint16_t)0x0008) /*!< Filter Scale Configuration bit 3 */ +#define CAN_FS1R_FSC4 ((uint16_t)0x0010) /*!< Filter Scale Configuration bit 4 */ +#define CAN_FS1R_FSC5 ((uint16_t)0x0020) /*!< Filter Scale Configuration bit 5 */ +#define CAN_FS1R_FSC6 ((uint16_t)0x0040) /*!< Filter Scale Configuration bit 6 */ +#define CAN_FS1R_FSC7 ((uint16_t)0x0080) /*!< Filter Scale Configuration bit 7 */ +#define CAN_FS1R_FSC8 ((uint16_t)0x0100) /*!< Filter Scale Configuration bit 8 */ +#define CAN_FS1R_FSC9 ((uint16_t)0x0200) /*!< Filter Scale Configuration bit 9 */ +#define CAN_FS1R_FSC10 ((uint16_t)0x0400) /*!< Filter Scale Configuration bit 10 */ +#define CAN_FS1R_FSC11 ((uint16_t)0x0800) /*!< Filter Scale Configuration bit 11 */ +#define CAN_FS1R_FSC12 ((uint16_t)0x1000) /*!< Filter Scale Configuration bit 12 */ +#define CAN_FS1R_FSC13 ((uint16_t)0x2000) /*!< Filter Scale Configuration bit 13 */ + +/****************** Bit definition for CAN_FFA1R register *******************/ +#define CAN_FFA1R_FFA ((uint16_t)0x3FFF) /*!< Filter FIFO Assignment */ +#define CAN_FFA1R_FFA0 ((uint16_t)0x0001) /*!< Filter FIFO Assignment for Filter 0 */ +#define CAN_FFA1R_FFA1 ((uint16_t)0x0002) /*!< Filter FIFO Assignment for Filter 1 */ +#define CAN_FFA1R_FFA2 ((uint16_t)0x0004) /*!< Filter FIFO Assignment for Filter 2 */ +#define CAN_FFA1R_FFA3 ((uint16_t)0x0008) /*!< Filter FIFO Assignment for Filter 3 */ +#define CAN_FFA1R_FFA4 ((uint16_t)0x0010) /*!< Filter FIFO Assignment for Filter 4 */ +#define CAN_FFA1R_FFA5 ((uint16_t)0x0020) /*!< Filter FIFO Assignment for Filter 5 */ +#define CAN_FFA1R_FFA6 ((uint16_t)0x0040) /*!< Filter FIFO Assignment for Filter 6 */ +#define CAN_FFA1R_FFA7 ((uint16_t)0x0080) /*!< Filter FIFO Assignment for Filter 7 */ +#define CAN_FFA1R_FFA8 ((uint16_t)0x0100) /*!< Filter FIFO Assignment for Filter 8 */ +#define CAN_FFA1R_FFA9 ((uint16_t)0x0200) /*!< Filter FIFO Assignment for Filter 9 */ +#define CAN_FFA1R_FFA10 ((uint16_t)0x0400) /*!< Filter FIFO Assignment for Filter 10 */ +#define CAN_FFA1R_FFA11 ((uint16_t)0x0800) /*!< Filter FIFO Assignment for Filter 11 */ +#define CAN_FFA1R_FFA12 ((uint16_t)0x1000) /*!< Filter FIFO Assignment for Filter 12 */ +#define CAN_FFA1R_FFA13 ((uint16_t)0x2000) /*!< Filter FIFO Assignment for Filter 13 */ + +/******************* Bit definition for CAN_FA1R register *******************/ +#define CAN_FA1R_FACT ((uint16_t)0x3FFF) /*!< Filter Active */ +#define CAN_FA1R_FACT0 ((uint16_t)0x0001) /*!< Filter 0 Active */ +#define CAN_FA1R_FACT1 ((uint16_t)0x0002) /*!< Filter 1 Active */ +#define CAN_FA1R_FACT2 ((uint16_t)0x0004) /*!< Filter 2 Active */ +#define CAN_FA1R_FACT3 ((uint16_t)0x0008) /*!< Filter 3 Active */ +#define CAN_FA1R_FACT4 ((uint16_t)0x0010) /*!< Filter 4 Active */ +#define CAN_FA1R_FACT5 ((uint16_t)0x0020) /*!< Filter 5 Active */ +#define CAN_FA1R_FACT6 ((uint16_t)0x0040) /*!< Filter 6 Active */ +#define CAN_FA1R_FACT7 ((uint16_t)0x0080) /*!< Filter 7 Active */ +#define CAN_FA1R_FACT8 ((uint16_t)0x0100) /*!< Filter 8 Active */ +#define CAN_FA1R_FACT9 ((uint16_t)0x0200) /*!< Filter 9 Active */ +#define CAN_FA1R_FACT10 ((uint16_t)0x0400) /*!< Filter 10 Active */ +#define CAN_FA1R_FACT11 ((uint16_t)0x0800) /*!< Filter 11 Active */ +#define CAN_FA1R_FACT12 ((uint16_t)0x1000) /*!< Filter 12 Active */ +#define CAN_FA1R_FACT13 ((uint16_t)0x2000) /*!< Filter 13 Active */ + +/******************* Bit definition for CAN_F0R1 register *******************/ +#define CAN_F0R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F0R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F0R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F0R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F0R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F0R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F0R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F0R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F0R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F0R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F0R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F0R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F0R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F0R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F0R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F0R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F0R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F0R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F0R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F0R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F0R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F0R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F0R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F0R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F0R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F0R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F0R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F0R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F0R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F0R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F0R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F0R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F1R1 register *******************/ +#define CAN_F1R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F1R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F1R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F1R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F1R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F1R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F1R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F1R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F1R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F1R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F1R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F1R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F1R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F1R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F1R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F1R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F1R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F1R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F1R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F1R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F1R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F1R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F1R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F1R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F1R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F1R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F1R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F1R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F1R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F1R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F1R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F1R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F2R1 register *******************/ +#define CAN_F2R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F2R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F2R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F2R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F2R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F2R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F2R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F2R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F2R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F2R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F2R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F2R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F2R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F2R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F2R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F2R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F2R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F2R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F2R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F2R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F2R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F2R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F2R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F2R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F2R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F2R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F2R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F2R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F2R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F2R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F2R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F2R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F3R1 register *******************/ +#define CAN_F3R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F3R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F3R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F3R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F3R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F3R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F3R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F3R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F3R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F3R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F3R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F3R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F3R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F3R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F3R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F3R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F3R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F3R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F3R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F3R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F3R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F3R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F3R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F3R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F3R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F3R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F3R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F3R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F3R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F3R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F3R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F3R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F4R1 register *******************/ +#define CAN_F4R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F4R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F4R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F4R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F4R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F4R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F4R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F4R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F4R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F4R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F4R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F4R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F4R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F4R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F4R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F4R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F4R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F4R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F4R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F4R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F4R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F4R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F4R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F4R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F4R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F4R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F4R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F4R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F4R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F4R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F4R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F4R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F5R1 register *******************/ +#define CAN_F5R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F5R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F5R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F5R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F5R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F5R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F5R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F5R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F5R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F5R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F5R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F5R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F5R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F5R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F5R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F5R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F5R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F5R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F5R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F5R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F5R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F5R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F5R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F5R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F5R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F5R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F5R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F5R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F5R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F5R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F5R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F5R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F6R1 register *******************/ +#define CAN_F6R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F6R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F6R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F6R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F6R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F6R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F6R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F6R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F6R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F6R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F6R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F6R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F6R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F6R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F6R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F6R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F6R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F6R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F6R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F6R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F6R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F6R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F6R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F6R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F6R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F6R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F6R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F6R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F6R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F6R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F6R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F6R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F7R1 register *******************/ +#define CAN_F7R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F7R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F7R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F7R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F7R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F7R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F7R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F7R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F7R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F7R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F7R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F7R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F7R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F7R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F7R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F7R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F7R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F7R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F7R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F7R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F7R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F7R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F7R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F7R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F7R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F7R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F7R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F7R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F7R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F7R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F7R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F7R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F8R1 register *******************/ +#define CAN_F8R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F8R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F8R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F8R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F8R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F8R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F8R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F8R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F8R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F8R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F8R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F8R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F8R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F8R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F8R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F8R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F8R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F8R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F8R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F8R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F8R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F8R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F8R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F8R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F8R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F8R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F8R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F8R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F8R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F8R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F8R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F8R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F9R1 register *******************/ +#define CAN_F9R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F9R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F9R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F9R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F9R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F9R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F9R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F9R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F9R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F9R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F9R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F9R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F9R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F9R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F9R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F9R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F9R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F9R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F9R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F9R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F9R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F9R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F9R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F9R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F9R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F9R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F9R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F9R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F9R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F9R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F9R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F9R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F10R1 register ******************/ +#define CAN_F10R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F10R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F10R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F10R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F10R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F10R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F10R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F10R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F10R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F10R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F10R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F10R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F10R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F10R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F10R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F10R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F10R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F10R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F10R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F10R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F10R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F10R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F10R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F10R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F10R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F10R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F10R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F10R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F10R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F10R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F10R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F10R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F11R1 register ******************/ +#define CAN_F11R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F11R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F11R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F11R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F11R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F11R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F11R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F11R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F11R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F11R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F11R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F11R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F11R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F11R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F11R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F11R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F11R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F11R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F11R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F11R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F11R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F11R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F11R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F11R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F11R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F11R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F11R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F11R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F11R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F11R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F11R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F11R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F12R1 register ******************/ +#define CAN_F12R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F12R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F12R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F12R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F12R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F12R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F12R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F12R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F12R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F12R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F12R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F12R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F12R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F12R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F12R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F12R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F12R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F12R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F12R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F12R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F12R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F12R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F12R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F12R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F12R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F12R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F12R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F12R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F12R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F12R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F12R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F12R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F13R1 register ******************/ +#define CAN_F13R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F13R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F13R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F13R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F13R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F13R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F13R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F13R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F13R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F13R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F13R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F13R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F13R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F13R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F13R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F13R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F13R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F13R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F13R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F13R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F13R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F13R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F13R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F13R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F13R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F13R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F13R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F13R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F13R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F13R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F13R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F13R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F0R2 register *******************/ +#define CAN_F0R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F0R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F0R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F0R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F0R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F0R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F0R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F0R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F0R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F0R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F0R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F0R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F0R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F0R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F0R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F0R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F0R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F0R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F0R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F0R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F0R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F0R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F0R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F0R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F0R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F0R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F0R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F0R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F0R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F0R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F0R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F0R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F1R2 register *******************/ +#define CAN_F1R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F1R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F1R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F1R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F1R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F1R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F1R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F1R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F1R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F1R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F1R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F1R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F1R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F1R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F1R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F1R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F1R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F1R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F1R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F1R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F1R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F1R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F1R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F1R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F1R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F1R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F1R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F1R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F1R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F1R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F1R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F1R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F2R2 register *******************/ +#define CAN_F2R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F2R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F2R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F2R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F2R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F2R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F2R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F2R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F2R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F2R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F2R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F2R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F2R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F2R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F2R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F2R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F2R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F2R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F2R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F2R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F2R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F2R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F2R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F2R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F2R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F2R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F2R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F2R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F2R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F2R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F2R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F2R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F3R2 register *******************/ +#define CAN_F3R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F3R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F3R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F3R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F3R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F3R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F3R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F3R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F3R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F3R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F3R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F3R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F3R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F3R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F3R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F3R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F3R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F3R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F3R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F3R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F3R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F3R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F3R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F3R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F3R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F3R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F3R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F3R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F3R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F3R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F3R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F3R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F4R2 register *******************/ +#define CAN_F4R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F4R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F4R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F4R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F4R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F4R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F4R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F4R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F4R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F4R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F4R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F4R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F4R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F4R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F4R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F4R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F4R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F4R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F4R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F4R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F4R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F4R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F4R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F4R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F4R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F4R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F4R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F4R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F4R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F4R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F4R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F4R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F5R2 register *******************/ +#define CAN_F5R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F5R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F5R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F5R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F5R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F5R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F5R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F5R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F5R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F5R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F5R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F5R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F5R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F5R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F5R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F5R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F5R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F5R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F5R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F5R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F5R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F5R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F5R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F5R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F5R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F5R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F5R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F5R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F5R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F5R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F5R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F5R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F6R2 register *******************/ +#define CAN_F6R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F6R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F6R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F6R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F6R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F6R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F6R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F6R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F6R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F6R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F6R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F6R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F6R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F6R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F6R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F6R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F6R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F6R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F6R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F6R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F6R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F6R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F6R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F6R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F6R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F6R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F6R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F6R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F6R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F6R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F6R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F6R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F7R2 register *******************/ +#define CAN_F7R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F7R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F7R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F7R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F7R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F7R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F7R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F7R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F7R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F7R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F7R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F7R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F7R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F7R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F7R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F7R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F7R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F7R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F7R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F7R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F7R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F7R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F7R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F7R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F7R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F7R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F7R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F7R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F7R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F7R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F7R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F7R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F8R2 register *******************/ +#define CAN_F8R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F8R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F8R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F8R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F8R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F8R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F8R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F8R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F8R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F8R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F8R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F8R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F8R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F8R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F8R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F8R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F8R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F8R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F8R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F8R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F8R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F8R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F8R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F8R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F8R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F8R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F8R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F8R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F8R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F8R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F8R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F8R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F9R2 register *******************/ +#define CAN_F9R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F9R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F9R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F9R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F9R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F9R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F9R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F9R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F9R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F9R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F9R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F9R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F9R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F9R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F9R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F9R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F9R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F9R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F9R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F9R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F9R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F9R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F9R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F9R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F9R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F9R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F9R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F9R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F9R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F9R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F9R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F9R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F10R2 register ******************/ +#define CAN_F10R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F10R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F10R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F10R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F10R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F10R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F10R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F10R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F10R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F10R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F10R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F10R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F10R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F10R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F10R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F10R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F10R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F10R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F10R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F10R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F10R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F10R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F10R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F10R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F10R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F10R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F10R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F10R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F10R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F10R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F10R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F10R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F11R2 register ******************/ +#define CAN_F11R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F11R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F11R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F11R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F11R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F11R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F11R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F11R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F11R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F11R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F11R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F11R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F11R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F11R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F11R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F11R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F11R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F11R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F11R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F11R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F11R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F11R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F11R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F11R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F11R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F11R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F11R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F11R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F11R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F11R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F11R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F11R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F12R2 register ******************/ +#define CAN_F12R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F12R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F12R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F12R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F12R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F12R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F12R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F12R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F12R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F12R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F12R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F12R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F12R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F12R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F12R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F12R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F12R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F12R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F12R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F12R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F12R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F12R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F12R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F12R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F12R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F12R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F12R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F12R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F12R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F12R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F12R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F12R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F13R2 register ******************/ +#define CAN_F13R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F13R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F13R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F13R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F13R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F13R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F13R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F13R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F13R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F13R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F13R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F13R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F13R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F13R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F13R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F13R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F13R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F13R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F13R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F13R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F13R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F13R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F13R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F13R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F13R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F13R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F13R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F13R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F13R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F13R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F13R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F13R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************************************************************************/ +/* */ +/* Serial Peripheral Interface */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for SPI_CR1 register ********************/ +#define SPI_CR1_CPHA ((uint16_t)0x0001) /*!< Clock Phase */ +#define SPI_CR1_CPOL ((uint16_t)0x0002) /*!< Clock Polarity */ +#define SPI_CR1_MSTR ((uint16_t)0x0004) /*!< Master Selection */ + +#define SPI_CR1_BR ((uint16_t)0x0038) /*!< BR[2:0] bits (Baud Rate Control) */ +#define SPI_CR1_BR_0 ((uint16_t)0x0008) /*!< Bit 0 */ +#define SPI_CR1_BR_1 ((uint16_t)0x0010) /*!< Bit 1 */ +#define SPI_CR1_BR_2 ((uint16_t)0x0020) /*!< Bit 2 */ + +#define SPI_CR1_SPE ((uint16_t)0x0040) /*!< SPI Enable */ +#define SPI_CR1_LSBFIRST ((uint16_t)0x0080) /*!< Frame Format */ +#define SPI_CR1_SSI ((uint16_t)0x0100) /*!< Internal slave select */ +#define SPI_CR1_SSM ((uint16_t)0x0200) /*!< Software slave management */ +#define SPI_CR1_RXONLY ((uint16_t)0x0400) /*!< Receive only */ +#define SPI_CR1_DFF ((uint16_t)0x0800) /*!< Data Frame Format */ +#define SPI_CR1_CRCNEXT ((uint16_t)0x1000) /*!< Transmit CRC next */ +#define SPI_CR1_CRCEN ((uint16_t)0x2000) /*!< Hardware CRC calculation enable */ +#define SPI_CR1_BIDIOE ((uint16_t)0x4000) /*!< Output enable in bidirectional mode */ +#define SPI_CR1_BIDIMODE ((uint16_t)0x8000) /*!< Bidirectional data mode enable */ + +/******************* Bit definition for SPI_CR2 register ********************/ +#define SPI_CR2_RXDMAEN ((uint8_t)0x01) /*!< Rx Buffer DMA Enable */ +#define SPI_CR2_TXDMAEN ((uint8_t)0x02) /*!< Tx Buffer DMA Enable */ +#define SPI_CR2_SSOE ((uint8_t)0x04) /*!< SS Output Enable */ +#define SPI_CR2_ERRIE ((uint8_t)0x20) /*!< Error Interrupt Enable */ +#define SPI_CR2_RXNEIE ((uint8_t)0x40) /*!< RX buffer Not Empty Interrupt Enable */ +#define SPI_CR2_TXEIE ((uint8_t)0x80) /*!< Tx buffer Empty Interrupt Enable */ + +/******************** Bit definition for SPI_SR register ********************/ +#define SPI_SR_RXNE ((uint8_t)0x01) /*!< Receive buffer Not Empty */ +#define SPI_SR_TXE ((uint8_t)0x02) /*!< Transmit buffer Empty */ +#define SPI_SR_CHSIDE ((uint8_t)0x04) /*!< Channel side */ +#define SPI_SR_UDR ((uint8_t)0x08) /*!< Underrun flag */ +#define SPI_SR_CRCERR ((uint8_t)0x10) /*!< CRC Error flag */ +#define SPI_SR_MODF ((uint8_t)0x20) /*!< Mode fault */ +#define SPI_SR_OVR ((uint8_t)0x40) /*!< Overrun flag */ +#define SPI_SR_BSY ((uint8_t)0x80) /*!< Busy flag */ + +/******************** Bit definition for SPI_DR register ********************/ +#define SPI_DR_DR ((uint16_t)0xFFFF) /*!< Data Register */ + +/******************* Bit definition for SPI_CRCPR register ******************/ +#define SPI_CRCPR_CRCPOLY ((uint16_t)0xFFFF) /*!< CRC polynomial register */ + +/****************** Bit definition for SPI_RXCRCR register ******************/ +#define SPI_RXCRCR_RXCRC ((uint16_t)0xFFFF) /*!< Rx CRC Register */ + +/****************** Bit definition for SPI_TXCRCR register ******************/ +#define SPI_TXCRCR_TXCRC ((uint16_t)0xFFFF) /*!< Tx CRC Register */ + +/****************** Bit definition for SPI_I2SCFGR register *****************/ +#define SPI_I2SCFGR_CHLEN ((uint16_t)0x0001) /*!< Channel length (number of bits per audio channel) */ + +#define SPI_I2SCFGR_DATLEN ((uint16_t)0x0006) /*!< DATLEN[1:0] bits (Data length to be transferred) */ +#define SPI_I2SCFGR_DATLEN_0 ((uint16_t)0x0002) /*!< Bit 0 */ +#define SPI_I2SCFGR_DATLEN_1 ((uint16_t)0x0004) /*!< Bit 1 */ + +#define SPI_I2SCFGR_CKPOL ((uint16_t)0x0008) /*!< steady state clock polarity */ + +#define SPI_I2SCFGR_I2SSTD ((uint16_t)0x0030) /*!< I2SSTD[1:0] bits (I2S standard selection) */ +#define SPI_I2SCFGR_I2SSTD_0 ((uint16_t)0x0010) /*!< Bit 0 */ +#define SPI_I2SCFGR_I2SSTD_1 ((uint16_t)0x0020) /*!< Bit 1 */ + +#define SPI_I2SCFGR_PCMSYNC ((uint16_t)0x0080) /*!< PCM frame synchronization */ + +#define SPI_I2SCFGR_I2SCFG ((uint16_t)0x0300) /*!< I2SCFG[1:0] bits (I2S configuration mode) */ +#define SPI_I2SCFGR_I2SCFG_0 ((uint16_t)0x0100) /*!< Bit 0 */ +#define SPI_I2SCFGR_I2SCFG_1 ((uint16_t)0x0200) /*!< Bit 1 */ + +#define SPI_I2SCFGR_I2SE ((uint16_t)0x0400) /*!< I2S Enable */ +#define SPI_I2SCFGR_I2SMOD ((uint16_t)0x0800) /*!< I2S mode selection */ + +/****************** Bit definition for SPI_I2SPR register *******************/ +#define SPI_I2SPR_I2SDIV ((uint16_t)0x00FF) /*!< I2S Linear prescaler */ +#define SPI_I2SPR_ODD ((uint16_t)0x0100) /*!< Odd factor for the prescaler */ +#define SPI_I2SPR_MCKOE ((uint16_t)0x0200) /*!< Master Clock Output Enable */ + +/******************************************************************************/ +/* */ +/* Inter-integrated Circuit Interface */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for I2C_CR1 register ********************/ +#define I2C_CR1_PE ((uint16_t)0x0001) /*!< Peripheral Enable */ +#define I2C_CR1_SMBUS ((uint16_t)0x0002) /*!< SMBus Mode */ +#define I2C_CR1_SMBTYPE ((uint16_t)0x0008) /*!< SMBus Type */ +#define I2C_CR1_ENARP ((uint16_t)0x0010) /*!< ARP Enable */ +#define I2C_CR1_ENPEC ((uint16_t)0x0020) /*!< PEC Enable */ +#define I2C_CR1_ENGC ((uint16_t)0x0040) /*!< General Call Enable */ +#define I2C_CR1_NOSTRETCH ((uint16_t)0x0080) /*!< Clock Stretching Disable (Slave mode) */ +#define I2C_CR1_START ((uint16_t)0x0100) /*!< Start Generation */ +#define I2C_CR1_STOP ((uint16_t)0x0200) /*!< Stop Generation */ +#define I2C_CR1_ACK ((uint16_t)0x0400) /*!< Acknowledge Enable */ +#define I2C_CR1_POS ((uint16_t)0x0800) /*!< Acknowledge/PEC Position (for data reception) */ +#define I2C_CR1_PEC ((uint16_t)0x1000) /*!< Packet Error Checking */ +#define I2C_CR1_ALERT ((uint16_t)0x2000) /*!< SMBus Alert */ +#define I2C_CR1_SWRST ((uint16_t)0x8000) /*!< Software Reset */ + +/******************* Bit definition for I2C_CR2 register ********************/ +#define I2C_CR2_FREQ ((uint16_t)0x003F) /*!< FREQ[5:0] bits (Peripheral Clock Frequency) */ +#define I2C_CR2_FREQ_0 ((uint16_t)0x0001) /*!< Bit 0 */ +#define I2C_CR2_FREQ_1 ((uint16_t)0x0002) /*!< Bit 1 */ +#define I2C_CR2_FREQ_2 ((uint16_t)0x0004) /*!< Bit 2 */ +#define I2C_CR2_FREQ_3 ((uint16_t)0x0008) /*!< Bit 3 */ +#define I2C_CR2_FREQ_4 ((uint16_t)0x0010) /*!< Bit 4 */ +#define I2C_CR2_FREQ_5 ((uint16_t)0x0020) /*!< Bit 5 */ + +#define I2C_CR2_ITERREN ((uint16_t)0x0100) /*!< Error Interrupt Enable */ +#define I2C_CR2_ITEVTEN ((uint16_t)0x0200) /*!< Event Interrupt Enable */ +#define I2C_CR2_ITBUFEN ((uint16_t)0x0400) /*!< Buffer Interrupt Enable */ +#define I2C_CR2_DMAEN ((uint16_t)0x0800) /*!< DMA Requests Enable */ +#define I2C_CR2_LAST ((uint16_t)0x1000) /*!< DMA Last Transfer */ + +/******************* Bit definition for I2C_OAR1 register *******************/ +#define I2C_OAR1_ADD1_7 ((uint16_t)0x00FE) /*!< Interface Address */ +#define I2C_OAR1_ADD8_9 ((uint16_t)0x0300) /*!< Interface Address */ + +#define I2C_OAR1_ADD0 ((uint16_t)0x0001) /*!< Bit 0 */ +#define I2C_OAR1_ADD1 ((uint16_t)0x0002) /*!< Bit 1 */ +#define I2C_OAR1_ADD2 ((uint16_t)0x0004) /*!< Bit 2 */ +#define I2C_OAR1_ADD3 ((uint16_t)0x0008) /*!< Bit 3 */ +#define I2C_OAR1_ADD4 ((uint16_t)0x0010) /*!< Bit 4 */ +#define I2C_OAR1_ADD5 ((uint16_t)0x0020) /*!< Bit 5 */ +#define I2C_OAR1_ADD6 ((uint16_t)0x0040) /*!< Bit 6 */ +#define I2C_OAR1_ADD7 ((uint16_t)0x0080) /*!< Bit 7 */ +#define I2C_OAR1_ADD8 ((uint16_t)0x0100) /*!< Bit 8 */ +#define I2C_OAR1_ADD9 ((uint16_t)0x0200) /*!< Bit 9 */ + +#define I2C_OAR1_ADDMODE ((uint16_t)0x8000) /*!< Addressing Mode (Slave mode) */ + +/******************* Bit definition for I2C_OAR2 register *******************/ +#define I2C_OAR2_ENDUAL ((uint8_t)0x01) /*!< Dual addressing mode enable */ +#define I2C_OAR2_ADD2 ((uint8_t)0xFE) /*!< Interface address */ + +/******************** Bit definition for I2C_DR register ********************/ +#define I2C_DR_DR ((uint8_t)0xFF) /*!< 8-bit Data Register */ + +/******************* Bit definition for I2C_SR1 register ********************/ +#define I2C_SR1_SB ((uint16_t)0x0001) /*!< Start Bit (Master mode) */ +#define I2C_SR1_ADDR ((uint16_t)0x0002) /*!< Address sent (master mode)/matched (slave mode) */ +#define I2C_SR1_BTF ((uint16_t)0x0004) /*!< Byte Transfer Finished */ +#define I2C_SR1_ADD10 ((uint16_t)0x0008) /*!< 10-bit header sent (Master mode) */ +#define I2C_SR1_STOPF ((uint16_t)0x0010) /*!< Stop detection (Slave mode) */ +#define I2C_SR1_RXNE ((uint16_t)0x0040) /*!< Data Register not Empty (receivers) */ +#define I2C_SR1_TXE ((uint16_t)0x0080) /*!< Data Register Empty (transmitters) */ +#define I2C_SR1_BERR ((uint16_t)0x0100) /*!< Bus Error */ +#define I2C_SR1_ARLO ((uint16_t)0x0200) /*!< Arbitration Lost (master mode) */ +#define I2C_SR1_AF ((uint16_t)0x0400) /*!< Acknowledge Failure */ +#define I2C_SR1_OVR ((uint16_t)0x0800) /*!< Overrun/Underrun */ +#define I2C_SR1_PECERR ((uint16_t)0x1000) /*!< PEC Error in reception */ +#define I2C_SR1_TIMEOUT ((uint16_t)0x4000) /*!< Timeout or Tlow Error */ +#define I2C_SR1_SMBALERT ((uint16_t)0x8000) /*!< SMBus Alert */ + +/******************* Bit definition for I2C_SR2 register ********************/ +#define I2C_SR2_MSL ((uint16_t)0x0001) /*!< Master/Slave */ +#define I2C_SR2_BUSY ((uint16_t)0x0002) /*!< Bus Busy */ +#define I2C_SR2_TRA ((uint16_t)0x0004) /*!< Transmitter/Receiver */ +#define I2C_SR2_GENCALL ((uint16_t)0x0010) /*!< General Call Address (Slave mode) */ +#define I2C_SR2_SMBDEFAULT ((uint16_t)0x0020) /*!< SMBus Device Default Address (Slave mode) */ +#define I2C_SR2_SMBHOST ((uint16_t)0x0040) /*!< SMBus Host Header (Slave mode) */ +#define I2C_SR2_DUALF ((uint16_t)0x0080) /*!< Dual Flag (Slave mode) */ +#define I2C_SR2_PEC ((uint16_t)0xFF00) /*!< Packet Error Checking Register */ + +/******************* Bit definition for I2C_CCR register ********************/ +#define I2C_CCR_CCR ((uint16_t)0x0FFF) /*!< Clock Control Register in Fast/Standard mode (Master mode) */ +#define I2C_CCR_DUTY ((uint16_t)0x4000) /*!< Fast Mode Duty Cycle */ +#define I2C_CCR_FS ((uint16_t)0x8000) /*!< I2C Master Mode Selection */ + +/****************** Bit definition for I2C_TRISE register *******************/ +#define I2C_TRISE_TRISE ((uint8_t)0x3F) /*!< Maximum Rise Time in Fast/Standard mode (Master mode) */ + +/******************************************************************************/ +/* */ +/* Universal Synchronous Asynchronous Receiver Transmitter */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for USART_SR register *******************/ +#define USART_SR_PE ((uint16_t)0x0001) /*!< Parity Error */ +#define USART_SR_FE ((uint16_t)0x0002) /*!< Framing Error */ +#define USART_SR_NE ((uint16_t)0x0004) /*!< Noise Error Flag */ +#define USART_SR_ORE ((uint16_t)0x0008) /*!< OverRun Error */ +#define USART_SR_IDLE ((uint16_t)0x0010) /*!< IDLE line detected */ +#define USART_SR_RXNE ((uint16_t)0x0020) /*!< Read Data Register Not Empty */ +#define USART_SR_TC ((uint16_t)0x0040) /*!< Transmission Complete */ +#define USART_SR_TXE ((uint16_t)0x0080) /*!< Transmit Data Register Empty */ +#define USART_SR_LBD ((uint16_t)0x0100) /*!< LIN Break Detection Flag */ +#define USART_SR_CTS ((uint16_t)0x0200) /*!< CTS Flag */ + +/******************* Bit definition for USART_DR register *******************/ +#define USART_DR_DR ((uint16_t)0x01FF) /*!< Data value */ + +/****************** Bit definition for USART_BRR register *******************/ +#define USART_BRR_DIV_Fraction ((uint16_t)0x000F) /*!< Fraction of USARTDIV */ +#define USART_BRR_DIV_Mantissa ((uint16_t)0xFFF0) /*!< Mantissa of USARTDIV */ + +/****************** Bit definition for USART_CR1 register *******************/ +#define USART_CR1_SBK ((uint16_t)0x0001) /*!< Send Break */ +#define USART_CR1_RWU ((uint16_t)0x0002) /*!< Receiver wakeup */ +#define USART_CR1_RE ((uint16_t)0x0004) /*!< Receiver Enable */ +#define USART_CR1_TE ((uint16_t)0x0008) /*!< Transmitter Enable */ +#define USART_CR1_IDLEIE ((uint16_t)0x0010) /*!< IDLE Interrupt Enable */ +#define USART_CR1_RXNEIE ((uint16_t)0x0020) /*!< RXNE Interrupt Enable */ +#define USART_CR1_TCIE ((uint16_t)0x0040) /*!< Transmission Complete Interrupt Enable */ +#define USART_CR1_TXEIE ((uint16_t)0x0080) /*!< PE Interrupt Enable */ +#define USART_CR1_PEIE ((uint16_t)0x0100) /*!< PE Interrupt Enable */ +#define USART_CR1_PS ((uint16_t)0x0200) /*!< Parity Selection */ +#define USART_CR1_PCE ((uint16_t)0x0400) /*!< Parity Control Enable */ +#define USART_CR1_WAKE ((uint16_t)0x0800) /*!< Wakeup method */ +#define USART_CR1_M ((uint16_t)0x1000) /*!< Word length */ +#define USART_CR1_UE ((uint16_t)0x2000) /*!< USART Enable */ +#define USART_CR1_OVER8 ((uint16_t)0x8000) /*!< USART Oversmapling 8-bits */ + +/****************** Bit definition for USART_CR2 register *******************/ +#define USART_CR2_ADD ((uint16_t)0x000F) /*!< Address of the USART node */ +#define USART_CR2_LBDL ((uint16_t)0x0020) /*!< LIN Break Detection Length */ +#define USART_CR2_LBDIE ((uint16_t)0x0040) /*!< LIN Break Detection Interrupt Enable */ +#define USART_CR2_LBCL ((uint16_t)0x0100) /*!< Last Bit Clock pulse */ +#define USART_CR2_CPHA ((uint16_t)0x0200) /*!< Clock Phase */ +#define USART_CR2_CPOL ((uint16_t)0x0400) /*!< Clock Polarity */ +#define USART_CR2_CLKEN ((uint16_t)0x0800) /*!< Clock Enable */ + +#define USART_CR2_STOP ((uint16_t)0x3000) /*!< STOP[1:0] bits (STOP bits) */ +#define USART_CR2_STOP_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define USART_CR2_STOP_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define USART_CR2_LINEN ((uint16_t)0x4000) /*!< LIN mode enable */ + +/****************** Bit definition for USART_CR3 register *******************/ +#define USART_CR3_EIE ((uint16_t)0x0001) /*!< Error Interrupt Enable */ +#define USART_CR3_IREN ((uint16_t)0x0002) /*!< IrDA mode Enable */ +#define USART_CR3_IRLP ((uint16_t)0x0004) /*!< IrDA Low-Power */ +#define USART_CR3_HDSEL ((uint16_t)0x0008) /*!< Half-Duplex Selection */ +#define USART_CR3_NACK ((uint16_t)0x0010) /*!< Smartcard NACK enable */ +#define USART_CR3_SCEN ((uint16_t)0x0020) /*!< Smartcard mode enable */ +#define USART_CR3_DMAR ((uint16_t)0x0040) /*!< DMA Enable Receiver */ +#define USART_CR3_DMAT ((uint16_t)0x0080) /*!< DMA Enable Transmitter */ +#define USART_CR3_RTSE ((uint16_t)0x0100) /*!< RTS Enable */ +#define USART_CR3_CTSE ((uint16_t)0x0200) /*!< CTS Enable */ +#define USART_CR3_CTSIE ((uint16_t)0x0400) /*!< CTS Interrupt Enable */ +#define USART_CR3_ONEBIT ((uint16_t)0x0800) /*!< One Bit method */ + +/****************** Bit definition for USART_GTPR register ******************/ +#define USART_GTPR_PSC ((uint16_t)0x00FF) /*!< PSC[7:0] bits (Prescaler value) */ +#define USART_GTPR_PSC_0 ((uint16_t)0x0001) /*!< Bit 0 */ +#define USART_GTPR_PSC_1 ((uint16_t)0x0002) /*!< Bit 1 */ +#define USART_GTPR_PSC_2 ((uint16_t)0x0004) /*!< Bit 2 */ +#define USART_GTPR_PSC_3 ((uint16_t)0x0008) /*!< Bit 3 */ +#define USART_GTPR_PSC_4 ((uint16_t)0x0010) /*!< Bit 4 */ +#define USART_GTPR_PSC_5 ((uint16_t)0x0020) /*!< Bit 5 */ +#define USART_GTPR_PSC_6 ((uint16_t)0x0040) /*!< Bit 6 */ +#define USART_GTPR_PSC_7 ((uint16_t)0x0080) /*!< Bit 7 */ + +#define USART_GTPR_GT ((uint16_t)0xFF00) /*!< Guard time value */ + +/******************************************************************************/ +/* */ +/* Debug MCU */ +/* */ +/******************************************************************************/ + +/**************** Bit definition for DBGMCU_IDCODE register *****************/ +#define DBGMCU_IDCODE_DEV_ID ((uint32_t)0x00000FFF) /*!< Device Identifier */ + +#define DBGMCU_IDCODE_REV_ID ((uint32_t)0xFFFF0000) /*!< REV_ID[15:0] bits (Revision Identifier) */ +#define DBGMCU_IDCODE_REV_ID_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define DBGMCU_IDCODE_REV_ID_1 ((uint32_t)0x00020000) /*!< Bit 1 */ +#define DBGMCU_IDCODE_REV_ID_2 ((uint32_t)0x00040000) /*!< Bit 2 */ +#define DBGMCU_IDCODE_REV_ID_3 ((uint32_t)0x00080000) /*!< Bit 3 */ +#define DBGMCU_IDCODE_REV_ID_4 ((uint32_t)0x00100000) /*!< Bit 4 */ +#define DBGMCU_IDCODE_REV_ID_5 ((uint32_t)0x00200000) /*!< Bit 5 */ +#define DBGMCU_IDCODE_REV_ID_6 ((uint32_t)0x00400000) /*!< Bit 6 */ +#define DBGMCU_IDCODE_REV_ID_7 ((uint32_t)0x00800000) /*!< Bit 7 */ +#define DBGMCU_IDCODE_REV_ID_8 ((uint32_t)0x01000000) /*!< Bit 8 */ +#define DBGMCU_IDCODE_REV_ID_9 ((uint32_t)0x02000000) /*!< Bit 9 */ +#define DBGMCU_IDCODE_REV_ID_10 ((uint32_t)0x04000000) /*!< Bit 10 */ +#define DBGMCU_IDCODE_REV_ID_11 ((uint32_t)0x08000000) /*!< Bit 11 */ +#define DBGMCU_IDCODE_REV_ID_12 ((uint32_t)0x10000000) /*!< Bit 12 */ +#define DBGMCU_IDCODE_REV_ID_13 ((uint32_t)0x20000000) /*!< Bit 13 */ +#define DBGMCU_IDCODE_REV_ID_14 ((uint32_t)0x40000000) /*!< Bit 14 */ +#define DBGMCU_IDCODE_REV_ID_15 ((uint32_t)0x80000000) /*!< Bit 15 */ + +/****************** Bit definition for DBGMCU_CR register *******************/ +#define DBGMCU_CR_DBG_SLEEP ((uint32_t)0x00000001) /*!< Debug Sleep Mode */ +#define DBGMCU_CR_DBG_STOP ((uint32_t)0x00000002) /*!< Debug Stop Mode */ +#define DBGMCU_CR_DBG_STANDBY ((uint32_t)0x00000004) /*!< Debug Standby mode */ +#define DBGMCU_CR_TRACE_IOEN ((uint32_t)0x00000020) /*!< Trace Pin Assignment Control */ + +#define DBGMCU_CR_TRACE_MODE ((uint32_t)0x000000C0) /*!< TRACE_MODE[1:0] bits (Trace Pin Assignment Control) */ +#define DBGMCU_CR_TRACE_MODE_0 ((uint32_t)0x00000040) /*!< Bit 0 */ +#define DBGMCU_CR_TRACE_MODE_1 ((uint32_t)0x00000080) /*!< Bit 1 */ + +#define DBGMCU_CR_DBG_IWDG_STOP ((uint32_t)0x00000100) /*!< Debug Independent Watchdog stopped when Core is halted */ +#define DBGMCU_CR_DBG_WWDG_STOP ((uint32_t)0x00000200) /*!< Debug Window Watchdog stopped when Core is halted */ +#define DBGMCU_CR_DBG_TIM1_STOP ((uint32_t)0x00000400) /*!< TIM1 counter stopped when core is halted */ +#define DBGMCU_CR_DBG_TIM2_STOP ((uint32_t)0x00000800) /*!< TIM2 counter stopped when core is halted */ +#define DBGMCU_CR_DBG_TIM3_STOP ((uint32_t)0x00001000) /*!< TIM3 counter stopped when core is halted */ +#define DBGMCU_CR_DBG_TIM4_STOP ((uint32_t)0x00002000) /*!< TIM4 counter stopped when core is halted */ +#define DBGMCU_CR_DBG_CAN1_STOP ((uint32_t)0x00004000) /*!< Debug CAN1 stopped when Core is halted */ +#define DBGMCU_CR_DBG_I2C1_SMBUS_TIMEOUT ((uint32_t)0x00008000) /*!< SMBUS timeout mode stopped when Core is halted */ +#define DBGMCU_CR_DBG_I2C2_SMBUS_TIMEOUT ((uint32_t)0x00010000) /*!< SMBUS timeout mode stopped when Core is halted */ +#define DBGMCU_CR_DBG_TIM8_STOP ((uint32_t)0x00020000) /*!< TIM8 counter stopped when core is halted */ +#define DBGMCU_CR_DBG_TIM5_STOP ((uint32_t)0x00040000) /*!< TIM5 counter stopped when core is halted */ +#define DBGMCU_CR_DBG_TIM6_STOP ((uint32_t)0x00080000) /*!< TIM6 counter stopped when core is halted */ +#define DBGMCU_CR_DBG_TIM7_STOP ((uint32_t)0x00100000) /*!< TIM7 counter stopped when core is halted */ +#define DBGMCU_CR_DBG_CAN2_STOP ((uint32_t)0x00200000) /*!< Debug CAN2 stopped when Core is halted */ +#define DBGMCU_CR_DBG_TIM15_STOP ((uint32_t)0x00400000) /*!< Debug TIM15 stopped when Core is halted */ +#define DBGMCU_CR_DBG_TIM16_STOP ((uint32_t)0x00800000) /*!< Debug TIM16 stopped when Core is halted */ +#define DBGMCU_CR_DBG_TIM17_STOP ((uint32_t)0x01000000) /*!< Debug TIM17 stopped when Core is halted */ +#define DBGMCU_CR_DBG_TIM12_STOP ((uint32_t)0x02000000) /*!< Debug TIM12 stopped when Core is halted */ +#define DBGMCU_CR_DBG_TIM13_STOP ((uint32_t)0x04000000) /*!< Debug TIM13 stopped when Core is halted */ +#define DBGMCU_CR_DBG_TIM14_STOP ((uint32_t)0x08000000) /*!< Debug TIM14 stopped when Core is halted */ +#define DBGMCU_CR_DBG_TIM9_STOP ((uint32_t)0x10000000) /*!< Debug TIM9 stopped when Core is halted */ +#define DBGMCU_CR_DBG_TIM10_STOP ((uint32_t)0x20000000) /*!< Debug TIM10 stopped when Core is halted */ +#define DBGMCU_CR_DBG_TIM11_STOP ((uint32_t)0x40000000) /*!< Debug TIM11 stopped when Core is halted */ + +/******************************************************************************/ +/* */ +/* FLASH and Option Bytes Registers */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for FLASH_ACR register ******************/ +#define FLASH_ACR_LATENCY ((uint8_t)0x03) /*!< LATENCY[2:0] bits (Latency) */ +#define FLASH_ACR_LATENCY_0 ((uint8_t)0x00) /*!< Bit 0 */ +#define FLASH_ACR_LATENCY_1 ((uint8_t)0x01) /*!< Bit 0 */ +#define FLASH_ACR_LATENCY_2 ((uint8_t)0x02) /*!< Bit 1 */ + +#define FLASH_ACR_HLFCYA ((uint8_t)0x08) /*!< Flash Half Cycle Access Enable */ +#define FLASH_ACR_PRFTBE ((uint8_t)0x10) /*!< Prefetch Buffer Enable */ +#define FLASH_ACR_PRFTBS ((uint8_t)0x20) /*!< Prefetch Buffer Status */ + +/****************** Bit definition for FLASH_KEYR register ******************/ +#define FLASH_KEYR_FKEYR ((uint32_t)0xFFFFFFFF) /*!< FPEC Key */ + +/***************** Bit definition for FLASH_OPTKEYR register ****************/ +#define FLASH_OPTKEYR_OPTKEYR ((uint32_t)0xFFFFFFFF) /*!< Option Byte Key */ + +/****************** Bit definition for FLASH_SR register *******************/ +#define FLASH_SR_BSY ((uint8_t)0x01) /*!< Busy */ +#define FLASH_SR_PGERR ((uint8_t)0x04) /*!< Programming Error */ +#define FLASH_SR_WRPRTERR ((uint8_t)0x10) /*!< Write Protection Error */ +#define FLASH_SR_EOP ((uint8_t)0x20) /*!< End of operation */ + +/******************* Bit definition for FLASH_CR register *******************/ +#define FLASH_CR_PG ((uint16_t)0x0001) /*!< Programming */ +#define FLASH_CR_PER ((uint16_t)0x0002) /*!< Page Erase */ +#define FLASH_CR_MER ((uint16_t)0x0004) /*!< Mass Erase */ +#define FLASH_CR_OPTPG ((uint16_t)0x0010) /*!< Option Byte Programming */ +#define FLASH_CR_OPTER ((uint16_t)0x0020) /*!< Option Byte Erase */ +#define FLASH_CR_STRT ((uint16_t)0x0040) /*!< Start */ +#define FLASH_CR_LOCK ((uint16_t)0x0080) /*!< Lock */ +#define FLASH_CR_OPTWRE ((uint16_t)0x0200) /*!< Option Bytes Write Enable */ +#define FLASH_CR_ERRIE ((uint16_t)0x0400) /*!< Error Interrupt Enable */ +#define FLASH_CR_EOPIE ((uint16_t)0x1000) /*!< End of operation interrupt enable */ + +/******************* Bit definition for FLASH_AR register *******************/ +#define FLASH_AR_FAR ((uint32_t)0xFFFFFFFF) /*!< Flash Address */ + +/****************** Bit definition for FLASH_OBR register *******************/ +#define FLASH_OBR_OPTERR ((uint16_t)0x0001) /*!< Option Byte Error */ +#define FLASH_OBR_RDPRT ((uint16_t)0x0002) /*!< Read protection */ + +#define FLASH_OBR_USER ((uint16_t)0x03FC) /*!< User Option Bytes */ +#define FLASH_OBR_WDG_SW ((uint16_t)0x0004) /*!< WDG_SW */ +#define FLASH_OBR_nRST_STOP ((uint16_t)0x0008) /*!< nRST_STOP */ +#define FLASH_OBR_nRST_STDBY ((uint16_t)0x0010) /*!< nRST_STDBY */ +#define FLASH_OBR_BFB2 ((uint16_t)0x0020) /*!< BFB2 */ + +/****************** Bit definition for FLASH_WRPR register ******************/ +#define FLASH_WRPR_WRP ((uint32_t)0xFFFFFFFF) /*!< Write Protect */ + +/*----------------------------------------------------------------------------*/ + +/****************** Bit definition for FLASH_RDP register *******************/ +#define FLASH_RDP_RDP ((uint32_t)0x000000FF) /*!< Read protection option byte */ +#define FLASH_RDP_nRDP ((uint32_t)0x0000FF00) /*!< Read protection complemented option byte */ + +/****************** Bit definition for FLASH_USER register ******************/ +#define FLASH_USER_USER ((uint32_t)0x00FF0000) /*!< User option byte */ +#define FLASH_USER_nUSER ((uint32_t)0xFF000000) /*!< User complemented option byte */ + +/****************** Bit definition for FLASH_Data0 register *****************/ +#define FLASH_Data0_Data0 ((uint32_t)0x000000FF) /*!< User data storage option byte */ +#define FLASH_Data0_nData0 ((uint32_t)0x0000FF00) /*!< User data storage complemented option byte */ + +/****************** Bit definition for FLASH_Data1 register *****************/ +#define FLASH_Data1_Data1 ((uint32_t)0x00FF0000) /*!< User data storage option byte */ +#define FLASH_Data1_nData1 ((uint32_t)0xFF000000) /*!< User data storage complemented option byte */ + +/****************** Bit definition for FLASH_WRP0 register ******************/ +#define FLASH_WRP0_WRP0 ((uint32_t)0x000000FF) /*!< Flash memory write protection option bytes */ +#define FLASH_WRP0_nWRP0 ((uint32_t)0x0000FF00) /*!< Flash memory write protection complemented option bytes */ + +/****************** Bit definition for FLASH_WRP1 register ******************/ +#define FLASH_WRP1_WRP1 ((uint32_t)0x00FF0000) /*!< Flash memory write protection option bytes */ +#define FLASH_WRP1_nWRP1 ((uint32_t)0xFF000000) /*!< Flash memory write protection complemented option bytes */ + +/****************** Bit definition for FLASH_WRP2 register ******************/ +#define FLASH_WRP2_WRP2 ((uint32_t)0x000000FF) /*!< Flash memory write protection option bytes */ +#define FLASH_WRP2_nWRP2 ((uint32_t)0x0000FF00) /*!< Flash memory write protection complemented option bytes */ + +/****************** Bit definition for FLASH_WRP3 register ******************/ +#define FLASH_WRP3_WRP3 ((uint32_t)0x00FF0000) /*!< Flash memory write protection option bytes */ +#define FLASH_WRP3_nWRP3 ((uint32_t)0xFF000000) /*!< Flash memory write protection complemented option bytes */ + +#ifdef STM32F10X_CL +/******************************************************************************/ +/* Ethernet MAC Registers bits definitions */ +/******************************************************************************/ +/* Bit definition for Ethernet MAC Control Register register */ +#define ETH_MACCR_WD ((uint32_t)0x00800000) /* Watchdog disable */ +#define ETH_MACCR_JD ((uint32_t)0x00400000) /* Jabber disable */ +#define ETH_MACCR_IFG ((uint32_t)0x000E0000) /* Inter-frame gap */ + #define ETH_MACCR_IFG_96Bit ((uint32_t)0x00000000) /* Minimum IFG between frames during transmission is 96Bit */ + #define ETH_MACCR_IFG_88Bit ((uint32_t)0x00020000) /* Minimum IFG between frames during transmission is 88Bit */ + #define ETH_MACCR_IFG_80Bit ((uint32_t)0x00040000) /* Minimum IFG between frames during transmission is 80Bit */ + #define ETH_MACCR_IFG_72Bit ((uint32_t)0x00060000) /* Minimum IFG between frames during transmission is 72Bit */ + #define ETH_MACCR_IFG_64Bit ((uint32_t)0x00080000) /* Minimum IFG between frames during transmission is 64Bit */ + #define ETH_MACCR_IFG_56Bit ((uint32_t)0x000A0000) /* Minimum IFG between frames during transmission is 56Bit */ + #define ETH_MACCR_IFG_48Bit ((uint32_t)0x000C0000) /* Minimum IFG between frames during transmission is 48Bit */ + #define ETH_MACCR_IFG_40Bit ((uint32_t)0x000E0000) /* Minimum IFG between frames during transmission is 40Bit */ +#define ETH_MACCR_CSD ((uint32_t)0x00010000) /* Carrier sense disable (during transmission) */ +#define ETH_MACCR_FES ((uint32_t)0x00004000) /* Fast ethernet speed */ +#define ETH_MACCR_ROD ((uint32_t)0x00002000) /* Receive own disable */ +#define ETH_MACCR_LM ((uint32_t)0x00001000) /* loopback mode */ +#define ETH_MACCR_DM ((uint32_t)0x00000800) /* Duplex mode */ +#define ETH_MACCR_IPCO ((uint32_t)0x00000400) /* IP Checksum offload */ +#define ETH_MACCR_RD ((uint32_t)0x00000200) /* Retry disable */ +#define ETH_MACCR_APCS ((uint32_t)0x00000080) /* Automatic Pad/CRC stripping */ +#define ETH_MACCR_BL ((uint32_t)0x00000060) /* Back-off limit: random integer number (r) of slot time delays before rescheduling + a transmission attempt during retries after a collision: 0 =< r <2^k */ + #define ETH_MACCR_BL_10 ((uint32_t)0x00000000) /* k = min (n, 10) */ + #define ETH_MACCR_BL_8 ((uint32_t)0x00000020) /* k = min (n, 8) */ + #define ETH_MACCR_BL_4 ((uint32_t)0x00000040) /* k = min (n, 4) */ + #define ETH_MACCR_BL_1 ((uint32_t)0x00000060) /* k = min (n, 1) */ +#define ETH_MACCR_DC ((uint32_t)0x00000010) /* Defferal check */ +#define ETH_MACCR_TE ((uint32_t)0x00000008) /* Transmitter enable */ +#define ETH_MACCR_RE ((uint32_t)0x00000004) /* Receiver enable */ + +/* Bit definition for Ethernet MAC Frame Filter Register */ +#define ETH_MACFFR_RA ((uint32_t)0x80000000) /* Receive all */ +#define ETH_MACFFR_HPF ((uint32_t)0x00000400) /* Hash or perfect filter */ +#define ETH_MACFFR_SAF ((uint32_t)0x00000200) /* Source address filter enable */ +#define ETH_MACFFR_SAIF ((uint32_t)0x00000100) /* SA inverse filtering */ +#define ETH_MACFFR_PCF ((uint32_t)0x000000C0) /* Pass control frames: 3 cases */ + #define ETH_MACFFR_PCF_BlockAll ((uint32_t)0x00000040) /* MAC filters all control frames from reaching the application */ + #define ETH_MACFFR_PCF_ForwardAll ((uint32_t)0x00000080) /* MAC forwards all control frames to application even if they fail the Address Filter */ + #define ETH_MACFFR_PCF_ForwardPassedAddrFilter ((uint32_t)0x000000C0) /* MAC forwards control frames that pass the Address Filter. */ +#define ETH_MACFFR_BFD ((uint32_t)0x00000020) /* Broadcast frame disable */ +#define ETH_MACFFR_PAM ((uint32_t)0x00000010) /* Pass all mutlicast */ +#define ETH_MACFFR_DAIF ((uint32_t)0x00000008) /* DA Inverse filtering */ +#define ETH_MACFFR_HM ((uint32_t)0x00000004) /* Hash multicast */ +#define ETH_MACFFR_HU ((uint32_t)0x00000002) /* Hash unicast */ +#define ETH_MACFFR_PM ((uint32_t)0x00000001) /* Promiscuous mode */ + +/* Bit definition for Ethernet MAC Hash Table High Register */ +#define ETH_MACHTHR_HTH ((uint32_t)0xFFFFFFFF) /* Hash table high */ + +/* Bit definition for Ethernet MAC Hash Table Low Register */ +#define ETH_MACHTLR_HTL ((uint32_t)0xFFFFFFFF) /* Hash table low */ + +/* Bit definition for Ethernet MAC MII Address Register */ +#define ETH_MACMIIAR_PA ((uint32_t)0x0000F800) /* Physical layer address */ +#define ETH_MACMIIAR_MR ((uint32_t)0x000007C0) /* MII register in the selected PHY */ +#define ETH_MACMIIAR_CR ((uint32_t)0x0000001C) /* CR clock range: 6 cases */ + #define ETH_MACMIIAR_CR_Div42 ((uint32_t)0x00000000) /* HCLK:60-72 MHz; MDC clock= HCLK/42 */ + #define ETH_MACMIIAR_CR_Div16 ((uint32_t)0x00000008) /* HCLK:20-35 MHz; MDC clock= HCLK/16 */ + #define ETH_MACMIIAR_CR_Div26 ((uint32_t)0x0000000C) /* HCLK:35-60 MHz; MDC clock= HCLK/26 */ +#define ETH_MACMIIAR_MW ((uint32_t)0x00000002) /* MII write */ +#define ETH_MACMIIAR_MB ((uint32_t)0x00000001) /* MII busy */ + +/* Bit definition for Ethernet MAC MII Data Register */ +#define ETH_MACMIIDR_MD ((uint32_t)0x0000FFFF) /* MII data: read/write data from/to PHY */ + +/* Bit definition for Ethernet MAC Flow Control Register */ +#define ETH_MACFCR_PT ((uint32_t)0xFFFF0000) /* Pause time */ +#define ETH_MACFCR_ZQPD ((uint32_t)0x00000080) /* Zero-quanta pause disable */ +#define ETH_MACFCR_PLT ((uint32_t)0x00000030) /* Pause low threshold: 4 cases */ + #define ETH_MACFCR_PLT_Minus4 ((uint32_t)0x00000000) /* Pause time minus 4 slot times */ + #define ETH_MACFCR_PLT_Minus28 ((uint32_t)0x00000010) /* Pause time minus 28 slot times */ + #define ETH_MACFCR_PLT_Minus144 ((uint32_t)0x00000020) /* Pause time minus 144 slot times */ + #define ETH_MACFCR_PLT_Minus256 ((uint32_t)0x00000030) /* Pause time minus 256 slot times */ +#define ETH_MACFCR_UPFD ((uint32_t)0x00000008) /* Unicast pause frame detect */ +#define ETH_MACFCR_RFCE ((uint32_t)0x00000004) /* Receive flow control enable */ +#define ETH_MACFCR_TFCE ((uint32_t)0x00000002) /* Transmit flow control enable */ +#define ETH_MACFCR_FCBBPA ((uint32_t)0x00000001) /* Flow control busy/backpressure activate */ + +/* Bit definition for Ethernet MAC VLAN Tag Register */ +#define ETH_MACVLANTR_VLANTC ((uint32_t)0x00010000) /* 12-bit VLAN tag comparison */ +#define ETH_MACVLANTR_VLANTI ((uint32_t)0x0000FFFF) /* VLAN tag identifier (for receive frames) */ + +/* Bit definition for Ethernet MAC Remote Wake-UpFrame Filter Register */ +#define ETH_MACRWUFFR_D ((uint32_t)0xFFFFFFFF) /* Wake-up frame filter register data */ +/* Eight sequential Writes to this address (offset 0x28) will write all Wake-UpFrame Filter Registers. + Eight sequential Reads from this address (offset 0x28) will read all Wake-UpFrame Filter Registers. */ +/* Wake-UpFrame Filter Reg0 : Filter 0 Byte Mask + Wake-UpFrame Filter Reg1 : Filter 1 Byte Mask + Wake-UpFrame Filter Reg2 : Filter 2 Byte Mask + Wake-UpFrame Filter Reg3 : Filter 3 Byte Mask + Wake-UpFrame Filter Reg4 : RSVD - Filter3 Command - RSVD - Filter2 Command - + RSVD - Filter1 Command - RSVD - Filter0 Command + Wake-UpFrame Filter Re5 : Filter3 Offset - Filter2 Offset - Filter1 Offset - Filter0 Offset + Wake-UpFrame Filter Re6 : Filter1 CRC16 - Filter0 CRC16 + Wake-UpFrame Filter Re7 : Filter3 CRC16 - Filter2 CRC16 */ + +/* Bit definition for Ethernet MAC PMT Control and Status Register */ +#define ETH_MACPMTCSR_WFFRPR ((uint32_t)0x80000000) /* Wake-Up Frame Filter Register Pointer Reset */ +#define ETH_MACPMTCSR_GU ((uint32_t)0x00000200) /* Global Unicast */ +#define ETH_MACPMTCSR_WFR ((uint32_t)0x00000040) /* Wake-Up Frame Received */ +#define ETH_MACPMTCSR_MPR ((uint32_t)0x00000020) /* Magic Packet Received */ +#define ETH_MACPMTCSR_WFE ((uint32_t)0x00000004) /* Wake-Up Frame Enable */ +#define ETH_MACPMTCSR_MPE ((uint32_t)0x00000002) /* Magic Packet Enable */ +#define ETH_MACPMTCSR_PD ((uint32_t)0x00000001) /* Power Down */ + +/* Bit definition for Ethernet MAC Status Register */ +#define ETH_MACSR_TSTS ((uint32_t)0x00000200) /* Time stamp trigger status */ +#define ETH_MACSR_MMCTS ((uint32_t)0x00000040) /* MMC transmit status */ +#define ETH_MACSR_MMMCRS ((uint32_t)0x00000020) /* MMC receive status */ +#define ETH_MACSR_MMCS ((uint32_t)0x00000010) /* MMC status */ +#define ETH_MACSR_PMTS ((uint32_t)0x00000008) /* PMT status */ + +/* Bit definition for Ethernet MAC Interrupt Mask Register */ +#define ETH_MACIMR_TSTIM ((uint32_t)0x00000200) /* Time stamp trigger interrupt mask */ +#define ETH_MACIMR_PMTIM ((uint32_t)0x00000008) /* PMT interrupt mask */ + +/* Bit definition for Ethernet MAC Address0 High Register */ +#define ETH_MACA0HR_MACA0H ((uint32_t)0x0000FFFF) /* MAC address0 high */ + +/* Bit definition for Ethernet MAC Address0 Low Register */ +#define ETH_MACA0LR_MACA0L ((uint32_t)0xFFFFFFFF) /* MAC address0 low */ + +/* Bit definition for Ethernet MAC Address1 High Register */ +#define ETH_MACA1HR_AE ((uint32_t)0x80000000) /* Address enable */ +#define ETH_MACA1HR_SA ((uint32_t)0x40000000) /* Source address */ +#define ETH_MACA1HR_MBC ((uint32_t)0x3F000000) /* Mask byte control: bits to mask for comparison of the MAC Address bytes */ + #define ETH_MACA1HR_MBC_HBits15_8 ((uint32_t)0x20000000) /* Mask MAC Address high reg bits [15:8] */ + #define ETH_MACA1HR_MBC_HBits7_0 ((uint32_t)0x10000000) /* Mask MAC Address high reg bits [7:0] */ + #define ETH_MACA1HR_MBC_LBits31_24 ((uint32_t)0x08000000) /* Mask MAC Address low reg bits [31:24] */ + #define ETH_MACA1HR_MBC_LBits23_16 ((uint32_t)0x04000000) /* Mask MAC Address low reg bits [23:16] */ + #define ETH_MACA1HR_MBC_LBits15_8 ((uint32_t)0x02000000) /* Mask MAC Address low reg bits [15:8] */ + #define ETH_MACA1HR_MBC_LBits7_0 ((uint32_t)0x01000000) /* Mask MAC Address low reg bits [7:0] */ +#define ETH_MACA1HR_MACA1H ((uint32_t)0x0000FFFF) /* MAC address1 high */ + +/* Bit definition for Ethernet MAC Address1 Low Register */ +#define ETH_MACA1LR_MACA1L ((uint32_t)0xFFFFFFFF) /* MAC address1 low */ + +/* Bit definition for Ethernet MAC Address2 High Register */ +#define ETH_MACA2HR_AE ((uint32_t)0x80000000) /* Address enable */ +#define ETH_MACA2HR_SA ((uint32_t)0x40000000) /* Source address */ +#define ETH_MACA2HR_MBC ((uint32_t)0x3F000000) /* Mask byte control */ + #define ETH_MACA2HR_MBC_HBits15_8 ((uint32_t)0x20000000) /* Mask MAC Address high reg bits [15:8] */ + #define ETH_MACA2HR_MBC_HBits7_0 ((uint32_t)0x10000000) /* Mask MAC Address high reg bits [7:0] */ + #define ETH_MACA2HR_MBC_LBits31_24 ((uint32_t)0x08000000) /* Mask MAC Address low reg bits [31:24] */ + #define ETH_MACA2HR_MBC_LBits23_16 ((uint32_t)0x04000000) /* Mask MAC Address low reg bits [23:16] */ + #define ETH_MACA2HR_MBC_LBits15_8 ((uint32_t)0x02000000) /* Mask MAC Address low reg bits [15:8] */ + #define ETH_MACA2HR_MBC_LBits7_0 ((uint32_t)0x01000000) /* Mask MAC Address low reg bits [70] */ +#define ETH_MACA2HR_MACA2H ((uint32_t)0x0000FFFF) /* MAC address1 high */ + +/* Bit definition for Ethernet MAC Address2 Low Register */ +#define ETH_MACA2LR_MACA2L ((uint32_t)0xFFFFFFFF) /* MAC address2 low */ + +/* Bit definition for Ethernet MAC Address3 High Register */ +#define ETH_MACA3HR_AE ((uint32_t)0x80000000) /* Address enable */ +#define ETH_MACA3HR_SA ((uint32_t)0x40000000) /* Source address */ +#define ETH_MACA3HR_MBC ((uint32_t)0x3F000000) /* Mask byte control */ + #define ETH_MACA3HR_MBC_HBits15_8 ((uint32_t)0x20000000) /* Mask MAC Address high reg bits [15:8] */ + #define ETH_MACA3HR_MBC_HBits7_0 ((uint32_t)0x10000000) /* Mask MAC Address high reg bits [7:0] */ + #define ETH_MACA3HR_MBC_LBits31_24 ((uint32_t)0x08000000) /* Mask MAC Address low reg bits [31:24] */ + #define ETH_MACA3HR_MBC_LBits23_16 ((uint32_t)0x04000000) /* Mask MAC Address low reg bits [23:16] */ + #define ETH_MACA3HR_MBC_LBits15_8 ((uint32_t)0x02000000) /* Mask MAC Address low reg bits [15:8] */ + #define ETH_MACA3HR_MBC_LBits7_0 ((uint32_t)0x01000000) /* Mask MAC Address low reg bits [70] */ +#define ETH_MACA3HR_MACA3H ((uint32_t)0x0000FFFF) /* MAC address3 high */ + +/* Bit definition for Ethernet MAC Address3 Low Register */ +#define ETH_MACA3LR_MACA3L ((uint32_t)0xFFFFFFFF) /* MAC address3 low */ + +/******************************************************************************/ +/* Ethernet MMC Registers bits definition */ +/******************************************************************************/ + +/* Bit definition for Ethernet MMC Contol Register */ +#define ETH_MMCCR_MCF ((uint32_t)0x00000008) /* MMC Counter Freeze */ +#define ETH_MMCCR_ROR ((uint32_t)0x00000004) /* Reset on Read */ +#define ETH_MMCCR_CSR ((uint32_t)0x00000002) /* Counter Stop Rollover */ +#define ETH_MMCCR_CR ((uint32_t)0x00000001) /* Counters Reset */ + +/* Bit definition for Ethernet MMC Receive Interrupt Register */ +#define ETH_MMCRIR_RGUFS ((uint32_t)0x00020000) /* Set when Rx good unicast frames counter reaches half the maximum value */ +#define ETH_MMCRIR_RFAES ((uint32_t)0x00000040) /* Set when Rx alignment error counter reaches half the maximum value */ +#define ETH_MMCRIR_RFCES ((uint32_t)0x00000020) /* Set when Rx crc error counter reaches half the maximum value */ + +/* Bit definition for Ethernet MMC Transmit Interrupt Register */ +#define ETH_MMCTIR_TGFS ((uint32_t)0x00200000) /* Set when Tx good frame count counter reaches half the maximum value */ +#define ETH_MMCTIR_TGFMSCS ((uint32_t)0x00008000) /* Set when Tx good multi col counter reaches half the maximum value */ +#define ETH_MMCTIR_TGFSCS ((uint32_t)0x00004000) /* Set when Tx good single col counter reaches half the maximum value */ + +/* Bit definition for Ethernet MMC Receive Interrupt Mask Register */ +#define ETH_MMCRIMR_RGUFM ((uint32_t)0x00020000) /* Mask the interrupt when Rx good unicast frames counter reaches half the maximum value */ +#define ETH_MMCRIMR_RFAEM ((uint32_t)0x00000040) /* Mask the interrupt when when Rx alignment error counter reaches half the maximum value */ +#define ETH_MMCRIMR_RFCEM ((uint32_t)0x00000020) /* Mask the interrupt when Rx crc error counter reaches half the maximum value */ + +/* Bit definition for Ethernet MMC Transmit Interrupt Mask Register */ +#define ETH_MMCTIMR_TGFM ((uint32_t)0x00200000) /* Mask the interrupt when Tx good frame count counter reaches half the maximum value */ +#define ETH_MMCTIMR_TGFMSCM ((uint32_t)0x00008000) /* Mask the interrupt when Tx good multi col counter reaches half the maximum value */ +#define ETH_MMCTIMR_TGFSCM ((uint32_t)0x00004000) /* Mask the interrupt when Tx good single col counter reaches half the maximum value */ + +/* Bit definition for Ethernet MMC Transmitted Good Frames after Single Collision Counter Register */ +#define ETH_MMCTGFSCCR_TGFSCC ((uint32_t)0xFFFFFFFF) /* Number of successfully transmitted frames after a single collision in Half-duplex mode. */ + +/* Bit definition for Ethernet MMC Transmitted Good Frames after More than a Single Collision Counter Register */ +#define ETH_MMCTGFMSCCR_TGFMSCC ((uint32_t)0xFFFFFFFF) /* Number of successfully transmitted frames after more than a single collision in Half-duplex mode. */ + +/* Bit definition for Ethernet MMC Transmitted Good Frames Counter Register */ +#define ETH_MMCTGFCR_TGFC ((uint32_t)0xFFFFFFFF) /* Number of good frames transmitted. */ + +/* Bit definition for Ethernet MMC Received Frames with CRC Error Counter Register */ +#define ETH_MMCRFCECR_RFCEC ((uint32_t)0xFFFFFFFF) /* Number of frames received with CRC error. */ + +/* Bit definition for Ethernet MMC Received Frames with Alignement Error Counter Register */ +#define ETH_MMCRFAECR_RFAEC ((uint32_t)0xFFFFFFFF) /* Number of frames received with alignment (dribble) error */ + +/* Bit definition for Ethernet MMC Received Good Unicast Frames Counter Register */ +#define ETH_MMCRGUFCR_RGUFC ((uint32_t)0xFFFFFFFF) /* Number of good unicast frames received. */ + +/******************************************************************************/ +/* Ethernet PTP Registers bits definition */ +/******************************************************************************/ + +/* Bit definition for Ethernet PTP Time Stamp Contol Register */ +#define ETH_PTPTSCR_TSARU ((uint32_t)0x00000020) /* Addend register update */ +#define ETH_PTPTSCR_TSITE ((uint32_t)0x00000010) /* Time stamp interrupt trigger enable */ +#define ETH_PTPTSCR_TSSTU ((uint32_t)0x00000008) /* Time stamp update */ +#define ETH_PTPTSCR_TSSTI ((uint32_t)0x00000004) /* Time stamp initialize */ +#define ETH_PTPTSCR_TSFCU ((uint32_t)0x00000002) /* Time stamp fine or coarse update */ +#define ETH_PTPTSCR_TSE ((uint32_t)0x00000001) /* Time stamp enable */ + +/* Bit definition for Ethernet PTP Sub-Second Increment Register */ +#define ETH_PTPSSIR_STSSI ((uint32_t)0x000000FF) /* System time Sub-second increment value */ + +/* Bit definition for Ethernet PTP Time Stamp High Register */ +#define ETH_PTPTSHR_STS ((uint32_t)0xFFFFFFFF) /* System Time second */ + +/* Bit definition for Ethernet PTP Time Stamp Low Register */ +#define ETH_PTPTSLR_STPNS ((uint32_t)0x80000000) /* System Time Positive or negative time */ +#define ETH_PTPTSLR_STSS ((uint32_t)0x7FFFFFFF) /* System Time sub-seconds */ + +/* Bit definition for Ethernet PTP Time Stamp High Update Register */ +#define ETH_PTPTSHUR_TSUS ((uint32_t)0xFFFFFFFF) /* Time stamp update seconds */ + +/* Bit definition for Ethernet PTP Time Stamp Low Update Register */ +#define ETH_PTPTSLUR_TSUPNS ((uint32_t)0x80000000) /* Time stamp update Positive or negative time */ +#define ETH_PTPTSLUR_TSUSS ((uint32_t)0x7FFFFFFF) /* Time stamp update sub-seconds */ + +/* Bit definition for Ethernet PTP Time Stamp Addend Register */ +#define ETH_PTPTSAR_TSA ((uint32_t)0xFFFFFFFF) /* Time stamp addend */ + +/* Bit definition for Ethernet PTP Target Time High Register */ +#define ETH_PTPTTHR_TTSH ((uint32_t)0xFFFFFFFF) /* Target time stamp high */ + +/* Bit definition for Ethernet PTP Target Time Low Register */ +#define ETH_PTPTTLR_TTSL ((uint32_t)0xFFFFFFFF) /* Target time stamp low */ + +/******************************************************************************/ +/* Ethernet DMA Registers bits definition */ +/******************************************************************************/ + +/* Bit definition for Ethernet DMA Bus Mode Register */ +#define ETH_DMABMR_AAB ((uint32_t)0x02000000) /* Address-Aligned beats */ +#define ETH_DMABMR_FPM ((uint32_t)0x01000000) /* 4xPBL mode */ +#define ETH_DMABMR_USP ((uint32_t)0x00800000) /* Use separate PBL */ +#define ETH_DMABMR_RDP ((uint32_t)0x007E0000) /* RxDMA PBL */ + #define ETH_DMABMR_RDP_1Beat ((uint32_t)0x00020000) /* maximum number of beats to be transferred in one RxDMA transaction is 1 */ + #define ETH_DMABMR_RDP_2Beat ((uint32_t)0x00040000) /* maximum number of beats to be transferred in one RxDMA transaction is 2 */ + #define ETH_DMABMR_RDP_4Beat ((uint32_t)0x00080000) /* maximum number of beats to be transferred in one RxDMA transaction is 4 */ + #define ETH_DMABMR_RDP_8Beat ((uint32_t)0x00100000) /* maximum number of beats to be transferred in one RxDMA transaction is 8 */ + #define ETH_DMABMR_RDP_16Beat ((uint32_t)0x00200000) /* maximum number of beats to be transferred in one RxDMA transaction is 16 */ + #define ETH_DMABMR_RDP_32Beat ((uint32_t)0x00400000) /* maximum number of beats to be transferred in one RxDMA transaction is 32 */ + #define ETH_DMABMR_RDP_4xPBL_4Beat ((uint32_t)0x01020000) /* maximum number of beats to be transferred in one RxDMA transaction is 4 */ + #define ETH_DMABMR_RDP_4xPBL_8Beat ((uint32_t)0x01040000) /* maximum number of beats to be transferred in one RxDMA transaction is 8 */ + #define ETH_DMABMR_RDP_4xPBL_16Beat ((uint32_t)0x01080000) /* maximum number of beats to be transferred in one RxDMA transaction is 16 */ + #define ETH_DMABMR_RDP_4xPBL_32Beat ((uint32_t)0x01100000) /* maximum number of beats to be transferred in one RxDMA transaction is 32 */ + #define ETH_DMABMR_RDP_4xPBL_64Beat ((uint32_t)0x01200000) /* maximum number of beats to be transferred in one RxDMA transaction is 64 */ + #define ETH_DMABMR_RDP_4xPBL_128Beat ((uint32_t)0x01400000) /* maximum number of beats to be transferred in one RxDMA transaction is 128 */ +#define ETH_DMABMR_FB ((uint32_t)0x00010000) /* Fixed Burst */ +#define ETH_DMABMR_RTPR ((uint32_t)0x0000C000) /* Rx Tx priority ratio */ + #define ETH_DMABMR_RTPR_1_1 ((uint32_t)0x00000000) /* Rx Tx priority ratio */ + #define ETH_DMABMR_RTPR_2_1 ((uint32_t)0x00004000) /* Rx Tx priority ratio */ + #define ETH_DMABMR_RTPR_3_1 ((uint32_t)0x00008000) /* Rx Tx priority ratio */ + #define ETH_DMABMR_RTPR_4_1 ((uint32_t)0x0000C000) /* Rx Tx priority ratio */ +#define ETH_DMABMR_PBL ((uint32_t)0x00003F00) /* Programmable burst length */ + #define ETH_DMABMR_PBL_1Beat ((uint32_t)0x00000100) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 1 */ + #define ETH_DMABMR_PBL_2Beat ((uint32_t)0x00000200) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 2 */ + #define ETH_DMABMR_PBL_4Beat ((uint32_t)0x00000400) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 4 */ + #define ETH_DMABMR_PBL_8Beat ((uint32_t)0x00000800) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 8 */ + #define ETH_DMABMR_PBL_16Beat ((uint32_t)0x00001000) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 16 */ + #define ETH_DMABMR_PBL_32Beat ((uint32_t)0x00002000) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 32 */ + #define ETH_DMABMR_PBL_4xPBL_4Beat ((uint32_t)0x01000100) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 4 */ + #define ETH_DMABMR_PBL_4xPBL_8Beat ((uint32_t)0x01000200) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 8 */ + #define ETH_DMABMR_PBL_4xPBL_16Beat ((uint32_t)0x01000400) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 16 */ + #define ETH_DMABMR_PBL_4xPBL_32Beat ((uint32_t)0x01000800) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 32 */ + #define ETH_DMABMR_PBL_4xPBL_64Beat ((uint32_t)0x01001000) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 64 */ + #define ETH_DMABMR_PBL_4xPBL_128Beat ((uint32_t)0x01002000) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 128 */ +#define ETH_DMABMR_DSL ((uint32_t)0x0000007C) /* Descriptor Skip Length */ +#define ETH_DMABMR_DA ((uint32_t)0x00000002) /* DMA arbitration scheme */ +#define ETH_DMABMR_SR ((uint32_t)0x00000001) /* Software reset */ + +/* Bit definition for Ethernet DMA Transmit Poll Demand Register */ +#define ETH_DMATPDR_TPD ((uint32_t)0xFFFFFFFF) /* Transmit poll demand */ + +/* Bit definition for Ethernet DMA Receive Poll Demand Register */ +#define ETH_DMARPDR_RPD ((uint32_t)0xFFFFFFFF) /* Receive poll demand */ + +/* Bit definition for Ethernet DMA Receive Descriptor List Address Register */ +#define ETH_DMARDLAR_SRL ((uint32_t)0xFFFFFFFF) /* Start of receive list */ + +/* Bit definition for Ethernet DMA Transmit Descriptor List Address Register */ +#define ETH_DMATDLAR_STL ((uint32_t)0xFFFFFFFF) /* Start of transmit list */ + +/* Bit definition for Ethernet DMA Status Register */ +#define ETH_DMASR_TSTS ((uint32_t)0x20000000) /* Time-stamp trigger status */ +#define ETH_DMASR_PMTS ((uint32_t)0x10000000) /* PMT status */ +#define ETH_DMASR_MMCS ((uint32_t)0x08000000) /* MMC status */ +#define ETH_DMASR_EBS ((uint32_t)0x03800000) /* Error bits status */ + /* combination with EBS[2:0] for GetFlagStatus function */ + #define ETH_DMASR_EBS_DescAccess ((uint32_t)0x02000000) /* Error bits 0-data buffer, 1-desc. access */ + #define ETH_DMASR_EBS_ReadTransf ((uint32_t)0x01000000) /* Error bits 0-write trnsf, 1-read transfr */ + #define ETH_DMASR_EBS_DataTransfTx ((uint32_t)0x00800000) /* Error bits 0-Rx DMA, 1-Tx DMA */ +#define ETH_DMASR_TPS ((uint32_t)0x00700000) /* Transmit process state */ + #define ETH_DMASR_TPS_Stopped ((uint32_t)0x00000000) /* Stopped - Reset or Stop Tx Command issued */ + #define ETH_DMASR_TPS_Fetching ((uint32_t)0x00100000) /* Running - fetching the Tx descriptor */ + #define ETH_DMASR_TPS_Waiting ((uint32_t)0x00200000) /* Running - waiting for status */ + #define ETH_DMASR_TPS_Reading ((uint32_t)0x00300000) /* Running - reading the data from host memory */ + #define ETH_DMASR_TPS_Suspended ((uint32_t)0x00600000) /* Suspended - Tx Descriptor unavailabe */ + #define ETH_DMASR_TPS_Closing ((uint32_t)0x00700000) /* Running - closing Rx descriptor */ +#define ETH_DMASR_RPS ((uint32_t)0x000E0000) /* Receive process state */ + #define ETH_DMASR_RPS_Stopped ((uint32_t)0x00000000) /* Stopped - Reset or Stop Rx Command issued */ + #define ETH_DMASR_RPS_Fetching ((uint32_t)0x00020000) /* Running - fetching the Rx descriptor */ + #define ETH_DMASR_RPS_Waiting ((uint32_t)0x00060000) /* Running - waiting for packet */ + #define ETH_DMASR_RPS_Suspended ((uint32_t)0x00080000) /* Suspended - Rx Descriptor unavailable */ + #define ETH_DMASR_RPS_Closing ((uint32_t)0x000A0000) /* Running - closing descriptor */ + #define ETH_DMASR_RPS_Queuing ((uint32_t)0x000E0000) /* Running - queuing the recieve frame into host memory */ +#define ETH_DMASR_NIS ((uint32_t)0x00010000) /* Normal interrupt summary */ +#define ETH_DMASR_AIS ((uint32_t)0x00008000) /* Abnormal interrupt summary */ +#define ETH_DMASR_ERS ((uint32_t)0x00004000) /* Early receive status */ +#define ETH_DMASR_FBES ((uint32_t)0x00002000) /* Fatal bus error status */ +#define ETH_DMASR_ETS ((uint32_t)0x00000400) /* Early transmit status */ +#define ETH_DMASR_RWTS ((uint32_t)0x00000200) /* Receive watchdog timeout status */ +#define ETH_DMASR_RPSS ((uint32_t)0x00000100) /* Receive process stopped status */ +#define ETH_DMASR_RBUS ((uint32_t)0x00000080) /* Receive buffer unavailable status */ +#define ETH_DMASR_RS ((uint32_t)0x00000040) /* Receive status */ +#define ETH_DMASR_TUS ((uint32_t)0x00000020) /* Transmit underflow status */ +#define ETH_DMASR_ROS ((uint32_t)0x00000010) /* Receive overflow status */ +#define ETH_DMASR_TJTS ((uint32_t)0x00000008) /* Transmit jabber timeout status */ +#define ETH_DMASR_TBUS ((uint32_t)0x00000004) /* Transmit buffer unavailable status */ +#define ETH_DMASR_TPSS ((uint32_t)0x00000002) /* Transmit process stopped status */ +#define ETH_DMASR_TS ((uint32_t)0x00000001) /* Transmit status */ + +/* Bit definition for Ethernet DMA Operation Mode Register */ +#define ETH_DMAOMR_DTCEFD ((uint32_t)0x04000000) /* Disable Dropping of TCP/IP checksum error frames */ +#define ETH_DMAOMR_RSF ((uint32_t)0x02000000) /* Receive store and forward */ +#define ETH_DMAOMR_DFRF ((uint32_t)0x01000000) /* Disable flushing of received frames */ +#define ETH_DMAOMR_TSF ((uint32_t)0x00200000) /* Transmit store and forward */ +#define ETH_DMAOMR_FTF ((uint32_t)0x00100000) /* Flush transmit FIFO */ +#define ETH_DMAOMR_TTC ((uint32_t)0x0001C000) /* Transmit threshold control */ + #define ETH_DMAOMR_TTC_64Bytes ((uint32_t)0x00000000) /* threshold level of the MTL Transmit FIFO is 64 Bytes */ + #define ETH_DMAOMR_TTC_128Bytes ((uint32_t)0x00004000) /* threshold level of the MTL Transmit FIFO is 128 Bytes */ + #define ETH_DMAOMR_TTC_192Bytes ((uint32_t)0x00008000) /* threshold level of the MTL Transmit FIFO is 192 Bytes */ + #define ETH_DMAOMR_TTC_256Bytes ((uint32_t)0x0000C000) /* threshold level of the MTL Transmit FIFO is 256 Bytes */ + #define ETH_DMAOMR_TTC_40Bytes ((uint32_t)0x00010000) /* threshold level of the MTL Transmit FIFO is 40 Bytes */ + #define ETH_DMAOMR_TTC_32Bytes ((uint32_t)0x00014000) /* threshold level of the MTL Transmit FIFO is 32 Bytes */ + #define ETH_DMAOMR_TTC_24Bytes ((uint32_t)0x00018000) /* threshold level of the MTL Transmit FIFO is 24 Bytes */ + #define ETH_DMAOMR_TTC_16Bytes ((uint32_t)0x0001C000) /* threshold level of the MTL Transmit FIFO is 16 Bytes */ +#define ETH_DMAOMR_ST ((uint32_t)0x00002000) /* Start/stop transmission command */ +#define ETH_DMAOMR_FEF ((uint32_t)0x00000080) /* Forward error frames */ +#define ETH_DMAOMR_FUGF ((uint32_t)0x00000040) /* Forward undersized good frames */ +#define ETH_DMAOMR_RTC ((uint32_t)0x00000018) /* receive threshold control */ + #define ETH_DMAOMR_RTC_64Bytes ((uint32_t)0x00000000) /* threshold level of the MTL Receive FIFO is 64 Bytes */ + #define ETH_DMAOMR_RTC_32Bytes ((uint32_t)0x00000008) /* threshold level of the MTL Receive FIFO is 32 Bytes */ + #define ETH_DMAOMR_RTC_96Bytes ((uint32_t)0x00000010) /* threshold level of the MTL Receive FIFO is 96 Bytes */ + #define ETH_DMAOMR_RTC_128Bytes ((uint32_t)0x00000018) /* threshold level of the MTL Receive FIFO is 128 Bytes */ +#define ETH_DMAOMR_OSF ((uint32_t)0x00000004) /* operate on second frame */ +#define ETH_DMAOMR_SR ((uint32_t)0x00000002) /* Start/stop receive */ + +/* Bit definition for Ethernet DMA Interrupt Enable Register */ +#define ETH_DMAIER_NISE ((uint32_t)0x00010000) /* Normal interrupt summary enable */ +#define ETH_DMAIER_AISE ((uint32_t)0x00008000) /* Abnormal interrupt summary enable */ +#define ETH_DMAIER_ERIE ((uint32_t)0x00004000) /* Early receive interrupt enable */ +#define ETH_DMAIER_FBEIE ((uint32_t)0x00002000) /* Fatal bus error interrupt enable */ +#define ETH_DMAIER_ETIE ((uint32_t)0x00000400) /* Early transmit interrupt enable */ +#define ETH_DMAIER_RWTIE ((uint32_t)0x00000200) /* Receive watchdog timeout interrupt enable */ +#define ETH_DMAIER_RPSIE ((uint32_t)0x00000100) /* Receive process stopped interrupt enable */ +#define ETH_DMAIER_RBUIE ((uint32_t)0x00000080) /* Receive buffer unavailable interrupt enable */ +#define ETH_DMAIER_RIE ((uint32_t)0x00000040) /* Receive interrupt enable */ +#define ETH_DMAIER_TUIE ((uint32_t)0x00000020) /* Transmit Underflow interrupt enable */ +#define ETH_DMAIER_ROIE ((uint32_t)0x00000010) /* Receive Overflow interrupt enable */ +#define ETH_DMAIER_TJTIE ((uint32_t)0x00000008) /* Transmit jabber timeout interrupt enable */ +#define ETH_DMAIER_TBUIE ((uint32_t)0x00000004) /* Transmit buffer unavailable interrupt enable */ +#define ETH_DMAIER_TPSIE ((uint32_t)0x00000002) /* Transmit process stopped interrupt enable */ +#define ETH_DMAIER_TIE ((uint32_t)0x00000001) /* Transmit interrupt enable */ + +/* Bit definition for Ethernet DMA Missed Frame and Buffer Overflow Counter Register */ +#define ETH_DMAMFBOCR_OFOC ((uint32_t)0x10000000) /* Overflow bit for FIFO overflow counter */ +#define ETH_DMAMFBOCR_MFA ((uint32_t)0x0FFE0000) /* Number of frames missed by the application */ +#define ETH_DMAMFBOCR_OMFC ((uint32_t)0x00010000) /* Overflow bit for missed frame counter */ +#define ETH_DMAMFBOCR_MFC ((uint32_t)0x0000FFFF) /* Number of frames missed by the controller */ + +/* Bit definition for Ethernet DMA Current Host Transmit Descriptor Register */ +#define ETH_DMACHTDR_HTDAP ((uint32_t)0xFFFFFFFF) /* Host transmit descriptor address pointer */ + +/* Bit definition for Ethernet DMA Current Host Receive Descriptor Register */ +#define ETH_DMACHRDR_HRDAP ((uint32_t)0xFFFFFFFF) /* Host receive descriptor address pointer */ + +/* Bit definition for Ethernet DMA Current Host Transmit Buffer Address Register */ +#define ETH_DMACHTBAR_HTBAP ((uint32_t)0xFFFFFFFF) /* Host transmit buffer address pointer */ + +/* Bit definition for Ethernet DMA Current Host Receive Buffer Address Register */ +#define ETH_DMACHRBAR_HRBAP ((uint32_t)0xFFFFFFFF) /* Host receive buffer address pointer */ +#endif /* STM32F10X_CL */ + +/** + * @} + */ + + /** + * @} + */ + +#ifdef USE_STDPERIPH_DRIVER + #include "stm32f10x_conf.h" +#endif + +/** @addtogroup Exported_macro + * @{ + */ + +#define SET_BIT(REG, BIT) ((REG) |= (BIT)) + +#define CLEAR_BIT(REG, BIT) ((REG) &= ~(BIT)) + +#define READ_BIT(REG, BIT) ((REG) & (BIT)) + +#define CLEAR_REG(REG) ((REG) = (0x0)) + +#define WRITE_REG(REG, VAL) ((REG) = (VAL)) + +#define READ_REG(REG) ((REG)) + +#define MODIFY_REG(REG, CLEARMASK, SETMASK) WRITE_REG((REG), (((READ_REG(REG)) & (~(CLEARMASK))) | (SETMASK))) + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F10x_H */ + +/** + * @} + */ + + /** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/69/d0f39d55c896001713a7ede92b37d6f1 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/69/d0f39d55c896001713a7ede92b37d6f1 new file mode 100644 index 0000000..a447b54 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/69/d0f39d55c896001713a7ede92b37d6f1 @@ -0,0 +1,19 @@ + + + + + + + + +]> + + + + mrts + SWD + ST-Link + stm32f107vctx + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/7/b0585b089d9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/7/b0585b089d9400171201ed9ff9474498 new file mode 100644 index 0000000..cf06848 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/7/b0585b089d9400171201ed9ff9474498 @@ -0,0 +1,189 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* Kernel includes. */ +#include "FreeRTOS.h" +#include "task.h" + + +#define portINITIAL_FORMAT_VECTOR ( ( StackType_t ) 0x4000 ) + +/* Supervisor mode set. */ +#define portINITIAL_STATUS_REGISTER ( ( StackType_t ) 0x2000) + +/* Used to keep track of the number of nested calls to taskENTER_CRITICAL(). This +will be set to 0 prior to the first task being started. */ +static uint32_t ulCriticalNesting = 0x9999UL; + + +#define portSAVE_CONTEXT() \ + lea.l (-60, %sp), %sp; \ + movem.l %d0-%fp, (%sp); \ + move.l pxCurrentTCB, %a0; \ + move.l %sp, (%a0); + +#define portRESTORE_CONTEXT() \ + move.l pxCurrentTCB, %a0; \ + move.l (%a0), %sp; \ + movem.l (%sp), %d0-%fp; \ + lea.l %sp@(60), %sp; \ + rte + + + +/*-----------------------------------------------------------*/ + +StackType_t *pxPortInitialiseStack( StackType_t * pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + *pxTopOfStack = ( StackType_t ) pvParameters; + pxTopOfStack--; + + *pxTopOfStack = (StackType_t) 0xDEADBEEF; + pxTopOfStack--; + + /* Exception stack frame starts with the return address. */ + *pxTopOfStack = ( StackType_t ) pxCode; + pxTopOfStack--; + + *pxTopOfStack = ( portINITIAL_FORMAT_VECTOR << 16UL ) | ( portINITIAL_STATUS_REGISTER ); + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) 0x0; /*FP*/ + pxTopOfStack -= 14; /* A5 to D0. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void vPortStartFirstTask( void ); + + ulCriticalNesting = 0UL; + + /* Configure the interrupts used by this port. */ + vApplicationSetupInterrupts(); + + /* Start the first task executing. */ + vPortStartFirstTask(); + + return pdFALSE; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented as there is nothing to return to. */ +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + if( ulCriticalNesting == 0UL ) + { + /* Guard against context switches being pended simultaneously with a + critical section being entered. */ + do + { + portDISABLE_INTERRUPTS(); + if( MCF_INTC0_INTFRCH == 0UL ) + { + break; + } + + portENABLE_INTERRUPTS(); + + } while( 1 ); + } + ulCriticalNesting++; +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + ulCriticalNesting--; + if( ulCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void vPortYieldHandler( void ) +{ +uint32_t ulSavedInterruptMask; + + ulSavedInterruptMask = portSET_INTERRUPT_MASK_FROM_ISR(); + /* Note this will clear all forced interrupts - this is done for speed. */ + MCF_INTC0_INTFRCL = 0; + vTaskSwitchContext(); + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulSavedInterruptMask ); +} +/*-----------------------------------------------------------*/ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/7/d0dcaf1990970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/7/d0dcaf1990970017138fe0bf747e5677 new file mode 100644 index 0000000..e849a7a --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/7/d0dcaf1990970017138fe0bf747e5677 @@ -0,0 +1,126 @@ +ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +heap_4.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -fno-common -mcpu=cortex-m3 -mthumb $(RELEASE_DEFINES) $(INCLUDES) +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -nostartfiles -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map +release: export LDARCHIVES := -L. -L$(STM32_STDPERIPH_ROOT) -lSTM_StdPeriph +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -rf $(OBJ_DIR) hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +else + +vpath %.c \ +src \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ +$(STM32_DEVICE_SUPPORT_DIR) +vpath %.s $(STARTER_SCRIPT_DIR) +vpath %.o $(OBJ_DIR) + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) #$(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +#$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) +# $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)$@ + +$(OBJ_DIR): + mkdir -p $@ + +endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/71/509bfb9d8b970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/71/509bfb9d8b970017138fe0bf747e5677 new file mode 100644 index 0000000..fcd92dd --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/71/509bfb9d8b970017138fe0bf747e5677 @@ -0,0 +1,73 @@ +// ----------------------------------------------------------------------------- +/// @file main.c +/// @brief Description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @file main.c +/// @ingroup {group_name} + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + +// FreeRTOS includes +#include "FreeRTOS.h" +#include "task.h" + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Type definitions +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// File-scope variables +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function definitions +// ----------------------------------------------------------------------------- + + +int main (void) +{ + + + /* Start the scheduler. */ + vTaskStartScheduler(); + + /* Will only get here if there was insufficient memory to create the idle + task. The idle task is created within vTaskStartScheduler(). */ + for( ;; ); + + + return -1; +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/74/d07203499a970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/74/d07203499a970017138fe0bf747e5677 new file mode 100644 index 0000000..3f3e4ab --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/74/d07203499a970017138fe0bf747e5677 @@ -0,0 +1,211 @@ +/* +****************************************************************************** +** +** File : LinkerScript.ld +** +** Author : Auto-generated by Ac6 System Workbench +** +** Abstract : Linker script for STM32F107VCTx Device from STM32F1 series +** 64Kbytes RAM +** 256Kbytes ROM +** +** Set heap size, stack size and stack location according +** to application requirements. +** +** Set memory bank area and size if external memory is used. +** +** Target : STMicroelectronics STM32 +** +** Distribution: The file is distributed “as is,” without any warranty +** of any kind. +** +***************************************************************************** +** @attention +** +**

© COPYRIGHT(c) 2017 Ac6

+** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** 1. Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** 3. Neither the name of Ac6 nor the names of its contributors +** may be used to endorse or promote products derived from this software +** without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +***************************************************************************** +*/ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = 0x20010000; /* end of RAM */ + +_Min_Heap_Size = 0; /* required amount of heap */ +_Min_Stack_Size = 0x400; /* required amount of stack */ + +/* Memories definition */ +MEMORY +{ + RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K + ROM (rx) : ORIGIN = 0x8000000, LENGTH = 256K +} + +/* Sections */ +SECTIONS +{ + /* The startup code into ROM memory */ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } >ROM + + /* The program code and other data into ROM memory */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + } >ROM + + /* Constant data into ROM memory*/ + .rodata : + { + . = ALIGN(4); + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + . = ALIGN(4); + } >ROM + + .ARM.extab : { + . = ALIGN(4); + *(.ARM.extab* .gnu.linkonce.armextab.*) + . = ALIGN(4); + } >ROM + + .ARM : { + . = ALIGN(4); + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + . = ALIGN(4); + } >ROM + + .preinit_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + . = ALIGN(4); + } >ROM + + .init_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + . = ALIGN(4); + } >ROM + + .fini_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + . = ALIGN(4); + } >ROM + + /* Used by the startup to initialize data */ + _sidata = LOADADDR(.data); + + /* Initialized data sections into RAM memory */ + .data : + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + } >RAM AT> ROM + + + /* Uninitialized data section into RAM memory */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM + + /* User_heap_stack section, used to check that there is enough RAM left */ + ._user_heap_stack : + { + . = ALIGN(8); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(8); + } >RAM + + + + /* Remove information from the compiler libraries */ +/* /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } +*/ + .ARM.attributes 0 : { *(.ARM.attributes) } + + GROUP + { + libgcc.a + libg.a + libc.a + libm.a + libnosys.a + } +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/77/b011bff29c970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/77/b011bff29c970017138fe0bf747e5677 new file mode 100644 index 0000000..6503f2f --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/77/b011bff29c970017138fe0bf747e5677 @@ -0,0 +1,134 @@ +ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +heap_4.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +STM32_CORE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) \ +-I$(STM32_CORE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -fno-common -mcpu=cortex-m3 -mthumb $(RELEASE_DEFINES) $(INCLUDES) +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -nostartfiles -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map +release: export LDARCHIVES := -L. -L$(STM32_STDPERIPH_ROOT) -lSTM_StdPeriph -lhsb_mrts_release +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -f hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + rm -rf obj_release + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +else + +vpath %.c \ +src \ +startup \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport + +vpath %.s \ +startup +vpath %.o \ +obj_release + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) $(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)/$@ + +$(OBJ_DIR): + mkdir -p $@ + +endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/77/b075aceda59700171090ed03afc2ec65 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/77/b075aceda59700171090ed03afc2ec65 new file mode 100644 index 0000000..80e86e2 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/77/b075aceda59700171090ed03afc2ec65 @@ -0,0 +1,103 @@ +// ----------------------------------------------------------------------------- +/// @file freeRTOSFixes.c +/// @brief Description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @file freeRTOSFixes.c +/// @ingroup {group_name} + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + +#include "freeRTOSFixes.h" + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Type definitions +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// File-scope variables +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function definitions +// ----------------------------------------------------------------------------- + +void OS_logTaskInfo(xTaskHandle taskHandle) +{ + unsigned portBASE_TYPE highWaterMark; + char text[128]; + + snprintf(text, sizeof(text), "Task %s\n", pcTaskGetTaskName(taskHandle)); + Shell_sendString(text); + + highWaterMark = uxTaskGetStackHighWaterMark(taskHandle); + snprintf(text, sizeof(text), "Stack high water mark : %lu long words\n", highWaterMark); + Shell_sendString(text); +} + +// Implementation for libc, needed for printf related functions. +caddr_t _sbrk(int incr) +{ + extern char _end; + static char* heap_end; + char* prev_heap_end; + + if(heap_end == 0) + { + heap_end = &_end; + } + + prev_heap_end = heap_end; + heap_end += incr; + return (caddr_t)prev_heap_end; +} + +// Stack overflow hook +void vApplicationStackOverflowHook(xTaskHandle xTask, signed portCHAR* pcTaskName) +{ + Logger_fatal(FATALCODE_STACKOVERFLOW); +} + +// Malloc failed hook +void vApplicationMallocFailedHook(void) +{ + Logger_fatal(FATALCODE_MALLOCFAILED); +} + +// Assert for StdPeriph library +void assert_failed(uint8_t* file, uint32_t line) +{ + Logger_log((char*)file, "", line, LOGTYPE_ERROR, "assert failed"); +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/78/605232ba99970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/78/605232ba99970017138fe0bf747e5677 new file mode 100644 index 0000000..f573253 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/78/605232ba99970017138fe0bf747e5677 @@ -0,0 +1,202 @@ +/* +****************************************************************************** +** +** File : LinkerScript.ld +** +** Author : Auto-generated by Ac6 System Workbench +** +** Abstract : Linker script for STM32F107VCTx Device from STM32F1 series +** 64Kbytes RAM +** 256Kbytes ROM +** +** Set heap size, stack size and stack location according +** to application requirements. +** +** Set memory bank area and size if external memory is used. +** +** Target : STMicroelectronics STM32 +** +** Distribution: The file is distributed “as is,” without any warranty +** of any kind. +** +***************************************************************************** +** @attention +** +**

© COPYRIGHT(c) 2017 Ac6

+** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** 1. Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** 3. Neither the name of Ac6 nor the names of its contributors +** may be used to endorse or promote products derived from this software +** without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +***************************************************************************** +*/ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = 0x20010000; /* end of RAM */ + +_Min_Heap_Size = 0; /* required amount of heap */ +_Min_Stack_Size = 0x400; /* required amount of stack */ + +/* Memories definition */ +MEMORY +{ + RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K + ROM (rx) : ORIGIN = 0x8000000, LENGTH = 256K +} + +/* Sections */ +SECTIONS +{ + /* The startup code into ROM memory */ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } >ROM + + /* The program code and other data into ROM memory */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + } >ROM + + /* Constant data into ROM memory*/ + .rodata : + { + . = ALIGN(4); + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + . = ALIGN(4); + } >ROM + + .ARM.extab : { + . = ALIGN(4); + *(.ARM.extab* .gnu.linkonce.armextab.*) + . = ALIGN(4); + } >ROM + + .ARM : { + . = ALIGN(4); + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + . = ALIGN(4); + } >ROM + + .preinit_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + . = ALIGN(4); + } >ROM + + .init_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + . = ALIGN(4); + } >ROM + + .fini_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + . = ALIGN(4); + } >ROM + + /* Used by the startup to initialize data */ + _sidata = LOADADDR(.data); + + /* Initialized data sections into RAM memory */ + .data : + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + } >RAM AT> ROM + + + /* Uninitialized data section into RAM memory */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM + + /* User_heap_stack section, used to check that there is enough RAM left */ + ._user_heap_stack : + { + . = ALIGN(8); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(8); + } >RAM + + + + /* Remove information from the compiler libraries */ + /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } + + .ARM.attributes 0 : { *(.ARM.attributes) } +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/7a/4003893cc796001713a7ede92b37d6f1 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/7a/4003893cc796001713a7ede92b37d6f1 new file mode 100644 index 0000000..a0b84f2 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/7a/4003893cc796001713a7ede92b37d6f1 @@ -0,0 +1,8336 @@ +/** + ****************************************************************************** + * @file stm32f10x.h + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief CMSIS Cortex-M3 Device Peripheral Access Layer Header File. + * This file contains all the peripheral register's definitions, bits + * definitions and memory mapping for STM32F10x Connectivity line, + * High density, High density value line, Medium density, + * Medium density Value line, Low density, Low density Value line + * and XL-density devices. + * + * The file is the unique include file that the application programmer + * is using in the C source code, usually in main.c. This file contains: + * - Configuration section that allows to select: + * - The device used in the target application + * - To use or not the peripheral’s drivers in application code(i.e. + * code will be based on direct access to peripheral’s registers + * rather than drivers API), this option is controlled by + * "#define USE_STDPERIPH_DRIVER" + * - To change few application-specific parameters such as the HSE + * crystal frequency + * - Data structures and the address mapping for all peripherals + * - Peripheral's registers declarations and bits definition + * - Macros to access peripheral’s registers hardware + * + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f10x + * @{ + */ + +#ifndef __STM32F10x_H +#define __STM32F10x_H + +#ifdef __cplusplus + extern "C" { +#endif + +/** @addtogroup Library_configuration_section + * @{ + */ + +/* Uncomment the line below according to the target STM32 device used in your + application + */ + +#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD) && !defined (STM32F10X_HD_VL) && !defined (STM32F10X_XL) && !defined (STM32F10X_CL) + /* #define STM32F10X_LD */ /*!< STM32F10X_LD: STM32 Low density devices */ + /* #define STM32F10X_LD_VL */ /*!< STM32F10X_LD_VL: STM32 Low density Value Line devices */ + /* #define STM32F10X_MD */ /*!< STM32F10X_MD: STM32 Medium density devices */ + /* #define STM32F10X_MD_VL */ /*!< STM32F10X_MD_VL: STM32 Medium density Value Line devices */ + /* #define STM32F10X_HD */ /*!< STM32F10X_HD: STM32 High density devices */ + /* #define STM32F10X_HD_VL */ /*!< STM32F10X_HD_VL: STM32 High density value line devices */ + /* #define STM32F10X_XL */ /*!< STM32F10X_XL: STM32 XL-density devices */ + #define STM32F10X_CL /*!< STM32F10X_CL: STM32 Connectivity line devices */ +#endif +/* Tip: To avoid modifying this file each time you need to switch between these + devices, you can define the device in your toolchain compiler preprocessor. + + - Low-density devices are STM32F101xx, STM32F102xx and STM32F103xx microcontrollers + where the Flash memory density ranges between 16 and 32 Kbytes. + - Low-density value line devices are STM32F100xx microcontrollers where the Flash + memory density ranges between 16 and 32 Kbytes. + - Medium-density devices are STM32F101xx, STM32F102xx and STM32F103xx microcontrollers + where the Flash memory density ranges between 64 and 128 Kbytes. + - Medium-density value line devices are STM32F100xx microcontrollers where the + Flash memory density ranges between 64 and 128 Kbytes. + - High-density devices are STM32F101xx and STM32F103xx microcontrollers where + the Flash memory density ranges between 256 and 512 Kbytes. + - High-density value line devices are STM32F100xx microcontrollers where the + Flash memory density ranges between 256 and 512 Kbytes. + - XL-density devices are STM32F101xx and STM32F103xx microcontrollers where + the Flash memory density ranges between 512 and 1024 Kbytes. + - Connectivity line devices are STM32F105xx and STM32F107xx microcontrollers. + */ + +#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD) && !defined (STM32F10X_HD_VL) && !defined (STM32F10X_XL) && !defined (STM32F10X_CL) + #error "Please select first the target STM32F10x device used in your application (in stm32f10x.h file)" +#endif + +#if !defined USE_STDPERIPH_DRIVER +/** + * @brief Comment the line below if you will not use the peripherals drivers. + In this case, these drivers will not be included and the application code will + be based on direct access to peripherals registers + */ + #define USE_STDPERIPH_DRIVER +#endif + +/** + * @brief In the following line adjust the value of External High Speed oscillator (HSE) + used in your application + + Tip: To avoid modifying this file each time you need to use different HSE, you + can define the HSE value in your toolchain compiler preprocessor. + */ +#if !defined HSE_VALUE + #ifdef STM32F10X_CL + #define HSE_VALUE ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */ + #else + #define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */ + #endif /* STM32F10X_CL */ +#endif /* HSE_VALUE */ + + +/** + * @brief In the following line adjust the External High Speed oscillator (HSE) Startup + Timeout value + */ +#define HSE_STARTUP_TIMEOUT ((uint16_t)0x0500) /*!< Time out for HSE start up */ + +#define HSI_VALUE ((uint32_t)8000000) /*!< Value of the Internal oscillator in Hz*/ + +/** + * @brief STM32F10x Standard Peripheral Library version number + */ +#define __STM32F10X_STDPERIPH_VERSION_MAIN (0x03) /*!< [31:24] main version */ +#define __STM32F10X_STDPERIPH_VERSION_SUB1 (0x05) /*!< [23:16] sub1 version */ +#define __STM32F10X_STDPERIPH_VERSION_SUB2 (0x00) /*!< [15:8] sub2 version */ +#define __STM32F10X_STDPERIPH_VERSION_RC (0x00) /*!< [7:0] release candidate */ +#define __STM32F10X_STDPERIPH_VERSION ( (__STM32F10X_STDPERIPH_VERSION_MAIN << 24)\ + |(__STM32F10X_STDPERIPH_VERSION_SUB1 << 16)\ + |(__STM32F10X_STDPERIPH_VERSION_SUB2 << 8)\ + |(__STM32F10X_STDPERIPH_VERSION_RC)) + +/** + * @} + */ + +/** @addtogroup Configuration_section_for_CMSIS + * @{ + */ + +/** + * @brief Configuration of the Cortex-M3 Processor and Core Peripherals + */ +#ifdef STM32F10X_XL + #define __MPU_PRESENT 1 /*!< STM32 XL-density devices provide an MPU */ +#else + #define __MPU_PRESENT 0 /*!< Other STM32 devices does not provide an MPU */ +#endif /* STM32F10X_XL */ +#define __NVIC_PRIO_BITS 4 /*!< STM32 uses 4 Bits for the Priority Levels */ +#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */ + +/** + * @brief STM32F10x Interrupt Number Definition, according to the selected device + * in @ref Library_configuration_section + */ +typedef enum IRQn +{ +/****** Cortex-M3 Processor Exceptions Numbers ***************************************************/ + NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ + MemoryManagement_IRQn = -12, /*!< 4 Cortex-M3 Memory Management Interrupt */ + BusFault_IRQn = -11, /*!< 5 Cortex-M3 Bus Fault Interrupt */ + UsageFault_IRQn = -10, /*!< 6 Cortex-M3 Usage Fault Interrupt */ + SVCall_IRQn = -5, /*!< 11 Cortex-M3 SV Call Interrupt */ + DebugMonitor_IRQn = -4, /*!< 12 Cortex-M3 Debug Monitor Interrupt */ + PendSV_IRQn = -2, /*!< 14 Cortex-M3 Pend SV Interrupt */ + SysTick_IRQn = -1, /*!< 15 Cortex-M3 System Tick Interrupt */ + +/****** STM32 specific Interrupt Numbers *********************************************************/ + WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */ + PVD_IRQn = 1, /*!< PVD through EXTI Line detection Interrupt */ + TAMPER_IRQn = 2, /*!< Tamper Interrupt */ + RTC_IRQn = 3, /*!< RTC global Interrupt */ + FLASH_IRQn = 4, /*!< FLASH global Interrupt */ + RCC_IRQn = 5, /*!< RCC global Interrupt */ + EXTI0_IRQn = 6, /*!< EXTI Line0 Interrupt */ + EXTI1_IRQn = 7, /*!< EXTI Line1 Interrupt */ + EXTI2_IRQn = 8, /*!< EXTI Line2 Interrupt */ + EXTI3_IRQn = 9, /*!< EXTI Line3 Interrupt */ + EXTI4_IRQn = 10, /*!< EXTI Line4 Interrupt */ + DMA1_Channel1_IRQn = 11, /*!< DMA1 Channel 1 global Interrupt */ + DMA1_Channel2_IRQn = 12, /*!< DMA1 Channel 2 global Interrupt */ + DMA1_Channel3_IRQn = 13, /*!< DMA1 Channel 3 global Interrupt */ + DMA1_Channel4_IRQn = 14, /*!< DMA1 Channel 4 global Interrupt */ + DMA1_Channel5_IRQn = 15, /*!< DMA1 Channel 5 global Interrupt */ + DMA1_Channel6_IRQn = 16, /*!< DMA1 Channel 6 global Interrupt */ + DMA1_Channel7_IRQn = 17, /*!< DMA1 Channel 7 global Interrupt */ + +#ifdef STM32F10X_LD + ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ + USB_HP_CAN1_TX_IRQn = 19, /*!< USB Device High Priority or CAN1 TX Interrupts */ + USB_LP_CAN1_RX0_IRQn = 20, /*!< USB Device Low Priority or CAN1 RX0 Interrupts */ + CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ + CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ + EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ + TIM1_BRK_IRQn = 24, /*!< TIM1 Break Interrupt */ + TIM1_UP_IRQn = 25, /*!< TIM1 Update Interrupt */ + TIM1_TRG_COM_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt */ + TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ + TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ + TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ + I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ + I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ + SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ + USART1_IRQn = 37, /*!< USART1 global Interrupt */ + USART2_IRQn = 38, /*!< USART2 global Interrupt */ + EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ + RTCAlarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ + USBWakeUp_IRQn = 42 /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */ +#endif /* STM32F10X_LD */ + +#ifdef STM32F10X_LD_VL + ADC1_IRQn = 18, /*!< ADC1 global Interrupt */ + EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ + TIM1_BRK_TIM15_IRQn = 24, /*!< TIM1 Break and TIM15 Interrupts */ + TIM1_UP_TIM16_IRQn = 25, /*!< TIM1 Update and TIM16 Interrupts */ + TIM1_TRG_COM_TIM17_IRQn = 26, /*!< TIM1 Trigger and Commutation and TIM17 Interrupt */ + TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ + TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ + TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ + I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ + I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ + SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ + USART1_IRQn = 37, /*!< USART1 global Interrupt */ + USART2_IRQn = 38, /*!< USART2 global Interrupt */ + EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ + RTCAlarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ + CEC_IRQn = 42, /*!< HDMI-CEC Interrupt */ + TIM6_DAC_IRQn = 54, /*!< TIM6 and DAC underrun Interrupt */ + TIM7_IRQn = 55 /*!< TIM7 Interrupt */ +#endif /* STM32F10X_LD_VL */ + +#ifdef STM32F10X_MD + ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ + USB_HP_CAN1_TX_IRQn = 19, /*!< USB Device High Priority or CAN1 TX Interrupts */ + USB_LP_CAN1_RX0_IRQn = 20, /*!< USB Device Low Priority or CAN1 RX0 Interrupts */ + CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ + CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ + EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ + TIM1_BRK_IRQn = 24, /*!< TIM1 Break Interrupt */ + TIM1_UP_IRQn = 25, /*!< TIM1 Update Interrupt */ + TIM1_TRG_COM_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt */ + TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ + TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ + TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ + TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ + I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ + I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ + I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ + I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ + SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ + SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ + USART1_IRQn = 37, /*!< USART1 global Interrupt */ + USART2_IRQn = 38, /*!< USART2 global Interrupt */ + USART3_IRQn = 39, /*!< USART3 global Interrupt */ + EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ + RTCAlarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ + USBWakeUp_IRQn = 42 /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */ +#endif /* STM32F10X_MD */ + +#ifdef STM32F10X_MD_VL + ADC1_IRQn = 18, /*!< ADC1 global Interrupt */ + EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ + TIM1_BRK_TIM15_IRQn = 24, /*!< TIM1 Break and TIM15 Interrupts */ + TIM1_UP_TIM16_IRQn = 25, /*!< TIM1 Update and TIM16 Interrupts */ + TIM1_TRG_COM_TIM17_IRQn = 26, /*!< TIM1 Trigger and Commutation and TIM17 Interrupt */ + TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ + TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ + TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ + TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ + I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ + I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ + I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ + I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ + SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ + SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ + USART1_IRQn = 37, /*!< USART1 global Interrupt */ + USART2_IRQn = 38, /*!< USART2 global Interrupt */ + USART3_IRQn = 39, /*!< USART3 global Interrupt */ + EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ + RTCAlarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ + CEC_IRQn = 42, /*!< HDMI-CEC Interrupt */ + TIM6_DAC_IRQn = 54, /*!< TIM6 and DAC underrun Interrupt */ + TIM7_IRQn = 55 /*!< TIM7 Interrupt */ +#endif /* STM32F10X_MD_VL */ + +#ifdef STM32F10X_HD + ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ + USB_HP_CAN1_TX_IRQn = 19, /*!< USB Device High Priority or CAN1 TX Interrupts */ + USB_LP_CAN1_RX0_IRQn = 20, /*!< USB Device Low Priority or CAN1 RX0 Interrupts */ + CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ + CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ + EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ + TIM1_BRK_IRQn = 24, /*!< TIM1 Break Interrupt */ + TIM1_UP_IRQn = 25, /*!< TIM1 Update Interrupt */ + TIM1_TRG_COM_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt */ + TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ + TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ + TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ + TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ + I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ + I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ + I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ + I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ + SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ + SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ + USART1_IRQn = 37, /*!< USART1 global Interrupt */ + USART2_IRQn = 38, /*!< USART2 global Interrupt */ + USART3_IRQn = 39, /*!< USART3 global Interrupt */ + EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ + RTCAlarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ + USBWakeUp_IRQn = 42, /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */ + TIM8_BRK_IRQn = 43, /*!< TIM8 Break Interrupt */ + TIM8_UP_IRQn = 44, /*!< TIM8 Update Interrupt */ + TIM8_TRG_COM_IRQn = 45, /*!< TIM8 Trigger and Commutation Interrupt */ + TIM8_CC_IRQn = 46, /*!< TIM8 Capture Compare Interrupt */ + ADC3_IRQn = 47, /*!< ADC3 global Interrupt */ + FSMC_IRQn = 48, /*!< FSMC global Interrupt */ + SDIO_IRQn = 49, /*!< SDIO global Interrupt */ + TIM5_IRQn = 50, /*!< TIM5 global Interrupt */ + SPI3_IRQn = 51, /*!< SPI3 global Interrupt */ + UART4_IRQn = 52, /*!< UART4 global Interrupt */ + UART5_IRQn = 53, /*!< UART5 global Interrupt */ + TIM6_IRQn = 54, /*!< TIM6 global Interrupt */ + TIM7_IRQn = 55, /*!< TIM7 global Interrupt */ + DMA2_Channel1_IRQn = 56, /*!< DMA2 Channel 1 global Interrupt */ + DMA2_Channel2_IRQn = 57, /*!< DMA2 Channel 2 global Interrupt */ + DMA2_Channel3_IRQn = 58, /*!< DMA2 Channel 3 global Interrupt */ + DMA2_Channel4_5_IRQn = 59 /*!< DMA2 Channel 4 and Channel 5 global Interrupt */ +#endif /* STM32F10X_HD */ + +#ifdef STM32F10X_HD_VL + ADC1_IRQn = 18, /*!< ADC1 global Interrupt */ + EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ + TIM1_BRK_TIM15_IRQn = 24, /*!< TIM1 Break and TIM15 Interrupts */ + TIM1_UP_TIM16_IRQn = 25, /*!< TIM1 Update and TIM16 Interrupts */ + TIM1_TRG_COM_TIM17_IRQn = 26, /*!< TIM1 Trigger and Commutation and TIM17 Interrupt */ + TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ + TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ + TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ + TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ + I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ + I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ + I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ + I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ + SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ + SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ + USART1_IRQn = 37, /*!< USART1 global Interrupt */ + USART2_IRQn = 38, /*!< USART2 global Interrupt */ + USART3_IRQn = 39, /*!< USART3 global Interrupt */ + EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ + RTCAlarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ + CEC_IRQn = 42, /*!< HDMI-CEC Interrupt */ + TIM12_IRQn = 43, /*!< TIM12 global Interrupt */ + TIM13_IRQn = 44, /*!< TIM13 global Interrupt */ + TIM14_IRQn = 45, /*!< TIM14 global Interrupt */ + TIM5_IRQn = 50, /*!< TIM5 global Interrupt */ + SPI3_IRQn = 51, /*!< SPI3 global Interrupt */ + UART4_IRQn = 52, /*!< UART4 global Interrupt */ + UART5_IRQn = 53, /*!< UART5 global Interrupt */ + TIM6_DAC_IRQn = 54, /*!< TIM6 and DAC underrun Interrupt */ + TIM7_IRQn = 55, /*!< TIM7 Interrupt */ + DMA2_Channel1_IRQn = 56, /*!< DMA2 Channel 1 global Interrupt */ + DMA2_Channel2_IRQn = 57, /*!< DMA2 Channel 2 global Interrupt */ + DMA2_Channel3_IRQn = 58, /*!< DMA2 Channel 3 global Interrupt */ + DMA2_Channel4_5_IRQn = 59, /*!< DMA2 Channel 4 and Channel 5 global Interrupt */ + DMA2_Channel5_IRQn = 60 /*!< DMA2 Channel 5 global Interrupt (DMA2 Channel 5 is + mapped at position 60 only if the MISC_REMAP bit in + the AFIO_MAPR2 register is set) */ +#endif /* STM32F10X_HD_VL */ + +#ifdef STM32F10X_XL + ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ + USB_HP_CAN1_TX_IRQn = 19, /*!< USB Device High Priority or CAN1 TX Interrupts */ + USB_LP_CAN1_RX0_IRQn = 20, /*!< USB Device Low Priority or CAN1 RX0 Interrupts */ + CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ + CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ + EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ + TIM1_BRK_TIM9_IRQn = 24, /*!< TIM1 Break Interrupt and TIM9 global Interrupt */ + TIM1_UP_TIM10_IRQn = 25, /*!< TIM1 Update Interrupt and TIM10 global Interrupt */ + TIM1_TRG_COM_TIM11_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt and TIM11 global interrupt */ + TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ + TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ + TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ + TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ + I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ + I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ + I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ + I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ + SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ + SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ + USART1_IRQn = 37, /*!< USART1 global Interrupt */ + USART2_IRQn = 38, /*!< USART2 global Interrupt */ + USART3_IRQn = 39, /*!< USART3 global Interrupt */ + EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ + RTCAlarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ + USBWakeUp_IRQn = 42, /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */ + TIM8_BRK_TIM12_IRQn = 43, /*!< TIM8 Break Interrupt and TIM12 global Interrupt */ + TIM8_UP_TIM13_IRQn = 44, /*!< TIM8 Update Interrupt and TIM13 global Interrupt */ + TIM8_TRG_COM_TIM14_IRQn = 45, /*!< TIM8 Trigger and Commutation Interrupt and TIM14 global interrupt */ + TIM8_CC_IRQn = 46, /*!< TIM8 Capture Compare Interrupt */ + ADC3_IRQn = 47, /*!< ADC3 global Interrupt */ + FSMC_IRQn = 48, /*!< FSMC global Interrupt */ + SDIO_IRQn = 49, /*!< SDIO global Interrupt */ + TIM5_IRQn = 50, /*!< TIM5 global Interrupt */ + SPI3_IRQn = 51, /*!< SPI3 global Interrupt */ + UART4_IRQn = 52, /*!< UART4 global Interrupt */ + UART5_IRQn = 53, /*!< UART5 global Interrupt */ + TIM6_IRQn = 54, /*!< TIM6 global Interrupt */ + TIM7_IRQn = 55, /*!< TIM7 global Interrupt */ + DMA2_Channel1_IRQn = 56, /*!< DMA2 Channel 1 global Interrupt */ + DMA2_Channel2_IRQn = 57, /*!< DMA2 Channel 2 global Interrupt */ + DMA2_Channel3_IRQn = 58, /*!< DMA2 Channel 3 global Interrupt */ + DMA2_Channel4_5_IRQn = 59 /*!< DMA2 Channel 4 and Channel 5 global Interrupt */ +#endif /* STM32F10X_XL */ + +#ifdef STM32F10X_CL + ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ + CAN1_TX_IRQn = 19, /*!< USB Device High Priority or CAN1 TX Interrupts */ + CAN1_RX0_IRQn = 20, /*!< USB Device Low Priority or CAN1 RX0 Interrupts */ + CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ + CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ + EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ + TIM1_BRK_IRQn = 24, /*!< TIM1 Break Interrupt */ + TIM1_UP_IRQn = 25, /*!< TIM1 Update Interrupt */ + TIM1_TRG_COM_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt */ + TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ + TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ + TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ + TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ + I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ + I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ + I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ + I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ + SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ + SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ + USART1_IRQn = 37, /*!< USART1 global Interrupt */ + USART2_IRQn = 38, /*!< USART2 global Interrupt */ + USART3_IRQn = 39, /*!< USART3 global Interrupt */ + EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ + RTCAlarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ + OTG_FS_WKUP_IRQn = 42, /*!< USB OTG FS WakeUp from suspend through EXTI Line Interrupt */ + TIM5_IRQn = 50, /*!< TIM5 global Interrupt */ + SPI3_IRQn = 51, /*!< SPI3 global Interrupt */ + UART4_IRQn = 52, /*!< UART4 global Interrupt */ + UART5_IRQn = 53, /*!< UART5 global Interrupt */ + TIM6_IRQn = 54, /*!< TIM6 global Interrupt */ + TIM7_IRQn = 55, /*!< TIM7 global Interrupt */ + DMA2_Channel1_IRQn = 56, /*!< DMA2 Channel 1 global Interrupt */ + DMA2_Channel2_IRQn = 57, /*!< DMA2 Channel 2 global Interrupt */ + DMA2_Channel3_IRQn = 58, /*!< DMA2 Channel 3 global Interrupt */ + DMA2_Channel4_IRQn = 59, /*!< DMA2 Channel 4 global Interrupt */ + DMA2_Channel5_IRQn = 60, /*!< DMA2 Channel 5 global Interrupt */ + ETH_IRQn = 61, /*!< Ethernet global Interrupt */ + ETH_WKUP_IRQn = 62, /*!< Ethernet Wakeup through EXTI line Interrupt */ + CAN2_TX_IRQn = 63, /*!< CAN2 TX Interrupt */ + CAN2_RX0_IRQn = 64, /*!< CAN2 RX0 Interrupt */ + CAN2_RX1_IRQn = 65, /*!< CAN2 RX1 Interrupt */ + CAN2_SCE_IRQn = 66, /*!< CAN2 SCE Interrupt */ + OTG_FS_IRQn = 67 /*!< USB OTG FS global Interrupt */ +#endif /* STM32F10X_CL */ +} IRQn_Type; + +/** + * @} + */ + +#include "core_cm3.h" +#include "system_stm32f10x.h" +#include + +/** @addtogroup Exported_types + * @{ + */ + +/*!< STM32F10x Standard Peripheral Library old types (maintained for legacy purpose) */ +typedef int32_t s32; +typedef int16_t s16; +typedef int8_t s8; + +typedef const int32_t sc32; /*!< Read Only */ +typedef const int16_t sc16; /*!< Read Only */ +typedef const int8_t sc8; /*!< Read Only */ + +typedef __IO int32_t vs32; +typedef __IO int16_t vs16; +typedef __IO int8_t vs8; + +typedef __I int32_t vsc32; /*!< Read Only */ +typedef __I int16_t vsc16; /*!< Read Only */ +typedef __I int8_t vsc8; /*!< Read Only */ + +typedef uint32_t u32; +typedef uint16_t u16; +typedef uint8_t u8; + +typedef const uint32_t uc32; /*!< Read Only */ +typedef const uint16_t uc16; /*!< Read Only */ +typedef const uint8_t uc8; /*!< Read Only */ + +typedef __IO uint32_t vu32; +typedef __IO uint16_t vu16; +typedef __IO uint8_t vu8; + +typedef __I uint32_t vuc32; /*!< Read Only */ +typedef __I uint16_t vuc16; /*!< Read Only */ +typedef __I uint8_t vuc8; /*!< Read Only */ + +typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus; + +typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState; +#define IS_FUNCTIONAL_STATE(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE)) + +typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrorStatus; + +/*!< STM32F10x Standard Peripheral Library old definitions (maintained for legacy purpose) */ +#define HSEStartUp_TimeOut HSE_STARTUP_TIMEOUT +#define HSE_Value HSE_VALUE +#define HSI_Value HSI_VALUE +/** + * @} + */ + +/** @addtogroup Peripheral_registers_structures + * @{ + */ + +/** + * @brief Analog to Digital Converter + */ + +typedef struct +{ + __IO uint32_t SR; + __IO uint32_t CR1; + __IO uint32_t CR2; + __IO uint32_t SMPR1; + __IO uint32_t SMPR2; + __IO uint32_t JOFR1; + __IO uint32_t JOFR2; + __IO uint32_t JOFR3; + __IO uint32_t JOFR4; + __IO uint32_t HTR; + __IO uint32_t LTR; + __IO uint32_t SQR1; + __IO uint32_t SQR2; + __IO uint32_t SQR3; + __IO uint32_t JSQR; + __IO uint32_t JDR1; + __IO uint32_t JDR2; + __IO uint32_t JDR3; + __IO uint32_t JDR4; + __IO uint32_t DR; +} ADC_TypeDef; + +/** + * @brief Backup Registers + */ + +typedef struct +{ + uint32_t RESERVED0; + __IO uint16_t DR1; + uint16_t RESERVED1; + __IO uint16_t DR2; + uint16_t RESERVED2; + __IO uint16_t DR3; + uint16_t RESERVED3; + __IO uint16_t DR4; + uint16_t RESERVED4; + __IO uint16_t DR5; + uint16_t RESERVED5; + __IO uint16_t DR6; + uint16_t RESERVED6; + __IO uint16_t DR7; + uint16_t RESERVED7; + __IO uint16_t DR8; + uint16_t RESERVED8; + __IO uint16_t DR9; + uint16_t RESERVED9; + __IO uint16_t DR10; + uint16_t RESERVED10; + __IO uint16_t RTCCR; + uint16_t RESERVED11; + __IO uint16_t CR; + uint16_t RESERVED12; + __IO uint16_t CSR; + uint16_t RESERVED13[5]; + __IO uint16_t DR11; + uint16_t RESERVED14; + __IO uint16_t DR12; + uint16_t RESERVED15; + __IO uint16_t DR13; + uint16_t RESERVED16; + __IO uint16_t DR14; + uint16_t RESERVED17; + __IO uint16_t DR15; + uint16_t RESERVED18; + __IO uint16_t DR16; + uint16_t RESERVED19; + __IO uint16_t DR17; + uint16_t RESERVED20; + __IO uint16_t DR18; + uint16_t RESERVED21; + __IO uint16_t DR19; + uint16_t RESERVED22; + __IO uint16_t DR20; + uint16_t RESERVED23; + __IO uint16_t DR21; + uint16_t RESERVED24; + __IO uint16_t DR22; + uint16_t RESERVED25; + __IO uint16_t DR23; + uint16_t RESERVED26; + __IO uint16_t DR24; + uint16_t RESERVED27; + __IO uint16_t DR25; + uint16_t RESERVED28; + __IO uint16_t DR26; + uint16_t RESERVED29; + __IO uint16_t DR27; + uint16_t RESERVED30; + __IO uint16_t DR28; + uint16_t RESERVED31; + __IO uint16_t DR29; + uint16_t RESERVED32; + __IO uint16_t DR30; + uint16_t RESERVED33; + __IO uint16_t DR31; + uint16_t RESERVED34; + __IO uint16_t DR32; + uint16_t RESERVED35; + __IO uint16_t DR33; + uint16_t RESERVED36; + __IO uint16_t DR34; + uint16_t RESERVED37; + __IO uint16_t DR35; + uint16_t RESERVED38; + __IO uint16_t DR36; + uint16_t RESERVED39; + __IO uint16_t DR37; + uint16_t RESERVED40; + __IO uint16_t DR38; + uint16_t RESERVED41; + __IO uint16_t DR39; + uint16_t RESERVED42; + __IO uint16_t DR40; + uint16_t RESERVED43; + __IO uint16_t DR41; + uint16_t RESERVED44; + __IO uint16_t DR42; + uint16_t RESERVED45; +} BKP_TypeDef; + +/** + * @brief Controller Area Network TxMailBox + */ + +typedef struct +{ + __IO uint32_t TIR; + __IO uint32_t TDTR; + __IO uint32_t TDLR; + __IO uint32_t TDHR; +} CAN_TxMailBox_TypeDef; + +/** + * @brief Controller Area Network FIFOMailBox + */ + +typedef struct +{ + __IO uint32_t RIR; + __IO uint32_t RDTR; + __IO uint32_t RDLR; + __IO uint32_t RDHR; +} CAN_FIFOMailBox_TypeDef; + +/** + * @brief Controller Area Network FilterRegister + */ + +typedef struct +{ + __IO uint32_t FR1; + __IO uint32_t FR2; +} CAN_FilterRegister_TypeDef; + +/** + * @brief Controller Area Network + */ + +typedef struct +{ + __IO uint32_t MCR; + __IO uint32_t MSR; + __IO uint32_t TSR; + __IO uint32_t RF0R; + __IO uint32_t RF1R; + __IO uint32_t IER; + __IO uint32_t ESR; + __IO uint32_t BTR; + uint32_t RESERVED0[88]; + CAN_TxMailBox_TypeDef sTxMailBox[3]; + CAN_FIFOMailBox_TypeDef sFIFOMailBox[2]; + uint32_t RESERVED1[12]; + __IO uint32_t FMR; + __IO uint32_t FM1R; + uint32_t RESERVED2; + __IO uint32_t FS1R; + uint32_t RESERVED3; + __IO uint32_t FFA1R; + uint32_t RESERVED4; + __IO uint32_t FA1R; + uint32_t RESERVED5[8]; +#ifndef STM32F10X_CL + CAN_FilterRegister_TypeDef sFilterRegister[14]; +#else + CAN_FilterRegister_TypeDef sFilterRegister[28]; +#endif /* STM32F10X_CL */ +} CAN_TypeDef; + +/** + * @brief Consumer Electronics Control (CEC) + */ +typedef struct +{ + __IO uint32_t CFGR; + __IO uint32_t OAR; + __IO uint32_t PRES; + __IO uint32_t ESR; + __IO uint32_t CSR; + __IO uint32_t TXD; + __IO uint32_t RXD; +} CEC_TypeDef; + +/** + * @brief CRC calculation unit + */ + +typedef struct +{ + __IO uint32_t DR; + __IO uint8_t IDR; + uint8_t RESERVED0; + uint16_t RESERVED1; + __IO uint32_t CR; +} CRC_TypeDef; + +/** + * @brief Digital to Analog Converter + */ + +typedef struct +{ + __IO uint32_t CR; + __IO uint32_t SWTRIGR; + __IO uint32_t DHR12R1; + __IO uint32_t DHR12L1; + __IO uint32_t DHR8R1; + __IO uint32_t DHR12R2; + __IO uint32_t DHR12L2; + __IO uint32_t DHR8R2; + __IO uint32_t DHR12RD; + __IO uint32_t DHR12LD; + __IO uint32_t DHR8RD; + __IO uint32_t DOR1; + __IO uint32_t DOR2; +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) + __IO uint32_t SR; +#endif +} DAC_TypeDef; + +/** + * @brief Debug MCU + */ + +typedef struct +{ + __IO uint32_t IDCODE; + __IO uint32_t CR; +}DBGMCU_TypeDef; + +/** + * @brief DMA Controller + */ + +typedef struct +{ + __IO uint32_t CCR; + __IO uint32_t CNDTR; + __IO uint32_t CPAR; + __IO uint32_t CMAR; +} DMA_Channel_TypeDef; + +typedef struct +{ + __IO uint32_t ISR; + __IO uint32_t IFCR; +} DMA_TypeDef; + +/** + * @brief Ethernet MAC + */ + +typedef struct +{ + __IO uint32_t MACCR; + __IO uint32_t MACFFR; + __IO uint32_t MACHTHR; + __IO uint32_t MACHTLR; + __IO uint32_t MACMIIAR; + __IO uint32_t MACMIIDR; + __IO uint32_t MACFCR; + __IO uint32_t MACVLANTR; /* 8 */ + uint32_t RESERVED0[2]; + __IO uint32_t MACRWUFFR; /* 11 */ + __IO uint32_t MACPMTCSR; + uint32_t RESERVED1[2]; + __IO uint32_t MACSR; /* 15 */ + __IO uint32_t MACIMR; + __IO uint32_t MACA0HR; + __IO uint32_t MACA0LR; + __IO uint32_t MACA1HR; + __IO uint32_t MACA1LR; + __IO uint32_t MACA2HR; + __IO uint32_t MACA2LR; + __IO uint32_t MACA3HR; + __IO uint32_t MACA3LR; /* 24 */ + uint32_t RESERVED2[40]; + __IO uint32_t MMCCR; /* 65 */ + __IO uint32_t MMCRIR; + __IO uint32_t MMCTIR; + __IO uint32_t MMCRIMR; + __IO uint32_t MMCTIMR; /* 69 */ + uint32_t RESERVED3[14]; + __IO uint32_t MMCTGFSCCR; /* 84 */ + __IO uint32_t MMCTGFMSCCR; + uint32_t RESERVED4[5]; + __IO uint32_t MMCTGFCR; + uint32_t RESERVED5[10]; + __IO uint32_t MMCRFCECR; + __IO uint32_t MMCRFAECR; + uint32_t RESERVED6[10]; + __IO uint32_t MMCRGUFCR; + uint32_t RESERVED7[334]; + __IO uint32_t PTPTSCR; + __IO uint32_t PTPSSIR; + __IO uint32_t PTPTSHR; + __IO uint32_t PTPTSLR; + __IO uint32_t PTPTSHUR; + __IO uint32_t PTPTSLUR; + __IO uint32_t PTPTSAR; + __IO uint32_t PTPTTHR; + __IO uint32_t PTPTTLR; + uint32_t RESERVED8[567]; + __IO uint32_t DMABMR; + __IO uint32_t DMATPDR; + __IO uint32_t DMARPDR; + __IO uint32_t DMARDLAR; + __IO uint32_t DMATDLAR; + __IO uint32_t DMASR; + __IO uint32_t DMAOMR; + __IO uint32_t DMAIER; + __IO uint32_t DMAMFBOCR; + uint32_t RESERVED9[9]; + __IO uint32_t DMACHTDR; + __IO uint32_t DMACHRDR; + __IO uint32_t DMACHTBAR; + __IO uint32_t DMACHRBAR; +} ETH_TypeDef; + +/** + * @brief External Interrupt/Event Controller + */ + +typedef struct +{ + __IO uint32_t IMR; + __IO uint32_t EMR; + __IO uint32_t RTSR; + __IO uint32_t FTSR; + __IO uint32_t SWIER; + __IO uint32_t PR; +} EXTI_TypeDef; + +/** + * @brief FLASH Registers + */ + +typedef struct +{ + __IO uint32_t ACR; + __IO uint32_t KEYR; + __IO uint32_t OPTKEYR; + __IO uint32_t SR; + __IO uint32_t CR; + __IO uint32_t AR; + __IO uint32_t RESERVED; + __IO uint32_t OBR; + __IO uint32_t WRPR; +#ifdef STM32F10X_XL + uint32_t RESERVED1[8]; + __IO uint32_t KEYR2; + uint32_t RESERVED2; + __IO uint32_t SR2; + __IO uint32_t CR2; + __IO uint32_t AR2; +#endif /* STM32F10X_XL */ +} FLASH_TypeDef; + +/** + * @brief Option Bytes Registers + */ + +typedef struct +{ + __IO uint16_t RDP; + __IO uint16_t USER; + __IO uint16_t Data0; + __IO uint16_t Data1; + __IO uint16_t WRP0; + __IO uint16_t WRP1; + __IO uint16_t WRP2; + __IO uint16_t WRP3; +} OB_TypeDef; + +/** + * @brief Flexible Static Memory Controller + */ + +typedef struct +{ + __IO uint32_t BTCR[8]; +} FSMC_Bank1_TypeDef; + +/** + * @brief Flexible Static Memory Controller Bank1E + */ + +typedef struct +{ + __IO uint32_t BWTR[7]; +} FSMC_Bank1E_TypeDef; + +/** + * @brief Flexible Static Memory Controller Bank2 + */ + +typedef struct +{ + __IO uint32_t PCR2; + __IO uint32_t SR2; + __IO uint32_t PMEM2; + __IO uint32_t PATT2; + uint32_t RESERVED0; + __IO uint32_t ECCR2; +} FSMC_Bank2_TypeDef; + +/** + * @brief Flexible Static Memory Controller Bank3 + */ + +typedef struct +{ + __IO uint32_t PCR3; + __IO uint32_t SR3; + __IO uint32_t PMEM3; + __IO uint32_t PATT3; + uint32_t RESERVED0; + __IO uint32_t ECCR3; +} FSMC_Bank3_TypeDef; + +/** + * @brief Flexible Static Memory Controller Bank4 + */ + +typedef struct +{ + __IO uint32_t PCR4; + __IO uint32_t SR4; + __IO uint32_t PMEM4; + __IO uint32_t PATT4; + __IO uint32_t PIO4; +} FSMC_Bank4_TypeDef; + +/** + * @brief General Purpose I/O + */ + +typedef struct +{ + __IO uint32_t CRL; + __IO uint32_t CRH; + __IO uint32_t IDR; + __IO uint32_t ODR; + __IO uint32_t BSRR; + __IO uint32_t BRR; + __IO uint32_t LCKR; +} GPIO_TypeDef; + +/** + * @brief Alternate Function I/O + */ + +typedef struct +{ + __IO uint32_t EVCR; + __IO uint32_t MAPR; + __IO uint32_t EXTICR[4]; + uint32_t RESERVED0; + __IO uint32_t MAPR2; +} AFIO_TypeDef; +/** + * @brief Inter Integrated Circuit Interface + */ + +typedef struct +{ + __IO uint16_t CR1; + uint16_t RESERVED0; + __IO uint16_t CR2; + uint16_t RESERVED1; + __IO uint16_t OAR1; + uint16_t RESERVED2; + __IO uint16_t OAR2; + uint16_t RESERVED3; + __IO uint16_t DR; + uint16_t RESERVED4; + __IO uint16_t SR1; + uint16_t RESERVED5; + __IO uint16_t SR2; + uint16_t RESERVED6; + __IO uint16_t CCR; + uint16_t RESERVED7; + __IO uint16_t TRISE; + uint16_t RESERVED8; +} I2C_TypeDef; + +/** + * @brief Independent WATCHDOG + */ + +typedef struct +{ + __IO uint32_t KR; + __IO uint32_t PR; + __IO uint32_t RLR; + __IO uint32_t SR; +} IWDG_TypeDef; + +/** + * @brief Power Control + */ + +typedef struct +{ + __IO uint32_t CR; + __IO uint32_t CSR; +} PWR_TypeDef; + +/** + * @brief Reset and Clock Control + */ + +typedef struct +{ + __IO uint32_t CR; + __IO uint32_t CFGR; + __IO uint32_t CIR; + __IO uint32_t APB2RSTR; + __IO uint32_t APB1RSTR; + __IO uint32_t AHBENR; + __IO uint32_t APB2ENR; + __IO uint32_t APB1ENR; + __IO uint32_t BDCR; + __IO uint32_t CSR; + +#ifdef STM32F10X_CL + __IO uint32_t AHBRSTR; + __IO uint32_t CFGR2; +#endif /* STM32F10X_CL */ + +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) + uint32_t RESERVED0; + __IO uint32_t CFGR2; +#endif /* STM32F10X_LD_VL || STM32F10X_MD_VL || STM32F10X_HD_VL */ +} RCC_TypeDef; + +/** + * @brief Real-Time Clock + */ + +typedef struct +{ + __IO uint16_t CRH; + uint16_t RESERVED0; + __IO uint16_t CRL; + uint16_t RESERVED1; + __IO uint16_t PRLH; + uint16_t RESERVED2; + __IO uint16_t PRLL; + uint16_t RESERVED3; + __IO uint16_t DIVH; + uint16_t RESERVED4; + __IO uint16_t DIVL; + uint16_t RESERVED5; + __IO uint16_t CNTH; + uint16_t RESERVED6; + __IO uint16_t CNTL; + uint16_t RESERVED7; + __IO uint16_t ALRH; + uint16_t RESERVED8; + __IO uint16_t ALRL; + uint16_t RESERVED9; +} RTC_TypeDef; + +/** + * @brief SD host Interface + */ + +typedef struct +{ + __IO uint32_t POWER; + __IO uint32_t CLKCR; + __IO uint32_t ARG; + __IO uint32_t CMD; + __I uint32_t RESPCMD; + __I uint32_t RESP1; + __I uint32_t RESP2; + __I uint32_t RESP3; + __I uint32_t RESP4; + __IO uint32_t DTIMER; + __IO uint32_t DLEN; + __IO uint32_t DCTRL; + __I uint32_t DCOUNT; + __I uint32_t STA; + __IO uint32_t ICR; + __IO uint32_t MASK; + uint32_t RESERVED0[2]; + __I uint32_t FIFOCNT; + uint32_t RESERVED1[13]; + __IO uint32_t FIFO; +} SDIO_TypeDef; + +/** + * @brief Serial Peripheral Interface + */ + +typedef struct +{ + __IO uint16_t CR1; + uint16_t RESERVED0; + __IO uint16_t CR2; + uint16_t RESERVED1; + __IO uint16_t SR; + uint16_t RESERVED2; + __IO uint16_t DR; + uint16_t RESERVED3; + __IO uint16_t CRCPR; + uint16_t RESERVED4; + __IO uint16_t RXCRCR; + uint16_t RESERVED5; + __IO uint16_t TXCRCR; + uint16_t RESERVED6; + __IO uint16_t I2SCFGR; + uint16_t RESERVED7; + __IO uint16_t I2SPR; + uint16_t RESERVED8; +} SPI_TypeDef; + +/** + * @brief TIM + */ + +typedef struct +{ + __IO uint16_t CR1; + uint16_t RESERVED0; + __IO uint16_t CR2; + uint16_t RESERVED1; + __IO uint16_t SMCR; + uint16_t RESERVED2; + __IO uint16_t DIER; + uint16_t RESERVED3; + __IO uint16_t SR; + uint16_t RESERVED4; + __IO uint16_t EGR; + uint16_t RESERVED5; + __IO uint16_t CCMR1; + uint16_t RESERVED6; + __IO uint16_t CCMR2; + uint16_t RESERVED7; + __IO uint16_t CCER; + uint16_t RESERVED8; + __IO uint16_t CNT; + uint16_t RESERVED9; + __IO uint16_t PSC; + uint16_t RESERVED10; + __IO uint16_t ARR; + uint16_t RESERVED11; + __IO uint16_t RCR; + uint16_t RESERVED12; + __IO uint16_t CCR1; + uint16_t RESERVED13; + __IO uint16_t CCR2; + uint16_t RESERVED14; + __IO uint16_t CCR3; + uint16_t RESERVED15; + __IO uint16_t CCR4; + uint16_t RESERVED16; + __IO uint16_t BDTR; + uint16_t RESERVED17; + __IO uint16_t DCR; + uint16_t RESERVED18; + __IO uint16_t DMAR; + uint16_t RESERVED19; +} TIM_TypeDef; + +/** + * @brief Universal Synchronous Asynchronous Receiver Transmitter + */ + +typedef struct +{ + __IO uint16_t SR; + uint16_t RESERVED0; + __IO uint16_t DR; + uint16_t RESERVED1; + __IO uint16_t BRR; + uint16_t RESERVED2; + __IO uint16_t CR1; + uint16_t RESERVED3; + __IO uint16_t CR2; + uint16_t RESERVED4; + __IO uint16_t CR3; + uint16_t RESERVED5; + __IO uint16_t GTPR; + uint16_t RESERVED6; +} USART_TypeDef; + +/** + * @brief Window WATCHDOG + */ + +typedef struct +{ + __IO uint32_t CR; + __IO uint32_t CFR; + __IO uint32_t SR; +} WWDG_TypeDef; + +/** + * @} + */ + +/** @addtogroup Peripheral_memory_map + * @{ + */ + + +#define FLASH_BASE ((uint32_t)0x08000000) /*!< FLASH base address in the alias region */ +#define SRAM_BASE ((uint32_t)0x20000000) /*!< SRAM base address in the alias region */ +#define PERIPH_BASE ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */ + +#define SRAM_BB_BASE ((uint32_t)0x22000000) /*!< SRAM base address in the bit-band region */ +#define PERIPH_BB_BASE ((uint32_t)0x42000000) /*!< Peripheral base address in the bit-band region */ + +#define FSMC_R_BASE ((uint32_t)0xA0000000) /*!< FSMC registers base address */ + +/*!< Peripheral memory map */ +#define APB1PERIPH_BASE PERIPH_BASE +#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000) +#define AHBPERIPH_BASE (PERIPH_BASE + 0x20000) + +#define TIM2_BASE (APB1PERIPH_BASE + 0x0000) +#define TIM3_BASE (APB1PERIPH_BASE + 0x0400) +#define TIM4_BASE (APB1PERIPH_BASE + 0x0800) +#define TIM5_BASE (APB1PERIPH_BASE + 0x0C00) +#define TIM6_BASE (APB1PERIPH_BASE + 0x1000) +#define TIM7_BASE (APB1PERIPH_BASE + 0x1400) +#define TIM12_BASE (APB1PERIPH_BASE + 0x1800) +#define TIM13_BASE (APB1PERIPH_BASE + 0x1C00) +#define TIM14_BASE (APB1PERIPH_BASE + 0x2000) +#define RTC_BASE (APB1PERIPH_BASE + 0x2800) +#define WWDG_BASE (APB1PERIPH_BASE + 0x2C00) +#define IWDG_BASE (APB1PERIPH_BASE + 0x3000) +#define SPI2_BASE (APB1PERIPH_BASE + 0x3800) +#define SPI3_BASE (APB1PERIPH_BASE + 0x3C00) +#define USART2_BASE (APB1PERIPH_BASE + 0x4400) +#define USART3_BASE (APB1PERIPH_BASE + 0x4800) +#define UART4_BASE (APB1PERIPH_BASE + 0x4C00) +#define UART5_BASE (APB1PERIPH_BASE + 0x5000) +#define I2C1_BASE (APB1PERIPH_BASE + 0x5400) +#define I2C2_BASE (APB1PERIPH_BASE + 0x5800) +#define CAN1_BASE (APB1PERIPH_BASE + 0x6400) +#define CAN2_BASE (APB1PERIPH_BASE + 0x6800) +#define BKP_BASE (APB1PERIPH_BASE + 0x6C00) +#define PWR_BASE (APB1PERIPH_BASE + 0x7000) +#define DAC_BASE (APB1PERIPH_BASE + 0x7400) +#define CEC_BASE (APB1PERIPH_BASE + 0x7800) + +#define AFIO_BASE (APB2PERIPH_BASE + 0x0000) +#define EXTI_BASE (APB2PERIPH_BASE + 0x0400) +#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800) +#define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00) +#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000) +#define GPIOD_BASE (APB2PERIPH_BASE + 0x1400) +#define GPIOE_BASE (APB2PERIPH_BASE + 0x1800) +#define GPIOF_BASE (APB2PERIPH_BASE + 0x1C00) +#define GPIOG_BASE (APB2PERIPH_BASE + 0x2000) +#define ADC1_BASE (APB2PERIPH_BASE + 0x2400) +#define ADC2_BASE (APB2PERIPH_BASE + 0x2800) +#define TIM1_BASE (APB2PERIPH_BASE + 0x2C00) +#define SPI1_BASE (APB2PERIPH_BASE + 0x3000) +#define TIM8_BASE (APB2PERIPH_BASE + 0x3400) +#define USART1_BASE (APB2PERIPH_BASE + 0x3800) +#define ADC3_BASE (APB2PERIPH_BASE + 0x3C00) +#define TIM15_BASE (APB2PERIPH_BASE + 0x4000) +#define TIM16_BASE (APB2PERIPH_BASE + 0x4400) +#define TIM17_BASE (APB2PERIPH_BASE + 0x4800) +#define TIM9_BASE (APB2PERIPH_BASE + 0x4C00) +#define TIM10_BASE (APB2PERIPH_BASE + 0x5000) +#define TIM11_BASE (APB2PERIPH_BASE + 0x5400) + +#define SDIO_BASE (PERIPH_BASE + 0x18000) + +#define DMA1_BASE (AHBPERIPH_BASE + 0x0000) +#define DMA1_Channel1_BASE (AHBPERIPH_BASE + 0x0008) +#define DMA1_Channel2_BASE (AHBPERIPH_BASE + 0x001C) +#define DMA1_Channel3_BASE (AHBPERIPH_BASE + 0x0030) +#define DMA1_Channel4_BASE (AHBPERIPH_BASE + 0x0044) +#define DMA1_Channel5_BASE (AHBPERIPH_BASE + 0x0058) +#define DMA1_Channel6_BASE (AHBPERIPH_BASE + 0x006C) +#define DMA1_Channel7_BASE (AHBPERIPH_BASE + 0x0080) +#define DMA2_BASE (AHBPERIPH_BASE + 0x0400) +#define DMA2_Channel1_BASE (AHBPERIPH_BASE + 0x0408) +#define DMA2_Channel2_BASE (AHBPERIPH_BASE + 0x041C) +#define DMA2_Channel3_BASE (AHBPERIPH_BASE + 0x0430) +#define DMA2_Channel4_BASE (AHBPERIPH_BASE + 0x0444) +#define DMA2_Channel5_BASE (AHBPERIPH_BASE + 0x0458) +#define RCC_BASE (AHBPERIPH_BASE + 0x1000) +#define CRC_BASE (AHBPERIPH_BASE + 0x3000) + +#define FLASH_R_BASE (AHBPERIPH_BASE + 0x2000) /*!< Flash registers base address */ +#define OB_BASE ((uint32_t)0x1FFFF800) /*!< Flash Option Bytes base address */ + +#define ETH_BASE (AHBPERIPH_BASE + 0x8000) +#define ETH_MAC_BASE (ETH_BASE) +#define ETH_MMC_BASE (ETH_BASE + 0x0100) +#define ETH_PTP_BASE (ETH_BASE + 0x0700) +#define ETH_DMA_BASE (ETH_BASE + 0x1000) + +#define FSMC_Bank1_R_BASE (FSMC_R_BASE + 0x0000) /*!< FSMC Bank1 registers base address */ +#define FSMC_Bank1E_R_BASE (FSMC_R_BASE + 0x0104) /*!< FSMC Bank1E registers base address */ +#define FSMC_Bank2_R_BASE (FSMC_R_BASE + 0x0060) /*!< FSMC Bank2 registers base address */ +#define FSMC_Bank3_R_BASE (FSMC_R_BASE + 0x0080) /*!< FSMC Bank3 registers base address */ +#define FSMC_Bank4_R_BASE (FSMC_R_BASE + 0x00A0) /*!< FSMC Bank4 registers base address */ + +#define DBGMCU_BASE ((uint32_t)0xE0042000) /*!< Debug MCU registers base address */ + +/** + * @} + */ + +/** @addtogroup Peripheral_declaration + * @{ + */ + +#define TIM2 ((TIM_TypeDef *) TIM2_BASE) +#define TIM3 ((TIM_TypeDef *) TIM3_BASE) +#define TIM4 ((TIM_TypeDef *) TIM4_BASE) +#define TIM5 ((TIM_TypeDef *) TIM5_BASE) +#define TIM6 ((TIM_TypeDef *) TIM6_BASE) +#define TIM7 ((TIM_TypeDef *) TIM7_BASE) +#define TIM12 ((TIM_TypeDef *) TIM12_BASE) +#define TIM13 ((TIM_TypeDef *) TIM13_BASE) +#define TIM14 ((TIM_TypeDef *) TIM14_BASE) +#define RTC ((RTC_TypeDef *) RTC_BASE) +#define WWDG ((WWDG_TypeDef *) WWDG_BASE) +#define IWDG ((IWDG_TypeDef *) IWDG_BASE) +#define SPI2 ((SPI_TypeDef *) SPI2_BASE) +#define SPI3 ((SPI_TypeDef *) SPI3_BASE) +#define USART2 ((USART_TypeDef *) USART2_BASE) +#define USART3 ((USART_TypeDef *) USART3_BASE) +#define UART4 ((USART_TypeDef *) UART4_BASE) +#define UART5 ((USART_TypeDef *) UART5_BASE) +#define I2C1 ((I2C_TypeDef *) I2C1_BASE) +#define I2C2 ((I2C_TypeDef *) I2C2_BASE) +#define CAN1 ((CAN_TypeDef *) CAN1_BASE) +#define CAN2 ((CAN_TypeDef *) CAN2_BASE) +#define BKP ((BKP_TypeDef *) BKP_BASE) +#define PWR ((PWR_TypeDef *) PWR_BASE) +#define DAC ((DAC_TypeDef *) DAC_BASE) +#define CEC ((CEC_TypeDef *) CEC_BASE) +#define AFIO ((AFIO_TypeDef *) AFIO_BASE) +#define EXTI ((EXTI_TypeDef *) EXTI_BASE) +#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) +#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE) +#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE) +#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE) +#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE) +#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE) +#define GPIOG ((GPIO_TypeDef *) GPIOG_BASE) +#define ADC1 ((ADC_TypeDef *) ADC1_BASE) +#define ADC2 ((ADC_TypeDef *) ADC2_BASE) +#define TIM1 ((TIM_TypeDef *) TIM1_BASE) +#define SPI1 ((SPI_TypeDef *) SPI1_BASE) +#define TIM8 ((TIM_TypeDef *) TIM8_BASE) +#define USART1 ((USART_TypeDef *) USART1_BASE) +#define ADC3 ((ADC_TypeDef *) ADC3_BASE) +#define TIM15 ((TIM_TypeDef *) TIM15_BASE) +#define TIM16 ((TIM_TypeDef *) TIM16_BASE) +#define TIM17 ((TIM_TypeDef *) TIM17_BASE) +#define TIM9 ((TIM_TypeDef *) TIM9_BASE) +#define TIM10 ((TIM_TypeDef *) TIM10_BASE) +#define TIM11 ((TIM_TypeDef *) TIM11_BASE) +#define SDIO ((SDIO_TypeDef *) SDIO_BASE) +#define DMA1 ((DMA_TypeDef *) DMA1_BASE) +#define DMA2 ((DMA_TypeDef *) DMA2_BASE) +#define DMA1_Channel1 ((DMA_Channel_TypeDef *) DMA1_Channel1_BASE) +#define DMA1_Channel2 ((DMA_Channel_TypeDef *) DMA1_Channel2_BASE) +#define DMA1_Channel3 ((DMA_Channel_TypeDef *) DMA1_Channel3_BASE) +#define DMA1_Channel4 ((DMA_Channel_TypeDef *) DMA1_Channel4_BASE) +#define DMA1_Channel5 ((DMA_Channel_TypeDef *) DMA1_Channel5_BASE) +#define DMA1_Channel6 ((DMA_Channel_TypeDef *) DMA1_Channel6_BASE) +#define DMA1_Channel7 ((DMA_Channel_TypeDef *) DMA1_Channel7_BASE) +#define DMA2_Channel1 ((DMA_Channel_TypeDef *) DMA2_Channel1_BASE) +#define DMA2_Channel2 ((DMA_Channel_TypeDef *) DMA2_Channel2_BASE) +#define DMA2_Channel3 ((DMA_Channel_TypeDef *) DMA2_Channel3_BASE) +#define DMA2_Channel4 ((DMA_Channel_TypeDef *) DMA2_Channel4_BASE) +#define DMA2_Channel5 ((DMA_Channel_TypeDef *) DMA2_Channel5_BASE) +#define RCC ((RCC_TypeDef *) RCC_BASE) +#define CRC ((CRC_TypeDef *) CRC_BASE) +#define FLASH ((FLASH_TypeDef *) FLASH_R_BASE) +#define OB ((OB_TypeDef *) OB_BASE) +#define ETH ((ETH_TypeDef *) ETH_BASE) +#define FSMC_Bank1 ((FSMC_Bank1_TypeDef *) FSMC_Bank1_R_BASE) +#define FSMC_Bank1E ((FSMC_Bank1E_TypeDef *) FSMC_Bank1E_R_BASE) +#define FSMC_Bank2 ((FSMC_Bank2_TypeDef *) FSMC_Bank2_R_BASE) +#define FSMC_Bank3 ((FSMC_Bank3_TypeDef *) FSMC_Bank3_R_BASE) +#define FSMC_Bank4 ((FSMC_Bank4_TypeDef *) FSMC_Bank4_R_BASE) +#define DBGMCU ((DBGMCU_TypeDef *) DBGMCU_BASE) + +/** + * @} + */ + +/** @addtogroup Exported_constants + * @{ + */ + + /** @addtogroup Peripheral_Registers_Bits_Definition + * @{ + */ + +/******************************************************************************/ +/* Peripheral Registers_Bits_Definition */ +/******************************************************************************/ + +/******************************************************************************/ +/* */ +/* CRC calculation unit */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for CRC_DR register *********************/ +#define CRC_DR_DR ((uint32_t)0xFFFFFFFF) /*!< Data register bits */ + + +/******************* Bit definition for CRC_IDR register ********************/ +#define CRC_IDR_IDR ((uint8_t)0xFF) /*!< General-purpose 8-bit data register bits */ + + +/******************** Bit definition for CRC_CR register ********************/ +#define CRC_CR_RESET ((uint8_t)0x01) /*!< RESET bit */ + +/******************************************************************************/ +/* */ +/* Power Control */ +/* */ +/******************************************************************************/ + +/******************** Bit definition for PWR_CR register ********************/ +#define PWR_CR_LPDS ((uint16_t)0x0001) /*!< Low-Power Deepsleep */ +#define PWR_CR_PDDS ((uint16_t)0x0002) /*!< Power Down Deepsleep */ +#define PWR_CR_CWUF ((uint16_t)0x0004) /*!< Clear Wakeup Flag */ +#define PWR_CR_CSBF ((uint16_t)0x0008) /*!< Clear Standby Flag */ +#define PWR_CR_PVDE ((uint16_t)0x0010) /*!< Power Voltage Detector Enable */ + +#define PWR_CR_PLS ((uint16_t)0x00E0) /*!< PLS[2:0] bits (PVD Level Selection) */ +#define PWR_CR_PLS_0 ((uint16_t)0x0020) /*!< Bit 0 */ +#define PWR_CR_PLS_1 ((uint16_t)0x0040) /*!< Bit 1 */ +#define PWR_CR_PLS_2 ((uint16_t)0x0080) /*!< Bit 2 */ + +/*!< PVD level configuration */ +#define PWR_CR_PLS_2V2 ((uint16_t)0x0000) /*!< PVD level 2.2V */ +#define PWR_CR_PLS_2V3 ((uint16_t)0x0020) /*!< PVD level 2.3V */ +#define PWR_CR_PLS_2V4 ((uint16_t)0x0040) /*!< PVD level 2.4V */ +#define PWR_CR_PLS_2V5 ((uint16_t)0x0060) /*!< PVD level 2.5V */ +#define PWR_CR_PLS_2V6 ((uint16_t)0x0080) /*!< PVD level 2.6V */ +#define PWR_CR_PLS_2V7 ((uint16_t)0x00A0) /*!< PVD level 2.7V */ +#define PWR_CR_PLS_2V8 ((uint16_t)0x00C0) /*!< PVD level 2.8V */ +#define PWR_CR_PLS_2V9 ((uint16_t)0x00E0) /*!< PVD level 2.9V */ + +#define PWR_CR_DBP ((uint16_t)0x0100) /*!< Disable Backup Domain write protection */ + + +/******************* Bit definition for PWR_CSR register ********************/ +#define PWR_CSR_WUF ((uint16_t)0x0001) /*!< Wakeup Flag */ +#define PWR_CSR_SBF ((uint16_t)0x0002) /*!< Standby Flag */ +#define PWR_CSR_PVDO ((uint16_t)0x0004) /*!< PVD Output */ +#define PWR_CSR_EWUP ((uint16_t)0x0100) /*!< Enable WKUP pin */ + +/******************************************************************************/ +/* */ +/* Backup registers */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for BKP_DR1 register ********************/ +#define BKP_DR1_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR2 register ********************/ +#define BKP_DR2_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR3 register ********************/ +#define BKP_DR3_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR4 register ********************/ +#define BKP_DR4_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR5 register ********************/ +#define BKP_DR5_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR6 register ********************/ +#define BKP_DR6_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR7 register ********************/ +#define BKP_DR7_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR8 register ********************/ +#define BKP_DR8_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR9 register ********************/ +#define BKP_DR9_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR10 register *******************/ +#define BKP_DR10_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR11 register *******************/ +#define BKP_DR11_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR12 register *******************/ +#define BKP_DR12_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR13 register *******************/ +#define BKP_DR13_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR14 register *******************/ +#define BKP_DR14_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR15 register *******************/ +#define BKP_DR15_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR16 register *******************/ +#define BKP_DR16_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR17 register *******************/ +#define BKP_DR17_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/****************** Bit definition for BKP_DR18 register ********************/ +#define BKP_DR18_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR19 register *******************/ +#define BKP_DR19_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR20 register *******************/ +#define BKP_DR20_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR21 register *******************/ +#define BKP_DR21_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR22 register *******************/ +#define BKP_DR22_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR23 register *******************/ +#define BKP_DR23_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR24 register *******************/ +#define BKP_DR24_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR25 register *******************/ +#define BKP_DR25_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR26 register *******************/ +#define BKP_DR26_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR27 register *******************/ +#define BKP_DR27_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR28 register *******************/ +#define BKP_DR28_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR29 register *******************/ +#define BKP_DR29_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR30 register *******************/ +#define BKP_DR30_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR31 register *******************/ +#define BKP_DR31_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR32 register *******************/ +#define BKP_DR32_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR33 register *******************/ +#define BKP_DR33_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR34 register *******************/ +#define BKP_DR34_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR35 register *******************/ +#define BKP_DR35_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR36 register *******************/ +#define BKP_DR36_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR37 register *******************/ +#define BKP_DR37_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR38 register *******************/ +#define BKP_DR38_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR39 register *******************/ +#define BKP_DR39_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR40 register *******************/ +#define BKP_DR40_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR41 register *******************/ +#define BKP_DR41_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR42 register *******************/ +#define BKP_DR42_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/****************** Bit definition for BKP_RTCCR register *******************/ +#define BKP_RTCCR_CAL ((uint16_t)0x007F) /*!< Calibration value */ +#define BKP_RTCCR_CCO ((uint16_t)0x0080) /*!< Calibration Clock Output */ +#define BKP_RTCCR_ASOE ((uint16_t)0x0100) /*!< Alarm or Second Output Enable */ +#define BKP_RTCCR_ASOS ((uint16_t)0x0200) /*!< Alarm or Second Output Selection */ + +/******************** Bit definition for BKP_CR register ********************/ +#define BKP_CR_TPE ((uint8_t)0x01) /*!< TAMPER pin enable */ +#define BKP_CR_TPAL ((uint8_t)0x02) /*!< TAMPER pin active level */ + +/******************* Bit definition for BKP_CSR register ********************/ +#define BKP_CSR_CTE ((uint16_t)0x0001) /*!< Clear Tamper event */ +#define BKP_CSR_CTI ((uint16_t)0x0002) /*!< Clear Tamper Interrupt */ +#define BKP_CSR_TPIE ((uint16_t)0x0004) /*!< TAMPER Pin interrupt enable */ +#define BKP_CSR_TEF ((uint16_t)0x0100) /*!< Tamper Event Flag */ +#define BKP_CSR_TIF ((uint16_t)0x0200) /*!< Tamper Interrupt Flag */ + +/******************************************************************************/ +/* */ +/* Reset and Clock Control */ +/* */ +/******************************************************************************/ + +/******************** Bit definition for RCC_CR register ********************/ +#define RCC_CR_HSION ((uint32_t)0x00000001) /*!< Internal High Speed clock enable */ +#define RCC_CR_HSIRDY ((uint32_t)0x00000002) /*!< Internal High Speed clock ready flag */ +#define RCC_CR_HSITRIM ((uint32_t)0x000000F8) /*!< Internal High Speed clock trimming */ +#define RCC_CR_HSICAL ((uint32_t)0x0000FF00) /*!< Internal High Speed clock Calibration */ +#define RCC_CR_HSEON ((uint32_t)0x00010000) /*!< External High Speed clock enable */ +#define RCC_CR_HSERDY ((uint32_t)0x00020000) /*!< External High Speed clock ready flag */ +#define RCC_CR_HSEBYP ((uint32_t)0x00040000) /*!< External High Speed clock Bypass */ +#define RCC_CR_CSSON ((uint32_t)0x00080000) /*!< Clock Security System enable */ +#define RCC_CR_PLLON ((uint32_t)0x01000000) /*!< PLL enable */ +#define RCC_CR_PLLRDY ((uint32_t)0x02000000) /*!< PLL clock ready flag */ + +#ifdef STM32F10X_CL + #define RCC_CR_PLL2ON ((uint32_t)0x04000000) /*!< PLL2 enable */ + #define RCC_CR_PLL2RDY ((uint32_t)0x08000000) /*!< PLL2 clock ready flag */ + #define RCC_CR_PLL3ON ((uint32_t)0x10000000) /*!< PLL3 enable */ + #define RCC_CR_PLL3RDY ((uint32_t)0x20000000) /*!< PLL3 clock ready flag */ +#endif /* STM32F10X_CL */ + +/******************* Bit definition for RCC_CFGR register *******************/ +/*!< SW configuration */ +#define RCC_CFGR_SW ((uint32_t)0x00000003) /*!< SW[1:0] bits (System clock Switch) */ +#define RCC_CFGR_SW_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define RCC_CFGR_SW_1 ((uint32_t)0x00000002) /*!< Bit 1 */ + +#define RCC_CFGR_SW_HSI ((uint32_t)0x00000000) /*!< HSI selected as system clock */ +#define RCC_CFGR_SW_HSE ((uint32_t)0x00000001) /*!< HSE selected as system clock */ +#define RCC_CFGR_SW_PLL ((uint32_t)0x00000002) /*!< PLL selected as system clock */ + +/*!< SWS configuration */ +#define RCC_CFGR_SWS ((uint32_t)0x0000000C) /*!< SWS[1:0] bits (System Clock Switch Status) */ +#define RCC_CFGR_SWS_0 ((uint32_t)0x00000004) /*!< Bit 0 */ +#define RCC_CFGR_SWS_1 ((uint32_t)0x00000008) /*!< Bit 1 */ + +#define RCC_CFGR_SWS_HSI ((uint32_t)0x00000000) /*!< HSI oscillator used as system clock */ +#define RCC_CFGR_SWS_HSE ((uint32_t)0x00000004) /*!< HSE oscillator used as system clock */ +#define RCC_CFGR_SWS_PLL ((uint32_t)0x00000008) /*!< PLL used as system clock */ + +/*!< HPRE configuration */ +#define RCC_CFGR_HPRE ((uint32_t)0x000000F0) /*!< HPRE[3:0] bits (AHB prescaler) */ +#define RCC_CFGR_HPRE_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define RCC_CFGR_HPRE_1 ((uint32_t)0x00000020) /*!< Bit 1 */ +#define RCC_CFGR_HPRE_2 ((uint32_t)0x00000040) /*!< Bit 2 */ +#define RCC_CFGR_HPRE_3 ((uint32_t)0x00000080) /*!< Bit 3 */ + +#define RCC_CFGR_HPRE_DIV1 ((uint32_t)0x00000000) /*!< SYSCLK not divided */ +#define RCC_CFGR_HPRE_DIV2 ((uint32_t)0x00000080) /*!< SYSCLK divided by 2 */ +#define RCC_CFGR_HPRE_DIV4 ((uint32_t)0x00000090) /*!< SYSCLK divided by 4 */ +#define RCC_CFGR_HPRE_DIV8 ((uint32_t)0x000000A0) /*!< SYSCLK divided by 8 */ +#define RCC_CFGR_HPRE_DIV16 ((uint32_t)0x000000B0) /*!< SYSCLK divided by 16 */ +#define RCC_CFGR_HPRE_DIV64 ((uint32_t)0x000000C0) /*!< SYSCLK divided by 64 */ +#define RCC_CFGR_HPRE_DIV128 ((uint32_t)0x000000D0) /*!< SYSCLK divided by 128 */ +#define RCC_CFGR_HPRE_DIV256 ((uint32_t)0x000000E0) /*!< SYSCLK divided by 256 */ +#define RCC_CFGR_HPRE_DIV512 ((uint32_t)0x000000F0) /*!< SYSCLK divided by 512 */ + +/*!< PPRE1 configuration */ +#define RCC_CFGR_PPRE1 ((uint32_t)0x00000700) /*!< PRE1[2:0] bits (APB1 prescaler) */ +#define RCC_CFGR_PPRE1_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define RCC_CFGR_PPRE1_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define RCC_CFGR_PPRE1_2 ((uint32_t)0x00000400) /*!< Bit 2 */ + +#define RCC_CFGR_PPRE1_DIV1 ((uint32_t)0x00000000) /*!< HCLK not divided */ +#define RCC_CFGR_PPRE1_DIV2 ((uint32_t)0x00000400) /*!< HCLK divided by 2 */ +#define RCC_CFGR_PPRE1_DIV4 ((uint32_t)0x00000500) /*!< HCLK divided by 4 */ +#define RCC_CFGR_PPRE1_DIV8 ((uint32_t)0x00000600) /*!< HCLK divided by 8 */ +#define RCC_CFGR_PPRE1_DIV16 ((uint32_t)0x00000700) /*!< HCLK divided by 16 */ + +/*!< PPRE2 configuration */ +#define RCC_CFGR_PPRE2 ((uint32_t)0x00003800) /*!< PRE2[2:0] bits (APB2 prescaler) */ +#define RCC_CFGR_PPRE2_0 ((uint32_t)0x00000800) /*!< Bit 0 */ +#define RCC_CFGR_PPRE2_1 ((uint32_t)0x00001000) /*!< Bit 1 */ +#define RCC_CFGR_PPRE2_2 ((uint32_t)0x00002000) /*!< Bit 2 */ + +#define RCC_CFGR_PPRE2_DIV1 ((uint32_t)0x00000000) /*!< HCLK not divided */ +#define RCC_CFGR_PPRE2_DIV2 ((uint32_t)0x00002000) /*!< HCLK divided by 2 */ +#define RCC_CFGR_PPRE2_DIV4 ((uint32_t)0x00002800) /*!< HCLK divided by 4 */ +#define RCC_CFGR_PPRE2_DIV8 ((uint32_t)0x00003000) /*!< HCLK divided by 8 */ +#define RCC_CFGR_PPRE2_DIV16 ((uint32_t)0x00003800) /*!< HCLK divided by 16 */ + +/*!< ADCPPRE configuration */ +#define RCC_CFGR_ADCPRE ((uint32_t)0x0000C000) /*!< ADCPRE[1:0] bits (ADC prescaler) */ +#define RCC_CFGR_ADCPRE_0 ((uint32_t)0x00004000) /*!< Bit 0 */ +#define RCC_CFGR_ADCPRE_1 ((uint32_t)0x00008000) /*!< Bit 1 */ + +#define RCC_CFGR_ADCPRE_DIV2 ((uint32_t)0x00000000) /*!< PCLK2 divided by 2 */ +#define RCC_CFGR_ADCPRE_DIV4 ((uint32_t)0x00004000) /*!< PCLK2 divided by 4 */ +#define RCC_CFGR_ADCPRE_DIV6 ((uint32_t)0x00008000) /*!< PCLK2 divided by 6 */ +#define RCC_CFGR_ADCPRE_DIV8 ((uint32_t)0x0000C000) /*!< PCLK2 divided by 8 */ + +#define RCC_CFGR_PLLSRC ((uint32_t)0x00010000) /*!< PLL entry clock source */ + +#define RCC_CFGR_PLLXTPRE ((uint32_t)0x00020000) /*!< HSE divider for PLL entry */ + +/*!< PLLMUL configuration */ +#define RCC_CFGR_PLLMULL ((uint32_t)0x003C0000) /*!< PLLMUL[3:0] bits (PLL multiplication factor) */ +#define RCC_CFGR_PLLMULL_0 ((uint32_t)0x00040000) /*!< Bit 0 */ +#define RCC_CFGR_PLLMULL_1 ((uint32_t)0x00080000) /*!< Bit 1 */ +#define RCC_CFGR_PLLMULL_2 ((uint32_t)0x00100000) /*!< Bit 2 */ +#define RCC_CFGR_PLLMULL_3 ((uint32_t)0x00200000) /*!< Bit 3 */ + +#ifdef STM32F10X_CL + #define RCC_CFGR_PLLSRC_HSI_Div2 ((uint32_t)0x00000000) /*!< HSI clock divided by 2 selected as PLL entry clock source */ + #define RCC_CFGR_PLLSRC_PREDIV1 ((uint32_t)0x00010000) /*!< PREDIV1 clock selected as PLL entry clock source */ + + #define RCC_CFGR_PLLXTPRE_PREDIV1 ((uint32_t)0x00000000) /*!< PREDIV1 clock not divided for PLL entry */ + #define RCC_CFGR_PLLXTPRE_PREDIV1_Div2 ((uint32_t)0x00020000) /*!< PREDIV1 clock divided by 2 for PLL entry */ + + #define RCC_CFGR_PLLMULL4 ((uint32_t)0x00080000) /*!< PLL input clock * 4 */ + #define RCC_CFGR_PLLMULL5 ((uint32_t)0x000C0000) /*!< PLL input clock * 5 */ + #define RCC_CFGR_PLLMULL6 ((uint32_t)0x00100000) /*!< PLL input clock * 6 */ + #define RCC_CFGR_PLLMULL7 ((uint32_t)0x00140000) /*!< PLL input clock * 7 */ + #define RCC_CFGR_PLLMULL8 ((uint32_t)0x00180000) /*!< PLL input clock * 8 */ + #define RCC_CFGR_PLLMULL9 ((uint32_t)0x001C0000) /*!< PLL input clock * 9 */ + #define RCC_CFGR_PLLMULL6_5 ((uint32_t)0x00340000) /*!< PLL input clock * 6.5 */ + + #define RCC_CFGR_OTGFSPRE ((uint32_t)0x00400000) /*!< USB OTG FS prescaler */ + +/*!< MCO configuration */ + #define RCC_CFGR_MCO ((uint32_t)0x0F000000) /*!< MCO[3:0] bits (Microcontroller Clock Output) */ + #define RCC_CFGR_MCO_0 ((uint32_t)0x01000000) /*!< Bit 0 */ + #define RCC_CFGR_MCO_1 ((uint32_t)0x02000000) /*!< Bit 1 */ + #define RCC_CFGR_MCO_2 ((uint32_t)0x04000000) /*!< Bit 2 */ + #define RCC_CFGR_MCO_3 ((uint32_t)0x08000000) /*!< Bit 3 */ + + #define RCC_CFGR_MCO_NOCLOCK ((uint32_t)0x00000000) /*!< No clock */ + #define RCC_CFGR_MCO_SYSCLK ((uint32_t)0x04000000) /*!< System clock selected as MCO source */ + #define RCC_CFGR_MCO_HSI ((uint32_t)0x05000000) /*!< HSI clock selected as MCO source */ + #define RCC_CFGR_MCO_HSE ((uint32_t)0x06000000) /*!< HSE clock selected as MCO source */ + #define RCC_CFGR_MCO_PLLCLK_Div2 ((uint32_t)0x07000000) /*!< PLL clock divided by 2 selected as MCO source */ + #define RCC_CFGR_MCO_PLL2CLK ((uint32_t)0x08000000) /*!< PLL2 clock selected as MCO source*/ + #define RCC_CFGR_MCO_PLL3CLK_Div2 ((uint32_t)0x09000000) /*!< PLL3 clock divided by 2 selected as MCO source*/ + #define RCC_CFGR_MCO_Ext_HSE ((uint32_t)0x0A000000) /*!< XT1 external 3-25 MHz oscillator clock selected as MCO source */ + #define RCC_CFGR_MCO_PLL3CLK ((uint32_t)0x0B000000) /*!< PLL3 clock selected as MCO source */ +#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) + #define RCC_CFGR_PLLSRC_HSI_Div2 ((uint32_t)0x00000000) /*!< HSI clock divided by 2 selected as PLL entry clock source */ + #define RCC_CFGR_PLLSRC_PREDIV1 ((uint32_t)0x00010000) /*!< PREDIV1 clock selected as PLL entry clock source */ + + #define RCC_CFGR_PLLXTPRE_PREDIV1 ((uint32_t)0x00000000) /*!< PREDIV1 clock not divided for PLL entry */ + #define RCC_CFGR_PLLXTPRE_PREDIV1_Div2 ((uint32_t)0x00020000) /*!< PREDIV1 clock divided by 2 for PLL entry */ + + #define RCC_CFGR_PLLMULL2 ((uint32_t)0x00000000) /*!< PLL input clock*2 */ + #define RCC_CFGR_PLLMULL3 ((uint32_t)0x00040000) /*!< PLL input clock*3 */ + #define RCC_CFGR_PLLMULL4 ((uint32_t)0x00080000) /*!< PLL input clock*4 */ + #define RCC_CFGR_PLLMULL5 ((uint32_t)0x000C0000) /*!< PLL input clock*5 */ + #define RCC_CFGR_PLLMULL6 ((uint32_t)0x00100000) /*!< PLL input clock*6 */ + #define RCC_CFGR_PLLMULL7 ((uint32_t)0x00140000) /*!< PLL input clock*7 */ + #define RCC_CFGR_PLLMULL8 ((uint32_t)0x00180000) /*!< PLL input clock*8 */ + #define RCC_CFGR_PLLMULL9 ((uint32_t)0x001C0000) /*!< PLL input clock*9 */ + #define RCC_CFGR_PLLMULL10 ((uint32_t)0x00200000) /*!< PLL input clock10 */ + #define RCC_CFGR_PLLMULL11 ((uint32_t)0x00240000) /*!< PLL input clock*11 */ + #define RCC_CFGR_PLLMULL12 ((uint32_t)0x00280000) /*!< PLL input clock*12 */ + #define RCC_CFGR_PLLMULL13 ((uint32_t)0x002C0000) /*!< PLL input clock*13 */ + #define RCC_CFGR_PLLMULL14 ((uint32_t)0x00300000) /*!< PLL input clock*14 */ + #define RCC_CFGR_PLLMULL15 ((uint32_t)0x00340000) /*!< PLL input clock*15 */ + #define RCC_CFGR_PLLMULL16 ((uint32_t)0x00380000) /*!< PLL input clock*16 */ + +/*!< MCO configuration */ + #define RCC_CFGR_MCO ((uint32_t)0x07000000) /*!< MCO[2:0] bits (Microcontroller Clock Output) */ + #define RCC_CFGR_MCO_0 ((uint32_t)0x01000000) /*!< Bit 0 */ + #define RCC_CFGR_MCO_1 ((uint32_t)0x02000000) /*!< Bit 1 */ + #define RCC_CFGR_MCO_2 ((uint32_t)0x04000000) /*!< Bit 2 */ + + #define RCC_CFGR_MCO_NOCLOCK ((uint32_t)0x00000000) /*!< No clock */ + #define RCC_CFGR_MCO_SYSCLK ((uint32_t)0x04000000) /*!< System clock selected as MCO source */ + #define RCC_CFGR_MCO_HSI ((uint32_t)0x05000000) /*!< HSI clock selected as MCO source */ + #define RCC_CFGR_MCO_HSE ((uint32_t)0x06000000) /*!< HSE clock selected as MCO source */ + #define RCC_CFGR_MCO_PLL ((uint32_t)0x07000000) /*!< PLL clock divided by 2 selected as MCO source */ +#else + #define RCC_CFGR_PLLSRC_HSI_Div2 ((uint32_t)0x00000000) /*!< HSI clock divided by 2 selected as PLL entry clock source */ + #define RCC_CFGR_PLLSRC_HSE ((uint32_t)0x00010000) /*!< HSE clock selected as PLL entry clock source */ + + #define RCC_CFGR_PLLXTPRE_HSE ((uint32_t)0x00000000) /*!< HSE clock not divided for PLL entry */ + #define RCC_CFGR_PLLXTPRE_HSE_Div2 ((uint32_t)0x00020000) /*!< HSE clock divided by 2 for PLL entry */ + + #define RCC_CFGR_PLLMULL2 ((uint32_t)0x00000000) /*!< PLL input clock*2 */ + #define RCC_CFGR_PLLMULL3 ((uint32_t)0x00040000) /*!< PLL input clock*3 */ + #define RCC_CFGR_PLLMULL4 ((uint32_t)0x00080000) /*!< PLL input clock*4 */ + #define RCC_CFGR_PLLMULL5 ((uint32_t)0x000C0000) /*!< PLL input clock*5 */ + #define RCC_CFGR_PLLMULL6 ((uint32_t)0x00100000) /*!< PLL input clock*6 */ + #define RCC_CFGR_PLLMULL7 ((uint32_t)0x00140000) /*!< PLL input clock*7 */ + #define RCC_CFGR_PLLMULL8 ((uint32_t)0x00180000) /*!< PLL input clock*8 */ + #define RCC_CFGR_PLLMULL9 ((uint32_t)0x001C0000) /*!< PLL input clock*9 */ + #define RCC_CFGR_PLLMULL10 ((uint32_t)0x00200000) /*!< PLL input clock10 */ + #define RCC_CFGR_PLLMULL11 ((uint32_t)0x00240000) /*!< PLL input clock*11 */ + #define RCC_CFGR_PLLMULL12 ((uint32_t)0x00280000) /*!< PLL input clock*12 */ + #define RCC_CFGR_PLLMULL13 ((uint32_t)0x002C0000) /*!< PLL input clock*13 */ + #define RCC_CFGR_PLLMULL14 ((uint32_t)0x00300000) /*!< PLL input clock*14 */ + #define RCC_CFGR_PLLMULL15 ((uint32_t)0x00340000) /*!< PLL input clock*15 */ + #define RCC_CFGR_PLLMULL16 ((uint32_t)0x00380000) /*!< PLL input clock*16 */ + #define RCC_CFGR_USBPRE ((uint32_t)0x00400000) /*!< USB Device prescaler */ + +/*!< MCO configuration */ + #define RCC_CFGR_MCO ((uint32_t)0x07000000) /*!< MCO[2:0] bits (Microcontroller Clock Output) */ + #define RCC_CFGR_MCO_0 ((uint32_t)0x01000000) /*!< Bit 0 */ + #define RCC_CFGR_MCO_1 ((uint32_t)0x02000000) /*!< Bit 1 */ + #define RCC_CFGR_MCO_2 ((uint32_t)0x04000000) /*!< Bit 2 */ + + #define RCC_CFGR_MCO_NOCLOCK ((uint32_t)0x00000000) /*!< No clock */ + #define RCC_CFGR_MCO_SYSCLK ((uint32_t)0x04000000) /*!< System clock selected as MCO source */ + #define RCC_CFGR_MCO_HSI ((uint32_t)0x05000000) /*!< HSI clock selected as MCO source */ + #define RCC_CFGR_MCO_HSE ((uint32_t)0x06000000) /*!< HSE clock selected as MCO source */ + #define RCC_CFGR_MCO_PLL ((uint32_t)0x07000000) /*!< PLL clock divided by 2 selected as MCO source */ +#endif /* STM32F10X_CL */ + +/*!<****************** Bit definition for RCC_CIR register ********************/ +#define RCC_CIR_LSIRDYF ((uint32_t)0x00000001) /*!< LSI Ready Interrupt flag */ +#define RCC_CIR_LSERDYF ((uint32_t)0x00000002) /*!< LSE Ready Interrupt flag */ +#define RCC_CIR_HSIRDYF ((uint32_t)0x00000004) /*!< HSI Ready Interrupt flag */ +#define RCC_CIR_HSERDYF ((uint32_t)0x00000008) /*!< HSE Ready Interrupt flag */ +#define RCC_CIR_PLLRDYF ((uint32_t)0x00000010) /*!< PLL Ready Interrupt flag */ +#define RCC_CIR_CSSF ((uint32_t)0x00000080) /*!< Clock Security System Interrupt flag */ +#define RCC_CIR_LSIRDYIE ((uint32_t)0x00000100) /*!< LSI Ready Interrupt Enable */ +#define RCC_CIR_LSERDYIE ((uint32_t)0x00000200) /*!< LSE Ready Interrupt Enable */ +#define RCC_CIR_HSIRDYIE ((uint32_t)0x00000400) /*!< HSI Ready Interrupt Enable */ +#define RCC_CIR_HSERDYIE ((uint32_t)0x00000800) /*!< HSE Ready Interrupt Enable */ +#define RCC_CIR_PLLRDYIE ((uint32_t)0x00001000) /*!< PLL Ready Interrupt Enable */ +#define RCC_CIR_LSIRDYC ((uint32_t)0x00010000) /*!< LSI Ready Interrupt Clear */ +#define RCC_CIR_LSERDYC ((uint32_t)0x00020000) /*!< LSE Ready Interrupt Clear */ +#define RCC_CIR_HSIRDYC ((uint32_t)0x00040000) /*!< HSI Ready Interrupt Clear */ +#define RCC_CIR_HSERDYC ((uint32_t)0x00080000) /*!< HSE Ready Interrupt Clear */ +#define RCC_CIR_PLLRDYC ((uint32_t)0x00100000) /*!< PLL Ready Interrupt Clear */ +#define RCC_CIR_CSSC ((uint32_t)0x00800000) /*!< Clock Security System Interrupt Clear */ + +#ifdef STM32F10X_CL + #define RCC_CIR_PLL2RDYF ((uint32_t)0x00000020) /*!< PLL2 Ready Interrupt flag */ + #define RCC_CIR_PLL3RDYF ((uint32_t)0x00000040) /*!< PLL3 Ready Interrupt flag */ + #define RCC_CIR_PLL2RDYIE ((uint32_t)0x00002000) /*!< PLL2 Ready Interrupt Enable */ + #define RCC_CIR_PLL3RDYIE ((uint32_t)0x00004000) /*!< PLL3 Ready Interrupt Enable */ + #define RCC_CIR_PLL2RDYC ((uint32_t)0x00200000) /*!< PLL2 Ready Interrupt Clear */ + #define RCC_CIR_PLL3RDYC ((uint32_t)0x00400000) /*!< PLL3 Ready Interrupt Clear */ +#endif /* STM32F10X_CL */ + +/***************** Bit definition for RCC_APB2RSTR register *****************/ +#define RCC_APB2RSTR_AFIORST ((uint32_t)0x00000001) /*!< Alternate Function I/O reset */ +#define RCC_APB2RSTR_IOPARST ((uint32_t)0x00000004) /*!< I/O port A reset */ +#define RCC_APB2RSTR_IOPBRST ((uint32_t)0x00000008) /*!< I/O port B reset */ +#define RCC_APB2RSTR_IOPCRST ((uint32_t)0x00000010) /*!< I/O port C reset */ +#define RCC_APB2RSTR_IOPDRST ((uint32_t)0x00000020) /*!< I/O port D reset */ +#define RCC_APB2RSTR_ADC1RST ((uint32_t)0x00000200) /*!< ADC 1 interface reset */ + +#if !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD_VL) +#define RCC_APB2RSTR_ADC2RST ((uint32_t)0x00000400) /*!< ADC 2 interface reset */ +#endif + +#define RCC_APB2RSTR_TIM1RST ((uint32_t)0x00000800) /*!< TIM1 Timer reset */ +#define RCC_APB2RSTR_SPI1RST ((uint32_t)0x00001000) /*!< SPI 1 reset */ +#define RCC_APB2RSTR_USART1RST ((uint32_t)0x00004000) /*!< USART1 reset */ + +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) +#define RCC_APB2RSTR_TIM15RST ((uint32_t)0x00010000) /*!< TIM15 Timer reset */ +#define RCC_APB2RSTR_TIM16RST ((uint32_t)0x00020000) /*!< TIM16 Timer reset */ +#define RCC_APB2RSTR_TIM17RST ((uint32_t)0x00040000) /*!< TIM17 Timer reset */ +#endif + +#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) + #define RCC_APB2RSTR_IOPERST ((uint32_t)0x00000040) /*!< I/O port E reset */ +#endif /* STM32F10X_LD && STM32F10X_LD_VL */ + +#if defined (STM32F10X_HD) || defined (STM32F10X_XL) + #define RCC_APB2RSTR_IOPFRST ((uint32_t)0x00000080) /*!< I/O port F reset */ + #define RCC_APB2RSTR_IOPGRST ((uint32_t)0x00000100) /*!< I/O port G reset */ + #define RCC_APB2RSTR_TIM8RST ((uint32_t)0x00002000) /*!< TIM8 Timer reset */ + #define RCC_APB2RSTR_ADC3RST ((uint32_t)0x00008000) /*!< ADC3 interface reset */ +#endif + +#if defined (STM32F10X_HD_VL) + #define RCC_APB2RSTR_IOPFRST ((uint32_t)0x00000080) /*!< I/O port F reset */ + #define RCC_APB2RSTR_IOPGRST ((uint32_t)0x00000100) /*!< I/O port G reset */ +#endif + +#ifdef STM32F10X_XL + #define RCC_APB2RSTR_TIM9RST ((uint32_t)0x00080000) /*!< TIM9 Timer reset */ + #define RCC_APB2RSTR_TIM10RST ((uint32_t)0x00100000) /*!< TIM10 Timer reset */ + #define RCC_APB2RSTR_TIM11RST ((uint32_t)0x00200000) /*!< TIM11 Timer reset */ +#endif /* STM32F10X_XL */ + +/***************** Bit definition for RCC_APB1RSTR register *****************/ +#define RCC_APB1RSTR_TIM2RST ((uint32_t)0x00000001) /*!< Timer 2 reset */ +#define RCC_APB1RSTR_TIM3RST ((uint32_t)0x00000002) /*!< Timer 3 reset */ +#define RCC_APB1RSTR_WWDGRST ((uint32_t)0x00000800) /*!< Window Watchdog reset */ +#define RCC_APB1RSTR_USART2RST ((uint32_t)0x00020000) /*!< USART 2 reset */ +#define RCC_APB1RSTR_I2C1RST ((uint32_t)0x00200000) /*!< I2C 1 reset */ + +#if !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD_VL) +#define RCC_APB1RSTR_CAN1RST ((uint32_t)0x02000000) /*!< CAN1 reset */ +#endif + +#define RCC_APB1RSTR_BKPRST ((uint32_t)0x08000000) /*!< Backup interface reset */ +#define RCC_APB1RSTR_PWRRST ((uint32_t)0x10000000) /*!< Power interface reset */ + +#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) + #define RCC_APB1RSTR_TIM4RST ((uint32_t)0x00000004) /*!< Timer 4 reset */ + #define RCC_APB1RSTR_SPI2RST ((uint32_t)0x00004000) /*!< SPI 2 reset */ + #define RCC_APB1RSTR_USART3RST ((uint32_t)0x00040000) /*!< USART 3 reset */ + #define RCC_APB1RSTR_I2C2RST ((uint32_t)0x00400000) /*!< I2C 2 reset */ +#endif /* STM32F10X_LD && STM32F10X_LD_VL */ + +#if defined (STM32F10X_HD) || defined (STM32F10X_MD) || defined (STM32F10X_LD) || defined (STM32F10X_XL) + #define RCC_APB1RSTR_USBRST ((uint32_t)0x00800000) /*!< USB Device reset */ +#endif + +#if defined (STM32F10X_HD) || defined (STM32F10X_CL) || defined (STM32F10X_XL) + #define RCC_APB1RSTR_TIM5RST ((uint32_t)0x00000008) /*!< Timer 5 reset */ + #define RCC_APB1RSTR_TIM6RST ((uint32_t)0x00000010) /*!< Timer 6 reset */ + #define RCC_APB1RSTR_TIM7RST ((uint32_t)0x00000020) /*!< Timer 7 reset */ + #define RCC_APB1RSTR_SPI3RST ((uint32_t)0x00008000) /*!< SPI 3 reset */ + #define RCC_APB1RSTR_UART4RST ((uint32_t)0x00080000) /*!< UART 4 reset */ + #define RCC_APB1RSTR_UART5RST ((uint32_t)0x00100000) /*!< UART 5 reset */ + #define RCC_APB1RSTR_DACRST ((uint32_t)0x20000000) /*!< DAC interface reset */ +#endif + +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) + #define RCC_APB1RSTR_TIM6RST ((uint32_t)0x00000010) /*!< Timer 6 reset */ + #define RCC_APB1RSTR_TIM7RST ((uint32_t)0x00000020) /*!< Timer 7 reset */ + #define RCC_APB1RSTR_DACRST ((uint32_t)0x20000000) /*!< DAC interface reset */ + #define RCC_APB1RSTR_CECRST ((uint32_t)0x40000000) /*!< CEC interface reset */ +#endif + +#if defined (STM32F10X_HD_VL) + #define RCC_APB1RSTR_TIM5RST ((uint32_t)0x00000008) /*!< Timer 5 reset */ + #define RCC_APB1RSTR_TIM12RST ((uint32_t)0x00000040) /*!< TIM12 Timer reset */ + #define RCC_APB1RSTR_TIM13RST ((uint32_t)0x00000080) /*!< TIM13 Timer reset */ + #define RCC_APB1RSTR_TIM14RST ((uint32_t)0x00000100) /*!< TIM14 Timer reset */ + #define RCC_APB1RSTR_SPI3RST ((uint32_t)0x00008000) /*!< SPI 3 reset */ + #define RCC_APB1RSTR_UART4RST ((uint32_t)0x00080000) /*!< UART 4 reset */ + #define RCC_APB1RSTR_UART5RST ((uint32_t)0x00100000) /*!< UART 5 reset */ +#endif + +#ifdef STM32F10X_CL + #define RCC_APB1RSTR_CAN2RST ((uint32_t)0x04000000) /*!< CAN2 reset */ +#endif /* STM32F10X_CL */ + +#ifdef STM32F10X_XL + #define RCC_APB1RSTR_TIM12RST ((uint32_t)0x00000040) /*!< TIM12 Timer reset */ + #define RCC_APB1RSTR_TIM13RST ((uint32_t)0x00000080) /*!< TIM13 Timer reset */ + #define RCC_APB1RSTR_TIM14RST ((uint32_t)0x00000100) /*!< TIM14 Timer reset */ +#endif /* STM32F10X_XL */ + +/****************** Bit definition for RCC_AHBENR register ******************/ +#define RCC_AHBENR_DMA1EN ((uint16_t)0x0001) /*!< DMA1 clock enable */ +#define RCC_AHBENR_SRAMEN ((uint16_t)0x0004) /*!< SRAM interface clock enable */ +#define RCC_AHBENR_FLITFEN ((uint16_t)0x0010) /*!< FLITF clock enable */ +#define RCC_AHBENR_CRCEN ((uint16_t)0x0040) /*!< CRC clock enable */ + +#if defined (STM32F10X_HD) || defined (STM32F10X_CL) || defined (STM32F10X_HD_VL) + #define RCC_AHBENR_DMA2EN ((uint16_t)0x0002) /*!< DMA2 clock enable */ +#endif + +#if defined (STM32F10X_HD) || defined (STM32F10X_XL) + #define RCC_AHBENR_FSMCEN ((uint16_t)0x0100) /*!< FSMC clock enable */ + #define RCC_AHBENR_SDIOEN ((uint16_t)0x0400) /*!< SDIO clock enable */ +#endif + +#if defined (STM32F10X_HD_VL) + #define RCC_AHBENR_FSMCEN ((uint16_t)0x0100) /*!< FSMC clock enable */ +#endif + +#ifdef STM32F10X_CL + #define RCC_AHBENR_OTGFSEN ((uint32_t)0x00001000) /*!< USB OTG FS clock enable */ + #define RCC_AHBENR_ETHMACEN ((uint32_t)0x00004000) /*!< ETHERNET MAC clock enable */ + #define RCC_AHBENR_ETHMACTXEN ((uint32_t)0x00008000) /*!< ETHERNET MAC Tx clock enable */ + #define RCC_AHBENR_ETHMACRXEN ((uint32_t)0x00010000) /*!< ETHERNET MAC Rx clock enable */ +#endif /* STM32F10X_CL */ + +/****************** Bit definition for RCC_APB2ENR register *****************/ +#define RCC_APB2ENR_AFIOEN ((uint32_t)0x00000001) /*!< Alternate Function I/O clock enable */ +#define RCC_APB2ENR_IOPAEN ((uint32_t)0x00000004) /*!< I/O port A clock enable */ +#define RCC_APB2ENR_IOPBEN ((uint32_t)0x00000008) /*!< I/O port B clock enable */ +#define RCC_APB2ENR_IOPCEN ((uint32_t)0x00000010) /*!< I/O port C clock enable */ +#define RCC_APB2ENR_IOPDEN ((uint32_t)0x00000020) /*!< I/O port D clock enable */ +#define RCC_APB2ENR_ADC1EN ((uint32_t)0x00000200) /*!< ADC 1 interface clock enable */ + +#if !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD_VL) +#define RCC_APB2ENR_ADC2EN ((uint32_t)0x00000400) /*!< ADC 2 interface clock enable */ +#endif + +#define RCC_APB2ENR_TIM1EN ((uint32_t)0x00000800) /*!< TIM1 Timer clock enable */ +#define RCC_APB2ENR_SPI1EN ((uint32_t)0x00001000) /*!< SPI 1 clock enable */ +#define RCC_APB2ENR_USART1EN ((uint32_t)0x00004000) /*!< USART1 clock enable */ + +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) +#define RCC_APB2ENR_TIM15EN ((uint32_t)0x00010000) /*!< TIM15 Timer clock enable */ +#define RCC_APB2ENR_TIM16EN ((uint32_t)0x00020000) /*!< TIM16 Timer clock enable */ +#define RCC_APB2ENR_TIM17EN ((uint32_t)0x00040000) /*!< TIM17 Timer clock enable */ +#endif + +#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) + #define RCC_APB2ENR_IOPEEN ((uint32_t)0x00000040) /*!< I/O port E clock enable */ +#endif /* STM32F10X_LD && STM32F10X_LD_VL */ + +#if defined (STM32F10X_HD) || defined (STM32F10X_XL) + #define RCC_APB2ENR_IOPFEN ((uint32_t)0x00000080) /*!< I/O port F clock enable */ + #define RCC_APB2ENR_IOPGEN ((uint32_t)0x00000100) /*!< I/O port G clock enable */ + #define RCC_APB2ENR_TIM8EN ((uint32_t)0x00002000) /*!< TIM8 Timer clock enable */ + #define RCC_APB2ENR_ADC3EN ((uint32_t)0x00008000) /*!< DMA1 clock enable */ +#endif + +#if defined (STM32F10X_HD_VL) + #define RCC_APB2ENR_IOPFEN ((uint32_t)0x00000080) /*!< I/O port F clock enable */ + #define RCC_APB2ENR_IOPGEN ((uint32_t)0x00000100) /*!< I/O port G clock enable */ +#endif + +#ifdef STM32F10X_XL + #define RCC_APB2ENR_TIM9EN ((uint32_t)0x00080000) /*!< TIM9 Timer clock enable */ + #define RCC_APB2ENR_TIM10EN ((uint32_t)0x00100000) /*!< TIM10 Timer clock enable */ + #define RCC_APB2ENR_TIM11EN ((uint32_t)0x00200000) /*!< TIM11 Timer clock enable */ +#endif + +/***************** Bit definition for RCC_APB1ENR register ******************/ +#define RCC_APB1ENR_TIM2EN ((uint32_t)0x00000001) /*!< Timer 2 clock enabled*/ +#define RCC_APB1ENR_TIM3EN ((uint32_t)0x00000002) /*!< Timer 3 clock enable */ +#define RCC_APB1ENR_WWDGEN ((uint32_t)0x00000800) /*!< Window Watchdog clock enable */ +#define RCC_APB1ENR_USART2EN ((uint32_t)0x00020000) /*!< USART 2 clock enable */ +#define RCC_APB1ENR_I2C1EN ((uint32_t)0x00200000) /*!< I2C 1 clock enable */ + +#if !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD_VL) +#define RCC_APB1ENR_CAN1EN ((uint32_t)0x02000000) /*!< CAN1 clock enable */ +#endif + +#define RCC_APB1ENR_BKPEN ((uint32_t)0x08000000) /*!< Backup interface clock enable */ +#define RCC_APB1ENR_PWREN ((uint32_t)0x10000000) /*!< Power interface clock enable */ + +#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) + #define RCC_APB1ENR_TIM4EN ((uint32_t)0x00000004) /*!< Timer 4 clock enable */ + #define RCC_APB1ENR_SPI2EN ((uint32_t)0x00004000) /*!< SPI 2 clock enable */ + #define RCC_APB1ENR_USART3EN ((uint32_t)0x00040000) /*!< USART 3 clock enable */ + #define RCC_APB1ENR_I2C2EN ((uint32_t)0x00400000) /*!< I2C 2 clock enable */ +#endif /* STM32F10X_LD && STM32F10X_LD_VL */ + +#if defined (STM32F10X_HD) || defined (STM32F10X_MD) || defined (STM32F10X_LD) + #define RCC_APB1ENR_USBEN ((uint32_t)0x00800000) /*!< USB Device clock enable */ +#endif + +#if defined (STM32F10X_HD) || defined (STM32F10X_CL) + #define RCC_APB1ENR_TIM5EN ((uint32_t)0x00000008) /*!< Timer 5 clock enable */ + #define RCC_APB1ENR_TIM6EN ((uint32_t)0x00000010) /*!< Timer 6 clock enable */ + #define RCC_APB1ENR_TIM7EN ((uint32_t)0x00000020) /*!< Timer 7 clock enable */ + #define RCC_APB1ENR_SPI3EN ((uint32_t)0x00008000) /*!< SPI 3 clock enable */ + #define RCC_APB1ENR_UART4EN ((uint32_t)0x00080000) /*!< UART 4 clock enable */ + #define RCC_APB1ENR_UART5EN ((uint32_t)0x00100000) /*!< UART 5 clock enable */ + #define RCC_APB1ENR_DACEN ((uint32_t)0x20000000) /*!< DAC interface clock enable */ +#endif + +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) + #define RCC_APB1ENR_TIM6EN ((uint32_t)0x00000010) /*!< Timer 6 clock enable */ + #define RCC_APB1ENR_TIM7EN ((uint32_t)0x00000020) /*!< Timer 7 clock enable */ + #define RCC_APB1ENR_DACEN ((uint32_t)0x20000000) /*!< DAC interface clock enable */ + #define RCC_APB1ENR_CECEN ((uint32_t)0x40000000) /*!< CEC interface clock enable */ +#endif + +#ifdef STM32F10X_HD_VL + #define RCC_APB1ENR_TIM5EN ((uint32_t)0x00000008) /*!< Timer 5 clock enable */ + #define RCC_APB1ENR_TIM12EN ((uint32_t)0x00000040) /*!< TIM12 Timer clock enable */ + #define RCC_APB1ENR_TIM13EN ((uint32_t)0x00000080) /*!< TIM13 Timer clock enable */ + #define RCC_APB1ENR_TIM14EN ((uint32_t)0x00000100) /*!< TIM14 Timer clock enable */ + #define RCC_APB1ENR_SPI3EN ((uint32_t)0x00008000) /*!< SPI 3 clock enable */ + #define RCC_APB1ENR_UART4EN ((uint32_t)0x00080000) /*!< UART 4 clock enable */ + #define RCC_APB1ENR_UART5EN ((uint32_t)0x00100000) /*!< UART 5 clock enable */ +#endif /* STM32F10X_HD_VL */ + +#ifdef STM32F10X_CL + #define RCC_APB1ENR_CAN2EN ((uint32_t)0x04000000) /*!< CAN2 clock enable */ +#endif /* STM32F10X_CL */ + +#ifdef STM32F10X_XL + #define RCC_APB1ENR_TIM12EN ((uint32_t)0x00000040) /*!< TIM12 Timer clock enable */ + #define RCC_APB1ENR_TIM13EN ((uint32_t)0x00000080) /*!< TIM13 Timer clock enable */ + #define RCC_APB1ENR_TIM14EN ((uint32_t)0x00000100) /*!< TIM14 Timer clock enable */ +#endif /* STM32F10X_XL */ + +/******************* Bit definition for RCC_BDCR register *******************/ +#define RCC_BDCR_LSEON ((uint32_t)0x00000001) /*!< External Low Speed oscillator enable */ +#define RCC_BDCR_LSERDY ((uint32_t)0x00000002) /*!< External Low Speed oscillator Ready */ +#define RCC_BDCR_LSEBYP ((uint32_t)0x00000004) /*!< External Low Speed oscillator Bypass */ + +#define RCC_BDCR_RTCSEL ((uint32_t)0x00000300) /*!< RTCSEL[1:0] bits (RTC clock source selection) */ +#define RCC_BDCR_RTCSEL_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define RCC_BDCR_RTCSEL_1 ((uint32_t)0x00000200) /*!< Bit 1 */ + +/*!< RTC congiguration */ +#define RCC_BDCR_RTCSEL_NOCLOCK ((uint32_t)0x00000000) /*!< No clock */ +#define RCC_BDCR_RTCSEL_LSE ((uint32_t)0x00000100) /*!< LSE oscillator clock used as RTC clock */ +#define RCC_BDCR_RTCSEL_LSI ((uint32_t)0x00000200) /*!< LSI oscillator clock used as RTC clock */ +#define RCC_BDCR_RTCSEL_HSE ((uint32_t)0x00000300) /*!< HSE oscillator clock divided by 128 used as RTC clock */ + +#define RCC_BDCR_RTCEN ((uint32_t)0x00008000) /*!< RTC clock enable */ +#define RCC_BDCR_BDRST ((uint32_t)0x00010000) /*!< Backup domain software reset */ + +/******************* Bit definition for RCC_CSR register ********************/ +#define RCC_CSR_LSION ((uint32_t)0x00000001) /*!< Internal Low Speed oscillator enable */ +#define RCC_CSR_LSIRDY ((uint32_t)0x00000002) /*!< Internal Low Speed oscillator Ready */ +#define RCC_CSR_RMVF ((uint32_t)0x01000000) /*!< Remove reset flag */ +#define RCC_CSR_PINRSTF ((uint32_t)0x04000000) /*!< PIN reset flag */ +#define RCC_CSR_PORRSTF ((uint32_t)0x08000000) /*!< POR/PDR reset flag */ +#define RCC_CSR_SFTRSTF ((uint32_t)0x10000000) /*!< Software Reset flag */ +#define RCC_CSR_IWDGRSTF ((uint32_t)0x20000000) /*!< Independent Watchdog reset flag */ +#define RCC_CSR_WWDGRSTF ((uint32_t)0x40000000) /*!< Window watchdog reset flag */ +#define RCC_CSR_LPWRRSTF ((uint32_t)0x80000000) /*!< Low-Power reset flag */ + +#ifdef STM32F10X_CL +/******************* Bit definition for RCC_AHBRSTR register ****************/ + #define RCC_AHBRSTR_OTGFSRST ((uint32_t)0x00001000) /*!< USB OTG FS reset */ + #define RCC_AHBRSTR_ETHMACRST ((uint32_t)0x00004000) /*!< ETHERNET MAC reset */ + +/******************* Bit definition for RCC_CFGR2 register ******************/ +/*!< PREDIV1 configuration */ + #define RCC_CFGR2_PREDIV1 ((uint32_t)0x0000000F) /*!< PREDIV1[3:0] bits */ + #define RCC_CFGR2_PREDIV1_0 ((uint32_t)0x00000001) /*!< Bit 0 */ + #define RCC_CFGR2_PREDIV1_1 ((uint32_t)0x00000002) /*!< Bit 1 */ + #define RCC_CFGR2_PREDIV1_2 ((uint32_t)0x00000004) /*!< Bit 2 */ + #define RCC_CFGR2_PREDIV1_3 ((uint32_t)0x00000008) /*!< Bit 3 */ + + #define RCC_CFGR2_PREDIV1_DIV1 ((uint32_t)0x00000000) /*!< PREDIV1 input clock not divided */ + #define RCC_CFGR2_PREDIV1_DIV2 ((uint32_t)0x00000001) /*!< PREDIV1 input clock divided by 2 */ + #define RCC_CFGR2_PREDIV1_DIV3 ((uint32_t)0x00000002) /*!< PREDIV1 input clock divided by 3 */ + #define RCC_CFGR2_PREDIV1_DIV4 ((uint32_t)0x00000003) /*!< PREDIV1 input clock divided by 4 */ + #define RCC_CFGR2_PREDIV1_DIV5 ((uint32_t)0x00000004) /*!< PREDIV1 input clock divided by 5 */ + #define RCC_CFGR2_PREDIV1_DIV6 ((uint32_t)0x00000005) /*!< PREDIV1 input clock divided by 6 */ + #define RCC_CFGR2_PREDIV1_DIV7 ((uint32_t)0x00000006) /*!< PREDIV1 input clock divided by 7 */ + #define RCC_CFGR2_PREDIV1_DIV8 ((uint32_t)0x00000007) /*!< PREDIV1 input clock divided by 8 */ + #define RCC_CFGR2_PREDIV1_DIV9 ((uint32_t)0x00000008) /*!< PREDIV1 input clock divided by 9 */ + #define RCC_CFGR2_PREDIV1_DIV10 ((uint32_t)0x00000009) /*!< PREDIV1 input clock divided by 10 */ + #define RCC_CFGR2_PREDIV1_DIV11 ((uint32_t)0x0000000A) /*!< PREDIV1 input clock divided by 11 */ + #define RCC_CFGR2_PREDIV1_DIV12 ((uint32_t)0x0000000B) /*!< PREDIV1 input clock divided by 12 */ + #define RCC_CFGR2_PREDIV1_DIV13 ((uint32_t)0x0000000C) /*!< PREDIV1 input clock divided by 13 */ + #define RCC_CFGR2_PREDIV1_DIV14 ((uint32_t)0x0000000D) /*!< PREDIV1 input clock divided by 14 */ + #define RCC_CFGR2_PREDIV1_DIV15 ((uint32_t)0x0000000E) /*!< PREDIV1 input clock divided by 15 */ + #define RCC_CFGR2_PREDIV1_DIV16 ((uint32_t)0x0000000F) /*!< PREDIV1 input clock divided by 16 */ + +/*!< PREDIV2 configuration */ + #define RCC_CFGR2_PREDIV2 ((uint32_t)0x000000F0) /*!< PREDIV2[3:0] bits */ + #define RCC_CFGR2_PREDIV2_0 ((uint32_t)0x00000010) /*!< Bit 0 */ + #define RCC_CFGR2_PREDIV2_1 ((uint32_t)0x00000020) /*!< Bit 1 */ + #define RCC_CFGR2_PREDIV2_2 ((uint32_t)0x00000040) /*!< Bit 2 */ + #define RCC_CFGR2_PREDIV2_3 ((uint32_t)0x00000080) /*!< Bit 3 */ + + #define RCC_CFGR2_PREDIV2_DIV1 ((uint32_t)0x00000000) /*!< PREDIV2 input clock not divided */ + #define RCC_CFGR2_PREDIV2_DIV2 ((uint32_t)0x00000010) /*!< PREDIV2 input clock divided by 2 */ + #define RCC_CFGR2_PREDIV2_DIV3 ((uint32_t)0x00000020) /*!< PREDIV2 input clock divided by 3 */ + #define RCC_CFGR2_PREDIV2_DIV4 ((uint32_t)0x00000030) /*!< PREDIV2 input clock divided by 4 */ + #define RCC_CFGR2_PREDIV2_DIV5 ((uint32_t)0x00000040) /*!< PREDIV2 input clock divided by 5 */ + #define RCC_CFGR2_PREDIV2_DIV6 ((uint32_t)0x00000050) /*!< PREDIV2 input clock divided by 6 */ + #define RCC_CFGR2_PREDIV2_DIV7 ((uint32_t)0x00000060) /*!< PREDIV2 input clock divided by 7 */ + #define RCC_CFGR2_PREDIV2_DIV8 ((uint32_t)0x00000070) /*!< PREDIV2 input clock divided by 8 */ + #define RCC_CFGR2_PREDIV2_DIV9 ((uint32_t)0x00000080) /*!< PREDIV2 input clock divided by 9 */ + #define RCC_CFGR2_PREDIV2_DIV10 ((uint32_t)0x00000090) /*!< PREDIV2 input clock divided by 10 */ + #define RCC_CFGR2_PREDIV2_DIV11 ((uint32_t)0x000000A0) /*!< PREDIV2 input clock divided by 11 */ + #define RCC_CFGR2_PREDIV2_DIV12 ((uint32_t)0x000000B0) /*!< PREDIV2 input clock divided by 12 */ + #define RCC_CFGR2_PREDIV2_DIV13 ((uint32_t)0x000000C0) /*!< PREDIV2 input clock divided by 13 */ + #define RCC_CFGR2_PREDIV2_DIV14 ((uint32_t)0x000000D0) /*!< PREDIV2 input clock divided by 14 */ + #define RCC_CFGR2_PREDIV2_DIV15 ((uint32_t)0x000000E0) /*!< PREDIV2 input clock divided by 15 */ + #define RCC_CFGR2_PREDIV2_DIV16 ((uint32_t)0x000000F0) /*!< PREDIV2 input clock divided by 16 */ + +/*!< PLL2MUL configuration */ + #define RCC_CFGR2_PLL2MUL ((uint32_t)0x00000F00) /*!< PLL2MUL[3:0] bits */ + #define RCC_CFGR2_PLL2MUL_0 ((uint32_t)0x00000100) /*!< Bit 0 */ + #define RCC_CFGR2_PLL2MUL_1 ((uint32_t)0x00000200) /*!< Bit 1 */ + #define RCC_CFGR2_PLL2MUL_2 ((uint32_t)0x00000400) /*!< Bit 2 */ + #define RCC_CFGR2_PLL2MUL_3 ((uint32_t)0x00000800) /*!< Bit 3 */ + + #define RCC_CFGR2_PLL2MUL8 ((uint32_t)0x00000600) /*!< PLL2 input clock * 8 */ + #define RCC_CFGR2_PLL2MUL9 ((uint32_t)0x00000700) /*!< PLL2 input clock * 9 */ + #define RCC_CFGR2_PLL2MUL10 ((uint32_t)0x00000800) /*!< PLL2 input clock * 10 */ + #define RCC_CFGR2_PLL2MUL11 ((uint32_t)0x00000900) /*!< PLL2 input clock * 11 */ + #define RCC_CFGR2_PLL2MUL12 ((uint32_t)0x00000A00) /*!< PLL2 input clock * 12 */ + #define RCC_CFGR2_PLL2MUL13 ((uint32_t)0x00000B00) /*!< PLL2 input clock * 13 */ + #define RCC_CFGR2_PLL2MUL14 ((uint32_t)0x00000C00) /*!< PLL2 input clock * 14 */ + #define RCC_CFGR2_PLL2MUL16 ((uint32_t)0x00000E00) /*!< PLL2 input clock * 16 */ + #define RCC_CFGR2_PLL2MUL20 ((uint32_t)0x00000F00) /*!< PLL2 input clock * 20 */ + +/*!< PLL3MUL configuration */ + #define RCC_CFGR2_PLL3MUL ((uint32_t)0x0000F000) /*!< PLL3MUL[3:0] bits */ + #define RCC_CFGR2_PLL3MUL_0 ((uint32_t)0x00001000) /*!< Bit 0 */ + #define RCC_CFGR2_PLL3MUL_1 ((uint32_t)0x00002000) /*!< Bit 1 */ + #define RCC_CFGR2_PLL3MUL_2 ((uint32_t)0x00004000) /*!< Bit 2 */ + #define RCC_CFGR2_PLL3MUL_3 ((uint32_t)0x00008000) /*!< Bit 3 */ + + #define RCC_CFGR2_PLL3MUL8 ((uint32_t)0x00006000) /*!< PLL3 input clock * 8 */ + #define RCC_CFGR2_PLL3MUL9 ((uint32_t)0x00007000) /*!< PLL3 input clock * 9 */ + #define RCC_CFGR2_PLL3MUL10 ((uint32_t)0x00008000) /*!< PLL3 input clock * 10 */ + #define RCC_CFGR2_PLL3MUL11 ((uint32_t)0x00009000) /*!< PLL3 input clock * 11 */ + #define RCC_CFGR2_PLL3MUL12 ((uint32_t)0x0000A000) /*!< PLL3 input clock * 12 */ + #define RCC_CFGR2_PLL3MUL13 ((uint32_t)0x0000B000) /*!< PLL3 input clock * 13 */ + #define RCC_CFGR2_PLL3MUL14 ((uint32_t)0x0000C000) /*!< PLL3 input clock * 14 */ + #define RCC_CFGR2_PLL3MUL16 ((uint32_t)0x0000E000) /*!< PLL3 input clock * 16 */ + #define RCC_CFGR2_PLL3MUL20 ((uint32_t)0x0000F000) /*!< PLL3 input clock * 20 */ + + #define RCC_CFGR2_PREDIV1SRC ((uint32_t)0x00010000) /*!< PREDIV1 entry clock source */ + #define RCC_CFGR2_PREDIV1SRC_PLL2 ((uint32_t)0x00010000) /*!< PLL2 selected as PREDIV1 entry clock source */ + #define RCC_CFGR2_PREDIV1SRC_HSE ((uint32_t)0x00000000) /*!< HSE selected as PREDIV1 entry clock source */ + #define RCC_CFGR2_I2S2SRC ((uint32_t)0x00020000) /*!< I2S2 entry clock source */ + #define RCC_CFGR2_I2S3SRC ((uint32_t)0x00040000) /*!< I2S3 clock source */ +#endif /* STM32F10X_CL */ + +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) +/******************* Bit definition for RCC_CFGR2 register ******************/ +/*!< PREDIV1 configuration */ + #define RCC_CFGR2_PREDIV1 ((uint32_t)0x0000000F) /*!< PREDIV1[3:0] bits */ + #define RCC_CFGR2_PREDIV1_0 ((uint32_t)0x00000001) /*!< Bit 0 */ + #define RCC_CFGR2_PREDIV1_1 ((uint32_t)0x00000002) /*!< Bit 1 */ + #define RCC_CFGR2_PREDIV1_2 ((uint32_t)0x00000004) /*!< Bit 2 */ + #define RCC_CFGR2_PREDIV1_3 ((uint32_t)0x00000008) /*!< Bit 3 */ + + #define RCC_CFGR2_PREDIV1_DIV1 ((uint32_t)0x00000000) /*!< PREDIV1 input clock not divided */ + #define RCC_CFGR2_PREDIV1_DIV2 ((uint32_t)0x00000001) /*!< PREDIV1 input clock divided by 2 */ + #define RCC_CFGR2_PREDIV1_DIV3 ((uint32_t)0x00000002) /*!< PREDIV1 input clock divided by 3 */ + #define RCC_CFGR2_PREDIV1_DIV4 ((uint32_t)0x00000003) /*!< PREDIV1 input clock divided by 4 */ + #define RCC_CFGR2_PREDIV1_DIV5 ((uint32_t)0x00000004) /*!< PREDIV1 input clock divided by 5 */ + #define RCC_CFGR2_PREDIV1_DIV6 ((uint32_t)0x00000005) /*!< PREDIV1 input clock divided by 6 */ + #define RCC_CFGR2_PREDIV1_DIV7 ((uint32_t)0x00000006) /*!< PREDIV1 input clock divided by 7 */ + #define RCC_CFGR2_PREDIV1_DIV8 ((uint32_t)0x00000007) /*!< PREDIV1 input clock divided by 8 */ + #define RCC_CFGR2_PREDIV1_DIV9 ((uint32_t)0x00000008) /*!< PREDIV1 input clock divided by 9 */ + #define RCC_CFGR2_PREDIV1_DIV10 ((uint32_t)0x00000009) /*!< PREDIV1 input clock divided by 10 */ + #define RCC_CFGR2_PREDIV1_DIV11 ((uint32_t)0x0000000A) /*!< PREDIV1 input clock divided by 11 */ + #define RCC_CFGR2_PREDIV1_DIV12 ((uint32_t)0x0000000B) /*!< PREDIV1 input clock divided by 12 */ + #define RCC_CFGR2_PREDIV1_DIV13 ((uint32_t)0x0000000C) /*!< PREDIV1 input clock divided by 13 */ + #define RCC_CFGR2_PREDIV1_DIV14 ((uint32_t)0x0000000D) /*!< PREDIV1 input clock divided by 14 */ + #define RCC_CFGR2_PREDIV1_DIV15 ((uint32_t)0x0000000E) /*!< PREDIV1 input clock divided by 15 */ + #define RCC_CFGR2_PREDIV1_DIV16 ((uint32_t)0x0000000F) /*!< PREDIV1 input clock divided by 16 */ +#endif + +/******************************************************************************/ +/* */ +/* General Purpose and Alternate Function I/O */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for GPIO_CRL register *******************/ +#define GPIO_CRL_MODE ((uint32_t)0x33333333) /*!< Port x mode bits */ + +#define GPIO_CRL_MODE0 ((uint32_t)0x00000003) /*!< MODE0[1:0] bits (Port x mode bits, pin 0) */ +#define GPIO_CRL_MODE0_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define GPIO_CRL_MODE0_1 ((uint32_t)0x00000002) /*!< Bit 1 */ + +#define GPIO_CRL_MODE1 ((uint32_t)0x00000030) /*!< MODE1[1:0] bits (Port x mode bits, pin 1) */ +#define GPIO_CRL_MODE1_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define GPIO_CRL_MODE1_1 ((uint32_t)0x00000020) /*!< Bit 1 */ + +#define GPIO_CRL_MODE2 ((uint32_t)0x00000300) /*!< MODE2[1:0] bits (Port x mode bits, pin 2) */ +#define GPIO_CRL_MODE2_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define GPIO_CRL_MODE2_1 ((uint32_t)0x00000200) /*!< Bit 1 */ + +#define GPIO_CRL_MODE3 ((uint32_t)0x00003000) /*!< MODE3[1:0] bits (Port x mode bits, pin 3) */ +#define GPIO_CRL_MODE3_0 ((uint32_t)0x00001000) /*!< Bit 0 */ +#define GPIO_CRL_MODE3_1 ((uint32_t)0x00002000) /*!< Bit 1 */ + +#define GPIO_CRL_MODE4 ((uint32_t)0x00030000) /*!< MODE4[1:0] bits (Port x mode bits, pin 4) */ +#define GPIO_CRL_MODE4_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define GPIO_CRL_MODE4_1 ((uint32_t)0x00020000) /*!< Bit 1 */ + +#define GPIO_CRL_MODE5 ((uint32_t)0x00300000) /*!< MODE5[1:0] bits (Port x mode bits, pin 5) */ +#define GPIO_CRL_MODE5_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define GPIO_CRL_MODE5_1 ((uint32_t)0x00200000) /*!< Bit 1 */ + +#define GPIO_CRL_MODE6 ((uint32_t)0x03000000) /*!< MODE6[1:0] bits (Port x mode bits, pin 6) */ +#define GPIO_CRL_MODE6_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define GPIO_CRL_MODE6_1 ((uint32_t)0x02000000) /*!< Bit 1 */ + +#define GPIO_CRL_MODE7 ((uint32_t)0x30000000) /*!< MODE7[1:0] bits (Port x mode bits, pin 7) */ +#define GPIO_CRL_MODE7_0 ((uint32_t)0x10000000) /*!< Bit 0 */ +#define GPIO_CRL_MODE7_1 ((uint32_t)0x20000000) /*!< Bit 1 */ + +#define GPIO_CRL_CNF ((uint32_t)0xCCCCCCCC) /*!< Port x configuration bits */ + +#define GPIO_CRL_CNF0 ((uint32_t)0x0000000C) /*!< CNF0[1:0] bits (Port x configuration bits, pin 0) */ +#define GPIO_CRL_CNF0_0 ((uint32_t)0x00000004) /*!< Bit 0 */ +#define GPIO_CRL_CNF0_1 ((uint32_t)0x00000008) /*!< Bit 1 */ + +#define GPIO_CRL_CNF1 ((uint32_t)0x000000C0) /*!< CNF1[1:0] bits (Port x configuration bits, pin 1) */ +#define GPIO_CRL_CNF1_0 ((uint32_t)0x00000040) /*!< Bit 0 */ +#define GPIO_CRL_CNF1_1 ((uint32_t)0x00000080) /*!< Bit 1 */ + +#define GPIO_CRL_CNF2 ((uint32_t)0x00000C00) /*!< CNF2[1:0] bits (Port x configuration bits, pin 2) */ +#define GPIO_CRL_CNF2_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define GPIO_CRL_CNF2_1 ((uint32_t)0x00000800) /*!< Bit 1 */ + +#define GPIO_CRL_CNF3 ((uint32_t)0x0000C000) /*!< CNF3[1:0] bits (Port x configuration bits, pin 3) */ +#define GPIO_CRL_CNF3_0 ((uint32_t)0x00004000) /*!< Bit 0 */ +#define GPIO_CRL_CNF3_1 ((uint32_t)0x00008000) /*!< Bit 1 */ + +#define GPIO_CRL_CNF4 ((uint32_t)0x000C0000) /*!< CNF4[1:0] bits (Port x configuration bits, pin 4) */ +#define GPIO_CRL_CNF4_0 ((uint32_t)0x00040000) /*!< Bit 0 */ +#define GPIO_CRL_CNF4_1 ((uint32_t)0x00080000) /*!< Bit 1 */ + +#define GPIO_CRL_CNF5 ((uint32_t)0x00C00000) /*!< CNF5[1:0] bits (Port x configuration bits, pin 5) */ +#define GPIO_CRL_CNF5_0 ((uint32_t)0x00400000) /*!< Bit 0 */ +#define GPIO_CRL_CNF5_1 ((uint32_t)0x00800000) /*!< Bit 1 */ + +#define GPIO_CRL_CNF6 ((uint32_t)0x0C000000) /*!< CNF6[1:0] bits (Port x configuration bits, pin 6) */ +#define GPIO_CRL_CNF6_0 ((uint32_t)0x04000000) /*!< Bit 0 */ +#define GPIO_CRL_CNF6_1 ((uint32_t)0x08000000) /*!< Bit 1 */ + +#define GPIO_CRL_CNF7 ((uint32_t)0xC0000000) /*!< CNF7[1:0] bits (Port x configuration bits, pin 7) */ +#define GPIO_CRL_CNF7_0 ((uint32_t)0x40000000) /*!< Bit 0 */ +#define GPIO_CRL_CNF7_1 ((uint32_t)0x80000000) /*!< Bit 1 */ + +/******************* Bit definition for GPIO_CRH register *******************/ +#define GPIO_CRH_MODE ((uint32_t)0x33333333) /*!< Port x mode bits */ + +#define GPIO_CRH_MODE8 ((uint32_t)0x00000003) /*!< MODE8[1:0] bits (Port x mode bits, pin 8) */ +#define GPIO_CRH_MODE8_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define GPIO_CRH_MODE8_1 ((uint32_t)0x00000002) /*!< Bit 1 */ + +#define GPIO_CRH_MODE9 ((uint32_t)0x00000030) /*!< MODE9[1:0] bits (Port x mode bits, pin 9) */ +#define GPIO_CRH_MODE9_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define GPIO_CRH_MODE9_1 ((uint32_t)0x00000020) /*!< Bit 1 */ + +#define GPIO_CRH_MODE10 ((uint32_t)0x00000300) /*!< MODE10[1:0] bits (Port x mode bits, pin 10) */ +#define GPIO_CRH_MODE10_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define GPIO_CRH_MODE10_1 ((uint32_t)0x00000200) /*!< Bit 1 */ + +#define GPIO_CRH_MODE11 ((uint32_t)0x00003000) /*!< MODE11[1:0] bits (Port x mode bits, pin 11) */ +#define GPIO_CRH_MODE11_0 ((uint32_t)0x00001000) /*!< Bit 0 */ +#define GPIO_CRH_MODE11_1 ((uint32_t)0x00002000) /*!< Bit 1 */ + +#define GPIO_CRH_MODE12 ((uint32_t)0x00030000) /*!< MODE12[1:0] bits (Port x mode bits, pin 12) */ +#define GPIO_CRH_MODE12_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define GPIO_CRH_MODE12_1 ((uint32_t)0x00020000) /*!< Bit 1 */ + +#define GPIO_CRH_MODE13 ((uint32_t)0x00300000) /*!< MODE13[1:0] bits (Port x mode bits, pin 13) */ +#define GPIO_CRH_MODE13_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define GPIO_CRH_MODE13_1 ((uint32_t)0x00200000) /*!< Bit 1 */ + +#define GPIO_CRH_MODE14 ((uint32_t)0x03000000) /*!< MODE14[1:0] bits (Port x mode bits, pin 14) */ +#define GPIO_CRH_MODE14_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define GPIO_CRH_MODE14_1 ((uint32_t)0x02000000) /*!< Bit 1 */ + +#define GPIO_CRH_MODE15 ((uint32_t)0x30000000) /*!< MODE15[1:0] bits (Port x mode bits, pin 15) */ +#define GPIO_CRH_MODE15_0 ((uint32_t)0x10000000) /*!< Bit 0 */ +#define GPIO_CRH_MODE15_1 ((uint32_t)0x20000000) /*!< Bit 1 */ + +#define GPIO_CRH_CNF ((uint32_t)0xCCCCCCCC) /*!< Port x configuration bits */ + +#define GPIO_CRH_CNF8 ((uint32_t)0x0000000C) /*!< CNF8[1:0] bits (Port x configuration bits, pin 8) */ +#define GPIO_CRH_CNF8_0 ((uint32_t)0x00000004) /*!< Bit 0 */ +#define GPIO_CRH_CNF8_1 ((uint32_t)0x00000008) /*!< Bit 1 */ + +#define GPIO_CRH_CNF9 ((uint32_t)0x000000C0) /*!< CNF9[1:0] bits (Port x configuration bits, pin 9) */ +#define GPIO_CRH_CNF9_0 ((uint32_t)0x00000040) /*!< Bit 0 */ +#define GPIO_CRH_CNF9_1 ((uint32_t)0x00000080) /*!< Bit 1 */ + +#define GPIO_CRH_CNF10 ((uint32_t)0x00000C00) /*!< CNF10[1:0] bits (Port x configuration bits, pin 10) */ +#define GPIO_CRH_CNF10_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define GPIO_CRH_CNF10_1 ((uint32_t)0x00000800) /*!< Bit 1 */ + +#define GPIO_CRH_CNF11 ((uint32_t)0x0000C000) /*!< CNF11[1:0] bits (Port x configuration bits, pin 11) */ +#define GPIO_CRH_CNF11_0 ((uint32_t)0x00004000) /*!< Bit 0 */ +#define GPIO_CRH_CNF11_1 ((uint32_t)0x00008000) /*!< Bit 1 */ + +#define GPIO_CRH_CNF12 ((uint32_t)0x000C0000) /*!< CNF12[1:0] bits (Port x configuration bits, pin 12) */ +#define GPIO_CRH_CNF12_0 ((uint32_t)0x00040000) /*!< Bit 0 */ +#define GPIO_CRH_CNF12_1 ((uint32_t)0x00080000) /*!< Bit 1 */ + +#define GPIO_CRH_CNF13 ((uint32_t)0x00C00000) /*!< CNF13[1:0] bits (Port x configuration bits, pin 13) */ +#define GPIO_CRH_CNF13_0 ((uint32_t)0x00400000) /*!< Bit 0 */ +#define GPIO_CRH_CNF13_1 ((uint32_t)0x00800000) /*!< Bit 1 */ + +#define GPIO_CRH_CNF14 ((uint32_t)0x0C000000) /*!< CNF14[1:0] bits (Port x configuration bits, pin 14) */ +#define GPIO_CRH_CNF14_0 ((uint32_t)0x04000000) /*!< Bit 0 */ +#define GPIO_CRH_CNF14_1 ((uint32_t)0x08000000) /*!< Bit 1 */ + +#define GPIO_CRH_CNF15 ((uint32_t)0xC0000000) /*!< CNF15[1:0] bits (Port x configuration bits, pin 15) */ +#define GPIO_CRH_CNF15_0 ((uint32_t)0x40000000) /*!< Bit 0 */ +#define GPIO_CRH_CNF15_1 ((uint32_t)0x80000000) /*!< Bit 1 */ + +/*!<****************** Bit definition for GPIO_IDR register *******************/ +#define GPIO_IDR_IDR0 ((uint16_t)0x0001) /*!< Port input data, bit 0 */ +#define GPIO_IDR_IDR1 ((uint16_t)0x0002) /*!< Port input data, bit 1 */ +#define GPIO_IDR_IDR2 ((uint16_t)0x0004) /*!< Port input data, bit 2 */ +#define GPIO_IDR_IDR3 ((uint16_t)0x0008) /*!< Port input data, bit 3 */ +#define GPIO_IDR_IDR4 ((uint16_t)0x0010) /*!< Port input data, bit 4 */ +#define GPIO_IDR_IDR5 ((uint16_t)0x0020) /*!< Port input data, bit 5 */ +#define GPIO_IDR_IDR6 ((uint16_t)0x0040) /*!< Port input data, bit 6 */ +#define GPIO_IDR_IDR7 ((uint16_t)0x0080) /*!< Port input data, bit 7 */ +#define GPIO_IDR_IDR8 ((uint16_t)0x0100) /*!< Port input data, bit 8 */ +#define GPIO_IDR_IDR9 ((uint16_t)0x0200) /*!< Port input data, bit 9 */ +#define GPIO_IDR_IDR10 ((uint16_t)0x0400) /*!< Port input data, bit 10 */ +#define GPIO_IDR_IDR11 ((uint16_t)0x0800) /*!< Port input data, bit 11 */ +#define GPIO_IDR_IDR12 ((uint16_t)0x1000) /*!< Port input data, bit 12 */ +#define GPIO_IDR_IDR13 ((uint16_t)0x2000) /*!< Port input data, bit 13 */ +#define GPIO_IDR_IDR14 ((uint16_t)0x4000) /*!< Port input data, bit 14 */ +#define GPIO_IDR_IDR15 ((uint16_t)0x8000) /*!< Port input data, bit 15 */ + +/******************* Bit definition for GPIO_ODR register *******************/ +#define GPIO_ODR_ODR0 ((uint16_t)0x0001) /*!< Port output data, bit 0 */ +#define GPIO_ODR_ODR1 ((uint16_t)0x0002) /*!< Port output data, bit 1 */ +#define GPIO_ODR_ODR2 ((uint16_t)0x0004) /*!< Port output data, bit 2 */ +#define GPIO_ODR_ODR3 ((uint16_t)0x0008) /*!< Port output data, bit 3 */ +#define GPIO_ODR_ODR4 ((uint16_t)0x0010) /*!< Port output data, bit 4 */ +#define GPIO_ODR_ODR5 ((uint16_t)0x0020) /*!< Port output data, bit 5 */ +#define GPIO_ODR_ODR6 ((uint16_t)0x0040) /*!< Port output data, bit 6 */ +#define GPIO_ODR_ODR7 ((uint16_t)0x0080) /*!< Port output data, bit 7 */ +#define GPIO_ODR_ODR8 ((uint16_t)0x0100) /*!< Port output data, bit 8 */ +#define GPIO_ODR_ODR9 ((uint16_t)0x0200) /*!< Port output data, bit 9 */ +#define GPIO_ODR_ODR10 ((uint16_t)0x0400) /*!< Port output data, bit 10 */ +#define GPIO_ODR_ODR11 ((uint16_t)0x0800) /*!< Port output data, bit 11 */ +#define GPIO_ODR_ODR12 ((uint16_t)0x1000) /*!< Port output data, bit 12 */ +#define GPIO_ODR_ODR13 ((uint16_t)0x2000) /*!< Port output data, bit 13 */ +#define GPIO_ODR_ODR14 ((uint16_t)0x4000) /*!< Port output data, bit 14 */ +#define GPIO_ODR_ODR15 ((uint16_t)0x8000) /*!< Port output data, bit 15 */ + +/****************** Bit definition for GPIO_BSRR register *******************/ +#define GPIO_BSRR_BS0 ((uint32_t)0x00000001) /*!< Port x Set bit 0 */ +#define GPIO_BSRR_BS1 ((uint32_t)0x00000002) /*!< Port x Set bit 1 */ +#define GPIO_BSRR_BS2 ((uint32_t)0x00000004) /*!< Port x Set bit 2 */ +#define GPIO_BSRR_BS3 ((uint32_t)0x00000008) /*!< Port x Set bit 3 */ +#define GPIO_BSRR_BS4 ((uint32_t)0x00000010) /*!< Port x Set bit 4 */ +#define GPIO_BSRR_BS5 ((uint32_t)0x00000020) /*!< Port x Set bit 5 */ +#define GPIO_BSRR_BS6 ((uint32_t)0x00000040) /*!< Port x Set bit 6 */ +#define GPIO_BSRR_BS7 ((uint32_t)0x00000080) /*!< Port x Set bit 7 */ +#define GPIO_BSRR_BS8 ((uint32_t)0x00000100) /*!< Port x Set bit 8 */ +#define GPIO_BSRR_BS9 ((uint32_t)0x00000200) /*!< Port x Set bit 9 */ +#define GPIO_BSRR_BS10 ((uint32_t)0x00000400) /*!< Port x Set bit 10 */ +#define GPIO_BSRR_BS11 ((uint32_t)0x00000800) /*!< Port x Set bit 11 */ +#define GPIO_BSRR_BS12 ((uint32_t)0x00001000) /*!< Port x Set bit 12 */ +#define GPIO_BSRR_BS13 ((uint32_t)0x00002000) /*!< Port x Set bit 13 */ +#define GPIO_BSRR_BS14 ((uint32_t)0x00004000) /*!< Port x Set bit 14 */ +#define GPIO_BSRR_BS15 ((uint32_t)0x00008000) /*!< Port x Set bit 15 */ + +#define GPIO_BSRR_BR0 ((uint32_t)0x00010000) /*!< Port x Reset bit 0 */ +#define GPIO_BSRR_BR1 ((uint32_t)0x00020000) /*!< Port x Reset bit 1 */ +#define GPIO_BSRR_BR2 ((uint32_t)0x00040000) /*!< Port x Reset bit 2 */ +#define GPIO_BSRR_BR3 ((uint32_t)0x00080000) /*!< Port x Reset bit 3 */ +#define GPIO_BSRR_BR4 ((uint32_t)0x00100000) /*!< Port x Reset bit 4 */ +#define GPIO_BSRR_BR5 ((uint32_t)0x00200000) /*!< Port x Reset bit 5 */ +#define GPIO_BSRR_BR6 ((uint32_t)0x00400000) /*!< Port x Reset bit 6 */ +#define GPIO_BSRR_BR7 ((uint32_t)0x00800000) /*!< Port x Reset bit 7 */ +#define GPIO_BSRR_BR8 ((uint32_t)0x01000000) /*!< Port x Reset bit 8 */ +#define GPIO_BSRR_BR9 ((uint32_t)0x02000000) /*!< Port x Reset bit 9 */ +#define GPIO_BSRR_BR10 ((uint32_t)0x04000000) /*!< Port x Reset bit 10 */ +#define GPIO_BSRR_BR11 ((uint32_t)0x08000000) /*!< Port x Reset bit 11 */ +#define GPIO_BSRR_BR12 ((uint32_t)0x10000000) /*!< Port x Reset bit 12 */ +#define GPIO_BSRR_BR13 ((uint32_t)0x20000000) /*!< Port x Reset bit 13 */ +#define GPIO_BSRR_BR14 ((uint32_t)0x40000000) /*!< Port x Reset bit 14 */ +#define GPIO_BSRR_BR15 ((uint32_t)0x80000000) /*!< Port x Reset bit 15 */ + +/******************* Bit definition for GPIO_BRR register *******************/ +#define GPIO_BRR_BR0 ((uint16_t)0x0001) /*!< Port x Reset bit 0 */ +#define GPIO_BRR_BR1 ((uint16_t)0x0002) /*!< Port x Reset bit 1 */ +#define GPIO_BRR_BR2 ((uint16_t)0x0004) /*!< Port x Reset bit 2 */ +#define GPIO_BRR_BR3 ((uint16_t)0x0008) /*!< Port x Reset bit 3 */ +#define GPIO_BRR_BR4 ((uint16_t)0x0010) /*!< Port x Reset bit 4 */ +#define GPIO_BRR_BR5 ((uint16_t)0x0020) /*!< Port x Reset bit 5 */ +#define GPIO_BRR_BR6 ((uint16_t)0x0040) /*!< Port x Reset bit 6 */ +#define GPIO_BRR_BR7 ((uint16_t)0x0080) /*!< Port x Reset bit 7 */ +#define GPIO_BRR_BR8 ((uint16_t)0x0100) /*!< Port x Reset bit 8 */ +#define GPIO_BRR_BR9 ((uint16_t)0x0200) /*!< Port x Reset bit 9 */ +#define GPIO_BRR_BR10 ((uint16_t)0x0400) /*!< Port x Reset bit 10 */ +#define GPIO_BRR_BR11 ((uint16_t)0x0800) /*!< Port x Reset bit 11 */ +#define GPIO_BRR_BR12 ((uint16_t)0x1000) /*!< Port x Reset bit 12 */ +#define GPIO_BRR_BR13 ((uint16_t)0x2000) /*!< Port x Reset bit 13 */ +#define GPIO_BRR_BR14 ((uint16_t)0x4000) /*!< Port x Reset bit 14 */ +#define GPIO_BRR_BR15 ((uint16_t)0x8000) /*!< Port x Reset bit 15 */ + +/****************** Bit definition for GPIO_LCKR register *******************/ +#define GPIO_LCKR_LCK0 ((uint32_t)0x00000001) /*!< Port x Lock bit 0 */ +#define GPIO_LCKR_LCK1 ((uint32_t)0x00000002) /*!< Port x Lock bit 1 */ +#define GPIO_LCKR_LCK2 ((uint32_t)0x00000004) /*!< Port x Lock bit 2 */ +#define GPIO_LCKR_LCK3 ((uint32_t)0x00000008) /*!< Port x Lock bit 3 */ +#define GPIO_LCKR_LCK4 ((uint32_t)0x00000010) /*!< Port x Lock bit 4 */ +#define GPIO_LCKR_LCK5 ((uint32_t)0x00000020) /*!< Port x Lock bit 5 */ +#define GPIO_LCKR_LCK6 ((uint32_t)0x00000040) /*!< Port x Lock bit 6 */ +#define GPIO_LCKR_LCK7 ((uint32_t)0x00000080) /*!< Port x Lock bit 7 */ +#define GPIO_LCKR_LCK8 ((uint32_t)0x00000100) /*!< Port x Lock bit 8 */ +#define GPIO_LCKR_LCK9 ((uint32_t)0x00000200) /*!< Port x Lock bit 9 */ +#define GPIO_LCKR_LCK10 ((uint32_t)0x00000400) /*!< Port x Lock bit 10 */ +#define GPIO_LCKR_LCK11 ((uint32_t)0x00000800) /*!< Port x Lock bit 11 */ +#define GPIO_LCKR_LCK12 ((uint32_t)0x00001000) /*!< Port x Lock bit 12 */ +#define GPIO_LCKR_LCK13 ((uint32_t)0x00002000) /*!< Port x Lock bit 13 */ +#define GPIO_LCKR_LCK14 ((uint32_t)0x00004000) /*!< Port x Lock bit 14 */ +#define GPIO_LCKR_LCK15 ((uint32_t)0x00008000) /*!< Port x Lock bit 15 */ +#define GPIO_LCKR_LCKK ((uint32_t)0x00010000) /*!< Lock key */ + +/*----------------------------------------------------------------------------*/ + +/****************** Bit definition for AFIO_EVCR register *******************/ +#define AFIO_EVCR_PIN ((uint8_t)0x0F) /*!< PIN[3:0] bits (Pin selection) */ +#define AFIO_EVCR_PIN_0 ((uint8_t)0x01) /*!< Bit 0 */ +#define AFIO_EVCR_PIN_1 ((uint8_t)0x02) /*!< Bit 1 */ +#define AFIO_EVCR_PIN_2 ((uint8_t)0x04) /*!< Bit 2 */ +#define AFIO_EVCR_PIN_3 ((uint8_t)0x08) /*!< Bit 3 */ + +/*!< PIN configuration */ +#define AFIO_EVCR_PIN_PX0 ((uint8_t)0x00) /*!< Pin 0 selected */ +#define AFIO_EVCR_PIN_PX1 ((uint8_t)0x01) /*!< Pin 1 selected */ +#define AFIO_EVCR_PIN_PX2 ((uint8_t)0x02) /*!< Pin 2 selected */ +#define AFIO_EVCR_PIN_PX3 ((uint8_t)0x03) /*!< Pin 3 selected */ +#define AFIO_EVCR_PIN_PX4 ((uint8_t)0x04) /*!< Pin 4 selected */ +#define AFIO_EVCR_PIN_PX5 ((uint8_t)0x05) /*!< Pin 5 selected */ +#define AFIO_EVCR_PIN_PX6 ((uint8_t)0x06) /*!< Pin 6 selected */ +#define AFIO_EVCR_PIN_PX7 ((uint8_t)0x07) /*!< Pin 7 selected */ +#define AFIO_EVCR_PIN_PX8 ((uint8_t)0x08) /*!< Pin 8 selected */ +#define AFIO_EVCR_PIN_PX9 ((uint8_t)0x09) /*!< Pin 9 selected */ +#define AFIO_EVCR_PIN_PX10 ((uint8_t)0x0A) /*!< Pin 10 selected */ +#define AFIO_EVCR_PIN_PX11 ((uint8_t)0x0B) /*!< Pin 11 selected */ +#define AFIO_EVCR_PIN_PX12 ((uint8_t)0x0C) /*!< Pin 12 selected */ +#define AFIO_EVCR_PIN_PX13 ((uint8_t)0x0D) /*!< Pin 13 selected */ +#define AFIO_EVCR_PIN_PX14 ((uint8_t)0x0E) /*!< Pin 14 selected */ +#define AFIO_EVCR_PIN_PX15 ((uint8_t)0x0F) /*!< Pin 15 selected */ + +#define AFIO_EVCR_PORT ((uint8_t)0x70) /*!< PORT[2:0] bits (Port selection) */ +#define AFIO_EVCR_PORT_0 ((uint8_t)0x10) /*!< Bit 0 */ +#define AFIO_EVCR_PORT_1 ((uint8_t)0x20) /*!< Bit 1 */ +#define AFIO_EVCR_PORT_2 ((uint8_t)0x40) /*!< Bit 2 */ + +/*!< PORT configuration */ +#define AFIO_EVCR_PORT_PA ((uint8_t)0x00) /*!< Port A selected */ +#define AFIO_EVCR_PORT_PB ((uint8_t)0x10) /*!< Port B selected */ +#define AFIO_EVCR_PORT_PC ((uint8_t)0x20) /*!< Port C selected */ +#define AFIO_EVCR_PORT_PD ((uint8_t)0x30) /*!< Port D selected */ +#define AFIO_EVCR_PORT_PE ((uint8_t)0x40) /*!< Port E selected */ + +#define AFIO_EVCR_EVOE ((uint8_t)0x80) /*!< Event Output Enable */ + +/****************** Bit definition for AFIO_MAPR register *******************/ +#define AFIO_MAPR_SPI1_REMAP ((uint32_t)0x00000001) /*!< SPI1 remapping */ +#define AFIO_MAPR_I2C1_REMAP ((uint32_t)0x00000002) /*!< I2C1 remapping */ +#define AFIO_MAPR_USART1_REMAP ((uint32_t)0x00000004) /*!< USART1 remapping */ +#define AFIO_MAPR_USART2_REMAP ((uint32_t)0x00000008) /*!< USART2 remapping */ + +#define AFIO_MAPR_USART3_REMAP ((uint32_t)0x00000030) /*!< USART3_REMAP[1:0] bits (USART3 remapping) */ +#define AFIO_MAPR_USART3_REMAP_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define AFIO_MAPR_USART3_REMAP_1 ((uint32_t)0x00000020) /*!< Bit 1 */ + +/* USART3_REMAP configuration */ +#define AFIO_MAPR_USART3_REMAP_NOREMAP ((uint32_t)0x00000000) /*!< No remap (TX/PB10, RX/PB11, CK/PB12, CTS/PB13, RTS/PB14) */ +#define AFIO_MAPR_USART3_REMAP_PARTIALREMAP ((uint32_t)0x00000010) /*!< Partial remap (TX/PC10, RX/PC11, CK/PC12, CTS/PB13, RTS/PB14) */ +#define AFIO_MAPR_USART3_REMAP_FULLREMAP ((uint32_t)0x00000030) /*!< Full remap (TX/PD8, RX/PD9, CK/PD10, CTS/PD11, RTS/PD12) */ + +#define AFIO_MAPR_TIM1_REMAP ((uint32_t)0x000000C0) /*!< TIM1_REMAP[1:0] bits (TIM1 remapping) */ +#define AFIO_MAPR_TIM1_REMAP_0 ((uint32_t)0x00000040) /*!< Bit 0 */ +#define AFIO_MAPR_TIM1_REMAP_1 ((uint32_t)0x00000080) /*!< Bit 1 */ + +/*!< TIM1_REMAP configuration */ +#define AFIO_MAPR_TIM1_REMAP_NOREMAP ((uint32_t)0x00000000) /*!< No remap (ETR/PA12, CH1/PA8, CH2/PA9, CH3/PA10, CH4/PA11, BKIN/PB12, CH1N/PB13, CH2N/PB14, CH3N/PB15) */ +#define AFIO_MAPR_TIM1_REMAP_PARTIALREMAP ((uint32_t)0x00000040) /*!< Partial remap (ETR/PA12, CH1/PA8, CH2/PA9, CH3/PA10, CH4/PA11, BKIN/PA6, CH1N/PA7, CH2N/PB0, CH3N/PB1) */ +#define AFIO_MAPR_TIM1_REMAP_FULLREMAP ((uint32_t)0x000000C0) /*!< Full remap (ETR/PE7, CH1/PE9, CH2/PE11, CH3/PE13, CH4/PE14, BKIN/PE15, CH1N/PE8, CH2N/PE10, CH3N/PE12) */ + +#define AFIO_MAPR_TIM2_REMAP ((uint32_t)0x00000300) /*!< TIM2_REMAP[1:0] bits (TIM2 remapping) */ +#define AFIO_MAPR_TIM2_REMAP_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define AFIO_MAPR_TIM2_REMAP_1 ((uint32_t)0x00000200) /*!< Bit 1 */ + +/*!< TIM2_REMAP configuration */ +#define AFIO_MAPR_TIM2_REMAP_NOREMAP ((uint32_t)0x00000000) /*!< No remap (CH1/ETR/PA0, CH2/PA1, CH3/PA2, CH4/PA3) */ +#define AFIO_MAPR_TIM2_REMAP_PARTIALREMAP1 ((uint32_t)0x00000100) /*!< Partial remap (CH1/ETR/PA15, CH2/PB3, CH3/PA2, CH4/PA3) */ +#define AFIO_MAPR_TIM2_REMAP_PARTIALREMAP2 ((uint32_t)0x00000200) /*!< Partial remap (CH1/ETR/PA0, CH2/PA1, CH3/PB10, CH4/PB11) */ +#define AFIO_MAPR_TIM2_REMAP_FULLREMAP ((uint32_t)0x00000300) /*!< Full remap (CH1/ETR/PA15, CH2/PB3, CH3/PB10, CH4/PB11) */ + +#define AFIO_MAPR_TIM3_REMAP ((uint32_t)0x00000C00) /*!< TIM3_REMAP[1:0] bits (TIM3 remapping) */ +#define AFIO_MAPR_TIM3_REMAP_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define AFIO_MAPR_TIM3_REMAP_1 ((uint32_t)0x00000800) /*!< Bit 1 */ + +/*!< TIM3_REMAP configuration */ +#define AFIO_MAPR_TIM3_REMAP_NOREMAP ((uint32_t)0x00000000) /*!< No remap (CH1/PA6, CH2/PA7, CH3/PB0, CH4/PB1) */ +#define AFIO_MAPR_TIM3_REMAP_PARTIALREMAP ((uint32_t)0x00000800) /*!< Partial remap (CH1/PB4, CH2/PB5, CH3/PB0, CH4/PB1) */ +#define AFIO_MAPR_TIM3_REMAP_FULLREMAP ((uint32_t)0x00000C00) /*!< Full remap (CH1/PC6, CH2/PC7, CH3/PC8, CH4/PC9) */ + +#define AFIO_MAPR_TIM4_REMAP ((uint32_t)0x00001000) /*!< TIM4_REMAP bit (TIM4 remapping) */ + +#define AFIO_MAPR_CAN_REMAP ((uint32_t)0x00006000) /*!< CAN_REMAP[1:0] bits (CAN Alternate function remapping) */ +#define AFIO_MAPR_CAN_REMAP_0 ((uint32_t)0x00002000) /*!< Bit 0 */ +#define AFIO_MAPR_CAN_REMAP_1 ((uint32_t)0x00004000) /*!< Bit 1 */ + +/*!< CAN_REMAP configuration */ +#define AFIO_MAPR_CAN_REMAP_REMAP1 ((uint32_t)0x00000000) /*!< CANRX mapped to PA11, CANTX mapped to PA12 */ +#define AFIO_MAPR_CAN_REMAP_REMAP2 ((uint32_t)0x00004000) /*!< CANRX mapped to PB8, CANTX mapped to PB9 */ +#define AFIO_MAPR_CAN_REMAP_REMAP3 ((uint32_t)0x00006000) /*!< CANRX mapped to PD0, CANTX mapped to PD1 */ + +#define AFIO_MAPR_PD01_REMAP ((uint32_t)0x00008000) /*!< Port D0/Port D1 mapping on OSC_IN/OSC_OUT */ +#define AFIO_MAPR_TIM5CH4_IREMAP ((uint32_t)0x00010000) /*!< TIM5 Channel4 Internal Remap */ +#define AFIO_MAPR_ADC1_ETRGINJ_REMAP ((uint32_t)0x00020000) /*!< ADC 1 External Trigger Injected Conversion remapping */ +#define AFIO_MAPR_ADC1_ETRGREG_REMAP ((uint32_t)0x00040000) /*!< ADC 1 External Trigger Regular Conversion remapping */ +#define AFIO_MAPR_ADC2_ETRGINJ_REMAP ((uint32_t)0x00080000) /*!< ADC 2 External Trigger Injected Conversion remapping */ +#define AFIO_MAPR_ADC2_ETRGREG_REMAP ((uint32_t)0x00100000) /*!< ADC 2 External Trigger Regular Conversion remapping */ + +/*!< SWJ_CFG configuration */ +#define AFIO_MAPR_SWJ_CFG ((uint32_t)0x07000000) /*!< SWJ_CFG[2:0] bits (Serial Wire JTAG configuration) */ +#define AFIO_MAPR_SWJ_CFG_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define AFIO_MAPR_SWJ_CFG_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define AFIO_MAPR_SWJ_CFG_2 ((uint32_t)0x04000000) /*!< Bit 2 */ + +#define AFIO_MAPR_SWJ_CFG_RESET ((uint32_t)0x00000000) /*!< Full SWJ (JTAG-DP + SW-DP) : Reset State */ +#define AFIO_MAPR_SWJ_CFG_NOJNTRST ((uint32_t)0x01000000) /*!< Full SWJ (JTAG-DP + SW-DP) but without JNTRST */ +#define AFIO_MAPR_SWJ_CFG_JTAGDISABLE ((uint32_t)0x02000000) /*!< JTAG-DP Disabled and SW-DP Enabled */ +#define AFIO_MAPR_SWJ_CFG_DISABLE ((uint32_t)0x04000000) /*!< JTAG-DP Disabled and SW-DP Disabled */ + +#ifdef STM32F10X_CL +/*!< ETH_REMAP configuration */ + #define AFIO_MAPR_ETH_REMAP ((uint32_t)0x00200000) /*!< SPI3_REMAP bit (Ethernet MAC I/O remapping) */ + +/*!< CAN2_REMAP configuration */ + #define AFIO_MAPR_CAN2_REMAP ((uint32_t)0x00400000) /*!< CAN2_REMAP bit (CAN2 I/O remapping) */ + +/*!< MII_RMII_SEL configuration */ + #define AFIO_MAPR_MII_RMII_SEL ((uint32_t)0x00800000) /*!< MII_RMII_SEL bit (Ethernet MII or RMII selection) */ + +/*!< SPI3_REMAP configuration */ + #define AFIO_MAPR_SPI3_REMAP ((uint32_t)0x10000000) /*!< SPI3_REMAP bit (SPI3 remapping) */ + +/*!< TIM2ITR1_IREMAP configuration */ + #define AFIO_MAPR_TIM2ITR1_IREMAP ((uint32_t)0x20000000) /*!< TIM2ITR1_IREMAP bit (TIM2 internal trigger 1 remapping) */ + +/*!< PTP_PPS_REMAP configuration */ + #define AFIO_MAPR_PTP_PPS_REMAP ((uint32_t)0x40000000) /*!< PTP_PPS_REMAP bit (Ethernet PTP PPS remapping) */ +#endif + +/***************** Bit definition for AFIO_EXTICR1 register *****************/ +#define AFIO_EXTICR1_EXTI0 ((uint16_t)0x000F) /*!< EXTI 0 configuration */ +#define AFIO_EXTICR1_EXTI1 ((uint16_t)0x00F0) /*!< EXTI 1 configuration */ +#define AFIO_EXTICR1_EXTI2 ((uint16_t)0x0F00) /*!< EXTI 2 configuration */ +#define AFIO_EXTICR1_EXTI3 ((uint16_t)0xF000) /*!< EXTI 3 configuration */ + +/*!< EXTI0 configuration */ +#define AFIO_EXTICR1_EXTI0_PA ((uint16_t)0x0000) /*!< PA[0] pin */ +#define AFIO_EXTICR1_EXTI0_PB ((uint16_t)0x0001) /*!< PB[0] pin */ +#define AFIO_EXTICR1_EXTI0_PC ((uint16_t)0x0002) /*!< PC[0] pin */ +#define AFIO_EXTICR1_EXTI0_PD ((uint16_t)0x0003) /*!< PD[0] pin */ +#define AFIO_EXTICR1_EXTI0_PE ((uint16_t)0x0004) /*!< PE[0] pin */ +#define AFIO_EXTICR1_EXTI0_PF ((uint16_t)0x0005) /*!< PF[0] pin */ +#define AFIO_EXTICR1_EXTI0_PG ((uint16_t)0x0006) /*!< PG[0] pin */ + +/*!< EXTI1 configuration */ +#define AFIO_EXTICR1_EXTI1_PA ((uint16_t)0x0000) /*!< PA[1] pin */ +#define AFIO_EXTICR1_EXTI1_PB ((uint16_t)0x0010) /*!< PB[1] pin */ +#define AFIO_EXTICR1_EXTI1_PC ((uint16_t)0x0020) /*!< PC[1] pin */ +#define AFIO_EXTICR1_EXTI1_PD ((uint16_t)0x0030) /*!< PD[1] pin */ +#define AFIO_EXTICR1_EXTI1_PE ((uint16_t)0x0040) /*!< PE[1] pin */ +#define AFIO_EXTICR1_EXTI1_PF ((uint16_t)0x0050) /*!< PF[1] pin */ +#define AFIO_EXTICR1_EXTI1_PG ((uint16_t)0x0060) /*!< PG[1] pin */ + +/*!< EXTI2 configuration */ +#define AFIO_EXTICR1_EXTI2_PA ((uint16_t)0x0000) /*!< PA[2] pin */ +#define AFIO_EXTICR1_EXTI2_PB ((uint16_t)0x0100) /*!< PB[2] pin */ +#define AFIO_EXTICR1_EXTI2_PC ((uint16_t)0x0200) /*!< PC[2] pin */ +#define AFIO_EXTICR1_EXTI2_PD ((uint16_t)0x0300) /*!< PD[2] pin */ +#define AFIO_EXTICR1_EXTI2_PE ((uint16_t)0x0400) /*!< PE[2] pin */ +#define AFIO_EXTICR1_EXTI2_PF ((uint16_t)0x0500) /*!< PF[2] pin */ +#define AFIO_EXTICR1_EXTI2_PG ((uint16_t)0x0600) /*!< PG[2] pin */ + +/*!< EXTI3 configuration */ +#define AFIO_EXTICR1_EXTI3_PA ((uint16_t)0x0000) /*!< PA[3] pin */ +#define AFIO_EXTICR1_EXTI3_PB ((uint16_t)0x1000) /*!< PB[3] pin */ +#define AFIO_EXTICR1_EXTI3_PC ((uint16_t)0x2000) /*!< PC[3] pin */ +#define AFIO_EXTICR1_EXTI3_PD ((uint16_t)0x3000) /*!< PD[3] pin */ +#define AFIO_EXTICR1_EXTI3_PE ((uint16_t)0x4000) /*!< PE[3] pin */ +#define AFIO_EXTICR1_EXTI3_PF ((uint16_t)0x5000) /*!< PF[3] pin */ +#define AFIO_EXTICR1_EXTI3_PG ((uint16_t)0x6000) /*!< PG[3] pin */ + +/***************** Bit definition for AFIO_EXTICR2 register *****************/ +#define AFIO_EXTICR2_EXTI4 ((uint16_t)0x000F) /*!< EXTI 4 configuration */ +#define AFIO_EXTICR2_EXTI5 ((uint16_t)0x00F0) /*!< EXTI 5 configuration */ +#define AFIO_EXTICR2_EXTI6 ((uint16_t)0x0F00) /*!< EXTI 6 configuration */ +#define AFIO_EXTICR2_EXTI7 ((uint16_t)0xF000) /*!< EXTI 7 configuration */ + +/*!< EXTI4 configuration */ +#define AFIO_EXTICR2_EXTI4_PA ((uint16_t)0x0000) /*!< PA[4] pin */ +#define AFIO_EXTICR2_EXTI4_PB ((uint16_t)0x0001) /*!< PB[4] pin */ +#define AFIO_EXTICR2_EXTI4_PC ((uint16_t)0x0002) /*!< PC[4] pin */ +#define AFIO_EXTICR2_EXTI4_PD ((uint16_t)0x0003) /*!< PD[4] pin */ +#define AFIO_EXTICR2_EXTI4_PE ((uint16_t)0x0004) /*!< PE[4] pin */ +#define AFIO_EXTICR2_EXTI4_PF ((uint16_t)0x0005) /*!< PF[4] pin */ +#define AFIO_EXTICR2_EXTI4_PG ((uint16_t)0x0006) /*!< PG[4] pin */ + +/* EXTI5 configuration */ +#define AFIO_EXTICR2_EXTI5_PA ((uint16_t)0x0000) /*!< PA[5] pin */ +#define AFIO_EXTICR2_EXTI5_PB ((uint16_t)0x0010) /*!< PB[5] pin */ +#define AFIO_EXTICR2_EXTI5_PC ((uint16_t)0x0020) /*!< PC[5] pin */ +#define AFIO_EXTICR2_EXTI5_PD ((uint16_t)0x0030) /*!< PD[5] pin */ +#define AFIO_EXTICR2_EXTI5_PE ((uint16_t)0x0040) /*!< PE[5] pin */ +#define AFIO_EXTICR2_EXTI5_PF ((uint16_t)0x0050) /*!< PF[5] pin */ +#define AFIO_EXTICR2_EXTI5_PG ((uint16_t)0x0060) /*!< PG[5] pin */ + +/*!< EXTI6 configuration */ +#define AFIO_EXTICR2_EXTI6_PA ((uint16_t)0x0000) /*!< PA[6] pin */ +#define AFIO_EXTICR2_EXTI6_PB ((uint16_t)0x0100) /*!< PB[6] pin */ +#define AFIO_EXTICR2_EXTI6_PC ((uint16_t)0x0200) /*!< PC[6] pin */ +#define AFIO_EXTICR2_EXTI6_PD ((uint16_t)0x0300) /*!< PD[6] pin */ +#define AFIO_EXTICR2_EXTI6_PE ((uint16_t)0x0400) /*!< PE[6] pin */ +#define AFIO_EXTICR2_EXTI6_PF ((uint16_t)0x0500) /*!< PF[6] pin */ +#define AFIO_EXTICR2_EXTI6_PG ((uint16_t)0x0600) /*!< PG[6] pin */ + +/*!< EXTI7 configuration */ +#define AFIO_EXTICR2_EXTI7_PA ((uint16_t)0x0000) /*!< PA[7] pin */ +#define AFIO_EXTICR2_EXTI7_PB ((uint16_t)0x1000) /*!< PB[7] pin */ +#define AFIO_EXTICR2_EXTI7_PC ((uint16_t)0x2000) /*!< PC[7] pin */ +#define AFIO_EXTICR2_EXTI7_PD ((uint16_t)0x3000) /*!< PD[7] pin */ +#define AFIO_EXTICR2_EXTI7_PE ((uint16_t)0x4000) /*!< PE[7] pin */ +#define AFIO_EXTICR2_EXTI7_PF ((uint16_t)0x5000) /*!< PF[7] pin */ +#define AFIO_EXTICR2_EXTI7_PG ((uint16_t)0x6000) /*!< PG[7] pin */ + +/***************** Bit definition for AFIO_EXTICR3 register *****************/ +#define AFIO_EXTICR3_EXTI8 ((uint16_t)0x000F) /*!< EXTI 8 configuration */ +#define AFIO_EXTICR3_EXTI9 ((uint16_t)0x00F0) /*!< EXTI 9 configuration */ +#define AFIO_EXTICR3_EXTI10 ((uint16_t)0x0F00) /*!< EXTI 10 configuration */ +#define AFIO_EXTICR3_EXTI11 ((uint16_t)0xF000) /*!< EXTI 11 configuration */ + +/*!< EXTI8 configuration */ +#define AFIO_EXTICR3_EXTI8_PA ((uint16_t)0x0000) /*!< PA[8] pin */ +#define AFIO_EXTICR3_EXTI8_PB ((uint16_t)0x0001) /*!< PB[8] pin */ +#define AFIO_EXTICR3_EXTI8_PC ((uint16_t)0x0002) /*!< PC[8] pin */ +#define AFIO_EXTICR3_EXTI8_PD ((uint16_t)0x0003) /*!< PD[8] pin */ +#define AFIO_EXTICR3_EXTI8_PE ((uint16_t)0x0004) /*!< PE[8] pin */ +#define AFIO_EXTICR3_EXTI8_PF ((uint16_t)0x0005) /*!< PF[8] pin */ +#define AFIO_EXTICR3_EXTI8_PG ((uint16_t)0x0006) /*!< PG[8] pin */ + +/*!< EXTI9 configuration */ +#define AFIO_EXTICR3_EXTI9_PA ((uint16_t)0x0000) /*!< PA[9] pin */ +#define AFIO_EXTICR3_EXTI9_PB ((uint16_t)0x0010) /*!< PB[9] pin */ +#define AFIO_EXTICR3_EXTI9_PC ((uint16_t)0x0020) /*!< PC[9] pin */ +#define AFIO_EXTICR3_EXTI9_PD ((uint16_t)0x0030) /*!< PD[9] pin */ +#define AFIO_EXTICR3_EXTI9_PE ((uint16_t)0x0040) /*!< PE[9] pin */ +#define AFIO_EXTICR3_EXTI9_PF ((uint16_t)0x0050) /*!< PF[9] pin */ +#define AFIO_EXTICR3_EXTI9_PG ((uint16_t)0x0060) /*!< PG[9] pin */ + +/*!< EXTI10 configuration */ +#define AFIO_EXTICR3_EXTI10_PA ((uint16_t)0x0000) /*!< PA[10] pin */ +#define AFIO_EXTICR3_EXTI10_PB ((uint16_t)0x0100) /*!< PB[10] pin */ +#define AFIO_EXTICR3_EXTI10_PC ((uint16_t)0x0200) /*!< PC[10] pin */ +#define AFIO_EXTICR3_EXTI10_PD ((uint16_t)0x0300) /*!< PD[10] pin */ +#define AFIO_EXTICR3_EXTI10_PE ((uint16_t)0x0400) /*!< PE[10] pin */ +#define AFIO_EXTICR3_EXTI10_PF ((uint16_t)0x0500) /*!< PF[10] pin */ +#define AFIO_EXTICR3_EXTI10_PG ((uint16_t)0x0600) /*!< PG[10] pin */ + +/*!< EXTI11 configuration */ +#define AFIO_EXTICR3_EXTI11_PA ((uint16_t)0x0000) /*!< PA[11] pin */ +#define AFIO_EXTICR3_EXTI11_PB ((uint16_t)0x1000) /*!< PB[11] pin */ +#define AFIO_EXTICR3_EXTI11_PC ((uint16_t)0x2000) /*!< PC[11] pin */ +#define AFIO_EXTICR3_EXTI11_PD ((uint16_t)0x3000) /*!< PD[11] pin */ +#define AFIO_EXTICR3_EXTI11_PE ((uint16_t)0x4000) /*!< PE[11] pin */ +#define AFIO_EXTICR3_EXTI11_PF ((uint16_t)0x5000) /*!< PF[11] pin */ +#define AFIO_EXTICR3_EXTI11_PG ((uint16_t)0x6000) /*!< PG[11] pin */ + +/***************** Bit definition for AFIO_EXTICR4 register *****************/ +#define AFIO_EXTICR4_EXTI12 ((uint16_t)0x000F) /*!< EXTI 12 configuration */ +#define AFIO_EXTICR4_EXTI13 ((uint16_t)0x00F0) /*!< EXTI 13 configuration */ +#define AFIO_EXTICR4_EXTI14 ((uint16_t)0x0F00) /*!< EXTI 14 configuration */ +#define AFIO_EXTICR4_EXTI15 ((uint16_t)0xF000) /*!< EXTI 15 configuration */ + +/* EXTI12 configuration */ +#define AFIO_EXTICR4_EXTI12_PA ((uint16_t)0x0000) /*!< PA[12] pin */ +#define AFIO_EXTICR4_EXTI12_PB ((uint16_t)0x0001) /*!< PB[12] pin */ +#define AFIO_EXTICR4_EXTI12_PC ((uint16_t)0x0002) /*!< PC[12] pin */ +#define AFIO_EXTICR4_EXTI12_PD ((uint16_t)0x0003) /*!< PD[12] pin */ +#define AFIO_EXTICR4_EXTI12_PE ((uint16_t)0x0004) /*!< PE[12] pin */ +#define AFIO_EXTICR4_EXTI12_PF ((uint16_t)0x0005) /*!< PF[12] pin */ +#define AFIO_EXTICR4_EXTI12_PG ((uint16_t)0x0006) /*!< PG[12] pin */ + +/* EXTI13 configuration */ +#define AFIO_EXTICR4_EXTI13_PA ((uint16_t)0x0000) /*!< PA[13] pin */ +#define AFIO_EXTICR4_EXTI13_PB ((uint16_t)0x0010) /*!< PB[13] pin */ +#define AFIO_EXTICR4_EXTI13_PC ((uint16_t)0x0020) /*!< PC[13] pin */ +#define AFIO_EXTICR4_EXTI13_PD ((uint16_t)0x0030) /*!< PD[13] pin */ +#define AFIO_EXTICR4_EXTI13_PE ((uint16_t)0x0040) /*!< PE[13] pin */ +#define AFIO_EXTICR4_EXTI13_PF ((uint16_t)0x0050) /*!< PF[13] pin */ +#define AFIO_EXTICR4_EXTI13_PG ((uint16_t)0x0060) /*!< PG[13] pin */ + +/*!< EXTI14 configuration */ +#define AFIO_EXTICR4_EXTI14_PA ((uint16_t)0x0000) /*!< PA[14] pin */ +#define AFIO_EXTICR4_EXTI14_PB ((uint16_t)0x0100) /*!< PB[14] pin */ +#define AFIO_EXTICR4_EXTI14_PC ((uint16_t)0x0200) /*!< PC[14] pin */ +#define AFIO_EXTICR4_EXTI14_PD ((uint16_t)0x0300) /*!< PD[14] pin */ +#define AFIO_EXTICR4_EXTI14_PE ((uint16_t)0x0400) /*!< PE[14] pin */ +#define AFIO_EXTICR4_EXTI14_PF ((uint16_t)0x0500) /*!< PF[14] pin */ +#define AFIO_EXTICR4_EXTI14_PG ((uint16_t)0x0600) /*!< PG[14] pin */ + +/*!< EXTI15 configuration */ +#define AFIO_EXTICR4_EXTI15_PA ((uint16_t)0x0000) /*!< PA[15] pin */ +#define AFIO_EXTICR4_EXTI15_PB ((uint16_t)0x1000) /*!< PB[15] pin */ +#define AFIO_EXTICR4_EXTI15_PC ((uint16_t)0x2000) /*!< PC[15] pin */ +#define AFIO_EXTICR4_EXTI15_PD ((uint16_t)0x3000) /*!< PD[15] pin */ +#define AFIO_EXTICR4_EXTI15_PE ((uint16_t)0x4000) /*!< PE[15] pin */ +#define AFIO_EXTICR4_EXTI15_PF ((uint16_t)0x5000) /*!< PF[15] pin */ +#define AFIO_EXTICR4_EXTI15_PG ((uint16_t)0x6000) /*!< PG[15] pin */ + +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) +/****************** Bit definition for AFIO_MAPR2 register ******************/ +#define AFIO_MAPR2_TIM15_REMAP ((uint32_t)0x00000001) /*!< TIM15 remapping */ +#define AFIO_MAPR2_TIM16_REMAP ((uint32_t)0x00000002) /*!< TIM16 remapping */ +#define AFIO_MAPR2_TIM17_REMAP ((uint32_t)0x00000004) /*!< TIM17 remapping */ +#define AFIO_MAPR2_CEC_REMAP ((uint32_t)0x00000008) /*!< CEC remapping */ +#define AFIO_MAPR2_TIM1_DMA_REMAP ((uint32_t)0x00000010) /*!< TIM1_DMA remapping */ +#endif + +#ifdef STM32F10X_HD_VL +#define AFIO_MAPR2_TIM13_REMAP ((uint32_t)0x00000100) /*!< TIM13 remapping */ +#define AFIO_MAPR2_TIM14_REMAP ((uint32_t)0x00000200) /*!< TIM14 remapping */ +#define AFIO_MAPR2_FSMC_NADV_REMAP ((uint32_t)0x00000400) /*!< FSMC NADV remapping */ +#define AFIO_MAPR2_TIM67_DAC_DMA_REMAP ((uint32_t)0x00000800) /*!< TIM6/TIM7 and DAC DMA remapping */ +#define AFIO_MAPR2_TIM12_REMAP ((uint32_t)0x00001000) /*!< TIM12 remapping */ +#define AFIO_MAPR2_MISC_REMAP ((uint32_t)0x00002000) /*!< Miscellaneous remapping */ +#endif + +#ifdef STM32F10X_XL +/****************** Bit definition for AFIO_MAPR2 register ******************/ +#define AFIO_MAPR2_TIM9_REMAP ((uint32_t)0x00000020) /*!< TIM9 remapping */ +#define AFIO_MAPR2_TIM10_REMAP ((uint32_t)0x00000040) /*!< TIM10 remapping */ +#define AFIO_MAPR2_TIM11_REMAP ((uint32_t)0x00000080) /*!< TIM11 remapping */ +#define AFIO_MAPR2_TIM13_REMAP ((uint32_t)0x00000100) /*!< TIM13 remapping */ +#define AFIO_MAPR2_TIM14_REMAP ((uint32_t)0x00000200) /*!< TIM14 remapping */ +#define AFIO_MAPR2_FSMC_NADV_REMAP ((uint32_t)0x00000400) /*!< FSMC NADV remapping */ +#endif + +/******************************************************************************/ +/* */ +/* SystemTick */ +/* */ +/******************************************************************************/ + +/***************** Bit definition for SysTick_CTRL register *****************/ +#define SysTick_CTRL_ENABLE ((uint32_t)0x00000001) /*!< Counter enable */ +#define SysTick_CTRL_TICKINT ((uint32_t)0x00000002) /*!< Counting down to 0 pends the SysTick handler */ +#define SysTick_CTRL_CLKSOURCE ((uint32_t)0x00000004) /*!< Clock source */ +#define SysTick_CTRL_COUNTFLAG ((uint32_t)0x00010000) /*!< Count Flag */ + +/***************** Bit definition for SysTick_LOAD register *****************/ +#define SysTick_LOAD_RELOAD ((uint32_t)0x00FFFFFF) /*!< Value to load into the SysTick Current Value Register when the counter reaches 0 */ + +/***************** Bit definition for SysTick_VAL register ******************/ +#define SysTick_VAL_CURRENT ((uint32_t)0x00FFFFFF) /*!< Current value at the time the register is accessed */ + +/***************** Bit definition for SysTick_CALIB register ****************/ +#define SysTick_CALIB_TENMS ((uint32_t)0x00FFFFFF) /*!< Reload value to use for 10ms timing */ +#define SysTick_CALIB_SKEW ((uint32_t)0x40000000) /*!< Calibration value is not exactly 10 ms */ +#define SysTick_CALIB_NOREF ((uint32_t)0x80000000) /*!< The reference clock is not provided */ + +/******************************************************************************/ +/* */ +/* Nested Vectored Interrupt Controller */ +/* */ +/******************************************************************************/ + +/****************** Bit definition for NVIC_ISER register *******************/ +#define NVIC_ISER_SETENA ((uint32_t)0xFFFFFFFF) /*!< Interrupt set enable bits */ +#define NVIC_ISER_SETENA_0 ((uint32_t)0x00000001) /*!< bit 0 */ +#define NVIC_ISER_SETENA_1 ((uint32_t)0x00000002) /*!< bit 1 */ +#define NVIC_ISER_SETENA_2 ((uint32_t)0x00000004) /*!< bit 2 */ +#define NVIC_ISER_SETENA_3 ((uint32_t)0x00000008) /*!< bit 3 */ +#define NVIC_ISER_SETENA_4 ((uint32_t)0x00000010) /*!< bit 4 */ +#define NVIC_ISER_SETENA_5 ((uint32_t)0x00000020) /*!< bit 5 */ +#define NVIC_ISER_SETENA_6 ((uint32_t)0x00000040) /*!< bit 6 */ +#define NVIC_ISER_SETENA_7 ((uint32_t)0x00000080) /*!< bit 7 */ +#define NVIC_ISER_SETENA_8 ((uint32_t)0x00000100) /*!< bit 8 */ +#define NVIC_ISER_SETENA_9 ((uint32_t)0x00000200) /*!< bit 9 */ +#define NVIC_ISER_SETENA_10 ((uint32_t)0x00000400) /*!< bit 10 */ +#define NVIC_ISER_SETENA_11 ((uint32_t)0x00000800) /*!< bit 11 */ +#define NVIC_ISER_SETENA_12 ((uint32_t)0x00001000) /*!< bit 12 */ +#define NVIC_ISER_SETENA_13 ((uint32_t)0x00002000) /*!< bit 13 */ +#define NVIC_ISER_SETENA_14 ((uint32_t)0x00004000) /*!< bit 14 */ +#define NVIC_ISER_SETENA_15 ((uint32_t)0x00008000) /*!< bit 15 */ +#define NVIC_ISER_SETENA_16 ((uint32_t)0x00010000) /*!< bit 16 */ +#define NVIC_ISER_SETENA_17 ((uint32_t)0x00020000) /*!< bit 17 */ +#define NVIC_ISER_SETENA_18 ((uint32_t)0x00040000) /*!< bit 18 */ +#define NVIC_ISER_SETENA_19 ((uint32_t)0x00080000) /*!< bit 19 */ +#define NVIC_ISER_SETENA_20 ((uint32_t)0x00100000) /*!< bit 20 */ +#define NVIC_ISER_SETENA_21 ((uint32_t)0x00200000) /*!< bit 21 */ +#define NVIC_ISER_SETENA_22 ((uint32_t)0x00400000) /*!< bit 22 */ +#define NVIC_ISER_SETENA_23 ((uint32_t)0x00800000) /*!< bit 23 */ +#define NVIC_ISER_SETENA_24 ((uint32_t)0x01000000) /*!< bit 24 */ +#define NVIC_ISER_SETENA_25 ((uint32_t)0x02000000) /*!< bit 25 */ +#define NVIC_ISER_SETENA_26 ((uint32_t)0x04000000) /*!< bit 26 */ +#define NVIC_ISER_SETENA_27 ((uint32_t)0x08000000) /*!< bit 27 */ +#define NVIC_ISER_SETENA_28 ((uint32_t)0x10000000) /*!< bit 28 */ +#define NVIC_ISER_SETENA_29 ((uint32_t)0x20000000) /*!< bit 29 */ +#define NVIC_ISER_SETENA_30 ((uint32_t)0x40000000) /*!< bit 30 */ +#define NVIC_ISER_SETENA_31 ((uint32_t)0x80000000) /*!< bit 31 */ + +/****************** Bit definition for NVIC_ICER register *******************/ +#define NVIC_ICER_CLRENA ((uint32_t)0xFFFFFFFF) /*!< Interrupt clear-enable bits */ +#define NVIC_ICER_CLRENA_0 ((uint32_t)0x00000001) /*!< bit 0 */ +#define NVIC_ICER_CLRENA_1 ((uint32_t)0x00000002) /*!< bit 1 */ +#define NVIC_ICER_CLRENA_2 ((uint32_t)0x00000004) /*!< bit 2 */ +#define NVIC_ICER_CLRENA_3 ((uint32_t)0x00000008) /*!< bit 3 */ +#define NVIC_ICER_CLRENA_4 ((uint32_t)0x00000010) /*!< bit 4 */ +#define NVIC_ICER_CLRENA_5 ((uint32_t)0x00000020) /*!< bit 5 */ +#define NVIC_ICER_CLRENA_6 ((uint32_t)0x00000040) /*!< bit 6 */ +#define NVIC_ICER_CLRENA_7 ((uint32_t)0x00000080) /*!< bit 7 */ +#define NVIC_ICER_CLRENA_8 ((uint32_t)0x00000100) /*!< bit 8 */ +#define NVIC_ICER_CLRENA_9 ((uint32_t)0x00000200) /*!< bit 9 */ +#define NVIC_ICER_CLRENA_10 ((uint32_t)0x00000400) /*!< bit 10 */ +#define NVIC_ICER_CLRENA_11 ((uint32_t)0x00000800) /*!< bit 11 */ +#define NVIC_ICER_CLRENA_12 ((uint32_t)0x00001000) /*!< bit 12 */ +#define NVIC_ICER_CLRENA_13 ((uint32_t)0x00002000) /*!< bit 13 */ +#define NVIC_ICER_CLRENA_14 ((uint32_t)0x00004000) /*!< bit 14 */ +#define NVIC_ICER_CLRENA_15 ((uint32_t)0x00008000) /*!< bit 15 */ +#define NVIC_ICER_CLRENA_16 ((uint32_t)0x00010000) /*!< bit 16 */ +#define NVIC_ICER_CLRENA_17 ((uint32_t)0x00020000) /*!< bit 17 */ +#define NVIC_ICER_CLRENA_18 ((uint32_t)0x00040000) /*!< bit 18 */ +#define NVIC_ICER_CLRENA_19 ((uint32_t)0x00080000) /*!< bit 19 */ +#define NVIC_ICER_CLRENA_20 ((uint32_t)0x00100000) /*!< bit 20 */ +#define NVIC_ICER_CLRENA_21 ((uint32_t)0x00200000) /*!< bit 21 */ +#define NVIC_ICER_CLRENA_22 ((uint32_t)0x00400000) /*!< bit 22 */ +#define NVIC_ICER_CLRENA_23 ((uint32_t)0x00800000) /*!< bit 23 */ +#define NVIC_ICER_CLRENA_24 ((uint32_t)0x01000000) /*!< bit 24 */ +#define NVIC_ICER_CLRENA_25 ((uint32_t)0x02000000) /*!< bit 25 */ +#define NVIC_ICER_CLRENA_26 ((uint32_t)0x04000000) /*!< bit 26 */ +#define NVIC_ICER_CLRENA_27 ((uint32_t)0x08000000) /*!< bit 27 */ +#define NVIC_ICER_CLRENA_28 ((uint32_t)0x10000000) /*!< bit 28 */ +#define NVIC_ICER_CLRENA_29 ((uint32_t)0x20000000) /*!< bit 29 */ +#define NVIC_ICER_CLRENA_30 ((uint32_t)0x40000000) /*!< bit 30 */ +#define NVIC_ICER_CLRENA_31 ((uint32_t)0x80000000) /*!< bit 31 */ + +/****************** Bit definition for NVIC_ISPR register *******************/ +#define NVIC_ISPR_SETPEND ((uint32_t)0xFFFFFFFF) /*!< Interrupt set-pending bits */ +#define NVIC_ISPR_SETPEND_0 ((uint32_t)0x00000001) /*!< bit 0 */ +#define NVIC_ISPR_SETPEND_1 ((uint32_t)0x00000002) /*!< bit 1 */ +#define NVIC_ISPR_SETPEND_2 ((uint32_t)0x00000004) /*!< bit 2 */ +#define NVIC_ISPR_SETPEND_3 ((uint32_t)0x00000008) /*!< bit 3 */ +#define NVIC_ISPR_SETPEND_4 ((uint32_t)0x00000010) /*!< bit 4 */ +#define NVIC_ISPR_SETPEND_5 ((uint32_t)0x00000020) /*!< bit 5 */ +#define NVIC_ISPR_SETPEND_6 ((uint32_t)0x00000040) /*!< bit 6 */ +#define NVIC_ISPR_SETPEND_7 ((uint32_t)0x00000080) /*!< bit 7 */ +#define NVIC_ISPR_SETPEND_8 ((uint32_t)0x00000100) /*!< bit 8 */ +#define NVIC_ISPR_SETPEND_9 ((uint32_t)0x00000200) /*!< bit 9 */ +#define NVIC_ISPR_SETPEND_10 ((uint32_t)0x00000400) /*!< bit 10 */ +#define NVIC_ISPR_SETPEND_11 ((uint32_t)0x00000800) /*!< bit 11 */ +#define NVIC_ISPR_SETPEND_12 ((uint32_t)0x00001000) /*!< bit 12 */ +#define NVIC_ISPR_SETPEND_13 ((uint32_t)0x00002000) /*!< bit 13 */ +#define NVIC_ISPR_SETPEND_14 ((uint32_t)0x00004000) /*!< bit 14 */ +#define NVIC_ISPR_SETPEND_15 ((uint32_t)0x00008000) /*!< bit 15 */ +#define NVIC_ISPR_SETPEND_16 ((uint32_t)0x00010000) /*!< bit 16 */ +#define NVIC_ISPR_SETPEND_17 ((uint32_t)0x00020000) /*!< bit 17 */ +#define NVIC_ISPR_SETPEND_18 ((uint32_t)0x00040000) /*!< bit 18 */ +#define NVIC_ISPR_SETPEND_19 ((uint32_t)0x00080000) /*!< bit 19 */ +#define NVIC_ISPR_SETPEND_20 ((uint32_t)0x00100000) /*!< bit 20 */ +#define NVIC_ISPR_SETPEND_21 ((uint32_t)0x00200000) /*!< bit 21 */ +#define NVIC_ISPR_SETPEND_22 ((uint32_t)0x00400000) /*!< bit 22 */ +#define NVIC_ISPR_SETPEND_23 ((uint32_t)0x00800000) /*!< bit 23 */ +#define NVIC_ISPR_SETPEND_24 ((uint32_t)0x01000000) /*!< bit 24 */ +#define NVIC_ISPR_SETPEND_25 ((uint32_t)0x02000000) /*!< bit 25 */ +#define NVIC_ISPR_SETPEND_26 ((uint32_t)0x04000000) /*!< bit 26 */ +#define NVIC_ISPR_SETPEND_27 ((uint32_t)0x08000000) /*!< bit 27 */ +#define NVIC_ISPR_SETPEND_28 ((uint32_t)0x10000000) /*!< bit 28 */ +#define NVIC_ISPR_SETPEND_29 ((uint32_t)0x20000000) /*!< bit 29 */ +#define NVIC_ISPR_SETPEND_30 ((uint32_t)0x40000000) /*!< bit 30 */ +#define NVIC_ISPR_SETPEND_31 ((uint32_t)0x80000000) /*!< bit 31 */ + +/****************** Bit definition for NVIC_ICPR register *******************/ +#define NVIC_ICPR_CLRPEND ((uint32_t)0xFFFFFFFF) /*!< Interrupt clear-pending bits */ +#define NVIC_ICPR_CLRPEND_0 ((uint32_t)0x00000001) /*!< bit 0 */ +#define NVIC_ICPR_CLRPEND_1 ((uint32_t)0x00000002) /*!< bit 1 */ +#define NVIC_ICPR_CLRPEND_2 ((uint32_t)0x00000004) /*!< bit 2 */ +#define NVIC_ICPR_CLRPEND_3 ((uint32_t)0x00000008) /*!< bit 3 */ +#define NVIC_ICPR_CLRPEND_4 ((uint32_t)0x00000010) /*!< bit 4 */ +#define NVIC_ICPR_CLRPEND_5 ((uint32_t)0x00000020) /*!< bit 5 */ +#define NVIC_ICPR_CLRPEND_6 ((uint32_t)0x00000040) /*!< bit 6 */ +#define NVIC_ICPR_CLRPEND_7 ((uint32_t)0x00000080) /*!< bit 7 */ +#define NVIC_ICPR_CLRPEND_8 ((uint32_t)0x00000100) /*!< bit 8 */ +#define NVIC_ICPR_CLRPEND_9 ((uint32_t)0x00000200) /*!< bit 9 */ +#define NVIC_ICPR_CLRPEND_10 ((uint32_t)0x00000400) /*!< bit 10 */ +#define NVIC_ICPR_CLRPEND_11 ((uint32_t)0x00000800) /*!< bit 11 */ +#define NVIC_ICPR_CLRPEND_12 ((uint32_t)0x00001000) /*!< bit 12 */ +#define NVIC_ICPR_CLRPEND_13 ((uint32_t)0x00002000) /*!< bit 13 */ +#define NVIC_ICPR_CLRPEND_14 ((uint32_t)0x00004000) /*!< bit 14 */ +#define NVIC_ICPR_CLRPEND_15 ((uint32_t)0x00008000) /*!< bit 15 */ +#define NVIC_ICPR_CLRPEND_16 ((uint32_t)0x00010000) /*!< bit 16 */ +#define NVIC_ICPR_CLRPEND_17 ((uint32_t)0x00020000) /*!< bit 17 */ +#define NVIC_ICPR_CLRPEND_18 ((uint32_t)0x00040000) /*!< bit 18 */ +#define NVIC_ICPR_CLRPEND_19 ((uint32_t)0x00080000) /*!< bit 19 */ +#define NVIC_ICPR_CLRPEND_20 ((uint32_t)0x00100000) /*!< bit 20 */ +#define NVIC_ICPR_CLRPEND_21 ((uint32_t)0x00200000) /*!< bit 21 */ +#define NVIC_ICPR_CLRPEND_22 ((uint32_t)0x00400000) /*!< bit 22 */ +#define NVIC_ICPR_CLRPEND_23 ((uint32_t)0x00800000) /*!< bit 23 */ +#define NVIC_ICPR_CLRPEND_24 ((uint32_t)0x01000000) /*!< bit 24 */ +#define NVIC_ICPR_CLRPEND_25 ((uint32_t)0x02000000) /*!< bit 25 */ +#define NVIC_ICPR_CLRPEND_26 ((uint32_t)0x04000000) /*!< bit 26 */ +#define NVIC_ICPR_CLRPEND_27 ((uint32_t)0x08000000) /*!< bit 27 */ +#define NVIC_ICPR_CLRPEND_28 ((uint32_t)0x10000000) /*!< bit 28 */ +#define NVIC_ICPR_CLRPEND_29 ((uint32_t)0x20000000) /*!< bit 29 */ +#define NVIC_ICPR_CLRPEND_30 ((uint32_t)0x40000000) /*!< bit 30 */ +#define NVIC_ICPR_CLRPEND_31 ((uint32_t)0x80000000) /*!< bit 31 */ + +/****************** Bit definition for NVIC_IABR register *******************/ +#define NVIC_IABR_ACTIVE ((uint32_t)0xFFFFFFFF) /*!< Interrupt active flags */ +#define NVIC_IABR_ACTIVE_0 ((uint32_t)0x00000001) /*!< bit 0 */ +#define NVIC_IABR_ACTIVE_1 ((uint32_t)0x00000002) /*!< bit 1 */ +#define NVIC_IABR_ACTIVE_2 ((uint32_t)0x00000004) /*!< bit 2 */ +#define NVIC_IABR_ACTIVE_3 ((uint32_t)0x00000008) /*!< bit 3 */ +#define NVIC_IABR_ACTIVE_4 ((uint32_t)0x00000010) /*!< bit 4 */ +#define NVIC_IABR_ACTIVE_5 ((uint32_t)0x00000020) /*!< bit 5 */ +#define NVIC_IABR_ACTIVE_6 ((uint32_t)0x00000040) /*!< bit 6 */ +#define NVIC_IABR_ACTIVE_7 ((uint32_t)0x00000080) /*!< bit 7 */ +#define NVIC_IABR_ACTIVE_8 ((uint32_t)0x00000100) /*!< bit 8 */ +#define NVIC_IABR_ACTIVE_9 ((uint32_t)0x00000200) /*!< bit 9 */ +#define NVIC_IABR_ACTIVE_10 ((uint32_t)0x00000400) /*!< bit 10 */ +#define NVIC_IABR_ACTIVE_11 ((uint32_t)0x00000800) /*!< bit 11 */ +#define NVIC_IABR_ACTIVE_12 ((uint32_t)0x00001000) /*!< bit 12 */ +#define NVIC_IABR_ACTIVE_13 ((uint32_t)0x00002000) /*!< bit 13 */ +#define NVIC_IABR_ACTIVE_14 ((uint32_t)0x00004000) /*!< bit 14 */ +#define NVIC_IABR_ACTIVE_15 ((uint32_t)0x00008000) /*!< bit 15 */ +#define NVIC_IABR_ACTIVE_16 ((uint32_t)0x00010000) /*!< bit 16 */ +#define NVIC_IABR_ACTIVE_17 ((uint32_t)0x00020000) /*!< bit 17 */ +#define NVIC_IABR_ACTIVE_18 ((uint32_t)0x00040000) /*!< bit 18 */ +#define NVIC_IABR_ACTIVE_19 ((uint32_t)0x00080000) /*!< bit 19 */ +#define NVIC_IABR_ACTIVE_20 ((uint32_t)0x00100000) /*!< bit 20 */ +#define NVIC_IABR_ACTIVE_21 ((uint32_t)0x00200000) /*!< bit 21 */ +#define NVIC_IABR_ACTIVE_22 ((uint32_t)0x00400000) /*!< bit 22 */ +#define NVIC_IABR_ACTIVE_23 ((uint32_t)0x00800000) /*!< bit 23 */ +#define NVIC_IABR_ACTIVE_24 ((uint32_t)0x01000000) /*!< bit 24 */ +#define NVIC_IABR_ACTIVE_25 ((uint32_t)0x02000000) /*!< bit 25 */ +#define NVIC_IABR_ACTIVE_26 ((uint32_t)0x04000000) /*!< bit 26 */ +#define NVIC_IABR_ACTIVE_27 ((uint32_t)0x08000000) /*!< bit 27 */ +#define NVIC_IABR_ACTIVE_28 ((uint32_t)0x10000000) /*!< bit 28 */ +#define NVIC_IABR_ACTIVE_29 ((uint32_t)0x20000000) /*!< bit 29 */ +#define NVIC_IABR_ACTIVE_30 ((uint32_t)0x40000000) /*!< bit 30 */ +#define NVIC_IABR_ACTIVE_31 ((uint32_t)0x80000000) /*!< bit 31 */ + +/****************** Bit definition for NVIC_PRI0 register *******************/ +#define NVIC_IPR0_PRI_0 ((uint32_t)0x000000FF) /*!< Priority of interrupt 0 */ +#define NVIC_IPR0_PRI_1 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 1 */ +#define NVIC_IPR0_PRI_2 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 2 */ +#define NVIC_IPR0_PRI_3 ((uint32_t)0xFF000000) /*!< Priority of interrupt 3 */ + +/****************** Bit definition for NVIC_PRI1 register *******************/ +#define NVIC_IPR1_PRI_4 ((uint32_t)0x000000FF) /*!< Priority of interrupt 4 */ +#define NVIC_IPR1_PRI_5 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 5 */ +#define NVIC_IPR1_PRI_6 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 6 */ +#define NVIC_IPR1_PRI_7 ((uint32_t)0xFF000000) /*!< Priority of interrupt 7 */ + +/****************** Bit definition for NVIC_PRI2 register *******************/ +#define NVIC_IPR2_PRI_8 ((uint32_t)0x000000FF) /*!< Priority of interrupt 8 */ +#define NVIC_IPR2_PRI_9 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 9 */ +#define NVIC_IPR2_PRI_10 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 10 */ +#define NVIC_IPR2_PRI_11 ((uint32_t)0xFF000000) /*!< Priority of interrupt 11 */ + +/****************** Bit definition for NVIC_PRI3 register *******************/ +#define NVIC_IPR3_PRI_12 ((uint32_t)0x000000FF) /*!< Priority of interrupt 12 */ +#define NVIC_IPR3_PRI_13 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 13 */ +#define NVIC_IPR3_PRI_14 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 14 */ +#define NVIC_IPR3_PRI_15 ((uint32_t)0xFF000000) /*!< Priority of interrupt 15 */ + +/****************** Bit definition for NVIC_PRI4 register *******************/ +#define NVIC_IPR4_PRI_16 ((uint32_t)0x000000FF) /*!< Priority of interrupt 16 */ +#define NVIC_IPR4_PRI_17 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 17 */ +#define NVIC_IPR4_PRI_18 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 18 */ +#define NVIC_IPR4_PRI_19 ((uint32_t)0xFF000000) /*!< Priority of interrupt 19 */ + +/****************** Bit definition for NVIC_PRI5 register *******************/ +#define NVIC_IPR5_PRI_20 ((uint32_t)0x000000FF) /*!< Priority of interrupt 20 */ +#define NVIC_IPR5_PRI_21 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 21 */ +#define NVIC_IPR5_PRI_22 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 22 */ +#define NVIC_IPR5_PRI_23 ((uint32_t)0xFF000000) /*!< Priority of interrupt 23 */ + +/****************** Bit definition for NVIC_PRI6 register *******************/ +#define NVIC_IPR6_PRI_24 ((uint32_t)0x000000FF) /*!< Priority of interrupt 24 */ +#define NVIC_IPR6_PRI_25 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 25 */ +#define NVIC_IPR6_PRI_26 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 26 */ +#define NVIC_IPR6_PRI_27 ((uint32_t)0xFF000000) /*!< Priority of interrupt 27 */ + +/****************** Bit definition for NVIC_PRI7 register *******************/ +#define NVIC_IPR7_PRI_28 ((uint32_t)0x000000FF) /*!< Priority of interrupt 28 */ +#define NVIC_IPR7_PRI_29 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 29 */ +#define NVIC_IPR7_PRI_30 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 30 */ +#define NVIC_IPR7_PRI_31 ((uint32_t)0xFF000000) /*!< Priority of interrupt 31 */ + +/****************** Bit definition for SCB_CPUID register *******************/ +#define SCB_CPUID_REVISION ((uint32_t)0x0000000F) /*!< Implementation defined revision number */ +#define SCB_CPUID_PARTNO ((uint32_t)0x0000FFF0) /*!< Number of processor within family */ +#define SCB_CPUID_Constant ((uint32_t)0x000F0000) /*!< Reads as 0x0F */ +#define SCB_CPUID_VARIANT ((uint32_t)0x00F00000) /*!< Implementation defined variant number */ +#define SCB_CPUID_IMPLEMENTER ((uint32_t)0xFF000000) /*!< Implementer code. ARM is 0x41 */ + +/******************* Bit definition for SCB_ICSR register *******************/ +#define SCB_ICSR_VECTACTIVE ((uint32_t)0x000001FF) /*!< Active ISR number field */ +#define SCB_ICSR_RETTOBASE ((uint32_t)0x00000800) /*!< All active exceptions minus the IPSR_current_exception yields the empty set */ +#define SCB_ICSR_VECTPENDING ((uint32_t)0x003FF000) /*!< Pending ISR number field */ +#define SCB_ICSR_ISRPENDING ((uint32_t)0x00400000) /*!< Interrupt pending flag */ +#define SCB_ICSR_ISRPREEMPT ((uint32_t)0x00800000) /*!< It indicates that a pending interrupt becomes active in the next running cycle */ +#define SCB_ICSR_PENDSTCLR ((uint32_t)0x02000000) /*!< Clear pending SysTick bit */ +#define SCB_ICSR_PENDSTSET ((uint32_t)0x04000000) /*!< Set pending SysTick bit */ +#define SCB_ICSR_PENDSVCLR ((uint32_t)0x08000000) /*!< Clear pending pendSV bit */ +#define SCB_ICSR_PENDSVSET ((uint32_t)0x10000000) /*!< Set pending pendSV bit */ +#define SCB_ICSR_NMIPENDSET ((uint32_t)0x80000000) /*!< Set pending NMI bit */ + +/******************* Bit definition for SCB_VTOR register *******************/ +#define SCB_VTOR_TBLOFF ((uint32_t)0x1FFFFF80) /*!< Vector table base offset field */ +#define SCB_VTOR_TBLBASE ((uint32_t)0x20000000) /*!< Table base in code(0) or RAM(1) */ + +/*!<***************** Bit definition for SCB_AIRCR register *******************/ +#define SCB_AIRCR_VECTRESET ((uint32_t)0x00000001) /*!< System Reset bit */ +#define SCB_AIRCR_VECTCLRACTIVE ((uint32_t)0x00000002) /*!< Clear active vector bit */ +#define SCB_AIRCR_SYSRESETREQ ((uint32_t)0x00000004) /*!< Requests chip control logic to generate a reset */ + +#define SCB_AIRCR_PRIGROUP ((uint32_t)0x00000700) /*!< PRIGROUP[2:0] bits (Priority group) */ +#define SCB_AIRCR_PRIGROUP_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define SCB_AIRCR_PRIGROUP_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define SCB_AIRCR_PRIGROUP_2 ((uint32_t)0x00000400) /*!< Bit 2 */ + +/* prority group configuration */ +#define SCB_AIRCR_PRIGROUP0 ((uint32_t)0x00000000) /*!< Priority group=0 (7 bits of pre-emption priority, 1 bit of subpriority) */ +#define SCB_AIRCR_PRIGROUP1 ((uint32_t)0x00000100) /*!< Priority group=1 (6 bits of pre-emption priority, 2 bits of subpriority) */ +#define SCB_AIRCR_PRIGROUP2 ((uint32_t)0x00000200) /*!< Priority group=2 (5 bits of pre-emption priority, 3 bits of subpriority) */ +#define SCB_AIRCR_PRIGROUP3 ((uint32_t)0x00000300) /*!< Priority group=3 (4 bits of pre-emption priority, 4 bits of subpriority) */ +#define SCB_AIRCR_PRIGROUP4 ((uint32_t)0x00000400) /*!< Priority group=4 (3 bits of pre-emption priority, 5 bits of subpriority) */ +#define SCB_AIRCR_PRIGROUP5 ((uint32_t)0x00000500) /*!< Priority group=5 (2 bits of pre-emption priority, 6 bits of subpriority) */ +#define SCB_AIRCR_PRIGROUP6 ((uint32_t)0x00000600) /*!< Priority group=6 (1 bit of pre-emption priority, 7 bits of subpriority) */ +#define SCB_AIRCR_PRIGROUP7 ((uint32_t)0x00000700) /*!< Priority group=7 (no pre-emption priority, 8 bits of subpriority) */ + +#define SCB_AIRCR_ENDIANESS ((uint32_t)0x00008000) /*!< Data endianness bit */ +#define SCB_AIRCR_VECTKEY ((uint32_t)0xFFFF0000) /*!< Register key (VECTKEY) - Reads as 0xFA05 (VECTKEYSTAT) */ + +/******************* Bit definition for SCB_SCR register ********************/ +#define SCB_SCR_SLEEPONEXIT ((uint8_t)0x02) /*!< Sleep on exit bit */ +#define SCB_SCR_SLEEPDEEP ((uint8_t)0x04) /*!< Sleep deep bit */ +#define SCB_SCR_SEVONPEND ((uint8_t)0x10) /*!< Wake up from WFE */ + +/******************** Bit definition for SCB_CCR register *******************/ +#define SCB_CCR_NONBASETHRDENA ((uint16_t)0x0001) /*!< Thread mode can be entered from any level in Handler mode by controlled return value */ +#define SCB_CCR_USERSETMPEND ((uint16_t)0x0002) /*!< Enables user code to write the Software Trigger Interrupt register to trigger (pend) a Main exception */ +#define SCB_CCR_UNALIGN_TRP ((uint16_t)0x0008) /*!< Trap for unaligned access */ +#define SCB_CCR_DIV_0_TRP ((uint16_t)0x0010) /*!< Trap on Divide by 0 */ +#define SCB_CCR_BFHFNMIGN ((uint16_t)0x0100) /*!< Handlers running at priority -1 and -2 */ +#define SCB_CCR_STKALIGN ((uint16_t)0x0200) /*!< On exception entry, the SP used prior to the exception is adjusted to be 8-byte aligned */ + +/******************* Bit definition for SCB_SHPR register ********************/ +#define SCB_SHPR_PRI_N ((uint32_t)0x000000FF) /*!< Priority of system handler 4,8, and 12. Mem Manage, reserved and Debug Monitor */ +#define SCB_SHPR_PRI_N1 ((uint32_t)0x0000FF00) /*!< Priority of system handler 5,9, and 13. Bus Fault, reserved and reserved */ +#define SCB_SHPR_PRI_N2 ((uint32_t)0x00FF0000) /*!< Priority of system handler 6,10, and 14. Usage Fault, reserved and PendSV */ +#define SCB_SHPR_PRI_N3 ((uint32_t)0xFF000000) /*!< Priority of system handler 7,11, and 15. Reserved, SVCall and SysTick */ + +/****************** Bit definition for SCB_SHCSR register *******************/ +#define SCB_SHCSR_MEMFAULTACT ((uint32_t)0x00000001) /*!< MemManage is active */ +#define SCB_SHCSR_BUSFAULTACT ((uint32_t)0x00000002) /*!< BusFault is active */ +#define SCB_SHCSR_USGFAULTACT ((uint32_t)0x00000008) /*!< UsageFault is active */ +#define SCB_SHCSR_SVCALLACT ((uint32_t)0x00000080) /*!< SVCall is active */ +#define SCB_SHCSR_MONITORACT ((uint32_t)0x00000100) /*!< Monitor is active */ +#define SCB_SHCSR_PENDSVACT ((uint32_t)0x00000400) /*!< PendSV is active */ +#define SCB_SHCSR_SYSTICKACT ((uint32_t)0x00000800) /*!< SysTick is active */ +#define SCB_SHCSR_USGFAULTPENDED ((uint32_t)0x00001000) /*!< Usage Fault is pended */ +#define SCB_SHCSR_MEMFAULTPENDED ((uint32_t)0x00002000) /*!< MemManage is pended */ +#define SCB_SHCSR_BUSFAULTPENDED ((uint32_t)0x00004000) /*!< Bus Fault is pended */ +#define SCB_SHCSR_SVCALLPENDED ((uint32_t)0x00008000) /*!< SVCall is pended */ +#define SCB_SHCSR_MEMFAULTENA ((uint32_t)0x00010000) /*!< MemManage enable */ +#define SCB_SHCSR_BUSFAULTENA ((uint32_t)0x00020000) /*!< Bus Fault enable */ +#define SCB_SHCSR_USGFAULTENA ((uint32_t)0x00040000) /*!< UsageFault enable */ + +/******************* Bit definition for SCB_CFSR register *******************/ +/*!< MFSR */ +#define SCB_CFSR_IACCVIOL ((uint32_t)0x00000001) /*!< Instruction access violation */ +#define SCB_CFSR_DACCVIOL ((uint32_t)0x00000002) /*!< Data access violation */ +#define SCB_CFSR_MUNSTKERR ((uint32_t)0x00000008) /*!< Unstacking error */ +#define SCB_CFSR_MSTKERR ((uint32_t)0x00000010) /*!< Stacking error */ +#define SCB_CFSR_MMARVALID ((uint32_t)0x00000080) /*!< Memory Manage Address Register address valid flag */ +/*!< BFSR */ +#define SCB_CFSR_IBUSERR ((uint32_t)0x00000100) /*!< Instruction bus error flag */ +#define SCB_CFSR_PRECISERR ((uint32_t)0x00000200) /*!< Precise data bus error */ +#define SCB_CFSR_IMPRECISERR ((uint32_t)0x00000400) /*!< Imprecise data bus error */ +#define SCB_CFSR_UNSTKERR ((uint32_t)0x00000800) /*!< Unstacking error */ +#define SCB_CFSR_STKERR ((uint32_t)0x00001000) /*!< Stacking error */ +#define SCB_CFSR_BFARVALID ((uint32_t)0x00008000) /*!< Bus Fault Address Register address valid flag */ +/*!< UFSR */ +#define SCB_CFSR_UNDEFINSTR ((uint32_t)0x00010000) /*!< The processor attempt to execute an undefined instruction */ +#define SCB_CFSR_INVSTATE ((uint32_t)0x00020000) /*!< Invalid combination of EPSR and instruction */ +#define SCB_CFSR_INVPC ((uint32_t)0x00040000) /*!< Attempt to load EXC_RETURN into pc illegally */ +#define SCB_CFSR_NOCP ((uint32_t)0x00080000) /*!< Attempt to use a coprocessor instruction */ +#define SCB_CFSR_UNALIGNED ((uint32_t)0x01000000) /*!< Fault occurs when there is an attempt to make an unaligned memory access */ +#define SCB_CFSR_DIVBYZERO ((uint32_t)0x02000000) /*!< Fault occurs when SDIV or DIV instruction is used with a divisor of 0 */ + +/******************* Bit definition for SCB_HFSR register *******************/ +#define SCB_HFSR_VECTTBL ((uint32_t)0x00000002) /*!< Fault occurs because of vector table read on exception processing */ +#define SCB_HFSR_FORCED ((uint32_t)0x40000000) /*!< Hard Fault activated when a configurable Fault was received and cannot activate */ +#define SCB_HFSR_DEBUGEVT ((uint32_t)0x80000000) /*!< Fault related to debug */ + +/******************* Bit definition for SCB_DFSR register *******************/ +#define SCB_DFSR_HALTED ((uint8_t)0x01) /*!< Halt request flag */ +#define SCB_DFSR_BKPT ((uint8_t)0x02) /*!< BKPT flag */ +#define SCB_DFSR_DWTTRAP ((uint8_t)0x04) /*!< Data Watchpoint and Trace (DWT) flag */ +#define SCB_DFSR_VCATCH ((uint8_t)0x08) /*!< Vector catch flag */ +#define SCB_DFSR_EXTERNAL ((uint8_t)0x10) /*!< External debug request flag */ + +/******************* Bit definition for SCB_MMFAR register ******************/ +#define SCB_MMFAR_ADDRESS ((uint32_t)0xFFFFFFFF) /*!< Mem Manage fault address field */ + +/******************* Bit definition for SCB_BFAR register *******************/ +#define SCB_BFAR_ADDRESS ((uint32_t)0xFFFFFFFF) /*!< Bus fault address field */ + +/******************* Bit definition for SCB_afsr register *******************/ +#define SCB_AFSR_IMPDEF ((uint32_t)0xFFFFFFFF) /*!< Implementation defined */ + +/******************************************************************************/ +/* */ +/* External Interrupt/Event Controller */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for EXTI_IMR register *******************/ +#define EXTI_IMR_MR0 ((uint32_t)0x00000001) /*!< Interrupt Mask on line 0 */ +#define EXTI_IMR_MR1 ((uint32_t)0x00000002) /*!< Interrupt Mask on line 1 */ +#define EXTI_IMR_MR2 ((uint32_t)0x00000004) /*!< Interrupt Mask on line 2 */ +#define EXTI_IMR_MR3 ((uint32_t)0x00000008) /*!< Interrupt Mask on line 3 */ +#define EXTI_IMR_MR4 ((uint32_t)0x00000010) /*!< Interrupt Mask on line 4 */ +#define EXTI_IMR_MR5 ((uint32_t)0x00000020) /*!< Interrupt Mask on line 5 */ +#define EXTI_IMR_MR6 ((uint32_t)0x00000040) /*!< Interrupt Mask on line 6 */ +#define EXTI_IMR_MR7 ((uint32_t)0x00000080) /*!< Interrupt Mask on line 7 */ +#define EXTI_IMR_MR8 ((uint32_t)0x00000100) /*!< Interrupt Mask on line 8 */ +#define EXTI_IMR_MR9 ((uint32_t)0x00000200) /*!< Interrupt Mask on line 9 */ +#define EXTI_IMR_MR10 ((uint32_t)0x00000400) /*!< Interrupt Mask on line 10 */ +#define EXTI_IMR_MR11 ((uint32_t)0x00000800) /*!< Interrupt Mask on line 11 */ +#define EXTI_IMR_MR12 ((uint32_t)0x00001000) /*!< Interrupt Mask on line 12 */ +#define EXTI_IMR_MR13 ((uint32_t)0x00002000) /*!< Interrupt Mask on line 13 */ +#define EXTI_IMR_MR14 ((uint32_t)0x00004000) /*!< Interrupt Mask on line 14 */ +#define EXTI_IMR_MR15 ((uint32_t)0x00008000) /*!< Interrupt Mask on line 15 */ +#define EXTI_IMR_MR16 ((uint32_t)0x00010000) /*!< Interrupt Mask on line 16 */ +#define EXTI_IMR_MR17 ((uint32_t)0x00020000) /*!< Interrupt Mask on line 17 */ +#define EXTI_IMR_MR18 ((uint32_t)0x00040000) /*!< Interrupt Mask on line 18 */ +#define EXTI_IMR_MR19 ((uint32_t)0x00080000) /*!< Interrupt Mask on line 19 */ + +/******************* Bit definition for EXTI_EMR register *******************/ +#define EXTI_EMR_MR0 ((uint32_t)0x00000001) /*!< Event Mask on line 0 */ +#define EXTI_EMR_MR1 ((uint32_t)0x00000002) /*!< Event Mask on line 1 */ +#define EXTI_EMR_MR2 ((uint32_t)0x00000004) /*!< Event Mask on line 2 */ +#define EXTI_EMR_MR3 ((uint32_t)0x00000008) /*!< Event Mask on line 3 */ +#define EXTI_EMR_MR4 ((uint32_t)0x00000010) /*!< Event Mask on line 4 */ +#define EXTI_EMR_MR5 ((uint32_t)0x00000020) /*!< Event Mask on line 5 */ +#define EXTI_EMR_MR6 ((uint32_t)0x00000040) /*!< Event Mask on line 6 */ +#define EXTI_EMR_MR7 ((uint32_t)0x00000080) /*!< Event Mask on line 7 */ +#define EXTI_EMR_MR8 ((uint32_t)0x00000100) /*!< Event Mask on line 8 */ +#define EXTI_EMR_MR9 ((uint32_t)0x00000200) /*!< Event Mask on line 9 */ +#define EXTI_EMR_MR10 ((uint32_t)0x00000400) /*!< Event Mask on line 10 */ +#define EXTI_EMR_MR11 ((uint32_t)0x00000800) /*!< Event Mask on line 11 */ +#define EXTI_EMR_MR12 ((uint32_t)0x00001000) /*!< Event Mask on line 12 */ +#define EXTI_EMR_MR13 ((uint32_t)0x00002000) /*!< Event Mask on line 13 */ +#define EXTI_EMR_MR14 ((uint32_t)0x00004000) /*!< Event Mask on line 14 */ +#define EXTI_EMR_MR15 ((uint32_t)0x00008000) /*!< Event Mask on line 15 */ +#define EXTI_EMR_MR16 ((uint32_t)0x00010000) /*!< Event Mask on line 16 */ +#define EXTI_EMR_MR17 ((uint32_t)0x00020000) /*!< Event Mask on line 17 */ +#define EXTI_EMR_MR18 ((uint32_t)0x00040000) /*!< Event Mask on line 18 */ +#define EXTI_EMR_MR19 ((uint32_t)0x00080000) /*!< Event Mask on line 19 */ + +/****************** Bit definition for EXTI_RTSR register *******************/ +#define EXTI_RTSR_TR0 ((uint32_t)0x00000001) /*!< Rising trigger event configuration bit of line 0 */ +#define EXTI_RTSR_TR1 ((uint32_t)0x00000002) /*!< Rising trigger event configuration bit of line 1 */ +#define EXTI_RTSR_TR2 ((uint32_t)0x00000004) /*!< Rising trigger event configuration bit of line 2 */ +#define EXTI_RTSR_TR3 ((uint32_t)0x00000008) /*!< Rising trigger event configuration bit of line 3 */ +#define EXTI_RTSR_TR4 ((uint32_t)0x00000010) /*!< Rising trigger event configuration bit of line 4 */ +#define EXTI_RTSR_TR5 ((uint32_t)0x00000020) /*!< Rising trigger event configuration bit of line 5 */ +#define EXTI_RTSR_TR6 ((uint32_t)0x00000040) /*!< Rising trigger event configuration bit of line 6 */ +#define EXTI_RTSR_TR7 ((uint32_t)0x00000080) /*!< Rising trigger event configuration bit of line 7 */ +#define EXTI_RTSR_TR8 ((uint32_t)0x00000100) /*!< Rising trigger event configuration bit of line 8 */ +#define EXTI_RTSR_TR9 ((uint32_t)0x00000200) /*!< Rising trigger event configuration bit of line 9 */ +#define EXTI_RTSR_TR10 ((uint32_t)0x00000400) /*!< Rising trigger event configuration bit of line 10 */ +#define EXTI_RTSR_TR11 ((uint32_t)0x00000800) /*!< Rising trigger event configuration bit of line 11 */ +#define EXTI_RTSR_TR12 ((uint32_t)0x00001000) /*!< Rising trigger event configuration bit of line 12 */ +#define EXTI_RTSR_TR13 ((uint32_t)0x00002000) /*!< Rising trigger event configuration bit of line 13 */ +#define EXTI_RTSR_TR14 ((uint32_t)0x00004000) /*!< Rising trigger event configuration bit of line 14 */ +#define EXTI_RTSR_TR15 ((uint32_t)0x00008000) /*!< Rising trigger event configuration bit of line 15 */ +#define EXTI_RTSR_TR16 ((uint32_t)0x00010000) /*!< Rising trigger event configuration bit of line 16 */ +#define EXTI_RTSR_TR17 ((uint32_t)0x00020000) /*!< Rising trigger event configuration bit of line 17 */ +#define EXTI_RTSR_TR18 ((uint32_t)0x00040000) /*!< Rising trigger event configuration bit of line 18 */ +#define EXTI_RTSR_TR19 ((uint32_t)0x00080000) /*!< Rising trigger event configuration bit of line 19 */ + +/****************** Bit definition for EXTI_FTSR register *******************/ +#define EXTI_FTSR_TR0 ((uint32_t)0x00000001) /*!< Falling trigger event configuration bit of line 0 */ +#define EXTI_FTSR_TR1 ((uint32_t)0x00000002) /*!< Falling trigger event configuration bit of line 1 */ +#define EXTI_FTSR_TR2 ((uint32_t)0x00000004) /*!< Falling trigger event configuration bit of line 2 */ +#define EXTI_FTSR_TR3 ((uint32_t)0x00000008) /*!< Falling trigger event configuration bit of line 3 */ +#define EXTI_FTSR_TR4 ((uint32_t)0x00000010) /*!< Falling trigger event configuration bit of line 4 */ +#define EXTI_FTSR_TR5 ((uint32_t)0x00000020) /*!< Falling trigger event configuration bit of line 5 */ +#define EXTI_FTSR_TR6 ((uint32_t)0x00000040) /*!< Falling trigger event configuration bit of line 6 */ +#define EXTI_FTSR_TR7 ((uint32_t)0x00000080) /*!< Falling trigger event configuration bit of line 7 */ +#define EXTI_FTSR_TR8 ((uint32_t)0x00000100) /*!< Falling trigger event configuration bit of line 8 */ +#define EXTI_FTSR_TR9 ((uint32_t)0x00000200) /*!< Falling trigger event configuration bit of line 9 */ +#define EXTI_FTSR_TR10 ((uint32_t)0x00000400) /*!< Falling trigger event configuration bit of line 10 */ +#define EXTI_FTSR_TR11 ((uint32_t)0x00000800) /*!< Falling trigger event configuration bit of line 11 */ +#define EXTI_FTSR_TR12 ((uint32_t)0x00001000) /*!< Falling trigger event configuration bit of line 12 */ +#define EXTI_FTSR_TR13 ((uint32_t)0x00002000) /*!< Falling trigger event configuration bit of line 13 */ +#define EXTI_FTSR_TR14 ((uint32_t)0x00004000) /*!< Falling trigger event configuration bit of line 14 */ +#define EXTI_FTSR_TR15 ((uint32_t)0x00008000) /*!< Falling trigger event configuration bit of line 15 */ +#define EXTI_FTSR_TR16 ((uint32_t)0x00010000) /*!< Falling trigger event configuration bit of line 16 */ +#define EXTI_FTSR_TR17 ((uint32_t)0x00020000) /*!< Falling trigger event configuration bit of line 17 */ +#define EXTI_FTSR_TR18 ((uint32_t)0x00040000) /*!< Falling trigger event configuration bit of line 18 */ +#define EXTI_FTSR_TR19 ((uint32_t)0x00080000) /*!< Falling trigger event configuration bit of line 19 */ + +/****************** Bit definition for EXTI_SWIER register ******************/ +#define EXTI_SWIER_SWIER0 ((uint32_t)0x00000001) /*!< Software Interrupt on line 0 */ +#define EXTI_SWIER_SWIER1 ((uint32_t)0x00000002) /*!< Software Interrupt on line 1 */ +#define EXTI_SWIER_SWIER2 ((uint32_t)0x00000004) /*!< Software Interrupt on line 2 */ +#define EXTI_SWIER_SWIER3 ((uint32_t)0x00000008) /*!< Software Interrupt on line 3 */ +#define EXTI_SWIER_SWIER4 ((uint32_t)0x00000010) /*!< Software Interrupt on line 4 */ +#define EXTI_SWIER_SWIER5 ((uint32_t)0x00000020) /*!< Software Interrupt on line 5 */ +#define EXTI_SWIER_SWIER6 ((uint32_t)0x00000040) /*!< Software Interrupt on line 6 */ +#define EXTI_SWIER_SWIER7 ((uint32_t)0x00000080) /*!< Software Interrupt on line 7 */ +#define EXTI_SWIER_SWIER8 ((uint32_t)0x00000100) /*!< Software Interrupt on line 8 */ +#define EXTI_SWIER_SWIER9 ((uint32_t)0x00000200) /*!< Software Interrupt on line 9 */ +#define EXTI_SWIER_SWIER10 ((uint32_t)0x00000400) /*!< Software Interrupt on line 10 */ +#define EXTI_SWIER_SWIER11 ((uint32_t)0x00000800) /*!< Software Interrupt on line 11 */ +#define EXTI_SWIER_SWIER12 ((uint32_t)0x00001000) /*!< Software Interrupt on line 12 */ +#define EXTI_SWIER_SWIER13 ((uint32_t)0x00002000) /*!< Software Interrupt on line 13 */ +#define EXTI_SWIER_SWIER14 ((uint32_t)0x00004000) /*!< Software Interrupt on line 14 */ +#define EXTI_SWIER_SWIER15 ((uint32_t)0x00008000) /*!< Software Interrupt on line 15 */ +#define EXTI_SWIER_SWIER16 ((uint32_t)0x00010000) /*!< Software Interrupt on line 16 */ +#define EXTI_SWIER_SWIER17 ((uint32_t)0x00020000) /*!< Software Interrupt on line 17 */ +#define EXTI_SWIER_SWIER18 ((uint32_t)0x00040000) /*!< Software Interrupt on line 18 */ +#define EXTI_SWIER_SWIER19 ((uint32_t)0x00080000) /*!< Software Interrupt on line 19 */ + +/******************* Bit definition for EXTI_PR register ********************/ +#define EXTI_PR_PR0 ((uint32_t)0x00000001) /*!< Pending bit for line 0 */ +#define EXTI_PR_PR1 ((uint32_t)0x00000002) /*!< Pending bit for line 1 */ +#define EXTI_PR_PR2 ((uint32_t)0x00000004) /*!< Pending bit for line 2 */ +#define EXTI_PR_PR3 ((uint32_t)0x00000008) /*!< Pending bit for line 3 */ +#define EXTI_PR_PR4 ((uint32_t)0x00000010) /*!< Pending bit for line 4 */ +#define EXTI_PR_PR5 ((uint32_t)0x00000020) /*!< Pending bit for line 5 */ +#define EXTI_PR_PR6 ((uint32_t)0x00000040) /*!< Pending bit for line 6 */ +#define EXTI_PR_PR7 ((uint32_t)0x00000080) /*!< Pending bit for line 7 */ +#define EXTI_PR_PR8 ((uint32_t)0x00000100) /*!< Pending bit for line 8 */ +#define EXTI_PR_PR9 ((uint32_t)0x00000200) /*!< Pending bit for line 9 */ +#define EXTI_PR_PR10 ((uint32_t)0x00000400) /*!< Pending bit for line 10 */ +#define EXTI_PR_PR11 ((uint32_t)0x00000800) /*!< Pending bit for line 11 */ +#define EXTI_PR_PR12 ((uint32_t)0x00001000) /*!< Pending bit for line 12 */ +#define EXTI_PR_PR13 ((uint32_t)0x00002000) /*!< Pending bit for line 13 */ +#define EXTI_PR_PR14 ((uint32_t)0x00004000) /*!< Pending bit for line 14 */ +#define EXTI_PR_PR15 ((uint32_t)0x00008000) /*!< Pending bit for line 15 */ +#define EXTI_PR_PR16 ((uint32_t)0x00010000) /*!< Pending bit for line 16 */ +#define EXTI_PR_PR17 ((uint32_t)0x00020000) /*!< Pending bit for line 17 */ +#define EXTI_PR_PR18 ((uint32_t)0x00040000) /*!< Pending bit for line 18 */ +#define EXTI_PR_PR19 ((uint32_t)0x00080000) /*!< Pending bit for line 19 */ + +/******************************************************************************/ +/* */ +/* DMA Controller */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for DMA_ISR register ********************/ +#define DMA_ISR_GIF1 ((uint32_t)0x00000001) /*!< Channel 1 Global interrupt flag */ +#define DMA_ISR_TCIF1 ((uint32_t)0x00000002) /*!< Channel 1 Transfer Complete flag */ +#define DMA_ISR_HTIF1 ((uint32_t)0x00000004) /*!< Channel 1 Half Transfer flag */ +#define DMA_ISR_TEIF1 ((uint32_t)0x00000008) /*!< Channel 1 Transfer Error flag */ +#define DMA_ISR_GIF2 ((uint32_t)0x00000010) /*!< Channel 2 Global interrupt flag */ +#define DMA_ISR_TCIF2 ((uint32_t)0x00000020) /*!< Channel 2 Transfer Complete flag */ +#define DMA_ISR_HTIF2 ((uint32_t)0x00000040) /*!< Channel 2 Half Transfer flag */ +#define DMA_ISR_TEIF2 ((uint32_t)0x00000080) /*!< Channel 2 Transfer Error flag */ +#define DMA_ISR_GIF3 ((uint32_t)0x00000100) /*!< Channel 3 Global interrupt flag */ +#define DMA_ISR_TCIF3 ((uint32_t)0x00000200) /*!< Channel 3 Transfer Complete flag */ +#define DMA_ISR_HTIF3 ((uint32_t)0x00000400) /*!< Channel 3 Half Transfer flag */ +#define DMA_ISR_TEIF3 ((uint32_t)0x00000800) /*!< Channel 3 Transfer Error flag */ +#define DMA_ISR_GIF4 ((uint32_t)0x00001000) /*!< Channel 4 Global interrupt flag */ +#define DMA_ISR_TCIF4 ((uint32_t)0x00002000) /*!< Channel 4 Transfer Complete flag */ +#define DMA_ISR_HTIF4 ((uint32_t)0x00004000) /*!< Channel 4 Half Transfer flag */ +#define DMA_ISR_TEIF4 ((uint32_t)0x00008000) /*!< Channel 4 Transfer Error flag */ +#define DMA_ISR_GIF5 ((uint32_t)0x00010000) /*!< Channel 5 Global interrupt flag */ +#define DMA_ISR_TCIF5 ((uint32_t)0x00020000) /*!< Channel 5 Transfer Complete flag */ +#define DMA_ISR_HTIF5 ((uint32_t)0x00040000) /*!< Channel 5 Half Transfer flag */ +#define DMA_ISR_TEIF5 ((uint32_t)0x00080000) /*!< Channel 5 Transfer Error flag */ +#define DMA_ISR_GIF6 ((uint32_t)0x00100000) /*!< Channel 6 Global interrupt flag */ +#define DMA_ISR_TCIF6 ((uint32_t)0x00200000) /*!< Channel 6 Transfer Complete flag */ +#define DMA_ISR_HTIF6 ((uint32_t)0x00400000) /*!< Channel 6 Half Transfer flag */ +#define DMA_ISR_TEIF6 ((uint32_t)0x00800000) /*!< Channel 6 Transfer Error flag */ +#define DMA_ISR_GIF7 ((uint32_t)0x01000000) /*!< Channel 7 Global interrupt flag */ +#define DMA_ISR_TCIF7 ((uint32_t)0x02000000) /*!< Channel 7 Transfer Complete flag */ +#define DMA_ISR_HTIF7 ((uint32_t)0x04000000) /*!< Channel 7 Half Transfer flag */ +#define DMA_ISR_TEIF7 ((uint32_t)0x08000000) /*!< Channel 7 Transfer Error flag */ + +/******************* Bit definition for DMA_IFCR register *******************/ +#define DMA_IFCR_CGIF1 ((uint32_t)0x00000001) /*!< Channel 1 Global interrupt clear */ +#define DMA_IFCR_CTCIF1 ((uint32_t)0x00000002) /*!< Channel 1 Transfer Complete clear */ +#define DMA_IFCR_CHTIF1 ((uint32_t)0x00000004) /*!< Channel 1 Half Transfer clear */ +#define DMA_IFCR_CTEIF1 ((uint32_t)0x00000008) /*!< Channel 1 Transfer Error clear */ +#define DMA_IFCR_CGIF2 ((uint32_t)0x00000010) /*!< Channel 2 Global interrupt clear */ +#define DMA_IFCR_CTCIF2 ((uint32_t)0x00000020) /*!< Channel 2 Transfer Complete clear */ +#define DMA_IFCR_CHTIF2 ((uint32_t)0x00000040) /*!< Channel 2 Half Transfer clear */ +#define DMA_IFCR_CTEIF2 ((uint32_t)0x00000080) /*!< Channel 2 Transfer Error clear */ +#define DMA_IFCR_CGIF3 ((uint32_t)0x00000100) /*!< Channel 3 Global interrupt clear */ +#define DMA_IFCR_CTCIF3 ((uint32_t)0x00000200) /*!< Channel 3 Transfer Complete clear */ +#define DMA_IFCR_CHTIF3 ((uint32_t)0x00000400) /*!< Channel 3 Half Transfer clear */ +#define DMA_IFCR_CTEIF3 ((uint32_t)0x00000800) /*!< Channel 3 Transfer Error clear */ +#define DMA_IFCR_CGIF4 ((uint32_t)0x00001000) /*!< Channel 4 Global interrupt clear */ +#define DMA_IFCR_CTCIF4 ((uint32_t)0x00002000) /*!< Channel 4 Transfer Complete clear */ +#define DMA_IFCR_CHTIF4 ((uint32_t)0x00004000) /*!< Channel 4 Half Transfer clear */ +#define DMA_IFCR_CTEIF4 ((uint32_t)0x00008000) /*!< Channel 4 Transfer Error clear */ +#define DMA_IFCR_CGIF5 ((uint32_t)0x00010000) /*!< Channel 5 Global interrupt clear */ +#define DMA_IFCR_CTCIF5 ((uint32_t)0x00020000) /*!< Channel 5 Transfer Complete clear */ +#define DMA_IFCR_CHTIF5 ((uint32_t)0x00040000) /*!< Channel 5 Half Transfer clear */ +#define DMA_IFCR_CTEIF5 ((uint32_t)0x00080000) /*!< Channel 5 Transfer Error clear */ +#define DMA_IFCR_CGIF6 ((uint32_t)0x00100000) /*!< Channel 6 Global interrupt clear */ +#define DMA_IFCR_CTCIF6 ((uint32_t)0x00200000) /*!< Channel 6 Transfer Complete clear */ +#define DMA_IFCR_CHTIF6 ((uint32_t)0x00400000) /*!< Channel 6 Half Transfer clear */ +#define DMA_IFCR_CTEIF6 ((uint32_t)0x00800000) /*!< Channel 6 Transfer Error clear */ +#define DMA_IFCR_CGIF7 ((uint32_t)0x01000000) /*!< Channel 7 Global interrupt clear */ +#define DMA_IFCR_CTCIF7 ((uint32_t)0x02000000) /*!< Channel 7 Transfer Complete clear */ +#define DMA_IFCR_CHTIF7 ((uint32_t)0x04000000) /*!< Channel 7 Half Transfer clear */ +#define DMA_IFCR_CTEIF7 ((uint32_t)0x08000000) /*!< Channel 7 Transfer Error clear */ + +/******************* Bit definition for DMA_CCR1 register *******************/ +#define DMA_CCR1_EN ((uint16_t)0x0001) /*!< Channel enable*/ +#define DMA_CCR1_TCIE ((uint16_t)0x0002) /*!< Transfer complete interrupt enable */ +#define DMA_CCR1_HTIE ((uint16_t)0x0004) /*!< Half Transfer interrupt enable */ +#define DMA_CCR1_TEIE ((uint16_t)0x0008) /*!< Transfer error interrupt enable */ +#define DMA_CCR1_DIR ((uint16_t)0x0010) /*!< Data transfer direction */ +#define DMA_CCR1_CIRC ((uint16_t)0x0020) /*!< Circular mode */ +#define DMA_CCR1_PINC ((uint16_t)0x0040) /*!< Peripheral increment mode */ +#define DMA_CCR1_MINC ((uint16_t)0x0080) /*!< Memory increment mode */ + +#define DMA_CCR1_PSIZE ((uint16_t)0x0300) /*!< PSIZE[1:0] bits (Peripheral size) */ +#define DMA_CCR1_PSIZE_0 ((uint16_t)0x0100) /*!< Bit 0 */ +#define DMA_CCR1_PSIZE_1 ((uint16_t)0x0200) /*!< Bit 1 */ + +#define DMA_CCR1_MSIZE ((uint16_t)0x0C00) /*!< MSIZE[1:0] bits (Memory size) */ +#define DMA_CCR1_MSIZE_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define DMA_CCR1_MSIZE_1 ((uint16_t)0x0800) /*!< Bit 1 */ + +#define DMA_CCR1_PL ((uint16_t)0x3000) /*!< PL[1:0] bits(Channel Priority level) */ +#define DMA_CCR1_PL_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define DMA_CCR1_PL_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define DMA_CCR1_MEM2MEM ((uint16_t)0x4000) /*!< Memory to memory mode */ + +/******************* Bit definition for DMA_CCR2 register *******************/ +#define DMA_CCR2_EN ((uint16_t)0x0001) /*!< Channel enable */ +#define DMA_CCR2_TCIE ((uint16_t)0x0002) /*!< Transfer complete interrupt enable */ +#define DMA_CCR2_HTIE ((uint16_t)0x0004) /*!< Half Transfer interrupt enable */ +#define DMA_CCR2_TEIE ((uint16_t)0x0008) /*!< Transfer error interrupt enable */ +#define DMA_CCR2_DIR ((uint16_t)0x0010) /*!< Data transfer direction */ +#define DMA_CCR2_CIRC ((uint16_t)0x0020) /*!< Circular mode */ +#define DMA_CCR2_PINC ((uint16_t)0x0040) /*!< Peripheral increment mode */ +#define DMA_CCR2_MINC ((uint16_t)0x0080) /*!< Memory increment mode */ + +#define DMA_CCR2_PSIZE ((uint16_t)0x0300) /*!< PSIZE[1:0] bits (Peripheral size) */ +#define DMA_CCR2_PSIZE_0 ((uint16_t)0x0100) /*!< Bit 0 */ +#define DMA_CCR2_PSIZE_1 ((uint16_t)0x0200) /*!< Bit 1 */ + +#define DMA_CCR2_MSIZE ((uint16_t)0x0C00) /*!< MSIZE[1:0] bits (Memory size) */ +#define DMA_CCR2_MSIZE_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define DMA_CCR2_MSIZE_1 ((uint16_t)0x0800) /*!< Bit 1 */ + +#define DMA_CCR2_PL ((uint16_t)0x3000) /*!< PL[1:0] bits (Channel Priority level) */ +#define DMA_CCR2_PL_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define DMA_CCR2_PL_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define DMA_CCR2_MEM2MEM ((uint16_t)0x4000) /*!< Memory to memory mode */ + +/******************* Bit definition for DMA_CCR3 register *******************/ +#define DMA_CCR3_EN ((uint16_t)0x0001) /*!< Channel enable */ +#define DMA_CCR3_TCIE ((uint16_t)0x0002) /*!< Transfer complete interrupt enable */ +#define DMA_CCR3_HTIE ((uint16_t)0x0004) /*!< Half Transfer interrupt enable */ +#define DMA_CCR3_TEIE ((uint16_t)0x0008) /*!< Transfer error interrupt enable */ +#define DMA_CCR3_DIR ((uint16_t)0x0010) /*!< Data transfer direction */ +#define DMA_CCR3_CIRC ((uint16_t)0x0020) /*!< Circular mode */ +#define DMA_CCR3_PINC ((uint16_t)0x0040) /*!< Peripheral increment mode */ +#define DMA_CCR3_MINC ((uint16_t)0x0080) /*!< Memory increment mode */ + +#define DMA_CCR3_PSIZE ((uint16_t)0x0300) /*!< PSIZE[1:0] bits (Peripheral size) */ +#define DMA_CCR3_PSIZE_0 ((uint16_t)0x0100) /*!< Bit 0 */ +#define DMA_CCR3_PSIZE_1 ((uint16_t)0x0200) /*!< Bit 1 */ + +#define DMA_CCR3_MSIZE ((uint16_t)0x0C00) /*!< MSIZE[1:0] bits (Memory size) */ +#define DMA_CCR3_MSIZE_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define DMA_CCR3_MSIZE_1 ((uint16_t)0x0800) /*!< Bit 1 */ + +#define DMA_CCR3_PL ((uint16_t)0x3000) /*!< PL[1:0] bits (Channel Priority level) */ +#define DMA_CCR3_PL_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define DMA_CCR3_PL_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define DMA_CCR3_MEM2MEM ((uint16_t)0x4000) /*!< Memory to memory mode */ + +/*!<****************** Bit definition for DMA_CCR4 register *******************/ +#define DMA_CCR4_EN ((uint16_t)0x0001) /*!< Channel enable */ +#define DMA_CCR4_TCIE ((uint16_t)0x0002) /*!< Transfer complete interrupt enable */ +#define DMA_CCR4_HTIE ((uint16_t)0x0004) /*!< Half Transfer interrupt enable */ +#define DMA_CCR4_TEIE ((uint16_t)0x0008) /*!< Transfer error interrupt enable */ +#define DMA_CCR4_DIR ((uint16_t)0x0010) /*!< Data transfer direction */ +#define DMA_CCR4_CIRC ((uint16_t)0x0020) /*!< Circular mode */ +#define DMA_CCR4_PINC ((uint16_t)0x0040) /*!< Peripheral increment mode */ +#define DMA_CCR4_MINC ((uint16_t)0x0080) /*!< Memory increment mode */ + +#define DMA_CCR4_PSIZE ((uint16_t)0x0300) /*!< PSIZE[1:0] bits (Peripheral size) */ +#define DMA_CCR4_PSIZE_0 ((uint16_t)0x0100) /*!< Bit 0 */ +#define DMA_CCR4_PSIZE_1 ((uint16_t)0x0200) /*!< Bit 1 */ + +#define DMA_CCR4_MSIZE ((uint16_t)0x0C00) /*!< MSIZE[1:0] bits (Memory size) */ +#define DMA_CCR4_MSIZE_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define DMA_CCR4_MSIZE_1 ((uint16_t)0x0800) /*!< Bit 1 */ + +#define DMA_CCR4_PL ((uint16_t)0x3000) /*!< PL[1:0] bits (Channel Priority level) */ +#define DMA_CCR4_PL_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define DMA_CCR4_PL_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define DMA_CCR4_MEM2MEM ((uint16_t)0x4000) /*!< Memory to memory mode */ + +/****************** Bit definition for DMA_CCR5 register *******************/ +#define DMA_CCR5_EN ((uint16_t)0x0001) /*!< Channel enable */ +#define DMA_CCR5_TCIE ((uint16_t)0x0002) /*!< Transfer complete interrupt enable */ +#define DMA_CCR5_HTIE ((uint16_t)0x0004) /*!< Half Transfer interrupt enable */ +#define DMA_CCR5_TEIE ((uint16_t)0x0008) /*!< Transfer error interrupt enable */ +#define DMA_CCR5_DIR ((uint16_t)0x0010) /*!< Data transfer direction */ +#define DMA_CCR5_CIRC ((uint16_t)0x0020) /*!< Circular mode */ +#define DMA_CCR5_PINC ((uint16_t)0x0040) /*!< Peripheral increment mode */ +#define DMA_CCR5_MINC ((uint16_t)0x0080) /*!< Memory increment mode */ + +#define DMA_CCR5_PSIZE ((uint16_t)0x0300) /*!< PSIZE[1:0] bits (Peripheral size) */ +#define DMA_CCR5_PSIZE_0 ((uint16_t)0x0100) /*!< Bit 0 */ +#define DMA_CCR5_PSIZE_1 ((uint16_t)0x0200) /*!< Bit 1 */ + +#define DMA_CCR5_MSIZE ((uint16_t)0x0C00) /*!< MSIZE[1:0] bits (Memory size) */ +#define DMA_CCR5_MSIZE_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define DMA_CCR5_MSIZE_1 ((uint16_t)0x0800) /*!< Bit 1 */ + +#define DMA_CCR5_PL ((uint16_t)0x3000) /*!< PL[1:0] bits (Channel Priority level) */ +#define DMA_CCR5_PL_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define DMA_CCR5_PL_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define DMA_CCR5_MEM2MEM ((uint16_t)0x4000) /*!< Memory to memory mode enable */ + +/******************* Bit definition for DMA_CCR6 register *******************/ +#define DMA_CCR6_EN ((uint16_t)0x0001) /*!< Channel enable */ +#define DMA_CCR6_TCIE ((uint16_t)0x0002) /*!< Transfer complete interrupt enable */ +#define DMA_CCR6_HTIE ((uint16_t)0x0004) /*!< Half Transfer interrupt enable */ +#define DMA_CCR6_TEIE ((uint16_t)0x0008) /*!< Transfer error interrupt enable */ +#define DMA_CCR6_DIR ((uint16_t)0x0010) /*!< Data transfer direction */ +#define DMA_CCR6_CIRC ((uint16_t)0x0020) /*!< Circular mode */ +#define DMA_CCR6_PINC ((uint16_t)0x0040) /*!< Peripheral increment mode */ +#define DMA_CCR6_MINC ((uint16_t)0x0080) /*!< Memory increment mode */ + +#define DMA_CCR6_PSIZE ((uint16_t)0x0300) /*!< PSIZE[1:0] bits (Peripheral size) */ +#define DMA_CCR6_PSIZE_0 ((uint16_t)0x0100) /*!< Bit 0 */ +#define DMA_CCR6_PSIZE_1 ((uint16_t)0x0200) /*!< Bit 1 */ + +#define DMA_CCR6_MSIZE ((uint16_t)0x0C00) /*!< MSIZE[1:0] bits (Memory size) */ +#define DMA_CCR6_MSIZE_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define DMA_CCR6_MSIZE_1 ((uint16_t)0x0800) /*!< Bit 1 */ + +#define DMA_CCR6_PL ((uint16_t)0x3000) /*!< PL[1:0] bits (Channel Priority level) */ +#define DMA_CCR6_PL_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define DMA_CCR6_PL_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define DMA_CCR6_MEM2MEM ((uint16_t)0x4000) /*!< Memory to memory mode */ + +/******************* Bit definition for DMA_CCR7 register *******************/ +#define DMA_CCR7_EN ((uint16_t)0x0001) /*!< Channel enable */ +#define DMA_CCR7_TCIE ((uint16_t)0x0002) /*!< Transfer complete interrupt enable */ +#define DMA_CCR7_HTIE ((uint16_t)0x0004) /*!< Half Transfer interrupt enable */ +#define DMA_CCR7_TEIE ((uint16_t)0x0008) /*!< Transfer error interrupt enable */ +#define DMA_CCR7_DIR ((uint16_t)0x0010) /*!< Data transfer direction */ +#define DMA_CCR7_CIRC ((uint16_t)0x0020) /*!< Circular mode */ +#define DMA_CCR7_PINC ((uint16_t)0x0040) /*!< Peripheral increment mode */ +#define DMA_CCR7_MINC ((uint16_t)0x0080) /*!< Memory increment mode */ + +#define DMA_CCR7_PSIZE , ((uint16_t)0x0300) /*!< PSIZE[1:0] bits (Peripheral size) */ +#define DMA_CCR7_PSIZE_0 ((uint16_t)0x0100) /*!< Bit 0 */ +#define DMA_CCR7_PSIZE_1 ((uint16_t)0x0200) /*!< Bit 1 */ + +#define DMA_CCR7_MSIZE ((uint16_t)0x0C00) /*!< MSIZE[1:0] bits (Memory size) */ +#define DMA_CCR7_MSIZE_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define DMA_CCR7_MSIZE_1 ((uint16_t)0x0800) /*!< Bit 1 */ + +#define DMA_CCR7_PL ((uint16_t)0x3000) /*!< PL[1:0] bits (Channel Priority level) */ +#define DMA_CCR7_PL_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define DMA_CCR7_PL_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define DMA_CCR7_MEM2MEM ((uint16_t)0x4000) /*!< Memory to memory mode enable */ + +/****************** Bit definition for DMA_CNDTR1 register ******************/ +#define DMA_CNDTR1_NDT ((uint16_t)0xFFFF) /*!< Number of data to Transfer */ + +/****************** Bit definition for DMA_CNDTR2 register ******************/ +#define DMA_CNDTR2_NDT ((uint16_t)0xFFFF) /*!< Number of data to Transfer */ + +/****************** Bit definition for DMA_CNDTR3 register ******************/ +#define DMA_CNDTR3_NDT ((uint16_t)0xFFFF) /*!< Number of data to Transfer */ + +/****************** Bit definition for DMA_CNDTR4 register ******************/ +#define DMA_CNDTR4_NDT ((uint16_t)0xFFFF) /*!< Number of data to Transfer */ + +/****************** Bit definition for DMA_CNDTR5 register ******************/ +#define DMA_CNDTR5_NDT ((uint16_t)0xFFFF) /*!< Number of data to Transfer */ + +/****************** Bit definition for DMA_CNDTR6 register ******************/ +#define DMA_CNDTR6_NDT ((uint16_t)0xFFFF) /*!< Number of data to Transfer */ + +/****************** Bit definition for DMA_CNDTR7 register ******************/ +#define DMA_CNDTR7_NDT ((uint16_t)0xFFFF) /*!< Number of data to Transfer */ + +/****************** Bit definition for DMA_CPAR1 register *******************/ +#define DMA_CPAR1_PA ((uint32_t)0xFFFFFFFF) /*!< Peripheral Address */ + +/****************** Bit definition for DMA_CPAR2 register *******************/ +#define DMA_CPAR2_PA ((uint32_t)0xFFFFFFFF) /*!< Peripheral Address */ + +/****************** Bit definition for DMA_CPAR3 register *******************/ +#define DMA_CPAR3_PA ((uint32_t)0xFFFFFFFF) /*!< Peripheral Address */ + + +/****************** Bit definition for DMA_CPAR4 register *******************/ +#define DMA_CPAR4_PA ((uint32_t)0xFFFFFFFF) /*!< Peripheral Address */ + +/****************** Bit definition for DMA_CPAR5 register *******************/ +#define DMA_CPAR5_PA ((uint32_t)0xFFFFFFFF) /*!< Peripheral Address */ + +/****************** Bit definition for DMA_CPAR6 register *******************/ +#define DMA_CPAR6_PA ((uint32_t)0xFFFFFFFF) /*!< Peripheral Address */ + + +/****************** Bit definition for DMA_CPAR7 register *******************/ +#define DMA_CPAR7_PA ((uint32_t)0xFFFFFFFF) /*!< Peripheral Address */ + +/****************** Bit definition for DMA_CMAR1 register *******************/ +#define DMA_CMAR1_MA ((uint32_t)0xFFFFFFFF) /*!< Memory Address */ + +/****************** Bit definition for DMA_CMAR2 register *******************/ +#define DMA_CMAR2_MA ((uint32_t)0xFFFFFFFF) /*!< Memory Address */ + +/****************** Bit definition for DMA_CMAR3 register *******************/ +#define DMA_CMAR3_MA ((uint32_t)0xFFFFFFFF) /*!< Memory Address */ + + +/****************** Bit definition for DMA_CMAR4 register *******************/ +#define DMA_CMAR4_MA ((uint32_t)0xFFFFFFFF) /*!< Memory Address */ + +/****************** Bit definition for DMA_CMAR5 register *******************/ +#define DMA_CMAR5_MA ((uint32_t)0xFFFFFFFF) /*!< Memory Address */ + +/****************** Bit definition for DMA_CMAR6 register *******************/ +#define DMA_CMAR6_MA ((uint32_t)0xFFFFFFFF) /*!< Memory Address */ + +/****************** Bit definition for DMA_CMAR7 register *******************/ +#define DMA_CMAR7_MA ((uint32_t)0xFFFFFFFF) /*!< Memory Address */ + +/******************************************************************************/ +/* */ +/* Analog to Digital Converter */ +/* */ +/******************************************************************************/ + +/******************** Bit definition for ADC_SR register ********************/ +#define ADC_SR_AWD ((uint8_t)0x01) /*!< Analog watchdog flag */ +#define ADC_SR_EOC ((uint8_t)0x02) /*!< End of conversion */ +#define ADC_SR_JEOC ((uint8_t)0x04) /*!< Injected channel end of conversion */ +#define ADC_SR_JSTRT ((uint8_t)0x08) /*!< Injected channel Start flag */ +#define ADC_SR_STRT ((uint8_t)0x10) /*!< Regular channel Start flag */ + +/******************* Bit definition for ADC_CR1 register ********************/ +#define ADC_CR1_AWDCH ((uint32_t)0x0000001F) /*!< AWDCH[4:0] bits (Analog watchdog channel select bits) */ +#define ADC_CR1_AWDCH_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define ADC_CR1_AWDCH_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define ADC_CR1_AWDCH_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define ADC_CR1_AWDCH_3 ((uint32_t)0x00000008) /*!< Bit 3 */ +#define ADC_CR1_AWDCH_4 ((uint32_t)0x00000010) /*!< Bit 4 */ + +#define ADC_CR1_EOCIE ((uint32_t)0x00000020) /*!< Interrupt enable for EOC */ +#define ADC_CR1_AWDIE ((uint32_t)0x00000040) /*!< Analog Watchdog interrupt enable */ +#define ADC_CR1_JEOCIE ((uint32_t)0x00000080) /*!< Interrupt enable for injected channels */ +#define ADC_CR1_SCAN ((uint32_t)0x00000100) /*!< Scan mode */ +#define ADC_CR1_AWDSGL ((uint32_t)0x00000200) /*!< Enable the watchdog on a single channel in scan mode */ +#define ADC_CR1_JAUTO ((uint32_t)0x00000400) /*!< Automatic injected group conversion */ +#define ADC_CR1_DISCEN ((uint32_t)0x00000800) /*!< Discontinuous mode on regular channels */ +#define ADC_CR1_JDISCEN ((uint32_t)0x00001000) /*!< Discontinuous mode on injected channels */ + +#define ADC_CR1_DISCNUM ((uint32_t)0x0000E000) /*!< DISCNUM[2:0] bits (Discontinuous mode channel count) */ +#define ADC_CR1_DISCNUM_0 ((uint32_t)0x00002000) /*!< Bit 0 */ +#define ADC_CR1_DISCNUM_1 ((uint32_t)0x00004000) /*!< Bit 1 */ +#define ADC_CR1_DISCNUM_2 ((uint32_t)0x00008000) /*!< Bit 2 */ + +#define ADC_CR1_DUALMOD ((uint32_t)0x000F0000) /*!< DUALMOD[3:0] bits (Dual mode selection) */ +#define ADC_CR1_DUALMOD_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define ADC_CR1_DUALMOD_1 ((uint32_t)0x00020000) /*!< Bit 1 */ +#define ADC_CR1_DUALMOD_2 ((uint32_t)0x00040000) /*!< Bit 2 */ +#define ADC_CR1_DUALMOD_3 ((uint32_t)0x00080000) /*!< Bit 3 */ + +#define ADC_CR1_JAWDEN ((uint32_t)0x00400000) /*!< Analog watchdog enable on injected channels */ +#define ADC_CR1_AWDEN ((uint32_t)0x00800000) /*!< Analog watchdog enable on regular channels */ + + +/******************* Bit definition for ADC_CR2 register ********************/ +#define ADC_CR2_ADON ((uint32_t)0x00000001) /*!< A/D Converter ON / OFF */ +#define ADC_CR2_CONT ((uint32_t)0x00000002) /*!< Continuous Conversion */ +#define ADC_CR2_CAL ((uint32_t)0x00000004) /*!< A/D Calibration */ +#define ADC_CR2_RSTCAL ((uint32_t)0x00000008) /*!< Reset Calibration */ +#define ADC_CR2_DMA ((uint32_t)0x00000100) /*!< Direct Memory access mode */ +#define ADC_CR2_ALIGN ((uint32_t)0x00000800) /*!< Data Alignment */ + +#define ADC_CR2_JEXTSEL ((uint32_t)0x00007000) /*!< JEXTSEL[2:0] bits (External event select for injected group) */ +#define ADC_CR2_JEXTSEL_0 ((uint32_t)0x00001000) /*!< Bit 0 */ +#define ADC_CR2_JEXTSEL_1 ((uint32_t)0x00002000) /*!< Bit 1 */ +#define ADC_CR2_JEXTSEL_2 ((uint32_t)0x00004000) /*!< Bit 2 */ + +#define ADC_CR2_JEXTTRIG ((uint32_t)0x00008000) /*!< External Trigger Conversion mode for injected channels */ + +#define ADC_CR2_EXTSEL ((uint32_t)0x000E0000) /*!< EXTSEL[2:0] bits (External Event Select for regular group) */ +#define ADC_CR2_EXTSEL_0 ((uint32_t)0x00020000) /*!< Bit 0 */ +#define ADC_CR2_EXTSEL_1 ((uint32_t)0x00040000) /*!< Bit 1 */ +#define ADC_CR2_EXTSEL_2 ((uint32_t)0x00080000) /*!< Bit 2 */ + +#define ADC_CR2_EXTTRIG ((uint32_t)0x00100000) /*!< External Trigger Conversion mode for regular channels */ +#define ADC_CR2_JSWSTART ((uint32_t)0x00200000) /*!< Start Conversion of injected channels */ +#define ADC_CR2_SWSTART ((uint32_t)0x00400000) /*!< Start Conversion of regular channels */ +#define ADC_CR2_TSVREFE ((uint32_t)0x00800000) /*!< Temperature Sensor and VREFINT Enable */ + +/****************** Bit definition for ADC_SMPR1 register *******************/ +#define ADC_SMPR1_SMP10 ((uint32_t)0x00000007) /*!< SMP10[2:0] bits (Channel 10 Sample time selection) */ +#define ADC_SMPR1_SMP10_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define ADC_SMPR1_SMP10_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define ADC_SMPR1_SMP10_2 ((uint32_t)0x00000004) /*!< Bit 2 */ + +#define ADC_SMPR1_SMP11 ((uint32_t)0x00000038) /*!< SMP11[2:0] bits (Channel 11 Sample time selection) */ +#define ADC_SMPR1_SMP11_0 ((uint32_t)0x00000008) /*!< Bit 0 */ +#define ADC_SMPR1_SMP11_1 ((uint32_t)0x00000010) /*!< Bit 1 */ +#define ADC_SMPR1_SMP11_2 ((uint32_t)0x00000020) /*!< Bit 2 */ + +#define ADC_SMPR1_SMP12 ((uint32_t)0x000001C0) /*!< SMP12[2:0] bits (Channel 12 Sample time selection) */ +#define ADC_SMPR1_SMP12_0 ((uint32_t)0x00000040) /*!< Bit 0 */ +#define ADC_SMPR1_SMP12_1 ((uint32_t)0x00000080) /*!< Bit 1 */ +#define ADC_SMPR1_SMP12_2 ((uint32_t)0x00000100) /*!< Bit 2 */ + +#define ADC_SMPR1_SMP13 ((uint32_t)0x00000E00) /*!< SMP13[2:0] bits (Channel 13 Sample time selection) */ +#define ADC_SMPR1_SMP13_0 ((uint32_t)0x00000200) /*!< Bit 0 */ +#define ADC_SMPR1_SMP13_1 ((uint32_t)0x00000400) /*!< Bit 1 */ +#define ADC_SMPR1_SMP13_2 ((uint32_t)0x00000800) /*!< Bit 2 */ + +#define ADC_SMPR1_SMP14 ((uint32_t)0x00007000) /*!< SMP14[2:0] bits (Channel 14 Sample time selection) */ +#define ADC_SMPR1_SMP14_0 ((uint32_t)0x00001000) /*!< Bit 0 */ +#define ADC_SMPR1_SMP14_1 ((uint32_t)0x00002000) /*!< Bit 1 */ +#define ADC_SMPR1_SMP14_2 ((uint32_t)0x00004000) /*!< Bit 2 */ + +#define ADC_SMPR1_SMP15 ((uint32_t)0x00038000) /*!< SMP15[2:0] bits (Channel 15 Sample time selection) */ +#define ADC_SMPR1_SMP15_0 ((uint32_t)0x00008000) /*!< Bit 0 */ +#define ADC_SMPR1_SMP15_1 ((uint32_t)0x00010000) /*!< Bit 1 */ +#define ADC_SMPR1_SMP15_2 ((uint32_t)0x00020000) /*!< Bit 2 */ + +#define ADC_SMPR1_SMP16 ((uint32_t)0x001C0000) /*!< SMP16[2:0] bits (Channel 16 Sample time selection) */ +#define ADC_SMPR1_SMP16_0 ((uint32_t)0x00040000) /*!< Bit 0 */ +#define ADC_SMPR1_SMP16_1 ((uint32_t)0x00080000) /*!< Bit 1 */ +#define ADC_SMPR1_SMP16_2 ((uint32_t)0x00100000) /*!< Bit 2 */ + +#define ADC_SMPR1_SMP17 ((uint32_t)0x00E00000) /*!< SMP17[2:0] bits (Channel 17 Sample time selection) */ +#define ADC_SMPR1_SMP17_0 ((uint32_t)0x00200000) /*!< Bit 0 */ +#define ADC_SMPR1_SMP17_1 ((uint32_t)0x00400000) /*!< Bit 1 */ +#define ADC_SMPR1_SMP17_2 ((uint32_t)0x00800000) /*!< Bit 2 */ + +/****************** Bit definition for ADC_SMPR2 register *******************/ +#define ADC_SMPR2_SMP0 ((uint32_t)0x00000007) /*!< SMP0[2:0] bits (Channel 0 Sample time selection) */ +#define ADC_SMPR2_SMP0_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define ADC_SMPR2_SMP0_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define ADC_SMPR2_SMP0_2 ((uint32_t)0x00000004) /*!< Bit 2 */ + +#define ADC_SMPR2_SMP1 ((uint32_t)0x00000038) /*!< SMP1[2:0] bits (Channel 1 Sample time selection) */ +#define ADC_SMPR2_SMP1_0 ((uint32_t)0x00000008) /*!< Bit 0 */ +#define ADC_SMPR2_SMP1_1 ((uint32_t)0x00000010) /*!< Bit 1 */ +#define ADC_SMPR2_SMP1_2 ((uint32_t)0x00000020) /*!< Bit 2 */ + +#define ADC_SMPR2_SMP2 ((uint32_t)0x000001C0) /*!< SMP2[2:0] bits (Channel 2 Sample time selection) */ +#define ADC_SMPR2_SMP2_0 ((uint32_t)0x00000040) /*!< Bit 0 */ +#define ADC_SMPR2_SMP2_1 ((uint32_t)0x00000080) /*!< Bit 1 */ +#define ADC_SMPR2_SMP2_2 ((uint32_t)0x00000100) /*!< Bit 2 */ + +#define ADC_SMPR2_SMP3 ((uint32_t)0x00000E00) /*!< SMP3[2:0] bits (Channel 3 Sample time selection) */ +#define ADC_SMPR2_SMP3_0 ((uint32_t)0x00000200) /*!< Bit 0 */ +#define ADC_SMPR2_SMP3_1 ((uint32_t)0x00000400) /*!< Bit 1 */ +#define ADC_SMPR2_SMP3_2 ((uint32_t)0x00000800) /*!< Bit 2 */ + +#define ADC_SMPR2_SMP4 ((uint32_t)0x00007000) /*!< SMP4[2:0] bits (Channel 4 Sample time selection) */ +#define ADC_SMPR2_SMP4_0 ((uint32_t)0x00001000) /*!< Bit 0 */ +#define ADC_SMPR2_SMP4_1 ((uint32_t)0x00002000) /*!< Bit 1 */ +#define ADC_SMPR2_SMP4_2 ((uint32_t)0x00004000) /*!< Bit 2 */ + +#define ADC_SMPR2_SMP5 ((uint32_t)0x00038000) /*!< SMP5[2:0] bits (Channel 5 Sample time selection) */ +#define ADC_SMPR2_SMP5_0 ((uint32_t)0x00008000) /*!< Bit 0 */ +#define ADC_SMPR2_SMP5_1 ((uint32_t)0x00010000) /*!< Bit 1 */ +#define ADC_SMPR2_SMP5_2 ((uint32_t)0x00020000) /*!< Bit 2 */ + +#define ADC_SMPR2_SMP6 ((uint32_t)0x001C0000) /*!< SMP6[2:0] bits (Channel 6 Sample time selection) */ +#define ADC_SMPR2_SMP6_0 ((uint32_t)0x00040000) /*!< Bit 0 */ +#define ADC_SMPR2_SMP6_1 ((uint32_t)0x00080000) /*!< Bit 1 */ +#define ADC_SMPR2_SMP6_2 ((uint32_t)0x00100000) /*!< Bit 2 */ + +#define ADC_SMPR2_SMP7 ((uint32_t)0x00E00000) /*!< SMP7[2:0] bits (Channel 7 Sample time selection) */ +#define ADC_SMPR2_SMP7_0 ((uint32_t)0x00200000) /*!< Bit 0 */ +#define ADC_SMPR2_SMP7_1 ((uint32_t)0x00400000) /*!< Bit 1 */ +#define ADC_SMPR2_SMP7_2 ((uint32_t)0x00800000) /*!< Bit 2 */ + +#define ADC_SMPR2_SMP8 ((uint32_t)0x07000000) /*!< SMP8[2:0] bits (Channel 8 Sample time selection) */ +#define ADC_SMPR2_SMP8_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define ADC_SMPR2_SMP8_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define ADC_SMPR2_SMP8_2 ((uint32_t)0x04000000) /*!< Bit 2 */ + +#define ADC_SMPR2_SMP9 ((uint32_t)0x38000000) /*!< SMP9[2:0] bits (Channel 9 Sample time selection) */ +#define ADC_SMPR2_SMP9_0 ((uint32_t)0x08000000) /*!< Bit 0 */ +#define ADC_SMPR2_SMP9_1 ((uint32_t)0x10000000) /*!< Bit 1 */ +#define ADC_SMPR2_SMP9_2 ((uint32_t)0x20000000) /*!< Bit 2 */ + +/****************** Bit definition for ADC_JOFR1 register *******************/ +#define ADC_JOFR1_JOFFSET1 ((uint16_t)0x0FFF) /*!< Data offset for injected channel 1 */ + +/****************** Bit definition for ADC_JOFR2 register *******************/ +#define ADC_JOFR2_JOFFSET2 ((uint16_t)0x0FFF) /*!< Data offset for injected channel 2 */ + +/****************** Bit definition for ADC_JOFR3 register *******************/ +#define ADC_JOFR3_JOFFSET3 ((uint16_t)0x0FFF) /*!< Data offset for injected channel 3 */ + +/****************** Bit definition for ADC_JOFR4 register *******************/ +#define ADC_JOFR4_JOFFSET4 ((uint16_t)0x0FFF) /*!< Data offset for injected channel 4 */ + +/******************* Bit definition for ADC_HTR register ********************/ +#define ADC_HTR_HT ((uint16_t)0x0FFF) /*!< Analog watchdog high threshold */ + +/******************* Bit definition for ADC_LTR register ********************/ +#define ADC_LTR_LT ((uint16_t)0x0FFF) /*!< Analog watchdog low threshold */ + +/******************* Bit definition for ADC_SQR1 register *******************/ +#define ADC_SQR1_SQ13 ((uint32_t)0x0000001F) /*!< SQ13[4:0] bits (13th conversion in regular sequence) */ +#define ADC_SQR1_SQ13_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define ADC_SQR1_SQ13_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define ADC_SQR1_SQ13_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define ADC_SQR1_SQ13_3 ((uint32_t)0x00000008) /*!< Bit 3 */ +#define ADC_SQR1_SQ13_4 ((uint32_t)0x00000010) /*!< Bit 4 */ + +#define ADC_SQR1_SQ14 ((uint32_t)0x000003E0) /*!< SQ14[4:0] bits (14th conversion in regular sequence) */ +#define ADC_SQR1_SQ14_0 ((uint32_t)0x00000020) /*!< Bit 0 */ +#define ADC_SQR1_SQ14_1 ((uint32_t)0x00000040) /*!< Bit 1 */ +#define ADC_SQR1_SQ14_2 ((uint32_t)0x00000080) /*!< Bit 2 */ +#define ADC_SQR1_SQ14_3 ((uint32_t)0x00000100) /*!< Bit 3 */ +#define ADC_SQR1_SQ14_4 ((uint32_t)0x00000200) /*!< Bit 4 */ + +#define ADC_SQR1_SQ15 ((uint32_t)0x00007C00) /*!< SQ15[4:0] bits (15th conversion in regular sequence) */ +#define ADC_SQR1_SQ15_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define ADC_SQR1_SQ15_1 ((uint32_t)0x00000800) /*!< Bit 1 */ +#define ADC_SQR1_SQ15_2 ((uint32_t)0x00001000) /*!< Bit 2 */ +#define ADC_SQR1_SQ15_3 ((uint32_t)0x00002000) /*!< Bit 3 */ +#define ADC_SQR1_SQ15_4 ((uint32_t)0x00004000) /*!< Bit 4 */ + +#define ADC_SQR1_SQ16 ((uint32_t)0x000F8000) /*!< SQ16[4:0] bits (16th conversion in regular sequence) */ +#define ADC_SQR1_SQ16_0 ((uint32_t)0x00008000) /*!< Bit 0 */ +#define ADC_SQR1_SQ16_1 ((uint32_t)0x00010000) /*!< Bit 1 */ +#define ADC_SQR1_SQ16_2 ((uint32_t)0x00020000) /*!< Bit 2 */ +#define ADC_SQR1_SQ16_3 ((uint32_t)0x00040000) /*!< Bit 3 */ +#define ADC_SQR1_SQ16_4 ((uint32_t)0x00080000) /*!< Bit 4 */ + +#define ADC_SQR1_L ((uint32_t)0x00F00000) /*!< L[3:0] bits (Regular channel sequence length) */ +#define ADC_SQR1_L_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define ADC_SQR1_L_1 ((uint32_t)0x00200000) /*!< Bit 1 */ +#define ADC_SQR1_L_2 ((uint32_t)0x00400000) /*!< Bit 2 */ +#define ADC_SQR1_L_3 ((uint32_t)0x00800000) /*!< Bit 3 */ + +/******************* Bit definition for ADC_SQR2 register *******************/ +#define ADC_SQR2_SQ7 ((uint32_t)0x0000001F) /*!< SQ7[4:0] bits (7th conversion in regular sequence) */ +#define ADC_SQR2_SQ7_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define ADC_SQR2_SQ7_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define ADC_SQR2_SQ7_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define ADC_SQR2_SQ7_3 ((uint32_t)0x00000008) /*!< Bit 3 */ +#define ADC_SQR2_SQ7_4 ((uint32_t)0x00000010) /*!< Bit 4 */ + +#define ADC_SQR2_SQ8 ((uint32_t)0x000003E0) /*!< SQ8[4:0] bits (8th conversion in regular sequence) */ +#define ADC_SQR2_SQ8_0 ((uint32_t)0x00000020) /*!< Bit 0 */ +#define ADC_SQR2_SQ8_1 ((uint32_t)0x00000040) /*!< Bit 1 */ +#define ADC_SQR2_SQ8_2 ((uint32_t)0x00000080) /*!< Bit 2 */ +#define ADC_SQR2_SQ8_3 ((uint32_t)0x00000100) /*!< Bit 3 */ +#define ADC_SQR2_SQ8_4 ((uint32_t)0x00000200) /*!< Bit 4 */ + +#define ADC_SQR2_SQ9 ((uint32_t)0x00007C00) /*!< SQ9[4:0] bits (9th conversion in regular sequence) */ +#define ADC_SQR2_SQ9_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define ADC_SQR2_SQ9_1 ((uint32_t)0x00000800) /*!< Bit 1 */ +#define ADC_SQR2_SQ9_2 ((uint32_t)0x00001000) /*!< Bit 2 */ +#define ADC_SQR2_SQ9_3 ((uint32_t)0x00002000) /*!< Bit 3 */ +#define ADC_SQR2_SQ9_4 ((uint32_t)0x00004000) /*!< Bit 4 */ + +#define ADC_SQR2_SQ10 ((uint32_t)0x000F8000) /*!< SQ10[4:0] bits (10th conversion in regular sequence) */ +#define ADC_SQR2_SQ10_0 ((uint32_t)0x00008000) /*!< Bit 0 */ +#define ADC_SQR2_SQ10_1 ((uint32_t)0x00010000) /*!< Bit 1 */ +#define ADC_SQR2_SQ10_2 ((uint32_t)0x00020000) /*!< Bit 2 */ +#define ADC_SQR2_SQ10_3 ((uint32_t)0x00040000) /*!< Bit 3 */ +#define ADC_SQR2_SQ10_4 ((uint32_t)0x00080000) /*!< Bit 4 */ + +#define ADC_SQR2_SQ11 ((uint32_t)0x01F00000) /*!< SQ11[4:0] bits (11th conversion in regular sequence) */ +#define ADC_SQR2_SQ11_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define ADC_SQR2_SQ11_1 ((uint32_t)0x00200000) /*!< Bit 1 */ +#define ADC_SQR2_SQ11_2 ((uint32_t)0x00400000) /*!< Bit 2 */ +#define ADC_SQR2_SQ11_3 ((uint32_t)0x00800000) /*!< Bit 3 */ +#define ADC_SQR2_SQ11_4 ((uint32_t)0x01000000) /*!< Bit 4 */ + +#define ADC_SQR2_SQ12 ((uint32_t)0x3E000000) /*!< SQ12[4:0] bits (12th conversion in regular sequence) */ +#define ADC_SQR2_SQ12_0 ((uint32_t)0x02000000) /*!< Bit 0 */ +#define ADC_SQR2_SQ12_1 ((uint32_t)0x04000000) /*!< Bit 1 */ +#define ADC_SQR2_SQ12_2 ((uint32_t)0x08000000) /*!< Bit 2 */ +#define ADC_SQR2_SQ12_3 ((uint32_t)0x10000000) /*!< Bit 3 */ +#define ADC_SQR2_SQ12_4 ((uint32_t)0x20000000) /*!< Bit 4 */ + +/******************* Bit definition for ADC_SQR3 register *******************/ +#define ADC_SQR3_SQ1 ((uint32_t)0x0000001F) /*!< SQ1[4:0] bits (1st conversion in regular sequence) */ +#define ADC_SQR3_SQ1_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define ADC_SQR3_SQ1_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define ADC_SQR3_SQ1_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define ADC_SQR3_SQ1_3 ((uint32_t)0x00000008) /*!< Bit 3 */ +#define ADC_SQR3_SQ1_4 ((uint32_t)0x00000010) /*!< Bit 4 */ + +#define ADC_SQR3_SQ2 ((uint32_t)0x000003E0) /*!< SQ2[4:0] bits (2nd conversion in regular sequence) */ +#define ADC_SQR3_SQ2_0 ((uint32_t)0x00000020) /*!< Bit 0 */ +#define ADC_SQR3_SQ2_1 ((uint32_t)0x00000040) /*!< Bit 1 */ +#define ADC_SQR3_SQ2_2 ((uint32_t)0x00000080) /*!< Bit 2 */ +#define ADC_SQR3_SQ2_3 ((uint32_t)0x00000100) /*!< Bit 3 */ +#define ADC_SQR3_SQ2_4 ((uint32_t)0x00000200) /*!< Bit 4 */ + +#define ADC_SQR3_SQ3 ((uint32_t)0x00007C00) /*!< SQ3[4:0] bits (3rd conversion in regular sequence) */ +#define ADC_SQR3_SQ3_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define ADC_SQR3_SQ3_1 ((uint32_t)0x00000800) /*!< Bit 1 */ +#define ADC_SQR3_SQ3_2 ((uint32_t)0x00001000) /*!< Bit 2 */ +#define ADC_SQR3_SQ3_3 ((uint32_t)0x00002000) /*!< Bit 3 */ +#define ADC_SQR3_SQ3_4 ((uint32_t)0x00004000) /*!< Bit 4 */ + +#define ADC_SQR3_SQ4 ((uint32_t)0x000F8000) /*!< SQ4[4:0] bits (4th conversion in regular sequence) */ +#define ADC_SQR3_SQ4_0 ((uint32_t)0x00008000) /*!< Bit 0 */ +#define ADC_SQR3_SQ4_1 ((uint32_t)0x00010000) /*!< Bit 1 */ +#define ADC_SQR3_SQ4_2 ((uint32_t)0x00020000) /*!< Bit 2 */ +#define ADC_SQR3_SQ4_3 ((uint32_t)0x00040000) /*!< Bit 3 */ +#define ADC_SQR3_SQ4_4 ((uint32_t)0x00080000) /*!< Bit 4 */ + +#define ADC_SQR3_SQ5 ((uint32_t)0x01F00000) /*!< SQ5[4:0] bits (5th conversion in regular sequence) */ +#define ADC_SQR3_SQ5_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define ADC_SQR3_SQ5_1 ((uint32_t)0x00200000) /*!< Bit 1 */ +#define ADC_SQR3_SQ5_2 ((uint32_t)0x00400000) /*!< Bit 2 */ +#define ADC_SQR3_SQ5_3 ((uint32_t)0x00800000) /*!< Bit 3 */ +#define ADC_SQR3_SQ5_4 ((uint32_t)0x01000000) /*!< Bit 4 */ + +#define ADC_SQR3_SQ6 ((uint32_t)0x3E000000) /*!< SQ6[4:0] bits (6th conversion in regular sequence) */ +#define ADC_SQR3_SQ6_0 ((uint32_t)0x02000000) /*!< Bit 0 */ +#define ADC_SQR3_SQ6_1 ((uint32_t)0x04000000) /*!< Bit 1 */ +#define ADC_SQR3_SQ6_2 ((uint32_t)0x08000000) /*!< Bit 2 */ +#define ADC_SQR3_SQ6_3 ((uint32_t)0x10000000) /*!< Bit 3 */ +#define ADC_SQR3_SQ6_4 ((uint32_t)0x20000000) /*!< Bit 4 */ + +/******************* Bit definition for ADC_JSQR register *******************/ +#define ADC_JSQR_JSQ1 ((uint32_t)0x0000001F) /*!< JSQ1[4:0] bits (1st conversion in injected sequence) */ +#define ADC_JSQR_JSQ1_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define ADC_JSQR_JSQ1_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define ADC_JSQR_JSQ1_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define ADC_JSQR_JSQ1_3 ((uint32_t)0x00000008) /*!< Bit 3 */ +#define ADC_JSQR_JSQ1_4 ((uint32_t)0x00000010) /*!< Bit 4 */ + +#define ADC_JSQR_JSQ2 ((uint32_t)0x000003E0) /*!< JSQ2[4:0] bits (2nd conversion in injected sequence) */ +#define ADC_JSQR_JSQ2_0 ((uint32_t)0x00000020) /*!< Bit 0 */ +#define ADC_JSQR_JSQ2_1 ((uint32_t)0x00000040) /*!< Bit 1 */ +#define ADC_JSQR_JSQ2_2 ((uint32_t)0x00000080) /*!< Bit 2 */ +#define ADC_JSQR_JSQ2_3 ((uint32_t)0x00000100) /*!< Bit 3 */ +#define ADC_JSQR_JSQ2_4 ((uint32_t)0x00000200) /*!< Bit 4 */ + +#define ADC_JSQR_JSQ3 ((uint32_t)0x00007C00) /*!< JSQ3[4:0] bits (3rd conversion in injected sequence) */ +#define ADC_JSQR_JSQ3_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define ADC_JSQR_JSQ3_1 ((uint32_t)0x00000800) /*!< Bit 1 */ +#define ADC_JSQR_JSQ3_2 ((uint32_t)0x00001000) /*!< Bit 2 */ +#define ADC_JSQR_JSQ3_3 ((uint32_t)0x00002000) /*!< Bit 3 */ +#define ADC_JSQR_JSQ3_4 ((uint32_t)0x00004000) /*!< Bit 4 */ + +#define ADC_JSQR_JSQ4 ((uint32_t)0x000F8000) /*!< JSQ4[4:0] bits (4th conversion in injected sequence) */ +#define ADC_JSQR_JSQ4_0 ((uint32_t)0x00008000) /*!< Bit 0 */ +#define ADC_JSQR_JSQ4_1 ((uint32_t)0x00010000) /*!< Bit 1 */ +#define ADC_JSQR_JSQ4_2 ((uint32_t)0x00020000) /*!< Bit 2 */ +#define ADC_JSQR_JSQ4_3 ((uint32_t)0x00040000) /*!< Bit 3 */ +#define ADC_JSQR_JSQ4_4 ((uint32_t)0x00080000) /*!< Bit 4 */ + +#define ADC_JSQR_JL ((uint32_t)0x00300000) /*!< JL[1:0] bits (Injected Sequence length) */ +#define ADC_JSQR_JL_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define ADC_JSQR_JL_1 ((uint32_t)0x00200000) /*!< Bit 1 */ + +/******************* Bit definition for ADC_JDR1 register *******************/ +#define ADC_JDR1_JDATA ((uint16_t)0xFFFF) /*!< Injected data */ + +/******************* Bit definition for ADC_JDR2 register *******************/ +#define ADC_JDR2_JDATA ((uint16_t)0xFFFF) /*!< Injected data */ + +/******************* Bit definition for ADC_JDR3 register *******************/ +#define ADC_JDR3_JDATA ((uint16_t)0xFFFF) /*!< Injected data */ + +/******************* Bit definition for ADC_JDR4 register *******************/ +#define ADC_JDR4_JDATA ((uint16_t)0xFFFF) /*!< Injected data */ + +/******************** Bit definition for ADC_DR register ********************/ +#define ADC_DR_DATA ((uint32_t)0x0000FFFF) /*!< Regular data */ +#define ADC_DR_ADC2DATA ((uint32_t)0xFFFF0000) /*!< ADC2 data */ + +/******************************************************************************/ +/* */ +/* Digital to Analog Converter */ +/* */ +/******************************************************************************/ + +/******************** Bit definition for DAC_CR register ********************/ +#define DAC_CR_EN1 ((uint32_t)0x00000001) /*!< DAC channel1 enable */ +#define DAC_CR_BOFF1 ((uint32_t)0x00000002) /*!< DAC channel1 output buffer disable */ +#define DAC_CR_TEN1 ((uint32_t)0x00000004) /*!< DAC channel1 Trigger enable */ + +#define DAC_CR_TSEL1 ((uint32_t)0x00000038) /*!< TSEL1[2:0] (DAC channel1 Trigger selection) */ +#define DAC_CR_TSEL1_0 ((uint32_t)0x00000008) /*!< Bit 0 */ +#define DAC_CR_TSEL1_1 ((uint32_t)0x00000010) /*!< Bit 1 */ +#define DAC_CR_TSEL1_2 ((uint32_t)0x00000020) /*!< Bit 2 */ + +#define DAC_CR_WAVE1 ((uint32_t)0x000000C0) /*!< WAVE1[1:0] (DAC channel1 noise/triangle wave generation enable) */ +#define DAC_CR_WAVE1_0 ((uint32_t)0x00000040) /*!< Bit 0 */ +#define DAC_CR_WAVE1_1 ((uint32_t)0x00000080) /*!< Bit 1 */ + +#define DAC_CR_MAMP1 ((uint32_t)0x00000F00) /*!< MAMP1[3:0] (DAC channel1 Mask/Amplitude selector) */ +#define DAC_CR_MAMP1_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define DAC_CR_MAMP1_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define DAC_CR_MAMP1_2 ((uint32_t)0x00000400) /*!< Bit 2 */ +#define DAC_CR_MAMP1_3 ((uint32_t)0x00000800) /*!< Bit 3 */ + +#define DAC_CR_DMAEN1 ((uint32_t)0x00001000) /*!< DAC channel1 DMA enable */ +#define DAC_CR_EN2 ((uint32_t)0x00010000) /*!< DAC channel2 enable */ +#define DAC_CR_BOFF2 ((uint32_t)0x00020000) /*!< DAC channel2 output buffer disable */ +#define DAC_CR_TEN2 ((uint32_t)0x00040000) /*!< DAC channel2 Trigger enable */ + +#define DAC_CR_TSEL2 ((uint32_t)0x00380000) /*!< TSEL2[2:0] (DAC channel2 Trigger selection) */ +#define DAC_CR_TSEL2_0 ((uint32_t)0x00080000) /*!< Bit 0 */ +#define DAC_CR_TSEL2_1 ((uint32_t)0x00100000) /*!< Bit 1 */ +#define DAC_CR_TSEL2_2 ((uint32_t)0x00200000) /*!< Bit 2 */ + +#define DAC_CR_WAVE2 ((uint32_t)0x00C00000) /*!< WAVE2[1:0] (DAC channel2 noise/triangle wave generation enable) */ +#define DAC_CR_WAVE2_0 ((uint32_t)0x00400000) /*!< Bit 0 */ +#define DAC_CR_WAVE2_1 ((uint32_t)0x00800000) /*!< Bit 1 */ + +#define DAC_CR_MAMP2 ((uint32_t)0x0F000000) /*!< MAMP2[3:0] (DAC channel2 Mask/Amplitude selector) */ +#define DAC_CR_MAMP2_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define DAC_CR_MAMP2_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define DAC_CR_MAMP2_2 ((uint32_t)0x04000000) /*!< Bit 2 */ +#define DAC_CR_MAMP2_3 ((uint32_t)0x08000000) /*!< Bit 3 */ + +#define DAC_CR_DMAEN2 ((uint32_t)0x10000000) /*!< DAC channel2 DMA enabled */ + +/***************** Bit definition for DAC_SWTRIGR register ******************/ +#define DAC_SWTRIGR_SWTRIG1 ((uint8_t)0x01) /*!< DAC channel1 software trigger */ +#define DAC_SWTRIGR_SWTRIG2 ((uint8_t)0x02) /*!< DAC channel2 software trigger */ + +/***************** Bit definition for DAC_DHR12R1 register ******************/ +#define DAC_DHR12R1_DACC1DHR ((uint16_t)0x0FFF) /*!< DAC channel1 12-bit Right aligned data */ + +/***************** Bit definition for DAC_DHR12L1 register ******************/ +#define DAC_DHR12L1_DACC1DHR ((uint16_t)0xFFF0) /*!< DAC channel1 12-bit Left aligned data */ + +/****************** Bit definition for DAC_DHR8R1 register ******************/ +#define DAC_DHR8R1_DACC1DHR ((uint8_t)0xFF) /*!< DAC channel1 8-bit Right aligned data */ + +/***************** Bit definition for DAC_DHR12R2 register ******************/ +#define DAC_DHR12R2_DACC2DHR ((uint16_t)0x0FFF) /*!< DAC channel2 12-bit Right aligned data */ + +/***************** Bit definition for DAC_DHR12L2 register ******************/ +#define DAC_DHR12L2_DACC2DHR ((uint16_t)0xFFF0) /*!< DAC channel2 12-bit Left aligned data */ + +/****************** Bit definition for DAC_DHR8R2 register ******************/ +#define DAC_DHR8R2_DACC2DHR ((uint8_t)0xFF) /*!< DAC channel2 8-bit Right aligned data */ + +/***************** Bit definition for DAC_DHR12RD register ******************/ +#define DAC_DHR12RD_DACC1DHR ((uint32_t)0x00000FFF) /*!< DAC channel1 12-bit Right aligned data */ +#define DAC_DHR12RD_DACC2DHR ((uint32_t)0x0FFF0000) /*!< DAC channel2 12-bit Right aligned data */ + +/***************** Bit definition for DAC_DHR12LD register ******************/ +#define DAC_DHR12LD_DACC1DHR ((uint32_t)0x0000FFF0) /*!< DAC channel1 12-bit Left aligned data */ +#define DAC_DHR12LD_DACC2DHR ((uint32_t)0xFFF00000) /*!< DAC channel2 12-bit Left aligned data */ + +/****************** Bit definition for DAC_DHR8RD register ******************/ +#define DAC_DHR8RD_DACC1DHR ((uint16_t)0x00FF) /*!< DAC channel1 8-bit Right aligned data */ +#define DAC_DHR8RD_DACC2DHR ((uint16_t)0xFF00) /*!< DAC channel2 8-bit Right aligned data */ + +/******************* Bit definition for DAC_DOR1 register *******************/ +#define DAC_DOR1_DACC1DOR ((uint16_t)0x0FFF) /*!< DAC channel1 data output */ + +/******************* Bit definition for DAC_DOR2 register *******************/ +#define DAC_DOR2_DACC2DOR ((uint16_t)0x0FFF) /*!< DAC channel2 data output */ + +/******************** Bit definition for DAC_SR register ********************/ +#define DAC_SR_DMAUDR1 ((uint32_t)0x00002000) /*!< DAC channel1 DMA underrun flag */ +#define DAC_SR_DMAUDR2 ((uint32_t)0x20000000) /*!< DAC channel2 DMA underrun flag */ + +/******************************************************************************/ +/* */ +/* CEC */ +/* */ +/******************************************************************************/ +/******************** Bit definition for CEC_CFGR register ******************/ +#define CEC_CFGR_PE ((uint16_t)0x0001) /*!< Peripheral Enable */ +#define CEC_CFGR_IE ((uint16_t)0x0002) /*!< Interrupt Enable */ +#define CEC_CFGR_BTEM ((uint16_t)0x0004) /*!< Bit Timing Error Mode */ +#define CEC_CFGR_BPEM ((uint16_t)0x0008) /*!< Bit Period Error Mode */ + +/******************** Bit definition for CEC_OAR register ******************/ +#define CEC_OAR_OA ((uint16_t)0x000F) /*!< OA[3:0]: Own Address */ +#define CEC_OAR_OA_0 ((uint16_t)0x0001) /*!< Bit 0 */ +#define CEC_OAR_OA_1 ((uint16_t)0x0002) /*!< Bit 1 */ +#define CEC_OAR_OA_2 ((uint16_t)0x0004) /*!< Bit 2 */ +#define CEC_OAR_OA_3 ((uint16_t)0x0008) /*!< Bit 3 */ + +/******************** Bit definition for CEC_PRES register ******************/ +#define CEC_PRES_PRES ((uint16_t)0x3FFF) /*!< Prescaler Counter Value */ + +/******************** Bit definition for CEC_ESR register ******************/ +#define CEC_ESR_BTE ((uint16_t)0x0001) /*!< Bit Timing Error */ +#define CEC_ESR_BPE ((uint16_t)0x0002) /*!< Bit Period Error */ +#define CEC_ESR_RBTFE ((uint16_t)0x0004) /*!< Rx Block Transfer Finished Error */ +#define CEC_ESR_SBE ((uint16_t)0x0008) /*!< Start Bit Error */ +#define CEC_ESR_ACKE ((uint16_t)0x0010) /*!< Block Acknowledge Error */ +#define CEC_ESR_LINE ((uint16_t)0x0020) /*!< Line Error */ +#define CEC_ESR_TBTFE ((uint16_t)0x0040) /*!< Tx Block Transfer Finished Error */ + +/******************** Bit definition for CEC_CSR register ******************/ +#define CEC_CSR_TSOM ((uint16_t)0x0001) /*!< Tx Start Of Message */ +#define CEC_CSR_TEOM ((uint16_t)0x0002) /*!< Tx End Of Message */ +#define CEC_CSR_TERR ((uint16_t)0x0004) /*!< Tx Error */ +#define CEC_CSR_TBTRF ((uint16_t)0x0008) /*!< Tx Byte Transfer Request or Block Transfer Finished */ +#define CEC_CSR_RSOM ((uint16_t)0x0010) /*!< Rx Start Of Message */ +#define CEC_CSR_REOM ((uint16_t)0x0020) /*!< Rx End Of Message */ +#define CEC_CSR_RERR ((uint16_t)0x0040) /*!< Rx Error */ +#define CEC_CSR_RBTF ((uint16_t)0x0080) /*!< Rx Block Transfer Finished */ + +/******************** Bit definition for CEC_TXD register ******************/ +#define CEC_TXD_TXD ((uint16_t)0x00FF) /*!< Tx Data register */ + +/******************** Bit definition for CEC_RXD register ******************/ +#define CEC_RXD_RXD ((uint16_t)0x00FF) /*!< Rx Data register */ + +/******************************************************************************/ +/* */ +/* TIM */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for TIM_CR1 register ********************/ +#define TIM_CR1_CEN ((uint16_t)0x0001) /*!< Counter enable */ +#define TIM_CR1_UDIS ((uint16_t)0x0002) /*!< Update disable */ +#define TIM_CR1_URS ((uint16_t)0x0004) /*!< Update request source */ +#define TIM_CR1_OPM ((uint16_t)0x0008) /*!< One pulse mode */ +#define TIM_CR1_DIR ((uint16_t)0x0010) /*!< Direction */ + +#define TIM_CR1_CMS ((uint16_t)0x0060) /*!< CMS[1:0] bits (Center-aligned mode selection) */ +#define TIM_CR1_CMS_0 ((uint16_t)0x0020) /*!< Bit 0 */ +#define TIM_CR1_CMS_1 ((uint16_t)0x0040) /*!< Bit 1 */ + +#define TIM_CR1_ARPE ((uint16_t)0x0080) /*!< Auto-reload preload enable */ + +#define TIM_CR1_CKD ((uint16_t)0x0300) /*!< CKD[1:0] bits (clock division) */ +#define TIM_CR1_CKD_0 ((uint16_t)0x0100) /*!< Bit 0 */ +#define TIM_CR1_CKD_1 ((uint16_t)0x0200) /*!< Bit 1 */ + +/******************* Bit definition for TIM_CR2 register ********************/ +#define TIM_CR2_CCPC ((uint16_t)0x0001) /*!< Capture/Compare Preloaded Control */ +#define TIM_CR2_CCUS ((uint16_t)0x0004) /*!< Capture/Compare Control Update Selection */ +#define TIM_CR2_CCDS ((uint16_t)0x0008) /*!< Capture/Compare DMA Selection */ + +#define TIM_CR2_MMS ((uint16_t)0x0070) /*!< MMS[2:0] bits (Master Mode Selection) */ +#define TIM_CR2_MMS_0 ((uint16_t)0x0010) /*!< Bit 0 */ +#define TIM_CR2_MMS_1 ((uint16_t)0x0020) /*!< Bit 1 */ +#define TIM_CR2_MMS_2 ((uint16_t)0x0040) /*!< Bit 2 */ + +#define TIM_CR2_TI1S ((uint16_t)0x0080) /*!< TI1 Selection */ +#define TIM_CR2_OIS1 ((uint16_t)0x0100) /*!< Output Idle state 1 (OC1 output) */ +#define TIM_CR2_OIS1N ((uint16_t)0x0200) /*!< Output Idle state 1 (OC1N output) */ +#define TIM_CR2_OIS2 ((uint16_t)0x0400) /*!< Output Idle state 2 (OC2 output) */ +#define TIM_CR2_OIS2N ((uint16_t)0x0800) /*!< Output Idle state 2 (OC2N output) */ +#define TIM_CR2_OIS3 ((uint16_t)0x1000) /*!< Output Idle state 3 (OC3 output) */ +#define TIM_CR2_OIS3N ((uint16_t)0x2000) /*!< Output Idle state 3 (OC3N output) */ +#define TIM_CR2_OIS4 ((uint16_t)0x4000) /*!< Output Idle state 4 (OC4 output) */ + +/******************* Bit definition for TIM_SMCR register *******************/ +#define TIM_SMCR_SMS ((uint16_t)0x0007) /*!< SMS[2:0] bits (Slave mode selection) */ +#define TIM_SMCR_SMS_0 ((uint16_t)0x0001) /*!< Bit 0 */ +#define TIM_SMCR_SMS_1 ((uint16_t)0x0002) /*!< Bit 1 */ +#define TIM_SMCR_SMS_2 ((uint16_t)0x0004) /*!< Bit 2 */ + +#define TIM_SMCR_TS ((uint16_t)0x0070) /*!< TS[2:0] bits (Trigger selection) */ +#define TIM_SMCR_TS_0 ((uint16_t)0x0010) /*!< Bit 0 */ +#define TIM_SMCR_TS_1 ((uint16_t)0x0020) /*!< Bit 1 */ +#define TIM_SMCR_TS_2 ((uint16_t)0x0040) /*!< Bit 2 */ + +#define TIM_SMCR_MSM ((uint16_t)0x0080) /*!< Master/slave mode */ + +#define TIM_SMCR_ETF ((uint16_t)0x0F00) /*!< ETF[3:0] bits (External trigger filter) */ +#define TIM_SMCR_ETF_0 ((uint16_t)0x0100) /*!< Bit 0 */ +#define TIM_SMCR_ETF_1 ((uint16_t)0x0200) /*!< Bit 1 */ +#define TIM_SMCR_ETF_2 ((uint16_t)0x0400) /*!< Bit 2 */ +#define TIM_SMCR_ETF_3 ((uint16_t)0x0800) /*!< Bit 3 */ + +#define TIM_SMCR_ETPS ((uint16_t)0x3000) /*!< ETPS[1:0] bits (External trigger prescaler) */ +#define TIM_SMCR_ETPS_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define TIM_SMCR_ETPS_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define TIM_SMCR_ECE ((uint16_t)0x4000) /*!< External clock enable */ +#define TIM_SMCR_ETP ((uint16_t)0x8000) /*!< External trigger polarity */ + +/******************* Bit definition for TIM_DIER register *******************/ +#define TIM_DIER_UIE ((uint16_t)0x0001) /*!< Update interrupt enable */ +#define TIM_DIER_CC1IE ((uint16_t)0x0002) /*!< Capture/Compare 1 interrupt enable */ +#define TIM_DIER_CC2IE ((uint16_t)0x0004) /*!< Capture/Compare 2 interrupt enable */ +#define TIM_DIER_CC3IE ((uint16_t)0x0008) /*!< Capture/Compare 3 interrupt enable */ +#define TIM_DIER_CC4IE ((uint16_t)0x0010) /*!< Capture/Compare 4 interrupt enable */ +#define TIM_DIER_COMIE ((uint16_t)0x0020) /*!< COM interrupt enable */ +#define TIM_DIER_TIE ((uint16_t)0x0040) /*!< Trigger interrupt enable */ +#define TIM_DIER_BIE ((uint16_t)0x0080) /*!< Break interrupt enable */ +#define TIM_DIER_UDE ((uint16_t)0x0100) /*!< Update DMA request enable */ +#define TIM_DIER_CC1DE ((uint16_t)0x0200) /*!< Capture/Compare 1 DMA request enable */ +#define TIM_DIER_CC2DE ((uint16_t)0x0400) /*!< Capture/Compare 2 DMA request enable */ +#define TIM_DIER_CC3DE ((uint16_t)0x0800) /*!< Capture/Compare 3 DMA request enable */ +#define TIM_DIER_CC4DE ((uint16_t)0x1000) /*!< Capture/Compare 4 DMA request enable */ +#define TIM_DIER_COMDE ((uint16_t)0x2000) /*!< COM DMA request enable */ +#define TIM_DIER_TDE ((uint16_t)0x4000) /*!< Trigger DMA request enable */ + +/******************** Bit definition for TIM_SR register ********************/ +#define TIM_SR_UIF ((uint16_t)0x0001) /*!< Update interrupt Flag */ +#define TIM_SR_CC1IF ((uint16_t)0x0002) /*!< Capture/Compare 1 interrupt Flag */ +#define TIM_SR_CC2IF ((uint16_t)0x0004) /*!< Capture/Compare 2 interrupt Flag */ +#define TIM_SR_CC3IF ((uint16_t)0x0008) /*!< Capture/Compare 3 interrupt Flag */ +#define TIM_SR_CC4IF ((uint16_t)0x0010) /*!< Capture/Compare 4 interrupt Flag */ +#define TIM_SR_COMIF ((uint16_t)0x0020) /*!< COM interrupt Flag */ +#define TIM_SR_TIF ((uint16_t)0x0040) /*!< Trigger interrupt Flag */ +#define TIM_SR_BIF ((uint16_t)0x0080) /*!< Break interrupt Flag */ +#define TIM_SR_CC1OF ((uint16_t)0x0200) /*!< Capture/Compare 1 Overcapture Flag */ +#define TIM_SR_CC2OF ((uint16_t)0x0400) /*!< Capture/Compare 2 Overcapture Flag */ +#define TIM_SR_CC3OF ((uint16_t)0x0800) /*!< Capture/Compare 3 Overcapture Flag */ +#define TIM_SR_CC4OF ((uint16_t)0x1000) /*!< Capture/Compare 4 Overcapture Flag */ + +/******************* Bit definition for TIM_EGR register ********************/ +#define TIM_EGR_UG ((uint8_t)0x01) /*!< Update Generation */ +#define TIM_EGR_CC1G ((uint8_t)0x02) /*!< Capture/Compare 1 Generation */ +#define TIM_EGR_CC2G ((uint8_t)0x04) /*!< Capture/Compare 2 Generation */ +#define TIM_EGR_CC3G ((uint8_t)0x08) /*!< Capture/Compare 3 Generation */ +#define TIM_EGR_CC4G ((uint8_t)0x10) /*!< Capture/Compare 4 Generation */ +#define TIM_EGR_COMG ((uint8_t)0x20) /*!< Capture/Compare Control Update Generation */ +#define TIM_EGR_TG ((uint8_t)0x40) /*!< Trigger Generation */ +#define TIM_EGR_BG ((uint8_t)0x80) /*!< Break Generation */ + +/****************** Bit definition for TIM_CCMR1 register *******************/ +#define TIM_CCMR1_CC1S ((uint16_t)0x0003) /*!< CC1S[1:0] bits (Capture/Compare 1 Selection) */ +#define TIM_CCMR1_CC1S_0 ((uint16_t)0x0001) /*!< Bit 0 */ +#define TIM_CCMR1_CC1S_1 ((uint16_t)0x0002) /*!< Bit 1 */ + +#define TIM_CCMR1_OC1FE ((uint16_t)0x0004) /*!< Output Compare 1 Fast enable */ +#define TIM_CCMR1_OC1PE ((uint16_t)0x0008) /*!< Output Compare 1 Preload enable */ + +#define TIM_CCMR1_OC1M ((uint16_t)0x0070) /*!< OC1M[2:0] bits (Output Compare 1 Mode) */ +#define TIM_CCMR1_OC1M_0 ((uint16_t)0x0010) /*!< Bit 0 */ +#define TIM_CCMR1_OC1M_1 ((uint16_t)0x0020) /*!< Bit 1 */ +#define TIM_CCMR1_OC1M_2 ((uint16_t)0x0040) /*!< Bit 2 */ + +#define TIM_CCMR1_OC1CE ((uint16_t)0x0080) /*!< Output Compare 1Clear Enable */ + +#define TIM_CCMR1_CC2S ((uint16_t)0x0300) /*!< CC2S[1:0] bits (Capture/Compare 2 Selection) */ +#define TIM_CCMR1_CC2S_0 ((uint16_t)0x0100) /*!< Bit 0 */ +#define TIM_CCMR1_CC2S_1 ((uint16_t)0x0200) /*!< Bit 1 */ + +#define TIM_CCMR1_OC2FE ((uint16_t)0x0400) /*!< Output Compare 2 Fast enable */ +#define TIM_CCMR1_OC2PE ((uint16_t)0x0800) /*!< Output Compare 2 Preload enable */ + +#define TIM_CCMR1_OC2M ((uint16_t)0x7000) /*!< OC2M[2:0] bits (Output Compare 2 Mode) */ +#define TIM_CCMR1_OC2M_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define TIM_CCMR1_OC2M_1 ((uint16_t)0x2000) /*!< Bit 1 */ +#define TIM_CCMR1_OC2M_2 ((uint16_t)0x4000) /*!< Bit 2 */ + +#define TIM_CCMR1_OC2CE ((uint16_t)0x8000) /*!< Output Compare 2 Clear Enable */ + +/*----------------------------------------------------------------------------*/ + +#define TIM_CCMR1_IC1PSC ((uint16_t)0x000C) /*!< IC1PSC[1:0] bits (Input Capture 1 Prescaler) */ +#define TIM_CCMR1_IC1PSC_0 ((uint16_t)0x0004) /*!< Bit 0 */ +#define TIM_CCMR1_IC1PSC_1 ((uint16_t)0x0008) /*!< Bit 1 */ + +#define TIM_CCMR1_IC1F ((uint16_t)0x00F0) /*!< IC1F[3:0] bits (Input Capture 1 Filter) */ +#define TIM_CCMR1_IC1F_0 ((uint16_t)0x0010) /*!< Bit 0 */ +#define TIM_CCMR1_IC1F_1 ((uint16_t)0x0020) /*!< Bit 1 */ +#define TIM_CCMR1_IC1F_2 ((uint16_t)0x0040) /*!< Bit 2 */ +#define TIM_CCMR1_IC1F_3 ((uint16_t)0x0080) /*!< Bit 3 */ + +#define TIM_CCMR1_IC2PSC ((uint16_t)0x0C00) /*!< IC2PSC[1:0] bits (Input Capture 2 Prescaler) */ +#define TIM_CCMR1_IC2PSC_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define TIM_CCMR1_IC2PSC_1 ((uint16_t)0x0800) /*!< Bit 1 */ + +#define TIM_CCMR1_IC2F ((uint16_t)0xF000) /*!< IC2F[3:0] bits (Input Capture 2 Filter) */ +#define TIM_CCMR1_IC2F_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define TIM_CCMR1_IC2F_1 ((uint16_t)0x2000) /*!< Bit 1 */ +#define TIM_CCMR1_IC2F_2 ((uint16_t)0x4000) /*!< Bit 2 */ +#define TIM_CCMR1_IC2F_3 ((uint16_t)0x8000) /*!< Bit 3 */ + +/****************** Bit definition for TIM_CCMR2 register *******************/ +#define TIM_CCMR2_CC3S ((uint16_t)0x0003) /*!< CC3S[1:0] bits (Capture/Compare 3 Selection) */ +#define TIM_CCMR2_CC3S_0 ((uint16_t)0x0001) /*!< Bit 0 */ +#define TIM_CCMR2_CC3S_1 ((uint16_t)0x0002) /*!< Bit 1 */ + +#define TIM_CCMR2_OC3FE ((uint16_t)0x0004) /*!< Output Compare 3 Fast enable */ +#define TIM_CCMR2_OC3PE ((uint16_t)0x0008) /*!< Output Compare 3 Preload enable */ + +#define TIM_CCMR2_OC3M ((uint16_t)0x0070) /*!< OC3M[2:0] bits (Output Compare 3 Mode) */ +#define TIM_CCMR2_OC3M_0 ((uint16_t)0x0010) /*!< Bit 0 */ +#define TIM_CCMR2_OC3M_1 ((uint16_t)0x0020) /*!< Bit 1 */ +#define TIM_CCMR2_OC3M_2 ((uint16_t)0x0040) /*!< Bit 2 */ + +#define TIM_CCMR2_OC3CE ((uint16_t)0x0080) /*!< Output Compare 3 Clear Enable */ + +#define TIM_CCMR2_CC4S ((uint16_t)0x0300) /*!< CC4S[1:0] bits (Capture/Compare 4 Selection) */ +#define TIM_CCMR2_CC4S_0 ((uint16_t)0x0100) /*!< Bit 0 */ +#define TIM_CCMR2_CC4S_1 ((uint16_t)0x0200) /*!< Bit 1 */ + +#define TIM_CCMR2_OC4FE ((uint16_t)0x0400) /*!< Output Compare 4 Fast enable */ +#define TIM_CCMR2_OC4PE ((uint16_t)0x0800) /*!< Output Compare 4 Preload enable */ + +#define TIM_CCMR2_OC4M ((uint16_t)0x7000) /*!< OC4M[2:0] bits (Output Compare 4 Mode) */ +#define TIM_CCMR2_OC4M_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define TIM_CCMR2_OC4M_1 ((uint16_t)0x2000) /*!< Bit 1 */ +#define TIM_CCMR2_OC4M_2 ((uint16_t)0x4000) /*!< Bit 2 */ + +#define TIM_CCMR2_OC4CE ((uint16_t)0x8000) /*!< Output Compare 4 Clear Enable */ + +/*----------------------------------------------------------------------------*/ + +#define TIM_CCMR2_IC3PSC ((uint16_t)0x000C) /*!< IC3PSC[1:0] bits (Input Capture 3 Prescaler) */ +#define TIM_CCMR2_IC3PSC_0 ((uint16_t)0x0004) /*!< Bit 0 */ +#define TIM_CCMR2_IC3PSC_1 ((uint16_t)0x0008) /*!< Bit 1 */ + +#define TIM_CCMR2_IC3F ((uint16_t)0x00F0) /*!< IC3F[3:0] bits (Input Capture 3 Filter) */ +#define TIM_CCMR2_IC3F_0 ((uint16_t)0x0010) /*!< Bit 0 */ +#define TIM_CCMR2_IC3F_1 ((uint16_t)0x0020) /*!< Bit 1 */ +#define TIM_CCMR2_IC3F_2 ((uint16_t)0x0040) /*!< Bit 2 */ +#define TIM_CCMR2_IC3F_3 ((uint16_t)0x0080) /*!< Bit 3 */ + +#define TIM_CCMR2_IC4PSC ((uint16_t)0x0C00) /*!< IC4PSC[1:0] bits (Input Capture 4 Prescaler) */ +#define TIM_CCMR2_IC4PSC_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define TIM_CCMR2_IC4PSC_1 ((uint16_t)0x0800) /*!< Bit 1 */ + +#define TIM_CCMR2_IC4F ((uint16_t)0xF000) /*!< IC4F[3:0] bits (Input Capture 4 Filter) */ +#define TIM_CCMR2_IC4F_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define TIM_CCMR2_IC4F_1 ((uint16_t)0x2000) /*!< Bit 1 */ +#define TIM_CCMR2_IC4F_2 ((uint16_t)0x4000) /*!< Bit 2 */ +#define TIM_CCMR2_IC4F_3 ((uint16_t)0x8000) /*!< Bit 3 */ + +/******************* Bit definition for TIM_CCER register *******************/ +#define TIM_CCER_CC1E ((uint16_t)0x0001) /*!< Capture/Compare 1 output enable */ +#define TIM_CCER_CC1P ((uint16_t)0x0002) /*!< Capture/Compare 1 output Polarity */ +#define TIM_CCER_CC1NE ((uint16_t)0x0004) /*!< Capture/Compare 1 Complementary output enable */ +#define TIM_CCER_CC1NP ((uint16_t)0x0008) /*!< Capture/Compare 1 Complementary output Polarity */ +#define TIM_CCER_CC2E ((uint16_t)0x0010) /*!< Capture/Compare 2 output enable */ +#define TIM_CCER_CC2P ((uint16_t)0x0020) /*!< Capture/Compare 2 output Polarity */ +#define TIM_CCER_CC2NE ((uint16_t)0x0040) /*!< Capture/Compare 2 Complementary output enable */ +#define TIM_CCER_CC2NP ((uint16_t)0x0080) /*!< Capture/Compare 2 Complementary output Polarity */ +#define TIM_CCER_CC3E ((uint16_t)0x0100) /*!< Capture/Compare 3 output enable */ +#define TIM_CCER_CC3P ((uint16_t)0x0200) /*!< Capture/Compare 3 output Polarity */ +#define TIM_CCER_CC3NE ((uint16_t)0x0400) /*!< Capture/Compare 3 Complementary output enable */ +#define TIM_CCER_CC3NP ((uint16_t)0x0800) /*!< Capture/Compare 3 Complementary output Polarity */ +#define TIM_CCER_CC4E ((uint16_t)0x1000) /*!< Capture/Compare 4 output enable */ +#define TIM_CCER_CC4P ((uint16_t)0x2000) /*!< Capture/Compare 4 output Polarity */ +#define TIM_CCER_CC4NP ((uint16_t)0x8000) /*!< Capture/Compare 4 Complementary output Polarity */ + +/******************* Bit definition for TIM_CNT register ********************/ +#define TIM_CNT_CNT ((uint16_t)0xFFFF) /*!< Counter Value */ + +/******************* Bit definition for TIM_PSC register ********************/ +#define TIM_PSC_PSC ((uint16_t)0xFFFF) /*!< Prescaler Value */ + +/******************* Bit definition for TIM_ARR register ********************/ +#define TIM_ARR_ARR ((uint16_t)0xFFFF) /*!< actual auto-reload Value */ + +/******************* Bit definition for TIM_RCR register ********************/ +#define TIM_RCR_REP ((uint8_t)0xFF) /*!< Repetition Counter Value */ + +/******************* Bit definition for TIM_CCR1 register *******************/ +#define TIM_CCR1_CCR1 ((uint16_t)0xFFFF) /*!< Capture/Compare 1 Value */ + +/******************* Bit definition for TIM_CCR2 register *******************/ +#define TIM_CCR2_CCR2 ((uint16_t)0xFFFF) /*!< Capture/Compare 2 Value */ + +/******************* Bit definition for TIM_CCR3 register *******************/ +#define TIM_CCR3_CCR3 ((uint16_t)0xFFFF) /*!< Capture/Compare 3 Value */ + +/******************* Bit definition for TIM_CCR4 register *******************/ +#define TIM_CCR4_CCR4 ((uint16_t)0xFFFF) /*!< Capture/Compare 4 Value */ + +/******************* Bit definition for TIM_BDTR register *******************/ +#define TIM_BDTR_DTG ((uint16_t)0x00FF) /*!< DTG[0:7] bits (Dead-Time Generator set-up) */ +#define TIM_BDTR_DTG_0 ((uint16_t)0x0001) /*!< Bit 0 */ +#define TIM_BDTR_DTG_1 ((uint16_t)0x0002) /*!< Bit 1 */ +#define TIM_BDTR_DTG_2 ((uint16_t)0x0004) /*!< Bit 2 */ +#define TIM_BDTR_DTG_3 ((uint16_t)0x0008) /*!< Bit 3 */ +#define TIM_BDTR_DTG_4 ((uint16_t)0x0010) /*!< Bit 4 */ +#define TIM_BDTR_DTG_5 ((uint16_t)0x0020) /*!< Bit 5 */ +#define TIM_BDTR_DTG_6 ((uint16_t)0x0040) /*!< Bit 6 */ +#define TIM_BDTR_DTG_7 ((uint16_t)0x0080) /*!< Bit 7 */ + +#define TIM_BDTR_LOCK ((uint16_t)0x0300) /*!< LOCK[1:0] bits (Lock Configuration) */ +#define TIM_BDTR_LOCK_0 ((uint16_t)0x0100) /*!< Bit 0 */ +#define TIM_BDTR_LOCK_1 ((uint16_t)0x0200) /*!< Bit 1 */ + +#define TIM_BDTR_OSSI ((uint16_t)0x0400) /*!< Off-State Selection for Idle mode */ +#define TIM_BDTR_OSSR ((uint16_t)0x0800) /*!< Off-State Selection for Run mode */ +#define TIM_BDTR_BKE ((uint16_t)0x1000) /*!< Break enable */ +#define TIM_BDTR_BKP ((uint16_t)0x2000) /*!< Break Polarity */ +#define TIM_BDTR_AOE ((uint16_t)0x4000) /*!< Automatic Output enable */ +#define TIM_BDTR_MOE ((uint16_t)0x8000) /*!< Main Output enable */ + +/******************* Bit definition for TIM_DCR register ********************/ +#define TIM_DCR_DBA ((uint16_t)0x001F) /*!< DBA[4:0] bits (DMA Base Address) */ +#define TIM_DCR_DBA_0 ((uint16_t)0x0001) /*!< Bit 0 */ +#define TIM_DCR_DBA_1 ((uint16_t)0x0002) /*!< Bit 1 */ +#define TIM_DCR_DBA_2 ((uint16_t)0x0004) /*!< Bit 2 */ +#define TIM_DCR_DBA_3 ((uint16_t)0x0008) /*!< Bit 3 */ +#define TIM_DCR_DBA_4 ((uint16_t)0x0010) /*!< Bit 4 */ + +#define TIM_DCR_DBL ((uint16_t)0x1F00) /*!< DBL[4:0] bits (DMA Burst Length) */ +#define TIM_DCR_DBL_0 ((uint16_t)0x0100) /*!< Bit 0 */ +#define TIM_DCR_DBL_1 ((uint16_t)0x0200) /*!< Bit 1 */ +#define TIM_DCR_DBL_2 ((uint16_t)0x0400) /*!< Bit 2 */ +#define TIM_DCR_DBL_3 ((uint16_t)0x0800) /*!< Bit 3 */ +#define TIM_DCR_DBL_4 ((uint16_t)0x1000) /*!< Bit 4 */ + +/******************* Bit definition for TIM_DMAR register *******************/ +#define TIM_DMAR_DMAB ((uint16_t)0xFFFF) /*!< DMA register for burst accesses */ + +/******************************************************************************/ +/* */ +/* Real-Time Clock */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for RTC_CRH register ********************/ +#define RTC_CRH_SECIE ((uint8_t)0x01) /*!< Second Interrupt Enable */ +#define RTC_CRH_ALRIE ((uint8_t)0x02) /*!< Alarm Interrupt Enable */ +#define RTC_CRH_OWIE ((uint8_t)0x04) /*!< OverfloW Interrupt Enable */ + +/******************* Bit definition for RTC_CRL register ********************/ +#define RTC_CRL_SECF ((uint8_t)0x01) /*!< Second Flag */ +#define RTC_CRL_ALRF ((uint8_t)0x02) /*!< Alarm Flag */ +#define RTC_CRL_OWF ((uint8_t)0x04) /*!< OverfloW Flag */ +#define RTC_CRL_RSF ((uint8_t)0x08) /*!< Registers Synchronized Flag */ +#define RTC_CRL_CNF ((uint8_t)0x10) /*!< Configuration Flag */ +#define RTC_CRL_RTOFF ((uint8_t)0x20) /*!< RTC operation OFF */ + +/******************* Bit definition for RTC_PRLH register *******************/ +#define RTC_PRLH_PRL ((uint16_t)0x000F) /*!< RTC Prescaler Reload Value High */ + +/******************* Bit definition for RTC_PRLL register *******************/ +#define RTC_PRLL_PRL ((uint16_t)0xFFFF) /*!< RTC Prescaler Reload Value Low */ + +/******************* Bit definition for RTC_DIVH register *******************/ +#define RTC_DIVH_RTC_DIV ((uint16_t)0x000F) /*!< RTC Clock Divider High */ + +/******************* Bit definition for RTC_DIVL register *******************/ +#define RTC_DIVL_RTC_DIV ((uint16_t)0xFFFF) /*!< RTC Clock Divider Low */ + +/******************* Bit definition for RTC_CNTH register *******************/ +#define RTC_CNTH_RTC_CNT ((uint16_t)0xFFFF) /*!< RTC Counter High */ + +/******************* Bit definition for RTC_CNTL register *******************/ +#define RTC_CNTL_RTC_CNT ((uint16_t)0xFFFF) /*!< RTC Counter Low */ + +/******************* Bit definition for RTC_ALRH register *******************/ +#define RTC_ALRH_RTC_ALR ((uint16_t)0xFFFF) /*!< RTC Alarm High */ + +/******************* Bit definition for RTC_ALRL register *******************/ +#define RTC_ALRL_RTC_ALR ((uint16_t)0xFFFF) /*!< RTC Alarm Low */ + +/******************************************************************************/ +/* */ +/* Independent WATCHDOG */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for IWDG_KR register ********************/ +#define IWDG_KR_KEY ((uint16_t)0xFFFF) /*!< Key value (write only, read 0000h) */ + +/******************* Bit definition for IWDG_PR register ********************/ +#define IWDG_PR_PR ((uint8_t)0x07) /*!< PR[2:0] (Prescaler divider) */ +#define IWDG_PR_PR_0 ((uint8_t)0x01) /*!< Bit 0 */ +#define IWDG_PR_PR_1 ((uint8_t)0x02) /*!< Bit 1 */ +#define IWDG_PR_PR_2 ((uint8_t)0x04) /*!< Bit 2 */ + +/******************* Bit definition for IWDG_RLR register *******************/ +#define IWDG_RLR_RL ((uint16_t)0x0FFF) /*!< Watchdog counter reload value */ + +/******************* Bit definition for IWDG_SR register ********************/ +#define IWDG_SR_PVU ((uint8_t)0x01) /*!< Watchdog prescaler value update */ +#define IWDG_SR_RVU ((uint8_t)0x02) /*!< Watchdog counter reload value update */ + +/******************************************************************************/ +/* */ +/* Window WATCHDOG */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for WWDG_CR register ********************/ +#define WWDG_CR_T ((uint8_t)0x7F) /*!< T[6:0] bits (7-Bit counter (MSB to LSB)) */ +#define WWDG_CR_T0 ((uint8_t)0x01) /*!< Bit 0 */ +#define WWDG_CR_T1 ((uint8_t)0x02) /*!< Bit 1 */ +#define WWDG_CR_T2 ((uint8_t)0x04) /*!< Bit 2 */ +#define WWDG_CR_T3 ((uint8_t)0x08) /*!< Bit 3 */ +#define WWDG_CR_T4 ((uint8_t)0x10) /*!< Bit 4 */ +#define WWDG_CR_T5 ((uint8_t)0x20) /*!< Bit 5 */ +#define WWDG_CR_T6 ((uint8_t)0x40) /*!< Bit 6 */ + +#define WWDG_CR_WDGA ((uint8_t)0x80) /*!< Activation bit */ + +/******************* Bit definition for WWDG_CFR register *******************/ +#define WWDG_CFR_W ((uint16_t)0x007F) /*!< W[6:0] bits (7-bit window value) */ +#define WWDG_CFR_W0 ((uint16_t)0x0001) /*!< Bit 0 */ +#define WWDG_CFR_W1 ((uint16_t)0x0002) /*!< Bit 1 */ +#define WWDG_CFR_W2 ((uint16_t)0x0004) /*!< Bit 2 */ +#define WWDG_CFR_W3 ((uint16_t)0x0008) /*!< Bit 3 */ +#define WWDG_CFR_W4 ((uint16_t)0x0010) /*!< Bit 4 */ +#define WWDG_CFR_W5 ((uint16_t)0x0020) /*!< Bit 5 */ +#define WWDG_CFR_W6 ((uint16_t)0x0040) /*!< Bit 6 */ + +#define WWDG_CFR_WDGTB ((uint16_t)0x0180) /*!< WDGTB[1:0] bits (Timer Base) */ +#define WWDG_CFR_WDGTB0 ((uint16_t)0x0080) /*!< Bit 0 */ +#define WWDG_CFR_WDGTB1 ((uint16_t)0x0100) /*!< Bit 1 */ + +#define WWDG_CFR_EWI ((uint16_t)0x0200) /*!< Early Wakeup Interrupt */ + +/******************* Bit definition for WWDG_SR register ********************/ +#define WWDG_SR_EWIF ((uint8_t)0x01) /*!< Early Wakeup Interrupt Flag */ + +/******************************************************************************/ +/* */ +/* Flexible Static Memory Controller */ +/* */ +/******************************************************************************/ + +/****************** Bit definition for FSMC_BCR1 register *******************/ +#define FSMC_BCR1_MBKEN ((uint32_t)0x00000001) /*!< Memory bank enable bit */ +#define FSMC_BCR1_MUXEN ((uint32_t)0x00000002) /*!< Address/data multiplexing enable bit */ + +#define FSMC_BCR1_MTYP ((uint32_t)0x0000000C) /*!< MTYP[1:0] bits (Memory type) */ +#define FSMC_BCR1_MTYP_0 ((uint32_t)0x00000004) /*!< Bit 0 */ +#define FSMC_BCR1_MTYP_1 ((uint32_t)0x00000008) /*!< Bit 1 */ + +#define FSMC_BCR1_MWID ((uint32_t)0x00000030) /*!< MWID[1:0] bits (Memory data bus width) */ +#define FSMC_BCR1_MWID_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define FSMC_BCR1_MWID_1 ((uint32_t)0x00000020) /*!< Bit 1 */ + +#define FSMC_BCR1_FACCEN ((uint32_t)0x00000040) /*!< Flash access enable */ +#define FSMC_BCR1_BURSTEN ((uint32_t)0x00000100) /*!< Burst enable bit */ +#define FSMC_BCR1_WAITPOL ((uint32_t)0x00000200) /*!< Wait signal polarity bit */ +#define FSMC_BCR1_WRAPMOD ((uint32_t)0x00000400) /*!< Wrapped burst mode support */ +#define FSMC_BCR1_WAITCFG ((uint32_t)0x00000800) /*!< Wait timing configuration */ +#define FSMC_BCR1_WREN ((uint32_t)0x00001000) /*!< Write enable bit */ +#define FSMC_BCR1_WAITEN ((uint32_t)0x00002000) /*!< Wait enable bit */ +#define FSMC_BCR1_EXTMOD ((uint32_t)0x00004000) /*!< Extended mode enable */ +#define FSMC_BCR1_ASYNCWAIT ((uint32_t)0x00008000) /*!< Asynchronous wait */ +#define FSMC_BCR1_CBURSTRW ((uint32_t)0x00080000) /*!< Write burst enable */ + +/****************** Bit definition for FSMC_BCR2 register *******************/ +#define FSMC_BCR2_MBKEN ((uint32_t)0x00000001) /*!< Memory bank enable bit */ +#define FSMC_BCR2_MUXEN ((uint32_t)0x00000002) /*!< Address/data multiplexing enable bit */ + +#define FSMC_BCR2_MTYP ((uint32_t)0x0000000C) /*!< MTYP[1:0] bits (Memory type) */ +#define FSMC_BCR2_MTYP_0 ((uint32_t)0x00000004) /*!< Bit 0 */ +#define FSMC_BCR2_MTYP_1 ((uint32_t)0x00000008) /*!< Bit 1 */ + +#define FSMC_BCR2_MWID ((uint32_t)0x00000030) /*!< MWID[1:0] bits (Memory data bus width) */ +#define FSMC_BCR2_MWID_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define FSMC_BCR2_MWID_1 ((uint32_t)0x00000020) /*!< Bit 1 */ + +#define FSMC_BCR2_FACCEN ((uint32_t)0x00000040) /*!< Flash access enable */ +#define FSMC_BCR2_BURSTEN ((uint32_t)0x00000100) /*!< Burst enable bit */ +#define FSMC_BCR2_WAITPOL ((uint32_t)0x00000200) /*!< Wait signal polarity bit */ +#define FSMC_BCR2_WRAPMOD ((uint32_t)0x00000400) /*!< Wrapped burst mode support */ +#define FSMC_BCR2_WAITCFG ((uint32_t)0x00000800) /*!< Wait timing configuration */ +#define FSMC_BCR2_WREN ((uint32_t)0x00001000) /*!< Write enable bit */ +#define FSMC_BCR2_WAITEN ((uint32_t)0x00002000) /*!< Wait enable bit */ +#define FSMC_BCR2_EXTMOD ((uint32_t)0x00004000) /*!< Extended mode enable */ +#define FSMC_BCR2_ASYNCWAIT ((uint32_t)0x00008000) /*!< Asynchronous wait */ +#define FSMC_BCR2_CBURSTRW ((uint32_t)0x00080000) /*!< Write burst enable */ + +/****************** Bit definition for FSMC_BCR3 register *******************/ +#define FSMC_BCR3_MBKEN ((uint32_t)0x00000001) /*!< Memory bank enable bit */ +#define FSMC_BCR3_MUXEN ((uint32_t)0x00000002) /*!< Address/data multiplexing enable bit */ + +#define FSMC_BCR3_MTYP ((uint32_t)0x0000000C) /*!< MTYP[1:0] bits (Memory type) */ +#define FSMC_BCR3_MTYP_0 ((uint32_t)0x00000004) /*!< Bit 0 */ +#define FSMC_BCR3_MTYP_1 ((uint32_t)0x00000008) /*!< Bit 1 */ + +#define FSMC_BCR3_MWID ((uint32_t)0x00000030) /*!< MWID[1:0] bits (Memory data bus width) */ +#define FSMC_BCR3_MWID_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define FSMC_BCR3_MWID_1 ((uint32_t)0x00000020) /*!< Bit 1 */ + +#define FSMC_BCR3_FACCEN ((uint32_t)0x00000040) /*!< Flash access enable */ +#define FSMC_BCR3_BURSTEN ((uint32_t)0x00000100) /*!< Burst enable bit */ +#define FSMC_BCR3_WAITPOL ((uint32_t)0x00000200) /*!< Wait signal polarity bit. */ +#define FSMC_BCR3_WRAPMOD ((uint32_t)0x00000400) /*!< Wrapped burst mode support */ +#define FSMC_BCR3_WAITCFG ((uint32_t)0x00000800) /*!< Wait timing configuration */ +#define FSMC_BCR3_WREN ((uint32_t)0x00001000) /*!< Write enable bit */ +#define FSMC_BCR3_WAITEN ((uint32_t)0x00002000) /*!< Wait enable bit */ +#define FSMC_BCR3_EXTMOD ((uint32_t)0x00004000) /*!< Extended mode enable */ +#define FSMC_BCR3_ASYNCWAIT ((uint32_t)0x00008000) /*!< Asynchronous wait */ +#define FSMC_BCR3_CBURSTRW ((uint32_t)0x00080000) /*!< Write burst enable */ + +/****************** Bit definition for FSMC_BCR4 register *******************/ +#define FSMC_BCR4_MBKEN ((uint32_t)0x00000001) /*!< Memory bank enable bit */ +#define FSMC_BCR4_MUXEN ((uint32_t)0x00000002) /*!< Address/data multiplexing enable bit */ + +#define FSMC_BCR4_MTYP ((uint32_t)0x0000000C) /*!< MTYP[1:0] bits (Memory type) */ +#define FSMC_BCR4_MTYP_0 ((uint32_t)0x00000004) /*!< Bit 0 */ +#define FSMC_BCR4_MTYP_1 ((uint32_t)0x00000008) /*!< Bit 1 */ + +#define FSMC_BCR4_MWID ((uint32_t)0x00000030) /*!< MWID[1:0] bits (Memory data bus width) */ +#define FSMC_BCR4_MWID_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define FSMC_BCR4_MWID_1 ((uint32_t)0x00000020) /*!< Bit 1 */ + +#define FSMC_BCR4_FACCEN ((uint32_t)0x00000040) /*!< Flash access enable */ +#define FSMC_BCR4_BURSTEN ((uint32_t)0x00000100) /*!< Burst enable bit */ +#define FSMC_BCR4_WAITPOL ((uint32_t)0x00000200) /*!< Wait signal polarity bit */ +#define FSMC_BCR4_WRAPMOD ((uint32_t)0x00000400) /*!< Wrapped burst mode support */ +#define FSMC_BCR4_WAITCFG ((uint32_t)0x00000800) /*!< Wait timing configuration */ +#define FSMC_BCR4_WREN ((uint32_t)0x00001000) /*!< Write enable bit */ +#define FSMC_BCR4_WAITEN ((uint32_t)0x00002000) /*!< Wait enable bit */ +#define FSMC_BCR4_EXTMOD ((uint32_t)0x00004000) /*!< Extended mode enable */ +#define FSMC_BCR4_ASYNCWAIT ((uint32_t)0x00008000) /*!< Asynchronous wait */ +#define FSMC_BCR4_CBURSTRW ((uint32_t)0x00080000) /*!< Write burst enable */ + +/****************** Bit definition for FSMC_BTR1 register ******************/ +#define FSMC_BTR1_ADDSET ((uint32_t)0x0000000F) /*!< ADDSET[3:0] bits (Address setup phase duration) */ +#define FSMC_BTR1_ADDSET_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define FSMC_BTR1_ADDSET_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define FSMC_BTR1_ADDSET_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define FSMC_BTR1_ADDSET_3 ((uint32_t)0x00000008) /*!< Bit 3 */ + +#define FSMC_BTR1_ADDHLD ((uint32_t)0x000000F0) /*!< ADDHLD[3:0] bits (Address-hold phase duration) */ +#define FSMC_BTR1_ADDHLD_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define FSMC_BTR1_ADDHLD_1 ((uint32_t)0x00000020) /*!< Bit 1 */ +#define FSMC_BTR1_ADDHLD_2 ((uint32_t)0x00000040) /*!< Bit 2 */ +#define FSMC_BTR1_ADDHLD_3 ((uint32_t)0x00000080) /*!< Bit 3 */ + +#define FSMC_BTR1_DATAST ((uint32_t)0x0000FF00) /*!< DATAST [3:0] bits (Data-phase duration) */ +#define FSMC_BTR1_DATAST_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define FSMC_BTR1_DATAST_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define FSMC_BTR1_DATAST_2 ((uint32_t)0x00000400) /*!< Bit 2 */ +#define FSMC_BTR1_DATAST_3 ((uint32_t)0x00000800) /*!< Bit 3 */ + +#define FSMC_BTR1_BUSTURN ((uint32_t)0x000F0000) /*!< BUSTURN[3:0] bits (Bus turnaround phase duration) */ +#define FSMC_BTR1_BUSTURN_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define FSMC_BTR1_BUSTURN_1 ((uint32_t)0x00020000) /*!< Bit 1 */ +#define FSMC_BTR1_BUSTURN_2 ((uint32_t)0x00040000) /*!< Bit 2 */ +#define FSMC_BTR1_BUSTURN_3 ((uint32_t)0x00080000) /*!< Bit 3 */ + +#define FSMC_BTR1_CLKDIV ((uint32_t)0x00F00000) /*!< CLKDIV[3:0] bits (Clock divide ratio) */ +#define FSMC_BTR1_CLKDIV_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define FSMC_BTR1_CLKDIV_1 ((uint32_t)0x00200000) /*!< Bit 1 */ +#define FSMC_BTR1_CLKDIV_2 ((uint32_t)0x00400000) /*!< Bit 2 */ +#define FSMC_BTR1_CLKDIV_3 ((uint32_t)0x00800000) /*!< Bit 3 */ + +#define FSMC_BTR1_DATLAT ((uint32_t)0x0F000000) /*!< DATLA[3:0] bits (Data latency) */ +#define FSMC_BTR1_DATLAT_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define FSMC_BTR1_DATLAT_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define FSMC_BTR1_DATLAT_2 ((uint32_t)0x04000000) /*!< Bit 2 */ +#define FSMC_BTR1_DATLAT_3 ((uint32_t)0x08000000) /*!< Bit 3 */ + +#define FSMC_BTR1_ACCMOD ((uint32_t)0x30000000) /*!< ACCMOD[1:0] bits (Access mode) */ +#define FSMC_BTR1_ACCMOD_0 ((uint32_t)0x10000000) /*!< Bit 0 */ +#define FSMC_BTR1_ACCMOD_1 ((uint32_t)0x20000000) /*!< Bit 1 */ + +/****************** Bit definition for FSMC_BTR2 register *******************/ +#define FSMC_BTR2_ADDSET ((uint32_t)0x0000000F) /*!< ADDSET[3:0] bits (Address setup phase duration) */ +#define FSMC_BTR2_ADDSET_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define FSMC_BTR2_ADDSET_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define FSMC_BTR2_ADDSET_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define FSMC_BTR2_ADDSET_3 ((uint32_t)0x00000008) /*!< Bit 3 */ + +#define FSMC_BTR2_ADDHLD ((uint32_t)0x000000F0) /*!< ADDHLD[3:0] bits (Address-hold phase duration) */ +#define FSMC_BTR2_ADDHLD_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define FSMC_BTR2_ADDHLD_1 ((uint32_t)0x00000020) /*!< Bit 1 */ +#define FSMC_BTR2_ADDHLD_2 ((uint32_t)0x00000040) /*!< Bit 2 */ +#define FSMC_BTR2_ADDHLD_3 ((uint32_t)0x00000080) /*!< Bit 3 */ + +#define FSMC_BTR2_DATAST ((uint32_t)0x0000FF00) /*!< DATAST [3:0] bits (Data-phase duration) */ +#define FSMC_BTR2_DATAST_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define FSMC_BTR2_DATAST_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define FSMC_BTR2_DATAST_2 ((uint32_t)0x00000400) /*!< Bit 2 */ +#define FSMC_BTR2_DATAST_3 ((uint32_t)0x00000800) /*!< Bit 3 */ + +#define FSMC_BTR2_BUSTURN ((uint32_t)0x000F0000) /*!< BUSTURN[3:0] bits (Bus turnaround phase duration) */ +#define FSMC_BTR2_BUSTURN_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define FSMC_BTR2_BUSTURN_1 ((uint32_t)0x00020000) /*!< Bit 1 */ +#define FSMC_BTR2_BUSTURN_2 ((uint32_t)0x00040000) /*!< Bit 2 */ +#define FSMC_BTR2_BUSTURN_3 ((uint32_t)0x00080000) /*!< Bit 3 */ + +#define FSMC_BTR2_CLKDIV ((uint32_t)0x00F00000) /*!< CLKDIV[3:0] bits (Clock divide ratio) */ +#define FSMC_BTR2_CLKDIV_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define FSMC_BTR2_CLKDIV_1 ((uint32_t)0x00200000) /*!< Bit 1 */ +#define FSMC_BTR2_CLKDIV_2 ((uint32_t)0x00400000) /*!< Bit 2 */ +#define FSMC_BTR2_CLKDIV_3 ((uint32_t)0x00800000) /*!< Bit 3 */ + +#define FSMC_BTR2_DATLAT ((uint32_t)0x0F000000) /*!< DATLA[3:0] bits (Data latency) */ +#define FSMC_BTR2_DATLAT_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define FSMC_BTR2_DATLAT_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define FSMC_BTR2_DATLAT_2 ((uint32_t)0x04000000) /*!< Bit 2 */ +#define FSMC_BTR2_DATLAT_3 ((uint32_t)0x08000000) /*!< Bit 3 */ + +#define FSMC_BTR2_ACCMOD ((uint32_t)0x30000000) /*!< ACCMOD[1:0] bits (Access mode) */ +#define FSMC_BTR2_ACCMOD_0 ((uint32_t)0x10000000) /*!< Bit 0 */ +#define FSMC_BTR2_ACCMOD_1 ((uint32_t)0x20000000) /*!< Bit 1 */ + +/******************* Bit definition for FSMC_BTR3 register *******************/ +#define FSMC_BTR3_ADDSET ((uint32_t)0x0000000F) /*!< ADDSET[3:0] bits (Address setup phase duration) */ +#define FSMC_BTR3_ADDSET_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define FSMC_BTR3_ADDSET_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define FSMC_BTR3_ADDSET_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define FSMC_BTR3_ADDSET_3 ((uint32_t)0x00000008) /*!< Bit 3 */ + +#define FSMC_BTR3_ADDHLD ((uint32_t)0x000000F0) /*!< ADDHLD[3:0] bits (Address-hold phase duration) */ +#define FSMC_BTR3_ADDHLD_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define FSMC_BTR3_ADDHLD_1 ((uint32_t)0x00000020) /*!< Bit 1 */ +#define FSMC_BTR3_ADDHLD_2 ((uint32_t)0x00000040) /*!< Bit 2 */ +#define FSMC_BTR3_ADDHLD_3 ((uint32_t)0x00000080) /*!< Bit 3 */ + +#define FSMC_BTR3_DATAST ((uint32_t)0x0000FF00) /*!< DATAST [3:0] bits (Data-phase duration) */ +#define FSMC_BTR3_DATAST_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define FSMC_BTR3_DATAST_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define FSMC_BTR3_DATAST_2 ((uint32_t)0x00000400) /*!< Bit 2 */ +#define FSMC_BTR3_DATAST_3 ((uint32_t)0x00000800) /*!< Bit 3 */ + +#define FSMC_BTR3_BUSTURN ((uint32_t)0x000F0000) /*!< BUSTURN[3:0] bits (Bus turnaround phase duration) */ +#define FSMC_BTR3_BUSTURN_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define FSMC_BTR3_BUSTURN_1 ((uint32_t)0x00020000) /*!< Bit 1 */ +#define FSMC_BTR3_BUSTURN_2 ((uint32_t)0x00040000) /*!< Bit 2 */ +#define FSMC_BTR3_BUSTURN_3 ((uint32_t)0x00080000) /*!< Bit 3 */ + +#define FSMC_BTR3_CLKDIV ((uint32_t)0x00F00000) /*!< CLKDIV[3:0] bits (Clock divide ratio) */ +#define FSMC_BTR3_CLKDIV_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define FSMC_BTR3_CLKDIV_1 ((uint32_t)0x00200000) /*!< Bit 1 */ +#define FSMC_BTR3_CLKDIV_2 ((uint32_t)0x00400000) /*!< Bit 2 */ +#define FSMC_BTR3_CLKDIV_3 ((uint32_t)0x00800000) /*!< Bit 3 */ + +#define FSMC_BTR3_DATLAT ((uint32_t)0x0F000000) /*!< DATLA[3:0] bits (Data latency) */ +#define FSMC_BTR3_DATLAT_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define FSMC_BTR3_DATLAT_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define FSMC_BTR3_DATLAT_2 ((uint32_t)0x04000000) /*!< Bit 2 */ +#define FSMC_BTR3_DATLAT_3 ((uint32_t)0x08000000) /*!< Bit 3 */ + +#define FSMC_BTR3_ACCMOD ((uint32_t)0x30000000) /*!< ACCMOD[1:0] bits (Access mode) */ +#define FSMC_BTR3_ACCMOD_0 ((uint32_t)0x10000000) /*!< Bit 0 */ +#define FSMC_BTR3_ACCMOD_1 ((uint32_t)0x20000000) /*!< Bit 1 */ + +/****************** Bit definition for FSMC_BTR4 register *******************/ +#define FSMC_BTR4_ADDSET ((uint32_t)0x0000000F) /*!< ADDSET[3:0] bits (Address setup phase duration) */ +#define FSMC_BTR4_ADDSET_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define FSMC_BTR4_ADDSET_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define FSMC_BTR4_ADDSET_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define FSMC_BTR4_ADDSET_3 ((uint32_t)0x00000008) /*!< Bit 3 */ + +#define FSMC_BTR4_ADDHLD ((uint32_t)0x000000F0) /*!< ADDHLD[3:0] bits (Address-hold phase duration) */ +#define FSMC_BTR4_ADDHLD_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define FSMC_BTR4_ADDHLD_1 ((uint32_t)0x00000020) /*!< Bit 1 */ +#define FSMC_BTR4_ADDHLD_2 ((uint32_t)0x00000040) /*!< Bit 2 */ +#define FSMC_BTR4_ADDHLD_3 ((uint32_t)0x00000080) /*!< Bit 3 */ + +#define FSMC_BTR4_DATAST ((uint32_t)0x0000FF00) /*!< DATAST [3:0] bits (Data-phase duration) */ +#define FSMC_BTR4_DATAST_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define FSMC_BTR4_DATAST_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define FSMC_BTR4_DATAST_2 ((uint32_t)0x00000400) /*!< Bit 2 */ +#define FSMC_BTR4_DATAST_3 ((uint32_t)0x00000800) /*!< Bit 3 */ + +#define FSMC_BTR4_BUSTURN ((uint32_t)0x000F0000) /*!< BUSTURN[3:0] bits (Bus turnaround phase duration) */ +#define FSMC_BTR4_BUSTURN_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define FSMC_BTR4_BUSTURN_1 ((uint32_t)0x00020000) /*!< Bit 1 */ +#define FSMC_BTR4_BUSTURN_2 ((uint32_t)0x00040000) /*!< Bit 2 */ +#define FSMC_BTR4_BUSTURN_3 ((uint32_t)0x00080000) /*!< Bit 3 */ + +#define FSMC_BTR4_CLKDIV ((uint32_t)0x00F00000) /*!< CLKDIV[3:0] bits (Clock divide ratio) */ +#define FSMC_BTR4_CLKDIV_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define FSMC_BTR4_CLKDIV_1 ((uint32_t)0x00200000) /*!< Bit 1 */ +#define FSMC_BTR4_CLKDIV_2 ((uint32_t)0x00400000) /*!< Bit 2 */ +#define FSMC_BTR4_CLKDIV_3 ((uint32_t)0x00800000) /*!< Bit 3 */ + +#define FSMC_BTR4_DATLAT ((uint32_t)0x0F000000) /*!< DATLA[3:0] bits (Data latency) */ +#define FSMC_BTR4_DATLAT_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define FSMC_BTR4_DATLAT_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define FSMC_BTR4_DATLAT_2 ((uint32_t)0x04000000) /*!< Bit 2 */ +#define FSMC_BTR4_DATLAT_3 ((uint32_t)0x08000000) /*!< Bit 3 */ + +#define FSMC_BTR4_ACCMOD ((uint32_t)0x30000000) /*!< ACCMOD[1:0] bits (Access mode) */ +#define FSMC_BTR4_ACCMOD_0 ((uint32_t)0x10000000) /*!< Bit 0 */ +#define FSMC_BTR4_ACCMOD_1 ((uint32_t)0x20000000) /*!< Bit 1 */ + +/****************** Bit definition for FSMC_BWTR1 register ******************/ +#define FSMC_BWTR1_ADDSET ((uint32_t)0x0000000F) /*!< ADDSET[3:0] bits (Address setup phase duration) */ +#define FSMC_BWTR1_ADDSET_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define FSMC_BWTR1_ADDSET_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define FSMC_BWTR1_ADDSET_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define FSMC_BWTR1_ADDSET_3 ((uint32_t)0x00000008) /*!< Bit 3 */ + +#define FSMC_BWTR1_ADDHLD ((uint32_t)0x000000F0) /*!< ADDHLD[3:0] bits (Address-hold phase duration) */ +#define FSMC_BWTR1_ADDHLD_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define FSMC_BWTR1_ADDHLD_1 ((uint32_t)0x00000020) /*!< Bit 1 */ +#define FSMC_BWTR1_ADDHLD_2 ((uint32_t)0x00000040) /*!< Bit 2 */ +#define FSMC_BWTR1_ADDHLD_3 ((uint32_t)0x00000080) /*!< Bit 3 */ + +#define FSMC_BWTR1_DATAST ((uint32_t)0x0000FF00) /*!< DATAST [3:0] bits (Data-phase duration) */ +#define FSMC_BWTR1_DATAST_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define FSMC_BWTR1_DATAST_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define FSMC_BWTR1_DATAST_2 ((uint32_t)0x00000400) /*!< Bit 2 */ +#define FSMC_BWTR1_DATAST_3 ((uint32_t)0x00000800) /*!< Bit 3 */ + +#define FSMC_BWTR1_CLKDIV ((uint32_t)0x00F00000) /*!< CLKDIV[3:0] bits (Clock divide ratio) */ +#define FSMC_BWTR1_CLKDIV_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define FSMC_BWTR1_CLKDIV_1 ((uint32_t)0x00200000) /*!< Bit 1 */ +#define FSMC_BWTR1_CLKDIV_2 ((uint32_t)0x00400000) /*!< Bit 2 */ +#define FSMC_BWTR1_CLKDIV_3 ((uint32_t)0x00800000) /*!< Bit 3 */ + +#define FSMC_BWTR1_DATLAT ((uint32_t)0x0F000000) /*!< DATLA[3:0] bits (Data latency) */ +#define FSMC_BWTR1_DATLAT_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define FSMC_BWTR1_DATLAT_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define FSMC_BWTR1_DATLAT_2 ((uint32_t)0x04000000) /*!< Bit 2 */ +#define FSMC_BWTR1_DATLAT_3 ((uint32_t)0x08000000) /*!< Bit 3 */ + +#define FSMC_BWTR1_ACCMOD ((uint32_t)0x30000000) /*!< ACCMOD[1:0] bits (Access mode) */ +#define FSMC_BWTR1_ACCMOD_0 ((uint32_t)0x10000000) /*!< Bit 0 */ +#define FSMC_BWTR1_ACCMOD_1 ((uint32_t)0x20000000) /*!< Bit 1 */ + +/****************** Bit definition for FSMC_BWTR2 register ******************/ +#define FSMC_BWTR2_ADDSET ((uint32_t)0x0000000F) /*!< ADDSET[3:0] bits (Address setup phase duration) */ +#define FSMC_BWTR2_ADDSET_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define FSMC_BWTR2_ADDSET_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define FSMC_BWTR2_ADDSET_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define FSMC_BWTR2_ADDSET_3 ((uint32_t)0x00000008) /*!< Bit 3 */ + +#define FSMC_BWTR2_ADDHLD ((uint32_t)0x000000F0) /*!< ADDHLD[3:0] bits (Address-hold phase duration) */ +#define FSMC_BWTR2_ADDHLD_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define FSMC_BWTR2_ADDHLD_1 ((uint32_t)0x00000020) /*!< Bit 1 */ +#define FSMC_BWTR2_ADDHLD_2 ((uint32_t)0x00000040) /*!< Bit 2 */ +#define FSMC_BWTR2_ADDHLD_3 ((uint32_t)0x00000080) /*!< Bit 3 */ + +#define FSMC_BWTR2_DATAST ((uint32_t)0x0000FF00) /*!< DATAST [3:0] bits (Data-phase duration) */ +#define FSMC_BWTR2_DATAST_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define FSMC_BWTR2_DATAST_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define FSMC_BWTR2_DATAST_2 ((uint32_t)0x00000400) /*!< Bit 2 */ +#define FSMC_BWTR2_DATAST_3 ((uint32_t)0x00000800) /*!< Bit 3 */ + +#define FSMC_BWTR2_CLKDIV ((uint32_t)0x00F00000) /*!< CLKDIV[3:0] bits (Clock divide ratio) */ +#define FSMC_BWTR2_CLKDIV_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define FSMC_BWTR2_CLKDIV_1 ((uint32_t)0x00200000) /*!< Bit 1*/ +#define FSMC_BWTR2_CLKDIV_2 ((uint32_t)0x00400000) /*!< Bit 2 */ +#define FSMC_BWTR2_CLKDIV_3 ((uint32_t)0x00800000) /*!< Bit 3 */ + +#define FSMC_BWTR2_DATLAT ((uint32_t)0x0F000000) /*!< DATLA[3:0] bits (Data latency) */ +#define FSMC_BWTR2_DATLAT_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define FSMC_BWTR2_DATLAT_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define FSMC_BWTR2_DATLAT_2 ((uint32_t)0x04000000) /*!< Bit 2 */ +#define FSMC_BWTR2_DATLAT_3 ((uint32_t)0x08000000) /*!< Bit 3 */ + +#define FSMC_BWTR2_ACCMOD ((uint32_t)0x30000000) /*!< ACCMOD[1:0] bits (Access mode) */ +#define FSMC_BWTR2_ACCMOD_0 ((uint32_t)0x10000000) /*!< Bit 0 */ +#define FSMC_BWTR2_ACCMOD_1 ((uint32_t)0x20000000) /*!< Bit 1 */ + +/****************** Bit definition for FSMC_BWTR3 register ******************/ +#define FSMC_BWTR3_ADDSET ((uint32_t)0x0000000F) /*!< ADDSET[3:0] bits (Address setup phase duration) */ +#define FSMC_BWTR3_ADDSET_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define FSMC_BWTR3_ADDSET_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define FSMC_BWTR3_ADDSET_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define FSMC_BWTR3_ADDSET_3 ((uint32_t)0x00000008) /*!< Bit 3 */ + +#define FSMC_BWTR3_ADDHLD ((uint32_t)0x000000F0) /*!< ADDHLD[3:0] bits (Address-hold phase duration) */ +#define FSMC_BWTR3_ADDHLD_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define FSMC_BWTR3_ADDHLD_1 ((uint32_t)0x00000020) /*!< Bit 1 */ +#define FSMC_BWTR3_ADDHLD_2 ((uint32_t)0x00000040) /*!< Bit 2 */ +#define FSMC_BWTR3_ADDHLD_3 ((uint32_t)0x00000080) /*!< Bit 3 */ + +#define FSMC_BWTR3_DATAST ((uint32_t)0x0000FF00) /*!< DATAST [3:0] bits (Data-phase duration) */ +#define FSMC_BWTR3_DATAST_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define FSMC_BWTR3_DATAST_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define FSMC_BWTR3_DATAST_2 ((uint32_t)0x00000400) /*!< Bit 2 */ +#define FSMC_BWTR3_DATAST_3 ((uint32_t)0x00000800) /*!< Bit 3 */ + +#define FSMC_BWTR3_CLKDIV ((uint32_t)0x00F00000) /*!< CLKDIV[3:0] bits (Clock divide ratio) */ +#define FSMC_BWTR3_CLKDIV_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define FSMC_BWTR3_CLKDIV_1 ((uint32_t)0x00200000) /*!< Bit 1 */ +#define FSMC_BWTR3_CLKDIV_2 ((uint32_t)0x00400000) /*!< Bit 2 */ +#define FSMC_BWTR3_CLKDIV_3 ((uint32_t)0x00800000) /*!< Bit 3 */ + +#define FSMC_BWTR3_DATLAT ((uint32_t)0x0F000000) /*!< DATLA[3:0] bits (Data latency) */ +#define FSMC_BWTR3_DATLAT_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define FSMC_BWTR3_DATLAT_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define FSMC_BWTR3_DATLAT_2 ((uint32_t)0x04000000) /*!< Bit 2 */ +#define FSMC_BWTR3_DATLAT_3 ((uint32_t)0x08000000) /*!< Bit 3 */ + +#define FSMC_BWTR3_ACCMOD ((uint32_t)0x30000000) /*!< ACCMOD[1:0] bits (Access mode) */ +#define FSMC_BWTR3_ACCMOD_0 ((uint32_t)0x10000000) /*!< Bit 0 */ +#define FSMC_BWTR3_ACCMOD_1 ((uint32_t)0x20000000) /*!< Bit 1 */ + +/****************** Bit definition for FSMC_BWTR4 register ******************/ +#define FSMC_BWTR4_ADDSET ((uint32_t)0x0000000F) /*!< ADDSET[3:0] bits (Address setup phase duration) */ +#define FSMC_BWTR4_ADDSET_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define FSMC_BWTR4_ADDSET_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define FSMC_BWTR4_ADDSET_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define FSMC_BWTR4_ADDSET_3 ((uint32_t)0x00000008) /*!< Bit 3 */ + +#define FSMC_BWTR4_ADDHLD ((uint32_t)0x000000F0) /*!< ADDHLD[3:0] bits (Address-hold phase duration) */ +#define FSMC_BWTR4_ADDHLD_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define FSMC_BWTR4_ADDHLD_1 ((uint32_t)0x00000020) /*!< Bit 1 */ +#define FSMC_BWTR4_ADDHLD_2 ((uint32_t)0x00000040) /*!< Bit 2 */ +#define FSMC_BWTR4_ADDHLD_3 ((uint32_t)0x00000080) /*!< Bit 3 */ + +#define FSMC_BWTR4_DATAST ((uint32_t)0x0000FF00) /*!< DATAST [3:0] bits (Data-phase duration) */ +#define FSMC_BWTR4_DATAST_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define FSMC_BWTR4_DATAST_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define FSMC_BWTR4_DATAST_2 ((uint32_t)0x00000400) /*!< Bit 2 */ +#define FSMC_BWTR4_DATAST_3 ((uint32_t)0x00000800) /*!< Bit 3 */ + +#define FSMC_BWTR4_CLKDIV ((uint32_t)0x00F00000) /*!< CLKDIV[3:0] bits (Clock divide ratio) */ +#define FSMC_BWTR4_CLKDIV_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define FSMC_BWTR4_CLKDIV_1 ((uint32_t)0x00200000) /*!< Bit 1 */ +#define FSMC_BWTR4_CLKDIV_2 ((uint32_t)0x00400000) /*!< Bit 2 */ +#define FSMC_BWTR4_CLKDIV_3 ((uint32_t)0x00800000) /*!< Bit 3 */ + +#define FSMC_BWTR4_DATLAT ((uint32_t)0x0F000000) /*!< DATLA[3:0] bits (Data latency) */ +#define FSMC_BWTR4_DATLAT_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define FSMC_BWTR4_DATLAT_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define FSMC_BWTR4_DATLAT_2 ((uint32_t)0x04000000) /*!< Bit 2 */ +#define FSMC_BWTR4_DATLAT_3 ((uint32_t)0x08000000) /*!< Bit 3 */ + +#define FSMC_BWTR4_ACCMOD ((uint32_t)0x30000000) /*!< ACCMOD[1:0] bits (Access mode) */ +#define FSMC_BWTR4_ACCMOD_0 ((uint32_t)0x10000000) /*!< Bit 0 */ +#define FSMC_BWTR4_ACCMOD_1 ((uint32_t)0x20000000) /*!< Bit 1 */ + +/****************** Bit definition for FSMC_PCR2 register *******************/ +#define FSMC_PCR2_PWAITEN ((uint32_t)0x00000002) /*!< Wait feature enable bit */ +#define FSMC_PCR2_PBKEN ((uint32_t)0x00000004) /*!< PC Card/NAND Flash memory bank enable bit */ +#define FSMC_PCR2_PTYP ((uint32_t)0x00000008) /*!< Memory type */ + +#define FSMC_PCR2_PWID ((uint32_t)0x00000030) /*!< PWID[1:0] bits (NAND Flash databus width) */ +#define FSMC_PCR2_PWID_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define FSMC_PCR2_PWID_1 ((uint32_t)0x00000020) /*!< Bit 1 */ + +#define FSMC_PCR2_ECCEN ((uint32_t)0x00000040) /*!< ECC computation logic enable bit */ + +#define FSMC_PCR2_TCLR ((uint32_t)0x00001E00) /*!< TCLR[3:0] bits (CLE to RE delay) */ +#define FSMC_PCR2_TCLR_0 ((uint32_t)0x00000200) /*!< Bit 0 */ +#define FSMC_PCR2_TCLR_1 ((uint32_t)0x00000400) /*!< Bit 1 */ +#define FSMC_PCR2_TCLR_2 ((uint32_t)0x00000800) /*!< Bit 2 */ +#define FSMC_PCR2_TCLR_3 ((uint32_t)0x00001000) /*!< Bit 3 */ + +#define FSMC_PCR2_TAR ((uint32_t)0x0001E000) /*!< TAR[3:0] bits (ALE to RE delay) */ +#define FSMC_PCR2_TAR_0 ((uint32_t)0x00002000) /*!< Bit 0 */ +#define FSMC_PCR2_TAR_1 ((uint32_t)0x00004000) /*!< Bit 1 */ +#define FSMC_PCR2_TAR_2 ((uint32_t)0x00008000) /*!< Bit 2 */ +#define FSMC_PCR2_TAR_3 ((uint32_t)0x00010000) /*!< Bit 3 */ + +#define FSMC_PCR2_ECCPS ((uint32_t)0x000E0000) /*!< ECCPS[1:0] bits (ECC page size) */ +#define FSMC_PCR2_ECCPS_0 ((uint32_t)0x00020000) /*!< Bit 0 */ +#define FSMC_PCR2_ECCPS_1 ((uint32_t)0x00040000) /*!< Bit 1 */ +#define FSMC_PCR2_ECCPS_2 ((uint32_t)0x00080000) /*!< Bit 2 */ + +/****************** Bit definition for FSMC_PCR3 register *******************/ +#define FSMC_PCR3_PWAITEN ((uint32_t)0x00000002) /*!< Wait feature enable bit */ +#define FSMC_PCR3_PBKEN ((uint32_t)0x00000004) /*!< PC Card/NAND Flash memory bank enable bit */ +#define FSMC_PCR3_PTYP ((uint32_t)0x00000008) /*!< Memory type */ + +#define FSMC_PCR3_PWID ((uint32_t)0x00000030) /*!< PWID[1:0] bits (NAND Flash databus width) */ +#define FSMC_PCR3_PWID_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define FSMC_PCR3_PWID_1 ((uint32_t)0x00000020) /*!< Bit 1 */ + +#define FSMC_PCR3_ECCEN ((uint32_t)0x00000040) /*!< ECC computation logic enable bit */ + +#define FSMC_PCR3_TCLR ((uint32_t)0x00001E00) /*!< TCLR[3:0] bits (CLE to RE delay) */ +#define FSMC_PCR3_TCLR_0 ((uint32_t)0x00000200) /*!< Bit 0 */ +#define FSMC_PCR3_TCLR_1 ((uint32_t)0x00000400) /*!< Bit 1 */ +#define FSMC_PCR3_TCLR_2 ((uint32_t)0x00000800) /*!< Bit 2 */ +#define FSMC_PCR3_TCLR_3 ((uint32_t)0x00001000) /*!< Bit 3 */ + +#define FSMC_PCR3_TAR ((uint32_t)0x0001E000) /*!< TAR[3:0] bits (ALE to RE delay) */ +#define FSMC_PCR3_TAR_0 ((uint32_t)0x00002000) /*!< Bit 0 */ +#define FSMC_PCR3_TAR_1 ((uint32_t)0x00004000) /*!< Bit 1 */ +#define FSMC_PCR3_TAR_2 ((uint32_t)0x00008000) /*!< Bit 2 */ +#define FSMC_PCR3_TAR_3 ((uint32_t)0x00010000) /*!< Bit 3 */ + +#define FSMC_PCR3_ECCPS ((uint32_t)0x000E0000) /*!< ECCPS[2:0] bits (ECC page size) */ +#define FSMC_PCR3_ECCPS_0 ((uint32_t)0x00020000) /*!< Bit 0 */ +#define FSMC_PCR3_ECCPS_1 ((uint32_t)0x00040000) /*!< Bit 1 */ +#define FSMC_PCR3_ECCPS_2 ((uint32_t)0x00080000) /*!< Bit 2 */ + +/****************** Bit definition for FSMC_PCR4 register *******************/ +#define FSMC_PCR4_PWAITEN ((uint32_t)0x00000002) /*!< Wait feature enable bit */ +#define FSMC_PCR4_PBKEN ((uint32_t)0x00000004) /*!< PC Card/NAND Flash memory bank enable bit */ +#define FSMC_PCR4_PTYP ((uint32_t)0x00000008) /*!< Memory type */ + +#define FSMC_PCR4_PWID ((uint32_t)0x00000030) /*!< PWID[1:0] bits (NAND Flash databus width) */ +#define FSMC_PCR4_PWID_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define FSMC_PCR4_PWID_1 ((uint32_t)0x00000020) /*!< Bit 1 */ + +#define FSMC_PCR4_ECCEN ((uint32_t)0x00000040) /*!< ECC computation logic enable bit */ + +#define FSMC_PCR4_TCLR ((uint32_t)0x00001E00) /*!< TCLR[3:0] bits (CLE to RE delay) */ +#define FSMC_PCR4_TCLR_0 ((uint32_t)0x00000200) /*!< Bit 0 */ +#define FSMC_PCR4_TCLR_1 ((uint32_t)0x00000400) /*!< Bit 1 */ +#define FSMC_PCR4_TCLR_2 ((uint32_t)0x00000800) /*!< Bit 2 */ +#define FSMC_PCR4_TCLR_3 ((uint32_t)0x00001000) /*!< Bit 3 */ + +#define FSMC_PCR4_TAR ((uint32_t)0x0001E000) /*!< TAR[3:0] bits (ALE to RE delay) */ +#define FSMC_PCR4_TAR_0 ((uint32_t)0x00002000) /*!< Bit 0 */ +#define FSMC_PCR4_TAR_1 ((uint32_t)0x00004000) /*!< Bit 1 */ +#define FSMC_PCR4_TAR_2 ((uint32_t)0x00008000) /*!< Bit 2 */ +#define FSMC_PCR4_TAR_3 ((uint32_t)0x00010000) /*!< Bit 3 */ + +#define FSMC_PCR4_ECCPS ((uint32_t)0x000E0000) /*!< ECCPS[2:0] bits (ECC page size) */ +#define FSMC_PCR4_ECCPS_0 ((uint32_t)0x00020000) /*!< Bit 0 */ +#define FSMC_PCR4_ECCPS_1 ((uint32_t)0x00040000) /*!< Bit 1 */ +#define FSMC_PCR4_ECCPS_2 ((uint32_t)0x00080000) /*!< Bit 2 */ + +/******************* Bit definition for FSMC_SR2 register *******************/ +#define FSMC_SR2_IRS ((uint8_t)0x01) /*!< Interrupt Rising Edge status */ +#define FSMC_SR2_ILS ((uint8_t)0x02) /*!< Interrupt Level status */ +#define FSMC_SR2_IFS ((uint8_t)0x04) /*!< Interrupt Falling Edge status */ +#define FSMC_SR2_IREN ((uint8_t)0x08) /*!< Interrupt Rising Edge detection Enable bit */ +#define FSMC_SR2_ILEN ((uint8_t)0x10) /*!< Interrupt Level detection Enable bit */ +#define FSMC_SR2_IFEN ((uint8_t)0x20) /*!< Interrupt Falling Edge detection Enable bit */ +#define FSMC_SR2_FEMPT ((uint8_t)0x40) /*!< FIFO empty */ + +/******************* Bit definition for FSMC_SR3 register *******************/ +#define FSMC_SR3_IRS ((uint8_t)0x01) /*!< Interrupt Rising Edge status */ +#define FSMC_SR3_ILS ((uint8_t)0x02) /*!< Interrupt Level status */ +#define FSMC_SR3_IFS ((uint8_t)0x04) /*!< Interrupt Falling Edge status */ +#define FSMC_SR3_IREN ((uint8_t)0x08) /*!< Interrupt Rising Edge detection Enable bit */ +#define FSMC_SR3_ILEN ((uint8_t)0x10) /*!< Interrupt Level detection Enable bit */ +#define FSMC_SR3_IFEN ((uint8_t)0x20) /*!< Interrupt Falling Edge detection Enable bit */ +#define FSMC_SR3_FEMPT ((uint8_t)0x40) /*!< FIFO empty */ + +/******************* Bit definition for FSMC_SR4 register *******************/ +#define FSMC_SR4_IRS ((uint8_t)0x01) /*!< Interrupt Rising Edge status */ +#define FSMC_SR4_ILS ((uint8_t)0x02) /*!< Interrupt Level status */ +#define FSMC_SR4_IFS ((uint8_t)0x04) /*!< Interrupt Falling Edge status */ +#define FSMC_SR4_IREN ((uint8_t)0x08) /*!< Interrupt Rising Edge detection Enable bit */ +#define FSMC_SR4_ILEN ((uint8_t)0x10) /*!< Interrupt Level detection Enable bit */ +#define FSMC_SR4_IFEN ((uint8_t)0x20) /*!< Interrupt Falling Edge detection Enable bit */ +#define FSMC_SR4_FEMPT ((uint8_t)0x40) /*!< FIFO empty */ + +/****************** Bit definition for FSMC_PMEM2 register ******************/ +#define FSMC_PMEM2_MEMSET2 ((uint32_t)0x000000FF) /*!< MEMSET2[7:0] bits (Common memory 2 setup time) */ +#define FSMC_PMEM2_MEMSET2_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define FSMC_PMEM2_MEMSET2_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define FSMC_PMEM2_MEMSET2_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define FSMC_PMEM2_MEMSET2_3 ((uint32_t)0x00000008) /*!< Bit 3 */ +#define FSMC_PMEM2_MEMSET2_4 ((uint32_t)0x00000010) /*!< Bit 4 */ +#define FSMC_PMEM2_MEMSET2_5 ((uint32_t)0x00000020) /*!< Bit 5 */ +#define FSMC_PMEM2_MEMSET2_6 ((uint32_t)0x00000040) /*!< Bit 6 */ +#define FSMC_PMEM2_MEMSET2_7 ((uint32_t)0x00000080) /*!< Bit 7 */ + +#define FSMC_PMEM2_MEMWAIT2 ((uint32_t)0x0000FF00) /*!< MEMWAIT2[7:0] bits (Common memory 2 wait time) */ +#define FSMC_PMEM2_MEMWAIT2_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define FSMC_PMEM2_MEMWAIT2_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define FSMC_PMEM2_MEMWAIT2_2 ((uint32_t)0x00000400) /*!< Bit 2 */ +#define FSMC_PMEM2_MEMWAIT2_3 ((uint32_t)0x00000800) /*!< Bit 3 */ +#define FSMC_PMEM2_MEMWAIT2_4 ((uint32_t)0x00001000) /*!< Bit 4 */ +#define FSMC_PMEM2_MEMWAIT2_5 ((uint32_t)0x00002000) /*!< Bit 5 */ +#define FSMC_PMEM2_MEMWAIT2_6 ((uint32_t)0x00004000) /*!< Bit 6 */ +#define FSMC_PMEM2_MEMWAIT2_7 ((uint32_t)0x00008000) /*!< Bit 7 */ + +#define FSMC_PMEM2_MEMHOLD2 ((uint32_t)0x00FF0000) /*!< MEMHOLD2[7:0] bits (Common memory 2 hold time) */ +#define FSMC_PMEM2_MEMHOLD2_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define FSMC_PMEM2_MEMHOLD2_1 ((uint32_t)0x00020000) /*!< Bit 1 */ +#define FSMC_PMEM2_MEMHOLD2_2 ((uint32_t)0x00040000) /*!< Bit 2 */ +#define FSMC_PMEM2_MEMHOLD2_3 ((uint32_t)0x00080000) /*!< Bit 3 */ +#define FSMC_PMEM2_MEMHOLD2_4 ((uint32_t)0x00100000) /*!< Bit 4 */ +#define FSMC_PMEM2_MEMHOLD2_5 ((uint32_t)0x00200000) /*!< Bit 5 */ +#define FSMC_PMEM2_MEMHOLD2_6 ((uint32_t)0x00400000) /*!< Bit 6 */ +#define FSMC_PMEM2_MEMHOLD2_7 ((uint32_t)0x00800000) /*!< Bit 7 */ + +#define FSMC_PMEM2_MEMHIZ2 ((uint32_t)0xFF000000) /*!< MEMHIZ2[7:0] bits (Common memory 2 databus HiZ time) */ +#define FSMC_PMEM2_MEMHIZ2_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define FSMC_PMEM2_MEMHIZ2_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define FSMC_PMEM2_MEMHIZ2_2 ((uint32_t)0x04000000) /*!< Bit 2 */ +#define FSMC_PMEM2_MEMHIZ2_3 ((uint32_t)0x08000000) /*!< Bit 3 */ +#define FSMC_PMEM2_MEMHIZ2_4 ((uint32_t)0x10000000) /*!< Bit 4 */ +#define FSMC_PMEM2_MEMHIZ2_5 ((uint32_t)0x20000000) /*!< Bit 5 */ +#define FSMC_PMEM2_MEMHIZ2_6 ((uint32_t)0x40000000) /*!< Bit 6 */ +#define FSMC_PMEM2_MEMHIZ2_7 ((uint32_t)0x80000000) /*!< Bit 7 */ + +/****************** Bit definition for FSMC_PMEM3 register ******************/ +#define FSMC_PMEM3_MEMSET3 ((uint32_t)0x000000FF) /*!< MEMSET3[7:0] bits (Common memory 3 setup time) */ +#define FSMC_PMEM3_MEMSET3_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define FSMC_PMEM3_MEMSET3_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define FSMC_PMEM3_MEMSET3_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define FSMC_PMEM3_MEMSET3_3 ((uint32_t)0x00000008) /*!< Bit 3 */ +#define FSMC_PMEM3_MEMSET3_4 ((uint32_t)0x00000010) /*!< Bit 4 */ +#define FSMC_PMEM3_MEMSET3_5 ((uint32_t)0x00000020) /*!< Bit 5 */ +#define FSMC_PMEM3_MEMSET3_6 ((uint32_t)0x00000040) /*!< Bit 6 */ +#define FSMC_PMEM3_MEMSET3_7 ((uint32_t)0x00000080) /*!< Bit 7 */ + +#define FSMC_PMEM3_MEMWAIT3 ((uint32_t)0x0000FF00) /*!< MEMWAIT3[7:0] bits (Common memory 3 wait time) */ +#define FSMC_PMEM3_MEMWAIT3_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define FSMC_PMEM3_MEMWAIT3_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define FSMC_PMEM3_MEMWAIT3_2 ((uint32_t)0x00000400) /*!< Bit 2 */ +#define FSMC_PMEM3_MEMWAIT3_3 ((uint32_t)0x00000800) /*!< Bit 3 */ +#define FSMC_PMEM3_MEMWAIT3_4 ((uint32_t)0x00001000) /*!< Bit 4 */ +#define FSMC_PMEM3_MEMWAIT3_5 ((uint32_t)0x00002000) /*!< Bit 5 */ +#define FSMC_PMEM3_MEMWAIT3_6 ((uint32_t)0x00004000) /*!< Bit 6 */ +#define FSMC_PMEM3_MEMWAIT3_7 ((uint32_t)0x00008000) /*!< Bit 7 */ + +#define FSMC_PMEM3_MEMHOLD3 ((uint32_t)0x00FF0000) /*!< MEMHOLD3[7:0] bits (Common memory 3 hold time) */ +#define FSMC_PMEM3_MEMHOLD3_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define FSMC_PMEM3_MEMHOLD3_1 ((uint32_t)0x00020000) /*!< Bit 1 */ +#define FSMC_PMEM3_MEMHOLD3_2 ((uint32_t)0x00040000) /*!< Bit 2 */ +#define FSMC_PMEM3_MEMHOLD3_3 ((uint32_t)0x00080000) /*!< Bit 3 */ +#define FSMC_PMEM3_MEMHOLD3_4 ((uint32_t)0x00100000) /*!< Bit 4 */ +#define FSMC_PMEM3_MEMHOLD3_5 ((uint32_t)0x00200000) /*!< Bit 5 */ +#define FSMC_PMEM3_MEMHOLD3_6 ((uint32_t)0x00400000) /*!< Bit 6 */ +#define FSMC_PMEM3_MEMHOLD3_7 ((uint32_t)0x00800000) /*!< Bit 7 */ + +#define FSMC_PMEM3_MEMHIZ3 ((uint32_t)0xFF000000) /*!< MEMHIZ3[7:0] bits (Common memory 3 databus HiZ time) */ +#define FSMC_PMEM3_MEMHIZ3_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define FSMC_PMEM3_MEMHIZ3_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define FSMC_PMEM3_MEMHIZ3_2 ((uint32_t)0x04000000) /*!< Bit 2 */ +#define FSMC_PMEM3_MEMHIZ3_3 ((uint32_t)0x08000000) /*!< Bit 3 */ +#define FSMC_PMEM3_MEMHIZ3_4 ((uint32_t)0x10000000) /*!< Bit 4 */ +#define FSMC_PMEM3_MEMHIZ3_5 ((uint32_t)0x20000000) /*!< Bit 5 */ +#define FSMC_PMEM3_MEMHIZ3_6 ((uint32_t)0x40000000) /*!< Bit 6 */ +#define FSMC_PMEM3_MEMHIZ3_7 ((uint32_t)0x80000000) /*!< Bit 7 */ + +/****************** Bit definition for FSMC_PMEM4 register ******************/ +#define FSMC_PMEM4_MEMSET4 ((uint32_t)0x000000FF) /*!< MEMSET4[7:0] bits (Common memory 4 setup time) */ +#define FSMC_PMEM4_MEMSET4_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define FSMC_PMEM4_MEMSET4_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define FSMC_PMEM4_MEMSET4_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define FSMC_PMEM4_MEMSET4_3 ((uint32_t)0x00000008) /*!< Bit 3 */ +#define FSMC_PMEM4_MEMSET4_4 ((uint32_t)0x00000010) /*!< Bit 4 */ +#define FSMC_PMEM4_MEMSET4_5 ((uint32_t)0x00000020) /*!< Bit 5 */ +#define FSMC_PMEM4_MEMSET4_6 ((uint32_t)0x00000040) /*!< Bit 6 */ +#define FSMC_PMEM4_MEMSET4_7 ((uint32_t)0x00000080) /*!< Bit 7 */ + +#define FSMC_PMEM4_MEMWAIT4 ((uint32_t)0x0000FF00) /*!< MEMWAIT4[7:0] bits (Common memory 4 wait time) */ +#define FSMC_PMEM4_MEMWAIT4_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define FSMC_PMEM4_MEMWAIT4_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define FSMC_PMEM4_MEMWAIT4_2 ((uint32_t)0x00000400) /*!< Bit 2 */ +#define FSMC_PMEM4_MEMWAIT4_3 ((uint32_t)0x00000800) /*!< Bit 3 */ +#define FSMC_PMEM4_MEMWAIT4_4 ((uint32_t)0x00001000) /*!< Bit 4 */ +#define FSMC_PMEM4_MEMWAIT4_5 ((uint32_t)0x00002000) /*!< Bit 5 */ +#define FSMC_PMEM4_MEMWAIT4_6 ((uint32_t)0x00004000) /*!< Bit 6 */ +#define FSMC_PMEM4_MEMWAIT4_7 ((uint32_t)0x00008000) /*!< Bit 7 */ + +#define FSMC_PMEM4_MEMHOLD4 ((uint32_t)0x00FF0000) /*!< MEMHOLD4[7:0] bits (Common memory 4 hold time) */ +#define FSMC_PMEM4_MEMHOLD4_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define FSMC_PMEM4_MEMHOLD4_1 ((uint32_t)0x00020000) /*!< Bit 1 */ +#define FSMC_PMEM4_MEMHOLD4_2 ((uint32_t)0x00040000) /*!< Bit 2 */ +#define FSMC_PMEM4_MEMHOLD4_3 ((uint32_t)0x00080000) /*!< Bit 3 */ +#define FSMC_PMEM4_MEMHOLD4_4 ((uint32_t)0x00100000) /*!< Bit 4 */ +#define FSMC_PMEM4_MEMHOLD4_5 ((uint32_t)0x00200000) /*!< Bit 5 */ +#define FSMC_PMEM4_MEMHOLD4_6 ((uint32_t)0x00400000) /*!< Bit 6 */ +#define FSMC_PMEM4_MEMHOLD4_7 ((uint32_t)0x00800000) /*!< Bit 7 */ + +#define FSMC_PMEM4_MEMHIZ4 ((uint32_t)0xFF000000) /*!< MEMHIZ4[7:0] bits (Common memory 4 databus HiZ time) */ +#define FSMC_PMEM4_MEMHIZ4_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define FSMC_PMEM4_MEMHIZ4_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define FSMC_PMEM4_MEMHIZ4_2 ((uint32_t)0x04000000) /*!< Bit 2 */ +#define FSMC_PMEM4_MEMHIZ4_3 ((uint32_t)0x08000000) /*!< Bit 3 */ +#define FSMC_PMEM4_MEMHIZ4_4 ((uint32_t)0x10000000) /*!< Bit 4 */ +#define FSMC_PMEM4_MEMHIZ4_5 ((uint32_t)0x20000000) /*!< Bit 5 */ +#define FSMC_PMEM4_MEMHIZ4_6 ((uint32_t)0x40000000) /*!< Bit 6 */ +#define FSMC_PMEM4_MEMHIZ4_7 ((uint32_t)0x80000000) /*!< Bit 7 */ + +/****************** Bit definition for FSMC_PATT2 register ******************/ +#define FSMC_PATT2_ATTSET2 ((uint32_t)0x000000FF) /*!< ATTSET2[7:0] bits (Attribute memory 2 setup time) */ +#define FSMC_PATT2_ATTSET2_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define FSMC_PATT2_ATTSET2_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define FSMC_PATT2_ATTSET2_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define FSMC_PATT2_ATTSET2_3 ((uint32_t)0x00000008) /*!< Bit 3 */ +#define FSMC_PATT2_ATTSET2_4 ((uint32_t)0x00000010) /*!< Bit 4 */ +#define FSMC_PATT2_ATTSET2_5 ((uint32_t)0x00000020) /*!< Bit 5 */ +#define FSMC_PATT2_ATTSET2_6 ((uint32_t)0x00000040) /*!< Bit 6 */ +#define FSMC_PATT2_ATTSET2_7 ((uint32_t)0x00000080) /*!< Bit 7 */ + +#define FSMC_PATT2_ATTWAIT2 ((uint32_t)0x0000FF00) /*!< ATTWAIT2[7:0] bits (Attribute memory 2 wait time) */ +#define FSMC_PATT2_ATTWAIT2_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define FSMC_PATT2_ATTWAIT2_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define FSMC_PATT2_ATTWAIT2_2 ((uint32_t)0x00000400) /*!< Bit 2 */ +#define FSMC_PATT2_ATTWAIT2_3 ((uint32_t)0x00000800) /*!< Bit 3 */ +#define FSMC_PATT2_ATTWAIT2_4 ((uint32_t)0x00001000) /*!< Bit 4 */ +#define FSMC_PATT2_ATTWAIT2_5 ((uint32_t)0x00002000) /*!< Bit 5 */ +#define FSMC_PATT2_ATTWAIT2_6 ((uint32_t)0x00004000) /*!< Bit 6 */ +#define FSMC_PATT2_ATTWAIT2_7 ((uint32_t)0x00008000) /*!< Bit 7 */ + +#define FSMC_PATT2_ATTHOLD2 ((uint32_t)0x00FF0000) /*!< ATTHOLD2[7:0] bits (Attribute memory 2 hold time) */ +#define FSMC_PATT2_ATTHOLD2_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define FSMC_PATT2_ATTHOLD2_1 ((uint32_t)0x00020000) /*!< Bit 1 */ +#define FSMC_PATT2_ATTHOLD2_2 ((uint32_t)0x00040000) /*!< Bit 2 */ +#define FSMC_PATT2_ATTHOLD2_3 ((uint32_t)0x00080000) /*!< Bit 3 */ +#define FSMC_PATT2_ATTHOLD2_4 ((uint32_t)0x00100000) /*!< Bit 4 */ +#define FSMC_PATT2_ATTHOLD2_5 ((uint32_t)0x00200000) /*!< Bit 5 */ +#define FSMC_PATT2_ATTHOLD2_6 ((uint32_t)0x00400000) /*!< Bit 6 */ +#define FSMC_PATT2_ATTHOLD2_7 ((uint32_t)0x00800000) /*!< Bit 7 */ + +#define FSMC_PATT2_ATTHIZ2 ((uint32_t)0xFF000000) /*!< ATTHIZ2[7:0] bits (Attribute memory 2 databus HiZ time) */ +#define FSMC_PATT2_ATTHIZ2_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define FSMC_PATT2_ATTHIZ2_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define FSMC_PATT2_ATTHIZ2_2 ((uint32_t)0x04000000) /*!< Bit 2 */ +#define FSMC_PATT2_ATTHIZ2_3 ((uint32_t)0x08000000) /*!< Bit 3 */ +#define FSMC_PATT2_ATTHIZ2_4 ((uint32_t)0x10000000) /*!< Bit 4 */ +#define FSMC_PATT2_ATTHIZ2_5 ((uint32_t)0x20000000) /*!< Bit 5 */ +#define FSMC_PATT2_ATTHIZ2_6 ((uint32_t)0x40000000) /*!< Bit 6 */ +#define FSMC_PATT2_ATTHIZ2_7 ((uint32_t)0x80000000) /*!< Bit 7 */ + +/****************** Bit definition for FSMC_PATT3 register ******************/ +#define FSMC_PATT3_ATTSET3 ((uint32_t)0x000000FF) /*!< ATTSET3[7:0] bits (Attribute memory 3 setup time) */ +#define FSMC_PATT3_ATTSET3_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define FSMC_PATT3_ATTSET3_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define FSMC_PATT3_ATTSET3_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define FSMC_PATT3_ATTSET3_3 ((uint32_t)0x00000008) /*!< Bit 3 */ +#define FSMC_PATT3_ATTSET3_4 ((uint32_t)0x00000010) /*!< Bit 4 */ +#define FSMC_PATT3_ATTSET3_5 ((uint32_t)0x00000020) /*!< Bit 5 */ +#define FSMC_PATT3_ATTSET3_6 ((uint32_t)0x00000040) /*!< Bit 6 */ +#define FSMC_PATT3_ATTSET3_7 ((uint32_t)0x00000080) /*!< Bit 7 */ + +#define FSMC_PATT3_ATTWAIT3 ((uint32_t)0x0000FF00) /*!< ATTWAIT3[7:0] bits (Attribute memory 3 wait time) */ +#define FSMC_PATT3_ATTWAIT3_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define FSMC_PATT3_ATTWAIT3_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define FSMC_PATT3_ATTWAIT3_2 ((uint32_t)0x00000400) /*!< Bit 2 */ +#define FSMC_PATT3_ATTWAIT3_3 ((uint32_t)0x00000800) /*!< Bit 3 */ +#define FSMC_PATT3_ATTWAIT3_4 ((uint32_t)0x00001000) /*!< Bit 4 */ +#define FSMC_PATT3_ATTWAIT3_5 ((uint32_t)0x00002000) /*!< Bit 5 */ +#define FSMC_PATT3_ATTWAIT3_6 ((uint32_t)0x00004000) /*!< Bit 6 */ +#define FSMC_PATT3_ATTWAIT3_7 ((uint32_t)0x00008000) /*!< Bit 7 */ + +#define FSMC_PATT3_ATTHOLD3 ((uint32_t)0x00FF0000) /*!< ATTHOLD3[7:0] bits (Attribute memory 3 hold time) */ +#define FSMC_PATT3_ATTHOLD3_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define FSMC_PATT3_ATTHOLD3_1 ((uint32_t)0x00020000) /*!< Bit 1 */ +#define FSMC_PATT3_ATTHOLD3_2 ((uint32_t)0x00040000) /*!< Bit 2 */ +#define FSMC_PATT3_ATTHOLD3_3 ((uint32_t)0x00080000) /*!< Bit 3 */ +#define FSMC_PATT3_ATTHOLD3_4 ((uint32_t)0x00100000) /*!< Bit 4 */ +#define FSMC_PATT3_ATTHOLD3_5 ((uint32_t)0x00200000) /*!< Bit 5 */ +#define FSMC_PATT3_ATTHOLD3_6 ((uint32_t)0x00400000) /*!< Bit 6 */ +#define FSMC_PATT3_ATTHOLD3_7 ((uint32_t)0x00800000) /*!< Bit 7 */ + +#define FSMC_PATT3_ATTHIZ3 ((uint32_t)0xFF000000) /*!< ATTHIZ3[7:0] bits (Attribute memory 3 databus HiZ time) */ +#define FSMC_PATT3_ATTHIZ3_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define FSMC_PATT3_ATTHIZ3_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define FSMC_PATT3_ATTHIZ3_2 ((uint32_t)0x04000000) /*!< Bit 2 */ +#define FSMC_PATT3_ATTHIZ3_3 ((uint32_t)0x08000000) /*!< Bit 3 */ +#define FSMC_PATT3_ATTHIZ3_4 ((uint32_t)0x10000000) /*!< Bit 4 */ +#define FSMC_PATT3_ATTHIZ3_5 ((uint32_t)0x20000000) /*!< Bit 5 */ +#define FSMC_PATT3_ATTHIZ3_6 ((uint32_t)0x40000000) /*!< Bit 6 */ +#define FSMC_PATT3_ATTHIZ3_7 ((uint32_t)0x80000000) /*!< Bit 7 */ + +/****************** Bit definition for FSMC_PATT4 register ******************/ +#define FSMC_PATT4_ATTSET4 ((uint32_t)0x000000FF) /*!< ATTSET4[7:0] bits (Attribute memory 4 setup time) */ +#define FSMC_PATT4_ATTSET4_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define FSMC_PATT4_ATTSET4_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define FSMC_PATT4_ATTSET4_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define FSMC_PATT4_ATTSET4_3 ((uint32_t)0x00000008) /*!< Bit 3 */ +#define FSMC_PATT4_ATTSET4_4 ((uint32_t)0x00000010) /*!< Bit 4 */ +#define FSMC_PATT4_ATTSET4_5 ((uint32_t)0x00000020) /*!< Bit 5 */ +#define FSMC_PATT4_ATTSET4_6 ((uint32_t)0x00000040) /*!< Bit 6 */ +#define FSMC_PATT4_ATTSET4_7 ((uint32_t)0x00000080) /*!< Bit 7 */ + +#define FSMC_PATT4_ATTWAIT4 ((uint32_t)0x0000FF00) /*!< ATTWAIT4[7:0] bits (Attribute memory 4 wait time) */ +#define FSMC_PATT4_ATTWAIT4_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define FSMC_PATT4_ATTWAIT4_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define FSMC_PATT4_ATTWAIT4_2 ((uint32_t)0x00000400) /*!< Bit 2 */ +#define FSMC_PATT4_ATTWAIT4_3 ((uint32_t)0x00000800) /*!< Bit 3 */ +#define FSMC_PATT4_ATTWAIT4_4 ((uint32_t)0x00001000) /*!< Bit 4 */ +#define FSMC_PATT4_ATTWAIT4_5 ((uint32_t)0x00002000) /*!< Bit 5 */ +#define FSMC_PATT4_ATTWAIT4_6 ((uint32_t)0x00004000) /*!< Bit 6 */ +#define FSMC_PATT4_ATTWAIT4_7 ((uint32_t)0x00008000) /*!< Bit 7 */ + +#define FSMC_PATT4_ATTHOLD4 ((uint32_t)0x00FF0000) /*!< ATTHOLD4[7:0] bits (Attribute memory 4 hold time) */ +#define FSMC_PATT4_ATTHOLD4_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define FSMC_PATT4_ATTHOLD4_1 ((uint32_t)0x00020000) /*!< Bit 1 */ +#define FSMC_PATT4_ATTHOLD4_2 ((uint32_t)0x00040000) /*!< Bit 2 */ +#define FSMC_PATT4_ATTHOLD4_3 ((uint32_t)0x00080000) /*!< Bit 3 */ +#define FSMC_PATT4_ATTHOLD4_4 ((uint32_t)0x00100000) /*!< Bit 4 */ +#define FSMC_PATT4_ATTHOLD4_5 ((uint32_t)0x00200000) /*!< Bit 5 */ +#define FSMC_PATT4_ATTHOLD4_6 ((uint32_t)0x00400000) /*!< Bit 6 */ +#define FSMC_PATT4_ATTHOLD4_7 ((uint32_t)0x00800000) /*!< Bit 7 */ + +#define FSMC_PATT4_ATTHIZ4 ((uint32_t)0xFF000000) /*!< ATTHIZ4[7:0] bits (Attribute memory 4 databus HiZ time) */ +#define FSMC_PATT4_ATTHIZ4_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define FSMC_PATT4_ATTHIZ4_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define FSMC_PATT4_ATTHIZ4_2 ((uint32_t)0x04000000) /*!< Bit 2 */ +#define FSMC_PATT4_ATTHIZ4_3 ((uint32_t)0x08000000) /*!< Bit 3 */ +#define FSMC_PATT4_ATTHIZ4_4 ((uint32_t)0x10000000) /*!< Bit 4 */ +#define FSMC_PATT4_ATTHIZ4_5 ((uint32_t)0x20000000) /*!< Bit 5 */ +#define FSMC_PATT4_ATTHIZ4_6 ((uint32_t)0x40000000) /*!< Bit 6 */ +#define FSMC_PATT4_ATTHIZ4_7 ((uint32_t)0x80000000) /*!< Bit 7 */ + +/****************** Bit definition for FSMC_PIO4 register *******************/ +#define FSMC_PIO4_IOSET4 ((uint32_t)0x000000FF) /*!< IOSET4[7:0] bits (I/O 4 setup time) */ +#define FSMC_PIO4_IOSET4_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define FSMC_PIO4_IOSET4_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define FSMC_PIO4_IOSET4_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define FSMC_PIO4_IOSET4_3 ((uint32_t)0x00000008) /*!< Bit 3 */ +#define FSMC_PIO4_IOSET4_4 ((uint32_t)0x00000010) /*!< Bit 4 */ +#define FSMC_PIO4_IOSET4_5 ((uint32_t)0x00000020) /*!< Bit 5 */ +#define FSMC_PIO4_IOSET4_6 ((uint32_t)0x00000040) /*!< Bit 6 */ +#define FSMC_PIO4_IOSET4_7 ((uint32_t)0x00000080) /*!< Bit 7 */ + +#define FSMC_PIO4_IOWAIT4 ((uint32_t)0x0000FF00) /*!< IOWAIT4[7:0] bits (I/O 4 wait time) */ +#define FSMC_PIO4_IOWAIT4_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define FSMC_PIO4_IOWAIT4_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define FSMC_PIO4_IOWAIT4_2 ((uint32_t)0x00000400) /*!< Bit 2 */ +#define FSMC_PIO4_IOWAIT4_3 ((uint32_t)0x00000800) /*!< Bit 3 */ +#define FSMC_PIO4_IOWAIT4_4 ((uint32_t)0x00001000) /*!< Bit 4 */ +#define FSMC_PIO4_IOWAIT4_5 ((uint32_t)0x00002000) /*!< Bit 5 */ +#define FSMC_PIO4_IOWAIT4_6 ((uint32_t)0x00004000) /*!< Bit 6 */ +#define FSMC_PIO4_IOWAIT4_7 ((uint32_t)0x00008000) /*!< Bit 7 */ + +#define FSMC_PIO4_IOHOLD4 ((uint32_t)0x00FF0000) /*!< IOHOLD4[7:0] bits (I/O 4 hold time) */ +#define FSMC_PIO4_IOHOLD4_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define FSMC_PIO4_IOHOLD4_1 ((uint32_t)0x00020000) /*!< Bit 1 */ +#define FSMC_PIO4_IOHOLD4_2 ((uint32_t)0x00040000) /*!< Bit 2 */ +#define FSMC_PIO4_IOHOLD4_3 ((uint32_t)0x00080000) /*!< Bit 3 */ +#define FSMC_PIO4_IOHOLD4_4 ((uint32_t)0x00100000) /*!< Bit 4 */ +#define FSMC_PIO4_IOHOLD4_5 ((uint32_t)0x00200000) /*!< Bit 5 */ +#define FSMC_PIO4_IOHOLD4_6 ((uint32_t)0x00400000) /*!< Bit 6 */ +#define FSMC_PIO4_IOHOLD4_7 ((uint32_t)0x00800000) /*!< Bit 7 */ + +#define FSMC_PIO4_IOHIZ4 ((uint32_t)0xFF000000) /*!< IOHIZ4[7:0] bits (I/O 4 databus HiZ time) */ +#define FSMC_PIO4_IOHIZ4_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define FSMC_PIO4_IOHIZ4_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define FSMC_PIO4_IOHIZ4_2 ((uint32_t)0x04000000) /*!< Bit 2 */ +#define FSMC_PIO4_IOHIZ4_3 ((uint32_t)0x08000000) /*!< Bit 3 */ +#define FSMC_PIO4_IOHIZ4_4 ((uint32_t)0x10000000) /*!< Bit 4 */ +#define FSMC_PIO4_IOHIZ4_5 ((uint32_t)0x20000000) /*!< Bit 5 */ +#define FSMC_PIO4_IOHIZ4_6 ((uint32_t)0x40000000) /*!< Bit 6 */ +#define FSMC_PIO4_IOHIZ4_7 ((uint32_t)0x80000000) /*!< Bit 7 */ + +/****************** Bit definition for FSMC_ECCR2 register ******************/ +#define FSMC_ECCR2_ECC2 ((uint32_t)0xFFFFFFFF) /*!< ECC result */ + +/****************** Bit definition for FSMC_ECCR3 register ******************/ +#define FSMC_ECCR3_ECC3 ((uint32_t)0xFFFFFFFF) /*!< ECC result */ + +/******************************************************************************/ +/* */ +/* SD host Interface */ +/* */ +/******************************************************************************/ + +/****************** Bit definition for SDIO_POWER register ******************/ +#define SDIO_POWER_PWRCTRL ((uint8_t)0x03) /*!< PWRCTRL[1:0] bits (Power supply control bits) */ +#define SDIO_POWER_PWRCTRL_0 ((uint8_t)0x01) /*!< Bit 0 */ +#define SDIO_POWER_PWRCTRL_1 ((uint8_t)0x02) /*!< Bit 1 */ + +/****************** Bit definition for SDIO_CLKCR register ******************/ +#define SDIO_CLKCR_CLKDIV ((uint16_t)0x00FF) /*!< Clock divide factor */ +#define SDIO_CLKCR_CLKEN ((uint16_t)0x0100) /*!< Clock enable bit */ +#define SDIO_CLKCR_PWRSAV ((uint16_t)0x0200) /*!< Power saving configuration bit */ +#define SDIO_CLKCR_BYPASS ((uint16_t)0x0400) /*!< Clock divider bypass enable bit */ + +#define SDIO_CLKCR_WIDBUS ((uint16_t)0x1800) /*!< WIDBUS[1:0] bits (Wide bus mode enable bit) */ +#define SDIO_CLKCR_WIDBUS_0 ((uint16_t)0x0800) /*!< Bit 0 */ +#define SDIO_CLKCR_WIDBUS_1 ((uint16_t)0x1000) /*!< Bit 1 */ + +#define SDIO_CLKCR_NEGEDGE ((uint16_t)0x2000) /*!< SDIO_CK dephasing selection bit */ +#define SDIO_CLKCR_HWFC_EN ((uint16_t)0x4000) /*!< HW Flow Control enable */ + +/******************* Bit definition for SDIO_ARG register *******************/ +#define SDIO_ARG_CMDARG ((uint32_t)0xFFFFFFFF) /*!< Command argument */ + +/******************* Bit definition for SDIO_CMD register *******************/ +#define SDIO_CMD_CMDINDEX ((uint16_t)0x003F) /*!< Command Index */ + +#define SDIO_CMD_WAITRESP ((uint16_t)0x00C0) /*!< WAITRESP[1:0] bits (Wait for response bits) */ +#define SDIO_CMD_WAITRESP_0 ((uint16_t)0x0040) /*!< Bit 0 */ +#define SDIO_CMD_WAITRESP_1 ((uint16_t)0x0080) /*!< Bit 1 */ + +#define SDIO_CMD_WAITINT ((uint16_t)0x0100) /*!< CPSM Waits for Interrupt Request */ +#define SDIO_CMD_WAITPEND ((uint16_t)0x0200) /*!< CPSM Waits for ends of data transfer (CmdPend internal signal) */ +#define SDIO_CMD_CPSMEN ((uint16_t)0x0400) /*!< Command path state machine (CPSM) Enable bit */ +#define SDIO_CMD_SDIOSUSPEND ((uint16_t)0x0800) /*!< SD I/O suspend command */ +#define SDIO_CMD_ENCMDCOMPL ((uint16_t)0x1000) /*!< Enable CMD completion */ +#define SDIO_CMD_NIEN ((uint16_t)0x2000) /*!< Not Interrupt Enable */ +#define SDIO_CMD_CEATACMD ((uint16_t)0x4000) /*!< CE-ATA command */ + +/***************** Bit definition for SDIO_RESPCMD register *****************/ +#define SDIO_RESPCMD_RESPCMD ((uint8_t)0x3F) /*!< Response command index */ + +/****************** Bit definition for SDIO_RESP0 register ******************/ +#define SDIO_RESP0_CARDSTATUS0 ((uint32_t)0xFFFFFFFF) /*!< Card Status */ + +/****************** Bit definition for SDIO_RESP1 register ******************/ +#define SDIO_RESP1_CARDSTATUS1 ((uint32_t)0xFFFFFFFF) /*!< Card Status */ + +/****************** Bit definition for SDIO_RESP2 register ******************/ +#define SDIO_RESP2_CARDSTATUS2 ((uint32_t)0xFFFFFFFF) /*!< Card Status */ + +/****************** Bit definition for SDIO_RESP3 register ******************/ +#define SDIO_RESP3_CARDSTATUS3 ((uint32_t)0xFFFFFFFF) /*!< Card Status */ + +/****************** Bit definition for SDIO_RESP4 register ******************/ +#define SDIO_RESP4_CARDSTATUS4 ((uint32_t)0xFFFFFFFF) /*!< Card Status */ + +/****************** Bit definition for SDIO_DTIMER register *****************/ +#define SDIO_DTIMER_DATATIME ((uint32_t)0xFFFFFFFF) /*!< Data timeout period. */ + +/****************** Bit definition for SDIO_DLEN register *******************/ +#define SDIO_DLEN_DATALENGTH ((uint32_t)0x01FFFFFF) /*!< Data length value */ + +/****************** Bit definition for SDIO_DCTRL register ******************/ +#define SDIO_DCTRL_DTEN ((uint16_t)0x0001) /*!< Data transfer enabled bit */ +#define SDIO_DCTRL_DTDIR ((uint16_t)0x0002) /*!< Data transfer direction selection */ +#define SDIO_DCTRL_DTMODE ((uint16_t)0x0004) /*!< Data transfer mode selection */ +#define SDIO_DCTRL_DMAEN ((uint16_t)0x0008) /*!< DMA enabled bit */ + +#define SDIO_DCTRL_DBLOCKSIZE ((uint16_t)0x00F0) /*!< DBLOCKSIZE[3:0] bits (Data block size) */ +#define SDIO_DCTRL_DBLOCKSIZE_0 ((uint16_t)0x0010) /*!< Bit 0 */ +#define SDIO_DCTRL_DBLOCKSIZE_1 ((uint16_t)0x0020) /*!< Bit 1 */ +#define SDIO_DCTRL_DBLOCKSIZE_2 ((uint16_t)0x0040) /*!< Bit 2 */ +#define SDIO_DCTRL_DBLOCKSIZE_3 ((uint16_t)0x0080) /*!< Bit 3 */ + +#define SDIO_DCTRL_RWSTART ((uint16_t)0x0100) /*!< Read wait start */ +#define SDIO_DCTRL_RWSTOP ((uint16_t)0x0200) /*!< Read wait stop */ +#define SDIO_DCTRL_RWMOD ((uint16_t)0x0400) /*!< Read wait mode */ +#define SDIO_DCTRL_SDIOEN ((uint16_t)0x0800) /*!< SD I/O enable functions */ + +/****************** Bit definition for SDIO_DCOUNT register *****************/ +#define SDIO_DCOUNT_DATACOUNT ((uint32_t)0x01FFFFFF) /*!< Data count value */ + +/****************** Bit definition for SDIO_STA register ********************/ +#define SDIO_STA_CCRCFAIL ((uint32_t)0x00000001) /*!< Command response received (CRC check failed) */ +#define SDIO_STA_DCRCFAIL ((uint32_t)0x00000002) /*!< Data block sent/received (CRC check failed) */ +#define SDIO_STA_CTIMEOUT ((uint32_t)0x00000004) /*!< Command response timeout */ +#define SDIO_STA_DTIMEOUT ((uint32_t)0x00000008) /*!< Data timeout */ +#define SDIO_STA_TXUNDERR ((uint32_t)0x00000010) /*!< Transmit FIFO underrun error */ +#define SDIO_STA_RXOVERR ((uint32_t)0x00000020) /*!< Received FIFO overrun error */ +#define SDIO_STA_CMDREND ((uint32_t)0x00000040) /*!< Command response received (CRC check passed) */ +#define SDIO_STA_CMDSENT ((uint32_t)0x00000080) /*!< Command sent (no response required) */ +#define SDIO_STA_DATAEND ((uint32_t)0x00000100) /*!< Data end (data counter, SDIDCOUNT, is zero) */ +#define SDIO_STA_STBITERR ((uint32_t)0x00000200) /*!< Start bit not detected on all data signals in wide bus mode */ +#define SDIO_STA_DBCKEND ((uint32_t)0x00000400) /*!< Data block sent/received (CRC check passed) */ +#define SDIO_STA_CMDACT ((uint32_t)0x00000800) /*!< Command transfer in progress */ +#define SDIO_STA_TXACT ((uint32_t)0x00001000) /*!< Data transmit in progress */ +#define SDIO_STA_RXACT ((uint32_t)0x00002000) /*!< Data receive in progress */ +#define SDIO_STA_TXFIFOHE ((uint32_t)0x00004000) /*!< Transmit FIFO Half Empty: at least 8 words can be written into the FIFO */ +#define SDIO_STA_RXFIFOHF ((uint32_t)0x00008000) /*!< Receive FIFO Half Full: there are at least 8 words in the FIFO */ +#define SDIO_STA_TXFIFOF ((uint32_t)0x00010000) /*!< Transmit FIFO full */ +#define SDIO_STA_RXFIFOF ((uint32_t)0x00020000) /*!< Receive FIFO full */ +#define SDIO_STA_TXFIFOE ((uint32_t)0x00040000) /*!< Transmit FIFO empty */ +#define SDIO_STA_RXFIFOE ((uint32_t)0x00080000) /*!< Receive FIFO empty */ +#define SDIO_STA_TXDAVL ((uint32_t)0x00100000) /*!< Data available in transmit FIFO */ +#define SDIO_STA_RXDAVL ((uint32_t)0x00200000) /*!< Data available in receive FIFO */ +#define SDIO_STA_SDIOIT ((uint32_t)0x00400000) /*!< SDIO interrupt received */ +#define SDIO_STA_CEATAEND ((uint32_t)0x00800000) /*!< CE-ATA command completion signal received for CMD61 */ + +/******************* Bit definition for SDIO_ICR register *******************/ +#define SDIO_ICR_CCRCFAILC ((uint32_t)0x00000001) /*!< CCRCFAIL flag clear bit */ +#define SDIO_ICR_DCRCFAILC ((uint32_t)0x00000002) /*!< DCRCFAIL flag clear bit */ +#define SDIO_ICR_CTIMEOUTC ((uint32_t)0x00000004) /*!< CTIMEOUT flag clear bit */ +#define SDIO_ICR_DTIMEOUTC ((uint32_t)0x00000008) /*!< DTIMEOUT flag clear bit */ +#define SDIO_ICR_TXUNDERRC ((uint32_t)0x00000010) /*!< TXUNDERR flag clear bit */ +#define SDIO_ICR_RXOVERRC ((uint32_t)0x00000020) /*!< RXOVERR flag clear bit */ +#define SDIO_ICR_CMDRENDC ((uint32_t)0x00000040) /*!< CMDREND flag clear bit */ +#define SDIO_ICR_CMDSENTC ((uint32_t)0x00000080) /*!< CMDSENT flag clear bit */ +#define SDIO_ICR_DATAENDC ((uint32_t)0x00000100) /*!< DATAEND flag clear bit */ +#define SDIO_ICR_STBITERRC ((uint32_t)0x00000200) /*!< STBITERR flag clear bit */ +#define SDIO_ICR_DBCKENDC ((uint32_t)0x00000400) /*!< DBCKEND flag clear bit */ +#define SDIO_ICR_SDIOITC ((uint32_t)0x00400000) /*!< SDIOIT flag clear bit */ +#define SDIO_ICR_CEATAENDC ((uint32_t)0x00800000) /*!< CEATAEND flag clear bit */ + +/****************** Bit definition for SDIO_MASK register *******************/ +#define SDIO_MASK_CCRCFAILIE ((uint32_t)0x00000001) /*!< Command CRC Fail Interrupt Enable */ +#define SDIO_MASK_DCRCFAILIE ((uint32_t)0x00000002) /*!< Data CRC Fail Interrupt Enable */ +#define SDIO_MASK_CTIMEOUTIE ((uint32_t)0x00000004) /*!< Command TimeOut Interrupt Enable */ +#define SDIO_MASK_DTIMEOUTIE ((uint32_t)0x00000008) /*!< Data TimeOut Interrupt Enable */ +#define SDIO_MASK_TXUNDERRIE ((uint32_t)0x00000010) /*!< Tx FIFO UnderRun Error Interrupt Enable */ +#define SDIO_MASK_RXOVERRIE ((uint32_t)0x00000020) /*!< Rx FIFO OverRun Error Interrupt Enable */ +#define SDIO_MASK_CMDRENDIE ((uint32_t)0x00000040) /*!< Command Response Received Interrupt Enable */ +#define SDIO_MASK_CMDSENTIE ((uint32_t)0x00000080) /*!< Command Sent Interrupt Enable */ +#define SDIO_MASK_DATAENDIE ((uint32_t)0x00000100) /*!< Data End Interrupt Enable */ +#define SDIO_MASK_STBITERRIE ((uint32_t)0x00000200) /*!< Start Bit Error Interrupt Enable */ +#define SDIO_MASK_DBCKENDIE ((uint32_t)0x00000400) /*!< Data Block End Interrupt Enable */ +#define SDIO_MASK_CMDACTIE ((uint32_t)0x00000800) /*!< Command Acting Interrupt Enable */ +#define SDIO_MASK_TXACTIE ((uint32_t)0x00001000) /*!< Data Transmit Acting Interrupt Enable */ +#define SDIO_MASK_RXACTIE ((uint32_t)0x00002000) /*!< Data receive acting interrupt enabled */ +#define SDIO_MASK_TXFIFOHEIE ((uint32_t)0x00004000) /*!< Tx FIFO Half Empty interrupt Enable */ +#define SDIO_MASK_RXFIFOHFIE ((uint32_t)0x00008000) /*!< Rx FIFO Half Full interrupt Enable */ +#define SDIO_MASK_TXFIFOFIE ((uint32_t)0x00010000) /*!< Tx FIFO Full interrupt Enable */ +#define SDIO_MASK_RXFIFOFIE ((uint32_t)0x00020000) /*!< Rx FIFO Full interrupt Enable */ +#define SDIO_MASK_TXFIFOEIE ((uint32_t)0x00040000) /*!< Tx FIFO Empty interrupt Enable */ +#define SDIO_MASK_RXFIFOEIE ((uint32_t)0x00080000) /*!< Rx FIFO Empty interrupt Enable */ +#define SDIO_MASK_TXDAVLIE ((uint32_t)0x00100000) /*!< Data available in Tx FIFO interrupt Enable */ +#define SDIO_MASK_RXDAVLIE ((uint32_t)0x00200000) /*!< Data available in Rx FIFO interrupt Enable */ +#define SDIO_MASK_SDIOITIE ((uint32_t)0x00400000) /*!< SDIO Mode Interrupt Received interrupt Enable */ +#define SDIO_MASK_CEATAENDIE ((uint32_t)0x00800000) /*!< CE-ATA command completion signal received Interrupt Enable */ + +/***************** Bit definition for SDIO_FIFOCNT register *****************/ +#define SDIO_FIFOCNT_FIFOCOUNT ((uint32_t)0x00FFFFFF) /*!< Remaining number of words to be written to or read from the FIFO */ + +/****************** Bit definition for SDIO_FIFO register *******************/ +#define SDIO_FIFO_FIFODATA ((uint32_t)0xFFFFFFFF) /*!< Receive and transmit FIFO data */ + +/******************************************************************************/ +/* */ +/* USB Device FS */ +/* */ +/******************************************************************************/ + +/*!< Endpoint-specific registers */ +/******************* Bit definition for USB_EP0R register *******************/ +#define USB_EP0R_EA ((uint16_t)0x000F) /*!< Endpoint Address */ + +#define USB_EP0R_STAT_TX ((uint16_t)0x0030) /*!< STAT_TX[1:0] bits (Status bits, for transmission transfers) */ +#define USB_EP0R_STAT_TX_0 ((uint16_t)0x0010) /*!< Bit 0 */ +#define USB_EP0R_STAT_TX_1 ((uint16_t)0x0020) /*!< Bit 1 */ + +#define USB_EP0R_DTOG_TX ((uint16_t)0x0040) /*!< Data Toggle, for transmission transfers */ +#define USB_EP0R_CTR_TX ((uint16_t)0x0080) /*!< Correct Transfer for transmission */ +#define USB_EP0R_EP_KIND ((uint16_t)0x0100) /*!< Endpoint Kind */ + +#define USB_EP0R_EP_TYPE ((uint16_t)0x0600) /*!< EP_TYPE[1:0] bits (Endpoint type) */ +#define USB_EP0R_EP_TYPE_0 ((uint16_t)0x0200) /*!< Bit 0 */ +#define USB_EP0R_EP_TYPE_1 ((uint16_t)0x0400) /*!< Bit 1 */ + +#define USB_EP0R_SETUP ((uint16_t)0x0800) /*!< Setup transaction completed */ + +#define USB_EP0R_STAT_RX ((uint16_t)0x3000) /*!< STAT_RX[1:0] bits (Status bits, for reception transfers) */ +#define USB_EP0R_STAT_RX_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define USB_EP0R_STAT_RX_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define USB_EP0R_DTOG_RX ((uint16_t)0x4000) /*!< Data Toggle, for reception transfers */ +#define USB_EP0R_CTR_RX ((uint16_t)0x8000) /*!< Correct Transfer for reception */ + +/******************* Bit definition for USB_EP1R register *******************/ +#define USB_EP1R_EA ((uint16_t)0x000F) /*!< Endpoint Address */ + +#define USB_EP1R_STAT_TX ((uint16_t)0x0030) /*!< STAT_TX[1:0] bits (Status bits, for transmission transfers) */ +#define USB_EP1R_STAT_TX_0 ((uint16_t)0x0010) /*!< Bit 0 */ +#define USB_EP1R_STAT_TX_1 ((uint16_t)0x0020) /*!< Bit 1 */ + +#define USB_EP1R_DTOG_TX ((uint16_t)0x0040) /*!< Data Toggle, for transmission transfers */ +#define USB_EP1R_CTR_TX ((uint16_t)0x0080) /*!< Correct Transfer for transmission */ +#define USB_EP1R_EP_KIND ((uint16_t)0x0100) /*!< Endpoint Kind */ + +#define USB_EP1R_EP_TYPE ((uint16_t)0x0600) /*!< EP_TYPE[1:0] bits (Endpoint type) */ +#define USB_EP1R_EP_TYPE_0 ((uint16_t)0x0200) /*!< Bit 0 */ +#define USB_EP1R_EP_TYPE_1 ((uint16_t)0x0400) /*!< Bit 1 */ + +#define USB_EP1R_SETUP ((uint16_t)0x0800) /*!< Setup transaction completed */ + +#define USB_EP1R_STAT_RX ((uint16_t)0x3000) /*!< STAT_RX[1:0] bits (Status bits, for reception transfers) */ +#define USB_EP1R_STAT_RX_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define USB_EP1R_STAT_RX_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define USB_EP1R_DTOG_RX ((uint16_t)0x4000) /*!< Data Toggle, for reception transfers */ +#define USB_EP1R_CTR_RX ((uint16_t)0x8000) /*!< Correct Transfer for reception */ + +/******************* Bit definition for USB_EP2R register *******************/ +#define USB_EP2R_EA ((uint16_t)0x000F) /*!< Endpoint Address */ + +#define USB_EP2R_STAT_TX ((uint16_t)0x0030) /*!< STAT_TX[1:0] bits (Status bits, for transmission transfers) */ +#define USB_EP2R_STAT_TX_0 ((uint16_t)0x0010) /*!< Bit 0 */ +#define USB_EP2R_STAT_TX_1 ((uint16_t)0x0020) /*!< Bit 1 */ + +#define USB_EP2R_DTOG_TX ((uint16_t)0x0040) /*!< Data Toggle, for transmission transfers */ +#define USB_EP2R_CTR_TX ((uint16_t)0x0080) /*!< Correct Transfer for transmission */ +#define USB_EP2R_EP_KIND ((uint16_t)0x0100) /*!< Endpoint Kind */ + +#define USB_EP2R_EP_TYPE ((uint16_t)0x0600) /*!< EP_TYPE[1:0] bits (Endpoint type) */ +#define USB_EP2R_EP_TYPE_0 ((uint16_t)0x0200) /*!< Bit 0 */ +#define USB_EP2R_EP_TYPE_1 ((uint16_t)0x0400) /*!< Bit 1 */ + +#define USB_EP2R_SETUP ((uint16_t)0x0800) /*!< Setup transaction completed */ + +#define USB_EP2R_STAT_RX ((uint16_t)0x3000) /*!< STAT_RX[1:0] bits (Status bits, for reception transfers) */ +#define USB_EP2R_STAT_RX_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define USB_EP2R_STAT_RX_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define USB_EP2R_DTOG_RX ((uint16_t)0x4000) /*!< Data Toggle, for reception transfers */ +#define USB_EP2R_CTR_RX ((uint16_t)0x8000) /*!< Correct Transfer for reception */ + +/******************* Bit definition for USB_EP3R register *******************/ +#define USB_EP3R_EA ((uint16_t)0x000F) /*!< Endpoint Address */ + +#define USB_EP3R_STAT_TX ((uint16_t)0x0030) /*!< STAT_TX[1:0] bits (Status bits, for transmission transfers) */ +#define USB_EP3R_STAT_TX_0 ((uint16_t)0x0010) /*!< Bit 0 */ +#define USB_EP3R_STAT_TX_1 ((uint16_t)0x0020) /*!< Bit 1 */ + +#define USB_EP3R_DTOG_TX ((uint16_t)0x0040) /*!< Data Toggle, for transmission transfers */ +#define USB_EP3R_CTR_TX ((uint16_t)0x0080) /*!< Correct Transfer for transmission */ +#define USB_EP3R_EP_KIND ((uint16_t)0x0100) /*!< Endpoint Kind */ + +#define USB_EP3R_EP_TYPE ((uint16_t)0x0600) /*!< EP_TYPE[1:0] bits (Endpoint type) */ +#define USB_EP3R_EP_TYPE_0 ((uint16_t)0x0200) /*!< Bit 0 */ +#define USB_EP3R_EP_TYPE_1 ((uint16_t)0x0400) /*!< Bit 1 */ + +#define USB_EP3R_SETUP ((uint16_t)0x0800) /*!< Setup transaction completed */ + +#define USB_EP3R_STAT_RX ((uint16_t)0x3000) /*!< STAT_RX[1:0] bits (Status bits, for reception transfers) */ +#define USB_EP3R_STAT_RX_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define USB_EP3R_STAT_RX_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define USB_EP3R_DTOG_RX ((uint16_t)0x4000) /*!< Data Toggle, for reception transfers */ +#define USB_EP3R_CTR_RX ((uint16_t)0x8000) /*!< Correct Transfer for reception */ + +/******************* Bit definition for USB_EP4R register *******************/ +#define USB_EP4R_EA ((uint16_t)0x000F) /*!< Endpoint Address */ + +#define USB_EP4R_STAT_TX ((uint16_t)0x0030) /*!< STAT_TX[1:0] bits (Status bits, for transmission transfers) */ +#define USB_EP4R_STAT_TX_0 ((uint16_t)0x0010) /*!< Bit 0 */ +#define USB_EP4R_STAT_TX_1 ((uint16_t)0x0020) /*!< Bit 1 */ + +#define USB_EP4R_DTOG_TX ((uint16_t)0x0040) /*!< Data Toggle, for transmission transfers */ +#define USB_EP4R_CTR_TX ((uint16_t)0x0080) /*!< Correct Transfer for transmission */ +#define USB_EP4R_EP_KIND ((uint16_t)0x0100) /*!< Endpoint Kind */ + +#define USB_EP4R_EP_TYPE ((uint16_t)0x0600) /*!< EP_TYPE[1:0] bits (Endpoint type) */ +#define USB_EP4R_EP_TYPE_0 ((uint16_t)0x0200) /*!< Bit 0 */ +#define USB_EP4R_EP_TYPE_1 ((uint16_t)0x0400) /*!< Bit 1 */ + +#define USB_EP4R_SETUP ((uint16_t)0x0800) /*!< Setup transaction completed */ + +#define USB_EP4R_STAT_RX ((uint16_t)0x3000) /*!< STAT_RX[1:0] bits (Status bits, for reception transfers) */ +#define USB_EP4R_STAT_RX_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define USB_EP4R_STAT_RX_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define USB_EP4R_DTOG_RX ((uint16_t)0x4000) /*!< Data Toggle, for reception transfers */ +#define USB_EP4R_CTR_RX ((uint16_t)0x8000) /*!< Correct Transfer for reception */ + +/******************* Bit definition for USB_EP5R register *******************/ +#define USB_EP5R_EA ((uint16_t)0x000F) /*!< Endpoint Address */ + +#define USB_EP5R_STAT_TX ((uint16_t)0x0030) /*!< STAT_TX[1:0] bits (Status bits, for transmission transfers) */ +#define USB_EP5R_STAT_TX_0 ((uint16_t)0x0010) /*!< Bit 0 */ +#define USB_EP5R_STAT_TX_1 ((uint16_t)0x0020) /*!< Bit 1 */ + +#define USB_EP5R_DTOG_TX ((uint16_t)0x0040) /*!< Data Toggle, for transmission transfers */ +#define USB_EP5R_CTR_TX ((uint16_t)0x0080) /*!< Correct Transfer for transmission */ +#define USB_EP5R_EP_KIND ((uint16_t)0x0100) /*!< Endpoint Kind */ + +#define USB_EP5R_EP_TYPE ((uint16_t)0x0600) /*!< EP_TYPE[1:0] bits (Endpoint type) */ +#define USB_EP5R_EP_TYPE_0 ((uint16_t)0x0200) /*!< Bit 0 */ +#define USB_EP5R_EP_TYPE_1 ((uint16_t)0x0400) /*!< Bit 1 */ + +#define USB_EP5R_SETUP ((uint16_t)0x0800) /*!< Setup transaction completed */ + +#define USB_EP5R_STAT_RX ((uint16_t)0x3000) /*!< STAT_RX[1:0] bits (Status bits, for reception transfers) */ +#define USB_EP5R_STAT_RX_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define USB_EP5R_STAT_RX_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define USB_EP5R_DTOG_RX ((uint16_t)0x4000) /*!< Data Toggle, for reception transfers */ +#define USB_EP5R_CTR_RX ((uint16_t)0x8000) /*!< Correct Transfer for reception */ + +/******************* Bit definition for USB_EP6R register *******************/ +#define USB_EP6R_EA ((uint16_t)0x000F) /*!< Endpoint Address */ + +#define USB_EP6R_STAT_TX ((uint16_t)0x0030) /*!< STAT_TX[1:0] bits (Status bits, for transmission transfers) */ +#define USB_EP6R_STAT_TX_0 ((uint16_t)0x0010) /*!< Bit 0 */ +#define USB_EP6R_STAT_TX_1 ((uint16_t)0x0020) /*!< Bit 1 */ + +#define USB_EP6R_DTOG_TX ((uint16_t)0x0040) /*!< Data Toggle, for transmission transfers */ +#define USB_EP6R_CTR_TX ((uint16_t)0x0080) /*!< Correct Transfer for transmission */ +#define USB_EP6R_EP_KIND ((uint16_t)0x0100) /*!< Endpoint Kind */ + +#define USB_EP6R_EP_TYPE ((uint16_t)0x0600) /*!< EP_TYPE[1:0] bits (Endpoint type) */ +#define USB_EP6R_EP_TYPE_0 ((uint16_t)0x0200) /*!< Bit 0 */ +#define USB_EP6R_EP_TYPE_1 ((uint16_t)0x0400) /*!< Bit 1 */ + +#define USB_EP6R_SETUP ((uint16_t)0x0800) /*!< Setup transaction completed */ + +#define USB_EP6R_STAT_RX ((uint16_t)0x3000) /*!< STAT_RX[1:0] bits (Status bits, for reception transfers) */ +#define USB_EP6R_STAT_RX_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define USB_EP6R_STAT_RX_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define USB_EP6R_DTOG_RX ((uint16_t)0x4000) /*!< Data Toggle, for reception transfers */ +#define USB_EP6R_CTR_RX ((uint16_t)0x8000) /*!< Correct Transfer for reception */ + +/******************* Bit definition for USB_EP7R register *******************/ +#define USB_EP7R_EA ((uint16_t)0x000F) /*!< Endpoint Address */ + +#define USB_EP7R_STAT_TX ((uint16_t)0x0030) /*!< STAT_TX[1:0] bits (Status bits, for transmission transfers) */ +#define USB_EP7R_STAT_TX_0 ((uint16_t)0x0010) /*!< Bit 0 */ +#define USB_EP7R_STAT_TX_1 ((uint16_t)0x0020) /*!< Bit 1 */ + +#define USB_EP7R_DTOG_TX ((uint16_t)0x0040) /*!< Data Toggle, for transmission transfers */ +#define USB_EP7R_CTR_TX ((uint16_t)0x0080) /*!< Correct Transfer for transmission */ +#define USB_EP7R_EP_KIND ((uint16_t)0x0100) /*!< Endpoint Kind */ + +#define USB_EP7R_EP_TYPE ((uint16_t)0x0600) /*!< EP_TYPE[1:0] bits (Endpoint type) */ +#define USB_EP7R_EP_TYPE_0 ((uint16_t)0x0200) /*!< Bit 0 */ +#define USB_EP7R_EP_TYPE_1 ((uint16_t)0x0400) /*!< Bit 1 */ + +#define USB_EP7R_SETUP ((uint16_t)0x0800) /*!< Setup transaction completed */ + +#define USB_EP7R_STAT_RX ((uint16_t)0x3000) /*!< STAT_RX[1:0] bits (Status bits, for reception transfers) */ +#define USB_EP7R_STAT_RX_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define USB_EP7R_STAT_RX_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define USB_EP7R_DTOG_RX ((uint16_t)0x4000) /*!< Data Toggle, for reception transfers */ +#define USB_EP7R_CTR_RX ((uint16_t)0x8000) /*!< Correct Transfer for reception */ + +/*!< Common registers */ +/******************* Bit definition for USB_CNTR register *******************/ +#define USB_CNTR_FRES ((uint16_t)0x0001) /*!< Force USB Reset */ +#define USB_CNTR_PDWN ((uint16_t)0x0002) /*!< Power down */ +#define USB_CNTR_LP_MODE ((uint16_t)0x0004) /*!< Low-power mode */ +#define USB_CNTR_FSUSP ((uint16_t)0x0008) /*!< Force suspend */ +#define USB_CNTR_RESUME ((uint16_t)0x0010) /*!< Resume request */ +#define USB_CNTR_ESOFM ((uint16_t)0x0100) /*!< Expected Start Of Frame Interrupt Mask */ +#define USB_CNTR_SOFM ((uint16_t)0x0200) /*!< Start Of Frame Interrupt Mask */ +#define USB_CNTR_RESETM ((uint16_t)0x0400) /*!< RESET Interrupt Mask */ +#define USB_CNTR_SUSPM ((uint16_t)0x0800) /*!< Suspend mode Interrupt Mask */ +#define USB_CNTR_WKUPM ((uint16_t)0x1000) /*!< Wakeup Interrupt Mask */ +#define USB_CNTR_ERRM ((uint16_t)0x2000) /*!< Error Interrupt Mask */ +#define USB_CNTR_PMAOVRM ((uint16_t)0x4000) /*!< Packet Memory Area Over / Underrun Interrupt Mask */ +#define USB_CNTR_CTRM ((uint16_t)0x8000) /*!< Correct Transfer Interrupt Mask */ + +/******************* Bit definition for USB_ISTR register *******************/ +#define USB_ISTR_EP_ID ((uint16_t)0x000F) /*!< Endpoint Identifier */ +#define USB_ISTR_DIR ((uint16_t)0x0010) /*!< Direction of transaction */ +#define USB_ISTR_ESOF ((uint16_t)0x0100) /*!< Expected Start Of Frame */ +#define USB_ISTR_SOF ((uint16_t)0x0200) /*!< Start Of Frame */ +#define USB_ISTR_RESET ((uint16_t)0x0400) /*!< USB RESET request */ +#define USB_ISTR_SUSP ((uint16_t)0x0800) /*!< Suspend mode request */ +#define USB_ISTR_WKUP ((uint16_t)0x1000) /*!< Wake up */ +#define USB_ISTR_ERR ((uint16_t)0x2000) /*!< Error */ +#define USB_ISTR_PMAOVR ((uint16_t)0x4000) /*!< Packet Memory Area Over / Underrun */ +#define USB_ISTR_CTR ((uint16_t)0x8000) /*!< Correct Transfer */ + +/******************* Bit definition for USB_FNR register ********************/ +#define USB_FNR_FN ((uint16_t)0x07FF) /*!< Frame Number */ +#define USB_FNR_LSOF ((uint16_t)0x1800) /*!< Lost SOF */ +#define USB_FNR_LCK ((uint16_t)0x2000) /*!< Locked */ +#define USB_FNR_RXDM ((uint16_t)0x4000) /*!< Receive Data - Line Status */ +#define USB_FNR_RXDP ((uint16_t)0x8000) /*!< Receive Data + Line Status */ + +/****************** Bit definition for USB_DADDR register *******************/ +#define USB_DADDR_ADD ((uint8_t)0x7F) /*!< ADD[6:0] bits (Device Address) */ +#define USB_DADDR_ADD0 ((uint8_t)0x01) /*!< Bit 0 */ +#define USB_DADDR_ADD1 ((uint8_t)0x02) /*!< Bit 1 */ +#define USB_DADDR_ADD2 ((uint8_t)0x04) /*!< Bit 2 */ +#define USB_DADDR_ADD3 ((uint8_t)0x08) /*!< Bit 3 */ +#define USB_DADDR_ADD4 ((uint8_t)0x10) /*!< Bit 4 */ +#define USB_DADDR_ADD5 ((uint8_t)0x20) /*!< Bit 5 */ +#define USB_DADDR_ADD6 ((uint8_t)0x40) /*!< Bit 6 */ + +#define USB_DADDR_EF ((uint8_t)0x80) /*!< Enable Function */ + +/****************** Bit definition for USB_BTABLE register ******************/ +#define USB_BTABLE_BTABLE ((uint16_t)0xFFF8) /*!< Buffer Table */ + +/*!< Buffer descriptor table */ +/***************** Bit definition for USB_ADDR0_TX register *****************/ +#define USB_ADDR0_TX_ADDR0_TX ((uint16_t)0xFFFE) /*!< Transmission Buffer Address 0 */ + +/***************** Bit definition for USB_ADDR1_TX register *****************/ +#define USB_ADDR1_TX_ADDR1_TX ((uint16_t)0xFFFE) /*!< Transmission Buffer Address 1 */ + +/***************** Bit definition for USB_ADDR2_TX register *****************/ +#define USB_ADDR2_TX_ADDR2_TX ((uint16_t)0xFFFE) /*!< Transmission Buffer Address 2 */ + +/***************** Bit definition for USB_ADDR3_TX register *****************/ +#define USB_ADDR3_TX_ADDR3_TX ((uint16_t)0xFFFE) /*!< Transmission Buffer Address 3 */ + +/***************** Bit definition for USB_ADDR4_TX register *****************/ +#define USB_ADDR4_TX_ADDR4_TX ((uint16_t)0xFFFE) /*!< Transmission Buffer Address 4 */ + +/***************** Bit definition for USB_ADDR5_TX register *****************/ +#define USB_ADDR5_TX_ADDR5_TX ((uint16_t)0xFFFE) /*!< Transmission Buffer Address 5 */ + +/***************** Bit definition for USB_ADDR6_TX register *****************/ +#define USB_ADDR6_TX_ADDR6_TX ((uint16_t)0xFFFE) /*!< Transmission Buffer Address 6 */ + +/***************** Bit definition for USB_ADDR7_TX register *****************/ +#define USB_ADDR7_TX_ADDR7_TX ((uint16_t)0xFFFE) /*!< Transmission Buffer Address 7 */ + +/*----------------------------------------------------------------------------*/ + +/***************** Bit definition for USB_COUNT0_TX register ****************/ +#define USB_COUNT0_TX_COUNT0_TX ((uint16_t)0x03FF) /*!< Transmission Byte Count 0 */ + +/***************** Bit definition for USB_COUNT1_TX register ****************/ +#define USB_COUNT1_TX_COUNT1_TX ((uint16_t)0x03FF) /*!< Transmission Byte Count 1 */ + +/***************** Bit definition for USB_COUNT2_TX register ****************/ +#define USB_COUNT2_TX_COUNT2_TX ((uint16_t)0x03FF) /*!< Transmission Byte Count 2 */ + +/***************** Bit definition for USB_COUNT3_TX register ****************/ +#define USB_COUNT3_TX_COUNT3_TX ((uint16_t)0x03FF) /*!< Transmission Byte Count 3 */ + +/***************** Bit definition for USB_COUNT4_TX register ****************/ +#define USB_COUNT4_TX_COUNT4_TX ((uint16_t)0x03FF) /*!< Transmission Byte Count 4 */ + +/***************** Bit definition for USB_COUNT5_TX register ****************/ +#define USB_COUNT5_TX_COUNT5_TX ((uint16_t)0x03FF) /*!< Transmission Byte Count 5 */ + +/***************** Bit definition for USB_COUNT6_TX register ****************/ +#define USB_COUNT6_TX_COUNT6_TX ((uint16_t)0x03FF) /*!< Transmission Byte Count 6 */ + +/***************** Bit definition for USB_COUNT7_TX register ****************/ +#define USB_COUNT7_TX_COUNT7_TX ((uint16_t)0x03FF) /*!< Transmission Byte Count 7 */ + +/*----------------------------------------------------------------------------*/ + +/**************** Bit definition for USB_COUNT0_TX_0 register ***************/ +#define USB_COUNT0_TX_0_COUNT0_TX_0 ((uint32_t)0x000003FF) /*!< Transmission Byte Count 0 (low) */ + +/**************** Bit definition for USB_COUNT0_TX_1 register ***************/ +#define USB_COUNT0_TX_1_COUNT0_TX_1 ((uint32_t)0x03FF0000) /*!< Transmission Byte Count 0 (high) */ + +/**************** Bit definition for USB_COUNT1_TX_0 register ***************/ +#define USB_COUNT1_TX_0_COUNT1_TX_0 ((uint32_t)0x000003FF) /*!< Transmission Byte Count 1 (low) */ + +/**************** Bit definition for USB_COUNT1_TX_1 register ***************/ +#define USB_COUNT1_TX_1_COUNT1_TX_1 ((uint32_t)0x03FF0000) /*!< Transmission Byte Count 1 (high) */ + +/**************** Bit definition for USB_COUNT2_TX_0 register ***************/ +#define USB_COUNT2_TX_0_COUNT2_TX_0 ((uint32_t)0x000003FF) /*!< Transmission Byte Count 2 (low) */ + +/**************** Bit definition for USB_COUNT2_TX_1 register ***************/ +#define USB_COUNT2_TX_1_COUNT2_TX_1 ((uint32_t)0x03FF0000) /*!< Transmission Byte Count 2 (high) */ + +/**************** Bit definition for USB_COUNT3_TX_0 register ***************/ +#define USB_COUNT3_TX_0_COUNT3_TX_0 ((uint16_t)0x000003FF) /*!< Transmission Byte Count 3 (low) */ + +/**************** Bit definition for USB_COUNT3_TX_1 register ***************/ +#define USB_COUNT3_TX_1_COUNT3_TX_1 ((uint16_t)0x03FF0000) /*!< Transmission Byte Count 3 (high) */ + +/**************** Bit definition for USB_COUNT4_TX_0 register ***************/ +#define USB_COUNT4_TX_0_COUNT4_TX_0 ((uint32_t)0x000003FF) /*!< Transmission Byte Count 4 (low) */ + +/**************** Bit definition for USB_COUNT4_TX_1 register ***************/ +#define USB_COUNT4_TX_1_COUNT4_TX_1 ((uint32_t)0x03FF0000) /*!< Transmission Byte Count 4 (high) */ + +/**************** Bit definition for USB_COUNT5_TX_0 register ***************/ +#define USB_COUNT5_TX_0_COUNT5_TX_0 ((uint32_t)0x000003FF) /*!< Transmission Byte Count 5 (low) */ + +/**************** Bit definition for USB_COUNT5_TX_1 register ***************/ +#define USB_COUNT5_TX_1_COUNT5_TX_1 ((uint32_t)0x03FF0000) /*!< Transmission Byte Count 5 (high) */ + +/**************** Bit definition for USB_COUNT6_TX_0 register ***************/ +#define USB_COUNT6_TX_0_COUNT6_TX_0 ((uint32_t)0x000003FF) /*!< Transmission Byte Count 6 (low) */ + +/**************** Bit definition for USB_COUNT6_TX_1 register ***************/ +#define USB_COUNT6_TX_1_COUNT6_TX_1 ((uint32_t)0x03FF0000) /*!< Transmission Byte Count 6 (high) */ + +/**************** Bit definition for USB_COUNT7_TX_0 register ***************/ +#define USB_COUNT7_TX_0_COUNT7_TX_0 ((uint32_t)0x000003FF) /*!< Transmission Byte Count 7 (low) */ + +/**************** Bit definition for USB_COUNT7_TX_1 register ***************/ +#define USB_COUNT7_TX_1_COUNT7_TX_1 ((uint32_t)0x03FF0000) /*!< Transmission Byte Count 7 (high) */ + +/*----------------------------------------------------------------------------*/ + +/***************** Bit definition for USB_ADDR0_RX register *****************/ +#define USB_ADDR0_RX_ADDR0_RX ((uint16_t)0xFFFE) /*!< Reception Buffer Address 0 */ + +/***************** Bit definition for USB_ADDR1_RX register *****************/ +#define USB_ADDR1_RX_ADDR1_RX ((uint16_t)0xFFFE) /*!< Reception Buffer Address 1 */ + +/***************** Bit definition for USB_ADDR2_RX register *****************/ +#define USB_ADDR2_RX_ADDR2_RX ((uint16_t)0xFFFE) /*!< Reception Buffer Address 2 */ + +/***************** Bit definition for USB_ADDR3_RX register *****************/ +#define USB_ADDR3_RX_ADDR3_RX ((uint16_t)0xFFFE) /*!< Reception Buffer Address 3 */ + +/***************** Bit definition for USB_ADDR4_RX register *****************/ +#define USB_ADDR4_RX_ADDR4_RX ((uint16_t)0xFFFE) /*!< Reception Buffer Address 4 */ + +/***************** Bit definition for USB_ADDR5_RX register *****************/ +#define USB_ADDR5_RX_ADDR5_RX ((uint16_t)0xFFFE) /*!< Reception Buffer Address 5 */ + +/***************** Bit definition for USB_ADDR6_RX register *****************/ +#define USB_ADDR6_RX_ADDR6_RX ((uint16_t)0xFFFE) /*!< Reception Buffer Address 6 */ + +/***************** Bit definition for USB_ADDR7_RX register *****************/ +#define USB_ADDR7_RX_ADDR7_RX ((uint16_t)0xFFFE) /*!< Reception Buffer Address 7 */ + +/*----------------------------------------------------------------------------*/ + +/***************** Bit definition for USB_COUNT0_RX register ****************/ +#define USB_COUNT0_RX_COUNT0_RX ((uint16_t)0x03FF) /*!< Reception Byte Count */ + +#define USB_COUNT0_RX_NUM_BLOCK ((uint16_t)0x7C00) /*!< NUM_BLOCK[4:0] bits (Number of blocks) */ +#define USB_COUNT0_RX_NUM_BLOCK_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define USB_COUNT0_RX_NUM_BLOCK_1 ((uint16_t)0x0800) /*!< Bit 1 */ +#define USB_COUNT0_RX_NUM_BLOCK_2 ((uint16_t)0x1000) /*!< Bit 2 */ +#define USB_COUNT0_RX_NUM_BLOCK_3 ((uint16_t)0x2000) /*!< Bit 3 */ +#define USB_COUNT0_RX_NUM_BLOCK_4 ((uint16_t)0x4000) /*!< Bit 4 */ + +#define USB_COUNT0_RX_BLSIZE ((uint16_t)0x8000) /*!< BLock SIZE */ + +/***************** Bit definition for USB_COUNT1_RX register ****************/ +#define USB_COUNT1_RX_COUNT1_RX ((uint16_t)0x03FF) /*!< Reception Byte Count */ + +#define USB_COUNT1_RX_NUM_BLOCK ((uint16_t)0x7C00) /*!< NUM_BLOCK[4:0] bits (Number of blocks) */ +#define USB_COUNT1_RX_NUM_BLOCK_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define USB_COUNT1_RX_NUM_BLOCK_1 ((uint16_t)0x0800) /*!< Bit 1 */ +#define USB_COUNT1_RX_NUM_BLOCK_2 ((uint16_t)0x1000) /*!< Bit 2 */ +#define USB_COUNT1_RX_NUM_BLOCK_3 ((uint16_t)0x2000) /*!< Bit 3 */ +#define USB_COUNT1_RX_NUM_BLOCK_4 ((uint16_t)0x4000) /*!< Bit 4 */ + +#define USB_COUNT1_RX_BLSIZE ((uint16_t)0x8000) /*!< BLock SIZE */ + +/***************** Bit definition for USB_COUNT2_RX register ****************/ +#define USB_COUNT2_RX_COUNT2_RX ((uint16_t)0x03FF) /*!< Reception Byte Count */ + +#define USB_COUNT2_RX_NUM_BLOCK ((uint16_t)0x7C00) /*!< NUM_BLOCK[4:0] bits (Number of blocks) */ +#define USB_COUNT2_RX_NUM_BLOCK_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define USB_COUNT2_RX_NUM_BLOCK_1 ((uint16_t)0x0800) /*!< Bit 1 */ +#define USB_COUNT2_RX_NUM_BLOCK_2 ((uint16_t)0x1000) /*!< Bit 2 */ +#define USB_COUNT2_RX_NUM_BLOCK_3 ((uint16_t)0x2000) /*!< Bit 3 */ +#define USB_COUNT2_RX_NUM_BLOCK_4 ((uint16_t)0x4000) /*!< Bit 4 */ + +#define USB_COUNT2_RX_BLSIZE ((uint16_t)0x8000) /*!< BLock SIZE */ + +/***************** Bit definition for USB_COUNT3_RX register ****************/ +#define USB_COUNT3_RX_COUNT3_RX ((uint16_t)0x03FF) /*!< Reception Byte Count */ + +#define USB_COUNT3_RX_NUM_BLOCK ((uint16_t)0x7C00) /*!< NUM_BLOCK[4:0] bits (Number of blocks) */ +#define USB_COUNT3_RX_NUM_BLOCK_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define USB_COUNT3_RX_NUM_BLOCK_1 ((uint16_t)0x0800) /*!< Bit 1 */ +#define USB_COUNT3_RX_NUM_BLOCK_2 ((uint16_t)0x1000) /*!< Bit 2 */ +#define USB_COUNT3_RX_NUM_BLOCK_3 ((uint16_t)0x2000) /*!< Bit 3 */ +#define USB_COUNT3_RX_NUM_BLOCK_4 ((uint16_t)0x4000) /*!< Bit 4 */ + +#define USB_COUNT3_RX_BLSIZE ((uint16_t)0x8000) /*!< BLock SIZE */ + +/***************** Bit definition for USB_COUNT4_RX register ****************/ +#define USB_COUNT4_RX_COUNT4_RX ((uint16_t)0x03FF) /*!< Reception Byte Count */ + +#define USB_COUNT4_RX_NUM_BLOCK ((uint16_t)0x7C00) /*!< NUM_BLOCK[4:0] bits (Number of blocks) */ +#define USB_COUNT4_RX_NUM_BLOCK_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define USB_COUNT4_RX_NUM_BLOCK_1 ((uint16_t)0x0800) /*!< Bit 1 */ +#define USB_COUNT4_RX_NUM_BLOCK_2 ((uint16_t)0x1000) /*!< Bit 2 */ +#define USB_COUNT4_RX_NUM_BLOCK_3 ((uint16_t)0x2000) /*!< Bit 3 */ +#define USB_COUNT4_RX_NUM_BLOCK_4 ((uint16_t)0x4000) /*!< Bit 4 */ + +#define USB_COUNT4_RX_BLSIZE ((uint16_t)0x8000) /*!< BLock SIZE */ + +/***************** Bit definition for USB_COUNT5_RX register ****************/ +#define USB_COUNT5_RX_COUNT5_RX ((uint16_t)0x03FF) /*!< Reception Byte Count */ + +#define USB_COUNT5_RX_NUM_BLOCK ((uint16_t)0x7C00) /*!< NUM_BLOCK[4:0] bits (Number of blocks) */ +#define USB_COUNT5_RX_NUM_BLOCK_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define USB_COUNT5_RX_NUM_BLOCK_1 ((uint16_t)0x0800) /*!< Bit 1 */ +#define USB_COUNT5_RX_NUM_BLOCK_2 ((uint16_t)0x1000) /*!< Bit 2 */ +#define USB_COUNT5_RX_NUM_BLOCK_3 ((uint16_t)0x2000) /*!< Bit 3 */ +#define USB_COUNT5_RX_NUM_BLOCK_4 ((uint16_t)0x4000) /*!< Bit 4 */ + +#define USB_COUNT5_RX_BLSIZE ((uint16_t)0x8000) /*!< BLock SIZE */ + +/***************** Bit definition for USB_COUNT6_RX register ****************/ +#define USB_COUNT6_RX_COUNT6_RX ((uint16_t)0x03FF) /*!< Reception Byte Count */ + +#define USB_COUNT6_RX_NUM_BLOCK ((uint16_t)0x7C00) /*!< NUM_BLOCK[4:0] bits (Number of blocks) */ +#define USB_COUNT6_RX_NUM_BLOCK_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define USB_COUNT6_RX_NUM_BLOCK_1 ((uint16_t)0x0800) /*!< Bit 1 */ +#define USB_COUNT6_RX_NUM_BLOCK_2 ((uint16_t)0x1000) /*!< Bit 2 */ +#define USB_COUNT6_RX_NUM_BLOCK_3 ((uint16_t)0x2000) /*!< Bit 3 */ +#define USB_COUNT6_RX_NUM_BLOCK_4 ((uint16_t)0x4000) /*!< Bit 4 */ + +#define USB_COUNT6_RX_BLSIZE ((uint16_t)0x8000) /*!< BLock SIZE */ + +/***************** Bit definition for USB_COUNT7_RX register ****************/ +#define USB_COUNT7_RX_COUNT7_RX ((uint16_t)0x03FF) /*!< Reception Byte Count */ + +#define USB_COUNT7_RX_NUM_BLOCK ((uint16_t)0x7C00) /*!< NUM_BLOCK[4:0] bits (Number of blocks) */ +#define USB_COUNT7_RX_NUM_BLOCK_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define USB_COUNT7_RX_NUM_BLOCK_1 ((uint16_t)0x0800) /*!< Bit 1 */ +#define USB_COUNT7_RX_NUM_BLOCK_2 ((uint16_t)0x1000) /*!< Bit 2 */ +#define USB_COUNT7_RX_NUM_BLOCK_3 ((uint16_t)0x2000) /*!< Bit 3 */ +#define USB_COUNT7_RX_NUM_BLOCK_4 ((uint16_t)0x4000) /*!< Bit 4 */ + +#define USB_COUNT7_RX_BLSIZE ((uint16_t)0x8000) /*!< BLock SIZE */ + +/*----------------------------------------------------------------------------*/ + +/**************** Bit definition for USB_COUNT0_RX_0 register ***************/ +#define USB_COUNT0_RX_0_COUNT0_RX_0 ((uint32_t)0x000003FF) /*!< Reception Byte Count (low) */ + +#define USB_COUNT0_RX_0_NUM_BLOCK_0 ((uint32_t)0x00007C00) /*!< NUM_BLOCK_0[4:0] bits (Number of blocks) (low) */ +#define USB_COUNT0_RX_0_NUM_BLOCK_0_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define USB_COUNT0_RX_0_NUM_BLOCK_0_1 ((uint32_t)0x00000800) /*!< Bit 1 */ +#define USB_COUNT0_RX_0_NUM_BLOCK_0_2 ((uint32_t)0x00001000) /*!< Bit 2 */ +#define USB_COUNT0_RX_0_NUM_BLOCK_0_3 ((uint32_t)0x00002000) /*!< Bit 3 */ +#define USB_COUNT0_RX_0_NUM_BLOCK_0_4 ((uint32_t)0x00004000) /*!< Bit 4 */ + +#define USB_COUNT0_RX_0_BLSIZE_0 ((uint32_t)0x00008000) /*!< BLock SIZE (low) */ + +/**************** Bit definition for USB_COUNT0_RX_1 register ***************/ +#define USB_COUNT0_RX_1_COUNT0_RX_1 ((uint32_t)0x03FF0000) /*!< Reception Byte Count (high) */ + +#define USB_COUNT0_RX_1_NUM_BLOCK_1 ((uint32_t)0x7C000000) /*!< NUM_BLOCK_1[4:0] bits (Number of blocks) (high) */ +#define USB_COUNT0_RX_1_NUM_BLOCK_1_0 ((uint32_t)0x04000000) /*!< Bit 1 */ +#define USB_COUNT0_RX_1_NUM_BLOCK_1_1 ((uint32_t)0x08000000) /*!< Bit 1 */ +#define USB_COUNT0_RX_1_NUM_BLOCK_1_2 ((uint32_t)0x10000000) /*!< Bit 2 */ +#define USB_COUNT0_RX_1_NUM_BLOCK_1_3 ((uint32_t)0x20000000) /*!< Bit 3 */ +#define USB_COUNT0_RX_1_NUM_BLOCK_1_4 ((uint32_t)0x40000000) /*!< Bit 4 */ + +#define USB_COUNT0_RX_1_BLSIZE_1 ((uint32_t)0x80000000) /*!< BLock SIZE (high) */ + +/**************** Bit definition for USB_COUNT1_RX_0 register ***************/ +#define USB_COUNT1_RX_0_COUNT1_RX_0 ((uint32_t)0x000003FF) /*!< Reception Byte Count (low) */ + +#define USB_COUNT1_RX_0_NUM_BLOCK_0 ((uint32_t)0x00007C00) /*!< NUM_BLOCK_0[4:0] bits (Number of blocks) (low) */ +#define USB_COUNT1_RX_0_NUM_BLOCK_0_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define USB_COUNT1_RX_0_NUM_BLOCK_0_1 ((uint32_t)0x00000800) /*!< Bit 1 */ +#define USB_COUNT1_RX_0_NUM_BLOCK_0_2 ((uint32_t)0x00001000) /*!< Bit 2 */ +#define USB_COUNT1_RX_0_NUM_BLOCK_0_3 ((uint32_t)0x00002000) /*!< Bit 3 */ +#define USB_COUNT1_RX_0_NUM_BLOCK_0_4 ((uint32_t)0x00004000) /*!< Bit 4 */ + +#define USB_COUNT1_RX_0_BLSIZE_0 ((uint32_t)0x00008000) /*!< BLock SIZE (low) */ + +/**************** Bit definition for USB_COUNT1_RX_1 register ***************/ +#define USB_COUNT1_RX_1_COUNT1_RX_1 ((uint32_t)0x03FF0000) /*!< Reception Byte Count (high) */ + +#define USB_COUNT1_RX_1_NUM_BLOCK_1 ((uint32_t)0x7C000000) /*!< NUM_BLOCK_1[4:0] bits (Number of blocks) (high) */ +#define USB_COUNT1_RX_1_NUM_BLOCK_1_0 ((uint32_t)0x04000000) /*!< Bit 0 */ +#define USB_COUNT1_RX_1_NUM_BLOCK_1_1 ((uint32_t)0x08000000) /*!< Bit 1 */ +#define USB_COUNT1_RX_1_NUM_BLOCK_1_2 ((uint32_t)0x10000000) /*!< Bit 2 */ +#define USB_COUNT1_RX_1_NUM_BLOCK_1_3 ((uint32_t)0x20000000) /*!< Bit 3 */ +#define USB_COUNT1_RX_1_NUM_BLOCK_1_4 ((uint32_t)0x40000000) /*!< Bit 4 */ + +#define USB_COUNT1_RX_1_BLSIZE_1 ((uint32_t)0x80000000) /*!< BLock SIZE (high) */ + +/**************** Bit definition for USB_COUNT2_RX_0 register ***************/ +#define USB_COUNT2_RX_0_COUNT2_RX_0 ((uint32_t)0x000003FF) /*!< Reception Byte Count (low) */ + +#define USB_COUNT2_RX_0_NUM_BLOCK_0 ((uint32_t)0x00007C00) /*!< NUM_BLOCK_0[4:0] bits (Number of blocks) (low) */ +#define USB_COUNT2_RX_0_NUM_BLOCK_0_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define USB_COUNT2_RX_0_NUM_BLOCK_0_1 ((uint32_t)0x00000800) /*!< Bit 1 */ +#define USB_COUNT2_RX_0_NUM_BLOCK_0_2 ((uint32_t)0x00001000) /*!< Bit 2 */ +#define USB_COUNT2_RX_0_NUM_BLOCK_0_3 ((uint32_t)0x00002000) /*!< Bit 3 */ +#define USB_COUNT2_RX_0_NUM_BLOCK_0_4 ((uint32_t)0x00004000) /*!< Bit 4 */ + +#define USB_COUNT2_RX_0_BLSIZE_0 ((uint32_t)0x00008000) /*!< BLock SIZE (low) */ + +/**************** Bit definition for USB_COUNT2_RX_1 register ***************/ +#define USB_COUNT2_RX_1_COUNT2_RX_1 ((uint32_t)0x03FF0000) /*!< Reception Byte Count (high) */ + +#define USB_COUNT2_RX_1_NUM_BLOCK_1 ((uint32_t)0x7C000000) /*!< NUM_BLOCK_1[4:0] bits (Number of blocks) (high) */ +#define USB_COUNT2_RX_1_NUM_BLOCK_1_0 ((uint32_t)0x04000000) /*!< Bit 0 */ +#define USB_COUNT2_RX_1_NUM_BLOCK_1_1 ((uint32_t)0x08000000) /*!< Bit 1 */ +#define USB_COUNT2_RX_1_NUM_BLOCK_1_2 ((uint32_t)0x10000000) /*!< Bit 2 */ +#define USB_COUNT2_RX_1_NUM_BLOCK_1_3 ((uint32_t)0x20000000) /*!< Bit 3 */ +#define USB_COUNT2_RX_1_NUM_BLOCK_1_4 ((uint32_t)0x40000000) /*!< Bit 4 */ + +#define USB_COUNT2_RX_1_BLSIZE_1 ((uint32_t)0x80000000) /*!< BLock SIZE (high) */ + +/**************** Bit definition for USB_COUNT3_RX_0 register ***************/ +#define USB_COUNT3_RX_0_COUNT3_RX_0 ((uint32_t)0x000003FF) /*!< Reception Byte Count (low) */ + +#define USB_COUNT3_RX_0_NUM_BLOCK_0 ((uint32_t)0x00007C00) /*!< NUM_BLOCK_0[4:0] bits (Number of blocks) (low) */ +#define USB_COUNT3_RX_0_NUM_BLOCK_0_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define USB_COUNT3_RX_0_NUM_BLOCK_0_1 ((uint32_t)0x00000800) /*!< Bit 1 */ +#define USB_COUNT3_RX_0_NUM_BLOCK_0_2 ((uint32_t)0x00001000) /*!< Bit 2 */ +#define USB_COUNT3_RX_0_NUM_BLOCK_0_3 ((uint32_t)0x00002000) /*!< Bit 3 */ +#define USB_COUNT3_RX_0_NUM_BLOCK_0_4 ((uint32_t)0x00004000) /*!< Bit 4 */ + +#define USB_COUNT3_RX_0_BLSIZE_0 ((uint32_t)0x00008000) /*!< BLock SIZE (low) */ + +/**************** Bit definition for USB_COUNT3_RX_1 register ***************/ +#define USB_COUNT3_RX_1_COUNT3_RX_1 ((uint32_t)0x03FF0000) /*!< Reception Byte Count (high) */ + +#define USB_COUNT3_RX_1_NUM_BLOCK_1 ((uint32_t)0x7C000000) /*!< NUM_BLOCK_1[4:0] bits (Number of blocks) (high) */ +#define USB_COUNT3_RX_1_NUM_BLOCK_1_0 ((uint32_t)0x04000000) /*!< Bit 0 */ +#define USB_COUNT3_RX_1_NUM_BLOCK_1_1 ((uint32_t)0x08000000) /*!< Bit 1 */ +#define USB_COUNT3_RX_1_NUM_BLOCK_1_2 ((uint32_t)0x10000000) /*!< Bit 2 */ +#define USB_COUNT3_RX_1_NUM_BLOCK_1_3 ((uint32_t)0x20000000) /*!< Bit 3 */ +#define USB_COUNT3_RX_1_NUM_BLOCK_1_4 ((uint32_t)0x40000000) /*!< Bit 4 */ + +#define USB_COUNT3_RX_1_BLSIZE_1 ((uint32_t)0x80000000) /*!< BLock SIZE (high) */ + +/**************** Bit definition for USB_COUNT4_RX_0 register ***************/ +#define USB_COUNT4_RX_0_COUNT4_RX_0 ((uint32_t)0x000003FF) /*!< Reception Byte Count (low) */ + +#define USB_COUNT4_RX_0_NUM_BLOCK_0 ((uint32_t)0x00007C00) /*!< NUM_BLOCK_0[4:0] bits (Number of blocks) (low) */ +#define USB_COUNT4_RX_0_NUM_BLOCK_0_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define USB_COUNT4_RX_0_NUM_BLOCK_0_1 ((uint32_t)0x00000800) /*!< Bit 1 */ +#define USB_COUNT4_RX_0_NUM_BLOCK_0_2 ((uint32_t)0x00001000) /*!< Bit 2 */ +#define USB_COUNT4_RX_0_NUM_BLOCK_0_3 ((uint32_t)0x00002000) /*!< Bit 3 */ +#define USB_COUNT4_RX_0_NUM_BLOCK_0_4 ((uint32_t)0x00004000) /*!< Bit 4 */ + +#define USB_COUNT4_RX_0_BLSIZE_0 ((uint32_t)0x00008000) /*!< BLock SIZE (low) */ + +/**************** Bit definition for USB_COUNT4_RX_1 register ***************/ +#define USB_COUNT4_RX_1_COUNT4_RX_1 ((uint32_t)0x03FF0000) /*!< Reception Byte Count (high) */ + +#define USB_COUNT4_RX_1_NUM_BLOCK_1 ((uint32_t)0x7C000000) /*!< NUM_BLOCK_1[4:0] bits (Number of blocks) (high) */ +#define USB_COUNT4_RX_1_NUM_BLOCK_1_0 ((uint32_t)0x04000000) /*!< Bit 0 */ +#define USB_COUNT4_RX_1_NUM_BLOCK_1_1 ((uint32_t)0x08000000) /*!< Bit 1 */ +#define USB_COUNT4_RX_1_NUM_BLOCK_1_2 ((uint32_t)0x10000000) /*!< Bit 2 */ +#define USB_COUNT4_RX_1_NUM_BLOCK_1_3 ((uint32_t)0x20000000) /*!< Bit 3 */ +#define USB_COUNT4_RX_1_NUM_BLOCK_1_4 ((uint32_t)0x40000000) /*!< Bit 4 */ + +#define USB_COUNT4_RX_1_BLSIZE_1 ((uint32_t)0x80000000) /*!< BLock SIZE (high) */ + +/**************** Bit definition for USB_COUNT5_RX_0 register ***************/ +#define USB_COUNT5_RX_0_COUNT5_RX_0 ((uint32_t)0x000003FF) /*!< Reception Byte Count (low) */ + +#define USB_COUNT5_RX_0_NUM_BLOCK_0 ((uint32_t)0x00007C00) /*!< NUM_BLOCK_0[4:0] bits (Number of blocks) (low) */ +#define USB_COUNT5_RX_0_NUM_BLOCK_0_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define USB_COUNT5_RX_0_NUM_BLOCK_0_1 ((uint32_t)0x00000800) /*!< Bit 1 */ +#define USB_COUNT5_RX_0_NUM_BLOCK_0_2 ((uint32_t)0x00001000) /*!< Bit 2 */ +#define USB_COUNT5_RX_0_NUM_BLOCK_0_3 ((uint32_t)0x00002000) /*!< Bit 3 */ +#define USB_COUNT5_RX_0_NUM_BLOCK_0_4 ((uint32_t)0x00004000) /*!< Bit 4 */ + +#define USB_COUNT5_RX_0_BLSIZE_0 ((uint32_t)0x00008000) /*!< BLock SIZE (low) */ + +/**************** Bit definition for USB_COUNT5_RX_1 register ***************/ +#define USB_COUNT5_RX_1_COUNT5_RX_1 ((uint32_t)0x03FF0000) /*!< Reception Byte Count (high) */ + +#define USB_COUNT5_RX_1_NUM_BLOCK_1 ((uint32_t)0x7C000000) /*!< NUM_BLOCK_1[4:0] bits (Number of blocks) (high) */ +#define USB_COUNT5_RX_1_NUM_BLOCK_1_0 ((uint32_t)0x04000000) /*!< Bit 0 */ +#define USB_COUNT5_RX_1_NUM_BLOCK_1_1 ((uint32_t)0x08000000) /*!< Bit 1 */ +#define USB_COUNT5_RX_1_NUM_BLOCK_1_2 ((uint32_t)0x10000000) /*!< Bit 2 */ +#define USB_COUNT5_RX_1_NUM_BLOCK_1_3 ((uint32_t)0x20000000) /*!< Bit 3 */ +#define USB_COUNT5_RX_1_NUM_BLOCK_1_4 ((uint32_t)0x40000000) /*!< Bit 4 */ + +#define USB_COUNT5_RX_1_BLSIZE_1 ((uint32_t)0x80000000) /*!< BLock SIZE (high) */ + +/*************** Bit definition for USB_COUNT6_RX_0 register ***************/ +#define USB_COUNT6_RX_0_COUNT6_RX_0 ((uint32_t)0x000003FF) /*!< Reception Byte Count (low) */ + +#define USB_COUNT6_RX_0_NUM_BLOCK_0 ((uint32_t)0x00007C00) /*!< NUM_BLOCK_0[4:0] bits (Number of blocks) (low) */ +#define USB_COUNT6_RX_0_NUM_BLOCK_0_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define USB_COUNT6_RX_0_NUM_BLOCK_0_1 ((uint32_t)0x00000800) /*!< Bit 1 */ +#define USB_COUNT6_RX_0_NUM_BLOCK_0_2 ((uint32_t)0x00001000) /*!< Bit 2 */ +#define USB_COUNT6_RX_0_NUM_BLOCK_0_3 ((uint32_t)0x00002000) /*!< Bit 3 */ +#define USB_COUNT6_RX_0_NUM_BLOCK_0_4 ((uint32_t)0x00004000) /*!< Bit 4 */ + +#define USB_COUNT6_RX_0_BLSIZE_0 ((uint32_t)0x00008000) /*!< BLock SIZE (low) */ + +/**************** Bit definition for USB_COUNT6_RX_1 register ***************/ +#define USB_COUNT6_RX_1_COUNT6_RX_1 ((uint32_t)0x03FF0000) /*!< Reception Byte Count (high) */ + +#define USB_COUNT6_RX_1_NUM_BLOCK_1 ((uint32_t)0x7C000000) /*!< NUM_BLOCK_1[4:0] bits (Number of blocks) (high) */ +#define USB_COUNT6_RX_1_NUM_BLOCK_1_0 ((uint32_t)0x04000000) /*!< Bit 0 */ +#define USB_COUNT6_RX_1_NUM_BLOCK_1_1 ((uint32_t)0x08000000) /*!< Bit 1 */ +#define USB_COUNT6_RX_1_NUM_BLOCK_1_2 ((uint32_t)0x10000000) /*!< Bit 2 */ +#define USB_COUNT6_RX_1_NUM_BLOCK_1_3 ((uint32_t)0x20000000) /*!< Bit 3 */ +#define USB_COUNT6_RX_1_NUM_BLOCK_1_4 ((uint32_t)0x40000000) /*!< Bit 4 */ + +#define USB_COUNT6_RX_1_BLSIZE_1 ((uint32_t)0x80000000) /*!< BLock SIZE (high) */ + +/*************** Bit definition for USB_COUNT7_RX_0 register ****************/ +#define USB_COUNT7_RX_0_COUNT7_RX_0 ((uint32_t)0x000003FF) /*!< Reception Byte Count (low) */ + +#define USB_COUNT7_RX_0_NUM_BLOCK_0 ((uint32_t)0x00007C00) /*!< NUM_BLOCK_0[4:0] bits (Number of blocks) (low) */ +#define USB_COUNT7_RX_0_NUM_BLOCK_0_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define USB_COUNT7_RX_0_NUM_BLOCK_0_1 ((uint32_t)0x00000800) /*!< Bit 1 */ +#define USB_COUNT7_RX_0_NUM_BLOCK_0_2 ((uint32_t)0x00001000) /*!< Bit 2 */ +#define USB_COUNT7_RX_0_NUM_BLOCK_0_3 ((uint32_t)0x00002000) /*!< Bit 3 */ +#define USB_COUNT7_RX_0_NUM_BLOCK_0_4 ((uint32_t)0x00004000) /*!< Bit 4 */ + +#define USB_COUNT7_RX_0_BLSIZE_0 ((uint32_t)0x00008000) /*!< BLock SIZE (low) */ + +/*************** Bit definition for USB_COUNT7_RX_1 register ****************/ +#define USB_COUNT7_RX_1_COUNT7_RX_1 ((uint32_t)0x03FF0000) /*!< Reception Byte Count (high) */ + +#define USB_COUNT7_RX_1_NUM_BLOCK_1 ((uint32_t)0x7C000000) /*!< NUM_BLOCK_1[4:0] bits (Number of blocks) (high) */ +#define USB_COUNT7_RX_1_NUM_BLOCK_1_0 ((uint32_t)0x04000000) /*!< Bit 0 */ +#define USB_COUNT7_RX_1_NUM_BLOCK_1_1 ((uint32_t)0x08000000) /*!< Bit 1 */ +#define USB_COUNT7_RX_1_NUM_BLOCK_1_2 ((uint32_t)0x10000000) /*!< Bit 2 */ +#define USB_COUNT7_RX_1_NUM_BLOCK_1_3 ((uint32_t)0x20000000) /*!< Bit 3 */ +#define USB_COUNT7_RX_1_NUM_BLOCK_1_4 ((uint32_t)0x40000000) /*!< Bit 4 */ + +#define USB_COUNT7_RX_1_BLSIZE_1 ((uint32_t)0x80000000) /*!< BLock SIZE (high) */ + +/******************************************************************************/ +/* */ +/* Controller Area Network */ +/* */ +/******************************************************************************/ + +/*!< CAN control and status registers */ +/******************* Bit definition for CAN_MCR register ********************/ +#define CAN_MCR_INRQ ((uint16_t)0x0001) /*!< Initialization Request */ +#define CAN_MCR_SLEEP ((uint16_t)0x0002) /*!< Sleep Mode Request */ +#define CAN_MCR_TXFP ((uint16_t)0x0004) /*!< Transmit FIFO Priority */ +#define CAN_MCR_RFLM ((uint16_t)0x0008) /*!< Receive FIFO Locked Mode */ +#define CAN_MCR_NART ((uint16_t)0x0010) /*!< No Automatic Retransmission */ +#define CAN_MCR_AWUM ((uint16_t)0x0020) /*!< Automatic Wakeup Mode */ +#define CAN_MCR_ABOM ((uint16_t)0x0040) /*!< Automatic Bus-Off Management */ +#define CAN_MCR_TTCM ((uint16_t)0x0080) /*!< Time Triggered Communication Mode */ +#define CAN_MCR_RESET ((uint16_t)0x8000) /*!< CAN software master reset */ + +/******************* Bit definition for CAN_MSR register ********************/ +#define CAN_MSR_INAK ((uint16_t)0x0001) /*!< Initialization Acknowledge */ +#define CAN_MSR_SLAK ((uint16_t)0x0002) /*!< Sleep Acknowledge */ +#define CAN_MSR_ERRI ((uint16_t)0x0004) /*!< Error Interrupt */ +#define CAN_MSR_WKUI ((uint16_t)0x0008) /*!< Wakeup Interrupt */ +#define CAN_MSR_SLAKI ((uint16_t)0x0010) /*!< Sleep Acknowledge Interrupt */ +#define CAN_MSR_TXM ((uint16_t)0x0100) /*!< Transmit Mode */ +#define CAN_MSR_RXM ((uint16_t)0x0200) /*!< Receive Mode */ +#define CAN_MSR_SAMP ((uint16_t)0x0400) /*!< Last Sample Point */ +#define CAN_MSR_RX ((uint16_t)0x0800) /*!< CAN Rx Signal */ + +/******************* Bit definition for CAN_TSR register ********************/ +#define CAN_TSR_RQCP0 ((uint32_t)0x00000001) /*!< Request Completed Mailbox0 */ +#define CAN_TSR_TXOK0 ((uint32_t)0x00000002) /*!< Transmission OK of Mailbox0 */ +#define CAN_TSR_ALST0 ((uint32_t)0x00000004) /*!< Arbitration Lost for Mailbox0 */ +#define CAN_TSR_TERR0 ((uint32_t)0x00000008) /*!< Transmission Error of Mailbox0 */ +#define CAN_TSR_ABRQ0 ((uint32_t)0x00000080) /*!< Abort Request for Mailbox0 */ +#define CAN_TSR_RQCP1 ((uint32_t)0x00000100) /*!< Request Completed Mailbox1 */ +#define CAN_TSR_TXOK1 ((uint32_t)0x00000200) /*!< Transmission OK of Mailbox1 */ +#define CAN_TSR_ALST1 ((uint32_t)0x00000400) /*!< Arbitration Lost for Mailbox1 */ +#define CAN_TSR_TERR1 ((uint32_t)0x00000800) /*!< Transmission Error of Mailbox1 */ +#define CAN_TSR_ABRQ1 ((uint32_t)0x00008000) /*!< Abort Request for Mailbox 1 */ +#define CAN_TSR_RQCP2 ((uint32_t)0x00010000) /*!< Request Completed Mailbox2 */ +#define CAN_TSR_TXOK2 ((uint32_t)0x00020000) /*!< Transmission OK of Mailbox 2 */ +#define CAN_TSR_ALST2 ((uint32_t)0x00040000) /*!< Arbitration Lost for mailbox 2 */ +#define CAN_TSR_TERR2 ((uint32_t)0x00080000) /*!< Transmission Error of Mailbox 2 */ +#define CAN_TSR_ABRQ2 ((uint32_t)0x00800000) /*!< Abort Request for Mailbox 2 */ +#define CAN_TSR_CODE ((uint32_t)0x03000000) /*!< Mailbox Code */ + +#define CAN_TSR_TME ((uint32_t)0x1C000000) /*!< TME[2:0] bits */ +#define CAN_TSR_TME0 ((uint32_t)0x04000000) /*!< Transmit Mailbox 0 Empty */ +#define CAN_TSR_TME1 ((uint32_t)0x08000000) /*!< Transmit Mailbox 1 Empty */ +#define CAN_TSR_TME2 ((uint32_t)0x10000000) /*!< Transmit Mailbox 2 Empty */ + +#define CAN_TSR_LOW ((uint32_t)0xE0000000) /*!< LOW[2:0] bits */ +#define CAN_TSR_LOW0 ((uint32_t)0x20000000) /*!< Lowest Priority Flag for Mailbox 0 */ +#define CAN_TSR_LOW1 ((uint32_t)0x40000000) /*!< Lowest Priority Flag for Mailbox 1 */ +#define CAN_TSR_LOW2 ((uint32_t)0x80000000) /*!< Lowest Priority Flag for Mailbox 2 */ + +/******************* Bit definition for CAN_RF0R register *******************/ +#define CAN_RF0R_FMP0 ((uint8_t)0x03) /*!< FIFO 0 Message Pending */ +#define CAN_RF0R_FULL0 ((uint8_t)0x08) /*!< FIFO 0 Full */ +#define CAN_RF0R_FOVR0 ((uint8_t)0x10) /*!< FIFO 0 Overrun */ +#define CAN_RF0R_RFOM0 ((uint8_t)0x20) /*!< Release FIFO 0 Output Mailbox */ + +/******************* Bit definition for CAN_RF1R register *******************/ +#define CAN_RF1R_FMP1 ((uint8_t)0x03) /*!< FIFO 1 Message Pending */ +#define CAN_RF1R_FULL1 ((uint8_t)0x08) /*!< FIFO 1 Full */ +#define CAN_RF1R_FOVR1 ((uint8_t)0x10) /*!< FIFO 1 Overrun */ +#define CAN_RF1R_RFOM1 ((uint8_t)0x20) /*!< Release FIFO 1 Output Mailbox */ + +/******************** Bit definition for CAN_IER register *******************/ +#define CAN_IER_TMEIE ((uint32_t)0x00000001) /*!< Transmit Mailbox Empty Interrupt Enable */ +#define CAN_IER_FMPIE0 ((uint32_t)0x00000002) /*!< FIFO Message Pending Interrupt Enable */ +#define CAN_IER_FFIE0 ((uint32_t)0x00000004) /*!< FIFO Full Interrupt Enable */ +#define CAN_IER_FOVIE0 ((uint32_t)0x00000008) /*!< FIFO Overrun Interrupt Enable */ +#define CAN_IER_FMPIE1 ((uint32_t)0x00000010) /*!< FIFO Message Pending Interrupt Enable */ +#define CAN_IER_FFIE1 ((uint32_t)0x00000020) /*!< FIFO Full Interrupt Enable */ +#define CAN_IER_FOVIE1 ((uint32_t)0x00000040) /*!< FIFO Overrun Interrupt Enable */ +#define CAN_IER_EWGIE ((uint32_t)0x00000100) /*!< Error Warning Interrupt Enable */ +#define CAN_IER_EPVIE ((uint32_t)0x00000200) /*!< Error Passive Interrupt Enable */ +#define CAN_IER_BOFIE ((uint32_t)0x00000400) /*!< Bus-Off Interrupt Enable */ +#define CAN_IER_LECIE ((uint32_t)0x00000800) /*!< Last Error Code Interrupt Enable */ +#define CAN_IER_ERRIE ((uint32_t)0x00008000) /*!< Error Interrupt Enable */ +#define CAN_IER_WKUIE ((uint32_t)0x00010000) /*!< Wakeup Interrupt Enable */ +#define CAN_IER_SLKIE ((uint32_t)0x00020000) /*!< Sleep Interrupt Enable */ + +/******************** Bit definition for CAN_ESR register *******************/ +#define CAN_ESR_EWGF ((uint32_t)0x00000001) /*!< Error Warning Flag */ +#define CAN_ESR_EPVF ((uint32_t)0x00000002) /*!< Error Passive Flag */ +#define CAN_ESR_BOFF ((uint32_t)0x00000004) /*!< Bus-Off Flag */ + +#define CAN_ESR_LEC ((uint32_t)0x00000070) /*!< LEC[2:0] bits (Last Error Code) */ +#define CAN_ESR_LEC_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define CAN_ESR_LEC_1 ((uint32_t)0x00000020) /*!< Bit 1 */ +#define CAN_ESR_LEC_2 ((uint32_t)0x00000040) /*!< Bit 2 */ + +#define CAN_ESR_TEC ((uint32_t)0x00FF0000) /*!< Least significant byte of the 9-bit Transmit Error Counter */ +#define CAN_ESR_REC ((uint32_t)0xFF000000) /*!< Receive Error Counter */ + +/******************* Bit definition for CAN_BTR register ********************/ +#define CAN_BTR_BRP ((uint32_t)0x000003FF) /*!< Baud Rate Prescaler */ +#define CAN_BTR_TS1 ((uint32_t)0x000F0000) /*!< Time Segment 1 */ +#define CAN_BTR_TS2 ((uint32_t)0x00700000) /*!< Time Segment 2 */ +#define CAN_BTR_SJW ((uint32_t)0x03000000) /*!< Resynchronization Jump Width */ +#define CAN_BTR_LBKM ((uint32_t)0x40000000) /*!< Loop Back Mode (Debug) */ +#define CAN_BTR_SILM ((uint32_t)0x80000000) /*!< Silent Mode */ + +/*!< Mailbox registers */ +/****************** Bit definition for CAN_TI0R register ********************/ +#define CAN_TI0R_TXRQ ((uint32_t)0x00000001) /*!< Transmit Mailbox Request */ +#define CAN_TI0R_RTR ((uint32_t)0x00000002) /*!< Remote Transmission Request */ +#define CAN_TI0R_IDE ((uint32_t)0x00000004) /*!< Identifier Extension */ +#define CAN_TI0R_EXID ((uint32_t)0x001FFFF8) /*!< Extended Identifier */ +#define CAN_TI0R_STID ((uint32_t)0xFFE00000) /*!< Standard Identifier or Extended Identifier */ + +/****************** Bit definition for CAN_TDT0R register *******************/ +#define CAN_TDT0R_DLC ((uint32_t)0x0000000F) /*!< Data Length Code */ +#define CAN_TDT0R_TGT ((uint32_t)0x00000100) /*!< Transmit Global Time */ +#define CAN_TDT0R_TIME ((uint32_t)0xFFFF0000) /*!< Message Time Stamp */ + +/****************** Bit definition for CAN_TDL0R register *******************/ +#define CAN_TDL0R_DATA0 ((uint32_t)0x000000FF) /*!< Data byte 0 */ +#define CAN_TDL0R_DATA1 ((uint32_t)0x0000FF00) /*!< Data byte 1 */ +#define CAN_TDL0R_DATA2 ((uint32_t)0x00FF0000) /*!< Data byte 2 */ +#define CAN_TDL0R_DATA3 ((uint32_t)0xFF000000) /*!< Data byte 3 */ + +/****************** Bit definition for CAN_TDH0R register *******************/ +#define CAN_TDH0R_DATA4 ((uint32_t)0x000000FF) /*!< Data byte 4 */ +#define CAN_TDH0R_DATA5 ((uint32_t)0x0000FF00) /*!< Data byte 5 */ +#define CAN_TDH0R_DATA6 ((uint32_t)0x00FF0000) /*!< Data byte 6 */ +#define CAN_TDH0R_DATA7 ((uint32_t)0xFF000000) /*!< Data byte 7 */ + +/******************* Bit definition for CAN_TI1R register *******************/ +#define CAN_TI1R_TXRQ ((uint32_t)0x00000001) /*!< Transmit Mailbox Request */ +#define CAN_TI1R_RTR ((uint32_t)0x00000002) /*!< Remote Transmission Request */ +#define CAN_TI1R_IDE ((uint32_t)0x00000004) /*!< Identifier Extension */ +#define CAN_TI1R_EXID ((uint32_t)0x001FFFF8) /*!< Extended Identifier */ +#define CAN_TI1R_STID ((uint32_t)0xFFE00000) /*!< Standard Identifier or Extended Identifier */ + +/******************* Bit definition for CAN_TDT1R register ******************/ +#define CAN_TDT1R_DLC ((uint32_t)0x0000000F) /*!< Data Length Code */ +#define CAN_TDT1R_TGT ((uint32_t)0x00000100) /*!< Transmit Global Time */ +#define CAN_TDT1R_TIME ((uint32_t)0xFFFF0000) /*!< Message Time Stamp */ + +/******************* Bit definition for CAN_TDL1R register ******************/ +#define CAN_TDL1R_DATA0 ((uint32_t)0x000000FF) /*!< Data byte 0 */ +#define CAN_TDL1R_DATA1 ((uint32_t)0x0000FF00) /*!< Data byte 1 */ +#define CAN_TDL1R_DATA2 ((uint32_t)0x00FF0000) /*!< Data byte 2 */ +#define CAN_TDL1R_DATA3 ((uint32_t)0xFF000000) /*!< Data byte 3 */ + +/******************* Bit definition for CAN_TDH1R register ******************/ +#define CAN_TDH1R_DATA4 ((uint32_t)0x000000FF) /*!< Data byte 4 */ +#define CAN_TDH1R_DATA5 ((uint32_t)0x0000FF00) /*!< Data byte 5 */ +#define CAN_TDH1R_DATA6 ((uint32_t)0x00FF0000) /*!< Data byte 6 */ +#define CAN_TDH1R_DATA7 ((uint32_t)0xFF000000) /*!< Data byte 7 */ + +/******************* Bit definition for CAN_TI2R register *******************/ +#define CAN_TI2R_TXRQ ((uint32_t)0x00000001) /*!< Transmit Mailbox Request */ +#define CAN_TI2R_RTR ((uint32_t)0x00000002) /*!< Remote Transmission Request */ +#define CAN_TI2R_IDE ((uint32_t)0x00000004) /*!< Identifier Extension */ +#define CAN_TI2R_EXID ((uint32_t)0x001FFFF8) /*!< Extended identifier */ +#define CAN_TI2R_STID ((uint32_t)0xFFE00000) /*!< Standard Identifier or Extended Identifier */ + +/******************* Bit definition for CAN_TDT2R register ******************/ +#define CAN_TDT2R_DLC ((uint32_t)0x0000000F) /*!< Data Length Code */ +#define CAN_TDT2R_TGT ((uint32_t)0x00000100) /*!< Transmit Global Time */ +#define CAN_TDT2R_TIME ((uint32_t)0xFFFF0000) /*!< Message Time Stamp */ + +/******************* Bit definition for CAN_TDL2R register ******************/ +#define CAN_TDL2R_DATA0 ((uint32_t)0x000000FF) /*!< Data byte 0 */ +#define CAN_TDL2R_DATA1 ((uint32_t)0x0000FF00) /*!< Data byte 1 */ +#define CAN_TDL2R_DATA2 ((uint32_t)0x00FF0000) /*!< Data byte 2 */ +#define CAN_TDL2R_DATA3 ((uint32_t)0xFF000000) /*!< Data byte 3 */ + +/******************* Bit definition for CAN_TDH2R register ******************/ +#define CAN_TDH2R_DATA4 ((uint32_t)0x000000FF) /*!< Data byte 4 */ +#define CAN_TDH2R_DATA5 ((uint32_t)0x0000FF00) /*!< Data byte 5 */ +#define CAN_TDH2R_DATA6 ((uint32_t)0x00FF0000) /*!< Data byte 6 */ +#define CAN_TDH2R_DATA7 ((uint32_t)0xFF000000) /*!< Data byte 7 */ + +/******************* Bit definition for CAN_RI0R register *******************/ +#define CAN_RI0R_RTR ((uint32_t)0x00000002) /*!< Remote Transmission Request */ +#define CAN_RI0R_IDE ((uint32_t)0x00000004) /*!< Identifier Extension */ +#define CAN_RI0R_EXID ((uint32_t)0x001FFFF8) /*!< Extended Identifier */ +#define CAN_RI0R_STID ((uint32_t)0xFFE00000) /*!< Standard Identifier or Extended Identifier */ + +/******************* Bit definition for CAN_RDT0R register ******************/ +#define CAN_RDT0R_DLC ((uint32_t)0x0000000F) /*!< Data Length Code */ +#define CAN_RDT0R_FMI ((uint32_t)0x0000FF00) /*!< Filter Match Index */ +#define CAN_RDT0R_TIME ((uint32_t)0xFFFF0000) /*!< Message Time Stamp */ + +/******************* Bit definition for CAN_RDL0R register ******************/ +#define CAN_RDL0R_DATA0 ((uint32_t)0x000000FF) /*!< Data byte 0 */ +#define CAN_RDL0R_DATA1 ((uint32_t)0x0000FF00) /*!< Data byte 1 */ +#define CAN_RDL0R_DATA2 ((uint32_t)0x00FF0000) /*!< Data byte 2 */ +#define CAN_RDL0R_DATA3 ((uint32_t)0xFF000000) /*!< Data byte 3 */ + +/******************* Bit definition for CAN_RDH0R register ******************/ +#define CAN_RDH0R_DATA4 ((uint32_t)0x000000FF) /*!< Data byte 4 */ +#define CAN_RDH0R_DATA5 ((uint32_t)0x0000FF00) /*!< Data byte 5 */ +#define CAN_RDH0R_DATA6 ((uint32_t)0x00FF0000) /*!< Data byte 6 */ +#define CAN_RDH0R_DATA7 ((uint32_t)0xFF000000) /*!< Data byte 7 */ + +/******************* Bit definition for CAN_RI1R register *******************/ +#define CAN_RI1R_RTR ((uint32_t)0x00000002) /*!< Remote Transmission Request */ +#define CAN_RI1R_IDE ((uint32_t)0x00000004) /*!< Identifier Extension */ +#define CAN_RI1R_EXID ((uint32_t)0x001FFFF8) /*!< Extended identifier */ +#define CAN_RI1R_STID ((uint32_t)0xFFE00000) /*!< Standard Identifier or Extended Identifier */ + +/******************* Bit definition for CAN_RDT1R register ******************/ +#define CAN_RDT1R_DLC ((uint32_t)0x0000000F) /*!< Data Length Code */ +#define CAN_RDT1R_FMI ((uint32_t)0x0000FF00) /*!< Filter Match Index */ +#define CAN_RDT1R_TIME ((uint32_t)0xFFFF0000) /*!< Message Time Stamp */ + +/******************* Bit definition for CAN_RDL1R register ******************/ +#define CAN_RDL1R_DATA0 ((uint32_t)0x000000FF) /*!< Data byte 0 */ +#define CAN_RDL1R_DATA1 ((uint32_t)0x0000FF00) /*!< Data byte 1 */ +#define CAN_RDL1R_DATA2 ((uint32_t)0x00FF0000) /*!< Data byte 2 */ +#define CAN_RDL1R_DATA3 ((uint32_t)0xFF000000) /*!< Data byte 3 */ + +/******************* Bit definition for CAN_RDH1R register ******************/ +#define CAN_RDH1R_DATA4 ((uint32_t)0x000000FF) /*!< Data byte 4 */ +#define CAN_RDH1R_DATA5 ((uint32_t)0x0000FF00) /*!< Data byte 5 */ +#define CAN_RDH1R_DATA6 ((uint32_t)0x00FF0000) /*!< Data byte 6 */ +#define CAN_RDH1R_DATA7 ((uint32_t)0xFF000000) /*!< Data byte 7 */ + +/*!< CAN filter registers */ +/******************* Bit definition for CAN_FMR register ********************/ +#define CAN_FMR_FINIT ((uint8_t)0x01) /*!< Filter Init Mode */ + +/******************* Bit definition for CAN_FM1R register *******************/ +#define CAN_FM1R_FBM ((uint16_t)0x3FFF) /*!< Filter Mode */ +#define CAN_FM1R_FBM0 ((uint16_t)0x0001) /*!< Filter Init Mode bit 0 */ +#define CAN_FM1R_FBM1 ((uint16_t)0x0002) /*!< Filter Init Mode bit 1 */ +#define CAN_FM1R_FBM2 ((uint16_t)0x0004) /*!< Filter Init Mode bit 2 */ +#define CAN_FM1R_FBM3 ((uint16_t)0x0008) /*!< Filter Init Mode bit 3 */ +#define CAN_FM1R_FBM4 ((uint16_t)0x0010) /*!< Filter Init Mode bit 4 */ +#define CAN_FM1R_FBM5 ((uint16_t)0x0020) /*!< Filter Init Mode bit 5 */ +#define CAN_FM1R_FBM6 ((uint16_t)0x0040) /*!< Filter Init Mode bit 6 */ +#define CAN_FM1R_FBM7 ((uint16_t)0x0080) /*!< Filter Init Mode bit 7 */ +#define CAN_FM1R_FBM8 ((uint16_t)0x0100) /*!< Filter Init Mode bit 8 */ +#define CAN_FM1R_FBM9 ((uint16_t)0x0200) /*!< Filter Init Mode bit 9 */ +#define CAN_FM1R_FBM10 ((uint16_t)0x0400) /*!< Filter Init Mode bit 10 */ +#define CAN_FM1R_FBM11 ((uint16_t)0x0800) /*!< Filter Init Mode bit 11 */ +#define CAN_FM1R_FBM12 ((uint16_t)0x1000) /*!< Filter Init Mode bit 12 */ +#define CAN_FM1R_FBM13 ((uint16_t)0x2000) /*!< Filter Init Mode bit 13 */ + +/******************* Bit definition for CAN_FS1R register *******************/ +#define CAN_FS1R_FSC ((uint16_t)0x3FFF) /*!< Filter Scale Configuration */ +#define CAN_FS1R_FSC0 ((uint16_t)0x0001) /*!< Filter Scale Configuration bit 0 */ +#define CAN_FS1R_FSC1 ((uint16_t)0x0002) /*!< Filter Scale Configuration bit 1 */ +#define CAN_FS1R_FSC2 ((uint16_t)0x0004) /*!< Filter Scale Configuration bit 2 */ +#define CAN_FS1R_FSC3 ((uint16_t)0x0008) /*!< Filter Scale Configuration bit 3 */ +#define CAN_FS1R_FSC4 ((uint16_t)0x0010) /*!< Filter Scale Configuration bit 4 */ +#define CAN_FS1R_FSC5 ((uint16_t)0x0020) /*!< Filter Scale Configuration bit 5 */ +#define CAN_FS1R_FSC6 ((uint16_t)0x0040) /*!< Filter Scale Configuration bit 6 */ +#define CAN_FS1R_FSC7 ((uint16_t)0x0080) /*!< Filter Scale Configuration bit 7 */ +#define CAN_FS1R_FSC8 ((uint16_t)0x0100) /*!< Filter Scale Configuration bit 8 */ +#define CAN_FS1R_FSC9 ((uint16_t)0x0200) /*!< Filter Scale Configuration bit 9 */ +#define CAN_FS1R_FSC10 ((uint16_t)0x0400) /*!< Filter Scale Configuration bit 10 */ +#define CAN_FS1R_FSC11 ((uint16_t)0x0800) /*!< Filter Scale Configuration bit 11 */ +#define CAN_FS1R_FSC12 ((uint16_t)0x1000) /*!< Filter Scale Configuration bit 12 */ +#define CAN_FS1R_FSC13 ((uint16_t)0x2000) /*!< Filter Scale Configuration bit 13 */ + +/****************** Bit definition for CAN_FFA1R register *******************/ +#define CAN_FFA1R_FFA ((uint16_t)0x3FFF) /*!< Filter FIFO Assignment */ +#define CAN_FFA1R_FFA0 ((uint16_t)0x0001) /*!< Filter FIFO Assignment for Filter 0 */ +#define CAN_FFA1R_FFA1 ((uint16_t)0x0002) /*!< Filter FIFO Assignment for Filter 1 */ +#define CAN_FFA1R_FFA2 ((uint16_t)0x0004) /*!< Filter FIFO Assignment for Filter 2 */ +#define CAN_FFA1R_FFA3 ((uint16_t)0x0008) /*!< Filter FIFO Assignment for Filter 3 */ +#define CAN_FFA1R_FFA4 ((uint16_t)0x0010) /*!< Filter FIFO Assignment for Filter 4 */ +#define CAN_FFA1R_FFA5 ((uint16_t)0x0020) /*!< Filter FIFO Assignment for Filter 5 */ +#define CAN_FFA1R_FFA6 ((uint16_t)0x0040) /*!< Filter FIFO Assignment for Filter 6 */ +#define CAN_FFA1R_FFA7 ((uint16_t)0x0080) /*!< Filter FIFO Assignment for Filter 7 */ +#define CAN_FFA1R_FFA8 ((uint16_t)0x0100) /*!< Filter FIFO Assignment for Filter 8 */ +#define CAN_FFA1R_FFA9 ((uint16_t)0x0200) /*!< Filter FIFO Assignment for Filter 9 */ +#define CAN_FFA1R_FFA10 ((uint16_t)0x0400) /*!< Filter FIFO Assignment for Filter 10 */ +#define CAN_FFA1R_FFA11 ((uint16_t)0x0800) /*!< Filter FIFO Assignment for Filter 11 */ +#define CAN_FFA1R_FFA12 ((uint16_t)0x1000) /*!< Filter FIFO Assignment for Filter 12 */ +#define CAN_FFA1R_FFA13 ((uint16_t)0x2000) /*!< Filter FIFO Assignment for Filter 13 */ + +/******************* Bit definition for CAN_FA1R register *******************/ +#define CAN_FA1R_FACT ((uint16_t)0x3FFF) /*!< Filter Active */ +#define CAN_FA1R_FACT0 ((uint16_t)0x0001) /*!< Filter 0 Active */ +#define CAN_FA1R_FACT1 ((uint16_t)0x0002) /*!< Filter 1 Active */ +#define CAN_FA1R_FACT2 ((uint16_t)0x0004) /*!< Filter 2 Active */ +#define CAN_FA1R_FACT3 ((uint16_t)0x0008) /*!< Filter 3 Active */ +#define CAN_FA1R_FACT4 ((uint16_t)0x0010) /*!< Filter 4 Active */ +#define CAN_FA1R_FACT5 ((uint16_t)0x0020) /*!< Filter 5 Active */ +#define CAN_FA1R_FACT6 ((uint16_t)0x0040) /*!< Filter 6 Active */ +#define CAN_FA1R_FACT7 ((uint16_t)0x0080) /*!< Filter 7 Active */ +#define CAN_FA1R_FACT8 ((uint16_t)0x0100) /*!< Filter 8 Active */ +#define CAN_FA1R_FACT9 ((uint16_t)0x0200) /*!< Filter 9 Active */ +#define CAN_FA1R_FACT10 ((uint16_t)0x0400) /*!< Filter 10 Active */ +#define CAN_FA1R_FACT11 ((uint16_t)0x0800) /*!< Filter 11 Active */ +#define CAN_FA1R_FACT12 ((uint16_t)0x1000) /*!< Filter 12 Active */ +#define CAN_FA1R_FACT13 ((uint16_t)0x2000) /*!< Filter 13 Active */ + +/******************* Bit definition for CAN_F0R1 register *******************/ +#define CAN_F0R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F0R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F0R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F0R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F0R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F0R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F0R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F0R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F0R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F0R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F0R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F0R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F0R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F0R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F0R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F0R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F0R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F0R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F0R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F0R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F0R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F0R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F0R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F0R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F0R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F0R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F0R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F0R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F0R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F0R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F0R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F0R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F1R1 register *******************/ +#define CAN_F1R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F1R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F1R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F1R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F1R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F1R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F1R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F1R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F1R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F1R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F1R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F1R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F1R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F1R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F1R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F1R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F1R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F1R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F1R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F1R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F1R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F1R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F1R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F1R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F1R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F1R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F1R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F1R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F1R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F1R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F1R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F1R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F2R1 register *******************/ +#define CAN_F2R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F2R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F2R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F2R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F2R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F2R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F2R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F2R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F2R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F2R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F2R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F2R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F2R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F2R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F2R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F2R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F2R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F2R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F2R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F2R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F2R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F2R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F2R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F2R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F2R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F2R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F2R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F2R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F2R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F2R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F2R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F2R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F3R1 register *******************/ +#define CAN_F3R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F3R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F3R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F3R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F3R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F3R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F3R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F3R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F3R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F3R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F3R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F3R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F3R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F3R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F3R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F3R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F3R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F3R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F3R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F3R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F3R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F3R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F3R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F3R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F3R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F3R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F3R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F3R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F3R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F3R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F3R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F3R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F4R1 register *******************/ +#define CAN_F4R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F4R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F4R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F4R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F4R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F4R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F4R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F4R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F4R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F4R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F4R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F4R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F4R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F4R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F4R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F4R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F4R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F4R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F4R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F4R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F4R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F4R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F4R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F4R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F4R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F4R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F4R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F4R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F4R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F4R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F4R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F4R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F5R1 register *******************/ +#define CAN_F5R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F5R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F5R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F5R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F5R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F5R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F5R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F5R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F5R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F5R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F5R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F5R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F5R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F5R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F5R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F5R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F5R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F5R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F5R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F5R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F5R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F5R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F5R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F5R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F5R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F5R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F5R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F5R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F5R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F5R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F5R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F5R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F6R1 register *******************/ +#define CAN_F6R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F6R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F6R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F6R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F6R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F6R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F6R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F6R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F6R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F6R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F6R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F6R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F6R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F6R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F6R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F6R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F6R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F6R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F6R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F6R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F6R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F6R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F6R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F6R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F6R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F6R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F6R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F6R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F6R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F6R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F6R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F6R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F7R1 register *******************/ +#define CAN_F7R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F7R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F7R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F7R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F7R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F7R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F7R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F7R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F7R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F7R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F7R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F7R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F7R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F7R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F7R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F7R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F7R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F7R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F7R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F7R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F7R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F7R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F7R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F7R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F7R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F7R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F7R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F7R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F7R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F7R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F7R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F7R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F8R1 register *******************/ +#define CAN_F8R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F8R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F8R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F8R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F8R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F8R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F8R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F8R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F8R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F8R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F8R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F8R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F8R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F8R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F8R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F8R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F8R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F8R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F8R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F8R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F8R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F8R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F8R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F8R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F8R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F8R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F8R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F8R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F8R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F8R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F8R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F8R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F9R1 register *******************/ +#define CAN_F9R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F9R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F9R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F9R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F9R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F9R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F9R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F9R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F9R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F9R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F9R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F9R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F9R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F9R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F9R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F9R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F9R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F9R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F9R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F9R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F9R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F9R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F9R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F9R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F9R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F9R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F9R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F9R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F9R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F9R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F9R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F9R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F10R1 register ******************/ +#define CAN_F10R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F10R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F10R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F10R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F10R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F10R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F10R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F10R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F10R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F10R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F10R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F10R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F10R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F10R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F10R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F10R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F10R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F10R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F10R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F10R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F10R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F10R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F10R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F10R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F10R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F10R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F10R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F10R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F10R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F10R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F10R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F10R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F11R1 register ******************/ +#define CAN_F11R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F11R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F11R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F11R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F11R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F11R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F11R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F11R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F11R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F11R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F11R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F11R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F11R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F11R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F11R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F11R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F11R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F11R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F11R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F11R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F11R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F11R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F11R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F11R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F11R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F11R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F11R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F11R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F11R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F11R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F11R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F11R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F12R1 register ******************/ +#define CAN_F12R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F12R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F12R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F12R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F12R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F12R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F12R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F12R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F12R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F12R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F12R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F12R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F12R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F12R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F12R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F12R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F12R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F12R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F12R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F12R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F12R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F12R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F12R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F12R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F12R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F12R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F12R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F12R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F12R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F12R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F12R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F12R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F13R1 register ******************/ +#define CAN_F13R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F13R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F13R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F13R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F13R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F13R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F13R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F13R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F13R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F13R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F13R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F13R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F13R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F13R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F13R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F13R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F13R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F13R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F13R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F13R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F13R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F13R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F13R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F13R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F13R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F13R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F13R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F13R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F13R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F13R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F13R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F13R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F0R2 register *******************/ +#define CAN_F0R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F0R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F0R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F0R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F0R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F0R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F0R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F0R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F0R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F0R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F0R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F0R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F0R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F0R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F0R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F0R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F0R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F0R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F0R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F0R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F0R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F0R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F0R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F0R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F0R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F0R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F0R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F0R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F0R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F0R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F0R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F0R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F1R2 register *******************/ +#define CAN_F1R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F1R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F1R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F1R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F1R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F1R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F1R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F1R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F1R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F1R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F1R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F1R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F1R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F1R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F1R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F1R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F1R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F1R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F1R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F1R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F1R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F1R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F1R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F1R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F1R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F1R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F1R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F1R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F1R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F1R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F1R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F1R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F2R2 register *******************/ +#define CAN_F2R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F2R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F2R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F2R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F2R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F2R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F2R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F2R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F2R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F2R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F2R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F2R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F2R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F2R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F2R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F2R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F2R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F2R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F2R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F2R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F2R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F2R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F2R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F2R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F2R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F2R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F2R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F2R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F2R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F2R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F2R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F2R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F3R2 register *******************/ +#define CAN_F3R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F3R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F3R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F3R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F3R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F3R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F3R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F3R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F3R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F3R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F3R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F3R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F3R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F3R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F3R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F3R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F3R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F3R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F3R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F3R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F3R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F3R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F3R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F3R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F3R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F3R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F3R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F3R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F3R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F3R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F3R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F3R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F4R2 register *******************/ +#define CAN_F4R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F4R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F4R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F4R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F4R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F4R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F4R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F4R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F4R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F4R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F4R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F4R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F4R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F4R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F4R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F4R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F4R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F4R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F4R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F4R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F4R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F4R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F4R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F4R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F4R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F4R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F4R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F4R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F4R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F4R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F4R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F4R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F5R2 register *******************/ +#define CAN_F5R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F5R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F5R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F5R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F5R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F5R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F5R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F5R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F5R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F5R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F5R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F5R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F5R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F5R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F5R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F5R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F5R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F5R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F5R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F5R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F5R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F5R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F5R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F5R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F5R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F5R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F5R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F5R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F5R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F5R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F5R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F5R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F6R2 register *******************/ +#define CAN_F6R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F6R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F6R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F6R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F6R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F6R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F6R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F6R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F6R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F6R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F6R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F6R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F6R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F6R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F6R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F6R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F6R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F6R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F6R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F6R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F6R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F6R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F6R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F6R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F6R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F6R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F6R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F6R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F6R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F6R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F6R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F6R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F7R2 register *******************/ +#define CAN_F7R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F7R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F7R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F7R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F7R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F7R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F7R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F7R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F7R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F7R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F7R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F7R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F7R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F7R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F7R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F7R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F7R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F7R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F7R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F7R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F7R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F7R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F7R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F7R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F7R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F7R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F7R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F7R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F7R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F7R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F7R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F7R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F8R2 register *******************/ +#define CAN_F8R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F8R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F8R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F8R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F8R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F8R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F8R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F8R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F8R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F8R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F8R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F8R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F8R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F8R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F8R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F8R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F8R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F8R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F8R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F8R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F8R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F8R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F8R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F8R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F8R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F8R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F8R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F8R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F8R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F8R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F8R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F8R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F9R2 register *******************/ +#define CAN_F9R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F9R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F9R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F9R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F9R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F9R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F9R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F9R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F9R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F9R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F9R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F9R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F9R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F9R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F9R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F9R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F9R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F9R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F9R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F9R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F9R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F9R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F9R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F9R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F9R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F9R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F9R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F9R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F9R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F9R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F9R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F9R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F10R2 register ******************/ +#define CAN_F10R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F10R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F10R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F10R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F10R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F10R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F10R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F10R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F10R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F10R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F10R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F10R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F10R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F10R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F10R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F10R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F10R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F10R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F10R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F10R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F10R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F10R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F10R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F10R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F10R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F10R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F10R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F10R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F10R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F10R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F10R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F10R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F11R2 register ******************/ +#define CAN_F11R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F11R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F11R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F11R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F11R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F11R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F11R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F11R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F11R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F11R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F11R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F11R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F11R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F11R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F11R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F11R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F11R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F11R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F11R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F11R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F11R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F11R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F11R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F11R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F11R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F11R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F11R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F11R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F11R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F11R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F11R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F11R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F12R2 register ******************/ +#define CAN_F12R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F12R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F12R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F12R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F12R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F12R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F12R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F12R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F12R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F12R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F12R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F12R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F12R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F12R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F12R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F12R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F12R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F12R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F12R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F12R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F12R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F12R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F12R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F12R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F12R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F12R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F12R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F12R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F12R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F12R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F12R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F12R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F13R2 register ******************/ +#define CAN_F13R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F13R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F13R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F13R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F13R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F13R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F13R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F13R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F13R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F13R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F13R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F13R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F13R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F13R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F13R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F13R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F13R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F13R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F13R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F13R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F13R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F13R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F13R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F13R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F13R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F13R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F13R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F13R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F13R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F13R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F13R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F13R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************************************************************************/ +/* */ +/* Serial Peripheral Interface */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for SPI_CR1 register ********************/ +#define SPI_CR1_CPHA ((uint16_t)0x0001) /*!< Clock Phase */ +#define SPI_CR1_CPOL ((uint16_t)0x0002) /*!< Clock Polarity */ +#define SPI_CR1_MSTR ((uint16_t)0x0004) /*!< Master Selection */ + +#define SPI_CR1_BR ((uint16_t)0x0038) /*!< BR[2:0] bits (Baud Rate Control) */ +#define SPI_CR1_BR_0 ((uint16_t)0x0008) /*!< Bit 0 */ +#define SPI_CR1_BR_1 ((uint16_t)0x0010) /*!< Bit 1 */ +#define SPI_CR1_BR_2 ((uint16_t)0x0020) /*!< Bit 2 */ + +#define SPI_CR1_SPE ((uint16_t)0x0040) /*!< SPI Enable */ +#define SPI_CR1_LSBFIRST ((uint16_t)0x0080) /*!< Frame Format */ +#define SPI_CR1_SSI ((uint16_t)0x0100) /*!< Internal slave select */ +#define SPI_CR1_SSM ((uint16_t)0x0200) /*!< Software slave management */ +#define SPI_CR1_RXONLY ((uint16_t)0x0400) /*!< Receive only */ +#define SPI_CR1_DFF ((uint16_t)0x0800) /*!< Data Frame Format */ +#define SPI_CR1_CRCNEXT ((uint16_t)0x1000) /*!< Transmit CRC next */ +#define SPI_CR1_CRCEN ((uint16_t)0x2000) /*!< Hardware CRC calculation enable */ +#define SPI_CR1_BIDIOE ((uint16_t)0x4000) /*!< Output enable in bidirectional mode */ +#define SPI_CR1_BIDIMODE ((uint16_t)0x8000) /*!< Bidirectional data mode enable */ + +/******************* Bit definition for SPI_CR2 register ********************/ +#define SPI_CR2_RXDMAEN ((uint8_t)0x01) /*!< Rx Buffer DMA Enable */ +#define SPI_CR2_TXDMAEN ((uint8_t)0x02) /*!< Tx Buffer DMA Enable */ +#define SPI_CR2_SSOE ((uint8_t)0x04) /*!< SS Output Enable */ +#define SPI_CR2_ERRIE ((uint8_t)0x20) /*!< Error Interrupt Enable */ +#define SPI_CR2_RXNEIE ((uint8_t)0x40) /*!< RX buffer Not Empty Interrupt Enable */ +#define SPI_CR2_TXEIE ((uint8_t)0x80) /*!< Tx buffer Empty Interrupt Enable */ + +/******************** Bit definition for SPI_SR register ********************/ +#define SPI_SR_RXNE ((uint8_t)0x01) /*!< Receive buffer Not Empty */ +#define SPI_SR_TXE ((uint8_t)0x02) /*!< Transmit buffer Empty */ +#define SPI_SR_CHSIDE ((uint8_t)0x04) /*!< Channel side */ +#define SPI_SR_UDR ((uint8_t)0x08) /*!< Underrun flag */ +#define SPI_SR_CRCERR ((uint8_t)0x10) /*!< CRC Error flag */ +#define SPI_SR_MODF ((uint8_t)0x20) /*!< Mode fault */ +#define SPI_SR_OVR ((uint8_t)0x40) /*!< Overrun flag */ +#define SPI_SR_BSY ((uint8_t)0x80) /*!< Busy flag */ + +/******************** Bit definition for SPI_DR register ********************/ +#define SPI_DR_DR ((uint16_t)0xFFFF) /*!< Data Register */ + +/******************* Bit definition for SPI_CRCPR register ******************/ +#define SPI_CRCPR_CRCPOLY ((uint16_t)0xFFFF) /*!< CRC polynomial register */ + +/****************** Bit definition for SPI_RXCRCR register ******************/ +#define SPI_RXCRCR_RXCRC ((uint16_t)0xFFFF) /*!< Rx CRC Register */ + +/****************** Bit definition for SPI_TXCRCR register ******************/ +#define SPI_TXCRCR_TXCRC ((uint16_t)0xFFFF) /*!< Tx CRC Register */ + +/****************** Bit definition for SPI_I2SCFGR register *****************/ +#define SPI_I2SCFGR_CHLEN ((uint16_t)0x0001) /*!< Channel length (number of bits per audio channel) */ + +#define SPI_I2SCFGR_DATLEN ((uint16_t)0x0006) /*!< DATLEN[1:0] bits (Data length to be transferred) */ +#define SPI_I2SCFGR_DATLEN_0 ((uint16_t)0x0002) /*!< Bit 0 */ +#define SPI_I2SCFGR_DATLEN_1 ((uint16_t)0x0004) /*!< Bit 1 */ + +#define SPI_I2SCFGR_CKPOL ((uint16_t)0x0008) /*!< steady state clock polarity */ + +#define SPI_I2SCFGR_I2SSTD ((uint16_t)0x0030) /*!< I2SSTD[1:0] bits (I2S standard selection) */ +#define SPI_I2SCFGR_I2SSTD_0 ((uint16_t)0x0010) /*!< Bit 0 */ +#define SPI_I2SCFGR_I2SSTD_1 ((uint16_t)0x0020) /*!< Bit 1 */ + +#define SPI_I2SCFGR_PCMSYNC ((uint16_t)0x0080) /*!< PCM frame synchronization */ + +#define SPI_I2SCFGR_I2SCFG ((uint16_t)0x0300) /*!< I2SCFG[1:0] bits (I2S configuration mode) */ +#define SPI_I2SCFGR_I2SCFG_0 ((uint16_t)0x0100) /*!< Bit 0 */ +#define SPI_I2SCFGR_I2SCFG_1 ((uint16_t)0x0200) /*!< Bit 1 */ + +#define SPI_I2SCFGR_I2SE ((uint16_t)0x0400) /*!< I2S Enable */ +#define SPI_I2SCFGR_I2SMOD ((uint16_t)0x0800) /*!< I2S mode selection */ + +/****************** Bit definition for SPI_I2SPR register *******************/ +#define SPI_I2SPR_I2SDIV ((uint16_t)0x00FF) /*!< I2S Linear prescaler */ +#define SPI_I2SPR_ODD ((uint16_t)0x0100) /*!< Odd factor for the prescaler */ +#define SPI_I2SPR_MCKOE ((uint16_t)0x0200) /*!< Master Clock Output Enable */ + +/******************************************************************************/ +/* */ +/* Inter-integrated Circuit Interface */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for I2C_CR1 register ********************/ +#define I2C_CR1_PE ((uint16_t)0x0001) /*!< Peripheral Enable */ +#define I2C_CR1_SMBUS ((uint16_t)0x0002) /*!< SMBus Mode */ +#define I2C_CR1_SMBTYPE ((uint16_t)0x0008) /*!< SMBus Type */ +#define I2C_CR1_ENARP ((uint16_t)0x0010) /*!< ARP Enable */ +#define I2C_CR1_ENPEC ((uint16_t)0x0020) /*!< PEC Enable */ +#define I2C_CR1_ENGC ((uint16_t)0x0040) /*!< General Call Enable */ +#define I2C_CR1_NOSTRETCH ((uint16_t)0x0080) /*!< Clock Stretching Disable (Slave mode) */ +#define I2C_CR1_START ((uint16_t)0x0100) /*!< Start Generation */ +#define I2C_CR1_STOP ((uint16_t)0x0200) /*!< Stop Generation */ +#define I2C_CR1_ACK ((uint16_t)0x0400) /*!< Acknowledge Enable */ +#define I2C_CR1_POS ((uint16_t)0x0800) /*!< Acknowledge/PEC Position (for data reception) */ +#define I2C_CR1_PEC ((uint16_t)0x1000) /*!< Packet Error Checking */ +#define I2C_CR1_ALERT ((uint16_t)0x2000) /*!< SMBus Alert */ +#define I2C_CR1_SWRST ((uint16_t)0x8000) /*!< Software Reset */ + +/******************* Bit definition for I2C_CR2 register ********************/ +#define I2C_CR2_FREQ ((uint16_t)0x003F) /*!< FREQ[5:0] bits (Peripheral Clock Frequency) */ +#define I2C_CR2_FREQ_0 ((uint16_t)0x0001) /*!< Bit 0 */ +#define I2C_CR2_FREQ_1 ((uint16_t)0x0002) /*!< Bit 1 */ +#define I2C_CR2_FREQ_2 ((uint16_t)0x0004) /*!< Bit 2 */ +#define I2C_CR2_FREQ_3 ((uint16_t)0x0008) /*!< Bit 3 */ +#define I2C_CR2_FREQ_4 ((uint16_t)0x0010) /*!< Bit 4 */ +#define I2C_CR2_FREQ_5 ((uint16_t)0x0020) /*!< Bit 5 */ + +#define I2C_CR2_ITERREN ((uint16_t)0x0100) /*!< Error Interrupt Enable */ +#define I2C_CR2_ITEVTEN ((uint16_t)0x0200) /*!< Event Interrupt Enable */ +#define I2C_CR2_ITBUFEN ((uint16_t)0x0400) /*!< Buffer Interrupt Enable */ +#define I2C_CR2_DMAEN ((uint16_t)0x0800) /*!< DMA Requests Enable */ +#define I2C_CR2_LAST ((uint16_t)0x1000) /*!< DMA Last Transfer */ + +/******************* Bit definition for I2C_OAR1 register *******************/ +#define I2C_OAR1_ADD1_7 ((uint16_t)0x00FE) /*!< Interface Address */ +#define I2C_OAR1_ADD8_9 ((uint16_t)0x0300) /*!< Interface Address */ + +#define I2C_OAR1_ADD0 ((uint16_t)0x0001) /*!< Bit 0 */ +#define I2C_OAR1_ADD1 ((uint16_t)0x0002) /*!< Bit 1 */ +#define I2C_OAR1_ADD2 ((uint16_t)0x0004) /*!< Bit 2 */ +#define I2C_OAR1_ADD3 ((uint16_t)0x0008) /*!< Bit 3 */ +#define I2C_OAR1_ADD4 ((uint16_t)0x0010) /*!< Bit 4 */ +#define I2C_OAR1_ADD5 ((uint16_t)0x0020) /*!< Bit 5 */ +#define I2C_OAR1_ADD6 ((uint16_t)0x0040) /*!< Bit 6 */ +#define I2C_OAR1_ADD7 ((uint16_t)0x0080) /*!< Bit 7 */ +#define I2C_OAR1_ADD8 ((uint16_t)0x0100) /*!< Bit 8 */ +#define I2C_OAR1_ADD9 ((uint16_t)0x0200) /*!< Bit 9 */ + +#define I2C_OAR1_ADDMODE ((uint16_t)0x8000) /*!< Addressing Mode (Slave mode) */ + +/******************* Bit definition for I2C_OAR2 register *******************/ +#define I2C_OAR2_ENDUAL ((uint8_t)0x01) /*!< Dual addressing mode enable */ +#define I2C_OAR2_ADD2 ((uint8_t)0xFE) /*!< Interface address */ + +/******************** Bit definition for I2C_DR register ********************/ +#define I2C_DR_DR ((uint8_t)0xFF) /*!< 8-bit Data Register */ + +/******************* Bit definition for I2C_SR1 register ********************/ +#define I2C_SR1_SB ((uint16_t)0x0001) /*!< Start Bit (Master mode) */ +#define I2C_SR1_ADDR ((uint16_t)0x0002) /*!< Address sent (master mode)/matched (slave mode) */ +#define I2C_SR1_BTF ((uint16_t)0x0004) /*!< Byte Transfer Finished */ +#define I2C_SR1_ADD10 ((uint16_t)0x0008) /*!< 10-bit header sent (Master mode) */ +#define I2C_SR1_STOPF ((uint16_t)0x0010) /*!< Stop detection (Slave mode) */ +#define I2C_SR1_RXNE ((uint16_t)0x0040) /*!< Data Register not Empty (receivers) */ +#define I2C_SR1_TXE ((uint16_t)0x0080) /*!< Data Register Empty (transmitters) */ +#define I2C_SR1_BERR ((uint16_t)0x0100) /*!< Bus Error */ +#define I2C_SR1_ARLO ((uint16_t)0x0200) /*!< Arbitration Lost (master mode) */ +#define I2C_SR1_AF ((uint16_t)0x0400) /*!< Acknowledge Failure */ +#define I2C_SR1_OVR ((uint16_t)0x0800) /*!< Overrun/Underrun */ +#define I2C_SR1_PECERR ((uint16_t)0x1000) /*!< PEC Error in reception */ +#define I2C_SR1_TIMEOUT ((uint16_t)0x4000) /*!< Timeout or Tlow Error */ +#define I2C_SR1_SMBALERT ((uint16_t)0x8000) /*!< SMBus Alert */ + +/******************* Bit definition for I2C_SR2 register ********************/ +#define I2C_SR2_MSL ((uint16_t)0x0001) /*!< Master/Slave */ +#define I2C_SR2_BUSY ((uint16_t)0x0002) /*!< Bus Busy */ +#define I2C_SR2_TRA ((uint16_t)0x0004) /*!< Transmitter/Receiver */ +#define I2C_SR2_GENCALL ((uint16_t)0x0010) /*!< General Call Address (Slave mode) */ +#define I2C_SR2_SMBDEFAULT ((uint16_t)0x0020) /*!< SMBus Device Default Address (Slave mode) */ +#define I2C_SR2_SMBHOST ((uint16_t)0x0040) /*!< SMBus Host Header (Slave mode) */ +#define I2C_SR2_DUALF ((uint16_t)0x0080) /*!< Dual Flag (Slave mode) */ +#define I2C_SR2_PEC ((uint16_t)0xFF00) /*!< Packet Error Checking Register */ + +/******************* Bit definition for I2C_CCR register ********************/ +#define I2C_CCR_CCR ((uint16_t)0x0FFF) /*!< Clock Control Register in Fast/Standard mode (Master mode) */ +#define I2C_CCR_DUTY ((uint16_t)0x4000) /*!< Fast Mode Duty Cycle */ +#define I2C_CCR_FS ((uint16_t)0x8000) /*!< I2C Master Mode Selection */ + +/****************** Bit definition for I2C_TRISE register *******************/ +#define I2C_TRISE_TRISE ((uint8_t)0x3F) /*!< Maximum Rise Time in Fast/Standard mode (Master mode) */ + +/******************************************************************************/ +/* */ +/* Universal Synchronous Asynchronous Receiver Transmitter */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for USART_SR register *******************/ +#define USART_SR_PE ((uint16_t)0x0001) /*!< Parity Error */ +#define USART_SR_FE ((uint16_t)0x0002) /*!< Framing Error */ +#define USART_SR_NE ((uint16_t)0x0004) /*!< Noise Error Flag */ +#define USART_SR_ORE ((uint16_t)0x0008) /*!< OverRun Error */ +#define USART_SR_IDLE ((uint16_t)0x0010) /*!< IDLE line detected */ +#define USART_SR_RXNE ((uint16_t)0x0020) /*!< Read Data Register Not Empty */ +#define USART_SR_TC ((uint16_t)0x0040) /*!< Transmission Complete */ +#define USART_SR_TXE ((uint16_t)0x0080) /*!< Transmit Data Register Empty */ +#define USART_SR_LBD ((uint16_t)0x0100) /*!< LIN Break Detection Flag */ +#define USART_SR_CTS ((uint16_t)0x0200) /*!< CTS Flag */ + +/******************* Bit definition for USART_DR register *******************/ +#define USART_DR_DR ((uint16_t)0x01FF) /*!< Data value */ + +/****************** Bit definition for USART_BRR register *******************/ +#define USART_BRR_DIV_Fraction ((uint16_t)0x000F) /*!< Fraction of USARTDIV */ +#define USART_BRR_DIV_Mantissa ((uint16_t)0xFFF0) /*!< Mantissa of USARTDIV */ + +/****************** Bit definition for USART_CR1 register *******************/ +#define USART_CR1_SBK ((uint16_t)0x0001) /*!< Send Break */ +#define USART_CR1_RWU ((uint16_t)0x0002) /*!< Receiver wakeup */ +#define USART_CR1_RE ((uint16_t)0x0004) /*!< Receiver Enable */ +#define USART_CR1_TE ((uint16_t)0x0008) /*!< Transmitter Enable */ +#define USART_CR1_IDLEIE ((uint16_t)0x0010) /*!< IDLE Interrupt Enable */ +#define USART_CR1_RXNEIE ((uint16_t)0x0020) /*!< RXNE Interrupt Enable */ +#define USART_CR1_TCIE ((uint16_t)0x0040) /*!< Transmission Complete Interrupt Enable */ +#define USART_CR1_TXEIE ((uint16_t)0x0080) /*!< PE Interrupt Enable */ +#define USART_CR1_PEIE ((uint16_t)0x0100) /*!< PE Interrupt Enable */ +#define USART_CR1_PS ((uint16_t)0x0200) /*!< Parity Selection */ +#define USART_CR1_PCE ((uint16_t)0x0400) /*!< Parity Control Enable */ +#define USART_CR1_WAKE ((uint16_t)0x0800) /*!< Wakeup method */ +#define USART_CR1_M ((uint16_t)0x1000) /*!< Word length */ +#define USART_CR1_UE ((uint16_t)0x2000) /*!< USART Enable */ +#define USART_CR1_OVER8 ((uint16_t)0x8000) /*!< USART Oversmapling 8-bits */ + +/****************** Bit definition for USART_CR2 register *******************/ +#define USART_CR2_ADD ((uint16_t)0x000F) /*!< Address of the USART node */ +#define USART_CR2_LBDL ((uint16_t)0x0020) /*!< LIN Break Detection Length */ +#define USART_CR2_LBDIE ((uint16_t)0x0040) /*!< LIN Break Detection Interrupt Enable */ +#define USART_CR2_LBCL ((uint16_t)0x0100) /*!< Last Bit Clock pulse */ +#define USART_CR2_CPHA ((uint16_t)0x0200) /*!< Clock Phase */ +#define USART_CR2_CPOL ((uint16_t)0x0400) /*!< Clock Polarity */ +#define USART_CR2_CLKEN ((uint16_t)0x0800) /*!< Clock Enable */ + +#define USART_CR2_STOP ((uint16_t)0x3000) /*!< STOP[1:0] bits (STOP bits) */ +#define USART_CR2_STOP_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define USART_CR2_STOP_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define USART_CR2_LINEN ((uint16_t)0x4000) /*!< LIN mode enable */ + +/****************** Bit definition for USART_CR3 register *******************/ +#define USART_CR3_EIE ((uint16_t)0x0001) /*!< Error Interrupt Enable */ +#define USART_CR3_IREN ((uint16_t)0x0002) /*!< IrDA mode Enable */ +#define USART_CR3_IRLP ((uint16_t)0x0004) /*!< IrDA Low-Power */ +#define USART_CR3_HDSEL ((uint16_t)0x0008) /*!< Half-Duplex Selection */ +#define USART_CR3_NACK ((uint16_t)0x0010) /*!< Smartcard NACK enable */ +#define USART_CR3_SCEN ((uint16_t)0x0020) /*!< Smartcard mode enable */ +#define USART_CR3_DMAR ((uint16_t)0x0040) /*!< DMA Enable Receiver */ +#define USART_CR3_DMAT ((uint16_t)0x0080) /*!< DMA Enable Transmitter */ +#define USART_CR3_RTSE ((uint16_t)0x0100) /*!< RTS Enable */ +#define USART_CR3_CTSE ((uint16_t)0x0200) /*!< CTS Enable */ +#define USART_CR3_CTSIE ((uint16_t)0x0400) /*!< CTS Interrupt Enable */ +#define USART_CR3_ONEBIT ((uint16_t)0x0800) /*!< One Bit method */ + +/****************** Bit definition for USART_GTPR register ******************/ +#define USART_GTPR_PSC ((uint16_t)0x00FF) /*!< PSC[7:0] bits (Prescaler value) */ +#define USART_GTPR_PSC_0 ((uint16_t)0x0001) /*!< Bit 0 */ +#define USART_GTPR_PSC_1 ((uint16_t)0x0002) /*!< Bit 1 */ +#define USART_GTPR_PSC_2 ((uint16_t)0x0004) /*!< Bit 2 */ +#define USART_GTPR_PSC_3 ((uint16_t)0x0008) /*!< Bit 3 */ +#define USART_GTPR_PSC_4 ((uint16_t)0x0010) /*!< Bit 4 */ +#define USART_GTPR_PSC_5 ((uint16_t)0x0020) /*!< Bit 5 */ +#define USART_GTPR_PSC_6 ((uint16_t)0x0040) /*!< Bit 6 */ +#define USART_GTPR_PSC_7 ((uint16_t)0x0080) /*!< Bit 7 */ + +#define USART_GTPR_GT ((uint16_t)0xFF00) /*!< Guard time value */ + +/******************************************************************************/ +/* */ +/* Debug MCU */ +/* */ +/******************************************************************************/ + +/**************** Bit definition for DBGMCU_IDCODE register *****************/ +#define DBGMCU_IDCODE_DEV_ID ((uint32_t)0x00000FFF) /*!< Device Identifier */ + +#define DBGMCU_IDCODE_REV_ID ((uint32_t)0xFFFF0000) /*!< REV_ID[15:0] bits (Revision Identifier) */ +#define DBGMCU_IDCODE_REV_ID_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define DBGMCU_IDCODE_REV_ID_1 ((uint32_t)0x00020000) /*!< Bit 1 */ +#define DBGMCU_IDCODE_REV_ID_2 ((uint32_t)0x00040000) /*!< Bit 2 */ +#define DBGMCU_IDCODE_REV_ID_3 ((uint32_t)0x00080000) /*!< Bit 3 */ +#define DBGMCU_IDCODE_REV_ID_4 ((uint32_t)0x00100000) /*!< Bit 4 */ +#define DBGMCU_IDCODE_REV_ID_5 ((uint32_t)0x00200000) /*!< Bit 5 */ +#define DBGMCU_IDCODE_REV_ID_6 ((uint32_t)0x00400000) /*!< Bit 6 */ +#define DBGMCU_IDCODE_REV_ID_7 ((uint32_t)0x00800000) /*!< Bit 7 */ +#define DBGMCU_IDCODE_REV_ID_8 ((uint32_t)0x01000000) /*!< Bit 8 */ +#define DBGMCU_IDCODE_REV_ID_9 ((uint32_t)0x02000000) /*!< Bit 9 */ +#define DBGMCU_IDCODE_REV_ID_10 ((uint32_t)0x04000000) /*!< Bit 10 */ +#define DBGMCU_IDCODE_REV_ID_11 ((uint32_t)0x08000000) /*!< Bit 11 */ +#define DBGMCU_IDCODE_REV_ID_12 ((uint32_t)0x10000000) /*!< Bit 12 */ +#define DBGMCU_IDCODE_REV_ID_13 ((uint32_t)0x20000000) /*!< Bit 13 */ +#define DBGMCU_IDCODE_REV_ID_14 ((uint32_t)0x40000000) /*!< Bit 14 */ +#define DBGMCU_IDCODE_REV_ID_15 ((uint32_t)0x80000000) /*!< Bit 15 */ + +/****************** Bit definition for DBGMCU_CR register *******************/ +#define DBGMCU_CR_DBG_SLEEP ((uint32_t)0x00000001) /*!< Debug Sleep Mode */ +#define DBGMCU_CR_DBG_STOP ((uint32_t)0x00000002) /*!< Debug Stop Mode */ +#define DBGMCU_CR_DBG_STANDBY ((uint32_t)0x00000004) /*!< Debug Standby mode */ +#define DBGMCU_CR_TRACE_IOEN ((uint32_t)0x00000020) /*!< Trace Pin Assignment Control */ + +#define DBGMCU_CR_TRACE_MODE ((uint32_t)0x000000C0) /*!< TRACE_MODE[1:0] bits (Trace Pin Assignment Control) */ +#define DBGMCU_CR_TRACE_MODE_0 ((uint32_t)0x00000040) /*!< Bit 0 */ +#define DBGMCU_CR_TRACE_MODE_1 ((uint32_t)0x00000080) /*!< Bit 1 */ + +#define DBGMCU_CR_DBG_IWDG_STOP ((uint32_t)0x00000100) /*!< Debug Independent Watchdog stopped when Core is halted */ +#define DBGMCU_CR_DBG_WWDG_STOP ((uint32_t)0x00000200) /*!< Debug Window Watchdog stopped when Core is halted */ +#define DBGMCU_CR_DBG_TIM1_STOP ((uint32_t)0x00000400) /*!< TIM1 counter stopped when core is halted */ +#define DBGMCU_CR_DBG_TIM2_STOP ((uint32_t)0x00000800) /*!< TIM2 counter stopped when core is halted */ +#define DBGMCU_CR_DBG_TIM3_STOP ((uint32_t)0x00001000) /*!< TIM3 counter stopped when core is halted */ +#define DBGMCU_CR_DBG_TIM4_STOP ((uint32_t)0x00002000) /*!< TIM4 counter stopped when core is halted */ +#define DBGMCU_CR_DBG_CAN1_STOP ((uint32_t)0x00004000) /*!< Debug CAN1 stopped when Core is halted */ +#define DBGMCU_CR_DBG_I2C1_SMBUS_TIMEOUT ((uint32_t)0x00008000) /*!< SMBUS timeout mode stopped when Core is halted */ +#define DBGMCU_CR_DBG_I2C2_SMBUS_TIMEOUT ((uint32_t)0x00010000) /*!< SMBUS timeout mode stopped when Core is halted */ +#define DBGMCU_CR_DBG_TIM8_STOP ((uint32_t)0x00020000) /*!< TIM8 counter stopped when core is halted */ +#define DBGMCU_CR_DBG_TIM5_STOP ((uint32_t)0x00040000) /*!< TIM5 counter stopped when core is halted */ +#define DBGMCU_CR_DBG_TIM6_STOP ((uint32_t)0x00080000) /*!< TIM6 counter stopped when core is halted */ +#define DBGMCU_CR_DBG_TIM7_STOP ((uint32_t)0x00100000) /*!< TIM7 counter stopped when core is halted */ +#define DBGMCU_CR_DBG_CAN2_STOP ((uint32_t)0x00200000) /*!< Debug CAN2 stopped when Core is halted */ +#define DBGMCU_CR_DBG_TIM15_STOP ((uint32_t)0x00400000) /*!< Debug TIM15 stopped when Core is halted */ +#define DBGMCU_CR_DBG_TIM16_STOP ((uint32_t)0x00800000) /*!< Debug TIM16 stopped when Core is halted */ +#define DBGMCU_CR_DBG_TIM17_STOP ((uint32_t)0x01000000) /*!< Debug TIM17 stopped when Core is halted */ +#define DBGMCU_CR_DBG_TIM12_STOP ((uint32_t)0x02000000) /*!< Debug TIM12 stopped when Core is halted */ +#define DBGMCU_CR_DBG_TIM13_STOP ((uint32_t)0x04000000) /*!< Debug TIM13 stopped when Core is halted */ +#define DBGMCU_CR_DBG_TIM14_STOP ((uint32_t)0x08000000) /*!< Debug TIM14 stopped when Core is halted */ +#define DBGMCU_CR_DBG_TIM9_STOP ((uint32_t)0x10000000) /*!< Debug TIM9 stopped when Core is halted */ +#define DBGMCU_CR_DBG_TIM10_STOP ((uint32_t)0x20000000) /*!< Debug TIM10 stopped when Core is halted */ +#define DBGMCU_CR_DBG_TIM11_STOP ((uint32_t)0x40000000) /*!< Debug TIM11 stopped when Core is halted */ + +/******************************************************************************/ +/* */ +/* FLASH and Option Bytes Registers */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for FLASH_ACR register ******************/ +#define FLASH_ACR_LATENCY ((uint8_t)0x03) /*!< LATENCY[2:0] bits (Latency) */ +#define FLASH_ACR_LATENCY_0 ((uint8_t)0x00) /*!< Bit 0 */ +#define FLASH_ACR_LATENCY_1 ((uint8_t)0x01) /*!< Bit 0 */ +#define FLASH_ACR_LATENCY_2 ((uint8_t)0x02) /*!< Bit 1 */ + +#define FLASH_ACR_HLFCYA ((uint8_t)0x08) /*!< Flash Half Cycle Access Enable */ +#define FLASH_ACR_PRFTBE ((uint8_t)0x10) /*!< Prefetch Buffer Enable */ +#define FLASH_ACR_PRFTBS ((uint8_t)0x20) /*!< Prefetch Buffer Status */ + +/****************** Bit definition for FLASH_KEYR register ******************/ +#define FLASH_KEYR_FKEYR ((uint32_t)0xFFFFFFFF) /*!< FPEC Key */ + +/***************** Bit definition for FLASH_OPTKEYR register ****************/ +#define FLASH_OPTKEYR_OPTKEYR ((uint32_t)0xFFFFFFFF) /*!< Option Byte Key */ + +/****************** Bit definition for FLASH_SR register *******************/ +#define FLASH_SR_BSY ((uint8_t)0x01) /*!< Busy */ +#define FLASH_SR_PGERR ((uint8_t)0x04) /*!< Programming Error */ +#define FLASH_SR_WRPRTERR ((uint8_t)0x10) /*!< Write Protection Error */ +#define FLASH_SR_EOP ((uint8_t)0x20) /*!< End of operation */ + +/******************* Bit definition for FLASH_CR register *******************/ +#define FLASH_CR_PG ((uint16_t)0x0001) /*!< Programming */ +#define FLASH_CR_PER ((uint16_t)0x0002) /*!< Page Erase */ +#define FLASH_CR_MER ((uint16_t)0x0004) /*!< Mass Erase */ +#define FLASH_CR_OPTPG ((uint16_t)0x0010) /*!< Option Byte Programming */ +#define FLASH_CR_OPTER ((uint16_t)0x0020) /*!< Option Byte Erase */ +#define FLASH_CR_STRT ((uint16_t)0x0040) /*!< Start */ +#define FLASH_CR_LOCK ((uint16_t)0x0080) /*!< Lock */ +#define FLASH_CR_OPTWRE ((uint16_t)0x0200) /*!< Option Bytes Write Enable */ +#define FLASH_CR_ERRIE ((uint16_t)0x0400) /*!< Error Interrupt Enable */ +#define FLASH_CR_EOPIE ((uint16_t)0x1000) /*!< End of operation interrupt enable */ + +/******************* Bit definition for FLASH_AR register *******************/ +#define FLASH_AR_FAR ((uint32_t)0xFFFFFFFF) /*!< Flash Address */ + +/****************** Bit definition for FLASH_OBR register *******************/ +#define FLASH_OBR_OPTERR ((uint16_t)0x0001) /*!< Option Byte Error */ +#define FLASH_OBR_RDPRT ((uint16_t)0x0002) /*!< Read protection */ + +#define FLASH_OBR_USER ((uint16_t)0x03FC) /*!< User Option Bytes */ +#define FLASH_OBR_WDG_SW ((uint16_t)0x0004) /*!< WDG_SW */ +#define FLASH_OBR_nRST_STOP ((uint16_t)0x0008) /*!< nRST_STOP */ +#define FLASH_OBR_nRST_STDBY ((uint16_t)0x0010) /*!< nRST_STDBY */ +#define FLASH_OBR_BFB2 ((uint16_t)0x0020) /*!< BFB2 */ + +/****************** Bit definition for FLASH_WRPR register ******************/ +#define FLASH_WRPR_WRP ((uint32_t)0xFFFFFFFF) /*!< Write Protect */ + +/*----------------------------------------------------------------------------*/ + +/****************** Bit definition for FLASH_RDP register *******************/ +#define FLASH_RDP_RDP ((uint32_t)0x000000FF) /*!< Read protection option byte */ +#define FLASH_RDP_nRDP ((uint32_t)0x0000FF00) /*!< Read protection complemented option byte */ + +/****************** Bit definition for FLASH_USER register ******************/ +#define FLASH_USER_USER ((uint32_t)0x00FF0000) /*!< User option byte */ +#define FLASH_USER_nUSER ((uint32_t)0xFF000000) /*!< User complemented option byte */ + +/****************** Bit definition for FLASH_Data0 register *****************/ +#define FLASH_Data0_Data0 ((uint32_t)0x000000FF) /*!< User data storage option byte */ +#define FLASH_Data0_nData0 ((uint32_t)0x0000FF00) /*!< User data storage complemented option byte */ + +/****************** Bit definition for FLASH_Data1 register *****************/ +#define FLASH_Data1_Data1 ((uint32_t)0x00FF0000) /*!< User data storage option byte */ +#define FLASH_Data1_nData1 ((uint32_t)0xFF000000) /*!< User data storage complemented option byte */ + +/****************** Bit definition for FLASH_WRP0 register ******************/ +#define FLASH_WRP0_WRP0 ((uint32_t)0x000000FF) /*!< Flash memory write protection option bytes */ +#define FLASH_WRP0_nWRP0 ((uint32_t)0x0000FF00) /*!< Flash memory write protection complemented option bytes */ + +/****************** Bit definition for FLASH_WRP1 register ******************/ +#define FLASH_WRP1_WRP1 ((uint32_t)0x00FF0000) /*!< Flash memory write protection option bytes */ +#define FLASH_WRP1_nWRP1 ((uint32_t)0xFF000000) /*!< Flash memory write protection complemented option bytes */ + +/****************** Bit definition for FLASH_WRP2 register ******************/ +#define FLASH_WRP2_WRP2 ((uint32_t)0x000000FF) /*!< Flash memory write protection option bytes */ +#define FLASH_WRP2_nWRP2 ((uint32_t)0x0000FF00) /*!< Flash memory write protection complemented option bytes */ + +/****************** Bit definition for FLASH_WRP3 register ******************/ +#define FLASH_WRP3_WRP3 ((uint32_t)0x00FF0000) /*!< Flash memory write protection option bytes */ +#define FLASH_WRP3_nWRP3 ((uint32_t)0xFF000000) /*!< Flash memory write protection complemented option bytes */ + +#ifdef STM32F10X_CL +/******************************************************************************/ +/* Ethernet MAC Registers bits definitions */ +/******************************************************************************/ +/* Bit definition for Ethernet MAC Control Register register */ +#define ETH_MACCR_WD ((uint32_t)0x00800000) /* Watchdog disable */ +#define ETH_MACCR_JD ((uint32_t)0x00400000) /* Jabber disable */ +#define ETH_MACCR_IFG ((uint32_t)0x000E0000) /* Inter-frame gap */ + #define ETH_MACCR_IFG_96Bit ((uint32_t)0x00000000) /* Minimum IFG between frames during transmission is 96Bit */ + #define ETH_MACCR_IFG_88Bit ((uint32_t)0x00020000) /* Minimum IFG between frames during transmission is 88Bit */ + #define ETH_MACCR_IFG_80Bit ((uint32_t)0x00040000) /* Minimum IFG between frames during transmission is 80Bit */ + #define ETH_MACCR_IFG_72Bit ((uint32_t)0x00060000) /* Minimum IFG between frames during transmission is 72Bit */ + #define ETH_MACCR_IFG_64Bit ((uint32_t)0x00080000) /* Minimum IFG between frames during transmission is 64Bit */ + #define ETH_MACCR_IFG_56Bit ((uint32_t)0x000A0000) /* Minimum IFG between frames during transmission is 56Bit */ + #define ETH_MACCR_IFG_48Bit ((uint32_t)0x000C0000) /* Minimum IFG between frames during transmission is 48Bit */ + #define ETH_MACCR_IFG_40Bit ((uint32_t)0x000E0000) /* Minimum IFG between frames during transmission is 40Bit */ +#define ETH_MACCR_CSD ((uint32_t)0x00010000) /* Carrier sense disable (during transmission) */ +#define ETH_MACCR_FES ((uint32_t)0x00004000) /* Fast ethernet speed */ +#define ETH_MACCR_ROD ((uint32_t)0x00002000) /* Receive own disable */ +#define ETH_MACCR_LM ((uint32_t)0x00001000) /* loopback mode */ +#define ETH_MACCR_DM ((uint32_t)0x00000800) /* Duplex mode */ +#define ETH_MACCR_IPCO ((uint32_t)0x00000400) /* IP Checksum offload */ +#define ETH_MACCR_RD ((uint32_t)0x00000200) /* Retry disable */ +#define ETH_MACCR_APCS ((uint32_t)0x00000080) /* Automatic Pad/CRC stripping */ +#define ETH_MACCR_BL ((uint32_t)0x00000060) /* Back-off limit: random integer number (r) of slot time delays before rescheduling + a transmission attempt during retries after a collision: 0 =< r <2^k */ + #define ETH_MACCR_BL_10 ((uint32_t)0x00000000) /* k = min (n, 10) */ + #define ETH_MACCR_BL_8 ((uint32_t)0x00000020) /* k = min (n, 8) */ + #define ETH_MACCR_BL_4 ((uint32_t)0x00000040) /* k = min (n, 4) */ + #define ETH_MACCR_BL_1 ((uint32_t)0x00000060) /* k = min (n, 1) */ +#define ETH_MACCR_DC ((uint32_t)0x00000010) /* Defferal check */ +#define ETH_MACCR_TE ((uint32_t)0x00000008) /* Transmitter enable */ +#define ETH_MACCR_RE ((uint32_t)0x00000004) /* Receiver enable */ + +/* Bit definition for Ethernet MAC Frame Filter Register */ +#define ETH_MACFFR_RA ((uint32_t)0x80000000) /* Receive all */ +#define ETH_MACFFR_HPF ((uint32_t)0x00000400) /* Hash or perfect filter */ +#define ETH_MACFFR_SAF ((uint32_t)0x00000200) /* Source address filter enable */ +#define ETH_MACFFR_SAIF ((uint32_t)0x00000100) /* SA inverse filtering */ +#define ETH_MACFFR_PCF ((uint32_t)0x000000C0) /* Pass control frames: 3 cases */ + #define ETH_MACFFR_PCF_BlockAll ((uint32_t)0x00000040) /* MAC filters all control frames from reaching the application */ + #define ETH_MACFFR_PCF_ForwardAll ((uint32_t)0x00000080) /* MAC forwards all control frames to application even if they fail the Address Filter */ + #define ETH_MACFFR_PCF_ForwardPassedAddrFilter ((uint32_t)0x000000C0) /* MAC forwards control frames that pass the Address Filter. */ +#define ETH_MACFFR_BFD ((uint32_t)0x00000020) /* Broadcast frame disable */ +#define ETH_MACFFR_PAM ((uint32_t)0x00000010) /* Pass all mutlicast */ +#define ETH_MACFFR_DAIF ((uint32_t)0x00000008) /* DA Inverse filtering */ +#define ETH_MACFFR_HM ((uint32_t)0x00000004) /* Hash multicast */ +#define ETH_MACFFR_HU ((uint32_t)0x00000002) /* Hash unicast */ +#define ETH_MACFFR_PM ((uint32_t)0x00000001) /* Promiscuous mode */ + +/* Bit definition for Ethernet MAC Hash Table High Register */ +#define ETH_MACHTHR_HTH ((uint32_t)0xFFFFFFFF) /* Hash table high */ + +/* Bit definition for Ethernet MAC Hash Table Low Register */ +#define ETH_MACHTLR_HTL ((uint32_t)0xFFFFFFFF) /* Hash table low */ + +/* Bit definition for Ethernet MAC MII Address Register */ +#define ETH_MACMIIAR_PA ((uint32_t)0x0000F800) /* Physical layer address */ +#define ETH_MACMIIAR_MR ((uint32_t)0x000007C0) /* MII register in the selected PHY */ +#define ETH_MACMIIAR_CR ((uint32_t)0x0000001C) /* CR clock range: 6 cases */ + #define ETH_MACMIIAR_CR_Div42 ((uint32_t)0x00000000) /* HCLK:60-72 MHz; MDC clock= HCLK/42 */ + #define ETH_MACMIIAR_CR_Div16 ((uint32_t)0x00000008) /* HCLK:20-35 MHz; MDC clock= HCLK/16 */ + #define ETH_MACMIIAR_CR_Div26 ((uint32_t)0x0000000C) /* HCLK:35-60 MHz; MDC clock= HCLK/26 */ +#define ETH_MACMIIAR_MW ((uint32_t)0x00000002) /* MII write */ +#define ETH_MACMIIAR_MB ((uint32_t)0x00000001) /* MII busy */ + +/* Bit definition for Ethernet MAC MII Data Register */ +#define ETH_MACMIIDR_MD ((uint32_t)0x0000FFFF) /* MII data: read/write data from/to PHY */ + +/* Bit definition for Ethernet MAC Flow Control Register */ +#define ETH_MACFCR_PT ((uint32_t)0xFFFF0000) /* Pause time */ +#define ETH_MACFCR_ZQPD ((uint32_t)0x00000080) /* Zero-quanta pause disable */ +#define ETH_MACFCR_PLT ((uint32_t)0x00000030) /* Pause low threshold: 4 cases */ + #define ETH_MACFCR_PLT_Minus4 ((uint32_t)0x00000000) /* Pause time minus 4 slot times */ + #define ETH_MACFCR_PLT_Minus28 ((uint32_t)0x00000010) /* Pause time minus 28 slot times */ + #define ETH_MACFCR_PLT_Minus144 ((uint32_t)0x00000020) /* Pause time minus 144 slot times */ + #define ETH_MACFCR_PLT_Minus256 ((uint32_t)0x00000030) /* Pause time minus 256 slot times */ +#define ETH_MACFCR_UPFD ((uint32_t)0x00000008) /* Unicast pause frame detect */ +#define ETH_MACFCR_RFCE ((uint32_t)0x00000004) /* Receive flow control enable */ +#define ETH_MACFCR_TFCE ((uint32_t)0x00000002) /* Transmit flow control enable */ +#define ETH_MACFCR_FCBBPA ((uint32_t)0x00000001) /* Flow control busy/backpressure activate */ + +/* Bit definition for Ethernet MAC VLAN Tag Register */ +#define ETH_MACVLANTR_VLANTC ((uint32_t)0x00010000) /* 12-bit VLAN tag comparison */ +#define ETH_MACVLANTR_VLANTI ((uint32_t)0x0000FFFF) /* VLAN tag identifier (for receive frames) */ + +/* Bit definition for Ethernet MAC Remote Wake-UpFrame Filter Register */ +#define ETH_MACRWUFFR_D ((uint32_t)0xFFFFFFFF) /* Wake-up frame filter register data */ +/* Eight sequential Writes to this address (offset 0x28) will write all Wake-UpFrame Filter Registers. + Eight sequential Reads from this address (offset 0x28) will read all Wake-UpFrame Filter Registers. */ +/* Wake-UpFrame Filter Reg0 : Filter 0 Byte Mask + Wake-UpFrame Filter Reg1 : Filter 1 Byte Mask + Wake-UpFrame Filter Reg2 : Filter 2 Byte Mask + Wake-UpFrame Filter Reg3 : Filter 3 Byte Mask + Wake-UpFrame Filter Reg4 : RSVD - Filter3 Command - RSVD - Filter2 Command - + RSVD - Filter1 Command - RSVD - Filter0 Command + Wake-UpFrame Filter Re5 : Filter3 Offset - Filter2 Offset - Filter1 Offset - Filter0 Offset + Wake-UpFrame Filter Re6 : Filter1 CRC16 - Filter0 CRC16 + Wake-UpFrame Filter Re7 : Filter3 CRC16 - Filter2 CRC16 */ + +/* Bit definition for Ethernet MAC PMT Control and Status Register */ +#define ETH_MACPMTCSR_WFFRPR ((uint32_t)0x80000000) /* Wake-Up Frame Filter Register Pointer Reset */ +#define ETH_MACPMTCSR_GU ((uint32_t)0x00000200) /* Global Unicast */ +#define ETH_MACPMTCSR_WFR ((uint32_t)0x00000040) /* Wake-Up Frame Received */ +#define ETH_MACPMTCSR_MPR ((uint32_t)0x00000020) /* Magic Packet Received */ +#define ETH_MACPMTCSR_WFE ((uint32_t)0x00000004) /* Wake-Up Frame Enable */ +#define ETH_MACPMTCSR_MPE ((uint32_t)0x00000002) /* Magic Packet Enable */ +#define ETH_MACPMTCSR_PD ((uint32_t)0x00000001) /* Power Down */ + +/* Bit definition for Ethernet MAC Status Register */ +#define ETH_MACSR_TSTS ((uint32_t)0x00000200) /* Time stamp trigger status */ +#define ETH_MACSR_MMCTS ((uint32_t)0x00000040) /* MMC transmit status */ +#define ETH_MACSR_MMMCRS ((uint32_t)0x00000020) /* MMC receive status */ +#define ETH_MACSR_MMCS ((uint32_t)0x00000010) /* MMC status */ +#define ETH_MACSR_PMTS ((uint32_t)0x00000008) /* PMT status */ + +/* Bit definition for Ethernet MAC Interrupt Mask Register */ +#define ETH_MACIMR_TSTIM ((uint32_t)0x00000200) /* Time stamp trigger interrupt mask */ +#define ETH_MACIMR_PMTIM ((uint32_t)0x00000008) /* PMT interrupt mask */ + +/* Bit definition for Ethernet MAC Address0 High Register */ +#define ETH_MACA0HR_MACA0H ((uint32_t)0x0000FFFF) /* MAC address0 high */ + +/* Bit definition for Ethernet MAC Address0 Low Register */ +#define ETH_MACA0LR_MACA0L ((uint32_t)0xFFFFFFFF) /* MAC address0 low */ + +/* Bit definition for Ethernet MAC Address1 High Register */ +#define ETH_MACA1HR_AE ((uint32_t)0x80000000) /* Address enable */ +#define ETH_MACA1HR_SA ((uint32_t)0x40000000) /* Source address */ +#define ETH_MACA1HR_MBC ((uint32_t)0x3F000000) /* Mask byte control: bits to mask for comparison of the MAC Address bytes */ + #define ETH_MACA1HR_MBC_HBits15_8 ((uint32_t)0x20000000) /* Mask MAC Address high reg bits [15:8] */ + #define ETH_MACA1HR_MBC_HBits7_0 ((uint32_t)0x10000000) /* Mask MAC Address high reg bits [7:0] */ + #define ETH_MACA1HR_MBC_LBits31_24 ((uint32_t)0x08000000) /* Mask MAC Address low reg bits [31:24] */ + #define ETH_MACA1HR_MBC_LBits23_16 ((uint32_t)0x04000000) /* Mask MAC Address low reg bits [23:16] */ + #define ETH_MACA1HR_MBC_LBits15_8 ((uint32_t)0x02000000) /* Mask MAC Address low reg bits [15:8] */ + #define ETH_MACA1HR_MBC_LBits7_0 ((uint32_t)0x01000000) /* Mask MAC Address low reg bits [7:0] */ +#define ETH_MACA1HR_MACA1H ((uint32_t)0x0000FFFF) /* MAC address1 high */ + +/* Bit definition for Ethernet MAC Address1 Low Register */ +#define ETH_MACA1LR_MACA1L ((uint32_t)0xFFFFFFFF) /* MAC address1 low */ + +/* Bit definition for Ethernet MAC Address2 High Register */ +#define ETH_MACA2HR_AE ((uint32_t)0x80000000) /* Address enable */ +#define ETH_MACA2HR_SA ((uint32_t)0x40000000) /* Source address */ +#define ETH_MACA2HR_MBC ((uint32_t)0x3F000000) /* Mask byte control */ + #define ETH_MACA2HR_MBC_HBits15_8 ((uint32_t)0x20000000) /* Mask MAC Address high reg bits [15:8] */ + #define ETH_MACA2HR_MBC_HBits7_0 ((uint32_t)0x10000000) /* Mask MAC Address high reg bits [7:0] */ + #define ETH_MACA2HR_MBC_LBits31_24 ((uint32_t)0x08000000) /* Mask MAC Address low reg bits [31:24] */ + #define ETH_MACA2HR_MBC_LBits23_16 ((uint32_t)0x04000000) /* Mask MAC Address low reg bits [23:16] */ + #define ETH_MACA2HR_MBC_LBits15_8 ((uint32_t)0x02000000) /* Mask MAC Address low reg bits [15:8] */ + #define ETH_MACA2HR_MBC_LBits7_0 ((uint32_t)0x01000000) /* Mask MAC Address low reg bits [70] */ +#define ETH_MACA2HR_MACA2H ((uint32_t)0x0000FFFF) /* MAC address1 high */ + +/* Bit definition for Ethernet MAC Address2 Low Register */ +#define ETH_MACA2LR_MACA2L ((uint32_t)0xFFFFFFFF) /* MAC address2 low */ + +/* Bit definition for Ethernet MAC Address3 High Register */ +#define ETH_MACA3HR_AE ((uint32_t)0x80000000) /* Address enable */ +#define ETH_MACA3HR_SA ((uint32_t)0x40000000) /* Source address */ +#define ETH_MACA3HR_MBC ((uint32_t)0x3F000000) /* Mask byte control */ + #define ETH_MACA3HR_MBC_HBits15_8 ((uint32_t)0x20000000) /* Mask MAC Address high reg bits [15:8] */ + #define ETH_MACA3HR_MBC_HBits7_0 ((uint32_t)0x10000000) /* Mask MAC Address high reg bits [7:0] */ + #define ETH_MACA3HR_MBC_LBits31_24 ((uint32_t)0x08000000) /* Mask MAC Address low reg bits [31:24] */ + #define ETH_MACA3HR_MBC_LBits23_16 ((uint32_t)0x04000000) /* Mask MAC Address low reg bits [23:16] */ + #define ETH_MACA3HR_MBC_LBits15_8 ((uint32_t)0x02000000) /* Mask MAC Address low reg bits [15:8] */ + #define ETH_MACA3HR_MBC_LBits7_0 ((uint32_t)0x01000000) /* Mask MAC Address low reg bits [70] */ +#define ETH_MACA3HR_MACA3H ((uint32_t)0x0000FFFF) /* MAC address3 high */ + +/* Bit definition for Ethernet MAC Address3 Low Register */ +#define ETH_MACA3LR_MACA3L ((uint32_t)0xFFFFFFFF) /* MAC address3 low */ + +/******************************************************************************/ +/* Ethernet MMC Registers bits definition */ +/******************************************************************************/ + +/* Bit definition for Ethernet MMC Contol Register */ +#define ETH_MMCCR_MCF ((uint32_t)0x00000008) /* MMC Counter Freeze */ +#define ETH_MMCCR_ROR ((uint32_t)0x00000004) /* Reset on Read */ +#define ETH_MMCCR_CSR ((uint32_t)0x00000002) /* Counter Stop Rollover */ +#define ETH_MMCCR_CR ((uint32_t)0x00000001) /* Counters Reset */ + +/* Bit definition for Ethernet MMC Receive Interrupt Register */ +#define ETH_MMCRIR_RGUFS ((uint32_t)0x00020000) /* Set when Rx good unicast frames counter reaches half the maximum value */ +#define ETH_MMCRIR_RFAES ((uint32_t)0x00000040) /* Set when Rx alignment error counter reaches half the maximum value */ +#define ETH_MMCRIR_RFCES ((uint32_t)0x00000020) /* Set when Rx crc error counter reaches half the maximum value */ + +/* Bit definition for Ethernet MMC Transmit Interrupt Register */ +#define ETH_MMCTIR_TGFS ((uint32_t)0x00200000) /* Set when Tx good frame count counter reaches half the maximum value */ +#define ETH_MMCTIR_TGFMSCS ((uint32_t)0x00008000) /* Set when Tx good multi col counter reaches half the maximum value */ +#define ETH_MMCTIR_TGFSCS ((uint32_t)0x00004000) /* Set when Tx good single col counter reaches half the maximum value */ + +/* Bit definition for Ethernet MMC Receive Interrupt Mask Register */ +#define ETH_MMCRIMR_RGUFM ((uint32_t)0x00020000) /* Mask the interrupt when Rx good unicast frames counter reaches half the maximum value */ +#define ETH_MMCRIMR_RFAEM ((uint32_t)0x00000040) /* Mask the interrupt when when Rx alignment error counter reaches half the maximum value */ +#define ETH_MMCRIMR_RFCEM ((uint32_t)0x00000020) /* Mask the interrupt when Rx crc error counter reaches half the maximum value */ + +/* Bit definition for Ethernet MMC Transmit Interrupt Mask Register */ +#define ETH_MMCTIMR_TGFM ((uint32_t)0x00200000) /* Mask the interrupt when Tx good frame count counter reaches half the maximum value */ +#define ETH_MMCTIMR_TGFMSCM ((uint32_t)0x00008000) /* Mask the interrupt when Tx good multi col counter reaches half the maximum value */ +#define ETH_MMCTIMR_TGFSCM ((uint32_t)0x00004000) /* Mask the interrupt when Tx good single col counter reaches half the maximum value */ + +/* Bit definition for Ethernet MMC Transmitted Good Frames after Single Collision Counter Register */ +#define ETH_MMCTGFSCCR_TGFSCC ((uint32_t)0xFFFFFFFF) /* Number of successfully transmitted frames after a single collision in Half-duplex mode. */ + +/* Bit definition for Ethernet MMC Transmitted Good Frames after More than a Single Collision Counter Register */ +#define ETH_MMCTGFMSCCR_TGFMSCC ((uint32_t)0xFFFFFFFF) /* Number of successfully transmitted frames after more than a single collision in Half-duplex mode. */ + +/* Bit definition for Ethernet MMC Transmitted Good Frames Counter Register */ +#define ETH_MMCTGFCR_TGFC ((uint32_t)0xFFFFFFFF) /* Number of good frames transmitted. */ + +/* Bit definition for Ethernet MMC Received Frames with CRC Error Counter Register */ +#define ETH_MMCRFCECR_RFCEC ((uint32_t)0xFFFFFFFF) /* Number of frames received with CRC error. */ + +/* Bit definition for Ethernet MMC Received Frames with Alignement Error Counter Register */ +#define ETH_MMCRFAECR_RFAEC ((uint32_t)0xFFFFFFFF) /* Number of frames received with alignment (dribble) error */ + +/* Bit definition for Ethernet MMC Received Good Unicast Frames Counter Register */ +#define ETH_MMCRGUFCR_RGUFC ((uint32_t)0xFFFFFFFF) /* Number of good unicast frames received. */ + +/******************************************************************************/ +/* Ethernet PTP Registers bits definition */ +/******************************************************************************/ + +/* Bit definition for Ethernet PTP Time Stamp Contol Register */ +#define ETH_PTPTSCR_TSARU ((uint32_t)0x00000020) /* Addend register update */ +#define ETH_PTPTSCR_TSITE ((uint32_t)0x00000010) /* Time stamp interrupt trigger enable */ +#define ETH_PTPTSCR_TSSTU ((uint32_t)0x00000008) /* Time stamp update */ +#define ETH_PTPTSCR_TSSTI ((uint32_t)0x00000004) /* Time stamp initialize */ +#define ETH_PTPTSCR_TSFCU ((uint32_t)0x00000002) /* Time stamp fine or coarse update */ +#define ETH_PTPTSCR_TSE ((uint32_t)0x00000001) /* Time stamp enable */ + +/* Bit definition for Ethernet PTP Sub-Second Increment Register */ +#define ETH_PTPSSIR_STSSI ((uint32_t)0x000000FF) /* System time Sub-second increment value */ + +/* Bit definition for Ethernet PTP Time Stamp High Register */ +#define ETH_PTPTSHR_STS ((uint32_t)0xFFFFFFFF) /* System Time second */ + +/* Bit definition for Ethernet PTP Time Stamp Low Register */ +#define ETH_PTPTSLR_STPNS ((uint32_t)0x80000000) /* System Time Positive or negative time */ +#define ETH_PTPTSLR_STSS ((uint32_t)0x7FFFFFFF) /* System Time sub-seconds */ + +/* Bit definition for Ethernet PTP Time Stamp High Update Register */ +#define ETH_PTPTSHUR_TSUS ((uint32_t)0xFFFFFFFF) /* Time stamp update seconds */ + +/* Bit definition for Ethernet PTP Time Stamp Low Update Register */ +#define ETH_PTPTSLUR_TSUPNS ((uint32_t)0x80000000) /* Time stamp update Positive or negative time */ +#define ETH_PTPTSLUR_TSUSS ((uint32_t)0x7FFFFFFF) /* Time stamp update sub-seconds */ + +/* Bit definition for Ethernet PTP Time Stamp Addend Register */ +#define ETH_PTPTSAR_TSA ((uint32_t)0xFFFFFFFF) /* Time stamp addend */ + +/* Bit definition for Ethernet PTP Target Time High Register */ +#define ETH_PTPTTHR_TTSH ((uint32_t)0xFFFFFFFF) /* Target time stamp high */ + +/* Bit definition for Ethernet PTP Target Time Low Register */ +#define ETH_PTPTTLR_TTSL ((uint32_t)0xFFFFFFFF) /* Target time stamp low */ + +/******************************************************************************/ +/* Ethernet DMA Registers bits definition */ +/******************************************************************************/ + +/* Bit definition for Ethernet DMA Bus Mode Register */ +#define ETH_DMABMR_AAB ((uint32_t)0x02000000) /* Address-Aligned beats */ +#define ETH_DMABMR_FPM ((uint32_t)0x01000000) /* 4xPBL mode */ +#define ETH_DMABMR_USP ((uint32_t)0x00800000) /* Use separate PBL */ +#define ETH_DMABMR_RDP ((uint32_t)0x007E0000) /* RxDMA PBL */ + #define ETH_DMABMR_RDP_1Beat ((uint32_t)0x00020000) /* maximum number of beats to be transferred in one RxDMA transaction is 1 */ + #define ETH_DMABMR_RDP_2Beat ((uint32_t)0x00040000) /* maximum number of beats to be transferred in one RxDMA transaction is 2 */ + #define ETH_DMABMR_RDP_4Beat ((uint32_t)0x00080000) /* maximum number of beats to be transferred in one RxDMA transaction is 4 */ + #define ETH_DMABMR_RDP_8Beat ((uint32_t)0x00100000) /* maximum number of beats to be transferred in one RxDMA transaction is 8 */ + #define ETH_DMABMR_RDP_16Beat ((uint32_t)0x00200000) /* maximum number of beats to be transferred in one RxDMA transaction is 16 */ + #define ETH_DMABMR_RDP_32Beat ((uint32_t)0x00400000) /* maximum number of beats to be transferred in one RxDMA transaction is 32 */ + #define ETH_DMABMR_RDP_4xPBL_4Beat ((uint32_t)0x01020000) /* maximum number of beats to be transferred in one RxDMA transaction is 4 */ + #define ETH_DMABMR_RDP_4xPBL_8Beat ((uint32_t)0x01040000) /* maximum number of beats to be transferred in one RxDMA transaction is 8 */ + #define ETH_DMABMR_RDP_4xPBL_16Beat ((uint32_t)0x01080000) /* maximum number of beats to be transferred in one RxDMA transaction is 16 */ + #define ETH_DMABMR_RDP_4xPBL_32Beat ((uint32_t)0x01100000) /* maximum number of beats to be transferred in one RxDMA transaction is 32 */ + #define ETH_DMABMR_RDP_4xPBL_64Beat ((uint32_t)0x01200000) /* maximum number of beats to be transferred in one RxDMA transaction is 64 */ + #define ETH_DMABMR_RDP_4xPBL_128Beat ((uint32_t)0x01400000) /* maximum number of beats to be transferred in one RxDMA transaction is 128 */ +#define ETH_DMABMR_FB ((uint32_t)0x00010000) /* Fixed Burst */ +#define ETH_DMABMR_RTPR ((uint32_t)0x0000C000) /* Rx Tx priority ratio */ + #define ETH_DMABMR_RTPR_1_1 ((uint32_t)0x00000000) /* Rx Tx priority ratio */ + #define ETH_DMABMR_RTPR_2_1 ((uint32_t)0x00004000) /* Rx Tx priority ratio */ + #define ETH_DMABMR_RTPR_3_1 ((uint32_t)0x00008000) /* Rx Tx priority ratio */ + #define ETH_DMABMR_RTPR_4_1 ((uint32_t)0x0000C000) /* Rx Tx priority ratio */ +#define ETH_DMABMR_PBL ((uint32_t)0x00003F00) /* Programmable burst length */ + #define ETH_DMABMR_PBL_1Beat ((uint32_t)0x00000100) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 1 */ + #define ETH_DMABMR_PBL_2Beat ((uint32_t)0x00000200) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 2 */ + #define ETH_DMABMR_PBL_4Beat ((uint32_t)0x00000400) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 4 */ + #define ETH_DMABMR_PBL_8Beat ((uint32_t)0x00000800) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 8 */ + #define ETH_DMABMR_PBL_16Beat ((uint32_t)0x00001000) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 16 */ + #define ETH_DMABMR_PBL_32Beat ((uint32_t)0x00002000) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 32 */ + #define ETH_DMABMR_PBL_4xPBL_4Beat ((uint32_t)0x01000100) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 4 */ + #define ETH_DMABMR_PBL_4xPBL_8Beat ((uint32_t)0x01000200) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 8 */ + #define ETH_DMABMR_PBL_4xPBL_16Beat ((uint32_t)0x01000400) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 16 */ + #define ETH_DMABMR_PBL_4xPBL_32Beat ((uint32_t)0x01000800) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 32 */ + #define ETH_DMABMR_PBL_4xPBL_64Beat ((uint32_t)0x01001000) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 64 */ + #define ETH_DMABMR_PBL_4xPBL_128Beat ((uint32_t)0x01002000) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 128 */ +#define ETH_DMABMR_DSL ((uint32_t)0x0000007C) /* Descriptor Skip Length */ +#define ETH_DMABMR_DA ((uint32_t)0x00000002) /* DMA arbitration scheme */ +#define ETH_DMABMR_SR ((uint32_t)0x00000001) /* Software reset */ + +/* Bit definition for Ethernet DMA Transmit Poll Demand Register */ +#define ETH_DMATPDR_TPD ((uint32_t)0xFFFFFFFF) /* Transmit poll demand */ + +/* Bit definition for Ethernet DMA Receive Poll Demand Register */ +#define ETH_DMARPDR_RPD ((uint32_t)0xFFFFFFFF) /* Receive poll demand */ + +/* Bit definition for Ethernet DMA Receive Descriptor List Address Register */ +#define ETH_DMARDLAR_SRL ((uint32_t)0xFFFFFFFF) /* Start of receive list */ + +/* Bit definition for Ethernet DMA Transmit Descriptor List Address Register */ +#define ETH_DMATDLAR_STL ((uint32_t)0xFFFFFFFF) /* Start of transmit list */ + +/* Bit definition for Ethernet DMA Status Register */ +#define ETH_DMASR_TSTS ((uint32_t)0x20000000) /* Time-stamp trigger status */ +#define ETH_DMASR_PMTS ((uint32_t)0x10000000) /* PMT status */ +#define ETH_DMASR_MMCS ((uint32_t)0x08000000) /* MMC status */ +#define ETH_DMASR_EBS ((uint32_t)0x03800000) /* Error bits status */ + /* combination with EBS[2:0] for GetFlagStatus function */ + #define ETH_DMASR_EBS_DescAccess ((uint32_t)0x02000000) /* Error bits 0-data buffer, 1-desc. access */ + #define ETH_DMASR_EBS_ReadTransf ((uint32_t)0x01000000) /* Error bits 0-write trnsf, 1-read transfr */ + #define ETH_DMASR_EBS_DataTransfTx ((uint32_t)0x00800000) /* Error bits 0-Rx DMA, 1-Tx DMA */ +#define ETH_DMASR_TPS ((uint32_t)0x00700000) /* Transmit process state */ + #define ETH_DMASR_TPS_Stopped ((uint32_t)0x00000000) /* Stopped - Reset or Stop Tx Command issued */ + #define ETH_DMASR_TPS_Fetching ((uint32_t)0x00100000) /* Running - fetching the Tx descriptor */ + #define ETH_DMASR_TPS_Waiting ((uint32_t)0x00200000) /* Running - waiting for status */ + #define ETH_DMASR_TPS_Reading ((uint32_t)0x00300000) /* Running - reading the data from host memory */ + #define ETH_DMASR_TPS_Suspended ((uint32_t)0x00600000) /* Suspended - Tx Descriptor unavailabe */ + #define ETH_DMASR_TPS_Closing ((uint32_t)0x00700000) /* Running - closing Rx descriptor */ +#define ETH_DMASR_RPS ((uint32_t)0x000E0000) /* Receive process state */ + #define ETH_DMASR_RPS_Stopped ((uint32_t)0x00000000) /* Stopped - Reset or Stop Rx Command issued */ + #define ETH_DMASR_RPS_Fetching ((uint32_t)0x00020000) /* Running - fetching the Rx descriptor */ + #define ETH_DMASR_RPS_Waiting ((uint32_t)0x00060000) /* Running - waiting for packet */ + #define ETH_DMASR_RPS_Suspended ((uint32_t)0x00080000) /* Suspended - Rx Descriptor unavailable */ + #define ETH_DMASR_RPS_Closing ((uint32_t)0x000A0000) /* Running - closing descriptor */ + #define ETH_DMASR_RPS_Queuing ((uint32_t)0x000E0000) /* Running - queuing the recieve frame into host memory */ +#define ETH_DMASR_NIS ((uint32_t)0x00010000) /* Normal interrupt summary */ +#define ETH_DMASR_AIS ((uint32_t)0x00008000) /* Abnormal interrupt summary */ +#define ETH_DMASR_ERS ((uint32_t)0x00004000) /* Early receive status */ +#define ETH_DMASR_FBES ((uint32_t)0x00002000) /* Fatal bus error status */ +#define ETH_DMASR_ETS ((uint32_t)0x00000400) /* Early transmit status */ +#define ETH_DMASR_RWTS ((uint32_t)0x00000200) /* Receive watchdog timeout status */ +#define ETH_DMASR_RPSS ((uint32_t)0x00000100) /* Receive process stopped status */ +#define ETH_DMASR_RBUS ((uint32_t)0x00000080) /* Receive buffer unavailable status */ +#define ETH_DMASR_RS ((uint32_t)0x00000040) /* Receive status */ +#define ETH_DMASR_TUS ((uint32_t)0x00000020) /* Transmit underflow status */ +#define ETH_DMASR_ROS ((uint32_t)0x00000010) /* Receive overflow status */ +#define ETH_DMASR_TJTS ((uint32_t)0x00000008) /* Transmit jabber timeout status */ +#define ETH_DMASR_TBUS ((uint32_t)0x00000004) /* Transmit buffer unavailable status */ +#define ETH_DMASR_TPSS ((uint32_t)0x00000002) /* Transmit process stopped status */ +#define ETH_DMASR_TS ((uint32_t)0x00000001) /* Transmit status */ + +/* Bit definition for Ethernet DMA Operation Mode Register */ +#define ETH_DMAOMR_DTCEFD ((uint32_t)0x04000000) /* Disable Dropping of TCP/IP checksum error frames */ +#define ETH_DMAOMR_RSF ((uint32_t)0x02000000) /* Receive store and forward */ +#define ETH_DMAOMR_DFRF ((uint32_t)0x01000000) /* Disable flushing of received frames */ +#define ETH_DMAOMR_TSF ((uint32_t)0x00200000) /* Transmit store and forward */ +#define ETH_DMAOMR_FTF ((uint32_t)0x00100000) /* Flush transmit FIFO */ +#define ETH_DMAOMR_TTC ((uint32_t)0x0001C000) /* Transmit threshold control */ + #define ETH_DMAOMR_TTC_64Bytes ((uint32_t)0x00000000) /* threshold level of the MTL Transmit FIFO is 64 Bytes */ + #define ETH_DMAOMR_TTC_128Bytes ((uint32_t)0x00004000) /* threshold level of the MTL Transmit FIFO is 128 Bytes */ + #define ETH_DMAOMR_TTC_192Bytes ((uint32_t)0x00008000) /* threshold level of the MTL Transmit FIFO is 192 Bytes */ + #define ETH_DMAOMR_TTC_256Bytes ((uint32_t)0x0000C000) /* threshold level of the MTL Transmit FIFO is 256 Bytes */ + #define ETH_DMAOMR_TTC_40Bytes ((uint32_t)0x00010000) /* threshold level of the MTL Transmit FIFO is 40 Bytes */ + #define ETH_DMAOMR_TTC_32Bytes ((uint32_t)0x00014000) /* threshold level of the MTL Transmit FIFO is 32 Bytes */ + #define ETH_DMAOMR_TTC_24Bytes ((uint32_t)0x00018000) /* threshold level of the MTL Transmit FIFO is 24 Bytes */ + #define ETH_DMAOMR_TTC_16Bytes ((uint32_t)0x0001C000) /* threshold level of the MTL Transmit FIFO is 16 Bytes */ +#define ETH_DMAOMR_ST ((uint32_t)0x00002000) /* Start/stop transmission command */ +#define ETH_DMAOMR_FEF ((uint32_t)0x00000080) /* Forward error frames */ +#define ETH_DMAOMR_FUGF ((uint32_t)0x00000040) /* Forward undersized good frames */ +#define ETH_DMAOMR_RTC ((uint32_t)0x00000018) /* receive threshold control */ + #define ETH_DMAOMR_RTC_64Bytes ((uint32_t)0x00000000) /* threshold level of the MTL Receive FIFO is 64 Bytes */ + #define ETH_DMAOMR_RTC_32Bytes ((uint32_t)0x00000008) /* threshold level of the MTL Receive FIFO is 32 Bytes */ + #define ETH_DMAOMR_RTC_96Bytes ((uint32_t)0x00000010) /* threshold level of the MTL Receive FIFO is 96 Bytes */ + #define ETH_DMAOMR_RTC_128Bytes ((uint32_t)0x00000018) /* threshold level of the MTL Receive FIFO is 128 Bytes */ +#define ETH_DMAOMR_OSF ((uint32_t)0x00000004) /* operate on second frame */ +#define ETH_DMAOMR_SR ((uint32_t)0x00000002) /* Start/stop receive */ + +/* Bit definition for Ethernet DMA Interrupt Enable Register */ +#define ETH_DMAIER_NISE ((uint32_t)0x00010000) /* Normal interrupt summary enable */ +#define ETH_DMAIER_AISE ((uint32_t)0x00008000) /* Abnormal interrupt summary enable */ +#define ETH_DMAIER_ERIE ((uint32_t)0x00004000) /* Early receive interrupt enable */ +#define ETH_DMAIER_FBEIE ((uint32_t)0x00002000) /* Fatal bus error interrupt enable */ +#define ETH_DMAIER_ETIE ((uint32_t)0x00000400) /* Early transmit interrupt enable */ +#define ETH_DMAIER_RWTIE ((uint32_t)0x00000200) /* Receive watchdog timeout interrupt enable */ +#define ETH_DMAIER_RPSIE ((uint32_t)0x00000100) /* Receive process stopped interrupt enable */ +#define ETH_DMAIER_RBUIE ((uint32_t)0x00000080) /* Receive buffer unavailable interrupt enable */ +#define ETH_DMAIER_RIE ((uint32_t)0x00000040) /* Receive interrupt enable */ +#define ETH_DMAIER_TUIE ((uint32_t)0x00000020) /* Transmit Underflow interrupt enable */ +#define ETH_DMAIER_ROIE ((uint32_t)0x00000010) /* Receive Overflow interrupt enable */ +#define ETH_DMAIER_TJTIE ((uint32_t)0x00000008) /* Transmit jabber timeout interrupt enable */ +#define ETH_DMAIER_TBUIE ((uint32_t)0x00000004) /* Transmit buffer unavailable interrupt enable */ +#define ETH_DMAIER_TPSIE ((uint32_t)0x00000002) /* Transmit process stopped interrupt enable */ +#define ETH_DMAIER_TIE ((uint32_t)0x00000001) /* Transmit interrupt enable */ + +/* Bit definition for Ethernet DMA Missed Frame and Buffer Overflow Counter Register */ +#define ETH_DMAMFBOCR_OFOC ((uint32_t)0x10000000) /* Overflow bit for FIFO overflow counter */ +#define ETH_DMAMFBOCR_MFA ((uint32_t)0x0FFE0000) /* Number of frames missed by the application */ +#define ETH_DMAMFBOCR_OMFC ((uint32_t)0x00010000) /* Overflow bit for missed frame counter */ +#define ETH_DMAMFBOCR_MFC ((uint32_t)0x0000FFFF) /* Number of frames missed by the controller */ + +/* Bit definition for Ethernet DMA Current Host Transmit Descriptor Register */ +#define ETH_DMACHTDR_HTDAP ((uint32_t)0xFFFFFFFF) /* Host transmit descriptor address pointer */ + +/* Bit definition for Ethernet DMA Current Host Receive Descriptor Register */ +#define ETH_DMACHRDR_HRDAP ((uint32_t)0xFFFFFFFF) /* Host receive descriptor address pointer */ + +/* Bit definition for Ethernet DMA Current Host Transmit Buffer Address Register */ +#define ETH_DMACHTBAR_HTBAP ((uint32_t)0xFFFFFFFF) /* Host transmit buffer address pointer */ + +/* Bit definition for Ethernet DMA Current Host Receive Buffer Address Register */ +#define ETH_DMACHRBAR_HRBAP ((uint32_t)0xFFFFFFFF) /* Host receive buffer address pointer */ +#endif /* STM32F10X_CL */ + +/** + * @} + */ + + /** + * @} + */ + +#ifdef USE_STDPERIPH_DRIVER + #include "stm32f10x_conf.h" +#endif + +/** @addtogroup Exported_macro + * @{ + */ + +#define SET_BIT(REG, BIT) ((REG) |= (BIT)) + +#define CLEAR_BIT(REG, BIT) ((REG) &= ~(BIT)) + +#define READ_BIT(REG, BIT) ((REG) & (BIT)) + +#define CLEAR_REG(REG) ((REG) = (0x0)) + +#define WRITE_REG(REG, VAL) ((REG) = (VAL)) + +#define READ_REG(REG) ((REG)) + +#define MODIFY_REG(REG, CLEARMASK, SETMASK) WRITE_REG((REG), (((READ_REG(REG)) & (~(CLEARMASK))) | (SETMASK))) + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F10x_H */ + +/** + * @} + */ + + /** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/7b/20d8102295970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/7b/20d8102295970017138fe0bf747e5677 new file mode 100644 index 0000000..c222124 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/7b/20d8102295970017138fe0bf747e5677 @@ -0,0 +1,128 @@ +ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +heap_4.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -fno-common -mcpu=cortex-m3 -mthumb $(RELEASE_DEFINES) $(INCLUDES) +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -nostartfiles -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map +release: export LDARCHIVES := -L. -L$(STM32_STDPERIPH_ROOT) -lSTM_StdPeriph +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -f hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + rm -rf obj_release + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +else + +vpath %.c \ +src \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ +$(STM32_DEVICE_SUPPORT_DIR) + +vpath %.s $(STARTER_SCRIPT_DIR) +vpath %.o $(OBJ_DIR) + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) $(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)/$@ + +$(OBJ_DIR): + mkdir -p $@ + +endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/80/00e7e5899b970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/80/00e7e5899b970017138fe0bf747e5677 new file mode 100644 index 0000000..6503f2f --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/80/00e7e5899b970017138fe0bf747e5677 @@ -0,0 +1,134 @@ +ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +heap_4.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +STM32_CORE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) \ +-I$(STM32_CORE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -fno-common -mcpu=cortex-m3 -mthumb $(RELEASE_DEFINES) $(INCLUDES) +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -nostartfiles -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map +release: export LDARCHIVES := -L. -L$(STM32_STDPERIPH_ROOT) -lSTM_StdPeriph -lhsb_mrts_release +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -f hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + rm -rf obj_release + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +else + +vpath %.c \ +src \ +startup \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport + +vpath %.s \ +startup +vpath %.o \ +obj_release + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) $(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)/$@ + +$(OBJ_DIR): + mkdir -p $@ + +endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/82/a18462089d9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/82/a18462089d9400171201ed9ff9474498 new file mode 100644 index 0000000..e2bb844 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/82/a18462089d9400171201ed9ff9474498 @@ -0,0 +1,184 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Hardware specifics. */ +#include "machine.h" + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions - these are a bit legacy and not really used now, other than +portSTACK_TYPE and portBASE_TYPE. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 8 /* Could make four, according to manual. */ +#define portSTACK_GROWTH -1 +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portNOP() nop() + + +#pragma inline_asm vPortYield +static void vPortYield( void ) +{ + /* Save clobbered register - may not actually be necessary if inline asm + functions are considered to use the same rules as function calls by the + compiler. */ + PUSH.L R5 + /* Set ITU SWINTR. */ + MOV.L #553696, R5 + MOV.B #1, [R5] + /* Read back to ensure the value is taken before proceeding. */ + MOV.L [R5], R5 + /* Restore clobbered register to its previous value. */ + POP R5 +} +#define portYIELD() vPortYield() +#define portYIELD_FROM_ISR( x ) if( x != pdFALSE ) portYIELD() + +/* These macros should not be called directly, but through the +taskENTER_CRITICAL() and taskEXIT_CRITICAL() macros. An extra check is +performed if configASSERT() is defined to ensure an assertion handler does not +inadvertently attempt to lower the IPL when the call to assert was triggered +because the IPL value was found to be above configMAX_SYSCALL_INTERRUPT_PRIORITY +when an ISR safe FreeRTOS API function was executed. ISR safe FreeRTOS API +functions are those that end in FromISR. FreeRTOS maintains a separate +interrupt API to ensure API function and interrupt entry is as fast and as +simple as possible. */ +#define portENABLE_INTERRUPTS() set_ipl( ( long ) 0 ) +#ifdef configASSERT + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() configASSERT( ( get_ipl() <= configMAX_SYSCALL_INTERRUPT_PRIORITY ) ) + #define portDISABLE_INTERRUPTS() if( get_ipl() < configMAX_SYSCALL_INTERRUPT_PRIORITY ) set_ipl( ( long ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#else + #define portDISABLE_INTERRUPTS() set_ipl( ( long ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#endif + +/* Critical nesting counts are stored in the TCB. */ +#define portCRITICAL_NESTING_IN_TCB ( 1 ) + +/* The critical nesting functions defined within tasks.c. */ +extern void vTaskEnterCritical( void ); +extern void vTaskExitCritical( void ); +#define portENTER_CRITICAL() vTaskEnterCritical() +#define portEXIT_CRITICAL() vTaskExitCritical() + +/* As this port allows interrupt nesting... */ +#define portSET_INTERRUPT_MASK_FROM_ISR() get_ipl(); set_ipl( ( long ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ) set_ipl( ( long ) uxSavedInterruptStatus ) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/84/80ff9c6b92970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/84/80ff9c6b92970017138fe0bf747e5677 new file mode 100644 index 0000000..990038a --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/84/80ff9c6b92970017138fe0bf747e5677 @@ -0,0 +1,128 @@ +ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +heap_4.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -fno-common -mcpu=cortex-m3 -mthumb $(RELEASE_DEFINES) $(INCLUDES) +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -nostartfiles -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map -Wl,--no-as-needed +release: export LDARCHIVES := -L. -L$(STM32_STDPERIPH_ROOT) -lSTM_StdPeriph +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -f hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + rm -rf obj_release + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +else + +vpath %.c \ +src \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ +$(STM32_DEVICE_SUPPORT_DIR) + +vpath %.s $(STARTER_SCRIPT_DIR) +vpath %.o $(OBJ_DIR) + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) #$(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +#$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) +# $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)/$@ + +$(OBJ_DIR): + mkdir -p $@ + +endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/84/b06efd4c98970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/84/b06efd4c98970017138fe0bf747e5677 new file mode 100644 index 0000000..89d8be1 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/84/b06efd4c98970017138fe0bf747e5677 @@ -0,0 +1,83 @@ +// ----------------------------------------------------------------------------- +/// @file main.c +/// @brief Description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @file main.c +/// @ingroup {group_name} + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + +// FreeRTOS includes +#include "FreeRTOS.h" +#include "task.h" + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + +/* The time between cycles of the 'check' functionality (defined within the +tick hook. */ +#define mainCHECK_DELAY ( ( TickType_t ) 5000 / portTICK_PERIOD_MS ) + +// ----------------------------------------------------------------------------- +// Type definitions +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// File-scope variables +// ----------------------------------------------------------------------------- + +/* Variable that counts at 20KHz to provide the time base for the run time +stats. */ +unsigned long ulRunTimeStatsClock = 0UL; + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function definitions +// ----------------------------------------------------------------------------- + + +int main (void) +{ + + + /* Start the scheduler. */ + vTaskStartScheduler(); + + /* Will only get here if there was insufficient memory to create the idle + task. The idle task is created within vTaskStartScheduler(). */ + for( ;; ); + + + return -1; +} + + +void vApplicationTickHook( void ) +{ + +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/85/d0cd71a7a99700171090ed03afc2ec65 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/85/d0cd71a7a99700171090ed03afc2ec65 new file mode 100644 index 0000000..68c7582 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/85/d0cd71a7a99700171090ed03afc2ec65 @@ -0,0 +1,111 @@ +// ----------------------------------------------------------------------------- +/// @file freeRTOSFixes.c +/// @brief Description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @file freeRTOSFixes.c +/// @ingroup {group_name} + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + +#include +#include +#include +#include "FreeRTOS.h" +#include "task.h" + +#include "freeRTOSFixes.h" + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Type definitions +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// File-scope variables +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function definitions +// ----------------------------------------------------------------------------- + +void _init(void) {return;} + +void OS_logTaskInfo(xTaskHandle taskHandle) +{ + unsigned portBASE_TYPE highWaterMark; + char text[128]; + + snprintf(text, sizeof(text), "Task %s\n", pcTaskGetTaskName(taskHandle)); +// Shell_sendString(text); + + highWaterMark = uxTaskGetStackHighWaterMark(taskHandle); +// snprintf(text, sizeof(text), "Stack high water mark : %lu long words\n", highWaterMark); +// Shell_sendString(text); +} + +// Implementation for libc, needed for printf related functions. +caddr_t _sbrk(int incr) +{ + extern char _end; + static char* heap_end; + char* prev_heap_end; + + if(heap_end == 0) + { + heap_end = &_end; + } + + prev_heap_end = heap_end; + heap_end += incr; + return (caddr_t)prev_heap_end; +} + +// Stack overflow hook +void vApplicationStackOverflowHook(xTaskHandle xTask, signed portCHAR* pcTaskName) +{ +// Logger_fatal(FATALCODE_STACKOVERFLOW); +} + +// Malloc failed hook +void vApplicationMallocFailedHook(void) +{ +// Logger_fatal(FATALCODE_MALLOCFAILED); +} + +// Assert for StdPeriph library +void assert_failed(uint8_t* file, uint32_t line) +{ +// Logger_log((char*)file, "", line, LOGTYPE_ERROR, "assert failed"); +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/87/933f67089d9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/87/933f67089d9400171201ed9ff9474498 new file mode 100644 index 0000000..ada08b4 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/87/933f67089d9400171201ed9ff9474498 @@ -0,0 +1,144 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#include "FreeRTOSConfig.h" +#include "portasm.h" + + +.CODE + +/* + * The RTOS tick ISR. + * + * If the cooperative scheduler is in use this simply increments the tick + * count. + * + * If the preemptive scheduler is in use a context switch can also occur. + */ +_vTickISR: + portSAVE_CONTEXT + + call #_xTaskIncrementTick + cmp.w #0x00, r15 + jeq _SkipContextSwitch + call #_vTaskSwitchContext +_SkipContextSwitch: + portRESTORE_CONTEXT +/*-----------------------------------------------------------*/ + + +/* + * Manual context switch called by the portYIELD() macro. + */ +_vPortYield:: + + /* Mimic an interrupt by pushing the SR. */ + push SR + + /* Now the SR is stacked we can disable interrupts. */ + dint + + /* Save the context of the current task. */ + portSAVE_CONTEXT + + /* Switch to the highest priority task that is ready to run. */ + call #_vTaskSwitchContext + + /* Restore the context of the new task. */ + portRESTORE_CONTEXT +/*-----------------------------------------------------------*/ + + +/* + * Start off the scheduler by initialising the RTOS tick timer, then restoring + * the context of the first task. + */ +_xPortStartScheduler:: + + /* Setup the hardware to generate the tick. Interrupts are disabled + when this function is called. */ + call #_prvSetupTimerInterrupt + + /* Restore the context of the first task that is going to run. */ + portRESTORE_CONTEXT +/*-----------------------------------------------------------*/ + + + /* Place the tick ISR in the correct vector. */ + .VECTORS + + .KEEP + + ORG TIMERA0_VECTOR + DW _vTickISR + + + + END + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/88/108162999f9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/88/108162999f9400171201ed9ff9474498 new file mode 100644 index 0000000..666d2cc --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/88/108162999f9400171201ed9ff9474498 @@ -0,0 +1,53 @@ +// ----------------------------------------------------------------------------- +/// @file as.h +/// @brief File description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @defgroup {group_name} {group_description} +/// Description + +/// @file as.h +/// @ingroup {group_name} + + +#ifndef __FILE_NAME__ +#define __FILE_NAME__ + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Type definitions. +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + +#endif /* __FILE_NAME__ */ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/88/10e3c9b09d970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/88/10e3c9b09d970017138fe0bf747e5677 new file mode 100644 index 0000000..72c87e8 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/88/10e3c9b09d970017138fe0bf747e5677 @@ -0,0 +1,134 @@ +ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +heap_4.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +STM32_CORE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) \ +-I$(STM32_CORE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -fno-common -mcpu=cortex-m3 -mthumb $(RELEASE_DEFINES) $(INCLUDES) +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -nostartfiles -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map +release: export LDARCHIVES := -L. -L$(STM32_STDPERIPH_ROOT) -lc -lm -lSTM_StdPeriph -lhsb_mrts_release +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -f hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + rm -rf obj_release + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +else + +vpath %.c \ +src \ +startup \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport + +vpath %.s \ +startup +vpath %.o \ +obj_release + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) $(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)/$@ + +$(OBJ_DIR): + mkdir -p $@ + +endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/88/a027e02dc896001713a7ede92b37d6f1 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/88/a027e02dc896001713a7ede92b37d6f1 new file mode 100644 index 0000000..d9283bf --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/88/a027e02dc896001713a7ede92b37d6f1 @@ -0,0 +1,61 @@ +# STM support library + +SRC_DIR = Libraries/STM32F10x_StdPeriph_Driver/src/ +INC_DIR = Libraries/STM32F10x_StdPeriph_Driver/inc/ +DEV_DIR = Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/ +COR_DIR = Libraries/CMSIS/CM3/CoreSupport/ +OBJ_DIR = Libraries/STM32F10x_StdPeriph_Driver/obj + +CROSS_COMPILE = arm-none-eabi- + +CC = $(CROSS_COMPILE)gcc +CCFLAGS = -c -O2 -g -fno-common -mcpu=cortex-m3 -mthumb -DUSE_FULL_ASSERT -I$(INC_DIR) -I$(DEV_DIR) -I$(COR_DIR) -I. -Wall -Werror + +AR = $(CROSS_COMPILE)ar +ARFLAGS = rs + +OBJECTS = \ +misc.o \ +stm32f10x_adc.o \ +stm32f10x_bkp.o \ +stm32f10x_can.o \ +stm32f10x_cec.o \ +stm32f10x_crc.o \ +stm32f10x_dac.o \ +stm32f10x_dbgmcu.o \ +stm32f10x_dma.o \ +stm32f10x_exti.o \ +stm32f10x_flash.o \ +stm32f10x_fsmc.o \ +stm32f10x_gpio.o \ +stm32f10x_i2c.o \ +stm32f10x_iwdg.o \ +stm32f10x_pwr.o \ +stm32f10x_rcc.o \ +stm32f10x_rtc.o \ +stm32f10x_sdio.o \ +stm32f10x_spi.o \ +stm32f10x_tim.o \ +stm32f10x_usart.o \ +stm32f10x_wwdg.o + +LIBRARY = libSTM_StdPeriph.a + +vpath %.c $(SRC_DIR) +vpath %.o $(OBJ_DIR) + +all: $(LIBRARY) + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +clean: + rm -rf $(LIBRARY) $(OBJ_DIR) + +$(OBJ_DIR): + mkdir -p $@ + +.PHONY: all clean diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/88/b0db7c1a8e970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/88/b0db7c1a8e970017138fe0bf747e5677 new file mode 100644 index 0000000..994fab3 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/88/b0db7c1a8e970017138fe0bf747e5677 @@ -0,0 +1,73 @@ +// ----------------------------------------------------------------------------- +/// @file main.c +/// @brief Description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @file main.c +/// @ingroup {group_name} + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + +// FreeRTOS includes +#include "FreeRTOS.h" +#include "task.h" + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Type definitions +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// File-scope variables +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function definitions +// ----------------------------------------------------------------------------- + + +int main (void) +{ + + + /* Start the scheduler. */ + //vTaskStartScheduler(); + + /* Will only get here if there was insufficient memory to create the idle + task. The idle task is created within vTaskStartScheduler(). */ + for( ;; ); + + + return -1; +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/89/409bd75ccf96001713a7ede92b37d6f1 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/89/409bd75ccf96001713a7ede92b37d6f1 new file mode 100644 index 0000000..b55b2f1 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/89/409bd75ccf96001713a7ede92b37d6f1 @@ -0,0 +1,68 @@ +# STM support library + +STM32_STDPERIPH_INC = Libraries/STM32F10x_StdPeriph_Driver/inc/ +CORE_DIR = Libraries/CMSIS/CM3/CoreSupport/ +DEVICE_SUPPORT_DIR = Libraries/CMSIS/CM3/DrviceSupport/ST/STM32F10x + +SRC_DIR = Libraries/STM32F10x_StdPeriph_Driver/src/ + +INCLUDE_DIRS = \ +-I$(STM32_STDPERIPH_INC) \ +-I$(CIRE_DIR) \ +-I$(DEVICE_SUPPORT_DIR) \ + +OBJ_DIR = Libraries/STM32F10x_StdPeriph_Driver/obj + +CROSS_COMPILE = arm-none-eabi- + +CC = $(CROSS_COMPILE)gcc +CCFLAGS = -c -O2 -g -fno-common -mcpu=cortex-m3 -mthumb -DUSE_FULL_ASSERT -I$(INCLUDE_DIRS) -I. -Wall -Werror -D"assert_param(expr)=((void)0)" + +AR = $(CROSS_COMPILE)ar +ARFLAGS = rs + +OBJECTS = \ +misc.o \ +stm32f10x_adc.o \ +stm32f10x_bkp.o \ +stm32f10x_can.o \ +stm32f10x_cec.o \ +stm32f10x_crc.o \ +stm32f10x_dac.o \ +stm32f10x_dbgmcu.o \ +stm32f10x_dma.o \ +stm32f10x_exti.o \ +stm32f10x_flash.o \ +stm32f10x_fsmc.o \ +stm32f10x_gpio.o \ +stm32f10x_i2c.o \ +stm32f10x_iwdg.o \ +stm32f10x_pwr.o \ +stm32f10x_rcc.o \ +stm32f10x_rtc.o \ +stm32f10x_sdio.o \ +stm32f10x_spi.o \ +stm32f10x_tim.o \ +stm32f10x_usart.o \ +stm32f10x_wwdg.o + +LIBRARY = libSTM_StdPeriph.a + +vpath %.c $(SRC_DIR) +vpath %.o $(OBJ_DIR) + +all: $(LIBRARY) + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +clean: + rm -rf $(LIBRARY) $(OBJ_DIR) + +$(OBJ_DIR): + mkdir -p $@ + +.PHONY: all clean diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/8a/30e63db1cf96001713a7ede92b37d6f1 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/8a/30e63db1cf96001713a7ede92b37d6f1 new file mode 100644 index 0000000..7758019 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/8a/30e63db1cf96001713a7ede92b37d6f1 @@ -0,0 +1,68 @@ +# STM support library + +STM32_STDPERIPH_INC = Libraries/STM32F10x_StdPeriph_Driver/inc/ +CORE_DIR = Libraries/CMSIS/CM3/CoreSupport/ +DEVICE_SUPPORT_DIR = Libraries/CMSIS/CM3/DrviceSupport/ST/STM32F10x + +SRC_DIR = Libraries/STM32F10x_StdPeriph_Driver/src/ + +INCLUDE_DIRS = \ +-I$(STM32_STDPERIPH_INC) \ +-I$(CIRE_DIR) \ +-I$(DEVICE_SUPPORT_DIR) \ + +OBJ_DIR = Libraries/STM32F10x_StdPeriph_Driver/obj + +CROSS_COMPILE = arm-none-eabi- + +CC = $(CROSS_COMPILE)gcc +CCFLAGS = -c -O2 -g -fno-common -mcpu=cortex-m3 -mthumb -DUSE_FULL_ASSERT $(INCLUDE_DIRS) -I. -Wall -Werror -D"assert_param(expr)=((void)0)" + +AR = $(CROSS_COMPILE)ar +ARFLAGS = rs + +OBJECTS = \ +misc.o \ +stm32f10x_adc.o \ +stm32f10x_bkp.o \ +stm32f10x_can.o \ +stm32f10x_cec.o \ +stm32f10x_crc.o \ +stm32f10x_dac.o \ +stm32f10x_dbgmcu.o \ +stm32f10x_dma.o \ +stm32f10x_exti.o \ +stm32f10x_flash.o \ +stm32f10x_fsmc.o \ +stm32f10x_gpio.o \ +stm32f10x_i2c.o \ +stm32f10x_iwdg.o \ +stm32f10x_pwr.o \ +stm32f10x_rcc.o \ +stm32f10x_rtc.o \ +stm32f10x_sdio.o \ +stm32f10x_spi.o \ +stm32f10x_tim.o \ +stm32f10x_usart.o \ +stm32f10x_wwdg.o + +LIBRARY = libSTM_StdPeriph.a + +vpath %.c $(SRC_DIR) +vpath %.o $(OBJ_DIR) + +all: $(LIBRARY) + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +clean: + rm -rf $(LIBRARY) $(OBJ_DIR) + +$(OBJ_DIR): + mkdir -p $@ + +.PHONY: all clean diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/8b/b13a60089d9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/8b/b13a60089d9400171201ed9ff9474498 new file mode 100644 index 0000000..da0ea12 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/8b/b13a60089d9400171201ed9ff9474498 @@ -0,0 +1,193 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Hardware specifics. */ +#include "machine.h" + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions - these are a bit legacy and not really used now, other +than portSTACK_TYPE and portBASE_TYPE. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 8 /* Could make four, according to manual. */ +#define portSTACK_GROWTH -1 +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portNOP() nop() + +#pragma inline_asm vPortYield +static void vPortYield( void ) +{ + /* Save clobbered register - may not actually be necessary if inline asm + functions are considered to use the same rules as function calls by the + compiler. */ + PUSH.L R5 + /* Set ITU SWINTR. */ + MOV.L #872E0H, R5 + MOV.B #1, [R5] + /* Read back to ensure the value is taken before proceeding. */ + MOV.L [R5], R5 + /* Restore clobbered register to its previous value. */ + POP R5 +} +#define portYIELD() vPortYield() +#define portYIELD_FROM_ISR( x ) if( x != pdFALSE ) { portYIELD(); } + +/* These macros should not be called directly, but through the +taskENTER_CRITICAL() and taskEXIT_CRITICAL() macros. An extra check is +performed if configASSERT() is defined to ensure an assertion handler does not +inadvertently attempt to lower the IPL when the call to assert was triggered +because the IPL value was found to be above configMAX_SYSCALL_INTERRUPT_PRIORITY +when an ISR safe FreeRTOS API function was executed. ISR safe FreeRTOS API +functions are those that end in FromISR. FreeRTOS maintains a separate +interrupt API to ensure API function and interrupt entry is as fast and as +simple as possible. */ +#define portENABLE_INTERRUPTS() set_ipl( ( long ) 0 ) +#ifdef configASSERT + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() configASSERT( ( get_ipl() <= configMAX_SYSCALL_INTERRUPT_PRIORITY ) ) + #define portDISABLE_INTERRUPTS() if( get_ipl() < configMAX_SYSCALL_INTERRUPT_PRIORITY ) set_ipl( ( long ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#else + #define portDISABLE_INTERRUPTS() set_ipl( ( long ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#endif + +/* Critical nesting counts are stored in the TCB. */ +#define portCRITICAL_NESTING_IN_TCB ( 1 ) + +/* The critical nesting functions defined within tasks.c. */ +extern void vTaskEnterCritical( void ); +extern void vTaskExitCritical( void ); +#define portENTER_CRITICAL() vTaskEnterCritical() +#define portEXIT_CRITICAL() vTaskExitCritical() + +/* As this port allows interrupt nesting... */ +#define portSET_INTERRUPT_MASK_FROM_ISR() ( UBaseType_t ) get_ipl(); set_ipl( ( signed long ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ) set_ipl( ( signed long ) uxSavedInterruptStatus ) + +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ +#if configUSE_TICKLESS_IDLE == 1 + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif +#endif + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/8d/80982aa1a99700171090ed03afc2ec65 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/8d/80982aa1a99700171090ed03afc2ec65 new file mode 100644 index 0000000..08a6be4 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/8d/80982aa1a99700171090ed03afc2ec65 @@ -0,0 +1,1063 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef INC_FREERTOS_H +#define INC_FREERTOS_H + +/* + * Include the generic headers required for the FreeRTOS port being used. + */ +#include + +/* + * If stdint.h cannot be located then: + * + If using GCC ensure the -nostdint options is *not* being used. + * + Ensure the project's include path includes the directory in which your + * compiler stores stdint.h. + * + Set any compiler options necessary for it to support C99, as technically + * stdint.h is only mandatory with C99 (FreeRTOS does not require C99 in any + * other way). + * + The FreeRTOS download includes a simple stdint.h definition that can be + * used in cases where none is provided by the compiler. The files only + * contains the typedefs required to build FreeRTOS. Read the instructions + * in FreeRTOS/source/stdint.readme for more information. + */ +#include /* READ COMMENT ABOVE. */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Application specific configuration options. */ +#include "FreeRTOSConfig.h" + +/* Basic FreeRTOS definitions. */ +#include "projdefs.h" + +/* Definitions specific to the port being used. */ +#include "portable.h" + +/* Must be defaulted before configUSE_NEWLIB_REENTRANT is used below. */ +#ifndef configUSE_NEWLIB_REENTRANT + #define configUSE_NEWLIB_REENTRANT 0 +#endif + +/* Required if struct _reent is used. */ +#if ( configUSE_NEWLIB_REENTRANT == 1 ) + #include +#endif +/* + * Check all the required application specific macros have been defined. + * These macros are application specific and (as downloaded) are defined + * within FreeRTOSConfig.h. + */ + +#ifndef configMINIMAL_STACK_SIZE + #error Missing definition: configMINIMAL_STACK_SIZE must be defined in FreeRTOSConfig.h. configMINIMAL_STACK_SIZE defines the size (in words) of the stack allocated to the idle task. Refer to the demo project provided for your port for a suitable value. +#endif + +#ifndef configMAX_PRIORITIES + #error Missing definition: configMAX_PRIORITIES must be defined in FreeRTOSConfig.h. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef configUSE_PREEMPTION + #error Missing definition: configUSE_PREEMPTION must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef configUSE_IDLE_HOOK + #error Missing definition: configUSE_IDLE_HOOK must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef configUSE_TICK_HOOK + #error Missing definition: configUSE_TICK_HOOK must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef configUSE_16_BIT_TICKS + #error Missing definition: configUSE_16_BIT_TICKS must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef configMAX_PRIORITIES + #error configMAX_PRIORITIES must be defined to be greater than or equal to 1. +#endif + +#ifndef configUSE_CO_ROUTINES + #define configUSE_CO_ROUTINES 0 +#endif + +#ifndef INCLUDE_vTaskPrioritySet + #define INCLUDE_vTaskPrioritySet 0 +#endif + +#ifndef INCLUDE_uxTaskPriorityGet + #define INCLUDE_uxTaskPriorityGet 0 +#endif + +#ifndef INCLUDE_vTaskDelete + #define INCLUDE_vTaskDelete 0 +#endif + +#ifndef INCLUDE_vTaskSuspend + #define INCLUDE_vTaskSuspend 0 +#endif + +#ifndef INCLUDE_vTaskDelayUntil + #define INCLUDE_vTaskDelayUntil 0 +#endif + +#ifndef INCLUDE_vTaskDelay + #define INCLUDE_vTaskDelay 0 +#endif + +#ifndef INCLUDE_xTaskGetIdleTaskHandle + #define INCLUDE_xTaskGetIdleTaskHandle 0 +#endif + +#ifndef INCLUDE_xTaskAbortDelay + #define INCLUDE_xTaskAbortDelay 0 +#endif + +#ifndef INCLUDE_xQueueGetMutexHolder + #define INCLUDE_xQueueGetMutexHolder 0 +#endif + +#ifndef INCLUDE_xSemaphoreGetMutexHolder + #define INCLUDE_xSemaphoreGetMutexHolder INCLUDE_xQueueGetMutexHolder +#endif + +#ifndef INCLUDE_xTaskGetHandle + #define INCLUDE_xTaskGetHandle 0 +#endif + +#ifndef INCLUDE_uxTaskGetStackHighWaterMark + #define INCLUDE_uxTaskGetStackHighWaterMark 0 +#endif + +#ifndef INCLUDE_eTaskGetState + #define INCLUDE_eTaskGetState 0 +#endif + +#ifndef INCLUDE_xTaskResumeFromISR + #define INCLUDE_xTaskResumeFromISR 1 +#endif + +#ifndef INCLUDE_xTimerPendFunctionCall + #define INCLUDE_xTimerPendFunctionCall 0 +#endif + +#ifndef INCLUDE_xTaskGetSchedulerState + #define INCLUDE_xTaskGetSchedulerState 0 +#endif + +#ifndef INCLUDE_xTaskGetCurrentTaskHandle + #define INCLUDE_xTaskGetCurrentTaskHandle 0 +#endif + +#if configUSE_CO_ROUTINES != 0 + #ifndef configMAX_CO_ROUTINE_PRIORITIES + #error configMAX_CO_ROUTINE_PRIORITIES must be greater than or equal to 1. + #endif +#endif + +#ifndef configUSE_DAEMON_TASK_STARTUP_HOOK + #define configUSE_DAEMON_TASK_STARTUP_HOOK 0 +#endif + +#ifndef configUSE_APPLICATION_TASK_TAG + #define configUSE_APPLICATION_TASK_TAG 0 +#endif + +#ifndef configNUM_THREAD_LOCAL_STORAGE_POINTERS + #define configNUM_THREAD_LOCAL_STORAGE_POINTERS 0 +#endif + +#ifndef configUSE_RECURSIVE_MUTEXES + #define configUSE_RECURSIVE_MUTEXES 0 +#endif + +#ifndef configUSE_MUTEXES + #define configUSE_MUTEXES 0 +#endif + +#ifndef configUSE_TIMERS + #define configUSE_TIMERS 0 +#endif + +#ifndef configUSE_COUNTING_SEMAPHORES + #define configUSE_COUNTING_SEMAPHORES 0 +#endif + +#ifndef configUSE_ALTERNATIVE_API + #define configUSE_ALTERNATIVE_API 0 +#endif + +#ifndef portCRITICAL_NESTING_IN_TCB + #define portCRITICAL_NESTING_IN_TCB 0 +#endif + +#ifndef configMAX_TASK_NAME_LEN + #define configMAX_TASK_NAME_LEN 16 +#endif + +#ifndef configIDLE_SHOULD_YIELD + #define configIDLE_SHOULD_YIELD 1 +#endif + +#if configMAX_TASK_NAME_LEN < 1 + #error configMAX_TASK_NAME_LEN must be set to a minimum of 1 in FreeRTOSConfig.h +#endif + +#ifndef configASSERT + #define configASSERT( x ) + #define configASSERT_DEFINED 0 +#else + #define configASSERT_DEFINED 1 +#endif + +/* The timers module relies on xTaskGetSchedulerState(). */ +#if configUSE_TIMERS == 1 + + #ifndef configTIMER_TASK_PRIORITY + #error If configUSE_TIMERS is set to 1 then configTIMER_TASK_PRIORITY must also be defined. + #endif /* configTIMER_TASK_PRIORITY */ + + #ifndef configTIMER_QUEUE_LENGTH + #error If configUSE_TIMERS is set to 1 then configTIMER_QUEUE_LENGTH must also be defined. + #endif /* configTIMER_QUEUE_LENGTH */ + + #ifndef configTIMER_TASK_STACK_DEPTH + #error If configUSE_TIMERS is set to 1 then configTIMER_TASK_STACK_DEPTH must also be defined. + #endif /* configTIMER_TASK_STACK_DEPTH */ + +#endif /* configUSE_TIMERS */ + +#ifndef portSET_INTERRUPT_MASK_FROM_ISR + #define portSET_INTERRUPT_MASK_FROM_ISR() 0 +#endif + +#ifndef portCLEAR_INTERRUPT_MASK_FROM_ISR + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedStatusValue ) ( void ) uxSavedStatusValue +#endif + +#ifndef portCLEAN_UP_TCB + #define portCLEAN_UP_TCB( pxTCB ) ( void ) pxTCB +#endif + +#ifndef portPRE_TASK_DELETE_HOOK + #define portPRE_TASK_DELETE_HOOK( pvTaskToDelete, pxYieldPending ) +#endif + +#ifndef portSETUP_TCB + #define portSETUP_TCB( pxTCB ) ( void ) pxTCB +#endif + +#ifndef configQUEUE_REGISTRY_SIZE + #define configQUEUE_REGISTRY_SIZE 0U +#endif + +#if ( configQUEUE_REGISTRY_SIZE < 1 ) + #define vQueueAddToRegistry( xQueue, pcName ) + #define vQueueUnregisterQueue( xQueue ) + #define pcQueueGetName( xQueue ) +#endif + +#ifndef portPOINTER_SIZE_TYPE + #define portPOINTER_SIZE_TYPE uint32_t +#endif + +/* Remove any unused trace macros. */ +#ifndef traceSTART + /* Used to perform any necessary initialisation - for example, open a file + into which trace is to be written. */ + #define traceSTART() +#endif + +#ifndef traceEND + /* Use to close a trace, for example close a file into which trace has been + written. */ + #define traceEND() +#endif + +#ifndef traceTASK_SWITCHED_IN + /* Called after a task has been selected to run. pxCurrentTCB holds a pointer + to the task control block of the selected task. */ + #define traceTASK_SWITCHED_IN() +#endif + +#ifndef traceINCREASE_TICK_COUNT + /* Called before stepping the tick count after waking from tickless idle + sleep. */ + #define traceINCREASE_TICK_COUNT( x ) +#endif + +#ifndef traceLOW_POWER_IDLE_BEGIN + /* Called immediately before entering tickless idle. */ + #define traceLOW_POWER_IDLE_BEGIN() +#endif + +#ifndef traceLOW_POWER_IDLE_END + /* Called when returning to the Idle task after a tickless idle. */ + #define traceLOW_POWER_IDLE_END() +#endif + +#ifndef traceTASK_SWITCHED_OUT + /* Called before a task has been selected to run. pxCurrentTCB holds a pointer + to the task control block of the task being switched out. */ + #define traceTASK_SWITCHED_OUT() +#endif + +#ifndef traceTASK_PRIORITY_INHERIT + /* Called when a task attempts to take a mutex that is already held by a + lower priority task. pxTCBOfMutexHolder is a pointer to the TCB of the task + that holds the mutex. uxInheritedPriority is the priority the mutex holder + will inherit (the priority of the task that is attempting to obtain the + muted. */ + #define traceTASK_PRIORITY_INHERIT( pxTCBOfMutexHolder, uxInheritedPriority ) +#endif + +#ifndef traceTASK_PRIORITY_DISINHERIT + /* Called when a task releases a mutex, the holding of which had resulted in + the task inheriting the priority of a higher priority task. + pxTCBOfMutexHolder is a pointer to the TCB of the task that is releasing the + mutex. uxOriginalPriority is the task's configured (base) priority. */ + #define traceTASK_PRIORITY_DISINHERIT( pxTCBOfMutexHolder, uxOriginalPriority ) +#endif + +#ifndef traceBLOCKING_ON_QUEUE_RECEIVE + /* Task is about to block because it cannot read from a + queue/mutex/semaphore. pxQueue is a pointer to the queue/mutex/semaphore + upon which the read was attempted. pxCurrentTCB points to the TCB of the + task that attempted the read. */ + #define traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue ) +#endif + +#ifndef traceBLOCKING_ON_QUEUE_SEND + /* Task is about to block because it cannot write to a + queue/mutex/semaphore. pxQueue is a pointer to the queue/mutex/semaphore + upon which the write was attempted. pxCurrentTCB points to the TCB of the + task that attempted the write. */ + #define traceBLOCKING_ON_QUEUE_SEND( pxQueue ) +#endif + +#ifndef configCHECK_FOR_STACK_OVERFLOW + #define configCHECK_FOR_STACK_OVERFLOW 0 +#endif + +/* The following event macros are embedded in the kernel API calls. */ + +#ifndef traceMOVED_TASK_TO_READY_STATE + #define traceMOVED_TASK_TO_READY_STATE( pxTCB ) +#endif + +#ifndef tracePOST_MOVED_TASK_TO_READY_STATE + #define tracePOST_MOVED_TASK_TO_READY_STATE( pxTCB ) +#endif + +#ifndef traceQUEUE_CREATE + #define traceQUEUE_CREATE( pxNewQueue ) +#endif + +#ifndef traceQUEUE_CREATE_FAILED + #define traceQUEUE_CREATE_FAILED( ucQueueType ) +#endif + +#ifndef traceCREATE_MUTEX + #define traceCREATE_MUTEX( pxNewQueue ) +#endif + +#ifndef traceCREATE_MUTEX_FAILED + #define traceCREATE_MUTEX_FAILED() +#endif + +#ifndef traceGIVE_MUTEX_RECURSIVE + #define traceGIVE_MUTEX_RECURSIVE( pxMutex ) +#endif + +#ifndef traceGIVE_MUTEX_RECURSIVE_FAILED + #define traceGIVE_MUTEX_RECURSIVE_FAILED( pxMutex ) +#endif + +#ifndef traceTAKE_MUTEX_RECURSIVE + #define traceTAKE_MUTEX_RECURSIVE( pxMutex ) +#endif + +#ifndef traceTAKE_MUTEX_RECURSIVE_FAILED + #define traceTAKE_MUTEX_RECURSIVE_FAILED( pxMutex ) +#endif + +#ifndef traceCREATE_COUNTING_SEMAPHORE + #define traceCREATE_COUNTING_SEMAPHORE() +#endif + +#ifndef traceCREATE_COUNTING_SEMAPHORE_FAILED + #define traceCREATE_COUNTING_SEMAPHORE_FAILED() +#endif + +#ifndef traceQUEUE_SEND + #define traceQUEUE_SEND( pxQueue ) +#endif + +#ifndef traceQUEUE_SEND_FAILED + #define traceQUEUE_SEND_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_RECEIVE + #define traceQUEUE_RECEIVE( pxQueue ) +#endif + +#ifndef traceQUEUE_PEEK + #define traceQUEUE_PEEK( pxQueue ) +#endif + +#ifndef traceQUEUE_PEEK_FROM_ISR + #define traceQUEUE_PEEK_FROM_ISR( pxQueue ) +#endif + +#ifndef traceQUEUE_RECEIVE_FAILED + #define traceQUEUE_RECEIVE_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_SEND_FROM_ISR + #define traceQUEUE_SEND_FROM_ISR( pxQueue ) +#endif + +#ifndef traceQUEUE_SEND_FROM_ISR_FAILED + #define traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_RECEIVE_FROM_ISR + #define traceQUEUE_RECEIVE_FROM_ISR( pxQueue ) +#endif + +#ifndef traceQUEUE_RECEIVE_FROM_ISR_FAILED + #define traceQUEUE_RECEIVE_FROM_ISR_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_PEEK_FROM_ISR_FAILED + #define traceQUEUE_PEEK_FROM_ISR_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_DELETE + #define traceQUEUE_DELETE( pxQueue ) +#endif + +#ifndef traceTASK_CREATE + #define traceTASK_CREATE( pxNewTCB ) +#endif + +#ifndef traceTASK_CREATE_FAILED + #define traceTASK_CREATE_FAILED() +#endif + +#ifndef traceTASK_DELETE + #define traceTASK_DELETE( pxTaskToDelete ) +#endif + +#ifndef traceTASK_DELAY_UNTIL + #define traceTASK_DELAY_UNTIL( x ) +#endif + +#ifndef traceTASK_DELAY + #define traceTASK_DELAY() +#endif + +#ifndef traceTASK_PRIORITY_SET + #define traceTASK_PRIORITY_SET( pxTask, uxNewPriority ) +#endif + +#ifndef traceTASK_SUSPEND + #define traceTASK_SUSPEND( pxTaskToSuspend ) +#endif + +#ifndef traceTASK_RESUME + #define traceTASK_RESUME( pxTaskToResume ) +#endif + +#ifndef traceTASK_RESUME_FROM_ISR + #define traceTASK_RESUME_FROM_ISR( pxTaskToResume ) +#endif + +#ifndef traceTASK_INCREMENT_TICK + #define traceTASK_INCREMENT_TICK( xTickCount ) +#endif + +#ifndef traceTIMER_CREATE + #define traceTIMER_CREATE( pxNewTimer ) +#endif + +#ifndef traceTIMER_CREATE_FAILED + #define traceTIMER_CREATE_FAILED() +#endif + +#ifndef traceTIMER_COMMAND_SEND + #define traceTIMER_COMMAND_SEND( xTimer, xMessageID, xMessageValueValue, xReturn ) +#endif + +#ifndef traceTIMER_EXPIRED + #define traceTIMER_EXPIRED( pxTimer ) +#endif + +#ifndef traceTIMER_COMMAND_RECEIVED + #define traceTIMER_COMMAND_RECEIVED( pxTimer, xMessageID, xMessageValue ) +#endif + +#ifndef traceMALLOC + #define traceMALLOC( pvAddress, uiSize ) +#endif + +#ifndef traceFREE + #define traceFREE( pvAddress, uiSize ) +#endif + +#ifndef traceEVENT_GROUP_CREATE + #define traceEVENT_GROUP_CREATE( xEventGroup ) +#endif + +#ifndef traceEVENT_GROUP_CREATE_FAILED + #define traceEVENT_GROUP_CREATE_FAILED() +#endif + +#ifndef traceEVENT_GROUP_SYNC_BLOCK + #define traceEVENT_GROUP_SYNC_BLOCK( xEventGroup, uxBitsToSet, uxBitsToWaitFor ) +#endif + +#ifndef traceEVENT_GROUP_SYNC_END + #define traceEVENT_GROUP_SYNC_END( xEventGroup, uxBitsToSet, uxBitsToWaitFor, xTimeoutOccurred ) ( void ) xTimeoutOccurred +#endif + +#ifndef traceEVENT_GROUP_WAIT_BITS_BLOCK + #define traceEVENT_GROUP_WAIT_BITS_BLOCK( xEventGroup, uxBitsToWaitFor ) +#endif + +#ifndef traceEVENT_GROUP_WAIT_BITS_END + #define traceEVENT_GROUP_WAIT_BITS_END( xEventGroup, uxBitsToWaitFor, xTimeoutOccurred ) ( void ) xTimeoutOccurred +#endif + +#ifndef traceEVENT_GROUP_CLEAR_BITS + #define traceEVENT_GROUP_CLEAR_BITS( xEventGroup, uxBitsToClear ) +#endif + +#ifndef traceEVENT_GROUP_CLEAR_BITS_FROM_ISR + #define traceEVENT_GROUP_CLEAR_BITS_FROM_ISR( xEventGroup, uxBitsToClear ) +#endif + +#ifndef traceEVENT_GROUP_SET_BITS + #define traceEVENT_GROUP_SET_BITS( xEventGroup, uxBitsToSet ) +#endif + +#ifndef traceEVENT_GROUP_SET_BITS_FROM_ISR + #define traceEVENT_GROUP_SET_BITS_FROM_ISR( xEventGroup, uxBitsToSet ) +#endif + +#ifndef traceEVENT_GROUP_DELETE + #define traceEVENT_GROUP_DELETE( xEventGroup ) +#endif + +#ifndef tracePEND_FUNC_CALL + #define tracePEND_FUNC_CALL(xFunctionToPend, pvParameter1, ulParameter2, ret) +#endif + +#ifndef tracePEND_FUNC_CALL_FROM_ISR + #define tracePEND_FUNC_CALL_FROM_ISR(xFunctionToPend, pvParameter1, ulParameter2, ret) +#endif + +#ifndef traceQUEUE_REGISTRY_ADD + #define traceQUEUE_REGISTRY_ADD(xQueue, pcQueueName) +#endif + +#ifndef traceTASK_NOTIFY_TAKE_BLOCK + #define traceTASK_NOTIFY_TAKE_BLOCK() +#endif + +#ifndef traceTASK_NOTIFY_TAKE + #define traceTASK_NOTIFY_TAKE() +#endif + +#ifndef traceTASK_NOTIFY_WAIT_BLOCK + #define traceTASK_NOTIFY_WAIT_BLOCK() +#endif + +#ifndef traceTASK_NOTIFY_WAIT + #define traceTASK_NOTIFY_WAIT() +#endif + +#ifndef traceTASK_NOTIFY + #define traceTASK_NOTIFY() +#endif + +#ifndef traceTASK_NOTIFY_FROM_ISR + #define traceTASK_NOTIFY_FROM_ISR() +#endif + +#ifndef traceTASK_NOTIFY_GIVE_FROM_ISR + #define traceTASK_NOTIFY_GIVE_FROM_ISR() +#endif + +#ifndef configGENERATE_RUN_TIME_STATS + #define configGENERATE_RUN_TIME_STATS 0 +#endif + +#if ( configGENERATE_RUN_TIME_STATS == 1 ) + + #ifndef portCONFIGURE_TIMER_FOR_RUN_TIME_STATS + #error If configGENERATE_RUN_TIME_STATS is defined then portCONFIGURE_TIMER_FOR_RUN_TIME_STATS must also be defined. portCONFIGURE_TIMER_FOR_RUN_TIME_STATS should call a port layer function to setup a peripheral timer/counter that can then be used as the run time counter time base. + #endif /* portCONFIGURE_TIMER_FOR_RUN_TIME_STATS */ + + #ifndef portGET_RUN_TIME_COUNTER_VALUE + #ifndef portALT_GET_RUN_TIME_COUNTER_VALUE + #error If configGENERATE_RUN_TIME_STATS is defined then either portGET_RUN_TIME_COUNTER_VALUE or portALT_GET_RUN_TIME_COUNTER_VALUE must also be defined. See the examples provided and the FreeRTOS web site for more information. + #endif /* portALT_GET_RUN_TIME_COUNTER_VALUE */ + #endif /* portGET_RUN_TIME_COUNTER_VALUE */ + +#endif /* configGENERATE_RUN_TIME_STATS */ + +#ifndef portCONFIGURE_TIMER_FOR_RUN_TIME_STATS + #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() +#endif + +#ifndef configUSE_MALLOC_FAILED_HOOK + #define configUSE_MALLOC_FAILED_HOOK 0 +#endif + +#ifndef portPRIVILEGE_BIT + #define portPRIVILEGE_BIT ( ( UBaseType_t ) 0x00 ) +#endif + +#ifndef portYIELD_WITHIN_API + #define portYIELD_WITHIN_API portYIELD +#endif + +#ifndef portSUPPRESS_TICKS_AND_SLEEP + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) +#endif + +#ifndef configEXPECTED_IDLE_TIME_BEFORE_SLEEP + #define configEXPECTED_IDLE_TIME_BEFORE_SLEEP 2 +#endif + +#if configEXPECTED_IDLE_TIME_BEFORE_SLEEP < 2 + #error configEXPECTED_IDLE_TIME_BEFORE_SLEEP must not be less than 2 +#endif + +#ifndef configUSE_TICKLESS_IDLE + #define configUSE_TICKLESS_IDLE 0 +#endif + +#ifndef configPRE_SLEEP_PROCESSING + #define configPRE_SLEEP_PROCESSING( x ) +#endif + +#ifndef configPOST_SLEEP_PROCESSING + #define configPOST_SLEEP_PROCESSING( x ) +#endif + +#ifndef configUSE_QUEUE_SETS + #define configUSE_QUEUE_SETS 0 +#endif + +#ifndef portTASK_USES_FLOATING_POINT + #define portTASK_USES_FLOATING_POINT() +#endif + +#ifndef configUSE_TIME_SLICING + #define configUSE_TIME_SLICING 1 +#endif + +#ifndef configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS + #define configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS 0 +#endif + +#ifndef configUSE_STATS_FORMATTING_FUNCTIONS + #define configUSE_STATS_FORMATTING_FUNCTIONS 0 +#endif + +#ifndef portASSERT_IF_INTERRUPT_PRIORITY_INVALID + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() +#endif + +#ifndef configUSE_TRACE_FACILITY + #define configUSE_TRACE_FACILITY 0 +#endif + +#ifndef mtCOVERAGE_TEST_MARKER + #define mtCOVERAGE_TEST_MARKER() +#endif + +#ifndef mtCOVERAGE_TEST_DELAY + #define mtCOVERAGE_TEST_DELAY() +#endif + +#ifndef portASSERT_IF_IN_ISR + #define portASSERT_IF_IN_ISR() +#endif + +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 0 +#endif + +#ifndef configAPPLICATION_ALLOCATED_HEAP + #define configAPPLICATION_ALLOCATED_HEAP 0 +#endif + +#ifndef configUSE_TASK_NOTIFICATIONS + #define configUSE_TASK_NOTIFICATIONS 1 +#endif + +#ifndef portTICK_TYPE_IS_ATOMIC + #define portTICK_TYPE_IS_ATOMIC 0 +#endif + +#ifndef configSUPPORT_STATIC_ALLOCATION + /* Defaults to 0 for backward compatibility. */ + #define configSUPPORT_STATIC_ALLOCATION 0 +#endif + +#ifndef configSUPPORT_DYNAMIC_ALLOCATION + /* Defaults to 1 for backward compatibility. */ + #define configSUPPORT_DYNAMIC_ALLOCATION 1 +#endif + +/* Sanity check the configuration. */ +#if( configUSE_TICKLESS_IDLE != 0 ) + #if( INCLUDE_vTaskSuspend != 1 ) + #error INCLUDE_vTaskSuspend must be set to 1 if configUSE_TICKLESS_IDLE is not set to 0 + #endif /* INCLUDE_vTaskSuspend */ +#endif /* configUSE_TICKLESS_IDLE */ + +#if( ( configSUPPORT_STATIC_ALLOCATION == 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 0 ) ) + #error configSUPPORT_STATIC_ALLOCATION and configSUPPORT_DYNAMIC_ALLOCATION cannot both be 0, but can both be 1. +#endif + +#if( ( configUSE_RECURSIVE_MUTEXES == 1 ) && ( configUSE_MUTEXES != 1 ) ) + #error configUSE_MUTEXES must be set to 1 to use recursive mutexes +#endif + +#if( portTICK_TYPE_IS_ATOMIC == 0 ) + /* Either variables of tick type cannot be read atomically, or + portTICK_TYPE_IS_ATOMIC was not set - map the critical sections used when + the tick count is returned to the standard critical section macros. */ + #define portTICK_TYPE_ENTER_CRITICAL() portENTER_CRITICAL() + #define portTICK_TYPE_EXIT_CRITICAL() portEXIT_CRITICAL() + #define portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR() portSET_INTERRUPT_MASK_FROM_ISR() + #define portTICK_TYPE_CLEAR_INTERRUPT_MASK_FROM_ISR( x ) portCLEAR_INTERRUPT_MASK_FROM_ISR( ( x ) ) +#else + /* The tick type can be read atomically, so critical sections used when the + tick count is returned can be defined away. */ + #define portTICK_TYPE_ENTER_CRITICAL() + #define portTICK_TYPE_EXIT_CRITICAL() + #define portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR() 0 + #define portTICK_TYPE_CLEAR_INTERRUPT_MASK_FROM_ISR( x ) ( void ) x +#endif + +/* Definitions to allow backward compatibility with FreeRTOS versions prior to +V8 if desired. */ +#ifndef configENABLE_BACKWARD_COMPATIBILITY + #define configENABLE_BACKWARD_COMPATIBILITY 1 +#endif + +#if configENABLE_BACKWARD_COMPATIBILITY == 1 + #define eTaskStateGet eTaskGetState + #define portTickType TickType_t + #define xTaskHandle TaskHandle_t + #define xQueueHandle QueueHandle_t + #define xSemaphoreHandle SemaphoreHandle_t + #define xQueueSetHandle QueueSetHandle_t + #define xQueueSetMemberHandle QueueSetMemberHandle_t + #define xTimeOutType TimeOut_t + #define xMemoryRegion MemoryRegion_t + #define xTaskParameters TaskParameters_t + #define xTaskStatusType TaskStatus_t + #define xTimerHandle TimerHandle_t + #define xCoRoutineHandle CoRoutineHandle_t + #define pdTASK_HOOK_CODE TaskHookFunction_t + #define portTICK_RATE_MS portTICK_PERIOD_MS + #define pcTaskGetTaskName pcTaskGetName + #define pcTimerGetTimerName pcTimerGetName + #define pcQueueGetQueueName pcQueueGetName + #define vTaskGetTaskInfo vTaskGetInfo + + /* Backward compatibility within the scheduler code only - these definitions + are not really required but are included for completeness. */ + #define tmrTIMER_CALLBACK TimerCallbackFunction_t + #define pdTASK_CODE TaskFunction_t + #define xListItem ListItem_t + #define xList List_t +#endif /* configENABLE_BACKWARD_COMPATIBILITY */ + +#if( configUSE_ALTERNATIVE_API != 0 ) + #error The alternative API was deprecated some time ago, and was removed in FreeRTOS V9.0 0 +#endif + +/* Set configUSE_TASK_FPU_SUPPORT to 0 to omit floating point support even +if floating point hardware is otherwise supported by the FreeRTOS port in use. +This constant is not supported by all FreeRTOS ports that include floating +point support. */ +#ifndef configUSE_TASK_FPU_SUPPORT + #define configUSE_TASK_FPU_SUPPORT 1 +#endif + +/* + * In line with software engineering best practice, FreeRTOS implements a strict + * data hiding policy, so the real structures used by FreeRTOS to maintain the + * state of tasks, queues, semaphores, etc. are not accessible to the application + * code. However, if the application writer wants to statically allocate such + * an object then the size of the object needs to be know. Dummy structures + * that are guaranteed to have the same size and alignment requirements of the + * real objects are used for this purpose. The dummy list and list item + * structures below are used for inclusion in such a dummy structure. + */ +struct xSTATIC_LIST_ITEM +{ + TickType_t xDummy1; + void *pvDummy2[ 4 ]; +}; +typedef struct xSTATIC_LIST_ITEM StaticListItem_t; + +/* See the comments above the struct xSTATIC_LIST_ITEM definition. */ +struct xSTATIC_MINI_LIST_ITEM +{ + TickType_t xDummy1; + void *pvDummy2[ 2 ]; +}; +typedef struct xSTATIC_MINI_LIST_ITEM StaticMiniListItem_t; + +/* See the comments above the struct xSTATIC_LIST_ITEM definition. */ +typedef struct xSTATIC_LIST +{ + UBaseType_t uxDummy1; + void *pvDummy2; + StaticMiniListItem_t xDummy3; +} StaticList_t; + +/* + * In line with software engineering best practice, especially when supplying a + * library that is likely to change in future versions, FreeRTOS implements a + * strict data hiding policy. This means the Task structure used internally by + * FreeRTOS is not accessible to application code. However, if the application + * writer wants to statically allocate the memory required to create a task then + * the size of the task object needs to be know. The StaticTask_t structure + * below is provided for this purpose. Its sizes and alignment requirements are + * guaranteed to match those of the genuine structure, no matter which + * architecture is being used, and no matter how the values in FreeRTOSConfig.h + * are set. Its contents are somewhat obfuscated in the hope users will + * recognise that it would be unwise to make direct use of the structure members. + */ +typedef struct xSTATIC_TCB +{ + void *pxDummy1; + #if ( portUSING_MPU_WRAPPERS == 1 ) + xMPU_SETTINGS xDummy2; + #endif + StaticListItem_t xDummy3[ 2 ]; + UBaseType_t uxDummy5; + void *pxDummy6; + uint8_t ucDummy7[ configMAX_TASK_NAME_LEN ]; + #if ( portSTACK_GROWTH > 0 ) + void *pxDummy8; + #endif + #if ( portCRITICAL_NESTING_IN_TCB == 1 ) + UBaseType_t uxDummy9; + #endif + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxDummy10[ 2 ]; + #endif + #if ( configUSE_MUTEXES == 1 ) + UBaseType_t uxDummy12[ 2 ]; + #endif + #if ( configUSE_APPLICATION_TASK_TAG == 1 ) + void *pxDummy14; + #endif + #if( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 ) + void *pvDummy15[ configNUM_THREAD_LOCAL_STORAGE_POINTERS ]; + #endif + #if ( configGENERATE_RUN_TIME_STATS == 1 ) + uint32_t ulDummy16; + #endif + #if ( configUSE_NEWLIB_REENTRANT == 1 ) + struct _reent xDummy17; + #endif + #if ( configUSE_TASK_NOTIFICATIONS == 1 ) + uint32_t ulDummy18; + uint8_t ucDummy19; + #endif + #if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + uint8_t uxDummy20; + #endif + +} StaticTask_t; + +/* + * In line with software engineering best practice, especially when supplying a + * library that is likely to change in future versions, FreeRTOS implements a + * strict data hiding policy. This means the Queue structure used internally by + * FreeRTOS is not accessible to application code. However, if the application + * writer wants to statically allocate the memory required to create a queue + * then the size of the queue object needs to be know. The StaticQueue_t + * structure below is provided for this purpose. Its sizes and alignment + * requirements are guaranteed to match those of the genuine structure, no + * matter which architecture is being used, and no matter how the values in + * FreeRTOSConfig.h are set. Its contents are somewhat obfuscated in the hope + * users will recognise that it would be unwise to make direct use of the + * structure members. + */ +typedef struct xSTATIC_QUEUE +{ + void *pvDummy1[ 3 ]; + + union + { + void *pvDummy2; + UBaseType_t uxDummy2; + } u; + + StaticList_t xDummy3[ 2 ]; + UBaseType_t uxDummy4[ 3 ]; + uint8_t ucDummy5[ 2 ]; + + #if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + uint8_t ucDummy6; + #endif + + #if ( configUSE_QUEUE_SETS == 1 ) + void *pvDummy7; + #endif + + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxDummy8; + uint8_t ucDummy9; + #endif + +} StaticQueue_t; +typedef StaticQueue_t StaticSemaphore_t; + +/* + * In line with software engineering best practice, especially when supplying a + * library that is likely to change in future versions, FreeRTOS implements a + * strict data hiding policy. This means the event group structure used + * internally by FreeRTOS is not accessible to application code. However, if + * the application writer wants to statically allocate the memory required to + * create an event group then the size of the event group object needs to be + * know. The StaticEventGroup_t structure below is provided for this purpose. + * Its sizes and alignment requirements are guaranteed to match those of the + * genuine structure, no matter which architecture is being used, and no matter + * how the values in FreeRTOSConfig.h are set. Its contents are somewhat + * obfuscated in the hope users will recognise that it would be unwise to make + * direct use of the structure members. + */ +typedef struct xSTATIC_EVENT_GROUP +{ + TickType_t xDummy1; + StaticList_t xDummy2; + + #if( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxDummy3; + #endif + + #if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + uint8_t ucDummy4; + #endif + +} StaticEventGroup_t; + +/* + * In line with software engineering best practice, especially when supplying a + * library that is likely to change in future versions, FreeRTOS implements a + * strict data hiding policy. This means the software timer structure used + * internally by FreeRTOS is not accessible to application code. However, if + * the application writer wants to statically allocate the memory required to + * create a software timer then the size of the queue object needs to be know. + * The StaticTimer_t structure below is provided for this purpose. Its sizes + * and alignment requirements are guaranteed to match those of the genuine + * structure, no matter which architecture is being used, and no matter how the + * values in FreeRTOSConfig.h are set. Its contents are somewhat obfuscated in + * the hope users will recognise that it would be unwise to make direct use of + * the structure members. + */ +typedef struct xSTATIC_TIMER +{ + void *pvDummy1; + StaticListItem_t xDummy2; + TickType_t xDummy3; + UBaseType_t uxDummy4; + void *pvDummy5[ 2 ]; + #if( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxDummy6; + #endif + + #if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + uint8_t ucDummy7; + #endif + +} StaticTimer_t; + +#ifdef __cplusplus +} +#endif + +#endif /* INC_FREERTOS_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/8d/80f5cb4e8a970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/8d/80f5cb4e8a970017138fe0bf747e5677 new file mode 100644 index 0000000..cae9616 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/8d/80f5cb4e8a970017138fe0bf747e5677 @@ -0,0 +1,71 @@ +// ----------------------------------------------------------------------------- +/// @file main.c +/// @brief Description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @file main.c +/// @ingroup {group_name} + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Type definitions +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// File-scope variables +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function definitions +// ----------------------------------------------------------------------------- + + +int main (void) +{ + + + /* Start the scheduler. */ + vTaskStartScheduler(); + + /* Will only get here if there was insufficient memory to create the idle + task. The idle task is created within vTaskStartScheduler(). */ + for( ;; ); + + + return -1; +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/8d/c035f55ac696001713a7ede92b37d6f1 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/8d/c035f55ac696001713a7ede92b37d6f1 new file mode 100644 index 0000000..8c7ab3e --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/8d/c035f55ac696001713a7ede92b37d6f1 @@ -0,0 +1,61 @@ +# STM support library + +SRC_DIR = Libraries/STM32F10x_StdPeriph_Driver/src/ +INC_DIR = Libraries/STM32F10x_StdPeriph_Driver/inc/ +DEV_DIR = Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/ +COR_DIR = Libraries/CMSIS/CM3/CoreSupport/ +OBJ_DIR = Libraries/STM32F10x_StdPeriph_Driver/obj + +CROSS_COMPILE = arm-none-eabi- + +CC = $(CROSS_COMPILE)gcc +CCFLAGS = -c -O2 -g -fno-common -mcpu=cortex-m3 -mthumb -DUSE_FULL_ASSERT -I$(INC_DIR) -I$(DEV_DIR) -I$(COR_DIR) -I. + +AR = $(CROSS_COMPILE)ar +ARFLAGS = rs + +OBJECTS = \ +misc.o \ +stm32f10x_adc.o \ +stm32f10x_bkp.o \ +stm32f10x_can.o \ +stm32f10x_cec.o \ +stm32f10x_crc.o \ +stm32f10x_dac.o \ +stm32f10x_dbgmcu.o \ +stm32f10x_dma.o \ +stm32f10x_exti.o \ +stm32f10x_flash.o \ +stm32f10x_fsmc.o \ +stm32f10x_gpio.o \ +stm32f10x_i2c.o \ +stm32f10x_iwdg.o \ +stm32f10x_pwr.o \ +stm32f10x_rcc.o \ +stm32f10x_rtc.o \ +stm32f10x_sdio.o \ +stm32f10x_spi.o \ +stm32f10x_tim.o \ +stm32f10x_usart.o \ +stm32f10x_wwdg.o + +LIBRARY = libSTM_StdPeriph.a + +vpath %.c $(SRC_DIR) +vpath %.o $(OBJ_DIR) + +all: $(LIBRARY) + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +clean: + rm -rf $(LIBRARY) $(OBJ_DIR) + +$(OBJ_DIR): + mkdir -p $@ + +.PHONY: all clean diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/8d/c29d56089d9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/8d/c29d56089d9400171201ed9ff9474498 new file mode 100644 index 0000000..11013b8 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/8d/c29d56089d9400171201ed9ff9474498 @@ -0,0 +1,159 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef __PORTMACRO_H__ +#define __PORTMACRO_H__ + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if (configUSE_16_BIT_TICKS == 1) + typedef uint16_t TickType_t; + #define portMAX_DELAY (TickType_t) 0xFFFF +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY (TickType_t) 0xFFFFFFFFF + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif + + +/* Architecture specifics. */ +#define portSTACK_GROWTH (-1) +#define portTICK_PERIOD_MS ((TickType_t) 1000 / configTICK_RATE_HZ) +#define portBYTE_ALIGNMENT 8 + +/* Critical section handling. */ +extern void vPortEnterCritical(void); +extern void vPortExitCritical(void); +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() +#define portDISABLE_INTERRUPTS() asm( " CPSID I" ) +#define portENABLE_INTERRUPTS() asm( " CPSIE I" ) + +/* Scheduler utilities. */ +#pragma SWI_ALIAS( vPortYield, 0 ) +extern void vPortYield( void ); +#define portYIELD() vPortYield() +#define portSYS_SSIR1_REG ( * ( ( volatile uint32_t * ) 0xFFFFFFB0 ) ) +#define portSYS_SSIR1_SSKEY ( 0x7500UL ) +#define portYIELD_WITHIN_API() { portSYS_SSIR1_REG = portSYS_SSIR1_SSKEY; asm( " DSB " ); asm( " ISB " ); } +#define portYIELD_FROM_ISR( x ) if( x != pdFALSE ){ portSYS_SSIR1_REG = portSYS_SSIR1_SSKEY; ( void ) portSYS_SSIR1_REG; } + +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +/* Architecture specific optimisations. */ +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31 - __clz( ( uxReadyPriorities ) ) ) + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION(vFunction, pvParameters) void vFunction(void *pvParameters) +#define portTASK_FUNCTION_PROTO(vFunction, pvParameters) void vFunction(void *pvParameters) + +#endif /* __PORTMACRO_H__ */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/8d/d2e251089d9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/8d/d2e251089d9400171201ed9ff9474498 new file mode 100644 index 0000000..309d221 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/8d/d2e251089d9400171201ed9ff9474498 @@ -0,0 +1,139 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT long +#define portDOUBLE long +#define portLONG long +#define portSHORT int +#define portSTACK_TYPE uint16_t +#define portBASE_TYPE portSHORT + +typedef portSTACK_TYPE StackType_t; +typedef short BaseType_t; +typedef unsigned short UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +#define portENTER_CRITICAL() __asm{ pushf } \ + __asm{ cli } \ + +#define portEXIT_CRITICAL() __asm{ popf } + +#define portDISABLE_INTERRUPTS() __asm{ cli } + +#define portENABLE_INTERRUPTS() __asm{ sti } +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portNOP() __asm{ nop } +#define portSTACK_GROWTH ( -1 ) +#define portSWITCH_INT_NUMBER 0x80 +#define portYIELD() __asm{ int portSWITCH_INT_NUMBER } +#define portDOS_TICK_RATE ( 18.20648 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portTICKS_PER_DOS_TICK ( ( uint16_t ) ( ( ( portDOUBLE ) configTICK_RATE_HZ / portDOS_TICK_RATE ) + 0.5 ) ) +#define portINITIAL_SW ( ( portSTACK_TYPE ) 0x0202 ) /* Start the tasks with interrupts enabled. */ +#define portBYTE_ALIGNMENT ( 2 ) +/*-----------------------------------------------------------*/ + +/* Compiler specifics. */ +#define portINPUT_BYTE( xAddr ) inp( xAddr ) +#define portOUTPUT_BYTE( xAddr, ucValue ) outp( xAddr, ucValue ) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vTaskFunction, pvParameters ) void vTaskFunction( void *pvParameters ) +#define portTASK_FUNCTION( vTaskFunction, pvParameters ) void vTaskFunction( void *pvParameters ) + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/8e/40bb832698970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/8e/40bb832698970017138fe0bf747e5677 new file mode 100644 index 0000000..ad6e95f --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/8e/40bb832698970017138fe0bf747e5677 @@ -0,0 +1,135 @@ +// ----------------------------------------------------------------------------- +/// @file main.c +/// @brief Description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @file main.c +/// @ingroup {group_name} + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + +// FreeRTOS includes +#include "FreeRTOS.h" +#include "task.h" + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + +/* The time between cycles of the 'check' functionality (defined within the +tick hook. */ +#define mainCHECK_DELAY ( ( TickType_t ) 5000 / portTICK_PERIOD_MS ) + +// ----------------------------------------------------------------------------- +// Type definitions +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// File-scope variables +// ----------------------------------------------------------------------------- + +/* Variable that counts at 20KHz to provide the time base for the run time +stats. */ +unsigned long ulRunTimeStatsClock = 0UL; + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function definitions +// ----------------------------------------------------------------------------- + + +int main (void) +{ + + + /* Start the scheduler. */ + vTaskStartScheduler(); + + /* Will only get here if there was insufficient memory to create the idle + task. The idle task is created within vTaskStartScheduler(). */ + for( ;; ); + + + return -1; +} + + +void vApplicationTickHook( void ) +{ +char *pcMessage = "Status: PASS"; +static unsigned long ulTicksSinceLastDisplay = 0; +portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; + + /* Called from every tick interrupt as described in the comments at the top + of this file. + + Have enough ticks passed to make it time to perform our health status + check again? */ + ulTicksSinceLastDisplay++; + if( ulTicksSinceLastDisplay >= mainCHECK_DELAY ) + { + /* Reset the counter so these checks run again in mainCHECK_DELAY + ticks time. */ + ulTicksSinceLastDisplay = 0; + + /* Has an error been found in any task? */ + if( xAreGenericQueueTasksStillRunning() != pdTRUE ) + { + pcMessage = "ERROR: GEN Q"; + } + else if( xAreQueuePeekTasksStillRunning() != pdTRUE ) + { + pcMessage = "ERROR: PEEK Q"; + } + else if( xAreBlockingQueuesStillRunning() != pdTRUE ) + { + pcMessage = "ERROR: BLOCK Q"; + } + else if( xAreSemaphoreTasksStillRunning() != pdTRUE ) + { + pcMessage = "ERROR: SEMAPHR"; + } + else if( xArePollingQueuesStillRunning() != pdTRUE ) + { + pcMessage = "ERROR: POLL Q"; + } + else if( xAreIntegerMathsTaskStillRunning() != pdTRUE ) + { + pcMessage = "ERROR: INT MATH"; + } + else if( xAreRecursiveMutexTasksStillRunning() != pdTRUE ) + { + pcMessage = "ERROR: REC MUTEX"; + } + + /* Send the message to the OLED gatekeeper for display. The + xHigherPriorityTaskWoken parameter is not actually used here + as this function is running in the tick interrupt anyway - but + it must still be supplied. */ + xHigherPriorityTaskWoken = pdFALSE; + xQueueSendFromISR( xLCDQueue, &pcMessage, &xHigherPriorityTaskWoken ); + } +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/8e/c00e59089d9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/8e/c00e59089d9400171201ed9ff9474498 new file mode 100644 index 0000000..543205f --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/8e/c00e59089d9400171201ed9ff9474498 @@ -0,0 +1,185 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Hardware includes. */ +#include "msp430.h" + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT int +#define portBASE_TYPE portSHORT + +/* The stack type changes depending on the data model. */ +#ifdef __LARGE_DATA_MODEL__ + #define portSTACK_TYPE uint32_t +#else + #define portSTACK_TYPE uint16_t + #define portPOINTER_SIZE_TYPE uint16_t +#endif + +typedef portSTACK_TYPE StackType_t; +typedef short BaseType_t; +typedef unsigned short UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif + +/*-----------------------------------------------------------*/ + +/* Interrupt control macros. */ +#define portDISABLE_INTERRUPTS() _disable_interrupt(); _nop() +#define portENABLE_INTERRUPTS() _enable_interrupt(); _nop() +/*-----------------------------------------------------------*/ + +/* Critical section control macros. */ +#define portNO_CRITICAL_SECTION_NESTING ( ( uint16_t ) 0 ) + +#define portENTER_CRITICAL() \ +{ \ +extern volatile uint16_t usCriticalNesting; \ + \ + portDISABLE_INTERRUPTS(); \ + \ + /* Now interrupts are disabled usCriticalNesting can be accessed */ \ + /* directly. Increment ulCriticalNesting to keep a count of how many */ \ + /* times portENTER_CRITICAL() has been called. */ \ + usCriticalNesting++; \ +} + +#define portEXIT_CRITICAL() \ +{ \ +extern volatile uint16_t usCriticalNesting; \ + \ + if( usCriticalNesting > portNO_CRITICAL_SECTION_NESTING ) \ + { \ + /* Decrement the nesting count as we are leaving a critical section. */ \ + usCriticalNesting--; \ + \ + /* If the nesting level has reached zero then interrupts should be */ \ + /* re-enabled. */ \ + if( usCriticalNesting == portNO_CRITICAL_SECTION_NESTING ) \ + { \ + portENABLE_INTERRUPTS(); \ + } \ + } \ +} +/*-----------------------------------------------------------*/ + +/* Task utilities. */ + +/* + * Manual context switch called by portYIELD or taskYIELD. + */ +extern void vPortYield( void ); +#define portYIELD() vPortYield() +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 2 +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portNOP() __no_operation() +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +extern void vTaskSwitchContext( void ); +#define portYIELD_FROM_ISR( x ) if( x ) vPortYield() + +void vApplicationSetupTimerInterrupt( void ); + +/* sizeof( int ) != sizeof( long ) so a full printf() library is required if +run time stats information is to be displayed. */ +#define portLU_PRINTF_SPECIFIER_REQUIRED + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/8f/509ff917a69700171090ed03afc2ec65 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/8f/509ff917a69700171090ed03afc2ec65 new file mode 100644 index 0000000..f1bdb3a --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/8f/509ff917a69700171090ed03afc2ec65 @@ -0,0 +1,107 @@ +// ----------------------------------------------------------------------------- +/// @file freeRTOSFixes.c +/// @brief Description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @file freeRTOSFixes.c +/// @ingroup {group_name} + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + +#include +#include +#include + +#include "freeRTOSFixes.h" + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Type definitions +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// File-scope variables +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function definitions +// ----------------------------------------------------------------------------- + +void OS_logTaskInfo(xTaskHandle taskHandle) +{ + unsigned portBASE_TYPE highWaterMark; + char text[128]; + + snprintf(text, sizeof(text), "Task %s\n", pcTaskGetTaskName(taskHandle)); + Shell_sendString(text); + + highWaterMark = uxTaskGetStackHighWaterMark(taskHandle); + snprintf(text, sizeof(text), "Stack high water mark : %lu long words\n", highWaterMark); + Shell_sendString(text); +} + +// Implementation for libc, needed for printf related functions. +caddr_t _sbrk(int incr) +{ + extern char _end; + static char* heap_end; + char* prev_heap_end; + + if(heap_end == 0) + { + heap_end = &_end; + } + + prev_heap_end = heap_end; + heap_end += incr; + return (caddr_t)prev_heap_end; +} + +// Stack overflow hook +void vApplicationStackOverflowHook(xTaskHandle xTask, signed portCHAR* pcTaskName) +{ + Logger_fatal(FATALCODE_STACKOVERFLOW); +} + +// Malloc failed hook +void vApplicationMallocFailedHook(void) +{ + Logger_fatal(FATALCODE_MALLOCFAILED); +} + +// Assert for StdPeriph library +void assert_failed(uint8_t* file, uint32_t line) +{ + Logger_log((char*)file, "", line, LOGTYPE_ERROR, "assert failed"); +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/8f/b000acb2c596001713a7ede92b37d6f1 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/8f/b000acb2c596001713a7ede92b37d6f1 new file mode 100644 index 0000000..90788c5 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/8f/b000acb2c596001713a7ede92b37d6f1 @@ -0,0 +1,62 @@ +# STM support library + +SRC_DIR = Libraries/STM32F10x_StdPeriph_Driver/src/ +INC_DIR = \ +Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/ +Libraries/STM32F10x_StdPeriph_Driver/inc/ \ + +OBJ_DIR = Libraries/STM32F10x_StdPeriph_Driver/obj + +CROSS_COMPILE = arm-none-eabi- + +CC = $(CROSS_COMPILE)gcc +CCFLAGS = -c -O2 -g -fno-common -mcpu=cortex-m3 -mthumb -DUSE_FULL_ASSERT -I$(INC_DIR) -I. + +AR = $(CROSS_COMPILE)ar +ARFLAGS = rs + +OBJECTS = \ +misc.o \ +stm32f10x_adc.o \ +stm32f10x_bkp.o \ +stm32f10x_can.o \ +stm32f10x_cec.o \ +stm32f10x_crc.o \ +stm32f10x_dac.o \ +stm32f10x_dbgmcu.o \ +stm32f10x_dma.o \ +stm32f10x_exti.o \ +stm32f10x_flash.o \ +stm32f10x_fsmc.o \ +stm32f10x_gpio.o \ +stm32f10x_i2c.o \ +stm32f10x_iwdg.o \ +stm32f10x_pwr.o \ +stm32f10x_rcc.o \ +stm32f10x_rtc.o \ +stm32f10x_sdio.o \ +stm32f10x_spi.o \ +stm32f10x_tim.o \ +stm32f10x_usart.o \ +stm32f10x_wwdg.o + +LIBRARY = libSTM_StdPeriph.a + +vpath %.c $(SRC_DIR) +vpath %.o $(OBJ_DIR) + +all: $(LIBRARY) + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +clean: + rm -rf $(LIBRARY) $(OBJ_DIR) + +$(OBJ_DIR): + mkdir -p $@ + +.PHONY: all clean diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/91/a2f564089d9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/91/a2f564089d9400171201ed9ff9474498 new file mode 100644 index 0000000..1ba51a9 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/91/a2f564089d9400171201ed9ff9474498 @@ -0,0 +1,181 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions - these are a bit legacy and not really used now, other than +portSTACK_TYPE and portBASE_TYPE. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 8 +#define portSTACK_GROWTH -1 +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portNOP() nop() +#define portSTART_SCHEDULER_TRAP_NO ( 32 ) +#define portYIELD_TRAP_NO ( 33 ) +#define portKERNEL_INTERRUPT_PRIORITY ( 1 ) + +void vPortYield( void ); +#define portYIELD() vPortYield() + +extern void vTaskSwitchContext( void ); +#define portYIELD_FROM_ISR( x ) if( x != pdFALSE ) vTaskSwitchContext() + +/* + * This function tells the kernel that the task referenced by xTask is going to + * use the floating point registers and therefore requires the floating point + * registers saved as part of its context. + */ +BaseType_t xPortUsesFloatingPoint( void* xTask ); + +/* + * The flop save and restore functions are defined in portasm.src and called by + * the trace "task switched in" and "trace task switched out" macros. + */ +void vPortSaveFlopRegisters( void *pulBuffer ); +void vPortRestoreFlopRegisters( void *pulBuffer ); + +/* + * pxTaskTag is used to point to the buffer into which the floating point + * context should be saved. If pxTaskTag is NULL then the task does not use + * a floating point context. + */ +#define traceTASK_SWITCHED_OUT() if( pxCurrentTCB->pxTaskTag != NULL ) vPortSaveFlopRegisters( pxCurrentTCB->pxTaskTag ) +#define traceTASK_SWITCHED_IN() if( pxCurrentTCB->pxTaskTag != NULL ) vPortRestoreFlopRegisters( pxCurrentTCB->pxTaskTag ) + +/* + * These macros should be called directly, but through the taskENTER_CRITICAL() + * and taskEXIT_CRITICAL() macros. + */ +#define portENABLE_INTERRUPTS() set_imask( 0x00 ) +#define portDISABLE_INTERRUPTS() set_imask( portKERNEL_INTERRUPT_PRIORITY ) + +/* Critical nesting counts are stored in the TCB. */ +#define portCRITICAL_NESTING_IN_TCB ( 1 ) + +/* The critical nesting functions defined within tasks.c. */ +extern void vTaskEnterCritical( void ); +extern void vTaskExitCritical( void ); +#define portENTER_CRITICAL() vTaskEnterCritical(); +#define portEXIT_CRITICAL() vTaskExitCritical(); + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/91/a48462089d9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/91/a48462089d9400171201ed9ff9474498 new file mode 100644 index 0000000..8e159bd --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/91/a48462089d9400171201ed9ff9474498 @@ -0,0 +1,184 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Hardware specifics. */ +#include "machine.h" + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions - these are a bit legacy and not really used now, other than +portSTACK_TYPE and portBASE_TYPE. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 8 /* Could make four, according to manual. */ +#define portSTACK_GROWTH -1 +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portNOP() nop() + + +#pragma inline_asm vPortYield +static void vPortYield( void ) +{ + /* Save clobbered register - may not actually be necessary if inline asm + functions are considered to use the same rules as function calls by the + compiler. */ + PUSH.L R5 + /* Set ITU SWINTR. */ + MOV.L #553696, R5 + MOV.B #1, [R5] + /* Read back to ensure the value is taken before proceeding. */ + MOV.L [R5], R5 + /* Restore clobbered register to its previous value. */ + POP R5 +} +#define portYIELD() vPortYield() +#define portYIELD_FROM_ISR( x ) if( x != pdFALSE ) portYIELD() + +/* These macros should not be called directly, but through the +taskENTER_CRITICAL() and taskEXIT_CRITICAL() macros. An extra check is +performed if configASSERT() is defined to ensure an assertion handler does not +inadvertently attempt to lower the IPL when the call to assert was triggered +because the IPL value was found to be above configMAX_SYSCALL_INTERRUPT_PRIORITY +when an ISR safe FreeRTOS API function was executed. ISR safe FreeRTOS API +functions are those that end in FromISR. FreeRTOS maintains a separate +interrupt API to ensure API function and interrupt entry is as fast and as +simple as possible. */ +#define portENABLE_INTERRUPTS() set_ipl( ( long ) 0 ) +#ifdef configASSERT + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() configASSERT( ( get_ipl() <= configMAX_SYSCALL_INTERRUPT_PRIORITY ) ) + #define portDISABLE_INTERRUPTS() if( get_ipl() < configMAX_SYSCALL_INTERRUPT_PRIORITY ) set_ipl( ( long ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#else + #define portDISABLE_INTERRUPTS() set_ipl( ( long ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#endif + +/* Critical nesting counts are stored in the TCB. */ +#define portCRITICAL_NESTING_IN_TCB ( 1 ) + +/* The critical nesting functions defined within tasks.c. */ +extern void vTaskEnterCritical( void ); +extern void vTaskExitCritical( void ); +#define portENTER_CRITICAL() vTaskEnterCritical() +#define portEXIT_CRITICAL() vTaskExitCritical() + +/* As this port allows interrupt nesting... */ +#define portSET_INTERRUPT_MASK_FROM_ISR() ( UBaseType_t ) get_ipl(); set_ipl( ( long ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ) set_ipl( ( long ) uxSavedInterruptStatus ) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/94/118162999f9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/94/118162999f9400171201ed9ff9474498 new file mode 100644 index 0000000..e69de29 diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/94/703fea42a79700171090ed03afc2ec65 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/94/703fea42a79700171090ed03afc2ec65 new file mode 100644 index 0000000..079824e --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/94/703fea42a79700171090ed03afc2ec65 @@ -0,0 +1,109 @@ +// ----------------------------------------------------------------------------- +/// @file freeRTOSFixes.c +/// @brief Description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @file freeRTOSFixes.c +/// @ingroup {group_name} + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + +#include +#include +#include + +#include "freeRTOSFixes.h" + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Type definitions +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// File-scope variables +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function definitions +// ----------------------------------------------------------------------------- + +void _init(void) {return;} + +void OS_logTaskInfo(xTaskHandle taskHandle) +{ + unsigned portBASE_TYPE highWaterMark; + char text[128]; + + snprintf(text, sizeof(text), "Task %s\n", pcTaskGetTaskName(taskHandle)); +// Shell_sendString(text); + +// highWaterMark = uxTaskGetStackHighWaterMark(taskHandle); +// snprintf(text, sizeof(text), "Stack high water mark : %lu long words\n", highWaterMark); +// Shell_sendString(text); +} + +// Implementation for libc, needed for printf related functions. +caddr_t _sbrk(int incr) +{ + extern char _end; + static char* heap_end; + char* prev_heap_end; + + if(heap_end == 0) + { + heap_end = &_end; + } + + prev_heap_end = heap_end; + heap_end += incr; + return (caddr_t)prev_heap_end; +} + +// Stack overflow hook +void vApplicationStackOverflowHook(xTaskHandle xTask, signed portCHAR* pcTaskName) +{ +// Logger_fatal(FATALCODE_STACKOVERFLOW); +} + +// Malloc failed hook +void vApplicationMallocFailedHook(void) +{ +// Logger_fatal(FATALCODE_MALLOCFAILED); +} + +// Assert for StdPeriph library +void assert_failed(uint8_t* file, uint32_t line) +{ +// Logger_log((char*)file, "", line, LOGTYPE_ERROR, "assert failed"); +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/96/80b1f2a997970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/96/80b1f2a997970017138fe0bf747e5677 new file mode 100644 index 0000000..fcd92dd --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/96/80b1f2a997970017138fe0bf747e5677 @@ -0,0 +1,73 @@ +// ----------------------------------------------------------------------------- +/// @file main.c +/// @brief Description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @file main.c +/// @ingroup {group_name} + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + +// FreeRTOS includes +#include "FreeRTOS.h" +#include "task.h" + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Type definitions +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// File-scope variables +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function definitions +// ----------------------------------------------------------------------------- + + +int main (void) +{ + + + /* Start the scheduler. */ + vTaskStartScheduler(); + + /* Will only get here if there was insufficient memory to create the idle + task. The idle task is created within vTaskStartScheduler(). */ + for( ;; ); + + + return -1; +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/96/d0739ce590970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/96/d0739ce590970017138fe0bf747e5677 new file mode 100644 index 0000000..f8840cd --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/96/d0739ce590970017138fe0bf747e5677 @@ -0,0 +1,126 @@ +ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +heap_4.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -fno-common -mcpu=cortex-m3 -mthumb $(RELEASE_DEFINES) $(INCLUDES) +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -nostartfiles -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map +release: export LDARCHIVES := -L. -L$(STM32_STDPERIPH_ROOT) -lSTM_StdPeriph +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -rf $(OBJ_DIR) hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +else + +vpath %.c \ +src \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ +$(STM32_DEVICE_SUPPORT_DIR) +vpath %.s $(STARTER_SCRIPT_DIR) +vpath %.o $(OBJ_DIR) + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) #$(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +#$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) +# $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)/$@ + +$(OBJ_DIR): + mkdir -p $@ + +endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/98/d0a9dcf99c970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/98/d0a9dcf99c970017138fe0bf747e5677 new file mode 100644 index 0000000..f864680 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/98/d0a9dcf99c970017138fe0bf747e5677 @@ -0,0 +1,134 @@ +ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +heap_4.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +STM32_CORE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) \ +-I$(STM32_CORE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -fno-common -mcpu=cortex-m3 -mthumb $(RELEASE_DEFINES) $(INCLUDES) +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -nostartfiles -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map +release: export LDARCHIVES := -L. -L$(STM32_STDPERIPH_ROOT) -lSTM_StdPeriph -lhsb_mrts_release -lgcc +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -f hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + rm -rf obj_release + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +else + +vpath %.c \ +src \ +startup \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport + +vpath %.s \ +startup +vpath %.o \ +obj_release + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) $(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)/$@ + +$(OBJ_DIR): + mkdir -p $@ + +endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/99/408dc3f296970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/99/408dc3f296970017138fe0bf747e5677 new file mode 100644 index 0000000..d1c9f45 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/99/408dc3f296970017138fe0bf747e5677 @@ -0,0 +1,115 @@ +// ----------------------------------------------------------------------------- +/// @file FreeRTOSConfig.h +/// @brief File description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @defgroup {group_name} {group_description} +/// Description + +/// @file FreeRTOSConfig.h +/// @ingroup {group_name} + + +#ifndef FREERTOSCONFIG_H_ +#define FREERTOSCONFIG_H_ + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + +#define configUSE_PREEMPTION 1 +#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0 +#define configUSE_TICKLESS_IDLE 0 +#define configCPU_CLOCK_HZ ((unsigned long) 10000000) +#define configTICK_RATE_HZ ((portTickType) 1000) +#define configMAX_PRIORITIES ((unsigned portBASE_TYPE) 5) +#define configMINIMAL_STACK_SIZE ((unsigned short) 768) +#define configTOTAL_HEAP_SIZE ((size_t) 0xF600) +#define configMAX_TASK_NAME_LEN (16) +#define configUSE_TRACE_FACILITY 0 +#define configUSE_16_BIT_TICKS 0 +#define configIDLE_SHOULD_YIELD 1 +#define configUSE_MUTEXES 1 +#define configUSE_RECURSIVE_MUTEXES 0 +#define configUSE_COUNTING_SEMAPHORES 0 +#define configUSE_ALTERNATIVE_API 0 /* Deprecated! */ +#define configQUEUE_REGISTRY_SIZE (10) + +/* Hook function related definitions. */ +#define configUSE_IDLE_HOOK 0 +#define configUSE_TICK_HOOK 0 +#define configCHECK_FOR_STACK_OVERFLOW 2 +#define configUSE_MALLOC_FAILED_HOOK 1 + +/* Run time stats gathering related definitions. */ +#define configGENERATE_RUN_TIME_STATS 0 + +/* Co-routine related definitions. */ +#define configUSE_CO_ROUTINES 0 +#define configMAX_CO_ROUTINE_PRIORITIES (1) + +/* Software timer related definitions. */ +#define configUSE_TIMERS 1 +#define configTIMER_TASK_PRIORITY (4) +#define configTIMER_QUEUE_LENGTH (10) +#define configTIMER_TASK_STACK_DEPTH configMINIMAL_STACK_SIZE + +/* Interrupt nesting behaviour configuration. */ +#define configKERNEL_INTERRUPT_PRIORITY 255 +#define configMAX_SYSCALL_INTERRUPT_PRIORITY 191 + +/* Define to trap errors during development. */ +#define configASSERT( x ) if( ( x ) == 0 ) for(;;) + +/* Optional functions - most linkers will remove unused functions anyway. */ +#define INCLUDE_vTaskPrioritySet 1 +#define INCLUDE_uxTaskPriorityGet 1 +#define INCLUDE_vTaskDelete 1 +#define INCLUDE_vTaskSuspend 1 +#define INCLUDE_xResumeFromISR 1 +#define INCLUDE_vTaskDelayUntil 1 +#define INCLUDE_vTaskDelay 1 +#define INCLUDE_xTaskGetSchedulerState 1 +#define INCLUDE_xTaskGetCurrentTaskHandle 1 +#define INCLUDE_uxTaskGetStackHighWaterMark 1 +#define INCLUDE_xTaskGetIdleTaskHandle 0 +#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0 +#define INCLUDE_pcTaskGetTaskName 1 +#define INCLUDE_eTaskGetState 0 + +#define vPortSVCHandler SVC_Handler +#define xPortPendSVHandler PendSV_Handler +#define xPortSysTickHandler SysTick_Handler + +// ----------------------------------------------------------------------------- +// Type definitions. +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + +#endif /* FREERTOSCONFIG_H_ */ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/99/d3e251089d9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/99/d3e251089d9400171201ed9ff9474498 new file mode 100644 index 0000000..9036858 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/99/d3e251089d9400171201ed9ff9474498 @@ -0,0 +1,129 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORT_ASM_H +#define PORT_ASM_H + +typedef void TCB_t; +extern volatile TCB_t * volatile pxCurrentTCB; +extern void vTaskSwitchContext( void ); + +/* + * Saves the stack pointer for one task into its TCB, calls + * vTaskSwitchContext() to update the TCB being used, then restores the stack + * from the new TCB read to run the task. + */ +void portSWITCH_CONTEXT( void ); + +/* + * Load the stack pointer from the TCB of the task which is going to be first + * to execute. Then force an IRET so the registers and IP are popped off the + * stack. + */ +void portFIRST_CONTEXT( void ); + +/* There are slightly different versions depending on whether you are building +to include debugger information. If debugger information is used then there +are a couple of extra bytes left of the ISR stack (presumably for use by the +debugger). The true stack pointer is then stored in the bp register. We add +2 to the stack pointer to remove the extra bytes before we restore our context. */ + +#define portSWITCH_CONTEXT() \ + asm { mov ax, seg pxCurrentTCB } \ + asm { mov ds, ax } \ + asm { les bx, pxCurrentTCB } /* Save the stack pointer into the TCB. */ \ + asm { mov es:0x2[ bx ], ss } \ + asm { mov es:[ bx ], sp } \ + asm { call far ptr vTaskSwitchContext } /* Perform the switch. */ \ + asm { mov ax, seg pxCurrentTCB } /* Restore the stack pointer from the TCB. */ \ + asm { mov ds, ax } \ + asm { les bx, dword ptr pxCurrentTCB } \ + asm { mov ss, es:[ bx + 2 ] } \ + asm { mov sp, es:[ bx ] } + +#define portFIRST_CONTEXT() \ + __asm { mov ax, seg pxCurrentTCB } \ + __asm { mov ds, ax } \ + __asm { les bx, dword ptr pxCurrentTCB } \ + __asm { mov ss, es:[ bx + 2 ] } \ + __asm { mov sp, es:[ bx ] } \ + __asm { pop bp } \ + __asm { pop di } \ + __asm { pop si } \ + __asm { pop ds } \ + __asm { pop es } \ + __asm { pop dx } \ + __asm { pop cx } \ + __asm { pop bx } \ + __asm { pop ax } \ + __asm { iret } + + +#endif + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/9b/c0e88f72cf96001713a7ede92b37d6f1 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/9b/c0e88f72cf96001713a7ede92b37d6f1 new file mode 100644 index 0000000..ed600d5 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/9b/c0e88f72cf96001713a7ede92b37d6f1 @@ -0,0 +1,68 @@ +# STM support library + +STM32_STDPERIPH_INC = Libraries/STM32F10x_StdPeriph_Driver/inc/ +CORE_DIR = Libraries/CMSIS/CM3/CoreSupport/ +DEVICE_SUPPORT_DIR = Libraries/CMSIS/CM3/DrviceSupport/ST/STM32F10x + +SRC_DIR = Libraries/STM32F10x_StdPeriph_Driver/src/ + +INCLUDE_DIRS = \ +-I$(STM32_STDPERIPH_INC) \ +-I$(CIRE_DIR) \ +-I$(DEVICE_SUPPORT_DIR) \ + +OBJ_DIR = Libraries/STM32F10x_StdPeriph_Driver/obj + +CROSS_COMPILE = arm-none-eabi- + +CC = $(CROSS_COMPILE)gcc +CCFLAGS = -c -O2 -g -fno-common -mcpu=cortex-m3 -mthumb -DUSE_FULL_ASSERT $(INCLUDE_DIRS) -I. -Wall -Werror -D"assert_param(expr)=((void)0)" + +AR = $(CROSS_COMPILE)ar +ARFLAGS = rs + +OBJECTS = \ +misc.o \ +stm32f10x_adc.o \ +stm32f10x_bkp.o \ +stm32f10x_can.o \ +stm32f10x_cec.o \ +stm32f10x_crc.o \ +stm32f10x_dac.o \ +stm32f10x_dbgmcu.o \ +stm32f10x_dma.o \ +stm32f10x_exti.o \ +stm32f10x_flash.o \ +stm32f10x_fsmc.o \ +stm32f10x_gpio.o \ +stm32f10x_i2c.o \ +stm32f10x_iwdg.o \ +stm32f10x_pwr.o \ +stm32f10x_rcc.o \ +stm32f10x_rtc.o \ +stm32f10x_sdio.o \ +stm32f10x_spi.o \ +stm32f10x_tim.o \ +stm32f10x_usart.o \ +stm32f10x_wwdg.o + +LIBRARY = libSTM_StdPeriph.a + +vpath %.c $(SRC_DIR) +vpath %.o $(OBJ_DIR) + +all: $(LIBRARY) + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +clean: + rm -rf $(LIBRARY) $(OBJ_DIR) + +$(OBJ_DIR): + mkdir -p $@ + +.PHONY: all clean diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/9c/b1585b089d9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/9c/b1585b089d9400171201ed9ff9474498 new file mode 100644 index 0000000..3b8399a --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/9c/b1585b089d9400171201ed9ff9474498 @@ -0,0 +1,172 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* + * Purpose: Lowest level routines for all ColdFire processors. + * + * Notes: + * + * ulPortSetIPL() and mcf5xxx_wr_cacr() copied with permission from FreeScale + * supplied source files. + */ + + .global ulPortSetIPL + .global _ulPortSetIPL + .global mcf5xxx_wr_cacrx + .global _mcf5xxx_wr_cacrx + .global vPortYieldISR + .global _vPortYieldISR + .global vPortStartFirstTask + .global _vPortStartFirstTask + .extern _pxCurrentTCB + .extern _vPortYieldHandler + + .text + +.macro portSAVE_CONTEXT + + lea.l (-60, sp), sp + movem.l d0-a6, (sp) + move.l _pxCurrentTCB, a0 + move.l sp, (a0) + + .endm + +.macro portRESTORE_CONTEXT + + move.l _pxCurrentTCB, a0 + move.l (a0), sp + movem.l (sp), d0-a6 + lea.l (60, sp), sp + rte + + .endm + +/********************************************************************/ +/* + * This routines changes the IPL to the value passed into the routine. + * It also returns the old IPL value back. + * Calling convention from C: + * old_ipl = asm_set_ipl(new_ipl); + * For the Diab Data C compiler, it passes return value thru D0. + * Note that only the least significant three bits of the passed + * value are used. + */ + +ulPortSetIPL: +_ulPortSetIPL: + link A6,#-8 + movem.l D6-D7,(SP) + + move.w SR,D7 /* current sr */ + + move.l D7,D0 /* prepare return value */ + andi.l #0x0700,D0 /* mask out IPL */ + lsr.l #8,D0 /* IPL */ + + move.l 8(A6),D6 /* get argument */ + andi.l #0x07,D6 /* least significant three bits */ + lsl.l #8,D6 /* move over to make mask */ + + andi.l #0x0000F8FF,D7 /* zero out current IPL */ + or.l D6,D7 /* place new IPL in sr */ + move.w D7,SR + + movem.l (SP),D6-D7 + lea 8(SP),SP + unlk A6 + rts +/********************************************************************/ + +mcf5xxx_wr_cacrx: +_mcf5xxx_wr_cacrx: + move.l 4(sp),d0 + .long 0x4e7b0002 /* movec d0,cacr */ + nop + rts + +/********************************************************************/ + +/* Yield interrupt. */ +_vPortYieldISR: +vPortYieldISR: + portSAVE_CONTEXT + jsr _vPortYieldHandler + portRESTORE_CONTEXT + +/********************************************************************/ + + +vPortStartFirstTask: +_vPortStartFirstTask: + portRESTORE_CONTEXT + + .end + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/9d/009c3a189d9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/9d/009c3a189d9400171201ed9ff9474498 new file mode 100644 index 0000000..98d15ed --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/9d/009c3a189d9400171201ed9ff9474498 @@ -0,0 +1,55 @@ +// ----------------------------------------------------------------------------- +/// @file main.c +/// @brief Description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2015 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @file main.c +/// @ingroup {group_name} + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- +#include "stm32f10x_adc.h" + + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Type definitions +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// File-scope variables +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function definitions +// ----------------------------------------------------------------------------- diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/9e/b075dbe993970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/9e/b075dbe993970017138fe0bf747e5677 new file mode 100644 index 0000000..005115a --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/9e/b075dbe993970017138fe0bf747e5677 @@ -0,0 +1,128 @@ +ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +heap_4.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -fno-common -mcpu=cortex-m3 -mthumb $(RELEASE_DEFINES) $(INCLUDES) +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -nostartfiles -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map +release: export LDARCHIVES := -L. -L$(STM32_STDPERIPH_ROOT) -lSTM_StdPeriph +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -f hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + rm -rf obj_release + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +else + +vpath %.c \ +src \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ +$(STM32_DEVICE_SUPPORT_DIR) + +vpath %.s $(STARTER_SCRIPT_DIR) +vpath %.o $(OBJ_DIR) + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) #$(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +#$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) +# $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)/$@ + +$(OBJ_DIR): + mkdir -p $@ + +endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/a1/70bc3ebea59700171090ed03afc2ec65 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/a1/70bc3ebea59700171090ed03afc2ec65 new file mode 100644 index 0000000..52432ba --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/a1/70bc3ebea59700171090ed03afc2ec65 @@ -0,0 +1,88 @@ +// ----------------------------------------------------------------------------- +/// @file main.c +/// @brief Description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @file main.c +/// @ingroup {group_name} + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + +// FreeRTOS includes +#include "FreeRTOS.h" +#include "task.h" +#include "freeRTOSFixes.h" + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + +/* The time between cycles of the 'check' functionality (defined within the +tick hook. */ +#define mainCHECK_DELAY ( ( TickType_t ) 5000 / portTICK_PERIOD_MS ) + +// ----------------------------------------------------------------------------- +// Type definitions +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// File-scope variables +// ----------------------------------------------------------------------------- + +/* Variable that counts at 20KHz to provide the time base for the run time +stats. */ +unsigned long ulRunTimeStatsClock = 0UL; + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function definitions +// ----------------------------------------------------------------------------- + + +int main (void) +{ + + + /* Start the scheduler. */ + vTaskStartScheduler(); + + /* Will only get here if there was insufficient memory to create the idle + task. The idle task is created within vTaskStartScheduler(). */ + for( ;; ); + + + return -1; +} + +void vApplicationTickHook () +{ + +} + +void vApplicationStackOverflowHook () +{ + +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/a3/b060c6c4a69700171090ed03afc2ec65 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/a3/b060c6c4a69700171090ed03afc2ec65 new file mode 100644 index 0000000..5a681ef --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/a3/b060c6c4a69700171090ed03afc2ec65 @@ -0,0 +1,109 @@ +// ----------------------------------------------------------------------------- +/// @file freeRTOSFixes.c +/// @brief Description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @file freeRTOSFixes.c +/// @ingroup {group_name} + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + +#include +#include +#include + +#include "freeRTOSFixes.h" + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Type definitions +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// File-scope variables +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function definitions +// ----------------------------------------------------------------------------- + +void _init(void) {return;} + +void OS_logTaskInfo(xTaskHandle taskHandle) +{ + unsigned portBASE_TYPE highWaterMark; + char text[128]; + + snprintf(text, sizeof(text), "Task %s\n", pcTaskGetTaskName(taskHandle)); +// Shell_sendString(text); + + highWaterMark = uxTaskGetStackHighWaterMark(taskHandle); +// snprintf(text, sizeof(text), "Stack high water mark : %lu long words\n", highWaterMark); +// Shell_sendString(text); +} + +// Implementation for libc, needed for printf related functions. +caddr_t _sbrk(int incr) +{ + extern char _end; + static char* heap_end; + char* prev_heap_end; + + if(heap_end == 0) + { + heap_end = &_end; + } + + prev_heap_end = heap_end; + heap_end += incr; + return (caddr_t)prev_heap_end; +} + +// Stack overflow hook +void vApplicationStackOverflowHook(xTaskHandle xTask, signed portCHAR* pcTaskName) +{ +// Logger_fatal(FATALCODE_STACKOVERFLOW); +} + +// Malloc failed hook +void vApplicationMallocFailedHook(void) +{ +// Logger_fatal(FATALCODE_MALLOCFAILED); +} + +// Assert for StdPeriph library +void assert_failed(uint8_t* file, uint32_t line) +{ +// Logger_log((char*)file, "", line, LOGTYPE_ERROR, "assert failed"); +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/a3/b2585b089d9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/a3/b2585b089d9400171201ed9ff9474498 new file mode 100644 index 0000000..3aabb77 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/a3/b2585b089d9400171201ed9ff9474498 @@ -0,0 +1,156 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 4 +#define portSTACK_GROWTH -1 +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +/*-----------------------------------------------------------*/ +uint32_t ulPortSetIPL( uint32_t ); +#define portDISABLE_INTERRUPTS() ulPortSetIPL( configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#define portENABLE_INTERRUPTS() ulPortSetIPL( 0 ) + + +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() + +extern UBaseType_t uxPortSetInterruptMaskFromISR( void ); +extern void vPortClearInterruptMaskFromISR( UBaseType_t ); +#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortSetIPL( configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedStatusRegister ) ulPortSetIPL( uxSavedStatusRegister ) + +/*-----------------------------------------------------------*/ + +/* Task utilities. */ + +#define portNOP() asm volatile ( "nop" ) + +/* Note this will overwrite all other bits in the force register, it is done this way for speed. */ +#define portYIELD() MCF_INTC0_INTFRCL = ( 1UL << configYIELD_INTERRUPT_VECTOR ); portNOP(); portNOP() /* -32 as we are using the high word of the 64bit mask. */ + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) __attribute__((noreturn)) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*-----------------------------------------------------------*/ + +#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired != pdFALSE ) \ + { \ + portYIELD(); \ + } + + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/a3/d081a97996970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/a3/d081a97996970017138fe0bf747e5677 new file mode 100644 index 0000000..3a20535 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/a3/d081a97996970017138fe0bf747e5677 @@ -0,0 +1,134 @@ +ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +heap_4.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +STM32_CORE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) \ +-I$(STM32_CORE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -fno-common -mcpu=cortex-m3 -mthumb $(RELEASE_DEFINES) $(INCLUDES) +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map +release: export LDARCHIVES := -L. -L$(STM32_STDPERIPH_ROOT) -lSTM_StdPeriph -lhsb_mrts_release +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -f hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + rm -rf obj_release + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +else + +vpath %.c \ +src \ +startup \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport + +vpath %.s \ +startup +vpath %.o \ +obj_release + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) $(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)/$@ + +$(OBJ_DIR): + mkdir -p $@ + +endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/a5/b06c5a93c596001713a7ede92b37d6f1 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/a5/b06c5a93c596001713a7ede92b37d6f1 new file mode 100644 index 0000000..10f630a --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/a5/b06c5a93c596001713a7ede92b37d6f1 @@ -0,0 +1,59 @@ +# STM support library + +SRC_DIR = Libraries/STM32F10x_StdPeriph_Driver/src/ +INC_DIR = Libraries/STM32F10x_StdPeriph_Driver/inc/ Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/ +OBJ_DIR = Libraries/STM32F10x_StdPeriph_Driver/obj + +CROSS_COMPILE = arm-none-eabi- + +CC = $(CROSS_COMPILE)gcc +CCFLAGS = -c -O2 -g -fno-common -mcpu=cortex-m3 -mthumb -DUSE_FULL_ASSERT -I$(INC_DIR) -I. + +AR = $(CROSS_COMPILE)ar +ARFLAGS = rs + +OBJECTS = \ +misc.o \ +stm32f10x_adc.o \ +stm32f10x_bkp.o \ +stm32f10x_can.o \ +stm32f10x_cec.o \ +stm32f10x_crc.o \ +stm32f10x_dac.o \ +stm32f10x_dbgmcu.o \ +stm32f10x_dma.o \ +stm32f10x_exti.o \ +stm32f10x_flash.o \ +stm32f10x_fsmc.o \ +stm32f10x_gpio.o \ +stm32f10x_i2c.o \ +stm32f10x_iwdg.o \ +stm32f10x_pwr.o \ +stm32f10x_rcc.o \ +stm32f10x_rtc.o \ +stm32f10x_sdio.o \ +stm32f10x_spi.o \ +stm32f10x_tim.o \ +stm32f10x_usart.o \ +stm32f10x_wwdg.o + +LIBRARY = libSTM_StdPeriph.a + +vpath %.c $(SRC_DIR) +vpath %.o $(OBJ_DIR) + +all: $(LIBRARY) + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +clean: + rm -rf $(LIBRARY) $(OBJ_DIR) + +$(OBJ_DIR): + mkdir -p $@ + +.PHONY: all clean diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/a5/c19d56089d9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/a5/c19d56089d9400171201ed9ff9474498 new file mode 100644 index 0000000..ffa91ff --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/a5/c19d56089d9400171201ed9ff9474498 @@ -0,0 +1,256 @@ +;/* +; FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. +; All rights reserved +; +; +; *************************************************************************** +; * * +; * FreeRTOS tutorial books are available in pdf and paperback. * +; * Complete, revised, and edited pdf reference manuals are also * +; * available. * +; * * +; * Purchasing FreeRTOS documentation will not only help you, by * +; * ensuring you get running as quickly as possible and with an * +; * in-depth knowledge of how to use FreeRTOS, it will also help * +; * the FreeRTOS project to continue with its mission of providing * +; * professional grade, cross platform, de facto standard solutions * +; * for microcontrollers - completely free of charge! * +; * * +; * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * +; * * +; * Thank you for using FreeRTOS, and thank you for your support! * +; * * +; *************************************************************************** +; +; +; This file is part of the FreeRTOS distribution. +; +; FreeRTOS is free software; you can redistribute it and/or modify it under +; the terms of the GNU General Public License (version 2) as published by the +; Free Software Foundation AND MODIFIED BY the FreeRTOS exception. +; >>>NOTE<<< The modification to the GPL is included to allow you to +; distribute a combined work that includes FreeRTOS without being obliged to +; provide the source code for proprietary components outside of the FreeRTOS +; kernel. FreeRTOS is distributed in the hope that it will be useful, but +; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +; more details. You should have received a copy of the GNU General Public +; License and the FreeRTOS license exception along with FreeRTOS; if not it +; can be viewed here: http://www.freertos.org/a00114.html and also obtained +; by writing to Richard Barry, contact details for whom are available on the +; FreeRTOS WEB site. +; +; 1 tab == 4 spaces! +; +; http://www.FreeRTOS.org - Documentation, latest information, license and +; contact details. +; +; http://www.SafeRTOS.com - A version that is certified for use in safety +; critical systems. +; +; http://www.OpenRTOS.com - Commercial support, development, porting, +; licensing and training services. +;*/ + + .text + .arm + .ref vTaskSwitchContext + .ref xTaskIncrementTick + .ref ulTaskHasFPUContext + .ref pxCurrentTCB + +;/*-----------------------------------------------------------*/ +; +; Save Task Context +; +portSAVE_CONTEXT .macro + DSB + + ; Push R0 as we are going to use it + STMDB SP!, {R0} + + ; Set R0 to point to the task stack pointer. + STMDB SP,{SP}^ + SUB SP, SP, #4 + LDMIA SP!,{R0} + + ; Push the return address onto the stack. + STMDB R0!, {LR} + + ; Now LR has been saved, it can be used instead of R0. + MOV LR, R0 + + ; Pop R0 so it can be saved onto the task stack. + LDMIA SP!, {R0} + + ; Push all the system mode registers onto the task stack. + STMDB LR,{R0-LR}^ + SUB LR, LR, #60 + + ; Push the SPSR onto the task stack. + MRS R0, SPSR + STMDB LR!, {R0} + + .if (__TI_VFP_SUPPORT__) + ;Determine if the task maintains an FPU context. + LDR R0, ulFPUContextConst + LDR R0, [R0] + + ; Test the flag + CMP R0, #0 + + ; If the task is not using a floating point context then skip the + ; saving of the FPU registers. + BEQ $+16 + FSTMDBD LR!, {D0-D15} + FMRX R1, FPSCR + STMFD LR!, {R1} + + ; Save the flag + STMDB LR!, {R0} + .endif + + ; Store the new top of stack for the task. + LDR R0, pxCurrentTCBConst + LDR R0, [R0] + STR LR, [R0] + + .endm + +;/*-----------------------------------------------------------*/ +; +; Restore Task Context +; +portRESTORE_CONTEXT .macro + LDR R0, pxCurrentTCBConst + LDR R0, [R0] + LDR LR, [R0] + + .if (__TI_VFP_SUPPORT__) + ; The floating point context flag is the first thing on the stack. + LDR R0, ulFPUContextConst + LDMFD LR!, {R1} + STR R1, [R0] + + ; Test the flag + CMP R1, #0 + + ; If the task is not using a floating point context then skip the + ; VFP register loads. + BEQ $+16 + + ; Restore the floating point context. + LDMFD LR!, {R0} + FLDMIAD LR!, {D0-D15} + FMXR FPSCR, R0 + .endif + + ; Get the SPSR from the stack. + LDMFD LR!, {R0} + MSR SPSR_CSXF, R0 + + ; Restore all system mode registers for the task. + LDMFD LR, {R0-R14}^ + + ; Restore the return address. + LDR LR, [LR, #+60] + + ; And return - correcting the offset in the LR to obtain the + ; correct address. + SUBS PC, LR, #4 + .endm + +;/*-----------------------------------------------------------*/ +; Start the first task by restoring its context. + + .def vPortStartFirstTask + +vPortStartFirstTask: + portRESTORE_CONTEXT + +;/*-----------------------------------------------------------*/ +; Yield to another task. + + .def vPortYieldProcessor + +vPortYieldProcessor: + ; Within an IRQ ISR the link register has an offset from the true return + ; address. SWI doesn't do this. Add the offset manually so the ISR + ; return code can be used. + ADD LR, LR, #4 + + ; First save the context of the current task. + portSAVE_CONTEXT + + ; Select the next task to execute. */ + BL vTaskSwitchContext + + ; Restore the context of the task selected to execute. + portRESTORE_CONTEXT + +;/*-----------------------------------------------------------*/ +; Yield to another task from within the FreeRTOS API + + .def vPortYeildWithinAPI + +vPortYeildWithinAPI: + ; Save the context of the current task. + + portSAVE_CONTEXT + ; Clear SSI flag. + MOVW R0, #0xFFF4 + MOVT R0, #0xFFFF + LDR R0, [R0] + + ; Select the next task to execute. */ + BL vTaskSwitchContext + + ; Restore the context of the task selected to execute. + portRESTORE_CONTEXT + +;/*-----------------------------------------------------------*/ +; Preemptive Tick + + .def vPortPreemptiveTick + +vPortPreemptiveTick: + + ; Save the context of the current task. + portSAVE_CONTEXT + + ; Clear interrupt flag + MOVW R0, #0xFC88 + MOVT R0, #0xFFFF + MOV R1, #1 + STR R1, [R0] + + ; Increment the tick count, making any adjustments to the blocked lists + ; that may be necessary. + BL xTaskIncrementTick + + ; Select the next task to execute. + CMP R0, #0 + BLNE vTaskSwitchContext + + ; Restore the context of the task selected to execute. + portRESTORE_CONTEXT + +;------------------------------------------------------------------------------- + + .if (__TI_VFP_SUPPORT__) + + .def vPortInitialiseFPSCR + +vPortInitialiseFPSCR: + + MOV R0, #0 + FMXR FPSCR, R0 + BX LR + + .endif ;__TI_VFP_SUPPORT__ + + +pxCurrentTCBConst .word pxCurrentTCB +ulFPUContextConst .word ulTaskHasFPUContext +;------------------------------------------------------------------------------- + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/a6/10a352249b970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/a6/10a352249b970017138fe0bf747e5677 new file mode 100644 index 0000000..2ecdb96 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/a6/10a352249b970017138fe0bf747e5677 @@ -0,0 +1,134 @@ +ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +heap_4.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +STM32_CORE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) \ +-I$(STM32_CORE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -fno-common -fno-exceptions -mcpu=cortex-m3 -mthumb $(RELEASE_DEFINES) $(INCLUDES) +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -nostartfiles -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map +release: export LDARCHIVES := -L. -L$(STM32_STDPERIPH_ROOT) -lSTM_StdPeriph -lhsb_mrts_release +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -f hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + rm -rf obj_release + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +else + +vpath %.c \ +src \ +startup \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport + +vpath %.s \ +startup +vpath %.o \ +obj_release + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) $(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)/$@ + +$(OBJ_DIR): + mkdir -p $@ + +endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/a7/5009031e9b970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/a7/5009031e9b970017138fe0bf747e5677 new file mode 100644 index 0000000..6503f2f --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/a7/5009031e9b970017138fe0bf747e5677 @@ -0,0 +1,134 @@ +ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +heap_4.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +STM32_CORE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) \ +-I$(STM32_CORE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -fno-common -mcpu=cortex-m3 -mthumb $(RELEASE_DEFINES) $(INCLUDES) +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -nostartfiles -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map +release: export LDARCHIVES := -L. -L$(STM32_STDPERIPH_ROOT) -lSTM_StdPeriph -lhsb_mrts_release +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -f hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + rm -rf obj_release + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +else + +vpath %.c \ +src \ +startup \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport + +vpath %.s \ +startup +vpath %.o \ +obj_release + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) $(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)/$@ + +$(OBJ_DIR): + mkdir -p $@ + +endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/a8/f01dbbaa9f9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/a8/f01dbbaa9f9400171201ed9ff9474498 new file mode 100644 index 0000000..05cecea --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/a8/f01dbbaa9f9400171201ed9ff9474498 @@ -0,0 +1,55 @@ +// ----------------------------------------------------------------------------- +/// @file main.c +/// @brief Description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2015 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @file main.c +/// @ingroup {group_name} + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Type definitions +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// File-scope variables +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function definitions +// ----------------------------------------------------------------------------- diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/a9/505f239ccf96001713a7ede92b37d6f1 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/a9/505f239ccf96001713a7ede92b37d6f1 new file mode 100644 index 0000000..11d6ebb --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/a9/505f239ccf96001713a7ede92b37d6f1 @@ -0,0 +1,68 @@ +# STM support library + +STM32_STDPERIPH_INC = Libraries/STM32F10x_StdPeriph_Driver/inc/ +CORE_DIR = Libraries/CMSIS/CM3/CoreSupport/ +DEVICE_SUPPORT_DIR = Libraries/CMSIS/CM3/DrviceSupport/ST/STM32F10x + +SRC_DIR = Libraries/STM32F10x_StdPeriph_Driver/src/ + +INCLUDE_DIRS = \ +#-I$(STM32_STDPERIPH_INC) \ +#-I$(CIRE_DIR) \ +#-I$(DEVICE_SUPPORT_DIR) \ + +OBJ_DIR = Libraries/STM32F10x_StdPeriph_Driver/obj + +CROSS_COMPILE = arm-none-eabi- + +CC = $(CROSS_COMPILE)gcc +CCFLAGS = -c -O2 -g -fno-common -mcpu=cortex-m3 -mthumb -DUSE_FULL_ASSERT $(INCLUDE_DIRS) -I. -Wall -Werror -D"assert_param(expr)=((void)0)" + +AR = $(CROSS_COMPILE)ar +ARFLAGS = rs + +OBJECTS = \ +misc.o \ +stm32f10x_adc.o \ +stm32f10x_bkp.o \ +stm32f10x_can.o \ +stm32f10x_cec.o \ +stm32f10x_crc.o \ +stm32f10x_dac.o \ +stm32f10x_dbgmcu.o \ +stm32f10x_dma.o \ +stm32f10x_exti.o \ +stm32f10x_flash.o \ +stm32f10x_fsmc.o \ +stm32f10x_gpio.o \ +stm32f10x_i2c.o \ +stm32f10x_iwdg.o \ +stm32f10x_pwr.o \ +stm32f10x_rcc.o \ +stm32f10x_rtc.o \ +stm32f10x_sdio.o \ +stm32f10x_spi.o \ +stm32f10x_tim.o \ +stm32f10x_usart.o \ +stm32f10x_wwdg.o + +LIBRARY = libSTM_StdPeriph.a + +vpath %.c $(SRC_DIR) +vpath %.o $(OBJ_DIR) + +all: $(LIBRARY) + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +clean: + rm -rf $(LIBRARY) $(OBJ_DIR) + +$(OBJ_DIR): + mkdir -p $@ + +.PHONY: all clean diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/ab/d034146fa69700171090ed03afc2ec65 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/ab/d034146fa69700171090ed03afc2ec65 new file mode 100644 index 0000000..8de65d0 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/ab/d034146fa69700171090ed03afc2ec65 @@ -0,0 +1,85 @@ +// ----------------------------------------------------------------------------- +/// @file main.c +/// @brief Description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @file main.c +/// @ingroup {group_name} + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + +// FreeRTOS includes +#include "FreeRTOS.h" +#include "task.h" + +#include "freeRTOSFixes.h" + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + +/* The time between cycles of the 'check' functionality (defined within the +tick hook. */ +#define mainCHECK_DELAY ( ( TickType_t ) 5000 / portTICK_PERIOD_MS ) + +// ----------------------------------------------------------------------------- +// Type definitions +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// File-scope variables +// ----------------------------------------------------------------------------- + +/* Variable that counts at 20KHz to provide the time base for the run time +stats. */ +unsigned long ulRunTimeStatsClock = 0UL; + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function definitions +// ----------------------------------------------------------------------------- + + + +int main (void) +{ + + + /* Start the scheduler. */ + vTaskStartScheduler(); + + /* Will only get here if there was insufficient memory to create the idle + task. The idle task is created within vTaskStartScheduler(). */ + for( ;; ); + + + return -1; +} + +void vApplicationTickHook () +{ + +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/af/d0839369a69700171090ed03afc2ec65 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/af/d0839369a69700171090ed03afc2ec65 new file mode 100644 index 0000000..908f8fd --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/af/d0839369a69700171090ed03afc2ec65 @@ -0,0 +1,82 @@ +// ----------------------------------------------------------------------------- +/// @file main.c +/// @brief Description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @file main.c +/// @ingroup {group_name} + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + +// FreeRTOS includes +#include "FreeRTOS.h" +#include "task.h" + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + +/* The time between cycles of the 'check' functionality (defined within the +tick hook. */ +#define mainCHECK_DELAY ( ( TickType_t ) 5000 / portTICK_PERIOD_MS ) + +// ----------------------------------------------------------------------------- +// Type definitions +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// File-scope variables +// ----------------------------------------------------------------------------- + +/* Variable that counts at 20KHz to provide the time base for the run time +stats. */ +unsigned long ulRunTimeStatsClock = 0UL; + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function definitions +// ----------------------------------------------------------------------------- + + +int main (void) +{ + + + /* Start the scheduler. */ + vTaskStartScheduler(); + + /* Will only get here if there was insufficient memory to create the idle + task. The idle task is created within vTaskStartScheduler(). */ + for( ;; ); + + + return -1; +} + +void vApplicationTickHook () +{ + +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/b/e03aa2819a970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/b/e03aa2819a970017138fe0bf747e5677 new file mode 100644 index 0000000..e5e8cab --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/b/e03aa2819a970017138fe0bf747e5677 @@ -0,0 +1,204 @@ +/* +****************************************************************************** +** +** File : LinkerScript.ld +** +** Author : Auto-generated by Ac6 System Workbench +** +** Abstract : Linker script for STM32F107VCTx Device from STM32F1 series +** 64Kbytes RAM +** 256Kbytes ROM +** +** Set heap size, stack size and stack location according +** to application requirements. +** +** Set memory bank area and size if external memory is used. +** +** Target : STMicroelectronics STM32 +** +** Distribution: The file is distributed “as is,” without any warranty +** of any kind. +** +***************************************************************************** +** @attention +** +**

© COPYRIGHT(c) 2017 Ac6

+** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** 1. Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** 3. Neither the name of Ac6 nor the names of its contributors +** may be used to endorse or promote products derived from this software +** without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +***************************************************************************** +*/ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = 0x20010000; /* end of RAM */ + +_Min_Heap_Size = 0; /* required amount of heap */ +_Min_Stack_Size = 0x400; /* required amount of stack */ + +/* Memories definition */ +MEMORY +{ + RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K + ROM (rx) : ORIGIN = 0x8000000, LENGTH = 256K +} + +/* Sections */ +SECTIONS +{ + /* The startup code into ROM memory */ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } >ROM + + /* The program code and other data into ROM memory */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + } >ROM + + /* Constant data into ROM memory*/ + .rodata : + { + . = ALIGN(4); + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + . = ALIGN(4); + } >ROM + + .ARM.extab : { + . = ALIGN(4); + *(.ARM.extab* .gnu.linkonce.armextab.*) + . = ALIGN(4); + } >ROM + + .ARM : { + . = ALIGN(4); + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + . = ALIGN(4); + } >ROM + + .preinit_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + . = ALIGN(4); + } >ROM + + .init_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + . = ALIGN(4); + } >ROM + + .fini_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + . = ALIGN(4); + } >ROM + + /* Used by the startup to initialize data */ + _sidata = LOADADDR(.data); + + /* Initialized data sections into RAM memory */ + .data : + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + } >RAM AT> ROM + + + /* Uninitialized data section into RAM memory */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM + + /* User_heap_stack section, used to check that there is enough RAM left */ + ._user_heap_stack : + { + . = ALIGN(8); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(8); + } >RAM + + + + /* Remove information from the compiler libraries */ +/* /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } +*/ + .ARM.attributes 0 : { *(.ARM.attributes) } + + GROUP (libnosys.a) +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/b1/d0e251089d9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/b1/d0e251089d9400171201ed9ff9474498 new file mode 100644 index 0000000..5779f5e --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/b1/d0e251089d9400171201ed9ff9474498 @@ -0,0 +1,139 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE long +#define portLONG long +#define portSHORT int +#define portSTACK_TYPE uint16_t +#define portBASE_TYPE portSHORT + +typedef portSTACK_TYPE StackType_t; +typedef short BaseType_t; +typedef unsigned short UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Critical section handling. */ +#define portENTER_CRITICAL() __asm{ pushf } \ + __asm{ cli } \ + +#define portEXIT_CRITICAL() __asm{ popf } + +#define portDISABLE_INTERRUPTS() __asm{ cli } + +#define portENABLE_INTERRUPTS() __asm{ sti } +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portNOP() __asm{ nop } +#define portSTACK_GROWTH ( -1 ) +#define portSWITCH_INT_NUMBER 0x80 +#define portYIELD() __asm{ int portSWITCH_INT_NUMBER } +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 2 +#define portINITIAL_SW ( ( portSTACK_TYPE ) 0x0202 ) /* Start the tasks with interrupts enabled. */ +/*-----------------------------------------------------------*/ + +/* Compiler specifics. */ +#define portINPUT_BYTE( xAddr ) inp( xAddr ) +#define portOUTPUT_BYTE( xAddr, ucValue ) outp( xAddr, ucValue ) +#define portINPUT_WORD( xAddr ) inpw( xAddr ) +#define portOUTPUT_WORD( xAddr, usValue ) outpw( xAddr, usValue ) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vTaskFunction, vParameters ) void vTaskFunction( void *pvParameters ) +#define portTASK_FUNCTION( vTaskFunction, vParameters ) void vTaskFunction( void *pvParameters ) + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/b2/c32c54089d9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/b2/c32c54089d9400171201ed9ff9474498 new file mode 100644 index 0000000..47302ca --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/b2/c32c54089d9400171201ed9ff9474498 @@ -0,0 +1,207 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +/*-----------------------------------------------------------*/ + +/* Scheduler utilities. */ +#define portYIELD() \ +{ \ + /* Set a PendSV to request a context switch. */ \ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ + __asm( " dsb" ); \ + __asm( " isb" ); \ +} + +#define portNVIC_INT_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed04 ) ) +#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) +#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired != pdFALSE ) portYIELD() +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) + +/*-----------------------------------------------------------*/ + +/* Architecture specific optimisations. */ +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31 - __clz( ( uxReadyPriorities ) ) ) + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); + +#define portDISABLE_INTERRUPTS() \ +{ \ + _set_interrupt_priority( configMAX_SYSCALL_INTERRUPT_PRIORITY ); \ + __asm( " dsb" ); \ + __asm( " isb" ); \ +} + +#define portENABLE_INTERRUPTS() _set_interrupt_priority( 0 ) +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() +#define portSET_INTERRUPT_MASK_FROM_ISR() _set_interrupt_priority( configMAX_SYSCALL_INTERRUPT_PRIORITY ); __asm( " dsb" ); __asm( " isb" ) +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) _set_interrupt_priority( x ) +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ +#ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) +#endif + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are +not necessary for to use this port. They are defined so the common demo files +(which build with all the ports) will build. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*-----------------------------------------------------------*/ + +#ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() +#endif + +/* portNOP() is not required by this port. */ +#define portNOP() + +/*-----------------------------------------------------------*/ + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/b3/203cc2fbbf96001713a7ede92b37d6f1 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/b3/203cc2fbbf96001713a7ede92b37d6f1 new file mode 100644 index 0000000..20c4a07 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/b3/203cc2fbbf96001713a7ede92b37d6f1 @@ -0,0 +1,67 @@ +# STM support library + +SRC_DIR = src/ +INC_DIR = inc/ +OBJ_DIR = obj + +CROSS_COMPILE = arm-none-eabi- + +CC = $(CROSS_COMPILE)gcc +CCFLAGS = -xc -c -O2 -g -fno-common -mcpu=cortex-m3 -mthumb -DUSE_FULL_ASSERT -I$(INC_DIR) -I. + +AR = $(CROSS_COMPILE)ar +ARFLAGS = rs + +OBJECTS = \ +misc.o \ +stm32f2xx_adc.o \ +stm32f2xx_can.o \ +stm32f2xx_crc.o \ +stm32f2xx_cryp_aes.o \ +stm32f2xx_cryp.o \ +stm32f2xx_cryp_des.o \ +stm32f2xx_cryp_tdes.o \ +stm32f2xx_dac.o \ +stm32f2xx_dbgmcu.o \ +stm32f2xx_dcmi.o \ +stm32f2xx_dma.o \ +stm32f2xx_exti.o \ +stm32f2xx_flash.o \ +stm32f2xx_fsmc.o \ +stm32f2xx_gpio.o \ +stm32f2xx_hash.o \ +stm32f2xx_hash_md5.o \ +stm32f2xx_hash_sha1.o \ +stm32f2xx_i2c.o \ +stm32f2xx_iwdg.o \ +stm32f2xx_pwr.o \ +stm32f2xx_rcc.o \ +stm32f2xx_rng.o \ +stm32f2xx_rtc.o \ +stm32f2xx_sdio.o \ +stm32f2xx_spi.o \ +stm32f2xx_syscfg.o \ +stm32f2xx_tim.o \ +stm32f2xx_usart.o \ +stm32f2xx_wwdg.o + +LIBRARY = libSTM_StdPeriph.a + +vpath %.c $(SRC_DIR) +vpath %.o $(OBJ_DIR) + +all: $(LIBRARY) + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +clean: + rm -rf $(LIBRARY) $(OBJ_DIR) + +$(OBJ_DIR): + mkdir -p $@ + +.PHONY: all clean diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/b4/b23a60089d9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/b4/b23a60089d9400171201ed9ff9474498 new file mode 100644 index 0000000..01294ed --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/b4/b23a60089d9400171201ed9ff9474498 @@ -0,0 +1,366 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the RX200 port. + *----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Library includes. */ +#include "string.h" + +/* Hardware specifics. */ +#include "iodefine.h" + +/*-----------------------------------------------------------*/ + +/* Tasks should start with interrupts enabled and in Supervisor mode, therefore +PSW is set with U and I set, and PM and IPL clear. */ +#define portINITIAL_PSW ( ( StackType_t ) 0x00030000 ) + +/*-----------------------------------------------------------*/ + +/* The following lines are to ensure vSoftwareInterruptEntry can be referenced, + and therefore installed in the vector table, when the FreeRTOS code is built +as a library. */ +extern BaseType_t vSoftwareInterruptEntry; +const BaseType_t * p_vSoftwareInterruptEntry = &vSoftwareInterruptEntry; + +/*-----------------------------------------------------------*/ + +/* + * Function to start the first task executing - written in asm code as direct + * access to registers is required. + */ +static void prvStartFirstTask( void ); + +/* + * Software interrupt handler. Performs the actual context switch (saving and + * restoring of registers). Written in asm code as direct register access is + * required. + */ +static void prvYieldHandler( void ); + +/* + * The entry point for the software interrupt handler. This is the function + * that calls the inline asm function prvYieldHandler(). It is installed in + * the vector table, but the code that installs it is in prvYieldHandler rather + * than using a #pragma. + */ +void vSoftwareInterruptISR( void ); + +/*-----------------------------------------------------------*/ + +/* This is accessed by the inline assembler functions so is file scope for +convenience. */ +extern void *pxCurrentTCB; +extern void vTaskSwitchContext( void ); + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Offset to end up on 8 byte boundary. */ + pxTopOfStack--; + + /* R0 is not included as it is the stack pointer. */ + *pxTopOfStack = 0x00; + pxTopOfStack--; + *pxTopOfStack = 0x00; + pxTopOfStack--; + *pxTopOfStack = portINITIAL_PSW; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; + + /* When debugging it can be useful if every register is set to a known + value. Otherwise code space can be saved by just setting the registers + that need to be set. */ + #ifdef USE_FULL_REGISTER_INITIALISATION + { + pxTopOfStack--; + *pxTopOfStack = 0x12345678; /* r15. */ + pxTopOfStack--; + *pxTopOfStack = 0xaaaabbbb; + pxTopOfStack--; + *pxTopOfStack = 0xdddddddd; + pxTopOfStack--; + *pxTopOfStack = 0xcccccccc; + pxTopOfStack--; + *pxTopOfStack = 0xbbbbbbbb; + pxTopOfStack--; + *pxTopOfStack = 0xaaaaaaaa; + pxTopOfStack--; + *pxTopOfStack = 0x99999999; + pxTopOfStack--; + *pxTopOfStack = 0x88888888; + pxTopOfStack--; + *pxTopOfStack = 0x77777777; + pxTopOfStack--; + *pxTopOfStack = 0x66666666; + pxTopOfStack--; + *pxTopOfStack = 0x55555555; + pxTopOfStack--; + *pxTopOfStack = 0x44444444; + pxTopOfStack--; + *pxTopOfStack = 0x33333333; + pxTopOfStack--; + *pxTopOfStack = 0x22222222; + pxTopOfStack--; + } + #else + { + pxTopOfStack -= 15; + } + #endif + + *pxTopOfStack = ( StackType_t ) pvParameters; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = 0x12345678; /* Accumulator. */ + pxTopOfStack--; + *pxTopOfStack = 0x87654321; /* Accumulator. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void vApplicationSetupTimerInterrupt( void ); + + /* Use pxCurrentTCB just so it does not get optimised away. */ + if( pxCurrentTCB != NULL ) + { + /* Call an application function to set up the timer that will generate the + tick interrupt. This way the application can decide which peripheral to + use. A demo application is provided to show a suitable example. */ + vApplicationSetupTimerInterrupt(); + + /* Enable the software interrupt. */ + _IEN( _ICU_SWINT ) = 1; + + /* Ensure the software interrupt is clear. */ + _IR( _ICU_SWINT ) = 0; + + /* Ensure the software interrupt is set to the kernel priority. */ + _IPR( _ICU_SWINT ) = configKERNEL_INTERRUPT_PRIORITY; + + /* Start the first task. */ + prvStartFirstTask(); + } + + /* Just to make sure the function is not optimised away. */ + ( void ) vSoftwareInterruptISR(); + + /* Should not get here. */ + return pdFAIL; +} +/*-----------------------------------------------------------*/ + +#pragma inline_asm prvStartFirstTask +static void prvStartFirstTask( void ) +{ + /* When starting the scheduler there is nothing that needs moving to the + interrupt stack because the function is not called from an interrupt. + Just ensure the current stack is the user stack. */ + SETPSW U + + /* Obtain the location of the stack associated with which ever task + pxCurrentTCB is currently pointing to. */ + MOV.L #_pxCurrentTCB, R15 + MOV.L [R15], R15 + MOV.L [R15], R0 + + /* Restore the registers from the stack of the task pointed to by + pxCurrentTCB. */ + POP R15 + MVTACLO R15 /* Accumulator low 32 bits. */ + POP R15 + MVTACHI R15 /* Accumulator high 32 bits. */ + POPM R1-R15 /* R1 to R15 - R0 is not included as it is the SP. */ + RTE /* This pops the remaining registers. */ + NOP + NOP +} +/*-----------------------------------------------------------*/ + +#pragma interrupt ( vTickISR( vect = _VECT( configTICK_VECTOR ), enable ) ) +void vTickISR( void ) +{ + /* Increment the tick, and perform any processing the new tick value + necessitates. */ + set_ipl( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + { + if( xTaskIncrementTick() != pdFALSE ) + { + taskYIELD(); + } + } + set_ipl( configKERNEL_INTERRUPT_PRIORITY ); +} +/*-----------------------------------------------------------*/ + +void vSoftwareInterruptISR( void ) +{ + prvYieldHandler(); +} +/*-----------------------------------------------------------*/ + +#pragma inline_asm prvYieldHandler +static void prvYieldHandler( void ) +{ + /* Re-enable interrupts. */ + SETPSW I + + /* Move the data that was automatically pushed onto the interrupt stack when + the interrupt occurred from the interrupt stack to the user stack. + + R15 is saved before it is clobbered. */ + PUSH.L R15 + + /* Read the user stack pointer. */ + MVFC USP, R15 + + /* Move the address down to the data being moved. */ + SUB #12, R15 + MVTC R15, USP + + /* Copy the data across. */ + MOV.L [ R0 ], [ R15 ] ; R15 + MOV.L 4[ R0 ], 4[ R15 ] ; PC + MOV.L 8[ R0 ], 8[ R15 ] ; PSW + + /* Move the interrupt stack pointer to its new correct position. */ + ADD #12, R0 + + /* All the rest of the registers are saved directly to the user stack. */ + SETPSW U + + /* Save the rest of the general registers (R15 has been saved already). */ + PUSHM R1-R14 + + /* Save the accumulator. */ + MVFACHI R15 + PUSH.L R15 + MVFACMI R15 ; Middle order word. + SHLL #16, R15 ; Shifted left as it is restored to the low order word. + PUSH.L R15 + + /* Save the stack pointer to the TCB. */ + MOV.L #_pxCurrentTCB, R15 + MOV.L [ R15 ], R15 + MOV.L R0, [ R15 ] + + /* Ensure the interrupt mask is set to the syscall priority while the kernel + structures are being accessed. */ + MVTIPL #configMAX_SYSCALL_INTERRUPT_PRIORITY + + /* Select the next task to run. */ + BSR.A _vTaskSwitchContext + + /* Reset the interrupt mask as no more data structure access is required. */ + MVTIPL #configKERNEL_INTERRUPT_PRIORITY + + /* Load the stack pointer of the task that is now selected as the Running + state task from its TCB. */ + MOV.L #_pxCurrentTCB,R15 + MOV.L [ R15 ], R15 + MOV.L [ R15 ], R0 + + /* Restore the context of the new task. The PSW (Program Status Word) and + PC will be popped by the RTE instruction. */ + POP R15 + MVTACLO R15 + POP R15 + MVTACHI R15 + POPM R1-R15 + RTE + NOP + NOP +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( pxCurrentTCB == NULL ); + + /* The following line is just to prevent the symbol getting optimised away. */ + ( void ) vTaskSwitchContext(); +} +/*-----------------------------------------------------------*/ + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/b6/30257362a99700171090ed03afc2ec65 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/b6/30257362a99700171090ed03afc2ec65 new file mode 100644 index 0000000..5a681ef --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/b6/30257362a99700171090ed03afc2ec65 @@ -0,0 +1,109 @@ +// ----------------------------------------------------------------------------- +/// @file freeRTOSFixes.c +/// @brief Description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @file freeRTOSFixes.c +/// @ingroup {group_name} + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + +#include +#include +#include + +#include "freeRTOSFixes.h" + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Type definitions +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// File-scope variables +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function definitions +// ----------------------------------------------------------------------------- + +void _init(void) {return;} + +void OS_logTaskInfo(xTaskHandle taskHandle) +{ + unsigned portBASE_TYPE highWaterMark; + char text[128]; + + snprintf(text, sizeof(text), "Task %s\n", pcTaskGetTaskName(taskHandle)); +// Shell_sendString(text); + + highWaterMark = uxTaskGetStackHighWaterMark(taskHandle); +// snprintf(text, sizeof(text), "Stack high water mark : %lu long words\n", highWaterMark); +// Shell_sendString(text); +} + +// Implementation for libc, needed for printf related functions. +caddr_t _sbrk(int incr) +{ + extern char _end; + static char* heap_end; + char* prev_heap_end; + + if(heap_end == 0) + { + heap_end = &_end; + } + + prev_heap_end = heap_end; + heap_end += incr; + return (caddr_t)prev_heap_end; +} + +// Stack overflow hook +void vApplicationStackOverflowHook(xTaskHandle xTask, signed portCHAR* pcTaskName) +{ +// Logger_fatal(FATALCODE_STACKOVERFLOW); +} + +// Malloc failed hook +void vApplicationMallocFailedHook(void) +{ +// Logger_fatal(FATALCODE_MALLOCFAILED); +} + +// Assert for StdPeriph library +void assert_failed(uint8_t* file, uint32_t line) +{ +// Logger_log((char*)file, "", line, LOGTYPE_ERROR, "assert failed"); +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/b9/80212936a69700171090ed03afc2ec65 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/b9/80212936a69700171090ed03afc2ec65 new file mode 100644 index 0000000..12ab7a6 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/b9/80212936a69700171090ed03afc2ec65 @@ -0,0 +1,107 @@ +// ----------------------------------------------------------------------------- +/// @file freeRTOSFixes.c +/// @brief Description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @file freeRTOSFixes.c +/// @ingroup {group_name} + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + +#include +#include +#include + +#include "freeRTOSFixes.h" + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Type definitions +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// File-scope variables +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function definitions +// ----------------------------------------------------------------------------- + +void OS_logTaskInfo(xTaskHandle taskHandle) +{ + unsigned portBASE_TYPE highWaterMark; + char text[128]; + + snprintf(text, sizeof(text), "Task %s\n", pcTaskGetTaskName(taskHandle)); + Shell_sendString(text); + + highWaterMark = uxTaskGetStackHighWaterMark(taskHandle); + snprintf(text, sizeof(text), "Stack high water mark : %lu long words\n", highWaterMark); + Shell_sendString(text); +} + +// Implementation for libc, needed for printf related functions. +caddr_t _sbrk(int incr) +{ + extern char _end; + static char* heap_end; + char* prev_heap_end; + + if(heap_end == 0) + { + heap_end = &_end; + } + + prev_heap_end = heap_end; + heap_end += incr; + return (caddr_t)prev_heap_end; +} + +// Stack overflow hook +void vApplicationStackOverflowHook(xTaskHandle xTask, signed portCHAR* pcTaskName) +{ +// Logger_fatal(FATALCODE_STACKOVERFLOW); +} + +// Malloc failed hook +void vApplicationMallocFailedHook(void) +{ +// Logger_fatal(FATALCODE_MALLOCFAILED); +} + +// Assert for StdPeriph library +void assert_failed(uint8_t* file, uint32_t line) +{ +// Logger_log((char*)file, "", line, LOGTYPE_ERROR, "assert failed"); +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/b9/a58462089d9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/b9/a58462089d9400171201ed9ff9474498 new file mode 100644 index 0000000..5484ea6 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/b9/a58462089d9400171201ed9ff9474498 @@ -0,0 +1,101 @@ +;/* +; FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. +; All rights reserved +; +; +; *************************************************************************** +; * * +; * FreeRTOS tutorial books are available in pdf and paperback. * +; * Complete, revised, and edited pdf reference manuals are also * +; * available. * +; * * +; * Purchasing FreeRTOS documentation will not only help you, by * +; * ensuring you get running as quickly as possible and with an * +; * in-depth knowledge of how to use FreeRTOS, it will also help * +; * the FreeRTOS project to continue with its mission of providing * +; * professional grade, cross platform, de facto standard solutions * +; * for microcontrollers - completely free of charge! * +; * * +; * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * +; * * +; * Thank you for using FreeRTOS, and thank you for your support! * +; * * +; *************************************************************************** +; +; +; This file is part of the FreeRTOS distribution. +; +; FreeRTOS is free software; you can redistribute it and/or modify it under +; the terms of the GNU General Public License (version 2) as published by the +; Free Software Foundation AND MODIFIED BY the FreeRTOS exception. +; >>>NOTE<<< The modification to the GPL is included to allow you to +; distribute a combined work that includes FreeRTOS without being obliged to +; provide the source code for proprietary components outside of the FreeRTOS +; kernel. FreeRTOS is distributed in the hope that it will be useful, but +; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +; more details. You should have received a copy of the GNU General Public +; License and the FreeRTOS license exception along with FreeRTOS; if not it +; can be viewed here: http://www.freertos.org/a00114.html and also obtained +; by writing to Richard Barry, contact details for whom are available on the +; FreeRTOS WEB site. +; +; 1 tab == 4 spaces! +; +; http://www.FreeRTOS.org - Documentation, latest information, license and +; contact details. +; +; http://www.SafeRTOS.com - A version that is certified for use in safety +; critical systems. +; +; http://www.OpenRTOS.com - Commercial support, development, porting, +; licensing and training services. +;*/ + .macro portSAVE_CONTEXT + + ; Save r0 to r14 and pr. + movml.l r15, @-r15 + + ; Save mac1, mach and gbr + sts.l macl, @-r15 + sts.l mach, @-r15 + stc.l gbr, @-r15 + + ; Get the address of pxCurrentTCB + mov.l #_pxCurrentTCB, r0 + + ; Get the address of pxTopOfStack from the TCB. + mov.l @r0, r0 + + ; Save the stack pointer in pxTopOfStack. + mov.l r15, @r0 + + .endm + +;----------------------------------------------------------- + + .macro portRESTORE_CONTEXT + + ; Get the address of the pxCurrentTCB variable. + mov.l #_pxCurrentTCB, r0 + + ; Get the address of the task stack from pxCurrentTCB. + mov.l @r0, r0 + + ; Get the task stack itself into the stack pointer. + mov.l @r0, r15 + + ; Restore system registers. + ldc.l @r15+, gbr + lds.l @r15+, mach + lds.l @r15+, macl + + ; Restore r0 to r14 and PR + movml.l @r15+, r15 + + ; Pop the SR and PC to jump to the start of the task. + rte + nop + + .endm +;----------------------------------------------------------- \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/ba/50466928a79700171090ed03afc2ec65 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/ba/50466928a79700171090ed03afc2ec65 new file mode 100644 index 0000000..8ac6fdb --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/ba/50466928a79700171090ed03afc2ec65 @@ -0,0 +1,84 @@ +// ----------------------------------------------------------------------------- +/// @file main.c +/// @brief Description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @file main.c +/// @ingroup {group_name} + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + +// FreeRTOS includes +#include "FreeRTOS.h" +#include "task.h" + + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + +/* The time between cycles of the 'check' functionality (defined within the +tick hook. */ +#define mainCHECK_DELAY ( ( TickType_t ) 5000 / portTICK_PERIOD_MS ) + +// ----------------------------------------------------------------------------- +// Type definitions +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// File-scope variables +// ----------------------------------------------------------------------------- + +/* Variable that counts at 20KHz to provide the time base for the run time +stats. */ +unsigned long ulRunTimeStatsClock = 0UL; + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function definitions +// ----------------------------------------------------------------------------- + + + +int main (void) +{ + + + /* Start the scheduler. */ + vTaskStartScheduler(); + + /* Will only get here if there was insufficient memory to create the idle + task. The idle task is created within vTaskStartScheduler(). */ + for( ;; ); + + + return -1; +} + +void vApplicationTickHook () +{ + +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/ba/a00f483d9a970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/ba/a00f483d9a970017138fe0bf747e5677 new file mode 100644 index 0000000..ef7a1ff --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/ba/a00f483d9a970017138fe0bf747e5677 @@ -0,0 +1,210 @@ +/* +****************************************************************************** +** +** File : LinkerScript.ld +** +** Author : Auto-generated by Ac6 System Workbench +** +** Abstract : Linker script for STM32F107VCTx Device from STM32F1 series +** 64Kbytes RAM +** 256Kbytes ROM +** +** Set heap size, stack size and stack location according +** to application requirements. +** +** Set memory bank area and size if external memory is used. +** +** Target : STMicroelectronics STM32 +** +** Distribution: The file is distributed “as is,” without any warranty +** of any kind. +** +***************************************************************************** +** @attention +** +**

© COPYRIGHT(c) 2017 Ac6

+** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** 1. Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** 3. Neither the name of Ac6 nor the names of its contributors +** may be used to endorse or promote products derived from this software +** without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +***************************************************************************** +*/ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = 0x20010000; /* end of RAM */ + +_Min_Heap_Size = 0; /* required amount of heap */ +_Min_Stack_Size = 0x400; /* required amount of stack */ + +/* Memories definition */ +MEMORY +{ + RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K + ROM (rx) : ORIGIN = 0x8000000, LENGTH = 256K +} + +/* Sections */ +SECTIONS +{ + /* The startup code into ROM memory */ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } >ROM + + /* The program code and other data into ROM memory */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + } >ROM + + /* Constant data into ROM memory*/ + .rodata : + { + . = ALIGN(4); + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + . = ALIGN(4); + } >ROM + + .ARM.extab : { + . = ALIGN(4); + *(.ARM.extab* .gnu.linkonce.armextab.*) + . = ALIGN(4); + } >ROM + + .ARM : { + . = ALIGN(4); + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + . = ALIGN(4); + } >ROM + + .preinit_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + . = ALIGN(4); + } >ROM + + .init_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + . = ALIGN(4); + } >ROM + + .fini_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + . = ALIGN(4); + } >ROM + + /* Used by the startup to initialize data */ + _sidata = LOADADDR(.data); + + /* Initialized data sections into RAM memory */ + .data : + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + } >RAM AT> ROM + + + /* Uninitialized data section into RAM memory */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM + + /* User_heap_stack section, used to check that there is enough RAM left */ + ._user_heap_stack : + { + . = ALIGN(8); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(8); + } >RAM + + + + /* Remove information from the compiler libraries */ +/* /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } +*/ + .ARM.attributes 0 : { *(.ARM.attributes) } + + GROUP( + libgcc.a + libg.a + libc.a + libm.a + libnosys.a + ) +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/bc/a051a966a59700171090ed03afc2ec65 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/bc/a051a966a59700171090ed03afc2ec65 new file mode 100644 index 0000000..46e85ce --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/bc/a051a966a59700171090ed03afc2ec65 @@ -0,0 +1,134 @@ +ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +heap_4.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +STM32_CORE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) \ +-I$(STM32_CORE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -lc -lm -fno-common -mcpu=cortex-m3 -mthumb $(RELEASE_DEFINES) $(INCLUDES) +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -nostartfiles -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map +release: export LDARCHIVES := -L. -L$(STM32_STDPERIPH_ROOT) -lSTM_StdPeriph -lhsb_mrts_release +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -f hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + rm -rf obj_release + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +else + +vpath %.c \ +src \ +startup \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport + +vpath %.s \ +startup +vpath %.o \ +obj_release + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) $(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)/$@ + +$(OBJ_DIR): + mkdir -p $@ + +endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/be/e0126803c796001713a7ede92b37d6f1 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/be/e0126803c796001713a7ede92b37d6f1 new file mode 100644 index 0000000..d404aa0 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/be/e0126803c796001713a7ede92b37d6f1 @@ -0,0 +1,61 @@ +# STM support library + +SRC_DIR = Libraries/STM32F10x_StdPeriph_Driver/src/ +INC_DIR = Libraries/STM32F10x_StdPeriph_Driver/inc/ +DEV_DIR = Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/ +COR_DIR = Libraries/CMSIS/CM3/CoreSupport/ +OBJ_DIR = Libraries/STM32F10x_StdPeriph_Driver/obj + +CROSS_COMPILE = arm-none-eabi- + +CC = $(CROSS_COMPILE)gcc +CCFLAGS = -c -O2 -g -fno-common -mcpu=cortex-m3 -mthumb -DUSE_FULL_ASSERT -I$(INC_DIR) -I$(DEV_DIR) -I$(COR_DIR) -I. -Wall -Werror -DUSE_STDPERIPH_DRIVER + +AR = $(CROSS_COMPILE)ar +ARFLAGS = rs + +OBJECTS = \ +misc.o \ +stm32f10x_adc.o \ +stm32f10x_bkp.o \ +stm32f10x_can.o \ +stm32f10x_cec.o \ +stm32f10x_crc.o \ +stm32f10x_dac.o \ +stm32f10x_dbgmcu.o \ +stm32f10x_dma.o \ +stm32f10x_exti.o \ +stm32f10x_flash.o \ +stm32f10x_fsmc.o \ +stm32f10x_gpio.o \ +stm32f10x_i2c.o \ +stm32f10x_iwdg.o \ +stm32f10x_pwr.o \ +stm32f10x_rcc.o \ +stm32f10x_rtc.o \ +stm32f10x_sdio.o \ +stm32f10x_spi.o \ +stm32f10x_tim.o \ +stm32f10x_usart.o \ +stm32f10x_wwdg.o + +LIBRARY = libSTM_StdPeriph.a + +vpath %.c $(SRC_DIR) +vpath %.o $(OBJ_DIR) + +all: $(LIBRARY) + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +clean: + rm -rf $(LIBRARY) $(OBJ_DIR) + +$(OBJ_DIR): + mkdir -p $@ + +.PHONY: all clean diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/c/804d93b4a59700171090ed03afc2ec65 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/c/804d93b4a59700171090ed03afc2ec65 new file mode 100644 index 0000000..4c6fa2a --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/c/804d93b4a59700171090ed03afc2ec65 @@ -0,0 +1,87 @@ +// ----------------------------------------------------------------------------- +/// @file main.c +/// @brief Description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @file main.c +/// @ingroup {group_name} + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + +// FreeRTOS includes +#include "FreeRTOS.h" +#include "task.h" + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + +/* The time between cycles of the 'check' functionality (defined within the +tick hook. */ +#define mainCHECK_DELAY ( ( TickType_t ) 5000 / portTICK_PERIOD_MS ) + +// ----------------------------------------------------------------------------- +// Type definitions +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// File-scope variables +// ----------------------------------------------------------------------------- + +/* Variable that counts at 20KHz to provide the time base for the run time +stats. */ +unsigned long ulRunTimeStatsClock = 0UL; + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function definitions +// ----------------------------------------------------------------------------- + + +int main (void) +{ + + + /* Start the scheduler. */ + vTaskStartScheduler(); + + /* Will only get here if there was insufficient memory to create the idle + task. The idle task is created within vTaskStartScheduler(). */ + for( ;; ); + + + return -1; +} + +void vApplicationTickHook () +{ + +} + +void vApplicationStackOverflowHook () +{ + +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/c/b3585b089d9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/c/b3585b089d9400171201ed9ff9474498 new file mode 100644 index 0000000..51530b6 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/c/b3585b089d9400171201ed9ff9474498 @@ -0,0 +1,279 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the HCS12 port. + *----------------------------------------------------------*/ + + +/* + * Configure a timer to generate the RTOS tick at the frequency specified + * within FreeRTOSConfig.h. + */ +static void prvSetupTimerInterrupt( void ); + +/* Interrupt service routines have to be in non-banked memory - as does the +scheduler startup function. */ +#pragma CODE_SEG __NEAR_SEG NON_BANKED + + /* Manual context switch function. This is the SWI ISR. */ + void interrupt vPortYield( void ); + + /* Tick context switch function. This is the timer ISR. */ + void interrupt vPortTickInterrupt( void ); + + /* Simply called by xPortStartScheduler(). xPortStartScheduler() does not + start the scheduler directly because the header file containing the + xPortStartScheduler() prototype is part of the common kernel code, and + therefore cannot use the CODE_SEG pragma. */ + static BaseType_t xBankedStartScheduler( void ); + +#pragma CODE_SEG DEFAULT + +/* Calls to portENTER_CRITICAL() can be nested. When they are nested the +critical section should not be left (i.e. interrupts should not be re-enabled) +until the nesting depth reaches 0. This variable simply tracks the nesting +depth. Each task maintains it's own critical nesting depth variable so +uxCriticalNesting is saved and restored from the task stack during a context +switch. */ +volatile UBaseType_t uxCriticalNesting = 0xff; + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* + Place a few bytes of known values on the bottom of the stack. + This can be uncommented to provide useful stack markers when debugging. + + *pxTopOfStack = ( StackType_t ) 0x11; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x22; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x33; + pxTopOfStack--; + */ + + + + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. In this case the stack as + expected by the HCS12 RTI instruction. */ + + + /* The address of the task function is placed in the stack byte at a time. */ + *pxTopOfStack = ( StackType_t ) *( ((StackType_t *) (&pxCode) ) + 1 ); + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) *( ((StackType_t *) (&pxCode) ) + 0 ); + pxTopOfStack--; + + /* Next are all the registers that form part of the task context. */ + + /* Y register */ + *pxTopOfStack = ( StackType_t ) 0xff; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xee; + pxTopOfStack--; + + /* X register */ + *pxTopOfStack = ( StackType_t ) 0xdd; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xcc; + pxTopOfStack--; + + /* A register contains parameter high byte. */ + *pxTopOfStack = ( StackType_t ) *( ((StackType_t *) (&pvParameters) ) + 0 ); + pxTopOfStack--; + + /* B register contains parameter low byte. */ + *pxTopOfStack = ( StackType_t ) *( ((StackType_t *) (&pvParameters) ) + 1 ); + pxTopOfStack--; + + /* CCR: Note that when the task starts interrupts will be enabled since + "I" bit of CCR is cleared */ + *pxTopOfStack = ( StackType_t ) 0x00; + pxTopOfStack--; + + #ifdef BANKED_MODEL + /* The page of the task. */ + *pxTopOfStack = ( StackType_t ) ( ( int ) pxCode ); + pxTopOfStack--; + #endif + + /* Finally the critical nesting depth is initialised with 0 (not within + a critical section). */ + *pxTopOfStack = ( StackType_t ) 0x00; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the HCS12 port will get stopped. */ +} +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt( void ) +{ + TickTimer_SetFreqHz( configTICK_RATE_HZ ); + TickTimer_Enable(); +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* xPortStartScheduler() does not start the scheduler directly because + the header file containing the xPortStartScheduler() prototype is part + of the common kernel code, and therefore cannot use the CODE_SEG pragma. + Instead it simply calls the locally defined xBankedStartScheduler() - + which does use the CODE_SEG pragma. */ + + return xBankedStartScheduler(); +} +/*-----------------------------------------------------------*/ + +#pragma CODE_SEG __NEAR_SEG NON_BANKED + +static BaseType_t xBankedStartScheduler( void ) +{ + /* Configure the timer that will generate the RTOS tick. Interrupts are + disabled when this function is called. */ + prvSetupTimerInterrupt(); + + /* Restore the context of the first task. */ + portRESTORE_CONTEXT(); + + /* Simulate the end of an interrupt to start the scheduler off. */ + __asm( "rti" ); + + /* Should not get here! */ + return pdFALSE; +} +/*-----------------------------------------------------------*/ + +/* + * Context switch functions. These are both interrupt service routines. + */ + +/* + * Manual context switch forced by calling portYIELD(). This is the SWI + * handler. + */ +void interrupt vPortYield( void ) +{ + portSAVE_CONTEXT(); + vTaskSwitchContext(); + portRESTORE_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +/* + * RTOS tick interrupt service routine. If the cooperative scheduler is + * being used then this simply increments the tick count. If the + * preemptive scheduler is being used a context switch can occur. + */ +void interrupt vPortTickInterrupt( void ) +{ + #if configUSE_PREEMPTION == 1 + { + /* A context switch might happen so save the context. */ + portSAVE_CONTEXT(); + + /* Increment the tick ... */ + if( xTaskIncrementTick() != pdFALSE ) + { + vTaskSwitchContext(); + } + + TFLG1 = 1; + + /* Restore the context of a task - which may be a different task + to that interrupted. */ + portRESTORE_CONTEXT(); + } + #else + { + xTaskIncrementTick(); + TFLG1 = 1; + } + #endif +} + +#pragma CODE_SEG DEFAULT + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/c/d08d942094970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/c/d08d942094970017138fe0bf747e5677 new file mode 100644 index 0000000..005115a --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/c/d08d942094970017138fe0bf747e5677 @@ -0,0 +1,128 @@ +ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +heap_4.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -fno-common -mcpu=cortex-m3 -mthumb $(RELEASE_DEFINES) $(INCLUDES) +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -nostartfiles -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map +release: export LDARCHIVES := -L. -L$(STM32_STDPERIPH_ROOT) -lSTM_StdPeriph +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -f hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + rm -rf obj_release + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +else + +vpath %.c \ +src \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ +$(STM32_DEVICE_SUPPORT_DIR) + +vpath %.s $(STARTER_SCRIPT_DIR) +vpath %.o $(OBJ_DIR) + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) #$(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +#$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) +# $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)/$@ + +$(OBJ_DIR): + mkdir -p $@ + +endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/c/d0cfe48b91970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/c/d0cfe48b91970017138fe0bf747e5677 new file mode 100644 index 0000000..cbed738 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/c/d0cfe48b91970017138fe0bf747e5677 @@ -0,0 +1,127 @@ +ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +heap_4.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -fno-common -mcpu=cortex-m3 -mthumb $(RELEASE_DEFINES) $(INCLUDES) +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -nostartfiles -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map +release: export LDARCHIVES := -L. -L$(STM32_STDPERIPH_ROOT) -lSTM_StdPeriph +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -rf $(OBJ_DIR) hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +else + +vpath %.c \ +src \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ +$(STM32_DEVICE_SUPPORT_DIR) + +vpath %.s $(STARTER_SCRIPT_DIR) +vpath %.o $(OBJ_DIR) + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) #$(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +#$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) +# $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)/$@ + +$(OBJ_DIR): + mkdir -p $@ + +endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/c1/909599cc98970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/c1/909599cc98970017138fe0bf747e5677 new file mode 100644 index 0000000..f4f7d90 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/c1/909599cc98970017138fe0bf747e5677 @@ -0,0 +1,79 @@ +// ----------------------------------------------------------------------------- +/// @file main.c +/// @brief Description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @file main.c +/// @ingroup {group_name} + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + +// FreeRTOS includes +#include "FreeRTOS.h" +#include "task.h" + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + +/* The time between cycles of the 'check' functionality (defined within the +tick hook. */ +#define mainCHECK_DELAY ( ( TickType_t ) 5000 / portTICK_PERIOD_MS ) + +// ----------------------------------------------------------------------------- +// Type definitions +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// File-scope variables +// ----------------------------------------------------------------------------- + +/* Variable that counts at 20KHz to provide the time base for the run time +stats. */ +unsigned long ulRunTimeStatsClock = 0UL; + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function definitions +// ----------------------------------------------------------------------------- + +void _init(void) {return;} + +int main (void) +{ + + + /* Start the scheduler. */ + //vTaskStartScheduler(); + + /* Will only get here if there was insufficient memory to create the idle + task. The idle task is created within vTaskStartScheduler(). */ + for( ;; ); + + + return -1; +} + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/c2/008ebe6e96970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/c2/008ebe6e96970017138fe0bf747e5677 new file mode 100644 index 0000000..6503f2f --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/c2/008ebe6e96970017138fe0bf747e5677 @@ -0,0 +1,134 @@ +ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +heap_4.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +STM32_CORE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) \ +-I$(STM32_CORE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -fno-common -mcpu=cortex-m3 -mthumb $(RELEASE_DEFINES) $(INCLUDES) +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -nostartfiles -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map +release: export LDARCHIVES := -L. -L$(STM32_STDPERIPH_ROOT) -lSTM_StdPeriph -lhsb_mrts_release +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -f hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + rm -rf obj_release + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +else + +vpath %.c \ +src \ +startup \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport + +vpath %.s \ +startup +vpath %.o \ +obj_release + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) $(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)/$@ + +$(OBJ_DIR): + mkdir -p $@ + +endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/c3/10bc053393970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/c3/10bc053393970017138fe0bf747e5677 new file mode 100644 index 0000000..9205e3f --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/c3/10bc053393970017138fe0bf747e5677 @@ -0,0 +1,128 @@ +#ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +heap_4.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -fno-common -mcpu=cortex-m3 -mthumb $(RELEASE_DEFINES) $(INCLUDES) +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -nostartfiles -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map +release: export LDARCHIVES := -L. -L$(STM32_STDPERIPH_ROOT) -lSTM_StdPeriph +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -f hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + rm -rf obj_release + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +#else + +vpath %.c \ +src \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ +$(STM32_DEVICE_SUPPORT_DIR) + +vpath %.s $(STARTER_SCRIPT_DIR) +vpath %.o $(OBJ_DIR) + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) #$(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +#$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) +# $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)/$@ + +$(OBJ_DIR): + mkdir -p $@ + +#endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/c4/50a1c748a59700171090ed03afc2ec65 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/c4/50a1c748a59700171090ed03afc2ec65 new file mode 100644 index 0000000..e69de29 diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/c4/908019708a970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/c4/908019708a970017138fe0bf747e5677 new file mode 100644 index 0000000..23d6a99 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/c4/908019708a970017138fe0bf747e5677 @@ -0,0 +1,72 @@ +// ----------------------------------------------------------------------------- +/// @file main.c +/// @brief Description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @file main.c +/// @ingroup {group_name} + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + +// FreeRTOS includes +#include "task.h" + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Type definitions +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// File-scope variables +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function definitions +// ----------------------------------------------------------------------------- + + +int main (void) +{ + + + /* Start the scheduler. */ + vTaskStartScheduler(); + + /* Will only get here if there was insufficient memory to create the idle + task. The idle task is created within vTaskStartScheduler(). */ + for( ;; ); + + + return -1; +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/c4/923f67089d9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/c4/923f67089d9400171201ed9ff9474498 new file mode 100644 index 0000000..ca67ce2 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/c4/923f67089d9400171201ed9ff9474498 @@ -0,0 +1,122 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORT_ASM_H +#define PORT_ASM_H + +portSAVE_CONTEXT macro + /* Save the remaining registers. */ + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + mov.w &_usCriticalNesting, r14 + push r14 + mov.w &_pxCurrentTCB, r12 + mov.w r1, @r12 + endm +/*-----------------------------------------------------------*/ + +portRESTORE_CONTEXT macro + mov.w &_pxCurrentTCB, r12 + mov.w @r12, r1 + pop r15 + mov.w r15, &_usCriticalNesting + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + + /* The last thing on the stack will be the status register. + Ensure the power down bits are clear ready for the next + time this power down register is popped from the stack. */ + bic.w #0xf0,0(SP) + + reti + endm +/*-----------------------------------------------------------*/ + +#endif + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/c5/0092a29a9b970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/c5/0092a29a9b970017138fe0bf747e5677 new file mode 100644 index 0000000..86d0536 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/c5/0092a29a9b970017138fe0bf747e5677 @@ -0,0 +1,134 @@ +ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +heap_4.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +STM32_CORE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) \ +-I$(STM32_CORE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -fno-common -mcpu=cortex-m3 -mthumb -specs=nosys.specs $(RELEASE_DEFINES) $(INCLUDES) +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -nostartfiles -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map +release: export LDARCHIVES := -L. -L$(STM32_STDPERIPH_ROOT) -lSTM_StdPeriph -lhsb_mrts_release +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -f hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + rm -rf obj_release + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +else + +vpath %.c \ +src \ +startup \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport + +vpath %.s \ +startup +vpath %.o \ +obj_release + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) $(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)/$@ + +$(OBJ_DIR): + mkdir -p $@ + +endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/c5/306655879d970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/c5/306655879d970017138fe0bf747e5677 new file mode 100644 index 0000000..d1e9bc6 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/c5/306655879d970017138fe0bf747e5677 @@ -0,0 +1,134 @@ +ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +heap_4.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +STM32_CORE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) \ +-I$(STM32_CORE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -fno-common -mcpu=cortex-m3 -mthumb $(RELEASE_DEFINES) $(INCLUDES) +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -nostartfiles -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map +release: export LDARCHIVES := -L. -L$(STM32_STDPERIPH_ROOT) -lSTM_StdPeriph -lhsb_mrts_release +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -f hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + rm -rf obj_release + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +else + +vpath %.c \ +src \ +startup \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport + +vpath %.s \ +startup +vpath %.o \ +obj_release + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) $(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)/$@ + +$(OBJ_DIR): + mkdir -p $@ + +endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/c7/70452cd18a970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/c7/70452cd18a970017138fe0bf747e5677 new file mode 100644 index 0000000..e69de29 diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/c7/d0396fa0cf96001713a7ede92b37d6f1 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/c7/d0396fa0cf96001713a7ede92b37d6f1 new file mode 100644 index 0000000..81dc089 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/c7/d0396fa0cf96001713a7ede92b37d6f1 @@ -0,0 +1,68 @@ +# STM support library + +STM32_STDPERIPH_INC = Libraries/STM32F10x_StdPeriph_Driver/inc/ +CORE_DIR = Libraries/CMSIS/CM3/CoreSupport/ +DEVICE_SUPPORT_DIR = Libraries/CMSIS/CM3/DrviceSupport/ST/STM32F10x + +SRC_DIR = Libraries/STM32F10x_StdPeriph_Driver/src/ + +INCLUDE_DIRS = \ +-I$(STM32_STDPERIPH_INC) \ +#-I$(CIRE_DIR) \ +#-I$(DEVICE_SUPPORT_DIR) \ + +OBJ_DIR = Libraries/STM32F10x_StdPeriph_Driver/obj + +CROSS_COMPILE = arm-none-eabi- + +CC = $(CROSS_COMPILE)gcc +CCFLAGS = -c -O2 -g -fno-common -mcpu=cortex-m3 -mthumb -DUSE_FULL_ASSERT $(INCLUDE_DIRS) -I. -Wall -Werror -D"assert_param(expr)=((void)0)" + +AR = $(CROSS_COMPILE)ar +ARFLAGS = rs + +OBJECTS = \ +misc.o \ +stm32f10x_adc.o \ +stm32f10x_bkp.o \ +stm32f10x_can.o \ +stm32f10x_cec.o \ +stm32f10x_crc.o \ +stm32f10x_dac.o \ +stm32f10x_dbgmcu.o \ +stm32f10x_dma.o \ +stm32f10x_exti.o \ +stm32f10x_flash.o \ +stm32f10x_fsmc.o \ +stm32f10x_gpio.o \ +stm32f10x_i2c.o \ +stm32f10x_iwdg.o \ +stm32f10x_pwr.o \ +stm32f10x_rcc.o \ +stm32f10x_rtc.o \ +stm32f10x_sdio.o \ +stm32f10x_spi.o \ +stm32f10x_tim.o \ +stm32f10x_usart.o \ +stm32f10x_wwdg.o + +LIBRARY = libSTM_StdPeriph.a + +vpath %.c $(SRC_DIR) +vpath %.o $(OBJ_DIR) + +all: $(LIBRARY) + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +clean: + rm -rf $(LIBRARY) $(OBJ_DIR) + +$(OBJ_DIR): + mkdir -p $@ + +.PHONY: all clean diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/c8/903f67089d9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/c8/903f67089d9400171201ed9ff9474498 new file mode 100644 index 0000000..8d3e87f --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/c8/903f67089d9400171201ed9ff9474498 @@ -0,0 +1 @@ +The Rowley ARM7 demo uses the GCC ARM7 port files. \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/ca/207997a09c9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/ca/207997a09c9400171201ed9ff9474498 new file mode 100644 index 0000000..05cecea --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/ca/207997a09c9400171201ed9ff9474498 @@ -0,0 +1,55 @@ +// ----------------------------------------------------------------------------- +/// @file main.c +/// @brief Description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2015 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @file main.c +/// @ingroup {group_name} + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Type definitions +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// File-scope variables +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function definitions +// ----------------------------------------------------------------------------- diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/ca/301a72eea69700171090ed03afc2ec65 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/ca/301a72eea69700171090ed03afc2ec65 new file mode 100644 index 0000000..5a681ef --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/ca/301a72eea69700171090ed03afc2ec65 @@ -0,0 +1,109 @@ +// ----------------------------------------------------------------------------- +/// @file freeRTOSFixes.c +/// @brief Description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @file freeRTOSFixes.c +/// @ingroup {group_name} + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + +#include +#include +#include + +#include "freeRTOSFixes.h" + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Type definitions +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// File-scope variables +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function definitions +// ----------------------------------------------------------------------------- + +void _init(void) {return;} + +void OS_logTaskInfo(xTaskHandle taskHandle) +{ + unsigned portBASE_TYPE highWaterMark; + char text[128]; + + snprintf(text, sizeof(text), "Task %s\n", pcTaskGetTaskName(taskHandle)); +// Shell_sendString(text); + + highWaterMark = uxTaskGetStackHighWaterMark(taskHandle); +// snprintf(text, sizeof(text), "Stack high water mark : %lu long words\n", highWaterMark); +// Shell_sendString(text); +} + +// Implementation for libc, needed for printf related functions. +caddr_t _sbrk(int incr) +{ + extern char _end; + static char* heap_end; + char* prev_heap_end; + + if(heap_end == 0) + { + heap_end = &_end; + } + + prev_heap_end = heap_end; + heap_end += incr; + return (caddr_t)prev_heap_end; +} + +// Stack overflow hook +void vApplicationStackOverflowHook(xTaskHandle xTask, signed portCHAR* pcTaskName) +{ +// Logger_fatal(FATALCODE_STACKOVERFLOW); +} + +// Malloc failed hook +void vApplicationMallocFailedHook(void) +{ +// Logger_fatal(FATALCODE_MALLOCFAILED); +} + +// Assert for StdPeriph library +void assert_failed(uint8_t* file, uint32_t line) +{ +// Logger_log((char*)file, "", line, LOGTYPE_ERROR, "assert failed"); +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/cb/c02f5b6795970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/cb/c02f5b6795970017138fe0bf747e5677 new file mode 100644 index 0000000..d7db50f --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/cb/c02f5b6795970017138fe0bf747e5677 @@ -0,0 +1,130 @@ +ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +heap_4.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +STM32_CORE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -fno-common -mcpu=cortex-m3 -mthumb $(RELEASE_DEFINES) $(INCLUDES) +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -nostartfiles -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map +release: export LDARCHIVES := -L. -L$(STM32_STDPERIPH_ROOT) -lSTM_StdPeriph +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -f hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + rm -rf obj_release + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +else + +vpath %.c \ +src \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport + +vpath %.s $(STARTER_SCRIPT_DIR) +vpath %.o $(OBJ_DIR) + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) $(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)/$@ + +$(OBJ_DIR): + mkdir -p $@ + +endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/cc/2011c339a69700171090ed03afc2ec65 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/cc/2011c339a69700171090ed03afc2ec65 new file mode 100644 index 0000000..a4ec94c --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/cc/2011c339a69700171090ed03afc2ec65 @@ -0,0 +1,107 @@ +// ----------------------------------------------------------------------------- +/// @file freeRTOSFixes.c +/// @brief Description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @file freeRTOSFixes.c +/// @ingroup {group_name} + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + +#include +#include +#include + +#include "freeRTOSFixes.h" + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Type definitions +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// File-scope variables +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function definitions +// ----------------------------------------------------------------------------- + +void OS_logTaskInfo(xTaskHandle taskHandle) +{ + unsigned portBASE_TYPE highWaterMark; + char text[128]; + + snprintf(text, sizeof(text), "Task %s\n", pcTaskGetTaskName(taskHandle)); + //Shell_sendString(text); + + highWaterMark = uxTaskGetStackHighWaterMark(taskHandle); + snprintf(text, sizeof(text), "Stack high water mark : %lu long words\n", highWaterMark); + //Shell_sendString(text); +} + +// Implementation for libc, needed for printf related functions. +caddr_t _sbrk(int incr) +{ + extern char _end; + static char* heap_end; + char* prev_heap_end; + + if(heap_end == 0) + { + heap_end = &_end; + } + + prev_heap_end = heap_end; + heap_end += incr; + return (caddr_t)prev_heap_end; +} + +// Stack overflow hook +void vApplicationStackOverflowHook(xTaskHandle xTask, signed portCHAR* pcTaskName) +{ +// Logger_fatal(FATALCODE_STACKOVERFLOW); +} + +// Malloc failed hook +void vApplicationMallocFailedHook(void) +{ +// Logger_fatal(FATALCODE_MALLOCFAILED); +} + +// Assert for StdPeriph library +void assert_failed(uint8_t* file, uint32_t line) +{ +// Logger_log((char*)file, "", line, LOGTYPE_ERROR, "assert failed"); +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/cc/9023d82497970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/cc/9023d82497970017138fe0bf747e5677 new file mode 100644 index 0000000..f666bca --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/cc/9023d82497970017138fe0bf747e5677 @@ -0,0 +1,107 @@ +// ----------------------------------------------------------------------------- +/// @file FreeRTOSConfig.h +/// @brief File description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @defgroup {group_name} {group_description} +/// Description + +/// @file FreeRTOSConfig.h +/// @ingroup {group_name} + + +#ifndef FREERTOSCONFIG_H_ +#define FREERTOSCONFIG_H_ + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + +#define configUSE_PREEMPTION 1 +#define configUSE_IDLE_HOOK 0 +#define configUSE_TICK_HOOK 1 +#define configCPU_CLOCK_HZ ( ( unsigned long ) 62500000 ) +#define configTICK_RATE_HZ ( ( TickType_t ) 1000 ) +#define configMAX_PRIORITIES ( 5 ) +#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 128 ) +#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 30 * 1024 ) ) +#define configMAX_TASK_NAME_LEN ( 16 ) +#define configUSE_TRACE_FACILITY 1 +#define configUSE_16_BIT_TICKS 0 +#define configIDLE_SHOULD_YIELD 1 + +/* Co-routine definitions. */ +#define configUSE_CO_ROUTINES 0 +#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) + +#define configUSE_MUTEXES 1 +#define configUSE_COUNTING_SEMAPHORES 0 +#define configUSE_ALTERNATIVE_API 0 +#define configCHECK_FOR_STACK_OVERFLOW 2 +#define configUSE_RECURSIVE_MUTEXES 1 +#define configQUEUE_REGISTRY_SIZE 0 +#define configGENERATE_RUN_TIME_STATS 1 + +/* Set the following definitions to 1 to include the API function, or zero +to exclude the API function. */ + +#define INCLUDE_vTaskPrioritySet 1 +#define INCLUDE_uxTaskPriorityGet 1 +#define INCLUDE_vTaskDelete 1 +#define INCLUDE_vTaskCleanUpResources 0 +#define INCLUDE_vTaskSuspend 1 +#define INCLUDE_vTaskDelayUntil 1 +#define INCLUDE_vTaskDelay 1 + +/* This demo makes use of one or more example stats formatting functions. These +format the raw data provided by the uxTaskGetSystemState() function in to human +readable ASCII form. See the notes in the implementation of vTaskList() within +FreeRTOS/Source/tasks.c for limitations. */ +#define configUSE_STATS_FORMATTING_FUNCTIONS 1 + +/* This is the raw value as per the Cortex-M3 NVIC. Values can be 255 +(lowest) to 0 (1?) (highest). */ +#define configKERNEL_INTERRUPT_PRIORITY 255 +/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!! +See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */ +#define configMAX_SYSCALL_INTERRUPT_PRIORITY 191 /* equivalent to 0xb0, or priority 11. */ + + +/* This is the value being used as per the ST library which permits 16 +priority values, 0 to 15. This must correspond to the +configKERNEL_INTERRUPT_PRIORITY setting. Here 15 corresponds to the lowest +NVIC value of 255. */ +#define configLIBRARY_KERNEL_INTERRUPT_PRIORITY 15 + +// ----------------------------------------------------------------------------- +// Type definitions. +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + +#endif /* FREERTOSCONFIG_H_ */ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/cc/d046ba099a970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/cc/d046ba099a970017138fe0bf747e5677 new file mode 100644 index 0000000..e03cb20 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/cc/d046ba099a970017138fe0bf747e5677 @@ -0,0 +1,202 @@ +/* +****************************************************************************** +** +** File : LinkerScript.ld +** +** Author : Auto-generated by Ac6 System Workbench +** +** Abstract : Linker script for STM32F107VCTx Device from STM32F1 series +** 64Kbytes RAM +** 256Kbytes ROM +** +** Set heap size, stack size and stack location according +** to application requirements. +** +** Set memory bank area and size if external memory is used. +** +** Target : STMicroelectronics STM32 +** +** Distribution: The file is distributed “as is,” without any warranty +** of any kind. +** +***************************************************************************** +** @attention +** +**

© COPYRIGHT(c) 2017 Ac6

+** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** 1. Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** 3. Neither the name of Ac6 nor the names of its contributors +** may be used to endorse or promote products derived from this software +** without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +***************************************************************************** +*/ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = 0x20010000; /* end of RAM */ + +_Min_Heap_Size = 0; /* required amount of heap */ +_Min_Stack_Size = 0x400; /* required amount of stack */ + +/* Memories definition */ +MEMORY +{ + RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K + ROM (rx) : ORIGIN = 0x8000000, LENGTH = 256K +} + +/* Sections */ +SECTIONS +{ + /* The startup code into ROM memory */ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } >ROM + + /* The program code and other data into ROM memory */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + } >ROM + + /* Constant data into ROM memory*/ + .rodata : + { + . = ALIGN(4); + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + . = ALIGN(4); + } >ROM + + .ARM.extab : { + . = ALIGN(4); + *(.ARM.extab* .gnu.linkonce.armextab.*) + . = ALIGN(4); + } >ROM + + .ARM : { + . = ALIGN(4); + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + . = ALIGN(4); + } >ROM + + .preinit_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + . = ALIGN(4); + } >ROM + + .init_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + . = ALIGN(4); + } >ROM + + .fini_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + . = ALIGN(4); + } >ROM + + /* Used by the startup to initialize data */ + _sidata = LOADADDR(.data); + + /* Initialized data sections into RAM memory */ + .data : + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + } >RAM AT> ROM + + + /* Uninitialized data section into RAM memory */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM + + /* User_heap_stack section, used to check that there is enough RAM left */ + ._user_heap_stack : + { + . = ALIGN(8); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(8); + } >RAM + + + + /* Remove information from the compiler libraries */ +/* /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } +*/ + .ARM.attributes 0 : { *(.ARM.attributes) } +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/cc/f06eb33dc696001713a7ede92b37d6f1 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/cc/f06eb33dc696001713a7ede92b37d6f1 new file mode 100644 index 0000000..3c5e8c8 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/cc/f06eb33dc696001713a7ede92b37d6f1 @@ -0,0 +1,62 @@ +# STM support library + +SRC_DIR = Libraries/STM32F10x_StdPeriph_Driver/src/ +INC_DIR = \ +Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/ \ +Libraries/STM32F10x_StdPeriph_Driver/inc/ \ + +OBJ_DIR = Libraries/STM32F10x_StdPeriph_Driver/obj + +CROSS_COMPILE = arm-none-eabi- + +CC = $(CROSS_COMPILE)gcc +CCFLAGS = -c -O2 -g -fno-common -mcpu=cortex-m3 -mthumb -DUSE_FULL_ASSERT -I$(INC_DIR) -I. + +AR = $(CROSS_COMPILE)ar +ARFLAGS = rs + +OBJECTS = \ +misc.o \ +stm32f10x_adc.o \ +stm32f10x_bkp.o \ +stm32f10x_can.o \ +stm32f10x_cec.o \ +stm32f10x_crc.o \ +stm32f10x_dac.o \ +stm32f10x_dbgmcu.o \ +stm32f10x_dma.o \ +stm32f10x_exti.o \ +stm32f10x_flash.o \ +stm32f10x_fsmc.o \ +stm32f10x_gpio.o \ +stm32f10x_i2c.o \ +stm32f10x_iwdg.o \ +stm32f10x_pwr.o \ +stm32f10x_rcc.o \ +stm32f10x_rtc.o \ +stm32f10x_sdio.o \ +stm32f10x_spi.o \ +stm32f10x_tim.o \ +stm32f10x_usart.o \ +stm32f10x_wwdg.o + +LIBRARY = libSTM_StdPeriph.a + +vpath %.c $(SRC_DIR) +vpath %.o $(OBJ_DIR) + +all: $(LIBRARY) + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +clean: + rm -rf $(LIBRARY) $(OBJ_DIR) + +$(OBJ_DIR): + mkdir -p $@ + +.PHONY: all clean diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/cd/70c10c599c970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/cd/70c10c599c970017138fe0bf747e5677 new file mode 100644 index 0000000..8d15962 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/cd/70c10c599c970017138fe0bf747e5677 @@ -0,0 +1,205 @@ +/* +****************************************************************************** +** +** File : LinkerScript.ld +** +** Author : Auto-generated by Ac6 System Workbench +** +** Abstract : Linker script for STM32F107VCTx Device from STM32F1 series +** 64Kbytes RAM +** 256Kbytes ROM +** +** Set heap size, stack size and stack location according +** to application requirements. +** +** Set memory bank area and size if external memory is used. +** +** Target : STMicroelectronics STM32 +** +** Distribution: The file is distributed “as is,” without any warranty +** of any kind. +** +***************************************************************************** +** @attention +** +**

© COPYRIGHT(c) 2017 Ac6

+** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** 1. Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** 3. Neither the name of Ac6 nor the names of its contributors +** may be used to endorse or promote products derived from this software +** without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +***************************************************************************** +*/ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = 0x20010000; /* end of RAM */ + +_Min_Heap_Size = 0; /* required amount of heap */ +_Min_Stack_Size = 0x400; /* required amount of stack */ + +/* Memories definition */ +MEMORY +{ + RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K + ROM (rx) : ORIGIN = 0x8000000, LENGTH = 256K +} + +/* Sections */ +SECTIONS +{ + /* The startup code into ROM memory */ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } >ROM + + /* The program code and other data into ROM memory */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + } >ROM + + /* Constant data into ROM memory*/ + .rodata : + { + . = ALIGN(4); + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + . = ALIGN(4); + } >ROM + + .ARM.extab : { + . = ALIGN(4); + *(.ARM.extab* .gnu.linkonce.armextab.*) + . = ALIGN(4); + } >ROM + + .ARM : { + . = ALIGN(4); + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + . = ALIGN(4); + } >ROM + + .preinit_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + . = ALIGN(4); + } >ROM + + .init_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + . = ALIGN(4); + } >ROM + + .fini_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + . = ALIGN(4); + } >ROM + + /* Used by the startup to initialize data */ + _sidata = LOADADDR(.data); + + /* Initialized data sections into RAM memory */ + .data : + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + } >RAM AT> ROM + + + /* Uninitialized data section into RAM memory */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM + + /* User_heap_stack section, used to check that there is enough RAM left */ + ._user_heap_stack : + { + . = ALIGN(8); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(8); + } >RAM + + + + /* Remove information from the compiler libraries */ +/* /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } +*/ + GROUP (libc.a); + + .ARM.attributes 0 : { *(.ARM.attributes) } + +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/cd/a28462089d9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/cd/a28462089d9400171201ed9ff9474498 new file mode 100644 index 0000000..c7b8f95 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/cd/a28462089d9400171201ed9ff9474498 @@ -0,0 +1,402 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the RX600 port. + *----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Library includes. */ +#include "string.h" + +/* Hardware specifics. */ +#include "iodefine.h" + +/*-----------------------------------------------------------*/ + +/* Tasks should start with interrupts enabled and in Supervisor mode, therefore +PSW is set with U and I set, and PM and IPL clear. */ +#define portINITIAL_PSW ( ( StackType_t ) 0x00030000 ) +#define portINITIAL_FPSW ( ( StackType_t ) 0x00000100 ) + +/*-----------------------------------------------------------*/ + +/* The following lines are to ensure vSoftwareInterruptEntry can be referenced, + and therefore installed in the vector table, when the FreeRTOS code is built +as a library. */ +extern BaseType_t vSoftwareInterruptEntry; +const BaseType_t * p_vSoftwareInterruptEntry = &vSoftwareInterruptEntry; + +/*-----------------------------------------------------------*/ + +/* + * Function to start the first task executing - written in asm code as direct + * access to registers is required. + */ +static void prvStartFirstTask( void ); + +/* + * Software interrupt handler. Performs the actual context switch (saving and + * restoring of registers). Written in asm code as direct register access is + * required. + */ +static void prvYieldHandler( void ); + +/* + * The entry point for the software interrupt handler. This is the function + * that calls the inline asm function prvYieldHandler(). It is installed in + * the vector table, but the code that installs it is in prvYieldHandler rather + * than using a #pragma. + */ +void vSoftwareInterruptISR( void ); + +/*-----------------------------------------------------------*/ + +/* This is accessed by the inline assembler functions so is file scope for +convenience. */ +extern void *pxCurrentTCB; +extern void vTaskSwitchContext( void ); + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* R0 is not included as it is the stack pointer. */ + + *pxTopOfStack = 0x00; + pxTopOfStack--; + *pxTopOfStack = portINITIAL_PSW; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; + + /* When debugging it can be useful if every register is set to a known + value. Otherwise code space can be saved by just setting the registers + that need to be set. */ + #ifdef USE_FULL_REGISTER_INITIALISATION + { + pxTopOfStack--; + *pxTopOfStack = 0xffffffff; /* r15. */ + pxTopOfStack--; + *pxTopOfStack = 0xeeeeeeee; + pxTopOfStack--; + *pxTopOfStack = 0xdddddddd; + pxTopOfStack--; + *pxTopOfStack = 0xcccccccc; + pxTopOfStack--; + *pxTopOfStack = 0xbbbbbbbb; + pxTopOfStack--; + *pxTopOfStack = 0xaaaaaaaa; + pxTopOfStack--; + *pxTopOfStack = 0x99999999; + pxTopOfStack--; + *pxTopOfStack = 0x88888888; + pxTopOfStack--; + *pxTopOfStack = 0x77777777; + pxTopOfStack--; + *pxTopOfStack = 0x66666666; + pxTopOfStack--; + *pxTopOfStack = 0x55555555; + pxTopOfStack--; + *pxTopOfStack = 0x44444444; + pxTopOfStack--; + *pxTopOfStack = 0x33333333; + pxTopOfStack--; + *pxTopOfStack = 0x22222222; + pxTopOfStack--; + } + #else + { + pxTopOfStack -= 15; + } + #endif + + *pxTopOfStack = ( StackType_t ) pvParameters; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_FPSW; + pxTopOfStack--; + *pxTopOfStack = 0x11111111; /* Accumulator 0. */ + pxTopOfStack--; + *pxTopOfStack = 0x22222222; /* Accumulator 0. */ + pxTopOfStack--; + *pxTopOfStack = 0x33333333; /* Accumulator 0. */ + pxTopOfStack--; + *pxTopOfStack = 0x44444444; /* Accumulator 1. */ + pxTopOfStack--; + *pxTopOfStack = 0x55555555; /* Accumulator 1. */ + pxTopOfStack--; + *pxTopOfStack = 0x66666666; /* Accumulator 1. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void vApplicationSetupTimerInterrupt( void ); + + /* Use pxCurrentTCB just so it does not get optimised away. */ + if( pxCurrentTCB != NULL ) + { + /* Call an application function to set up the timer that will generate the + tick interrupt. This way the application can decide which peripheral to + use. A demo application is provided to show a suitable example. */ + vApplicationSetupTimerInterrupt(); + + /* Enable the software interrupt. */ + _IEN( _ICU_SWINT ) = 1; + + /* Ensure the software interrupt is clear. */ + _IR( _ICU_SWINT ) = 0; + + /* Ensure the software interrupt is set to the kernel priority. */ + _IPR( _ICU_SWINT ) = configKERNEL_INTERRUPT_PRIORITY; + + /* Start the first task. */ + prvStartFirstTask(); + } + + /* Just to make sure the function is not optimised away. */ + ( void ) vSoftwareInterruptISR(); + + /* Should not get here. */ + return pdFAIL; +} +/*-----------------------------------------------------------*/ + +#pragma inline_asm prvStartFirstTask +static void prvStartFirstTask( void ) +{ + /* When starting the scheduler there is nothing that needs moving to the + interrupt stack because the function is not called from an interrupt. + Just ensure the current stack is the user stack. */ + SETPSW U + + /* Obtain the location of the stack associated with which ever task + pxCurrentTCB is currently pointing to. */ + MOV.L #_pxCurrentTCB, R15 + MOV.L [R15], R15 + MOV.L [R15], R0 + + /* Restore the registers from the stack of the task pointed to by + pxCurrentTCB. */ + POP R15 + MVTACLO R15, A0 /* Accumulator low 32 bits. */ + POP R15 + MVTACHI R15, A0 /* Accumulator high 32 bits. */ + POP R15 + MVTACGU R15, A0 /* Accumulator guard. */ + POP R15 + MVTACLO R15, A1 /* Accumulator low 32 bits. */ + POP R15 + MVTACHI R15, A1 /* Accumulator high 32 bits. */ + POP R15 + MVTACGU R15, A1 /* Accumulator guard. */ + POP R15 + MVTC R15,FPSW /* Floating point status word. */ + POPM R1-R15 /* R1 to R15 - R0 is not included as it is the SP. */ + RTE /* This pops the remaining registers. */ + NOP + NOP +} +/*-----------------------------------------------------------*/ + +#pragma interrupt ( vTickISR( vect = _VECT( configTICK_VECTOR ), enable ) ) +void vTickISR( void ) +{ + /* Increment the tick, and perform any processing the new tick value + necessitates. */ + set_ipl( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + { + if( xTaskIncrementTick() != pdFALSE ) + { + taskYIELD(); + } + } + set_ipl( configKERNEL_INTERRUPT_PRIORITY ); +} +/*-----------------------------------------------------------*/ + +void vSoftwareInterruptISR( void ) +{ + prvYieldHandler(); +} +/*-----------------------------------------------------------*/ + +#pragma inline_asm prvYieldHandler +static void prvYieldHandler( void ) +{ + /* Re-enable interrupts. */ + SETPSW I + + /* Move the data that was automatically pushed onto the interrupt stack when + the interrupt occurred from the interrupt stack to the user stack. + + R15 is saved before it is clobbered. */ + PUSH.L R15 + + /* Read the user stack pointer. */ + MVFC USP, R15 + + /* Move the address down to the data being moved. */ + SUB #12, R15 + MVTC R15, USP + + /* Copy the data across. */ + MOV.L [ R0 ], [ R15 ] ; R15 + MOV.L 4[ R0 ], 4[ R15 ] ; PC + MOV.L 8[ R0 ], 8[ R15 ] ; PSW + + /* Move the interrupt stack pointer to its new correct position. */ + ADD #12, R0 + + /* All the rest of the registers are saved directly to the user stack. */ + SETPSW U + + /* Save the rest of the general registers (R15 has been saved already). */ + PUSHM R1-R14 + + /* Save the FPSW and accumulators. */ + MVFC FPSW, R15 + PUSH.L R15 + MVFACGU #0, A1, R15 + PUSH.L R15 + MVFACHI #0, A1, R15 + PUSH.L R15 + MVFACLO #0, A1, R15 ; Low order word. + PUSH.L R15 + MVFACGU #0, A0, R15 + PUSH.L R15 + MVFACHI #0, A0, R15 + PUSH.L R15 + MVFACLO #0, A0, R15 ; Low order word. + PUSH.L R15 + + /* Save the stack pointer to the TCB. */ + MOV.L #_pxCurrentTCB, R15 + MOV.L [ R15 ], R15 + MOV.L R0, [ R15 ] + + /* Ensure the interrupt mask is set to the syscall priority while the kernel + structures are being accessed. */ + MVTIPL #configMAX_SYSCALL_INTERRUPT_PRIORITY + + /* Select the next task to run. */ + BSR.A _vTaskSwitchContext + + /* Reset the interrupt mask as no more data structure access is required. */ + MVTIPL #configKERNEL_INTERRUPT_PRIORITY + + /* Load the stack pointer of the task that is now selected as the Running + state task from its TCB. */ + MOV.L #_pxCurrentTCB,R15 + MOV.L [ R15 ], R15 + MOV.L [ R15 ], R0 + + /* Restore the context of the new task. The PSW (Program Status Word) and + PC will be popped by the RTE instruction. */ + POP R15 + MVTACLO R15, A0 /* Accumulator low 32 bits. */ + POP R15 + MVTACHI R15, A0 /* Accumulator high 32 bits. */ + POP R15 + MVTACGU R15, A0 /* Accumulator guard. */ + POP R15 + MVTACLO R15, A1 /* Accumulator low 32 bits. */ + POP R15 + MVTACHI R15, A1 /* Accumulator high 32 bits. */ + POP R15 + MVTACGU R15, A1 /* Accumulator guard. */ + POP R15 + MVTC R15,FPSW + POPM R1-R15 + RTE + NOP + NOP +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( pxCurrentTCB == NULL ); + + /* The following line is just to prevent the symbol getting optimised away. */ + ( void ) vTaskSwitchContext(); +} +/*-----------------------------------------------------------*/ + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/d2/20eade568a970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/d2/20eade568a970017138fe0bf747e5677 new file mode 100644 index 0000000..df589f1 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/d2/20eade568a970017138fe0bf747e5677 @@ -0,0 +1,72 @@ +// ----------------------------------------------------------------------------- +/// @file main.c +/// @brief Description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @file main.c +/// @ingroup {group_name} + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + +// FreeRTOS includes +#include "tasks.h" + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Type definitions +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// File-scope variables +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function definitions +// ----------------------------------------------------------------------------- + + +int main (void) +{ + + + /* Start the scheduler. */ + vTaskStartScheduler(); + + /* Will only get here if there was insufficient memory to create the idle + task. The idle task is created within vTaskStartScheduler(). */ + for( ;; ); + + + return -1; +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/d2/f09a628ba69700171090ed03afc2ec65 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/d2/f09a628ba69700171090ed03afc2ec65 new file mode 100644 index 0000000..42f4f40 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/d2/f09a628ba69700171090ed03afc2ec65 @@ -0,0 +1,109 @@ +// ----------------------------------------------------------------------------- +/// @file freeRTOSFixes.c +/// @brief Description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @file freeRTOSFixes.c +/// @ingroup {group_name} + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + +#include +#include +#include + +#include "freeRTOSFixes.h" + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Type definitions +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// File-scope variables +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function definitions +// ----------------------------------------------------------------------------- + +void _init(void) {return;} + +void OS_logTaskInfo(xTaskHandle taskHandle) +{ + unsigned portBASE_TYPE highWaterMark; + char text[128]; + + snprintf(text, sizeof(text), "Task %s\n", pcTaskGetTaskName(taskHandle)); +// Shell_sendString(text); + + highWaterMark = uxTaskGetStackHighWaterMark(taskHandle); + snprintf(text, sizeof(text), "Stack high water mark : %lu long words\n", highWaterMark); +// Shell_sendString(text); +} + +// Implementation for libc, needed for printf related functions. +caddr_t _sbrk(int incr) +{ + extern char _end; + static char* heap_end; + char* prev_heap_end; + + if(heap_end == 0) + { + heap_end = &_end; + } + + prev_heap_end = heap_end; + heap_end += incr; + return (caddr_t)prev_heap_end; +} + +// Stack overflow hook +void vApplicationStackOverflowHook(xTaskHandle xTask, signed portCHAR* pcTaskName) +{ +// Logger_fatal(FATALCODE_STACKOVERFLOW); +} + +// Malloc failed hook +void vApplicationMallocFailedHook(void) +{ +// Logger_fatal(FATALCODE_MALLOCFAILED); +} + +// Assert for StdPeriph library +void assert_failed(uint8_t* file, uint32_t line) +{ +// Logger_log((char*)file, "", line, LOGTYPE_ERROR, "assert failed"); +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/d4/c20e59089d9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/d4/c20e59089d9400171201ed9ff9474498 new file mode 100644 index 0000000..3ee5e7f --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/d4/c20e59089d9400171201ed9ff9474498 @@ -0,0 +1,172 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* + * Purpose: Lowest level routines for all ColdFire processors. + * + * Notes: + * + * ulPortSetIPL() and mcf5xxx_wr_cacr() copied with permission from FreeScale + * supplied source files. + */ + + .global ulPortSetIPL + .global _ulPortSetIPL + .global mcf5xxx_wr_cacrx + .global _mcf5xxx_wr_cacrx + .global vPortYieldISR + .global _vPortYieldISR + .global vPortStartFirstTask + .global _vPortStartFirstTask + .extern _pxCurrentTCB + .extern _vPortYieldHandler + + .text + +.macro portSAVE_CONTEXT + + lea.l (-60, sp), sp + movem.l d0-a6, (sp) + move.l _pxCurrentTCB, a0 + move.l sp, (a0) + + .endm + +.macro portRESTORE_CONTEXT + + move.l _pxCurrentTCB, a0 + move.l (a0), sp + movem.l (sp), d0-a6 + lea.l (60, sp), sp + rte + + .endm + +/********************************************************************/ +/* + * This routines changes the IPL to the value passed into the routine. + * It also returns the old IPL value back. + * Calling convention from C: + * old_ipl = asm_set_ipl(new_ipl); + * For the Diab Data C compiler, it passes return value thru D0. + * Note that only the least significant three bits of the passed + * value are used. + */ + +ulPortSetIPL: +_ulPortSetIPL: + link A6,#-8 + movem.l D6-D7,(SP) + + move.w SR,D7 /* current sr */ + + move.l D7,D6 /* prepare return value */ + andi.l #0x0700,D6 /* mask out IPL */ + lsr.l #8,D6 /* IPL */ + + andi.l #0x07,D0 /* least significant three bits */ + lsl.l #8,D0 /* move over to make mask */ + + andi.l #0x0000F8FF,D7 /* zero out current IPL */ + or.l D0,D7 /* place new IPL in sr */ + move.w D7,SR + + move.l D6, D0 /* Return value in D0. */ + movem.l (SP),D6-D7 + lea 8(SP),SP + unlk A6 + rts +/********************************************************************/ + +mcf5xxx_wr_cacrx: +_mcf5xxx_wr_cacrx: + move.l 4(sp),d0 + .long 0x4e7b0002 /* movec d0,cacr */ + nop + rts + +/********************************************************************/ + +/* Yield interrupt. */ +_vPortYieldISR: +vPortYieldISR: + portSAVE_CONTEXT + jsr _vPortYieldHandler + portRESTORE_CONTEXT + +/********************************************************************/ + + +vPortStartFirstTask: +_vPortStartFirstTask: + portRESTORE_CONTEXT + + .end + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/d5/f02ad02b9a970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/d5/f02ad02b9a970017138fe0bf747e5677 new file mode 100644 index 0000000..ef7a1ff --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/d5/f02ad02b9a970017138fe0bf747e5677 @@ -0,0 +1,210 @@ +/* +****************************************************************************** +** +** File : LinkerScript.ld +** +** Author : Auto-generated by Ac6 System Workbench +** +** Abstract : Linker script for STM32F107VCTx Device from STM32F1 series +** 64Kbytes RAM +** 256Kbytes ROM +** +** Set heap size, stack size and stack location according +** to application requirements. +** +** Set memory bank area and size if external memory is used. +** +** Target : STMicroelectronics STM32 +** +** Distribution: The file is distributed “as is,” without any warranty +** of any kind. +** +***************************************************************************** +** @attention +** +**

© COPYRIGHT(c) 2017 Ac6

+** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** 1. Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** 3. Neither the name of Ac6 nor the names of its contributors +** may be used to endorse or promote products derived from this software +** without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +***************************************************************************** +*/ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = 0x20010000; /* end of RAM */ + +_Min_Heap_Size = 0; /* required amount of heap */ +_Min_Stack_Size = 0x400; /* required amount of stack */ + +/* Memories definition */ +MEMORY +{ + RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K + ROM (rx) : ORIGIN = 0x8000000, LENGTH = 256K +} + +/* Sections */ +SECTIONS +{ + /* The startup code into ROM memory */ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } >ROM + + /* The program code and other data into ROM memory */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + } >ROM + + /* Constant data into ROM memory*/ + .rodata : + { + . = ALIGN(4); + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + . = ALIGN(4); + } >ROM + + .ARM.extab : { + . = ALIGN(4); + *(.ARM.extab* .gnu.linkonce.armextab.*) + . = ALIGN(4); + } >ROM + + .ARM : { + . = ALIGN(4); + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + . = ALIGN(4); + } >ROM + + .preinit_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + . = ALIGN(4); + } >ROM + + .init_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + . = ALIGN(4); + } >ROM + + .fini_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + . = ALIGN(4); + } >ROM + + /* Used by the startup to initialize data */ + _sidata = LOADADDR(.data); + + /* Initialized data sections into RAM memory */ + .data : + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + } >RAM AT> ROM + + + /* Uninitialized data section into RAM memory */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM + + /* User_heap_stack section, used to check that there is enough RAM left */ + ._user_heap_stack : + { + . = ALIGN(8); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(8); + } >RAM + + + + /* Remove information from the compiler libraries */ +/* /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } +*/ + .ARM.attributes 0 : { *(.ARM.attributes) } + + GROUP( + libgcc.a + libg.a + libc.a + libm.a + libnosys.a + ) +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/d7/c09d56089d9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/d7/c09d56089d9400171201ed9ff9474498 new file mode 100644 index 0000000..e031797 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/d7/c09d56089d9400171201ed9ff9474498 @@ -0,0 +1,354 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* FreeRTOS includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/*-----------------------------------------------------------*/ + +/* Count of the critical section nesting depth. */ +uint32_t ulCriticalNesting = 9999; + +/*-----------------------------------------------------------*/ + +/* Registers required to configure the RTI. */ +#define portRTI_GCTRL_REG ( * ( ( volatile uint32_t * ) 0xFFFFFC00 ) ) +#define portRTI_TBCTRL_REG ( * ( ( volatile uint32_t * ) 0xFFFFFC04 ) ) +#define portRTI_COMPCTRL_REG ( * ( ( volatile uint32_t * ) 0xFFFFFC0C ) ) +#define portRTI_CNT0_FRC0_REG ( * ( ( volatile uint32_t * ) 0xFFFFFC10 ) ) +#define portRTI_CNT0_UC0_REG ( * ( ( volatile uint32_t * ) 0xFFFFFC14 ) ) +#define portRTI_CNT0_CPUC0_REG ( * ( ( volatile uint32_t * ) 0xFFFFFC18 ) ) +#define portRTI_CNT0_COMP0_REG ( * ( ( volatile uint32_t * ) 0xFFFFFC50 ) ) +#define portRTI_CNT0_UDCP0_REG ( * ( ( volatile uint32_t * ) 0xFFFFFC54 ) ) +#define portRTI_SETINTENA_REG ( * ( ( volatile uint32_t * ) 0xFFFFFC80 ) ) +#define portRTI_CLEARINTENA_REG ( * ( ( volatile uint32_t * ) 0xFFFFFC84 ) ) +#define portRTI_INTFLAG_REG ( * ( ( volatile uint32_t * ) 0xFFFFFC88 ) ) + + +/* Constants required to set up the initial stack of each task. */ +#define portINITIAL_SPSR ( ( StackType_t ) 0x1F ) +#define portINITIAL_FPSCR ( ( StackType_t ) 0x00 ) +#define portINSTRUCTION_SIZE ( ( StackType_t ) 0x04 ) +#define portTHUMB_MODE_BIT ( ( StackType_t ) 0x20 ) + +/* The number of words on the stack frame between the saved Top Of Stack and +R0 (in which the parameters are passed. */ +#define portSPACE_BETWEEN_TOS_AND_PARAMETERS ( 12 ) + +/*-----------------------------------------------------------*/ + +/* vPortStartFirstSTask() is defined in portASM.asm */ +extern void vPortStartFirstTask( void ); + +/*-----------------------------------------------------------*/ + +/* Saved as part of the task context. Set to pdFALSE if the task does not +require an FPU context. */ +uint32_t ulTaskHasFPUContext = 0; + +/*-----------------------------------------------------------*/ + + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +StackType_t *pxOriginalTOS; + + pxOriginalTOS = pxTopOfStack; + + #if __TI_VFP_SUPPORT__ + { + /* Ensure the stack is correctly aligned on exit. */ + pxTopOfStack--; + } + #endif + + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. */ + + /* First on the stack is the return address - which is the start of the as + the task has not executed yet. The offset is added to make the return + address appear as it would within an IRQ ISR. */ + *pxTopOfStack = ( StackType_t ) pxCode + portINSTRUCTION_SIZE; + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) 0x00000000; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxOriginalTOS; /* Stack used when task starts goes in R13. */ + pxTopOfStack--; + + #ifdef portPRELOAD_TASK_REGISTERS + { + *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */ + pxTopOfStack--; + } + #else + { + pxTopOfStack -= portSPACE_BETWEEN_TOS_AND_PARAMETERS; + } + #endif + + /* Function parameters are passed in R0. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + + /* Set the status register for system mode, with interrupts enabled. */ + *pxTopOfStack = ( StackType_t ) ( ( _get_CPSR() & ~0xFF ) | portINITIAL_SPSR ); + + if( ( ( uint32_t ) pxCode & 0x01UL ) != 0x00 ) + { + /* The task will start in thumb mode. */ + *pxTopOfStack |= portTHUMB_MODE_BIT; + } + + #ifdef __TI_VFP_SUPPORT__ + { + pxTopOfStack--; + + /* The last thing on the stack is the tasks ulUsingFPU value, which by + default is set to indicate that the stack frame does not include FPU + registers. */ + *pxTopOfStack = pdFALSE; + } + #endif + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt(void) +{ + /* Disable timer 0. */ + portRTI_GCTRL_REG &= 0xFFFFFFFEUL; + + /* Use the internal counter. */ + portRTI_TBCTRL_REG = 0x00000000U; + + /* COMPSEL0 will use the RTIFRC0 counter. */ + portRTI_COMPCTRL_REG = 0x00000000U; + + /* Initialise the counter and the prescale counter registers. */ + portRTI_CNT0_UC0_REG = 0x00000000U; + portRTI_CNT0_FRC0_REG = 0x00000000U; + + /* Set Prescalar for RTI clock. */ + portRTI_CNT0_CPUC0_REG = 0x00000001U; + portRTI_CNT0_COMP0_REG = ( configCPU_CLOCK_HZ / 2 ) / configTICK_RATE_HZ; + portRTI_CNT0_UDCP0_REG = ( configCPU_CLOCK_HZ / 2 ) / configTICK_RATE_HZ; + + /* Clear interrupts. */ + portRTI_INTFLAG_REG = 0x0007000FU; + portRTI_CLEARINTENA_REG = 0x00070F0FU; + + /* Enable the compare 0 interrupt. */ + portRTI_SETINTENA_REG = 0x00000001U; + portRTI_GCTRL_REG |= 0x00000001U; +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler(void) +{ + /* Start the timer that generates the tick ISR. */ + prvSetupTimerInterrupt(); + + /* Reset the critical section nesting count read to execute the first task. */ + ulCriticalNesting = 0; + + /* Start the first task. This is done from portASM.asm as ARM mode must be + used. */ + vPortStartFirstTask(); + + /* Should not get here! */ + return pdFAIL; +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +void vPortEndScheduler(void) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( ulCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +#if configUSE_PREEMPTION == 0 + + /* The cooperative scheduler requires a normal IRQ service routine to + * simply increment the system tick. */ + __interrupt void vPortNonPreemptiveTick( void ) + { + /* clear clock interrupt flag */ + portRTI_INTFLAG_REG = 0x00000001; + + /* Increment the tick count - this may make a delaying task ready + to run - but a context switch is not performed. */ + xTaskIncrementTick(); + } + + #else + + /* + ************************************************************************** + * The preemptive scheduler ISR is written in assembler and can be found + * in the portASM.asm file. This will only get used if portUSE_PREEMPTION + * is set to 1 in portmacro.h + ************************************************************************** + */ + void vPortPreemptiveTick( void ); + +#endif +/*-----------------------------------------------------------*/ + + +/* + * Disable interrupts, and keep a count of the nesting depth. + */ +void vPortEnterCritical( void ) +{ + /* Disable interrupts as per portDISABLE_INTERRUPTS(); */ + portDISABLE_INTERRUPTS(); + + /* Now interrupts are disabled ulCriticalNesting can be accessed + directly. Increment ulCriticalNesting to keep a count of how many times + portENTER_CRITICAL() has been called. */ + ulCriticalNesting++; +} +/*-----------------------------------------------------------*/ + +/* + * Decrement the critical nesting count, and if it has reached zero, re-enable + * interrupts. + */ +void vPortExitCritical( void ) +{ + if( ulCriticalNesting > 0 ) + { + /* Decrement the nesting count as we are leaving a critical section. */ + ulCriticalNesting--; + + /* If the nesting level has reached zero then interrupts should be + re-enabled. */ + if( ulCriticalNesting == 0 ) + { + /* Enable interrupts as per portENABLE_INTERRUPTS(). */ + portENABLE_INTERRUPTS(); + } + } +} +/*-----------------------------------------------------------*/ + +#if __TI_VFP_SUPPORT__ + + void vPortTaskUsesFPU( void ) + { + extern void vPortInitialiseFPSCR( void ); + + /* A task is registering the fact that it needs an FPU context. Set the + FPU flag (saved as part of the task context. */ + ulTaskHasFPUContext = pdTRUE; + + /* Initialise the floating point status register. */ + vPortInitialiseFPSCR(); + } + +#endif /* __TI_VFP_SUPPORT__ */ + +/*-----------------------------------------------------------*/ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/d8/c0ac43e895970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/d8/c0ac43e895970017138fe0bf747e5677 new file mode 100644 index 0000000..969aa74 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/d8/c0ac43e895970017138fe0bf747e5677 @@ -0,0 +1,134 @@ +ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +heap_4.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +STM32_CORE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) \ +-I$(STM32_CORE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -fno-common -mcpu=cortex-m3 -mthumb $(RELEASE_DEFINES) $(INCLUDES) +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -nostartfiles -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map +release: export LDARCHIVES := -L. -L$(STM32_STDPERIPH_ROOT) -lSTM_StdPeriph +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -f hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + rm -rf obj_release + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +else + +vpath %.c \ +src \ +startup \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport + +vpath %.s \ +startup +vpath %.o \ +obj_release + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) $(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)/$@ + +$(OBJ_DIR): + mkdir -p $@ + +endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/db/d044619f96970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/db/d044619f96970017138fe0bf747e5677 new file mode 100644 index 0000000..caa07da --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/db/d044619f96970017138fe0bf747e5677 @@ -0,0 +1,134 @@ +ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +heap_3.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +STM32_CORE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) \ +-I$(STM32_CORE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -fno-common -mcpu=cortex-m3 -mthumb $(RELEASE_DEFINES) $(INCLUDES) +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -nostartfiles -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map +release: export LDARCHIVES := -L. -L$(STM32_STDPERIPH_ROOT) -lSTM_StdPeriph -lhsb_mrts_release +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -f hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + rm -rf obj_release + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +else + +vpath %.c \ +src \ +startup \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport + +vpath %.s \ +startup +vpath %.o \ +obj_release + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) $(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)/$@ + +$(OBJ_DIR): + mkdir -p $@ + +endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/db/e0d22d93cf96001713a7ede92b37d6f1 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/db/e0d22d93cf96001713a7ede92b37d6f1 new file mode 100644 index 0000000..9a2f675 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/db/e0d22d93cf96001713a7ede92b37d6f1 @@ -0,0 +1,68 @@ +# STM support library + +STM32_STDPERIPH_INC = Libraries/STM32F10x_StdPeriph_Driver/inc/ +CORE_DIR = Libraries/CMSIS/CM3/CoreSupport/ +DEVICE_SUPPORT_DIR = Libraries/CMSIS/CM3/DrviceSupport/ST/STM32F10x + +SRC_DIR = Libraries/STM32F10x_StdPeriph_Driver/src/ + +INCLUDE_DIRS = \ +-I$(STM32_STDPERIPH_INC) \ +#-I$(CIRE_DIR) \ +#-I$(DEVICE_SUPPORT_DIR) \ + +OBJ_DIR = Libraries/STM32F10x_StdPeriph_Driver/obj + +CROSS_COMPILE = arm-none-eabi- + +CC = $(CROSS_COMPILE)gcc +CCFLAGS = -c -O2 -g -fno-common -mcpu=cortex-m3 -mthumb -DUSE_FULL_ASSERT $(INCLUDE_DIRS) -I. -Wall -Werror -D"assert_param(expr)=((void)0)" + +AR = $(CROSS_COMPILE)ar +ARFLAGS = rs + +OBJECTS = \ +misc.o \ +stm32f10x_adc.o \ +stm32f10x_bkp.o \ +stm32f10x_can.o \ +stm32f10x_cec.o \ +stm32f10x_crc.o \ +stm32f10x_dac.o \ +stm32f10x_dbgmcu.o \ +stm32f10x_dma.o \ +stm32f10x_exti.o \ +stm32f10x_flash.o \ +stm32f10x_fsmc.o \ +stm32f10x_gpio.o \ +stm32f10x_i2c.o \ +stm32f10x_iwdg.o \ +stm32f10x_pwr.o \ +stm32f10x_rcc.o \ +stm32f10x_rtc.o \ +stm32f10x_sdio.o \ +stm32f10x_spi.o \ +stm32f10x_tim.o \ +stm32f10x_usart.o \ +stm32f10x_wwdg.o + +LIBRARY = libSTM_StdPeriph.a + +vpath %.c $(SRC_DIR) +vpath %.o $(OBJ_DIR) + +all: $(LIBRARY) + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +clean: + rm -rf $(LIBRARY) $(OBJ_DIR) + +$(OBJ_DIR): + mkdir -p $@ + +.PHONY: all clean diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/dc/b0c95d089d9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/dc/b0c95d089d9400171201ed9ff9474498 new file mode 100644 index 0000000..8a5115b --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/dc/b0c95d089d9400171201ed9ff9474498 @@ -0,0 +1,1140 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* + * Implementation of the wrapper functions used to raise the processor privilege + * before calling a standard FreeRTOS API function. + */ + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining +all the API functions to use the MPU wrappers. That should only be done when +task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "timers.h" +#include "event_groups.h" +#include "mpu_prototypes.h" + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* + * Checks to see if being called from the context of an unprivileged task, and + * if so raises the privilege level and returns false - otherwise does nothing + * other than return true. + */ +extern BaseType_t xPortRaisePrivilege( void ); + +/*-----------------------------------------------------------*/ + +BaseType_t MPU_xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition, TaskHandle_t *pxCreatedTask ) +{ +BaseType_t xReturn; +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xTaskCreateRestricted( pxTaskDefinition, pxCreatedTask ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; +} +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + BaseType_t MPU_xTaskCreate( TaskFunction_t pvTaskCode, const char * const pcName, uint16_t usStackDepth, void *pvParameters, UBaseType_t uxPriority, TaskHandle_t *pxCreatedTask ) + { + BaseType_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xTaskCreate( pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pxCreatedTask ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; + } +#endif /* configSUPPORT_DYNAMIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + TaskHandle_t MPU_xTaskCreateStatic( TaskFunction_t pxTaskCode, const char * const pcName, const uint32_t ulStackDepth, void * const pvParameters, UBaseType_t uxPriority, StackType_t * const puxStackBuffer, StaticTask_t * const pxTaskBuffer ) + { + TaskHandle_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xTaskCreateStatic( pxTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, puxStackBuffer, pxTaskBuffer ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; + } +#endif /* configSUPPORT_STATIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +void MPU_vTaskAllocateMPURegions( TaskHandle_t xTask, const MemoryRegion_t * const xRegions ) +{ +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + vTaskAllocateMPURegions( xTask, xRegions ); + vPortResetPrivilege( xRunningPrivileged ); +} +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskDelete == 1 ) + void MPU_vTaskDelete( TaskHandle_t pxTaskToDelete ) + { + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + vTaskDelete( pxTaskToDelete ); + vPortResetPrivilege( xRunningPrivileged ); + } +#endif +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskDelayUntil == 1 ) + void MPU_vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, TickType_t xTimeIncrement ) + { + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + vTaskDelayUntil( pxPreviousWakeTime, xTimeIncrement ); + vPortResetPrivilege( xRunningPrivileged ); + } +#endif +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_xTaskAbortDelay == 1 ) + BaseType_t MPU_xTaskAbortDelay( TaskHandle_t xTask ) + { + BaseType_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xTaskAbortDelay( xTask ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskDelay == 1 ) + void MPU_vTaskDelay( TickType_t xTicksToDelay ) + { + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + vTaskDelay( xTicksToDelay ); + vPortResetPrivilege( xRunningPrivileged ); + } +#endif +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_uxTaskPriorityGet == 1 ) + UBaseType_t MPU_uxTaskPriorityGet( TaskHandle_t pxTask ) + { + UBaseType_t uxReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + uxReturn = uxTaskPriorityGet( pxTask ); + vPortResetPrivilege( xRunningPrivileged ); + return uxReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskPrioritySet == 1 ) + void MPU_vTaskPrioritySet( TaskHandle_t pxTask, UBaseType_t uxNewPriority ) + { + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + vTaskPrioritySet( pxTask, uxNewPriority ); + vPortResetPrivilege( xRunningPrivileged ); + } +#endif +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_eTaskGetState == 1 ) + eTaskState MPU_eTaskGetState( TaskHandle_t pxTask ) + { + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + eTaskState eReturn; + + eReturn = eTaskGetState( pxTask ); + vPortResetPrivilege( xRunningPrivileged ); + return eReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if( configUSE_TRACE_FACILITY == 1 ) + void MPU_vTaskGetInfo( TaskHandle_t xTask, TaskStatus_t *pxTaskStatus, BaseType_t xGetFreeStackSpace, eTaskState eState ) + { + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + vTaskGetInfo( xTask, pxTaskStatus, xGetFreeStackSpace, eState ); + vPortResetPrivilege( xRunningPrivileged ); + } +#endif +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) + TaskHandle_t MPU_xTaskGetIdleTaskHandle( void ) + { + TaskHandle_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xTaskGetIdleTaskHandle(); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskSuspend == 1 ) + void MPU_vTaskSuspend( TaskHandle_t pxTaskToSuspend ) + { + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + vTaskSuspend( pxTaskToSuspend ); + vPortResetPrivilege( xRunningPrivileged ); + } +#endif +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskSuspend == 1 ) + void MPU_vTaskResume( TaskHandle_t pxTaskToResume ) + { + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + vTaskResume( pxTaskToResume ); + vPortResetPrivilege( xRunningPrivileged ); + } +#endif +/*-----------------------------------------------------------*/ + +void MPU_vTaskSuspendAll( void ) +{ +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + vTaskSuspendAll(); + vPortResetPrivilege( xRunningPrivileged ); +} +/*-----------------------------------------------------------*/ + +BaseType_t MPU_xTaskResumeAll( void ) +{ +BaseType_t xReturn; +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xTaskResumeAll(); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; +} +/*-----------------------------------------------------------*/ + +TickType_t MPU_xTaskGetTickCount( void ) +{ +TickType_t xReturn; +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xTaskGetTickCount(); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; +} +/*-----------------------------------------------------------*/ + +UBaseType_t MPU_uxTaskGetNumberOfTasks( void ) +{ +UBaseType_t uxReturn; +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + uxReturn = uxTaskGetNumberOfTasks(); + vPortResetPrivilege( xRunningPrivileged ); + return uxReturn; +} +/*-----------------------------------------------------------*/ + +char * MPU_pcTaskGetName( TaskHandle_t xTaskToQuery ) +{ +char *pcReturn; +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + pcReturn = pcTaskGetName( xTaskToQuery ); + vPortResetPrivilege( xRunningPrivileged ); + return pcReturn; +} +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_xTaskGetHandle == 1 ) + TaskHandle_t MPU_xTaskGetHandle( const char *pcNameToQuery ) + { + TaskHandle_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xTaskGetHandle( pcNameToQuery ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) + void MPU_vTaskList( char *pcWriteBuffer ) + { + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + vTaskList( pcWriteBuffer ); + vPortResetPrivilege( xRunningPrivileged ); + } +#endif +/*-----------------------------------------------------------*/ + +#if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) + void MPU_vTaskGetRunTimeStats( char *pcWriteBuffer ) + { + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + vTaskGetRunTimeStats( pcWriteBuffer ); + vPortResetPrivilege( xRunningPrivileged ); + } +#endif +/*-----------------------------------------------------------*/ + +#if ( configUSE_APPLICATION_TASK_TAG == 1 ) + void MPU_vTaskSetApplicationTaskTag( TaskHandle_t xTask, TaskHookFunction_t pxTagValue ) + { + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + vTaskSetApplicationTaskTag( xTask, pxTagValue ); + vPortResetPrivilege( xRunningPrivileged ); + } +#endif +/*-----------------------------------------------------------*/ + +#if ( configUSE_APPLICATION_TASK_TAG == 1 ) + TaskHookFunction_t MPU_xTaskGetApplicationTaskTag( TaskHandle_t xTask ) + { + TaskHookFunction_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xTaskGetApplicationTaskTag( xTask ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 ) + void MPU_vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet, BaseType_t xIndex, void *pvValue ) + { + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + vTaskSetThreadLocalStoragePointer( xTaskToSet, xIndex, pvValue ); + vPortResetPrivilege( xRunningPrivileged ); + } +#endif +/*-----------------------------------------------------------*/ + +#if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 ) + void *MPU_pvTaskGetThreadLocalStoragePointer( TaskHandle_t xTaskToQuery, BaseType_t xIndex ) + { + void *pvReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + pvReturn = pvTaskGetThreadLocalStoragePointer( xTaskToQuery, xIndex ); + vPortResetPrivilege( xRunningPrivileged ); + return pvReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if ( configUSE_APPLICATION_TASK_TAG == 1 ) + BaseType_t MPU_xTaskCallApplicationTaskHook( TaskHandle_t xTask, void *pvParameter ) + { + BaseType_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xTaskCallApplicationTaskHook( xTask, pvParameter ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t MPU_uxTaskGetSystemState( TaskStatus_t *pxTaskStatusArray, UBaseType_t uxArraySize, uint32_t *pulTotalRunTime ) + { + UBaseType_t uxReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + uxReturn = uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, pulTotalRunTime ); + vPortResetPrivilege( xRunningPrivileged ); + return uxReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) + UBaseType_t MPU_uxTaskGetStackHighWaterMark( TaskHandle_t xTask ) + { + UBaseType_t uxReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + uxReturn = uxTaskGetStackHighWaterMark( xTask ); + vPortResetPrivilege( xRunningPrivileged ); + return uxReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_xTaskGetCurrentTaskHandle == 1 ) + TaskHandle_t MPU_xTaskGetCurrentTaskHandle( void ) + { + TaskHandle_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xTaskGetCurrentTaskHandle(); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_xTaskGetSchedulerState == 1 ) + BaseType_t MPU_xTaskGetSchedulerState( void ) + { + BaseType_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xTaskGetSchedulerState(); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +void MPU_vTaskSetTimeOutState( TimeOut_t * const pxTimeOut ) +{ +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + vTaskSetTimeOutState( pxTimeOut ); + vPortResetPrivilege( xRunningPrivileged ); +} +/*-----------------------------------------------------------*/ + +BaseType_t MPU_xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, TickType_t * const pxTicksToWait ) +{ +BaseType_t xReturn; +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xTaskCheckForTimeOut( pxTimeOut, pxTicksToWait ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; +} +/*-----------------------------------------------------------*/ + +#if( configUSE_TASK_NOTIFICATIONS == 1 ) + BaseType_t MPU_xTaskGenericNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue ) + { + BaseType_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xTaskGenericNotify( xTaskToNotify, ulValue, eAction, pulPreviousNotificationValue ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if( configUSE_TASK_NOTIFICATIONS == 1 ) + BaseType_t MPU_xTaskNotifyWait( uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, uint32_t *pulNotificationValue, TickType_t xTicksToWait ) + { + BaseType_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xTaskNotifyWait( ulBitsToClearOnEntry, ulBitsToClearOnExit, pulNotificationValue, xTicksToWait ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if( configUSE_TASK_NOTIFICATIONS == 1 ) + uint32_t MPU_ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait ) + { + uint32_t ulReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + ulReturn = ulTaskNotifyTake( xClearCountOnExit, xTicksToWait ); + vPortResetPrivilege( xRunningPrivileged ); + return ulReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if( configUSE_TASK_NOTIFICATIONS == 1 ) + BaseType_t MPU_xTaskNotifyStateClear( TaskHandle_t xTask ) + { + BaseType_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xTaskNotifyStateClear( xTask ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + QueueHandle_t MPU_xQueueGenericCreate( UBaseType_t uxQueueLength, UBaseType_t uxItemSize, uint8_t ucQueueType ) + { + QueueHandle_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xQueueGenericCreate( uxQueueLength, uxItemSize, ucQueueType ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + QueueHandle_t MPU_xQueueGenericCreateStatic( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, uint8_t *pucQueueStorage, StaticQueue_t *pxStaticQueue, const uint8_t ucQueueType ) + { + QueueHandle_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xQueueGenericCreateStatic( uxQueueLength, uxItemSize, pucQueueStorage, pxStaticQueue, ucQueueType ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +BaseType_t MPU_xQueueGenericReset( QueueHandle_t pxQueue, BaseType_t xNewQueue ) +{ +BaseType_t xReturn; +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xQueueGenericReset( pxQueue, xNewQueue ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t MPU_xQueueGenericSend( QueueHandle_t xQueue, const void * const pvItemToQueue, TickType_t xTicksToWait, BaseType_t xCopyPosition ) +{ +BaseType_t xReturn; +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xQueueGenericSend( xQueue, pvItemToQueue, xTicksToWait, xCopyPosition ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; +} +/*-----------------------------------------------------------*/ + +UBaseType_t MPU_uxQueueMessagesWaiting( const QueueHandle_t pxQueue ) +{ +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); +UBaseType_t uxReturn; + + uxReturn = uxQueueMessagesWaiting( pxQueue ); + vPortResetPrivilege( xRunningPrivileged ); + return uxReturn; +} +/*-----------------------------------------------------------*/ + +UBaseType_t MPU_uxQueueSpacesAvailable( const QueueHandle_t xQueue ) +{ +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); +UBaseType_t uxReturn; + + uxReturn = uxQueueSpacesAvailable( xQueue ); + vPortResetPrivilege( xRunningPrivileged ); + return uxReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t MPU_xQueueGenericReceive( QueueHandle_t pxQueue, void * const pvBuffer, TickType_t xTicksToWait, BaseType_t xJustPeeking ) +{ +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); +BaseType_t xReturn; + + xReturn = xQueueGenericReceive( pxQueue, pvBuffer, xTicksToWait, xJustPeeking ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t MPU_xQueuePeekFromISR( QueueHandle_t pxQueue, void * const pvBuffer ) +{ +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); +BaseType_t xReturn; + + xReturn = xQueuePeekFromISR( pxQueue, pvBuffer ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; +} +/*-----------------------------------------------------------*/ + +void* MPU_xQueueGetMutexHolder( QueueHandle_t xSemaphore ) +{ +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); +void * xReturn; + + xReturn = ( void * ) xQueueGetMutexHolder( xSemaphore ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; +} +/*-----------------------------------------------------------*/ + +#if( ( configUSE_MUTEXES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + QueueHandle_t MPU_xQueueCreateMutex( const uint8_t ucQueueType ) + { + QueueHandle_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xQueueCreateMutex( ucQueueType ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if( ( configUSE_MUTEXES == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + QueueHandle_t MPU_xQueueCreateMutexStatic( const uint8_t ucQueueType, StaticQueue_t *pxStaticQueue ) + { + QueueHandle_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xQueueCreateMutexStatic( ucQueueType, pxStaticQueue ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + QueueHandle_t MPU_xQueueCreateCountingSemaphore( UBaseType_t uxCountValue, UBaseType_t uxInitialCount ) + { + QueueHandle_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xQueueCreateCountingSemaphore( uxCountValue, uxInitialCount ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + + QueueHandle_t MPU_xQueueCreateCountingSemaphoreStatic( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount, StaticQueue_t *pxStaticQueue ) + { + QueueHandle_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xQueueCreateCountingSemaphoreStatic( uxMaxCount, uxInitialCount, pxStaticQueue ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if ( configUSE_MUTEXES == 1 ) + BaseType_t MPU_xQueueTakeMutexRecursive( QueueHandle_t xMutex, TickType_t xBlockTime ) + { + BaseType_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xQueueTakeMutexRecursive( xMutex, xBlockTime ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if ( configUSE_MUTEXES == 1 ) + BaseType_t MPU_xQueueGiveMutexRecursive( QueueHandle_t xMutex ) + { + BaseType_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xQueueGiveMutexRecursive( xMutex ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if ( configUSE_QUEUE_SETS == 1 ) + QueueSetHandle_t MPU_xQueueCreateSet( UBaseType_t uxEventQueueLength ) + { + QueueSetHandle_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xQueueCreateSet( uxEventQueueLength ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if ( configUSE_QUEUE_SETS == 1 ) + QueueSetMemberHandle_t MPU_xQueueSelectFromSet( QueueSetHandle_t xQueueSet, TickType_t xBlockTimeTicks ) + { + QueueSetMemberHandle_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xQueueSelectFromSet( xQueueSet, xBlockTimeTicks ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if ( configUSE_QUEUE_SETS == 1 ) + BaseType_t MPU_xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet ) + { + BaseType_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xQueueAddToSet( xQueueOrSemaphore, xQueueSet ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if ( configUSE_QUEUE_SETS == 1 ) + BaseType_t MPU_xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet ) + { + BaseType_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xQueueRemoveFromSet( xQueueOrSemaphore, xQueueSet ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if configQUEUE_REGISTRY_SIZE > 0 + void MPU_vQueueAddToRegistry( QueueHandle_t xQueue, const char *pcName ) + { + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + vQueueAddToRegistry( xQueue, pcName ); + + vPortResetPrivilege( xRunningPrivileged ); + } +#endif +/*-----------------------------------------------------------*/ + +#if configQUEUE_REGISTRY_SIZE > 0 + void MPU_vQueueUnregisterQueue( QueueHandle_t xQueue ) + { + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + vQueueUnregisterQueue( xQueue ); + + vPortResetPrivilege( xRunningPrivileged ); + } +#endif +/*-----------------------------------------------------------*/ + +#if configQUEUE_REGISTRY_SIZE > 0 + const char *MPU_pcQueueGetName( QueueHandle_t xQueue ) + { + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + const char *pcReturn; + + pcReturn = pcQueueGetName( xQueue ); + + vPortResetPrivilege( xRunningPrivileged ); + return pcReturn; + } +#endif +/*-----------------------------------------------------------*/ + +void MPU_vQueueDelete( QueueHandle_t xQueue ) +{ +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + vQueueDelete( xQueue ); + + vPortResetPrivilege( xRunningPrivileged ); +} +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + + void *MPU_pvPortMalloc( size_t xSize ) + { + void *pvReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + pvReturn = pvPortMalloc( xSize ); + + vPortResetPrivilege( xRunningPrivileged ); + + return pvReturn; + } + +#endif /* configSUPPORT_DYNAMIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + + void MPU_vPortFree( void *pv ) + { + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + vPortFree( pv ); + + vPortResetPrivilege( xRunningPrivileged ); + } + +#endif /* configSUPPORT_DYNAMIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +void MPU_vPortInitialiseBlocks( void ) +{ +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + vPortInitialiseBlocks(); + + vPortResetPrivilege( xRunningPrivileged ); +} +/*-----------------------------------------------------------*/ + +size_t MPU_xPortGetFreeHeapSize( void ) +{ +size_t xReturn; +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xPortGetFreeHeapSize(); + + vPortResetPrivilege( xRunningPrivileged ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +#if( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configUSE_TIMERS == 1 ) ) + TimerHandle_t MPU_xTimerCreate( const char * const pcTimerName, const TickType_t xTimerPeriodInTicks, const UBaseType_t uxAutoReload, void * const pvTimerID, TimerCallbackFunction_t pxCallbackFunction ) + { + TimerHandle_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xTimerCreate( pcTimerName, xTimerPeriodInTicks, uxAutoReload, pvTimerID, pxCallbackFunction ); + vPortResetPrivilege( xRunningPrivileged ); + + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configUSE_TIMERS == 1 ) ) + TimerHandle_t MPU_xTimerCreateStatic( const char * const pcTimerName, const TickType_t xTimerPeriodInTicks, const UBaseType_t uxAutoReload, void * const pvTimerID, TimerCallbackFunction_t pxCallbackFunction, StaticTimer_t *pxTimerBuffer ) + { + TimerHandle_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xTimerCreateStatic( pcTimerName, xTimerPeriodInTicks, uxAutoReload, pvTimerID, pxCallbackFunction, pxTimerBuffer ); + vPortResetPrivilege( xRunningPrivileged ); + + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if( configUSE_TIMERS == 1 ) + void *MPU_pvTimerGetTimerID( const TimerHandle_t xTimer ) + { + void * pvReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + pvReturn = pvTimerGetTimerID( xTimer ); + vPortResetPrivilege( xRunningPrivileged ); + + return pvReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if( configUSE_TIMERS == 1 ) + void MPU_vTimerSetTimerID( TimerHandle_t xTimer, void *pvNewID ) + { + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + vTimerSetTimerID( xTimer, pvNewID ); + vPortResetPrivilege( xRunningPrivileged ); + } +#endif +/*-----------------------------------------------------------*/ + +#if( configUSE_TIMERS == 1 ) + BaseType_t MPU_xTimerIsTimerActive( TimerHandle_t xTimer ) + { + BaseType_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xTimerIsTimerActive( xTimer ); + vPortResetPrivilege( xRunningPrivileged ); + + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if( configUSE_TIMERS == 1 ) + TaskHandle_t MPU_xTimerGetTimerDaemonTaskHandle( void ) + { + TaskHandle_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xTimerGetTimerDaemonTaskHandle(); + vPortResetPrivilege( xRunningPrivileged ); + + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if( ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 1 ) ) + BaseType_t MPU_xTimerPendFunctionCall( PendedFunction_t xFunctionToPend, void *pvParameter1, uint32_t ulParameter2, TickType_t xTicksToWait ) + { + BaseType_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xTimerPendFunctionCall( xFunctionToPend, pvParameter1, ulParameter2, xTicksToWait ); + vPortResetPrivilege( xRunningPrivileged ); + + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if( configUSE_TIMERS == 1 ) + const char * MPU_pcTimerGetName( TimerHandle_t xTimer ) + { + const char * pcReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + pcReturn = pcTimerGetName( xTimer ); + vPortResetPrivilege( xRunningPrivileged ); + + return pcReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if( configUSE_TIMERS == 1 ) + TickType_t MPU_xTimerGetPeriod( TimerHandle_t xTimer ) + { + TickType_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xTimerGetPeriod( xTimer ); + vPortResetPrivilege( xRunningPrivileged ); + + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if( configUSE_TIMERS == 1 ) + TickType_t MPU_xTimerGetExpiryTime( TimerHandle_t xTimer ) + { + TickType_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xTimerGetExpiryTime( xTimer ); + vPortResetPrivilege( xRunningPrivileged ); + + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if( configUSE_TIMERS == 1 ) + BaseType_t MPU_xTimerGenericCommand( TimerHandle_t xTimer, const BaseType_t xCommandID, const TickType_t xOptionalValue, BaseType_t * const pxHigherPriorityTaskWoken, const TickType_t xTicksToWait ) + { + BaseType_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xTimerGenericCommand( xTimer, xCommandID, xOptionalValue, pxHigherPriorityTaskWoken, xTicksToWait ); + vPortResetPrivilege( xRunningPrivileged ); + + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + EventGroupHandle_t MPU_xEventGroupCreate( void ) + { + EventGroupHandle_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xEventGroupCreate(); + vPortResetPrivilege( xRunningPrivileged ); + + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + EventGroupHandle_t MPU_xEventGroupCreateStatic( StaticEventGroup_t *pxEventGroupBuffer ) + { + EventGroupHandle_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xEventGroupCreateStatic( pxEventGroupBuffer ); + vPortResetPrivilege( xRunningPrivileged ); + + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +EventBits_t MPU_xEventGroupWaitBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToWaitFor, const BaseType_t xClearOnExit, const BaseType_t xWaitForAllBits, TickType_t xTicksToWait ) +{ +EventBits_t xReturn; +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xEventGroupWaitBits( xEventGroup, uxBitsToWaitFor, xClearOnExit, xWaitForAllBits, xTicksToWait ); + vPortResetPrivilege( xRunningPrivileged ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +EventBits_t MPU_xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear ) +{ +EventBits_t xReturn; +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xEventGroupClearBits( xEventGroup, uxBitsToClear ); + vPortResetPrivilege( xRunningPrivileged ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +EventBits_t MPU_xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet ) +{ +EventBits_t xReturn; +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xEventGroupSetBits( xEventGroup, uxBitsToSet ); + vPortResetPrivilege( xRunningPrivileged ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +EventBits_t MPU_xEventGroupSync( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, const EventBits_t uxBitsToWaitFor, TickType_t xTicksToWait ) +{ +EventBits_t xReturn; +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xEventGroupSync( xEventGroup, uxBitsToSet, uxBitsToWaitFor, xTicksToWait ); + vPortResetPrivilege( xRunningPrivileged ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +void MPU_vEventGroupDelete( EventGroupHandle_t xEventGroup ) +{ +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + vEventGroupDelete( xEventGroup ); + vPortResetPrivilege( xRunningPrivileged ); +} +/*-----------------------------------------------------------*/ + + + + + +/* Functions that the application writer wants to execute in privileged mode +can be defined in application_defined_privileged_functions.h. The functions +must take the same format as those above whereby the privilege state on exit +equals the privilege state on entry. For example: + +void MPU_FunctionName( [parameters ] ) +{ +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + FunctionName( [parameters ] ); + + vPortResetPrivilege( xRunningPrivileged ); +} +*/ + +#if configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS == 1 + #include "application_defined_privileged_functions.h" +#endif diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/de/a1f564089d9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/de/a1f564089d9400171201ed9ff9474498 new file mode 100644 index 0000000..81a4146 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/de/a1f564089d9400171201ed9ff9474498 @@ -0,0 +1,177 @@ +;/* +; FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. +; All rights reserved +; +; +; *************************************************************************** +; * * +; * FreeRTOS tutorial books are available in pdf and paperback. * +; * Complete, revised, and edited pdf reference manuals are also * +; * available. * +; * * +; * Purchasing FreeRTOS documentation will not only help you, by * +; * ensuring you get running as quickly as possible and with an * +; * in-depth knowledge of how to use FreeRTOS, it will also help * +; * the FreeRTOS project to continue with its mission of providing * +; * professional grade, cross platform, de facto standard solutions * +; * for microcontrollers - completely free of charge! * +; * * +; * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * +; * * +; * Thank you for using FreeRTOS, and thank you for your support! * +; * * +; *************************************************************************** +; +; +; This file is part of the FreeRTOS distribution. +; +; FreeRTOS is free software; you can redistribute it and/or modify it under +; the terms of the GNU General Public License (version 2) as published by the +; Free Software Foundation AND MODIFIED BY the FreeRTOS exception. +; >>>NOTE<<< The modification to the GPL is included to allow you to +; distribute a combined work that includes FreeRTOS without being obliged to +; provide the source code for proprietary components outside of the FreeRTOS +; kernel. FreeRTOS is distributed in the hope that it will be useful, but +; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +; more details. You should have received a copy of the GNU General Public +; License and the FreeRTOS license exception along with FreeRTOS; if not it +; can be viewed here: http://www.freertos.org/a00114.html and also obtained +; by writing to Richard Barry, contact details for whom are available on the +; FreeRTOS WEB site. +; +; 1 tab == 4 spaces! +; +; http://www.FreeRTOS.org - Documentation, latest information, license and +; contact details. +; +; http://www.SafeRTOS.com - A version that is certified for use in safety +; critical systems. +; +; http://www.OpenRTOS.com - Commercial support, development, porting, +; licensing and training services. +;*/ + + .import _pxCurrentTCB + .import _vTaskSwitchContext + .import _xTaskIncrementTick + + .export _vPortStartFirstTask + .export _ulPortGetGBR + .export _vPortYieldHandler + .export _vPortPreemptiveTick + .export _vPortCooperativeTick + .export _vPortSaveFlopRegisters + .export _vPortRestoreFlopRegisters + + .section P + + .INCLUDE "ISR_Support.inc" + +_vPortStartFirstTask: + + portRESTORE_CONTEXT + +;----------------------------------------------------------- + +_vPortYieldHandler: + + portSAVE_CONTEXT + + mov.l #_vTaskSwitchContext, r0 + jsr @r0 + nop + + portRESTORE_CONTEXT + +;----------------------------------------------------------- + +_vPortPreemptiveTick + + portSAVE_CONTEXT + + mov.l #_xTaskIncrementTick, r0 + jsr @r0 + nop + + mov.l #_vTaskSwitchContext, r0 + jsr @r0 + nop + + portRESTORE_CONTEXT + +;----------------------------------------------------------- + +_vPortCooperativeTick + + portSAVE_CONTEXT + + mov.l #_xTaskIncrementTick, r0 + jsr @r0 + nop + + portRESTORE_CONTEXT + +;----------------------------------------------------------- + +_ulPortGetGBR: + + stc.l gbr, r0 + rts + nop + +;----------------------------------------------------------- + +_vPortSaveFlopRegisters: + + fmov.s fr0, @-r4 + fmov.s fr1, @-r4 + fmov.s fr2, @-r4 + fmov.s fr3, @-r4 + fmov.s fr4, @-r4 + fmov.s fr5, @-r4 + fmov.s fr6, @-r4 + fmov.s fr7, @-r4 + fmov.s fr8, @-r4 + fmov.s fr9, @-r4 + fmov.s fr10, @-r4 + fmov.s fr11, @-r4 + fmov.s fr12, @-r4 + fmov.s fr13, @-r4 + fmov.s fr14, @-r4 + fmov.s fr15, @-r4 + sts.l fpul, @-r4 + sts.l fpscr, @-r4 + + rts + nop + +;----------------------------------------------------------- + +_vPortRestoreFlopRegisters: + + add.l #-72, r4 + lds.l @r4+, fpscr + lds.l @r4+, fpul + fmov.s @r4+, fr15 + fmov.s @r4+, fr14 + fmov.s @r4+, fr13 + fmov.s @r4+, fr12 + fmov.s @r4+, fr11 + fmov.s @r4+, fr10 + fmov.s @r4+, fr9 + fmov.s @r4+, fr8 + fmov.s @r4+, fr7 + fmov.s @r4+, fr6 + fmov.s @r4+, fr5 + fmov.s @r4+, fr4 + fmov.s @r4+, fr3 + fmov.s @r4+, fr2 + fmov.s @r4+, fr1 + fmov.s @r4+, fr0 + + rts + nop + + .end + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/df/30802a3acf96001713a7ede92b37d6f1 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/df/30802a3acf96001713a7ede92b37d6f1 new file mode 100644 index 0000000..9f01c1a --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/df/30802a3acf96001713a7ede92b37d6f1 @@ -0,0 +1,68 @@ +# STM support library + +STM32_STDPERIPH_INC = Libraries/STM32F10x_StdPeriph_Driver/inc/ +CORE_DIR = Libraries/CMSIS/CM3/CoreSupport/ +DEVICE_SUPPORT_DIR = Libraries/CMSIS/CM3/DrviceSupport/ST/STM32F10x + +SRC_DIR = Libraries/STM32F10x_StdPeriph_Driver/src/ + +INCLUDE_DIRS = \ +-I$(STM32_STDPERIPH_INC) \ +-I$(CIRE_DIR) \ +-I$(DEVICE_SUPPORT_DIR) + +OBJ_DIR = Libraries/STM32F10x_StdPeriph_Driver/obj + +CROSS_COMPILE = arm-none-eabi- + +CC = $(CROSS_COMPILE)gcc +CCFLAGS = -c -O2 -g -fno-common -mcpu=cortex-m3 -mthumb -DUSE_FULL_ASSERT -I$(INCLUDE_DIRS)-I. -Wall -Werror -D"assert_param(expr)=((void)0)" + +AR = $(CROSS_COMPILE)ar +ARFLAGS = rs + +OBJECTS = \ +misc.o \ +stm32f10x_adc.o \ +stm32f10x_bkp.o \ +stm32f10x_can.o \ +stm32f10x_cec.o \ +stm32f10x_crc.o \ +stm32f10x_dac.o \ +stm32f10x_dbgmcu.o \ +stm32f10x_dma.o \ +stm32f10x_exti.o \ +stm32f10x_flash.o \ +stm32f10x_fsmc.o \ +stm32f10x_gpio.o \ +stm32f10x_i2c.o \ +stm32f10x_iwdg.o \ +stm32f10x_pwr.o \ +stm32f10x_rcc.o \ +stm32f10x_rtc.o \ +stm32f10x_sdio.o \ +stm32f10x_spi.o \ +stm32f10x_tim.o \ +stm32f10x_usart.o \ +stm32f10x_wwdg.o + +LIBRARY = libSTM_StdPeriph.a + +vpath %.c $(SRC_DIR) +vpath %.o $(OBJ_DIR) + +all: $(LIBRARY) + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +clean: + rm -rf $(LIBRARY) $(OBJ_DIR) + +$(OBJ_DIR): + mkdir -p $@ + +.PHONY: all clean diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/e/a0356b6894970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/e/a0356b6894970017138fe0bf747e5677 new file mode 100644 index 0000000..c222124 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/e/a0356b6894970017138fe0bf747e5677 @@ -0,0 +1,128 @@ +ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +heap_4.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -fno-common -mcpu=cortex-m3 -mthumb $(RELEASE_DEFINES) $(INCLUDES) +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -nostartfiles -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map +release: export LDARCHIVES := -L. -L$(STM32_STDPERIPH_ROOT) -lSTM_StdPeriph +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -f hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + rm -rf obj_release + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +else + +vpath %.c \ +src \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ +$(STM32_DEVICE_SUPPORT_DIR) + +vpath %.s $(STARTER_SCRIPT_DIR) +vpath %.o $(OBJ_DIR) + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) $(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)/$@ + +$(OBJ_DIR): + mkdir -p $@ + +endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/e1/b53a60089d9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/e1/b53a60089d9400171201ed9ff9474498 new file mode 100644 index 0000000..124ee72 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/e1/b53a60089d9400171201ed9ff9474498 @@ -0,0 +1,371 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the RX600 port. + *----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Library includes. */ +#include "string.h" + +/* Hardware specifics. */ +#include "iodefine.h" + +/*-----------------------------------------------------------*/ + +/* Tasks should start with interrupts enabled and in Supervisor mode, therefore +PSW is set with U and I set, and PM and IPL clear. */ +#define portINITIAL_PSW ( ( StackType_t ) 0x00030000 ) +#define portINITIAL_FPSW ( ( StackType_t ) 0x00000100 ) + +/*-----------------------------------------------------------*/ + +/* The following lines are to ensure vSoftwareInterruptEntry can be referenced, + and therefore installed in the vector table, when the FreeRTOS code is built +as a library. */ +extern BaseType_t vSoftwareInterruptEntry; +const BaseType_t * p_vSoftwareInterruptEntry = &vSoftwareInterruptEntry; + +/*-----------------------------------------------------------*/ + +/* + * Function to start the first task executing - written in asm code as direct + * access to registers is required. + */ +static void prvStartFirstTask( void ); + +/* + * Software interrupt handler. Performs the actual context switch (saving and + * restoring of registers). Written in asm code as direct register access is + * required. + */ +static void prvYieldHandler( void ); + +/* + * The entry point for the software interrupt handler. This is the function + * that calls the inline asm function prvYieldHandler(). It is installed in + * the vector table, but the code that installs it is in prvYieldHandler rather + * than using a #pragma. + */ +void vSoftwareInterruptISR( void ); + +/*-----------------------------------------------------------*/ + +/* This is accessed by the inline assembler functions so is file scope for +convenience. */ +extern void *pxCurrentTCB; +extern void vTaskSwitchContext( void ); + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* R0 is not included as it is the stack pointer. */ + + *pxTopOfStack = 0x00; + pxTopOfStack--; + *pxTopOfStack = portINITIAL_PSW; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; + + /* When debugging it can be useful if every register is set to a known + value. Otherwise code space can be saved by just setting the registers + that need to be set. */ + #ifdef USE_FULL_REGISTER_INITIALISATION + { + pxTopOfStack--; + *pxTopOfStack = 0xffffffff; /* r15. */ + pxTopOfStack--; + *pxTopOfStack = 0xeeeeeeee; + pxTopOfStack--; + *pxTopOfStack = 0xdddddddd; + pxTopOfStack--; + *pxTopOfStack = 0xcccccccc; + pxTopOfStack--; + *pxTopOfStack = 0xbbbbbbbb; + pxTopOfStack--; + *pxTopOfStack = 0xaaaaaaaa; + pxTopOfStack--; + *pxTopOfStack = 0x99999999; + pxTopOfStack--; + *pxTopOfStack = 0x88888888; + pxTopOfStack--; + *pxTopOfStack = 0x77777777; + pxTopOfStack--; + *pxTopOfStack = 0x66666666; + pxTopOfStack--; + *pxTopOfStack = 0x55555555; + pxTopOfStack--; + *pxTopOfStack = 0x44444444; + pxTopOfStack--; + *pxTopOfStack = 0x33333333; + pxTopOfStack--; + *pxTopOfStack = 0x22222222; + pxTopOfStack--; + } + #else + { + pxTopOfStack -= 15; + } + #endif + + *pxTopOfStack = ( StackType_t ) pvParameters; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_FPSW; + pxTopOfStack--; + *pxTopOfStack = 0x12345678; /* Accumulator. */ + pxTopOfStack--; + *pxTopOfStack = 0x87654321; /* Accumulator. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void vApplicationSetupTimerInterrupt( void ); + + /* Use pxCurrentTCB just so it does not get optimised away. */ + if( pxCurrentTCB != NULL ) + { + /* Call an application function to set up the timer that will generate the + tick interrupt. This way the application can decide which peripheral to + use. A demo application is provided to show a suitable example. */ + vApplicationSetupTimerInterrupt(); + + /* Enable the software interrupt. */ + _IEN( _ICU_SWINT ) = 1; + + /* Ensure the software interrupt is clear. */ + _IR( _ICU_SWINT ) = 0; + + /* Ensure the software interrupt is set to the kernel priority. */ + _IPR( _ICU_SWINT ) = configKERNEL_INTERRUPT_PRIORITY; + + /* Start the first task. */ + prvStartFirstTask(); + } + + /* Just to make sure the function is not optimised away. */ + ( void ) vSoftwareInterruptISR(); + + /* Should not get here. */ + return pdFAIL; +} +/*-----------------------------------------------------------*/ + +#pragma inline_asm prvStartFirstTask +static void prvStartFirstTask( void ) +{ + /* When starting the scheduler there is nothing that needs moving to the + interrupt stack because the function is not called from an interrupt. + Just ensure the current stack is the user stack. */ + SETPSW U + + /* Obtain the location of the stack associated with which ever task + pxCurrentTCB is currently pointing to. */ + MOV.L #_pxCurrentTCB, R15 + MOV.L [R15], R15 + MOV.L [R15], R0 + + /* Restore the registers from the stack of the task pointed to by + pxCurrentTCB. */ + POP R15 + MVTACLO R15 /* Accumulator low 32 bits. */ + POP R15 + MVTACHI R15 /* Accumulator high 32 bits. */ + POP R15 + MVTC R15,FPSW /* Floating point status word. */ + POPM R1-R15 /* R1 to R15 - R0 is not included as it is the SP. */ + RTE /* This pops the remaining registers. */ + NOP + NOP +} +/*-----------------------------------------------------------*/ + +#pragma interrupt ( vTickISR( vect = _VECT( configTICK_VECTOR ), enable ) ) +void vTickISR( void ) +{ + /* Increment the tick, and perform any processing the new tick value + necessitates. */ + set_ipl( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + { + if( xTaskIncrementTick() != pdFALSE ) + { + taskYIELD(); + } + } + set_ipl( configKERNEL_INTERRUPT_PRIORITY ); +} +/*-----------------------------------------------------------*/ + +void vSoftwareInterruptISR( void ) +{ + prvYieldHandler(); +} +/*-----------------------------------------------------------*/ + +#pragma inline_asm prvYieldHandler +static void prvYieldHandler( void ) +{ + /* Re-enable interrupts. */ + SETPSW I + + /* Move the data that was automatically pushed onto the interrupt stack when + the interrupt occurred from the interrupt stack to the user stack. + + R15 is saved before it is clobbered. */ + PUSH.L R15 + + /* Read the user stack pointer. */ + MVFC USP, R15 + + /* Move the address down to the data being moved. */ + SUB #12, R15 + MVTC R15, USP + + /* Copy the data across. */ + MOV.L [ R0 ], [ R15 ] ; R15 + MOV.L 4[ R0 ], 4[ R15 ] ; PC + MOV.L 8[ R0 ], 8[ R15 ] ; PSW + + /* Move the interrupt stack pointer to its new correct position. */ + ADD #12, R0 + + /* All the rest of the registers are saved directly to the user stack. */ + SETPSW U + + /* Save the rest of the general registers (R15 has been saved already). */ + PUSHM R1-R14 + + /* Save the FPSW and accumulator. */ + MVFC FPSW, R15 + PUSH.L R15 + MVFACHI R15 + PUSH.L R15 + MVFACMI R15 ; Middle order word. + SHLL #16, R15 ; Shifted left as it is restored to the low order word. + PUSH.L R15 + + /* Save the stack pointer to the TCB. */ + MOV.L #_pxCurrentTCB, R15 + MOV.L [ R15 ], R15 + MOV.L R0, [ R15 ] + + /* Ensure the interrupt mask is set to the syscall priority while the kernel + structures are being accessed. */ + MVTIPL #configMAX_SYSCALL_INTERRUPT_PRIORITY + + /* Select the next task to run. */ + BSR.A _vTaskSwitchContext + + /* Reset the interrupt mask as no more data structure access is required. */ + MVTIPL #configKERNEL_INTERRUPT_PRIORITY + + /* Load the stack pointer of the task that is now selected as the Running + state task from its TCB. */ + MOV.L #_pxCurrentTCB,R15 + MOV.L [ R15 ], R15 + MOV.L [ R15 ], R0 + + /* Restore the context of the new task. The PSW (Program Status Word) and + PC will be popped by the RTE instruction. */ + POP R15 + MVTACLO R15 + POP R15 + MVTACHI R15 + POP R15 + MVTC R15,FPSW + POPM R1-R15 + RTE + NOP + NOP +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( pxCurrentTCB == NULL ); + + /* The following line is just to prevent the symbol getting optimised away. */ + ( void ) vTaskSwitchContext(); +} +/*-----------------------------------------------------------*/ + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/e3/d0e4acb990970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/e3/d0e4acb990970017138fe0bf747e5677 new file mode 100644 index 0000000..f8840cd --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/e3/d0e4acb990970017138fe0bf747e5677 @@ -0,0 +1,126 @@ +ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +heap_4.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -fno-common -mcpu=cortex-m3 -mthumb $(RELEASE_DEFINES) $(INCLUDES) +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -nostartfiles -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map +release: export LDARCHIVES := -L. -L$(STM32_STDPERIPH_ROOT) -lSTM_StdPeriph +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -rf $(OBJ_DIR) hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +else + +vpath %.c \ +src \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ +$(STM32_DEVICE_SUPPORT_DIR) +vpath %.s $(STARTER_SCRIPT_DIR) +vpath %.o $(OBJ_DIR) + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) #$(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +#$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) +# $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)/$@ + +$(OBJ_DIR): + mkdir -p $@ + +endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/e4/c49d56089d9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/e4/c49d56089d9400171201ed9ff9474498 new file mode 100644 index 0000000..4b25c69 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/e4/c49d56089d9400171201ed9ff9474498 @@ -0,0 +1,229 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the MSP430X port. + *----------------------------------------------------------*/ + +/* Constants required for hardware setup. The tick ISR runs off the ACLK, +not the MCLK. */ +#define portACLK_FREQUENCY_HZ ( ( TickType_t ) 32768 ) +#define portINITIAL_CRITICAL_NESTING ( ( uint16_t ) 10 ) +#define portFLAGS_INT_ENABLED ( ( StackType_t ) 0x08 ) + +/* We require the address of the pxCurrentTCB variable, but don't want to know +any details of its type. */ +typedef void TCB_t; +extern volatile TCB_t * volatile pxCurrentTCB; + +/* Each task maintains a count of the critical section nesting depth. Each +time a critical section is entered the count is incremented. Each time a +critical section is exited the count is decremented - with interrupts only +being re-enabled if the count is zero. + +usCriticalNesting will get set to zero when the scheduler starts, but must +not be initialised to zero as this will cause problems during the startup +sequence. */ +volatile uint16_t usCriticalNesting = portINITIAL_CRITICAL_NESTING; +/*-----------------------------------------------------------*/ + + +/* + * Sets up the periodic ISR used for the RTOS tick. This uses timer 0, but + * could have alternatively used the watchdog timer or timer 1. + */ +void vPortSetupTimerInterrupt( void ); +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been called. + * + * See the header file portable.h. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +uint16_t *pusTopOfStack; +uint32_t *pulTopOfStack, ulTemp; + + /* + Place a few bytes of known values on the bottom of the stack. + This is just useful for debugging and can be included if required. + + *pxTopOfStack = ( StackType_t ) 0x1111; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x2222; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x3333; + pxTopOfStack--; + */ + + /* Data types are need either 16 bits or 32 bits depending on the data + and code model used. */ + if( sizeof( pxCode ) == sizeof( uint16_t ) ) + { + pusTopOfStack = ( uint16_t * ) pxTopOfStack; + ulTemp = ( uint32_t ) pxCode; + *pusTopOfStack = ( uint16_t ) ulTemp; + } + else + { + /* Make room for a 20 bit value stored as a 32 bit value. */ + pusTopOfStack = ( uint16_t * ) pxTopOfStack; + pusTopOfStack--; + pulTopOfStack = ( uint32_t * ) pusTopOfStack; + *pulTopOfStack = ( uint32_t ) pxCode; + } + + pusTopOfStack--; + *pusTopOfStack = portFLAGS_INT_ENABLED; + pusTopOfStack -= ( sizeof( StackType_t ) / 2 ); + + /* From here on the size of stacked items depends on the memory model. */ + pxTopOfStack = ( StackType_t * ) pusTopOfStack; + + /* Next the general purpose registers. */ + #ifdef PRELOAD_REGISTER_VALUES + *pxTopOfStack = ( StackType_t ) 0xffff; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xeeee; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xdddd; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xbbbb; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xaaaa; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x9999; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x8888; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x5555; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x6666; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x5555; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x4444; + pxTopOfStack--; + #else + pxTopOfStack -= 3; + *pxTopOfStack = ( StackType_t ) pvParameters; + pxTopOfStack -= 9; + #endif + + /* A variable is used to keep track of the critical section nesting. + This variable has to be stored as part of the task context and is + initially set to zero. */ + *pxTopOfStack = ( StackType_t ) portNO_CRITICAL_SECTION_NESTING; + + /* Return a pointer to the top of the stack we have generated so this can + be stored in the task control block for the task. */ + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the MSP430 port will get stopped. If required simply + disable the tick interrupt here. */ +} +/*-----------------------------------------------------------*/ + +/* + * Hardware initialisation to generate the RTOS tick. + */ +void vPortSetupTimerInterrupt( void ) +{ + vApplicationSetupTimerInterrupt(); +} +/*-----------------------------------------------------------*/ + +#pragma vector=configTICK_VECTOR +interrupt void vTickISREntry( void ) +{ +extern void vPortTickISR( void ); + + __bic_SR_register_on_exit( SCG1 + SCG0 + OSCOFF + CPUOFF ); + #if configUSE_PREEMPTION == 1 + extern void vPortPreemptiveTickISR( void ); + vPortPreemptiveTickISR(); + #else + extern void vPortCooperativeTickISR( void ); + vPortCooperativeTickISR(); + #endif +} + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/e5/901fce2293970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/e5/901fce2293970017138fe0bf747e5677 new file mode 100644 index 0000000..005115a --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/e5/901fce2293970017138fe0bf747e5677 @@ -0,0 +1,128 @@ +ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +heap_4.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -fno-common -mcpu=cortex-m3 -mthumb $(RELEASE_DEFINES) $(INCLUDES) +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -nostartfiles -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map +release: export LDARCHIVES := -L. -L$(STM32_STDPERIPH_ROOT) -lSTM_StdPeriph +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -f hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + rm -rf obj_release + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +else + +vpath %.c \ +src \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ +$(STM32_DEVICE_SUPPORT_DIR) + +vpath %.s $(STARTER_SCRIPT_DIR) +vpath %.o $(OBJ_DIR) + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) #$(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +#$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) +# $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)/$@ + +$(OBJ_DIR): + mkdir -p $@ + +endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/e8/d00019c390970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/e8/d00019c390970017138fe0bf747e5677 new file mode 100644 index 0000000..de3551d --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/e8/d00019c390970017138fe0bf747e5677 @@ -0,0 +1,126 @@ +ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +heap_4.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -fno-common -mcpu=cortex-m3 -mthumb $(RELEASE_DEFINES) $(INCLUDES) +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -nostartfiles -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map +release: export LDARCHIVES := -L. -L$(STM32_STDPERIPH_ROOT) -lSTM_StdPeriph +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -rf $(OBJ_DIR) hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +else + +vpath %.c \ +src \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ +$(STM32_DEVICE_SUPPORT_DIR) +vpath %.s $(STARTER_SCRIPT_DIR) +vpath %.o $(OBJ_DIR) + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) $(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)/$@ + +$(OBJ_DIR): + mkdir -p $@ + +endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/ea/001eceac95970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/ea/001eceac95970017138fe0bf747e5677 new file mode 100644 index 0000000..f28c871 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/ea/001eceac95970017138fe0bf747e5677 @@ -0,0 +1,133 @@ +ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +heap_4.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +STM32_CORE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) \ +-I$(STM32_CORE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -fno-common -mcpu=cortex-m3 -mthumb $(RELEASE_DEFINES) $(INCLUDES) +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -nostartfiles -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map +release: export LDARCHIVES := -L. -L$(STM32_STDPERIPH_ROOT) -lSTM_StdPeriph +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -f hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + rm -rf obj_release + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +else + +vpath %.c \ +src \ +startup \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport + +vpath %.s \ +startup +vpath %.o $(OBJ_DIR) + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) $(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)/$@ + +$(OBJ_DIR): + mkdir -p $@ + +endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/ea/203ed7fb98970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/ea/203ed7fb98970017138fe0bf747e5677 new file mode 100644 index 0000000..6503f2f --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/ea/203ed7fb98970017138fe0bf747e5677 @@ -0,0 +1,134 @@ +ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +heap_4.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +STM32_CORE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) \ +-I$(STM32_CORE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -fno-common -mcpu=cortex-m3 -mthumb $(RELEASE_DEFINES) $(INCLUDES) +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -nostartfiles -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map +release: export LDARCHIVES := -L. -L$(STM32_STDPERIPH_ROOT) -lSTM_StdPeriph -lhsb_mrts_release +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -f hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + rm -rf obj_release + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +else + +vpath %.c \ +src \ +startup \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport + +vpath %.s \ +startup +vpath %.o \ +obj_release + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) $(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)/$@ + +$(OBJ_DIR): + mkdir -p $@ + +endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/ee/9083b64aa69700171090ed03afc2ec65 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/ee/9083b64aa69700171090ed03afc2ec65 new file mode 100644 index 0000000..d9ca1aa --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/ee/9083b64aa69700171090ed03afc2ec65 @@ -0,0 +1,107 @@ +// ----------------------------------------------------------------------------- +/// @file freeRTOSFixes.c +/// @brief Description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @file freeRTOSFixes.c +/// @ingroup {group_name} + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + +#include +#include +#include + +#include "freeRTOSFixes.h" + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Type definitions +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// File-scope variables +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function definitions +// ----------------------------------------------------------------------------- + +void OS_logTaskInfo(xTaskHandle taskHandle) +{ + unsigned portBASE_TYPE highWaterMark; + char text[128]; + + snprintf(text, sizeof(text), "Task %s\n", pcTaskGetTaskName(taskHandle)); +// Shell_sendString(text); + + highWaterMark = uxTaskGetStackHighWaterMark(taskHandle); + snprintf(text, sizeof(text), "Stack high water mark : %lu long words\n", highWaterMark); +// Shell_sendString(text); +} + +// Implementation for libc, needed for printf related functions. +caddr_t _sbrk(int incr) +{ + extern char _end; + static char* heap_end; + char* prev_heap_end; + + if(heap_end == 0) + { + heap_end = &_end; + } + + prev_heap_end = heap_end; + heap_end += incr; + return (caddr_t)prev_heap_end; +} + +// Stack overflow hook +void vApplicationStackOverflowHook(xTaskHandle xTask, signed portCHAR* pcTaskName) +{ +// Logger_fatal(FATALCODE_STACKOVERFLOW); +} + +// Malloc failed hook +void vApplicationMallocFailedHook(void) +{ +// Logger_fatal(FATALCODE_MALLOCFAILED); +} + +// Assert for StdPeriph library +void assert_failed(uint8_t* file, uint32_t line) +{ +// Logger_log((char*)file, "", line, LOGTYPE_ERROR, "assert failed"); +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/ee/c0acc2d5a69700171090ed03afc2ec65 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/ee/c0acc2d5a69700171090ed03afc2ec65 new file mode 100644 index 0000000..e341c7e --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/ee/c0acc2d5a69700171090ed03afc2ec65 @@ -0,0 +1,111 @@ +// ----------------------------------------------------------------------------- +/// @file freeRTOSFixes.c +/// @brief Description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @file freeRTOSFixes.c +/// @ingroup {group_name} + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + +#include +#include +#include + +#include "FreeRTOS.h" +#include "task.h" +#include "freeRTOSFixes.h" + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Type definitions +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// File-scope variables +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function definitions +// ----------------------------------------------------------------------------- + +void _init(void) {return;} + +void OS_logTaskInfo(xTaskHandle taskHandle) +{ + unsigned portBASE_TYPE highWaterMark; + char text[128]; + + snprintf(text, sizeof(text), "Task %s\n", pcTaskGetTaskName(taskHandle)); +// Shell_sendString(text); + + highWaterMark = uxTaskGetStackHighWaterMark(taskHandle); +// snprintf(text, sizeof(text), "Stack high water mark : %lu long words\n", highWaterMark); +// Shell_sendString(text); +} + +// Implementation for libc, needed for printf related functions. +caddr_t _sbrk(int incr) +{ + extern char _end; + static char* heap_end; + char* prev_heap_end; + + if(heap_end == 0) + { + heap_end = &_end; + } + + prev_heap_end = heap_end; + heap_end += incr; + return (caddr_t)prev_heap_end; +} + +// Stack overflow hook +void vApplicationStackOverflowHook(xTaskHandle xTask, signed portCHAR* pcTaskName) +{ +// Logger_fatal(FATALCODE_STACKOVERFLOW); +} + +// Malloc failed hook +void vApplicationMallocFailedHook(void) +{ +// Logger_fatal(FATALCODE_MALLOCFAILED); +} + +// Assert for StdPeriph library +void assert_failed(uint8_t* file, uint32_t line) +{ +// Logger_log((char*)file, "", line, LOGTYPE_ERROR, "assert failed"); +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/ef/1034f08fcf96001713a7ede92b37d6f1 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/ef/1034f08fcf96001713a7ede92b37d6f1 new file mode 100644 index 0000000..ed600d5 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/ef/1034f08fcf96001713a7ede92b37d6f1 @@ -0,0 +1,68 @@ +# STM support library + +STM32_STDPERIPH_INC = Libraries/STM32F10x_StdPeriph_Driver/inc/ +CORE_DIR = Libraries/CMSIS/CM3/CoreSupport/ +DEVICE_SUPPORT_DIR = Libraries/CMSIS/CM3/DrviceSupport/ST/STM32F10x + +SRC_DIR = Libraries/STM32F10x_StdPeriph_Driver/src/ + +INCLUDE_DIRS = \ +-I$(STM32_STDPERIPH_INC) \ +-I$(CIRE_DIR) \ +-I$(DEVICE_SUPPORT_DIR) \ + +OBJ_DIR = Libraries/STM32F10x_StdPeriph_Driver/obj + +CROSS_COMPILE = arm-none-eabi- + +CC = $(CROSS_COMPILE)gcc +CCFLAGS = -c -O2 -g -fno-common -mcpu=cortex-m3 -mthumb -DUSE_FULL_ASSERT $(INCLUDE_DIRS) -I. -Wall -Werror -D"assert_param(expr)=((void)0)" + +AR = $(CROSS_COMPILE)ar +ARFLAGS = rs + +OBJECTS = \ +misc.o \ +stm32f10x_adc.o \ +stm32f10x_bkp.o \ +stm32f10x_can.o \ +stm32f10x_cec.o \ +stm32f10x_crc.o \ +stm32f10x_dac.o \ +stm32f10x_dbgmcu.o \ +stm32f10x_dma.o \ +stm32f10x_exti.o \ +stm32f10x_flash.o \ +stm32f10x_fsmc.o \ +stm32f10x_gpio.o \ +stm32f10x_i2c.o \ +stm32f10x_iwdg.o \ +stm32f10x_pwr.o \ +stm32f10x_rcc.o \ +stm32f10x_rtc.o \ +stm32f10x_sdio.o \ +stm32f10x_spi.o \ +stm32f10x_tim.o \ +stm32f10x_usart.o \ +stm32f10x_wwdg.o + +LIBRARY = libSTM_StdPeriph.a + +vpath %.c $(SRC_DIR) +vpath %.o $(OBJ_DIR) + +all: $(LIBRARY) + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +clean: + rm -rf $(LIBRARY) $(OBJ_DIR) + +$(OBJ_DIR): + mkdir -p $@ + +.PHONY: all clean diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/f0/2063fc0f8697001713a7ede92b37d6f1 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/f0/2063fc0f8697001713a7ede92b37d6f1 new file mode 100644 index 0000000..e69de29 diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/f0/e0ab5b8a9e970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/f0/e0ab5b8a9e970017138fe0bf747e5677 new file mode 100644 index 0000000..ed48cff --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/f0/e0ab5b8a9e970017138fe0bf747e5677 @@ -0,0 +1,79 @@ +// ----------------------------------------------------------------------------- +/// @file main.c +/// @brief Description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @file main.c +/// @ingroup {group_name} + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + +// FreeRTOS includes +#include "FreeRTOS.h" +#include "task.h" + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + +/* The time between cycles of the 'check' functionality (defined within the +tick hook. */ +#define mainCHECK_DELAY ( ( TickType_t ) 5000 / portTICK_PERIOD_MS ) + +// ----------------------------------------------------------------------------- +// Type definitions +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// File-scope variables +// ----------------------------------------------------------------------------- + +/* Variable that counts at 20KHz to provide the time base for the run time +stats. */ +unsigned long ulRunTimeStatsClock = 0UL; + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function definitions +// ----------------------------------------------------------------------------- + +void _init(void) {return;} + +int main (void) +{ + + + /* Start the scheduler. */ + vTaskStartScheduler(); + + /* Will only get here if there was insufficient memory to create the idle + task. The idle task is created within vTaskStartScheduler(). */ + for( ;; ); + + + return -1; +} + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/f3/409e6aa89f9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/f3/409e6aa89f9400171201ed9ff9474498 new file mode 100644 index 0000000..813d65e --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/f3/409e6aa89f9400171201ed9ff9474498 @@ -0,0 +1,53 @@ +// ----------------------------------------------------------------------------- +/// @file a.h +/// @brief File description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @defgroup {group_name} {group_description} +/// Description + +/// @file a.h +/// @ingroup {group_name} + + +#ifndef A_H_ +#define A_H_ + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Type definitions. +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + +#endif /* A_H_ */ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/f4/e0cc52309a970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/f4/e0cc52309a970017138fe0bf747e5677 new file mode 100644 index 0000000..00bb8c7 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/f4/e0cc52309a970017138fe0bf747e5677 @@ -0,0 +1,210 @@ +/* +****************************************************************************** +** +** File : LinkerScript.ld +** +** Author : Auto-generated by Ac6 System Workbench +** +** Abstract : Linker script for STM32F107VCTx Device from STM32F1 series +** 64Kbytes RAM +** 256Kbytes ROM +** +** Set heap size, stack size and stack location according +** to application requirements. +** +** Set memory bank area and size if external memory is used. +** +** Target : STMicroelectronics STM32 +** +** Distribution: The file is distributed “as is,” without any warranty +** of any kind. +** +***************************************************************************** +** @attention +** +**

© COPYRIGHT(c) 2017 Ac6

+** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** 1. Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** 3. Neither the name of Ac6 nor the names of its contributors +** may be used to endorse or promote products derived from this software +** without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +***************************************************************************** +*/ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = 0x20010000; /* end of RAM */ + +_Min_Heap_Size = 0; /* required amount of heap */ +_Min_Stack_Size = 0x400; /* required amount of stack */ + +/* Memories definition */ +MEMORY +{ + RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K + ROM (rx) : ORIGIN = 0x8000000, LENGTH = 256K +} + +/* Sections */ +SECTIONS +{ + /* The startup code into ROM memory */ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } >ROM + + /* The program code and other data into ROM memory */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + } >ROM + + /* Constant data into ROM memory*/ + .rodata : + { + . = ALIGN(4); + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + . = ALIGN(4); + } >ROM + + .ARM.extab : { + . = ALIGN(4); + *(.ARM.extab* .gnu.linkonce.armextab.*) + . = ALIGN(4); + } >ROM + + .ARM : { + . = ALIGN(4); + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + . = ALIGN(4); + } >ROM + + .preinit_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + . = ALIGN(4); + } >ROM + + .init_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + . = ALIGN(4); + } >ROM + + .fini_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + . = ALIGN(4); + } >ROM + + /* Used by the startup to initialize data */ + _sidata = LOADADDR(.data); + + /* Initialized data sections into RAM memory */ + .data : + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + } >RAM AT> ROM + + + /* Uninitialized data section into RAM memory */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM + + /* User_heap_stack section, used to check that there is enough RAM left */ + ._user_heap_stack : + { + . = ALIGN(8); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(8); + } >RAM + + + + /* Remove information from the compiler libraries */ +/* /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } +*/ + .ARM.attributes 0 : { *(.ARM.attributes) } + + .GROUP( + libgcc.a + libg.a + libc.a + libm.a + libnosys.a + ) +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/f5/a0136f679a970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/f5/a0136f679a970017138fe0bf747e5677 new file mode 100644 index 0000000..eb6ad66 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/f5/a0136f679a970017138fe0bf747e5677 @@ -0,0 +1,210 @@ +/* +****************************************************************************** +** +** File : LinkerScript.ld +** +** Author : Auto-generated by Ac6 System Workbench +** +** Abstract : Linker script for STM32F107VCTx Device from STM32F1 series +** 64Kbytes RAM +** 256Kbytes ROM +** +** Set heap size, stack size and stack location according +** to application requirements. +** +** Set memory bank area and size if external memory is used. +** +** Target : STMicroelectronics STM32 +** +** Distribution: The file is distributed “as is,” without any warranty +** of any kind. +** +***************************************************************************** +** @attention +** +**

© COPYRIGHT(c) 2017 Ac6

+** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** 1. Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** 3. Neither the name of Ac6 nor the names of its contributors +** may be used to endorse or promote products derived from this software +** without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +***************************************************************************** +*/ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = 0x20010000; /* end of RAM */ + +_Min_Heap_Size = 0; /* required amount of heap */ +_Min_Stack_Size = 0x400; /* required amount of stack */ + +/* Memories definition */ +MEMORY +{ + RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K + ROM (rx) : ORIGIN = 0x8000000, LENGTH = 256K +} + +/* Sections */ +SECTIONS +{ + /* The startup code into ROM memory */ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } >ROM + + /* The program code and other data into ROM memory */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + } >ROM + + /* Constant data into ROM memory*/ + .rodata : + { + . = ALIGN(4); + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + . = ALIGN(4); + } >ROM + + .ARM.extab : { + . = ALIGN(4); + *(.ARM.extab* .gnu.linkonce.armextab.*) + . = ALIGN(4); + } >ROM + + .ARM : { + . = ALIGN(4); + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + . = ALIGN(4); + } >ROM + + .preinit_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + . = ALIGN(4); + } >ROM + + .init_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + . = ALIGN(4); + } >ROM + + .fini_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + . = ALIGN(4); + } >ROM + + /* Used by the startup to initialize data */ + _sidata = LOADADDR(.data); + + /* Initialized data sections into RAM memory */ + .data : + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + } >RAM AT> ROM + + + /* Uninitialized data section into RAM memory */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM + + /* User_heap_stack section, used to check that there is enough RAM left */ + ._user_heap_stack : + { + . = ALIGN(8); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(8); + } >RAM + + + + /* Remove information from the compiler libraries */ +/* /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } +*/ + .ARM.attributes 0 : { *(.ARM.attributes) } + + GROUP + ( + libgcc.a + libc.a + libm.a + libnosys.a + ) +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/f8/b051921d91970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/f8/b051921d91970017138fe0bf747e5677 new file mode 100644 index 0000000..f8840cd --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/f8/b051921d91970017138fe0bf747e5677 @@ -0,0 +1,126 @@ +ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +heap_4.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -fno-common -mcpu=cortex-m3 -mthumb $(RELEASE_DEFINES) $(INCLUDES) +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -nostartfiles -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map +release: export LDARCHIVES := -L. -L$(STM32_STDPERIPH_ROOT) -lSTM_StdPeriph +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -rf $(OBJ_DIR) hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +else + +vpath %.c \ +src \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ +$(STM32_DEVICE_SUPPORT_DIR) +vpath %.s $(STARTER_SCRIPT_DIR) +vpath %.o $(OBJ_DIR) + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) #$(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +#$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) +# $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)/$@ + +$(OBJ_DIR): + mkdir -p $@ + +endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/f9/4074ddd797970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/f9/4074ddd797970017138fe0bf747e5677 new file mode 100644 index 0000000..02c3b63 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/f9/4074ddd797970017138fe0bf747e5677 @@ -0,0 +1,133 @@ +// ----------------------------------------------------------------------------- +/// @file main.c +/// @brief Description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @file main.c +/// @ingroup {group_name} + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + +// FreeRTOS includes +#include "FreeRTOS.h" +#include "task.h" + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Type definitions +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// File-scope variables +// ----------------------------------------------------------------------------- + +/* Variable that counts at 20KHz to provide the time base for the run time +stats. */ +unsigned long ulRunTimeStatsClock = 0UL; + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function definitions +// ----------------------------------------------------------------------------- + + +int main (void) +{ + + + /* Start the scheduler. */ + vTaskStartScheduler(); + + /* Will only get here if there was insufficient memory to create the idle + task. The idle task is created within vTaskStartScheduler(). */ + for( ;; ); + + + return -1; +} + + +void vApplicationTickHook( void ) +{ +char *pcMessage = "Status: PASS"; +static unsigned long ulTicksSinceLastDisplay = 0; +portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; + + /* Called from every tick interrupt as described in the comments at the top + of this file. + + Have enough ticks passed to make it time to perform our health status + check again? */ + ulTicksSinceLastDisplay++; + if( ulTicksSinceLastDisplay >= mainCHECK_DELAY ) + { + /* Reset the counter so these checks run again in mainCHECK_DELAY + ticks time. */ + ulTicksSinceLastDisplay = 0; + + /* Has an error been found in any task? */ + if( xAreGenericQueueTasksStillRunning() != pdTRUE ) + { + pcMessage = "ERROR: GEN Q"; + } + else if( xAreQueuePeekTasksStillRunning() != pdTRUE ) + { + pcMessage = "ERROR: PEEK Q"; + } + else if( xAreBlockingQueuesStillRunning() != pdTRUE ) + { + pcMessage = "ERROR: BLOCK Q"; + } + else if( xAreSemaphoreTasksStillRunning() != pdTRUE ) + { + pcMessage = "ERROR: SEMAPHR"; + } + else if( xArePollingQueuesStillRunning() != pdTRUE ) + { + pcMessage = "ERROR: POLL Q"; + } + else if( xAreIntegerMathsTaskStillRunning() != pdTRUE ) + { + pcMessage = "ERROR: INT MATH"; + } + else if( xAreRecursiveMutexTasksStillRunning() != pdTRUE ) + { + pcMessage = "ERROR: REC MUTEX"; + } + + /* Send the message to the OLED gatekeeper for display. The + xHigherPriorityTaskWoken parameter is not actually used here + as this function is running in the tick interrupt anyway - but + it must still be supplied. */ + xHigherPriorityTaskWoken = pdFALSE; + xQueueSendFromISR( xLCDQueue, &pcMessage, &xHigherPriorityTaskWoken ); + } +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/fc/c10e59089d9400171201ed9ff9474498 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/fc/c10e59089d9400171201ed9ff9474498 new file mode 100644 index 0000000..54e19d5 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/fc/c10e59089d9400171201ed9ff9474498 @@ -0,0 +1,225 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* Kernel includes. */ +#include "FreeRTOS.h" +#include "task.h" + + +#define portINITIAL_FORMAT_VECTOR ( ( StackType_t ) 0x4000 ) + +/* Supervisor mode set. */ +#define portINITIAL_STATUS_REGISTER ( ( StackType_t ) 0x2000) + +/* The clock prescale into the timer peripheral. */ +#define portPRESCALE_VALUE ( ( uint8_t ) 10 ) + +/* The clock frequency into the RTC. */ +#define portRTC_CLOCK_HZ ( ( uint32_t ) 1000 ) + +asm void interrupt VectorNumber_VL1swi vPortYieldISR( void ); +static void prvSetupTimerInterrupt( void ); + +/* Used to keep track of the number of nested calls to taskENTER_CRITICAL(). This +will be set to 0 prior to the first task being started. */ +static uint32_t ulCriticalNesting = 0x9999UL; + +/*-----------------------------------------------------------*/ + +StackType_t *pxPortInitialiseStack( StackType_t * pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + +uint32_t ulOriginalA5; + + __asm{ MOVE.L A5, ulOriginalA5 }; + + + *pxTopOfStack = (StackType_t) 0xDEADBEEF; + pxTopOfStack--; + + /* Exception stack frame starts with the return address. */ + *pxTopOfStack = ( StackType_t ) pxCode; + pxTopOfStack--; + + *pxTopOfStack = ( portINITIAL_FORMAT_VECTOR << 16UL ) | ( portINITIAL_STATUS_REGISTER ); + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) 0x0; /*FP*/ + pxTopOfStack -= 14; /* A5 to D0. */ + + /* Parameter in A0. */ + *( pxTopOfStack + 8 ) = ( StackType_t ) pvParameters; + + /* A5 must be maintained as it is resurved by the compiler. */ + *( pxTopOfStack + 13 ) = ulOriginalA5; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void vPortStartFirstTask( void ); + + ulCriticalNesting = 0UL; + + /* Configure a timer to generate the tick interrupt. */ + prvSetupTimerInterrupt(); + + /* Start the first task executing. */ + vPortStartFirstTask(); + + return pdFALSE; +} +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt( void ) +{ + /* Prescale by 1 - ie no prescale. */ + RTCSC |= 8; + + /* Compare match value. */ + RTCMOD = portRTC_CLOCK_HZ / configTICK_RATE_HZ; + + /* Enable the RTC to generate interrupts - interrupts are already disabled + when this code executes. */ + RTCSC_RTIE = 1; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented as there is nothing to return to. */ +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + if( ulCriticalNesting == 0UL ) + { + /* Guard against context switches being pended simultaneously with a + critical section being entered. */ + do + { + portDISABLE_INTERRUPTS(); + if( INTC_FRC == 0UL ) + { + break; + } + + portENABLE_INTERRUPTS(); + + } while( 1 ); + } + ulCriticalNesting++; +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + ulCriticalNesting--; + if( ulCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void vPortYieldHandler( void ) +{ +uint32_t ulSavedInterruptMask; + + ulSavedInterruptMask = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Note this will clear all forced interrupts - this is done for speed. */ + INTC_CFRC = 0x3E; + vTaskSwitchContext(); + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulSavedInterruptMask ); +} +/*-----------------------------------------------------------*/ + +void interrupt VectorNumber_Vrtc vPortTickISR( void ) +{ +uint32_t ulSavedInterruptMask; + + /* Clear the interrupt. */ + RTCSC |= RTCSC_RTIF_MASK; + + /* Increment the RTOS tick. */ + ulSavedInterruptMask = portSET_INTERRUPT_MASK_FROM_ISR(); + { + if( xTaskIncrementTick() != pdFALSE ) + { + taskYIELD(); + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulSavedInterruptMask ); +} + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/fe/7068a6d1cf96001713a7ede92b37d6f1 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/fe/7068a6d1cf96001713a7ede92b37d6f1 new file mode 100644 index 0000000..8e152cd --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/fe/7068a6d1cf96001713a7ede92b37d6f1 @@ -0,0 +1,68 @@ +# STM support library + +STM32_STDPERIPH_INC = Libraries/STM32F10x_StdPeriph_Driver/inc/ +CORE_DIR = Libraries/CMSIS/CM3/CoreSupport/ +DEVICE_SUPPORT_DIR = Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x + +SRC_DIR = Libraries/STM32F10x_StdPeriph_Driver/src/ + +INCLUDE_DIRS = \ +-I$(STM32_STDPERIPH_INC) \ +-I$(CIRE_DIR) \ +-I$(DEVICE_SUPPORT_DIR) \ + +OBJ_DIR = Libraries/STM32F10x_StdPeriph_Driver/obj + +CROSS_COMPILE = arm-none-eabi- + +CC = $(CROSS_COMPILE)gcc +CCFLAGS = -c -O2 -g -fno-common -mcpu=cortex-m3 -mthumb -DUSE_FULL_ASSERT $(INCLUDE_DIRS) -I. -Wall -Werror -D"assert_param(expr)=((void)0)" + +AR = $(CROSS_COMPILE)ar +ARFLAGS = rs + +OBJECTS = \ +misc.o \ +stm32f10x_adc.o \ +stm32f10x_bkp.o \ +stm32f10x_can.o \ +stm32f10x_cec.o \ +stm32f10x_crc.o \ +stm32f10x_dac.o \ +stm32f10x_dbgmcu.o \ +stm32f10x_dma.o \ +stm32f10x_exti.o \ +stm32f10x_flash.o \ +stm32f10x_fsmc.o \ +stm32f10x_gpio.o \ +stm32f10x_i2c.o \ +stm32f10x_iwdg.o \ +stm32f10x_pwr.o \ +stm32f10x_rcc.o \ +stm32f10x_rtc.o \ +stm32f10x_sdio.o \ +stm32f10x_spi.o \ +stm32f10x_tim.o \ +stm32f10x_usart.o \ +stm32f10x_wwdg.o + +LIBRARY = libSTM_StdPeriph.a + +vpath %.c $(SRC_DIR) +vpath %.o $(OBJ_DIR) + +all: $(LIBRARY) + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +clean: + rm -rf $(LIBRARY) $(OBJ_DIR) + +$(OBJ_DIR): + mkdir -p $@ + +.PHONY: all clean diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/fe/f076c15c9a970017138fe0bf747e5677 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/fe/f076c15c9a970017138fe0bf747e5677 new file mode 100644 index 0000000..a9f5c3c --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.history/fe/f076c15c9a970017138fe0bf747e5677 @@ -0,0 +1,210 @@ +/* +****************************************************************************** +** +** File : LinkerScript.ld +** +** Author : Auto-generated by Ac6 System Workbench +** +** Abstract : Linker script for STM32F107VCTx Device from STM32F1 series +** 64Kbytes RAM +** 256Kbytes ROM +** +** Set heap size, stack size and stack location according +** to application requirements. +** +** Set memory bank area and size if external memory is used. +** +** Target : STMicroelectronics STM32 +** +** Distribution: The file is distributed “as is,” without any warranty +** of any kind. +** +***************************************************************************** +** @attention +** +**

© COPYRIGHT(c) 2017 Ac6

+** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** 1. Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** 3. Neither the name of Ac6 nor the names of its contributors +** may be used to endorse or promote products derived from this software +** without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +***************************************************************************** +*/ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = 0x20010000; /* end of RAM */ + +_Min_Heap_Size = 0; /* required amount of heap */ +_Min_Stack_Size = 0x400; /* required amount of stack */ + +/* Memories definition */ +MEMORY +{ + RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K + ROM (rx) : ORIGIN = 0x8000000, LENGTH = 256K +} + +/* Sections */ +SECTIONS +{ + /* The startup code into ROM memory */ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } >ROM + + /* The program code and other data into ROM memory */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + } >ROM + + /* Constant data into ROM memory*/ + .rodata : + { + . = ALIGN(4); + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + . = ALIGN(4); + } >ROM + + .ARM.extab : { + . = ALIGN(4); + *(.ARM.extab* .gnu.linkonce.armextab.*) + . = ALIGN(4); + } >ROM + + .ARM : { + . = ALIGN(4); + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + . = ALIGN(4); + } >ROM + + .preinit_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + . = ALIGN(4); + } >ROM + + .init_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + . = ALIGN(4); + } >ROM + + .fini_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + . = ALIGN(4); + } >ROM + + /* Used by the startup to initialize data */ + _sidata = LOADADDR(.data); + + /* Initialized data sections into RAM memory */ + .data : + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + } >RAM AT> ROM + + + /* Uninitialized data section into RAM memory */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM + + /* User_heap_stack section, used to check that there is enough RAM left */ + ._user_heap_stack : + { + . = ALIGN(8); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(8); + } >RAM + + + + /* Remove information from the compiler libraries */ +/* /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } +*/ + .ARM.attributes 0 : { *(.ARM.attributes) } + + GROUP + ( + libgcc.a + libc.a + libm.a + libnosys.a + ) +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/22/80/15/history.index b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/22/80/15/history.index new file mode 100644 index 0000000..b6f8580 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/22/80/15/history.index differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/22/80/54/history.index b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/22/80/54/history.index new file mode 100644 index 0000000..5ec9d5e Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/22/80/54/history.index differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/22/80/f3/history.index b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/22/80/f3/history.index new file mode 100644 index 0000000..1e4a62e Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/22/80/f3/history.index differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/75/a0/history.index b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/75/a0/history.index new file mode 100644 index 0000000..dc60dfd Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/75/a0/history.index differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/75/a1/history.index b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/75/a1/history.index new file mode 100644 index 0000000..67ef283 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/75/a1/history.index differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/75/d9/history.index b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/75/d9/history.index new file mode 100644 index 0000000..dfbe8b1 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/75/d9/history.index differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/a5/90/history.index b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/a5/90/history.index new file mode 100644 index 0000000..91cf9da Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/a5/90/history.index differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/a5/ac/history.index b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/a5/ac/history.index new file mode 100644 index 0000000..3e550b9 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/a5/ac/history.index differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/a5/b0/history.index b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/a5/b0/history.index new file mode 100644 index 0000000..8b47844 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/a5/b0/history.index differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/a5/d4/history.index b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/a5/d4/history.index new file mode 100644 index 0000000..3068e1d Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/a5/d4/history.index differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/a5/eb/history.index b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/a5/eb/history.index new file mode 100644 index 0000000..527eef6 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/a5/eb/history.index differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/b/history.index b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/b/history.index new file mode 100644 index 0000000..493e751 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/b/history.index differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/da/1a/history.index b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/da/1a/history.index new file mode 100644 index 0000000..33bb310 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/da/1a/history.index differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/da/7b/history.index b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/da/7b/history.index new file mode 100644 index 0000000..e7a25c6 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/da/7b/history.index differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/f3/51/history.index b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/f3/51/history.index new file mode 100644 index 0000000..8efc847 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/f3/51/history.index differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/f3/61/history.index b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/f3/61/history.index new file mode 100644 index 0000000..90cea02 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/f3/61/history.index differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/f3/d5/history.index b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/f3/d5/history.index new file mode 100644 index 0000000..ff675fd Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/5b/f3/d5/history.index differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/a8/history.index b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/a8/history.index new file mode 100644 index 0000000..e4f4fe9 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/a8/history.index differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/a8/properties.index b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/a8/properties.index new file mode 100644 index 0000000..a28707c Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/a8/properties.index differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/properties.index b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/properties.index new file mode 100644 index 0000000..8bfc739 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/c5/properties.index differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/properties.index b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/properties.index new file mode 100644 index 0000000..0d9d4ce Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.indexes/properties.index differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.markers b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.markers new file mode 100644 index 0000000..056a30f Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.markers differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.syncinfo b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.syncinfo new file mode 100644 index 0000000..16e2309 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS/.syncinfo differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/HAL/.indexes/properties.index b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/HAL/.indexes/properties.index new file mode 100644 index 0000000..241ed5f Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/HAL/.indexes/properties.index differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/HAL/.markers b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/HAL/.markers new file mode 100644 index 0000000..8d0921c Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/HAL/.markers differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/HAL/.syncinfo b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/HAL/.syncinfo new file mode 100644 index 0000000..d2798a0 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/HAL/.syncinfo differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/STM32F10x_StdPeriph_Lib_V3.5.0/.indexes/87/13/9/79/61/1e/history.index b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/STM32F10x_StdPeriph_Lib_V3.5.0/.indexes/87/13/9/79/61/1e/history.index new file mode 100644 index 0000000..464030b Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/STM32F10x_StdPeriph_Lib_V3.5.0/.indexes/87/13/9/79/61/1e/history.index differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/STM32F10x_StdPeriph_Lib_V3.5.0/.indexes/87/13/9/79/61/1e/properties.index b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/STM32F10x_StdPeriph_Lib_V3.5.0/.indexes/87/13/9/79/61/1e/properties.index new file mode 100644 index 0000000..58f85ed Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/STM32F10x_StdPeriph_Lib_V3.5.0/.indexes/87/13/9/79/61/1e/properties.index differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/STM32F10x_StdPeriph_Lib_V3.5.0/.indexes/87/3f/de/properties.index b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/STM32F10x_StdPeriph_Lib_V3.5.0/.indexes/87/3f/de/properties.index new file mode 100644 index 0000000..e007ed1 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/STM32F10x_StdPeriph_Lib_V3.5.0/.indexes/87/3f/de/properties.index differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/STM32F10x_StdPeriph_Lib_V3.5.0/.indexes/history.index b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/STM32F10x_StdPeriph_Lib_V3.5.0/.indexes/history.index new file mode 100644 index 0000000..bb0c9ec Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/STM32F10x_StdPeriph_Lib_V3.5.0/.indexes/history.index differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/STM32F10x_StdPeriph_Lib_V3.5.0/.indexes/properties.index b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/STM32F10x_StdPeriph_Lib_V3.5.0/.indexes/properties.index new file mode 100644 index 0000000..c821460 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/STM32F10x_StdPeriph_Lib_V3.5.0/.indexes/properties.index differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/STM32F10x_StdPeriph_Lib_V3.5.0/.markers b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/STM32F10x_StdPeriph_Lib_V3.5.0/.markers new file mode 100644 index 0000000..75af793 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/STM32F10x_StdPeriph_Lib_V3.5.0/.markers differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/STM32F10x_StdPeriph_Lib_V3.5.0/.syncinfo b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/STM32F10x_StdPeriph_Lib_V3.5.0/.syncinfo new file mode 100644 index 0000000..5c5d295 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/STM32F10x_StdPeriph_Lib_V3.5.0/.syncinfo differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/hsb-mrts/.indexes/83/properties.index b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/hsb-mrts/.indexes/83/properties.index new file mode 100644 index 0000000..1464024 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/hsb-mrts/.indexes/83/properties.index differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/hsb-mrts/.indexes/d9/history.index b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/hsb-mrts/.indexes/d9/history.index new file mode 100644 index 0000000..f05063f Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/hsb-mrts/.indexes/d9/history.index differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/hsb-mrts/.indexes/de/history.index b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/hsb-mrts/.indexes/de/history.index new file mode 100644 index 0000000..3b4bcb5 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/hsb-mrts/.indexes/de/history.index differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/hsb-mrts/.indexes/de/properties.index b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/hsb-mrts/.indexes/de/properties.index new file mode 100644 index 0000000..7d94138 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/hsb-mrts/.indexes/de/properties.index differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/hsb-mrts/.indexes/e4/history.index b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/hsb-mrts/.indexes/e4/history.index new file mode 100644 index 0000000..7cc9082 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/hsb-mrts/.indexes/e4/history.index differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/hsb-mrts/.indexes/history.index b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/hsb-mrts/.indexes/history.index new file mode 100644 index 0000000..3b8f370 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/hsb-mrts/.indexes/history.index differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/hsb-mrts/.indexes/properties.index b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/hsb-mrts/.indexes/properties.index new file mode 100644 index 0000000..355a2be Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/hsb-mrts/.indexes/properties.index differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/hsb-mrts/.markers b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/hsb-mrts/.markers new file mode 100644 index 0000000..117414b Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/hsb-mrts/.markers differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/hsb-mrts/.syncinfo b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/hsb-mrts/.syncinfo new file mode 100644 index 0000000..65fca44 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.projects/hsb-mrts/.syncinfo differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/history.version b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/history.version new file mode 100644 index 0000000..25cb955 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/history.version @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index new file mode 100644 index 0000000..fd0f831 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.version b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.version new file mode 100644 index 0000000..6b2aaa7 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.version @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.root/5.tree b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.root/5.tree new file mode 100644 index 0000000..9007738 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.root/5.tree differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources new file mode 100644 index 0000000..b6c7c61 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/com.collabnet.subversion.merge.prefs b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/com.collabnet.subversion.merge.prefs new file mode 100644 index 0000000..4074305 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/com.collabnet.subversion.merge.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +merge_provider_set=true diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prefs b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prefs new file mode 100644 index 0000000..0060de0 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prefs @@ -0,0 +1,165 @@ +eclipse.preferences.version=1 +macros/workspace=\r\n\r\n +org.eclipse.cdt.core.formatter.alignment_for_arguments_in_method_invocation=16 +org.eclipse.cdt.core.formatter.alignment_for_assignment=48 +org.eclipse.cdt.core.formatter.alignment_for_base_clause_in_type_declaration=80 +org.eclipse.cdt.core.formatter.alignment_for_binary_expression=48 +org.eclipse.cdt.core.formatter.alignment_for_compact_if=16 +org.eclipse.cdt.core.formatter.alignment_for_conditional_expression=50 +org.eclipse.cdt.core.formatter.alignment_for_conditional_expression_chain=18 +org.eclipse.cdt.core.formatter.alignment_for_constructor_initializer_list=0 +org.eclipse.cdt.core.formatter.alignment_for_declarator_list=16 +org.eclipse.cdt.core.formatter.alignment_for_enumerator_list=49 +org.eclipse.cdt.core.formatter.alignment_for_expression_list=0 +org.eclipse.cdt.core.formatter.alignment_for_expressions_in_array_initializer=48 +org.eclipse.cdt.core.formatter.alignment_for_member_access=48 +org.eclipse.cdt.core.formatter.alignment_for_overloaded_left_shift_chain=48 +org.eclipse.cdt.core.formatter.alignment_for_parameters_in_method_declaration=16 +org.eclipse.cdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 +org.eclipse.cdt.core.formatter.brace_position_for_array_initializer=end_of_line +org.eclipse.cdt.core.formatter.brace_position_for_block=next_line +org.eclipse.cdt.core.formatter.brace_position_for_block_in_case=next_line +org.eclipse.cdt.core.formatter.brace_position_for_method_declaration=next_line +org.eclipse.cdt.core.formatter.brace_position_for_namespace_declaration=next_line +org.eclipse.cdt.core.formatter.brace_position_for_switch=next_line +org.eclipse.cdt.core.formatter.brace_position_for_type_declaration=next_line +org.eclipse.cdt.core.formatter.comment.line_up_line_comment_in_blocks_on_first_column=false +org.eclipse.cdt.core.formatter.comment.min_distance_between_code_and_line_comment=3 +org.eclipse.cdt.core.formatter.comment.never_indent_line_comments_on_first_column=true +org.eclipse.cdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=true +org.eclipse.cdt.core.formatter.compact_else_if=true +org.eclipse.cdt.core.formatter.continuation_indentation=3 +org.eclipse.cdt.core.formatter.continuation_indentation_for_array_initializer=3 +org.eclipse.cdt.core.formatter.format_guardian_clause_on_one_line=false +org.eclipse.cdt.core.formatter.indent_access_specifier_compare_to_type_header=false +org.eclipse.cdt.core.formatter.indent_access_specifier_extra_spaces=0 +org.eclipse.cdt.core.formatter.indent_body_declarations_compare_to_access_specifier=true +org.eclipse.cdt.core.formatter.indent_body_declarations_compare_to_namespace_header=true +org.eclipse.cdt.core.formatter.indent_breaks_compare_to_cases=true +org.eclipse.cdt.core.formatter.indent_declaration_compare_to_template_header=false +org.eclipse.cdt.core.formatter.indent_empty_lines=false +org.eclipse.cdt.core.formatter.indent_statements_compare_to_block=true +org.eclipse.cdt.core.formatter.indent_statements_compare_to_body=true +org.eclipse.cdt.core.formatter.indent_switchstatements_compare_to_cases=true +org.eclipse.cdt.core.formatter.indent_switchstatements_compare_to_switch=true +org.eclipse.cdt.core.formatter.indentation.size=3 +org.eclipse.cdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert +org.eclipse.cdt.core.formatter.insert_new_line_after_template_declaration=do not insert +org.eclipse.cdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert +org.eclipse.cdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert +org.eclipse.cdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert +org.eclipse.cdt.core.formatter.insert_new_line_before_colon_in_constructor_initializer_list=do not insert +org.eclipse.cdt.core.formatter.insert_new_line_before_else_in_if_statement=insert +org.eclipse.cdt.core.formatter.insert_new_line_before_identifier_in_function_declaration=do not insert +org.eclipse.cdt.core.formatter.insert_new_line_before_while_in_do_statement=insert +org.eclipse.cdt.core.formatter.insert_new_line_in_empty_block=insert +org.eclipse.cdt.core.formatter.insert_space_after_assignment_operator=insert +org.eclipse.cdt.core.formatter.insert_space_after_binary_operator=insert +org.eclipse.cdt.core.formatter.insert_space_after_closing_angle_bracket_in_template_arguments=insert +org.eclipse.cdt.core.formatter.insert_space_after_closing_angle_bracket_in_template_parameters=insert +org.eclipse.cdt.core.formatter.insert_space_after_closing_brace_in_block=insert +org.eclipse.cdt.core.formatter.insert_space_after_closing_paren_in_cast=insert +org.eclipse.cdt.core.formatter.insert_space_after_colon_in_base_clause=insert +org.eclipse.cdt.core.formatter.insert_space_after_colon_in_case=insert +org.eclipse.cdt.core.formatter.insert_space_after_colon_in_conditional=insert +org.eclipse.cdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert +org.eclipse.cdt.core.formatter.insert_space_after_comma_in_array_initializer=insert +org.eclipse.cdt.core.formatter.insert_space_after_comma_in_base_types=insert +org.eclipse.cdt.core.formatter.insert_space_after_comma_in_declarator_list=insert +org.eclipse.cdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert +org.eclipse.cdt.core.formatter.insert_space_after_comma_in_expression_list=insert +org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert +org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert +org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert +org.eclipse.cdt.core.formatter.insert_space_after_comma_in_template_arguments=insert +org.eclipse.cdt.core.formatter.insert_space_after_comma_in_template_parameters=insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_angle_bracket_in_template_arguments=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_angle_bracket_in_template_parameters=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_bracket=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_exception_specification=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_postfix_operator=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_prefix_operator=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_question_in_conditional=insert +org.eclipse.cdt.core.formatter.insert_space_after_semicolon_in_for=insert +org.eclipse.cdt.core.formatter.insert_space_after_unary_operator=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_assignment_operator=insert +org.eclipse.cdt.core.formatter.insert_space_before_binary_operator=insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_angle_bracket_in_template_arguments=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_angle_bracket_in_template_parameters=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_bracket=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_exception_specification=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_colon_in_base_clause=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_colon_in_case=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_colon_in_conditional=insert +org.eclipse.cdt.core.formatter.insert_space_before_colon_in_default=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_comma_in_base_types=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_comma_in_declarator_list=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_comma_in_expression_list=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_comma_in_template_arguments=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_comma_in_template_parameters=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_angle_bracket_in_template_arguments=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_angle_bracket_in_template_parameters=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_block=insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_namespace_declaration=insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_switch=insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_bracket=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_catch=insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_exception_specification=insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_for=insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_if=insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_switch=insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_while=insert +org.eclipse.cdt.core.formatter.insert_space_before_postfix_operator=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_prefix_operator=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_question_in_conditional=insert +org.eclipse.cdt.core.formatter.insert_space_before_semicolon=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_semicolon_in_for=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_unary_operator=do not insert +org.eclipse.cdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert +org.eclipse.cdt.core.formatter.insert_space_between_empty_brackets=do not insert +org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_exception_specification=do not insert +org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert +org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert +org.eclipse.cdt.core.formatter.join_wrapped_lines=true +org.eclipse.cdt.core.formatter.keep_else_statement_on_same_line=false +org.eclipse.cdt.core.formatter.keep_empty_array_initializer_on_one_line=false +org.eclipse.cdt.core.formatter.keep_imple_if_on_one_line=false +org.eclipse.cdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.cdt.core.formatter.lineSplit=80 +org.eclipse.cdt.core.formatter.number_of_empty_lines_to_preserve=1 +org.eclipse.cdt.core.formatter.put_empty_statement_on_new_line=true +org.eclipse.cdt.core.formatter.tabulation.char=space +org.eclipse.cdt.core.formatter.tabulation.size=3 +org.eclipse.cdt.core.formatter.use_tabs_only_for_leading_indentations=false diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-FreeRTOS.prefs b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-FreeRTOS.prefs new file mode 100644 index 0000000..7d12f1d --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-FreeRTOS.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +indexer/preferenceScope=0 diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-HAL.prefs b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-HAL.prefs new file mode 100644 index 0000000..7d12f1d --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-HAL.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +indexer/preferenceScope=0 diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-STM32F10x_StdPeriph_Lib_V3.5.0.prefs b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-STM32F10x_StdPeriph_Lib_V3.5.0.prefs new file mode 100644 index 0000000..7d12f1d --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-STM32F10x_StdPeriph_Lib_V3.5.0.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +indexer/preferenceScope=0 diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-hsb-mrts.prefs b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-hsb-mrts.prefs new file mode 100644 index 0000000..7d12f1d --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-hsb-mrts.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +indexer/preferenceScope=0 diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.core.prefs b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.core.prefs new file mode 100644 index 0000000..724146f --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.core.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.cdt.debug.core.cDebug.default_source_containers=\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.managedbuilder.core.prefs b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.managedbuilder.core.prefs new file mode 100644 index 0000000..f220b9d --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.managedbuilder.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +properties/FreeRTOS.org.eclipse.linuxtools.cdt.autotools.core.projectType.543007746/org.eclipse.linuxtools.cdt.autotools.core.configuration.build.1536349016=org.eclipse.linuxtools.cdt.autotools.core.toolchain.tool.gcc.1795857602\=rebuildState\\\=true\\r\\n\r\norg.eclipse.linuxtools.cdt.autotools.core.toolChain.30745442\=rebuildState\\\=true\\r\\n\r\norg.eclipse.linuxtools.cdt.autotools.core.toolchain.tool.gpp.1325878131\=rebuildState\\\=true\\r\\n\r\norg.eclipse.linuxtools.cdt.autotools.core.gnu.toolchain.tool.configure.1445259143\=rebuildState\\\=true\\r\\n\r\norg.eclipse.linuxtools.cdt.autotools.core.toolchain.tool.autogen.117759401\=rebuildState\\\=true\\r\\n\r\n +properties/FreeRTOS.org.eclipse.linuxtools.cdt.autotools.core.projectType.543007746/org.eclipse.linuxtools.cdt.autotools.core.configuration.build.debug.332054967=org.eclipse.linuxtools.cdt.autotools.core.toolchain.tool.autogen.debug.1918587728\=rebuildState\\\=true\\r\\n\r\norg.eclipse.linuxtools.cdt.autotools.core.gnu.toolchain.tool.configure.debug.1383100820\=rebuildState\\\=true\\r\\n\r\norg.eclipse.linuxtools.cdt.autotools.core.toolChain.debug.1944823517\=rebuildState\\\=true\\r\\n\r\norg.eclipse.linuxtools.cdt.autotools.core.toolchain.tool.gpp.debug.1826739607\=rebuildState\\\=true\\r\\n\r\norg.eclipse.linuxtools.cdt.autotools.core.toolchain.tool.gcc.debug.584935025\=rebuildState\\\=true\\r\\n\r\n +properties/HAL.cdt.managedbuild.target.gnu.cross.exe.367513140/cdt.managedbuild.config.gnu.cross.exe.debug.808293012=cdt.managedbuild.tool.gnu.cross.assembler.1818948421\=rebuildState\\\=true\\r\\n\r\ncdt.managedbuild.tool.gnu.cross.c.linker.1003659599\=rebuildState\\\=true\\r\\n\r\ncdt.managedbuild.tool.gnu.cross.c.compiler.1995230970\=rebuildState\\\=true\\r\\n\r\ncdt.managedbuild.toolchain.gnu.cross.exe.debug.1318348185\=rebuildState\\\=true\\r\\n\r\ncdt.managedbuild.tool.gnu.cross.cpp.linker.1501417995\=rebuildState\\\=true\\r\\n\r\ncdt.managedbuild.tool.gnu.cross.archiver.677013732\=rebuildState\\\=true\\r\\n\r\ncdt.managedbuild.tool.gnu.cross.cpp.compiler.1635882225\=rebuildState\\\=true\\r\\n\r\n +properties/HAL.cdt.managedbuild.target.gnu.cross.exe.367513140/cdt.managedbuild.config.gnu.cross.exe.release.2018673829=cdt.managedbuild.tool.gnu.cross.c.compiler.719739142\=rebuildState\\\=true\\r\\n\r\ncdt.managedbuild.tool.gnu.cross.assembler.45934214\=rebuildState\\\=true\\r\\n\r\ncdt.managedbuild.tool.gnu.cross.cpp.linker.1782762600\=rebuildState\\\=true\\r\\n\r\ncdt.managedbuild.tool.gnu.cross.archiver.569554356\=rebuildState\\\=true\\r\\n\r\ncdt.managedbuild.tool.gnu.cross.c.linker.1056791212\=rebuildState\\\=true\\r\\n\r\ncdt.managedbuild.tool.gnu.cross.cpp.compiler.69898473\=rebuildState\\\=true\\r\\n\r\ncdt.managedbuild.toolchain.gnu.cross.exe.release.1626704719\=rebuildState\\\=true\\r\\n\r\n +properties/STM32F10x_StdPeriph_Lib_V3.5.0.fr.ac6.managedbuild.target.gnu.cross.lib.243299400/fr.ac6.managedbuild.config.gnu.cross.lib.debug.1184269162=fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.1987386755\=rebuildState\\\=true\\r\\n\r\nfr.ac6.managedbuild.toolchain.gnu.cross.lib.debug.1972463636\=rebuildState\\\=true\\r\\n\r\nfr.ac6.managedbuild.tool.gnu.cross.assembler.1422610337\=rebuildState\\\=true\\r\\n\r\nfr.ac6.managedbuild.tool.gnu.cross.c.compiler.39940596\=rebuildState\\\=true\\r\\n\r\nfr.ac6.managedbuild.tool.gnu.archiver.951247379\=rebuildState\\\=true\\r\\n\r\nfr.ac6.managedbuild.tool.gnu.cross.cpp.linker.1520221251\=rebuildState\\\=false\\r\\n\r\nfr.ac6.managedbuild.config.gnu.cross.lib.debug.1184269162\=rcState\\\=0\\r\\nrebuildState\\\=false\\r\\n\r\nfr.ac6.managedbuild.tool.gnu.archiver.272690289\=rebuildState\\\=false\\r\\n\r\nfr.ac6.managedbuild.tool.gnu.cross.c.compiler.1613643374\=rebuildState\\\=false\\r\\n\r\nfr.ac6.managedbuild.tool.gnu.cross.c.linker.1140670151\=rebuildState\\\=false\\r\\n\r\nfr.ac6.managedbuild.tool.gnu.cross.c.linker.1754661052\=rebuildState\\\=true\\r\\n\r\nfr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.918500295\=rebuildState\\\=false\\r\\n\r\nfr.ac6.managedbuild.toolchain.gnu.cross.lib.debug.2114627145\=rebuildState\\\=false\\r\\n\r\nfr.ac6.managedbuild.tool.gnu.cross.assembler.1260338145\=rebuildState\\\=false\\r\\n\r\nfr.ac6.managedbuild.tool.gnu.cross.cpp.linker.895208798\=rebuildState\\\=true\\r\\n\r\n +properties/STM32F10x_StdPeriph_Lib_V3.5.0.fr.ac6.managedbuild.target.gnu.cross.lib.243299400/fr.ac6.managedbuild.config.gnu.cross.lib.release.1916447490=fr.ac6.managedbuild.tool.gnu.cross.cpp.linker.187732145\=rebuildState\\\=true\\r\\n\r\nfr.ac6.managedbuild.tool.gnu.cross.c.compiler.1703001730\=rebuildState\\\=true\\r\\n\r\nfr.ac6.managedbuild.toolchain.gnu.cross.lib.release.1756751466\=rebuildState\\\=true\\r\\n\r\nfr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.404864888\=rebuildState\\\=true\\r\\n\r\nfr.ac6.managedbuild.tool.gnu.archiver.1778730396\=rebuildState\\\=true\\r\\n\r\nfr.ac6.managedbuild.tool.gnu.cross.c.linker.1118780662\=rebuildState\\\=true\\r\\n\r\nfr.ac6.managedbuild.tool.gnu.cross.assembler.2024433090\=rebuildState\\\=true\\r\\n\r\n +properties/hsb-mrts.fr.ac6.managedbuild.target.gnu.cross.exe.489922077/fr.ac6.managedbuild.config.gnu.cross.exe.debug.814944186=fr.ac6.managedbuild.tool.gnu.archiver.1257660188\=rebuildState\\\=false\\r\\n\r\nfr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.411048122\=rebuildState\\\=false\\r\\n\r\nfr.ac6.managedbuild.tool.gnu.cross.cpp.linker.75142976\=rebuildState\\\=false\\r\\n\r\nfr.ac6.managedbuild.tool.gnu.cross.c.compiler.1021623787\=rebuildState\\\=false\\r\\n\r\nfr.ac6.managedbuild.tool.gnu.cross.assembler.1212982284\=rebuildState\\\=false\\r\\n\r\nfr.ac6.managedbuild.tool.gnu.cross.c.linker.1527324290\=rebuildState\\\=false\\r\\n\r\nfr.ac6.managedbuild.config.gnu.cross.exe.debug.814944186\=rcState\\\=0\\r\\nrebuildState\\\=false\\r\\n\r\nfr.ac6.managedbuild.toolchain.gnu.cross.exe.debug.876257254\=rebuildState\\\=false\\r\\n\r\n +properties/hsb-mrts.fr.ac6.managedbuild.target.gnu.cross.exe.489922077/fr.ac6.managedbuild.config.gnu.cross.exe.release.1149120676=fr.ac6.managedbuild.tool.gnu.cross.assembler.1446085907\=rebuildState\\\=true\\r\\n\r\nfr.ac6.managedbuild.tool.gnu.cross.cpp.linker.121711263\=rebuildState\\\=true\\r\\n\r\nfr.ac6.managedbuild.tool.gnu.cross.c.compiler.1306912163\=rebuildState\\\=true\\r\\n\r\nfr.ac6.managedbuild.toolchain.gnu.cross.exe.release.1805220061\=rebuildState\\\=true\\r\\n\r\nfr.ac6.managedbuild.tool.gnu.archiver.1919128253\=rebuildState\\\=true\\r\\n\r\nfr.ac6.managedbuild.tool.gnu.cross.c.linker.224864187\=rebuildState\\\=true\\r\\n\r\nfr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.196866618\=rebuildState\\\=true\\r\\n\r\n +properties/hsb-mrts.fr.ac6.managedbuild.target.gnu.cross.exe.670455480/fr.ac6.managedbuild.config.gnu.cross.exe.debug.1979781449=fr.ac6.managedbuild.tool.gnu.cross.assembler.1298815189\=rebuildState\\\=true\\r\\n\r\nfr.ac6.managedbuild.tool.gnu.cross.cpp.linker.788168363\=rebuildState\\\=true\\r\\n\r\nfr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.1622150698\=rebuildState\\\=true\\r\\n\r\nfr.ac6.managedbuild.toolchain.gnu.cross.exe.debug.1048898658\=rebuildState\\\=true\\r\\n\r\nfr.ac6.managedbuild.tool.gnu.archiver.1229117315\=rebuildState\\\=true\\r\\n\r\nfr.ac6.managedbuild.tool.gnu.cross.c.linker.33048286\=rebuildState\\\=true\\r\\n\r\nfr.ac6.managedbuild.tool.gnu.cross.c.compiler.1167520026\=rebuildState\\\=true\\r\\n\r\n +properties/hsb-mrts.fr.ac6.managedbuild.target.gnu.cross.exe.670455480/fr.ac6.managedbuild.config.gnu.cross.exe.release.231620935=fr.ac6.managedbuild.tool.gnu.cross.c.linker.1182053484\=rebuildState\\\=true\\r\\n\r\nfr.ac6.managedbuild.tool.gnu.cross.c.compiler.1755995875\=rebuildState\\\=true\\r\\n\r\nfr.ac6.managedbuild.toolchain.gnu.cross.exe.release.1560305293\=rebuildState\\\=true\\r\\n\r\nfr.ac6.managedbuild.tool.gnu.cross.cpp.linker.2113801229\=rebuildState\\\=true\\r\\n\r\nfr.ac6.managedbuild.tool.gnu.archiver.2046976137\=rebuildState\\\=true\\r\\n\r\nfr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.1222092431\=rebuildState\\\=true\\r\\n\r\nfr.ac6.managedbuild.tool.gnu.cross.assembler.1589554475\=rebuildState\\\=true\\r\\n\r\n diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.mylyn.ui.prefs b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.mylyn.ui.prefs new file mode 100644 index 0000000..e3ffb59 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.mylyn.ui.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.mylyn.cdt.ui.run.count.3_3_0=1 diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.ui.prefs b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.ui.prefs new file mode 100644 index 0000000..bf811cb --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.ui.prefs @@ -0,0 +1,15 @@ +content_assist_disabled_computers=org.eclipse.cdt.ui.textProposalCategory\u0000org.eclipse.cdt.ui.parserProposalCategory\u0000 +eclipse.preferences.version=1 +formatter_profile=_MicroKey +formatter_settings_version=1 +org.eclipse.cdt.ui.formatterprofiles=\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n +org.eclipse.cdt.ui.formatterprofiles.version=1 +org.eclipse.cdt.ui.text.custom_code_templates= +org.eclipse.cdt.ui.text.templates.custom= +scalability.detect=false +scalability.numberOfLines=10000 +sourceHoverBackgroundColor=255,255,255 +spelling_locale=en_GB +spelling_locale_initialized=true +useAnnotationsPrefPage=true +useQuickDiffPrefPage=true diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.ui.prj-STM32F10x_StdPeriph_Lib_V3.5.0.prefs b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.ui.prj-STM32F10x_StdPeriph_Lib_V3.5.0.prefs new file mode 100644 index 0000000..6f2dd82 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.ui.prj-STM32F10x_StdPeriph_Lib_V3.5.0.prefs @@ -0,0 +1,3 @@ +buildConsole/keepLog=true +buildConsole/logLocation=C\:\\workspace\\0387-hsb-mrts\\trunk\\S - Software\\0 - HSB MRTS Kathode-MCP\\3 - Implementation\\0 - Code\\.metadata\\.plugins\\org.eclipse.cdt.ui\\STM32F10x_StdPeriph_Lib_V3.5.0.build.log +eclipse.preferences.version=1 diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.ui.prj-hsb-mrts.prefs b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.ui.prj-hsb-mrts.prefs new file mode 100644 index 0000000..8a30f11 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.ui.prj-hsb-mrts.prefs @@ -0,0 +1,3 @@ +buildConsole/keepLog=true +buildConsole/logLocation=C\:\\workspace\\0387-hsb-mrts\\trunk\\S - Software\\0 - HSB MRTS Kathode-MCP\\3 - Implementation\\0 - Code\\.metadata\\.plugins\\org.eclipse.cdt.ui\\hsb-mrts.build.log +eclipse.preferences.version=1 diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..77fe583 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +version=1 diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.core.prefs b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.core.prefs new file mode 100644 index 0000000..7dd2b38 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.core.prefs @@ -0,0 +1,5 @@ +//org.eclipse.debug.core.PREFERRED_DELEGATES/org.eclipse.cdt.launch.applicationLaunchType=org.eclipse.cdt.dsf.gdb.launch.localCLaunch,debug,;org.eclipse.cdt.cdi.launch.localCLaunch,run,; +//org.eclipse.debug.core.PREFERRED_DELEGATES/org.eclipse.cdt.launch.attachLaunchType=org.eclipse.cdt.dsf.gdb.launch.attachCLaunch,debug,; +//org.eclipse.debug.core.PREFERRED_DELEGATES/org.eclipse.cdt.launch.postmortemLaunchType=org.eclipse.cdt.dsf.gdb.launch.coreCLaunch,debug,; +//org.eclipse.debug.core.PREFERRED_DELEGATES/org.eclipse.cdt.launch.remoteApplicationLaunchType=org.eclipse.rse.remotecdt.dsf.debug,debug,; +eclipse.preferences.version=1 diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs new file mode 100644 index 0000000..c78fbce --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +org.eclipse.debug.ui.PREF_LAUNCH_PERSPECTIVES=\r\n\r\n +preferredTargets=default\:default|org.eclipse.cdt.debug.ui.toggleCBreakpointTarget,org.eclipse.cdt.debug.ui.toggleCDynamicPrintfTarget\:org.eclipse.cdt.debug.ui.toggleCBreakpointTarget| diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.epp.logging.aeri.ide.prefs b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.epp.logging.aeri.ide.prefs new file mode 100644 index 0000000..e05bd26 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.epp.logging.aeri.ide.prefs @@ -0,0 +1,6 @@ +configured=true +eclipse.preferences.version=1 +resetSendMode=KEEP +resetSendModeOn=0 +sendMode=NOTIFY +servers/org.eclipse.epp.logging.aeri.ide.server/configured=true diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.epp.mpc.ui.prefs b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.epp.mpc.ui.prefs new file mode 100644 index 0000000..07fc8d3 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.epp.mpc.ui.prefs @@ -0,0 +1,2 @@ +CatalogDescriptor=http\://marketplace.eclipse.org +eclipse.preferences.version=1 diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.context.core.prefs b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.context.core.prefs new file mode 100644 index 0000000..e5a71f2 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.context.core.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +mylyn.attention.migrated=true diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.monitor.ui.prefs b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.monitor.ui.prefs new file mode 100644 index 0000000..e0b8c16 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.monitor.ui.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.mylyn.monitor.activity.tracking.enabled.checked=true diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.tasks.ui.prefs b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.tasks.ui.prefs new file mode 100644 index 0000000..38bfe05 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.tasks.ui.prefs @@ -0,0 +1,4 @@ +eclipse.preferences.version=1 +migrated.task.repositories.secure.store=true +org.eclipse.mylyn.tasks.ui.filters.nonmatching=true +org.eclipse.mylyn.tasks.ui.filters.nonmatching.encouraged=true diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.rse.core.prefs b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.rse.core.prefs new file mode 100644 index 0000000..d86aa21 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.rse.core.prefs @@ -0,0 +1,4 @@ +activeuserprofiles=PC33;Team +eclipse.preferences.version=1 +org.eclipse.rse.systemtype.local.systemType.defaultUserId=mmi +useridperkey=PC33.Local\=mmi; diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.rse.ui.prefs b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.rse.ui.prefs new file mode 100644 index 0000000..76bbb90 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.rse.ui.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.rse.preferences.order.connections=PC33.Local diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.team.svn.core.prefs b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.team.svn.core.prefs new file mode 100644 index 0000000..fab6f5a --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.team.svn.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +externalMigrateFromAuthorizationDatabase/isMigrated=true +migrateFromAuthorizationDatabase/isMigrated=true diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.team.ui.prefs b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.team.ui.prefs new file mode 100644 index 0000000..848e263 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.team.ui.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.team.ui.first_time=false diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.editors.prefs b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.editors.prefs new file mode 100644 index 0000000..a6c2629 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.editors.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +overviewRuler_migration=migrated_3.1 diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.ide.prefs b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.ide.prefs new file mode 100644 index 0000000..16b52e6 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.ide.prefs @@ -0,0 +1,5 @@ +PROBLEMS_FILTERS_MIGRATE=true +eclipse.preferences.version=1 +platformState=1494321635359 +quickStart=false +tipsAndTricks=true diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs new file mode 100644 index 0000000..ce3976a --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs @@ -0,0 +1,2 @@ +//org.eclipse.ui.commands/state/org.eclipse.ui.navigator.resources.nested.changeProjectPresentation/org.eclipse.ui.commands.radioState=false +eclipse.preferences.version=1 diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.wst.sse.ui.prefs b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.wst.sse.ui.prefs new file mode 100644 index 0000000..de4590e --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.wst.sse.ui.prefs @@ -0,0 +1,4 @@ +content_assist_number_of_computers=2 +eclipse.preferences.version=1 +useAnnotationsPrefPage=true +useQuickDiffPrefPage=true diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.tigris.subversion.subclipse.tools.usage.prefs b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.tigris.subversion.subclipse.tools.usage.prefs new file mode 100644 index 0000000..4be872f --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.tigris.subversion.subclipse.tools.usage.prefs @@ -0,0 +1,3 @@ +allow_usage_report_preference=true +ask_user_for_usage_report_preference=false +eclipse.preferences.version=1 diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.tigris.subversion.subclipse.ui.prefs b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.tigris.subversion.subclipse.ui.prefs new file mode 100644 index 0000000..4d9645b --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.tigris.subversion.subclipse.ui.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +pref_merge_provider=CollabNet Desktop diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi new file mode 100644 index 0000000..7112d2c --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi @@ -0,0 +1,2677 @@ + + + + activeSchemeId:org.eclipse.ui.defaultAcceleratorConfiguration + ModelMigrationProcessor.001 + + + + + + + + topLevel + shellMaximized + + + + + persp.actionSet:org.eclipse.mylyn.doc.actionSet + persp.actionSet:org.eclipse.mylyn.tasks.ui.navigation + persp.actionSet:org.eclipse.ui.cheatsheets.actionSet + persp.actionSet:org.eclipse.rse.core.search.searchActionSet + persp.actionSet:org.eclipse.search.searchActionSet + persp.actionSet:org.eclipse.ui.edit.text.actionSet.annotationNavigation + persp.actionSet:org.eclipse.ui.edit.text.actionSet.navigation + persp.actionSet:org.eclipse.ui.edit.text.actionSet.convertLineDelimitersTo + persp.actionSet:org.eclipse.ui.externaltools.ExternalToolsSet + persp.actionSet:org.eclipse.ui.actionSet.keyBindings + persp.actionSet:org.eclipse.ui.actionSet.openFiles + persp.actionSet:org.eclipse.cdt.ui.SearchActionSet + persp.actionSet:org.eclipse.cdt.ui.CElementCreationActionSet + persp.actionSet:org.eclipse.ui.NavigateActionSet + persp.viewSC:org.eclipse.ui.console.ConsoleView + persp.viewSC:org.eclipse.search.ui.views.SearchView + persp.viewSC:org.eclipse.ui.views.ContentOutline + persp.viewSC:org.eclipse.ui.views.ProblemView + persp.viewSC:org.eclipse.cdt.ui.CView + persp.viewSC:org.eclipse.ui.views.ResourceNavigator + persp.viewSC:org.eclipse.ui.views.PropertySheet + persp.viewSC:org.eclipse.ui.views.TaskList + persp.newWizSC:org.eclipse.cdt.autotools.ui.wizards.conversionWizard + persp.newWizSC:org.eclipse.cdt.ui.wizards.ConvertToMakeWizard + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewMakeFromExisting + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewCWizard1 + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewCWizard2 + persp.newWizSC:org.eclipse.cdt.ui.wizard.project + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewSourceFolderCreationWizard + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewFolderCreationWizard + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewSourceFileCreationWizard + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewHeaderFileCreationWizard + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewFileCreationWizard + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewClassCreationWizard + persp.showIn:org.eclipse.cdt.codan.internal.ui.views.ProblemDetails + persp.viewSC:org.eclipse.cdt.codan.internal.ui.views.ProblemDetails + persp.actionSet:org.eclipse.debug.ui.breakpointActionSet + persp.viewSC:org.eclipse.cdt.make.ui.views.MakeView + persp.actionSet:org.eclipse.cdt.make.ui.makeTargetActionSet + persp.perspSC:org.eclipse.debug.ui.DebugPerspective + persp.perspSC:org.eclipse.team.ui.TeamSynchronizingPerspective + persp.actionSet:org.eclipse.debug.ui.launchActionSet + persp.actionSet:org.eclipse.cdt.ui.buildConfigActionSet + persp.actionSet:org.eclipse.cdt.ui.NavigationActionSet + persp.actionSet:org.eclipse.cdt.ui.OpenActionSet + persp.actionSet:org.eclipse.cdt.ui.CodingActionSet + persp.actionSet:org.eclipse.ui.edit.text.actionSet.presentation + persp.showIn:org.eclipse.cdt.ui.includeBrowser + persp.showIn:org.eclipse.cdt.ui.CView + persp.showIn:org.eclipse.ui.navigator.ProjectExplorer + persp.viewSC:org.eclipse.ui.navigator.ProjectExplorer + persp.viewSC:org.eclipse.cdt.ui.includeBrowser + persp.actionSet:org.eclipse.debug.ui.profileActionSet + persp.viewSC:org.eclipse.mylyn.tasks.ui.views.tasks + persp.newWizSC:org.eclipse.mylyn.tasks.ui.wizards.new.repository.task + + + active + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + View + categoryTag:Help + + + + + + View + categoryTag:General + + ViewMenu + menuContribution:menu + + + + + + + View + categoryTag:Help + + + + + + Editor + org.eclipse.cdt.make.editor + removeOnHide + + + + Editor + org.eclipse.cdt.ui.editor.CEditor + removeOnHide + + + + Editor + org.eclipse.cdt.ui.editor.CEditor + removeOnHide + + + + Editor + org.eclipse.cdt.ui.editor.CEditor + removeOnHide + + + + + + + + View + categoryTag:General + active + activeOnClose + + ViewMenu + menuContribution:menu + + + + + + + View + categoryTag:C/C++ + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + + View + categoryTag:General + + ViewMenu + menuContribution:menu + + + + + + + View + categoryTag:General + + + + + + View + categoryTag:General + + ViewMenu + menuContribution:menu + + + + + + + View + categoryTag:General + + + + + + View + categoryTag:General + + ViewMenu + menuContribution:menu + + + + + + + + View + categoryTag:Make + + ViewMenu + menuContribution:menu + + + + + + + View + categoryTag:Mylyn + + + + toolbarSeparator + + + + Draggable + + + + toolbarSeparator + + + + Draggable + + + Draggable + + + Draggable + + + Draggable + + + toolbarSeparator + + + + Draggable + + + + toolbarSeparator + + + + toolbarSeparator + + + + Draggable + + + stretch + SHOW_RESTORE_MENU + + + Draggable + HIDEABLE + SHOW_RESTORE_MENU + + + + + stretch + + + Draggable + + + Draggable + + + + + Draggable + + + + + TrimStack + Draggable + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + platform:win32 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + platform:win32 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Editor + + + + + View + categoryTag:C/C++ + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Make + + + + + View + categoryTag:C/C++ + + + + + View + categoryTag:C/C++ + + + + + View + categoryTag:C/C++ + + + + + View + categoryTag:C/C++ + + + + + View + categoryTag:C/C++ + + + + + View + categoryTag:General + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Git + + + + + View + categoryTag:Git + + + + + View + categoryTag:Git + + + + + View + categoryTag:Git + + + + + View + categoryTag:Git + + + + + View + categoryTag:Help + + + + + View + categoryTag:Charts + + + + + View + categoryTag:Profiling + + + + + View + categoryTag:Profiling + + + + + View + categoryTag:Profiling + + + + + View + categoryTag:Mylyn + + + + + View + categoryTag:Mylyn + + + + + View + categoryTag:Oomph + + + + + View + categoryTag:Connections + + + + + View + categoryTag:Remote Systems + + + + + View + categoryTag:Remote Systems + + + + + View + categoryTag:Remote Systems + + + + + View + categoryTag:Remote Systems + + + + + View + categoryTag:Remote Systems + + + + + View + categoryTag:Remote Systems + + + + + View + categoryTag:Remote Systems + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:Team + + + + + View + categoryTag:Team + + + + + View + categoryTag:LTTng + + + + + View + categoryTag:Tracing + + + + + View + categoryTag:LTTng + + + + + View + categoryTag:LTTng + + + + + View + categoryTag:LTTng + + + + + View + categoryTag:LTTng + + + + + View + categoryTag:LTTng + + + + + View + categoryTag:LTTng + + + + + View + categoryTag:LTTng + + + + + View + categoryTag:LTTng + + + + + View + categoryTag:LTTng + + + + + View + categoryTag:Tracing + + + + + View + categoryTag:Tracing + + + + + View + categoryTag:Tracing + + + + + View + categoryTag:LTTng + + + + + View + categoryTag:Tracing + + + + + View + categoryTag:LTTng + + + + + View + categoryTag:LTTng + + + + + View + categoryTag:LTTng + + + + + View + categoryTag:Tracing + + + + + View + categoryTag:Tracing + + + + + View + categoryTag:Tracing + + + + + View + categoryTag:Tracing + + + + + View + categoryTag:Tracing + + + + + View + categoryTag:Tracing + + + + + View + categoryTag:Tracing + + + + + View + categoryTag:Tracing + + + + + View + categoryTag:Tracing + + + + + View + categoryTag:Tracing + + + + + View + categoryTag:Tracing + + + + + View + categoryTag:Tracing + + + + + View + categoryTag:Tracing + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:Help + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:XML + + + + + View + categoryTag:XML + + + + + View + categoryTag:CollabNet + + + + + View + categoryTag:CollabNet + + + + + View + categoryTag:CollabNet + + + + + View + categoryTag:CollabNet + + + + + View + categoryTag:SVN + + + + + View + categoryTag:General + + + + + View + categoryTag:Mylyn + + + + + View + categoryTag:Mylyn + + + + + View + categoryTag:SVN + + + + + View + categoryTag:SVN + + + + + View + categoryTag:SVN + + + + + View + categoryTag:SVN + + + + + View + categoryTag:SVN + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Maven + + + + + View + categoryTag:Maven + + + + + View + categoryTag:SVN + + + + + View + categoryTag:SVN + + + + + View + categoryTag:SVN + + + + + View + categoryTag:SVN + + + + + View + categoryTag:SVN + + + + + + + glue + move_after:PerspectiveSpacer + SHOW_RESTORE_MENU + + + move_after:Spacer Glue + HIDEABLE + SHOW_RESTORE_MENU + + + glue + move_after:SearchField + SHOW_RESTORE_MENU + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/http-cache/_a.fdt b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/http-cache/_a.fdt new file mode 100644 index 0000000..43f84a2 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/http-cache/_a.fdt differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/http-cache/_a.fdx b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/http-cache/_a.fdx new file mode 100644 index 0000000..4186e4a Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/http-cache/_a.fdx differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/http-cache/_a.fnm b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/http-cache/_a.fnm new file mode 100644 index 0000000..e85229f --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/http-cache/_a.fnm @@ -0,0 +1 @@ +ưÿÿÿkey requestDate responseDatestatusLine/statusCodestatusLine/reasonPhrase#statusLine/protocolVersion/protocol statusLine/protocolVersion/major statusLine/protocolVersion/minor header/0/Dateheader/1/Serverheader/2/X-Frame-Optionsheader/3/X-Content-Type-Optionsheader/4/X-XSS-Protectionheader/5/Expiresheader/6/Cache-Controlheader/7/Content-Typeheader/8/Set-Cookieheader/9/X-NodeIDheader/10/Keep-Aliveheader/11/Connectionheader/12/Transfer-Encoding header/13/Viabodyheader/8/X-NodeIDheader/9/Keep-Aliveheader/10/Connectionheader/11/Transfer-Encoding header/12/Viaheader/7/Content-Lengthheader/8/Content-Type \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/http-cache/_a.frq b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/http-cache/_a.frq new file mode 100644 index 0000000..3633fd0 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/http-cache/_a.frq @@ -0,0 +1 @@ +    \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/http-cache/_a.prx b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/http-cache/_a.prx new file mode 100644 index 0000000..cb43b5c Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/http-cache/_a.prx differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/http-cache/_a.tii b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/http-cache/_a.tii new file mode 100644 index 0000000..509d02d Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/http-cache/_a.tii differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/http-cache/_a.tis b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/http-cache/_a.tis new file mode 100644 index 0000000..bec0597 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/http-cache/_a.tis differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/http-cache/segments.gen b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/http-cache/segments.gen new file mode 100644 index 0000000..f142fa9 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/http-cache/segments.gen differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/http-cache/segments_4 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/http-cache/segments_4 new file mode 100644 index 0000000..54110d4 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/http-cache/segments_4 differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_0.fdt b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_0.fdt new file mode 100644 index 0000000..d5abf41 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_0.fdt differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_0.fdx b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_0.fdx new file mode 100644 index 0000000..b8ee809 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_0.fdx differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_0.fnm b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_0.fnm new file mode 100644 index 0000000..523c92e --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_0.fnm @@ -0,0 +1 @@ +ưÿÿÿversion \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_0.frq b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_0.frq new file mode 100644 index 0000000..e69de29 diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_0.nrm b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_0.nrm new file mode 100644 index 0000000..cf8dc75 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_0.nrm @@ -0,0 +1 @@ +NRMÿ \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_0.tii b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_0.tii new file mode 100644 index 0000000..ebd518d Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_0.tii differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_0.tis b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_0.tis new file mode 100644 index 0000000..ebd518d Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_0.tis differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_1.fdt b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_1.fdt new file mode 100644 index 0000000..a357330 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_1.fdt differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_1.fdx b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_1.fdx new file mode 100644 index 0000000..b8ee809 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_1.fdx differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_1.fnm b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_1.fnm new file mode 100644 index 0000000..3dddd30 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_1.fnm @@ -0,0 +1 @@ +ưÿÿÿversionidentity \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_1.frq b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_1.frq new file mode 100644 index 0000000..6b2aaa7 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_1.frq @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_1.nrm b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_1.nrm new file mode 100644 index 0000000..98f7c5a --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_1.nrm @@ -0,0 +1 @@ +NRMÿ| \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_1.prx b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_1.prx new file mode 100644 index 0000000..f76dd23 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_1.prx differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_1.tii b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_1.tii new file mode 100644 index 0000000..509d02d Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_1.tii differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_1.tis b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_1.tis new file mode 100644 index 0000000..b7212a3 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_1.tis differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_2.fdt b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_2.fdt new file mode 100644 index 0000000..a357330 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_2.fdt differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_2.fdx b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_2.fdx new file mode 100644 index 0000000..b8ee809 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_2.fdx differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_2.fnm b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_2.fnm new file mode 100644 index 0000000..3dddd30 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_2.fnm @@ -0,0 +1 @@ +ưÿÿÿversionidentity \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_2.frq b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_2.frq new file mode 100644 index 0000000..6b2aaa7 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_2.frq @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_2.nrm b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_2.nrm new file mode 100644 index 0000000..98f7c5a --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_2.nrm @@ -0,0 +1 @@ +NRMÿ| \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_2.prx b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_2.prx new file mode 100644 index 0000000..f76dd23 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_2.prx differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_2.tii b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_2.tii new file mode 100644 index 0000000..509d02d Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_2.tii differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_2.tis b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_2.tis new file mode 100644 index 0000000..3cf069f Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_2.tis differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_3.fdt b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_3.fdt new file mode 100644 index 0000000..a357330 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_3.fdt differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_3.fdx b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_3.fdx new file mode 100644 index 0000000..b8ee809 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_3.fdx differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_3.fnm b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_3.fnm new file mode 100644 index 0000000..3dddd30 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_3.fnm @@ -0,0 +1 @@ +ưÿÿÿversionidentity \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_3.frq b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_3.frq new file mode 100644 index 0000000..6b2aaa7 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_3.frq @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_3.nrm b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_3.nrm new file mode 100644 index 0000000..98f7c5a --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_3.nrm @@ -0,0 +1 @@ +NRMÿ| \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_3.prx b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_3.prx new file mode 100644 index 0000000..f76dd23 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_3.prx differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_3.tii b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_3.tii new file mode 100644 index 0000000..509d02d Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_3.tii differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_3.tis b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_3.tis new file mode 100644 index 0000000..e03fda3 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/_3.tis differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/segments.gen b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/segments.gen new file mode 100644 index 0000000..f142fa9 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/segments.gen differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/segments_4 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/segments_4 new file mode 100644 index 0000000..519a8e7 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/segments_4 differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/write.lock b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/local-history/write.lock new file mode 100644 index 0000000..e69de29 diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/remote-history/_1.fdt b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/remote-history/_1.fdt new file mode 100644 index 0000000..0ec3a37 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/remote-history/_1.fdt differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/remote-history/_1.fdx b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/remote-history/_1.fdx new file mode 100644 index 0000000..1ae50d6 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/remote-history/_1.fdx differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/remote-history/_1.fnm b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/remote-history/_1.fnm new file mode 100644 index 0000000..b4b8341 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/remote-history/_1.fnm @@ -0,0 +1 @@ +ưÿÿÿ fingerprintactionbugIdbugUrlmessage needinfos \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/remote-history/_1.frq b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/remote-history/_1.frq new file mode 100644 index 0000000..4f3418a --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/remote-history/_1.frq @@ -0,0 +1,3361 @@ +‚v·Ô­Ø±»߈ŸÈÅô“ƠÙ½ÿÚơԷԾ߿àÙÚùטô¥ˆ]1©ÓÁƯ÷‡ß»û™‰kß [ïS9¥‡­Ø£‡¾ÓÙ½±¿¾́‡Çƒµ›̃¹Ú¿ß×}›¾­ÖÁĂÜơèÅؽ—»Û«‚ ½9¿ßÁ߈°¿ƒ±»ƒˆÁƯ‰ÛÓµO«™¹Á ¶Ô ‡Û«‚ ½9„öñÚ¾»Áôê±»ăˆŸ;k«‡“ÍjíÆ±»÷Á™Ó÷Áû(²ÆÇÁƯù×Ùת‡’̀j±»ơÔÙ½ĂȿءÛß»ûÛ«‚ ½9çºgÙ½ăˆŸ;kđ‰ơ9¥‡Óˆ•=‘ăºó|‹ÇÛ«‚ ½9ÏÚí—Gùר¼Ô¥à¹Á߈Ùںū‡“Íj«»ëö·Ô»Ø³ºó‹Üù×Ù½ùנŢÈÛ«‚ ½9±»™‰kß [ïSăˆŸÿÛáê©̀ǼîÀœˆ«ÔĂăˆŸ©¼‹ÜÊ"ỞÇÖÙ½«‡“ÍjöÙ׃ơÙƠ÷‡Ñ›/‹ÇĂÙ߈ăˆŸ;k‡ÏÔ§Ô€Ó¥Ó«ÔñÆáÚơêëöÛÀù×ù×߈·Ø±ëØ…»ùôéêëƠUÛ«‚ ½9°À¾ËÑÄ뽿ق¿ºÑÓÙƠµØû༹£³Û«‚ ½9±)ç$ƒ¾™‰kß [ïSÍƯº½ưˆщưÀ² •î‚vÙÚÍĵ؃văˆŸ«ÚÙ½÷Á©ºÑÓ…Ú°»­Ö8«¤‡«Ö{ÁĂëöăÚăˆŸ;ÏÅÇÓ¹Ú™‰kß [ïS±»Û«‚ ½9«‡“Íj¹Ú›¾˜êèäøêö¼¯ÍĂ“†÷Áÿ.«‡“Íj©ÇöêŸÖßÄÙñÓ©ÇơĂôƒÛº9¥‡åÁ’Ç·Ô«‡“Íj™‰kß [ïS¯Ó±»ªÜÏʼn®™‰kß [ïS±»¡ÛÚÇ—ˆË¿ÁƯ¬Äå̉ Û«‚ ½9›¾ÏÅ’½™‰kß [ïS—»¶èË̉퇱»ÍÄ™‰kß [ïSËÇơºÏ)¨¼•ºßÄÙ¶ñÓ«‡“ÍjÅÔÏÅÏóô‡™‰kß [ïSóº$µaÓ¾ÿ‡¸ÚǼ­Ä¡%ÔX ßÄÙÚÀ™ôù×ëöŸÈ÷¼›Ú½Û«‚ ½9½€ƒˆëç›vơÏ|¿çø×ÍÓßúÑĂ‘«¯×½€åÁ«‡“ÍjÑĂ®­ØñÖÛÄÓø¿“Ơù׃ˆñ×ö†½ÁÓ»‡åÁ‡“ñÚƠ•ŒÉ̉Á¹÷ˆ½ÛºÍÓ÷Á©½¡Û—Œ߈ç̉ÛÆ¡ÛÀ½‡%ñÓăÇíÅÔñÆö¬Ö‹ÇơêƠ'«‡“Íjëö²Øíö…ĂÈÓÅÑ·‡Œ×¿à߈Û×ϼ÷‡à<2đ;­ Đ$/¤ñ¸ÚưÀ‡—ÓÛשLJºù×å̉ “ȇŒÏÔ»‹Û×ß½¾ƒvÊƠÛºñÚ®¼ù×ûÙ‹Ç‹‘ơÔ›¶éÛ«‚ ½9ù×Ù½·‡‘×8ç™ô…ƠăˆŸÇÖ±½—¶gơêÙ½¸£#߈ƠXºÁívÏÔơÔ8 ¤‡ ×ËÇ‘ÆéºÏÚ‘±Ăƒ¸Á±»¯¾±Áå¼ “Æă»™ëéå«Ô½›¶éÛ«‚ ½9ÑÓ—»Ểƒv8¤‡×Å–Û×߈¢»‡Œ÷¼±»ơÔËÛƒˆ™Ă­ØĂÙëöƯ陉kß [ïSÏÔ·Ô½ơÔ¿º±ÜƒˆÍƠƠ«ÔơÅ™‰kß [ïSñ,ßơơèÅ«‡“Íj…ô¬¿“öƯƒˆö±»ÊÈ9ÿ¯¶éÓ±»«·3uUÙÚÁ¾ëöÙ釉ÔëöÏÄ‘ª¶2tTù×ǽÏÔƒÛ«‡“Íj•ÏÔé®ÈÏÅëÁ‡̣„̃Žç̉™‰kß [ïS÷ÁÇØº÷‡Ñt£ØëöÇÖ’¹ÜN¥ˆ]1™‰kß [ïS½¹¼ăˆŸ‡Œù꛶陉kß [ïS½…ôñ,éÓăˆŸ¢ôºÅ¥º„˜‰j̃ZîSåƠëöĂÈ₫®¶¡îÚ“Ơéê©bߌ™‰kß [ïSăơ›ÚÎÁ½߈ËƠéºỞ˜êè䥈]1«‡“Íj·Ô«‡“ÍjÏœ™‰kß [ïS§Ø÷ú¶Ô‹ùùêĂ›ÛŽ¡Á¯ÈÆÏÔïף䫇“ÍjñÚĂÙ9¥‡˜‰j̃ZîS©Øå̉ ™‰kß [ïS»½‹½ëöøêÙÚăơø×¸Á±¿Í±ÈËÉ9€ƠåÁÑÄ뙉kß [ïSßÔXÁĂ–¶ƒÁƯ½€™‰kß [ïSÛô®¾¯+™‡Ẩ«‡“Íj߈ơĂå×ô‘Ö«·3uUÙ̉ö™‰kß [ïSÿ¯¶‚Øו߈ív½©ĂĂ ›­±àéM×̉ïƠ¦ÆƠ߈Žø×ÿ¯¶₫߈ÙÚù×ĂỤ̀Âᷣ䙉kß [ïS«‡“Íj»Å÷Ú‡ŒăˆŸ;ù‡îô +ơĶºÇÄ‘¹ÚÎÔÍÛ§¦Ù½ÏÔÍÓ§àëö¦Ôø¿«Óơêù×±»—»߈߈ª‡’̀j±»ăˆŸÛÅÇăê×Ơ†7§j«·3uU‹ÜÁĂàÛßÚÚª‚ +¼9߈ëöźÇùËÉ9Û«‚ ½9ƒ­Øר®ù×óÂ߈êơăˆŸ¹Úù×Û«‚ ½9’Ç©ÙY¿Ü™‰kß [ïSߌÛ,‡Í̀ÓăˆŸ;¿‰Ú¹Ù×ï½±»ƒv±»ËÉ9Ǽ¨Ơ߈†Ú 8¤‡Ï̉ï¹Á¶èÙ×ƠXÛ½¿‰å×ăˆŸ;kĂÙĐÅ«‡“Íjó|±»ñÚµaá ˜‰j̃ZîSƯº«Ô߈Ç[£ä›¹µ‰‹¾‚áêÿÚ—¶±»ÍĂÁƯñÚ«·3uUÿ§·ÔûƠË%ùתÚÉĂù×ơêÛ«‚ ½9ׯÛ«‚ ½9ÉÖ¡È…ăˆŸï‡­¾£ØË%†Ú—ˆ߈¡h×̉¹—‡x‚߈µØí—GµØçÚ±»­Ô£äɰđ»щ½́ÅŒÍË)éÛ9¥đÖÏÅ߈ơÔÀ̉¬¿ä׎·‡‘×8çÏÔ¹Ú±»“Æ½ăˆŸ;«‡“Íj‡ÛçôÄ$™2ăơ߈ È‡“÷Á©Ó«‡“ÍjËÇ«ÔơèÅëöñÁÛ×ù×óºº߈ÁçÚÿ¯¶›Ú9¥‡×—¶½±»½ƒ’¹ÜN&á¬×̉§Ơ›¶éÏÄùă³ÏĂÙ₫®¶«»ÇÖ±»ÔXX§ÔÇ×߈«‡“ÍjƒˆÛ«‚ ½9߈¼Ù½ëöåÁù×g߈Ù½¹Ú—¶ƠXđÁ«»±»”ö÷ÁÆ·¶±»͇ưÁƒv«‡“Íj±»ª‡’̀jù×¹Úëöù×Ó̉«Ôÿ¯¶ă­¶((́v™‰kß [ïSåëöÙ½5麛¾«‡“ÍjªÚ…ƠƒÖÁ½¹¾ù¿à5đ;­ Đö¦ăˆŸÓµOÇívÁ½ƯÚưÀô߈Û«‚ ½9¹Ú9¥‡Û×¹Ú“óù×Ǽ߈ơ$ăˆŸ;ĂÙ́vùׇ»%ëÚщ±»Óزº̣‡º±”½Ă¿‰Û×¹Ú±»ÁÙ™‡̣ÜÏÔÛ×½ăÇíăơ‹Ó™‰kß [ïSÑÓçÚ™‰kß [ïSÍÛƒù×ơÔͼ«‡“ÍjÅÄ“ö¿ôÙ½ëö‡»ËÖóǼô£Ç¿æ¿â«‡“Íjå¹ỬÁ¹³ºó½™ÔưÀ‡)˜‰j̃ZîSá©Ó߈‡«ÔçÚªÚ¦Ô‹ÇÙ×¶éÀƯ +ó½ÿÚÍÓÏÔÉ̉ÏœïÚÓˆ•=‘›¶éëö—¶¥Á‡Œù×ñÚ½€Ù׺±»™‰kß [ïS«<¤ˆ\0™ÔëöÑ9¥‡±»ăˆŸ³b—¶«‡“ÍjƯå¢XÏÔ“ÈưÀÇ»ôêå̉ ·Å×)߈±»±»ƒvàê©Ø›¹߈ÙƠăˆŸ;¼Ü¥âơµØ₫ ®¶ ÙÚăˆŸ©Ó߈« ©ƒ»5Ûº±»ÅصØưÀø×߈®×Û«‚ ½9‡ÇưĂ—¾Û«‚ ½9ƒˆ©¼ơêà=ÏÅéÓ±»ăˆŸ;ĂĂ ›­±àéM÷Á±¿œøƒv±ÁüÁ•Œă‰ƠÓØ—Ö—ÚơêÁב́ă¶ÅÛÙ½ÏÅóǵØÛÄÓܺ½ñÚ±Ưƒvß»ûëö£Øå̉ Ă ½̃ŒÚ,›¾±Ü‡ÇƒˆË¿“Ơ´Å¯¼ëÚíêó“ϱ¿Ù½ơê¡ơ÷ˆ©àÛ«‚ ½9Á¹½€—¶߈÷Á½¶Ü¡ÈÁ‡é/×:Ở™‰kß [ïSëöĂ²¾¹ÚÅÛ«‚ ½9©¼‡“Û×Í×½€™ÇÑÄ냾‘ĂÙÛ«‚ ½9ßÖ÷‡ĂÓ¸ÁÜÉÖơÅ­v³Øđ¹%˜ %™‡ÇÖºgö±»×¼Ù½ÅÔ߈™Á©ØÚ×߈Áܱ̃ÑĂ¹Ö›¾Û«‚ ½9ɱôï³2ƒˆÍË)éÛ9¥™‰kß [ïSƒv¢XŸ}å̉ î×Úª‚ +¼9³’ëö™‡±»¡ÈÏÅưÀ9¥‡ƒvÛ«‚ ½9¿ßƯÓ ÙÜăÁ÷‡ÿ¼·¸ÏÔ£‡Åô¥‰ÍL…¦Ø‡º߈߈™‰kß [ïS…؃àÁ‡é/×:«‡“Íj߈ÁƯ»Ø߈Î +ĂÙá ̣–ƒ×ÑÓ÷Ôƒˆă®ÑÓÆ‡Úëö©‡¥2ßëM«ÑåíûÊ9¥‡™‰kß [ïS›¾œÂĐ©‡¥2ßëMĂÙá ‘Ûù×·§D ¾ÅơăơÏ̉ưÀ¥ˆ]1Ù×߈ÛºÏ̉Ă«‡“Íj“¹ƯN±»Û«‚ ½9™‹ĂÖ«ÚÁÆăà…ÛÙŒë*«±»Û«‚ ½9›¹«‡“ÍjÉÁÙÚÑ¥ÍƯœïº½Æ˜ÁÏÔÿÚƒ½ơÔ›ĂÀĂăˆŸÁĂ”ÿ²¹å̉ ëö¿ºơÔº¨¾̉™Ô¼ƠÑÓœ·8̉ 8¤08ÅÁêÓ½ƠӼ߄«‡“Íj©‡¥2ßëMÏÔÎ̉Û«‚ ½9ÏÔƒv÷Ú÷ơ½±½ÅÔÛÆÍÓœ·̉ ¤0½ÔăˆŸÙ̉«»ŸĂÏÔƒv™‡Æ‘]«‡“Íj½€§Óí‡ß„Û«‚ ½9ùêÆ»₫ö8¤‡×ăˆŸ;ÏÔ«‡“Íjù×ăà‡ơăƠºưÀĂĂ ›­±àéMû÷Ỗˆ‡ñ5åĂºÿÚĂÙ÷ˆĂéӡȡԙ‚ºÁ%©¼ÅÔª ¨ƒº5¥ØÅØèÓ¹Ơƒv—¶›‰Á½–üê¤Ç½‹Üù꿉‡Œ½·‡‘×8çƒÖỰ½€ÙÚ–»Ăôơ³ªd½¾‡¿‰‡ÇÏÅ̃ˆµØÿ¼¼ØßÄÙ߈ÀËï³2ÁƯíØ¶èçÚ‰Á߈˜Á‘ëăˆŸ÷‡ׯÓÆĂôù×ÎÔÙÚ¼ĂÆ»ăàÏÔå̉ ăˆŸ;ßÄÙƒéÓ¹ÚÉ€’½ƒ×߈ñ×Ù½‰ơÜéØ÷‡¨¼ÏÔ¼€›ÚăˆŸ;±»´aÙÚ߈ؽ›ÚÑØưÀ±Y‰»ÍƠ÷ÁˆƒèçÖ æôˆ¯G‹øăˆŸ;©Ó¾ËÉ9ƒÖ™‰kß [ïSÇ̉ƒ¾‘ÂÏ̉º¿ßƠX³ÎçÇÙŒë*«Úª‚ +¼9­Ä«‡“ÍjºÓØ£‹ù׳ùׯG‹øÏÅ…¼ÆÙñƃvªĐăˆŸçÚ™‰kß [ïS˜‰j̃ZîSó#ƒ¾‘ïÚñ~µØƠܵر»©‡¥2ßëMóÔßöóÂ퇿ߟÈÑÓ™‰kß [ïSƒˆå̉ ¦ÈăˆŸ©ơèŽÜù×ø×½€ƠÔ߈ÓÆíÂÛÄÓØÚ9¥‡‡ÛÍÓ™‰kß [ïS„¢­Æ»$ÎÔ«‡“ÍjăÁˆÁ—¶™ÔÏÅ÷‡“Ơ°¿Ù½¾¥ˆ]1ÏÔ™ëé剶‡“ÏÅÙŒë*«߈á‹Ü½÷‡ßÚ¯×ÑĂŸ¿±»ƒÖăˆŸ;—¶½¡Ç±»ñÓóÔ«º¥ÖÊƠ­ØÛ×ܱ»߈«‡“Íj°»êöơê«Ô­Äçô«́«‡“ÍjÛ«‚ ½9ÿھߨ¼»Óû™ôщÑÓ™ëé噉kß [ïSÓ½©Ơ±ëØ9¥‡ưÀ—¾óƒ×ăˆŸ;­¹̃¿¹ÿ¯¶½ÁÛ«‚ ½9º•Èû›Á‡é/×:Á̉à=̀ÇÑÓÛ«‚ ½9£ØÆ̉ăơ™‡ƒv‚v©ØµØ‰¿Iµ†ÿÚ—¶†º§ôƒv«‡“ÍjƯH›¾¯ÈăÁ9¥‡ÏÔÙ½¹Ú©Ç½ƒÖ™ÁßÄÙ±¿ơÔ…Ç¡%¹Ú›¾ÍÓ̃ˆÙ½ÙÚùêñÖóÔ¶˜‰j̃ZîSϼçØ¿ÅĂÙ߈×ܵ¦…Œ‚v™‰kß [ïSñ×ÿ&ÇÖ™‰kß [ïS±»½Ơ˜‰j̃ZîS™ëéåû½•Ǿ³ÈÙ½ăˆŸ;Ă¡©ØÍÄ›¶é¡È¤‰̀L„™‰kß [ïS·‡‘×8çöÜß»û½¡ÔÙ×ơÔáÊ¾ăˆŸñ×°»™‰kß [ïS˜‰j̃ZîSƒˆ́Ï¿¨‡¤2€̃êLµØâˆ:¹ Û«‚ ½9Ơ¾G©éÙÁ|‰ơĂÙ¹Úí—Gø×Å»³+ÏÅÙÚÁ¹Ú©¼ª¶2tTÖÚ߈“ưÀ·ÔíÖ»‡éêÏÅ÷‡ơêĂÈùëöÛ¹Úź¾•îׯ½ÿÚÅñÚ¯Ó¶̣ÏÔçºç½ËÇH̉½½ơ‡«ÛăàÑÄëǼơêÇØ¥ˆ]1ù×ù×ÙÚĂĐw₫ÇéÓÔXËƠ½¾‡“öƠXÙ½éêăÇí½™‰kß [ïSÙ½«»ÏÔÙ½˜êèäƯơÏÔ«‡“Íj½ô¥Û±»¿ôẲÅ»ÿ¯¶Á¹Ó«û‡ÓºûÓ½ƒvÁ¹Û×¢X̉º‚v™‰kß [ïSơÔå¿§ôƒˆ»yרÙ½¹ÁÛ×éÚÆÖ“¹ƯNÎŽëöưÀƠôêßƯÛ«‚ ½9Ë̉¯×§ô•ÚƠơ‡Ù½¶‡Ö8惈‹Üá¼ÿÚ́ơÛ«‚ ½9¼ôµÁ½ơ鿆۫‚ ½9Ă¼ĂÈùæÏÔÏÔơêó“۪¼¿‰®GøßÁç̉Û«‚ ½9üÁ’½±»ËƠÙ½©́™‰kß [ïSçôÏÅÈ̉—ˆ©Ó‚vöù׺­Äö†Œ555÷ˆơúÛ«‚ ½9›_ϼޱ¿¯Èߣϼ¥Áï½á=ƒv̉ßÄÙ¥ˆ]1ƯºƯÚ˹“¹ƯNù×ưÀĂÙ‚á ¾›¾9¥‡ÑÓ«‡“Íj¯Ê¼€çÚ9¥‡ö—Ú‰Ơ߈‹Ü³È™‰kß [ïS›Ú±»ÑÄ륈]1±»«‡“Íjèç +«‡“ÍjÏÔ‰Ôµ÷©ó#Á¹ù×ø¿·‡‘×8ç£ä¿ôö$Ơ‡x“¹ƯNù׋ÇéÚăˆŸƒvóÂÚª‚ +¼9º́ÁÓ¿åƒvƼ‹Çơ꫇“Íjû¨¼…Âư“́º©¼̃»úëÓ¥ØëöĂè³(ûØß»û«‡“ÍjƒˆôÇØ¥ÜÖå»°»ºÙ×ÿÚ–ÓϹ±»Ï̉Û«‚ ½9óËÏÅÁ¹«Ó%щÿ¯¶±»ƯÓ é‰ñ5ñ·•ŒçÚ×ù›¾½ÏÔß»ûᬶÔơê߈µaóĂä̉ùơœöô«Ô¥ØËÉ9ÉĂô½ô‡Œëö‘³§–ß½ïƠÛ«‚ ½9Íî§ƠóÇÖ₫ó ÏÔƒÖÛLJxÛ«‚ ½9§ôÓÅíJ­Ä܋dz9¥‡¿*ï½™‰kß [ïS›¶éûƠ±»ơÔ·‡‘×8çù¿Û×ưÀƠ¡È¹ÚóÂơÛ«‚ ½9ÏÅ“Ơ™‡¯ë™H™‰kß [ïSÙ½½©¦÷ÁÿÚáêÁ̉™‡åçÔóĂÛ™‰kß [ïSÙܯ×߈™‡¥Ø¯È½Ô9¥‡ăÁ©‡¥2ßëMÙÚ³ÈÑÓ™ơ´‰ƠơĂ‹ÇÆØÚÄ̉óÇ«‡“Íj÷Á±»çôŒ¾›¾¡́₫Úëö¯Ü9¥‡ơêŸ}½™‰kß [ïSÍßÚ³ÈÿÚø×˜‰j̃ZîS¹ÚÙ×¹ÚÁ¹öáƠ«‡“Íj–¶ÍÓ—»¡«‡“ÍjơêßÄÙ ËûŽù×À½ñÖ›¹ù×­ŨÏæÏÄ«‡“Íj½€›¾©Çùת‡’̀jơÔ·‡‘×8ç·̃›¶éÂÙÏÔ½ѶÛÚ̀ĂÙ½«‡“ÍjÏÅ­ÖơÔĂƠ·¼Í7«‡“Íj›¾­ÄÅØăà•Èû›ÇÖ•ÿ›é™‰kß [ïSăÈëöÍƠ«Ôä̉  ËÇ’́êÏԵعڱ»́Úª»©¾˜‰j̃ZîSÍĂ¡º­Öù½á ù×ù×é‰ñ5ñ·ăˆŸ;߈‹Ç«d»Å«·3uUéºăˆŸÆĂ÷̉ơê«ÔÏ̉ëÓ«‡“Íj«‡“Íj™‡‰»Ë̉Ăvƒv¼0“ƠÏÄï³28¤‡÷ÁÀ¼Ï…™×‘÷ÑÓ߈“Ơ›çă½çÚѶóÇ™‰kß [ïSµÓ‡Œ«‡“Íjé‰ñ5ñ·™‰kß [ïS›̃Ï̉³(ÙÚ߈™‡ßÑÄëÙ½˜‰j̃ZîS9¥‡×½àơêÜÁ×ă»¥Ø±»¹Ú—ؽ€ĂÈơ»±½߈®¼߈̃ŒÚ,ÛÇ‡ăˆŸ±»ÇăˆŸáÀÅÓÛ«‚ ½9£X߈ăˆŸ;ÏÔ©‡¥2ßëMù¿Û«‚ ½9ùסÔăˆŸ;¶‡ºוù×ư‡±ù1ăÚµ†øê‡¿ƒvÜĂJôĂÏĽØơêÁ̉½½™‰kß [ïSù×Ѷ¹₫®¶ÿÚÙŒë*«©Ø±ßưÀû(ơêÏÅ·‡‘×8çßÄÙ-ÄĶ  ăáô´aùטơÙ×ñÓ‡“›¾ơê˹»߈̃»ú¹Ú±¿ÏÔÓÔƯÓ ƒˆÓƯ‰£Øå·ÏÔ¥Ö̀ÓĂÙ÷Áƒvî»øê«‡“Íjκô9¥‡Ó½ù׃vù×ùê×Ü¡h¹Ú•Œ«ÚÙ½¨¼Ở˜ ê è ä ô­€ÙÓơê9¥‡¸Úÿ.ٽٽ•×ùטêèäçÚ«‡“ÍjơÔ°»ÿÚŽëÔÛ«‚ ½9߈Úª‚ +¼9±»…ôÙÚ߈¹È“öÏ!íÏ̉ÏÅó•ŒßÚ™‰kß [ïSĐç¹¹ÚÙ½ñÓïÚ“Ơ«‡“Íjù×̃ˆ±·‡‘×8ç߈…ŒĂ ›¹ëï‘̃¾³µñÓíÖçôùæívËÇ¿%߈ÅÁÛ«‚ ½9ËÉ9³ÁÏÔ¡È߈ÙÚëö9¥‡¥‰ÍL…Ó¼¿‰Û«‚ ½9™×ÿ¯¶ùן‰¸ÚÍÓ½Ôø¿ơê½$ơÔ¬ÖÏÅßÏ¿¹8¤‡«‡“Íj“Ç9¥‡¿‰Ï̉ăˆŸ;ăˆŸ¨Ç¹ÚƠÿ¯¶¹ÚéôÙÓ™`¼€ÏÔÏ̉ÙÅëͽ£ä߈ÿÂé¾ù×±¿÷å5Ó½ôƒv§ô›÷ƒvå̉ —Óôƒvÿ¯¶—¶Ë™‰kß [ïS«»©Óï½¥ÖßÄÙ™ÓߌÛ,·‡‘×8癉kß [ïS½€Û«‚ ½9ƒ½ôÛÀ½«ÔÓØ™‰kß [ïSĂăºËƠ‡ñ5‡“½ÏÔ…ôœ·̉ ¤0ù׉ۙ‰kß [ïS§ƠÛÄÓ£ä­Ö¹ÚÙŒë*«EĂפ ËûǺôੇ¥2ßëM÷Áă½«‡“Íj߈퇇ºµØ€ºä̉ăˆŸ·ÅƒúÙ…Ơé€ß½ôç›Ñ¾ÍÄÙÚ™‡ƯÚÓÆÏţ䃽ˆÅÔ߈Ù×ù×Û«‚ ½9×Ơ“ºÛ«‚ ½9ù×›¹Åà±»Ó̉¯È©Çó«ôù×ô¬¾ßšԨ‡¤2€̃êLĂÙ™ëéåØYÿÛëöÅÔÙÓ߈€“ƠÉÿ¯¶‡xâˆâˆ:½ÈÏÔƒˆüĂÛ«‚ ½9ưÀ¶‡Ö8æƒØÅÓÙ½±»å̉ ëö­È›Ú½³ÚăˆŸ;kÅÓáÚ³̉ß»û߈⺙‰kß [ïS¬ÖăˆŸǺ÷Ú߈™‰kß [ïS›¾“á‡Ç™‡Ѧ±¿§Ô™‰kß [ïS¡ỒÊ)èÛ8¤ëöÍË)éÛ9¥™‡ÏÔ•Èû›å»ÏÔÁĂ™‰kß [ïSÛÀù×ÏÔ½€±»­¾ơèŧÖßͼåĂ·‡‘×8ç¹Ú¡Ô¡9¥‡“ÛáƒÖéêërÔXơĂéÚ߈±»•Èû›™‰kß [ïS™‰kß [ïSщ«‡“ÍjóÏÅà̉ăˆŸËDZ»ĂÙ°½Û«‚ ½9ưÀŸ\¯×ăˆŸÙÚ×ƠáƠÓ¾™‰kß [ïSÊ +È9“­văˆŸ°¿áç¾·‡‘×8çç̉ÏÔå̉ ¾Û«‚ ½9”º§ôù×ơÄ«‡“Íj·Èƒ‹Ùá ª»£ä€Äö‚vçǹÚÙ½ûاÁă“ƠúÏÔ£»ÿÚ÷êùדƠG½¹•Ù¥ŒÅ±¿¾Û«‚ ½9ƒˆ«Ô߈ÏÔưÀÿÚÛ«‚ ½9ƠX‰¿IĂ-ÚÀÏ̉·‡‘×8çíÉÙ»ø×©&ÍË)éÛ9¥«Ô›¾ÏÔăà™‡å̉ ‹ÇÑĂÅÔ±Á߈©¼ơÔ‹ÇɇóÔèºñ••ŒµØăơÍĂù×óÂÏÔ₫&ÿׇÛÙ½á ‹Ç™÷ƒvÓØâºÁñíÈơºñÓŸ‰ù×÷ڣǙô—¶«‡“ÍjƠơù×ưÀåĂÅÔêØ«‡“Íj«‡“Íjëö9¥‡«‡“ÍjÁ̉½êÓ߈±»µ†óÂ8¤‡×¿ØÓ%´Ă¤ˆ\0ÛÀ½‡ºÑÓïñơĂÙÛ«‚ ½9ÖÆ ©Óëöׯ“Ơ‹Ç”·ø×ưÓ߈™ëéåơÔ«·3uU߈™‰kß [ïS8¤‡§»ô¿ß×܃vú·‡‘×8ç߈ñÓøơÿ¯¶º½9¥‡ÙÚ«‡“ÍjƒvĂºƒnçÇ¡Ô÷Ụ̀¶¿‰ÅÓ½ÔăˆŸ;¤ˆ\0»±0™¸vØíù¿§ÔùסÔë€ÍÓ‹Ç£Ç9¥‡™ÓĂº߈ăˆŸ³àÎÔ9¥‡î»ƒv¯ÔÏÅơÔóÂ߈Œ‰°6É̉ưÀ«ä¯¼±»ưÀ8¤‡Ö»Ø×¾÷‡£‰«‡“Íjù׵ؽÈË̉§Æ™¤¾ ÷‡ñ¨Ç%ÙŒë*«áºƯäª)éŒéÚ©ơơê÷ˆÏÔƒˆùôÛ«‚ ½9¡Ô“ÆÖÆßƯœ́÷$ÏÔÏÔǻٽưÚË¿¥Ưƒˆɹ•×ăˆŸ;ͼơê¡È÷‡ûØ›ç£ôÙ½Ű§~ưÀ߈–ÓăˆŸƠX¡ƯѬºù‡‰ˆÍÓÇ%ƒvéºÛÄÓđ Á¡ÔÙ½ÏÔ³ºóµØưÀĂÙß½‹Ü¿́ÂéÚưÀÏŽ€߈í̃‡Œ¿¹›¶éẨ‡Ç9¥‡ưÀ̀Ă߈¹ÚϹ퇙‰kß [ïS›·Ô›ÚÙ×ăˆŸ¹Ú†¾Ù½ÛÀô÷¼Ö߈›¡ºØ + +¼ØÁÿÚÛ«‚ ½9ñ×Ù½ÇÖº8¤‡×¾±½ÏÔµØñÓ¥Ó“Çí¥EÙ½À½ÿ‡Úù×ăƯăêưÀÿÚ«Úư½£äßÄÙ™‰kß [ïS现»ûÓ¾³Ó±»ÑĂĂډƹÚăˆŸ÷Ù¿ôăˆŸ;ÚÀ¯¾…Öå¼ ÁƯ€Ơ½È¹ÚÛœơêơí½ô½³«‡“ÍjÙ½°êØÍǭ؃փvÁƯí{„½ưÀëÚ°»¡»ĂÙ‡ŒÁƯÁ†Œ™‰kß [ïSרăˆŸ;³ɹ‡ÏÅù×ăˆŸÍƠ»$±»™‰kß [ïSƒv…&à³¹ÓÅ“ƒˆí—G‡ÛÛ«‚ ½99¥‡‹ÇÛ×ù×ơ»ç°±»ËÓ­¾£ä­ÖÄÓÙ½­Ä¹ ½¾‡ó¶ƠỞ¿‰çâàïiù×ưÀ̀Ó!ĂÙ×ĂÈ̃ŒÛ,ĂÙö³±½Ă«Óù×ơê‰Û«‡“Íj½ÔÍÓø×µØëÚ߈™ áƠ ÁáÛù×ÄÓ¯¼̀Ó÷Ú² ĂÙÍË)éÛ9¥¡Á§ÔÍÓÛ«‚ ½9«‡“Íj«ÔơÔƒ¾©‡¥2ßëMË¿Åăà“Ơ¾¿‰·Ó ¥0ƒÚÙ½ù×ûƠưÀÏųÈå̉ Û麷Åù׋ȿµíj±»₫Ç̀Äë‡Û«·3uUÛ«‚ ½9߈ÍË)éÛ9¥¥Ø½€ÏÔ™Ăëö×ƠëöñÚ§Ô˜Áÿ×¹ƠÅÔ±»¡ÁË¿«·3uUëö”ÿù×£Ôé‰ñ5ñ·ùØÏ°»ÑØù›éöù×ơê°»åÖ­ÄƠóÔ§ÔéØ߈ÔXĂÙỞơèÅÏÔÛ«‚ ½9ÁĂéê—¶Á¹Ç̉ÁƯ·Å™‰kß [ïS«‡“Íj·‡‘×8çơÔ‚ˆÄԽȉ¿IÙ½ëöëöï̃ơÔƒv׿8íÆ·ÔÁ̉éJé‰Ó5“gesÁŃvÈåרá=™‰kß [ïSƯÓ ăˆŸ;çÚ±»Åبºé‡ÇæăàÙÚưÀÁĂÅô³óÔÁĂêö›¾ÏÅÙ½·ÔÑÓØ×ƒv9¥‡̀śv“Æù¾ïƠ¾«‡“Íj9¥‡ù×ûØÙ½¡ÈĂÙ›¶éçÚăˆŸ;Û«‚ ½9‡ºµØ†×ù×±»ÛÄÓµ‰™™ëéå¡»̃ÚƠ´ßăˆŸ;k©ùרÉ̉ß½Û«‚ ½9™‡¹ÚăˆŸ—¶•Ù™‰kß [ïSÏÅơèű»™‡ï»«‡“ÍjØÅÄăˆŸ;›¾ơº›ÛÍÓ™‡›¶é™‰kß [ïSû؇x߈Ă™‰kß [ïS«‡“Íj­ÖƯÓ ñÓÏÔåÁ‰ƠÛ×ô₫Ú©ôơêƠ«<ơê«Ú“Æ·Ô9¥‡̃ÄØ߈ÏÔÅÙ×Û«‚ ½99¥‡߈—¶×ÇŒºăàÆ°»›ÚưÀïﻇ·Ô§Ûר×ĂƯ‰öÔ©ÓÅÙ×Û«‚ ½9±»ëỌ́Ă™‰kß [ïSÙÑŸ}Û«‚ ½9±”‹ÇvíÓÁƯ›v‹Üçô9¥‡‡jéơ‰ø™‰kß [ïSăÔÑÅÙÚÏ¿Ơ¿ùúËÇôơÔ±¿œ‰¾I±»·‡‘×8çûưÁƯÙ½âÁ¯ÓơԹحڽô«‡“Íjï½¥Ÿß»ûëᾃØöÁ¯Èéê°»˜‰j̃ZîSÏÄù×đÓ½Ù½̃ˆ§ô¶ơʇ ‡Çù×å̉ “Ơ·Ó ¥0«»å̉ ߈¦ôÙ½³àÙÚƒv÷¼…ôă»Ÿ}㻂߈ƒ½ÍĂ¹Á¹óºÛ«‚ ½9¡Ôơêç̉•ǽëöívè‡ëö‡º̀ÓĂƠÅÿÚÍÓ»­ÖÛןÛôçô±»ר×Ú¥Øö§Ơ¿ßÎÅ·Ó ¥0Ó›¾™‰kß [ïSÛ«‚ ½9…ŒưÀưÀư“ƒv§ÍćØƯĂ¼ơêÉ—ä̉‘%Ù½«‡“ÍjóÇ™ÔׯÙ›Ú¿ô™Ó¾á µØ9¥‡×ØY¿»ß»û«»ÁñÎÅ›¾‡½ƒvơèÅÑÅĂº¡ÖưÀ›¾Ÿ»—Ư߈ù×™‰kß [ïS«Ô…¾ĂÙ· ÁƯ±»߈¹Ú½¾¬€©‡¥2ßëMî½߈«Úå¿ù×›·Ôă¡Èô‘±‹Çëöơ»¿ß›¶éÅØ­Ø£X§ôá ÑÄëÁÑñÏÔ§Æ̣Çù—ùÿõa±»ùê½£äÁ̉׼‹Óù× Ơƒv«»̀Ó +шÿ¯¶»‡‰ ƠÙ×£ÇóÇă»ưÀ߈÷ٽ˿Ú׿ôÑÓ±»ñÓ̉ŵô½Û«‚ ½9Ơ¾GÓºç'Û«‚ ½9çÚëöÇÖÏÔÔ±»̃„߈ĽÛÔÛ«‚ ½9ÏÔơêÂív¾¹ưêɹ½ÑÓ̃ˆ±ÔÛ«‚ ½9߈±»ăˆŸ½yÿÂÛ×ĂÈƠéêÿÚưÀ¿Æù¾ơÔ£»·‡‘×8ç«Ô«»¥Æ¹²êöưÀ¹Ø‰ÔËƠ½ÅعàƯÓ ëö‚×¹ô†åñ»ñÙÓº×Ü߈±Á¹Ú“¹ƯNø¾ÍƠ8¤‡×Ó×$íêÛ«‚ ½9«Ô»qÙ½ưÎ߈·Ô¿‰Û«‚ ½9·‡‘×8ç‡Ú¶Ü9¥‡ưÀÏΩÓ߈¤ˆ\0›¾“ùê߈™‰kß [ïSêö™‰kß [ïSŸÄóĽ€¡Ô¿Å¯±ª‡’̀jÅ߈÷ÁÁ̉ĂÈÀĂÏÔ›¾ÓÏÅé‡8H¤‡HÖ ™‰kß [ïS«»ñÓŸ½ù×ÁëöÁƯ½Ă—¶ẳù×ñÓ߈â·™‰kß [ïS­Ä’È臋ÇÅÓ½ϼ—¶¯ÈË̉‹ö“Û½©ƒĂ»ĂĂÛºÛ«‚ ½9ÑĂXù׳Ơù×¥Ó©Ơ‡ívÖÆ«ÔæÚăˆŸơ꺽ù׫Ô÷Á߈˜Á‰Ûÿڵر»ßÄÙă»Û«‚ ½9ù×́ơ›¾¾ºÇÖ™ëéå9¥‡éÚÏÅÑÓ½€ŽƠ™ÓÁ̉ăˆŸº™‰kß [ïS£Ø«‡“ÍjÿÚ߈àÅ·Ô­ºÏÔ¹¶¿‰9¥‡ؽù×—Øù‡ûØß»û³Èø‡Ô8¤‡ÚÀÛׯ¿±»‡£äϼ®¼ÇÎÅ ëöŸØ±»§Ó÷Á»Â™‰kß [ïS¡ÏÔËÖëöë‚ăÁƒù×ñÓ¿Øø×߈©Ç›v߈”%û܇k»‹‹ÈƒØöóË̉́ÓƒvơèÅô¯¾ëö­Öœ·̉ ¤0ív¡ÈăˆŸ±̉ƒv‘âØ×ÂĂï»Úª‚ +¼9…Ở‡ŒÏÄù×ÇÖăˆŸ;±¿ÏÅÙÚÁÛ¶ + +ÓØ9¥‡™‰kß [ïS™‰kß¹Ú«Ô¡Û±»ËƠÙÚåơ£Øø×ÏÔ±»»ØÓº»½ăˆŸÙ½•%ö¾«Ô«ä©‡¥2ßëM‡º¡È™‰kß [ïS÷¶™ëéå¹Ú“ÈßÄÙ×̉ƠëöÍỞÅ—¶©¼ï½±»ÅØ…ß»ûå×ÏÅ›¾êöª‡’̀j§Æ…ؽ™Ă‡ŒĂͼñÚ«·3uUÎ̉ù×½€×Ü™Œ±»ß»ûơêƒvù×™‡›¹¡Áơèřӿ¹ỵ̈̉«bÁ‡é/×:߈Û«‚ ½9߈‹Ü·§D ÍĩӇÇÏĺĂÙå̉ ­¾±»›¡ÛÄÓéºÛ«‚ ½9߈ÇĂ«‡“ÍjÿÚ‰¿I·ÔĂ »yÏÅçºØ¹Ú“ƠÇ̉¹ÚÑÄë߈ĂĂ·Ô±»«·3uU‡Ç“Èù×—»ăàơêß™ù׿ÔÍƠÏÔ¹ÁªÓºËÇ«ÑÍÄ”îăˆŸ;Ë̉ăÁ¡ÛÛ«‚ ½9Û«‚ ½9«‡“Íj‹Ü×̉ơêÓ̉ßÖ­ôׯ­ù׺ívÏÔëöqۘ‰j̃ZîSăˆŸ;Íİ»ÜÓ ́vÀ¹Ǻ‡ÛñIJ¾©Ù½º߈µØï³2ź¹Ú¸à_Ù½́vƠñÓ·‡‘×8ç°»ëÔ߈9¥‡á=ơÔƒvÅÓ‹Ó×¾8ׯ׿8߈ƒv¾‡º¹Úơ꫇“Íj‹Ç¡»«»¢äµÜ×Ơ†7§jßÄÙ½ÏÔáƠ±»—đ™‰kß [ïS´C™‰kß [ïS‘ڽȿ»ËƠ9¥‡™‰kß [ïSÏÔåÊ€ĂÙûîƠX÷Ááê‡ÛÛ«‚ ½9ëÚ߈á“‹¡Ô™Ç¡ü»$½™‰kß [ïSëơáê߄ӵؕŒóÔƒ¾‘ăˆŸ;k­v—ؽ§ÖÓÅ£ØËƠ½ºÛ«‚ ½9¹ØéºÄÀ¡Ô×ڳܗ¶øæ«‡“ÍjÑÓÅÔ³Đ¾Ú₫öơê߈›¾‹Ù¥à«Ô™ëéå¹ÚíÆÚª‚ +¼9߈±»«ÔăˆŸ;±¿˜‰j̃ZîS±»ĂƠ«Ñ±߈‡ŒŸÖ¥Â—ˆÀÚ§ÔÛ×£»Ơ¾G™ÔåĂ«ÑưÀÁ̉½ÔÑÄ뛡9¥‡Á½ŸÈ߈9¥‡×±»™‡íê“öƒ…™‰kß [ïS¡Óư­†Ç¿ôư‡±ù1ĂỂ߈ï³2ÏÅ₫ÚƒÚ­ÈÁẰÓ™‡ÿÚ‹Óù¿±¿½ÏÅŸĂ±»߈«ÔÁÏ̉ï³2“Çùׇơƒˆ±¿߈¾ßÄÙëö±Ô·Ôëö߈µa“ÈÅ9¥‡ß»û߈°»߈¡ÔưÀÏÔ‡ÇщæÚ·̣ỞÍÓÓÆ¥Ø‘Ö©‡¥2ßëMÑÓ«ÔĂÙ߈ªÚ8¤‡¹Ú•Œ«»…Ơ·Ôơê±¾߈ùºØÚ«Úù׋Üؽ—ÔÏÄÈ̉Û׫ö“ƣ䙉kß [ïSăˆŸ£äÇÖ›¾ÅÁĂÙ°êØ˜êèä¡Ó’È÷Ú°»ôªÚÉĂ‘§—¶ÿ¯¶—¶ÁƯ™‰kß [ïS­]ßړȰ»ËÉ9–Ó“«‡“Íj߈÷$½ĂÙ­½¼Ă½ëº»ƒêöƠùׇÇß„†Œ±»µ¢™×½™‰kß [ïSù×ï‡߈µØÙƠj9¥‡çºÀӭغyÛ×î»³ËØ¾°»œöº½Ăù×ßÁÙÚ–¶ẳ«ÔĂÙ½›¾ÅÔûÖƒ½º Ëû»Óù×ÙÚùסȕÈû›ù×ÍôpÖÔ†6¦jƯº¼åŒ¿NÑÓ£‡̣½ ¹Úÿ§·Ô¡Ó‰đơêÏÔ«·3uUóǰ»ÎŻؙ‰kß [ïS°ÛƒÚ˜‰j̃ZîSùëÍË)éÛ9¥ëÖ³ÈÙƠĂÖÏÔÑæ§ô¡Ô ÈÏÅ›¾ß»ûÛ«‚ ½9§ÔăˆŸ±»üÀÂÙÏÅ÷‡ù×½ƒÏÔª¶2tT¹Ú½­Ä÷ù×ưÀëöƠ߈Û«‚ ½9ÙÚå̉ ÔûÓßÄÙ½ÏÔÍË)éÛ9¥Ăº¡Á¸Á³¡Ô¯ÛăˆŸ±»±»†×ÍĂ½Ù½ÑÄë­Ä»ơặĂù׹ؙ‰kß [ïS™‰kß [ïSƒ½™‰kß [ïSëö¼È™‰kß [ïS߈ăˆŸ;ÍÄÏÅçÚ9¥‡˹¹ÚơÔ÷Á“ƠÅØơÔ×Ó‡Œ„ô¿Û«‚ ½9¾¹+ơ׫Ը½ư“å̉ öź•ÇÍƠëöϼ°»Û«‚ ½9¹Ô™‰kß [ïSáÓ™‰kß [ïSÿ§Å¼ô%¡ÁµØÿ¿à“ö¹'Û‡Ç}ù×Ù½ơêªÔ…ÚíÁµØËô€Ơ߈•ŒíơƒˆưÀÛ«‚ ½9ƒÚ©Óù×µØù¿ÑÄë¼€ĐÄêù×­Ö¤%›¶éƒˆÛ«‚ ½9µËƠË4ÑÄëºơ؈Á‰¿IívÁƯ–Óµ×ÏÔưÍƠ‡Û«‚ ½9‡ñ5™ơµaèÚͼ“©­ׯ™‰kß [ïSÿ¼ơỖÎÛ«‚ ½9ÏÔÛÄÓĂºÙ½#¡º™ÓăˆŸ;ÁƯ±¿›¶éÿÚÛ×ơ$Áß»ûË̉ÿÚç4óÂăˆŸ;ÏÔívƒvăˆŸ;¹à±»ñӺȃv߈¹öù×ÍÓÙ½±GơỖ ¿ôͼ·Ü±»Ù×ÍË)éÛ9¥¹Ú™‡‡ØÁơèŃù׫ڇ¿‰½ù××Ơ½µØÙ̉¡¢ơêëö¯Ô”ÖăˆŸ;“ÆËÇëÔ”î÷Ù­ÖăÁÛ«‚ ½9ö½ƒˆ½ß»û߈Ù̉¼öàÅØ“½ÍBï½Å¥ƒØ±»·Ô™‰kß [ïSĐÓ™‰kß [ïSÙÚª»‚vç̃º »î»ÓÄÔÂÇ%ëöñÆÏ̉ëö«‡“Íjÿ¯¶߈ù׺۫‚ ½9®¼ Ú½áêÙ׃vÄÓöÁÛ«‚ ½9Ởơê’½ÇíêÍË)éÛ9¥ %ÏŽ䌾NÏÔỞ•ŒơÔĂÛù×Ëù×—ÓÁ•îá cvăơÁƯ¡ÛÓµƠ¾GÙ½Ö¾¹ÚùxïÀÿÚ¬Ö°¿Ö¾·‡‘×8çăàœÔÚÀ©ÜØÚ°È±»«‡“Íj¹Ú¿ƯÔ±»ŸÂ¡Ûù¿½ôæØ Á߈źÓº”†“ƒÖ‡Çö¹£™‰kß [ïS߈“ÏÅ£Ư°»±»ơꙉkß [ïSó¶è³ưÀ÷ÙƒàƒvÏÔ¿àç̉©vÇ»ÍÄăˆŸ;¿Ă«ÔǽÓØ¡Ô¯é¿ß—³ùê¡Á£ØùêôÆÖ×Ơ¥ˆ]1£Ø̃ăê™ÔÛשظàÛ«‚ ½9™đß»ûéôï½±»“Û±»¼‹Ç±ëØ·ÔÁƯăˆŸ;󯛾©‡¥2ßëMÂÏÔ•ŒïÅ“Æ÷$³È½ÔăˆŸ;¡Ó·À¿‰߈ùײØàƠùê×Ơ£Xá ÁƯ㻩ÀưÀÅ–³ÇÙ×½ÛºË̉߈÷‡¹̃×ƠôÑĂÉ«ÈĐÄ +ê +‡Úƒ¦¹ùꙉkß [ïS̃ˆ Û«‚ ½9é“ŸÅØ«‡“ÍjÑÄëÀĂù×™‰kß [ïS€º™Á8¤‡™ëéå·‡‘×8çƠơíÁăîơê¥â™‡¹ÚƯđ‹ÜÙ@ù×ÅÔçÚø×¡ÁÑÓƠXë×ƯÓ G½¹»&½É̉¶ëö¸ÚḮ°»œ‡Ă’¹ ÜN ‡Œ­½¼ÙƠùׇ“Æ«‡“ÍjÆ̉Îű»‡xûƠ™Ă—Ø¡âÛ«‚ ½9ëöá µaÑɵaǼ±»÷ÁÔºl÷Ú¨Ă߈ĂĂ¥ºăˆŸ;ößÚ¾ ±»Ÿ}½µ½€«’£ØÁ̉ưÀĂÙù̀Ó÷‡ăê±»§Ó­ÄºôĂù×Ûïá=ÍÄÛÄÓ8¤‡̃ÎÛD‡¿ÇØôÿ¼™ëéåĂٟŶÅÑ¥º½ôá=º¢äëöäÁñÖÙÁÏű»¯ÓÙÚÁù×Ùàù׫ÑăˆŸ;ơºÛ«‚ ½9Ï؇ÍƠÛ«‚ ½9ăˆŸÁÓÍ­„ÅØù×ù׈½ăâ’ÔÏÔÂÙ¿ßщ¹Ø9¥‡ÍÓĂÙÿ¯¶–¦̀»ƒÉ»­Ö×Ơ™ÔÚª‚ +¼9ăˆŸ;ƒ¾‘œ‰¾IÙ½ѶëößÚăˆŸ—ˆ×¾¾Û«‚ ½9½ôỠÙÚ½Û×ÍÄ—ˆ$ÑÄëëöºëöéơŸ}ë«·3uUÁĂº»¥ÚÔX©‡¥2ßëMÏÅơÛ«‚ ½9™ô¿¹íØĂ‚½‡xƯºÂÙŸ}«»ĂÙùסԓÆÅØ¡ÍÓ•Œר„ áƠ™‰kß [ïS«‡“Íj˜‡µØ÷¼¹Ú¡Á™ô­Ö±đö«‡“ÍjÍË)éÛ9¥½èô +9¥‡°»ăˆŸ;kÇڵ؃vù×å̉ ™‰kß [ïSé̃ˆưÀ»yö™‰kß [ïSº¡Ô±»¸È·‡‘×8çívïÂù×½ù× ëöÛ׉øăù×ív¾߈‰ÛĂÙƒvÓà›¶é†ºößÚÛ«‚ ½9™‰kß [ïS™‡©ØáØY½±»ÓÁû̉€¯ÈưÀ¨¼ÊDZ»éÓ¿½€ÍijÏÔ•Èû›ƒvÏỐơóÔ…Ô躳·¶«‡“Íj±¿±ÁÈçÚëö—¶·º™ëéåƒvö×Ă©Óºùב÷½ôÇÁ™‰kß [ïSƯàùׂÂÙ›¡‹ÈÁƯËÉ9ăˆŸ;ÓÆÿ¯¶ø‰ÅÔù×êöÙÚÓ%“Æ£äÙ½ÑÄ뜇÷$Úª‚ +¼9‡ºïùêơÙÚâäŒ Ă§Ó™ÁÏÑĂ“Æï»ăµĂåÁÈĂÿ¯¶±»›¾¥ÏÙ½Û«‚ ½9́ơ¡ÔÍÁçÚñÁù¿‹Ç±»üøƠÇÓ·Ô߈߈öÁµØ©¼ëöÍË)éÛ9¥ăˆŸ;´È–½ ™‰kß [ïSÙÚ÷ˆáêÑØĂÓÓÙ×½óÇ¥ˆ]1±½¯È›¹ŸÈ™‰kß [ïSëö¾ÅßÖ¹ÚơÔưÀăơ¯È¹Ú“È×¾߈³ÂÏÔăˆŸ;źçÚ—¾é‰ñ5ñ··º³ëùëÙÚ‡ŒƠö½Ôù×9¥‡¦º ߈½Øëö±»±»£0™‰kß [ïSáØÖ¾÷Áä̉©ƠƒØ×¾»ÂƠÅ­Ô¼‹ÇăˆŸ;đÄÑÓĂºçô¿‰ƒÄ¥ÛÇØƠX߈Ù×·‡‘×8çưÀăˆŸ;ŽÙ½Á ÏÔÙ½ÏŇǫ‡“ÍjñÖ÷Á Ûíº½±¿‘ÖÅôÁƯÁ̉ăàÙ×›̃°»߈í—G¦ÓÙÚ¡Ô±»‡ÚĐÓË̉Ù×·‡‘×8çÂĂ ƒö«·3uUËÉ9©Óù×ơêăˆŸ;Û«‚ ½9˜ôø× ø×9¥‡Ü½€·ÅËÓÑÓö‡Û̃»úáÚ߈°»¨Ú™‰kß [ïSăˆŸ«‡“ÍjƯÓ ©‡¥2ßëM¥ˆ]1Ù»ĂȹÚùë·ÔăÖ¹ăéØÍĂÅ¥Ï̉щ¹Á¾ç뻥Ĺګ‡“Íj߈̀ÓܺĂÙ—Ó¿‰±»Ăôơé±Ë—¶ÁƯñÓêöơêÔ] ËƠëöÁĂØù×û¹Ú₫ºרö‰íĂÙÖ¡Ô†¡6¡¦j¡’Ѷ£ ©ÓƯÓ áÓ±½ÁÛ«‚ ½9Ö$ÆØƯ•{™Ô’đ¦ôÁƯ™‰kß [ïSƒvÛ•Û™‡÷ơ½ñÓáá±½½Ù̉¥ˆ]1™‰kß [ïSù×ăˆŸ;k¡Áù×ă½©À‡“»ô¡Ưƒvó…۾šÁ²Ø™‰kß [ïSËg“Ơ³Ç‰ơσˆă»ôÎ +Óµ›¾Ú½ ½ÍĂÅÔ½ưÆÛ«‚ ½9ÙÚ™‰kß [ïSÙ½Û½̃ˆ½ưÀ™×ÅÙÇÅỞ˜êèä™ÔÛ«‚ ½9ưÀ¿ßù×ëö›¶é8¤‡½ưÀ߈ñÓ¥Ûƒˆ™ơÏÅ«‡“Íj«‡“Íj¶Ü ñÖÜ­ÄơêÙÚ¥Û·‡‘×8ç‘Ú¾àƠâà¡Ûå¿Û«‚ ½9éêù×ß»ûĂÙÏÔêöÏÔåÁùë±ëØ·Ó ¥0×$ơêáê¤ÅÙ½àØºÙ½ơĂ½Ươٽ߻ûå̉ €»¹!ºăˆŸ̉* ÇÖ¡Dêö߈ÖÅØ±»ùê½ĂĂ ›­±àéM™‰kß [ïSû¶èƒvŒ₫³ºó‡x8¤‡Ï̉߈¡Ô¹ÚËÉ9ùסșëéåÁ½éô¡Ûå̉ ºÓ× ûÀĂĂÿ§ÁƯ›¾íWßÚ·‡‘×8çÓØ‡ĂǺ½•ÓÍ¿«‡“ÍjÛºÙÅëơèÅëö§ƯÛ«‚ ½9ÀĂ™ÛÔ›¹Å§Ô˜‡ßÖ½ÔÚ ÅØ»ăˆŸ;ÍÓêöăºƠƯÓ ă¼“Ơ£ÇĂ çá»Øöª»‡º̀Ç ù׫dǼ₫§€º›¶éƒv¹Ú½Óó³Ơƒv¬ÖçØƠÔàö +«»¿ëå̉ ƒØ†ººơÏÅÈóÿÛÙÚÅÓ½½°»ơÔÏšȉ¿I½ÛéÏåÑÄ냮ڪ‚ +¼9·ÅíÆ‡×̃„Ó̉߈Çܱ»ƒvñÓº‡›¾Ï½ôÑĂÿ§àêÏÄDZ»íêÓÅÏÔ·ØÍB£Øÿ¯¶çÚỞ—»ƒ–¥Æơꌾ¿»Ù½Û«‚ ½9ÏÅ߈ÑÓàöƯº’¹„ÜN…±¿™‰kß [ïSÏÄ̃ˆßÄÙÏÅÿ¯¶É̉ëØ÷‡ÿÚù×Ó¾ÑàƒÖ²ÂÛ׫‡“ÍjÛ‡ÇÖƠù×ï²2•LJÇÏ̉ƒàƒ¡È÷Á¾±·‡‘×8癉kß [ïSÓºÓÅÓœȫ‡“Íjëö¦¹§Ô…¾ô÷Áù׽ŨɹÛ«‚ ½9ÏÄÏÔü ̀ÓßÅç$߈™‰kß [ïS¦ôÏÔ¶#è#÷½ăˆŸ;æ̉Ç»å̉ å̉ öÁ½Ô°¿~ù׫‡“Íj‘ầä™ÁÍĹÚÛ«‚ ½9Úª‚ +¼9Ư‰¹Ú­º•¾ÙÅëÏŋǓƠëöÏÔß»ûëö³ÂÖ¾8™‰kß [ïSçÚµÜĂĂ ›­±àéM«Ô¬‹ÓÛ«‚ ½9ĂÙùê±»Ûדȫ‡“ÍjöÛ«‚ ½9ÖÆ̣«‡“Íj±ÇÖ†ÚÏÔ¡Ô«ÔÀ¼×ÂơÔÂá°öé‡ƠXß»ûà꫇“Íjÿ±»ÏÔ9¥‡Û«‚ ½9íêơÔÏÔ³ơÛÄÓµ†ơêÙÓ§ôª»µØ´†ăºŸÈ§Æ¸ÚÅ™‰kß [ïS±»ĂâËâÁí˼€ÙŒë*«±Áï½±»Ù×ƠX™‰kß [ïS¹ÁÅôßֵ؅¼Û«‚ ½9ùêĂÙéÚ󢱿½Èôçźƒ½£Ü“Æï™ï½ƒv«¼߈‹Ó½µØÚª‚ +¼9ëö‹Ü·‡‘×8ç‚v “‹ï»Ở°»ÏÅßÁ»t›¾«‡“Íj«Ôù×µa¹®̃ˆÍÄÛ„ׯ‹Ü‡Ç½€«‡“ÍjƠ«»ơê߈Ëq´Åÿ×ßÄÙ›ÚÏÄÛº9¥‡ơԇܿ‰ÅÔÓØƒ½Ù×ÑÄë½²ŒÛ×îô‡ÇÁ¼½€¿́ƒˆ©‡¥2ßëMûu™Ô·‡‘×8ç«»±»½¶èÅØÍË)éÛ9¥ơêơèÅÙ½“¾Å›Ú«‡“ÍjÛ«‚ ½9ƒvư~̉ æ¶öĂĂăˆŸ;ăơÿ³Û«‚ ½99¥‡›₫ÿ¯¶±ÈăˆŸ;ă½‰¿Iâà∻Áù×8¤‡ÖĂíÚª‚ +¼9µØ¾ÍË)éÛ9¥ĂñÓù×çÚ›·Ô™‰kß [ïSơËÓÏÔ÷ÁăẳÏ̉ÑÓùêÏÔá¾Á½«‡“ÍjµØ† ƒˆµØöÁ¹˜à¥Éù׫‡“Íj¡È™‰kß [ïS—¶†ơ¾‰¡`±zù×Û«‚ ½99¥‡¼€µØ/Ç%¡ÁÛ«‚ ½9ăˆŸ;Å»™Ó߈ç£Ø/ưp¿»ÁÑÄë…%Û×Ë9¥‡£Ø½0‡ºÛ«‚ ½9¹àÀÙ—¶ñÚ­ØÇ›¾ÏỐơçºéÓÛ«‚ ½9ív­½¼¹Ú±»«‡“ÍjË¿9¥‡å•‹Hù׎¯ôƯ¹Ú©‡¥2ßëM¿‰”ÇƠÄÍÓÙ×ÿ¼ơê¿ß­½¼˜‡çÚỞĂÙµĂ®GøÿÚÉü߈ÿÚ¯ö̃»ú³£Ư­ÄơÔ«‡“Íj—ˆêöá=ÏÔÏÔÍÓå‰ƯÓ ¼»Ù½áƠ™Ö¹Ú«)«‡“ÍjÛàØÇÖƒvØí›¾ăơ·‡‘×8ç˜Ă÷ø߈›Û™‰kß [ïSăÚׯ›¾¿ô™‡àêưÁÙÚöÁ¡»щăˆŸ;Û×ëÓåÁ™ÓưÀñÚ¬¿©ÓưÀ¡ÈƠÁÛ«‚ ½9ÓØ«Ô9¥‡ø×9¥‡ÚƒvăˆŸù×퇃¾‘ñ›¾Åӷ܇º¯ƒ« +>öÛ«‚ ½9·ÈÏÅóÄç*ù¿ç̃»&‰¿Iáê²½Û«‚ ½9£Ôµ†¡Ôщƒ­Äº©ØáÓăÁñÍé§Ă¼½ëöăཇºƒÖ™‰kß [ïS«‡“ÍjÅÄăˆŸ;¡È™‰kß [ïSÛµ›¾œ‡­ÄĂèǺù×á ‰¿IùºëÚÏÔăˆŸ;«‡“ÍjƠ´ÑÄëƠáܯ¼ƒvç̃ÎÔóæ™×‘Ûå‡ơÔÿ¯¶á Ă¼¹£¸Ú¢»ưˆƯÓ ăơ¥ˆ]1߈ùº¡Ûëößçíêá=ÿÂíÖ¿Ư9¥‡߈±»ĐØ +½±ºùê´•ëö©ØÍß߈ùו̀¸ÚéºưÀ±ëذ¿ǺÂÙ‹Óå̉ ñ`ƒˆçÚƠXăˆŸ;¹ÚÎ̉ù׽Ȃvg±°¡È«‡“ÍjơèŧԩÓĂÙ«‡“Íjß„đ§Ø·ÅĂÙóƒֱ¿Ơ±»«‡“Íj§ôÛ‡ÁĂéºáÛå̉ Ù½™ëéå…»ăˆŸ¡Ô„'·Å‹ÇçÚ†Œ™‰kß [ïSíÆ±¿±»éÓˆÎţǣǹÚÇÖ±»ùêơé·‡‘×8ç°¿;à¬ÏÄÏÔßÚÏÅÙ»‹ë«‡“Íj°»ª‡’̀jºöƒv«‡“ÍjÍÄÉ…Û«‚ ½9Úª‚ +¼9ƠŇºÛ×ñ×ăˆŸ;ơêÙÚÏ̉ë°óöÍÄ«»Ù½Û«‚ ½9½ëö¿à—¶¶‰ß»ûÖ ¿»Ñí¿ºĂÙ¯G‹øgéÓ‡ù×›¶éÏÅ—§Í»Ở…Ơ“ÈöŸƠù¿°»ăÁ°»߈ư“Á½ÏÔ›¹™ÔﻋùÇÓÓ¼ÖôçÚ“¹ƯN’Ç Úª‚ +¼9»߈ Ùù×¾ÉĂĂô«‡“Íj’½«ÔÓ ‹›æëöƒˆ“‹±»¹ñ÷ÁÏÔÛª» ‡ºËÓƒvÛ«‚ ½9¯ÈÛÄÓñÄö›¡“Æù×Å»ơê‰Ûÿ¯¶Ăºá꽘‰j̃ZîS½ñÖ‰Û²º̣¬Ô¡á±ëØĂÙ“’ùơĂăˆŸ;ăˆŸ‡Œ¶ÙÅë߈Ï̉é‰ñ5ñ·éê½ăˆŸ;kăÄÓÁĂó+‡ºª»“ÆÛÄÓÏÔơê›Û˜‡щ°»›¾Á¿‰ƯµøêñÚ¥ÙÚ«‡“ÍjÛ«‚ ½9¦ÔĂ“ƒ™‰kß [ïSÿ‡ÿ$Ù½½íív«‡“ÍjâÁëöƒ½¼«·3uUăÇíÂƠ­ëö߈₫®¶¹àÆ­€÷Áÿ̃ăˆŸ;kăˆŸ߈ƒv¡Ơ­½¼ÿ.™‰kß [ïS‚Ú³1¿À”Öơê½å̉ “Ơ÷ÔÑÓ߈¼ö§ôé‡ôĂÙÛ«‚ ½9ÏÔ½ÏÔåĂơèŃv›Úù×ưÀ‹Üéô‹ÜÙÜ¿»9¥‡×ÙÅëĂ5Ẳ£ßÛ×ïƠ߈«Ô߈˹çôǩӱ̉¥Ö°»«Ô±»ùẲ«È‡ßéê™ëéåÔ·Øù×µô߈ÑØ™‰kß [ïScv±»˹ÀÚCù×¹̃çôÏžëö‡ŒÁƯå̉ ÑÄëăˆŸ;›¾߈±»ó¶ÙŒë*«߈×¾Û«‚ ½9Ïԇ׫‡“ÍjăàÁ̉º™‰kß [ïSư¢¤ˆ7\707ĂÙ¯ÛăˆŸ;kƒvÅӾŦƠùשØÍË)éÛ9¥ÿÚ±»‹Çɶ” óǥ؛¹™Ôá¡·Ó ¥0±»ùê™Ó™‰kß [ïSÙŒë*««ÛăÔ™‹ëöÑæ¯ÛƒÔ«‡“Íj뼫ÈơĂÏÔÙÚÏÅ߈߈ăˆŸØÚÙ½ù׋Üơԣǽ™‰kß [ïSÛ×щ¹ÚƒÖƒÖ¹ÚÁñƠ½¥¾Ï®Æ°»ä̉½·Ôø×€ºßÏĂĂ ›­±àéM˜êè佶诟™‰kß [ïS/ÍÄÿÚÏĵӟרˆÔ¡»Ž±»ăˆŸ;‹Üơèţد¾£»ƒ9¥‡ëö÷ÁƯÚù×ưÀ©Ó́ơ<ƒv±»ƒvơñ»ÉĂÅ–¿ôñÚë‹ÇœÁăºÙÚ½ưÜ麵ܑ€»ØÛ«‚ ½9±»ĂÈâêơ¨Ø߈¡Ô•×’¢äëö߈ºƒv߈ÉÅØ£ä™‰kß [ïSá_“¹ƯNĂĂ ›­±àéMƒˆñÚơê5Ơ£Ưù׌Ơ»Å™ôĂôËư…»ƒ½ù׉¿I•ƯăˆŸ;íÖ“½†̣ß»ûÛ«‚ ½9™‰kß [ïS¢¸×ÓÓçÚư“ív±»Ơ°»ăˆŸ;äÔŸív‡ºŸ}ƯÓ ñÓ™ÓçÅØéÓÖÆ Û«‚ ½9«Ô»Ûܵ†ÂÖ±»ơ»¹ÚÏÅ£Ø÷Á÷Úù×Û×ăÄå‡x›Úÿ'ÍË)éÛ9¥áêÁ¼óÇçØ§Ô½ï½÷‡à=ĂÙăˆŸ;káơèÅÛ«‚ ½9Û׵ءƠ´‰ß»û„—ءԙ‰kß [ïS›¾çô½™ ¿ß™‡åô‰àÜ߈ª¶2tTÅăˆŸ;÷ˆ¥Ç÷å5Ó÷‡߈£ØŸÖ·Ôψù×§ÔíÖ©‡¥2ßëM̀¼ÏŽ«Ô¦ÓŽƯƒ”Ö +ÙµŸ “ƠăÁơêµØÁ¼ÁƯăˆŸ;ăºƠăˆŸ;k匿N«‡“Íj«‡“ÍjÿÚÏ +Û«‚ ½9™ô8¤‡£ä€ºx߈ª‡’̀j°¿9¥‡½€ßܧØéº±»¹ÚăˆŸĂÏÅăˆŸ;ơÔ‰¸ƒ½ăˆŸ;°»µØ«Ô¯¾ÏÔƒÖ÷ˆÙ½·Èñľº×¾‹Ç߈…Œ°»¸Ú™Á©ÓµØ“ÈÙ½¾¥ˆ]1₫ÚăˆŸ;ÙÚå̉ Á̉ăˆŸ;ø¿™ăˆŸ™‰kß [ïS×Ơ†7§j±»›¶é‹ÇŸ}ɹÍË)éÛ9¥êö¢ä· ߈íê¥ØñÓưꙇœ·̉ ¤0ăˆŸ;ÛºùסÔÏÔù×áƠ½†Ă»Ëß»ûß½ǼŽº Ö†‡ü2»cŸ»Û«‚ ½9ù×̃ˆ¬›¡9¥‡Ï̉Ă¼¿×Ïԩر¿ÏÅÓ ‹›æå̉ ËÓÙÚù×¾ºÑØÏſȱ»½¶Ù½ăÄÛ«‚ ½9‘ÆåĂïƠ߈«»ơê×Ơ†7§jăVö÷ÚđÛß»ûăˆŸ±ÍË)éÛ9¥¹Ú•Œ£XÏÔưÂׯù¿ăÆ%›¾ÏÔщÅëöñÓ߈Û«‚ ½9ø×™‰kß [ïSơÔÛÄÓù¿éÜÏÔ÷Á™‡³ÁÓ½€ׯ›¾™‡›¾ăˆŸ;9¥‡ßÄÙ£ÓƒvívÿÛ™‰kß [ïSƠ溃vÅÔơâ¡Áƒ¾‘ŽÏỘĂ ëöÙÚ¹Ú߈ơꘇĂĂÙ¿̣́Âăơù×öáØÛ«‚ ½9߈ƠáêÛ×»ÁºùêăˆŸ;k¡È™‰kß [ïSƯÓ Ïű»ë½›ßƠ¾÷Á¹Ú¼Ùшͺ‹Ù߈áêƒv‹¾ĂÙ·Ô½ô¡Á½ƯÓ ߈ù×±»Ö̉‘Ɯܼ€…ƠgƒvßÚĂ¼é¸×h¥ »ØưˆÅØ«÷Û«‚ ½9ÿ‡ăˆŸ†ŒăˆŸ;Úª‚ +¼9߈ß»ûź߈¦ØßÁÏÔ÷‡ëöÙÚ‡ºÅÓ½«‡“Íj¬ÄÙŒë*«›¾Ù½ăàù×µØÑÓÅß„ÿÂơêÅÁù×½€­ÖœÓ»ĂóÔ½™‡Ó̉­ÄÇù×—ˆÑÄëƯ‰½ñÆÛ«‚ ½9ͼ¾‡Œ›¶éÿ¯¶Ûº߈ÛÜׯ±¿‡Ç–÷ơëí̃ơĂÏÔ™‰kß [ïSËÉ9ËÓßÖᬡÁĂÙëö‡™ëéåå̉ ©ƠëöÅÄÑ·…Öÿ§ÿÚŽ—»ƒvÑÅË¿ÜÀ³ÂÇÂщăˆŸ;ïô«Ô‡Œ›¹ÏÔ…Ú¿àÏÅùד¹ƯN¿îÛºǼ¿‰ÛÄÓ°” ÿÚ«Ôăà«Úµ«‡“ÍjµØ™ơ†ÚëöéÚÛ«‚ ½9’¹ÜNĂº—¾ÏÔÁ̉“Ơ™Ôƒv°¿Ù×Ù½ÓÆ¾ÏÓ߈¯qùô½Ă¡ỒÅÏżªÄÏÅØŒê*ªöÏơƒÚ—ƯâÍË)éÛ9¥÷ÁÓ¼«âíØ½ƒ¬ôÙƒÿ4ª»ü¶›¾Å»¿́£Óß»û£Óëö¹ÚĂÙ™ÁÜĂÙ€Ư—ÓơêíÅ£‡ïůȦô±»½€߈ù×¹ÈÙÅë…ÚĂÙñÓưÀ˜‰j̃ZîS½…€­:ư§‡˜ơؼ¹ÚëÚËÇ’ÇÁ̉ÛÇÛ«‚ ½9߈ỞØƠÛ«‚ ½9ÏÔ߈ĂĂÙ½­½¼«‡“Íj™‰kß [ïSÙ½ºÙܫӥˆ]1¯ƠÁ¹§Ô™‡ÍÓ«ÚăˆŸ;k…Ø¡ÈÏÅщÛ™Á¥Ø“ +±»ƒvù¿µ†ù꫇“ÍjöÁ™‰kß [ïSù×ËӆDZ»óǡȥ.ºáêû̉̃ˆøêºÈó–Ï̉ËƠ“ưÀµƠù×Û«‚ ½9½ív™‰kß [ïSƒˆ‡‡Ç߈Û«‚ ½9µÈăˆŸôø#€Ó®GøÙ½¶¡áÅ–Ù½ù×·Ô•Èû›ºø×©‡¥2ßëMđ¹˜ ÖÆăˆŸïƠ׿8ÔXù׃v±‡Å؇—¶™‰kß [ïS‘gÔX¶‡Ö8æưÀÏÔăˆŸ;ÑÓù×™‹ÏÔ«‡“Íj¨Ç›‡Ö¹̃©Ï̉ăˆŸ;™‰kß [ïSŽÅ$ßƯỂƠXÏ«‡“Íj›¾9¥‡½ÔÓ¾ăˆŸ¿‰ù×çÚ̀Ê)èÛ8¤éêƒÖÍÄÿ¯¶ĐÄêĂăÔăÁ·º«dÏÔ›Y·‡‘×8çñÓäñƒvÁÓØ½ÅØ߈÷Úé‡ç«·3uUµØ™‰kß [ïSăˆŸ;kæ›¶éëöÙ×ÏÔ«‡“ÍjƠùê«Ûí—G›¶éøæù×™‰kß [ïSÎ̉ºÅĂơêëÖѶ‰¿IưÀ±»ƒ½ψ±½ÁĐ£äƒÔÛ«‚ ½99¥‡§ÓÛ«‚ ½9ÏÔ™‰kß [ïS‚vÛ«‚ ½9‡“ĂÙƠ÷ˆ½ĂÙÖÔ†6¦j̃ÁçôÛ«‚ ½9ÏÔ­ôÓØù¾Û«‚ ½9«·3uUù•½Ø¡ÉĂ¼³߈ËÉ9‡Œ߈©‡¥2ßëMÇÖơÔÙÚ±»ÿڵر»›ĂÙ÷$¹Ú½…ŒµØ·Ô£Ô߈Ӻ댫»ÏÔ§ôØŒê*ª‡9ÅÓ‡x›¶éùêëö麥‰ÍL…áêù×­Ä¡ÔÆ˜‰j̃ZîS€Ó¯ưĂ™‡Ç%Û«‚ ½9߈›¾±»éº‰Û¤ˆ\0ư­½ÙÚ·Ô‰¿I›ÚƯÓ Û«‚ ½9ÍË)éÛ9¥…ö©‡¥2ßëM¸Úù×ĂÙ¿ç±»ÙơÄ™‰kß [ïS€Ä÷å5Óψ½ºƒv9¥‡±”ưÀ©ØÅØÙÜ‹¸áØĐÓíܯ¾¹Úá ¡Ôœ‰¾IëöÿÚéê߈ưÀ™Ó´ĂµØÏű»÷ÁËÉ9‘ÆâÄäñ«‡“ÍjóÇó¤Ӄvî»±»Á̉ÅÔ¯°Ïų€ºߌ™‰kß [ïSơêÙöù׳ºóƒ•ǵ†ù×£äÏÔêöW¿‰ÿÚ Èëö·‡‘×8ç—¶¡Ô¾ßĂȱ»Û«‚ ½9•ŒƒÖÓ´Ơ¾G£Ô½€Ù½‚¾ĂÙ‰¿I9¥‡߈ñÚ÷ÁÅÔÙÚ߈ÛÄÓÅØăˆŸöÁF¼¹¡È‚vÙƠÛ«‚ ½9Û×ƠÑÓ±»ơÔÏŬơóÔ§âËᙇ’Æă»Û«‚ ½9ÅØÙŒë*«™ÓÍÛâˆÛ«‚ ½9“Ẹ̀Ó°»»Ú×åô«»ǺÏÓÂĂ™‡µØƒvµØÛ«‚ ½9ÏÄAƒvơY™‰kß [ïSĂĂ ›­±àéMÑƯÏı½’ÈùêºôûÙ›¾ƒ‰¿IÙưÀÓºÛ«‚ ½9¡Èâ½¶è˜êèä½ÏÔ©߈¥ÜÏćîôÁƯ–¶ívëöăˆŸï½ÅÓ¾ßƠÊ₫åÉăˆŸ;¡Ùu×̉ÁñíÆ÷ÙÅ»ơê±»÷Á™‰kß [ïS“Æơ꫇“Íj›Ú°»̃ˆçÈùꩇ¥2ßëMùê߈áêêöĂÙÏÔÛ«‚ ½9¯G‹øßÄÙ½ơêÇÖ̀¬Hº¼Åôƒv›Â¹¼ª‡’̀jÙ½¿‰ăˆŸ;û©Ø«‡“Íjƒ¾‘ŸØÛ«‚ ½9›v­Ù½ñÙ«‡“ÍjĐÓê¶ ‘÷߈á=ÛÄÓ‘÷™‰kß [ïSăˆŸ;kºÏŹڻܧÓÛ«‚ ½9Ÿ}̣Ç—ŒíÖ›¡ăˆŸ;ϼæÚÏÔ麡Áí*“\§ ›văà©Óù×ÏÔô‹É«‰„ÖÔ†6¦jơĂï³2çÚăˆŸ;ÿ¯¶ưÀ÷ÁƠđĵØỞÁƯÏÅ›ÛÛ«‚ ½9ÁƯ©‡¥2ßëM±¿…Ç₫…ØÚ±»ßJ±»™‰kß [ïSưÀù×÷‡߈óÄÓưÀ½ÈăˆŸÔơơêù×­ÄÙŒë*««Ô±ÁÄÏÔƒå̉ ƒv•Èû›ÇÜ«ÚơèÅÛ«‚ ½9½™Á»‡ÆÏÔºƒÁ ï½ßÔ›¡†¿߈ È‰¸Û×˿۫‚ ½9ëöñÓ‰Û‰¿IôÏ̉öÏÅÓ‡ÎÔ«‡“Íj…ô±¿Û×Ơ±»§Æ߈ÇÖ×¾ÔX²ÂĐÄê¡Ư·Ôơêơ»ëÔÿ¯¶ưÀ«‡“Íj±»ÜĂĂ#Ï̉ÁÑÓ¸Èô©‡¥2ßëM4«‡“ÍjÍӾߥâƒvÅÓ§Ô₫®¶³×ƠѶ‡ŒơÔ£ËËÉ9±»ÛÄÓ‚vívÛ½ûŸ£äÏÔĂºùê­ÔÆơêÚÇƠûµa¡Á½ÔßÚÛ«‚ ½9ƠăˆŸ;ù× Á™‰kß [ïSŒ¾ͼăˆŸÜ‰•ÙƠ˜ô ơv€Û¥Æẩ‹ÜÙ9¥‡߈Ï̉Û×ù×ù×½€·̃ơèź¿́ÿÚ»ƒ«Ô¡«ŒƠ¹ÚÓ¾“¸©Ó¾ÍÓ•{ĂĂ ›­±àéM±́‡“»Å‹Ç£äëö…Ÿ}«»¨‡¤2€̃êLé‰ñ5ñ·ÙÚ‹½ÍÓ½‡ Ơ¾¡ÿÆç̉½½€µÚù×Ù›¹±»ñÚÛ«‚ ½9½€­‡ù×»ˆÅÛºăˆŸ;™‰kß [ïSö°»Û«‚ ½9"Ï̉Ú‡Ú±»·Ó ¥0°»çÚ÷Ú¯)ƠX¡âÀĂÁëö›¹…¾™Ô’™‰kß [ïSÏ̉̃„Û«‚ ½9߈Ú +ª +‚ + + + +¼9 +‰¿I‰¿I–¦̀»ăˆŸ;±»™‰kß [ïSÛ«‚ ½9±¿™ÁÙÚÍÓ᫇“Íjÿ¯¶ƒˆ̃»ú×àƒ×èơÍË)éÛ9¥¶‡×­Ö‰ÛϺ‘́ĂÈÛ«‚ ½9º½ÿ¼ HÊûH©¼‘ÆÛ«‚ ½9¡Ưºù׫‡“Íjù×ù×¼¹®ĂÙ½ÓØƯÓ ±»§ÔçíÛ«‚ ½9µØÏÔç'ÛÀ¸ØËÇĂ*´ÁÏÔç̉«‡“ÍjƒvÅØƯÓ «‡“ÍjŸÜ«‡“Íj¼€ ¶¦D + +ؽ©Ơ­7ÏÔïƠ…ØñÓ%­ÄÛ«‚ ½9©ƠÅÙ¡¼ôÙY½ƒ½«‡“Íj±»Ûº½‹Ü›¶é̉ÆßÄÙ%¹ÚË·yÿÛûÓ¼ÜÛÚăơ«‡“Íj³‹ËÉ9§Ô½óơëÓÔщéơĂ¼»«»¤ˆ\0±»ïÚơÔ´Åëöà=ÍB…¾Û«‚ ½9¶Å¾™‰kß [ïS¾ßƠÏåƒÖÔ™‰kß [ïS±»©›¾ưĂŒÖÙ½°»Ëëٽ剅ƠơÔ“Æăàÿ×óÇ«ÑöÇØ·Å©‡¥2ßëM–ˆơêÚ×ñÖáĂ·‡‘×8çÙ̉ĐÓö«»öŸŒ¿Ă«‡“ÍjăˆŸµØ߈±ëØăˆŸư‡±ù1ívÙŒë*«ƒw×¼ÏÔ«‡“ÍjÙÓ§ơƠºm˹׿8ÓÅ÷ÔÏÅ™‡Áe¨¼Ïß—ˆưÀ°»°»çÚ¿è׿«Ñ“½­ơĂÇÖÁSÏÔÍăˆŸ;k«‡“Íj߈…ùƒv»ÁÛ«‚ ½9¡Ôù×ßøŽêöƒˆăĂæÚƒ½º«¼ùơ匿N«Á¡ÛÅÄçÚ°êØщ¢»߈½ĂÄô‹¢¿ÜƒÛ™‰kß [ïS©ÇÀ½‡ñ5§Ó™‰kß [ïSă½¯Èׯ·Ô߈µ‰µØù׫‡“ÍjóÂÏÅƠăˆŸ;߈¯È±»¸ÁăˆŸĂĂÙ½¾ôÙŒë*«¾(׿8ŸÖÿڭĹګ‡“Íj́±¢²ÈĂÙĂÙß»û÷ÁîÅÍÓñÖ™‰kß [ïS¡È¹ÚÇÖ߈ûÖÊÓûÛ»÷ó"ŸÅüÁ߈9¥‡¡Ư˜êèä×ƠÁ‡é/×:ÍË)éÛ9¥ɇ÷Á¹Úå̉ ƒvăˆŸ;߈—¶å̉ ø¾9¥‡™‡—Ó…ÚÁÔơ߈ù׃vû(߈ưÀöƠ›¹ñÚÆĂÙẩщ߈8¤‡ăˆŸ +ÑÓßÁ§ƠĂĂơÄ—ä·‡‘×8çÏĵØ߈ó|×¾²×ƯÛ©Ø¢»÷Ô‡‚öÁ&ÿÚóÇ₫ X˜Ó¢Ó ŸÖ«‡“Íj«Ô/ɇöÏÅù×”{ÁĂùêªÔÚÆ™‰kß [ïSÍê%¼ؽ×¾ơÀ»n†×ƯÎöó¶‡Ö8æ§ÓÑÓ±»ÜÆ«‡“ÍjÅó#åÁùêÙ½¶Û«‚ ½9éêàˆ¦À0¦p¦ÓØ·ÔăˆŸ¼«»®ö7ÙÚ“̣ÏÔº«ÔÙÚù×å¿ÙƠ·‹™‰kß [ïS˜‰ j ̃    Z îS ›¾ŸÅÓÆ±»ëöμ–¶Ïĸ£“Èá¬Ù½»÷Á˜×Û«‚ ½9Ø·‡‘×8ç÷Áå̉ Ľ£äÁ§Ô‚v5Ç_™‰kß [ïSĂôÛ×ÇÇÜíº—§Í»ƠÄñÖŸ¿¾Ú߈ëö§ÓÿƯ¡Ó«‡“Íj߈רÛ«‚ ½9€º½ï½¡È½±»9¥‡…»¿ÀßÚ±»ăˆŸ;–»œÂ‰ßơÁ|±»ÛÀÏÅψ«ÔÙ½¾ßß»ûóÔ¾ưÀ¿à«‡“Íj¹ÚỞ̃ˆÓ̉¯G‹øû(̃ˆÏÔƒäÏÔÏÔñÚƯÓ ß»ûׯÍÓ™‰kß [ïS9¥‡Û(±»ù×½ÁÉ̉߈ËÓù×ÏÔơÙÅëívĂôơí‘™ÔºŽ›¾ñÖ½€©‡¥2ßëMăˆŸ;¡Ôử9¥‡™‰kß [ïS˜‰j̃ZîS½Ü˜‰j̃ZîS™‰kß [ïSá ·Ô«‡“ÍjóǃˆÛ«‚ ½9‡ÚŸ›¶éßÅôƒ½ÙÚÙÚăˆŸ;áÛ«»Û½ÏÅÑÄëרÅ–“ƠíÙƒó%‚ÔñÖ÷ÁưÀÅôÂ÷¼ơÔ9¥‡©À«‡“ÍjªÔËÖß»ûÑÓ¥Æø×û(›¡•%§Ó§Ù½ÓØ·Ô«‡“ÍjÇÜ™‰kß [ïS±»ù꫇“ÍjÛ«‚ ½9†ºưÀ©‡¥2ßëMùêå̉ щ…Ûº©¼߈ÏÅ߈å̉ «‡“ÍjÓØ©ÓçÚ‹ÇÏíÆÏ%½û؇½§ºù×ÿ¯¶æôÛºÛÇ̉ÏÔ¦ôùêƠ]ưÀ߈ñÓ½Û«‚ ½9ÛÅ•´Å¥ëöµØ­Ưß»û‡ÇÖ·‡‘×8çù×߈•½ưˆ³(ºăà‡x™ØÙÇĂÑØ­Ø¾£ØÏÔˆºëöé‰ñ5ñ·ç$°»ëö•ÖçÚ÷‡‘ÆóAÏÄ÷ÚÙÚ”¶µ†ưÀƒÍË)éÛ9¥ơêăˆŸ;µaăˆŸëÚ±»߈³¹ïƠ¥ˆ]1Ù½£ØÇØ%½Ăđ“ǺúƠ½±»ÏœȃÔÅÓÛÚ½€÷ˆ½©ÓƒvÛ«‚ ½9µØµØäÁO¡Á÷ÙÙú˜×Đ¾ÁƯßÁÑĂüĂܕǯÜÙÚ±¿Ï̉§ÓÄÀׯ Á™‰kß [ïS¦ô“ÆÇĂ´'ßÚÆ°»߈½ºçĐÓĂƠX³ô§ôÁ×ñÖÛ«‚ ½9™ëéåר°»ª‡’̀jÛ«‚ ½9±½9¥‡½½ÔßÄÙ׿8…Ơ“Ơ¶øơÎÔÛ«‚ ½9ÁƯôÉÀưÀÏÔơÄÅÓÇŰ»ñÓ±»ƒv±»™‰kß [ïS¶Ü×Ơщ‚¾´a ¿»ÙÚ«‡“ÍjÛ«‚ ½9ˆ‹ˆ˜‰j̃ZîSÀ½½ØëößÄÙÍ·ÜçÔ¡¹Ú¥¾›¾­Ä™‰kß [ïSĐÄê±»¿ö¹Úµ†ÏÔ¶ơÄó–ÇÖí‡ÏÔÚª‚ +¼9ÙÚ·¼Í79¥‡±»·ÜÙŒë*«̀Ó8¤‡Óذ»ñ»©¼¿àÁƯ߈ááÄô«ÛƯ‰åõØưØưÀ³ψ÷ÚĂȽ¿ßÛ×ùêÏÅ’ÆÀ½÷‡ă½£Ó‹Ç½™‰kß [ïS™‰kß [ïSµØåÙӛ¶éºĂÙ•º¥ˆ]1—T‡ä© ¥ØÁ½ׯñÊÙ½߈Ƽ +±»ơÔYѶß½¥ƯÚª‚ +¼9ăˆŸñÓ™‡ơêă½óÇ«‡“Íjщ߈ôêÿ¯¶Ơ߈¡È߈¿ĂÈÁ|ÙÚ›¾ùê¿ßư§‡ív—¶ÛÀÓÓĐæ—ºưêö×¾ƒ‘ÛñÖ±»‚ׇڙ‰kß [ïS%›ÁƠÿ¯¶·§D ƒÙ½¥Âù×óÇù×¥ÛÑÄëÙÓ£X¾ÅăˆŸÖÆƒ¾‘߈¡Á±»9¥‡éJé‰Ó5“gesÁÅÏž¹x“Æ™‡‡9Ưï¯È¯‰¯0¥ÁÿÂßKÛ¾ºƯÓ Ú×±»ñ×ơÔé¾…ôº½ ¯ÓóÂÖØ§Óăà‡ÚƠơúÿ¯¶£äù×áùÓ̉óĉ¿I™ơ߈÷ˆ½€Ö̉¾¥ˆ]1ßÚÛÚÙÚäÖĂÙù×™ô›¡ó«Ա»¯̃ˆ×Ơ«‡“ÍjÔºlŸ»‰ÛçôỞ÷ÁÛºñÓëö₫®¶Û«‚ ½9¹ÚÁĂÂÁ̉©‡¥2ßëM±»çôÏ̉ưÀŸ}¹ÚÛ×Ï̉ÏÔ³Ç×ĂëöÏỒÊ)èÛ8¤ñÓ³ºóâÁéÁ̉¹£¸Ú™‰kß [ïSÏÅÑ+™‰kß [ïSĂ⦨ÑÓơÏÄëö°êØÓ™ëéå­Ä¢äÏÔ˜‰j̃ZîSÓØƠ±¿ÏÔ±»†º÷ÁăˆŸ;±¿êöƠ߈™ô×ܾ™ØôÛ«‚ ½9™‰kß [ïS±»÷ÚÅØÓºß„§ÔóÂÑÓ’ÈơèŶèƒv9¥‡¯Û­ÄÓÆù×­ÄÛ«‚ ½99¥‡·Ô›¾ƒv™‡ƒvÙ½9¥‡ÙÚ󷇑×8çí·¹Ú߈Ë̉G½¹©¼óDZ»Û×Ïԅذ»ëöª‡’̀jÁ‡é/×:ÙÚ«»éÓ½µ†ù‡±»ÀĂ—»‡ÿ§ù×ĂºÏÄæôăˆŸ¹Û©‡¥2ßëM½‰¿IÏÔ«»àö̃ˆëöó|€Ơ8 +¤‡ +ăˆŸ×¾ËÇ߈Ă¥Á‡ĂÙù׺çÚÛÄÓ¡ÈᘇÙYƒˆ¿‰ö÷ÁÓÓ‹Çå̉ å̉ ÏÔψ߈ăÓ¡Á˜‰j̃ZîS­½¼±»¿Ø÷Ú‡đÇÏÔăˆŸ;«Ó¹ÚµØÅÓûØÏÔ§Ó÷¼­«Ñ¾µØ™‰kß [ïS±»â»£äºơÛÀí½ëÔÍÓ•Œ¤‰̀L„»É߈ׯçÚׯÁƯûÙơ¾ơĂ×Ơ˜‰j̃ZîSù×ÇôßÄÙù×ÍƠơ…ÏÔđÙ̃ÄØñÓ«‡“ÍjñÓù×—¶ö…Öå‡ÏÔÿ§­Ä¡Û™‰kß [ïS«‡“Íj·‡‘×8çĂºăˆŸ°½Ù½ßÄÙ×Ơ†7§jëö«»« ©ƒ»5ḯÁ̃ˆëö·‡‘×8çƠçé‰ñ5ñ·Ôơ“¡Ôœ™‰kß [ïS…»íƓǡȟÅ×ÜËÇàÓ§ôùסÁÛºâÄ8¤‡×½½ÁÍƠù×Ó™‰kß [ïSÏÔùê±»‚vùןơƒ½·Å™‰kß [ïSƠŘ×ëö²b‰¿I™ĂÏŽ©Ï̉ù×í«Ô™ôßÄÙçốÁ̉©¿́Û«‚ ½9ûØù×Äùשӿßÿ¯¶¬ÄºơêƒvăˆŸ¥ˆ]1ÅØëöº×¿8±gï½ơêăˆŸ;âˆ:jŽ¥ÙơêƒàơÔ­ëשˆ‚váê…ÖÛ«‚ ½9ơê«âù×÷¼ĂÓÛ«‚ ½9өر»ùסȮ¾ +«»«‡“Íj÷Ú±»ÏÔ™ÁÓ̉ëöư›µØÛ«‚ ½9ưµÙ½«Ô¼ĂƒvªÔ÷Á…ôĂًȃv9¥‡߈‹ÜÙ½½ÔăơÛ«‚ ½9̃Á÷Á«‡“Íj܃vƠkß [ïS±»רơêø×å¼ ÆØ̃ÄØÛ«‚ ½9¥ÁƒkívĂÅ–«‡“Íj¡Û»Ư¸Ú·Ôíꙉkß [ïS½ǼÑ·ßơ±)ÑÄë°»ÏÔ§Ô±»ÙÚùꃽ™‰kß [ïS·ëƯ ѶߌÛ,ÅƯÿ&ψâˆăˆŸ¸ÚëöĂô†×©‡¥2ßëMÓ̃…NjǿßÙ½ÖĂÛ«‚ ½9ÏÔ±»ỞÏÔëæ·‡‘×8ç߈ñÚƒÖߌÛ,—¶ù×߈×¹ëöµ†•îëöß»ûăˆŸĂÙµĂÁƯœ·̉ ¤0ßÄÙÁƯăˆŸ;•Œ‡x©Óר±»ƒñÓ÷‡¹ÚôêÙ½‰¿IH°»á¤ˆ\0…ôψ÷‡ƒˆ߈·ÈÏÔ—¶ó^Ơ˹½Ôîß•Œ±»¥ˆ]1ÂÙ×™ëéå¡Ô”Œ¥ÉÛ«‚ ½9™Óº§ÔăàÅÓÑÅÍBµØщăÁÔ÷Áå¼ ·ÔüÁ±̃ƒàăˆŸ;k‡º—¶§ØơêëöûӷŃv˜êèäÁ9±»ËǨ¼ж±¿«‡“ÍjɇÏŰ»›¾·‡‘×8ç߈8d¤‡dÖ©&«‡“ÍjÛ«‚ ½9™‰kß [ïSɇøêỞíêùדºÑÓÛÄÓƠŇƯÓ ù׫‡“ÍjƒØ§Ơ߈́ơù¿ϼ©Ó¦Ó9¥‡±»ÍÓRÇù×™ÔưÀ€Ơ•ÇËÉ9ŸÖ±»«äÁ̉ÏſأäĂÛˆËÉ9ùê¿ÅăˆŸ“°ÏÔ¡ÈăêñÓÛº±»ÿÚưÀá¼Ù¹±»ÅÔ±»­ÄÁ¼ÇÖçÙ½ÁĂÛº½€Áå¿Å´†·Ô˜êèäÑÄëÜö«Äó‡ÁĂÑĂƒ½Ùàëگȯƒ« +>Ũ¼÷Ô¹Ú߈ÖÛ«‚ ½9›¾á Î̉Û«‚ ½9¡ÛÇ»™á¤ĂÙ«‡“ÍjÛ«‚ ½9Ïű»Å&›¡±¿óÔ÷Á‡¿ëö߈ï³2Û«‚ ½9ù×»9¥‡ƒv·‡‘×8ç­¶Ï̉·Ó ¥0‰^«»åŒ¿NÛ«‚ ½9ËÇùꇺغÁè¼ÑÓ¸ÚÔùë ăˆŸ;§ÓóǹÚƠÁ|Û«‚ ½9ëö™‡©‡¥2ßëM½‡“ăÂ3 ó–£äÏć“¿ĂÏÔÛ×Ó̉ÿ¯¶ƒ߈ùê’ƠÛÆ¦ôå̉ œÜưˆ™‚ơê«»ƒˆçÚẩÅ»»ĂÛ«‚ ½9ºÁ›¹¹Ú߈£äơÄÁ½•Í…%‰‡Û«‚ ½99¥‡9¥‡öÁĐÄ꛾ÏÔ½€É¡Á9¥‡“‹ö$ÑÁ£äơê«»°¿ơèÅÏÔơêщÅ›¹¥Ä•Œ9¥‡ù×óÇ¥Ưù×Ó¾­Ä«»ưÀÿÚ ÔÙ̉àööù×ÁĂ›ÚéÓéº9¥‡½Ù½Û«‚ ½9Åtáê«ÔÁíÖâÁ½ăˆŸ;ÑØ°»ƒvù×½—©Û«‚ ½9ù×ÿÚçôÙ×ëöÓ'̀ª·§D º¿ß›¹ăˆŸ;ÏÄAÇØ₫ù×Ơŵ†¡Ơ¾«‡“Íj”£X…˜¡Á»‹Ó̉ăˆŸ;•Èû›ÙŒë*«ÄÖ¿ôĂ¼÷¼8¤‡é¯Ơ‰»ív§³‡xĂÚÿÚ³9¥‡ăˆŸ™ëéåÛ«‚ ½9Úº߈ăà±»·̃¯ÿ¯¶á=ơê±»¿ÙÓÅû¶ÓÅÛ«‚ ½9¿½¿‰¡ÔÛ«‚ ½9ÏÔù¿¿ Ó—¶ñÙđÓÛ«‚ ½9đ¹˜ ĐÄêźù×₫ ̣¶÷‡™‡¾¢XÛ«‚ ½9©ºû—¶­vÆÓº9¥‡ëö¿º‰yͼ›Û±»»Óơê™ÔÁƯÇáù×ơÔÎÅÅ­ÖË̉ăơÁ°·‡‘×8çøê´†ùסÁ¡ÛÏÄù×ÂÎÛ«‚ ½9›¾™‚±»‡¾…ØÓÆđÄ«‡“Íj̀ÏÅÏňëö…ƠëÆ½‡Œù×ù¿ÉÖ½á ±¿ëöï—Û«‚ ½9ÇÖ›é“×ϼĂÈƯ×׿8´ÎÏ׿8ÁƯ½¥†ĂÙƒˆïÚ‹ÇÙÚĐÅ÷ÁÍË)éÛ9¥ĂÙëö«‡“ÍjÁƯù×ĂƠÙ½±»«»øê¡»Û×ôï»Å“ŸăˆŸ;Åı»̉Á߈–¶¡ÔÓØ®é™‰kß [ïS¨¾ÿ'߈©‡¥2ßëM—ÓăˆŸ;k£Çù׫‡“ÍjƒˆóÂ翳ƒ@¹ÜÛÀŒƯ µØ9¥‡ÄÓ÷ÁÍÎù×ơꙇٽÿÂù×éÓË¿«‡“Íjù×íÁơêöÁÑÄëÛ«‚ ½9™‡ºçƒvù׫ÈÓ¹Úóùê—¾¿ØÓºáɾ§ô׿8Û«‚ ½9ÑÄë£äŸơꆌ¯È·#ù×±̉ùê¹à‡ăˆŸ;ºëç̉ưÀ×ƠóÔźù×ơ»ăˆŸÓØ9¥‡­ÂÔXï½ñÓ°»Ï̉ö¶§ô«·3uU¤ÛÅÓ·‡‘×8çñÎáƠßÄÙÙ½¿½¡±»¿¾ÅßÄÙ¡Ơ÷ˆ™‰kß [ïS™‰kß [ïS½ÿÛ±ëØÛÀǼ‡ŒÿẬǰ»Á̉Ûˆ·Ô±»9¥‡±»±¿Úª‚ +¼9ÿÔ…ƠÁñ·‡‘×8ççÚÓØăˆŸ;k±»ÛÓóƒvíØ³ —Á÷Á“ +÷ÔÏÔï½߈ÁĂÙÚƠXíË߈ªÚù×¥Û±»¤Ø—Ó€öÁ±»ơêÛ«‚ ½9ÙÚá̉­Ö©Ơ±»À½ơ|ùơÍĂÓº¢™ ÓØ¯ÈûÉ ˜‰j̃ZîS§Ô™‰kß [ïSÎ̉‡Çƒv5ăˆŸ;kÏÔƠ¸Ú Ûº´¼ï³2Û«‚ ½9ÅÓ—ˆñÚׇ½7ơê…Œ™‰kß [ïS­ØÓº¿ØÛ«‚ ½9߈½àÚª‚ +¼9§øÙÚỠÁơÄÆĐÓÍĂ9¥‡Ù½›‹ÿÚ½8¤‡éŒºÏÔ÷Á9¥‡߈ׯ¨Æ@Ïħ¹ÏÔđƠ½á¼™ôÑÄë±»¤ˆ\0»ˆá ÛºÛº‡×íêÓÔÿ¯¶‡¿‰ív¿Ù̉ûgË¿Ăíﱻ퇩&‰¿I½ô›¾ĽßÄÙÄưÀ‡Œ߈ơê½Ôô߈ÎÔ‰íº̉ûÓºÛ«‚ ½9Ó¾ƒ½ËƠÚÄ̉ù×¹ÚÁ‡é/×:ơê‡ñ5‚ºñÖÛ«‚ ½9μăˆŸ;gå×á ‹ÜÀ‡€è/Ö:‡“±»®GøØYƠÑØÚễˆ£»µÜÎÔ•Œöÿ¯¶‹½ˆàê‹Óƒ×ív™ëéåÏÔ’Å»•×…Ë̉³Ü—¶ƠÄù×—¶ăˆŸưÀ¸ÚÁíĂ ÑÓÏÅù¿“½Ù½±»›ĂÙ½¯ÈÍƠ©Ç½ÈăˆŸ;kÛ«‚ ½9Ïԃכ¾éÓƯơà¬ÏÔÇáÙÚ¿‰ÍÄ¡̃Î̉‡Œ¤ÛµØ»£ƒˆù×ÅRưÚ±»˜êèäƒv9¥‡ÇÖù×½Ÿ}«ÑÛ«‚ ½9ÓØ«‡“ÍjÇ̉ăˆŸ;±&³Â™‰kß [ïSµØÙ½Á̉ÙÚù¿ĂºÙ×ÙÚ9¥‡ŒE ®×Ă÷‡ùêđÓ¿́âà.ơêĂÙ̉‡ºñÆ9¥‡ßÏﲿßÙ½øàµØ½€å×Âùת‡’̀j§Ó…ÖшïÜñÓơǼ߈«‡“Íj§ÔçÚ™‰kß [ïSÿÚ±”³ÇÛ€…öÅØƒvÖÆϹ«‡“Íj›¾ÓØÏŽ€ÂÙÛ«‚ ½9éêŸÂÏÅ߈Ë̉óǣ؂aäơ߈«ÔÁ̉³z¹öñÓ“~Û«‚ ½9Ă¼₫Ñ·½Û«‚ ½9½±ËñơÔ±»å̉ ưÀéêÛ×ĂÙñÚǼ¶‡Ö8æçÚ“Ơƒv«»ÄØ߈ăˆŸ°»±»•Ûø×¾ºѶăˆŸ;ö¹Ú†×Û×ƠăÔ­?ơꘉj̃ZîS•Œ˜‰j̃ZîS±¿ÑÖÏÔ£ Åͼ¡ÓưÀµØ±»å̉ ÿ¯¶ëö¾‰₫ǵؗ¾å¼ Ï̉§Æ¹Ú̉º߈ù×±¿߈º¹ÈñÓ÷ÙÀ¼˜‰j̃ZîSߌÛ,ºÛ«‚ ½9•Œ½»ØÇÖ«‡“ÍjƠÚæÚÓØíăˆŸ;ÏÔÏÔé‡âÁá ψÁ㙉kß [ïSƠØ̉ÅÁÙ½ÿ¯¶ׯư‡±ù1·¼Í7ù×Á‡é/×:ăơÛºơêư“ÁË¡Á½Û«‚ ½9£ô«‡“ÍjÀ½ĂÍÄÅÔßÚçđ È +˹±»ä̉°»̀Ó܉ڡԮÈù×Ó°ËÈ9³ÍÄöưÁÛ«‚ ½9±»ÏÅÑÓဥœçđ½ÅÓ·ÔĂÙëö8¤‡ăˆŸμ°»ͼÛ«‚ ½9Ơ¾GÛ«‚ ½9Æ«‡“Íj÷̃—»À¹9¥‡ĂÖ±»Á̉öÜÀÙ½Ă±»Ó̉Û«‚ ½9³ÈñÚª‡’̀jª‡ ’ ̀j ÿ‹ÈÏÔï³2ÇâñÓÙ×ưÀÛÀ›ßĐÓÏÔ‡³ºó8¤‡×°)å¿߈̀­רù׈Ǻôúéº÷å5Óê§ÑÓ9¥‡·§D ©Ó©‡¥2ßëMÏÔÙÚơêööÁĂÙ‡Úùê߈º¹Ú—¶9¥‡ÅÓËƠ½ÿÚ߈ÓØŸ}¡È߈­ÄĂٗ؃v§ô9¥‡ĂƠá꽻؛¡ß»û•î“ׂ +ù×ß»û¯‰¯0ÙÚø×¡OщŸâÛ«‚ ½9ắëö”½ĂĂ ›­±àéM¡È¡ÔơÔ‡Œ­Äë×öù×ÓÆçôÑĂǼåLJڱ»Ă‰Ô߈¡‰ù×Ù½•Œ‡xăˆŸ;k›¾ëö™‰kß [ïSëö‰đ±»£ƯûăˆŸ;¾Ù×μù×ù׫‡“Íj»‹ơê‘«9¥‡·§D ÏÔIÙ½ÏŰ»™Ôùếvé÷ñÚÏÔˆ÷¿ôÿ¯¶µØơÔ« ƒv·‡‘×8çɇ±»³ÏÄñ£8¤‡î%¥Ø߈½™‰kß [ïS«»ù×ñÓÏÔ“ÏŽ8¤‡ăï¡ÛÍÄ߈ùê±»èêÚÇ’ÅØÛ¹ßÁ9¥‡Ÿ\÷Á“ƪ»ÙÚéÔÑæù×Ú׫ÔăˆŸ;áÓ¡Ô·Ô×ÚǼôÔåĂ‹Üÿ¯¶±¿™ÓµØ³ ă½“¼Å™‰kß [ïS9¥‡«‡“ÍjÍË)éÛ9¥º›‰ÙÚ‹ÜÅÓĂÙơÔƒÖŸÅ©ÓÍƠưÀ¢X0ψÇÖÏÔÛ«‚ ½9Ơ¡ÈƒØ™‡×ÜËÇù׿‰½€ƒvÛ«‚ ½9ơÔÛ«‚ ½9¡ÔÀĂ‹ÓѶ™‰kß [ïŚvơÔ™ëéå±»•Œ©Ø߈ר߈ŸÈỞöÁ§ÓƯÚ«‡“Íj½ƒvÛ«‚ ½9¿́­ÖơêĂÙ½«Ó‹Üß»û•½ÓØ߈ăˆŸ;Ăƒv¹Ú∩Ә‡ £Ø‹Ç£»±»¶ + +˜‡‚v«‡“ÍjÍÓÊÈ9ÏÄ©‡¥2ßëMăơöÎÅ›¹˜êèäÇ ÷‡̃ˆ˜ơñÙ¾(çÚĂÙÅÔ™Ưÿ¯¶½€‡ŒÏÔ—¶øêÚ×Ăºù×Ûº߈ÍB°»„Ơ‰¼¡ÈÚÀÑÓ±»­¾±Á™‰kß [ïS³̃ÿ¯¶ù×ơĂ¼¶  Ăº±»ŸêÏÔ Á­ÖÛ«‚ ½9®×ëö߈±Ô¡ÁÛ«‚ ½9Ï̉ﻫ‡“ÍjÏÔâˆ:ÅÓï½§Ơ8¤‡×¡È³È¶è¨¾ÓÅ߈9¥‡×™‰kß [ïSø3ôêëöëöƠÏÔÍĂÁĂëöщºçĂÙùêçÚív÷Á›¾±»ŸÅѶĂÙÏÅ¿»×¾ÿ)ÇÇÅÔÁ¾Ù×Û×Ù̉ÿ¯¶½±»½™‰kß [ïS“Ơ¹ÚơÄĂº·‡‘×8çÛ«‚ ½9ÏÄù׫·3uUñÚÇÖ·ÔÏÔµ†éÓÍË)éÛ9¥ăˆŸ;û(öơÔù×›¾¢ÈëöăˆŸ;­Ôơêí꫇“ÍjêơâàÏű»Ă߈±è÷ˆ¹óĂÛ׳b—¶•óƯ¡ÛăˆŸ›ÚÍÄđÁ ­ÄöÅÔ‰ơû(™‰kß [ïS½½ô©Ø£äÏÔĂô—Œ̣ÂΈûêăÛÛ×­Öơû°»ù[߈Ϲ±¿ƒv«»µ†½‡ºéÓÑĂñÚív±»áºíêùêăˆŸƠÜöçÇƠ¾GçÚÏÅ9¥‡ù׿‰ÿÚ¹ÚăơǺ½ô›—ˆƒvÅØë燑×8ç¿ßƒvù×Ö‘ÏÅÓëçܺ߈ÓºÚ¨‡¤2€̃êLœĂƒv·²¨Çƒv¾ñØăˆŸ™ÓÛ«‚ ½9±»Ù½ëö Ëûí½ÂÖØ‡±»ƒÚ™‰kß [ïSƒvÏ̉ÁƯ‡ÛÏÔ…ÔÛ«‚ ½99¥‡÷‡ÀçÓƠ¾G°»ùׇÚăˆŸ±¿çØ…¾±»æ̉¹½ƒ½Ï̉ƒØ“Ơ±¿ơĂ₫µÁ‡é/×:ÇÖº›¾ơÔÿ¯¶›¶é©¼—Óºø߈ÿ¯¶߈Ï̉퇃vƒv·&öñÖ«¼²”ÿ§¾ßñÁÍÄăˆŸ;›¾µØ§Ó«»ùê§ôÖÆÑÄëëö߈¯¾ăàÖ¾÷Áͼ½ß„₫®¶·Ô€º«%ơêñÙƠÿÚÁËÈ̃„ÙÚ±»¨Ø«‡“Íjù×ơèÅ–¶Ç̉Ù½ÓÔ¥ÜßƯÙÚÙÚÓÆÏÔ³ÈăˆŸ¥‰ÍL…ϼ‹Û•Ö÷‡±¿Û«‚ ½9Û«‚ ½9½»ÑßÚ“Ç₫®¶9¥‡߈¥ˆ]1ù×ׯ§ÔÖÆ·‡‘×8çÑĂ¡ÛơÔ÷̃ÁƯ·ÔƠË̉±Û«‚ ½9ÏÅËǹ̃ÏÔăˆŸ;™‰kß [ïSшù×çÚ©&Ù»ÁơèűëØƠXăˆŸ‘Æ÷‡«‡“ÍjúÙưÀ¦Ó¼Á Ë¿± ËûƒaÛ«‚ ½9Ž«‡“Íj§Ô…ö߈³ØñơÔö¹ÚăˆŸ;«·3uUÑÓå×—˜©Ó™‰kß [ïS¯¼÷ˆ߈ơèÅĂƠ©ÑØ×ëö½”ÏÔ«·3uU߈«‡“ÍjÙ‡Ï9…¡ù₫©ˆ¯èï½߈†ö +…Û߈¯×ÛÔơº¹ÖÏ̉ÏĽù×½°»ơêơÄ߈¡ÛÿÚöàơêÛºÚÇßÄÙàêăˆŸ;£ÔºÇÖÿÚ™‰kß [ïS³ÈÙÚù׿»ăˆŸ;k—ˆ÷ÙûÿÇơÔ¯¾ëöÏź»‡Ù½ĂÙ™‰kß [ïS—ˆÑØëö™‡˜êè䙉kß [ïSáÙÚ×Ơ•Œ‡ÚäÓ$©Ç©,ÍÓÓňµØơê¡ÔÂٷٽ™‡‰¿IéÓ‚·̃Ë¿¯Ơ₫ù×ùêÿÚç̉ưÀá=¥ˆ]1̣Ă‹ÈưĂ¯ÈÉ•ÛăˆŸ;ϺÛ«‚ ½99¥‡ƒv‘ïºÙÚá¬íÚ«Ô›v¡ÁÏÄŸÈëö½²ÂÛ«‚ ½9âÄ”Öù¿߈ƒ½ÏÔG½¹ÇÖƒv¹ÚÛ«‚ ½9ÙÚÙ̉—ˆáêđ»¹̃ÛºÍÄË̉á ±Ô‡ñ5ăˆŸ;»‡ŒµØŸÅ™ơ©‡¥2ßëM–¦̀»™‰kß [ïS·Å¼§‡ưÀ±»Üéơß„˜‰j̃ZîSÔÚÛ«‚ ½9µØăˆŸÓÔÍË)éÛ9¥ÏÔƒv‡xƯÔ₫  ËûÏ̉ççÚÿÚơêÙqöø×ăˆŸ;k¦ØÇÖ‹Ù±¿Û«‚ ½9«‡“ÍjĂƠÑÄëƒv¼÷Ô˜‡¹ ›¾ưÀ«‡“ÍjívĂ¿‰ù¿ù×ăˆŸ;ëÚ³ù×™‰kß [ïSÍB£@ÇØĂ胈«ÖÆçÚ‚×ٽߘêèä™×™‰kß [ïSÛڬĺ»Ù½Û±»ÏÔ•Èû›ÑĂËÉ9ù׋ә‰kß [ïSÓØØ̉–óÂ¥‰ÍL…ăˆŸ;©¼̃ˆăˆŸ;˜ƠXív©‡¥2ßëM¹Úơ$ăơ‡9ÎÔ™‰kß [ïSÅíÂÛ×ư“÷—º™‰kß [ïS™ëéåÛ×ù×µ†¡Ûëö«Ô½Ü«»ù×É̉™Ø©Ø©ØÁ©ÍÄ¿‰ˆÔ¹Ú¿‰¡Ûå̉ ÏĽ±̉ăˆŸÛ«‚ ½9ñÓ±»ĂÈÆÏÔI³È›ÚÅÓ×ưÀ¾¹x§ôß»ûÏħԃˆ©ÚÅ–íÚ±»ä×ăˆŸ;kÙ½«ÔỔ˜êèäÏÄÍÓ»ô‰Á×ỔäôCÑóùêÙ×ùÜáßs÷‡ăˆŸçÚ«‡“Íj£Ư9¥‡Ơå¡Ôí‡ăˆŸ;µØ§ÔăˆŸ;Á«»‡ĂÙ¿́‰¿IÓÁ½ù×µØùׄn ÿ³Æ× ß„¾»ö»́…›¡§Ó·‡‘×8çÛ«‚ ½9‰vá ™Ó½ÎÅ ¢í™ëéåù×Ể÷ˆÿÚ¡»ĐØɆ©Ç©ÓăˆŸ;÷Á±»­¾Á–˜ơƒˆÛ«‚ ½9¥Ø’Æ¿ºù×§(«ÔỂđÚ½à­ÛÜÑœ×ÜºĂª‡’̀j½Ô—¶Ửك؇º߈Á¼₫¯G‹ø—Ó½³ÔÜù¿߈¡Û×ĂÙ½ơèÅŸ}ÍÓ±»áÛ­‡߈›Ở½²½ÍƠÏÅÙ«‡“Íj©ØÙÚ·ÔÛº§ÆÅØÏÔỞºØÍƠË¿›ÂëöÿÂơê±»¿Å8¤‡×ăˆŸ;₫ ƒvƒÖ³ÓÅϼƒØ©‡¥2ßëM·Ó ¥0°»ëö™‰kß [ïSû÷Ô¹Ú×¾¬Ö±»߈ÑÓÙ½½€«·3uU«‡“Íjêö̀Ăßê Êû™‰kß [ïSï³2«»³à™‡ÿ‡ĐĂɵ†¡Áâˆ:k׿8Û×ÿ&ù×·‡‘×8ç½€ƒ̃Ö¡ÓßƯĂÚª‚ +¼9¹Ú±»ùדÈÁĂăˆŸ;ùơ™‰kß [ïSƒ™8¤‡Öôù‡Çä“ëÖÛ£ÔưÀăˆŸ;ëö•½™ëéåÿÂ÷‡Ûd·Å±¿ù×±¿߈®©‡¥2ßëMª¼íJÛ«‚ ½9·Ỗˆ÷Ú™‰kß [ïS½ÔÖÜ™ÓÏÅÇÖ‹Ç«ÔÛ«‚ ½9©¼‰Ô÷ˆ“Èù×ÁËơÄÛÄÓ«Ôôê߈ỂíÆ‚¡ÛµØÓØÄØ…ØÅÓơꉿIœ·̉ ¤0Ù܋ǛÊĂºëö±»™‰kß [ïS«‡“ÍjÛ«‚ ½9‘c¿ƯÁ ±»ơÔÅÓÅ߈ƯơñÓ·Ô­•·ÛÄÓÎÅù×ÚÆÿ¯¶ÏÔù׳ Û«‚ ½9–ˆÛºăˆŸ;Ù½ËÉ9‹Ç¾ß߈Û×Ă™‰kß [ïSëÓëöĐæÑÄë«b›·Ôß»ûĂºÛ™ºy匿NăˆŸ;ƒ—ØĂº¬ÖûÙÓÅå̉ ĂÙ¹ÂÑÄë±»å̉ Ơí¡ÛƯÜ—Ó‘±ÑÓ¡Û¼¡ÛƯơÓÔÀ¹‡Û‘ÖƯºƠóٽ廵ØÏÅË̉Ăè¹ÚÛ«‚ ½9½ÅØéJé‰Ó5“gesÁÅĂĂ ›­±àéMǺÉ̉ỞƠ¹ÚÂĂ«·3uU·Ô©‡¥2ßëMÅÓÍÄ«‡“Íjï²2éêëơͲµØï½ƒØÿ¼™‡«ƠíÚÓÆׯƠ™‡¶½ÈÙ½̉ëöËÁ™‰kß [ïS†Ḉơ¡»·‡‘×8ç›¶é“Æƒ½¥Ø›¾G½¹ƒ½«Ñ¹ÚóÂÏ̉ºá³ÈÛ«‚ ½9§Ôçô«‡“Íj½×¾½öÏĹÚï„©¼¹ÖÚ×ùÚÏÄϺ™ÎívÙ½ÂăˆŸ;kăˆŸ;Ùڳ“ÆÍË)éÛ9¥öĐØÿ¯¶«‡“ÍjăˆŸ‡ñ5߈ƒÚÖăˆŸ;k¹Úơº߈µà‹Ç9¥‡×“±¹Ú—өӲ‡ÇÛ«‚ ½9ïÂơÔ9¥‡¥ˆ]1đ¡Ô߈Ï̉÷‡éïơº•%çđ±¿¿‰ăÇí–»9¥‡×ëö߈ùگȾ’½Æ¿‰Ÿ»À¹“ÈçÔÙŒë*«Â ¬°àèMªÔ +ôöÛ«‚ ½9̉¾ôÔ çô¡ÂƠÑĂ™‰kß [ïSĂÙÏ̉‡9¥‡×÷Á¹ÁƠÅéê¿»ăj̃ZîS麷‡‘×8çĂ«‡“Íjøë½­¾ñßÄÙߨ÷Áº¡Û˜‰j̃ZîS¬Å +ƒvÑÓù×äÁ ߈çÚÛ«‚ ½9ïÚ߈‹ÜÁÑ]¡Á¡Èùê¹ÚÓØºˆơ¾¡ÔÛ«‚ ½9¿»·‡‘×8çƒÏ̉·Ó ¥0ÏÔëöƒÖù×™‰kß [ïS©¼‡åßÙ‡Ï9…†ºĂÈƠƠÁƯ¹Úù×óÂỞ™‰kß [ïSÇר™‰kß [ïS©î«·3uU«‡“ÍjÙ½ñÓµØÇÖ±»ÓñÖ–¶÷Á¾ÅŸ}ÙÚá=½™‡ÏÔçôñÓôĂ× ´½Û«‚ ½9«÷–½ƒvƒØÏųºóƒØûôăƠËÓívÛ×ö¹Ú™‰kß [ïS˜‰j̃ZîSÛÇ™‰kß [ïSçÚƒvÏÔĂĂ÷ÁĂưÀ™Ó̃ˆÓº¡Áăàƒvẳ£äÓÓ˜‰j̃ZîSÙ½–»…Ơ«‡“Íj߈ÛÄÓ™‰kß [ïS‚vµØÏÔá=²¾¯È©Ç¡È½çÚ‰Ôù×ëö±»›¾ƒvµØí—Gç®߈Ă—ÏÔ‹È‘ÚĂ¹ÏÔÛ«‚ ½9¡ÍƠª'ÏÔ«‡“Íj·Ôß»ûăˆŸ‹Ü¯¾ù×á=…»ÉñÚ°»9¥‡ ½€ưÅÏỖ ăˆŸÉ³߈ÓºµØÿ¯¶‰¿IăơµÚ¯¨ƒ½½˜‰j̃ZîSˆtư““Ʊ»á ¿èú(›¾À©‡¥2ßëMϹ߈Û«‚ ½9ôêɇ¹Úø¼›ŒưM“º߈íîăˆŸăˆŸ;öÁơÔƠçÚ¿ưÁ¾³Ơ#¡ÈÿÂÛÀÙÅë¸Úƒv™×ÇÖ·‡‘×8ç©Ó‘ÆÇù‡™‰kß [ïSä̉˜‰j̃ZîSƒÔ…»©ƠƠÙÚºÚº·Ó ¥0±ëØ«‡“Íj·̃áƠ­¾ƠXĂ™‰kß [ïS™‰kß [ïS§‚vÛ§ôÛÅƠϼ÷Á‡9º¾ß9¥‡‹Çơ»«»Û×ăˆŸó¿ßß»û߈™‰kß [ïS·‹óĂ¹ÚË¿ƠÙ̉ĂÈù×ŖߥØÁ ơêÎÔ÷ˆщăˆŸƠíÆù×ÿÚăˆŸÅØ±»ϼóŸÎÿ¯¶áêƒÀÍßÏÅ¿ßùêÁÚ¡Û·‡‘×8çÁƯ˜‡ù¿÷‡½9¥‡å̉ ‹Ù›¾È 9¥‡߈­‹ÍƠÛº̃ÔŸÄ·̣±»ôêëÔш©‡¥2ßëM“ÈơÄăÇÛÛº±»£Ư9¥‡Û×÷å5ÓƠºm¡È˜‰j̃ZîS̉º±»ƠÙ-»¼‘߈ï½ÏÔ߈ĐĂí—G½³ẪŒ Ú, ¾‰¯ÜÛ«‚ ½9±»Ç»¹È±»̃ˆùễˆÿÚêöÛ™Ô›¹ÏÔ˱ăˆŸ;½ôÙÚ˜Á̀ǹÚÇ̉ÏÅÏ̉ÿ¼ר8 ¤‡ Ö +¿ôï½çÚÁ|‹Ù÷‡ăˆŸ;áƠĂíꃾ‘Á̉Ù½8¤‡ÖăˆŸ;«ÔËÇöÛ«‚ ½9¬¿æÚéêăˆŸ;ѶÁĂÅàÛ«‚ ½9ôê­¿ÏÔ§â»±¿Ï̉ïÁ‹Ó½éÓß»û»yÿ¯¶Ă‡Œ–¶§Ô©Ơ«Ñ±)Ăƒv™Ó߈§Ô9¥‡ăˆŸ;‡k麺íÖÛ«‚ ½9ƠĂô +ÿ¯¶߈¸ÚÅÔ™‰kß [ïSÍĂ™‰kß [ïS‡ŒơÄÛ«‚ ½9×Û«‚ ½9ƯÓ ƒˆÚª‚ +¼9Ù½±ëذêØÀơ ̣Ç»½™Áù×±»ÁƯö›¶éÛ«‚ ½9é]ö½ÏÅï—›¹›¾ăˆŸ;÷ÁÉƯºn«‡“Íj‡ÚóԆǹÚíÚ¹;óÇól¯¾ÎÅ¡»ï»«‡“ÍjÍƠ½à Ú׹ڃ׭ÄÙ½§ËÉ9ƠÅÏÅïÚơêô«ẩº§…ù×̀Ê)èÛ8¤™‰kß [ïS«‡“ÍjơÔÛ«‚ ½9«‡“ÍjíÆ‡¿³(¸*ÙÚ±»ù×£ ơÔ‰Û‡½¿ôŸÖÓˆ•=‘ñӇDZ»ĐŇÇ爵ؘêèäΈăˆŸ;Ụ̀™‰kß [ïSơÔ·h›¾Ó̉éô…×ëÓ̀Ó°»ºyŸ’ßÄÙ÷Á™ÓÏÔ¶º·Ô«È™‰kß [ïS±½ï½ƒv¾ƒvø×Û«‚ ½9¾ºÙ×›ÚÛÄÓ́ÆĂÙ½Ôʹ½çÚÏÅÉ£äđß»û›¾ù×Á̉‚vơ١ソřׯ‰¯0óÇ«‡“Íjù׉ÆÿÚÛ«‚ ½9ăˆŸ£äăˆŸƠÛ™‰kß [ïS»ˆ‡â½ÍÓ›¾ƒˆ‡ŒíÖ½Ô÷Á„øׯ›¾ׯ¡ăˆŸ;Á½9¥‡ăˆŸÿ¯¶ơÄë“™‰kß [ïS·Ô¿‰•ùêâÁ™‰kß [ïSĂŽÏÄ¢ä₫™×±ăඡǧԩ‡¥2ßëM·ˆƒˆóÂù×߈±»£ÇóÆÛ«‚ ½9YëÓ›v̀Ê)èÛ8¤•Èû›«‡“Íjơꙉkß [ïS—¶¥>ù×™‰kß [ïSÁñưÀôꙉkß [ïSĂƠ%߈í—GâˆÇÜ—ˆ÷‡¨‡ ¤2 € ̃ ê L  ơèÅ‚v‹Çר‡Ç÷Á·Üëö·Å¶ö¿(ÂÁ̉¿ßßχº߈Ÿ}Ž€«‡“ÍjÛ¾ßûØßÄÙỞ¹ÚßÚ³ƯÁĂ«‡“Íj™‰kß [ïSù×Ñ̀ù׿̉£äưÀûØ߈™ëéåщÅëöƠÄٽٽ۫‚ ½9Ù½Ûº̀ĂшÛ«‚ ½9£ØëöÙÅëíÆăˆŸ½«·3uU«Ôù×¢X™‰kß [ïSå̉ ×ƠÅÔăˆŸ;Ûºç4߈¥Û™‰kß [ïSåôå̉ ±Â³ô½˜‰j̃ZîSăˆŸßÚ·ÅơÔñƱ»ÇÓÑÓÛº…Ư£‡Ù×£Øå̉ Ï̉â‡ÑÄëóÇÅÔ¿‰µ†ĂÙ×¾߈ÅØö«‡“ÍjÁƯ‰¿I§Ó¾ºö§ÔăơÏÔ§ôï½ùê˜êèäÁ̉Ù½¿ºÛÆï½»Ø¾œÜåĂÏÔá ׯ‚vÔXơÔ×¾¦Æ¾˜‰ j ̃    Z îS ëöÛ«‚ ½9ư­å̉ ơÔăÁ¾ÜµØçô£Ç§Ô…§Æù§÷Á߈›¾Ù½ĐÓÖÆ‰ÛÖ½߈щăà9¥‡ù×߈˜‰j̃ZîSĂÙ«‡“Íj¥ˆ]1­Ö±»½µØ¹ÚưÀ±»…àƯÅùׇŒåĂƠÚÚª‚ +¼9£Ç¥ÆÁƯµØÛ×ăˆŸ;ÏÔûƠưÀ¬Ô·Ú¥ºù¿ëÖÅÙàˆÀ0pÛ«‚ ½9Û«‚ ½9†ŒÍÓ¶‡Ö8æ—–°¿(•±̀Ó½£»¹ÚĂôơ¹Ú±)ăˆŸ;²×å̉ «‡“Íj·Å¤ÂåÇx₫¿ÅÛ׎۫‚ ½9­vù×±»öù×Ï̉§ÓÙÚ©Ø̃߈Ù½ÀÙÛ×íÖö«‡“Íjß»ûñÓ߈ÓØ«»¡Ưß»û©¹ÚăƠµØÁ|× «‡“ÍjÁŸèỂ½Ăϼö®Gø°»—ˆĂĂç)‡ºĂºĂÖ߈‘"°¿ăˆŸÙÚ¹Ú™ÁăˆŸ;ÁøÚÓ¾±»†ÇïÚÏÔÍ♉kß [ïS»»»ØÓ¸£ +¯ÈơÄçØÚº¿‰Íĺăơå̉ Ï̉ª»‚vÚÚëö·‡‘×8ç‹Óâºù׳à—Úù×ù×ƯÓ ±»ưÀÈÔăÁ§ÔÇŒÏ̉ÀË×Ơ“Ʊ¿ÙÅëͽ÷¶…Ơù¿çôÑĂçÚº’ºÏÚÙÅë«Ô‡x¶è™Ô߈¹Á÷‡µØ߈ßÁ›¾ưÁ›¾óÇăˆŸ;Ù½‰y™ëéå‹ÇÁơêŸ}×êơê£ä±ÔœØ¥Æ˜êèäÛ«‚ ½9×̉ËÓåÁ÷Ù«Ôơ»Ô¾FÁÆÅù×±»°»÷͘êèä8¤‡±¿ÔºlÛ«‚ ½9±»›¾“¹ƯNöÙ½÷Á›‰Á匿N…ö£Ü‡ŒăˆŸ;ˆ̣ÄïÚ»ØÀ±»߈ß₫ƠX8¤‡ÛÄÓéuñíÈ­½¼ưÀÉ̉©ÓÆÖƠįƠÛ«‚ ½9˜‰j̃ZîSµ†8¤‡é9¥‡ơԋDZĂăˆŸ;‹ÇÛ«‚ ½9™‰kß [ïS´añÔ½ׯ¬Ö§Ô¹Ơº̉²º̣¼ öøê“Ơ™‰kß [ïS¥Û×™ëéåÀƯñÓïƠ߈¡Á¶Å±ÖÚëöí(™‹ñÁ¶‡Ö8æµÜ“¦ô™‰kß [ïS9¥‡µØ§)·Åå̉ ¥ÆÛ«‚ ½9ß»ûÑӅ„ßï¿ñă‡ºÛ«‚ ½9±¡Ơÿ¯¶½™‰kß [ïSÓ¼ĂÈó|Óµù×éÓ·‡‘×8çỠˆÙ½ƯÓ ÙסԓƠº9¥‡ëöë¼ø×ׯ±‡«‡“Íjù×±»Ÿ}Ï̉·ÍË)éÛ9¥ŽĂÍË)éÛ9¥ÏŽ€¯ÜÿÚÑÄë߈§ÔׯíÆ÷ˆ߈܃©¾ÇÛÑÓå̉ ̃ˆ×ÀëöÍƠµ‰¡åꩈ“Ç¡Á°»ưÀöø¶¼ø×Û«‚ ½9Ÿ}9¥‡«»ẩÏ|óÇ™ơ±ØƒˆÇØáÛ›Y·öߌÛ,ĂÙíJÏÔ—¶ơêÅÓƒÚ»Øù×±»ëÚƒˆó"ăƠđÓÖ¾Û«‚ ½9‡×ÅØÿ¼Û«‚ ½9 Ëû¥‰ÍL…©ƠÏÔăˆŸÛ«‚ ½9«Ô±»«‡“ÍjÑÓ™ÿ¯¶߈öÁ±»ăˆŸƠºmáêÙ׫‡“Íj˜êèäßÛáê߈±»ăˆŸ;߈ơÄÛ¹ǼÛ‡º¿‰§Ơ•ŒÛ«‚ ½9߈ÏÔßÄÙÏ̉—¾±»߈èꉿI“¹ƯN¹ÚËÀëöáÉ̉ƒÚÙÚ´µaïƠ™‰kß [ïSÛ׉¿IĂÙ¡Èëöß½Û«‚ ½9§ÓÛ̀Ó‡Œ­€ó3ñ̉öÛ×Óº‡º߈§F¹Á¯×«Ô¹Úù×ׯăà¡Ô9¥‡«ÔÅÓƒv­Äƒv™Á›¶éÏÔƠ½ôĂù×₫®¶̀Ê)èÛ8¤™‰kß [ïS¡Ûï³2¦Ô ƒ¾‘‰º¡Ô¹Úÿœ•ø×̀Óƒ¾‘ô½Ô§ÔĂÖÿÁöÁ¥ˆ]1麹ÚÛ«‚ ½9ƒØ½¾¯G‹øºĐÄêƯº­€ÁƯ£»ñÆä̉ó¹‡x©‡¥2ßëM÷Á±½áɯȫѭ¿·‡‘×8çöä5̉÷‡ăêĐÓÙ×Ç̃Á¿»ØÅêµ.¥ÙƒvƠºmÅØëö­ÖưÀăº™‰kß [ïSỜª³̃‰Ô½đ¾ĂÙÛ«‚ ½9ăˆŸ;ÍĨ‡¤2€̃êL•×ăˆŸ;™‡Ù½»ØÇƒˆÅÓĂÙ½ơĂ…Ô—µ Ơù×ëỡ„ívÆ…Ơµ½ô·Ôå×ëö«âëö·ºÊƠëöª¼éÓ¨ÍĶǽ•ÿϺ°»±»ĂÙÍË)éÛ9¥ÿ¯¶£ä«bµøƒ¥Û¢ ¾º«bĂÙ‡Ú÷ˆ¹Öï»·ÔăˆŸ«‡“Íjº«Ú½ôăˆŸÏÔ±»¿́‡º¾›¾…ÇƯÜv±»9¥‡­Ä˜‰j̃ZîS°ÅOOÿ¯¶·Ô“ܽƒÚ«»ÍƠ©¼ÿ¼™‰kß [ïS±ÔăÏÅ÷ÁøŽ‰ÔƒÔĂƠÛ«‚ ½9¹Ó¾₫ ®¶ ÷‡´È™‰kß [ïSăˆŸ;Û«‚ ½9đÓ í—Gƒv•%ăˆŸ;ÅôƠ‹ÙÏÔéêÏ̉ăˆŸ;·Ø™ÁĂùê‹ÛáØƒvÏÔöÁëö“ǺăˆŸÿ&ơº‰yñÓĂÓ™‰kß [ïSăˆŸ;Û«‚ ½9ÓỒÇ%±»ËÓ½ÁƯÁĂ¡ÔÏ—³™‡™ơ߈߈ÁƯŸƯ«Ô½ÿ×ÓÅ€ºƯơ“Ơ©‡¥2ßëM±»º ‚ءȾ麭Øñª‡’̀j߈Û׿º÷»ë߈›ÁÛÅØă¼ùơ8¤‡×Ö$™‡ĂÖñÚº#Úª‚ +¼9ÏŢؓƠ£Ưÿ¯¶¼ׯÑӷ؇ºÛ«‚ ½9çôͺ«ÔùêăÁ»Ø÷ÁÙăËăˆŸÇ‰¾¹Úù×ívºáØĂăjÇÅØ“ƠăÇíăˆŸ;›¾×ƠĐÄê½áêăˆŸ;„nÛ×÷Á¹Úơê™Ô«‡“ÍjºÅ÷‡ÿ¯¶î½̣¶˾£äƠ›ÏÅﻘơƒ×¹ÚÛº‚×›¾ÛºÇ☇Ͼ¥O‘«‡“ÍjÙ½¡Ç›¾¡ÜÍå‡Ü˜‰j̃ZîSÛ«‚ ½9‰¿Iù×ù׉ĸ¼°»ù׆Œ«‡“Íj™‰kß [ïS¿»½ù×±½ă*¥ØɱéÓ¿ÅâˆÛºçôĂ÷ˆíê™Á±»̉ÅĂ«Ñ÷$¥‰ÍL…ëö‘ÆưÀß»û麤ƣü«‡“ÍjëöăˆŸ߈ùט‰j̃ZîSù×¹Ú™‡ÁƯ½ƯÓ ßÅ™‰kß [ïS—»·‡‘×8çĂÙăˆŸ˜‰j̃ZîS«·3uU·ÔŽùêçÚ¹ÚçÚûÓç̉¡Ô₫Ó¼ôáĂÈí‡ơÅ«»ưÀ—¾ÏÔßçÙ½›¾ăˆŸ;¶è뽄۫‚ ½9·Å½Ăù®½§Ôơ¦«‡“Íj¿ßơèÅñkûÓù×ËƠçÚƒ‹Ơ¢äÎ̉ׯÚºÏ̉߈—¾9¥‡ôÔ€ëÛºíï±»³ÂÙß»ûî¶߈«‡“Íj–-£äưÁ÷¼«‡“Íjñ‡ñ5×Üá ÑÓ÷Ú‡Û°¿ª ±»£ä»Ø¡yºéê¾…¾âˆ:k›¶é»Ó…»ÿ‡™‰kß [ïSÁƯÅÁ·ÅÉ̉¼ƠÛוÖçôÁ̉­ô¹ÚáƠăˆŸ;—»÷‡ª‡’̀jëöƠÄ÷ÁÉ̉†Œ9¥‡Ú8 ¤‡ ×íØϼ뾇x÷ÁưÚâÄăÂǽ8¤‡9¥‡9¥‡áƠ½€½Ø‹ÇÑöÛ«‚ ½9¹ÔéÔù¿ÏÅƠ¾G›¾ö½€·¬ívÛ×™‰kß [ïS½Úª‚ +¼9çÚщ—»ÙÅë¹Ơ›¾óÛ«‚ ½9ḯ߈߈Ç»ơú«ÔÁĂåĂ’Ơ±ÁÅÔơêÙÚ߈›¾ù×™‡ÿÇéÚá=àĂ¼€—¶˜‰j̃ZîS߈Ÿ¿ËÇùײáÛăˆŸ;ÇÁÙÛÄÓ߈ÍÄ9¥‡×ÙÚƠƒ¾߈±¿æ¬¾¯È߈¡Ạ́Ç—¾«Ô¹Úƒö×ĐÄêäôâơơÔÙ½ÛÚ%†xĂÙáâÅÔ±¿Ă·‡‘×8çµØ«‡“ÍjæÚ™‰kß [ïSưÀÏÅĂƠÙÚỞăˆŸ;Ù½Œº£»ÿ£Çëö½Û«‚ ½9áÚÏ̉‹¿ö̃ˆËÇăơ±»đ»щ°ÈŒ¾·̃Û«‚ ½9ÇÅÅ–Û«‚ ½9¹ÚÏ̉½±ăºÙÜôĂá=à ›Ó™‰kß [ïSÇç׿8ÏÔí–G·ÔĨ޹Ú÷‡ͽ߈¿ßĺñÓĂÈÓƒÚưÀÁƯ¿ º³Â¾Á¹çÚ9¥‡ù×Û«‚ ½9ÿ¯¶ĂăˆŸ߈«‡“ÍjỂå×Âå̉ ï½å̉ “ÈÏÔŽ—»²Â™‰kß [ïS«‡“ÍjøêÄn‰¿I‡Œ«»¾ÿ×ÙÚƒÖÏÅù×#ñ̉ù×¹Úÿڽȼ€ƒù×·‡‘×8ç·‡‘×8ç°¿ ›¾©‡¥2ßëM«ÔÍÓÁƯ9¥‡ß»û麣Üß»ûÏÔăà̃ˆ´¶†ƒvĂÈù×­̃±»ÍÓíÖư§‡ëöù׿»•Ç$ÿ¼¹½đÓ±»µØ©Ơ‡ŒùצÆùרYÅÓëöơêÿÚ™‡ÿ̉½«»Ÿ}…öÏÅÂØ½Ó™‰kß [ïSÅôÏÔĐÓ™Á«Ô×ÜéÓ™‰kß [ïSó¯׺óÇéꙇÙÅë™ëéåĂÈ­Äâà™Óƒv½ÑĂËÇ™‡…ö߈¶Å‡ă8¤‡×ù׳ºóĂËqëöÇÜ›¾ÓØĂº«»›¾¹Úáêù×ÙÚ«Ô‹ÜóÆÖ ߈¥ºó£¯߈Úª‚ +¼9›Ú·ÅăˆŸ;kÁĂº߈ëö˜‰j̃ZîS›Û´†­Ä¿¯‰¯0“Û½€ù¼™‰kß [ïS©ˆú̉ăˆŸ;›Ú«‡“ÍjÑÀƒ½ĂÙ“½Ó̉ç̉•£½ÈµØÏŰ¿ÁƯŸ́“Ơ‹Çé‡ÇÖăˆŸ;™ôăˆŸåƠÛ«‚ ½9Åéư“Û×ÍÓçÚ™Ó±»™‹§ÓÛ«‚ ½9‚vÑÓÏůȶƯµµaƠ¾G̃ˆù×ÉĂƒvÍƠ«‡“ÍjĂ ™‰kß [ïS¹£•ÖÓºG½¹·Ô—¶‚v™‡÷¶µêÙ׃ֱ»ù×å̉ ÏÔÀ ¡È½™‰kß [ïS«Ô±Á߈¡Ûµ̃ˆ8¤‡×Ù½¿‰÷ˆÙ³ôù׃›¶é¥ÄƠëöƒv…»—¶¹Úă»ĂÙưÀ«Ô󟽉æ·Å»Å€Ơs¥ÓÅôñÚï*ˆÛ«‚ ½9‡$ËÓáđ˜êèä»Ă¿»½€ü±»ÿ¯¶Ñ™ÛûÓƒƯ½ôéÚ¶ +è +¾º»Ø̃»úëö€ºëöÑÓÏÔ¡Û£ØÁĂ“&å̉ ỔÅÓÅØ½ÔªÚ³ ôÄ¿÷Áÿ“È™ơ—»±»ƒˆëö–ˆÂƠÿÚ‰Û‡ºĂÙ¹ÅØ©º©¼ĂÙÑ`ó̃­1ÏÅIÿ¯¶ă®÷ˆψ­ÄË̉úÙÿ¯¶·Åׯív‰»Â½ÁƯ¯ØÁ̃Ú×™‰kß [ïSăˆŸ;ͺ÷ÁăˆŸ;½¶ÇÖ8¤‡Ö‡×ĐÓ£ Ù½¶æÚƯåíÖưÀÛ«‚ ½9·‡‘×8ç±»¾ÛÇ̣ÄăˆŸ;k³¡—¶íÖï»ù×Ù½©ÇÉĂ‹ÜϹív߈óÓï³2ÅÓ‰Û­ÖƒˆñÓëöè¼Ïžï»Ă¹Ú¿éº×ÉÏÅ·̣ÙÚ“È™‰kß [ïSïÅÇĂëö9¥‡¶ÔÅ™‰kß [ïSëö¨¼“¹ƯNö4‡¸ă»ŸÖǺ߈χÏ̉ÇÖ߈ëÚƯÓ ƒv™‰kß [ïSù×·ºăˆŸ;¯È™‰kß [ïSï½ĂÙÛ«‚ ½9 Ëû±»ô±»ôêù×ëÓé‡Åă½ÏÔÙ̉‹Ó­¶¡ÁÅ÷߈ô¡ÁăˆŸ;këöÅ»™‰kß [ïS‡ºº—¶åøÚÑÄëƒvÏôµĂ«ÔÇØ‡aᾋöưÀéÓ9¥‡Ï̉É̉™ëéå¯ÓÙ½™‰kß [ïS­‡ơÇx™‰kß [ïSÇÖëơƠÅÏÅÙ½ûÓÅØ›¶é«·3uU…Ú¬ÖϺù×½¥ ÅÔơÔưÀư‡±ù1°» +ơÔŹù×¹ÚÁ̉“Ơö‡¿Åơñ»ï»‡ƒñ"ï¥5ù×Úª‚ +¼99¥‡߈‹ÜƯÓ ÅØ§#˜‰j̃ZîS½Ø™Ô¿(™‰kß [ïS߈߈Û«‚ ½9ĂÈĂÙ¹Ú÷‡ßÖ˜‰j̃ZîSÂÈĂĂ¿‰†ÛÆÛ«‚ ½9ù×ăˆŸÙ½Û«‚ ½9½ø¾ÑÄëÙ½Û«‚ ½9߈ăˆŸ˜‰j̃ZîSƒ½Û«‚ ½9ƒvăˆŸ;¾§½ăˆŸ;ï»±»£Ç±»ëö¥ÓóÇÅØ™ÓÙ½ØƠï³2Ÿ\ơÔ¸Úù×ĂÙ¹ÁŸÖù×ÏÔ¡È­)ăÇí™Óëö¨¾ï³2ưÀ¹ÚÙ½åÁÛ«‚ ½9«‡“Íjµ†½ñÓÏÔ¿‰¶&Ó¾߈Û×ï‡ͼÙŒë*«ưÀăơÛ±»ß„߈¡Ûù×ï½öù×Ă•ŒưÀ‡Œ©&±È™‰kß [ïSª‡’̀j«‡“ÍjáÛÏ̉ùºöÙœÓÆ½€›ç½¡ĐÄê©•Çáꙉkß [ïSÛ«‚ ½9éêÙÚº߈Ơ‡,éºỞå¼ ăˆŸ;•ÛƒvÅÔ¿ºÂ ¬°àèMÛ«‚ ½9…÷‡ưÀÏÔƒvÏÔá ½µØ¹Ø¹Úç'ŸĂŃˆ9¥‡¥Ø¢äÙ½™ÓÑÓ¾ßÇÖ¹ÚÂù×߈ÙÚ¯Üù×߈ơ»ºăỔê—¶щ†Œív—»ш́‡½È£Ưù׫‡“Íjï1ÎÅÙÚ₫Ú ™‰kß [ïS–Óº±»ƒv½ŸÖÏÔ»Áó^±»ưÀÛºÚª‚ +¼9Ï̉ÛƯÓ ùצӳÈËÖ©¼߈³Ưëö™‰kß [ïSÏÔ±_¹Á¥ˆ]1÷ˆ·‡‘×8熽ӺƯ÷б»«‡“ÍjÉƯÍË)éÛ9¥ÛÄÓ…»§Ô±»ÍË)éÛ9¥ÍÔXƠÿÂĂÓëö÷ÁÇ̉å̉ ¿Åç̉Á›¾÷Á«‡“Íjû(«Ôù·9¥‡߈œÓÛ«‚ ½9ăˆŸ;÷ˆÿ¯¶G½¹™Ô߈ËÉ9ÏÅ™‰kß [ïSÇ̉ÏÔ«Ố‡À¹ưÀÏÄÛÉÁ˜‰j̃ZîSºûÓ£»ºïƠí½¡È́văˆŸ;·¿ßïÚ߈߈©ØăˆŸ;ÍÓµ.¥ÙÛ«‚ ½9ºÛ«‚ ½9ɇ÷ÁÛ«‚ ½9ôÙ½ÂÍĂù×ÏÄù×ăˆŸ;ù×ÁƯ‰Ỗˆ߈º¡Ô³ÛˆñÚÓØåô‘à‹ÜÏÔ™‰kß [ïS™‰kß [ïS‡ÇǺËÉ9äô˜‰j̃ZîSÏÔÔX±ÔÁ¹Ó̉ï‰Ç½€Û«‚ ½9ăˆŸ;kÙŒë*«ÍÄƠ‡×œ·̉ ¤0ªÛƒÖÁÚĂĂ·ôÁƠ©‡¥2ßëMºó½ÔªÚ ÏÔ…ƠÛ«‚ ½9†Œ¤È;ºØÅØ›¶éĐØ•%Û«‚ ½9‹ÇÛ«‚ ½9âơÏÔÏŰ»ÂĂÂèơ—¶åĂÛÄÓơèʼnۃ×Ù¶ÙÚ™‰kß [ïSĂÖí‡ÎÅù××̉ï½™‡ù×ĂÈưÂÙºƒ½ñÚÚÀ«‡“ÍjßÄÙ“È·ØÙ½¶äô«b·ä¥Ư­Ô«‡“ÍjùסǓỠÄØ­v¹Ú°»½¡ƠÑÓÁ|à “È߈·§D »Á¿Åºú ŽéÛ«‚ ½9ëöåÁ†Çï³2ƒ½åĂ·‡‘×8çơê¼ù×±Ôí—Gù×½»ØÍƠĂÙ±»ăˆŸ;kѾÑÓùëƠîÂĂÛ«‚ ½9øê¹Ú½ÅÓîD +ùæׯé‡ëö°±»º™‰kß [ïS©º£Èª‡’̀j§ÔµØ‹Ç%‚vçÚ£ÓăÇíÿÚ±»«‡“ÍjƠXêµaùדÆăˆŸ™ëö8¤‡Ư‰¿ß×ÜưÀ̃ˆƒvëö«‡“ÍjĂÈăÁ³ƯéºÑØù׃¾‘Ở‰Ôç̃ªÓ›vĂ(íÅ‘B­€—ˆ½½ù×£»Ÿ}ưÀªô“Ÿ«‡“Íj·Ô8¤‡µØ›¾ÑØ­¾…ôï*»Ơ÷‡ØöÛ¹¡Ôß»û‡Ë¿÷ÁĂô½¡ÛˆÛùêÏÄ¡ß÷ÁDZ»Û«‚ ½9½€ß»û£º³Â‡ºE8¤‡Ö•LJÛ߈9¥‡ăˆŸ;áê£äƠÏÔÖÆ«‡“ÍjµØÏÔ¹Úÿ¯¶×¼ù×±»ɱ·Ô×¼¹‡€Ç»ĂƠÄèÚăˆŸï»Á½ôËܛ¶éĐÓ¿ÅăˆŸ;Û«‚ ½9·‡‘×8统}©Óéº߈ÏÔßƯ±»ÑĂëöÛívëÄ׿8íg÷‡±»‡Ûơêëö¡Áêöôøê£»ÏÔơÔéºăˆŸ;k9¥‡Á¹á ù×ÇäĂ­ô—¶Øœ‡9¥‡çÚǻٽ±»±»°»«»ç̃ÍÓ×Ư©Ç›¾©Óÿ‡ûĂÙ±»ÛÏÔ9¥‡çÚÅ–óÁƯö©&ƠîưÀéÓï½ØY™×Ă’ĂºçÚ‡Ç÷‡ïƠ­ÄÑÓª ¨ƒº5ÏÅë§¹Ú9¥‡ Ô°»—§Í»ÏÔ‡€ñÚöå¼ º!©º¥ˆ]1¿‰ï»„³ÂµØ×ù×—¶™¾ÙÚ«Ôù×ÙÚóªԙ‰kß [ïSÏåï³2«‡“Íj™‰kß [ïS½ØÿÚĂÙ×¾ơ‡“ÈÏ؉j̃ZîSƒÖ—»Ă íÇ̉˜‰j̃ZîS‚¾±»ø×½ÔÅ«‡“Íjù׫»·¸ÏÅăˆŸ;k½¹Ú9¥‡­ר¡Û̀Ă•ÔÿÚ‹ÜÛ«‚ ½9›Ú°»ÇÖÏÔù×ͼ\€º·§D ½€ơèÅöÚÇÏÔÛ×Û«‚ ½9«‡“Íj½ù×щ̃»úçÚ߈Ưïƒv¼€ƒÿ§9¥‡×Û«‚ ½9ܽ€ăˆŸ‹Óâà©ÓÁƯ›¾›Úׯ¾ß½Èœà›¾«‡“ÍjºŽ·Ô«‡“Íj½€ăˆŸƒv¡È«‡“ÍjÛ½Û×Ï̉ÇÛó£ ăˆŸ™‹ƒÖÔ¾FçÚ÷Áÿ¯¶©Ó¿‰ù×9¥‡™‰kß [ïS¿»ëö·‹¡ÔÉÖ•v¼ô×Ă™ÁĂºÛ«‚ ½9ÓÍ™‰kß [ïSÚÀ£Ø߈ơêưÀÛ×ßôĐÄêƠÅØëö߈¡ÔÅÄ¥¾á<‹ÇÛ«‚ ½9ĂÙÏ̉ö÷Á¶ØĐÓ·ỘĂ½Ôùש‡¥2ßëM«Ô߈¡³ÛÄÓ·ÔăˆŸ;kù×™‰kß [ïS¹Ö™‰kß [ïSƠ߈µØÍÓÅ»ù׃ˆç/¯Ôº¹Úƒv­'¯ÛëÓÅóÔ¼߈߈™‰kß [ïSăà‰Û±»ó“ƠÏÔ™‡˜ĂÍÓëƠU·‡‘×8çăˆŸ;₫®¶½í´±»›‡̉´Oÿ¯¶ÅÀÿ¯¶‰Ô·ÔëØ‰ÔƠ‡x›¾¯ô˜‰j̃ZîSñÆçÚív߈ù×ËÉ9ƒvÍË)éÛ9¥¡¹Ó¾™‰kß [ïS—¶ù×±ĂÙ½ëö·‡‘×8ç¹ÁÀڽス€½߈Ù½†ÇÚª‚ +¼9ñÚ½€‘ÆÏÔëöÙ½ÇÖëö·̉ÏÔͺăƯ›¶é»Ă½¿ç̉˜‡ùë©Ü’ƪ»å̉ åĂ¿ºù×’™‰kß [ïS³߈ºĐÓŸÖ“ƠÀÚù×å̉ Ï̉°́°»Û«‚ ½9ÛÚ÷ˆÏÔ™‰kß [ïSƒˆƠï½½ëÚ™‰kß [ïS«‡“Íjív£ÓÛ«‚ ½9ÿ™‰kß [ïSÏÔ™Óƒvá£äÚ½̉Å¡ÔÇ Û«‚ ½9ƠăˆŸ;kÏŵØ߈ù׃½¥ˆ]1­Ä›¾̣Ç߈ưÀÊÈ9¼ưˆơèÅ›¾̀Ç«‡“Íjáöż/ ĂÙ§ÆÚª‚ +¼9½™‰kß [ïS°»‹Ü—ˆ‰»Éó̀ÉĂ½”Ó,«Ôƒv¶‡Ö8æĐØ£×ßÁÑÓ›ÚºĂ“ÛÙŒë*«¡Ûù×ù×±»ĂĂÙÚ¡ÈßÁµØăˆŸÓ­ÖÿÚŸ’ó¸ëöĂÙ½™Ó›¶é¼ źø×ëÛ«‚ ½9ăà9¥‡…Œ½±»ù×8 ¤‡ ÖËƠß»û¿‰·‡‘×8çĂÙÅщăˆŸ³Ø¶Üư‡±ù1½È™‹½ÿ¯¶³z‡Œ°¿¬ôÙ«Ôưˆù¿™‰kß [ïSÄĂ§Ô¡åô“ƽÛÙÚÙ×ùơÏÄăˆŸÏÔăà™‰kß [ïSÁ¹Ľù×—¶ơÔƠX¿ô©¼°‡ÅÓáÚÏÔ8¤‡ơêƒØ÷ÁíÚöÿ¯¶˜‡†Ă¯‡å̉ ëöùêÍÓ¿‰đ"‹Ç·ÔÓ´ǻÑ·ºÚª‚ +¼9©"§ÓÏÔ½àëö™‡Û«‚ ½9«‡“ÍjÙºù×å̉ ͼỂ“Ơø×ƠÚ™Óơê­Ôׯ±»™‰kß [ïSđ»„øçºŸÅƒv¹½ÍåơÔÏÅỞơĂËÉ9Ó´™‰kß [ïSëöăˆŸ;ăˆŸ;·ÛÙÚƠ±»ĂÙ±»5Œª¡ í—Gª¶2tTÛ«‚ ½9Ç´ƠÑÓ£äÑÔÓ5“gesÁÅ·Å÷‡ĂÙÇ»ăˆŸ;¡»ǼéºĂÙ¹ÁÏÔåĂÿÜƠĘêèä»̉¼€ơêÜû¦Å…n—¶ƒ«dñÆöÁÛ«‚ ½9¼ĂÛ×ÅÔ©ÓăˆŸ;ơêëö§ÔÍÓù꺽™‰kß [ïS™‰kß [ïSÛ«‚ ½9¨º½ĂưÀÏÅ©¼₫DZ»ù×Û«‚ ½9éê±½ÈÚª‚ +¼9߈ĂȓƃvßÖèêÁÚÖØ÷¼½“ȹڃvÛÀ‡Û«Óû¹Ú«‡“Íj9¥‡ù×Á׳Á ш¹ÚÛ«‚ ½9Û«‚ ½9›·Ô±”ÛדƠ»Å¿½…ôô‡Ç¿ô™ÓϹËÇưÀµØƒÖÑÓëöăˆŸ;k߈×Ơ¾ÑÓÖÎÔ†Î6ΦjÎÇÓߌÛ,™‹ÏÔ£Ôíiù꽕“Íj·qăˆŸáÛ­Ö9¥‡Û«‚ ½9ä‰ÑÓÙƠ«‡“Íj¸Ú ø×º›Ú½€¡ÁăÁ“öơ$ÍÄ߈™‰kß [ïS߈½€Á½Û«‚ ½9ÍË)éÛ9¥ºyƒ¹Ơ‚˜‰j̃ZîS¼¬Ø«‡“Íj»ÅÛ¶¦D щÍÓ«Ôéê…¾Û×Ñ·«‡“ÍjàÑØ÷ê÷ÁÁ̉ׯ%ÏÔ¡Øóä©ÏÔªĐ£Ó÷Ù«ä‡÷ÁïÔỡ¿ëö±»½±»Ë̉ñÆ’È¡+ºçÚϺơç¡ÈăˆŸ«‡“Íj›¾ñÚºĂ«»°» džÙÚù×Ư¢X5›¾÷ÁưÀ±ëØÑÄëÖÆ—ˆ¥ˆ]1éºưؾÙÜ‘¤‰̀L„™Ôé¶›Ú©Ç߈á Ư‰±»§ô·Ó ¥0ËÇÛºï™ơ«‡“ÍjûÙÓăˆŸ;kĂ\ơêÓØưÀù×÷Á½çûñÓ¹óÙÅëˆØ×ÜĂÙƯÜÛ×ÏÔÛÀ»‡É[âà ׯ©Ç©,¯ơê÷Ô±»ùÜÏÔ‚³ƒvÛ«‚ ½9c¸ÚÿׯG‹øŸƠµ«ÔỞÑÓ±ÈÅԤض«‡“Íjƒ¾‘ÆÓ—¶ơêƒï³2÷ÚÇÖµØÍÄ™…ô¡Ûÿ¯¶‚å»§Ø¡ÈÇÖ€ö³£X¶‡Ö8æ×¾…Ơ“Ü÷‡₫߈íê—¶Û«‚ ½9êö£‡½€̀ÓƒˆÁƯ¡È÷Ô·Ó ¥0ƒàÏÔ›¾ö$ëöÇôăàù×ÏÔƠù×†Ú ö˹“Ơ·ÅÏ¿«‡“ÍjéºỞ߈ăˆŸ;Á̉Û«‚ ½9ùê»Ø¯Èï³2º‡Ú¡ÛÛº»‡§ỖŒÚ,…öƒÖỡ«Ô¥ÛÅØơêưÀÑÄë³Â¶¾çÚÎÅùס%³È…ǃ¾‘™ëéåëöăÇíÔèºÅ–ÅØ‹ÓĂÙ¡ÁÙ½ÍË)éÛ9¥ƯÂÿ¯¶¥Æ¡Ûív¯ªd¿àÏÔôÍ­ª¶2tT±»¿‰ßÁÛºå‡ơèÅ›¾œ·̉ ¤0³›¾…‹‰¿IáêáêؽĂ¼0ËÉ9߈ÎÚ¦Ñӥ۵ط³—¿ï½ƯͺưÀù櫇“Íj›¶éÏÅÑÄëù¾Ô‡º·‡‘×8çỂÓ¾Û«‚ ½9ÏÄ—ØĂóǣDZԓ¡ƠÛ«‚ ½9ăˆŸ;ĂÈÏÄÿÇÏÔù×Áí߈º½¡Ư¬ÄăˆŸ;¡Á³zׯÏÔ¨ÓûƠ‡Çƒv”ǃٽÅÓ£äù¿µØ9¥‡ÁƯ«‡“Íjºψ™ơă»÷Á¹Ú™‰kß [ïS×Ơă»½€™‰kß [ïSïƠö9¥‡×™ơ·§D —¶ƠÉѿߋǙ‰kß [ïSăˆŸ½€éê₫®¶Ó¾±»«‡“Íj•Ç₫Âßç§Ó±»½¯¾ÍÓ₫Ç ưÀ¡ÛƠ¿́³ơ…±»—ˆơԳ±»“ÈÀ½±»é‰ñ5ñ·Û«‚ ½9ù×ÏÅÍË)éÛ9¥åôéÚÛ«‚ ½9߈ËÇ̣—¾™ÁµØăˆŸ߈˜ÁÁ¼ëöÁƯ™‰kß [ïS£Ç——ÙÚË̉ÿ¯¶´c‚ˆív¹ÎÅÏԵسºóªö§ÓåĂ­ÔîºRǺƒv‹æíê×¼‘ÓׯÍÓÑÅ·‡‘×8çĐÄêƒà”½­¾ÓØ·«‡“Íjµ†Å1ù׿»÷Á÷Áù×ĂÈ½ăˆŸûëö’‰2Ô,ø“ƠïrµØËÓỞø×±»ºÖ‡¼7·ÔâÁ¸àÛ«‚ ½9‡ŒµØù¿®Gø»Á™‰kß [ïSẰÊ)èÛ8¤è‰Nđ5NNđN¶NߌÛ,çƠ‘̃…ÚÁ܈ÑÓ»ĐƺÙ½›¶éù¾—Ó߈—¶ÏÔ߈Û©‡¥2ßëM¡Û÷ÔùơâơÍË)éÛ9¥·‡‘×8ç¢Óöÿ¯¶Ăñ»ÅÓ›¶é™‰kß [ïS±»ĂهǡÈϹړÆăˆŸ;×Ơ‡ä‰ùë˹¡Áщ¶ÓØ©‡¥2ßëMÏģثÔ9¥‡“¹ƯNϺŒ¾›¶é©Ó¥ˆ]1³È«Ô¼›¹µ†™‰kß [ïS߈ƒv“§ØăˆŸ;ÏÔÏ)¹Ú°»±»߈ÀĂö«Ô߈ó–ƒv߈߈Åô‹Ç›¾ÇÖº»ªdƠÅØ÷ÁđÙÅë÷ä5̉›¾˜ĂׯơÔ«‡“Íj½€ó^µØăˆŸ;œÁ™‰kß [ïS¿ç½©ØÛ«‚ ½9›·Ôß„±»Ù½©ÓÙÚÀ¹ÏÔÍË)éÛ9¥Ă—¥ªĐ™‰kß [ïS—¶çڣ䰻½ÔëÙĐæÏÅ—»ºƠ×¾«‡“Íj߈ù×½óÊ·Ø£Ó³zÑ·ùꙉkß [ïS¦ƠºˆµØ߈™Á8'¤‡'×á “Æ«»«–·ÔÛ׳×Ơ«Ô·‡‘×8纩ÀËÇÛºׯÀĂ¾Åù×Û«‚ ½9÷‡Á”ª»âÁ߈±»Ơ±»ơêÏÔûàơg9¥‡²¹ơêñÓÏÔ½Á½ëö›¾Ă¢X—¼çÚÛº½ôß»û±»ÓØ›Y“ƠíÙăˆŸ;̃„µaơ꫇“ÍjÇô“ȗ᪻퇇º‹Óù×™Ó¹Úù×ưÀÛÀù×đÚăàûÓ«‡“ÍjׯÙYĂÙ¾¸Ú‰ÛóÂö÷ËÙ̉ÊÈ9¡Ù×Ä₫®¶ù×ñÖ¨Çÿ§ö׿8¯×ÏÔ©Ø¥ˆ]1¿‰Û«‚ ½9ÏÄơÔÂëöǺ­v߈ư(ÙÚöÁׯĂĂ«‡“ÍjœÁÿ׿º³ÂáƠóÂÈ̉§ôˆ¿‰ĂĂÜÓ ËÇ–Ó™ÁĂȹÚÏÄ‹ÈÙëƒv¡Û‡(Ôó»$íÙ½ôÔÙڳȇ¿ÿ׋DZ»߈ù×±»å1ŸÖ̃ÅÑÓǽ߈ơêƒvöÏÔÅÄ‹ÇơÔ¼¥Âù×ͺƒ̀ Ê) èÛ 8 ¤   ½óǃvêÓ·Û¡Ç™‰kß [ïS9¥‡¡È±Á™‰kß [ïS·Ó ¥0Û«‚ ½9´ØíÖ¿ôÏÅĂ½»‹™ưÀ‘ÓĂù×Û«‚ ½9ÏԻﻙßưÀ™‰kß [ïS±»ÏÅÔÅ «bÙÚñÚ™‰kß [ïS·Ó ¥0ívív÷‡ÑÓ£Óÿ¯¶8¤‡ËÉ9ĂÙ½!ôÇÚù×ôêƒv™‡ăˆŸ;kÎÔ™‡”Ö™‰kß [ïS±»¹!±»8¤‡ơê߈¹àÓ¬ÖñÆëö¹Ú«‡“Íj³àÁ̉¥ØăˆŸ;Ù×̀¬Hß™Ï̉¬Ä»ÓÓÄÓ™ëéåÏÅÏÔƒÖÚº ¯È¿Å¿½ͼ™‰kß [ïSÚª‚ +¼9£ËÙµ߈»Ø—¶ç‡̀Ê)èÛ8¤ÏơÔ‹ÛÅnưÀÓÁ°”™‰kß [ïS£ØĂ§‡ưÀ»ºµØ©‡¥2ßëMơê×Üÿ§·ÔÏŹ̃ơÄ߈¹Ú“Û÷‡ù×ï½§Ô¨ƠÚôׯđÓÓÔµØ߈±»×Ü¥Ó߈߈Ž¾Ô±”„»“ÈÍÄÏÔ—ˆù×§ÔËƠ“¹ƯNäô°ÁăˆŸ;©‡¥2ßëMïƠ¿ºͽ9¥‡™‰kß [ïSå̉ ûؽ¡È¹öÛ«‚ ½9Ѷ±»Ë4߈Ù½±»Û«‚ ½9߈‡ÇÏÔÅØá©‡¥2ßëM‚v̉ÔÅÅ9¥‡˜‰j̃ZîSÛºÚª‚ +¼9…»ƒˆµØ£Ç±½߈¼µØ™‰kß [ïSÚÅ´†åÁ·‡‘×8çíơ˿۫‚ ½9öÁûàĂÈÀÛÅØ«‡“Íj™Ô—ˆÏ̉™‡ưÀëö‚vƒØ½̣áêñÓÅØöÇ̉±ëØ߈߈ÏÔÙ½ĐÄê³Æîºù¿·‡‘×8çÀµØ¥ˆ]1ù×ơèÅĂÙÉĂ»Å™ô¥è“ƠƒÖÑÓëöâà‡º¼ØêÔ›¶é¿́‡¥ˆ]1½Ô‹Ü߈…‡Ç%ßëö½¥ÆĂÖߪ-**™‰kß [ïSå‡ÏÔƒà%ÏŃv“Ơô¬Ö ‹Ü«‡“ÍjÛÀ™Ê§Óå̉ ëö½ØŒê*ªâ¼ơêëö½Ôƒæ£äÄô%ăˆŸ;«Ô±»ưÀáêëùåƠÏÅ·ÜѶÇÖ9¥‡×ÿ¹ڹڥˆ]1¨‡¤2€̃êL“Üß»û§Ôͪ˜‰j̃ZîSŸÅƒvßÚƠ›Ú£‡¿ôĂè±»ƒÖºƠXơÔù×›‡ƒˆÏÔÅéÿ¯¶ƒv±»߈“Ș‰j̃ZîSŸĂ÷‡« ©ƒ»5ƒv˜‰j̃ZîSĂ¼ù×̣Ôé¼ÈĂñÚÁ߈‹ÜÖÔ†6¦jœƠ¾óº›¾Úª‚ +¼9µØăÁ÷‡ùׯÔƠ¶̣Ä¡Á‡ËÉ9·‡‘×8çÙ×ëö¡ÔŸÓƒØ™‰kß [ïSƒØó¹Ó‡˜‰j̃ZîSöÁ¿±»áƠƒØ̉ĂÈ—»ÁĂöˆÏÔùט‰j̃ZîS…Øù×ùשºçôÙÚ½đÁƒˆ9¥‡£‡ÁĂưÀ¯Ûͼ¶ è ăàñÓ߈ăà½éê©Ç—¾ƯÚ©₫ÇÎÅÏŇǿº—¾ĐÄê³8«ÔóôĂÙ±ÔÅÓº°»–ˆ™‡½ĂÏ̉‡x×¾‡¬¾Ăºï½Ù½°»߈å±óÂùê¼Ơôô³Ç¥÷£ÇÏÅÇÖ™‡åˆÁĂæÇ‡º¿ù×ƯÓ ¥ÇÎÄ«‡“Íj/‡ŒƒvëĐ‹Çß»ûÁƯíê«Ô¡ÈÛ«‚ ½9Ù½¢ä™‰kß [ïS±»‚Øë3רËÇ·ô£Øëö­¾½ÖÆ…˜¿àÀ½ÁƯ¯¼Û«‚ ½9Á½Û«‚ ½9߈ùôĂị́߈ăÇíöµaª¶2tTăˆŸ;ßÄÙ©ÀÓÅá߈“Ơר½ÿÚÁĂ˜‰j̃ZîS™‰kß [ïS™‡»ôơïƠ¢Ô ăˆŸ;kÁ̉Àׇº ƠûÅöÛ«‚ ½9§ˆƒÚëöÿÚơ…Ö«‡“ÍjăˆŸ;ÓÆá µ‹˜‰j̃ZîSŽ۫‚ ½9•‹HÊƠ¡ÔƒvƠXƒˆ˜‰j̃ZîS̃Öùש‡¥2ßëM¿ë÷Ù·Ô›ÛưÀçÚ™Ô߈«Ô§Ô÷ÛÆ§ÔíÆÁÖÑÓ°»ưÀ«Ôɇ•×å̉ «»ÿ¯¶ĂưÀéêëᓼïƠ‰áêË¿°»ùáÏĂĂ ›­±àéM©¿¹Û«‚ ½9£ØáÓßÁ¿Åª¶2tTÿÚ¡Áù×ÑĂÇÖñÇñ‡“ÈÛ«‚ ½9›̣ù׈ÙÚÓÅ—ˆË%}ï»ôÔï¶ăˆŸÏÔÛ«‚ ½9འʹµØ›¶éé–ß»ûÛ×ƯÓ ™‰kß [ïS߈…»Ü¦¹‡Úª‚ +¼9½Æé‡£äµv™‰kß [ïSÁÙÚ·‡‘×8竇“Íj¬Øß»ûƒv×Ơ©Çƒv¹.ÑØ™‰kß [ïSÁÛƒvå̉ Æô¶—¾ùæ¾ăˆŸ;«‡ŒÑÓ/¥ˆ]1ƯĂ߈ߌÛ,ÍBÀ¹ ëö›·ÔăˆŸ;™‡°»ëÚÙ×ËÖ³åµaùêĂºÙÚëöÏÅ¿ºÑ+ËÖèêÁƯ‰¿IĐÓÁƯå̉ Ñ"·Å½”—»ƒơÔÿơ9¥‡ơԓȯÈơ…ÑÓרíÆÛº­Ä ÈưÀÆ¿‰ÔƠĐÓÑÓ“ơ©ÈÏÅăˆŸ;k­ÂƠéÚ‘×¾º¹Ú±»§ßÁƯó#‡Ûƒv߈§ôù×¹ÚßÏƯ߈ß„¥¾ù×ăƠ½Ó̉ÛăÁÑÓˆù×Ưâ½€ׯ­ÖăÁÅÓ̉̉ÛºăˆŸµØöù׵ر»Ơơ؇º¤ˆ>\>0>ëÓ™‰kß [ïS߈÷$Ùç‹Çׯ›¾Ÿ}½€́vÛ«‚ ½9­ÄµvëơÙ×ἡÁő߻û™‰kß [ïS¿ß¹›âˆ;k·Å•×™‰kß [ïS×Ü›¶é«‡“ÍjăˆŸëöÖÆï‰‚v ËûÛ«‚ ½9̉ÅÛºßÄÙâÁH±»×ƠÁ|…™‰kß [ïSÏÔ‰y‡…Å»ºÔÛ«‚ ½9ăˆŸ;ÅÓƒv§ÔçÚ߈Ûé‡ÇµĂ«·3uU߈É̉ÖÆ½¿ô˜‰j̃ZîS³È¡È½ëöŒºŽï»“½â¶‡¨ÈºơĂơv×ĂÚª‚ +¼9çÚơê½›¾Ư‰µÙ½ù×ø×…À¡ÛƯÓ ·Å™‰kß [ïSÁă±¿ÿÜÙ̉ñ¯ĂÙ‡8¤‡ÏÄưÀơê±»̉Á«dÁ̉ų(ùïר«‡“ÍjÑ+‚v¥ˆ]1Ăº̀Ê)èÛ8¤߈Û«‚ ½9ٽ߻û÷±¥ˆ]1›¶éÚª‚ +¼9ƒvĂÙƠ߈å̉ ø×ăˆŸ;ưÀÑĂƯÓ ăˆŸ;·‡‘×8翉߈Æ"ËÓÙ½£Ø•Œ߈ÑĂùêÚª‚ +¼9í—G½ĂœÁưÚÁ‡é/×:߈±»ăˆŸ;k¯‰¯0öÙÚ©äöÁăˆŸĂ ­¾ÏÔ™Ó¬¾÷ˆ³ºóÿ¯¶¹Ú±¿·‡‘×8ç߈½åÇÖưÀ¿ôß»û ÁÛ«‚ ½9³Ç°»íÖƒÎÅÁÛׯ¼¿ôñÆ£äăˆŸ;kƒvœÁ±»°»©‡¥2ßëM¿ô—Ø¡û­Ö心¾‘¯ÈÏÔ¸Ú—¶ƒ×u罩¼…ô‰yùë!«‡“Íj¥ˆ]1߈¹ÚƯáăˆŸ;kµaÿ¯¶ơĂ¡ăˆŸƒÚ¸ÚÁÏÅ­îÙ½ÁĂ—¶¡È«Ôù×À½ï½߈‰ÔÛºÑӆׇŒÛÄÓç̉ù×å̉ ƒv®»ăˆŸó“ăˆŸׯÿ¼™‡›đöïÚ¾× +ï»ƯÓ çÚ™Óăơ—Ө׵Á½Ù¨Çù×ÙYÏÔ߈߈×Ă¯¾ÄÓ™ØÏÔ±»¡ÛÏÔø×ñ×¾‰¡È±»ÙÅë­Ô½™ơû(÷ÁÏ̉߈èÄùêôê­Ä·‡‘×8烈 Èív ƠƒÀ½Û«‚ ½9ÏÔö¡ÔñÓ¶· è· ß„±»¥ÓăˆŸ;ơê¶  ™‰kß [ïSׯÿÚ‰ºưÀÛ«‚ ½9Ù½₫&ƒ×ÁƯèê 9¥‡¶9¥‡×¯‡ŸÖŸ}½ù×ôê«ÔëöơÔ±½×Ơí£ñÖ‰y“¹ƯN£ơ¼8¤‡i…ÇĂÈ9¥‡×éÔóÍƠù×麅ƠÿÚÑĂÇâÛ×Áñ±»§Ó°»ÛÏÅۺףƯ„Ø ñÓñíÈù×ÓØ₫‡ó»“¹ÜN9¥‡½ß»ûØ×ÙŒë*«̣Ô“¼ëö«‡“Íj₫åÇØÆ“È៷ÔÅØµØ½ÈăˆŸ‚vËÖ±»ÍË)éÛ9¥ĐÓŸêö½±ºÓÅ¢™ éêÅ₫ ®¶ ÚÓ€¾ívÙ½ª‡’̀jëöĂÏÔ™‰kß [ïS¡Û«»·Å™ÓÏÔëö°»«·3uU¥ˆ]1ŒEưÀáêµØï»¹Ú·Ôù×™‰kß [ïSù×ñÚÇÖÙ½©Óø×¸ÚçÚƯº«»ÙÓĂÙÎÔ—»«‡“Íjæ̉ßÁĂưÀ¶ăˆŸºy÷‡ëö¿‰ØŒ ê* ª ÎÅ ÎÔ€º™‡±»ª¼éß™‰kß [ïSơÔÙ½«‡“Íjà=ơÅ»9¥‡ª¼#ÿ&·̣í—GéôöÚª‚ +¼9µ†«Ú¹Ú·Ôăà¶èߌÛ,Ở«‡“Íj×Û²× ÛÄÓ•ÜéÓ¡ÁµØÚÀÓÆĂ‰á‡Ç©Â›¡ÇÙ½éÚëƠU‚ÑĂ¾‘ÚÙÅëơѧƠ„ôơÔơĂƒˆ“¹ƯNêơ¹Úíƒëöé·»Øơl©‡¥2ßëM·‡‘×8ç₫®¶ÏÅ«‡“ÍjÅÂÙéJé‰Ó5“gesÁÅÛ«‚ ½9ÛÄÓçơ]ĂÙ¡Ôƒ¾‘ŸÈÏÔƒvơêåĂ…Û‡º•Ơù×óÇåô·Ó ¥0¡»¹Ú¯ÈÇÖ›¡ù×£ä9¥‡ăˆŸ¯G‹øÚéêÆôÑÄëĂå̉ ÛưÀ‰Û‰¿Iñ́ÏÔçÙÚË¿¹Úç̉¿º¡Û“¼»¼ù×ưÀ½¹½™‰kß [ïS£ä±»ÿÚ߈ĐˆÅØéđÏÔ™‰kß [ïS›¹Åù×Ûƒÿ.›¾ÏÔßÁç̉·Ô—¾ÏÔ₫ ®¶ •‚ăˆŸ;̉Ư׃Àƒ¾‘óÔ„ØÇÖÙǼƯÓ ¥ˆ]1«»­Ù›¾ëöŸ}߈̀Ó±»ñÓº̉¿‰ñÁ¢»›½˜‰j̃ZîSư™Ÿ}Û«‚ ½9Û«‚ ½9ÑÓ÷ÁưŒăˆŸ;k£ÔÙ½ăˆŸ;©Œ½€߈Ù½—¿Ù½«Ô¿Ùù׵ؓƠùꙇ±»¾ëÔÚ™‰kß [ïSÁÛÂè ߈°»ăˆŸ›¾™ÓÔÅù×ëö«‡“Íjƒvèơ€¾¾ăˆŸŽËÇ߈ÙÚÑÓ¹ÚÙ̉åĂÇ»¡éêÅØÇÖ½€™‰kß [ïS½€«‡“Íjëö̃ Î ĂÙăÁ™‰kß [ïS£Ô¶KKï½ưÀ¾ßK£»Á¹ÙÚ£ä™ôéêÉ̉ûØ¿‰Ù½ªĐẲåôêÛ«‚ ½9½Èâˆ:•Œ½Ù½ăˆŸóóÔÑÔÓ5“gesÁÅÓÆ·Ó ¥0™‰kß [ïSñÇ™×¹ÁÏÔ—»¾å‡£ñ½¡Ô±»ÊÈ9»Ë₫‹ÜËÉ9éܧôöÁÍƠµØ°»ĐÓ™‰kß [ïS‡Œ¶ï)ÏÔ¹Ö½ÔĂº—ˆÎÅÑÓ¿‰¶­¾ƠX›½¸Ú™ëéåÅÄÿ¯¶ƒà™‰kß [ïSÅÓÛ×¹ÚëÔ«ÚÿÚÛט‡* Ơù×ưÀï½ÅĐÄꩇ¥2ßëMƒv­ÄƒĂ³àívÍı»¥ˆ]1ÅÔ¹±ƒv߈«»ùׯƠ—¶ÏÍË)éÛ9¥9¥‡ù×á ƒÔơêϪ·Ô‰±­ëö›·Ô™‡½ăˆŸ;Á̉±¿›Ú몱»ƒv÷‡›¾™‹ëöëÓẳµØßÚ¿‰ÏÔ˜‰7j7̃7777Z7îS7ñƇƯ§ívÙÚÁ‡é/×:µØûÛ½Ä–ăˆŸ;«‡“ÍjÖ¼¥Ư™ÁëçơÔ¿‰ƒˆÛơÔ·Åï»ăˆŸ;çÚÏÅ‹̉áêĂÙæÓ,Û«‚ ½9ÇÜƠͽ©Ø£Ø±½ÿ…Ơă½©‡¥2ßëM¹ÚñÚ©‡¥2ßëMÚª‚ +¼9ÿ¯¶‚vϱƯÓ ĐÅư"ÑÄë¡Èƒ9•Œ×Ó½àçÚÿàÛ«‚ ½9ơèÅ™‰kß [ïS™‡ß„ÏԵءÔÍß„ù×·¼Í7ÓÆ¦ØǺÑÓµ‰°»¦Ø Ù-ơèÅ“Û×߈“Ơ߈đÓµ†£Ô9¥‡ăÇí¡Áèêá …ŒÀ¡Ôù¿ψ¼ô¯¼·‡‘×8çơÄ·‡‘×8竇“ÍjÛ«‚ ½9ÅØÍÓ›¾¡Á‹Óơú±»ñÖ¼ÿ×߈µÜëö‡xăơÍÏÔ÷å5Ó‰Û÷Á߈…Ç…ŒỌ̈̀ÓÇ%Û«‚ ½9«‡“Íj»ĂăˆŸ;Ó߈̃ˆó¶ÙŒë*«ưÀ«‡“Íj›ÚĂÙÛ«‚ ½9ÀăˆŸîôÛÀÚª‚ +¼9™Û‹Ü°»¯È¶ + +›¹¥‰ÍL…•Èû›êö’ƠËÖ˜êèä•ÓØ—ÛíößÖ›¶é‹Üë™H߈êÓëö̉ºñÚÏ¿÷̃ÙÚÏ̉‡º©Ç§Ôéơ¡Ø¯ÓƯơÅØ½¹ÖóÖ߈ùׇx»‰ơŽơÔ¶è’Úª‚ +¼9½€Áíá=«‡“ÍjơÄĂÓÇÖå̉ ÏÔË¿ÓØ™‰kß [ïSÛÄÓøêóÇÙÚÛ«‚ ½9«‡“ÍjÑ+§Ó‡×Ăº£äÅØ9¥‡ÊÚƒv¾(ÅÔư‡±ù1óÔËÇÙ×™‰kß [ïSïƠ±ÚÄ̉Ë̉ăˆŸ®ô ‰ÔÅ£äưÀ߈™‰kß [ïS–ÀÁ™‡•Èû›ëöơú߈ÅÙÙ½̀Ê)èÛ8¤ĂÖëÔˆùê¹ÈăˆŸ;k¡»¯‰¯0œ›¶éÑű»ëÚÛ8ÛÄÓƯơ÷ˆºĂ¶ÔĂÙ°»×ïö¿Å¨Œ„íÖĐØÖó̉غöÁ»Ø‰ø½ôñÛ”Ö¥ˆ]1æ̉ûÓ­¾¿́ƒ߈ƒvÏÅÏÔ»½ăˆŸ•DZ»ư‡±ù1áểÅÏÔëö·‡‘×8ç½ĂÙº«‡“Íj›¶é«‡“ÍjÙǬÖÏžß߈«ÔÓ8¤‡Ö£X«‡“ÍjÚª‚ +¼9±̉ÓÆ±»ÏÔ¯Ûå̉ »Øă½­©Àƒv›YÏÔÿ¯¶ÿ׃àË¿ÏÔÖ—¬Á¹áÛ×½ŸƠªĐ±»ùêĂÈÁ̉ÍË)éÛ9¥±¿…Ëÿ×ỞÁ̉íÙ¾º‚vß»ûöÛ¹Ù½Û׿Ẓ́Û«‚ ½9¾ăˆŸéº¡ÔëöñÓ€ºëöâˆÓß߈ƒvéơ¡%ùê©Óù꛾›¶é£4ÉÅÔ÷Úï»ĂƠỞûØ™‰kß [ïSé‡ͼÿ¯¶ƠX±¿ï§«·3uUÛÀ™ÓÑÓÛºº߈¿Ú¼€çÚáöƒ½«‡“Íjƒv§Ô™Ó¨Ø߈ơÔ±»«»óDZ¿ÖÀµØå­¼€×ơÄăˆŸ;8¤‡×¸ÚªÚF¹ÚĐDƒÙó+…Û•ÇăˆŸ;߈óÓù뽡»ỞÙù׫d½§Ô€Ä™‰kß [ïSăơ˜‰j̃ZîSù×û +¯×¹Ú°»8¤‡÷Q«‡“ÍjÙÚ8¤‡¯×‰¿Iß©Øù×ÁĂ÷‡½ÏÔ•ŒѶëö·Å×p­Ö‡Œù¿ÇÖă¼¡é‰ñ5ñ·ăˆŸ;™‰kß [ïS†Ç ÙÜÛÀÚª‚ +¼9«‡“Íj°»»y§ô›¾¨º «Ôă௘«ÔÇ»À½½ù×±»Ù̉‚¾  °»ÓØÏÅ¥ÆăˆŸºù×®Gø›Y¾߈±»Èº‹Ü§ÓÏÔ°»±ëØñÚ­éÁ‡é/×:‡ÇŸ ¯G‹øÁS™‰kß [ïSöùꙉkß [ïSÿ×ÙÚÿ¯¶½€¡Ư°Ôù×å̉ ú¶‹Ù½÷Á…ØíăˆŸ;ÏÅççô»ÁÓÍƠÑĂÙÚŽëöăơ󱻫ÔƠ¾GßÚ°»ơúØ×ăˆŸ;Ù€öÁú ©Ø‡Ç‰ºëöºÁ¹ùêËƠÏÄù¿éÔ©Ø߈ÿ&‡Œ—¶—Óùêëöå̉ ĂƠ‹Ç«‡“Íj©‡¥2ßëM¹ÚÍƠËÉ9ñAÛÄÓÍË)éÛ9¥ùטêèä­¾º°¿ăˆŸß»ûÿÚßÚàçÅÓÙ×Û«‚ ½9‹ÓïÅ“Æ߈å̉ ơêÍÓëöÑÄë±»±»§øù×¹̃߈ׯăÇíÍơêæñÓƒ×ív¹ƒvÛÄÓơèÅ¿ØûÓ÷Á¡ÁÁ×ÏÅö¿‰ÏÅ÷Á«‡“ÍjÙÚà½"¡ÔºÂÙÙ½÷‡߈¤Â—¶¾¹xÊÙÚ׃Öă»ߌÛ,Û«‚ ½9½º«ÚÏÔáÛ͸đØ"…àÂßÄÙ¥ÄÙ×½€¹ÚÛ«‚ ½9ÙŒë*«³ψÓ5ŽÛ«‚ ½9Ăºº̃ˆ +·‡‘×8çÂÎĂÙăˆŸ«Ú¾½ĂÍÄăˆŸ™‡ĂÙ¶Ôå̉ •»Ù½ÙÚ™‡ßڷŹÖăˆŸ;Ởß»ûÏÅá=ÍĂá¯Ü©ÇÁƯ©‡¥2ßëM¿‰©¼±»ƒ¯™‰kß [ïS¿‰—»Ÿ»ÍƠÑÄë‘đ‹Ç̉߈Û«‚ ½9ưÀƯܽƒv§x‰Ôâˆ߈†×ƒv™‰kß [ïSÁ§Æ¹ÚƯ¹Ú‹Ü…%™‰kß [ïSǼ߈ÍƠ。v à=³ôß»ûéê…¹£·‡‘×8燺ùêÙ½÷Ù¶èÙÚºĂ¹Ø»‡éÆÇä·º«·3uU‡ÚÙY Ûëíù×Ï|°»ƒéºëÚóÇ·‡‘×8çÙÚùן\³ÂǃàÜ«‡“ÍjÑÄë‘%Û×À˩Ǚ‰kß [ïS—Ó±»ÚÇш…Ơ߈™‰kß [ïSÛ«‚ ½9™óÇÖçÚÁĂ߈½—¶Yù‰߈ÅØáê÷ˆĂ1Å»·¯ưÀ“Ƈ«·3uUŸ%úº¿½ï½ÏÔ§Ô9¥‡×½Ôs±»§Ù½÷Á™‡€º‘ÈÏű»½ôỞû(üĂƒv§ÓºñÙË̉§Ó–ÍÜÀ)½ôëöËÇ´a +¹Ú¯×¢ “Ɖ¿I›¾…öùæù×ÑĂø×¥ˆ]1ºñÓÄÓ½Đ¥Đ¡È©ÀơêÅØÙ½˜ĂÙ¬Ô¬ơ®›¾Ľ·ÔúƠÑÓăˆŸíÓÇÖưÀóÂ÷ˆ½ؽĂ¼™‡ơºÏÔäÁׯ×$¸ÚĂٵاۃח¶½å̉ ñ•½Á¹ûÙϹƯơͼĂÈÛûĂĂÁ©‡¥2ßëMÛ«‚ ½99¥‡˜‰j̃ZîS÷‡íêÁƒv…Øù×Ù­È¥qøêö́ÁÚÆŽåŒ¿N߈ăơ8¤‡ëöù×ù×á ơÔ¥ˆ]19¥‡ÇÖÛ«‚ ½9é‰ñ5ñ·̀øÚ9¥‡×°ÈöÁ§Óµa£ƯăˆŸ;kƒØî²2ăÇ홉kß [ïS‚ˆơê—»ăˆŸ½ôëØº»ó©‡¥2ßëM±Á¾ºóg—ˆ™‰kß [ïSăˆŸ‡ŒưÀ¶Ú×µaëÔ‘ơơê·̃±»À̉óÄù×ûÓ­¾ª¶2tT±»ï²2öñÓÏÅẲ«‡“Íj÷ÁÛ«‚ ½9Û«‚ ½9óÂûÓÔ«ä¢Çù×ûؽ÷ÁÛ«‚ ½9›¾Û«‚ ½9ÿ×å‡ăê’ÈåĂ·ÅË̉ù×Ư‰ͼ¹Ú­ÖÑ+½€ï»Ù½ĂÁƯÿ¯¶½€å̉ ăˆŸ;ÏÔ±»ëö¶‡Ö8æ£äÍÓËÚñÓψٽٽßÚ³¹«Ôù×±»½€‡ºƯߋȺïƠçØ߈Û«‚ ½9¡Û™‰kß [ïS½ƒÖĂôăˆŸƒvÛí·Ù×Åêö½™ÓÏ̉ăˆŸ;kñÖçÚÛ«‚ ½9ø×£»ÅÄÛưÀ¯ỘÔÙƠơ꛾ơê퇃ˆ—¾ơĂù×ÿÛϺỞ«‡“ÍjÿÚÍƠ½YóÔÁƯÛ«‚ ½9ăˆŸ;›¾ƒv÷Á€ׯơêÏÄÍĂç'ׯ…»/ÛŸ}ăˆŸåŒ¿NËÉ9¶ơê†ÚßÚ™»ŸÖø×‹ÛÏ̉ÁÅÓ₫°» £äù×¹Úµ‰ù×»Øç̉±¿Ư‰ºÛ«‚ ½9‰¿I’Ÿëöʽ߈å̉ ±»ûߎ™‰kß [ïSߌÛ,ĂÈñÓưÀâàµaƯÂ…–Ï)ï½Ở­ÔöÁĂgÙ½ÅÀ–»̉©Ă½Ïí¥ÓϺ·Ü«Ú¡ÁƒØ÷ˆ£äéÚ°”ψ»ôƒˆ¸Ú¾Û׫‡“Íjăà˜Ån₫¥‰ÍL…½€‹ÜÓ½ÿLj۫‚ ½9½“¹ƯN™Á«‡“Íj߈9¥‡«â“ƷܯÈÍË)éÛ9¥ăơơÅÂÈăˆŸĂÙ·Ó ¥0µØÏÅăàûØ«·3uU‚½‡º§ÔƒØͪù×÷Ù›¶é«ÔÛÑÄ멇¥2ßëMÇÖ߈–¶Ï§Ơ›ÚºưÁ“ÈăˆŸ;¡ÛÑÄëÏÔÛ«‚ ½9Ăæùêï»ëöăêÛ×¶ ¦D ÙÚ߈•Ü©Ó߈ÅàÎÔ¤ˆ \ 0 Á…»å̉  È…Ơ‹ÇỞ•%“ƠµØÓÔ™‰kß [ïS߈%߈âˆ߈ĂĂ™‡ù×߈Œ¹ÚÿÚ¹ÚÛ«‚ ½9éÚÛ«‚ ½9«‡“ÍjÍË)éÛ9¥‡ñ5½™ßª¶2tT‡ŒË̉ỞåÇŒƠX™ïÍÇ•ÿ†× ëÔÙ½ÏŹڛ¾áç¯È…uö©ÓÏÔ‘Û›¹ăö“Ơ±»ÛÄÓëö̃ˆ³ÿ§‡½Ôü%ĂÙÛÀÏŷ¿º¡ơÔëö±»ƠÁƯ¹Úùơ‡ºÛ«‚ ½9½±ÁĂÈ©¼Ơëöá¤<ù×›™‰kß [ïSö¶Èª¶2tT–¾¿́íÖÍÓù׵تڱ»ăˆŸ;£ØÇÓÆ¦›ăˆŸ;Ú½ÇÖŽù¥w§Ô­¿±»ψ˜‰j̃ZîSĐÍöó׵؋ÇăˆŸ;ùêÚ×™‰kß [ïS©ÓÚª‚ +¼9‹ÈơèÅå̉ “ÛÏÔ½ïơÔï½€ºÙÚÏÅͺ¾ù¿́vÙ̉—ÓÅÔ›¾í§ëö±½Û«‚ ½9”Èúƒ½™‰kß [ïSϺ¹àÁƯ™‰kß [ïS§àÙ½Û«‚ ½9ƒÖ¿º¼Ø“÷¡Ôù×ưÀ§Ø̀ªÿ¯¶½€¶ÿ¯¶ÏÅ¥Ö¿ôØƠ×¶¼̀7߈ĂÙ™‰kß [ïS‹Çö¹Úƒˆ¥ÖĂÓƒÖ—¶½ÔéÓè·ÖẮvŸÄ₫®¶‡ñ5™‰kß [ïSăˆŸöÙ½ù×…“µ†߈Á½ỞÙ½™˜ÁÁË—¶½È©‡¥2ßëMÚª‚ +¼9ơ»ÅơêôÛ«‚ ½9ÏÄÙÚ¸ÚïÚ‡̣›íƳÂÜÓØÑÓÑĂù×Û×¼µaÛ«‚ ½9öưÀ߈¹·Û½ỚvôêñÓ™‰kß [ïSơÔÏÅÑÓđÿÚ›¾Íĉ¿Iç̃ö©ÇĂÙ™‡©%¡È«âï†ÁÏ$™‰kß [ïS°Ô“ƠơèÅÅÓ§‡ïiÛ«‚ ½9ù×ơêÿ¯¶ñÓ±»…ƠÛ«‚ ½9ư‡±ù1‚½ ûÍƠ›Êׯ½ăˆŸ;áƠĂ¼¡ÁÀ½ăˆŸ½«‡“Íj÷¶±Ôù×›¹í‡™‰kß [ïSÇØ·ôª‡’̀j™‰kß [ïSƒ»‰Ê®Æ¡Ôׯöˆ©‡¥2ßëMívÀưÀëöÁívƠÁ·‡‘×8çƼÍƠëö›ÚÅÄëö·ÔûÙ±»ööÁëÖ9¥‡«‡“Íj½Á±»çÔ¡…Ú©‡¥2ßëMɇ™‰kß [ïS†ä÷¸£Î̉ơÔ₫ +®¶ +ï»ÅĂ߈÷ÁÏÅ»Áñ»ß»û«dëöÔX ÇÖ‡Ûö»ØåƠíÆ¹ÚùׯÜÏÔµØù×߈•Èû›±»™‰kß [ïSĂ¿‰ƒv‰y‡Ú¾ÁƯ—Œ·Ô«‡“ÍjçÚË%×̉ñƽƠÏÅ“Í÷ˆçÚÛêïº9¥‡±»e±Û«‚ ½9«‡“ÍjÍË)éÛ9¥ÆĂƯưƺ½½è¡Û›¶éÇÖỔ¿‰‹ÜßÄÙ́½«‡“ÍjÛׯÈÅ•½ÛºÇÖüÁ¡ÛơêÏ̉ƒv•Èû›ÏÅưÀëÆÙÚ̀Óéê£ƠăˆŸ;çô߈›‡›·Ô‘Æù‡¡ÔĂÛ«‚ ½9±»½­ÄÚª‚ +¼9ƒà÷Áùש‡¥2ßëMç¦ôù×íÆ™‡ÛÄÓĂßæÓÅרÛăˆŸ;íÖ«Ôù×ÏÅù×Ùׇº¬Ó˜ÔĂÙ™‰kß [ïSù¿ÇĂ«‡“ÍjĂÙ̃ˆ÷‡9¥‡ù×ù×Ở¡ÈơêéêÅí¶è±»é··Ô™ëé彽ܢ»Ă¼ÂÙóǘ‰j̃ZîSù×Ï̉ÏÔë̉É߈ÏÔÙÜ«‡“Íj² Ñ·°»˜êèä½ĂỗˆÁƯ÷Ú‹Ç£Ơ™‰kß [ïS‡“ô«‡“Íjöƒv󽾇¦ô߈¢»ƒ©Øÿ×¼X…ö±Ôơêùêÿ¯¶œà¾åĂĂٽӻŽ€Ăñ¥—»µaûÖÁ½ø×“ȺÏÔˆñÚÑӪԷű»ù×£Øñ›·‡‘×8çÍƠù׃×èêÁ¼…Ö¡,߈ù×î½ÓÆ¿‰ï½«)̃ˆ÷ÁÛ«‚ ½9ïÚϽëëöƒvÁ±»ßÄÙ™ÁÓ¾·Å¿ÅéڕܹڋÇÿ×ù׃vÎÔ½ÍË)éÛ9¥¡ÛơèÅöå̉ ƒv¿ổ̉ÿÚßÔ›¶éÏÔĐĂÛ«‚ ½9¿‰íơ”Èú”Úăà§ÍμŽÁ¢ăˆŸ;k³Ậdz”ÍÄù×µ‰«‡“ÍjÀ¹ăÔăˆŸ;‡™‰kß [ïSëö«Ô—¶߈ơº«‡“Íjù×ơê“÷Å©&ËÓÛ«‚ ½9½Ôëö§ÔÛÀơê˜êèäơ…™‡ơÄ•µØ§ôÀ¼ï½â½…Ù̉ƒv“ÈÙ½¡»™ÁĂÙ‡º—¶çÚ±»ÏÔĐÄêăˆŸ;÷‡ËƠÁƯ9¥‡×ɇ„Ö +«‡“Íj§ÔÛ«‚ ½9±»±»Ñ晇±»ñÓñÓƒvùë±»çÚôÔÆ߈¾‘Ú©Ç™‰kß [ïSÙƠÛ×…»˜‡ï‡ë›¾ôÙ½ù¾ÚÆçÚƠñÖ©&Ù½ưÀ¬ØẲöÅÓ¿»µ†ÍỠˆƒv‡ßåĂ«»‘±™ô›¾«‡“ÍjĂÙùëĂ¼ƠÅØëöăˆŸ;ñÓÏÅ߈™Óá §Ô«ËÛÄÓ Ç߈߈Û«‚ ½9Óæ½ …ÔỞÅÔÀ̉“ÆÛÀ߈ɇ™‰kß [ïSÜØÓÍÓå̉ ±»ÓÅ‚v!³ÑÄë¯G‹øƒ×ﻓƫdŸ}‡ŒîÅ·ÅÇÓ«'ºÅ±»™‰kß [ïSëöĂ8¤‡©¼´“ă›¾Ï̉Ư‰ù×¼Ô½€ơꙉkß [ïS‹ÓÛº9¥‡×µƠñÓ™‡§Öå̉ ïÅß»ûêÚ‹ÈÍË)éÛ9¥ù×ÀĂ›¶é¾ºơ‡Â¿‰ߌùêívÛ«‚ ½9áꪻÂÙ¹ÚÎÔ¦¹ ߈̉½éêĂÙù×°¿ÿ¯¶¾Å“̃ç ëöÀƯÏÄÔ2™‰kß [ïSÿÛƒvơê©ÇĐÄêëöåô©Ø8¤‡×¥ÓµØ±»ó¨Ç̃ÁăÁƒv¥ÏúĂÅÔÛ«‚ ½9ûƠŸÈ«‡“ÍjµØ·‹“ÛÅôĂº‰˜¡ÈƠßóĽóÄôĂÛ«‚ ½9ñÚ‘ü°»«‡“Íj¹ÁơĂçÚăº¨ºù×µ‰ơêøêîô±»߈×ܡۙ‰kß [ïSÿ¯¶³°»ĂíŸáêçÚ׿8Ç̣¢ôɇÏÅÇ»¥ÓàÀ«·3uUe›¾¶ï“ÿÚăˆŸ;ÔÏÄ÷Úȱ»™Ó‚«Ô‚v·‡‘×8ç°»‘Ư™‰kß [ïS׺¾«‡“ÍjƒÖăˆŸ¶áÛ½ÁƯù¾ª»9¥‡ÇĂœÜÇÖăˆŸ;»¿ºơÙùׯ驼­ºß„Û«‚ ½9™'³ ¹Ú™Ô°»«døê߈ÙÚ÷êÍÓ¥œù×߈Ï̉ëÓØñƹڶÔë…ǺåĂÅôƯÓ ŒÓ©ÓÙ½gỔöùêă.ÏÅ«Ôϡۗ¶߈Ë%·‡‘×8ç½ëö߈ôƫ‡“Íj•Œá̀Ơ½€ÏÔ¥ÖÛä½íÀû™Ô¯‡±‘ƵØóÇ9¥‡Ù׉Ե؋ܘ×ËûƠÏÔ߈ĂÈ¡%›¾ÁÚåÁ…Ư°”ĐØ©¼ôºÛÀÙ½«Ô±»¡ÏÅﻘô‘%‡¿«‡“Íjù×°¿9ŸÈ•›¹öÁƒ×½ĂÛ«‚ ½9›¹™‰kß [ïS̀Ê)èÛ8¤å̉ ÏÔ—ïđÖ­¶ëöơêÿ¯¶ÿÚưÀÛ×·Ó ¥0º½‡âˆ;ÁÏÅỞÑÓ÷‡²(±»щ£ƯͪăˆŸåÁÙĂ·¶“ƋǙ‰kß [ïS±¿Û«‚ ½9ñ×ơêó¨—ÓÛ«‚ ½9ăà·Ô«ÔÅ÷¢߈ÏÔ±»—ÓÏ̉ÑæÏÔÙ½ÛÀÁÙ̀ĂñÓÏÄùơ±½ăˆŸ§¹éÓ·Ø«%»Å½ë©³Â‡ºŸ;íê±»½›¾ơøù×ù×…¦Á½½ăˆŸ;̣¯¼ôê ߈±ÙÚª¶2tT¡Ôẳ×¾ÛÚÏÔƠÁ’¹ÜNËÉ9ÍË)éÛ9¥½ Ơ£ØÍË)éÛ9¥§Æù×±»9¥‡×¹Ú­ØưÀăˆŸ±»™Ôéºûê ‡éÓ匿N… ‰₫µÅƒvívØ߈¿®ơÔ‘Ö¿º߈ï½9¥‡©ÀÛ×°»óÇøê™ô¾›¶éÏ̉™‰kß [ïSÓØ‡Û÷Ù÷?¹Ú£ä¿ùÚº«·3uUø¼ÂƵؼëø×ØYÏŇx§¹«Ñ߈ơꘉj̃ZîSÏ̉Úª‚ +¼9ƠŽç…ÛçmÅÔ°»Ù»ѶƠ×™‰kß [ïSù×ÿÂëöăˆŸ;kÏÔ™‰kß [ïSå̉ Ăù׫‡“Íj•Ô˜êèäƒv™‰kß [ïSăºå̉ ’¹ÜNù×¹Ú÷Á¿ØÙÓ½Û«‚ ½9щ…Û½ÏÔ“ƠƯÚɹ«‡“Íj½Ñ…Û½ÏÔ€ ív™‰kß [ïSÛå‡8.¤‡.Ö›¾ÓºµêÏßûÀ‰¿I—ÖăˆŸÜñÀçÿÚ½ÔµƯÁ̉Û«‚ ½9ß„™ëéå¡»ÙÜ߈äÁ©ß„ƒˆ±»‹½¾‡›¾ÑÓµ†½öÔóÂëö‚Ú́Å4 Èö£Ơ°» á×釳½“¹ƯNÛ«‚ ½9«Ú±»ôĂ˜‡9¥‡ÍË)éÛ9¥½™‰kß [ïSíŒÁƯùêÙ½ñƒÎÙƠƒÖôêÓÛׂØĂÓƒûØơÔÁ½ßÄÙœ·̉ ¤0Ç ›¾߈ü¦†¥‰ÍL…ùêçÀÂĂ Á9¥‡߈ßÁéÚù×€ºÿÚƠX’¹ÜNßÚª‡’̀j¿ßÑÄë߈Û«‚ ½9ϼ™‰kß [ïS‘«߈ï½™‰kß [ïSшÓé£Ưëöâà±ôơêÏ|·Å‹›Á“—àíØÏÔéÚ‡“ÏÔåÁ¾Úª‚ +¼9¹ÚơÔ™‡߈ÑÓÏÔÑÅÙ½ÅÓñÚù×ÛÀ‡Œ¾ÏÔéÓ±»½«‡“ÍjÁ½å̉ ÏħÔù×ưĂ«‡“ÍjÙ½éѽ‰ÔưÀÙ½Û«‚ ½9³·ïÁÓÏ̉ĂÙÓØ߈«‡“Íj«‡“Íj«ÔʾÎÅÏ ­ÄÛ±»Ƕ©‡¥2ßëMÚÀ·¼Í7ퟫ‡“ÍjơĸÚÙÚ¹Ú•ÏÅ›¹ƯÚÏÔÑØù×Ô™Ù«Úƒ¾‘±»…G½¹ăÁ±»ơêÏÔĐĂ¡ÁÙÓÍÄ–ÓÛ«‚ ½9•Œ«º¶ è «·3uUíꪶ2tT—¶•Èû›¶Å«Ô‹ÇÑÅï½äƠ÷ÁưÀ÷ˆó˜êèä9¥‡×ÑÓƒv—áÏÔ±»˜‡™ØÓÆăˆŸ;kéê™ÁăˆŸ߈¡ÛÛ«‚ ½9ç'½êö£Ø³ñÚ±ëØƯÚ½µØĂÙƒ¾‘ưÀÏÔ©:ÎÔ‘«‡Û½Û׆“ÑÓö›¶éëö₫ªÔ£̃÷Ú‘±ëö«‡“Íj™‡ÆÙ½Û«‚ ½9²ø±»“ƠÛ׋È0‹Ü½±¿¹à‰¿IÅÓÁÓư§‡çÚ›ĂĂÙùê°•Ư€¾Ïű»ÅƯ‡ŒÏÔăˆŸñÓ»Øß„½߈£Ëß»ûưÚỂ¹ÈÙÜöå×ÏÅèê½Ù½ÎÁ‡é/×:áêưÀƠĐ÷Ån‰¿I߈‚Øœ·̉ ¤0߈³åÁÅÏ̉Ù½¹”ß»ûÛ«‚ ½9ß»ûơê«»ÙYßƯÁƯ€Ó÷å5ӑӻܭ½¼Û×­Ö·«‡“Íj†ŒăˆŸ;¡Áï½ơèÅó^“º·‡‘×8çƒÍ2ăơơÚ±»ÁϼÅØ«‡“ÍjÏÔÏÔÓºĂó™‡ơèų™‡ă¼›¾¡È߈9¥‡ÿÚƠ»½ívçÚ߈§ºç4ƒÚÿ¯¶ÆăˆŸ;k«‡“ÍjÙÚÏÔ“‰»ÙÚ÷Á±»ßÄÙ›¾Đæ±»µØ±ŸĂñÓâḈ·‡‘×8癉kß [ïS·Ôù¿ßÚ©Àăß½€Ăà™ÓơêÛ«‚ ½9Ă訇¤2€̃êLÛ«‚ ½9™‰kß [ïS¡Á÷ê9¥‡¡Û·‡‘×8竇“Íj̃ˆ‡ŒÛ«‚ ½9Ï̉¿í”ÈúÂêöŸ́Á½ưÀ¡Ô«‡“Íj÷‡¯È¼ÛĂôË¿·‡‘×8çÓÁ“¹ƯN¡Èă½Ï̉ÿ¯¶ù×Á‡é/×:ơêđÓ¿»ŸÖ½‹Ç‘Æ»ØÙ½©Üç̉ơÔ…Ơ¹¿‰¿I¥ÓÛ«‚ ½9ÛºÛûË’¹ÜNÿÚĂÚ—ÓÏÔ‰ÔÙ½¹Ú×ç₫®¶ÏÔ›¾×Ă™Á¹Ú¯Û¹ØóÓÏÅ·‡‘×8çỞœ‡öăà߈ƒˆ½ƒ…»Ù×ï½ÏÄAÏÅÛ«‚ ½9ëö×¾ÿÛöçô›¥äỗç̉öÁ߈‹ÇẲÏÔ¹ÚơÔåôĂ¼Û«‚ ½9‡ăˆŸ;ÙÚרăơ£Ç£ÇăˆŸ;ÑÓá —»ÏÔµ†ÏÔ™‡ù×Ă㫇“Íj±ëØ÷‡¾ÅØÿẨر¿Û«‚ ½9ĂÙ ·ÅëÑÓ“«‡“Íj»ØÅà«Ôµa心ɇÅØëöçÚđ»›¾ÍÓ±»ưÀ•·óDZ»áî߈£È¯₫Ô°¯à¨¼¥Ữˆ/™»ăà߈ù׿̉¡Û¡Ó¼ÇÅÇÖÛ«‚ ½9£µÅƯ«äÍĂơê·‡‘×8çáܥ؃vÿÚöÁŸÖº·‡‘×8çÓÁÛר‡¤2€̃êLëÓÏÔá ăÄ’Ơí‡ù×ăˆŸ;k¼ÔŽ«‡“ÍjĂÈ¡ÇơÔù׳zÀ‡€è/Ö:âơµ†íÚ™ëéåơÔÁ̉¿»áꕽ߈‘ơ“ÆĂه䅇Œó%§ÀåôÏ̉¹Úëö·#Ï̉öÁ8¤‡é¾ƯÓ §ÔÀ½»ô¡ÔÄ»÷‡߈·¼Í7…»¡—ñÓăĐỞÚ×ïDéºÁ½©‰ƒˆ́êÏÅÙ½½÷Ú¾ºí‡«»›‡ï»—ÓᙇơêƒÖù×Û«‚ ½9Ç÷Á̉ơèÅëÔÅØưÀ•µØ¡Ưù×ß»û¾¡È«‡“Íj“Ơ9¥‡ïi÷‡Ï̉ÑÄëÏ̉ív¡ÔáêÛÄÓá ËûÉ̉ÁƯ«‡“Íj¡Û̉ÁçÚ“Ơƒvƒ×ƒ×ăơ³í˿ӫ‡“Íjëö¹Úâ¼ï»›¹°»µêµØơúóÄù¿©‡¥2ßëM±»ºÛơºƒvñÖ«‡“ÍjưÀ¶‡Ö8æËÉ9ơê»ïÔÅ2±»¾¹Áñ»±»áÛœĂöÁ +¶³ƯÓ ¡ÔƯ‰™‰kß [ïSï½ñÚå̉ ½›¾“È•Úå̉ “¹ƯN‰¿I×ƠïÚº9¥‡…¼óÇỔ‹È˜‰j̃ZîSÙ̉ù¿̃Á¹Ú¿ï€¹ÚƒvËÇÑÁăˆŸ;×ÚᬹÁưÀÓº·Ó ¥0âÁ¶ÔªÔ«»öщ°öß»ûÿ§½±»»Ü™‰kß [ïSö‡“ºׯÿÂâˆ:j‡×¾—Ó™‡ïiëö߈ϼ±½ºÅÛÇß϶•½ëöÛ«‚ ½9·‡‘×8ç×̉¹Úù׃véÓôúĐæ›ÈÅăˆŸ;½ô”½“Ơ¡1ưÀ¢Ç̀́"‹ÙÚÆ™‡ß„«d‡×ăˆŸ«‡“ÍjÙÚ±»ÇëöáÀóÔ߈âÄưÀ™‰kß [ïS½ÈĂȨÇÅÔ×߈ÎÅÑó°»«Ôá ߈©‡¥2ßëMÁÛÇÖ«‡“ÍjưÀ³ÈºÁŸÀ±»ưˆ×Ó½©Ø§Ó߈É‘Ïö‰¿IÛ×ë™HÇÛó©¼£Çơê«·3uU™æ×Ă£Ư÷ÚƠÆÛ×ĂÙÿÚù×­)•á¿À‡€è/Ö:»ÜÑĂÛ«‚ ½9ÁƯóûáëöĂÙÅ߈߈·ÔÎ̉±̉ĂÙÿ×ăˆŸ;ăˆŸƠăˆŸ«‡“Íj¢XƘ‰j̃ZîSĂĂ¥Æ¾ƒÔ©Ó«‡“Íj©ÛÛ«‚ ½9Ù½ƒÔƒØ¡“éÙ½ẩ…Øß»ûÏ̉±»Ü÷$£ƯÓù×·Ôß»ûá¼Ăº9¥‡ù׫‡“ÍjÚª‚ +¼9°»¸ÚÛ«‚ ½9™‰kß [ïSÑùÀ¹«‡“ÍjïÚׯ°½›¾Û½íÆñÓÏÅ™‡Ù½߈ͼܺÙ½Ù×ȇxéáªÓÓ嫇“ÍjívXÙ½ôỤ̂à º˜êè䛡ƯÓ ù·ëÚ™ÁµÈ߈ô·Åºù×ơ‡¦Ơ߈±”ÿ ¿ßí‡ăˆŸ;Ởù×½©Ç±»©‡¥2ßëM¾¹¶ƒvÙÚ³9¥‡ƒv¡ÛÓ̉­Ô™ŒÛ׳۫‚ ½9“ƠƒÖÿ¯¶·‡‘×8çÛ×ƯÚ¹¼ÏÔ9¥‡µØ™‰kß [ïS“Ơ‡­¾÷i Ëûºô采ÙÅëÑÅ÷å5Ó߈›Ûß»ûï%™‰kß [ïSöÏÔ‡Ú÷¼Ơ”‰Â«ÔƒvÚª‚ +¼9‡bÓ¼…ô­Ä߈ƠéçڿŲ¾ÏÅÛט‰j̃ZîSï»™ëéå»n9¥‡ÇÖ«Ú™‰kß [ïS¡Û™ëéåÁÛ™‰kß [ïS̀ÓÓØ±»§ÔâÁÉóûÓ§ÔăÄÛׇ9¹Ú߈Ÿë«‡“ÍjÙÚÙÅ뮼9¥‡Ù½‘ÖÁ¾µ†ù×¾¹xù×¥ˆ]1¹ÁóÓºĂÙ…ôÛ«‚ ½9…ƠÂÙ³̃¤ĺù׃v߈¸Úëöç$ïÚå̉ ÛºÍƠívƒvǼ@ùê鯠ưÜ­¾ŸĂ½åĂ´ÜăˆŸ;Ïźׯ»ñ…Û±»Û×ÏÅ³Ô å̉ ÅÓ‡Ú½ăˆŸ;•Œ¥Ûù×½á¶Èñç£ØÀƯƒvß„¥ˆ]1߈ƒ·¼Í7ăˆŸ;k™‰kß [ïSÁƯÇØ½÷ÁÏÔÁ̉Á˜ưâƯÓ ƠXâḈ©¼¨ÇÓ½ÑÓÀ׽Ȃa½ëµØ¡È‡ÇÁƯ™Á½¡Ô߈·‡‘×8çƠ™Ó™‰kß [ïSñÓăàíî™ÔÓÁ·ÔĂȫԫÑăˆŸ;Â½ăˆŸ;ư¬åƹÁûÓ£Ó›Ú¾¹x߈ƒv¯×ù×Ë¿£Ø«dçÚ«âƯ‰ëöăˆŸ;ĂƠ¹Ú§Ô·‡‘×8ç߈ÿ¯¶«Ôº½ăà©Óׯñ°«[ôġǡÔÅÓØª‡’̀j÷‡›¾¿‰¯Èá ùסÔÁ÷«‡“Íj“¹ƯNëöÂÙ÷à¥Ø½·‡‘×8çĂÖƠ‡Œ½¡Ô£äÇØ¥Û—ơ™‡Ë̉ù×ÛÄÓăˆŸÏÅϺÛÀùו%ăˆŸ;k±½ÏÔăơÿÚ¹Ö™‰kß [ïS»ˆƠ¾Gô¯‰¯0¢ä¶̣Çõ±½©Ơ¡Á÷ơêĂÙ«‡“Íjç¨Óß»ûƒÏÅÇÖơĂăˆŸ—Œ߈ª‡’̀j‡Ü±»µë›¶éøæ»½ÉŒăˆŸ;™‰kß [ïSÅö©ÓÛ«‚ ½9/ăˆŸÏ̉ƠXưÀíâÙ½ÑÓëö»¹¾Ű9¥‡×¾¹¾ÏÔÛ«‚ ½9ù׋ö‹É0ưÀ½±»â ‡x©‡¥2ßëMĂ¼­ØÿÚï»ÅįŒª»”¹ÚßñÄÅØù×¹ÚåĐ•{ñÚù×ơê–Ó±»ăà¹ÚĐÓÑÓù×£ÇăˆŸ;ï»Ë̉߈ÓØĂÙ…Œ‰¾ËÉ9ÛÄÓÍÇÏÔÓÅ©¾χ™‰kß [ïSñÓîç‡x÷ÁÑÓñíÈÏÅơ^ƒvĂÙ߈Ö¼íÛ×ùëµØëÓ¹Ú߈ñÖ‰ơ½“¹ƯNÏÔµ†ÙÚÁƯ¼©Ø‰ÛÅ–¹à½€χöÄØ•‹HăơĂÈÔ¾FÛÄӛĂ׺Åû(§Ơ»‡Ù½ÏÅ“Ơ¤Óù׃v›¾ËØù×ÁÛ߈ó%8¤‡₫®¶¹Úù×ùơùׇٰ»©ºÆôơúÙ#±«»±»ÿÂﶘ‰j̃ZîSăˆŸ;ÑÄëóÂăˆŸ«Ñçºÿ¯¶ÍƠµ÷Ó̉™ơ߈ƒˆù×Ë¿ÿ¯¶©ÓµØÇ"ï»Ưº±¿—ˆøơ¥ÈăˆŸăê™ëéå߈«d½ÙÚ£»åơµØÍħ¯óǧԾŇºÛ«‚ ½9‘ÆơêÙ×Ưºơ꽃vÀÙ“È™‡·‡‘×8çù×÷ÙÙ½½©À߈Ï̉ëö½ÏÅÑØûØëö»Ø¥ˆ]1g³ÈŸÖ‹È±¿éÓâà…—Œă½ƒˆơêåÁĂô“ç¾É€·Ô¿àÏÔÏÅ¢ ÏÔ—¶ù×ÏřӋÜÁ̉Û«‚ ½9«‡“ÍjëöźăˆŸ;ù¼ƒˆêö¿º¥ÆÀƯ‰í‡±¼ÏÔ‹ÀÁÓç·‡‘×8çÏÔÛ«‚ ½9Ç̉÷ü¾߈ñÖçÜÿÚ߈ơĂ™‚Ă ƒ½·ÔÏŵ؋ÈÇÖ“Đ9¥‡¶ÿÚíÁÓ§à·‡‘×8ç­¾c±»íêÀËïÚ¿́ƠÏÅ߈¹Ú‰¿Iëö½qăƠ£Ư·ó߈ÊƠáÀ½ºÏÄ­Ä̀½ ¸ÚƠ—φø÷׿8Åô±»…Ô™‰kß [ïSå̉ ߈¾ß߈•'ø×©‡¥2ßëMƒˆË%¯¾±Û˜êèäÏû÷ÚÇÖÙÚ™‰kß [ïS«‡“ÍjÇÖ¾Ơ½€‘Æ—¶™‡ª‡’̀jÙ×™‰kß [ïS·Ôÿ¯¶¡ÛÇØ×¾½¾₫Ưº«Ôù×¹Ø߈ƒ½­Ø¡Û߈Ơ×ÜÔ›¾™‰kß [ïS­ÔăˆŸ;ß»û“ƧÓ÷‡ëö±»±‚ÙÚÓÅǼ­€µØ»ÏÅ߈½ºéڽؽ«Óï»§ôÿ§ÔÛ«‚ ½9ƒvưÀ³Ç’ͽ’½Èùש¼ÀĂó|ƠơÔ±»¢́£Œ½€˜ÁÛ«‚ ½9ù×ö¥‰ÍL…ÑÄë¡Á…Ơù×½ŸÊÑóﻓ¹ƯN¹Úï³2«‡“ÍjºÅ ä̉«‡“ÍjÛ«‚ ½9¿‰Æ×ù×ÜøÛ«‚ ½9·Ô£Ø9¥‡ơÔºö½ưÀ¶̣ƒ¯ÔŸ}ơêÇ̉Ϻ‹ÇơÔ×ƠÁbƯÓ óĂÿ“Ơ«‡“Íj‹Ó¾Úª‚ +¼9…Ô·‡‘×8çß»ûƠÜøôéǼ©bÓÆ‰Ç¼ùׇ“ÍË)éÛ9¥ÏÅóÇû¼ˆÇàÛ«‚ ½9é‡Ă¹ư“°»Ǻº±»çÔ¡ÿ¯¶Ïß߈¹Ú›ÛßÁëơßÚù×½ñÚ¯¼ÛºÏÔù×§ô¼Ăéº™Ă…Öß»ûå̉ ĂëÓÿÚëö¡ÈÇÖâjëöơÔºy-•Œû̉«Ô¼È«ºơꪺ1¯‰¯0ß»û³ÆÛ«‚ ½9¸Ú¡Á™‡½ăˆŸëöщ¹Ú·‡‘×8糌‡£äëÚö½€Û«‚ ½9½™‡™‰kß [ïSƯÚ÷|¢È ÂĂÏ¿ÛÇÛ×½́v÷Úéºỡˆ» ׇ‡ư2÷Áï½ÀĂÅØ½Û«‚ ½9É™ëéåµa‹ÜơèÅٽٽ‰ ‹Ù‹ôÏÔñ‡¿à•ÛăˆŸ;±»ÅÓ÷Áº÷ÁëÔÎÅ‹ÇÚª‚ +¼9ĂÙÇÏÏÄ·ÔëöăˆŸơÔѶÓÆ÷Á³ºó©ÀÇÓ—¾ëØ·‡‘×8ç¢X9¥‡¥¼‡ŒÛ«‚ ½9øêÛ«‚ ½9ívÛ×®¼¡»Æ_á­ăàç̉Û×ÅÓ»ëöÙ×Û«‚ ½9¿‰Ö¹Ô©‡¥2ßëMµØ§ôÍË)éÛ9¥̀Û«‚ ½9߈ÿ§«‡“Íj§¹ËǽµØÛ×Ï̉±»ù×9¥‡¥Æ«‡“Íj†ÚÛ«‚ ½9¡ÔÇÖ«Ô¤‰̀L„ÑÓÙ̉ßÁ½¾¹6¯È9¥‡±»ùê¼ơê¡ÁÙ±ëØµ¶‡±È߈ר™Á±»ÁÜ»½ÏÔÚª‚ +¼9ŸÈ·ŸàĂÿ§Ù×ÍĂ›¶é¹ÚºĂ䌾N›vôĂ‹Çù×±»ÛǼÙƠ–½ ËÏ“ƠÁƯ¯¼ĂÙĂÇÖͼ°¿«‡“Íjù×ÙÚô›¹ÏÅù׃v‡áê߈ÏŵØÏÅèê ¡È÷ÙÓØ³”ưÀ½“Ơ9¥‡ƒvÏű»öµÜ½ăˆŸ;÷‡Ẳ«ÔÛÄÓ¾ÏԑƺœƠÁ|ù×êö×$»Ø·ÔßÖÿÚ»º¸ÚûØÁ̃ŒÚ,߈¹Ú›¶éăÁç̉ñÓ«·3uU¥‰ÍL…×¹Ú—¶±»Áÿ¯¶½ù×Ù½™ëéå·Å¥ºư“áăˆŸöăÁø×ƒv¹÷Áÿ¯¶·‡‘×8ç‰ÛơèÅÍƠßÚܽôÙŒë*«™‰kß [ïSƒvÑÄë匿NƠù晉kß [ïSß»ûÿ¯¶³àÅØ¹ËƠרĂµØ·‡‘×8çÙÚ·Ó ¥0¾ßÛ«‚ ½9ăˆŸ;ÿ¯¶÷‡à½ á ™Áƒvå̉ ƒÖ¼GưÀÓÆÿ.ùש¼º±»›¶é₫¾ßÚ©ÜöÛƒ»ØµØù×ăÚơẮ –GÏ̉ù×Ï̉™‰kß [ïS«‡“ÍjơÚ̀ÓưÀËƠרÚéôˆÿÚÍƠ±»˜‰j̃ZîSƯº·‰ï#ûâÙÚƒ×ÿ«÷«‡“Íj»¼‘±»ƒÖ¶  çØù×߈Û«‚ ½9ăˆŸ;Û«‚ ½9ÀËÑÓ¿ºÎÔ‡x›Óºyù××¾ù×–¶ƒˆɇƒÖ›¾Å»÷$óÇăˆŸ;öÙ̉¾º‡Û©©ôăơ½¹ÑÓß «‡“Íj™ÓĂÈëöƒvÖÆ‡ŒÏ“·Ô¢ôÓØ§Ôë$¿ô» ŸçÁ‡é/×:¹ÚÁÆĂ´'Û«‚ ½9©ÜÛºƒv¿«‡“ÍjÓØ‚߈¾Á¹ÏÔ¹ÚåÁăˆŸ;ơêåĂ£ ¡È¡ÁßÚƒ×8¤‡×ơÍ·‡‘×8çơĂ»ẮÅÏÔ߈©×ÓÛ«‚ ½9ùׂvƒÛ™‰kß [ïSÿ&ĂÙÛ«‚ ½9ăˆŸ²¹«‡“Íj©Ë8¤‡ÖµôơÄ9¥‡Ï̉«‡“ÍjăˆŸ;k¾¯Èưâă‘·«‡“ÍjĂĂºµa”ËÈ9öiÀĂ߈ ] ăˆŸ;ƒvă¼™Ó’ƠÅÙùêëö‚v™‰kß [ïSÅÔ±¿Ơ­Û£äÅ¥Û±ëØƒÖÙ½™–ù×Ëǘêèä¹Ú•½ËÓ™‡ƒÖéå̉ Ươ™‰kß [ïS§Ô¹Ú™Óù¿ƒv¥à¿Øâˆ   ×Ơ†7§j¸ÚµØÙÚÁ¹Û×ÁƯ‰ỵ×ív¬ÄÁƯׯùơï»Û%ƒàôê߈«‡“Íjö‰»ÔXÛ«‚ ½9›¾ƒØ÷å5ÓÁÓÏ̉å̉ ÛºÙÚçÚ³È̃ˆơê߈Ă$›¶éﻕŒÙÚºÏÔÏ̉Û×·Ó ¥0÷ÁĂÖÅÓ¡Ơ¾ÏÔăˆŸ;ø×ơꉿI•îïÙ×Ù×öƒ¾‘ÇÖÙÅë¹Ú·‡‘×8çÓº9¥‡Å¼»¹Áǻ۫‚ ½9·ÜÛ«Èø×ÏÔÊ%½¿‰ï½±)·‡‘×8çô¾‡ƒ½”·™‰kß [ïSø×Û«‚ ½9ù×ÿ¯¶½›¾½íÀíê߈©Ø÷ÁﻪĐÙ½Ă¼‡º¹Ơ·ÔăàI–»±»öÁÏÄƠÓÅăˆŸÿ§éº›¶éËÇëÖắÿÚ™ëéåÛ«‚ ½99¥‡‹Ç«‡“Íjí‡ơÔ©&9¥‡ÎŽ߈ͼ¹‚ĂÈ×Ơ†7§j߈¡ÁÙÚ—êĂØ ÁăˆŸ©ÓÙ½Ơíê³+Ôù×—¶ăˆŸ…ÔÏÔƠ±»¿ôÍÄÅăơ¡È–»™ÁƒvºÛ«‚ ½9½€ï»…öÀ̉=ù×Ó ‹›æ¡ÛÛêÂŒE±»©¾£äªÚƒ߈߈¢Ó¡¼߈ùש¾Æô«‡“Íj¿»ñ‡¯È™ơưÀ9¥‡™‰kß [ïS¼ +߈ÍÓưÀжăÁźrö‡xĂÙ²±½ËùêÙÚă»Ơ/ă½é‰ñ5ñ·ÛÄÓëö™‰kß [ïS½¯àƯơơêù×’Ơé"ŹړƠÙ±̉™‰kß [ïS߈ñƽÁ™‰kß [ïSëÏÅù×Ù½ÆĂƒˆéô™‡ăˆŸÛÄÓ™‰kß [ïSÁ¾Û«‚ ½9ôâçô½öÂÈ»½ñǘô¿ß»ØÎÄǽ©Ü„Ѳ¡Ơû(¤ÛÚÀÛ«‚ ½9‰¿I½€£»§Ó˜‰j̃ZîS“¹ƯN³½Û«‚ ½9ÉĂ—¶ăˆŸ;k½µÜÅÔ…à÷å5ӭı»ÏÅ߈ß»ûưÀ•ÓÆ¦ô>Û«‚ ½9—Ó9¥‡×¡ÛÚª‚ +¼9×$—¶ù¿•Œ™‰kß [ïSŸ}߀ôÛ«ûđ…ÇƠÍË)éÛ9¥…Ôׯ߈ÿÚ¾çÚăˆŸ;k¡ÔߌÛ,á+†º™Óëö‡ºå̉ ÙÚ¡Ó—¶¡ÁÓ¾«‡“ÍjéÓÂíêß%‹Ç£XÏ̉Ï̉ ]¥Ó™‡™‡ßÁ™‰kß [ïSå̉ ׯÛºívù×™‰kß [ïSñ,ßÄÙĂÈÏÅ«·3uUäÆ ·Ôíê߈ăíøê¡ÛửĂΡÁ§Ô#ÏÄăˆŸ;ßÄÙÏÔ‡“߈¿@ïgϼ©Ü9¥‡×ăˆŸ§‡ˆ%‡“²ÂÅØ÷ˆ8¤‡·ô›¡ƠX™‡Ù×§Ô‰Ûë́ûÓ¡ơÔÏű»«¼‚vÁĂ¡ÈưÀơê¶èÄÓåÊÍÓ¿‰áêÓàéê·Ó ¥0ùêù׺\¨Ç«‡“Íj›¾µÜ›Ú½ßỬå×Á¹̃ÏÔ‹Ù¾µØ‹ÜưÀ÷‡€ºïù×߈ƒˆ¥Ÿ…Ö®Gø̉ºó#åĂ½Ô…×ßÚű»ÏơÙÚåôù×›¾ûØ™‰kß [ïSơêµÈ9¥‡Ù·‡‘×8ç׿8öÛ«‚ ½9ٽ߽¼߈•ŒÔơœ‡á …ØÛÆăˆŸ;kÁסùêÜÀ·Ô®Gø°¿…ô£äÛ«‚ ½9¥âÿÇÿ‡׫‡“ÍjĂ˹ơß»Áë×±»ùÚÙ½߈«‡“Íj—¶«»™‰kß [ïSăˆŸ;«£·ÛơÔ߈ù×ñÓÛ«‚ ½9߈©Ç…ù×߈÷ÁóơêÏ̉ÿî­ÄºÁöÚª‚ +¼9¹ÚµØưÀÏÔ­ÖÔXù׃ԟƠ‹È¥…ôÛ«‚ ½9ß»ûƒˆÙ̉9¥‡™ÁÓñ•Ó:ÙÚøê™ôªÚÏÅù×øê ¯¾ÚÆñÙÈẲ¼™‰kß [ïS…ô¯á‰¾̃„&ùÜöÙÚ•óƒÖÅÏ̉àÛª‹™‰kß [ïS¡Ô™‰kß [ïS¾Ô¾Ăº±»”½Û«‚ ½9£ÇÛ«‚ ½9óÔ™‰kß [ïSívơèœƪ&›¶éù׉۫ԭÖχ­ÔöÛ´«‡“ÍjăˆŸ;ơԳે“ÍjưÀítøê +÷¼§«‡“ÍjƒvÛ«‚ ½9‚vщä̉%%̣Ô ©‡¥2ßëMÏÔÄä̉÷ˆÓÅíơ¹Ú߈©Ç½ó#¡Û†đ5ÿ±»°È«‡“ÍjÙŒë*«”ïÚƒvÿ¯¶¡ÔÍƠ›ÛÏÔ™‰kß [ïSٽ߻ûÏÛ«‚ ½9Ù½øêÉÖ¹ÚÙÚç®ñÚ߈³ºó߈凼÷‡™´“ºăˆŸ;›¶é«‡“ÍjÄnùêßøỞ̀Ó»ÅÔÅ»đÓ‡“܃vÏÔëö¹ ưÀµØ¿́÷ÙÏÔÁƯ½“Ơ¸Úơê¥ơ‡ Ûùש‡¥2ßëMÜÓ ₫¼ ơÔ¯ÈƯ‰ÅÄÏÔ9¥‡ÑÄëơÔçÚ…ÚÇ™‡ƒÖ·‡‘×8çµÛơÔ™‰kß [ïS₫.¿̣ŸŸÈ˹ÁĂ÷‡÷ÚÓº°¿ƒvzμ8¤‡ÖׯÓŧÔÏÔǼÛ«‚ ½9“ØÛ«‚ ½9öÁæƠ‘Úù¾9¥‡«‡“Íj󙫇“Íj‡Œ™Ó‡Û«‚ ½9½Ø¦ôÅÓÛ«‚ ½9ÔX¶22ÅàƠ߈ßÚù¿…ŒăơǼóÇÏ̉ôî»Å’ƠÉÇŒăˆŸ;k—»ĂֽŨ¿ôÏĸÚͼưÀâà‰ŒÇ·ÅͼëöñÖÂñ»ơú™IŽ­ÄơÄ“¹ƯN÷Á›¡°¿å̉ çÔ¡™Û§Ô©¼Úª‚ +¼9ĂÈơêÅÔ߈ÛÄÓëöÓíÖă’¯àÏԥط‡‘×8çâàưÀÏ̉Ï›¶é›ÛÏÔºyơ£»ÖÆ é‡éƯăˆŸ;±»¹Ú…ƠăˆŸ;“Ơ³È‡ŒưÀÙÚĂÈ™ÓÏÔ°»»Ó߈ơê¾× ±»öÁ¹Ú¡Ûùן}·‡‘×8çẳŸ¡́v3ăÁăˆŸ;k§ô©¼­Öáê߈™‰kß [ïS»Ø¿›Ó¶ß»ûëö³ºó¶èÙÚcv¥ ÏÔ¬ÈéºáêÅØĂȱ»™ÔÏÔÂÙ¥Øÿ¯¶Ơâˆ;ËÓ…Ûêö£ô߈÷ÙÑóëÁ¾º™‰kß [ïSÓ'£ä™Á—ùסƠ«‡“Íj߈½€»Øƒv‹Ü߈ÇôÑÄ뛾̃ˆñÓ¡Ơ¹£«ô‡ƒ½ÏÅáê³±»9¥‡Û×߈ÏԢآ̣ÏÔ£äé‰ñ5ñ·ÏÅ߈­›¾±¿ñÖÍÓ—¶¼ëö߈÷ÁĂÙ«Ú²z¤Ó8G¤‡GÖăˆŸ;•ŒÓ¾ÏÔ¿‰Ïųȿٙ‰kß [ïS½âÄÁ½²Æ½ăˆŸ;ơê߈öËÀÎ̉«‡“Íj¿‰߈°¿ƠÔµÈƠ¾G±ëØôÔÑơÔÑÓ­ØÄÏÍË)éÛ9¥¡“›¾ơêăˆŸ;©ÓµÜ«‡“Íj÷ÙÉ̉ăˆŸÿ¯¶½•Ù½̀ºźùëׯ§ׯ߈™‡óÄăˆŸ;kự߈«dÎÅưñ¹Ú±»“½áÂϹ˜‰j̃ZîS±»µØÙáÁ̉™‰kß [ïSÙ½½ơ«Ú°»óÇÙ×ÓØ…£Ç߈ÁƯ›¶é›·Ô߈«‡“Íj—Ó¿ºơê‡ÏÔؽ±»ª‡’̀j½¿‰¯ÓăˆŸ;Ël¸ÚÇ™‰kß [ïS›¡ĂÙëöăŒÅ¿‰®¼ +Ù½åƠ©£ëövCù×›ÚưÀ¹Ú½­ÔñÖÍÓ¥q­Ä»½€ÏÅ߈ÎÔ˜êèäÙ̉G½¹ˆĂÙË4ÑÓĂƠù׫‡“Íj±»ưÀ¹Ú×ƠœÜ ½€₫³‡ëö߈ÁÚ—¶·Å‡Û“Èÿ¯¶¾¾ùôá=…ŒôÔ­ô½ÏÄ \ß»û¡‰ơ°¿ơèÅÿÚ÷Á›Ú߈©ƠÙÓšۻ؃ṽ%ºÿ¯¶½“ÍÄĂ¼ó­Ö™ÁÛ×Á‡é/×:Û×ÁÚÛ«‚ ½9«‡“ÍjÏÔÅÄÛº߈˜‰j̃ZîSĂĂ ›­±àéM퇺¿‰öÇÖ¾æ̉º¿‰‰¿Iµ†ÎÁĂÏÅéÓơËÇ›¹ùêϼ«‡“Íj8+¤‡+Ö!߈¡Áù×9¥‡ô«‡“Íj¯Óù׫Ôô«‡“Íj™‰kß [ïSÖ¹ÍÓÄôƯƠ™‰kß [ïSăˆŸ«ÔÏÄÛºÛÀñɘ׿‰ÑĂửÛ«‚ ½9߈ƒvº”ÚµØè‰đ5đ¶³ÈÀð»Û×ơÔ±»̀4¬H4ĐÄꉺâÁƯº³ºó¡ÔÙÅë·‡‘×8ç9¥‡ƒó¹›¾ó¸¾çÚ™ŸưÀơê›ÚßÅÔĂ™ĂÙÙסÁŽ߈©"ç̉ºÈ ™ëéå™Ó9¥‡öÁ̃Ẩ9ô¹ÚöÁß»ûÁĂù×Ù½™‰kß [ïSƯÓ ›Ă综á Û«‚ ½9ëöÅØÛ«‚ ½9÷Á·‡‘×8ç÷Á—¶ÚƠÎÅÿ¯¶§Ô¥ˆ]1×ăˆŸ;׿8ăơÚÀâÛ«‚ ½9Û«‚ ½9ëö÷Á“ƠŽ™‰kß [ïS¹Öù×µ†ăˆŸ;k‰ÛëÚÙ½§Ó½Ôÿ×ù¿ôÈĂ™‰kß [ïS½ÏÅ·‡‘×8ç¿́ÑÄëÏÔ­)ä̉¡ÈĂĂ ›­±àéMß»û™‰kß [ïSï½ë»©ÇÁÍÇ›¾µØ½Ă›‰€¾ƒvơê¶ÅØ÷$å̉ ùלàæÇơÔ™‰kß [ïS›ơÔ߈ÿ¯¶“Ơ÷Á»½₫¼§ÿÚ›Ïà‹Ü‹Ü³Ù×ÇÖÓ̉ÎŃäÏÔăˆŸ;‚ áê½¼ˆ‚¾½™ôăˆŸ;›¾íº°»±å¡ÁÅ–Û«‚ ½9ù××É¿I°»ßÚÏÔ¡¼ù×LÛ«‚ ½9™‰kß [ïSÏ̉¯¼±»±» ƠbƒÄÂĂ—¶ÿÚ“Ơ£äƒ×˜‰j̃ZîS¯Û߈øêÏÔÁĂ—¾ÙÍ­Hñ»¡ưÀáê«»íÇÖ¶Ăºív‡Œ½Ë÷Á8¤‡×÷ˆôÔ«·3uUÙ×á •Œ9¥‡Ë̉ùơ—¾£̃¡ƠăˆŸ…Ö¸ÚĂÙ¿ô››™Û×ăˆŸ;ÿÚ߈…»×Ơï½ÏÅÅØ­Ô™ô߈ñÚÇ­Ä™ôµØ«Ô©¼»̉“ÆöÁ“Æ߈ÉĂëØÙÚûü߈å̉ ƒv‹­ÁƯ÷Ôơêù×ơêÏÔáű%áêâˆ:k߈ØÅꙉkß [ïSëö߈ƒˆưÀ«Ô×¾Ѷ¯ØåÁ¯ÛƠ¼íÊ½ăˆŸË̉¯È™‰kß [ïSƯÓ ©ÇÓ.‹ÇYåÁµĂË%¹Ú́$ÏÔăઇ’̀j‹º½½™‰kß [ïSƒvªĂ—¶†Œ€ºçÚơÔÍƠ¥Ø½ƠÔÅØ߈ëö±»ÔX Ïź±»î»½ÔÇÚÛÄÓÁ¹»™‡©Çÿ¯¶ÇÓß»û™‰kß [ïS“÷ăˆŸïiË%ơÔ³Ç_·Ó ¥0ë¼đÁñÆ•ó‘‡x«ÔÚª‚ +¼9×Úå‡̉̉ĐÓÏÅ—ñƒvăéêƒà±»éđÑÓ8¤‡Ûº÷ÁùæöÁÏÔÿ¯¶ÍÇÔXñÔĂƠ½ùê߈ù×߈‡¹Ú™‡₫®¶¹Úƒ¾‘¼Ù½¼È¾£ÇÛ«‚ ½9›¶é™‰kß [ïS°¿æÚ Èù×ỞơêÄÀ§ôÿ¯¶߈ơÔ™ëéå߈Á˰êØăˆŸ;\Û×£Ô¹Ú›¾ƒÖÙ½±»íÖÏÅщ£Ç™‰kß [ïS8¤‡Ö¹ÚƒØëöÛ½ƠăˆŸ;ÏÔ÷Áá×ûÙëÔÛºûÓăơÍÄÁ̉¾ß»ûºăºÇĂ«‡“Íj߈§Ø÷¼ù×±»Û«‚ ½9ñíÈÏÔ¸ÁÅ1ÍÇăˆŸÉ›¶é©¼ùêù×éÚ™‰kß [ïSùדƠâơù×·Ô±»•Ö́vùø߈§ØÛ«‚ ½9¾™‡“Ơí—GÚ½¹ÚƠùדƫ‡“Íjé‡Å–¹Ú9¥‡µØƠÓ©vׯ—ËÑÓ߈Ù×ưÀ¡¼³ÆÓ̉ăˆŸñÚÓØ¡ÁƠæ̃ñÚ­ÖßÄÙëö»ÓÅàÿ̉©Ó9¥‡ódžŒï³2óăvÁÿ÷$±»ÇĂ¯G‹øăê±»£Ư°»íÁ§Ô±Ü8¤‡×¾ăˆŸăˆŸ¿çóÇ‹ÜơګѧºÛ«‚ ½9ÏŇÏŽơÄÅéÓÇÖ¡Ô•‹Hó.ï½ÛׇÛëöÇ̉ÁÚ‹Ü«‡“ÍjăˆŸ;kƽèŸÉƠßÄÙö÷ÁéêÇÖơÔĂȱƯÙŒë*«ÑÄ냣»ÎÅĂÈǼÙÚÉ̉½߈á«ăÁ÷ˆívăˆŸ™ÁÛ×Ư‰ùê½™‰kß [ïS½đÏŽ—¶›¾ăˆŸẲß'ÏÔÏÅĂ¥Û™‰kß [ïS§ôËÀăêé¹ÚÆØ’ȩز(ォ‡“Íj·ÔăˆŸ;ơƒ…Øá ÂÙ“Æơă»ÑÄë麅»G½¹ׯƠơà¬ơÔ·ºƒˆ±»ƒµ߈µØï½ËÉ9Á‡é/×:³ÈµØéÓÇÖÅÔ™‰kß [ïSßÄÙÛ«‚ ½9‹ÇøơÏÔƒ½ÚÀ¼ơê±»ª‡’̀j÷Á·Ô±ëØÈƯÓ “ƠûơèÅÑĂ—ˆăˆŸ;ăˆŸ;kŸüÛ×Û«‚ ½9‚v́v™Á‰‚™‰kß [ïSôêĐˆœ‰¾Iăß½§Ơ×¾ÑÓܳàÙÚơèÅ•½ͼ«‡“ÍjÛ«‚ ½9Ÿ}‡ÚûÙ¡ÁÀÇŒéÓ¥ØĂÙ½“ÛÅ–ăˆŸ;ô™ÓÛ«‚ ½9Ăº©ºÏÔßÄÙѯ×ăˆŸ«Ô‹ÓöÖƠÛ«‚ ½9ñÚù×᤹ڔ׷‡‘×8çăˆŸ߈ÀƯÇÖ†Úƒˆ‹Ç·ÔƠµÚ£Ç¹Ú›vÏı»¾øê¿‰ĂƠ£äÏÅ™ëéå›·ÔÍBçm—¶ƒvÏÔóÇƠîÿÚ±»‡ÓÅ«‡“Íj¯‰¯0‘ÆÿÚăˆŸ»Å³ºóùëϺ“Û߈߈öÁđÖâˆ߈ë™HơÔ½À¶·Ô›Ơ¿ç‹È¤Ù½çÚ‡Œ‡“‚vÓÆ¡»ăö°»îD +ĐĂ­€߈³ ̃ˆÄÓívÆùשƠñÆƠÙÚñÓăˆŸ;k×¾ăơ÷Ú›¾Û«‚ ½9™‡•{ƒÛăˆŸ;kê¼ÀĂƒv¹Ú°&ºăˆŸ·ư¥Ç¸Ú¹¼™‡ßÄپߧ÷Á«‡“Íj±»ƒÔ™ÛƒvÏ·‡‘×8ç×ÓĂçÔ¡æº +±ëسµ؛¾óÄÁ¹·Å¥Ûó ¿ñ¨“Ơ™‰kß [ïS×Ơ†7§jÍÄ«·3uUăˆŸƒÖÛ«‚ ½9¿‰Ñű»˹½Û«‚ ½9¿Ô§ÓûƠ±»ÿ¯¶™Ó‡x™ÔÚª‚ +¼9©&‡Œ›¾Ån—¶ßÏÂûÀ³z÷Áá°Ï̉‘ÆÛÀßÖÛ«‚ ½9á=ÁĂóÇɇưÀÄØÛ«‚ ½9©‡¥2ßëM‚ƠXºØñÔÛ«‚ ½9ƒvÏÔƒÚÙÚÛ«‚ ½9µ́·‡‘×8çăpÉƠ™b†$íÁ¡È©›¾ƒÖûƠËØ9¥‡÷ˆ‘ÆßÄÙź±»©º©¡«ÔĂđ¹˜ ưÀ8¤‡›Ú™Ô¡Û×Óâàö±»ÏÅâˆ:kôº·§D çÚ¿‰˜êè亶Åï³›í‡ÏÔ­¾›¾ßÄÙ½£X¹£‰y»Åߘ̃ÄØÉăˆŸ;¡ÔÏÔ8¤‡ÖƠ·‡‘×8çù×™‡̣ÉÖßÖÙ×­ÿÚ³ÂÏÔƒ¡ÛÍÓă»ÁËç$ϼ±»±»™ÁÛºăˆŸ’¹ÜN“Æù×Û«‚ ½9ăˆŸ;ÎÚ·‡‘×8çÏʼn¿I½€™‰kß [ïS¾ÏÔ±»¯Ü°»£»éÓY…ÂƯơëöÑÓÛˆÅÄÛ«‚ ½9©‡¥2ßëMĂȳ—ˆ·‡‘×8çÛ×À¹ƒ¾‘ù×£ ưÜï½ëöä̉̀Ó±»©¼ù×êöÁËĂ ăˆŸ;kÛÛ«‚ ½9û(ëö™‰kß [ïS¥ˆ]1çÚ±»ăˆŸ·ÔëÓÓƠ¾GƒvÇúÙ½8¤‡™‰kß [ïS¿‰ëö‰ÁçôéºăˆŸ;£ØÙÚóÂéÓ‹ÜơÔÖ¾ƒvÓÆ«‡“Íj¡ÈßÄÙÿÚ±»‡Ù½ͽÜÓ ăơ¹Ú×Ă÷¼« ©ƒ»5ÙÚ̃Úù׿ºư“¡Á¹ÚĂÈå€ơ껽ùעȾÏÔÛÀưÀÍË)éÛ9¥Ï̉9¥‡×ñÆ߈‰ÆăˆŸ›¾́–G!ƠÍBĂăˆŸ;Ëá‰Ô¡%Û«‚ ½9‚vëöß„Ưº‡“Û«‚ ½9¥¾°»å¾å‡²í½›Ú±¿ÑÓ¼ăÁ¹È±ÁÏÅ™‰kß [ïSµØ‡‡»Ï̉Ï̉ßÁ¡ÔÛ×Á×­ÖÙÚ½±ºñÓÛÆñÖ÷ÁÁ¨ƒˆ‰…ˆơÑñ»Ë̉ÿ¯¶ÍÏÙ½¯¾߈çôÇ»ÙưpͼñÓßÁå̉ ¡“Üëö«Ô«‡“ÍjĂÈ™‡¢äœ·̉ ¤0«ÔœÜ¹ÚÙÅëÙÚå̉ ¾Ó +©Ó‹ÇÚ×Û«‚ ½9ËÉ99¥‡¡©©ƠÏÔ«‡“ÍjñíÈÅØå̉ ơêÛ«‚ ½9ª‡’̀jÂù×—¶ÎơèÅï½°»Á̉ÏÔ‹È0á§áÄ¡ÔëÚ©‡¥2ßëM“ƠƒˆëöÛ«‚ ½9ŵ½ơèÅăÇíͺ©Øù×ù׃¾‘™ơµØ½£äçôƒvÏÔ©ÜÏÔ¡È“Ơ…ƠÓ₫߈©ÿÇ™Áµêù×¾è…ÇĂÙU™‰kß [ïS™Ó¥ÛÛ«‚ ½9»ËÚº™‰kß [ïSÏßđ™ëéåÓÅÏÔÿ§‹Ï̉Ư‰´Ǿơ½€œÜå̉ ÊÈ9 ûƠÑÄ뵉ăÜÛ«‚ ½9Ÿ‰ëƠUóÇáêƒvͽíÆÅ±ëØÁƯÛ×ËÉ9ùסÁ½‹ÈÑóơêíJÖÉæÏÔĂô₫®¶ŸÈÅôï³2ù×ỞÙÚ«‡“Íj罫‡“Íj߈‡º³ºóÏÔÙ½ÎÄ9¥‡Û«‚ ½9“È¡ÁË¿ĂÙëö«d»ñåÏ̉“È—¶›vëö¿ÔÎÅéÓ±»ÁăôÄñÖù×µØÙ̉¾çÂÙ½ÏÔơêÛº÷ÁưÀÅØ€º ÍƠÙÅë߈½Ôç·¼Í7ăˆŸ;ơÄ߈Ëǽ°»Ûו'9¥‡ăÁÙ›·Ô–áĂÙù×¹Ú›¹ƯÓ ÿ¯¶©‡¥2ßëM‡Ç“Ư™‡‰¿IªÚÙÚ»¼‘›¾íÆß»ûĐĂ߈©‡¥2ßëM†ŒXXXÜÔÅÔÓºÏÅ™‰kß [ïSׯ–ÓƒˆơÔ½€óÇ©ØÓæ‹…ƯÓ ™‰kß [ïSëÔ4ÍÄÁ̉™‹ƒÔÛ«‚ ½9§Ô™‰kß [ïSÛ«‚ ½9ÇÖºyˋȾ¯‰¯0¾ù×ĂÙƒv«‡“Íjƒ×ăˆŸ;§Øù×í—GµÜÍƠëöÛº½¹Đù×óÔ•Œ½€™‡«‡“ÍjăºßÄÙ©Ó±»—»Ù×ж̀Ê)èÛ8¤±»·‡‘×8癉kß [ïS‡Çÿ–©¼߈á áê9¥‡ÏÅÙ½ăˆŸ;ÙŒë*«ªĐµØå̉ ±»¯2ÍƠĂ»±» ÛăˆŸ߈›¾ëöĂÙß»û»ÅÁăÛ«‚ ½9¿ÅµØ“ÓÙ×ëöµ†ƒ¾‘¿œó¶ăˆŸửơèÅù×ÏÔù×Úª‚ +¼9ϲ¾‡9¡ÈơÔ­RçôĂÙƒ±¿ƒv̉̉ĂÙ㉓÷ôê¿›v¼å̉ ư“SÅØ§Ô%̃Å¡ÈáÛ‡ÚơÔÿÚɇ×¾‹Çđ» +ƒ½¶÷ơ±»«·3uU­>«‡“ÍjÏ›Ú߈߈ĂÙ¹ö«»åƠÍ|Ï̉§¹½€¿‰÷ˆ«ÔÚª‚ +¼9ơ‡“ȵܸ»צ߈ǺâÁ‚Ú‹É0ÅØŸÅăˆŸ;k×ÓéÓÑĂưÀåÁ³Ç»€ºÄ–ăơÛ½€ÁÉ̀ƒˆ½½“µÜ‡ŒßNù׿ºÎԩǸڙ‡ø×)ÙléºÓؽ³½ÿÚù¾±»éº÷Ú³ÅÖǼăˆŸ;kéÓ£ô½ôÓÅÙ×Ơ°»ÉóÁ㙉kß [ïS±»ưÀ߈ëö™‰kß [ïSĐÓÎÅ +㻉€ÑÓ¦Æö©Ó߈ÙÚ÷‡îƠÓàÛ«‚ ½9ÙÚ±»ăˆŸăˆŸ;ÀÛ©ÓùׯÈ÷Á±»£¼§Ôơê߈ù×߈Ǻï½ăà߈ÅÓ½ôÚÆ§Ô¯×ëöĂĂ›·Ô¹Á·¯ƒvׯƒ¡»Óº9¥‡ăˆŸ˜ơ߈™‰kß [ïSÖÂT›¾ƒ¾‘ÑÓÑÓáꕺ£»ëö‹ÇÁƯÓØÏźëđ¡ÁăÁ©Ú“Ơù׃v™‰kß [ïS߈¥<Û«‚ ½9ÙYå̉ ëöÅÓ—¶«»ƒöŸÅÙ½9¥‡›Ưùë­Öùד½¬¾߈“ƠĂ«»¯È™‡í—G·Ô÷‡çÚÙÚªÚ…ÔϼÛÀٽٽ©Ó™‰kß [ïS߈ǿÅ$̃ˆ³˜‰j̃ZîS£ÇÆÇÓƒˆù×ÏÔ›¶é™êùơ½ŒÿڵؘơçôëöÙÚÛÅŒº÷ÁÏÔƯºÅỒ¼†×ÀçĂº†Ú«d™‰kß [ïSÏÔÓÅ÷‡ửÍÓ™‰kß [ïS߈™‰kß [ïSÙ×ù×ÙÚ±”¯‰¯0ƒÚ—ÓïÁóÂÍÛ™‰kß [ïSÙ×·Å«‡“ÍjĂÇĂÈÁĂß½·¼Í7¾»ßÏÔăˆŸ;k©ÜºÙĂÚ×/Û«‚ ½9ϼ9¥‡߈ÿÚ‹Ç9¥‡ÏÅö©&ªÚƠ¯ÈËƯ9¥‡å̉ ơÔøê‹È0›¾ư‡±ù1·‡‘×8çåĂ9¥‡רỞ«ÚƠÚƒv÷ˆ«ÓéÓùׇŒ«‡“ÍjÚª‚ +¼9çÚï³2ÏÔÎ̉™‰kß [ïSëÚÄØ×ÓÚÄ̉™‰kß [ïSÛºíÁ߈ÓÆ‡Úơ꺋ܽԫ·3uUÿ¸ÚĂÙù•—Ó•—«ÔÄÓ +ơ¡Ô‰¿IÁ×Û«‚ ½9±»ä̉ç€ÏỖˆ“Èå¹á ɇăˆŸíơÔïƠ߈óÇóÛÚ³Ï̉º9¥‡Ë̉ÍƠ±¿ÛÄÓ“ÆÿÚ—º™‡ívÑĂƒÖĂù׎‰àµ‹ÓÔ™‰kß [ïSáỰÔóÇÏÔåºûÙ½±¿Ô]Ñ·­Ä÷‡ɹÿ¯¶±»߈¢ +í—Gù×å̉ “ƠĂÙÛÛ«‚ ½9·‡‘×8çÅàëöăˆŸ;ká½ñÖ©Ó±»±»«‡“ÍjƯ‰ùÛ¯È÷‡«‡“ÍjæÇ§ÓçØ—ä9¥‡ƒÖçÔ¡ư“¡È‹Ç¹̃±¿©ÓĂÙÉó8¤‡×ƒv́Á¿»ưÀ߈ơêŸ}¹̃ĐÓ½±»¹ÈÅôƒv¡Û«‚ ½9Á̉½ĂĂ ›­±àéMëö¹†«‡“ÍjÍÓèỡ»úĐỌ́ĂöÁ½ôăˆŸÛ«‚ ½9…»ÂÈ·‡‘×8çÿÂÑ߈Óí÷å5ÓµØö¿*ë§ô™‰kß [ïS›¶é–¶±»Ï̉ÏÅ¿‰‹Ç±»—Ú½‡ÛåÁ߈¿º₫ ®¶ ±»™ÓÀĂù¼‹ë­ÖưÀïÅ÷‡ù×›¶é¢X³ öỞÙŒë*«™‰kß [ïS׿8™‰kß [ïS™‡ëö™‡ÎÅÓä̉  Û«‚ ½9©Ơ‹ÛưÀ©‡¥2ßëMŸÈÜÀ½›‡í‡—»ñÓƒÁÄôé꫇“ÍjÓǾÆ™‰kß [ïSÿ×™‰kß [ïSç'ܺÓéÇØ±)ëÔƼù껈ÏÔ©Àùê­ÖÉƯƒÚ߈§Æ®¼ £ØçºơÛ±»Ù̉Çéê…đÓ»ŸƠ½ׯçÁÓ©‡¥2ßëM·Å÷‡œÁÑÓƒÔ©ÓÓÅôÚêưĂå̉ ÏÅơꙇùêöÁ«‡“ÍjĂ ¾—Œ«ÔÑÄëƠƯÓ ¶Åøê·ïûØÙÚ‰¿I¹à̃»úÏÔơÔ߈åô±»µaÂè¹ÚñÚ Á +¡Á÷ÁÙàöáˆÁ0qívĂ«‡“Íjëö‰¾ö¶™‰kß [ïSưÓ¥ÈÀÛ«‚ ½9¥Èù×§1÷ÁơĂ¾º߈—¶«)9¥‡åôÏíÚª‚ +¼9«‡“Íj˜êèä‡Ç¡hµØÏPÿ¯¶…¼ăơ™‰kß [ïSÏÔ߈½¾ù×¾₫®¶ôĂñ—¶±»ÍÄ߈“·̣¿́ÏÔºÅÀĂ¯ƠĂĂ ›­±àéM®Gø¹®‡§( ËûĂƠµØ%ù×ÇÖÓØƒÖù×÷ÁÏ̉µøÏ̉Û×ÍÄÙ½‚v…Ôºº«‡“Íj£äÛ«‚ ½9£‡›Û½ÁƒÖù×âˆ:©Ø¡ÈÀĂÙÚÛ«‚ ½9áêĐÄêᬙ‡Ë߈§ÔÏ̉‹ÈÑÄëÏÅöÁÑÓĂÙ™‰kß [ïSöµØ§Ô½í‡ß»ûùêϼµĂ“È¡«ăˆŸ;ĂÙçôù×Ú×ÏÔăˆŸ;ôĂÜÏÔ¡Û½Ô›¾™‰kß [ïSǼá牿I±»¹Ú¸£±»æº̣áê¾ĂÙÚËÇÛ×÷$ß»ûºÂæÇƒvÓ¾ƒvơèÅÿ€әĂ߈²(ÛÆÁȽ·‹§ÓÇØơĂ™‰kß [ïSëöºëöÏÔĂ»ĂÏÔ“Û‡ăˆŸ;k©û¿‰‹ÙĂƠËÓƒÖÙÚ—ŒÛ«‚ ½9äƠÍm—¶óÇ‚¾ÂÙĂÙº™‰kß [ïS±»À¯¼ÀĂÚÄ̉ƠﻦÔö¶…£­ăˆŸ™‰kß [ïSƒvơÔÛ«‚ ½9÷‡Û×đºØ÷Á¿)ƠÙ½—ˆÛ×Ǻ´ØÚDZ»Î̉߈§ÆÍÄϿ۫‚ ½9çºƠüر»ù×ÍÄ©¼ăˆŸ;ŸÈ¹Ú߈ÍÓ÷ÁÙ½çÀÆĂÁù×ÙÚœÁ +¿Ø—¶ÿ‰‡xª»¸Ú$Ù×Û×¾§¹ùׂ§Ó«ÚöÁÇÖÁ‡é/×:›ÚøêßÅ«·3uU8 ¤‡ ÖÜÅØÍÄĂÙ«»Ưº»Ø«‡“Íjëö›;âḈûÏÔ«Ô¡»—Ó‰ˆ¾óÂí꫇“ÍjỞùưóÓÏűùăˆŸÙ½ô°»ûÏÔ›êù׃½ƒĂ¤ˆ\0ơ$“ÆØëö³ÏÔñ Á «‡“Íjï½¹»ƒà¯ÛåĂù׿‰¡ÁơÔöÇÅĂÈƠµØ½ôăˆŸ;k³(Û«‚ ½9¿¾Ü¿‰µØơÔëöÏÔ¹ÚÇÖÁ˜‰j̃ZîS†ŒÇÚ÷Ú½ÆÓá ߈ßÁ›Úƒˆ¿˜‰j̃ZîS°»ÅÏÔ—Ó¿àÁ‡é/×:ưÁëö™ôƒ₫ÅØÍĂÉĂ™×»Û«‚ ½9«‡“Íj‘Ưß%ù׿̃Ù½Åô±»íÆ·‡‘×8ç߈ƯÓ ƒ½ÛÄÓ›vÓÅé‰ñ5ñ·©Ø©Ó˜ÓÍÓ…Ơའƒv›¾‹Ó­ǽ¹àôéívëöáîÏÔ» ·¦D Ù½óÂÛ×ËÇƠ¾GºĂÁă‘r¶©‡¥2ßëM¶ + +ăˆŸÍá ơê—¶ăˆŸ;ù×›¾¹ÚµØÄÓ߈Û×ÏÄëÔçÚêöÏÔëÚ‹Ù߈‡Ú’ơÍǵ™Ó½‚v…ö«‡“Íj¯¾åÁ¥Ä¶ơÔÿÁäñÛ«‚ ½9à Íå¸Çù×÷ÁÅÓØ߈ỞÍË)éÛ9¥Ăȓȕ׽ÏÅ„Ø +ÙŒë*«ÿÔ³Ü߈øê ƒvÿÚÅÄÏÔÅØÿ±»¿Åé‡ËÇ™‰kß [ïS‹Ç£Ø¿ôßÚÛ«‚ ½9×¾¢»“Û±»ÅØöÁÙÚº‰¿I˜ơö¿¹æÇµ†¡»ÏÅ ­ÔÑÓăˆŸưÆï»¶ÅƒvŸ}ÏÔׯĂ…Øù×ù×ưÀĂÙ¡·ÔÍÓ³ô£äÿÚ™‰kß [ïSáÛ¿ô ËûÙ½ĂÙ™‰kß [ïS‰¿Iö₫Çşփؘ‰j̃ZîSß„ù×ăàÏÄ·‡‘×8ç·ÔÙÚ‡x辮 +¦ÓĂư“߈߈™‰kß [ïS´̣¥àíÆ߈™‡¿Û«‚ ½9­vïô9¥‡éêÏÄ«‡“ÍjÍ̃ˆ¿‰‰Ô¹Ú»ù¾Ù»·ÅĂº¿˜‰j̃ZîSÚª‚ +¼9÷ϼÛßƯ°¿9¥‡ÏÔÔX©°»¥Æ§Ơ“—ŒđÁƠ×¾¿Øö߈ͪ߈ÿv½ÔÏÅöÚ9¥‡ÎÔ÷ÁÁ…Öï½ô Ëû†ä½ĂµØíë$÷‡Û«‚ ½9Ü©‡¥2ßëMêö“Ơ“ÆÏÄ‘¾…ÔÙÁÁå“Ơ™Ô¯ÓÇÖË¿ø¾§¾­Ä‡Ç½ôơÔ¿‰¡Ô¯Èëö¶ôÉ€¥ˆ]1›üƠ¥Æç̃“ƠÙ×Í(ø¿9¥‡ƒv߈çôß„±»«‡“Íjơê’ƠÇq±»±»Û«‚ ½9•¾ÍË)éÛ9¥£Ç£»½ñÓï‰Å¥ˆ]1§Ø‘Öëöƒˆ£Ø£Øÿ$ÏÔËÇ©‡¥2ßëMŃ+©ØỞƒˆ—»߈—Ó‹Ç«‡“Íjƒˆß»û¿‰ÅÔâÓØàçÑÓÛź(ÓØơ莪‡’̀jÅØ© ½ăˆŸ;µ~§ºÁƯ“Ơ»ÙÚçØÿ¯¶ûƠÿ¼«‡“ÍjÛ«‚ ½9íĂÙƠX…Û÷å5Óíº±»íØ÷ˆÅÏÔ™¦¹Ú»Úª‚ +¼9íơå̉ ÑøµØåÁ…¤•Ç×ïÿ¯¶Ó̉ÓÀÀĂëöÇ÷±ÔĂÙ÷Ùđ½ƒvƠô˜‰j̃ZîSÙŒë*«©ØÄ ¡çÚÙ½ëöƒÄÎÔ™Ô÷ˆʹñ̃×¹ÓÆ¥È¿åß%ÑÓÙÚÁs¡Áû߈Ù½ĂÙăơùêß»ûăˆŸ;kĂÙ¿»9¥‡÷Á«‡“Íjô±»߈ëö“È«‡“Íj·‹«Ô…ƠÏű»ÛÀÙÚÁ½ëöÏ̉ÓÓß¹Úü¦†öϼ̉̉…»ñÆăˆŸăˆŸ;ÜŸÈ«ÔÓ̉±»₫ +®¶ +»¯È9¥‡÷ÁÓÔ¡Û¨‡¤2€̃êLÍÇơê½ỞׯƯưÀ¨Ø±»›¶éÍĽ’ÇÛ«‚ ½9ơ$¹ÚÇÖ“‹«‡“ÍjëÖÇÖïƠ·ºÍ­·‡‘×8ç·Ó ¥0¡ÈÛ«‚ ½9ñÓù¿—¶ĂÙçÚöëö߈ÁË߈Ăù¿½¿»»Øÿ×Ç̉߈ëöÖÆÎÔ ƠăˆŸ;ơêÙƠÛ«‚ ½9ăˆŸĂÖ¹Úº—ˆ«‡“Íj킹ÚƠX³ƒÏ̉ĂƠ¿́ƒ»ÅØÇÍơêƒvÛˆăà·Øø¿÷‡ëöưÀëö¹Úñ»¼ß»û½9¥‡ü̉°»©Ç¿¾›¾ƒ¾‘¸ÚÑÓ·ÅÏÅ·‡‘×8çû§ÔöÁ¼Œ₫±»ơ껹ÚͪÇÖơ⽑ĂÙ•¼Ú ª ‚  + ¼9 Û«‚ ½9¯¾§ÓÁăŸĂÿ¹̀Ó¡Áăº‡À¿Å¯Ư Û× ¥¤ºơê«ÔÛ×úÙĂĂ ›­±àéMâ»”¾«‡“ÍjÙ½ăàĂȽ…Ơ߈ÿ¯¶£ä½€Ơùׯ» ÏÔñÓ±»—Ó·̣¿«‡“Íj™ÔñÖ·‡‘×8ç¸ÈăƯœĂ÷Áͼ£èÙÚ’ƠĂ߈ÅÔ™ëéåÅ»ƒ×ăˆŸ±»9¥‡ƒÖ÷ÁÛà™‰kß [ïSïÅÄÓ¶ëöÜÛÔƯâƒvÁƯ›¾̉´OÛ«‚ ½9ƯÛ«‚ ½9è·Ϻ¿‰Ë̉˱ƠÁ»Ø˜‰j̃ZîSḯăˆŸù×±»߈™‰kß [ïSÏÅ“¼›¶éÇ%Ă¼‡º½ñÚƯïŽÅÔÇĂ«»£äĂÙÓØÚÀ›v½ÇÖ½ï½Û«‚ ½9Û«‚ ½9«‡“Íjư¬ƒˆ‚¾8¤‡Öù×íÚ©Ç¥Æß»ûĂ¼ÑÄë߈ù꫇“ÍjÇÅ»nâˆ:߈±»¡Û‡Ú™Û·‡‘×8çÛ«‚ ½9˾ßÄÙăˆŸ;kÄÓ†ŒÁĂ߈ª‡’̀jχëöơÔù×÷Á‡ͼ¡ÈÙÓưĂÙßÁ¹ÚÁƯ™ëéå÷ơ¾ÚñÚÛ«‚ ½9ÏŽçôÎÔëö©ÇÑÅÿ¯¶ƒv•ÖÁ¹‘«‹È£ä›¶é¡Ô½ëö«‡“Íjº½ƒv›œÙÅëÿ¯¶›¶é߈¿‰ÏV߈Ở™‰kß [ïS‘ÚµØñÖ߈Á¹ͽĂÙ‰ÓÛ×߈óǽ€Û«‚ ½9ù×óÇå©­Øơ‡ï»ÙÙ‹ÜÏÔ₫ű»ÑÓ©‡¥2ßëMăˆŸ;Û‹ÜßÚÿ¯¶„ưÀÛ«‚ ½9ÅÔù×ÅÓÙY·‡‘×8çíÙÂăˆŸ´À߈¥ÛƠ±»ÏÔƒàăˆŸ;Íӳ߷ܱ»ÑÓ¡Ô߈íØçÚ麧Ƣä̀Ä(¹ÚßÄÙÍƠñÚßÄÙÛ«‚ ½9¿ô§Ô¡Áëö¹ÚÁƯÍĬÈăˆŸ;Ù½ÛÆ»Ø9¥‡ăˆŸ;k‹ÇÏ)ŒƠ‹Ç±»³ÈÏşţș‰kß [ïSÛ«‚ ½9ÍĂ’Ç˜êèäĐÓ‡ùà×Ä́v§ôáˆÁ0q∽€÷¾‡µØĂèÅØÏÅóÂË̉°½߈«»½ĂÏ|™‰kß [ïSửχ×¾߈߈­ÄơÔ±»¸àưÀĂÙá=ưÀ’ÈÁ‡é/×:ÍßÜ¡ÛÛ«‚ ½9ÑĂßÚ™Ô™‰kß [ïS“ù˜Á +ëöư“±»ù×ßÁÁ¼¿|³ÈáÛ°»±»ơê™ÓŸ}¢È ‹ÇüÁÊÇơºÅ ËûàˆơêzÁ¹ùå÷¶ÏÔ·Ô߈³ºó«»Ï¡¡Á¹Ú9¥‡8¤‡ƯơŒÙ߈µ†è¼±»™‡ƠÑÓ±»±»ˆÎÅ›×·Ô“½³ÈÛïĂ½€ÏÔ™ÁăˆŸ;çºÔX …Ơ©‡¥2ßëMƒvÛ«‚ ½9ÁƠưÀĐÄꙉkß [ïS̀ÓÙÚÅ…·‡‘×8çù×Û«‚ ½9…Œºơê¾ÍĂ8¤‡Ö¬¾Ѷí‡ù×Ç>ơê”Èú½Ô鷸׫·3uUăˆŸĂÙÙ½­¾÷Á˜êè䨸×߈Ï̉éÓÏ̉¹ÚÍөǽ·ä³È‡Ç±»’½ù×÷Á₫áê™ëéåÛÄÓ߈ƒv™‡×÷ˆ›½™Á™‰kß [ïSöÁëöëö‚v™‡½¼μÛ«‚ ½9ÚïªĐëơí—GÄ–Û«‚ ½9߈¾«ÔƒvÙƠƒv«·3uUƼÙÅëŸĂĐƯ™‡ÓÅ̃ôÛ׳Èù¾»‡¿‰ÇÜÅØóׯÈÉ̉ô߈é‰ñ5ñ·Ù½”ÈúÑØÙ×。«ÇèóÔù×ÙסÈỮÚº´—¡Ûº™‰kß [ïSÛ«‚ ½9÷Úë¼ñÓµßù×Ï̉·Å匿NÙÚí—G½Ï̉ÍË)éÛ9¥©‡¥2ßëM߈±»ÿÂ߈›¾™‰kß [ïSù×åÁ«»³ØÂƒv•Œ‡É²Â™‰kß [ïSͼ¡»óÇóÂÁÛ¿º–»ƒvŸÅ™‰kß [ïSö§ỖÄØ÷Ú¿ƒØÏļׯăˆŸ;«‡“ÍjÏÔƒv߈߈ơ‡¿ÎÔÛ«‚ ½9€ëưˆơê‹Ü«â›¶éµØĂÙ̃ÄØù×Ă½Û£Ç¡Ø÷‡ưÀ§Ơ¹Ú̃ÁÏÅ¡›¾Ç»߈Á¼ư“‰¿IäÁ +å̃ǽ¼¾–¶Æ·ÔÁ½«‡“ÍjßÄÙë×ÄØß»ûÚª‚ +¼9ÇØ×ƠñÚ¡ØÍË)éÛ9¥̃ˆ³È·‡‘×8çÚª‚ +¼99¥‡×ĂÙ܃vưÀ9¥‡ùׇŒ…ÓáÛÿÔăˆŸøêÛ«‚ ½9…Ơá ¸Ú©ÓóĂ߈ƒvÙÚ“Ù̉¾±»±¿Y9¥‡±»ơêÀĂë™HÏÔ¹½±¿í‡ËÓƒv±»߈8¤‡Öﻫ»¡Ô§ÆÓ‡‡ñ5ù×íØ¡Ơă‰÷Á÷ÁơÔñÁׇ½7«ÔÏÅ‹ÇÛ«‚ ½9çØÅÓ½€߈®Gø߈œ·̉ ¤0µØ§Óª»ùêưÀ߈›¡¿ßͼăˆŸ;ó§ôưÀÏ̉ù×ÙÅë·‡‘×8ç¯G‹ø±¿•ÖÏÔ¼)ÅØ•ø«ÑDZȼ©¼ÓØÙ½ÛÀ‡Ú¯¼±»™‡½±º™‡Û«‚ ½9› íqơèÅÛ«‚ ½9߈ñÓ¡Û±»·Ó ¥0Á‡é/×:ƒØ“Ơù×ö½¹ÚĂÙ‚văˆŸ;k¦ØÛ×È×Üçôơêơêщ—¶߈¥‰ÍL…©Ó÷Ô™ƯçÚ›¶éÏ߈ñÓ®GøñÊ¡ÁëöÍĂ«‡“Íj¿‰ÑÄëëö©Óß„ăˆŸÛ«‚ ½9÷ˆ«‡“Íj÷ÁƼĂ¹Ú°»áêĂÙƠÛºÅͼŸ»«‡“ÍjóÇÛ×±́ù×±»ÛƯÍÓÇÖ½ÅØ×¿8ÏÔÏÔßÄÙ¡Ôó‡ñ5™Øƒ³©ºÙ½·‡‘×8çï½ÙÂ÷ˆ½€ÖØ ÛͼĂÙÅàƒĂăĂ3̀Ê)èÛ8¤8¤‡ÖŸß×¼ô™‰kß [ïSßÄÙăˆŸ8¤‡×™Ó߈Á|»Ư–ÓÏÔ·Ô½ÏÔ·‡º½¾‡ƒv£ÇÛ׃v¿́ù×±»߈¹à½†ÚƒÖË®½Ô¶½Û×ÓØ½ơêƒÙ½éŒß»ûÅØ¹Ú±½ÀƯ«ÔÛÄӓȯG‹øÑÓ«‡“Íj½ŒÿÚÇÖ«»°»«‡“Íj¹Ú“Èøê çÚÛ%·‡‘×8燌ó½ßÚÛÄÓÿ×çZ½ô™‰kß [ïS½Ôă¿Üëö–Ó±ÁÓÆ¿‰ÏÄéêµ.¥Ù¥â8¤‡«‡“Íjƒv‰y«Ô·‡‘×8烈°»Û«‚ ½9߈‹ÇƠ½Ô߈ÙÚùׯ¼щ›¾Û«‚ ½9ø¿Ú×ƠºmÓÆÙÚ«»ĂºÛ«‚ ½9ƯÓ ÍÇ׿8–ÓûÍ™‰kß [ïS¢Çù×ÆØ¾¹Ú±»¸à±»Ă›¶é™‰kß [ïSùיؓùׯœ‰¾ÌÓñ̃ˆÓØÇÅÛ«‚ ½9̃ˆÅعÚù׃3­ÄöËÉ9½ºăơñÓăˆŸ;‡ºë烈÷ˆ¿Ǻ½Û«‚ ½9óÇ£X¶ÔûƠ³½¹Ú¯ƒßͯ¥'=U#QK¯Â“Ơ½³ƠËÉ9½‡Â™‰kß [ïS“›¡ù×Å»ÿ§ÀưÀ潭ĹóŸúÁÚăÏÔ…n½€¹ÚçÀ­ưÀÛ«‚ ½9ưÀ߈ÂÏÔ×ƠÅÔ™‰kß [ïSƠX½Üù×ï½Á°»Ï̉›Û±»©ØÛ«‚ ½9«Ôùט‰ j ̃    Z îS «‡“ÍjÏÔ©¼‡ŒơÔñڱߋÇĂÙÙ½¥ˆ]1‡já=»&í$Ù½ƒ߈÷å5ÓÁ̉ÁƯ«‡“ÍjñÖÿ¯¶í—G¿»º±»«ÓƠ‡ÛÙ×÷$ÙŒë*«9¥‡‰¾ÓÅơê™ÔƠáÛ×Ï̉ØÅêϼ“Èñ‡ù×ùêăˆŸ;߈·‡‘×8癉kß [ïS‡Ç¾çÚ•öÔ7ÇĂ¡»•¾ö‰º“Æ·‡‘×8çƒv•Œêö߈Û«‚ ½9¡È¶  ¡%¹Úăơɇ¾ÔÛâĂ–¿º‹Ü¨º÷Á©ØÙ½ăàÛ«‚ ½99¥‡£Ư°»µØïÚ±»Ù½—¾߈ߢÏÔ¶º›ÚĂô½÷Ù«‡“Íj߈ÿ^¹ÚÁ‡é/×:Å»«‡“Íj‘ÖåĂÏÔăˆŸ;…ô߈ß»û¯¼™×¿‰ß»ûÂÙ‡Ú¥ˆ]1µÀ½…€­:ùêøô”½ĂĂ ›­±àéMÛÚ§ÔëöÎ̉ÏÅׯ–ôË¿¡«ăˆŸ;—¶˜̣Ÿ\ÛÛÏÄ­Ä´†ûØûƠ§¹å̉ ÓÅô™ß„øơ¡ÁÁ½‡ßÍÓÛ«‚ ½9ëL½ơԵؽ߈»ĐđÓù×¾¯ÈăˆŸ;¹ÚŒ¾«Ú߈ơêØ×®ÈÏÔÑëưÀ¾ß̣ê«·3uU³Ơù׋Óö$˜êèäëöÛ»÷ß»û›Ă¼߈Û«‚ ½9ƒ½Ư+ï¯Ù×ï»àˆÀ0pÙÚĂºÏÄÍB¤Ù߈§½­ÖÙƯÎÔ¥ˆ]1ç}­Ô¯¾ÇÖ­Ö»ÑÓéÓÏÔŸ¾öÔ«·3uU‘Ö£»Ẳ™‰kß [ïSĂkô׿8ÿ¯¶·Ôù¿Û«‚ ½9µa÷ÁĂ©‡¥2ßëM߈9¥‡›¶éĂνù׫»ÏÔÅÇ-µØÓ‡ŸÅÏÔĂĂÑĂÙƠ ߈…¡ψ“ƠĂº«»ôØ«»ù×ÉÏÔÛÄÓ߈‘ÆâˆÇÖĂôưÀĂºÂÉyáê×*‡9ơÔ°¿ ±»Ûוԫ‡“Íj•Èû›9¥‡ÏÔªÛ¿ÙÚ±»¡“™‰kß [ïS‹Ç•܇ºöÁ™‡Á׃à…öׯ·‡‘×8çĂäçÛ×—¶¡Ôµ‰ÑØöÏÅ£Øï»±»¡Èź¶Ù½‡º¶-›#É@ÏÅÛ«‚ ½9½ËÉ9ƒˆ߈³íƒv±»™‰kß [ïS‡Œª¶2tTËÛÀĂÈăàÉ̉9¥‡߈¾ƼƒvëöÏÔ·ÅỔƯÓ Ÿ}ăˆŸ;Û×Û«‚ ½9«Óͱ)щ߈÷Á¼ƒàÛÄӱ图߈ºƠX±»Ó´ù×÷Á™‰kß [ïS¼Á ³È‚v±»9¥‡ÅÄơÔăˆŸ;íê›Áœøù×ù×¾ơèŋө±»“Ơ×Ă«‡“Íj«‡“ÍjÙÅ뛾±»âà߈±»ù×ár•×ïÔĂƠËlù×ùêçôƒ½¿(·£­ÖÛ«‚ ½9Ù½¡È‘Ó÷Á¥ Á½º±»©ăˆŸé‘&¡È½Å'«‡“ÍjÙÚ…àÛÆ̉ºÑÓÏÔ9¥‡÷Ú½ôµƯÿà¥ÆË̉»¼‘›¶éÁ|ÖĂÅô¥ˆ]1ơêé´ív±»ơêÓ̃ˆÛ«‚ ½9™Ó±»Ơä̉9¥‡ÿ–ăˆŸ;æƠƠœ¿ö÷ÁÏÔñ»ÏÔ“È©ÓÁ̉ƒÁ½½€ÁƯ÷‹©¿8 ¤‡ Ç̉Ÿ\±»™‰kß [ïSÿÚÛ«‚ ½9ĂƠ‘ÆöĂÙÏŇŒ«‡“ÍjưÀ«ÔƒØùêëöÛ«‚ ½9…n½ÈÏŹ»¢ÇƯơºù×µØÙÚù×ëöÈ™‰kß [ïS9¥‡×Û«‚ ½9±»÷‡óÇÏÔ÷ÚÁÛí‰Ûӷܽ­½ăˆŸ·ÔăˆŸ;µa¹Ú‚ØÓØîÀµÈƯăà9¥‡ăÖá¾ăàØƯ‰°»ù׉¿IăˆŸ;œ‰¾IÏ̉ù×ÙÜ«‡“ÍjÏÄ™‰kß [ïS߈øĂº߈ăˆŸ;kÏÔĂå̉ ñ×Ï̉ÏÅÑ·ÏÄÙÜ»$ÿ’ÏÔ—¶ƒvÅ–ÙƯëöىƹڱ»ê$̣Ä»ØÑÓ˜‰j̃ZîSå̉ «‡“Íjí„ßÚ¹ÚÛ«‚ ½9ÏÔ¨Ơ›¹́Á™‰kß [ïS·‡‘×8ç³’½Ôơ@ÅØ¡ÁơêĐÓơÔå̉ ·‰9¥‡ê<˜HâăˆŸ;éÓ‚v盾§ƒ˜Á ߈ăˆŸ’ƠÛºưóѶÙ̉™‰kß [ïSơèÅÅÖơêíÖׯ÷Ù±½˜‰j̃ZîS߈Á̉щå̉ ÿ§ñÖéË“ù‰ùל‡»ÁÍÄă»›·ÔñÚÂỤ̀“ +çÚÿ0ăˆŸ;Ï̉шÛÄÓÁñ»ëöÅëÔÛ«‚ ½9«»±»÷‡ƒàĂ÷Ú½Ô†“ăơÍÓ¹Ú«ÔÇÖñÚ‹ÛÙ½ăˆŸ™‰kß [ïS±»Å½ăơ÷ع̀Ê)èÛ8¤·… ëöÍÓÏ̉“Æ…ÖéºͼÏÔ½€ƒˆ›»רɇ—¶½ĂºĂù×ñÓ«‡“Íj‡ŒÑÓ߈߈×Ơ™‰kß [ïSù×Ñàûصر»ÍÓ¡ÁÏÔăˆŸ;˹™‰kß [ïS‹ëë}µØ߈›¹×$ỞùæÄÓơêöÁñÖ˜‰j̃ZîSÓºÇ%»ØͼÎÔîƒLá ăêÄô‡x©‡ÇÅÛÄÓ߈×¾Û«‚ ½9ÅÑÄë¹ÚµØ†äưÀñÚ߈ñĂµØ‡Œ¹½ƒvñ‡ºº‡xù×ăˆŸ×ÓơêÙ½˜‰j̃ZîSÅ—Œ́v¡́ÅØÚ×±»¬Ö(·¬ùxưˆÇÖ»ĂƯº¤Øí—GÙ§Ơ‹vµØ±»߈¡9ƒˆ¿‹Ó»Å·̣½§×€¾ăˆŸỞÏÔ‹Ç·‡‘×8çw±»ÉÅăˆŸƠÑĂÈ‚¼½§ÆµÈ߈Ù½«Ô“ƹڹÚ×ÂƠˆØÅê¼Èɇ«Ô±»«ÔƠṃÄ™ëéåëö›¾ßÁ±»“¹ƯN½8¤‡÷Á°¿ ™‰kß [ïSÙŒë*««‡“Íj±¿Ü±»«âµ†éê¥Øÿ¯¶ÁÆĂÖÆ€º…bÏÔï½™ëéå߈«‡“ÍjÏ̉‰¿IÙÅëÙÚ×¾ËÜٰȪ¨ ±»߈ÅÔÂƠÿÂñó™‰kß [ïS½¾‡¼߈ׯèê‹ÇăˆŸ;÷çôçÚñÚ…Ûï½›·Ô©¼³ºó¨¼¹ÚûI€%ù×ơê°»ëÚºĂÙ ÛơĬ¼¼×ÜÏÔơù×ëÔ†Œ>>>ëöơÔ°»¥È±»Ñæµ,Ô á •Œù×»&Ơé]Ô©Ó߈½ª»‹ÜñÓ·Ôƒv«Ô™‰kß [ïSµ†°»8¤‡ÖöÁ ˹߈ÍÓ›¾߈©¼«‡“ÍjưÀŸâ–»»ˆ‹Çơê߈¿́ăà™Áó¶߈¿Ç̉ơèÅÛ×™ ẳç©ÇẳÂÑÄëƠœÜÛ«‚ ½9ưÀëÚëöá=÷ÁÿÚ¥Æ߈ơĂÏÔß»ûđÇŸ}Ûº‹ÓÓÆ·Ôï½ÅôưÀÏÔÄÄ߈Ù½ÔXù×Ç»¡ÈÓÔÛ«‚ ½9‹Ç›¾™‰kß [ïS¨À̀ľﻹÚÿÚ£ăˆŸ;äƠ©‡¥2ßëMá ‡¹Ø«·3uUÛ«‚ ½9ï½›Ă›ÛÏÔ™‡î»âàÅØ¶è÷Á½Ñ«‡“Íj«‡“Íjơ$ÓºÑÓÛ«‚ ½9Å×ÅØĂ÷Á±¿­ÔµØ©Çù×9¥‡×ÏÔ“½ë½€çÚëöù×ÏÔëöÁƯù×­ÖÓØé‰ñ5ñ·Û×·¼Í7ăˆŸ;éÚïi›¾̃ˆ +‚“º™‰kß [ïS™ØÏňÔÚ­Ø›±Îű»̀B™‰kß [ïSƯơø×ĂÙ°»‹ùÓºô§ÓÙχ±»±»ơ꛾ëö›¶é¯ỠÁƒvù×߈¾§½–̣ßÚäÁ‚ØǼ¿ºÑÓ¥ «‡“Íj߈щ̉Å«‡“ÍjÛ«‚ ½9çƯù×¾‘±ù×ÇÓ˜‰j̃ZîS‡ŒÔù×Û«‚ ½9±»ÛǃˆĂÁÓ«ÔĂ—¶®Gø©À™‰kß [ïS߈ù×Û×ÎÔ™‰kß [ïS©‡¥2ßëM™ôóĂÅØ—¶ƯË÷½§ÔǽăˆŸăÁÛÀ½±»ơǸÓ·¼Í7ù×ĐÄêÏÔÁƯưÀûÓØ×áê§ôíÆ̃ŒÚ,ëÆơl±»—ˆŸÖé3û«ÔÏÔ™‰kß [ïSÏ̉ï³2ÙÚùêÏʇäô‹ÇïÚá=ׯívÿ§ăơƠÁñÖ‡Œùë™×ÓÁ°»¾¹ĂÙ¡»±»ûÓŸ}‡Œ—Óù×¾ßÁñù×9¥‡Á˱»º¡Ôù×¹Úß»ûăˆŸÚÀ™‰kß [ïSửĂ©‡¥2ßëMÿ¯¶ÏÅëöư“×ĂưÀº©‡¥2ßëM9¥‡Ù×8¤‡×Ù×Ûº³ºóÅÔƠ€º½l­Â™‰kß [ïSơễˆ©‡¥2ßëM˜ơëØ·‡‘×8ç±»́v9¥‡Óº¥Ó™‰kß [ïS÷ÁƒרËÉ9˹¨È ™‰kß [ïS—ˆ߈‰ÛÏÔ½Ă뇓ȇÇÉĂơÔù×Ơ­vçڋǘêèäù×ñÖ“ÈÚÂù×ëÓŸ}Á½­¹ÚŸàµÈƒ¡ÔÓØç̉ÛăˆŸ;ÁÙ½½ôăˆŸ;™‰kß [ïS¹ÚåĂñÚŸ\¬Ä5©ÀăˆŸăˆŸ;kÓԷŵ×À ‹ÇÍBÁ̉½ëöĐËÇ»üù׃ưÀù×Ϲăơ©Ç«‡“Íj±»ưIĂÙß„ÙNá ¹Úº§Æ߈½Ôß»û»ÁŹڕŒÇ»µØç4ù×ɇ£Çψ»~÷Á€Ơö߈ッעäÏÔ—¶ÏÔùæÖÆ¿‰ƒà›¾ÁÅôÏÔ¡Û׿8ÓÅï»ÿÚÓØÏÔăˆŸ³̣ơêÛ«‚ ½9ñÇüÀ® ô×2ÅØ±»áÓ¡È™‰kß [ïSÊ% +“ÇØ×™ÓÅÔĂÙ½ơéÓ±»ÑØívÚÄ̉«‡“ÍjµaÙ½ª‡’̀j«È¯Èí—Góԯȫ»¥Æ•%ܱ»±kË̉ưÀ½éêßÄÙÓÆÍÁÏÔº÷Œ§¹ƒv£äçÚ9¥‡“ƠâƠräŒ ûív›¾ĂÙ÷‡‡Ú½Á̉߈½Ø±»™‰kß [ïSÛ«‚ ½9˜ĂÓÔ߈¨¼ÖÆÙ½‡¿µaăˆŸ±»Ø È߈ÅÓ¿º¸ÚƠ߈ùêù¿ăˆŸÓ¾ßÄÙăàù×¾©ëÚÏÔơvù׮Ƙ‰j̃ZîSă»¯lÅ̀Ÿ}Ư Û«‚ ½9÷ÁßÚ‡¿ÍBﻪ ¨ƒº5ÙÚÅÔËǽ¾ívͪI«Ñé‰ñ5ñ·—ºǺËÓñÓĂÙ±»ÛÀ߈¬ÄÛ«‚ ½9©ºÓÓ±½ưÀÏÔ«‡“Íj£ä±»ÏÅÓØß»ûøêÆĂ ߈ùׂƒØ߈ä߈«‡“Íj̀¬H…×ƠÅ·‡‘×8ç¹¾ï»ÿ'ƯºçÚ³¾›¾öÛ«‚ ½9ÏÅëùÙ½í—GÁƯ¢ä‹ÇßçëöÛ«‚ ½9Ă ½½Û«‚ ½9 ÁäôĂΛ¾…ô\ĂÙ“¹ƯN›¶éĂ«‡“Íjä̉  ‹Ç…ÛÂÙ¼ốv¹Ú¹!ËÇù×ù×Ûǽ­ëö‰Ûƒv¥‹·Ư÷¶ù×£ÇÑÓ«‡“ÍjíÛ˲Á‡é/×:ƒˆ™‰kß [ïSƒˆÖ¾ÅàÇÓô˜‰j̃ZîŚÁÏÔ߈ͼŒƠß»ûÍË)éÛ9¥…ÖÿÚơĂ È³ºóƒˆ–¿ưÀ™Ô‡ŒĂ談“ÍjÛ«‚ ½9¯G‹øÛ×ù¿ÓÁƇÁ¡Ç׿8…Œ߈™‰kß [ïSÏÅçÚ…ÔÓºêö¹¼ưÀ¿‰ÚÀ½Á̉©ˆ¯ÈßÁ©Óù×ưÀ§Ô™ëé奈]1ÛÀÛ«‚ ½9¥‰ÍL…ÁÜ÷¶“¼Ă‹Ç½ëöơêă»½ÙÓ߈±»[ơÔ8¤‡×½ÈĂÙÛפÓ߈“ƠóÁ³œ̃ơ·¼Í7ơêĂºëÅù×Ôơ7ÁƯ™Ô÷ÁñÁ÷Á«‡“Íj¶ù×Ö™‡…́Û«‚ ½99¥‡Î̉щµØ©À·‡‘×8çỞ½vÓØùבֱ»9¥‡ÅíĂºÏÅχÏÔ÷ÁÛ«‚ ½9£ä©ØáêÏÔ‰¿IµØÑöÔïiăˆŸ;k‹Üîcù×¹ăˆŸ—¶˜‰ +j +̃ + + + +Z +îS +ÏÔ¿‰±»߈Ú×åĂ÷‡ë§¡ï‚¾ív…ô°»ÏÅé×ù×˵†ù×½Á—¶ÉÖ§Ô±Ô¡Á—ÁÛ«‚ ½9î»ׯÏ̉½Úº‹ÇÏÅ™‰kß [ïS›¾©ØßÅưÀƒv¯àá°̀Әס¼ưÀèôP·ÔÅ–™‰kß [ïSÏÔá «‡“Íj°»߈Ă9¥‡×ÛêçÚ«‡“Íj°»ÅéĂÙ§ØƠÁû(ׯ÷Á«‡“Íjêö/±̉½߈™‰kß [ïSóÔÏÅÖØà½÷Á‹uăˆŸù×ơÔ…ØƯ­óûà»Ă‹Çº‹Ç½€±»Û«‚ ½9™‰kß [ïS«‡“ÍjáƠÏÅ9¥‡×ÂÙÙÚƒØÍƠăˆŸ±»Ơ—~ăˆŸ½Û«‚ ½9ơÔƒ™Áó½ôöÁ±¿ă½·öçڗتÈ5߈ƠXăˆŸ%›Ú…ôíθ½ËÖïƠƠ÷ÁĂÙÚÀôꬶ۫‚ ½9ºØÛ«‚ ½9æƠ‹Ç°»ÎÙÓñÖåÁ‡ºỞÍË)éÛ9¥«Ñκ½¡Ôȶ›¶é÷$Û«‚ ½9 Ëû̉™‰kß [ïSÙ̉åô¹€ÿ¯¶9¥‡Æÿ¯¶¶ÓÁ»æÑÓ‹°¹àÛ«‚ ½9ùד‰‘ÆêöÅÓ߈›Û¤%ºƠ†ŒăˆŸœĂ ëö™Ôơ꽣ر»ƒ‹²Ø­ô»»™×ï³2ăˆŸ;׿8¸Ú/·ÅǺ§Àóۺ匿Nâˆ:µ‰·Ôÿơ߈ÏÔá𫇓ÍjÙÚỬ9¥‡³¾¹µÀăàÏÔó¹ÚĂ¹߈³ºóÑÓùêÓ±»ƒvù×÷ÙŸ}§Ó•Ö°»£ØººÿÛÁƯ½Ô«‡“Íj©ÓæôơÔ¾äĂ«ÔÍ<ÿ¯¶ĂÙ»ô°»Ѷ“ǰ»óԙӜԷºùĐÙÚ߈±»áÛóÔéÓÿ¯¶¾ÓØ›¾ĂȫԻحÄÙÚ‡ŒÏÔY“ÈÁ¹ÄôÅÔƠÄÏÔ°‡ÇåĂÛט‰j̃ZîSơêôÿ¯¶ÏÔ÷ÁÙÚ·‡‘×8ç9¥‡§Ôß»û§Ø³ÚỞ±Âéºív«·3uU“¹ƯN߈•Œ¹Ú©Ø™‰kß [ïSÏÔ«‡“ÍjßÖÛ×îDÏ)źƯéåơ Û«‡“ÍjăˆŸ‚Ô‡Y½÷‡½·Å¹Ú¶Ü̃ˆ ‡ª‡’̀jưÀëöáêù×½€ϼÏ̉¡Ó¡»Á̉ù×ơ꛾³ºóôú›¶é­ÔËÓÏÅ«‡“ÍjưĂÇ»ÏÔưÀªdăˆŸù×߈ïÁ›¶é·‡‘×8ç«ÔơÔøơ±»ívƒvƒ×ÎÔÙ×ÁƯÂơ»ØÇÓÛ«‚ ½9ÿÚ‡ù×Ă‚™‰kß [ïSï³2Á½Û߈³¹ºĂÙ¡ÙÅ»±»À¼ +öÔÛ«‚ ½9ÙÚ«»Ž»Ă·̣ÍăÁơꙉkß [ïSëö›¶é߈ËÔơêàÁíÖ·Ô÷ÁÉÏĂôÂ÷‡£đăˆŸ;k“¹ƯNÙ×ëöàÀÜ×$ó”𑷇‘×8竇“Íj¯ÈÄӵ؃v ÈíÆ™‰kß [ïS×$Ù½÷ˆÅÔ©¼Û«‚ ½9ùוÇçôµØëöÁîÁ̉ƒÖÊÛ«‚ ½9µ†ˆÑÄëù×ÙÅë˱Û«‚ ½9ÁĂÛ«‚ ½9ÏÅŸ£ƯưÀăơ€º±»ÏÔûÙ·ÅơèÅ߈§é߈§ÓçÚ¿ßĂÙÍÄ¥ˆ]1«‡“Íjï»Áí°«‡“Íj£ÇÑĂº½¥ÆƯÓ ŸÖáƠưÀïÚăơÙŒë*«ÍÓÏÔÓÅǼ߈Û«‚ ½9…Ơ·‡‘×8çÏÅÛÀ«·3uU‹ÜØÜ­Äå̉ ëÔǼù×€Ơº©Ø‡ºóÂÖÆ¹Ú» ׇ‡ư2߈ È«Ôíê·¼Í7ƒvƒ×Ù̉µØâˆ:kă»­îׯ¹Ú±¿רßÄÙÉ߈ßÄÙ±»ưÀ—تÛÔßÄÙ¼ôˆ™ÓÏÔ¹ÈÇÖÏŹکؓ¹ƯN¥Á±½¥́™‰kß [ïSÙÚƠĂÙÚ́§©Ü“ƯÜăˆŸ;©‡¥2ßëM߈ؽÙÚ±»߈™‰kß [ïSÇ߈ơêׯßÁù×÷‡ Ëû¥ˆ]1ï»—»÷Ạ́ưÀùêÁ¹½…–õØË ĂƠ¹Ú±»­Ä«‡“ÍjǃívơèŲ¾Ơëö§ºéÚ±»½€Û«‚ ½9ø×ä̉  ëöỞ˹ÍÇ™‰kß [ïS™Ó̀ª¶ÜƒØ˜‰j̃ZîS™¶µa«‡“ÍjĂÙÀ…ǵØ₫®¶ơÄï»™‰kß [ïSÁ¼½€ư‡±ù1™×­Ä“ƠïiÛ«‚ ½9íÁ¯ÈăˆŸ;k—ØÓØû)©ê™‡º½›¶éù×Ú×߈ÁƯ¶ù×Á×9¥‡̀Ó¯‰¯0ÿ×ÿ¯¶ÅØ₫®¶‡x¹ø×³(ơêÍÓơêăˆŸ;¼€ñ¯ÑÓ«‡“Íj‰¿I¶Å +´† +ÛÀưÀÏÔ¯¾‡ºßƯ™‡ß»ûÏÅ«‡“Íjù×µÓºª¶2tTÛ«‚ ½9÷ÅÉ•½ĂơêơÔ—¶™‡ç'ơêÛ«‚ ½9ͼÏÔñù×ÿ¯¶±̉ÅØăơ“¹ƯNëö©‡¥2ßëM«‡“ÍjË’Ư‰©©ø¿™‰kß [ïS«‡“Íj•%×¼ơà™‰kß [ïSÁÁëÚù¿ĂÙá ”½ÏÔ·¼Í7©ºƠ™Ô©ÓƒÏ̉ƒvå̉ ›¶éí—«‡“Íjñ׺²Âœ²ơèÀƯшµØĂ×Üơ‡íÖù×ăˆŸ;ăˆŸ;kưÀùꕌ™‰kß [ïS—¶½÷ÁÁ³Ø±ăÛ×·ÅƯ‰“Æ–¾ÑĂĂ¼«ÔÏÔƒµ¥µăˆŸ”Û«‚ ½9ËƠóÔÉĂëÓ÷‡£Çăà¥ÛÛ«‚ ½9ŸÖñ ź×Ă×̉ÅÁ®ëöé¾·ỖŒÚ,ăÁÏ¿ù¾ƒˆÏÅå̉ ù×åÁăˆŸ;½߈÷‡ÑÄë·Ô¾ßăˆŸơêûƠÏÔơêÖ¼™›ùêíÆĂÙÙÚÙÚ•½à3̣;{§̀¦K{ͰÈÇÖ½»ưÀïÅ£ØåĂƯÀăˆŸ;˜êèäÍË)éÛ9¥Ï̉“ÈËŒơÔ߈Á¼߈9¥‡‡»ñÚĂív¼Øˆ!‡x±»£‚ÿÚ߈Û«‚ ½9ñíÈÛ«‚ ½9ù×ÙÜÙ½ÿ§½—Œ₫®¶½Ă£ô½ÙÚÛ«‚ ½9߈½Ô¥ˆ]1ù¾Ÿ}ëöÇ̉™‰kß [ïS±»Ơáê‹Û߈™‰kß [ïS¤ˆ\0Û«‚ ½9¿Ø§¹ñÚ·ÜÏÅëớv9¥‡ÍË)éÛ9¥Úª‚ +¼9±»±»ưÀƠ÷ˆ¶ù×ÏÔ±»ñŒ¼Ø˽«‡“Íj€Û«‚ ½9ĐØ̀ ¬H ÏÄ‚v™ÔÑ`±»߈̃ˆâÂ3 ñíÈÛ׿'ù×ơÔ÷‡¾ƒvÏÅƠ×ß»ûµØ÷Á‰¿IơÔ™Á‹É0—¶̉̉™‰kß [ïSǹé‰ñ5ñ·™Ó¿ºÉ̉ÁĂ™‰kß [ïS¿‰Ù½Ž­Ä‰ØÚׂvöÔ&Û«‚ ½9óÓË¿‚vÏÅ—Ø«‡“Íj¡˜‰j̃ZîSɱ»Ăٯȱ»©Çáêëöëö߈ÛºçÚ“ÛÙ½›Û¨¼·Üۺ຿(™ëéåg”·ăˆŸø×ß»û½¾‡£ä§ÓôÄĂ¼›vơêö©Ó‰øψ¡Ư‘ƽ©ÇăˆŸ;k«‡“ÍjÖÚ—̃©€±»ËǧÔùׇŒŽƯº‡$‹ÈÓµơÔ¹Ú™‡×¿8ĂÙ½ĂÙ½ªÚlăº™ëéåÀ‡€è/Ö:«‡“ÍjçÚ8¤‡Ö•½ù×—¶Ù½߈ÔÍÄ¿º‹Ü¡ÈÇĂ§Æ§Ô™ëéå‡x£ ÛÆ˜‰j̃ZîSívÏĉÛƯ‰«»Ëǽƒ±Ô‹Ü߈³ ½ôÍñ¿ëöá§ÇĂĂÙĐÓ§Ó©ÓÏı¿÷Á—ùñÚëöâÅßù×ơèÅ‹ÈăÁ̃Áàö©ØÙ×¹Ú«Ô½‹Óùê¥Ø™Óƒv9¥‡ÙŒë*«¡Á“Æ˹ù×¹Ú‹É0÷‡‡Ç­½¼ĂĂø×´È‹èÆĂó×ÏÔ¾ß ¢X‘ÖÛׯ໋¹£#¹Ú™‰kß [ïSăˆŸÏÔÛ«‚ ½9 ƠîϺÓÅù×ËƠ“«‡“ÍjÏÅ­Ä×ÓßÁ«‡“ÍjÿÚ“½‡ÏÔ׿8­ÇăˆŸ§½­Ä©‡¥2ßëMÿÚ«‡“ÍjăˆŸ;kç̃µƠƠÚ­ØñÓÅØ«‡“Íj¹Úï½é‡Ç›¾…»ÏÅĂº¢äßÚ“Ơ™‡ÿ¯¶Ơëö—Ó×¾‡Œ¯ÈóÇ´ÈƠÅ­Ö“Ơ˜‰j̃ZîSƒvăˆŸ;¹Ú™‰kß [ïS—¾ËÉ9«ÔÏÄù׋Ç÷ÁÏÔ½ăˆŸ«‡“ÍjÇÖơÔ÷ÁâḈߌ‚v§Ô’ÆÇ̣₫Ûùëƒ×ëöẠ̊Á•¡ȭÔƠîÓ‚£ÈÙÚµ†Ơ ׯ½™‰kß [ïSơlöå̉ ©ÜÓØ̉ÛºëöÛ«‚ ½9ư“ƒ¾‘«Ô½;ÏÔăˆŸ;ÙàéÓ¹Úơ꿉öĂº¥ˆ]1ßÄÙ«‡“ÍjƯºÏÔщôÙ½ÂÙù׃ˆÙŒë*«ëö˜‰j̃ZîSé‡߈½ÈÇ%‰Û›¡›¾Û«‚ ½9…öÁƯéºơêù׫Խ«ÔŸ}‹œ¹ÚÓ¾±Ë±»˜êèäÿÚ‚v«÷‡¹Úëö£ä™ëéå‡'߈ù×›Ú“¹ƯN‹ÇăàѾ­!¿‰º«‡“Íjô™×öÁ +̃»ú9¥‡щøê‹₫™»Áé ÏÔ«»ǺׯÇÓ‡÷ÔÁƯ‹ëÍÓ½ôÙ½©ÓñÆØ×⺋ӱ»Ç»ơêÖØĂÙËÇÉvñÖåĂÑÄëÛÚ±»½%®GøɇÀ‡€è/Ö:çÚÏÅÙÚÖØ·‡‘×8çÏ̉©ˆù×ψ‡Úöù×Ư‰™‰kß [ïSŒ¾Æ³ÂëöÛÚÈ ߈÷Á‡Œ™‰kß [ïSéÓ߈Ï̉¹—ÎƠî§ô߈™‰kß [ïS“ƠƒÖ«ÔÏÅö̀Ê)èÛ8¤Û«‚ ½9ăˆŸ™‰kß [ïS‡ºÇÖº̃ˆÙÚñÆùÜéê±»Ùׯ§Ó¾ËÓơê“È߈«‡“ÍjĂº³Û«‚ ½9ơêªÜăˆŸ;k«‡“Íjëö›¡Û«‚ ½9™‰kß [ïSÏÅ߈߈·Ø߈«‡“Íj Ëûëö߈‡9¡²™‰kß [ïSÛ«‚ ½9ĐÅ«‡“ÍjƒvŸ\áë癉kß [ïSùê½çº´ÀăˆŸ;kÇͼ³öŽ“‰3Ơ,ùâÁ«Úódz”Ä–ß»ûä̉±»«ÔÙ½ăˆŸ;ÿ¯¶äô'ÙÚÏÔ·1±»³ÜµÅ·‡‘×8ç—»ç̉ùê£äơÔâˆ:Û«‚ ½9©¼¯G‹ø©ˆöÁù×ÑàĂ€¡Ă¡Ư߈ù׿ØÅÓñÓ™‰kß [ïSïÚ¨‡¤2€̃êLÿÚ¼ÏÄÅÔå̉ ñÖ¼ôµ‹‹ÜÁŸ̃ˆ¾ï»€ëöưÀø×¿ß Ơ¿Øͼ¹ÄÔĂ¹™‰kß [ïS“Ƚôơ髇“Íjׯ‰Á«‡“ÍjÏÔëöÛºÂóÇËÓÂÖÛÇÂÙưÀ£Ô©Ø÷ÚîôYöÙÚívÿ¯¶ùêƒvÅÓ×ÜÁƯÇÖ°»Ă*ÅÄ‹È0ưÀÍË)éÛ9¥‡›¶éÙ-Û×™‰kß [ïSÆĂ´Ùèơ«‡“ÍjíØù×™ëéåăˆŸ;¾Á‡é/×:µØ߈°»߈“ÑÄëÀ̉«‡“Íjéê¡Á¯×ÿ¯¶9¥‡ÏÄ嵫·3uU‹Ç¡È·Ø­ÔɶÇÖ±%9¥‡Û«‚ ½9ƠXÛ«‚ ½9™‰kß [ïSƒ˜‡…ö߈ÙÚÛºÙ½Ù×ĂÈÙ½Á̃úÖÙÚø¿çÚ›¾¾©&ỞÛ«‚ ½9§Æ±»ç̉“ƠơÑÓ̃“±»ăˆŸ“¹ƯN½˜‰j̃ZîSÛ×ÈơèÅ÷àµØ߈¡»¶·Ô׿8áƠÛ«‚ ½9щ«‡“Íj™ëéåÏ̉Ûº¹ÚưÀù×ăˆŸ¥‰ÍL…ăàÏÔưÀ¥Â½ÙŒë*«ơÔóÇßÏÛ«‚ ½9Ï̉߈ùסÔÙ×íÆº »¾ÅÔưÀ±»ëÓÍÓË̉ È߈™‰kß [ïSóÇÙ×½ăˆŸéºå‡9¥‡Û«‚ ½9󖙉kß [ïS›¶é¹Úƒv«‡“Íjµ†™‰kß [ïSï³2•{߈€¼8¤‡áêÏÔ¿»¡ÔÑĂƒv‹ÓƠĺ&¾›¾™ÔÅÓ«‡“ÍjöóĂƯ«ڙ‰kß [ïS‡Œ÷ÁÛ«‚ ½9¥ˆ]1Ù‹ÜôêëöƯđöÔö«‡“ÍjỞÏÔÉqÿÚÙ½‚¹Ú»Ø‡ù×ؼăÇíỞ±½¡ÈƯ×Üơ궃vÏÔ¬¾½¿Åù×­Ä߈ßÚÏÔăˆŸ;±ëاÓİ»øæÇÖƯ%«dû—¾Ç߈°»ƒå̀Ó”½ØÓ‹ÇÙ½ëö½›¶éÿ¯¶߈·‘ßÚ…Ôù×ơÔ§4›¶éƠXù×¢X·ôïÁ—¶ơÔơèÅù×8¤‡·º³ô—¶ÏÔ£X̉ˆ +”= + +ùê߈펱»“È·ô½Å¡Á½¡ÔÚª‚ +¼9ÓÅá=ưÀ·¦D ₫§gí›Ó‘Û«‚ ½9íiăàµØÿÛª»óÇжéÓÛ«‚ ½9íÆ«äÓÀª‡’̀j™‰kß [ïSÓ̉˜êè䵨ºù×éêỞÙƠơê³Ê—¶ĂÓùêÅØÏÅ«‡“Íjψùש‡¥2ßëM‹ÛÏ›ëö¿ß·‡‘×8竇“ÍjăˆŸ;½µaá ƒvÿÚ«Û¥‹çÚñ»öß»û9¥‡°¿ +™ëéå•Èû›ÙÜá=ƒvăĂ3ùơÓ ‹›æ±»‹Çܬ¿°» ×Ơ†7§j¹à‹Ó‹Á÷Á»ØÇÓ£Èơê‘Æ±¿© 9¥‡×«Ô„ƠÿÂá óÂÁĂëö“È™±§ÓÏÔ©Ó²ö¯¼ÙŒë*«—͵ØÁƯ«ÑÙŒë*«°»Û«‚ ½9߈­vƒƒvñƯی½ëö‰¿Iùê×ÚøêåĂÙÚ«‡“Íj‹ÜơèÅơê¾éر»§Ô“¹ƯNË̉†Œê$K±»ɇù×̣Ă•Èû›™‡«‡“Íj›¡ÑÓñ×Û׃⡻ëöÚª‚ +¼9ëö½ưăưÀËǰ»¹ÚỞ«îăˆŸ;Ù½›ÂÙ™‰kß [ïSêöá=—£»ơĂ¿ÅÓØ×˜â¼§Ó߈ùêùêĂÈĐÓ¹ÚÏÔ8¤‡ï½Ïŵ%ăàÛ«‚ ½9χ¾ßƯ‰ŸÖù×ăۡȳ߻û߈×ÓÏÔ‡Û«‚ ½9ÖÁƯ9¥‡½ĂÖçÚÑ+¶èà½Ñ·“¹ƯNí‡ăˆŸƒvÍÓ²Çøàéêå̉ ăڷʼnÆÁ̉©¼¿ß™‰kß [ïSÓ¾ÛÚ߈›v߈©‡¥2ßëMº½ôửé‰ñ5ñ·ׯ››¾›¾—¦µØ¥ˆ]1ß%»ĂË̉©¼çÚƒvă»ÏÔ„Ø™‰kß [ïS¯àùơ‹Ç±»»ˆ½°¿ ™‰kß [ïS‡Ç‹—ÏÔ«·3uUûØ¿ºÙŒë*«çô™‰kß [ïS¿Å•Œ·ÔĂÙ™‰kß [ïSåĂù×åÁ­Ô™‰kß [ïSưÀ·Ø°»º Ö†‡ü2ÇÖ¿½½ÑÓ«Ó°»߈Æ̉å×₫±»àף䖈€Ùƒvç+÷‡¿‰éÔöÓÓ­Ö߈­ÔĂÙ̀Ê)èÛ8¤›¾ơÔÛº‡a±»å×ËÉ9µØé¸ăˆŸ×ï»ÔX¾ë‡ëöá ơê°»ï½ßÚơÔ±»ÅÓÓ̉ƒvëö°»½ó¡ÇÎ̉¡»”½›¾‚v‹Ç£Ó‰¿I›¾ù×Å߈±½ Î̉¾¹Ú±̉ŽëÔÁ ²¼ÑÓÏŇºá=íÆç̉ơƠ÷ˆéơ­ÄÛ«‚ ½9ÚêéÓ¥ÈÚÆƠ±»ƒvרỞ›¾„nëö±»ăˆŸƒÖ½ç¸ÚYëÔƒà Ơ$Ư¼íÚ¿‰›ÔÙŒë*«½“ˆơ%³ØƯÚêçÂï½³ Ël§Æ߈ÿͱ½€ÙÚÛ«‚ ½9ÙÅë±»Ñ`™‰kß [ïSÁỬÆÁĂƒvÙÚ¥Øß„ĂºèăˆŸ;kăˆŸ½€9¥‡§Æ™ÓÅÓ÷ÁùêöÁ¡îƒˆ¥ÓúÓ̃ˆ¥ˆ]1™ôÍÓƒv‘²˜‰j̃ZîSívñÆÛÄÓăˆŸ;Ă™‡ÅÔÇ©ƒv߈±»ùסÁŸ«‡“ÍjëƠU«‡“ÍjûƠ›¾÷ÁôĂ ưÀà…í—G—¶ÍÓ‡ŒÍË)éÛ9¥€ºƠÛºÁ‡é/×:ƠX›¾ăˆŸ;ÅØơ±»ù׃vµàÅÔơêÅà§ÓͱԽ…¼¬ÖÛ«‚ ½9‹ÜâḈº…ôƒ»Ø·Ô¼¹̃…Ö«‡“Íj߈×ÚĂÙöåcĂÙơ»ÙÅëå̉ ¾ºöơă»Á‡é/×:̃½™‡ăˆŸ;Ó̉¥ÛóÇùêÙµØù×ü¦†ÍÓÔXÛ×°»£ØƒvÑÄëÙÚ̀!¬H!Û«‚ ½9ù×רë$Ù½·ØáƯÀ¹Û«‚ ½9Ç»ăËÜ«‡“Íj߈ửÀ¼³zƒvñÓ·qöăê¾Ó¼ĂÙÓÅëöôĂƠù×Ù½ÏÔóÔÏ؉j̃ZîSÁ9¥‡ÏÔ†Œ³Â¿ÅÇÅáºçÚ½ĂÙ±»9¥‡×¢ä“Ơ­Ô±»¾«‡“Íj«ÚĂÙ·‡‘×8çăÁÄ–£»ưÀ³½ÈñÓ†ŒµØùêơġȼ»ÏÔơèÅ˱±å™‰kß [ïS›¾¾¹Ú‹Ç½ƒ½™‰kß [ïSëØ›ê§ÆÑÄëé"ªÈ«‡“Íj‹È·‡‘×8ç¹Úù×9¥‡“ØÖÆáƠ…»ÓØÓâˆÓƒv¹Ú“ƠÿÚăˆŸĺÓ™‡½àÁĂ·Ó ¥0¼Ó€ºƠỞ«‡“ÍjµØ›·Ô±»¡ÈéÓÁƯÛ«‚ ½9çđßÚËî߈èºÛ«‚ ½9Ӻス‰¿IăˆŸ«‡“ÍjǺ÷ˆ—ÓáƯº¹ÚßÁ˜êèä8¤‡»Ø«Ô÷Á½«ỔØÀĂȇÙÚÑ߈ﻇxËÉ9çÚ‘ó߈§Ơ­ÙơêéỗÄØÏÔ½ƒ—Öù×Û«‚ ½9¹ÁÜöØÜ©‡¥2ßëMº«Ú߈ÏÔív÷Á¥å̉ ÓØÅÁ©Ø”{¿ô¢ÇơêÁ̉÷ÚÛÀ¶ÏÔö½ψÑø·Å±»ù×±»Ë̉Û×éơĂÙÙŒë*«ăàĂºÑÄ뉿IÛ×ăˆŸ;é꺛¾ÇÖÈĂ߈›¾ëöµØ¹Ú‡Çùô½Ùá½·Åêö ƠáêƒÔÍƠÏÔÅ–ƒ×½ßÄÙ›¾éÓ±½»ƯÓ ăÁăˆŸÀ̉·ÔíÙÑÄë߈¬Å­ÄóỞ³(˜ÁÉó½»ĂÿÚªÔËÉ9ËÓÅØƒvÛ«‚ ½9›ÛơÔëöµØƒvÛÄÓ«‡“ÍjË¿éºG½¹ÓŧスÓÅË¿רÁƯ­Äÿ¯¶—ØĂÈ›¶éù°߈“Æä̉ÇÖ߈¥Áù×ÙÚưÀăà½ÏÔ·Ó ¥0߈Ù½ưÀ§ÔÑӵ؟ÅÏÅϹÏÅÑÄëÏŽËÖÁƯ¬¾¹ÚÅàÙ½™Ó÷ˆÚª‚ +¼9ÉÖß»ûưÀ›¹‹Ç«)ù×ÅÓº±½±»§ôÙ×—»›¹ăˆŸ;™‡¯́Üơ±»íÖ™‰kß [ïS›¶é±»Û×›ĂºơăˆŸÁƯ«»߈ÑĂÛ«‚ ½9ĂƠ÷‡ëöÑÄ낽½€9¥‡µ†߈ͼµØ9¥‡§ƠÁ¼Ù½ƒv«‡“Íjôl¿çÿÛ±»«·3uU³Øó·¼Í7ᦥ‰ÍL…˜‰j̃ZîSÙŒë*«›¾ƒ(¾»©‡¥2ßëM¥ˆ]1̣¶ר·‡‘×8çăÇíéÓ™‰kß [ïSËÔÛ«‚ ½9ƒvăˆŸ;áêœÜ¶È›¹—¶á½ñÚµØÁ¹÷Ù廋Ç߈¾Ù½Ï߈×¾£»ăˆŸ;Û«‚ ½9×ƠƠXßÚ«ô»÷¶ăˆŸ;‡ÑÓñÓëöÁÿ¯¶¯Ô‡Œµà·Å9¥‡ÿ¸ƠÁưù×ơêăˆŸ«‡“ÍjÏÔÏ|ù×ÅØ°»ăˆŸ¯¾¹Úø×“ñÖƒÖÆĂ‘øă£ä̉ºĂٟ؉¿I«ÓƒÖô‚±¿ù×¾½»½Úª‚ +¼9ƒ¾‘Ž“ƠÏÔŽ±»ưÀÑÓÛ«‚ ½9Û«‚ ½9÷‡ưÀơèÅ®ù×€ øê“¹ƯNŒƒv¡Ô÷Áÿ¼º™ÁơÄ߈×Ï߈ñÓÇÇÖÛ«‚ ½9±»÷Á£ØăˆŸăÇíăˆŸ;áêÏŃv—ŸÙÚÏÔÀ½‹Çö–¶÷ˆƠºm½€±÷‡£Ư¥ˆ]1Û«‚ ½9µ†‹Ç§Ô±»ÁƯ«‡“Íj꫇“Íj—¶˜‡¶Å‚+å̉ µØ½Ǻ¯«Ôëöêöù×—½Á\ŸÅÿÛ›¶éƒ¶‰çÚ«·3uUÏű»Ơƒv÷Áùæ½×ƯóƯºÿ&Û×ÏÔ™‰kß [ïS·ÅăˆŸ;¡Á±'ÆÖ•Œ߈̃ÄØ¿ô«ºÛ«‚ ½9¹Ú“âÎÔ«‡“ÍjăˆŸŸ}߈Ÿ}ר‘‡¡Ôïi«‡“Íjº“Ƹڧԛ¾/°»©"ăˆŸ;k™‰kß [ïS½½ôµØÀ¼óÂưÀßÁñƃvå̉ ÏÅù×߈Ö¾8ù×í‰ăˆŸ;™ÔÙ×½́‡¹Ú™‰kß [ïSѶÏÔ«‡“ÍjÍË)éÛ9¥ĂƠˆ›¾Ơ®‰®0Ǽœ‰¾I¡Áº§Æ̀Ó ĂÍË)éÛ9¥9¥‡߈ăˆŸ;ˆ˜êè䙇‘ÛûØëö¡Ûö·‡‘×8çÚª‚ +¼9ÍÓÙ½Û¬ï»ÙÚÁƯÅàÛÄÓϺ™‰kß [ïSăˆŸ;¡È9¥‡˜‰j̃ZîS«‡“ÍjçÚ£Øëöª ¨ƒº5ù×±»Û×™ëé彫‡“Íj߈Ÿ…ÅÓÍƠYÿÚÏÔăˆŸ;×̉Û«‚ ½9ºy¸߈ÍÓÛ«‚ ½9­ÄÙ×ÛÚĂƠ¶¹¹«·3uU·ÅóÂÛµ†ù×Ö̉û™‰kß [ïS÷‡ÛÄÓ…ƠÙ½“È”½9¥‡¾¹x‡xóÔéÓơĶè9¥‡«Ú­½¼ ƯºùÚöÍË)éÛ9¥Û«‚ ½9·öç̃ÊÓÛ«‚ ½9±¿ĂÖ±»—Ó‹Ç“ƠÅØáê“Æ¼È³ÇỞÛ«‚ ½9í¹ÙÅë«ÔăˆŸ—¶«‡“Íj­ÄÇÖ›HơÔ±»́Ư·̣ăˆŸ‹Ç¡ÛÓ̉†º¯‰¯0ç̉ô߈÷æºø×¿»¹ÚÅ™̃Ï̉ÏŹÚÁ ´ÈM‘ûËăˆŸ;ÿ§«‡“Íj±́ÓºÛ«‚ ½9₫«‡“ÍjơÔ· ƒv¹Ø¯G‹ø¥Û¶'¦D3 3́Úùåù×çÚß»ûơԓƽÔÚ¦ù׃vÚ×Ù½áçR²Ø°»ª»Û«‚ ½9ƒƯ«‡“ÍjÚÄ̉—¶÷¶ÏÅ©‡¥2ßëM·¼Í7±»߈Ị́¼È•å̉ ơÔèÓ¼ ôĂÑÄë—¶óÇơÔªÚÊÖăÁö¹Ú°½°¿ĂĂ ›­±àéM“ÛÙ½ÓÆ±»ăˆŸ¹Ø߈ƒØËÇÙ½ÏÅí‡á̀™‹Ÿá"¯éÏÔ¹ÚûØĂÓ±»¡È9¥‡×ËÉ9Î̉áÛáá¶Û«‚ ½9÷ÁÇ%¹ÁẲ¨ºá¬±»ÅØ—ÓƯű»Ù½ƒÖöÀ¹¡ÛáƠ…Ø™ëéå¡›·Ô›Ú›È߈“º½´ưÜøæÂÙëöâàăˆŸ©‡¥2ßëMƠºˆ—»íÚù×» •Œé‡ùơ”½¿Å­¿ëöォÚô™‰kß [ïSăˆŸ;k÷‡Ë‘½Ù½ƒvºÁĐ¹߈çÚɇù×ú¹—¶Ï̉ó¯ù׫»ưÀÏ̉³ëöƠ³Ø‡ÇơèÅ»²™‰kß [ïSƠ¼߈ßÄÙƒv™‡¡Û«Ú£ƯçôàÅ«dÇá±Ơ¹ÚÛ«‚ ½9ƒˆºÆ¥ˆ]1Û«‚ ½9§ôơêơ꛾ÍË)éÛ9¥‘ÆóÇ›¶é½¿́ùêÅÀ·̃ƒÖÅØçØåŒ¿NÎÅ™‰kß [ïSăˆŸ;ñı»«Ô±»«‡“ÍjÁ½£ä±»Û«‚ ½9¾ÏÔĂÈöÏÔÎÅ™‰kß [ïS—»ơêÈ̉ñÖ߈£Ø9¥‡’DZ»÷Á›¾¾Ïԅ͇º½ËØß»û³ơê«Ñ™‡Óí—G—¶Ù½ăˆŸ;ơÙ×ĂăˆŸ;¹Ú߈‹Ü»ÓăˆŸëŽå×»½€ùë±»ÅØ×Ü߈¿‰ßÄÙ½ù×çÚù×Ï̉ñÔˆđÖ “Ơ‡ÛƒÖºơêÅÓăˆŸ;׿8ÅÅ›¾ÁÆ·Ô™‰kß [ïS‡º§Óù×…~ëƒÛ«‚ ½9™‰kß [ïS­Öƒ©‡¥2ßëM±»öơÚª‚ +¼9«ƠÍÓ÷ÁăÁÿÚ %±)Ù½ƯÚÿ¯¶Ù½ÑÄëĂÙƠèá…ŒŸ}Û¿»±»±»ĂơĂ²”¬ÖĐÓ ×¼ù׹ʧӀLÙÚ߈¡ƯÓÅá±»…Ơ9¥‡›ÚªÔ¹ÚÉá Ç֟Ńv¯È•ŒăˆŸ«‡“ÍjíơÛ´¹ÁÛ«‚ ½9½ôù×ô·Ô«Ô9¥‡Û«‚ ½9ơê߈ăˆŸ‚vôï»9¥‡Û«‚ ½9ÇßÏÔáºùד¹ƯN¯×ưÀ߈±»™Á÷Á»qûƒv·‡‘×8çëöơÔÛÀ½€ĂÙË¿öÙ½ÿÚÏ̉©‡¥2ßëMÖØÁĂ·#—üëöÏÔ³ñÚÅ»í‡ÏÔÅØÖ©¼°»¡ÔÅÓ܈½óÇùׂ±»߈ÙƯÛ«‚ ½9ÁËöÁơê§Ô߈Ư‰ÍÓ›¡˜êèäơêŸÈçºÔ%‡Û•ŒóÔưÀËÇó×å̉ ½ÁƯ¹Úïߣ䵨ÿ§œÁ×̉¡Á‡Ç¡ÛăˆŸéêăˆŸ;kßáÀ½Å»½­¾“ÜăˆŸöăˆŸ;µÆÑÓۺƫ‡“ÍjçÚ¶ÿÚ¥Ö̃ÅơÔ߈¿ºĂÙŸÖØˆơ¥ÜĂÙíÁ™Ó™ëéåăˆŸ;‹ÜëöơêÏß·Û•†°»ëöơêíêÁ̉ßƯ‡Û¹Úÿ§™Á«‡“ÍjăˆŸ;¹óº$ƒvÅöµØ±»‡×ÏÅ̀ÓÏßÏÄÖÓå̉ ßÄÙ‡ŒăÁÿÍçÚÙׯƯ—Œƒ¾‘º-Û«‚ ½9ơê›¶éÖ éêßÄÙÿ&í$₫™‰kß [ïS´Îö¿‰ÑÓ÷Áרù׉ƻµ½éºßÅèôơ莅ۙ‰kß [ïSÂĐÓù×—»Û«‚ ½9ăˆŸ“Ơä̉£ä“¹ƯN‚vÁƯ߈ù×™‰kß [ïSµØÙƠăà߈“ƠÛ«‚ ½9ăˆŸ….©‡¥2ßëM©ØÏÔÿÂ߈Û×ËƠÔXG½¹ƒ•/ơêÏÄĂâº×¾߈µØ‰ø½ăˆŸÿÛÛê‡Ư߈áùןƠ¹Ú…Ơ™‰kß [ïSшơê³ÈÏ̉ù–˜‰j̃ZîSܵؓ¹ƯN»ÙÚª‚ +¼9½€­Ø‡ÇÏỐơ«‡“Íj߈™»½ƒvăÛ«‚ ½9«·3uU£»ĂÙº›Ơ™ÔƠÏ̉ËÖù×ÏÔÑÅăˆŸÏÅăˆŸ;kÜÂ߈½¿Åå̉ ăˆŸ¹ÚÍË)éÛ9¥óÇÁă»ÙÚÍǃØù×›¾€¾½Ë×¾©Ø©Óă๠¿‰‡Œº—¶Ü¸Ú™‰kß [ïSçÚå̉ ØŒê*ªáçƒ×Ù½•½½¿ôù×߈ͺĂÙºÛ«‚ ½9ăÚÑÓï½ÿ&¾áêÏÔÛ×Ơµ°»ÀƯưÁ¨¼ËÉ9шñÖÑĂÉ¡µ«‡“Íj½€ƒv«‡“Íj½•LJºÚ‡×ÑÅăˆŸ;¼ô³ÂÁĂà µñöăˆŸ;ÅØç̉·ÅÚÇ¡ÔĂăˆŸ;k߈ÓÔÍÓű»çÄù׫ԇŒ‡ºÛ«‚ ½9ß»ûÅÄ«ÔÛ«‚ ½9Ù½±»ăˆŸ;k©ÀÛ«‚ ½9µØưÀ¯Ơ¡È9¥‡ĂºßÁåÁÏÅ8¤‡×߈ăơµà‚vơêÆ·Å9¥‡ÏÄï½ñÆù×§Æ÷‡›¾ß»ÅÍÏÄщëÄŽ¾³ûƠÁÚ÷Á߈ÙÆëøíêưÀÔ훹ëÔÓóÿ¯¶ÑÄëƠØĐؽơê…ăˆŸ³zÛ«‚ ½9¹Ú·áÙÚáÅ—ŒĂȱ»ù׃vÁƯӯ釙‰kß [ïSÛ×Å–ĂĂÓ¸èÓ™‰kß [ïS×Ă¯à†Œ   íê‰ÛÅ»çr‹ÇƒÛÛ׈µØ¹Ú“™Ô“Ơ†Œ›¾ËÉ9ù×÷ÚăÁ½ô8¤‡ÏÔăˆŸ‹ÇÁŸÅ9¥‡Û«‚ ½9чºïƠăˆŸßÁ½ïÅÀ¹ ½èÓºÎÅ ÁƯívÙ½«‡“ÍjöơÔưÀå̉ ½€ÏÔí—GÿÚÛ«‚ ½9ăˆŸ;ÏÔ߈Åà¸»Ă«ÔÛ«‚ ½9½ƒàÙÓ©%ÅØ¿ß·§D ¹ÚؽÏÅ…¾›¾·Ô÷ÁÏÔăˆŸ¿¿º÷ÚĂÈéÍ•{¡ÈÛ«‚ ½9»Ø©ºׯáØÄÓ9¥‡‡ÛơÔÛº÷ä5̉™ơó#™‰kß [ïS”Èú§å̉ ߈ÍË)éÛ9¥«»¾¹xĐÅ+ơèÅđÁ&ưܪڷ‡‘×8ç‡Ú«‡“ÍjưÀ›¡»ØÙ½½¡È¡Ô•Óó¶߈߈û(ĂÙơèÅÛÇÛ«‚ ½9ŸƒÔÛ«‚ ½9ß»ûưÀßÄÙơêóĂ—»»Ø©ºçÁÍÓ¹¡ÈÛ×î½Û«‚ ½9Ľ߈₫Z«»ËÉ9¿‰§àϹƠ€Ăº«Ô·ÔÿÚ—Ö·¶›vÅ–¥ˆ]1±»µØ«‡“ÍjÑØƒvØ×Ï|ëuÓº±»ùêÿÚǡȅÔƯÓ ©¼óÙ½߈ĐÓ¯¾«‡“Íj߈ëö±»ÏÔƒˆï~¿‰ù׃(Äô«‡“ÍjöâăˆŸ©‡¥2ßëMœÁƒv«Ó¶¹Ú¡ÛÏÅçÚ™‰kß [ïSăˆŸ™ëéåÙ×½˜Ă™‰kß [ïS±Ư¥‰ÍL…ăˆŸ;©À¼ÇÖ½ù×·Ôçơ9¥‡¿»âˆÏÔƒà߈½Åƒv—¶Á|çÚóƒçÚÅ“È9¥‡™ô›¶éù¾ÁÓÿÛ¿‰«bÑĂĂÙéêß»û‹ÙáÚׯ9¥‡ĂÑ«‡“ÍjëÖ±»ÓºùׇŒƒ×¹Ú«‡“Íj¶̣²Èœ‰¾IƯ¥·‡‘×8ç Ëû±»ưÀ8¤‡¿‰ăơ²º̣éôå̉ ±»ÿ¯¶«‡“ÍjíÚ¤ˆ\0ÜÅØ±»·‡‘×8çÏÔ›¾ÍÓ·ÅƠ¾GñÓ™¸ÅÓÙ½ËÉ9ÏÅôÏÔ™‰kß [ïSƯº‹ÇµØëöÑÄë¡ÔÆÿ¯¶»Ơ—¾‡ºƒv‡ŒĂÙ›»ø×ơèÅÙ½°» ÙÚưÀ‹°ç°»©‡¥2ßëM­Ä–ˆöÛ«‚ ½99¥‡™‰kß [ïSå̉ §Ûß„ưÀ—¾Á¹߈«‡“Íj¾Ø±»ăˆŸ;kĂÙÛ«‚ ½9ñӥƲƠ©Øÿ¡¼ÓÔăÙăàƯ‰µØơúâˆ:­½¼ÁƠÅÔá Û«‚ ½9ƯÓ ëöÛ«‚ ½9ÏÔ•Û‹É0‰¿IÛ«‚ ½9‘ÆÅ”ä× ̉ºƯ,—¶»²ÄĂơèÅÅÔ¾ÿ.̀ÄÙŒë*«ăˆŸÓº»½ñ₫ưØơÔ±¿±»ÏÅÇÖơÔÏÅ̀Ó—¶9¥‡ưÀăˆŸ§Æ™‰kß [ïS¤ˆ\0ß»ûé‰ñ5ñ·›ăˆŸ™Á½߈¾¶  9¥‡ûè¿ô™‡¦Æ÷Á×ÖÔ†6¦jëö¤ˆ\0ŸÖµ˜‰j̃ZîS½€Ổµ/½Á*ÁƯÛ«‚ ½9çÚ«ö›¾ÛלÁ½ôß»ûă»¶‡Ö8æ¾ß×Á·ºăˆŸ±¿ùê߈ñ±»•ó9¥‡¨Ç÷ÁĂº™‰kß [ïSºƒvç*ù×™‰kß [ïSÏÅﻫ»«‡“ÍjáêÏÔÙ½÷ÙË¿ëÓ©‡¥2ßëMÅØÚÚëöóÂơêéêù×ù×å̉ ưÀ½Ô8¤‡ăˆŸ;ơÄÀ¹Ó¾ƒ×‹Üº߈̀Óă‘·ψÁ‡é/×:«»¹Ú߈߈¿ëô›ÚÏÔ߈ÙÚ™Ûïä—¶§ÔùêÂÙƒ¡ƠưÀÓº‘Æχ߈ƒ‹»§½¹̃ö‡xù×ƠͪÇĂÙĂƠ—¶ív¥Óù×½ăˆŸ;ùë£äÉ₫®¶·Ó ¥0ÏÔª»ß»ûׯù×™‡Û«‚ ½9£äƠŽ‰Û½…€­:óƒvÛÔëöƒvÙ½™ô¯¸Ú¼Ă÷Á«‡“Íj¯å½€™‡߈“ÈñíÈÏÔívÏÅëöƒˆă௼«Ôÿ¯¶¿Ú±»ĂºùׯÈăˆŸ;³ÂÏÄ«‡“Íj«ÛƒvàƠMÁÓÿÂẦÊ)èÛ8¤Ïů׫ÚăˆŸ;ÑÄë½ëÔÀĂåĂ‘±ëöÛ«‚ ½9ưÀ½Ÿ‹ĂÖ«Ô½‚ÏĽ"ª»œ‰!¾I!ÂÙ¸àÇ»±»±Ô¥Ö·‡‘×8ç߈±»¶‡Ö8æöÁüÓï»ăˆỴ̈*…ÖǵؓƠÿ&‡º¼ßÏăˆŸ›¾áÛơêơꘇÖŸëöáê߈9¥‡ăˆŸ;ñÚ÷¶ÆÅÙ£‡Óÿ¯¶ß»û˹¾Û¾Åë‚߈éÔ×$Óºº…»äôµa—»ĂĂÓҫԂvóÇÿ¯¶±»ƒv³Âͪëö߈¿ô™‰kß [ïSÍĂäÁ¯È­Ä‚Ø­Ö‡Û½…¾ÓÅ̉ØưÀ½€º¿Å¶ăˆŸÑÓ«‡“Íj±»‹öÍĂ¡ÈÏÔăÚ«‡“Íj½È—ø¿¾ö™‰kß [ïSôơ꫇“Íjü¦†߈ûƠù¿³ºóăˆŸă½ŸÓ±Ø¥Á²ÈëöăˆŸ;ù¿×Ơ†7§jºªÚ ÅƠÛשÚù×ëöƠ—Û9¥‡߈Ï̉ÆưÀ¿ÅµØ¡µ̣±»ƠÚ÷å5Ó½€çÚƒˆ™ÁÏÔâàƯ‰߈£»¹ÚŒ¿Ú×ơê“Æ…ôưÀéӉƃväô½ơ$¾¹ăˆŸ½€ß»ûăˆŸ;©Ø߈ºÏÔ‡Ϻ¯È×¾8—ˆƒ½¼›¾­Ö‹ÇéÓ߈§ØÅÄψ‡jø»1™‰kß [ïSôêƒvù×ëö±Èù׳؃v±ë؃髻º±»ÅÔù׺nÑæíºËÇéºÄÓ«‡“Íj›Ûô°¿ÇèÛ«‚ ½9ƒÏÔóÓ߈™‰kß [ïSÏÔ½ ñÓ™‰kß [ïS‡xÿ¯¶‰¿I·§D ‰¿IÁ߈ͼ±»߈û̉˜‡Û«‚ ½9É̉ïÅÑàÅØ“ÜÏÔÅÓ‡ÇÛ“ÓÓÙ½£»ƒv‹¿À¹ăˆŸ;¼ôá ÍÓÁÛç`÷ٿžżS‹Ù߈߈ÙŒë*«Ûº̃ˆăˆŸ;Û«‚ ½9Á‡é/×:«‡“ÍjÛÀ—¶ƠÅù×Û«‚ ½9Ô™Œ™‡Ó¾ûÖÓÆăˆŸÛ×÷Á™‰kß [ïS¹Úƒˆơê«·3uUÛ«‚ ½9̀Ó§Óï³2ÏԵر»‡é‰ñ5ñ·ÏԭĹÚ߈ÍÄÙ×Åù×ËÛñÖÍĂĂ˜êèä¿»ÅÓ‡¿éºù×ăˆŸ;ĐÄêéÓûÓö°»ơÄôÄ× ù׋Óé›¶éñÚ·ÔÁƯ™ëéåؽù×ùêơêÂÆ¾ù¿߈™ÓßÖª‡’̀j߈ÆßÚ«Ôô—Ö«»ÄÓ¾»ØăˆŸçÚƒ½­ơÓŰ»¡Û«Ô߈ôê߈ÿ&™Ăù°Û«‚ ½9‹văˆŸ;Ù½ÿ¯¶–Ö ív½€ö™Á߈½ôåĂ­ÖÑÅù×§ÓÍĂº̉ªÔ÷ÁơÔ½—¾¿Ô…ôÿ¯¶ö…Ơ×Ơ§ÔÀ‚ó±»½€ôÿÚùדÈçÚ8¤‡×œđëö¾ºöÁ«‡“Íjív¿ôøôµØ÷Ù›¶éçÔ¡ÏÔ½æđï²29¥‡ïƠƒvÈ«ÑÑÅÙÚÑÓ¹Ú…¹Ø߈‹Ç­Ø£X‰ƠÛÄÓơ»Å»ÑØ‹æ»í™‡9¥‡ù׫÷ơÔÙĂä9¥‡ĐÅ¡̃¾ß±»² —¶»Ø©¼ÏÄ¡\߈ßÖô«‡“Íj¥ˆ]1«Ñ¾óÇ×ÂÅàïÂ¦Ø‡ÅØ½€›‡™‡ƒvƆº‹Ç¯»ïDû½±¿…عÁ™‰kß [ïS9¥‡»ØđÆƒà—ˆß½ă»ôÓºÛºÛ«‚ ½9™Á™‰kß [ïS«‡“Íjé‡ëö©ÓœÁÓÆÏŃˆ°»«‡“ÍjÙ½ÏÔÛתڱ»ù×ưÀĂÙăơ߈á ¹Á¿‰Ă«‡“ÍjÓ̉¹Ú™‰kß [ïS£Ç˹ÇĂ–±»̀Ó÷Ú»ÔñĂơÄÉ̉‡~²+^…ó±»Û×§ÔÏņڣäÇ»…,¿º.åôçÚÛ×™Ă¡Û™Ó̃ˆÏųôĂƯÓ ±»à¬&—áưÀ÷‡—Œ߈‹Ç Çÿ¯¶ăˆŸ;ɇï»Ï̉íÖù×±»™‰kß [ïS8¤‡Öá¬ăˆŸ;©‡¥2ßëM‰¿I߈ߌÛ,‡Û¯¼ùשә‰kß [ïSƒÖÙÚ߈χ̃ˆ·‡‘×8穬¾ô©ØÙ½µ†‡¿‰¿I‹ÈٽٽרÁ™‡ëöÛ«‚ ½9¿Ù±»ÿÚ«‡“Íj³ºó£Çϱ»×Ú§ÚăˆŸ;·‡‘×8ç±»˜ơ¿å™Ă½°»¹ÚơêÓű»ÑæÛº¥º‡º›¾û(‰̃–Ë˦Ë̀»ËËÏÔÍÓÓÁĂ%߈©Ó߈ưˆ©–º߈†Çëö–¦̀»ÆĂ™‰kß [ïS釭Ö䯩ÀÏÔ«‰„øơÁƯ¥ˆ]1ç»¿ô¥Æ¶µØÏÅ›v¹à©‡¥2ßëMă‘·±»øơ«‡“Íjù걻뙉kß [ïSăˆŸÇ‹çơêƠ‰Ư·Ó ¥0“º™‰kß [ïSñùן؃ù×½¹ÚÙ̉º…£­»½ăˆŸ;ơÔùê»Áǵ؟ÈÓØщƒvă꛾«‡“ÍjµÜÿ¯¶ƒvçÚ9¥‡ƒÜ× ¾ÛÆÿ¯¶½ùåÛÄÓÛ¹ăˆŸƯºµ1ٽᙇ‡x¹ÚÅƯ°ê؉Ծ¹ù×Û«‚ ½9ͽ÷I©Ó°»ÑĂÑ!ëơÛ«‚ ½9‰¿IÛ±&ëÚ¶çÚª́ +ÅÔÿ§óĂ߈Ôơ‚v×ÜĂÙÏ̉§ƠÿסȢä߈º½ÏÅßÖ±́ÊƠÿÚû±Û«‚ ½9½ôÅÓËÇó#¹à·‡‘×8çÁơĂƒˆ™‰kß [ïSÙ½Ûº›¶é™‰kß [ïS«Ô¶›¶é›¸£Ç߈ߌÛ,Û×ïÚÓØ¿‰_ÏÅƯÁ×ÓÛ«‚ ½9ăˆŸ;k“ +®‘߈É¿ôÖ̉Û«‚ ½9ëö©¼ó¶›Ú‡²’Ç ÏÅăˆŸÙ̉Û׃ˆÓÓ÷¼«â$«‡“ÍjÑ»ÿ¯¶ßÚç̉ÏÅéùµØ߈™‰kß [ïS°»­ÙÚĂ߈¸Ù•{щ†Úñ×ÙÚù×߈‹Üùæ™ôñӧؽ‰ÛÑÓç4Ïſؽº•½«Ú¾«›Ϲëöư¨¹Á퇛¾»ØöêßÏÓ¾́ºëö¹½±»­¶±»áꋽ±»×ϼ&ăˆŸ;Ï̉ù×ă±»«‡“Íj÷ˆ¼÷Á™‰kß [ïSñÚ…Œü̉ÙډغÏÄgg«‡“ÍjÓ±»ë×¹Úº­½¼Ù½ù×µà·Ó ¥0«‡“Íjơ¥Û¿ôÁ€Ö$£äénëöôêááöÁưÚÛ׿)ëöÏÅ߈™‡±»›¾ÅÓÖÆ×Ơƒv«‡“Íj·Ô°»™‰kß [ïSƠƠŸÅªÚỂµa÷Á̃»ú̀º÷9¥‡ơÔ§ô߈™‰kß [ïSùê±»»·Ô™‰kß [ïS«Ô•׳à¹Ú«Ú™‰kß [ïSÛº߈Úצȫ‡“Íj₫ÛăˆŸ¡Ô›¾ƒvч©‡¥2ßëM8¤‡Ă٣䙇Ɨ¶ăˆŸ;Íß×Ơ©Óù×߈×Ơ†7§j³Èµë¤ˆ\0Ư­ÄÿÚшÍƠ™Á߈ô‘¤™‡¥Ó«‡“Íjóà‡ ÈæºĂÙ²›¾œ‡ÓØÍË)éÛ9¥·Ü“ȥƃv™‰kß [ïS™‰kß [ïS¼ô™‰kß [ïS­Ø«äƠƒàÙÚëöÅ¥ºÿ †º‡Ơ9¥‡×•ä׫dëáïÚơÔÔX$“ÜèÚ³ÖÔ†6¦j±»¯×Ù½«Ôóèív±‡È̉߈Ơ›¾ÑÙ°»¿¹¸ÚϺ÷ˆɹñÁÏäƒÖÄ–ÏÅơÔ·¯ƒ™ÔëöÙ×Úª‚ +¼9©¾ưœÎÔŒ‰°6í—GëöƠŸÖëöƯÚùº߈ù×ơØ¡ÁơèŶ†º¶‡Ö8æ߈¡ÊéÓ½ĂﺉԱ»Ï̉á=ƯÜ«»ăˆŸ;›ÔöÍåáđØ× ¶ÜÁÛ«‚ ½9¹ÚÛ©‡¥2ßëMÁƯơÔ´a߈·‡‘×8çψÛ«‚ ½9éê߈·‡‘×8籿çÚ‹¾™‰kß [ïSƠ¶ÔÅnщ¹Ú‡ŒưÀ™‰kß [ïS‡ºăˆŸ;ÏŹڇŒœÜ›¹Û«‚ ½9ơÚ¸Á¡†߈«‡“ÍjĂ ½¹)§Ô¶ÿÚĂË₫™‰kß [ïSÜÓ ƯÓ Ï̉ùׯȫ‡“ÍjÉqăàöÇ»¡%ÍĂ³8¤‡é·‹áê«â—ˆÙ½çØÙ½½€½ơÔÛ«‚ ½9á ûçĂÙÙ½™ºƒv«Ô›¾¯Ǽ±»ÑĂÛºö«‡“ÍjöÁơêYơê›¶éăơ„ØăˆŸÛÀ‹È߈Û«‚ ½9·‡‘×8çÏÔÏÔ“¹ƯNÇÖơèų³àØóÂĂÙß»û±»‡9±»̀Ç٬ĵÁÛ«‚ ½9ưÀ§Ó°»ív¥ÓĐˆ÷ÁăˆŸ©Æ™‰kß [ïS°»9¥‡×ñ¨÷ÚÏÅÅÀ©½ôùô™»ß»ûƠĂÙÛ«‚ ½9ÁƯöáƠĂáê¥ÛéÔ“ö߈ƒ½ëö·‡‘×8çôê¶ÅÙÚ噇÷‡«d×ƠăˆŸÏÔ‘ÖïÁ¼ôÛ×½ª‡’̀j½ôÇÖϺñÚ9¥‡¡ÈßÚă꫇“Íj½€ûÓû±¿âÄ»ˆÛ«‚ ½9÷Ú™‰kß [ïSôö›¾9¥‡Ôù×£X߈¾Å àç¼€Ǻ¶è›¾áĂ«»ô­¾±»¾«‡“ÍjÏÔá=§Ô×ÿ¯¶ºÙ€Ñ+ö㻫äưÀƯψù×ĂóÇù×Û÷Áµa·¼Í7̃ˆ߈¾wÛ«‚ ½9½Áù×Û«‚ ½9ﻕ܃váêä¿Ø½¹Ú©‡¥2ßëM°»ßÄÙÓØÏŧô¬ÄÁ¼´¾ßóÇÛ«‚ ½9—»ëö´†ăˆŸ;k‚˜‰j̃ZîS߈߈·Ó ¥0§Ôá$ÓÅßÄÙƒváêâÁÁéÓ¹Ú«ÓÍÓÓÆôê·‡‘×8çç`̀§ÓÅÓù׉¿I›¾·ÔÏÔ±ÔÇ%©¾™‰kß [ïSµØ©ÀÏÔëÓöÁ9¥‡™‰kß [ïSÿÚö¡È£ƯËÉ9ëöÛÄÓÏÔÓºÇÖ½₫Ú±»Ở™‰kß [ïSÙÚÁŸŸ§ÓÀ˃?öÁăˆŸ9¥‡ÑÓƯÓ ÏỔƯøÏ̉ÑÓÍĺ؈;ù×ƯÓ ÍÄÑé£ơêÛ«‚ ½9·§D ¨Ó™‰kß [ïSơêÛ×™‰kß [ïS¹Ú­ÚÀË̉ÍĂÇ_®Ö Å»¥ÛµØ·Ø·Ôû«‡“Íj߈±»‡Û«‚ ½9±»ÏÔׯƒˆ™‰kß [ïSÁÇŒ±¿º–¶‹Ç—ŒÑÚµ‰µØ“È#ÏÔÏÅĂïÚ¿¹ơlåÁƒ×÷Á€Ơ§‚éÚÛÄÓÏÔáê½½ơ°̣̉Çö÷‡£ä÷å5Ó›¾÷ÁÛßÏ߈ǾÓÆ–Œù×ƠÍÄăˆŸ;çÚÁƯÇÖ‹ÜÁÜ™‰kß [ïSñÚñÚèÔ Ô^‹ÓÑØá¹Ú߈›¶éË̉·Ô¡¼¿ßá=çáêĂÏÅ«‡“ÍjµÀ£Ôơ꛾±¿ÓºỞå©÷¹ÁñÙÙ½ăÁ³ÈÿÚáƠ˜ÁÅËÇX«Ñ¯ÈÙÚ›¾«‡“ÍjÚÇßóēù×çÇÙŒë*«ÏÅ­€ÏÄ™‰kß [ïSÿÛ¹Úö™ëéåϾ¥OÇ»™‰kß [ïSÎÅÏĹÚ×Ơö½ëö™‰kß [ïSƒˆ#­ÈÍË)éÛ9¥ÍÄƒăˆŸ;k£È·‡‘×8ç£»ÇØ±»ơêÛ«‚ ½9µa¿¹Úç'•%•ŒÁÜμ³Ü¾Úª‚ +¼9¯ÈÏÅ߈ª‡’̀jÿ.ÏÔ½̉‚vÜơ›¡̃»úßÁÑĂÿ¯¶nÙÅë™Á‡ŒÛÀ™‰kß [ïS¿»9¥‡×ÅÄËӭ֫䫇“ÍjăÇíÉÿÛÛÀ÷Äí—Gƒˆ¢äï³2Ûº‰¿IÚª‚ +¼9å̉ ×Ơ¶Ô·Ø©ăˆŸ;k‡x«‡“Íjé‡åƠăˆŸ;¼Ăº³È›ŒưMÀǪ‡’̀j¡¡8ä̉‘Ƭ¶Ù׃v™‰kß [ïSù×—ÔĂÙÏÔ߈™‰kß [ïSĂĂ ›­±àéMëö«‡“Íj±ă«‡“ÍjăˆŸơêŸóeăˆŸÍÓç₫™‰kß [ïS߈9¥‡Ăà£ÇËê·‹ơúÜÓ óÔÙÚÙÜË̉½€ÓÅ‚ÖϹĂºŽ¡Áƒψ«‡“Íjº£Ø­bÏÔÛ«‚ ½9½€ñÓ‡’™Ă±»ºư­ÀƯ¶‡Ö8æÿ[“È´†ÁƯǼơễˆù×ÓÆ¯G‹øăˆŸ›¾ăˆŸÍı»·¬ù×9¥‡öƯêö™‡½ĂŸ}ăơÆÅôíÖ¦ôÏÔ«‡“ÍjíÚï½™‰kß [ïSăˆŸ;k鮋ۗÓëÓØƠ‰y½Á½ù×Ó™ÓƒÚËÇ꼡ÇƯÛÔ°¾¤Ó·‡‘×8ç¡Ûó^Úº­Ă½÷‡ºÏÔ“È÷Á˜ÁíêÁ×ÏÔáêÏŹÚÏ̉±»«ÔÍË)éÛ9¥ƒ½»½™‰kß [ïS߈ù¿ǼÛ«‚ ½9ï»ÏÔ™‡ØÚéJé‰Ó5“gesÁÅÏ̉½íÏ̉áê»ß„·‹Û«‚ ½9ăˆŸ¡Û¤¾Áù׉¿I«»”ÈúĂÇĂĐÄêß»ûö“ÆÛ«‚ ½9éÓ™‰kß [ïSÛ«‚ ½9™Ôơèůȱ»†×øæ¡Á£Ø«Ú¿¬ÛŸ}›¾ƠXÏÅ–¾ +ù×ù×ÛסÔÅÔÏ̉ËÉ9‡ºߌÛ,†ø̀Óùôà‡ÇÙÚå̉ ·Ô¿‰ÁÆ ¸ ĂÙÛ«‚ ½9Û«‚ ½9™Ô“áÛ«‚ ½9÷ÚØ×ÏÔÏ̉™‰kß [ïSøæ*Ù½ÏÔ¼ăàăˆŸƠéÓ÷‡ßƯ€Ç™‰kß [ïS߈ÿÂŒƠÏÔ¿́ăˆŸƒv£Xù×Ă£߈±»Á¾Ù½óÏÔ„ØA«‡“ÍjÁ¹§ôù×߈×ƠÏÔ³àöÁ›¾±»½úÁĂÛ«‚ ½9‹Èƒ×ßÄÙ®ÈרÖĂß»ûÑÓưÜôê«d™‰kß [ïS¿±»½µØ·Ô™ŒåÁÚª‚ +¼9ÙÚ‡º½—¶×¼ƒÑÓ½’߈™ëéåØ×«‡“ÍjùסÁéêù×¼Ô¼ªăˆŸ;›¶éË”߈êç»§ºăˆŸ;ơú«ÔĂ¡È·‡‘×8çÁ̉«‡“ÍjơĂ›¾•Èû›ĂÙ¡Èè‡Ă©ØưÀ±»×Ơ°êØăˆŸ;ÁĂÙÚáêăˆŸù×°»½ÁƯÛ«‚ ½9‡Œçú™‰kß [ïSñÚ†ºµØ—ˆ¯ÜùÜĂÙáµØ؇¬9Úª‚ +¼9±»£äĐÓÓº™Ó܈±)÷Ú³ĂÙÙ½ívưÀÅĂèéÓÅٽ©ӺÁĂ…ÚרÓÆ߈¤ÇÚÀ¸Úù×ù×ÏÅ׿8߈ô¿Å™‰kß [ïS†ŒÿÚ¡Áºï½߈í—GĐÄê±¿á ³ƠŸ}éÓÇÖíÆëö‹ÈÙŒë*««‡“Íj‹ÔéÏÔÙ½­ÅÅØÏÔà=ưÀù×ñÚ¸ + ­Ä¬ÖÏÅù¿£äơÔ߈÷‡ºå̉ Ûºƒv˜‡¯G‹øº­ơ½ÏÔªÚñÆÛ×ñ’ñÓ£Øù׫»ñ½Ôơ»Ú×­Äçô‡ù¿Ơ³ºóÙ½ËÅù×Ë¿—ÚŸ£ÇÏ̉¯ÈÚºͽµØ±»¡ØơÔâôµÀÁ̉àĂHưÀơÔ±»’¹ÜN —Ö±»ù×¹ÚƠºmô¡ÛÛ«‚ ½9̀¬H‡xܽ·ä¹Úă깿¡ÓơÔÿ¯¶·‡‘×8çÿè½êö +µØ®Ó“Èâˆ;™‰kß [ïSĂÏÔ½ǽ¥‹öơÄăà«Ô‘ÆƯÓ ù׋ǣÜû«‡“Íj·Ô½¾‡´½̃ÄØß„ưÀ»¹à·Øû¿—ˆ·Ô™‰kß [ïS«‡“Íj½ĂÖ·ÅơêªÅ¡Á‰¿ÌĂÅØ¹Ú›Ú¾ƒÏÄ߈ÏÄÙ½ר¿‰Û«‚ ½9ưÀ™Ó§ÆĂÈ«‡“ÍjăˆŸ;÷Ú·Âöûù×™Áç½¥‰ÍL…Û«‚ ½9±»ăˆŸ¹ÚÛ«‚ ½9ăˆŸ;­ÄùÚÛ«‚ ½9߈ÿ¯¶ăˆŸ½ä̉&&ÑÓùêÏıëØׯ™‰kß [ïS߈¡È«‡“ÍjÙÅ뻺ÿ¯¶ùôÅÓÅ–Åàăơ†ºÎԃر»™‰kß [ïSơÔ’Ơ×ÿÚóÂÛ«‚ ½9Ü«»2ëӵ؛¾̃ˆ°Áù6ª»ï³2ëơà׺ÿ§Ù×퇗ӹ½™‰kß [ïSÓ‰~™‰kß [ïSă½›Ú̀Ó …ƠÏħôï陉kß [ïS–•ăơßÄÙ«‡“Íj©Ơ§ßµå«‡“Íj¤ˆ\0¾ß«‡“Íj›¾±¿Û«‚ ½9¬Ö߈ĂÈăêưÀÏÔˆ÷ÚĂÙ¾ëÓơêÙÚăơù×®ÈÍË)éÛ9¥ù×ö…»ª‡’̀jƠÅØ˜‡Ù½™‡µØß»û߈ûÓƠ½¥ ÀƯ°»…ăàÑÓ¿ôơêÅô¾ÏÅ™‰kß [ïSÍ’߈וƠXÓØ—˜Ÿ}½¹Ú£ƯÏÅÍĂơĂ“È ËûÇÔ×$½—ŒÙŒë*«½ÖÆø×Ÿ ‡9¥‡«‡“Íj­Ô¸ÁóÙÚÛ«‚ ½9“¹ƯNíÆ…×ƒv«&©Çƒ¾‘ÏÅ߈ôø¿ĂÙ½߈ăˆŸù×ưÀÏ̉9¥‡éÓé0ϺÙ½óÇÏÔæùש¼ÛׇƯöåơø×—¶“Ⱥ°»±»ëöÂï»ñÓ‹ÇăÇíÁ½ù×­Äă¼ÅÁ‹àº•Óù׵؃vÙ½á=·̃åôÓØÍË)éÛ9¥ÍÛÚª‚ +¼9¯ƠĂÙ߈ƒ¹Á½߈Ă¹ƒvÂ½ÓÆÿÛëö™ÔóߌÛ,í½Ï̉½ô½ÔÛÅăÇí÷Á±»á=ˆƒvăˆŸ;¹Ú«ÔËÇ9¥‡À¹™‰kß [ïS—Û¡ÔăˆŸ9¥‡ëöÏÅÇ€ÙÚ³ÈÛ«‚ ½9“Æëر)Ă¹ÚÙ½đÁá ‘±‚ÖÛ«‚ ½9ù׃ØơÔ«‡“Íjëö¹¶ë×ÏÔÁĂ¿Ơ±»̃ˆÏÔóÔ±»ƠóÂ߈ºyí¶¶µØÿ¯¶›Ú¡ÔÇÖˆëö¾‰ñÓ¶ Û¿ ÿ×ñÆ¿ô™ëéå½ÔăˆŸ;½çô™ëéå±»»ˆùêĂÙăơ釷‡‘×8ç¾ï½éê³ôĂ ߈ƒÖ¿ôÁƯ©ˆ¿‰›¾ÅÙÚăˆŸ½Û«‚ ½9§ÔÛ«‚ ½9áî÷Á÷ä½Ôù×±¾Û«‚ ½9™‰kß [ïS‡ºÛÄӢdz¾ª‡’̀j½“ºÛ«‚ ½9¥Ø½›²£Ç—»Û½¿ºù߈”Èúùꙉkß [ïS—ˆö›¾¡ƠÁ|µØ™Ó÷ØÎÔ°»›¾Ú׃vçÚÇÖù×߈ïpƒv¿‰µØăˆŸ;¼щ˜‰j̃ZîS½áƠ⽡Ա»æƠ߈£Ó–ôÙ½«·3uUщå·ù×ƯÚщùëöÍƠÇÖÙ½ÍưÀå̉ ¯È•€ÓÏÅăˆŸ;½™‰kß [ïSÛ×¹Ú™‰kß [ïS¹½ÙŒë*«߈ó½Ơ½ôÚª‚ +¼9÷ÁÛºù×Ù½ÿÛåĂÑӓƱ»™‰kß [ïSÍĂ«¼¿‰ù×É̉ơÔåôï»Ïg¯¾ÙÚä׫»±¿¥ˆ]1÷$÷ÁÚÀøêÏÅƠ¦ºûÛƠgéô§­ß»û‘‚öÁÁÓ»ØÁă±‡ÑØ½€Úº³·Ø›¶é¥Ó«‡“Íj™‰kß [ïSÛ«‚ ½9ÓØ±½ÁÏÔÜëöëö¶«â™ØщêØ߈ëö±Å‘…Û‚½ÍÓôêÁĂ·#ëö±»Á̉Ÿ;¼ơԋܽ…Ô·Øëö§Ôø¿·Ôívó‡ư“‡—»÷Á‚vëö™‰kß [ïS‡ÑÓÁƯ³Æï%ív9¥‡×ù×÷å5Ó5ùסÈëöÛ«‚ ½9›·ÔÏԣؕÓù×ψă»»ÄÍÓרñÚ£ôºĂºÚºÛ«‚ ½9½€ơèÅ“¼”ǻ󩺋كṿÇù×ù׳×ÅĂÙ¥ÇÙÚº‡ºëö½±»ñÖÑÓ‹ÙØ:÷ڳ¹ÚƺăˆŸ;k¹ÚÑØÑØ̉Æ^™‰kß [ïSƠ·×«Ôôêư܉s¡Ư¥%‹Ù߈ÙÚ«»ÜăˆŸ;™‰kß [ïSÀƯ©Ü‡ŒÇÖ…£­Û«‚ ½9ï̉ÅÏÔ‘Æà°»¦Æ ‰Ûö»‡Œ÷Á›¾«‡“ÍjăˆŸ;¼€½È »ÏÅ•Èû›ơê½ZƠ™»¾ûØÿ¯¶µØ˜‡™‰kß [ïSù×ÑÄëù¿ơÅêöÛ«‚ ½9«ĐưÜ™ëé婇¥2ßëM±»©Ó°»ç¢‡Û«‡“ÍjÍӡ۽ؿ‰µĂá¬߈™ôƠ½€ù×ôß»ûÅÙăˆŸ‰Á̉†ŒăˆŸ;™dĂ~ưñ“Ʊ»ßÖ‚ÖϾƯëöÚª‚ +¼9™‰kß [ïSÛÄÓù¿‰¿IÙ½±»ÍÓ߈ù×Û×å̉ 9¥‡ûÓá ùתdăˆŸ;ϺăˆŸ›¾•îٽŒă½éôùêÁĂÛ«‚ ½9²º̣¶9¥‡™‰kß [ïS—¶·ÜƒvÊÖ½¾‡¾¢Ç¹Ú‚vĂÈ«·3uUÏ̉¥àëöß*¹Ú‘ÉÛ«‚ ½9™‰kß [ïSăˆŸ;ÙÚ¶ÔĂÙá ³Øׯ÷å5Óª ¶ 2 t T ½ƯÓ ߈ëï¡»“ÛçÚëëö“ºñ‡©ÜÏŃˆĂÙÏŧH«·3uUÛ«‚ ½9³–öơûÙÁƯÙÚרáǼăˆŸµ.¥Ù«‡“Íj÷¼¿ÏÅ£‡×Ó›¾µØÚÀƒv×Ä̃Î÷‡ùê×Ơëöƒ×߈å׺·Åµ!º…ÜÂÙ +ׯ½€‡Œø× ÿ¯¶ëöÁÛ„ôư7îºíº¹Úä̉«‡“Íjñ׃ÖƠX™‰kß [ïSơêÛ«‚ ½9›¾ñÓ‹Üß»û™ëé奈]1öÙÓÓÔưÀŽ÷Á¹ÚưÀÚá Ù̉½«‡“Íj·‡‘×8çĂÈ₫«º›¾Ù×Ö‡¼7‹Üº¿Å›¾ëÓ‘Æ·‡‘×8ç9¥‡Ù½Û«‚ ½9Û«‚ ½9±»¶Üƒv§Ôí—ǴÁ™‰kß [ïSÏÅÓÅù×èơ“‹ÜƠXñÖŸ}™ÓÏÅÍ?ù×ÿÛÔX ÁƯ“È©½ù×Ư’½€ÁåÖ8¤‡Ö›Â½ñÚ÷‡ơêÇĂ¹Ú›ăÇí­Äƒv˜‰j̃ZîS³¿‰Î̉Ö¼ëÓÁƯĂ‚v™‰kß [ïS±»äÓÆơ²é‰ñ5ñ·ØÅêñÓ­½¼ù×é‰ñ5ñ·Ë̉ù׭ăˆ9¥‡ÑÓƠXƯˆ±»ÏÔƯ‰߈×¾ÛÚ•K±»°»ï½¿»·ÅöûÏÚ±½Ươ£ ­È™‰kß [ïS«ÔưÀ¿‰±»ĂºÁÅƯÓ ëöÛ«‚ ½9¸®¼å̉ ôËÓ¶Ô¹ÚÑÁÏÔç‡Ü»öÁÙÚÙÚó–ï»ëöù×Ù½ÏÅÙqÆ÷—ˆôêù‰ù×¹¹à¡Ô߈Ùͱ»£ä®Gøÿ™ӃיÁĂ½ơèÅăˆŸÏÔ纋Çù×™‰kß [ïSƒˆ™‰kß [ïSùôÁƯÙµ—áùסÈÙ½›¶éµ!ÿ¯¶“¹ƯN¿ņÎśڟÅù×±»­¾…ñÓÜ™‰kß [ïSÙÚéӷ‡‘×8çÏ!íÑÄë²¹ù´‘øùדÈ߈߈ù×ù×߈·‡‘×8çßÁưÀÛט‰j̃ZîS¿‰߈ÅÔù×±»ÁƯÛ׿ř‰kß [ïS×”÷Áƒ¾‘ÏÔ¯¼‹ÇƒvăˆŸ«‡“ÍjÛÄÓͪ™ÔÅØƠÄÅÄR §ôó¾ϼ•ÇÑØƠ¹ÚÖ¾8“¹ƯNÑ\ï‰ßÁö¤Øå¼ ÁƯ˜‡…Ơ«‡“Íj¿Ù¡Ơë$ƒvͽÅØƠưÀÉ̉ËǪÚ=¢ä×Ơ†7§jù×ºĂÆ̃ˆ‡Œ»Øÿ¯¶°»øêƒœ̀ÇƯº¯È•Èû›±½½‘Æ߈ŸÄĂÖ¡Á·‡‘×8çóÇ›‰“r…»±»‘ƽËƠÏžù¿ëö½ÿÂÛ«‚ ½9‹ÇÙ½ơÔÙ‰ÆëÓ8¤‡ûÓö‡º•{ơï×Úª‚ +¼9ÁÙÏÅ™‰kß [ïS›¶éé¹Ú9¥‡°»‘«ºº™‡•îƠù×£Ô«‡“Íj³¹~ÔXÊÓû¡±»ëö½̀ßúÏÔÿ¯¶ÿ¯¶‹ÇÁỰÇăˆŸ;óDZ”çỤ́Ô«‡“Íj‘ÈÁƯơÔ™‰kß [ïS½ưÀ¹ÚµÜ³±»ëÓÁÛ«‚ ½9̣¡Û™‰kß [ïS˱¡ƯÏÅöä5̉çÚºơéơÔ«‡“Íj¹ÚôëöËÇÏ̉ỂÛ×÷ÚÛÄÓ߈£Ôà­¥Ûï³2½ºÇĂ¹Ö«‡“ÍjÏÔù¿ßÖáß™ơ™‰kß [ïSƯơ߈ÇØÿ§Ăù×Û›¾åĂï½ÏÅŸ ·Åƒv›ÁË¿›¡ƠÚ߈Ó‡ÇĂÈù×™‰kß [ïS™Óù|ëöÙ½»ô­ØÏÄĂÈöÁIÙ½ÓÔ«ÔÛ×Û«‚ ½9ù×ñÚéÚñíÈơÅ߈û¯ëöỞăˆŸ;kß»ûœÜ›¶é×Ü„Ú߈±»·Å÷}ăˆŸøàßLJñ5ù×óÔÓ̉ưÀÙ–­Äå̉ Û«‚ ½9ÍƠ„½ûÙ¹Úă½ơÔ“ÆáêĂ½µØ±»½¹ÚÛ׋ÇÓ ‹›æÿâƒÖ9¥‡úÖƯÓ ¿‰߈˜êèä¡»±éÅØ‡ÓµØÇÖÅÓͼñÚ™‰kß [ïS‚vËÉ9ïÚëö˜‰j̃ZîSÙ½¥Ûù×—¶Ù»«‡“ÍjËÓÍBŸÖ™‡­ÏÔ½»n¡Û›Ë%§ƠñÚÙ×ßÏ™×ÑÄëÙŒë*«ÇĂóÂæÚƒÔѶµ†¹Ú›Ú²+^ăêµØ8¤‡×ơĂÏÄ«‡“Íj¡ƠăˆŸºÁ±½ÇÖÏÔ™‰kß [ïS±¿ËÓ½ô½9¥‡ÑØçôÇÜĂĂ¡ÁơÔ¡ÛÛÄÓ¯Ûă»ÿÚÜ ĐÓµÀùêñÛ©‡¥2ßëMɹÍ屿°ÅưÀ߈ưÀëc¿‰߈à óÂâàëöµa¶÷Áùׇ™‰kß [ïS«‡“Íj£Œ…³àù׿‰ù×9¥‡ëö÷‡öăˆŸëö߈ß¹ñÓÛ«‚ ½9éôé•×û؃ˆÍÄÏÅ«ÔËÓÆĂÙử™ëéåÁ½˜êèäÇÖÿÚÑÓơêùê«Û››ăàù×½Øù×ûƠ±»½€Û«‚ ½9߈ơê­¾ơê§ÔÛÀóƯƒÔâˆ:k•Œù×›¾§Ơ™Ø§Æöơêö‰¿IÙÚ‡Ç8¤‡Öơê©ÇÛ×ù×™‰kß [ïSñÓÅàÛ×̀Äĺ µ/óÂ’¹ÜNßƯôêÙÚÚª‚ +¼9ÙÚ™‰kß [ïSœÁ…ô¥ÇÏÅŸÿÚù¿öæ̣̉Æùט‰j̃ZîSăÁ“ŸûƯ³¹ñÓÏÄ8 ¤‡ ×ÈóÄăˆŸưÀ¹Ú½ôï»É̉9¥‡ơÔ¿ÓÙÚ†×éê£ä“Ơư­Û«‚ ½9ó½ĂÙ÷ß¹ÚÆ™ÁÜơħщö×¼ăÛëÓö$“ÛïÂÅ ÁƯѯ°¿†Çø×ơØÏÔÙ÷ÚƒˆƒvÏÅÇßÄÙƒ½ÏÔ³ÈƠ„Ÿ™‰kß [ïS« ©ƒ»5³ôÙÚÓ̉ÙÚñ·‡‘×8çÏÔ“ƠÏ̉âơ˹ëÔ÷‡ÛêôÖ¼¶ÿ§çÚµƯ™‰kß [ïSÁ¼ÍÓרÏÅÖ̉Û«‚ ½9ÛÚóÇ­Îù×—»߈Ù×ăˆŸ;óı»ÑÓÓº¹Ú¡©¼»Ø™‰kß [ïS©ÓÀ½‚v¾ºÅØ©ˆ°ñĐôÛ«‚ ½9ª¶2tTđƠÑÓëÚÁƯÏÅßÚ¿ôơÔưÜÁƯƒçÚÿ§±¿˹ƒ½›¹ÏÅëöáềÄ)å×–ˆ™Ó«Ôù×ÏêµØ£ÓƯ¾íÖ™‰kß [ïSù×ÓÆ«‡“ÍjÅ“½ơèÅÅ–¾ϼĂÙ½¯Ơ·Å߈÷Á±»ƒÖÛ«‚ ½9«‡“ÍjéÚ÷ÁºÛ«‚ ½9ÅØ¯È½€Ï̉ËÇä̉ûÓ€Ơ„‹Û߈»ô‡ºÿ¯¶ăˆŸ߈Å–ͼ÷ˆăàÛÅ½ăˆŸ;ù×…ÔÏÄơèÅ™‰kß [ïSăˆŸ™ÓÁË™‰kß [ïS«‡“ÍjÛ×êö÷Á®̃ˆ±»©÷$¡Ôá=߈™ëéå§ÔƒˆơỐv +‰¿IĂȷʼn¿I°»ăˆŸ;ĂÙ¯ÈÏÅ«»¿º±»ÑÓ‡º™‡ÏÅƠƒvÍË)éÛ9¥¿ô‹Ç©Ó—ÓĐl©Ç¤ÛĂÙöÁëöÛ×÷ÚÛ«‚ ½9ËÇå̉ ÏÄÍÉÏÔăˆŸ;»c½ăˆŸ;Á½Ï̉͋ǡ۩߈߈ÏÅư¬Ö«Ô—Ó¼߈Û«‚ ½9˜‰j̃ZîSëöĂÖ¶¦D ߈ÿ¯¶ÁƯ­Á›Ú«‡“Íj³Ë£à±»Å$“Ʃӱ»¯G‹ø•뇅&Ç̉§Óމ¿IŸŒÏÅ«»ƒØ /çÚä̉°»ơèÅ÷Úᕦ«‡“ÍjÔÛ«‚ ½9G½¹èơÍÓÏ̉™‡ăˆŸơÙÿ¼©ËÓâê÷‡Ơ¥á=ÊÇäô½åĂù×’¹ÜNù׳ÂË̉ƒˆØ×ù×Ù̉ôĂÇÖ£ÇçÚưÀÁƯöÏÔ¯¾âˆ;‹ÜÛ«‚ ½9êöâơó߈Ú¼€²º̣‚ ›¾¯Å™‹ÛÄÓƒvóŸÍƠâÁ±»ëöáê”ÈúăˆŸ×¾ë™H³ºó‹rå̉ Û«‚ ½9ƒˆ˜̣æº öĂÈ«»ÓÅóÇÑÓé½ñØÏÔăˆŸ;¹Ú§ƠÏŽÖ$‡ÇµØ÷Á÷¼ưÀ«‡“Íjų Ç¶ƒ×æƠÁ̉­½¼ơêÎ̉½Úª‚ +¼9·ØÛ«‚ ½9đ—¶‹Û¥‰ÍL…“½±»ÉÖ†¹Ù½ºù¾…à±¿ÓØψ†× ÁĂ»Ø÷Á›¾ưÚ“¹¡Ôщ±»·‡‘×8çÙ½g…»Ï̉ăˆŸ;á,ù×ÏÅÙÚù×ƯºÛǾ³Èç̉“ƠÏÅ©‡¥2ßëM±»§ÈîÔÉ̉ù×Á̉ö«¯‰¯0ѶÓÆºéÓƯ‰÷Ùï»±»ù×ÙÅë±»ƒv ƠÿÚ©Óá=íÀÜÓ ¡ë™Óª˜‡ÙÚù×ùꃈ‰bÎ̉°»¿‰™‰kß [ïSÅԻءԷ‡‘×8çûØ÷ˆ©Øăà©Ó·Ô–»߈›ÚƒÚù׿ߙ‡û(ÆƯÓ ·ôơê“ỚØÿ×›Ú¥Ó§Ôÿ¯¶™‰kß [ïSµÈ¯¾ßÄÙ9¥‡çô߈Û«‚ ½99¥‡­ÖÜăˆŸĂÙY½ô×Û¥Ö«‡“Íjÿ¡Áùꙉkß [ïSÔơ9¥‡êÓëöÏÄ¿‰…›¾‡ñ5ó¥àÏ„½ÆÓÁ߈éÓ’‡Œ‡Œáܱ»ívŽëöêöéÓ‡º«‡“Íjå̉ ߈‰¿I±»ù×ó.ÑÄë¡Ûèơ¹Úù×ưÀë$ÑÓ‹Çŵµa©Ç™™‡½¡ÈơèŰ»›Ú’à߈ÓnưÀжۺͭH¿Å¾¬Ö±»߈߈ÿ¼ÛÀÛ«‚ ½9 Ơù×·‡‘×8çÏÔ—¶ö…»£ØÇÖß»û¸Ú÷Á™Ó÷Á£XÏÔ—¶“¹ƯN¿ô™‡µaƒvÏÅ«‡“Íjù×ơÔ¡Á¾Å°êØ™‰kß [ïS“›Úù꿉ÁĂÁ׫‡“ÍjׯŸÅ¹ÚÙÚ…¼¹ÚÏÔψ‘Æ¿‰ñÖä̉â½Á盡“Ơ·Ó ¥0°» ÷‡ơÔƠù×¼ÏÅëáĂ«‡“ÍjÇÙÚÛ«‚ ½9¼¿‰±»çÇăïĂèÛ«‚ ½99¥‡×…Ûù×­¿Ñóܾ«‡“ÍjÛ«‚ ½9¡ÓùסԱ»™‰kß [ïS÷Ái۱»é‡™‰kß [ïS‹È©ˆ±»ÎÅ߈ăÁƠœÇØƠ±»ÛÀ™Ó‹ÁÏ̉¥Óùׇ9êö™ÁùêæÚ₫®¶Áçә‰kß [ïSëÔߌÛ,ÿ¯¶±ĂŽ́vÚºÁ×­¾ăˆŸ¥‰ÍL…áê8¤‡×íêív÷ˆÛ×Û×ëöó×½›Ú߈£»¯¿¿‰ÙÚƯºăˆŸå̉ ¿¹«·3uUÙÚ¯Èáç«»¡™‰kß [ïS¿Å߈¡Ûû(«ºçºÙ½߈£ƯåưÀÑÄëÛ«‚ ½9±»‘̣Ơ—¶«ÔêöđÓ÷ÁơêƒvµØăˆŸ;k™Á³ŒÛ«‚ ½9‹ÇÙ½ăˆŸ;¡Ôêö߈ŃÔÓÓ†ºưÀẳà «·3uU©Ó¶Úª‚ +¼9¿‰ÅØăơĂøë Û«‚ ½9™‰kß [ïS•ÖÁßÚĂ›¶é½ Ç߈°»™‰kß [ïSƯéơ¾°êءȷëăˆŸ;§ôưÀƒv»½•·•«‡“ÍjµØ¯È«‡“ÍjÏÄÅÁĂÙÙ½Y‘È—§Í»ï³2ß„·‡‘×8çï'±½µØăˆŸ;ß»û¯÷Ú½€ÙÚù×ÿ¼Û«‚ ½9ÏÔÿ×ÙÚăáƠX¥ˆ]1ȽÍÓưÀØÚå̉ ¥ƯÁ¼×¼çÚ½€ƒëö—ˆåºËÏÔÿÚ™‰kß [ïSÙ×ă¯»©"ËƠơêñÁ›¾² ß„¹Ú¥ˆ]1“ăˆŸ;ùÜơêóÇÓØÙÚùׇxöƒv߈öØ9¥‡¸Ú2™‰kß [ïS‹ÜÛ«‚ ½9ñÄüÀ½­ÔăˆŸ;Û«‚ ½9·Ó ¥0ù×ëöí‡ëÙ̉À‡€è/Ö:çÚëöסۦº߈¿»ƒv癉kß [ïS9¥‡ÏÅŽù×߈ÑÓơ³à‚ơÔĐ·‡‘×8çÁÛŸĂ£ØíÖÙÚç̃ßÄÙ釃Öë‡ÅÔ÷ÁƒˆưÀ¡ăÑÓ¶̃ˆ߈ë×­ÄËÓ‹È«‡“Íj½€ø×•%Á¹ Ơ,«‡“ÍjƯ¼ËÖư‡±ù1Û«‚ ½9™‰kß [ïS••«»™‰kß [ïSÏÅ«‡“Íjÿ±»€º̃ˆß»ûÛ«‚ ½9¾Åƒv÷ÚíÜƠ™ÔưÀ§¹¿ôûÓßÁ8 +¤‡ +ÖØ˜ô¿́ăˆŸí·‡º×ÛÙ½ơ´ôÏÔµØù×9¥‡ív±»«ÔăˆŸ;ö§]¡Ô߈¡ÔáêƒÛÚÛ«‚ ½9©Ç›Ú“Ù½ÍÄÑÄë‰yÏ̉¿‰«‡“Íj–Œ§ăˆŸ;kĂÙăˆŸˆÇ·ÔñÖÿÚ¾Ư‰ùׇx·Ü‡º÷ÚËÉ9ÅÓ™‰kß [ïSƒv¦ÓăˆŸ;k±»±ÅÔ¥¾ßÚö$ÛË·‡‘×8çºç'¡ÈƒvÛºù×̃ÄØ™‡ëö¥Ó—ÖÿÚơêÛê—ˆ»Øó¹—Ó8¤‡ƒØïű»ÏÅ߈߈‹È±ÎÅ·̣9¥‡ăˆŸ;k™Á¯ƠĂÙ›¾8¤‡ñAÿÛÍ»óÇщăÇí½‹ÓËܯG‹øăˆŸöÁ‡é/×:Ï£óÔÅ«Óù×±»ÏÔơê®ô¸Úö±»đÔ‘ÆƠ&Ó¼«b₫Û³ÂÁăˆŸ;¨¼ÑӆLJ¡È»Ø…»Û«‚ ½9ù×íÚéêƒP߈±»Û«‚ ½9ÿ¼³ÈÁƯơèŋ܀-ÍÇÔ½“ÆÿÚÛ«‚ ½9bÅÓ߈G½¹ß»ûå̉ §½™ëé凌·Å«·3uU§Ôơê¾ôÜÂû™ôª‡’̀jƒváÛñ¡Ó¡Áơê¡Èù×ÍĂ·‡‘×8çăˆŸƯ«­™ÁôƯÚĂٓڵ؛¾™‰kß [ïSù×ăˆŸ½ÛÄÓùל‡¼ôß»û±»Ơ»±»ËÇ¡Ô5’Æơê¹Ø‰¿I¹Ú9¥‡â½±»ÏÔ¥ˆ]1—Óù×§¹­ÄÉĂö߈¹Úù×ÑÓÉ̉åĂơÙ”ÖăˆŸ;Û×Û«‚ ½9µØơê¡Ç¾ỞÍÓíÆ›Ă½ÓÆĂăˆŸ߈‡Á½ëÚ£»ËƠÙ½çÚÿ×̉Ø­¾£îê`ăâ¹ÚƯuÀ€©ÀÙ×¾ù×ñ£äéºÍBÖÔ†6¦jăˆŸÓµ²º̣ÁĂŸ½‰yרØÂÙ¾·ÅÛ«‚ ½9‹Ùù¼·ÔêÚ +ăˆŸ;™‡™‡Á‡é/×:ÿ¼¡\™‰kß [ïS§Û¡ÎǺƠ•Èû›ƒéÔË̉‰¿IöͰ»Ø±»߈×¾eơ꫇“Íj÷‡ăˆŸ¸Úÿ¯¶«‡“ÍjÅ»·ÈËÜÛ×ÏÔ½ôơÔ߈Û«‚ ½9«‡“ÍjÏ̉ÿ§Úª‚ +¼9¡ÔŸÖ߈±»߈߈ñÁùôö±»Û±„øêĂ¼º½‡›¾°¿*ơê‹Ü߈«ƯÑØÏÅóÇ“ºƒ«·3uU×$ÿÇ÷Á·àÛÔù×߈ÑĂ™ÔÛÀÛ«‚ ½9©‡¥2ßëM«‡“Íj¥ˆ]1åô½ôêƒvăˆŸ;k·Ô߈ƒv½€߈Ê%±»™ơ›Á÷Ô«‡“ÍjÚ¡ÈÛ«‚ ½9ÚÀ±ëØñÄøæ«ºáëöÀ ŸÅăĩǹ ©‡¥2ßëMËÇûÙ̃ΡÔñÍÑØ¥Û÷å5Ó«âơèÅÑ`«‡“ÍjơêÛÄÓ§Ó÷‡½ôăÁ“Ơ‘ÛÙ½›¾”¾ƠX·‡‘×8çÏÔ÷4ĂÙ™ÁÙ½Ơá ù×öÁ©ƠÙÚß»û߈™‡8¤‡ÖỊ́¹ÚѾÑÓÙ½ƒˆÓÆÓ؆×ĐÄê«dƯÓ ƒÖñÚÛ«‚ ½9½ĂÙ“Æï½ÏÄAÙ½ưÀµØëö߈‡¿›¶éñßÄÙ›¡ÅØ©‡¥2ßëM½€¹Ú̃„‚רÍË)éÛ9¥¹ÚƠØ·̣匿NƠăˆŸ;« ©ƒ»5Úª‚ +¼9ÏŃv‚v½™‰kß [ïS8¤‡‹Üù×—øëÚ$1«ỒÊ)èÛ8¤ßÄÙÿ¯¶ê¼ø×ñÓ›¶éÄÛ«‚ ½9ƒˆËÉ9óÇÚÀ$‡Œ€º½É̉߈ù×½¤Æ•´Üû¼×$±»‹Ç³å߈¢ ăˆŸ;ÿÚ°¿ưÀƒv‹Ü¶Øçơê©ƠÎÅ«½™ÁØÓÿÚ«·3uU߈öÁưÀå‡ÅtÖ¼ơv¿‰©ÓóĂ˜Ó«‡“ÍjÿÚëö‡ŒóÇ›¾¯¼Ë̉‡ç'£»߈±»×Ü߈Ńvû(߈μN¸Úͺ«Ô¯¾ĂÓ±»Ù½¯Èɇ™‰kß [ïS¾—ˆ½Ï!í߈ëöá ëö±»ÍÓ¿‰ŸÖƒvÂÎëö8¤‡ăˆŸ;ŸÅ‹Áƒˆ¹Úƒ¾‘ăˆŸ;ăÇí·Üå¼ ơèÅÅÓÛ«‚ ½9ăˆŸ;k“‰3Ơ,ù‡x¹Ú¢»…»¯ÈưÀƒÖ·Ó ¥0ÂÙ±»ơÛº¡Á«‡“ÍjÙ½›Úæ$ù×ĂÅØG½¹«‡“ÍjưÀå×ÛºÛ«‚ ½9å̉ ăˆŸ;º¿‰ÓÁăà·̃›¾ăˆŸ;ψƒˆù×ëÓƒv—ú“ƠĂ“ƒvÏÔÙÑÓ±ëØË̉ƒÔ†ºï»Ơ™ëéåÆĂº³Ôÿ¯¶߈ëï½ËÉ9ĂÙ÷ÁÏÄơÔ·ÅÏÄÁ×Û«‚ ½9…ÖÙ×ù׃Öăે“Íj¡ÁÓ½¹Ú™Ôù×™Øù׫»ƒˆăơ“Ơ‡Œ‰Û­Ö™ÁïÚ×Ă¾ÀƯŽ¡Á«Ô±»ăàÏÅ“½ɇ9¥‡×ëÔñÓơĂÉĂÏÔ߈Ï̉©Ó‘íáôêƒv½ÿÚ«d¬Ôۙ‰kß [ïSíÖÙÚÅÓ¨‡(¤2(€(̃(ê(L((›·ÔÏăˆŸ;Û«‚ ½9™‰kß [ïSö‚v·¦D רÙÅë­v×ơ‡ź±»çÚÙÚ¡»™‰kß [ïSÍË)éÛ9¥—¶½ôăà…Ưö™‰kß [ïSË=•Èû›¶»cƒvÛ«‚ ½9óÇăơÅÔ“È™‰kß [ïSö÷ˆ‰ß‡x‹Ç¡ÈØ×÷ˆåŒ¿N匿NóÇĐĂëöºÙÚ9¥‡µØöÛ«‚ ½9©‡¥2ßëM›¶éÀ̉ ‡ăˆŸ;k½È—¾æÆÙ̉ÅÓöù׉y½óǹÚĂÈχÅÓ«ÔÛ×ëö÷‡Ó̉gŸÅ£ØỔ‚½ăˆŸ;éêǽ“™‰kß [ïS¦ÔÂĂ½‡ºÂïÁ«‡“ÍjƠËÉ9óÂëÔâùæỞẳ›Ûăà“ƠÏÅ¿ôëö‹Ü‡ÛëÇ™Áϼ…ÖÙÚ½€•Ü÷ˆÛÄÓơÔÿÚ±»ºÊÖå¿ơêÿ¯¶À¼å̉ ÷±߈¯ÓµØß»û“éÓ­ÄÛÚ“Ơ߈™‰kß [ïS™‰kß [ïSÛºÙàÇÖ̃ŒÚ,€º°»½ƒv½©Øùê²ÄÁƯđÖ«‡“ÍjÚª‚ +¼9¾½Øµ.¥Ù™‡ưÀăơ9¥‡ÂÙ‰º­ÔÍÓ߈¹Ú½«·3uU©ë›¶éÙÚºÙÚăˆŸɇ½±»…ØăˆŸ;³Â«‡“ÍjăˆŸ;kŸ}­Ä»‡ÇưÀ—Û«‡“Íjµ†å̉ ùôơĂơÔ‰yͼ»‡½µØºÇÖª¼‰¿IÑÓó¡ԕ½Û×ÿÚ£»ƒ½§ôÏÅ„nù×ëöĂÙƒv«‡“Íjùº³³Øù×»‡ù¿ôöïƠÏÔ4 ăˆŸ;k©‡¥2ßëMÛ׫‡“Íj±ÁÍÓÛ«‚ ½9Ă¡ÄăˆŸ;¹¼âÁƒëöÏÔï ߈èÚÚÀÏŃv©ºÑØóµa‚v«ÔS߈¦Ô—ӽ뫷3uUͽÏ™ñëöăº¶è¾ÑÓÑÓ›¾߈¢»߈…ÛÁƯÙ½̉Ńګ‡“Íj·‡‘×8çÓØ‡œÜåĂ³(§ÔùêÉ̉˜‰j̃ZîSËÉ9â¶̉ƺ~߈ñÖÍB߈ÅØ¶¶ù×°êØù×ɇƒö±»½€9¥‡›¾ÜåĂ÷å5ÓƒvÏÔ¤ÛßÄÙ¾…ØÙÂÓ ÏÅù×ăêÏÔû¼¿Øÿ¼“¹ƯNăˆŸ;±»Ànjۺëö½£äăˆŸ;ÍÇóÇỞ̃ôơÔ·‡‘×8ç±»­Ø߈ùêÛÄÓ¹»ƒ½éÔƒĂÑØÏÅÏÅᬛ¾–»Ïí­¯lÏÔùêíÖ‡%¡ÁÛ«‚ ½9‘ơ¬Ä›v߈™‰kß [ïSçmÓÆëºÙÚ̃ˆ©‡¥2ßëM½ÔĂÂĂ凉̣‚ËÇÅØÑÄëÓÀ½ẳåƠëọ̈¶ +«»ÏÅóĂĂÙ¡ÁÛ«‚ ½9¿ôË¿ăˆŸ;ß»ûµØ¯ü̉Á/«÷±»ƒˆß„Û«‚ ½9ØYÛ«‚ ½9ï½ÛÄÓú)÷Á×$ùº…ǤۗŒăˆŸ;‘ÆÁ9¥‡ÏÔÛºéºăˆŸ»¼‘G½¹ͽ—ˆ¼ÿ¯¶äÖƒÖ¹ ÷Á÷‡ÑÓÏÅívơê±»ăˆŸ;™ôۺ罸ڋܿ‰›¾¹Û÷Á¡Û—¶©Óƒˆ±»߈âˆ;›¡ר±»—¶ÛÄÓùꓼ›Ú¹ÚŽơ›¾›¾ÏÔ©&çôùê­Ä»öÆ©‡¥2ßëMï½ÇÖÁƯ½‡ŒùêÅØ½ÅÔ˰ÁĂùê­Ø—¶±‡ơÔ™‰kß [ïSºÁ²º̣«â߈¡ÔÍÓ‡ŒßƯ½Û×ÍƠñÚăˆŸưÀéÓûÓ¿ĂÈ8¤‡Ẳ˹Ö¾ù×ưÀƯÓ Åºy¯k™ô…Á߈ª»ỞÙ×ä̉ÙÚ½ăˆŸ;¨Ø¡ÔơÔÅï½½Ô¡Á÷Á9¥‡ÿÚăˆŸ;ØÜÑӳȿßóÇÙÚ™ÁÁí?ÀĂáơÄÛ«‚ ½9щ—Öœ‡®ö ¬¹Á½ÑĂÛ«‚ ½9ƒv9¥‡ăˆŸăˆŸ;ÛÚå̉ Ÿ}9¥‡ëÔ龇Ç߈ăˆŸ;±»ñÖƒvÛ«‚ ½9ßƯưÀ™‰kß [ïSÛ×ÑÓÁƯÏÅ¿‰ëööÔƒv½ñÄĂÙµa„'©¼µa°»éêéê«d߈ëöÅØ‡ƠÂÙÑ¡Èç̉ă©ÇÙÁƯ¡Ûçƒv¹£¹Ú¡ÔÛ«‚ ½9§Ô³z§Ó¸ÚÙ×ĂÙÙ×%ù×Ï̉¹Ú¡Ôù¾½³Û߈é‡ÏÔÛ«‚ ½9çZ§Ó…£­ÏŇÚùêÁƯ¹Úƒv°½™ØÓÅ—»߈±¿ưÀ¡ÛƒvϺÅô™‰kß [ïSÑÛÛ«‚ ½9·¼Í7›¾ÁăˆŸ;k÷ÁÛ«‚ ½9¹ÚöơÔ«‡“Íj¾±»º·‡‘×8çêö‹ÇËÉ9· «ú«‡“Íj÷ˆ­½¼ñÖ›ƠÅô߈öר‡¿­µ·º±»Ơëö’¿ÅÅô߈Ó̉³È퀓ÆÙ½Å°»‡x½ëö¿ÅáøëÓ™‡Û«‚ ½9ƒv€ÇÓˆ•=‘Ú×ûÀÙăˆŸ™ëéåÛ«‚ ½9Û×ÑÄëûÓëöщÏ̉Û«‚ ½9¡¼ß%¡Á±ÛûØ«ÔÛ«‚ ½9ƠιÚÂÙĂÙÓØׇ½7¹Ú—¶½ỞăˆŸ;Ž”÷%ÙÅëơê›ԃv™ơÅØ¥Ă™‰kß [ïSï«Ô»ÓÛ«‚ ½9­Ô°» ¯¼¼·Ø¡ÛƠ²”ÈĂù×߈Ù½±»ù×8D¤‡DÖ çº½»ăÁ»ØçÚÓºÁă±¿ÿ¯¶Ü§ºéêÏÔËÖß»ûÇè‹Æ.›¾±»́‡ºÁÓóƯ™‡Ù™»¿àÁƯ™‰kß [ïS‰¿IóĂßÄÙÓÁߪÿ¯¶áế±»“Èï»ù¾áêï³2߈‹Ó·ÔÛ«‚ ½9©‡¥2ßëM³ô…»ïÚÿ¯¶ÑÓÙ-ĂÙÛ«‚ ½9Ǻǽ¶èĂÙׯÁƯ߈½€Ù½™‰kß [ïS´†ÏÅ­Rơèű¿Ù½ÏÅĂÙ»y«‡“Íj“‚v¬¿ơÅ­ÖăˆŸ;¸Úƒv‚vï»½ăˆŸ;·ôÿÚ«‡“Íjͽ¡Á÷Á³Û«‚ ½9ßÄÙ³±»÷Á¯ÈôçÚÚª‚ +¼9ÑØáƠé‰ñ5ñ·³Ơ Áăºù‡ׯ‡x‰y«·3uUíêƒÔü ¦  † ¿‰¿çÄÓ-ĂÙƒÏÓăˆŸá½ô¾ºÍË)éÛ9¥À½‹¾ÿ¯¶¹£ÅÄåĂ™‰kß [ïSÙŒë*«’ºÏÅ߈·‡‘×8痾юÏÔƒˆ«·3uU‹ÜÙ½ÙÜÏÔ™‰kß [ïS•½—¶‡xÙÚöÁ°¿µØ¿́ô$«Ôù¿œÁëö°¿߈Û½÷ÚÎÄơêé‰ñ5ñ·©í‡›¹¿»Ù½&߈ø×°»«‡“ÍjăˆŸ;Ú ª ‚  + ¼9 óÔù×ÏÔ°»ƠºmÅÙÚöĂÖÏԕ֓ƋǻŠÁÛº½ùæù×ÁƯͼ÷å5ÓĂÈăˆŸ;™‰kß [ïS‡Ûñ¹™ ·‡‘×8竇“ÍjŸèÛ«‚ ½9ÓŹÚù×ÛÇÛ«‚ ½9ŸÓ±»µy¯ÈăˆŸ;©Ç©,›øï»ÛöÅØ ÁĂÙƯÓ ëößÚÿ¼½ÿ‡±)ăˆŸ;»níÁ¹ÚÇÓăˆŸ÷ÁăˆŸ;ëö«‡“Íjù×Ç'ÄôăˆŸ¹Ô›·Ô™‰kß [ïSăÁÑÓÛ«‚ ½9‹ÇÆÓÅ»™èăˆŸ;›¡±»ÙÚ‰¿IÀ½öÀƯá=±»®¼ÛÀŒ₫ÚơÔƒv® +±»…ƠßÚ™‰kß [ïS»ëÓÑØÛ«‚ ½9ÑÓÚª‚ +¼9ù׿íºơÔ«ôóĽ«ÄˆÇô¾Å•Èû›ÏÔ¾8¤‡µØ°»"û(íÖ†×߈ÛÅôµØ˹Úª‚ +¼9ơYøê ñÖ«‡“ÍjơÔ›Ô9¥‡×ËÉ9¬Öÿ¯¶‘ÛǺƒvÛ«‚ ½9¸£q«‡“Íj½áêÏÅÑÄëù×ËǦØë߈œ·̉ ¤0…½ơèž·§D ·ÔĂÙÿ¯¶߈ÏÅ­Ä›¡‡ºƒ¾‘½€½ÎÅùêÛ×÷‡—ˆù׳¡hóÔ÷ڿŧÆ÷ÁĂÈgăˆŸù×™‰kß [ïSă8¤‡éÓ“ÛÑÄëÛ«‚ ½9ăˆŸ¯G‹øÙÚ›¾ÍË)éÛ9¥Û׫‡“Íj¥ˆ]1ívăˆŸ;‡ñ5ïiƒv̀Ê)èÛ8¤ßÚ³¹·Å߈‘ơĂÙƒˆơĂ˜êèä­Øù×Á‡é/×:ÿ§“ÈÅÔ±»Ù̉ÅÔù׆ÚÙÚ›¾ÙÅ뛶黽ëöëöÙÚ¥‰ÍL…ƒëö±ÁóÔĂºµØ‚½߈¿Øº Ö†‡ü2±»߈¼Û±̉‡ƯÓ‡‰¿IÁƯ±»œÁ½ÈÏ|•Œ«ÄƯÚ·‡‘×8ç÷Á߈gÁ¡Û›¾ÇĂ³¾Ù½ƒv§ô·Ó ¥0Û«‚ ½9»ĂƠщ›¾·‡‘×8竇“Íja‘ăˆŸ;߈·ØáƠ‹Ü¿‰«‡“Íj¯ÈỜÓƒˆµaù¿…»߈ƒv߈±»æÇ!ÛºÍÄÄÅÑĂå̉ º¡¡ÔíÆÏÔ…ôéô€ºË¿íÖ•íïÚ¹½ƯÓ ‡“Ï̉¾Ù½ƠëöơÔÓ¼߈½ÓØíê«Ô›¶é¹Ú›¾™‰kß [ïSÛ«‚ ½9ù¿Úª‚ +¼9ÁÛ¢Ô«»æÇ™‰kß [ïS«ÚĂÙËÓßÁ³×…Ư_¡ÁÑĂĂ«Ô¹ÚÙÚ¡ÁÁ½̉Á­ÄµØăĂ3­ÄÛ«‚ ½9êö߈™‰kß [ïSÿ¯¶·‡‘×8ç·Ó ¥0çZ½€Ù½ÍƠ«·3uUÇÖÿœ¹ÚđÚ«»ÙÚÙ½ªdÅØ¡hùבé¡È¡8¤‡—¶ÏÔù×߈ËÉ9êÚÄØĂóÂùêѳÇÇ̉«»íÚ™‰kß [ïSÎÅÄôơÔÿ¯¶±»…ôÁ^߈Ó³·‡‘×8ç‘ß±»½ăˆŸ;ĐøçÚñÚù×éÓăˆŸđÛÓØï‡ơêñÓ±»¡È̀Ê)èÛ8¤÷‡ËåƯ‰±»Ϻ™‰kß [ïS¼Ăù׼›Û¿»‰ÛµØ©Ó¡Ô³à“È÷Ú߈щ©­ÁƯ™‰kß [ïSôµØ±¿“ƠăˆŸÎÅỡ›ɇ·¼Í7ù×ëûëöÛ«‚ ½9¶èăˆŸ;kÏÔ¹ÎÅÍÈ™‰kß [ïS›¾‡߈ºÿׇ“«ÔÿÚ÷Úñ"ï¥5™‡‡x¦¹ăˆŸ;¡Áñ²º̣̃ơӺォ‡“ÍjÙ×¾»ø×ù×…Ú¿Ù¹Ú¨ÀĂÙÅÓù×ÅӳȰăƠ»ØÄÀ‰ÔôÏÅר9¥‡ùê½Ô“ƠÛÄÓáßù׃¾‘߈ß»ûù×½±½Û׫ÔƠXÿ ¿‰°»¸Á¿ôƠX½€½Ăôëöï½™‰kß [ïS™‰kß [ïS™‰kß [ïSƒß»ûÏÅœ·̉ ¤0ËÍÄ«‡“Íj‰ÔÙÚŸØÙ½ ËûŽ¿‰™Û«‡“ÍjÏÅù×¾º“Èß»ûöù×·ÔÇÙÚׯsƬ֓ÆƯ»Û«‚ ½9ù¿ƒØăÚ +ª +‚ + + + +¼9 +Û«‚ ½9•½¾ĂºƠÑ·©º%ÙÙ½±¿Ö¾8”Ö¼ăˆŸ‚vÁĂá ¸Úï»ÁĂ­ôᤇ¾ÙÅëù×±»©¥¯¼«‡“Íj÷‡«Úă½«‡“Íj·Å—»¤¯G‹øöÙ½¡Ô߈߈¾·ºív™ëéå«Ô›¾£»ùê”ó¿ßÄÙăˆŸôêÏ̉ÔăàåôưÀÏÔ¡ÔéÚщáêç$½}ó¶»y”™‰kß [ïSưÀ“LJºùׯ‡§Ø‡ŒỠˆ߈ưÀÁ̉óÁÍÄ»Áå̉ åôÅØ“½ÇĂ™‰kß [ïS˜êèä¿́ÂÙŸÈ…ØƠŽö¶ó±Ó“È©‡¥2ßëMƒvÏı¿ăê¯È߈µÀ¦ÔÛ«‚ ½9ô꫇“Íj—¶çÚßƯ#Û«‚ ½9ÏԵȣ䱻±½ƒˆăˆŸ;k™‰kß [ïSÙƠô«‡“ÍjÚº¶ÔÔX­Ä¡Áź÷Đù×Ú¹ÚăˆŸ;k­Ö×Ơ†7§jư§‡ăˆŸ;÷Á‘«Ơ­Ä…‘Ï̉ÓƯÚ“¹ƯN₫®¶ăˆŸ«‡“Íj–ÖÅÄÛ«‚ ½9ëöµañÁ¡Ơ‡¿ÏÅị́Ûëö߈¿uÙÚßÄÙùê߈½ÔļÙ½‡º·Ó ¥0¹ÚăˆŸ;›¾ơ¡Ç±»ÑÓ­ØÆÅ»«ÔĂºщ§Ô©Ơ™‰kß [ïSĂôÛ×ë¼ÍÏÔƯÓ ˜‰j̃ZîSÛÄÓÙסÈăˆŸù×À¹%«·3uUăÇíÙÚĂÙÀ´ÛƃÖËÇ߈ÍÓÀ̉“Ơ½€Úºå̉ ±»öÁ9¥‡­Ä«‡“ÍjƯº·‡‘×8ç߈™‰kß [ïSĂÛ«‚ ½9Û«‚ ½9¡Á߈ÿ¯¶Ơĩث·3uU©&½Û«‚ ½9…Œϼƒv™‰kß [ïSÏÅƠµ¥ˆ]1‡äơèÅă»…n±»ÇÖ·ÅÙÚËÉ9Û«‚ ½9÷‡˹ŽàÖ½ăˆŸ;ÿ¯¶éÏỖÄØϼÿ¼±»÷ÚăˆŸ;êö¹}ÓØ½ôÛ«‚ ½9µa·̃Úª‚ +¼9ÏÔ¹ÚƠ¸Ú›ö¹ÚÂí—G߈ù׫‡“Íj±»ƒÖñÓ€ºùÙœÜ΢ÈÏ̉ËƠ߈ơ꫇“Íjô9¥‡×¡ÈƠ¥<ÁăˆŸÛ«‚ ½9ï»ÏÄÏÅ߈µ†­Â½µØ¶Å˜‡÷Á¥ÛÍÓ™‰kß [ïSïÚùơö«ª¯Û«‡“Íj¾ÅƠÑÓßƯ«ÔăˆŸ;å×Û«‚ ½9ơêíê߈³ºó߈“ƨ›·Ø¹Ú»9¥‡¿Ă°»߈ƒv¶Åî¶ ·Å½àăˆŸ;ÅØ©ÇéÔ‰ÁèºâàåÁׯ·ïÚª‚ +¼9Ÿ}¿ßù‡ëöëÓÓ©ÇÓ·ØƯÓ «‡“ÍjëÚ‚vơê—¿Å«‡“Íj̣²ƒvó‰¿IŸ±dzí—G˜‰j̃ZîSÅ9¥‡ĂĂ ›­±àéM߈ù׉ÛưÀÀ‡€è/Ö:Û«‚ ½9ßÚÏ̉½€Ởøê¡ÔÛ«‚ ½9½Ó¾Û«‚ ½9÷ÁïëÛ«‚ ½9»ĂŸ\‡Ç麫‡“ÍjçÚùף؛¾Ôëç™Á߈ÏēƇºëö›¾·‡‘×8炽˜‰j̃ZîSĐrÔ]̀Ă³È©‡¥2ßëMÀ‡€è/Ö:Á½ÎÄ…Ơ“¹ƯNëöà_ïƠăˆŸÛ«‚ ½9©¼Ó¼ưÚƒvÅÓ¹Úëö€º³×‚v¹Ú€Û÷ÁÏÔÖ¼ÏÅËÇ™‰kß [ïSËæ‰ÏÅÁ¹ĂÙèêµØ%äôiÅôÛ«‚ ½9¨ØÙ½±»«‡“ÍjÙ×Û×ÿ¼Ù½¾ơÔÅôƒç©ÓĐæ‚ˆÿ¯¶Û«‚ ½9½ăĂ3ñÚÈÙ×oÏ̉›¾öÁéßɦđ±»¿Ǻ¹߈½Ô¸ÚƯÓ ‹ ‰Á±Áù×½€ăˆŸ;­Ö…ô˱»Ù½öÛ«‚ ½9³ăˆŸ³̣Ö¾£ÈÁƯ…&ă»£Ç›¾¹ÚéÓơêù×Ơ¼×Ơ÷‡ĂÙÇÖ½Ưqăơ8¤‡Öëö¦ÔĂº…ÔÏÅؼÑÓËÇ™‰kß [ïSÁƯëö́‡Ù½ÁĂá²(׿×¾©‡¥2ßëM̃Ö÷¼ÅÁ”Öͼù×ĂÛ×»ºƒv³ ÷‡±»́Æ·ÂÙÚÅÓíêç̉ÔơËÇÛ«‚ ½9µØ·ÔÏÔäƠ,ºy½åôÍÄÚ×½­Ä¾ßÂƠƒväÆG½¹«‡“Íjï½°¿ÙŒë*«ơơ“‰å̉ ăˆŸ;¾½à=×Ăø×µØÏŃv›Û“ƠÏÔ³ÆY«Ô©‡¥2ßëM“Û«‡“ÍjæØƒ×9¥‡Ù½Ù̉̉ºÙÅëÊÖ8¤‡¿‰ÏÅßÁ¾ïÅ₫Û«ÔŸÅå̉ ŽöÔ#«»ÿù×ö™‰kß [ïS¯Ơø×‡ºÏÅÇÖÁ÷‡œÁƒ½߈₫¹ÚƠµ­Ä·‡‘×8癉kß [ïS’¹ÜNµØ߈Û«‚ ½9áê×Ơ·Ô¬¶éKÇ?‡äé´ÍË)éÛ9¥ƯÚÈ̉ùë±̉ÿ§­¡é꧘ÿ’§ôĂºöÛ̃ˆ‰µaƯƯóÂóÇI¯Óÿ¯¶‡Ç‡“ëöĂÙÑĂûÓ©ˆ‹Ü¸Ú±»¹rë™Ü…öù׵إˆ]1ñÚÀˢLJÇí‡Æ½¡ÛûÙ½ÁƯăˆŸßÄÙăˆŸ¡Ô™‰kß [ïS»Ăừá¼™‰kß [ïS³öù׫·3uUƒvÛ×ÍƠ›¾¹ÚÚ×ÓԽ؟ơ»×$}ÿÚIŸÖ›¾ưÀ¶è¯Èƒ¾‘₫®¶‡Ú±»±Ô±»°½“Ơƒvëö9¥‡¶ÏÅŸÅù×ù×ôêÏÔ³ÈÆµ.¥Ù…öËӥؽË̉·ÅỊ̈Ÿ̃ÙÚÿÚëöëÔùê÷Á½€ÏÅÏśۖˆÅÓʾÖÂëÔ«‡“ÍjÏÔ9¥‡¡ÈߌÛ,—¼ăˆŸö̃ˆé‰ñ5ñ·ăˆŸ;«ÔÏÔ“ÛÁƯ“Ûùê9¥‡­¾ŸƠµØÙÚåôÁẳÁơĂŃÏÄØÚÍB‡ºÓØé‰ñ5ñ·ƒv½¡ gĂÙÛÀǺÏÅá ¡Ưºù×ơÔƠù×±»ƒvüÀàêëö8¤‡ăˆŸ;Ă˜‰j̃ZîS™‰kß [ïSù×…£­ù×™Á8¤‡ÖÏÅưÀ›»­•·ÛסÔÛ«‚ ½9Û«‚ ½9ƒÖ›vÉĂÅÔöµØ5߈äô¦ÆºŽù×ÇÖÁñ»¾9¥‡ÏÔ߈ßÏûØĂƠƒˆ…·‡‘×8ç±»¹ÚëgÙƠ‰ÔĂÈ™‰kß [ïS±»÷ˆÅح僈¿Å™‡ûØ߈ÑÓÙ׳ăÁƠ‡Û«‡“Íj‡ºÄÔ₫ Û«‚ ½9êÖôl¶¹Úå×Ù½ö«‡“Íj”êư%àƠí“ÆëöÛ«‚ ½9ÿÚ‰'”—¶í½¿Å™‰kß [ïSù×¹ÔÏÄÎă½÷Áâ½çô¼¯à™ëéå§s‹Ç™‰kß [ïSß»û»ØÙÚí‡ù׬ø±»Ù×ăơ½ô÷‡ùê½±ÁÛ«‚ ½9¡Ó8¤‡ƒv°»—¾£Ø¡»ĐØ©ˆûÓ»ˆ½€™‹›¾‰»±‡ǽăˆŸăˆŸ«ÔÚª‚ +¼9ƒˆ½ưÀ ívíÆؽÜçÚ™‰kß [ïS¡ÛáêáĂÏÔƠºm“ÛÏԇˉÔöƠí—Gă»ï³2Û×À×ó¶Ž—ˆcÏÔù׃vñöŸ}ĂÙëÓëö¹Úư‚í‡ơêæØÂ¯ÈÙÚ«‡“Íj•Ö±»›¾Å»€öºyщÏÅËƠỞÍƠ¾Û«‚ ½9³ÇµØ¹áÓÏÔ±»©Ó‡Œ…Ô¿‰µØÏÅ̃ˆ½€—¶9¥‡«%ŸÅÁ ½«·3uUĂÙ™‡Û«‚ ½9¿‰§ÓăˆŸ;k½°»߈߈¬¾Ç»̉̉×̣Ç“̃麱ëØơĂĂÙщ߈›¹‰ÛíØăŒ›»›™‰kß [ïSûÀËÏÅ߈ßÁ±»ÏÔÉ̉ñÚ̃ÄØÏ̉Ó‡ÑӣǛÛơêƠÁÅÔ˜‰j̃ZîSëÚ£»™Ó̃ÎăˆŸÈö±Æ9¥‡ÍÓ¿º§º«‡“Íj±»™ÓçÚƒ¾‘±»×¾ï³2ÇâơÔÛ«‚ ½9¹ÚÙÚ÷ˆÁưÀăˆŸ;ôê¼ÈߌÛ,ơÔ«‡“Íj9¥‡á ºØÅê¡Ô›¶é«·3uU…nÑÄë‹ÓÛ«‚ ½9₫®¶Á½Ơ•ÇöáºÛ«‚ ½9éôå̉ ç̀ôê±»ĂƠ¿ßâàí—GöÁÛºăˆŸè‰đ5đ¶°»Ÿ\ÇĂ»ÛׇŒ¹Ö§ÔÀ½Ï̉9¥‡·Ó ¥0¶±»ÏÔ‹ÜÙÚßÄÙ܉Äå^½€ªÚ ÑÄëÀËÇïƠƠµØñÚƒ¾‘«‡“ÍjÏÔưÁ‹Ç¡Á³ÆëöÍÄåĂíÚ¾ÏÅù×퇽€÷Ô©Ø›¶éÏÔ·#ëöï»ív¡ƒvëÓ—Ó½Íīܹڙ‡ºĂÈĂÏÅăàù׃ÏÅ¥ØơØØĂÙ×Ü«Ôù×ϺµKï½Á‡é/×:ŸÈˆ‹Çß«·3uU™‰kß [ïS·̣˜‰j̃ZîS±»éº“Ʊ»ăà­ÄÁç+§Æ÷Ô£Ô«‡“ÍjĂ»ÅÔ÷‡©ÓÁá¬Û«‚ ½9™‰kß [ïSẲóÂ÷Á°»Î̉ăˆŸÁĂ›‡ơÔß»û¡ØăˆŸ½ƯÏÔăˆŸ¡<¡È‰¿I߈üÂ8¤‡Ö¡Ø«Ñ‹ôĂëö°»ưÆÑÀ¿º›éÍĂÇÖ‡¼Ơå̉ ñÚ«‡“ÍjÏĆŒ¿‰çô‡ÇÁƯ½€Œ¾Ñ»ƒÚ°ô·Ôƒv¡ÔÔÑÓ“ÆÛ×™ô³å̉ ‰ÛăÇíơê™Ó߈ăÁÔËÉ99¥‡™‰kß [ïSÑØÏÅ©&‡xăˆŸ;k•‹HöÏšԽ€±»ÿ¯¶ÑÄëçÚù×ÇÓŸÈ9¥‡¡Çï½°»ÏÔ›ÚȇÆ«‡“Íj˜È†Œ + + +ăÇí÷ÁăˆŸ;°»ís¡ÈĐÄêµØ°½ù×¹đ¯¾Ơùד¾Û‡›¾ÙŒë*«‹ÈÓºÉ)ͼº‡Ù½˜êèäÛ«‚ ½9†¾ßÚ³ ¡Ô“¹ƯN«âúÙ­½¼›¾¹Ú߈ĂÙÅÀƠX¹Ú·‡‘×8ç¹Áƒv±¿±»­Ä¿‰¡Ûªâ›¾ÛÛÀ•6ăˆŸ;9¥‡Á¯¾ƒÚÁÙ¿ôÑÓëÚ÷ڵţØ÷Á¿ß×Ü·ôùÍØ̉…Ó´̉̉ëöåĂùêăˆŸ;«Ô÷ÚÅù×ơăëöĂÙëöÏÔÖÆÙ×ăˆŸ;̀ÓæÚµØö߈Ûº8¤‡×Ö¾ív½€ưˆͽ9¥‡‚v…̃ƒ¾‘“ƠíÖ½€«‡“Íj™‡ͼɲÈåĂ½ăˆŸ;ÜË¿ëöÅÓưÀºû´ôĂÍÏÔ‡¤ØÏż«Úù¿͇ë¼ăà9¥‡¹Á¥‰ÍL…Êÿ™‰kß [ïSÛºá‰Áöùê±»߈ßÁ©‡¥2ßëM₫®¶ÙÚ÷Á›§ñ×ăˆŸ;ØƠ¨Çå̉ ñÆ©•Œ¡ÁÁ‡é/×:­½¼ơÔ¹̃ÑÓѶĂƠ±•ÙÚ‡äù×™‰kß [ïSƠ¥Ó¿‰³}ÍÄăˆŸ;¿‰ĂÙÛ«‚ ½9Ó¾½€߈ß»û«d9¥‡×߈ƠÛ«‚ ½9́Ú³9¥‡§ßÛâ¹ÖßÅ…ƠÏ؉j̃ZîSÅ“º˹½ôƠ˜êèä¹Ú½ăˆŸ;‡ÚÍË)éÛ9¥9¥‡‚çô¯ÈÛ«‚ ½9©Ç­Ø³Èù׈™‰kß [ïS÷Áù×ÍÓ¡Û±»»Ÿá gŸϼăºµà¹¶ר™‰kß [ïSÎ̉ë₫çÚ߈ÇÖ³øê å̉ ơÔÏÔà ơê°»Û«‚ ½9Û«‚ ½9çÔ¡»ÅÙ½µÜîÀ«‡“Íj“ȱ»âˆÙ½¼ëÏÅÈ̉ÁăèêâßÚ†ºéÔÇÖüΩر”‰¿IỞ¼€÷‡‚×̃ˆ™Àăê£ÁÛ×ù×ÎÔËÉ9×ƠÁĂÏÔ·ÔỞÛÄÓ©‡¥2ßëMưÁÛ׳È́²È¹Ú8¤‡±¿«Ô“÷ó½€ưÀ«‡“Íj‹ö·3uUÙÚ½ÿ¯¶ù×ÖÆF«‡“Íj‰¿Iá=½€¯ÈƒƒvƒˆñÙ¥ˆ]1ÁõaÅØÖÆ½Ăƒ¾‘ơèÅ™‰kß [ïS‹Ç±¿«Ñ8 ¤‡ ×ĂÉ£ÔơêÑĂăˆŸèꘋÈêö°»ăˆŸ†»ư“ñÖù×ôÁĂƒëÓÅÔù×™‰kß [ïSùơÙ×ø±̉™‰kß [ïSÙŒë*«ôĂºù¿Û«‚ ½9ôÅÔĂĂ ›­±àéMÙ½ù׃ÖĂÙÇá…Ö߈«»™ºăˆŸƠÿ¯¶×$ÊÓ©¼ăˆŸív9¥‡×ù×µØÛ«‚ ½9ÁĂ™‰kß [ïS™‡ÅÄÇ­ÄÛ«‚ ½9"ëö«Ô߈ƒˆơèÅ®×ÙŒë*«…Úù×Ûº¹ÚֲƒԫdÙ½¯¾ëö9¥‡ù׿‰ßÛ«‚ ½9ÑÓäñÀƯG¥ÆÛ«‚ ½9Ơºm̃ˆí—GÛº÷ڜԫ‡“Íjïô÷$Û«‚ ½9ÛºƒÖƒvÛå̉ ëö£Xù×·‡‘×8çåôéÔû”ĐÄêư“ˆ; ½€›öó#÷Ÿ“¹ƯNÍÓñÚÛ×ׯÅÄÊÓ׾ŖßÚ߈ÁĂ™‰kß [ïS“Ơ•ỞÑĂñÖ³߈ù׿ôơêñíÈûƠ Ëû̀Ê)èÛ8¤ÀĂ½€éº…ô·ä9¥‡Đ· Ç*½ÇÖẳƒˆ̀ÇĂÙßç§ôá £ÇƠ„(‹Ç«‡“Íj±»¡Û™‰kß [ïSöä5̉ßÚÏÅéOƯº̣ÈăàĂÛ«‚ ½9Ë̉ïƯϼÛ×öÑÓ½›·ØÏÅĂ›¶é°»÷ÁåƠív«Ô߈¾ôƒH߈…a采ŒŸÅ¿ôÛ«‚ ½9ƒˆ™ÁëööÁ +߈ÇÖăÁÙÜ•øµØÛ«‚ ½9áƠ¿Å8¤‡߈Ư‰ÛÀ°¿ĂÙăˆŸ;ưØ¡ÁơÔƒvçÔ¡ªÚ̃ˆ½àưÁ߈±»­߈ëÔÚª‚ +¼9íÆ¾º±»ëö°»«Ú«¾³”‡ÓǾvÓØóÇÏŃvÿÚ‡°» ôl±ëØ¥ˆ]1›¾ƒv­vºñƠ÷ˆöÁĂƒvÙÚ“…‡Œ‡,ƠXÏÔëöƒvó^Ù½Û«‚ ½9ùׇºăˆŸñÁăˆŸ;º̉ÏÅùשÇăơ‘¾ïÅéÓÙ׃v½çíØø×ÅÛÀˆÔ‘Ö¬Ö‰ƠÅщËÉ9ÏŽ…ô8 ¤‡ Ö߈íŵ†ĐÓÇÖ™‰kß [ïS£ä‡ºÉ̉çÚƠߣƠỞ™ëéåùêµaºñÓ×̉¹Ú§Ô™Ó‹Ó¡Ô¹ƠÛ×̃ˆëöª¶2tT¹Ú‰¼›Á·‰•¾½€É€¿ºØ×ëö9¥‡₫™‰kß [ïSëöï»Ă¹Ç»¯ÈĂÙ²ÔÇÓăˆŸ½çôÿÚùơù×µÜÛ«‚ ½9ŽïÚÍÇ÷ÁŽ߈Û«‚ ½9ù×ÎŇº¹ÁÏÔÍåơÅ¡ÈÂù×°¿ÛïëǼÍÏÔÓØëöÛ‡·Ø™‰kß [ïS߈ù×÷ÁăêĂèøæ…ÖăàưÀĽ Ơ‘±¡ƠÄ¥ÛщçÚ½¢«»‘¬v¿ßÅÛóÄíÆ™‡€Ơ«‡“Íj«‡“Íj­ÄàÅj¡Èçô¶Ô©ÜϹ“Ơ™‡ăˆŸË̉»»å̉ χËÁ“›¾åĂ×¾»½߈é×ÂÖưÀå̃¥Ïăº9¥‡ù×·ÔÿÚív߈˜‰j̃ZîS²Â»n’ü™‰kß [ïS§ÔĂÖ߈Ó¹ó—¶íÙ8¤‡ßÁù×ùׂv•Ü­Å»ßÏÅÅô±ù×ÜÓ ׯÁËÏÅ8¤‡¹£ôø×íÚ¡»߈™‰kß [ïSơÙÚµa™‰kß [ïS—»߈™Ó±»®ăˆŸ¼½8 ¤‡ ÖϹ̉ºͼ÷¼Ç"©‡¥2ßëM±»ºÁ±»ơ»߈ÎÔµÀï½ψưöÏÔ¾щÅØ•Èû›íö9¥‡…Û̃ôÀ¹éơôêä̉߈Á̉½̃ŒÚ,ăˆŸ;÷ÁưÀÁ̉›¹ÛÄÓËDZ¿±»Ë1ÇĂùêǼ¶ơ꿉‡Œ÷Úö›¾óÇß»ûË%·ÅûØ«‡“Íj匿Nß»ûÏÅ›¶éÍij(·‡‘×8çă»½ÑØ«d×ƠưÀÇÖ«‡“ÍjƠÔ±»ÿ¯¶ÛÄÓơ›ñӷŵÀå̉ ƒvăßÛ«‚ ½9êÚ°»߈öÛ«‚ ½9Á̉„(ÎÅùׇßívÇëöƠºmÙ½öăˆŸ‹ÜÀĂÁ­Øă­íÈÅûû¡ÈÙ½ÅØœ‡Ñس(³ăˆŸ;ÏÔùê•ÇăˆŸ“ȵa« ©ƒ»5ƒ×ëöĂÈø¿Û«‚ ½9ù×ÏÄAÎÅ·‡‘×8ç¡Ô“Æ·Å…Û˜êèä̉Á¡ÔóÇư“߈ƒvÍĂñÓ™ëéåËñ™‰kß [ïSÿ¯¶ÛÚÿÚưÀÛ«‚ ½9¾º¡ÔăˆŸ½±»©Ç½åÁ́›ÔÄÙ½öùê‚v—»½È¹ÚăˆŸăơ½Yшƒ½½Ăø×ĐÄêÎÅĂÈ×¾«‡“ÍjỞ½±Ü‰¿I¡ÔÓº®¼ ăˆŸ;óÇĂ‚v¤Æ«‡“ÍjÛטêèä“ƠåôéÓ“Ơܘ‰j̃ZîS¡ÈÁƯ8¤‡Ï¿×‚©‡¥2ßëMï½ÏÔÿÛ§Ö‹ÜƠ¾GƠX¼Ôù×±»ù׃¾‘˜ơ·‡‘×8çÿÂÙÅ뙉kß [ïSëÓơê߈ï³2μ ½Á›Y—¶‡$רĂ™‰kß [ïS™‰kß [ïSÙ̀§kËÇ»ØÛ¹­v»íÆéê‹ø©ØÅÓ›ÚÏÔÿÚ߈ͪ߈¹Ö«âÑÄ룻ÏÄƠ¬Äù׿©‡¥2ßëM³½±»ëö‰̣á éê½€ÁăˆŸùêêöÙÚÍË)éÛ9¥ÔXđå̉ ÙŒë*«щ©Çêö£Ư€º ơÔµØÛº½ËÖ¡Ôÿ­ĂÙ¿ºSèơÙÚ¼ÔÅ»³Â߈ÏÅĂƯÓ ñÚĂÜăêïƠÛºÇ%áÆ¾«‡“Íj߈ơê—»ưÅăˆŸ;½ăà£ôÙÚËÇáêÇÖ™‰kß [ïSŸÅÏÅź‡ºÙÓçôÛºÏԙɩ‡¥2ßëMơÔ£ØưÀ¡ÙÚ½€߈³±½ÛÚßÄÙÏÅÁ̃€ºăˆŸ;™‰kß [ïSÍË)éÛ9¥”ÛÏÔ«ÚíÁÙÅë‚Ø•¾ôêÓ̉“Èơ‡ƒ½ß„Û«‚ ½9Ù½ÇÖÏÔưÀËÉ9Åà˜Á¥ÛƒĂÑÄëÛÄÓÛ«‚ ½9£Ă›¶é߈Ë̉Û«‚ ½9«ÔÛ«‚ ½9ѹµØñÚ™‰kß [ïS¯é́v½ôÇ¡%áơꘉj̃ZîSá ̉ÆËÓù×ÂÙ’ÏÅ9¥‡«»±ư­·ÜÏÔ·ôßÖ߈«Ô‹Ç‹È¥ÛÑÓ™Ôù×»­v•ϼÑÄëù×߈¯ÈƯùĂÖỞívÚª‚ +¼9¯ÈơÔ•¹ÚÅ÷¼ÙÅëå̉ »ØÅؽ€«‡“Íj™‰kß [ïSƒv§Ơ±Ó­±̉÷‡ö±»ÏÔ½ÿ¼ñÁ ÙŒë*«9¥‡ÿ`ÓÇ̉êö ñکǯ¼ưÀ÷Úù×÷ƯÓ ¶ßÄÙ™‰kß [ïSÛ«‚ ½9Ơ߈Û×Û«‚ ½9½ÇÖƒÖÏÔ™‰kß [ïS­ơïÚå¼ ½Œç̉ĂÙưÀơèÅù¿÷ÁÛ×ơêíÖíêûï½Û«‚ ½9ÑÓ¼ù×ëöâḈÛ×ÍçÚÏÔƯÓ ±»›¶éÈÖ­ÄưĂå–ĂÙùôÁƯ½Ô¹Úׯ‹ùëößÄÙơĂ›¶é߈ÏÅÁăˆŸ’½ ™‰kß [ïSëö‰öÛ߈ƒv£ƯÓØ‚vø×ù×ù¿ÖÆÛ«‚ ½9»Ă¿Å›¾å‡áê¨íÖ™‰kß [ïSÙÚó5ù×°»Ó©‡¥2ßëM±»½Ù½±»çÚ´Å ³¹ÏÅëØăˆŸ;ÙÚƒvŒE߈߈ÙÚÏÔĂÙÁƯỔñÓ߈ºơÔ€ë$¼ÿ¯¶›¾¡ÓÓÅѶƒvÅÓơº8¤‡×Û«‚ ½9¡ƠÙ½#”‹³³ÑØ¿»±»ñ̃¢X¿‰߈Ïԣܶ¡Ôå̉ àÓ¾Ó¾êÛ«‚ ½9±»™ØÛ×Û«‚ ½9÷Ù¿ßĂÙÛÄÓµØÑÓ×ÚÛ«‚ ½9ĐÅơêù׿ߙô±§ÅÔăơÚª‚ +¼9‡ÛÂÙ™‰kß [ïSƒvƠ¯¼ÅÓÛưÀëöơÔÉĂ¹Ú±»ƒv«·3uU§Ôï»ù×ăˆŸ¥Û˜‹›¾“ÈóÂăˆŸ;ÿ&Đæ’½Ÿ}©ÓĂÙ‡º¿ÅÇŋөØÓƵأä߈χÛ׃véêÏÚ«·3uU™‰kß [ïS9¥‡éêÙ½9¥‡«Ôå̉ ™‰kß [ïS¯‰¯0߈ÏÄI½ùׯ۫‡“Íjº™ëéå‡ßÛĂĂ ›­±àéMöÿÂå̉ ÏÄÏÅÙ½ %±½¯ÈÁƯå̉ ơê¹ÚÛ«‚ ½9ơÇ¿ÏÔĂ¡»ƒ¾‘›¾Ơ©ÔÍƠ¥Óéêù‡ºÁÁ‡é/×:»Ă©‡¥2ßëMÑÄë¹ÚăˆŸ;©Û«‚ ½9Ù»ÑÄ멼ÍB†×ÑÄëå׈µÔXÅØĂõØô·Üôê‘Ûù¿ÓÓçºơºù¿Áð»çÏÅíê™Áă½¹È›¾9¥‡Í­HËLJx¦ÔÏÅç½á ÷å5ÓÛ§ôªâµÚñÖ8¤‡ù×±»ôêÛ«‚ ½9ƯÓ ÿÚù¿½רƒˆ¹Ú¾™‰kß [ïS­¾ÓÅù×ÔÅØɇ¶ÇÖ™‰kß [ïSÏÔ¿́áÏív‘Öù×öÏ̉߈“È—Óщ߈¡Ơ¹®™ûÁ¼‹ÇóDZ½íêó#ƠÅÛ«‚ ½9ÑÄë½ÅÙđÄ¡ƯµØĂÙƒv­Ä9¥‡áƠËDZ¿–ô“¹ƯN¹Úă9¥‡çÚơÔµú°»߈±¿½ë£Ưß»ûÓ¼Ï̉½Ô£Ø«»ÙƠ÷Á£Ø°»±»¸Úù×LJﻃÖÛ«‚ ½9½½§Ôêö +ɇÛ«‚ ½9ƒvù×ß»ûäĂª‡’̀jˆ;“¹ƯN¹Úù×·ºƠ?Û«‚ ½9̉Æçô“Ơä̉ăˆŸ;›¶éμ½€ư´Úª‚ +¼9âà5ô¿ß‚ +ăˆŸ;kÓųz“ƠŸÅôº“߈ö‹Ó™‰kß [ïSÊÖă½ÏÔƒv•ÖËÉ9ÏÅ‘ơÏÔ½ÏÅơêÛ«‚ ½9°»¹ÚºöÏÅỂÏÔåĂ©ºÛ«‚ ½9ü ¦  † µÜ±»‘«߈ĂÈÁÓ¸ÚÂÙÁƯ9¥‡±»³Ènƒv·‰©ÓµØÛ×Û«‚ ½9ỞÁƯºyÁ¹•Èû›Y¿‰ăˆŸ©‡¥2ßëMóê÷Á¶ÑÓ±»›¾½Ï̉ƒv½€‘Ó¬‡âˆ;ăˆŸ¼ù×ĂȨÓöă»¿ß߈ưÀ©Ó°»å̉ âÁÎÔ9¥‡߈£ä“Æ‹Ç߈±»½ĂĂÙ©ßÄÙ¯‰¯0­Ä±»«‡“ÍjÎ…ÔêöóÇ›¾ëöÚª‚ +¼9ăơ¿ßáê×ƠƒéÓ˜Ô·‰ƒàáê™àù׫Խ€ÿۋǡȳ”Ùq9¥‡¡Èµ.¥Ù·ÜëÄä̉ûÓ½Èׯ—ÀÏÔ͘íÁ纥‰ÍL…ù×Ñέɇ«×ߌÛ,ưÀ°¿-íßùêĂÈ¥Ö«Ô±½ÁĂåôÿÚºnƒÖ£Ôä×ăˆŸÛ«‚ ½9£Ç¸ÇѶ‚v‚×¶Û÷Á‡Ç߈º«Û«ø¹ƒ¥ÁéÓ‰Ø߈ƒˆ¾ÚÀÙ½ÑÓùêÁçÚ§ôö‚vºĂ¡ƯÿÛŸÈ‚9¥‡Óº«Ô±ëØỞ9¥‡™‰kß [ïS©ÈïD¿¾ÇÖỞLưÀï½ïç®GøÁƯÏöÏÔù×ÏÔíÆÂĂß»û¿ß•œÚª‚ +¼9߈«»×¾ÿ¯¶ö•Œ¨‡¤2€̃êLƒ¾‘瑟ÈưÀƯ%ǽƠXăˆŸ;ă߈9¥‡—ˆ³ºóÍөǀġÈù×éÓ™‰kß [ïS±¿öưÀëöù¾«‡“Íj«‡“Íj¹ÈƯÓ ë™HÅØñƨ¼߈‚vÁĂÖ¼›¾¹Ú̃ˆ¹Ú©‡¥2ßëMù×Óº¯à½ùלÁÿÚƒÖ»±»™‰kß [ïS¿Å½ÛÁƯùדÆăˆŸ;çÚóôñÆỂ§ÆßÁÓº“ÈÅ»ÓŇ9›¶éăˆŸ;ø×ơêæÆßÄÙÏÅ·¡ù׫‡“Íj8¤‡Ÿ\ưÀ˜‰j̃ZîSï»ưÀÛ«‚ ½9îţDZ¿™‰kß [ïSÁ̉ŸØÍ¾½€«»Ó¼‡xù×ù×ù¿щ±»ù×å̉ ɇ£ØÈ̉÷ÔÁóǽ԰»̣Ô +ĐÓ™‰kß [ïS%׺…ßÁ½ÈĂëÓ¿Å¿‰ív‡ƯÛºăˆŸ;‰¿I±ëØơÔÛ«‚ ½9ăˆŸ;Ù½÷¼ÙÚù×±»ÿÂí(ù×ËØ—Ó±¿×Ăà ƒvÆÓ»Ưù×׿8µØâˆ›¶é©¼³ÇåÁ߈±»¿»Û«‚ ½9“¹ƯNÛ«‚ ½9¹ÚÏÅù׫‡“Íj¹Ú¡Èׯ̀Ó±»ÑÅ9¥‡øêº±»£ ©¼«‡“Íjù×½»¼‘‘Æÿù×íÖø×ÏÔ¸Ú¥ˆ]1£Ư«‡“Íj½‡“µØó¶„çôáóN™‰kß [ïSưÀ±Ô÷Á§ØăˆŸǼÛ«‚ ½9‹È9¥‡8¤‡×ù×Û«‚ ½9ƒ˜ƠŒ©Ó”Ç‹ÜơèÅëöăÇ홉kß [ïSÛ«‚ ½9™‰kß [ïSĂà9¥‡ĂÙ°»ĂÙ›¾«ÑµØ³ÈÍ­ÏŰ»ïÚÅÄöï³2«Ñƒ½߈ơèÅ·¸·‡‘×8çéêÏÅÇ·߈åÖѾº•%å̉ óøÛ«‚ ½9ËÓ÷ˆÙØ«‡“ÍjÛ«‚ ½9—¾©©¼ÏÔ¸Ú¿‰™‰kß [ïSÙ½Ëéêå¨ÅDZ»«‡“Íjù×¹Ú¡Ô‹Ü™‰kß [ïS«‡“Íj߈Ô«Ô¸ÚÓØ̉Å ߈›¾³ºóÓÔŽØÅ2ê2»Øß„߈°»ôpnó^™‡©ÇÆëÔÛ«‚ ½9Úª‚ +¼9ÆíƉػƒˆ¶Ü÷ˆá=ßq¡È‡ùë«Ú9¥‡…ֱ±‡½ôơĂ“ÈăˆŸ;Ú&·ºÙŒë*«ƠXÎŨǢXÏ̉‡Á¹ơê9¥‡Úª‚ +¼9ÍÓ°»ù×ëö™‡ôØ÷ÁÁ‡é/×:ºÏÔ—¶ßÄÙ‡jÑĂÊƠÑÄë̀Ăă¼…ŸÚºƒvÑæ™‰kß [ïS«ÔăˆŸ;Û«‚ ½9«»Ÿçù×̃Ư«‡“Íjù¿û÷ˆ½ØĂÈăÇíÔÚµưÉĐ½€›Ô—ÛÀ¹ +†ºçÚéêÚץؘ©-“Ơ©‡¥2ßëM±»§ỖÄØƒÖ±»̃ˆ³­ÄßÄÙÏÅ÷å5ÓÏÄÏÔÅù×Ç̉ñÖ߃vÿ̃ù×±»Ü™Ô½—»ÂĂÏÅ“½…¾«‡“ÍjûƯí—GÛ«‚ ½9£Ç±Ü·‡‘×8祉ÍL…·Å†jù×ùê™Ó·̣áçÁ«‡“Íj¹Úù×êÚڹߖºÁÿ¯¶ù׳¹×ƠăˆŸ;ơØÍÓÆËË¿ĂÙăˆŸ;kĂÙÛºÿ¯¶ªĐëö÷ˆ§º߈¼ÏŰ»ĂÙ߈¡ÁƯ›¹ăˆŸ;£Çͪ«‡“ÍjßÁ«‡“ÍjÅØ½Å#ÁÜ­:߈«Úơº¯é¦̃—¶¥¾éÚ߈щ¼€ƒï½‡ơ߈‰ßÀ¹ +ÅÔÏ̉ÁỮŒÚ,á ºÓăà™‰kß [ïS·ëÿ×½ôÿ¯¶ÏÔß„‰½ñÓƒÚùôŸ}×¾·Ó ¥0™Ô±»â௠ׯÙ½Ó ‹›æ§Ô«Ô·ÔŹ£ÂÏ̉½ưñ³Ơ×ÿî²Æ›¾¼«‡“Íj›¡‹ÇĂàÛº¿ºăàé‰ñ5ñ·ÑÓ÷ÁƠí‡ÙưöÁñÓä̉ẹ̈ÏÔËƠï»éÓ¦ÔưÀƠ¹ÚŸÖù×ßÖŸ}ăˆŸ;kăˆŸÅÓÓØù×̃ˆËÖăà½ĂÏÔ¼ĂưÀÍ­HÑÇ™‰kß [ïSƒvĂÛÁƯéôË̉߈§ô÷ñ¸Ú·’È·º½Û«‚ ½9ơê߈×Ó/­Ö¹Ú·Ô«‡“Íj½“ƠĂơêù×釱¿¯¾“ƠŸ}Çֵ؀º¾ßËÖÔ¹ÚÛ›v‡Œù×–¾߈½ôơê×Ă¥ØŸ»‡§½Œ¾ưÀ×Ú¹ÚÜÛ«‚ ½9ĂçàéÔ©Ç¾ÓØÛ«‚ ½9Ơ±ƒ½âħô¡»ÛƠ©À« ©ƒ»5û‹ơêϹŸÛôê߈ăˆŸ›¹̉ÅÛ«‚ ½9ÿ§“ÆƠܰ»™Ó•%—¶©ÇÉ̉³,÷Áơ«º½Á9¥‡™‰kß [ïS߈÷ꓺƒvÔĐÓÙŒë*«ÙÚ§ôÙ×ÏŇÚơØ·‹ñíÈ¿»ëƠU×Ơ†7§jóÇ™ĂĂÓØăˆŸ;kÏÔÙ½ưÜñÆÿ¯¶ù׫‡“Íj½àÑÄë«Úå̉ ñ×›¾éºߌÛ,çÚ̃ˆºơê™ëéå£ä¡»ÏÓ߈ª-  ™‰kß [ïS³ïƠ“Ƚ€ăˆŸ;›Ú⽿»­Öî²2V›¾÷ÁÏÔĂÙÍöù×ăˆŸ;Ñ“ÏÔăÇí÷Ù«¾ï‡±»§ô±½‹ÈÑÓñÓ°»ÙÜé꺳ˆ±»ÍÄóÂÁ÷Á©‡¥2ßëMÚÆ$È‹Û׿8ĂÙéêăˆŸÏÇ«‡“ÍjóÇÅôÛÄÓÑÓ‰ơÑ«ƒÚÙ½ź¶  é‰ñ5ñ·¼ËƠÁÓº߈ÅÓö¶Ï̉ï«ï½Ñ–ơĂöÛ«‚ ½9ÿÂÿ¯¶ÑÓđÇ™à‘•½ç™‰kß [ïS·Å›¶éưƒôß“ïÚÏå÷Á¿‰çÚ•’±½ƯåưÀ·‡‘×8çÓ̉¥Æ—°9¥‡¶Ö¾ ™‰kß [ïS½˜‰j̃ZîSÆÖ°»óÔñÓç$±»߈ơêñÖµØÁËÉ9©‡¥2ßëMÛ«‚ ½9å×­ÄÓØƒØ“ÈÀºÙ½µ½ÑĂù×±»™‹ÅàÙÚÛ«‚ ½9ĐØ߈ß»ûëơ¡È«‡“Íj³ÂµØ¹Ú́ÖÙ½¬Ö +÷ÁëöĂ“-ưĂ9¥‡¼ù×ÿ¯¶„»Ë̉ƒÖ‘¾«»₫ơêÓØù×µØÍÇ«ÔƼÛ«‚ ½9ĂÈ™ÔăˆŸ‘Öù׺ù×ûÙگșô匿NÓ½™‰kß [ïS›ÚƠöơê¹âÍÓî½ß»ûƠơé÷°»ơê±»ÑÓëö™‰kß [ïSÓºÄÓÀ«ÚĂÙ­¾í‡́–GȇÙ½ëöù¾ï½éê¹ÚŸÖ÷ˆ߈רÛ«‚ ½9¹Úëö±™Óù‡×ÓÛÓ›¾ÏÔù׫Ü9¥‡¶ƒă¢X™‰kß [ïSËÉ9×Ó½€Úª‚ +¼9÷ÙñÚ̃»úôÔù¾Ă¼ăˆŸ;ßÄÙÏÅöÁ×ÛLJÛñÓ±»́v³z’ƠÏ̉߈ÏÔ”%á’ưÀ¿Ù½ÏÅóÇ›¶éÓ¦ôù×ÓØßG…ÛÛºäÁƒv߈¡Ô·‡‘×8çÿ¯¶óơèžۺ÷Á•ŒÁÑëöß½¥Æÿ×çôúÏÔƠ±ëØÙ½߈9¥‡ưÀ‹Üù×ñº“¹ƯNù×áê÷Áùê»Û¿ØÏÄưÀÓºɇ¾ßÛ«‚ ½9ƒ¡ß»ûŸÖའ£äöÄÓ߈Ă¼ ¶êöẵ·Ó ¥0ƒô³ÅÄ™›·‡‘×8ç÷éÏÄù×™‡Ó‘ÇĂ“£ºÏ̉½›Ú“¹ƯN€ƠơêĂ™‰kß [ïS߈̃%׿8÷Á÷ˆ9¥‡ÙÅëơơê™Ô¶ÎÅ8¤‡ùêñỌ́Ç›¾ÓضØù×¹ºÏű»ù×Û«‚ ½9¶ÙƒvÑØ÷‡߈¡Û«‡“Íj™‰kß [ïS÷‡ÙÚÛ¹¼·Å‡‘×8çơêÛ«‚ ½9÷‡å‡ĂÁ½ÙÓó™ŽƯ‰ÏÔĂ¼¯Ôív½€ÏŃØĂßYÛ«‚ ½9‚½ËÇ“ơ»‡Œ¸ÚÙ½߈±%÷ڭĺڪ‚ +¼9“Ƚ€ç°ÍÄư‡±ù1ÿ¯¶ÿÂơêùêµƠŸ}ëö—¶ÍÓ©àơÔÙ½“ ăˆŸẨưÀ½çăˆŸù×°»¼€ ‹ÇÑņ“ù×åõ.¥ÙăÁ£äÅÓ©Ç«»©Ó™‰kß [ïSáêưĂĂô¼Ôÿ¯¶å×ù×±»«‡“ÍjµØ©Ç©‡¥2ßëM¼ –¶ơԇǵØÏÅĂå¿ù×߈ÙÚỞׯ™ëéåöÁ‘ÆùêƯÂùêÈ!ÍË)éÛ9¥éÚË¿÷‡»ÅưÀ™‰kß [ïSÁ¹ĂÈÁ‡é/×:«ÔóÄÇÖ¥ˆ]1«»³¹ăº‰Ưü̉ơĂÚ×…a±»¡ÈÍÓÛ«‚ ½9ÑÄëÏÔñ~ÁĂ“ö߈ù×߈³ôÜ•Œ‡Ç̃»úó|±»ψÛ×߈ñÚ›¾ÿÚÂÙ±»ƒ¾‘óǡȧԛ¾ÏÅĂÙÑÓ«‡“Íjù×±»µØ±»Û½«Ô÷Ú˜êèäù×ÁƯ«‡“ÍjÚ& ù׃v¡ÓăÁÏÄ߈³¹Ơß»ûͯºĂÙÙ½ăˆŸ;…Œëö³Ø»¼‘¿í¹ÚêöñÚÁƯÙŒë*«½‹Ç›·Ô†ŒÙŒë*«ûƠ‰Û™ëéåÂÛ«‚ ½9‰¿IÏÅêö‹Ó¼€ƒåçƠ¿ôÁĂ›‰½Áó#¿‰߈ơÔŸÈƯÓ ±»ÁƯÖØÑÄëˆëöưË%¦Ø˜ÓÁËçđÁ̉ơèÅăÇíÇ̉› è£»çڋǧÔÇÖíÁ™Øỡ÷Ù›À½)½ô±»Ç"í©Øÿ×¹Ö›¾ÓسzଭÄñÓ‰Üï¥߈±%÷Á¾•Œ•ŒÏÔ«‡“Íj™ëéå˜Ó¾ßï»çÚÆÓÙ½ĂÙÛ×·‡‘×8çƯÓ £0߈ăºÉÖº›¾Ú×’¹ÜNăÚ€Ơ«‡“ÍjÏűÁƒv•rơĂăˆŸ̉Ø߈ö¹ÚÛ«‚ ½9ù×™‰kß [ïSÇ%Ù̉ÓºñÖëƠUăˆŸ;Áñ«‡“ÍjÔÅ%·Å̃çå̉ ÷Ùơlß»ûÿ×™Ô·Ù9¥‡ºÅØÛ«‚ ½9½ù¿ëö³ÈăˆŸ;§È¹ÚéÇÖÛÄÓ±»µaÔ]Û«‚ ½9Ù½ÙR¿ºÅØÛÄÓçÚÑØơêơ‡Û«‚ ½9•‹H½×ÛëöÏÔñà©ÓÏÄöµƠ™ëé噉kß [ïSƒ™‰kß [ïS߈±»»ØåÁ³ºóñÚÏ|ƒØÛ«‚ ½9ËÓ£“Á¹«‡“ÍjơÔ÷Á€ƠÓØ­v°êØÏÅ9¥‡ëÓêơb™ĂñÓív—¶ößÄÙYï³2öÁÅô‘µÿÚ½Ô¿»öµØ‡Ç™‰kß [ïS›¾¶ô߈§Ø­Ä™‰kß [ïS߈ăˆŸ;k™‰kß [ïSżưăµØ9¥‡¼™‰kß [ïS›¶é…Ơ±¿ƒvÿ¯¶Á½ƒvùë¼û;“ +«‡“Íj­ÖÅÄÏ̉ĐØå̉ ™‰kß [ïS߈ŸÈøê¶‹Ü¿àÇĂ¯ÈëöơĉÚăà̀ÁƯ“ƃ«ÑívÏÅØ¹ÚµØà‡Ú°»ËÇؽÛ…Û›Ú¯¾öÁ «‡“ÍjñÓ÷ÁÇư­߈ơÔ›¾Ươ·Ó ¥0ơԷż©Ơ™Ø±߈‹Ù¡È–Óí—GÙ½ Á÷»ô¢Çí꫇“ÍjߌÛ,™Ó߈ÓºçôØ»ÛÄÓÏÔÏÚÛº·‡‘×8烰»‹ÜĂÖ“öơèÅù×·‡‘×8çÅÄ–¾çÚ½ßÁ‹Ü˜‰j̃ZîSÛÄÓ߈¹Úđå§çɿţqƒÖ9¥‡×9¥‡÷‡óÇÙÚ›¶é™‰kß [ïS­Ø»¼‘Ǽ« ©ƒ»5ƒˆÁ½רÔ‘ÛºăˆŸ;kóÇƯºÙÖñíȘ‰j̃ZîSå×̃ˆƠØû%ÅĂ÷ÙđÄ™Á‰Ûăà©ØÙŒë*««ÚßÁÿ¯¶µë߈˜ÓºÅ–¡ÈŸÜ÷Ú퇡Á÷Ù·̃Û«‚ ½9Æáۋǜڥˆ]1Ở½¡Èđ©‡¥2ßëM½öíê¡È©ÓáƠçψăˆŸ;ÏÔù׃ßÄÙùêåƒvƠÁ9¥‡¡Ô™‰kß [ïSÙ½€×¾Ở‡ Áí—GÇ‹Á‰Û÷ˆ£ØíºĂÿÚÁĂơê¢ ¥ÛăˆŸ̀Ó…&½™‰kß [ïS½€¯È±»ù×ơĂ…ô˜‰j̃ZîS™ÁùêĂÙÇÖÏÄ–øĂÙ¹ö‹Ç¹Á«»߈߈Ó¼ăÄ™‰kß [ïSùêưÀͽëøß»û™‰kß [ïSĂ¼çÚÛ×ưÀÔơ߈©Ơ¯È§Ó±»ơÔÛ«‚ ½9ƯÓ 9¥‡×ƠXµ÷Ù½×¼…ôÙÜÖ¾8ƒáóÇ¿ÙÙ½‰¿IƠXù¾éÓ±ëØó“ívÚª‚ +¼9¾¿‰߈߈ƒv²Ô é×ëöëÚó½ÜĂÙdžګ‡“ÍjÍË)éÛ9¥߈Û«‚ ½9ÛÄÓ¸ÁÛˆñÚ¾º̀Óùơëöø×±»÷ÁĂÈßÖ÷Úƒv¹¾çÚ‚vơêăˆŸ;9¥‡ëöăˆŸ;™‰kß [ïSíêív«‡“Íj(ăˆŸ;âˆÁËéêĂ¼­Ä«‡“Íjû„ßÄÙÏÔÏÔ©ÓœÜù×Á̃¼¿Å̃ÄØϼ‡Ưш›¾½€ù׫·3uUÅôÏÄ©¼Ù½ÏÔ†Ưù×ÿÚ¿ÑÓó#©ÈûÓåñ¿ơÔôêăˆŸ;kÏÔ§Ôå‡÷‡¡Û°»öÍÓ±¿“¹ƯNù×̃Á¨Ç‡½¡Ôǽ9¥‡á ߈›¶éù×Û«‚ ½9¿‰Ϻ­Ö³ÈçØ›¾³ÓĂÏÔÀÉåΚǵر»…öƠÏÅó+ß»ûăˆŸ;kÁƯÛ«‚ ½9ĂĂÓº‹ÇØÓ±»êöÏÔÏÄơê…ô½•Èû›ĂÙáêẳ—Ó°»¶‚׉»‹ÜçÔ¡ăˆŸ„µØµØ߈›¾ñÚĂÓƒßÄÙÍ́Ë̉µa·‡‘×8ç¸ÚÏÔ©‡¥2ßëM™‰kß [ïS½€¾«ÔÏÔÙÚĂÙóÙŒë*«ÓØăˆŸ;щưûÀƯ߈¡Èщù×°»ÓØÏÔËÖ߈ù–“ºưÀóÔ›»™‰kß [ïSăˆŸ;¡ÛÛ«‚ ½9ưÀăˆŸ½ăˆŸ;ÁéÚ×ψŸâÏí™ĂăˆŸ;µv«Ú‹Çø×Û«‚ ½9æÇ ™Óƒv‘ÆÛ«‚ ½99¥‡‡Ú¢ä«‡“ÍjÙ½ËƠĂÙ™‰kß [ïSƯÓ ơêù¿¿́ÇĂƒ•Œ‡º’½¼€ù‡ßÁ›¾•ŒŸ”öƠÄÛ±»«%éÚùˆ™ÁÜăˆŸ;Ù½9¥‡ÏÄ«‡“ÍjµØ߈éêƯº߈ĂöÛ«‚ ½9Žù×ÑÓµa—¶»ØñÓ±‡…ßâ»±»é‰ñ5ñ·ñƇÛÿÚÿÚ™±»çºÿ¯¶9¥‡ïÅŸÈ×½ƠßŲ¡»åẮÁÏÔÿ¼éºíê›đ†ºéºÏî…ƠÛ×ăˆŸÅô½åƒϺçºÙ½̀Ê)èÛ8¤ï½½•×á °»µØĂÙ9¥‡øê·ÅÁƯƠíÚÁËû¨Œ:ÀƯ™`¾ù×›¹«‡“Íj¨¼߈߈§(‡ÚÙÓÜÿÂăˆŸª‡’̀jÙÚ·̣óÇ«‡“ÍjÅØ½ÔÑÓµ•ëö¡»ĂƠ­Ô߈Û«‚ ½9ÅÄ߈Û«‚ ½9¿íơºר—»‡ö8¤‡Ù½Ï̉åÁ9¥‡ß%Ù½‹Ç™‡¹ù‡ŸÄ‡“°½ï½ؽơêƒ×±»‚½ß«‡“Íj¾ẩéºÓ]±¿ß»û¹ÚÅÄÏ̉¹Ø•Œû%ÿ́ÁăˆŸ;ܰ¿Ù@ÿ­ª‡’̀jÀ‡€è/Ö:ƒˆ×Ơ†7§j±»ÇÖù×á$ĐØ›¡Ç"±»¹ÚË¿ϼ²È±»«»ßÄٓ܄ؓó¶íơ¹Ú¡Èж×¾å‡ù×ĂÙÏÔèơ·‡‘×8çˆÿ¯¶ÏÅôÏÔÍÓ™‡ɹ³à‚vưg¥Æ±ëØÓ±ëØ€¼ô£äû̉«‡“Íj釧ÔëöÛ«‚ ½9÷Ù«Ô÷‡¬¿ùê×¾ăˆŸ Á;ñÖ‰y—Óͼ›¾›ÚĂÈ·Ôƒv©-óÇù×Ù×ÿÇ—ˆ÷ÁïƠĂÙÓØ…ö8¤‡½Ù̉éÔăˆŸ;¹ÚÅØ‚±¿̃»úËÇÏ̉¹ÚÏ̉©)¯×‘Æ߈߈Û«‚ ½9Â÷ÁºÛ«‚ ½9·‡‘×8竇“ÍjÅÔÓÅÏ̉ăˆŸ·Ø§¡ëö“ȱ½«ÛÙÓ½¶èÿ¯¶ÅØÙ½áÛÅ„½ÏÅÅÔơÄ‹ÇÎŃvÿ¯¶Ơºm߈ö߈Û«‚ ½9ƒvŒ÷¶ơÔù×óĂº·Øù×Û«‚ ½9ëöŸƒv½íơ×¾Û«‚ ½9ÙӷԵ؅íù×ÁưºĂº¡»‡“«‡“ÍjÙ½Ở²¾¿¾Ù½ñÙù¿³óÙ×½$×ܯ¾±¿ĂÖôăàöÁ¡È…¾ƒà₫ÛùêÀۥغù×ÏÅÍƠÿÚ߈ĂÁÁ©ÓÍÓ½ưÀÏÅ߈Óo¹ơƯÓ ÿ؇۱»‹Ü«»ÏÅ™‰kß [ïSÅ–½½ÈĂÈçÚ–½„ăˆŸÛ«‚ ½9ÇÖ׿8߈ăˆŸ;øêé%‹Ç±¿·‡‘×8çŸÈƼ €Ơ¿‰ăˆŸ;ר‹Ç‰Û™‰kß [ïSµéÓÑÓ½€¤ÂÅô¶Ë Á̉ßøåˆóÖÔÅϼÙ½ñĽ€•ÜÁ½ó°ÁÏ̉ÖÈÖưÁưÀ±»‰ÍÄÂÙ¿º¯G‹øÍÓÛºÀ‹Ü™UŸñÓ™‰kß [ïSÁƯÛº·‡‘×8çÙܤØÛïÅ¿ôÛ«‚ ½9ơ‡¡ÈöĂÙ¿ßïƠ“¼ÿ±Qư£½€¶‡Ö8晉kß [ïS›ÚµÈĂÙ¿‰í—G溛¾÷ïÑ·Ơ£Ø«»¾¿»¿‰¨ƒØ̣ÇÂùơ›¶é™‰kß [ïṢÛÄÓơèŧԩ¼™‡ƒ¾‘ƒˆưÑĂẳψ§ÆÏÅïÅÏÔ¯l©Ç­Ö߈‰̃ÏÅ÷ÙÛºăˆŸ;ÙŒë*«Ó¾éÁƯơêÁƯ½ơÔ†×ÏÔ×™‰kß [ïSá ÏÔ½đÁ Ÿ}™‡‡ŒÏ̉ÛºÄӢǧ¹º½Œº¼ØëöƠ¾G߈ỡ±»±»Ö¾8ơèÅÙÚ匿NÏÅÓÔù×±»’Ÿ¹ÚÍÁëö‹É0ĂÙø¼ƒĂÈ«÷ÇÖÎÅ¿Ư•¾ƒv Á¡È°»˹ƒÁưÀ½Ó‡߈ÛÄÓ±»ïÁ÷ÁåĂÚ×ñÓÏÅ™‰kß [ïS·ØÁëö©ÓơÔ¡ƠóÔÏÅù×Ǽ̉½ăˆŸ×©ÜÏ̉«»Ï̉ׯƠÑÓ8¤‡ÖÏÔơº«‡“Íj¥Á«‡“ÍjÑÄë¿›¢ƒØăà¹Úëö˜‰j̃ZîS9¥‡ĂƒØ™‰kß [ïS̃ˆÛ«‚ ½9­Ä¹Ú9¥‡ÇÖ«‡“Íj›¾ơĂß»ûÏű»©ÓÙŒë*«±»‚½‡Œ±»åŒ¿N«ÔÏÔăˆŸ;ù×™‡ÎÔù׿Åß½ÏÔÑÓăÛ«‚ ½9Ï̉ùׇº›·ÔßÄپߴءÁ•ŒĂÙÏÔëöåB½…àÅØ¹ƒv÷ˆ•ͪ߈ưÀơêé£ɇơèÅù꿉›¾÷¢XßÁ—¶¤ÆÏƒv¾» ăà’½¹Ú¹ÚóÇơꘇƒàÿ¯¶±»àƠnÀĂé‰ñ5ñ·öÁĂÙ·‡‘×8ç£ä·Ô߈·ÔÁ½€ÇÙÚơêÿ¯¶߈ÁÓ«‡“Íjÿ¯¶ÑÓ™‰kß [ïS÷4«‡“ÍjŽƠÓÙ½±ƯÏÅÑØÛ׃À¡Ô¡/´Ăùê9¥‡÷‡©Óù׿‰ƒàÑÓ߈°»íœ«º¹Ú»˜‰j̃ZîS™‰kß [ïS©àív«·3uU»Åéê‚vơèźëÔŹÚóÂÅíÖ‡ÇÏ̉íê­‹Ù×ù×ñÚ¸.Û«‚ ½9½ÿ¯¶Ăí$ÛÀÛ«‚ ½9ïƠ—¶ÑĂÍñƠ9¥‡ÿ$¡Ô‡Ç·‡‘×8çÛ«‚ ½9™‰kß [ïS±ÁÓºåĂ߈¡Áƒ½Û«‚ ½9«‡“ÍjÙ½щ«â9¥‡ä̉¥Øå̉ µØçÚ½ưˆ̉ÅñÓ™ÁÁ¼÷ˆ¹øÜÀëö¹ó9¥‡₫®¶«ÔÊÇÅÔ±»ñÚăˆŸ;«‡“Íj›‡öå̉ ñÚS€ƠéêÁƯß„§Ô©Ó›‡±»íơ©Ø°»ƒÖ«Ô¬Ø›¶éÖÔ†6¦j·‡‘×8çÏÅå̉ Ï)ƒ½ô¿º…ö¬ÍĂÿÚ¹ÚÙŒë*«ÎÄ—ÓÛ«‚ ½9ơĂר•ư“ß»ûơ걻﻽«‡“Íj·‡‘×8ç·‡‘×8穼ÏÔ„Ơ°»­v…Ơ°¿±»Û×ù×Á̉¥Óƒv«‡“ÍjăˆŸ;Ă«‡“ÍjƠƠ“÷ăƯÍ™ëéå±»ù¾˜êèä³tÛÀº«‡“ÍjưÀËÉ9Û«‚ ½9Ơå̉ ƠʼnÛÇØï½ơÔ™‰kß [ïS¶‡  Ö8 æ 󘇫‡“Íj9¥‡ăˆŸ¨Û×½ĂÙ±̣ÙÚ±»ùê½Ùï½àÛ—ÓÁ½½ƠØóƠ½ĂÙ…àÏ̉߈—ÛñÚù×ưÀ¶÷ÚÏÔÛ«‚ ½9ƒvß»û¼Ôö«Ô߈Ñ·ÏÔóǧƕÛË̉ÁƯܺÛº¿ß÷ˆÍƠăˆŸ;«ÔÑóµØù׃ˆ¢äÁÛ«‚ ½9­Äÿ—‚v匿NŽª½³Â»‡ăˆŸ;k‡·‡‘×8ç¹Úñ‡µ†‡ô÷Á™‰kß [ïS™‰kß [ïS§ÔçÚ¹Ú±»ëöç̉ÙÚ‹ÜÁƯ÷‡ÜßƯÏÔ³ÂăàÂà›¶é¦ô—¶ĂÙƒØÏÅ—»å̉ ưÀưÀöøéӋܧԗØÙÚ¿‰£Øëö½½gÇÖ±¿ÍÄ™‰kß [ïSùêñÚÔ¹ÚñÓíØÚº÷Á¾ó#™‡ÁĂĂÈåÖÑÓµØù×±»ĐÄ#ê#ơÄÅÓµØ߈³×ÖĂÏÔ˜‰j̃ZîS»ô½ÿÚ½ÔƯÓ ¹ÚçîÛ«‚ ½9̃ˆ¶ù꫇“ÍjóÂéêèºăˆŸ;ưá‡ÚŽñÖ©¼™ô…»Á̉ÅØ¶‡Ö8æéÓÙÜâ)ÓÁív“Ơ«»ưÀ‰!Ù½ñÚ¾ºÛ×ưÀ™‰kß [ïS™‰kß [ïS“Æב߈©ÓµØ÷Á‡wÁ×ÑÅÙ½9¥‡ÁĂëöíÑÓåÁƠXëö¹ññƱ»đÓ·#¿́îº «Ô«‡“Íj߈ƠĐÄêÛ«‚ ½9ăˆŸ;߈‡Œ½Ù½߈èêµØ¡ƯÂÙ÷‡ß»û½Â‘Ô£‡ƠåƠµØ›Úź™Ó©߈߈ÁăˆŸùסԱđ›Ó…ÖÛ«‚ ½9߈Û~ÏÔ©ÓÑÓ߈߈™‰kß [ïSÁ̉°»®Ó™‰kß [ïS§¹ßçƯÆ·‹ƒÿܱ½ƒvÍƠ÷ˆñÓĂĂ ›­±àéMÑû¶•½°» ơØ™‰kß [ïS̃ÄØăˆŸ;«‡“ÍjÏÔù×±»ơÔ«Ôơê“ƠÅƯëØ¥ˆ]1›¡Û«‚ ½9êöỞÇĂ«‡“Íj́ơ«‡“ÍjÙ׋ǡÔïÁƠÑÓĂ¼±»»×¾ăˆŸ;Û«‚ ½9ưÀÁÚ¡»ØëöźÏ¡»ä̉  Ɠƙ‰kß [ïSÉ2«‡“Íjù×™‰kß [ïSăơ¿ÅĂĂÙơ™Ó½ïi“ƠăˆŸó©¼·Ó ¥0ÅØ“ƠËÇ߈¿ô­Ö‡a±»ÍË)éÛ9¥ÑØ߈ͼơêº~ƯÓ ÓƠñµaÏÔ½‘¼ÿ¯¶ơÙ̉ưÀ¡ÈơÔơµÈ»½ëÅ»·Ô¸óÔ߈¶Ô‹Û“¹ƯN¢Èÿ¯¶‚v9¥‡ơê·¼Í7öÏÄăˆŸ;̣ǼùרÅê½ØµØÛÄÓÂăˆŸÔXéI·ÔÑÄëå̉ Æß»ûÏÔ‡ŒÚƒ9¥‡Ç"ÿÚ™‰kß [ïṢǃv¡ÛÇ"î»‚Ú £äó±¿ưÀ¡È…Ô»™‰kß [ïS•ŒÙÅ냾‘ÏÅăˆŸăˆŸôñ‡ÑÓÏ̉ƒÙÓµØăˆŸƒØ‹Ç9¥‡ÏÅívĂÈߌÛ,êöáØ…₫ưÀ¶ïçÛ«‚ ½9Ù×—¶ô–¶ºÁ̉ÿÚî»÷¡¡Ûé×ÛÄÓéÚרÓ¾»¼‘‚v‹Ü›¶éæÚרçùꉿIêöÛ«‚ ½9±»•ŒăÁ’½‘ơù×ù׶ܱ½Ó¼Ơừ·ØÏÅ™‰kß [ïSÏŽÔùê÷Áøê«·3uU™Ô©]ÁƯƒvÙ×Ó¼›¾«‡“ÍjÅÔô“Ơ¹ ă»¾ºÚÀ›¹ÿ¯¶«‡“Íj́ºơ꛾™‰kß [ïSÏÔ›½…»Á½Úª‚ +¼9‡Œ÷‡½»âÁ±”ƒ³Ø™‰kß [ïS—¿Û«‚ ½9%”Ö£»9¥‡ÓØăˆŸ;ÏÔÏÔǻ£ä™ÁăÇíî»ßÖáÏÔ›¡öÔ%¶Ü™‰kß [ïS¹Ú™‡›¹ßÁ”2ÑÓ«»̀Ê)èÛ8¤ÍË)éÛ9¥ĂĂ ›­±àéMçÚ̃ˆƠ€ÏÔ¹‹ÇÙ½˜êè䃋éÙÚ߈·Ø‹Ç‘Æ‚v¹ÚöÑóëöƒ½ĂÙƒv¹ÚËö½ñÆÓŽ€ÍBáê›́¡Û«ÔŸ ¡Ûâˆ:p™‡åô÷Á‹ÜăàßÄÙơê߈ĂÙÙ©Û«‚ ½9ƒˆ¹Ïż™Ó³ÇçÚ±»ăˆŸ±»å̉ ½€ñÖÙ½åÑ­ÔÓ¾¿‰‡çÚóÇ«»ËÉ9›¶éÄ–Û«‚ ½9ׯ‡¿ÑĂɇ¾·àÿ$¡©ùÿÚÔXµ†ĐÄêưÀ½µØ9¥‡ï½ăêăˆŸ;9¥‡ù×ÿÚĂÙÏÔÍ­HÑÄëĂÙ½ăˆŸ¹Ú™‰kß [ïS¹ÚñÚ£äăˆŸ;—ºĂ ÏÔÏÔù¿¯Ơ…××¾§¹ÓØ‹ÓÓÅ•¹Ú÷¼ÁƯ…ƠÛ«‚ ½9¬Ä¯¼£»å̉ ÏÅ9¥‡…Û›vÛº‰¿IĂȱ»Å–“ƠÑĂíÖù×ÑĂùơÁ©Ø—¶±Ñ曡÷¼Î̉­ؾʹù׌ÓÛ«‚ ½9Ơ¼ ‹Ó©&ĂÖ&ç4•ÛíÆƯ‰ỞÏÄ­€¹ÁßñÓăˆŸ;Û×߈Û«‚ ½9°»ñÆñÖĂĂëö¹Ú«‡“Íj¡Ô±ëعÚăˆŸ;©Ø›¾«‡“ÍjŸŒƒˆ₫³ Ơ§ÓË¿›vƒvçÚ‚vÍÄÑÓ«Fß„÷ÁµØ¼Ô߈¥‰ÍL…é‡ăˆŸ;k§ÓóƯºĂíºăˆŸƠ«¼ív©Óá=ùש‡¥2ßëM©Óÿ¯¶¾ùשӃvÏ̉ăê Ûóǣعڰ»»Ø›·ÔˆÔÛºœ‡‹Ç½›©Ó¿»¹Úå̉ ߈±»ÏÅĂ«»ß‰¼ÛÄÓ9¥‡±»8¤‡íêóù×—¾Ûê¥Û‚vßÚ½щɹ¹ÚßÄÙÜÂĂºÔ«‡“Íjëö«»ºĂăˆŸ;¥#·‡‘×8ç‡×—¶»½“¹ƯN©Ơ£äûó‹ÈÛ«‚ ½9Û«‚ ½9…ؼߌÙ½ÏÔ©ÜƠ™‰kß [ïS‘±“ÆÄÁ™ÓÙÚăˆŸ;ÖÆ÷Á©&ăˆŸ;ÁĂÏ̉éÚ­Ôׯ߈ùêù×ù×«Ô‡Ç©Ø«Ô Ëû±ëöƒvÏÔ‡ƯíµÏÁ‡é/×:ƒvÿ×ôêæôÍË)éÛ9¥ÚÄ̉ÏÔë烴‡Ç¡Ô±»ù×áÅÙÅëÏ̉» ÁÛ«‚ ½9ËÎơáÓå̉ ̃ÁÓ™9¥‡Û¥Í¥ºçÚÙĂ«‡“Íj«‡“ÍjƯÓ “ƠÛ«‚ ½9ÏÅϼäĂ‹Ü³zơêøêׯ‡Úù×±»ăơ­ơ“È›¾©‡¥2ßëMÏѾ‘Úª‚ +¼9÷Á‡×·‡‘×8癉kß [ïS©³…Ö«»™‰kß [ïSÓºưÀ¹Úơ꽭ĩؽٽï³2ÑÓ±½ш±»źÛ«‚ ½9—ˆ«Ú‹ÇÛ«‚ ½9ßÚ™‰kß [ïS©‡¥2ßëM“ÈăˆŸ;̃ˆÛ«‚ ½98¤‡ËƠăˆŸÙÓ¼€—ˆưÜÈ#…غ›¶é½ñÄ߈ëö߈ö´‡¯Ă÷Á9¥‡™‰kß [ïS£ä“Èẳ«‡“Íj»‡« ©ƒ»5ăˆŸ;©Çÿ¯¶½±»ÏÅ9¥‡ÏÔôÏÅ……ˆ±»™ÓăˆŸ¸_ÏÔ‚vƠ…¢ ƠÙ#½Û«‚ ½9«·3uUªÔù×ĐÓÆ›ÏÔĂẩăàÏă»ëöÏÅÛ«‚ ½9߈á=¯¼ƠX߈Á¹߈ù×ÓØïÏ̉©Óù꛾¡Ơ€Ơܺ¬Ä»¹Úº½¤ˆ\0Ôơ ™ëéåùꩇ¥2ßëṂßÁ߈ơêÛ×ÛÀ«‡“Íj¾ÄÔׯׯÿ§‹Ü‰çôµØăˆŸ;±»Û«‚ ½9‰y´߈·‹­Ä•Œ¡Áív½Ôö¯¾ÏÔŸÅăÿÚ›Ú§ÓËÔơp·Ôơı»âà?ƒƯëÚ™Ô¼€ƒÚª‚ +¼9“Ö¾8Ï|ăơ™‰kß [ïSĂÙÿÚßÚ°¿µ†°»¹ÚÓ ‹›æÙŒë*«ÙŒë*«ù×ÙÚ±»¢äëÔƠ¹]ßÛ«‚ ½9á—Ø‹Ç±»Ă¼ĂÏÇî9¥‡×«‡“Íj߈‚ˆ£ØÔ½ù×£Ô©¼¼ëö̉¼ù×ÇÖ­Öù×íØøê½Ô¡ÁÙ½߈˜Ô™‰kß [ïSåô߈«‡“Íj́ÆÏÔăˆŸù׬Ää×ưØÏÄẳƒvÂï»Ç̉׿8¥Ư³¦È¾˜‰j̃ZîSÑÓ™‰kß [ïS¯Ơ°»߈ÑÓ¾ăơéÚ¹ÚơèÅ߈µØ¥‰ÍL…©¼™‰kß [ïSơĂÚª‚ +¼9‡9¡…¾±%«‡“Íj½±º³Ø·¼Í7¾ÅÛ«‚ ½9Ù½¿ôÁƯƒvĂÙÿ¯¶ÛÀùơ™ÔÏľ(±¿½úƠơèÅ›¹ù¿ù×µØÇù×½€Û×½¾˜ÁÛ«‚ ½9›¾á ƯϺ…àÏÔ³Ù½ж9¥‡£ÓÁÛ‹ª-ƒØÓؽ€ƯÓ ûØÜ½á—ưÀÍĂɽÁ߈‘ç›¶é—¶ÑÓ“ơ½‰êăóù×Û«‚ ½98¤‡ǺĂÙÿÚóËÇ©ÓÏÅù×ÅÅØ™‰kß [ïS9¥‡ëö“Ơÿ¯¶†Œ™Ó¥ˆ]1µóó™‰kß [ïSƒñ˜‰j̃ZîS‡,‡Œ™Á±»ÂĂÙÚ§Ô߈ÿÛÅÔ£ä©¼ÓæÙׇŒưÀơèÅ™‹ơê£ä·Åâ¼Û«‚ ½9½Ô«Ú—¾•%ó1³8ëößñדƙ‰kß [ïSͽ±»ù×”·ÔÔºlăˆŸÙ-¥+±¿ç*éôóºăƠ©ÓơêƠ¡ÛÏÔÛ«‚ ½9ăơÏԜӿ»ưÀ¢Ç£Ô»Øù×ɱơêˆ;ÛÀËǘêèä•Èû›¹Úâˆă­·̃ƒv9¥‡öÁù¾÷Úëԯ׃ù×Ï̉̀ĂÙÚÏÔÑĂ߈½ë́ª‡’̀j¿!ñÚ߈߈ƒv˜Á¸ÚĂƠ«»½Ă™‰kß [ïSù×›¹ëöªÚ¶Ë˽¯ÈƒÖưÀ±¿½¿ÇÖåÁÀĂ «‡“Íj™Á±Áº‚v"‡º¹Ú…ƠºØ±»›¾´†µÀ³½‰½ñÆÉ̉±»ÛÀ¡ØÓºăˆŸơ²¯©ÏÔÍƠÿ¯¶¹»­Ä±»ÂÙÛ«‚ ½9÷Á˜Ă߈ȈԱ¿߈ÇÛÛ«‚ ½9ăÁ‚½™‰kß [ïSÇÖ§ÓăˆŸ›¡˜êèä±»߈߈»ÈƠ˜‰j̃ZîSëö±»Û«‚ ½98¤‡Ï̉ïÚ·‡‘×8çϺù׿ôÙ̉‰ÔÛ«‚ ½9åƠÏŵØăˆŸ;kÅÓ±»¯È‰ÛG½¹ÏÔÏÅ…öïƠ¯G‹øç̃½ƒăê½ëöÏÅƠÄÏÔÿ–“‰¹¼ỞÙÓÿÛƒvø¼ĂÙź©‡¥2ßëMº×¼߈˜êèä߈×$ÙƠÅ–ßÏÇ%߈×$±»רŸÈ‘°߈̀ Ê) èÛ 8 ¤   ™‰kß [ïS™‰kß [ïS«Ôº³ÇÏÅéƯÓ ƠÅÆûƠ߈›ÏÔƯÓ ô߈˜‰j̃ZîSÏÔÂÙå̉ ™‰kß [ïS÷Áù×̉íçô篾ÎĂĂ ›­±àéM‹ÜÁ½‡æđ™‰kß [ïS™‡“Û¾« ©ƒ»59¥‡½¶È»ØµØ¯¼í‡ºÖçôŒ½ å׋¸Êù×߈ĐÅ éÔÏŃˆ¥ˆ]1ÆÜ¸ÚæÔ öÁÛº­Äÿ&߈Ă™ƯºÁ ưÀÍBÛ×ÿ$ĂÈæº—»‹ÇÜ ±»ø×âàăˆŸ;å̉ ÁĂăˆŸÏÔŸ ÇÖ•Èû›¸Úù×»‡Ù½§ôψ߈óÇÇù×–¾Ăº«Ôơµ­‚vƯ‰ëö™‰kß [ïSß%˜‰j̃ZîS•½ÏÔ•Œÿ±½›¶é¾£ÔÑÄë£ÜĂÙ–¾ Ă ÇØÿ¯¶ºÛêù×ëö÷å5Ó£»ÏÔ‡º¶ºăˆŸóĵaăˆŸ;‹‘‚¾›¾›#¡3© Ñ%­’Ï̉¶ºăˆŸ¹ƠÁ˜æZ—¶ưÀÙŒë*«ƒvçÚöưÚ‘÷ăˆŸ;…̃퇺̃ˆÿ¯¶ÏÄ›Â÷ÁÛ×Ö ù׬ÖĂËÉ9߈³u¥Û½ÁÑØ³È‡(ÍÇ“Æχù™Á“ƃˆ½ƒvÓ½…€­:º̉·‡‘×8çƒvרÏ̉™‰kß [ïSÿ¯¶ƠÜ…»…Ơ·Ó ¥0Ù׃×ưÀׯÆ̉“á¯ÛÙ½߈¬¶ƼăˆŸöơÙ½† —ˆơÔÏÅ»ïÚ‡äĂÙ·ÔûƱ»Û«‚ ½9Óàăµa±¿ÏÔ§Æï‡ăÇí·¿шÅØÍÓ«‡“Íj™‰kß [ïSù׆Çù׫‡“ÍjûÚª‚ +¼9ơêÏÅ«‡“Íj¡hÏÔ±»́vïÑ«‡“Íj‡“«‡“ÍjƒvĂÙñÓ¥ˆ]1̀Ä(‘Ö߈½ÏÅÙ̉™Ó—¦Û«‚ ½9ïƒ̃ˆ½€ñÚÓØ߈‰¿Iù×ñ‡×ËÓ·øÑĂÙÚăˆŸÿ¯¶ï²2 ëöÑÅÏÔĂÙ¡ÛùתdƒvŸ»‡ñÚÍÓ̀Ó©ƠĂÈơı»ăˆŸ;kăˆŸ;ßÁëöÙ½™ơ÷‡ÙÚơÔ™ÔÙ½ơê“Ơ£»óµØ‡x™‡đ¹˜ «‡“Íj·ÔăˆŸ;k·ØÙܧȃ¾‘™Û÷Ú× ­Ö´Ø‹Ç߈9¥‡ÏÔĂĂȯȡ۩Ó߈ĐÓÛ·‡‘×8çí—G¡÷ïƠØ×Ưºù׋ǶÔÑ”«‡“Íjå̉ §Ơï½9¥‡ÏÔ±””ÈúŸ}èÓƠX“ȱÈÛ«‚ ½9í·‡‘×8ç£ØÛ‹Ü¥Ó¥ÓÙƠÂÙÅØª»/Û«‚ ½9€ºĂ¶̀Ê)èÛ8¤çÚ©À§Ô°»±ÔûØ“½ÅÓØö›¡Ó‡©Ø±»ͼơêĐÓư°Ûש¼ÓØ•ÿ´†™‰kß [ïSÛ«‚ ½9²½߈£Ô½‡ñ5¯é«d9¥‡ØË̉ßÖ¿ºƠXá ·‡‘×8çê$wÑÓ«‡“Íj‚v߈½€ÛÄÓ£ ¹Ú߈±»¸Ú ߈çôívÇÓ·Íß„Ž·Ô©Óɇ‡ÚµØËÉ9±»̀ÂUÛ«‚ ½9÷ÁÍÓ¶³đÇÖăˆŸ;Ù½“Ơù̃„ ™Ô÷ÁÆØ í֋ǹÚñÓĂđÓ—¶óíÛßù×½¼ăÁ›¶éù¾“¨çÚơêá=Û«‚ ½9ÊÈ9 +ù×âÂ3ïÚ‡Û§½ëö³½ÅÔ›ÛơÆŒ«‡“Íj‰´·ÅùêƒvﻫÚöơêôê÷ÁöưÀ©¼§ÔËÓå×±»½ùê«Ô¶Á¼ÿ¯¶íÖ™‰kß [ïS˜‰j̃ZîSívĂÙ%߈ÓÅ»ØÛ«‚ ½9ƒ߈ËÉ9³×̃Ư‡Œơꆌºn §ÓơĂר‘Ûéºæ̉öăˆŸÙ½µØŸlöܹڇ¦¹ÚăÇí›ö¿»ËÉ9›¾éÓ·‡‘×8çÖÆ¦‰…ô«Ó³½«‡“Íj«‡“Íjơ‡‘±»Øă‰»Ø¿‰ĂÙÂÙĐĂ™‰kß [ïSö库‰3Ơ,ùđÆ«dÏÔív·Ô÷Á™‡«‡“ÍjÖÄÍÓÏÔÛ«‚ ½9Ÿí©ÓÅ“Ơơê·Ô¥â‹Ç¾Ï|ù×ö9¥‡×ƯÂïÀ«băˆŸỞÑÄëÏ̉‰¿IÁÛá=­vƠɇíÙà́Û«‚ ½99¥‡ºĂ “½¤ˆ\0Û«‚ ½9߈çưÀ9¥‡×ĂĂ·‹›¶é±”£äĂÙŸÖĂÙÏÅ™‰kß [ïSûơê±”·Ô‡á ߈È¥ˆ]1·Üá ¡Èơꙉkß [ïS×À™Ô»9ÍBöơ„ÇÚưÀƯß½ăˆŸ½Û«‚ ½9ͼ°»đÓû(¶ÅÛ߈ÁƯßÔ·Ô˜êèä¶Ô©Ü÷)ï½÷Áƒv¶Ôëöû½Œ‡×¹óÛ«‚ ½9±»÷ˆ̀Ó₫®¶™ºĂ8¤‡¿Å™‰kß [ïS—ơ·Ó ¥0¿‰·Å½âà Á̃ăˆŸ;ó÷»×¿8ÿǃv•½¾ßÛ«‚ ½9ÿÚ°¿߈¶Û×ÓÅêöÏ̉˜‰j̃ZîSÅØØ×ßÚ„»‹ÙÛ«‚ ½9ÿ¯¶ù×áá₫®¶ø×#éÚ‘«º̉߈™‰kß [ïSï»¶ª»߈ƒµÿÚơ꽺Û꫇“ÍjçÚö¥Ûƒv߈ƒˆ¹Úñ‡ôưÀÁ¼ĂÙơê·Ôù׫Ô岩¼ívÏ̉ù×ÅØĂµ÷ڳدȓ¼†Œƒv‚×ö“Ûº÷Ù§ÓăˆŸÏÔ˜‰j̃ZîS«‡“ÍjÙ½á ù×¥‰ÍL…º½Èêö™‡ơÔÅ–©¾Ÿè9¥‡©ÆĂç½ÆØÏÔ¯¾Ç̉µß„«‡“Íj™‰kß [ïSÅÓ󷇑×8çĂÈù×Åԇ׉¿I½›‡Ÿ»ûÜ›¾¡ÇÓÅăˆŸ;óÂÙÚ°» ƒơÙ½‹ƠÛ«‚ ½9µvñÚ߈ù×±¿ôÄ礥ˆ]1ÉĂù×ư‡±ù1ÅÄ™‰kß [ïS·Ó ¥0…ù×ÍË)éÛ9¥½€‹Ç™ÔÅ–ÓØÓ¾Ùש¼ÙÚ×Üï»å̉ çô·¼Í7ÏÔ·‡‘×8çÿÚëö̃ˆưÀ©ÜöéÓ ¾(±¿Û××àù×ù×ÊÓ§Ó›¾ƒ½±»½÷Á·ÅơèÅÀĂÇÓƠØ߈ñÓăơăˆŸơÔ©›±—¶¼¯ƠûÓ™‰kß [ïSçÚÓÓÿÚ̀ÿÚ߈ÁĂÛ«‚ ½9ăà«»¡Á¹ÚÑĂɹڧԙ‰kß [ïSâ» ăˆŸ;Ûº€ºÖº­Ö¿‰¿Ø·¼Í7ÿڙסۅ»ƠÁ̉ô›¾‘³Ù½«‡“Íj½ßÓÓå̉ ÆÛ«‚ ½9—ÓÙÚΈăˆŸ;Ù½ă÷÷Ù—¶ëöÙŒë*«ĂÙ™‰kß [ïS±»á¬³ ƠÁ½‚v™‰kß [ïS™$áƒåëöăơÅØ÷Ú‡“ÿ¯¶½½Ăÿ¯¶™‰kß [ïSơê…@§ÓöÛ«‚ ½9«‡“Íjƒă‘·¿ºô·Ô‡Œ“Û±»ö¿ºçÚƒ¾‘ƒÖÚ»«ö«öÍBÔÀƯ÷Ù±»ƯêóÇÆÖœ‰¾IÓØưö¿ÀÍÄÜñÚ›«ƒvăˆŸ×¾ívơê߈߈ĐÓ߈Î̉ ăˆŸ;Ù½€ÏÔ›å̉ ½€÷ˆ—áù×­ÄívôêÛ×߈Ûº·‡‘×8磻¾£ÇÛ«‚ ½9ºÛY™‡‡ºÙ½Û«‚ ½9Ï̉«‡“Íj™‰kß [ïSé¹ù×ƯÓ ½ͼ÷ÁËÉ9‡ŒÏÔÓư§‡ÏÔá×8¤‡µØ·‡‘×8çă»ÅÔÇĂƒv©k½ÎÔרÍË)éÛ9¥ïÅĂÙ±»ơêö½ÏÔÏ̉߈‰¿IŸÖíÍÄëöỂÛ«‚ ½9¼ÇØ›¹Ó̉¹ÚÏĹÚßÚÏÔơêÍÓßÛÙÚăˆŸ¬¿ÑĂÿ.ÑŃv‡Ç«‡“ÍjщÍË)éÛ9¥ÛÏŽÔơê‚v̀Ó +Ž¿‰ÏÔ÷Úëö÷Ú»‹Ă‡xăˆŸ±¿°»å̉ ›ÛǺÓ¼‹Ç½€ÙÚÿ§ÛÚơê߈ä̉ÍË)éÛ9¥ÏÔ™‰kß [ïSÙ½ëÔÇֲ ÏÔ¹ÁùסÁ™‡æ‚×é·ƒvá ߈‘°÷ÁÑÓ½€±–£ä¯¼½ÙÚµÈÛ«‚ ½9ëÔ¹ÛŸÖăˆŸ;k½Ô躳ÁĂÚª‚ +¼9Á¼ă‘·•ÓùøÎ̉©ºĂκç/Ù×°»ăˆŸ;kĂÈáƠÛ«‚ ½9±»Û«‚ ½9ơÔ8¤‡Ö¯9¥‡“ª‡’̀jÛ×Ăȱ»ö½€¥ÛÅØçôƠÏŃvŸ}ÓμăˆŸÛ«‚ ½9Ù܃văˆŸăˆŸ;ăù×ă¼™‡¥Ç™ô«l‹ÇÛ«‚ ½9’¹ÜNÍÓ½€ÏÔ½*ưŒ™‰kß [ïSÑ·ѶÏ óÔ©ÓöÏÄÁĂ³(ñÓ߈ù×ĂȽỔăˆŸ;ơé±»½ô™‰kß [ïS½€Ÿ¿ׯơê³ÛºÉ6ƯÚº߈«‡“ÍjƯÓ ³Œ˜êèäỞ³à³È…ƠÅØóÔÍË)éÛ9¥߈߈ÄØ©Èÿ¢äù×ùêŨ׼ƒ½ÛÔ³­€“Ơ›½­Ô˜‰j̃ZîS‹ÇÙŒë*«×Óψ¿‰ÏÅ»¹̃ä̉&&¶ôÙ½»yÉĂ‹ù×Í#©ÓªÚ±»́ví—GƧӋǡƠÛ¹Ă£«‡“ÍjÛ€ÔXå̉ ¯×Û«‚ ½9ăˆŸ;ÿ¯¶‹Ç½‡©Ç¡ÔÏ×ƠßÚÑÓÓØ“ȋܺ½ï»ÇÖר9¥‡×‡×½ỞÓ“Ơ»•{éê™wùµØ½ÏÔ¶«Ô©¼ơêµØª¶2tT«‡“Íjͺ…Ù-«»Ù½åô±»ÓØ÷Ù½½̀Ó ߈›TÓíÑÓơÔßÄÙÓØ÷Ù¹ÚÏÔ½çÚÏÔÛº¶«‡“ÍjơÄ©‡¥2ßëMÙ×½·¢¿º˜‡‡Œ±»¿‰̃ˆíꙇƠXÏÔƠX„×ñ×߈ơÔщ™‰kß [ïSö-™ôÊÇơÔëöëöÙ™‰kß [ïSù×ơêƒvÍÓóÂéí9¥‡ĐĂÏÅ•Œ…̃Å×ƯÓ ­Ø¯¾‹Ç¾ïƠ™‰kß [ïSƯŸÇˆÑÅÑçôăàÚº…ÔÖĂ¥‰ÍL…»Á¸Úƒˆ±»™Á™ôïÚÓ¾¾ĂÇÖëö°»ͪ™‰kß [ïSÛ«‚ ½9³1±»×Ở‡ÅÓÇ8ëöívÁƒ(ƒÖ³Èëö޵aßÚå̉ ±»ù׫‡“Íjù×ËÇñÖÓë­ºÓØå̉ ›¾­ôĂº¡ÔƠùµÀ µØéÚçôÉÖ߈ơÆÙ̉êØÙڜӺ̉¼Ë¿¹Ú† ׯÙÚ½›v±»™‡¹Ú߈‡ºŸÅÙ½ơêùê9¥‡‡ºŸ}ôê´¸ØÛ×߈«ÔßÚñƇŒ·Åó­v›¾ô¸Ú±ÈàÓ™‰kß [ïS™‰kß [ïSĂÈăˆŸ;kÏÔ™Á±»ăˆŸ;k£ÇÛ×÷Ááê¡Û£ØG½¹ÑÄ뛾¿¹™‰kß [ïS؇Î9„™ëéå÷ÁÙ½“ÈñÓ߈‡(«‡“Íj±¿÷Á±»9¥‡¾!Ó£Çư“щ¿‰ơêÿ§÷4ËÇéÚøôéÚ¹ÁßÄÙăˆŸéÚ«»ÑÓÎÅ罟ÅăˆŸ;«Ô£X¡È›±»¹Úù×éÓ‰yûÓ©¼“ƠÏÔù×ù××ڦȗ¶œ‡¡Û¡ÓÁË«Ôٽ˿€º9¥‡“Ơ“Æ™‰kß [ïS™‰kß [ïS¶‡Ö8æÁ̉¡Ô·‡‘×8çË̉ĂơêĂÎÛ«‚ ½9ôù•Ö߈ЉÛ¿ Á•Ü«‡“ÍjåÁÛº‡¾ï»«ÔˆŸù×ĺ ùêÿÚËƠÏÅÛÀå̉ ăˆŸ;™‰kß [ïS˜‰j̃ZîS߈·Ó ¥0×Ơ†7§j™‰kß [ïSÎÔ’Û©Çׯ­ÈÎŋܡÈưÀ°»ù׃véÓË̉·‹ƠÙû؃×Û×±Ư÷ÁµØ©‡¥2ßëMưÀ›¾ơÔ˜‰j̃ZîS©À®ÈÀĂù×Ï̉£äª‡’̀jăˆŸ;ÂÛ«‚ ½9Œ¾ÿ¯¶¦º¿ß±»«Û›¾É‚vưÀƒÖù×ơÔ™ôíqăˆŸĂĂ“È¬È½ÈƠ °»ß»ûĂÙ›¾ăˆŸ; Ôº“ȳصؽŒ¾ËÖơÖ$©&À¼̀Ê)èÛ8¤Ù½º̀¬H‹Ụ̈¡È¯»­º™‹ƒ×½—¾ô¨¼›¾ù¿ÁÙ纣 ĂÙ¡ÈÁ½—¾ëö±»¾ͼÏą›ǛvÄÁøʹÛ«‚ ½9Ï̉‡ñ5纙‰kß [ïS‡ñ5Ñæ©‡¥2ßëMÏÔÏÔ«Ỗ»ú‹ÜưÀÏߥÛå×±‡‡Ç©¼™´ƒÔŸ}µ!¿Ø›¾ÿ—ĂÙ÷ˆÏÄ›Ăù×Ù½ĂĂ ›­±àéMÛ×ëÓ³Ú×ơèÅáƠ߈ŸÖ¯È«‡“Íjî¶Ó̉›v±»Ø×ôÑÓ«ÔóÂù¿ăˆŸ;Ơ9¥‡™‰kß [ïS½—ŒÔöÁÑïîáí…ơÔỔ½Z¹ÚÁƯ™‰kß [ïSù×ׯ™ô…Ûö9¥‡±»ÇÖ«‡“Íj€Ơƒˆ·ÜăˆŸ;¥Û«Ô©Ç©¼ÔƯÚù×ÓÆ¹ÚëöÛ×Ở±»ƒv̀Ó“•ôêƒvíÆĂƯÂơĂ“Ơ£ä«Ú¾ù냽±»ù¿™‰kß [ïSÏÅ…Œˆ»¶ô™‰kß [ïSăà߈ơÔ½Û×·Ó ¥0áêƒv麱ßÄÙ¾ăˆŸ“¹ƯN½¦Óù׺™‰kß [ïSùêÁ:åô߈Óư“ơÔËÇÙ½¼Ư ¿G½¹›¾ăˆŸö÷ÙçØµ¾™‰kß [ïSµØ½Ü»ƒv߈ÊăˆŸ—¶È́–G‰¿I©¼Å–Æ%Á½Á×ÏÔ‡ºùÛÂÙß»ûù×™Óºn›Ú™Ô߈¿‰¿́Ăà%Û«‚ ½9±½¥ˆ]1ø¾Œ¾8)¤‡)Ö½ÇÖ÷$ßÄÙÍƠºmÑĂ½̉ØñÔ«»Ó؉¿Iû‰¿I«‡“Íj₫¼÷Á©Ó½Á£»±½áöÿ¯¶‹Ç»ĂĐÄ ê ÏÔ•Œ«ÔÛ«‚ ½9’Çå̉ £Çƒv½ù×½»Ø£Ôß»ûç̉áÎÄà“ùêăÚ½ØỞ‡ºÛ«‚ ½9·‡‘×8çăà¹ÚÙÜÙ½¹Ú÷‰ÇسȡƠƒˆ«‡“ÍjüÀ‚ÚÛ«‚ ½9«‡“Íjû(Û«‚ ½9ׯ¹×ù¿₫«‡“Íj™‰kß [ïSÛ«‚ ½9‰¿I™‰kß [ïSÏÅ߈ĂĂ ›­±àéMù×å̉ «Ñ¿‰߈‘“ÙµØÿÇăˆŸÓØÛ«‚ ½9•îËÇàƠ«·3uUºyỞíê߈Ü%§Ôá ƒv”߈™‡ĂÙ©‡¥2ßëMÁƯÛ«‚ ½9ÏÔơ»Ù½ëö¹Ú¼߈½߈àÅù¿€ºƯÓ ½„ëö«‡“Íj­½¼…Ø«‡“Íj¿»½ăà£Ø±»½€á đÙÓ£ÈáÛ½ÇØÙ#Í½μƒØ‘ßéÚñ~¼ôÎÔ™›¾Ơ·¼Í7ưÚÀ½ó–ĽÅØßÁÏæÚưÀ™‡§âº¼  ƒÜ×Ơ‹ÜơÔÚ×ó#ö»8¤‡Ö±¿±½ÏÔƯÓ ¹ÚÙ½£ÇµêÚÀ¹Ö»qº˜‰ +j +̃ + + + +Z +îS +ÏÔ½ëÚóÔǼ·§D ©¼¯¾ù×¹ÁÓÛ×ΈĂÙƯÓ ¡ÈÿÚŽ€ßÄÙÁƯÍåơÔ¾߈ÄØÆßÏ÷Áï½ĂȹẠ́Çù×Ù½ Ơ3—Ó釶ÅëöÛÀ·ÔÿÚÁî»ÿ׃½É¢á‡Ç«‡“Íjû:߈óÓß»ûËÇÏÔ±»ßÁ³àùêÓ¾©‡¥2ßëM«‡“ÍjĂÙ÷ÁăˆŸƒ½ª¶2tTăˆŸƒÆ™‰kß [ïS±̉ëööؽ€áê›Ơ߈ÖÔ†6¦j§Ó¹ó¼€…U«‡“Íj…ô™‰kß [ïS߈³×ÑÅÛ«‚ ½9ăˆŸ÷Á‹Çଳ߈ơê±̉±»ăˆŸ;©Óï½ăˆŸï»ÁẲظ½˜‡©‡¥2ßëMר¾»ĂÓº™ô¸àJÛÄÓ̀Ê)èÛ8¤óÇÙ½߈ÏÔ÷Ù«ÔÇÖ¯¼ƒÍÓ‡ĂÙăˆŸ;åÁßǺ«»“ÇưÀăˆŸ;ÏñÓù×ăˆŸ;kÅÔ߈ÛÄÓ·ÔĂÙ¥ˆ]1ëö™‰kß [ïSơú«ÔơÔµaÿ¯¶¾Åăê§ôĂĂ ›­±àéM«‡“ÍjăÇíăˆŸ;9¥‡Ï̉½«Ô߈äôÅØÄØÿ.ĂÙÛ×á=›Ú§Ø§ÔÅçºÚª‚ +¼9ăˆŸêÚ#߈ÿ¯¶ƒ½±¿‡ºÑØÇĂ”µØÍË)éÛ9¥ó»yù×åÁ™‰kß [ïSÏÅÛÀ×¾Á½›ÚëӋǺ¡Ô“ȱ»ăơ¥‰ÍL…‹Ó¹Ú­ÖÑØ·Ó ¥0×́áÓ™‰kß [ïS«ÚÍÓ½Ù½ºÍÓù×9¥‡ÿÚÏĽŸ}åÁÙ½߈‘ÆͪöÁŽªÔ¥ØÛ«‚ ½9¡Á£ä›¶éăˆŸƒvÁ¹™Ă…ƠÁÚù×™‰kß [ïS±»߈ăÇíûÓ±¿•×Ël¥Ø·‡‘×8çÅØÈ,ÛÄÓ½ôêă½«‡“Íjöơê߈™‰kß [ïSơÔï½ử¶ûØ©ÓÎ̉±ÈƒߌÛ,³À¹Úđ»á¬·Ó ¥0åĂíÖ́₫®¶¿»÷Á»½ªÚ Ëû³¾ù×ÂÙÏÔ«»éêÖ¹ĂăˆŸ;öÓÔÅ–ùÔ™‡ÁƯù×ÿ +̃ˆ¿ïÅÔéêùê­ØïƠÆ9¥‡̉Åëö́ÁùׂÎÔëö­R“ +½ĺµ†Ù½³ÆåËÏÔưŒÛ«‚ ½9̀Ó Ụ̂^ͼ₫ ÈăˆŸ;ø×±»ù×ÑÓ÷ÁƒØ«‡“Íj™‰kß [ïS‚½ơÔÿ¯¶‰y÷ÁµØĂ½ÔÓÔ£äµØ¡ÛơêÚª‚ +¼9ñÓÛ«‚ ½9™Ó9¥‡˜‰j̃ZîSÿו%‡,™‡×Ơ«‡“ÍjÙ½ׯß»ûơÔ…×ưÀÛ«‚ ½9ƒˆÏÔ§ô™‰kß [ïSăˆŸ;k¯ÈÙ½™‰kß [ïS™‰kß [ïSÅ÷Á«‡“Íjщ߈ùׯ¼˜ÁëöŽŸÖ©¼£»µØ¯ƒßͯ¥'=U#QK¯ÂëöơĂ÷Úáê߈‡ăàăˆŸ;kíªÔÿ¯¶Ù½ÔX û̉ûઇ’̀j̀ǰ»ÆÎ¨¼ÓÅ™‰kß [ïS߈éÓƒ—¶£Ø™‰kß [ïSúÓ‡Çÿ¯¶Í́óÇơAÛ«‚ ½9«‡“ÍjÅÔÏÔƒv§Ôˆ­öÙ×9¥‡×9¥‡áËÇăáñÓ«‡“ÍjÅ₫®¶ŸÈÑÓ½ơê¥ÖĂËÚôñÖ«Ô˜‰j̃ZîS߈±ŸÂÏÔ¶ÔÙ½¥Û½߈ù׃½­ÄßÁ·Ô‰¿I¼ĂÙ̉ÅÓôŸ’åĂôêßÖ¿'™ëé庇۫‚ ½9Ă¿Øù׉ԷôŽ™‰kß [ïSä̉ׯçÚ˜‰j̃ZîS߈‡ÚÁƯù‡ψÏÅ«‡“ÍjÛ«‚ ½9ÏRåˆăˆŸ;·‡‘×8çÏÅ«‡“Íj•ܱ»ï½ĂƠ¾Å©&ÛÆ™‰kß [ïS©"ƠÔ¡Ôù×÷Ù̉9¥‡±»µØ­Ôá³µaù×ĂÙ›¡ƒÚƒvÙ½߈©Ó߈›¾ñÚÛ«‚ ½9ßÄÙơèÅù×ß„½ô­Ư퇃ơêÏ̉¡¼éºËÖûƠ±ôáê±½å̉ ÑĂ߈½ÿ¯¶ĂĂ ›­±àéMÙ½±»ÑÄëĂèáÓ±»«‡“Íj±½ƠÄÛ«‚ ½9ÄÔßÄÙ½“ÛÍË)éÛ9¥ÿ¯¶·Ô¨…Ơ§Ôƒvă­ÔăˆŸ;߈öÁ´Ø°»¹Úívù×ÏÔ×Ơ†7§j°»ÿ¯¶µØù×ÓØĂÙå̉ ™‹ù×£äÏÔ¸Ú…™‰kß [ïS߈ï½ăˆŸ–¦̀»üƽ˜‰j̃ZîSëÖµa£Ô«»‰à •Œ™‡߈Û«‚ ½9ÿ¯¶Ô8¤‡ăˆŸ«Ú­ºÏÅ÷‡ơÛ½ǼëöĂºÍË)éÛ9¥8¤‡‡½ívĂȧÆÁ¾±»ëöï½¥ƯÂȃˆçºÆ»ˆǺ«‡“ÍjăÔ—¶·Ô“ÆăˆŸ;¥ÉÙ½ëÓĂăˆŸÓù×±‡ŒÉ½ôß»û« ©ƒ»5߈á£ØH₫®¶ÏÔ“ÛÁÛÑÄëăˆŸ;k¹½—¶ơꙇƒˆëö¦ºÈ¦Æ™‰kß [ïSăˆŸÏÔÓ̉ƒvơê½€ọ̈dzü¦†ăˆŸ;™‰kß [ïSôºÛƯÓ ÁƯÙÅëỞƒÖÏÔ÷ÁÁ½¹Ú‹ăÅăv×¾›¡£Çù×ùê¡Á¬ÄƒÚ¬ÄÄÓñÓƒˆå̉ ăr«‡“ÍjÎÅ¥Øó߈À½ñ‡߈°êØëö‹Ç³È¹Áå×߈¹Ø»ÅÏÔÏÅÛ™‰kß [ïSÙ×·Ôøê߈߈ùê™́Ư±»Ǻ˹ÜÓ –¶ÚÀëÚĂÙ«‡“ÍjóÇ«ä“ȧ¹½ëû™‡ÙÚñÓ…ÖáêƒàƠ°»ׯ§ÔöûÓëÓ½“ÆÏ̉±»©‡¥2ßëMö™‰kß [ïSÜóÔ¡Ô±ëØµØưÀù×̀Ó9¥‡ñÓÏİ»ÁƯ½ÏÅÁ̉«¼ƒ½©ÇĂ¼×¿88¤‡°»ơĂÎ̉±»£Øéê·‡‘×8çƠ÷ÚáêñÓ˹½Ùƒˆ×ƠçÚ“Æ­½¼É̉ùׇÇ÷₫ƒÚƒv¶èíê©éÓÅØ½ăˆŸ;Û«‚ ½9‹ÜŸö¹ÚùêáÁÙ×™‡ív¥ÄÀĂ½Ô½ßƯ˜×©Ó™ÓăˆŸÛ«‚ ½9ïƠ°»åƠçôó%ù×ưÀ™‰kß [ïS›¾¥Ưå̉ ‰Á߈§Ô´†ĐĂɬ¿ĂÙÛ«‚ ½9ǼÇÖ›¶é÷Ù©Øéêăơ¾»߈³ ÛºĂ¼™‰kß [ïS¯¾ăˆŸ;k9¥‡¢Ç½å̉ gîƠÁÓÿ¯¶ù׭عڱ»ÑÄë·ôÏÔÛ׫»ÑĂÛº× Ûº™‰kß [ïSÙ™‡™‰kß [ïSÓÛ×½ô•ŒăˆŸÛºÏÔ¡Û•Ç™‡߈¥æƠª»«¼¹óÏÔ߈Ë%»¼‘«Ư¹ÚöÁö‡ºÔÛ«‚ ½9§ØÁËÉ̉ĂÙ9¥‡ëö›¾¿½•‡~ë™HƒÖ9¥‡×“ÈÿÚø×±»«Ú¾âˆ:Ơºm½ï»à ŸÅ¥Æ‰¿IÛ«‚ ½9±»ß»ûívßÄÙ§ô…ØĐÁ±»ÏÄÏÅ¥ˆ]1ĂÙ߈¶å̉ ™‡Á¼ës‹ÓƯ‰µ†Û×ăˆŸ;½ÏÔö§Æ±»ơệÙ½÷Ù«Ôè꿉í‡ÏÄăơÅÓ·¯ÙÚ₫Ú¿)Á‡é/×:–¶Û«‚ ½9³«‡“Íj½½ÿĐÏű»¾‹Ç«‡“Íjؽ«‡“Íj¡È̀½ŸßË¿ÏÄŽñÚ›¹Ơ¿>Ơ«‡“Íj‡Ú±»­Ä»ÏÔù×¹Á«Ô˜ÁåœßÚ¡ƒØĂº9¥‡ÛÄÓñÚÙÚ±Ü-—»“÷‚Ú ›¾ÓØù×Ú× ÏÔ¡Ô³ÂØ×£Øû¶™ëéåË¿†½ƒÚËǽ̃©¼Û«‚ ½9ÏÅù¿ÇâÅ‚º·‡‘×8绽Åè·ơĂ›¾¤ˆ\0ưÀÏÄá 8I¤‡IÖÏ̉íêÏø£ØàØ ½ù×ăˆŸ;kÉÖù×ƠÚ“½߈É̉ôăˆŸ;‡xăˆŸ;«·3uUµØÅØÁñÓĂÙĂÙ«‡“Íjù׺ëöµØ¯È«‡“Íj÷¼Å–ÜÖÇ ߈½ăơ8¤‡¹Ú„ö߈çÚÀ½ßÁ¹Úëöª‡’̀jĂÙĂÙ9¥‡Æº‡ψ߈ܺ¾¹ÚĂº™‰kß [ïSăˆŸ;±»—¶ĂÙưÀ§à§¹½ÔùêÇÓßÚºÅ̃ˆíÖÛ«‚ ½9ÍÓÏÅöƯơí‡ÍË)éÛ9¥ÛÀ÷Á­Ùߣ䱻³ ÅØ™‹ÿ$‡ºưÀº±»±½­ÑÙ½³ºó˜)ê)è)ä)ù×߈«‡“Íjÿ¡Ûëö¶//µØỔ™‰kß [ïS™‡±»¡ÏíêĂÙáêRÏ̉±»öÁ—»µÀ÷Á÷ÁÔÓÙ½ÏÄ£XóÂá Û©&߈ÛÀÏÔåÖ×̉‰Ó©Øå̉ ÷å5Óëö©ÓÙŒë*«ÏÅÙö¥Ûí¶›ôĂÙÛ«‚ ½9ÏÄëö°»ר¶‡Ö8æùêëöăˆŸ₫²ØµØ·‡‘×8竇“Íj÷Á™‰kß [ïS÷ˆ¡»™‰kß [ïSơÔ߈÷Á¹ÚÏÔÓÆơêÓ›‡»‡±ÔăˆŸ;»Å™‰kß [ïSÙ½ͺµ˜—ŒÙÜÏÔÏÔÙ½Û«‚ ½9›Ûëö÷ÚÿÚ½€‘—¿ô‡Çëöؽ†“ ËÓÛ«‚ ½9ơÔ­ÄÚª‚ +¼9߈µ†߈‘ơù×óÂĂºëÖÛ«‚ ½9ÁÛéÓơÔÿÇË¿ÁƯưù×ÀƯù×߈«·3uU¹Ú‘®½¾‡ưÀëö߈Á̉á=߈±»ó³ £Ø±»½¹ÔŸ}ß»û‡(ËÇ÷ÔưÀƠăˆŸ;µØäƠßÁ½½Ă‰ơ˜‰j̃ZîS©-œ‰¾I߈Ƽ߈©¼߈­ØëÚÓ߈º™‰kß [ïS¹Úëöëö»9¥‡›¾ÏÔ¥Ă߈ƒˆ·‡‘×8çÏ̉×¾Ù½߈ƒ×±»©‡¥2ßëM˜‰ j ̃    Z îS ÂÆå̉ ùׇŒăˆŸÅĂ ߈™‰kß [ïS‡Œ½¾ƠX·ÅíÆỞëÚƠX凯Ø8¤‡œĂκ·‡‘×8çÛ«‚ ½9ÑÄëø×ëö¹à¢Ơ‡Œ›¶éñÆÑÓ÷ÁăÁÛ«‚ ½9ÁĂº¶Å¹ÚÚª‚ +¼9½¿ ϼ÷å5Óàê°»çÚ̀Ă߈«‡“ÍjÉ©±ĂÅô©ÇïÅïâàß»û̃ŒÚ,ëÓŸ¾¡È«‡“Íj¡Ô¡ÈÁ½ăˆŸ™‡ưÚÛ«‚ ½9ƒåÁơèÅáÛ«‚ ½9™×ăˆŸĂٿؾ½ô±»ÍÄ›¶é³ ½€·Å½ô ¬°àèMƒ½éººŸÅ›¾­Øå̉ Êêù×™‰kß [ïSóĂƒˆÎµ†ËÇÍƠ©£®ƒØ°»‡“́v·‡‘×8çĂÙ̃½³(ßÁ·Åăơöÿ¯¶ÏÔơÔ‡˜‰j̃ZîS¿çù×½ÏÄÅÄ÷ÁưÀƒÖÇÖÛºËƠÚª‚ +¼9ù×Û«‚ ½9ƒvơèÅï‡ù×ưÀÙ×Ï̉µØÑÓÓ¼ăˆŸôËÉ9ÅÓÛ«‚ ½9‰µ†¹ÚçÜ«‡“ÍjÁ̉ëöÛ"Í0ÇÖÑÓ½é$¶ô«‡“Íjׯ•ŒĂ¼¿»ö߈ĂĂ ›­±àéMµ.¥Ù—¶Ù×ÙÚïÓ ÷ä±»çØƠXÛ«‚ ½9Ï¿Ñn“Ơ™ĐÅ×¾8ơêóÔëöơÔ³ƠÅâˆ;ÏÅ߈ºđ±»ÙÅëÛ»÷çÚ½áƯÁ‡é/×:éºùׇŒÀ‡`€`è/`Ö:`÷Á¼ØµĂÿÛ‡çô9¥‡ʾƒvÛÄÓ߈ăˆŸ;9¥‡íÅ·Ó ¥0†ÛÏÔÎÅ©¼· ß»ûÚª‚ +¼9”÷ »q߈åôÛ«‚ ½9‹Çƒv³½Á̉ÀƯèÓá á 9¥‡ƒv§Ô÷‡Ù«‡“ÍjÁñ»Û‰™‰kß [ïS9¥‡¸ÚívÙ×߈ĂÈ«äÏ©ÓÛ×߈ñÚ߈ÿ¯¶ÏÅÇ"Đ·ܾ!Û«‚ ½9¡ÈÁ¼¬¿ơèÅÇÖØ×ÙŒë*«—ÓĂ¼½ÑÓ¸Ú¿»Û«‚ ½9ŽÏÄô •×±å¼ ºÅØÁ´9¥‡™Ó«Ô¾Ï̉ÿ¯¶Ằ½¥Û¯‡•ÇÅÔÑÓχÏÔ¬¾ÍË)éÛ9¥¸£ùĐĂ£ÓñÓÙÚ·§D ‹Ç±»ëöĂÙÑØ8¤‡Ö÷ÁĐÓº›¶éó.ù×߈ï½›ĂƒvÍË)éÛ9¥µØ™‰kß [ïS­ÔüñöˆËÖăˆŸăˆŸÍÄù×ÙÜëö¯ÉóÇĂÈÏÅ÷‡½ưÀ±»·¸«‡“Íjëơ‡º£ÇûØÏí8k¤‡kÖËǾËÇÀĂÿ¯¶éØù׉ÛÀ ù×ÏÔù‡Ž÷Á%ÿâƒ×̉ÏÅĂÙĂƠ±Á“ÈËÖ¡Á¹ÚëöăˆŸŸÖåïÛºĂºưÀû؉Û߈ưµ»Ø©‡¥2ßëMÛ«‚ ½9ù×ùêÏ̉í×Ơơꙉkß [ïSÖ¹ÚÏÔÿ¯¶¬Öæ̉ +Æ̉˜êèäñ~ÑÓÑ·ÛºÁ̉ÁƯưâëÔ«‡“Íj™‰kß [ïSĂºÁ©‡¥2ßëMƯÓ ߈ÁƯÏÄÅØ‘ÆƠ±ÇăˆŸå»éÓÛ«‚ ½9™‡µØ¡ÈơÔ›¾Ù½®¡ÈµØâ»µØ«Ú£»ß»û«‡“Íj¿àé‰ñ5ñ·¼ëóÂÏÔ߈…Ú¿ôÙ½™‰kß [ïS匿N“ÈÿÛ¶ÿ¯¶ƒv½§Æ“½ͽ“ÆÿÚÏÅĂÙ߈Û«‚ ½9™‰kß [ïS¡ÈÙŒë*«éºưÀÿ¯¶£äÏŤ½™×êöÍË)éÛ9¥™‰kß [ïS£Ư¿™‰kß [ïSƒv±»ƠN½ôÛÀåô£X¾ăˆŸ;åÁÔ½ö³Ơơéù×ă»ĂĂÿÚÑÓÛ©‡¥2ßëMщºµƠ›¹°» ¯¾ï½©ØĂưÀ¸àĂç̉臵ØÇ×ÜÁĂׯ«‡“ÍjăˆŸ;ƒvÛסԯƠ¸ÚơÄÀƯ›ÚÙÅë¡Á½ж“‹×̉ÇÙ£u‡ºû(“Çéê߈§Óù×›¾«»ƯÓ 9¥‡½̀Ç«‡“ÍjÏÔ±»Û«‚ ½9ñ-ƒˆÇӒǘ‰j̃ZîS¹Û«‚ ½9ÑÓăơÅÔ߈‹Ç̃ˆ™‰kß [ïSưÀ¡ƠÏÔ×Ơ±Ü¼èóÇĂÙá ©ÛﻇxµØ£ÇßÙùx«‡“ÍjÏÔôêÿ¯¶¿çŸ»î¶Âëö½Ôéꩺ§Æ½›¾íÚÛ«‚ ½9ÂíÚÛ«‚ ½9߈«âe›¡ơ…÷ȾعØơèÅ÷ˆ‰¿IëÓÑÄë¯ ÛÀƒv«‡“Íj«Ô™‰kß [ïS™‰kß [ïṢ%±»á=×¾9¥‡̀Óó|³½÷ÁĂçºÓ¾½¯ÈĂ¼÷Áù×ívå̉ ù×ù×Ùº“è“«‡“Íjí̃Óº«‡“ÍjÀ¡«‡“ÍjÅÄ¡ÁÇçÇÛåÁÉ«‡“Íj·‡‘×8çĂÈá߈Ôơ°¿…¾öÏÔƯÓ 9¥‡­~÷Á¹ÚÖôù×÷ˆ™ëé嫇“ÍjËÉ9¼€©¼­ˆ«‡“Íj©Óùׇ“«‡“ÍjÆ¥ˆ]1ö¹ÚÊÓ¡Á£äÿ¯¶öÿ¯¶£ØÛ«‚ ½9ƠơĂ߈щË¿«»âˆ;£Ø©Üÿ¯¶ƒvƠÚ¹ÚŸ}ËÓ½ĂÙ½¥Æ̣¶ÏÅçôÁƯù׫‡“Íj±»÷ÁøêơÄ‘¡Ç"רƒÖàƠ·Ô¹ÚƒvŸ߈Ú×ƯÔâˆ:µå߈Á‘ơ·‡‘×8çÏÄ$$$%ª-44¹Ú߈ĂÈ½ăˆŸ;kï»ƒÖ·Øµê£ØÁăˆŸ;«ÔÉ6˜‰j̃ZîS¹ÚÚª‚ +¼9öƠ˜‰j̃ZîS›¡·‡‘×8çƒÖÏÅ…Ă9¥‡×ÿçÿÚëö™ĂăˆŸ·Íß»ûÛ«‚ ½9ơÔƠÛÄÓ»¨ÇÏÅá —Û›¾’r€º9¥‡öÛ«‚ ½9÷ÁÁÜăˆŸ;ôÔÍË)éÛ9¥ŒÙÜëÀ¹‡Œ®×ËÖ¾ÅÓ‡ŒöÆ—¾ͼ«·3uU™‰kß [ïSƒÖÙڣǡÈưÀµØœÁª¼ËÖÛÑ´%ùê³ÈÑÓŸÖËÇ÷ÚưÀ̀ĂY4ù×ĂȫԱ»¹ơ¿ÅѶ§ÔíêÙ½åôù×ÅÔïÚ9¥‡­¾÷Ú›¾ƒ÷Á¯¾©‡¥2ßëM·̃¿ô£äêö©ÀĽ½€…Û™‰kß [ïSóÇ·‡‘×8ç߈íJÙÚ³Øô™Ô¹.›óLJºù׬օÔï½ÍÀ¥Ø«·3uUµØĂÙèêÚª‚ +¼9ăˆŸ;™‰kß [ïS ÁçÚ߈ơ‡¬ôÜưÁ‡º±»ĐÅ‚ˆɇ½¯Ơª‡’̀j÷ÁŒƠÉÏåĂÿ¯¶©¼å̉ ä̉߈ñÖ8#¤‡#Ö ëö«‡“Íj—¶™‰kß [ïS˜‰j̃ZîS§½ÿÚ‡“Ǻë߈›¾¹ÚëöƯÓ •Èû›öÁ­ØùײØƯÓ ±¯¾¾ß ÆÙŒë*«Û«‚ ½9±»±»‚ˆÏÔâº½ăˆŸ°»ÏÔÑÛ«‚ ½99¥‡§ôƠÄÏѾ‘¾(½ƒ½™‡ăÚ™‰kß [ïS·ÜÇÖ8¤‡Ö™‰kß [ïS©Ç¡ß–¶©‡¥2ßëMßÏǼÿÚƠ«ÑÆØñ¥ˆ]1½›¾ûƯµÅăà­ÖƒÚéԣȥÓỬáơµØÅÔÓÆ·‡‘×8ç߈¼›¾ăˆŸ;§ÓÏÅơÔ½«‡“ÍjµØ“È¡ÔơèÅö©Đ«‡“ÍjûƠ½±»óƒ×÷Á÷Á™‰kß [ïSï½ψ½Ïù×ù×µÓóԱLJDZ¿¿ô£Ç•Èû›™‰kß [ïSßÄÙ¾à ±»ÁƯϺÚÄ̉¥¾Ù×ÓºÙÚù×ßÄÙ±»½»ôèê«Ô»qÏÔĐÄ&ê&G½¹‹Üă"¿ºÅÔ­Öÿ&̀Ï̉ù¿÷ÁÛ«‚ ½9ÿ¯¶”ߌÇØÉÍÇÿ¼ù×±»ŸóeÁƯרơèÅñíÈÛ«‚ ½9Ă·ØÏÄ»‡ÅؑӹڿƯƒÖ߈™ăˆŸ;k‡ÚµØÛ«‚ ½9ĂÙÙ½™‰kß [ïS­ØĐÓö¿‰‚×ăˆŸĂÈï‡Û׵ثԙ‰kß [ïSÏÔÓÔƠºmÏÅù׳Ƚ۫‚ ½9åĂ¥Ư‡Ç9¥‡›¾÷ÔƯÚ—ÖÅÏÔéÚ±»÷Á˹ëöªÚçôÑÄëƯÍØÚÍË)éÛ9¥Á‡é/×:ƒv÷ˆÿ¯¶Áª›¶é±»¶Ă¼ÍÄ«‡“Íjù×ÿÂÛ«‚ ½9ëöÏÄƠôؽ‡ŒĂÙ‰¿IµØúÓëöÑÅóĂ߈Ă$­vÁ¹Á8¤‡×߈Û«‚ ½9­½¼ÏÅÓØ§³È±»å̃ÏÄëö‹Ù¶È%Ç詼±»«ÔÁñ–ˆó³zù×ưÀá†ÏԢ䘇™Û«‡“Íj•×¼Û«‚ ½9Úª‚ +¼9ùê±»¢» Ï̉âàÑÓ”÷‰§ØßÄÙÓº°»±»ºĂ ơĂưÁÇܱ¿éº—¶ăˆŸ;ŸÖœ· ̉ ¤0 ±»±»çơ£Ç½±»߈÷Ú±»¿íÔX¬ß¤¾Ï̉¬¶ ¥ÓơÇºăˆŸ̉ÁÜ÷Á™ØívÙÚ‹ÇÍă¾‘ï½£ÔÛ«‚ ½9÷ÁÏÅùן}«dÙÁ̉¹ÚÆĂ«ÔăˆŸƒvăˆŸ;ívßÄٷԾ߅–ÏÔÏÔ£Ó±»™‰kß [ïS­½¼ÅàáÓ±»æº›À¶ƒˆơê±»«·3uUÙÚưÀ¯ö¿ô…Ơª»ÏŃvß»û•ƒ½™‰kß [ïSơêôĂ»Ø÷Ô—ˆÏÅƠơϘ‡ŸÈ™‰kß [ïS½¾»Å…ƠơèŹ½¼È ÅØ ËûÁƯàƠ߈…‹Û8¤‡©Ó®È±»™‰kß [ïSÊÇ÷‡ùêÏÔÁăívÈ™‰kß [ïSÛ«‚ ½9©ÀµØ«ÑâàøºÏÅÅÄó¶ªĐœÅ̉ÏéêÁñ·‡‘×8罫‡“ÍjëÓϱ»…»½«‡“ÍjÑØöơ³Ơëö»ÓëÓ±ï½ëö‡¿ùו̃±ƒˆă­ƒà¹ơꕟù×ÑÓ.Û׃–“ËÉ9ûØ̣Ôö€Ç¹'¶ÅÓ™‰kß [ïSÿ¯¶¡Á“¹ƯN§à¹Ú½˜‰j̃ZîSóûÚºÛ«‚ ½9ƒˆï½›¶é­Ö¡Ó›¾ÛÄÓÀ½¦Ơå¼ çô¿»ÿÚ÷Ù߈¹Ú‡xØƠ¾ĂÙ•×ÙÚăà™‰kß [ïSÛÄÓ™‰kß [ïSå̉ ™‰kß [ïSëöÙÚ½ͪÁ㫇“Íj…ÓºŸç­Ö¶߈ơèÅđÆ ØÚù×ăàăơĂẸ̑߈ÙÚ›‡‡Œʹ +½‹Ç«‡“Íj‡×źù×½£+§‡ƒvÇĂ´½³̀̃’ÆÏÔÛ«‚ ½9°”ñÓ½­ØÜăˆŸ;kóÔÛ׹ا¹“ÈÛ«‚ ½9å̃÷Úó¸Ù½ĂÙÏı»ÑÓ¥½±»̉ÁÇÖƒ¹Ú©Çăà­¶Ù×ơêöш¼§ô›ºáÓă‘·±̉‹­ÙÚáƯÊÇÛ«‚ ½9Û«‚ ½9›ĂÁȱëØôÛ×ñĂ½¾ÏÔ§ÔÙÚƒˆêÚêö³¹Åôº Ö†‡ü2ª»£ä§Ó—ººÅÓƒvÏÄöù×èÜÜÜÜÜÜÜÜÜÜÜÜÜÜܙӱÁ°»8¤‡ÂÙ߈ö¼ÙÜöÁÇâÓØëö™ÔÚª‚ +¼9ăˆŸ™‰kß [ïS¦Æ§ÆéêÙÓ›·ÔñÖ߈…ƠµơÁ¼ß»ûÏ̉Ë¿ÙÅë¿Øơ¨ƒv«Ñ°»â»₫®¶ŸĂ›¶é“Æ™Ă¯G‹øÙÚ߈«ăˆŸ;Ơëö»«Ô¹ÛÏÅϼÛ«‚ ½9±»½ă»¾ßÿÚù×™‰kß [ïSăà›¾ưTöÁíÖÛ«‚ ½9±»·‡‘×8竇“Íj—Öù×™‰kß [ïSÛ×›Ú«ÔáÅívư“߈æéêù׫$ỞÛ×߈Û«‚ ½9˜êèä½ÏÅ™‰kß [ïSăˆŸ;ù×רƠX̃ˆËÜçÚ߈Ö̉ÛÄÓ×Ïœ‡̃ÄØÁ¨÷Á©ƠíÆ¹ÚÙÚ—¶¹Ú¹ÚÍÓÏÅ÷·÷å5Ó£ä¡%Û«‚ ½9߈¡ÈµaéÓĂÙùêéÓ£äù×ö© ù×߈ºÏÔ‡ÚÛ«‚ ½9÷Úöê±ëØ«‡“ÍjƯÓ µØÏÔÙŒë*«8¤‡§ÔÙt±»±»ơèÅăˆŸº¯¼ÀÛôñÔ¹Ú½€±»Ù½áۮƱ»˜¶€‡ÇÄ–÷ˆù×ỔÑÄë Ơ‹Ü߈öÁ£ÇĂÖÏÅăˆŸ;­º§ÔßÁƯ“º˹ÙÚ߈Ûö£Ç“¤Û«‚ ½9OáÛë}™‡‹Ûר߈ù×½±»éÓº߈öÁ½€ëöËÉ9ƒv©‡¥2ßëMé¤Ï̉§ÑÓ·§D ÷ÁíÆ“ƠùÚơ»ËơèÅ¥ÖÛ«‚ ½9„ÍË)éÛ9¥ƒØ™‡¡Èºéºß»ûÏÔÇÓÅñ̉sƠ‡“Íj«»ù×ÏÅăˆŸ¡Ô߈Ù-Ăá ƠÄÍä—¶ỞÙ½«‡“ÍjăˆŸ§àÙ½ÑÁƒv¹Ú߈ß»û³ÂÉ‚ơêÑÄë±»¥ˆ]1ĂÙí·‡º±»ÏÅëöù×ù×±¿±»³ÈÅÇÁ¹»Ñ© éÓÁ¹­Ö¾ä̉»ç߈ƒvÛ™ĂÙµØâÄăơ½ÈÏÔÓÅÛ«‚ ½9·‡‘×8çÁ¹¦ô´Ă%Ở߈9¥‡÷Á£»µØ©Ơê$‰̃¿‰ơêÛ«‚ ½9ÑÓ¡Á9¥‡«Ñº¹âßăù׳Ôщ›¡ÓÁôéÙ×ÿÚ­ÄĂÙ£XÛ«‚ ½9§Ó¾°¿ăˆŸ«‚‘6߈½¶ÈƒÛ«‚ ½9Ó̉÷Á›¾ëö¿‰9¥‡‰¿IÛ«‚ ½9¨ºóÂ˹…ö‰¿IßÄÙ־߻û›¶éÂÓ±»ùæ°» ƒv߈Á¹ÑÄëñĐñÖÓŹÚüÆ£ƯÎÅ ¿ÅÄÓå³ÂƒÄÏ̉ù×÷¼źG½¹ăˆŸù׸ëöÉʃ֙‰kß [ïS¥ˆ]1ç̃½€ÇÖ›¶é߈íÆí'Ó¾߈›¾ç̉Úª‚ +¼9Ù½™‡đÓ€ºăˆŸ;Ú×µØÁ̉¾™ëéåÓÅ̉Á +±»¸ÚÅØ̃»ú­ÄÅĂ©Ø8¤‡ÖñÓ‡ßÄÙưÀÙ½Á̉á ÙÚ¹ÚĂÙ·ÔÙ½÷ÁÓÅ‹ÇÓÅÓ¹¼ñÖăºÙ½Æ±»½»¯‰¯0ù×8¤‡÷‡íÆá ¥ƯơèÅ÷ˆ‘«ç½ëöÏPÁ¹í|߈˜ÈĂĂ ›­±àéM¬Ö²ØñÓ©Ó8¤‡×«‡“ÍjË¿ÍÓÀ½€·ØÎÔÅÔëöµØ›!à=ƒvÏÔăˆŸ;­Ä¿‰¬ÅÁ‚©Óô»̉¨¼¾ºÍÓ߈¥ˆ]1Ăô›‡»Ø‹Ç¿ÅÉæ•ŒÏÅŽù×Ù×¥Û¾±»ƒÚù×ÅØôăờÓQ›¶éóÇƠ‡ÇÇăˆŸ;̉ÆÊÙªƠ°»°»á=Ù½ÏÔóÇßæ½9¥‡¥Ä«ÔăˆŸ;9¥‡…»×Ơ†7§jøôù꽀ʽÈ9¥‡ĂÙ«»ƒÖăˆŸ;kư“߈ÏÔûØÅ¹Úá$•½ÎÅÙ½ÿ$Úª‚ +¼9Ơ­½¼ÖÆÛ×ëö³ôÿ.çÚƯØ£äÁ̉«Ôëö©Ó½™‡­ÄÛºÏÔÏ߈½³Èÿ¯¶Ån÷ÚÏŃˆơê“ÛơꘇÙÚëö¹Á„ØçÚ“ƠưÀÛ«‚ ½9«d…Ö«‡“ÍjÜÏ̉çÚÑÅÏÅăˆŸ;÷‡ëöîÅÇֽܣØç4£XĂ¿ßÛ×÷ÚÛ«‚ ½9ÅÁĂÑÓƒíêçÚÍË)éÛ9¥Á™¯¼ƠÅÓ•Œ—³¾ß¾߈‡ºù׫‡“ÍjѶ±»Ơ¡ÁĂá=·ïµØ¡ÔăˆŸ;ÛÚɇ›—µ̃ăˆŸ‹Ç›Ú¡ÔÛÄÓ“Ơ‚v™‰kß [ïS·‡‘×8ç׺ĐÅûÓëö°êر¿÷ÚXä½½€±»ßƯăˆŸ;߈›¾ÇÖ“ÆăàºØ±»Ø× ±»ÑĂÉ·ØăˆŸÿÚ»ÚÇ¡Èù׿ß߈µØÇÖ±»×ÁƯĂÖ½Ăù×±ëØñÓăˆŸ;ὃv±»©¼ơ$«‡“ÍjËƠ߈ׯưÀ×¾·ÅÙ×̃ˆăˆŸÅØÿ¯¶ƒv½‡xéÔÙÚùê±»‰¿IÙ½±»ÓÆ©‡¥2ßëM÷ˆ¯̃Ăâù×߈Û«‚ ½9±»×Ơƒ‰¿I˜‰j̃ZîS…Úåô½Ñù׳½Ù½ơêô›¾ø×רÁƯƒv•ÜÏÓÓØăˆŸù¿¥Ó߈ß»û÷$—¶Ï̉§Ô¯¼9¥‡°»ÿ¯¶ÄÂÈ„ôÏ̉÷ÁÏÔ䌾NÓÔѶ¨¼¡È›¶é˜‡ƒ½±¿¿‰‰ä‹ÜƠÚ±»§Ô—ˆÛ¹Ú­Ôö½Ë)ƒv¹Áù׫»ư“Û½½ĂÙÅÔÇèÁ¼çÚÅØÇĂÍÄíØ߈¹Ú•¾9¥‡ûÓ¡Á¿‰ƯâñÆ«»£»±»ó«‡“ÍjăˆŸ;¿ÉëöăˆŸ;½­½¼ÍĂÑóÓ.‹ăˆŸ;ƒvÍ­H³+ÏÔĂÏÅÏÔ­Äùê˹»nÁƯ­Ä»Ó™Áª¶2tTẲщ§Ôù×»q߈ÅÔ߈ÏÅÙÚËÓŸ\©ØÙ½ÓⓇ»½×ÓëÚívëöÁb¼©&ÑÄëרËƠôêÅ‹É0óÂï³2ăơ¹Ú¹¾«‡“Íj³Èƒ¿ºđÚ±½ª‡I’ÌjI™Ô£Ø›·ÔóĂ³Ü™‰kß [ïS§ÔÑ·ưÀ‡xáÚ£äåZ™¾’ƠăˆŸ;kºĂĂÈŸaö—»¯È¶·Ôô“ÆÿÛăàù×½Á½·Ó ¥0Û«‚ ½99¥‡ëö±»«‡“Íjü̉‡÷Á‘Æ÷Էű»±»½™‰kß [ïS›¾±”ăĂ3¤¾5è¾Ûºù×Ăȡȫ‡“Íj™ơù×÷Øרù×ßÖÍË)éÛ9¥±»ëöÔºlĂ٣ǫ ©ƒ»5“¼Ă¤ˆ \ 0 Ôù× Û«‚ ½9±»Á ¼ËÇùê°»›Ă¹Ú߈gÍÄŸó§+»¹ÖăˆŸÛ«‚ ½9Ë¿ÅÓ±»Û«‚ ½9ô½Û×Û«‚ ½9ƒÖöÓØưµÿÚ±½±ÔƠı»ăˆŸ;k²Ơ °»»ÅÁƯ£ØëÚơêÁĂ™‰kß [ïS×¼—¶Å–²ØÉ̉öÁ£ØÏÄ—Óº¹—‘ÆăˆŸ;ù×Ăï½³z¾‡ÁÛ߈‘Æ¢È ÙܸÚĂÈ¥ˆ]1±ëعÁÍÓ•ŒÎÔÁÓº¸Ú·‡‘×8界ËÇ ÁĂÙG½¹“ƠưÀó¶èưÀ±»ÎÔ™‰kß [ïSù×ÏÔÙ×Ă¼ÂÙ¿‰˹›¾ô±»¡ÔºÙÚܽ¾ׯ ¾ïêƒØÖY„ä‚v¡Ơơºá¬·Ó ¥0ÑÓ‘ÛçÚ÷‡á¾–ˆÀ̉¡È±ëØá ·Åëö£äÍÓêÚ5½ô­Ö±¿Ï̉ëÔ›¶éëöåôªÚ÷ê»Å¹ÚØÚ½¾Û«‚ ½9ă»óå̉ Óˆ•=‘ăˆŸ;Ïű»—Œƒ“ƠóÔ½Ÿ}îôA“ÔöçÚöÁƒˆƒˆÏ̉ÏÅëöù×±»ÿ‡ĂÈơêÙ׋ÇĂ« ©ƒ»5ÏÔȵØơêĐÄêơêÁ̃Á‡é/×:›¾߈¿‘ÆøêÎ ¼ÍÆáê™Ô¯×½€‡ÙÅëÙÓ…âù×¥Æ߈­Ø¹»¹ÚŸƠÑÓÁĂƒÖ‡½½¯G‹ø»½Â# —³©Ó½”Éä̉›¹…ÅÓ½ù×8¤‡›¾÷Ú߈ËÉ9¿¹Ù辫·3uUÅØƒvëÚùê›¶éí—Gù×ó¶›¶éßÄÙÇØ߈Ïźg gÖg†‡gü2géê½ĂăˆŸ›¾úÙåĂÙÁº̉ ÊƠ¡Ûù¾ƒvƒv¿º»¯È‡©‡¥2ßëMµĂÓÆ̣êƠ«‡“ÍjÅôëöÅô€ºĂö°»ëÔăˆŸ;÷Á›ÚÏÔưÀ…ƠÇÖÓÆ±»ƠÄƠϹ½€·ØŒ‰°6«‡“Íj—¶ëÚÔX ăà‰v Á¦ÓÏÄóÇéÓº̉Æå¿£äăà̃»ú½Ô­vù׳Çơê•CăˆŸ;ù×ÙÚ±»æ̉«Ô™ÁÁ½ö¡Á‚-ƒvăàÓØÍćdzºÑÓÛÆăˆŸ¿‰щ«Ñ÷ˆ™‰kß [ïSÙ̀Û«‚ ½9ÑÓ§Æív½ö¿ßœ‰¾I߈™‰kß [ïSå×Úª‚ +¼9ɹ́ºæơ±»ÑÄëƠù×ÏÅá=¡ñÖ߈ëÚĂÙ™ỖˆÂÙëö©¼ăˆŸ«»«‡“Íjƒ½ù×öÁ ñÆ™qùæĂÈ·¼Í79¥‡‚vÅØÛ\‚ÁơêØ±»ă༱»ă»«Ôùש‡¥2ßëMă»ëöơê±»3·¼Í7ׯ˹9¥‡×ơèÅ›¾߈±»ª» —ô«‡“Íjù×®¼«‡“Íj§—¶¡Û¶è9¥‡§ôăˆŸư‡±ù1ù×ñíȭڟȺœÁñ×ơÄöÁ¡ÔÛ×Ç̉å̉ רù×ûƯ»ØÙŒë*«ëÚ›¾÷‡Å»ä̉˜‰j̃ZîŚ$8¤‡¿ØơèÅô$º¯ƒßͯ¥'=U#QK¯Âóǃv߈³…£­9¥‡—¶¾©¼×Ơ†7§jăàÏÅö±¿×ƠÁå߈ívâˆ:k½ô¿‰ÑÄë©ÀŸ¾¨Àëö¥ˆ]1™‰kß [ïSµØ±»à ¿Åù×½Û«‚ ½9߈ưêÛסÈÛù×µaöĂÙÁ‡é/×:ăˆŸǼéÔƒˆ¼ÔĂ¹ö·Ô¢ä9¥‡û(ÆèéºÛ«‚ ½9ÿ!ÛˆöÁ§Ơó·ÔºÏÔÛ«‚ ½9ÍË)éÛ9¥«äè‰đ5đ¶àÅÁƯÀåÁ‹ÜÙ—ˆÚª‚ +¼9¿½Á̉‹ÇÅØ߈±»«ÔñÓ±»á¬—˜ß„·‡‘×8çƒÖ¯ƠĂỞ‰¿I¡ƠóÂÙÜïƠăˆŸ;ÏÅ™ô©‡¥2ßëMµØăÁ߈åÁä̉ùד¼åºÙ-ăˆŸ;½Ô·Ó ¥0ơêó#ĂÙÅÓ‘Æ»½çÚçÚ߈˜‰j̃ZîSËÈ9ÏÄ©‡¥2ßëMăˆŸÁĂ‰Ô¾ÓØù׃v†ŒÛ«‚ ½9íÆăˆŸ;kÎÅ•ŒºçÚù×ÅđÓº‰Ûơêă" Êû½€ψÈ̉™‡Û«‚ ½9½nƒˆßúÛ«‚ ½9ûÓñƇ9߈ĐÓ +½³ưÀ°¿ưÀù‡ô»ˆшåĂù×»Åë×ëÅăˆŸ«‡“ÍjÓØ™‰kß [ïSϺÿÂ÷ÓÛ«‚ ½9¾ÁƯ›¾ñÿ¯¶ùו{¤Ö±»½‹ÈñÓ½«‡“Íj«‡“ÍjµØôĐÅÛ«‚ ½9Û«‚ ½9˜êèäêÔ¾‹ÈÏÅơꉆ‘‡•Èû›ï‰³ ÅÍƠÿ¯¶™‰kß [ïSíóÙ½«Ñ§Èƒv÷‡ÑÓ·Å˹‚ö¶  ù‡›¾å̉ ¢ä½€Û«‚ ½9×Üå¡ëöƒÖ‰ÛÂĂâàä̉ơñ»‡Ç›¶éÍÓvÙÅëÛ«‚ ½9«»‘ÆÛ«‚ ½99¥‡ëö—¶ÏÅÿª»ÍÄÑÓÿ¯¶ÏÔ½™Á·ºËÉ9ÿ¯¶¹ÚƒvöÁ™Á¥ºר¹Ú÷å5ӻߣ䩨ơ‚ØÁ¹߈ơÔ×$™‰kß [ïS›¹¿Å¿ô»½Œø Ù½Ǽù¿¡Ơư§‡§¹“Æù×ó„àơÔ˹²ĂÑÄ뵆½‡‘€ï½߈µØ«‡“Íj©Ø·Ô£óù׵ر»ăˆŸ;™‰kß [ïS®¾ëÑÎÔ/¾߈Ü9¥‡ÿ¯¶ÏŹÚÍưÀ÷Á¹Û«‚ ½9ù‰²§ÓÛÔ¢X³9¥‡9¥‡Ï̉Û«‚ ½9«»Ï̉én}«)ÁÙ°»Ăº¥ÆÙŒë*«€ºɱ£Ø™‡¿ßíê߈ÜñÚĂûƠX߈ơĂÓØÛ«‚ ½9߈¶ï½ÑÓơÔù ëöơÔù×µ†9¥‡×…ƠñÚÍIÊëö̉ůÈÿÚÓˆ•=‘ÂÈÖ¹½ƒ×ÏžÅ9¥‡ỔêÓö)­Ä¥º±»ÏÅÅ«‡“ÍjoßÄÙëöɱ½»‡Åر»߈Á×ÿ¯¶åŒ¿N¹Ú‡ºƒå¹ÚÏÔÇÖ½̉Á Ù½›¾€º˜‡‡’¡Ôù×ăˆŸ;«‡“ÍjƒˆĐÅ “ß%ăˆŸ½™ëéå’½Ù½‡Û÷Ùô©¼çÚ̀Ó³˜Ơ¾ívÏÅ™ơ‡êö×Ăö÷Áá=¶ôöÆëöÿÚ»ỗ„Û«‚ ½9¥Ûù׃ṿ¹Ú̉Ø£ØÙ½ăˆŸ;Áù×ù×±‹™‰kß [ïSĂĂùסÁơêß»û¿ºƠ¾G«·3uU³ÂψÑæ®¼¿‰‰Ûù×ÁÂÓØ×*Ûö¶  ߈©ÇßÄÙĂȰ» Û×Ởëö«‡“Íjç̉Ă¼›¾ÏÔƯ’Ï̉ä̉ăˆŸå̉ ÏÅÙ½ÿ¯¶߈Ç÷÷ˆº§Óëö¡Ô߈ψÚ×Ï̉óÆÏ›½ỖÓ»~±»‹Ç麡Á‹Ç…½ÅØ™‰kß [ïSơÔÏ̉ù×—¶­Öø×½æÚñÖƠíỂ Ă¼å̉ Á̃ÍË)éÛ9¥ÙŒë*««Ô»ĂơêơÄ“ÈæÚ™‰kß [ïS“¼9¥‡Ïž߈øêơêëö·‡‘×8çßçñÓÏ̉ăˆŸ;³ºóÅÀƯ±»½ÖÚ£¹ăˆŸ;ƒvÑ»ÿ¾ëö½ôê·Å¸Å⺙‰kß [ïSÙÚ߈öÁËÓăˆŸ;áØÛ«‚ ½9× ‚vß¼ÁĂ›¶éĂÙ—¾öÁ߈ªÚ€ë°&½ßÔư“Á˱»·‡‘×8çÍÓ‰äƯƒvÄŹڭة·‡‘×8çYù¿—»Á¶ÔºÏÄ™‰kß [ïSµØ«‡“ÍjưÀ—¶ƒ “§÷å5Ó¡ÁĂ¼ù×Û«‚ ½98¤‡¡Û”…ÛöÁƠXÉ̉ƒÖëöÁ̃߈¯¼Û«‚ ½9£ÓÅÙ½߈óÇÏŃÚăà¿Ù™Ó÷ÁÀÓ·ÜïôÍË)éÛ9¥“ƠăˆŸ«»Ă¼©‡¥2ßëMÓØÛ«‚ ½9ù‡ÎÔ·‡‘×8çÛ«‚ ½99¥‡ÄÓ½߈ĂÙ‚¾·Ô›¾å̉ çÇåĂƒØù×ưÀ߈­Ä¤ˆ\0Û«‚ ½9÷Áéܱ»ż¹Ú·Å™‡Á½ÏÄÏÅ™‰kß [ïS¡×¾߈ë™H©Ó¸ÚƠXôÛ«‚ ½9ùꙋ÷Ú¹Úù׳zÏÔYßÄ٧ԫѹ¶¹Úƒv÷ÁÅØŸ}ó€ĂÈ™à¿ôƒÖéèÏ¿™‰kß [ïSµaϹ§-Ö«‡“ÍjµØ±»ùêăˆŸ;ÍÓơñ»ÑÄëÁĂ…»ăˆŸÿ¯¶½€³ÈÁ½ơêá=Í÷‡·Ôµa߈ơèÅ“ÆỞ߈›¡“ƠÙÚƠºmù×ÁƯ׿8«ÔÁçăÇíơÔœÜ8—¿ÏÔƒv«‡“ÍjÏÔ±»åŒ¿NÅáù×纾ù¿«‡“Íj«ÚÇ»ív±»Œ½€ºù×½ËÉ9Ù½ÁÂ÷Áá ÚÀÛ׳(•ŒăˆŸ;߈߈ÑÄë‹Ç›¾ÅÓ¤‰̀L„¢X—$ê$è$ä$ưÀµ‹ë««ù×—ˆ§Ó›¾÷Ú³ëԾߟ¹Ú­Ö©‡¥2ßëMßÙ¾±È™‡ÛƼÔăˆŸ;›¹×¾·Ó ¥0«ÔăˆŸ;ƒ¾‘߈ÏÔ™‰kß [ïSơÔ½ÙƠ©¼áêƯÚ½ù×߈÷ˆÙÚ·‡‘×8çñÖ‘®Ÿ}Û«‚ ½9½‹ÈƠ—ܽ֯¶ØÏŋȓƠƒÛƒvÏÔ÷å5Ó¡Ô›Û·¼Í7ÿÚ¹Úù׽ǡÜ÷‡±»˜‰j̃ZîS†ŸÄ½€¿́£ØÚª‚ +¼9—¶ÓÅ¡%©‡¥2ßëM±¿½öÁ9¥‡ÇØÏÅöÁÛÄÓ›¾§ÓƯ‰ÑÓƠ·‡‘×8çưÀ9¥‡ăˆŸ;¡ădÙ½Ÿ}«‡“ÍjÍÓ™×¾»‡—ˆ“Ơ­ÄÍË)éÛ9¥©‡¥2ßëMäôçÆ¡Ơƒv©Óª¶2tTưÀÏÔÔ¾F߈µaÏÔÏÅÔơ±»×Üáۻث‡“Íj¹Ú߈ëÚ¬ÄçºÓÆ™‡öÁ¾ß½g«»Ѷ×Ü«‡“Íj©¾™‰kß [ïSéê¹Á…ƒƒvùש‡¥2ßëM½€ù×ùơ·Ó ¥0ÇØëïâºïƠµa«ÔƠ¡ÛÏÔù××ÚÓºÁƯ†ŒÏÅÚ½º8¤‡ëö™‰kß [ïSëöÅÄ…ÚĂÙçZ¹ÁưÀöí‡ÂÏÔ߈±»Û‹ÜÇÅËÉ9½ÄôƯºÛ«‚ ½9ô˜‡Û«‚ ½9ƒ™‡ù×¾»¾±»Û#ăˆŸ;kĂĂÙÚ÷ÁÔ» %½Ô£Ø©ˆĂôÏÔ•{‡½€ĂÙ¹½– Ó̉ï»ÚÀÅØ«‡“ÍjÎÔb±Ôçô¿‰̉ÁÓ̉™‡«»ù×±»ñÚƠŸ\½‘íͼÈĂ·&ÑÄëëöÛ«‚ ½9ëö¾ËÖù×ïè•$Û«‚ ½9ơŇñ5—»‹Ümëđ™‰kß [ïSöÁçÚ̃ˆëöÚª‚ +¼9±»ÅàĂÙö¶û”Û«‚ ½9ÑÄë£ä È¾Äô“Æëöơê±»›¡Ù-¿‰“Æø‡¾Å +½±»·Ô“Ơ¿‰Ù×ëƠUùơëöÛ×Åí‹ûÏ­vÑÓÓÀÛÄÓ«‡“ÍjèÓ» ¹ßM÷Ï‹ù×û Ơ ×Éùư • +‡ß¡ûÅô§ÔÚª‚ +¼9¼»½ƒˆçÚ“ÈÅÀá Ÿ\Á¹¿‰ºÅ…öÛ«‚ ½9£ä·‡‘×8çå̉ ³°‰¿Iû†çÚù×°»ù×ưÀ±»‘ÆàưÀĂº×¾§Èê±»Ăº½ëÆÏÅÛ«‚ ½9ª‡’̀jƒvù×–¾ëö™ÓûÙ©‡¥2ßëMó«ÑÓµíê·Ôº¼ûûùë߈¹Ú߈À̉Óºù׌¾ʹÛ«‚ ½9®ôŸÅ÷ÁÛ₫®¶™ơÁƯ­ØûƠ›ÚÏÅ‹ȼ §Ô°»÷Ú߈«Ó™‰kß [ïS•ŒÛ«‚ ½9«d›¾¡™‰kß [ïS¡ÔĂÙù×ÛÀ$ơÔ«‡“ÍjÏÅÑÓ«‡“Íj™‰kß [ïS³Ăàăĸ׫Ôù×Û×åĂ™ÓÚª‚ +¼9ùæçÚ™ÁơÔ…öƒÖº½ ưÀÅÔ÷AëöÙÚ§ÔÏÔÁ̉“¹ƯN»Ø½«‡“ÍjÅ»‘Æ¡¡ăˆŸĂºâơ‡×ÅÓñÆ›¡±»±»©‡¥2ßëMß»ûëöÏÔ¼€ ƠXïƠéô­âçÚ™‡ÏÅ…à߈Û«‚ ½9÷¼ϹăˆŸùơ™ÓùơăÓº¥Æ߈¡Û±»×¿8êö½ĂưÀÿ§±»“¹ƯN›¾†Úçô©¼ĂæÑØ·™ëéåëöáê÷‡¿¹ógÁ‡é/×:àÅ¡Á½óÓØ±߈ÏăvÍ͹ÚÛ«‚ ½9÷Áö¿àÅÓ›Úëöëö€¼´¼ ªºµØ›ŒưMÂÿ§µØăˆŸ;ܡȫ»«‡“ÍjÓĂăˆŸ;ăˆŸ;ơÔ“ÛÉĂѶ∫‡“ÍjùêÿÚ«ÔÙ½º8 ¤‡ ™‰kß [ïS›¹£‡½ăàù×›‡Û«‚ ½9ùׄØÛ«‚ ½9“Ơ×ĂÇÖ™‰kß [ïSù×ĂơèÅ߈›¾±»÷áăˆŸăˆŸ %˜êèäÛ׈º‡«d™‡¹Ú‰¿IÏÅ߈¿‰߈ÖăˆŸº¹ÚăˆŸ;‹ÇĂÙªÔ¿‰ÏÄ@Ó̉ïÅ·‡‘×8çƠÓÁÓÂ×Ó×Ăëöéºơ÷ˆÅذ»¼ÔÍ…»‹Ü¿ÔêÖ «»¡h­ÄÏÔÀ½ ¤ÛéÓ‡Ú€Ơå¼ ‡Úù׫‡“Íj˹·‡‘×8ç­Ä“¼‘éăÇíÿ¯¶ßÄÙÇÖß»û߈°»¿‰³ºóƒ¾‘Ø× +˜‰j̃ZîS̃Á•ŒÂÈÛ«‚ ½9±»¿ÛÍË)éÛ9¥¢ ÙƠºö¤‰̀L„ÿÚ‹ÇóÂÛ«‚ ½9½ä×Äÿëöù×߈ƒv¥ÅƒˆëöƒvĂ߈ăˆŸ÷ˆµaÖá=±Ê³ºóÏÔƯÓ ăˆŸơÄĂÈ×Ơ†7§jÛ«‚ ½9ơêăơöÙÚÏŶÔÅnĂÂÓĂÈÓØéºÏ̉ÏÔø¾í$±¿Á̉دé·ñƒØ‹ÈɇÿqùơÙÚ±»°»†“¹Å™ÓöéÚÏ̉߈ö‰Ûù×ëö«·3uUÿ§Æä̉áêÏÔÁƯûƠƠ¹ÚƠ½°êØÇÖô÷ơöÈ̉ÏÅ̃ˆ¡ÔÛ«‚ ½9Ûº‘Ö‡ÍƠ²º̣½»ׯ’ÈÓØ¼€çÚă½¿±»˜‰j̃ZîSăơÍÓ³ăщÛ«‚ ½9̃ˆ«ÔÙÚϼèồÓ¡ÇâḈï½…àçđùê–Û«‚ ½9̃ˆ™‰kß [ïS±»ÁƯÛ«‚ ½9ÁƯù×·Û´a9¥‡™‰kß [ïS™‰kß [ïSÚ×ô“Ơ…Ô—Œ‹Ç°»…́ÖĂ½È³Ơ›¾ùê×Ơ¡Óˆ•=‘÷Áù̀ÛסÔááơêơêøôä̉Û«‚ ½9³zăˆŸ;kÙÅëß»û¶©ˆÏßÅÓ«d¯ÈƒvÛ«‚ ½9ư“ÏÅÜ̉ø×µaƠÔöăˆŸ;kƒ÷¼ÂÓÆ4ÏÔ½ôº½¿ºăà˜‹9¥‡ăˆŸ;·ÅµØëöÛ«‚ ½9™Á÷ÁỞ·Ó ¥0ψǾƒÖáê£Çÿ²!½­ÄÍīԇº±»ëö«‡“Íjăà˜‰j̃ZîSív÷ÚơêđßÚG½¹ß»ûĂÁƯ÷½«·3uUèÓǺ¿ºÛ×ç$˜Á«‡“ÍjôøÍÓœ‡߈·‡‘×8çÿ×°¿ĂôÏÅ›¾ˆÚ‡·‡‘×8çĂÈÙצôƠºmûÓÛ«‚ ½9ÁƯ¡Ơö‡ÚÉăˆŸÿ¯¶ó^ÛÄÓ¡ÁëöÛ«‚ ½9©Üª‡’̀j¿Å‰ơ­¾Äôdù×Ơ›¾ÿÚù×ÑĂæÚÏÔß»û›¡óÇ™‰kß [ïSĂई\0ëöƒ÷ÁƠ8¤‡£ö9¥‡ÏÔÛÇ«‡“ÍjÏÅƠĐíê«ÔÏÔ˜êèäç½å̉ Û«‚ ½9û±»³ôóÂù׫‡“Íj»‡å¿™‰kß [ïS½ôÙÚƒ½Û«‚ ½9ªÚƒÚ›¾›ÚÎŽ½€ƒØ·Ô›¾ơê»̉ưÀñÓ÷‡‰ÛÛ«‚ ½9ù×Ö¾™ÓùêöÁĂè§ÔĂ¼ëöç½Ñ+Ù₫çÚËÉ9ÏÔ¹Ú‰¾ñÆͽ·ÏѾ‘߈Ïű¿¾›¾ÑÄë­ÔËÓÅÓ‹ÇÍË)éÛ9¥Û«‚ ½9Á‡¦Æíêéºëöƒˆ±»‘Æø¿ÅØåׂvĂ߈ùשÓ÷ä5̉«‡“Íj§Ö÷Á€ÇÛ«‚ ½9–½ +ẳÛ«‚ ½9³1ûƠÑéçÚƯ‰¾—¶ăˆŸùê±»‹íºÓµ¡ƠÿƯå̉ 9¥‡ÔXƠÙÚ߈ƠÈ»á ™‰kß [ïSöÀù¿ƠñŸ}ÏÅá—Ö–»­ÖÓÁ髇“Íj“ÆßÄÙ9¥‡¯¼Ù×½Û«‚ ½9™ÁÿÛÏÔ±»ơê¥ÛÂÙ‘Üùו%çä±»‡Úó¶›ûƠỞëöÁ|«Ô˜‰j̃ZîSƒv÷ÁçÚ½±¿™‰kß [ïS±»ùê¾…Úáêù×ơçÅÛ×Áñ¡»’ÈÛ«‚ ½9ÇÖÛ«‚ ½9ƒÖÍË)éÛ9¥¾ăˆŸ;×¾ ËûˇÍÓ߈‰öƒàßÄÙ°»ÙÚÊ È9ù6“ȳ‹Ç“ǃv¼­ÄÛ«‚ ½9ù¿§Ó‡ÛÑÄëÙÚÑÓ½ÍÄ$™Ôơêùêå‡Ñ߈êö‡­ÄÁĂăÁÙÜÛêù×ô™‰kß [ïSÔÅĺ­¾»ÅÛ«‚ ½9×à߈ñħԉ¿I÷Áăàëö™‰kß [ïS¶@è@“¹ƯNŸ}ĐÓƒˆù×éÓÁÀƯëö½›¾ÈÖ߈ñ‹Ç±»—ÛÁ‡é/×:«‡“Íj©Ó™‰kß [ïSØĂÁ̉ûÓÇù‡ËÓ‡ÚûƠ‡ŒƠÅ₫Ú«»¶ÿÂ“ÇÆèßÏÅ–ăà߈ưÀ½€áÜÅÁëö«‡“ÍjÛ«‚ ½9¥ºÑ₫Á¹ÇÖ…Ô±ôÙ×™‰kß [ïSÓÅå&ûÙăˆŸ;ơêµØăˆŸ“Ớv™‰kß [ïS‡ñ5Û«‚ ½9×¾ăˆŸ;ÑÄë¼Ôô7ÅØÙ½‡ŒÏÔăˆŸ;¡ÔÛºƯˆăˆŸÙÚĂăˆŸ;‹È«&ù×ùל ™‰kß [ïSéê› §Æ¬È#í—G©‡¥2ßëM™ º©ØưÀ¾(«‡“ÍjÏÔ«‡“Íjèê¡ÈÛ«‚ ½9߈Ơ˜çÚù×߈‡Úëö₫'è·߈¾ÅÙY™‡Ë%•ŒÏÊù×ÿ¯¶½ĂñÓ•Œ‡¹Ú¡Û߈ÿ±»ß»ûù×́ºö¼ÅÓø¾øêׯâà­ÄÑÄëù×₫Ú½²º̣ÑÓÇÖÙY‹Ûé©Ó¹Ú‡̃Ńváêơu¼Á±»½…€­:ÿ×¹Ú³ÿ¯¶ù×½ÿ¯¶¦Ô2£đÑÁôÛ«‚ ½9ôê÷ƒˆÙסԀºƒÔ©Øù׃ڭˆ©ØÛ«‚ ½9à ăˆŸ;k÷ÁÇĂ¿ßÂĂÙưÁăàë-¿Å¿‰Ûƒ½©‡¥2ßëMÅØ߈¿‰«ÔÏ̉³ºó·‡‘×8çù×Ñ·¶GèGëö˜‚½ëÚ«ÔĂÙëö€º9¥‡Â÷ˆ±»«»µÅÿÚׯ™‰kß [ïSÏÔ‡½Ù·º¹ÚÏ̉ĂƠÁƒvÉÜăÇíùט‰j̃ZîSÏÅÁĂ»ˆåĂ²º̣âˆ:k˜‰j̃ZîSÁ¹ƒvù׶ܾăê³È·‹ĂÙñÓ¥ÖÍ߈ÅÔÙÚÍƠ¿Å÷¼ÁƯ‡º³ôÏÔ¿ßóÇ«Ú×Ó“Ơ£äñ˜‰j̃ZîS›¾Ù̉߈ͪưˆ9¥‡×Ù½ơêăơëö™Ó±»ç½¡Ôƒv°»Ï|³z”»Ø×ÙÅëÑÓÿÚÙƠßÄÙÁÓ¥߈¡ÛăˆŸ;™‰kß [ïS³ÆG½¹÷Ú×ƠéÚù×ĂÙ™‰kß [ïSù×Á'ÊØ“¹ƯN‹Ù¹Úï½ưÀ›¡ƒv‡ŒÙÁ³Ø™‡¬Ö§À—¶ÑÓù×ơèÅ£ÇĐÄêÏÔ÷ˆÜÓ ‚Ö™Ôå̉ ø×ăàÙ£Ó±½—¶™‡ϺƒÖ°)߈ĂÙé‰ñ5ñ·ÏÄ߈Û×ï½ÙÚÛ«‚ ½9¾ÏÅ·Ó ¥0Á/…»g°¿ù×Ö Ó̉±»û̉߈“È£@ÓÅ™‰kß [ïSá ”Ó¶Å8¤‡×ܡԙëéåµÛ»Ø‹+ƠÜ«ÔÅØö¼¿¡Á™‰kß [ïSª‡’̀j¡Á߈«ÔùơÛ«‚ ½9ô“ÆÏÅÇÖơÔ±»™Î‰ÆÍÓ¼ôÅ·ôÅÂÙ½ïƠµØ›¡üÀơèÅăơ©¼«‡“ÍjÙŒë*«­Äµ.¥ÙăˆŸ­ºùê߈Á¹‹Üùê…ÛñªÓ´½©‡¥2ßëM¡Èøêª¼,±»¯Ú½¶Ô߈ ƠĂ8¤‡9¥‡‘IµØغͪºö¶y·È¡Á“¹ƯN¶è˜ÁÀ¹“¹ƯNé×Ǽùבª¶2tT«dăˆŸ‡º£äÚ×°»å»ôĂÙß Ởâù×ÍÄÁñ»9¥‡íê«Ñ©¼ÁĂëö¶‡Ö8æ®ô™‡§Æ¡Ô™Ó́Ö₫& ƒv¾ºƒÚç4±»Ç­¾§âǼÿ×åÔăÇíư¤·ÔÿÚ½ŸØ½½Û«‚ ½9ƠXѶ ÜóÄëÚº̉¦ØÅÓƒv‹ÇÛ«‚ ½9Åë‡ưĂççÙ½ƒv÷Á‹ÇÉ̉÷Á³߈߈°» ߈˜êè䙉kß [ïSÏÔƒÚơÔÛ«‚ ½9™ÓÙŒë*«áÏÅÏÔׯ—ûử‡Ç”ŒÓ؃v¥ï›¾÷Ú߈ưÀÏÔǼ…ƠÍË)éÛ9¥ù峺ó“Ơ™ëéåñÚù׎‚vùêÛ«‚ ½9›¹Ơ½ÇÖÙÚŸÖăàÿơăˆŸ;k¾¬€Û«‚ ½9çÚ÷ˆ߈ÿÇù×¥ÈÑæª)‰¿I±»Ç̉¹Úơê߈ö¸Ú°»¨‡¤2€̃êLëö̃ÄØÛ«‚ ½9Ơ¾GÑÅ‹ÈÎÔ·‡‘×8çÿ¯¶ơػؿ<½¡ÈÚÅĂĂ ›­±àéMăˆŸ;k‚vùăˆŸÛ«‚ ½9áêçô‡ŒôÛ«‚ ½9ƠÚÀ̃“±»ÍÇ—»¥Ø÷ÁÎÔ‡­ÔÎÔ¼€ÿ(¼çôÛ«‚ ½9麳Üơêñ~˜‰j̃ZîS«‡“Íjëö¡Ô“ÈÙ½ëÚ“‹ơê¡»ÜăˆŸ‹ÜñÓÂÁ̉±»¥âÛßÁ‡é/×:›¾ÓØ¶Ô ƒv…»ï¡ÁƯ½ö·Â«‡“Íj½ÚשƠÏÅĂÙ‹Çù×ưĂŸÖ¶  Óÿ¾ëöç'×Ơ†7§j— ëÓ«%ù×ÏÔÙÚå̉ Íù×ívÛÀû¡Åø“¼ñÖŸ\™‰kß [ïS—¾ărçÚùŸ³Âôê‡Ú¡È¹Ú±»ùơäỗÉÖó|ó¶ÏÔºÍÄ%£ô“ÈöÏÅăˆŸ;éÚƒ¾‘Áă8¤‡ÖñÖϹ…ÛÏÔ³/‰¿Iƒ½ÔÏÅơщ¯¾9¥‡ÿ§Ù½ÖÜñƱ»ª¶2tTăˆŸ;kÑÓ‰Ôăàá=ù×ĂÙå̉ Û«‚ ½9œÜÛº°»ÁÅÓ¸ÚµØơ—́™‰kß [ïS±»—Ó߈̃ˆÙ̉ưÀ¹Ú™‰kß [ïS9¥‡ß‡Ç¡é·̣›½´Î“Ơ¡É£Ø½€½€߈ñÚœÚ‰ÓØ™‰kß [ïSÛ«‚ ½9·º‰¿IÏÔ˜êèäºÔƒÔ9¥‡·‡‘×8ç¡Á›Ă¹Ú߈üÓăˆŸ;‡º»ƯƒˆáÛÀ™‰kß [ïS¡Ôï½߈·Ó ¥0÷Ùăàá겺̣«ÔÏ噉kß [ïSỞ«‡“ÍjÁơêæ̉шó©Çá Ǻ…V£Ó©‡¥2ßëMÏÅùן֙‰kß [ïSÁĂËpÙºŸÈĂÈ̃ÖưÀơÀ¹ ÷Á«·3uUÛ«‚ ½9ôØË̉÷ÁÛÄÓ·‡‘×8癇ÏÔ«·3uU‡Œ™ºÏÅĂÙưÀÑÓăˆŸ;ÏÔ±¿ûÙí ăˆŸ;±½ÿ–••ĐĂɩӣ䣻½‘)̉º +Ó¾ơÔ±óï½ơêëö߈ù¿·Å“º…ÖĂÈ·µ¥ˆ]1‰Ơ½®È¿ô߈ÑĂ¡Ô±»ÖØă»Û«‚ ½9ÏÄÛ9¥‡µØçôñÚëöăˆŸ;™‰kß [ïSùסÈ߈ÿ¯¶Ë¿×$ù×£ÇÛ«‚ ½9á=g麺ÿ¯¶“¹ÜNă±ô«»ÅƯ¾ßĂ¹…ŒÑÄë¾¹ +÷ÁÇ%Ü™‰kß [ïS×̉Ň̀ăˆŸÙ½¯§Å™ơº÷Ô«ÔưÀ«‡“Íj“ƠÑÓ“ºÅÄøëÿÂù×ù×°‡߈¿́™‰kß [ïS¡È½€€Ä¡&§ÓăÁÁƯŸÅơêơê±»¹ÁÙÚöͼăˆŸÚª‚ +¼9—Ó·‡‘×8ç§ÆéÓ¼€ç°¯¿́÷ÁĂÙ9¥‡ơêÿÜưÀñÚ߈°»ĐÓßÚăˆŸ;k«‡“ÍjăÁ›¶é9¥‡ÿÂÉÔX±»¹ÚªÚ!ƠXÔù×Ù²óíá̀Ù̉­½¼ÅẶÂïÚ˜ơ¯ƒßͯ¥'=U#QK¯Âáê—¶™ëéåá ăˆŸåô¹ÚÿÚE™Û«ÔÏų ÿ¯¶ÏÔ9¥‡»Đ¯¾µØ%½ơĂëÓº߈Ç}߈‹ÓơÔÖ¾±»çÚÙ½ÏÔ‘ƒµ‹Û«‚ ½9ÓÆ°»’Ç#ŸÅ¾¹xăơ˯ׯùë¿¡È·‡‘×8çôꙉkß [ïSÚª‚ +¼9¯¾ÇẴÄØÙ½óưÜơꜷ̉ ¤0µØ¥ÛÁĂÅÓùסÑÓù×ƠºmÏÔ¡ÇÏÔÁ癉kß [ïS¹Ú¾‰ĂÙ™‰kß [ïS™‰kß [ïS¿Åß»û«‡“Íj߈½ăàóÇçÚŸßư+™‡­Äº™‰kß [ïS·ÜñÓ«·3uU‹Ù±»µØ¡È«Ûù×÷‡ưÀ«‡“Íj½±»ôĹÚëö…Û«‡“ÍjĐÓôúå̉ ߈ñÆûØỞÛÀ›¹ÑóÑÓíÖ麃֛ÚÏ̉£Øñ‡ÏÔ«ÔÅÓơêĂÙÙ½»ØÙÚ¡ÔYñƾ©ØÅØºăˆŸ;÷ÁÛ«‚ ½9½ëö‹­ëö­7±™‰kß [ïSѶÛ«‚ ½9«‡“Íj¿ôí%ÙÚ£ÔϺùÿ¥Ưå̉ Ûàôêëö±ÓßÄÙĂÙ±»³z÷Á«·3uU߈ÛºưÀ߈ÿÚÛ«‚ ½9ß»ûëö߈ƒˆà­ÛÀ“È•±½íÆơêÑóÏÔÅç“Ç·Ó ¥0Ù½¡ÈÏÅÛ«‚ ½9߈ơêç̉™ÁÇØÿ× ÔûƠù×Éß›-¥±Ǽø×ƒvÍÓëö»ËÇâˆ;ëö±»Eºç'›ÛƒvËƠáềÄ‹Ü߈…ôÑÓăˆŸ̃ˆ˜‰ j ̃    Z îS ߈Û«‚ ½9¡ÛµØå̉ ù×ăƒñÛÓŽơèÅëöÙ½½gÁƯ“ƠăˆŸ;kódz 9¥‡ĂÙÛ«‚ ½9ƒvƒv—¶ăˆŸ;ø×“Ü˹«‡“ÍjÑÁ÷Á§ôÏÅ¡Û×·ÅÙÚăˆŸ;ÁĂÁù×ëöƠîù׋«-‘Û«‚ ½9ù×ÏćÚéêÏÔă½ê¦Ó‡ÚódzƠá Ç%ïÀăˆŸ;k¹ÚÓ½‡Œù×ÎÄ—¶“Ƚ۫‚ ½9™Á™‡ªÔ᱿¿‰ôïƒvϺçÚÂå“•çÉ›ŽÛ«‚ ½9©ƠÿÚ›Ó±»Ù½ù×÷ÁăˆŸ;kÅÄđØÛÀ߈ÏÅëöéß±»›¾±»§ÆÛˆ‡ÛçôÁ9¥‡×ƒÚ­¾ÍÄ‹Ç÷ÁÏÔ½ÇÁĂ“ +â½ưÀåÁ³ÇÓØª» +ëöÁƯöĂ)×܇ŒÛ«‚ ½9́ű»³(ù×±ëØÔơÇÎÔ·Ô½›¶é“ÈÇı»®p°êØÙÚÇĂ½çÚîÅË¿בÓ‰Ô—¿ù×9¥‡Ă ó¶ÅصØÛ«‚ ½9ö…ÛÓÆ—¶‰Ưͪù×›¶é•Ó·Ó ¥0ÇÖ÷‡€º«‡“Íj«‡“ÍjíÆÿ¯¶ÿÚăˆŸ;ñÖ¼Ô¡ÈÑÓƒˆŒÖ±½‡ë×Ïԩؽ€£Ô­v³ÂưÀÛ«‚ ½9øæ‹Ü·ØËÇóêÀ‡€è/Ö:°»ÙΉÆƠXÑÑÄë•Ơ Ëûù׋ÓÓƠƒvăˆŸ;ơÔÑÓ¥ÓơêëÚöëöù×ÿÚ­Ö–¶åÙÎŃv“ñëØÙ½ù¿ßÄÙÁ‡é/×:ưœå×£!±»™‰kß [ïSûØ߈ñÖŸÏ̉ËÉ9Û׋ÙÏÔÛ×ÅÔ·Ô9¥‡ÄÓơ«Ñ̀Ó·‡‘×8çù×Û×”ÈúˆøEÿ¯¶ùׯÍBñÓ߈ˆ½³ÂëÏ—ø Êû¾¹x߈ƒÛ«‚ ½9Ăºó|±»ù×ööó•½₫®¶߈§ô·‡‘×8çñÖ¿‰Å»½¾‡¿ô¼Å»Á›¾ơζ2tT¡ÔÁ½ÏźÅÓÙ½ư§‡¥âæ'ÏÅ4ùץϰ»‡Ú•{«‡“ÍjơÚÓÆ÷Úă‘°”Ơù×ÍË)éÛ9¥™Ó¿ç³ôµØ±»©ÓđÚ¬Ö(÷å5ÓÑÓ¡È™‰kß [ïSơº߈«‡“ÍjܽµØ߈ëöÁƯ¨È*ù×̉´O†“™»9¥‡×²º̣ƒvưÀ™‰kß [ïS¾ß¨ +ƒˆºÁơêëö«Ñ¥ˆ]1‚߈éÓ…Ơ±»đÓ‰ÔưÀÙÚ÷Ù¯ÈߌÛ,»½›¾³ºóÆ»‰Ư±‡™‰kß [ïSĂ˜‰j̃ZîSñÖ±»Æ«‡“ÍjåÁñÚ©‡¥2ßëM¶‡Ö8懺ßÁ¥Âëö߈ÔưÀơêÂÙăÊqÛº‹Üƒvù×½9¥‡××¾ÏÔ±»ƯÓ ăÇí÷Î߈¼Ûºϼ©ÓơểàăˆŸ;ív·̃›×ÓăˆŸÏÔù×ëÓ©‡¥2ßëM•ÖӺ߻û‡ÛÅØÛ«‚ ½9«‡“ÍjĂ«Ñ¶ÔƠ‡Ú€ÓĐæ˜‰j̃ZîSóÇ鲩Ó߈ù¾ÍÓ©°ƒÖ‡ÇÍË)éÛ9¥œ‰¾I߈́–G±»±»Ù½ăˆŸ;˜‰j̃ZîSö߈ù×­¶Æ9¥‡ĐÄêȺÀ¿ô³·‡‘×8ç‰ƯÓ̉‚¾¹ÚƠ±ŒÜÓ ‹Çƒv¶  ƒvµØ«»ÅØĂÙëö›¾‰Ô±»ˆÇ½ñÓψ™‰kß [ïS†ºö÷Á©ÓûØ—Óé¿́óÄếÁƯíê߈çÚ¿½ÑÄë“ÈÛ«‚ ½9åñ»¡ÈôÄÎÔ›¶éá=¡ÔÍƠ±ƯïƠÑ·åÁ—»µØ¡ÉăˆŸ;éG†Œù×±ëØ9¥‡×ˆvâàƯ ›¡ëö¯×­ÄµÏ±»Ơ—ƒvÏÔ¥Ó½ƒv́v›¾¹ÚñÓËÖÛ«‚ ½9­ÙÅëÛ«‚ ½9ÓưÀÇÖí‡ÿ¯¶É”ëöµØ›¾©³ÇöÔăơñÚ°» ¬¾ÅÁ₫ÇÏÅéêơèÅù×ÅØơê½ÏÅÛ«‚ ½9­ÄưÀÏÄăˆŸăˆŸÛ«‚ ½9£#«‡“Íj¡Çƒ߈Ó±»Ơ¡È©¼ÏÅñÄÇÖ¬ÖíØ±½ï»åÿÅá=ϹŸÄÿÂÀ̉ưÀăàÛש‡¥2ßëMÛ«‚ ½9÷Úâà ›¶éá̃ÑÓ ÓĂƠƒÖùëëö›¡ÙÚăˆŸ;¹àß–É»‡Ü“Ơ“ÈﯘԳz½Ô߈ÛÀ™‰kß [ïS¿ßᙉkß [ïS Ơù×½ôßÁϹăˆŸ¡ÛÙ½‡×™‰kß [ïSß»ûÏÔÍÓ­ÄæØƒvŒĂöçڇǹÚñÓèÚñÓ«Ñ//ƒvívêÖƒvÁ½߈ƒù×±»ăˆŸ;k¡hñÓ«‡“Íjƒ×ÖÆ±»Ù½Ưºô±»«Ôñ×¹Ú±»Û«‚ ½9µÚÜ‚× Û¬ØÙĂßÁ¦Ô±.˜êèäù×Û«‚ ½9̃»úưÀÙƠơêûØûÓ÷ˆ­ÄÍË)éÛ9¥åÁ©ÓÅÓª‡’̀jù׃փöÁÁ·Å̃ˆ¦ô·Ô¿(ƒv™Á°»‡¿íÖÏÄ·Ô¨‡¤2€̃êLăàÏÔÏÔ·ºßÁÏÔéߥț‡äơù×ä¹Ú߈µØŸ₫§ÔÓÀÇè™Ó¾ÙŒë*«ăˆŸ‡›¾߈›¾¿º±¿«‡“Íj£Ø‹Ç±»º‡“ơêÛ«‚ ½9ÙÚù×·‡‘×8çƠï½°»ƒÔ‰ÛĂÙçƠ9¥‡ĂŸ÷ÙÛ×çÚĂºÍƠưÀèễˆ×̉™‡רÙ×̃ơ˱êÔïÅ9¥‡ö±»Á̃ÑĂăˆŸ;»Ø±»½ùלܒ•ÔĂ¡Ç¿ÅÓÅÓÆ±»÷Ô¡ưÀ­å“½å‹ƒ‚½ÜÛ׌¾ëöàĂå̉ ÄÓÔ£Ḉꙉkß [ïS±»¿‰úØÛ«‚ ½9—¶«)Y߈™‡ˆ°»âˆÁù×±»ăˆŸ;ëöÍË)éÛ9¥«…½ÿÚëơ©‡¥2ßëM˜‰j̃ZîS߈ưÀ‡öß„ÿÚ×ÏÔƠ»Ø™‰kß [ïS¹Ú­Ä¡Çơ꛾»Á½ív¡È›¹ÏÔơê§½ÏÔ£ØăºÁƯÏÔ±»ÍÄ߈ƒ”±¿™‰kß [ïSûƠƯÓ §Ô˹ߌÛ,ÑÓƒv¶Üô§à•Ü“Ơù×™‡û •Üơ߈ñÚ­€ÙŒë*«ơêÍͺ«»‰ĂÙ¡Û…Ơ½™‰kß [ïSÙ½–¶ûƠͼÅÁ¿±»ăˆŸ;ß„‹Ü‡®Gø¶èÓ‡Œ¹É̉±»µØ¯¾Û«‚ ½9Áư‡±ù1º¶ÏÔÓÅY±»’Æ“ÆÙÚÉ̉Ÿ}¹Ú߈¿ô™‰kß [ïS­ÄÑ·±¿½̉µØ‚vØƠÛ«‚ ½9ă‘·Ö₫“¹ÜNË¿ù×ÁËóÇÏÔÿÛ±»ÿ¯¶ïÚ²º̣³È×ÓÓÁ¾ÁÅÔ™‰kß [ïS±»ăˆŸ™Áªd9¥‡ñÓ߈ËÓë§ưÀÏÅ÷)ï»—¿·ÔÿÚÑ+¿́Ï̉ơêĂÍÄ›¹±»߈ ´† §ÔëÓû¿ÓØƠXÙ½›¹ÛĂÙ±¿Ă¼g©Óù׫‡“Íj«‡“ÍjÙ½è}¾́ăˆŸ;ÙÚÍ­Hºëöù×öưÀ»ˆ‚vº”ÈúßÚǺÛº¹Ú§Ô߈½߈›¾‘Ƴzơê½ëăˆŸ;¿»ăˆŸă9¥‡µØ“ÆÏÅÏÔơÔùêëöăˆŸ9¥‡·̃ơ\ù×ÿ¯¶ùëù×ù̀¡ÈÛ«‚ ½9Û«‚ ½9™ÔÛÀ›¶éÄô8r¤‡rÖ‹ÙăˆŸ;™‰kß [ïSÁñg³åÁ匿ǸÓ¿Øç'±»­ÔÇ"ÑÅׯ‡Œ‹Ü“ ·Ó ¥0ºơÔ±»‹Üùº½€½ß»ûĂÙ‘ư½ô9¥‡Å–å×ùàÿÚ©Àư­ë½˜‰j̃ZîS›¶éơÔ«ÑĂًܯÓß»ûËÓíç¡%– 釫‡“Íj¹ÁùëÑӣئ¹€ºÛ×ÜüÁ³È‡Û½‰¿I§ÛÛÆÏśڣ»¡ÔƒÖÏÔĂÙ‹ÓáềB‹Ôê½»‰Ø™‰kß [ïS±»±»•ŒÑÓщĂôʹ÷ÁđÆÓºÏţ؀ºÿ§ơêÙ½çôÛ×ñÔ½ù×ùêÿ¯¶‡‹ÙË̉‚v89¥‡ù׻؅ƒàµØéê³Â—Úù׫»ÑÛóÇÓÆï½Ơ™‰kß [ïS±»ùר"³ù×·ÜûØ߈“ÆƠŹ)§Óëö©º³z«Ô‡Ư¹Ú½ËÿÚä̉ + +¶Ü©Àùêù×ÏÅÛºÇÖùןdzÁ™‰kß [ïSÁ×Û«‚ ½9ÛÀ߈Á½½«ÔÇÖ¼ô—ˆß»û¹ÚăˆŸ«‡“Íj Ûóµù×ăˆŸ«‡“Íj€ºÛ«‚ ½9—¿ç̉›¾ÍĂ›¹¾ë™H›¡ơç¿»ÿÂ˵¯Èó¶ïƠñ»™ÛÅ‹Üö½ÏÅôÔ9¥‡ưÀƼ“ÈĂĂ ›­±àéM·‡‘×8çăˆŸ›Ûíꙇ±»ßºĂÙß»û«·3uUó«ڇÛù׋܉¾«‡“ÍjÄ´'ơ꺽º¡È¹ÚÙ½™ëéå¹ÚñÚơêơèÅÙ×ÓØvăê߈9¥‡×­·¼Í7ÅÔéÓëÚ™‰kß [ïSÏÅơê‡Ú«»ƒ½Û×ù×Ơ«‡“Íjź½ĂŸ ‹Çƒà÷ˆơê™Ô±½áƠ½Ă¼Ô£Ø–»ÓØ¿ºÏÅ9¥‡ăˆŸ;³₫®¶öÁ‡ƯÙ½°»ÙÚƒˆ¾•‹H«Ôù×ăˆŸ;ù×ÏÔ½º«‡“ÍjÑÄëƯ‰ûÖ×¾ÏÔÙơÔÇÓѲíÖ·ÔËÔ‡ºÂÿ¯¶ÏăμÄÓ½ôù×¾á ¡ØơèÅËƠăˆŸ;¥ˆ]1Û«‚ ½9¦ôöÿÛ©Ó§Ó©‡¥2ßëM¡»¼×Úƒv¡È½ÜĂÁĂóăˆŸ;›¾ñÚÀ‡€è/Ö:›Úç„½Ă°”ïưăˆŸ;ĐÓ¥ˆ]1Á½ƒà߈ù×Ù™‰kß [ïSÿ¯¶­vÑÓÙ½ר«‡“ÍjùûÓÏÔúÙº¯ÈơÔ¡Ôüƒv±»Î̉“ÈĂƠÑæëöưÀ½ù׋Ƿ‡‘×8çßÁ‡Ç±óÄ́vÏÔÛ«‚ ½9½ÿ¯¶“Üù×—Œ¿ß‚ÏÔ¾™‰kß [ïSù×÷Ồñ¿ÏÔÇÖƒ½ñÖ¯¼½­ÄÏ̉ÏÔµaƒv½œÄö±»ăˆŸ;߈ơê߈ăÁ«ÔœÂ ߈‘â·̣±»ăˆŸù;ƒˆ÷‡µØ̃ˆ±»¾‰ơö“Ơ¿‰ËÖµa ÁàĂ£Ç¾ÅÍÓ…ÿ¯¶½™¸̀Ê)èÛ8¤ƠϼŽßÄٵطŷơ™Á³È›¾µØÏÔ³öÏÔ©‡¥2ßëMù¿Û«‚ ½9ù¿9¥‡ĂĂÖ½Ô÷Á¡ÈÙÚªƒvÏÔ»nÙƯÇØéŒåĂ÷ÙÛÄÓăˆŸÇá·ÔÇ%ﻵØßÄÙÛ«‚ ½9ĂÙ¼¥ˆ]1ŸĂ“ƠÚª‚ +¼9ÏŹڇڷ‡‘×8çÅù×™‰kß [ïSÛ«‚ ½9ó‹ß:—»¡ØÍÇ¿ºÏÔÓÅ£»ăˆŸ©Ó™ÁñÓ±»·̣·Å¸ÚĂÙ¼Û«‚ ½9·Ô߈ăå‰Û±»§ÔƠ°ÁÛ«‚ ½9¡Ơ±»ÙÁ½€»ØÁ̉¬ÖĂè× Ă¼ôꃯ×ÂÙÿÛ¹Ú£é…ØÏÔùê‹Ç È™ô߈«‡“Íjçß±»Ù×ÇÖ·ÜơêÎÅÍijºóÿÂÛ«‚ ½9½™‰kß [ïS¥Ûù×¾–¶ÑÓ¿ÅöÁƯ›ù×›¾±¿ëöăˆŸăˆŸ;ÍƠñÓÑÓ±»‚vúËÇăr±¿߈ơÔ”%‹™•ÖóÄùô«‡“Íj»ƒvĂÙ±»°È½˜‡÷Á®Gø8¤‡™‰kß [ïSÇ̉Ú×ÏÄ©ÇË¿ëö¹ÚÛ«‚ ½9¸ÚƒvÛ«‚ ½9™ëéåË̉߈ƒ¾‘»Ø—Ó—Ó¾¯Ô¥â©‡ùểÁº›¾߈đẠ́Ô³ÈơĂ¿Üß»ûµ†º«»•Ó %Úª‚ +¼9ƒÖÁ°»‡ŒÁ’¹ÜNù¿‚½¹ÚßÚù×ÿÚÅ£щ€öƯºêơœ¿߈å̉ ÏÔ§Ôå̉ ×¾¿»ăˆŸ;®¼¯văˆŸ«‡“ÍjÍÄŸœÑÅîƠµaÉ ‡Œ‚vÑÅó#ÿ¯¶ÑÓµƠƒÖÿ¯¶¡ÈÇèÍË)éÛ9¥±»ºù×Á×½ñÓ°»íÚĂ©‡¥2ßëM¸à +ƠÚ¹Úÿ¯¶§¹ºÛ«‚ ½9™Áù×ñÖÿ¯¶ÏÔñÓÅØĂƠơÔ±¿±»›#¡3© …Í +­’¯¼›¾߈ÙÚÄôĂ߈“ƠÏÔâˆ;ÏÔ®×̃§×ÁƯÓᲿߙëéåY½ơÔ߈̃ˆñÓƒˆÙׇǡÔ%‡“ÑÄë¹ÚÏÅÏÔ»ÜÔXëö£ØăˆŸ£ÇÍB»ô›¾ÍĂƠ»y”ŒµØ߈ơèÅăˆŸ;kçØÓºåĂëö́Å™‰kß [ïSơỐÑæƒˆ“Ơ½ÔóÇÿ§ívóÂŹå‡ù×ăˆŸ;kË6ƒàçô©ÜÅÓÄØ‰ÛÁ½÷$ŸÈù×±»ºăˆŸ;›¾߈ϼ«‡“ÍjÚÄ̉¹ÚÓ¼ăˆŸ;k½°»ăˆŸ;—–·Ô½™‰kß [ïSׇÙÅë¥Øƒv̀Ê)èÛ8¤ÓØÀĂûÓö°êØèº‚×רưÁ¬¾¸£É̉ÙµêßÚóÄ™‰kß [ïSĂĂù×ÏÔÛ«‚ ½9ّƽưÁăˆŸ;·º™‰kß [ïSưÀù׃ÖơêÑÓ—¿—Ó¡ÈÏÔö£Ëö‡©‡¥2ßëM§½ÅÓ£Óù×ỞÿÚ­ÄÀÁ“¹ƯNưÀ¹Ú—¶̃ÄØÁ̉éׄøăˆŸ;±»­v«‡“Íjƒ½óÇÛÄÓơºÙÚ÷Á¡ÈêöưÀëö¥Øí—GκÏ̉«ÔËÇîŧô›¶é£ôẲ­ÖµØ—¶«‡“ÍjËÇí¡ăˆŸ;×ƠÍÓ³ÈÛ«‚ ½9ívÙ×Û«‚ ½9Î̉½ƒà÷Áî÷áê߈¡Áù‡±»߈Ăٕ·‡‘×8ç£XѶ½Ơ˹ÿÚ£Ç÷ÁĐ`¨Çëà»Å§ÂÓº±̉©ß±¿çÚ€¾»ÅÚÆưÀĂk¥ˆ]1ÅØ­IÏ̉å̉ ăˆŸ;߈½Á¹Úêöë××$Û«‚ ½9›Ô8¤‡±»«‡“Íjÿ×±»â½ưÜ«‡“ÍjĂàĂà÷Ôơóƒ³Â÷$ĂÙß»ûëöµØ½›¶é¡È£ØŽơÔßÄÙ«ÚỞ‘«Û«‚ ½9“Ơ›¾©»Ø›¹ÍÄ·Ô¡ÔÛ׉ԂvéÚÏÄÙŒë*«߈˜‰j̃ZîSǽÛºö¦ÈÁÓ™‰kß [ïS߈¡ÛưÀ¾ëăÇí9¥‡ƒvçÚá íÍÔÅÔÛ«‚ ½9»›ÚÙ½ăˆŸ;öˆÔX +‹Üµ‰Û¡ÛÑÓ¢X +ÑÄë£ÇÛ«‚ ½9ăˆŸ;kÉ߈ÏÅ¢XÇÛ×°½÷ˆÿ±»ăˆŸ;민çÚ8¤‡×£̣Ù½ƒˆшƒ½«ÔÁƯÏÅ›¾ùôéꙉkß [ïSÙÚ߈¸Úù×H»¹ÚæÚçÚ‡º›àăˆŸ;ßÄÙÏÔó†ǵث‡“ÍjÛ«‚ ½9—¶¡Ç½ô߈ÙÚ­Ö«Ô§Ô«‡“Íj‹Ç—»¡qµØÛÚëööĂɇåÁÏÔ…ÏÅרÏÅǽ‚¾Ûºº¿º™‰kß [ïS«ÚÏÅ«·3uUö߈½…ƠÛ«‚ ½9₫®¶™ÔµØ9¥‡×½ĂÈÔÅÁĂßÄÙ–ŒƯ ·ÅßÚơĂ¯áóÇñÚ—ˆ”DÛˆÀ½ +«Ô¥ˆ]1ñÖ§¹½•Èû›Ëǽù×å̉ ơêªÓưÀóLjíÚ¸®µØÛǘ‡÷ÚÔ˜Áñ~ÛºûíÀƯ÷ÁÛ«‚ ½9ñÖóǽ€©‡¥2ßëM«‡“Íjơêû¥Ë¿•ŒF¼¹ó±»±¿¯È©‡¥2ßëMµ.¥ÙÑÄëÓ̉߈£Çƒv…ƠÑÓ‘×ëöÛ×ăˆŸ;´•‰ßù(ú̉±»ø×›¶é·‡‘×8ç—§Í»çôœ‡_ßÚ¯¾¯¼ù×Ù×™‰kß [ïSù×°»߈¡È́vô߈Ămº½½©†ÚÏÔéđÖ¾8ÛºñÚ™‰kß [ïS‡¿Ö¹©ƠÅÓׯăˆŸá¬ùê¸Ú߈¹Úèn¥ˆ]1º·Å·‡‘×8羪‡’̀j·ư‡Œ«‡“ÍjÁ̉«»¹¾«‡“ÍjÙ½¹Ú¹Ï›¶éù×½‘Û±»öŸĂщÀĂëƠUߌÛ,‰±6ùêÓºơÔƒˆÚª‚ +¼9á̉µØơÔ¯È÷ÁĂ¼ÅÄÜá¬Ûº¾¹î$ö¼‡Ú™‰kß [ïS麿Ùú(±»±»ƠÏÔŽ‘ơơúơÄó³ÆÏÔËƠÙ׺‹ƒv“Ș‰j̃ZîSÏÔöŸÅÛ¹ăˆŸ;k§Ø‡Ç©¼ï»™Ă«‡“Íj±»ù×Ù½ƒ¾‘ƒˆ¸ÚËÇĽߌÛ,…Ú½•×ƯºËÖíÆß„߈ñ¢¶  ™ơ«Ô÷Á߈±¿£ÇƒvăˆŸ;Ơ߈›‡$½ÔºÔƒv±»¢ÈỞ¿ôÍĂÙÚ­½¼·̃÷‡ơêÁ¼ÏÔăˆŸâÁÿÚôÚ×”Ơ·Øëö9¥‡™‰kß [ïSßÄÙÛ×ͼ¹Ú¨¼ívêÓÛÚ»ØÉ)ưÀüÓÛ«‚ ½9μ‚v¼Ô +¯Óêö¼Ô¼™‰kß [ïS9¥‡ăˆŸßÁ«»ñӇ׫–ơÔ½€™º±»©À™‰kß [ïSڵصa¹Ú­™ÔăˆŸ;ÑÄëâà ‡º9¥‡ưÀ§Ô…Ơëö·q₫ç̉ĂٵؽÏ̉‹Ù¯àĂÙå̉ ÜÓ ߈ÏÔ¿»™×Û«‚ ½9ñÓËÓÁăœÜCëöÁĂù׋ÇÙÚ™ÔçÚ½ëöéê¨ÓµØâ¼ƯÓ ÖÆưÀ߈ñ»£ ·Ô›ÚÍË)éÛ9¥Ăơê„äá=߈™Ôå̉ ưÀ©Ó÷Ú₫ Áǹ«ÚØ×üÓµØí”߈ơºÿ»ÁË%ß»û›¾ăˆŸ;ĂÈ“¹ƯN·Ô™‰kß [ïS©Ó§Àå¿™‰kß [ïSÛº«ÑÍ­HăÇíùô¥Æ›¶é«‡“Íj³ºóûÅ»™‰kß [ïS‰Ô¥â³ÆÙ½ăˆŸ;k̀Ó×ăà¶Å«ÔĂôăơË̉ÅëöÛ«‚ ½9äôÙÚ™ÔƠX½ƒvƦ¹»º“ÆŸ}ÇØшùÏÔăˆŸ«‡“ÍjÎ ́ăö÷ˆøê«‡“ÍjÏÔĂµØ¶Ü¿»×Ă¹Ø߈·‡‘×8罆Œ±»å»ù׋öÁÖ¾ñÁÖÆ±»‹ÜơÔñ×ÑĂ¡»ơêËÇ…Ç¿ßëöÛü«‡“ÍjÏÅɇ¶‡Ö8æÛ«‚ ½9ØƠ÷ˆ¡ÛçÚ±»ăˆŸÛ«‚ ½9óïÚ’½ñÓª‡’̀j×Ơ†7§jÇÖÖ¹™‰kß [ïSöÁ›ÚƒÁܱ»Û«‚ ½9á ª$™‡ÓÅÙ½µØµØ‡“źÓˆ•=‘ÍBÑÓ¥ÆñÚ‚vù×ßÁ«‡“ÍjßÄÙÁ¹Ơºm°Ô ×Óù×ù×G½¹ƒÚå̉ ߈ÄÓăˆŸ;ă3ơÔưÀÛ«‚ ½9·Ô±»µØÅØ£”é·Ó ¥0Ăº­Ôáê/‡“¿±»¡ÔơÔ×Ơ›¶éºÓ«ÔăˆŸ;kçÚ×ÖĂ Í¼±»˜‡½¶èÙ½µÄù×ơĂ÷$—»½ëöÿÂ÷̃ÿ§UÖ¾8³àÿ¯¶Öôï³2ÖÆ™‡¡Ôé‡×̉›¾ùưÏ«‡“Íj鸺ÏÔƠ·ÅưÜ÷ˆ¥Ø¥ÓƒvµÍË)éÛ9¥ăàÛ«‚ ½9¡ÈÛ«‚ ½9ÏÔá ۵ؽ“'ăˆŸ;kɵưÀ9¥‡×ß»ûâ$+®/+©‡¥2ßëM«»½ăˆŸơĂù×ÙکǹÚ×¾ÍË)éÛ9¥ÏÅÓÅívÁƯ™‰kß [ïSù×øë¿‰ó?ƒ¯¼í—GߌÛ,·‡‘×8ç‡ׯ’߈¤ˆ\0Ó´ăˆŸ;‰ơ›¾Û«‚ ½9₫$Ơö°»»y•»‹Ù§à¾ß‘ơÔ¯ÜưˆÇÖ‚văˆŸ;ßÄÙăàÙ½Åć¿ù×Û«‚ ½9“Ơ׿8Ó.›´È±”—¿ͪ°»Ơí÷‡½›ÚƠûتÚ+Ô‡ŒăˆŸ;¹ÚÁĂÛ«‚ ½9Û«‚ ½9â½éÓÁÜù×½ô±¿ÑÓÛ«‚ ½9#èơ·‡‘×8çóƒăéÓªÚó‘ÿÉû¹Ñ±¿­ÛâÁơêÓ‰ơÅÔ°»™ôĂà¼ë°»¡Ôß»û¬Öϼ‰Ô¡ÁÙŒë*«÷ÁߌÛ,³Ø«‡“ÍjÏÅ9¥‡ôê₫±¿ÏÔÀ¹¼ƒÖ«Ô™‰kß [ïS¢ÇíÖåÖ‰kß [ïSĂ(Ù½Ï̉ÓºĂÆ%ÏÔỞ«»Á̉±¿ÿÚ¡È™‰kß [ïSËÓØǼƵ؃½­̃½Ü߈ưÜ߈û(ÏÄÍ­Hø×‰Áơ‡ÑæµØºÛ«‚ ½9¾ƒÖ±»«ÓÙ«‡“Íj—¶ư¹«µÜ«äăˆŸéÓ߈™×†×ÚºûƠñÓ±»ÙƠ³ÙăàåÇÛר‡xÏÅÍ­ô¿è¹€ºØïêö‡~áöŸÖâˆ:ƒˆÿ¯¶ÿÚ«Ô™‰kß [ïS‹ÇËÖêöÑĂ¡“íœ9¥‡ÅØ#óÇùשӽØÁ ›¶é®Gø›¾ÿÂÏÔgÁƯíÖùëëÔÀ½“ׯßÚ¹Úª» µƯ«»Û×ôĂ­Ø¼™‰kß [ïSăˆŸ;ï»óÔ‡ŒÙ½Û«‚ ½9ăꃈËÉ9Û«‚ ½9éêëö©»½ëÔÁĂëö‡Ç5«÷ؽ÷Á™‰kß [ïSƒ¾‘߈Ù½‹ß½ÛºÍƠƒvÿÚ·‡‘×8ç²Ø¼ë±»Ï̉߈›¾ÍÄÅØ™Áæô߈ƒvĂĂÙ½ëö¥ÛµØ¡ÛƒÚ›¾Ÿ ¨™́ív«ÔơÔÙÚ·Ôшÿ¯¶ă¬ÁË÷жè¡Ư퇯ưÀ×Ơ°»½€«ÔƒÁ§‡µ©ÇÁØ×¹ÚÅñÚÔ¥2ßëM¿Đ«ÔÍÓéÚ½µØ¹Ú‹Ç¡È½™‰kß [ïSׯÇĂÁ½­¾Ẳ±»£Ø›È̉É»߈ö¦ôƯÓ ¡Ô½ÅÔ‰¿IĂÙ‚vÛ«‚ ½9·Ø«‡“Íj½ÑĂèê³z½ëæÚúÙ‡ŒƠºmï³2ëÔ È…»»•óÄù×½ÔíÅá=½ôĂËß匿NÿÚˆÔ߈ù×ôê„̃„ªÚ#ÎÅ×Û­€±»í‡ÙŒë*«Ú×ÍĂÄÀ÷Á·ØØ×±»Û«‚ ½9Úª‚ +¼9×¾ơÔ½€—Z¹ÚăºçÚÜÀÿÚÛ«‚ ½9ù×ÇØ߈ÏÔëöù×̉ºå̉ ˜‡ñÖíâ×ù׃ֵØĂȺ¶ÏĹưÿÚ™‰kß [ïSù׃ۛ¾·§D ƒ߈Ë̉ùÓ§ô¨º̃ˆÓÅ™‰kß [ïSÜ·ÔƒvÜ™‰kß [ïSÖ¹"»½¾å̉ χµØ߈ÏÔëÓ‘ơÏÅ«‡“Íjƒ×°¿¹Ú9¥‡§ÆŸô±»‰ÛÙÚ÷Áöܽđщ˜êèä́vơêÇÖÇÖËÇÅØ߈öÚª‚ +¼9ÛÀ»½³È뙉kß [ïSëö9¥‡ơêËÙ÷êÇđ•Ç߈½€ưÀÛ«‚ ½9«‡“ÍjÙ×ăˆŸ;œ‡°»ÏÔ°¿“Ƴ‡ƯƯ¥Æ°»‰¿IăˆŸ;ẲžƠX‹ÇÑĂÛ«‚ ½9»ôƒÖ½̀Ó̀Ê)èÛ8¤Á™‰kß [ïSø×µØ½è›·Å߈·Åˆß߈•ßÄÙ÷‡×¹ÏÔÛ«‚ ½9Ó÷Å ơêưÀœ·̉ ¤0óĂ¼ĂÈ™ÓÙᵇÏÄ9¥‡½Ô¹ÚÅÔ™×â·ÏÅ©‡¥2ßëMg«‡“ÍjçôœÂÓ.‹ÿ§ÙĐÄê³zż̃„ƒvơêá=ÄÓ£G«‡“ÍjĂƠË6ñÓ½„n½߈—ˆµØÂç̉ĂÙ›¶éщª ¨ƒº5ï½µØßÏÛ«‚ ½9ÄØëö¿́­Ö«»­ˆ—»«Îăੇ¥2ßëMƒØơÔé‰ñ5ñ·ăˆŸÙ½̉ÁµØ·Ô£Ø£³­Ä߈¹ÚÍÓ­¾ơêÛ×ôê­¶ëö9¥‡ó´ñÚăạ̀Çå̉ ß»ûöëÚÏ^ívëÓƠó˜‰ +j +̃ + + + +Z +îS +¿‰«Ô¡»âˆ:k™‰kß [ïS½¹Ú·»éŸ¹Ù½Œ₫ͽ¶°» éº÷ÙŸÈñÖƠƯڿŽŒÛÚ›z߈½ÔÛ×ñÚÚª‚ +¼9ù×™‰kß [ïS¡Èå̉ ‡ ÑÄëíÙ¿‰̀ÓlăˆŸ·Ô¡“Ơ¡ÈíêµßƠX÷Úê¼çÚµØË%“Èàö¥›¾µç1ßÄÙœ·̉ ¤0‹Ç¶À¼ÙÚÿ&Û«‚ ½9ívØ-¡Ô·#Ë̉‡$ù×ëö›¾Á¾±»—¶·‡‘×8çù×Û«‚ ½9ùëñ»›ÚÓµƒĂÙ-¹ÚƯÜ‘Óị́çÚă»™‰kß [ïS×Ă™ëéå±»%¯Ÿó˜êè䃈¶áƠƠơá2Ÿ¹ƠŽ߈ăˆŸ;ô±»å×ù×ÍÉưÀ¿‰™‰kß [ïSßÄÙ ÈăˆŸ;k½«‡“Íjô߈™Á­ØƒÍÓùæÎҵØĂÙöÙ½›ÚÁƯÏÅÙÚ•½÷‡æ̉Έ±»ëöÏ̉Ư רçô«‡“Íj›¾ù×¶́–GéÚÄë™HơÔ¡È¥ÈÛ«‚ ½9—ˆÑÓ½°ÛÀ½ĂăˆŸ;ׯ­ÛÑÅǼù×½¶Å½ØŸ}ơÔ½ô³(ß%ƒÖÁµØưÀ¡ÔÁ̉ëöÅÔëö·‡‘×8çó#¡»ÑÅÁåơ꫇“Íj±»ÙÓºŽù×±»ÏÔ߈߈ÏÔù×Û«‚ ½9ÏÅÈ™‰kß [ïSéÓ³”Ó‹Ç­¾çº3«‡“Íj°»ù×ÑÓÛ«‚ ½9ơê‹¿¥ˆ]1ăˆŸëö¾Ÿ»Á½°êØ—ºơꘉ +j +̃ + + + +Z +îS +Ù½³ºó²ÈÚª‚ +¼9ăơĂÙï½óăˆŸ;ơĂ…Ơ»½ß»ûïÚ×$Ôºl—ŒÍƠßÁ“öß»û±”ƒvÚª‚ +¼9ÿ§«ƯÏÅ©ÀéêßÄÙö½ô‡Œ¹Ú¡Ôô¹ÚÍBÖ¾çßÚ«¾Ăôÿ¼ÏÔÁËÏŃv«‡“ÍjªÚ +Ơ·‡‘×8祾Ø×­¾½ÎÅ­´Û«‚ ½9ÍË)éÛ9¥ÅÓÛ“Ơ÷ˆ‹Û™‰kß [ïSªÚ¹¼Ÿ}ß»ûÛÀÁ½™‰kß [ïSׯ‡¿Úª‚ +¼9…ÙƠ¿Á‡xŸÅ½¹­»qÛ«‚ ½9ơÅơêÅÄ»ˆ̃ˆ8¤‡Öˆ½®ĐÓÚ×߈ÿÚ•Èû›̣Ľ‡Ô¹Ơ‡¥ÁăˆŸ;”×ÑÓù×Á”«Ôù¿çôïƠ­Ä߈›Óç®Ï̉̉º§ÓÄôà꿺Á̉Ç̉ÅØ›¡ơêÓ̉¾Ư‰ñÁùיɩqêöÿÚ·§D ¹Ø³Èù׿ƠăˆŸ;kÛÄÓÏÅĂĂ¿‰ëöëöá̃©œ©Ó½èơ꫇“Íj‡₫̣¶Ä–çÚÉ™‡÷ÔĐÄê³ÇÓߧԣ߽€™‰kß [ïSăˆŸ;ß»ûÍÓ÷Áņ½‡¿«‡“ÍjçÚ¡ÛÍË)éÛ9¥µa«·3uUÙ«‡“ÍjØÅꩼ¶èÁƯéÓ“È™‰kß [ïS½ơÄÏÅưÚ8¤‡…ÖÿÚ‡ÛÿÚµaÁÛßÛ«‚ ½9ٽ³ÏÔ¬¾ăÇí‹ÇÍ·߈§„ƒv¿º±¿°ÁµØ‡¹¶­ØÉĂ·‡‘×8ç³Û׫ч۰½ăơ™Ô«Ô‰êù×§ÓÑÄëܶëöƒv±»ăˆŸ;ù×™‰kß [ïSăàƠµù×·Ôơꮉ®0ơê¡È匿N±»ÄăˆÅØñÚ½g‚[ăˆŸ;ÏÄƠè‰1đ511đ1¶1÷ˆÑÓù×˹À¹ĂÙ£Ư÷½ÎÚăêå̉ Û×đ»ÎÅ«‡“ÍjÏÔùæ‡ËÉ9ëӇǰ¾ĂÙ¾߈ÎÅרÓØ½©ØÙÜ߈ÓØ8¤‡×ÑØ½¹ÚûÓÍË)éÛ9¥¥ºÛ«‚ ½9©ù×ĂƠù¿äÁÈ߈™‰kß [ïSơÔËÇÍÓƒˆÍæ¡ÈĂÙé‰ñ5ñ·…ÛûØÿÚù׫º¿³àÿÚñ×9¥‡ñ̃€v$ ‹Ç«‡“ÍjÍʉj̃ZîS·‡‘×8矒߈ÑÓÉ̉Á̉±»±»»Ø/÷Á¡Ô´¼ºóÇ™‰kß [ïS×๥ٽ±»ơÔ½ä̉퇶ؗ¶ÙÚñÖͺÙ÷Ô™ôơÔî²2÷ÁÀçÿ¯¶ëö‘Ú¼£ØÏÔÁĂÓØźĂ½Ă½È—ÓƒvÁ́ÿ¯¶«ƠÏ̉߈¾ưÀÇÖưÀïÏÔ“Èù×ÿ±»ă­¨±°ÁĂͼ±»9¥‡9¥‡Ÿơ$ƒv¡ôê°»ơê¾ÇÖ¯ôÛºψÿÚá èÓ™‰kß [ïSÿÚÏÔ߈çđ߈›¾ÏÔÓØ¹Úª»°½›½Û«‚ ½9ÇŽ‹É0öÉÁĂû(‚vêöÀĂ +™‰kß [ïS¹=·‡‘×8çÏԓǘÓï³2ăˆŸË%¿Ø…Ÿ‡¿±»½̀¬Hơê¿Ưƒ¾‘ơêĐÓ• +›¾ºn™‰kß [ïSÏÅ̃ÄØÇ“™‰kß [ïSÿÚ¿ôßÖÛ«‚ ½9ëö‹ÇÁ¹Ươׯù×™‡߈ƯÓ ăˆŸͺ°» µØ•½å໋ÏÔÅ¡Á‹ßăશ2tTÙŒë*«—¶åĂ«dƒÆµ€ƠơèŰ»ÇØ÷ÁưÀ¹¾Ù‡Ï9…‰Ô½Ö™‡ûÍË)éÛ9¥­văˆŸ;ăˆŸ÷‡¤âÿ±Qư£Ă٭ؓºÙƠăơ™‰kß [ïS½ĂŸ}đÆ«ÔëÓ÷Ú“Ơ±»¼ÁĂ™‰kß [ïS¡ƒvÏßÙŒë*«ù×ăˆŸĂٽཱ»ăˆŸ;‚v¶‡Ö8æ©ÇµØŸÅ«»ăˆŸ;“ºÏԶřԕ%…̃öƒv9¥‡©Èëת‡’̀jƠÅơÔ“ÆÖƱ»ÈƠë ±å9¥‡ǼÏ̉»ô½ŸÅgăà«»ƒvïô¹̃9¥‡©‡¥2ßëM9¥‡cƠXƒÖ‹Üù×ÂÛ«‚ ½9ăˆŸ;Ăđó#éÓ󠿨çÚ¤Û‹È߈å̉ ÷ˆăˆŸæ̉ăˆŸ;ŸÅ‡ñ5™‰kß [ïSµØÙ×ׯщ¿àµØåĂƠÂÙë¼ăˆŸ߈©ˆ·ÔÏÔƒvׯăˆŸ;źëÚ‡½ÙÅ뫇“Íjù×匿NÁ̉Úª‚ +¼9ÈÛ«‚ ½9ăˆŸ·vÛºǺ·‡‘×8ç9¥‡ăˆŸĂĂ ›­±àéMáÚ…Ç퇛¾‹Å¶èÑ„ÛºăˆŸ;ÛÀå̉ «‡“Íj·‡‘×8ç¤Â—ÁæÚ¡ÔỞơÔñÓØÅêó³Èù®Å±á½€½€Á™‰kß [ïSÏÔ£»ÙY߈£́É̉©¼£ƯǺåÁµØÅØ·ÅÁ̉©‡¥2ßëMëöÙŒë*«ăˆŸçÇî²2‡xăˆŸ;½áêÛ×¹Á¬Ö™‰kß [ïSÛ«‚ ½9ÑÄëỞëö•å̉ ơèŻ؃vÙÚ«°ï»«»̃¯¾“¹ƯN³ÆÁ™‰kß [ïS¡È»ØÔX߈ÆÍBÇÏÙ×»½‹ÇĐ|ÙÛº¡Ôù×ăˆŸ™Ó’Ç­½¼í—G§¹½Û«‚ ½9¶ñÓ£ ½æ½ØÿDZ»³Ø±»Û«‚ ½9Çù×ùײȧÔÑõØÛÀ„Úúà¡Ô ÛÄnĂÙç̉ Ëû·Ø‡™‰kß [ïSĂå̉ êöăˆŸ¡Ù‹Ç°¿ÔĂÙÍË)éÛ9¥‚v‡Œ£äÛ«‚ ½9¾¹½€ûÓƯÚùê‡x›Úщ¿øÁƯ¯¼× ©½ŸÅÙ×±»ĐÓâơ³ô·Ó ¥0¼ëÛ«‚ ½9̉ÁY‡ÇéơÛ«‚ ½9˜"™‰kß [ïS·Ó ¥0¾ ™‰kß [ïS¹¡ÔóÔ¾áÛơÔ¥ÁË̉«‡“Íj“ȱ»ÙŒë*«˜êèä÷Á½±º×¾öÿ¯¶ÛÄÓᾘ‰j̃ZîSÏ̉ÁƯ·ÔñÓéºĂÙ±»ăˆŸ;¾ñÙơê™ëéåôéYá ›¶é¤ÛÙ½ù×đÁ…ø ψÏP±»…ÛÍÓûØñ¨¹Ú©ẲÓÍË)éÛ9¥ƒvƠXÛºÚª‚ +¼99¥‡ù׫»ùꛡ¿‰Ơ¿ù×ÏūԽÆï½Ù×߈å̉ ‘Úµ†ëöƠÛ«‚ ½9÷¼›¾Åơ•kß [ïS¡Ô¿ß÷ˆăˆŸ;÷Á¨¼ÏÔŸ»ª ¨ƒº5 ÛÄÓ¾ơÑÓ½ÔÙ×›Ú¶ô·‡‘×8ç釫‡“Íj½™Áù×ÏÅÏÄ«»½€ù×匿N¾Á¾´.¤ÙƠ*³Ư ¬°àèMûù×ñÆĂºùן۫‚ ½9”ƒv¶  °¿Ù½±»âḈ«âăà°»ĂÙôׯùׇº«›™‰kß [ïS™ÔëöÍÄ€º³¼ÏÔÿÚăˆŸ›¶éù×ÂÙ-ưÀù×·Ó ¥0˜‰j̃ZîSƒvú(½ŸÄü¦†Ñ»ÍÓËƠÛéÔÁƯ‹Üð»(©‡¥2ßëMÏÔ¼¿º»ûÏ̉߈ưÛÛ«‚ ½9‡Œ5»ØăˆŸ;Û«‚ ½9¡ÁéêµØÅÔËÇϼƠ¾ÚûƯÿ§ÏŽ9¥‡†Ø̉Å߈ÏÔÑ+ÏÅñÓÏÔơĂ™ëéåÙ½‹ÜÏ̉ơÔ™Áù×ÇÓ¯ôÏÅơÄƠ½÷Ôß»ûù׆ŒÛº©¼ëö±»ÙÚ·̣°»ÍË)éÛ9¥ö·¦D ùꮾĂÙÏÔÛ·Ôƒ½ôÊÇÛ«Ô‡ăˆŸĂÙ8¤‡ÙÚ°»×¼߈åĂǼ߈³ØçÚ‚àÛ«‚ ½9»y߈ÅØ¹Ú›¶é‹Ç8¤‡×Ơ¾öưÀÏÔơꩽ­ÄÓá ÿ¯¶éºßÄÙưÀ‹Ç›¾Ü‡ñ5‡Ú…ŒƠX˜"ê"è"ä"߈À½ù×ăˆŸ;ºăˆŸ;Û«‚ ½9íÆḮvǼºơêÑÓ½§ôêö»ư—Ó5íê¡È·‡‘×8ç÷Áµàó¸ëö“ÆưÀ‰Áö½ƒ½½ØŒê*ª±»ó|óăúر½ơlĂëöÿ¯¶ƒvóêöÙ½“ƠÄô©ØăˆŸÿ¯¶™‰kß [ïSù×ẳơñÑØù×™‰kß [ïSơê±»Ë̉‚vÑØăà·Ôơ|Ơ÷Á¹Ú¹ÚĂºÙ½«‡“ÍjĂÉĂÈÏÔù×±¿â‰ÛÀÈëöç…Ơ‘Úëöù×éÚÛºƠ'ç̣Ú×öÁĐÅÑØßÄÙ‹Çæ½«‡“ÍjÏÔ§ÔăˆŸô™‡¹ÚƠÄï½ó¶Ù½Â‘ÖÏÔùêá ù¿Î•ª¼ùử­Äº¹Ú́ëöÍË)éÛ9¥ÇÖ­¾‹Ç£ÔÅ1ÁƯ»ˆëöײ®Ü¶Ôí꫇“Íj½¡Û±ñĂ¹•ǶÔöùëÙŒë*«±»ÿ×ơê¥Öá=©‡¥2ßëM­|ăàå¼ ƒvöÁר“ƠéêđÖË¿ơêØŒê*ª³µ¼±»ă௃ßͯ¥'=U#QK¯Âƒ×¯G‹ø‹ÜÍË)éÛ9¥¿‰÷‡ÛÀ·ÔưÚù×ëöÿڽ؂¬ÄËÉ9Ÿ»±¿9¥‡×›¾½ÿÚ½Úª‚ +¼9é‰ñ5ñ·Ù»©È½ÔÜÓ ™‰kß [ïS̀«Ô˜êèäïâŽø×³ñÙÚ߈ÏÔ¡Ơ›¡™ÁÅô¥ˆ]1óÂÛ«‚ ½9ơê§ÓéêÏ̉«‡“ÍjÛ«‚ ½9ĂÙà× ÅÓÑÓ™‹Ó©Ø®¼³߈íÖÙÓ³ÑĂ߈ÏÔưÀù×·‡‘×8çÚª‚ +¼9ø×‡ºÏ̉éç½ù×½»ôºÁ¥ˆ]1ÿ׃v„¢­ơÄ‚v½…Œ¹´Å­Å«‡“ÍjÛÚçÚƒÖĂ½ăˆŸăˆŸ«Ô…Œ…¾Áèô­¿Ÿ’ÏÅñÓ—ŒưÀÂÏÄ¥Ó½“Ơù×¹ÚăˆŸ;óÇ™‰kß [ïS·ØÛ×÷Á™Ó±»ăˆŸ;ơêß„óÂñÓçmÁ¹ùëÛ«‚ ½9ÏÔ߈»é꿹ë‡ă»¯××ÓóÂ¥ƯÎæÏÔÅÔ±»ưÀÏÔăˆŸ;ƒà¡Ó©ÓĂÙ½€ß½™Ô«»…¾Á̉ĂÈŸÅÏÔÛ×ÏÔùêù×Ѷ©‡¥2ßëMÛ«‚ ½9¹Úù׫·3uU߈¼ë¹ç¡ÛæƠÑÓ¡ÔßÁÏĹÚ÷ÁÛ«‚ ½9Ở߈©Çö·‡‘×8ç•ǩǰ»‹Ç¹ÚưÀù×ÁÑÓ§Ôù׿‰±»€ƠùêÓÅÿÚ§ÔÁ™‰kß [ïSá$¢äëö‹ÙÇųLjÙÚÓºÚª‚ +¼9ëöï»ÍË)éÛ9¥³¹…»±¿ÉßÁ”»ƯÓ ñÚÅØù×›Û—»“Ơå̉ ÙŒë*«‹ăù×רñÆÏÔĂÙ¾ñÖûƠá̉éê½€©¼½ëöÛ×½ĂưÚù¾÷ÁÑĂȯ×áÁÓÓæÚ§Ó₫¼¾ºÙÚƒvÓ̃™‰kß [ïS¼ívØá ù×ÿ¯¶ÍùצÓå̉ „ô ¹Ú¹ÓÓ‹ß—¶óÂẸ̈ù×ÏÅ—Ó˹Å»ª ¨ƒº5ÁĂÏÅ•%Ÿ}¬ÖËÇ­‡̃ˆÛ«‚ ½9¹ÚñÓ•Ü«Ú˿۫‚ ½9‡b³ÈëÔơê±»ƒˆÍǛڽ°ÈÛ«‚ ½9ívù×¼ƒv±¿Ë¹Ú·‡‘×8çÛ«‚ ½9߈Ó”ͽË̉Û×ÇÛ«‚ ½9Âö¿‰´Îù×¾ù×Û«‚ ½9¾ßăˆŸÙ½ËÉ9™‡ëö·‡‘×8çºÑÓơêöơǾâê»ùêÅØÓÅ₫®¶ËÉ9ªÚĂ ¿ß÷Ú“ƠëöÂÙưÀ“½µØ×Ơ¸»÷Áâˆ́vµØ›¶éăˆŸ;ö¹½́ƇŒÿÚăăˆŸ;½»ívºÛ«‚ ½9ñÚ•×Û«‚ ½9Ï̉ĂÙ«ö§ƠíêÛ׿ßƯ˜Ó ‹›æÛ«‚ ½9ÖÆăˆŸ;·Ô÷Ú‡±»ºÉ̃ˆ™‹•º…ôôê߈åÁå»ĂÈÿÚ¹!Ăº±¿ñÆÄÔơ$ñÓщ9¥‡Óº‰y«Ñ™‰kß [ïSùש¼ĂªÚÙ½«öù×½€ÇÖÏ̉«ÚăˆŸ;k¹Ú‡Ç¾û™‰kß [ïSÏĕ«‡“Íj¡È÷܆»ÑÓµ†ùתÚ2ª‡’̀jĂÙÙ܇9ăˆŸ;káƠÁƯ±»ĂÈ…ô­€™ÔÅÙׯ8¤‡Ơ í–Gÿ$ëöưÀ¯G‹ø‹Ç­ÔÙ×ëÔ‡º§Ôÿܤˆ\0¡+ù×ù׿‰Û«‚ ½9̃ˆÇ÷¹ÚÊ٣䉿IñÚ½—Ó«‡“Íj‰¿IµØ«‡“Íj¦Ù×Ö$ÎÔ½˜‰j̃ZîS¡ÛÏ̉½½ŒûÓ™ơ߈߈Óº8¤‡ÖµØ­ÖÛ«‚ ½9ưÀ±»ù×£»ù×8¤‡ßÏÎÅû!‡×«‡“Íj¹Úö÷ÁƯºù‘ƒĂÍË)éÛ9¥ؽ óÂÎÅå¼ ăÇíù×™Ô™‡ÍË)éÛ9¥ûºăˆŸ§ÓÁñĂƠÑÄëù×­ñßÖù×±ê÷Ú§Ó¶ƒ»³£ÇºĐūԽ½€ÁÓ½€߈¹ÁƒØÏÅø×—¶©)±‹»‡©)óÇ¡»ËÉ9½ŒÁ½ר̣sµØáƠǺº£»™ëéåăˆŸ ƠÙÅë¡h‰¿IÙ½ßÁ˜ÁíÚ›¾«‡“Íj¹Ú–¿›«‡“Íj¦Ôù×—ÓÖƠæÚóÂơèÅô¹À¹ÚÛ«‚ ½9Âź߈á¾ëÚÙ×ÊÖ¥Ó·‡‘×8çơèÅÁ̉çÚå̉ óǾóâ±»ƒψ«‡“Íj»ØăàÛ×°½Ởëö¨Ø­]߈ßÚÙ±ÁËÉ9ùדׇ9©ÓÙ½ƠÑÓ÷ÁăĂ3Û«‚ ½9«ºÏ߈ơê±»µ×ù¿ÎÔ§½ÑĂ߈ù׭ȤÛùæ½±»½ôÚª‚ +¼9¾›Úƒv‡ºƒßÖڷŃˆÍƠå̉ ăàơèÅå̉ ÿÂׯƯ†ªĐ…ÖÆăˆŸÛ½½çÚßÁ¾‚ØíÆÑÄë½Ó:®Gø‹Ù¾Ž±»©&âÁá »§߈»yƒv­Ûă‘·¥ˆ]1‡×ăˆŸ;k¿̣ù×¾¿‰ĐÓøêÁƯ—¶ç®®Gø‡ÚƠÛ«‚ ½9Û«‚ ½9‰ÖĂĂ ›­±àéMÏÔ¾ÇÖ¡Û(—»¼ĂåĂÿ×ó)½Û«‚ ½9½ŸÁ™‰kß [ïSº©À£ä‡ÇăàĂôÓ×I›¾±»ßÖêÚăˆŸ;÷Á©‡¥2ßëMÁñÓÛ×ù×ÏÔŸ}™‰kß [ïSĂù×™‰kß [ïSíê­ÖÏÔÚª‚ +¼9÷‡çmÙ×ÏÔÛ×—¶åǺö¶ÿ¯¶ÇÖÍË)éÛ9¥œ‰¾I÷Á¯ÈƒvÏÔÏÅÆĂÏÔ©Üëñëöÿ¯¶χ›Ú÷‡ƒƒv’ÇÀƯ•ÊưÀăÚåÁƒÔÓØù׃„à—»ß»ûŸ\ÁĂ¡%ùơ¯¼ăˆŸ;kÛ«‚ ½9Û×퇽ª»Ửó|Ë ¯ÜÙ½«‡“ÍjÍË)éÛ9¥ù×·‹©Ó½€߈ÍË)éÛ9¥‡ºéơר½“°Ăùט‡Ù½±Èö»ˆ©ƠÅØù×—¶«‡“ÍjăˆŸ;Û«‚ ½9ưÁøê«‡“ÍjëöÇÖÙÚÙÚé/™‰kß [ïSÑÄëÏÔ9¥‡×ăÇíÅÔÛ׳àù×½«ÔƒØ߈ÿÚ™Ô÷ÚíÖ™ôﻓÈù×ÏÔ÷ß߈µaôëöĂăˆŸ;ăˆŸ©‡¥2ßëM›ÚµÜ™‰kß [ïS·ÔưÀĂÙæØÙ½÷Á…Ö«‡“ÍjÛ«‚ ½9¾ª»«‡“ÍjƒvŽ­ÄäơăˆŸ;—¶ºù×ëö“Çí½é꫇“Íj½€߈ĂÙăàÛÀÙ×߈›¶é㻫ԙ‡©‡¥2ßëM¾ôÀ¹á ÓÆ…ØỞ9¥‡ăà‡ŒÖÆ³ºóÇÖ±»ù×íºÁÇח¶ÁƯ©ÓƯÀņÙÚ¯à¹̃öÛ»÷›¶é‰¿IÁĂÅĉÆÛ׽؇ºçºăˆŸçô¹Ú”Èú™‰kß [ïSÜÓ ƒ‚v“ÍăˆŸ;ăˆŸ;•Èû›Ăºƒ¾‘ưÁ•Œéê߈₫‡‹ÜÄÁƯă½›¾Ăƒ½ÏÔ­½¼€¾߈¶ô ƠÇŒ±»ăˆŸơĂïăăˆŸ;kéºĂºăˆŸµØ‹Çƒˆ­vÅØÛ«‚ ½9¨Çù×°»߈ă਌,Ơ˯‹ÇÁƯ±»­Äơ‡8¤‡9¥‡ù׫‡“Íj°»ïÚ™‰kß [ïSË̉á °»…ƠưÀ©‡¥2ßëMÏÔÙü‡°ø1Û×ׯöÁ¢äºÓ%ÍË)éÛ9¥›¶éµØÛÚÏÔÙÚÛ׿ØÏÔ‡ºÅ·ÏÄỂßÄÙó«ѡۛ¶éÁ|ÚÀŸƠ»~ÿ&ƠÁ‡é/×:¡ÈÿÚơÔăˆŸ;k‹Ç­¾½Á‡é/×:±½Ù½ÑÓ˳·Å½€ï½Û«‚ ½9÷‡Ḉ–Gç̉‡9›¾ƯÓ ©Ø¡»à¬ï³2ÓÚÚª‚ +¼9ÙÚ«Ôø×™‰kß [ïS°»—Ó³Èï½­Ö—¶ù×÷ÁÛ«‚ ½9ăơÿ¯¶á=™‰kß [ïS—Ó¡ÈéºÇÙ×ơÄ÷‡» ëö9¥‡ăî—¶ƯÓ —¶î²2ºÁƯáêăˆŸ;—»Åđ÷ÚŽ³ºó«‡“ÍjµØ™‰kß [ïSăˆŸíÖÓÓÔ©¼Û«‚ ½9ăˆŸ;©&ù×ÄôăƠÎPº£÷˜‰j̃ZîS¿‰Ơơ꫇“Íjù×ß»ûç®§ÆǼưÀăˆŸá ̀ÇưÀ£Ø™×™‰kß [ïSéÓÛÆ‘ÆÏŽ€©¢°½¿Åº½«Ô©¼¥ˆ]1ív±»¶GG¥Ø­¶™ÔơÔå̉ ›½ưÀöÁ«‡“Íj߈ñÁ¿‰¹Úƒàß»ûÙÜ£»ÅÿÚÛ«‚ ½9ƒˆ„öË¿™‡9¥‡‡¾³́vÛ×ñÆ˹ Èƒ¾‘‹ÙÅÔÑÓívưÅ̀Ê)èÛ8¤ă«ÔÁ½ÙÅ뛾ÙÚÿ¯¶χ§ôŒ¾ÑÄ뻽̉º´ÀÅàëöưe߈³Æ™Ô‚ ñđ¼¾·̣ŸÖ¿¹·ºƒv»‹³ºóÛ«‚ ½9¸½ôăÄÚª‚ +¼9±»÷‡¦ÓÀÛ¡á­›ăëö‚vÑÓÛ«‚ ½9£äÛ«‚ ½9ưÀ„¢­Û«‚ ½9ÍÓÙ½«ÔĂÙ§ôƠÚ“Ơ©¼µØăÂăˆŸ;k…‚½Íӣث·3uUƹڱ‡©ÓÓÆ±»ÿ¯¶™ơ±»›¾½½€øêƒÔ§Ôù×ơêçÚÛÚĂÙÑÓ‡xóÇ™‰kß [ïSù×Û«‚ ½9—Ó̀ÇÙׯ_½Û«‚ ½9•È©‡¥2ßëMÛ«‚ ½9»Đ©/ÍÓÏ̉•×ÏÔ“Æ}©‡¥2ßëMÑØ³ØƠXăàƒ¾‘ËÖù×µ†¡ÁÏ̉¯à߈Ư}ăàßơù¿Ë̉†º£ƯÅœ‡ßÁÛ«‚ ½9Ưºù‡߈ÖkÔ†k6k¦jk›Û£Ø£ÇÙ½ÑsƯ¡Ó•ïÀͪ“ÆÙÅ때§Ó¨À³°¿ï½¿ÑÓäƠÁ˱̉¹Ú­Äù¨Ÿ\ÑĂĂ¼÷Á߈·ºéÿ‘Ù±¿Û«‚ ½9Ơ‚v®£ä‰¼†º˜‰j̃ZîS“ºéÓ•×›%å̉ °¿™ÜÇÖÑÓăˆŸ;kßÏ÷ˆIơºăˆŸ;kËÇ«‡“Íj̃ˆŒ₫«‡“ÍjÏÔăˆŸ;ĂÖßÄÙÿ܇ÇÙ½Ë%ăˆŸ;Œ‰°6Ù½ÍË)éÛ9¥«Ô«ºÏÅ߈«‡“ÍjÏÔÙÚơêëöíêÍË)éÛ9¥̀8ƽÍƠùê÷Á›¾œ‰¾Iö²₫®¶óÔÛ×Ơ‰¿Iƒvê~éÓ€º…ÛăˆŸ;Á‡é/×:Óº¤ĂÉÙ½ñÆé¼ëöÓµÙÚº§ôñÄØŒê*ªŸéÿ¼€º™‰kß [ïS½óÔ¡ÜÿÚ÷ˆ«Ô…¹ÚƯ‰©‡¥2ßëMƒv»Ăù¾¹8Û«‚ ½9¹Ú­ÄÁ»ˆ·Å“ÆơG¾€ºÛ«‚ ½9ĂÙŸ}—»ÍÓÇ/ÏÔƒˆù׃vÛ«‚ ½9íÆ¦¹Ï̉ơÔÇĂ·‡‘×8çă½ù×…™‰kß [ïS¦ÆÍË)éÛ9¥ù×÷ˆÂÙÚñÓăˆŸî¶Á…Ö߈ÓÁăơ«Ô·‡‘×8çÛ«‚ ½9Á¹—Óß»û¥߈ŸÈ߈ĂÙÇÖ¹ÁáêưÀ“¼ă ƒvĂÈ·‡‘×8ç·‡‘×8çăˆŸ;k߈é‰ñ5ñ·÷Úư“ǼăˆŸ;çÚëö×µØÂÎÚ·̃âÁ÷$ĂÈư‡±ù1ƒÚ…ÛÛ«‚ ½9Á ±»Û«‚ ½9¸Ú¹Úá¾ôø×‹Ç­ô‡ׯĐØçÚÇăöÁƒˆơèÅ÷‡­ÄÅÓă‹»Á÷ÙË%Ù·ØÓØÏÔÏÔï²2ù×—¶߈ÏÔ¹ÅÏÔÅ›¶éù×½ƒÅú Å–ñÆϼшưÀÛ«‚ ½9χ«‡“Íj‡×£äٽ߾³ăˆŸ;ëöÚª‚ +¼9«‡“ÍjçÚ±¿å̉ —ŒåŒ¿N—ˆÅ»¼«‡“Íjµ˜߈ƠÓ­ÄÛÇ¡ÛщăˆŸ;ÙƠÅØÛßí½½íÄ›¾øêÏÔÏÔ¶ôùơÉÏÔö߈ï³2₫ÛăàưÀûØéºơÔ¯¾ùê½›DơâÅÔô»ÏÅ™qù׷řԹڱ½ûÓĂ½€ù×—»Ï̉ÏÔƯÓ ×¾€%øp·‡‘×8çơèÅ™‰kß [ïSăˆŸ;Ëq߈߈¿‰Û«‚ ½9ăˆŸÙ½ÍƠ‡º‘ׯ̃ˆÙ½çÚùº—ˆ™‰kß [ïSáƠÇÛßÄÙÛ×ßÁᙇ̉Å +‹ÜƯ×̃ˆÏÅá %ÑÓ ËûÙŒë*«ƒÁÛăˆŸ;k¥ÄµØá꿉©¼ăˆŸ;k³ÇñÓÿÚăˆŸ;Á|ûƠÑÓÍË)éÛ9¥ÅÁÛ«‚ ½9›¾÷‡‚ˆ³ÆƒvÏÅñÓ߈ƠX›ûßÁÆ—»ûÓ®ÈßÄÙÆ̉¥“¹ƯNöÔÁƯă½Ǻ麳ۺÏÁ•)̀Ê)èÛ8¤ÿÚº¼ƠXÁ˜‹߈Ú×ñÖ‹æ9¥‡êÖ3ƒv§Æƒv©Ç¤Æƒv‰¿IؽÍÄ߈”Èúäô‹Ü™‡ĂÙÏÔÏ̉Ó¨¼ƒˆ«‡“Íj9¥‡÷ÚÁ̉¢ ÇĂ·º¡È‹ÜÛ«‚ ½9“âÏÔ˜̣éÚÛ«‚ ½9•Œ™ëéå«»ÂÙµ†àÓܹÚÏŇÚ߈×¾ăˆŸ¿߈½ÑÓëö½ÓçôÛ«‚ ½9³ëößü±»±»çÚ„Øñ§Ô³ÈÏÔƠX¡Á“ƠϼăˆŸá=ç·ÅÁ±÷Á·ÔƒvƒvÙÚë̉ƒvÁÓ󼁯·Ô·‡‘×8穇¥2ßëMăˆŸ;±»Æ̉®¾÷‡9¥‡ËÖÇÓ€°½‡º»ÁÏőƇdzȘ‰j̃ZîSŹÁ™‡ÿ¯¶™‰kß [ïS«»́ơÙÚôú ívÂÆ2ÛºăˆŸ;«óăˆŸµØ…Œ¡ÈÛ«‚ ½9ù×›¾ÛדÈÁ½¡Èá¬Ư‰­¾½•Œ߈«‡“Íj‹Çơêÿ¯¶÷Ù¶‡Ö8æ¡ÁŸÅ·‡‘×8ç™Ø«‡“ÍjóùÛºô¡ÔŸàÏÔ™‡ă}κëöͽº߈«ÔôÛ׫‡“ÍjÏ̉ÏÅö½ø¿çÚóÂÁʳôÎÄăˆŸ;¾ĂȃvÛ«‚ ½9Ơר¾~…Ö˜‰ j ̃    Z îS «‡“ÍjÙÚí—Gö°½±¿ñÓÅØïƠ«»Á×µđ±é—»ù×£äçÔ¡߈ÛÆ£»«‡“ÍjµØ‹Üχºß„ø×‰4ùׇñ5áê±»À +©ÙÚǼùê¹ö¼“Ƶ!‡Ûñ«‡“Íj©ÀôĂ¼ÏÔ“¼ăˆŸ;™‰kß [ïS³Ó¤Óºøù׵ؕ%¶n×Ă‚vçÚù×·Åêö“ÈÉ̃ƒ¸ÚëöÑ·ÀỰ¶Î̉Ö$·Ó ¥0½½Ǻ›¶éƠÜ›¾™Ø÷ˆóÇơèÅĂÙ—»ăˆŸ½€»Ó±»YÛ×½ûăˆŸ߈¹à³íÚ߈Ù½‹Ü©‡¥2ßëM¯È±»ñÚíÖÏÔĂٿ߯ÈĂƠ·̃¹ÁåĂÙ·ØĐĂù×Û«‚ ½9áØ±»ăơ9¥‡í‡«ÑùשÜĐĂ£Ç©Ç±»½á¾É̉«‡“ÍjăˆŸ;ÄÀíØưÀ9¥‡ăˆŸ;¥Ó«ỘÔ—¶øê«‡“Íj󶂈ÑÄëÛDZ»ƒv¸ÚăˆŸ;́v¥‰ÍL…¿‰‘ÚƠX¹ÚÙÅëù×9¥‡ÇÖÛ«‚ ½9匿NÙ½ÏÔÿ¯¶‚Ö—»‡Ûï½ù×·‡‘×8çƒÖ¯È¹Ú±”ÙÓÙÚ¡Ôù×µÜá 纙‰kß [ïSáöÙÚ́v«‡“ÍjÛÚă꫇“Íj³È…ш±»±»ÏÅñÆ÷ÚºßÄÙưÚºöăˆŸ;ËDZ»ÑÀơêñÚ®GøÛ«‚ ½9ßÁ߈ơêưÀ£äéêר½å̉ —¿áƠÅØ™‰kß [ïS½„ôơêÙÓûÓ˜‡ôÉÏÔÑæ™Ó½ÅÅÁù×›¡µØè‡×¿8‹Ù‚v¬¾ôêÖ¾8ơÔ¡×ÓµØÏÅ¥ˆ]1³°»ÅÓ8¤‡ÎÅùׇLJñ5·‡‘×8çơĂñôÑæïá£Çù×߈Ư‰«‡“Íj™‰kß [ïSçÚ߈¿‰©“Ʊ»ÛÀÛ«‚ ½9…Ï̉‚Ø©¼Y»Ø«ÔÏÔëö·‡‘×8çơÔ£Øÿ›ăêáê›¶éƯÓ ©‡¥2ßëM˜ÚƒvëË™Ó ½öÛºôćÇÏÔ÷‡å¿ï»±»§á¤ĂƠ°¿¸Ú—¾«ÔÑÄëgëö߈ư“«‡“ÍjÛ×½{«‡“ÍjÏ̉«»›Ô«Ô…Ö™$ᓼ‡™½€«ÚÏű»êö߈ăºƠÁĂÈ»qĂ¼”ÈúĂÑÓÿÚ½¡ÔϹ»Å¹Úù×ÿ¯¶›¾•Û²¾̀ÓĂ蘇‡ƯÓ ëöĂÙ™‰kß [ïSïô߈©ÇÙ̉ŸÈ½™‰kß [ïSÓÆăˆŸ°»±»·ÔôéÚ«‡“Íj›Ú±»©Ç»ß߈ù×߈óÔ¹Áùêù×›Ûщ¸àöÁœ‰¾IÅÔ·ÔăˆŸ;kÑ·£Xơê߈±¥ØÍÇ«‡“Íj̣ĂÂèËÉ9ĂăˆŸ;ơêù×±»ÑÓϲƠº½¹Úö‰íƒˆ½™×ÂÓ½ƒÖ¾±»׺½Ø‚¹¼¥ˆ]1Ă¼ˆù¾‹Ç߈ÙÚ×ÜÙÚÚ×86¤‡6ÖỞ«‡“ÍjÛÄÓºå¼ ©ơú¦Èư¬“ÈÏăث‡“Íj³(½£äéê³È«»è¼¾½Ô«‡“ÍjèÓ·§D Ù×ĂÙר£Üö߈¸Úçä±»ÇÖ‘÷ơèÅî²2́v·ÅÀù×ù×Û«‚ ½9—¶ôêöûº“º·ÔÿÚÙÚ±»ÏŇÚÿ¯¶«™ơèÅáêéØÏ¿Û«‚ ½9Ù½ùêô߈«‡“Íj÷ÚÁĂ¾«Ôű»•º‡Ç¢ÈơĂßÏ—Œç߈ϵØχ9¥‡°¿ơêׯ³ñ÷ÅÁƒv‰¿IñÓÿÛƒv‚¾ÿÛÙ×߈ăÇíÏÅÁË‹ÇÑÄëé‰ñ5ñ·Û«‚ ½9©ÓƒvÏÔénƯÓ ĂÙ9¥‡ơÔ€º¿ô×ܽÔù5߈±̉”ŒĂÙÙƠ×¾§ÈÖ̉ăơ™Ăöä5̉™‡·ÅÖÆŸÄ—»‚v·ÔµØÅ–ñ¨ăê«·3uUơêñÁ»ĂëÓÿ§÷ÁÙ½Ÿ¿™‰kß [ïS¢ÈƒˆëöûôƒˆĐÓëöщƯ‰щƒÁ̉Ă¼ß»û©ÇƒƯƒÄăˆŸÁĂ£ØçÚ¿ǺÅ ½³ºó¡ÔÛ«‚ ½9¡êö¯̉™‰kß [ïS9¥‡µaÏÔ½ô¿‰±»Ϲ«‡“ÍjÓº‚ˆ ·‡‘×8籿ĂÈ«ÔÙ½…ê¨Ç2ÿ¯¶å̉ ½óíÖø×˜‰j̃ZîSÇ»åºçµ³ºó™Û‡Ú¾ơÄ÷Ú̉ÅƠ•‡º•ù×ưÁ¡È¨ĂÏÔ™‰kß [ïS¡Û±»™‰kß [ïSá Û«‚ ½9Ù̉đ»öä̉ó¡Û£ä¡¯¼±»¿ß¥‰ÍL…‘ơĐÓëööܘ‰j̃ZîS¦ØƒváÛùơ°»¬Ä±»»´ÑÓ«‡“ÍjăˆŸ;èÓ›ÚÀÓûØù׺«‡“Íj±»̉ÅëÔĂÙëö¡÷Ơ‡º§âºŸÜûÙ–¶ăˆŸƒvÈÏÅÉ6ƒv£ä“Ç™ôÎÅUù×êö›¾ÛÄÓ™‰kß [ïS×ܱ»¶§â¿ôƒvï»Ó‚ëöÛ«‚ ½9ÄÜăˆŸ;óÂơèÅÓ‡“’ØăˆŸ™‰kß [ïSÛ«‚ ½9çÚÙ½¬¶éº™‰kß [ïSÉÊ™‰kß [ïS¿‰ÅơÔ±»ÀË—Œ«Œ×ƠÏÅ©¼ÿ¯¶ªÚÏÔ«‡“Íjù×ßÄÙÏÔ‹Ù±»ɇÛ«‚ ½9ù×̃ÄØÍÀ˜‰j̃ZîSºyÆ™‰kß [ïS°»—Øù×ÅØë׿ŧÆÛ«‚ ½9¿»Ởåàï0‹ÙÍË)éÛ9¥Ûœª‡’̀jµØÔXY—ÓÇÓÆù×Ù½Û×÷Á±»†× ¹½›çÛºÁ‡é/×:ơÄÍÇơê߈±»ÑØÿÚ«Ô߈«·3uU«‡“Íj·Ô«àíÁÛ·§D §í‡ÛÄÓÅØ€Ơ÷Áé‡ëöÏÔ¥ˆ]1ª¼ô·ÅƠ߈§ÓưÛר«‡“ÍjÅưÀéÚù×Ăï›YƯ˜ùë±»½8¤‡×“ +ŸÅöÁĂ߈ƒv½€ËÅ™ÔÛ×߈vÁƯÿ‡µØ„ƠÁ¼ÿÚÙ½£Đ±»Û½­Æ³Ø–ˆï»ñÓ‹Ü‘̃ÏÔ˜êèä¥Û̃Œ Ú, ¿ÅßÄÙ÷‡ëØö9¥‡“È›ºÙ½ÛÀưÀ¬Ö«‡“Íjù×ơèÅÛ«‚ ½9Ó¼¹Ú«»½ñÖƯÓ —ưÀß»û¯×ÅØ™Áù׆Úó¡ÁÓÅơêư“ÍÓ¨ØăˆŸÛ«‚ ½9·ư“Ơ‡ºË̉«‡“Íjëö£äưº¹ÚûÓ߈߈åû´„Ç‚ăî·Ó ¥0¤Ûåàù×í¦½»‹ÇÎԵ؛¾öÆ̉—ÓÍË)éÛ9¥£ØÅ%Ăè–Ó›¾߈ª‡’̀j‰¿I×ƠÔơăºø×§ô9¥‡™ÓßÁé‰ñ5ñ·߈Ù½Á̃«‡“Íjµ†ÿÚå̉ ©Ü£»ÑÅåĂ«‡“Íj³Ø·Ô€Ç½µ.¥ÙÛ~ôéù׳Â9¥‡×ÛÅ«dÿ±ÜÛ«‚ ½9©Ơ£Ç©ØÅØåôßÄÙÛ‡Ñ×Ở¯ÔáÓ»(¿à±»Ñæ…£­ÏÔÏ̉µØå»Û«‚ ½9«ªº‡Ú±¿¯¾ÏÔ‚Ö ¹Úö«»“ơê—¶·ÅÙwù¾ơ؇Œ§‹™‰kß [ïSăˆŸ¶èŸ}¶ÙÓ«äÍÓºỞÍB½©¼߈©"éºÑÓñÓåÁØ ‹ÜÙ½«‡“Íjá ¾é‡ÏÅ…Ơ±»Ởëö¡Ô—»ÍĂµØ¡ÈöÁÅ®8¤‡×ªÈĂÙ™‰kß [ïS¡ơèÅÓ£»̃ˆ9¥‡‰ÔĂºÛ«‚ ½9ÿ§÷‡Ù×ôĂăˆŸ;k¹ÚÛ«‚ ½9‡Ú…Ù™ôå̉ ưÀăˆŸ;Ư ‹Ç‚vçÚ±»›¹·‡‘×8çë¼Ă£8¤‡³”ÏÔÛ«‚ ½9©Óëö‚Ú߈9¥‡µØÛ«‚ ½9Û×Ù×9¥‡ÏÔÏÔ߈ÇÖÏçÚ™ëéå¿ßóÓáÛщ¨‡¤2€̃êL÷ÙÙÚăơ«‡“Íjî»áêçÚÜ’¹ÜN9¥‡‰¿I³ØƒvĂ»Èß–­ÚÇĂ©‡¥2ßëM™‡±»™‡ă½™‰kß [ïSïƠñ¹ÁÍË)éÛ9¥³Âñ»ÏÔ¶Ô›¾«‡“Íj½Û«‚ ½9½fâ½±»ÏÔù×ö»Áô߈»ÎĐÓâơơêưẠ̀Ô麭ÄϹŽ™ô…ö»̉ÑÓ“Ơ¡»¬Ä»ùê9¥‡đŸë±¿£ôưÀ™‡á=á~ÿu£Ø‹ăù×Úí—G˜êèäUÛ«‚ ½9¡hôêׯé€ä}ƒv߈ÅØÈ“Æ÷ÁÛÚ÷$ù껇©Àơ½ÍÓ±»ơé§Ó±ó“ƠÄÔƒˆ¦ÆÁƒÖơꙉkß [ïSÙ×Ù×ÑØñÓưÀ̀ĂÙ½ơêÓØÙÚ‡“©Ø¸ÚƯÚĂÙƠ‰‰¿IÏÔ¯égŸÖ©Ç»yéê¼ÈØÓùåÙÚï»ÀĂ™‚²Ơ¡ÔÁÛ̀B·Å±»¼ơê·Å³à—Ûø×˜êèäÆÅĂĂ ›­±àéM±¿ù¿©¼·‡‘×8çúÙÚù×Ñ·­Ä»ĂÙĂÙƠºmûƠ½›¶éßƯÅÔ»ă¿ßÛ×ăà¯G‹ø«‡“ÍjÙ½…Ơá ĂÙËÓ§Ô£í¯ÈëÓ¯È9¥‡…Œù×±½̃ơ½™‰kß [ïS߈«‡“ÍjơĂºÁ½çÚăv›‡âĂÈÏÅƯơù噉kß [ïS‘®£È™‰kß [ïSÏŇºü‡°ø1ÅØ‡ÙÚ߈ÓĐÿŒéê₫߈ÏÔÏԯ׃vưÀ™‰kß [ïS©¼·‡‘×8ç¿߈«Û¿Ø‹ÜŤˆ +\ +0 +Ù×Ë¿»ÈÇÖ‹Ü ËûơêƠ±…öù×ư“¡ÇÛ«‚ ½9½ô÷‡¾ÇÚª‚ +¼9Û«‚ ½9ÿÚăˆŸ;kÑÓâàœ·̉ ¤0Ô¾F±»·‡‘×8çƯÚ¡ÈĂÙ±»Ѷ±»ơÔ¿‰»ÛöçÚßÁÍәǙ‰kß [ïS¡ÔóÇ߈䌾N¶èËÓçÚ“ +ÛףعÁçºÓ¡ÛªÔëÔ»ˆụ̀gº×¾×¾ï½ï»çÚ±»ñÖÛ«‚ ½9¡»ç̉³zÛ«‚ ½9ĐØ±|¾Å­Ø™‡¹Ú‡ºơêÛ«‚ ½9¸ÚÛ«‚ ½9gù×ÁÏÔ§Ô9¥‡»ô‡xă½ƒvù‘ÆÔ‹ÈÑÄëóóÇç̉±½áꙇ¡ÔÅØƒĂ«‡“ÍjÑÄëщ匿NƠºÑÄëƒv¿ÅÙ½Û×ưø½Ôª‡’̀j±»ùº‡ïœ‰¾I±»¹ÚׯßÖÙŒë*«½Ă™‰kß [ïS»ˆÇ̉™‡ØŒê*ªËÉ9ƠÅÛ«‚ ½9Ù˜‰j̃ZîSäñ«»÷Á­ÔéÓºyëöϹù×Úª‚ +¼9Yù×ư“í(—¾¹ÚºíƱ»™‰kß [ïSÛ«‚ ½9™‰kß [ïSñăƯÑ;½‡›¡ù×ۈǻ¡Á¡Á÷‡߈ëöëö˜êè䫇“Íjơؾ™ïÚ“Ç£»½ºñÚ¹Ú§Ô°»öÙ½ăˆŸ·‡‘×8ç…ÖÚ ª ‚  + ¼9 Û£»Ïʉ(j(̃((((Z(îS(ߌÛ,Û«‚ ½9˜‹½¾‡ÆèóA‚)‹îÅçºăˆŸÏÅ·ÔµØÅÓÍË)éÛ9¥±»éºï½˜‰j̃ZîS¿»ÏÔ×ÓÙ½ñÖêöÙ̉‰ßÙ½₫ÚÛÆÙ×™‰kß [ïS…%¿ÅëÔ›¾ÁƯ˜‰j̃ZîSăˆŸ;­¾ÅÔóăˆŸ;k‡ÇÎ̉ªØÿÚŸ}ßÄÙÿ¯¶«‡“ÍjÏÅ›¾—»½̉ºỔƠ%÷ÁăˆŸÊÈ9°»˜ÁÏ̉—¶ăˆŸ;«»ÏÔÍĵصĂù׆Çë¼½óÇÑÄëÑӤȇŒ¥ÇóÔÙÓçôÑØ§ç‘ƹ˜‰j̃ZîS÷‡ÛÄÓ¼™‰kß [ïS÷¾¹›¥ÅÓ©¼±»›;»Å߈™‰kß [ïS™‰kß [ïSºØ…Ú«)ù×å̉ ÿ–¶—»ơÄ/ßÉăˆŸ¹½Ï̉¢äêÚÍË)éÛ9¥ϺƯÀÏԣǣ؄Âù׫‡“ÍjóĂ»ô—¾§Ó߈߈öù×Ù½„؃váêÙ½ùוÈû›£–߈ëöưÀ́ơñÓ¹«‡“Íj¿‰µØ·v£Ưëög¿́߈Û«‚ ½9߈቙‰kß [ïSÿ¯¶ª‡’̀jƒvñÚưÀÛ«‚ ½9ơêñÓ’½ăˆŸ;ùØâ»ăˆŸ½©‡¥2ßëM̃ˆ¾½ñíÈ¿‰½¿ôÙÜûëöĂÙĂĂ ›­±àéMŒûØÏ̉ăÁÛ«‚ ½9µØư‡±ù1̣ÇÛºùש‡¥2ßëM«Ôï½ÍÓ¥ĂÍӫшƒˆï½ßÏ¿º°êؾƠ°»™‰kß [ïSÛ«‚ ½9í¥ưÀÏÅ«‡“Íj°»ÎÔºơ©¼ÿÚï½₫®¶ûó˜‰j̃ZîSƒ½·Ô«‡“Íj³z³‡Ç̀Ç á꫇“Íjù×Û«‚ ½9ơÔăˆŸ½µØ±½ƒˆ«‡“ÍjÙŒë*«ÏÔ›½©‡¥2ßëM¹ÁƯÚׯµÏơê˜ ê è ä §ôăàÔXÛ«‚ ½9‡“±»ÅØ£äå̉ ÁƯ¶0è0áƯщ½₫®¶ÍË)éÛ9¥̉Å‹¶ÀƯ™‰kß [ïSƯÓ ö¹Ú•ŒƠơÀĂ–¶  ÑÄë¡©³ºó߈’܃ÁƯéê߈—¾ëöçÚưÁ9¥‡±å±»—»ăˆŸ™‰kß [ïSÏŸÚ噉kß [ïS—s§1ăˆŸ;̀ÓÑØơĭţ䲗¶ăàÀ½ùê«·3uU¿ÙáêÙŒë*«¥ˆ]19¥‡éº½€½©ÓÉ̉«Ôëö‘ëç¢Û«‚ ½9ơêψÚ¹Ú½ª¶2tTÅØ¡™‰kß [ïSăàׯ›v™‰kß [ïS†ŒÿÚưÀÁ±ÏźùׯØơÄØ±»ÂĂơêÁƯ“…¤ëÓ¹Úª»«‡“Íj¾ß߈œ‰¾I§Ô}¯È«‡“Íj‡Û¶¼̀7ŽÂÍÄơê¼́º ưÀéÍ­ˆ½ưÀ†a¥¾ø×ÏÔ±»÷)ÑÚ׆ŒÛù×±½8¤‡ívéêñÚ“ƠÑÅ“Üß„̉ºËÓ¾ĐÓ߈àƠ'ѶóÂéºù׃áµÛª¶2tT₫Ú›¾Ñ̃ñÓ¼ív«‡“Íj“Ơ™‰kß [ïS›¾ÏÔëöÛ«‚ ½9Ø×ÈÙßÄÙăˆŸ;™‰kß [ïS8¤‡µØơÔ™Û¡ÛÍåÛêơêÏ̉ËÉ9¿ô‚v³Ç߈؉j̃ZîSºÙ×½Úª‚ +¼9ÛדȣƯƒvéºçÚóÔƠXËÓöƠÛ«‚ ½9…ÇÙÁ™‰kß [ïSôÅØëö±»—»߈߈ˆöÁÏÔƒvÏ̉ơÔÏű»ψù׹عÚƯ“Ë¿°êز£³âˆ:j߈ó×߈߈ÑÄëÿÛÑÀ€¾‡º•½ëÚÍö÷¼«‡“Íj‹Ó¶  ÷ÁÙ̉™ÁÙ½ÛÀ÷ÙçºéӬثÔƠ»ôÓ™‰kß [ïSÙ×ăˆŸ;ù×ëö™‰kß [ïSÙÚÛ«‚ ½9…đ߈çÚÛ«‚ ½9½©Óö¶“Æ߈ÙŒë*«ù×ëöùׇ÷Ú™‰kß [ïS¼€ËăˆŸ;köÉÖºÁ³ÔĂÙ«Ôåó½đµØñÓ9¥‡ïƠ›¾±»åô›¾¡«ÓØ»Øëö¿³Û«‚ ½9™‰kß [ïS§ñ°¿…ËÉ9ưÀ¾±»ív·‡‘×8ç›¶éăˆŸgóÂÂÓ9¥‡¢ÈÓØ™‰kß [ïSöóÇß„˹®GøĂÙ„n™‰kß [ïSÑĂ™‰kß [ïS9¥‡×Û×°»“ÆåÆÑØÛ×¹Ú‡9ê$¬Ä߈9¥‡±»ăˆŸÛ×» ¥;µ½±ÈÛº›¾›ÛëöÁƯÛ«‚ ½9ÏÅăˆŸ;k9¥‡±”…ƠăˆŸ;·¸ƒ¹̃™Ô•ÇÏÅÈ̉µÀщ÷Ù‹Üù×ëöÉĂ³—ˆØ×%Ơửƒv¡»ù¿§ÆÔºl¦Ó…ô³Ï̉Û«‚ ½9ù×·‡‘×8çöÇƠăˆŸŸØăàÙ½£ÇÁ̉½¾‡ÿ¹Ú©‡¥2ßëMÿÚƒ¶‡Ö8æ%‡ḈÀ±»ñÚ½ôËÇ¿Åù×½ƒÖ½íƒvä××ÜÁ%•Ç¡ÈÙ̉½°»ơ`ăˆŸ;™Á›Ú¸ÚÈÛ«‚ ½9íÖ¿ßá µ!ơĂû(“¹ƯNøê±»ó#ßÄÙ™‰kß [ïS£»±»×¾óÔÛ«‚ ½9ă±ÑÄë̀Ó ¶ô±¡íÁëö™ô×ƠÙ½­Öß»û±»¿è«ÔïÀ×¾ÏÔñÁ¿‰åôÙ½°»³ØưÀµØ¾…Ơç̉‹Ó«Ú÷Ù™‡âàßÖƒÖăˆŸ;Ể÷å5Ó™‰kß [ïSù Ô»n«Ñ™‰kß [ïSÁƯ¿‰ßÄÙ—¶²ËÓßÄÙẨ§Ó¡È̉ŨÀçÚ¥˜ưÓ¿½ÁÛÍ›¾Îŧº˜‰j̃ZîS¹̃ưÀ¸È̉̃ˆ¾ö¼±»ưÀẸ̈±»¡ÁĂÙó•ÁÛïƠ£ÜùơưÀ¯‰¯0™‰kß [ïSñ֋DZ»áê  ³ºóǺÁƯƒØ̀ǺØÏ…ƠÉTÛÜÚ¹Ú¡ÁÊ׿8ơê¸ÚÛ«‚ ½9µ†‹Ç¢XÓ¼˜‰j̃ZîSÙ̉ív¥ÛÇ÷Ë¿ç̉¹Úï½Ù½½á £ä߈å̉ ÄÀÏű»9¥‡„aÙ×íoƒv¸Ú&™‰kß [ïSƒ¾‘«‡“Íj÷‡ÛÄÓơêôéÏÔ»5›¶éר§ÔÙÚÓù׃v«‡“ÍjË6©‡¥2ßëMÛ«‚ ½9ºÁÉĂ·¡÷ơÙ½ăˆŸÅ–±»Â•ÜăˆŸ;£äß»ûơÔơĂ÷ÁÅÓù×ÑÓ«Ô»ØăˆŸ;ăƠËƠ½½Ă߈ơĂíê߈ëö·‡‘×8çµØ8¤‡×‰øµØË̉μƯå¢Ç±»í‡Û«‚ ½9ÏÅ¿ß߈ÙÅëºÛ ÏÅßÁçđÛ«‚ ½9÷ßÚăˆŸ;Ù½“Èö‹Ç±»å̉ ½Œ‚vçôé걽žñÓ“Ơá=ĂÈ÷Á™‰kß [ïSÛ«‚ ½9ƠơŒÓ߈ëöù×ÛÚù×ăÁ÷‡ÙÚëö㻵.¥Ù߈«‡“ÍjËÇư‡±ù1¾™‡­Ô·#½§ÓĂßÁ³Æ¾ºµØÍĂĂº·̣¦¹˱Ûºµ‰íÆàçºÿ§‡éÓÂÙ½ë„ÓØ™ôïs´ÈÍƠÿÚêÅÚב ƠAÅÓ—ˆª‡’̀jÚª‚ +¼9ÙÚÙŒë*«©‡¥2ßëM߈ûƠª‡’̀jç'ÔöÏÔ£Çăે“ÍjËÉ9Á¹½²”ͱ»·Ô߈À¼¾Ï̉³ÜÙסÁå×Ơ8¤‡×ÅÓöÁ +Ăà¾ëöÅÓ…n½“Ʊ»­È‚«‡“Íjơ꿉‚v±»†Ç‹Ç¥ˆ]1Ñô£Øív‹ÇºÔÿ¯¶ï‡ăà°»ưÀ™×Ă¹‡Œêöăêçđ›¾Í÷°»ÙÚĂ—½ÓءԽ€ăˆŸ;–Ó߈æØ½Ô€ÄË̉öÁÓØù×ÏÔ´Èù×ëöƠÿ¼­ÄÓØ™Ó‘Ó½Á±»ơèŪÚÓÔƯºă»ívù×Ù½ïÀ±ƯË̉«‡“Íjåˆçôå̉ É̉߈›¾“Ơ±»·Ó ¥0[Ï̉ƯÚ±¿™ÔµØ÷Ô¿‰߈ù×ăˆŸÊ%ä̉£"̃ÄØ¼ »Á­ç'ñÓ“Æ÷ˆÀ¼ÔÑÓ³%ù×ÓµÙ̉÷Ú›¾ƒv߈—Ó¡Ûؽ«Ô¿ºé¾ñÓ…Û¶ÏPÛăԩصØáÛ߈£Ç½”Œщ›Ôù×Û«‚ ½9ø×ï³2ăˆŸ;k߈ưÀ™÷ÁµÀéÚ½€ùºưÀëö±»Ù̉«‡“ÍjăˆŸ9¥‡ÁÛ·ØÙ½´a÷‡ûÓ«‡“ÍjÆÏ̉ù×ïÚÓợ½éÓñÓăÁÛôÿÚ÷ÁÙܾö¾ùÚÛ«‚ ½9Û«‚ ½9麫‡“Íj߈ߌÛ,ăˆŸɇ±ÁÚª‚ +¼9ñÆÁ̉ĂÙщ«Ô‡Ú—ˆ½º‹Ü‰à߈öÁ‚vƒv—ŒùøÙ½߈Œ¾™‡©Ó«‡“Íjå̉ ³ùæÁ¹©‡¥2ßëMÁĂÿ¯¶»‡íº¼Ơ¼ÅĘôÏÔÅØǺ½«‡“Íj›¡ÍÄ‹ô”½¯‰¯0±»“Ơ­Ø̣ÇăˆŸ;߈ăˆŸ;ÎÅÏÅ«‡“Íjø×—¿߈—¶ñÓíêÛ×ëöǽ߈éôí¹ª»ïÁ‡ŒăˆŸÍÄÍǽé³ô´a©‡¥2ßëMĂºø×›¹«Ô±¿ß»û¾“ơ۫‡“ÍjÓØăˆŸ;½€“Èó‘é©Ç¹ǽƠ]ù×­½¼ĐØ8¤‡±¿«‡“Íjíơ›vÙÚç'í½ƒˆ8¤‡ÖÑÓûíÚŸ­ÿÚ‹Ç«‡“Íj°»Û׎߈¡Û¾·‡‘×8ç߈ù×Û«‚ ½9¿ñÚȇ±¿¿½×ï¶Å߈‡¹ÚRé‡ĐÓơĂ¹Á©%ơÔăˆŸ;¿‰àĂÿ¯¶Ù½ûÛºÛÄÓߌÛ,ÏÅÇØ‡ÛØ×À‡Œ¶½ƠûƠß»û£Ø™Ô£äÏÅÁ̉¹Úͽ‡³Â…Ù‰yÛ«‚ ½9Û̃ëö±Á¥ÆÁ½Ï̉ÖÆ·ÅóÇËÉ9ƒvª¶2tT“Ơ­ơ¯×ơÔö™ÓƠóԻ؃ˆÍÜŸχăˆŸÇ̉óÇׯË̉ÚÆʾeûƠ½œÂ…n·‰Ï̉êöÁƯ5™‰kß [ïS߈φ»¼‘·ÅƠÄ…Ơ©Ó߈ƯÓ 9¥‡«bÙ½µ†êÔƒÔº̉ƒvëöñÚ›¾µØ­Ä«ÑÁÓÏÔ…ƠÜïƠƒvû(9¥‡××ăÙ½Óß‚v‡º¶ß»û ÛưÀñß»ûÍË)éÛ9¥ăˆŸÙ½³*éôÓØÅÔƒvÙ½±»ÓÓÇÖơêùבڂvÅÄéºÏÅǴ؃¾‘äơÛÀ…Ơ«ÔÁƯ‘́™‡§ÓÅ–‚×ăơÙƠéÓËǃ̃ÑÓù׫‡“Íj°êر»ï'Ơ¾G¹à©ÀÓÆñÚ™‡ăî¿àñ¨ĂÙÑÓ‚Ô«ÔŸ}çÚÏÅÙÚ·Ôµ¸©Óù×ɹĂĂÛ×ÙÚ÷ˆơê’½åÁ™‡£ ±»Î̉«‡“Íjµ¾º«‡“ÍjÙR°¿ó|¥Æÿ¯¶æÚ߈Ù½ô©Óù×Å»­åÁ½½ívÆ‹ÇàêèÓïß× ÷ÚƠ膺êö³ Ûºë˜HÙŒë*«ăˆŸ;ôƠÅƯÓ ÑÄëcv…Ö½Ô½ÏÔÓ̉½Ơ߈¹̀ñ»Û«‚ ½9¸£̣ÇÁ̉±»ßÚ‘Öíê…»ÇÖ§đ“½«‡“ÍjĂÙüÓÍǃ½ơèÅưÀ©“Ơ©ÇgͯÁ¹Ç9¥‡¿ºùפƵÈƯº߈ĂٓƩǗ¶ñÚ±»Ở߈‹Ç—¼ù™ï»ßÄÙÙ׵ܙ‰kß [ïS™‰kß [ïS9¥‡™‰kß [ïSå‡-ßÁ½̉˜‰ j ̃    Z îS «‡“Íj§Ö£äù×±»Í­HñÓÙ½rƒ½•‹H×Ó±»ơê±»¡Û¹Ú£ôùơÑ·öÁ«·3uUö±»¶Ù½±»ăơï½¥‰ÍL…ù×Ó ‹›æùơ›Ú́½Ù½רöÁñ~±»é‡‹Ç³ ‰ơÛÇÛ«‚ ½9ûØëöíÚĂƠß»ûÅØÅÔÁƯ§ử©Ø«Ô„Ø¿ôƒˆÿ¯¶ÙÚÛ«‚ ½9ăˆŸ;k€¾»ØÛ«‚ ½9ÓØ½æéÚ•Œøê¯àÅĸÚù꽿ͼ—º›“½€ù׳zï½ù×Ơºmêŋ۟ÅÙ̉߈ßƯÅÔûÓ³ Ù½›¶éçÇăˆŸ;¥ÖÛ«‚ ½9²Â­‡ù׉ÜÓÆĂÙéºÁ̀¬H9¥‡¤Ø«»™‰kß [ïS½€ÓăˆŸ;k­ÄïÚÛ×Û«‚ ½9°»™‰kß [ïS™Ă¯G‹ø9¥‡ù×ÁÛ߈§Èív™‰kß [ïS½Ăçô­ÄÛ«‚ ½9©¼̃¹ĂÙÙÅëÙ½ưÀÙ×Ũ¼ßÖÇ"Ù½«d¯‰¯0¥ºù‡¹Ú°»³ßÄÙ#í“‹Çù×ööÁÇÖ›¾ÙƠ½±»™ÁéÚËÓ÷ÁÛ«‚ ½9ĐÓÙÚµƠ™‰kß [ïS·ÔªÚ•Èû›ùêÿ¯¶8¤‡­ÄƠƒˆ߈Äø×ÍƠêơ“ăợÔÙ½¼̉ºƒÖüÚëö˜‰j̃ZîSĂ¼å̉ ÏÔ½ÁÅô¨À©ØăˆŸ;ù×ăˆŸ;“ƠĂ™‰kß [ïSŸÖ߈߈ؽóDZ»·sÛ«‚ ½9±»½ÏÔù×í‡ÅÔưß›¾±»±ëؑƙ‰kß [ïSÛ«‚ ½9÷ÔŸÖơêƯÓ ¹Ö©vĂÙÇ»öëö»Á»óª‡’̀jĂÈÛ«‚ ½9ăˆŸµaÙ½‰¿Iå̉ Â߈߈ơê³Ç¡Øù×ÏÔÁƯ™‰kß [ïSÛ«‚ ½9Û«‚ ½9¥â«d߈ÙŒë*«½éºößÁéê™ßÑ×÷ÁÏÔ¿߈­ØơÔÛ×ơ·‰ùסđÜù×£Ø߈£ÆÙÁƯ«‡“Íj½€£X¡È‰áׯöóÂÏÔÍƠ”½ÀĂ½ăˆŸ;kéºăˆŸϺ™‰kß [ïSúÙƠ߈êÔƒà™‰kß [ïSíÖâ­•¾Úª‚ +¼9ç…«£Ư߈ơÔĂÙÚ©Ç©‡¥2ßëMơêÜơêëöív߈Çù×÷Á¡Áƒ×½€ăˆŸ;·ÅăˆŸ;±»½¥ˆ]1ÎÅăˆŸ;Û«‚ ½9Ơ‹Ùͼ«‡“Íj‰ÚƒÔ}Ở·Ü”» +´†«‡“ÍjÏÄöç̉ÏÔä̉±»ö‹Ùƒvß\Ó¼ÉÏçôăàµØăˆŸ;£Á×¾÷‡‘÷¡È«Èă½‚v«‡“ÍjßÚÍÄ›ÚÛ«‚ ½9ªÚ‡ÇĂÈË̉“ƃ½¹Ú—»đÔ™‰kß [ïS©ØÛשÓơỐعÈơê ËûËÇƠXơêùê­Ø€ºˆ±»ăˆŸ;߈ëöÏÔ½áƯÏ̉½ÅÔưÀ’½ÑÅÛ«‚ ½9ëöÛ«‚ ½9ÅÔ¹Ơ®¼ »ØéÓçÚ…ÚơêÅÄ£»ÎÄåĂƒÖ®Gø™‰kß [ïSƒØ«‡“ÍjÎÔXÿÛñÚÏÅ‹Çç'«»—ˆ¾Ôùׇ¿çÚÜ#ívœÜ±»×¼ÏÔ¡Ó‚Ø$ơèʼnyרË”ăˆŸ±»É}«ÔëØ½ưÀ·Ô§Ôëö9¥‡Ûº™ëéåÔÿ–»·‡‘×8ç‚×ëöÏÅµĂ‡ƒvơêßÖù×9¥‡×ù×âÁÇÖÑÄëµÉ°ÔƠÎ߈á=êö¾ü&¦&&†&Ù̉ĂĂû̉ơê±½–¾™‰kß [ïS·‡‘×8çăˆŸ;ÓØù×÷‡Ư^ĂÙ9¥‡߈Ôùê·ºĂÙƒÄ߈ƒĂÏÅ­½¼̣±Ü›‡ĂÛ«‚ ½9á Íă³Â¡Ÿ ¡Ô“Ơ³ô¾ưÀÅÓÅÔôêרµØßÚéÓÛ¹Ǽ¼ô¥ˆ]1êö£»ëÔÁ¼Ơ±»«‡“ÍjơÔÍÓív‡Œƒ¾‘ª»å̉ ¿à½ăˆŸ;ĂÙíêÁ̉ív¹ÚÍ܆Œơ…Á³ÇăˆŸÙÚÙÚ‘ëïiçºÏơÙŒë*«¹¶÷Á²ÑÁ·Ó ¥0Åö¶¥ˆ]1ï»Ó؉ÏÔíÂŜֹ©Ç™ëéåÅĂËÉ9ËǽơèÅ¿‰Ë̉ÀƯÛ«‚ ½9·ÔźÏÅơêÄ– ôù×÷ÁÛ«‚ ½9µØçÚù×ß»û§Ô…ÛÏÔÁ߈¦ôù×·Ô½±º½Ă·Ø‚ṿ +¾ÛÀÀĂ߈‰Â¹Ú™ÁÅ¡ƯëĐŸÅ³×àø×߈ׯß»û¾ơÄÅÔĐÓăơÛ«‚ ½9ívƒv‡¿ßéê—€“ºƒ½«‡“Íjß֕ܦô†Ç±»¯Ơµ†½Û«‚ ½9˜‰j̃ZîS¥Ăö¹ÚÑÄëÏÅàö +ÑÄëĐÄꩇ¥2ßëM˜‰j̃ZîSÓ̃߈¡ƒÀív«d׿8‡“ÍjÛ«‚ ½9ñÓÛ«‚ ½99¥‡ù×½…ؘ‡ÇÖëö—Óí½•ŒÓº‡ÇÿÚÛ«‚ ½9§—±¹ •×̉ˆ +”= + +éê½Ơ¸Ú˽ÎÔÅÓ±»“ƠùµØ߈±»Ûë߈·ÔóçÚ·‡‘×8ç±»±»½±»ÅÓƒv©Ó9¥‡Û«‚ ½9©¼ö—¾ÅÓÙ½ÇÏí½€÷ÁÙÚ½ăàƒàÍƠÙׂ½ÿ¯¶«‡“ÍjÉ̉ш™‰kß [ïS…»©åôÍË)éÛ9¥¿Åêç¡é‰ñ5ñ·ÅÔ•'¡ÛỞàƠ™‰kß [ïS߈Û«‚ ½9¯±e½«ÔµÜâˆÙ½ăÔƒ×ăˆŸ;Ÿ¨º©Üơꙇ¡Û¡È̃ÄØ߈áêù×ñÚÉ̉ÁĂÙ»µØ™Á»ØÓدƠ´a«‡“Íj́ơ ÷ÁÛ«‚ ½9ÈĂºÁßÚÂëÔÏÔºù׳ºóív›¡ô Ú×Û×ù×ù×ùטĂÅÿÚơêưÀăˆŸ;“™ÓÜÁă×ÚÄô˹«»‰¿I˹¥ØÅ»ùº­ÄƒvïÅä̉§Óº±»©‡¥2ßëM È¡Ô÷Á±½߈¿ôÙ½ưÀÂÙ©Óơêǽ±»½­Û—»©Ç‰Û“Ûù×纳 ±»ÇŒĂĂëÓƠ–  ¦ ̀»  ƒv¾½ĂôÿÚ™‰kß [ïSÏÔɇÏÔ˹ĂÙÍåëöívăˆŸ;߈‹È™‰kß [ïSồ¬HöÁ ºÈ“ÈÁ̉áê³Ä½¦›ë̉¸!­Ä߈·ººÅ­ÄƒÚß„¿‰½€¦Ó«Ô—Ó±»Û«‚ ½9»ÁîÅÏÔÓ¼åôÛ«‚ ½9½€Ù׭ij½ÙÚâà ©‡¥2ßëM¼ăÁ™‡8¤‡ívß»ûëö±»á Ï̉ù×ß»û¯¾Óøù×·Ô½¶ÔÏÅ™‰kß [ïS»Ă½€“ƠÁ‡ÏÏÔ¡ÔëöăˆŸ«‡“Íj±»ëö‰»©‡¥2ßëM³ưÀ9¥‡ơêơÖ½ôơÔ·Ôç,§ô‚×·‡‘×8ç¹Ú‹Ç‚«‡“ÍjƠµóÂßJ™‡ĂÙÓÍƠưÀÏÅăˆŸùô߈ºÙ̉ù‡ÏÔ¥Ư«‡“Íj­áê“Æù×ÏÅĂÙ³‹ÜÑôê™ÖÍBƒv߈½÷‡…n߈á Ž¿ ›̃©ÓïôƒÖ«‡“Íj‡×«‡“Íj±»ñڃث‡“ÍjÛ׳ŒÅÔóƠ˫ӷÔñÁÏß«‡“Íj™Ôï‚ă¶Û«‚ ½9ùô™‰kß [ïS߈í'ăˆŸ;ƠXÁ‡é/×:Å9¥‡ƒvívÅØÚª‚ +¼9…½ÁƯëöÏÔÇÖÍ册‘Y±»…ÖơÔ˜êèäÛ±»ív¡Ù£X‰ï©ÇÍÓ‰ơêößÏ¿‰ßÄÙĂ¹«·3uU±»Á̉›¾™‰kß [ïSº½ĂÙ‡“ׯ‹vƒØăˆŸ;»n«‡“ÍjïÚ¡È÷Áö›v£Ư†»¡‡ÀĂç̉ÍË)éÛ9¥ăˆŸÏÔ›¡öÙÚ9¥‡«‡“ÍjăˆŸ;§ôëöù×±»‹ÙñÖÏÅŸ›ÔÁĂ÷$½€›¾“Ûÿ¯¶ÁƯĐŬ¼¼ÁƯÖÂăˆŸÍ­ơê½€«‡“Íj½Ă9¥‡Ù½­v•Ó›·ÔÙÚ—»ÏÔËǪ»öÁ ߈ÏÔ«‡“Íj©Ø±»߈‡Ûö±»¹Á™‰kß [ïS¼ØŒƠ «‡“Íjëö‚vógÏÔàƠ éêƯµƯÓ ÅÚ™‡ăˆŸ;ñÓ™ôóÄĂÙ«Ô½Û«‚ ½9ûÙ¡‡x̣ǃvº«Ôív߈¹»íÖÙ×ơÄăˆŸ;óÔÅƠ˹Ûו%½ƒvï½̀Çÿ™‰kß [ïSùơá$ë·̣Ï̉ш·ÔÛ×´a™ëéå±»½Á›¾—§Í»‘Óù¿“È‚ÖÑĂø×…ÇÀ9¥‡«»ŸơĺÙÚ½ƒÔăˆŸ§Ôº›¾ö$ÁöÍĂº±»™‰kß [ïS£»÷ˆ‹Çá ߈ͼ¦¹ íÅäÆ¹Ú·Å‡Çƒˆ«‡“Íj“¹ƯNÍÇù×µØÛ×áÓ½«‡“Íjø×«Ä߈£ÇÁ̉¹ÚñÚ¼™‰kß [ïS‡߈ÛÀá=ÏÔù×À‡€è/Ö:Ñø½ÙÚÁ̉®È ½Ë¿±»‰ï·‡‘×8çÙ½ùêÛ«‚ ½9ÿÚï½Á›¾³È¡ÛỚÑ·÷ꪇ’̀jÙ½Û«‚ ½9Û«‚ ½9±¿ÅԩؽµØ…Ọ̈×­½¼ưÀăˆŸ;ưÀ—äá=±»ù×íº9¥‡›Ê÷Áù׫߉¿I˜‡­ÖÙu™‡Û«‚ ½9©‡¥2ßëMù׃½üÛá “½öÁĂÙù×ùêíêùê™Ó§ÛóÔăˆŸ;ƒˆ›¾ăˆŸ;‘ÆÛ×ú̉°êØ‘«%Ơ´©ØưÀáêáÛ¤ˆ\0¡Û™‰kß [ïSƒv’¹Á¶è¹Úâˆ:¯‰¯0ÿ¯¶ÁĂå¼ §ÓËÇ«ÚßÄÙù×™ÔñÖơ‹Ç«‡“Íjù×ĂÙÅÔÓºµa›¶éù×ßÄÙÏÔív«‡“Íj«‹ÏÔ‡Û«‚ ½9ö¨ ‹ÜƒÖĂ¿â­Ö»‡ù×Á½ĂÖÄÀáƠơê—»ÿ’¸Ú³ÂYĂÖ…Ê±ëØ‡)ι¡ß«‡“Íj‹¾ׯ¹‰¿I›‡¹ÈíêÀ‡ùËÛ¶¾ßăàñ́§Ô¶ßÁ‹Ç«Ñ¡Ô†ŒÀ‡€è/Ö:ëö›YĂ¼g‰å¿ôÓÆª¶2tTÚª‚ +¼9Úª‚ +¼9ù×ÿ¯¶ưŹګ‡“Íj‡Ç§Ơ₫ơÔ……ÿ¼ƒÚù×ơÔɶÙ½ÏÔ߈€º¨Ç½ß»ûÏÔßÁ±»›¡̃„ƒv±¿£ÇŸ}µØív÷‡ẳ©‡¥2ßëMƯÙ½ø×™‰kß [ïSơÔÁËÉ9%Ç̃íÖ™‰kß [ïSƒ¼«‡“ÍjÀ¹±»†“ +ÏÔÁĂÏÄù×ÏÅ—¶íXñÓÑ»±»£‡¦ôûƠöŽË̉ÛÀù냌ƠăˆŸ;ù¿Ơû¡½¨‡¤2€̃êLÁĂŽ›¾ÙÇ®Gøÿ¹Ú™‰kß [ïSǼ¿ôÚª‚ +¼9«‡“ÍjăˆŸÏÔ߈ǺÓ×ĂÙÓ£ÇơÔщ¾»Ï̉±½©Óª¶2tT“¹ƯN‡ͼù×đÁưÀăˆŸ;ĂÙĂèơ‡›Ú˜‡±Áƒ× Û«‡“ÍjúØÁ¾ß߈¼½€ƒv‹ë¯×àƠ˜‡·‡‘×8çŸƠ÷Á—¿½éJé‰Ó5“gesÁÅÁ¼»Ø«bưÀÓ·Ô«dùêÁåùæ߈ÑÄëë{ßÅŽăˆŸ;щÑÓÛ×¾é¡ÔÙY¸ÚëơĂÓñ­Ø߈¹ÚéÓ½é‡úëöù×ù׃vÍÄËÓăˆŸ;ÿÚêöăˆŸ;áƠ­Öÿ¯¶Ơ™‰kß [ïSÏÔ™ëé婇¥2ßëMïƠƒ×½Ø÷ÁÑÅÿûËÉ9«ÔăˆŸ;£äƠX¾ºÔÚÛ«‚ ½9߈µØ“ƠÙ»¾é‡å̉ ù×ß»ûÁĂ8¤‡ưÀ·ÔÅÔÏÄÙÚ¼ÉÖÁÓù꛾±»ï²2·Å¿‰«‡“ÍjËÉ9Û«‚ ½9±»ĐØÅØêöñ~ѵ™ÔÑÓÙÅëÏÔ¡Û™‰kß [ïSßÁëö‘Ö½Ô߈ÏÔ«Ô›¾ÛÄÓêöÛ«‚ ½9ƒvÿ¯¶ëöÁ›¾9¥‡µ•ëöÛ«‚ ½9›¶éÛ«‚ ½9ø×ÏÔÛ«‚ ½9Ù½߈“ƳºóăˆŸ;«Ô߈ƠÚ…ÏÔ¯ÈÏŽ‡«§Æ‡Ú¥Ø¡ÁưÀ¹Ú½ƒˆÆØưÀ¼ß“ăˆŸ•ǃvï½–Ó±»ƒƯûÙ¬ÖÁ¦ù×Û«‚ ½9Á¼ùêщØËƠÛ«‚ ½9/¯¼ÚÇ×ÓĂơê±»©Ó˜ơÈĂ ƠÏÅÏÅÁׯÏÔÿÚ“ºÅÔ™ÛÇÅăˆŸ;‘ùù뛾üÜͪÏá=÷ÁçØ•ŒÆ»ƒÚ%ĂÙŽ«v½ăˆŸ½Z‘È›‹øăˆŸ;åé·ÅÏ̉†Ç½È¢ä«ÔăˆŸ;º‚ï·ºƒv‡ŒÛ«‚ ½9óÄ£äƒØÛºëöÚª‚ +¼9§ØÙ½˜‡Ơ¼¼ë‡º±»ƒÛ«‚ ½9ÁƯ±»«‡“ÍjëöœÜ €Ä÷Úâà ƒvÏÅăˆŸ‡“½ÍË)éÛ9¥å̉ ·ß½ôó÷Ùëö¡%µ̣Ú×߈Ç÷µØµØŒ₫ơÔ§Ô½ù¿±½­ØóÔÏ̉ǼĂÙªÚ÷Á•Ƕ©¼ØÅê߈ÏÅщ½9¥‡×ÙÚƒÖÇĂưÀÏÔĂÈ÷Áç»ƠưÀ¡ĂÙÂÙŒƠ£Ç÷Ú¡Ô˜ô£äéô›ĂéêÛ«‚ ½9̣Â߈¼±»‰¿Iׯù×É»™‰kß [ïS›¾™‰kß [ïSơÔÚº »Ø§Æö™‰kß [ïS‡xï½¹̃½€ÛÄÓ·‡‘×8çƒÚăˆŸ;ÍàÓØÖ¾›¾Û×å×›vö§ô™‡›¶éƯܷ؃Ë̉ƒ¾‘ÿÚ%ăˆŸ;kßÁ™‰kß [ïS«ÔóÔµØÛ«‚ ½9ñ×­Ö©‡¥2ßëMăĂ3¿§ñÓ«‡“Íj†ŒăơĂÙڢǙ‰kß [ïS߈ơçëöÓŻأ»ÏÔơÿ¯¶¥Æ©‡¥2ßëMăˆŸ;Û«‚ ½9ÍÓŸÖØÅêăˆŸ;̃¹Ü߈ÏÔ÷»ƒv·ºÏÔÅăˆŸ;°»§Øº©ËÇßÄÙ9¥‡×®¼Û×¥ºåƽ“½ơºÙ½ù×°»ívù×ÑÓ±»ỞÇÓ½ùơß„ÙÚù×ơé±»ªĐöÛ«‚ ½9å½±»ÙÚª‡’̀jÁ̉–¶ÙÚᤷܡÑÇø½Ô§Ó½¦º½ĐÓ›½½Ù¾‡ÇÛ«‚ ½98¤‡×‡Œ÷Á¿‰Ú×ăˆŸ;½ÜÓ Û«‚ ½9ëöß»ûÙÚκÙÚÏÅơêƯƒvÿ¯¶™ëéå匿Nå̉ «‡“ÍjĂÙă»ÛÄÓÛ«‚ ½9̃»ú¡ÛÓ5×hÁ½©Ø°ïJ·Ốơ¼Û×ÏÔ§ÈăˆŸ;‘±ĐÓ¯ÜăÁ™‡™ÓÖĂĂÙźá ÑĂ÷‡éÓܺ©Ø8¤‡Ö©Üù×½€¡Ô§ÔăˆŸ;¯Æ“ǫӯÈíÖơÄ›¶éÏÄ߈Ù̉רíÛ×™Á‹ÁỬÛ×ùׇŒÀ¾ ùêÅƯ…»ăơùêơÔÙ½ÙÓƒvËÛ©ØéêÇÖºÙ½ăˆŸ;±¿ÇÖá궇Ö8æñÓÏÔçô«ÔÅØ­Äº¶Û«‚ ½9ù×§ôņÍă÷t§Ôå̉ ù׃ˆëÚơê°Á߈ưÚ‘øÅØ½Ê”źƒ½³ØÏÔÇֽ륉ÍL…¡ûº«‡“Íjơú¥ÆƠX߈æ°»…ÀăˆŸ;kØ×±»µ‰öÁ°¾kªÔ•Ź÷Áù×ÛÄÓƒˆ߈¾ù×¥ÆÏÔ™‰kß [ïSÙŒë*«Û«‚ ½9ĂÛÑÓ̃ˆ±»ơèŇºû°»Û«‚ ½9ªÈÁ¹¿à±»9¥‡ưØ£—¶ĂóÅư‡±ù1ï½±¿Ïø×ñÓ× ¹ƠÁ̉«‡“ÍjÙ½9¥‡Ûº·ÔïÚƒ̀Ê)èÛ8¤áê¿ßËÇÍÄÅÔºÛ«‚ ½9ÏÅÿÚËlă»ÙÚÀ½­‡™Ô«‡“Íjăà±»›¾ÛÔ¡Á™‰kß [ïSÏÔÑÓ߈«‡“ÍjÅÜÿÚ߈«‡“ÍjăĂ3Û«‚ ½9«‡“ÍjïƠƒ½ƒvÁ̉뼽ؽôûØׯµØơꈘôù×Ù½¡Ó¾£ÇËÇơꇳׯ߈ĂÈÇ×¾ƒvĂĂ™‰kß [ïSù×±»¼ «ôÓØÂ±»£Ô•ÿ½›¾À¹AÉ«‡“Íjù×½§Ơ›¾ÓØ߈ưÀù×Ù½¯‰¯0ơÔ§Èá ûØùëÙĐÏ̉Ù×âˆ;öë ñÓÙÚ½úëö™‰kß [ïSơê½Û×±»ơèÅËÇéÚñíȇŒ©Øÿ!Áă™Ó›¾½˃ëö±»°¿£Ø‹Ç߈·Å߈½ßÖ±»ơêØ§­ÖƯÓ 9¥‡ÂȜ܇xÓ̉Ă¿‰›¾™‡¡Ô¯È³úÀÙÚ·Ôưˆ«ŸÍÓñÓŸ}߈ß»û™‰kß [ïS«»߈«‡“Íj«‡“Íj«‡“Íj±»ăơËÉ9ª‡’̀jÅÏ̉ø¿÷‡¿ôưÀÙ½áêëöé¾ÄÖÅ–Ÿ\æÚ“ƵØÏ̉óÇÁĂ¡È·Ô­Öÿ¯¶ƒàÅØ±»Û«‚ ½9×$«‡“ÍjçôÛ×éÓÎ÷øÿ¯¶À̉»Å«ÓĂÈÙ½·Ô«‡“Íj£äÙ½“‘áꩼ¹Ú±»ñÓ™‰kß [ïS¾›¾ïÁ½¹ÚÛ«‚ ½9·̣©Ó÷ˆ÷Ľ€±Ü€rƒˆêö±»Ïž©‡¥2ßëM½Á½ƯÓ „߈—¶ùׇŸÅ¹óÛđơÔ·‡‘×8ç©ØéÓÙÚñÚ«‡“ÍjëöñÔ•Œ½­¤½‡Û«‚ ½9¿º½€¿ß«‡“Íj¿ñµaă‹µØ½í¥·äµØƒvưÀÅăˆŸ;«‡“ÍjôÛ«‚ ½9¡Á€ºù×ÁƯ»Ă•îëöÛ«‚ ½9ù×É‚ăˆŸ§Óܽ™‡®¾ø¼ß»ûöÔ™‰kß [ïS¡Ûù×öÁó^箂v£ô™¾ïÅ™Á°»»Øù×ƠûJ́vơÅöÁå̉ ñÆ»¹Ú•Œ©ÓÏÅ”‹œHẩëöº¥ˆ]1Éăê8¤‡™‰kß [ïSÂĂÙº½ûØ™ëéå߈Å‹ÓĂÈࣻÎÔ +ͽƒv߈ÀÙåĂëö½ô•ĐĂ™‰kß [ïSÿ¯¶›¹ëöƒØÑÓ¾áƠëöÇĂù×ó²߈Ï Ù×Úª‚ +¼9çÚ¡ÛÔơ‰¿IăÇ퉿IÛÄÓÁƯñÓÁƯ·‡‘×8çÏÔëö₫®¶°½ûÖÛ«‚ ½9Û×÷Á¾™ÁÁåë“߈¯ÈÛ«‚ ½9˜*ê*è*ä*ùë¶8¤‡Öưö£Çëöº¡ÈË1·Å±»ÙÚ·‹Ô©ÓÈ̉“¹ƯN«d†×ù×ÛÄÓÏÔÇ"¸Úª‡’̀jÁƯÛ«‚ ½9™‡áíêåÁëöơÔ÷ˆ‹ÜĂÙù×ĐØÅÔ•ÜѶ¢X+¥ºÏÔ™ơÊÖß»û±ÔûÑĂÙ·‡‘×8çÛ©Óù×ĂºÏÄÙ½º÷Á½àëöºÜXĂÙưÀÅ«ÚÑ´9¥‡äÖ +™Á—¶ÙÚ™‰kß [ïS©Ç¥Á±»ƒvàËÇ×ƠÏԼثԫ‡“Íj‹ÜÛ«‚ ½9ºÁ½÷‡«‡“Íjù×ëö©‡¥2ßëM™Ó—¶Û×™‰kß [ïSÛ«‚ ½9߈˜ơÿ.öá ¿8¤‡Ö àö£Ó£äÚª‚ +¼9ëöøê¿½ưÙÑà³Øƒv÷ÚéÙŒë*«ŸÖ¬È°¿ßÄÙơꇌÿÜÁÇ÷ˆ«‡“ÍjăˆŸ;ß»û›¾ù×Û«‚ ½9ï»…Ö߈¹½™‰kß [ïSÊÇ߈߈™‰kß [ïS¡ƯéÓƯ‰ơꘉj̃ZîSơÔéÓ§ăêÏÅ÷å5ÓºƯ‰³Ÿ\Úª‚ +¼9ƒØ½Ÿ‰̃ˆăơăˆŸ;kƒv¨‡¤2€̃êL·&©‡¥2ßëMÓ—«»©Ø߈å»ÍƠË%ÛºŽ¼€•ŒÙ½‡›Ú½ùê·‡‘×8ç߈­v߈ùêÑÓ±»ç­¹ÚÙ½̃ˆ÷îăêÏñ®Æ±»çºŸÄ™‹ưÀÙÚ«¼‡»Æ£Ø‡Œ§ôÍéӉ¿I¯È‡Ç±»̃ˆÁéÚ×ËƠ×ƠßÖ›Ú¡Ô¼Ơ†“ÖØăˆŸ;ăàÙ½”Ľô©‡¥2ßëMăˆŸ;këöăˆŸ;kÏÔ­Ÿ}Ù½ív¼á“¹ƯN¥‰ÍL…ºËÉ9ëö—ŒÏÔëÔ¹µ!·¼Í7Îç®Ù½ÙÜùôĂñ»ÏÔÀĂƠÄëöĂÖ“Æơê™ÔǽƠëù×Ǻ‹Üٽٽ°»äŒ¾NăˆŸ;íơăÁéºéêíÖ¡ÔÙÚóăÛÄÓăˆŸ;¹Ú­Öûºù;ëÊóDZԥÓÙ½ưÀđÓ¹Ú‹Û­Öơꩇ¥2ßëMƒ×¾¿ÀǺÇ"ÑÓ›¶éଫчx³Â™‰kß [ïSçÚ߈ưÀƒÖ©ÓùסÓÿÔ±»ù×ñÓÁËëöơêçÚù×™‡ơ»¦È‡ñ»ÄẲ§Ó±»ăàÙ¡÷Ù«Ñå̉ «Ô±»ÏÅ•ï9¥‡ù×ü꛾»ĂË̉ù×ù×÷½ׯª»ăˆŸ;±»Û«‚ ½9ƒvŸŒ©Ø«ƠÎű»ơèÅ™‡“…ù×¶©߈­v÷Úƒ‹Üñ‡çÚưÀ¶º¡Ç›¾ưÀ–Ó£ÔƠ—»ÏỖˆؽÙ€¾ÏÔ¿‰Ùڵث·3uUó‡ÛÏ̉Ç»Ư‰ƒ½ơêĂÈ™ÔÏųƒ–¶½ñÓï½ß»ûÛ«‚ ½9ÛÀ™ôÿ¯¶ÙÜƒØź¥ˆ]1Û«‚ ½9Ï̉߈Á̉“Ơ×Ơÿ›¾­Ốº£ ĂȶÔñÆø×¸½‹°˱ăˆŸ;öÔÓº•éº8¤‡ƠỗÚ©¼9¥‡ƒvĐØÛ«‚ ½9ívÛ«‚ ½9Ç¥Ûº›¾ÔX5¡é±çÚ¯¼¡ƠăˆŸÁ©¼Ž±”Ăȼ™‹ª‡’̀j§Óơê¸ÚĂƠÏÔ¿‰†½¤ÆèÛׇOÑÄëƒÔ™‰kß [ïSưÀ™‰kß [ïS¥<›vƯrúÀG½¹—»œÜ—¶đÓ +ƒÚ¡ơºƠX‹Ç¹Ơ—¶ôêÙÚçÚØŒê*ª±»߈€ÄÏÔ¸Ú³¶±»ÛƯă¼Óسºó§ô½Èù×µ†¥Ó߈±»ù×ÁẮvè‰đ5đ¶œ‰¾IĂÈ«‡“Íj¥Ûºơê/ÁÜÿÚỔ—¾±»ëö‡¿9¥‡́Ø“º¡Áà×#ù× ø·Å“ÆïÁ›Úđ̉‹Ó߈Û«‚ ½9̉º©ÓÏ̉Ơ¹Ú±»ƠÛÇ߈ĂÙûµöƒvƯ‰¼‹ÜÆÚºó¶ÇÖ÷å5Ó™Øù×½€©‡¥2ßëMívë¹ưÀç̃ɇăê½߈ÏÅ¿Åùד×Û×çâö₫ÚĂÙ£¤µØ÷ÁåĂ½ÿ$ÇÖáêÏԵؽ€­|Ơ¤™‰kß [ïS‹ÇăˆŸ;k¾‰¿Iª‡’̀jô±»™‰kß [ïSûÓ«‡“Íj₫®¶©Ó‡ñ5ÍË)éÛ9¥×Ă™‰kß [ïSơÔÛ«‚ ½9Úª‚ +¼9Ăô¤ÛÿÚ±»Ï̉ưÀ÷ÔóÂÙ½ơêé‡ؽâöÛ×̣'ĂÈçÚ߈±È·‡‘×8çăà˜Á—¶™ơÁë¥Óº›¶é«ÔÁ½³b»»ËÉ9±”ù×ƠÚÄÓĂÙ«»±»ö½÷‡ĂÙƒ£ÓĂù×ôY¾ăˆŸ;…حıÇÖ«»º¿×Á|ûơê»~Ù½Ơ'³È„Û«‚ ½9…ô­vÅƠXçôƒvăˆŸ;k™‡ăˆŸ;ƒÔ…»‡Ç̀Ó¯*¾ăˆŸ½Ô߈±»µØĂÙ™‰kß [ïSÙÛ«‚ ½9±»°»Û«‚ ½9¾·‡‘×8çôꙋ߈ÁƯ™‰kß [ïS߈²Øú«‡“ÍjĂ¾«‡“ÍjÂÑÓ–»G½¹ùºƒ½ơêÚ×ÿÚ¹ÚƯÓ “Ơ߈ơº•×öÙƠ›¶é»‡ÿ×éºôĽƒv«Óщß»ûè‰ đ5  đ ¶ ›¶é±»߈ăº™‰kß [ïSÛ«‚ ½9ăˆŸ;›vưÀ¡ÁíÙëöɇàö½רß»ûÏÔÓ ‹›æ¹½߈đÖëö¹ÁÏÅ®Ơß„߈çÚŸäƯÓ ĂƠç̃¬¾“Ơ›¾‡ù×áÀï²2Ó«‡“ÍjÓØ˜‰ +j +̃ + + + +Z +îS +ăÑêöăà«·3uUëöív«‡“Íj׿8ÏÔÅnĂÙÅØñßÙÚÿ‰Û«‚ ½9›¾ƒ»½g̃ˆ̃„ÏÅóµaíưÙ×Úª‚ +¼9Ù̉°»ĂÙáuă*³àÀÛăÁĂهdzÇÏŧӫӫ‡“Íj±¿µa›YË̉ù׿‰‰Û½¡Á«‡“Íjù×ÙÚ›¶é¥ˆ]1ÏԵ؇ŒüÚƠXëö™‰kß [ïSăˆŸ;ß»û¿¹«‡“Íj9¥‡ùá¥Ú›¾ƒˆÍÓ½‡Œ›wôê +ۺ߄½×¿8±»ËÉ9—»™‡•ŒßÚÄÓơêÏÔ…b™‰kß [ïSÙÚçÚÑ·ÁƯÛÀÙ½ăˆŸ;ÍĂëöçڨǡÔÏă¾‘³ºóóÂëö¿́ÿ×ăˆŸă®ơèÅƠư­̀Ê)èÛ8¤“ÿÚÏÔÛ×ƠÄĂº£Øô¹ÚÙàƒÅÛ×­Ä9¥‡̃ÄØ߈ỞăĂ3ëöăˆŸ;k§Óôɇêöÿ½ÏÄ·‡‘×8ç©ÜÜëö—ˆÅÓù׫ÚׯôêÛº©‡¥2ßëMº½¯G‹øÙÚ£ çÇ‘ÑÓ½ƒØ™‰kß [ïSă»™‰kß [ïSÙ½ÙÜơêͼ‘Æ™‡µÜñÓµØÇ¹!•{߈ơĂÅô“ÿÂÓØ߈£‡ù¼çÚÚª‚ +¼9ç'“ÆăˆŸ;k¶ô½°»Ú́Ƨô»ˆ•࿽‡“χßÄÙưÀƒv8¤‡“¼©ØÛ«‚ ½9ÅØÏÅ»ØÏÅ©-¼î«Ô«Ô›¾Á¹™‰kß [ïS¡ÛÙÚÛÀçÚ™‰kß [ïSÓØ«»ï+ÎƒÖÆÙ½ưÀèºÙ½߈•½ÑØ¿ñæÚߌÛ,ưÀ£X¥ØË¿€Ơ®Gø­ÄŸÖ¹Ú’Ơ›¾óÑóÿÂóÔ¦ôÛ«‚ ½9Ë%ơ‡ôÛ«‚ ½9¨‡¤2€̃êLù׃vó–‹Èöä5̉»9¥‡’¹ÜNáÛå̉ ›Ú₫®¶ÇÖăˆŸ;¿́ÇÖÅÓµôƠÏÅ“ƠçÚ—Ó½₫®¶¥ÛË%9¥‡×ÅÔÀĂ ×ÓÍË)éÛ9¥™‰kß [ïSéJé‰Ó5“gesÁŃˆÍƠ¶§ÓÙÚÿ¯¶¡ÔÓØÍË)éÛ9¥ƒˆÓØÄnưÀ߈©Çæ̉¡ÁÅÀ…ÖÛ«‚ ½9“ȋǭ¾ßÁ±»ư ©Ó½Ú׃ˆ₫®¶ÛÄÓ‹Ü”‹ùꃰ¿ƒv•ŒÏű»½¿»̀Ó ƒ§È«Ôƒv‹½§áù׺ăà¾ưÇǫ‡“Íjơê†ảº½ÚÇ¿́ÿ¯¶âÄăƯ¶è™‰kß [ïSÍË)éÛ9¥ơèÅ«‡“Íj»Ø™‰kß [ïSÛ«‚ ½9ÙÚß»û½gƒvÏÔ¬ÖëÚĂÙÏÔƒà—»ÿ¯¶½×¾ÏÅÚ× +Ç¡Áɇÿđ߈ÙYÏÔ›¶éï½ÏÔ¹Ú±»ăų·̃ưÀï"ßÁ·ÜôĂ߈¥ÁËƠ§gß»û—¨½ôƠù×û—Óº‚ÙÚ¢ƠơêÛ«‚ ½9û؉¿I«‡“ÍjåÁù×£äш™‰kß [ïS™Á™‰kß [ïSéêÑÓ‡ŒëÉÁƯ¡ƯíJ°»߈ͼ™‰kß [ïS×ñá꛾£»߈‹ÇÏÔ½Èù×™‰kß [ïSøê ÛǼÁ,…ؽóÔ›¾Ư¾ÿÛ­Ä«»©‡¥2ßëM™‰kß [ïSÇÖ÷Úö«Ô߈×ƠÚª‚ +¼9½ô“ƠÜÿÚơèÅ߈Éñ»Ûˆ·ÅăˆŸ;£Çëöâˆ:jß»û±»Ÿ}÷ÁÙÅëϺňùׂv­Ø™‡8¤‡×ÓØ™ØÏÅÓÔÛÔÜùת»Úª‚ +¼9¿‰ÓƧؕÈû›™ÁG½¹±ëةǽ™‰kß [ïSĐÄêó¶ưÀ߈ƯÓ ̉ƃvÏÔăˆŸ;ÏÔ±»ƯµØ°»ë‡¡Ô߈ÓÆ°»©¼“ºÙ½³ÂĂÙÏůȡԱ»ÙÅë§Ô‡ŒÄÓ9¥‡ƠŤÅÉÙÚ±»ơÔưÀ“ÈÑÓăÇ퇗ÓÏ̉ù×ß»ûÛ×Ơ—ˆßÄÙĂÈá ÅÔ«ÔÂÙ½Û«‚ ½9ǼĐÄêñÓ½Û«‚ ½9ơÔ° ù׉Ûëö™ëé嫇“Íjëöï»÷$ơÔíÚ®ÈÁƯÅ«‡“Íjơ꨺ŗ¾Ă¹¶ÅÆÛ«‚ ½9åÁµÜ½ÑÁ̃ŒÚ,¹ØÆÖưÀù×߈³»y„a ³ ½€­Ä±ëØ…öăơéÜÙÚßă°»±»»‡ÓÁëơQÛ«‚ ½9Á½ơꙉkß [ïSåĂ•ÇÀ½߈ëÔù×ÏÔǺ£ä¿€ùׇº«‡“Íj™‰kß [ïSó¶‚Û«‚ ½9äÁëö¿à«‡“Íj¶Ô“µØđ©‡¥2ßëMÿ×ÿÚùש¼¡Ôơêö»ÁߌÛ,ùơ²Ø›¾½éê÷ÙÁÓ¡ÔÑĂG½¹ª‡’̀j½ËÇ—ÓñÆăˆŸ;߈­Ä“Âù×·‡‘×8çëöơê‚׃vơêﻵØá í—GÛ«‚ ½9߈ׯÑÅ«‡“Íjé‡ÿ׫‡“Íj¥lơOÂÙ‡äÎźÏÅÿÚĂƠ‡º±›9¥‡ÁÆÖ¾‡›¶é¾™ô‡Œ›v°»߈ƠX—»ÛºÏÔø¿âÁ“½ưÀщ“ÈàƠö›¶é“ƠÏÅå̉ ƒvĂÈÑÓöÔơÁ ăˆŸ;‡xù×Ổ€“¹ƯNăêÚÀÛ«‚ ½9ù×·Ô¹Úÿ˜ÏÅåÁÏÔñƠ¶£ö§ôÿÂø¿ÛºÙÜ»ô±½™Á½€°»ñÆơÄÛ«‚ ½9ÍÓăˆŸ;…ÖI©¼ĂÙ±ëð›ÔßÚ߈™‰kß [ïSâ‚ÍÓ¬ÔÇÖÏÔ«Ú´a£ê«‡“Íj™ô±»߈«Ú£Ô­Ä¥¼Û«‚ ½9¼€÷ÔüÀ°»ÑĂíơ«‡“Íjƒ×÷ÔÛ«‚ ½9ñÓÓÆÛ×̣¶Ï̉«‡“Íj·Øù¿‡Œ½߈ÙÅë¶ỒªÛ×Ϲ9¥‡¸Ú¢äçZÛ×½8¤‡Ë̉·Ô߈…Ö߈ù×›¾ĂÆÍÓ߈Ϻ­Ö£äψ¬¼¼£»¥±Û«‚ ½9ù¿±»ƯÓ «‡“Íjíơ¡ÛƠưÀؽ½ùê߈¹Ú·ô€ñÚóÇ÷ԟ֓ƬÔû¼÷‡¥Óù×ăˆŸăêÓº‚vÿÚăˆŸ;̉Á(÷Á±»ÏÅíÖµØß»û§€³È©¼ª»ÏÅé߈ùטÁăˆŸ;v9¥‡ÑÓÎŵسÇëö %º¨¼éêźêÖÓ̉ÏÅÖØf³Ơùơ°»‹ÜÓº°»Ø×“öÿ׺ÅÔÚ¹ÚăˆŸùê¶›#¡3© Ñ%­’ûÖߌÛ,¡Ø©Âº½›¾¿‰™‰kß [ïSÛ«‚ ½9£ØăˆŸÿ¿ăˆŸ;kÛ«‚ ½9±»•飨±»«Ôù×ù×¹«·3uUÏ̉ù×Û«‚ ½9½½»‡ƒÖØŒê*ª¿ßăˆŸéê·Ø8¤‡×‡ÇÇÖŸÅ‚v9¥‡Ù×ÍÄóǯ¼±»éÓ×¾ĂÓÙŒë*«Ơáٽ߻ûù×™Ó‹ÇÓ̉ĂÙơ꛾±»«ëå̉ Û«‚ ½9ׇ½7퇓×ÏÔ9¥‡¿ºù׋ܛ¾âˆ½ơÔ©Ø¡ŸÓ̉Ù½9¥‡Ù½©Ó…Ö±»ù×Ơ¼ƠXù×Ïı»ÇÖßÄÙ¿‰ù×¶É̉¿‰ù×óÏÅ—¾ĂÙå̃¹Ú›¾÷Á¾‰ăˆŸ;‹È“Ơ±»Û«‚ ½9ܘ‰ +j +̃ + + + +Z +îS +«Ô™ºÛ¾†Ç±»ͽưÀ«‡“Íj¿ûƠ™‡ïÁ™‰kß [ïS×ÂÇ»ñƋܢ侇׃vá´ÁÛăà̀ÓơĂ“Ơ³×ăˆŸ½ëö«‡“Íj‹ÇëöµØ¸ÚÁă߈Á½߈›Ú釕%§ƠéÚ£ä©Ơ«‡“ÍjơêÁ¿¹9¥‡ă¤Û ù×ù׻ؙ‰kß [ïS¡ƠÖÆùæ—Ó߈ËÇ›¾“Æëç9¥‡°»™‰kß [ïS¼«‡“Íj9¥‡ÿÂĂÙ®¼ ÿ¯¶߈›¾ƒvĂÙ™ëéåơÔùơ߈Ở«‡“Íj“Ơ™‰kß [ïS߈›¡‡ÚơếÁéôƯºóÇϺĂº‹ÜÁ¹ï½Ñ掜Á‡xµØÙ½Ž½ơÔ½€ä̉ÿÚ±»ñÓÙÚß»û½ù¿‰¿I…n½Ôƒ×ÿÚÁƯ‚ÙÚ©ÓÊÓù×·‡‘×8çăˆŸ¿Ô—º½ÓÅ›¾—¶çÚù×í}Ž‚«·3uUửù×ÏÅÛ׋ӽáâ÷¨ưÚó«ÔƠ€¾™‰kß [ïS˜‰ j ̃    Z îS Ù½ÁĂÙÚ̀Ó˜ÁŽº÷ä5̉ơÔ‹ÈĂÙëÚרëö‡x‹Ü¼Ø˜‰j̃ZîSăˆŸ;…½߈ÑË̀Ê)èÛ8¤½€™‰kß [ïSâ±»Ûº¾ÅÙ½áê½đÁƒvƠ°»Ù½»Ø™‡ß»ûơÔ›¾åôóô9¥‡Û«‚ ½9߈±»Û«‚ ½9ŸÖ̀¬HÏÔĂÙ¾8¤‡Àù×¶±»ÑÁ¡È›Ûï‡ăˆŸµ‰°»¼ÙY©Ó½»Øëö—¶ßÁçô­¾Û«‚ ½9߈ÏÅÑÓÇÖ·Ó ¥0“ÆDÏÔú(ÿ¯¶›¾Đ¹Ö߈¡ÈÉ̉œ‡Úª‚ +¼9ĐÓ™ëéåÅ–½ÔÛ¹ÏÔ‰¿IÏÔ±”ÏŬÔăˆŸ±»ƒ¾‘ù×Á½—¶Û«‚ ½9÷Á¥ÇĂÁ|éÓ‡Œ·Ô3µǾơăÚ‡ÛÑÓÍÓßÛ«‚ ½9·Ô“ƠÀ¹…ÚûƠ±»±»½Ăß»û·‡‘×8çÚÀ µØÏźÛÀÏĂĂơúù×ÍĂơ꫇“ÍjÖ +Ô† +6 +¦j +ƒÖ£èù×ÿ¯¶ë±”½ơ껇ӫâăˆŸ;këÓ́Á»ØùתdóÄ‹"œ×‹Ç«»߈ÁÛÄÔ‹ÜRÎÔ߈ÏÔѦ߈„ÇÙÚ±»…Û“±»«‡“ÍjÏÔ·º9¥‡™‡«‡“Íjù×Û×±»ûœô›¾ó“ÆÅŃvÜôê«»‰Á«‡“ÍjëöâÁ»±»9¥‡ÑĂù×»ô“Æ£äïÚÅÀ™ÛÛ«‚ ½9󫇓Íj߈ÂåĂ÷Á—ο»¯ÜÔơưÀ±»¶èó†ºô ¸Ú·‡‘×8çé‡ëö¿Åæơƒ½ËÉ9›¶éăˆŸ;Ơ±»ƠñÆơêÏԵœ¹ƯNƒv›¶é‡º™‰kß [ïSÏÅ߈ºØ))Ï̉éÓ‡º‘‰ù×ÅØñÓ߈™‰kß [ïS«·3uU£X‡9¥‡·̣Û«‚ ½9̀Óá§¢äëö½¾‡Ù×Û«‚ ½9èáư«‡“Íj•ŒôÙ×§ô±»ÏÅ™‰kß [ïSÛ«‚ ½9…¾ÆĂĂÛ«‚ ½9¥Ççm«‡“ÍjµÜ™‡̣¹ñÓÙڢءÈÛ«‚ ½9¿ôăˆŸưÀ—»«‡“Íj«Ô³ÈíÙßÚß„•ŒñÖªÔÏơêÅØÅ…ƠûƠºµĂÑÓÿ×”÷§¹¯àúÓäÁ¡ÔăˆŸ‘í‡₫®¶ûăí¥¡ÛăˆŸ;˜‰j̃ZîSºù¿߈ÎÏÅù×…ŒÍƠ›¶éÙÚù×ÓZÑ+ׯ—¾ăˆŸ·ºï½÷‡ÅÛ×ÙÜ®™‰kß [ïS‹ÜͼñÓù×™‰kß [ïS«‡“ÍjÛÚ½Ï̉•ƒ¾‘á=Ö¾×¾߈›¾†“Ç̉áêÛ«‚ ½9ôÙ½Úª‚ +¼9G½¹áƠÍÄ»ßÏÔ˜‰j̃ZîSù×₫ÚăˆŸ;ÅØŸÈ»ÅÿÇÿ¯¶º¼Áù׫‡“Íj§¿¹·Å†ÇÚÀ=‡ºƒØ½€¿º³1ŽÙ½µå̉ •ŒÇÓ«&ÁĂÛÚ·‡‘×8çĂĂœÔª¶2tTơÔÑÓ‰¾ÿÚÍË)éÛ9¥°»ñơÔ“Èχƒ×à=ƒÚ…Ơ¶Ü“Ơ©¼¹Ú©ˆ³ÆÅàÛºµê§ÔÓ—ăˆŸ;ÙŒë*«Á¹ƒvÂèá ƒvÅØ­Ôÿ¯¶ïÁƒÔ±½ù×ø×ơêăˆŸ·€çÚ·Ô½ÔÁ½¹¼ÏÄ•Èû›ÙÅë½߈ׯ­Ä½ơÔ›¾Ÿ}Ï̉£È±»ỞׯÅô⽃vø×¹Úù¿©ÓÅ÷‡“ÈŽ¹ÚçÚưÀĂô8 ¤‡ 9¥‡̃ˆƒvëöºÖ¾ûÓ™‡ƠÁË·Ô±»ÛׇèÛ«‚ ½9öï³2ơÔơÅ™‡¼™‰kß [ïS«ÔÛ«‚ ½9ƒˆƒˆ«‡“ÍjăˆŸ₫®¶™‰kß [ïSĂ߈ĂĂ ›­±àéMƠÄÙÓÏÅ«Ỗˆ±»»ØÀ̉%•×™‰kß [ïS…»ͼ«ÔêÓ±»ÍÄ¿Ù÷ÁÛ«‚ ½9Û«‚ ½9½—¶ưˆÁ½ÏÔ§ô±»©ˆ¡Á´'ÚÄ̉ÅØ߈Ơ“Íjͽ‡›¾±»ăˆŸÓŇŒ±»‡Œ¹ÚÅŒĂ»Á±»ÍÄö›¾Ă«·3uU³zơÔƠÄÎ́vÛÆÀƯ÷‡¡Ûơê±½ơêơÔăˆŸ;«Ô…™‰kß [ïSæÚñÚ¿ÅĂÙÛ«‚ ½9ơê“ÆÛÄÓÿÚ«»ç̉×̉ÍÓ¡Ôµa¹Úă™Ó¡%ĂØ8¤‡±»Éäơ¼ÔâˆçÚŸ·“Ăº­ÄƒØ½™‰kß [ïṢÿ¯¶ƒvơÄëÛË¿ïƠÍÓƯº%©Óƒ¸ÚÖơê©Ø·‡‘×8çÑÄëßÖÈçڟȃv¡ÁïôÙÚưÀùêưÀ¾ĂÙºư‡±ù1ăˆŸ;©h«‡“Íjƒ×ÛÖ¹ù¿½߈óÇÛ«‚ ½9ù×ôù×¥Æáö…ؽôƯºÑÏ«‡“Íj±»ëö¿ßơê½ôà=ƒÚăÖØ×ÛÆ¶!!‡ŒÇ÷­½¼¿ßÛ׫·3uUƒvÏô·Ó ¥0ËÇ̃ˆ÷Á”Œ ½Ÿ}¿ôß́ÁĂ©¼«»‘é÷‡¼×¾•{ëö•–È ĂȽ™öâˆÅÓÍ­Hù×ÏÅ÷ÁöÀµØ¹Ú¼€óëÓ߈ÓÆרưºÇÅÛÄÓ—»ăˆŸ;k»&ĂÏÅÅÄß§Á̉Ơ߈±»±»“Æ߈ñÚûƠăˆŸĂÙ÷Á™‰kß [ïSï»ÿÛ„Ö™Á™‰kß [ïS¨ÈơÔ“¤±»íêƯº÷ÁÛןŕÛçƯÏÅưÀ©ÀË%‡Œƒ Î̉đÄỞν‹øƒÚçZëöư‡±ù1Ươ÷ˆơêŽÙÚ±»…ÔëÚ™ëéå½È½ë‰¾ù×̃ˆ»‡™Ó™Áù×ăÁÇ%ôƒ×“DZ»ơÔ³ºó†Úµå‡‰đû’Ï̉ĂºƠ›¾™‰kß [ïSë³”Ẩ·‡‘×8ç9¥‡Û«‚ ½9Ơ×ôơêßÄÙͼƒ¾‘ÏÔµ•«·3uU˜‰ j ̃    Z îS ùê§ßßÚĂÈчÛ«‚ ½9±½ÑÁæív8¤‡ñÆà¬™ơ¿ºĂÚª‚ +¼9˜êèäßÛ÷Á¢ÈA“½ï»«‡“Íj¼«»åÇØƒvăÇíÓµOƒvñÖøêÏÄĂÙ‚v9¥‡×ăơÚÀ»ˆ¯‰¯0±»ơê±»¹Ú­Ö«ÔẸ́̉ÇÙÚ™‰kß [ïSÑó½߈·‡‘×8çơểÅ êö½ăˆŸƒv߈‰̃¸È̃ăˆŸ±»£Ø“Æ % +Û‘Óó°»çôăˆŸ;̃ˆŸ\ÏÔµØƠÛ«‚ ½9ƒvâà߈¡ÛëöÙÜơÔ±»ù$´Ø±»»ˆ‡ÛË̉Ç>¸Úµ†ÍÄóǓǂ־§¹ÅØ«ÔĂÿÚ†º‹ÇƯ¸±»Û«‚ ½9ÑÄëöÁƠ°½ƠÁß»û9¥‡™‰kß [ïS¹ÈÓù×Ởëö÷ÁÏÅëö‚×ívÖ¼»µØ¥ˆ]1…ƠơĂƠ¢ÇÛ«‚ ½9½°»ÍË)éÛ9¥¹'ëö³³Ó±»ùê½€±»éêÛ×™‡ÿ¯¶‡ƒ¯ÛăˆŸØYÛÀÏ̉±»ÙÚ·‡‘×8çöÏÔÛ«‚ ½9ß»ûƒÚéÓÏÄÏ̉ơèÅ«‡“Íjív§Ô˜‰j̃ZîSù¾ỂçÀ‘́á¼Ởđ½Ï̉·‡ÙŒë*«§ÔÁƯ±»̀ÄÙÚŸˆÔX߈g¯áƠŸÅ¹Ú£Ø…»ơêÛÀ©“Æß»û«LǼ§¸ÁûÖ¿́·Å½ÖĂ‚Ù½ÍÓáÛƠ¡ÔÉ'߈ü¶éÓ‹Ùµؽ߈ǺÑÓà9¥‡ù×±”ƒv™‰kß [ïS¿‰ơèÅÁ‡é/×:ÿ¯¶ÙŒë*«ĂÙ‡¡ÈÅÄ«ÔÚª‚ +¼9™‡ϼ Ơ9¥‡ÀÓáꉿIƒv±»«‡“Íj‡ñ5ï½Ù½÷$«‡“ÍjÛ«‚ ½9©£äø×©‡¥2ßëMå̃“ƠµØÛº£ÔÇÖÄĂª»§ÔƠ×Ơ†7§j¦Ô߈ơ‡§ÔăˆŸ;×Ơ˜‰j̃ZîS߈ÅÓ߈߈÷ˆº«‡“Íj—¶½ÑÄë¿ôÆĂß»ûŸÈï½ø×™‰kß [ïSÖÔ†6¦j½·ÔÑÓ…ÛÁ×߈굨÷å5ÓëÔÁẴˆù׃ˆƠîăˆŸ;μÏÔ¹ÚívÜñÆщƯÓ ÁƯ³ÂÛ«‚ ½9«‡“ÍjǽĂăˆŸû÷ÙÏÔÅ™‡«‡“Íj¹ Ù½ù×ù×ßÄٽ麌uç‹âÛ«‚ ½9›Ơ߈°»éÓ½†Ú£ä‰ÔË֭Ĺګ·3uU·‹¡Ç¥ĐÏÔ†ÚÙŒë*«ûÁƯ“Æ£Ơơêß»ûØÅêzùׂÆĂÇÖ…Ö¡Ô«‡“Íj’¹ÜN¡ÔăÁÓÅöÑÓùêÀ¹ÆØ߈™‰kß [ïS¹ÁÇÖÙŒë*«©Ø÷Ùë¼›¾ßÖÀ¹ơê™ÔƠ·Åƒˆ¡\º߈߈©Ó±»™‰kß [ïSÓÅµØø›¶éË̉ÂÛ«‚ ½9ƒÅÄăˆŸ;ºăˆŸ;kûÈƠÙ½ψ­Ö«‡“Íj½ƒv­¼ÅÄ…Ơ₫®¶½Û«‚ ½9Ï¥éêÛ«‚ ½9ù×í½ëö«‡“ÍjÎÅÛÀăˆŸ;«»ƠÚÀ"±¿ơèÅéÓ÷Áù×±»ëöç̉‹ÇŒƠɘÖÆĂȽ¯¾ÛÄÓÏÔ‰Ô“ËÏ̉è½µØß„¿»£Ø‚½Ïű»…»ß»û́ơ —ă©ƠóÙܱ¿½˜ ê è ä ¬¾›¶é߈·Ô±»߈ß§ôç½ơÖơêÿÛÛ«‚ ½9ºçØÉ̉Ïųÿ¯¶ƠXÛ«‚ ½9­¾ÇÖ·ÔƠX…Ơ˜êèä´ÀºÅÿ¯¶·̣½íêĂ¼™Á†Œẳ÷Á—ºÿÛß»û×ù½©‡¥2ßëMđÇ¡\Û«‚ ½9“Ơ°»ăˆŸ;߈‡Œ¹ưÀÍÓƒˆå¿ñơêù×±»Ă·Ô§Ô¢äéꙉkß [ïSÙ×ăˆŸ»ØÛ«‚ ½9̉źƒˆǼăˆŸ‚vĂƠ™‰kß [ïSÍÄ—¶€¼½îƠ¾GÏÄ÷‡ø×ù×¹Ú«‡“Íj•½ÑÓºÁûƠï½±»ϹÁ ×¾»ºñÓ›¶éĂÙíÁßÄÙ§ÓÙש‡¥2ßëMơÔ«‡“ÍjíZ«‡“Íj‰ùÁõØ÷Á§Ô߈ơéùöëöÛ׿ ‡îÙÚ÷ûÛ«‚ ½9½€ƒv…Ô¡Ô½çÚ·‡‘×8ç©ÀÏÅ™‰kß [ïS—øßÄÙ·ÜÓ¾«Ôß»ûÁÉÔÙ½ăˆŸ;‚ưÀËÉ9ÛÇÁƯ½¶Å–ËƠŸ́8¤‡Ö•×ÁùôăˆŸ;k¡Ô¿çÇÖư“8 ¤‡ ù×ÙÚÛ«‚ ½9£ä›¾™‡ÍÓ«ÔÁÛ«‚ ½9·§D ÿ×™‰kß [ïS¡£Ø·Ôù×ÂÑÄë‹ÙáÚ“Û©¾ºÿÚß'đÛùטÁ½ŽÛºÂÙÀ½³ØÅØ™‰kß [ïS£Ø9¥‡ºϺÑ%ưÀăº“°Ûº½êÚÛ«‚ ½9ÓµOß +±»Åô´À¹ÚßÄÙ̉¾µØ¹ÚÜ™‡߈‹Ç߈ù×ùÙÚßÚëö—ÓÙׇ“£ä›¾“ÈåןÈÿ¯¶ëö£äơêÛ×ÇÖϼ½È©Ü²Èÿ̃Á̉ăˆŸ;kÏÔëö¿‰Ø©º«&«‡“Íj½¾£‡—˜ƠÏŽ¦Ô½½Á̉ÆØÿ¯¶Ï̉Û«‚ ½9ƒv¿»߈¥à·ÔͽçƠÏŇÑÄëŸ}°¿$ÏÅÙ½Ïı»Ă¼ơÔƒˆÓØ÷ơÛ«‚ ½9—»ÏßăˆŸ߈ƒ½º¼“ÈÅnÏ̉¯¾³ºó₫ù×ñÖˆƠÏ̉ưÀỞ¥Æ±»«‡“ÍjÛ«‚ ½9«‡“Íj«Ô­Ö½ù¿™‰kß [ïS¿ô±»ơêÏÅăơ¹Ú³Â·‡‘×8çT˜‰j̃ZîSÏÅçÚôëöׯDz¡Ô«³ÚÀ ÓÆ‡Ú‡Œ™‡Ă½Äăàÿ¯¶½ô׿8ÛºÇÖÂÙåÁ¡Çó#ù×úĂ&¹ÚĂôÁ‡é/×:Ë¿ăˆŸ;¹Öö™‰kß [ïSźùơÛ«‚ ½9Úª‚ +¼9—ÓÏÄăà߈Û«‚ ½9ëö¿‰ñÚ¹Ú¤ÁÙŒë*«¿ØÛ«‚ ½9щơÔ¶ƠÄ·§D ź—Ó™‰kß [ïSÑÓ±½“Ơ×¾ÏÔÙÚ‹ÜÎ̉›¾9¥‡ĂÙ°»›¾˜‰j̃ZîSơềÓ˜‰j̃ZîSÑÓÅӡȳz½éÖ½ĂÙŒë*«¡ÈÙÚæƠưÀ•ûÓ£Ư˜‰j̃ZîSăˆŸƒ½»Ó̉º¡ÛÛºçÚđÆ¿‰ôÉgáÚôêÁƯưÀ•%ÏÄ“Ơ×Ẵˆ ߈°¿±Ë́ +–GI‹ÇÔ ¡öÔÏ̉§ô±»ăˆŸ;9¥‡×íÆ‡×ƒv9¥‡ù×·‡‘×8çöêרßÄÙ߈̀ƠûœÙŒë*«±»™‰kß [ïS›¶é§âÏ̉ù׵ػ½ÓÆ¿à߈‹¾ÍÄÛÄÓÍÆ×Öơêùê›ĂÛº·Ô߈߈ÇÖ©¼ÇØçÚơêÙ½̀Ç™‰kß [ïSÿÚ±€Û‡µØ‚v³ºóéÓĂÙÏÔïDÏÅ¶Ô£ÇźËÉ9©º̀Ó“Èëö¹Øơ꫇“Íj¥@çÚÚFùדƠ±¿Ó̉Ü‘Èÿ¯¶«‡“Íj»ÜƠ³ÈÂÖÙ½ä×̃¹¾щ̀ÓƒvÙ½ÏԋȽ߈ëÇÛÀÿ¯¶¾ÿ ¢ä—¶áØơÔ‡ÚÛ̃ÄØƒvÏÅ›¾ưÀă߸®ăơ†Çù×Ù×ßÄÙív廫·3uUÏÔËƠéêù×á ÿ¼Á¹χËÖ«‡“Íj¾å̉ ‚vÖÆñÓÇâù׋ÈÙ½½ª‡$’$̀j$9¥‡Û«‚ ½9ƒØ¿́ÏÔÿ¯¶™‰kß [ïSùë¥Ó¸ÚÓÅ…»øêưÀëÚĂ«ÚÙÚ·Åù×á ÍË)éÛ9¥ÁñÏÄôêÛº™‰kß [ïS߈ù¿±½ÏÄÍƠ›¶é†“ß»ûĂºăơÙŒë*«₫¥ˆ]1ăˆŸ;‰ÆéÓó¹ÚëöÛ«‚ ½9óÔ9¥‡Ăèöăàÿ¯¶«‡“Íj½€±»—¾ϼÏÔù׋ÇÁÛ°Á¡Ơ™‰kß [ïS½€ß»ûĂÙóÛ«‚ ½9±»ƠÏÀÓØưÁ­Ä«‡“ÍjÛ«‚ ½9“ƠưÀ›‰ƠíÖ¹ÚƒÏÔƠX½€ÏÅøê߈º¯ÈÖÆóÂÓ“çÔ¡çÚívëÚ«ÔƠ‡á››¶éƒˆÅÔÙ½ăˆŸ¼÷󈾿‰Á̉ß„ÚÙÅëÓÅר¾ƒ¾‘ă»óÔÔXăÁ¹Ë±»í꿉¿ôÇ̉ùơÔˆר½Û×ÎÚÙŒë*«ăˆŸÂ«ÔÛ«‚ ½9™‰kß [ïSÑæăˆŸ;±»ív­Äù×Á½“Æ‹ÇÚ×™‰kß [ïS—º̃ˆùס߃ˆ·‡‘×8çăˆŸ;êöĐÅóÇ©¼ù×¹ÚÏÔá µØ´ØưÀׯăˆŸ̀Ó¯±¿÷Áăơ«ỖˆùꇻĂÈǃv—˜9¥‡ĂÙĂÙù׫‡“Íj¡Ơµ¼Ưº«Ú­Öÿ’ÿ¯¶ëöµa×»¦±»ĂÙù×¾ơà‰¿I›»½÷Àơêɹöà¡‚߈©ˆăê’Æ ùêù×¥ˆ]1…™Ó÷Á㉖»¨Øù×ÏÔÉ¥Öå̉ ¡ƯÑÓ¶è߈寽ж©ÀÛדƠ߈ƒˆØÚă½ßÁ§ÔẲơÔ“Û¡Ç߈¿çÔºl‡Ç°»½€¹Úèô«‡“Íjª¶2tTÅÓ½°È½ñÓ™‰kß [ïSÍ́ïƠôÏÅ™‰kß [ïSÿ¯¶¼—¶ÛׯȂØÀĂ ưÀ¡ỢÇăˆŸ;ù×£XÅÓơꃌëöƼôê9¥‡£ ‹ß”èó¶ͽ±‡­€íÆ߈‹Ó“Ơщ›ÛÛ«‚ ½9÷$±½¤‰̀L„×ƠóÂ÷Á›¾´̣À‡€è/Ö:ÏÅ9¥‡å̉ Û™‰kß [ïSÓ—»‘Óù×ÙÚ±»—Ö©Ó߈ë™H‹Ü±»…Œù׎ñÚÛ×ñÓÓÆ©Ü߈ÅØ߈±»±¿óÇÑĂăàŸèív—¾ù×Ơù×—¿ƒv %ëöăˆŸưÀ˾Ù½ƒv™”±»ö»¿ƯƯ“ÆÙÚ§Ô½̃ÄØÙÜÍßù׳ºó÷Ạ́Ï̉“ƠØ×…»Û«‚ ½9Ǽ¾Á½R ³ÜÛ«‚ ½9Ö¾89¥‡‡Œéщơê߈«‡“Íj·q‹Ç¨ƠùêщƯÚ½™‰kß [ïS߈­¾ù×ÍỌ́Ă©‡¥2ßëM±»á ù׿‰¡Ôáê÷ÁÛ׃±»ïÚíêưÀÁƯù×ưÀÓØơԳư»8¤‡‹Ç9¥‡ª +¶ +2 +t +T +ÂÅÓ™‰kß [ïSăàöù×Ở«‡“Íjÿ¯¶©Øù×ăˆŸÑ·ÖߌÛ,Ù̉ô‡ÚÏỒÇ Ù½Á¼ÁƯÓ¾߈̉Å™©½½±»¾Ù½ƠÀ½©Ơ‘ÛăˆŸϼö¡ÓÆçï½²¹˜‰j̃ZîSƒĂóǺ„ÖÛ«‚ ½9ÓÅñ̃’Ơù×ù×’¹ÜNª‡’̀jă÷ơê·Ú¬Öº¿ËƠÁ‡é/×:ùêù׫‡“ÍjăˆŸ;ÑÄëƠÛ«‚ ½9¡Ô™‰kß [ïS£»Û«‚ ½9ÁÓ¥ÖÓÅÏÔ±»·ÔÜơëö“Ơ½«‡“Íjôê°È—¾÷‡߈ơÔ×ÂơÔ§Ô¯×ϯ¾ºÛ*©ÇĂÙÓŶívÁăˆŸ¹Ú¯È°»Ù×߈—Ó9¥‡³ÂÁ‡é/×:ÑØơÔÖ¾§ÔƒÔ™‰kß [ïSÙ½ÏÔƒv°»ơÔ÷Á¶Å‰ÔöÏÔ“Ơ»‹±»ŸÖ™ëé忉å̉ × §Ó÷ÁÍË)éÛ9¥ÿÚƒ…ÏÊÈ9ñÓÛ«‚ ½9Û«‚ ½9³Ü9¥‡ë̉ÎÔéÓÛ×·‡‘×8ç»yÛÀ«ÑÓÔùë¦Ô÷‡ÁĂÅÔ‹ÜăˆŸ;ăˆŸ;k¹Ú‹Ü›¶éƒˆŒĂºåôÛ«‚ ½9³·Ô‹Ü»Ø­Ä“Çå¯ÈéêÏÔ‹Ç÷Á‡Úå̉ ˹á=±¿±»½€ó^ĂÙ­ÄËÉ9ÓÁĂÛ«‚ ½9ëö† ÍÓ«́µØăˆŸ;kƒÚ¡»‹ÜÇÖÁƯ«ƠǼÚÀÛ«‚ ½9Ở½ë¹ÚùêÆÙÚßÖ¡Á‡ăàăàÇØû(±‡÷ÚĂ ÏŹÚ߈‹Ç߈ù×£íÓ̉ïÅ«‡“Íj˜êèäÙ½§…«âĐæÇÖù×¥ˆ]1ëö辯ÈÙ½́ÅÎÜéÓíÆ™‰kß [ïS™‰kß [ïS·Ôº³ù×ñÛơÔ™‰kß [ïSI™‰kß [ïS‚ÖÏŽÂȽÙ×·̣µØƠ…ƠăàçÚó×­ÄÎÔŸ}ÙƠưÀëöÍăØéÓéêáêƒØÍË)éÛ9¥ĂÈÏÅ/Ç—­½¼ëöׯ½ù¿ív©½߈ùׯÈơèÅÙÚÅÔ‡áêíÆÛ«‚ ½9ƒˆÇØ™‰kß [ïSêöÔXô߈çÚÙ½‹ÇÿÛ×$ßÄÙ«‡“Íjƒv«ÓĂº¿¹•Èû›§1™‰kß [ïSÛ«‚ ½9̃ˆíÖ¼¡Ô±»ÏԵةӣ䃽ÓÉÄơêûƠ¡ÔƒÛ¹Ú±»ÑÓñÚĂüÀ)›¾ơÔơèÅ߈á 9¥‡×ƒ¾‘™‰kß [ïSăà¹ÚñÖÙÚ‡Çÿ×Ă½“½߈Û×ơĂﻡ ¤Ç +ÿ¯¶߈ëö¿¹ŒA›·ÔóÇÅÔÅØ½—ŒđÖ·‡‘×8çưƯÛ«‚ ½9ßÁ·‡‘×8çÍÄ©¹Ú±»©ˆñÖ‡º™ÓÏÅíJ² ăˆŸ;ƠØÚ¡È›¹³Èù×½€»±¿ƒØívơêº̀ÇT₫®¶шù׵غÿ§³•Öö¥‰ÍL…Ǽ“½ñÓ·¯߈ăˆŸ;¡·‡‘×8çßÚ‹øÙ̉ϱ»ăà8¤‡×߈ %›vƯÓ ›¶éÁĂ¿‰߈Úª‚ +¼9¿‰“Ơ±»ÏÔÚ×í—G›¹÷Ù«‡“Íj­¾êÓ¶°»:¢Xª¶2tT¶ + +§ô±»Û«‚ ½9Ÿ}ÖÆ·¼Í7ѽٽÿ¯¶ï»Åå»ƯÚÏ̉ö¼ÔƠÑŸÈǼ…ơÎÔ«Ôû¹ÆÎÅăˆŸ߈îDéÓöơÄ™"™Ô½ÁËÇÿÂƠXÏŃv‡Ç¤ÆÛÄÓƯÓ ߈™‡ÙÚ›¡9¥‡§ô™‰kß [ïS\Úו×üÓ¿×ÇÛ«‚ ½9Û«‚ ½9ó×ÙÅë¡Ôëö±¿߈£äöëöÏÔÙ½ĂÂÙ½™Ô¨Ú½ÑƒÖ½«‡“ÍjĂÙûÓ•%׿8ử©¼©&´…Ø÷‡ơÔ÷‡È̉ñÓëÚÛ׬֫ԩ‡¥2ßëMÇÖÎăˆŸĂ½¡Á«‡“Íj¡Ø¡ÁëÁßÁĂÙŸÊÁƯ·Åͺ±»ÉÁƒ½ÏÔÏÔù×÷Á­vù×½ Ëûµ‰ƒĂơÔÁ½Åßív¹Ú¿ôÏÅ£äư§‡Û×ͽ±»åŒ¿N±»±»ÁĂÛ«‚ ½9©‡¥2ßëMºơ“Ơ˜‰j̃ZîS«‡“Íj÷ˆY«‡“Íj•ŒÙ×¼ïţ䫇“Íj¹Úâˆ;k‰đϳÜÛ«‚ ½9«‡“Íjÿ×ƠÄăˆŸ߈«‡“ÍjÏÔ÷Á匿NÏ›ç̉‹ÇóÇÿ¯¶9¥‡9¥‡ä̉½ôÑÓÛÀß„ö½ùרYÈĂ÷Á›¡½ô±»†Œ¬Ö°»ÅÓỞ·Ô÷ÁÜÓ“Ơ÷ÁµØרưÀ™‡ó£دȉ́±½ù×Ăö‡ŒçôÈ̉Ù½ĂÅ©‡¥2ßëM±»Ù½óÂ…Ô¡È÷Á¼€›ÀôĂƠù×™‰kß [ïSÖÔ†6¦jÍ噇ÙÓ‡Œđ©Ç•ÇÁĂûÓ‹ÇßÁ9¥‡߈Ó¼߈³âăˆŸÏԋǹÚơêß»û߈¥Ûß»û¹ØÙƠÁăÙ½†ÇÛ«‚ ½9Ÿ©ĂÙÛ«‚ ½9ÏÔ«‡“Íj©¼ŽŸ»¾߈ù×ăơ˜êèä°»˜‰j̃ZîSÑÄëăˆŸ;“½ÏÔÛ«‚ ½9Û«‚ ½9µƠ“ƠöêØŒê*ªĂ)ĂƠÏĺƒà•׫‡“Íj¹Ú™ô»½…ŒÓƃډÆåĂÜĂ1±»‡Œ˜êèä—ºëöÛ«‚ ½9¿‰«·3uU£Øɇ±»ÏÔå̉ ÑÄëÏÔÓèÁ¼ù×ưÀ±¿¿ßÏỐÆ¿́ÍÄÏÔ¢» +öÁĂƒvíÖÙ×»ˆă.ëö«Ú¿‰ưÀ¾™Û߈ÂĂù×ưÀÛ«‚ ½9™‰kß [ïS­¾›Û9¥‡×ï³2®GøÁƯÓºÛ«‚ ½9·‡‘×8ç«Óù×·̣»ØúƠ£ÔƠºm½›¾Åô÷Áù×¶èÎ|ëöÏÔÛ«‚ ½9¤ȫÔÑÄëÛ¡ÛăˆŸÊ¿“´÷Ú›¾¹ù×·‡‘×8çñÏÅ™Ôăê£äÛ«‚ ½99¥‡œ· ̉ ¤0 ÙY½ëö‡¿ëö™ôÄÔ¡È߈Íå̉ ÏŹöƯïÏÔÉĂÛÀù×ăÇíÙ½™‰kß [ïSùשÇÙÚéÓôÄÇÖ̀Ó åĂÛ«‚ ½9™‰kß [ïS¿ôù‡Ư¶µ.¥Ù̉̉áÛÑÛº¬ÄăˆŸ;×$ăˆŸ;ó#Ÿ}¾¾ÑÓÏ¥óÔÙ½Ăº ÁáƠ­ÄăÇíÙÚçÚµØÅ—¶ö¶§×ĂĂëÚ…Ô߈­Øù×ÿڧȳơۿôé¼¹ÚÙÚ˜‰j̃ZîSÏÔ÷Á¯Ù×IŸ}Ûß«‡“Íj½ÈÏơ»Ù½ÇØÁƯÿÚ›¾±»ÑĂ·‡‘×8ç¹ÚË̉‰¿I«‡“Íj߈Û«‚ ½9ù×™ơ˜‰j̃ZîSùשͼ©‡¥2ßëM­Ä…Ô­vôêÎŧ¹½ĂÙëÓ߈¸ÚÑæÇ»±»­Ö¿‰½^9¥‡«‡“ÍjÄÔÓ¾¹ÚÁƯøêË̉ù×÷‡›¾ÛÄÓ̀Ó¨"ÏßôɶÑÓùꘉj̃ZîS¥ÓÏÔÛ«‚ ½9“F§ôá å̉ «‡“Íj£»Û«‚ ½9£Ç©ØäĂê§ñÓÍBù×±»áƠÇÚÅÔ™‰kß [ïS¥½ơƒˆ˜‡ăˆŸ9¥‡ăı%ƠÛ«‚ ½9‘ơÑÓÛסøÂÖ ̀Ç¿ßß„½ï½¡È÷Á߈¡Ô«»¡Ó³ÁÏÅ›¾ÏÔ˜‰j̃ZîS›¾áºåŒ¿N½ƒàÛÄÓơêɇöÏÔÍÅÔÏÅÁĂ‡Ø‡ºùêĂĂ÷Ú·Å—»˜‡ÛÄÓÿ©Ó9¥‡›¶é´‰‰¿I¹ÁßÄÙï»­¾·ư­Ö«‡“Íj÷$§Ô‹đßƯï½é·®È›ŒưM˱¦ô‡Ïű»ù×ÔßÄÙơêù×ÅÅØ—ØóÂÑó½߈Åô»ƒv·‡‘×8ç߈³(‡Œ­Ö¹ÚáƠ8¤‡Öÿ¯¶¯Ơ©X°» Ơ™‰kß [ïSÄÓ÷ËÇå̉ ±»¦º¡ƯăˆŸ;Ù½ÇÖ«‡“ÍjƠX»Ǿ$¡È«Ô±»8¤‡·ô™‰kß [ïS“ºƒˆăˆŸ;› ¸ÚÎÔƒ¾‘ăˆŸỬÛ«‚ ½9©¼ơÔăàôö麽ȫ‡“Íj©9¥‡ƒ×º«‡“ÍjăˆŸ;kÛ«‚ ½9ăˆŸ;k§ Û«‚ ½9߈¿Å™‰kß [ïSÎÔ÷Ô«‡“Íjô›¡ơÔơèÅæÚµØ©ÇÛÄÓ«‡“ÍjÑÓ‡º÷Á™‡Åر»ù×÷‡­Äºá ™‡Ù߈ºÁ²½ù×ư%9¥‡Û«‚ ½9ø9¥‡ÓºăˆŸơêܭĨ‡¤2€̃êL–ŒïÁ›¾£äÉ̉½«ÔÛƒˆ«Ú»‡ëZ¡ÛăˆŸ;kƠX©ÜÚª‚ +¼9¶ÅƠ‡Çă»÷Á›¾–¾ +ËÇ«»÷Áÿ¯¶ùׯƯÓ Ïěڷ‡‘×8ç÷Á³ÂĂĂ ›­±àéMóÂö߈ÏÔåĂÛÚ‹ÇÂø™‰kß [ïS™‰kß [ïSÍÄ¿Ôăơù×ăˆŸö·‡‘×8ç±»ñÓ¹»«‡“ÍjŒ¾Û«‚ ½9Û«‚ ½98¤‡×ëö«Ô·Å±»gñÚº›¶é½áê‰Ô±»½ù×߈‹Çëö‹v±»ÛÀ«‡“ÍjÏÄÇÖ߈ÚƠíÚçÚơèųºóù×å̉ Ÿ}›¾˜‰j̃ZîS¿‰™‡Ăºơê¡%²ÚÏÅăˆŸÇÖăêßƯñÓܾĂÙ»Ă‹ÜßÄÙƒ½çÚÑÄë­Äù×̉ư»ñÚµØ½Û·Ó ¥0½ôëÔ™‰kß [ïS“¹ƯNøêø×Ó¾™‰kß [ïS¿º™ëéåơØ£ÇçØñ‰¿Iëöˆ¡ÔéÉ·Ó ¥0¥ÉÛ«‚ ½9Ï̉°»«‡“ÍjưÀ·ºÙÓ¡Ç™‰kß [ïS‹ö¾ÿÚå̉ áê‹ÜƒˆÁ ½€Û«‚ ½9ß%ßÚá ߈ƒÖψëö°¿÷Ú­ô«‡“ÍjưÀ‡ÇÏÔ¥ºíØרÛ«‚ ½9Á¾™‰kß [ïSÓ±»ù×Á½ñ»Øëö³“÷ívß»ûá ½€ªÚ½ϼ‡ÇÛ«‚ ½9ëöàˆFÀ0FpF߈ÇÖÿÚÏÔùעêè伨°»½ĂĂÙ•ÿ·‡‘×8ç×Ơ¼€ơÄ¼Ă©º¹ÚÏÔÙÚăˆŸ;ÍÓ£2ăơưÀöÁ™‰kß [ïSăˆŸ;ƒ±£äù×̃ˆ8¤‡ÖŸ}ÎÔ¥ÆÛ«‚ ½9Å–ëƠUö›¾¿‰́vÛ«‚ ½9Ă¼ákß [ïSƒˆẳúq†Çù×ăˆŸÿÚÿ¯¶ Ơ¹Ú•ƯÓ ‚v§Aù×½¦í‰º9¥‡µÜ¬Ö†“¥ˆ]1щϟĺ۫‚ ½9÷Ú·Ó ¥0Û«‚ ½9/ù×ß óƒ½߈½±»߈ƒ»ù¾™‰kß [ïS8¤‡çÚ˜‰j̃ZîSͼΈ¹ÚÏÄíÖÏÔר8¤‡ăˆŸ;€èÓ9¥‡˜‡ÎÅĂ“ÆƒÔëö†ºÜÓ ̃ÖÛ«‚ ½9Ï̉½ĂÙ߈ăà«d‹Çáêơê·Ü‰Ô¡Ô퇓ƠơêÍË)éÛ9¥?á=˜‰j̃ZîS­±»Áñ™‰kß [ïS˜‰ j ̃    Z îS Ù½ĐÓ ̃Á³ºóáçØÛ×Û«‚ ½9ăˆŸ;k‰ÏÔ©Ç“”îơÔß̃ĂÙÛ«‚ ½9Ö ëö³È“Ʊ»¿‰½™ÓÁºÙ½ôÿ¯¶§ÔÅØ‚v©Ó»‡•ŒÛ«‚ ½9ëÚ±»´Å(•×ăˆŸßÁ§ÔÁĂåôƠ‰Û Á½ĂÆØơÔÙŒë*«ử¡ÛÄÓ¡Á“ÈÅÓ‚¾ÑÓ³ÜïÚö°»ÏÄ¿‰ÏÅËÉ9±¿ÿÚ†Œ¾ÍÓÁĂ£»ù×çØ°»±¿ä̉µØÓºÛ«‚ ½9±»›½Ù½g·Ó ¥0ûƠ™‰kß [ïS9¥‡×çÚ³ª‡’̀j½çÚ½€›·Ô­½¼½Ă‚ÏÅÛÀÇÖăˆŸ;‡ŒívăƯÖ¾8ơê±»é‰ñ5ñ··Üƒ×ÙÚùêß»ûÓÅÓÅÍB“Èă—ÓÛ«‚ ½9Ö¾£X‹½¡Ó·‡‘×8ç÷ÁăơÛ«‚ ½9Ó̉°»4ÿÜ÷‡µÜ¿Åù×™‰kß [ïSÇÖẳăà›Ú±»ù×Û«‚ ½9ù×ăă»ÙƠùêăơƯơ₫.ÏÄù×ÓØµØÊÖëÅÓ«»‡Œ½ÏÔÏÔ»ôÛ«‚ ½9ï»߈ÑÔỞûêÛ«‚ ½9å̉ ׿8À¹߈8¤‡×™‰kß [ïSëö߈ÿ¯¶ؼ ĐÓœÄ¬ÑØº™ÁăˆŸơêÛ«‚ ½9æ½Ç"ûØßÄÙä̉ƯÓ ŸöÁƒvÏÔ‡ÇáöÙڭĽƒÖ‹ÇµØ±»Û«‚ ½9“Æù×ÅÓ˜‰j̃ZîS¡ÔưÀÙ½ơé¹Ú™‡ߌÛ,Ù½°½¡ÛăàÑøàódzÈùæù×׿8é%½ëöÏÅ忹ÚĂƠ·ÅƒvÁĂÓº½©]¯È—»öéJé‰Ó5“gesÁÅ ă匿N«‡“ÍjĂ×ÏÔ׿8Ü…ƠăˆŸ;—¶·‡‘×8çôµØëöăàêö߈ĂÖ³ƒ¾‘˜‰j̃ZîSÙÚ²º̣…Û9¥‡߈µØ¯ÈÛ«‚ ½9‹æ±»÷‡«‡“Íj÷ÁÙן%‰¿I½ÿÚ»Óëö³¹«‡“Íj½¾‡«»Ởƃԙ‰kß [ïSöˆ½ÚÙ½Û«‚ ½9ă‹Çƒvç̉¼€ö‡ƒ×½“ÆÇÖßÁ½¾æº ÿ¯¶ñ‚vÿÛµ‰₫›ÚÁƯß»ûÓñ߈‡Ç…ô«‡“Íj‡Œ“â×ƠÙÚŸ}ÁĂŽÁÓ­Ää̉߈«‡“ÍjÄô×Ă¾́Ç̉×Úåà߈©¼±»ï߈‡ÛÛÄÓ½€߈ö̃„ÇÖÑĂÿÛăˆŸ;«ÓÙÚÿ¯¶ăˆŸ¡»ÀĂé8麫‡“ÍjË̉½ôÛ«‚ ½9ËŪ‡’̀j±¿ï»•Œá¬«ÔÑĂϼÑØÆ”Ö̉Á8.¤‡.Öùơ—¿«Úÿ¯¶£ä¡ÂÙ½¹Ú…£­ËÓ¹Ú«‡“ÍjˆÑÓ€ƒvó¹ÚÓÆù×çôô©Ø·Üî½¾ר¹Ú¶è±»ÏŃv÷ÁÙÚ÷ÁŸĂÙ×Ơ¥‰ÍL……ÛÍË)éÛ9¥½‹ÇĂƠË̉›ĂÅàưÀÀ¼½€ÍÓû©Óù×÷‡ñÔèÚ’º¥È麇۫ۃvÇ»½€̀Ó( ™‰kß [ïS¡Á̀Ó“Æ߈Ø×ƒvăˆŸ;kưÀ›!ưÀ¡ÔÛ«‚ ½9Û×ÙÚ±»±¿Û«‚ ½9ø×ׯƠXÛ¿‰ơÔéÚé꛾Ăô™‰kß [ïS¿‰ú«‡“Íj÷‡ÏÅ£ØßÖ匿N»Å“ƠÏÅö¡ÔĂÙÿ¯¶ÓºñסƠÙ×߈˜‡©Ó¹»ƒv›Ú˜‰ +j +̃ + + + +Z +îS +‰ÔÛ«‚ ½9ưÀ¡Á×̉Ÿ}§Ô›¾ƒvÁ½ÍÄă½‘ÛǽơèÅï‡ÑØøêÙÚÚÆ á îÀ󰻟´ûÖ¹ÚÏ̉ùê»ó“̃麑¾Û«‚ ½9çôÏ̉£ÇÍÄö½ÜµØ‹ÜÍôÏÔóÇ߈Ù‡Ï9…ụ̂Åô™‰kß [ïSå̉ ºÑØßÚÿÜ߈÷ÙÇÖÙăˆŸăˆŸ;Û«‚ ½9÷Á½€«‡“Íj§ôéơ±»“ƠÛ«‚ ½9ÓµOÛ«‚ ½9ÏÔƒƯ½€¥Ç߈ù×ÏŽѯ½ĂºáƠư®G ø ±»ù¿9¥‡×ª»ĂêöñÓÙÚ™‡ÿ¯¶߈ëö«‡“ÍjùæßÄÙăÇí“½ăˆŸ;k½ƒØöăˆŸ§Ó‹æƠÏÅÍÓ½©&¿ß±»ë‚èI™ô±»² ù×·$å̉ ™‰kß [ïSÇÖöÁ “Æ₫Ç +ÖÔ†6¦j“Ơù×Û×½—¶߈”‹œHÏÅù¿߈½¹Ú™‰kß [ïSר÷Ú©¼ÑÓå̉ ÍÄưÀÛ«‚ ½9£ØÙ×á ™ơÑĂ«Ô׿8âˆ:ù׃ˆÛ«‚ ½9ªÔ©‡¥2ßëMÙ±»«Ô¶ + +‡Ơ´«‡“Íj‡†×麃văˆŸ;߈‘×™ôèºẳ½Í±»Á¹ƒv«Ô墸êѶ«‡“Íj¶ưÀÁƯ›¾ôăơ«b¹¼·‡‘×8ç¹ÚÛÀ›¾©ëöŸ\™ÓÏÔù׎Ùڥƃ™‰kß [ïSÏßؽ¤Æ ±»§Ô麶ԫԽԛ¾¹Áëö9¥‡×ăˆŸĂº«‡“Íj¡ÔÀĂă®Ù§ĂÈÍÓơÔ‡ŒăˆŸ;Ø̉›¾øêå̉ ăˆŸ;Ï|×Üăơ‹ÇñÙăàûÓéºƯº’Ç·ÆÏÔÎÔÛ«‚ ½9±»±»Û«‚ ½9ÇÖö¢XJ¥å›¾‘Æ»yÙ×À̉óĂ½µê½€Ǻù×™‰kß [ïS¦ô«‡“ÍjÏÔµêå̉ ëöÇØ™Óº÷ÁíÓơèÅß»ûçÚƠÚ×ù×·º™±»™Áá¿Å™‹ă»°êØÁå‹ÈƒˆÓثԽä̉ÙŒë*«ß߈óÇ¿(ëö¹Úƒà»Å«ÔßÁöˆÑÓ¡ÈöÁÙÚív¨Çơêô—¶ß„ßÁ«‡“Íjëö«‡“Íj±»ÓºƯÓ ơê߈ù׫‡“ÍjçÚÔơ­ÅƯ”¥Ư®Gø€ºùׇỞ̃ˆ ù¿ëöÛÄÓ¾ËÇ—¶Ở‰Û·Ô8¤‡¿‰Ű«)‡Œ‹Ü$ư6úÓ¡Û³¹¥ˆ]1Û«‚ ½9ÇØÛ™Óÿ¯¶›¾ưÀ…ô™‰kß [ïSÿ¯¶¸ÚĂȹÁ™ôÁ½·‡‘×8竇“Íj¢äçđ§Ô¼­ˆÂÙ«ÔúĂh·̣₫Á®¶ÁÀ‡×ÔÏÔóÄ̀Ûïʼn¿I¸ÚƠưÀå̉ •{óÇƯ‰Ú×¼€“ö´†Ñӭĺá=”ù×ÑÓÚ×ÍƠ•×™‰kß [ïS߈£³êöùש‡¥2ßëMßƯ¼Èƒv̀„™‰kß [ïSÜÓÁ©‡¥2ßëM߈ Ëû¿‰§Ơ¹¼߈8¤‡×µØßÄÙƒÖƒvç'ƒˆ©ÓéÙ½ŒÓ«‡“Íj±»ăˆŸ;ÓÅëÚ™‰kß [ïSơê±»ĐÓ äŒ¾NÔºl•Œ™ơ§ô›¶éëö×*Á%ƒv—ˆ´Á±½ü̉ß»ûßÄÙÓº«‡“ÍjöÛ˜‰j̃ZîSƒv¥½ÏÄ«»§ôǼ›¹•±»‰yùׯ"ÑÄë½€Ûê³Øï½½¹Á­€û(º߈麘‰j̃ZîSơê±»ïÁºäñß„çôÁ߈ăˆŸ;¬Ø¡»Á×™‰kß [ïSø¿µÈñÖ“·̃‹Üƒä»Ó“½ơÀĂÿÚơèÅÅÔ¼ÙÓ«‡“Íj©ÓÅûß»û™‰kß [ïSû(£X %Ă뼃ơ·ÔÛ«‚ ½9ɇáˇººÅÎÔ…§‡‹Ç­Ø˜‰j̃ZîS™‰kß [ïSÇÖ̃ÄØÛ«‚ ½9ï»ù×€º¡»ñíÈ›·ÔׯƒvăˆŸ;±»¡ØÙÚóăß»ûÙ½±»çÚ™‰kß [ïSµØºëöö¼Û«‚ ½9÷‡¡Ô«»ơ꫇“Íj«·3uUëöƠÔæÚơ§ÈĐÓ©‡¥2ßëMø×ºÁ ²È8¤‡÷ˆ°¿ù×ñÿưÀ¹Ü¡ÔëÓ‹Ü«v»nĂĂ ›­±àéMÏ̉ÿ¯¶î²2Û«‚ ½9êö™Ô°»ĂÙùëåöÓº­Øï³2ă¢È̃ˆ˜‰j̃ZîSƒØÂ¹ÚƒÏÔ™‡ÁƯ±»ùסÈßƠÚ¬ÈI³ÇÙ½ÊÈ9«‡“ÍjçÆù„¡ÛÛÀƒÖËǃv™‰kß [ïS™‰kß [ïSƯº™‰kß [ïS´aăơÛ§™‰kß [ïSĂÙÏÔ¡ÛưÀ›·ÔëöôĂƯÓ ¿́†Œçôψá=³ß»û¿‰÷Úùê™ÁöƯ‰¸Ú­Ö«‡“Íj½û· £ä™‡÷‡¾Å ß»û³ØÛ«‚ ½9™‡Û«‚ ½9ÿÂ߈™‰kß [ïSù׃ص‰ùêƠ™ÁưÜ«‡“Íjăà÷$±»‡ºñÓá ÑÓ•CÙ̉µØưÀ̃ˆÏ̉Û£Xÿ̃ÙŒë*«âˆ:ưÀë£åô%ÓÅ߈ÅØ“Ơö«Ô«‡“ÍjÿÚÛçÚ߈ñíÈ«‡“Íj‡À¹ƠÄ߈Ï̉öÏÅ«»«‡“Íj§Ôÿ§¾óǹÚÁƯ÷‡«Ó½ĂÓØăÚ‡ñ5ÀÏÔ“ù‹ÇרíÚß–½ñÜÍÓôăˆŸư‡±ù1…öÎÓ·‡‘×8ç‚‘Æóư§‡¥ ÄÄÅÓ¶Á½…Ø«Ô£ä“Æ­‡ÖĂơêÁóÔƒvơú÷‡›¶é½ëö£ƯÛ«‚ ½99¥‡±»¹½½€ăºÿ¯¶ûƒ×™‡ÏÅ©¼ƒvëöﺱ»ÁÛȇŸ‘œÜÎÄÏÔ‹Ü9¥‡óÇÛ×ÏÔ“½ơàư‡±ù1ÁĂĂèÎỔű»áÓ½¹ÚÓ×Ü«dÅÔׯµØ߈Û«‚ ½9Û׫◶™‰kß [ïSñÓ¤½™Áê$&§ÆÀßíº™‰kß [ïS¿ô·ÔûƠ³íØׯºßƯ·ÅÏŀؽ跇‘×8ç÷‡ơêÛ«‚ ½9ÍÄÍӟŇº¹Úơı¿ÍÓµ†­Ö™‰kß [ïSÁĂăÁåI°»ÅÓ½» ‡Ç˜ ê è ä ë™H9¥‡ĐÄêÏÅÿÛщù×ä×›vÙ½Ž»‡ˆ‚ÏÔ¥Û‡Ú匿N‹Ü›¶éơèÅÁĂƒvù×߈«»‡—ˆ™‰kß [ïS‡‡ƒv½¹£©‡¥2ßëM¹Ú½ô—¶ăˆŸ;ñÓÙÅë‰Ñ™‡ơê餈\0ß»ûå©ùêơº©‡¥2ßëMǺăˆŸÛÄÓºÁ™‰kß [ïS¾ØÏ̉ÆÁåÿÇĂƠÆßܽԗ¶·‹Û«‚ ½9½ăà…Û÷ÁÛ«‚ ½9¶‡Ö8æåŒ¿N¿‰Ûƒv½ĂÙÚ³µ†»Å»ÁƒvƒvôÏÔûÓó#«ÔÑÄëăº°»«‡“Íj8¤‡×¡Ô«Ú‘wÏ̉‚ØÏÅ™ëéåçôÿ§½Î̉Ë̉‘ÛơêÏħحÄá=ÙÚƯܽ€½g8¤‡Ÿ}±»å×›¾₫­Ä˜‰j̃ZîS©–ÅÖ•Œö˜ÛŸ“»ˆÏÔ°»…öóÂăˆŸ;×ƠµØÅÓÿÚăˆŸ;k©ÓơèÅ…Ơ‚·Ó ¥0㤷‡‘×8çÁ̉ăàø×ñڇǽ ¬°àèM²Â“ÈƠX…ÖËÖ±»˜‰j̃ZîSË¿ç$›¶é‡“ÿ¯¶ƒˆÛ«‚ ½9Ïŧ.½߈˜‰j̃ZîSƒvÓÔ±»×Ơ߈½¥ˆ]1£Ø߈×̉­ØÙÅë“Çå‡₫Ú›Û±»˜ÁÑÄëÙÅë9¥‡Û×í(«‡“Íj¢ä÷Ù¥Û½‘Æøêö´. ¤Ù …Û½ăˆŸ;k½£Ø¿‰Û«‚ ½9óψ¥ˆ]1ôê™ÛÛ×Úª‚ +¼9ù×Ăº¹Úùꙉkß [ïSÑØá ½ÅÓÜÏPßÚ±»ÏÅù×ëö‘ 9¥‡̉´Oå̉ é‡çÚ·ÅÁÚ÷ÁëïơêĂÙ‹Üù×ÿ¯¶®¾ù×™ÔăˆŸÛ«‚ ½9÷ÁăˆŸ;kÓÅÔºlä̉©œÏÔÇØ­¾€±À¡ÔÙÚ÷Ù³¡ÁơèřׯÏÔßÚ‡º±»û(éØơêÏ̉ÿ¯¶Ïž›¾ăƒĂƒàÛ«‚ ½9©Ø¹ÁïƠĂ¹Èß»ûô걿ù×߈˜‰j̃ZîS±»¯ëÇÖÛ×Çô߈Åù×9¥‡Đ¹×Ü8¤‡×±¿áƠù×¼åÁÏÔçÚ‘́ù×Û«‚ ½9“¹ƯN»¼‘ÇÓ߈½Û«‚ ½9½Üß»û±Ư߈ÏÔ߈ù–ó™‰kß [ïSºØ  ƯÓ ‡%¹Ú«ÔǼ“è±»—¿‚µÂÓ¹ÚµØÁĂ›¾ù꛾³ÈöÁƒv߈9¥‡©·Å±»©-‡ŒÅ–—»±¿Œ¾ăˆŸ‰¿IÏÔר¶«‡“ÍjÿÚ—»Ởÿ§èºăˆŸ;ùשƠëö±»ÍÓƒÚơÔëöµ†ëöívøê9¥‡×ïÚ‹ÓŒ₫½€©ÀöÇÖƒ«‡“ÍjöÓ̉£Øơ¹óÛ«‚ ½9Ù$´Åơê«·3uUÇĂ½ź™‰kß [ïSăˆŸ;k™‰kß [ïSù×÷cỵ̈ÉÅ8¤‡«ƠíØŸƠ¡Á¸ÚăˆŸ;k™‰kß [ïS×ƠçÚµØÛºơêÇØ£¨íÓÙÅ뫇“ÍjŸ}ù×§ÓÙÚƒv±»ÑÓÄÓ™Ă¿‰ÀË­Ö«‡“Íj½êö́ÚÅØ’¹ÜN¯Ơä̉“ºÍ›¾ơéç̃ÎÅ›¾ƒv«Ôùêƒv÷Á•×ÓÓăˆŸƒ×·Ô·ÜÇ߈©Ü•Œ±»ƒv½Ô§ºß»û˹Ÿ—¶ñÚăˆŸ;k•Ü߈¡ử߈éÚºÁÏÔÛ×éºä×·Ô½Ă™‰kß [ïS­Ö½)ŸĂ8O¤‡OÖ ĂûƠø×ƒ¥Ø«ÔϺÖÆ߈½íêÿڿعÚÿ¯¶‡¿̃™‰kß [ïSÇÜɇ¹´¾Á½ï½½ƯÓ ½âơƒ¾‘Û×™‰kß [ïSÛ«‚ ½9Ù½‰Á¾™‰kß [ïS·Ôù×ûØ9¥‡ûú)˜‰j̃ZîS±»³‡ûؽïÛ«‚ ½98¤‡¼Ô§ßµØ¡Ù•²̣ +¾̉ ÷ÁÓÓÏÅ̀Ç™‰kß [ïSçÚY’ÈöçÚÁ½©ÓÛ«‚ ½9™‡•ŒñׯG‹ø“Æ›v¼ơ»Û«‚ ½9½Ù½±»©‡¥2ßëMÛ«‚ ½9‡×µØ§ÓÿÛ·‡‘×8çĂÈÓ ăˆŸ;±»½ử9¥‡Çâ«ÔÏÔÅØ³(ĂÙ‘µÚ‡߈¾(ù×öơÛ×›¶éµÚôê9¥‡Û«‚ ½9Á™$Ὡ¼·ÔÎÅÿÛ™‰kß [ïS­ÄÑæÏÔ¡Ôáú¹ÚäôÛ«‚ ½9ăˆŸÄÓß»ûgÿ§Ưº̀ Ê) èÛ 8 ¤   ăˆŸ;Ơ¡«£Ø™ëéåœÜéÓóǃàù×½€߈ưÀ»Ô¥Æˆ;¢XΙ‰kß [ïS«Ôƒ‰ÆÑØ£X§Ôù×Ñ·‹Çơ߈ưÀ§œăˆŸ;ơû¶Å·̣°»ÇÅëö±Áäô¥µçÚ¿ß«‡“ÍjƒÚö½±»¼™‰kß [ïS¥Û›¾™ëéåơÔëö™ôĂƠºŵ¡Èùê¼€¹ÚÛ«‚ ½9«»å½ëö•{”̃ô×Ơ›¾©‡¥2ßëMå♉kß [ïSûÓ¿ôÑÓù×ƯÓ ¥ÛרÍĦƠơêÛ«‚ ½9Ôơ™‡“ȾٽÇ胇xá=‡ÇËÇưÀ“ÈÑĂéÚăˆŸÀ¼çÚ˜‰j̃ZîS·ÔÀ½àºá «‡“Íj›¾»‡ö±ô©Ü“È“ÆñÓîôù×ÏÔ·Ó ¥0«ÔÛ׺—¶µØÏÚáêăˆŸ;”»ñ~ØÍÓ™‰kß [ïS±»÷‡רëöÙÚëöƠXÛ«‚ ½9á ăˆŸ;óÂÛ«‚ ½9áê™ÓÓÆ߈ÍÓåĂêö¡È±éÚ¾ë±¿ÅØ»º½Ô™‰kß [ïS9¥‡×¶ƯºÑĂñÆ‚ˆ¹ÚöÅ»“Ƈºù׃ˆ9¥‡¥ˆ]1‡Çº·‡‘×8ç¡ôêÛ«‚ ½9ÅÔÎŇºơèųÂơԇ׳9¥‡Û¦Æëöûٲ؃ڇŒ“Ơ«·3uU¿ÙÏÔéÓшÓ&¡Ç“Ç«‡“ÍjÓØÚŸ}¥ÛùדƠëơ¡ºÅûàêµ.¥Ù«‡“Íj½€ơԩǡԙ‰kß [ïSƠÏÅ›¾ƒˆ“¹ƯN³ÂÑĂ͇ÇÓÆÁă®Gøù×͘êèä߈«ÔÛ×Á‡»á=ơăˆŸ;ÁƯ₫‡±»èơăˆŸÛ«‚ ½9Æ¡Èχ·ÔÚÀ¡%ù×₫èóÂÛÔ«»ö¹Ú¹Ú¡%¥ˆ]1“¹ƯNƯÓ £ØẶÄ…ô¿‰…Ö™‡½Ô½¡ĐÓºÛ«‚ ½9³ô­Ä¥ÆÛ«‚ ½9ơÓº½È™¶ù×¹Ú´†Z«»™ëéåÙÚ¥–ÂÈÜơê•êœïºù×ùש¼ÍƠ°»Ÿœ‰¾Içm©‡¥2ßëMÍÄ™‡ù×ׯÏÅ÷‡™‡ĂƠ ­Ä¡Á¸ÚƯº½€Ù½Ơí|±‡ºëöăˆŸ;ÏÔƒ™‰kß [ïS߈¾ºƠX½Ç̉­Ø₫®¶±»Ç̉ƠÛ«‚ ½9ÿ¯¶ù×ù×·Ô½8¤‡ÖÎŽô Ëûùsëöƒv•/ƠÏÅù××¾­ÛÛ«‚ ½9ăàÑÄëëöăˆŸ;ăે“ÍjçôÛ«‚ ½9çôĂ ÔXøêƵßÏ̉ʹÙ½½ÿ¯¶™‡ù×€¾§Ô¡Á™‰kß [ïS±»µa߈±Ô³̣ö­s¾8¤‡Ö©—¶ÑÄëÔXêö¹ÚâÁ½™‰kß [ïSôÔǓ‰3Ơ,ùƯÆ«»ƒˆÛ×ù×÷ÁÅÛï»ÇĂ½ÈŸ\׿8¥ÛÍBª‡’̀jù×êÖ߈Ÿ²ó»“Ơ­¾¯ƠñÚơÔµ‰«‡“ÍjÍË)éÛ9¥§ÔÏÔçÚă‘·Ơµ½ôï¶ÏÔ“ºáêŽăˆŸÙ×ëöÍĺn™‰kß [ïSơèÅ–ŒÜÓ ‹Ü™ĂÇÖÛ׃vºÅøæù¾ăˆŸ;k×¾´À›¾ÛºÏÄ@ÔXµ†…à«ÔÛºâÄÀù×ÑÓù×í¶߈ëö§ºÅÔù׺½ÓÁÏÅ·ÔYÙ½ăî£äÑÄëÅ÷‡Û«‚ ½9÷)÷ÁĂίàăˆŸô¨ËÓ¥ˆ]1麯G‹ø8¤‡Y°»ăˆŸ;ÿÚưÀùæù×…ÛÛ«‚ ½9ш›¦ÏŽ€¥ÄëöƠ‹ÜóÔưÀ“ƠÁ̉©ºó›Ú‰ơΈ »Û×öëöÇÖ±»«Ó9¥‡µØ±»ÏÅ߈—¶±»ív¡È‘ÆïƠ™ơëöóÇăˆŸÏ̉₫߈ÈƠÛÚ«Ñèê»ÅĂººØíJ´†±»ÙׄëöƒˆÁÛ«‚ ½9¯É±»›Ú¡»ËÓéêÎ +›!ÿ¯¶߈ăˆŸ;ív¥Ư»Å‹Û±»½‡»¹¶߈߈åÁéÔÏÅÙÚ¶‡Ö8æơèŵÜöÁ‘Ö±»ÙăàÍBöÁ«·3uU»ôͺ±»öºÅÏÔ½ëöÔÇØµØÓÆÿÚ°»Û«‚ ½9‹øÙY¹Ú¨ŒϹÙÚÅØñÓÛ«‚ ½9˜êèä½€ÅÓƯºåŒ¿Nơê†Úù‡ô«Ô§Æ«F߈ñÄÓµÛ«‚ ½9ƒvÛ׿̉ăˆŸ;ÑÓË¿ÿ¯¶ăêơ‡ß»û±î¦Ôÿ¼Û«‚ ½9¹È̉Á…ÔÛ«‚ ½9±»±»ô¶°¿ÑÄëö̃̉‹™‰kß [ïSù׎‚­ÖÁ¹óÂÿ¯¶ƯÓ °»°»Ó́ÆÛÆëö½ß„­Ôµ‰ù×Á̉·ÅÛ×™ëéåưÁ·Å›¾—Œ߈™‰kß [ïSÍľ¹xÚª‚ +¼9‡Ç£äé걿ñÁÏÔ–ˆỞƒvî»Đ¢×Ó¡ÈÛ«‚ ½9רºï½̀Ê)èÛ8¤†äñÓÏÅăˆŸ;±ÿÚ© Ü«‡“Íj铜ơÔÏÔËr‰½₫Û¡Á±»«¿‰Ÿ}¯ÈûÓ±»ÏÔ¸ÚăˆŸ;kƒˆ™‰kß [ïSƒØĐÅÏÔÓØÓù×ºÈ ߈ÿâ±»±»‰ơ¾ÅơèÅ¿ôÅØûº߈¢ÈăˆŸ;ïÚƒí¹Ú—¶íJ‰¿I±»¯‰¯0÷Ùù×½ĂÈ¡ÈĂÛ«‚ ½9¹ØôË̉½€­v—¾ë§¸ÚóÓÄØ‰µ¹ÚÁ×ÙÚñÓá »£ơỖÖרƒÚÙ½÷ÚÏÔù×±Ô¹§Æ¨ĂäÁŸÅ›¾߈шù×߈Ë̉à ëöÑÓ¿Åÿ×íÖß»û½»½ƒàß´‰ăˆŸ;µa±»Û«‚ ½9ßÄÙåô÷¼ăˆŸƒv߈¯ƠÙÓĂÈ·¼Í7ÇÖ̀½•̃£ä™×ÁĂÏÔƒv”ŒŸÛÇÖñÆù׫‡“Íjï™9¥‡ÏÅåĂ·‡‘×8çăˆŸ;Ô¾F¥Æ£äËÉ9ăˆŸö¥ñÏÅ·vÑÓÍË)éÛ9¥¿‰ù×ơèÅĂƠ˜êèä‰Á9¥‡äŒ¾N™‰kß [ïS“‹«‡“Íj›v›¾ơêù×§Ó›‘ëö‰¿IÇ»£¨½©‡¥2ßëM—Ó‘‡™‰kß [ïS±»èơÙºƒÚ×Ú₫®¶«‡“ÍjÁÓ«»™‰kß [ïS©¼Ç"±»“ÈÛ«‚ ½9/¿ô«̃³ €¹ÚàƠ߈߈Á÷Á߈ÓºǼơ꫇“ÍjñÚï½Û«‚ ½9½™‰kß [ïSăˆŸ;­€çíơèÅ—¶½éÚ°»§ë…­ï§Ô·‡‘×8炾ŒáêËÖ¿»ê$öƒvƒvö«Úù×±»ƯÓ ëöưÀçÚĂƠ÷Ú±ùæ½ÈʹăˆŸ;»Ư˜Á¡ÁÁƯ…ô©Ó“ȹÚñÓăˆŸ;k¾¹ÚÍË)éÛ9¥Á̉«Ô‡™‰kß [ïS߈é‡Û«‚ ½9ׯ÷Ô½ÿڥǻÁ§P“ƠËÖ«Ôù×9¥‡—¶ăˆŸY±ëØ÷Ù̉º́ê½ù×½€щøêÖ¥̀´†ăˆŸ;å̉ ƒvĐÓ¹Ú™‰kß [ïSơÄ¡ÁÛ«‚ ½9û(ÅàϹ¾½€ˆÛ«‚ ½9Ă ́ƇÇ2¹ÜÁ̉ÿÚăˆŸăˆŸ;ê$ÖØö©À™‰kß [ïSáê׿8‰Æù׺ñÖ™̃ùơëöáïƠƒØ¿ÅºŒùëơÔÎÅ¿âÇÅ©&™‰kß [ïS²Û«‚ ½9ÏÅÁ½°»ÁË›¶é“àù׺‡ÇÍË)éÛ9¥ăˆŸƒ±»ƒvÛ«‚ ½9߈ÛÀ«Ô£Ô‡Úø×¾àÛ“ÇÑØéêµ̣‡ψ«‡“ÍjÙ½£Ç¼‡Ú¥ˆ]1¯ƠÙÚƒví‡̀Ê)èÛ8¤•»̀Ê)èÛ8¤ơùëÇ%ïÁ÷Á#“ÈçÚÁƯơêÔXׯƒvÛ¸£ ©&¯ÚêçÍÄ‹ÇÿÚ±»ù×á=Û«‚ ½9¯ĂÙÏÅßÄÙăˆŸ;³Ø¼€ +çÚÏǺvרÄô,£»ÑÓÏÅêÖĂù×âàµØÏŇۛ¾Ăăơ²Ø§ƠÍÄٽ匿Nư‡±ù1«Ñ¹ÚÅĂ÷‰̃ÄØíæö¡ÔÓ¢¾º¿Å·½ÛÔô ©‡¥2ßëMưÀßÄÙ±»ÏÔªĂ‰¿IíÆ˜Ó©‡¥2ßëM‡Û½Žùå߈ÏÄĂíê½ÔưÀÛ׵طØÏÅ«ÔÏÔƒÔÎÅ…ÇÍƠ›‡ºßÚƠ×Ơ†7§j‚%ăˆŸ;±»™ÁÅÓƒˆ¯tÚª‚ +¼9Ùù×ăˆŸ;¦Ó·‡‘×8竇“Íj‹ÜívéôăˆŸ¿Åí׿8½Åá÷ÁỞ‹Ç„ô™‰kß [ïS™‰kß [ïSÇ·‡‘×8çéêĂÓëØµØ̀Ă¿ăˆŸ;k¿́ÙÚ¸Ú›¶éÆĂÁƯ‡Œ» Á•½ªÔ¹ÚèӿŤˆ\0ÆÿÚ™‰kß [ïSŸ}™‰kß [ïSăˆŸ;íê±½›!ëöĐÓ߈§ô¼Ø¹½ĐÓºÍÓ×¾Û×Ư‰°»ÏǺ½ăˆŸ;ßőƫºÙ½ûÀ±»Óµ©‡¥2ßëM«‡“ÍjÛ«‚ ½9ÏÄ‹Ç8¤‡×ƒˆ–¶9¥‡Û×ÏÔăˆŸ;·‡‘×8çÔXËÓ߈»Ư¯×ù×›¾ơêǺ˜‰j̃ZîS±»Ù»™‰kß [ïSÛ«‚ ½9‘ÆÙÚĂÙÓØĂĂßÚß„»ˆ9¥‡×ñÖ߈‹Ü«‡“ÍjϼÙÅë߈ơêù×ù°§ĂÙ½ßÚñ +ÑÿĂÈ·Ó ¥0Û«‚ ½9‹ÛíÆ£äÑÓ±»Ơá×’¹ÜN9¥‡¯¼Û«‚ ½9ßÄÙơèÅ÷ø÷Á߈ëö³ØÛ«‚ ½9ƒ½ô€º߈½ß»ûàÁåÛ«‚ ½9á ÏÅö™‰kß [ïSÑÄëáêó#߈ívκù×ÿ¯¶·Ôơꣻ“¹ƯN«‡“Íj‡ä­ÄçÚ™‰kß [ïSêöµØñÖ߈™‡¼ëö½ׯø|‡Û›Ụ̂ÔÍË)éÛ9¥½ù×ÎÔÑÓëöëöù×µØóÔËßĂÙ¿ÔÛƠÅÓø‰̀ı¿¾ÏžưÀß»ûÉ̉³ÂĂÙÍÓ›¾Û×ÁÚăˆŸ¨¾íÆ߈»“…»›¶éùׇŒ÷ˆÙ½÷ơÏŇÚX“ƠôêÿĐÙ½½€Ư£ø×ù׫‡“Íj™‰kß [ïSËÇ™‰kß [ïSźÅÓå̉ ÀĂÚª‚ +¼9Û«‚ ½9ƒvăˆŸ;ƒŒ8¤‡×±»­Ä¯Ûóƒv¶Å£»‹Èù×™‰kß [ïSưÀăˆŸ;±»«‡“Íj­¾ƒvƯº÷ÁûÛø¿Û«‚ ½9ƯÓ ÍÄËƠưÜÑÓ¥ÖÁĂÙ½ñƃv̉ƽÈÁˇbÛ«‚ ½9ÏÔ…ööéÙ½«Ó«Ó‘ÚưÀ×ƠçÚÍÄăˆŸn’ö¸È¸Úçô§ÔăˆŸ;kø‡ñ5¢ØƒvÍÓÏÄăˆŸ¹Úé"Á̉ƠÏÔ˜‰j̃ZîS­€ËÓ½Ѿ©ĂÙÛÀÛ«‚ ½9ĂĂÁÓỞñÓá=Ù×߈Û«‚ ½9µØ³È©Ó±»Û«‚ ½9YĂđ™‰kß [ïS±»Û«‚ ½9»ØáêÅ–Û«‚ ½9°½ù×ÏÔơâ‡xƒ½‚ṿÇù×áØù×™ÓÏÅ₫§÷Ôç½ÙÚ™‰kß [ïS߈§©Çÿ¯¶ź«‡“ÍjÇ»½³Â‡ºËƠƒv¥ºí=ƒ½¿Êëöù×ù×ívâˆƯÓ ‡ù×щưÀ»Ø©Ø™‰kß [ïS9¥‡±»«Ô½½€·§D w¡Èù¿ÏÄ9¥‡¹Ú›¾°»ĂÈĂÙÛ«‚ ½9ăÁù×9¥‡«Ú±»ÏÔ€¾߈å×±»Û«‚ ½9ÅÓ«‡“Íj¯ÛùׇºÛ×Á̉¹ÚƒăˆŸ;¶>>Á*ÿÛñÓó–÷Ÿ™‰kß [ïSƼÙ×€ºí–GỞøơ£ ½ĂÙéÓ̉ضèƒv÷‡9¥‡×ÏÅù×Û«‚ ½9±»÷Á˳ÙÜù׳ăϺÍË)éÛ9¥ù×ê¼áêØÅêù×½ûƠ߈ÑÄëÏÔÙ¼¹™‰kß [ïSﻓ܎¡Áù×¢ÇéÓ‘±Åؽ¾‡Áºå̉ ĺ¿‰ÁĂßÄÙûÙ™°ëö¶‡Ö8æưÀ ËûëÆ÷Á߈ÓÅ߈çÚ³Øͼ£äؽ¿ÅÛÚ±»ø¾Ç—¶ÿ¼Ù½ñÓºăˆŸ;¹Ø÷Ô«óƒöÁ5¡Ơö“Æ8B¤‡BÖËàơ꽫ԕۆŒĂÙï½ơ»™Óö™‰kß [ïS«ÙÛ×Èá›ĂÙÁ½ß»û™Á°»«ÔóÇÏÄ¥ØơêÙŒë*«“¹ƯN°»ïÚƠ¿º¡ÛÙÜŽ§Ô߈“ÑÓûÓ9¥‡½›¾ĂúƠG½¹߈óÔÙÚ‹ÙÛ«‚ ½9ÏÔׯÛ«‚ ½9ơêù×߈ĂÙÉÖ£ÈåÁƒˆ·‡‘×8çÁßÄÙ‡ÇÅ—¶Û«‚ ½9ơÔ™‰kß [ïS«‡“Íj₫ÇăˆŸ;kî½áÛ¾¢ä½ô¹Úÿ¯¶¹Ú™‰kß [ïSÿ¯¶£ÇñÙ½®Gø¿Ô½ôùêçÔ¡“ÆÛÄÓ“¼ù×ÑÓÛêºăˆŸ;ÏÔï½ăˆŸ;ׯÁ‡Ú߈ÿ¯¶щ˜êèäăÁ–Ó±ÔŸ}÷‡¶{{߈Ü«‡“ÍjñÓå ·‡‘×8ç·Øø×Ÿ̉•×­‡ơêÙÜ›¹“Çéºÿ¯¶“ƠßÖÙÅëåô¡ßûØÙ½ơêơêÏÔñÚÅôî»ÅưÀ—¶¹ÚÍӅ«‡“ÍjÛºăˆŸ;êößÁØ×Ÿ¹ÏÔ‰¿I”µÈơêçôù×ÅÔϺ‡¹£áêư%½ĂÏÔ“ÈóúăˆŸơê°»·±íÖ߈ơêµÚíÓØ߈ÏÔ߈ÏÍÓ™Ó›¾×¼ĂÙ·ÔÏ̉áê¤!ͳùê³̃ÿÚ‹ÜYÁ½¡\Ơ³ºóèíívĂº¯È¾(éÚËÇËÉ9§Ô߈ăˆŸ;ÏÅ­îÿçâùׯÈÜÛ²ĂÙ¨ÇưÁ˜Á ·¼Í7Ûº±»öù×™‰kß [ïSÍĂÙëöùêơÔưÀßÁéơ¿‰äôÍ߃¼ƒÖ­Ä¥Ó›¾ù×ùêăˆŸ;k•ŒÿÚ™‰kß [ïS­Öíº›#¡3© Ñ%­’Ư‰ÎÔºĂïÔôÔ±»Û«‚ ½9Û«‚ ½9‡¿ƒv₫/®¶/áêƒÖ«‡“ÍjùëßÁª‡’̀jăˆŸñÚ­ÀăˆŸư‡±ù1¹Ú«ÔÿÚÁĂÁË›¶éÛ«‚ ½9íÁåõØÇ»¹Ú³·Ô½Ù½¡ÈÁ½ϼëö©½ÔX™‰kß [ïS±»›Ú˜‰j̃ZîSŻɻ¾ĂÙµØ̉½øêỬϼÛ«‚ ½9µØÑĂßÚáÛÑÓ¹ÚÏÅ­Öå +´¶†÷ÁÉÁÜăơơê±»ϺỤĂ9‡ºÙ×Û«‚ ½9µØ«‡“ÍjƒˆơêëößÁ‰ØûƠù×߈—Ó¡Û匿NöÁ’Æ߈ÏÔáƠ¡Ô¸¿ăˆŸ;‹Ü«ÚÓ—Ó£Çëö̀Ó̃ˆ™‰kß [ïSªÚ¹Ú³¹Á‡é/×:­½¼₫ÇÏŗƃˆ™‰kß [ïSçÚÓ¹ÚăˆŸ;ß„×ƠăˆŸ;Ù½ÿÚ¯×ÏÁíÆơ$ˆÁ̃ƒÛö÷ÙÿÚYÜ ™Ó™‰kß [ïS›¡×Ơ›¡ëӹ෧D ßÄÙÙ½÷Ú«Ó·¼Í7ÏÄ£Ư“ƠׯÑØÓ¼á=߈¤Çººï»›¾™Á°»£äµ†Ÿ\•½¯ÈǼØ̉ÁƯồÊ)èÛ8¤߈Óˆ•=‘ÏÓº­ÄëöÙÅëƒÚßø߈†“Ôºl¼“ +Û«‚ ½9°đÂÙœ‡ÅÓơỒǾ߈‹Üíê§½§ØÙÚÚ×̉ر»«‡“Íj¶ÛÆÏ̉¡ÈƯƯÓ ™‰kß [ïSĂºơÔáSÁƯ₫&›Ë—Óͪ¿‰ÏԨǫ‡“Íj߈™‰kß [ïS÷ÁÅÔă»œ‡àê½êö«‡“Íj噉kß [ïSÏ̉ù׃½« ©ƒ»5߈Ù߈Ù½Û«‚ ½9₫®¶ÏÅÙ½­Ä߈¡Ô°»×Ăơħ/ăˆŸ;ÙÚơÔÙ-º’½¹Ú«»¿ØׯñÚÛº÷Á¨ÓÏŬÈĂÙ“ƠË÷ÍÄÏ̉¡Ơưˆ›·Ô˜‰j̃ZîS‡öƠ½ñÓëö±ØÇÖ»™Á߈©‡¥2ßëMëÅÔ›êÁƯ9¥‡ÑĂ’ƠơºÑĂƠ‡ÚĂÙùê߈¹Ú¶™‰kß [ïS߈߈ĂȹÚÛ«‚ ½9Á¹Än™‰kß [ïSƠX±»ùץƓƠ·‡‘×8çöÁÓº½»ÏųºóµØͺ±½ăˆŸ«‡“ÍjÓÁÇØÛÀçÚ›¾èº½Ù½µØ½—¶ăˆŸ;kÿ±ßÛ«‚ ½9ÿ¯¶Óص«‡“Íj·‡‘×8çăˆŸ;ÙƯ±»Ù«‡“Íj߈½́vĂÙÛï½Ơ¹]ß¡Ûé"߈ỞƠX«Ô߈Ù×ËH™ÔŽ‹ÈăÇíă³¡Á«‡“Íj™‰kß [ïSù×Ù½»$ͳÏŃءÁ‰Â½ùê»…ßÖ߈Ùܽô™‰kß [ïSÇ̉—»ÅØ™‰kß [ïSöÁÿÛÑĂ¡ÈĂ•Œ±»“Ơ«Ô÷ÁÓŰ»ªĐÇ9œ‰¾I¿½öï³2‘«ÿÚëÚÑÓ…‡©‡¥2ßëM¿çÙ½‰”¯Èø×À‡€è/Ö:ŸÈơºÑÓ«‡“Íj—¶ƒ÷ÙăˆŸ±»ûƠ߈ù¿Û«‚ ½9߈߈ûêăˆŸ·’«ÔÛ«‚ ½9½‡™‰kß [ïS£ÁƯ߈ªÚ÷Á™‰kß [ïSß½’Ï̉ëß©ØódzƩ…Œ¥Æ̃ÁĂÖăˆŸ;ÿ¯¶‹vù¿9¥‡×ÏųÂ×ÿÚ—¶ívá=ư§‡­v»Á¹ÚñÚ¡Û©Ó߈ÍÄ߈̀Ó ß»û«‡“Íj«&‹øƒv߈«‡“ÍjÛñ›¾ó¶éêưÀŸ¥ƒv‹ÓÅ÷ˆÙÅë×ĂÅÔ‘±«‡“ÍjËÇ÷‡êÅÊ%ëö»ßµØ›ÚăˆŸù‡óÂÍÓ›¶éù×›¶éÛ™ßÁ€º·Ô½Ü©‡¥2ßëM›¾ưÀÏÔº™‰kß [ïSơÔÛÄÓ¾ëưÀ̃ˆÿ¯¶₫ׅDZ»ƒ¾‘¿ô•éÛ«‚ ½9¿‰©Ç‡“ÙÚ±»ù×纽ù×̀º~ºÁ‡é/×:ÏÔưÀöÏŽ…ùê9¥‡ƒÛĂơÔăà¶Å‹Ç߈ÏÅ‹Çù׈ëƒ×Ơƒˆ†×éê…œ³̉̉¥ˆ]1°½ßÁ߈§ÔƠơÔß»ûÿ™‰kß [ïSñÓ×ĂßÚûدÛÏÔăˆŸ;îº ÙĐÓÍı«‡“Íj߈ăơƯ ĂÙÅØơèű»ư‡±ù1¹’á½€8¤‡ù×·‡‘×8çÛÄÓÂÙăˆŸ;÷Á»Ø¥ëÏÔăˆŸù׿»ù×ÑÄëÓ¾›¾ív²̣Û«‚ ½9¡÷Ú匿NËƠ¡Ơ߈ơÔĂº·Ôß̃®¼₫®¶ÿÚ©Ç÷‡IÏÅÅàĂȽۈ¹̃ª ¨ƒº5±»·#Î̉Ç֮׺È_±»…Œ—›¾ă½¿Ú ª ‚  + ¼9 ­€ñÄÛ×ÙÅë×Ợ¶ƒv©ăˆŸÁƯÂÙăˆŸ;k÷Á£äĂÙ™‰kß [ïS߈œưÑ«‡“Íjăê—¿¡Ô»ØÓ̉Û«‚ ½9™‰kß [ïSƠº¬ÖăˆŸ;ưÀ½ÁµÀù×ăºµØ߈öÓºåĂ¡ÔÅØ™‰kß [ïS»‡®×¿‰̃ÅÇ"¿âăˆŸ;ÏÔÿ¿ÛÀ¾©Ø£Ư»¥Å­RÙ½ử‡Û«‚ ½9Íı»ÿ¯¶½¡ÁƠX³*ÅÓÙÏÔÙ-á éꩈۺ·‰Ơ£Ø½ÛÄÓùê¡»·ÅÿÚĐÄꙉkß [ïSƠÛ«‚ ½9Ù-ËÉ9«‡“ÍjÛ«‚ ½9“Ơÿ¯¶¹Ú™‰kß [ïSϼø×¡ÛÛ×­Â8¤‡†“Ù½öăº™‰kß [ïSƒˆ±¿½Ă½‹Ç¿‰·‡‘×8çñÆù×ûƠÏÅêÓǼïøÍË)éÛ9¥»‹æÚ׿8ß»ûﻋț¾…̃ëéĂÙ™‰kß [ïSˆÙ½·‡‘×8çù×̃ÄØÙ̉¿‰ĂĂÛ«‚ ½9ÍƠ‡xơê9¥‡×ëö“¹ÜN‡Î¡ÛơêñÚ¡Ô°»ƒˆÅ–¥ˆ]1ÙÚà ©íÆơêù×ç½Úª‚ +¼9ù×ĐÅÿÚ÷Á±¿Ù½ƒvñ₫ÓÓ³ê€Ơ™‰kß [ïSƒvœÜ8¤‡×¡ÁñÚÓº¾Ǻ«‡“ÍjÁĂÛ«‚ ½9¾ºĂƠĂºÛ«‚ ½9߈ăˆŸ;»yˆ³ÈÙÚ¹Úó½³È‰±ËÇYÏľôƒ[ÏÔ×Ûÿ ñÓÏÔÁ«×ëọ̈ÔÚ×¥ˆ]1­Ä·‡‘×8çÛ©Ơ¡ÁơƯáêÓÙ»ùơù×ÑÓ›¾«ÔÁĂÛ×ơê¹ÚçÚơéóÇÁ¹•Èû›«·3uU³ÜçǵØơêÏÅÙYåĂùêă»ưÀÏÔ—¶áÛơûùëëö“ÛƠ¾G™‰kß [ïSÙ»…ív×Ơ¾ºùê±»ÏƯ—¶·‡‘×8çÓÅ¿ºăÇí—¶߈‹Çëöö¬ÈÚÄ̉Ă‹Ç‹Ü¡Ư³ÈăˆŸÛ«‚ ½9™‰kß [ïS»ØăàĂuóÔ‰Ô©‡¥2ßëM±½±»ỡƒÔ«ñÖëöă¿‰¤ˆ\0#™ëé噉kß [ïS·ºÁ‡é/×:e±»±»ïÀ߈›¾¹ÚËÉ9ôËÉ9ÏÔùסǖŒ öƒv¹Ưƒv¯Èëö«ÔœÔÏÅ«‡“ÍjÛטÛóÂÅ–öÁƠơ™ô‹ëø×¹Úƒvù×ÙÚív½£ ăˆŸ;߈ù×ß½Ûº±»ơÔ¿Åù×­±Ô½È›ÏÅăˆŸ;߈̀ĂÙ½ñǵØÍÛù×›¾ùêîôX̣¨ä×÷ÁÏ̉¥º‡ï³2œÜơÔÛÄӵ؃¾‘¨ÀÛÄÓÛ«‚ ½9ßÚÓăơŒ₫·Øù׽Ƚù×Á|ßZưÁ«‡“ÍjíÖå̉ ™‰kß [ïS‚ˆµ‰çôăˆŸ‡ñ5¥Üñګԫԟ蟺°¿Á̉±̉àƠóÂăˆŸ;kñÓ÷å5Óëö¿‰ϹăˆŸ;k«‡“Íjëö«‡“Íjă÷ÿ§Úª‚ +¼9麛¾¹Á¥Æ«‡“Íjôꙉkß [ïSăˆŸ;ÏÔƯ‰›¾Ù½ñÁîÀ«Ôù×߈™‰kß [ïSáêăà˜‡Ù×ñÚ‘ëµ÷ăˆŸ;щÇÖÛˆ߈·‡‘×8ç Êûª‡’̀jÍÓƒvÎÔáµØÑó‹Ç½ĐÄêéºö‡å̉ ·‡‘×8盾­ÖÅ–¹ÚÑÓ«Úù×™àÀ‡€è/Ö:½€½ÔѶ™‡9¥‡öÍË)éÛ9¥ăˆŸ;ÁƯÑÄëéÓç½̃ˆ +ưÀÛº÷‡ñÚ±»º›¾ÏÔ÷ÁïiĂôÅ·‡‘×8织¹Ú߈·ØăˆŸ½Ă™‰kß [ïSöÜÓ ½¯‰¯0—¶щăˆŸ;kƒvÍĂ›¾Ñ·•›¾‹ßơê©Çï»ĂÙƒ¾‘¿à©‡¥2ßëM¶ª»ÏÔ«‡“Íj˜‰j̃ZîSâơË̉ÿ¯¶˜‰j̃ZîSçÚ߈ÛÔ³ÂÏÅÏÔÙדÆïƠ߈†Œ߈ÓÆ™‡ƒˆ‰¿IºéÚÂÅØăˆŸ¡È9¥‡ËÓÏÔ›éÚ߈¯ÜéÓ›¾™‰kß [ïS¿ÓÇÖƒÚ«&§ÔăˆŸ;ÿ¯¶רºĂ™‰kß [ïSù×ĐÄêù×¶щƒvçÚ¹Áåºéơ±»á©Ơ•ŒÜÓ ăˆŸŸ}éỤ́ÇăˆŸ;ÏßÂƠ¿‰é‚ù׋É0ÙÚÏÔ¯¼¶‡Ö8æçôöÛ½¡Èëö“ƠŸÖ½µØƒÖƠ éïÏԾř‰kß [ïSŸ\шß»ûîDÏ̉߈±ëØͼù×»ĂĂºÛ«‚ ½9½Ù½ÉÖívÿ.ĂÎơ‡ù×ûÙ‡º½ÍÓ—»߈ÚµØ9¥‡Ơ±ÏÄ©ÜÚ×½ƒv«‡“ÍjƠÄæ4óÂ÷¼•½½»Ø‡ŒµÚÀĂ¡ÔåĂ÷ÁÚª‚ +¼9‡Œ¤¾íÅù׃ڛ¾±»ëö£»ÏÔ­¾éÓ¡ƠùÙÚÍƠ›¶éƠ°»ëÚ“Ơ¶‡Ö8曇›¶é‚߈©°»Ù9¥‡µØáÛ†ר¹ÚËÉ9³ÇÙÚÚª‚ +¼9ÑÓ–¾ăˆŸ;ÿ¯¶Ä–÷ˆÍBŽéÓưÀÛ«‚ ½9ơêÍË)éÛ9¥Û×ùºƒÖ°»“½̃ˆ߈‡ưÀƯƒ³å÷Ϲ§Ô½Ï̉ÙÅëÀĂ™ëéå¹ÚË¿·Å«‡“ÍjËÆ‰ƯôôèÄçÚÏ¿ÎÔơĂÏ̉›¶é½€ƒvçÚ—¿«ºÛ¹ÉĂ“Æ‰¾ƒvØ»·ÔÙ´ר©ˆ§Ôå̉ èÔ +»åÁƠºÛ«‚ ½9ăˆŸ£Ư½^ÇÛ³ÏÅ9¥‡ăˆŸ;ÙŒë*«€Ơ ƒà×Üöû*³ÈáÛÑÓơê±»߈¡Û­Ä¢È»ƯÓ ±»ĂÙ¡»ëÓÉ̉ù×ÏÅùêñÓù¿í‡“¹ƯNÙÚ‘â«dµƯÚÀ˜‡ưÀöíêăˆŸ;™‰kß [ïS­¾ăˆŸ;Ḉ¹ÚĂ⫇“ÍjׯõƯ‘±ßÚơê«ÔÅØ°½ƒv߈±»±»ĂÈÛ«‚ ½9—¶ÍÏÔ©‡¥2ßëMñ˜‡À…ÓØ×ÏÄ߿º÷ˆϺ߈öÁ÷ÙÁ,ÿ¯¶ăˆŸ™‡ơĐ«‡“ÍjÙ×—Áù×ăßщêöçÚ¿»Ă ăˆŸ;Û«‚ ½9ù×›¾Ó¾́ơ …ÛăˆŸ;߈å̉ ăˆŸ;ûؠȳÆơÔÏ„ÛÔ›¾ơèÅÊÓí—GǼÙŒë*«‡Œ«âŸ}™‡ÛºÙ׫‡“ÍjơêÙ½Û«‚ ½9«»ª́ù×±¿«‡“Íj³ ³Åá­ÔÚª‚ +¼9ñÓèºàƠß»ûơÔ£»ăˆŸ³ƯµØ™‰kß [ïSô™‰kß [ïS£é×ƠµaÎÅĂÙ§Óăàơ‡¿‰ưÀ‹ÇѶÑÓå̉ ÏŽëđ¹˜ ƯÂׯÇÖ‡߈†j÷ÁÛ«‚ ½9̣ǽ€ψØƠ߈±»×¾ơÔ¯¾ù×ï³2ؽËÉ9‹øµØÿÚ߈­½¼ÓÔÛºù×ƠơĂå̉ Ù»ơêĂÙ×Ü£ä½ëö±»°¿‡Ư߈ív½±»Å±»ÏÔËÉ9ßÄÙáêÍƠË%½Ơ±Ă¼Ơ™‡á¬«·3uU¹9¥‡8¤‡×ÏÅ̉ºÏÔË̉ÏÔ8¤‡ÄØ¡Èëö纩•Œ¢ 2…ƠÛ«‚ ½9÷‡å̉ Ù‡Ï9…ăˆŸ;º»Ú̀Ă8¤‡ĂÙ€ƠƯù×ë;«‡“ÍjăˆŸ;9¥‡£ä«‡“Íj¶×Ơ«r‡åĂơê¿ØÛ«‚ ½9Û«‚ ½9Ûºẳ½ÙŒë*«÷¼ÍÓ«dÍƠăˆŸyù׋¿ß»û׿8®GøƯ Ç̀ÅØƒv±¡È°êØÏÔƒv«‡“Íj¾ù×Ơ¹¼ëö߈ăº¿‰›Ú±»ß»ûŸÖÅÄûÂÛ«‚ ½9¨ºå̉ Á‰ƠỮư»Ø¿‰ͽ§ÆµÅÍÓÏÔ°» ½€ƒvø¿ÿÚ“Èâˆ;8¤‡¡ÔÂ÷‡óÅ–ÏÅß»ûÙÅÔë™Háî÷‡©‡¥2ßëMăˆŸ»ôơÔ±½ŸÖ8¤‡ÁÜéơ¾́ơêÿ¯¶©¼§ÓÍĽù×÷Áƒă»Ø«ÔƯ«‡“ÍjùêëƯÏÔƒØûÙÍÄÛ«‚ ½9ºëÂù×™Á¿u¨ØÁ½Ổöø¾ơê‹ÜÛ«‚ ½9›Û¦ô¯¼µêÍË)éÛ9¥™‡£Ç·Ü»Ø“ȇº›¾³ºó9¥‡ăˆŸÛ×ùꑾѻĂÙăˆŸ;k½ǽ«ÔóÂívÅØÓˆ•=‘œÜ!ÁĂ%±ƯÁñ߈ùóăˆŸ;‚v—ˆôêơêù×­½¼À̉ÏÅ©ºÛÄӣǫÔßÖ£äëƠU›Ă©Ó߈«‡“Íj»Ă¡ÛưÀ¡Áö9¥‡åÁ9¥‡§àƒvµØ¶̣Ë̉µÛ߈€ƠăˆŸª‡ ’ ̀j ·Ôß»û•ŒÙÜíÖ߈ëö©ÓơÔóÔĂƒ¾‘ÈÑÓ߈ưÀỞùר¼ÑƯôêÏÅß»ûÙÚ·Ô˜‰j̃ZîS¤w½«Ô‰¿Iá=ưƠ—¶±»ÖÆ#—Ó¹Úï1¼Ÿ}‡ºăÁÑÓÛ«‚ ½9¡Ơ߈½ăˆŸ;ă­±»ăàÇÖÓ¼¾×¾³Û«‚ ½9Û߈Ù½³Ü™‰kß [ïSÿÚ°¿ÙÓµØˆÓØé꫇“Íj¡ÛÅĂÅàùê¹ÚƠ™‡½±»µ‰́ƽ،ê*ªƒv¹¼ÏÅÏÔ߈ªô«»«‡“ÍjǼ‹Ùëö¡Ó“¹ƯNëöÏÅĂÏį§Ô¿ñăˆŸ;åÁ‚Ö¡ÓǼëö·‡‘×8çµØ È¡Û«Óö$‡º߈÷‡ù×½ăçđÜö‰ë’ăˆŸ;鋱µØơêçƠŒºĂÙéêÁ‡é/×:³”“Ơ߄۫‚ ½9Ó¾¨º +‡º·ưÀËçÚ±»ÛÀẳ»ˆ¤́µØÿǃv¾ÍÇ›¾©¼³ ‹Ç¥Ó©‡¥2ßëMÙ»ăˆŸ;‚ +¥ÖÅØå̉ «Ô³Â÷‡¿‰ëÓ»ØƠÅı»ÍĂÅẴˆ߈µê߈¾°»Ó̉ÑØ©Ó¿ºÙŒë*«Ă¼¼ôÏÔƒăˆŸëö™ÁÑӇljÁÏ̉ăˆŸ·Üÿ¯¶‰¾#¿Å™‡¿ØïÛ«‚ ½9‡ºϼëöûÙ­Ø߈Ø ½Ïă֙¶ôê©Ç¡È¼ÈÏÔÏÔçºù×·ÅËÉ9ăàï»ÏÅ̃Úÿ­÷Á±¿ăÇí±¿Ÿ}™‰kß [ïS¾ĐÓ!Û«‚ ½9ó“³Ü«»á=¥â›¶éËÉ9ăÙïô‹ÜÓØơÔ—¶·Ô‡Œ¥ˆ]1×Ơù׿ԋÇ9¥‡«‡“ÍjăˆŸ;º™ëéåïiÛ«‚ ½9Û«‚ ½9›¡ĂÙ½€ùê³Âơê¡Ơ¾Û«‚ ½9„ØÙÚ—Öùê…ƠÙ×Á̉ÑÄë™ÁÛ«‚ ½9ƠX™‰kß [ïS±»›v¹Áëö‡ŒùׯG‹ø̀ºçÚ¡Èï½ÓºؽµØÑ¥Íÿµ¶öç ƒˆăˆŸ;á ¼ô@ô¥ˆ]1߈—±°»ŽëÓ͉¿I›¾ƒv«‡“Íjùו×Û«‚ ½9“Æ›‡ùסÔ₫Ú­¾§ÆÔX±»ưÀÛ«‚ ½9߈»½ƯÅØƠ°¿ù×ßëö›‡Ăøÿ¯¶ĂĂ߈ëöù뇌‡½ù׫‡“Íjå̉ %Û«‚ ½9ơÔ…n§Æ•«Ô¹ÚÙÚƒv¡ÁßÚƒv±»ù×Á¹¹ÚÍ­H‡­Ä›¾×$Ơ½®¾«‡“Íj߈ÑÅù×ٽ맿 ¾™‰kß [ïSơê÷Áù×ÅØºqÛÄÓ«·3uU«‡“Íjùó߈¾­ÖưØëÔÛº±½ù×ùºĂ談“Íj©Øív‰¿IÓŽ€Ÿ}ÑÓ£ä߈÷ÙÏÅÇùêËƠ±»÷Á½9¥‡ĂÙÚ¶°»Óƒvơêκ½¿ßªÚĐÄê9¥‡åƠλɽ߈¡Á¢Èƒ½«ºÏ̉₫g®¶gÍË)éÛ9¥ơø“ÆàêÛ«‚ ½9¡Á½€‹v¿ô䙉kß [ïSËÉ9ñÓ©‡¥2ßëMùׯG‹ø½߈÷Á¡ÛÛºù׋ÜÏÔăˆŸ;̃¼£»Ù׉Ư±ÙÚ—ù¿߈±»™‰kß [ïSª»ƯÓ ơêøô³«¼¶ö÷Áƒv9¥‡ºä×㻵†ù×ÑÓăÁơêÑÓ¶̃öÔ¾­ÖåÓµù×߈ÛºçÚơÔ¿Å™Óï³2ß»ûÿÚû¶ÂÙ÷Óâà&ÄÓö‡ÛÅá ­Ø‚v·Ô¹Ú•Èû›ơê³¾Ë4ÇÖ±»»đ™Á¥ÆëöÛÄÓ£X߈ĂÖÛ«‚ ½9£ÓÏ̉íÁ÷ÁÚÀܽÅô÷ÙÓ¼êÚ Ñ™‰kß [ïS‡ÇÏÅ©‡¥2ßëMéÓçÚñÖ±©±»¹Ú«‡“ÍjÇÖ9¥‡ÏÔ»¼‘̃ˆ±»¾ív©Ç¡Áß»ûÁĂÙÅë™ÔµØ߈ÍË)éÛ9¥öÁÍ᫇“Íj߈ưÀƯ‰ôê¡ÈĂØ ËûăˆŸ;Û™Ó¾ù¿ăˆŸ;k¡Û©ÇØ×…¾½øêÙ½ƒÔëö¿(ÙqŸ»çÚÏÔŽËÓ¬¼ăˆŸ;k׿8ÁƯ¤ÛÀ½•Èû›ÛÄÓđÄ·‰ÎŃvƒvÛ«‚ ½9ÍƠÇÖăˆŸ;ĐæÏÔƒ¾‘ơïÚ߈ƒØ™‰kß [ïSñÚß»ûáê“Ơ°»Ù½ƺª‡’̀j©‡¥2ßëM¬¿½ÜÅ–¸Ú§ÔăˆŸ;÷ÁŸÅ₫ƒˆ³ˆÚÀëöưˆÙÚĂĂƒØö†Ç§Ôù×Û«‚ ½9§Ô«‡“ÍjăˆŸûÙ½€“È‹ÇÙÚóÇß»û«·3uU‰y¥Æÿ×±¿Ă[ăˆŸ;†ŒÛ«‚ ½9±»›¶éä¼߈‡Œ…ƠÛˆÛ›Ú½Û«‚ ½9ív÷¼âà±̉ăˆŸå̉ ™ëé媇’̀jÏÔ›vª‡’̀jÏ×¾‡ºåƠƒv¹Úê¼—¾çÚ¡Ô߈‹Ó©Ø™ơƒ½ÑÓÙÚ Ëû†´ïƠÀ½¶­Ä߈ăˆŸ;ëöăÁ™ëéåëöÛ«‚ ½9ù×áêăˆŸ;»Ø₫±»ƒ½Á½½߈›¾ÀÓƒvÁ̉¼™‡·ưN½±»ÇÖ9¥‡ÿ¯¶ÿ¯¶÷Ù—¶ƒ½‹ÙơêÚƠ™Ó̃»úù×áºÏÅñÓàØ ©‡¥2ßëM‰¿Iëö¶èƒà¡Û«·3uU9¥‡¥ÏÁܱ¿§À¿ôăˆŸ™‰kß [ïSÁçí‡Ç¿ψơ$÷‡ƒv߈ơÔ˜Á™‰kß [ïSá «âăˆŸƯÓ ‹ÇívùêÏÄĂô¨‡'¤2'€'̃'ê'L''¾ººØÁĂ¡ÛüÀ˜êèäÁ|ăˆŸ́¹ÚµØù×ß»ûëöƯ­ÄÛ«‚ ½9©Ó…±»¼ï½́|™‰kß [ïS¾ ͪíÁ½ÿờÊ)èÛ8¤¡Èăà߈‹ÙéÔáà™‰kß [ïSÏÔăˆŸ™‰kß [ïSÅ9¥‡߈ó³ÈψÛ«‚ ½9¨‡¤2€̃êL‡ÅØơêµĂ±»ß%Û«‚ ½9åĂшÀ€éêØ×̃ˆÁăƯºö÷ˆÙ××¾¹̃ÏÔ±»¿Ê“‹ºØïÚ½Ïũܸי‰kß [ïS߈Á̉·Ô߈ùêÏÔăˆŸ;ÛºÙ½ăˆŸ;kƒÿ¯¶™‰kß [ïS™‰kß [ïS«Ôăàï³2—¶ăˆŸ;˜Á™‰kß [ïSÅ»ÏÔƒàßϵµéê¯øê½߈È‹Ẹ̀ùêë×ă»Ù½ÏÔÁ̉ûØ߈×ÏÔŃÔÑĂ“Ûó¶ܛ¾™‰kß [ïSỞăˆŸÑÓ™‰kß [ïSɇÅà…½ÑØÁ̉ûœÁ«‡“ÍjĂèŸ·ăˆŸ;k«‡“ÍjÑÓ߈âàÏÔăˆŸ$‹Ù­ưÀçÚÏÅơ‡ăˆŸ;ŸâÙÚ÷œ©‡¥2ßëM½±»¦º߈߈¿à™»å̉ “½ºçÚ›¾·̣ù׿‰½½ùêóÔ±»Ûº›¶é˜‰j̃ZîSÙÚÜÛ°È•Œ÷Ùăºêö¾º˜‹«‡“ÍjÑÓĐØ9¥‡8¤‡¡ƯëÚăˆŸ;ߌÛ,¡Ç«·3uUüÀËDZ»©¼ÛºÑĂË̉Ó̉ù×½€›¾“Û™‰kß [ïSëö·‡‘×8çö¢Ơ¢ä¼€¾‡Û¢đ°»÷ˆø×›¾ÍƠ©¼Ѷăà«»«‡“ÍjÑÓÛ×§ÀƒÆµÍæÚù×¶ÍÓ¥ˆ]1±½›¡‡ö…»Ư+ĂÈ¥Ù9¥‡«‡“Íj߈Ở…Ôù׳ å̉ ÿÚ­ÄÁ¹ơèÅ›¶éÛ×±½ÙÚ£ØđÆËÖ›¡­ÄÙÚ×¹Ú±½©Âù×ׯ¿ÅÛÚ˜‰j̃ZîSĂº±»ăºĐĂèê¹ÁÏ̉Ÿ}«)Û×ëö¾Ơ©vóÇù¿‡x“‹·ØμîăÁóÄÍÄơÔ«‡“Íj±»«‡“Íj‡Ï̉÷ÁÑÄëÛÄÓùׂ؟–¶Ç»÷Ú±»ëơ’a߈ª‡’̀jÏۺ׿8±k™ơŸ}½€µØƠ±¿Ǽ„Å麺ÛÀù×›¾Íß©‡¥2ßëMƒÔ©¼Ï̉¢ä™‰kß [ïSÑæ³…¾©Ó߈ûëöÖ‡¼7™‰kß [ïSψÏÍBÅÙ½‹Üùê™ÔÏÔơèÅÍË)éÛ9¥™‡áêÀ¼ëööơ»Øª́߈ÅØ9¥‡±»˹“ƠËö¶Ü™‰kß [ïS̃»úñÚ‰Û߈ÑÓªº©ØÏÅÁ¹ÚăˆŸ;¶½íư«‡“Íj©Ø×¾å̉ ûز +Ơ¸ÅăˆŸ;»̉ñÚͼëöơÔù×Ơľ́£X‚匿N÷ÁƠ¾GăàÑĂ—»½µØƠ™‰kß [ïS¦È¿ÙÁ½ö§ôĂô9¥‡ƒ×¼ËÇ÷×›¡Ở˜‰j̃ZîS÷ˆÁ‡é/×:ù××ѾƯûÙ½À̉%¿‰½È©Ç̃„ƠơöÁÿ&ª‡’̀jăơ°»‹°₫®¶™‰kß [ïS·‡‘×8ç¨Æ ÏÅăˆŸ;ÏÄ™Û߈ÖơÔùº·Ô§º§Ôï½êö +½«·3uUƒˆ™‡ß„ùׂ›Úï½ÓºÅ—Óóè ËûăˆŸ;…Ö¡ÔĐ¹ÏÅ«‡“Íj߈›¾£à£»ƒvçDZ»í—G™‡©ÓƯù×Ởº™‰kß [ïŚºÿ§ÏÔÜăÁ½ơèÅ­Øív߈˜‰j̃ZîSµÈÏÅÁƯ«‡“ÍjÛ8¤‡HĂĂ ›­±àéMá ›¾ÑÄë½È·Ôù׃۫‚ ½9¹Úù¿åÁĂÙ¡È9¥‡»Á™‰kß [ïS·Ó ¥0™‰kß [ïS÷‡Ô¹ÚÛƠ‚vùêăˆŸ‡ŒÛÄÓëö«‡“ÍjÿÂï½߈ޱ»µà˜‰j̃ZîS½ï½™‰kß [ïS±»ƯƠ—߈‡ÇÛº¡ÔÏÔ—ÓÁĂ÷ÁÏ̉ÏÔ°»áÍÓ¾¹ÚÙÓ߈ë₫±»éê´ưŸù׃aßqí‡ׯËÓ×ƠºưÀÁ¹Ù½Ơ™‰kß [ïS9¥‡íÆÁƯßÚ$©¼Å±»ĂÙ̃»ú÷Ô»ØỞŽù×±Ăơ…%ƠÁׯ½ŸüÀ“È÷‡ëÚÛ«‚ ½9±»ăÇí¾Ă»ƒv½¯ô¯r‹Û×¾ÁƯ餫‡“Íj«‡“ÍjíăˆŸ;kçÚ߈ß»û¿½ăÁµØÁÚ߈éÄÄÙ´±»µØ9¥‡ºר—ºÛ×¾½ĂĂ•Èû›½ïĐ‘ơ‰ÛºåŒ¿NơƒíËá̀“ƠăˆŸÏÅÙqßÏß»û˜êèä±»ù×ëöÛ́™ôµØ™‰kß [ïS߈ú(º¼ëö߈ăˆŸăˆŸÓÍźÏÔÅô¡Ô£XµǾÙƒÖÍñÓ±»±»ÏÔ±½ÁÔ•ŸƠ±»ơºÛ«‚ ½9ăˆŸ߈/ׯÏÔÙ½‹ÛƠÖĂ­î£²çôùê¶%%ù×ÍË)éÛ9¥—ˆ·‡‘×8ç‹ÜÛ«‚ ½9³½ïƠéá=‰Æ¡È‹ÁăˆŸ;ÍË)éÛ9¥º±¿±»£Ơå̉ µ§¹²Â±̉‡ºɇƒvÏå±»ÁĂƒvñ~ÔÓÛÀÇĂ©ÓÙÜâˆ:‰'»‘Æơê›Ă¥ÈÑæ‰×ưÀư“ǼĂ¯G‹øÛ›Û˜êèäßăÏÔ±»ÏÔ߈öªÚ ÷ÁàÄC™‰kß [ïSßÄÙç߈߈·Ï9¥‡‰ơ·Å·ôéØơ꽡Á›¶éÅ»¯G‹ø«‡“Íj߈«‡“Íjï½±»ͼơê·¼Í7ñÚ©ÓơêµØ“ÈÙ½ơÔרÅÔëÚù×ÙÛ×ÑØ̉Á¡Á‹ÇßÓÏÅ•Ó:™‰kß [ïS™‰kß [ïSóǻ؃vÏÔÛ«‚ ½9ăˆŸ;k§ôÛ«‚ ½9‹Ü8¤‡ÖÿÚ龫ÔƠƒvᬫ‡“Íj©ˆ³ ùôùê±»ơêÉƠù×âˆ:£X÷Z¡ÁĂÈ©‡¥2ßëM›¶é¼ª¶2tT”ŒÎŃ×Úª‚ +¼9Ëǰ»±»ĂôçÚ½€Ù½…ö¥ĂÅô₫®¶ÿ¯¶ĂÈ߈̉ÆáƠ·ÅñÚ÷Úûóö—ˆÁ½Û«‚ ½9ßÛÄÓƒˆùׇŒ°»­Ø—¶½ëöñÖñÓ™‰kß [ïSÍƠù‰ÍÓœ¿ÂÙ’½™‰kß [ïSù×ÅØ˜‰j̃ZîSßÚÍÄÙY½½á°ùß—¶щ±»‡ŒàƠÏÔ¡Ôó·ÅËÉ9¼íÖï½Ơï¯ÈϼÅ·¿ôÅÄù׆$ëöưÀÙÚÅÔôƒÙÚ×܃Ŗå`߈ăÁùº±¿²¹ ëö·Ô½ôÓï©Üăྉ‹ÇßÄÙ™Ô¯ÈßÅ˹½Ó±¿߈ăºÏÄÛ«‚ ½9ơêÍÄ™ÔĂº±½•Œù×í‡ßù×ɇ߈øæ»åßÄÙ¡ÔßÚ©¼ă¹ÚÅƠÏÅñÄôù×µØï»±»…öƒˆáƯ®¾˜êè䙉kß [ïS»ÅÏÅăˆŸÙŒë*«÷‡­Äù׋ÛÙÚ߈ñÓ«‡“Íj̃%óÖ¹ÚÏÔÿ¹ÚÅß½ïÚ‡xÑĂÏ̉óÂñÓƒˆ·Ô³ºóå̉ ÙÜ¡Óù×µØ÷ÁÁñËÇ€ÇÓÅ™‰kß [ïSÛÄÓá¬ÅỗˆơêËÖÍöéêỞ¸ÙĂ«‡“ÍjĂÙ¹Ú9¥‡éºöù׫»ăˆŸ;kĂÙåôÓº—¶sƒ¥ëö™‰kß [ïSăˆŸ;ËNjǪ»(Û«‚ ½9ơêÙ½ǰ½ÛÑÄëɇ³ÂåÁùØ×ÅØ’ÆÑØ©‡¥2ßëMŸ ăÇí¨‡¤2€̃êL߈˜‰j̃ZîS“ «ºÛ«‚ ½9̉ŽÏÔĂ›¡½°½ÅÔ³µÁ¤Ûôê½߈µØ¿ơßÁ¡ÛưÚûÖï³2™‰kß [ïS9¥‡ưÀñÓÓÅÙÚûM›v±»ÿÛ›¾±»“Ớº×¿8́±»µØß»ûăˆŸưÀù×óÂ߈ëöƒv¡Û«‡“Íj‡×µƯñƵءۭ¾ơêÅÿÔÏÄß»ûψÎÔäÁ€Ç áêÀ¹K¿‰¤ˆ\0á ù×Åô¹Úù׿́—¶·‡‘×8癉kß [ïSù×Ó¾găơ߈»ÅÁẴ½Ù½·‡‘×8çơèÅÿ¯¶Ï|µÈ½¿‰í—GéôÙ½‡ºº“ÆÛ«‚ ½9ùêưÀ9¥‡ßÚÇ«‡“ÍjöÏÔ—»‚vÛ«‚ ½9ĂÙ°»÷‡—¶÷$Ó´ƠñÚñij¹߈ăˆŸ«Û³ôËÓÚÀăÁ™‰kß [ïSçƠ™‰kß [ïS߈ĂĂ߈ăˆŸ;½£ØƠå̉ ù×Ơ™ÁÛט‰j̃ZîSƯ±»ăˆŸ;kÏÅÊÖĂæÆ…»«‡“Íj›¾ăºçÚÈ̉Ϻ‹Çù¿Û«‚ ½9½é‡ ¥Ø½½ô‡óǽ©ØµÜăˆŸ«ÂăˆŸÍÄñÆ«‡“ÍjÆăˆŸăˆŸ߈₫¼åĂƒó±»ÙסÁÅÄ«Ôëö¸ÚáØÛÄÓơèű¿¼ÿÚ9¥‡¿±»ƺÑĂƒvË¿²ÖÓ±¿ÑØÁƯ±»ß»ûÙ½Ô¾FăˆŸíơáêéÚ±»ưÁ³ÈñÓ½£ä½€ëö™Á½¡Æ—¶§JơĂ¾½€Ơ`ưÀÂÙ·Ô™‰kß [ïS«‡“Íjƒ×Û«‚ ½9™‰kß [ïSÁƯ«»·‡‘×8ç÷ˆ·ÔơêîÅ©ˆ·Ü«‡“ÍjăˆŸß»ûĂĂơé“ÛƯÓ ƒvÜ©‡¥2ßëMƒÔ%÷Áù×ăˆŸ;™‡¯¼ơăˆŸ;ĂËÉ9ׯÑĂ™ëéå±%ÛÆ‰¿IÅÓơĂẳ‚âˆ:öĂÙ¨¼™‰kß [ïS§ÓÁƯ߈“ƠÅßÖ‡ÚÊq›Û«Ổ½ñÁêöÛ«‚ ½9›¾“Ơ©‡¥2ßëMÙÚÿ½€Ở°»Úª‚ +¼9Ñ̃ù׫Ôß»û›v‡×œÁ¡ÔÇØ‘Óº«‡“ÍjíÚơèÅÿ¯¶€º·Åψ¬Ä©‡¥2ßëMƒØÙ½·‡‘×8ç“ƠôơÔÏ̉ÍĂØ×¸¾ÏŽÑË«‡“ÍjÁĂÏ̉¬ÄƠôˆ‚ØäơÑÓ÷ÁÙŒë*«¦̃½Ô8 ¤‡ ƒÚ‡½—¶óÏơÔ“½±»»ôÙ×ÏÅù×éÓ°”±‡‡xÙ½ù×ä̉ƒÖÙÚ¡ÇƠ¡rĐæ‹Ó߈™‰kß [ïS÷$³¹₫ ߈¤Âăº»~ÓºéºÅӵ؛¾ưÀÅÅØÅ–ÏÔÙŒë*«ƒ×߈‡Ç“ÈßÅăơÁƯÿ×˹‡ºă餈\0¡Ô‡¿±¿í‡¾ÏÔƯº‡Œ¾·‡‘×8çÑÓ½ơê®Gø߈ÙÚù×ù׉¿Iù׵؟óÛ«‚ ½9ăˆŸ;«‡“Íj¡ÈæZ/ÏÅ«́Đ¹öơ«‡“Íjív­ÄßÄÙÙ½ÏÔưôÛ«‚ ½9ï»ĂÙ÷ÚÈñÚ…Öß%½Ô߈YưÀù×™×éºÅâ÷‡ù׆(˹ư“íÙûƠ½ºyoĂƠá Ở¬ô ·‡‘×8çƒÚơ‡³Ϻ×Óơꇶô±»‡½Á¹ơOÛ«‚ ½9‹ÇǼëöÄ«‡“Íj†ŒÛ«‚ ½9Y܋ǽô±ÁÛ«‚ ½9Ù½»‡Ǻ‰̃Û«‚ ½9‡ÇùêØ»ăàù×ÍÓ'«‡“Íj×­ù×ƯÓ ½à×$˜‰j̃ZîS̃ŒÚ,ÙÚçÚù×½¨÷‡ù×9¥‡©Ø«‡“ÍjÇÖרóÔ¹ƯÓ ×¾‘ÿÚ£»ơ꫇“ÍjÛ«‚ ½9½€“½Íå߈ùê»÷—ØßÄÙöÁ8¤‡Öø|ĂÚµØç̉ưÀª‡’̀jƒv߈ÏÄùêÛ«‚ ½9ÛÄÓßÄÙƯºÁ ©‡¥2ßëM©Ó­ÄóÂÚ ª ‚  + ¼9 ¼½·Ôơê9¥‡¿‰̃ˆù×½€ÏÔ½9¥‡Ë¿·ÔƒƯê­”“ƠăˆŸÛ«‚ ½9­ÖơÔÏ9ñÖñ½»¿́§Ó‡߈9¥‡9¥‡ØƠøêÛ«‚ ½9öÁ «Ô‡ÚÍË)éÛ9¥…»¹ó¥Æ#ơÔº̣ÔÛ«‚ ½9€ƠÙ½ªÚºÁÛ«‚ ½9™‰kß [ïSí0ưÀ‡Œ£ØÖÆăơÖÆ±»«Ô™‡߈ƒ½ù׷ۥؓÆöµØ¡u©ÓăˆŸϼ·‡‘×8çæºÙ@ƠĂ¼ƒ…Øͼ½ơÄá?ŸÄ—Œ©¼ơÅù×™‰kß [ïSÙÚÑÄë½±»Ê%уˆÂù×ăˆŸ½ĂÙàÍϘß»ûëÓ—ŒÙYôp¡Ô±»›¤§ÔĽ±ÜÁ̉ÏÔ™‰kß [ïSù×çÚçô¬ÄăˆŸ;ÇÖ髇“ÍjÅØƒ¾‘™ÓưÀ´†ƯÓ ·Åµ‰µØ±Üå̉ Û«‚ ½9găˆŸó×ÛÄÓÅØ°»«‡“Íjó`·̃™ÔÀ·Ó ¥0ù×ăˆŸ;§ÔµØ­Ø¹£™‰kß [ïS߈ă߈ǺÓµ¥Ö®GøưÀ Á«·Ôᬫ·3uU§¹±»¼ĂÛ«‚ ½9ăˆŸÑÅ9¥‡××Ó‰yĂÙÓ¼ư♇“¹ƯN½ùô·ÅëöÏÄAÏåûƠƠµØ߈÷…øëñÓŽ±»̀Ä©‡¥2ßëMçô×$±»Đñ»ơê“×÷êó¶ç̉ăˆŸăˆŸ;©Ü߈ų³ÆåדƠÅÛ«‚ ½9ùê¼ÔÁƯ³ºó÷ơ§ô¹¾·ÅùôÛ«‚ ½9ô‰ÛÚÀÛ÷Á½ăÅ›¹Ù½ͼ¾Å”º ËǺ‡x±»¹¡ĂȺưÁ±¿ù¿ù×Ù½½ô«‡“ÍjíƯËƠđ¾à,ó¡Խƒv́ÁÓ¾“½Úª‚ +¼9¨¼«ÔµØáê»ËÉ9߈¿ßÚÀ“¹ƯNåĂñÓÛ«í.÷Á¸ÚƠXŸ»‘%̃¾·‡‘×8çÊÈ9¡ÁßÔÛ«‚ ½9ÏÅÁăơêíØÅؽÈ÷ÚóÛ×»ºƒØÄ«»¼Û«‚ ½9…Ú¿‰ù׃·ÅÈăˆŸÛºÁ™‰kß [ïS9¥‡ëöíx›¾‡Ç麽·‡‘×8ç‚Ù ¹Ú°»­™‰kß [ïSª»ÍË)éÛ9¥™‰kß [ïS—¶ªÔÅỔ÷ÁÁĂÁĂˆר°»§ÔÑÓăºàê™ëéå£äß»ûÛ«‚ ½9¿‰“™ÔïÅËéßÄÙ·Ô«»߈ăˆŸ;ƒvß֓ƇxâˆỞÜÔ½ĂÙ«‡“ÍjÏÑÓÎÅ Í0ïAèêéØ̉̉¹îÙÚÛºù××DÄÓêö‡Á×ơ꫇“ÍjÏ̉ÏÔù×ĂĂ£ÇŻٽ÷Á±»߈¸£ĂÙÈøºĂȽ±½¹Úш³–ôĂ½ñÖưˆ¹ÚÿÚ²߈ÏÔƒK9¥‡ôŒE÷‡Ù½áƠ…ÆÁ£ÏÅăˆŸ;±‡ø×ƒ߈ëöÏÔÚª‚ +¼9«ÔµËÇơꙉkß [ïS¿êÿ¯¶›¾—¶ëöù×±ó—¶߈ơÄºÅØăˆŸ;·‡‘×8çûăêÛ«‚ ½9‡ŒÍÓÛº¡»·§D ùêµÏ‹Ç‡ŒÙƠ¿Åëöº¼ĐĂßÚ­Û׿‰Ûº̣ƃԡÇƠ9¥‡ØYÅØĂ¹ÚÏÔßÁëöÿÚßÄÙÍÓÚª‚ +¼9ï²2±»ƒˆçôĂÿ¼¯×é¾ưÀ‡Ú¶ÇÖ“ÆÛ׳’Å §Æ›¾ƒv߈ƒ½åĂÛÄÓŸ¿ƒÔ÷ԯȱ»Ïź½¹Ú8¤‡¨‡¤2€̃êL×ĂỞçôơĂĐ¹½ÈÏÅ™‰kß [ïSÑØçÚ½ô9¥‡¿‰ëö½çÀù׫Ôù×ÜÓ ÏŃv¿ÅßÏó¹YÛ«‚ ½9ù×ăˆŸ¹Ú±»ÛăˆŸơêÏ̉ÄÓ™ÓÛÄÓăà˜‡©-ăˆŸ;óƯ¨ŒÙÚæ©àª‡’̀j߈Óůӫ‡“Íj†ÇÛ×Ù½£äÈÏ›ÂưÀ™ŒÍÛ«‚ ½9ä̉  í‡ÿÛÛ×øê÷Á}çÚù×±»˜ơ™‰kß [ïS…ô©¼‹ÛơÔêöơê߈âºĂµØ›Ú›Ú̀Óù×±»ăˆŸ;Óº߈§Ô÷‡‹!Çâ9¥‡"³ÆíصKơèÅăˆŸ;kÁ¼—¶߈ăˆŸË¿ù×ëöÙ½ï̀߈Á¹µØ½€ƒØ8¤‡ßÁ§Ơ«&ăˆŸáê¡ÇÏ̉딙ؽ›ÓƠ…»öÑĂ™ô‡9“ÈÏÔﻃֺƠăˆŸ;¡Ô½ơ$¨‡¤2€̃êLơèÅш•Œ›¡¡Ơÿ¯¶³ØÙ½÷Á±»߈óÇèÔÏÄ«‡“ÍjÁ¹ÁƯ±»½Áщƒ½ˆ™‡†º›é€ØºƒÖéôჽ—»å̉ ăˆŸ;Ï|µØÏÔ·Ó ¥0ºăˆŸ;ËÇ9¥‡Úª‚ +¼9ưÁ™‰kß [ïS·&ÏÔƯâÙÚƠÜÛ«‚ ½9ÛÄÓ±»“¼§ÓÏÅƯàËÓ¡Ó߈çÚͺ·ù×¹Ú½ÎÚ·Ô©Ø‘ơÙ½ÍÄĂȱ»ß»û8 ¤‡ ×Ï̉¡Ô½‹Âẳ™‰kß [ïS߈ĂÖ¹÷‡—»ÏÔµØÏÔùê߈©¼çÚ½Ă¥Ç·̣ơꀈ½ăˆŸ;ÙỤ́¹Ú‡™ơĂôå̉ ĂÈ­̣¡ØÏÅÆ—¾ăˆŸ;k«‡“ÍjëöÁ‡é/×:ƠÍË)éÛ9¥ñÓÈ»‡~ßÖ¡Áơê-‚Úø×çºÍÓÓÅăềÓçÚö̉ËÉ9Ù ưÀǺׯĂƠ‡ơ¿»߈̃ÄØñ»óÇçô™Ôù×¥àăơϼ¹Úéºù×…ÛÇÖÛºÿ¯¶©‡¥2ßëMÏÅÂĂ×»ÁăˆŸ;©ÀăˆŸ;¹ÚƯÓ ¯Åç̉ö‹Ûîº ă»çÚ‡Úù×ơê »½Ưº9¥‡̉̉±È¹Úɇ§›ÿÛ™‰kß [ïS×Ơ‡¡Û†ŒùÜù×ù×™‰kß [ïS½‘Û߈…ÖÓ´8!¤‡!Öƒơ©ØÏÔ­ØÑÄë¿ØÏÔ˹•¾º¼ÍÄ %í—G×ÓíÆƒÔ‡Ûº—́ÁƯ±½ÓØ‹½“øơº8¤‡ÖÏÅÙÚÙÚ©¢ơê—ˆø$ơ»“ƠÇâ“ÈăˆŸ;߈ăÚ«‡“ÍjÛ«‚ ½9ïô«‡“ÍjËÇÅÄçôÜ®ƠÛơăơñ̉ÿ¯¶‰y¾¹Ú°»µØÅñÓăˆŸĂÏ̉Ƕ°½ µØÁ½½½ª¶2tT‹ÜÉ»«‡“Íj½Úª‚ +¼9ïl‚vªbçôăˆŸ;߈ÇĂÛ«‚ ½9Ùڳוǫ‡“Íj÷¿ăàÛƒÑÄëơÔ©¼•óƒĂĂÏÔƒvº(™ÔÈ +ùêÁĂº1 1Ö1†‡1ü21ôêÛº±»Ûǯ̃ÏŧÓÁ÷½Âi ii¬i°àiièMi›¾½€™ÁÛº÷ˆ®Gø·ÔÉù׳ù×9¥‡×ÙÚ‚v»ĂÚ×·‹ƠºmçÚ‡á‹&ù×߈¡Èơԋܤˆ\0ÁåôŸÖ‹ÇÁ̉µ†Ù½¤Æử³à½ÏÔ·§D Ûº«‡“Íj‹ÙÁƯÁËăơ´a߈щµ‰߈îÅÍĂ÷Ú—¶ÛºĂÙ±»ÍË)éÛ9¥‚ØăˆŸ;ÏÅ—Óù×ÓºßÁóÂưÀ«»9¥‡«Ưö·Ôçá½ùê߈ÁƯ÷ÁÏÅø×ÏÔÅ +µ.¥Ù¿ô­ÄÅÔ½©Ç«»‘ơù¾ĐµØù×·‡‘×8çĂωÛÙ½ËƠ«‡“Íj×¾ŸÈÛ«‚ ½9ơê¥́«»Ë%™‰kß [ïSá ߈Ở»ØÛ«‚ ½9̣"Ïű»ÑÄ뼵ܽÙÚáƠ¹Ç¿‰Á‡é/×:“߈ă»ÂÙͪù×¾ºÚÀâà€ö…ÇÓºáçƠÓ¿‰ÛÚ’º¸ù×ùפا¹ͽó Ëû‹ÇưÁßÏ©‡¥2ßëMá ï½Áó߈å̉ áívăˆŸáêÏÅÏʉj̃ZîSÉ ßÚÅØÿ¯¶Óºö•èù×½ÔöĂöÁ9¥‡ßÖ«÷ÏÔƒÖºy ÙÚ9¥‡·Ö›¾߈˜‡ơÄÁĂĂÈÑÄëÓ́ơèÅǺ߈®GøÏÅö‚س8©‡¥2ßëM÷ÁƯ‡Åù꺱»ăˆŸ;™ÓÛ«‚ ½9匿NĂÙ«‡“ÍjĐÅóÇăˆŸăˆŸ;Ăùê}ûÖÏ‚vÏÔÙÚù×éÓóÔÛ«‚ ½9ơèű»ç'¸ÚË̉³Øƒv߈Á×ÿ¯¶½ËÉ9å̉ ‡Û̉ÅŸÅëö̃„«‡“Íj‰ơÜÅÔ©&ÿ×÷Ù߈Ù½߈ÏÔëö£Ó½¤ˆ\0߈‹Çá=‘±½á́½ +ÔX܇گȯG‹ø‡“ÁÙ×™‰kß [ïS§ÀƠÅöÁß»ûÏÔëöÿÚË̉“ÆÁƯß»ûĂÙÏ̉ĂÙĂÈƒĂ«ÛרÂö¡Ô¥ÁăˆŸ;ÛăàăˆŸµØÚ±½Ê¿ƒÔĂç̉«‡“ÍjÚª‚ +¼99¥‡ Ëû‡Œ¾ï³2£Ø±»ä̉«¼ä·ĂØYÛ«‚ ½9ăˆŸ;«ÓåÁÙ½߈ăˆŸ;³ Û×±»ûÓ¯ÓÏŽԓƘÁâˆ:ƒ½³ºóχÉLJک‡¥2ßëM½ÓÅ€Ó½§ƯÏ̉±ëØ«‡“Íjå̉ 9¥‡×™‰kß [ïSÓ¾‹Ü߈èÚﻃvöµ†ơê¥Û›¶é«‡“ÍjĂÙË̉ËÓ‰¿IíÖÏÔ½߈´†ăˆŸñÚÛÄÓÅÔ—¶±»›¶é›Úívæ̉‡ºÏÔóԣǩر»ù×ûíÚ½«‡“ÍjĂ%°½ăˆŸ;ÑÓÙŒë*«Ơ癉kß [ïSÍË)éÛ9¥×Ă·‡‘×8瘉j̃ZîSí—GÙ½ÙÅëù×…àÏÔ™Ó̀ÓÁĂ¼¡áÅØë$ÏÅ8¤‡Ö™Ôï ±»ưÀƒṽÁ™‰kß [ïS‹ÜùƯ³ÜµØÍáÛ«‚ ½9%ăê·‡‘×8ç·̃™ØǼ“ÛƠ¸ÚƒvÏÅù×…ô‡ÁñơĂ߈釽€Û¥ºÍÓåđ÷ˆơê—¶½ÏÔ”#ƒˆ‹±»¡Ô9¥‡ÿÚ—¿Έå̉ ›Û¹ÚËÇÛẫ„¾»±»öÙ½×ÜË¿‹ÇÉŇº˜‰j̃ZîSÅ£´‰ÁƯÑÅôêçÚ£äåôǺÛ«‚ ½9ÙÓÓÓƒ×Ë̉¡Ç·̣é‰ñ5ñ·™ÓËæÏÔ™‰kß [ïSăˆŸ;kívÛ«‚ ½9öµØƒƯëÛº­ØÁ¹»Å¹ÚÙ×%Âñ‡¶«ÚÏÅù×°»‡ñ5€OÑĂï¾Ù½÷Á«ÔßæÍĂ·̣ƒˆơÄG½¹˜‰j̃ZîS«‡“ÍjăˆŸרñÓÏůÆÛ׳Ó̉÷Úù×Û«‚ ½9µ†«dă˜‡ÂÙÛ†₫™ÔœÚ%ƒv‘Û™Ôö7Û«‚ ½9ëöƯÓ «‡“ÍjÙ½à¬ÿÂĐÅÁ‡é/×:ă½Ï̉¬Ö©Øѧ±½ó¶™‡߈¡Đ°»«·3uUñÓµê›Ú9¥‡éê³ÜÓµû‰yÑÓơĂß»ûëƠU™‰kß [ïSñơ»ëöÔ™‰kß [ïS¾ÅĂ«‡“Íj¯ÛƒÛ«‚ ½9ƠX‘«µØơêĂï½—Ó¾ó²Yơêͪ±»«‡“ÍjĂÛ÷ÁÛ«‚ ½9ÂÙ›¡—»Ó(ù×½߈ù×Û«‚ ½9˜êèäÙ½°Ô Ơ!ưÀ÷ˆäô÷Ժǻ۫‚ ½9ÇèÛ׫‡“ÍjÛ»‡¦ÔÛºăˆŸ;‹&áêÿÚ™‰kß [ïS“Ơ£ÇÚP‰øăˆŸ×ïëöù×Ê¿›¾ÍÇ“ÈĂĂ ›­±àéM߈ÑÓ߈ưÀ÷ÁÏÔÙ½ëö߈™‰kß [ïSÏ̉¿‰ëö·‹£0ơềÓ¯ÈG½¹—¶ơô›¾¡Ơ™‰kß [ïSñÓëƠU¥Ø±»·‡‘×8ç™×ñăù×ÿ§«ÔĂÙưŒ¡È¡È¥Ç±»߈±»½ÏÅåÁ‚ôêĂ߈ưÀ›Û«‚ ½9µØ½ôëö»Ø߈Ï̉ÏÔ߈¡È÷¼ơêÿ¯¶ÍË)éÛ9¥9¥‡«‡“Íjëö†Œ°»…YÙYưÀ…ÖÏÔßÚßÄÙùׇÛÄÓ½‚›ÛÇÖÛ«‚ ½9ÉĂ߈‡“ÑÓÆƒv“¹ƯN⇓ĂƠ·Ô½ÙÜÙ½ŸÖƠ­ÄÅ™‰kß [ïSơĂ‰Û«ƯÅÄ÷̃Ë̉ÏÅĂÛ«‚ ½9‰Ơß¾ÅưÀùêĂÙ¨‡¤2€̃êL•Œ½½ĂźñÚù×Év½“ƠäÁÏ̉« §Æ˜‡ÿ¯¶Á½ăˆŸ;ñÎơÄÑÓ5ö$ºÿÚÛºå̉ ăˆŸ‘ÆÏÔ³ͼÓ¼ñÓ©¼ƯÚ‡x‚v¡ÁºÅ}»ÓŽ­ÖƠ Á‡é/×:«‡“Íj¬Å“ÇÙ½ëö﻽9¥‡äÖăˆŸ;k×܉ÁÙ½¡ƒ߈¥ÅăˆŸ;ù×í4ÙÅëû¿º—ˆÏÅÇÖ«‡“ÍjëöÓ™Û­‡íÁơÄÛƠ±»ù׋Èëö߈—ØỞÊÓÑÄë÷ÁçÚÓÅ‚v±ÜƒÖ±Á©‡¥2ßëMÛºÛºêÖU9¥‡¾·̣±»ĂÙ‰Â×—đÔ9¥‡ëö»ÁăˆŸ;ăˆŸ;­Ø߈÷ÁµØơĂ9¥‡ÏÔ…ÇÏ̉̀Ó‰¿I«Ú½ô¹˜‰j̃ZîSƒv™‰kß [ïS¡ÔÁ×ë× —¶ƒv¾́“Æ·Ôëöä‰÷‡Ổܺ…'꼠ȽëöÏ̉ÏſŽĂÈùê¿ÁÖÇØé5×¾ÓØ÷Á£̣ós¡ƯÏÔæÚ8¤‡«‡“ÍjËÇ«äç'߈«‡“Íj«‡“ÍjñÓĂĂá Ô«‡“Íj÷‡½ÍÓ•¥Ø›¾»ˆ߈߈Û«‚ ½9å̉ ™‰kß [ïSÙÚŸ¿Û׉ÛÛ×—¶›¯G‹øûÓ߈¯È›¾³̉Á¹ÁÛ«‚ ½9ơÄ×¾ƒĂáđ±*“Ơơ•ŒÏÔ¥ÖíêÙÚÏÔ·ÔÛº§ÛϺÙÚ¹ÚŸ}²»ĂÿÚÏŧ(óïÍÄ«‡“ÍjÍË)éÛ9¥ư¯ØơÔíÆÏÅ–¶­¸ùê—¶ĐØÁ̉Û«‚ ½9óÂêö…ÇắÅßưÀéåôÑÄëÿ‹É0÷¼·Å¥Ó¹à˜‰ j ̃    Z îS ¹ÚÙÚăˆŸƯ‰áÛ›¾‡ă‹ÏÔöÁ“¹ƯNªÚ ٽ܇Œà “Ơ•!—Œ™‰kß [ïSù¿ÏÔơÔ÷¼ø¾ Á¥³«Ô©Ó„ØôÔ¿‰Ăèá %ơêáêå̉ Ï̉éܽ۫‚ ½9ù×÷å5Ó±ëØ½ăˆŸ;ÿ¯¶•ÛẲáø×Ơ·Åù×ÑĂÁĂ9¥‡±»©Ó«ÔñÓí—G¸½ËÖƒv©ÓôĂ¡»•ÖƯÓ ­¿ñÙ‘ ©ÁÛ«‚ ½9µØÁ̉Ï̉™‡çÚ«Ô¸́vẳßÏŰÛ×±»ö¥ˆ]1©‡¥2ßëMÀ©‡¥2ßëM«»£±ăˆŸ;Û«‚ ½9½ưÀï½÷‡Ơ›Ú†$ơă·Å±»ëöÛ×÷ÁăˆŸÿڇǘ‰j̃ZîS Ơ¾ơé£Ôív˜ÛƠăˆŸ;÷Á·Ü½Ô߈áÏÔơÔÇÖ±½„Ö¾¿øƠ。ÔÛ«‚ ½98¤‡«dÛ×ëöÙ½ùסÁ퇬¶ÿÚáêƠ¬Äºáê½ä̉§ÓËÇ™‰kß [ïSÏÔçÚÁÛâà߈±»‰¿Iô˜‡µØ«dØ××ܱ»§Ôϼ¡íƱ»ơÔ«ÚŸÛˆ«×ĂÈưÁ‰¾߈Ù×ÊƠ«‡“Íj†º¿‰Ởß½û̉ăơ‹Ç‡“ëöǽßÁ–»Û×Ö³ÙÿڭćNjÈÓÔÅô½Ơ»ôÏÔ«‡“Íj½Å»óÇ…Œ‹Û̀ĂÑĂ£¨«‡“Íj³’ƠÏ|ÏÔÁ̉ƒv«dăàăˆŸ;Û«‚ ½9ˆøÛ«‚ ½99¥‡éÚ›·ÔÚÀ·Ø»¸«»ÓØăˆŸ;kƒ…ô·‹Û—¾ç ÏÅöÁÿÚơêƒvÈß»ûƠÙ ±ĐËƠ¿¹Æ±»…`ăˆŸ;›¹ĐرëØÑ؃ˆùêÇå̉ ´a—ÓÿǾ™‡¥Æª‡’̀j›¾º¼±Ÿ«‡“Íj߈ǧ؂¾ÍÓ«‡“Íj¡ÛĂºù×Ï̉Ơ½±ºĐæ¼é€ă°ÙÚ«óƒÁ½߈ÑØ½€ÏÔâˆóÂï³2™ƒvơêßơêÅ»‡¬¾€Ó»Ă߈©‡¥2ßëMÛºăê…ö¹Úù×ÙÚ‡ŒµØăˆŸ;kÛ«‚ ½9ùꙉkß [ïS—¶•î9¥‡™Ó©‡¥2ßëM›¶éơê Øùê8¤‡çÚ‡Œơ꿉ËÇŸóÛº±”ÑÄë‘ơ¬Ô¹Ú™Á«‡“Íj³̣¼Ă¡ÁơѶƒv¡» áÙ?¡M-ËơÛ‹ù×!#¹ Ơ ×Éùư • +‡¹'ư¥í¡Ư›¾÷ÁƒµÏÅÆÙÚ½æƠ©%¿ØùׯÈù×ӇܥÆëöĂJÎ̉³”‡ºÏÔÏỘÔ—ˆÛ«‚ ½9ïÁÏ̉Ở߈ï óÇ•Èû›‰Æ̣Ç—¶̃ˆ¿ôÏÅ«‡“Íj«‡“Íj·Ó ¥0™‰kß [ïSÙŒë*««‡“Íjƒ½öÁ½€¿ô™̃‰ÇÛ«‚ ½9™‰kß [ïSÆĂ™‰kß [ïS·‡‘×8ç´½!ËÉ9­Öµ¥ÓăˆŸ;ß»ûñÚÿÚÛÀ™‰kß [ïSù×ù×·ÔĂ¼÷ڙ؇ǛÚ× ö剜“ƃv°»ë§ÂÓ£ÇƯÚëö‰×ăÁÏÔß»ûíÑĐÄê‹Ó±»ƒÖ¡Ơ«‡“ÍjѶÇÖûÓơêÁƯ™‰kß [ïS’ÏÚçÚñ̃щÛ«‚ ½9ÁĂĂƠỞ¼Ă˜ơ`í–G‹Çß»ûŸœÏÅׯ« ©ƒ»5«Ú«Ú9¥‡ÏÅỞ·‡‘×8ç§Æívçº×¾ßÁÛ×ăˆŸ;»Óµ‰ëö“Ơ‘Ô¾Û«‚ ½9çôÑÓ•%ù×’ºŸ\åô‡ñ5Á¹ç̃ƯÓ »2ƯÓ ˜‰j̃ZîS™‡½Ù½Ÿ}Ï̉ù×Å»¸ÚϹâÁơ꛹ưÀ™Ô«‡“Íjƒvå̉ ‰ÛÙ×¥Û¿»ß»ûÅØÛ«‚ ½9©‡¥2ßëMÚ×ÑÑÓÅÓĂÙÚª‚ +¼99¥‡×›¶é­ÖÚª‚ +¼9™‰kß [ïSøêí$±»ù×é‰ñ5ñ·ù×÷‡߈¯l©Ç½ñÓ›¾‡“ơêßÏ¡»÷êëö«ÔßÄÙƠ±»¡Ư9¥‡˾ÆĂù¿©‡¥2ßëMÏÄá ưÀ߈êö¡Û©‡¥2ßëMÙÙÚ½ô‹Ç§ß̀Ó¸Úëöº©‡¥2ßëMăˆŸÅØăˆŸ;k»‹ÙƠ«Ô“ÈÑÄ뇨Ÿ‘°»›¾ăˆŸ½€›ŒưMÇÖ¿ºåôù×ïøÜÏÔß„ô×̉›¡ơÔ›ÛÛºù×å̉ ÏÔ§Ô³à‡ºáÚ©½½ZŒEăÁ‘ÓƠçô߈¡»Ù½¼ÁơÔ÷Á•Œ˜‡Û«‚ ½9éêºÁׯêö±¿÷ÁÛ×ÊÓ¾†Œ‚¾©‡¥2ßëMăê½€ÿ¯¶ÑĂÛ×ÍÇ÷ÁơÔÛº±»ĐÓÛ«‚ ½9™ëéåÇ»§¹®éÙÜ«‡“Íj«‡“Íj½ö”‹%™‰kß [ïS‡¾±»½€™‰kß [ïSâˆ:±»ÙÚöĂÈ»¼‘±» ÛáôĂ«‡“Íj‡ŒÙ½öáƯƠ™‰kß [ïSÁív¡Ûëöç—ơÄ9¥‡×›ŒưMǺ÷«»¾ÎÔ߈9¥‡ù×÷ˆôÔÚ×üĂÚÄ̉±»¹è­Øử½ÅØßç½Ă¹àăˆŸÅĵؙ̃¯ÈÁĂÎ̉Ûëö¹ÚÁĂ«»ĂºÅØ»½ƒÚ“¹ƯN¯×¹Ú•Èû›Ó¾ÙÚ´Ó7Ù̉™ëéåÑÓ™‰kß [ïS½ôÏ̉íê­Ö÷ÁăˆŸơØíêĂٳȺy\đ»¿Å™ÛéÓóÔ߈óÇ߈ƒ̉Ͼ¥Oר¹ÖÛÆ±»±»éÔ¡ÔƠ“¹ƯNåï³2­vÙܾưÀͽ¤ÄÙŒë*«¡»·̣Û«‚ ½9”ǯȧØăˆŸ;ÿ§ÑÓÙ£Û¹ŸŒ¿àíJÿ¯¶¼ô áºÍÓáƠ¦È:¥3¥ˆ]1™ÔÏÄ£ØÓq±»ëÓÑÓÎÂÈ߈½߈Ñ÷ƯÓ •Ç™‰kß [ïSăˆŸ;Á̉÷Á©‡¥2ßëMáê½ÁÛ•«»ÑÄë̃ˆÏÅ™‡ñÓùêÁ̉ù׺ùê¸Úù×ÏŹڅإˆ]1ÿ¯¶¼Áợîëԃ׾۫‚ ½9Ïź۫‚ ½9‹Óă»ûÓÂÙÁƯ§Êëö™‰kß [ïS Êû×Ơô»9¥‡ưÀĂÙ¡ÔưÀ™‰kß [ïS³ºó±ëØÊÅØ©¤™‰kß [ïSÁË¡£Ç½€µØôÑÄë½Ù½ÏÅÛ˜¤Æè¼ ÇÖ¿‰ä̉߈™‰kß [ïS±˜ÓØ‚ˆÛ«‚ ½9§ôà ¡È­ÄƠăˆŸ;å¿‚v¶''ơÔÏŇŒªÚ +¢Xºÿ§‡ä”Œ2“ÆơÔóÇ߈ù׋ÜÙ½±»ơ¨ƒ×œ‡»©ª¶2tT¦Ô÷ÁÆù×èÓºưÀ‡ºï½§ä¥Æ–Ó·¼Í7…ÖĂÙ±»©Ó—¶Á߈¹̃âàϺÂĂÙÚỂ́–GơêơÔøº·Ô÷å5ÓăˆŸÛ«‚ ½9µ.¥Ùé¿‰ăˆŸ;kµØâˆï»£Ô°»̃ˆ·Ôë§ÅÓÁƯÛ«‚ ½9ͼÿ¯¶¡ƯÏÛÄÓăˆŸ¨ØÛ«‚ ½9¹»ăÛ«‚ ½9½«‡“Íj¹ÚƠá ³ÈêöµØÀĂ å̉ óÂÛ«‚ ½9Ž‘́ØÓ«%˜êèäư§‡ÛÀ±»û(ă‘·™Ó¿‰ÙÚÛ«‚ ½9¾‹Ç‡xXåĂĐÄê߈¼ĂߌÛ,Ă™‰kß [ïS›¶é›¾ÏÔëÔƠơÅ©‡¥2ßëM™Ă”½“Æ‹Ù÷‡›ĂçÚ—¶öù×…Ú·‡‘×8ç“ÆƠ×̉Ù½Ÿ+ƒ›±»±»ù×ùêÛÀ%¡Á‰ø߈‰Æ…Ôµ-áÀºy«‡“Íj£ÇéJé‰Ó5“gesÁÅ™‰kß [ïSªÓÅØÙڟȦôçÚÑ·߈ù×·Ô߈Û«‚ ½9±»ưÀ™ÁƒÖăˆŸ;ߌÛ,9¥‡9¥‡¯‰¯09¥‡×‹Ç9¥‡¡Ç±»Æ̉¿¹ÑÄë9¥‡ßÄ߈ÙÚÈÖ¼ïÚ½ù×óÄ™‰kß [ïS‹Ç9¥‡¹àĂ “ÇªÔ Ñ+Ăº›¾÷ơWÓÔ«‡“Íj›¾“Ơ£Ô­•·÷Á»˜9¥‡­Ä»èôº÷ÁíÓ©&¹Ú¼È™‰kß [ïSÙÚ‰¿I¡ÛßÄÙù×¥r©¼÷ÁẳơêÂTú̉«‡“Íj¿‰«»ƒˆ«»Å«‡“Íj•×ºăˆŸ;ù×ÅÁăÙƠá=ƒÔÙÚÔ߈™ÓƒÔ·µ¶v÷Á₫¼߈Ûï̃ÄØÛ»÷Ùת¼߈÷Áͪ­ØƠXưÚ«‡“ÍjƠ½ÇÖ́Áù׿‰ăˆŸ;­Ô½Ô¿(´a«‡“Íj™ơƯµÅëç¶öÁ±»“ÆG½¹¹Ú¿‰ÇÖÏ̉™Áæ'ÏÔ±»߈ùå»ÓÙÚ‡ŒÖùăàÓÆѶ‡ñÚ¹ÚóÇưÀñÚ̉ºỞ̀º“ÆßÏ¥ÁÛºÓ¼ùêƒvèơÓ‡›¾Û«‚ ½9Ûº¡Û̀Ê)èÛ8¤Ëêvôé‰ñ5ñ·ù×ø×∱»ñÖׯßÚ麱¿»̣›YÑÅô«ÔÏÔÙוǃv‡Ü·̣©Ơ½î½ÀƯ¦ô ß»û›¾±»ß»ûùë3§ƠëöÙÚĂ•½ÓÅÑÓáêß»û±»±»÷ÁăˆŸ;ôÙóµa߈µ!Û«‚ ½9¹ÚƯÓ Ú»ö¢ä¦ôâö„زzăˆŸ…ª¼ÂÙùê«d“Ơ±»¿àăàÛÚ±»ƒvưÀ“ÈÑØ/ăà÷Áù×Û«‚ ½9ơ«‡“Íj¿©Ó«‡“Íj›ÓÑÓÍ«ÁƯ÷ÔщÙ‡ñ5ăˆŸ;߈ºÁûƯ«È÷¼±¿ƒ¾‘­Ø‡‘®× ÙÚÿ¯¶×Ơ±»æØÛº9¥‡ÁƯùê½í—GưÀ÷Úß„£ä€¼Ùèù×¹Ú߈Ž9¥‡ùê¡ÁÙ„ơê¡Ô±»Ø×ëöăˆŸ;­v±­½¼±»ù×êơ ÏÅ©Ó÷‡á »Ô¡ŸÅûƠª»Ù½á ÍŽœÂ§º½ÁÙ½é‡óÔ¹Ú›¾ÿ¯¶ơèű»¡Ûù¿Å؇¯ƠÏÔÎ̉µØô‚v‡ºÙŒë*«™‰kß [ïSùÔ½—ÓËÉ9»ˆÙÜƯÓ ›³ô¸ÅØÓÅÏÔ‡ÇăˆŸ£Ư—ˆÑÓÀĂÙỜÇăˆŸ˜êèäù×Å›·ÔÑÓÿ¼ăàÓŇưÀƒÚ¾ÔÙÚ߈Á̉ùêܡȫÛư­Å™‰kß [ïS¨Ç«‡“Íjƒˆ‘Æ«Ôëѱ»¬¼¼ÛºËØÿ¯¶ÏÔîô³7›Ç½ÛºÓØùê߈®ôưù׺ƒ£ØçÚÏ̉ËÇëöÛ×Ï̉䌾N±»ÛÀöù×ÙÜăˆŸ;k«‡“ÍjÏ̉°»Óºƒv¯ ×¾÷ÁñÓÏ̉Ù½‚vÓÂÙÏÅöˆˆƠ ŽÁ̉ÛÀñ;ßÁ£Ô±¿ëƱ»Û«‚ ½9àƠ߈¹!¼ÔÅØí»ƒvç'Ûºù׫ض/ë™H¹ÚÛ|ư‡±ù1¼ÛÚ׼؅ۙ‡ăˆŸÏÔÑÓËÇÁ׳ÂßÄÙÑ"˜‰j̃ZîSĂĂ×Ơ‰Ô³߈Û«‚ ½9°»›¾ª»ƒvƒˆ%—º¶è™‰kß [ïSđ»̣Ă­ơ߈߈¬|Úª‚ +¼9ÏŃv¼éºÂù×ù×̀ÓËÇÛ«‚ ½9çÇ…Ô©‡¥2ßëM®é·º£ä¡ÈÓ·¡ơÔŸÈ”ÈúơÔ‡Û¶Åÿ¯¶­ÄÚª‚ +¼9¬ÄẲËÖÛÚÀ˃ˆù×ûØ1´ÎñÓĐÅé·ñÆ™‰kß [ïSåÁÖÆ¿‰µØ™‰kß [ïSÿÚưÀ©‡¥2ßëMÚª‚ +¼9¾¹xÛ«‚ ½9ăˆŸ9¥‡ù×Û«‚ ½9Yá ß»ûƒv«‡“Íj›ÚÏÔđÓ‰¿I©‡¥2ßëMÍÓ˜‰j̃ZîSχµØỞ«»—ˆ«‡“Íj†jăˆŸÁ½ÏÅ”Ööû«»™Ôר÷Á®×‰Ô±»éÓªÚ¾‡ñ5ÿÚĂÙçôƠîßßÄÙ·º“Ơ«ºöׯÁƯ£Ø½Ô§Ó¹Ú÷Ôá9¥‡IƠµØÚª‚ +¼9‡»ƒÖ™Ó«ÚËÓù×ív߈“ÈÅÓôưÀăˆŸ“ƠÙÅëăˆŸ;ñÚƒÖÜؽ½€‹Üăº½ù×Ù½åƠÛ«‚ ½9ÏÅ¡Á¹ÁÆêö‰Û﻽›ĂÙÄÓƒˆ½ƒvôê£ ƯơÁƯỞ«‡“Íj±»ÅØéºơêÅØÿ¼ª Đ ±¿ƒvù×Û«‚ ½9߈ÙŒë*«½€íêÿÚÏÅé‰ñ5ñ·Ăÿ +ƒˆœÜ±»ô±»щăˆŸ;ăˆŸßôÏÔ߈Ÿ½ăÇ훾۫‚ ½9÷Ô¡»߈9¥‡¾ø¿·ÔñÙ™‰kß [ïSôÏÄăˆŸ;³›¶é‰Ô‹ÜóÂƯÊ›¾×¿8ëö»ˆƠéÓ£ÓƠăàưÀñÙÑÓƠXó^¡Èô߈ƒvßÚÏ̉ª ¨ƒ º5 °»±”óÇ—ÓÛº¡È¡ºÏ̉›¾·¼Í7±»ëöƒv¿‰í‡ƒ×·Ó ¥0ÏÔëöïƠ‡ŒơêÛ«‚ ½9Ï̉ëö«‡“ÍjĂÖ°»ƒˆ±̉–¶߈9¥‡ăˆŸ;«ÚÿÚÅÓëöăÁш‹ÇÏÔƯÓ ÑÓ‡Œ˜‰j̃ZîSñÁ™‰kß [ïSƒvӾ᛾˜ ê è ä ÿ±Qư£¡È§›ív¡ÁĂÙÙ½°¿‚½£Ưƒv±»ơê§½¿Å‚v9¥‡߈»ÙÚưÀÛ«‚ ½9ÖĂÓÆüuÓ̉ñÚ­Ö÷Á‡ÇµØăºù¾‡Ç­Äơºù×ÁƯÏÄÁ̉•¾µÀ½¹Ú÷‡¶Üô±̉™ơ‰ÔÙ½‘±ïƠ9¥‡±»Û׷؉"߈±»߈ÁƯưÀׯ̀Óô¹ÚÇĂ÷‡±»•%߈đ¾N“ÈïÚ·‡‘×8ç߈ÁñĂÇÖ®ôçÚ«Ô“¹ƯN³¹³ÈŽ‹ÇÿÛÆ›Ô©‡¥2ßëM¯È™‰kß [ïS—¶±”™‰kß [ïSÛÅ̃›Ăù×ÍħƃÖâà +­Å½€߈Ăï³2ù¿·§D ߈Å¿‰ÛÀÿ§«‡“Íjµ!½Ô È‡ºÙ½ÙÚƠå̉ »Åר“Ơçô8¤‡ÑÅơºăˆŸ;Ă¹å̉ «‡“Íj™ôÑĂ«‡“Íj•ŒôñíÈívĂÙ½ÜÙÚù×߈ƒvߨ©Ø‘éëöçÙÚ€›·ÔÓØøêÑÓƒ½æ±¿ô»çúê·ïµ†˜‰j̃ZîS‰Â“Æ™‡›¹»2«‡“ÍjßÖ߈åôÏ̉›¶é½½€íÖ9¥‡Ï̉ɇ8¤‡«‡“ÍjÍĂÿỤ́ĂĂ 9¥‡µßëö¼ô¿̉×ÓÅĂ»Á›·Ô½€£ä­vÇô«‡“ÍjùêëöƠ×Û«‡“Íj‹ÇƒƠŸÈ·Å¹ÚƠƒvĂºϺôêù×µ.¥Ù9¥‡ù׳ƒ×¶‡Ö8æªÚÅô9¥‡ÅnöưÀóÇÏŧôÏơ¾“ƠưÀ9¥‡·‹ƒÖ©‡¥2ßëM«‡“Íj§Ô¹£Ơÿ¯¶½ëö®Ư%©Ø«)ŸÖƠëö«dÓÆÛ«‚ ½9ÙÜ߈«‡“Íj§®±»½ù×ôáØ߈¶¤½ÇÖå׆ºưöÏԣȣĐö¥ÓÙ‡Ï9…±»߈çôơêÛ«‚ ½9Ù½¼ª‡’̀j½ÈăˆŸ;ÓͺƯĐĐÄꙉkß [ïS©³̣.±»­¾‚·Å8¤‡ªi¦ÓưÀÈàê×Ó±»½ÅعÁăˆŸ;߈™‡£Øÿ'éêĂٹdžx¿Ø߈íÙ™ëéåß™‰kß [ïS«Ô·‡‘×8çóÏÔ™‡–¶ƒvÏÔăº½ư¡©ÀÅØöÚÇÓÇ̉G½¹—»߈½Ăơê¡»ªdó1Â.ßÄÙ±½ߌÛ,“Ơƒvÿ¯¶Û×ù¿ÿ¯¶Ú× ƯØăˆŸ;½ŸÈ…ڜԥ œ‡ƒà“ƠßƯßƯ½€ô÷ÁÑÓøæƠÄ¡ÔÇ»׌ëọ̈Çä̉©‡¥2ßëMÑÅ‹µ%¯ë8¤‡Úª‚ +¼9™Óå̉ œ‡ù׾߱¿ëçăˆŸ;kÛ«‚ ½9ÙÚÏ̉ù×ÄØ·̃ÛÇȾ‚àơÔó£Ư“ƠĂ)ùê°»Óôº«»ÇÖÏÅ÷ÁÙÚ¿‰ª‡ ’ ̀j ̃ôñƠ¶£ñÖÿ¯¶ơÄëö­¾ºÙÚ™ơÙ§¹Ç̉ûẰÓ™‰kß [ïS›¹߈“ƠĂ”Ö ǽç̉¼Ï̉Ï̉ƒv£‡‚קƽ̣çØÛº»ÅñÚí ÏÔ߈ÏÅÍӬūd½¡Á½§ÓÅÓ†Œ£ô÷‡ÜÓ ñ×çÚù×ù×éêÛ«‚ ½9†º§Ô¢äÿ×öÁ-÷4±»Áåñ»â»ÇÖ‹ÜçÎÅ ÎÄóÔù×Úª‚ +¼9ÓÅ¿‰›¾߈½Ôçߺëöù×ívöÁ‰ÔăˆŸñÓ×ƠăˆŸ;µØ™‰kß [ïSƠ‰Û‰¾ÅØÏ̉Ûº9¥‡ñíÈ¥¼߈‡º·‡‘×8çÚÀỚvçÚÛ«‚ ½9ï³2щ»‹¡ƠĐÓ÷ÁÅ»°»ÅØ¡È×¾¡Çø¾ ÍÓơê﫵mÿÚ½Á¢»¼ĂơèÅŸ}˜‰j̃ZîSƯ‰±»Û«‚ ½9·º¯ÏċٿºÍƠÍéÓ¡ÇÔ§ÛÁ “Ȱ»9¥‡ÏÅ™‰kß [ïSÏ̉¿ôö™ëéå‚v³ô³ºó¾ß÷ÁĂ₫±»ñÓ8¤‡ÖÎ̉«‡“Íj—»ÈÔÙÍÙÚÅÓß»ûóÇÊ#¼çÚ‡ºëöƒvùꈟ̀ĂYö¯Èáđ™‰kß [ïS“¿ñ¯Û”Ö•º«‡“ÍjµØ±»™‰kß [ïS·‡‘×8çÏÔ¹£½ôÿ¯¶°½ơèÅơêǽù×áĂ¡Ù½øë8¤‡÷ï—º±»‡½‰ÛßÄÙơÉơÔ—¼Ï̉±»ª‡’̀j—ˆͽ¡’ƠÁ‡é/×:åĂÏ̉ĂƠËǃvÅÔ±»½½Ơ¿Åƒà‡Ç™é‰ñ5ñ·ă꤈\0ÁZ߈߈ëöÁĂ¯ƒ« +>¿ß±»ëö±߈Û×ñ̉¼ôµØ³ºó«‡“Íj£%ơê·̣Ël×¾ÁĂĂôç̃·‡‘×8çÑÄë¿ôÙ×ñÔá=›̉ắÉ€µØÏ̉ÑÓưÀçÚăˆŸ™Óƒv½‹ÇƒvƒÖơèÅ™‰kß [ïSÇÖù–›¾ï½ƒªĐù×ÙÓ½‡Û8¤‡×§ÓºĂ³Ù½ÅØ©§¹¶Ù½ăơ—»œ·̉ ¤0»ÅÁĂÛ«‚ ½9Ă¼ûÙ©ÓĂÏÅÆ—ºµả¼ăˆŸ;ÇÕӮÈÏÔŸ}›ÚăˆŸ;Ù̉­Ô—ÿå‡ÍÄô‘Íà8 ñ;­ Đ$&¤½Â… §ơĹکǷÏÅ£öÑÓùúơêĂ£ơꪺ̃ˆ‡ºÖÆö§ô™‰kß [ïSg›Ë¿¦ÆûÙù×§ôÇ"íÖщÙ̉Û«‚ ½9§Æ…Ơ]‹Û—¶ĂÈă½éêÛ«‚ ½9ÁƯï»̀Ó‡Œ£ÆºYùשǧә‰kß [ïSÙÚ£ƯµØÓØÙÚ÷Áï‡ÑÏÅ₫Ç ÁÅØ¡ÁÏÅáƠÙÚ›Ú¯‰¯0ø×ă˜‰j̃ZîS·Ô麥ˆ]1¹àå̉ äô¡Ơ¶ăˆŸÇÖÍĂÛÀׯ›¾߈ÿÚÛ«‚ ½9‰yĂÆƒÖ‹ÇϺÏÅÇ₫ăˆŸ×¾ơÔ¡¸›vĐˆ‹Üâ»ëöëöù×ù×™Ó§ôÔ°»ÅؙӯƠ½¨Çêö•Œ¤‰̀L„ÇÖ»¿’•Ó³ÈÏņڵؙ‰kß [ïS«Âñ̉ÔXgï³2×¼ÇÏų۫‚ ½9Á̉°»±±¸ÚÍË)éÛ9¥™‡Á¹ăˆŸ;kƒv—ֵؙëéåÙÜ߈™ëéåéJé‰Ó5“gesÁÅßÁùôÑÓ₫ ®¶ ù×匿N½ÿÚÔ¾F•̉ăˆŸ;k½€ùדÇÍÄ÷Á«‡“Íjχ9¥‡×ÏÔ°» ÷ÚĺåôÏÔ­½¼Ù½¡ÛưÀ߈Ù½ÉÛ¡Ó߈¡ƠÍƠ›¾Û«‚ ½9“Ơ½́vÍÄ¿ÅËÉ9ÏÔöÁË¿ôïÅØ·§D ›¶éÅØÙ½¡ƠªÔƒv÷ڃ؃v‡ÛéÓ%¡å»½ÏÔÁƒØÏÅ™‰kß [ïS¸Ú±»¡Ư™‡íÖÛ«‚ ½9‡xË̉«%ƠX±¿›¡“ƠÅÔ߈­v›Úƒ¾‘Û׆öÛ«‚ ½9±»ÁÚ· ŽÇÖÛ…Ô£à/³»Û«‚ ½9ßÁ­ÄƠX«dỡ¿½ÛºÏÔ£Ưß»ûÛ«‚ ½9Û×ơÔù×ơÔ±¿¼¿Ü™‹Ù½Û«‚ ½9£ÓÙ½ªÚ€ƠăˆŸ;­Ö™‰kß [ïSÏԥƋܙ‰kß [ïSËÓëöÈ;ÍĂÀƯ½»Å¾ïƠ¡Á‹Üơê¡Á8¤‡Û«‚ ½9ĂÙö«‡“ÍjµØ¤ˆ\0§Ô­ÔÏ̉©ØÁƯ©ÓóÔưÀăˆŸöÁÁ±¾›¾½¾‡Ü¯}ù×™‰kß [ïS™‰kß [ïS¡Ư¾ÏįÈÅØóÇÎŧ‡߈¾º«‡“ÍjóÇ‹ÜÓÆëöÁ1ïóñÖù×ÑØ“Æ¡ÈûƠăˆŸ;«%ơÑÓ­Ô›¾•Ó›¾ª»½̃ˆ­óÁHÏ̉±»çØăˆŸ;• áºĂÖƒ€ç½ÅÓƒvÚª‚ +¼9ù׿(ưÀÛ«‚ ½9˜‰j̃ZîS½߈·‡‘×8çÛ«‚ ½9«Ă™ô¹ÚÅÓåơꦹ¯ù׋Çå̉ µØÀÛăơÅÔ©‡¥2ßëM‘Æ—¶‰¿I—¶³÷Á«Úá «‡“Íj£ÔÛ«‚ ½9¸đ̀Ó +´† +剿Iơ‡ö¼ë̃ŒÚ,ơÔƒvĂÙ™‰kß [ïSÁ̉¡Ó“Ó̃ˆ«‡“Íjó¹Á–›¶éçÚºÛ«‚ ½9¥ˆ]1ÏÄר±»ăˆŸ߈ëöÇÖË¿íÜÙ½ÓØƒˆ•ö‹Ç¼9¥‡ÛÔ·‡‘×8ç߈¾́Ûׇă¾ßÚÿÚù×°»Ÿ}—»á¤ÑØëÔ«́§Ó©Óí—G“Ơ±&ù¿Û«‚ ½9߈µĂß»û›Û÷ڡȯÅôÛ«‚ ½9Ù×߈Ѷ™‰kß [ïS–ÁÍÓ‹ö—ơá ăˆŸ;ï‡Ï̉Ç«ÆÎÔÛ«‚ ½9—¾‹Ù¶±̉ÍÄ«‡“Íjñëöï½á Ï̉Ù½ù×ÏÔù×âˆ:Û«‚ ½9“¹ƯN´Øù×ă“È€º™‰kß [ïS™‰kß [ïS±»ñÓÛÀăˆŸ;káƠ竇“Íj’ºg§Ô߈ƒØívÙŒë*«˜êèäÓ»‡Ç»éê³Ăô¡ÔŸÛ«‚ ½9·Ü̃ˆÍÄÏÔ¾·5ù×—»½­Äÿ·ÔÛÀµÚ…ÛÏÅÁĂͽ™ơĂĂá ©Ü«»Û׿̣ÿ¼ëö‹ÜØ'ĐÓưÜơvé‡í§Ôö÷ÁÈ ÏÅù¿ÔXÑØù׉ƯăˆŸöÁ‰y߈ÏÔ‘±å̉ ÁĂ·Ó ¥0ö›åëö‡º…»™‡ÏÅưÀ‚v°»Ù½¯¼ăˆŸëöáÛ̃ˆÏÅÇØ̃ˆÑ “Û«‡“Íj›¡̃ˆăˆŸ;ÿÚ…»™‰kß [ïS¶Ü«‡“Íj•Èû›Åİ»ù×µ†óÔºæù×ø¿öƠºmÆ̉›ÓÁÛÑÓ®Æé%´†£äơêăÇí¹=±»ÅôµØ£ØׯăˆŸØƠ¡Èù×¹àÑǾ$«‡“Íj‡ÇÙ½™‰kß [ïSÖØ Ù½±»ăˆŸù×øê‰¾Ù̉™‡‰ßÛ«‚ ½9ÜÙÚƒ«»ù×רŸè±»¼ĂßÏÎơê“âá=º‚v÷Á8¤‡¹•ÇÖ¸È +‘á«Ôâà‡ºÍĂÙëöÁ̉©ÓÄØÑŹÚÙ׫‡“ÍjÛÀôú·Ôù×¶‡Ö8æרク¼¯ƒ« +>Ơ×µØË̉ÏÔ™Ô±»™‰kß [ïS÷ê¬Ö龇³ăˆŸ;k‹È«Ô˜êèäÇ»ă0¹Ú»ˆÛ«‚ ½9Ú×ơÔÏÅ·ÅăˆŸå̉ Û«‚ ½9Ă¼ôéÛ«‚ ½9±»™‰kß [ïS‹ÜͺóôƠƯđÜÀ̉·ÅơèÅ÷ªÔƒˆưÀ‡Ú›¾ÅÔƒˆ¤ØĐĂſř‰kß [ïSÙÚé†ÇËÈ9ƠŸØ‡ŒÛ«‚ ½9ÿµØÁƯ…ï×±»9¥‡‘ÛÑÄëÁƯí̃‡ä½°¿J™ÔÛĐ̉á ÙÚăˆŸ±»±»¾Æ»ßÁ‰¿I§M®Gø¹ÚÖ‡'¼7'á ƠÄĂÓÛÔỞ©’ÿ¯¶ăˆŸ÷Ú™‰kß [ïSÛ«‚ ½9ÏÔơÔ¨ºÅØׯÓØƒvÿÛŽ„ö߈çôƒv¿‰ÖĂÙ—¾ƯÑÓăˆŸ;›¾éº÷ÙÅØ«‡“ÍjưÀÙ‹ÜáÚĂÙÿZáê‡ÇׯăˆŸƠî‡Û½ó³ÂÁé‰ñ5ñ·©‡¥2ßëM£Ç9¥‡Á½Û«‚ ½9™‰kß [ïSëöËÖÙ½£äÀÆ©Óù×ëö«‡“ÍjåÁÛ«‚ ½9Á̉«‡“Íj‚ØÏĽô¤ˆ\0‡º‹Ç³Èá ŸÈí ƒÚù××Ơ½ưÀ«‡“Íj¾ß©Ç¡Û¹Ú•Èû›çÚ§Ơ‹ÇÉ̉‡º©Ó̃ˆ±»½ÿÂăˆŸ;ÔX߈ÏÔ™‡ƒˆß»ûƠϱ»¹Ú¾÷Ù™‡ƒvưÀ—Ó߈ß»û—»ÓµƒvÏſ߇ŒÏÔ߈©ØÙ̉«Ú™‰kß [ïSÙŒë*«£Çÿ¼Ëǃø߈ñÙ߈ëöµØ¾³Û׉ÛÙÚß»ûùÇÖÙ½ƒÔÇÖ›¾Û«‚ ½9½Ô±»«‡“Íjøêí¯G‹ø¸ÅĐÓăơÛתڱ»¹Á‰Û«‡“Íj§¹‰¿IϺ½ÙÚ‘±ăơ߈9¥‡ÑÓ₫®¶çÚ¡Ô9¥‡ù×ËÓÙŒë*«©ØÑÄë·Ô«Ô—ÓơÅÛ×¹Ú½«‡“Íj—ˆ£äñÓÙŒë*«á=ưÀûâÿÚÏÔ8¤‡×ßÚơèŇ9ơèÅ©ÓïÅñÓöÏăÁ‡9¢»•ŒÏÔá ívéô„Á½½ÓŽm™‡å»½±»ÏÄ·‡‘×8çƒv§¹£́¹Áûăù×߈ƒà™‰kß [ïSôăˆŸ™‰kß [ïS¼²È ¥ÛĂĂƠ߈·ÈơêºÓ؃ÖÓØăÁÍÄÛëö•{߈«·3uUñÖñ»ª ¨ƒº5™‡á™‡ÏÔ¾íÆ·‡‘×8çưĂ‹Üº©ÓüÀ™‰kß [ïSÑóåơéÓ›¾£Ø°ÁÏ|ù×ßâ‹ëăˆŸ;Û«‚ ½9¹Úå̉ “È©&ÏÅÖ¾‹È÷Á8¤‡ÖÏÔ‰²Û«‚ ½9¡È†ÚÄ–̀‡Í6¢X¥“¾©¼́½²¾v‰¿I£Óëöï½™Óƒvɇ÷Á—»ƠÄív˜êèäÛ«‚ ½9ä×µØG½¹°»ƒvôçکܽ®GøƯÓ ívÿÚ‰¿IÛÚơ»ívëÓ±»ửăê£ÈËǽôÿÚØ×ƒv­Øëö·‹Ơơ×$·Ü™ëéåï½èÛ«‚ ½9€ºƒÿ‡»ÁñÚ§ÔơÔÙÚ§ÔÅÔ¸Ú‚v ÛºÏỐv"³Ư߈ö߈»‡ׯ¸Úî»ßƯ±»Ó؇ÙÚÓ¼©¼ù×߈󽛡ïŵØ̃ŒÚ,…£­ÑÓÛ«‚ ½9߈¼ëËÀ‹ÜÅÓÿÚÅÓÇÖơlĂÙÁ̉Ù½ Ç­ÄÛ«‚ ½9ívƠëöÛ×ùêù×ßÄÙû̉±»…ÜÓº‚ßÁ«‡“Íj£XÏ̉Åô¾­ÔöÔ¹Úù×Ûº¤ˆ\0ëöă‡ºÙ½ÛºÍßÿÛ½«‡“Íjù×»ÓơÄÅØ­ơïÅ¡Ôƒà‘¡‘ÛơꣻĂôÍÓñÚ™‰kß [ïS™ÓÙ½‡ŒËÇÛ™Ö¼©‡¥2ßëMÏÔǼÑÄëíêÛÀưÀå̉ ß½ÏÔ­Ä» í—G÷Áº—ÓÓ«‡“ÍjÅ߈ØÅê¡ÔñÚëö×…§ÓÁØ×ÁĂÈÿ¼½±»ϱïđ¿‰ÚƠÙ½±»ù×ù×ùׂ¼ÈçÚ¿à™Ó¹Ú™‰kß [ïSƠ»qY߈œÅÔ—¾߈™‰kß [ïSơêíêëƠU£ØרơYŽÛ×÷‡ï»Ѷ™‡º«dưÀ“ÈưÀÅØù׫»ÏÔĂÈ­Ä©ÇÏ̉ëöçƠívăˆŸ€º¹ưÀ·Ó ¥0é‡ÿÚưÀ%クڡóÇ«‡“Íj™Ô¿Ø™‰kß [ïS½Ă›¶éù×ưÀ»ØÇĂµØ°»̣ÔçÚ߈™‰kß [ïS¥Çù×ơêơÄ‹”ÍÓÑÄëù׃vå¿ơÔ›¹è¾³ºó¿ßÏÔơñڲȬÔùꙉkß [ïSÛÀªÚ™ëéåëöåĂÛÚƒ×߈ƒẳóÇ¿‰Û«‚ ½9›¾µÚ£Ç²ÙŒë*«æºïÚºÖ›¾¡Ûׯù×Ù̉™‰kß [ïSù‡Ç»ÏÔ±»… ‰₫9¥‡ăˆŸ¤Ó«‡“Íj«Ñ‹ÜÁƯƒ×ĂÙ̃»úƠ™ÓùןÅÜŸ¿ăˆŸ9¥‡†·ÅÏÄÉ̉ù×Á¼ÂÙÑ­Äï»»ÅĂÙ™‰kß [ïSá ăˆŸ‡ŒăˆŸ;kăˆŸÑĂÑÓ¤ ±»°»½ù×¥Äá=ĂÙνÙÚĂ¼Û×öØ×ô߈€Ç +Ăܺ‡s¡ƠŸ}ÏÄ™‡Ă¥Äëö¹€÷‡ËÉ9ù×ÖÆûÓêö·‡‘×8ç9¥‡÷ˆǼ·¼Í7äÁÓÅ×Ơăơ˜‰j̃ZîSƠXù×ÙÅ»ÚÀù†Œ222߈ǺÍÓÓ¾’½ÉÙÛÚá•Ϻ§‹‡ŒÙ½8¤‡ô©‡¥2ßëM¥º¶߈éº̣ĂÑÓÈöơÔä×ÑÄë¹ÈÁÔº'l'ơèÅáÚê›¶é¹ÚĂ¥Ó£ÔÁ¡Øơù×Ô<ăˆŸÏÔùêăơ—Ö÷ÁÇĂívÑÄëÏ̉ƒvÙ½›¾½¿ó“»Øßôغؙ‰kß [ïS§ô‡ºÀĂëÁ©‡¥2ßëMƠ8¶¤‡¶Ö™Ó¶ÅưÀ¹ÚÏêö˪9¥‡Û«‚ ½9ÿÛăˆŸ½€¾́ä̉ÏÔ¸Ú³àéơ—»ËÉ9¾£Ç«‡“ÍjÓ̉¢ä×Ơß‹±”çÚº³ ó̃ư“¡́ƒv™‡Û«‚ ½9åÉ¿Iù×ßƯ™‰kß [ïS÷ˆÿÚÍƠÁƯ±»›v™‰kß [ïS±½ăÁ¡Ô—»ù×á=׌ùê±»ÖµØÏÅ«‡“ÍjƠÛ«‚ ½9Ă¼‚vµØ‰ƯÛº¼€º©‡¥2ßëM±»»ˆ‹Î«»«ÔÛ«‚ ½9Û«‚ ½9Ÿ»ÔÿÛơê߈½ôơÔ‡“­¾±»£ ¹Ú ËûÅÓצ·ÜÿÚ߈íÚ¾ÏÅÇ֒ŵؕ†Û«‚ ½9Û«‚ ½9¶ÅØרŸ}ªÔçô™ơéêÛ…¾ÛÄÓéê½±Áøơƒ¾‘ëö°”÷£§ÔÍİ»âˆ:•‹HĐÄê«»™‰kß [ïS«‡“Íjó™‰kß [ïSƒv¶Ô8¤‡«»Û«‚ ½9ñÖ™ëé出“ƠÙ½…ÎßÚ¿ô÷ˆ…à™‰kß [ïSĂ⯧­€÷Ú«‡“ÍjÚׯ„½ëÓïƠ¯ÈµØ­̃§Ô™‰kß [ïS̃Á¯*åÁéô½€Ù½½¡ÛêÓ©‡¥2ßëMéêĐÓɉ§Ô»ÖÚ £ä×Ơ‹ÓçÔ¡ƠX“È›¹å̉ ÷Ú™‰kß [ïSôëö9¥‡×«Ô‡ñÓƒvËá’Æë×¹™ÏÔù׫Óùêƒv“ºơêÏÅï»Ù½ăˆŸî»ÁƯơê©Ç›·ÔíÚ߈ÁƯ¾Å»ĐÓ ™‰kß [ïS±»«·3uU×ƠưÀƒˆº›¶éơê«d¿‰ăˆŸ;±»½¹Èµ ÿ¯¶«‡“Íj‰Û«Ó¿‰á ©Ó™‡™‰kß [ïSăˆŸ;ÛÀ¿ºƠơÔ•×ÔXùê—Ó‹¨ÿ¯¶Ùº¿‰áˆÁ0q‰âàØ˜‰j̃ZîS溾ßÏÔù׿ôÅÓÛ×ưÀ«Ôá ß»ûơê«»$óµØÅØçÚ­ÄÛô‡£Ư©&©¼¹Ú̃ˆ«ÑÁñÚĂÙĂȽơøê8¤‡Ø×Ú×ÖÏÔ™Á…Ơ«‡“ÍjóÇÙƠĂÙ߈ÂỜÓ‰Û¥ˆ]1¹©Óƒ¾‘ÏÔ¹Ú¾¹x—¶Û×ïƠù×Û«‚ ½9™×ƒvƯÚƒàù×’ËÉ9ÍBưÀÛ«‚ ½9×Ơ†7§jÅØơÔ×ƠXÑØµ†ưÀ«‡“Íjµ½ÔåÁö¿¾±»ÏÔ‡ÇơÔ§‡ºÁ‡ÎÅÏÔû¼¹Ú·‡‘×8çÛ«‚ ½9󇛶éÏÔ8¤‡ô« ©ƒ»5ÙÚ™‰kß [ïS¹Ú›¾™ÓÙÚ«‡“Íj¡ù׃vﻹ£©¼߈öŸ +£Ø¯¾£‡ăˆŸ³ơêÛ«‚ ½9çÚÙƠƠÏÔáØ½Á‡é/×:½È‰kß [ïSù×ÇN®¾ƠƯÓ ߈™ëé彇÷éÓ½yëÊÛÂ…ƠĐÄêÿ×ï½éÓ›¶é³º}›¾ßÖŸ9¥‡×Ž¡Ô®ƠÚ׺™Á½ÇÖŸƠ¹Ú÷Ạ́"Ÿ¿ëöăˆŸ;kư“¹½߈±Á™‰kß [ïS›¡ù×§‡Ù½ăˆŸ;Û«‚ ½9™ØψÚª‚ +¼9’¹ÜNëöô꾫‡“ÍjÙ½Û«‚ ½9»½ÜÓ ›¾±»̀Ó±»Û«‚ ½9ăờÓ“Û«Ûû„•Èû›ƒvëöËƠœĂ¸ÚÍʼn¿IµaŸ\ßÚÊÇë×÷Á÷‡Ú×·Èà=Á¹™ôơÔôÛ«‚ ½9‹ÓÛÀÅÓ߈—ăÚ׺ܹڻØË̉éô±»°¿÷‡ËÖϾ¥OÏÅÑèêá퓼—»¯È•ŒÁ̉ËÇ¥Ûï³2ÿ‘ÂÙÅöÏŧԳÂƯçù×Ù׃vă½«â¹Ă¼‡ºÛº߈°»߈å̉ ¡ÔÚÀ߈ĂÙëöÙÚ“½ĂÓÛ×ùå·ÔăˆŸ;åĂÑĂ›¹˜êèä´%ëöéºĂƠÏ̉«Ô«‹í(çmñÆâ½°» ¾ăˆŸ;ĂÙÛ«‚ ½9ƒÔÛºùꩇ¥2ßëMÙÜăˆŸÛ«‚ ½9ăࣨ…“¸Ú™‰kß [ïSăˆŸ;‰ÅÏÔÚ×ÏÔϼç̉ÏÔùׯ¹ÚÔÿ×щ¸àáê—¶ăˆŸçÇå…Û«‚ ½9ËÉ9¿ß™‰kß [ïSÙ½éßÏĂÙơê½ÔéôƒÅà߈¿́ƒvóî¿»¡Ü±‡ÅÔăˆŸ;k÷ÁơÔ±»‰¿I±»½µ†Ù½ËÇÚª‚ +¼9±»•Öƒv§—¾¥ô´† Ç¿‰°»£ ÷Ù©È™‰kß [ïSëöưÀ›»›Ô±»­Ö´Ă ăˆŸ;ÅÓ±»÷Á½ù×á¬À¹߈߈ØƠĂ¹Ú™ëéå»Å̃ø߈߈ù‰Ư‰ÿ¯¶ëößÁ¢ÇëöÂÈÅÔ«‡“ÍjăˆŸ·Ó ¥0ƠƒÔ«ÚÿÚ™‡Û«‚ ½9ƒv•Èû›ëöˆÙ×®Gø™‰kß [ïSăˆŸ;ô‡Œƒv±»“¹ƯN߈™‡¤×Ơéđ߈ºµØ³ŒÈiÛ«‚ ½9ƒv½ƒˆËÏÔ½±»«»ÿ$߈ñÓ‡àÿÚ›¾éº©¾«‡“Íjëö£Ê£ ƒvùơÿ¯¶߈ÅÓ¡@ºÓºív—»—»ĂÖù×½€ëöáºËÉ9½€ô£äÛ«‚ ½9Ù½¡È«‡“ÍjçÚ́–GöÁÿ•Œ“½Ë—ˆ»ˆ»µØÛ«‚ ½9ÏÄÅ‹vÁăˆŸ;Ÿăå̉ ́văˆŸ½€å‡ŸßÉ6çÚÙÅë¿ÀơêÁƯÁÙĐ“÷™ôü¦†ĂÙ¨Ó£X¹ÚùêívÛ«‚ ½9Êǃv÷ÁÛ«‚ ½9¹Ú˜‰j̃ZîSß»ûĂȽ€¡Ơăơ¦ôà=׿8ĂÙƒÚ³×·‡‘×8çù׃vÙ×™ÓăˆŸ;½¦Ó°êØøô±»ưÛĐ¹\́ơăÁ߈À.Ù½ÇÖÛ«‚ ½9µÈÛ«‚ ½9ßÄÙáƠ»Á…±»¹Ù½Û«‚ ½9ơÔƯ‰ö£X¿‰™Á߈ăˆŸ;ƒv‡ºÇØÇÖÏÅÙÖ¾Û«‚ ½9ù¿›¾߈÷Ù¨‡¤2€̃êLŸ9¥‡ñÖÛ«‚ ½9ÙÖÏñ«‡“Íjψá¬ù¿½íÖöăˆŸ½€Ÿ}Û«‚ ½9ÑÄëív¿GûØËÇÙڇǓÆÏÔÿÚßÚ—¶‰¿IăˆŸ;ÓÆøæÀÂɀñÚøêÁ̉ư­ÅñÁ—Ú×Ü«‡“Íj›¹«ÔơĂ½ô÷ÁËÚÅÄçôă»ÏŋǛÔÛºƒvßÁß»ûăˆŸ½€¥ˆ]1·ÅÙÜù¿›¾—̣ÿÚ—¶ÏÔ»ˆÇâ±»‘ÆÓÅèê—¾§ô—¶רƠç̉Û«‚ ½9‡Ù½èêñ‡¥Ø¶‡  Ö8 æ ‹î›ÚưÀ©-˜êèäå̉ ¬‡ƒvÛÄÓ©àÛׇ“ÓÙ¡ÁùêψööÚ³%ƒÖ·‡‘×8çÁ¼º³•Èû›ï½±»ºϺÑóÿ¯¶©‡¥2ßëMƯÚù×±»“ÈáƠ¹ÚûƠ»ÏԡȋljÛÏÔ‚ÖĂ›¾¥Æ‰¿IÑÓ÷Ôư“ëö×̉߈¢X÷ÔœĂ×Ơ±̃»ú„ôåĂö¿½¿ßĂ»ØµaûÓƒ¾‘Î̉öơ›¾±»¹Ú¹ÚĐÓÙ½¾«‡“ÍjÀ‡€è/Ö:ơÄÑÓƒˆ߈‡ưÀ©Ø¡ÔưÀù×ß»û́ơóÇ× ³Ü‹ÇßÄÙưÀ£ØĂÈ…»‘«Ư³™‰kß [ïS÷Á9¥‡×·Ô·Ó ¥0ꙉkß [ïS¿ôƒẈÓ¹Ú9¥‡ëö½€ơÄ߈½߈ƒv­ØÛ׃¾‘ÍË)éÛ9¥Û«‚ ½9§ÓçđĂÅ¡ÔÚăàÁÑÎÄù×8¤‡ÓºĐØÏů¼߈±ëØщ™‰kß [ïS—Ï̃Á¹Úù×µaơ$™‰kß [ïSù×Û×ƯÓ ±À….¿ßÙÚñ,ăÁÛºƒÚ°È½€·½Û«‚ ½9êÔƒˆ€O©ÇÂç9¥‡Ù×½™‡ĂÙ“ ‰ÔÄÄ߈™‰kß [ïSéÔÙ«‡“Íj8¤‡©ºÁĂëö±»Û«‚ ½9¾º™‰kß [ïS·‡‘×8盾—Ó…ăà÷$ëØ™‡‹ÇçÚ½™Á©¼Ă÷Á‡ÛƒvÖ¥¥ñÓóð»öÁơÔ8¤‡ùê—»ëÖÑÄëƠö¥âÍÓÙÚß ™‰kß [ïS¥ĂăơËDzÂ9¥‡µØÂÙß»ûåĂĂÙ̃ˆÿ¯¶ăˆŸ¥Óß½¥Æ©‡¥2ßëMöøê¡Ô±»Ư‰—¶‡&ơê‰íÁ½½ËÉ9é)ÏÅÆÚÑ̃öÓŃ߈˜ơ +£ä·Æí‡ÛړȃvÚ×ÍƠ½ăˆŸ; ËûÙ½ëÇơèÅ™‡½߈³Ǻ›¹Ó؃vÑæßÿ§çÚ£»¿‰Ë%ÅØăƠ”Èú¤¾˜‰j̃ZîS™‰kß [ïSÁƯÁ̉ÿ.ª‡’̀j·ÔăˆŸ;«Ô©Ó¥‰ÍL…ÙܯA߈ƒ×Ă¼ưÀ±»ƒÖ­Ô¥ÆĂ˜‰j̃ZîS­¾Ơ™‰kß [ïSÙÚÂÙÓûÀÛ×ÑØÙuٽ罃½¹Úù׃à¹ÏÅÓØơèÅ«‡“Íj«‡“ÍjÙ½ơÔ“¹ƯN«‡“Íj½€ăˆŸµØñƸÚ9¥‡«‡“Íj©‡¥2ßëM°» +£»«º§ô‘÷…«‡“Íj°Åñ ñ ßÚáê›æƠºĂÙźƠ°±»±»é»Ø·Ô˹•‹H8¤‡áׇǫԇăj©¾Ô½ôü̉µ†§ô™‰kß [ïS‚v匿NâÁ9¥‡ĂÙÚ¤ÈơꓹƯN±»Á¹ơèÅ—¶ĂơÔ¨À¥È³¾ È‡ÏÅâÁºă‘·₫»½ĂƠ½0½ƒØºù×«Ô°êØ½€‹ÓÙ̉ϺơÔù¿™‡£Ø¨‡¤2€̃êLñ ‹ÇÙÚ«ÔÛ«‚ ½9ƒˆÿ¯¶Á‡é/×:¡Û߈‹Ç¥ˆ]1ËÇÙ½óÔåÖùêùơ”‹œHù×ù×·‡‘×8çƒÆµ“à¡Û«‡“Íjä̉ƒv¡È‹ÜÙÅëÛº­½¼®GøóÄí곇ÏÅă Ëû™‰kß [ïS±»ÑØûÓ¾Ó™‰kß [ïS‹ÇơÄÙ½­Ä­Ä±»­Äß„›Û“ƠƒÔăˆŸ;kÏÅó́ăˆŸ;ÁƯ±¿‡±»ÿ¼¨¼ +ªÚ˜ÁñúÙ½£¿Û×—»öÛ×ÏÄ@Ø×¡ÈÛÄÓÙå̉ ÍÄÛ«‚ ½9¶è«‡“Íj¶‡Ö8æËÇ‹ÇúصØÙÜĂÙïÚ½ÄÏÔ™ÔÁ½Ă¼ù×ëöǺöÇôó»»nøô¿‰ù×°»Úª‚ +¼9ç4‡ÛÁ|¿‰‡9ù×ƠœĂé‰ñ5ñ·µØÏÔºå̉ ơê«ÔÛ«‚ ½9˜‰j̃ZîSÍĂù×£äĂº½ÅØÛ«‚ ½9Ă٨ǗˆăˆŸ;ëö™ô—˜̀ÉÀÁë‹«Ûăơ¨º©¼±»óÛ½ùׂˆ¨¼±»²¾çµÚÀ +‰¿IÓƠ¤Á ëöÎÅçô™×ׄ«‡“ÍjëÔƠXëö…ö麿»¿ß«»ëöß¹Ú­Ô«»ÿ¯¶±»̃Á©ƠÏÔóÂÏÔ™ô»Ă8¤‡ù×Ûÿ¯¶Å¥°»»€°»ƠăˆŸưÀăơº™‰kß [ïS¹ÚÛ«‚ ½9ơêɡԷèƠÛ«‚ ½9ÏŽ÷ÁÂÙûÙ÷Á…ôáÑùôăˆŸ;™‰kß [ïS¾ßË¿í¹ßá¿ôïô߈÷‡—ˆ߈›¶éƠÄ¡ƠƒvÛ¹à“Ơ“¹ƯNÏÅ…Ö퇙‰kß [ïSá¥<çÚùׯÓùœùñ»½«.öÏĂê㻀ƠơêºÔÏ̉«‡“Íj¿‰Û«‚ ½9ùêĂôëö¹T‹ÏơØêöĂÙ×̉ŸÖơê»Ăƒˆ›¾ôêÿÚÿ§ƒÖ…¾ó¾½§—±¹ ™í“ƒvºĐÓ‹ÇѶ›Ú…»¯ƠÛ«‚ ½9ß»û©‡¥2ßëM߈½½߈’« ©ƒ»5ơêï³2±»¡Áá¤< ‡ÛÙÚưÀĂ­ÖïiË·‡‘×8çÁ­vç̉°Á÷Úù×å̉ ÑÓ•Èû›Ѳ™‰kß [ïS·‡‘×8竇“ÍjĂÙæº»ÁÈÑÓßÚÓØ™‰kß [ïS—¶µØơÔùê߈ƠÓ‰øçÚçÚơÔ©ÓÚª‚ +¼9‰¿I·ÔÇÓÿ¯¶ïƠÿ›¾ÏÅ«‡“Íjƒ¾‘‹ÈÅ»ơê©À¿º§Ø½ƠºĂÙïƠ·ÛØ-ƒÖơÔ“º÷ÁÇÖ™‰kß [ïSª‡’̀jåơ±»‹Ç«·3uUÇĂ»ØĂÖÍË)éÛ9¥ñƉԆ“Â߈‚ˆÓ¹Ú—ˆÆ̉ ·ÅÓ¼ׯ÷‡¼ëăˆŸÁƯ±¿íuËđöơ°»ÁĂăˆŸơê߈ÑÓùסÈù×˹˜‰j̃ZîSº™‰kß [ïSƒv“ƠñÚƒvÓÅÍË)éÛ9¥ÑÄëÚª‚ +¼9đÆù×ù×Û«‚ ½98¤‡ûäù×›¾“‹›¾£ÔơÅ‹ÈóÄ9¥‡™×‹È‰Á߈ĂٛڬȺ½÷Ú©‡¥2ßëM“ÇÏŹ ÑÓßÁ©ØÏÔä̉ăˆŸ;ăˆŸ;±»ÏÄßç«Ô™ÔÙ½ÛĐÓ·‡‘×8ç½Ô«·3uU߈ù×щµØ™‹9¥‡ÅÙƠ«‡“Íj½ăºψÉÕǫÔ˹ù×·߈¹Ú·Ô½…—¶ƒˆŸ}Ù»ÿ¯¶÷ÁÙ½ï½ÏÔ™‰kß [ïS·z¥+­¾Ï̉—¶’ƠâÄq«Ô½€ÛÄÓưÀăˆŸ;ÏÅù×¹Ú­Äùר»ÅØÉsÁÛ±»·‡‘×8çØóÇ÷ˆƒˆ…Ö̃ˆù×8*¤‡*Ö +߈íêç̉ù×á½ר9¥‡±»÷ˆùôËƠă½½ÏľÏ̉ÏÄ9¥‡çر»¡»öÁƒv¬‡¿́£ØÙÚ«́±»½TŸ}½ë́éºÙ½çµ¿‰ßÁÏÔåÖº½™ÓÍÄùש‡¥2ßëM–¾«ÛÅØçÚ€ỠÁ™Á‘±Û×ëöÛ«‚ ½9ƒ½ív“Ơ›·Ô¿ØưăˆŸ;º¦ÈQ“È™‰kß [ïSÆØ-Û«‚ ½9Œº§ÓÙ½¬ÖÏÔ’ÈÑÓæºÏÔ™‹ù×ñ¹™ ºß½°»–Ăÿ&£»ÏÔ߈ăˆŸ;k¡Ô¥ˆ]1Ù½ư•ơêƒvÖî½ºăˆŸ9¥‡„÷ˆƠơñ»ŸÅ¹£ Êû éÓ9¥‡ù×ñơȿ¹߈ÁĂ÷‡Ëܧ{íÅïÚщÿ§Ơ9¥‡̀ñ½°»êöËÇ«‡“Íj›¶éçÚ÷ÁÁ ªÔ¹Ú¼ëÄÀ†“›Ă›v¥Ó•Œ²ÈÏÔ±»ăˆŸ­Ä»Ø±»ëöăˆŸ;ëöчù×ơêׯ¼°» £ÔÏŪ¼Œ¾»Øï¶ôëö¹Ú½…ô“ỠÚ×ç̉ƯºÁ̉߈±»¼™‰kß [ïSƠâˆ:Y©Ü½9¥‡±»…Ö Ơ›¾ùêỞù×ÙשÇñӵذ»߈™‰kß [ïS„ ˆ₫«‡“Íjăñ°»Û«‚ ½9—Û¡ÛÏÔßáưÀ³Èç̃ÅÄëö·‡‘×8ç›¶éñÖÛ«‚ ½9Á|ÏÔƒÔêö¹ÁăˆŸ9¥‡µØ¶›¾“בŒƒ¡Û™‰kß [ïS½ÏÔ߈ÏÅ9¥‡ăે“Íj½¿ßƒÎÅ߈¡Ûׯ™‰kß [ïSĂËÊ߈¨-ÁƯ©%³¯Èÿ¯¶æ̉÷Ù—º„ƠÛºơêÖÔ†6¦jëö£èíêøê¡ø‰¿I߈Û«‚ ½9ëơ½€ÏÔ²ƒøê¡%·º™Á·‡‘×8ç½ÔçôĂÈç̃ûØ·ÔËÇù×ù×Á¡Ưăà߈ív™ÏÔƒ½ÿ ôê ‹Ó™‰kß [ïS±»²¾ÚÄ̉²‡x¹ÚË¿»Ă›¶éí—Gɹ©‡¥2ßëM‘ÆÍË)éÛ9¥½™Á¡àÅå̉ ßÖ«‡“Íj•ǹÁ›¡ưÀŽÚª‚ +¼9ÓØ߈Óµ÷Ú™‰kß [ïS₫®¶ªdáƠÙÓù¾•Èû›¿ß•Œù×ƯÚăˆŸ;÷ÁÏÄ«dÑÓîÅ$½Ù×̃ÄØµ.¥Ù–ˆƯܽ™‹8¤‡…䫇“Íjß»ûÙ½¹Ú¨Ç¯ÓƠïÚ‘â»Ë̉¿ôăˆŸÁƯ›»ơê߈÷‡ƒ½Û«‚ ½9“ÆÁÓùê…™‰kß [ïSßÖơèÅÅÄÓ¼• +¡È‘ÓÇÅ£X÷ÁÁÛÿÚ“ƠϺÛ«‚ ½9Ù½ăà«Ôμ±»©Ø×ƠåÁ÷‡Óº÷Ù÷Á¾¹xăˆŸ;½åôĂ’ÓåÁ¹Ú×$å̉ ‡ñ5Ù½é®ß»û¦ôŸèÉéëö™‰kß [ïS®¾?Û«‚ ½9ö¤Û ©‡¥2ßëMăɇ«Ô³ ƯÓ “ÛÏņÇÿ¯¶ûỞ©ÓÅØ½±»»½×¿8éÓ•½å̉ áˆÁ0q£Ø÷ˆ½§ÔóÇ™‰kß [ïS™‰kß [ïSñÁƒ‡xÛ«‚ ½9÷Áí#ưÀÙÚ±»ÇË̉«Ô§Ó·Ó ¥0¶Ø³ËÉ9«Ú‹Çß»û‡Ç‹Ç™‡©Ơ±»¾¯Ø—ÓúƠΞÿÚÏÅÛ«‚ ½9ÛÀưÀăÁÙ½¶‰ùêÙ½Û«‚ ½98™‰kß [ïS߈±»™‰kß [ïSËÇ8¤‡ơêÑÓ»ơù×øêñ¿ü‡°ø1ăˆŸ;ßôƠÚ¡Û–»£äçô›¾ñíÈ¢äï„փˆ9¥‡×ëÓ±»Ïű»­ÏÅ—Œ9¥‡™‰kß [ïS©-ÿÚ«·3uU¶¸ÓŸ}¿Ă9¥‡ÿÂ₫ÁÙ½ăˆŸ;å̉ ₫ÚŸ}¬Û·‡‘×8ç·Ôù×Û«‚ ½9™Ó¡ÏÔ¥ˆ]1å̉ ™‰kß [ïSíÁơÔµØÍÄĐÓ +Ù›£ö½Ù׺ỔÔơ¸»Ơ‹éáêưÀơê÷Ú›¾Û«‚ ½9Û«‚ ½9Û«‚ ½9«Ú¬Ö?ëöÙÚ±ÿ¼±»™ëé奈]1ͼÏÅ›¾—¶öïî‹Çơêù×ÓưÀËÖăˆŸ;Åô›¾ÑØÛ«‚ ½9§ôăÂÛ«‚ ½9ï#ÇÖƒv·º«dù×¹Ú«‡“Íj«‡“ÍjëÓ‡“±¿ù×߈§Ø߈ô™‰kß [ïSêöïÔ…ÛĐÄê½Á¹Ơóǵ†ׯY߈ö¡ÈöÁ™ØÇÏơÔơăÁ¯ÈăˆŸ;æØ …ƠÛßÚ₫4©¼IáêµØÚÀÁÚï*ûƠ«Ô™‰kß [ïSÏÔÛ«‚ ½9¿ô·#Ǻù×Û×›¶éø×³ºóŽƠđÓƒvø¾áÓØ±»—ˆ‹ÜơèÅơêÁĂ—¾˜êèä·Å™‡Ă—ˆÂÈßƯ¾̃ÁăˆŸ;¹ÚźƒˆùסÔáƠơ›¶é«P¿Ø¾ñù×Û«‚ ½9Åá߈ƒˆùꙉkß [ïS‚v‹ÈưÀ¡»™‰kß [ïS߈™‡óÂăˆŸ;ë“™‰kß [ïS¯÷‡©àḯ©ÀƠå̉ ×Ơù×Ϻͺ×ƠéÚ¹Ú½̣‹åëö¼ÙÚ°»¡Á¨Ơ»‡áÛÙƠëöëö…(ăˆŸ;k­Ø¹Ú9¥‡™‰kß [ïS³ºóÜÏ̉™‰kß [ïS›ÚÛ«‚ ½9ÛÓØ¿µa÷a«‡“Íj«Ñ·‡‘×8çà= öơÏÔéôÔÓ·‡‘×8ç£Ø¡ÛƒˆÛ°»ÍÓϼ«Ôå‰ÙÚ½¿ưÀ½ïÚ£äÅÓ•ŒƯº¾¶è…Öàêÿ¯¶íÆÙ½§Ô…»·‡‘×8çơèÅĂƠ“Û½ÓÆ‹¿ăˆŸÅÔ߈麠ȃv麱»‘éÚª‚ +¼9°»ƒvù‡…™‰kß [ïS½±»¼ÿÜù×ûï½½µƠßѓƽ“È“Ơ߈ÙÚÚưÀ°»‡ÚéôÁƯɾÙÜàê½€í‡ñÖ™ØçÇö‚ṽ»ú•½¶‡Ö8æ«ÔÛÿ¯¶ÏÔçÚÏÅ“Ï̉ëØµØ¹¶»åĂÛ«‚ ½9çîºyæê­µ·‡‘×8çÙ«‡“Íj‡º÷ÁéÓ¥ˆ]1†º«Ô·Å߈¹Ú¶è­vÿ¯¶«‡“Íjéøåô®Æ +Ă¢Ç¿»ÏÄ@öƯÓ ƒvÏű¿ÿ¯¶‹Èèô¡Û©‡¥2ßëMƠ×ゥ‡¥2ßëMƒØvÍÓ÷‡·Ü›¾å׳ÆÿÜ™‰kß [ïS®¼·‡‘×8çÛ«‚ ½9åå}ĂĂûØvù×ׯŸä¿±ëØ­ØèơóÇÙ½å”ô›Ôëö¿ô9¥‡×Ñô¿ôÿ¯¶Ǽö¿‰ÏÔÇĂï³2ºÁùê¡ÛơÔÏÅ·‡‘×8癉kß [ïS¯àăˆŸ™Ô·‡‘×8ç«»½·ºË̉µÜ…ØôóÂä̉™‰kß [ïSĐÅ 9¥‡é³¡Ô™±»Đذ» Ǻçôº½Û«‚ ½9ÛÄÓăà›¾™‡°»ù꫇“Íj…ÖơÔô陉kß [ïSÅÀâóơèÅăˆŸ;£»ăˆŸ÷ˆûÓÅÄ׿8ºÈÏÔƒ½®×¡Ơ«‡“ÍjĂºă»¿ß§Ó›₫Ú«‡“Íj™ëéå̃ÄØ«‡“Íj±»ÿÂ9¥‡×ăˆŸ¿»ƒØÍÓÛ«‚ ½9ăˆŸ›¾·‡‘×8瘉j̃ZîSÏÔ§ÔÏÔÙ×ÏÔ·‡‘×8çĂºªÚûÓÑÓĂºưÀ©ÓÙÚ™ơÅØ߈ơÔ“ƒÖ¡ÈíÚÙ½˹“Ç8¤‡¹à·ÔÇÖ±œ™ÔÁĂ™‰kß [ïSƯÓ øê ¹Ú§¹ĂƠĂÙÆØà꣇Á̉Ĺړ¹ƯN‡²ÙÚäÁ±»µØ›ÚÅÁƯÛ«‚ ½9Ë̉Û«‚ ½9¼0‡Ú޽€›¾·‡‘×8çôºđ÷Á¥Ø‡Œ«»̃„Ë̉ăˆŸ;ù×퇭֠ÁÏÅ›¾³b¯ÈË̉ÓÁÁƯ£Á…Úđ£ØרÏÔ匿N¥ÈỢÂÉÖăˆŸ;§Ó¾Ç»±»³·Å¯‰¯0­ÄψëöÇÖŃv½å̉ ëöÓºÄÓ +§Ô÷ÔÛ«‚ ½9‡Û«‚ ½9ëö óÙ—ÓÑÓù×ù¿¬¾ÓØÿ¯¶ׯ™ÔïđÁăŸ}ëöĂÙ³ÛÄÓ«»í—G¾ßơÔ“ÆèơÙÚ÷̃…Û›¾ÏÔúôƒØùë§ÓÏÔÙÅëÛ×ǽ§Ø÷ˆ™‰kß [ïS÷Ù›¾߈°»ó¶˜‰j̃ZîSƒ×˜‡¿»±»‡»Å÷‡í‡ăˆŸ;k«ÔçÚ×Ơ²(­ˆÙ½íJívÁÚ߈ĂÙÇ̉‡Œ™‰kß [ïSÙöå¼ “‹±”ăˆŸ;k±ÈÍË)éÛ9¥ÏÔÇÖÅÓºÙÅëà& ÏÅ÷‡ơØäº‡Ç÷ÁßÚÏÔÀ¹ưÀå̉ ‘ù׿$ÇÓĂÙ±»îƠ±»ăˆŸ;߃ˆăˆŸ;«‡“ÍjăˆŸ;Ö¾„(ŽơÄßÁ‡ñ5µ.¥Ù±»ù×…Ú³ƒˆÿÚơÔÁƯâºñÙª»Ù½¯È̃Ú߈ßÄÙÅÓ¥ŸăˆŸ;ù×ëö™ÛÿÚăÁ£ä£Ơ™ëéå·ØÅØëö™‰kß [ïSù׎“Ơ¡Ô¼ßÖ÷‡§Ó˜‰ j ̃    Z îS ÍË)éÛ9¥ï‡øơù׿±ç̉§Ô¼ÜÏ̉©‡¥2ßëM₫®¶ûºÏ̉ÙÚ±½ơÔĂÈÏÄí—G¬ÛƒˆåĂÚª‚ +¼9Û«‚ ½9•ƠÑÓ߈çºÏÔ›e«‡“ÍjËơƒˆƯÓ âˆö™‰kß [ïSûăˆŸ;±»Û«‚ ½9³È÷ÚÏÔ©‡¥2ßëM±»§ÔÖ¾8°”ÏÔ›Á•ÿ½óÚª‚ +¼9­̀ë×ÏÔƒv‚ˆÓÆƠÜ«‡“Íj—Ó©Ø•·Óº9¥‡ÙÚÏÔÅ +Ăív·¼Í7ÇÖ¶ÔëƠU›¾“¹ƯNϺÀ¡ÔöÁ˜êèäṇ̃³ù×ÙuÎăÖ×Ăϧô ÁÏÔÛ×ëößÄÙ₫¹Úº$ĂÈ“ÆÏ̉ψéêØƒÏ̉«‡“ÍjÁ¼æƠÛ×Á‡é/×:¯ÜƒvèÓù£߈¡È°¿º̉‹G½¹¥ÛµØ™Ô±»̣¶åÁκù×°»"±»ôÁ½¬¾·‡‘×8çÉăºÏŶèù×›¾«›ăˆŸ¼ÜÂûØ‹ÇÅÓƠXçÚѶƒv±»ëöí꛾›¾ơÔǼº±»ÿ¯¶ăˆŸ;ƒ÷­Ö°»¡Óùơ«‡“Íj²ÆưÀëúÛ«‚ ½9‡˜Ù “¹ƯN°»›¾Ó̃«‡“Íj¡ÈË÷Ù×°»öÁÁƯß»û›ƠÙڟ؉j̃ZîS°»ùÜëÓ½€™‰kß [ïSƒvóÇä̉åĂ¡™‰kß [ïSù×¹Ú·‡‘×8糺ó½ôƠî߈ÔlªÓ +ù×—ØăˆŸ­Ø‚ăˆŸ;ßƯÿÛå¿Å½óÄô³ºó¥ºƠXºªøÂÙÿ¯¶ßÁÛ«‚ ½9“˜‰j̃ZîS™‡˜êèäù×÷Ù™ßÏ̉÷ˆ¶‡Ö8æêÚ¿Ù¿ºÏÚ›ÚºØÑÓ›¾ßÚóÇ©ÓÑÓ“Ơ›¾º™‰kß [ïSÛ«‚ ½9§Ôù×ơÔÆ»„؟أäƠX̉/ù׈۫‚ ½9§ÓÿçuóÂÂÙ÷ˆ¿‰ÙÏœȫ‡“ÍjĂÙÁ×ùׇx£Ø™‹Ü«‡“ÍjÓØ߈Èǃv߈¦ôăˆŸ‰µØÓƱ»ŸÜù×ËÇï»ͼƒÖ«·3uU°»×Ơ«Ñï½̀ª߈ÏÅ̀ĂƠºmơÔ±»½ƒÔ±»“Æ«‡“ÍjÑÓ庘‰ j ̃    Z îS ƒ×ÏÔÁĂëÓ󙻃ÖÙ½éꇌù×›¾Û«‚ ½9ÿ¯¶ÏÔơ»Á©e«‡“Íj‡̀Ó›¾Ơëö9¥‡ơ‡·ÅßÚăˆŸ;ƒØ½è½Ăƒv‹Ç§¹ỞÑÅ₫ø¿ØÓÛ«‚ ½9ƠÛ«‚ ½9×ĂĂ­ÔÇÖÏÄ·Å9¥‡×׿8ư“·‡‘×8çÑÓ8¤‡ºù×Û«‚ ½9½³áê³ôÛ«‚ ½9¿́™‰kß [ïS«ÔÍgÔÏÔµØø×íÚ‹àÇ÷9¥‡ù×ɇÛºăˆŸ;Û«‚ ½9Ăٱܽ™Ô»ÁµØéÓçÔ¡ÏÔ«dµØ ™‰kß [ïSƒˆרµ‰ÓƯ‰ăơ½àú¼ñÖ‰…ÔơÔÏÏÔ·ÂÍÄؽ ƒvÓ̉±”®Gø¶ÜœÔ×Ú߈«ỐÓ +ă»Û׉ÿ¯¶ƯÂȇÇɉ¿I±»µÛ™‰kß [ïS‹ÇÓ¼çÚ‡ÊÂǺá ăˆŸĂÙ߈½€Û½ÑÄëÂÖÍÓå̉ ăˆŸ;9¥‡ù×ß»û×¾ƒưÀ±»°À•…‹±»±MG½¹9¥‡‰̃ÏÅ«‡“Íj÷Á½ÏÅŸ}ă­ăˆŸñÓÙÚ‰¿I±»߈£‡ùêÏÅ­Ä÷‡º̃Ó̉ßÁ•‹ÙŒë*«ëö‰Ơƒˆ©ÜĐÓ +μîºÓ™‡çÔ¡ÍÓ¼½ÏÔ߈Ợ₫®¶±»º¶ÏÔƒvÏÅâˆ:k߈Ϻù×ä̉—»ÀƯăˆŸ;·‡‘×8çùĂă½¦Ô9¥‡ϼñÁÁÚ©‡¥2ßëMÁ¹·Ô•Èû›Û׫‡“ÍjơèŃv÷Ô«Ô÷ˆÀ̉“¹ƯNÿ¯¶YµØËÉ9ÿ¯¶߈±å½ÙÅëÙ½·‡‘×8ç©Ó²¹™‰kß [ïS»‹Á£äí—G®ö±»ù¾Ú°»™‰kß [ïS‚vûºåŒ¿NƠ±½ù×»Åáê•Èû›ÑÓĂº£ä‡×ç'Û«‚ ½9シآä¢Ç™‰kß [ïS€ëư₫öÁ±»ÁÙ±»Û«‚ ½9¾ơºÁĂôÔáÛ“¹ƯNßÚ½ψă»ĂÙ«ÚßÄÙ¿Ù̉Úª‚ +¼9©‡¥2ßëMÏÔư“ùסÁ«Óø×ÈĂÛÄÓ˜‰ j ̃    Z îS ëö‚vÏÄ₫Û‡»I›¾µ‰¡ÔÁ±»µØÏÔêöÿ¯¶ívÏŽ¿́Ë¿Û×Ù-—¶·Ô½è«‡“Íj÷Á‚¾ä̉«‡“ÍjĂÈ‚v ư“çôÆØëÓµaßÚêöóÇÅ–ëö»Û«‚ ½9½߈¶ĐÄFêF‘÷Úª‚ +¼9ÅÓưÀĂÙ³½ù×§dÊÖ¾«‡“ÍjÅ¥‚v¡ù×Û«‚ ½9G½¹߈©Ø«‡“Íj­Ä±»™‰kß [ïSÅØơê…Ø·º¯Èù××Ơ†7§jÛשÇ߈©¼©Ó¹ÚÄ“Ơ©‡¥2ßëMî ²2 ÉrÛº¹ÚÛ«‚ ½9ǽ‘øăˆŸăˆŸ;·Åá –¾é‡ÿ¯¶«‡“ÍjÂÛ«‚ ½9ñĩܯÈ́ºù¿›¾µǾv­ÄÙ½ƒçÚù×›¾™‰kß [ïS§ØçÚ°»ơĂ«Ô¡ÛăˆŸ;ù×ä̉ăˆŸ;ơèŃvăˆŸ·̣麛¡ơêºÔ߈ÉùïÅ£ÇÀĂª́¡Á…ôÅ–¼÷ÁùÚíÆûسÆÏźô™‰kß [ïSñÚ­‡½í‡›¾Ϲ…Ûœ‡«Ú¼Ẵ„‡xưÀƯÓ Ï̉·Ó ¥0©Ç¾‘Æ«‡“Íjó½ƒv߈ÏÄù×á Û«‚ ½9‰Ô­Ö€ÇÏÔúƠ™ÉỔó¶ÁẵÁăˆŸ;kÿÚöÇïƠƒˆ9¥‡–Ó¸Ú麭ě¾ÖÔ†6¦j±»ÛÀ‡ÇƠX߈ÍÇÿjºØ̀Ê)èÛ8¤ơÔù×ñÆ™Á°»ư‡±ù1±¿ÙÚƠ¿¹½ÔĐ·ƠÈëÓ÷ÁÓÆ‡ñ5¹ÚßÏÅØÛ«‚ ½9¶÷Á›¾ó^åƠëöß»ûŸè‹Ç«Ôăºä̉ăˆŸ;‹ÙÎŧÓé‡ÿ¯¶çÛù¾ÅÓ×¾ƒvéºâઇ’̀jƠjưŒ½¹Úö©¼ɹ‚v +¹ÚƒÚçØ™‰kß [ïS±»ÏÔÿÚ¡ÓơèÅăˆŸ;kÍË)éÛ9¥³ïÅÛ«‚ ½9¡Û¹Ú™àăÇíÛ«‚ ½9ª‡’̀jû(ĂôÙ½™‰kß [ïSù×½ßÁ‹ÇÛ«‚ ½9ưÀ™‰kß [ïS«Ô©‡¥2ßëMëÓ·‡‘×8ç±»÷Ụ̀¶ăˆŸ½ÔÖ¾ăˆŸ;k¯¼»Ø²#œ‰¾I³µØÙ×ñÓÿ¯¶Û«‚ ½9©Óù×¥ˆ]1÷Á•{ù×ÙŒë*«¹ÚÙ½ăêÁ̉¥ØăˆŸ;kö‚̣ăˆŸ;kăˆŸ;ƒ§ÿ¯¶¡Ú×£ƯÀĂ·Øä̉çơꇱŸ×>ܽ۫‚ ½9¿Ü°»±»›éƒÚÛÖ¾8óÖöÛ«‚ ½9™ÛÙکسȰù×̃ŒÚ,ĂÙ‡x‡º̃qÏÅơĂûÓơéåĂÛ×·‡‘×8ç·‡‘×8盹‰P—ÓÍÄơê߈ơÔåôÿ¯¶ƒv‡×Ù½¿»Û«‚ ½9߈›¶é÷‡éê­Ø8¤‡ÎÔϳ‡j±¿½€Ưµ—v“âùêô»˜àĂÙçØ«‡“ÍjƯºÅØƠ‡ÛôÅ»ƠíăÇíưÀơ꫇“ÍjÅÓ«‡“Íj¬Ö4ăཷÔÁĂƒØ½€ăˆŸ;Û«‚ ½9ÅÓ™Áëö§ÔßÁó¸…Ơ±»­ØơÔÅ»₫®¶ó^¹àYơÄÏű»Ç"«‡“ÍjÏÅƯÚ™‰kß [ïS¾g™‰kß [ïS±»«‡“Íj±ëØÆ¿ßÎÔ¦ÔĂÈưÀ«Ô©ÓÙÚÛ¿»ÅØ™‰kß [ïSÛ«‚ ½9ÍĂ·ØƠôêÿ¯¶ëÖʹßÁ»îăˆŸ;‹ÇXÓ(‘gƒ×¡ÈăˆŸƒÿÚ³Û×ó^ơêëöÙŒë*«¹ÖêöÁ½ר¿ƒv麡ÛÛ«‚ ½9ÂÙơĂÙÅë£ÇéôÁƯ™‰kß [ïS‹ÇÁƯÇÖÛº£Ư£ØĂ†×Ï̉߈ùׇxëö—Óï»ÏÔÛơêª÷²”ăˆŸ;Ûºù×ÍË)éÛ9¥±½’ƯÓ ±»±»§Ôăà•Á‡ºÏÅÿ¯¶¹ÚƠÓƠá ϺÛ«‚ ½9׿8ị́ԙÛڇÚêöϺ“-ù×ù×±»©¼ñÖƒ¾‘«ÔŽÛ½ơê¼›¡ă»™‰kß [ïS‚¹Úù×§º‰¿IßÁơ—¶ÛÀ÷ÔÏŲ⻓ƠÙÚÅÔ›¡óæ±»‰¿IñÖȧƠÅÄ8¤‡ÖÂưÀ¿‰‡xÛ«‚ ½9•Çëö©ÈßÖ¿ºÛºÚÀ÷Á·&öùê×¾—»¯‰¯0Ï™‰kß [ïS·ÔíêŸÖăˆŸ;¿º±»«ÑÈëÚùêµØ÷Áùë…»ù׫‡“Íjׯÿ¯¶²”™‰kß [ïS“¼½€¥ØÛÀ½¡Èï»™‰kß [ïSöÁÏÔù×á=ÚÏÔ«‡“Íj™É«·3uU¸ÚƒˆĂȹÚăáµÁĂöŸÅÍË)éÛ9¥…»ÏԆDZÜ߈óÇËÉ9̉º«·3uU½Ă½Ô±»¾ºÛ׎¯Ûù×—¶ÿ¯¶±½Ǽ±»ăˆŸ;ßÄÙ·‡‘×8ç£äĂô›Ô߈—ˆ¥ˆ]1Úư˲qñƇ¶›¶éù×ơèÅå̉ Û«‚ ½9߈Ạ́̉“Ơ±»±¿ùÏԑƽÏ̉ÜëÔµØçôŸÅïƠ«ÔÓØ߈ÙŒë*«ûƠÍÄ»Óó“ËÉ9Û«‚ ½9ÿÚù×å̉ êö@߈ÅÇÖÏÔ«Ú«‡“Íj‡ÇĂÛ“Èá³û̉«ÔÍćۡԩÓĐű¿©Çù×ÅÔ£äùÖÛ«‚ ½9™‰kß [ïSăˆŸ;¡Ûá ­¾ºœÜ+‚Ï̉•¾Ă½Ô߈ëöù×ó¶Û«‚ ½9Û«‚ ½9±»°»ÓÓëÚå­9¥‡óå½è›¾κ§âưÀ±»ÁƯ¡ÈÍË)éÛ9¥ËÖÛ¾߈×¾µØñÚăˆŸ;k¯È™‰kß [ïS9¥‡£€ơêƠÖØƠëö½™Û¡Û«‡“Íjª»µ߈ù+•Œ÷ڃ֩ǾÅÓºÏÅñÚ½€ơêƒÚ°Á˜‰j̃ZîS‚vª¶2tT±»Úª‚ +¼9ß»û«‡“ÍjÏů‰¯0ÑØ­Ö–Ó¶ÁƯîƠ±»¡ÔĂ¿»ÅÓÆô¾ë¿ºÏ·‡‘×8çÏÅù×ăˆŸµØ«‡“ÍjĂÙ©¾ÇĂôꙉkß [ïSĂÙÿÚÁ׫dÍÓ»‡Ù½ÅÓư§‡ÿÚƒˆ¾ăˆŸ;‹Ü÷Áăº}·‡‘×8ç£X‹Ü©ÓߌÛ,Žÿ¯È߈êö™ĂˆÓ«‡“ÍjĐÓëö߈ßÏ›¶éêöá “Ơ׿8±¾×ƠŸóơÄ“â‹É0­Ö—¶ử¹Úï½±»ï³2߈Ă¯éÙ׫‡“Íj¶­¾½¡Ûµß›¶éăˆŸ·Ô™‡ÊÇív˜‰j̃ZîS«(³÷ÁÁƯ…nÙÚá ¯È·̣Ở±%™‰kß [ïS9¥‡¶Ă–Œ·‡‘×8çÏÔרºëöÀ‡€è/Ö:·ÔĂÙ©…ÚñÖá »ëöù×Ó‰ÓÆ÷›ÚŒ½èễˆüÆ’ —»ëö9¥‡ƒv×åÿÂĂ٤ȃvù×Û«‚ ½9íÚÈ̉ơê“ƠùëơÔ»yÇËù×öơÑÓÛ«‚ ½9רăˆŸù×óÇơ½€Ù»ûÓ₫ ö߈ºƒÖ™‰kß [ïS÷Ùù×ñÖÿ¯¶߈ß×ËƠ™ơßÄÙ§́‡Ú•ֳܫÔÛ«‚ ½9ÙÅ룻ĂÈùסԷÔùêë½­ÄÙƠ釾”·óÂŦԾñÚŸ»¿ôỞ±ëØáê‡ÇåƠù×ăˆŸ;k«‡“Íj³È±»“ƠƠºmï½ßÚăˆŸ;8¤‡“¹ƯN•Èû›Ù½“¹ƯN“ƠăˆŸ;—àßôơêË̉Æ ·Ô¼ăˆŸ;×Ơ¹½ºĂ±»ÁĂÆåÖÓÔ߈ǺƠXÁĂÛ«‚ ½9ÁĂ½™‰kß [ïS‚ÑÓØÅêçô߈ªÆÉ̉ăˆŸ;ƠÏÄ…Û½ô‚‡Œƒvª‡’̀jÁӻ󪇒̀jª‡’̀jñÆ£"±»ëö߈µ†ăàăˆŸÙÚóÓëđƒ«d•ƒµØ©¼öưÀ±»™‰kß [ïSơÔ¤ˆ\0È̉Ü«ÓŵحÖăˆŸ;k—¶ưÀñ×»yéơ߈¿»Ô¾FưÀÛºÅÔ«‡“Íj“ƠଽăÄ™‰kß [ïS Ëûû̉ÏÔ½߈­½¼ĂÏÔ™ëéå߈¡»¡Á8 +¤‡ +×ÙÚø××Óƒväê ăˆŸ;ö±»™Á¡Ó•½¥Û¨º§¹Ơ¾G÷ڵث‡“Íj«‡“ÍjëöơÔ ËûÛ«‚ ½9¥Û—¶¿‰߈ă×›ÚÙ½¾¹ÚÅÛ«‚ ½9Û«‚ ½9ÉĂ¹ÚûYå̉ ±¿Û«‚ ½9Ù½ÇÖÿÚ­ÖÑÓ߈§ÔÑÄ뛾ùĐăˆŸÁ̉÷ˆÿÚƒÖăˆŸ;ÛÄÓµaäÓÛ«‚ ½9ăˆŸ;ă»°»Óº«»¿‰ÛÀ«‡“ÍjƯÓ ›¾˜Ù½9¥‡Û«‚ ½9›Úƒ±»«Ô¡Á™Û߈…ôƒ¾‘øê…ÖŒ!™‰kß [ïSƒˆÍÄ©¼‚¾§ô¿»ôú׿8ư“Û«‚ ½9ÙŒë*«ûß±»ƯÓ çÚ™‰kß [ïSëö‰»áÛÛ«‚ ½9߈™×†º¹Ú«ÔĂÈ߈—»ëÓÛÁĂÅÔăˆŸ;©‡¥2ßëM©ØƒØ™ëéå»÷Ù̃νô™‰kß [ïSß»ûù×9¥‡çÚơ}¿Ø±߈±»ùê±»¡Óù׫ÔéÚŸÈ­Äơ¢›¾²Â·‡‘×8çăˆŸ;«»¹ƠщỞùסÁßÖèê™ëéå³₫ÿb½ÜöĂù×Å೺óÁ•rïÅ—ˆÓƃvÙ×½—¶Û«‚ ½9Ñ+߈ăˆŸµØûƠ›Ô™àÙÚWÏỔàómÉ“½­Ưº±»8¤‡Ö¾ƒØöăˆŸơÔË¿ëדȋÜï½î½©¼·Å߈ƯÚ°»«Ô¹ÚÓÏĹګÔöÁßÄÙ߈ù×§º¥ÆĂ ÙÅëÛ«‚ ½9½€ñϱ»‡ñ5½€߈ö›¾ŸÅÚר§ÔªÚ߈µØ›¶éñ׫·3uUỞ¯È«ÔñÚÙ½‹Ç°»›¾«ÈÏ̉¶èÛ“Ơùê·Ü¢X “Æ…ÿ±»©¼ƒàåÁĂº¸Ú¸ÚĂÛºù×§Ó«‡“Íjçm½«‡“ÍjëÔƠÛ׺ëÓ×$ÏÅûÓóÂíÖ¡Ơôơê‡Û±»˜‰j̃ZîSƒÚ¹Úù×8¤‡ÓØưÀ‹ǛÓ ߈ĂÙ‘®ÏÔÍĦôăˆŸ;ñÖ«‡“ÍjĂëöưÀĂ©ôï½™ëéå÷Á‡ܺóÂÆ%…Ơщ½ÖÆĂÙØY¡Ô™‰kß [ïSÑÓ߈ÍË)éÛ9¥ơê9¥‡Ù½Û×ɹ¿çøê¿‰ëö¹ơ×Ơ«»Ñ·Û«‚ ½9™‰kß [ïSù×£‹£Øëö·Ó ¥0ơÔØÚÙÅ뿉«‡“ÍjƠÓ₫®¶¥ØĂĂ߈°»¼Ăùô©¼ùׯ»ǽơê«ÔÓ´ö½íÆÙ½óĂÛ×ßÄÙ›‡Â¹ÚÛ«‚ ½9ù꫇“Íj»̃ÄØ³b¡Èơê±»8¤‡ÖÏ̉9¥‡ÁĂ¹½Û«‚ ½9ÑÓöƒv½‹ÜÏ̉½ù×Ï̉³(Ë¿ăˆŸ;Ïű¿¹Ú‰¿I°»çm¡ÔŸ}áÛ‚vÖ¹ Û«‚ ½9‹ÜăˆŸ;ÏÔơÈèØåĂù×ï½ëöëöëö«‡“ÍjÚÀ¥‰ÍL…‰ÛÇÛ¿‰ÏÔ«‡“ÍjÏÔÏÔù×ܺ§ô©‘Óѧ-«‡“ÍjÏÔ¹àꙉkß [ïS±»ƒ½ßÄÙÅØƯÓ ÷‡ñÚéơ©ÓÑ·Á‡é/×:ăà›Û“Æäơ“۳ȫ‡“Íj·̀ô™ôÙÚ߈ĂÏÅù×¥Ó߈ÏÄ‘́¯ÔÛ«‚ ½9ƒv‹Ç™ô«‡“Íj“ÈÛ×ñîôĂă»³ÈçÚ‡ŒơÙÈ—´₫Ú¥ˆ]1ÙŒë*«å̉ ưÀï½¼Ô½÷‡ËÇëåĂÍÓ·Ó ¥0ÿÚƒÏÔ—đå̉ ›¾äÁ ‡ù›¾‹Üù׿ôËḈÅ«d“ƠƒØƒvëö“ÆëöÛº߈ÅÔëÚÿÂçmßᙉkß [ïS¡È¿‰·ÅÓ¾½à8 +¤‡ +ÖăˆŸ;ÜÙÅë߈«‡“ÍjÛ«‚ ½9₽ĐÓç'ÏÅŸß™‰kß [ïSɇ«‡“Íj˜‰j̃ZîS½€ù×ÇÖ8~¤‡~Ö÷ÁªĂ±»»ûÙËƠăˆŸ;k·‡‘×8ç£ä½ĂëöÜăˆŸ;³®Gø½Ùש‡¥2ßëMËØ±»̉Å麽ØéºÅôëö̃ˆĂÙщœ‰¾Ivóº‹ÓăˆŸ;μÏÅ­¾ëö¿ ±»ÿÓÂÙ¶77æÚ§Ô°»·‡‘×8盹³ÈƒØÆ̉ËÉ9¿½¹ÚØÚÛ×…—øáê§Ô°»ƒÔÛ«‚ ½9ŸèƒvƠXÀ‡ € è/ Ö: ߈ç̉ăˆŸ;kƯÓ ËûÜÏÔ©ˆ™‡ËÓÖ¾±»·Åº½™‰kß [ïS÷’Ûº¯ÈŸ}÷ÁƒvëơÏP›¾ơĂ•Œ߈ÍË)éÛ9¥›¹½¦º¯×»ˆ¹Ú›¾ëöçÚÏÅרñÖ±»­ÈƒÖĂĂÙÚçØíÚÂù×·ÔÇ»«‡“Íj«‡“Íjô-ǃ¡Á˜‰j̃ZîSƒcÑØ¿ºƒv×Ơ­Ä¥È÷‡¿ô°»ăˆŸ;ỡå̉ Û«‚ ½9“Æ™‡£»Û«‚ ½9¶ªÈ¶¹Ú¡Øƒåơꌾ¤ˆœ\œ0œÏÔÙ½ɶééÙôĂ Ư‰“Ơôï»ăˆŸ;ƒvưÀÁñ/¡Á÷å5Óú(®×ùê·Ô“¹ƯNƒvؽßÏÄÓ©Ó¯ÓăˆŸ;—¶³È¾¸Úá°«‡“ÍjÛ«‚ ½9¿ºé«‡“Íj„ÇưÏÔƒƒÅÓưÀÁ̉ÇÖÇ%Ù½ơé‹Ç©‡¥2ßëM³zăˆŸơÔ߈¡ÁÿÚÙ×·Ôơ‡¾ÅóéêÇ̉ର»ßÚỞ«‡“ÍjăˆŸ«&ûӥ⩪ ¨ƒº5ÙÚ¡ÈơÔ›¾½ƒvÏÔ·ÜñÓ÷±Á¹Ú߈¯ÛßÏ·‡‘×8籿­¶Óºƒvß„‡ºµaƯơÛ«‚ ½9ív‰¿IÏű»סÏÔñÚ½ÙÏÅÛºÅn߈ëö™‰kß [ïSËÇ«‡“Íjº½óÂ9¥‡×ÇÅáË©Ç9¥‡¹›ưÀÇÖëöÿÚ¡Ô±»Ç‡×±Á9¥‡Åƒ…±»ôÅươÔ‘g™‰kß [ïS±»±»ù×Á¹ö±»źÛ«‚ ½9êÔÛ«‚ ½9—¶̃ˆ9¥‡¹Ø½ơê¹½ƯÓ ›¾«‡“ÍjÙŒë*«Û߈ïÚù×óÙÚăˆŸßçÚăˆŸ™ÔăˆŸ;ÓºÏÅ…øăˆŸ;‰¿IăˆŸ;ƠơăˆŸ÷Á©Ă¡Ó½€µÜªÛ³–¶ô!Ơ˜‰j̃ZîSù×™Ó­Ôí‡÷ÚÅمؕÇÇÖ÷ˆ¡È¤ˆ\0߈…ÔÏ̉ư‡±ù1ï³2‡ºơÔóæΈ÷³ºóÖÆó”Œ +¥íÅØˆüÀ¡ØÏÔ™ÔÍÓºç›Ú¾½Ăư“߈ơ꛾½߈ÄÓ׿8ùơ¿‰‰ÔÎÿÚƯÓ ‹Ó©ƠïƠ¥›•ŒÙŒë*«²Ø²º̣ÅØÏÅă½âơáÛÅü³«ªñÓ«ÔÙ½×½ÔĂÙ“Æï™ăˆŸ;°¿ơê܉‚ô¿ÀÏÄ«»Ù½¿‰¡»í—GơêưÀ¿ßÅÄạ̊¹Ú¡Ñ§ôÏ̉ͼÂÙ̃À½Ê¿§ÔÀ½«‡“ÍjăˆŸáXÿÛÙ½ÍèÉÔ «»Ç̉Û«‚ ½9öá=«‡“Íj‡ŒßÚµØ߈ơĂô±»­ÄÏÔáêÅôù×̀ªƒµéºÏÔËÇư“›–ĂƠ©Ơå̉ —¶ÁĂóÇçÚÇƠ±©ź±»ö퇰»óÇ‹Ù̃ˆơêÏÅ߈äôµÛ«‚ ½9ë­ȶ°»ẲÀ̉¸Ú̃ˆ±¿¶‰¿I퇑ƃˆϺƠÚñÓƒv‡ñ5›¾…á ́Ø ưÀ¿ßƒˆă½§ÁƯÑĂ·ÅØµØÑÓ©Ó©‡¥2ßëMéºĂ$ß»û–¶§ÈŒ¾ëÓÙÚöÖù׫‡“Íj™̣ĐÄêŸóù×±»áÛÇÖă­ùëưÚÑÄë̉Æ +Ùܶï½ä̉  ÏÄ߈Ù½ÍÄ­ÖǼ“ÈäơƯÏ©Ă8¤‡Ö±»‰¿IÑÁź߈»ÓñÚçôŸNÍĺÙÚ±ØơÔ­Ä»ôÅÔ߈ăˆŸ‚½­ÄÙ½«‡“Íjă»ÀÙ™‹‡Œ«‡“ÍjÓ¼µØơêø¿ªÚÉîẴˆ£ØçÚÁ™‰kß [ïSù×ơĂÙ½Åà™‰kß [ïS£ÇöÛ«‚ ½9¡È³ ăˆŸ;™‡ơêÙÚ·Ôº½«‡“Íj«‡“ÍjÑÓ¶è´È÷Á¿Å±»Ôơa³ÇËÓ¯¾äñÇØÛÄÓăˆŸ;̀æ¹¥Ó˜‰j̃ZîS߈†½Å“ÛÄÓ߈±»ш…ƠÁăóǬRơÔ™‰kß [ïSŸó߈ÙÜăˆŸÇ»ñÚÛוÇƠ™‰kß [ïSÉÏ¿ÓăˆŸÙÚÙÚ±»üؽÙÓ¿ßñÓ߈Û«‚ ½9Ö¾ƒvù×áêĂô«d«́·‡‘×8çßÅçà=¯È¡ÔÓº’ÆÛ«‚ ½9Û×đÓ©‡¥2ßëM¥Ä×¼ĂÓö­Ä÷ÁÍơê߈¿Å˜‰j̃ZîSÏÔ÷‡¹ÚéăˆŸ;kªôĂ‚ˆăˆŸ;¥Ø©Ó±»Đű»ÅƯÏÔä̉™‰kß [ïSÏ̉›¾ËÓ¾¹xâˆ:jĂÙùêËÅăàỔ‘±»ù×߈­¾߈íêñ'5’È«‡“Íj¹ÚƒÖ‡¿ßù×¹Á¼¿¹ˆáêöº‰»ơê8¤‡ß»û™‰kß [ïSÙÚ߈·§D úØÀË­ÄăˆŸ;kÁ×ÙÚç̉«Ôëö߈¹ÚâºơêỞ“¹ƯN«‡“ÍjµØµ}ï™çÚëÔ߈ä̉8¤‡9¥‡—ÓöÛºø÷$¿‰Ïű»„ôÁËÏÄéê·ÔíÖ¤Û±»Ưµ½€±»…»Ç̉Û«‚ ½9·ØƯ‰™¼¿‰§¹ÏÔÇÖ±»ÍË)éÛ9¥‹Ç‹Ù±»›¾¹ÚÙÛÅ©¼ßÚ³àÏÅ߈çZéÚ™‰kß [ïS‡˜‡̣Ç­Ö߈ù×¼€ÙÚ­úÙ½½íÚ…Ơ߈“Ơ‹ÇÇÖ9¥‡ººÛ«‚ ½9Û«‚ ½9¹Úó¸“ÛăˆŸđ» +‹Ü­ØÙ½«b‡ñÖ߈…&ßñ£ä«‡“ÍjÛ«‚ ½9åÁ£ÈÙÅë·‡‘×8çùêĂÙÅÁ©¼ßÚ½ăàÛ«‚ ½9±»ï½·‡‘×8çÏPù׿‰ưÀÄÙÚ퇃ֶԃµô‹Ó±Ç§Ó™‰kß [ïS›ÚÄáêÀ̉ơê÷Áׯ½Û«‚ ½9ƠX—¶ÏÔ±»—Œơê¡Á›¡™×9¥‡×÷ڃؙ‰kß [ïSö±»ÛÄÓÙÚ÷Ù¡ÔÈ̉å̉ ƒÑăˆŸ;¿½́ºƯÚ‚àÆ©ÇÛ«‚ ½9߈ÛºăˆŸ;ù×±»ºy Ù½±»Å–½̀ĂÏÔ“Æ ƠÏÔ»̉ר±»çÚ߈ưÀƠÅưÀĂÆ—¶ëöŸ\ơÄÛ«‚ ½9¹Úø¿åĂÜÚÚ× Â߈ÑÄ뿉ƒ×·‡‘×8çÙÚÙ½»©%ù×ÏŃv›¶éŸÈ»Á¥ØÏ̉ùןÅ߈¡Ç³à©‡¥2ßëM¿Å¹ÚăˆŸ¹Úùêívƒvɇơ꫇“Íj¬ÖèÓÇ»™Á߈©¼9¥‡×óÔÁƯù꿉ƒ¾‘Øáă‰¡%‡Ç½ù×÷ÔëöưÀ§Ø­Ô»Á™‰kß [ïS™‰kß [ïSùׇƠƒvơĂù×ùêù×àƠ¿ôï³ËÖ—»É đ»ׯ“¹ƯN›¾ƒù׵؛¾ÍË)éÛ9¥źÅ»ÍÓÍƠ›¶é߈íâ†Ú™‡¹̃»ØÛ«‚ ½9«»ơèÅĂ¹Ú£Â™‰kß [ïS…Œï½Ăô«‡“ÍjơlØŒê*ªöù׉¿IƒˆăˆŸ;½„öơêÏÄÁ£ä߈£‹¾º£»ơèű»ưÀ«‡“Íj›°«Ô«‡“Íj™‰kß [ïS¡Áé‰ñ5ñ·¯‘§ÔÛ×™‰kß [ïSûׯ©ƠÏÔí—GËÇƠơ­Äëö¥Ö±»ÛÄÓ£äÏÅ‹ÇÙ½³(«âăơÅØöÁơèẠ̊¶ƒØÔX·‡‘×8çÙÅëﻹڳñÚư¬™‰kß [ïSëö•Èû›ÿÚƒˆ¯ÈÏÔíÆƒvÛ«‚ ½9™ØÏÔ‹ÇÅØăˆŸơêŸƯ­½•{ơl©ÀÛ«‚ ½9ÓÆé·Ûơ‡«‡“ÍjÙÚ¡ÈÆô çÚ‡ÇÁ*·‡‘×8穇¥2ßëMëöƠß‘́½àưÀ¹¾ÁƯñÓ±¿߈°¿ ψ×í9¥‡£Ô߈˜‰j̃ZîS§Û«Ú›¶é¿¨¯̣§Ô‡ŒŽÑÓ÷Á×¾»ÅçÚăˆŸ“Ơë“ƠăˆŸêöÛÄÓƯơưÀ«‡“ÍjÏÔ8¤‡×·‡‘×8甌 °»ăˆŸ;ká=±»ăơ›ÛÍË)éÛ9¥ĂȽºéê›ÚăˆŸ;‡ăˆŸ;å̉ ¾«ÔñÛ«‚ ½9¨¼·Ø½û(ÍĂÀ¹™‰kß [ïSÙÚËƠ½ÙÚ¶º…ÔÁƯ›¡¢Ç¡ÁÓØ›¾±»ĂÙ¸Ú÷ Å÷ÙéÓ·‡‘×8率Œ§Àƒv·ÛÛêçôëö¦Óß„Ơ·‡‘×8ç…àĂ …ÔÙÅë›»±‡âˆ:k«‡“Íj̃ˆïÁëƠUˇºă½Ûº·‡‘×8çưÀÏ̉¡Ô›¾“º¿ßù×ϼµØÁ̉ÅqÓ‰.›¡˜‰ j ̃    Z îS ù×—Đçôχøê˜‰j̃ZîS°»÷‡µ.¥Ù§Ô8¤‡Ö¡Ô±»éºµØ±»¶ÅºÛ«‚ ½9ÙÚƒv½Ïđֵ†ù×Û×±»«Ó¬ÙŸèăˆŸ;ăÇíăˆŸ;«‡“ÍjèêËÇ‹q½ù×ÏÔ‡¹Ú™‰kß [ïS«‡“Íjù¾÷Áù×Ûº¿ăˆŸ;™°Î½Ô‹Ç½÷ÁơØù×ëö—¶ÇîÚ‡—Ó÷ÁöêÔçÚ©Üï»°»÷ƒ8¤‡«‡“Íj³¾ù×éÓơÔ§Ôƒvù×ù×¾¶ôưĂƒvăˆŸ;ÍÓÁÏÔù×§‡ùø§¹¿ßîÚ¹Ú߈“Û÷ÁÏÔÖ¾8ĂÈóÇ߈³8´†ù×߈—¶¥Ó¼€"Ï̉ù×ùÚß%₫®¶ψר¥ÆçÀµÚ׿89¥‡×¤ÆÂơȣÔèÖ½ÜÏÅ×ï›¶éÑ«‡“Íj™‰kß [ïS½€¤ˆ\0Û«‚ ½9“ưÀ₫·‡‘×8çƠXơñÚ±»ƒvóÇߌÛ,ăˆŸ̃ˆ¹Ú°»±»™‡Á̉¾±»¡Ô‡9éßÇÖñÚËÖÛ«‚ ½9ÿÚë‰öó|ÅØŽỞ½œ¿Á|Úª‚ +¼9™Ô‹ÈÛ×¾³¥]Ž©ÓßÄÙơꎄ؇Œͼ—¶¥Û«‡“ÍjÎ̉—Ó‚vÁäèºëö§ÔÙ½›¾Óơۘ‰j̃ZîSÿÛÏÔÁ¼ăÂå̉ íÚĂÙÛ«‚ ½9ùדƃˆ¹Ú¸ÚÇ÷Úù§áƠË̉á=߈ͪĂÈÛ«‚ ½9«¼½Ø¡Ôö÷ÁívÜăˆŸ;kǺ·Å›¹¯È¹ÚÑÓñÓ9¥‡ÈĂ™‰kß [ïSưÀ†éÓßÚ9¥‡ăàÍÓå̉ ߈ÿÛ¹ÚÛ«‚ ½9Á×¾щû(‹ÙÑÓ8 ¤‡ £»ù×Ù½ô±ëØăˆŸ;ù×óÂá ûÀ󶱿ƒ‘¾Ϲº½ëØ9¥‡åôôꩼÑÓ‘Æ¿»ÅÓËÉ9ơ¡Á߈ó¹ÚÛÄÓ߈ÍĂ¼ÔX÷ÁŒÉÛ«‚ ½9½ëÙ€ËƠ·‡‘×8ç¡Û­Ä°»½"ƫԅÔÄÅ«‡“ÍjÛ«‚ ½9µ†½éƇ£»ùꮡƯÙ½™‰kß [ïSÍÓ™‰kß [ïS«äù×™‰kß [ïS¾›¶é¥ÏƒØ×¾߈ß„§Ô«‡“Íj“ù´Ă´†áêơ‡÷ÁؽÉó#źÛ«‚ ½9ëöưÀ߈½¡Ô߈߈©ÇăˆŸ;™‰kß [ïSß»û½ëöăˆŸ;k“ºá ÙÚÙסÈÜÓ ăˆŸËÇ…Ô£ÇƠ•ŒưÀÿÚù×ơê•̀ú̉Á¹çÚß¹¹ÚăˆŸ;‚Û«‚ ½9°»ơê¡ÈôêñÓÏÔ¿‰߈·ÔÛº÷ÁÛ«‚ ½9‘ÆÉ»ÄÁç/ÏÅ龩ÓÍ­ëÍ߈©Ü¡ÇÛ~ÍÄơĻůƒßͯ¥'=U#QK¯Â™‰kß [ïS½ÿ¯¶ƒ½É̉ëöÛ«‚ ½9ưÀÏ̉«‡“ÍjĂ¼¹ÚŨŽÛÀĂÙ™‰kß [ïS±»«“ÆÁƯÅ»§Óï½9¥‡߈…¾ôÑÓ«Ọ́Ç·Ǻ½ Û«‚ ½9»ôêÛÄÓÏÔỔ½£»±»™Ó›¶é‹Ç¿¹¬Ø¿ồÓĂºç̉ッé½çÚ»ÔÅÄÏÅ9¥‡ûØ×ƠÏĹ.Û«‚ ½9Ơ£Ư«‡“Íj9¥‡ÏÔßÄÙƯÓ ơèÅ™ÓÑÓá=Ù‡Ï9…ơÔ±½¿Å½ÔßƯ½‡“Û«‚ ½9 ™‰kß [ïSÿ×ơÛڅ¾‡ÛÿÚÇÖË̉ÛÄÓëØ‡ŒË1Ù½ÏÔÆăˆŸ;ʼș‰kß [ïS°»—±ô¿ôѶï½›¶éưÀƒv«ºÛ«‚ ½9ùêÙ×™‡߈ƒvĂÈƠ±»щăˆŸ±»›Úù×Ẩ»đÔø×Çëơê߈«·3uUª‡’̀jƒ°»“±,á̀oÛ…+ñ½ +1纼Ơ™‰kß [ïSËÉ9öµØó¸™‰kß [ïSăˆŸ;ËÇ•Œ»Å¹Úùêôé%Úª‚ +¼9÷‡ÏÔƒv—¶̉Å̃Ôç̉ÑØ9¥‡È·ÔÏÅ™‰kß [ïS«‡“ÍjÏÔ§Ô“ÆÛ«‚ ½9•ŒµØ×ÓưẠ̀ÄăÁ™‡Û׋Üá½ÛÄÓƒ½ßÁ¯“Ơ£ØŸ@áêçÚ8¤‡Ö ưÀ½Ăψ™ĂÙ¿‰ÛÄÓ™‰kß [ïS™‰kß [ïSÛÅ™‰kß [ïS«‡“ÍjăˆŸ¡ƠăˆŸº«&·Ô±»ơÔ¾ëÔᾘêèäÙŒë*«ĐÄê×ƠÏÔÂĂ—ÓŸrçđƠÓØ½¢ÓÏÅ÷Á«»ôê߈£ØѶăˆŸ;£Ó¨º©À¾ÔÛ«‚ ½9ơÚÓµË_Å»ù×ẳăˆŸ;ŸÈ±”߈ëöñÓ×ÜÅ™‡́vƒvÁêÅØ«‡“Íj±ëحطÔëöÍÄÚÄ̉áă©ÇŸ}½êö«‡“Íjû +đÁŒŸ̃ư§‡•ŒåŒ¿NĂôº‚.ù×Ó̉£Ưăº½Ô±»çôµØ½€™‹íØÏÔö™‰kß [ïS¥‰ÍL…ùר¼߈ùêÏŘêèäÿÚăˆŸ;ÀƯÛ׫‡“Íj±»Ó߈»ĂÿÂçÔ¡å̉ ăˆŸ;kÙÚ›¾Ï̉ﻹڃvæÚ¹Ú£ÜÏÔ±»¥º¤ˆ\0ÇÓ³ êÚ9¥‡¿ç«‡“ÍjàƠÉ̉ÊƠ9¥‡Ù½ë̀éêå̃¸È‡ÛºÁ-ͽ¶±» Áëö˜ÈăˆŸÚ±»ŸÈưÀ«‡“Íj¥Æ¢XËl÷ÁƯơßȽÚÀáÛÏÅÏÔ·ØÇÖ÷ÙϹ½€Ă{Û«‚ ½9µØÏŽȷԫڻӧÓưÁÛÄÓ߈Á Ï ·§D ×Ó¡Զ‡Ö8æ߈÷Áá «d«ÔÅÓ¡Û©‡¥2ßëM«‡“ÍjíÖƒ¾‘ÄÓ—Œơêív¡ÁÏÔ߈ÏÔ«Ă߈ÓØÇÖÙ×ûØ¥ÁÅÔÍĂÙ‡Œ¿íÙ½›Å‡ñ5Á̉ÿ$ŒƠ ±»‡™Ó‰ÁưĂ­¾™ëéåưÀĂȱ»¿‰‘“¹ƯN›¶é„ÖÁ¹ÑÄëöù×ëÓÏÔ¡Ơùº·Å‘d°»ĂƠ™‰kß [ïS—¶ÛÄÓÄôƠXó‹ܫ%ÙÚ±»­v߈̀ÓßÖÍÏÔđØψÙÚÁ̉½éº¯̃Îêö Û«‚ ½9­Ä¡ÛßÚ­ÄÙÚ̀ÓƒÖׯ»ô˹¿‰öÁÖ¹ê˜H‡¸ÈÏÔ¡ÛÇÖѦ±¿¾Û×9¥‡Ù½Ơ½óØ…ƠÏÅÛ«‚ ½9ăˆŸĂĂ ›­±àéM÷ÁËÉ9Ù₫G½¹º©đ߈ÍÓưÀíơÔÂÏÅÔÛ«‚ ½9.É̉âˆ;k₫®¶ÙÚù׫ºÏ̉ÏÔÙ½ăˆŸ±¿§ô߈ưÀÏÅÓÔÁ½ăˆŸ;ưÀ±»§¹ÛÔ©‡¥2ßëM—¶ÖƯ“¹ƯNÑÓ±»»Ø™‰kß [ïS¡Ô™‰kß [ïSÛ½«‡“Íj…ÛƒvàÔ¶ÜÿÚÁÜơúöÁË«Ô9¥‡×¿åƒvÏ̉Đӯ߹ڛ¾å̉ ù곺ó²ÚăˆŸ‡º›¾Ù½¡Á̉ÆỞƠËÇø×Ó߈ÇõóÆêÔ«»±»ÂÙµØÖ¾ÍÓçôÍӓƃvؽÙ½ăˆŸ;Đ¹5°»ñÙ¥ÛÙ×ơêƒvÿ¯¶±»½—¶ßÚ¼€êö +¹Ú«‡“ÍjăˆŸ½€Û«‚ ½9«dĂÙ½ëö¿éº§ÔĂƠ´†ÁĂ¯ƠÏÔ±»¼ù¿Î̉—Ó«‡“Íj·‡‘×8çỗáSă*«‡“ÍjÁƯÛ«‚ ½9Ơª¶2tTß»ûÉù×¹ÿ¯¶ëöË̉‡ºµ†ăˆŸ;k¿Œ¡Á±»¹Ú™ëéåÿÂỞ±¿ëö‡9ûï½9¥‡ôê߈ÓØßÑӵث‡“Íj߈óÂÇ Áº¾ÏÄ9¥‡×ƯÓ ¶èá=÷Ú߈Ơ°»«‡“ÍjÛºÁÑĂơΈÏÔ‹W ×Ûô߈ºûÁ¿¶ÔÿÚµ­ôĂׯ“Ơ¿‰ÙÚóÔéÓ÷‡Û«‚ ½9߈ñÓÍÓơÔÚª‚ +¼9ÁĂÚä̉Á̉§ÔËÉ9“ƽôÿ·‡‘×8牿I×ïÙ½©Çëö³¹ơĂ˜‰j̃ZîSƠµƒvÓÅƯÓ ‰¿I±‡ÓÆ¿‰ÏÔû¼щËƠçÀ­•·™ÓØ“ÆÙ½Ùƒ¾‘á ¸Úơļ9¥‡Ù½©‡¥2ßëM£Óù×­€©Çơê¹ÚÍÓ×Ă­Ä•Èû›ÏÅÿ¯¶Û«‚ ½9÷ÚÛ«‚ ½9÷Ôăà›¡‰¾ăˆŸñÓéơúؽôµaív¿ôŸ}º½ù¿‹ẩÅèÓ½Ăª»½ëöű»÷ˆÁƯϺ̣ćÇå̉ ÍÇÇÖר‹Ü¹Úä̉™‡߈„öñƯ¼¦¹Ú¹ù×å̉ çړȱôĂÈ·§D „ؽÆå#™‰kß [ïS̃̃¥ÓÙ½Ư™‰kß [ïS±»ăˆŸ;ëöŸÈµĂù×ơꇌÛÔéæÚ±»Ž߈±»ƒvß½¥Ø™‰kß [ïS©‡¥2ßëM…̃8¤‡Öû¸¼Ô®¼×$™ÓơÔă™Ư‰ù×ăˆŸ;ĂỞ±»шÛ«‚ ½9ƒ©¼«·3uUÑØÿ۷ű»±ëؽơêÍƠåȇŒĂôëöåƠÙ̉™‰kß [ïSǺœÜÁá «‡“ÍjÎ̉9¥‡‹đ¾ÙÚơĂÙ×߈ăˆŸ;ƒÖ½·̣ºy"Á½™‰kß [ïSêöẳ™‰kß [ïSŒºĂÙχÛ«‚ ½9ºÁå©›¾Ú ª ‚  + ¼9 ±»Á̉ƒ½…Ơôê߈÷ÁùÙÚùשÈƠ‡ÚÏÅÛ«‚ ½9ÛºưÀăơŸÖ¯G‹ø߈±»Óº߈Ë̉³ºó™‡߈¯G‹øϼͼ߈½ôÛ«‚ ½9·Ô“¹ƯN÷Á䌾NÁÙ‰¼¡Ç›¾´È÷Úá¾½ô™‰kß [ïSëöôúÑÓS£XÏŅǵءÔÁ̉«‡“ÍjÛ«‚ ½9¿Ô8¤‡Ă°Àdä̉©‡¥2ßëMíÖ½ÏÔ½¹Ú½€ׇ½7ăàÛÏÔ…Œ™‰kß [ïSߌÛ,ÂÓ߈ؽµØÍÓºµØ±»×¹ëö·Åﻫ‡“ÍjûƠí$9¥‡ÁƯÏÅ›¾8¤‡Ö ëË«‡“ÍjÛº“½çÚßÄÙï½ôÿ¯¶8¤‡×ñĂÙÛ«‚ ½9¿íăˆŸ;ª¶2tTƒvŸ}Ÿ»9¥‡×µØĂÙ߈ăˆŸđÓ÷Á§ÀƠƠùוÈû›Ăº¿ÙÔơˆ¡ÁÏÔË¿›¾ăƠäÁåïÅô™‰kß [ïS½ǽöíê¡»ÅÓ«‡“Íj™Øøê ¹Ú©Øƒˆöơꇺׯ«ÔÿÚ°»º×Ơ†7§jœƠ±»«·3uU§Ô©‡¥2ßëM…»ëöº©ÓÀƯÓ̉ï»Å‹Ü»qÁƯĂƒ½©ÜØÚïƠöÿ×›¾­Ø¾Ô±Áß»ûÏÅçôƒ½ÀƯ±‡¾·Ü₫¶ÍƠ´̣³‚íÖƠîỞ¶è±»µØĂ›ƯÀ«ÔÓº‹Ç…½ÍƠ›¾“½½çôÁùêëÔĐÄêÅÑÑóÅÔ‰¿IăˆŸêö°» ƒvĂô™̃±»«‡“Íjר«‡“Íj¬Û¯¼G½¹9¥‡‰y·ÅÇØÑÓÓ̉÷Ôg“Ơ©¼ÏÔƒvÏĸԸړƠĂÈơêÙŒë*«Û«‚ ½9“ȫԙ‡ËÉ9›¡ƒv߈…虉kß [ïS•Èû›Û«‚ ½9ŸÈÏÔÏÔ«»Û«‚ ½9ăˆŸ³à޶åµúØûÓ«Ô±»óÇËÇ«ƯëöÿÚívƠÚÅ–ÙŒë*«߈ºÑÓùê¯È¹̃ÁỮˆ·Ó ¥0§½ăˆŸ;k—Œ¼ÎÅ™‰kß [ïSÑÄëÀ&ßÚù×÷ÁçÚ½ăºG½¹ÑÄë‹Á‡Ú›ÛñÖø×£ÇË̉£»¾ß™‡ưÀ¯¼Á¼ĂÙÿ¯¶ÁƯÏÅö̃ˆö%Á‡é/×:·‡‘×8çƒv„¹¸ÚƠ°»÷ˆÁƯ¯È¾„q—ÁÁ÷Ú¡ºăˆŸ;™Ô¾¢Ç™‰kß [ïSª‡’̀jù×âÁúĂׯ³ÂåÖϼéÓÏ̉“Æ©Çùê¾çÚùŸâÛ«‚ ½9¯È“Ơ¥bª»‚vºëöÓØÅØÙÚ›ÚÏÔ¿‰¦Èµ»ĐÓí—G·#ơĂû±óƠù×±¿¥Æ³Âíê±ëØ£Çá íºưËưÑÓĂĂ‘¾ÙÚ˜‡­Äƒv̀¼ÑÄëƠîí‡ë‡ơêù×ÙÚ³Âö«Ñƒß»û±½ù懺³Æ«‡“Íj“‹¹ÚÏÔ«Ô¹̃ĂÈçÚÛ«‚ ½9ƠÀÙÅëáƠͼËÉ9éºƯåÏÔáꇣäĂÙŒ¿÷Á»½«»«‡“Íj߈ÿ¯¶·Ô«‡“ÍjâêŒø 9¥‡½щé‡ù×ÙÓÓØ«‡“ÍjÎÔëöïƠöäÁ¯È¶Åå̉ óÄ ߈ƒv§ƠÚÀăÁ³ ëöׯß̉ÅÔ–Á߈†º̣¶߈¦Ô£Ô°»ăˆŸ÷Úăơ¹ÚÔăˆŸ·Ô-»(ƒvø×ơĂϺÁƯ×̉ÍÓÓ¾Û×çÚÑØÙ×›ÛÅàâÁăˆŸÏÔµØÿÚ›ƯçÚ±»ơ»©ÀƒvâÁ·#ĂÙŸÈ›¾ÁƯ‹Ü«»¾£äï¦í‡¥éø×щ®ô9¥‡×šȯ¼ăơµØ߈ơº¿›¾“È߈ơ»±»—»ƠºméÓ»ăˆŸƠÅÇÖ³ù¿©ÓëöÏ̉9¥‡ª‡’̀j·‡‘×8ç̃Á1éÓơű½ÏÅ“ƠË¿߈ä×öÍ­—¶­vëÚ±ëØÛׇÇăˆŸ;Úª‚ +¼9·¼Í7­ô…÷‡‘ÖÙÅëÏ¿ô‡ÑÓÛ«‚ ½9µØï½íÖơêĂÆ›¾‡ ‰¿I•ïËÉ9·Ö„öÂĂù×щÎÔÿ§ÏÔ›¾ÏÔÍË)éÛ9¥ŸĂǽÛÀÍ­H—¶רă‘·™ô¹Ú4©¼ùÜ…ôƒÚ߈¡ÈáỠÚÁ̉Úª‚ +¼9½ơ…Öß»û÷Ú½ù曾Ûד¼«‡“Íj±¿÷ơß»û­ÛƒØ“¼Û«‚ ½9ƠÁ߈§Ó́½àêÑæéºĂÙƒvÍĂÙ½®Gø“ÈùׇŒ̉Åéê·‡‘×8ç«%½éººơêÀƯØ× +±»«‡“ÍjÛ«‚ ½9ËƠå̉ “Ơá ơê¶½‹ÙĂÙÍË)éÛ9¥ŸƠ‡ß»û—ˆ³È«Ô±»Ÿ\™‰kß [ïS¸ÚÏÔëöá ¿èÁÜÙYÏÔ£Œ߈ɱ»Û«‚ ½9ÙÚ¼˜‰j̃ZîS«‡“Íj»ĂÙŒë*«ÏÔ¹Ú׿8ăˆŸƒÚÀ‡ÛĂƠ–ø©‡¥2ßëM±»±»²ëö¡ÈÏÔ©‡¥2ßëM±»ưÀăˆŸ;“Ø×«Û¹Úé§¹ÏÅĂÙùêºø×™‰kß [ïS¿‰Ë ¿»±»ÚÆÛ«‚ ½9Û«‚ ½9îD +Ç ¾º‡Ç³ôêÿ¯¶ĐÅ’ÛĂ«‡“Íj·Åà—¿ÅéêÚ×±»Æ̉‹ÇgăˆŸ;óÂÓ'‹Ç©ƠºméÓÑÓ¹ó߈ólj¿IưÀ»«‡“ÍjÑĂÙ½̉º’½Ù½áê™Ó‡Ç¶Ù½’Èø×̃ÄØïÚĂÙôÄ™‡¡ÁÛ×ơèű۫‚ ½9ß߈Áƒv·ÜÛ«‚ ½9—¶áÚ±»ưÁÚ×ÍÓ́%Û«‚ ½9°»Ù½¿ÙÚ‡xùꇌÍ}Á½˜×ÿ׿‰ơº¥ÈöëöÑÓôµØ9¥‡×ñÓ‰Û®GøïÅû(«‡“Íj§¹¾æºå̉ ‡å̉ ÇÖ‡éÓëö₫®¶ívÍÛ§ÖưÚÿÆ¡Á¯Û¼áö±¿‡ºßơċܸ×ơê•ÖÏăv˜‰j̃ZîSÙ™‰kß [ïS±¿±»âˆ:˜‰j̃ZîS‹ÜöÁ½ï½g߈ר„øƒv‡ºÏÔ¹¨“½°»™‡öơê­Ä—»¡Ư9¥‡Ơ«‡“Íj‹Ü߈ăˆŸ;¨Ù½·Ó ¥0ùוçÏÔÁƯ÷Áù׻ء\£äív§ØüÀĂÙùרº¡ÈưÚ°» ËÖ߈±ëØ₫ùêù×ыǵañÖ9¥‡߈ÏÔ麓¹ƯNÿ¯¶ơÔ›¾™‡ëöï½™‡§ÓªÔ©¼ÑÓ·‡‘×8ç߈ÓºÁ̉ó¶Í÷₫¹ÚÙ×™ôƒvñÓ£ÇĂ}ÛÄÓÏű¿¯È‚׫‡“Íjåơ›¾ÁƯ»ĂÏÔ³½÷ÁË¿›¶éͼÿ$­Ä±»ăˆŸ;½€µêö«‡“Íjù×±»ù¿±»¹ÚÙƠÏÅ›œ•Öù×ëÙÚ߈¢È÷Áÿ!÷ÁÛ«‚ ½9µ!µØ‡ñ5•ÛưÀûÀ÷Ú±»ƯÓ ×Ó¦Ô‡Ûëö¡Á߈ÇØ£ÓÁ(9¥‡×™‰kß [ïSå̉ ßưº÷Á÷ÁëöÏÔơêùêŽÇ̉ăˆŸ;ëö±»¾»çºÿ¯¶‡ÛÑØÅØ8¤‡̃ˆñÚ¥ˆ]1‡ÚñÚ™‡á=ëöׯăˆŸ›¾»~₫Ç«ÔívÏÔ§ßÏÅÓºÖ¹ϺóÂ߈™Ù½¬€½ˆ¿Ó¡»ª»ù¿ơÔÑØư“¼ĂˆÏ̉ÔXéÓ¹Ú‡ºưgÖÆUºíØÛº¿‰ùסȼº¡Èå̉ ™ÔăˆŸ;ÏÔÄÓÍĂƠ'¡Ư %‡ŒÎÔĂÙơ‡ë™‰kß [ïSĐĂùëéÓûơÅåÁù!ÏÔ9¥‡ù×Å–±Á“¹ƯNăˆŸ;ă‘·™‰kß [ïSµ†Á¹ûáêëöÏ̉² Óƒ½™ëéå×ö‡xïÁ°»™ëéåщ̣¶ —ˆëÔ«&ÁƯÏÄăà«·3uU˜‰j̃ZîS÷‡ƒv¡Ôï³2ªÜïû™‹î²2ôº %ßÁóÇâḈơê•Öö¯Ô¹ÚƠá=ƒÖăÇíÏÔ¥Û±»¥Æ…»›;ăˆŸ;¨Ç©,±»ưÀ½Ă«‡“Íjͼ£äù×ÇØåĂËźŽûÊÛ«‚ ½9»Å£ËƒÖĂ›ơˆĂÙƯÎ߈߈ƠX߈ŧ؟ĂÙŒë*«Ă­R•×Û«‚ ½9£ä½©ÜỞù×½ôñ«“ÁÚÀ¹Á·̃Ù½™‡ăˆŸ;˜‰j̃ZîSăˆŸ;ăÇíçÚçÚÙÚÏÔ­Ä¥ơ›ÊÎÁ—¶ơÔÛ«‚ ½9ĂÛđÆ%í‡Ú×ÅØ±»ÅØĂÙĂ×ÛÅ–Óˆ•=‘‡Ç•öË¿áÁµØÛ«‚ ½9‡x°»¡Û8¤‡×‡Û«‡“Íj麰½9¥‡ƯÓ §éº€ƠëöÁ¹ÙƠ…»ĐÉÛûÓÙ‡Ï9…Ï̉ºÓÛ×÷øÇ»™ÔĂÙÙ×ñÄÁ¼ÙĂÓº+ñÖ߈Ç֥±»±»è¼Ù½ưÀÏÔÿ¯¶ÎÅÏ؉j̃ZîS¹ÚöƠňéÚ‡̉ÜßÁÛ«‚ ½9߈±»Ù½߈—¶À¹‹Çרù×đ§ô™‰kß [ïSĂĂ ›­±àéM´Ø½Ù×ôêÛ«‚ ½9ø×9¥‡×«‡“Íj9¥‡¯¾ŽƯÚÙ½°»ñÆơèÅëö£Ç̃ˆ²Èö±»«Ô«‡“ÍjÜÏÔƒv“ÈăÄưÆ©¼½Ïű»½₫÷‡µÀ¥Ó†Œ¥ˆ]1ÏÅÛ«‚ ½9ÏÔÍË)éÛ9¥±đ±¿‹ÇưÜ¡Á©¼å̉ ăàêöÍÄ…Îù×߈ß»ûÅØÀĂ«‡“ÍjÆØ¥Öù×ù×ÏѾ‘ÏÔ¿‰ăˆŸ;kƒÖµaª} ‚½Û«‚ ½9Ư‰©µʾƒvëöÛ«‚ ½9¡ÛÛ«‚ ½9óÔôÚꤒ½Ô½÷å5Ó¶‡Ö8æÅ؉¿IÿÚ±¿ÀĂ¡ÇËÇÏ̉ÑÓ©À“Ơ߈—Ó‹ÇºăˆŸç³ ëö¥ˆ]1˜êèä¡Ơ…ÔÏÄ߈µØ«‡“Íj½ÔéJé‰Ó5“gesÁÅïƠƠ“°”£ØíÖ§ÔÛ«‚ ½9ñB÷¼ĂȽÀ̉½ăˆŸ¿‰¿¹™‰kß [ïS¥ˆ]1₫¿Ô¶èƒ½߈¹Úù×߈ưÀ‹ÜñÚ­Ä©¼ª¶2tTíÂŸĂ¶÷¶ưÀù׵إÄÀ½Éăơ߈Û«‚ ½9ËỞºêöƠÍË)éÛ9¥̃ˆ߈ͼƒºÁ“Ơ¥ˆ]1³ÈÛ«‚ ½9¡ÔĂ«‡“Íj£ä«‡“Íj‹ó廑®ûÓă‘·±»û9¥‡ϼ™‰kß [ïS×ÜĂ¼™Ó÷¼©Óù×ÍË)éÛ9¥ï»ëÚƒv™‰kß [ïS§ôƒÔëöÏÔÓÿÛ«ÔëÍÓåçÚ±»ƠºϼívÏP¸Ú†Ç£Ø·ÔÔų•Œ•ŒßÄÙŸ}¥ˆ]1¹!÷‡ŸÅ«‡“Íj߈˜$à±»ÍÓÜøê·‡‘×8çù×ö¶ÁĂÛ«‚ ½9ÍÄùơ߈ÏÔ·‡‘×8çùׇ䇓ÏÔâà.™‰kß [ïS¸Ú¶‹Ü»̉—¶¬Ö»ĂÏ̉g¿‰½ÛÄÓĂƠù×™‰kß [ïSµa±»öÁÆ…»Íô›¡™"ŽÛ«‚ ½9ívÏŪڨ¼™‰kß [ïSÛǼ±‡ơèÅ¿Ø×ăħÔÏ̉¼€Ơăº¹à³÷潇ú(ăˆŸ;kÏÅñΛÎă½“¼æºÓºóÅÔ¡½Á¹—Ó½«‡“Íj½€Ç"ĂÙĂÙÛ«‚ ½9§ô»ôû٧ƧôôêÙÚß„½È“ƠƒvµÏÇÖăˆŸ;ß»ûív¿‰ƒÖ½ô߈½§ô¹Ú›ç÷ÚÎÅé‡ÙÓÙÚ™‰kß [ïSèê ߈щ¥ÛëÑ©Øöˆ±»â +Â3 ơY‹Üÿ¯¶¶ºưÀăˆŸ;k¿Åƒˆ¾‡Œ«‡“ÍjÇÛ̃»ú«b“ƠçÚƒÏÔÂ9¥‡™‰kß [ïSö·Ô߈Ú×ëÓ¹ö¥‰ÍL…Ươ©‡¥2ßëM‡ÅƒvíÚ÷ÁÅôÛ×çÚ›¾߈ëÚ—Ø›¾Â ¬°àèMăˆŸ¿*ÂÙ¾ôĂÙå¿̉ر»Û«‚ ½9ÅÓ‚µ¯¼…×±»«Û×¾߈Ù½ăˆŸ;ăˆŸ;kù×ÙÚ½€¡È«‡“Íjß»ûăˆŸ;µa™‰kß [ïSÏŇÇùơÏÔvµØº‡x³ÆÛ«‚ ½9¯à“ÛÓ½÷‡ºăơÖ$°»ͼèêÇÖơêăơù׫‡“Íjöµ.¥Ù§ỒÇØŒê*ª™‰kß [ïS«·3uUï*ÿÇÛ×Ë̉‡ºÛ«‚ ½9ưÀ½ÍÄ¥‰ÍL…׿8«‡“ÍjǼÏÅăà±»öÁ¸̃¥ÖßÁ¿ÏÔ ¹ÁơÔƠÙ½§Ôß»ûºëÓ߈¾Ø‰¿I߈ÏÔÿ­³ËáÛÇ%±Á±»˜‰ j ̃    Z îS ÙÚ¿ô½‡xƒÖ÷‡߈× ëöÿÚÙ½ÏÔ³ÈÛ«‚ ½9·ÅÿÂå̉ ›¶é&˜‰j̃ZîS9¥‡ï»¶ÔÏĹÁ¿‰àêç̉ù×—Ó«»̃ˆơèÅù×¾“ +™‰kß [ïS÷‡¡»ăàÏ̉ëÚ£Øü©ÇźßÖá ÁưÀ̀Ê)èÛ8¤Ï̉‹ÇĂÙù×Ư~÷Ú߈߈ÓÅÓºÁ̉ôƒØ£XÏ^̣Ă'±»«‡“ÍjÅÔ™߈̀ÄÁ½‚vƯÚ¹ÚƠÓÆ¹Ú±»ƯÚëö¥́ëö½ôñÓ«‡“Íj‡̃ù×™‰kß [ïS¶8¤‡ëö‚vÑÄëƒÖáÛ߈߈·ù׎ڪ‚ +¼9ºÁ£ÔâÁĂ¡ÛÍÓÏÔĂŒÚª‚ +¼98¤‡×£äñÓ‰¿Iùׇºƒ“‡Úºù×á ™‡›v™‰kß [ïS9¥‡ô¥̃ø¾ơÔăăˆŸ™‰kß [ïSÿÂ×Ă·Ôüê÷4Û«‚ ½9ËÉ9Ă¹ÚÖƠÏPŸ\gƯ±»ÓØÙ½±½ËÇÍƠï½ï½ÂÙî¶•Œ×Ơ†7§jäơ&sơꙉkß [ïSƒvù׫߿º™‰kß [ïSÛ«‚ ½9öÁ¹¾ù×ëöÙÚ˹å̉ ó×ƯÓ ”Ö àƠ°»ÓØĂÙÚª‚ +¼9Ư}™‡ỔÛ«‚ ½9ß(•ÇñÓŬĺ»ÁăˆŸ˜‡ƒv¾ß Ù̉à ±ÈĂÙ¹Úơê›Ú«ÚÏÔÓ̃¿ß·ÅóĂù×ù×™‰kß [ïSñÆÆØ©à›¶éø×¼·Ü¥ÂúƠÛº™‘»½ÍË)éÛ9¥߈©Ơ¯Û«‚ ½9­Ö߈ÓÆYÿ¯¶‡Œ˜Á÷³§Ó×Ă¬Ö³×ƯÓ ÏÔÏÅù×ĐÓ—Ó±»µØùơö߈ËÇĂ÷ă÷Áù×ă$¯/ÛïÚÁĂŸ‹ËÉ9ăˆŸÍĂÙ½·‡‘×8çÍå…»°»ßÁ¾º™ơ¡·ÏÔÁÛƒÔăˆŸ;Ó¼ăˆŸ;kµaÏÔĂÎóö‹ÜÏÅÁƯơê₫¼ƠX麙‰kß [ïS™‰kß [ïS¹ÚÛ`ù×éºÈĂª»Ï•DZ»߈çÚùêÏÔå̉ ¿½™™Ô¡ÛĂĂ ›­±àéMªºƠXåĂ÷ˆ™‰kß [ïSăè߈âÁëöÙŒë*«ÉÜ·̣°»Û×ëöÎÔ«Ä߈¾Û«‚ ½9¿‰™Ốv›¹̉¼ ưˆå̉ ™Û˜‰j̃ZîS¡Áíê›Á¹ăàăˆŸ;ŸàÍï³2ÇÖ¯Ô½½€ÏÔ·ÅÎŇ™‰kß [ïS±»±»Ù½ƒv·‡‘×8ç̉º +ƒÖëöăˆŸ9¥‡Ở­ºßÚÑØÑÅưÀ£äÁ̉½«‡“Íjù×ĂÙëöëöúØ“Æ̀Ê)èÛ8¤ùêƠÅ£¿Åù¿ºÅÓƠړȾÏÄñÓĂÙÍË)éÛ9¥Ơ±»Á÷Ù‚Ư%ù×û(ßÚù׋ljí󴾃¾‘«‡“ÍjÛ«‚ ½9ªÚÄÓóÇ뼫ÔÛ«‚ ½9ÏÔ£ƯÛ×ÜơÄăˆŸù×׫‡“Íj¼Ăô¹ÖÅ‘•î́ÆÙÚƒv³º»½êơ‰çĂÈơÔÿ¯¶ÙÚ±»–Á¡™‡×¾Ç̉ăˆŸ;ÑÓûĐ­Äñ¨º8 ¤‡ Ö +¢Ç›¾߈ƒˆ߈—ÛÀ*ÁăÁ̉£ÈåĂ߈¹Çé‰ñ5ñ·ù×₫Ơ·ÅÏÔÁƯ«‹Á½™‰kß [ïS‰¿I›¾½éº×Ü›¶é¬¾±»±»Û«‚ ½9Û«‚ ½9™‰kß [ïS̉Ʊ»×Ơ‰Ơƒvº½ùê8¤‡ăˆŸ;û™‰kß [ïS±»›¶é§ôơº¾ §ổº™‡Û×ă»9¥‡̃„ +ÅØ˜‰j̃ZîSíó߈÷Úù+ñÚưˆµØƒvÛ«‚ ½9§ÓăˆŸ;È߈µÈĂÙƒ½“¹ƯNƒˆÿÚºy°»›¾±»²Èù×Á‡é/×:¡»¼âơ߈³ÈÁƯç̉9¥‡º߈ơÔ‚çôÙ-ƒvø¿ÅÓƯÚư­‘Èׯû:Û«‚ ½9·ØÜ¡ơÔÙY¯±đ±»ß»û§Ô‘Óùê9¥‡Û×ëöẨàƠ´ĂăơƯºÏÔǺûáÚ¾ÁĂ™(‡ŒĂÅØÛ«‚ ½9Á¹…Öéêƒv·Ôù×Ï̉©Óéê¡ÔÏÔ«‡“ÍjƯ‰›¾ÀĂíÓŸ\߈ëöù×ô™–ëö÷Á›¾ÅÿÚåĂ¥ÓÙ½Ù×ơÄŸ}Ơ9¥‡ÓÓ¹Á©ØÁĂëöǺỬóÇđ¾ +ëö¥ÆÚµaÏ̉Û×ívƒv†ŒÛ«‚ ½9âÁùơÔèôѶ™‰kß [ïS®×•Û×½Ă“ÈͽƒÏÔ—¶™Ôăơù×Ë¢X†Ưöψó±“ÆĂ»q™‰kß [ïS߈»Ø«‡“ÍjÓ¼ŸÅÏÿ¯¶“g­ÄÓµÍÓ—¶ưÀÁ‰»¯¼̣½ô÷‡¯È©ØµØÙ×™‰kß [ïS©Óơꃾ‘éÚ·‹È°»ĂÙ¹ÚÛǷȘ‰ +j +̃ + + + +Z +îS +ÏŬ֨º +רĂÙÏľ¹ź‡ŒÛÄÓơêźưÀ¢Ơ3ñÓ›¶é÷Ú˜êèäÁ½½€Û«‚ ½9Üơ\ưÀ¹§Ô߈ĂÙ¶¿ôơê›ÚơèÅÿ¯¶Û«‚ ½9Û«‚ ½9±»³Ú¶̣Ă·ÔöơéêÛÀ¿Å½¥Æ«‡“Íjô¼̉ +ăˆŸ;kѾ½ôëö™º»Ù½µØ™‰kß [ïSÄÓÇÜ̉º¼€å̉ ‰¿I«â€¾§‡ÑÓûÓ9¥‡ÑÄëßÖơÔ÷å5Ó±»÷Á™‡ÙÚÛ«‚ ½9·‡‘×8çù××ӡȆŒù×çÚ¡Á‡é/×:«»°¿½Ơ߈·‡‘×8çÏ̉™ĂŸƠ÷¼íÖ›¹ÔñÓϼ³z™Óƒv™‰kß [ïSù×±»÷»›ÚÛ×Û«‚ ½9›½Û«‚ ½9©¼‘ÚÏÔ߈Åàùë½ô©‡¥2ßëM‡ºăơ¾¿‰±»­ØăˆŸ;ưÀ˜êèä§¹ăˆŸ;ƒv‚×±»ÑÁù×ÏÔ½‹ÇÓ̉—¶Ï̉ºÈÙ½ù¾9¥‡á¤ăˆŸÙR߈­½¼™‰kß [ïSÔưÀåƠ׿8ûƠØ×öÁÿ×ÁƯ½ÖÆï³2ÏÔé߈ÍÇÁ̉ׯ¶èơÄ™‰kß [ïS·Ó ¥0Ù½çÚù×Ơ¹ÁâÓØưÀó·ÔÇÖÿÛÚª‚ +¼9ÏÔù×߈“ȼô“¹ƯNÏÅÛ«‚ ½9«ºÏÅÏÔ¿èî +²2 +›¾°»Úª‚ +¼9°¿í‡›Û½€Ù½ëö‹Ü£ä£»ËÉ9—§Í»ÖÔ†6¦jµaöø×±»ëöÍË)éÛ9¥ÏÅÏÔăˆŸ;k凧ÓÛ«‚ ½9™ëéåâˆ:ùב־±ƯÁĂÙµ†ÿ$ăˆŸ•ŒÑ™‡ËÉ9ưÀÉÜëö9¥‡‡Ÿ\溻رđ˹ëöǺ›¾º·‡‘×8çỞÔÍÇ©‡¥2ßëMÛ«‚ ½9߈ưÀщù×߈¼ô±»¢ ù×™‰kß [ïS¥Û‡Ñ`«‡“ÍjăˆŸ;ë‰ÛÏÔ©ÇÏÅ߈óÇ™ëéåçô”߈½ô°Áä̉ăˆŸÿ§Û׳àƠX«»Óº½Ñؓǘ‰j̃ZîS½ư“¥‰ÍL…¡Ơ½€·‡‘×8çÁĂ¿Å‡Ç¡Áº¥ÆóLJŒ/ÿÛ¿µØ‡Ú«‡“ÍjÓÆăˆŸƒv߈½Û×çÚ§Ô¾›¶é“ƠăˆŸ;£Ø‹Ç₫›¹₫& +›¶éÑÓ‡x§ô8¤‡×åĂ«º–ŒưØÉ̉ƒ½Û«‚ ½9ÅÄÁƯóÇͼÄÁ—ñ«ÔăˆŸ;ù×ô½¡Ô³̀±»íÁ˜êè䓽ĂÙ³©Ó™ÓÁ‡é/×:ÏÔƯơ÷‡ĐÅ™‡ªÚ“Æ·‡‘×8竇“Íjª ¨ƒº5ơÔç̉ÏÔ‹ëùÚÏǺvÓÆ©‡¥2ßëMÓµO½°»íJÅÛºĂ¯à‡ŒÏĽƠ“ÇỞµÏרƒvË%ƒ×÷‡ÍÄƯºù×±¿½±ºÛ×ÎŰ»ĂÙ“Æר»ØăˆŸ;kè%±¿¾ÏÅđÄƯÚÏÅơêÅỖˆ×ܱ½Û«‚ ½9‡9ƒv߈ñÆ›¾«‡“Íj˹߈¹½ôéơ꫼»…ÑæÚÄ̉çÔ¡ƒçôÿ§8¤‡³ÔÛ׫‡“Íj߈ëöăÚ½ù¿¡Ư¦ÔÏÔÙYßÄÙĂñÖ½‹Èö߈Ü©ÙÓ‚»™ëé噉kß [ïSëöÙ×±»ù×™‰kß [ïSơ»¬Ä©Ó¡Û‡ÇĽƯÓ ½Ù½ƒvùêÑĂŸßà ưÀéÓívÑÓơÔÍÈÅÔÿ¯¶«Ô¼Å‚‡xŸ}×ÜÇĂưÀéÚ¯G‹øăˆŸ;ƒˆƒv™‰kß [ïSé‰ñ5ñ·»~÷‡«‡“ÍjÍĂËÓ߈›̃ƒvÑÓ½Ôƒv¥ ƠXµØǼƒv±»߈±ëØ«‡“ÍjỂÚª‚ +¼9ƒvª¼ °»›Ú ¬°àèM麋ăƹھ»Ø½ñ€™‰kß [ïS›¾…öÛ«‚ ½9ûû÷Ù©Çå̉ ¡Ô±»óÔĂÙ·̣ơêÆÓ‹ÇÉåÛׇàăԼȡÛÇÖŽ“ƠÁĂÓ̉߈ËLJƒå̉ ívÛÀ±»ù×±»ï«‹Ç×¾ÂÏå‹ÛÛ×ÅÔËÓ÷¼ÑÄëăˆŸ;ŒÎ°»©ÓÁĂ‹ÇÓØŸÅËÉ9½߈Ӻ۵ؙ‰kß [ïSŸÅ¡Èƒ¾‘“ÛψÙÚÑÓ‹ÓÛ«‚ ½9Y—»ÁĂƠ‚©Ó÷Ú»‡¥ˆ]1‹ÇË1£»Ù×ÏÄñíȇǙ‰kß [ïS™‰kß [ïSÛ×÷Ùöôëö­¾ù׃ˆ±»èêĂ¾ß¡ÇÇÖÿ¯¶ÏÔ߈Žív·ÔÙŒë*«ùêơê¿ôÎÅÇÖßÄٵإq÷‡³ÂăˆŸ;«‡“ÍjÙ½ëö•‹HÑÓ«‡“Íj•ÛívñàÏÅÿ©‡¥2ßëMÏ̉©ÀÛ«‚ ½9‡—¶ù×±»Á̉߈±»Óæ÷Ú­ˆù×óưÀÙŒë*«©Ç—˜߈ÏÔ½±»‡º¥âù¿éº«‡“Íj—¶¹Ú§Ô«»«‡“ÍjµØ߈‹ÇÏ̉½±»ù¿½ïËÏÔÛÚ¡ÛŸƠ§1¡Û½ôëöçôÅÔßÁùêëöÍ*µØÏÔ«d˜êèäçÚâÛ»Øøơơêµ·Ô߈‡Œƒ¹Ú½€»Ø9¥‡gƒˆé¾…©¼çô«‡“Íj÷‡ÿ¯¶ö8¤‡Ơ«·3uU—¶ƒv™‰kß [ïSç½ßÚâơ®Gøéß°»÷Ú¢äŸ\îƠÿ•Ó:ƒv÷Ô•½‡Û«‚ ½9ù×Û«‚ ½9«‡“Íjù׋ÓôơêÙ½µƯ‡̃釫‡“ÍjơÄñƺøë½ĂơÔÛ«‚ ½9¿‰¸àưÀỔÙ½©Ü§§ôﻼ‘…àù×ß»ûƒvÙ½³È™‰kß [ïS¡Û›¶éå̉ ƒ×ÏÅ¡ÈưÀºׯø>ơÔĂÙ»ØÏÔ«‡“ÍjưÀ™‡“܃vÅÔ—¶©‡¥2ßëMÎÔ½9¥‡áƠ½ôÂƠµØ™ÔŸ\ăˆŸ÷Á°¿1ÿ¼ÏÔÖÆƒv»ÏÔ™Ô±ËăˆŸ;¯È¿¹ûƠ₫$‚vN›ƠÑӋ܋۹·ÅÏÄÇ}£»ÏÔ±»ÙŒë*«ÏÔ¹àÅÓƒ½€¾¾µØÏÔ©Ø™‰kß [ïSăˆŸ;ç÷ăˆŸ;kß„™‰kß [ïS߈Û«‚ ½9­Øƒvơê¡Èٽκy çÚƯơ Á¾¦ôÛ×çÚƯ‰Ç̉ÉÿÏÔÙÚÔ¾F¿ộĂµÜ³ÈƒÔỞ«‡“ÍjƠ¥Ø‡Œ½ù×­Ä”Èúׯï»ËÉ9ăˆŸ;ÅØ“º±»°½€ºÜÓ áê·ÅÓ¼øê¶ÔéÓÅØß¹à«»ÿ‡ùשØÏŵêÁ̉Û«‚ ½9—Œë!Ï̉߈±»íêëÓ½ƒvĂÙ…öŸÄ‹ÜňƯÚ§ÓÛ×ơØ߈ÄôÙÚ™‰kß [ïS·Å±»«‡“ÍjưÀ̀vÏÔ«‡“Íj¿»“ÆÙŒë*«—¶Ă¼Û«‚ ½9ר¬ÖÙÜɇï³ỬöÚùê߈߈¡/«‡“ÍjºØß»û³µØ·È•ŒåƵØÏ̉ÏÅ£äÉí«Ô«Ô‹ÜÖ°»«ÔÁƯ«%ÏÔƯÓ ÷ÚÓă¡ÛƠăÇí„ÖCŽ̃»,ú,³àÁÜÁĂÍÄœĂ›¾ÏԷԥƑ÷ÛơꛉöÇ̉Ûºăê‹Ç±»»Ă©‡¥2ßëMăÁÅÙ½߈›çºíÖ¯öÅØƯÓ µØù×…Â…öỞ˜‡Á¿»ù×óÇÁ̉ö߈Û«‚ ½9·Ô—¾óÓ¥Ûâˆ;Ú¼Á«Ôơê—Óëöó¶Ë%˜ ê è ä ßÄÙơꃈëÚ½¢ä¡È½€˱™‰kß [ïSßÄÙƠX°»¡Û‘₫ƠX÷Á̃„ψßÅ9¥‡âơÏÄÍƠöÁÎĹ؜·̉ ¤0™‰kß [ïSÙ½ưÀg¹£º½µØ¡Ôëöçô‹Çù×±»ÿ¯¶ưÀ…Ö釛¾¹ÚóÇÑ·³È·‡‘×8ç߈·‡‘×8çµaÏÔĂȽ€¡Á±»½«»íØưÀăàÑÄëƒÔ߈ÏÔăˆŸ;éºßơăˆŸ;·Øơêăàå̉ íṽˆ“¼ƒàÍÄ™‰kß [ïSăà́ơ +—ˆ¸ÚÅÂÿ¯¶‹Ü±»«‡“ÍjÚÀµØưÚÙ½ÛÄÓÙÅëÑØ¶Ú¿½ßÄÙçôÙÚưÀ¾ßΈ½«‡“Íj©Ó¼º©™‰kß [ïSÍË)éÛ9¥©Çщ½Ö‹Çơ»±»ËÉ9§Ó°»•¾™ô’ +½Ă¢Xû³ºóï½ÁƯÏŇÇñÓøêÓ‡³߈¥Üơê­ÖÏÅÇØáêÅô¸ÚÑØµa½ĂÈĂÈùêµØưÀ­v“Æ»Ø×¼Ăº‹Ó‰Û˜‰j̃ZîSö—¶ÿÂ…ØăˆŸ;ÁÜơÔ¿ºμùê“È©¼çđï½çôá ³à™‰kß [ïSáê÷Úؾ¡Ơ©…Ǻ¥êÏÅÙ½ÎÔ<9¥‡ø«»½‚Ö±µÙ½ù׿ô½̀Ê)èÛ8¤̣«‡“Íj·Åƒv…ÖÓ½«‡“Íj³È˜ôËÇÿÚ—¶Ù½«‡“ÍjÛ«‚ ½9€ÄÏÔ’¹ÜN¥ˆ]1¯ïƯÂÏÔêö—¾»ˆ½«‡“ÍjÙÅ뙉kß [ïSëö±Ô¨È!÷Áëö‘Æ™‰kß [ïSÛ«‚ ½9ォ»щƒvụ̂™‰kß [ïS·‡‘×8çëö±ëØ“¹ƯNËÉ9߈éºùëăˆŸ;±»¯G‹ø™‰kß [ïS­ÄĂǼæ§¹ׯ«·3uUÉ̉¯¼­ÔÑÅï½ưÀéº̃ŒÚ,ƒvÛ«‚ ½9Ë̉ÓÆ™ơ™‰kß [ïSª¶2tTÿ¼Ú&“ºáM…¾°»߈«‡“Íj™‰kß [ïS溗¶™ëéåÀĂ»ïƒÛ«‚ ½9Ù#ưÀ•Èû›ëöË̉“ƠÁ¼«‡“Íj߈ÏǺv™‰kß [ïSĂÙëöĂÙ Ëû Ûùë¢äé‰ñ5ñ·ăˆŸ;±»­Ä¬ÄăˆŸ;ăˆŸ‡û¼«‡“ÍjÙ½Û×ÛÀ—¶¨º߈ôê‡ÍµØ‹ÇƠïÚvå̉ ˜êèä¡»·‡‘×8ç¹óù×ơºï³2¹ÚơĂ§Ôƒvàö¿Œ© ŸƠ™‰kß [ïSƯÚăˆŸ;k§Ô߈ÿ×߈ëƠUÍĂ›¾çơ߈ëöå̉ ×÷ÁÏÔ™Á™‰kß [ïS½Îæ°đ÷ÚœÜ ¥ÖϺ­€½Ăëö£Ç¥ˆ]1ù$‡ÛÛ×™ô÷ÁăÁăˆŸ;kÏÔƒv°»½í ߈å̉ Ñóù×½€߈§Óív÷‡ĐÄêËÉ9°»†ºÁ¹ÊÖg÷øá£ª»ÉÀ¹ÚµØ­»Øá“ŸÏÄ·‡‘×8çíê¦ô₫®¶ưÀËÉ9©ØÑ×ù뙇‚¾̃ˆYËÇ«ÚÏÄǼåÁ·Åù×óQƯÓ ™ëéåù×ñÚĂÖëö§Ó9¥‡ÏÔ«‡“Íjêö½ÏÔ}Ù×Ơë‡ó^öÁËÏÔ“Ơơº—¶ăÇíÙÚÅ¥ˆ]1ỞÿÛơÔôëÔ³ÂáƯ¡Èû€»¨˜êèä±»óÇÙŒë*«Ûº«Ô™‰kß [ïSѸ·ÔÅÛ«‚ ½9¾½ÔÁƯ”½ĂÙ±»å¼ ™ëéå«·3uUù×™‰kß [ïS±»ç¡Ûùê‡Çƒ,ëöÇ»ù×±»߈±»߈¹ÚÁ¹ƒvï³2ûăˆŸ®¾ù×§ÔßÚ›¡ø×"µØÁÓ߈ó߈çÚÛˆÙ̉—Ó—«Ô߈ß»û±»‰¿I½€«Ú…»âˆ:ù×±¿ׯ%«‡“ÍjÛÀ“Æù×±»¥ˆ]1Ù½à=¥r‘«ÛÄÓûØ”«ÑÑÄ뫇“Íjëö̀Ê)èÛ8¤°Ô™‰kß [ïSæÚù×´ĂÔëÔ׿8™Áȹëö¼ÖÔ†6¦jÛ«‚ ½9ï³2§ÓÇ +Ǻơ꿉Ơ½›¾°Ô Û±»‹ÇÏÔăˆŸ;™ÔÛ«‚ ½9ƒvÏÔ‘áÛ«‚ ½9†ŒÁƯ¾çÚ±¿щÍƠ“ÇÛ«‚ ½9߈Ÿ1‰ØÑÓ­Ô½¢Øß»ûÏÅÍÓ²ƠÛ×†× ×¾ăˆŸÛ«‚ ½9¹Úƒ½¡‹÷Áø¿±¿ưÀǺëÔׯ‡,¥ˆ]1 Ëû“Æ¡ÔËƠ™‰kß [ïS­éºëÓ‚v½ÛÀ·ÔưÜÛºơêµØ¿­vëÚëö9¥‡×Ù½Ï̉“ȿŻٽÉÙ÷ˆ¡»«Ô£ØÙ½±»êöÙ½­½¼ÛÜ¿ºÙ×·‡‘×8çăˆŸ«‡“Íjº³ù×±»í̃—»«»ĂĂ ›­±àéMǺ»Ø›v¹Ú߈Ù×énƠX›ºø×vùêĂºª»ºÏÔ©«‡“Íj›¾Ó¾Ù̉éơù×íÆ₫$™‰kß [ïS°»ơ꣇ơ黨Ăè±»÷ÁÑĂX«‡“ÍjÏÔ¥ˆ]1ùêíUÛ«‚ ½9‡“±»«»ûµØ߈ÑÄëÑÄë¡Ô©ØöÑẰÇ ÇÖĂ֥ƃ×ϹÿÛÑÄëÓØ™‰kß [ïS¢ä +ĂÙơèÅăơ­ØÎÅ©¼«‡“Íj߈½Ôă½ϼÙ½ÓØ•Èû›¹Ú“Æñ»Ç‡¡ÁÙ½ËÓñÖ´́ơö߈‰Ô¹ÚƠ¼ÅØá ơꀺ۫‚ ½9ÏÔÛ«‚ ½9°»ñÖ߈ÏÔ¿Å÷ˆăˆŸ;ưˆÓƽëßÅív߈›¾ÏÔÿÚ™‡ËÉ9ÿ×ơÔ·Ô…¿ëöٽ˿‡ÛñÚăˆŸ‘ơ¡ÔÁÔ±»§ÔÑÓ÷ÙÇ"‡ºÛºö©¼ăàăˆŸ;ßÁăˆŸ;ËÉ9¿‰ÎÅù×±ëØëÚ½€ƒˆ‹Ç¢ÔÙש¼±»¨º ƒvׯÇÖ™‰kß [ïS¯ÔÉ€Û׃Ú9¥‡Ổ·Ó ¥0™‡ÛÀí×ͼÛ×Á½­‹ÑÓỞø‰›¶é”ăˆŸ;ûÓÙ×ÅØĂ¼ÏÔơơĂºÙÚÏÔ«·3uUÛ«‚ ½9íǻ۫‚ ½9§ÓÉ̉ØYÅĂÏŽ±»‡º̀ÓĂƠ¡Á÷Ú±¿±»©‡¥2ßëMÅă½ăËûƠñڵر»ă»†ŒÜÀÍô9¥‡±»߈9¥‡̣ÂÅ»ëö¹ÚÏÅ›Á§Æ©‡¥2ßëMG½¹÷ˆẩÙ½·Åưº¶߈°» ñ»ùׇÛÇÖ¹»£Ç‡Ăàă»߈ư“Û«‚ ½9ƒˆ³¾Ư‰ù×Ù½«‡“Íj¿ ½ÏÅÁ½ß»û‡ŒƒvµÙùôÏÔ‚vº̃ˆXåĂ“›ÚµØ¹Ú¸£ ÷Á…ÖáêÛ׵؃™‰kß [ïS¡Ááêí‡ívÿÚŸ±§ôÏÔßÁÅøëöÙگȫôÍË)éÛ9¥Û«‚ ½9·ïù׃v9¥‡÷Á½¹Úº›ÚöÁùׇƯ•ÂÅØ»ï‰¿º¹ó‹ÓÙÓơèÅ‹ù˜‹µaúƠ±ô‡Ûưˆª‡’̀jóǾ߱»߈›¾á̉ĂĂ ›­±àéM«‡“Íj¼½Á½ïëö™ëéåơèÅưÀÅëöÏÔ•ưÀÙÚ§ôăêø×ÿ¯¶—¶«ÔÅØ§½éÚŸ}©Ø·ÔμñÚ«Ôö‡,½ÏÔ…ôÅØç´ÄØ9¥‡ĂàÙ½Î̉¹ÚÑ*ÉVß%×Ơ«‡“ÍjÙ½™‰kß [ïSàÛ«‚ ½9öÅØ¿ôÇÖÏÅÙ-´†·Ó ¥0ĂÙäÁÛ«‚ ½9߈ºßÁ¡»«»çÚ•Œ™‰kß [ïSª¶2tTóÇ Ù‡©à¿ß麰»èÓ÷ÁÙ½ÅÔív߈ÿ§ôê߈½×ÓÙÚ“ÈŸ}æ'߈óÇù×Û«‚ ½9å̉ ÷ÁăˆŸ;ƯÓ éº´Å'±»ß»û™‰kß [ïSÛ«‚ ½9©Ø¡ÁÏÔÛÀÙÚ±ÔÀ½Ơ¦¢Ø“ÈÙŒë*«ù‡ĂÙ½ÜÓ ÍƠ–¶éºµØçÚ¿ÏÅéÓ¡ƠơÔă»ưÀù×ÁƯëö«‡“Íj«ÔƠ…nƒv߈‹ÇƠX¹Öù¿µØ“¹ƯN©ÓÛ«‚ ½9¦Ô“ÇÛ«‚ ½9Û×ÏųÈÛ«‚ ½9µØ“ƠÙÚ²½ ‚v©È‰Á߈ăˆŸ;k麕ܯ©ˆ°»¥ØáÁüس ÿÚªÚ½ăà½ÈÁƯÙÚđÁ¥°˜‰j̃ZîSøê«‡“Íj·º¡È†Œó½ñ˴燑×8ç»ÛË1¹ƠÛ«‚ ½9ÁĂƯº»øêµØơ߈ùê½ø×±»«‡“Íjù×Ă«‡“Íj­Ä¿‰Ù½åÖ¥ˆ]1²ÆơèÅÅØưÀÑØ÷Ú߈±»·‡‘×8ç™Ô™‰kß [ïS™‰kß [ïSÁ¬ÖƒvñڳºyºÛ«‚ ½9“ÆơèÅ·ôÅ嫇“ÍjµaÙש&÷ÙôÅÍÔơèŷ؇µØíÖÎÓœ‰¾I/¡Ó™‰kß [ïSÛÀ±»«Ô«¼…ÓÔăˆŸ;±»³ôûÙơễˆÏÔ«ÔƠăˆŸ;©‡¥2ßëMÍË)éÛ9¥Û«‚ ½9ăê½»ö—ÖÛºͼÁĂăˆŸµÈÍÓÙ½¿¯×÷ÔרÛ«‚ ½9ƒvÍË)éÛ9¥·‡‘×8çÿÚơê·‡‘×8ç¦Èù¾ÎÔơê¾ÏÔÁ̉¾Ú±»Ï̉™Ó¡Û߈ù×™ëéå±»à¬÷‡ñÁ™Ô£ä›vÀÚ—ØåăˆŸ©‡¥2ßëMÛ«‚ ½9ׯgŽívÏÅçÚØƠăˆŸ9¥‡»ØŸÈ—¶Û×™¸¹ÚÁ̃™ëéå³È·Å·‡‘×8çƒÚ½ÊñÆÿÚ9¥‡çÚ±»™‰kß [ïS÷»¨ÈË¿„ØöÁÛÖĂ›·Ôÿ§ºźªÚ™‰kß [ïSù×ƒĂ¿à«Ôù×ñ\ù×ß»ûÅ.ÑÓ9¥‡©Ø¿Ø·Æ²Ø¿(÷¼á=¿ÅÉ̉¹ÚŸẠ̊Áƒvß„çÚå̉ Ï̉¶ÅØY€8ÎÔ¡ÛăˆŸ;ăˆŸ;kù×ÏÔ¯ß₫ÚåÛºƒ½¿ƒvî +²2·‡‘×8烹ÚăÁ߈ÁÛËÓ±»½™‰kß [ïSרưÀµÈ£@œØÁĂưÀé‰ñ5ñ·çÚ©Ø©¹Ú¡ƒˆ»Å§ÆÙ̉àØù×߈ăˆŸ;‹Çµ‰Óƃvçđ̃ˆÏÔ–Á ÇĂù¼ưÀ™Ô©-¿‰ÿÚ±¿ƒµØÛ«‚ ½9̀ĂÿÂÉ̉í—Găơ§ÔưÀ¾ö½ ơèű»÷¶öƒÏÅ©Àá=«ÔÅÏÅÁ‹ÇßÚË̉óÇƯ´ÁÙÛê‹Ç©‡¥2ßëM…ôÆ»̣¶Áá¥Ûö‡€ëöö›¾ù׃vµ÷ù×ñÖñÚƒv¹à™‰kß [ïSƠXơÔÛשØï»íê¢Ç¡Ơ»‡8¤‡ˆÛÿ×±»ëöñÖÂ߈»ç߈ù׋ÅÓăÁ¯G‹øăˆŸ;Ûº‡x«‡“Íj½ÏÔăˆŸ;£Ç‰y¡ÁÇ»÷ÁĂÈÏæÓÔƼ±»ÅéÓÛ«‚ ½9÷ÚăˆŸ;߈«Ô³úÁƯ™‰kß [ïS«»ÆéêăˆŸ;ù×§ô­ÅêÚ»Øïi±»ƒvØ™ Ë¿ư%9¥‡¾›¡™}‡x‘›«»çZ˜‹Ž·Å¬ÈöÔ@ÅÓÙ×öÙ½Û«‚ ½9Å÷‡‡ŒÛ«‚ ½9¸Ú±»á¬ù¾‡ä߈ºà Ö*¥Æ‡ÛÁ瀹¼ƠX¡ÔƒØăˆŸ;µaưÚܺív›Ú«ÓÛ«‚ ½9±ëØÛ«‚ ½9ưÀáö™‰kß [ïS¾Óù×­ơƒv°¿ ߈ÏÔ½ÙÓÛ×¾ÑƯ±»‹Çơ$«ÔY÷Áƒˆá “ÈÙ½›Ăá «»ơ)ŸËÉ9ăàÜÂlÙ½ívÇ»“ƽ…ÔÏÅëö߈¡Èϼ¡Ô»ỪÇDÍÓ½ôÑÓívăˆŸ;k߈“ÆÏÔÛ«‚ ½9ù×ăˆŸ;ơêăˆŸ;߈ºy·‡‘×8爾÷ÚĐÄêÙŒë*«¾˜‰j̃ZîS‡·‡‘×8çÛ¢ÈăˆŸ;Ó½€™‰kß [ïS߈©-ÇÖÁî²2/§ạ̀Ă¡ÈĂÙÙÚƠÿ¯¶¿ô›¾§½ÙÚÁ‡é/×:ƒvç̉ÏÔ½º™ơÅÓăˆŸÄÔׯÅôù–½Ô÷‡ÿÂöƒvưÀưÀùùíêăˆŸ;ơê°»¹¼ÁĂ©¼ß¹Ϻׯ‡ÛÇÅƠ‹ø™‰kß [ïS߈߈Ă߈ÙŒë*«“Æ™‰kß [ïSÏÔ÷ÁǺ߈Ï̉·Ô÷$¡ÈÏÔ‡û(Û«‚ ½9߈ù¾RÅØ¾Û«‚ ½9ÚסԲ̣ª» ù×Ù̉Ë̉×¾çôÉôÄÎÔXí‡߈ùꉿIơê‹Ü®Ơ9¥‡·̣µa¢Çö™‰kß [ïSù×÷ÚăˆŸ;½¡ƠƒÛº̣Ûº•‹H÷$—¶äñ±¿ơÄíê₫¾9½™ëéå—¶ù××¾8€º›‡«ÚÊǩӺ³È“”Œ‘«ÎÅ’ÈÁÅôÅØ’È +Ÿ’ăí«Ô‘¹¹Ú«‡“Íj˜‚¯'Ûº™‰kß [ïSߌÛ,»Ạ́ÇëÓ×¾ÙÚÉÜŽµ¾Ø×ëӻت»ÛÑÄëŸÿÛëöÏ̉‰¿IƠ·Øχƒv½€×ƠÛ׿ô3°»÷Áàêùë³Ü9¥‡ăˆŸ;™ëé噉kß [ïSĂÙ߈½¾‡é‰ñ5ñ·°¿ǹĂô™‰kß [ïS¡¼½¾ư¯­‹ÇƠ›¶éÂĂß»ûö$±»ÑÓÙÜó›à÷Áׯ‡Û‹ÓÎÅ«»9¥‡Ëlj¿Iíơ«‡“ÍjéÚ¡Û‡º‰½›¾ͼưÀăêÛ«‚ ½9Û«‚ ½9ù×±¿·Ô±»½Ø‹&™‰kß [ïSƠºmă‘·ÏÅ«‡“ÍjªÚ™‰kß [ïSß„Á̉·ÔÑ·ÍÓÛ«‚ ½9ù‡ăˆŸ;™‰kß [ïSâÁ߈ăˆŸ;÷Ú×¾—¶Â™‰kß [ïS¡Ơ›vĂ¥ ÔùדÆù꛾±»÷Á匿NơèǺv•ŒÛ«‚ ½9Ïŵ’ăˆŸÙ½·̣·ÔçºÛ&°»“ƠíJñÓÁóжƯ ™‡ù×öÁ‡ŒÇØǼ¿‰ĂÙ׺²¹³ÇçÚ»2ơĂÍÄ«‡“Íj¹ÚÇÜơêÁĂ³mÙÚù×éêµØ½ƠÚ‘‰ơÔºẸ̀̉"‹Ü̉‡ëöϺù×›¶éÿ¯¶Ặ½¯ÂưÀƒv‡ØÅêñƱ»9¥‡щ‹Ç…Ô‡Œ¡Ô߈¢ *ƠưÀ˜‡×Ơ·¶Ư‰-½€‡Úëöù×ÁÔ—¶™‰kß [ïS‰yơê©Ó½ăˆŸ»–ëö߈ƒˆ¡ÔµaÛ×́½ÓÁ¹ÚƯ‰Ë̉êơ߈éï³2ÿN­Û¸ÁáêÅÓÙÚÑØׯËÉ9˜ÓÅÙ·¼Í7£ÇÚÀ߈ Á¥ˆ]1ÏÔçÚù×ø×­Äºɹǽ¹÷¡Ư¸ÚçØĂ$ƒvÖ¾§́߈Ù½Úª‚ +¼9ëöÇÖÄ– íƯñÚ߈«‡“Íj‹ÇÏÔ›àñÚÏR™‰kß [ïS߈÷Á·ºù׫‡“ÍjưÁ¹Ú‡ºơêưÀï½ơí©‡¥2ßëM¾äỠˆ«ÔƠ±‡Ưºêö‹Ù±‡ϼ«‡“ÍjÛ«‚ ½9ĂרĂô˹¡ÛÏÄ‚ÖÛ«‚ ½9À¹¹ÁÏÅ×¾Ѷù×ï½ëöôú߈Ù׽Ȫ‡’̀jÍ߈°»ÙŒë*«å̉ ƒà¿‰•̃ơêÙÜûÓº»½ƒvñƠ¶£½Ô¹Úăê«äĂôê¨߈å̉ ÅØưÀ™‰kß [ïSù×³ăˆŸ±»ĂÙÓÓơĂ·ÔÓσv߈‚Úº®×ÔÉ«‡“Íj÷ÚĂẴˆgù¿ƠÜçôăîßÄÙÅØ¢Ç§Ơ߈ƠơꩾéÓ™‰kß [ïSÈ)¥ÄÑĂưÀơèÅ߈óÇ߈Û«‚ ½9ªdñÖ߈©ơ©&߈ ¸Ú½Ă…™‰kß [ïS¹Áƒ'‹ÇëöóÔ›¶éׯø×ͪív—¶¯X©ÇđÛ×ÏŃֵ‡̣¶Ù×ĂĂƠ¼È8¤‡€º‹½Û«‚ ½9ÙÚ«‡“ÍjÏÔ©Øÿ¯¶Ù½å̉ ưÀ߈±»ï»©)ÑÓÛ«‚ ½9ï³2ëăˆŸ;ÿÚÏÔÅä‘´ÿÚ™‰kß [ïSߌ¦ÔƯÓ ¥‰ÍL…¿»´ê«‡“Íj…×½ÏÔù¿•Œ£äͽ›¾é‡³Ü̃ˆÑĂèê‹ÙºíÁ“ÇưÀÿ¯¶ß»û‘öÓÚ£ÇÛ«‚ ½9ƒvଗ»ÙڹڌӽÂÙ½ø×µØ÷ÁÇ»ÄÙ‡ºăˆŸ;kƒĐÄêçđ½ĂÏÔ¿üÁÏÔ«‡“Íj‹ÇưÀ¯È»nù×½¹Ă¼½Ôº…»̃»úµaÀ›¾™ÔÜÍÓơÔÑÄ뫇“ÍjÙÚ™‰kß [ïSÍġԋÈăˆŸ;k·ÔºƯÚôê ±»ăˆŸ;ŽơêÉ »yÉ̉¨ÇÿÚûÆÙ½߈¤Èͼ Ëû³Ă»Ó½Ø•ŒÛ«‚ ½9‹Ç‡ÛÙ½ÑÓáê›¡ăˆŸ;ÁƯñÓơê­—ŸÖÍË)éÛ9¥ßÂëö“½¹ÚñÓƯÀçÚơêÇ%£ö¿‰ÜÑÓ“Ơ™‰kß [ïS™‰kß [ïSƯ Ù½ÿÇí—G³ºóß»û߈¶ô ₫ ®¶ £ä½Ûº¹ÚºăˆŸ;Á̉ăˆŸ;½£ä™‰kß [ïSͺ¹Ú½ØÚåĂŒºívù×í—Gƒv™‰kß [ïṢÇÓØƒvéØÑĂé‡Å¥ؽ¬¾¢È Ç»̀Ê)èÛ8¤ƒØ¯ Ù½‡ÇÇ̉ùׇƯ²íiăˆŸ;½ÜÛ«‚ ½9Û«‚ ½9ŸÅÑÄë©Ø½€ơê±»ÏÔ9¥‡ù׋Ǻ°»×¾ëáù׫‡“ÍjÄÁ“º®¼“ÆäÁóÇëö›¾Û×ÿ¯¶ùåÙ½…mÙ×߈߈ù×ă¼ÄÓˆ±”·Ô«‡“Íj° +êØ +́v©ÀÙ½ó9¥‡¹Ú Ëû“ÛסÔרƯơ½€ù×½Ă…Û£Ư¶èó‰¿IóÁƯÔëö¼Ôá=½€å̉ ÷ÁưÀá‹Ç¹Úív‰¿I¥ˆ]1«ÔÓØ¡ƯăˆŸÆ«Ô«‡“Íj¸Úù×Ă¡%¯¾ĂÙ¡Á™‰kß [ïSĂÙ›YÄ–º̉½ô™Œ¯ÈÓµO­ØÏź۫‚ ½9¾ïÅÁ̉ÆÓÁĂ¥Öâˆ:߈Ûˆ½±ºăˆŸ¹öËÇϺ±‡™̃“ÈùôóÂÏŰ»›¾íơ9¥‡¡Û£äßÄÙù×ï³2Ù×û0ÅôáƠ©Ü¥ØÂƠÿºù×µ‰—ØĂËÙ÷Á߈ÙÚ¶Ô Áåô·Ô™‰kß [ïS̀Ê)èÛ8¤çô߈ñÚ·»ăˆŸ;áêù¿·¼Í7‹ÛŸ}·Åƒ¾‘§êƒØ߈»Û«‚ ½9Ånÿ‡ưÁ²ÈăơûÓóëöœÂéº₫å§®רơÔÏÔ«d߈ËœưÂ߈Û«‚ ½9›vµÙ§Æ™‰kß [ïS±ÁăˆŸ߈µØÍßáÏ̉ôë̃ÄØÛ«‚ ½9₫®¶™‡«»±»³ô¹Ú«‡“ÍjѶ·‡‘×8ç×ÜÀĂđÖ ©‡¥2ßëMù×ɹâˆ:kÙ½±»›¾߈罨 ‹Çđ‰·Üƒv¹óÛ«‚ ½9ăà›¶é÷ˆ©‡¥2ßëMăˆŸÎÅÿ¯¶ŽĂ­ØÙ̉¡Û›¾ăˆŸ;k±»÷Á­ÔÑĂö«‡“Íjùשد۫‡“Íj¿‰³È¹Ú½¢ Ë%¹̃ù×ÏÔÑÄëơèÅå̉ ÏÔϾ¥OĂ$·ô·Ó ¥0§Ô¯ƯÇÖöÏŹÚ÷÷ÁÛÀÿèƒv·‡‘×8ç߈™‰kß [ïS«‡“ÍjÙÚ̀Ă߈߈ÿÚøê›¾”÷à̃ˆ“Ⱥ«Ñ–»½™‰kß [ïS•Œ߈ÿ§¾ăơ”ÈúÁƯÍÄ÷Á‡b‚₫®¶Û«‚ ½9±»«‡“Íj¼€ƒvÛ«‚ ½9Ù¾«‡“ÍjçÚ©Ó¼¡Ơăê߈߈¼ĂĂÈÈ̉ÿ¯¶›¹™ÓÛ(Û«‚ ½9ÂvÓ̉µØơȾ÷ÁăˆŸăˆŸ›¶éÑÓô±»ùêÓ £äơêÍܺ ù×ơêñÁÁ¹ÿ¾±»ñÁỂ™̃Á½ñ̀±̉ÀƯµƠïÚđÁ™‰kß [ïS—¶¯¾ëÔ£öĂƠûÓ ÈÏ̉±¿ëÑŧÔñÚË%ăˆŸ;·‡‘×8ç¶Áëö°»ơÔáđùëơÔ«‡“ÍjĂÙù×™‰kß [ïSƒv߈Û«‚ ½9µ†½Ơ¾G™ÁÜƼ›¾™ôăˆŸ;·Åù×Û«‚ ½9ÏÔû(£ÇÑÄë÷‡ˆ’8¤‡×ù×™ôÍƠÁƠ¤ˆ\0™‰kß [ïSÅÔ˜‰j̃ZîSÙ½ÿÛ«»ù׃đÉ»Ááêö¿ß߈‰Á߈¹ÚÁƯ÷ÚơêÑÄëø×™‰kß [ïS‡“ù×çôÏÅÏŹÚ߈·Ô‘đ¦ô½$ñÆçÆŽÛÄÓćù×çº߈ăˆŸ;kÓÓ߈ăˆŸ;ùê£XƠX‰ÛÛ«‚ ½9‡º½YŸÅ˜‡µØ±»ÅÔ«‡“Íj›¾¿½ó“¹ƯN¹ÚùêÙڽȽ™‰kß [ïS—ÓÔÙŒë*«×¾™‰kß [ïSÚÀ©½ăˆŸ;kƒï½‡ÚÙ½Ѧ‡º½“¼À8±»çôµØăÇí‹ÜÀ¹éÓß»ûË̉̀ÿ§ñÚ¿Åøê “º¥ ÙŒë*«߈«ÚÚª‚ +¼9Ï̉ï»çÛ«‚ ½9ñľ§ÜíÖŵ†»‹¿ôçÚå×Ăº»ôêƒÚƯÓ ơÔÛ×̃ˆÁ̉™‡ơꆺÚü½Û«‚ ½9™‰kß [ïS½€߈Ă¼²Æ™Á¾‰…ÔÏÔ›Úư¦ëö˿۫‚ ½9©Ó¡ÈÇÏ™‰kß [ïSóÂ÷$ƒv½ĂÁĂ Ëû½‡ĂÑǽûØ­™ÁÑÄë›ÚíÆ£¨©‡¥2ßëMưºµ†‡ºàê ±ß™‰kß [ïSÀ¹§Ó©ÜÇØÅÀå̉ «d߈ùº›Û´†ºÁÚưÀØÚÛ«‚ ½9¢äÅÄöƒv‡ƒv±¿Ù½/ĂÙƒvöɇù×ÙÚ‡º¹Ú¨¼¡È±»Úª‚ +¼9™ïÚ«‡“Íj߈±»ºÿ¯¶ƒv™‰kß [ïS¶ßÄÙ»Á¬¾‡Œ°Ôéê‚™‰kß [ïS9¥‡×“ȹ©¼‹Ç«™­ÔÿÚˆ;±»ƒ½¥Ư™‰kß [ïS›¹°»Å “Ç–¶ơæƠĂÏÅù×ÍÓ‹Ü›¾ù×̣Â߈™ô½Ø‡xá ̃ˆ™‰kß [ïS߈ưÀÿ¯¶‡ºÎÅÍÇ»¼‘ëö±¿ÁƯăˆŸ;µæµæׯш±»ó§åÛ«‚ ½9ÿÚ»‡ù׳Ž™‡ÓÆ“ÈỞYăˆŸ߈‰Ô±»ö±»߈ÛÙ½ă»¡h¡Á±»÷ˆ9¥‡××Ú߈Ở—¶¡KÛ«‚ ½9ưÀ†ŒÇ»éÔÙ-ëö‹ÇăˆŸ;½¦¹¥ˆ]1½ÏÅß„ăˆŸ;Ö¾·‡‘×8ç¾ß$ñ«‡“Íj÷Á»ÈÛ«‚ ½9ưÀ˜êèäăˆŸ±»ĂÈ“½«‡“Íj›ªÚƠơèÅă»ÏÄÁĂ•Ó:ƒvăê³¹©ˆ»‡¥ÂŒ«ºö½°»ÏÔ—ÛŸ}¸Ú¾¹Ú¯×ÉĂ÷ÁÏ̉¯¼©Ç¡ºî½ßÚ™‰kß [ïS½È̉¡ºɇù׭Ľå̉ «‡“ÍjƯºéq·ÔñÚÛ«‚ ½9ƒvăˆŸ©&ÿÂÁƯơêÅÓ›¹÷ˆù×ÿÚ¿‰Úª‚ +¼9µØ™‰kß [ïS½ªº «‡“Íj»Øëö¥ˆ]1ëöÿ¯¶Û«‚ ½98¤‡Ö§Æ«‡“ÍjÆ…bỞÍÓÓÛ«‚ ½9‡Û½ÅØùׇ,½Ă¶ÅĂÙ×ƠôêѶ™‡èơ‹Üª»ÂÈ ơêưÀô·Å±»ÏÅ¿‰ĂÈ·ØơÔ¾ÅĂÈùº•߈Óº™‰kß [ïS½߈àÅÇÖ¿à߈Û«‚ ½9ăÿ¯¶ï³2Á™‡éÓ™ÔÈĂ‚vëªù¿£äûÓ‡ñ5ÏÄÄØă¼ôÔĂÈù×·‡‘×8çÛÄÓÛ«‚ ½9ÅÁÓÏÅÑ·ÉĂÛŃv¿ß¥ØͪÛ«‚ ½9÷Á陉kß [ïS߈¨¼£X—ˆ­«ÓÁÛ̉œȗ¶™‰kß [ïS½€₫›̃ƒv‡ŒÅà¬âà+퇆ømÛ«‚ ½9–ÓăˆŸ;ÿ¯¶½±»«‡“ÍjÁƯöéꙉkß [ïSăˆŸơÄÁ¼ù¿­ÄÉֽßÑÄë¥Ö«ÔÏ€Ån‘®·‡‘×8盾ƒ̃ÇÖÏźÏÏÅ÷ÁƯơ߈ù×¼̉ƠXƒvƯÓ Ùܳ ÏÔÏÅÛ«‚ ½9Ø-†ÚÅÚÇ¥ˆ]1ù꿉™‰kß [ïSáêÑÓ™‰kß [ïSĂÙ¶Ă™‡µØ›¾ÁĂáÛ™‰kß [ïSăˆŸ;ï‰Ơ¾G«·3uU±»«ÜÙÚù×§ă¿́…nôó¶đÁ Ë¿ÙÚ½˜‡³è‡ƒvï½ëö±»߈ÑÄë›ÛöĂ÷Ù8¤‡×Û«‚ ½9̉ºÛ«‚ ½9Ï̉ø×ÿÇ«‡“Íjœ‰¾I‡º߈âˆ:…ÛÁ|½›¾³„º£äÛ«‚ ½9Ă™ëéåĂÙÚª‚ +¼9ĂÙå׳Ưß»û}ڳºó±Á¤ˆ\0‹ÇăˆŸ;öÜÛ׫‡“ÍjçĂÅêÓ×Üù×ßÔ†Û«‚ ½9̃„ ¹àÛ«‚ ½9óÅÓăˆŸ;½Ôñ‹¡ÈÛסÔăˆŸ;Á×›ÚÑÓʹ±»öÁ𫇓Íj¡Á߈߈ù×߈º£ÇÅÓ”™Óû؃̀§Æ‰¾ë¼ËƠ½Ô™‰kß [ïSÍË)éÛ9¥ơ»·‡‘×8竇“Íj¹Ç£XÑÓ­߈½Øƒ¾‘çÚù×—ˆ9¥‡×ƒˆù¾µØÛºăˆŸ;ăˆŸë¹÷‡¿ÚÍÓÙ½ï½ó›¾ËÇÙ×…ÚÑÔÓ5“gesÁÅëÓŽÙ½ëØ×Ơ¡È÷‡9¥‡«‡“ÍjëöÅÔÏÔÓØ«÷ÏÔÇÏÔù×ÁƯ½½úÙỞÑÀÏÅăˆŸ;ɇÍä¾ÅÿÚ½Ù½™‰kß [ïS­Ö¹…¾ù×¹Ú¼€ÅĹګäÊÇÊÓª¼1ÓµưÁÖûÓ™‰kß [ïS9¥‡™‰kß [ïSơØÙÏÔÛ«‚ ½9ÓµOùׯ۟´‰Ûä̉‡Ù˜‰j̃ZîS…Ơ“º‡Ú›¾çÚöơê÷ÁÛ«‚ ½9ñÓ±”ƣط‡‘×8ç½߈шëöÛ«‚ ½9Ó¾ׯÏÅçơ“ơèű»áÛ÷‡Û«‚ ½9‡)ơÄ߈¼™‰kß [ïSƒöù×ÏÅï½å̉ «‡“Íj‹Ç¡Ô½Ă©Ø«‡“Íjˆщ¾×ȧÓÇÖÑĂƒvă‘·߈ăˆŸ¥Ó퇃v›¾Û«‚ ½9߈Û«‚ ½9Û«‚ ½9ëöÔXùêù×ëö±»»Ø±»ÏÔ«Ôï»™ëéå·ÅÙÅë½ß»û›¶éÙÚ™‰kß [ïSËÉ9Ù½Œ¾«‡“Íj›¾ÏÅÓÆ—Û¾ßßÁƒØÛ«‚ ½9ËÉ9ăˆŸ;ù×Á¦Ó.ù×·ÅÛ«‚ ½9̀¬H±»Û«‚ ½9Û«‚ ½9ÿ£äơê·Ó ¥0÷ڵؓÈ߈ăˆŸ;̉̉߈½óÇñ™ÁÙ½«‡“Íj߈­ÄáÚ“é¹ÚÛ«‚ ½9åĂ¹#®GøßÚ›·Ôƒ߈ƒv™‡÷‡ÏÅ÷$¶ñÓẨ߈™‹ÅÓ9¥‡߈‰Á߈χĐÄêÿÚÑÅù×ÂÙ9¥‡ÈÊÓơꣻâj Ù½߈…Եܵ؉½áƠ‹ÇÔºlÁñÔơ¶  ±Đ½ÅáơêûƠ÷êÏÔÍBÑÁëö™‰kß [ïSƒÖƯÀè‡ßÏ©À߈ÚÀÙÚÏň´ÎÙ½Ë̉ív¡h‚‹Ç©ÇÙÚÏÔÙ½8¤‡×‹Ó¯È‚Ø9¥‡Ûºׯ¡Ù½ưÀù×­=ÏŽ׺ÿ§ÜơƯÓ Û«‚ ½9©ƠI‡Œƒ§ÔÑÓ›¡¡Û¡¿‰¥Æ¯È·‡‘×8ç­Ö‹Üù×ñÚưĂĂ«·3uUưÀκ©ÓƒÖ‡ŒÙ½«‡“ÍjÏÔÏÚÛ«‚ ½9Á¼ï½˱ƯÓ ±»ï½¶¼̀7©¼9¥‡¡ÔâˆÅôř۫ԟ¿ë¹âǺ™‡¹ÁÑĂƠ«ăˆŸ±…àÈ)¥‚¾  ±»ÍÄÁªÚ©‡¥2ßëM±»‡¦ßÄÙëöÁµÁÛ«‚ ½9ÍÓ£ÔÎŢ䙴ùđăˆŸỞ߈½ɇ﻾«‡“Íj왉kß [ïSĂÙ·§D ±¿×Ơ‡Œû̉߈«‡“ÍjĂÙăˆŸ;›¾ÅÔ½ăˆŸ;̉ÅÛ«‚ ½9ùן™ÿ¯¶ÍÓæƠ"ÏÔó|ív¹ÚÿÚËÉ9±»ûÚïƠÑD™‡ëöª»ÿ¯¶ÏỖ„ +ŸÈ¿Å¹ÚÙŒë*«•ÖÜÓ ĂÙËÔ©-™‡ƒÖÏÔ× ƒˆÿÚÙ½ơÔ…Ûù׫d‘Æëö™Ó÷ÁËÉ9³ØÑÓ¨"ÏÔöß»û†Œ¨‡¤2€̃êLÛ×½ưÀæÚ—Ó߈¡ÛåÁß»û«‡“Íj§{ăˆŸ;¸ÁÛº̃»úËÉ9ùןÅÏôăˆŸ;Û«‚ ½9ƒv¹Úù×ñӬľÆơÔăê߈¶ÜÚª‚ +¼9§dÛ«‚ ½9ÏÔщù×Ơ߈•½«ÔÑÄë߈߈ßÄÙÚª‚ +¼9ëׇÚٽظژ‡±»ÍË)éÛ9¥ûÍÇ̉óÇÿ¯¶Ưøú(Ó̉™Á«‡“ÍjëöÂÙ½ôăˆŸØƠ¹ÚăˆŸ™‰kß [ïSÏԣإÚĂÙ¿₫Ă¼™‰kß [ïS—»À̉™Óăơ8 ¤‡ ÍË)éÛ9¥߈øêµÚ•½¾Åøơ ߈µû߈°»ơêÂơÔƒvÙ-‘Öá ×ÜçÚ¾º½û(×¾ëÓÇÓƯºË¿ù×ÑÄëÏÔç‹Ç°»“ƠƒØ·̣¹ÚïÚæ̉ +ûÓù×ù×ĂÙÛ«‚ ½9×¾ÏÔù¿¹Úàê×¼ÁĂ»ßÛ«‚ ½9‹Çêö¹Úô»í‡½€çÚ³à½ăˆŸÀ̉ÑÅù×µÛÁƯëöëöºÏÔßÚÛ«‚ ½9ÏÔ—¶Ù×ؽÛ¡©‡¥2ßëM÷Á¸ÚÏÔ߈™‰kß [ïSÓØ³ßÄÙÙÚ½€ù×±”…ઇ’̀jÛ«‚ ½9ơꩇ¥2ßëMưÀº߈µØá=ûÁăÍĂçƠ±ÁÀ¹»ëÔù×½Ă¼ÍƠ½ØöÁƒÖöÁù×ơêƠ,ÏÔÍĂùæ¬ôÛ«‚ ½9ù×ơêáƠ‡™‰kß [ïSÏÅƠÓù׆“™‡”ŒÙ½½ûƠơÔƠ—Ó™Á™ơ€Ơ’½’7¹Úº°»‰ÛÔϹ©‡¥2ßëM±»£Ư­•·Ù½ÙÚÛ«‚ ½9†ŒñÖƒ§ØơԻܩ¼Ë̉ÍƠ߈‡Œ‹ÇÛ«‚ ½9™‰kß [ïSÍǵثԇ䙉kß [ïSơË÷øê‹ÜÛ«‚ ½9ưÀ«Úïàă»÷ˆÙ½›¹ÙÚ×ܸÚơÔ½ØÏPơêÁĂ©›Ở’ºƠ°»ûÓÇĂ´ûÓÿÚá=ôùסÈï½±»»£ƯƠ`«‡“ÍjƠXÛ׿‰ơêÙÚƠ¼Ă&Ϻ´ẰÓ —¶Û«‚ ½9Ù½Ù×ÙÚ…àØ̉kẲ«ÔßÁ«‡“Íj׿8ăàÖÆÅÔ¹Ú˜‰j̃ZîS±»ÑÓăơÙדƠ·ỔÿÛŸÅëöÁ|•½ÛºÍË)éÛ9¥ưÀÏÅÀ?‡9¿Å‹¿ëö¡ÛĂÖ‡Û«‚ ½9‡Çׯ¯Ûçº8 +¤‡ +¾ï½°»™‰kß [ïSÛ«‚ ½9¿º°» ˜‰j̃ZîSëÓ́½Û«‚ ½9ëöù׸Úå¿ÏÅÛ«‚ ½9¥Çß„‹ÜƯ‰8¤‡ăˆŸ;ÇâăˆŸ;½«‡“Íj¦ÓÁƯ»Ă³Ç³ØÛ«‚ ½9ÏÔáƠ¹Ú‹ÜƠ–ÓƯÓ ³‚½߈ù×ăÁ©ÓưÀ¹Ú±¿ưÀÂÙĂÙÙÅëÚª‚ +¼9ơêù׋»÷å5ÓÏ̉ÏÅ«‡“Íj½€ŸÖ¹Úëö£äÙÚÏÔÁ¼ï½—¶̃½éôă½ƒ÷Ù“ƠÆ̃ÖÙ½ù¾Ù½·Ûơ…ÓÅ¡ÛíêƯ©‡¥2ßëMÂÙ߈êöÙÚÙ܃׋LjÔçô“Ơ½ô™‰kß [ïSÿ¯¶ƒˆØ©‡¥2ßëMƒÚ™‰kß [ïS̉ƾ¹Úë×™ô¹ÚÁĂºÅ«»¶ +è +™‰kß [ïS±»ÙÚù×±½ƒvÑñ»½®¼çÚÍĂÍƠ»Ø±»ơê«ỒÓ°êØÎ̉ăˆŸÔơùêơèÅœ‡½€æØăˆŸ;kĂĂ ›­±àéM›ƠñÓÏŽÔóÔ±¿ùꣻ߄·‡‘×8çÙÚôê Óº߈±»­Ä¹Úív±½¿º‚ö&º¡Á¿»­Ä÷ˆëöƒvçÚͼËÉ9½ÔÓÙ™Ô¢ÈY¡ÔɇñÓæÚ¯ƒ« +>·Ó ¥0­¶º÷ËχăˆŸ;µØ±»´!ăˆŸ;k¿»ívÁƯÑÄëéê½½€ÄغÁƒ̃ˆñ“ÆƠăˆŸ;¡Ôèơ½ÙÚ¹¶ÅØ£Ư¹Ú›¶é߈¥âßÄÙ„ø‘ơêµÅ“ÂĂÙ±»«ÓơèÅß»û߈ª»«Ư‹ÇƒÚƯÚëöÍĽÏÛסȻˆû(¢ØÛ«‚ ½9ơê´†—¶ÑÄëÙ×›¶éơêµÅ™‰kß [ïSưÀù×ăˆŸ‹Üɇ›Û° +êØ +ƒ›·ÔïÚ£ƯµØă»µ†…»ÏÔ½Á»ü›¶é»½ÏÄÿÚË̉߈ñÆ›¾“ÈûÙÏÔɹÙ¦Û«‚ ½9ăˆŸ;k9¥‡ÙÚÅ‘ÈăˆŸ·ÔƒÖÛ«‚ ½9ÇĂÏÅ߈«‡“Íj…‘Æ’Ç…¼ÍÓµƠŸÅÏİ»§Ó¡Ûµ†©‰Û©ƠÓÆ¯l«‡“ÍjĂÈ‹ÇưÀëöψ›¶éÛ×¾±»ÓÅ‚vÛ«‚ ½9†“‡ŒơÔ߈¡È߈ĂÙÅØ¾ÅׯçÚÑ\ưÁÿ¯¶ÏÄ߈ơèÅÛ«‚ ½9¥º·Ôù×¹Úé‡Û«‚ ½9߈›¾™‡¡Û±»Ûƾٌë*«¡Ơˆ Ơ½ô9¥‡Åä¿Ù±Û«‚ ½9щçôµØÙ½ÏÔ¥ˆ]1™‡ív±»ëÓ‹Ù¼ùסÔăˆŸ;k̃ˆơê¾±½›¹Û«‚ ½9ÜÏÔ߈Ξº·é¹Ú¹ÚÇÖÁ¹û+ëÎÔ +ÛºÙÚ‹’«‡“Íj߈¿‰“Èéê¹Ú½È¡%±»±»ëÖÙ½Ûº¯È߈ù×ÇÖÿ¯¶©¼‡ºƒ½ƠÛ«‚ ½9߈ßÁ÷ˆß»ûù×ÏŃv«»¿g«‡“Íj­½¼÷‡“ƠÑÓù×܃ˆ¡ÛđKĂºÏÔË̉ѶĂÙ¶Ô¼ăˆŸ;éô¼€đÓ¹}׌ÏÅå̉ ÏÔ·¾Û»÷Ä»¡Ô‡Ç±»±»÷¶‹ª-ÙÛ«‚ ½9½ÿĂÙ£äôׯ·µ•ŒÏÅßÁĂ Ù½ÍB¾å̉ ß„™‰kß [ïSáÛÙ½ưÀÿ¯¶ù×å̉ ÷¶«‡“Íj½€ÙÚÏÔ·‡‘×8ç×¾±»‡Ú§ôÿ¯¶Ă›¾Ù½¡ÇơèŃv™‰kß [ïSÅØÛ«‚ ½9‡xϼºy¥¹©ÓưÀ¡È“¹ƯNëöñÚ»ô‡ÛºyçĂÖéºÛ«‚ ½9«Û‹ÙÍ̀½¯ÈÛ«‚ ½9ñ¨‡º³¡ÁÏÔÓ†“ơèÅù×±ÑĂËÉ9ñʯÈͼñƃ½ơêçƠ³Ü‹ôƠºm·Ô¦ºưÀ½ÁăơăˆŸ;ÑÅñÖù×óï±»–¶ÏÔÖÆÛ×Á¹ơêÙî¿»Æăơÿ‹ÜÛ«‚ ½9ơÄĐÓ¡Áøê}öÁ̉îÅùêĂ$å̉ ĂÓỞñÆ•ŒÏ̉ù¿ƒÖÓ̉Å¥ù×óÇ¡»ơlÅÓ£»«‡“ÍjĂëöưÀå×Û«‚ ½9…Ûµ†8¤‡³È߈ƒÏÅÓưÀăˆŸ;™‰kß [ïS™‰kß [ïS‹Ü³ÈăˆŸŒ¾‘ƒnä̃çÚăˆŸ;kÑÓψ‡ÚóÇ̀Ó ôêƼ¥ˆ]1ÙÙÅë½ô©Ó«Ô÷ÁíÖ¾›¡¥ˆ]1¸àǼÏŲ¾¾ÇëîI±»Ǻ8 +¤‡ +Ö êö×¼ÅÓ—¾Çô½»ÅÏÅ—Óí‡áƠ±»ñÄÖàÅßÄÙÙÚ߈¾ÅñÓƒvñÆ¿ØÅÓíêơÔ±»ñÓóÂ÷ˆƠˆç̉߈ƯÓ ¹Úͼ±»µ†Ûºù×ÛÇêö ĂÙ…¾å̉ ơŽô§Ô±»Ï̉ơÔåĂôăˆŸ;kœ‰¾I³(³zơê߈ăˆŸ;ÁÛẳ°êØ»ÏÔëÓ•½°»Ù½Ù½¾ß«d‡߈́–G ËûåẮvÇÓĂÙÏÅ%©ÓƯsÁƯ™ëéåר±»À¹ÿ “Æ÷ÙǺ˜êèäöù¿íX×¾8ÓØÙ½¿Å´À¯Ó߈ÏÅɇ½—»ăơ½€éÔÛºơÄĂË̉ÍƠ›¾ƒvƒv¾¹Ú±»ĂÙ὇ÇÙÚ±»¶ǺÁ̉·Ô¾ŸŒ»Å‡ÓÁÏÔëö뼄(·ØöÁ¡œÁŸ}ÙÚ­½¼£Ø“Ÿƒˆ·cˆ¾™‰kß [ïSÇ"ăˆŸăêÛÀÆôÙ½ăˆŸ;ù׺Ïś½äưÀÖ¾­Ô•Èû›ƒơ°»º±»ÿÍ¿º˜ÁûØ‡ă»›ÚăˆŸ;ǺƠ‰›¾ÍƠ¡Èù×ö€ôµØ߈½€—¶÷Áéº̃ÄØµaƒv¡È«‡“Íj›¹Ù‹Ç±»­Øơ‡ÿÚéê·̣¯S±»Ûº‡Ç¢X¨‡¤2€̃êLúº®ƒơ¥Øø¿£X·ÔưÀíêÛÇ—¶±»•Œù׿ºËÓ›¡‹1ö©ßôÙ½ÁËöÁØY ƒ«‡“Íj™‰kß [ïS߈ƠX¼ỗˆ™Øï½ưè¥Æ‘Û«‚ ½9¾Û«‚ ½9º½%9¥‡¯È“¹ƯNź±»‹ÜëöÁƯÛ×Ù½¡‰ÛăˆŸ;¦Ô½»‡ÿ¯¶¿½ѶăˆŸ©̉™‰kß [ïS¹ÚăˆŸ߈ÏÔ¾ăˆŸù×Î̉ƒºÏĶȡ߈ëö9¥‡ơõaôp ™‰kß [ïS«‡“Íjñ‡¿½˜êèäçÚ¿%¹ÚÙ½ƒ¾‘Ûº“ߌÛ,½™‰kß [ïS¿‰ù×ÏÅ›¶éöͽÛº«»߈¦Ó«‡“Íj9¥‡ÊÈ9c±Ư™‰kß [ïSÚºù×ưÀ‡º¦ÓÑÄë̀Ó麱»ÅØ ËûăàơèŽ̀Ó… ù‰ß+±»×¾ëö₫ÙÚÅÁëŒưÀƠ‘®ÍÄÓó±»·ÔÛ«‚ ½9ÓØ¾ëöăˆŸ;ÍÓăˆŸñÓ«‡“ÍjÛ«‚ ½9ëöÑØÛ«‚ ½9‹Û“Èđƒv¡È³Ø±Áƒˆ±»‰àÚª‚ +¼9ăˆŸ˜$àÅÓ¿‰½€ùÜ÷ÁÙ½ưÀ¥<ÿÚ—Óëö躋ëÅӋǬ¾¿ô£ÏªÚ™‰kß [ïSÀÛ߈Ï̉ăÇíĂÙùêÏÅŒÓÿÛ©Ó¿́µaô»œ‰¾I…Ơ…ƠÙ׃-ÓÅ̀Ê)èÛ8¤ùêǺ˹ƠÁ¼¯È«»Æ³àăêƠ¾G±»ƒØÍÓ¡ÛÓÓƠX›ÚỞ¿‰9¥‡óù×ÑӇǾƒÖ°»Ó°¿ƒˆù×Ï̉ÏÔ¹߈áê½Û«‚ ½9ĂÙơħԛ¾û¼Ô½ăˆŸ·‡‘×8çí—GÏŸÚ÷ÁŸ}µØ—TØŒê*ªÛ«‚ ½9ÏÄÈ̉G“È9¥‡åĂ›ÚçºÏŽ߈Óºăà¡ÔÂÙçºỞ±»•–ăˆŸ;ư•ºǼăˆŸ;·ÔµØăˆŸ;·‡‘×8ç­Û«‚ ½9Ù½¡ÛÏô™‰kß [ïS«Ô™‰kß [ïS÷ˆ«·3uUÙÚ½ÉƯ¡Á‡Œçôô˜ơ÷$˜êèä¼ơêÓº÷ÔêØưÀĐă¾‘½ÚÇÛדƑƳ Ù½­ÖÅÓƯÚË̉çÚưÀ™‰kß [ïS¹Ú¡Ă«‡“Íjçô÷ÁÓ̉‡Çïïiù×–^^¦^̀»^^ª»ÊÖù×ïØ×ë£äÓØ¿ôÉëö޽˜‰j̃ZîSÏÔăˆŸ©ÓÜÓºƒàô—»ÏÔËܺ₫®¶ÅÓỂÁĂ߈×Ơ¹ÔÏÅçÚ‚v—ˆéº߈¿‰9¥‡±»ÏĹڱ»±»óÇăˆŸơÔƒˆÿÚùסÛRÙÅëÂÙ£ä¡Ûï½åÁÏÅÉ̉ªỤ̈|«Ü©Óß»ûÍBÙ½¿ßßÚ‡ͼ«‡“ÍjÛ×ơêß»û«Ú‚ˆ©Ü°»ÜÅ™‰kß [ïSÑÓÙ½™ÓµØÛ«‚ ½9áÛ«‚ ½9ô¾ßï¡ØµØ™‡Ú¸8¤‡½íÆù׃½‹Óêö«»¯‰¯0ù×±»‡ñ5°»Ăô“ȃÚ߈ăˆŸ;­ØØŒê*ª÷Áùê©Óù×Ăô½Û«‚ ½9íêÛוŒ“¹ƯN™"³Â騫‡“Íj™ëéå½ÍÓ°» ‡ÇÅØ˜‰j̃ZîSÙÅë­ÄÀĂΟÈɠȧ¹Óºëö³ƠëÚ›¾½©ØÁæºưÀƒvóÇ¡Ó߈¡Ơø×̃ˆØÅêô¼±»å̉ ™‰kß [ïSшù×ëö—»Ơơøæƒˆ‡Ú¯È˜êèäØYܺÚêÓ“Èá ă»ÏÅÁ‡é/×:÷Á™‰kß [ïS‡Ú¾±»±»›Û9¥‡¬Ô +÷‡çÚ߈ÿÚ‹ÜÙ½·‡‘×8翺„ØöĂÙ­Ô£Ô°»ùÚ¹Ú÷nĂùê­ÄÁêŸĂ˜‡˜‰j̃ZîSŸ}ăˆŸØ×£Ø«‡“ÍjƠX±»¿‰߈ơÔÛ«‚ ½9’¹ÜNºẩÙƠĂôá̉Óºâ¡ÔỞ½Ïԥϙ‰kß [ïSÂÈàͼ±»üêƒvŸÈăˆŸ;k«·3uU›¾¯G‹ø·‡‘×8çỞº©ˆ¿ßÛשܸê÷‡«‡“Íj›¶é˜‰j̃ZîS÷ˆ¼‹Ù«‡“Íj™ëéåùê½ÇÑ–ß»ûÏê¡È«·3uUÿ¯¶÷Á¯¼ϹËÇëöù×Ó±À½ïÚ«ÚÑØ‡ÇÚª‚ +¼9ÙÚ…Ơ³¹Z³È™‡ƠX̣׋É0Ơ뻇ñ59¥‡ÚÀ‡€è/Ö:‚Ø ©ØăˆŸ;YÅØ«»˜êèäûÙß%߈½ÂÙŒë*«“ƠÏÔÏÅ­v˜ô=ƒăù׫ÔÏÅ–»ñÄÙ½ơÔ€Ó‚¾½Ơñó½­v½Ă߈ƒv˜‰j̃ZîS±»߈™Áƒv©¼‰Ô׿8ơêĂÙó¥Ú×Ơ¹—»ù×ĂȽô·ºưÀµaù×µÛˆƯơªÔ¥Ø‚v¥Ø«‡“ÍjÁ¼ëƠUÍÓăˆŸ½€ñÓ«‡“Íj«âù×᭓ƇºüÀù××½±»ÑÓÙŒë*«ơùêçØñÓ¡Ôô¥ØăˆŸ;ơÄÍ𫇓ÍjñÖÏÔ¿ß«‡“Íj Ơ¹¶³¾ăú›¾ÍÓ÷¼ăˆŸ±»÷Ù¿º°»¯Ơù×ù×ϼÁá ÏỐvÓÔ¿́̀B›¾™‰kß [ïS«‡“ÍjƒŸÅÚºăƠ•Ü‹Èÿ¯¶ñÁÛ×±ÀƯÜùêß̃±»‡ŒÔ¾F₫…™‰kß [ïSÏÔ±»£ƠɃÏÔ«ÔïƠÓÜÇÖÏÔƒÖçÚ«‡“Íj«ÔÛ¹§ô¡ÛÏű¿óÇÇĂÁÛơÚ÷Ô£äưë«Ô½ĂÙÜăˆŸ“¡«ÚËƠ«‡“Íjºˆ³—ăˆŸíꙇ°»ï½£Ø‡Ù½9¥‡×Ơ½²ÑÄë¹ÚđÁ—ˆƒ¾‘™Ó‘ÆÓÔơêưÀ“ÆívØÚÅàăˆŸ€ơê®×”¤ˆ\0ÙÚ¢Ơ +ÙÅëĂÙÛ×ëöß%«·3uUÁ̃ëÓÛưÀ«Ú­¾ăˆŸ;¯È߈ưÀăˆŸ;¡ÈÛ«‚ ½9µØ¿¹ƠÑŻ؉ÔÇÖÏÔÙ½ù×ËáƠëöÏ̉ơê郈ËÓ·ÔÛÚ˜‡ù×½ºƠXñÓđ¹˜ Ở­́©ˆ›ç¿»°»•ܽáêø×#÷ˆÛ«‚ ½9Û«‚ ½9Û«‚ ½9ñÚ߈߈ïÀŒÅ…Û߈ŸÖÔ¾FÛ«‚ ½9ÿÚ½ôăˆŸ;øêÛ«‚ ½9ÍƠÓÆëÓϺÇÖÙ½±»êö¡ÁăơÏÔø×̀Ó€ºÓÆËÇ«‡“ÍjỬ©‡¥2ßëM§Æ÷‡²”Ù½«dí·רÓº‰y㉱¿ùׇŒù×ÛÄÓ«·3uUƒ½ưÀ©Ç₫¼“ƠóÇ™‰kß [ïSăˆŸ;kÛ«‚ ½9׿8ív©Øëöµ†à‘«»yÓ̉½™‰kß [ïS̀‚vßâÓÔÿÚ9¥‡«Ô·Ôûó¹¥ơÔ²¹¹Ü«‡“Íjù×”Öéºëö™‰kß [ïSä̉ĂÙư“÷å5ӵر¿SÛ«‚ ½9ƠăˆŸ¹Ú¡ÁưÀ¯Èơê¹Ú߈™‰kß [ïSÙڻذ»ψÙ½‹Ç™ÔǼ›¾®éơê¡ÔÏÅóÇÏÅßÚÏÅÔßø×ÁĂĂĂ ›­±àéM÷¼«‡“Íj±»é‡ưÀ»Ø™‰kß [ïS™‡߈߈™‹«Ñ«‡“Íjñq™‰kß [ïS…JÿÜ‘ÚûƠ³ÈưÀÉ̉ÙÚÙÅëđÓëÚ‹Ç©ééê±»¿‰ƒvG½¹º“ȇùê¡Ô÷Ûëöö©‡¥2ßëM™‰kß [ïSív÷ê½Øù×ù×̃ˆÇƒï»Ăȱ»ù×߈¯¾©Ç¯Ơœ‡çÚ—ÓÍË)éÛ9¥«ÔÍBĂÙÓÆϼÓ̉ßÄÙùê8¤‡Û«‚ ½9߈Í­HơÔ¨Ó«Ô™ÛÅ«ÔăˆŸ߈ù×½Ôư‡±ù1·Ó ¥0ƒ½­Â«‡“Íjù×™‰kß [ïSÁ‡é/×:‰¿I·§D ëçÚ—‹È²Æ½«»ÂÙƒưÀ¥°·ÅüÀ»ïä¢Çùº—¶íÅǼÅùëÀĂ¥áù×°»ßÖ¥ˆ]1½€‹È£ØéÜÙ½›¾‹½Æ»ߌÛ,%ƯÂÛ«‚ ½9Û«‚ ½9‡ÇíÚ±¿ơêÏÄ÷‡©ÇÛ«‚ ½9•j‡Ù½߈àê ÅÁçØ½ăˆŸ;ĂƠéµa^öº¯¼°»ăˆŸ;ƒv˹óßÄٹڣ؆Úáê™Ó¹Ú™ôƒv½Œ±»½¾‡߈©Ç„'ĂÙ߈ư“½ÙÛ«‚ ½9ø¿“ÇÛ«‚ ½9Ù×ÏÅÓŵaçÚăˆŸ;½±»ĂÙ9¥‡áعڿ́¯¾«‡“ÍjăÇí»Åµ‰áá³Æ©¼«Ô£»ÏÔ߈Ơ›̃ŒÚ,ׯƠÁ ‡¿ƒˆ߈™‰kß [ïS»Å߈¶v™‡»Á“Ơëöăê•á$½Û«‚ ½9™‡¯ ŸÅù¾ƯºéêÙ½êöưÀ±»̉Ó̀ÓăÁ«Ôщº›¾¨Ø½ÏÄöÛ«‚ ½9ÿ§ù×­Öƒv…Úơà‡Ç§Ô¿ëÏŬÄྵßùχŸ}Ÿ}ºƠÛÄÓˆ“¹ƯN’ÆÛ«‚ ½9̉̉ÙÓ½Ù½™‰kß [ïS߈ơê¢ôăˆŸ;£Ø¡ƒvÏÔË̉‡߈µØ» +ÏÅÁ̉8¤‡ëöëö“Æ—ÖăºăˆŸ;‘Œ¹à9¥‡¿ôµØơ¿ÿÚcˆĂĂ ›­±àéM©½ËÇăˆŸ;k«‡“ÍjóÔ½߈Ï̉ÓºưÆ¡Ơ«»߈ƒØ÷Áív85¤‡5Ö# ƠƒÖ9¥‡˜êèä¹Ú¡Ô°» ƒÖƠÁ ¯È÷ÚǼ«‡“ÍjÛ«‚ ½9Ë%Œéºƒˆ‰£ÈÙĂº±½¹ÚÍÓ߈߈ß„—¶ÛºƯá¡Ï¿ù¿߈½·Ó ¥0Á½Ë%ÍÓ…Ûƒv˜‰j̃ZîS‡ËÉ9½ñÖù×匿N¥Óơ‡‚vá ˆƠù׵ث‡“ÍjƯÓ ùôöÏÔÿס́ØăˆŸ;Ù×ăˆŸÍĂéê«Ô™ëéåăˆŸ½‘Ó½±½ÁĂÙ€˹±»½™‰kß [ïSƒăˆŸ;k‡Ú«Ô™‰kß [ïSĂƠßÅĂÙ¯Èơꙉkß [ïS…Ô‚¾«‡“ÍjÅØÛÄÓÏÄ¿‰Ͼ¥O•»ÿ¯¶Ï̉Ǻù×™‰kß [ïSµaÿڽȘ‰ j ̃    Z îS µØ¶Ôçº÷ÚÑÓ¹Ú›¶éËÇù×¹Á˜‰j̃ZîS­Ö™‰kß [ïSßÚ¼¸à‡¾™‡¿‰ôưÀăˆŸ;å̉ ơêŸ\©Ó߈³z÷ˆï»ÛÔó±»ăˆŸ;kƒvﻫ‡“Íj¡Óù×¼æđÿ¯¶Ïů¾Û«‚ ½9ăơùףǫ‡“Íjø¿ «‡“Íjëöùש‡¥2ßëM­¶ÿÚ«‡“Íjè¾ĂÙºÇĂéÚÿ¯¶߈¾ÏÄ›ßͪ₫®¶‡9óÇĂÙÇÖ„ØơÔ߈º¡ÛùׯÙåĂ½ÔñÚ»Ơ˜‹•%×ĂÙÚ«‡“Íj¡Û·¼Í7÷ٵء%°½ ߈‘ƇŒƠËóÚ9¥‡ÓºÏÅêơÙ½›¾©º9¥‡«Ô±ôẳË%…Ú亱»óÇ®¾̉ºͼÏÅơ₫ûÓƯºÿÂ߈ôÓóÇùת»ŽÑóø×Ơñ9¥‡µa‹Ç¿ô߈¸Úø×á •Èû›Çívƒ¹ÚºÁû´©›¡Ø¡áÆ»ÆơêăˆŸ§“ÏÔÑÄëµØÙŒë*«¯Û©‡¥2ßëMé±Ûˆ±»ÏÄŽ¼€ψưÀÛˆ¡Û½çZ«‡“Íj‰è·ºª»«‡“Íj¾(ÙÚù×ĂÙ¿‰ÙÚĂ ÏÔơ"Ï̉¶ + +±ÔͧÆщø×ÁÛ›Ú·‡‘×8çÔ¾FÛÔ¡ÁĂÈơêÛÄÓëöÿÚ̃ŒÛ,ÏŽ9¥‡¯ƒ« +>ÙÓ¥È9¥‡µ†ÿÚëöÛºƯ‰ÅôïÁù׃ˆ­Ö½ÔÏÅÙ¡Ôàêëö±»ÏÔ©Üù×߈º߈÷ÔăˆŸ;ëö­ºÁÚ̃ˆíÚù×Û«‚ ½9ƺ¹̃—»¾ºÚª‚ +¼9ơêµĂÀĂÛ«‚ ½9‹Ü›¾ÑæƒÖ•ס߈߈߈̀Ê)èÛ8¤êöÅü%9¥‡½Ôëö½ù×½¾‡¡ÛÙÚ™‰kß [ïS±½™‡“¼±»Ị̂̉ÇÿÚY»¼‘°½£÷­ơù×ÏÅ ËûƯºüÁ«)°»ù×߈…›·Ô»Á§ÔÏ̉ÁƯ¬Ö«‡“Íj½çÚ¨Æ4ÏÔ¶¼̀7ăˆŸ»¼‘úƠÁƯăˆŸ;ăÁ«öâÁܘ‰j̃ZîSÇĂÿÚ‡º§ÔƠöÁ8¤‡©ÓµaÙÚˆÔçôÑÄëÅô \™‰kß [ïSÙŒë*«½±»ơÔ¶ăˆŸ;ơºăˆŸƒv±»±¿ÅƯÚº™‰kß [ïSÂ*óÂäĂ³ÂÛ«‚ ½9“½ߌ°»ù×ù×Úª‚ +¼9Ưº¤ˆ\0éçơơÔÑÓÁ̉Û«‚ ½9¹ÚăˆŸûÙ½ưÀâĂ¹£½½Ùźï½ƒ¡ƯádÏÅ¿ôÛÄÓÇ›¾ăàÓÅÉ̉¹Ú¹Ú¯à™ôưÚ±»™‰kß [ïS÷å5ÓŸÖơÔ«·3uU™‰kß [ïSó×¼ɹÏÅ«‡“ÍjăˆŸ;k¾ô™‰kß [ïSù×éÓỊ̈ÏÔÏÅĂÁơ½߈ÏÔÏÔﻂ·‡‘×8ç±»ϪÏÅáê…ô«·3uUçÚăˆŸ°»Úª‚ +¼9ëÓ·Åéê߈«‡“Íj±»›¾“½ÚÆ?³ØË%ÅÓưÀ¡Ô±»ׯÏÔ”ùׯȃ؜Üôå̉ ùסÈĂƠ·‰«ÔŸâơÔ¼Ă¡ÔÚ×ͼé»ÅÓ±»Ÿ\·Ó ¥0Ÿ}íêơ…ø$h‡Ç±»¯¾Ÿ»£ÇĂÙù׫‡“Íj½ôÛ«‚ ½9ïçƠ´¼ù×ĂÙù׫‡“Íj™‰kß [ïS§Ôƒv‘—ƠÛº‡xá Û«‚ ½9°¿Ù¸¾ßÇĂơê÷ÔÏÄĂÙÙÚƠÔ™ëéå‹ÇÉÀ‡Œ¹öơƠơê¿ô¡Ô°»߈ÑÅ9¥‡±»·‡‘×8çđÖͼ©¼àÅ“߈‡߈ơê”Ö·ÔçÚ„Ö·§D …öÏÔÇÖ°Å  ĂÖçÚâÁÆ÷ÁÁ̉íÆ߈÷Ú«‡“Íj9¥‡«Ú‹ÈµØƺ¹Ú¡Ơ«‡“ÍjưÀ§ÆѲùת‡’̀jơĂ₫˜êèäÚª‚ +¼9—»ƠÜƠ¿‰¥ƯƒˆÅÄ™‰kß [ïSÅØɇ“ºׯ÷ÁÛ«‚ ½9ÏÔÙY¿‰ÙÚĂÙ„öăˆŸ;–¶™‰kß [ïS»Å·‡‘×8çîÙ×ăˆŸ;k¬¼¼Ïĵ†«»áê™Áù¾ívÉÖÆ±»³û(Óˆ•=‘ăàκÍË)éÛ9¥«‡“Íj«‡“Íj™‰kß [ïS©L™’É›ÂÙ©‡¥2ßëM8¤‡×ÿÚÁ̉ׯ‰¿I·Ô߈źÿ¯¶ĂÁåõØéÓµa§ÓººöÁ ÿÚ¹Á޾…ôÀ½Ï̉÷Áä̉§Ơ߈…Ǽ“ù×ívÖ¹°»öø´ÿÚ¹Áç­ÍÄŸ}8¤‡÷‡ÑÄë…™‰kß [ïS‰½ơÔ߈퇃ÍË)éÛ9¥Û«‚ ½9ƒvËÇ %ÙÚ‡Ú“¼™‰kß [ïS™ôăˆŸ;‡xµØ™‡ÁƯñ ªÔÓ̉¹Ú£ÇË̉©ñ‹Çù×ưÀÛºù×ÿ¯¶§μó¶ùơÁ!ÍÓ½€Ä–ƠÄ¥ÆÏÔ™Ó¡ÁÏÔ¾ÑÄëưÚäôù×·‡‘×8ç±ß­¾߈ùêÛ«‚ ½9̀³Û¿ôÜÓ Ë̉Ǽ›Ú¤ÈĂٶŇÛÛºơêĂÙĂÙ„ô›vÏÅÁƯ‡ºœ‰¾I›¾߈ơêÁ̉Ù½÷ÁæơÔñÚŸØá̃ù×ÿÚëö™‰kß [ïS˜ÁöÁÍÓщù×÷ÁưÀù×ù×ĂÙ¥ˆ]1µØ£Ó‘Û«ÔêÚ‡ôƯ‰â»ç¼™ëé忹߈Ơăơ«Ô™‰kß [ïS߈ëö™‡ψÓ ‹›æÓØÓƒ¾‘÷Ú¢X«»ù×™‰kß [ïSƠçÚÓº™‹Û×¢Ó©‡¥2ßëMùê±»½Å™«»µØѶ™ôù×ùׯȫ%§ÓÄ–Ơ¡½Ưºóm÷å5Ó‹Çù׫‡“ÍjßÁ±»á ר±»™‡÷Óƒv¿º—¶³Â9¥‡ºÁ ­ÄÙ×¹ÚÙỤ́×ÁƯ¿‰ÓăÇíơÔÀ‡€è/Ö:ÏÔÏÔ9¥‡Ø¾¥ˆ]1ÅÔĂƠÉÙôê÷ÁרăàŸÈĂÏÔ«‡“ÍjçôƯÚĂÙ›vÁÚ“Ơơ‡9¥‡Ă£Ø»½½ƠăˆŸ;ƒ½Ù½ÏÔ«ÓÙÚÛ×™Ư%ÏÔ·‡‘×8燌½ơ™×¾„öÁ•Èû›ËØÚª‚ +¼9´aưÀ¡Ư߈Âù×öÁ‘Æù×ăˆŸ;ôÇçăà°»¥‰ÍL…Ăôơó±»ÂÙ%óĐ·ÈÙ½µ.¥Ù“¹ƯN§ÆÛ×·‡‘×8çÁĂ›¾º£ä™‰kß [ïSÙ½8¤‡×±»ÁỮŒÚ,ù×í‡9¥‡§ô—Ó‡Û“¿‰ß»û庩‡¥2ßëM§ÔẳăˆŸ;ϺăˆŸ¶Ú½ô½ÖƿŻؿӕÚÅÓ©Øû»ÁăˆŸ;Ç"çÚ™‰kß [ïSï»ÏÅ™‰kß [ïS›v³Ûº‘Æ‹«-‘Ž¿ØưÁơê½¢äÑÄëÅn‡áêêØ¿ëÅÂơê߈±»ÏÅñÓ›¾«ÔưÀߌÛ,½ÔĐÓ‘ÔͼăˆŸ;ÅÓöơÔå̉ ÓŨØÎÔ±»›Ú«‡“ÍjØÅêµØŒ½™Ôÿ¯¶¿ø«‡“ÍjŸ}ƒvŸÄĂÙ®ƠƒvÏÅëöá±»ñ–™‰kß [ïSí¥­Ä¿ÏÔÛºÏÅ߈9¥‡˵¡Ô%«dÏÔÙÜ¥µôÏ̉¿­߈ù¼ÀĂ »ßÚ˜ô©Ç·‡‘×8çÛ«‚ ½99¥‡×ÙƠû9¥‡»ÓŸÓ…»©ƠÆØ +›¾ËÉ9½ùוŒç̉ÙÚ½¿Ø™‰kß [ïSÑÄë¨Ø +Ú×óѼô½ăÁ¿»¯ƒ« +>’ǽÏȹڱ»çڭijñÚé‰ñ5ñ·™‰kß [ïS÷‡ÙÅ럡ÏÔό׿8‡×Ѷ™‰kß [ïSÿ¯¶±»¡ÈƒÚÅÔăÔûÙ°»ÅÂçÚÅ·¼Í7ơÔÙÚ¿¡±»ăˆŸ;½€Å±ÏƠÁÛƒvóÓ—¶ÿÚĂÙơèÅרơ÷ˆƒvÅÄù×… ƒvÑ»ÙÚ‡ÚɶÍĂÁ|Á×°¿çôÁù꿹Ÿ}˶½߈ëö½€˜‡ ±»›¶éÏÅÅ¥ÇăàÙÚ9¥‡˜‰j̃ZîSåĂüÚ ƠÛ«‚ ½9Ç%å̉ §ô°»±”°»­½¼ÓÆơ$Å“ö©Ø§ØÛ«‚ ½9ËÉ9—¶ÿÚƒÖÙ½߈›¾±ÔơÔ±»Ù½ÀĂщù×ÿ ½Ô£ØÚ çÔ¡­Ä¼éÿí¿³ºóù×gÏÚͼåñ»ù×ï ±ÁÏÅÁ̉±»ƯéĂÙÛ½Û×ǽ­½¼Û«‚ ½9Û«‚ ½9€Ù¡È·‡‘×8çóÔóÇù×ܾŨ™‰kß [ïS½ĂƒˆñÖÓºëöŒÓ›Ó箳ˆëÔùê“ȵØÍË)éÛ9¥ÖÔ†6¦j߈Ơ߈‡½«‡“Íj±‡™‰kß [ïS½µå½Ô釩¼ăˆŸ;ßÁ¡Ơñ,‹ÇÔX¥Ø±Ô9¥‡Ë¿9¥‡ơ穈ÍÇÛǡȃ֫‡“Íj›¾Á×ßÄÙ˜‰j̃ZîS“ÈưÀñ·¼Í7¬¿çÚÅØÅĶ··‡‘×8ç±»ÍĂ¹Ú߈«‡“ÍjĂÙßÄÙƒvù×ƠÛ«Úƒṽˆ¯ÈÍÓ˜‡íØÆÑ+•Èû›µØÍË)éÛ9¥ËuƠÙ½щßƯÙÚÛ×·Ó ¥0€ÛỞÚÆ÷Á†Ú¿‰Áå³È³·Ó ¥0™Ó™‰kß [ïS±»ó¶½ÎÔëö9¥‡ÏÔÇÏ|¥â½ÑØăˆŸ;Û«‚ ½9™‰kß [ïSëöÙ½«Ô±»Ù½½ÏÅÍÄăˆŸÆÖÅÔ¿‰°»‡Œå̉ ăîú(ǼÁ¹ÿ$ù‡ơêùệ©¼ß½8¤‡Û«‚ ½9‚¾™ô¶è߈¡Á³ÈŒ¾¥ÁđÁ—¾ÿ¯¶ơÔăˆŸ;kÂĂ¹ÚăˆŸ;ÓÆƠ¾GÿÚ“ÈÏÔßÁ¯¼±Ô8¤‡×ơê£ÇÑĂ›¾°»Û«‚ ½9Ù½ǼÛ«‚ ½9ÏÔÏŤ¾T»Å°»˜ÁÛ«‚ ½9­îª‡’̀jÙÚ麘‡gĂÙ¬ÖרđÊơÔÇ%©ƠÓ¼·#™‡±ëØÛ«‚ ½9ÁÛºÓ廩Ø×ù…Ô«Ôÿڇ߫‡“Íj¯ÜÏÔÅ–ÓÅÙY«‡“Íj­)Ù½ƒÖñÖöăˆŸ;ÅôÇÖ߈ñÓÎÔ™ÁëöµØÇÖÏÅœ·̉ ¤0ͼϺ½ô§ÔÑö‡Ö8溙‰kß [ïSø¿Ž«»Ó¼ ÁÇØóÇÛ«‚ ½9Ă åÁĂÙ™‰kß [ïSô©Ø©¼·¼Í7ĂĂ ›­±àéMöÁùê‡ñë™Hº$·ÛÏÔ«‡“Íj™‰kß [ïSù×Û€ÏÔ¡Ô÷‡ÍË)éÛ9¥ÚÇ¡ó¡ӱ»½©¼‘ӵؽÁ¹óơ‡§ÆỮß»ûƠ™‰kß [ïSçôùשÀ“È߈¹ÚÍßÿ×±½µa£Ç±»¡Áƒv«Ôáꃾ‘ơèÅùơÔ¼ùׯ‰¯0‡ŒĂ¯Ûă£ä™‰kß [ïS‹Ü«Ô“™±»ÁĂù×éÚƯ‡±ÔÁïù¾ØŒê*ªÓÿǃÏÔ«‡“ÍjƒéÓº«‰„çÚñÖơêù×ï»Û«‚ ½9ù×Ăô«‡“ÍjÛ«‚ ½9å‡ĂôŸÈÇ ù×ÈÏÅÛÄÓưÀ€ºƒÚÓØßÁñÓ“Ơ¨¼ưÀçï½Û×Á̉ßÁ©ØƠûØÅÍÚ½ŹÏÅỗˆ±¿ͽ¹Ú‡·ÔÏÔăˆŸÙÚëöÙÚƒÖ°¿·Å›ÚŸ¿ǺôçÀ߈ñ‡¼ë­Ä™ëéå‘ ªÓ±»•ŒÑÄë½ù×9¥‡âˆ:íÚ·Åơê¡ÇÿÚâ๮¸àƯµç̉­½¸ÚËêÏÔÛÄÓ›¾°»óÂ÷ÁÏÔăơ½€ƯîÅ–߈£ä±»ŸĂÅÔù׺ÿÚƠ¶ë›¾8¤‡×¹Ú«‡“Íj¹Úÿ×ư£»ívæÚ§£ùסÈÑӡȫԗÓÓØ˜ô“ÏÅ™Á›Ư¶‡Ö8晉kß [ïSƯÓ €º·Ó ¥0›¾ÖÔ†6¦j™‰kß [ïSÏÔ²ñÚ«‡“Íj†×ÑÅĂºÏÄ@¿‰̉ÆăˆŸ;Ú×ơê§Ôç'·‡‘×8çơÔ߈ÏÔÛ×ơÔºµØ™‰kß [ïS𻫇“Íj̉ƹóÏÔ—ơƒÖÑĂ“ +ÙÚơê±ÿ¯¶ơơÔù×¹̃Éñ»Î 麃փvÛ׺ï½Ó†áÛ©¾ï½±»ívïÈÛ«‚ ½9ơÔÛ«‚ ½9×Ơ9¥‡¹Úƒ½Ơ¯éÓºñÛöÿ¯¶ÖƱ»ÛÀËÉ9ó™ëéå±½«·3uU›Û«·3uUÙÚÏÔ·‹Áù×­ÛçôÎÚêÓÔ±»ß»ûêÓù×Ơ›ÚÿÛív«‡“Íj÷Ú»Åôù×Û©ƠăˆŸ;½€±»ƒ¾‘±»›¾ưÀÛ«‚ ½9Ïų ߈ÏÔåôÑÀ…»î»«d³ă¿Ë‡Œù×±ëØËÉ9¸£…ÛµØÏÔù×ăˆŸ;kåà‹ˆ¿¼¥È«‡“ÍjƒÖí™Ú•Œ̃Á™ô߈£†ëöĂÙ߈§Ô˜‡ª»¿‰Û™‰kß [ïS8¤‡ÍË)éÛ9¥“Ơ‡Ú£Ø›¶é½ư“™àĂÙµ†¶ƒÖ™‰kß [ïS½€–¾ÓÓƒÖÿÚ—¶ÛÄÓ±¿ƠÅ›¹ëö·ÔµßÁÛ«‚ ½9ùêÏ̉Û×Úª‚ +¼9Ơ¥ÓưÀÏź̃ˆ‡Œ¶Ù½ßÖ•ÜÍñÜù×ăˆŸÑÓ×̉ÀÛ“Æå̉ ăˆŸ;ĂĂÛ«‚ ½9ÏÔ×$ÏÔÅØ“ÈñÓ·ôơêăˆŸ¿́ơê¹ÁÛº·Ó ¥0Û«‚ ½9ñíȳ½Øµ&¡ÔÏÔ‚Úª‚ +¼9¶¼Ôơêó^‡Û«‚ ½9ù׺߈öÙÅë½€›¶éƒv²È÷±›¾ç̉°¿ăˆŸÿ¯¶½ÙÚ§ÔíÖ·Ü«ÆûØívù¾ÏÔƯº߈Û×óÔÍƠ߈ù×±»“ÛÑÓ°½¯ƠóÅÓƒvăˆŸêÚÎÑÓƠǺ©‡¥2ßëMǼÅÓ‰¿I™ôâˆ:ÏÄ™‰kß [ïS›¾ÏÔ‡ñÆ¡ÈѶôƯÓ »ÁÛ«‚ ½9Ơă—¶ͺ̃ˆ¥ÛÅÙ¡Á²Â ëöù×ù×­Ä´ƒˆ±»Üå¿çô™‰kß [ïSÛ«‚ ½9“¹ƯNưäơçÅØÏÅÏÔơØ÷ˆ»Ă‡¿ÿÛ«‡“Íj¿ÅÛ«‚ ½9ăÇíÂíÖ¹½ÙÅë¡Ø·ÅÏỒÓæê"Ù½̃Á©¼†ä¿‰ö›¾·̃Á½¯¼É6¡È°¿ ߈ÑÄë¿»9¥‡™‰kß [ïS•Èû›•„ưÀ™‰kß [ïSĂŸƠÛ׺™‡±»ÛºŽ’Åó#§Ô«Ñ߈ÑÓ™‰kß [ïSÍÓÄôµØơêÁŒăˆŸ;Ơ¹ÚÛ«‚ ½9½Ôï ĂÙơÔÛ«‚ ½9Ï̉û¥øĂ½‹ÈÛ«‚ ½9ª-¢È³˜‡ϺƠóăˆŸ;˜ ê è ä ¾ß¥Æ±»Á‡é/×:ö«‡“ÍjăˆŸ;Û«‚ ½9ơ‡ñ5ĂĂăˆŸ;ŸÖ‹È·‡‘×8çµØâƠ9¥‡°»«‡“Íjˆ°êØ›¶éºù×°»ív«<½ëö—¶‡½÷ÔÛ«‚ ½9Û«‚ ½9©å«ÓëöÛ«‚ ½9ÿÚÙ×ù×½½Ù׋ÓñܳǼ‡ÙÚǼ±»·ØăˆŸ;×Ơ¾½×Ơ†7§jùơÛ«‚ ½9Ûºëö­€ÇÜöŽ¥ˆ]1¿ôăˆŸ;ßô™Á߈ÑÓ«‡“ÍjÅÓÑÓï½ÿÚăˆŸăơÙ½ơÔÏŇۿèƯÓ —ˆ—¶©Ü̉Åù×߈ƒØơÔ›¶éóƒ¾‘ÓØĐØóÛ«‚ ½9ø×‹Ûçǽ™‰kß [ïS½€9¥‡¹ÚÛ«‚ ½9Ù½ƯÓ ÎÔ!ÂÇÓµØ×¾Åô«‡“Íj¿»™‰kß [ïSÿÚ©‡¥2ßëMŒÿï³2ï»ÿÚ¡ÔÛ«‚ ½9’¹ÜNϼ˜‡ÑÄ뫇“Íj9¥‡Á¼™‰kß [ïS¥ˆ]1ù×…»ÄÀ¿e®× +£Ø¼ƒ½»ÅÅÔƒ¾‘đÁ»Ù½ÙÅë߈ö¹ÚĂÈ‚v¹ÚÙÚ£äÍË)éÛ9¥Û×»Û«‚ ½9߈ñ½ß»ûÛºׯ©‡¥2ßëMßÁÓà¿Ø·Å¾éê·~ưÀÑíÆÛ×ø¾™à¬Ö›½öñÓ³çǽ€—¶·ÔỞ™Ó«‡“ÍjùêÆÁƒvÛ«‚ ½9Á‡é/×:ÏÅÙÚ›ÈµÜ…ÚÆóÔÛ«‚ ½9ùº‡ŒĂÙÇ÷߈†Œ···ÔXíÆóÇ“½À¹öÙÚ™Á»½¥Æ¶èÑÅ™‰kß [ïSï̉÷Áùåù×°»¼ô“ÛÏÔÛËƠ±‡ëØÛ«‚ ½9«·3uUÏÅêöÙ½™‰kß [ïS߈™‡«‡“ÍjÂÿ¯¶¿Ú߈«%¯¾߈ï³2Çá¡Ôëö™‡߈̃ˆÑÄëÏÔá ö«‡“Íj…ƠÙ½™‰kß [ïS«Ó“ƽ£äĂ Ó‚v9¥‡½ßÁÁ¼©‡¥2ßëMù×ĂÙÅØùô«‡“Íj“Ƶ†çÚ™‰kß [ïS…©¼ר³ÍË)éÛ9¥8¤‡íÖºÚª‚ +¼9¶66ÁƯÏÄÑÓï½ĂÈæÚ¡ÛóÇư؃«‡“Íj½¥Öß»ûù×ÏÄ@ÑÓöíÅ†Ú ÅơèÅö–Ó÷ÙÓ.‹ÇY¼‹Ü¹Ú«‡“ÍjÅÓ™Á­Øëö‡ºö—»·‡‘×8çĂȱ¿ĂºµØŸ}ÙÜ£ØÉĂº߈©Ơá «Ûơ꫇“ÍjĂô”Œ8™‰kß [ïS«‡“Íj‡ăˆŸ¾ôĂÙơú”ŒÏ̉¯›ăˆŸÙÚ÷Ú9¥‡§‡ơê¡ÔÙ½шÏÔÙŒë*«߈ïڥǽ¹)ƠïôgÏÄç'”Ó¢»Ù½¡ÈÙÚ́v‹Ç“Ơ¡ÙÚ½€Úª‚ +¼9Ơơê߈¡Ôªd¡Áñƽ¨ºçô₫$߈9¥‡©‡¥2ßëMëÓ™ôưÀ¿́¥Æùꙉkß [ïSÙ½ºykß [ïSăˆŸ±»Ó̉߈ăÅ™‰kß [ïS“Ơëö‘̀«ÔëöÆÅö½Á½Ûêå̉ ­Ä§ÔăˆŸ;Y¿ĂổÁ…»¿ß‹ÍË뉑³(½«‡“ÍjØÓ±¿™‰kß [ïSé‰ñ5ñ·±»÷Á›¶éưÀÏÅø×߈ÏÔ±»çÚHÍË)éÛ9¥ñÓºy…ô¿ôù×é¾ĂÙùêÏßử¹ù×½ßÏÙÚĐÓ«‡“Íj«Ô¾«ÓÛ×Û«‚ ½9‚vÏÔÛ«‚ ½9ƠŒĂÙÿÚÙÚĂ߈ÆØï³2ÉĂăˆŸ;רơꃾ‘¡È§ÔÙ̉“˜ŽÆ̉ä×߈ƒ½éêÅÓÁ×™ëéå­Äµ‰™‰kß [ïS´ÂÅØ‹Ü߈©&ƯÏÅÿÚ÷ÎƠ±»9¥‡9¥‡ÎÚ¸ÚÛÚᙇÏÔÚºÙ½ƠXƒơÔµØÓ¾ơú›¡›¶é9¥‡Û«‚ ½9Ë̉Ï̉³Æº̉ Æ̉»“½́Ʊ»÷Á«‡“ÍjÙÚáêÓܽ€ÏÔ„ÚÁרÁĂ”'½ä̉±»Û×±»™‰kß [ïS§ÆÑÄë‹Á×Ơ†7§j¹.ÙÚưÀ§Ô­ÖƠÛ«‚ ½9ôå»öÁáêƠ¿‰°¿ÖÆÑÄë߈9¥‡¿ü߈©Ó¡ƠáØƠXù×à= ĂÙăˆŸ;… ƒ½Öûͧ·©‡¥2ßëMÑÓăˆŸ‡«‡“Íj߈¹Ú—¾²Ø9¥‡×Û«‚ ½9£äóÂùê‹ÈñӾ䫷3uUăˆŸ;k—»Ç¥Ö«‡“Íjï³2ÁÓ«‡“ÍjË̉«‡“Íjëöó°»ÛǾº߈̃ˆƒv‡×¾/øơ›¾¹Ú׿8Æ›·Ô«·3uU™ôÏÔá µØ·ô߈™ăƒvçÚø¾æ'™‰kß [ïSùë«̣çÚ±¡ÁĂƠá ùꇺƠ©º߈ỡÚª‚ +¼9ÿ¯¶—ˆù×Ù×¥ˆ]1ăˆŸ;µØÏÔ±»ª¶2tTå̉ ÄÔüÆ¥ÆăˆŸï»¾»»ÁÓÔ¤ˆ +\ +0 +éêŸ̃¹Ú¹Á‘Ú‰Ûソô±»æºƠÛăˆŸ«Ô2©ØăˆŸ;ƯơÛ«‚ ½9ËÖđÄ,ùׇºë¼ăˆŸÛ«‚ ½9ÿ¯¶‚vÓ´›Ûé˽ÁưÀ‰ơƒ½·Å›ËÁ½€ƒ©ºù×™‰kß [ïS«‡“ÍjàĂAÁÚ¹ÁÛ«‚ ½9™ơơÔôê½ô‹ÇơêívàÔ›¾å̉ ÿÚ½Œ·‡‘×8ç½Û“ƠƯ÷ŸÖÂÙ¿ôµ.¥ÙÇÖÛ«‚ ½9™‰kß [ïSÛ«‚ ½9̃ˆ9¥‡«dº«‡“Íj³ ¯ßÙÚ¿‰º 釯ӺyƯĂȹÚɇ¿Ù½€߈ÿ¯¶âˆ:ºôñÚơꇌٽ$«Ô·‡‘×8çÎơ!çÚ¡Ư߈ù×íÑÁƯëÓ9¥‡9¥‡¹Ú“ÛÛ«‚ ½9ĂÙƯÓ ÅÓ¡»±Áëö¹½ù×—¾©¼ß%߈ÇØù×ù×Û«‚ ½9¡Û£ÇéÇ9¥‡ĂĂ ›­±àéM­½¼´!óÔ¡Ư‚vóÇÑØÙÅëơÔ½Û«‚ ½9«‡“Íj½½ù×ëÔ߈›¶éµØûtăˆŸ;ăÇíñÆù×éÓÖŸƠ¾Åϼ×Óö›¾ç½¾ăˆŸ߈¡ÈÇÑ×ÏÔëÚÿ¯¶ÅؼØÁƯDZ¹Ú…ô߈æºƠ«‡“Íj›¾ÛÄÓơ꫇“Íj±»—˜ưÀ¹Ú÷Áшơëöø×¨¼³à›¶éơÔÙ½³ÈÛ«‚ ½9ưÀ±»¾¡Á™‰kß [ïS±»ëÔ«‡“Íjđ¹̃˜ ̃÷Á»½ƠơÓăˆŸ«‡“ÍjÅÔ™‰kß [ïSăÁÇÖÏÅ˹“¹ÚĂ퇰»ĂÙ¡Ûÿ¯¶…“§Ô¿́µÈï‡ËÇ‘øÏÔÅÔ‡ŒéÓÙŒë*«ÿ§àêơĂáêñÚÛ«‚ ½9ÏÔ™‰kß [ïS„½Ø×sÁƯׯ‹ÜùêéÔăˆŸ…Öô«‡“Íj«‡“Íjª¶2tTƒvÏÔËÉ9Ù½ù×Ơ‡Ç°»¶‡Ö8æ½ÁƯƠơáƠ÷Ù·‡‘×8çŰ×$öÁï½—¶ºăˆŸÛ«‚ ½9ĂÙÛ«‚ ½9ù×±»*ïƠ©¼™‰kß [ïSÑÓƒàÛ×ÿ¯¶öôêƠ“Ơä࿽‡x‹ÇÅÓ󹙇۫‚ ½9¹ÚÖ¾ÀĂ¿‰›¾ăˆŸÿ¯¶Á½óÂù¿åĂ¢X¶¯×£»ƒ×«»±»±¿©ôÁƯ߈½³àÁ½ĂÈù×ăơÍË)éÛ9¥ĂȽöëö«»ßôņÿ&™‰kß [ïSăˆŸ¡Ô«‡“Íj‘Ö‚ƒ½›¹Ơµ†ƒvơĂơêÏÄ¡»À‡€è/Ö:Û­vóÂɇɇƠƒÖͽÙ̉Ổÿ¯¶ʾß»ûù×ÏÄÛ×щ‡x™w™‰kß [ïSßÁØ×ñÓÿ¯¶ëöƠëÚÿ¯¶±»¿©‡¥2ßëMÛº…»Å£X¿‰ëö™‰kß [ïS8¤‡…¿¹—ÖđÔùט‰j̃ZîSăˆŸ߈9¥‡߈Ÿóe«Ôƒ½ÙÚº½°» ËÉ9ô›¾« ©ƒ»5ÇÖ°»ÑÓ—¶éÓÁؘĂÙÓÑÓÛ«‚ ½9ẳ—»ÁƯ“Ơä̉ÅôăˆŸ;ö˹£X˜ÛÿÂÑØ¨ØÿÚûØ¥ÓÛ«‚ ½9‹Ü¹Ú¡ÁÁƯ¡ÔÏÅĂÙß»û¢ÇÖ¿“Èκ¯Èăàå̉ ±»½×ƠăˆŸ;k‹Ó·ÔûƯÙÅëÛ«‚ ½9ăơ·¼Í7•Ô§Ô³ºóíÖ…Ö¿ß³ô§Ô±»öăº½ơèʼn¿I½€â½ƒvơềĂá×½€÷ˆ«‡“ÍjỊ̈©ˆ¡ÁƒvÑÓ™‰kß [ïS÷$ÿÂö‡Úøơ«‡“ÍjÚ×…Ö‹÷ëöëöëÔ‹Ü›¶éϹăˆŸ;́ơ ”ÓÛ×ùê™ëéå£äù׸ڙ‰kß [ïSÛ׿߿ŅƠăˆŸ;¡Èƒv®¼ƒÖ£ÇÙ×ô«‡“Íjùê₫ÇóÇÙ½ƯÔăµØ­ÄÙ½ù×Û«‚ ½9ăˆŸ;kËÓ«‡“Íj©Ó™‰kß [ïSȵƠ›½­™‰kß [ïSøêÏÔ½€º‘ÖÅóÂϘëöÛ«‚ ½9ÏÅö±»©‡¥2ßëMÇâ¡ÁÓ¼ĂÙ́ «&¡ÛÁĂ¥Á½ÜÑñÆ”%éÓĺÇ“ƠÛ«‚ ½9ßÄÙåÁ‘Û¹Ú™‰kß [ïSăˆŸ;‰¾ÇØó¶ŸÖăˆŸ;9¥‡Æ̉ơèÅ߈Úª‚ +¼9ơĂÏÔŸÅ߈£ÔÛÄÓÛÄÓ±»ÏÄ™ëé埳ÅÔù×êÓ™‰kß [ïSÁƯ½щª¼°¿ăˆŸ¹Ú¿º¹Ơå̉ £Çß„í½¯‰¯0ỒÂÑÄëăˆŸÙڃ׋‚Á½é꿱»ßÚĂÙ(ÏÅù×ÙÅëÍÓö«âƒˆñÓÆñÓ¼€§-‹½€ÙÙ½íÓù×·Ûÿ«‡“ÍjÛ«‚ ½9̉Ø·‡‘×8穇¥2ßëMÛ«‚ ½9¹Ú«‡“Íj¬Öơ½Û«‚ ½9ÅÙ½ƒÏÔ¾ñÓ·‡‘×8ç²ÂÓØßÅ„—Óù×Ѷ±¿åŒù×. ƒºy«Ô«Ú÷Á °¯«ÔÙŒë*«¿¹ëỤ́ÇăˆŸ;±»Ù½ºÙYàÅϾ¥OÅØ•Œ½ƒÏÄ¿ºÙ×ÓØåĂ9¥‡µØ¿ôéêăˆŸ;ר߈ÄÖ¹ÚÛ«‚ ½9áƯ›¹ÏÅưÀƒˆ©Ø¨)ƯÚí—Gͪ™ëéå߈ùÇ¥ˆ]1߈ù׃׆Ǚ‰kß [ïŚv߈ù¿ëöÀĂ#©)—»9¥‡…Ơºù×ÙڟŹÚçÚĂ Èϼ‡ÑÓ÷$›¾™‰kß [ïSëö™‰kß [ïS«‡“ÍjĂº›!›¡Á•úÑÓƒÚ¡h¡ÈÅØçô³Ç¿é߈—ˆ­7¯ÛưÚ½߈ñ×­¾ăÁƒv߈ñÆÔƠ½ÿ×ÙÓ¾‰óǤˆ\0Úª‚ +¼9çÚ‹æÄôñÚ™Óñ×÷‡µØ›̃óÇÚ߈¹ÚơêщơԋܧӾ¼ ­Ö±»“ÈÛÄÓ›¡¡ÈívÑ¡ăơ©‡¥2ßëM½€ëö̃Å«‡“Íj¢äóLjÇù×ÇÛºƠ™Ÿ\½ç§ôá ½Û«‚ ½9±»÷ÁéÓĐÓÏÅơÔ߈¿<Úª‚ +¼9“¹ƯN¹Á—ˆ¿‰—ˆ¡Á³à¿ç­Äá ÆĂƒˆ¡Ô½ÛÄÓÑÄë°»ßÄÙÛ«‚ ½9«·3uUå̉ µØñÚÖ¾8«×Ѷ›¾©ÓÁ¹íÆ™‰kß [ïS«‡“ÍjÙÚ½›Ú½Á§ºơèÅôø$°¿Ô]°»“Ơùê߈÷$ÅÓ́º «‡“Íj߈ÂÙ¿»ɹщ³È¹Ú·ÈƯÓ ÏÅ÷Á«ÔñÄË̉̀åÛºơÔ¯ÈăˆŸ;ÙÚÏÅ·ÔÿÚửơêç̉Ž“ÈÆ̉ùô“º߈ă»Í§Ô©‡¥2ßëM’Æä̉ + +ÁÛ×í—GƒvÙÚñÓÔ±́ÏԕǯG‹øù׫‡“ÍjÛ«‚ ½9»n·Åµy߈߈™‰kß [ïS˜‰j̃ZîSóÇơԩܽÿÚ¢»8¤‡§Ó½ÜÏÔưÀ•LJÚó#û¼ù×9¥‡½µa›¾¶ô¡Ûÿ¯¶¿ºÏÅå̉ ¦ÓÛÀ߈ëÔĂÙÛ«‚ ½9ëÚÙ«ÔÏÔ¼ÑØÙ½›¾×¾‚½©‡¥2ßëM·‹‰ĂÛÛ×߈™‰kß [ïS‡Œöê±»ïĐƒÖ¹â…•ÇºÈ +8¤‡›Û«‚ ½9ÁƯơÔ±ëØơèŃvµ‚v ªÓå̉ ăˆŸÛÄÓÙÚå×Û×Ùà¼ơêđÁ߈ơĽ±º½ôêüŸ½ö©¼÷ÚƠѶÏÔ†½?ẳ罫‡“Íj½»½—»½µØªÔ8¤‡™‰kß [ïSÛ«‚ ½9ÛÄÓăˆŸµ‰ç̉÷ÚÆ»ÏÅź…Ø«‡“Íj“ +­v¯Û«‡“Íj±»ăˆŸ;˜Ă™‰kß [ïS¹àÛ~ăˆŸ;kËÇ«bƠXɹ‘Æ›¶éÉ̉ÑØ¢Ç“³ƒvºØ†ºëöùå÷ˆÙÚÑÓﻫ‡“Íj€Ơ«‡“ÍjéÚ‡ºÇÖ«·3uU‹ÙëöƒvÛ«‚ ½9‡ÜÚÄ̉ƒïƠ…ÔÇÖăˆŸ;k÷Á’Æ‹ÇăˆŸ;Ѿ‘Ù½ÏÔÏÔÚª‚ +¼9­ÄÎ ́™ëéå›Y¯×ăàùêåƠÛ¹öÁÿ¯¶…£­°»ßÄÙ—»±»¡ëö«·3uUÁ̉Û«‚ ½9—¶Ă¼‹Ç½ƒ½ª‡’̀j«»·º·Ô§ÆÿÚº÷Ù9¥‡Yñö“Æ×Ăÿ¾£Ưëö±»‚Ö»ưÀđ»ØƒØ“Æ™Ơ߈ËƠƯÓ ‹ÇÚÅÄ©ºϺÙỤ́‚½«»û*ÿ¯¶÷¶ÇÓÅÓƒˆ÷Á©Úù׳ºó¹óÛ«‚ ½9ùë»ØÅù×±»¹ÿƯÅÔưÀ“Æ«‡“Íj߈¡ÈÂßÁ±»½ăˆŸ½ưÀ…ƠµÜƠ¿ß»ûÛ«‚ ½9÷ÔÊƠ!ÍÄù×Ù̉¯¼Üÿ§¶Å凳ٽå&ăˆŸ;¿ßăơƒvÊƠôĂ¡á¤Æöù×Ởù×±»å̉ »Áø×±»Û«‚ ½9ƒv·‡‘×8翉¿́­Ä§Ôívº‚YÛ«‚ ½9̃ˆ₫Óº…ŒÁ̉ưÀ‹Üµ£ǾvóÇÛ«‚ ½9‹Ç߈­ØăˆŸ;ƒv߈…nÇÚÅ·‡‘×8ç¼Èß»ûÏÔÿàưÀÙÚ߈ơĂ¥¾߈³ºóù×ׯ¿àƯÓ º² ù×˾ÏÅ߈ëö½­ÑơèÅù×Ù̉ÿ¯¶ÙÚ½ñÚáê¡ÇÏÅ̉ºÍÓï½ÚׯG‹øÛÿ¯¶÷ˆ±»߈%ßÖ·Ó ¥0¥ÖĐD¹•³¿̉߈µØ§Ø¶Èª‡’̀j¡Á߈ăàŽÛÄÓđ‰!¥Øëö¡ÔíJ½¾‡­ÄŒ½ ÏÅ÷Ô¿Ùÿ&ƒƒvĂÙ«‡“ÍjÓØĂȹÁƠ«‡“Íj¡Ûψ¥Ïôꙉkß [ïS™‰kß [ïS‰y½ÜÛ«‚ ½9ơèŇÛñÓöÛ«‚ ½9ûÓ©ØùêǺăˆŸ‹ƒvù׸£ó‹†äƒù×÷ÁñÓù×ó«ÔÛ«‚ ½9½Ô½çÆ€º‚ƒÚÛ«‚ ½9ÑÓ½©‡¥2ßëMßÁßƯÙھ麺ø×½¼‚vÏųƒùꙇÁº߈ÙÅëù×ÿÚ§È×¼­Èùêµaë¼ÏÔ›¾ĂÈ˾9¥‡‹Üëö±»å̉ ÙÚÛÚà½óóĂ÷Á¡Û£Ư«d—¶‡ŒÏÅ9¥‡ù×ͳÈơ¹ÁăˆŸ;¯×ÏÔ ËûׯíÂ÷Úï½ñÓ°»ÍË)éÛ9¥À%–¾›ÛăˆŸ¯ÈÆ̉ñÓáêù×¹ÚÅÔÛ«‚ ½9ÙÓ¯ÈöÏÔ…Ç¢ÈđÆÛ«‚ ½9Û«‚ ½9ɹºÙ½±»Đ¾ơ곺óëö߈ËÓ‹ÜØÚǼ½€ÛÔÇ̉¥ˆ]1ĂÅÁƒvÀ±»“¼§Ó«Ó…n±È’Ç›Á‹Çß»ûƒv™ÓÇÖ¾‹ÙçÚĐÄê§ÔÑÓóÇϺô­Äº†³ÂóƒÖµØÛÀÏũӜԵØư¸Á“‰3Ơ,ùÜ*½ù×9¥‡8¤‡ÿ¯¶ƒˆ¹ÚñÚëöøơ¡ÈÙ½ׯå̉ ®Èơ»‰ù׫‡“Íjï»ëÓÙ½ù¿¹Ú¸Ú ³ºóĂÙ›ÚÛ«‚ ½9æƠ—ˆƠºmﻫ‡“ÍjêöÙÚÓØôêăˆŸ;êöƯÓ °»Ç»™‡ºÅÁÊÈ9½ôÑÓưÀëö¡ÁÀĂûÓ«‡“ÍjÚª‚ +¼9™‡§«‡ÛÛ×çÚù×óljæêÚ·¼Í7ÑÓƠ­ÄÑĂ¹ÁÁñ»‡ÇÆØÖ$¶Å“ƠñÚ±½”ÖÙ½ÙÓêö9¥‡ŸÅë;ƒv™‰kß [ïSù×öÁÙÚÑÓ‰y÷Á±»×¾ùº°»¹Ú¶ºÚ×ÿ¯¶´a¿‰—¶ï½¡Á—¶›¶éÏÅơèÅÛÄÓÏź™‰kß [ïS‡¹¹TŸÅ“ƽ‰߈ö¡ÁŸèù×óÉëö¼öÁÚ×åÁ‰kß [ïSăˆŸ¥‰ÍL…Ó'±»äÁƯăƯÓ ™‰kß [ïSŸÖ¹Å½Û«‚ ½9ăˆŸ¹Ú±óù׳Âù×ÏÅÀ߈à=Ú‡–ÓÙ½™‰kß [ïSƒv™‰kß [ïS¶è‰Ëéö̀Ó£äăÁÅô«‡“ÍjªĐ±»ùׂˆĐÁ½€߈“Ơ“¼ÏÅü%çÚ«·3uU÷Ú́º—Œ—Øăà°»ÅÄơê“ÈÚÆ¥Æ½ÙÅëÏÔÍÛÊƠ¡Ơ¥ƯƒvÑÄë‹ÜÏÔ÷ÚßÄÙù×™‡™‰kß [ïSù×çZ¿‰¡»×ù°»¾» Ă¼Ư‰ù×ÿ¯¶ÏÅÜÚ™"­ÖöÁÛ«‚ ½9™‰kß [ïSÀĂ÷Á¯ÛûÖ¡Ó«‡“ÍjËdž׭R™ëéåơèŵØăçÚö³¹ívº•%¢XÓØơÔ߈ר©ˆƯÓ ™‰kß [ïSÅ›¹ơºƒvÙ½Û׫‡“ÍjßÄÙƠ›Úχ±»ôØăÁơÔéêöÁ߈ÑÓĂ½ô߈ÏÅË̉éJé‰Ó5“gesÁÅăˆŸÏÔƯÚ•º¹¾×̉ÂÖ߈ó•‹HÔ™Ó߈ÁƯ·Å9¥‡×ĂÙƒv9¥‡ÑÄëĂĂ ›­±àéMù×ÏÅ¡·Å«ÔͼŸ}ÏÅ—¶Ơï½óÂ¥ˆ]1ăˆŸ;·‡‘×8ç¡ƠĂ¯×ÅØëöƠŸ}á äÁơ’ưÀóÔ›v߈±»ÎÄ…ØơêÄÔ§ÔïÚï»߈¶Ô߈•ö¶ÜÅ™ßɇ¥Ø÷‡ĂÙ©ˆëöÿÚ9¥‡öƒv›¾ăà߈ÂÈﻃvÙ½ơÔ™Áÿ¨"ù×›vëö½€Û«‚ ½9ö«‡“Íj€º»ĂÀƯø×¦ô™‰kß [ïSﻇxù¿«‡“Íjàöå̉ ƠñdžÇïƠƠ¼çÚÚÀ‘Æ…×½ßÄÙ±»ÙÚƒÑ̀µaׯƒˆ9¥‡éÓ«‡“Íj¿ÅÙ߈9¥‡ïƠ™‡ƒvƯâáÖăˆŸ߈Ï̉é‰ñ5ñ·ù×ÓØ«‡“ÍjĂÙưÀÏ̉˜‡ơÔ‡“¶v¿º·Ô߈“ƃؽ‚vÙ½«‡“Íj̃ˆ>ƒÛºÛ×Ù½ù×Ù½°»£Ư×¼ÏÔµØÁÓëöÏ̉®¾ ¿ØÁƯ°êسǙԃv°¿™ëéåó#߈‡Û‹Á߈½¿‰ơêß±ÙÚ9¥‡çÇ•ăˆŸ¾œÁÛ«‚ ½9¯È•½Åô•Û̃½«»Ù½ÓÅ» áÙ?¡M-ËơÛ‹ù×!#¹ Ơ ×Éùư • +‡¹'ư¥íÍË)éÛ9¥ÏÔÁËĐÅƠºmơÓØùêƠ(™‰kß [ïSáêùêëö¬¶¯Èæ'ÂôùêÙ½™‰kß [ïS߈«Ôƒv§Ơƒv÷Á«‡“Íjù׺øôóÂơêå×ÁƯÏÔ©Øëö»ôÏÔâˆ:jÅÔ¹à¹ÚÓº߈µ!íê»yơèÅƠĂÙ‡Œ«‡“Íjăơ½ÅØ÷ÁăˆŸ›¹ÏÅù×Ô—¶Ăٷž־½ÁĂÓº¹ÚùëµØÏº½ăˆŸ³×ß–Á¿ßù×ßÚ†ŒÿÚ°»ëÚö˜‰j̃ZîSơÄ¿»ß½ÓÆăÇíǼ™ëéåÓÇÖÙŒë*«œ¿™‰kß [ïSăˆŸ;“ÈÛÔÏÅ«·3uUÙ½¡ÔĂăˆŸ¡ÈÉÙăˆŸ;Ñ·ĂÙñÇơÔù×ưÀ¡ÛÙ½çÚÁ›đÛ«‚ ½9éÓºÑÄëÈó¡Ô™‰kß [ïSÛ«‚ ½9̉âëöƠ½ă‘­¶“ÛóÂ߈߈ơÔÑÄëŸÖ׿8ƒv±»¾å»íê©Ó¿‰ƒvö¢ÇÓºªÔêÓ›¹ÅØ«·3uUÏÅ™ơéđÉ̉ăˆŸ;̣Ç«ÚíÚ¹¾߈ơèÅÅÓơê·Ôùê¯Èëö°»ר½ÏÔÛ«‚ ½9ßÚéÚ£§êÚ÷‡¡Ô‚ öÁ½̉ÓÏŹ¯¯ÈĂͼ߈Àw½ôŸÖăˆŸ;°”½ÑÓ9¥‡×¥ˆ]1ơÔŸÈ¿ºßÚ­¾•Ê›‡‚ா«‡“Íj‹ÜĂô¶è˹ÛÀÑÓ™‰kß [ïS̀¬H™Á™‰kß [ïS߈ר¡Á‹È§ºéÓ·Ô›Ô®¾Ơ‡Û™ÓƯơ¥‰ÍL…çÚ¾ºƒv±»‚vëöù×ÈĂù×­ÖÅÓÛ×ù׿ôÁ¹ Ëû¶è£Ơ½Ô·ÔÈĂ¹Úß»ûƠÄ…ÂĂºµÅƒׯ±»˜‰j̃ZîS™‰kß [ïSƒ¾‘¾Ø©Ó«‡“Íj™‰kß [ïS©³ÂÁ½́v½Û«‚ ½9ËÉ9‚vó¾­Äôú4ù×·Ô«»ÑŽԃĂÛº“½«È¿ÅÏÔÏÅá=µØĂÙû¬Ä™‰kß [ïS¹óăÇí›Ú…Ô¹ÚßÁ›¶é»ơeùׯÈï̉ßÄÙØ¡ÛƒÚ¡ÈÏ̉¹ÚưÀ±Á‹ÙÙ½‡º¶è‘°µØ§·¹Úç4í‡óÔ°êØ½±»ËÇơÄ«‡“Íj™‰kß [ïSù×ßÅ×Üù¼ù×ÙŒë*«£äÇ"ơÔ÷ÔÙÚöñÖ߈“¹ƯNưÀ«‡“Íjº¹Á•%ÍBÁ¹µØëö߈ăˆŸ;³ÈÁĂÜׯÇÖƠXúÛÀÁƯá=ÍÄ™ëéå¹Ú‡Œ‹ÇÅ«ÔÙ½›ÚÓÁƒv†ºë“佋Ç߈ÏÔ¥â9¥‡Ăà߈½«ÚơÔ¡Á÷ˆ˜êèä߈ư×ù׳”‡xÏÔ—¶Ÿè§ôÏÔÍ̉éÓ“Èó“ÑÓ¿ºÏÔÍÄâêµa™‰kß [ïSÇØ…Ơ±Ô±»Û«‚ ½9½ù׃vàñàÚûÓ‡ŒÓ̉·‡‘×8çïÅưß»ûÎ̉½ô9¥‡߈߈­Ä·Ô«d§ô›¾±»÷ä5̉˜ĂăˆŸ;këöÛ«‚ ½9ÅÀüÀ›¾ä̉¥’„ éÓË ³È±»ăˆŸ¥ˆ]1¿Øßô›¾ÑÓăˆŸ‰đµ†äï—»ù׋ܽ‡“ÍjÙÚơĂóºÚª‚ +¼9ăˆŸ;k¶llºƯÓ ·ÅÏÔÙÚéºá ¬¾ơêÉĂƒÙÓ©À«â™‰kß [ïS©Ó÷ÁÚª‚ +¼9Ÿ\‡߈×Úǽ±¿Ùת‡’̀j«‡“ÍjÏ̉Åï½µØĂù×ÿ§–¶‡Ûƒ×ù×Û«‚ ½9¿ô½ÔÎ̉ÏÔ«‡“Íj‡ÇẳñÚƯÓ âơư¦Ù½ỂÛ«‚ ½9‹ÛÏÔ×¼È̀ưÀ“ºô±»ÅÄëö·Å‡ñ5ÅÙ×Ù‡Œ³z‰±6ñÚĂ$Úª‚ +¼9ͼ—ÓÛ«‚ ½9‹Üƒ×¥ˆ]1̀Ó ÔÄ«‡“ÍjºÁ½»ÇÙÜ·‡‘×8烉Ûù×÷‡£ÓăˆŸ;ôêµ‰Ñæ«Ú¹ÚăÁ°»áÛÛºñÓ±»©¼­½¼Á̉XŸÜÍīԽ›«‡“Íj÷Á±»ë#íÆ½ô÷ˆù×±»ÆÂÙ™‰kß [ïS½gƠX©Ơ±»ƒ½ăˆŸµØƠ³Â±»ŸéùׇºÏÅÛ«‚ ½9ẲŒ¾“º“ƠºØëöỔ˜‰j̃ZîSÂÙù¿ăˆŸă¸ÍÓ߈ÅÔăˆŸÁçÚ™ëéåùë³ï‡º¯Û¼€ëö½™‰kß [ïSăİ»“ƠăˆŸ;kå­£ƯÍË)éÛ9¥ƯÓ ½ÓÓÙ½ÛÚ›¾Éø›ÚÇØÛ«‚ ½9Ù½×Ơ·ÚÛÆçÚ±»Û«‚ ½9™ÁÛ«‚ ½9¹ÚÏÔ¥º‘È—¼ª‡’̀jÑÓ¡ÈăˆŸÛ«‚ ½9«‡“Íj“¹ƯNÏÔ§Û³ƯơÔÑÓÓŽ¹â‰¥«Ñ߈ÙÚG½¹±»ÏÔ9¥‡å̉ ¯×·̣ÙººÁ ÁÖÁ†‡Áü2Á›‡¯¼ëöÚ×ÅØ™‰kß [ïSù×ïƠÛ×ÁƯóÂÙÚĂÙÛ«‚ ½9ĂÓƒÔ¶ŽăơÛ«‚ ½9ÑÓŸƯ‡ÚÆØª‡’̀j鯻¹ÚơĂ¹Ú±»ÈÖÏų̃ôù¢§ƠÈẮÆÅỌ́Çؽ —º›¾ăˆŸ;ÛºÎ̉(߈ÙÚÛ«‚ ½99¥‡ŸÖƠÚǼưÀƠXÍĂ÷î±ôïÅ£‘ÑÓ¡ÛÂÙ9¥‡©ØơêäñßÄÙĂÙŒë*«ÏÔơ‡ưÆívǺ߈ÜÓ ¡Û«‡“ÍjµØÏêƒv½·ÔËÓÛÄӺÁÛÄÓƒØăˆŸ;½ƒÚ¹ÚăˆŸ;­Û«‚ ½9«&ÏÆÖÿ¯¶‹Ç™ô±”¥Ó±ç÷Áº£ßûtµßñÆÏÄưÀø×ÑÓ·‡‘×8ç³Øö·ÔöơÔ‡ÚĂÙÔá ơê߈ù×ơº‹Óοºÿ¯¶ÅÈÛ«‚ ½9´aƒv̉Åûù¿âˆ: ÷ÔĐÓƠÁå£ÇÅ›Ă “Èù×÷ˆëö±ôĐÄê÷ˆ¹Á½€Û«‚ ½9ù¿«‡“ÍjÂÙăĂ3éÙ°»ÏÅÏÔÙ×9¥‡ÅÓÑíÏÔ·‡‘×8çăˆŸ9¥‡ăˆŸ;ƒv›¶éÁÓ˜‰j̃ZîSëö¶è߈ Ơ“Ơù׫‡“Íj‡Û‘¬߈„»áÔ¡ª‡’̀jƒvéÔ¡Û×$ốvÙ̉ûØñÓY˜Á¥ÖøêÏ|Û×ƠX¯ÈÑÁÏūԺù׫‡“Íjö߈ÙÚ‡ÛƒÖçÚỞ½Û«‚ ½9‚×ơÄ‡éºΈ±»ù×íê‚vƠX¾«»½€ơ‡Ç̉›Úº•ŒËÖ«‡“Íj¡£äÙ×™Ô¡Áù×ßÄÙù׋ÜÛºù×™‰kß [ïSêöá ·Å½÷‡º߈™‰kß [ïS…£­™ëé噉kß [ïS¡ÛÏ̉Û«‚ ½9½€ƠÑØ•Èû›ÈĂר™§®È¡ÔܺÓÁ¹¶°»çÚ¡ÛÛÇưÀÚª‚ +¼9ư‡±ù1ÍÓÓØ¼̣" ÍÄ™‰kß [ïSóÔ‘Æå̉ Â9¥‡Å؃©Ç“ƠƒÖø×׿8«ÔÎ̉µØăº­ÄơÄăơëö̃»ú·ÔÁ̉9¥‡ƒ½›¾ÁÛ«‚ ½9ÛÄÓ³ÎÔÁ½“È—¾¾¹x¨Ø™‰kß [ïSăˆŸ;ÇëÚù«Ôß»û±»Á÷‡™‰kß [ïS›Ô«ÔÏÅ¡ÛÿÛ‹Ü‘±Ç»óǪ)ÏÅ߈ù×Û±»±¿ß„Û°»ëö™Ô¡h›Ơăê¿|˜‰j̃ZîSơÔ™ÁùΙ‡©º¡È¹ÚưÀơêÙ̉Û«‚ ½9°»ûƠ˜ó½Ôëöÿ¹ëöÁƯؽîºÛ׃ˆĂÙëöÏÅÎŨױ»¶“Ơ©ëöĂ‹Ç÷ˆƠÚƒˆ™‰kß [ïS‹Ç«ÔªĐ¥Û»ˆçm€¾Ûß±»©‡¥2ßëMăÏÔÑÄëÛ×¶Åó´ÙŒë*«á¼Ă¼ñÚÄ +ׯƒ›¾Ïơ˃ضܙ‰kß [ïSèơ™‰kß [ïS×ÓÏʼnܙ‰kß [ïS%Ẩ °­vƠׯÁƯàçÿ¯¶²¹ĂƠ߈³”ÿå‡÷ˆ€Ơëö«‡“ÍjÍÄ­Ö‰Ôëö%«‡“ÍjŒ ·‰›̣ÿ¯¶ÙÚ£Ư™Ó«»Û«‚ ½9ăˆŸ;½¯ÈÛ×ÏÔ±»ƒ×ÏÔÀ¹ưÀ‡Çå̉ ±»ÍuÍÓ߈§ÓƒˆŸÖ—¶₫& רßÁ¡ÈƠÛ«‚ ½9½™‰kß [ïSăê›Û±»ÙÅëÍÓÛ«‚ ½9ăăˆŸ·ØûƠ“ÈÄÓ½ÈÛ«‚ ½9½¾‡§Ôù××¼†ºù×îÅëż÷‡öñÓù×­v·Ó ¥0›̉©ù×Ù½—»ĂăˆŸ;­ÖÚÀÏÔÙ½³×¿èñ×ÏßäÁøê™ëéå9¥‡¨¼ÏԵدۄÚƠ±»ÿÚ‡¯‡½«Ú Û›¾”½Å»¬Ö8¤‡Ă¡»°»ĂÙñÄù׫‡“Íj™‡ƒvăˆŸ;Ơÿ¯¶ĂÙ»¤…ŒÇÖƒvùשÇëƠU߈ơèÅù×Ç"½Ôƒˆ«»µØơÔÿÛƒv˜‰j̃ZîS̃ˆßÄÙ÷Ú‹ÇÏÔ¼±»“ȪÚÛ«‚ ½9±»Ø×ÖĂÿ¯¶·‡‘×8çƒvÛ×…ØÁ¹©Ó¹Ú¡Ûá=™‰kß [ïSù×µÅçÚÙÚ·‡‘×8çơê§ÔÛ«‚ ½9ăˆŸ;ÅÓÁĂô«·3uU½‡ƒöáÍÙ׋ǛÇÇÖ„ôíÆ­ÈáÁÛÀù×¥ˆ]1¢Ç廽ÀÚå̉ ï³2°»…Œ¯ÈÅÔgψ9¥‡ùׇää̉ăºÙÚ«d£»߈ÑÅ˹‰½Ë̉×Ï̉¾éÚÓØÙYÓ¼ù׃ˆ÷‡±»ªÔÁÔºlơÔñÓÂÙ™‰kß [ïS¥ˆ]1öÁÿ§ëö•Œ±»ơéâÁ¹ÚÛêéÚßÄÙăˆŸ·‡‘×8ç&߈ơƠù™Ó߈ơèÅ%›¹†Ú½©¼ß»û½ïƠăˆŸ;½€·‡‘×8çÿ¯¶á ¡ÈרưÀöÁƠX߈đÖ‰1ăˆŸµÜ߈Û«‚ ½9¡ÈÙ½Û×ªĐ¿Ø«ÔỞ9¥‡Û×ÏÅÙÚÿÂøêÙڢȺ۫‚ ½9Ë¿ƒØØŒê*ªçÚơÔÏÔ¾ÄnưÀĂ¥ˆ]1±»éÓ¹Á߈ỜÓ߈ñÔï½ûÖ¯ƠÇÖ߈—»¹ÚăˆŸ‡ÛƯÓ ơê½ÏÅñÄÍË)éÛ9¥§Ô´†Ù×́văàĐÓ éºù×½›¾™‰kß [ïSÑÓ”½½§®ăÂ3µØÖĂ +ÁÓ‹ÇÇËç̉º‰èÓº¹Ú»½ŸÖ™‰kß [ïSùêÅÔëö‰·“ÈơèÅǺŸ}÷å5ÓÖÆËÉ9«‡“ÍjƠ±»çÚăˆŸ;˜Á±»º«‡“Íjăơ‡Œ—ÖÛÄÓÇ"½Ă¡Ô«»ºĂèëö¡ÍË)éÛ9¥ù׫»û(Û«‚ ½9µØæÚ­Ö¿ç׿8í—G£ä߈%«‡“ÍjÛê₫‡ÛÀÛ«‚ ½9±»­vçđ×Ăå̃ÅnÏÔ¹ÚƯÓ Û«‚ ½9“Ơù×Ͽٽ½å̉ Ù½Ÿ}8¤‡™ÓĂÙù׫‡“ÍjµØÿÂăˆŸ;₫®¶Û«‚ ½9ÁƯ±»µ†¶“¹ƯNÑ»«‡“Íj̉ºà ©‡¥2ßëM™‰kß [ïS×YߌÛ,ÍÓÑÄë«ÔÛ«‚ ½9·‡‘×8ç»Ø°»±ÜƠ‰Ơш¡Ø$µÜÛ¢ƒv‡º¿àß»ûƒv¸Ú©ØͼƠÏ̉ÍÄơê᫇“Íjù×ăˆŸơÔöÁ¿‰ơêÿÛă»ƒˆ‡º±»ăˆŸ;kơÔÏÅ™‰kß [ïS³‹øר8¤‡Ù½ưÀ¥ØƠÈËǺ©¼­Èÿ¯¶ͼµaçÚçÚơêß»ûƒvø×ơÔÅ»¤ˆ\0ÓłؑƠƠíØå¿̀¼ÏԥصØåן}“ƠëöÀƯå̉ »Å®È»‡Û߈—ÚăˆŸ›¾«·3uUÁƯ˜Û¿ßÇ»µØù×Á½ăˆŸ;k‡xÏÔù×¾߈¾¹±»óǺ‡º±»¯ÈÓØ½«‡“Íjß»ûÓº«‡“ÍjóÇ×ÓïÂÁƯăˆŸ­Ä‡xÇ»߈ù×ÙƠ«Ô“ÆÍÓÙ½̣ÇŸÅÏÄÙ½9¥‡ÏÔ±¿±»ô꺫)ºưÀ¹ÚíÏÔ«»½€«»·‡‘×8ç∄äç"²ØÁ¼ÍÓæ̃¡Á¹Ú‡ơêÿ¯¶÷9¥‡£ô­Ä®¼Å–íJËÉ9¾ƒˆ«‡“Íj·‡‘×8ç½€™‰kß [ïS¯¾ûÙ§àµaåÁß»û‡ÇÑÓ¡Á×2ÑÄëçÚ¹%íÆƒv¹uÙÜƯºËàá ëÓĂȱ½Û«‚ ½9ûÙŸÖĺ¿‰ù×ÙÅëå̉ ߈ƒ¤ÅÓ¿‰°»Ïԓᙇ©ÓăàôԵاÎÅ™ÓÏÔ±»߈ËÉ9ÍƯÙÚ›¶é£–™ÁÏ¿­Äƒ×‹ÇÛ«‚ ½9Ô]›¾ÄÁÏÅ…ÖçÚƒvỞÑÓ›¾ÅØψÏԋȃv¿‰ơêĂÙÏÅÏÔÑÓï½ø¾ó³±»ơÔ±»ź«·3uU½½…€­:Û«‚ ½9Ơ¥ØËÇ߈÷Á›¾“Æÿ¯¶߈«‡“ÍjưÀè¾̀Ó¥ˆ]1Ûº¿ĂºăˆŸ;˜êèäĂÙqÂÙóÇSÖÆÅÓ¬Ù½÷ÁÁ̉Ù×ÿ¯¶ƒÖĂÙ“Ơ•Èû›ƼËǰ»«d“Ơ§Ôÿ¯¶Œ₫ÅÔÛ«‚ ½9±¿éº߈ׯ“Ơ«Ô­¶§Ó·Å£ Úª‚ +¼9Yëöœ‡óÂÛÚ­Ö»Øă‘·«‡“ÍjĂôñÖ9¥‡ĂÙưÀ₫ ®¶ ́ÆcÈ̉T±»½€º½ÔăˆŸơêÙÚ±»ø×ûêï½Û«‚ ½9™‡¾̀Ê)èÛ8¤Ó¾¨Ø´Û›vÑ"ÿ¯¶åĂ½Ží—Géºùê¹Ú™ô߈«‡“Íj¹ÚƯ¾̃ˆYăˆŸÂÓ×ƠưÁÑŸ}¹ÚôêưÀ…»»ç£Ç“¹ƯNáÛ¡Ûá ÏÅÚª‚ +¼9±»‰áê‹Ü¡»¿¹ăˆŸ;ăˆŸơñÁçÚăˆŸ;›¶é˜‰j̃ZîS÷ÛÆµa½ĂÏÅÑæ÷ˆÑĂ­Rè·­Ô—¶ù×»ˆôƠŸ‹ºéê±ÈëÖ‰¿I¨Ç÷‡ǻÙщÓØơÔ€º³Ü퇪¶2tTÿŸçÚñÚçÚÅØä̉£ØăˆŸÓ̉ƒvívƒv›çŸÖ‡“Óº‡Œ±»ñ¸«¼ƯÓ µØÏÅ«‡“Íj˜‰j̃ZîS« ©ƒ»5¿‰Ô¿‰ùׯÈÍÓƒv­º½€8¤‡ËÉ9Î̉…ô¹Ú¥ØÙ½ô ÁË̉«·3uUƒÙÚ߈éÚ™‰kß [ïSÙÚ¥‰ÍL…¥ƯçÚ•ŒÍ́¼÷‡›¶éË̉€ƠƠÓÓ9¥‡¡ÛîƠÙÚ̃ˆÙƠÅØĂ£X₫Ç ¿‰ÙÚăˆŸ;µØĂĂ߈¶߈Á¸Úª»‡Ê¶vÙ½—ÓË¿£ä÷Á˜×ÏÔ®GøµØưÀÙÚăˆŸ;Ï̉ăˆŸ;‹Ç©¼‘ơ•ÓÛ«‚ ½9™Á‡Ûù×íêñÚ“ÆÛײØơê­Ä̀)Ăô•Ç«dá=8¤‡×˜‰j̃ZîS·Ô§ÓÏÔ™‰kß [ïSȇù×øơëöơê麺ÅÙ½ËƠĂ“ăˆŸ¾‰ÙŒë*«Û«‚ ½9½­ØÚÀ½߈ÏÄàƠ¹à·Ó ¥0©¼»*ăˆŸ;¡ÜûÛ«‚ ½9߈µaÿÚÙ½—¶™‡´ÀăÚª‚ +¼9çÚù×ÈĂ‘øÁÓ¤‰̀L„§âÂĂ³È‘Ö™ÎăˆŸ;󿉱»éßÄÙ̃ˆÓÆߌ£»ÑÓÿ¯¶߈ù׋ÓÅÔíÀ¹»ØĂȤÛĂ™‰kß [ïS÷Á™‰kß [ïSEă»¼È«‡“ÍjÛ×ïD“ƠĽÍ™‰kß [ïS²™‡·Å¿ß©Ó£ºỔ™‰kß [ïS±»Í䶇9¥‡¾âĂÓºµØçÚÍË)éÛ9¥½ëöÛ«‚ ½9˜‰j̃ZîSăơçºÍÄÅ»ºơèÅø×µØ§ËÁƯ߈ëö¥ÜåÁñLñÓÛ«‚ ½9ÇÖÙ½á ±»ăˆŸ;ưÀĂÙỞÑŶèù×ÏÔ™ëéå½ơêËƠÏ̉ơêăÁ»’ÓÅÖÅ»½ÛÆÏÅ߈—ˆ÷ÁÍƠ†Ç´a›¾ù×·Ô½€°»߈Û×çÚ°»µÛƒv…(·‡‘×8çÛ«‚ ½9¾Åă»ï³2ăˆŸ;·ÜĂÙưÀÁƯ₫±»ô½Èº Ö†‡ü2»~ưÀĐĂ¹Ú¥ÂÀƯ¿ßù×á ß¹ÚáÛùê·‡‘×8çɶIIĂÙ…Û©Ăë™̣Úª‚ +¼9ù×»Øơê¤Û·Åëö±»ơÔ₫®¶ÀƯ¡Û•½³ĂͪëöÙŒë*«ĂÖ¹ÁíÚăÁ¾ûÓù×—Û“›¹áØÁƯĂƠ‰yÛ×±»ëö«‡“ÍjÉßÚÎŇÚóÇ™ô³Â«‡“Íj­¾ù׫ ©ƒ»5í—G¡»ĂÆĂÙ¸Úơ$ϼ¤ÆËÉ9¬Ùçđ¡È™‰kß [ïSôćv¼ƯÓ ÚÄ̉ëöﻹÚ̃ŒÚ,Û«‚ ½9åÁ¯ÈÿÆư“ñÏÄăˆŸ;çÚ„Ú3¾‡ŒÎÅ™‰kß [ïSéÓ…øơêÿÚ…ÁñÄ¡ÛѶñÓƒvÅÓ·Å߈µ¯Èçm‹¾êö …ÛƠ»‹ƒ×ñÁùץ؃ˆÛÄÓëƠUăˆŸ;©¾Œ¾‡Ç¹ÚÅÔ£äùÓơºí‡‡x¢ä—ˆ±»½Äù×…Ö«‡“ÍjÛ«‚ ½9ç̉₫®¶«‡“Íj‘³ÙŒë*«ƯwơÔñ¾ÏÔ‰¾ƒ»½ù×Ưºï½Ïô߈ÖưÀÅÄÅ™‰kß [ïS¶‡Œ©ØÅØÉơÔÛºçƠ¡Ô™‡½ƒ¹ÚÏÅÍä߈£ØÛ×߈ỞÄÓñÚÍĐÍÓ߈ÇÖ›Ú8¤‡×ùê«Ô߈ƒv™‡߈Ơ£ÇƯÜÑÓùêÛ×Á™‰kß [ïSµØơÔ±»«‡“Íj—»­ÄÑÄë¡ÓÙ×龎Ӽ—ÓG½¹ƯºĂô©Ï̉·‡‘×8çÿ¯¶‹Ç‡—¶¯¼Ϲ÷Áö§ÈöÁßÄÙư“ëöăˆŸ;ƒv9¥‡ß»û±»ù×ËÇ÷ÙÏ̉…Køê¹àÛ꛾å¡ù×̉Ù¢»ÓÍ¿‰«‡“ÍjÂÙ ›¾¡Èâˆå̉ •Àó¹Áׯ‹Ü˜­¾ÛÅ€º‹àŸÅÙ×ù×™‡ͼé.߈ÁùêÇ"̣߈×’ÏŽ€ùuøê¿‰¡È³Øͼ¿‰ĂÙ™‰kß [ïS•»ù×Á½³ÈÉ̉½€›¾‘©°ÏÔ©ˆăÁÙ½ÍƠ¹Ú°»‡Ú‰Û FÊûF“ƠÏÔơ꿉¸ÚÇÓóù×áÛÂĂƒóÇÍÓ˜‰j̃ZîSÚêơÔÛ«‚ ½9¥Û´€™ỔÅÅØơÔ±»ÿ¯¶ăˆŸ…ÂíêưÀ́v½À½Û«‚ ½9›ÛơĉÁ‘©²ÈÏÅ¥́ăˆŸÛ«‚ ½9£Ç™Ó¦ÆÏP™ÁÛ«‚ ½9·¼Í7¹Úív›¶éÁƯÏ̉ËƠ È½ר‘ëĂÙ±Ô‘®™‰kß [ïSÛÄÓÚª‚ +¼9‡Œ§Óϼ©Óù×ùˆ±»‹ÇơêăˆŸ;æ'ëöÛ«‚ ½9æØ +“½óÇöơĂ½Ă»Á¹ØñÚƒv‡9•Öñ™‰kß [ïS›¾ăÁ›¾å̉ ·‡‘×8ç°¿ơĂ߈¡ù‹Ó÷‡ÏÔƒˆëöư‡±ù1ưÀÛ×ÍË)éÛ9¥ÓưÛ×ĂÙ½«dßÄÙ«‡“Íj×¾ÏÔ»µ½ÈĂÙ×ưÀơÔ«‡“Íj¶ºơꕽÓå¼ »Ưͼ½™Ô˱°»™‹çôù×½€Å–§ôÑØÏÔ÷Á½€²Èµaùæ¡Ù“ƠƒØ½Ơ‘ưԱ»Óˆ•=‘·‡‘×8ç߈…Û˜‡ưÀáỠÚÏÅÏ̉¤Ç ‰Û‡Œ«‡“ÍjÿÜ9¥‡ơĂÁƯµØ™‰kß [ïS«Ôáê½ôÍË)éÛ9¥«‡“ÍjƠ÷ˆY‡»±¿é‡µØÛ×ÿ¼ç±»½ù×®Gøщ¹Ú9¥‡™Ó´‰ĂƠĐÓ™‰kß [ïSỂ ÁƯÍăƠ»ØơèÅÅÙ½·‡‘×8瀼ßű»¥ƯªÚ +ơú麌₫ơꩇ¥2ßëM½€ÿ򼁯ơêëößÄÙ¬¾«‡“ÍjơÔÏŇں¡›¹³(Ï̉½Á̉“ŸÑÅ™ơÔ×Ơƒv¥Ó—´»ØËÇÓØ•!ăˆŸœ‰¾I“Ü«ÔÏÔûщÚª‚ +¼9Öܽ₫®¶ÏÏ«‡“ÍjƒvăˆŸ­ÖÓÅ̃„ỬĂ¹̃Á´a9¥‡¿‰§Ö¶¼̀7Ϲ¿¹÷ÁÙ½ơÔ½ô™‰kß [ïS»½«ÚăÁửăêÁ̉‡ŒƠ«ºØ×߈¡Á°»†Ç±»ñÖ¹Ú÷Ù_ëö«óƒ₫ ®¶ Û«‚ ½9ñÓÓÅÛºƠ›¹Û«‚ ½9ÏÔáÓ˜EÈE™‰kß [ïSÇ—ơ—ă߈̃ˆĂ¼ưÀĂôÁ‡é/×:µØ»‡óÔÅăˆŸ;Ơ“ÍjÿÚ£äĂºÏÔ¹Ú‘ «dëöíƒÿ›¶é±½¯G‹ø·Ó ¥0›ÛŸ}‡º¼ÈùׄØËÉ9₫®¶ÍÓ߈‡ßªÔª‡’̀jÛº·‡‘×8ç„ÙÚ«»ÏŶ¶̃,Úª‚ +¼9ưÀ߈ÏÔËƠùæÏÅÿ¯¶£ä«‡“Íj÷ơ™Î‹ÜÙדƘ‰j̃ZîSÏÔÁ˃v©Ó¬Ä߈ù×ôê³ÂÑÓĂƠß»û‡Œâà™‰kß [ïSá¬é‡ŸÖÙ×߈¿ëöù×¥‰ÍL……ÚÛ«‚ ½9ăà¬Ö£é¯¼Æ¹ÚÛ«‚ ½9ñÖªº ÑÄëø×ơ»ÏÄ¥ˆ]1ËÉ9©Œù׫»½¹)öëö…àͽ“‰3Ơ,ù߈±»ÑÓ‡ºăˆŸ;kªÔĂ·ÅÅÓ™‡‡µØ߈±».߈ÁƯ÷Á°»˜‰j̃ZîSŸ}ÁƯÂÁÛÁדÈÚª‚ +¼9«‡“Íj¹Ú€Ä§ÔÏÔÁôê¹È™ëé凌­Ä¸Úÿ¯¶¿»ĂÙĂº™ÁïÚ¹Ú…щù×™ÔăˆŸ§Ô±»·‡‘×8çưÀ‚våÖË̉Ûº₫Úí—G«‡“Íjó̉ÙÅ뛾©‡¥2ßëMù×Ư‰«‡“ÍjŸ\™‰kß [ïS±»½ÛÄÓ±»éÓ‡“±ëصؙ‰kß [ïS»Å÷Á߈«‡“Íj“ÆæỞÏÅÁ½¡ÔƒvÛ«‚ ½9«ÔêÚÍË)éÛ9¥¾öÁ÷$÷Áµaƒvß»û½ù×ÍÓßÄÙ­ÖóÇëö‡Œèê¸ÚÛ×½©ˆ₫ڃ֡dzÂÜ»y›Úù×±»§ØéÓ¾ƒÖéÓ߈ÆÛÀùæç½€9¥‡ï³2ÇÖ©‡¥2ßëMº­ÄưÀ9¥‡ưØßÁù×ÿ¯¶ÿ§óä̉¿ß߈ƒˆº™‰kß [ïS©Ç‚v ·ÅƒèñÆơÄ×±ƠX¹T߈Û×9¥‡ß„™‰kß [ïSµaÅÓăˆŸ¶‡  Ö8 æ Ïİ»¹Ú‡Œ›¶éŸ}àƠù×ó^ơêù×̃ˆÙŒë*«›¾ùê½ô§Ô±Ôº›Ăÿ¯¶9¥‡Ø÷$©¼¡±»éơơêƒvßϑ֫ԣ‡œØÏÔÚª‚ +¼9„Úàˆ…À0…p…½€È÷Ù÷ÁÙڅت‡’̀j¼ØÏ̉Ù½­¾ÏỖÁË¿ï»ù×߈°½ç4ÿÚ«‡“Íj‹ÓäÔ4Y÷ÁăˆŸ;ÀƯ…Âû±™‡£X8¤‡Ö«»ÿÂùơơêŸÅÛ«‚ ½9µ.¥Ù¸Úù×ÙƠơÔ—»©‡¥2ßëMù×VÁĂÛº«‡“ÍjăˆŸ;™‰kß [ïS₫§ưÀ½ï½ºÚ׫‡“ÍjÈĂ ‹à«‡“Íj¡È·‡‘×8çù꛾½Á¹ă꛾8Έ³‹ÇơĂϼÿÚºÑÓχ€ºÙ½Ù½ψÛ«‚ ½9ß»ûªÚÿÚÚסۙ‰kß [ïSëƠU«ÔßÄÙ«ÔÙ̉Ï̉Ϻ±»/µØµ‰¶‡  Ö8 æ «»÷ÙÏÔÓáÛ£]½»ØÛ«‚ ½9ë¼Ç̉ù×Ù×°» +‡Œ»ºϺÏŃvÓØƒvôÛשØ̃ÄØ¬¾úÙ¡Èù׋ȓȃ×ĂĂ ›­±àéMù×™‰kß [ïSÛ«‚ ½9ÑÄë¹Úœäđÿ¯¶ƒØĂ÷Úƒ²ÂŸÅºƒ߈Å຃½÷Ú†““Èëö߈ÅÔù×ÏÄÛºÇĂívÚÅơº»µØ›vĂÙ±»߈ƯÓ µØߌÛ,ÄÄ¿½߈›˜Ơ8"¤‡"ÖĂÙñÆ—¶ƒv©Çôêß„óÇí‡ôù×߈±ëöÔó¶߈̃ˆÑÓ°»Û«‚ ½9±½ñÖ©¼›¾߈äÆùø·ÈºµØḮ§Ó…¨‡¤2€̃êLÏ̉ªÚÙÓ‘Úχ‡ŒϼÏÔ›¡©ÓơÙ×ÏÔƒøêÓÁÖ¾8«»¯ƠÁ‡é/×:ÏÅ«‡“ÍjéӫÚÑĂ½½»߈ív.å̉ דÛÁƯñ‚ƒˆöÁ¡ÁƒvÁÚơÔäôÙÚÉÏÅÙÚ¹ÚƯÓ ¹óÏÔÛÆ«‡“Íj©‡¥2ßëMºùêÙÚÏÅÏÔ¹߈ÛÀí¿‰¹ÚÏ©Ọ́½€‡Ûψ«ÔơêµØöÁƒvÙ×Ù½Ùڋܹ–Û¡ÛÙÅëËÇÛ«‚ ½9ç4›¶éăˆŸ;÷Ùé‡̃Ư߈™‰kß [ïSăˆŸƒvĂ%™‰kß [ïS˜‡Ûº¡ÔÏÔ˜‰j̃ZîS©Ç»Ø«‡“ÍjÁ½ơÄÏÔÿÚÏÔ©Øơê¿à¼ +8¤‡߈ÏÔ¨Ơ¯¾ừƠỞ·Å‡‹ÜĂÙƒv¿º£ô½«Ôù×åêÓºƒvỞưÀ«‡“Íjùꘉj̃ZîSƠ£Ç¸½ ‡̀Ê)èÛ8¤£äѽµ†Ù½àø Ưº¢Èùו³áƠµaôÏÅÇÓƒÚơÄù×󫇓ÍjĂ9¥‡˹±»ÿ¯¶™‰kß [ïSǼ‡ºµƠ·Ô¨À°‡ÿ«»±»½ÔăˆŸ;¾Üîűù¿ÏÔß»û髇“Íj̃ˆḯ߈™‰kß [ïS·Ô߈‡9±»—¶º­ÄƒØ™‰kß [ïS±»³¾×Ơ†7§jÛ×ôØÙRó‹ß»ûơê¼'8¤‡±»߈ÏÔÏÄáêëöÙÜÛ«‚ ½9ƒÀ«‡“Íj½Ÿ}ƒvƒ¹Ú× •{™‰kß [ïSûØÏ̉›¾ÀĂ›¾̀Ê)èÛ8¤ùסÈûÀù×ù×$ưÀ» ׇ‡ư2ÏÔ½€¥Äù×™‡åĂÀƠÁ÷Ùø×°»çڳ܇ÜùסÔÓ̉ÁƯ³Ç³å!Ûºù×ưÀéÓ‹Ç­Äÿ¯¶¯×ÿ¯¶ăˆŸ;ÅÓñÚå̉ íÖÅ£äùꇺ¦ô«Û±»êöËÖ°»    ª-zz»ØñÚñ×¾ăˆŸ½€˜‰j̃ZîS™Ă›ĐÁƯרºÏÔ9¥‡ôŃv¿×9¥‡¥ÖÓÓ·‡‘×8ç‹ÇĂ¼èô ƒÙ̉‰¿IŒ¾Ö¹Ï̉¿º°»̀Ê)èÛ8¤µØăêÛ×¼ĂƠÔơ›¾ăơ‡ƠáÓÙ»±»é¼‰¿IăˆŸú¹ăˆŸ;åưÜáêƠîơÔÛ«‚ ½9³ÈÆăˆŸ¹Ú™‰kß [ïS…½ÿLJ󸫻ñÚ›¶éÙÚ±»çñÄÙÚ÷ÙüÁƒvÑÓ«‡“Íj­Ö̉ŵر±¿ñÚù¾óÂ8¤‡ÖëöÏĉ¿IÓÅơ.«‡“Íj×ĂĂÙơű¿ÍÓ¾ß߈½€Ë¿£Xï½²È׻ؓƠ™‰kß [ïSÿÜôăˆŸ;ßÚÏÔù×ëöñÓÅ»ëö±½ƯÓ %­Ö÷Ú•Öå¿Ăà÷‡¡ÛÏÔ󽣇ïÜâơơꓹƯNëö™ÓƒÖ8¤‡°»­¾ª»ƒơñٜܙ‰kß [ïSß»ûÑó‡jù¿Ø̉¬¥Û‰Ûï‹Ϻ…Ơ½çÚ¾‰¿IùדÈÂÖÁ‡é/×:èß°»å̉ åôŸ}ÁĂ©ÇăˆŸ°Ă£»߈Ăº¸ÚÁƯÛºÙÚÜ∳ÆöÛ«‚ ½9ÓÅá=ÏÔëö©ÓÙÜ—¶…ÇơèŶ!!Ăëö߈Û«‚ ½9ƒ¾‘™‡¥ˆ]1ÁƯÛ«‚ ½9ơèÅĐÓÚÚƒØÛ«‚ ½9ívǵ.¥ÙÛ×pµæă»±»·‡‘×8ç‡Ç©Óø×½ÏÔå̉ óÄÛÄӣ؃vù¿Á† ‰¿IÎÔăˆŸ;›¾‡‹Ûưˆ§Æ‹Üë×üÀ߈Úª‚ +¼9­¾ÏÄ‹ÜÏÄø×ÛÀ²¾“°¥ÏúÙ9¥‡©ÇºÁÛ‡ͼÇÏÅ›Ôÿ¼ÅØ«‡“ÍjĂȵa©Ó߈ßÛщ±»ăơ÷‡Å–ñÓăˆŸ;Ï̉«ÿÁăê—ÖÚª‚ +¼9ÂÈöÔŸÈÀĂ¿Ø߈©‡¥2ßëM©ÇơèÅÙŒë*«¡Á¡Ư‹ÓÛÀ£Ø̣×ƺéÓÛ«‚ ½9Ï̉êöù×ëö©¾ñÚ§ÓµÏÅ»$÷Ô‚»ĂÙéÓëö©ºÛ½Úª‚ +¼9ų܋ÙÏÔÏÔ½µØëöâÂ3ù׃ÖÍË)éÛ9¥ŸÅÿ§ÿ‡ó›¶é§Ôÿ¯¶ôĂôô±»¿ÅÙ½Ç9™‡«‡“ÍjƯÓ »~ƒv«Ú¶±»’ƠăˆŸ;å‡Ă±»ăˆŸ;ÛÀÓÅßÄÙ™‡%ÁïƠÏÔ­v÷¶ÓØüÀơêÏÔÚª‚ +¼9­Äº×¾™Óͽ¡ÔÛ×™‰kß [ïSÏÔٽ߄‰¿Iƒˆ₫ưÀ«‡“Íj8 +¤‡ +Ö µ†Ǽź™Ó“Æ9¥‡¢ä¼€  ¬°àèMƽÑÓ—‡ñÖχ¶ûƼ¿‰Û«‚ ½9µĂ½öÛ¾ƠæÚ¸ÚÁƯ—ßßÁ ƠÔ ™º™ëéå¿ô‰Ô¹Ú¥ÚÑÄëưÀÙĂ’Èù×Û«‚ ½9߈ÏÄçÚáê‹ÙƒÚßÄٻŧÆÅÓ›¾ÓØÅÑỌ́¶¯×«‡“ÍjÏÔ·̣Óˆ•=‘ÏÔÁ¹“¹ƯNÍÄÁíÓÿ¯¶—¶ÿÚ̃ˆÀĂëöëöÏÅ™Ó9¥‡×©‡¥2ßëM™ñzơèÅăˆŸ;Ù½ÜÚăˆŸ;k½ĂÙ‡ÛÏÔ¶×uĂ߈ù×¾» ïiẳ…à“½ƯÓ ß„߈½ë 9¥‡ăˆŸ;¿ß•Ö›¾ĂƠ¹ØÅêºÛº±»¯È£ô«ÔívÔ½øæ÷ˆÑ敌Ǡ۫‚ ½9“ÈÏÄăˆŸ;‹ÈµÀ‡º×ÓƒÚª‚ +¼9¡ÛÏÔå̉ ½€›¶éÿ¯¶Û«‚ ½9‡ÿ!‘‚¡¼›¶é‹ÇÁÓ£ 9¥‡½€ƒv¤Ø™ÔÏÅăˆŸ;̃ˆœ‡×ÓůÈ÷‡«‡“Íj™‡«‡“ÍjƒÔưÀñÓ“Èă༰»‹ÛÀé×µØơÔ‚ưÁ߈·ï“¹ƯNäô9¥‡×½Ù½­€·ÔóǺ¿¹ƒv‘ÑÅØỞÑæºØƒ½ÍĂ¹Á́º…Ú—¾™‰kß [ïS¹Ú̀ľûÀË̉߈Ϲ±»ëƠU–\\¦\̀»\\éïÙÅëÅØù™Áƒ¢«Ô“Ơ¯Óƒv›¶é‹Çưˆ¶Å–¶¥º±¿̃ˆ«‡“ÍjăˆŸ;ûÓ‡ñ5å̉ ƒv¿‰ùêÏæëö«dÏÔĂÙ§₫÷Áٽ᭽9¥‡¹ÚçÚÑÓù×ơê•󃈹ăôDzÙÚăˆŸ;k±»Á¼£ÓƠ×±»±»µØ‘Ó½€Û«‚ ½9˹ÿ¯¶ǰ߈£»ºÏÔơÔ¹Ú±»·‡‘×8çẵ‡ŒÚÇ©‡¥2ßëMË¿âḈÛ«‚ ½9ñÖ¹Á È½Èùׂ֫‡“ÍjÚª‚ +¼9ơÔù×ßÚ™‰kß [ïS«»ù¿‚דƠÙÚ₫›¾¼Øëöù‰߈ÿÚ÷‡ÏÔ‡¿©¼ùƠÄ™±¿±ÔöɹÏÄÇ̀Ï₫ܺñÚç̉£Øö÷å5ÓăˆŸ;kªÚÇØØƠ“ë˜Hù×Û‡ÛÛ«‚ ½9ÅÔñÚ‡±—Ø߈Û«‚ ½9ƯÓ ÙÚ«‡“Íj™‰kß [ïSÏ̉ù×Å–½‡Ç¡Ç›Ü߈µØ“Ơ߈ëöéÙ½¾›½Í¿½ô߈ù×™‡¿ºº‹ÇÑÓóÂÁƯÁƯ™‰kß [ïSÔơÔ]ù×Û«‚ ½9Û«‚ ½9±½ÅÓÏ̉±¿ùïÏÔ™‰kß [ïSÏÅ«ÔẩµØ߈±½ôëöû(Û«‚ ½9Û«‚ ½9Å·ƒÚ¹Ú¹̃‚ˆóÂóû…»ëöª‡’̀jƠÙ½ù׳›¾«‡“ÍjÔơ™‰kß [ïS³ÆÙÚƠù×åÁ«‡“Íj홃åö8¤‡§Æ©§ØÏÔźщù×½߈Ó ‹›æ¥ˆ]1¦ÓƯ¶‡Ö8æ·Ôé‹ÇåĂ¼‚vé‰ñ5ñ·ÂĂ«‡“Íj°»Û«‚ ½9½½ÔĂÓ·Ô½¯ƒ« +>ÖÆơèÅ‹ÜÁñ·ÔưÀ“ȃ¾‘±»ïÑ·ù×Á₫Ở߈¹Ú—¶‡ÜÑĂ₫öê$¢ä›¾ăàƒ½«Ô—»Û«‚ ½9̀Ê)èÛ8¤ÏÔ¡»´ÈÁ½‡›¡·Ó ¥0ưÀ釸׋Ü忙حÄÏŃv›¹½üÀ½ơÔñ¹£ºÏԹڳȽÈ̉ÓÆ¾öÁ±»ăˆŸ¨¼«‡“Íj¹ÚѦÿ§Û«‚ ½9ơÔù×ỞẸ̈Âÿ¯¶ơê9¥‡ë¾›¾8¤‡Ö8¤‡×±»éÓ™‰kß [ïSĂÙ8¤‡›¾¡«ëöáêíơ›¾Û«‚ ½9½ñÓăˆŸ±»¡ƠùשәÓëö±»ëö÷‡ûçÿÚË¿ÓØº€º ß»û¡ÛÁƯï³2ĂÙưÀ¥Û½™ëé噉kß [ïS™‰kß [ïSĂÙöĂÈ·ÔÛ׹ڋLJŒ‰̃öÁ ÀĂßùׯ‚v÷Á¶Ú ê¼™ëéå‹Ç™Ó„Ø©‡¥2ßëMƒ®߈Üé‰ñ5ñ·ÈĂÈ™‰kß [ïS‘´ƒÖƒˆÍË)éÛ9¥«çơ£X±¿¿‰§ôù׬Öù×Ùß«‡“ÍjÂÙËÇĂÈ·‡‘×8ç‡xÅØ½Ă³©Ç߈ù×½ÔăˆŸ;†đ5ª»ơÔ…‰ơêÅå¼ Ï̉Ç’áÁƯ߈±¿Äôº¿ºăˆŸ;kÿÛơlÇÓ߈µØ“È­ÖÁ̉ƒv4ơê¢øëăˆŸ;ăˆŸ;©Ó«ºïÚăºù×›¾ƯÓ ùןÖ÷ä5̉ÏŘơÛ«‚ ½9߈·ÜƠXµØÛ«‚ ½9÷ÁöăˆŸª¶2tTÅØöÁ。ȎăÍ“½ÑÓ«Ú¥< ËûÆ9¥‡ÁÛÙïË̉¿ô‘ÆÓÓĂ䳘‡«‡“Íj¯ÈÅ÷Ù…£­©º÷Á•»ÏÅ™̀€Ç–¿ˆÙÚÖÆºØöÁ§ôÏŽÔù׿ôÏÅ«‡“ÍjÍÓé¾¹ØÓ±½¯ÈËDZ»“½߈‡ºăˆŸ;û §ÆØñ“ÁƯÏÅ‹ÈËÜ÷ˆ½…€­:ÛÄÓ·‡‘×8ç½ÏÅÿ¯¶ÅÓç‹ÜŸÅ‡Œôø ܱ»É̉…â—§Í»Ù½ăˆŸ;ëöëöÿ$ÓÆƒ¾‘«‡“Íj«â÷ŸÅñ€ăº‚ÔÑŽ釧àăàçơÁ½˜¡Û«‡“ÍjßÖù×½¿çîÚ¨¼‘¸ăˆŸĐívơÅ»ư‡±ù1âˆ:ó£DžöÑŽ™Á«‡“ÍjƒvØÚÁû—º‹Ü¿ßëö§·ƒˆ—¶ë¯ÓǼ©ÓƒÖ¡»ƠÍÓ»̉ÙÚư“ÏÔ­ÖỞ߈±»8)¤‡)Ö½€è¼!ƒÔæÚÙ½Á̉ûÙùרعØçº÷Áă ¡ÿÛù×™‰kß [ïSƠX©À°»ÛÀ½€ù×§â©Ó™Ó ÛÑÓơêăˆŸƒÚªÈ¡È“ȯԱ¿Ó̉·‹¹Ú±¿œ‰ ¾I ‹Ç¹Ú·‡‘×8ç·Ô™‰kß [ïS£äÏÄËÉ9ÿẪˆ¥Û´Ă«‡“Íj™‰kß [ïS÷ÁÅ»ă¹Ú¯¿ÙÆƯÓ Ă±»ö«‡“Íj¢Ç±»¿́¬È +Ø×ÿ¯¶ù×±»8¤‡ǽ±»ëöºư§‡ĂÙ9¥‡ßÚûÓ·ÿƒ‡Œ·‡‘×8çÛ«‚ ½9»”ÏÔÛ«‚ ½9±”ƒvưÀÏÔĂÙ¢q™‡ó”Ïẳ«‡“Íj¿ßĂ¼±»ƒÔÍij µê‡ÇăˆŸ;køê ¬ô +¡Ơ™ëéå¿»›¾Æ̉ßÄÙ‚à׿8ö«›߈ñáÛ̉ÅÍÓªÔÛ«‚ ½9¾™‰kß [ïS±»Á̉÷ԣǓƠ™Áù×߈½ÁƯơễˆƠ‹vgÛ«‚ ½9¹ÚƠXÏÅêöù×ËƯ«û½€“ƠØ×‹È·åÖ‡ºÇÖ‹đ›·ÔµØăˆŸ;k“ȯÈ÷ÁâÁ«üÙ½á 9¥‡±»Û«‚ ½9ùê¾ß«Ô߈íÆăˆŸ;ïô«º8¤‡«Ô±»Û«‚ ½9ÏÔÅăÁ«¼¸Ú¿ºùëÀƯÇ»Ûù‡—»ƒvÛ«‚ ½9—ˆ÷‡ĂÈ߈©ù×ưÀØÑŽŸâñÖï½§¹›ÚÖƒvăàưÀÛ«‚ ½9ÄỌ́ĂÈ̉½·Ó ¥0“à Ëûö¾ç°»ơê©:ù¿’ÅØư“‚v½€ÏÅÙ½§ÓÛÜó´a‡Œ9¥‡Ọ́ÇăˆŸ…Ơ“ƠÁ̃ƒ‘±½Åñă–Ó ÷‰ăàÛ«‚ ½9Ϻ•Œ߈Ù½ù½…ôƯÚưÀ×Ơ†7§j߈ĂÙéê•Ô¡ÛơéÎÔÏśۋǩ‡¥2ßëM³×ÿ¯¶±»Ÿ}Ï̉Úª‚ +¼9߈åÁÚÚËÇÛ«‚ ½9ăˆŸ;±»¸Úÿ¯¶éº¦¹×¾áÓƒvùê‡ÏÅăˆŸƒvăơăˆŸóù׳Ә‰j̃ZîSªÚƠXñÚÂÿÚ—¶Û«‚ ½9³ưÏ«·3uU߈«‡“Íj÷Úù׫»Ơß»ûµØÏÅă¼ûÖ¾ôß×¾ív¹Úç̃ÿÛơèÅÛ«‚ ½9³ÈÛ«‚ ½9ơĂùëÙÅë§ßù¿½ăˆŸ;ß»ûù׃vØÓ«Ô¶ÔÛ«‚ ½9›Ô™‰kß [ïSÏÔăˆŸ;Ñ!±»á ÎÄÛĂÙùêÛºỂ›¾ôêĂ«È߈ơÔù×ùêÛ«‚ ½9ؽ¾ÑÓµØÑĂË̉‡xăê÷‡±»ăˆŸ;º̉ù׵ح€9¥‡ºö¾‹ÇƒĂ߈…à½È½ÛׇæÛÊ£Ươê匿Nƒv‹ÇëöÇ~ÑÄë§ÔƒvÀÚăˆŸ;kƠ¾́®¼½å‡ù× *« ©ƒ»5±»ÅÔ߈ÆĂßÁ9¥‡½¿‰™‰kß [ïSÎ̉ơèÅÙ½ÏÔ‰̃ÙÚ×¾Ǽ«‡“ÍjÓÆùơË” + Êû¿»ưÁ÷ˆưÀÛ꫇“Íj‚v¬Äï½ÙŒë*«Âé‰ñ5ñ·ăơùëÊƠ8¤‡ƒ½ׯ߈ăơÁ÷Á߈§£Ø¹ÚÛ™½¡ÁªÔ¶ÈöÁ™‰kß [ïS™‰kß [ïSêÚÂÄÑÄë«·3uU·ÜåôÛ«‚ ½9›ÚÛ«‚ ½9ÿÚÿœßÚ߈½€ÅØ»ˆ£ÓÛÖ½åô›¡óÇÍĂ›¡¹Ú°¿Ûן}Ơ­¿Åù×¹ÚÓŪÚàÓ µØ±»º…£­ñÆÛ«‚ ½9Û«‚ ½9ù‡‰¿I¹Á“Ơ·̃ơê¼Ï»Ø«ÔÛ«‚ ½9ív™‰kß [ïS´Cí†Ù½ólƠÅ߈ÍB₫ ®¶ Ö¹½Ù½ưÚÙÚ±½ơêÿ¯¶¡íÁµÏ¡»ÏÔ·Ô½‡ëö›Ú§Ô±Ô³ơèÅơê±»ëöíÁƠăˆŸ;·ôöƠ¿ßÛ«‚ ½9Å·‡‘×8ç±»Á̉¹Áù×ÏÅñ™‰kß [ïS¿º„ô½ºĂ·Ø·ÔÛ«‚ ½9½߈ÓØ™‡·#™‰kß [ïS§Ó̃ˆÂÖ™‰kß [ïS±»ûÓßø¤ÇëöĂçôG½¹½߈±»çÔ¡¹ÚƠG½¹º©ÓÁƯå̉ ù×ß»ûׯÏÄôĂưÀޱđ™Û£ÇăˆŸ;óÓå̉ É̉ƒ×è%ƒÖ—ˆ“ÇđÓƒvµØơê›ÚÍË)éÛ9¥Ă›vƠ%ëöÿÂü̉¹Á(ƺÇĂ» ơÔÑÓÛƯĂΛËÇÿ¯¶‘½íæ¯ÛÅ­Öå̉ Å¿‰Û«‚ ½9ÛÀ§ôÑæñÓêöùêÓØöÁå̉ ÁÓÛ«‚ ½9ƒ½‡Û«ÑƒvÙ׳ƒvËǾºnëÓ£»›Ûàê²ăˆŸÇÅ̀Ê)èÛ8¤©Óíø¼—ïÙ½ĂÙ±»Íù×å̉ àêñÚͺÛ«‚ ½9™ô߈ñÚÙÚßÄÙ§ô½ÇçÚϺÏÔ£»¯.âÁăÁ»̉纕‹H™‰kß [ïSóÇå̉ ăà¦Ô™‰kß [ïS…Ø»‡í—Góœ¾ß»û±‡ăå̉ ëö¡%±»Ïå»ÂĂÈÍ­HÙ½™‡Ù»‹Ç¼ĂÙ‹Ç׿8‡Œ߈©¼ëö«Ó߈ù×Ö*ƒÖÇ–«‡“Íj™‰kß [ïS׿8™‰kß [ïSÛ«‚ ½9±»ƒv™‰kß [ïSé‰ñ5ñ·Ñ·̃Áùט‰j̃ZîSûƠ½ÔÅÓÍË)éÛ9¥¾“ÈÛ«‚ ½9µØØÅ ê ÀÑÄëÙR™Ăå̉ çÚßÚƠăêöÿ¯¶χÍË)éÛ9¥™‰kß [ïSùơèÅÚ×ăˆŸ;k ùׄثԱ½µaôêéÚÿ¯¶ñÁàˆÀ0p›¾»½ơêÏÔă»ùêщµØæ̉Û«‚ ½9́º ëÔ±»ÍË)éÛ9¥êÖ¶ÏăvơÄ9¥‡ƒvƠưƠÇèăˆŸ;kÛ«‚ ½9ƒˆ±»Á…¾ï»ơêö߈î߈—¾³ ỞÚ׿»ǽ¶™‰kß [ïS¬Ö™Ô»²÷Á©¼ɲÏű»›¾¹Ú¾Å»¦ô 9¥‡ÛÀ‡ăÁƒvÛÄÓÿÚÑÅ«Ôí¿ëöù×¹£“ƠÁ¹Ë¿©Ơ›¶é9¥‡˜×å¼ ÏÅʾ¯×±»©‡¥2ßëMÏÅÏÔщ™Óƒvø×Ï é‡‰¿IƠ™‰kß [ïSăˆŸ;ËÇ™ơ«‡“Íj³ÉÏÀĂ—Û§ÓăàÅÓ«‡“Íj© ëöˆ¹à±»Û«‚ ½9ơèÅ̉º©ÇăÁ“ƠỞ«‡“ÍjÙ…ƒv¸Ú̃„øô ±»ëöœĂǺ™Á™‰kß [ïS¿»‚vƠ«‡“ÍjÁƒˆƒv¢»ƒˆëößÚ•́ĐØ™‰kß [ïSçôØÚÏÔ¿ºÓ¼ñ»™ëéå«·3uUóǽ€çÚ«‡“ÍjŸÈ¡•ŒñÓÿÚăÇí¡§€§‹€º·‡‘×8ç߈¼ĂïƠ߈ÔĂ¼½˜êèäë¼µØø×Á²ÂÏÔùׇNjÇăˆŸ;™‡«äñÚ‡Œ›¾ûÓ™‰kß [ïS§ÆÎëö«»ĺÙ½Û«‚ ½9ÍÓÙ½ÏÔƒˆƒv™‡óÇǼƒvåꓽ¹à“Ơ¹ÚÛ«‚ ½9ƒv„éÓÁƯÍÓ9¥‡½€߈½ưÀ8¤‡9¥‡‡x£ä÷Áåô³ºóơêÇÓăŒ¾· Ù×Ó¼³“&°¿«‡“ÍjÅ/߈ƯÓ ÅÓ¹ÚĂÆéÓëöùëǽڪ‚ +¼9…Âîô‡Ç¶Ô     ª-55ơê«Ôå̉ ù׋ͫ‡“ÍjÿÚÏăÅ£ÇöׯÛ«‚ ½9‰yµÛÏÔ†“½¸àׯ9¥‡¿ÅÀ̉óÂă›ÚÙ½›€ºº±»«‡“Íj©ÇơňƠ«‡“Íjù×Û½›¾ăàÛ«‚ ½9‹ÈÙÜưÀËÓ™‰kß [ïS÷Á£Xï™™‰kß [ïS‹Ç›¾ÏÔ½ù×½©Óăơ–· ÷Á©Ó§ƠßÁĂÙ‡¹™‰kß [ïSׯÅôñƵ.¥ÙăˆŸººéô¡È½ØéêÙ½“€¿‰¹ÚÀ½ÿ½ÛÄÓƒv¿ÓƠ‚vÏÅרƠßW™‰kß [ïSÀÙ߈©Óà"Ù½ăºˆ¬‡Û«‚ ½9±»­Ä½ÔÛ¾«‡“Íj£ÔĂêăˆŸ;ÙŒë*«¬Öëöƒˆ‹È×å̉ ¡ûºÆĂ«·3uU9¥‡ÿ.ưÀ«‡“Íj±»ͼÓØÏÄßÛ«‚ ½9ÏÔµ†ª¶2tT£äåô“È“Ơ½ÔưÀ߈9¥‡ĂÈ×Ă™‰kß [ïSÅ©‡¥2ßëM¹}߈ơ÷Á‘°߈߈²×ÅÔ½‡ñ5ëö¶ïº«ÔƠÔêö§ôû̉¿ß—»Ú×ÏÔưÀöÁÏÄä̉ăˆŸ;«Ñ™‰kß [ïSÓº››¹í—G±»êơ·¶¡h߈ðĂô’½›×¾¹~ù×ÛÇ߈¯‡™Á¦Ơ™ëé媶2tTÏ̉ăÁßƯÆèƒˆŸÈ‰ÛÙ½ëỌ́ƒvÛ«‚ ½9‹Ç±»߈ù×Ê@È9t߈߈ëö—¶ëÍ÷ÚƠXºǼÛ〓ÆÙ×ï½¹ÚåˆÅƾŖ±»ï½›¾ửçç߈‹Çö›¾½ëç̣̉¶½«Û߈ÆèơÙŒë*«ÀÚĂĂƒØá ­Äëö“ºÿÂ߈½€ëöƒv™‰kß [ïS¹Ú•ƯÿÚô—ˆ¦È@­¾±»“Ơ±»°»Üñ̉Ńv«‡“ÍjƠî“Ơ‰¿Iͼ™‰kß [ïSéøÀÅÄùÚ˜‰j̃ZîSù×ù×Úª‚ +¼9“Ơ¥ˆ]1©¼ù×™Á“Èơø±»™‡·¼Í7߈¶¡ÓاƠà=±»©‡¥2ßëM”%ÑĂÏ̉߈æƠÛ«‚ ½9ç$å‡Û«‚ ½9ùיɧÔÙ̉—¶ƠÙÓÔçÚϼơê½€Û±»È ³È—»ù×éºơÔ«‡“Íjù꽡…öÁÏÔĂĂơÔÙ½ĂđƠXè‡ÂÙÜăˆŸ;k9¥‡¡¨›¾ù×ÖĂ¯È·‡‘×8ç‡Ç4§Ôá=§ÓͳƃöưÜÅÔÏÔăˆŸ;êöëö‹ÜÙ̉©‡¥2ßëM™‰kß [ïS½8¤‡×ó¹¡Ơ߈߈±»™Ôá걿ƒöÏžÅĂßÄÙóÂϼéÚ÷ˆù׫‡“Íjâ ùë߈÷ÚÍÄëö«‡“Íj₫߈±»ăˆŸ;ï½ƠßÛÆÏÔơèÅÁ‡é/×:ăˆŸ;kÛÏåï»ù×£ä߈‡xµØ·Ôëöơê«ÔÏÅ™‰kß [ïS߈́ÆïƠËôá=ô磻ƒvÎʼnơ₫¼Û«‚ ½9Û«‚ ½9ĂÙ߈µaG½¹…Â¥ˆ]1éړư»ó‡ŒçÚçwƒ¯ÔÙܽà9¥‡êöëöÁ¶Žó‡9…»ÛÀ±»³ß»ûÏÔÛ«‚ ½9ßÖ±»±»¥ºUÂÙÏ̉áƠ Áé‰ñ5ñ·ëö匿NÁĂÙÚ™‰kß [ïSíÖ‡Û½ŸçÚ‹Üψµa¯Èƒv™‰kß [ïSÍ­HỞµØ¥Ư‡Œ—ˆĂ™‰kß [ïSù×¢»«Úơê¹Áƒvÿíđ¾O÷ˆßÚê§çÚÿ¯¶Û×Ù×ÁƯḯơÔ߈³ØË¿ëö¾ßơÔ±”­ßÅÓшÑÓĂÙ¿»ĂÖăê߈±»¶ơèÅ‚v澪¶2tTÅØ‚v °¿¿uÏÔ½‹ÁׯÅÁÁ¼±¿½ÔµÏÑÄë‡x·ÆỞư“ÅÓ“ƠÛ«‚ ½9«‡“Íj«‡“Íj±»ÀĂ˹ơê§ÓÙ½…%¡ß»ûº›ÚưÀ·Ô¡Èù×ơÔăˆŸ;½ÏÔÏÔ—ˆ“È‹Ü÷‡çÚ¢ÇÎÔ«»«Ô«Ô½̉ơÔơÔÆ×ƠÚª‚ +¼9«‡“Íjٽ߻û¡Û‡‹å̉ ôơÔÓµO…ôéêưÀº±»ù»ÛÀ™‰kß [ïSÛ«‚ ½9Ü­ÄÑÓ߈­ØƠµØÙ½éÚÙ×ưÀ‰!±ƯüÚ9¥‡×¿ô¥¾ƠÁ½ÛÄÓ½‚vÔXưÀÏÔ“Æ·ÔçÚ“Ûí½ÏÄÅØ›¶éÏÔăˆŸ;ƒäù׉ÛÅÓÅÓƠª‡’̀j·‡‘×8窻¡Û›¾Ù½«»ƠXƒvÑÓ›¾«%¾µØÛ«‚ ½9ÇÖ°»‚“º¥º’ȾóÄ9¥‡×Ú½ëö9¥‡çº¥âÛׯȿ‰‚û•™Ûƒv… ÇÖÅÓ¡ÔƠƒ®ÛÀ½€ª‡’̀jơꙉkß [ïS¿Å߈Û«‚ ½9ƒÖ‡ñ5ÜÛ«‚ ½9±»Û«‚ ½9«Ôă›¾ëÚ±»ăơµÀ›¾¬ÔÑæ³à±»Óº±Ư«‡“ÍjëöÙ½ÄØơê·̣ͺĂÙưÀíÖ¡щëÓù×ưÀ‘Æ«‡“Íj½ØÙÅëÜ÷‡߈£ Ø₫8¤‡³ÂơÅ‘ÓƯÓ źĂÙ™¸Ăô߈߈ùס̣½ù×äô·ºŸÖ½€«‡“ÍjÉ™ÇÖÛ«‚ ½9Á!éê°»×Â߈‡x¿ºưÀŸÄÙ½¥Ç¯¼­ÄÑÓ«‡“Íjÿ¯¶™‡éºĂÈĂÙ¡éÓçØá=ÜÓ ä̉½ô™ÔÀƯ¬ ¼¼ ÑÓ±»ơ–¢XƒÖù׃¿Å™‰kß [ïS…öưÁ«Ô«‡“ÍjÓØ±»™‰kß [ïSù×™ôÍáỠÄ Ø ºĂƠ“¹ƯNÀ½ ï»Ël—ÇÛ«‚ ½9ƒvÑÓ«»Ù½óÇÇÖ›¹ÑÓÙ‡Ï9…±¿›¾̣Ăá¿ßÛ«‚ ½99¥‡×«‡“Íj“ÆÂ«‡“ÍjôêÇÖÓØ™‡¾×Ơ†7§j«ÛÚª‚ +¼9ó^°¿·̃«‡“ÍjƒÖÇ»¹Ú¿Åˆ½ăˆŸ;k«‡“ÍjăˆŸ±»ƒÿÂơèÅùêØïívÏÔöƠÏÅƯ‰‘Ú ÈÑÓª‡’̀jóẪÄØƯÑ™ëéåù׫‡“ÍjƯÓ ÅÏÅØ‡«‡“Íj«ÚÚˆÛ«‚ ½9â,ƒÖăˆŸ;×¾ñÓÇ÷öăˆŸÅØ‰¿IáĂñÖùêÿ×±»Û«‚ ½9«÷߈߈¾§Æ˜ơăˆŸ³Ø½½ÑÓ«‡“Íj™‰kß [ïS±»ëö«‡“Íjơê߈™‰kß [ïSå¿Ù½‰¿I­Ö×¾½ÿÚ‰½±»ÂáØ₫ +®¶ +½¯È‹Ç™‰kß [ïSívơê½…£­»ôÁƯ€ÓëöÙ½ä̉¡%̉Á«‡“ÍjơÄ߈›¾¡Ư‡kϼ¿‰€º߈‡ăÏÅßÁơêÏÅÂÛ«‚ ½9¥Ø´†ƒˆöÛǛگÓïD÷̃ÛÀ8¤‡ù×ÅØ«»™‰kß [ïSùê™Û™‰kß [ïSÏÔĂÙ9¥‡¤ÇƒvËÇ©‡¥2ßëM§Æ·Ó ¥0›¾ÏÅƯơơêßÿڵؾæØ<ÉaÏŃvăˆŸĂȳ©Ç™Ó½·‡‘×8ç—ÓÍĂÏŃv̀ÇÛ«‚ ½9Û«‚ ½9±»ơêÛ«‚ ½9½€±»ơèÅăˆŸ;kíJÛ«‚ ½9Û«‚ ½9‰©Ó­€ĂÙÉ Ở÷Ú½߈¶Ôµ‰íwăˆŸßÄÙ9¥‡×ÏÔív߈ƒ¾‘ŸĐÓÓ…§ÔÙ½ăàùǰ»±ÁÙ½ă»ÿ¯¶ÔƒvëöóívơÔ™ơçÆéê9¥‡ËÓÛ«‚ ½9߈›¾ÏÅ«‡“Íjôê×ƠÅÁ˜‰j̃ZîSÛן}±¿̃ˆÏăv—ˆ©Ø9¥‡§ÔăˆŸ;₫®¶ơ꺃¾‘—Ú‹ĂÑØ9¥‡ö±»Ï̉«¼«ÔçÚÎÅ"û“¡Ơ‡À̉ƠÁ±»­¡–¶ׯ´‰ÖØŸŸ}·ÏÅ¡Ôív‰yö¹ÚÙÚÇØµ‰ÄÓ«»ˆ½€Û«‚ ½9Á‰¿I“ƠÿĂçÚ­º°¿‡ÿ¯¶ÿ¯¶÷Ú™‰kß [ïS™‰kß [ïS½·ä¿ßƠöÛÁü̉™ô™‰kß [ïSÛ«‚ ½9£ØËÉ9¾9¥‡×ôê²ÆÏÅ÷ÁÑÓÅưÚÏÅëöĂºƒÚ³¾Î̉ ÁĂ߈ñùêÀ­Ö߈ăˆŸ;kɽ¦ØßƯóÂÙ½ó×Úª‚ +¼9ä×ÙŒë*«Ù½Û«‚ ½9é(ƒé‰ñ5ñ·“Æ™‡ù׳é°́vÁĂ£X¿ßƒÖ½ª‡ ’ ̀j —¶½¡ù×öv«‡“ÍjÿÛñÓッG‹ø™Óå̉ ±»Û«‚ ½9Û«‚ ½9ß„—ˆ­Ø8¤‡ĂÙÏ̉Ùפ%™‰kß [ïSĂÙ±»ƒvµa™ÁÓº÷å5Ó½ĂôăˆŸ;ƒ¾‘·Â߈°»«‡“ÍjÙÚˆÛyµÜµØ½«‡“ÍjƒvÅáÿ×Û«‚ ½9áØéÚ·‡‘×8ç¹ÚÜƯÂÙÚáÀÏÅù¾‘́›¾ùêÍÓñÁåÁÛ«‚ ½9³1ï»Û×½µØívơèÅÍÇƠ¿èµêéô«Ôñ~ï½çÏÏÔƯ•ô«)·‡‘×8çÚª‚ +¼9›¹ó^™‰kß [ïSXÏ̉…ô߉۷ūÔÚÀ9¥‡×ÀĂö4ó#¡ÔÀĂăˆŸ’ȼԷ‡‘×8çÅØ±»ơèÅ‚v©ÀÛ«‚ ½9˜È²*™‰kß [ïSÿ×äô‚văˆŸļá=é‰ñ5ñ·ƯÓ âˆ£Ø©¼©Óï‰íç«&ëö߈‰µØơÔ9¥‡ăà߈‰¿I«d«Óá ³̀±¿±»9¥‡å̉ äÁ½Ï̉º߈À½¯G‹ø™ÁÛ«‚ ½9ÏÏ»ÁÛ«‚ ½9ăÇíÛ×ùêùêµØßÁ͇ƒó½€€Ơ«‡“Íj“͘ơ ƒÖ¡»9¥‡ç®«ÔÙÚñīӑ]ƒv§Ó™ơëÓÛº½ÓÅÆ÷Áù׃Lơêù×™‡é‰ñ5ñ·}ƒØ÷ÚÙ½‡Ç›¾±»ÙŒë*«Ž£Ç±»‡Û´ÀJƒvù׻ʿ«‡“ÍjŸ}µØçôÛºỞ‡̃“ÈáƠ÷Úƒvƒv9¥‡›#¡3© Ñ%­’ø×Û«‚ ½9Ơ›¾Âƒvå̉ ƠÄÿ¼™‰kß [ïSóÂë8«ÚÁƯ»¼‘÷ˆ9¥‡¡ÔÓØƒ¾‘›¶éÆëöƒ½ÛÀ·ÔèöÁ›¶éÙÄ«Ôơ²Èëö›¾¹Ú½µØÁ½߈“Ơív¶À̉ ©é곺ó罯ȽåÁû¿ºù×ÏÔÂÓ«ÔóÇ™‰kß [ïSăˆŸ;‹Ç±»ơĂù×ͪĂÙÛÄÓđÄ9¥‡×ÍÇ»̉ù×½ƒÉÙ߈9¥‡µØ¡Ô™×ưÀÓØ¼Ôơ´Îæ±»½ăˆŸ;Úª‚ +¼9±»ăù×Ă·Ü³ Đ¹å̉ —ăˆŸ;ÙŒë*«ƒ×ÏÔ÷ˆÛº±»ÍÁ§ôơê·‡‘×8çÑØ“ÈÏÅ÷ÙăˆŸ½«‡“ÍjªÚG™‰kß [ïS†Ç½ôá 9¥‡9¥‡©Ü¹Ú«·3uUÏÅăˆŸ;‡ÇÙĂÈ“ÈÆÅƠ‡“¹Ú·ôÏÔêöÑÓ§Ó©à߈ö«·3uUÔXÏß߈ß»ûÛ«‚ ½9çÚÿÛ±¿±»°»Ǻ¦ÆÏÔÛÀ¹Ú®È§Ô“ǽØͪĽ«‡“ÍjΗŒ¡ÈưÀíÆ™‰kß [ïS±»ÎÔ§Æ¿ºǺÛ«‚ ½9₫ÇÜÆè¼ØÓµØ¯È½ù×Ë߈›ÚѦ½¡‡º‡ºµØÙ½“ƠÏÅăˆŸ;½ƒ‡ŒÿÚÙ»«»º‡»­€ù×ÁƯÁăÁ½’ÈÙ½»ú¿»ëöŒE ĂøºÀÁ·Æ›¨Øƒv߈÷Áå̉ «öÏÔÅØơÔëöñ̉«»é‰»½ÑÓ¡ÔÏÔµØâˆÉ̉ó¡È‡ŒĂÙÜĂ·Ô™‰kß [ïSĂºÄô-ï°߈Ăº߈Û«‚ ½9߈ĂÙ•Œù×Û«‚ ½9ù×ơÔ‰ÁưÀ«â±»°¿ ÿ§·#«‡“Íj“ÆÑæÅÓ /¡ÁƠ߈¹Ú£È±»í‡ồđÚÿ߈¡ÔăˆŸ;ÏÔ‹Ơ“ơ\ÛÄÓÏÅỞĂÙ­¾‡º®È­̣û£äÛ×¶vÓ¾ăˆŸ;ӋܽÄÎÔ߈ñ̃ƒ×“ŸóÔÛºåÁ›ÔĂÙăÁ«ô­¿©‡¥2ßëMó¹Ú»ˆơăˆŸ‚ëöôêëÚÿÆÛ«‚ ½9‘©·̣¥à±»­ÔùׯÈôê¯öăàܷԡȋǥؙ‰kß [ïSª»¥Û«Ñ©ÇƒvÄÓêƠ´₫®¶ƯwçÚ˜ û×¾Á̉Û«‚ ½9̀Ă™‰kß [ïSÛꙉkß [ïSĂÙÛŸ\¥Ö˜êèäôÉȤˆ\0åĂûÓơÔï½Ù×çÚ•ŒñÓ̉̉ÿ$¾́óÔéÓÏÅ—Úó‹ÜÂÈĂº›¾ƯÓ Á̉óÔË̉û·ÔщÙ½÷ÚƠÚׯ‡ŒÿÛ—Ö‡¸øêăà­vÙ½߈›¶éψ…ô€Ç̃ˆƒv©ÓßÁ·Åă½‹Ó×̃¡Èùë«ÔÍÓ«‡“Íjó¥Û¡ÛĂé‰ñ5ñ·ç̉­ÏŵØƯ‰Á|½í‡Î̉ëÓËƠ‡ÚÛ×źÓºÛ«‚ ½9×¾—¶­ô«‡“Íj™‰kß [ïS¹ÚçÛ«‚ ½9Á‡é/×:ơê¹ÚóÇÓŇ½›;½Û«‚ ½9ªâÔơ3ăˆŸ;±”²Â÷ÁÅÔù×›¾±»ăˆŸÙ½«‡“Íj‰í¡ÔÙÚºù×Ư$­ÂĐÓ‹È£X™‡ăÇíçÚÛëöƒvù×ĐØï½ Ç +©ç½™‡ƒˆ߈÷Á˜‡ăơ«‡“ÍjóLJăơ›«Ô9¥‡ơÔÓØơ»¡È“ö9¥‡±Á¿è¥ÆêÖ« ©ƒ»5ÁË½ăˆŸ;ĂÎÏÅÚǯG‹ø•Ó«ÚÅt–Óäñ­ÄÏÖƯ$ÿÚ˜êèäƒvĂÙ›¾¼»ÑÓç»Ë%ơ‡ͼÆĂ‡ŒÀ‡€è/Ö:½«‡“Íjä¿ù×ÍË)éÛ9¥ƒv߈ËÇ‹æÙå‰ÁœÔÏÅ«‡“ÍjÍƠ«‡“ÍjÛ«‚ ½9ăˆŸ;ßÄÙù×›¾±»­Ûçđq‡ŒǺÏÄùê¼§Äù׬ơÛ«‚ ½9ùê–Ó·‡‘×8çív«‡“ÍjÍBƒ½Đ¡Ó›¾°»†“Û«‚ ½9ö¾«—‰wø×ăˆŸ;»½߈‡“óÔƒÖᛋÇïÚ̀Ăô‡ÛÖÆ·Ó ¥0Ư ÑÓ÷Á•ŒÓº±»Ú׫‡“Íjù׬Ä߈ó#½€ÂµØ·‡‘×8çăˆŸ;ïÚÓ̉ÁĂ¯ ߈™‰kß [ïS¹ÁơêÄØưÀ©Ơ÷Á÷‡½æ›¶é˜êèäăˆŸ;£ØY¹Ú¯ÍĂŽ·‡‘×8ç«%ăˆŸ;·ÅĂXÂÙËÇù×ÏÅ÷Áß»ûÛ«‚ ½9›¡Ó̉—ï—¶«‡“Íj¼ô©Óø×…Ø߈ÍÓ«ÓÅÔ‡ºóÂù×é‰ñ5ñ·¸ÚåÁƒÖ«‡“ÍjƠÓÆö«‡“Íj«dĂÙ¨‡¤2€̃êLÑ·ơêÁƯƯÓ ăˆŸ‚v›Û©‡¥2ßëMôívÙ×Ă­vƠ´Ơ©¼½ĂÙđÖ±»ô©ˆÍÄôÔˆ± “Ơ¿ßå̉ ±Á߈§Ó«ÔÑÓÛ«‚ ½9¡ÔØ×÷Úå̉ ̉ÆÓ™Á‡é/×:½–ÇÖ™‰kß [ïS·££»›¶éÛ÷Á߈éêĂ$•½ívñơêùë—¶ÏÚ÷Áơꬾ±»çÚóÂÛºèÓ›¶éơ걿ŸÅ°¿ÏÔÂÙ½ºƒvÓØăˆŸ£Ç¬Ø®¼ÅÔ±»ËÇô·ÅÓº¦ô‹Ù±»“ÈÛ«‚ ½9ÛÑƠ¼™ëéå¡ƠơԥĜÁG¿ô§ØáÛ¾¿O¹Ă“ÆÅÓÑÓƒv¹Ú½€ñÚ9¥‡ÛØÛ×ƯºؽÔÓχµ†ơ꫇“ÍjÀ½Ë̉çÚơÔư“ƠçôĂƠ±¿¾º +á꯴׿8ù׫‡“Íj¡Ü±”™‰kß [ïSùׇÇÚ¹߈Üéê£ƯÅÔ›¶éçØăˆŸ;kø×1#ï»àÔ™‰kß [ïSưÀ™‰kß [ïSÙĂ©‡¥2ßëMĂȃ¾‘Ÿ}…ö…ǩر»ÑĂëï½ø¿ß„ÇØ­ÖÁ ÆÙÚÚª‚ +¼9“ÜÛùíêÍÓ‰ơ¥ÓÛ×­ÖƠùד™Ë«Ôƒv±•{îéëöơ|“º§‡áêßÄÙ‘ÆùꛡÏíßщăÁ¹Ú߈ưÀ½­Ä÷Á©½€³÷Ç֋ǘ‡ÑÓó±ØăˆŸ;óÂ߈ÆưÀ¹ÚÁƯù×ÏÅíÆ«‡“Íjơê߈»½ÑÓŸèƒvĂôñÚơêÛ¹½ëÛ«‚ ½9³ºóưÜơèÅ«ÔÛ«‚ ½9ăˆŸµØñÓŸ»éÓöÔ›¶éĂ¼”È ú  ±ëر»ùô¼±»µØ÷Ô½߈½ƒv±»«»ư‡±ù1«Ô™Á“‹±»ËƠ߈‰yù×ơÔ«‡“Íj·¼Í7¿‰ÿ¼«Ô±¿ÑÓß»û³ơÔÏÔÏÅö‘µ‰Ở‘È›¶é³‹ÈƒÚûöÙŒë*«°»›¶é̉ÅĂÙÙŒë*«ƒvéÓơ굉‘éÁƯ±»¿‰ù×ĂƠï)ô³Ơ´††Ûºƒ½Ÿu‘«…ôëöéê±»½€›¾߈‚vëÚù£ÈÅÔïÚ©Ó¹ƠXÚª‚ +¼9ź̀ÓˆËÇׯ·Ôă¨ºÙ½¿‰ăˆŸ;»·ÔÑĂ«Ô¹ÅtÛ×Ïå‡ÛƯºƒÖÛ«‚ ½9ﺫâùáÛöÁÎÅ£ÇY—¶™‰kß [ïS³ÈÂå̉ «‡“Íjí—G½€ƒˆỬ™‰kß [ïS›ÚŸ’ĐÅs±»™àÑÓÍLJơÔø××Ó½¿ô²b—¶߈׿8±»¹àĂÙ©Øẳ£  È߈ăˆŸ;kĂï½ăơ·‡‘×8ç¬Ä×J±»®Gøï½ëöÉĂÁ̉ù×™‰kß [ïSăˆŸ;ùơÛ«‚ ½9‘óÔƒvÈĂ º½Íù×›¡±»Ù»ăˆŸ;£Ô„Å­¾‹Ç˜‰j̃ZîS™‰kß [ïS9¥‡×êöëö÷ˆ߈ĐØĂÑó³zÏÔ³Âö¼…Ö‹ÇË̉«ÔÏÅ¡ÔÊÖ‰"àƠ«ÑÏÔ÷ÚĐĂ«́ùê™Áƒïù×߈ÇÖăˆŸ;¡¼éÓăˆŸ;¿Å±»™Ó“­¾«‡“Íj Ëû̉ÓµÛÛ«‚ ½9óÂăˆŸ;Á¼ÈË¿ÏÅ™‰kß [ïS‹Ç¿½ưÀĐÓƠ×ø×ùë®ÈăˆŸ;æ̉áêñÓÏ̉¹Ú…ô«ä³ºóá ‘÷«dö«‡“ÍjĂù××÷‡ùêñíȹ¶ù×Ѷ¹Ú±»ơê½*¾•Ü™‰kß [ïS‘Æ̣Äù×ăƠŸóe“Ʊ»ưÀ‚×Óө؇Ǚԫ‡“ÍjÏ̉¶±»»«ÓÛ×£XăˆŸ¾̉Åɇ­Öµ†Ơ¹Áçô«‡“Íj„ÖÁă¥ĂôÄŽùן}ßÚÏÓÅÓï³2ăàÏÔ«dĂô¹ÚưÀ«Ô¢ÓµØÙ½Ơ¾G÷‡߈ñÙÍåÛ«‚ ½9߈8¤‡¹ëö¯ƯÛ«‚ ½9ơ飻׾Á×ùׇDZ»²½©Ü›¾₫®¶­ăˆŸ;ÿÚ¸Ú™‰kß [ïSª‡’̀jÙ½Ÿå̉ ăÁéÚăÇíñÚÇÖ¸Úå^̀ÓÏÅóÂÛ«‚ ½9ƒv§Ôù×µØơèÅÏÔ™ÁĂâ½€‡ÓÅÙ×ùêëöÊÔáƠ¹Úé꽓·Ô±»üÆÙŒë*«ËÉ9±¿Ǿ«‡“ÍjÓÏÁĂ9¥‡ö¡Ô‡é‰ñ5ñ·Ă¯È×Ơ…ô߈íÁ߈ù×™‰kß [ïS心½­ÄÙ½÷‡Ûº¼ĂרµØÏÔ‡Ú£»ÛĂ蜇̀ +­ôö«‡“ÍjĂ$¬¿áêĂĂ ›­±àéMÙÅëÜÏÔù×߈™‰kß [ïS‡Œç4«ÔĂÙ™‰kß [ïS½µØ¹Ú«‡“Íj Ëû‡Ú߈đ,¾ÏÔƒvÇ"ù×™‰kß [ïS‰¼ÏÔ÷Á›¾¬Öä߈ëö»ˆ±»ÑÓ߈‡Û«‡“ÍjÁĂŽơêÙ¾ưÀ»Ú¯¼ÅÔ·¯éÜùëßÁ¿¾«»±ÈŸ¿ËÉ9ƯºóÇå̉ ¿‹Çׇ½7÷ˆ‹ÜăˆŸ;kùê«•ăˆŸ™‰kß [ïSử™×™‰kß [ïS¡ÔÛ«‚ ½9·‡‘×8ç½€¡»ÛÔÉĂ9¥‡×‘ÆÏÅ—¶§ƠíiëöÆ¿ôƒÔÏÔ™‰kß [ïS¹óơ髇“Íjù×½ăàóÔù×8¤‡ÙƯ¯¾߈ñÚ™‰kß [ïSƯÓ ”{¯×¿ׯ›¾é‰ñ5ñ·© ÏÔ3ĂÙăˆŸ;—»ÿ¯¶›½ÊÇ—¶ƒ¦ÓñơԽ‡°»‡º×—¶áÛ‡ÏÄÚª‚ +¼9ûØçôÿÚƒv‡º߈ĂÙƒÖÙ×›‰¾ô߈¤Ø¸È㻦¹ƒvɶÚÀÅnßôơêÍË)éÛ9¥×̉¢È÷Úÿ¯¶ï‰«‡“Íj¹Ï߈«‡“ÍjỞöưÀÂĂÖÏßé‡ÿ¯¶ÙŒë*«шñÓ‹ö™‰kß [ïSù×ĐĂ ߈áÅëö—»Ù×ñ»½­½¼«dÅØ™Á³ăÏÅăˆŸ;½“½«ÚÙ½Ơºm½đù׃ˆử°»ËÜƒăˆŸëĐ«‡“ÍjĂÙÍÑĂÏÔơ‡Æÿ$ùת¶2tTƠÛƒṿ™‰kß [ïSăˆŸ£ ̣Ăù×ÙƠ›»ïƠûÛÚ¶èǽÍË)éÛ9¥«·3uUêơQׯ©‡¥2ßëM¥ˆ]1ù¡ËƠµaå̉ ߈ù×ÙưÀ…Ơù×ÑÄëăྺƠ©¼Ơ…ÔÏÄ™‰kß [ïS·ô«‡“Íj‰~ϺƠù×±¿—¾·ÆăˆŸ;÷Á°¿×Ă™‡—»Ở±½÷ÁÍÓëö釩‡¥2ßëM†Ûá=—Û«‚ ½99¥‡ÙÅëđ»Jª‡’̀jĂØ­Äר߈£äшÍÓơĂ߈œ‰¾IưÀöª¼ͽù×ăˆŸ;k©ÇÿÚƒvÅÓÇĂ±ëØ·Å˜‰j̃ZîS½«»Ç̉·¼Í7âˆ:jƯÓ ñÆä̉¿@¾@™‰kß [ïSơÇÛÏÔÙ-µ!ƒv¿Œ©Ó½€Û«‚ ½9Ûº«·3uU¿Å¿Å±»Ûº×Ơƒˆ‡ŒÓØ«‡“Íj·Åƒ—±»ĂÙ‹ÇåõÈ߈ù×÷ÙŽÿ$«‡“ÍjĂ٣䷧D ·ÔÊÙ«‡“Íj«‡“ÍjÏ̉ƒçÀ«Ô߈ÏÔ¢Xß„£ÓßƯç'Û«‚ ½9ÏÔÙڟȡۙ‰kß [ïSÏÔ©ØÅÁÁ½Ç؉½œÜ凿‰Úª‚ +¼9£äsÇÖ½¡»¥¼€¿âÛ«‚ ½9«Ô«‡“ÍjưÀĐÅ7Ç»Ô窶2tT½ăˆŸ;ê$¿ôöǼƠËÉ9ëö±»ëö–¶—ˆ½™ÔºØ@@ ÓÏÔÛ«‚ ½9ß&•Ô匿Nù×Ăȱ»ǼÉû¥ˆ]1߈Ä÷ÚơèÅ·Ô›Ú‰¿Ié¼¾ºçôăˆŸ;kƒˆÉ̉‡¥Ö¹Ïà¯ơĂù×ÏÅ™‰kß [ïS9¥‡×$ëöå̃â»ăˆŸ;å̉ ­ÄƠ£ØïÔ»ÅăˆŸ·‡‘×8çËƠ纃تڂvÿ¯¶ÿÚÛ×ù×Ù½©ÆöÁ¨ÿ°ÇơÙñӯȡÇÙÚ º§Ó£ØƯÖß„ó%¬ÖßÚù×–¶ÑÓ󹥈]1ĐÄ꯼ưÚÙ½ăˆŸóĂå̉ ÇÖ—Œ›¾ÓØ¥ˆ]1·È·Åùש‡¥2ßëM©&»²ÍÓ£ƠÛ«‚ ½9ÛºÇ̉§ôµØĐÄ꽃֓¹ƯN¶®È¬ÖßÄÙúà¡Ûÿ¯¶ŒÛ±»¿‰™‰kß [ïS§ÓÓ¼§ôĂÙ˜‰j̃ZîSÛ«‚ ½9ö·‡‘×8çăˆŸ;µØ—‘ÛÄÓ«ÛëößÚêÅ̃µØƠX«d™‰kß [ïSÏ̉™‰kß [ïS—–§Øơê½ô9¥‡¡Ûăê½±ëØÏÔؽÏԜܷÔׯÏÔÖ¹Úׯ­ơ·ÔĂÖÿÚ“Ơ«‡“Íj˜Ûß¿ôïi߈½ºy#á±»ẳ¡Ôù׋ÜÅØ·‡‘×8çÅØ±»ÁĂù×óÔÏÔưÀ©¼éº±»—ÓÁƯöÁÏÔÿÚ®àëö±»±¿¥ˆ]1ÇÖ߈Ï̉å̉ ½>±»¶ôĂÖ· ßÁ߈ƒØ½ÔµÈÁ˽߈ÿ§«»ăơơêßÁăˆŸ;÷éơèÅù×ß»û§½«»ùׇ9ï»§öù×µ€ÛºƠƯáêÿÛó‹íêɇ×í¼‘Æ™‰kß [ïSĂÙ߈á å̉ ©¿¶  ƒvÿÛ½ÏÔ£ƯÚºơê›ÔÍʶô°» +§Ô»ÔϹ«ÔÁăßÄÙßÁ±»ăˆŸÁٵر»߈ăˆŸ;±½8¤‡ơº¡Ô”CÑÄëçô½€¾•½å€‹ÇëÓ¹Úù×ÏÔĂÙáëö·‡‘×8ç…î‡9ƒ®áƠ¡Û½ƠĐÓµ·ÔÿÚÙ½¥Û·‡‘×8çƒvƠÏÔÔ¹"̃¿½«‡“Íj߈ƒv½…Ö¡‘ÆÚ¹ôºÚª‚ +¼9纱»«‡“Íj߈Û«‚ ½9Ƽϼ¡Û߈¡ỖçăˆŸ;k‚Ú™‰kß [ïSß»ûÑØ™ÁIơ$Á̉µØơÔùדƠäÁ½ăà˜‰j̃ZîS·Å¹Ú§Ô÷ÚÇÖókß [ïS½€¥ˆ]1±½µØĂÈÍÄ×î±ÔưÀ±»•ŒÂÙÚ÷‹¿±߈ÛÄÓ÷Á߈ÏÅÙÚëÓ™‡“ÈÙ½RÏÔƒ½ơêß»û«»êö¾Â§sǺôÄ”Èú¾‰Û«‚ ½9Û«‚ ½9߈÷Ûéê±»ËÉ9ï²2™‰kß [ïSå©Óù×ñáµá•Èû›åÁÍË)éÛ9¥³àđ¹˜ •ŒÑÓƒˆ±»«Ó¦Óùê’ÆñíÈ÷ÁÁƯƒ…Öé‡œÜ +ÏԵ؋Ç߈µØ¯ƒßÍ>çôªÚÍĽ™ëé婇¥2ßëM³rº¿‰›¾ÎÅ÷Ù¯G‹øĂ¹ñ»ƒ×÷Á¯×ÓÆ9¥‡Ÿ}Û´Å“ñÖÿ¯¶™‰kß [ïSŸƠ½å̉ Ơ¾GÔ]¥Øö“Ơ¡ÈñÓĂºƒÖ«‡“Íj÷ÁưÀăˆŸ߈óg"ĂÙ±đ™ëéå£ƯÏ̉Ù×߈±»…ØéºăÚ­ÖûتÚ;¥¾¡ÁµØøêÏÔËƠ÷Á÷ÚÙÚ§Ô½×¾ÍÄÑØ‰±6Ûn匿NÚÀßÚؽ½Ỗˆ¡Ư±»̀¬H˜‰j̃ZîSăˆŸ;ÆùơƯ…Öƒ¾‘¹"̉Å´©ÁÎĵa·‡‘×8çÆ°»«Ô«Ă“ƠƠX·‡‘×8ç쫇“Íj™ù×߈ÓÜĐÄ ê ‰¿I™‰kß [ïS›åÙÁĂ³Û«‚ ½9Í·ÜͪÓÓỞÙqă¾̣̉­½¼¿‰ÏÔ™ÁĂÙᬖˆÏ̉·Øí‡ù׋ÜÅÓơèÅÿÂÎÅ߈ñÄÙ½™Á¨¼ĂÙĂÙ÷ÔÛ«‚ ½9ƒvĂå̉ —Œ±»ûÓŒ¾ +ƒv±»›¹—¶¹Ú£ä—»Û«‚ ½9HÙÅëùׯÈñÚ‹ÇÅÄùׂÖĂĂ ›­±àéMƒØׯ¡Èéº׆ơêçéĂÙ«d‡º¥ˆ]1ăơ·ºº߈9¥‡áÛ™¾½ÍË)éÛ9¥öĂ¹ÚƯÚ«‡“Íj•½íÖ™Ó±»¿‰Ăºµ̣Â÷¼ÙÓơÔù×ËÇ×¾ù×ëö/¥‰ÍL…Ƽ +«‡“Íjßֽغ™»¸£³Ø‹Çà×Î̉ùꇌ¾¹µ†ëö•ÖÅ¿‰±»߈™ơ«Ôó´Î¿Å÷Ô™‡Ơ厰»“Ơ¥ØÅİ»ºù×÷Á¡Ç¿»ù×§ÓăˆỴ̈ÇÏųدÙÚ‹Ç߈ƠXăơ±»±»ù×ùêơêư‡±ù1ψ¯Ơ߈÷Á߈¹ÚË¿“ºôÏ̉¸àÍí±½×Ăß»ûăˆŸëöñÚ›¾°½´ÀçÚÙŒë*«Ù½ß»ûÏ̉±»µ†ƒÖó—Ó»ØÛ«‚ ½9ÿ§ù×ǼăˆŸ˜êèä™Ûï»™‰kß [ïS«Û½ƯÓ áöƒ̉ºĂÏŧÆ߈¡ÁĂéôÏÔ¦ÔÙ½±»ÏÔéÚ˹߈ÁƯ‡Ç»qÇÖÏÔơêñÓëÓù׺±»µØÛ«‚ ½9ÇÖóɰêØăˆŸ;‡Œ±»«Ô¶ƒvĂô›¾«Ôù×Û«‚ ½9ØÛ׋ǻ~™‰kß [ïSƯÁ·‡‘×8ç—Óô¤ØÏÅÛ«‚ ½9’Ơ¤ˆ\0½Ăƒv¡È§Ô™‡•ŒÙ½‚v׿8µØ·Ô™‰kß [ïS¸ÚĂĂ‹Üù×ù×ëöÿÚëö×Ơăà·Ô?—¶Ïű̉ÏÚÊÖËØơèųٽƒ°½Û«‚ ½9ĂÈÖ¾âà ÏÔăˆŸĂYÿ׋ÇƠÍË)éÛ9¥¨¸¡Ơ±»ă½öÏű»ù×ù×߈Ù½•Öÿ$ÏÄщĂĂ ›­±àéM¤Æ߈ƒÙ̉µêÀ廃vă»ơçÚ‹Ç™Á¬ÖÏÔ½ï½ï»’©‡¥2ßëM‹Ç™Ä…»ÍË)éÛ9¥ñÜ—ÓÏÔ´ê µØÙÅë—ˆ³ñÓñ×ơÔ™Ô¿‰¿‰ÅØÛ«‚ ½9½Ù-™ëéå­ưâÛ«‚ ½99¥‡×‹ÇØŒê*ª߈ÂÙ×Ă‡ÄØ̀Ê)èÛ8¤§Æÿ¯¶ÿ¯¶Û«‚ ½9߈™‰kß [ïSăˆŸ;°»‘±ÙÚ™‰kß [ïSë$ƒvëÓƯÓ ºù×ÑÓÍÄÔXä̉äÖ¿‰‡Îѽ¯G‹ø½È·µéº߈‰đÿ¯¶߈ívÙ½ăˆŸ;¿Åº§ÆñÓ·ÔƠ›ơĂë¡Èƒˆ£ØׯưÀ匿NíêƒÖ˜êèä¹àÑÓ¿ôơăźéÓ߈½í¢ä¹Ú“¹ƯNỬ»»®G ø ư›z˜‰j̃ZîSŇŒ—»ÿ¯¶ĂÙÁ̉ÏÅÛ«‡“ÍjăˆŸ;Óçº9¥‡‰êôÅ»ºÏÅÏÔïÚ‰yÛ«‚ ½9ÁĂÉ€ÿ¯¶8¤‡Ÿ}Û«‚ ½9ơê߈ƒàăˆŸé‡ÅØß»û߈ÿÚ×Ơ†7§jµÈ¡»Ûù$«‡“Íj÷‡Ï̉‡©Ç¾ăÇí̃ˆá̃ơÄŸ}®¾߈öï»ù‡‘ÆÓÁĂÙÏÅÛ«‚ ½9Çᘉj̃ZîS‡ºå×…¾ß»û±ëؘ‰ j ̃    Z îS ëö—Á¹̃½ơƒÖĂÈÁƯºÁ߈›¡·Åëö¡Ô«Ô¶Ô ­Ö©‡¥2ßëM±»»½ù×ơê±»·̣™ëéå¿́Ù½±»ưÀÓÆÙ½ù×›‡“Ơ…©†j¨Èà"óÓ™‰kß [ïS™Á±»ëö®ÙÓĂô¹Ú߈ù×óƠÅØÇÚÏỔØơêÙ½±»ƒv¶è󼄾«»±¿Û«‚ ½9ù×ĂÙöÁE™ÓƠ¼ù׃ˆ½Ă°»®Óï½Å»ù×ù×ᬵa˜‹©¼ÑLóÇ÷ٯȺëö“Ơ›¾™‰kß [ïS½ÏÔÍË)éÛ9¥ˆ¾™‰kß [ïSëöÿ¯¶¼€9¥‡Ÿ}°¿·ÔÿÚ™‰kß [ïSÑØÏ|½·‡‘×8çÛו׭Öù×ơ꫇“Íj‘ØƠ‘Üß­Ä«‡“Íj­Ö±»é›Ô‚ÏÔ•Œ¶Å™‰kß [ïSÁƯï»—»¯¾áêù×ăˆŸ;kăˆŸ;Ó׫‡“Íjƒv™ëé噉kß [ïSÁƯ±)áê¹ÚàƠ†ºăàÏÔÛ×ÏÅÓÅåĂĂººăˆŸ›Úˆö­Øƒv±»Ë%³›߈¼Ô +áÁß»û›‡ÿןÈöëööÁÂÙơêưÀg‡Ç©¼™‰kß [ïS¯¼8¤‡™‰kß [ïSÛÙ½ôơÄ–¾ñÓÛøÛÚù׳ºó¡`ÖÆïi™‰kß [ïSăê¢'Ùâ¼ïÅĺÏÔ¯¾ƒ½…ï½Ô½̣Ľùê­văˆŸ;ù×™‡ƒvºà ö›¾ív…ØßÅî$ĂÙỡ·ÅÁ¹ÁỮˆ¿߈íÖăˆŸ;匿NƒÄÅđÏԵؙ‡­ÄÁ×£ä Á™ÁÍÄÛ«‚ ½9ëӫѫԡÔăˆŸÅÓ¼€ăˆŸ;íÚáÀƒÖÛ«‚ ½9¿à™‰kß [ïS¹Ú߈Û«‚ ½9…ÅÄôäÁ·Ô¹¿ÓÅÛ«‚ ½9©‡¥2ßëM¹Ú‡ñ5·ÔâÁ½»‡ăˆŸ;k«‡“Íj¡ưÀ«»½ÛºƒƒvÛ«‚ ½9§Ó˜êèä«Ô÷Áø¿¼±»ÏÔÚª‚ +¼9Æ“ÆĐĂÉ—ÚÇÖ¹Ú߈¹ÚÛ«‚ ½9ÈĂ#ÏỒëöÆĂơê´C +à=‹Ùœ‰¾IăˆŸ™ôÛ«‚ ½9¿»ívÔ¾FÍÓëö߈߈ß»û±»«d¢XÏÅ“Èöï½Á̉Ø©Ơù×÷Á÷ÁôŒ¾ ¡»”ºáÁ¨¼µØỞÇÖÏÔ¾ƒv…Ơ¨¼ÁĂÓØŸÖỔ™‡ÑÓăˆŸ£ÇëöÓÅÏÅÁ×¶èù×…öửƒÀ̉Ǭ¿Û«‚ ½9ù×ăˆŸ;±»á ±»ÍÓ±ÈñÓÓÆ—ˆ¹Ú§ÓàĂßÄÙ™‡ÛÀ̀Ó‰¿I±¿ơÔéÓï½óÇßϱ»…Ô«‡“Íjëöù×ÙÚăˆŸ;k©Üô¹Ú³È­Äé‰ñ5ñ·­ÖÑØÓÅ߈ÓÅѶÑĂɹơÔÛ«‚ ½9«·3uU«‡“Íjƒ½µØØœÇÓ¥ˆ]1¾¹x¿‰Û‡³È“Èă­®GøëöñÚĂÙ߈‹ÜÏÅ™‰kß [ïS™‡™‰kß [ïSÓ˜ÛÀăˆŸôĂ³Øử“¼é‰ñ5ñ·ÜØ̉ÏÔº̉±»ơêщĂºƒˆĂº£Ç߈ƯøêY£äáÛÇ߈ß»ûù×ׯ÷Úö߈ôщûƯ‹Üô‹Ü½©Ó«·3uU“Æ߈Ù½‹‘©Ü•°öÔºlº¯È«»Ù½ƒv«‡“ÍjÅÓ¿ß·Å«‡“Íjñ±ÜÏÔź›¡¾—ˆÏ¹ÚÇ«·3uU™‰kß [ïSÏ¡ù×»ÈĂÙ±Á¿ßÅÔƯÓ „»½™ô÷Ú¼€â®ÇÅÙÚƒˆĂ•ÂÙ½³Åζ2tT̀ Ê) èÛ 8 ¤   ÎÄ­ÈăïưÀ¨Ç¶  ÷‡ÏÅëö‹Ç±»ưíăˆŸ;ÏÅ“Ç×ÓÚ×ÅÑÄ냱ơèżÔñÁ™Ô§‹ëö߈éºÑØíÚÑÅĂô÷Á©Øá ½ô߈ƒàµØ̉Ó£»ăˆŸÎÅéÓ™‰kß [ïSÅØ8¤‡¸ñÄÛ«‚ ½9ö‡…9¥‡Û«‚ ½9߈»ÅÚÆͺ†“Ž«‡“ÍjÑÓ‡Û«‚ ½9½̣ÏÔá£ØÀ¹̃ˆ©Óƒ½ÉϽ³ÓÅĂôèÓÏÔÅØ£Ø¾ñÓ¸ÚÏÅχöÓÆÏÅ©ÇăÂÁÏÔ±»ï»9¥‡íÏÅ…±öÁ߈³¾ü‡°ø1½‚ƒ9ăˆŸ¡ÛÑó߈‡ÚÓØ9¥‡™‰kß [ïSăê‹Ç߈ôĂ×¼±Å‘Ùâ¹ÚÍӮȣ¾ñÚÛǹÁ–¶ÏÔ™Á£äçÚÉ̉º½›¶éáÛ™ĂÆëöïÚơĂÏ̉—Ó¹Ú™ëéå±»‡Œ߈ƒ½›¥«‡“ÍjÏÄ́vù×á̉ëöåÖ·Ó ¥0¹àƠÅÔªÚËÉ9±Ô£äÀ̉×ơ߈‰¿I±»åôµØƯ‰»‡çívăàö߈ªº%жÎÔ뫇“ÍjÑ׿ƠÁĂÿÂÁĂ™ô£Ç¹Ú«ăå̉ ñ‡ÏÔµØöơĂÛ«‚ ½9«‡“Íjëö߈ă­—¶Û«‚ ½9ăˆŸ;Ûº°»ËÇơĽưÀááêívÓăˆŸ;k½€ëÔơêăàù×Ó”ù궺 íê”ÙŒë*«µØÙ½Û«‚ ½9₫®¶‰¿IØ×¹ƠĂÙù꤉̀L„‹ ĂÙ–»½ĂƠÅ«»ÙÚúÙÏÔ߈Ùâ߈ĂÖÀ̉·‡‘×8çå̉ «äù×ív»Ø«‡“ÍjÆ_‡Œƒv÷ÁÛ«‚ ½9Û«‚ ½9å̉ Ù½щÙ½×̉…øº°»ç$׿8À‡€è/Ö:‰ùí»óÇÖó±»Û×ơêø×ÁĂ9¥‡¡ÛöڡȡǕÇăˆŸ;Û«‚ ½9ù׃ڱ»½°¿ÿÚœ‰ +¾I +«‡“Íj¹Úăà¶Ø†äÛ«‚ ½9™‰kß [ïS±¿“Æø¼™‰kß [ïSæƠÅÄ“ƠívÚÆǼµ.¥ÙÙ½á̃«ÔÓÆù×ơ꫇“ÍjßÚ•×Óº©‡¥2ßëMÍË)éÛ9¥³(˜êè䙾ưÀ߈߈߈“½½€›¹߈ù×8¤‡¡Ô«‡“Íjă»¡ÁƒÖ—ؽ£X³ºóßÏăˆŸ;këöáê—»ëö¦¹ÏÅăˆŸ;ù×±Á«‡“Íjë±ÁƯÏÄׯ½€°»¡ưÀăˆŸå̉ ¯»§ô˜‰j̃ZîSµ†‰ÁÄÓíê߈ñÓ±»ר½­™‰kß [ïS¹ÖÓÅ¿ØÄô ơê§Ô‡Œ©º«Ô§ôÛ«‚ ½9‡Œ«Ú£ÔÖ¾ÇÖ8¤‡ׯëƠU§Æ¾ƒ¾‘ÿ‚vĂÚª‚ +¼9¾ºéÚÏÔ…¾ͼ9¥‡×µØ—¶Ûă*ơÔ8¤‡Û«‚ ½9™‰kß [ïSívçôµĂÓtƯÛƒÚ—Œå‡ÿ¯¶µØßϹÚĂ¼±»‡ºë‰ÑÓº·Ôԭر»±»ù×Á½ö˜‰j̃ZîS”ÈúºÁ¼ßÄÙôÔÛÄÓÍË)éÛ9¥¬Ö§Ó›ÚåĂÏÔÙŒë*«ÓÔơÔ€Ư³ öå±»ưÀÍ„Ưº÷Á‡×µØï³2±»›¦ơĂÛ«‚ ½99¥‡ñÚµØÛ«‚ ½9ºù×½ÙŒë*«« ©ƒ»5³È¿ØÓذ½¯ÈÙ½»ÁÆĂÍƠ´½ « ©ƒ»5ÁƯ™‰kß [ïSëÚ™‰kß [ïS‰Ư­ºƒ×å̉ ç_ăˆŸ;kéÓ™‡«»Ơ°¤ˆ\0ăˆŸóÇ×ܘêèä麋ÈÛ«‚ ½9àêóÂÛ«‚ ½9ÿÛ±¿±»÷‡Íăâ½ÍËÁù¿ĂÙµưˆ±»ư“¿È9¥‡÷$Ù½·‡‘×8çưÀµØ§ÔƯˆœÓÓư¿ü?‡,·Ô™‰kß [ïS¡ÛÍÄƯÓ ÏÄù×Û«‚ ½9‘Ó—»÷ˆ©¼‹ÇăˆŸ;™‰kß [ïSƒv«ÔÑĂÅØÛºƺ¾ù×ù×ÑÓ«‡“Íjù×ÑĂá=¹ÚΘ›¾ëö±”˜‰ +j +̃ + + + +Z +îS +ƯơÄ«·3uUùêш¡Ô›¶éçô‹Û½Ô³Ư¸ÚĂĂå̉ ¡Ô—»Ÿ¾ơºƒĂ›ø™ÛÅ«Úù×Úª‚ +¼9ƠƒvÙƠÁ™‰kß [ïSǺ*ÎŶ۫‚ ½9Éäô߈îűỒÓèÖƠµØÛˆ™ÓÙóÇ¡Ẹ̀dz˜êèäåÖưÀ‰¿I·¬è¼ù×ơê÷Ù¯G‹ø«‡“Íjéê½·‡‘×8çí«âׯùêÛ«‚ ½9«‡“Íj·Ô¯×ăơùêÀÙ½‹Ü›¹Û«‚ ½9§¹₫®¶Û«‚ ½9™‰kß [ïS©¼ƒvù×™‰kß [ïSÁ½«dù×ÏÔëöÑÓîº å̉ ¹Ú÷ÁÙ½ơê½ḯû.Ă ³Â…Ôă½›¡ϺËÇÁƯG½¹«‡“ÍjÛï½ĂƠå̉ ₫®¶«ÔÛ«‚ ½9߈ÈĂ×à™‡ÏÔàĂÙ½ƒØÖäÆơÔÎÅù×·¢½Ô«ÔçÚù×ăÇí›Ú߈߈­ơøêùêÙÏÂõØÏ̉ÏÅÛ«‚ ½9‡Ç•ŒĂÖ%±»ăÁ«»±»í—G—¶ơê„ØăˆŸ;™ëéå±»±»‚v÷Á½Ûº́Û«‚ ½9™ëéåê§±»«»ÏÅăˆŸ¡Èăàëöӧ˱â™Ô߈ÛÀ̃„™–ÓØçÚ9¥‡ơêÏỐơ¾ĂÙăÁÛ«‚ ½9Ó¼»óÛº¡ÔÏԓƣ䱻X«Óÿ¯¶³”‰ÛµØ·ØơÄëÚëö¿ç³zùן߈íºéº¿‰ăˆŸ¡Ç™‡±»ÿ¯¶ÅàïÚíÁ™‰kß [ïS9¥‡ƯơßÁ̃ˆ×¾÷Áƒˆ˹ëö‡×ÏÅ߈ÏÈ̉ĐÓ¹ÛçÚ½€μÎ̉˾ûÓÛ«‚ ½9ƒÚùêßÖ߈½Ø­Ö±”߈ƯÉÇÖơÔ°»›¾±ëؓȾ§ÔÖ˱¿‰ăˆŸ;±»ËÇĂºĂȇÇ̣¶ÏÔÏ̉Ѷ‚Ö±»ŸÖâơ‡Œ‹Û”½›¶é™‰kß [ïS­ÖÑÅÄØ«Ô¨¼…»ç̉Çâ÷Ù¼‹Çù×ù×Ơ´ÀSÙ½‚ơèÅçÚ±»Û«‚ ½9ƒˆễ¾ƒv÷Ô±¿߈‘áƒÖñ¨ÁÛ«‚ ½9ÏÔ×̉¾¹ÔéÓµØáĐö¹Ú¥‰ÍL…Ă¹̉ç­ùê÷Á¹àÏÅ۱»Ù¡™‰kß [ïS¿ô€ºƒÖéÚ×¾«‡“Íjëöø×Ù̉ĂÙÅ–ÁĂÅÓ«‡“ÍjơêƯ‰ÿ›¾û¥Ûêöå̉ Û¡Ó›vÁÓØ×ù×釛vơꪻ«dñÖçmª‡’̀j¥Ø¼›¾ÙڋDZ”Û«‚ ½9Ă¼ß½ÙÚ·Ô±»µŸàêôâ½™ÛĂÙÛ«‚ ½9÷ÚÏÅöÁ÷Úë$ÁƯ—¶á ăˆŸǼ·Ô±¿´×£Ç¹ÚÏ̉ƒv‡Ó̉óÇ則™‰kß [ïSÏÔ÷¼—»»÷¹ÚŹڱ»±»éꙉkß [ïS£̃ǽ€²Â™‰kß [ïS›ÊÅÅé‡Û«‚ ½9÷ÁßÄÙ¼ÂÛÄӘי‰kß [ïS™‰kß [ïSÏÔµ ̀Ê)èÛ8¤•×Î̉ö·‡‘×8çëö”ºº™‰kß [ïS÷Ô§Ô¹Úö¡Á›¶éöÙ½ñÚăÁñÙ߈ÓÂÓϹƒÖƒvûÓƒˆăà¡ÛÛ«‚ ½9”Ö +ívǼÜ™‰kß [ïSưÀªø ăơûá ¹ÚÛ«‚ ½9÷Á·‡‘×8ç½€ív½߈™¹ÁÛ«‚ ½9ÁƯ±́¿‰ëö±ÈÂĂŸèå̉ÅơÔôêưÜ›¶é™‰kß [ïSíÓå̉ æØ™‰kß [ïS­ÄƒvÅØ߈ßÄÙưÀ½Ç’ĂÙ̉Á9¥‡×ƒˆϺÚª‚ +¼9©¼™‰kß [ïSăˆŸ;ăˆŸ;ñÓ°¿ ïi¹àÛ×ͺÓº™‰kß [ïS·Ô9¥‡×‰Û«‡“ÍjÀ½¿‰ÑÓă½«‡“Íj¹Úï½ơêɇµ‰¿‰ù¾±»¡Ô߈½™‡•Œ÷»öÍÄÏÅ›Ă‡Œ‰¿Iùêͽ¡Ô½ĂÏŰ» µØù×±¿­ÖÏÔÏÔưÀå̉ ¦ÈV¥ˆ]1›·Ô©ó¶—Ó¡Ô“¹ƯN«‡“ÍjǼăˆŸ;½ưÀ¡ÇÏÔƯơÏԩص†9¥‡‡ºưÀ£äºăÇí×ĂׯŸ}Û꽫ԫ‡“ÍjéÚ°»ĂßÁăˆŸíÆ¶văˆŸ;kŸ}߈ñÔÁ‡é/×:©ÓÅØï³2²·¼Í7ÆÖ±»Û«‚ ½9½ƒ¾‘íÖ¡Ô‚Ô±»Û«‚ ½9Ç̉­á9¥‡›ÔÅÓåĂ£”ë¼›¡âˆ£ôɇŒ±¿»Åñ„₫ÏÔ½€—ˆÏ̉«‡“ÍjơÄá=Û×¹ÚÅØ·‡‘×8çÇÖ̃ˆĂÙ™‰kß [ïSôØ߈¥Æ‡x̃ˆ•Œ›¶é›¡ăˆŸÙ½Å´Ó +̣ÂÉш麭€ÅÓ¥ˆ]1ăˆŸ;Ơù¿ÙÚÀƯ‡Úº£äÿ§ù×ÓÁÅ–ñÓÛ«‚ ½9©‡¥2ßëMÏÅŽÇÖŸ}¡ÈŸù×éê½€¥%ŸÈ¡Ôơê¹ÚÚª‚ +¼9́›½€ÑÅ»üÆ«‡“Íj߈×¾ëö÷‡ÅÄ™‰kß [ïS©‡¥2ßëM±»¸ÚÛ«‚ ½9¡Ô¬¿‹Ç©-±¿™‰kß [ïS“½ÅÔáµaÿÂç*©ÓíÖưˆ߈³ Ù̉ùëƒv›Ú«Ô½©ÇÿÔùÛù¿›¾Ù×ăÁÇÄØ¹#«‡“ÍjỞ±»Ó߈®Ó³ù×êÓ9¥‡¡Ô‰’ÿ +‰¶ ëö£ƯÙ½±»å߿ŇŒơÔÙÚÏŇºÏÔµ߈߈‚¾ŸÈ™ëéå‹Ç‡§›Ï̉Ö$Ă½ÔÅÄÁ¹ƒv°»ÁÓóÇĂÈ¡»—¾—ˆơĂ©‡¥2ßëM¿́ƒ×ëµa«Ñù×±»Á½ÅÔúƠ™‰kß [ïSÍÄơ꿉 \ÉŵطÔÁÏÅ«‡“Íj¼Ô¹ÚÅÓ±»ơÔ¾ÙÚĂºçÚơß»û¿ß«ÚÂÙ²¸ÈĂ½ÏÔ™‰kß [ïSÏÔăˆŸ;ƒª÷ §ÔËÉ9ÏÅÁĂÅë¼™‰kß [ïS‰yăØ»ºÓÙ½Ä–ăˆŸåEï‡›Ă˜‰j̃ZîSÏÅéJé‰Ó5“gesÁÅø×·Ó ¥0¡ÔÛ‡ºÇØ™‡Évö‹ÜµØÍƠÛ×¥‰ÁÚ¡»©ƠĐÄêëöùê« ©ƒ»5µÏ™ÁÛ«‚ ½9Ù½ÁƯ·#ø¿ƒ¾‘ÏÔăˆŸ;ơêÇ»ëöÓº߈ÏÅœÁµØÙ×ăˆŸ;߈ơ$ơèÅÏÔƯÓ ƒv©ÇơÔ“ÈûÓ©ÇÉ çÆçÚÛ«‚ ½9ª‡’̀jơÔ߈߈ơÔíÆ߈ĂÙË̉ÙÚëÓÁñ™‰kß [ïSÙÅëÁĂ¥Æëö…¾÷Á•Œ»nÙׇŒÍË)éÛ9¥Ù½ëöÍƠ™‰kß [ïSÏÄ›¾ăˆŸ;k¿ÍË)éÛ9¥ŽÍÓ™Ó½"µ†½½ơê­ÖÁ‡é/×:­¾Ï̉™‰kß [ïSƯ öƒv×$ưÀ·Æ‡ù׫‡“Íjƒv»yÏԭħÓÙáÛ«‚ ½9ƒ¢ ‡ºÛ«‚ ½9Û«‚ ½9‡“ÔƒÖ‡ŒûÓçÚÿ¯¶“ÈÂÅÔ½¹ÚÙ½³µØà¬ÏŽ£äÏÔ©Óá éÓƒvó°» ˜ÁÏÅ·Ôù×ưÀĐÅÙ½­ÖÁƯôêơÅ«bçÚÇ«‡“ÍjÛ×°½ơêœĂïƠêÓ¹Ú³‹Ü÷Á±»‡ÇËTÓµƒ×á ùêÚÀJÉĂ¼ô¡%ö˜‰j̃ZîSÁ‡é/×:åÁ½ß«‡“ÍjÛ«‚ ½9½€¿ËùôíÖăˆŸ;ăˆŸÖ ăˆŸ«Ô†Œ   Ûº›¾¿‰ăˆŸ²t±»í‡¬Öź©ÇŸèé¸9¥‡§ô«‡“Íj»öåÁö˜‰j̃ZîSÏÔ߈½€¿‰™‰kß [ïS‚v߈´†±»½ÏÔ÷ä5̉ͽ±Ôä̉íØ¢Ç™‰kß [ïSù×ăˆŸù×ăˆŸ;ƒÖÚן¼€ ÿ¯¶ÏÄá 麓¸±»©&§º·Ô«‡“ÍjöÔƠ£ä¹ÚÏ̉¾ƒ¾‘‡ºơêêØÁñ߈ÙÚôêµÁñÿÛơê߈¥ˆ]1Ú׃v™‰kß [ïS¬ÖỞ½€½è߈¯G‹ø·ˆéºưƋܙ‰kß [ïSÅ¥ƒvñÓỞ¡ßëöåĂ÷Áé̉“Ơ¯Èåô›¶éµØ©¼Û«‚ ½9­€ù×Ăôùêăêù×Âß»ûá=ăˆŸ;ù×ÙÚ¡Á‰úÙ½¹Úƒ§™‰kß [ïSăˆŸƒˆå̉ Ÿ›•Èû›ùê§çœ‰¾IăˆŸ;°»ú"¿́™ÓơèÅù×ơÔ¤Û±»ơèÅÛ×߈÷Ù·Åå׺µ†ĂٯשÓÙỞÆœÜÔXå×ăê¿Ø›ÚĂÙ½Ù×ï³2ÅÖ“ÁË÷‡ÓºÏ߈ÏÄ«‡“ÍjéÓ±»É䘉j̃ZîS™‰kß [ïSáêÛ×ÏÅử߈™Ôüƽƒvù×ÏÔ«‡“ÍjÛºå¼ óÇƠåĂ—¶áƯ¹ÚÖØñ‡…Ûºy“ÈËƠĐÄê±»‘€ÛÄÓó–§ÓÏ|9¥‡×ˆ´†ƒˆû¼ù×ÿÚ™‰kß [ïSÁÛ›¾…Ö½€Ó؃Ñ̃›¡–ÓÛ×¹ÚÏÔÙY×Ó¯È9¥‡³ëöÛ«‚ ½9ÁƯ±¿Ăȃv¥ÛªÚ«ÚƒÖµ†¡Û«‚ ½9‚-™ëé僫·3uUúÓ9¥‡³àơÔÑØÙ½ăˆŸ;™ÁŸÅù×…Ö½€È̉›!ëö퇹Ա»щ³Û«‚ ½9Åơ×ÙôơèÅ»½½³Ư±»9¥‡Î̉óÇ­ÄÓÅ›¾߈íêï³2í—G½Ëǣȗ¶ÿ±Qư£­½¼ûÓ—¶§Ó¡Ô›‡º½ƒvß»ûÛÀ›¾Ưù×Ö‡“¼7“§Ô€º•ŒưÀÿÚÙÚ€¾ơê«Ñơ—½ùêăˆŸ;å ơÔÛ«‚ ½9˹µàÊ)èÛ8¤ËÉ9¯Øđ¹˜ È ù×¾øưÀơêëöÍÇ÷Á±ëØ½Ă¥Øäן«·3uUơÔ麋ܱ»ƒ9¥‡ÂÙ“µ»ØăˆŸ;™‡±»ÂăˆŸ;÷ÁµÜ—¶÷Á‘ÚÛ«‚ ½9ÙÚ‹ÛËÖĂÓûÙÛ«‚ ½9đÓÛ«‚ ½9›¶éÿÚ̃ˆƠ¯G‹øëöƠÿ¼ăˆŸ;k©ÓÏÄ₫߈¾í‡ÓØÏÅëöÿÚÏÄÙÚŸ/ÙŒë*«À¹‹É0«ÔưÀĂºưÀößÄÙÛº߈¹ƠƯÓ …nôÛ«‚ ½9́vỚ™‰kß [ïSÊÖ“È«ºù×ïÚ±»ƒÖ™‰kß [ïSµêëöàƠ#èê½§ôñÓÙ½‹ÿ¦Ô©©ØŽ½Ü«‡“Íjõ₫ÑÄëù×Ôº0l0ÍƠÁƯơềª©ÓYĂ ±»·ÔÏÔá ăˆŸ;ÿ¯¶¯)ƠшñÖ›¹̉í±»™‰kß [ïSÑÓ³àù×ä̉ÛÄÓ߈öºăˆŸ;Ú×°»”½˜êèä½Á½߈ÇÖù×ÓÅ×Ơ¯XƒÛº€Çׯéê·Ó ¥0Á½—Ó½‹Ç½€ùסۭç¹àÏÔ½Ù½ơÔ È­ÔŸ}×$ÿ¯¶…»ƒˆ“ÈóÔßÖ‡º»Øª¶2tT¬Ö©Óơê­Ôǰ»ÙÓÏÔ£ í—G̀ĹÁµØÇÖ·Ô±»áêăˆŸ;“Ç—»Ăô߄۽éêÓØƒÖщÑ+¹Û£Ø½ÿ¿™‹™‡Ïß­à÷Ùù׫ԵaµØϹƒØ§ß¾» Úª‚ +¼9߈߈¿ç½ÁÛ«‚ ½9­ÄŸÈ«äƒv¾Ă±»¿ß‰¿IëöđÁZ9¥‡×±»±¿ù×±»ëÓ·È›ßá°Ï̉‡£Ø×¾ù¿ׯ߈ưÀÏÄơÔơêƠ×÷ˆ‹Óù×ß»ûù×ù׬¾߈¤Ó¡h­Ä¥ºù×Û«‚ ½9™‰kß [ïS£ØÛăˆŸá âˆ:kêơŸƠỞ‰à«»°¾×ƠÆô ÖĂëöô°»íÚ²¹4éI­§Ó8¤‡÷Á‡ÚÁ½™‰kß [ïSºơÔ™‰kß [ïS›¶éÙ½™‡…­Ç"½¸Ú€ĂÙơ‚÷Úù×÷Ùùן}»n¿‰̉ØÛêơÔ߈—¶½Ç·ô×ĂÓ̉½€ô©9¥‡¯ÔûƯ¹ÚÏÔâˆ;k¡Ô‡ǽ“Ơ™‰kß [ïSÿ·Æ¡Á˜‰j̃ZîS釩¾ùêăˆŸ;ăˆŸ;Ë¿ËÉ9µØ™‰kß [ïS¯Ü‡ÛÙÚ˜‰j̃ZîSèêçôµØ9¥‡½¹Ú Èψ±)™ºÏŋǥˆ]1µØ½ưÀ“ÆÛ™Ñ̃ăˆŸ q™ëéåéê߈9¥‡ƒÙÓüØĂºùæ°»£Ô‡ÏŧôăˆŸ;k¹Å›vë±½ÈưÀÖ$ Û«‚ ½9½ÊÙĂƠß»ûù×߈‡ăˆŸŨï½´aô¹ÁÙƠÁƯ¹Úª»«‡“ÍjͽÙÚ›µàêŸ\Û«‚ ½9ïÔÛº߈߈™‰kß [ïSµ.¥Ù™‡ÿ&·Üă½ÏÔÀ‡€è/Ö:ù×½Ăº½€ƒ½ÇØÙ½9¥‡8¤‡‡Œ¾ë°»¾±»™ôëöƫӿ»ªôù×ÙÚ™Ááêù¿·‹½±óơêëöÏÔ±ëØÿDZ»ÇÖ¡ß—ÀçÚù×á éôƒ=߈¿‰·ψ %Ñ¢Ù½‡±»ơêù×ÇÖÂ÷¼‡ÚåôƒØ«ÔÛ«‚ ½9Û«‚ ½9Ư‰Žª»‹ÇóĐ½áƠ“¼ëöĂÙçô«‡“Íjø×ù‰™ÁëöÇÖëö9¥‡›Úà=¿» ÙÏÔôê«ÔÇÖ߈…Ơ‹ÜÁƯ›¾߈ùăĂÀÛÁĂưÀăêï»›¾›ÚÙ½åôÙڵ؜‰¾IăˆŸ¯×½€íÚĂƠôÛº‰¿Iº±̉–¶¡¼™‰kß [ïS¹Úó×°»«‡“Íj«‡“Íj±̉đÖöĂÙ«‡“ÍjôĂêö‹Ü™‰kß [ïS₫&™Ó¥ˆ]1³âù׃ˆ±»å×¿ßøê½€ÜÓ ăÇí±»«Ô«‡“ÍjÙŒë*«ĂÙ߈º¹½ăơ±»Á×›¶é™‡˜‡ù×üØÅă½ÿÚ‡xÅÑÄë¶¡ÈÜ÷Áø×ơÔ¡ÁñÈ߈ëơưÀÛ«‚ ½9ăˆŸ;k«‡“Íj‚v•¾Å—£ä¡Û°»ơ»Úª‚ +¼9ÏÔó%·Å«Ô·‡‘×8çùêƒv%™‰kß [ïSg¡Øăơ±»ªÚơĂÑØÏÔË̉‚vèô)É̉ÓÔ«‡“Íj¦ô†“ í–Géé‡ÑÓÀ½ơꥈ]1·‡‘×8癉kß [ïSÏ̉˜ÓÙ½8¤‡Ö³ºó¿ôƒØÁ½’Ç=—ŒÙ½º÷$³°»ëöÛ«‚ ½9Û«‚ ½9î¾ß±Ôƒv¡ÔÁ̉ơÔ™Ôăº´Ø˜‰j̃ZîS±»Ơ‘ÙÚ§Ôå̉ ¿ºÔù×ÇȧÓÇÓƒˆ¡Û„öù×à·̣®ºÏÔ³Ú½ßÖ¯¡™ÔøËÜơÔíơ»‡½³Â£äƒ—óÂỔ“¹ƯNÿÂÏÔٽŻ‘÷ÀĂ¿߈öù¿ÏԨDZ»ñÚÉèö³(ù×ÂÙù×ÿ¯¶ƒ¾‘µØĂñÚơèůș‡±»¡9¥‡9¥‡­Rÿ¯¶½¾‡£Ç¯¾ƒv°»™‡™‰kß [ïS§ôÛºĂÈ˹ƠÜĂºáêëö½ë™‰kß [ïSÔ±»¥ˆ]1±»ÏÔ«‡“Íj¹â±»›ÚœÓÀÏÔ°»µÛ©Ó±¿°»ơÔƯÚçÚ°¿Ë̉“ƠµØ×Ơ±»ÿÚëöÖ¾8‰¿I™‰kß [ïSÍÓ«·3uU¿à‹ÇÂƠÛºƒv«Ô—Ă™‰kß [ïSÿ¯¶¡ÈÙ¼Ô¿‰ơêÏÚÓ¼¶èÛ«‚ ½9¾ÑÓư%ÑÓÎÚ󱉭Ø̉ñڣ䕽‹ÇÏÅÍË)éÛ9¥ư%DZ»«âå¿ù׋ȃÚÛ«‚ ½9ȼ×ÜăˆŸ›¾¯éê§ƠÍӳ߻ûźß»û‘÷©ÇÂëÙ×߈߈•Ö‡ºÙÚ₫ỞµØˆÔ‡ưÀăˆŸ;™‰kß [ïSÅØư‡±ù1ïÚöÁ߈›¶é±»9¥‡ï³2Íß߈çÚ¥ª›¾ăˆŸ߈Ă\ÓÔƒvơꘉj̃ZîS•½Ơ¾GÛ«‚ ½9©Çưˆù׀ă߈ˆơ ¡Á±»Ăى혇©ÓÏÔÀƯÏ̉ŸÖ«‡“Íj‡Œ‡Çù×÷‡·ÔèÔ±»ăˆŸ;ưÀù×ÓÆÎÚóÄĂĂ ›­±àéMÅØÇÓ“Öù¿9¥‡å̉ ¥ÆÑÓï²2ÏÔáׯ‰¯0̃ˆÜ×¹•½ŸỞỞËÁá$ÏÔù×ơêµÀ·ØϹäÁÅÔÁÙ÷Ú™ëéåßÖщ‚v߈ăˆŸÙŒë*««Ô‘ÆăˆŸ;øê®é¦Ø×¿8Û׃ˆÛ×ÏÅ‚v­½¼á ÙÚÏÔœ·̉ ¤0™‰kß [ïSÁƯÇÖëö±ë؋Ӓȱ»±»ÏÔû(ëÓÓµƒv»ØƯ‰¡ƠÑÓ”Èú½«‡“Íj§ÔçÚÿ¯¶¹¿Åш˜‰j̃ZîSÙÅëâàÙY´†å»‰Ô龓 +ÑÄëëö±»ËÔ߈ûØÇÓ‡Ú·‹¿‰™‡»ÓÙ½̉*ù×ç̃ù×ÿÚׯÁ܃vÁƯÛ«‚ ½9—»›Å·ÔßÄÙ½ĂÏŧӧƯé߈±»¿ÅÙ½‡ñ5Û«‚ ½9…Ư‰ß»û‡Ú‡ºÅÔăˆŸ;kÏ͇̉ƒvÏÔÅԨؗӽԧÔå×ÿ¯¶ù¿àêÿ¯¶ÏÔß»û× ³èơ™ ·ÅßÄÙ× ‹ÇỞĂÙ±¿ÏÅ™‡™‰kß [ïS±»«‡“Íj¼ô™ëéå߈·Ó ¥0Ù½éÚ£Çù×Å—¶ù׋ÇƠXÎÔâˆ:‰¿IÅÏÄA߈³ÈÛÀÿÇëÔǫԜ‡ƒv¥Ø¡ẳÇÏÔëöÛÀ—ˆỞĂÙ×¾½€¹ÚÖóÇĂº‘Ú¨¼“ƠßÅ…Âăê·̣ù×ÇÖ½óÇ̣¶©¼§8¤‡³ÈƠ ÷‡»Ø™‰kß [ïSÍË)éÛ9¥ƒvƠö½щăÇíé‡Ï̉˜‰ j ̃    Z îS Á₫®¶Ă«»®×÷©‡¥2ßëM×Ă·Ó ¥0Ϻ«»ÏÔëÔ«‡“ÍjưØÛ«‚ ½9߈«‡“Íj™‰kß [ïSùÜ›¾“½̣ÇưÀÙ½߈ÏÅÑØÓà÷Ú«‡“Íj©Ø×ù£Øî»̃ˆ™‰kß [ïSÙŒë*«·ÔÓºá ÙŒë*«ÿÚÙ½ÏÄÍÓ¼ÔÙ½‡Úºù¿ƒvăˆŸ;kÑæ™‰kß [ïS°¿ƠÎÔ÷Á߈¾©£Ø›¾‚v¡ÛÅä̉Ưگ׾™‡ëöëö«‡“ÍjÙÜơèÅçÀưÀă»¹Á½…ƠöÁ¹ÚÇÖ́%ÙÚ߈ùסßÛ«‚ ½9© ÷Ù³ÈÛ«‚ ½9ă½9¥‡ăˆŸÛ«‚ ½9éÚÅ–ưÀ×Ü« ©ƒ»5øëô“È‘ÆƠXëö«Ú±»™‰kß [ïS½™ëéåÑÓÁÖ¡ÁơÔ%»½ăˆŸÆ·̣ù×ÏÅÛÄÓÏÔ½€ûÖÁº¤ˆ\0°»âÂ3áêĂôáê¢äÛ×ÁăˆŸ; Áù×…àÏ̉“ÇÛ«‚ ½9ù×ĂÙ«‡“ÍjªÔù×±Ă¿Å¨§ƠÿÚÛ«‚ ½9̀t¬Htơê·ÔơèŽôÙ½¡Ácؗ¶ÆÖûÓǼ™‰kß [ïS˜‡ÍÇéÚß„£ä¹Ú¿ºívµØÙÚʹ½à“ÆœƠ½Èư§‡ăà½̉º¶¦D ï½Ûº™»öä5̉Û«‚ ½9ùצÈÓÛ«‚ ½9ÂÓ­½¼ăàù׭ă±»đ»…ÚßřԺù׫Ôg2âĂªÚ߈™ëéåùêÏźÛÄ›ưÀơêă»ø¿ùëÅ–£Ç‰bû«‡“Íjëö©ºĐØÏ̉™‰kß [ïS߈°»§ÆÚª‚ +¼9Úª‚ +¼9ÿ&Û~×$ÏÚ߈Ï¿éÓ±¿çÚ±»–¶º†Œ·‡‘×8çÑÄë¡Ô›¾ùßöÅ»ÿÚưÀåÁÛס™‰kß [ïS±»Å᫇“ÍjÅÓ߈å»éꣻç̉ưÀׯ›¾€º¾¥ÓÑÄëĂ£ƯñÆß»ûÏÄ÷Ù¹̃ơêƠî̉ºƠÓ ‹›æǼׯ«ÓÿÚ9¥‡±»½Á߈ÁƯÇĂăˆŸ;Çß¹Ú¯ƠÛêö±»Ù½°»‹Ü­Öôê±̉±¿áêÑÅ߈‹ÛÅÔÑÓ ÁỄÿ¯¶Æ“‹ǺÙÚå•ƠŸ}́ơÏÅÏ̉ÁƯçԻ€ºÛ«‚ ½9º߈‚Ô½½¿Ôơ ÛÚ‡™‡ñÚñ£™‡¡È•¿ß‹Ç›¾×ƠÇ ÀĂŸÈ±»ÇÖ¿ÅâḈª‡’̀j‡ŒÏÔáç°»¦ô¼Ø™‰kß [ïSÛÚù×Ûÿ¯¶†Ÿç̉©Óơë ›¾™å÷ÙÛ«‚ ½9Û«‚ ½9ÇØÇ“‡º86¤‡6Öốvƒv§Ó¨ƠŸ¿ÉÅÄÑÄë‹Ç¿‰Ÿ ÂÙË¿̉º³$Ă$Ơ¿̃ử™ÔĂº±»¹ÚñƧô€Ơ«‡“ÍjщăˆŸ;¨v™ÁơêéêÉPƒv÷ˆ¿%ÎÔ ‚×óÚ½+ơԈԓǰ»óÂßÏ›¾ơÔÍÓƒ½ëöêÓ‚v½ÏÔå̉ ÍÓ±»°¿±»ÖfÔ†f6f¦jfĂƠÙƒˆ߈ׯÅØăˆŸ;kĂÙëö½öù׬ӓƠƒv³ ƒvÿÚëö߇Úăà¿(¯ÛŸÈçô½ƒv¹Ú•Ç®G ø «‡“Íj¡È÷™‰kß [ïSçڅر»‹Ü•Èû›“ÆǺ÷‡ÁƯ߈ÏÅ—¾ù×–¿Ü¹“ƠĂÙ›¾ø|½€ù×›¶éÙ×ÅØöÁå̉ Í’±»Æ±»ºĂĂ ›­±àéM­Äºơ­‡ÁƯùש¼¡ÁàöưÀÏÄíêµØĂÙù×ơº½å~ÏÔĂù¸ÿ§æÚÏŽĂÏŇÏÅßÁŰív‘æù×ÿ§€Ơ«Ô™ÓÏÅ«‡“Íjß»ûéÓ™‰kß [ïSưˆ‰¿IµƠ¹£ö³çÚ%ŸÖÛ×ïù¿¯PăˆŸ;̀Â÷ÁœÁá »Ø†ŒÙ×8¤‡ưˆ…Ơ9¥‡¡ÔÅÔƯÓ ­ÄûØÓ*¶èĂÏÄĂƠíÆ™‡µØ›ÚÏÔ§ØŸÖËÓÁ̉›¶éù×Ơ¿‰–Óëö©‡¥2ßëMóÇÙÚ­¾Û×ÑÓ¯à©Ó¹»ÿ§á«Óóƒv¾́ɾÙ½­Ä¸Ú ›ÚÑï½«ÑæÛÆÓÔª‡ ’ ̀j ­½¼›Úù×ù×Ï̉¼ơ»«ŽëöêöçÚáïŸÖ¦ô·Ôˆ˜êèäƒv¿́›¹¥Æ¹Ü™‰kß [ïSăˆŸ;kÏÅĂÙÜÛ«‚ ½9ùê©ÜßÁÛéË¿ô±»™‡™Áô߈ù×߈±»ß»ûçăˆŸá …ôÙÓù×¢XôÄ¡%ơê߈ơêÏ̉€¼º¸ÚæÚ܃ˆôê9¥‡ï½ù×ù×ëöëöĐÓù×ÖïƠÏÔá֣ǃvÏÅꙉkß [ïSö½èưÀ§ô™Û§Ô­Ä߈ùê©ƠÂïå̉ Ù°ëö9¥‡×”Èú̃Ä Ø ưÀÈĂßÖỂ…»»Ø¿‰ëÔívÅÓÛÄÓ9¥‡‡x¾ơÔ߈ơê±»©Üª‡’̀jù×ÍôéÓ‡«‡“Íj°»§ô×¾ÏŇŒ±»¥<ơİ»#éÓëö½È™‰kß [ïSÙŒë*«º̀ÓŽÑ·ËÓ­Ä߈¥ˆ]1±»ŒƯ³zóÇÙÚÍŸ…¼ô±»¥Ø“Ơ™‰kß [ïS9¥‡‡ơêÙ½ººØ߈ß…à·ÔÿÚ±»ëöÛ«‚ ½9ßÁ—»°»µ†߈›¾±»ơèŪ“¾ÑÓëöºëö÷Áꛡù׋lj¿I߈׾Ο\ùßÛÀ¯×ŒÏÔăÁ—¶ăઇ’̀jÈ̉°)îÅ ï½ÑÅ8¤‡×ăơ‡ºµ.¥ÙÇÖÛ«‚ ½9Û×ÏÔÁƯ‡ÏŇö›χÏÅ8¤‡ÖÛ«‚ ½9ƒˆƒ½³ăà«ÚÀđ«Ô·ÅÿÏ«¼¹£ä½Û«‚ ½9éêƯÚ™‰kß [ïSö™‰kß [ïS©‡¥2ßëMÏÅ•Èû›×¼Û«‚ ½9ª¶2tTÛ(ÏÔ₫±ëØϺ§›‡º¡ßÏÓµ†ỞøêûºçđăˆŸ;±»Ǽ±»Œ¾½ôå¼ ƠX“¹ƯN»™ÔÛÚÏŸÚñÓ‹ÇØÚÑĂơèÅÅnơꙉkß [ïSÛÄÓêØ ĂÙ·‡‘×8ç³(ƠŒ½$™‡ßÖĂô­ÄØ×̃ˆ±»Ổ™‰kß [ïSñÚ3ơÔ«»·‡‘×8癉kß [ïS­¾Û«‚ ½9§+ÿ§ƯºçÚÏÔÔXÏÚ߈ùôƒÙ‡Ï9…‘ÚƯ‚¡¥Æù×ÙŒë*«¹ÿ۵؋Ç̀ÓƠ£ä¹ÚÿÛ™‰kß [ïS­Ô½€ÓÅǃvßÁûع̃ˆǽ‡ŒưÀ·Ó ¥0ù×ÅnÙ½ÇÖÓØÛ×₫$ׯ«‡“ÍjûÙ½Î̉°»ù×ÙÚù×ƠXùôÙ½á c$Ù½™‰kß [ïS¯Û­Ä߈ơ»‘ÆơêơĂù×àƠ«‡“Íj‡Ù½‹ÈÅәԣѫÔùׯƒßͯ¥'=U#QK¯ÂƠX—ˆ¹ɇßÄÙÅÔëö¿ºÙ×ÑÓÛ«‚ ½9º›Ă½Ă÷‡ưÀíÆÛ«‚ ½9éêù×›¾ûƠ°¿¨Ç¨,±»·ÜµƠ³ºóÏÅÙ½ÑĂçôÁƯÿ¯¶¥ˆ]1ăˆỞ߈ï½›‡‡×‰Û‘±™ëéåÏÄ®öƠù×ÏÔ—Ó‹Çœ‰¾I™‰kß [ïS½©‡¥2ßëMñÖÇæÚ›¾ăà™‰kß [ïSÙÚ¾₫¶‡Ö8æÅăˆŸơÄ«‡“ÍjÿÚ߈癉kß [ïSù×½Âٵ؇ÇÙÚ߈ơê÷ÔơêƯºƒ½ôê˜êèä­Ø°»‹ÁåÁçÚ÷ÔçđÚÀlƒv‡§¹º¦ÓﻹÁ­Äç̉¶ÔʾëöƒàëöñÚ‹ÜÏŤˆ\0™‡ó½€¯ •²(÷ÁרăˆŸ;à d«‡“ÍjôêñÙÓŶÔóÂÇÖ°»·‡‘×8çôĂñ÷ÚÛ«‚ ½9ÏÅö“ÆÅر¿ơêß„–Œßô­½¼÷ÁăˆŸÎ̉̃ĂÙñÖëƠUƠX»‹½€ơêßÖÏỒÇé£å̉ ›¾ÍÓ°™‰kß [ïSƠºmÏԣ䱻¥ˆ]1“ỠÚɇÅÙ¾ÓØÏ̉Ăù×ûÙ×ÅØ₫Ú÷ÁÈÁ₫Û“¹ƯNïÏÔåĂ½ÔơÄÏÔ¥‰ÍL…ù×ëöù‡˜êèäëơưÀµa§ÓÇÓùó“ºà¬Ǽå̉ ¯¾½™‰kß [ïSؽÍË)éÛ9¥ƒÖöÓơêẩ̀Ç“ÈÏ̉ùêµ‰Ú ª ‚  + ¼9 ¨È£ä…ôù×ăÁƯÚ¥ÓĐÄêå̉ ß»û¼ƒƒv·¼Í7¼XµØ“½ùêÖÓ›¾‡ŸÖĂƒÖ™‰kß [ïSÏÅ«‡“Íjù×Y˃½íêƒvºyƒơË̉§ØöÁĂ«‡“ÍjÚÇ÷Á߈ÏÅÛ×ÅÓÍÇÿÂ߈™ÔŸ}¬¾˜‰j̃ZîSÍßù×å̉ á=9¥‡ôÁ¼öÁµØ¡Û±½™‰kß [ïS‹ă˜‰j̃ZîS€Ç§½™‰kß [ïSŽùש¼©‡¥2ßëMåĂñÓÙÚăờÓñÚ¿ßË¿¶ƒˆ¸Ú÷‡ø×Û«‚ ½9ø¾ÏÔÏÄ9¥‡—ÓơÄĂÙăˆŸ;k߈έÄƠÙ©ˆ¹Úô½ƒvº̉ ̉Ö̉†‡̉ü2̉çÚôÙR±»ăˆŸ‚vÍÙăˆŸ»ˆ߈—Óù׃v½¾£Ø—¶¹¼̉ºǼưÀ„ôơêªdăˆŸ;9¥‡¹ƒÚƠÛ×ÏÔÏÔ«ÔŸïÚÄ̉—»§Ó©‡¥2ßëMçđÁ½©ÓƯ)ÅïƠÛ»ØưÀÛ×£ÇÑĂÏ̉°»Ơͽß„áê…ÔϹăˆŸ;ÍƠÏÔ»ØÑĂÍĂ9¥‡×¸ÚÚ ª ‚  + ¼9 « ©ƒ»5ψỔ£ØÙŒë*«éÚÓØ¿»ÏÔívăˆŸö“ÆËƠăˆŸ;Ù½ƒØăˆŸ;àê¹Ú§ÔăˆŸ̃ïëÖù×ÿ¯¶ăˆŸ±»ÏÅÛºăê…×9¥‡âà·‡‘×8çÙ½„÷Ù߈Éư³Ø¿Ïţ䙉kß [ïS8J¤‡JÖ ©‡¥2ßëMùן0™‡Û«‚ ½9ù×Ơ£äƒÚëö÷Ù˜ÈÏÔ©‡¥2ßëM߈ñÆÿÚỤ̀ƯÅÓù×™‰kß [ïS«ÔÏÔĂÈ’Æ¿½¯Ă·µ™‰kß [ïSĐÓ±»çÇ¿‰ăàµØ¼ÑÄëỂÿÚƯÚ¸àBÅØĂÙ‡ºƒvưÀ±»–¦̀»©‡¥2ßëM߈ö¡Û˜ơáêưÀ½ĂăˆŸ;§Ø‰;±»ĂÙÙ½÷Úă»»Ø—¶ƯÓ ơر»ñÖù×Ó¼±»±”ẲơèÅñÖ¿‰™‰kß [ïSĂÙô¿ÅºÍÓµÈ׿8™Áº¼ñÓ¶ÁƠú‹Ó·ÜÍÄùê§ƠÑÄë… ‰₫©ÓÏÄÏŃĂÚª‚ +¼9ôÄß»û½ëöÿ¯¶­¿9¥‡×µØ¥~‹È¹Ú¶ñÚß„½߈Ơ߈Ëđ£Ø²Âºn›¾ÑĂßÚÛ×½ÍƠßÄÙ× ëö‡Ç©‡¥2ßëMÁƯ›éÎ̉Ï̉èê÷ÁÑ×ç©ÇÏÔµØĂÙ½Ñæ“Ơ‹Ü»ˆÏÔÛ«‚ ½9ÙƠáÛív±Èä‰ ͇ÓÆéºÙ½—˜Üƒv­Ö·̃·‡‘×8癉kß [ïSÿÂˆ\0£Ư¶É£äµØ«»¡ÛÛ«‚ ½9±»ÏÅ9¥‡×ù¿½Ô§ÓÅÓåĂƒv©º“Ơ½߈Ï̉ÅØÛ«‚ ½9Û«‚ ½9߈ơú¹Ú¸à±¿“ÛµØÉ̉Ù½•×ƠûĂÖ¾»Á›¡±»Û«‚ ½9Û«‚ ½9˜‰j̃ZîSĂÙË`±»½¿́»ÁăˆŸ;ƒÖƒÔψƯºåñ»ĂÙ±9¥‡Á¾³óÇ߈×¾÷‡ƠôÔăˆŸ;Û«‚ ½9¥ˆ]1Û×߈߈ÙÚƒvƒàï½ĂỗÄØĂÙÏÔ«»…ƠG½¹Ù½ăˆŸ;ÀÚ·Ó ¥0ơê—¾¨Ơû¹Ú°ƯÓ »ǼºùêœÁỞ9¥‡«‡“ÍjĂƠ‹ÇĂƠû(¸ÚΈó¡ÁËØ‹ÇÓºÓº…Ơ÷Á£ä÷Á¡Ô¸ÚăˆŸ;kßÛ«‚ ½9«Ó±»ÏÅăˆŸ;ĂĂ×ÜÑÄëóÇé|ĂÙ€º€ºëö£Ø³È±»ùê߈ÿÚÛ«‚ ½9ơÅÁ™‰kß [ïSơêÁƯĂ¹ơèÅÛ«‚ ½9›ƠµØö¥Àơ꛾9¥‡˜‡ÓÔÿ¯¶Ù½£Ø¥Ø©Ó¥ÛÛºưÀĂ“Ơ߈‹̃•‹HÿÚ»ÛÀăˆŸ;k‰¿I߈ÏÅăˆŸ;©Óù׃àå̉ ÷Ù¿ÅÓÿöî$ÿ§₫®¶»|ê¡Ư匿N¡ÁÏÔ•Œ—èưÀ³Â“±»§®߈êöÙÅëëö˜‰j̃ZîSĂÙ¿ÅÙÚ£ä߈ÏÔå×ù×Û«‚ ½9ÍË)éÛ9¥•×±¿Ïԣط‡‘×8çăˆŸ; È$Û«‚ ½9’àƠ­Ä8¤‡ÈÙ¶‰₫·È™ëéå³éêĐĂÉÓØ³¹ƒˆû(ßÁÛ«‚ ½9“ÓóÇ™‰kß [ïSÛ×ĂÁƯ߈Û«‚ ½9‡Ç¯×™‰kß [ïSߌÛ,ñÚƒ×Ư£¿º©Óívö¶±»“ƠơÔ™‰kß [ïSĂÈ­ÖÑÄëƒ́ßÄÙóǽ›È₫®¶ÿ¯¶́v¯‰¯0¡¢¬Ø÷¼øê½€½ëö9¥‡Ăº•Ü÷ˆµ½»ØÙ½ăêƯˆÂÙ±»›Ă߈÷Áͼ«»±»«‡“Íj“¼¹êö ÇØºÖÆ6«‡“Íjƒ½ÂĂĂ£äÖ¾8ưÀÛ×½¥ˆ]1ÏšۋÚó³ƅۧÔÛ½ëÔëöéêÿÚ±»Û«‚ ½9ƒv¹Ú¶£ ɻ۫‚ ½9ÁĂ9¥‡ÍĂ»ÅăÁµô·‡‘×8çù×…Û±»ƠX¡Û«Ó߈À¾ÁĂî²2ÏÔ߈Ù×ß»û¹ÚÏÔ™ÁưÆ´¹àÙ½·‡‘×8çÛ«‚ ½9‹ÇívÇĂɵث‡“ÍjÅÅûÓ°»ăˆŸù¿·Å›¾ÑØ³ÈØƠÏ|Å®8¤‡×‡ºÓØ÷ÁÓØñÓ“Æå̉ ÿ§÷‡§‹Ëǽ÷Á±»ĂÙ›wă»³Ü¡ö±»ƒvß„ÍÓä̉Ñ·¿‰¹Ú·‡‘×8穇¥2ßëMƒvÔX6ăˆŸ;ÍB±»ÙÚÿ‡ºÛ«‚ ½9–Ó¨¼ăà™‰kß [ïSÛ×™‰kß [ïSăơ®¼µ.¥Ùﯰ»ÎÔ߈›9¥‡™‡ƒv©Óº¡ÈÛ×ÏÔ¡Ûù×Åે“Íj±»¡ƠăˆŸĂÙÛ«‚ ½9èơ +ÏÔÑ÷ƒÖÑÄëëöưÀÿÎׯÿ̀Ê)èÛ8¤˜‡“¼ÅÔ½Ăëöé‰ñ5ñ·ïÚÿ¯¶ơêù×đÓÍÄơêׯÄØ–¶‡Ú©‡¥2ßëMg±ëؽ۫‚ ½9ßƠÅä̉ăˆŸÂëöÛ«‚ ½9ßÁÛ«‚ ½99¥‡†Ç›¡ăˆŸ;k—‹ăˆŸ;…Âß»ûơñԙ‰kß [ïS™‰kß [ïSửđ¨ëöèÓ‘Æ™‰kß [ïSÀ½ƒ×8¤‡Ö»Å¦ô÷‡ÁÆÛÑl¤Æơê¿́ƒØ¾ƒ«‡“ÍjÙ©ÓËÇ–¶§Ó¾‰®ÑÓăˆŸơêÎÅ­v½ôơêöÅÓ̃ˆÔơ‡ñ59¥‡×ÅñÚ·Åëä™ơ«»¦ô:·‡‘×8ç‡ăàĐØƒv‚v߈›¾‡Ú߈…ǹڱ»ÙÚ¹Èå×Ç«Ôêö™Ô¹“ßÖïÅĂÙơÔå̉ Ù½ëöÏÔ‡xɹÛ«ÔöÁƽëƒÏÔç̉9¥‡×‰¿I«‡“Íj¿‰ÛÆơÈ™Ôù×ÏÅ·#đăˆŸ;ỡẵÄØ™‡Åư“ŸÅ¿ô»ÁùêùáÖíÖóÂÁăˆŸ;÷‡§ÂºÛ«‚ ½9·‡‘×8çç¹àÿÚ»¼‘߈êö߃Á̉ßÄÙå¿ù×™‰kß [ïS™ëéåéêÏÅ¡»«Ú¡È½±»‰ÛËƠÍË)éÛ9¥í‡‘Æ›ÚÅØ«»ô‡Û‹Üù×߈¯È°¿Ïċǽ߈±»°»³à²Ø‡ù×±Á§ÔÙÚ·‡‘×8çÇ»êö•îщ‰¿IĂǺÎÅÏÔÜ©¼¥Âø×&̃ˆ˜êèäëöÁ¼¡Ø‰¿IÑÓ¾ăˆŸ;ÓÆ†Ú³z±»«dÙµˆÛ¿‰½€ĂĂÅöÁĂôăˆŸ»̉ï½ËƠÏÔ₫®¶ưÀÙ½›¾Ù½å̉ ôËÖÅôÛ×—ÓßƯª»˜Á™‰kß [ïS™Óûö‡ñ5¹à³¹¿Åç̉™‡ÅؽÛ×Ûº™‡µaˆ½ÓÅï½ù×Ù̉±»߈ăÇí̃ˆ»¹Ú™‰kß [ïSƯëöÍÓ¿‰ëöµØÉ»±¨Óº‹Ç9¥‡×¾ƠÚ—»Ÿ}ơԔܙ$áñÆ“ÈÙ½£¢ăˆŸ;±Á†ŒïÚăàÂÙ߈±»ăˆŸªd8¤‡ÂÙÏÅ ÛÿÚ­Äù×ñÓƒv«‡“ÍjÛ«‚ ½9߈Ÿ}µØơê₫®¶ÅØ›¾߈¯Û¯¼Í™‰kß [ïSĂÏÔçíóÇÑÓÙÚ±»›v߈¿àŃحÔơ»ăˆŸ;É̉Ó¾Ûº̃ˆ™ØÎÅƠƯÚ½Å#ÁÜ­:ϕٽ»ó£Ø™‰kß [ïS¯ÙÚ©&Û«‚ ½9ûà₫ÚÏÅôêù×öÁÏÔÅØ÷Á·‡‘×8çÙÚÅÓúÙ&çôĂñ߈ŽË¿Ä–©¼Îö™Óù×ÇÖÅ£ÇÙ½ÓÆ¹ÚëöÙÚ¹ÚçôŒÓù×ơêç»ÿ¯¶ƒvÏ|Ñæü̉™Ôû¶ưÀÙ×»nш½߈ÛÄÓ±»߈£Øçö߈®¼°»†Ú½™‡ù×ơê›¶é°»¼€×¾½ܺ½›}°»˜êèä“Üé™̃ˆ³Ø߈ùêâÙÚÖÓºăàë¾íT₫®¶é‡âÁÏÔŸÜ’áĂÙ°½ÇÓ¡ÈóÔ·‡‘×8çƠù×êö‡–¾ưÀù×ưÀ£»ÅØÍı»Úª‚ +¼9„‚vĂÈ€º½÷¼ÂÙÜÿ§Óưû¹Á™‰kß [ïSµØéÔ½ƯÜ¡ÈÙ½¿ôƒˆưÀµÛï»߈Ù̉à=‚ë‹Ç­Äׯ߈·ë̃ˆ«‡“Íj›¾ăƠÑÄë‚ÖéÚ¥‰ÍL…Ơ£ØÚP±»8¤‡×Ăº¥ÜŸ}²ØÏÔëö½ƯÓ ­Ô…à˜‡9¥‡ĐÓ¼»ôßÖåÁ—Ü™ôÍÄ߈Û«‚ ½9ÉÛ«‚ ½9ÙÚ߈ø×8¤‡ÖăàŒ¿ÇÀ·‡‘×8çéêÙ½Ăô¬‡ ™‰kß [ïS³ºó»‡ϺÿÜ߈±»Ơßù×ËÉ9Úª‚ +¼9îº߈™‰kß [ïS Û9¥‡ÓÆ8¤‡Ö™‰kß [ïSƒvÓ¼™Á߈߈¾óǾùêŸÄÁÓđ¡ÛëöÙ½ÿ¯¶¡È́v«‡“ÍjÏű̉ÏŰ¿ÁÓÙ½ñ¹™ ¶ÅØƯơ¹ÚÙ½ñÓŸèµa›v‡«‡“ÍjÙÚ¹Ú«ÔÎÔ߈ÙÚ˜‡ùêơê¹̃ù×ÓØ—Á±¿»Ă³Ç߈ívÛºͽ™‰kß [ïS«‡“ÍjưÀ“ÆăˆŸªĐù×™ëéå±»©‡¥2ßëM߈ỞĂÙ¯±»‹½÷Á‹±₫ÚÑÓ$±»ă»µÉÂÙµØù×öß„Ăâö§ô“ÇÏϾ¥O—»¡ÔŒÓ߈Û«‚ ½9…»߈ÿ¯¶©Ø©‡¥2ßëMØÅê×ƠïƠÛ«‚ ½9íØÙÚ™‰kß [ïSưÀ™‰kß [ïS“¼™‰kß [ïS½ỜĂ߈đÙ¹Ú·Åô™‰kß [ïS·Å£‡߈åÉ«‡“ÍjÙÜ«·3uUƒv™‰kß [ïSƒvÿ¯¶½ÏÅå̉ σÿ¯¶÷‡ĂÓÏ̉«d‘ơơԳǷ‡‘×8竇“Íj¡ÛçÚƠÏÔ߈9¥‡×Û«‚ ½9ÏÔ9¥‡×ßÚ¯à«Ú‡j­ÄƠÄĂÙÚÆµØ…ÖưÀ8¤‡×ÿ×øê™‰kß [ïSÍÓÀĂñÖöÁăˆŸØ×©ÓÛ«‚ ½9ÙÚ©Ó¢X +ÏÔñÚÿ¯¶ăêÙÚÚª‚ +¼9íØ½ÿÚ‹ÙßÖöëöă½ÏÔÇÖ•Ú—»‹ÇÉ̉Ù-ưÀù×½Û«‚ ½9ƒvÛ«‚ ½9™‰kß [ïSÁƯẨ̉öÙ½ÙÓµØÁƒvëö¡ÛÛ¾«»ÿ¯¶£XöĂª»âàù׎ä̉ƒ̉ÅクÚʹù×™ÓơÔưĂÁƯ°»Ù½œÂÏ̉¿‰Ú×½Ô˜‰j̃ZîS¤¾Q¸È¡ƠÑÓÛ«‚ ½9Û«‚ ½9«»›¡Ë̉÷‡™ëéå’Æ¿øÅÔ9¥‡×̃ˆ³ƒơ³½ăˆŸ9¥‡ÏÔÓ̉ÿ¼ĂƠÑÓâơ߈ù×ø×™ëéå·Å«»‡½¦ôăÁ©‡¥2ßëMô +½›¾™‰kß [ïS°»§ô±¿Íı»«‡“Íj½€¹à‰ºÛ×8¤‡£ä„ø$ª» Ë̉ĐÓ ùêéêÿ§ûƯ Íá ëö’Ơÿơ߈¯G‹ø߈Û«‚ ½9ٽٽ™‡µ̣àĂª ¨ƒº5׿8™‰kß [ïSÇŒ±»Ž—¾ĂƠçکǨ,ÏÔÏÔ«Ô“Ơ™‰kß [ïSăˆŸ;±»ÙÚ«·3uUɇù¼ĂÖ³ăÚ—˜ÎÔÛ«‚ ½9Ó$Å¿ôÛÀƒvµ†ưÀß»ûÛ«‚ ½9“™àéê±»Û«‚ ½9±»Á¹¡%Ü ÉĂ­ÏÏÔ“Çí‡߈«‡“ÍjÏÔÁ̉ù×Hù׃¾‘Ê%†Ú₫ï‹ÓƠñÚơ«dÄíÆ©Ơù×щ·Å±»‰¿Iëö›‡ŒùשˆÛ«‚ ½9ăˆŸ;ñÚ«‡“ÍjϺÇÖ§ÔßÁ½€™‡óDZ»Å9¥‡çíÏÔÁ×̣Ô±Ô½Ôư“‰Ô½’â§Ô±»ŸÅÿ¯¶™‰kß [ïSăơ«Ô“Èà¬ĐØ¥Æç̃ăơçÚùæ߈±¿…aÙÚƒÔ·Ôé‡ÓظÚù×ׯŸÄÏÅĂÓ߈¢Çƒv™ôĂÙ£»°¿½̃ˆăˆỴ̈ØÙ½ƒˆçØù×»‡½€û›¾‰»ëöï»ăàôê¹Ú«Ñ‡Á±»‘söÁó1„ÇÛºÏÄ·ØóÂÑÇ÷ÁÏĂÈ8¤‡®¼ Ñ×ưÀÛÀ÷Ú«Ô‡ÇÇÖÛ«‚ ½9åĂ½ë±¿Ưψ™‰kß [ïSƒœÛ±»«‡“Íjôû(ÍË)éÛ9¥ÛºÊ»‡³¡ÁÓ÷Á́ –G ¯Èí—GăˆŸñÓ¢»ÎÛ«‚ ½9ß„߈ùê·‡‘×8çÓÆÅ–̣ÔÏ̉·Ó ¥0ưÀ­Øƒ9¥‡×ơê¿Ă³±»ơêWËƠÁƯóǵ‰¼€ ăˆŸ;kÅÔ÷ÁívĂ߈µØÿÚáÛÍƠ£ä«·3uUÇ"ÿ¯¶ü̉‹ÇÏÔÏÔ¡»ƒvÀ¼ ÑÓô›¾™ëéå«Ô¹»ï½­ÄÆĂ­Ö˹™‰kß [ïS÷ÁÏÅ¿ºÁƯó|ËDZ»ÍË)éÛ9¥±»ăê©ØÙ×½·Å›¶éû(ơŸÈª»¡ÿÂ߈©‡¥2ßëM߈ñÚ¡ÔưÀ˜‰j̃ZîSÉÍív¥ºóÔăˆŸ;ƒ—ŒíÁ¥Æù×ûĂÙÉ́ä̉©ÓÂƠ«ÔȽ€‰¿IÏÔÁƯѶÛ«‚ ½9ÏÅ߈±»£äù×ÅÓÁÛßÄÙÅÓ½Ơ¬Ä—¶ï»ÁƯ‚v ×¼»nëöÛ«‚ ½9ù×ù×óÇÁƯ¬Ö¥Ó™‰kß [ïS½çÚï»›¶éÿ×±»ù‰™‰kß [ïSª‡’̀j¾½ëÚí—G¥Á¯ÈÁ̉ăÂ3‰¿Iù×½ù»ÑÓưÀ±»½»¯ß«ÔÓº™‰kß [ïSÙ½Ăºº߈…ÔƠXÛ«‚ ½9â—‹Üơê©ĂÏÅṇ̃«‡“ÍjÏÅÍÄÙ½Û«‚ ½9±»±ƯÏÔăˆŸ;Óä×ÇĂ˜‡ư›•Œ¦ôơê¹ÚñÓ9¥‡×ÇÖ²+_÷À›¾¾ʹß»û›»±»³È©‡¥2ßëM…Øÿ¼—»‹ÈĂôéÙ“ÆÆ¹ÚÑő֩ÓÙÚù×ÏÔùÅôÿ¯¶¥ÆÆè›¶éŸ\ÍÓÿׇǺ«‡“Íjù×ù×êÓ«dµ!“ƠÁ›·Ôù×ơ›¾ׯ«‡“Íj‚Ø߈ƒˆíÖÅ£½ô›¾Ơ¯ ơèÅÍUƒvơꩇ¥2ßëM°»¡Ûƒv™‰kß [ïS—¶Ù½éºưÀÛ­Ä«ÔǺ…Ôçù¿߈—ă±»›¶éƠËÇ9¥‡ÔX©ˆ¡Èáꩼñ‡ÍÓ¾ßÏԸڲܛ¾½€Û€ƒÚ«‡“Íj•Œ½¿àăà™‹›¾đÁ̃ŒÚ,Ù׫ڼ׾÷4ËÉ9™‰kß [ïS«‡“Íjƒv“ÍŸƠ¿ô¡»›¾ÏŋLJßÚ¥Øÿ+óÏÔ÷ÚÏ̉ØRÏ̉µ†ăơ° êØ ăê¼ÏÔù×ÿ¯¶ÿ¯¶ăíÛ«‚ ½9÷ˆµ‘ÔƒˆăˆŸỞăˆŸ;kï½¹ÚÖÔ†6¦jÉå̉ £ ½«‡“ÍjƠÅúÜø₫9»Ă®ÛÆçڻ߅Œ¡ÁµØ·§D íÁĂ$‡¡Û×Ç»©ºÙÚ߈¾›ÖéÓăˆŸ«‡“Íj߈±»ÿ‡ù×Ö¾Áùד½9¥‡ù×ăˆŸÑó«Ô‹ÈûĂù×öÛ«‚ ½9Û«‚ ½9ÍË)éÛ9¥—¶ĂÛ«‚ ½9ơê߈Á½8¤‡×ÿÄ½Ă¼ª»¡ÔÔơ%ưÀù×ăˆŸ;ÙÚ“Ơƒvù×ùׇº÷‡ÏÅÛº½ÏÅÇØ§½£Ç™‰kß [ïSçͼÏÔñÚÛ«‚ ½9ƒ×“Èɇ«‡“ÍjåÁ¥ØÑÓĂßÄÙ™‰kß [ïSØŒê*ª°»߈¿çœÂúÙù®ºÿÚËÇÓÿ¯¶¥Ö™‰kß [ïS¼ĂÏÅ¿à¿(·ÔÙ×±Ù×ËƠ÷Á߈¾»˜ô˜‰j̃ZîSÛ×ÍẳÅ» Èß»û›¶éÛ×é‰ñ5ñ·Ù½»qå̉ áö£ä±½ ËûëÓÙ×ÇÓÔ¾ÑÓ“Ỡ»ú¢È ù×ƠĐÓß»û³å̉ «·3uU¾±»¹ÁĂùׇºç·Y™ô‡ÇÏÅ™×›é‰Ô¿‰Û«‚ ½9ù×ù×ÿ¼ƒˆÙÚ«‡“Íjó×ưؽÔXØY™ôÁ«·3uU¿Ùù×”÷¥ˆ]1ùơ³z¿‰‹Ç½€ÁƯƒÚ߈Ú׫‡“ÍjÄÔív˜‰j̃ZîSßÄÙĂÈ™ơ»ôÅØăˆŸÿÛëö½ƒvÙÚ¼Áܺ½¡Ó¢X¥ÈƯºỞшñÚÙRµÈÑÓå×ÙÚ“Û£äëÓ‡ŒåƠ©»Ü³nÍƠß¹Û÷‡óǽÔëöÓÅÛ«‚ ½9’¹ÜN¿»ßÖùêö«&ÀĂử¹Ú×Ơ†7§j“ÛÏÔÅÓÙ½›¡Ïı»ôĂƒvßÄÙËÉ9ÍƠƒØ·È†Œ + + +ÏÄăÅÿ¯¶±»¹~¯ÏíÖß„‹ÇÏÄÙ½Ѷƒv·‡‘×8çëö«‡“ÍjûÓá=ÓØ¢ÇÙÚÇÖƒvÁ ̃ŒÚ,™‰kß [ïS9¥‡9¥‡ưÀ«‡“Íj9¥‡¾ù×ûºƒ„'ɯÈ9¥‡ÛÀ߈€º߈«‡“ÍjÏŃˆÔơ₫›¾ÅÔăº§ƒvƒ°Û«‚ ½9ÏÄÑÓï½ÏÔÏÔ¿ß9¥‡³ ×¾ëöÛ«‚ ½9ëöÛºÁÛƒvŸ¿½ôÙYÛ̃»ú¡Ư¾«ÚĂ‹È±»ÏÔ…ô›¾ƒˆÏ̉ßÁơÔ÷Á§Æ¶ù×ù×éÓÙŒë*«°)ƒ˜‰j̃ZîSÿ­½Ắ½›¡Éö±»ăˆŸ;“Èÿ‡‹Ó“Û·ÆŸóÁ½Ơ¾G¿Ú«‡“Íj›¾«Ô«ÚƒÚ«îÙÚ±êĂÙÅÔăˆŸ;¡§Ù½Ù½“½ɇơÔÚǻث‡“Íj£Ç¯!öêÏ¿àă­«‡“ÍjûôñÓ̃ÁüÀÏñÚ¡»“È“Æ߈ƒˆÑÓ¡Ơ߈ơèÅù×µØëọ̈Çû(ÍÓ§ÓÅ»±»ÍË)éÛ9¥›¾¹ÚÿÚ÷ÙÑÓɇ·Ô¼ô™‰kß [ïSÑÓå̉ «»Ă¼¹Úƒv«Ôéºøæ ¹Ú»y£–ù¿£öăˆŸ;¯Æ™‰kß [ïSˆĂàª»ÑØ½÷Á¾‡ÛÙ½±¿˜‰j̃ZîSÛ«‚ ½9—ˆ©¼߈Ở‡ŒË1₫Ó¼ÇÖχßÖùê²¾—¶ƯÓ ±»ºå»Ó÷ÙÁƯ‹Ç»ôơê»Å­½¼‹ÙœŸ}™‰kß [ïSÿÚå̉ ™@ĂºµØ¹ÚÛ«‚ ½9ăˆŸׄ¹Úèø +«·3uU“ÈáÓçÚƒöe‡$̃ˆ½€Úª‚ +¼9À¼é‡«‡“Íj߈ÛÚ™ơ½€9¥‡¹Ú«»«‡“Íj©Ç߈«‡“Íj¡»¿½ï³2Ç»ÖĂ—ˆÛÍÄ)öÚ¹¹ÚơÔÏ̉€Ó½ÜÑÅ™‰kß [ïS›¾­ÈÏŵ‰üƃµ¡ƠíÆëöƯÂáê½ØˆÆ¡“Ơ¿âÂ3Å8D¤‡DÖ ÷Á±»ƒˆ‹ÇƒØóÂøô¡ÈÈĂ¡Ô±»ôƒvÏÅÛ«‚ ½9Ù½«»Ù½¬ÄáÅ»½́ºĐÅAÑÄë߈í—G™‰kß [ïSÍÄù׃ؓÇĂ½€‡×öơԥŧԫ»±»£Ư¹Úͪ™‰kß [ïSÙ½ĂÙ½€Î̉ÙÚ™ÁĂºƒ́¡¼߈ÏÔŸ}9¥‡›Úùףƙ‰kß [ïS°»ÏÅÏ̉“½€º—§Í»‹¿Ïŵ†̉ØÏ —¶ÿ׃v­«»™‰kß [ïSơê½’ÆÙ½Ñæ±»Ž¥·—¾ÓØéº™Ô¾ÁĂ›¡üÀ Ѷơê©»ª‡’̀jÅôăˆŸ;3ăơ‰Ư·‡‘×8ç£ÇáêÙ̉±»ưù×ôĂưº­v«‡“ÍjßÁ¨¼ Ï̉ÙÚơÔƺ½³Ø–ŒÁƯ¡˜‰j̃ZîSñÚÛ«‚ ½9߈㻵‰±»ËÓÏ̉×¾¿Å½ĂÙơꙉkß [ïSƠÄăˆŸ¡ÛơÔ×Óó£äº‰ơ¾È<ɇ¢ä̃ˆÙ»Ù½ñÖ½ăˆŸÍË)éÛ9¥½ÏÅĂ—¶ƒvÙƠ™‰kß [ïS™‰kß [ïS™‰kß [ïSưÀÔ¶éÓ飃vÿ¯¶9¥‡÷‡££™àëö…»ô÷‡Ô‰ÛµØ©Ø…ÇÿÂû¼ívưÀ½«‡“Íj—»«‡“Íj±¿¡ÈÙ×9¥‡¹Ú‹ÜŒƠËÉ9Û«‚ ½9ö£Ç͵©ØƒvƠ’¥ˆ]1ñÚî»çô‡Ụ̂¶ăˆŸ;k·Ó ¥0çÚù×߈Û«‚ ½9ùæ̀½™‰kß [ïS½ØgÅ»©Ơ˜êèäăˆŸ;Á‡ăăˆŸ;ùơ‹ÇƒˆÙ½­Ö­Ä߈™Ø‹È¥Ø÷µǺåĂ¡°Û«‚ ½9¡Ô߈ËÉ9«‡“ÍjŸ}¹¶ÖĂëöăŸ\éÓ±»ÏÓÔÓå̉ ÏÅÏÅăˆŸ;ߌÛ,©Ó¹Úù×ÍÓÙÓ«‡“Íjùæ½ĂơÔáêëöÛ«‚ ½9ÍĽ“ºƒˆ¯¾‡ºÇÅ×Ơô±»¶‡Ö8æÏÅơÔÍƠŸw°»ăˆŸ³ÆöØÚ‹ÜăˆŸ‘¾ïÚ¼ô¾ÅÏ̉îƠçØƒÖ·Ü£»º½™‰kß [ïSƠƒvăˆŸƠºmåôï»ơ±‡²Æ0́v ±»ñÓÿ¯¶߈÷¼™‰kß [ïS‡ŒÑÓĽϺÙ½ÑĂÿ¯¶°¿…ÛưÀ‡ŒÙÜă†¹ÚÙ½«Ô뫇“ÍjÂÏÔ÷‡›ƒvÿÚơêø×™ÁÓØáØ£Ç“½ÏÔ¯¼­¾ºØñÓ—¶ô‚ +±»½¿ßưÀëöáçéÚ£ƠµßǺë€ô™‰kß [ïSĂƠ·‡‘×8çœÜ ÑÓÛ׉ԓ¹ƯNưÀ÷ÁÈ÷Á́vNÏÔÊÇ9¥‡“¹ƯNÓºÚÄ̉ăˆŸ;Å‚vëöÄØ½ÏÔÓ̉³Èƒ½«‡“Íj—»Û«‚ ½9½ƒv¥ëÑù×Í·¯×ïùƒv¡»ỞÈ̉ÙÚ½Ô«Ñ¿‰¼Ă™ëéå±»÷Á±»Ïű»½«Ô³Ø߈ÙÚ¥ÓÑ`›¾đt퇘‰j̃ZîS±¿¦È çôưÀ™‰kß [ïS¾߈ÑÅËƠå³ÄÔ™‰kß [ïS›¶é·Ô¿çëö¹Ú¡Èÿ¼½€ï‡Ûű»ĂÈÁƯ±½Ç»û(¥ˆ]1Ù½½È£»ƠŽä̉îºù ơê±»§ÔÁÛ®Ơ +¡»ăơ±đ߈ơê§Ó½Ô”¹Ú.Û«‚ ½9ºƒvĂ‡Ç£ä÷‡“Ơ²Ơ ›ÚơêÓ «»ƒv¾£»ăêơÔ£Èï½™Û…ôÅÔù×éJé‰Ó5“gesÁÅçÚ¿×µØË‘«‡“Íjù×̉½±»Ù½ăˆŸ;óÇ9¥‡ÏÔ©Ơô«‡“Íjù×±»ăˆŸ;ăˆŸăˆŸÏ̉ƒˆăˆŸ;±»éÚƒY¡È߈ٽٽ8¤‡×¸Ø•ŒĐÁ¹ÚóÇơêºÓØ÷$ßÖơv߈­ÄñƆ»½½߈¾ăˆŸ̃„¶¿‰÷ÚÙ½­ÈÿÚÚª‚ +¼9ÏŃvϹÓØôÄ•Èû›Ÿ}ơê·Å°»Æι¿Å«‡“Íj‰¿IçÚĐÓç̃Ÿ}Ưº©ÀŸ}ÉƯŒ‰°6ơêơêƒv™ÁÇĂƒv¿‰½¡ÛÄØ÷Á߈Ž·‡‘×8çÛÑóÙŒë*« ù×›¡¹Ú¯¼ăˆŸ;™Ø›¾¥Û©ØÛǪÚù×öÁƒvưÀùט‡ +°»¯ÈñÖóÇî²2™‚ÑÓ釘êèäßÁ§ºÙ½Å™‰kß [ïSă®Ù½ăˆŸ;kƒÛºÀ¹ơêѶ¿‰¡»±°¡ÔÖ¾¬ÖßÚµa›Yªd‰¿I—¶Ù½ÅØûø‹vơêE¼Ô¿‰óÄ·Ü«ˆñÆưÁ™‰kß [ïSǼƠøê¼ÔÁĂ–½Å»ÏÔÛ׾عڲƛ;àƠ +âˆÓº±»µ÷ÚÏÅ»½÷Áăàå̉ ôôÏÔÑÄë9¥‡‘Ȇx ´†ï»°»ƒ×±»Ï̉ÇÖØ»ÙÚ¡9¥‡áí¯‰¯0åîåĂ­ØùÍÄÙ½©¼ÜÂÛ«‚ ½9©‡¥2ßëMß»û«Ư’½ͼƯßíơăˆŸÛ«‚ ½9釫‡“Íjƒvé†ÉẮv +ÏÔ«Ôù×­€¹Ø¯à½¬Ä˜‡»Å½¯G‹øÛ«‚ ½9Û«‚ ½9±»ơê߈ÿÚăƯÛ«‚ ½9£Ç—¶›¨‰gù×¹ÚщưÀÉ»ÿ×´a߈ÏÔ¡»©ØµØë§ôÙ°¥ÆÏų³á ß»û¡ÁÏÔàÄ!ưÀơÔßÄÙ¿‰đ»Ư®©&±»±»™‰kß [ïSëöóÂùÖƠỒĂĂÙ±»ª‡’̀j¿ºíÆ‹ÇÁ½ëԻȻ¼‘™ơ™ôÙ½ÅÄëö9¥‡¶öÏÔÁĂׯ‚vÏ̉½¯×ëƠUŸÖÑØ«d±»“Ơﻹڽū‡“Íj«‡“Íj‡ºöÏ̉·Ô£ä¼±»ª‡’̀jĂÙÙƠÑÄëăơ‘đÑÄëÛÄÓ’Èùêû^ƯÓ ɇçô¯G‹øêØăˆŸé·ÓƠX¡Ûë¥ÆơÔơĂ¹Ú°»“Ơ߈¹Úù×Åôÿ$˜‰j̃ZîSªĐ½­¡ÁÇĂ³‡˜‰ j ̃    Z îS ±»ÁƯɇ«Ô±»Å»¹ỢÔ§ỗˆ·ÅçÚƠ´ªÔƠ‹röꇌ½—˜ñƃˆ«‡“Íj±»Á¼«‡“Íjׯù×·‡‘×8çŸÅñÚ9¥‡¿Ø÷Á¬Äô¶̣Ù½ƒvŒÓ9¥‡™‰kß [ïS˹³ăˆŸ;ÙÚÙץƛ¾9¥‡µÈÛÀ‡(½ƒv±”íă³ËÇÿÚ̃ÄØù×—¶gäô߈½Ă«‡“Íj÷Á‰¿I³Ü‰Ă¿‰óǓȑӡÁơĵؙ‰kß [ïSÙÚàê³µ†ÏÅÏÔ%óÔÛ«‚ ½9øêï½ù×ăà­ÔåÁ“ÆßÚ™‡«̣ÏÔ™ÓđÁ¤ˆ\0ăơ߈²Â±½μ›¾±»¡È«ÔÓÏ̉ĂÙï»߈ÍÓö·Ô™‰kß [ïSÙÚÑÓ¡ÁƠÅơÔ­Öù×öÿÚÛ«‚ ½9Û«‚ ½9ưÀøê¡»̃ˆ‘ȿŹÚñÓùë—ŒÉ6­vĂÈ·ÑÓÑÓ¿àúÙ¼©ºÙ×™Ô•{¹ÚÿÚ¥¼‚Ø™‡ÙŒë*«Ϻ›¾ù×ô– ·Ôׯ©‡¥2ßëM¹ÚÓÅƯÓ ăˆŸ;kéêø×ÂÙßÚ—»âÁ¼Á̉¹ÖºË9¥‡ïiÛÀרÓŹ¶¶å»Ë¿ÖÚù×ÛÄÓëöƒv•Ö±Ô½±Á±ÁË̉÷Á‡ŒăˆŸ;§Ô‡ÄôñÚ́ØÙÜ·‰ơÔ±»ă»ËÇăˆŸ;kù×›¾¾ódžי‰kß [ïSơêù׳¿‰Ù½™ô™‰kß [ïSå̉ ¼Ă©‡¥2ßëMßÄÙơê¾½Ă ËéçÚăÙ×߈ú)™‡жỞ̉ƪ»©‡¥2ßëMËÇ—¶ßÁ ËûÉæƯ$Û«‚ ½9ăºơÔÍĂ˜‡ÛÔƒˆÇ̉ÇƠ°»ªÚëÓ߈ùëÇ©‡¥2ßëM©¼ëöƯÖö9¥‡¹Ú¡ç½ƒÚ©Ó·¼Í7߈½߈¥ÖµØщ§Ô½Ü¹ÁÙÚơÔÙ½߈óǹÁảX­½¼“Ȫ‡’̀jËáƯÓ Îđ‡Ç±»ív¾ÏÓÔ±»½êöïÚ«ÔëöÓºăˆŸ;±»¯ÈăˆŸÀÿ¯¶ƒÖ™‡Ó ‹›æ¥ÎµØ÷Á¹Ú°¿ƒ½µaÿ¯¶½€ÅÀ™‰kß [ïSÛ«‚ ½9¡Á³ ·‡‘×8ç±½9¥‡›¹ƯÓ «Ñ߈ÏÄ“¹ƯNơÔÁÙÓÆ‰¿IÍÄßÁ“½€×¼«»Ù½“êÅӸסÔÜ€¾Ï̉ɻؠ»ƯÚ½€ÍË)éÛ9¥«‡“ÍjûƠר¿Å¦ÈÿÚ·‡‘×8çµØ«‡“Íj½ỞƯÓ ù×ÏÅÏÔơÔ߈µ†ÏÔ‹ÇÁăÁ¹߈©Ó×¾Ù½ÿÚ³×™Ă­€ëöºÔ£»¶Ô¨È ï»ÿâ™Á÷å5ÓƒvÁ|ăˆŸ;k«Ô›™‰kß [ïSôáƠÏÔ±»å̉ êöù×ÏŹÚĂÙ°»±»è畾µêù×Û«‚ ½9ÍÂùơå“•çÉ›Ăô±»ù×ÅÁÉ̉Ă˜‰j̃ZîSƾ¹Á°¿ËÇơ»•Լ؅NjÁưÀŸƠôÅ÷‡Ù½Û«‚ ½9ׯ¹ÚÙ·‡‘×8çöĂÈ™‰kß [ïSÑ×Ûê¡Û₫Çшéê“ƠÿÚÏÄŨß»ûƠX™‰kß [ïSÓÔûÓơêË¿߈“Ơÿ¯¶Ñóëö•Ûχ®ÈÿÇí¹ÖÆÅرëØ÷ÁG½¹£Ư÷ÁÂ߈½ÙÚÿÜ8¤‡ÑÓ߈Á›·ÔƒˆÓØívÚ× ‹Ü„÷ĂÙÑÓ³ÛƒvêÚ8A¤‡AÖ…Û™‡ÇÖëöÑó‹W ¡Ô·Ô£ú߈ưÀ±»“Ơ˜‰j̃ZîS¹£‹Ç½ÍBÅÓµ†«‡“Íj—»±“ÈưÀ̀Ç9íêÑÓơê ́ëåÅ·‡‘×8癇ñÚùêæº™‰kß [ïSÙ½ööÁ÷¼½ơêçÚ¿ô¿‰ëöăˆŸ;“Ơ‡ÙÓÙ½™ÔÉ̉“È߈ù׭ĵØÏÅăĂ3‰Û’‰¿IÏPù×ÀƯÑÄë¶ÜéÚÛ«‚ ½9ëÁƯ…«‡“Íj£ÇĂÙ9¥‡å̉ »Ă¡ÛÁ½̣ć“ĂĂ ›­±àéM“Ơ÷Á…n•ŒóÇŸÖÛº߈™‰kß [ïS«‡“ÍjÏÔºñÚ³¾óÇ©‡¥2ßëM«‡“ÍjÛÄÓùơÛ«‚ ½9ùơĂÆ߈û‡Ç©Ó¿ºׯ̃ˆ°»¬¾±»ô÷Ùô›¾ĐÓÑá³¹½€™‰kß [ïS§Æ ÈµÁÆÁ|°»ׯµÜ½ÈÙĂÈËÖíÆ±½ŸË̉½ơ꫇“Íjß»û¶  ߈‡Œψ‹Ó©‡¥2ßëM™ơưÀÑÄë߈•çÚ±»ÁĂÛ«‚ ½9ăˆŸ;±¿Á߈±»©¼Ó¾ÏÅ÷‡ÏÔ¤ÁËÉ9ÿÚ̉‘ù×½•ŒĂ¸£!Ù½ÑÓÙÚƒv­Ä™‰kß [ïSÛ×ôÔÙ̉ù×Û«‚ ½9çÚï³2ϺĐÄêăˆŸ;kơÔ´aăˆŸ;kǪ¶2tTÓÆëö´½AÛ«‚ ½9øêÁ¾ăϼ¿º¿¹¶‡Ö8æ—¶ù×ÅÓß»û̉Ù½­ÄƠ¹ƒ½ß„‹ÜéÚëö°½ÿ××ÜÅØ«‡“Íj»ØµØ«‡“Íj±¿“È«‡“Íj±¿ù×öÙ×°»™‰kß [ïS×Ơ†7§jáƠ©Óù׿ે“ÍjñÆ™‰kß [ïSöù×߈¤ˆ\0‹ÓívăˆŸ‹Û•Œè%ÏÔ“ƠÏÚŸæù×Ùܘ‰j̃ZîSôØÏÔ±ëØ½€ƒˆ¨º$ͼƒ÷ÁŸ\¼ăˆŸ;ƒŸâˆ™‰kß [ïSÍÓñÙ™‰kß [ïSÑĂ—¶‰¿IƒvÛ«‚ ½9«‡“ÍjÙŒë*«8¤‡‚ˆưÀĂÙçÚÙ½ù¿Ă¼Å²¾¹Ú˜‰j̃ZîS¹íØûù׺äÁ Ă·Ô9¥‡›z£Ư‹ÜçÚ‰ÛÓ¾“Ƚ€ëöÙ½ÿ§ăơ¯¼Ù½Å¡ÈÆËÉ9ƯÓ ĂÙưÀơèŇÚÛ×Û«‚ ½9ƦØïÅơĽôù×½ôÂù×ÏԪ܉»øºù×å×ï³2±»§ÓÛô‚عڛv̀_ÏīԱ¿³Ø±»£ØÛ«‚ ½9ÛºÛ«‚ ½9ơĽ™‰kß [ïS¦Ôï»ù׳ƒvÿ.ù×µØñÖù׫‡“Íj«‡“ÍjđÆ“È₫Ç©ñÁÑÓƒˆäô×¼ͼ¹Â±»ÏÔóÇăˆŸ;k߈ù×í—G»qƒvƒv³ăˆŸ;ÍÓ½£Ư»Øׯ±¿«‡“Íjç½߈‹ÇÛ«‚ ½9öÛ«‚ ½9“ÈÏÅ—Ó¯Ơ‡û(“ƠơÔ°»ÅØÙ½ùêµØưÀ«‡“ÍjËǟŸÚùêµa™‰kß [ïSß»ûµØƒÀ©¼‰ÔºØˆ¾íÁ½Ô‹ÇɇÅ–å̉ á ơèÅÁËÙ½Âï»ñÓâÁÛ«‚ ½9í|ׯÿ¯¶¥ˆ]1§Û¡ÁÛ«‚ ½9ÛºôƒvÑÓ߈“…̃ÑÓ¡ÈÓƯù×Û«‚ ½9¡Ô»$Á ±»ÇÓ™‰kß [ïSƒvëÓ¼€ ËûæƠø…ô•Œáê¹Ú•Ù½±»ĂÛ«‚ ½9¿߈½®¼ÙŒë*«Îŗ؃Öÿ¯¶ƯÂ×ܱ»¥ºëö°»ù×ăàרăơ›¹±»ívï‡ïÚ¼ôчôù¿ëö™‰kß [ïS¹óÎđăơ«‡“ÍjÛ«‚ ½9ăˆŸ×Óé̀Ë¥Ϻ߈Ôç̉ÍÄÓº“È‹Çï»ơꙉkß [ïS­ÄƒëöÔ·Ô—¶ÂÙñÖëöñ™‰kß [ïS«dëößƯÛÇÿ'®¾ÁƯƠ€½™‰kß [ïSÛ×™‰kß [ïSưÀô’ÈŸ\áƠùêåÁ›¾Åö˜‰j̃ZîṢ£ÔÛ«‚ ½9ƒÖƒÚƒvÁ̉·¼Í7±»¸À¹‹‚Ø×À˫ԙ‰kß [ïS÷Á…ƠóÂ…»¹ÚíÏÔÓºרƒ´¶è9¥‡¿Øù×›¾Ûº¥Ûÿ¯¶ăàùôÏű»›‡¡ÛçÚ—¶¦¹ ›¾ú=ëöÉíÛºÑÄëƒvơÔóÂĂĂÛºÁ‡é/×:ƒÔăˆŸ;½§ÓÅ…n™Á¹Ú™‰kß [ïSºÑæ§]ÍƠ×hÏÔ¨ƠĂÛ¹½€¡Ư·‡‘×8篼Ͳ•ÏÄ÷Ú߈ƒˆ—»ÏÅÙ½Ó»­Ô Ëûå̉ —ˆ‹Ç‹Üù×±»¹‡ûØ9¥‡¹ÁëÔ˜êèäÏ“Ơ©¼±»å‡™‰kß [ïSơÔŸÖÂŽÁ‡é/×:ÿ¯¶ăˆŸ¡ÔïÚ«»ặ߈±»£Œ«Ú¤ˆ\0ưÀó½߈9¥‡ÔÚª‚ +¼9Ù×Û«‚ ½9™‰kß [ïS«·3uU½«‡“ÍjÛº‚ƒvÙŒë*«†Œư‡±ù1“ºƠÏ€ÓÑÓû(ÍÄ«â‡ÙÚÏÄívÓ±»—Ö¿‰¦ÈŸ¿º½ù×ÏÚáêƒvô«‡“Íj¾¹ù承IơÀ½«ÔÏÔ±»ơġԡÔÙ½µØ½€ßÚ¶ؽƠX߈§ô‡Úÿ¯¶»ˆ«‡“Íj¯ÈÂƠăˆŸÓºµ́߈á=³nƯÓ ăßÄÙó½ơêÍ́ÁƯÁƯÏԃصØÏÄ«‡“Íj«‡“ÍjĂ¼ưÀçÚăÄíÖ³ôÇØƒáêëÔÓµÙ½Ϻר‡WÄ¿»ÚÑ¡ÔơÔ™‰kß [ïSÙ½½ƒv¯È•ÓƯ –¾߈çô9¥‡ỞÏÔÓØ­Ä̀Ê)èÛ8¤ëöƒv©¼߈§ÓíJï«Ó̉ƒˆ‡ơçÏÔÏÔ·¼Í7ÛÇ»±»߈ÁĂ¾ñƒ¾ơêĂÙ“£äµ†—ˆ°»ăˆŸçô±¿¿Ă½€ĐÓ•×™‰kß [ïS­ÖÛºÛ«‚ ½9̀6ÍÄy¡³ăˆŸ;ëö䌾N¡Ô¡ÈæÚï½̃Úíêô½¹Úá ÁƯÛ«‚ ½9ƠáË%™‰kß [ïS±»®¾Û«‚ ½9±»Ûׯé«Ô‹Ü߈±»åŒ¿NÛ«‚ ½9‡™‰kß [ïS™‰kß [ïSÖ̀º¾Ïŧä¹Ú¹ÚăµعÁÛÄÓ«‡“ÍjĂÙÛ×°»½ëö™‰kß [ïS߈ö›¶é÷Á±»ưÀ°»¡rĂψ½ëƠUÇØÛ«‚ ½9ËÇëöщïÚ·ÅÁƯϺ·‡‘×8çéÆÔX>¯‰¯0ơøÚử÷Áºëö¾ß«ÔïÁ«‡“Íj¯±½ª‡’̀jÁƯ³Ç÷Ù­Ä…ôù×âÇÇß„™‡×ƠÿÚÙ½™Ôƒˆ¿½«‡“ÍjÏỒÊ)èÛ8¤ÂÙ +½ĂăˆŸö³ØăˆŸ;¡ăˆŸ;¶¸%ưKµØó¶½€»Ù¹ÚùæÏÔĂÙ½ÍË)éÛ9¥í‡‡Û½Áß»ûƒvµØ¨ËáößÖƯ‰öÛ«‚ ½9º•½÷ÁÛ«‚ ½9ăˆŸ;kÏÔóÇ÷Ù±”¹ÖƠ₫Ë%ù‡ƠÁçº9¥‡߈ăÔ™‰kß [ïSÏÔ«Ôơ$±»ù×¶‡Ö8æ¸Ú ív±»ë‡›¾›Û‡ÇÙ½™‰kß [ïS½öñÆù×ĂÙ—ˆÿ¯¶œ‡߈ш¿ß½¼€ÁÁơÔ9¥‡ù× ¬°àèMä̉ÙÚ”{ơÄ̃ˆÛ«‚ ½9ï»»ÆĂ Áç8߈çÚéÔÿñ×Ûº߈¨Óß»ûÙ½§Ô±»ơêå̉ …Ơÿ¯¶…ÚµØëÓ³¿(³ØÅר›¶éơêÛ«‚ ½9¯°¾öëö»ˆ©‡¥2ßëMÄô±ÁÏ̉áƠƒv­ØÿÜ߈˹Ơ¥̀ă½åô±¿ÁƯæ̉¿¹˜‡ăˆŸ;këöÏħƠǯÈ9¥‡ós™‰kß [ïS÷Ú±»Û«‚ ½9¹Ú›¶éÛ«‚ ½9ÏÔăàÍÓ½–»ç«·3uUñÓÏı»ơÔ×¾³ơêùơăơĐÓ™‰kß [ïSĂÙÖ“‹½̃ˆƒvÉÑ·Ô‰¿I—ŒÛ·ÅưÀĂỢ¶ƒˆ³•×–¦̀»ưÜăˆŸ;—¶‚½ÏÔ·Ô8¤‡¯áƠ÷Áƒvö™‰kß [ïSƠĂ—¶—–߈ăˆŸ;Óº™‡Û«‚ ½9ƒq½ÔÙ½‡Œ›¶éáÙ½Û«‚ ½9‰yçÚщ«‡“ÍjÏ̃Û«‚ ½9ö̉ÙÚŸƠéÚ9¥‡ÙÚÛºăˆŸ;ÙÚ–»«»«‡“Íj¼ë”Öø|Ö¾ Y¸à¹¾çô߈éƒvƒvƒØëö»Á³…ÿ¯¶ÇÑÄë‘Ûå̉ ëö“ÈÛÀרăˆŸ’Ç +9¥‡ăˆŸ;k£ä±»öÛ«‚ ½9öç°Ù½›¾÷ÙÎÅ·ÔÑÓÁ‹ÙÏÅĂ³™‰kß [ïSö©ºăˆŸ;ƒé¡Ô½·‡‘×8çÅÓơêëö߈ÙàÛ«‚ ½9«Ú©Ó±»ÙŒë*«‹Ü½•Ûÿ…¡ÈÔX²Æ™‰kß [ïSƯº¥{ù×ù×±»Û×ëƠUĐƠ×ÑÄë߈߈ăˆŸ;ơ»ŒüM§Óɇ×¾ñÛ­Äÿ$9¥‡9¥‡×áêÅØ¬ÖÁÛ©‡¥2ßëM¢äƒvăơƒåÍ_ơèÅÍ߈¡(щ«‡“Íj‡“¹ƯNÁƯÛ׿Ϻ߈çÀơêëö8¤‡›¾ÏÔ«‡“Íj¹Úă½×Ơëö·Ó ¥0ô·Ô˜‰j̃ZîS“ùׇŒ‡ƯÓ ÏÅï‡Ưº˜‰j̃ZîSÏÔá ëö“º¶Ô“ÈϺ¥ÆØ‡™Ô¯ƠÅ÷ÁÈöÁ߈º™ô߈±¿đÔÏԥǂ¾ÍË)éÛ9¥³(©Ç‡º“Æ8¤‡öÚª‚ +¼9íÁ󰵆µØÙ½ëöÙ̉°êØ߈ỞĂôϼ­ˆÿ¯¶©Ó€Ơơêٽٽ÷ˆщ¡ÓÂÈñÖ¡«ÙÚë¼߈ÄχŒ˹Ù½ôê¥>Ù½©ÓƒvåèÅÔѶ«ÔÙ½ƯÓ •óÏÔ÷ÚưÀÿÚÙ½ù×ăê—¶ÇØăàăˆŸ;™‰kß [ïSٽٽٽº½Ô™‰kß [ïSĂÙù×óÇ€º +̣Ô½™‰kß [ïS¡Á溵أƯÏÅùê…ôźĂÙ¿‰×¹‡8¤‡×øáꪻ§ô™‰kß [ïSçÚá‡×¿8÷ÁÉĂÙêö«È€¾é‰̃‹ÙÙ½¹ÚÅ麽çÀ›¶é«‡“Íj‡Úï»™‰kß [ïSƒ½½ƠỞÚ™‰kß [ïSÍƠ½‡x¹Ú߈ƠÑÓΞ—Ú½ơÔơÔ¹Ú«·3uU÷ÁçÚ¶¡Ó»ÁÄØÙÚÙÚǼẳÀĂ߈ÿÚ·Ó ¥0«‡“Íjű½±¿ÿ§÷ˆơêÇÖÏÔƒvï¯÷Á÷ÁÓÓ8¤‡×¾ăˆŸ;ơÔ¹ÚĂ­¾ôơơ¿‰ÇÖ·Å›¾«‡“Íj÷ÙÛ«‚ ½9Ï̉Û«‚ ½9¹àĐÄê³Âưíù×ơÔă±»ưÚ‡Çá×шöÁ™‰kß [ïSµØ·̣á ­ØÏÄÓØÔå¼ Í¸£5±‡¿ôï½çÚ»yĂÙŸ}ơĂƒÖ¯×¯ƒ« +>ơºÛ«‚ ½9ÏÅ…¾êơéºÙÚÅ–³«‡“ÍjÛ«‚ ½9ĂÙö±»ăˆŸ™ÓåÁÖù×ăˆŸ„±»­Ä½±»‹ÇÅÓ™‰kß [ïS±»·¦D åÁÍË)éÛ9¥¥ÁµØƠ­ÖÙ½º§ù¾`öĂÈ‹ÇÙ½ÿ§»Ø©‡¥2ßëMº±»ù×ÛDZ¿ÓØ­¾—¶Àù×±¿§àÅ$ăˆŸÀ́ơƠ½ơèÅœĂ§ôơÔ½ÁÛÀöâơÑÄ냈™‰kß [ïSÇ̉ƒv˜‰j̃ZîSÇÖƒˆ±»öưÀ»ô™ô™‰kß [ïSưÀ¼ô ù×ív‰Û§Ô¡Ỡ„ơê·‰™‡Ïņ® ‰¿IÍÓưÀ±»ßÚ™‰kß [ïSÏÅĂĂ«‡“ÍjơêÅ–ËêăˆŸ;¹ÚÏÔ«Ô’÷™‰kß [ïS½ÛºµÀ§ÔŒƠÓÆÇ»ÇÖ³ÈưÀ÷‡­Ø߈ɇÀ̉ĂÙÙ½ç̉ƒvÛ«‚ ½9ùףسăàß„±»Û«‚ ½9«‡“Íj—¶Ù½« ©ƒ»5Ë¿±ÎỐ™ÔƠ¾G™‰kß [ïS̃ˆ™‰kß [ïSÓÁËǫԶ›¾Ǽ»y˜‰ j ̃    Z îS ÿ +ç‚ÍË)éÛ9¥¯¾ƠX¼ …¼ăˆŸ;©ÓÇÖÓµơ꺩¦ƯºÍå½ÙŒë*«½Å÷‡ç½ưÚí$É¿‰ơĂÏÔ›¶éÑÏơêƠÛ«‚ ½9Û«‚ ½9˱³ƠŸ}½§ÓшÇ̉£Ư×¾߈¹Ú¡Ô¾FơêăˆŸ;×Ú§ô–»߈±»̀Ắơ•Œ«‡“Íjö¡Çëö¦Ó© ˜êèäÙÅëÁ¹ÙƠơÔ‰¿I‚v¹*ï×¾ÛºÿÚûÙéêå“ÇçôÛÑăˆŸ£Ô‹Ù…ôĂéÚ«Ú½Ô›¾±»óÄî#ÑÄëÛ«‚ ½9ÏÔﻩǭĉ¿Iùܢǭô°»¯È…Ơ¼´†₫®¶9¥‡ñÓëöÿ¯¶°»™Á×Ơ†7§jÄÍÓù×ÿÚÖ$À̉ÁĂë±»߈½½ơ›¾ƒˆ°»ä̉ÿÛÏÔÙ½ª×ăº­½¼ß»ûº£»߈ĂÙăˆŸ;k³ñÖ߈‰Íù×ǡԯ½‹Ü‰‚ô걿±»ư§‡ÁƯÁËÛ«‚ ½9̉½ÿ¯¶ÈƠ«»ĂÙßÄÙ‹ÈăˆŸ;¹Ú¡ÛÅÔµaÙÓ¬ÖÛñÓƯ$9¥‡ù×ÇÖẨơ±»¶Ôô9¥‡ƒvźỔƯÓ ›éÛ«‚ ½9¾×Ơ£Ó™‰kß [ïSăˆŸ½½ÔăˆŸÛ«‚ ½9†ÚĂăơëö¿ôƅlj۽ƒÚíÖù×´‰¦Ø¹ÚăˆŸ;†ºñÓåƠ߈·ỒÇÑÓÓ°¿ăí¡ÈăˆŸ;óÇăˆŸ;kÏÔ™ÔÏÔ·ØÏÔщï½Æÿ.÷‡ù×½€½ôϹÛ«‚ ½9Æ™‰kß [ïS¡Û‡éôöÏÔÿÚ¾ƒÖéÔ¤½óÇùל̉ƒvăˆŸ;¡ÛåĂ™à߈©‡¥2ßëM¿‰¹Ú¾ª‡ +’ +̀j +Åô­Ö³ Àù×¹¶ù×Å_µØ”¼ØÙ½­Ä­Öù×ÇÖƠ©‡¥2ßëM¤¾#ơĂ«‡“Íj½©À‹ÈưÀ‡9«ÔÏÔăˆŸ™Ó±»ñíÈàƯôÙ½·‡‘×8ç§Ø­Äщç²ÀĂ ±»Û¾ăˆŸ;¯×‹Ü9¥‡Ăº÷ÁƠϼ¥ˆ]1¹¹Ú«ÔÑÓ¢Ơ§Ô½€±»³ÂƯơ³Â½ˆºÏÅÁĂ9¥‡¸Ú˜‰j̃ZîS9¥‡Ơ“Ⱥ½íÖÀ¹å³•Œ«‡“ÍjỞ¿‰ÍÓø×ÙÚÏÔ¯¾Û«‚ ½9½ôרư•‡x™‰kß [ïS߈µØ±»38¤‡Ö‰Æ«‡“ÍjăˆŸ;ùê›v‚v˜‰j̃ZîS߈¤ˆ \ 0 °»ÂÙÍÇó…Ơ­)ÑØÓå̉ ØÚĂÙ‡ô +Ѷôă‘·רÜ‹ÓßẠ́Ă +ÅĽ«‡“ÍjÑ·íÚË̉ƒƒˆ©ƠăˆŸ;ù×™‰kß [ïSÛ«‚ ½9ơêĂщ˜‰j̃ZîSù¾ĂÑÄëơĂ¿‰ͼ«Ú±»ăˆŸׇ½7±»äôÛ«‚ ½9°»¡ÛÛ׃véÓ¹ëöêöµiù×ÿ¯¶ô꛾™‡¡ƠßÁÁƯÛ«‚ ½9”µß™‰kß [ïSưÀ¹ÚÓØñ˜ĂÙÑ+‰ÛÁĂºƒ×ÏÔ½Ă°»ÿ¼°»ëöǽ˜Á±»ù×㻩¼Å±»ơ‡óÔơÔÙ̉µÏĂÈßÚ†½‹Ü™‡§½¡Èù¿ƒvÙÚéßϼöÚóÂÔXŒû¡Ô™‰kß [ïSŸ’ăˆŸ;µaăˆŸ;ß»ûÓØ¢ä“ÈÛ«‚ ½9̉ÅÛ«‚ ½9ĂÙÿ§Á†ŒßÖÂÙöíÖ¾ß ÏÔÍƠĂ½%›¾ËÇ÷‡ͼçÚ‡¾¶Èơê簯Ȩ¼½ơệ‹Û«‚ ½9·Ô™Áë ‡ĂÙ÷Á÷‡ø¿¹£ŨÖ¾ÛÆ«‡“Íj«Ó±»ÁÓØ‡ºÛÄÓÅƠơĂÿ¯¶¿‰¨‡¤2€̃êLù×ñÓ%ñÓÏžßÄÙ³(­ÄăˆŸ;¼©ƠÎÅăˆŸ;¿(“Û³y›¶éĂè¥Æëö…öÏ¿ßƯ»‹°»ÑØÚª‚ +¼9±»ÉÙ­Ö9¥‡×Ég¥ƯψƯ‰¥ÛÅù×ñÓóÇÿ¯¶½€ơê¹àÏÔƠXÚª‚ +¼9§ôưÀÏĹÚ8¤‡ÖâdÂ3•±»™Ôăà¥ÖÏÔ£4«Ô¹Úç°ê؋ǦÓư§‡‹ÇÿÚ©ÓµØÏỒºƒˆëöƒv“½ơĭĺ»ñÖ¡Á½ËÖö±»ù×Û«‚ ½99¥‡ùׂv±½›¶éÙ•Œ«·3uU™‰kß [ïSÁ̉ÏÄăàơê9¥‡±»ơê­v¦Æ ÓóÄ…Ôëö‹Ç©¼‰à‹È·Ôñ‰§ôÏÔÁƯÑÓÚª‚ +¼9ߟŵؓƠ±»¾³àïƠ ËûºY±»«‡“Íjä̉Ẳíº³Æ‡é‡Ă¼éº«»Ÿ»ù×ăˆŸåĂÏÔêÚưÚÿ×9¥‡‡ŒÁ߈¡Áỡå̉ ÇÖ±»¹ÚăˆŸ;¥ÆùơÓÆ°»óÇîƠÅÔ§ôëö±¿̉ÁÏÔ›Ú¾·Ô¾á ‚v¡ÛÏÅ‹ÇÈ›¡‹,ÑÓĂƠưÀù×¼¾F¼¹‹ëÑÄë߈“礇ÇÏÔ÷Á±»¸»î½Å–Ö±»›Û8¤‡ÄÓ°Ă¹ÚÏÔ˜‰j̃ZîSºĂ¬Ö®‡ù±»“ÈͼµØµØƠ߈©ˆå¼ ¤ˆ\0ÑÓ­Ö̃Ú³ơê§·³ƒÁ‡‡́vŸè¹Ú«‡“ÍjÏÔ›Ô߄۫‚ ½9çôĂÈÍË)éÛ9¥9¥‡›¾¼€ÏÅ¥Óơ»ËÉ9˜Ó³ßçñÖåĂ9¥‡ö­Ùƒv÷êĂƠÛ«‚ ½9÷Á‰Á߈ƒƯô«‡“ÍjơèÅÙ-çÚ߈ÅÔ½ôÁƯëö̉Ó§Ư¢·̣ÏÔX“¼ÎÔ§¿‰¹ÚߌÛ,ơê£Ø¾«‡“Íj‡²Â›Ú½Ô³ôñÚ˜‰j̃ZîS‹ƒµØåÁưÀÛ׉¿I°»Ç̉ív“Æ÷٣ǰ»ÙƠëö±»›ÛÚª‚ +¼9ëöå̉ ĂÙϼ™‰kß [ïSÛ«‚ ½9½©Ơ…ŒÛ«‚ ½9ĂÙÙ½߈ׯơèÅ«Ôù×™‰kß [ïSô¡û°»›¶é¡Ô³Â°Áø×­½¼ă»¼ô±»ѶƒvÑÓ¯Ơ¹Ú‡Ïàêù׿‰­Ä½£Ç…Ơ¯ÈÑíÛ×ÂÙ ʾ +£XƒvëöÏÅͶÅâơ‰ÆùêÓŶٽ›Ô™‰kß [ïSçºÅÄăàáê£̃9¥‡™‰kß [ïS÷Úå̉ ơê™Éëö©ÜưÆÛ«‚ ½9̃ÄØ±»óÂ8¤‡ÖÍÓ…Ú­Ä߈‡ö¼îºÇÓ—»™ơù×§Æ™‰kß [ïS¹Úó¶Û×Û«‚ ½9߈ËdzÂ߈™ç¿ººÛ«‚ ½9ß»û«Èÿ¯¶óÇð»¡ÏÔív₫®¶âïæÇ›¡ăơ¾ßçÚ¡Ôơ»·‡‘×8çÏ̉¢ô™Ô«‡“Íj9¥‡ª»ĐĂÈù×…©¼ôêß›·ÔÍƠÆÍÀ‡§¹±»áêđÆƒˆăºѶÇÓ•ŒÙ½߈߈ăˆŸ߈À¹ÁĂƒv›ÚÀË +­ÄߌÛ,µØ¢È +Ûº°»ù׵ثÔÖÆ·‡‘×8ç߈³Â‹Ç÷Áá ƒ×ù×Û«‚ ½9Ç–¢Ç¥Øß»û˜ơ½¡È¹íƒˆ¡È¿Å麣Njǣؙ‰kß [ïSÍË)éÛ9¥™‰kß [ïSÔǾ¿‰½Ù½ÓØĂÙª)ó®Û«‚ ½9£‡×¿8ùש‡¥2ßëMƯÓ «»î½éơÚª‚ +¼9Ï̉áÛ¥ˆ]1½Ăß»ûăˆŸ¶ÓañÚư§‡™‰kß [ïSơÄßÚ’ËÖ¼ÆÔá Û³§±¿Ùá‹ÇĂ߈ăˆŸ»Ø¹ÚÿÚÛˆ‘Óñ”ÏÅƯÚµØưÀăˆŸÛÄÓ‡Œ·§D «‡“ÍjªÚÏÄö™‰kß [ïS‰Á™‹«‡“Íj½ĂÿÚÏ̉ºƠ°»ăˆŸ¯¾½«·3uU±»ăˆŸ;ÑØíơ߈ÚÀ¹È‹Ü±»ƒÖôê ¼ ¸) ›¹ÙÚ¿‰ÓºÛ«‚ ½9ƠÄÓƒˆëӓƽô±»Ù½‡Çÿ¯¶•Ưɶ™‰kß [ïSÎű̉ÑÓüÀׯơÔ¬¾ʾ̃ÄØ¯qÿ§£ä¯ÈÇÖÆâÚª‚ +¼9­È¿º«ÚÎÔ«‡“ÍjóÄí¾߈±»›¾ĂƠÁÚƠºm¾©Ç„ö€ºô9¥‡߈©ÓÅ/ûÓăˆŸ;ăˆŸ;€%˜êèäƒvщ±»“ºù×ùê·Ó ¥0«ÔÏŽmªÚ¡È߈¶ÜăàÖÆ4ăơÁƯ°»щƠÚ½€Û«‚ ½9¡Ô­°ËÖå×ÍB«¿»³Ø‰ÛÏÄ™‡ß¢Ô·¼Í7߈ëöèôT•ƠÛ«‚ ½9µØÙÚ·ÚËÉ9½ƒ¡ÈÙ׿º̃ˆåÁߌѦÓÅ­éëă«³Û«‚ ½9á %½ƒ¾‘·‡‘×8çƒvÿ¯¶ÍĂù×›¾ơÔYÅÓơÔëöÙ×Ǻ‡¡Ôù×ăÇíëÚ³Ơ±»ƒvϼ纮ӅƠÙŒë*«Û«‚ ½9ăˆŸ;Ở°»ׯôá̉̉ºÍÄß»ûüĂÀ̉æÇÙÚ“ºñÔóÄרÏÔß»ûÿ¯¶§Ôéêï³2±»±»ăêơê·‡‘×8燌߈½ÊƠƒƯ߈âÁ«Óí—G‡ÛºÅơèÅÛê°¿«‡“Íj×܃Ø9¥‡óăÁÛ«‚ ½9ù×ƠÅÍĂ»~»yơèųÈÛ«‚ ½9Û«‚ ½9ù×½€ơÔ˜‡ˆɱ߈·ÅƒˆëÚ•ÖÛ«‚ ½9÷‡ôÏÔÓÅÛºÛº́Ø÷$Û«‚ ½9ßƯâˆ;¾…ºÁ×á=ÏÔđÓÛ×äô £Çù×ï»·‡‘×8çå̉ ÓØ—ÓÏÔ±»Ó½÷ÚÛ«‚ ½9©¼›¶é€ÄÛ×°»ù×ÏÅ÷ î»Á¼ËÓ¹£ÙÚûƠ÷Á…n±»ÚÛ×ưÀ°»‹Ó£äñ~æ̉ößăˆŸÓÓöÁÆ…ÂÓØ©¼Ú×ñÚ§ô±»©Ø¡È߈™‰kß [ïSûÙרûº˜‡ Û«‚ ½9˜‡ÑØÏŹÚù×߈ÏÅ«»Ë̉ƯÓ ƒ½ƒvÛÿ#߈ß»û¡Ôƒà߈×¾ívö©ƠơÔívƯjơêÑӋDZ»Û«‚ ½9Û«‚ ½9™Ạ́¶‰íá=©È·‡‘×8çơèÅăàƠÁư“·§D ‹½«‡“Íj«‡“Íj¦Ø¹Óºív¡½¿‰½™‰kß [ïSăˆŸ³Â™Óù׬ÖĂÙ߈“Æ÷ˆ­vö‡ÛÑÅ¡ÈÑ£§ÓgñéºƯ‰ËÉ9Ÿ}¡ÔăˆŸ;›·Ôö±»½€ÑÓ“ºå̉ »Ồ!¬H!¹Úô껽½Û«‚ ½9‘÷«Ôöº¹ÚÁ̉‡ÇơèÅ©‡¥2ßëMè¾ăº‘Ʊ»çÚ·Ôêö¾ç'ëƠUÓÅ·ÜÀ¼›¡»Ư‚ «ÔƠưÀ±»́v!ÙÚéÓ»ôˆÎˆˆµØ§È÷Ú‹ÜùסÖưÀ˜ÔíÇ÷ÙÅÓÑÓgß»û™‰kß [ïS÷‡ưÀ₫·ÅëäÙ×Ưß»û“ÆưÀ…øËÉ9‹ÈÑÄëÛ«‚ ½9Û«‚ ½9߈¹ÚŽ“Ơ±»¡ÁÏÔ«»ĂĂ ›­±àéMߡȿô4å̉ Ôùꃽ«‡“Íj³È£Ø߈ÏÔÙܪ¶2tTY±»›Ú­Đ›¾ɇ¿ºëö›¹‡Ç§ôÇ÷íÓÍƠ›ÚÚª‚ +¼9¡Ôù×¼ôñÚáễˆÛ«‚ ½9ÅÅÓ«‡“ÍjåƯ¹ÚưÀ§ÆÂÙµØ½×¾ÓØ«‡“Íj߈ƠX‚v…¹Ú›äëöăˆŸ;kƠXƠÿ¹ÚÓÆµØͺ߈°Ô‹Ü™‰kß [ïS¹à‡§ºÓØÇÖÅÓÁƯ‹Ç½|´›¾éºƒˆÍÓï³2ÿÍ«»á±¿ÏÔº¢ÈA¿ßơê»ß»ûÁ̉÷ˆ½€ùׇ«Ñ³Èź°½߈ºưÁɇ߈߈ƒØÿ×߈éºÓØ¿‰ÁÓº9¥‡Óà­Ä釪ڟ}ÏÔÑÄëÓØăˆŸ;kùº±»¡Ô¹óå̉ åØĂÙƒÖ½Øô¿»÷Á¡ÁơÄçÇÜÓ + +Û«‚ ½9›¶éÓÆ™Á÷Á£ ‚›¾›¾Äô«‡“ÍjÏ̉«‡“Íj÷¼¡Ôö½‰ÆơÔív›¾±»ûÀ‡Œï½½Ü½ÈÍÓ°»¹ÄÛ«‚ ½98 ¤‡ ׳Ú߈™‡ÙƠ߈Ù‡Ï9…¿ôƒ½…»(‹Ü±¿ëÓƒÚÛ«‚ ½9·ÅÀ¹Ú±ƒØ½å̉ ·Ô¹ÚÛ«‚ ½9éÓÅÓÏÅăÇíåÁơꙇ麭Ö̀Ơ È™‡ơÔß»ûéêëö©ÜĂÖÁăÛºăˆŸ;©‡¥2ßëMéºù×ăˆŸ;ËÉ9«ÔÙÅëíê»Ø߈Ǽè³Æ߈Æ_½‡ÚºßÏ›·ÔƯºÿ¯¶÷Á»Ø­Ä¶¸åƠÛ«‚ ½9ŸÈŸÛăˆŸÑÄëơêÓÅ¿ÙíÆ«ºéºö£ÇçÁ‹Ü¯×ă‘ôꎽĂĂÈ­ØרăˆŸ“ÆÙÚƒvßÄÙÛÔ˱êÓ«»Ó·ˆ³ôÇĂ߈›¾›ÚùדƠ«‡“Íj¼™‰kß [ïSﻘ‰ j ̃    Z îS ‡xíÆÁ½ºàôe÷Á«Ôí‡·Ó ¥0ơêÉ̉µ!ăˆŸ;Û«‚ ½9ÿ$ăˆŸöÓÔ‚¾  Ç̉¿è¡¹ÚÜ9¥‡°Ôœ¿߈9¥‡¥ÇÛ«‚ ½9½ôÛÜËÉ9ù×±»™‰kß [ïSÅØ×ƠÔ­¾§àÑÄ밻ÓÈ̃ç¯×¸Ú«‡“Íjɹœ·̉ ¤0Û«‚ ½9ôñ»¥Ö›¹—¶̃ˆÍÓ©‡¥2ßëM™‹Û«‚ ½9ơêù×ù×Û«‚ ½9ÇÖö…—¶ëö÷Á›¾«‡“Íj±»߈ưÀ‡ŒưÀ›¾›Ûëö÷ˆÿÆ™‰kß [ïSŒæ¹Ú±¿5ù×™‡ĂÓĂĂ‹Ç¡ÔÛ«‚ ½9̀ñ»§‡Ơ™Ô™‰kß [ïSÏẠ̊‡ûƠ߈«ÔăˆŸ;ưÀ¨¾·‡‘×8çËÖô¾÷$óDz“Ơ9¥‡ÅØ·ÔÿÚg…ô«Ôß»ûÿdzƒÔÙ½“Æív½€ÏÔ¡ÛăˆŸ¤Ø½™Ó™Ă×ÂûÙ‚×̃ĂºăˆŸ°Y“¹ƯNăêÙÜÏÅù×ưÀÑÄë‰̣¹¹ƯÓ ‘÷›Ûß„ơê°½ÚÄ̉á ¶ĂÈ¡ƯívÛ«‚ ½9á Ù׫‡“ÍjÔX߈«‡“Íjçô‹îèÔöéÓ±¿Ù½«‡“Íj×öÑĂ¿ô·Üíêï½ĂÙß»û¿‰±»ù׉۫÷¿ØÙăơ·Ø©‡¥2ßëM˜‹Ÿ}Ï̉»ĂÅØƒØ·ØùơŽ¿Ø÷‡ĂÙÛ«‚ ½9™‡÷Ú½Ă™‰kß [ïS™‰kß [ïS›¡«)ÍË)éÛ9¥¥‰ÍL…ƒØ÷Á©ˆ”ÖƠÚÊÙܹÚÏÅ«»ĂÓÔëö™ëéå§ÓăˆŸ;½ăˆŸ;©µ̣¾¿‰™‡£ôÏÔ‡™ô»Ø²ÂߌÛ,ÏÔ§Ô¼ôưÀÅíưÀ¡Áƒ́«‡“Íjô߈óÂáêßڽ߻ûăˆŸ;¥Æ¥ˆ]1”¡Çưºç®ÂÙƠXù‡™‰kß [ïSÅÄß«›¾¿ºרÛ«‚ ½9Ù½ÑÓ«»å»ÙÅëÀĂÿÚ¹Ú¡Á»îưÀÏÔׯ¯È‘Æ߈éÔôĂºÏ̉»Øöù×±¿ëööÁÁµÏÔ¦Ơ§Ô¡ÛÅÔ™‰kß [ïSå²Ù½ƒv«‡“Íj“Ơïı»ÏÔĂ+ߌÛ,«dù×Ó̉­¾¼Ø¥<£ä4ÿ¯¶ƒv¿ßÛ×…Ûß»ûÏŹÚÅôßÖ¥¾ëÓø×¹Ú™Ó̉Ó߈ÏĽôăơåƠ”ÈúÙ½«‡“Íj·ÔÆĂÏÅóǃ¾‘§ÔËÓÎÅăˆŸ;ŸÅÏÅŸÖçô©ºôăÁ°ÁÍÓÏ߈ÍË)éÛ9¥ó¶ơÄơÔÁ½µØÁ̉›¡̃ˆŽ±¿±»¾Ù½ăˆŸ;¹£ÙÚ°»‹Ç†Œ¡Ơµ¹ÚÁ÷Á°»¬Ö™ÁŸ}ÀĂó#ăˆŸ;߈ÁĂÉ̉ÁĂº›v¿‰ç®ÏÅ߈¶¼̀7öƠ·Å‡“±»½Øƒv‚×åÁ™º­Ä»½ºy9¥‡̃ˆ³‹ÇÖÆÓ¼‹Èơꙉkß [ïS±»«»£äÛ½ßÅÄ߈ĐĂŸÖëÓƒ™ÙËÉ9ăà·Ôö߈½³ ù×̃ˆâˆ;‡½ôÏÚ¾áêͪ“ÈÛ«‚ ½9™ÔÙ½ %8¤‡ÑƯµØÛ«‚ ½9å̉ ­¿½Ă*ƒv£Øá=ÙÚ߈‡ÇßÁ¸à?¬Ä»ëöưÀù׃ַ‡‘×8çÁ½â½ƒv±»̀Ê)èÛ8¤ÓÏÔ±Ôù×êö8¤‡Ö ±¿ăˆŸ;káÁ¾̃ÄØÏÔÏÔ±»ăˆŸ;ơê‹Ç Çëö»Å«Ô™‰kß [ïS“¹ƯNơêư“·§D ƒvù×Ù×—ˆº›‡™Á¾»ÑÓưÀ«‡“Íjñ¹™ Ï̉“ƃvù×ϙӫ‡“ÍjÏÔ±ô¹ÚÎÅă»G½¹Ó¾¤ˆ\0ñÚÛÀ¿Ëç™Á߈µ.¥ÙóÂù¿ÙÓ“Ơ÷ˆµØ™‰kß [ïS¥Óô¹Ú¿»î²2ÅÄÛÜÚª‚ +¼9ôĂ©Ó̀ÓưÀïÅ™‡ÅÔ½ôù×Û«‚ ½9‚ƒvçÚĂÙ­ÄÙר¼ôâæÚëöÜ·‹í—GĐÄêƒØј³d—¶Ơ³Á½ơêóñוǻ¹Ú™‰kß [ïSêÓÛ€ăˆŸ;‹Ç½³‹·Ô ´† ™‰kß [ïSƒv¡ÔØ×÷ÁëöĂẲ¿ë›ÚùשƠÏ̉Ôơ “ƠÍË)éÛ9¥…nçÚ«×¶sså»ÇÖ¸Ú©ÓƠXÑÓ¯G‹øÛ×߈Ѧî²2/µØăˆŸ;ăˆŸơèÅ®Gøÿ‡­Ä9¥‡¢ *«‡“Íj匿NÏŧ¹ÙŒë*««ÔØ×ăÄÚº“Ÿæß»û™‰kß [ïS¥Ø߈Ú½ÏÄÿÚÏÅκñ,ª‡’̀jÆưÀÛ«‚ ½9±»±»ù×·ÜÛ«‚ ½9Ûº™ëéåÏ̉ÿ¼ͼ½€µØ±»ƒvÅn½°½™Ó·‹¿‰“Èö½±»ăˆŸ;ñÆăˆŸ°»¯È¸ÚµØÛ«‚ ½9ưÀăÚ½ăˆŸÙ«‡“ÍjßÛ(ƒ½¹ÚËƠ•{“¹ƯN÷ˆ߈‘ƃvù×ĐÓçºíæĂÙÈÙÚăˆŸ;ÿÚ£X‡¿́µØóÄÏÅÆØ¶ÅƒˆûÓĂ™ëéå¯G‹øưÀù×·œå̀ăˆŸ;‹éêêö߈ Ơ +÷Áºyîÿ¯¶߈ñÓʵ†Û«‚ ½9±§Ơ9¥‡‹Çå̉ ¨¼ù×ÇÖÏÅ¥ˆ]1±¿Ǽ±»÷ÁÛꥈ]1̃ˆøêÁ̉»»Ø«Ô¹ÚßÅÛ±»—ˆÛÀ±»©¼ơú›ïÙŒë*«™‰kß [ïSßù¿Ô¿‰½Íùê³Æº“ÈÇÖÛº¼€«‡“Íj8¤‡×‚Àv½±»³(Ù½«»«·3uUâáÁƒˆø×¦¹»ô÷å5Ó™‡“ư»‘ ¿‰ä̉ÏÔŽóÂÛ«‚ ½9«‡“ÍjÙ½ù×½ÓÅĂÈÛÄӽر½߈ÏĬÖß¹©Ó«‡“ÍjƒvăˆŸ‘±ưÀ¸¾Ÿ}ÿ×ùבǶôɱËƠáêÓ¼÷ÙĂ¼ÏÔÍĂÙ½¹`—ˆ«÷á=ăˆŸ;Ù½÷Ù§ÀÓÔĂÙ›¾°»ÏÅ­Ö»ô¡Ûƒˆ›¾±»ëöăˆŸ8¤‡×Ó¼³ºóÛ«‚ ½9Û«‚ ½9Û«‚ ½9™‰kß [ïSÙ¹ÚWëÓÁĂ˜‰j̃ZîS›¾Û×ÿ¹‡“߈·×‡óÇ¡ÁßáÛלÁưÀÏÔíÖ̉ Ûº«ÔÅôưÀëÚ¯rÏÅĂ´’ƨØÓŸÚ߈ͼ¡Ô«‡“Íjçڭر¿̣¶©ßƒv9¥‡ÙÚëö†ºÙ§ÓăˆŸ³·‡‘×8ç¾ô§ÔÑÓƒÏÅƠơêщÛ«‚ ½9ÑÄë¶ĂÈ߈ׯº¾¨¾·Ỗôñƹ£Ç™‰kß߈ÑÄë§ÔăˆŸ;kÛ«‚ ½9«‡“Íjú̉ơèÅëÚ§Ó«âǺ•­԰»çÚ±»«‡“Íjé‰ñ5ñ·‰Û·‡‘×8盡ù×±)™‰kß [ïS·Ô±»ÁƯ£»̀Ê)èÛ8¤ßÄÙöº¿¹ăˆŸ;‰¾›¾…à®ÍĂÅÔôê ߈á9“ƠÿÂÄÓÛ«‚ ½9đÁ½Ă»Ă«‡“ÍjºëöÛ×ׯÛ«‚ ½9ƒĂăˆŸÙ½‹Ü±½«Ô‚vĂÙ­ÖưÀăˆŸ;Œ¿ÿÚÿÚ½Ù½™‰kß [ïS¥Ç™Ó«ÔñÚ̀ÇÏÔ™ÓËÀ߈÷ÚÉ»÷Á™Óá¼½ׯóÅ–ƠÔ±ëØ“ÂÓÙ××¾½ôù×9¥‡ßÄÙ³Èù×™‰kß [ïSù×߈÷ÁÁ̉¹½½ÏÔăĹڃv×Úù׫‡“Íj¼ÏÔô꯼ù×Û«‚ ½9ĂĂ ›­±àéM½Ôùט‡ ö˜‡˜ÓéÓívØËÉ9¹Úç½ï³2ưĂơÔ±»•Çà ƒvăˆŸ‡ơÔÁ½›Âư‡±ù1Ø×ºy¡»ù×±»ÛºĂĂ ›­±àéM‚vÓºÛ«‚ ½9«ÔÅØå¼ Ö¾½€ÏŠȉyûëö9¥‡™‰kß [ïS‡Û¡%ù×ùëÓ¾ÑÔÓ5“gesÁÅÏÔƒˆ™‰kß [ïSåºÏÔỞ›ÚÎÔ©‡¥2ßëM½É̉Ăè¡Á̃ÄØ¾Û«‚ ½9™‰kß [ïSƯÚºŸÜ¿ôƠóĂôÔ©‡¥2ßëMÿ¯¶ñÖéºĂÈ·‡‘×8ç‘-ï½ÙÿµØíê£ÇÛ«‚ ½9™‡¶  ưÀÏÅ߈±»˜êèä¨ÓàÀơêùxÙƠ¡Ơ©ÀóïÿÛƯË¿ơÔ8¤‡ỞĂµØ‹Ü«Ô—»ÍË)éÛ9¥ù×Û«‚ ½9½₫®¶¹ó™Đ½źñĂáÛ«‡“Íjé꛾ÇÓăˆŸ;ÖÆù«È·‡‘×8çgÓ£Ø÷‡ëÔ…Â¹ÚØöÂÙÅØÓ¼¹ÚÙÚâà¹ÚÙÚ›¾ñÓ±»Û£Ô»ĂÙÜơĂ÷‡ª‡’̀jÑ·ï½›¶éµØÉ̉¹ÚëöåĂăˆŸ;„Öƒv½¾‡»ÂăˆŸ;Ûºƒv©¼Ÿ}ơêô™‰kß [ïSÁ½¸ÚÏű»öÖuÛ«‚ ½9±½™‰kß [ïSö¾™‰kß [ïSó÷ùơ¾…à¿Ø̀Ê)èÛ8¤ÏÔ߈‘®» ׇ‡ư2ÅØ©¼¤½lÛ«‚ ½9»ô¸Ú÷Á»ơÅß»ûÛ«‚ ½9€Ù×߈éêÔù‰·¦D ­ÂÏ̉ËÖÛëööĂº±»íê߈³¹·‡‘×8çĂÙ¹Ú®GøÛÄÓ§]ơĂĂ©¼ËÓ¾¾Ù½Úª‚ +¼9©¼Ơ¼Ù½¾¹xµØ·Ô±»₫®¶Ù×Å”µØǽßÏ“Ơ÷ÁÎÔùÜ·ÔùשƠÑÓĂÙ‰!ÿ«d߈ùש‡¥2ßëMçôĂÎÙŒë*«ÑÓÛ×™ÁÇÓ½å̉ Ù̉ʹÛ«‚ ½9‘¾¼€ëöÙ½ÿ¯¶Ơ‚؃v¾÷ÁñÚ ËûÓ̉ñÖ•÷ÑÄëƯơÓØøæ9¥‡¿ôßÁÁƯ›¹Úª‚ +¼9â»ù×›¹ºƒëööÎÔ€º‡Œ¡ñÅØÏÔùׯ‹Óóg«»µØÛǹڣ0›¹Û™™‰kß [ïSÚª‚ +¼9ñíÈ™‰kß [ïSëöùê¹Ú¡ÔƯÓ ؽéÓªÚëöÍÓ‡ÛĂÙƠÙ¼ÙŒë*«ϼÿ™9¥‡«»¬ÈÆëÚ›¾êö„ØăˆŸĂÙÅÓ•‚9¥‡©‡¥2ßëMÑÓœ‰¾I£Ç±½ûÓÓÅ•‹HùêƠå̉ ªÚưÀ©Ó¿‰₫ô߈°» ƼºßÁ½ÏÄôÛÚ߈ÂơÄ·‡‘×8çÏÄ›¾Îáó™‰kß [ïSï½½‡Œ½…€­:«‡“ÍjÁ̃¿½±»ăˆŸ;k»Á¯¾º÷Ô‚vÛÀ‹ÜÛ«‚ ½9ñÓµØä‰¼ôö™‰kß [ïSơÔơê·‹Û«‚ ½9éơÏÔ°»¾ºù×öÓ‹Ü™‡Ơµ•ÿµØÿ¯¶³ ưÀ£ü¦¹"ÁÇǻØĂăÇí¥âĐæµ«‡“Íj©‡¥2ßëM™‡₫‡™‰kß [ïS½±»¨‡¤2€̃êL%9¥‡×î»ÏÔ¥ØÙÚ—»—¾™‰kß [ïSéê¹ÚĂĂ ›­±àéM«‡“Íj߈™‰kß [ïSÏÔ½¯È«‡“ÍjỬơÔơé8¤‡ß¿…ƠÁƯ·§D ƒvñÖ¿‰ơêÏÅÇỌ̈¶ÚÀÿÚăˆŸ™‰kß [ïS±»¹Úû«Ñ—‡§Ø°»»½ÏÔå̉ ½ơÔùê¹ó½ôщÁĂ“Æ•%¸à ߈ɱ«‡“Íjï½Ë÷¬Äº ‚vÿ×ÚÑÄë9¥‡×±»¡Ơ©¼΅¾Å߈źñÓ•Èû›¾ßÆÿÚ…ÂƯơ§Ô®Û9¥‡ưÀ̃ˆĂ¼ơïÁÛÛÄÓ›çÎÅëÔỞ™‰kß [ïSù×ùê¡Áñª¾™‰kß [ïS· ù‡×ÓœÜÔÚdzÛ÷ÁÛ«‚ ½9% È9¥‡½ưÀơØßÚÎ̉½€áÏÔؽ½µ†̀Ă­ˆ—Á“¹ƯNóÇô¦Æ9¥‡×óĂ¹Úß»ûÙ‡Ï9…‡Ç¡Ô«·3uU¹ÁỞ‹ÜÏÄơêÛº±Í¡È™‰kß [ïS™‰kß [ïS±»”ÁĂáƠ/ÏÔÙÚÍË)éÛ9¥ßÚß„µØÛ«‚ ½9ÙÚƯÚù®ù×ÛÄÓơÔ‹ÇăˆŸ;‹Ó‚vÛ«‚ ½99¥‡Ăùô¹ÚùêöäñÇ ÇႽëöÍË)éÛ9¥ÏÄ·‡‘×8ç×Ơ†7§jăˆŸÛ«‚ ½9ÍË)éÛ9¥—»«‡“Íj‡ºưÀƯÓ €¾¹ÚψÑÅ߈÷ÁùæùׇºÙ½ĂÙÇÖ½‹¼ưÀÙ½ÑÄëù‰¼€ívĂÙ¹ÚáÚ߈ĂºÙ½×ƠßÅưÀ匿N܃¾‘Ù™‰kß [ïS¯ÈÁ½ƠXáºăˆŸ;k¯È†Œ‘Æ™‰kß [ïS¯×Ù½ĂÙßχŒÂƠ­Ö‡±»áê©Çÿ×­Ä®¼«‡“ÍjœÚ ©ăơ÷Á­Ö¡ÔívĂĂûơĂ™‰kß [ïSƒ¾‘ä×Úª‚ +¼9©¾¯ƠëöÎÔ…ŒÛ«‚ ½9’Ç9¥‡×шºˆÇÏ8-¤‡-Ö“ÈívƒvßƯƒˆçôĂôĐĂÁ×ăˆŸ‹Û±»£0ÏžѶöæÚÁ̉ùׇ ÷Ú«‡“Íj¼Óºß„…ÚÁ½‘%щ¹Áº½¢ä̀ĂÏÔơèŃvăˆŸ;¥Ø±»«Ûëö̃ÎíêÍǽñ×ơ»×Û­ơê³z²µØÁ¹ß„·¼Í7Ø×ăˆŸ;k­ă»½¯G‹øƒṽÄØÓØÙ½ÓØÁ¼§Ôå̉ ¬€±¿ßÄÙ­ÖĂÙ™‰kß [ïS9¥‡ÏÔÿ¯¶åÁ¨¾ªÚ1…ÖÏÔÛ×߈°»¼ăˆŸăˆŸÏÔá å̉ Û×Ǻ­Ä«â‡Àă߈ÛÆÅÔçÚ¡Èù×ÿ¯¶¼Èµ†™‰kß [ïS¶‡º«‡“Íj́ÁéơÙ½›¾ù×ăˆŸ߈XÙÚ÷ÚÇÖơêÙƠé‰ñ5ñ·»߈ÿÚ߈ǻ۫‚ ½9³Ü—»­©Ø­¾ÛÄÓ¾»½¬‡ÙÚù׃ÖơÔÍË)éÛ9¥ƒˆív» Û«‚ ½9­ÖưÀù×éê¡»§Ơ߈ۺķԘ‰j̃ZîSÑÄẹ̈ƒ +­¾§ỐÁ—¶™‰kß [ïSÙ½ơÔƒÚ¹Ú§Ư­ÄäơÑÓƒv±»¹Ú÷Á©ØËƠÑÄë±»ùæÏÅÛºÑÓ«‡“Íj™‰kß [ïSÏÔĂÙ—¶ÏÔ›¶éăÔ»Ó¾ù¿™ÔÛ«‚ ½9áØ¥Ø¿½€êÚ©ÏÔ…ÛÏÅͼù×ᘉj̃ZîS­áÛÁƯù×…Öͫԟ±¿±¿ív©¼ù×ù×±»·‡‘×8ç¿»«‡“ÍjíÖ³%ù×»ÏÔ›¾ù×£Çù×ë§ëö˜Ă³ó#¯Û«Ô‹ÈÛ«‚ ½9™‰kß [ïS¿ºÛ«‚ ½9‹È™ÁÙÚ¥ÆÛ«‚ ½9ÑÓÿÚù×ơY™Á‡ŒưÀçÚíÆÑÓăˆŸ;ăˆŸ;k±»÷å5Óû(±»±¿«Ú±»9¥‡¡Ù±»Ï̉ùê•ܱ»óÂívăˆŸ;…óÇÚÀÁƯÓØí=Ïı»½Å–ùƒˆ«́¶çƠÇĂ«‡“ÍjÆÖåô“Æëö«»—¶ÏÅ›¾ăˆŸ;£Ç«‡“ÍjѾËÉ9$Ưº™Ó™ôÁ̉ùơ¿‰«ÚÙ½ˆ;ñÛ×ơƯÓ ±ÔĐÓ¸ÚƒvăˆŸ·ä´Ø¿‰ÑÓơÔ°»ÙÚØ™Á«·3uUÿ§³Èá=–ÓÙ½ăøÏÔ߈éºăơÛ«‚ ½9µóÁY©ÿ«ä›¾ơê£!ƒvଫÔĂôóÂö₫®¶ƒv§‡Û×ÂĂ›Ú߈ĂèÁĂ©Ơ±»¡ÁÉ̉•ÇĂƠñÓÏÔưÀáêØ×çǾº‡Œ¡Ô‡ƠXµØăˆŸ;kƒˆ¶©ÓßÁ½ÙYƒöÁù×·º·Åù׃v‰Ô™Ă±÷Á‹ÓûƠ÷Á›·Ô÷Á«ÓƠÓÆ«‡“Íj‹Üăà9¥‡‡ŒÂÙË ßˆ߈½ÙÚÇÖ߈ÅØ‰ßĂàÛ«‚ ½9 ¬°àèM¯¼ªÓ¹Úÿ¯¶åĂ·ÔׯÚÏ̉›¾½ÊÑͫԃˆÿ¯¶—̣½çÚ›Ú¼ơêñÚăˆŸÅáỔX¡ÔÓ¾Öô ï»Ơ±ơꓽÙÚ£Ưÿ¯¶Æ‡ëöÍBÁƯ›¾ÿ׫‡“ÍjÙ½Û«‚ ½9«Ô™‰kß [ïṢƒv߈ù×öơÙ½½¤ÖƠËÓ—¶Á°»ñÓºÔăˆŸ;«â«dÏžƒˆÙ½ó|„ø¥ˆ]1…ô©Ó½Ăÿ¯¶à&¹Ú̉Åéú…»±»ùבÔÀ¹Á‡é/×:¯È°»©‡¥2ßëM߈ÿ¯¶å̉ Ù×Úª‚ +¼9ƠXÏÔÏÅͺ§ÈÓơêæ̉ư“G½¹̀Ó½€ÁƯ±»ăˆŸÅÔưÀÏÔù×ôÔ½™‰kß [ïSëöÿÚ™‰kß [ïS£ä½ËLJÅÏÔ‰y±ÏÔÏÔ›¾øæÑç·Ó ¥0©Ơ¹Ú›¾›¾±ØŸÓ°»±¿ä̉BBà­v­ÔÎ|•Ơ§ô߈߈ä̉Ù½ÏÔù×™ëé屇ÅÔ©Ơ±»ơ‡»ØÙ½«»àöÅnƒˆÅÓƠXĐÄêÛ«‚ ½9ß~ëöăơ±»±»ơ$—»«ÚÁĂô—¾©‡¥2ßëM½°»á굆£äÛ«‚ ½9Ơºm±¿5óôăˆŸ;ưÀºn½Èù×ÛăˆŸ;€ÓăˆŸ;k›·Ô™‰kß [ïSÙÚÀÚ +ưÀŸÅ›¾ËÉ9™‰kß [ïSơê­ÔÑÅÑD9¥‡ÑÄëµæéÓĂÓå—ß»ûÙÚ¾Ùà‡Úù¿Ởơꙉkß [ïSÅ©¼˜ôỞÓÅ ËûÁ½ù×Ûº£äÓ×Ă¡È« ©ƒ»5¡Ô†Ç±»ÿÂưÀ”% ÎŃ·ÅăàÏßăˆŸ;këö±»ăˆŸô‡₫®¶ÏÔÏăà‰ÁÑÓöÑÓçÚÿ¼¹Ú¥ß—¶¥Û™‰kß [ïS©ÓçÚÙÚ·Âù×öÁ ·¼Í79¥‡Û«‚ ½9ÿÚ–ˆ#9¥‡Ù½Å»Ä×ø×ĂÙæƠÅØ¥ˆ]1öÙ½£XǼƒÖùץؿº“È÷ˆơô˹߈½ÜÈÙ™Ô߈ÿ׃ÔË%ÈÙÜÇÖĂÙƠÁÚÙŒë*«߈¯¼ƒv·ÅăˆŸÀ‡€è/Ö:±»µØÛסÁ•îƯÓ Ơ›¾ĐÓœÁ½¯¾ºĂà߈Û«‚ ½9Ơ¿ß™Áá ­ÄÏÔ™Ø9¥‡Åر»Û«‚ ½9Ù½ăˆŸÙÚöÀ½ÏÄׯµÅÀƯëö߈ƯÓ ơØ­¾‹.ÿ§Û×½ù×߈½̀½¥Ø–½Ùט‰j̃ZîSÏÅ™ëéå§ôêö·Üÿڣء»ÁĂăˆŸóÂơêÓÁÙŒë*«Ù½­¾“Ơ·ÅÓØïi½Á«‡“ÍjôŸÅÏÔ˜‰j̃ZîS‰Û˿۫‚ ½9«·3uU½ăˆŸ;ñÓÏÔ½ñÖíÏÄưÀ‹ÓăˆŸ“ÆÛ«‚ ½99¥‡á ™ëéåƯÓ ‰¿Iăê‘Ô•ÚăˆŸ;˜Èöàê¼ÁÚÙ×÷Á‹Ùăà¾Ï̉߈¨¼ ¡Á߈éô˜‰j̃ZîS·Ó ¥0ÑÄ뫇“ÍjÙÚÍË)éÛ9¥¡ÈƒÖÚÀù×·̃ÑÅ߈ؽăˆŸ™Á߈Ó²™‰kß [ïSéÔÍË)éÛ9¥ívë×›ÚÑÓÏÅ…öÎÅ÷ÁéÓ°»£Ø½±»±»§ØùêÛ×ÏÔ«ÔÛ«‚ ½9ơÚÏÅÙÚ¯ÓĂ¼©ÇăˆŸÿ‡³ Ăº·ÔÑÓƠ±»±»û™‰kß [ïSÏ̉·#ä×Û«‚ ½9ƒÖÿÚƠÏÍÿ«‡“Íj½‡߈ÓØô˜‰j̃ZîSÛ«‚ ½98¤‡щ•½•̃‹Üôê щ߈ÊÇÇÖăˆŸ;‘gÓÁ®é¯®ÈƒÚ—¶ŸÄ°»߈ƒ½‹Ü³r£ä±»ÑÓÂÙ¡ÔÙÚÙ½¹Ú·Å£‰µ†¯Û¿ÅĂº«‡“Íj£ÓÅØÍË)éÛ9¥߈ʹÛ×™ëé墨ăơ‘ÔÙ½—¶›¾ơĂ¥Æ·Ôƒvơê‹È¯Û¾ëöÓÁăÁ߈Ù½ÏÔµ|ĂÙÚ×›Úô߈¥Ø»©Ú‡Ç‡Œ«‡“Íj¯È߈×Ó½ƒv÷Á߈ù×Ï÷¢ä©Ó߈‡“ù×ß»ûëöÛºƠºmăˆŸ; ½ºñÖùêÿ›vñÄù×°»ä̉½€±½Úª‚ +¼9ÁƯ¡Ơ½ùơăˆŸôÔ߈ºÁ«‡“Íjëö³™‡‡·‡‘×8ç»̉ÎÛº¿‰Û«‚ ½9›¶éÔ½¤ˆ\0óÔ߈Ăټ붺™Ô³åĂÎÔ¢ä“Èï½Ç—Ó™ëéåÛ«‚ ½9¡Ô‹Üß»ûßÄÙ™‡ÑÓ£ƯƠÁÅÙ½ÿ¯¶߈ÇÖ̃ˆ›¶éÅӣأș‰kß [ïS¥Û™ëéåÛ×éôÏÔƒöÁ™‰kß [ïS ™‡¹ÁźỞá¼ñÓÍ­HÛ«‚ ½9éºßÁù׫»½́ Û«‚ ½9Ÿơ߈øơÓºëö9¥‡×œÜ ôĂ«‡“Íj™‰kß [ïSê$ù×¼ÀÔ­ÄëƠU¬Ö™ÓÙ×ëöÏÔå̉ §Ó›¾ƒ†“™‰kß [ïSÂËƠ…ØÏ̉ïƠøæÛדƠÂÙĂÙÅnçÚáêăˆŸ;kï½±»ưÀµ.¥ÙöØ-ùê¶  ïÚ܈G`؃¾‘ß»ûÏŃ֧ƃˆÏÅÏůƃvƠñÚ³Ü匿Nçô•—»ưÀ“ƠÇ»ŸèăƠ®ÓÁƯ₫9¥‡ÑÓÔ‘¼¿‰̣ÇơÄ·ÅÛÇ€Ơ½Ô¹ÚëöƠẳ“ß™‰kß [ïS9¥‡Û×÷Á߈ßÄÙÚª‚ +¼9ăˆŸµ«‡“Íjƒv±»Ó̉™‰kß [ïS8¤‡‹Ç₫®¶˜ôÁÎæÚ½ÜÛ«‚ ½9§Ô±»µêÇĂÙ̉¬‡«‡“ÍjŸĂÜ¿‰Ù½ÛºÅàÏÔÛ«‚ ½9×ƠÖÆ‡߈½€›Úơê¾ß˜ÓÆØ߈ Ëû±»ÛÄÓÏÄ@«‡“Íjƒ¾‘ù׫‡“Íj·‡‘×8ç¹Áù×ÏÔ©ÀÁ€߈¹Úù×Ï̉ïƠ·̣Û×ÓŲÈÑÄë¡ÔÏÅÏÅÁƯ¸Ú¹ÚÛÇ߈ëöëöëö9¥‡«‡“Íj³öó‘̃÷Áÿ¼ăˆŸ;cvù××ĂÏÅÍË)éÛ9¥½Ă¼Ô™‡ĐĂ‘±Ư„½ÔÿÄùׇ™‰kß [ïSĂ¹í̃Y£Çƒ¾‘“ƠƯÓ ù×ÜÓ̉µØÙÚ™‰kß [ïS“º·ÔĂÿÚƒ߈çôÁ‡é/×:ưÉø×ëᇌÄÓÁ̉áƯÙשÇù×ăˆŸñÙưÀ³à™‰kß [ïS¤Û•ŒỞ±”©&½Û×ùëỞÛÀ»‹ÑÓ­èÛ«‚ ½9ßƯµØơèÅßÄÙ¿‰¡ÛỞƒщÙÚ߈™ơ«‡“Íj™ÔƠ*8¤‡µØ§ØƠX±»ÓÅ™‰kß [ïS±ëØÏÔ«»·Æ™‰kß [ïSÅơêøæù׺ÎÔˆÂÙƯ±»§ÓщàăˆŸ;k™‰kß [ïS«·3uU›·Ô³Û«‚ ½9ăˆŸ;ß„ƒØ¥ˆ]1é‰ñ5ñ·ëöƠXÛ«‚ ½9Í[Ƽ‰Ô©‡¥2ßëMóÇÛ«‚ ½9ñÆ»½Ăè½Æ̉ëö¡ÁóÇăáµÇÖơêƯÓ ™ÓĂÙ•îÏÔơèÅ™‡í‡‡¹ßÁÚª‚ +¼9ÙÚ‡$Îų؈ÁÓƠÏÔŸ”¾Iª‡’̀j©‡¥2ßëMï½óÔ™ëéåÅàËÓ…»°»ăˆŸ;ƒvûÓ߈ÍË)éÛ9¥·‡‘×8çß»ûÛש‡¥2ßëM·Ô½‚¾ăˆŸơÔ߈Ù½×$Ï©·̣ñÖøê”½í꫇“Íj›¾«‡“ÍjÁ½÷ˆ–ØÏ̉ă»ÁƯÏÔ¯¾Ÿ\ù×ÔÖÛÆÜĂÙ›¶éø×Ï•½€´$ƒv³ÈÛ«‚ ½9Ở“Ơ«»ÁĂÏÅÓÛ«‚ ½9ê$±¿Û«‚ ½9ÛºÓϼ«äù×½€‹Üø×¹Ú˜‰j̃ZîSÏÔƒˆ›¾½ƒ½ÁƯÊÓêöåÁщ–¶đÓÅÔ«Ó§‡ĐÓ™‡âˆ:ĂyƒˆÚª‚ +¼9‡̃ĂÙ¯‰¯0ĂÙ£Øư§‡±»ïÄÙÚa9¥‡˜ôñÚË֗ؼ¨Œ ™‡¡Áÿ¯¶§ÔÀ¹¿ßù×Ïź¹Áÿ¯¶ÙÜ߈øơÏỘÂéJé‰Ó5“gesÁÅÚª‚ +¼9ÓÆÏŋӷÔ߈ö›¾›¶é¡Ûư“Ï̉Ùצº§£éơ©%ÍË)éÛ9¥.½€µa‡µØ¡È‘ÖăˆŸ;ßÖ̀ׯºúÓ©Ç‹ë­Ö½ƠÛº¾‹ÇÛºщíÅ£Ø߈ùêÁë³”¤Ă±»߈ËÛçÚ±»ăˆŸ;å̉ ¿ÂÙ€¾ăÁÏÅϺ¼ØÅØÍÓ«‡“Íj‡ÛÏÅđÖö¨¾ŸÈ­Ä½¹)ÿÚ«‡“ÍjÓ£äï»×ӵث·3uUù×öĂÙù×÷‡±»ï±¿íƱ»«ÔÁĂÿ¯¶«‡“Íj̃ˆÅÓ¿́µØ¢äö÷ÁơÍÄÍË)éÛ9¥§º³ÜơèÅÂ%Ï̉ÂÙûÓÇ"ƒ¾‘ÿ¯¶ƒµÈăˆŸÑÄë“ȃˆµ‰ù¾ƯÜË̉å̉ ÷Á¡ÁÍË)éÛ9¥æÚ“z˜ƠºÅ»ăˆŸÿÚ߈ùתºëçÚƠܹÚâàÛ×ÁÏÔăÚ‹Û·‡‘×8çؽÁÛÚª‚ +¼9ăÇíɹŸÅ¥ˆ]1߈ÂĂù‰ƯÓ Û¯ÈơÔ߈óÓ₫Ú±»ÍÓ±»ÿÚóÇ—¶ăàßÁ©‡¥2ßëMÈơ‡ÓØ·Ôù×Ë%Ó߈“¹ƯNăê9¥‡×¿‰Á̉̀„ƠëöƯº©½€—»ÏԫԵأث‡“Íj³ ÏÅ«»߈™‡‡ŒºÈÁÛë½á=ÍÓ½€ëöº›¾Û«‚ ½9Ë¿ăˆŸ;ăˆŸ;Ă¿º8¤‡Û«‚ ½9ƠÑÓ£Çÿ¯¶¹Ú¿Øå‡ÿÚơÔ½€ëÔû–ؾ߈“¹ƯNưÀăˆŸ;Û×¥„ß»ûêÓù׫‡“Íjđ¾ ù×ÁÏÔªÔ·Ô«‡“ÍjñÖ÷Ôƒˆ™ÔóÔº…µ—¶Üá=¢È¾»½«·3uU∃­€™‡·‡‘×8ç ÔÏÅÇÖơêÙÚÛÄÓ©ØÛ«‚ ½9Û«‚ ½9˜×ĂƠêö§Ø¹ÚµØ•©Øé‡߈ÍÄÇưÛ«‚ ½9‡Ç«‡“Íj‚8¤‡ÖƠ¡È÷‡çÚ«Ô™‡ăˆŸùêµØ£ØÄỖˆăˆŸ·ÅÉËÖ«ÆĂ1߈½·Ô­vŸÖƒˆÑÓ½±»ÇÖLJŒßÄÙÏ̉™‰kß [ïSơÔøê¿»µØù××Ü¥ˆ]1ÂÓ9¥‡™‡¸Ú¿Å©‡¥2ßëMÚª‚ +¼9ă»ơê¢Ưç'ăˆŸ;ù×ëöƶ—¶½ÏÔÿ¯¶éôŸèœÂñÓ·‡‘×8癇¼×ëö©Ó™ÓñÆ—¾Ù½Ù½ù×í—G߈é€ÏÔù×ÅཀÄáê߈«‡“Íjؽ›¾ÎÄá ÅØĂÙ­Ø9¥‡ëö›‡à¬Û«‚ ½9»ˆƯ,ăˆŸ;Áñ×¾8Óµ™‡ëöŸ}ÅÇ̉·Å¿ù×µØñÅïƠ߈Å¥·Ü«‡“ÍjăˆŸ;߈¹Úù׉‘˜‰j̃ZîSר©ØÅÔ±»̉ŋȷÔóÂïÚÏÔß»û߈™‰kß [ïSĂÙͼăˆŸ;•Èû›âÁ™‰kß [ïSëö½ĂÓŵض蕌ÙߥÆÏ̉ÁƯ߈¹Ú„n©‡¥2ßëM²Â¹Ú¶Ô»±»Ÿ‰ơÇàß»ûׯÛ«‚ ½9ÑÓ‚v߈™ͺĐÅؽơêÓ©‡¥2ßëM‰ơƠ÷ÙñÓÿ¯¶§ô­ÄµØÛº›Ûö±¿±‡µaÛ«‚ ½9ö߈Á¾½¹Ú߈½ØÎÔÛ«‚ ½9·‡‘×8çǽ§ÔÛÀăˆŸ‡¿‡º×Ơ÷ÁµØÇïÏÅ¡%Û«‚ ½9ÍÇơÔÏÔÏ̉ÅÔĂï½߈­ÄÎ̉çđ‡Úñƒv«‡“ÍjѶ¿‡Œ÷‡“ÈưÓù×ù×­Ôùơç±»¶  ߈Ù½ÔX«‡“ÍjÁ냈©¼±»ŸÛ«‚ ½9ơêÙÅë«Ô¹ÚÚ¶ôê +…Ô’½½ëöËÓñ̉—ºĂ¹‘«ÇÖÓňÛù×́vơÔܣ䱻§¹éÚÓÅöå̉ ơÔíØ«ÔÅÿÚơØăˆŸ±ëØ«»™‰kß [ïS‰½¾åđƒvÁ½ÍË)éÛ9¥·ÜÑĂ‘Öăàó"¹¾ơê¹Øш¶‡Ö8æ›·Ô½€“Ơ¥Øô—¶¾ẳ¨Øøê÷ÁÛ«‚ ½9ÏÅñ×ÍË)éÛ9¥Æ«‡“ÍjϺ«‡“Íj£Ø™‰kß [ïSÛꪻ +ù‡Û«‚ ½9ÄnÁ̉߈î²2‡ÛçÚÏÔÿÂù×÷Áơ»µ‰³ÁƯµ‰™‰kß [ïS¿ÅăˆŸ;ùåâà·&‹ÜÙÚ›¾í—G¿́ùן¾Û«‚ ½9ÂÙƒÖÛ«‚ ½9›çửÎ “Ơ¼¶Ô‰¿I÷ÁƒˆăˆŸÛ«‚ ½9˜‡ºÚ×öÚ×¹Ú÷Á½Èå̉ Ù×ëöÙÚÑÓ™ëéåƒàƒ°‡¼»°YûÓñڢ䶇Ö8æÙÚÏâÏÅåôơÔ—¶ÄØĂĂ ›­±àéMơ莺ÏÔƒˆËÉ9ƒˆäÁö«âÑÓÁ¼÷Á߈߈â»¶å»×Ơ†7§jªdë̉“ƠǼèꩇ¥2ßëM±¿Ï̉£‡ÿ¯¶Ù½ÿÂëöÅØăˆŸ™‰kß [ïSÿ¯¶æê€ùêÏÔ߈ù×߈Ù½ƒv™Ô߈ôÂÛ×ËÇÁĂ›¶é½€ÏÔ½€ëöÿÚÙ½ÔX˜ÅØ«ÚÅÓÁ癉kß [ïSºÁ‘ÈíÁ¹ß½‚v¸Úù꫇“ÍjëöÑÓù×̃ˆŸÈù×ñÓ₫®¶¹ÚÅÛÄÓ¡ÁÛ«‚ ½9±»º‡º±»ÙÚ߈½çÀåôÏÿÑÄ뽡NjÇ퇩¼Ù½¿̉ƠÙÓ™‰kß [ïS߈µÜ÷Ùÿ¯¶ăˆŸ§ºµØ÷ˆ±»¹±»¤È)ñÓ÷Á½€ëö©« ©ƒ»5©ψñ¿‰«‡“Íjơêï»ǼÏÔ÷Ú±»†Úù×ùׯƠË̉™‰kß [ïSƠ¾G©ˆ¦ÔµØ߈Í~ăˆŸ‹Ç߈‚v +ñÚ½€ƒ¾‘ï»߈×Ơ†7§j­€đ»™Ă™‹µƠÙ½‹ÜĂ¡ÓÅÓ›¾ßƯ¾̉Å›¾‚vƒˆœÂ9¥‡ÑÄëăˆŸ;µØ Û§º©‡¥2ßëM¶22§ÔÁƯÅ–߈÷4áêŒE ù¿Ï̉çÚÛÀÙ×¹Ú»‹ƒ×ƯÓ ͽßÄÙ¡ÓăˆŸéê·Ü÷Ú›zù×öŸđëđÚ¹«‡“Íj߈™‰kß [ïS·Åª»ƯÚơÔív߈ÑÓÍË)éÛ9¥ơêơÔñÚ¾Á|ô×ÂỞñÖ±»µa™Ư§Ưƒ#ơêŒa½€ăà¿Ø¡ÈăˆŸ;±»Ở»Øƒv½Û«‚ ½9½“Èô½ŒÎÅĂÙ›¶é…öáº߈ç'ñÓÙÚÓºÙ½ëö­vùê©Ø÷$ªÛͼÓ¼¥Óå̉ ÑÓ«ÔٸӺ߽÷ˆ¹®À½Ăº§¹¹Ú™‰kß [ïSăˆŸ;kålÏ̉£ÇéÓơêׯơú‰ơÇç‘&³3–Ø¡¡Á¯ÈçÚËÚÑĂ÷Áâºëö× ăˆŸ;±»‡ŒçÚ߈ŽöÁñƒçÚ£7ÙÚ“ƠÀ‡€è/Ö:Ù½ƒˆ›¾ÁĂ™‰kß [ïSƒvÏÅ­Ö– ‹Çơêµa߈£»½Øß„ϱ»Ù½ɹ¡ÈáĂ™‰kß [ïSơê‹ÈÏÔơñ»—Ó‡ù×ÙâñÚ´À©¼©‡¥2ßëM™Á­¾ëöœÂ¶‡Ö8æÉtơÔÿÚ±»¹ Ó½½ø×ăˆŸÏÔ×̉‰¿Iƒ‡º½á¬ߌÛ,É̉ÏÔâˆ:³È¯G‹øù×ÿÚơêđ»ÂÈëö™‰kß [ïS—¶ĂƠ±”±»Ó´½ÿ¯¶¹Ø߈ÁƯÏÅÏÅ£»¶è¹Úù×ÁƯ9¥‡‰¿Iù×߈ÛÔG½¹ñÖ‹É0¡Ù÷ÁÑÓ×$Ó₫®¶Ươ߈‡ŒÍÓăˆŸÙ½ÍƠ»̉­ÔÛÛÄÓÛ«‚ ½9—¶©Ç×¹ăˆŸ;k±ÁÏÔË¿éº߈ơê₫®¶³Âơê‹ÇÍù×åĂƠ™‰kß [ïSơêÿוŒÛ×Ï̉ÑÓ­Ä¿́å̉ »rÙ×÷ÁÙÚñÖƒv߈™Ó߈ƒv"ưÀ«ÔƠX‰ÛËÉ9±»ÏԤƻ׿8±½±ë؃v®ôùêơêù×ĂÙ÷Á®é«‡“ÍjöÏ̉¦ÓöÁÑÄë¹Ö·¦D Ó̉©Çƒv¶‹Ü¡ÈƯÓ ±ëعڃv³ºó‚vÛ«‚ ½9ăˆŸ©ÓÙ½½€gçÚăˆŸ;kĽ‰êÓºíê‹ÜéêïƠÏỖ„̃Ä Ø ̃ÄØÿ§ƒvăˆŸ;߈‹Û¡Ư¡Á·ÔÑÓăˆŸ±»«‡“Íjô«‡“Íjµ†©ÓÔïƠ± íÖ³ëöÓº­tưÀ—ÓÛ«‚ ½9߈™‰kß [ïS×ÜÙ½ưÀĂº÷êÿ¯¶ÿÚ½íq̃Î߈çÚ¹Ú¡\ơèÅû:ÙÚæúÅ…»“ăˆŸ›¶é“ùÍÄëöÑÄëχ¾ûÙµa›‡̀ӸסÁù×ëö·̣íÖø¾߈â้yÅÓÇÖ÷Ú¸Ûף䇓ÓÔåê߈°»߈ï»½ăˆŸ;ºÁXñÓ·Ó ¥0Áăß½ù×Û«‚ ½9´̀ª +ä̉ÅÉÙÚ¨Ó«Óù×ÑÄëÓÆ¾ù걻刽íÖ™‰kß [ïS˜‡ăˆŸăˆŸÍË)éÛ9¥9¥‡ɇ°» ¨ºù×퇱ëØĂÙ•&­áñ›¾ÏÅ·ÔÁ烈™‰kß [ïS‡ÚÏ̉¡ÁÛºỞ™–Ûº¿t‰¿IñÚÅ»³ÂëØÓ¾ơê˜êèä½ÏÄ߈ÏÚó¶÷ÁåÁû—»ŸÅỞơꘉj̃ZîS¼«ÚÛ«‚ ½9÷‡ÅØÙ×ÏÔ±¯ÓÛ«‚ ½9ÏÔûÖƒơê÷ÁÏÏÔÿ¯¶»Ø¾Å·Ó ¥0ô™‡Ù½ÏÔ·‡‘×8çăˆŸÛ«‚ ½9ö̃„ñÆÛ«‚ ½9ÅԵȨÓù×§Ø·‡‘×8çơê§Ơ­Ä¹Ú©¼ÓµĂÙƒˆ×àëöơÔÏÔÂψó¶ÛÇơ‡­Ä߈˜Ó«Ñ«‡“Íj½ưÀÏÔ£‡÷Áăà·ÔĂÁ©¼ÏÔ¡Ô§Ôë¼ÔX±»ÀƯÅôơèÅûÓèçÚ߈߈Ï”µØßÄÙ™ÁŸÄ½€§ÓƒˆÅÛÀ™ÏÔ«ÔºÏÄÏ|ÄÓăˆŸ;«âñÓóÇÏÔ“Ơ‚v öÁñÔ» ±ÔËÉ9ÏÔÏÔÅ·ù×å̉ ÓÔ—¶…Ö¾ÏÅׯÏŹÚÙŒë*«‰ÛÖÓ8¤‡×ŸÅ«»߈ïÉ—ÛÇÖăˆŸ;Û«‚ ½9—Óëöå×bÜçØ¡Ô·‡‘×8çÛ«‚ ½9íÖ…Ơ¶±ëر‡߈­¾¯¾ơ‡¼è°»£»ëÔù¼ĂÈ£Ç̀©‡¥2ßëM«‡“ÍjỞ¯×™‰kß [ïS9¥‡°» å̉ ŸÈÀ¹ÇÖÁƯơÔ·‡‘×8çưÀ›¶é½̉Ø÷ÁñÚ½€Úª‚ +¼9¹Ú³ƯÏÅçÚ—¶³z¿ô­ÔÅÔ™‡“Æ™‰kß [ïS¿‰¿º‡¢qĂ’á]ËÇÿ¯¶ªÈ Ï̉‡Ú™‰kß [ïSöƒvƒv÷Ú¯Ó±»ÏÔºÓØµ†¡Û©‡¥2ßëM«Ô‡ˆÔ ¯fñÄ¿‰ửÅØÅàù×Î̉Û׫‡“ÍjÚª‚ +¼9ϹñÚ‡º°»ÙÓù×ß»ûÿÚƒÖÍ•…»ßÁ™‰kß [ïSƒÚ“Üëö߈çÔ¡¶ÇĂŸÅù×9¥‡ÛÓ¿èÍƠ°»ƒàéê9¥‡Ú×Û«‚ ½9߈£Ø½ĂÙăˆŸ;™ëéåơêƒvĂºĂ«‡“Íj‹Ü÷ÚØ×«‡“Íj龺ÏÅ•îÿ¯¶}˜‡ÑÓ¹Ú·¼Í7ö«‡“Íj±¿̣ă½³¹߈£Çª‡’̀jÏÔ™‡ñÓÀĂÓ̉Åô9¥‡£äívùơÏÔưÀƯÛ«‚ ½9₫í'ÇÖï½߈§ÔÇíÆ±»‡Ú·‡‘×8磇™‰kß [ïS‡¾ÙÚùê‹ÇăˆŸ;k‰ÛĐÓÛ«‚ ½9̉ơȣؓ‹½­ÄËÇ9¥‡æÚưÀƠ­Ä‡äÛ›¾©¼óÖßÏÙÚ‹Ó™ÁĂÈøê8¤‡ÎÄ©ÏÅ9¥‡×¡Á¡Áׯù‡źå̉ çÚÿÚ߈¹Ú™ô™‰kß [ïS§Ø½™Á·‡‘×8ç¾¹xăơÙÓí—GÜÙ½›ç­½¼ñÆÁƯË̉«»×ܱ«%§ÈçØ¯Û×Ó÷Á¡ÔÓÅûØÁ¦ÍË)éÛ9¥́êØR£äăˆŸí—G‡£́ƒöÁƒˆÍË)éÛ9¥­̃·§D ÏÅ߈ơêµƠ›¾Å£ÇÛº”ÈúÔXñº…»ƒv«‡“ÍjÓñÅÔ߈‹Ù…Û“Èơ»“¹ƯN½߈¾ßª‡’̀j½߈ívÙ½ƒvÙן}Ù½Ơ±½ëöÎ +—ˆ8¤‡×ƒv˜‰j̃ZîSÁûë°½߈¡ÁÀĂ߈™‰kß [ïS§ºÙÚëö½·Ô«»·“ív%÷‡Ϲ·ÔϼùêÏÅÛ«‚ ½9ăˆŸ;ÿ¯¶áÛ¡¨߈«‡“ÍjÁƯ€¡ØëöơÔÔơ·Ô«ÚăˆŸ;ưÀƯÓ 8¤‡×€º‰ÔÙÚ™‰kß [ïSøôJ³߈ÏÄѾơĂ߈Đ™Ô¡Ô™‰kß [ïS±»™‰kß [ïSƒˆ¾º~ëöÛ«‚ ½9¿nÙ½“ÈçÚûÓ«·3uUç̉ä̉ÅÓ¥Æщơ걻׿8Û«‚ ½9‡½íÆï³2Ưƒcƃ½ÏÔÏÔ‡x±»Úª‚ +¼9ºơÔÛÀ¸ÚƒØÓº߈¡Èè¼£X™‰kß [ïSËÖ9¥‡ÏÔ¾¹x½߈ơꙉkß [ïS±¿ù×ĂÚÅÔĂôÛº¬¾±»ƒˆ9¥‡ÍË)éÛ9¥½Ô³ ˜‰j̃ZîS‰¾ùTÁ̉×ƠÏÔͪÏ¿œÁÎÔĂĂ ›­±àéMÏÔÏÔ½€Ù½£ ÇĂéÓ£Ư9¥‡«â‘«ËÉ9₫®¶íÆ»¤ˆ\0×üÛ«‚ ½9ÑĂƠëö¿Äø×‹ÇôèÄĂ‹èá¬ÏŸĂÙ‘³à=ªÛ»Û±»•ÖƯíƠŇdǃ׀ºù×ĂßÚ³ƒ“³Œç½ÅØÏÅíÁÙ€ÿÚ±»™ÔÄÓùêơê‚Ø߈ăơÀ¼ăˆŸóÓâçÚ¸Ú™‰kß [ïSºyËÉ9µØàƠ›‡߈ơÔù×ơêă‘·ÏÏÛ»÷Ñó¾¹x½ƒÆµ½˾ơêĂÙăˆŸ‚«ÛäÁÛ×ù×ĂÙêö·ÔĂÙ®ÈĂÙùêƠX§ÓÙ̉ÍÇרÙÚơÔơ걿9¥‡ưÀ±”Ä–˜‡°»³Æ‹ÜÏų ƒˆûØ«‡“ÍjăˆŸ;ÿ¯¶ù×ߥΩÓĂÙï½ %¸ÇíÖ́ÁăˆŸ;½€ƒˆÿÚ·«‡“Íj‡ă±»Û«‚ ½9Ûו·ÿÚ¹Ú̃ˆ·̣›vº߈¶  ™º¿»·#ªÚ¡È½¥ºÛ«‚ ½9ë˜Hù×›Û‡x“È«ÔëöùׇÇÜĂÙÛ«‚ ½9÷ÁăơÉ̉½÷Á́ÆăˆŸ;k™‡¡ÈÇØ¹ÚËÓÛ«‚ ½9“ºƒv½$½‡ù×ÁƯ–ˆÚÆ™‰kß [ïS9¥‡»ơÔàö₫Ô»yÛ«‚ ½9χ«‡“ÍjÅØÙ½ºÙ½á=×Ûù××ĂÏ̉ÍÇưÀ™‰kß [ïS¯È¿‰ƒØµØχ¥Ø‰¿I§ÓÁ̉ÿ¯¶Û×—¶¾ÏÅăˆŸÙ½ƒvÍBăˆŸ;彸½©›¾ƒñÓƒˆ„bÉçÚơÔƒv…ƠÛͼº©Ç›¡ºǺ«»¿Å‹ÈÂÙ‹Ûï½½9¥‡Âëöùוւv«‡“ÍjÅÓ™Ó߈Û×½÷Úï»ñÖ™‡̃½߈Ù½ơ‡‡Úïù×Ơµßö;߈ÿ¯¶ù׃vÑÓÄô߈Û׫»ÓºơèÅÓÆơĂ߈ûØó¡Û›¾Ơ¾G̃»úáºØÏÔ½ưÀöÅöÇÖơê»Ó·Ô³ºóƠ¾G·‡‘×8çÚÆ…Ơăê»×¿8ú̉ơèÅù׳ØÑÅù×»ô׿8Á«‡“ÍjëöĂÙ߈ÑÓ¿º™‰kß [ïS—»÷ˆ›¾Ñ‚®¼±»ç̉ëö™ÉƠ ÅÔ‹ß:çÚÁ¼ׯăˆŸ9¥‡÷‡ºÅº½½9¥‡ÇÖ…ÿ¯¶éºóÇăơéêÇÙ½ÍӾ硙ơó×·Ó ¥0ùêÏÔ߈å̉ ¿‰߈ăˆŸ;·ÅƠ¸Ï!í̃ÄØ¹®ÍË)éÛ9¥‚ØÑöÙ½÷ÚÓ‹ÜăơĂÁƯÁÛơèÅ“Æơꃾ‘߈Û«‚ ½9ơجÖâÁù×ԋǹÅÁƯƒv£ÔÍÓ§Ó²ñÚ±»‡߈Åô™‰kß [ïS¼ÀĂƒÚŸÈơÔ8¤‡ăˆŸ;ÓØ÷ޱ¿µØơĂĂº‡º±»ăˆŸ;¨›«‡“Íjø×­©ÓăÇíÑæ9¥‡Ñ­Ä™‡ÙÚăˆŸ;k±»ؽăˆŸ;̃ÁăơƯÓ ½ÆÖÏŵ‰»ØáƠ·Ñ«‡“Íj¶ +è +»ô¹Ú™‰kß [ïS·‹߈öÁ“‡ÇÁ&ñÄ́v‡÷‡̃» ú Û«‚ ½9éºăˆŸ™‰kß [ïS—¶ÏÔ‡Œ½ôö¿Åùꘉj̃ZîSöôêËÇÁ¿ºÁ¹‚Ö¡Ûß»û麻Ăÿ¯¶ïô±»±»ƒc¡ƒv¡ÈÜóÂÏÅϼ£ØÉ̉Ž™‰kß [ïS±½ơû凳ܛ¹ƯÓ ·ÅœÜ9¥‡×“¹ƯNÂÈ߈‘Æø×™‡8¤‡߈ËÉ9Áw¡Ỗˆªb€º«»ĂÓÍĂêöÿÂß»û‰ÛóÂ׿8’Ç•Èû›éºŸÅÙ½Ç"­½¼ăˆŸ;Û×Á½È±½È±»ä̉°°½ÙÚÅôµØÛø¾·ÅÍË)éÛ9¥—¶ó#Ơî±»«‡“Íj°‡ô÷ÔÓÆ·Åô±»Û«‚ ½9ÿ¯¶™‰kß [ïSăƠăˆŸ°»çÔ¡ïƠËÇÇÅ›¾»nÇÚ ©ÀÏ̉½¯Û£äß»ûÓ̉º¡ÔÙ̉¢ä¥ÈÛÚƒĂ¿‰ï½‡ä‡ÇĂÙ÷ÁĂºĂ À‡€è/Ö:½Û«‚ ½9´À¶¼Ä–ûÓù×ÍÓÎÅ߈Ï̉Å»áÓ‹¾ñÖß“½‹ÈơèÅ»ØƠX÷ÁçôívÑÓǼËÇ“̉Ñæ±»ơÔÙ½ưÀ8¤‡ÖáØµØØÿÚ™‰kß [ïS±»Ă ÙYϺăˆŸ;½€ÿÚ˜‰j̃ZîSÛ«‚ ½9¡…Ûçô­½¼ÓØăˆŸóÇù×§¹ÜœÜëö߈9¥‡×ñª÷«‡“ÍjŸè®lÇÖ“Æ÷ÁÑÓ߈³Â±»“ÆÎÔù×Ưºù×ÑÓß„‚½¸Ú¯éă»ÏÔ˜êèä—¶“½Å–·‡‘×8ç‰y¹ÚÏÅÄÓ½­½¼ËÉ9º¼ ËûۆNjÇÛÇ™‰kß [ïSÅØщ€º¾ß‹Üóǽ£Ç÷‡Ơ(ÏÅÏÄ¡ÁơÔÀĂ +ß»û·§D Û«‚ ½9½ĂÍħÔăˆŸ;kÏÅ߈ù×ù׵؆ºÿ¯¶Á̉ĂĂ ›­±àéM™‰kß [ïSù×ÚÀ ©‡¥2ßëM߈đó×ù×ÔÓ…øÙŒë*«ơèŵص‰%…ء۸Á –¶Ưßơĺ·‡‘×8çË̉ׯÏÅùêử¡»ù×­ÔÙ×Û«‚ ½9Û«‚ ½9×¾±»»‡ß̀¹ÚŽ—¶©‡¥2ßëMçÚ Û÷ÁỞƒàíÏ̉ÄÄÏÄ¡Á¸Ú‚v‚öăˆŸ;k‰¿Iơꙉkß [ïS‡Úôç̃9¥‡×¡Ụ̂¶ơĂÛ«‚ ½9…ô£ØµØƒvÙ½¿‰ÓÅ·Øùê߈ưÀ·Å±Áơê¹ÚÿÛ½߈¹Á÷Ú½€½™‰kß [ïS™‡.ÏÄưÀÅÀó‚כ¾߈±»½̃„ÈÅ¡‡ÇƠƒ¾‘Á¼ô« ©ƒ»5‹ÇËǼس™‰kß [ïSƠÓɇ‡Œ«‡“ÍjØ×¾³×ưÀ±¿Û×ÁỪÓ §Ô߈¥ˆ]1½™‰kß [ïS›ÚÅÔ…ÂơÆñÚïÏÔĂÛûÓÛ«‚ ½9…ÖÙÚ‘×÷ÁăˆŸ÷Á₫ƒˆéꩇ¥2ßëMÛ«‚ ½9³Û«‚ ½9÷¼ÉĂƒˆ§Ó‹Ç‰Æ·Û—¶ôÂÛ«‚ ½9»½ÿÚùׯ‡ô©Úå̃ˆåÁ³™½…Ö¹Ú­¾ưÀÛº½±»‹ÜăˆŸ©Çƒv©¼ÏÄ™‰kß [ïS¶ăˆŸ;ÍË)éÛ9¥µØăˆŸÖÆ +›¾…Œ߈óÇ߈Û«‚ ½9®¾ơ꽇ÛÏňêöó¹¹ÚéÔ₫¼aÁƯ»ÅÅÓ±”«‡“Íj¡ÇËÖ™‡¬¶º•ŒÚª‚ +¼9›¶éơÔ¡ÈÜÏÔ½ÁƯưÀÎÔ³ÂƠ½µ†‹Ç߈ÇÖ¿Å·Ô‡Óº½0µØ˜‰ j ̃    Z îS ½µ¿‰±Á¹»Û«‚ ½9÷ÚÏÄŃv©‡¥2ßëMφº̃ˆôÛ«‚ ½9«‡“ÍjÅô£Ø÷àß»û₫¹ëԳȹÚÎÔû÷ÔóÂÓºëöÓëöÛÄÓăˆŸ;k½Øµ†ñÄÓØ™‰kß [ïSà­ưÀ±»ï ÙÚÓº¶ôïÅ߈9¥‡µà¿‰ËÉ9ù×ñڙԳ±»ßÚƒvø×Á̉­Ø«·3uUá Ú×µƠÛ×߈̣ψÑØÁ‡é/×:ăˆŸơÔĐÓØÅêëÔÙ½ƒˆáÛ•Œ£Ø̉̉5ÅÁÿ¯¶ÑÁăˆŸ·µÿ¯¶§ØÙ«Ú‡ŒĂºÛ«‚ ½9óÂđÇÏÅùºµØʹÏųÈùסÛëö‘¶ÁĂ™‰kß [ïSÙڡȉµó©“ƒ×Ơ™‰kß [ïSÑÓăÇí™ÁÏÔ…ôăˆŸ;çÚµ÷‡ăˆŸË«Ô÷å5Ó™‰kß [ïS«‡“Íj­Ô³í÷ÙÓÓ4£ä¥kÙƠ½–ŒÆ̉ÑÄë«»߈·Ôëö±¹߈½€§Ó™‰kß [ïSÏŧôÍË)éÛ9¥ÙÚ©¼ù×±»ĂÓơêù‡×­€ Ç¤ˆ\0¢Ç«Ô«‡“ÍjÁƯ‘°¼ £»Ù½ñÓëöù×ÏÔÛ«‚ ½9íÆÚÙ½‰Á©‡¥2ßëMƒ½ÏÔ‡º¯¾9¥‡×©‡¥2ßëMÅôÛ«‚ ½9ùë¡Ó×¼÷ÁÚª‚ +¼9Á̉›Ăÿש¼߈›¾ÚÔĂºÑÄë±½ăˆŸ;½£Øщ½º½»ÁóǽÙÜăˆŸÇÖ±½çÚ×¾À‡€è/Ö:£Ç“Æé¾9¥‡€-ƒÔ¥ˆ]1ÏÅ߈«‡“ÍjËÉ9·‡‘×8çÏÄ¢ƠÀ¼ ëöĂÙÇÖ¼›¾‹Áù×Û«‚ ½9©ÓăˆŸ;ׯßƯíơ‹ÜÅÓ$ù×£ƯÏÔ±»³ºó±»Ù×ƠĐÓÛ«‚ ½9ÏÄ߈•ûÓª‡’̀jăàÁÛ«‚ ½9÷ˆ¾¡Û́vÛ«‚ ½9“ù¹«âÛö™‰kß [ïSÈ̉ËÉ9ÿ¯¶ăàưÀóĂùê“Ơ™½Ôº».¯×çÚ™‰kß [ïS󕌛¾Û«‚ ½9ăˆŸ;Ù·‡‘×8çơlÓ³¹ù×ùêăÆè ùơ¹Úæ°£äóÂëö߈óÄ™‡µØÏ̉ùê…ŒñÚÅôçØ¾¯‰¯0Ï̉ÿ¼Ï̉›¾ƒv™‡«·3uU«‡“Íjؽ‰Ô߈ƯºÛ××̉§‡ØƠ9¥‡‡Ž­RÅăˆŸ;ăˆŸ›¾«‡“Íj¾½ÑÓù×Ơơ꽺«‡“Íj߈߈¹Ú«¾ëöÿ×—¶œô·Å9¥‡×±»±»óÔƯ‰±»‹Û¾Û«‚ ½9¾ëöù×ÛÀĂÙĂÙÛ«‚ ½9†×ÿÚÂуÖñÓÿ¯¶Û«‚ ½9öơêÅÅÁ‡º½Ôƒ×ÏÔÛóǃۼ€a»Ù½°»áÊÁ̉ß"¬¶ºưÀµØàƠơºëöÙ½±»÷Á¹Ú«·3uU½€…Ö™‰kß [ïSÔX³ºóữ›¾·‡‘×8ç£ØÛÀưˆ‡‚؃¾‘ÏÔ™‡«‡“ÍjàÓ ơÈĂÙ—¶óÂÆô©ˆ†Ú·ÖëÓï»ăˆŸ;ƒv½¾‡ƯºÏÅ×¾ưÀù×·ÔĂÙÛÄÓêÓ­Ö…Ơ¯×ô¡ÔÙ½‡Ú¹̃±»Û«‚ ½9™º¢XëÚ Ă‡Ç™‰kß [ïS×¾ívĐÓÑÄëô«‡“Íj±»߈¬Ö+üØÑÓøêÇ“›¾¿×¨Ỡˆ÷Áâˆ:k¼€Ơ¾Gö¥‹÷Áßţ؇µØÏ´£Ç§/²‹ÇÁ«‡“ÍjÀ½”ÿÛ«·3uU‹ÜÙ½߈©Óɇ«‡“Íjăơ½€±»±»›̃ÓºÍÄù×±»ó‹ÈăˆŸ;ÏÔƯÓ ߈ÏÔ¹Ú‡Ú¡ÔÇÓÔưˆ‡ÚÎů¾¯Ơ±»ŸƠ·ÔĂÏ̉ׯ »ÎžµØ¨À÷‡ƒvëö§Ô†“橇¥2ßëMø×Ú×ÇÖ±ëØù×á ÏÅƠ×ơêËÓ—¾ăˆŸ;k·Ü›¾à=çÅÁ­ØƠ«‡“Íj÷‡¾«»ăˆŸ¾ëöƒäÁ »y›™Ó™̃ëöÏÔ™ëéå›Ú‡×ï«€ºÍÄé‰ñ5ñ·„ôÙ×Û«‚ ½9ÿÛ߈™‰kß [ïS™‰kß [ïSå̉ Û«‚ ½9ñÁª»ăˆŸĂ¬ÖîƠ¾éºà=ĂÙ‚½ö—»ù×Û«‚ ½9ƒ¾‘ÓÅĂÙùë±»¡ÛƒvâÁ±́ÅÓÍÓÏÅƠºmå„ƯÓ ăˆŸ;Ÿ}›Ú×Ơ†7§j§ÓăˆŸ;—ˆăˆŸ;ĂƠщ›đµ†ăˆŸ;ßÏ¥ÈưÀ“Æ9¥‡½‡ÛÛ«‚ ½9Ỡˆù×™‰kß [ïS™‰kß [ïSׯ¥ÄÏÔ³‹Ç߈ÿ×ăˆŸ;kí‡ôêǽÏÅŽ÷‡ăˆŸ©´ÅÓœ‡ëö…qù×µØ9¥‡¡Ôơ±éºüÀçÚÙ½ºỡÍÄ—¶רYâˆăˆŸ;ƒvëöí—Gâˆ:µÀ›¡ơê§ÆÁ̉ÙŒë*«ª»ùêíểº™‰kß [ïSÿù×»ØÙ×¶»ôéáỠ„›¡ÅÄÏåưÀÔ¾ F ¡»Ù׳ăÁÿ¯¶ó¡‘ÚƒvăơÙÚÅØ…Ö•¾½gçÿ+÷ÁÛ«‚ ½9§È´Å ĂÓÛÀ½Ăëö³(›¾«‡“ÍjíêÏÅĂȽÍơê߈™‰kß [ïSùơï½߈£¨±»ùë­Ö£ÇÑØ‚v—¶·Ỗ»úßÄÙ±»´†˹÷°߈›¾߈½ÍË)éÛ9¥±½«ÔÛ«‚ ½9ù×ß»ûÛ«‚ ½9«Ôåð¿·̃£XËÇăˆŸ;߈«»Í­½ÑØ߈éÓÇØÍÄưÀœ‰¾IçºÛºù×éÓº“Ơ™‰kß [ïSÓŨ׳ôăˆŸ;±»½ëö™ëéå܇Û̃ˆ¡Á“‹Çé‡רµØù×ăˆŸ;ÙÚ9¥‡ÏÔ9¥‡ù×ăˆŸ;Áñ¿èơù¿߈ï½ï³2ÏŦȫ»߈ÓÔÅØÏÔƒˆ߈ö̉ô½Ơ²¹‡ĂÈÙÚăˆŸ;k·ÔŸÖÙ½ˆøăˆŸ;×ÚµØù׃v«Ô‹ÇƒÓ.›§ØĂÙµaưÀÛ«‚ ½9Ù̉ÄÏůי‡ŸÈ¡Ç9¥‡¢ó˜ơăơÍÓ߈«‡“Íj°Ă×ƠµØ¿‰—Ú Ơ@Ûºñ̉ƒvÛ×Ù×ù׫‡“ÍjĂÙ›¶é¤ˆ \ 0 —»£Ø©Ø‰¿IơÔ÷Ú8 ¤‡ ××ÜѶÜăơÛ«‚ ½9±»—ˆ™‰kß [ïS×ÜÑÓ÷‡á ™‰kß [ïSÇÓ§Ô˜êèä߈Ơ½í¥Û«‚ ½9ÏÔÅÄïƠÖ̉Të×ëöɇ߈ëöëöÅӭĽÔưÀÙÅ냽¯×ƒèưÀÙ½±»ï¶Ûס%éÓ³ŒûÚª¶2tT匿N±»µØ×Ơ–¶ß»ûù×±¿°» ´ôºy¹Ë躩&ù×›¾ñÔ©‡¥2ßëMƯËÈ9¡Ô¡ÈưÀºÀĂñ‚Ö‡º÷ÁٵșÁ¹Ú¹ÚíÛ×êö™‰kß [ïSÜưÀÏÅ“¹ƯNŸ}íù×ÙÚ«‡“Íjàö§½‚àĂẸ̀ÔÏÅĂ9¥‡ëö§ôƠX™ëéåƒÖ·Ô߈áÛ±»ƒ¾‘íÖ¡Ô¹ÁËNjܫ‡“Íjÿ¯¶«‡“ÍjơÔÿÚ¡Á“ +ç'™‰kß [ïSĂÙö¯ă%ù×ù׃v˜Á˜‰j̃ZîSß»û‡ºÀă„9¥‡›¾½9¥‡ăˆŸÁĂÿÚă࿋ǧԽͽưÀ«‡“Íj÷̃ÂÚºÏÅ¿%¹ÚƒṿÔ÷Á“ÛÏÅ₫Ôÿׄ±»Ùܻȱ»…ƠÓŃvÑÓëö‹È» ½•Èû››¾Ù½«‡“Íj߈ƠÙ׫‡“Íj…ôÑÓ„ÖÛ«‚ ½9‚Óű»ï̉‹ÜÏÔ¯¾ÁåĂïƠóÔ·ºÓÆÑĂ›¹ÏÔ½›·Ô߈Ù½Û«‚ ½9†ÚñÚÍ­HÏÔŽéÚ÷$‡Œ™ù×ĂÙÏÔçºÛ«‚ ½9«‡“Íj¦(ÇÖ‡ÛÓºù¾­Äºå̉ ÍË)éÛ9¥ÁƯ¢X«ÔH“Æ«‡“Íj—¶Ÿ}£¨äà÷ˆư“ÍĂ«‡“Íjçº̃ˆÏ̉‰¼ù×±»Ù½ÑÓívëöÛ«‚ ½9É»ƒvµØØ ĂÙóLJëÚáØ·ØĂ «‡“Íj±»ĐÄêŸáÛ½§Ó߈—¾רÏỖˆ ÏÔÏÔ—¶·Å®÷ÁÙ׫‡“ÍjơêáÛö§ôêö³Ơûá¬äÁ‹Çó¹Ú„دșÁªd™‰kß [ïSù×Û«‚ ½9ø×ñÆ©¼“ƠÚÀÅ–ù×âêÇÖĂÓ¥‰ÍL…±»™‰kß [ïS•ƯÍÓô»ï½–»éÆÏÅ›¾ä̉ÚÀ-§Ô“ÈÚª‚ +¼9ăˆŸ­ÄÙÚÅØ¯‰¯0ÿÚ̃ˆñ,߈½ó^Ûº•Œ߈¡ÁÛ¾±ÈÿÚü­ÖăˆŸ;™‹‚vÏÔ­ÄƒĂ¡ÈÀƯÿÚé«Ô½½ªÚ÷‡óÇÅ̉©‡¥2ßëMÏÅ¿́̃ÚÑÓ—¿øê‰¼ß»ûÛº«‡“Íjå̉ ŸØæºéíví‡ô¥"¡È‡×ĂÙå×›¾ø¿©¼å̉ «·3uUÑăψÚª‚ +¼9·Ô÷å5Óù×™‡‹Ç߈¥Æ…Û¨º₫‡‡Ú¡Û™‰kß [ïS™ÁÛ«‚ ½9¿Úó–ö˜‰j̃ZîSÛ«‚ ½9Ù½«dÚª‚ +¼9Û«‚ ½9ăˆŸ;߈åǹڡÁÿÚÁĂăˆŸÏÅñÓ£Ô¢»…»ÀƯ¤ØÑÄëÙŒë*«ÛÀÑÅÛ«‚ ½9½ơÔÖ‡¼7«‡“Íjéù×߈¼©Ó¡Áùׇ»±»«‡“ÍjÿÚ‹ÇÛÀ߈· ߈©§Ô¿ßÁ˱⩇¥2ßëMçØ¾Ăö÷ÚÏÅÚª‚ +¼9χ߈åĂŽù×Áăôê¹̃½ùרÅêëơęӃv˜‰j̃ZîS›¾ÑĂëö¿‰ëö™ëé噉kß [ïSÛ«‚ ½9ÏŃvĂÙÛ«‚ ½9ƒv߈Ù½µÜ›¾ÁĂ­Äùê±»߈ÑÄëö×̉¯ßרÛ«‚ ½9ß»ûù׸ڗ¶ÙàåĂ™‰kß [ïSĂ ªÚë™HƒÖô¥ˆ]1ù×Ơ¾G™Ø…öÙÚ£ÔëÓÙÚÙŒë*«ăˆŸå̉ œ}Ÿ’Ë̉ÜÓ µaÚÄ̉ù×Ó̉¹ÚÓàç߈»ơêûÓ¹Úχù×߈ù×ß„ăˆŸÏÄèơƠÏÅñÓÏÄÏŋܡȂÈ̉g/Ơ·‡‘×8磇•‹H¿¹ø×±»Ởç̉¡Û±»Ă—¿ÅÁ‚¾ĂÖßÚ‘ÆưÀƯˆ– ‡x½¿Å¶è‹Ü±»ƯÜÛ«‚ ½9ņ…ëö™‰kß [ïS‰Ư×¾øæËÉ9¯Ä©)ƒÏʉj̃ZîSÏÔÛ×§Ô߈Ï’¹ÜNéÓ9¥‡ơÔù¿çôăˆŸ;ơèű» ÇÏÔ±»€½óÂçºñ»Ơÿ–çÚ‹ÈÛ×Îר9¥‡¶Å߈÷Á箩¼»Ø„n¾…Ú¯Èơ߈¡ÁƒvơÅËƠñı»£ÓŽƒµ“Âù×ñÚĂù׿ØÉ³ØÛ%Ûöùêù×ăˆŸùÚ󸽀‚«‡“Íjº»=½€±¿ỞÍÓ§Ô¾›ÚơÔăˆŸ•%ËÉ9Û«‚ ½9̀ÓƠËÖ ÁçôËÇ‚v±»Úº9¥‡ÅØăà9¥‡ăે“Íj±»½ Áív«âÏÅÙ×Ûźíê¹ñÜà ívơùå‹ÇYׯÿÚÑù±»‡‡Ú¦ÓñÆר‡“«‡“Íjù×ÛÆ­Û¥Ûơê8c¤‡cÖ¡Û箳™ç‰¿IÛ«‚ ½9Ñ·úĂÔơÙÚÅÓÅÏÔ½ëö‚ăˆŸï»¿Å—Øá̉™‰kß [ïSơé±»ơÔÚד2ưÁ±¿ăˆŸ‘ÛßÁ«ÔÁñÓ“¹ƯNßNẲ֭ċӈñÓ̉Ø©‡¥2ßëM‡Ú́$­È×$ƠÁ³¾ÿ±Qư£ĐÓ©ÀëöơêÛººăˆŸ;ĂÙûسÆùׇ×Ǻ·‡‘×8çÍË)éÛ9¥ñÓïù×™ÓĂÓ߈₫Y»ô×¾ơºÙÚÙ×ĐÄêđÓëößÁç4«‡“Íj°»‡xÇ̉Å»½“È•ŒŸÈæ̉½¥Á¶ÇÖ«‡“Íj·Ôëö•Üù׫‡“ÍjÇÓÛ«‚ ½9å̉ £ÉÙ½±»³ Ù½ûÚÁÛ̃ˆ±»‡¿Û«‚ ½9±»ÍÓưÜù׎¡Óƒ±»߈ÇÖöÁÙÚ­È߈™‡™Ó™Á˜‰j̃ZîSƠÑÓåÁă»­k߈˜‰j̃ZîSÅÁç'Ô ½Ù½‹Ç÷ÚƯÓ éêÙ½¾¡Ô˜‰j̃ZîS¾ƒvÏÅ™ÔñÔÚ½ª‡’̀jÏÔëöù×ÅĂôµßĂĂăˆŸêö±»ËÇå̉ âÁÆ©ØåÁÿڣǂØÇĂ½€“ñ£»éêµØíÆơêá=ƯÚÁÓ™‰kß [ïSơ$·ÜÛ«‚ ½9¾ÇØÓƫѧԵÀ«·3uU–ˆ³ ù꿉›¾öÛ«‚ ½9ܺ±»ù×ÙƠù×ÿÂùׅǸ£öÿÚÏÅơÙ¡Á¢XÖÖÚù×ĐÓͼ߈‹Ç›¾åĂƯÓ «‡“Íjàê%™ÓÚª‚ +¼9•±9¥‡×ñÓóÂ¥ÖơèÅÇ̉‰vÏÔ¶ŸÅ¿‰ƒvÛºͪ«Ô‡xºË··̃·‡‘×8ç¹àŸƯ…Ç·‡‘×8çïÚ©ÚµØåܽ©ÇÍÄ »¼Ù½­Ä÷‡Û«‚ ½9߈åÁƒvïDÛ±½«‡“Íjă»́Åă›¾Úê ½ëÁƯéÍ¥ˆ]1½ÔËÇ‹ÓÁ¼±»ÿ­«Ô¸Ú÷‡ëö¡Û₫ÿ¯¶•ÇåĂ¯×ă¶ß»ûÏÔ±»߈ÔơăÇí×÷ÁƒvëöœØ‡ÇÙ%ϺßÚöÁר9¥‡×ªÚơêí–G¡Ô©Ü•ÂĂÙ©Óà¤<üçø‰½½ù×­º½ôùêçÚ߈¡ÛÙñÓ·‡‘×8çŸÈƯç½×Ü¿‰å̉ ưÀ½½ƒˆâà ù׃«Ô©Óóđ•Œ™‰kß [ïS«‡“ÍjÙÚ«ºưÀÓØ§ºÉĂÛ«‚ ½9½ÔÊÈ9ĂÙơê¾Ù ăˆŸ;ß»ûű»±́ùדƠ¹à«‡“ÍjÏ̉ɇăˆŸÿ¯¶½ÁͼËƠÀ¹ăÁ‰¿I™Ó±»ƯºÏŇŒ«‡“Íj¿‰ß»ûÛ«‚ ½9óăưÀ˜êèä÷Úù׃¾‘ûƠºÏÔÅÓÙŒë*«¡Ç߈»Åù̃ĐÄê×ÓÓÍ­H«‡“Íj·‡‘×8ç½Á»£—ÓƠÄkß [ïS׿8Ÿ}ÍË)éÛ9¥«Ô—ŒơèÅơÔï½—¶ÏÅÆÖÛ«‚ ½9°½Â½›¾«ÔùÚ—ÓŸ}½€•ăĂƠ›¾ăˆŸÏÚ«‡“ÍjÅ–½Ư%Îʉj̃ZîS‚vßÄÙ°»Û«‚ ½9…ÏÅ̃ˆ™‰kß [ïSˆ߈«Ôù׳×Ï̉ơçÚ9¥‡ªÚ÷ơ«€ỞéºÏÅ£‡ù¿³ª¶2tTÓܵØëöÅØá ƒ¾‘́øÏÔÛ«‚ ½9¿¹9¥‡ÏÅ—Ô±»ÀĂĂÙưÀơê«»ôêƒv₫ +‹ÇÎÔ·Ô£»­ÄÏÔÑØñÚ™‰kß [ïSψ…àñÖÓØăˆŸ;óÇÏÅÛÀÅÓº±»¶èµƠ߽߻û­€øê߈Ù½Ú×öÛ«‚ ½9±»ËÉ9÷Á¼ €ƒ ÷Áï‡óǧӜ«·3uUÛ«‚ ½9ÁÚ߈Û̉—ºöÏÔŸÈËÉ9ÅØ«Ôж³Ó­Ä9¥‡ƒˆ̃Ú™‡ăˆŸ;k§Ó³Ơ±»Û«‚ ½99¥‡ơÔÅÔׯ«ÚÛ×½‰y½€Å»­ï½´ê¡¼Ờ£ÇÏÔƒ½µØ¿°»¡%¾ƒÖơâ₫ÏÅ™ëéå÷ÁçôÏÅ›¾©‡¥2ßëM™ÔĂèÛ«‚ ½9ÏÔăˆŸ;ĂÙ·‡‘×8çù×ÿÚª‡’̀j—»ĂĂ ›­±àéMÏÔ߈߈½ÛñÓ÷Ùø×/ùײ¹ÚÙ€ôêơÔ½Ø·Ó ¥0çÚ½ƒÖăà½ỞæZå½öÓÑÓùפ‰̀L„ăˆŸ;8¤‡×®GøăˆŸ;à‘ÆÏÅ߈¯`™‡Ở¯¾¾¿‰Û«‚ ½9ß»ûªÚ +›ÚÛººív©&›¶éøæù×¹Ú“Æ“ÆÛ«‚ ½9ơ»±ëØߌÛ,ĐÄếÁăˆŸ;Ù½ÁĂ¹ÚơÔăˆŸơÔ±Á±»º¹ÜÓ ëöú̉‡̃‘«ɹ›¶é±ëØ·±•Û¶‡Ö8æÏ̃ûÓ©ÓñÔÏÄÍÄÛêºÉ»¦º˜‰j̃ZîSø×¹ÚÏÔ¨Ú…¬ÅÛÄÓÛĂΩÓơÄáêŒ!™‰kß [ïSå̃ŽơÔ©‡¥2ßëMâ¡Ô È©¼ø×̀ Ê) èÛ 8 ¤   ¢ÔË¿°»Ư,‘öŸ±½ÛºÏÅ߈£»ÚÇÁ̉ăˆŸÓëÔưÀÉ»öÿ$¹Ă¼Î̉´½ÑÓñÓÏÔ¾Ă¿‰Û×ï‰ßÚ½Ô˹¹ÚÄn¥º·‡‘×8烾‘¤ˆ \ 0 «»âÁÙÚÁƯ³Ư߈±»ưØÂÙ‰ơĂåĂçÚúÚ Ï½á=匿N—¶ÄÁºÅØ߈߈¥ÇÑøăˆŸ;›¶éÔÙŒë*«‰Øû¼ó«Ñëö—¶™Á¡…Œ¦¹±»߈áÔËÇ­ÚăˆŸ;ïß±”«‡“ÍjƒˆÁ½½ª‡A’ÀjA¡Èëö!ƒØùôƒ¸߈™ÔôÅÓ«Ô‚…ǽÑÄë¿ôÛ«‚ ½9ß%³Ü¨¼ÁĂûÓƒvÏÄ«âÛ«‚ ½9ƒˆƒ×ỞÏỒÊ)èÛ8¤±»ºÆôÅÓ¿¹ÿ¯¶™‰kß [ïSûإ؃v9¥‡±»»Æß»ûµØÓ¾¡\ÑĂư™ëéåóĂçÚ﻽¾ºÍĂă½çÚáÀ9¥‡߈«‡“ÍjºéêÙ‡­9ùê¡ÁÓƒˆơèŃvÛ×™‰kß [ïS‡Ç¡ÁơÔă‘·÷$±»ñÆ£ä߈«‡“Íj™‰kß [ïSà=ùײÈ߈±‡ù׫‡“Íj«ÔôÚ¦Ù½ÍÓ‡çôÛ«‚ ½9÷ÁÛ«‚ ½9›¾ƒĂơÔ±»—»ùê‹Ç˜êèä½ÁĐÓÍB™‰kß [ïS“¹ƯN«‡“ÍjĂÙăˆŸ;·Ô‡ÛÑÓׯëöÓÀ™‰kß [ïSï»°»ơÔ¾¹½߈8¤‡×«¡ƠÁ‡“¹Ú¿»‹ÇĂºŸÅ«·3uU±»¿‰¿‰Û«‚ ½9ù×9¥‡×·‹߈ÆØÅêÁ½߈•¥$µê߈óÂûÓáÛÛÄÓù×±¿ËÉ9ùêù׉¿IôăˆŸ;”‹œH¹ÚËÇ£»­ÖÇå‡ƯÓ µ†ç$ïÚÅ ơêÑÅÅØ›¶éºÅ¿ÅϾ¥O“ƠXĂô™‰kß [ïSĂÙÙÚƯÓ ™ÛÛ«‚ ½9½éê÷‡½¿’¹ÚÙ½‡¼Ă½Û׃ˆÓàå̉ ù¿£‡™‰kß [ïS™‰kß [ïS×¾ơꙉkß [ïSÏÔ¿́†“µÏƒv·ÔăˆŸ‡Ú“ßÚµ•Ë̉ëÔ“ƠŸÖÓ¾Ù½±»«‡“Íj¾¾́ÎÅ +}9¥‡ÁƯÏÔÇÖñ׋ǙÓÿÇ×ÜóÂÿÚ˜¶€¿º²Âù׃vœÚÀ¼ÉÖù×°»ÙàƒvÛ«‚ ½9óÔ߈«·3uU³ÏÅÑĂĂ¡ÔÏÔ›¾áù×ψÏÄ«‡“ÍjƠù×ëö±¿Á×ưÀÏ̉±“Ʊ»ÏÅăˆŸ—¶ÏÔƠÅØƒvăˆŸ;µÅÔ¶á ´ÅÉ·Ó ¥0ơÔ‚vºÍÄ׿±»9¥‡×½½¹ÚÜ%Ç"ƒvÑÓ¯½ñÓ¶‡Ö8晉kß [ïSá óÇĂƠưÀÆÓ™‰kß [ïS£ÇĐÓ™Á±»·Ü₫ÇDù׿‚©‡¥2ßëM™‰kß [ïSŸĂöù×ö·Å«·3uUóר¥Ă§Ó²È 9¥‡Áß̃9¥‡ÿÛçÚÜÁƠĂÓùê†ÇÛ«‚ ½9’ºăˆŸóÇñÚÊÖͺ—»°»óÇ¥Û™ºíÚ¶µØơêï½ù¿äôű»™‰kß [ïS“ÆÿÚ¡½¡Ô­ôçڥؙô‡Ç߈ÙÅ롳È×¾³ºɶ·ØÙ½¨¾ÍÄ›¶é·‡‘×8çÍÓ·‡‘×8çÛ«‚ ½9ăàù×÷Á«‡“ÍjÙ½·‡‘×8ç¿ß9¥‡Ç%Ù½±»ŽØƠ²ÂÍË)éÛ9¥ï¯‹Ç߈±»ÑÄë㼀“È׺«·3uU°”Û½ÏÔÂù(‡ÚÙÚÇÇŒϺ‚₫®¶ÿ¯¶™‰kß [ïSëö¹Úèê £»Ï§ô‹à½ØÏ̉ß»û¥ˆ]1©‡¥2ßëMăà±»ù×á“Ơ߈ù×áêƒÔ™‰kß [ïS¹ÚĂÈÓº·Ô™‰kß [ïS™‰kß [ïS×Ơ«‡“Íj¾́á Ûºƒ½­½¼çÚ«‡“Íj̃ˆ°»9¥‡ËÔ™‰kß [ïS±¨·ÔÆר́‚—ˆ«Ô¥ØÙ»ÅÔß»ûñÖĂÙÛ«‚ ½9ƒ=ÏÔëöơèÅÏÔ·Ǘ½ ăˆŸ;¿‰öÙŒë*«ù×°»·º±»µaÛ«‚ ½9½€ă‘·źÔº2l2÷ÚÏÔù×»năˆŸ‚ƒ¾‘ÂÙÚÁÛ÷¼ƒvÅØ¸ÚÙÚ÷Á·‡‘×8ç½Ø½È߈‡ÇÍË)éÛ9¥Á¾Ø™‡ßÄÙ–¦̀»̣¶Û××Û¿ÅưÆëöÁÛƒvï³2ŸÄ‡ׯùï•ù×âàăˆŸơêËÉ9×̉½ôÿÚå×Ï̉ÅØ©ëö“Æ½Ă«‡“ÍjÙ×÷$ÎÔÿÚ•¶¸Ú÷$±»Ù½ÿÂëöºÈë™HăˆŸµ!ăˆŸ;ăˆŸ;™ëéạ̊Çå¿¿ßÛ«‚ ½9ؽº½å̉ ­¾ׯăÇíëÓ“Ơù×™‡ÏÅ»§ÔƠXY±»çỤ́Ĭ¿ƒØ›¶é½€ÏÄÛ«‚ ½9ĂÈ߈ù°ƒÓđËƠº«Ú‡±±½ƠµØÂăâ‹í̉Æ™¤8¤‡Öº±Ôíê±»÷ÁƒÖ³×б»ÿ¯¶ù×·Ó ¥0ơêíêÇ̉çôÏĹڷ‡‘×8ç±»ÑÓ™ëéå߈ù×ơê‹Ü̃ÄǾơ6ƒÁĂ®»Øƒëö«ôÏÔÚª‚ +¼9“ÆϺº߈¥ÇÙÚ÷Ú™‡߈›âå̉ ơèÅÛ׺ÓÅ©¼¼½‹Ç¹ÚùÙ½ƯÓ ·Ô‚vù×ï»ÂÙÛ«‚ ½9ÏÅÿÚÅØŸÖ߈Á̉߈“ƠáÁ½›ç½ĂÑÄëÿÚ©ÓénĂÙÉ̉»ÔóÇå̉ ï»ÇÖÁ½ƒvË̉ï̉¯È«»¸ÚĂÈ«‡“Íj÷Á߈½€“Ơﻼ؛¾ÓÅÊ·̃« ©ƒ»5ï½Û¶Ù̀éÓÎ̉Ư‰̀Ê)èÛ8¤ßÚ½¹ÚßÁ—¶ùêÙ½¡È‚vƯÓ ؾ÷ÔñÖß»ûÛÄÓÏŸÓ™‰kß [ïS•Èû›¹¼Ÿ}ëöù×½Ăƒw×ÓÙ×ơÔÿÆí ½€§Ơö§À‹ÇăˆŸ;½±»µăô‹ÇËÉ9߈™ëéåå̉ íØG½¹“ƠÎÅ̃ˆǼçÚ¹Ú›vÁăôëÓ£»ƒ¾‘ÏÓÆ“¼¹»ăˆŸăˆŸ±½Ù½­Äƒvµç“ƠØÅêÁƯ߈£äåÁ±»‚±»óÇ߈ø¾ÚÀ÷ÁƯÀ«‡“ÍjÂỜÊ)èÛ8¤ÛÄÓ¹Úǽ‹ÈÏÔăˆŸ;Ë«›¹Úù×£¤¡ÁY¾íꦹٽ™‰kß [ïSûƠÍÓ Ëû×̉ä׫‡“Íjܱ»ÑÓG½¹åôÍĂơĂÏÔ“Èß§¹ØéÓ™‰kß [ïSÏÄ«‡“ÍjñÆÅÂåĂÏÄ»™‰kß [ïSÿÚñÓÇÖÏÔª»Û«‚ ½9ø×ăˆŸ;€Ơ§ÔXÏ|ơÔ«‡“ÍjÛ«‚ ½9¡Ô½ßÄÙ³đÓù¿ÓÔƒv¡Á¼€¶ÅéºëÓŻهÏ9…»Ă¼ëăˆŸ;ưÀ¸Úºùש‡¥2ßëM—¾·Ø¥ÆƒÿÛŸÅÏÔ·‡‘×8çÆ"éÜƯÓ —Œù×ƠX¯¾ÿ昇»‡ÅÙŸÅĐÓ̉Ø™Ôëö¥ØçươÿÜăˆŸĐÓëö±»‡ŒăˆŸ;ûÓ‹Ç›¾Û«‚ ½9¶°»ù׫ԗӷºáéê½ÅÓÛ«‚ ½9•Û÷Ú½Ôº½Ù½³ºó§ÖùêщïÀ퇰»éÓïỖˆ±ßͽÑØçÀ¹]ÍÓÙÚ÷ÁÿÚ¦Û½€¯½¸ÚŽ߈åồäĂĂ ›­±àéMơÔÂÛíØíê•ÓçÚÿÏÖÆ©ÓÁ|µ†ËÅ–ƯÓ ùט‰j̃ZîSƒˆ•ŒĂÙ½½á¹ÖºñÚ›¾8¤‡9¥‡ƒë׻حļœÜù׻ؗ¿“Ûƒ¿ôƒˆÑÄëêÓ‹Ü̃½ƒ¾‘ñÚ½ăˆŸ;™‰kß [ïSÏÅÿ¯¶Ơ'ׯ½ƯÓ ĂÙ߈‚vñÚÿÚÉ̉§Ô¡È¶߈ăˆŸºÅÙÚăƯ·ÔßÄÙñ%ó¹˜Á ¬Ö©ÓÓơÔßÚƒĂÿÚ»±߈ñÚù×°êØù¿½€ç̉µØ”‹œHÛ«‚ ½9߈âơ´ØôêăˆŸ;ï»ăˆŸ;Ơºđă»Ï̉Ë1ù×­Ä8¤‡÷ÁÅÓŸÅÀƯÆ̉ÁÙ¶ô¼Ăº°»¥ÓϹ¶‡Ö8æûëö­ÄÖÚ³ÿÏ̉ÑÓ—¶Ú×ăˆŸ;kŸàÍÄ×Úö‚vƯÓ 9¥‡Á̃ÅÛ«‚ ½9ăơØ×Û«‚ ½9¥ÆéêŦºÏԣ䱻߈ëöÿ¯¶¹Ú‡€›v¿‰ÎÅ¡Á…×€º¶ôZưÀăĂ3ù"§½Ù½­‹ñӣǫÔôƒˆ÷À¿‰ÇÖøê±»‡Œ³ßñÆÎąǦÆëö÷‡‹ÇÁÓµØÛ÷Ú«Ô™‰kß [ïS½Ă¦¹ºÅùשÇÍÁ¿ØÑÓù׸̃ơêĂăˆŸµaíº±»ƯÙÉ—ÓÆöÁ¹ÁÛ«‚ ½9̀Ă¾ßƠX¹Ú÷ÁÙŒë*«™‰kß [ïSßÏéºçړȃÖƠŒºù¾ÿ§‡ÛµÏ¾ơÔÎÅ‹ÜéêÛÀÇÖá ĂÙ«Ô¶ÜÓ ±ÔÛ«‚ ½9ÍË)éÛ9¥ă»ăÔëöƒ¾‘ͼÁ̉Ϲ©Ó©¼ĐÅóƒvôêÿÛ±‡‹Ù™‰kß [ïS¿Å™‰kß [ïSÏÔăà“÷ƠXµÜÚ»öî—ÓöÛ«‚ ½9›¶é£ÇÎÔÍÓ÷Á÷å5ÓỞÙÓÛ׃ړȵعڱ»ơèÅÙ½ÙŒë*«£Ø‡ºÙ½ÏÔÍ­H‡”Œ(‹È¹ÚỤ̀÷‡«‡“ÍjÙ½ØÚơèźăà«ÔåôùÓđÓívׯ×ÓŒÛé‰ñ5ñ·ºÁˆÔơêƒv±»ÁƯÛº¿‰‡±»ÍÄ·Ó ¥0ù×»½˜‰j̃ZîS±™‰kß [ïS×¾Âȃvç̃Úª‚ +¼9ûØù׋Üù×ÙׯÈùׇ9«‡“ÍjĐÅçÚăˆŸ;©¼Û«‚ ½9ív“ƠñÖ¥Ó̃»úíVçÔ¡‡Û‹ÇÙרƠ«ÔưÀÍÄÛ«‚ ½9¸àĂÙ™‰kß [ïSëöé·«·3uU•܃ˆʹ«‡“Íj¿à©ÓÏÄ™ô×ƠÓÍÓ¿½¨º®¾×¿8íÏá¤ơĂ˜ÁÛ«‚ ½9À™‰kß [ïS“¹ƯNÅÔ÷ˆưÀ™‰kß [ïSơ»°»ƒÔëö½ăˆŸ;kơ»ź›ÚùêÁƯ¼¡/ùꇺ…ÚÏ̉×¾ö¡óÆ­ØÛëöéêóÂăÔĂù׺Ø߈ÑÄ뙉kß [ïS‚v§ÓÏÔÛ×­åƠX¿‰±ëØ‚v‚v™‰kß [ïSáØùט‡ê˜HIŸ)ơÔÙ׋Èé‰ñ5ñ··‡‘×8çͽͼÂÙ«‡“ÍjÑ÷™‰kß [ïS‘ÚÓØ£äÙ½ÙÜƠXÍÓ—»߈·‡‘×8ç˜Áï½åĂÇ̉øà÷ÁÍĂ¥ˆ]1Ở¹ íÁăˆŸ;kÙ÷ÙÏÔ’Æ ™ëéå5߈€^ ‡º¡Ưăà›¡ŸÅ•ÜÁÜĂÙưÀƠX³à—˜Ï»̀ïÚƠÛ«‚ ½9ÍÄéÓÑĂáêß»û©¼›·ÔÚÀ«‡“ÍjÏļùô©Óƒ½©Ó™‡ÍË)éÛ9¥ăˆŸÙ½éÚ߈«‡“ÍjơÔ÷¼öä׭ضçÚËûăˆŸăˆŸ;ƒv˜‰j̃ZîSûØ¡ÁÖÆ«%ºÏÔ°»ƒˆƒÚĂÙ›Ú÷Ôôêă÷¶áêưÀ9¥‡½€Ñó™‰kß [ïSä̉™‡ÅàºyăˆŸ½ŸèÀ¹¸ïÿ¯¶ăˆŸÛ«‚ ½9…Â麷‰¢ä»ØÆĂÅ»ÅÔăˆŸ È¦ÔơêâÁå̉ ŽëöÛ«‚ ½9‹øË̉éơͽÏ̉×ƠÙÚ…ÖĂÈ­Ø›‡ƠרÚª‚ +¼9ơêơê—ÓèÔ™‰kß [ïSăơ»ˆÇ»Ơ˹ù×—äÚÚñÖ“Ơ‡ÚỞ±»¿‰³±»½€Ù½©ÇÔ]#ơêË̉›¾µØ»ˆ—„¾…ØëöÓØ›v›_›¾¡Áß»û¡\ëÖ¥º›ÚĂÙ™‡°»›¾¿½Ù½ÔÅéÓ麓ƠÓØÍUÿ¯¶½̃ăˆŸ;€ºϼ¡Û¦Èƒv†ö ߈™‰kß [ïSơèÅ™‰kß [ïSµØô؃văˆŸ;k¡È«‡“ÍjăˆŸ¹ÚëöéßÁ̉Ởû§Óå‡̉Ø߈éÔ»ÅçºÁ½Ž™Ø‡º߈·‡‘×8ç¯ÈªÚ‡6óÇêö +Úª‚ +¼9é‰ñ5ñ·ĂºÁ̃ƒv™‰kß [ïSáê·ÅÅÔ×¾ÏÔ¿ôñ‡ÓƆä™Ă§Øø×³áếº¡½¡%±́ù×çÚçƠ™‰kß [ïS÷Á‡Œ—¼Ÿ̉åT·ÅÍÓÏÅÚÆËÉ9Á̉¿Ø°»ÑÄëỔÓÚª‚ +¼9±»©‡¥2ßëM©‡¥2ßëM¥Ø±»‘Æív—Ó°»ÑÓÙÚ×ƠƠÁ›»ÇØ»ØóÔÏÅđ»߈«‡“Íjù×ä̉$$ùÜơÔóĂ­Øç4ÿÚ‚v¾º«»™‡ăˆŸ½™‰kß [ïSÑÓé꫇“ÍjÏħÔöơêÏÅÛ«‚ ½9ơêĂÏÅÔÅpÏÔ߈Ÿ}™ëéåÍË)éÛ9¥èé9¥‡½€™‰kß [ïSÀĂ™‰kß [ïS±½ßÄÙéêµØ̣ +§ô‚‹Ü™ôăˆŸ;½ôµØÛ«‚ ½9Ă˜™Á³È«Ô¡Û§Ó÷ÙÿÚµaÓØƒˆÛÚ‘ÖÅưÀăÁù×ù×å̉ Úº ·ÔÛÀĂÙ߈—Û×ăˆŸ;·ÜÓ´“È×Üư§‡߈߆ÅÔ©¼ÏÅ—ˆ©ÓŸ—̣ÂåÖăˆŸ;€ÑÅÏÔö›¹ơèÅùê¿ôĺÓ̉Ơ´©ØíÓ«‡“Íj©¼¶Ï̉­ÔưĂ9¥‡ÈÖÙ½‘ȇ¿₫®¶Ûº¯¼›¶é“°ăˆŸ;ăˆŸ§ô¹£‚vÛÄÓ߈Ăëö‘±½·Ôöø×çƒÏźăǽ…Û£ÇăˆŸéÓ—¾ö¡»ù×ÏÅÉ̉ٽٽ·‡‘×8çÍƠ‹Ó8¤‡ù×ù×µaưÀùêû«»ÀƯî»™‰kß [ïSñÖçÚ±»“¿*«‡“Íj£‡Ë¿ö«ÔщƠ¼ÜÏÔưˆ¿·ÔÚª‚ +¼9±»½ü½€ß»ûÏ)ù¾Ă¡Ư­Öº£‡±»±»ß»û₫ƒvчºyïó¡Û¦ÔÇÖ±Á½Ô±»ĂÈé‰ñ5ñ·Çç߈ù×ËÇËÛơêÏÔÊÓ³›¾ív‚¾ø×œ·̉ ¤0¶™ô¾ßư£äÛ«·3uUÏÔăˆŸ;k߈å̉ ‹È“÷ÁĂÍÏÔ¶ͼƒ«ºÏ +·Å«‡“ÍjƠ±»ß"Ï̉›¾øêÏű¿ÚÀĂÙëöơçÁÓÁĂëöÛ«‚ ½9ó§‹ÏÔù×™ÓƒÀ߈ÓƠÏÔÛ«‚ ½99¥‡í—Gù׉ۙ‰kß [ïS«ÔÏÅưÀù׃¾‘¢ä…’“½’ăơ—»ƠXÖ +×Ơÿ§ÅÔ¶ÏÔÏ¿‰ÛéÜ÷ÁÙÚ›Ú¡ å̉ ™‰kß [ïSÎśԱ»ƒˆơú‹Ù¯G‹ø½¡Û•ŒÑæ¿Ô˹±ëØ‚vµ†ÏÑĂ«»Û«‚ ½9‹Ü¿ß‡ÜÛÀ½±»½€ñÓ¹ÅÓØƠ“Ơ¯¼ËÉ9·Ô½ó#‹ÜÅÏ̉ß»û£Ø½éº¡È˜‡¿½‰½˜êèäRË̉ôı»±»—»—Óăơ9¥‡ƒˆáÙ̉Û«‚ ½9Ăå̉ £äÛ«‚ ½9߈‹ÜĂÙ§߈ÁƯƒvш¶Ô•¾ÙÚûØăÔµñ‚vơê·ÅÁñ‹É0‡×ÁßÁ²ÈÏÔŽíÖÛ¼¢»©ØÇÖ£ ỞûƠïÅ߈°»ă¾ÅĂª»«‡“Íj·Ô™‰kß [ïSÏÔg’Ǩ‡¤2€̃êL£Çª‡’̀jª» +©‡¥2ßëMªÚ›ù꫇“ÍjÑûÀ©ºûăˆŸ;Á¹½€8¤‡¯ÈñÓ“ÈÏ̉™‰kß [ïS™‰kß [ïSéºÑÀ‘ÆÍÄÖÆ$ëöƼ“ÆœÁ ô¾Å™‰kß [ïSÿÆù×ç×ơ»ơêºÙ×ÁƯÏÔÚ׃vÆÙÓ™‰kß [ïSöƒvÑØưÚ«ÔË¿±È߈ơÔ¥ˆ]1³È¶ÔÓÆơÔßÁ߈ÙŒë*«óǽƠÙ½߈±»‹ÇËÓŸÈëöͽщ×ƠÆôÏŽ÷‡߈€¾½óÂåĂºªd‘Ô«Ù߈éÚǽ½›¾Èí`ÏÔÚ×Ơ詈ù¿ëöÙ½¸Áƒˆ9¥‡±»Ç_Û«‚ ½9ï¶߈ÙŒë*«ø×óÇÏÔ¡ë×Ú±¿«‡“Íj‡ŒÛ«‚ ½9ÁĂ«·3uUÍÓ‚Ö߈ó¹ÁÏÄ9¥‡߈‹ÇĂ÷‡߈ÛºÏľñ”ÈúÁ”)•ŒçÚ«‡“ÍjͼŽÏÔÛ×½€¤Èщ9¥‡ÇØÿ́Û«‚ ½9·‡‘×8烈ﻫ‡“ÍjÅ%Û×ơèÅó|©Óù׃vؽÛ×Ǻ9¥‡ÅÄÿ̀à¼ơÔ±»¶ÅéÓ¿‰ñÁ±»€º²ƠÛ«‚ ½9ï»ûÛ™‡ơĂÛù×ëö9¥‡¯¼¹£™ëé图‹ÇÑÉ¿I±Ư™Á—Ó™‰kß [ïS̀ËǃvÑÓ߈ăàÀ¹ëöÛÄÓÙ¨½Ơ߈Ä× ¯·Ôæơ¶Ñ™ÿÛ½ºÅƠÚÛ«‚ ½9öÁ±»Á̉±»ơêívÏÔÇÖǺÛ«‚ ½9ơ¤¡»ùד¾½€ívóÂÍ­HûºƠÇØ½ƒÅØɇơê·̃“Ơ¿Ø·ÅëöµØăêʹ9¥‡ƒ±»ºÅÔ›¾ÜƒÖ«ÔơĂă½¡ÁÛ«‚ ½9µ.¥Ù¥Ø§Ó™‡ÙùôµØçôß÷å5Óơº›¾Á·Ô(×ĂéÚƒvÏÔ׿8·‡‘×8çÛ«‚ ½9…Œåßă¼‹Ü°»×¾ÙÚׯĂÙăˆŸ;©‡¥2ßëMÚª‚ +¼9…Ơ£ä©‡¥2ßëM™‰kß [ïS‚¾¿½Úª‚ +¼9·̣½ÏÔ‹Ç×¾«‡“Íjø×ÓØ“Æ›¶éE°»ÑÓ“Ơ8¤‡Öï×ñÖ¦º*ưÁ«ºëỘÓÁ½™‰kß [ïSï½߈“¹ƯN¹ÚÅÓÛ×ÏÅÙÚĂÛ«‚ ½9›Ú¦ÈÿÚŸĂµØÚÀ ½ëö·Ó ¥0ÙÚ«‡“ÍjÛ«‚ ½9щù‡9¥‡×¿ØÅÔÙ̉›¾ùׇä±ôÇØ±»Ç©‡¥2ßëMùׇ™‰kß [ïS¾Å8¤‡ÿ§±»ù×¥ÆÛ«‚ ½9¶Ô±»¹Úƒ½¡ÔĂô¡Ô§Ó ËûÁ£ØíÖ‰Á‡xÛר؋ܷԪÔĂĂ ›­±àéM‰»âˆ:k×ĂÏÄ×iÔÛ«‚ ½9ޱ»ÏÄ©‡¥2ßëM«âăˆŸ;ÏÔßÚñÖÄ1߈ë„ưÀÚÀÏÔôăơÂÙ₫®¶ÛÀ«‡“Íjª¶2tTù×ä̉±»¶ÅºăˆŸ;‡¼ù¿Û«‚ ½9ÀËôÙ½ñÚËÇ¿‰‡ºÏÔ©¼ÑæÏÔưƽôó×ăˆŸ©¼£X™‡Ê¿­ÄơÔƒ¯Û•Èû›óË̉ưÀ±»»‡éÔô—Ó‡xĂÙÈ—›¶éăàÛ׫ԃˆëö«øÿ¯¶™‰kß [ïS߈ù×çổºơèÅù×ÏÔưÀøê§Æï'ÚÄ̉¿^ÑÓ«‡“Íjÿ¯¶†—Ó°»߈Ïű»§ÖÏÔÍÄĂÖ÷Ù±ëØ÷¼ưÚÏÔÛ«‚ ½9±»ƠX›–ÏųzƒvßÄÙÓ̉¯ÔÙ½ŽëöƒˆÅÓŸ¹äôăˆŸ;±»ëןÅñÓÙ½Û«‚ ½9ù×ÏÅ߈©¼·ôú¹ÁéÓÏԂ׫‡“Íj©ÜñÓóÇxƒˆº“¹ƯN¹öưÁó¸߈±Ô«‡“ÍjÅÓ«»ăˆŸ;§Æ¡µØö›¾̉Æ ±”ăˆŸ;·‡‘×8çÙ½Çi˜‰j̃ZîSÑæơĂ« ©ƒ»5“Ơ‘Óơ¶ÉÊ·¸§ÓÓºÅØóăˆŸ;k³ÔÓàËÉ9¡ïñÓ₫›¾¡ƒˆơê·Ó ¥0ƒÖ9¥‡«́ẳ‡ÛàêÁÓÙ×íÆÛ«‚ ½9ùôĂÙ­¾¹ÚăàĂÙƒv9¥‡–Ó‡ăˆŸ;ÑĂ™‰kß [ïSËǤÇÏÅßẠ́Çî»ơèÅÙ×ÏŪ»ù׃v‡“«ÔĂ¹Úơê±»ª¶2tTÙ½Û«‚ ½9±»©‡¥2ßëMÏÅéÔêöưÀóÇ¡ÁÙ½›Ô•Œ–ø «ÓßÚÀÇƯ™ØŸaëöƒvµa˜ÁÅËƠëöÿÚƯÓ ëöñÓơºù¾«‡“ÍjÁ̉™‰kß [ïS½ĂñÓ¢ØÏı»™‰kß [ïS€ºëö½ù Ơ ×Ó¿‰±»ר×Üơꙉkß [ïS‡ăăˆŸ;k±»ư“â¼ă½¹Ú«ºŸëô匿N«·3uU™‰kß [ïSª»߈÷¼·ÅơÄ©¼¼Ù½›¹ĂÙÿ¯¶½€ñÆ™‰kß [ïSƯ‰™‰kß [ïS¯È®Gø«Ô±»›ƠÛ«‚ ½9“ƠßÚĂÙ9¥‡߈½»œÛ«‚ ½9Ï̉¢X½ÙÚÙ×Û«‡“ÍjƠï¶÷‡ưÀÙ½íºÁÛ°»©‡¥2ßëM‹ÜơĂ“¹ƯN¡ÓŸ¿™‰kß [ïS™‰kß [ïSĂÙ«Ô½›v°»·‡‘×8ç߈ó—¶…Ø½Ăº·ÔăˆŸăˆŸƠXåÁ¡ÈăˆŸÛ«‚ ½9̃»úơéó‹íóÇĂÙ³Ï̉ƒ×•Œ¿Ù˜‰j̃ZîS›¾ùר»¼—ĂÓ¾ƒv¹ÚƯ‰ùׯӭ뻩¼ëö߈ÏÅÁÿ¯¶üÁå̉ óÂĂÛÆăˆŸ;9¥‡Ó¼÷å5ÓÍÄ›¾ψôĂĂÙ†×Ö‡»ÎÅáƯäñÁËÇưÀ꼓Ơívއ߈ƒƯ‰Ûºéº†xé£û(Áö½‡ÚóƠ¥ÛíÆƒv©Ơ(ăˆŸ°¿‡xßÍÄÙ½ư!çô߈êÚ°»ËÀ½ƒ½˜‰j̃ZîS†ÇĂÙ§Ô½Ùù×éêăˆŸŽ­Ä³à½Ǽ±»́$›¶é…Ö¥Öí—G³¿̣Ïă¾» ׇ‡ư2߈ŸÄÙ½%¡Ç»Å‘ơ釷‡‘×8çëöơêÍÓÑÓ½©‡¥2ßëM±»Ï̉ä̉¢XÿÂÛׯۺ…»ÑÓ9¥‡×ϼóăÿÓÛ«‚ ½9ÏÔß„ëöáùºÇÓáç‘ÚưÀרßÚóÔ£ Ù½¤ÓƒvăˆŸ;ö¥Æ±»·Ô¾ºăˆŸ¾º‡ºçؽ—¶ơÔéÜÛ«‚ ½9±»Ï߇ñ5ç•דö“Æử“¹ƯNѦ…Û±»¾¶v©ÏÔ¹ÚûÇÅëö¡ÔË¿ÿÚ¹ÚÎŤ؆Œƒˆ›¾ÑÓ±»½€ƒvÛ«‚ ½9Úª‚ +¼9£ØóÂƠÜëÚènù×™ëéåÑÄë§Ô±¿ÇƯ½ăÂÛ«‚ ½9ăˆŸ;ăˆŸ;™ëé噉kß [ïS™‰kß [ïS±»£߈±»ăˆŸ;k½«Ô ËûÆÍƠ±»ùׇñ5ăˆŸº«‡“ÍjñÚÂÙ™ëéå«»߈Û«‚ ½9½€‡ÇËƠÏÅÓÁº³ºó³ºó©½©&ưÀ›¹±»¥ˆ]1Ä–ăà½Ù½ĂÙ́ºïƠÿÛ™‰kß [ïS«·3uU—ˆIºÈ«‡“Íjå‡ïÀÏ̉³ϹÍ­H‡Ú»ÅçµÏÔg¹àߤˆ\0™‡«‡“Íj©ÓăˆŸ;©‡¥2ßëMÅØ›çù×ׯ›¾àĂ¿ûÓ‰“ó±»î»ÙĂÙ…ôù×ÓØë“«ÔÛ«‚ ½9½Ô½ëö§ÔÿÁ÷ÁªÔ Ơ›¶é÷ÁđÆƠXÁÙÚÙÚÅØ»ö›¾™‰kß [ïSŽ€Ø&ÑĂÉƠÚ³ôüÓô‘îƒØ¿‰Û«‚ ½9₫$Ûº“¼ƒ½¯â²8«dĂ¹£Ô›¶éït×ܱ»8¤‡×ùæ߈Ïű½ÔXᛜګ³«‡“ÍjĂƠ­ÅÙ׿ë¹Ôƒà‡Œ·Ôù×Ï̉¡Ô«Ú«ÔĂ¼°»œÜ‰¿I±»ÇÖÛ«‚ ½9™‰kß [ïSĂÈßÁÂưÀÍƠơÔ9¥‡¿ºÇœ—ˆ¡»ơêÏÔ¥ˆ]1™‡Í噉kß [ïS§Ỗ»ú±»÷Ùª‡’̀j˜‰j̃ZîSßÁƠXßÁƒv¼ëÏ̉ÓÔ½€àêóíêëöÛºëö¹ÚŸÜƠǼÆÑÓǼƒvĖȇׇº½€ºíÖéê9¥‡ù×ö«‡“ÍjÙÅë­Ø°ÁÛ«‚ ½9ŸĂăˆŸëö‹Ç¥ˆ]1ñs±»½Ô߈ç˜Ù½ÁÍăˆŸá å»å‡ơÔåĂÛ«‚ ½9ÅÔÜ‚‡ºçôÁƯ9¥‡ÿܱ»çÚ߈¹ÚÏÅ¡ÁÀÅÙÚ«‡“Íj†ŒƠXå̉ ưÀ«‡“Íj½Û×™‡™‰kß [ïSÅỘÔ8¤‡YÅàÍË)éÛ9¥‹Ç™‰kß [ïSơÔÏūܑơÛ%±»ưÀƒ¾‘Å—ˆñÚ‹Ü—ºăˆŸ;³Œ÷ˆƯơñÚ«»ơ‡±»ñÚƯ‰ƒàăˆŸ­·”½ơêØ×ß»ûƠ9¥‡×™‰kß [ïS™Á¡Ç±»©ÓĐĂÈĂôϹÚïƠä}ƒˆÓµỤ̀½éÓù×Ó̉ö°»߈ïæ›¶éăˆŸ;ûƠö» ¹á‘‹ù×û ƠăÉơ• +å¡Ơ1ÍBɇ·‡‘×8çרăˆŸ·#ß„ô»›¶éÛ«‚ ½9ÏÔùꪇ’̀j©Ó̀Ó£Ư¶ôüï½È›¡ÅÓ™‰kß [ïSø×«d·Ôù×£ØÙÅ뛾­ÖÓØñ‡™ëéå¿ĂÙ£ä«ÔÑÓơÔ«‡“Íj9¥‡øë£ÇƠ™¶Á½¥Ö¨ Ëû³ÏÔ‹Ü©ØÛ«‚ ½9¡ÛƠ½‹Û‰Ô”»“½ơÉ0Á¡Ôù×ëڟĵȰ¿̣¹ù꯽£°ƯƠÔóÇƯÓ Û«‚ ½9ù×ÎÔå̉ ƒØôÅ…ŒÆơÔùדƠ±ô¹~®¾áêÉÍăˆ¾Ù‡Ï9…«‡“Íj“Ơ¯Èÿ¯¶¶è«‡“ÍjÛ«‚ ½9¹ÚĂù×߈©¼9¥‡§Ø˜‰j̃ZîSăˆŸÇ™×ƠßÁûÓ·‡‘×8ç½£ØĂÙñÖ©Óèê¾ØéÓù×µ.¥Ù‡ÛüÀ ™‰kß [ïS˜‹µÏŹÚßÁ¡ÛѶŸÅ±»¶ˆ«·3uUéÓÏÅÏÅå̉ ơÔá¾ËÇÂÙÜçÚ‰Á‹Ü™‡éÓ½ÙÚăˆŸÎÅÏÅÆÍßÅ6Û«‚ ½9£ä©¾ăੇ¥2ßëMǽ›đö§Ô‹…½ơêÆÅ ăˆŸ;£Ø™ÓƠ«ÔûºóÂù×·Û/½ô«ÑÑÓÙÚĐÄêÙ½¿à˜‰j̃ZîSñÓơêë ä̉Û«‚ ½9´†ÏÔ™ÁÁƯ¦ÈÇÛÀщĂÎáêĂĂ ›­±àéMđöí‡ÇÜñÓÁ¸«Ô±¿„Ç̉̉ǻ™ëéå¹Á¾Ở±¿ÏÔ«öÛ«‚ ½9Ă˜‰j̃ZîS—¶‡ŒơĂ£ØÍëÚÿ¯¶Å³ ăˆŸ;kßÚç̉ÏÅĂÙ½€±»ưÀù×ĂÙÏÔơèÅ«‡“ÍjÏÔ߈ĂÈÑÓ߈ÿÚăˆŸà곃ˆ×ÓûÓÙ½߈ưÀ™ºØ×Úª‚ +¼9ă»ï½‡Œ₫׃văˆŸ;ÅØỞºåĂ€º‘à¯ÈĂÙßÁÏÅùëÇ™‰kß [ïSơêÁĂؽ…ø›‡ºĂÎáØ¿ºÅn¶¸ơÔÿ·‡‘×8çñßڵثÚăˆŸ;ù׫dưÀëđÁÛÛ«‚ ½9ëöÄ–ơêƯô߈¯G‹ø÷Á©Üù‡ư“ù×ùæÍÔ±»›¾÷Áá₫½Ô©‡¥2ßëM¾í‡щÀ½»Ø¯¾ÅÁÖ¹‡ù׃ˆƒvƒˆÑĂî%ù×Û«‚ ½9Ÿßר¾›ÚÏÔùÚÜü¦†߈±»ƒvôÄÛÄÓ±Ưû°‹Ç‡ÚˆÇ•ǘ‰j̃ZîS¶$$Û×щù×­vƒÖ•ÛíÓÛÀ‹Çººà™ĂÓº¹ÚưÀăˆŸ;ßÚ²zµÏåĂÿ¯¶ơê½Ï½ëöÏÔÏÔü̉½ØüÁÙÚǼÜÓ §Ô±¿°¿å̉ ƒvïÅÁËù×ú‹ƒv߈“­½¼½Û«‚ ½9¡%½Ơ—Ûù×ăˆŸëö§Æ Êû¥ˆ]1º„½ô¿·ÔŸ}«Ô¹¾“ƽ€½¯È³ºóßÚ˜‡ưÀ‡“Έó®ö­ ĂÙÏ̉ÏÔÍË)éÛ9¥Ă«d»©ƠÏÅÀËỞ±Y₫.ñÓ߈ÿ¯¶¡ÛĂÈ¥ươê߈²¯‡—¶³¹ëöù„ô™Ô±»±½«Óƒv·ÜáƠ³ÁƯÅÀƯơ™×ƒµØóÇÙ½ö™‰kß [ïS߈ü“ßæËÉ9±»ÏÅöÁåĂå̉ ß»ˆă»áƯăˆŸ±»߈ív§ÔÇÖ¿́‡º‡̣ƠƯơĐÄê½ô˜‹±»ºØöïÚÓºÙÍÄ)¡»ưÀ“¹ƯNöëöù×ù×ÑÓĂƒÏÅ¿ºµØÛºÁ‡é/×:Û«‚ ½9‹ÜÏÄưÁ‡ÇÏÔ™‰kß [ïSÓØ­ß‹Ü½ÙÚ»ø·&£Ø½€ëöéÚ›¯ÈáỠ„»Ù×ÛÛ×—¶Ï̉߈Ÿ ÿ§™‰kß [ïS›ÚôÙÚ©‡¥2ßëMÙ½¾Ï¹ÚÑĂÛºùלÂơÔÁă«»ù×ÓºĐ•Û«‚ ½9˜‰j̃ZîSư|Ï̉¥à•ÿ€ÄơÔ߈ăˆŸ;½ÇÓÏÔñÖöÁ…çưÀÛ«‚ ½9ùéË ù×󫇓Íj•Èû›ÅÓ—»ÏÚÛ«‚ ½9ëÓYƯDư“ܺ§àÏÆăˆŸ;óÔ©‡¥2ßëMíÅØ¥Û±»¡ÈÛÙå Ëûß»û÷ÙÅØÏÔº±»ơÔ¹ÑÄëÿ§°½±»«»ĂÙéÓ™‰kß [ïSÏÄ@ÍÄÂÁƯùëù×™ÁîÅÛÚï‰ÏÔù×Ë̉¯Ô±»ÔXƯÓ ăˆŸ¿‰щÎÅÏŰ»ù××¾ËÓï̉±»Úª‚ +¼9Ó¾ưÀ„ ˆ₫9¥‡Ë̉߈ÂÈÀƒv‡º³¼å̉ éêÓÆ±»Û«‚ ½9߈Û«‚ ½9½ĂÛº߈«»ù×ÿ¯¶÷‡¿àÿ¯¶«‡“Íj׫‡“ÍjœÁ¹Ú¡Û¼°»÷Á™‰kß [ïS¹ÚÿÚºØÎÅ¿ºÏ̉ÏÔ«‡“Íj«‡“Íj±Óí×ívưÀ‚ö«·3uU½€Ï̉©¼¡Áß„8¤‡ÖÏÅÄôƒvå̃Œ Ú, ½ĂơÔæØƠ·Å±»Îϼ¬Ö‚½Ÿ ÅÛ«‚ ½9#Û×±»ÑÓùêÖÆèçÇ»ä×’º‡Œœ5½¬ÖëöÓº̃ˆÛÇ•ÜÏÔ¯ƠÛÄÓ™ÁơèÅ“½£ä³ÈÙ½ùׯ×ÑÓÛ«‚ ½9ĐĂù×´½ ©À—¶ăˆŸĂÙơÔƒvÛ«‚ ½9ˆåƒ”%ƒˆ‹Çƒv™‡«‡“Íj›ù×ȋܙ‡™‰kß [ïSÿÂù×»ƯưÀỞö±»›¾å̉ ùê·v±»ù×ưÀù×Û«‚ ½9Ó׾ŷå̉ ùë¡ÔÿÛ“ƠçĂÈÓ‡Œ¿#ĂÙ½÷Ó̃ˆ§Ôơê£äăơÛ«‚ ½9ÁÙưÀÁƯÑÄë‹ÓºÎÔ¡ÔăˆŸ;ƒvÇØÁĂÜÂ!¥‡ëöù×߈µØ½ë¼™ëéå¹ÚÅØëöƠ›Á½€Á̉ñÓ¼ÈV½̃ơêö¹Úºyà»Å§Ø‰¿I½₫§ÔÚ½±»ø¿ÙÚǽÛÆ߈ÏÔÏåÑÓëö°È Ù½ƒvñÚÛ«‚ ½9ׯ³Ơ·‡‘×8çù׫ÔÍÄ×Ú»½ù×߈©Øùë÷Áÿ¯¶¡Ô½ô£nß»û³ ™…߈Ïű»ͪ¹Ú¤ˆ\0ŽÛ«‚ ½9ưÀ‰¿IưÀÙŒë*«߈íÙï½ù×—¶›¾ÍË)éÛ9¥«‡“Íj×ÓçÚÙº™‡Ú×ׯ¶ÔỞ°»™‡ưÀÛº¾«‡“Íj•Ûź›¾½÷ˆß»û½ĂÑÓÍåÛÀ߈ơêÅØÏÅÏÔ½ûÓÛÆº߈ĂÙ¹Ú÷Ú½€ï»±»¿ÅÙ½» ׇ‡ư2¾™‰kß [ïS—¶Û«‚ ½9߈ÅÔÙ߈­!°»êöÙŒë*«ă×Á‡é/×:ßô¹ÅØÏÔËƠØÓ× º±½½çơÿ¯¶ÇÖ½«Ô§Ó«‡“ÍjÁ̉™‡«dù×£Ô¡ÔÛ¸Ú«‡“ÍjÖ¹ ÇÖÍƠƒvï³2ăˆŸ;©Øá úĂ߈‡Œ¹Ú›¾ÏŹڙ‡ÛÀ¹Úơ꫇“Íj¾ĂĂĂ«‡“Íj™Ô¹Ú½»¥Óå̉ ÍÄ­ÖéÚ½—ÓµÜç'˜‰j̃ZîS×Ơ†7§j·º¨¼¶Üg¯ƒ« +>Ăâ›¶éÁ̉éêÁ̉ƒß»ûăàĐÄꘉj̃ZîSáăˆŸ;ăˆŸû«&ׯ÷Á÷ÚçÚÛ«‚ ½9…Ơù×ăˆŸ;9¥‡×©Ø­vív³¨º¿Åơ»ë™‚˜Ó´Ă&Óí”ºăˆŸ;ª»Ù½£…ưÚĂ¼ù×¼›ê“¹ƯN¼‡±»èơÙÚÙ8-¤‡-ÖưÀ«‡“Íj₫®¶Ơ¿À™Ó×ƠÄƠXĂىԓȵaߌÛ,ùשbù×ÍÄ󯃫 +>ơºÿÚÑÓ¹¶â½›¶é¬¾ÑÓ߈©‡¥2ßëMÏ̉²ÆÁºñÓ÷Á¯¼‡‡Œ™Ó›‡‰¿I8¤‡߆¡ÔÑÓŽôêéêܺ̀Ê)èÛ8¤µØׯ±»«Û«‚ ½9ÑÁÍÓ±»ËàăˆŸ;k‹Ü̉Æë˜H²ÆÍÄ߈ÎVơÔÙÚ±̉µÈÁ‡é/×:ƒ‚v‹ÈëăˆŸ;ÅÔĐØ¡Á«Ú±»¡ÈË’óÇéØº‹Ç‡Œ¹Á©Ø¹Öù×½öÿ¯¶ƠăˆŸ¿‰«ÔÛ«‚ ½9ÏÅà½Û«‚ ½9ÊÓƒÓ߈8¤‡§Ôö÷¶¶Ôëö½àG½¹™‰kß [ïS‰¿IшÜÓ ½ÁÛ«‚ ½9ĂÙ½€—ˆƒˆÏÔäô½•QöÅÓ®Ợëö³¥ˆ]1¡Ø«‡“ÍjƯÂëö«‡“ÍjăºĐÄê÷Ú¼€ßÚưÀù×û‰×¾ä̉Ù×ÅÔæÚ§Ô‰¿IËÓ›¾Û«‚ ½9¦ô—»­Ä©‡¥2ßëMÛÀ™‰kß [ïS©ÇíÆ߈ëöĂëö½ô©Çé·ÅÓăˆŸÍÓÙ½ÓØ›¾ưÚöÂơê¡ÓẲ÷Ú‡¡ỖˆÿÛ©î´È +ÇÖĂÙËÉ9ĂÙûÙ·ÔăˆŸ;ù×íÚ“Æöˆäô‡Œùêƒvù×—»«·3uUç®§Ô³¤âˆ:î»ĂÈÛ«‚ ½9÷Áëö—¶À‡ € è/ Ö: ƒv÷ˆ™‰kß [ïS½óǽ‹È߈ôºÚª‚ +¼9Ă9¥‡×‰Û™‰kß [ïS•ÜÅ–߈₫Ú—ˆ¡̃ÙƠ·ÔÑÓ±»½ĂƼÛ«‚ ½9ÏÅ—¾®ÈåĂă½ÙÚ—ÓƒvÁƯØù×̉Ø«‡“Íj߈߈™‡ăÁƠ‰Ù½ĐÓ›¾‰¿IÁ½›Ú›¾€Çº©À¹Úơı»ëöưÀÛ«‚ ½9ÑÓ÷ٱȓȃàÙ½À¹ăˆŸ;k­Ốv¿ß³àù׿߅ÖïƠ™‰kß [ïS³ÂĂĂÏů¾ÙÚ½ĂăˆŸ;Žăơù÷Á›¶é±»«‡“Íjÿ×·ÔÙ×éÓ÷ÚÏÛó‰ÛÛ¦½Ù½«‡“ÍjˆÓ?ßÁăơƒ ¶ÔßÏ“Æ÷Á·¼©¼ÏÔâ½’€¬Äóǽº•%ÏÔÛ«‚ ½9±»éê½ËÉ9£ÇŸ}ơêëÓ¡ÁñÚƒv©¾ÈĂÓº¾Ù½™‰kß [ïSÅØÅÓÑÓÇÖ¤‰̀L„ÆØ©ØÛềĂ¯G‹øÜÙÚÿ¯¶ßÄÙĂ ßˆ™‰kß [ïS§Æ±»ăˆŸÁÛ«‡“Íj·Ü°»å̉ £Ó«Ñ÷ÁÏÅÚÀ÷ÁÂÙŸƠ¾±»¹Ú—¾™‰kß [ïSÓ ÷ÔíÁË%9¥‡…»­‡ç̉•Œ” ́vÁ̉½ơê©Ó°»˜‡¿‰ƒv¡ÔÙ½ƒÀÛºnơÔ% +ĂÙ˜.È.áÂơÔÍĩغÁµØÓÅơèÅ¿‰¢X̃ˆß»ûơĂÿËÿ¯¶«‡“ÍjỞưÀ™ôϼÍĂÏıȧôăà÷Ùá°…Û·È™‰kß [ïSÓºÙ½Û«‚ ½9¿́˜êè亰»ÏÔφÚË̉Û«‚ ½9…ØíÖÛ«‚ ½9ăˆŸŸ}Û«‚ ½9§Ôïi™‡¡Áíê“Ơ¯ƒ« +>å,º߈™‡̃ÄØƠÛ«‚ ½9¸Ú%Ù½‡‰Ôï»íÓöß»û¹Ú•Èû›™‰kß [ïSÎŪÔÄÔỊ́ÅÔ±»»¹Úï²2ù×ƯÓ —¶¢XåĂÅ–ßÄÙöÁóĤˆ\0‡Œ½¬Åç̃ùç½Ô©Ó̃ˆ·Å™‰kß [ïS¤!̀³¿ß»û߈ăˆŸ;kÉ̉ÔX›·Ô«‡“ÍjÁÓ«‡“Íjù×ÏÅù×ÎÔ°»¶¥;ăˆŸ;kơÔơéßfÅØñÓ™Ó߈ăˆŸ;³È˜‡½›¾™×ñÚ₫'«‡“Íj‘±«‡“Íj퇭K˜‰j̃ZîSÏÅ¿ăˆŸÙ̉Ö‡¼7ºÅ™‰kß [ïSù̃Ôơ©ØưÀǼ’ƠăˆŸ;ÿ¯¶¢ÔĂÙêöµßƒÖ©Ó™‡’ÇÙÚƒv™‰kß [ïSơÔ½ÛÄÓăˆŸŸÖŸÅƠî…æÿÚôêʹ +˜‰j̃ZîS½Ù×§ô½Û«‚ ½9›âˆ¡Û«Ôóԣأ ©‡¥2ßëMß»û¯¼¡Ô‘÷Ŷ  çÚ™‡ÙƠ¥Üív½€ù×—Øß»ûÇÖăˆŸªĂÏÔ÷Á߈éº߈Åơê½€àƠ›¶éß»û“Æß»û™‰kß [ïSÑÓƒ½9¥‡ÏÔƠ‡Ú¡È¡Ô«‡“Íj³êÔ«·3uUß»û¡È¿‰±»–»9¥‡³È»Ø̃ÅăˆŸ;ÅÜÇÓÿÚÑ·Ï̉®¼«Ô9¥‡…íÁ™ôƒ×óÇ«‡“Íj߈ƠXåÉ›¾ƒÖ½ăˆŸ;kóǓȺöëÓ™‰kß [ïS߈§ÓÙ½ÏÔ¼ÅÙô•Ó:±»˜‰j̃ZîSƒvÏÔ™ÓơêĂÙ·‹߈÷Ô—»ÏÅăê¡ÈÜÛÄÓƒˆăˆŸ;ï²2É9ºÅ9¥‡×ï»á=‡ºăˆŸ;ƒv¹ÚÁ½ˆå¹Ú‹ÇÛ«‚ ½9÷Áƒˆ±»¯ÈÅØ¶èæÚơÔơêïÜ›Úù×°êØëÖù×£äå̉ æÚ¿à₫®¶÷Áơê·Ô½ĂÈăˆŸÉ̉—¶Û«‚ ½9ÅÁ«‡“ÍjĂ¼ÅÔ³ºóÍÓÙÚ¹Ú»Åçëö9¥‡×ăˆŸ;k¹Áù×ăˆŸ;Û«‚ ½9›¾í‡ơ¿ÅíÆÙ½ơèÅç'÷Á›ÚưÀÏÔôăˆŸ;k™ô±½£ ߈µ4óÓ«‡“ÍjĐ¹%µaÛ«‚ ½9ÏÔÅØË ăÿ¯¶×Û½¤ˆ\0Û«‚ ½9Û«‚ ½9ÑÄë¸ÚƠù×Û«‚ ½9ô¢X÷ÚÙ×Û‡ÙÚÂÙÆôËÉ9™‰kß [ïS¯ƒ« +>Û«‚ ½9¸£߈µØ‡ƒṽˆ¥Ûÿ.ñÆÉ̉ \©È¡ÈÅØÙÅë²Âëö߈ß»ûù×߈ÅƯÚ₫.ÿ.ç̃ɹι«F߈Ù-ϼ‡º‰ÛáƠ±¿ÿ¯¶ó«»É̉ù×÷ÁơêóÔÁĂ›¾ăˆŸÆ™‰kß [ïSÀ½‡ÏÅ™‰kß [ïS×$gÏ̉ÿÛŸ»ÿÛä̉ù×›¹ÆÜ–»áêÁ©™ëéåˆæ ߈ưˆ—¶èơÁÓG½¹ŒE ăˆŸ;kµ†ëöºăˆŸ;k߈‹ơÔưÀÅÔ•%ÆÑÓ߈Í“¹ƯN«º½±»Û«‚ ½9±»×¿8Û«‚ ½9ƒv±»ˆgÛ×ñ¿™‰kß [ïSÉ’‰s2ssÔ,søsưÀù×Đ Ù™‡ăÇí—¾ÄôÏÔóÂ½Ă“Ơù×éÓ©߈ƒvÑÓ«‡“ÍjÍÄÇÖ×µÛÄÓ‡ÚÏÔ°»ïÁÍçÚÔơ ÍÓÜËÇáƠÓØ₫ !ö«‡“ÍjăˆŸ;k‘đ·ÅÏ̉ëöûر»©ÇºÅÓÖ¾“È›ÔÈ»ĂÙ‹Ù|´£äŸĂƒˆ₫Ơ­á¬Û«‚ ½9Û£»ơèÅÙ½ø×ơÔÏÔ€ºÙ×åĂëö‡Û¹Ú«‡“Íj’ÆĂÙ›¾Úª‚ +¼9̣›v–»₫¡9¥‡ØÁ‡é/×:¶‡Ö8æëö­ÂƒÖÿ¯¶—¶±»Ó¡ÛœÂ˜êèäöÛ«‚ ½9½ôÙ½¡ƠχÙÚÑØ‡ŒÔXƒvëö»Å›¾Ï؉ j ̃    Z îS Ơ¾GơÙÛ×ù×ÑĂÙܾßăˆŸ;÷‡«È…»¡ÔưÀ󹻨ù×™ôáö£ä¯×ÁƯ¡È߈÷‡ëÖ°»Ž®»Ø«‡“Íj—ÓÁƯ¾ÅͽĂ¼¤ÓÛnß%ÏÅß*ÍĽĂưÀÍË)éÛ9¥«»¹Ú•.‹ÜăˆŸ‰®щ½¹Ú¶̣µØ«ÔßÚÛ«‚ ½9—¾ív9¥‡ăˆŸ;Ơăơ±»ăˆŸ;ÿÛ¼Œ4×ƠÅØe½°»¥ØÜïçăàˆ·Ó ¥0ñÖÙŒë*«ăˆŸ;kñ‡ù×·ÔÙ½«º™‰kß [ïSñÆÁ½î»¹Úơ÷°»߈‹Ç™‰kß [ïS¡Ô©¼«‡“ÍjÛ«‚ ½9¿ÈăˆŸơð»߈›ÚơÔ߈ï³2ß»ûÇçÅÔ÷ÙÏŵ|©½Ǽù¿ƒv›·Ô½ơÄ¿‰ÁƯׯí—G¡ÈÛ«‚ ½9÷Á¡Ôùש‡¥2ßëM«‡“ÍjéÚøê9¥‡™Ôí‡çÚù׋ǂvIÏÔáê¯Û½¶¹›Úζ2tT«Ô߈Ë%™ëé嫇“Íjƒ½—ˆ™‡éêƠéºĂÙÊÇ÷ÁÙÙÿƒˆ½€™ÔÛÀ©ÇÅÀÙ½ô±»†x÷Ô£ØËÉ9™‰kß [ïSïÚ߈ù×½€íñ«â˜êèäÁ™‰kß [ïS£ÇÏ̉ÑÄëÑÅơÔ‹É0Ÿ}¤Âå̉ ›¹‘Æ™ëéåÍÄϹñÖëöÛ«‚ ½9óÇ–¶©¼÷‡ׯ¬ØÁÜÛ«‚ ½9áƠƒ¾‘ÏÄ‘ÆñÚ߈ŒE¸Ú÷Q­½¼›‡³ÈĂÖĂÙ…ŒĂÙ߈ˆ›Ú߈•Œ¥Ø‹Ùå̉ ĂƠăˆŸ÷ÚµƠù×™Ô™ôÅÔͺ™‰kß [ïS»ºăà›ÛĐ¹™‰kß [ïSĂ™Áß»û9¥‡³ºóÙÓ⦅Ơ¯È©àÏÔăˆŸ›¶é釋Ç×Ơ‹ÇüÆ­Ä™‡Ô]£ƯơĂ¢»ùׇ½·‡‘×8ç‰Ûïųb§\±»ÑÄ냈ö©‡¥2ßëMĂ¼ơê±»³ÂŸóщÁ¹ØÓĂº9¥‡ơÔÀÙÔXƒv­ÄĂĂï½ưÀ‰'́ÁÏÅó"ªÔívƯÓ ר™ëéå¶vßÄÙ±»ÏÅơÔÙÚ™Ó›Úơ»ñÓ›¾­ÄƠ‰ă™‰kß [ïSÇÖƒv›Ú«â™‡½™‰kß [ïS9¥‡߈Ú¢X ŽôÚÀ9½Ï͇‘Æ›¾Ä»ăà纓Íçm£ØØŒê*ª±»ÅÔ±»ĂÙªÚÿÚƒˆÏÅÛ«‚ ½9ơÔ߈½ăˆŸưÀ—¶ÏŃ×ÉÙô»ô¼Ôƒv±»Á·ïͪ›¾ơêÅØ“Û˜‰j̃ZîSËl9¥‡ăˆŸ;±¿ºơö¶щéĐ÷‡µaÍÂ߈Ľ±»ÚÀßÚ—¾Ë¿ùד×߈ˆÿ¯¶ùׇܢÇẳ×¾ÿ¯¶œÁ±»˜êèäÿÇ»ØÛÓÆëÖÑæÏÔ™‡öÁ +„ƒv•ÇÓØË¿½¡ÈÙŒë*«™‰kß [ïS³ÍË)éÛ9¥Ó߈½€Óº¹Ú™Ôá걻cvívén¹Ú‡Ú÷Ô߈߈¤¾ ¹ÚÏÔÿ¯¶ƒvăˆŸ¹Ú½¾‡ç'À̉ööëöù꫇“ÍjǽÏÔĂôÚÀ«·3uUăˆŸ;‡»ÿÚ‹¡åĂéºơèÅñÓ”%Û«‚ ½9à=äÁ§Æív«ÔĂƠ߈¶ÅÁĂÙ½™ÓăˆŸ;ÏÔ麙‰kß [ïS¥Ûøô×Ơ…bñĂٽƒvª‡’̀j‰¿IÏÔ±»ÁÚûÆÁ̉ÿ§™×·Å¬ôŸÖ™‰kß [ïSÛ«‚ ½9́Ú߈ï³2üÀ¾­Ä÷‡”ÓbåºøêÁ̉߈¡Û›¶é½¹ÅÏÔƠ†ÓÆóÂͽÛ«‚ ½9åä̉á=ÏP» Ú׬ô穽¹àùêñÆÅøƠ¾G¿ÅưÀµØ߈Û±¿›ÚÇ÷û‰¿I߈™‰kß [ïSÛ«‚ ½9߈¹ÁË̉Áº½çÚÁ¹‡Œ½€÷ˆƒØ˜‡ Ù½½ê˜H'ËÇß»ûï³2™‰kß [ïS«»ÏÅÑÓ¿ëÑÓ‹ÙÏÔ°»‚v«‡“Íjä̉±»¬ÅĂù×ù×Û«‚ ½9ƠÿÚÛ«‚ ½9ù×щÁÚñÓÙăàÁơèÅÙ½çÙ½ùêñÖ¡Ûÿ©ÀñÆ·Ô‚Ø ĂÙ“Ơ¸ÚñÚÙÚ™‰kß [ïSëö÷ˆăˆŸ;á ªĐÅØí½ù×½Zû(–ˆƒv/§ÆñÚǾÏŻػˆëö§Ô™‰kß [ïS÷¼ϼÏÅ—Ó­R©-Û«‚ ½9̃ô»ëëÚ«Ô‚v«Ô߈µ†Û«‚ ½9÷ÁûƠÛºëö‹Ç¼Ă¹Ú¶ôƒv“Ơ£ä™‰kß [ïS¡ÛÏÔ¶éÚÏÔ8¤‡±»¡ÛÅÔ™ëéå߈—¶ñÚÁñÓÁ­Ä‚ŸÖ“ÈçÚáƯóÔù×߈¡ÛÙÚÛ«‚ ½9µØÏÔ»†ÚÆß»ûă꿉“¹ƯNŸÅÑÓ…¼ÛÄÓỞ‚vÏÔ“È·̣ëöÏÔ™‰kß [ïSơÔöˆ›Û±»Ù½ơćñ5ÓÆơê˹–¶ÿڂدș‰kß [ïSăˆŸ½çÚÇâù¿ĂÙẳ¿™‰kß [ïS‡ñ5Û«‚ ½9ßÄÙÿÚ³ÂÏÔÎÔ‹ÈơÔʹ½…Ơÿ+Û«‚ ½9ÍÓ󋫇“ÍjÛ×™ëéå9¥‡ù×ÊÅÙÚ©ÜﻡÁƒÖ¿ºíºŸ}ÙÚ½¡ÔƯ ߈ÑÓº½Û«‚ ½9áÛ߈߈ÏÔÛ«‚ ½9ĂÙÿÚ¡Û‰ÔçÚúØÁĂëØ™‡àêϼ“Æ“ºÚ×ÅØ™‰kß [ïS×ÜĂÙ±»­½¼Ûº±ëؘ‰j̃ZîSß֩عÚ߈ƒàÚ×ă໕ëö¿‰÷‡Ú±»µÆßÚG½¹ùײ¾“Ơ¯‰y©Ơ߈ù×ăơ£ØÙÓĐ߈ÿÚñÓ°¿§±È™ÓƒˆÓß«‡“Íjß»ûÙÚ·ô§‡ÇØÆÁÛ«‚ ½9Å1ÖÆỞ9¥‡·‡‘×8çæØ÷‡߈ÍË)éÛ9¥á$8¤‡™Ó9¥‡Çè°»¡ÁŸÖ›»ơêÜ»ÅÓØ™‰kß [ïS‚ˆß»ûĂè«ÔçÚ́½ÁƯ±»·‡‘×8çéÙÚå̉ ÇÖÛ«‚ ½98¤‡Ï̉±»¿́Á9¥‡̀Ó‹Ó9¥‡åĂÙ½ÏŃvÚ½«‡“ÍjưÀù×߈ÍÄŸèÏÅÛº½Ăù×Û«‚ ½9ÙÚívŸ}óĂëö†ÇÛ«‚ ½9ñ¾ĐÄ ê ËÉ99¥‡߈ÓØÙÚ½ÏđӃv™‰kß [ïS™‰kß [ïS‡,ù׫ڳÈáêô™‰kß [ïS¿»¥ˆ]1ơ$û…ĂÙ‚˜êèä«ÔªÚŸƠ¡Èß»û¥µ«·3uUù×ó·̣¿ôƒvÙ½©ÓóĂÈĂĐÄ걻ƻÏ̉߈ÑÓóÇÏÔá ª¶2tT‹Ü©úñÚÛ«‚ ½9‹É0ÑÓ»ØÛ«‚ ½9ơêÛ‡¡Ûù‡½ÿÚ¾ƒˆ§ƠéÓ¿%ÎƯâÏÔëö÷ÁÚª‚ +¼9©ØÙ×›ÚƯ½ÑÓ¶ô ÙƠ—ÁÙ×§Ó”…eÁíâˆ:ÏÔۓƃvÛ«‚ ½9ÅÀ¥Æ™‰kß [ïS‡Œ«Ú™ôùê©Ø½€ÏÄå̉ ¥ˆ]1ª»Ù½‰àëÚ»ƯÚª‚ +¼9ƒ½Ô¶»Á¡ÔÛ«‚ ½98 ¤‡ ÖÏÅĂù×°»†ÚÙ½Û«‚ ½9«‡“ÍjƠ…Ø©í¾9¥‡߈̃ˆï‰ñ”ơêĂù̉›¾ƒˆ«‡“Íjºǽ߈¾ØĐÄêÏÔµ†ăˆŸƒˆ•·¦D ‘Æï½÷Úß»ûÓµ‹Èơű»°¿ăˆŸưĂçÚ·ØĐÄêÁĂçÚăˆŸçÚ±»«Ôơê•ñ߈ƒvË ưÀ«ÔơèÅóÇá]1—«‡“ÍjÛ«‚ ½9½î”¨Ơ½öëöăˆŸ;™‰kß [ïS«‡“ÍjÏÄ¿º½ÿ§ÏÄŸÖÙ½Ưʤ‰̀L„ơ¾»Ơ…Ö«Óă‘·¨ÇÓ¾߈ŽÑÓ‡ŒăˆŸ;ËÖ…»äÁ™‰kß [ïS±»å̉ Ơ›·ÔÏÔơÔËÉ9Ï̉߈éêÅÓÙ½­ÖÛ«‚ ½9̃ˆ&«‡“Íj”°å=À ëö±Ü±»±»±»½ÍÄÂÙĂȇNjÜÇ öÁá̃¯±ăˆŸ;›¶é¡ÔÚª‚ +¼9ŸĂơèÅ«‡“Íj©đßÄÙ«‡“Íj߈ëöù×ßơê±»“ƠăÄô‹Ó«‹™‰kß [ïS±»«â°» ù¿Á|ÅÙơÅ­½¼âÄ“ù×½”{߈Áɱ6ߌÛ,½€óÇóÁµØ߈÷$™‰kß [ïS¿‰ĐĂÏÄàêàêÛ××ÚÑÄëøôñÄÙ½Úª‚ +¼9½€‰ơ‹Çéç¿ß·Ô±Ü±»ăˆŸ;¤ÓëöÿÚ₫®¶ưÀ±»̣DŹ·‡‘×8çƠ¡ÈóÄÏ̉ÉÙÀË ÏÔÏåÁùººöÁ‹ÇÑÓ´ÊÈ9÷$˜ÁùÉçmÛ«‚ ½9×$ù×ëö“Ơ߈·‡‘×8çÿÚ̉̉¼³(ăˆŸívƠ±»«‡“ÍjĂôơԩڵة¼½€ú’ÿ$¹̃Çñ»Ă«‡“Íj9¥‡÷Óó#ĂÙ×¾ö¥ˆ]1ƒÖ°¿›¶é½»ÂÙăˆŸ;k±»ù׿ÅÅàǺï½½›Û˱¹Ú¡ÔÁƯÁƯµØưÁÏÔ™ôí—G9¥‡ź÷Ù™‡ó‘̃Æ߈½¶  ß½Úª‚ +¼9…ÔÙ×ơêåĂß»û¿ßƠÍË)éÛ9¥ö¯G‹øÁößÚ£̃ÙÚëöµØ£ÇƯºñÆơêùÚù×ËÖÄÖ‘®ƒ߈ăˆŸ;k±»ëöŸÖÙ½™ô±»™‰kß [ïSƒv»ØÿÚÆö߈ÑÓï½™‡©Óư§‡ÏÅ5ÏÄߌÛ,½€₫¼Û4«‡“ÍjÚª‚ +¼9ÿ×ÁƯă½¿àöÁù׵ػØÓù×߈™‰kß [ïSßÄÙóĂ߈¿ªÜ ƠơĂù×߈ÛÄÓÔôéʹÏÅÿڻصثӷ‡‘×8çß»ûƒˆù×ÏÅơêÙ—Œ߈ Áù׃ˆÅ؋ӱ»Ü«‡“ÍjáƠ¡Ô™‰kß [ïSĂƠ¿»¡%ùê¹Ú®¾¥ØÁƯÛ×¥ÛÏÔƒˆÑÄë8¤‡×½ËÖ߈¾¯ÛŒEÏÄêö‡ºƠÊơèÅÏÔ¿ºơê˜Á̉ æ¡ÔăàÉÏÿÑàÔÊñ9¥‡×¸Á«»«‡“Íj›¹ƒÿÚßÁÙÚÀơؼ¹ £Ø‡ŒăˆŸ;¡Áă½ßÁ±»¾$«·3uUË¿ÏÔÿÚ½¯¾ăê‹Ç—ˆ9¥‡ưÀăˆŸ;kÅỐƺº©à8 ¤‡ Ö‚½‡Çï‡çÀÁ½ăù×·Ôù×™ëé囡¦́·Ôµå̉ ‡ŒÛ«‚ ½9äÆå̉ ½»ØÛ«‚ ½9°» +߈›¾—ØÖºåÁ ´† ߈ÑÓôÄÏÔÛ«‚ ½9釛¡Ÿw¥Ø½Û«‚ ½9£ ½¿Æ Û«‚ ½9³Ç°»ù×Âׯ¹ÚÛ«‚ ½9½™‰kß [ïSóÂëöÇÖ¼Ơ¼Ÿ}óÂĂÚăˆŸö$¶Ù½ưÀ× ‡Ú߈ƒưÀ‹ÇÑĂ³Èëö™ëéåÏÔăˆŸ;Û…Àơ«Ñ£ä×Àÿ‚vׯ§Óơ™ƒ¾‘ëöăÁĂÙ™‰kß [ïS±»ăˆŸ;«»”'«‡“ÍjƒÄåưÀçÚ̃ÄØ™‡ơêçÂô–/ËléÓ«ÑɇùơĂÙùºí$‡Ûû!ơèÅ‹«-‘ù×ÁçÚá ôêÇ̉ÅÔ°¿ăˆŸ;̃çÖÆáêỞ©߈›¾¥ˆ]1¡Ôù×щ“ºÎ̉—¶u›¾߈ơ'÷¼ƒÖá̃™‰kß [ïS‡Œ°»¶§ÔƯÂƠ߈ăˆŸ;¡«Á±»¦ÔÇÖźăˆŸ›¾“ÆÁĂÜ ¬°àèMĂÈçÚ¯éáÛ«‡“ÍjăˆŸå©¼•Èû›…à‹ö9¥‡ÏÔÙ½ƒÖ꛾ùơ‰¿IöƒÖ«‡“Íj—î™ôƒv•Ó¯G‹ø½€ÁĂ•ÓͪÙ×­¾ߌÛ,ßÚ±»«‡“ÍjƠ•ŒçÚ½à«Ôá ±»ăà %‹Ü§Ô³(˜ÁÏÅñ̉«ÚăîÙ½ĂèÁñóÇÇ̉¯È«‡“Íj¾‹ÛĂ ˜‡½Ôœ·̉ ¤0ɹù׿º¤âÙÚÅØĂƠË̉ñÚƒˆ•%°»߈¹Ú‰̉áÏŭijëöôÔ߈±»ăˆŸ;«‡“ÍjƠºmÙÚù×·ơé‰ñ5ñ·½ƒv‡º¥ˆ]1ưÀ·ÔƯïÓÔ‹Ç̃ˆĂÙéϹ“ÆÚº¥ˆ]1«‡“Íj¿ßÁĂÏÅï»ÇÖ߈ßÁÍåƠÄÍ­Û«‚ ½9ẹ̈Ú¹ơ¡¹ÓƠºm›¡ï½¤‰̀L„ưÀ߈¯×™‡ƒ9¥‡Ẳƒ¾‘™ÁăˆŸ;k¹Ú‘Ôôêù×ơĂ¿ºÙ½™ÔÅ«‡“ÍjåÔù×ÿÂù×߈µØí‡ÿÛ¾ï—ÓÙ½öơêơ¬߈R÷Á˜ơáêƒvÙÜÁæ©Ă߈¦ÓǺéJé‰Ó5“gesÁÅí´©Úª‚ +¼9Á ‡º½¿«‡“ÍjăˆŸ;ÏÅÏŃÖ÷¼Ï̉±»¥« ©ƒ»5ơÔƠµ¿‰ù׿Ùù¿›ÛùׂvÍÄ̃„âà:Û«‚ ½9ëöŽñÓ½Ù‡Ï9…á «»÷Áù×êö£»é‡߈Ơç̉™‡á—§ÓơêăÚ׉øÏÔ躣䱻±¿ơêш½äŒ¾N₫Ç,¨¼íê¡%ÙƠ‹Ù¡Áé‰ñ5ñ·µØ«‡“Íj8¤‡×ĂÙ¬Ö¹ÚĂ Ơ߈¤ˆ\0Û×ĐØơèÅ¥Ûé߈å̉ ™ëéåÙÚ›ËÍË)éÛ9¥¡ÔûØưÀÚª‚ +¼9ăÛË¿¿Å‡Â±»ùơƒvÚª‚ +¼9©Ó™‰kß [ïS½¶¶¥ÛÛ«‚ ½9‚v‡Û¶¼̀7ñÆư§‡“Ơ½ÏÔ×Ó¾÷‡ăˆŸ¥ˆ]1»¶  ‰Ôÿ¯¶ô‹Ç©ÇƠ­Ä¡È“Ơ·‡‘×8çíÖÏÅ€Ơ‡ÇÏÅƯÊ«‡“ÍjÍÓơăˆŸưÀáÛù¾ïç¡%³à½ØÍÓ¿ÁÉ̉«‡“Íj߈âơëö9¥‡×9¥‡×ÿ¯¶™‰kß [ïS« ©ƒ»5Û«‚ ½9ĂÙ“˜̃ˆù×ÏÔ‰¿IÓÅÇÖ™‰kß [ïSÎÅÛ«‚ ½9å̉ ß»ûù×¼ܾ±»‚Øׇ½7½ô¿‰Œẳ©‡¥2ßëM¯È‹Ù«Ô·Ó ¥0½«‡“Íj¹ÚçÖÿ¯¶¼Ăû(ÏÔ®¼ ߈˜‰ j ̃    Z îS ™Ó¯‰¯0—~߈Û«‚ ½9«‡“Íjơê߈˜‰j̃ZîSâ½-¯G‹ø¡ù×…Û›·‡‘×8çÿÚ«Ô¹ÚÛ«‚ ½9ƠÚưÀ£ÔϹáêÆ©&Û«‚ ½9µØ»Ó±»˜‰j̃ZîSÛ«‚ ½9µØÅÿ·‡‘×8çỂÏÅó#ơĂ₫ÛíƯÑæ«‡“ÍjëˆÓ龭ĽËNjǓƠ¡àƠܺ—ÚƯÓ ·ÔÛº³È¡‹vˆ›¾ĂçÚï½÷Á߈¿ôÏÄÁñëö½ù×Ơƒ́ù×å¿Úª‚ +¼9ơèÅÛ«‚ ½9ÏÅĂĂÑ·Û«‚ ½9ƠăˆŸ›¡Ù×ù×ïđ™‡ăà߈ÿ½߈ÑÄë߈ÑÓÛÀ«‡“ÍjÛ«‚ ½9¼Á=ă»–½¹û¼ñ–Û«‚ ½9©ØĂ±kѦ§ÓÍÄáƠƒvŸ›߈ö«‡“ÍjﻃvĂÈíơ·vÓç¥â÷Á—¶‡ºưÀ߈«‡“ÍjÅÓ˜‰j̃ZîSщó¶߈­ºÙŒë*«ù×Ó÷‡₫Û±»ëö ´† ùêƯÓ ±»¥ˆ]1Ûºÿ×ơèÅ߈­óÛ«‚ ½9ÙÚ̃ű»“é°»É̉Æ‹Èùƒv… ÷‡ĂÙñÚ·‡‘×8çñÚÉÛ¿à±»ñÄï½åèƒv¸Ú߈×ÜÙÅëY«‡“Íj™‰kß [ïSøêÉÈ߈ÙÚ¥ÆưÀăˆŸ˜Ó Ù×­Ä£‘½¿½øØ߈ÓØÛº¯È‡ñ5ơê±»ïiµØÓØỞµØºúî½½¹£ƯÓ ÙŒë*« Ç¯£¶¹Ú9¥‡‹ÇÛ«‚ ½9ÏÅív∧ô¥ˆ]1ﺃv©)«Ôóº´.¤Ù¡³ ëöù׃¡ÀĂ9¥‡£ׯ߈™‰kß [ïSÙ½·‡‘×8ç«ÔÁË«Úư毾ƒvå‹Ü¥‰ÍL…íçÓºÙ½›¶éê¼ +ù×̀Ê)èÛ8¤™‰kß [ïSÇ_¿ôăˆŸÛ«‚ ½9«‡“Íjٽ߻ûÍƠ°»“ÈÛ«‚ ½9ñÓ¬¼¼ë3â½Ù½’Ç +‡‹Ü9¥‡ÏÔ±»ÅÓ‰ÁñÓÙ×ơê½¾‡ÁƯÁƯ9¥‡íềÇ™‰kß [ïS­ÖƒơÛ«‚ ½9ß»ûăˆŸ;éØÛÄÓĂ Ơ±»ÂÙµaÛº™‰kß [ïSø×óÇŸÖÁ½·Â¼¹ÚƒvóÔăàÿ¯¶í‡ÙÚÏÄưÀÏÅƠø×ß»û™‡»̉¯ÈÁƯĂÏÅÜ̉«Ôẩ­ÄŸà¼Ô›¾‹Ü߈Û«‚ ½9¯G‹ø½™‰kß [ïS»ă«»½Ă“ÈÙ½åôÛÇƯ ߈±»ŸÖăêƠ·Ó ¥0÷Á Ëû¯×ÙÜѶôê±»‡ŒĽ÷Áëö㻩 éÚÏÔÅØÛ«‚ ½9߈±»±»½°»‹Ç˹¥ÛÛ«‚ ½9Ǽ™ëé图÷Á¹Úƒˆ‹&ƒvưÀăˆŸ;±M®¼çÚµí—G·Ôß»ûƒvçÚ›ÅôÎÅ­Ö‡Œ½ŸÈ߈´ÈÔXùסÔÀ‡€è/Ö:ÓØ“¹ƯN·Ó ¥0óÂ¥Âàê¥Ó«ÔăˆŸ;̣¶ÚÄ̉©Óá¬çô÷ÁơÔÑÛY™‰kß [ïSăˆŸăÉ+Ž¾ß ÙÚ߈œ‰¾IÄØ£äÙ½ưÀ¹Ú“ƠÂٵ難“Íj9¥‡±»ù×½¯à£Øù×ä̉®Gø½™ëéåăˆŸ;ÏĽÁÙ½±»µ†ºÿÚ‡ÛÙÚ±ÁÏÔñÙÿ¯¶ăˆŸ;ëö£Óó߈°»±»߈âÄ•Ç÷Á߈ßÖÍË)éÛ9¥‘ÓƒÍÓë×ƠXĂÙưÀ‹ÓñÚÂơ»™‰kß [ïSĂËÙ½Ë̉µØ•Ơׯ±»ͼ­Ä½߈±»ơê·ÔÛ«‚ ½9·Å¾Å̀ĂÎ ÉÖÁĂ³Œ£Ø™‡›¾ÖØ¡ÁÛÿ¡ÛÅÔ›³¼ͼ¿‰­Ô«‡“ÍjåôÏÔ‘Æ©ÜöÁ ¬°àèMƒv¥Óø×ÅÓƒîúƠĂº©Ú½è«‡“Íjű»£Xơêïºíơß„›Úöƒv½Ë̉½Í•߈¹ÚÅÓƒvŸÈñ̉åôñÓÅØ£X±»™‰kß [ïS¸ÚßÄÙÛ«‚ ½9ßÄÙÙ½º±»ĂËÓ½߈éÓëö¡öÂÿÚơÓY®Æ—¶«ÔÙÅë±»™Ôvƒ½™‰kß [ïS‹ÜÛ«‚ ½9½ôÿ¯¶÷ä5̉©Ó­ÖăˆŸƒv‚v±»Ó©¼²¾Ç»Äö¯»­Öï½߈¹ÚĂ«‡“ÍjăˆŸ;߈ƒv«‡“Íj󵯿êöÁĂÙóÂƠçô÷Á±¿˜Ù÷ˆ¿ø£»÷Á½È˜‰j̃ZîSÛº›¶éÛ«‚ ½9ßÖăˆŸóĂ£Ü«»Ó¯Û¾±»Íù×ăÛív¾ß½Ô«»߈߈·Ôµ‰°»Êñ“ÈÍÓăÁăˆŸ;Ù½Ơ˜Áÿ¯¶ÏÔ½ôñÖ½ëö›Ă™‰kß [ïSƒˆß¡È·ÔĂ›¼½ÔÛ«‚ ½9®ÈÙ½•ºưÚ½ô¿‡Ç‡¿ºé×ëö÷ÚàƠ‡ñ5ëööù¿¶¹Úº½̉ăê—»Ѷ̃ˆ½ÏÔ“Ơ½ôç̉ë”ć‹Ç°»Û«‚ ½9đÁ ‡Œ±ëØÙ×øê ÏÔ§ß»ûĐÓ¸Úö–¦̀»ô×Û»߈‹Üä̉ŽË0шŽ­Ø₫&ÏÔăˆŸ;›¾¥ÓÙ½çÚßÚăÇíïô˾ܶè₫™‰kß [ïSăˆŸ;̀Ó½¾›¾̃ÅÏÅÑŵܪ ¨ƒº5˜‰j̃ZîSÿ¯¶å̉ ·ØĂùêù×ÙÚ±»™‰kß [ïS¾ơÔƠXăˆŸ;秽߻ûçÚ¾Øת±»ÏÅă½ÙÚóÄ‹ÈÓ̉ơÛÍƠÛÀ½™ëéåÿ¯¶Ẩ©ÓÚºÿ¯¶½ÏÔ«‡“ÍjÁÓÛÄÓöÁ™Ûù×ÍË)éÛ9¥ÏÔ¡yÁƯÑÓ¿º½€Îű»•%Ï̉9¥‡Û«‚ ½9…œùשӱëØë‰«Ú«‡“Íj—¶Ở÷ÙÿÚù¿§Æ„¢­ơØĂÙ©‡¥2ßëMÛ«‚ ½9“Æ‚¾;;—Ó¹Ú÷Ạ́½9çôÑÓÙ̉ï³2Ë¿ɹÓ½ƒÖî½»¼‘釽€ăˆŸ«‡“Íjơê«d·‡‘×8çĐÄê ù×ĂăˆŸ;ĂÙ₫®¶·Ô³ºóÈ̉öă¼œ·̉ ¤0ù×…Ơ“º‡ŒÏÔ‹Çëö‘ƃØ߈ù×›¾ÛˆŸÈĂƠ·Ô¡Ô«°ưÀ½½ù×¢äƒÛ×ï½ç̉ßÄÙëö£¡‘©Á̉ォÑÇ»±»öÁŒƠăê߈½ôƒÖÉ̉¹}‡ÚñÁÙ×—»ăˆŸ߈ëÓÛ«‚ ½9ĂÙ¹ÚÏÔăˆŸ;Ï̉ÇÖö¸½°»Ù˜Ù½±¿›¾ÅÔÿÂ×ÚƯÚöăˆŸø÷ƒˆÆĂÏ̉ƒwº‚ù׿‰ƒvăˆŸ;Ù½9¥‡¶ÅùêïÚ†“¼ăˆŸ;¡ÈƒvÑĂù׃ԫ»ù×ëö›¾ưÀà ߈ăˆŸ½ÏÅÍ›¡߈9¥‡ăˆŸ;×YÛú¥ÛöÀÛ«‚ ½9“Æ’ƠûƠׯÅÔƠÙÚ±½ÛןÅÙÚ½ÔÇ̉ÏÔƒÖû́9¥‡¾ÅØØ×ªÔïÚ£Ó¿ß÷Áù›°»£ƯăˆŸ;¯×ÑÓ™‰kß [ïS¡Áºïö·‹ª»ù×ÛÀø×ÏÔ™ëéå»Ă°»½©&¿ô´¹Ú9¥‡Û«‚ ½9ŸÈ‹ÇëöºÏÅôĂ™‰kß [ïSÏÅơèŬô߈ٽ߻ûÔXđ‡ºÑÓíơ‘±˜êèäù×Û«‚ ½9ÛÄÓׯËÓïÂí—Gă´ơèÅô×ܽö¿_³ÆÁƯ9¥‡×§Ø™‰kß [ïS½€ƒ™‰kß [ïS×Ơº¡È¡Á°½Ï̉“Ǒ֩À™ëéå‡ÛÏÅ‹ÁĂÙ·ºïŶØÅ™ÁƯºÁƯñÑÓåĂ™‰kß [ïS¡ ½ïºƒv‰¿IÏÅăqéÛ«‚ ½9ÚÆ‰¿Iơêå̉ ëö«Ô£X³ºóÏÅ‘‡ö†“ºÅ «‡“Íj½ÏÔÛ«‚ ½9ŃˆơêÛ«‚ ½9ÍË)éÛ9¥À¼ơêÍÓ±»ºñÁ°»Ë̉ơ꾕Œº½€«¼°»•'ÏÔö¥ˆ]1÷å5Óôøí0ăˆŸ;ÏÔ÷Áÿ¯¶ÛºÙ‰ÛÀĂöÇÖ5›¾¹Ú«ÚŸÖ®Gø«ÔăÁ±»çÚăơ“ÛưÁ¨º àƠ49¥‡°» Èâó÷ˆ™ëéå½8¤‡Ë̉ÛÀ±ƯÅ¥ÛÅØ½ĂºơêÛÀƒvÜÿڅ¹ÚËÉ9ù׋ÜÈƠ£‡ÙƠ­v°½߈Û«‚ ½9›¾×¾¥‰ÍL…ưÀ¾‰µØ8 ¤‡ ÖÍÓ÷Á¶ô퇫‡“Íj½Ñ×óÔƒvß»û‚vÛù×ăˆŸ;Ơ½Øî²2á ‹ÈÂȽ€çÚÏÔ«‡“Íj߈©Ç™Á«‡“Íj™‰kß [ïSÍÄÏÔµØéºÁ¹½€ÑÓóÂßÁÙ×û˜‰j̃ZîS§ØÛÄÓ™ÁơêĐӑƺyÙÚăˆŸ›¡ù×ÁƯ—»ăˆŸ‘ơ¿ßÄỔº—ê½Û«‚ ½9ËƠÛ«‚ ½9çÚ³ÂóÇÙÚù·Ù½éÚŸƠ‚vÍƠÙÜÙÓ½ÏÔƒ¾‘‰ơÉĂà¾ĂÖ½«‡“Íj«‡“ÍjÚÀ£Ư·‡‘×8礽¾ß½«‡“ÍjºØÍÄ·ô‘{£Ø®Gøï½Ä +ƯÓ §ÓÁ̉½Ô½ÍË)éÛ9¥ù׃ØÇçëöˆ½€ùꙇƠϹY™‰kß [ïSù×߈“È£äïƠ¡hÅØ•ÖƠß„¹ÚÏÔ±ëØçÀñÚŸÅÙ½µØ±»ù×ÍñÚ«dÀعÚû(âà™‰kß [ïSăˆŸ;kĂĂ ›­±àéMßƯ½€ÓÔ­€ŸóĐÓ߈ÿÚ©¼óĂÁËш¿»Û«‚ ½9µØçÚ¡ØÙ½÷$ƒvÏÔÉÖê ĂÙ¥¾Ü¹ÚÏÔ¡ÈÿÛ«‡“Íj½ï»ÏÔóÔ߈ƯÚÑÓï»gÏÔÙÜÂùê‘ÆơÔÍÓÏÔ˜‰j̃ZîSæ'É̉ÑÓ™‰kß [ïS«‡“Íjϼ¾ß‰yÆ̉­ÈëöĂÙÛº߈·§D Ílëö©ƠçÛ«‚ ½9}ƯÓ ߈ô¹ÚçÚ…Œ‰ÁÙ½ïƠ£Ô£!“Ƴ̃‡ưÁÅô…Ø÷ÁëöÑ·ÊÈ9íÖƠØơú¿½³ëöÁƯ¥Ø߈ÅØ§ÈñÖ½ăˆŸ;¯ÓÑaëö»½Ù½™‰kß [ïS9¥‡™Ó׿8™‰kß [ïS³Èñ±߈Û«‚ ½9›v®È߈Ûʼn¿I9¥‡ưÀ‡Œ›¶éÏžê¼ơê¶Û«‚ ½9½ĂÏÄ¥Ó±»×Â÷Áù×êéåĂ˜ơ#£ÇÏÔĂÙß»ûñ™ó§½åëöçÚ߈©¼å̉ ½ĂÏÔ‚'ù×¼÷Á¥ˆ]1ɇÉƯÄÂôï»Ç̉‡ÛYÿ¯¶ Ûù?ºç©Ç‡xÓY©ÇăˆŸ˜‰j̃ZîSù(¯Ô¸ÚÛ×á=£»ïøá©Ó¶Ô“Åù¿ëöơ꫇“Íj¡Ôƒvª»£ƠÿÚï»“ÆøæƯº×Ơ†7§jƯˆËÉ9•¾ÙZ«Ôơ߈·Ô·Åܶ‡Ö8æÁ¹˜â8¤‡×ÇĂù×í—G¹̃9¥‡±»ÍıÔù×9¥‡øêăˆŸ;­vù×ÍĶè›ÊßÚ÷ÁƯºÏÔ¹àÓØỞ¶Ô¡Ưß„ï +áØûÓö匿NщÛ«‚ ½9ưÀù¿çº÷Á©µØä̉«‡“Íj¬Ö(Í,8¤‡ÙÚ½ÎÔ¢Ô§¹%™‰kß [ïS³ÈÙÚïôå¿“ỢÔ‰Á¼ÅØ·ÔÁ׋dzà¹ÁÏÅơÔ¿ ˱ơ…ùé×ÓÛ«‚ ½9ĂôŽ9¥‡ÏÔĐÓ߈ĂĂï»·ỘÇŸçÏÔßÄÙÓÅơ»èêô¾¶Ü‡Œ‹¾\ËƠ¹Ú½ơêÿÚñÓù×·Ô½€̀ÓáÛ÷4釩¼«‡“Íj–ˆϾ¥O•ïרéÓ•ŒÏÔ™‡ĂÙÙYÛ«‚ ½9¼ÿÚ¬¾”åÁív’Ÿé‡±¿†º‹Ü†ÛÀÏÅ™‡רÁƯÚª‚ +¼9åĂÏÔĂß¿‰•&™‡›¾Ë%áÓËÖ«Ô›¾ƒÖ³ØĂÙË̉ÙÜö—&Ở±»ÏÅăˆŸ;kƠ•9¥‡½ôÎÔưÀßæçÚÁĂĂ¼‡ƯóĂÛÚù×»›¡Û«‚ ½9„Çä)ƒÖ麷ԭĹÚñÓ³zƠºm£»›¾¹ØßÚơêƠÁå×»ØÏÅ·ÅƠ°»±ëءԟ؂v“Ơ¸Ú%ÏÔÆØ›¾ĂÙá꿉¡ÈöÚÀ «Ô½¾‡·‡‘×8ç÷Á«d›v¢Ư癉kß [ïSăˆŸ;™‡ÍÄß»ûơê¦Æ§ÓÁƯñÎ9¥‡ñÓĂÈơ“Úº®G ø ª¶2tTÁ•Œ߈ù׫‡“Íj­ÖơêÛÂåÁÑŵ‰ßÚ£¿×ÜÏ̉߈Ü­ÄçÚ÷ơÎóÓµaËÓź¤Â«‡“Íj“ÈÛ«‚ ½9ùê±»¬ÅÛÀƠ9¥‡™‡ăˆŸ;9¥‡øêAÎóÔ¤ˆ\0÷ÚÏΛڭ¾°Å±Å‘¶ù×´Èôꃾ‘±»Åö›é˜‰j̃ZîSï½Äô±»ÓÅưÀɹÂèÁƯ¡«Ôß»ûù×ĂÈä̉«‡“ÍjưÀÙÜñÚơÄ…»ÊÇö½«‡“ÍjµØ·È±»°¿ ·Ô­ÄñÁ°»©Ç™‰kß [ïSÛ«‚ ½9‡ÚĂà™‰kß [ïSÑÓăº¡Ø«ôÿ¯¶¹ÚµvơÔƒv©ÓßÄÙ¥ˆ]1—I¾߈×Ó«‡“ÍjßÄÙg…DÇ÷À̉ăơ×ỞÛº—ăŸÅÁ‚v¹ÚÁƯ«‡“Íj߈ÏÔƒØûÉùêÏ̉Û«‚ ½9£äù‡‡ÇíÖ±ëØ«‡“Íj̃Á¯×±¿Ë̉÷ˆĂºăăï½ƯÓ ƒ½ÇßÁ߈£»«‡“ÍjĂÙщ…ñ›¡ÙŒë*«Û«‚ ½9ÙÚÂĂ ơÔ«Ô»™‰kß [ïS•׵ϹڥƱ»êö÷‡¡ÈíÖóÔăˆŸ;k™‡±»ơêñÚ—¶Ï̉₫×Óº߈Úª‚ +¼9™ØÙ̉·v™‡ñÆͼ¨ÅÙá=ÙÅëÖÚă»¹Ú”Œǽ®ö¿«)×¾Ǽƒ¡ÁÏÔ“Ơ9¥‡•¹ÚÍƠ§ôæƠTöÁº…ÙÏÚª‚ +¼9‹½щï½Û«‚ ½9ËÈ9ׯÙÅëù×ÑØ’lj¿IË¿¡Û©¼ç²ÅÛ«‚ ½9ơÔ®×ăˆŸ½ÏÔ¼  Ûç̉¢"ƒv¹Úëö£»Ă¡ÈÓºшÏ̉ÏÅơê·ưŽïÅÙ½›™Û«‚ ½9½‹ÙÇÉê½ÛºÏé…»™Û½»ù×ëö¯¾ăº«‡“Íjä̉‹ÓYó¥ƿκ™‹—¶‹Ç™‰kß [ïS½ô÷Á§º›¶éëÅóǼ†ÚêöÓÔ˜‰j̃ZîSÁ ₫Ç=¿‰Ÿó…ƠÑÓ߈¹Ú›¾™ơñÆÿ&ÿ¼ơèÅ¡Á»ØçÔ¡ưÀ½H«‡“ÍjŸÅñÚ™‰kß [ïSшăˆŸÍÛÛÀ‡ï½߈ÿÚ9¥‡ÓºơĂóg™‡ô¹Ú¿å̉ ™ôÓØ«»û—Ó¡ÖĂ·‡‘×8çÛ«‚ ½9›w¢äÅăˆŸ;ívŽăˆŸ¡ÍĂ‘đÏÔ«¾º±¿éÓÍË)éÛ9¥Ö…×ÍË)éÛ9¥—¶ͼ́vâºà¾ÎÅ¡ÔÁƯ™‰kß [ïSăˆŸçá=±¿™Á‚߈½·‡‘×8çù×ÍĂ…»‡ÇÁƯ‹Ç½‡½9¥‡å×óÔ±»Ïăvïqg‹Ç‹Ç´Îëöï»Ơ™‰kß [ïSÇwºöÛ«‚ ½9¡Ûµ†߈ÏÔÍË)éÛ9¥±»ĂÈÍÓÓàªÚ×¾«ÔÁÙ°» ÏÔÛ«‚ ½9¼ÔÛ«‚ ½9«‡“ÍjÛ«‚ ½9ùÚ­¾öƠíÁÁƯñÚÁ̉¼Á«Ô«ÔĂÙ¡Ô¡ÁÏ̉ÏÅừ·ÔÀĂ©‡¥2ßëMÛ«‚ ½9‡ÏÅרÙÚ™‰kß [ïS­ÖͼÛ«‚ ½9Ơ·̣·¦D ¹ÖßÁ€¼ËÉ9ĐÅ÷å5ӣطÅƠ®Í­„ö߈£»Û«‚ ½9Ù½›¶éÆ«‡“Íj¿‰§Ø«‡“Íjƒv‚×߈ĂÙÏÔ¿‰×Ơ™‰kß [ïSëö߈ÂÈ߈ñÖÎƯÓ —؆½"ĂÙжăí—G—ˆăˆŸ;ø¿Ù½ñíÈ߈£»Ÿ}ơêĂÙ‡ÇƠơ›óÄçÚÇô§È¡ÈÀ̉áêÑíç̉ĂÙ™‰kß [ïS±¿¹Ú¹̃°êØÓºƠXˆÛº¿»óÄÛ«‚ ½9™‡™‰kß [ïS§Ơö‡×ÓÁÁĂ¡È¿‰±¿‹ÇÄöçßÁỞ“ö•çË¿—¾ç½‰Û“¹ƯNÚ×÷ÁÿÚ«‡“Íj«»±½ÇÖ—¶¾§ÆăˆŸ;ËƠùוÜơê¤̃Ó¶æÚ¹ÚÛ׫‡“Íj±»˜‡Ûß»ûµØ½óÇÛ×áêÿÇÙ×·ÜĂÙ®×8¤‡ûØăˆŸ;ù×Ù׬¾Ăà=‚v ¡Á9¥‡íÖÍÄ«‡“Íj­ÖñÓ‹Ç£ä™Ăù×±»Äا߈ß»û¼å×¾ÏÄ¿ë¶ÔƠù×ÇÓ¡ûÙơ­R›¶éÙת»£ä¹̃™‡£Çº×ĂÅ“§ô¥/íêĂÙ·#‰¿I¶ÜơèÅ¢äшÙ½ăà“ÛưÀƒṽÚ°»ëö‡Ụ́ÂѾ¼çéרÿר¼ëö߈ö¯Ú½ô߃vá¾ñÚù×±»ử‰Ô½éÓŸÊÿ×¾ßÛ«‚ ½9ôê¹ÚÛºÙ̃ˆêÚŸÖÿ´º³½߈©ÓëöÿÚ¡È߈ÙÚ8¤‡ÛÄÓ¿‰9¥‡đÁó¶߈̣¶ÑÓĂóĂ߈«‡“Íj™‰kß [ïSÿÚÛ«‚ ½9µØ÷ÙŽƠƒvù×ÏÔ™×ß»û›¾ÍÓû̉™‰kß [ïS¹ÚµaëöÇÖƯÓ á ÏÅ¿‰ù¿˜‰j̃ZîSÛ«‚ ½9¤È—»‰¿I߈«‡“ÍjÛ«‚ ½9•Œù×±½‡“™‰kß [ïSÍóÄרÙ×á ½™‰kß [ïS¥º߈׿8ÏÅÎÅ«‡“Íjù×ÏųzöÍÓ¹Ú·Ó ¥0·ÔÙö‰Û퇿́²Ơù×±»íÓÙ½áˆÁ0qđçÇëöăˆŸǺÜÏÚ–¿¥Ü‰¿I™‡èêưÀưÀ±»÷Ú‡Úƒv­é‡ÿà ÷Á›¡Ÿ¿ËÓăˆŸÛ«‚ ½9¡h³¾ăˆŸ;k߈Û«‚ ½9á ‹Ùôç̉ù×ăˆŸÛ«‚ ½9ÏÔù×¾»ƒÖơèÅÑÄë¡È½ƒvÛ«‚ ½9“ƠϼÍijzéÓÉ̉ÙÚ߈¸½,™‰kß [ïSÏÔ³ØÓºÁĂîºÅÔöÁ߈߈©‡¥2ßëMƠű»ÏÅ%Ÿ±»áƠ«Ô·Ü¡ÔÏÔơơ÷‡ưÀñÓ›¾™ô‡»·Üôº߈™àéÓ߈ăˆŸæºßưđăˆŸƒ^·ÅáêÙÚû(°Èá̃ù¾Ï޹Ú߈“ƠÛ×Ï̉‡“¨¼ºăˆŸ£Ưµ±»™ß¹Ú¹ÚÛ«‚ ½9Åô¿»í—G°»%‹Ç“¼ß»û×Ü߈ÍĂÙ½ÿÚÑĂÉÛ«‚ ½9Ù-ùêơÔ±»ưÀ߈Ó¾¿ôƠÄ߈ëöË¿ûØ¥‡ÑĂƒvçÚ“Æÿ¯¶ÎÔ“Ơ»ÅăêèƠŹÚÛת‡’̀j™‡9¥‡×¦¹µØƠơ ÚÀÿÂú֙әԯȣ䰻ɾ™Ô™‰kß [ïSƒvÔXÛ«‚ ½9ĂàËá¥ÓÙ½“‰3Ơ,ù凷ő«ĂÙßÁ†Œ   ·‡‘×8ç£äÛ«‚ ½9ÅÓ—¶¹ÈíÜ©À›Ú…Œ“љٌë*«́ëöÁ½Ă±»ÅØóǹڧ¿ùåÛ׉̃‡¥2ßëMÙÚ9¥‡÷ˆ“Æÿ¯¶÷‡á۾ʫº™‰kß [ïSͼïô·Ø«Ô½¥ˆ]1ߌ¸Ú¥Ó“ƠƯHÛÀÚ׳à÷Á§Ô‡°ÙY¤Ç µØ™‰kß [ïS±»‚صaƭѽơê©Ơ­¾ÁĂÏÔ˜ôáêåÛº«Ñßϱ½û€º ™‡­¿Ù½‘ñÖ©+…ÏÔ«Ô¿‰û÷Á“Ơͼ¦Ô·Ô™ëé嵨¿ºœ¦ÂÙöçÚ™‡ÏÅóĂéºׯ‡“ÍjÙ½‘ÛÙÚϼ…–߈ûÓáܰ»9¥‡¦Ôƒv£ ưÀ¼×$­Ô·Ó ¥0ăˆŸ;™Ó«‡“ÍjÙ̉ÛÂù×ÏÔ߈Ÿ}Û«‚ ½98¤‡¢ÈĂŸƠéºö…“¹ƯNư§‡ĂÙâàCϹºñÖ¥ØƯâá=‹€©‡¥2ßëMëö…¯È›å—ˆ—ÓƒvÙŒë*«½‡±»ĂÏÔăˆŸ³ô߈º›ÚÇ"»ØăÙùể½ ±»ăˆŸÄ“Ơ€ë¹Ú½é¾¿Ø¯Èơº߈̀Ê)èÛ8¤ï½‹ÇƒˆÙÚ¶ƠXκ¡ÁÏ̉…¼í—GùÚ¹ÚÛ«‚ ½9ưÀ™‰kß [ïSÇéÓ¡ÁêöュăvƠºm÷ä5̉½íÖßÁÑĂ©‡¥2ßëMÛÄÓùêˆĂêÛ×ư“Óí'ßŇ€·ưóĂĂƠ™‰kß [ïSÙ½ª»́v‰Ô9¥‡Ûܘ‰OjÕOOOOZOîSOÍÛºÛ×ôê…Ûơê¶ôÂÏÔ®Ơ߈™‰kß [ïS™‰kß [ïS›¾ÿ¯¶çôá²ĂÙ€ºËÓ™‰kß [ïSơèÅ·‡‘×8ç™×­ÖŸÖ9¥‡ª‡0’0̀j0Áƒv™=ȇăˆŸ;‹[9¥‡íÆÍË)éÛ9¥ß»ûéêöưÀ߈»Ø÷å5Ó‹Ç™‰kß [ïS€Ó›¾ƒv³È«·3uU¡Á‡Œ«‡“Íjè¼ó®¾-‹É0ùæÅØÛ«‚ ½9•+Ù½Û«‚ ½9ÊǧÓÑĂ•½ÁĂ›¾™‰kß [ïSÈ̉ñ‡Èå̉ Û«‚ ½9ăº̃ÅÅ–™‰kß [ïSÙÅëÅØ߈ÏÔÏċǩ‡¥2ßëM«ô匿NÔ¾FÁĂƒvÅÔÁ½»¼‘†“—*ưˆ8¤‡¨¼ËƠûبØơêïi…Ç…ŒÅÓé‡ß»û± áÓû(ßÚăˆŸ;ËÉ9ưÀÑĂºÁ§Ô¯¾óÔÏÔơÔï½Û«‚ ½9ăˆŸ“ö¹ÚăˆŸ§â÷Á—ˆ‰Û±ÔÁƯ«‡“ÍjơèÅÙ×ÑÓñÁ߈±»ơÄ«‡“ÍjĂè—¶™ôçm™‡ÅÔ±»Ér«‡“Íj•½ùשÓÓÆ³àơ˜‰j̃ZîSå̉ ½ºÅÔíơ¯XûƠ«Ô·‡‘×8çă×ËÖ¥‹‡°·‡‘×8çÅÓƒăÂŽǽ«‡“ÍjÚFËÓăˆŸ;ÅØƒˆëö›¾‡9¥‡«dÓØÅØÙ°»÷‡¯È™‰kß [ïS…“ÓÆăˆŸ;¶Óţش‡œ· ̉ ¤0 ü̉µØƒˆÏ™‡É€9¥‡ùêăˆŸ±»—¶ÓÅ̉ÅؽÏÔñ»Ù½ÿ¯¶½ĂÙ‹Ç Ơ÷̉«‡“ÍjÙ½Û«‚ ½9߈†“™ÄÂÙڦƣXÙט‰j̃ZîS—3™‰kß [ïS±½ÑÓ¹Ú™‰kß [ïSë²µ È̉ÜÓ ¾ºùêÇÖÁÓá=·Ôÿ¯¶Å¡Ô«»ù×ĂÙÙÚ÷‡™‡»$±»ƒvëÓ9¥‡×¡Ô±»ù×߈÷Á»ÅăˆŸ;k±»ÛÀÅÓ“ƠơÔƒ½߈«ÔĂÙưÀÏÅ™ơÙ½™ôÇ÷ƒ(™ơº«ÔÖÆÅâ‹Ç²º̣׿8ÿ¯¶«‡“ÍjĂÈÛ«‚ ½9ưÀöÏÔỞùêëö“ÛïƠ£Ç߈ù¿Û«‚ ½9ƒ¾‘»Øï½ăˆŸ;́ÓăˆŸ;˜Ù‡ÿ×Ëé®Ô¾ºÛ «Ô£äñÓ±¿çù׋J‡ººy!Û«‚ ½9¥½Û«‚ ½9ƒ»ÓỞ›Ă…ôƒ‹Ç½Ôº°ÀĂĂ ›­±àéMµ•£ƯµØ¯éϹÛ«‚ ½9«¾ƒvơ½™‰kß [ïSơ»ĐÓù×ùÚYßÁ‡óÂŒ¾öÄӃذ»ª¶2tT«Ỗ»ú½Ù½í‡ƠX½¡ƠÛºóÇÏŇÚíꙇ¾ºư¿ÿÛ½§ÔÓ“Ơö©‡¥2ßëM¸à„ÑÓÙ½½¼€µØ…»«Ó§ÆÜ±»¸à¡»½ĂʹóÇ߈ơÄÛÄÓ™Á÷Á‹éÓĂÙáêơèÅ߈ơê©ÇÍ›¾©¼©ÓÅ‚vưÀ‡º­ÄÙ×ûÓ›¾·Ô©íêưŒÅد¾óÔںǻ%ăÇí©Ø©Óù×ĂµØŸè÷‡µaùơ¿‰à ưÀ—Ûûº–¶Ÿ»ƠÁ+«‡“Íj™‰kß [ïSơø×‹Ùø×ÎÔ³ƠƯº³É̉±¿°ÔÄØ¹ÚĂ ßˆ—»»ØËÓÚÄ̉íØ¤ˆ\0­¾çÚ§ô€º™‰kß [ïSÖØ«‡“Íj³(Ø×“Ơ¾£»áêÅÔƠX·Å¸Ú﻽ÍË)éÛ9¥™‰kß [ïS×¾ÍÓƒvœƠ +½­Ö©Ç“ƠÑÓ±»‡ºơêĂÖËÉ9¡Ô±»±»ÜÓ ÇÖóÂù×å̉ ‚vÛ«‚ ½9­Öÿ¯¶ëöẳæ,ßÁ¶‡Ö8æăˆŸ©ØôĂƯjÁ¹˜‰j̃ZîSÙçÚ¡»ÁܓơԱ»Ơ%ÏÅûßÄÙßÁçÚີسÈ÷Áå̉ ™‡©‡¥2ßëMÙ½ù×ÓÉß’¹ÜN¹Úù×ù×ăˆŸ;ơêÿ¯¶óǾçÚ×¾½ÔÎʼnµØëöÔXËÉ9ÏÔ™‰kß [ïS°»9¥‡ÿÚ…ô×$ĂĂ ›­±àéMÓÅÛ«‚ ½9ßÚÙ×ùגȓȩÓå»Å¿Å«·3uU߈ë××ƠÏÅơŽÏÅ·Ó ¥0‹È«Ô·‡‘×8ç±ÔμăˆŸÍƠÓÔ¡ƠºƠ´ƒÖ›Ú¹Ú£ä÷ˆï»Ϻ™‰kß [ïS«»µØÿÚƒv¡ËÉ̉ÛÄÓÙ½ĂÈ‚v߈ÙŒë*«©¼§Ơ÷Ô÷¶ª‡’̀j©¼™‡ÿ¯¶ßÚưÀư‡±ù1Ô¿ÚµƠ¦È …ôÅ»«·3uUµØ¼“ÿ¯¶¡ÁÇÖ9¥‡×ÿ«Ôù×¼€,ç»­Ä…ô¿»°”Ó}ƒv§Ô­ßÙÓµÁ‘ÆñևڙÓè£ÜđÁÁ¹‡ºĂĂ ›­±àéM›¾ĂÙϼƒˆ°¿µØ9¥‡ä̉ÅÔù×ûƠ“ƠĐÓ™ÓÇá­ˆÛÄÓÑÓ‚v“ù×é‰ñ5ñ·µØ«»¡Û½©ÓÓÓÙÚơÔÁăˆŸ;ƒÖ¢» +°»±»ă»9¥‡ËÓù×ÏԷ؋Ǚ‰kß [ïSß’‡Ç›ÚƯËó§Ó×¾öÁ‡é/×:ÏÔăˆŸ‡Ç™‰kß [ïS³ôÁĂ©Ó‘Æ®Ơ™ă»ơêß»û½Û«‚ ½9™ô³ư§‡9¥‡×­ÔÚª‚ +¼9߈©¼˜‰j̃ZîSñ‡Ï̉Ơ߈ƒˆ±”™‡߈ÂÙ8¤‡ÖơĂßÄÙÛ«‚ ½9ù×ÑÓ¹ÚÙ“ĂÙ߈‡«âÛÀ«‡“ÍjưÀ¬Å«ÔÚÆ÷ˆÛ«‡“Íjƒ×É߈ÀÙ«‡“Íj£»ÏÔÇÛ™‰kß [ïS«·3uU¼©Ø9¥‡±¿ăˆŸ;™Ô»È¶ÏÚÏŃˆÉ̉™‰kß [ïS‹Üù×ƒÓØÅÓÙ½Áˆö©Ó±ĂªÚŸ}á ĂÙáê—Óù×»×ƠơèÅöÛ«‚ ½9Ù½ŸÅׯ«‡“ÍjÏÔå̉ åƠÏ•¿àÿ¯¶—»ØŒê*ª±»µ†·Ü«Ñ½ẶĂ˜êèä™ëéåé¾÷Á»Å£èÏĽ±»ưÀ™‰kß [ïSùêÛ«‚ ½9¿ï½¿Ớ½Á̉«‡“Íj߈ăà…ƠÙŒë*«ÑÓăˆŸ;ç½Ó¼™ëéå8¤‡«‡“Íjü¦†ƒµaéµØïº½Ă˜È¹—¾±»ÿ¯¶ƯÓ ỞÁ™‰kß [ïSÑÓ’Æ·‡‘×8çĂÙ¥Áñº¡Èƒv°¿ăˆŸ;±»™Ô½Û«‚ ½9«‡“ÍjÁ‡é/×:µ.¥ÙöÁƒvµØÛ«‚ ½9%­Ä¯ÈÅØó|«‡“Íj±»ÿ¯¶É¿•ù×Ǻ°ÀÍÇÏÅÏÔù×»‡Û× ©¯Û₫ÓËƠ¶Ôù×߈öÛ߈½ô™Ôéê±»ưÀÏÔ›Û‰àƒv¤Û¥Û‡“½Ü½ñÓửÓưÀ߈ׯĂٜ ư‘ĂñÁ©µ÷‡Ü¹¼ªÚÅÓÑæ½€ĂÙ¾ßç½½ÇÖ•ÜŸÖ¿º߈ÍÓ™‰kß [ïSµØ¢ơêÓÁ³ÂƠ9¥‡̉Åù×Ô“ÂÖưÀ±½ÛÀéÜÙ̉¹ÚÂӣؾ•Ö©Ç¡Á™‰kß [ïS—˜ùש¼Ë̉ƒÚ«‡“Íj¹Á±»ɇ—ŒÛº÷‡éê«Ô‚v ôÂÏ̉¡È9¥‡‡Œùו!«âơÔçÚ.߈ù×ÁĂר­Ôëö¶""ëơ±ëØ™×ù×ưÀ߈ÏÔ­‡ÂÈùëÑÓÛ÷Ù•Èû›³ºó·‡‘×8çúû«»Û«‚ ½9“º«‡“ÍjÛ«‚ ½9ÑÓ™‰kß [ïSù×ÿÚÏÔ«‡“Íjù×ϺÔºl€ö ù×åןƠ£ÇăˆŸ;kđ‰ăéºÿ«Ó¹Ú¦Ơ +À¹öÁăˆŸ;ǃvĂdöăˆŸ;ÏÔÿ¯¶ϼø¿ó½ôÖÆÁƯ›Â•½§â÷‡ùסÛÓØăˆŸ;ÁƯÓ̉êöR ÏÔ°»á º½ßÅ¡ÈßÁåơ»½Ø̉ Á̉ơèÅăˆŸ;ÑÑù×±»ׯ¶ÅÛ«‚ ½9±Ô©Ü¿‰¾½Æ̉±»9¥‡óÇỒĂåÁ9¥‡«‡“Íj…̃±»Ó‘퇵ܳÅÓµØÑÓ±»¡Áô³zÁĂÓºñÚ»‹ÏÔ±»±̉ôÿÛ¦ÔÏÔ™Á³÷Ô¿‰ưÀëö…ÔËÇÛ«‚ ½9˜êèä€ỜĂ™‰kß [ïS¿ÜÄÓ‡÷Á9¥‡›¶éùסÇ÷¾ưĂ—Ó™‰kß [ïS«dáêÖØ²Èƒà·‡‘×8çưÀßáºø¼ÇÖÑóóÂăˆŸ;§Ôƒ×¡ÁưÀ°»ÓºùסÔÚª‚ +¼9ÏÔù×ù×›¾ï³2Ç̉ÛºåĂă…ƒvŽ«ÔöơÔ™Á½ÿÚăˆŸ;ñÓǼëö匿NỞ±»«‡“Íj¤ÆĂш­Öù°¶ºî¢ôÓ̉»ƯÓ “ƠÅØíÓؽ ר±đëöÛÄÓ§à™‡å»ùêØCÛ×½ÑÄëăˆŸ;«‡“Íj™ÏÄ™‡ơêßÁÑÓ×Û«‚ ½9­€̉̉ù׿*ÏåỔ +î»¯Ó¿à’º ăíÑÓ§ÓñÏÔÑĂÁ̉˜Áù×ơÔ©ØÛÀÿÚÛ×øê«ơĂÏÅ·#Ç̉±»·Å·‡‘×8癇«‡“ÍjÍÄçôéêơê•%߈¡Û¥Æù×±¿™‡ÑÓ˜̣Ù½Úª‚ +¼9Ơ™ô¯ûơ꛾™‰kß [ïS‡º¹Ú¢Èơ꽫‡“ÍjÏÔ«‡“Íj½ô¡Èùêç$ù×}ÅÓ’¥Â‹ÁßÁ±»“È߈ËÖù׳Â߈±½ÁĂ¿‰£ä³’ù׃vÙŒë*«ĂÙÅØ£Ç™‰kß [ïS¾ßá̉ß„¿ô—±¿ÁƯ«‡“ÍjÛ«‚ ½9­¶÷Á‚Ú¯à½€ăˆŸ;™bÙÚ₫®¶·ÔƯÓ £ä—£éáÛËĐØ™‰kß [ïSÑ"˜ôۤˆ\0»ˆå×™‰kß [ïSÏÅ€Ơ°» ÍÇáۓȫ䫇“Íj·Ó ¥0ƒv±»ù׃ÔщơèÅö‡âÁƯßÄÙơĂÛ×¾Á¼«‡“Íj÷Ù9¥‡ÎžÑÄë¡ÈƠºm«‡“ÍjĂ¼­Ä·Ö߈ù×êÚÙÓ›¾ăˆŸ;kÏ̉±»ơ¾†ÇƠÁö“ȱ»Û«‚ ½9ÏÔ߈‹É0ÖØû܃ÔÛ›÷«Ô‡Ç›¶é¿º¶ii€ö³È½Û«‚ ½9³»ˆ±»8¤‡×çÚ߈“ÇâàͽÏÔû߈©Ç­Ä‡ùשӇ¬Ä× ­Ö™‰kß [ïS£Ø¦ôÛ×߈™‰kß [ïS½âˆ:±»‘ƶØ߈ņºÆ߈•Ü«¼°»÷Ú¡ÔÓØö‹Çơê‹Ç±»ÛÄÓ‡“ç̉›¶é·Ôưˆ·È«ÔÛ×ÉáưÀ߈Ï̉“Ơ½Ë̃߈çô³ÁÓ£Ô‡“±¿öƒvívÙÅëăơ¯Û²Æщ¡Ô£Ç»ÁÏÔ÷ÁƒØ¥Ó÷Á߈Ë̉“ÆÓر»“½…»ëöË¿߈щî»é¾«Ú­€½ơԑƇ᫇“Íj₫®¶ÏÔëö‡ŒÓØÏÔ¿ºÚ×ưÀÏÅï‡ÁÓ½èÛ«‚ ½9̉Å +Ûº߈±»ˆå‡YÅØƠÇÖ“Æù׳¯ÈÛ×߈ôÛºç̉›¶é·ÔÛ«‚ ½9щ·§D 8¤‡ÁƯË¿˜‰j̃ZîSÙÚ½¼ï³2§È÷ÁÙÚÙ×ÏÅå̉ ›·Ô«dÍÄ¡…»ñíÈËƠ¹Ø«‡“ÍjĂÙÙ½å‡ÀƯ ߈½ÏÅÏÅÚª‚ +¼9廓¹ƯN±¿ÍÄÁĂî½›¹ù×߈ëöÙÚÁ'®¼·Ó ¥0˜‰j̃ZîSÿÚ‘gÛÄÓ™‡£äĂÙëÓÁ̉»Ă›¶é­ˆÏÔ«·3uU›¶é·Ôÿ¯¶߈„'‡ăơÄïÚ‹ÇƯÓ ¡%ăÛív›¾߈™Á¾ĂÙư‘ù¾ăßÙÚ—ÓÛăˆŸ;ÅִƒÔÁƯ·Ó ¥0ÓºÛºơÔÑÅöÁÿ˜üÀ«‡“Íj¿‰‡Úå̉ ¯G‹ø›çégÏÔ§ô™‰kß [ïSă‘·±ëØÑĂ߈̉ºï½¶  ₫®¶”ƠơÓˆ•=‘½€ö½̀ÍÄăˆŸ;ÍƠ9¥‡Ă¼9¥‡×á„“Æͼ½Á̉ĂĂÅÔ߈ñÓăˆŸ;Ë̉ÁƯø×½Ѷ¥ÆÖÆ«»»×¾߈›¾ÎÚÅĂ8¤‡Ö߈±»߈•è´aÛ܃Ö߈ÏÔψ́›ç½›¶é§Ô°»ƒvÍÓ…»Ó¾É̉ù‰ư¸ÜñÓ›¾¡È±»§Ó«Ôù×ç½§ÆƯºÛ«‚ ½9ƒ‹¼çÚ‹Ç«d™ÓÙÅëíÖ麯Èͼ·Ô÷ÁĂí¥é‡óÇù׋Æù×ù×ívƒÔ߈¹Ú½ùÜ–¶«‡“Íj—¿ĂôÏ̉ù×Û×ËDZ»Ø×…Ûç߈Đ¾«‡“ÍjÛ«‚ ½9ëƠĂŸăˆŸ;¸à±»‡ŒŸ}™Ôס„Ø +ø×êØ¡Ç·Ốvÿ¯¶ÏÄ9¥‡”»X‡Ç‡º8¤‡ÖÙׯȡh“ǓȘóËÉ9¯1¯ÈÏ̉íêÑÓơêÏ̉·Ô˜êèäÓºμƒvÁƯÎ̉¯Ô§ỖÄØ±»…Ơ™ÓăˆŸ;±»™ÓưÀÓÓÅØƠX߈‡xÅÓûß·‡‘×8癉kß [ïSÁ ‰ÛéÓ³ËÇÏÔçÔ¡àÀ™‰kß [ïS‰¿I›¡ö¿ÅÏ̉’¹ÜNÛưÀÍÙ½ù×±¿¡Û³ Ơö°»÷ˆÿÛíÆŸÁƠXƠù¾ñÚ}«ÔÄ–«‡“Íj߈Û«‚ ½9Û«‚ ½9ĂÈ߈êØëöïàỞ‹ÇûØÏÔƒvר¶èñÓÁƯ±»ÿ¯¶÷‡óÇÅ–ÛºĂÙÍÄ‡ăˆŸ±»³·µß¡ÁỞ¡Èù×¶ŸÖ¹Ú‡9‡º©½ưÀ¿ç×ϳ Áù×÷‡½ôÛׯܩ¼ÙÚưÀưÀ߈ù×ÜÂùê°»½Ơ½¹Ø…Ơµ‰ÿÚÙ½³$µ÷°»™‡߈¡×ĂñÓ©¼½½ưÀ±ëÅÙ«‡“Íj·Èå̉ ÇØ¥à•Èû›çÚù×™‰kß [ïS·‡‘×8çá̃Ï̉ăÁíê«Ô½ôÙ½ÙÚ9¥‡éÓ™Ôͽ™‰kß [ïS³‡xÏÔĂö̉8óÇ•Œ¡é܂ԙ×éÓ«‡“Íj¹ööö߈¦Ô±»ÏÅËÉ9À¿ß߈̀Óyˆ›ÛÓÆµa™‰kß [ïSà Ë̉Å£Çï½߈™Áù×Ơ8,¤‡,Ö§ôÏÔÏÅ™$ᙉkß [ïS½ר߈©«Ú½½€ÑÓѦƠá ¡ƠÍË)éÛ9¥߈ơı»ĂĂ ›­±àéMÁăÊÓ½Ë̉½™‰kß [ïS°½¿‰âˆ:kÛ½æÚ°»™‰kß [ïS öڃؙ‡ÓØ£XƠÅËÉ9ƯÜÓ¼ăơ€ë ưÀ‰ÛߌÛ,ù×߈‹Ó›ÚỔÿ¯¶Ơ¿º“Èï»̉ æ™̃ÑÓ¿½©Ü™‰kß [ïS÷„ù×Û«‚ ½9ÏÔ¯¾½«»‹ÇÖÆ©Óívëö­Ä™‡Ù½áƠç'™‰kß [ïSăˆŸơêívÁ̉“ز ±»ĂƠ™‰kß [ïSÓµÈăˆŸ;ĂƠ8¤‡Öø³µØơÔùëŽÉ ߈¤ÓÅ·ôÑÅ÷ +ơ»ÿÚ߈±»íêÓÆŸ}Ù×î²2ƒv›¾çÚÛ«‚ ½9ƒäâà ĂÙ¹ÚÓű»ĂÙÑÓ£ä‡Ú߈çÚ÷ÁăĂ3«»ƒƯđÖ›>óÓó©ث‡“ÍjÏÄ™‰kß [ïSº±½ÁƯùꪼ™‡™‰kß [ïSÙÚ©‡¥2ßëM‹Çù×$߈™‰kß [ïSÙÚø×ôÍÄĂ¼«‡“Íj½ôù×ÙÜ÷ÁàÓ—¶‰y‡°¿ŸÖï½¥ˆ]1˜!ê!è!ä!·Ô‰ƠÛ«‚ ½9·§D ă»¿—ĂÙ›¾Ï’½çmÏÔ·ÅơÔ‡ùׇx³í™‰kß [ïSæư§‡ˆÂóÁÙÚ­ÄÛ«‚ ½9ưÀËÖÑÅĂÙ–¶ưÀϺ‡ŒÇÅØ§ÓăˆŸ×ƒÔ«»Ó̉›¶é½ÈđÓÁƯù×ƯÓ ëö©Æíê“ȧرÈÏÔ‡¿—¾¿ª‡’̀j¹‡Çƒv½Å#ÁÜ­:‘¾ÙÚûÙ‡x‹Ç‡¹ÚÛ«‚ ½9ĂƠăˆŸ;kù×ßÄÙÿ¼Ù×½Z‡Ç¹Ú›¾ƒÖÁƯ—ˆÓØ’¹ÜN¢»ăơ¿‰±‡8¤‡«ÔÜÛ«‚ ½9‡x²ƠÄ£Ưëö›·Ô¯G‹ø¥¿§¹£Ç°»9¥‡÷ÁÏôÿÚù‰ɹ9¥‡½ÜĂĂÛ×™‰kß [ïS»ô¿àỞƒơ§ÍËÉ9ÄéÚÙ½ÀÛù×ăˆŸñÓ9¥‡µƯ«»Û«‚ ½9å̉ ƒ9¥‡†Œ̉Ʊ»ÍӽDZ»ƒvëÓËÖ«»ÎԢǧÔ×Ó÷ÚßσvăˆŸ;™ơÏƠ¥àöÑÓíØ™‰kß [ïSÏŘêèä匿NåºçÚ÷‡—»ÿÂïÚ™‰kß [ïS¹ó“Ỡˆ¬Ö™‰kß [ïSÁĂùןƠ·‡‘×8çÏÅơÄÖØÎų¹å´Û×­Ä»½—Ó‹ÜûƠ½±»§ÔѶ³ÈßÄÙ¡Û±»ÖØ«‡“Íj¯È×Ü·Åè‰đ5đ¶·‡‘×8ç½›‡ß»ûưÀô×ĂỞăˆŸ;«â™‰kß [ïSG½¹›éϹÏ߈±»́ê߈ÿ¯¶ëưÀ9¥‡—¶±»½Ô×ÓơÔÅØÚ™Á¹ÁñÓѺƒØăº·‡‘×8çăàÙÁ߈™‰kß [ïSÙƠ«‡“Íj™ôÓº›¾ƒÖƠ±ÿ¸íïÑæ½™‰kß [ïS»ñÖƒªÚ¾¡È´†ßÄÙßƯ°»Û«‚ ½9‡ºéùêç̉¶ôăˆŸ;kÛ«‚ ½9ơệÂÏÔù×Ùà›¾£ÔĐÓ¡ÔÛ«‚ ½9©ßæù×ؽóÇ÷ÁÿÂëö•Èû›½ăˆŸƒ9¥‡×ƒ‘ڵؽ߈ĺÍĂăˆŸù×ÏÅẠ̊ĂăˆŸ;¡¼«‡“ÍjéêÏỖˆÁË&ửù×ƠÏÄÏÔÛ×Á̉ïôăˆŸ;k߈Û«‚ ½9™ÔÏÅ£²‹ÇÀ¹ƒváê‡9ơê™ÔøêÇ÷©Ơ½€·§D ÏÅØßÄÙí›ÏÔưÀÑÄ둾̃ˆƯÓ ÏŽÂÈăêºÁÚ߈ÛºăˆŸ;±½߈‰ỷ̉¹ÚăˆŸ;çÚù×ö½·ÅÇØ…Ößk¥ˆ]1ëö½€‰y߈‹ÇÑÓ›¶é¿Å·Åß»û™ô™‰kß [ïS‹Ù•Èû›Û«‚ ½9ëöă«ÔÙ×ív•Œ‡ºÿ¼…»“½™‰kß [ïS±ëØñ»½Ô¥ĐƠ_߈́ơ½€ư“ù×öƠ½ùơß»ûå̉ Ïʼn¿IÁ½̉Æ«‡“Íj9¥‡ăˆŸ;ÛÿÚ9¥‡Û«‚ ½9©ÓÍÇ¥Ă½ô¥ˆ]1̃ˆÆá ÏÔ«‡“ÍjăˆŸ;—¶µaơ‡½ÍÓí—G× Ù½†Çăàáêé‡ÅØÙ½§ºÙ½ÿ¯¶ÑÄ뛾ƒvĂÍÄÙÚÚÄ̉÷Ù¿¹¾»߈ÏÅĂÖ¶ßÚù×Ѷ©¼‹Üù×¹—ÏÅ™‡±¿ÅtÑÓÛ«‚ ½9×¼Ù½ׯ¡ÔẲµØ¾ăˆŸ;å̉ ‚×ĂÙËÓ™‰kß [ïS߈ÅØ±¿ù×ÏŽ‰¿IŒ¾Ù½¡È›¾©Ç¾ßăˆŸ;ÓÆƯº§Ø߈Úª‚ +¼9ÍË)éÛ9¥ÍƠË̉Đæ ÖÆùׇÅÄÛ«‚ ½9ĂÙ«‡“ÍjÙ½¶·Å߈ĂÙ߈¯ƠĂÙ©¼¶  ÙÜß»û½ÍĂ´ÅơêÅÓ³Ó߈ÛÄÓăˆŸ;±»Ó›ĂÁ½öÏÔÅÓƯ²ƒˆÁĂ©½ù׋ܱ»½½ƒ±»« ©ƒ»5åơö¶«‡“ÍjÏÅ¿º±»ƒˆĂÆ߈ÑÓÎÅg·‡‘×8çù×–¾ÀË£ÔÏÔăÇí“ÈëÔ¾«Ô‘ÓÔÚ«‡“Íj™‰kß [ïS“ƠæZ™‰kß [ïSçÚư€½Ÿ}½ÑÓÏԻŇ“-ÏÔƒÖÁÓÂÙăˆŸ;Ïԣ跼Í7êöñqÛ«‚ ½9˹º…Ö½Û«‚ ½9ĂĂ ›­±àéMË%¾»Û«‚ ½9ñÆ«‹öƠ…Ö˜‰j̃ZîSĂºÏÔÏÄơê™Ó“ƠĂÙÚ×ÙÚ®×±»°»ëöÇÖçÚ°»ä̉éJé‰Ó5“gesÁŽ÷ÓÄơêơ꛾¥ÖĐÓùô釷‡‘×8çù×·ÔÛ«‚ ½9µØ½™‰kß [ïSçÚÍË)éÛ9¥Ÿ×Ơ߈êöÛ«‚ ½9߈Û«‚ ½9̣¶ ÁĂÅ×ßÑ«‡“ÍjäÁ­Ä±»‡Œ÷Ú«»ƒÖ‡ÇÓÆÛ«‚ ½9¯¾¸Úù×ívá¬%ÙÓÙÜ›vµØÇĂ«·3uUëöăˆŸÄÓÛº™‰kß [ïS¡Ô¥Âñ›êö™‰kß [ïSëöơÔ׿8‘«‹ÇÏÄ«Ư»½›ÛăˆŸ;ïÙĂ ù×Ï̉åĂÙڢǹ½…›ÅơêĂĂơèūԺ›¾‡ÛƠÙ½§½·‡‘×8çà=÷ˆ›¾߈ơÄÁƯ±½ÄÔ­Ä—ˆÑØ¡%ëçÀƯï³2ơ꫇“ÍjăˆŸ;Ë%ØÓ̉ŸÅ˜‰j̃ZîS©¼Ø×ÁĂ߈‡ÇăˆŸ;ø×½€ù×߈·Ó ¥0‡Úë¼ëöŸ}¹Áƒ½å̉ ÚÇ߈ÏÔƠ‡Œ߈«‡“Íjăơ™‰kß [ïS«<³Çăêºyå̉ ÿ¯¶ƒÿ¯¶‡Œ©‡¥2ßëM£²ÏÅؽăˆŸ;÷‡ñíÈ1ăˆŸ;µƠ«·3uU‹ÜÙ̉ư¤™ëéåù×¥Øø¾ÁÚøôÁ©Ø°»°»”ºµ†ÏÅö·‰½ψµÀăˆŸ;kưÀë¼ëö½±»·ÔÏÅ8(¤‡(Ö±Ô™‰kß [ïS™‡$‡ºƯº€ºÛ×™‰kß [ïSáƯ9¥‡öÁ<«‡“ÍjơÄÂĂÙÚă½ÏÓñÚ®¬Û₫¡ÛÿÚ¿Ùÿ¯¶°»ø×ưÀÍä…Œå»ÏÔ»Đç$Û«‚ ½9½åĂă»ÿƯÅÔƒÖ°»öÂÙëö‡ÚºƠƒ²Û«‚ ½9¡ÔøêÍÏű»ëö´‰Û׃¾‘áØÚ× +±»ÍÄ©ë̉ÛÍƠËǫԩ‡¥2ßëM§Óº›¡™ô¥Ư¿àßÚívÙ£Ø̣|®Öăºéô匿N›̃¥ˆ]1±»¥â™‰kß [ïSëö‰¿I«»9¥‡¹Ú¹Ú­½¼±¿·ÔĂÙÏÔå̉ ™‰kß [ïS•ŒÛ«‚ ½9»ÑæÅØÛ¹ù×¼€̃ÄØñăˆŸ;ơêôív‡ºÎÅ̃ˆ÷ˆÏÅ³ăˆŸ߈ù×ÏÔÛ«‚ ½9¿Ô«Ôá ÏÅÙƠöĂô¥ˆ]1«‡“ÍjăˆŸ;«‡“Íj”™ÁÙÚÏÅÍÓ«‡“Íjå̉ «ÅơÔͼçÚÏÔƒˆÙ½ÙÚ¡»¡ÈÀ½±»ÜˆÔﻓƠ¸ÚŸÄÑæø×ăˆŸ;ÇÖÏÅÖÆ§Ơêƒó“È«‡“Íjôê½€…Ơ±‚³(±»˜ô߈™ơ£Ç¼€«‡“Íjß»û´ÎÛ«‚ ½9˜‡ «‡“Íj±»ÏÔăˆŸ;ăơ¿ºe½ô™‰kß [ïS‹Ù‘ÚÙŒë*«ÑÓźÇÖÛ«‚ ½9ñÆ›¾ɇ©ш9¥‡߈ơê±»̃ŒÚ,÷¼™‰kß [ïSù×™‰kß [ïSÆĂ¿Ù»¼‘¹Ú¿»éêƠơ£ØƒˆÙÚ½û(°»ß»û¹Ú¹Ú±uÅÔ•Œ±»˜‡Ǽ¼€ăơ£»ăˆŸ;ÛƠßÁ˔ۘ‰j̃ZîS“÷Çóöç$—ˆơ꿉ٽùꙉkß [ïS÷ÁñÄăơ¡åôĂơÄĂٙוŒß»û±»ëöĂÙ“×éÙùêÅÓÛ«‚ ½9µa±¿³È߈¸£«ïá˹±»ƠÏ̉ăˆŸ;™‰kß [ïSơꃽÏԩر»—ˆƒÖ« ©ƒ»5ßèÖ߈Å©Óá¼µ‰¸£Úª‚ +¼9ưÅåÙ½™ëéåư¿¾¹ÙÚ™‰kß [ïS±̉ÛóÇø¼½é‡ĂººŸƠ—ˆ‰¿IăˆŸƒv·Ô«‡“ÍjëöñÓ›¾µØÖƯG‹ø³߈°»éêÛ«‚ ½9ÏÅ•ª‡’̀j½€¡ÈÁƯƠ¼Û«‚ ½9½€©¼»óĂưÀ퇳ٽ…ƠßÖô¹ÚÅ߈“Ɵĺ±”™‡—¶˜Ơ ¹ÚF¼¹ëöëöơêÏÔ«Ó¬ÄÅƯ¹Úµ†ÑÓ£ØÅØÙ½Ë•ñÓưÀÙÚù׃vœÜ˜‰j̃ZîS©‡¥2ßëMö»Øïºù×éºù×íÖ¹Ú÷ÔƠׯíÆ©À£ÇØÅêÖĐÓăˆŸ;ëÓ•Œ‡çù×¥ˆ]1ÑÓ©Ø«‡“Íj·ÅĂÓù¼Ï̉ïÂ߈ºÉíÓ߈± Û«‚ ½9›¶éÔÚ¯ÈáßåƠơÄơꨇ¤2€̃êL¨Ç©&›¾½Üơê麋Üßâ™Á±»±»µ†ôꙉkß [ïS±»±»¿‰‡Ø¦È×Úƒˆ‡Ç¿¤ơÀƒˆăù×±»ÙÚÍÓÇØơÔ™‰kß [ïS«»‚v +ÿ¯¶ôÔ¸̃Ù½¡hÄí™Ó߄ٽ۫‚ ½9ÛƠ³ºóö¯›èÓ‰¿I匿N™‰kß [ïSÇÖ÷Ô‹Ç߈™ëéåÛ«‚ ½9§Ô¹ÚăˆŸ˜‰j̃ZîS߈óǸà À‡€è/Ö:™‰kß [ïSÏÔÛ«‚ ½9±»‘%ÑÄëƠÏŇå¿߈ܳëöù×ÇÖÛ«‚ ½9±»ǼÄàÿÚ—ŒÀ¹ĂÙÿÚÙÓº¯÷ÛÄÓ߈щ™‰kß [ïS·Ôơĺø×ă»çµúڋǃˆÙƠº±»á ±»Ù½߈ùơăˆŸ;€ºÁƯ§ôóÄ±ëØ™–»™̃ˆ©ăơÏÔăˆŸ;¡ØÛ«‚ ½9ºỬÿ¯¶íêׯ™‡Å»ÏÔÛ«‚ ½9™‰kß [ïS±»‘¾‰ÛñÓ‰¿I9¥‡¢äø×ªĐ­Û«‚ ½9§ÔËÉ9ơĂÏÔéÓÑÓívăˆŸßÁ™‰kß [ïSö—¶Ç̉Á˱»߈߈ŸĂÏÔíêͺƒØ· ½ú ƒÉĂ›ÚÏÅé‰ñ5ñ· Áƒˆ̃ˆº÷Áëö¡Á¿ºƒĂ˜‡¸Ú‹ÜÛ×ÙŒë*«ÙáÀƯ“ƠØ×Ùà‡™ÓÛÇæ'Ở÷Ù̃„«Ôºá «‡“Íj›¾ÏÅÙ½áꓽ׾ƯÓ ¿à‚ÚëöăˆŸ;å̉ ÷‡߈ù×–Œá$‰¿I±ÔăˆŸÅ¥ºíÖÏ̉çÚÏÔöÁĂÙ±»ăÛ«‚ ½9«ÔßÄÙ߈ơàăơÏÅûÓ›™‡ƠX°»ëöƯÓ Ï µ†ÑĂ‹ÜñÆîÀôêă»/ƒ×¿8ăˆŸ°¿ù×›Û̀ÓÈâˆ:©º™‰kß [ïS®Gøù×·‡‘×8çÍĂÿ«Ô߈ù×ÓÆ‰Û·Ô8`¤‡`Ö …¼½߈ÄØÛơ*Û«‚ ½9ÑÓ‡ƒÔăàÙ½ăˆŸ;ëöù׋ٙ‰kß [ïSÛº‡“¹ƯNßæר­ÖÙ½ëöĂÖº»ØôăˆŸ;kºÉĂÏÔ£Ó̉ºëöù×¹Ú½щƯ‰Æ›ṿ¶×ùëÚÙÚå̉ «&‡'9¥‡¶Ø +‡““Æ÷Ô™‰kß [ïSơêù×ËÉ9 ¬°àèMß»û©)û̉߈ÍË)éÛ9¥½âsäŒ ³´Û«‚ ½9ë‡߈±»½©¼«‡“Íj—ŒéÔơêéơ©¾₫§ù듺ÑdăˆŸ;™‰kß [ïS½“ƠưÀÚ×Ù½©ÓÀӽȫ‡“Íj%Û«‚ ½9Ăï³2ÿ¯¶߈×¾ÙÚÛÄÓ™‰kß [ïS‹Ç­ÄÁ±»ÍÇø×ÿÚív›¶éƯÚ¡ÁơêÏÔºÅÔÔơ÷‡ù×ĂĂßÖ¸¼Ѷ±»ù곺ó߈ºù×¹Áψ‰Å™‡ô8¤‡Ó©™‰kß [ïSÉ»½ô÷ÁßÁÚ×=—»ÿ™‰kß [ïS—ŒÿË·Ó ¥0̀Ă›¾½ĂÑÄë÷Á™Á£Ø½Ø߈ÿÛƯE¶Ởâà §Æå̃§Ôù×ÀĂƠXĂô¿ô…ƠÑÄë×¾Û«‚ ½9³Üï»ñÚµ%áØ£ä«Ó߈߈±»ÓØ¡́Ơ™Á½ăơ¹€£öå̉ ÇÖùט‰j̃ZîS匿NçÔ¡ùêëöơèű¿g™Á߈ö₫®¶ỞÙ½™Ó›ÑÙ×ÿ¯¶µÜĂÙ­ÄÅØ9¥‡߈ĐÅ߈÷‡ëöÉ›¿‰«‡“ÍjƠâÁ߈ö™‰kß [ïS߈ßÏÍÑØÅØ›¹Û«‚ ½9¿ôëö«‡“ÍjÓ̉ùêƒ×ÛÚơÔÏÅ™ă—¶ưÀ´a½¡»߈ăˆŸ;µØ©Ó½£Ø·ÈñÓ±̉†$°»ÄÓ«â±̉ÁÏÔù ÈçÚ°êØé‡щ黡ÛĂĂ«Ñ­R«â¯ÈÀ̉Uù׫Դa߈±—¶¯ÈöÅÄăà—»™‡ÑÓå̉ ǺÇÖÁ׫&ÛØ»ƠÿàƒăÇíÏŇŒù×á=±»±»ƒvçÚà=‡­Ø¾ +©ÜóÇ·‡‘×8ç“Ơͪµ†ÎԣǪ‡’̀jÙ½߈ª́ơÔßÚˆ­ØôĂÛÄÓ¥ˆ]1Ï̉•ÇôÛ–°» Œ¾ä!ï½ùêáƯâḈëÓ©Ó¼€ÍÓơ‡÷Úù¿£äÛ«‚ ½9߈ÿ¯¶ăˆŸ;“ƃv˜‰j̃ZîSÛ«‚ ½9ñ×ĂăˆŸ;kăˆŸ˜ ê è ä ù¿åŒ¿NßÁà á꫇“ÍjÛ«‚ ½9£X¦Ô‚½ËÇûÓßÚâˆ:kÿ‡ۗ¶ßÁÛ×¥Û¿́º™‰kß [ïS·Ô±»ƒ¾‘ó^£Ç₫®¶÷ÔÏ̉ÉƠ¸Ú›Úù×ó#ùë•·Åù×ÎÅ߈·Ôä̉±»½ùÜß»ûăˆŸ;ñÆëÓ™‰kß [ïSŸàë§ơ؇“óÇÇÖ©v™ôÓ¼½ĂÙëöÁĂ»¶º«‡“ÍjßÄÙ…ÛÏ̉ăˆŸÛ«‚ ½9ÍÓ«‡“ÍjơÔŸ¿•Èû›ÍÓ½¥ÆơºívÛ«‚ ½9íêµ½½·ÅöÁËơ¥ÙívÇÛăˆŸ;±»ù¿¼™‰kß [ïS¹Ú—Œ±»†Ç±»ù×—¶±»¬ÔöÀ +©‡¥2ßëM±»ÏÔưÀËÉ9«‡“Íj¿ôû(ªÔóÇùדº¡%é‰ñ5ñ·é¼ÛΫÔơêºƠÏÅÚª‚ +¼9¯ÛăˆŸ³ »ôù¿ߌÛ,̀½ÍË)éÛ9¥«»ù×½"ǽÛ«‚ ½9Ù½…óñÑÓ‡¿™‰kß [ïS¯ƠÇ"ç¶è¦¹«‡“Íj½ɹù×Ûº¥¥ƒvƒvµØ…ÚÑÓÛ«‚ ½9›¡ĽÇ»¯¾‹ÜỬ躛¾ÍÓ£äÛ~ßÛơº¡Ô½«º±»±»ÏÔË̉̉©Óø×ĂÖƠºmÅØ·Ô½ÔƯºëÂ߈ÓőƋ٫‡“ÍjñÆơ½øæÿ¯¶¹Ú· +ƒvÁăû¿‰¥ÜÛ׃v½ëöÿ¯¶ÂÿÚÛ×ϺÙơÔ¹Úƒ½³”̀Ê)èÛ8¤߈µØÁĂ…%ÀĂ³ŒÍƠùêÚ×ÇÖáÉÛơêÁ×Ơ/º¢XÔÚÍB©vÀ¹±»·Ôëö½ơèÅƠ™‰kß [ïSăˆŸ;å ½ÏÔáƠ›¾ƒvá¬ăˆŸ‹Çëƒv¼ơð»ơêÅ߈·‡‘×8çơê½ôëöçZí™Ü á¬ĂëöóÔå$ù×½™‰kß [ïS«Ô¨°™‰kß [ïSåôI󿉗¶ÓÅ8¤‡¶ÔƠ¾GëöûÙƒ×ơèÅëöÙڡǺØóÇËÉ9ßÚÙÚ·§D ûƠÏÔ™‰kß [ïSÏÔ«Ô‹ÙËÇ‹ÇÂ凗¾‹Çă»ÑÄë³Â·Ô¡èºχºy߈ëö«Óơ—ơﻺɇåÁ¡Øÿ׬ֽ¹ÚñÚÛ«‚ ½9ùê÷‡¢X¯¾Ľ¡Çùס£XÏÅ…u°» ™‰kß [ïSüÀ·Ô»ôƠX9¥‡×Û×Û«‚ ½9«‡“ÍjÏÅù×9¥‡Ở«»Ù½‰¿IÓ%ÅØŸÈ߈—¶«‡“Íj ËûǺ™‡¤ˆ\0ùæÛº±»óǽ«‡“Íj·Ôƒv¯ÈßÏ›¾߈»Ă‚v +ÏÅî²2 ƒØ߈ŃvëïßÄÙËÉ9ËӗÁù×dzÂ߈߈æ̉ö™ÔÏÅ㻕¾ơÛûµê£äˆÁà•Ö9¥‡³àÂÙ«‡“Íj߈á ß„èñÓÛ«‚ ½9߈Åä̉Ơ¥¿ôéêöåĂÛ«‚ ½9߈èÓÙÚ›¾Ù½ŸI¹ÚåôĂÙ£X±»½ă›Úÿ¯¶™Á÷‡™‰kß [ïSÛÔÏÅëö¸ÚƠµÜ«‡“Íj…àóÔv§à¥Û°»½ơê½¹Ú¡ÔÚÀ¡ÔƯƠŸÅ¿ôă§Ó߈߈²(å¿ÇÑÄëÓÆÿÚ†º½½ôϹ䌾NñÄ“ÛÏź±»8¤‡ù×ñÓ“Ơđù×ÚÔ±½¡«ÓØưÀ­Öß»û…ôưÀǺӺÁñ¿Ă èôe Ç̀Óù×±ëØĂç]²z¡ÈăˆŸ™‰kß [ïS·̣®Gø»¼‘Ù½ƒvù׫»Ù½±»“ÈóüÏÔ“Û«‚ ½9­Èï»߈߈ÏÅù×ëöµØäñ÷Á“û©-%ĂÖơꙉkß [ïSƒ¿‰ÁçÚáïÚáđ™ÁÏÅÏ̉ÛͽƯơÓº›¡½߈±»œ‰¾IÏ̉Û×߈ù×Çâơ$¾­Öø×±»ôêƠXï²2«‡“ÍjÓÆưÀÍË)éÛ9¥Û«‚ ½9¹Ú¤߈©Ó—¶ÏÅŸ}ÍƠߌÛ,å̉ ÑĂ›¡™‰kß [ïS©¼ŽçUùê±½¹ÚĂº™‰kß [ïS×¾¿…ÇëöôêÍßÅØ­ÔíÁùêÓºؽ±»ï½¾ù×9¥‡×ƒˆÛ»÷ª¶2tT߈×ñ»×̉Ûº“ÆËƠçôÿÛùêóÇÁƯ±»ử́ƧӃvÙ½ÍÓ³¡ăˆŸ;«‡“Íj½ë½ö4™ÔĂĂ ›­±àéMĐơê±»—ˆưÀËÇ™‰kß [ïSÏÅ«‡“ÍjÇØ•«‡“ÍjÛ«‚ ½9ơêëöăˆŸ;ÏÔÎű»á=÷Ô–ˆâÁ¹ÚÛ«‚ ½9ÅÓ­Ô×¾Áù‡™‡ôê8¤‡ÔXÁÓÔ”Ûº£ä³Æ«Ôó¯×Û«‚ ½9ø×ëö±»©‡¥2ßëMưÀø×±»…Œ߈½¤ˆ\0ï‡ÛÄÓÇ¥²¹Ѷ߈9¥‡×“Æù×Ô«·3uU±»ơÔù×ưÀ߈éÓû(ĂÙ§ÀÖ¾å̉ «‡“Íj8¤‡¡»½ÿÚ÷‡‹Çëöùê߈ÏÅ“Ơ¾½á·‡‘×8çØĂëöÀĂÅù׫‡“ÍjµØ™‡Û«‚ ½9߈™‰kß [ïSóLJÙÚ߈ù×9¥‡ŸÈÑÓưÀ™‰kß [ïSëöçÚƒÖ÷Á÷ÚÏ!í­ÄƒÔáÓÏÔ™‰kß [ïSÙƠ³ØÍƠ·‡‘×8çăˆŸ;¹ÚĂÙ™‰kß [ïSÁƯª‡’̀jỄˆ«Ô—–©È߈ÿÚ™Ăá¸ƯÓ «Ôëö‡ºÖĂ +ù×˱ÄhĂÏÅÙÚ½™ôå×Û«‚ ½9ë™H¯ơÙÚ³ÈÍÓ“Ơ©Ø‹ÜéÓƯÓ áê•ÜƠÄ̉ƣǛ¾רŸ}éï»ÏÔƒƯºù׆ÚÏÔÛ×ăˆŸƯơµØÖ¼ßÖá=»Ø±»éº—ÓÛ«‚ ½9ŸØ³Û»Óû˜êèä÷‡ûĂׯ¿‰ÏÔù×ÏÔ”ö½˜‰j̃ZîS8¤‡ü¦†ÁͶ‰ +Å–«ÓƒvÙÓƒÛºçÚ½©¼Û«‚ ½9ëöƠÁ̉›¶éµØ§ô™ëéå«Ô満¼¶ÏÔÿÚéÚËÉ9¡ÁăˆŸ³ô´aï³2É̉ăơ½ĂµØÇ"9¥‡ÖÆ ơÔÂÙ…Ôù×™Ô™‡öÓº»n¿‰•™‰kß [ïS¡ÔÏÅ¥ÜăˆŸ;åĂׯƒơ¼€Ç̉ÙÜÅÓæ̉±»ß­Ä¿ôëöívăĂÁ̉“‰¥ˆ]1₫ ®¶ ¥Æ™‰kß [ïSĐæŸÖ8¤‡›¾9¥‡×çÚưˆ•Èû›ÿÚ9¥‡ÏÔÔXׯ¿Å·̃Û×ÅØưÚ߈߈ï½Úª‚ +¼9éê„§Óá°»¯vÚ·Å9¥‡ƯÓ ¡§ÓÛºÛ«‚ ½9©À™‰kß [ïSÏÅ­7ùêÚª‚ +¼9Ù½ơ꫇“Íj™‰kß [ïSăˆŸ¿ô«‡“ÍjÇ»¹ù×óÔ”ÇéÓÍÂÛºĂƒ¾‘÷Á—»œ‰¾I¿ô8¤‡×Ù½Ï̉ù¿Û«‚ ½9ù×̉ÅßÁ»‡—¶£»ÛºßÄÙ‘¼ñÓ±»÷Áëöׯ—ˆƒäăˆŸ;ø×«ÔÁƯ¿ßÛׯ¾‡ÇµØƒ×Îù×âÁ‰Û°»ÏÅ›¾÷Á©‡¥2ßëMù×Ï̉Á|óĂù×9¥‡×†öïƠưÀ½€ëöĂÙ•î½Û«‚ ½9½öÁƒvÙ½‡ºÛº½v·Ôăàù×êö¹'©%ÁƯ½ëÓÂÙÙ¾êö߈ܼ؟֋ǫ‡“Íj‚vÓØ¸ÚжÁå•LJÛéÔ«Ô½­Ä¡»÷ÚÿÚ9¥‡¼€™‰kß±»Đű»½€›¾ù׿Åù×½€µ†«Ô“·×¾º‡Ú½ÙÚß»û¶Üơꣻ¡Áí—G±»µØ߈Û«‚ ½9ŸÖ«‡“Íj¥²ÈÏÔ‡ÏÔ§ô‚£ Ïņ½÷ˆÁÁ̉ßÄÙÁĂôê ípÅ–ăˆŸ;ôöÁù×±ÜËÉ9ƒÖ÷ÚÿÚäơçØ×$Ëæ™‡ăà°¿ăˆŸ;ƯÓ ¹ÚùơôÑĂËܧôµØĐá…Ơ¼ë÷Á­Ù÷ÁË¿éơĐű»ÏÅÏÔÏ̉Ϻ·Å¹Ú߈ëØÏԑƬۇỠˆ9¥‡«‡“Íj˜‰j̃ZîSæØá Ù½‡ÚÇ>·‡‘×8çƠ÷Á“̣åĂèºơèÅ©¼°»×Ơ±¿«‡“Íjµ†ä×9¥‡߈ø×ƒ¾‘ߌÛ,Ž¹Ú¶ è ¡Ô­ÄÛ«‚ ½9™ÙƠÅÓÅÓ½߈ëöƒ§Ô°»ơÔÓÆƒv…£­߈³ÜéÓÛ«‚ ½9°»ÿÚÓüÛ×ÿÚơ«‡“ÍjÑÄë›vÙÚǼ«‡“Íj¦ôëöÁ×çÏÅÑØ×ÓÛ×çÚçÚ‡¿ȹø¾çôÓÅĂ¼çڜ—¶ôêÙàÁ ·±Ù½Ú×ËÖæ̉߈ï»÷ˆƒvÓØÛ8¤‡±»¤ˆ\0ưª¶2tTăˆŸëö¹óöÁÏÔûºóDZ»«ŒÅôÅ»Ѿ½÷Áù×Ăȱ»Ù×íֵؙÁưĶÈâˆ÷ˆ¾À™‰kß [ïS¥ÏÛºí+ù×Û«‚ ½9ӼÁ«‡“Íj™Î¿‰¹ÁĂ#âÁËƠ߈˜ô½éÓÓ߈ƒạ̀ÿ¯¶Ăȃvù×Û«‚ ½9¡»åŒ¿NÇÖ—»ä̉£Ç÷$¿́шơêÙ½ăˆŸ;Ù½óÄŸëá=“Ơ™‰kß [ïS·‡‘×8癉kß [ïSÏÅëö½Ô¦¹»ÁÛÄÓ“Ơ«‡“Íjå̉ ½‡Û­ÈĐĂï»÷Á÷Ú™‡‡Ç£äÛºéºĂƠ߈½«·3uU“È¿(ơºÛ×°»ñÓăˆŸ;̃ˆöéÓÙ½ư­ăơăàÏÔ•«»9¥‡…»éÔ‡ŒÏÔÓ¼á¿ôùê߈âḈ›¶é›çƒˆɇöëö»» Ơ ™‡¥ˆ]1Û«‚ ½9¯È™Ó›ÚÛ«‚ ½9éÓ—ˆÛ«‚ ½9àƠËÉ9Û«‚ ½9ÿÂƯùêͺ߈ƒö÷‡”÷«‡“Íjư§‡×¾Å»ÿÚÏÅÀ¹߈ÙŒë*«ÙÚ«‡“Íj·ÅĂÙ«‡“Íj“ƠÙÜ™Ø̉̉¿‰©Ä“Ûø×È̉¡Ư¿Å·Å±»ôëöÏÙ½ƒÖĂ¼Û«‚ ½9ï½»n9¥‡é‡”“Íj8¤‡×½ưÀñƅ±»Ϻ—¾Á¹Ú²ØÈßÖ9¥‡×Å·«‡“Íj‰Á­Ä¿ß²¾ÏÅ›¶é«Ô‡Ûç̉å̉ ¼‡ÍÓ­Ö½Û«‚ ½9ŽÛ«‚ ½9Û«‚ ½9ÛëçÏÅÿÚ—™‰kß [ïSÑÄë½Û«‚ ½9ó#½Ù½‹‚á ÿÚ߈ƠçƠͼ󰻌ưˆù×íù³È€ºøæÉ)‹ëƒ=ßÄÙÅ»©‡¥2ßëMÏÄƠÁ÷ÁĐÄê›Ú½€ø××ƠÛºƼ ßÁư¡Û«‚ ½9ư­ëöÏÔá¾™ô™ëéåƒÚó¹™Ó—º÷ÁÇØơÄ»n»Ă­¾×ÜŸöᙉkß [ïS¶½€×Ơ¥Æ©)ÙÚ»½ơꙇ½ăˆŸ•˜¦Óđƽἰ»±Èƒˆ…%…Ơ¦Ø £X¹Ú«É߈¹Ú©‡¥2ßëMÅØẳ«‡“ÍjÙ½߈ƒv¯Ơ»Ø•ÔÄØR“ȱ»ëöÏćø©ÇƯÓ ǺëÓÉ̉ÑÓË¿£ØÁƯÛ×”Èú¦ÖÙáƠưÀÓØ«‡“Íjï½Û«‚ ½9™‰kß [ïSè‰đ5đ¶ùĂÙÖÆ¡È—¶ÏÔµØç̉ͼѶ÷Á«Ñ÷‡˜‰j̃ZîSÇÖßÄÙµØÛ×߈ű»—¶¼ÏÅ×ƠËÓæđ½àÙƠ©Á&Û«‚ ½9ÖÆăˆŸ‰Æ÷ÙÅø™‰kß [ïS¡ÛơÅçÚ÷ÚÅÚª‚ +¼9Ï̉ÁÚăˆŸ¡È‡ŒÿÚº¦Èá ¿ØöưÀ£ÇÛÀƒvÁñ™‡¦¹‘Û›Û«‡“ÍjÍÓé‰ñ5ñ·ú ƒ×ϺË¿ÙÜăàÑÓÍÓ‹ÇỞ…Û߈Ở‡ºÍạ̊Ç¡Ưå̉ §ºƒơÔÛ«‚ ½9½™‰kß [ïS˜‰j̃ZîSƒvÛ«‚ ½9ÅÔ¸Ú½ù×Ổ»Åø×—»ăơÁ¹ó#©‡¥2ßëM«‡“ÍjùףdzÅÔÂÙƒĂËÛÙ½é-Ù½ăˆŸÙ½Á̉½ÇØùêív•ÖÍÓơêï½·ÅôĂƯ…»ùê«Ñ™ôơµƠ÷‡¬Ö,ơêéÓƒvûÓéÓ™‰kß [ïS±»¼€Ù̉½¼€ư“éú%‡Ç¨º½Ă»ØŒ¾»ˆ—Ó”ÖÿÚÛ«‚ ½9öÁ“ƠË̉ÑÄëƒÚÓØ§ôéºơêÑĂù¿¡»‡ñ5¹}›¾¬Ä¥ÖÏÔ£ÇûƠ«‡“Íj»§Ÿ‚m‡³Ç¾»ˆØË¿ºöĂÙëÓÅ“ÆÑÓˆƺµØ®×Û«‚ ½9……ô™‰kß [ïSËÓïßµ…ƒˆ‚ù×ăˆŸ‡“ưÀôễÄØ¥Û«ÔèÓÛ«‚ ½9µØ™‰kß [ïSùê…ô½Ø£ä Ëû«‡“ÍjÅØÓ|öÁ÷Á½±º؇!Î9!„!§Óш½ƒÚĂÙ¼™‰kß [ïSÁ¼êöëö™Á‹Ẹ́̀ÓÏÔÑĂù×ß»ûñÚÑÓó¶óǯ܂¾®×ù×’‰’2’’Ô,’ø’ËÉ9߈›¶é‰ׯóǨ¼ăˆŸ;±ëØ“ăÔù×¹½›½ƒăˆŸ;k‡x§Ô߈°»¯È½…€­:ù×ß»û¡Ô‹Ü·ºăˆŸ;k­Ä™‰kß [ïS£Ô¹ÚƯơ¹Ú­Ô‚¾Û«‚ ½9º„Û«‚ ½9Ûׇ9ÁñµØ߈ƒv½……±¿ÑØåƠơêÅÔ«‡“ÍjơÄÙÜ›ÚỞéÓëö«Ôµß¥ÖœÜŸÅóß„Ơ«‡“Íjù×á çô±¿°Å«»«‡“ÍjđÁ§Æù×±»ÙŒë*«™‡™‰kß [ïS˜‰j̃ZîS«‡“Íj­Ä±»Û«‚ ½9º̀Ê)èÛ8¤ßÄÙ“Ô‰Ô¡È罕ÔßăÁÍƠg·߈ßÁɇ±»½€½íÖÏÔƠXèê…ÛĂÙ‡º™ëéåºÿÚ™‰kß [ïS“Ơµơ±̣Ăƒ¾‘üѶ«‡“ÍjĂƒvăˆŸơÔăơå̉ ơê¾ëöƯÓ” ÛÏÅö™Á›»ƠÁ±½ûƠ¿ßỞ•Èû›ó¶ơê—Œù׫‡“Íj¥%ó×íÚ¹ØÏÅÖ¹á ¿‰™‡ăˆŸÏÔăˆŸ;‡Ú¥‰ÍL…›¶é”ŒÓØ™ëéå«âé„© ÖĂÏÔ«‡“Íj¾º¥Û‹ÇåôñÓ¯ÛËDZ»ñÆĂ轇º. ‡Ç¡¼·Ó ¥0ŸƯº…»ÿÂăàÀ½ñÓÁ×ïÚ¼©‡¥2ßëM™‡Á̉™‰kß [ïSöÿÚ̃ˆ «‡“Íj¶èù×Ở÷Ú‹Çÿ¯¶Ù½­ÖÙÅë¡Á̃ÁÀ½¿ºăˆŸ;½¹)ù׫‡“Íj‚ÖĂíºÔXßÁ©¼ÏÔûĂÛ«‚ ½9¬Ä™‰kß [ïSº÷Áăơ߈Ó¼¾‘gµØÿÚưÀÛ«‚ ½9ùêĂÙË¿ƯÓ ÏÔY¥âÁ½ù×̃ƯÅÄÑÁåÁăˆŸ»ù×嫇“Íj©Ó³ăÇíÛ«‚ ½9Û«‚ ½9× ·‡‘×8ç±ëØÏÔ‹Üù×á 麽¹Ú±»ÁƯÏÅ«ÔưÀưĂÍåívÈÙ›¶éÓ¾™‰kß [ïSßÁƠØ®×̀Ó‹ÓíÚ“¼ÑÓëÎÑÄëçù¿™‡ï‡ơç°»¿½ơľ¥ÓëöĂ‹Çù×9¥‡₫®¶±ëØ–»Û«‚ ½9¹ÚÙ̉å¿ĂȺ̉ăÁù‡ù¿È̉£Ô˜ó áØ¡ÈÛ«‚ ½9«ÔË•ƒvÿ¼ó½€¹ÑÛ«‚ ½9½ÔXÇÖßÚêÚƒvßƯưÀƒ½áêơèÅĂ8 ¤‡ ¿èÅÓÑÓßáµØÿ¯¶›¾±»ŸÖ¿‰—ŒƒÖ₫®¶Ăơ»ïôû(ÙÚÂÖ߈ÏÔ»ˆ…CÚƒvÿ§ñÓχŒÛ«‚ ½9›¾ëÓÿ¯¶߈ç̉ƒv±»¿»‹ëÛºăˆŸµ©ñÓÿ«³ôâˆ:jÙÚÇ´—¾ëöÑæ­ÄÀĂỔ»y©Ó‡ËÉ9†À¢äù×ơêÅÄÓÛÚù×¥ƯÛ«‚ ½9ăˆŸ;k߈׿8Óº˜‰ j ̃    Z îS ƯÓ Óˆ•=‘±»ƒ¾‘×ƠÉĂ÷›”Å¥ưÀ9¥‡­Å¾ăˆŸ;·Å™‰kß [ïSÁƯâ½µØÅ·«»ø$ñӆǙ‰kß [ïSíº­Øƒ¥‰ÍL…ưÀưÀ‡Ç÷ăˆŸ;§à¹ÏÔ£äËÖ·ÅÛ«‚ ½9ÍË)éÛ9¥¥Øù׃v¬¾ß»ûÓÔ¹ÙÚ¿ª‡’̀j“ƠµƯíêĂÙ•ºçÚµØÀ×í·ăˆŸ;ÓºéơÉƠ™ÔùׇŒ¦Æ‡ñ5ÏÅ›¾ƒv‹ÇăˆŸ‹ÜßÄÙ±»º9¥‡™‰kß [ïSµaÏÔƒv©Ø™‡Ï̉«Ûƒvù×̃ˆÏÔ½âơ¹Úï½ÊÈ9‡Œëơ«ÓÏÔ“ƠăÚÛ«‚ ½9÷ÁßÄÙ´ÀăˆŸ;ÏÔ§Ô™‹œ‰¾IÙÅëÛ×Ù‡Ï9…ăˆŸ;Û׿‰óÂëÔóǃvĂáêׯÏŇŒ¹ÚÑÓ‡¾ËÜÿ¯¶Ž›¾đØ™ô›Ú߈ÍÄöψá=Ž«‡“Íj¯¸Úá=«‡“Íj·‡‘×8çĂ♉kß [ïSù×ùש‡¥2ßëM÷‡©¼¹Ú¾ơúÙ̉¥Æ€ÇơÔơï±»±»ŒƠÑÓÑĂ½í‡ăˆŸ‹Ü÷Ù̃»úơêÚº½Ô±»ª»ĂÙÛ×½đƠạ̊׿8éÜ×ÓºƠ™Á‹ÙÙ½ËéÙÜ‹ÇáÛ¹í±»ăÛÖ‡¼7§Ó½ÜßÁƒv½Ă£ä©¼¿ô‰¿IËÇĂÙ…÷öù×ѦøêÛ«‚ ½9¢Ç™‰kß [ïS™‰kß [ïS©‡¥2ßëMÚ½Ù½½ÏÄÛ«‚ ½9ù×÷ÙÍçÆơêá¾ÂÈÚª‚ +¼9Ϲ¡Û©&ĂÓù×™‰kß [ïSưÀ8¤‡×щ©Óù×ăˆŸ;k§Ô₫­Û«‚ ½9±»ĂóÇÏÔ£‡ï»ù×·Ô9¥‡ÿ¯¶ú̉ƒ×°¿ù×ÁùדƠÉ»5Ù׫‡“ÍjÛ«‚ ½9™Û™‰kß [ïSửÛ×ËÇÅØÓ™‡ÅàÏ̉Í«‡“ÍjÏĘ ê è ä Ûºéê·ÔôïƠÑð»ÅØëö÷ˆăˆŸ;™‰kß [ïSÿ.öÁơê‹Çƒv·ÔÛÆ½ÆăˆŸ;ưÀ±»́Å·ƒvÀƯˆÁơêöÁÖØÛ¥½ÔưÀ÷ˆù׃½í—G´a“ƠƠXÛ߈¼ăˆŸĂÙ±»ñíȺÿÚÏÅưˆ¯€¿‰¡ÈÓŵس ĂÈíÖ‡ưÀ÷ÁöÇֻӵتơ¡ÈÑÓ­Ä·ØÁƯíđ°»ÿÚỂÙ½‚ƠXºµØÏű»¡È߈ùׯ¼ƒÚ߈™‰kß [ïSÛ×›·Ô‹Üƒơđ™‰kß [ïS߈ăà‡ŒăˆŸ÷ÁÑĂ߈Ûº©Ơ™̣ù×ö}‡Ú­Ø±»³ù×̀Óß»ûƼå̉ ÛÆơÔµØẸ̀ÑĂëöÿÚ߈‹Ó·>©Øù×Ù̉ÿ̃ׄ™‰kß [ïSå̉ ÍẠ̈į¼ĂÙ½½­Äºù×­ˆưÀƒÚơêư‡±ù1ë;ùצӹ֨Å3ê3Ơ¥ ÷ÁƠºm±»“¹ƯNƒv¹Å‡Çí—G÷ڳ«‡“ÍjÏÔûº±Ô½ăˆŸ«ÔƠ‘Æñ…ö±»Ăívăàù¾êöÛ¿‰ÆØ·‡‘×8ç¥â“ÈÛסԿc«Ôà¬ËÉ9›‡Ù×ëö±»ÅÓéÓ·Û™‰kß [ïSÙÓ±»µ‰£äå¼ ‡Û±»ĂĂÁƯắ/çÚëÓĂÙ9¥‡Έ™Óỡׯ÷‡óÂëö«‡“Íj½óƯ¿ÂÙÏÔщǽÑÓ±»í‡™×§ÓÙÚ«‡“Íj©ˆƯÍĪ» +¯¾ïƠûËóÂĐÓ‹ÓªÈËÖñ߈Û«‚ ½9ĂÙÏÔ¾߈ư“ÿÂßÄÙ™‰kß [ïS ËûăơíÅĂÈù×óÇăˆŸ;k߈“Æ»˜Ô£Øï½³Ô½à˜ơº½܈ôơÔËSù×ȧÔơÔóÔù×̀Ê)èÛ8¤‹ÇăˆŸ“´™‰kß [ïSñ×Ơß·¼Í7ƒ¡ÔùêƒvÛ˜ÁñÓźëÓ׿8ƒ½½߈ù×ÿÛă­‚vƠ¡é‰ñ5ñ·ĐÄêƒv½±¿›·ÔÙƠº¶µÜÁׇ±¥ÆÓ̉íiÁÚ«ź±‡±»«Ñöö₫®¶ÏÔ±»¬ÖŸÈƒvăˆŸ;ƒ¾‘ơÔ˜‰j̃ZîSù¿—»“½9¥‡ĂÈñÚ›¾ƒvƒvçÚƒàù×êöÙÚ߈¹Ú«‡“Íj©¼Ó̉»qÏÔÙ€ëöù×㻫‡“Íj߈ƒvĐØß„ăà“¹ƯN³ơÔá ³ØíơÑĂ½€‡ç½ÙÚåĂ½ÔưÀơºçÚóÂÏų(ăà—¥‰ÍL…¼±»Ï̉߈—¶½Û×߈߈ùêĂÙÏÔ×ĂĐˆ¹ÚÛ«‚ ½9ŒºÏÔרÙÚ‘ñĂÙĂÙ„Ø÷ˆ³Ñ•Ë̉ăˆŸ;ù×Û«‚ ½9™‡‚ˆÁÙ׃vÏÔù×½‡ÏÔ±»߈ÏŵaƠơ©Üÿ¯¶éÔ߈₫߈¾¡ÈÏÄ·º½™‰kß [ïSĐv;ÁƯ‹ÇåºÛºÿÂæØº½ƒ½¢ä±¿“ÈíÆëö™‡ÏÄÓĂâƒàÏÔ߈·Ü‡ºëö›¡»¼‘™ëéå½ÇֵأØ×ƠƠ߈»íÚ×Ó!›çɣ使ߺÏÄôê­½¼Û«‚ ½9ƒvÑÄëơèÅÑÓÓˆ•=‘ơêÏÄưˆ«dûÓ¯ƒßͯ¥'=U#QK¯Âí꫇“Íjƒ߈‡Ç“Ǩ¼µØψÓ̉‡Œ•Œ·˜÷Ú“Ơ»Å°»ĐÄêĂ֋ܩؗ»ñÖá ơ꛾—ˆºûËăˆŸ¥â¯ß°»µØ´Ø€9¥‡ƠÄéö´†ÏÔ½“ºƒ­Ö›Û‡Û¡ÈÄÓÙ׉ùî»°»éؽƒˆÑÓ÷ÁÅÓÉ̉µĂÓØÏÓÛ«‚ ½9¡Ạ́ÂÑÓÀơóßÚ¨ÓăˆŸ;kỞ™‰kß [ïSưÀ˜‰j̃ZîSåĂ‹ÈĂÈÔX±»ƒ¾‘½¿ß›Û‡ºëöïƠ߈ÙÅ뉿Iï‡Ă·ÔÖĂ™ÓÔÓ˜‡ÏԆڡȱ»±ÔÏ̉¹Ú±¿ׯ‡»ÈÛ×™Ô¨À™‰kß [ïS·¼Í7ơèÅÉaëöî½ ăˆŸ;kăˆŸ;k¹Ú‹ÙÜÓ “Ơ‘ÍÄ߈ăˆŸÅÁ½È¿‰º“Ơà ÄéÚóÇëöƒˆ›ëÚ­ÄÚçƠ±ŒƠÅщÇâÙÅëăˆŸ;k»Ö“Û«ÛơêÅÔëö›¹ëß»ûÁƯ¿‰›¾щ«»Û«‚ ½9µØ¹Ú¦ƠăˆŸ;Û×8¤‡ƒˆù×ù׃̀Ê)èÛ8¤·Ü±ëر»ÿº̉·¸ÅØÂïôǺƒÖ¯È9¥‡ÅӇǛ‡¸Ú¸Ú°ù×›¾¹Áơl“ƠăƯ˜êèä߈Áơç´ƠÁăÅØ€º¾(—Œ•ŒƒÉơ꫇“Íj§à¥ÓÆ»¡ÛÓ̉∵†éÓ¯l¡Çù¾Ù½“ƠÁ íÆ‡ÇăˆŸ;ơê«d›¾Á€™Ô³á ß»ûÍÓ½€³ ƯÓ ½Ư‰½¼™Ó©‡¥2ßëMË̉¶çǘêèäø×Ù½•ǵضá öéÚửíÖÍÓ±»ƺ³ØĐÄêÏÔ©Óù×óÇÑÅ™‰kß [ïSà­Ä‰¿IÙ̉«·3uUŽưÏăÁ¯Æ™ÓÑÓ™‰kß [ïS«ÔäÁ«dív‰Ô¹Ú¡Ư¹Ú¿»߈¡Ô£äËÉ9öûƠåׇÇÏÔăà·Ô“ƠöÁ +£Ô×Ơ¿‰Á̉ׯơºÿÚù×¾§Ó«»ÿ§«‡“Íj“Ơ¡Ơ†Û±»ó#ËÉ9ÑÓ½“¹ƯN÷‡Á̉ỬµØÙ½́ơĺ½çº—ˆϼ¶Å±ôÛ«‚ ½9ơÔ«‡“ÍjƠ +á Ơ½‡Ú̀Ê)èÛ8¤Ûù×ơ»ƒvû¼ÎŧÔÙÅëưÚĂƠ麑³Í¥—¶ÑÄëØ»ź™‰kß [ïSÑÓöÏԵة&«âáêĂÓΙ¡ÛăˆŸÙŒë*«›¾Û«‚ ½9ÏÔûƠ™‰kß [ïSÏÔ«‡“ÍjÍÓʿ۫‚ ½9߈êÛÛ«‚ ½9ø×Ïű»ưÀϾ¥O™‰kß [ïSÁƯ§Ơ…ƠÅà8¤‡×ÑÓïƠ½€á µØ÷ÙöĂÙưÀ•ÜÁçÚgØ-—¶ßÛ«‚ ½9¥ˆ]1ĐÄ߈Û«‚ ½9Û«‚ ½9ƠÅ̃øá ‰ÇǼưÀœÜÏÅĐÄêß™›¾¡Ô³½€½“ÆơØ™‰kß [ïSª¶2tTưÀửÍUƯÚá ½ÅÁ¯×ÏÅÙ×ù×߈ăÚ߈ˆ½€“Æử“Ơ§ÔŸ}ÏÅ™‰kß [ïSĂÙ5Ô³×ñÚÏÅù×ß»û°¿ơÔÀĂ¾ÈÏ̉ÏÅ×̃¶¾³ßÄÙ›±¿³Â–ÛăˆŸ;kÛ«‚ ½9ÍÛÛŤÇăĂ3ç̉ø×•Èû›¹Ú©¼é‡ÏÚ©Ç߈ĂÙ›Ơ•{°»ƒÖåĂ™Ô£»µØÊLJŒÍÄ…ơ­ϼá¼ôºÅơêٽ߻û±ëØÑÓÛÚÛ«‚ ½9—¶—»óÂçÚÚ«ÔĂÙÙ̉÷Úù×½€Ö™Á½Å±ËÓ߈‹Ç­Ö›¡Ï̉Ơáê°»™‰kß [ïSÍƠ߈ù×¹Úç'Û«‚ ½9«»9¥‡ĂÈ“Ơ§ôăˆŸƠ'ăˆŸ;k©‡¥2ßëMÏÔÿÚĐÄêˆăơ‡Úư‡±ù1ĂĂ ›­±àéMßÄÙƠÁ÷ˆ¿‰₫ñÖ“ºưĂ‹Çï»ăà§¹ĂÙ›¾߈ÏÔÔX³ơÔ¾™ëéå‡ñ5¶™Ø‘Û™‰kß [ïSăX¹ÚưÀéºưܱ»ƒˆơꩼ½ưÀ•Ó(¬£ƯÔ½€ÿ¯¶À¹±»¦¹›ÛûƠĂÙë$¾ăˆŸÅØ”åĂÏÅܳƠØ×.¹Ú™ÁYƠ¯Èç̃ÏÅÙÚùêÀ½ñ!«‡“Íj‚v™Ô»»ÏÔ½߈‡ÇñÄă­9¥‡íÅÁ‰¤öÁóÇÓ¼ÙÇÚ×çØßÚ߈ưÀƯÓ Ç̉̀Û¹Úơê Ëûêơ©ûé9¥‡Å«Ú˜‡ °êØÍË)éÛ9¥—¿°»·‡‘×8çÛ×£»»ØßÚ…ÚÖ̉{—¾ơ꛾¨‡¤2€̃êLƒv‡…ÎÅÁƯ¹Ú·‡‘×8ç·Ô¦ØÙYÿÚáƯ«‡“Íj—»‹s¯¾½µØ¸Ú߈Ù×™ëéå߈ơç÷Áù×ù꫇“ÍjÜ—¾¶ÔÛ«‚ ½9ăˆŸÙÚÙÚ±»Åر½™‰kß [ïS“ƒvưÀº©Ü̃ŒÚ,¾ëöÑÓ»qƒvÙƠ߈ºëö‹Ç̣Ʊ»©À­Ä߈ÏÅĂÙỞĂ¼½±»±»ëöĂ¼¨ƠÍөǨ,ôĂÙÊƠß»û½±»ƒv·Å¶¦D ¿ç̉×àÏÅÓÅÙ‡Ï9…%¹ÚăˆŸ;ív×¾µØ½åƠ¸ÚºÁÍĂóÇË¿ͼÙ½Ÿ\ÿÂùêÙÚ©¼ơÖáÛöÁ™‰kß [ïSÁÓ¥Î߈ÏÔ½ôå¼ ‘—エ؉j̃ZîS“Ʊ»èº·Ó ¥0“ƹÚïÚơêéŒơû‰Û‡Œ»Ă±»ù׃v™‰kß [ïSâơ÷Áƒ½½é•ÇÚ…×°»ÙÚ­Ä9¥‡¡È́–GG½¹ăˆŸ;߈â» »Ú±»»ÙăÁ½¾‡ăˆŸ;kù×áêÁ‡é/×:×¾ÁÜ·Ô©¼÷ÁûØăÁ­ÖÁƯ…»ăˆŸ;™‰kß [ïSú‘ƹÚÙÚ£œ‚v«ôÙ½ÙÚÛ«‚ ½9©Û«‡“Íjá“Ç—¶Ë4ưÀóåëöÛ«‚ ½9ÏÅ›¶éöµCÏÔËlëöí‡Ç†Ú÷Á¾»”ÑĂ½Ç¹àªÚáÛϺÏÅ߈™Ô±»ÑÄë‹ø«Ô¾¿ÑÓ¼ø¿áÎĂÆ·Ôăê×¾˜ ê è ä ëö™‰kß [ïSÛăﻋÇÏÔǺÚÀ£Ó÷Á›¶é‘ƃÚÑ€ù¿™Ô߈ª»£Ø¾¸Ú¯¼„Ơ߈Ó ¨¼«»ùו؃vϼÛלÜù×ÓÙ½éÚ«Ô§Æ—¶™‡ùêÅÓÖÆ!˾º9¥‡߈Úª‚ +¼9º½™‰kß [ïSµØÁ̉ÁƯĂÖÿÚ™Ô±”ÖÆư§‡ù×±)ÅԌѳÈñ·ºÛ×áÛ߈»Å•Œ¿߈Û½ôĂͼ×ôÙ½·‡‘×8ç³÷Á—ŒĐÄê‡Úôê±»₫ÇŸơÓ̉ëö߈ÅØ–Œ·Ô·§D …Ơ™‰kß [ïSăÇí¥ÆéØëö…™‰kß [ïSÙ½³ƒvÍ߈±»ơê²Â"Å•÷—¶ôúª‡’̀jÓ9¥‡›Úƒˆ½›¶éóÔÙ½§ÔÑÄ뿺“‡Û̀‹Ç¹Ú¤ÜááŸ\ơê•׳‹å‡®GøËÇùêưÀÓÆ½’Ơ—¶ÑÄë߈«‡“ÍjÙÚăˆŸù×ÏůׯȪԑ÷ƒÖ«‡“Íj›Ơ9¥‡ÏÄÏ¿ö§Ơ‹ÙÑĂÛ«‚ ½9÷‡ÚÂ…8¤‡ơêĂȵØơêù×ßÄÙÙq×ơÅ÷Á›¡¯°™‰kß [ïSÇÖ¹Ú·Ô¹ÚƠù׋ܨºÑĂª‡’̀jă»Û«‚ ½9ÿ¯¶çÔ¡ñLJǓƠù×ưÀ»Ă½€«‡“Íj9¥‡ù×åºѶ¾½Ăº¡ØơêÏ̉¹Ú½Ẩ—ˆ³ ăà£äÖÆÛ«‚ ½9ăˆŸ;k̀ĂóƪÔÛÄÓ·Ó ¥0Ä–á¬ÓÅ›¾ôêéºÿÚ¡ÛÍÓ«Ô½€ư¿ÏÄ‚˜¹Úô×ÜưÀ9¥‡ó.©¼ÿNÛ«‚ ½9χ±Á¡Ó¾ß‹Çù×߈ÛÀ‡Úߦ“¹ƯN9¥‡•qĂÙ«‡“Íj¾±»½ØŒê*ª«­ɇÛˆív½¯Ơ߈¡ÔÛ«‚ ½9Ư‰«‡“Íjíê«·3uUƠÉÖưÀχù×·Ô±»Ñ̃ö×¾º‡›¾́vå½™Ă©‡¥2ßëM±»óLJ“±»³È‡Ç߈½·Å±»Ăº½±ºƒ×ăˆŸëöăˆŸרÏÔŸÈͼׯÅÓƠX½—»›¡߈Û«‚ ½9ÑÓ߈߈ÿÚ̃ˆ ÙÅØ³Øñ'·ÅöơêăˆŸ;Ö$$‹ÅăˆŸĂÙù×î»ù×ëöĂÙàˆÀ0p›ÙÅë¹Ú/ƯÚëë½§Ô×¾Ûê×¾8Ùڇǃ»Ø߈±ëØÇÖ纕“Ơñ³Ç麟\ưÀƯÂÏÔ½Ï̉ĂôÄÓØƠ±¿‡Ç¯Ă«‡“Íj©‡¥2ßëMëöß½’¹ÜNÍ’ÏÔ§ôƒˆ°»¯ÈÏÅèô ÿ¯¶ß»û™‡߈ơÔçÚơÔ†ÇÁ½Ô³ºóÙ½óƒvÑ%û(Û«‚ ½9ºó́«Óÿ¯¶ÛÄÓÏÅøơÁ ŸÄ›¾ºĂ—ö‹ÇÙŒë*«÷‡ưˆÏ¿ưÀ߈ÁÑÙ½ɹÙÚ…ÖăˆŸµØÅ–±»Âï8¤‡Ö‡ºï»G½¹‘ư»ÆÅÇÖ™‡©ÓÍBëÔëƠUéáרâà¾ßñ¡Ô¿)Ù½±»ëÔùêÍÓëö«Ôö¨ôá=¡Û±»¼ôăˆŸ;«ԯ ëö‡¼©ÇûØïƠ«‡“Íjă±»ù×ÑÓ³(©¼•&îƠÇÖÛ×íØÙƠÅƠÚĂ¼Û«‚ ½9¡Ơ‡ĂÖ½üÀÇÖù×±êçºơĂÛÀ½€íJó×íê¹Ú́½ö±»ǺơêéÓÀ_±»¿ëö«‡“ÍjăˆŸ¿Ư½±ÁׯËƠƠÿ¯¶åƠ’ÇIƠĂÙÚÙÅ…àíêµØ߈ơê·‡‘×8ç‡ÚÁƯĂ«ÔÏÔá»øåôÅØù×Ôơ +ëö«‡“Íj8¤‡Ö“Èä׿‰ƒùלܧƠ¥Üăà́vˆÏÅå̉ ₫DZ» È ù׺9¥‡¿Ø°»í$÷ÁÅÔù×±¿߈釻Ươº¾ÿÚ½÷ÔăˆŸ;Ă÷ø§Ûëöăơ§ƠÁ¹­)™ëé囹„ø +ăˆŸ«dßÄÙó×ÜÖØÁ½Ü߈߈Ï̉°Èÿ¯¶˜‰j̃ZîSƒˆ¾ß«‡“ÍjÙœ›¡ÑØ«ÔăˆŸ;̃ÚíÖööơ˹ォ‡“Íjɹ«‡“ÍjÚª‚ +¼9“ÇÎĵ×ôĂ­°­°§Ó±Áƒ½½»½Ú‡ëö߈߈èê±»Ïëđ³Æ•Œù×£Ư߈Û«‚ ½9ÁƯÛÑÚÂÍƠ©Ø±ô¹Ú¯¾߈éêŸÁÓ¹ÚñÓù×Îű»¯¾߈·§D Ó´»‡Çµß·‡‘×8çÿ¯¶ÅỘÔϺƒv˜‰j̃ZîS¿Åâp‡©Ó™‰kß [ïSÏű»ø¾ÛÙŒë*«Û«‚ ½9©Ó•Œ¹ÚơÔûÓǾáÓ¬ÖëöçÚé‰ñ5ñ·¸ÁÏ̉ù¿ëö̉º9¥‡ÇÖÅØù×ÇÖó#Û×ơÄ¿‰§ÆÙ½¹Úº߈ĂÙđÇöµØ"ù́̀Ê)èÛ8¤ƒˆï½»”¯ÁÅëצôöù×Ù½«Ô߈¶ôë¼ÏÄù×ù×ù×«âµØÙÚ߈̀Ó ˜‰j̃ZîS…¿Å©÷å5Óß»û߈Û«‚ ½9ĂÙ«‡“Íjÿ«·3uUƒ¾‘ÙŒë*«”ÈúÜ£Ø߈—¶ëöăơ‹ÜÏÔƠÄÅÓÅô‡xµØ«‡“Íj½߈ÅĂǼ×ƠơêƒÖ‘Ôƒ‚½«»¿º·ÔđÖ³Â߈ÅÓ²ØâÏÔĂ¼€Ơ™‡ù×›¶éív™‰kß [ïS™Ø¾¹ÚÏÔÏÔÙ½Ở½¤ˆ\0ÏÔ­Ö­Ä›¾ÏŪ»Û«‚ ½9ßÖíêđÖ”ÇÏÙ½›Û·Ôïøơê÷Áù×á꫇“Íjå°ÿ§רׯÔ ÊÁɇ½©%‰æ©¼·ÅÙ½ơÄĂͯ́ÇÖ÷$º߈³¿́¹Ú¹Ú߈ëÚÅ«‡“Íjï»ù×Û«‚ ½9Ú¥‰ÍL…å×áØñÓÏÔ×¾ù׃½«Ô·Å½ĂÙϾ¥O½€£ØäÁNÙÚÛ«‚ ½9ĂƒvöÁƯ«Óù×—¶8¤‡•îůG‹ø³”ÍÓăˆŸ;ñÚÑÓÏŪڙ̃¯G‹ø9¥‡¡Û™>ºö°»÷ˆù×ù×é‡ï³2¹ÚăˆŸ“-©‡¥2ßëM È—¶‡̃“…¹Ú̃ˆĂÙĂÙ­Ö߈ÅÔ܈ơêÛ•ƒˆ›¶é©Ó‡xöñÚ›¾ù×Ï ÙÚź%¿º—»“Ơëö©‡¥2ßëM«Ô£™±ó·Ô¿‰¹Ợs ËûǼ߈·Å¹Ú½€9¥‡×÷ÁÏÅÙ×ơúñÓôĽÑÄëăˆŸ;kÛ¹¥ˆ]1ăˆŸ;˜‰j̃ZîS±”çÚÜÓ 9¥‡×½Ô8¤‡×ׯÅ–¬Ö’ƒv½›¶é¹ÚăˆŸ;‰¿I©‡¥2ßëM¶èƒv˜‰j̃ZîS¹ÚÑÓ•ŒÅ«‡“Íjψ­ß«‡“ÍjÍӟŬÄù¿¥â¡%“Ơ©¼©Øÿ.9¥‡ØƠ“°¼ÔÓˆ•=‘çÚᬱ̃Á"Ú¹ ɇºÙÚ©Ç—¶ï½ËǹÚÚ ª ‚  + ¼9 ߈ăˆŸóŸȵ؛Ơ߈öªøñÓñÜÍÓª»ĂÙ»‹ĂÙ̃»ú«‡“Íj¿ÅÑ×ӇŒñÁƒvÏÄA±àê½³¿ÅĐӠȃÇÖơÇÛ¹ơĽYƒv£Ø-µØ“¹ƯN«»ŒÉ™‰kß [ïS¹Úº½ÎŽô™‰kß [ïS‘‹Ç÷Á­ŸàÏÅÙ½•›Û«‡“ÍjµØ™‰kß [ïSÛ«‚ ½9áÂÑÓ߈ăˆŸ8¤‡×™ëéåçöóדÈYÛ×é‡ù×ăˆŸ;ó‰¿I·‡‘×8çÍ­¾„ÖÑÅ¿»…n›¾߈™‡º÷Áÿ¯¶Žµa°»Ó ưÀöÁ èºăˆŸ•{Û«‚ ½9µØÍÄ“ÆăˆŸƒÚá ñ‡±»­‡©ƯĐÄê™ÓÛ«‚ ½9ăơ¥ÛÅ£Ưº¹¶ÇÖ£ÔôêÏÔǼëöÛ«‚ ½9ÏÔÛ«‚ ½9™‰kß [ïSÛÚ×¼¡ÛơêÿÚÑÓ¥ˆ]1ÅØ™‚ƒvù׃vÍƠÍÄö›·Ô˜‰j̃ZîSÍ•™ÔÏ “¼Û«‚ ½9щëÓ‡Œơê¿ÅăˆŸ­ÄăˆŸ;ÏĺÅϺÍÓ‡Œ¥¹ñÆÑÓ™ÁÏÔ°»áêùë»̉—Ø‹ÇĂƠù×ơĂ·̣ÑÄëÓØ‚ ÏÅĐÓÛ«‚ ½9ăˆŸ;ø×•×¼§ÔÓáëÚ¾ß ù×ô—¶±»߈̃„ÇÖù×›¹ñÚ‹¾÷Á½˜‡ƒ×ƒ£Øëö9¥‡™‰kß [ïS̉½¿ÅÇÓ½™‰kß [ïS߈÷ÁöÁÑÅÏÔăˆŸ;§ÔĂÛ«‚ ½9ëÆÏĵƯƯÓ ™‰kß [ïSƯ‰ÙÚĂèăˆŸ;¹ó—¶½¡Ô‡µØ±»§Ó‹ÜÙ½¯Û᫺‚v¡Ô½Ô™ÁçÚ׺ơê±ë؃v¶(‘ƵØÚª‚ +¼9ÍƠ맭Ľ™Ôù×óÂ¥¾Ñ·‡‘×8çÂÙívư“Ÿ}ÑŃÔÏßƠÏÔ¤ˆ\0ƠËØ›¾™‡ĂÙƒv£Ø«‡“Íj©¼·‡‘×8ç«Ô×¾ÁĂÚº±»ÙŒë*«½ßÏçÚ§Ø•¾Ơ¯¾ơêÁĂôÁ¼Û«‚ ½9ŸÅÏ|ÿ¯¶«È̀Ó¦Ô™‰kß [ïSâơ ׯǼ§º߈ï»ź‘ȱ»±»ơêŸ\ƒÚ³¹Ú£Øƒ ËûêÚסÏÔ¡Ô…Û‡“ăˆŸöˆ…ÚáØÛ«‚ ½9¶ƒƒvơèÅÁƯ‰Ûù똇ưÀ«»¦Ôº̃ˆƒà Ëû±»߈ Áúñ»Ơ¹§×ÙÚÙ½½ơ»©Ç¶đÓ˜ßÚÆ«‡“Íj›Ăù×á=Ï™ÓÔX°»ÍÄß»ûö½¿»Û«‚ ½9µÈ›ÚßÁÙ½ơÄ™Á±»©‡¥2ßëM›óÛ«‚ ½9ă½ÏÔ‹ÜÏÅÿÚ‡߈Û«‚ ½9ëöؽ ĂÙ÷ÁƯÚ«Ô¡Áƒv›¶é½ôÁƯŸØöÍË)éÛ9¥“Ơ ÁŸ¿ơèÅĂĂ ›­±àéM‡ß·‡‘×8çÅÓÿ¡߈ë¼±»Û¹ëöɨÙ×éGǽш¹Ú™‡ÅØù¿ăˆŸ;kéÓív±»ù×ǽßƯÅÓùב¾Å–ÏÅÚª‚ +¼9ñÓ¡Ó9¥‡Û«‚ ½9ñ߈ñíÈĂ߈ùשطô±»ơÅ“Ở³Çƒˆ¡Ô«‡“ÍjƒØÓܺÎ+º³ù××Ơöœ‰¾IÇÖĂÙưÚ¡ÁÏ̉ׯÛ׸ÁÉóÇÓÆ¹Ú¾»‡ÏÄ©ñ€ö™‰kß [ïS±ÁÙÚùê³×ùÛÇëö•ŒÂĂ¯à™‰kß [ïSÁ½ÏÅ“‚™‹å̉ ÑÓívŸ}½™‡Ñ·‡‘×8çívߌÛ,Ù½ù×ö‡Œ́ƒÚëö™‰kß [ïSçÚÏÔù¿ûÙ±ëÉ̉ÙÚ́ơ׿8ăˆŸ½‡Œ߈Ù½–Œ˜ô³ºóơê÷‡÷Á½«‡“Íj¢Ç´†»½÷Á×¾Û™‡¿Å±½ÅÄø×ĂºƯ”ÂȺáÿ¯¶½9¥‡¿Å¸ÚïƠÛ×ơÔ‡ÏÅ·Ôù×ݻ۫‚ ½9âˆéÚÏÔÀÓ «ÔƒÑÓÏÔ½ɇ«ÔÛ«‚ ½9߈ùדƠ«ÔùåÙ½̀Ă©¼߈ÏÔÛºŸÅ¾¹x©‡¥2ßëMÛ×±»ׯñÖ¹Ú›¾ÙÅ뙇úÙ±ëØï»÷‡½ŸÅÑÓרÙ½…Üă鯂Øùꙉkß [ïS΃½µa½ùê߈ïŸÛ«‚ ½9ÂĂ߈ơÔƯº÷Á»³ô“Ơ¬È ÿ¯¶Ï̃ˆ±ó½ÁĂûØϺ÷Áÿ$»năˆŸ;ë¼°»™Á½Ö¾8ĂºÏÔ½ÔĂ¥Ûôp›¾̀Ç«ÔÍË)éÛ9¥½Ûº“Ơψ›¡ûÓ«Óívƒv©¼­)©‡¥2ßëM·ÅÍƠ«‡“Íj·‡‘×8燺¯×ß»û™‰kß [ïSöá=°¿e€Åù×ơÔ±Á™‰kß [ïSßÖÙÅëÁÓ¡¥ˆ]1—ˆĂ¼ñÓÏÔ%9¥‡ÓÔÇÖÏÔ–ˆÙ½ăˆŸ;ź₫ÂñÆÛ«‚ ½9ù×ĂÙĽÑ¯×¹™æ‘·¼Í7ùêăˆŸ;kÛ«‚ ½9·ôÛ«‚ ½9ÀËÿÂØÅ™ê™ñÖÂÙ¡¼üƩә‰kß [ïSưÀ™‰kß [ïS±̉ÖÆ«‡“Íj™‡ÔX¡Óƒ¾‘÷ˆ¼½‡ơêăß½ưÀăꪼ۫‚ ½9Ê’ÙÚ‡Ž½áê±ÔŸ}ÁÛ™‰kß [ïSÛÛøêù×Á·—¶ù×ëö£äÏÅ×Ó¹ ÙÚÍË)éÛ9¥›¶éôê—Ø½ÉÖ«»߈ÑÅ—¶—»Û×”öêĂÈ¿»ưÀ™‰kß [ïSăˆŸ;¯È¡Øȹö“Ơ™‰kß [ïSö¾ª‡’̀jơÄŸ}½àÛ«‚ ½9× ĂÙ©¼ëÔ÷ÁăˆŸ;k¡ÁơÔ©¼ÑÓù×ïÅäôúÖ™Ø̣»Øï½ëöơèÅ©)â­ÖÓÅù×Ó́¡÷ÁéºÙÚû(®Û÷Á•߈ÑÓÛ«‚ ½9µØºÔÑÓÛ«‚ ½9¹ÚÍĹÚÙÚơ‡«Úăà£ä€Ç™‰kß [ïS£Ø§ÔÏÅăˆŸ;¹ÙµØơÔ躳̃ƯÈƠí$ÿ‹™‰kß [ïSûöñÚÙÅëÑĂ·‡‘×8çƠÏÄ×ܹګ·3uUí̃ÇØĂº¨¼Ù̃“ÆÅ–™‰kß [ïSñֵؽùêå×¥Æưµ߈¾Å«uù×ÂÙ߈ùÚùꪇ’̀jö¯ăˆŸùס»Û×ĂÙí‡×̉Ë¿»́Åï»ưøÚÆÁÚ°»רÀ¹ư“Ûºù×ÅÙ­ÄơÔßÄÙÙÅëÙÚ߈ª ¶ 2 t T ÏÔÙÚ§w÷ƯÇ›¸ÚÆ8¤‡Ö ơ‡½ĂË%ß„¦¹™Ăá ̃ÅăˆŸ;kgµØßÄÙ¡ÛÛ«‚ ½9ÏÄ̉àù×±»å̉ ÅÓ¼èÏÔ­Ä»™Óƒv§Æ߈ÏÅ¢X'™‰kß [ïSøê‡“ºy%«·3uUéê‚v´a•{Ở¹ÚÑÄë÷ˆù×9¥‡«Ô«ÚưÀ¡ÁóÂÁ¹¯àïiï½³ÏēȫÔăˆŸÛ«‚ ½9ơvÅØÅÜÇ̉ăˆŸ;k­Ä§Æ߈½€î»™‰kß [ïS«‡“Íj߈¥ˆ]1‡­ÄßÄÙƒˆçÔ¡¡Á‘Æ߈¼€ÛÀ¾›·Ô˜êèä“çÛºö‹ß:¦¹›¾÷ÙƠ»ƒvíºƒv™‰kß [ïSÿÚ¸àÀĂ ¥Æ©ÜÏÅç̉÷Ú›¾ö÷Ô›¾ù×߈߈ÓÅÏÄĂٺأäù×Ùܘ‰j̃ZîSĐÓĂĂÛ×ăˆŸ;ÓØÁƯ“ºô9¥‡×ÿÚ¡Ôƒ¾‘ÏÄ›¶é»çɇ‡ºÿ¼éÓå‹ÔơÍË)éÛ9¥ëö±»«»ÅÅÔº’ØœÛñÓ›Ú™ÓÏÔÑËÿÂÂĂمهÏ9…ơÔ߈°»»½ÙÚ“ÈÙ½“öù¿‹Ü£ƯÉĂ¾Å-é‰ñ5ñ·­ÖÓºƯ‡¿Û«‚ ½9•ˆµØ†Œ   ¬‘‰Ûﻫ)½½ÔµØ±½ívÏ̉Ó‡·Ü¡Øêö­º™‰kß [ïSùê±»ׯñÓ³ù‰̃ˆăˆŸ;øêÙŒë*«Ơ¼ù×ưˆñÓÎÔª‡’̀j«‡“Íj‹Ç™Á9¥‡×å̉ «Ô߈‘±ÅÔÙ½™‰kß [ïS$ +–¿ƒùù×ëöÈ¥ˆ]1§ÓÚÀƯHĂÙ±»÷ˆô™‰kß [ïS«Ôă¯È«Ôù×Yß»ûØŒê*ªçÚﻬ¿Û½óÂëÚ±½Ó±»ëöÏỖ»úí‡ùפر”‹ÿÚÏÔù×›¶éÙ‡­9ŸÈ߈«Ô·ÛÄÓ ƠơĂÅØ½Ôù×½à¬ơ꺰»ƒvëöëöăˆŸ;™‰kß [ïSÙÚüÜÏŧԫ»߈µÄ½í—Gɇ¯¾çÚ̃ˆ߈±»ù×µØÙÅëáƯÉö  ·Åƒv¡È™‰kß [ïS½ăˆŸ;߈˜‰j̃ZîSÙ½ªÔ¹̃Ë̉—¶ĂÙ¿́«‡“Íj­¾Óد¼ÈĂ‹ÜÛ«‚ ½9ÿÚ£Ư¦ºó#µØùê÷¶—»ÏÅß»û«‡“ÍjĐÄêăù×·‡‘×8ç±»å̉ Á%™‰kß [ïS¹Áר¨¼±»¤ˆ\0ă¿Û«‚ ½9ưˆËÖưÀ»Ú¾Ë̉¹Ú9¥‡æÇ—»¹Ú÷å5Ó§Ô±»߈§¹9¥‡×ñÄÅÓù×ñÁƠï¶ÏÔó½¶ÅÓ߈£Ư½ïÅëöÑÄë™ÁĂ\ăˆŸ;‹ÇÚ׃ֈ߻û•Œ§Ó™‰kß [ïS÷Áײ¼Ă±»½ƒßÄÙ÷ÙƯÚ߈¬ÄßÚĂÙŽơÔăˆŸÛ«‚ ½9۵؟ū‡“Íj¡Û§Óß»ûÍƠ‹ÓçôăģعóĂٶܨƠÙ½©À£äù×ÅÓßàăˆŸ;ù×™‰kß [ïS‹ÜëöÀ¾ơÔׯ…Ơ9¥‡ëö9¥‡Ă±»©ÀëöÚÀÅô¿º½‹Ç¬È½§é‰ñ5ñ·íºñÚ³zåÁưÀƯÓ ›ÚơÔ8¤‡×8¤‡×‰¿I¹ÚáêG½¹×Ơ÷Áå̉ ù×å̉ ªdëöƠ¾GÙÚóÂù×½ÿ×ÑÓ™Ó§ô£ä½ÍÄÍË)éÛ9¥½Ó´Ưº£Xá¬Å»µØÇÜÿ¯¶ÿÂÿÚå̉ £ØơêĂÈ«‡“ÍjµØ÷rÏÔù×›¾ăˆŸ;¥u߈Úª‚ +¼9ơÔöÁ“Ơ£Ø±»‰Ä‰¿I¯á˜‡ƒÄ“ƠÀ¼ Û퇵ت¶2tTÇ̉󑻈ÙÚ»n«߈ơêä̉ơµÜ߈•Œ–Ó ߈·È«»éÚí—G«‡“Íj£ä—¶¿‰¢Ç¡ỒÓ«‡“Íj«‡“ÍjÅ»̃ˆ‹öï»ÏÔ¢–‰¿I¯×›ÚÙñ߈íÆÍĶ11ÁĂơÔÁÙÚÖÆƒØ“q£ØĂƠX±»•¶ÎÔ¹ÚñÖ߈±»áÛÛº¬¾ÏÔöQÙ½Ị́ï#ÑÓ…Ơù×¹ÚÙÚ™‰kß [ïSï½̃£äơêœĂ¾‹ÇƼ«‡“Íj«™‰kß [ïS‹ÇÏ̉â˹—¶¹Ú›¾±»çØăˆŸƒvívÿÛ´½ÁƯÍË)éÛ9¥Ù½¡Ø‡­Ä½€ơÔù×ùש‡¥2ßëMÛÄÓ߈ơÔ«‡“ÍjßÄÙăêÿ¯¶°ÅggơÔßÄÙÁĂÓÁ‡Œ¹ÚÅÔăˆŸÑÅù×ÑÓÇ̉ÑØ‰¿I9¥‡×ăÁ½ûƠ÷ˆ߈Á¼Ù½ÑÁ‰»—¶ưÀ°»ë…»ØµØ«ĂÙ©Ó“¹ÜNÄôø×©ˆÿ¯¶æÚù×÷ˆź½Ô¡Á™‰kß [ïSÛ×ÛºưÀ¯¾›¶é¡ÈÑÅÙ½±ëØáÅ߈å̉ Ó¼ÙÑ”ó¡ÔÛ«‚ ½9ÏÄç̉¡ÈÑ·—»æÚù×Ă¡Ô«»IỞ«‡“ÍjơêÿÛÏÅÿסȱ»ĂÛ«‚ ½9ׯôê½¹½™‰kß [ïSÁƯÛ«‚ ½9Á×ăˆŸ…ÖùêÛ«‚ ½9§Üÿ¯¶±»ùסÁñÓâÄ[¾ºÑÓ½€߈½ÏÔ­ÔŸƠñÓ½ÓlăˆŸù×£ÓùæËÚ÷Áù×ăˆŸ;k¡Èơê°»ó¡Á½€¡Û§ÓÚˆ·ÅÏÅ퇧ô±»—Ö½èêÿÂׂ₫®¶ÙÚÛ«‚ ½9“ƠªÚĂÙƒvª¶2tTÏÔØ× ƒṽŒÚ,«‡“ÍjµØ·Ûö™‰kß [ïSùꇺ¾ͽÚº߈°»—»ÏÔÿ¯¶ª»ÏÔÓØĂÙù×ĂºÙ™‰kß [ïSÑÓÙ×¼ÉÖ·Å…Œ„ô•%Çè½½ù×߈½“…½«»ëöưÀçØăˆŸ±»¹Ú«»9¥‡9¥‡Û«‚ ½9ÏÔÓÔ$ +ƠÚ×̀½ÓØĂƠ¹à±»¾Úª‚ +¼9•Œ¡ỜĂ›¹íÖ‹Çï‡á¬çÚÿÂöµØׯÛ«‚ ½9Ñ+å̉ ử凾¹x‚×ơ¡È«‡“Íjơù›¦±»½‡xöÛ«‚ ½9߈±»ÿÚ©‡¥2ßëM¡ÔÙ½ơԹߙ‰kß [ïS¹¹Ú™‡Ÿ\›‡é‰ñ5ñ·Ñӡȕǹڱ»ñvÓÅ¿́ø×±¿›¾ÇÏ Ù½­Ä½‰ºÛÀ¹̃‹ÇĂÖ½߈¹€±»é‰ñ5ñ·èê»Ù½‹Çô·‹…ơèÅÓØ…½Ă¼ăˆŸ߈ºƒˆÁĂív́Æ–Óá̉9¥‡ëöÍĽûÓ߈ïiÿÚăă¼%óÇơÔ«‡“Íj°»9¥‡Û×ëöăˆŸ;9¥‡É̉¥ÙÏå̉ ÅưÀăˆŸ;̃Îùæ¡߈ˆ;ù×ß±»®¾ëö³ºó̃ˆ÷¼Ă­¿¾ñÚ£Çù¿ƒˆ½µØâÄÚĂÙƒvƒv¿‰ÙÚ÷Á™Á₫®¶Ù×éÓ™‡Ơ¾G›·ÔơÄưÀË¿ƒàª¶2tT«‡“Íj‰ÓÓÆÅÄ©ÓÙ½ÏÄ‚ưÀ«Ôר•¤ˆ\0åÖñÚỞ¡Û†Œ¹ÚÙÅ뇩ÓÛ«‚ ½9¿‰Û×…Ú™‡ưZƒˆÛ«‚ ½9ÏÔ±»½ÈÎßù׋Ⱥ‹Çùë߈ÖÆăˆŸ;°»ĐÄêù×§ôƒÖƒ¾‘™Á½ñÚăˆŸ™‡Èù×ưÀ™Ă™ÓĂÈö½£Ôß„ײ•Öƒº‡«‡“Íj̃ˆµØÁÙ½·Ø©ƠÁ̉ơÙÚÏÅ߈ô™‡ŸƠ«»—»«÷ù×™ÁăˆŸ¡ÈׯÚ×ơê₫¼ÄÓ̃ˆ¸Ø¡Ûùׂ°ÚÀƒˆ}ÙöÛÄÓíê¿ß­ÄƒÖ·ÅÍÓ‹Ç9¥‡ÍÓ·Ó ¥0«»ÇÖùׂÖí֭Ķ€€mÏÔ±»ÅôơêߌÛ,ï»âˆ:j¥ÛÁ̉±»‡Œ“Ç߈³ë™‰kß [ïSÏ̉¥ÓƠYÿ¯¶ÁÛ¸Úö9¥‡¶ô—¶À̉÷‡Ç»«»ÍƠÅ™‡½€Û«‚ ½9÷Ù™ÓÿÚ¡ÔÎÅ×ÜÁƯöí¥ÙÜ©ØÅÔå̉ Û×¥Û™‡¡…Ø«·3uUëöăˆŸ;¡ÈéºÅÙ©Ó£äÏÔ£ƠùטȫdÍË)éÛ9¥ä̉çÚƒv†Œ«ÔÉ«‡“ÍjÛº™‡‰ÅăˆŸÓ̉ϰ÷‡º«Úù×ÇÓ¼Èù×߈­ÄºăơđÇø×ÿ¯¶ÏÔ•ŒËƠ°»Û«‚ ½9™ÔÏÄA…½ïÔƒvª‡’̀j—ˆăĂ3ÁǧƵØ߈ỞñÓ߈¦È¹̃¾ÏÔ™‰kß [ïSÑÓ­’ÏųºóÇùê…Ơ‚¾©¼¿àÛ«‚ ½9°»Û«‚ ½9ăˆŸï³2™‰kß [ïS÷ê‰Û—¶í꣨ßÚ­v½÷́Ơ©›̃½ +˜êèä·‡‘×8çù×ëöÄö»ÜŸ}ºƠÁùê•׫Է§D ƒvÚª‚ +¼9«ÔöáƠ¥–9¥‡•%ÏÄ™‰kß [ïSöơăˆŸ;ŽăˆŸ;¹‡äôê³ƠÿÚêöÓùê“”ăÁ̃ÄØăˆŸ;¾¹ƒÚÏÔƯÓ ÛԵغưÀăÏÔî²2ù×Ëö̀ƒv’Û‹ÜöÛ«‚ ½9Å»±»ù¿ÑÄëÁƯ‡Œ€ºăˆŸß»ûÑÓñƠׯ$Ù½ÙÚÅÓëö‹È0‹Ç«‡“ÍjöѼù×ï³2ĂĂù×°¿Kå̉ ̃Œ Ú, ›à—ĂỞÛÇÖ—ˆÏÅß„çÚ»«‡“Íj“ƠÍ­HăÇíÙ×Û×ûœÍÓù×±»ăˆŸûơ§ ™‰kß [ïSƒ½ơÔÛ«‚ ½9éÓ½ƠÑÓÿ¯¶¡·Ô߈¿º¹ÚëơÏÄóÇÛ«‚ ½9ËlơêçÙŸ}₫ùêÇÖÖÆ)Û«‚ ½9ǽ¿·‡‘×8çùå¯Û¹ÚÓÅ¥̃ùו·ă²Æ©£ï½ăˆŸ™‹ï½Á̃ûϽ߻Ùù×ï×Ăȃ×ëö߈ù×ƠÁĂå̉ ƒˆƒ¾‘¤ˆ\0߈™‰kß [ïS“¹ƯNß„ÇØ™Î×ÜƠX™‡³È±»â཭ÄƯÚ¹Ú«Ô­ÔÎÓÛ«‚ ½9±»—˜ù×öÁëö¡ÈŸÑÓª‡’̀j–¶û̉«Ú«âÙ׈ÍÛ«‚ ½9 ÏÄÏÔ°»³‘ÆÛ¡Í­ơèÅ«»ïÅăơٽٽ¹Úƒv—Óù×ÏÅÅâḈÏÅËÓåâµØ™‰kß [ïS™‰kß [ïSßÄÙ̃åƠ߈«‡“Íjù×ăơ×Ă߈§Ó•Èû›á߈߈ÓµçíëöÍË)éÛ9¥ăˆŸ±»ÂĂ‘×ÿ¯¶–¶ùׄºnÇÁ½óÇå×±¿ÏÔ±»ÂÙ¿¹±»—¶§½ù×ÏÄ¿g™Ô×¾¼ÏÔ›¹ùØ…Û›våçƒvºÙ½‹½ĐÄêăàñÙ°»רëö×̉éêÇÖÛ«‚ ½9ỔÙ-ÏÔ™ëé帣ÏÔ«Úß»ûÛ«‚ ½9ÏԵسàÛ«‚ ½9÷Ú«Ôù×÷Á™‰kß [ïS‹Ç½Ïԗز+]ÿ¯¶±»Å¬ÖµØï³2ù׉¿Iù×ëÔÛ«‚ ½9ø×—¶IƒàÓÅƠX°»½»½ÑÓ¹¼º½Û×£Ưøêç'§ôå̉ Á̉‹È9¥‡ỞƼ™‰kß [ïSϹƒÚ•Ư…̃™ô·‡‘×8çµÜ«‡“ÍjĂÏԯȕŒÁ½½€ơÔỬăˆŸ;™‰kß [ïS›ÚơÛ¹¶Ï̉ÇÜù×ï»óº¥Ø‡Ï̉ÅØÄ–å̉ ±»̣ÂÑÓóÇù×ÿÚ߈™ëéåù×ÿ¯¶Á Ú×§ôÓº¹Úÿ‡‰¿I߈§ÔáêÓÆíÚÏÔá Ư‰ĐÓ¹Ú©‡¥2ßëMöĂÙÏÔ©À¡Û¾·‹ăˆŸ;ÄÅ—¶ÏÔ«Ôù×ß»ûñÓƯÓ ơê¾é‰ñ5ñ·÷‡ăˆŸ¹ÚƒvĂÖ߈½¢ƒˆ«Ô«‡“Íj߈‹ÜÔ9¥‡×Ăº×Ư—¶“Ơ¡ÿ×¥Û½€Æ©¼û ¹½å©‡xÛ«‚ ½9ù×Úê~ÇÖ÷¼£Ø™ëéåƠ÷Ú…ÛöÁ¡ĂѦưÀßÄÙ߈ÂßÁïç‹ÇÑӷ܇ŒŒƯ…Ø9¥‡½߈³û|’ƼçôͼÙŒë*«ăˆŸ;ơĂµØ¥óĂ—¶™‡ÏÔ™§ăˆŸ;“¹ƯNăˆŸ;8¤‡߈Ư‰˜‰j̃ZîSÏ̉×ÓÛ«‚ ½9ƠÙÚëöÿÚ™‰kß [ïSƒ½ûÖÛ×̉ØơĂƒ¨& ™‰kß [ïS¿Æ߈›¾ơêÅ¥Û«‚ ½9ëÓăˆŸ;kËÉ9¾±»ÄôĐÓÛ«‚ ½9ƽԧÓÁ¾ø|ÅÂ₫‰…«‡“Íj¯ÈÙÚ«Ô¿»ăˆŸÁƯÛ«‚ ½9¾ï½«‡“Íj›¾ÿڛꗈñÖÀñ»©‡¥2ßëM™ÓåĂå‡áº©‡¥2ßëM¡ăˆŸ®Gø½‡Ç«Ô™‰kß [ïSƒö™‡ĂÙǼϼçÚ“º½Û½ÿÛ§Ó€ºÑØăˆŸó¡÷ăˆŸ;±½¯ÛĂÙáêåÁúëÔ¿‰¡Ûƒº߈ÆÅØá êöÑ’ºï½™‰kß [ïSÔXµÏưÀ¾™‰kß [ïS¾»ºÏšԳر»vå̉ ä̉ÙÚ÷Úå‡ÄÄ«‡“Íj³â“Çó•Ö¹Ú5éÓù×ơ$¥ˆ]1›¡ƒvƒ¾‘úĂĂÙÅÓ¯ÏÔ¿º—¶ơƯÏÅŸÅÛ«‚ ½9¼ ƠXщÆÖ½ÓÓÇĂÙÓÏÅ¿́ÏÔÙ̉‰ÔÏÅ«‡“ÍjÏÅûÓº½±»ƒ½ÿ¯¶ù܉¿IñÆ÷Áẳ½ËÓù×ÑÓµ†ƒˆ©¼Å»ù×ÏԿšȋÜÏÄÜ«‡“Íjó¹ñÚơꃈÙڌӋÇÅÔăˆŸ;™‰kß [ïSù×¥ØG½¹½ív·‡‘×8çÛ«‚ ½98¤‡—ÓáƠƒvơÔưÀ‡ÿ§¡Û’½ÇÖÿÚÄÁш߈±»ưÀ¡Óå»¶¡Û¶ºµØ½›¶éÍ óĂª»ÿ́Ù½ÛƯù×߈÷ÁơÔÓ›ÔÖœ‰¾I9¥‡—ŒëöúÜø₫9ç̉ÁƯÑÓ‡ûĂÁă߈å‡xºyưÀëöÛ«‚ ½9߈˵߈‡ŒÏÔă½ơ꛾“ƠĂÿÚƠ›¾«‡“Íj•¾9¥‡߈ÇÖ«‡“Íj̣Óƒv©‡¥2ßëMÔ¾FƠƒÖƠÔÛ«Ôƒ×8¤‡ù¿½Ø×ï½ÿ×߈½ùàÁ‰¿I¢ØŸØÅÄ™‰kß [ïS₫ß½ÿ¯¶ÅÔÓ¡Á•Œ·¼Í7œÜ½¦Ó̉ÆÏÔ¿Ûº‡º½À‡€è/Ö:ø×µØçاôàÓơéÛ«‚ ½9ÙĂỤ̀ơèÅëëÅÿÚ«‡“Íj÷ˆ¹ÚÇ%ĂỂÏÔƒÛô8¤‡ÖÙ×™‰kß [ïSÎÅŸÈ›¶éôêơÔ߈·ÔƠ½‚ºƒv…ÚµÀŸÅ™‰kß [ïSŸÅ¸Ú“¹ƯN±»߈Ù½µa«‡“ÍjÛ«‚ ½9Ûºá=‹È0¥Ö–¾°È½€ÏÅÂơԸȽçÚ—ˆ¿»ô¹ØÊÓƒ¾‘™ÔÙ½ăˆŸ;íÖ«‡“ÍjÛ«‚ ½9ßÚ¿—ßÚĂÈÅÓÛ«‚ ½9“ȇŒÙÁ‡é/×:ß»û™‰kß [ïSàˆÀ0på̉ ™‰kß [ïSù×ù׫‡“Íj«»߈«‡“ÍjâºưÚê$ÙÚ‰Ûíơù×ïô­Ö‘‘¼€óĽ¹Ú½Û«‚ ½9ëöÚª‚ +¼9߈¯ƒßͯ¥'=U#QK¯Âêç ̃ŒÚ,§ÔϺ·#·‡‘×8ç›Ú«»̉‡™‰kß [ïSïi•ÏÔù׫Խ۫‚ ½9ǼÙ×Ñ$³Èà á=ùê÷Áƒv½ùׇ9¥‡À¹™‰kß [ïS¿‰“Ơƒ¾‘¯ÈËÉ9ÇÖăˆŸ9¥‡ÑÓÛ«‚ ½9‡ÚưÀÛ«‚ ½9ƒˆÏŽôê¹¶ăˆŸ;Û«‚ ½9˜‰j̃ZîS«‡“ÍjߌÛ,Ù½Û«‚ ½9óDZ»ƠÁÄÔăˆŸ;kưÀùêß»ûÛÄÓóÇÆ•Œùûƒ“ËƠ¿½ÙÚª»Ư‰£äµÏÚÀÁĂÑÄëÙŒë*«ÀZăÔ«‡“Íjơ螊+ÀĂ󫇓ÍjóÂÙÚñÖ̉Æ$¦Æ•Œ™‰kß [ïS±»çÔ¡‹«-‘ƠÛÄÓŸâÛ׫»§Ô•ö߈™‡—ˆËÖäơ¡ÔµØƠ°»ÇÖÿ¯¶9¥‡×ăê߈³ÂƒvÙ×µØëö¹Ú¨¼¡ëƠUĂ¼­Ö¾¹x߈ơêẓ́Ă¯È¶ÈöÁͪ½…«º߈¿»‡´ÓºÎÔéêï³2«Ôÿ¯¶…ô‹Ù¿ßóÔøÙí(Û«‚ ½9ÿ¯¶¤ˆ\0áêרÏÔ«Ñ߈ÓÅÍåÿ)Û«‚ ½9¼€ÏÅܱ»º½«‡“ÍjÛ«‚ ½9˜‡ëÓ¨ƠăˆŸ;¼ï³2§ÔƒvµÛùת‡’̀j¹Úí—GÏů×₫®¶Å»“¹ƯN©‡¥2ßëM¹¯G‹ø×$•×ưÜíÖóơÙ½ăàÛ×9¥‡×ívå̉ ›¶é…»ăˆŸ;éÔƠÏÔÏÔÛqẳ÷‡Ó̉Ù½±»«‡“Íjׯ麪ԥˆ]1ÑăˆŸ›¹¿‰½ßÚÂÙÅ婇¥2ßëMÿÚ×Ü€…Ç×ĂÑó¿¹ÑØ™‰kß [ïS߈ôçÁĂôî'ç|©ÓÍÄæÚÙ½9¥‡å¼ ƒ¥ˆ]1øü¦†Á™‰kß [ïSÏÅÓÁÛרù×ưÀñÓ¤ˆ\0ưẠ̀¶¹Ú«Ú‡ñ5÷‡Û«‚ ½9½€Û«‚ ½9ÏÅö5™‹ÏÔ¡ßĂïéÓ¹Úëöÿ.ª́¹ÚؽößÁÚª‚ +¼9ë£ơâ±»éÚÁƯ8¤‡¿‰ƒuÓĂEÑÓ9¥‡Ç©Ü‡ÏÔỞù¾½ă½±»%ƒv¼ôÍÓ‹ÇùÖùê9¥‡ÿÂ߈”÷¯¼ƒÖưر»ÙŒë*«™ëé噇÷ˆ±»̃ˆ¹ÚÏÅ×ÜçôµØ…nר“öô©¼«‡“ÍjŸÈùסÁ̃ˆÇ̀à꬇߈©‡¥2ßëMÇÅ¿Ô߈8¤‡Ö±»ÏÄïÚÁ¿ĂÙă߈™‰kß [ïṢÅÓÅÔç+©¼½€ưÀ­¾ÏŃvëöăÁÑÓŸ¿˜‡,ûÓö¹Ú³ßù×߈¼·ÔưÀÏű»¹àÍÓÅÑӻ؅ÖĐĂÈĂƠôÔĂÈưÀ§Ôăà¡ÛÅôÛ×Û«‡“Íjáê§Ôׯ­ÄÛÄÓ«‡“Íj‡#ÎÚ«Ôù¿ívËDZ»·ôëöϵØÿ¯¶ËÖ±»¿‰ͼ³ºó˜‡ù©Ú‚vÓÆ±»½ăê…ÔŸ}¦ºĂĂÛ«‚ ½9ø¿‡a‡ºƠºmẲâÓ¹.ơÔ³“ƈƠ—ˆ†“™‰kß [ïSÍË)éÛ9¥Ǽg³È½éê³£Çß³zö™‰kß [ïSË̉ÑÓ«º߈—ˆÁƯ߈ËÇíêÙ½ơÄ…nËÇ—¶Û§»Óºå̉ щ§Óç̉ÅÔỂÙÚ凃½œ¿ÿÚÜÓ ƒvëöô”»߈ª»‹ÜáÄ‹ÜÅ»÷ÁƯÓ §Â“Ơ¨ºù×ÏĈ¥.ĂÈäÁñÚäôëöÛ×ÿÂùפؗ¶ø¿ŒÓ™‡«»ñÖ˹ù곃v‘ơ·ñÆψ²È¼ăˆŸ;ăˆŸ;”º ŸåăˆŸưĂ¼ËƠ™‰kß [ïS麲(íê߈™ëéå±»ÑÓĂƠ°»½“ƠÁ̉ĂÙÆØ«Úï²2Û«‚ ½9õØ߈™‰kß [ïS߈· ¡¼Á̉ÖùêăˆŸ;Û«‚ ½9´ê߈ĐÄêáê¶ùêÅ×uŸŒăˆŸ;±ëاÔÅô³ɇà¼ÍË)éÛ9¥ׯ¡»Ç‡Œ£Ç«‡“Íj·Å¬Ä÷ÁôăˆŸ;á×ÅÓ¿«Ô»¼‘±»́v¿ßºy!ÓØÛºÍƠ…ÛÁƯ‘ÆáêÏÔăˆŸƒ¾‘«Ô«Ô•Œ³¹ëö‡äѶ¥µív₫‡¹Ú“ƠÓº›vñÆÄô‚v©ÇÙ½‹ÇƠ¡%Çè¯-ÛÉŸÁ˜‰j̃ZîS‹È¢ä…ÔăˆŸ;ơèÅ߈½óÇÏÅÏÅËǼÈÏÔÅĹڱ»µÀ9¥‡åƠö«»÷Á‘ƒn™‡Û«‚ ½9ÀƯ¼ù×9¥‡Á̉Ϻ9¥‡ψÙ½ăˆŸ;˜‰j̃ZîS£ÓøêÇ»ù×ÅØÍÓ±»…ĂÙ Ëû½€ Ëû߈¡ƒv³ÑÄë̃ˆÜ×¾ÛÀá ñÓ÷íú¡ÁÛÆ£ï̃ˆרµØ¥Ø¿‰«»™ÓíÓØ±»ÁƯÛ«‚ ½9Äô‹Ù9¥‡½ù×ͽŒ½ߌÛ,»qßÚ±»Ở‰¿I‰ ™Á·ºËÓåÖ£Û«‚ ½9/Ë̉ù×ß»û‰Ư¡Ô‡“ß0ß„÷ÔÛ«‚ ½9ÏÅ™‡Â™ÊÛÅơèÅưÀ¡Á—ŒÂÛ«‚ ½9ø¿Ô½³z߸ăàưÀĂÙ›¶éË¿ù׺°ưÀ¢»ăˆŸñÓÅÓØăˆŸ;9¥‡9¥‡ϺÅÓϹÔÛÀ÷4›vç'¯ăà™Ó©‡¥2ßëMơĂ¯×ù×רÿÀ™‰kß [ïS÷•߈ăºÜÓ ™‰kß [ïS…ôÏÔåĂ«»“ÇăÇíƒÖûÓå̉ ½Ăëö÷Ù߈ù׫‡“ÍjđÙ™àăˆŸ²Â ùסÓƠqÑÙ‡Œ½ù×¹Ú˜ô½ëÔÏźƒv±»ÙÚ̃„߈é‡ö§Ó¹ÚÙ½ăˆŸÿ¯¶™Ô÷ÁĐÅíÖ9¥‡×ºÅ«ÔÁơèÅíêÏÔÚª‚ +¼9ÓØ‚˜êèäôêơê°êØÚª‚ +¼9ÿÚè‡í߈ơê߈ơêơÔĂĂ›¶éé‡Ơ«ÔơÔÛ«‚ ½9ù׫‡“ÍjÛºµØƯÓ ä̉¯Èä̉׿8ÙY«Ô™Á¡Ô¹Úø¼êÚ±»ÏÔơĂùׇ±ß»û¿Æü­‹ƠĂÙ»Åû÷Á«ÚËÉ9ăˆŸ‹Ü§ÆăˆŸ;±»Æ˹˜êèäéê»Á¾½Ô»ăˆŸ™‰kß [ïSơèÅ̉Ø«‡“Íj—ˆÏÔÛ«‚ ½9¯™‰kß [ïSơê°»¦Ô‘ûù×¢ÂẲ¥ˆ]1ó–±»›¶éáÛ·‡‘×8ç½À¼ÏÅÓÅ£öÙêÛ«‚ ½9µôƒˆ«‡“Íjºˆ̣ï³2ĐÓ£äĂĂ÷$çô¯ÈïƠ»ØÏÔ¤ØźöÛ׿½ÅÓÑĂư·‡‘×8çå½Ăèï½̀½…ÖÏÄƠù×Ă*ÿڋǪڵyô±»·‡‘×8çăˆŸ™‰kß [ïSƒvù×ă¹Á“Æ™‡ÿÚ8¤‡â½́ÅÑÄë¸àơꕌó™‰kß [ïSïשÀËƠ‘ÖĐÓƒv¶Ô‰Ô߈ëÓ¡ÈÍӯȺ½ô׿8ª‡’̀j‹Ó“ÆÈ ÙÚ…Ơ½Û«‚ ½9Û«‚ ½9—¶«ÚƠºmĂÈæºͼÏÔ«‡“ÍjăˆŸ;µÚסÁ—ÓÛ«‚ ½9ÆØơêç̉±»₫÷ÔÛ×,©sªĐơ9¥‡­Ä¶ëÅÔû(ÚÀÑÅĐÅÏÔ߈¾ß½ñíÈ…Ô§ÙÚ«â…»¡Ôù×±»gψÁ̉ÓºưÀ³ăˆŸ£Ó±»µØ¥ØÏů±»ơê‚Ö¦Ó÷ÚßÖÿÜå»ÏåÙÚËÓ¿×§ô›¾çÚ‡ŒĂÙóÇŸÅù¿ù׫ÔƯÚƒÇÖƒÖµØ߈¥ÂÑÓ½߈­Â‰¿IéÚèơ ƠÄÙ½Û«‚ ½9çڲȫ»¡ÔÈÁƯÛ«‚ ½9Ø×€Ơ“½½Ô…»„½¡Ôù׫ÔñƱ½Û×›¾™‰kß [ïSƠÓ¼Û«‚ ½9÷Ú½‹ÇåÖơÔà±»‘¯G‹øñÚ›¶é¡‰ÁỞÚÇÛ«‚ ½9¹Ú‘ÆÜÓ Ù¥Ư…¾÷‡™ÓúăˆŸ;ñÓ§Ôå»êọ̈Ä̃Ú¾»ÅÓñÁăˆŸ½·‡‘×8癉kß [ïS9¥‡ÿ&à—ÇÅôăˆŸ;ù긣«‡“Íj©‡¥2ßëMËË̉¯)‡“™‰kß [ïSéÔÅÔív¥â…n•½ĂºµØƒcëg£äÂ#–³ºù×óÔ©Øœ‰¾IÖµؒ¹ÜNÏÄÛ«‚ ½9ƒˆó«ùôù×µØĂÈÙŒë*«ĂÙ™ô‹Ü¹ÿ¯¶ĂÅàÏÁ̉½½“Æ™à£ÇÙÿ¡ÁÏ̉ÑÄë«ÔûªÆÀĂ¡ÔϼƒˆéêXÚª‚ +¼9«‡“Íj½Œ¢äŦăˆŸ;äơ“ÆÏÅÛº‡ưÀơÔÂè؇Î9„ñÚÆ£—é‰ñ5ñ·™Á½Ô9¥‡«‡“ÍjYÍÓÛ«‚ ½9½Ôñî§·±»áƠÇØ•Œ×$–ÓÛ«‚ ½9›¡ͪ›¶é‘ÆñÚ“ÆŸÛÁƯ‡“ÅÙŽ•Üù×Å›Úùệ©Àơê¾ơÔñÓ¶ÅØ߈ø«¡Á¾»«‡“Íj£Xú̉¤ÆµØăˆŸ;ü¦†›¹ÿ‡“Û«‚ ½9ăơ×ƠØÖ*¥Ư™‰kß [ïSÏÔĂơÔµaĂÛ«‚ ½9ăˆŸ;µØ¿»¨‡¤2€̃êL¿ØỞ»½߈€º½ôÀƯĂƠ߈µØÛ«‚ ½9Ø×ŸÄëö¶¿ô¸Ú ¸ÚÏÔÅØéÓÛ×áçö™‰kß [ïS¯ÈÿÜơ$ÆôÛ«‚ ½9«‡“Íj¥ ½™‡÷Úƒvø¾˜‰j̃ZîS®Gø«‡“Íj—¶ÙÚå̉ £‡Ó̃。ƠÄÓ¶è߈ăˆŸ;9¥‡Û«‚ ½9ƒÙÅë·‡‘×8癉kß [ïS÷Á߈±»Ûº±»ù꺟}‡•«‡“Íj¥ÖỞåÁ¦ô +³È¿ô±»Óº“Ơ߈ëöăˆŸ˜‰j̃ZîS‡ÚÙ½߈߈́ù×Áñ̉­vÛ«‚ ½9́½ éÚÅØƒv¾ô“Ûƒvɇ‹ÜŹ“º9¥‡9¥‡ÏÅå¿Å§ô‡ÿ¯¶Ù½ĂÙÁ|óÂÓí«Ô¾ß ¼ ¶¼̀7ÏÅ麅س”êÖ°»ăˆŸ“ƠÍß°¿¬ÖăÇí·ÔµØÁƯÏÔăˆŸ;ÙÚ¹̃ÏÅùêŸ}ÿ¯¶«ÔÁ̉Ó´ƒˆ€¾ÏÔÙÚ±»Ù½¡«̣ÅØŸ¿éº±¿«‡“ÍjưôăˆŸˆ§ÔơÔÖ¾8ù×ëö«‡“Íj«‡“Íj¹Øχ±‡×ÚăơÇèÑÅĐæñÚÛÏÔ³+•½€ºñÖ°ÈÁĂ¹¼ù×÷ÁöÁ±»®Gø¥Ø½€å毾ר߈™‰kß [ïS«dí–G%½ƒv˹‡ÇÙ½ÎÅÓØö‰ÔٽϿ—àµØÍÄï»™‰kß [ïS߈ư“߈±»£»·ÔÏÏÅÁƯÚª‚ +¼9›¾ï³2ŸŒíº›¾±»½Ôäô2ơêµØư“÷Á¬¶ñÓÍË)éÛ9¥ßÏôê±»Ăº₫®¶éº¹Ú™‡Ѷ—»îƠ8¤‡Ûºÿڷŷ؉j̃ZîSĂù¹¹ÚÛ«‚ ½9ÓÅ¡È8¤‡Öé‰ñ5ñ·ëöÏÔŸåô±»³È߈¹Ú“Ơ÷äƠ +ÏÔù׎½€±»£ØŸÈI©ÇƠ¾GăˆŸ;ÍĂÛ«‚ ½9«‡“ÍjŸÖÛ×±ÁëÓƠß»û¥Ø9¥‡¿Ă¼Ä–½™‡Å›¾߈Ăκ»­‡“Æ«·3uUå¿ÏÔ±)ù×ù׋ÇϺ—Ó«Ôëö¿è¡Øψ˜×₫®¶óÏéÓ³™‰kß [ïSׯ±»߈µØ¨ÜĂ“Ơº߈¯ÈÑÓƒv½€÷ÁíÅùסȘ‰j̃ZîS‰¿I§Ô‘ۂ׫‡“ÍjµØ´Ü„ØË~Ù̉‘Öë¡È¹Ú÷ˆơÔêö;›¶é÷󫇓Íj₫½ß»û±»ŸÅ»çÛ×µØơ·qÛ«‚ ½9Û«‚ ½9ƒˆ«‡“Íj߈ëöºÅ°¿A÷‡…&À¼¥ÓÙ×ÙÚùׇÇăˆŸ;øêµØ™‰kß [ïSÙ½ßÄكיÔùê«ÔÓ ‹›æÚ&ó¹¡ÇöÚÍÓÛ«‚ ½9Á Û×™‡º©ÇĂÙµ}ív­ÏÅ“ÆÛ«‚ ½9Ÿóe߈ăˆŸ;ÑÄë×Óº›¾á éê™öơ}ÏÅË̉ØÚßÄÙÁ̉…ØöÚº»ÓÔÿÂöå¿ëö«‡“Íj¤Æ±»Ø×ƯâỒ ¬H ñÚ߈½ÅÙÚÏÅáƯöăÇ핽ƒ8¤‡ñÚ«‡“ÍjăˆŸ;ï½ÿÚ™‰kß [ïSù°ĂÙÛ«‚ ½9½ÔÇĂĂÙ¡ƠÙ×—¶ƠơºÑÄë­ÄÇÖÛ—¶ÿÚÛ«‚ ½9ÁƯ³ºó¶³z½Yщ­ÖƯº½ÇÖ‰¿IÛ«‚ ½9®‰®0ÁƯƒˆ·‡‘×8ç̉º»y•%™‰kß [ïSùơù×Ư)«·3uU•×±»•{¹Ú™‰kß [ïSÖƠ¹Ú¹ÚñÓ½ëöñÚߤXĂơÛ·Ó ¥0™‡ÿ.óÇÚºÅÓƯºöëö߈±¿±»ƯÔ°»½‚ṽ»úªÔ™ô™‰kß [ïS·Å·‡‘×8çÏ̉ÓØÏÅùê¡Ûÿ׫‡“ÍjÑÄëÿ¯¶Çؾÿ¯¶±»Ñæ­ÖÏÔ˜‰j̃ZîS¯ƠIĐÓ»º‰ÜëöŸá±¿±»8¤‡Ö¿º¦ô˜ÛôÄ¾Ú ¾Ù½ï½ Áø×»È÷ÙÏÔù×öåƠư׫‡“Íj¹ڃv¾ÈAÏỖŒÛ,ÏŇ½™×ñÚ9¥‡ôꃽ±¿¹ÅÔ™‰kß [ïS±Üï½÷‡¡¼ÁÓ¿Åÿ¯¶û֨ȡÁ£Ô‡ăˆŸ;kÛ«‚ ½9ƒˆÏÅŒºƯ‹½߈ḯ«‡“Íj¹%÷ÚÑó°½ăˆŸ;ưÀÅÄ«‡“ÍjªÔÓÆ±»ÇØẳ߈¥È°»·Åµ¤ˆ/\/0/ŽÛ«‚ ½9µØ·Ô¡»¡Á×Ơº«‡“Íj½߈™‰kß [ïS•ÜÿÚăˆŸ;̀Óï½¥Ï̉¹Ú°»ơê¹Úù××Ă«‡“ÍjµØË%Œ³ÁÇØ8¤‡ăˆŸ;Ö¾8ĂƠçÚÉ̉ÛêăˆŸ;ÛºíÆÿÚ÷‡¹ÚµØë§ưÀ¥ˆ]1ÂèÛ«‚ ½9¡ÏÔôêŒöÛ«‚ ½9ĂÙ¥ˆ]1âˆ:k¡Áȇμ‰ÔĂõvñÓßÄÙƠX®öꙇºÅØËÖÛ«‚ ½9‰Á9¥‡°¿«·3uUŽ·ÔÙ׫‡“ÍjÓ̉÷Á«Ú±»ívŒ +ỞŸóÎÔ½ăˆŸ;™‰kß [ïS©¼¿ăˆŸ;¿ºă½çổÅ0µØñÖ¿‰ÚÆ—ÂƠÙŒë*«¹€ÂÈƯÚÛ×ÏÅÙÚ¹ÚÙÚ½ĂåĂå̉ ƒv·‡‘×8çûæêÛ«‚ ½9±»ïƠ±»¹ÚÛÁƯ³(»‹ÍĐƒv™‡̀Ó9¥‡’ªÈÿ¯¶ơêÙ½±½ẳ½Ǻ߈ºöÁÅÓÚª‚ +¼9ÚÄ̉«‡“Íj«‡“Íj‹Ç“ƠĽÅôÛ‡±ëØ‹8¤‡Öß»û߈ÜăˆŸÙ½áÆñÔçÚ¡ÙÏœ—»«÷ç̃ºïô Ëûñ~ăÁÿơ÷ÓÏÛ«‚ ½9°»°»ơêù×·‡‘×8çù×»ØóÇÔX·Å¿ôù×ơĂˆúù×Û«‚ ½9±»§à¿‰¶±»‡Œ¡ÁăˆŸơê½ÈµØ±»‹Ç߈؇Î9„ƯéÚ½ƒvôĂ ô‹Ç߈¾—ˆÛÄÓª‡’̀j÷ÁµØ¯ÔÅÓ©Ơ«dù׃½„n°»«‡“Íj×¾ñđӳ¾±»µ‰«‡“Íjå‰×Ơ«»ÅÄ·‡‘×8çí¿‰­¾¤Ç×¾½ëÔ½€߈á=©‡¥2ßëMßÁ߈©ºÎ̉–¶  µØÏÔ«Ô߈¤‰̀L„§¹›¾ôå̉ ÍÄ»ØĐÚY‘ÈñÓĂÆ¿ºµ‰¹Ú߈û§̣µ†ßÄÙ߈ƒØ›¹ÍÓÿ¯¶¥‰ÍL…™‰kß [ïSưÀăˆŸăˆŸ »ƒvéÓé‡åx.“¼æº±»ËܻӫÔûØÿÚù굆۫‚ ½9½ôËÓ·ÔèâµØ½àăˆŸ;½Ô¡ÔñÚ›¾°êØ߈ÿ§߈ûƠ½™‰kß [ïSăà߈ÿ¯¶ÏÔåô¯Ô¤ˆ\0ù×̉º¡Ü«»ó°»ÏÅƒà—»óÇăˆŸ;·‡‘×8穇¥2ßëMùת́*Ù½«‡“Íjù×—¶ŸÖ‡ºù×ëöƠ¦âÄHˆëöŸèÂÙ¡ÇÛ«‚ ½9ăê㻵‰ˆº‹Ü•Èû›±»’Ô «‡“ÍjÁ|Ûºù××¾ÙÅëăˆŸ·ÅÅØ Ëû›¾ÑæÅà“Ơ·ÆɇåÛ×÷ˆ‹Ç§â×Ó£Çëö©‡¥2ßëM¢Çù׃v ÁỞƠ™‡ù×ơ꽎§ôå̉ ÏÔÙÚ¹ÚщưÀ—»߈Ï̉̉Ó·‡‘×8çá ÅĸàÚ·#¸Ú½ƒÖ«ÚĂȽ±ºÄ߈›¾³ºóÛ×Úׂ¾ƒv¶ØâÇØÓº±»«Ô·ØÙ×á —¶÷GÑÄë¾Å±»¡ÔĂÙ—¾8¤‡™Ô¹‘÷ûÓ¶ôׯ߈åÖĐÓ)ÍáÅÓöÁ߈ÏÔÇÖßÁï½ÎÅùëÁ¹±»ăˆŸ;ÁÚ½¾‡‡Ú—»χ¡Ơ¥ˆ]1—ÓƒvăˆŸÚª‚ +¼9Ă¼ÇÓŽñÓ§Ô¡Áă¶£Ø߈ÛÔÿڋǵذ»ñÓÏÔ™¸ Áù×ÛÀ½ôÏÄA¹ÚăˆŸ;k±»÷̣óǾÏ̉¿‰ù×÷Ù¿‰Óº»çùê¹Ú߈›¶é̃ˆơêÍĂñÖ»ˆׯ9¥‡úĂƠÄÿ¯¶½áêñ×Û«‚ ½9ÍË)éÛ9¥¡ÈÛ«‚ ½9¸ÚÏqăˆŸ;kóÇó1¡Ù‹È•kß [ïSá½€̃ˆ½½¾‡ù×ûÚ–»ëö¹Úú¼×̉ßÄÙ«‡“Íj·?ưÀéÓ¾ÏÔư“·Ó ¥0ÅÓ̃»úëö߈Ưå󰩇¥2ßëMù×·‡‘×8ç“È9¥‡ÀĂæºÅͪưÀơêËƠ߈ÑÓ§Ôù׿\ÏÔßÖäÆÏ̉—ˆÇÉÇÖ̀Ó ¿Å·‹«Ô™‰kß [ïS߈߈ăˆŸ‰¿Iív´ÅëöăˆŸ;k‚Úă‘·£ÇÍƠ÷ÚÖ¾Û«‚ ½9íØơؽù×ÓÆ™‰kß [ïS¿Ôψ‰ø«‡“Íjù×ÙÚưÀÓÔ•Èû›ù×ψ©‡¥2ßëMÙŒë*«ĂĂ ›­±àéM±»ëÂË¿ô™Ô߈áÏÅỞ™‰kß [ïSÁ¿ƯÓ ½€Ž¡ÈÓÅå̉ ³ͼ«‡“Íjëö™‰kß [ïS‡(ºơÄ€Ù½‡Œ™ô9¥‡«ÔçÚçÚ¿Å©ÓđÔ +¿‰ó™‰kß©ÇĂ ¹Ú¡ƯÇ»£ä™‰kß [ïS¢»ºÁËƠXÛ«‚ ½9™‰kß [ïSÛ«‚ ½9ÙÚñÓµÜĂ¼Û×™‰kß [ïS›v߈…nºÙÚ±»ºå̉ ùꙉkß [ïS£X°»Ë̉ăˆŸ“»½µa߈çÚÅĂÎơêâÁƯ ·Ó ¥0™ëéå«»«‡“ÍjÓØ«‡“Íj˜‰j̃ZîS›¾ù×Û«‚ ½9±»¿¾ÏÔ«·3uUÖÆˆÔX₫ÛÁSÏ¿óĂÍÓĂÙ«ÚưÀ©Ó…ǽÔéê×à߈½€¿‰sç'ù×Ă«·3uUÉÈöø×9¥‡ë×î ²2%½ÜÔXÛºÓËÓ„ÚáçÛ«‚ ½9óDZ»¡Á™‰kß [ïS«‡“Íjëö³Æ›¶é½åĂù×›¡Ưƒv«‡“ÍjëöƠÛ«‚ ½9µØÛÄÓÚ¨₫®¶ª¶2tT‡Ç¿‰™‰kß [ïSœ‰¾I­Ä¹ÚÑØÅÔ›Ú±»Ǽg߈8¤‡×±»›¾—âÙÚñíȨÇívϺĐÓ£Ø߈§Ó¿ßăˆŸ;©Ó߈Ở÷Úù×ơèÅÉơêÁĂºÁƯ½‡ö“º£ä¡ëöź­å߈¡Ôï»ăˆŸ;Û«‚ ½9“Ơ9¥‡ÂƠÛ×ĐØÍÓǺ™‰kß [ïSÛ«‚ ½9¹Ú½…Ï؉j̃ZîS}Àñ»›¾‡Ú—ˆ›¾ÙÚ‹ÙăˆŸÇ÷…»Ơ„¯×å̉ „đ™‰kß [ïSÛ«‚ ½9½ÿÚçÚÙ½¹ÚÚª‚ +¼9‰¿I¡ƠÜâơƒơĂȆ×ñÚ—ˆ»½…ØÁ‡é/×:Ù½¼€Ư‰í‡¾³z·ÔÛ«‚ ½9ù×á œ·̉ ¤0ơèÅÛÄÓ™‰kß [ïS¼ë½³àĂͼù׳蛾£»ù×ăˆŸ;kíº£ÆчóÂÿ¯¶ÙÚ±»“ƠÏź½™‡…Ö–¿߈麱»‹ÜăˆŸƒvñ,¥Èëö½߈ÁƯÓ̉ñƱ»ăˆŸ;½“ÈƯºñÓ˹ÍÓͼĂñ»Û«‚ ½99¥‡ÿÚíêÑ׉ÛåÁ¨ƠÖ¹ í¶ăˆŸ;­½¼ÙÜ߈׾ẠÇÿÚù×ÑÄ뫇“ÍjỞ“È™‰kß [ïSĂÙăà“Æ«%ÇÓ‰ØÙ½‡߈Û«‚ ½9±»¯ÈÏÔø¿˜êèäÅ—¶—Ó‡Ú³½ÛƱ»ÏÔéÓÁ‡é/×:ùơƯ¹Ú—¶9¥‡º·‡‘×8çùơ­·‡‘×8ç߈º×¾ÿÚµØ÷‡›¾ơêÛºăˆŸ;ư“÷Ú™‰kß [ïSç½ëöƠÙ½¡ÛµØ»ÅÇÓ±¿Û×9¥‡·Ô߈½÷Á†Œ‘ÖƠÅ©Ø߈ѶÏÅéÓñÚŽ€ù×ửƒv­€ϦÅ…ô釛‰«‡“Íjưˆ߈«‡“ÍjơÔ™‰kß [ïSù׫»ŒºƯÛÅôßÄÙăˆŸ̃½“ƠÙÚ»ØçÔ¡¥ÛĂßÄÙô“ºá=ÍÓàƠع—£ä‘ƒÆ©Çù×ơê…¯×ëö±»‚văˆŸ«‡“Íjö‹ÇƠÇ?ĂÙ̀Çùê«·3uUßÄÙƒØ߈÷r¹Ú™‰kß [ïSÛ«‚ ½9ç̉ï½áêëö¯G‹ø©Ø¾åŒ¿Nëö8¤‡×„ +ÙÚù׃v§ÔéÓ £ä¥³Èơ߈Û«‚ ½9¦Ô¡ÔÚÀÑŒljÛÂƠˆyÛ«‚ ½9¥ˆ]1ÍƠ™‰kß [ïSÇ߈°»Ù½ăÁ¤ÓÛ«‚ ½9Úª‚ +¼9«‡“ÍjÁ̉½—ˆ»ÅëöåĂͺƒvăˆŸ;kƠ²Â‰¿I·‡‘×8çg³ÈÛ£©¼™‰kß [ïS»Ó«‡“Íj‹¿ĐØK™‰kß [ïSÁĂ÷§ØY‹Çµ !ăˆŸ;‹ÜÙ½«Ú­‡çđÛ«‚ ½9ơê/¡ÛÛ«‚ ½9»ØÛ«‚ ½9Ÿ}Û·ÔëöơꃽÏÔáêơèÅù׿‰ăˆŸ;½€å¿Ñuß„ïÚ«‡“ÍjáöƒˆµØÏÔƒ×ù×½߈á å×¥ÓưÀêöºyô麲(ÙÚ¡ÔÍßù×½9¥‡µØ»¾·‡‘×8çù×…ÔåĂÛ«‚ ½9á=Ö¹ƒv•Œ‚vëöµaóÂÓº“¹ƯNô÷ÁÁ™ëéå¡»Û«‚ ½9ăàéÓƠÍÓù×ĂÙï‰Û«‚ ½9ª¶2tTëÚßÖ¥;§ôé •Œ߈›¶é‚¾³ 3Ơ Ơ½óÂăˆŸ;Û«‚ ½9‚’ù‡ÍÓ‘ÖäôưÀÿ¯¶±»ù×Ù×ÏÔăˆŸ;ÿÇÁƯ·Åƒvăà³±»ëÚĂđͽôßÄÙ×Ơù¿«»€ÄơĂƠù×щùטԀӘ‰j̃ZîS±»çÚÓºơêß»ûù×9¥‡߈Ù½å̃ÍÄÍÓƒÖÙ½âḈƠºÇܡȻؗ¶¨¼ÏÔÅÓ¸Ú±»ƒv“ƠÙÚƯÓ ăêµĂưÀÿƠŸ}ơúÄı»ơêÅà§Ô߈½€§Æè‹Ç³ºóôÉ̉…ØÏÔĂÖ̃ÄØĂÙË̉áꥋ™Á½ÈªdÇ̉߈½½ØåÆÅÔù×ăˆŸ;k±»å̉ Û€ÏÄóÔ±»¥¾ơèÅ…»±”£Ç™‰kß [ïS߈·#§Ó±»Û«‚ ½9™‰kß [ïSÑĂŒ¾éơ߈ăˆŸ;Á½‡ÿÚÿÚ³ºóÛ«‚ ½9ù×Û«‚ ½9ù×½Ô›¹£äÑÓ™Á¯Èơê×¾çÚ‹É0ơê¡Ơºyù׫ÚéÓœ‡ÿ¯¶«‡“ÍjđÖ̀Ê)èÛ8¤ÄÓ¥ˆ]1߈¥ÓßÄÙÎơÁƯ¿ØçÚơ‹ÇÖ½ÿ¯¶±»½Ôƒṿü¾( È ÏÔ«‡“ÍjëöăơăơÏÔùêÏħӷȖ»ăˆŸ™‰kß [ïSÛ×éÓºçm«‡“ÍjƠ߈ù×ÿÂơÔÊÅ߈ÏÔ¡ÔçûÙרăˆŸëöÇÖ‹Ù÷ÙơԽر»ăˆŸ;ưÀëöÙÚÛ«‚ ½9¦ôÙÚ™‡óĐƒvÑÓ¿ÿ¯¶ôÄÀĂ¡Û½ỒÓ ™‰kß [ïSŸï½̀¼ÿÚÇöù×ưÀ¡Ôщ̃ÁĂÙßÄÙ™‰kß [ïS¿‰Û«‚ ½9§Æ߈ƒvÙÚëØëöăàŸØíÆ¹Ú½ù×é"¿‰íơµØ£Ø«‡“ÍjͼơÔ߈¿Ø…½±»ç$µê¹Ú·‡‘×8çơÄƠXÑĂ™êößÁ÷ÙǺŽÏÔ²Â½ăˆŸ;Ï̉µ¢Ở­â®Æƒv˜‰j̃ZîSëöÚºăˆŸ¶•Èû›ŽƼ€Ä¾ßͼƒ½̣Âß»û™‰kß [ïSñÆï»›½ö­Ä¥‹À½ăˆŸ;ÏÅơê±»ôêö¾ßù×Ǽ÷Á˜‡Ø×ÊƠ£‰ßÄÙưÀơê¼ăˆŸ÷ÚÓ̉†Ç˜‰#j#̃####Z#îS#8¤‡“‹ºÅ$™‰kß [ïSÓŃvôĂ÷$¼ØÓÅÑÄëĂÎéÚửÅÁ“Ơ¾¹ÚÙ½ÍÓßÚÙ̉™‰kß [ïS±»Û«‚ ½9¿‰8¤‡×˜êèäÖÆóÇ™‡¿‰±»±»‚vèô ÅØ›¶Ô¹½Û«‚ ½9«»ßÁưÀ¹ÚỞgă½ơêͼƒØÅÔ…Ô˜Á¸Ú«·3uU¡È»Ø£q¡Á Áƒvéï±»߈Û«‚ ½9ÿ¼ÅدȽް»9¥‡½ñÚ™‰kß [ïS×Ơ°»™‰kß [ïS•{ÿ¯¶Ăº‰ƠăˆŸ;k“ÆÅƠÏÔé‰ñ5ñ·ƒïºɇ‚Ø ÁƠX»ØÛ«‚ ½9ùׇŒƒvÙ½ăˆŸ÷ÁĂÙêÔ…™‰kß [ïSƒ¢Ơ³(—Ó¡Ô˜‰j̃ZîS£‡±½‡ñ5€ºш÷ˆ±»±Ô‡ ÏÔ¡ÁÀƯ³ºóáq›™‰kß [ïSÖ¼“ƠÑÅù×¹ÚË¿¤‰̀L„í©‡¥2ßëMẲăˆŸ©Øº›¹À½¶ƒv“á±åƒvƒˆ€¡Á§Ô‹Ç¿‰¢äưÀÿ¯¶ÏÅ¿‰™‰kß [ïSơêù×™ÛÁĂä̉½ß%߈ăˆŸ;k”½Û«‚ ½9Ù½Ă ûĂÙÅëÁƯưÀ÷ڋǿߋC£đà=¿‰ÏÔ«âçÚù×ëöƒv·̃ù×Ù½ׯív£@£ØÛ«‚ ½9ùê›¶é½€ÏÔÛ«‚ ½9ăˆŸëöƒv«‡“Íj¾‚v¦Ô߈¿‰‡€ơê“Ơ߈­Ä‹Üív›¾‰¿IºÇâˆ:ÑÓĂƠ·Ó ¥0½ó½ÆÛÀ»Ư“Ç›¾ăˆŸ;ÛÏ̉ôÚ×á É̉×ÜăàÛ«‚ ½9ƒvÇ9¥‡±»Û«‚ ½9‹Ü£Çù׳ô™Ø©Ơ±»߈ƠX­ÛưÀÏÛ«‚ ½9“ÈÁ³Ù̉êöÏÅèºѶŸ»Ó嘇†Œ   ßăˆŸ;ĂÙ¶qÛêÍƠ¿½ơ‡Ÿ\±»±»ù×­ÄÛ«‚ ½9«&߈½Ơ«Úß»û“ÆƠÙÚö°ÍÓÁĂÑÓƒÔ•{ƒv… ÁÙ«‡“Íj…öØ×³Ûù×ç̉ËƯÏÅ™ëéåܾơ$É€¸Ú ˜ôù×û€™ÁëƠUÀĂƒˆÅØăˆŸ»½Ü¯Ó­Ô©ÓñÓ¯ÈĂÙ°» +çÚÓÔĂÙË̉½å̉ Ǻ£Ç߈Û«‚ ½9ôóµÀø¾9¥‡ÏÅĂ߈÷ÁăˆŸ;ßÁÿ¶Üơê«ÚôèÄ߈«‡“Íj£Çù×ÏÔóÇ9¥‡߈µ.¥Ù¿‰Û×ñÚơ굆ñÓ­ÄÍË)éÛ9¥…ôçôăˆŸ±»ш±½©‡¥2ßëMñÓùשӑ«ß%˜‰j̃ZîS¿¹á=±»éÓÙ½•Ö“È—™¹ÚĐĂÇÖÅŶųDzÚͽá=߈ÄØÚª‚ +¼9ÏÔµ†ơÔù×ß„«»Üù×—¶íÆ߈±»‡vĂºƯÓ ÛÀÏÔÛ«‚ ½9å7ØƠ¹ÚÏÔÍË)éÛ9¥Û«‚ ½9Ă¼É̉»È“—¹ÚÏơÛ«‚ ½9¶ƒv‡äó#¥Û¹Úå̉ ½ô—¶öÁƒÖÿ¯¶£ÇÙÜ«‰„ĺŒEIù׃ØÇå̉ ª%™‰kß [ïS™‡›¸›¡çơÔñÚÿ¯¶˜‰j̃ZîSÁ̉߈ªÓ¨º—9¥‡×·ÔYß»û‰¿IùêûÓăơ÷ˆ߈ƒvĂù×ËÉ9îÅù¿µØ“ƠµØñÚÏŇÇñÚ‹Ç¡Áù×ÙNÏŃګbßÄÙö9¥‡×ăà˹Û«‚ ½9ơêÇÖ£»©‡¥2ßëMÅ麛¶éÿÚ¶è©ÓơêÚơÔ÷Ù­¾R°Å‘‘‡º½€«Óô×RÅô©‡¥2ßëM¡ÛơĂçڡǾ©Ó±»›¶éơÔùếص‰áê߈ÛºăˆŸ;ăˆŸ›¾é÷ù×ù׿ै]1ψĂÙÛ«‚ ½9߈ù×ẳ™ëéå½ôκ˜‡Â»‡ÜăˆŸëö«ÛÁÜ÷Á±»ăºă»³ÜÏÚ¼Û«‚ ½9¹àĂÙ÷ÁÙYáƠ˜‰j̃ZîS›¾³Èư“êÚµ†÷ÁåôĂƠñÚ™‰kß [ïSƒvË™‰kß [ïS™‰kß [ïS“È̀Ó™‰kß [ïSµØëö‡º™‰kß [ïSñÆÔ™‰kß [ïSÓ̉ÿ×ËÉ9¡¼«‡“Íj™‰kß [ïSƠƒvÏ̉ÿÚ¯¼‡¹°»9¥‡—ˆçôđ» çºóÔø×Óܷų辫‡“Íj™‰kß [ïS©Ó«‡“ÍjûÑÖ$ÿǵؽ«»ßÄÙÅÓ«Ô¾Ở‹Ç«‡“Íjƒ’ÏÔå̉ ÷Ô‹Ç»Ø̃ˆƒvÏÔÆ½µ†±¿ĂÙ£ÈÙÚơÔ™‰kß [ïSű»›¶é›¾“ƠŽù×¾ĐæÛºù׃ˆå̉ ëöÓÆöÙ½±»ƠÿŸÈ忺êöË[Ù½§â§ÔÁ̉ÑÓÍÓÉÙ̉ù׫‡“Íj³(“Ơ©‡¥2ßëMÅnóÇ÷Á₫®¶¦ÔóÇÅØ׺­—ÓØ®Ơ¡Ơă‹ë$œ‡ׇ‚vÅØ¿‰µØ˜êèäƒÛ ÁÿÚù×ăˆŸ;k™‰kß [ïSỬáÑß½Ï̉Ù½±»Ü̉™‰kß [ïSÖíđæÚƒˆæÚ½€ùש‡¥2ßëMăˆŸ™‰kß [ïSÛ«‚ ½9«‡“Íj°êØ₫¾¿¹áêùêú«ÚÛסȽƻϹăÇí‰ÔÎÔÔ凱“¹ƯNåĂ»‡÷àŸÅ¡bëÔ¯È߈º»áûÜá•ÇÛ«‚ ½9›·ÔŸÅ«äº÷Á¹Úù×Û«‚ ½9ÇÖƒˆ™‰kß [ïSÛ×Ù½™‡±»±»ºÙ½‡Ç9¥‡Ù·Ó ¥0‚ÖóÂÏŮȅ֛¾ăˆŸ;ÏÔÓűívå̉ ơÔ±»éêÁËóÔ…Ôº‘ơâÁ½ôèêëöÛ«‚ ½9Û«‚ ½9̃ˆ»ˆÅØÊ¿ÅÔ퇃¾‘©¼¼‰±6íÖ˜‰j̃ZîSçÚÇĂWͽѶ«‡“Íj‡ºÛ«‚ ½9μÏÔÇÖ¸ÁØÀÛ«‚ ½9ßÚ¯¼‚å̉ €ºéêÙÚù×›¾¸Ú·Ó ¥0™‰kß [ïS÷‡ÿ™ëéå£̃Û«‚ ½9Ơ‹Ü±»½ÜñÓ¡Ô›¾ŸÈƒv“Ơ«‡“Íj‰Û߈¹àíêù×ù××̉åĂº½«‡“Íj»Ø™‰kß [ïSº±»è‰đ5đ¶“Æר§Æ«OÙ½ÿ¯¶ÏÅ£ä¥Û÷ơ™¶ÏÔÅÔ¿¹º·ÜĂÓÁ׿‰‹ÓĂóÖôêƯơ«‡“Íj½ăˆŸ;ÏÅψÛ׆Œå̉ á=¯×ºăˆŸëÓÓØ•Ç…ôñéºÓÅÛºó¶Ơ°»ñé÷™̃¢ä¹Úƒ½¡»ëöƠÿ™‰kß [ïSơèÅ“åÛ×ÍBƒÖỔÛ«‚ ½9¿àﻣäÖÚ +Ăٛڋܰ»‹ÜñÚÛ«‚ ½9ƒv¹¶º߈º£Ü™‰kß [ïS½ÜÙ½›¾«»ưÀ³È߈©ÇÖ̉ÍÄĐÓ£ÈăˆŸ;£äơê½ù×ăÚưÀÁƯËÉ9—Œ™‰kß [ïS½€ñÓÏ̉Ơ¹Úơ莇Úôé"¿‰ư­©Ó›ÁÔ½ÄØçÚº½ôá ù×S²È°»«ÔçÚù×»ÅàƠ«»ï½Û«‚ ½9ÏÔ±”́º ơԣǟ}«‡“Íj“¼‡̀ßÁ«ÔÍË)éÛ9¥ß»ûùêщưÀ©ÓÅØ“ºÛ«‚ ½9ÛÀ—¶ÁƯ÷ÁŒß¥ÛĂÙû(°½›¾Û×ïƠí‡߈¹Ë©ØÛ«‚ ½9¿‰ׯªÔÛ«‚ ½9¡È¿%ª¶2tTÓêöăº¹àưÀ߈9¥‡Óƒv߈ÏÔÏÔÏÔ±»å¿ÙÚÙ-öƠXƒØ̀Ăù×ÇÖº™‰kß [ïS¯Èï½éÓÍåÓ̉ÅØ©ÓĂÈçÚÛÇÙ½ÅÓÏÔÙƠëö™‰kß [ïSË%å̉ Íɇ‹ÓÁ|Ù½»ôÚª‚ +¼9ÁƯåד׳ÓÇĂ߈ÏÅù–ơꙉkß [ïS±»›¾µ†ù×ơ.±»Û«‚ ½9ÏÔƠƒvÈñÖ«‡“ÍjÎÄ߈Á̉¯ï9¥‡û÷ă­ׯÁƯ¼ ¾ù¿±ëØ¿ºß»ûïƯç—¾…»½ØƒvĂÅ–—Ú¤ˆ\0ÑÄë…Ơ«‡“Íj÷ÁƠºm±¿ÄÔ³Øè*gº́ƃvñíÈ›·Ô¬¶ØÅêøô¬Èù×ơÔö9¥‡ùדÛñݻ۫‚ ½9Ÿ}‡Œ‰Á·‡‘×8çóĂ³ÂÍñ»߈µØ¹.«‡“Íj¼ÁĂÙ߈±»ù×›¾×Ơ¶‡Ö8æÏÔĂÈ÷ÚÛ××Â÷Á™ÔٽŖëö±½†“&ĂöơêívÛ«‚ ½9ơÔưmÓØ±¿±»«b­Ä™‰kß [ïSù×ùơñÓ·‡‘×8ç—¶—¶߈ív½ÈÉù×߈ÓØ«Ú£Ç±½¿ßù×ÏÔ˜‰j̃ZîS´ĂåĂéÚ¡Û߈ü̉™‰kß [ïSÓÅ™ôóÂÁƯ±»ƒˆäô¡Èöù×ƒÖØƠµØ߈éÚÅÓ“¹ƯNÛnûÓÏÔ÷Á¡ÔÏÔăˆŸ;ׄ¹ÚÁñ·Ô½ĂÙßÄÙƯÓ ùªĐ¿ơáƠĂĂÓщÑÄëÛ«‚ ½9­Ø°»±»âà9¥‡ëö̀ÄăˆŸ;ưÀ±¿ÇÖ‹ÇË̉§Ö™ëéå“Ơ­ˆƠ¾ßëÔ±ëØÍÓĂÏů¼±¿Û©Ø„'‡×ÍĂ·ÔưÀù×·ÔÇÖ«)Ï̉·Ô©ÓưÀăˆŸ;kÅØÏ̉Û«‚ ½9·ÔÙ½«‡“Íj×Üùêؽá=÷Á¥ˆ]1·‡‘×8穇¥2ßëMƒÖº‡ẳỞµØ›¾­Ö±ëØùêÚ×ưéÚÁƯé‰ñ5ñ·ñ¹™ ù×ÙÚ¹¾ëöƠ™‰kß [ïS±»ưÀŒ‰°6Û×ÿÚÿÂ߈²ÆƠXÑÓø|ÏÅûÓÏÅùׯ¾›¾‘Ι×߈߈½³(ÏÅùש؇Œ±»½±»³Æƒ½áê8¤‡ÖưÀ«‡“Íjẳ½€Óº‰¿I™Ó™‰kß [ïS›¶éÂÛ«‚ ½9Ë̉¡Ç¼Û«‚ ½9ª¶2tT¹Ú™ëéåÁƯÊÏ +ùסÈÏÔĂƒÔù×ăˆŸ;ÿ¯¶ÁĂ«‡“Íj˿őۭå·ÔÓÅÑÄëƠ…ôáêùꘖÏÅĂÙÛ«‚ ½9߈·ÔÏԷżÿÚ߈“ÆĂÙ«‡“ÍjÿÚ²ëöÓ¼Úª‚ +¼9™‡ÍßÏߪÚÑÏÅÙÚóÇÁ… ‰₫¿‰ÔXº‘Ná ÷Ú¹Úëöơ»ÑÄëÑÄë9¥‡«‡“ÍjÅÓÂÙ“Ơâˆ:±»öÓØ߈½©ÓÑÓ•Èû›éꙉkß [ïSÓÓơê›·ÔÇ%ÏÔư“©Ø½Ô·ÅóÂÛ«‚ ½99¥‡±»ï³2°»8"¤‡"ÖƠXíæÛ«‚ ½9‹Ü×Ă߈¿Ø̃ˆù¿±»ăˆŸ;«»ù×ÛÄÓ“Ơî$éê£Øé×Ư‰Û«‚ ½9‹Ç÷ÁïĺÂĂ"ÇÖ­ˆ‡ŒÍË)éÛ9¥ơÔơê±»±»Á½§Ô¯G‹øÛ«‚ ½9ÙÓÙ½±¿߈°¿‘·§Ơï½—º®×Ûׇ'ƒvù×­ÄÑĂĂô›¹ơêĐð»ù×ë̉9¥‡Â§ÔñÖÀ¹—¶í‡¾º Ơù׫‡“ÍjăàûÙÀĂ©‡¥2ßëM¹ÚÅÔ·‡‘×8ç»ĂÅàöƒ½½ưÀú(½ăˆŸ;«ÔĂ©‡¥2ßëM߈™ÓñÓ“"éƠ¿ÅµĂÈƯ›¾Ïԯȇ“™‰kß [ïSÛ«‚ ½9ÏÔµÆííºçÇ߈ëöĂÙ‹Çï‡Ï̉߈ëö£Ëº±»ׯ̃ùׇÛѶ̉º̀Ó“Æ›¾ƒˆ½É¼«»½9¥‡ÓūԩØ9¥‡×«‡“Íjơ©‡¥2ßëMÓ¾ĂÙ¡ØÅ–̀Ó +߈›Ú9¥‡›Ú«‡“Íj·‡‘×8ç™ÓĐØ2ăˆŸ;¾¾ƯÿÂƠù¿¤Çëöå̉ ¹Ú±»÷Á÷‡Ửµa¬ÄºóÂçÚªĂH±»߈ó½ƯÓ 9¥‡Ïæ±»›ËÓ†Œ°»ÑÄëóÔăÁçơêï‡ù×Ǽ¹Ú‡“퇃vÏÄưØĂÙ¡Ư˜êèäÏẠ̊Ç™‰kß [ïSƠư“ù‡÷ÚÚשØàƠĐǽv÷Á¼Ă¹Ú̉½Á|ÅØßÄÙñ!£Ư•ŒçÚ±”©Óùê—ŒÑÅñ¿ËÇÔƠ¼÷Ú¾º •¾ÙÅ뙉kß [ïSƒˆ±»ưÀÏÅÅ…Û¶‡Ö8æÛ«‚ ½9ô«·3uUƯºÿ¯¶ï³2ÏÔºÏ̉Y°¿¹Ú‰¿IÔX™‰kß [ïSÿÚÛÀ™Áù×ËÓˆø¿«â«‡“Íj±¿Á̉ëỔºñÓôêƒÖ¡%‹ÛÛ«‚ ½9™ëéå•Èû›ëö‡“Û«‚ ½9ù¿ÇÖï½ÏÔ…àÛ«‚ ½9ăˆŸÍÓù×Û×ÏÔ¹à†ºIרÏ̉ÊÈ9߈ưÀ¾ôÉ̀å×ƠÁƠXÍÜ¦Ó ËûñÚÓÂ³ÅØÀ¹>™‰kß [ïSÓŮȇٯ‰¯0›vù×Û«‚ ½9ăˆŸ;ưÀœÂ§à­Öâˆ:½ÄôăˆŸù걿Ÿï½¿́ù×9¥‡™‰kß [ïS‡“ĂÙ›Û°»ƒˆívÛ«‚ ½9ÅØ‡º™‰kß [ïSÙܽÏùêƒÀƠÄ…¾Ù×ÑÅ«‡“Íj½‡¿ÏÔĂÙ‘ÖÂƠ¢ä₫ +®¶ +™‰kß [ïSñÙŒë*«“Ơù×û(ĂÓ‡ÛÏÔ‡«‡“Íjăàáê¢Ç™‰kß [ïSí—GƒˆÏij(µaÏÅ™‰kß [ïS¿ßö¿Å™Ó±»‚Ù½߈ɇÖÔ†6¦j±»÷ˆÉÖ¡Áíê¡ÛëöÇ÷‡Áă…ƠÀÛÚÏÅÉùÍÙ½Û«‚ ½9ÓóÄôȻţÇ×İ»©à̀Ó̃ŒÚ,‡ÇƒÚ߈ỞëöñÓÇÜ߈·‡‘×8癉kß [ïS¶ĺ±»ÿÚ«‡“Íj߈©‡¥2ßëMù×߈øêÅÔéêöÏ̉íꙉkß [ïSÙ½Ù×Ù½ơêÅÔµØơêÙÚ‚vº›¾g“¹ƯNö¯¾Ç«‡“Íj“ŇÚỔëöº¯Èëö›¾ÏÄívÚ×ơèÅϧÔăˆŸ†Œ¶‰…»µ†Ú×ưÀºÁ«Ôûû‡ä¿‰®Gø»¥Û߈½YíÖÓơ$ơê¾­Èϯȷ¼Í7ÿÚ°»9¥‡߈™‡¼ù×§Æ9¥‡ä‡·ÜÁ‡é/×:°»í‡«‡“Íjÿ¯¶ù×Û‹ÈÛÄÓƠ‡ºñÖéÓơêï»ç̉Ë ƯÓ ÛÄÓщ™ơùêµØ§Æ¯¼¬ÖăˆŸù×Çô—¶ëöÓ¹ßƯׇtÓ~!±»¹£‚vÛ«‚ ½9¡ÈëöÅÓûăˆŸ;ơÄÎù¾û̉÷¼‡Ç·ÜÛ«‚ ½9©ÓÁ½Ô½đ»·‡‘×8ç¹ÚÛ«‚ ½99¥‡“½¤¾ûƠ÷Á¤È«‡“Íj©ˆ°»Ươíá=¤ˆ\0RÛºÚª‚ +¼9ßÚ© Ở“È߈ËÉ9×Ơ½µ†«‡“ÍjÛ«‚ ½9ù×ëö£»±»™‰kß [ïSÁƯÏêÓÆÏÔëÍÛ«‚ ½9Å»÷Ú†Œ888“Ƶ؂ù·³à‡Ë¡Ô»ØÚÆ®‹Üö¿‰ÏÔ¡ÈƠ“°)•ŒăˆŸ;ăˆŸ;—¶ͯ·Å™‰kß [ïS¡Á¥Û£ØñÆ­ưÀăˆŸñÚ«ÔËÉ9ăºÿ¯¶½ƒvơĂÛÄÓɇ•¹à±»Ù½«ÜÛº¶µØ߈«ÔŸ}Öƒˆ©Ø߈ûøؽ°½ëöÙ½ÿ¯¶ÙÚøæ‡º·ºÏÔ½ÿÚ™ØÈ¯‰¯0ơê›¶éÛ×óÇÇ»ơÔ‡ÿÚƠX±ëØÔ˜‰j̃ZîSñùׯÈêöÖÆ ¾¨¼ù×íê¹ÚÀ¿ôÙ½ưÀ ¬°àèMë¹çڿźyûáê¡ÈÍÓöăˆŸ§È¤#§Æ†×Ž¢äÔËÓÁ¹ÿ.щ°»º©‡¥2ßëMÇØ߈ơê¯G‹ø½«‡“ÍjÏÔª‡’̀j¡ÔăơđÔƠµ÷Á‹Ü×ÜÓ‰¿IÓØÅô·º̣ģǃv‡߈ÍĂùê¸ñÓµàƠ±»¯Û½±»ù×—¶º½đöÙ½¾ÏÔ‚ÚÜ÷™‡çô“È­¿ù׺ëö§ô÷꨼óǯ¼9¥‡óÁ«‡“Íj»½¿ôăˆŸÑÁơû±»Ù½±»©ÓÍË)éÛ9¥9¥‡Ơ»¡Ô™‰kß [ïSѶ‹ÙˆÑ؇øëÙ×9¥‡×ų¿öÁ̉…Ù½÷óƒvóÇù×ÓÔ½ÔœÔñÚ«·3uU¡È9¥‡×µØû(™Ó“¹ƯNËÓ›¹ĂÙͼÙ×®¼¿Ă߈÷ÁÁƯ×̉éºñÓÙÅëăÇí±½ñÓ½»Ñɹ«Ú‡Œ—Ñ™‰kß [ïS¿‰רÁÛÇÖù¿êöÛ«‚ ½9ÙÚÛ«‚ ½9‡Œ̃æµØç«Ôå¡›¾‰¿Iß„ö«‡“ÍjŸ}Ă˜‰j̃ZîS³ï³2¸Å§Ộ×èê›ÚÛ«‚ ½9ñ,Ơ›¡ÅØÏÔ×¾ÀĂ—»êöÛ«‚ ½9ơÀ½÷Ô³ÈÙÅëËÉ9à¤<ü÷ñ½ơÔơêù׫·3uU߈ÏÔ‚v¡Áÿױőª¶2tT躘êèäÈ̃q—ˆ«»¡ÈÁƯ釽ÜÏÄ@½Øß»ûëÓ—¶¼™‰kß [ïS‹Ü³æ¥Û³ºó9¥‡™‰kß [ïS½Ăºơê…Œó Á¡Ø»ØÓÏ̉Úª‚ +¼9µØĐ؃ԽÔéÄÛ«‚ ½9÷ˆ‰Ô¼ ߈ăˆŸ;öÁơêĂºĂÙªÚƒ½˜‰j̃ZîSÉ̉¡ƯƯÓ «»á2¥·ºß»û½€ù×Ơ¼±»ù×ÙÚÙÚñÙÂÙöƒˆ³%ÿ¯¶щÑÓшÛ«‚ ½9©¼›¥ºÓù×—¶÷ÁæôÙ½ù×Ó¾™‰kß [ïSÛÀÛ«‚ ½9™‰kß [ïSỞ‹Ç™‰kß [ïSĂº¦¹é‡ÍͫѹڋÜù×ÛÇ«ÔăˆŸ;±»߈ưÀăˆŸƒvƒv‰¿I±»£¥Ùíëö¿—ˆ–¾ăˆŸù×ù×ñÓ­¾×Ơ†7§jшϾ¥Oƒˆ½Èð»»ôÛ«‚ ½9ỞûÖ‡ÛªÓ»ÓØ±½·‡‘×8ç“Û‹Û¹Ú÷ơ™‰kß [ïS»ÆßÔ“Û¨‡¤2€̃êLór¯¼—á«Ô°»ñÓ¿“ȃˆÅØؽƒa«‡“Íj›¾9¥‡ßÁ¹Ú›Ú±»ưÀ߈Û«‚ ½9ñíÈĂºɇĂÙƒvĂâÑÓ¡ØăˆŸ;¡Á™ëéå»ÅÑĂÏÔ¯Ơ™Ø Ơ¼ôE³¹ͼëö­ÄķŹڃv‹Ûï½´À₫¼ÙÜ·ÅƠÍÓÆËÇ—¶—»óÅ»ÁÙ½ªº™‰kß [ïSǼ©”½³¹±»½ăˆŸ;éê¼ÅØÅؑƣØóµØĂÙ÷Á߈Ï̉áíêĂÙ÷Á߈öê¡Û뫇“ÍjŃÖÑæø×Ï̉œ‰¾I¿çÅÓ”˜‹ö‘Æ‹Ç÷Ú¹ÖÙ½£ä«‡“Íjù×°»›¾Û×­©߈µÜƒ×½‡º7ÏÅÛ«‚ ½9±ÁÙŒë*«ù×ăˆŸ˜ ê è ä ±»ÿÚóêö«ÔíêÙÚ‹Ü­œÅéê‚v·‡‘×8çß»û±½óǃvĂÙ‘±½߈™‰kß [ïSăˆŸ;³߈ùꙉkß [ïSï½ëö°»Ăôç½½€Ă}ĂºƒvǼ½ôóÔ™‰kß [ïSÙ-ÔƠXÏšȰ¾™‰kß [ïS˜‰j̃ZîS Èó韭ÄÿÚ¡ÁéÚ™Á¬Ö¹ÖÑÅØăÁÿ׿»íơĂÙ¥ÆÅÄÇÖåĂÛ×߈™‡«»ß»ûƒˆ³é›¡¡ÁÚƠ±½öÀ¹‚v½¶ÏÔÏ̉– ëöñƹÚ%˜‰j̃ZîS§Óö¶ĂÙ÷‡ÅÔÓº¹ÚăˆŸßÁ‹Áï›Ù½³ºóÔ₫רù×¹Ú…»¾ß¤â™‡Ẳ߈áêÏÔ³çÚÏŃڄäôé¼±»Ϲå̉ ¡Ô÷Ù™Óù¿¹ÚÙ½‹Ç‚vă»߈™ÓÛ«‚ ½9Û«‚ ½9ïÚá±»¡Û°»ĂÙö¬ÔÙÚăˆŸ;ÑŇ³Ûº9¥‡×‚ ÷ˆ9¥‡‚v‰¿IåÁׯÄàÏ̉”öÛ«‚ ½9ßÄÙ­ÄཛྷÚÛÄÓùë½ñÖ½Ô߈ôׯ˜×³ăˆŸ߈ºÛÄÓ«‡“ÍjÁ|íơ•Ôÿ$ơ‡ÅØñÓ«‡“Íjá걿Ç̉£ä­ÄăÔ©ÓöŸÁƯ߈“È¡ùêÏÔÙ-ϼٽ©¼“Èáê‡Ûëö·Ô ÈưÀÓº§ÚÀÁ̉ºy­×éôËÇåÁ±»ĂÙÏ̉Ư%Îå™ëéåଷ#™‰kß [ïSƯڻŹóƒvơêá=«%èô‹Ç™‰kß [ïSăˆŸ;kïÚĐÓßÄÙ—ˆƒ½ƒvù×ĂƠß»û8¤‡‘¼›¾ôăàëï“«»ï‡Û¹ăˆŸ;߈‡ií|™Á™ëéåÈ̉Ù-™‰kß [ïS₫€¾©ØÅÓív߈ŸĂ}ëçÆØ “±»ÑÓó¸¶Ô±‚œÜĂ¼·Ô×­ÏÔ…Öù×9¥‡¡È×Óơê¡È±»«‡“ÍjÑÓ­Ÿ¹ÚđØ ÚºׯÓØÅÔ¹ÚƯÚ¡È߈ÚºưÀÿ¯¶™Ñ—¶¾÷Á¹Ú·‡‘×8çơềÓ8¤‡×÷Áƒvï»±½™ÁÙ½ñ×“ăˆŸ;½Ă¿‰™Óù×°¥&¿‰±ëئ♉kß [ïSĂÙ¡÷ƒv½ôæ'ẩëö½Á¼Û«‚ ½9ƠâºÛÚ߈ùëôù×·¯±»ÏÔ߈Á‡é/×:¡Ơôꙺ½É€ö3¹Ú™ëéåƠ÷Á¹9¥‡ƒĂƠç̉‡Œ±»°¿&ÅØƒvºù׫‡“Íj›¾ôăˆŸ;k¥Ø×Ơ9¥‡àØ8½ĂÙưÀ߈›¾Úɹ¡%ÁƯ˜‰j̃ZîSÙÚ…Ö϶Üû*Û«‚ ½9̣ÓÔµØƯâá ưÀư±»ƒvëöËÇÛº³ºóßÁûƠ›¶éù‡ëƯÚ™‡‹Ç·Ó ¥0ÍĹڦȱ»¥æ»ï“ÙÚÙÚÎÔÁĂͼîƠ÷ÁÚׇ¹߈Û«‚ ½9‹Ûù׫½Ï̉ÍË)éÛ9¥Ơ ăˆŸ;ó§ßùívëö ËûñÆŸƒĐÅăàơĂÑĂ¹̃ÿ£¤Ûéôñëöܬô ëöĂµØ™‰kß [ïS›Ú¶ÅÇv€ƠÍÄÁâưÀÈ—¶ÏĵØÛ«‚ ½9¼ô߈¯¾åŒ¿NçÚÁ߈߈÷ÁÏŽ€ĂÙ©¼¸Ú’½íÆñÖ½¯¼Û«‚ ½9Ÿ½Û«‚ ½9¡Èưˆ§ôËÇ÷ÁơêñÓù×ß»ûÛ«‚ ½9ăˆŸ;·‡‘×8ç±»½ăˆŸ;¹Ú¤ĂăˆŸ;°»±»µØù×ĂÈÏÔå̉ ÍË)éÛ9¥Û«‚ ½9ëơƒv½½Ó™à“àÿ¯¶©Ă÷Ô†aÆßÁÛ«‚ ½9ù×ͽàÍƠóÂëöÚª‚ +¼9ö§ÁĂúÙ ß»û°” ߈³È߈¾́½‚Ø£X‰¿IÏÔñÓ«‡“ÍjñÚù×ÑñÚ°¿£ØÛº™ô…“êö‡Ç™‰kß [ïS›¾Ạ̊¾ßÄÙïtƒ¢X™‰kß [ïSùôÂƠ–¶Ù½Ù½ù×ÈĂđỌ́Ô÷‡ÙÚÏ̉ø¿9¥‡…û(‡ŒóÂùê¹Ú¡ùׇÇÛ±»·ÅÅÄÿÇ›¶é°»±¿ÓÆëöéêăˆŸ«»©&‡ÚÑÄëѶ›‡·ÅơÔăˆŸ;ƒÁ¨Ø©ØïÁ¹Ú‡ă‚™ÁÛ«‚ ½9ÏÔƠăù×Û×ûÙ±»̀¬H°»Û×ÔXª»Æéº‡ÏÔñÖÛ«‚ ½9•ŒÓر»¹ÚÎÅù×êöÅÓêö±Á÷.ù׳àăàưÚñÖưÀÛ«‚ ½9ăˆŸ;kùø«‡“ÍjÏ̉ơÔÁ̉߈åĂ›àרơêơÄỞăˆŸ;kĂÙĂÙ‰¿I×Ơé‰ñ5ñ·ÄÓñÚçô±»ÛºÏÔÛ«‚ ½9½€«‡“ÍjÅÔÑÓÛ«‚ ½9½ăˆŸùê‘ơ߈ỞÍË)éÛ9¥Ñ·߈Óº÷ˆ±»¶6è6ÿÚúÓ±»·Åù×›‡ÉÖÁƯ÷Ú—¶–¶±½©ÀÁI±¿ëö›¹°»Û«‚ ½9‡a°»©‡¥2ßëMàØơêÿÚ«Ô›Ú‹ÓĂĂ§Æ¹Úư“凙‰kß [ïS¡Á˜Ô߈ÚºƠĂÙ°½ ùơ‚vû(ÖÔ†6¦jƠ×­€±»±»ÿÚôîù×±»«‡“Íj×¾¨‡¤2€̃êL±»ÀĂ«ÈïƠ󶙉kß [ïSϽº“¼ĂÙ«‡“Íj©‡¥2ßëM°êعڵK‹ÈĂÙÙ½Û«‚ ½9¢ä㫇“Íj™"«ÔÿÛù×ö©Ó²¶‰ à·ĂÙÏÔ₫Ç™‰kß [ïSͼ§Ôùôí–GƯººơèÅĂÈƠ߈ív¡ÔÁ̉¥‰ÍL…½ƒ«‡“ÍjרÅØĂ™‰kß [ïS‹¾ï½¡ÈñÇÿ¯¶9¥‡©¼ÏÔ9¥‡ÓÍƠñÓ½ÏÅÙÚ ƠX߈ƠÑÙ½ÿ¯¶ƒ¤ÈËÙŒë*«ùơƒˆǽ™‰kß [ïSÍË)éÛ9¥âˆ:ƯÓ ¾ß/ă»½߈ă»ù×шéÓµ†ÑÓĂÙÇܱ»߈³È¼€ +Ï «‡“Íj·‡‘×8çÇ̉Ö¾8ù×߈¿‰Ù‚°ó×»Åå̉ ăˆŸ;k߈àƠ0ÅÔ¡™ÓÿÂáĂăˆŸ;Ùщ™‰kß [ïSÅØƯÓ —»ÿÚ₫ùê¡ÿ¯¶ăÁÛ×»‡¡ØăˆŸ;›¹¯Ó·Ôᬢä Ơ¾GÍË)éÛ9¥ù×ơèŹڛ¾÷ÁßÚ¥ă‚vëơ©¼ÅØ̀½é‰ñ5ñ·ñӋܺÏÔŸÈưÀĂÙ›ÚöăˆŸ;¥ÚöăˆŸ;å̉ µ†ĂøêÛÄÓÎ|ñÙ‹Ó÷Ú匿NÍÓ©Ó±ëØÛ«‚ ½9´a¼Ô‹Üÿ$§ºÇëÓ꼡ư“ÀƯÿÂ9¥‡Ž¯¼™‡¶™‡¹ÚÛ«‚ ½9åĂ—Œƒvëö›¾ÔX±»ø¾ëö¶èÔX¡È‹ÇœÁçºÙŒë*«‹Üщ±»ÑÓ™Ô•ÜäÁÓØ—Œ÷ÚÚª‚ +¼9ơ꛾˜‰ j ̃    Z îS £u÷Á©ÇñÓ¥Ä麶Ü)ñÏÔÎÔ匿N©ºÙ½«‡“ÍjÅØù×Ăáê#ùê¯$Ǽ½ÅåÁéÔ™‡‡Ç˜êèäù×߈¿‰‹ÇĽÑÓ«‡“Íj«‡“Íjù×Ươß»ûùÚ™Ó˜ +ê +è +ä +ó¶ԙëéå¯ÈÂĂÁ¼‚éêử¿‰ûÓ­ÄÛÀÓØ÷Á‡ñ5ëöÉÜÇØăˆŸ;½€ơêµØ­½¼—ÓƒvÅÛ«‚ ½9î²2ÏćۇÇÛ«‚ ½9ĂÙ«Ôٽ͒¹ÜN€öÏ̉ª¶2tTĂĂ ›­±àéM¡%ù×ó±Á…ÔëöưÀ÷ˆăÁÂÙăˆŸ;μăˆŸ;̃Å8¤‡$ưÀÏÔÏÅ­½¼߈̀ÓÁƯ±»Ü%ÖÔ†6¦j›¾߈§Óâˆ:ٽٽ³ç„«»ÑÁƯăˆŸ÷Á¥ˆ]1²º ̣ ŸÅ«ÔÛ«‚ ½9«‡“ÍjưÀơếÚÏÔăÇí±»·‡‘×8çµØÅÓ±»™‰kß [ïS£äψ׿8‚¹Ú‡Œëö÷Ú³ÙÚºëöăöÅôƒv½ỖÄØ«‡“Íjñ±»ẳÂÙƒÚăÁĂÙÁ̉ƒˆ¯ưÅØØ×щ˜‰j̃ZîSµØÏÔ§Æëö’Üëö߈ÇÖï»Û«‚ ½9•×ƯÓ ­½¼˹Á«‡“Íjá=™‰kß [ïSÆ¥ˆ]1ógº™‰kß [ïSưÀ£ØƠ™‰kß [ïS¿́à«ÑíçÏÔÏÔÿÂéêÿÛ™Á±Á¡È´a›¾¾ßÂÙƠÄ÷‡¥È‘ÓÍÇÁƯ½µØ‹ÜùëëöËÉ9±»ÁƯÙÇƯµ߈ư“Ǽ»ÁëÓ™‰kß [ïSÅØ¿ºôß„†ŒŸëó#߈í‡ÿ¯¶Çâ½€™¸ù×½›‡ív³ ÷ÁµØ‰¿I¤È߈›¡9¥‡úƠÛ«‚ ½9ơêóÔΘ½ÏÅ9¥‡“ÈÛ«‚ ½9ÑÓÆшŃˆ°¿«ÚöĐÄêóă9¥‡«‡“Íj9¥‡·ÅË÷ĂÙ±»“ă›¾ƠÏÔÛ×™‡öÿ™ÏÔׯ­Âÿ×ÍÄ÷Áƺƒv—¶ÿÛ¡Çå̉ ‹ÇƠ§ô…ÔƠ™‰kß [ïSƒvùׇ·‡‘×8ç±»ùêµßï훾‰ÁµØÍÄÍĵØÙ½Û«‚ ½9ƒˆ‘÷êöÀ€ëö–Ó‹ÇçÚ™ô£É«‡“Íjæ¾ÏÅƯÓ ߈œĂ߈ƒˆăˆŸ;kƒv„ƠX«·3uU™ÛóĂÓÅåÁ9¥‡Û«‚ ½9íÁƯÏŽ­Ø£Ç“Æ̀Ó°»¾«ÚgÛ«‚ ½9ù×¼ÛÏ̉Ăñ'₫Û‹Ç߈ö¼©Ø·‡‘×8çÔ󼽯G‹ø¡Ôù×å̉ µØö·Ô†öªÛĂÙß»ûͪ°” ±»™‰kß [ïS‰¿IĂĂ ›­±àéMÙÜ¥ˆ]1Ó¼Ï̉÷ÁÏÔ‹Ü½ăˆŸ‡ºµØăר‡ºßăÁñÇĂµØ´Øø×ĂÈă»ÎÔ½Ởí˹ڿ‰ăˆŸ;¶Ô¿ØĂÙ߈³ÔÙ»™‰kß [ïS•Ơ‡Ú׿8«·3uUßÄÙëç߈«·3uU9¥‡¡ÓÛ«‚ ½9ùê•á½ÓºưÀÙ½̣öÁÛ«‚ ½9áûêù×ù×ÍÓÛÄÓ±¿ÿ§£»×¾°»÷‡¿Ù½µa½ĂÙ´aŸ%½ÔÓÆ­ÄơꕾóÇơ$©‡¥2ßëM߈ƒv°»Ù½éêÜ߈»Ø÷Á9¥‡éÓ₫®¶ƒv±»Û«‚ ½9߈ëö÷Á«¼χ©‡¥2ßëMëöÚª‚ +¼9ø×ÍÄ»̉߈ÙŒë*«ׯăˆŸ;ñÓÁ̉çô«äù×™‰kß [ïSÛ«‚ ½9­ëù׷ź½߈ßÁ½¶·‡‘×8ç¯Û­ôăàÛ«‚ ½9½›ÛÛ«‚ ½9«‡“Íjƒv¾öơêèê½Èƒớº#ă‹ó²% +Ë̉Ñæ±»­¾Ÿ̉߈ºƒˆëÚ‹Ó«‡“ÍjÏ̉³¾ÛÀ™ÁϺ½ïº¹¶¾ß߈רƠỠ«‡“Íj׺ÛÀ©º¿ç™‰kß [ïSƒÔĂå̉ ºỞù×ÅÓÖÆÄôÁñ°»½«‡“Íj÷‡±»™‡ÓµÏÅÍÛà€“‰ºÛ«‚ ½9ׯ߈ƠÙ½Û«‚ ½9Á¼™‰kß [ïSơijÍÛ©Ó÷ÁÍÓëÓÁÓñ×÷‡­Ä­½¼ѶÛÜÛ«‚ ½9ù×ÑÓ‹ÈåÇÇơºÑÓöÏÔ߈Ư‰¾¾ÅåôăˆŸù×»Û×±»åĂăàÏ̉½Ú×½§Ø«‡“Íj‡Œ™‰kß [ïS‚à‚÷ÁơèÅăˆŸ;±»±»‡½‹Çæ`コ¼ÔÖÑĂÉ©Øï"ĂĂăˆŸ;kóñ»á$߈ç̉ÍÄăơ°¿¡ÈöéÚ¹Á‹ÙÏÅ퇙‡³Û×¹Ú¿Úö‹¡ÈĂÏÔ—Óù×ù×ëöÍË)éÛ9¥˜‰j̃ZîS³Èƒ½ăˆŸ«·3uUử‘̣́v·¦D ÍÄÏÅ߈ù×Ư‰™‰kß [ïS®Èå̉ ÿ¯¶­È¹º›¶é§á Û«‚ ½9ÇÛ·‡‘×8çÏÅ«‡“Íj₫éÓ߈¾Ù½¡øơ ¯Û¹b»Ø›·ÔùëăˆŸ—¶ËÖăˆŸÛ«‚ ½9«‡“ÍjרùוŒêö½Í£Û«‚ ½9ăˆŸ‹ÈÁƯ›¾ĂăˆŸóƒƒ™Ôɇ™ëé忉߈߈ª‡’̀jäÁ9¥‡êö¡ÔÚÀµm×Ü›¾åƠ±»ÏÔÙ½µØù×Ëù¿ùê±»·Ôׯ·Ô÷‡ù×ç×9¥‡¡±”»ÅơêăơËùƒØÙÚñÓĂº»ØƒvÑåÆăˆŸÛ«‚ ½9ᬱ»Û«‚ ½9ăơù×­ôÛ«‚ ½9¡ƯÁǽ¹ÚÓºÿÚ†Ù ́ÙœÁ™‰kß [ïS߈¼ôù×£ÇĂ¼ÏÔǺ¹Ú“Ⱦ™‰kß [ïS›ç•½¥á“̉ÙדºËÇ·‡‘×8çÆƠ¼ĂÖ­¯‰¯0‘ÆÿÚăˆŸ™ÁçÚëöÙ½ÍÄÛ«‚ ½9Á¶¿‰ÿ×Ơ•Èû›ƒv™ëéå½ƠX˾£ØçƠÁĂ½ËÇÙ½À¹§ôÛº‹”ӺѩƠÁ¹ó«‡“Íj…‹Ë9¥‡‡ÛÙ‡Ï9…ƠÁ.€º³àăˆŸ;‡¿±‡ơêơèʼnÆôÛ×áºưÀÏÄϺ߈±¿·‡‘×8çơñ»ƒvщ9¥‡Ă ‰yơÔßÁ ËûÑơê‡ÚÅÔûØŽñÆÚÀÙ̉©‡¥2ßëMĐÓÏ߈ç½ÿÚÁ“£ä©½«‡“Íj匿NÏÔó^›¾ÏÔ«‡“Íj™ôŽăˆŸ±»‹Ü˜‰j̃ZîSñÓù×8¤‡©‡¥2ßëMÚº߈ƒvɇ©Ó¡£Ø̃Á±»ÑÓºå¡ß»ûÎơ߈µ†µØ±»ơÔ¹ÚµÁå×¼ô€ƒô“…Ö¾÷‡›¡½Ơ—¶ÅÁư“±¿‡ÇĂÙÛ«‚ ½9µØö¤Û±»½€™ĂÛêóÂơêăˆŸăà™‰kß [ïS÷Á±»ñÚưÁë§±»àêéº͇áêÁçÚ‡¹ö¯Ü™‹í‡…ÜëöÀ̉$íÚÛ‡9¥‡­Ö̀ÓĂÙ›¾ׯù¼­Äùëù×ăˆŸ;×ܧ¹ƒˆÛÄÓÅԸ󫇓Íj…Ơ­Ä9¥‡›ÛăˆŸ;ưˆ£ä™ÓëöëÚ™‰kß [ïS›¾̃ˆÛ«‚ ½9ùôà=—Óö˜‡щă½‹ß:ÏŽ½רé‰ñ5ñ·öÁÛÂÿ§æØùæºØ§ÓÁƯ­ÄéÔ“¼«·3uUŸÈÏÔ—¶±»ƒ¾‘«‡“Íjƒv½ËÓƒàÅ¥ÓÆïÅ÷ÔĂô߈ëÔưÀ©ØÏÔÏÄëö«‡“Íj­Ä±½˜‡¬Ö£ÇĂƠ—Ó̀Ê)èÛ8¤œàƒØùêщ߈‰½™ÎÁĂ«»ÙÚ½°»ưÀĂƠ‡ÛÙ½«»³åÚ‡Û«‚ ½9Ë̉ÏÔÙÚ©‡¥2ßëMá³È«‡“ÍjñÓ‡™‰kß [ïSÏÔÙÚゥ‡¥2ßëMÛ«‚ ½9†ºĂĂ³›«ÔÙÚ™Á߈·ºăˆŸ;½¿ôŸ}ÏÄ›¾º‹È«ÔŽéêÙÚÿ̃ß»ûĂÈÁ¹™‰kß [ïSï½™‰kß [ïSÁ$¹à×̉ÅØ³¹Á¹Ú× ¼‡ăˆŸ;©£‡Œï³2öï½Û×XôùêŸÖ̉ºÓØÛ«‚ ½9£ÈǺñÓ߈ăˆŸ;ëÔôÍı»ĂºƠîÁĂ/©‡¥2ßëM©¼›¾Ă§«Ó‡xûëöăàăˆŸôê +â»ôÔ¿(ͼ߈˶èÛ«‚ ½9ơêñÚ’Æù×Óº«‡“Íj‡ÓØ©ÓñÚ¼?ơêׯùæËÇ9¥‡ŸïÙ̉˜Á“Ʊ2§ÔùêửËÉ9߈¿‰íÖĂXÙ±»©ØøôËÉ9ï»Í‹ÙƯÓ ơêÛÇ̃ŒÚ,߈áö¿‰½× ¥ˆ]1 ÈÏÔï»é¼à¤<̣#¦ ›¹̀Ó'ÑĂÁ½³È§Ó«ÔÏÊÁ½ƯÓ íÅÙ×±»çôÁĂëö‚Ö̉¼[‹Ç¡ÛÏÅéºÛÇàØ©‡¥2ßëMÙ›¹µÍƠ×çÔ¡ăˆŸ¿́Ϻ£Xȩӗ¶½ôËÉ9±ëر»ơÔù×ç'ĂÙ¹Û«‚ ½9ù×£ØưÀĂ¯Èù×ç̉ϼÙ×ëöÙ½ÑÓ÷‡ÎÊưÀµØôĂéŒÓ̉Ă™ơ9¥‡9¥‡óÔÏÄăˆŸÅÓψÛ«‚ ½9̀Ó»ỞËÉ9’Ơ›¾߈9¥‡ùׇñ5éêÏÅ™‰kß [ïSÛ«‚ ½9•Èû›ù¿ÎÅ•ÛÓÆÿÇÍÓÙÚ»ÀŸÈÓ°¿ăˆŸµØƒvơÔëöÅÖëöëÆÛ«‚ ½9ÁƯ½ƒàÛ“ƠÛ«‚ ½9½½›¾Iơ»óÇÁƯéÓ½óÔÛ«‚ ½9Ó¼ßƠÅçÚ9¥‡¥ ăˆŸ;k¿́ù×…±»ùëù×ëöÚª‚ +¼9¹Ú³1ëö›áº½߈µØé‰ñ5ñ·Û«‚ ½9—ŒÙÚø×±»ÏÔ÷ơ‡«‡“ÍjÙÚÙ×߈Ù½§Øơê¶ÈÜÏÅ™‰kß [ïSù‡€ºơê½€˜êèä—ˆÍË)éÛ9¥߈º½ƒàÅÓö¼ÜƒÖÛ«‚ ½9©Øºר¥Ó­Ø—¾ÍÄ%ëöơèÅ߈̃ˆù×ọ̈ ¿‰¯Èß™ÍĬİ»ÏÄ«‡“ÍjßگȽÁ¤ÛߌÛ,½Â³íÆ߈‰ÛŸ¿ñÚ³¡\©Ó˜‡¦Æ×Ă¡ÛỞûƯƒÖ÷‡ăƠ߈Û×ËÉ9è¼…Ơƒˆ¿߈íêùׂÚívƯÚµØÏ̉±»ßÄÙăˆŸÏÔ«‡“ÍjÅÔơê¡Á¡Ô«Ôɹ½ĂÙÅÔ¨Ç×Ơ¯ÿ&­¾Ù½ưÀưÚµØÅØÑÓ±Ư‚ˆƒvÏÅÏņ×Ѥ»Y©¼½ĂïÁÏÅŽ¾º̉°»ù׿́©‡¥2ßëM£@ɹï¯G‹ø›¾ÙÜ8¤‡ÍƠ÷Á³ÛÙÚù×Ăë«%çÚå ™‡÷‡•ŒŸÈ¬¾å̉ ĂÏÔÍÓX ¡ßß„›¾ơÔ×Ü߈ĐÄ ê ù×ỔăˆŸ;ïäù¿ăˆŸ;kéÚëöăˆŸëö˹£Çơê¡Ô±»‹Ç÷Á±½ăˆŸù׉Ûù×Ơ'óÂå̉ ï¶°»¾Ù×Áă±»Á Á¼‰¿Iß»ûÍÓËÖø×ñÚáêăȱ»ĂÖ²‡ÚºÅ«ôÓÆÿ¼›¶éŸÅ»ÓÅÓÙÚ°»•ˆÏÅÛº™½«‡“Íj’ëÏŵØăàù×ăˆŸË̉ÏÔ«Ñ¥ˆ]1å̉ ö½Û«‚ ½9ăˆŸ;¿Œ߈ù×·‡‘×8çµa½ÏŇxÛ«‚ ½9ˆÛÆù×9¥‡ï»ëö½€€ºÛ«‚ ½9߈Ǻơ ¹߈Û×÷ÚÓÏÔ±»ơ»’áê±»ív¯È¼½Ù½ͼ§Ô’ƠóÔËÉ9ÇÖÅÓ¤ˆE\E0EưÀ9¥‡Û«‚ ½9¸à¿¹ÏÔÙ½æºä̉Û¼ÅÄëö™ÓÏÅŸÅÏÔá ÿ¯¶ËÉ9ƒ¾‘ºÓ̉‚Ö¯×ù×¥ˆ]1ÀƯŸ}«»±¿—ˆíÆù×ܺy€¹Üù뛹§¹¯ù׺nÄÂçđ¨Ó™ÁñÓÛ«‚ ½9ÀĂỞÁ ѶµØ«·3uUÅÓơċӷÅơÔ¹ÚơÄø×ÔXß»û«»­¶ƠÄêÔÏ̉£Ó÷ˆ§Ô•ŒĽ$©‡¥2ßëMỞâˆù×¾ºơĂù×ûÙ½±»ï½“¹ƯN¾ÏŽƒvëöï½Û«‚ ½9ôƒ—ˆơç9¥‡éÓ¶Û×ÏÔ±»¹Ú¿Û«‚ ½9¥Ö¾£ƯÅÔG½¹¹ÚÙÚ½™‹¿q•{«‡“ÍjÇ"Û«‚ ½9Ññ»§¹Ç̉¡ÈÛ«‚ ½9ç½ù“ö™‰kß [ïSÇØáÛÇØǼ±»£‡Ûº§ÓÍË)éÛ9¥9¥‡×ăˆŸͼ©ÇÓÆÜ«&Û«‚ ½9ÔÅ«‡“Íj±»ăßÚÍË)éÛ9¥ÿ¼ăˆŸßÄÙÛ×ôÛ«‚ ½9ÅØ߈đÓù¿»‹ÔÏÅ“Ăºáêç̉ăàÇÖ¶èƒvû™Ó“±»áêó…Ôƒ»¨ØÔX°»êÖÙ×ÙƠư‡±ù1™Ó‚v«ÔóÇÛ«‚ ½9£ØçÚ«‡“Íj̣ÄÙÚăÇíưˆÛ×›¶é±»Ú×µĂ9¥‡ëöÛ×›¾íÁÛ«‚ ½9£ÇÏÔÙ½­Ä›™¡È—ƒv½€£ƯơÄÏÔ‰¿IÙÚ•ŒÏÅçÙ½›¶é™É«Ú¿‰¾£Ø߈ëöêơĂÙ9¥‡×á Ó̃ˆëöÏřӃvËÖóÇÁ̉ÙÜ¿‰̃ˆ±»ÙÅëÛ²¹ÎÔ߈™‡ÿÛë™H±»«‡“ÍjƒöÁĂ«‡“Íj—ÓưÀù×ñÆăˆŸ¡Û¿ºÓØĂÙƒv±ë؇Úù×÷ˆŽçô¨¼ù×ÂÓÆÿ¯¶ëö…ôË¿ĂÇ%­ÖÛ«‚ ½9߈ưÀ³ØăˆŸ;«‡“ÍjŽ•ÇïƠ±ëØËÉ9ÊÇ¡ëϹ‡ŒµÈ±»ù×÷ÚÇۃ网Ƶ†ăÁô›¾—¶ƠXÙŒë*«óÇ™‡ï»—¶ÿ½Ñ9¥‡˜‰j̃ZîSÑÄ뙉kß [ïSÀƯ¶‰œ™‰kß [ïS¡ÔµØå̉ Ăi™ó¥Æ¾¾Ø¹ÚÏÔµaƒv‘Ó™Á¼˜‰j̃ZîSß»û·Ôׯ£»™ô«ÔÄÓ*±Ưʉj̃ZîSÛ×ùêơĵ†‹ÇƠX§ÔüÁÏÅœÜ×0ư‡±ù1ƒvÙŒë*«½ç©Ó‚×ÊÓ—$Ă½½ƯơÛ«‚ ½9ëØÍíÛ«‚ ½9Ơƒ‹ÇáÓ»ˆù׺½ ă»ûÍëöù×ÅØ߈éàÀÁñÚ±»½“ÈơêöœØơÄÏë±»G½¹ߌ³ØÇÖ­¡Üí‡ĂĂùê÷ÁÜ‘ ăêÏÔ÷ÔÁ¸¿‰ë™ºăˆŸ;ù×áê½ĂÈÙÚù×ÏÔº8¤‡×‡€‹Ç†Ç‚v™‰kß [ïSƒÚ™‰kß [ïSçº9¥‡£äÉ€ÿ¯¶ÏŵØÔÔ»?Á¹«Ô߈ăˆŸ;kÿ¯¶á$ÅÓù×ÔXR¥Ó¸ÚÛ«‚ ½9¿‰߈°Á ‡‡ŒÄÀ •¢ƒv™‰kß [ïS¨À ߈áƠÏÅù×»¼‘ÍÓ¡Ơ·ÅÙŒë*«Ïâà9¥‡¸Ú›Û߈ăˆŸ;«‡“ÍjŸÈơê“Ơ«‹߈Ë¿ùÛ™‡™‰kß [ïSå̉ ǺăˆŸ·Øù×™‰kß [ïSµØÏÔÛÀ‰¿IöŸÁ̉ưÀÛ«‚ ½99¥‡±Á«‡“Íj‚ƒˆ̃ˆ₫™ïƠÿ¯¶Úª‚ +¼9·Ô¶Üïq¿º߈ƯÚÙ½™‰kß [ïS½Û׫‡“Íjëö»ˆƒ¾‘߈ƒ÷Á¥ˆ]1ÍÄרöăơ·ï̀¬HßÄًǩءÈׯÏć~é£ưÚ½ô…»«‡“ÍjáƠ”»Y‰Á́Åơ“ÙŒë*«·ÅÅÔƒvơăˆŸ½öÖ¼éê·Ô“È—¶·‡‘×8ç½×̉ÏÔ«‡“Íj³ÜÛ«‚ ½9ûĂѦµaí‡ó¶%ăˆŸ;ĂĂ«‡“Íj·̃™‰kß [ïSç̉ƒv ÛµØÁ‡é/×:°½¹Ú½°»×¾¥Øá »…Ö›¾¡È÷Áƒv™ÔÁ£»ÓÆáê‡Çëöƒ×ÏÄ›¶é×Ơ×ƠăˆŸ;·‡‘×8çÑÅ©‡¥2ßëMơÔ÷å5ÓÿÂσ֫ÚăˆŸ¹ÚëöíÁÙŒë*«åŒ¿NÇÖÖÆÚª‚ +¼9߈ш‰Ôö±»ơ꽫ڿºùê…ôùë£Øå̉ ÏÂëöǡԇŒ̉Æ«»ư“‹Ù¥Æ¹ÚÛÄÓăơ®¼±»•ºĐĂ߈ẳÙÚË̉Ă¼¬Ö©óÿÚ÷¶ô‡9°»ª‡’̀j½»ôûºµØ­Øö¡ÈƼ;¾½¤Çï!ËÉ9‹Ç±»ÿ¯¶ׯ¡ÁÙ½ñڵعÚëöí%óÇ׿88¤‡ÅÔñÓëöƒÚỞßÚè‰đ5đ¶œĂ»ÓƒˆgÛºÛ«‚ ½9©‡¥2ßëMùׇ9¥‡¥Æ‰¿Iù×óĂ¹Ú¯È£ăˆŸ;Ûº߈«Ô߈ĂĂ¡ÔẠ̊™‰kß [ïSÛÄÓ¿ô˜ơ‚Û«‚ ½9ÅÔ…âó¡ÈÏ̉«‡“Íj™‰kß [ïSÇÖÚª‚ +¼9óÇ¿‰÷ÁđÓ‹ÇׯöÁ¹Ú“Ư–Á½›¾ó¥ÓÎŧԪ‡’̀j½ËÇûñ»’Ƚšå™Ó«‡“Íj‘ÆỠ߈ëØëöăˆŸ÷ˆƒ„ơÔï½çÚÙ̉Ú½ëöÏÔÑ£±»ËÉ9™Øá۩DZ»¡Ûƒv­Ä…Ô“ÛÑØăÁÏ|ÁƯÛ«‚ ½9߈Û«‚ ½9Å·ù×±»¼Û×ÂÙÅÔ±ƯÙÚ“Èưˆ¡ÛÚ×÷ˆùׄ—Œ«Úщù×§ôơé¹ÚơèųÈÅØơ꛾µØăˆŸ;kÖ¾²Ơ£äß»ûÛº¡%‚ «‡“Íj¹Ú̃ŒÛ,Ơ«‡“Íj­Ăá çÚÍB¥ˆ]1ơèÅưÀ»É½Æ»ØöÁDĂ‘àׯăơ±̉¯ ™‡ß'ª‡’̀j™Á™‰kß [ïS‹ÜÑÅöÁÇầÓƯ‰‡©¼ñÖ±»ĂÙăˆŸ̃ˆÓÆùêÏùæ±»¡ÈÇÖÏÔăˆŸ½‡9ø¼đÚµ§߈ォäÁ¼©ºá‡ÇؾÛÄÓ÷ÁÙ½̣Ç÷ơÓ´߈‰ÛÙ#ưÀ™‰kß [ïS¹¾ªÔÑÄëáÛÏÔĂƠçôéѹÚưˆëööÛ«‚ ½9Ởá ½-±»‡‡ŒưÀÁ¨¡Ô•×™T€Ä&ëö«‡“Íj»Ü²¾ÏÄÙÚ½åôƒˆĂÙÖ‡¼7Ơ¥ˆ]1™Ă·Ô¿ß“¹ƯNù×ÏÅù×ăàùå™ô«‡“Íj·Ø™ÁƒvÎ̉ĂÙÛ«‚ ½9Ó¾‡ºăº‡Úù×߈߈ÿÚ́v6à=›¾çÚµ.¥Ù·‡‘×8ç±»̃ˆơêăˆŸ;kĂÙ­ÄÏÅÇ«‡“Íjû£ØƠÛ×™‰kß [ïS™ÛÛ¹߈÷ÛÍÓéÓóÂóÇÙ»ª‡’̀j‘ +‘ÆÙ×íÚŸÅù×›¾ĂĂ ›­±àéMщ–ˆ÷Á¿ß°»߈ÖÆ‰ß‹°¾º­Ö퇛Âä̉ׯÑÓ°»ÎÔ¾•Ÿ}Ơ©‡¥2ßëM·‡‘×8çÑ·Ơ¼¡Ô«‡“Íj匿NƒÔ±»÷ íÚ§Ôàêçô߈—»½Ø¾8¤‡±¿ÏÔơêĂÙ߈ٷإºí$߈›»™‰kß [ïSÍÓ™‰kß [ïSă‘·ÏÔ÷Áªz™‰kß [ïS߈ˆ;ƠĂĂèơ¯¼ùêơº«·3uUÏÔñÆ™‰kß [ïS±»Å»ëöñÚ÷ÁÛ«‚ ½9Ư%«‡“ÍjëöĂĂçôÇÖÏÅ߈†º ŸÖù×ư‡±ù1Å̀Ä(ˆư§‡ù׉¿Iù×±»÷Úë×ĂÙÙ½Ë̉Æ̉ăº½÷Áö­vшôêµØàÓæ¹Ú›¶éÀ¼¹£ŒÓù¿‡ºưÀƒvµ.¥Ù—Œ¤ˆ\0™ơ·Ü£ åÙÚÀĂ&µaµØŸ}ăÁÑæÙÚăˆŸ;ùꙉkß [ïSÏÔ‡Œ¾ù×Û«‚ ½9©‡¥2ßëM½Ôá̃ÏÔ“Æ™‰kß [ïSơÔ·ÔÏÚ߈±”ơÔ«‡“Íjƒv÷ÎÔĂî²2ùטêèä̃ˆ‘Æß»ûçÓû(©Ó½ÔùסÔö¡ÈÑÓÍÓÙŒë*«Ù½ù딋 œH ½é‡é¼¹Ú·Ó ¥09¥‡ƒÙ½ÛºÏÓÓØÿ¯¶¾½—¾½€˜‡½ƒ½ƒ×àêÏÔơÔă½ÙÚøơ½ÖÆù×ÛưÀñíÈÙƠËLÛ«‚ ½9­ÄË̉߈ăÁÛ«‚ ½9—¶߈ơê¿Å™‰kß [ïS»߈ÛÀơèÅơêÑÄëàêùטÓçÚÁ̉˜êèäÙÚË̉ơê‘Æÿ§º—ˆù×›¾£ØăˆŸ;°ê؋ܛ¶éóÔ°”‡Çåº̀ÇĂÈÛ«‚ ½9Ù½‹vÁƯÛ×ÏÔ䛡»Øƒ™Óív—¶éº·‡‘×8ç¾ù×ÏÄáê½¼ô¥ÖưÀăˆŸëö9¥‡½ÑÓ÷‡¸ÏÔư“ăơ³“ƠÍÄÑíÑÓ¹̃Û«‚ ½9ϼù×åĂá$ưÀÛÄÓ½àß»ûÚª‚ +¼9ÏÔ¹Áƒ¯vG½¹›Y–¶aaÍÓÚª‚ +¼9©¼©ÓßƯÛ«‚ ½9ùô²Ø—ˆ£äƒ×Ë̉‡×éºÏÔ©‡¥2ßëMˆ‡j9¥‡£ØóÔƒ¾‘åÁÛ«‚ ½9¥µ™‰kß [ïSÛ«‚ ½9Ơùש‡¥2ßëM³Çß„Ǻç“Ơ°”ơÄŒÛăˆŸ;k̀Äø×ùßÑӥə‰kß [ïS¥Èµ‰ÏÔ‹ÇÆÀƯ±½ÙÚöÁ¹|Û«‚ ½9̣ưÀƒvËÉ9‹Ç·ÛÅÓ˜êèäçÁÓØ¾½Û«‚ ½9Á§ăˆŸ;¾·‡‘×8çăàÁR»ÁÙ-÷ˆñÚËÉ9µØ¿ßÏÔĐ“Æùê´‰±»ù¾íÜ߈™‡¹̃Ị̈ÛÔø×ºÅÙ½Ñæ‹Ü½±»—ƒ¡ÔĂΉyÑØÛÄÓÏÔÚª‚ +¼9÷Á¢ØÑÄë©ÓÅÓ’½›¾ÏÔ—‚–¶’½™‰kß [ïS«‡“Íj°½ŒƠ‹ÜĂÈÏÔ¼ô›¾¹óé‰ñ5ñ·ºĂ¥ˆ]1ÿ ù׽ȓÈƠăˆŸ;åơ‡Û߈Ù-“‹Ù½Ç¢öÇÖƒˆöÔ«Ó̉Û«‚ ½9Ó½ă»çÚ߈ăˆŸăˆŸ;ỗÁ Àµ“ߌÛ,Íĵ†Óºăơ¿»¥‰ÍL…ÎÅ©ˆ—ƒ˜‰ +j +̃ + + + +Z +îS +ÀĂ +·§D ›Ú±»¼€Ù½„k®Gøù¿ÙÚ߈å̉ ½€ÓÅ›¹ơ^•퇟ÅË9¥‡áêó|º½ñÖƒv«èÓ̉ơèÅÁ̉߈Ư±»™‰kß [ïSÙ½º…Œ¤ÈăˆŸơê‹Ü±¿Ă ½ôÁñ©Ó‹ÜỡÏ™‰kß [ïS÷Ú³ ƠÓ¼€¥Ó»‡íÆẳ™‰kß [ïS±»ƒvœÓăˆŸ;±»Ù½Û«‚ ½9׾˃ٽ«‡“Íjà çỗˆ½߈—ÁŸ}É̉ù×ÛÀ—¶“ÈÛº»ù×»ÁÛ«‚ ½9Ăô‡xëöùê9¥‡Ù½¥‰ÍL…ƒÖƒvûŸ«‡“ÍjïäƒvăAĂÙÙƠ½ô»ÈưÀÆ›¾ơêͽï³2߈̉Á¡Ú×>É(ÁĂ©‡¥2ßëMÑÄëÖƯ𷩇¥2ßëMÚùêÏÅ‚v©Ø‡µÂ ¬°àèMƒ̀ÓÇÓÄỗˆ0߈ÏÔÛ«‚ ½9߈Á½ù×ÏÅÙÚѶÙÚơèÅ÷‡Ơ«Ú£Ø߈«‡“Íj¥ºĂóĂÅÓ¾ÿ¯¶óÂÛ«‚ ½9¡Ôî½ß“ÙÙ½éÓ÷‡å̉ ưÁơèű)ª¶2tTëÔăơ³Ç•×ÏÔ›ÚơêÂƠµØ¹‘—¶§Ô8¤‡ƯÚƯº́$ÏÔ9¥‡µ̣ù×ÏÔÙÚ›Û߈ëöÑØÇ̉¿́ÏćñÓÿ×߈¼ÔÎÔăˆŸ;êÓÛº¦Æ³Â·Ôù×ÛÉĂÙ½߈•ŒĂƒvâ$¿ÅăˆŸ;$Ϻù×ÛÔщËÉ9ív×ĂƠÙÚÛÇ™‰kß [ïS߈È̉™Ô•Èû›ï‡ëö½ׯÿîÑð»‹ÇŽÛ¹½ÙÜơêÚª‚ +¼9›¾»ØѶíçÿ¯¶¡̉ÁñxăˆŸ;k¥ÁưÀùׯØÅê¡»éÚƠÏÅÓ¼¡ÈײøêǺăˆŸ;Û«‚ ½9ơÅï‰øêơÔ»«‡“Íj™ÁÏÅăˆŸ;§ô³àÛ«‚ ½9›¾ù×Û«‚ ½9ªÚĂÈÏÔ“¹ƯN¢»Ϻ¯̃ù×ưÀ߈—ˆôƠù׫»ăˆŸ;ĂÙùơï³2©½₫®¶™‰kß [ïS½9¥‡ÿ¯¶ÓÅÓ¹ßƯׇtÓ~!߈ô߈§Ô«Ô·Ó ¥0å̉ Û×Û«‚ ½9̣ÇÛ«‚ ½9“àÁƯ¾ß ѶØËÖÖÂtĂÙóÂùù·Ù½ÿ¯¶ÎÔËÜ߈ƒ½Û«‚ ½9÷Á¼ëöÿj¹ÚîôÛÙ§ôÇĂêÚ¦ÈßÁ—¶ÁăÏÅ™ÁăˆŸ;ÛÀÓŰ»¡ÑÓ“Ç—ê½Ôù׳܉ơêµØƠơèÅăơ¼€å»ơÛ©Ó™‰kß [ïSÛ«‚ ½9³Â±»¡ƠÁ¹½¡Á´aÎÅÁ¹›¶é›¾¾™‰kß [ïSÏÅ­éÿÚƒvÑÓؽǧÔƠÇËÉ9¡Ô™Ó§Û«‚ ½9‰y“¹ƯNر»±¿ÑÛÏÔÿ¯¶í—G«Ú›ÚÛ«‚ ½9‡Ú·Ü·q­Ä»÷Áù×ÇÜ«‡“Íjùꙉkß [ïS±¿á=ëöơlϼ÷‡9¥‡óÙÚ÷ˆĂöˆù×₫Ú·‡‘×8çÆØ¥ˆ]1á ¶ÔÏÅщÁ½ăàíơëö«)¡Û±ëØ“Ææºö±‡›¾¡ƠưÀ«·3uUÙ½Ă‡Ú½$ƒvÙ½“ +é‡èêĂĂ ›­±àéMÍÄđÙ°»ăˆŸù׋ÜÛºïÀƒÖ§ØÛ«‚ ½9±»·‡‘×8ç±½¥äƒvĂÓÏÔơêưºÛס ±»ÂÿÂƠX£Ơ±»Û«‚ ½99¥‡›¾ÜÛ«‚ ½9á+ăÙéØÙ½ÙœÁÑ·±‰Ô›ç©‡¥2ßëM%«‡“Íj¥Øµ†ר­ÄÛ×9¥‡ù×ă¼ÁĂÓ̉±ëؘ‰j̃ZîSáê£ÑÓ¼÷ÁívÿÚ“ÈØ×çí‘Æ¥Ç½€ÛÚÁÏĽ§ÆĂĂ߈Ṇ̃¶ï‡¿¡ÛºûÙ̀½ƒv±¿¾źÛÅÔÛ«‚ ½9ÍË)éÛ9¥ẳ±»™‰kß [ïS‡ŒÓ¾ù×ÚÀûÙ׺º±È釗ӿôĂÙ÷å5ÓÛ«‚ ½9·‡‘×8çù×ÙƠ·Ô÷‡Î£ÇÁ×ïÚù×Ư³àëöź§Æ±»Ùâº˹ßÄÙù×£ØÑÓÛ«‚ ½9ƒv«ÜùׯȻŜ‰¾IÏP߈Ë̉׿8߈ªªÁ¹™ëé嶇Ö8æÁ̉·‡‘×8ç³*Óº¹Úƒù¾ÿÚăˆŸ;Å–¿‰Û«‚ ½9ăº±»‹‘Ù½¹Áơ}¡ÇăˆŸå̉ ë‚èÛ±½÷‡Ăº‹Ç¿߈Û«‚ ½9߈›¾ºÁËÇá éÜ¿«ÔÛ«‚ ½9Åô÷‡©‡¥2ßëMáƠñÓô»°»‹çÛ«‚ ½9ơ$½ùåƒv½€‹Û¹ÚñÖ¯ßÀÙ¸Ú¯ÂÂĂ÷Ù«Ô‡öùê‘Æ—ăÅôơẰÓ%­¾¶µĂù×ïƠ±»ăˆŸ;Û×Á̃Í–¿ôË%Û«‚ ½9ßÁ™‰kß [ïSå̉ «»ÍÄôÏóÇŸ}ÅÓ«‡“Íjăàù×ÙŒë*«·ä»ZĂÙÛăơéêÛÀù×¹Úٽ߻û·‡‘×8癉kß [ïS¡ÈÀĂôÛ«‚ ½9ñÓï½ĂÙ™‰kß [ïS£ç̉·‡‘×8竇“ÍjÜÁ/“¹ƯN»‡ăˆŸ;₫­×¿8Ù‡Ï9…»Üù×Ở߈ƒvùê™Øƒv¯Û×¾ÅÔ‹ÇĂ÷‡«‡“Íjêö™±½êöÉ̉ÍË)éÛ9¥á óÔ™‰kß [ïSĂÙƒ¾‘™Ó­ÖơÔƯù×ÅăˆŸµØ…»§Ó«Ñ±¿‚vß“§ÔÁ”£ØÄ«ÔđÓш́¶ª¶2tTÏÄBå̉ …ô½Ư‰âˆ:k×̉ăÂ3ƯÓ ËƯ€»ˆăÔ­Ä߈³«‡“Íj«‡“ÍjÙ×Ơéº߈ÁÙơÔïÀ‹ÇăˆŸçÚͼµa“×ó£Ø8¤‡ăˆŸ™‰kß [ïSËÇ߈ûĂÙ„Û«‚ ½9ƒˆ¾³ºó£ƯơÔ…´ºà—¶çÚ¹ÚÿÂăˆŸ;ÍÓ“ÜưÀٽٽ£̉Ù½±½Ă«Ôö÷ÚßÄÙ‹ÜñÓ󫇓Íj‹ÇÏÙÚñ×å̉ ơÔÁƯ§Ö½·̣‹ÙăˆŸ;›Úëö½«ÓëöĐÓ°ÈôĂÿÚ¡Ô‡Ûå̉ Û«‚ ½9߈ƒÖă×ÜƯ‰Ơ—ơÔ«‡“Íj“¼ƒvù×ËÇăÇíñÊÓØß¡Áßñ•îëö±»ơúƒÚ½€щÛÄÓÇÖÑÓ™‰kß [ïSæÚĂŒ¾߈ïô‡º™‰kß [ïS·Ó ¥0©ÜßÚÛ«‚ ½9åôÏÔ¬Ö!ûƠ©‡¥2ßëMÙ½ëö߈çÚá ߈Û«‚ ½9¡ÈÛÀưÀ«d‡Úƒ¾‘¥ˆ]1ÖØˆï»‹Ç¼î½ÓÆâˆ;çơöù×±»Ú¹Á¹ƒ¥ºưÓĂÙ¡hÏÔ¾́ëÓ´˜‰j̃ZîS¬v«‡“Íj9¥‡ØÅêÍË)éÛ9¥̉Á½€ÏÔÁƯưÀóÄưÚơÔø3º·‡‘×8ç̀­ƒˆÏÔùêñÖµÈÛßÚĂ™‰kß [ïS»Á­ÖơŇ“ëöÛ«‚ ½9µØdívív«‡“Íj߈ưÀăˆŸ;k«»ÙÓÚª‚ +¼9ÂÂÙºĂơ³ÁÓ¼ƒơ™‰kß [ïSáĂÙß»ûÙÚ±»ƯÓ ™‰kß [ïS¾öăÄĂÙÁƯg½€ÇÖ‚v¡Ô™‰kß [ïSƒvÙŒë*«ưÀ™‰kß [ïS¡Ô÷$ÑÓ…¯ÈŸÈ£ØàøăˆŸá ôê§½ÁĂ¹Ú©ˆ¹Ú—»ÍÓµØăˆŸ§Ôëöí—G™‰kß [ïSÏÔëöϺ½ù×çÔ¡Ô¡%ơèůăùæ¯×®¾½ô‹È™ëéåÛÛÇùסۃv÷AÙ½₫®¶óÔÙŒë*«ψ­Äí‡߈ÑÄ뙇™‡ó¶óÛ«‚ ½9ÅØ‹ÓÙ½¿†é‡ÂÖùå—Ǽ½‹ÛÁƯ±»·Å£ä·Ü¿‰ÉÍË)éÛ9¥—»ëöÁƯÏÄAÁª¼ +ÅçÁ߈¡»±»¡ÔëÓ»Ø߈8 +¤‡ +”öéÓăׯ©¼¹Úù×™‰kß [ïSùêëÚß»ûá=í/Ù½µØưÁÂÙÁÓûÚöÁ¶±»Û«‚ ½9¹Ú«‡“Íj¶“Æù×¾¹xÛ׳ӫуvư¤Á½áÛô¾ÇÖÍÄ™‹Ư‰×ÜÙÚ·‡‘×8ç%ív¿»߈ßÚƒ½¿ô¿ÂÛ×éÛ«‚ ½9¯‰¯0߈ÁƯƠí±»ưÜ。/÷‡‡ŒÙŒë*«ÏÅăưÀ¿¹·ÔÛ«‚ ½9ùô¦Ô߈Û«‚ ½9Ùéêƒà±»Û«‚ ½9º™‰kß [ïSËÇÑÓ‹ÈÏÅ߈ÿÂà=ù×±»ÅÔ߈›¾°»ĐÙơêË„«‡“Íj¡‚°¿¶ËÉ9ĂƠƒvŸ}Íı»Ù½̀Ê)èÛ8¤É̉åÁưÀëöçÚû(©ƠçÇË̉³ôËÖÏßêÖ¡»·ØÁ¹·Ô±»¯G‹øªÔ‡ºƯÓ ©&ñÖ§ôăˆŸ©ÈƯÓ «Ô…½ÿ¼—¾ëöÛ«‚ ½9±»ºÔ¾F·Å±»÷‡רŸÅÇØá=ï»™‡¦Ô œ‰¾IÛºăˆŸ;‡¥ˆ]1©Ç“È®×›¾¯×ŽÛÂßÚăơ™‡ø¿ö÷ÁÁăˆŸ;k‡ÿ§˜êèäù×ëö“È߈ÑÄë¸Ú¥¾ïƠƯøè¼Û«‚ ½9щºÁ߈½÷» Ëû¹Ó‡Œƒàêö×Ăß»û·ÔăÂÏÄï½ÓÓ©¾˜‰j̃ZîS±»ÁƯÛ׋ÜÇĂ©‡¥2ßëM¯×µaĂÙ±»Ç «‡“ÍjÛ××ÜöÛ«‚ ½9ưÀûƠ©ÓăˆŸ;ÏÄÀƯ¨Ç̃½•ÖÙÚªÚ ¥Ó‡Ç‡ºăơ…ôăˆŸ;Üå̉ ăˆŸóÔƒv«»‹Ư߈dzȡÔÏIJÈáÇ(ưØ×Ơ«‡“ÍjĐ¸ÚŸÖ•ŒÓºÛ×·Å×¾óÇÅØóÅØŒê*ªÓŽÈăˆŸ;Ûº9¥‡ƒv©‡¥2ßëM߈“à₫¿Å»ØĂÙÏÔÙ½ơèÅ«‡“ÍjÙÚ§ô÷ÁưÀÁÈÙÚ—ÓÙßßÁ›¶éƯÓ ™ëéạ̊ÂϼÅØ‡Ó÷‡™‰kß [ïS™‡ÄÓ9¥‡×£äă½߈ĂÙ ¶Ô ½Û«‚ ½9óÔù×ăàûăμׯăˆŸÛ«‚ ½9‘«›¾ÍÓ‡ÚódzÏÅ¡ÁûÖ›¾ºăˆŸ;Úª‚ +¼9ÇƯßÁ½³Â₫Çá=ĂÈÁ‡é/×:™Ó˜×ÙÜÏÅÛ«‚ ½9ÛÄÓ±»Ă¿´ŸÖăˆŸ;¢Ô߈́½0ٽɻ±»çô¾ăàĂĂå̉ Ïű»ăˆŸôĂè¾Ô˜‰j̃ZîS™‰kß [ïSËœ·̃§Æ™‡öø×9¥‡÷çÚ™‰kß [ïS…n«ÔƯº߈¾¼̀›¾Ï̉Á‡é/×:›ÛƯÓ ›¶éÏÚÂÙ +ĐØׯ«‡“Íj«dÛºͪ箩ǬÔçĂ×ĂÖ̉åƠÉĂÑ×߈ĂÙéÚå̉ ùëïƠëö‘ÆϼăˆŸ;ưÁ»y·Øù×öÁ%‡ù×ËÉ9±»ÅÓ±­³áöÿ¯¶ÇØü¦†§߈ÏÅÀ½‚vƒÛ™‰kß [ïSµ.¥ÙÛ«‚ ½9±»à=ù×çÛ«‚ ½9Ï̉½Çåî¶ +²î¼ë«‡“Íj¾§Æ›¾èÓ÷Úϼ¾ÂÙ­RÛÆóƯÓ ÂÙ ߈±»«·3uU™‡ŽÓÅ›¶é9¥‡ï»¹Ú›jÓºÙڅ亹ÚçÚỞÙ-«‡“Íj÷Ù9¥‡đÁßÁ¹¼ƠăˆŸ¡Áƒ½™‰kß [ïSÏ̉µàÍË)éÛ9¥™Áß»ûÛ«‚ ½9Ç̉± ËûǼ·‡‘×8瀺½ÔÇ»߈đÆ‘ÚơÔ«‡“Íj¾ÁơÔ±»Ø×ͼÛ«‚ ½9Û«‚ ½9±»±»χ«Ñ©‡¥2ßëMçmçÚƒvĂÈơر»¿ÅÊ%ĂÙ™‰kß [ïS߈·̣ûäÛ«‚ ½9ơÄĂÛ«‚ ½9Î̉±óöóÔщù×£Çëöíç½ËÏÄ@ăˆŸ;©¼›¾Ú×ÏÅ¿Âê™ÔÁƯ™‰kß [ïS߈©ØµÆ‹Ç«‡“ÍjÙ½åĂëöĂÙÅÙ™º£ä³…ÖưɵÓô½ï½ĂÙ·Ô­½¼º£Ø™×µØÛ«‚ ½9™‰kß [ïSùן\ÿèµØÿ¯¶¡º›¶éø¼ä̉ƒÚ·‡‘×8çÙ½ŸœùæåƠë,ó¡LJŒÿ¯¶¶ÅÇÖµÙ‡Œ÷‡«ÔĂÙﻥˆ]1“Ù½ñùưÀù¿Û«‚ ½9¹ẳ—¶±¿Ù½û‹Ü±»À¹ ·Ó ¥0¡ØÛ«‚ ½9Û«‚ ½9ƠǼó¶ƒØÿ&Ïŵ†¡È«%™‰kß [ïSÑĂơÔ‡ºïiÙ×ÛÆ«‡“Íj™Óÿ¯¶‰¿IÉ9Ù½χăˆŸ;Á̉¢X÷ÁĂÙÁƯ¾›Û$µØÔ½¾‡«Ñ”Œ“Ơù׿ßåô9¥‡›¾©‡¥2ßëMó›ëöù×߈§Ó±¿«·3uUÅÓ«‡“ÍjÅ–o¥ÓÑĂÙ×·ÅÍÓ̀ëö“ÙÚÎÅÔX±»߈ÏÅëö…́çÉÁ혉j̃ZîS«ÚÏÅ™‡߈Û«‚ ½9߈¼Ø +ø×ß»û‡ŒƒÔ‰å×™Ó™ÓÅÔƒ½Ôß»ûĂ·Ô§Ó·‡‘×8çơêÅ»«ỖˆÛÄÓ­vƒ™Ó±»ơê‡Úàê“Û߈Û«‚ ½9±»ù¿½ÈщëöóĂÛ«‚ ½9ñƱ»₫ÄØưÀϺ±»…ƠÏÅàö¼ôÓ¾Á‡é/×:›¶éăˆŸ;k%ÓØù×؇Î9„ùơñÆÍƠäÁ߈¦Ơï³2ÙÚ“ÏÔÛ«‚ ½9¾ÙÅë×¾™‰kß [ïS‡“Á«‡“ÍjëöíØƒØéêéꘉj̃ZîS½ÿ¯¶ÏÏı́ĂĂöơêù×îß™‡ÏŃډ¿IƒvÙĂÓË̉ÛÄÓ߈«»ăˆŸ©ØÏÄÅØ™‰kß [ïS߈¶ôơêÓÁ¾½“È×¾ç̉ٽᬨ‡¤2€̃êL9¥‡Û´ï³2ŸƠÛ«‚ ½9°»ù×ăˆŸØĂÙ±»ÄØ«ÔçÀù×ƯÓ Ơ™‰kß [ïS½ƒăÚéêÍƠ8¤‡ÅÄÓ¼³ô‡Ú™‰kß [ïSÑĂƒ×߈ưÀÏÄÛºăà̃„ñÓÏ|°»´Ă ĂÙỞăˆŸ;k±»½Èá꫇“ÍjƯÓ éêăˆŸ¬Ô»Øÿ¯¶‡ŒÛ«‚ ½9ƯÚ°¿±»«»ÏÔ…ƠÖ¡»Ñ—ƠÉ»ÏÔáƯ ËûÅàƒ>ăˆŸ;¾¹xÖÆ̃ˆ±»ëÓ÷ˆßÚ߈ó"ñÓ€ºÍÓûÓùơù×™Á¡Á©‡¥2ßëMôĂÓÔç„ø§Ô½ØëÔ¡È“¹ƯNăˆŸ;ăˆŸ;߈åף˂ƒ×½…€­:«»°¿¾ºáê³Øú ߈Ăȭؽơꙉkß [ïSçÚß„ƠÄ߈…Ơưˆ‡ŒĂÁƯïô……¡ÇñĂưÀ¯Ơ9¥‡«‡“ÍjÏ̉æØ +¬Ö½é¼·ÔëöÅ•ọ́G½¹ÿÚ₫¿±»àÄÙ·ÅÁĂ·‡‘×8ç«»̃ˆ¿Ú™‰kß [ïSÚÀŸ»¹™°»‡º±»›¡ù›¹ù× %ûØ«‡“ÍjÅÓ‚ÖÁ½ĂèÛ«‚ ½9½ä̉߈«‡“Íj…ööÁ÷ÁÙ½߈›ÚÛ«‚ ½9¡ÙƠŸ ûÓ™‡ÑÓÅÙ—¶«Ó匿Nƒ×ßÁÁ˃ØĂÙ߈å×ƠÓ¸Ú­Äå×ÙÚơơ™‡ưÀÙÚ×Ơ9¥‡ĂăˆŸÛ«‚ ½9›vߦɇ¼€Á˹½¡Ü߈°ËƠëöùêÖ¹-¸àb½¾‡¡ÛÛ«‚ ½9×Ăºéê¹Ú•÷«·3uUÙÜûƠˉ¾ÏÔƒÖ÷Ùëö¡ÁĂÖ̃»úăˆŸÏÔƠX“ƠªÚ ÑÅÍÓÚª‚ +¼9½ÍÙÈôĂÍÄÏÙÚơÔăˆŸ;k¹ÚĂÙëöÿÛ¡ƠÏ̉ƠÄ‘âÛ«‚ ½9íÖß»û½Ă—¶âà‹Ó½ëö±ÁÀ¼™ÓéÚÏ̉·Ô¿¹Çñ»°»ù׺¯ÈơĽ Ư±ÙÚÏ̉­€½÷‡ƒ×«‹û!ß߈ÙÏÔçÁ½ƯܱỨÆ™‡›¾¡Ơơê»Á󷸽ÅÔéºù×½¹Ú™‰kß [ïSÙ±»é‡8¤‡×ăt»ØçÚƒv½Ô¥Ç‡Ç“Ơ…ÚÏÔØ¯G‹øñÚ߈‹Çׯ·Ỗ»úƒÖÁĂÁÚ“ƠĂÙ¡Ô«‡“Íjùêÿ§ª‡’̀jÛºµƠ™‡­Ó–¿‡ïÁĂ¿»™‰kß [ïS9¥‡×ÚƒvÁ±́¬¾‡“±»Û«‚ ½9…Œ­¾¢»ƯÂỞ±»ơê½çÚ™‰kß [ïSöÓ ‹›æÙ½‹Èá³%ù×™‰kß [ïSù×½¡ÛÿÚ°»Û«‚ ½9½ùשØăˆŸ;߈Á|Åá±»°»Úª‚ +¼9«‡“Íj«ÔÙ½±ôÁ̉‡Ûû(Ơÿ¯¶¼߈ÙŒë*«®¼¥ÆưÀÙÚÛ«‚ ½9µØ™‡¿‰ÁñơÔ½|Đˆ߈±»öÚÀƒˆçÚ•ÿÏÔ›¶éÁ¹±½ƒˆÅÓ߈©Àºß»û…”ívªåŸÖ³ ׯÏű»·‡‘×8竇“Íj߈³ÂƒvưÀ3Á*ÏÔÛºÚÀ†ºñÆÅØÛ«‚ ½9ưÀùê¹̃߈«·3uUçôÙ×½ÈƯơٽ߽ƒÙÓ¿‰«‡“ÍjăÁ¥Æ¡ÔÅÓíêµa¦ÔăˆŸ;¨À Û«‚ ½9™s¡Áù×±»Žù׆ڹګ‡“ÍjăˆŸ;ÿÂÇÖëöÛ«‚ ½9ăˆŸ;ºÓ̉ÇÖͪƒˆ÷¼߈ÅĂÙăˆŸ«‡“Íj©¼™Ø™‰kß [ïSï»ÿÚ9¥‡ÅÔÏŧó‰ÔëöăˆŸƒù×Û«‚ ½9ù×É*Û«‚ ½9öưÀÛÚ¾«‡“Íj™ÓæºăˆŸ;éêÏP%ßÖăˆŸ;ÏÔ£ƯÏÔơêÓ¾±»Ơî¿Â߈‚ÑÄëƠÛ«‚ ½9‡ŒăˆŸ;­Åăơü̉­ØÑ̀ÁƯ·¼Í7ÙƠÁ¹Á̉ÛºßÚÅôơê­Ä›¶é¢XÙÚÙÚùêÏÔ±»›¶éëö™‰kß [ïSµØÛ«‚ ½9ĂÙ³Çź‡Çơ»Ù×êöÿ¯¶Á‡é/×:©¼¾ÅñÓî¶«»½Å€ÏÅÁĂ³ôÛºùוŒÙ½Á̉áÓ×Ú¯È߈éêèơÏÅÙÚØ×«‡“ÍjÂâơ ™‰kß [ïS±»™‰kß [ïS¡»‹Ç×¾8¥ÙË%Ö¾í‡ưÁ¼Ôï½ÏŃvÙY½Ăƒv±»ÿ¯¶±»·ÔùꙇĂÈ߈½„Ö߈¹ÚÁ×ÏÔÅÓ·ïÛ«‚ ½9¾Å¸£ïiÑ+±»ăࣉÉ̉•ăˆŸ;Óµơ莫¡¿ºÁ½ó́ÅØÏÔ›‡‡ơêÍƠ™‰kß [ïSÑÓÂÙ“ÈơÔ߈ËÉ9Ù½ÚÇß»ûÄ–›¶éí›Á‡é/×:»Ø‹È‡Ûơ.±»°»ÑÓùº¥ÆÅÓ±»«&ÙÚù×ÎÄ9¥‡³›¾ßÄÙßß«F́Æ×éǶÈăˆŸ;ăˆŸ;ÍË)éÛ9¥½’Æ ™‰kß [ïSƒvù×öívÏÅ™Ô펔%©‡¥2ßëMµ%ׯ›¾±»‡º¯ÈÅØ§ôăàÂƠ÷Úÿ¯¶¾ÇØù×Û>¾ÿÚº½μÙƠéơÛ«‚ ½9Ú×çÚźÙ¹Ú»‡÷‡đ·‹£ä·Åù×ÑÅ‚Úë±»߈Ù×ăà›™‰kß [ïS™‰kß [ïS¢äù׿‰å»߈«‡“Íj½ôëÔÍË)éÛ9¥«ÔµØ±»߈ŸÈµĂëößÄÙƯ‰³Ü§ÓĂÈÁĂù׫»Ở¶ºƠ™‰kß [ïSÛ«‚ ½9ÏÔĂÙ±»È³ºó±ø§Ϻù­ư“ÀƯÍÓÏÅ߈¿‰‹ÇËÉ9±»í„·Ô·&ùê߈•ŒÛ«‚ ½9·ÔĐæ«‡“Íj«ÔÙ½ºÛ§̉ùןÈå̉ ̉̉ßÁá ÅØùêŸ}‡ÚŸ}ûƠöÚ×Ï̉Û¿ôëÚ¨‡¤2€̃êLû(®¾Á̉œÂ¯¨¹ÚáêöŸ³!ËÉ9Ô¾F™‰kß [ïSăˆŸ©‡¥2ßëMûÏÅĂíêúăˆŸˆÏÅ™‰kß [ïSÛ«‚ ½9ÁƯѶå̉ ëÔ‚ö‹Ü¢ÔŃvÿÚÅØñÚÛÛ«‚ ½9ÏÅ¥ˆ]1ăÁơÔù׫‡“Íjùô߈Û«‚ ½9ϼæ½´È ‹Çëö…ôơÔˆ;ÛºWÓµO˜‰j̃ZîSÛ߸ÚöÁơêÅà‹Ü¦ôÖ$ÍÓÂÈÿ¯¶Á¨ºÅØ—¶ƯÓ ù×ßÄÙ̀́ä̉™‰kß [ïSá=¿‰ù×ÓØ¼ôÁÏÔ­Ä™‰kß [ïSψ—¶»‘È©ÓÓºăˆŸ;¾ù×üÓă‘·ÏÔƒÔưÀ9¥‡×ûÓ÷ÁרÙ½©¼ăˆŸ;kµ.¥Ù½È½ÜÓ ëÓ·Ô«‡“ÍjÏ̉µØ×¼߈ùêÓÅŽ¨ÀƠĂĂ‹Ó¡ÁơÔù×ÿÂù×™‰kß [ïSg°» ÅăˆŸ;ÙÚ9¥‡߈Á‡é/×:™ôÑÄ냈½çô–Œ›ÚçÀ¡»Û×›¶é¡ÔĂñíÈÀð»ñÚăˆŸưÀ߈÷ÁgøæµØÏÄ›¶éôêù×ÁÚÛ×åÏÅØƠÄù׫d̃ÁÏÅù×ÁÍË)éÛ9¥ĐÓ™‰kß [ïS™‰kß [ïS‡ºưÀáơ‹Ç‹ÈÀ×ÇÖщ‡ÚÙ-ó¶ƒvÇÖẳăˆŸ;ÇĂíØĂÈ»nï×ăÇÖÛºĂÙ¾(Û«‚ ½9·Ô·ÔÔơ +ÓØ©‡¥2ßëM×$Ï«‡“Íj±»ăơëÓù×óÔƠÓº̃ˆׯ™‰kß [ïSǼIÇÖ¹Ú™‰kß [ïSϹªÚ™‡™‰kß [ïSǼóÂï»8_¤‡_Ö€Ä»ØźíÖÇÖ¡Ô¹Úٽܓ +›¶éÉÀĐӭؽ½€äôÅØ³ăˆŸ÷Áª‡’̀j¥Ó½Ô™Ă»$­Ä‡§Ô«Ó³Èé×á·ƠÏÔơÔËÉ9Á½ƠXëÖÙÚ½¤Ó™Ó·Ô–Ó‡¿đ»¡Á›¶éëöÅñ‡»™‰kß [ïSù×ÏÔùש‡¥2ßëM­Ö®¾öù×ËÇ©¯¾ÏÔƠ“Æ«‡“Íj»Å¯×߈‡ºÿÂùêÙÚÙÚ‚–»€ëå¿ßÄÙ—¾÷Á±»ưÀ³ºóƒ½·ÁÁ¼ëơÔψ›vù×ç½ĂĂ ›­±àéMøêĂŸ}ß»ûr»½ăˆŸ;ÙÚ‹Ü9¥‡Ù½ƒàÁ̉çÏÔ©¼“‚Ă Ù½›¾»½ëö߈ƒv‚v×Âù×ăˆŸ;kĂш¯ó±ëØÅӡȱ»߈ùêï³2ư“çºăˆŸ;ÿÚĂÙăˆŸ;½ưÁÙ׫‡“ÍjĂȬ֫‡“Íj•µ‰­¾à˜Áùêù×ăˆŸ‡Œ¥‰ÍL…mÛ×›¾ïÀĂ¼™‹œ‰¾IơÛ×ÅÓ¡Á¼.ăˆŸ§J߈’¡Èÿ¼ỞƠưˆƒaÅĂƒ«‡“ÍjÙÚÛ«‚ ½9Ù̉ƯÓ Åે“Íj©‡¥2ßëMô꿌Äô߈ëö‹ÙûØ₫ÂĂȽ€‚v߈¡Û—¶âˆÙ½ÏÅ—ˆ§ÆçÚñÓÏÅăˆŸ;½»ĂÙ»‡ŒưÛ«‚ ½9ß»û·Ó ¥0ÿÛ÷4—ˆ£é±¨—¶«‡“Íjăí«‡“ÍjĂÙ¡ÈÓØ߈ǽÔÁË›ÚͽăÁÇ̉Û×ñ¨ĂÙ‚Ư‰¯ØçÚ™ÔçÙÚ·̣ơꙉkß [ïS¹Úß™ªÔ¹ØËÉ9߈Ù׫ۃv釣䙉kß [ïSÏÔß%ơèżëööõaÇÖͼö¡±½Úª‚ +¼9̃„ÿ¯¶Û«‚ ½9ÙÜưÀóĂÑÅËÓƒ½ø…ƠØÅê±›‡¡Ø™‰kß [ïSÁ̉Ù̉ù×ñÓ…Û¹ÚÛº߈‰äơèÅù×Û«‚ ½9Ù×á ÿ×Ù½·ØƠш÷Áë́Ú·Æ©‡¥2ßëMƒvơê—ˆÏÔ»ØÂÓ ÏÔ¾ÙŒë*«Ø›¹ÍÓÿÛç̉󩇥2ßëMÏ̉½€™‰kß [ïS‡Ú½í‡߈åƠÄô¨¼öÛÄӾ߰»ÏÔ±»ăˆŸ;ưÙ›¾ƠÁ̉ăÇíăēȪ‡’̀j§ôª»±»ƠXë×ô½ÙÅëăàß»û“Û‡ŒÍË)éÛ9¥›ÓăˆŸ;¡Á³Èµ‰·‡‘×8ç«ÚéêÁƯÑĂÎÓʹ¶«ÔñˆÅÏáÏÅÁ̉ñŸ}߈ï³2¬ÖĂÓ”ÙŒë*«» Ùש‡¥2ßëM™‰kß [ïSơê±»ăˆŸ;ƒÚËƠöÙ½ÏÔ†ÇÅԋ܃ۣØçÚâÁ-ÏÔÛÚù×µ†ÏÔ­Ä·ÅÇØÛ«‚ ½9Û«‚ ½9ÿZÅà›ÛÅôÏÔµÁƯăˆŸ;߈Ç"ĂÙơÔÑӵس‹™ÓÙ½ƒ¾‘ëÚ¼Ûăà9¥‡µ×ܶô +Ơ—ÓùơÙ½Ăºɇ«‡“Íj«»‚Ô ÍĂå̉ ïÚưÀ߈‹È0­È÷Á÷‡«Ó½ơêçÚËÇĂô¾ºÅĽÈ÷Áƒˆø¿éº±¿ÓØơê¾Û«‚ ½9¶‡Ö8æ©Ø…ÛåĂơêëöëö¯‰¯0öôê¹̃ÏÔ‘ÓƯâËÖ©ˆ·‡‘×8瑾߈°»đÁ ÷Áº…â®Ơ½ôÏ̉Æ¿́«‡“ÍjÏÔíËÇ9¥‡ÿÚ«‡“ÍjÇÁ߈ù×·ÅÈÍË)éÛ9¥χÛ«‚ ½9·Ó ¥0ơê Á÷ÁơỖˆ߈‡ŒÓÖÛ«‚ ½9¡Ô­Ö߈‚Á +™ÓŸÅÑÓÓØßÄÙ÷å5ÓÛ«‚ ½9»½ƒv–¿ä̉  Ă胾‘‹êÁ̉ ‹Ă­ÈÏÔ߈Ă…Ö±»«‡“ÍjÙ½ơêă»±»™‡́$ÍÓùêἿ‰âơÏÔ©º¯Èî½È̉±»ÂáƠÙ½ù×8¤‡ÏÔ߈ŸÖ³Èùë½ÙƠ÷ÚÖÆ$ç½ưÁơÔ«Ơ÷4—¾ù×™‰kß [ïS…¼ă»˹÷Ú·¸µØ›̃”ÈúưÀăàÏÔׯÛ«‚ ½9ÿ§ßf÷Ú̃ˆ˜Á±Ô±»ÍË)éÛ9¥™‰kß [ïSơèÅÑÓ›¹ơÔ¹Úµ†“ƠªĐ±»ăà‡Ă ù×ëöñÚĂÙÿ¯¶߈ÙŒë*«Ơ‰¿I¡ÁŸ\µØÅn©‡¥2ßëMưÀĂÙ߈߈ăˆŸöÁÛ׋ÇÙ½«‡“Íjχ·ÔÏëöùơùöù‡ñÓív«‡“Íj‹ÜăˆŸ;k½€êö™ơ™‰kß [ïS߈×Ơ˜êèäùơψÑÄë¿×¾÷ÁĂ¹©‡¥2ßëMÁƯñÓƒvñíȘÓÉ̉åÁµØµØÇÖï»ï»“Ơ¶  “Æó×ûƠ³Ø‹È™‰kß [ïS‡§ôĂÙÅØĂÙÓºö«‡“Íj½ôƠﻳț¹̀ÓăˆŸỂ §Ôí%·Ôï½å̉ Û×ăˆŸ;öÏÔơê£ä¦ƠÅÔëöºĂ÷ÁưÀ¨ØÙYµ‰ÙŒë*«—¶Ù½ơêÏÅ‘±°êض‡Ö8æĂÈÇ»£Çß*˹ϼÏÔ»‹¹ÚÏÔ߈’÷ÏÔ߈™‰kß [ïSù×§ô&߈§ÔñûØÛ«‚ ½9ăˆŸµa·‡‘×8ç‡ÏÔ½ó¿ëö9¥‡…»Û«‚ ½9́ꙉkß [ïSÁ‡é/×:ÍĂŒ¾˜êèä±»¹ÚÛeø¾÷ß×¾ؽ·ÔׯăˆŸù×™‰kß [ïS«‡“Íjüu»ÅĂºëö½êö…Úçô¿‰¿‰߈éê©Ó£äƠÚª‚ +¼9ưÀµ÷ÓºÑÓƒ¾‘×Óíêù×¾ÿàÑĂƠăà•Ơåçôƒ½ÿ¯¶ưÀ½—³¿™‰kß [ïSÛÚ¹ÚÇÖ¡Ô9¥‡±»„ô›—×ÛÓÁŸÅ߈˜‰j̃ZîSù×´†‹Üó¸£X¹Ú’ȃv߈™‰kß [ïS½”%«dÙŒë*«ĂÈ߈Á‡é/×:•Èû›Ïœ¿ơ꛾‡Œ½å½±»ÅÄ©ÇÅäôá 匿N¶  ÷ÁÇÖ™‡ơ»Û¿¹¡È±½¯făêÓºƠñÁµØîôº›¾œ‰¾Iùץƣ ߈ù×ÂȽ€ơ꫇“Íj¼ »ĂÙ×ĂÙÏÔƠá ù׫Ôơ»½Á•%Ïŵأ䖾߈¤Ó™‰kß [ïS±»…ö9¥‡¢È*½½ÔÁ %Ở߈¹ÚÙÜ9¥‡Å›¾« ©ƒ»5ƠXÀ¹ñÓçÔ¡Ë̉‰¿ỊŒEÙŒë*«À‡€è/Ö:Û¿‡Ç“ºû(›¾ĂÙÅØáØɇĂÙ¸Ú†“å̉ ½«ÑíØÙ½¢ÇÛÔ·‹ù׆¶èô߈¥‰ÍL…%«·3uUƒvÇÜËÖ¿ßĂÙ«ÔѶ»Áùç¯8¤‡ÅØÿÚá¬ÏÔ–»µ¡Ơº­ơêǼ¿‰ơÔ‰¿I½·ôéêш‡ºÔXÛ«‚ ½9ùꕌ£H‡ºƒˆùש¼÷ˆ·Ôö߈‡Æ»¥Ç˜‰j̃ZîS¹Úù×±½ù×ù׽뙉kß [ïSÛ××¾ÙÚ³ỮŒÚ,÷‡¿º¾£ØăÇíµØç½Å»´ÈË̉™‡ÿ¯¶¶‰à€ºĂ½™ÔëÔÑĂëö±»®ÈÍÄÚÉĂ߈°¿ëÔăˆŸ;k‹Çù×¹½›¡åĂưÀ߈ƠÅÛ«‚ ½9ÁæêöÍƠ¡ÔëöÛ׿߷̃đ»ăº̉̉«‡“Íj§ôĐØÓµOíÆñÖ›¶é‡ß›¶éÙÚù×Û«‚ ½9ù×ÙÚÏÅÓ½±óÁÓÏÅ¿ÚăˆŸ;ăê±»߈éꃾ‘øê¾¹˜‰j̃ZîS…Ô«Ô߈³%Â’‰2Ô,ø…ô±»¹Ú™‡ÏÅÍÓÙY¿ØË̉ÑöÁ±»÷ÁÏÄưÀ›¾©ƯÓ ù×£äñÆÎÔ“½±Á߈Úª‚ +¼9Ö”Ô†”6”¦j”±»­ÄרÙƠßÁùêăˆŸ;k‚½‡ñ5ăàỖ»ú½ư‡±ù1±¿₫®¶½à=±»ŸÖÙ½ªÛ Ë¿ù׸ڷ ËÜëö¥‰ÍL…ëöĂôƒvƒvÁ|‡xᬩØÑ·Á…êºÍÿ¿ô›Ă§¹‡Çͪ̉Æëö‡ºƒvùÏÄ›¾ÓáƠĂº™‰kß [ïS©¿‰ăˆŸ;óÓ¾ĐÄê߈á=±ëØÎ9¥‡¾ÅÛ«‚ ½9ơê«Ñ½߈ÑØù×ÏÔÛ«‚ ½9ËƠù‡ăै]1™‰kß [ïS‡9ăˆŸ‡¿‡d«ÔĐÄê9¥‡¡Ç©°ƒ×™‰kß [ïSÿ&çÚ˜½™‰kß [ïS«ÚơÄï½¸Ú ±»9¥‡…»ÙÚ±»©Úª&¶‡Ö8æϹׯ‹¿ơê„ +ăˆŸ;Ù½¶ÔÁ½üÀ µƠÙY°»ùêơèÅ³à›¾Û«‚ ½9ù׉ºù×½§Ó¹ÚµØăÁ±½½^Á̉ơꆌœ(¯G‹ø߈߈χÎÔ¾,í‡ÑØ—Ó§ôăˆŸ;ö߈ñÆ߈ÓØ¶èíêÊÓƒˆ™‰kß [ïSï»ÏÔ¿à±»Úª‚ +¼9߈‡Œؽ÷Ú÷ÚÜÚçÚÔ»÷ˆÁƯ¾Ç—Öáê±»9¥‡©Ơ½ùד±»ÿÂÏÔÑÓåÁ߈¾ăˆŸ;±»³”ÏÔ‰¿I‹ÇĂĂÓÓå»®¼“ÆÛºưÀívÿ¯¶Ơψ»ôؽƠX”{·‹Á¼̀Óä̉ÓÅ«ÑçÚ‹ÜϹăˆŸ“º±»Ë̉ÇăˆŸù×ÑÓƒÔ™‰kß [ïSçÚù×°»ÑÓÙ½ÿ¯¶µß߈“Æ—»­ÄÛ«‚ ½9‹ëĂÙ™°êØ×Ă¿ºÏÔÀ̉ËÉ9ơؽӺ¬¾ĐĂáÅÎÔÆëöÛÄÓÛ«‡“Íj¹đä̉³¯×±»¥½Á½ă»±»ÍăÏŰ» +̀ĂÅéÚƼéÚÅ¡Ûăà«÷Û«‚ ½9—ˆ™‰kß [ïS™‰kß [ïS¼£äĐÓ«‡“ÍjÙ½ÍË)éÛ9¥‡ŒÁƯ™‡Ǻï¶µ¤ÇĂªŒ±»§ÆƒÔøêăÂå̉ —»êöß ûØÍÓØÓ—»ƠCϺ±»ˆ«Œ±»¹ÚÍÄëöëöÛט‰j̃ZîS±ëØÁ¼›¾ÂÙŽ™‰kß [ïS÷ÁÛ«‚ ½9ËÉ9©½›¾³ôî»9¥‡±»ÏÅÅØ®GøÖ¾ÑÓ°»œ‡öùÚÛ«‚ ½9½€ù×ăàù׫ºù껽˜‰j̃ZîS³]ÙÚ£ƠÙÚơꯥ́Û×̣º«»“ƠƠçô®ÓưÀð»…Û¿»±ëØ›¾ăˆŸăˆŸ«â±Èî½ù굆ÏÔÏÅ™‰kß [ïSø§ÓÁƯﻎϙ‡ív5Ÿ}ƒv¹Ú‡çÚÏ̉ívĂȆڋÈăÇí°¿©¼çóÓ¡Èœ· ̉ ¤0 Úª‚ +¼9›¶é¿ØgÛ«‚ ½9±»øÛºÏïÑÓÿÇØ×å̉ ¹Ú凋ӓƠ•Œ›¶éù×ÏÔ߈½Ù½·Æщ³(±»‡ÇƒÔÓÅ«‡“Íj—º—¶ëö¡ÛÍ훾‡À +·̣ñÖ·ÜîÀ™‰kß [ïS·‡‘×8çå̉ ÏÄ₫®¶µØ¹ÚŸç£äƒÖÛơĺ»—¶Úª‚ +¼9ÑÓƠÍĂëƠU™‰kß [ïSö¥÷™‰kß [ïSưÀÑÓ½Åà™‰kß [ïSÏÔÁÚăÇíÿÛ¹.ëöÛ«‚ ½9¶èÍÓ½¶ä̉߈ù¾³ÏÔ›¡öø €Ơ­Ä×Ó™Ô×Ơƒ¾‘¡Ô½Á‡Ç9¥‡×ÍĂÍÄÙÚ©‡¥2ßëMÅØ¥ÁÛºÇóƒvưÀ‹Ó¡Ôö¯ñỞƒˆơèÅơêá¼³ ÎÅÙ½±¿™‰kß [ïSưÀ›¾“ÈÓ¼‹ÇăˆŸ;ëöÓÀƯ+ëöáØŸÈÀƯÿÚ½€ÙÚÙÚœÂ÷Á̃ˆ¿‰Ơm©Ç™ơ±¿›Ú9¥‡ÏŹÚí¾Ë̉ÑÓ¡ÛÄÔÍÓÑĂ—¶›¶é廽÷Á÷‡ÏÔ­Èùå‡Ç­¾ëăˆŸ£XÍĂå¼ àƠ©ÜÍÇơéÛ«‚ ½9ÑÄë“Æå̉ ËÉ9•Œ½óÁƯß»û‡ÛĂÙå̉ ¡Á°»ëöå×âàơ»̉ñÚ•éÓÆÛÀà=‹È“ƠÔÚ›¾Á‡é/×:ĂĂÛ«‚ ½9ÇÓÁ¼™‰kß [ïSưÀæôăˆŸ;8¤‡Á|™‡ÁƯùê½̃ŒÚ,½߈Ǽù×dÛ«‚ ½9ÛÀ¹¶9¥‡ÏŬ¼¼ơêƒàÇÖª‡’̀j™‰kß [ïS“È—ºù׿º¡Ơ«‡“Íj¥Á·ÔœÜù×ÍÛ×Ơч›ÚËÇ«×̣£E­ÄͼöÑĂù·«‡“Íj±»µØùêÏÔăˆŸ½…»ëÚª‡’̀jéơªÓï½ÁƯÏÅơêù×¶ÔÓÆ¹ÚƒÖÏÔµØæÚ¡Ô˜‰j̃ZîS¡Û‡xéꀺÇ̉ÑŒ¹Úø× Û«‚ ½9߈Û«‚ ½9Ư™Ø›ÚăˆŸ;ù×™‡±»·̣œ·̉ ¤0ëöȣرk«‡“ÍjÚª‚ +¼9™‰kß [ïS’‰2Ô,øÓÅÅô›¾³È߈Đ¹¨ùêٽ퇛¾‡ºïƠÍÓà¼߈«ÔǦ‡Œ×Ùù×çÚÂÙ‡ŒÏÚÓ̉ĂÙ¿ßå»±»±»ö߈ù×9¥‡·‹₫ÇăˆŸå̉ °»ÙÚĐØ …ØÏÔ‰¿I±»ÍÓ™‰kß [ïS¡È̉ƶ¿́ñÓ£XÏÔ·‹µØÿ¯¶±»È̉ +€Ä̃ÅĂ¥ÛÏ難“ÍjÆëöÅ»¿‰›ÚĂô¹ÁĐÅÍÓó#½ơêÚÀ«™ëéå¹Ú™‰kß [ïS·Å™‡ù×™‡Ç×ÿÚĂÈ—¶°¿ÎÔĂÙ¥ˆ]1…q¿Å߈™‡±»ÄÓº½¡ÁĂÙ™Ó«·3uUóªÚôê§ÖÚª‚ +¼9ƒv·Ó ¥0ÏÅÇÖÙÚĂƠÇĂñÓöÁYψÛ«‚ ½9YµßÏÄ9¥‡§ £Çƒ½Û«‚ ½9›¾«‡“Íjß»û¹ÚÉÛ«‚ ½9ăà¦Ó߈߈¬ÙƒˆƒØë±˜‰j̃ZîSÁn•Ưư“¥ÛÛ«‚ ½9ª́—¶ï‰µØñÁ±»ä̉ĺ¾¥Óùꩇ¥2ßëMÛ«‚ ½9σ½†×&ëö¡Ó߈¡\·‡‘×8燺«‡“Íjó™‰kß [ïS×Ơ½ÜÆ¡Ô÷î·Â´%¹óöí‡àÅ̃ˆƒvÏÔ¹Ú÷ÚØÅêëöÇ̉±»·Ø›¾ùôơĂăˆŸ;‹Ü$µÁßÁ©ÜơÄ«‡“ÍjçôçÚÏÛ«‚ ½9ưÀ¡Ô¹Ú̃»ú¥¾›vëö»Ø¯¼ưÀơêÏÔ“‹ÿÚ°”ÿ¯¶Ù½˜‡Ÿ’–¶¡%ñÖŸ\ÏÔëöƒÔù׬ԥÂí—G—ˆ‡ÇƒØ̀Ê)èÛ8¤ÁÏ̉ ÇøêѶå̉ ¿‰߈ÿ¯¶‹Èƒùê‹Ûïi¤ÆơĂ×Óù×ÁƯ™ëéå±»ÿÚñ¬Ù×ÁÙ½¿‰ù×ÍÓ߈× Û«‚ ½9™‰kß [ïS¼³ƠÏÅö°»9¥‡áˆÁ0q±¿ă໼‘·ÔÏ̉ÍË)éÛ9¥ëÚÇÖר¿¹êöóǧƠăà«âù×Ẳ‚Ǽ¹Ú¡ÔâˆÅԥ؉ı»‹ÇÁƯÇôƯÓ ù׽† ĂÙÏÅù׫âÓÆăˆŸ;kؼ ơÔÏĽ«‡“Íjǽơêù×±¿í—Gÿ¯¶Åӕۣȼ̣ÇÙ×¼ ÏÔÛ«‚ ½9÷ÙÙÚ‹ÜưÀƯỤ̈Ǚן}ƒÖÛ«‚ ½9Ÿ}ÑÓèê÷ÚôÿÛÑÓĐÅ ùô«‡“Íj±ëؾ½“¹ƯN™‰kß [ïS°»½¾‡·‡‘×8çñÁÓØăˆŸ;kƒvÚטÁ ˜ơÅÓ»½Ù½Óº‡ ߈™‰kß [ïS—¶Đđ©Ø–¾±½«‡“Íjÿ¯¶߈‡©Ç’ÆÏÔêơ©Çƒ½ÍÓÏūԽ¡Çщ½·‡‘×8ç•̃ơعڕÜ÷Á¡Ô9¥‡öªÓ½€Û«‚ ½9߈ơØŸƠå̉ ½€“ÈĂ¹Ú˜‡«‡“Íj†½ÄÓ̀Ê)èÛ8¤©&«ÚĂÈË̉8¤‡†đ5‰ÛÑØơ$ëö¢Ç·Å½‚¾ßæăˆŸ;kÿ¯¶›¾öÁ»½º•́ƒ½½øêׯÖĂƒÖ±»ö÷Á¿‰ñÖï‡ĂÙñíÈ‹ÙÏ̉ăˆŸ;ơꃽ»Ăï½Û«‚ ½9¯ƒßͯ¥'=U#QK¯ÂăàÁ̉˜ ê è ä Ơ¾9¥‡µØÛ׫‡“Íj³Â¿‰§ô™‰kß [ïS­€ä‰ÍË)éÛ9¥ëöÛ«‚ ½9«»«‡“Íjù꿺ÙÚ%ÇÖ©‡¥2ßëM‡Œ«‡“ÍjăˆŸÚÀôƒåƒvâơ°»›ºívÏÔ¶èƒv߈ù¿·Å‡ÛÙ½9¥‡«‡“ÍjñÓ›v•½­Ô«‡“Íj˜Á“¹ƯN“¿́ÙÚÑÛYϼÛå̉ Ƙ‰j̃ZîSƠ™ÛÓØÅÔÅÔíÆ²×ÑĂáÛăˆŸ;›ëöƠHƒv9¥‡×ùן¹±»™‡¸™ºÙ½™‰kß [ïS«ÔŸ}«‡“Íj›¾щ»y±»±ÁâˆÙÚĂÙĂÓ̉̉ +·ÔÿÚ‡ßưÀÛÀ÷Ùâơƒvëö¡»ăˆŸͼ«»Ó¼ÎîïƠĂÙÉ»àÛ«‚ ½9±»ÉÖơÔ«·3uU8¤‡ÚÀ±»Á½‡ºëöר±»½€¹¢ÖÆ™‰kß [ïSÙŒë*«¿»‹ÇÑUéêÿÚÊóDZ»›¾›¶éÏÔưÀ‹Óù×ăˆŸ;ù×ÿÚ¹ÙÚ‰ÛÛÄÓ³ÈăˆŸ;±»­ÄăàöÁưÀßÖÛ«‚ ½9™½ßÁÍ­HûÚÿ¯¶ÏÅïÀơèÅí—Gù×Û«‚ ½9™‰kß [ïSÿ¯¶ÍÓƯơùשÓÑÓ9¥‡·¸Ö¼ăˆŸơÔƒ½ÁÉ̉¸à ½€ƯÓ ¹ÚôÔ°»̀Õװ»ĐÄaêa‡ºÁƯÙ½™‰kß [ïSÙ̉£Çù׫Ա½ĂÙ«»Ž‰¿IÛ«‚ ½9ĂÙ£»ƒˆ‚v É(™‡ƒvÁĂ½º™‰kß [ïSÏÔÏÅØóĂœ‡çÚÑÄëÛ«‚ ½9ëö«‡“Íj¿ôù×Û«‚ ½9רÓƠÙƠÙ×ϼ½µØÅôźƒÚïƠùëĂ¼ẨùêרÛ«‚ ½9߈™‰kß [ïSƒvû(ÿÚÛ«‚ ½9›¾«‡“Íjéڑȧôù׫»‹ÜªÚñÖ™‰kß [ïS¡Ç®Gø£äÔXëöïiÿÛ¹Ú̃ˆ̃ˆÛ½ª»ß»ûÙÚߌÛ,ÀĂ½…€­:ö¡å̉ ŽËÉ9§Ô¡ÁÛÀ¥ÛÁËâà,ÛÆ‘®Û«‚ ½9„b«‡“Íjƒ½›¾ƒˆ£äưÀ%åĂ«‡“Íj±»±»½±»8¤‡×³ ƒ¾‘ĂÙÛ«‚ ½9Ù½ƯÓ ÂÙ…ẪÚñÓ‰¿I™ôŸÈƒvû̉ÇĂ…ÛÛºåµăˆŸÑ^ß߈«»ûÓ·‡‘×8瘉j̃ZîS̀Ó±»¿¹ÈºÀĂ½€ăˆŸ‹ÙÍÓßÚ³7›¡½¾¹x±»߈ÑáưÀ†äëö³Æ«‡“ÍjûØж›¹«ÔƯÓ ³ºó9¥‡ö½ô9¥‡ÏÄĂÈÙÚÏű»ºù×Ñ·߈ŸÛ˜‰j̃ZîS‰¤±»«ÔÉÅ™‡ÿÚÏÄ™‰kß [ïS€º°»§¹ñ~¡ÁĂÙƠŸÖ…¶á °»ÄÏÔÅØ™‰kß [ïS±»©‡¥2ßëMù¿½ÏÅ·Ó ¥0©‡¥2ßëM™‰kß [ïS³Æ±»°»ù×½ÙŒë*«ç$©‡¥2ßëM÷Á›¾‹ÜơêÅØ‚½Áđ¹%˜ %÷Á߈ăˆŸ;ơêßÖƒ¾‘éŒëöñÙ¹ØöơèÅÿ+Á½ỔÛ«‚ ½9¡«÷Ù±»ÉÍ߈÷‡ưÀÛ«‚ ½9‹́ùê²Ø ©&®ÓơèÅ߈±»Ó­Äâà‹Ç›‡ƒv±»Ù½ºÙ±ë™Hơê¥Ø©‡¥2ßëM«·3uU™ơå̉ ½Öƒv™‰kß [ïS­¾½ö÷ÚÇØ“Ơ‡9›»öÏÔׯ[©Øáؽ¡™‰kß [ïSŽƠëöƒv£äù×ßÚǺ’ÇÔ¾F¸ÚëÓÁ£¹Ú߈ËÓ߈±»½€‰q9¥‡Ă©‡¥2ßëM‰ÁöÍË)éÛ9¥ÂĂ¹Ú°»¥‰ÍL…Å·«‡“ÍjÛ«‚ ½9Ï̉Û«‚ ½9å×¹ÚÛº·¼Í7·̣•Èû›ÄÔÏÔ¯¾ËÉ9ẳÏ|™̣Ă›ó¶Ô܆×g½Üëö·̃«‡“Íj±”¼ôơêĂƯ‰ˆóÇ«ÔĂÙ›¹íÅ߈—¶µØÈ̉¿ß´‰¾ï³2å̉ ߈̃ÄØÑÓ›Ă·Ô³Èéꙉkß [ïSËÉ9ăˆŸ™‡ǺÙÓ™‰kß [ïSÂÙ߈Û«‚ ½9—»›·¸«»ÛºÎÔƠX‘bư‡±ù1߈ëöíËíꃾ‘öÁׯù¿ơèÅĂÙå̉ “Ơ¿º¡Û«»½ŸÅ8¤‡°»á “ÆÏž۫‚ ½9ÂƠºÁ½ñÓ‚ÅØå̉ ·ÔµØÑÓ±»ù¿‘Èù׫‡“Íj¹Ú¹ÚƠX‡º‡Ú“Èŵ«‡“Íj߈ĂĂăˆŸ· ›¾±»̉¼™‰kß [ïS½öÛ×ÍË)éÛ9¥ÏÔ©¼ïé¯ĂÈ•Œ§ÓÛÀóǵ†ÁƯרù×Û«‚ ½9ƯºçÚ¹Úö¡»߈‹ÇÙÚ¿»ùëÑ̃Ç÷ÁíÖ£Ư»yß»û¶  ³ÈÜ‹ÎÛ¹Ú߈Ù×–ÀĂÙĂ›¾Ơëö×¾8«‡“Íj™‰kß [ïS°»ÎÅ«‡“ÍjÙÜ™‰kß [ïSÅô«»̣Ä߈ö‡x™‰kß [ïS‡Úívá=¡ÁÓØûÓ·̣ẳ­Ô÷$ëöôêñíȱ»·Ø‹ø¡Û™‡í–GívŒÓ»²߈«‡“Íj§ß È±»ưÀ·‡‘×8çÏŧԫÔ߈—ÓơÔ»ØơêùדƠơê¢Ç¶è±»×$ö™‡ÙÚ±¡¹Á×Üç?ÏÔ„Çœ·̉ ¤0ƒvăˆŸ;ëö±»I¾ëÓèêÇÖ«ÔÛ×­v«Ú½ëỊ́«‡“ÍjĂƒˆĂÙßÄÙùêÏÔÏÅÏÄ@ ÍUËÖăơÉ̉¥Û—Ó߈ÔßÁ«‡“ÍjơĂéÓ¹Ú¼Üù×±»ùôóÂưˆ·ÔåĂÁƯ…Ø߈ăƯ³ùר£Ø¥ĂƠơĂĂ ›­±àéM¡óÑÓÈĂ ™‰kß [ïS¡ÛĂÈơêgơèÅ›ƠưÀ/ĂƠăˆŸ;‹ÜĂÛ«‚ ½9Û«‚ ½9‡ºƒv·‡‘×8çơê¡È™‰kß [ïS³ºó£äÍǹڵ†óט‰j̃ZîSÅØ‹Çùêƒvơ»©‡¥2ßëM“÷ÁÿÔ½Û«‚ ½9±ëØÇÖ˜‰j̃ZîSÓˆ•=‘äôÛ«‚ ½9ÈÔụ̂ăˆŸ‡“ÓØá˜±»߈ăˆŸ;k%߈ÏÅ̃ˆ›»çfµØ›¾·‹Û«‚ ½9ÉăàñÚĂăˆŸ;ç̉™ơÇÖ“º½Ă‡Û¿‰öüÀñÚ«»ÏÔ±¿ºñïÚ9¥‡µØ߈÷‡©%ÀƯ»Û«‚ ½9ƒăơ‡x×̉¥Ö†“ «‡“Íj³¾Û«‚ ½9ÏÅ¡ÇưÀÛ«‚ ½9ÍB÷Áơê8 ¤‡ ÖÔX«‡“Íj³ÓÆÛ«‚ ½9ƒv½€ù×¾¾Ù½ßÏÅ߈´Ă©ƠÅĨº™‰kß [ïS™‰kß [ïSđÙăíÁæŸÖƠµù×™º÷Áă½¤Å)󽙇ª‡’̀jƠ¾ëöÙ×ƯÀ‹È¡ÈÇÅÓϺơÔ³¤ÂÇ%ÑÄëÁ̉œ‡Ï­ÓØÛרщùן}ûÙ½ïƠéÚÂÙ8¤‡×ù×ù׃ˆƒv¹Ú«‡“Íj™Ó÷ˆñÚívÏÔ½%ÓØ—¶Ù½Ù×™‰kß [ïSª‡’̀j‡Ưâă»ˆ½½ùêÛº₫®¶ßÄÙ̀Ơƒ½̣Ô½±¿ÍË)éÛ9¥½ôóÂëö™ëéå¦ÈĂÙ³(§ÔÅô‚v +êö¢äÁ¼™ÔÛ«‚ ½9×¾Ú×±Áí—Gëö9¥‡ĂÙÁ¾åŒ¿N… 9¥‡̀ǾƠƠ͡ǹÚ%•Ü™‰kß [ïS̃ˆ¥Æ Á“ܫԃvß„߈ÁƯĂ‘ơ±»¿¡ÔƒvÛ«‚ ½9ÙÚÑÓ«»ÿÛg«‡“ÍjÛ«‚ ½9Ú¹߈º½€±»åŒ¿Nơ‡¡\ëơ£»­½¼߈¾Œº¼Ô߈‰¿IëÔđÖ‡ÚÏ̉ÏÔ¥ÈÓ̉…÷å5ÓŸ«‡“Íjÿ×÷Ôç̃Û«‚ ½9ÛöƒˆÉĂ«‡“ÍjÔX”±»½«‡“Íj9¥‡«Ố–G¤Ç¿ôŸ}«‡“Íjëö¹Úưg«‡“ÍjăˆŸ;µĂ€Ä½ÎŽ€¥ÖĂÙíÆăÁ‰¿IؽÜ«¿ß«·3uUÚǃ©‡¥2ßëM©‡¥2ßëM÷Ú™‡˜êèäô›¾ëöù×›¾Ù½•ÜÅÖ¼›¾‡xƒÚ¡uµa¯G‹øß¹É¥ÏăˆŸ;kó¶­)¦È‡Œơêë‡°êØ™Á­Ä¶¾ ë±ăˆŸ·ÛÙ½ưÀ¡ăˆŸ;ÿ„ëöœ‡ɇ˜‰j̃ZîSÏÔ«Ô߈ëöµÏỞƒˆơơ¸ÚÈ̉Û¿ÅóÇ­ÄçÚ߈«»Á½߈—ˆ“¼Ơ¼‡Ç«‡“ÍjåÁăàÏԥȃv…Ơ¾ºǽ̃ˆß»ûÙÅë›ÚáêÅ1É̉9¥‡•ÓÅÔù¿›¡ψđÄ‚v´À«ÚĽ‹ÜÚÀ°»Ù½߈߈ÇÖăˆŸơÔívå̉ é‡ï½›¾ºëö¹Ú‰¿Iû©‡¥2ßëMùר؋ǫÔÛ«‚ ½9ÍĂ¼©Ó¥ ­ÖÛºÇƯ÷Á“âíêă½ÙÚ›¾ËÖ»ôăˆŸå»ăˆŸ—¾ơÔưíÛ«‚ ½9ñÖù׃v”îĂƠ“Ơù×Á̉±»ÙÚ®¾ ­Äù×±»“Ơå×Y¹Û™'ƒvø×ßÚщÙ½ù×ÏÔûÓÙ½Ù×½ôù×éÚ­ÖÏ̉³È±¿ù×ÅÓç̉³(­Öù׋ÇăàăˆŸÓÅå̉ «‡“Íj­€¿½öĐÓº߈G½¹Æ»½‡“÷å5Óív¿²¾ ̉¼¡È«)çôÑÄëÏÅŸÅÙÚ…àơêƠXƒv‘ÔëƠUöÁ ĂÙỞ“Èơêåɱ»߈ÙƠÄô߈›¾©ÇÓº«߈›¾»¹·Ô±»›¶é÷ÁÈ̉ÿ¯¶°È +ỞÏ̉ວ¹÷Á½ôăÇí±»½™×­Ô›¾߈ù×9¥‡Ü÷Áâˆ;߈#×¾×ÜÛ×ëö³ ·ÈÁËûÏ؉j̃ZîS«‡“ÍjØÑ…Ơ«Ôù×ÜßơÓº«ÔơÄÛ«‚ ½9«·3uU9¥‡ĐÓ–¶»ØăˆŸơư¨È­Ré½ÔÔơ‹g¦ô‡ÅÓ‡Œ—Ø«‡“ÍjщËÉ9߈ăˆŸ;™‰kß [ïSăˆŸ;߈ù×Óº§Ó߈µ‰±ÁÛ«‚ ½9Ù½é‡ïàçêöƯÓ §à·ØưÀßÚºר¿‰߈£»‹ÈÅÓßÄÙ‹£©Ó¾¥ˆ]1ÅÏƯܺ—¶˜‰j̃ZîS‹Ü߈ϱơê§Æ™‰kß [ïS¿Å“Ơ¯ÈÉĂºy±»ơèÅßáÅ»§ÓËÖÏÅ»½çÚßÖÏ̉¶  ³¹ÚăˆŸ;kçđ¢äö±»¹£Ơü¡È™‰kß [ïS—ˆͼ¨ØưÀưÚ÷ˆׯưÀÿ¯¶‡×åô½×Ơ™°»ÏũӋܡÁÿ×ÇÖù×Á€Ơù×ù×´ØÅÓ£ØßÄÙ«‡“ÍjÎ Úª‚ +¼9ăˆŸÆĂÙßá=ĂÙ±¿“ƧÓƯº»ØíêµÜ˜‰j̃ZîSå̉ ª»߈›¾‹ÇÏÄ×¾×Ó‰¿IÆ_™‰kß [ïSŽ«ÔÏÄÏ̉ăˆŸ߈›¹ÎÅŸ}µØéÚö©ÜŸå̉ Û«‚ ½9§ºù×ç̃¯È«‡“Íj9¥‡©‡¥2ßëMëöèêéÔ÷Ù¼ÔɹÅÓÎ̉ù×÷¼±»÷Áר·‡‘×8çüÅăˆŸ—»ÑÓÙ½ĐĂ߈Ç»™ëéåÑÓ¹Ú÷‡—Ó‰·‡‘×8ç½—¶™‹üÁ«‡“ÍjƠ“±”ùבÛĂƠå̉ ¹Ú“ÈĂ ëö©¿Ở—ˆơÔ߈³È™‰kß [ïSù×µơï»̣©½’‰2Ô,ø›¾—ÓؽŸÅß»û—»¡ÔßûơÔ½€÷ˆÙ½©ÇÁË»ˆ¾±»Ù‡Ï9…ưÁƠ™‰kß [ïSù×®¼Û«‚ ½9û(§Óÿ¶±»ôÖĂ™‰kß [ïS™‰kß [ïSÂĂƒvëöñÚăˆŸñƃˆ9¥‡¥ºÏÔ·‡‘×8ç×Ơ†7§j§½߈ר½ÔƠX¡»·ÔăˆŸçÚ¹Ú¦ô«»“ººœ‡·Ô¬Ö3âˆ:¾ÙÚÛÅØˆđ™‡ÙÚ§ÓƠ…­Ø…¾ûñÓ‘gÏÔơÔ›¶é¡Û™‰kß [ïS½ß»û³ƒv›¾߈ÊÖÚÑæ¥øƒvÏÅÛ«‚ ½9áêƯÓ å̉ »yƒÖƠ‰Û̉ÅƯÓ —ˆĂƠÙ›ÚơÄÓÓù×gŒƯ ëö—¾ÍË)éÛ9¥¯Èî²2;öÁù׫Óêö‚ÏÔÏÔăˆŸ;©À­Äù×øêÂăˆŸ;k½ÿ¯¶ĂØ߈̣ÇÛ«‚ ½9‡Û¹Ú¡Ô±»Ü©vÀ̉£Ç«Ô¿‰§ÔĂÙßÄÙ›¾ªÚ‡¹ÚÓÅϺ«ÚÛ«‚ ½9íÆ¯×¹Ú¿‰ív9¥‡/ñÓ£äß»û‰¿I±»щ™‰kß [ïSϺ۫‚ ½9߈ÏÔ‹ÈăˆŸ„¢­ÏÔ߈ĂȓǕ֪»Î̉ªÚÏ̉箋ǢäÑÓÏÔÙÓû’éÓÓàÙÓ­Ä›»½ÿ¯¶—Ó“Ơß½8¤‡ÖƒÔưˆ»ØñÓ‚v§Ô«‡“ÍjYÂàê›¶éùëÿÚƯÓ …Øăà¿çêöÚª‚ +¼9ÑĂÛ«‚ ½9ƒàÿÜ»Ó÷ÁÁ̉¿‘Æ«Ô߈ƒv¡È½ÔßÄÙÛ«‚ ½9Á×·‡‘×8çÛ×Á½™‰kß [ïS‘Úù¿ï½çÚׯ¡ÔÑÄëơé§Ôß9¥‡ƠÄĂÙ™‰kß [ïS„ô¢äá ™‰kß [ïSχ·‡‘×8ç߈ëöêÔÏŪ»ûÁëö‹Ç±»Ơ¾G¿‰÷Ô߈ơÄăˆŸù×ñ(“Ȱ»±»ÅÓ™Ó™ëéå­ÄéÓăˆŸ;k¬Öç‘ÁƯܨØåĂÚ÷Ú±»ñà÷ÚăˆŸ;Ă¼÷¶á ơÔ¯̀÷ÁÙ½ÏÔÊÁ‹Ç¥ˆ]1±¿±»ơêĂÆ³ÈY±»ĂÙß»û«‡“ÍjöÇÖ½Ï̉ÇÖ‰Û½€ÏÔÍË)éÛ9¥ƒˆ½ÁÏÄ«Ôù׫‡“Íj™Ó™‰kß [ïSÍ·‡‘×8çÉÖÙ½³ïÙÜϼ¾«»ƒˆƠÅÄơê»Óö®é +¹Úï½ñÚ«‡“ÍjăˆŸ;kª»½Ÿ ±»ù¿ÛׇºÛÀÙŒë*«™‰kß [ïS¥È“ÈÀƯ¿çµØ™‡—¹ăˆŸÂÓµØÅÓ«‡“ÍjÅô‡Û«‡“Íj¸ÚÛÀ™‰kß [ïSÏÔĐæµØéêÛ«‚ ½9Ơ“ȱ»‚v“Ơ¹ÚĂô¿—ˆéÚ—ÓƠX·̣ưÀå̉ ½ù×ÄĂ¯ÈƒÚ°»ív·Ô°»ÙÅëƒv8¤‡Öƒ¾‘±»ô§Ó±»‘«ăˆŸ;ơžµØÏÔƒv«‡“ÍjÏ̉·ÔÛÄÓÍĂá=›Ù‡Œ8¤‡×÷Ú­Ä™‡Ö©‡¥2ßëM“ÈÇÖÁÓùêϼÿگȃvơêñÚ­Å™‡«‡“ÍjÅÄÇÖ߈ßÄÙYÛ«‚ ½9¡È×¢ĐÓµaƒÔÍÓ¾¾«‡“Íj«»̀ÓÏ̉ƒÖ—»Á‡é/×:³û—Óæº +χ‡“9¥‡ÏÔĺÁ‡é/×:“ÆßÁ±»ñă¿ô©‡¥2ßëMÛ«‚ ½9Ïá¹ê³ØÏ̉~9¥‡™‰kß [ïSÛ«‚ ½9ÅÔÅØù×­¡Ç߈ÙÅë9¥‡Ž¼ơ鉿I™‡Ù½̃±»ͺđù×çÚ“Æ¥ºưÀÍË)éÛ9¥™‰kß [ïS‚vŽƠûƒˆÏÔ·Ôû̉âÂ3ÙŒë*«½­¾ëö©)ïƠăơơĂí¥̣ĂÏÔíÆ÷‡É6ó›¾·‡‘×8ç½€ßÚ»ăˆŸ;›¾™‰kß [ïSÓ½¥Ư†Ç9¥‡ăˆŸ;¯d·‹ĂĂ©½à ß÷ׯ廫d¿^ưÀ½ôó½€ï³2½·Ô«‡“Íj¡жÙ½é‡èÔ‰Ôơ»ÇÅÙëöóDZ¿«‡“Íjg«ÔÙ½•¾ÇÖ†ºưÚăˆŸ;ăˆŸ;©¼™‡†Ç¿ß›¾ª»Ù½…ÔµØÁƯí‡ÛÀ±»ñÓù×™ÓÀơ½ÎÅׯËÇùê8¤‡—¶–¶¡Èହ̃¯ …£­øơù×ăˆŸÇ%¡È߈‹v½ƒv±¿9¥‡Û«‚ ½9«Ô¹ÚÛ«‚ ½9Û«‚ ½9œ‰¾I¡‘÷Ơ«‡“ÍjÏÅĂÏÅôĂ£ä©¼ÅØ‚vщ‹̀ëöº«‡“ÍjØ ¡àÏÔƒv8¤‡»ØØÚĂÈŸ}ñÚɇ߈ă»ÑÓ«‡“Íj¤ˆ\0ÅØ‚Úé‡Åƒv˜ơÎÅ“º¡ÔÆÅÅØÙÚרÑĂ߈¸Ú9¥‡™Áォ´†«¥ØùôÁĂíêó*á ƒv÷$ËíÖ™ëéåßÁÛ«‚ ½9ĂÈÏ߻ƒvÿÂïکdžºƒåº©ÀË[±»Έ®¼¾™‰kß [ïSư¨ÏÅ5߈¾¹½ÛÄÓ²ƠX«‡“Íj±»°»ù×Ở÷Ú™‰kß [ïS˜‰j̃ZîS©¼³áØ“Ơ©Ø×Ơ%ó™‰kß [ïSÏÔÑÄëºö•½á=ăơÿÂăàƯơ›¶éăˆŸ—»—ué…«‡“Íjó“ÈÿÛ߈˜‰ j ̃    Z îS ©‡¥2ßëMÑÓ½†Œ­Á"Ù½Úª‚ +¼9ÏÔËÆ9¥‡¡Ÿ¹Öß»ûëöÍÓá ߈÷ÁÏÄ麽º¹Ú“ºgû¼ù×ÿÚ½±»«»³ÈÏÔùô«·3uU¡ÛơÔ™‰kß [ïSóÇÏÅôĂ"¿‰½…Ơ‹Çăơ¯ÅßƯª»ÍĶèˆÏÔ´†éÓëö·¦D ߈™Ô߈«Ô°»ÏÅÿÚÿ¯¶½·̣óÇ8¤‡»Ø‘Æÿ¯¶ÏÅó‡ŒÇ"¤ÈÛˆĂÛźùêëö·‡‘×8çÇĂÏÓÏÔ°»ưÀù×å̉ Û«‚ ½9µØÔƒvÏÅϾ¥OÅӳȘ‰j̃ZîS•Èû›À‡€è/Ö:ăˆŸ;—¶Ơƒv߈ăơÅÓÏŃÚƠùב۱»ÛƠäƠ Ñ÷éê‡đ±»¾¹xͼÁÓù×çÚ™‰kß [ïS¾ôóǽ…î¹Ú«‡“Íj±ÔăàƠơÔºøâàéÚ«‡“Íj˜‡­ÖÑÓçÚï½Ư‰ưÀêÚå ¼ăÇíÏÔ™̉‰¿I¶Â¡Ô‹Ûñ×»ÿ¯¶ùêËÇấ9¥‡ÅÙ×ù×å׫Ôଟ}™‡ĂĂÙơÔ×èăˆŸ;̃ˆ‚v™‰kß [ïS̃„¶¦DY Y‰ßÎ̉)ívé‰ñ5ñ·©Ó“ƠçÚµØÛ«‚ ½9½̃¹ÏÔăơ·ÔÏÔÏÔ߈ª‡’̀jÏ̉ÆM¸M³¾‰¿Iµ‰ñÁ±¿ÙÚÓºùöÁ½€§ôÅ‘ÍË)éÛ9¥¡‡¡Ç߈¯È±»›¾›¾óÂË®Ǽ߈±9¥‡ŸƠà¬߈Ù½°»öÅơèŇ€¿à‡Ö +Ô† +6 +¦j +½Ă¼†ÇƠơꛡËÉ9Ÿ}¡Û߈™‰kß [ïSÛ«‚ ½9”Èú³(ù¿‰½ÿÚ…Ö‹ÇíÖ©‡¥2ßëMù×å̉ Á‡é/×:½©¼é¼™‰kß [ïS•Œç½Ü8¤‡ÖËø«»»́văˆŸ;ÿ¯¶ÏÅï»ÀĂĂÙ‹»ăˆŸ;kƒv‡“·ÜǺÀĂɶ™Á•Èû›½ăàÙ½©¼½Ă§…ƠùêÍË)éÛ9¥ù×ív¡ÛóÔơÄÏÅ߈ÎÔå̉ ÿÚáöäô»ôû̉™‡©‡¥2ßëM‡ÇÏÔ߈ưÀÏœț¶éø×ÏÔÎÔˆ‰“Ó™ÁÛº™‡ñÁ¼χÁăêöÛÄÓñ,Ó¼ÏÔ±»ƒ‡Œ™‰kß [ïSôê±»ç'µÍĂY×Ü₫Ù×µ̣Ăùê…Ơ߈«Úù×ÑÄëË¿Ù׫‡“ÍjưÀăˆŸ;“Ơº߈߈ơêè‰đ5đ¶¿»¶ÅÇØ¹ ©‡¥2ßëM±»éÓÛ«‚ ½9™‡‡x£äÚª‚ +¼9³ÂÀđÏÄAëöƠ߈ùê¹Úơê‘ơÙÚ߈Ù€¹ƠÇÓèív˹¼Áÿ×±»רÛ¾£nù×Û×ƯÓ ưÀ߈ßÚؽ÷ÁơÔ¹ÚÂÙÏÔÿÚ¯ÈÛ«‚ ½9™ëé僈˜Ă¿‰Ö¾Ưº«Ô¤ÆÛ«‚ ½9G½¹½Ïġۛ¾ăˆŸ;ñÓ¯ÈưÀ¥ ÁƯôưÀÏÔ9¥‡íƹ±”ç½÷Áß»û×Óù×Û«‚ ½9Äô¹ÚáƯ9¥‡«Ô»‹ÿÚÛ«‚ ½9åĂăˆŸ±»„¿‰êöËÈ9 +ŸßăˆŸ;kßçóÂ9¥‡Ắv¶™‰kß [ïSƒvĂAÁ¼ĂÈ´ƯâºÈÙÚ·ÁƯù×ơ÷‡…Ø¡ÈÏÔëöơêÙÚÍƠ±ÔŸÈÔÙÚ½ëö߈Èñ³Ü“È™‰kß [ïSÿ¯¶›¶éÏÅ¡Á½±»»©º©Üé‰ñ5ñ·œ‰¾IÛ×½€×ÚăˆŸ;±¿¯G‹øÛ«‚ ½9¿‰ËÉ9áꬿƠÛרŒê*ª¹Ú—ŒÅÓï½ÏÅ›¶éƒˆ±Ôø×ăˆŸ;ÓÆï‡/¦ôÏÔÁ̉©ÀửëØ¯ƠÙ×ÅÔ«‡“Íj©‡¥2ßëM™‰kß [ïS̀Ê)èÛ8¤ƒØ¥ÆơêĂ ÿÇ« ©ƒ»5«ƠçđáÓÑÄëăơ±»ơÔÁưÛĐĂ¹ÚéÚ̃¡»±¿Æ» ›¾ăˆŸéÖ×¾8ơèÅÏ̉ôÙ½ª‡’̀jÙ½ÍƠ±»ÄÔ«‡“Íj™‰kß [ïS·Å×¼Ù½©¼ăÁ«‡“ÍjÈñ»øêƒv¥ßq…اô£ÔÅÔĂô·#óÔù׫‡“ÍjÆ̉¹Ú˜‰j̃ZîSƯÓ —Óö™‰kß [ïS©ÓÙÚ½€™‰kß [ïS§Ô½ñÚ¿ôñÖ—»¥ÛưÀ·Å«‡“Íj¼Ôùăƒv“Ơ¡áÚÜ匿N­ÄóôưÀ«Ôëö“º©‡¥2ßëMƠψăˆŸ;·‡‘×8ç߈ÏÄ…ƯÏ̉ơê½ĂÙ̉ù×ؽù×›Ú߈«Ó߈ƒv“ƿ٬¿ײÏÔ߈ËÓ¹ÚÆö÷Á¡Ôù×É›¡ÛíÅƯ—&ñ¡ÔXéÓ߈“¹ƯNÛÆ±)©‡¥2ßëMµØŸ ÑÅˆá µØĂÈù×™‰kß [ïSéÓ÷‡ĂÈø¿ƒˆơê¼ÙÚûÓÛ«‚ ½99¥‡âºĂ¥ÇƒÔ£»ÏÔóǹÚơÔ߈ùä̉«ÑÏÔñÆÏÅưÀÛºÓ¾‹¾Óؾù×߈¹Ú‚ˆÏ̉ßÄÙ™‡ö“Ơº₫ǽ«‡“Íj«Ñ«»ëö÷ˆưÀÑ\‡Û߈¢» ™‰kß [ïS«‡“Íjôê½ÍƠ•×ù×ëÚÙÚ±»̃ŒÚ,—¿̣ăܽÙÚÆÅoä×åˆÙ̉ï½êÓ +ĂÈÏԴȱ»9¥‡ÅÔ9¥‡ÏÔÛÀ›¶éÄô…Ûºù×ù×Ó‚ÿÚùêñÚßÁưÀù×ù×ÿÚ–Ó¿º¾½±»ÏÅ₫ƠÀƒvăˆŸ“¹ƯNÁ ÙÅ뺽ßÄÙ™ ¾ÑӺŵ†¥Ó–¶¯È»ØƒÔ߈Û«‚ ½9óǩǥڷ‡‘×8çµØÎÅÇĂăˆŸ;Á½­‹™‡Ù½™ÓÑĂ½âˆ:«‡“Íj¹ÚÏÔÙŒë*«™É·Å±»ÿ¯¶ưÀâàÓ̉ÏŃ֣»ÑÓ¿‰ƒvéêùêμÛÀ±Á£Ư‡×ÙŒë*«ÏÅ—»©ØÏÄưÀÿ¯¶ƒ½ËÇƯ$ûן}úƠ߈½€¡Ơº±»ƠX‡Œƒv©¼ÏÔăˆŸéºÏÔÛ«‚ ½9óç½Ûº¡Á™‰kß [ïSÛ«‚ ½9ñ¹™ “Ơùê÷ÑĂ߈öå̉ ¹ÚÚÀÁ¼ù׃Àé‰ñ5ñ·ù×±»ÏÅĂÙív¿ÀÿÚÏÅ̃„ÏÅÛ«‚ ½9¡"4ß½Ù½ëƠUÿ¯¶½߈ăˆŸ;¹Ú·‡‘×8çÛ«‚ ½9±»«·3uUîºù×ĂÈÁƯù×Ö¹éÓÿ¼«‡“ÍjÛºØÓƒvùל‰¾I‰¿I±»«‡“ÍjóÓăÛƠßÄÙ­ƒ§¶°»¥Æ¹à²¾¹½üÀщÓÆ™ô߈‡ÓñÖ·Ü¥ÂĂ¹ÇÖÛÚ‡,¡È“Ơï‰9¥‡µØ«â¼Å ơ»Á¹ÏÔÙŒë*«Ù½±»ßÁœÁöéº÷Á±»ưqăˆŸ;ƠX±»á¾©¼ÏÔºØ÷Á"ÓÆ¶×Üù×±»ĂȼĂÓÏÔåĂơê½µa­Ä¥ÖÅÔÿÚç4ÙƒùׇÇ߈ÁƯ¢Ç¼Á Ơù×Û«‚ ½9íÖÉèùׇx ÊûµØ»§ÔÛ«‚ ½9˹ù×¹Ú¥ˆ]1©Ç̉ÆÛÛ«‚ ½9«ÔÏÔêÚăà®È̀Ê)èÛ8¤“ÇÖï»߈Ïű»ă…ñ=½‹ÙĂƠ™‡Ñ+ö‡­ÄÏÅÏÔ–»ơÔ÷Áùׂ½ÓùÔØÅêÆâĂƠ߈Áƒv·‡‘×8çÏÔơê³ơèÅ·‡‘×8çăˆŸḮ«‡“ÍjñÚ¯È₫®¶9¥‡×·Å‡ñ5«‡“Íjùןù×±¿«‡“Íjå̉ ÏÔØôæ̉߈‘Æ©ÂÔţؙ‰kß [ïSÇÖă౿ƠÏÔ‹ÜǺ߈×Ơ›¾‹ÇÂØM‡•½9¥‡‹ÇÏÔ±»ư§‡­ØÛ«‚ ½9³°»½ôù×›¾ĐÅ™ÓØÚ™‰kß [ïSÁƯëöù×ëöÙ½̃ÚƒvƒÚ›¾ƒˆ™‡¹Ú‹Ûưö‡9ÿ¯¶Û«‚ ½9ƒvÓØÙ×Ó½ñÆ߈ÇÖ¹ăˆŸ;k9¥‡đÆÁÈ›¾™Á“ƠÅÙÛÀï½¹ó™‰kß [ïSÏÅ©¼ĂĂÙÚÙ̉íê‰ơ§À›¶éÓ¼Úª‚ +¼9ôĂ½·Ø©‡¥2ßëMå¼ ŽíÚ±»ƠÁ›ÚăˆŸ;kÅÔÏÔ¥Øù×ăÇí½Ôù×á ¡hÑÓăà½ívÛ«‚ ½9©ØÏÔçÔ¡ÑÆ×ñ§Ô˜êèäß»ûËÏÁĂ Ư—¾¿ßÛ«‚ ½9Ó¾Ơ9¥‡ù×߈ø¾Ï̉8¤‡ÙÅëƠ]ùׯ»ƒˆäŒ¾NóÔ¹ÚÏó8¤‡ÖIϺ¿ưÁ«‡“Íj‹ÜưØçô¤ÆÏÅ‹ßÛ«‚ ½9™‡Û¹£²ª»ĂÖ¦Ơúñ»ÛáỞäÁ¡Û̃ˆ߈Ù½ï»Ù¾±¿ÉĂ­v½ƒvëöÑĂưÀ«‡“Íjÿ¯¶ÙŒë*«¡Ư¡Ô¡Èƒö±ëå‡ẹ́£»‡Û›¾÷ˆËÉ9¾Û×¹Úù×ăˆŸ;k‚ÍÄ•%‡ŒÁĂ釡ÁÜ«d¿Åáơểر»¡ÔƠÏ™Á¥Æ¥ˆ]1ù×ĐÓ÷™‰kß [ïSÁ̉¾ùêóÔăˆŸ;k“˜‰j̃ZîS߈ш÷å5ÓÓ½8¤‡Ö߈±»ëöÛº«·3uUÿ׫‡“Íj߈ûÙÓūԃvÓØ›ƒvóÇ›¹ßÄÙÅ–ùׇŒ÷‡Û«‚ ½9É̉Å»Ë̉ûÙå̉ »Å%匿Nư§‡ù×½߈‰ÇÑÓûÙ•Œç̉ƠÏÔ‘ÖăˆŸ߈™ÔÛ«‚ ½9ưÀ«‡“Íj˜‰j̃ZîSù‡‰¿IÓØù×ƠÛ°»ßÅỞå̉ Ù½ÍƠ“Ơ¾öÿ¯¶ï½“Ƶ؃¾‘Ù½‡Ú›Ú̉ºĂÙ…nÍÓơ»y·Åç½ÙóÊƯÓ çÚÓàăÇí£»©Ø³Âù×±»ÑÓ—Ó½ÂÙ*¼Ù½ÑÅù×߈³¹ăÇí½ăˆŸ;këÖ±»ăˆŸ;‡ºëö™‰kß [ïS½Ôɹ«‡“ÍjơØרÎÅ¡µØí‡«‡“ÍjôçÚ½ºØÑÓ·ÔöÁ¥Æ“¹ƯNù¿ơêÇØ·¸¥Ûï½ÅØ߈ĂÙÛ«‚ ½9€ƠÁ̉ỞèêËÉ9¼ÁÇÓ½‹ô°ÔϹß»û«‡“ÍjëöÛÄÓÚùê›ÔÛ«‚ ½9רÅ °»˜ÁÙ½±»9¥‡×­v߈¡ÛÍBß»û£ÈѲÊÓ°»ÛÔ¹Ú«äĂÙ±»ơĂɹỔ‰¾¹xµ†­Äщ™‰kß [ïS™ô‰ø‚v§ƠÀ½!²ơéÛ«‚ ½9¥ˆ]1ÿ¯¶ëöqÀ‡€è/Ö:ÑÄëƒvûÏÔ½€Ơ½›¾μÛ½½à÷ˆ±»ÿ¯¶ÑÄë‹ÇÏijºó·ÅÉÖ±»±đëö廃ˆëöÅÁ¿»€–¶QQÍıÁÛ«‚ ½9µØ”îëöÄÁĂÙËÇöÁû(ÍÄ®×ỞÛ«‚ ½9ÿÚ˜‰j̃ZîS«‡“ÍjỚ% ăˆŸ™‡ÙY¸Úź¾ÏÄ¬Ö È ƒv™ÔƠÛ«‚ ½9ƒv“Ơ‘³Åà«·3uUöÑÓ—T‹ÇÅÓ«‡“ÍjíØ®¾ÏÅ— ¡Ûø¼ÑĂÛ«‚ ½9§Æ‹Ç麽۫‚ ½9Ăª»ă÷Ó‰¿I©¼ƒ½ù×½˜‰j̃ZîSåÁô꣉ívº­Ä¯¼Û«‚ ½9ÍË)éÛ9¥¸Ú÷ÁÍÄͽĐĂÉ÷‡ºŽ£ôăˆŸÉ°ÀµaƒĂĐĂ×ÏÔ«‡“ÍjÙ˜‹¡KÛ«‚ ½9ƒ½ªÚ¯µ®Gø™‡„Ú—Ó™‰kß [ïS…Ơ£»ßÁĂù×ÑÓŸóµØ‚×÷Á¡È¥ÛË¿¼Ø™‰kß [ïS¡ï³2¨Ơôê¹Ú¹ÚÁË߈ÛÄÓùêÙYÏÅ©Œù×Ù×±ëØ»ØưÀû—ÓרÏÅ߈ËǯÜ߈º®È¡Èï¶ÿÚÙ‡Œù×»é™Áù×ÙÅ뛾·Ôăº̣ÇÏԻ؛ƠÉ»«ÔưÀăˆŸ™ëé壭֘‰j̃ZîSÏ̉ơêó̉ëöù׋DZ½ËÉ9ù×ÛºÛº—¶ù¿é‡çÚ›¡ơê§ôÏÔívÛ«‚ ½9ĂĂ ›­±àéMÛ«‚ ½9™‡½ÅÁ‡é/×:·ÈưÀˆ½Ù½ÓÆñÚ×¾ă»ƒˆÀª»«Ô«‡“ÍjîÅ·‡‘×8ç“Æ­văˆŸ;ß»û™‰kß [ïSđÄ߈‘ÓÛ«‚ ½9ăˆŸ;k†ÇÁ̉ÙŒë*«ăà¡Á9¥‡ûÀG½¹áÔX̀¹ Ù½±Á߈ÁĂÏÔ¡́‹Ù“ÈÏ̉ßÄÙÛÔù×ö¿‰Ù½Á¼ăˆŸ¿ôÙÚ™‰kß [ïS¹Ú½ÁƯÑÓ‰ÛÀƯ¹Ú̃ÄØÏÅÚÀ°¿¥Óçº÷Ó«‡“Íj¯ÈßƯÏÔÓ̃×¾û·ºµ†«‡“Íjá ŽăˆŸ;¨‡¤2€̃êLÇÖÔX"‚½ÿ¯¶Êđ¿‰щɃÖÛ«‚ ½9¯ÈµØÛÑß½©Ø©‡¥2ßëM“Æ߈¹ÚÙÜ™ëéå›Ơ–¶Ú×ĂÙ½ôn±»Ù½ñÖơêÎÅ“ÈĂĂ ›­±àéMù×ívëöÓÆ¹¼á ø¿™×½Û«‚ ½9¹óÛ«‚ ½9·̣³ÑÓÁ®Èù×Û«‚ ½9‰¿I¡ûÓºĂÙăˆŸ́½·‹‘Æ̃ŒÚ,ÙÚïÁơvå̉ Ÿ‚ÂÓù×ÏÔăˆŸ;›¡óÂé‰ñ5ñ·‡ºΈéºăơØÚ‡Ơ÷Ú«ÔĂÙéÚ₫ăˆŸ;ºƒÖ›¾Óر̉ăˆŸ¶ÏÄü¦†ù×ưˆ÷Áó¼ôÅáêç̉±»шÏ̉½Û×ܾư“ăˆŸ;ƒvÏű»¿¹9¥‡ƒvÛ«‚ ½9±këö‚v™‰kß [ïSù×ê…Øù×±»çêÑÄëÏ̉́v±»±»߈¦ôÆ©ƠăˆŸ;ö߈Ø™‡ÜÙ×’Çêö™‰kß [ïS½±º…ôÏÅÉĂËƠ„©ÈËÖÙÚƒvư‡±ù1Áß„›Ú™‰kß [ïS‹ÜăàóÂÓºù×ÿ¯¶Û«‚ ½9ĂªÚ+½¾́±»ó|߈Ç̉«Ôøêá¹ù¿³ºó±»ÏÅÁÏăà߈•±»ù×ÙÚµa«‡“Íj«·3uU¯G‹ø߈ưÀ¡ƯÛˆ½“¹ƯNÓºµ†ï‡ºÅÔÛÚª‚ +¼9Úª‚ +¼9Û«‚ ½9ơêÓØív—ˆù×±»­Ø—¶ăˆŸÙŒë*«ÑÓĂĂĂÛÄÓ߈¢äÿÂÍƠƒˆƒµưÀ˽ơèÅăˆŸ;‡ƒvÙ½ÁË¿‰Ó¼¡»™ëéåưÀÍÓÓÔ±»Ù½ÙŒë*«“ÛÓØ—Á́©¼¾ÿ×ÁĂµØ—¶ĂĂÅÔ‰đÍË)éÛ9¥Žñƃvׯ±»“ƠñÓŽĂ›¾‰Û»ºÍË)éÛ9¥·§D ³ºó½ÿÚ€Óçô°¡ÈŸÈºø×ÙÚÓØÍË)éÛ9¥±»9¥‡ñÚƠÏÔëö·ºơêívá=È¿ØÛ«‚ ½9ƒ½ù×û÷ˆÏ̉ÁƯßÚ«·3uUöÁ›¶ééÓù×߈ßÁ߈½ƠXăàÙÅëÍ͇Ö8æ Yơêáê‚v•î&9¥‡©Ç™ŒăˆŸ;k¿ô­ØƒvíêÏÔËƠÛ©ˆíÚơļë-ÿÚáƠ±»ĂÙ뿺Á¹ƒvÂÙŒë*«ÿÚăˆŸϺÏßñÓÓÓ¡­‡÷Á§ÆÏÔ½€Á ÛÀ‡ÛºíÚùש¼·Ô‘ÆÏÔÓÔ£ƠêÚ´À ¹Ú…ÛË¿ƒˆ“ƠưÀgÛ«‚ ½9×¾ÛºÀƯµØ«‡“Íjщ²¹›¾À«·3uU‡º¥’ÛÀÎÔÏűŒ™‰kß [ïS¼Å–¶ĂÙªÚ²º̣±»ƠXăˆŸ̃ˆƒv™‰kß [ïSơÔ߈ơêËØôú±»ñÚǺÍ߫Կ‰ÛÄÓÙ×½†Ç̉ÿ‡½ƠÅÔùסƒvÙY»‡çÚ§Ó߈ơêưÀ§ô£»̃„Û«‚ ½9¹àï³2±»ù×Û«‚ ½9àê9¥‡«‡“Íj©Øö«‡“Íj¡È½Ô¥âº “±»ï»̉½ªÚ±»àƠÏÔÙŒë*«ÅؘÁÀ¹ +‹Ç›¶éñÖÏÔÛ«‚ ½9¥È߈Ë̉ăˆŸ;ơш½È¡Ô·‡‘×8界ªÚ߈ÏăvăˆŸ;¹½¡ÈĂÖßÖ§Ô¸ÚĂÙ̃ˆ™‰kß [ïS«»÷Áͽ¿úÏ̉đÄ÷ÇÁ×¹9¥‡̃³ºó߈ĂÙ¸Ú*®ŸÈߌßÄÙÑÄë“Èù×›¶éª¶2tTÛ«‚ ½9ß»ûÍÓ±»«‡“ÍjéÚܽ۫‚ ½9£Ç£äç̉©¼—Ø›¾ö«Ó·Ô¿ß™‰kß [ïSÙ̉Ϲëö«Ô¯¾›v‹Ü¯ÈáÛÇ̉­‡¨‡¤2€̃êL«dÍÓ½Øù×ÑØÁƯï½é‰ñ5ñ·÷ÁƒÖϼ‹ÜƒÔË ù¾Ϻ©Óëö̃ˆç̉öÛº˜‡ÓÆ—»ỞÙ׫‡“Íj€º•ŒöÁö±»™‰kß [ïSÏÅÏÔ–À¨§ÔÛÅØ›¹á ĐÓÙ×í£Ӆà8¤‡×Û«‚ ½9›¶é™‰kß [ïSóÂϼëö‘-ÙÚ½ø×£@ºÅôù¿¡ÈÛ«‚ ½9¾ÛÆÅØ9¥‡×öÁœÂăˆŸƒØ˱‡Œ“ÈéÓÛÀ¤ÓËÓÏÔ™ô‘Æ̀Ê)èÛ8¤ƠX·ÅơêÍÓáÛ©Ç›v½ÔËÇ“Ơ«‡“ÍjÏÔùơÓâàèê߈ñÓªbµÈ¼×¾ŸƠ«dơԵ؋ǹÚÛ«‚ ½9˜‰j̃ZîSÁÅØ©‡¥2ßëMº½¥Â½‹Ç«Ñ«‡“Íj¥…ăˆŸ߈Ă«ÔÏÔåĂñÖ£ØÊÅ߈°»çñ–Ǽ¦Ø…öăˆŸÏ̉߈¿‰˜‰j̃ZîSéÓ‰Ô«‡“ÍjÙ½Ÿ}åĂÛ××Ơ†7§jÛÄÓ‚vƒ¬Ä »£ÇÓÆ‹Üç̃Ô½­ëµØ·Ô£é±¿ù×߈Á½Û«‚ ½9ăˆŸ;çÚÔXăˆŸ;«øƯÚÛ‡Ơ´ø¿ƒˆÿÂñÚíÖÁÿ¯¶ơÔñÓå¼ ­Ư¦ÈàÆó¹ÚưÁơ꿉ĂÙçô™‡µ‹ăˆŸ;óÓ«Ô­ÄĂïi³ºóƒ¾‘½›¾óǡǬ€ăˆŸ;kµ̣Û«‚ ½9”×Ơ«‡“Íjÿ¼«ÓŸÖ¸º¡ƯÏÚ™‰kß [ïS©ØăˆŸ;í˓ȅ઻›¾…ôùëơÔÛ«‚ ½9åô₫Óˆ•=‘Ï¿‰Á̉ơÔơÔÀƯ÷Áª¶2tTÉÙŒë*«½ùêå׃ˆƒˆÇÖ¡Ô±»™‰kß [ïSëö¯9¥‡éº̉ºÁ㙉kß [ïSßÖ·Ô«â«·3uU¤Á ÓÁ“Ơô₫ÚßÄÙψœÁ¥ÆÖÆêöù׵ع£ù×óǺ½ø¾«‡“ÍjÅØ™‰kß [ïS›¶éâˆ;ÁĂ¡Û§Ôà •ÇÍÓ±»‡»›âÿ¯¶ÛÄÓƒÖ½ÏÅÛ«‚ ½9—ˆÛºô™ô‡Œ™»±»eÏÔ߈÷‡¼µaÅ™‡‡“߈·¶‹Ü©¼œ‡ÅØ9¥‡߈ƒÔƒÔßÚỞ™‰kß [ïSƯ…¶‹Üσ߈ôú$ù×Ù‡Ǽ¬¾³ØăˆŸ;Eƒv¼Z˜‡‰ÆÔX±»™‰kß [ïS©¼ß„›Ú¹Ú±ÁÓÆĂ¿‰ÑƯ™‰kß [ïSÏÔƯơnăˆŸ;½¿‰ÑÓëÓ¡Á½çº̀Ê)èÛ8¤ºçÚ÷$ëöơỘÔ¹Úöøê ¯×¾Ø™‰kß [ïSÓÆív€ëÂÓ¾ƒ¾‘éÓ‹váêÿÚÏÅÍÄ»ˆ¨¼шÏ̉¯¾ÙÚñÓỞ½ô±½×̉™‰kß [ïS™‰kß [ïS·Ôäơ·‡‘×8ç—¾Û×½ÿÚÿ&ƠÙדÈơꕌ…ö§Ó¶Û«‚ ½9ÑÄë¡Ô›¾ôÅ»߈ßÚÙÅë´ÎÙ«·3uUÛÚ…¼Û«‚ ½9ƠÇÓ•×Á ƒÔÙ×ÍÓÓØÂÙùºÙ½ÏĽÏ̉½«‡“Íj“ƠÙƠá„«‡“Íj9¥‡ÙŒë*«é‰ñ5ñ·ÑØá óÔÍÄ»Ø9¥‡‡º£Ô©Ç“Ơ¿ù×Áé•ǷصØĐعÚ߈ăơív±»«d€ºÛ«‚ ½9…™‰kß [ïSµØ˜êèäèơ›¾½ͼ±»“º̣ÂÅØ™Ó¹Ú™‰kß [ïSêÚå̉ Ëǘ‰j̃ZîSăˆŸ¿‰áÁ™‰kß [ïSÚ×̃ˆăˆŸ;kƒàÅÓÏÅ«‡“Íj˜‰j̃ZîSù×ÍÓ× ûÙ§È—¶¨‡¤2€̃êLöÛ«‚ ½9™‡ÛºĂôÚ ª ‚  + ¼9 ÏÔÁ‡é/×:ÑÓ߈߈ëöù×±ëØ—Ó±¿ëö‘â9¥‡¡ƠÏÅĂƠĂÙÁ¹±¿ɇÙ̉ÓÔ›¹ÿ‹Ǚ–™Á™‰kß [ïŚÚÛ×ÙÚ™‰kß [ïSß»ûơêù×ĂÙéê›·Ô麇íֽر»ª» +£È­¾‡Ç‡ÇĂȾÓÛ«‚ ½9»Ø±»ÛÄÓŒĂÍćŒÿ¯¶öơÔăÇ퇌ù×·Ôù×Ï̉ƒ×ùבïƠºmĂĂ›¾î²2߈߈±Ô¸ÁÿÚÙ×ÎÔơÔƠ™‰kß [ïS­Äº·Ô‰ỒÓDźÆ×¼ÇÖ¿º…ƠÀÚÚÁĂÁøîÅơèÅÛ«‚ ½9ÙÚÓÏ̉Ó¾ñÚ·ÅψôèÄỞ½±»ƒˆ¿‰Ă¼߈ÁÛå̉ ߈ÏÔÅØ÷å5Ó©߈Å¥´a‡ÇƒvÉ ¸Ú±¿ÏÄ›ÚÎÔÅÓYÅÙĂÙÛ>Û«‚ ½9°»°»™‰kß [ïSá̃ăˆŸ“Äù׃ÚÍÓß»û̃ˆ«‡“ÍjÁĂÙ½½ƒÜ·ÔơèÅÙ½ăˆŸù×߈åĂ˜‰j̃ZîS±»ô¥ØÓÏ̉éơÏÅƠ9¥‡ǽ³ÈÅØç«‡“Íj˜êèäÛ«‚ ½9đÖÙÚÍÓ9¥‡ù×›¡ïôϼăˆŸ‚vßÁ±»ĂÙÙÚ÷Ù™ÓÙ×ßÖà ă‘·ăơäלÜÍÄ)®ÈñÓ‰ơÁ̉™ÓƒªÚĂº߈“º¹ÚñÓá‹Û÷$‰º¹Ú©Øó“… ­ØÛ«‚ ½9Ö±ô«‡“Íj½ƒˆëÔ•Ü̃±½å̉ ‚vÏű½»ØƒØ™‰kß [ïS½È₫®¶ÓÆưÀ½€ÏÔÚª‚ +¼9æÚщñÖ̃ơƒÚăˆŸá̉‡Ç9¥‡×Ï̉—Ö߈ùê±»ñ9¥‡ẲÖµëöơº‹Çº‡ºµaµØÿÛ½±»ù׋ÜÁÛ“Ơ÷ÁưÀø(Ă·ÔăˆŸù×™‹¥í±̉Á£ËÏÅơêÁƯùêăp‹Ü‚v9¥‡Û½§-ĂÖđ»ÏÔăˆŸ;¬¶÷‡¹ËÉ9°»½÷Á›‡ơÔÛ«‚ ½9߈›ÍÓĂ¼Ù½ß„ÏÔăˆŸ;ÿNß»ûø×ơ¸‡á=áê‹Üµ†̃ˆß»û¿ô¡ÔăˆŸ;kœ‡đÖ˜‰j̃ZîS†ŒµÈÙÚĂÙ‰Á̉‡Ï̉§Ó›¾ƯרóijÆ9¥‡«‡“Íjˆơ™‰kß [ïS™‰kß [ïS¡Ô߈Û“ÇßÏÿÚ›¾ø×“ƠÏ̉ăàÛ×Ơ₫ăˆŸ;k¹Ú‚½%ÿ§ÁÜ…Œ³¾÷Á߈/ÏÅĂÖ°»‹Ü³“—¶ÎÔă½ÔơăˆŸ;ùôàç×$ù×9¥‡×ÏÔÙ½߈íÆÙ½—¶ÛöưÀÙÚ»ÅăˆŸ«»ÙÚù×Å»¶«‡“Íj‰¿IơèÅ·‡‘×8çù××ÜƠî¬ÖÏÔïƠ¡ÛÇ̉÷‡¨ÈׯÛº߈ÍË)éÛ9¥î²2Ươ¶è»Ø9¥‡×́v߈߈ù¾Ù½Û«‚ ½9ĂȽ‰¿IăàĂÙív½µÜÀ½ữ¿^ÏŽ€«‡“Íj¾×Ơ‡Œ‡×ĂÙ8¤‡×ơ»ëÔ×$Û«‚ ½9å̉ ÙÚ̃ˆÅØ“Ơ­̃Û«‚ ½9µÆœØÇÖ™‰kß [ïSÿ¯¶›¾«ÔéÓ¡»«‡“ÍjïÚ9¥‡߈ˆÛù×ÿ¼ù×‰Ôø×ˆ&ÙÚó¶‡×ØY‹Ù©‡¥2ßëMŸ»÷‡™‰kß [ïSÛˆëö½íÓù×øÏ̉ù×­€“¼ŸÖ¬ô8¤‡‘́ È³×Áð»Á߈›¾ăơÛ«‚ ½9ÍË)éÛ9¥ơê™¶̉ºÙ-€Ơ‡ÏÔăºÓÁ¬Ö ÷ÁµÀ߈ù×ÑÓÂù×ÄÄÓÔ™‹™‰kß [ïS·ÔùëÍË)éÛ9¥đÖ‡¹ÏÔ²ÂǼâà£ØƒvÛµØô9¥‡ÑÓ±»ÂÙ µØơèű¿ÏÔº™‡ù×—»üͱ»ÙÅë¿ô¸Ú@ơƯ±ÁÍË)éÛ9¥߈‡Œ˜‡Ÿ»½ôÄÛ«‚ ½9«‡“Íj¹Ú½±»ơÅ̀ÓÓÓÁ÷Ô£»‡ÚÙÚ¦ÖöĂíø×¹Úƒ¾‘ë¼߈­Â«âÛ×ăơï²2©ÀÛ«‚ ½9ù×đÁëöÖÆƠX±»¦ô´Å™‡ÏÅỞ©ÓñÖÏÔ„ÇƯ Á|½Ơ×á=ø×§Ô…ô™‰kß [ïSÑÓ«‡“Íjéê›Ụ́ä̉ÿ¯¶ù׃v·¸ó«‡“Íj¿́³Ü…¾ÓÆ¼Ă¥ÓÙu¥Ö›¾ù×щ߈ßÄÙçÚÏÔ°»³ÈÑÓ©ÇÏÔº¯ÈׯÔ·Å8¤‡×9¥‡ŸƠÇÖû̀Ó¾áØ̉ÆåưÀËÖÍËù×™‚©˜êèäăˆŸ;k›‡½÷Áơ©¼Ơ¼¹Ú߈÷ˆăơöË%ÛÄÓÙ½±»¹ÚóÂÛ«‚ ½9«Ñ±¿gµØׯ‡Çر»º™‰kß [ïSÁĂö߈§ôơÔÅľµØïô±ÁăơËƠăˆŸ;9¥‡×£ä·‡‘×8ç±»ÓØ÷Ú¹½8¤‡×øêÙÚ½߈“Ó߈«‡“Íj«ÔÛÄÓ½€¡ÇœÁăˆŸµÈ«‡“ÍjÛ«‚ ½9½ÙÅ뇺´Û¿ØÍÇñíÈ£0¡á™‰kß [ïSûu™ÁûơĂăˆŸµØÄԫѱ»øÅÔ« ©ƒ»5¿‰ÿÚ›¶éöå̉ Ö¾8Ă™‰kß [ïSÁĂ߈ͼ÷Á߈™ÓÅÓ»y¿ºíơ‹v£ÈñÚưÀ›¾“ÇôÍË)éÛ9¥“ȵa´ Ôù¿»åªÑÓñÆï³2Û«‚ ½9ªÚ€¯Æ•Èû›߈µa¾ÅÛÀ¾µØ9¥‡‡Œ™‡±»шÏ̉·Ô9¥‡±»߈ù×·Ôù×9¥‡™‰kß [ïS™‰kß [ïSùÜÛ«‚ ½9ɇăÁ½ùơ‰¿IƒÖÁĂ©‡¥2ßëM¦È¯È߈·Ôï»›¾ù×éê߈ĂÙ§ôµÜùꙉkß [ïSÅƯ‡Ç÷Á·Ô›¾ăˆŸ£–½çÚ½‹Ü»ÙÚÅÔ˵öëöù¿§ƠÏÔ‡Œ‡ÇßÄÙëọ̈Á¤ˆ\0›¾ĂÙ“°óÇ·‡‘×8ç±»™‰kß [ïSÂÙñÚшêö Å»߈ƒvÏ̉½€‘ÖêöơêñÆƠ߈ù×Ѷ÷ÙĂº©Øµ1ëöÛ«‚ ½9ÎÚ‡¥ˆ]1Ù½°»­ÄÍ­HÛ×å»÷Á›¾›ĂƯÓ Û«‚ ½9ĂŸ}ăˆŸ;µ!ơê½á «éÎÔ“ÈÅ×ÓƠ›¾ÁƯ½ăˆŸ;ưÀ¿ÅƒÖ©Ü·ô¦Øç̉¶&&µßÛDZ½±»ù×À½¾ÿ¯¶ëö÷Á¡Á±»ÅØÁ½ǼÛ½¯×î²2ƯÓ «‡“Íjù×8¤‡×ưÀ…©¼ơêÍÓ½ÓØ›Ă±»Ø×ĐÄêÛ«‚ ½9ÅÁ“Æß„ùסȾ­¶åÁ¹—¶ƒÖưÀ™ëé嵆ù×Ñ+˜‰j̃ZîS…Ú±»Ÿ%ÙŒë*«ơêăˆŸ™‡ÏÔ£‘ăˆŸ;kö›¶éÿęؙ‰kß [ïSµØ•ÙµaÍÓŽ§Æ›¾Ë¿—ˆ“̃«Ô”Ô›¶éß»û½›Ă¸ÚưÀ›¾ëöÿÚÙÅëÏÔỞ•%›¾ơê¸Ú•›¾ƒ‰Ô÷ÙÆÛÄÓÅ–ëö¶‡Ö8æÑĂϹ›¶é¨º߈˜‰j̃ZîSÁ̉™‰kß [ïSú‹ùꘇ´†ßÖù×éÚơØïÚ‰ÔăˆŸ›Úưƒv½£Çăê›¶é÷$«‡“Íj÷̃½ÈçÚÛ«‚ ½9µØ«‹µØ—Ư“¹ƯN‰ÛăˆŸ;ơêóDz(ר”‹œHÙÓÛ«‚ ½9å,µÜ«‡“ÍjÏԡȇŒ‹È™ÊËǥƻÏÔĂȋǶ Ëûáö·ôơÔÙÚºëö±»çô›¶é½Ô÷ÁưÀÙàƒÖŸÈ™‰kß [ïSÉ̉ăˆŸ9¥‡Ơù¾·‡‘×8çÙ½¨¼µƠ·‡‘×8çăˆŸ;½ß¥ˆ]1‘Öçmï³2ÆĂ‰¿I™‡Û«‚ ½9÷$›¾©¼ »ëơăˆŸ;ÍÓ߈Û«‚ ½9Å–¿ØÛ«‚ ½9ÙŒë*«߈‰ăÔỊ́öơÄăˆŸ¡%÷ˆ¶Ô߈ÍÓÇûbăˆŸƠÏÄÛ«‚ ½9éºñÚâ±»̉ÆÏP½ù×ß»ûªvÛ׺¼«ÔëöÏÅù×´†ơ껽™‰kß [ïSÏÔÏÔ˜‰j̃ZîS¯‰¯0±½µÑÓ«‡“Íj‹ë Á·‡‘×8çơÔéºă#›¾™‰kß [ïSÍÄ÷ˆƠÅñíÈăˆŸ;ÿÚƒvëöÍÓ8 ¤‡ ××̉é×µ†­R±¿ßƯ÷Ú±»´À±̉ŸƠñÓ£»ÓØÍÓ9¥‡ôêÙÚÛ«‚ ½9ív£äXÇÖáÛưÀ±ÁåĂËÇø×̀Ê)èÛ8¤źÏÏÅĂƠƯơí‡óÂÏÅù×ívªÚ߈åÁôëƠUß»û›¾µØơèÅ¡Á/¯È©‡¥2ßëMÁ½ăˆŸ;™ëéåîƠ ăˆŸ́Æ—»Û™§Èé½Ö¾8÷Ú±»ñÓ†đ5ơêƒà•½±»©é)í¡8¤‡×%™‰kß [ïS‹ÓưÔƒ×ÂȽÙƠñÚÈĂí‡ù×¾›¾Û«‚ ½9å̉ ¥€‡Çø×ÍĹÚù×ÏÔĐæÏÔÑ»¶ùêáç±»ÁƯ«ÓÑî¿ß“ºưÀƒv§º­ÔçÚñÓÍÄÿ¯¶˜‰j̃ZîS¾óÇÏÔĂÈƠļ+«‡“ÍjñÓùׯ¶º߈°»ăˆŸ;±»±%ö¡ÁºyíÇ™ô¹ÚÙܾĐÄꋪ-Ç»™‰kß [ïSÁ㙇ø×·‡‘×8ç̀͵Ø߈½¹Ú¯ÛívÛÀÛ«‚ ½9±»‹à™‰kß [ïS¥Óù×ÍƠ¯¼Ûº±»¾ß³Å¶ŒÅ±»âˆ½½™‰kß [ïSµ‰ÿڥؓۃvÙ×±»ÉöăˆŸ;¹ÚăÚ¡Ôøê²ØÏÅÏÚáƯăˆŸÛƒv™‰kß [ïS£ÔÙ½½éÓÅÄ½Ôø×Óº™ô£ÇëÓ߈›¾߈Û«‚ ½9ÁƯºÁƯÅÓôÑÄëù×öÁ•ŒÏÅö₫®¶ù׺¹½±‘÷¹Ú‡Ç«‡“Íj«‡“Íj™‰kß [ïS̃ˆ³°»ëöÅÙºnéăˆŸßÚ™‰kß [ïSï³2«‡“ÍjµØơ‡³È™‰kß [ïSơÄù×ăˆŸ;óÂÅÓºăˆŸ½ĂÙ±»Ó̉á÷‡™‡ëöÛº¿‰©ØÛ«‚ ½9ăˆŸÁƯÛ½ëÔÏÔÑÓùôö×2ÅàϹ´À߈öëöƒ½×¾™Ôƒ¾‘ç'óÓÙÓù×™‰kß [ïS¯ÛáÀ÷Úù×·‡‘×8çÑű»ñÓ߈«Ô¿*¹Ö§Ôëö›¾™‰kß [ïSù×ÿÛíègƒ %ÏÅí¾Å±»ÏÔï»ùê³à©vÙÚơꥈ]1‡ñ5ÎÅÙÚ“±»½€›ÚµØ›·Ô›¾¥Ç£äàêç̃±»å̉ ÏÄÁ½ÓÏẸ́̉ÄßÁ½€Û«‚ ½9Ơ€ĐÄêăˆŸ«‡“ÍjáÛƒv§çÏÄăàơê«·3uUÑĂ¹àÅØ½¾Óؽ9¥‡ÏÔƯơÏÔĂÈƠ±»£ØÚÀ«‡“ÍjÁĂᤧØ߈Ϻ½±¿àÛºÏÔäô3ºÿÚÏÔ3ÑÓÓ¾ăˆŸ·ÅÁĂăơÁÚÑÓ™‰kß [ïS˾ù׳z™Óív¡Áù×Åà8¤‡¯¼«È±»›¾ÆÙŒë*«‹Çđ»±»¯¼ăˆŸ­½¼g‡¾đ“Ơ¹Úº¼ÏÅÑæñ»ăˆŸÑÅÙ½¢Ç‹ÇŸÖƒØư“¼½çÚ½÷å5Ó›Ú°»ưÀ¥ˆ]1«‡“Íj™‰kß [ïSÙ½£ØùêĂÙÙ½ͼÏÔé‰ñ5ñ·¡È­ÄµØƒÖ“Æ«Ú÷Ú߈¿ºÁ½éº߈ÜñÏP匿NÁ‚ˆ™‰kß [ïS«ÔµØăơ±»ëÖơ™‰kß [ïSÄԵؽöÁ«ÔÙŒë*«½g¡¼ăˆŸ;Û«‚ ½9¯ØÙ½¾¾ĂưÀ©ÇÙ½ĂŸº˜‡8¤‡×ĐÄê÷ÙÅ—¶¹ó½€ư“‡ŒĂºç̉߈¹Á¹Úƒ¾‘Ù½…»ù×óüÁͺ¿ß‚vóÇ÷Á™‰kß [ïSͼÿÚ¼‡ÏÅöÛ«‚ ½9Í­Hƒv„Óº­ÄŸÈ∽؛‡éêŸ̉ºÙÚ÷‡ß½ö§ºè¹Ú«%ÏÅÛ«‚ ½9“Ç«‡“Íjå̉ ưÀ箕½»q÷Á÷å5ÓĂÙăˆŸ;”Ö:§ô÷ÁƯ‰³–½°»—»ɇÑÄë«»ƒÖɇׯÑÄëÛ«‚ ½9µaÁ̉Ùà™‡ÍË)éÛ9¥ëöµ†‰¿Iù‡î½רù×ư“ñÚÖ¾™‰kß [ïSƒÛ×ß„ƒˆÙÚ•½½ÿÚ™‰kß [ïS÷Á™‰kß [ïS–߈Áõ†µØ¿ôØŒê*ª‹ÓăˆŸ;ñÓ·Åï²2Ûº¤ˆ\0×áöÿ±»Îԥ⽀ĂÙùסÈÅô‘ ‘´Û«‚ ½9Ç̉ß»ûщơê…Û̃ˆÍÄ©½ÑÓÙÚŒºà½;™‰kß [ïS³1ÓÅ¥‹¹Ú’Ƹإ%©À™‰kß [ïSׯ߈‘ˆÙÚ́º/·ÔÓÜøêÛ«‚ ½9ùêçÇÛ«‚ ½9ƒv·ÔƠXó½ĂñÖăˆŸßfщ°»½Ă£XÊÈ9 ăˆŸ;ß»û߈ÑÄëÏÔă½å̉ ưÀùê‡̣‹øǼ«ÚËÉ9½ï½ß„ûÓơèůƒ« +>½ö©‡¥2ßëM·‡‘×8ç8¤‡÷9¥‡“ۋǵؙ‰kß [ïSí—GÏÔ™Á₫§¡ØĂèÛ«‚ ½9›Ôù×ÓØăˆŸéÁ9¥‡Û×£ ÿÚÿ¯¶ưÀçƠßÖø×äơ©¼ă»¾¿ ¿»«‡“ÍjÍË)éÛ9¥ù×ĂôưÀÙ×»ü‹Ç÷Á½Ñ·ƒˆÇ»цÿÚÁ̉ß»ûÓÆ±»Á¹ù×ÄÓ ÓÅÿ¯¶µÏ߈„ÿÚ€º«‡“Íj‡Œ©¼£Ç%ÍË)éÛ9¥áÛ—ˆ©Üă½ÍḈvÛ¹†x‰ÔÙ̉»ÓÎű»»ôÁ¾¿ºâà ĂàíÆï½ø××¾¼÷Ú9¥‡”Û×9¥‡Æ̉ăˆŸ;ùê½÷ÂưÀׯ±»³ºó•½Ï̉߈ù׫‡“Íj™‡Û×߈רç½ĂÛ«‚ ½9±»•¾Ÿ}»Ø¹ÚăˆŸ;±»Á¹Úß»ûĂÙ¸Ú¶è±»™‡Ÿ}Ù½¹ÚÁƯ½ײăˆŸ;—¶«‡“ÍjñíÈ·Úù×±»ôÔÅĂÑæ¨‡¤2€̃êL %Ïūԙ‰kß [ïSÛÀŽËÖ£»öÅØ±»ôºù×¶½€º~—¾çô—¶ŸÛ±đÊÙƒv›·Ô‚½ÁÓ½‰̃ƒvïƠưÀ¡Û߈á «‡“Íj¯Û¨Ø½±»±»ø×½‡ưÀæÚרÇí·È¿ô±»¡Ơ×̉9¥‡ë@±»âàÎŽ™‰kß [ïSÏű»¬¼¼ƠX±¿ÅÔơ¿«Ô¾ưÀ±Ô»‹›¶é±»ơêôú¬ÖƒÚ±çô‡ŒÅØÛ«‚ ½9íÖ‘™‰kß [ïSÏ̉›¾ù×½˜êèäÙÅëÅØÅØ™‰kß [ïSÏ̉°»ơÄăˆŸ;‹½¡Ù¼€™‰kß [ïS‚½ÙÚ™‰kß [ïSÇ̉Á½™Ó߈»Ø²Óƒv©Ç›¾”ÈúÍĂÛ«‚ ½9߈£ÔơÔ¼ÔĂƠ°È ¸£Rµa£‡ú̉'±»¶‡Ö8曾­ØÍË)éÛ9¥ÑÓù×÷Áç$ÁƯˆ’ô½ÈáêÿÚơê½ù׿߬ÖăˆŸ§ÔƒÖ¡ÔÿÚçÿ¯¶ÅƒÖ¡Á‹öưÀơèŹګ‡“Íj«Ôù×ĂȺ߈ÙÅë䌾Nù׃vÇØ×Û»ØÓÅ«‡“ÍjŸ}ù×°»9¥‡ƒØăˆŸóÇï½ÅàÅØÄÔëö«‡“Íjâà8 ¤‡ Ö“ÈÂÙ³ƯăˆŸ;k«»¡Ô‡(«»»ÅăˆŸ;Û×ơë,û(߈ÿד۱»÷±»ƒv9¥‡Á̉·‡‘×8çëöÏÅ…£­É9¥‡×ÍÓ¡Á…Ô߈ÁƯßÖ̀ÓóÇ߈§ƠÂÙå»·Ôëö߈•Œ‚vù×ÏÄ.8¤‡Û«‚ ½9œ‰¾IÇÖ÷¼ï½çô›¾¦́Û«‚ ½9¾ÅơÔ·‡‘×8癉kß [ïSß»ûÙ½î½Ï̉ƒ×ù‰³ÂÉ ëöǼẳÇÖ‹ÇçÚ¡Ûù×ÁÓÙڋ܃ˆÖ­Ä߈ĐÄê¿Ø¯Ç»µØ9¥‡ăˆŸ÷Á™!ĂÈ₫®¶ºªÚï³2±»éÓ©ƠÛ«‚ ½9½ÈóÇÛ«‚ ½9Æ̉öơ»°”¥Ù¹à«Ó¾º›ÚÏÏ̉ÑÓ·Ôƒv჈‹ÇÅØÛ«‚ ½9æơ߈ÉáØɇ­¾ù×ÏÔ²(߈߈߈×Ӈǰ»àê ºíÆÁƯÛÄÓÏÔăˆŸ;kí—G߈å̉ ̉½±»Û×±Ô™‰kß [ïS»Ø™Ó¥Ø—Œă¶Åß½³₫ ®¶ ß„¿ßÁÛÓ̀‡Œß»ûχ„½•ŒëööÛ«‚ ½9ß»ûØ×ÿÚ³Âï½ÿ×¹½ÓØ9¥‡…»ưÀ¢Çºêö½ÅÓóÇ£Ç×ÜÛăàù×ôêÖ¾°¿9¥‡¡Á÷Á“¼ÙÚµØ×¾§ºƒv⽡Ơ·‡‘×8çϼƒÔăˆŸ­Óᙉkß [ïSöăˆŸ÷Á½9¥‡·Ó ¥0ï½ăˆŸ;˾߈9¥‡×ö¹¶½ưÀﻇÇׯYºØÛÅèê ÑÓ½ôñÚ¹Ú±ëØÿ¯¶¥ˆ]1ö›¡×ƠÓ̉À ™‡ï»ÿ¯¶ƠºÛ«‡“Íj‡ŒơèŽëö±»߈±¿ĂÖ¾Ù½ơê9¥‡×…Ơ»ÈÛ¾ôĂÛ«‚ ½9ö“ÅÛ«‚ ½9ÓÅ߈ñÚ±»öÁ«‡“Íj™‰kß [ïS‡Rß%Û«‚ ½9߈°»Û½9¥‡Ûº‹ÇÏԵػ9¥‡ƒØÏÔ›¾ĂĂYưÀùêíº³Âí—GÖÔ†6¦jÛ™ôéÔ­Ö÷Á«Ô›¶é±»‡×ñÖ˜ô·ÔÜÓµñÓÏÅŽăˆŸ;ÏÅÍă«·3uU”ư‡±ù1‹Ç¹Ú‡ñÚăˆŸ­Ä»ËÉ9¿ºº‰ø…»ĂÛ«‚ ½9Û«‚ ½9ëöÂÙ—»÷‡߈¯ƠÛ«‚ ½9߈ỞùÚñ§ÓÓÆƠß»ûÙ½ç'ׯÿ¯¶ÅÔÓº¡öŸ}×¹ùơ߈ÙÅëù×íÆÁ½™º•Èû›ÿ¯¶ƠÓˆ•=‘ơÔ¸ÚÙÚù×ù×ù×¾ƒˆöùæ´aÛ«‚ ½9Ž߈µaÖ¼‰±6ívùêƯ‰«â“Æ£ôÅØ³à¥ñíÈÏÔÑĂÇ֧Ʒũإֽ€«‡“Íjëö·zçÚ߈—Œ—¾ƒv±½½™€ÅØñÚăˆŸ;“Ơ«‡“ÍjµØéơ©ÂßÄÙ¹Ú¤ÓǺ«‡“Íjåèµà¦ÓưÚâû(‡ºµØívùܵØÍƠ¿»̀Ó2çÚáƠÍĂÿ¯¶Ç²Æ+ă»ÇÓ½Ͼ¥O±»ĂÙÏÔ½ÏỖˆÛ«‚ ½9±»Ó¾ÍË)éÛ9¥‹²߈ëöǰßÄÙ™‰kß [ïSϵÙÅëÂÙÏÔ·ÈĂ퇩ƯƒvùוÛÛ«‚ ½9‡º×¾8«‡“ÍjăˆŸ½€Ñ·™ív‹Ç½€˜‰j̃ZîS«ÔÛ«‚ ½9ó¾̣Ç™‰kß [ïSö¥ĂơħÓÿ¯¶ÿ¯¶«‡“Íj¶±¿•&Ïű»ơêë×ăˆŸ;k“ÆóÓ‹ÜỞÛÀ‚vƯ‰™ëé嵨‡Ú«‡“Íjù×ñÓÛ«‚ ½9É̉·‡‘×8癇¹ÚăˆŸơÛơê‚Ø +™w߈—»©Ø«‡“Íj½½­Ä«Ô­€’Ơ÷ÁÓ¾ؽñƱ»üØÙ½Ûפ½Ô8¤‡×íÚ÷‡„Øù×±»Û«‚ ½9±»áÀÏÄáwĂĂ ›­±àéM™‡Ơ½€¯´†¹ÚµØ°¿ËÉ9öƒvÇĂÛ×ơê³”³ô‹µ.¥ÙÁ̉½»ÁËÉ9ËÑ÷Á´Üơê±ØăˆŸÍĂ£Ø߈«dåÁéÓ›Û­Ä«‡“ÍjËƠ«‡“Íj̀Ê)èÛ8¤«‡“ÍjºØƒv©ûØăơÏ̉ăˆŸ;×Ơñ…ôソ»ưÁÙÚÙÚͽÏŧԥÁ†Ç·‡‘×8ç½ÆáêơÔªÚ … ‰₫ÛºÙŒë*«±»µ‰¹Ú«‡“Íj«‡“Íj‡̣ÏÔ¿ô° êØ ¥ØªÔ°¿¨‡¤2€̃êL›Û9¥‡û(·Ó ¥0·‡‘×8çÑÓ•ÖóÔ™‡ăˆŸ;8¤‡ÖµÀưÀÏÔÂĂ ¿ÅÛ«‚ ½9¾́½ăˆŸ¡Ô©‡¥2ßëM™‰kß [ïSÅÓµa¡Á‹Óêơíêÿ¯¶·̃çô©Ó™‰kß [ïS¿ôŸèö³B—ÓÏÔĂ¼—ŒƒvĂÙù×ù¾ơÛƯ½ĂÈô꾫‡“Íj¹ÚËDZ»²¾‹ƠµØ¸Ú¾¾ÀƯ±¿“ܱ»å‡ëÑ·§¹ÎÔÏÅÛ×Åàù¾×˱»ñÚÛ«‚ ½9ÏÔ°»ñÓ¡Ô‹Ç¿‰ÿ¯¶§ÔŸÅ¾ËƯÿ¯¶Ù×߈û(ٽσṽˆŸƠ®GøăˆŸ;•‹HñÖÍBÀĂŒ¾ăˆŸƒ¾‘½¹ÚÇÓƒ߈¿‰³íÊàщƒvßÖ½ÉÖ“Ơ±»ÏÅÅ«ÔưÀ™‰kß [ïS±¿ùêÁê¹Úôê±”ùêêö½™‰kß [ïS‘·Å™‰kß [ïS«»ÍBÅÔÎÙ„ö£äÙÚÁĂË̉·Ó ¥0Åô©Ơ™‡ÏÔÿÚ™‰kß [ïSƒvéơÈ̉־£ ïÎăˆŸ;k§ÔÁ©ØăˆŸ;óÄÏÄç̣Á̉ĂÙ¡ÙÚ«‡“Íjù×g½Ó؃¾‘ÏÔ…»ù×ûëö¥Ï¶ + +¹ÚÑ%ƒÔĂ¼ơ꫇“Íj¼€ƒvÿ¯¶ù×—¶ÑÅëÚ«Ô±»ÇĂ´˜êèä•ÇƠÜù¿¼ÔÛºÙ½˜ÁƠ·‡‘×8ç×̉÷Á¿ÅÑØ÷Á—¶Ù½Û«‚ ½9Ï̉¬Ä »8¤‡ªdÂÙÁ‡é/×:Û«‚ ½9ÓØ›¾ív•×߈¼€ơèÅăˆŸ;ó‘Öí—GÚª‚ +¼9¢`ûÙ×ÙÅëµØ™‰kß [ïSµØŸÖ½™×¡Ă·Ó ¥0ÅØ̃„ ¿‰»ÅÛ«‚ ½9‰»ÏÅçƠù×Ư­ÄíÁ…̉ÏÔÛÄÓâà9¥‡¹áu‡ñ5ôîƠçÚ˜Á Óű»­Ôͽ“¼ëåĂ½·‡‘×8çµØ©‡¥2ßëMÓÓơêƠXƒˆ£Øó»Ă™‰kß [ïSµØ‹Ü™ëéåÏ̉«»µÜ£äù×9¥‡Ăº½«»ưÁßÄÙưÀ߈Ö¾8«Ô²Â߈ÍÄáÆÇ»₫Æăº«ÚûÙÙ½“ƠÛ×ûÓ¡ÈϼÚª‚ +¼9÷¼ë“ȹڻ‡øêĂº÷Á›¾Ô…&ñÆ™ÓïÚ·‡‘×8çÔ ™‰kß [ïS›Ú°»ÏīԥàרÙ½‹Ü˜êèäÓØưÀ©‡¥2ßëM‰Û¯‰¯0ăÂùêœÜ£ÓËÅ÷ÁçÚÅØÏÄívÛ«‚ ½9›¶éÛÄÓĂăˆŸºƒÔ‹ÇÁ±¿‡Û¿èÉ)«‡“ÍjÏ̉ƠÅùׯÖÁ̉±)÷Á÷Á÷Á©ÇóÔëöûê€ƠÁ䯕%úÄÏÔÁ¾ƒvÂÙ­Ö›‡Æ"ăơ÷ÁÛÄÓ߈ĂĂÙÚ—Ó¸Ú±»ăơ3Â߈ó•¨á꛾ƒˆÇÅƠ™Üù×ăˆŸ;ív›¾‡Œ™‡ưÉ߈ăˆŸ;k—ơØŒê*ªá̀° °Å[[¯È‰Ä§Øï½±»í‡–¾߈«‡“ÍjÀ̉₫̉¹Ú×¾µØù×é¿¡Ôÿ¯¶ăkß [ïSôꙇ°»ÏÔ¥Ó—ÓÛ«‚ ½9™‰kß [ïSóă麈öÁ‹Ü±»¡Ô¡\ùêÓϼ÷¶«º߈›¾̣ç¡ăˆŸ;ÏÔÑÇa«ÔÀƯªÈ‰â½Ô×ƠÓñÚÓØµƠµØÏÅË̉•ŒÛÄÓ×¼¿‰½ÓØÑÅŽẹ́ÂùêÏÔù×óÓ«»Å±»ơê©ÇơÓÆÛ«‚ ½9æ̉Ï‹Çؽƒ×ăˆŸ;Ù׿¡§Ă߈ÏÔ©º±ëر»ăơÚª‚ +¼9Ǻư¿½ôº¶ÇÖ÷Áù×—¶µØô«‡“ÍjÁưˆÇÖ½€Ù̉™‡÷ê¥r9¥‡å̉ ¡ÑÓËÉ9¯×‡xăˆŸ;k—Ó­ÄÏÄËӷů̃—˱‡ñÆĐÄê嘾Üơ{‡ºϼ«…»¡ÔơêĺơÔóø£ÓƯ‰ë́Ù̉›Ú᫇“Íj÷Á©߈áêºƯÓ ÿÛ“Ơ½¼Ă퇓¹ƯN‡÷Á£ÇçÚ“¼‡£ØÛ«‚ ½9øæÚ ùס۫‚ ½9®Ôäô¾ƒëöÛ×Ϻ™‰kß [ïS߈ÙÚ«ÔÚª‚ +¼9ÅÓ±”•½½ô«·3uUº«âƒÖĂɇ¡€@ÏÅăơŽÏÄÏÔ‡ñ5ăˆŸ;Û«‚ ½9₫®¶Ñ íººØÛºÏĭı»±»ÔXæ¥Æà¬ ƒÔŸóó¶¥Ûöøêïiù׃ˆù×™ô†º©Ç»n󱻜Âÿ&ç +ù×ɹÚÙ±×Ơ™ơùêÇ蓹ƯN˜êèäÛdz‘—²ù×ÿ×߈ÄÔµ°ê؃½áöăˆŸ;«·3uUåÖº‡››¶é9¥‡÷ÁâḈ¥»ơ?ÏÔÏÔµ†±»¸àϤ™Ô’Çß»ûëöÿÚ·¸ăơ£X·§D Ù½µØ™ëéåÍÛæđ§Ô‰¿I‰đ›¾½ăàÚª‚ +¼9¬ÖÓØëö­Ơ¼ù׺µØ›¾¿‰ơèÅÏÅËÉ9ÇØ±¿ăˆŸ;k÷Ù«‡“Íj¹Á£‹9¥‡ÙÚøêåÁù×ÑÄ냈ñÓщÙ½ÿÚăˆŸÑÄëăà₫ڸڑƱ»ɇµa™ôÅØ²Â×Ơ†7§j½µØñöơÔ£Ư›¾Ăv“Ẵ»ụ́ǟņ“ôê9¥‡9¥‡×¥›¾ɹß»ûưÀ«‡“Íj±ëØ߈¿‰å̉ ƒˆÑÓù×»ÅÛÀ´†±»Æ˜êèä£Xå̉ ½¿ô߈…àƒv½!ÑÔÓ5“gesÁÅÿ⃈®ÏÔ¹Ú›‚«‡“Íj™‰kß [ïS×Ơơ꽯דƟÂÚ™‡ߌÛ,±»¸Á™‰kß [ïS›‰Î̉Ê¿°»ÇÅØö÷‡²”åĂ»Ø•Œ߈‡ÚÙÚщåĂ«ÓÍB§ÔÙ£ä‘ơ·Ø߈™‡éÔöûØ¿ÙÍÜĂă±ơê¹Ú÷‡Û×±»ơê«·3uUƯÓ ½ËƒˆéßÓÆ½™Ó¿»ëö߈àêƯºÙÚ‘ÓÙ×—ÙÚÿ¯¶ÛÄÓûØÏÔ5ÑÓăê³ “Ơ›‰«ºöơÏÔíê߈߈ƠÑÓÛøÆ߈™‰kß [ïSåÁ¦ÆûB­ÄÛ«‚ ½9ơ꫇“Íj«‡“Íj±»‹Ç‹Ç̃ŒÚ,ǯ´ ÁÙ«‡“Íj“ƠªĐÉ́v¡Ôëöử·Ü½Úª‚ +¼9ÿ§¯¾ªĐшëÔª‡’̀jÅ߈³°¿Ư‰ơêÇÛ¼ÔÏÔ߈ƯÓ ăˆŸ;óÇ¥íåƠ›¡ơê‡9ÇÖ¾Û«‚ ½9‹Ç›¾‡ÚëÓơÔĂƠ„ø ¿ºÑÓŒ߈߈ó¶ƒvÑĂ߈÷Ú¶è­RöåĂ˜‰j̃ZîS·Ó ¥0ù‡ÅØ—Œ½ÏŽÔƯ$ǧéê°»߈›Ú¹Ú£»ÙÚ²ÇöăˆŸ;™‡ñ̀ÏÔ™‡­¾®GøÙ½Ï̉ÓÛÍË)éÛ9¥шψơÄ™Á‚×ù×ơÔ›ÚóÇĂÈ«‡“Íj¡Ô‰¿I™‰kß [ïS™‰kß [ïSÙ½₫Ô…ƠÏôơÄõ.¥Ù˹¡Ôå̉ «‡“Íj‹Ü™Ôû߈±»Ú×ÅôĂÙÿÚ°»çÚ8¤‡ưÀ«Ôù׵رȽ‰Û«ÔщÙÚ™Á‰¿Iå̉ ƒˆ¿ºµØÆô™‡¼ÏŇ䙉kß [ïS°”¯‰¯0£Çc™‡ĐÄê±»Áß»û¹Ú½¿‰Ël©‡¥2ßëM½˜Ăùô«‡“Íj¯¼åƠÛ«‚ ½9ơê™ëéå±»ûƠÇâß»ûÏÅ€º›Ú˜ÁáÅí—G«‡“Íj™ÁñÆÏÔƒv߈Û«‚ ½9ûÙÓÔ›¾Ù½½€ùÛÏÔÍÇ™‡Ăôï»ñÇăˆŸ;ơö½ŸÈ‰¿IáÇÖÅÔ¹¼ØÏćŒËÇùêƯ‰»Å™‹¦Æ©&Ăك؃v‡×ÅÓÁ̉ù×Ííª»Û«‚ ½9Á̉Á¹¿ô߈«‡“ÍjÛ»÷·ÔÄâ ƒăơ÷Ú½µØä‰«ßûÓ¾ ăơ¿ÅÅ”ƯÁ«‡“Íjó%«‡“ÍjƠ·Å„n±»™Ôơ»‡xëÓ«»ÏÄÛ×™‰kß [ïSö“í߈ùꙉkß [ïS‹ÇăˆŸ;Úª‚ +¼9÷Á󯼽€¡ÈÏÔÙ½ƯÓ ÙÚ߈öÁ«‡“ÍjăàëïÙ½ëöù׺$Á܃ˆÅ‡¦ÔÂ÷ÁÆ»™‡•Ç£ÇƠÁÙÚäôëƠU±»ÍÓĐÄvêv™ÉÖ¾÷Ôï‡ăˆŸ;âˆ÷‡¾™ÓéºÍÓºÛ«‚ ½9¯È‘ơ½¯Èç'ù×§Ô¶°»½»½ưÀÄÓꇺĂÙÛ«‚ ½9áêĂÙ‹È™ÓáÛ߈ô£ØëÓ8¤‡ëöå̉ ¡Û›ƠơêưÀßÄÙÓôÁ‡é/×:¹ÚÁ‡é/×:ỞÙŒë*«±»‡~éI˜ ê è ä ·Å₫®¶‰y³Â¬¼¼Ä«»߈Ù½Ë̉–»ŸĂ‹Çö߈¥ˆ]1ÑÅơÔÅÓ«‡“Íj“È™Á£–ï»·§D ½ÙÚ·‡‘×8çăÚÑÓ׃vÇÖ•Û÷ˆ©›ÂƠÔÙ½ŸÖ¯È‹»«Ú›¾©ºÏÔ¶ØĂ‚v”½‚váçù×ëöưÀ¤Ó™ØŸÅÏÔç̉ùêù×äÁÇ̉ÑÓ¡’ŸÏ• ½¯²Øç؃¾‘Ë̉ßÄÙưÀÛ×µÈÛ«‚ ½9•îÓÆ¥‹€àĂ™‰kß [ïS°»›¾™‰kß [ïSâ½½ÁĂׯƠºm·¶ơêÿÚƠº߈ù×”º&“Æ«‡“Íj½€¼®×ï‡̃ Î ©†«‡“Íjö߈߈êÚÿÚ³z˹ăà±»«ÔIÁĂù×ḉ¥ˆ]1ƒñ»Ø×Ù̉ÏÔê˜HÏÔ÷ˆù×½߈µØ—»̃ˆĂÙÿ̉¾µØ¶Å—»ûËüÁÛ«‚ ½9ׯçÔ¡ÙÚ©ÇÙÚ»‡5«·̣‡ŒÛ«‚ ½99¥‡‡Ú ¬°àèMù×ö­•·ÿ¯¶›¶éóÁÛ—¾…Ơß»û‘ÆñÓö•©÷ÁßÚùסÈằ¥‰ÍL…¿‰ß»ûÑÄ듺ëö±»ÑÄëÏųzơêơèÅÿ¯¶ƠëöѶăˆŸ;kĂȽôÅÓÿ¯¶ñÖ•Œ™‰kß [ïS¿‰¹ÚÍÓ½Ô¿‰ëöÛÄÓ× ½›¾½Œÿ†ÚỡѹڃˆÏÅ麙ӟ}ÏÔƒˆ›¶é߈—˜ÑÓàƠ¯¼æÚ«ÔͼƒÛºăˆŸ߈ëöŠະ»ÂÙÙן֥Á߈„Ø·ÔÙÚœ‰¾IăˆŸûư‡±ù1—¶ĂơºÁ¹¹ÍăêđÓÉ̉«‡“Íj¹¾ÛºưĂÏÄÑÓơÔ©‡¥2ßëMßÄÙ›¾½¿ÏÔ±»XƠîÙŒë*«½€ª»/щ߈ù׿Á‡é/×:ăÇí§ÈÛº̀½ËÉ9߈ÛºăˆŸ“ÛÏÔ¿ºÖ¾8ù¿÷Áùל}ÑÓ¥ˆ]1÷ÁÛ«‚ ½9½ă³ôï½¹ÚäôăˆŸ;k‡R…àϹ‡ÁĂÛ×µØÅÔỞ°¿™‰kß [ïSôÍË)éÛ9¥ô—ØóǓȡԫ‡“Íjù×Á|ÅÔÙÚ½±»âơ«·3uU™ôÛÇÖÑÓŸ\·Å°¿í—G±»ÑËÇ߈Ç¢Ở©Ü߈½ÙƠ÷±»₫®¶›ŒưM™ëéåỞƒˆù×±»ÿ&½¼™‰kß [ïSרƠÄÿ¯¶¡ÔçÚ߈Ÿ»ó™‰kß [ïS¯È“ƠÙ½ÙÚѶƯ’ÆÏÔ9¥‡ÓØ·Åù¿ÿ¯¶“ȱ»º¿»½ÔÏÔ©ÓăˆŸ;k™ÔƠÑÄëƠ äơؽ×—»ç¥ˆ]1Úª‚ +¼9ÁƯç©Ç˜‰j̃ZîS½̣ăˆŸ;˹Ù̉̉Åù×Åô›ÚƠϺƠºmëƠUœÁ߈»ôƒv߈ÏÔ߈±»¾Ă ÚíÖ߈å*Á¹̃ˆ©]°»ÇÖǼù¾™‰kß [ïS™‰kß [ïSơêÙÚ½ÏÔ«‡“ÍjÁƯÙ̉ÚÆơÔëö–ÛÛ«‚ ½9“ÈỞ‰å̉ ₫¶§Ô™‰kß [ïS¥Æëö·‡‘×8癉kß [ïSÑÓă꫇“Íjù×­Ä߈¯EÛ«‚ ½9ĂÙ¾»/Ơé­*•RËÛ†wºÅñÁÖÆëö¥Æ߈ñÁ™‰kß [ïS£XÁñ»¸Ú›¾Û«‚ ½9ÁƯƒˆÏ̉«‡“Íj­ÖƠß»ûù‰ßÁ™‰kß [ïSô» +ÿ$‹ºÏÔƒØá¬€©‡¥2ßëM­¾·Ô߈ơê½ÔƒÖ·ºăˆŸ;kăÇíưÀÙÚ·ÚÿÚ¼»¿‰°»Á̉™Á½Û«‚ ½9¿‰ù×¢Ù½Ÿ}˜‰j̃ZîSÉ̉Á̉ĂÙ«‡“Íj™‰kß [ïSïÅø×ÇÖÏÔÛ«‚ ½9ĂÙ÷ÅÏű»ùןÖ÷‡ăàëöỔ¤È£ß³ßÄÙ©‡¥2ßëM“¼ÏÄ•{«‡“Íjåơ߈Á ×Ơ†7§j˜‰j̃ZîS߈÷ÁÙ⥂ƠÁăˆŸ;ÏÔ«ÈÛ×·ÅÑÓ‹Ç­ÛÁÆØĂÙ±¿ăˆŸ;̃ˆÙ×߈¿ôÏÔ¹à½ơÔ¶—¶ÛëöÛ«‚ ½9ëׇ̉›Âù×ư“ùר¼ßÚ%¦º‡Œ·ÔơºÛÄÓ¬Ö ÇÖ¢ÇÛ«‚ ½9…ÖĂÙñÖ—ˆ±»‰¿Iâˆ:“Ơ¹Ú£ÇÏÔ«‡“ÍjÁƯ¢ÇÙ½‡º³ØăˆŸƒÖ˹‡Ú߈ăˆŸ;™ÔƠơÄ8¤‡Ö×ƠăÁ±»¹Ô8¤‡×½“ÆÛ«‚ ½9ƠXÛ«‚ ½9ªÚơêµØ±´•%ÿÚµ½߈­½¼÷ÁÁĂÔXÛôéÔƒ¿åƧԃvƒˆÖ$öÁ¡¥Ù̃ˆÛ«‚ ½9Óű»«‡“Íj߈8¤‡£í¬Ö¥ØíÚ Ëû­ˆÛÏÅ©¼ĂÙĂÛ«‚ ½9ù×9¥‡­ơß»ûÏÅÅ‹Ç$¯àáêơÔ‹Ù߈¾Å¿‰Ơ1”Ö@8¤‡×›¾¯G‹øщù׳äÏ̉ëö¾©ØÑÓö–¿½­Ôª¶2tTÓØñÖ߈ăơÏ̉“Ơ±»ÅؽÏÔÛ«‚ ½9Ûº½€ÏÔ¾ù×Ç̉Û×Û«‚ ½9Ơív›¾ñ׋ȇºù׫‡“ÍjïôÙÚÛ«‚ ½9ƠÑÓù×ĂÙ¹ÚÓ¾½÷ÁåôÅØâ»˜Á«È±»°»÷ˆ…ØĂĂ ›­±àéMá$9¥‡½½€Û«‚ ½9°»™‰kß [ïSưÀơêăˆŸ9¥‡ăˆŸù׫‡“Íj™‡Úª‚ +¼9“Ç߈™Á˜‡ó¡h½êØë×ßÄÙ™‰kß [ïS¾íÆÑ±»÷Á—¶Ç»ùêĂÙáç˜êèäù×ĐÅÙ̉‹ß:³ǼÏԪ܋ܟó´ÅÁ׫ ©ƒ»5¹Ú—Ö÷‡ÏÅƯÂơÔÍÓỞñ¿ºÑÄëưÀƠXÛ«‚ ½9ÿ ÍơèÅÛ«‚ ½9Û«‚ ½9·‡‘×8çÙ½«ÔÏÅ÷ÁñÓÑÓ¶»Å½«‡“Íj» ÁÙ׫»¯ÛÏÔª»ŸÅ±»±»£äĂÙÏřӠƠ½È ŸÈ™ÔÙ×ßÖăˆŸ;ÄÄơÔăàщ©ÓÂÚÀ™‡áÏÔ‹vóÔËÓ†Œ÷Á“Ơå̉ ¾ƒˆÚ×ơÉÛÛ«‚ ½9¹Ú—ºÙ½ăˆŸÁ̉¹Ơù×ûƠÓÆï³2¹àƒv¾ñÚÛ«‚ ½9ÎÓÅÁ íÆÂÙÏı»ë×½ÍÓÙ½‡x­Ô—ÓưÀ…%†½ ưÀ–ˆëö¾ơ‡Ơ¾GºµĂºÛ«‚ ½9« ©ƒ»5éÚ«ÑÛ«‚ ½9öÛù×ß»û¬Ä»©Ç…à˜‰j̃ZîSĂ¼óßר­Ä™‡ăĂ3ÏÅÁăåסؓƔÔôẳ«º‹Ç™‰kß [ïS¹̃ÄÓ…«Ôù×ÍÓÓ¾¤Óû·‡‘×8çó|™‰kß [ïSÖÆŸÛ«‚ ½9ăà•½·‡‘×8çÑÓơÔ¾߈Û×߈ÏÔÅÄ«‡“Íj‰¿I³íêá¹ƠÙÅ뛡χăˆŸ¿Å„»™ÁçÇĂĂ ›­±àéMăˆŸÓăˆŸÎ̉ûÓ©¼å̉ ¥Ó±»Û«‚ ½9ơêÛ«‚ ½9ÊÚ›¾ô‡x›¾ÿ¯¶«‡“ÍjÀÙÚ©‡¥2ßëMÛ«‚ ½9₫ÂÙ8¤‡ơÔÙ½ùׇÇÍË)éÛ9¥ơÔÁĂÅØƒ×¦ôĐÅ“Ơ¯È±»æØ ±»ù×½€ÓÆßÅñÓ‘Æ÷Ù·{‘Æăơ½€˜‡ëö£Ø³ºóß“Ơ9¥‡ÏÄ·Ôù×Ù½ ÈñÓªÚƒ‚ÛÀ½ÿ¯¶»¾Ǻù×ç̉ŸIÙÚÓ¦ÙŒë*«î»™Á«‡“Íj´†%ív߈ÏÅ9¥‡ù¿ÑÓ߈ªz ëöÙÚƒv߈܇ºo¯¼߈§Æ¶è×$¾£äÏÔºÖÔ†6¦jÚª‚ +¼9Ăôß»û¡Ôç̉ăˆŸÛ×½€9¥‡×½ë‹Ôå¸Ë̉ÿ’щ¹ÚÏÔÚ»ö÷Áß—ˆ˜‰j̃ZîS«‡“ÍjƠÄöÁÏůÈÿÛ‹È¥Ûµ†ăˆŸ;kÍÓÏ̉™ÓăˆŸ;‰Ó·§D “Û߈Á½ï»›¡Û×ßÏ™‡Û«‚ ½9ƒv¿‰ÏÅÁƯ¿ºÏÔÛ«‚ ½9ơØä̉÷Á‹Ó­Ä™‰kß [ïSĂțۘêèäÍÄ˹ÏÅ—¶åÁéÚ™‰kß [ïSÛív´aÔơ(“Ơß»ûÙ½¡ÁđÆóÇä×½Ô߈«‡“ÍjơèÅ«ÛăˆŸ‡ÛơĂĐÄê©Ç¯×°»ăˆŸ½Øûă„Çù‡¬ÖÇÖ߈îųù¾ûӵر)·‡‘×8ç°»«·3uUĂ֡ȯɵÖÂÇÓÉáÛÄÓ¾»·‡‘×8窻ÏÄÛ×±Ç÷Å»ñơÔ¬Ä߈™Óéê™ø×™ëéåƠ¨‡¤2€̃êL“Ơù¿Û×éơœÁơÔÿ¯¶ä×ơ»ÓØ̉º9¥‡—»íÖƯÓ Ÿ}ÎÅơÔÛÇù×ÑÄë‹Üÿ¯¶³¹ƒàƠϺͽñÆÍćăÇçÙ½ùåƠƠèø×߈̃ˆÏÅ¿́óÇ¥ˆ]1«â«‡“Íj™‰kß [ïS̀›¡ơê Û›¾‹Ù«Ú‰”ĂĂ™‰kß [ïSùôëöÓÅÏÚ©ÇÙÚßÄÙù×Û«‚ ½9Û«‚ ½9„ØƠ¹ÚăˆŸ;ñÓ¹ÚÏÅöñ¨ºÙ×í—GăˆŸ;¡ÛÏÔëÔÏÔÅ¥ĂÙºÛ«‚ ½9ưÀÛ«‚ ½9‡Ç¶è9¥‡×®ö¶ë’©°ƒv¡»‰¿IóǧÔÑŹڷ‡‘×8çÏÔëöÅØ±» ÈăˆŸ;k÷Á•ש¼¸Úâà·‡‘×8ç±»‹Ç¯¾ù×ÔXÜ›¡ä̉…ÛÇÖĂ™‡ăˆŸƠóDZØïƠó…£ØăˆŸ;™‰kß [ïS£4²ËÓƒêö±»àÿ ¹à¼Ûº±™Û«‚ ½9“½µØƒvñÚ¯)…Í èºׯ¡Ô«d‰¿IưÀôŒEơ»߈ƒÜ§Ó—¶̣Ô ùׂvñÓû̉©à³·ØÙ½ù×ĂÖäÁ¯LưÀ¦Âë‚áÛÿ׃ױ¿ÅÔøÚ’Ç•™‰kß [ïS¶ÔË¿߈€ß»û߈ÿ¯¶ôÛ«‚ ½9•½ĂÙ™Áơê™ô£àăˆŸ;ưܱ»‹ÓÏÔăˆŸ;ëö±»ív Áÿ¼ưÁ«‡“Íj‰Ô9¥‡×g½ôù×ư&¼€«‡“ÍjëÔôỔºyö™ôƒvÙÜô½˹™ÓÙÚ¯›ù×߈ÎÅÙ½÷ÁơÔ×̉ỞÏű»Ù½Ù̉ơêщÁĂáêÓÅÑӓŸ}½€ºÛºƒ×ăÇí¹ÚưđרỞ¡ÁµaÙ½¼Èçđù׳“Ơ‹ÜĂĂ ›­±àéM•Èû›©‡¥2ßëM÷ÁơèÅ›¶é˜‰j̃ZîS‰¿IßÚ¹Úá|»yéêÍÄ߈ƒvá ùæ«‹á¾ó¶ÙàĂÙ« ©ƒ»5ƒàÏÅçºù׬ቝ0ÅÓ³Èä̉·ÅßÄÙÍÄ(Ë¿ÙÚù×ÅÓÛ×Ôơëö·ÔÑĂшÙÚ ½ËƠ°»ÑÓ÷Áÿ¯¶₫ÚÛ«‚ ½9°»™‰kß [ïSù×Úª‚ +¼9ÏÔ™Øóg±»ï ™ơå̉ Û«‚ ½9Û«‚ ½9ÙNׯ¼€ÍË)éÛ9¥”½ö¶ƒ½ívôÙÓƠÛŇäá´óǘ‰j̃ZîS¿(©È°»™‰kß [ïSưÀ±»©§Ô÷ÁÉŸƒvù׿¹µ¥ăƯơêöÙĂÍY¡È…ƠăˆŸ§ÔÆÓăĂ3ù×ÏÔĂÈö¬‡ªÈCÛ«‚ ½9Á̉á Ï=ÍÓ¸Úëö‹ÈÛÄÓÇÖù×Ó¼™‰kß [ïSŪ‡’̀j½ù×—øù×Ö¹ +ߦ‡…ÛÏ̉Ởª¶2tTÿÛûÛ«‚ ½9¿Øƒv’½¡Èà Ïŧô†º‹ÙÙÚŰ߈©ỢêöÏ̉›¹«‡“ÍjщÿÚÅ™ÓûÛ†Œ̃Á3¾ß̣"ívÊÓĂÙ™‡Ù½½€‡ù¿₫íÖé‰ñ5ñ·ù׳zöÔơÏÅưÀ›¶éÓ÷ÁÇôâàß»ûø¿Ở¿ÔăˆŸ;k•ŒÂÈÁ¹ÚÑÁÔÅØ×¿8—¾÷Á£Ø±»ĂỞ±»Ơºm÷‡ăÁ“Ơ§Ø–ŒÛ«‚ ½9»‡—Óù×ñ́ëöăˆŸ;ƒ×³ƯĂÙƒÖăƠû¼­ÖÑŹÑÓ‚v߈‡½‡Û«‚ ½9Å–Û«‚ ½9ưÁƒvÍË)éÛ9¥™‰kß [ïSÛºƠ´ÂăˆŸ;ùê“Æ»Ï̉½Ă£ä¡Ô‹ÇÏÔă»ñÖ·ØؽÙŒë*«ÈĂíê±»ƒv½ÑĂ¡ÈÛÄÓ‡×ÁÓÙ½‹Ç¿çÙ½÷ÁµØÙ÷ˆù×å‡É̉ù×ÍË)éÛ9¥£Çƒv…ÛÆ…¨¼ôơêÙÚª¶2tTù×ơêÙ׫»½…Ùù×ßÚ₫§ÔÙŒë*«±»Û«‚ ½9½ĂăˆŸ;‹ÜăˆŸ;kăˆŸÿÚÛ×Ó.‹ÇYÏßå̉ “È­ˆ™‰kß [ïS܃ˆ±»¹â߈óƒv±»9¥‡çÏÔÛº¸Ú‚v Ăô©¼ƒvÇ"Û«‚ ½9÷[ăˆŸ;«‡“ÍjµØµÜ±»¾µÁרưÀƒv›¾ÙÅë–¾9¥‡¾ŸÅăÁ¨ÀóÇ߈Û«‚ ½9™‰kß [ïSѶ¿ô…Öƒøơ ÏÔ˜‰j̃ZîS¸ÚÏÄÏšԃvËÜ¡ÿ¯¶Ù½±»¢X’DZ»“Ơ¯ÔÛ×ÿÚ—»ô¢Xå̉ ÅØ™‰kß [ïS¾ßYỂö¶ñÖ±»÷‡ׯ€ƠÏÅù×ß»ûăˆŸÙŒë*«¯È±»™ëéå«Ôà ›¾ËƠ½ơÅØƒˆ«‡“ÍjÚª‚ +¼9ëö·Ó ¥0±»Ù×Û×™‰kß [ïS÷Áđ¾áØ¡ÛëçÏÔ¡»«·3uUºƒˆ½™‰kß [ïS¡Á©‡¥2ßëM‹Üëöé‡ï¡Ûóш›Û©Ø›Û™‰kß [ïS§¹é‰ñ5ñ·ù×ÏÅ¬Ö ëçÔX™‡ó|Ù̉ăˆŸ;™‰kß [ïSù×ÉÁ¾ëö‰Á‰Ôô”· ‹Ü×Û¥Ûù×½ÏÄăˆŸ;ÙƠëÚ₫ƒvÍƠ÷å5ÓÙ½±»«»ơê¡Á©‡¥2ßëM¾½¹ÚƒÖï½Á̉ÙÚ¹Úù×¾ñÙÚ¾©ˆ™‰kß [ïSăે“ÍjïÚóÂg¥Èù×Û«‚ ½9÷ÚƠÏÔÓÓÏÔỞÍÄ«‡“Íj‹Ç»/ÛÀ‡º¹ÚĂÙÿÚù×Á¶ĐÅtƠßÄÙÙ×Á«­¾¹ÏÔº…Û߈ÑÓ߈½ÔưÀñÖ“™ôß»ûµØƯÓ ߈©‡¥2ßëM·‡‘×8çÿÚ£ƯÅÓ½«â—ºÛ×™ÓĂÎå̉ ±»“È»qÙ̉ưÀÓÔ»«‡“Íj›¾ÈĂÙ×£äơ곺óÍË)éÛ9¥¦‹‡Ù½º›ÚÂ$…ÛơĂÿÚψƒÑùקƸک)›¹×Ơ†7§j·‡‘×8çéơéºçỤ́×ÂĂëöŸ²Ñ··Ó ¥0ŸÅ9¥‡߈‡Ơëö‡ ËûúÙùÇߘ¿ơêơêÏÅëööÁ¼½§Ô«‡“ÍjºÁLø×ª»«‡“ÍjÅÔ„Ö«Ô˜‰j̃ZîSùôëö™‰kß [ïSÀ¹ÏÔÛ«‚ ½9Ăº«‡“ÍjƒÚöëö«‡“Íj%½€Ï̉ăˆŸ;ívÿ۵ؓèê¼öÁ߈™‡½ƠXÍ«ÓÅØÅÁå̉ µŸŸ}…'ơĂÚ×ß¿­—Û×ÓØĂÙÏÔÛ«‚ ½9™‰kß [ïSíêù×ꃘH  +ÓÔÏ̉Üÿ¯¶ÙÚùꃈƯáÛ̉ÿ¯¶ÿ¯¶ù×·Ô±ÁͼíÖ· ÏÔÁƯ¹ÚơĂ¡Û«‡“ÍjÛ«‚ ½9±¿ͽºçº‹Ç¹Ú±»±»·Ôá ÛÀçºßƯơĂ¡Èµ€ăˆŸ;©ÓïôóÇ‚Ú »̉ÛÙ½™ëéåÅÑÄëßƯº›¶é¦ô +™É¶Ô½‡x±½Ă)ƒˆơÛçÚ»ØÙÚ—ÓÑĂÏÚÏÔÛ«‚ ½9ÅơÄßÖÅÔưÀÙÚ/ÿÚ˹¹ÚÛÀÙY±»°»§áëƠUơêªÔ™‰kß [ïSƒ½Ñ÷ٽソ‰éêù×§Æ߈«‡“Íj˜‰j̃ZîS½Ă¿¹ÏÔù×ÙÚ™‰kß [ïSéÚÿÚ9¥‡á̃ƠÛ«‚ ½9ƒ×ù×ïڿšȾö½ív­Ä¡‹Ç³ÏÅœÜƯÓ ±)÷ˆ½Ù±»ưÀĂÖ¾»»ĂÏÅàÅ ù×àö!‡ù×ó¶¥Û‡Û«âÍÄ…Ơív•Èû›₫®¶×Ó8 ¤‡ ̉Øå½½ëŸˆƯÓ ßÖăơñÖ̉ăˆŸ;Û×™‰kß [ïS¹ÚÑÄë·ÅéÓưÀ‡Œ¡Ô¯Ôƒ¾‘„³zé‡߈ƒ×·Ü›¾ưÀ±»…ÇÏÁáØ‚ÖÁ̉œSûØÛÂË̉Ù½₫®¶ÛÚª‚ +¼9›¾±»ĐÄê½ñÚ»ˆá Á¹û¼ƠưĂµØ“¡߈ơÔ¡Ô›¡—ÓưÀ›¶é¡ÁÏÔĂÙ¯‰¯0«ÔÍÓ—¶ưÀÏÔÙ½“¹ƯN§Øº«‡“Íj‰Ô¶è½ĂÈÓ¹ßƯ×ÙŒë*«߈ŽÛ«‚ ½9¸ÚÿÚëö‹ÜƠÜ™‰kß [ïSó±»ÁƯ¼ôơêơê°»ÿ¶™ÁÏÔ€ë‘K‡ŒƒˆÛƶơêëöÿ$óÇ߈™‰kß [ïS³È±»‹ÇăˆŸ™‰kß [ïSñ×÷‡²×̃ˆ “ +—Œé߳ȫ‡“Íj™‰kß [ïSôêŒÙ½ëö«‡“Íj¾º÷ÁËDZ¿ăÁщ™‰kß [ïSóÔÏÄA½Ô¾ß ëö©¾ëö¤ˆ\0Ư$äÁ¿‰“Æ©‡¥2ßëM×ÏÅĂ’Ç›¹Û«‚ ½9ư‰¿IÁĂï»ÅĂÙóÎù¿Û«‚ ½9ơê½Ô«‡“Íj¡Ơ«·3uU·ëñÄö™)Ăơ꫇“Íjơê߈¯¾ÿÚçÚÏÔÛ«‚ ½9­Ä½¾Ăº³È¡¼ÏÔµêßÏ«‡“Íj½êö߈ܱ»¦Æ«»ƠXµØÀ̉ßÁ¾‡Ç½ĂÁ¥Æû̉Ûº¶߈ùê©Ñ£Ø•!ËÇ«‡“Íj§ÈíÖ“ +Ù½́vµØåÁÏÔÁ̉ñÚ÷ˆ· ĂĂ¼ÜϹµß»½öùס’öÁơèű»Ïű»ăˆŸ;öùơ™‰kß [ïSë™H›ÛùØæơ½ôÏŘù׿ôÑæ¹Ú߈ö·‡‘×8ç₫Ù½߈¦Æ +ƠÚ«ÔƯºö©‡¥2ßëMƒv%«»߈ú̉¾߈áóÅÄÛ×çÚÛ«‚ ½9±)™‰kß [ïSºƯ‰¹Ú‚›¾·Ôƒv°»¶è·‡‘×8ç₫®¶ÏÔ¢äơêÙÅëÛÀïƠ9¥‡ÔơÓÆ¿àÇ¥ºÏÅ·ÏưÀÛדƠăơ‡“¾ßơê£ ™º½ÆĂ¥ˆ]1ÇäçÚÛ«‚ ½9÷Áå̉ ËÖ™‰kß [ïSăà¿‰ăˆŸ;kñÙŒ½ ·‡‘×8çÓÓ³ĂÈ›¹±»ƯÓ ¼€÷ÁÆĂ·̃щ«‡“Íjͪ¡Á©Ơ¡ÛÛÆơ»äÁưÀ½ç‚“Æ›YᬃÚÙÚ¹ÚƠׯ©Ó™‰kß [ïS™ÓΈ̣׿尻ٻ™®ơÄïÂăˆŸ;«‡“ÍjÓ.›Ø×ûÓÇ»éơº²ÆѨ¾ºăˆŸÓ©¼íꇌßÏö½Ổź¾9¥‡™‰kß [ïSù×—½½«‡“ÍjÏ̉˜ÓÅôù×ï‰Y·ÅÛ«‚ ½9“º¡Ôƒˆï³28¤‡Ö«‹ívµØ¾ăˆŸ£äƒ¾‘ä̉ÇÖÍÄÔXׯå›·‡‘×8çă»¥ˆ]1ÿÚ«ºɇÏŧØÙŒë*«ù×߈ù×߈«Ô¢Xˆ;¢ÇÿÛ÷Ù‡Œ̣Ç Û×Ïĵa—ˆ½߈êơùºö»‡ĂĂÁËùëÓØ¹Úơº£XƺñÚ…Ơùט‰j̃ZîS­¾±»ËÉ9ù×ă»±»ñÓ߈µØÑÓÏų±»çô¥‰ÍL…Ù½øæ—»¼ëôëöË̉9¥‡ï»ùת-ÙÚÙ½‘ÆưÀ°»ŸƠ°»ù×ßÉ!™ñ¯È‘Ûơö Áר×Ơ»ØÊ₫ăˆŸ;ơ꺹ڣ`ÏÅÛ«‚ ½9̃„âˆ:j‹Ùăàï½ü“9¥‡’ÆăˆŸ‹öƠOÉĂ¹©Ç₫®¶ù×ù×°»çô‡×ÑÓÁ‡é/×:“߈ÂÙǼÑæăˆŸëöù×ø¾ŽÛ«‚ ½9ÁăØÎÅ—»ăˆŸ;À¹çÚĂÙÍË)éÛ9¥Úª‚ +¼9¾›ÔçÚ¶Åø×¾¢Xëö߈›¾ÏÔ¡ßƯÛ«‚ ½9™‡ôÇÖٽ꼹ڿíôô…»¼€#ăˆŸ;¾“Ç½Ă½€ŸƠÙÚíÚ߈ÖÇĂȇÇỞ߈ ÈwơêÍÁù×ËÓÿ¯¶¤Û©¼ùêá ĂȶÔ%ÅØ‡±‹È—¶‹Û‘®ăˆŸËÇăơÁăˆŸ;Ë̉Úª‚ +¼9Ù½Û«‚ ½9™Ø“½߈₫̉ăàưÀưÀƠëö߈™‰kß [ïSÀË́vù×ËÉ9ỞÓù×ÓÔÂٯȃvë§ĂËÉ9ùêÓÔÏÔù׫Կ‰½ÏÅ¿»ĂÙăˆŸ;½/‡ívÑØÙ׆º¹ÚĂÛÇ9¥‡×́v +«»Ï̉©¼›¶é±»™‡ơÔ‡Ú倧ÓÿÚĂÖ›¾ÏÔÅ»‹Ç×ÓϼÏÔ¿‰ÇÖưÀơèű¾ö«º¾¹Úψ±»ÍÓăˆŸ;߈™‡ÿ§߈¦ô»y‡—ˆ—¶½€×¾‹ÓÁĂöĂÙÓ ‹›æĂ¼Û«‚ ½9ƒĐæÉ̉—Œ߈›Ú¯Ôă཯Ƚ€ºƒv™ÁÛ«‚ ½9Û«‚ ½9å̉ ¿ºëÔëöÀ¹í—GÁ ÑÄë뜶ū‡“ÍjËÇ•á‡ÇĂ™‰kß [ïSÏÔù׫‡“Íj‹ß:‚v ©‡¥2ßëMçÚö‰¿I‰ÛöÁƯÿ‡ăơÎÅ ơÔÅ»ƒv±½Ûº¿́Óºî»çÚ¼Áơ꛾߈áê³Øï½ÜÓ «‡“ÍjçÔ¡8.¤‡.ÖË̉…Û½ĂÙ½¼Ÿ\µ†—¶˜‰j̃ZîS½÷Áé‰ñ5ñ·ƒàç̉±ôăĂ3›ÚÛ×㸙ÓÁƯ“ÈáÛ9¥‡®×­ºëö89¤‡9Ö‚v˜‰j̃ZîS×Ơ•º»‡¹ÚïƠ·‡‘×8ç­€öăˆŸ;™‰kß [ïS£Çׯáê¤Û±”“¹ƯNÏœȽ¨ºÔËÓơèÅËƠ·Å¯È´†µa›ï߈ăˆŸơê³ ÅÔ¡Á½ñÙǼơêú ÿ¯¶´aù×™‰kß [ïS“ƠẠ̊́×Ơ˜Ô½ơÔÍÄíÖ߈Û«‚ ½9ĂíÁ·Ô›¶éøæ™ơÁƯăˆŸ;k±»ÏŢȈ«»ơêô™‰kß [ïS÷‡Û«‚ ½9Û«‚ ½9éJé‰Ó5“gesÁŲÂÅÔ•à»ÁÔ©‡¥2ßëM›Ú«‡“Íj¯¼̀Ê)èÛ8¤ÙÜÛÀ©¼߈Û«‚ ½9¹ÚÁÚ—ºÛ׋Ǚ‡½€™ơéº÷Áƒˆ߈ăˆŸ;߈߈ƒˆ½ÏÄ߈—Ó÷Áçmáê¯ÍĂË̉µØÍ™‰kß [ïS‡Û“ÛĂÙ‚v¼À‡€è/Ö:™ôơê¿è‰yŇ9µaÇÅ›·Ô·ưëöù×ơèůדȰ»ÿ¯¶‡ºÿÚƯÚ·Ô¶è²Ø ÑÄë«ÔºÅ +Û«‚ ½9ªd½€£X­Ä«ÚÂưÀ­Ï¿¿‰«Û™‰kß [ïS£ƠóÂßÖÏÔ«‡“ÍjơƯƒÚÍƠÆïäƠ±¿«d½χÏÔÏÔÛ«‚ ½9ÂÍË)éÛ9¥ƒˆơ¾©‡¥2ßëMÓ̉Ă¼߈‹Ü©¼ív·Ø·ÔăˆŸ;ÅÔ¡ÈưÁ—Ïĵءԫd߈ùê9¥‡¯È±»ÏÔ±»çÚùר×Ưº¡èµØÓºóÂ߈ÓÅ›¶é‹Ç«zơèÅ›‰“ÜĐæ¿Ü÷ˆÅ–½Ô¬‡‚ֻ؛¾ÏÄ«»ĂÙ÷Á›·Ô½±»ëö߈µØ­Ä±»¸ÚÏÅ÷ÁÓŇڗˆ•ŒËƠ¼©Ó¡ÈÄăˆŸ°¿ÁÁëö±»ÙÓÙÜỞË̉ù×ưÀ¿à÷Á•ö߈™‡Ÿ}ëö̃ˆÏÔÿÛ«»¿Å¡Èƒ½ϼ«‡“Íj©Ó·‡‘×8çÏÔμ½¹ưÀ­È½9¥‡÷ˆÖĂëöÓ̉¾ÏíÖ«»Á½ùסصØÍƠ­ôơÔƠƯ÷‡­¹ÚÁù×ù×Û«‚ ½9ÏÅăˆŸ½ưÀù×á̃óÄ¡Ç×”ÇÛºµØûƠä̉ƒØñÓ˜‰j̃ZîS©‡¥2ßëMØÅïêïưÀϹ¾µ†ä×Û«‚ ½9ư“™Á¯Ơơêå»Ơ½ƠÏÅ“ÈÓØÏÔ™ÁϺÏÅơèŽđé̉·§D ëöÙÚ­€™‰kß [ïS«Ú—Ó£‡ù×߈‚ÖÂƠ« ©ƒ»5àƠô8¤‡ÍË)éÛ9¥ơĽ€߈øêưÁ·Ó ¥0ßÄÙßÏÑÓµ.¥Ù9¥‡­¶߈Ü»ăˆŸ;kăˆŸƒv÷ˆ±»»Û™‰kß [ïS¹Ú©‡¥2ßëM™‰kß [ïSëö9¥‡ƒÖÓØщ9¥‡×§Ơá ß»ûÁĂȭ§ԯG‹øĂÓÁñÓÁ¼™‰kß [ïS³áîéÚù׃v½ëöëÓ̀Ê)èÛ8¤±»÷Á«»ª‡’̀j›¶éÛ«‚ ½9¸Å…‡¿·Ôéꙉkß [ïSăÁŸÓ§¹±»§ÀרÇÓÇôñÚ‡Úᤓ‹Û«‚ ½9ß»ûƒvĂÙº¿‰Ó¾™Á‰ơơºª‡’̀j©À£ÇăˆŸ;k‚ر»…ÛĽ»È­väĂù×óÅô½€ïÚÿÔÛ«‚ ½9ĂÙ9¥‡±»“Ơă½ơº™«Ü¨Ç +º«ÑÛÔ¡»©ØÓÆÛ«‚ ½9ºù¿ÙÚ°»ÙÚ©ºßÄÙÛ«‚ ½9í—G˜êèä½ÓzŒE±»߈ĂÙŽÉ̉ߌÛ,Ø—ÓÇèêùê÷¡¿‰óÂÓ›Y™‰kß [ïSù×™‰kß [ïS”{ăˆŸ;¥ÆĂÑÏûƠ½ÆÜ½“ÈÙ½×Ó›ÚÏÅÛÄÓëö½ôÛºñÔăơƒvßÄÙơỖÁû‹™™ÔÏÅ÷Ú‘ÚëöÛ×ú(­Ä߈ửÑÓóÔ§ÔëÔÁĂ™‰kß [ïS³—¶‰¿I¬¾«ÈăˆŸµØ°»½€χ½‹Ç“½ºíêëöÓÓ¶è™Á¿‰°¿߈’¹ÜN‡º÷‡Ÿ}ăÁĂºÿ¯¶߈ÙÚß»û́ê¯àß»ûŽƯ µ×º‹ÙÏÔ±ÁµØÍÄ©‡¥2ßëM™‰kß [ïS䯵Ø߈Ÿ}óÇ‘bÁ߈‚v«ÔăˆŸÏÔ…¨Ç ¨,ï»ÙÚÓÆ°¿Ï̉ß»û°Å¨¨ö£ô³ívÉĂ Ơ ƒˆ»Á߈Û«‚ ½9ÏÅ™‰kß [ïSƒv™‰kß [ïSϼ§ÓŸÈƠ½ÔªĐăˆŸª‡’̀j˜ơçô•»É̉ăˆŸ;±»¹ÚÁÓ³Üëöù×ÏÔơêß·‡‘×8ç›¶éĂÙñÓÛ~°¿·¦D ¿Åö‹ÜÛ¾¡ÈÏű»á=߇ßÚÄØ±»˜‰j̃ZîS‹ÇăˆŸ;™‰kß [ïSÏ̉¡ƠÏÔÏÅóÔ½ׯÅơ»Ç%™‰kß [ïS¹Ú“È‹Á8¤‡×ÙÙ½Ăƒôö߈û˜‡‹ÙíÆ˜‡ĂºĂ¼€ăˆŸ;kăĂ3ơêñÖáÛ³v…Ö±»ÏÅă»›¾«‡“ÍjÅÓûƠ­Ä°¿€ºÛ«‚ ½9™‰kß [ïSªĐ©Ó†ÇÅÔÓ—¶ÎůÛÏ©‡¥2ßëMùơPçÚ½€¡Û–ˆÛ«‚ ½9¢ôÙ½¿¹†ÚÿÚơêÙ£çô÷å5ÓÙÚĂô÷ơ½á=±”ƠÏ̉ÅáƠ±»¨Ơ™ÁçÚ„Ú½ô߄ٕ×ç'ù×÷Á߈ƒvïÅ‹ă›¶é«³ù×Û«‚ ½9ùêµa¿‰ăˆŸÀñуˆ߈ׯÙ×ưÚ™ëéåÁ½†×ĂÙ­ÄáëöĐÛ«‚ ½9™‰kß [ïSÏŃÚđÆư“߈—¶«·3uU™‡‚vÅÓ‰Ôù×—»º©-í—G÷ˆ¹Úív߈ÑÓÜ÷ÁăˆŸ;ĂÈăˆŸù×Í¿ăˆŸëö޹ƯÏÅôŸ¹ÚùêÿÚŸÅ÷Ù›¾°¿$²¹£Øº±»%íÖÔ߈Ù½¿‰ĂÓ•îغD$ÚÀ ±¿Ǽö™‡«‡“Íjƒˆ—Ó…™ôŸÖ‘ –¶ûƠ°»ÇË¿…Ö‡x«‡“Íj±»‡ÚóÇĂÙ±»¡ ù×ăơÄÓºáƠ³(¨ÈkÖ́“ƠÚ ª ‚  + ¼9 ‰y…àơÔµØ̉ÅñÓơê°½ăÁƠêö±»ƯØ“ÆĂ¹™ô«×ăˆŸ;k‹ÈùׇŒ·̣ÿÚ½€ƒÄùæĐÓÛºÁ́É̉ÇÖ߈߈™‰kß [ïS³Ó̉ÁÓÛÀûÓ‹Çùơï½ɹóÇâàÛº8¤‡Ö߈“¹ƯNÛÚïƠïäëÓǺ¡Èåô­ßùơË̉™‰kß [ïS½¾º·Ôù×íÁ‡ºëöÑÓăˆŸ;µê‡çƒv¢ä߈°¿¡Á$£ä‹Û¤ˆ\0­€åñ»Ï̉ÁÈáØ•÷ÁÅØ̣ÇñÆơê±»±»߈™ëé僕 ¿‰ÖÂñÙûĂ©‡¥2ßëMư“ùêá߈ƒvơèÅË¿ÏÔßÄÙ…»Ó²‘ÆÛÅ÷ÁóÄŽƒvívÓÓ¿‰¡ùׇ¹ÚñÓ½ÔÎÅïƠ߈ƠuĂĂÑÓ­÷ͽÛ«‚ ½9çôêöó›¾Ấ½R×$á å¿ÏžߋÇơÔ‰Ô˜ÔÓÁ¬ÈnáƯÍË)éÛ9¥µ†åç¹ÚăˆŸÅØÙÚÏÔ§Ô·ÅÁĂûƯ½€áƯÛºÿÂưÀ›ĂûĂàÓºóǬ¼¼ăˆŸ;çØÚª‚ +¼9Á̉™‰kß [ïSÍË)éÛ9¥£äù׫‡“Íj™‰kß [ïSăˆŸ;kï»ëö÷Ú¥˜ +ê +è +ä +Û«‚ ½9·Åù×½9¥‡‹Ü­ÄÆĂ,Ưº›¾™‰kß [ïS÷ÁơèÅĂÙË̉©ÓʹƯ%éÓ­v¹óØÅꓹƯNÛº¡È«‡“Íj™ÓÁƯ·Ô¡Ô™‰kß [ïS߈›¾êöÙ½Ơ¹ÔƒØ‹ÇăˆŸ°»߈÷ÁĂ¹»ôÁ¼ƒvƒÔ–ˆßÁϼÛ«‚ ½9óÊÁĂ«‡“ÍjψơçÇÛ«‚ ½9‡º”öÁ½ÓØÏÔ­Äơúơêê¼9¥‡ëöëñg±»ưÅ9¥‡÷‡ĂÙóÇù×àêûØÛԓƵaÍÄ߈™ëé嘉j̃ZîSăˆŸ;ÁÚăˆŸ;₫ ù×¥ˆ]1¡̣½™‰kß [ïSƒØÙ×ÇÖĂ¹Ÿ¿‰áÚχшưÀÓŤˆ \ 0 £ØÁ½ëöºÊ%‹ÜĂÙ«‡“ÍjĂ¼í ‡º¹Æ°»«·3uU¹Ú£ä¡È̉Å ³ ïi÷Áƒ›ÚÙ½ăˆŸÚ½‹²¾ô™‡Ù½­ÖơáƒÖ½Ö–½%ñÓ›¾ơĂĐÓ×Ơ™Óù×Û«‚ ½99¥‡Û«‚ ½9¾‰Û«‚ ½9‡Œ“Ơ¿ÅƠħÔÏÅù×±»߈—¶“ÈÙ™‰kß [ïS­ØµÀ†Œι¥ˆ]1†ŒßÁáêûÓÅÔéê×̉ÁƯ«·3uUß»ûÅÔ˜‰j̃ZîS«·3uUĂÙ‚v‹ÈÓÙ¸ÚûơèÅíÚù×ÑÓ¥µá°ăˆŸôÏÅÍË)éÛ9¥±»Óˆ•=‘÷Ô«Ô¹Ú™ëé噉kß [ïS½$ơÄÏÅù$ÏÔ™‰kß [ïS₫®¶ƠXÚ×ĂÙÇ߈ªÚñÚÿÚ½ôùêÚª‚ +¼9»n˜‰j̃ZîSÁƯôÙÅÙ£ä±ëØƠ¾GÏÔ·‡‘×8çù¿†×ÏÔù‡ƒ½ÍBå̉ ưnÙ#×Ü©¼™ô•%ÏÔưÀƠºmÙ½ÑĂñÓ°»ƒv½ôŸ}ÙÚ¥Á9¥‡Û×Ăô¼ÏÔ³(ëöƒÖ½ößÁ·‡‘×8çĂÙ߈Ö麷ÅÍÓ‹Ç«‡“ÍjƯơơêæÚ¡Ơ釭ưÀ«»ùê±½₫®¶±»ÖƠÿÚ—¶ơê‹øçÊÎ ƯơÛ«‚ ½9Ù½9¥‡×ưÀƒˆÏÅÿÚÂÙ¡Ô¡ÛÛ«‚ ½9“Ơ‹Ü¦ôéÚïÚ½ơèÅ­7ÅÓíÆ¯ÈơêăˆŸ;±»̣ÄÂ÷Á°»ăˆŸ;¼ÔÙÓ­Äùу½­ăỤ̀º©¼ÁƯ߈«°°¿ăˆŸ;™‡£Ç‚vC·Ó ¥0ÛÄÓƒv÷ÔÏԓƶèÁƯù×»ØÛÄỌ́Ă߈߈›¾óĂă¶…Ö§Ơ·Ôèôù¾åĂ8¤‡Ö™‰kß [ïṢÔƠ'̀Ê)èÛ8¤Ơ ̉ ¤0 ‚­²©ÓÏÅÅô‡8¤‡×·Üùד¹ƯN·Ô˜ôÛ¹¡ÓÛ«‚ ½9Ú×±ăˆŸ;ăˆŸ;k¡Á£ƯívµđơÔ›¾½óǹȣØñÚ¹à§Øùô¼ë +¿‰™‰kß [ïSÄÛ׵؋ƠÙ×±¡ôê—¶ñÖ§Ô¡Èø×¥ØÏ̉ж¡¼«Ôç'ÏÔĂºÛ«‚ ½9±»ûƠ÷ÔÙ½íɦêÍÄÛ«‚ ½9‡̀ªôêߌ«‡“ÍjÛ«‚ ½9ù×̉ÅơԯޱºÏÔ°»—ÓăÁ¿Œ›¾̉ÅÛ×ÓÅ­ÔàêÏÅÙÚ™‰kß [ïSÓÅ«‡“ÍjÅ»™‰kß [ïSƒà߈§¹ÏÄÛ«‚ ½9ùê£Ơă±¿Æ%ăˆŸ;9¥‡×‡Œó#½ׯ³ÈơÔ¿‰ù×ÏÅß»ûơê›ƯÀçÔÛ«‚ ½9ỔåôϺơÁ˜‰j̃ZîSëöÏÔôùæëö¥ÄÙ½•‹Û™‰kß [ïSŸ¼çÚϹ½¹ÚíØ·Å÷ÁóÔăÇíƠëö½½ơĂøëƯº¡ø‡€ÍÓ÷Ú½§À™‰kß [ïSơêôêĂßÁÓ9¥‡×ƒvéà9¥‡߈ÓÆµa™‰kß [ïS¨‡¤2€̃êL”îăˆŸçÔ¡Ÿó¾ß߈‚vÛ«‚ ½9ÄÔÛ×Ù×ưÀ–Ó‡̣‹Ç½ÛÍ÷‡ƒvÓº¶¸Îơ +߈빫‡“Íj‡Û°¿ÇÓ™‰kß [ïSÁ½‰¿Iøêφx ùסï$ÅÙÚ±»éÍ¡hçÚ€ºơØ÷ˆÍÓ™‡ơĂă²ÍÓØê$™‰kß [ïSÿƒv«‡“Íj߈ƒv˜‰j̃ZîSç'±»¯¼ƯÓ ă­ù×Á‡é/×:âËÇ“‰3Ơ,ù÷Á߈µØÛ«‚ ½9߈«‡“Íj±»Á½ĂóÂƯ‰ÙƠÎÔ߈‡Ç±»Åôù×ÀƯ›¾ßÄÙô“ àƠÓØ±»ÆưܫԓÈó¶߈ÿ¯¶Ç̉ƒvù×çƠÿÂơêöÙ½‡Œƒvö»Á½€™‰kß [ïSùê߈â»™‰kß [ïS‰¿IăàÛÀß»û޹ÚÛ«‚ ½9µØ¹ÚÎŹÚùןIJ߈ƒvÁƯ™ôèº +ăơÅç®ôưÀ«‡“Íj߈ËÓơêëÙÓưÀ›¾×ÓăĂ3ÙÚ÷‡™Áív­€¾½ô§>ÏÅ·ÅÓ¾©ÓƒˆÏÅ¡ÈơÔ½çÚׯÍÓ­œÂ«‡“ÍjăºưÀºƠXĂÙ߈ưÀÏỖˆ˜%ĂĂ ›­±àéM…Ú™‰kß [ïSñÙ›vßÚ«‡“Íj§Ô±»ÑÓ÷Á¹ÚµÈϽù×ëöÜ›¡ÏÔåíºÛº«·3uU–ÓŸ™‰kß [ïS«‡“Íj›¾Ûº³Èñ“™Á½¥Ø…»´†·”©‡¥2ßëḾ½¤‹ßÄÙïiơÔÛ«‚ ½9ívƠX½ơ³Ø«ÚÇÖÄÓå¼ —¶º Ç£ÈÏÚƯºÅØ™‰kß [ïS±»¿¿¹·‡‘×8çív¡Áù×½ƠîÁĂƒØœ}«‡“ÍjψÁ½Û«‚ ½9̃ˆĂÛ«‚ ½9ÅØưÚ÷Ô«‡“ÍjIYƒ½¼¿Å«»ëö¹̃¼ô«Ôµ•Ñó^íÚÖÆ +öĂÙ×¥Û—¶¡È÷‡Ù½›Ú³ŒµØƒˆ³ öù×ù×áÂÏÔ™‰kß [ïS¡»‹ÙŸ}¾ß̀¬H‹Ç™‰kß [ïSÁ¹—»ăˆŸ;½™ô¹Á›v¬ÄËÇ«‡“ÍjÑÓ©Ó߈Ù-…»ÅÓÑÓĂÙÙÜëÚƒvÏÔ°» ÑĂƯ ÏÔ¹ÿÁ߈°¿°» «‡“Íjö¼ÑÓ÷ˆĂĂß»ûÛ«‚ ½9Æÿ§Û«‚ ½9Ë¿Ï̉źÏÅ›vëöÎ̉߈™‡™‰kß [ïSùê½Ø½ĂĂĂˆçÚ¶ơê¶‚v +ÁÓµ‡ŒϾ¥OưÀơê‡Úç̉¾È %Ÿå±»ßÚÁ̉·º߈éÓ­ÔĂ߈·‡‘×8çĂÙùÚñÓÑæ­ÖăˆŸ;ÏÔ±»©ÓÅô«‡“Íjăơ‡ŒĂ±̉¥º±»ˆăˆŸ;ÏÔï½éêƒu™‡ׯỞö‚ˆ›¶éÙ½›¶é¸½™‰kß [ïSăˆỴ̈Ă9¥‡Ë”÷ÚÙ$½›Ú¹Á¿Å‰Ôv¿‰ƒˆ”½ŸÖ³nưÀêöÅÔ±»¶¶ÿÂơê߈ơÔơÔä̃Ͼ¥O°êØÿ¯¶çÚÏÔÇØßÚñÁÛêĂÎkÇÿ$™‰kß [ïS±¿§Ô… ‰₫÷ˆ³êâỞ¼ùׄçØß»û˜‰j̃ZîS·Åï½ÜÛÏÅ¿ôÀĂ ­ÄưÀÀÓÅı»ÅƯƒ×÷ÔÊ¿™‰kß [ïSù×ùףرÁ“Ơ©Óë™H·Å¹Ú¿‰«‡“Íjƒvù×Û«‚ ½9æÚ½ÏÄÁƯß½áÿ£đÙ½ưÀ™‰kß [ïS©¼Û«‚ ½9Ù×ëÓíêÛ×ăˆŸÙוŒåĂ’‡x÷ÔÛ«‚ ½9‰¿I›¡ß»û麃۫‚ ½9Ï̉ؽ½¹ÚƒvÅÓ÷٭دȇº«Ôé‰ñ5ñ·¬Ô ÑÓƯ‰ÙŒë*«Ë̉ơ꛶釺•Ûùë­¾Û׃vƯÓ ¹Ú¥ˆ]1Ï̉ÙŒë*«—ˆ˜ơ¡ÈơÄăˆŸ;k•Œ’È¥ÛöóÊÛ«‚ ½9ÏÅÍĽ› á ±»Ó‚Ư¹«%¼«‡“Íjƒˆ‚”9¥‡×ÛÀù×çÚ™‰kß [ïSƯơăơ¥º«ÔƯÀœÜ›¾¡ÔÍƠÅØÏ̉߈µØ»ˆÁ‡é/×:G½¹ĂÎ剫Ôó“ÈƠXÑÄë×¾ù×÷4₫®¶ưÀƒàß»ûǼéÚ¹Ú½É̉‹½¤½ÏÔĂÙ½ơễÁüÀĂư“ÜÓ ƒÛ«‡“ÍjºÓÆưÅù׫‡“Íjăơ±”Ï̉…»¹®ƒvùêÅöơÔܻ۫‡“Íj•ÿăˆŸ;köÁù×Ú ª ‚  + ¼9 ëöƠëöÏÄăˆŸ;ÓÅ$·‡‘×8çùơß%·‰“Ș‰j̃ZîSÓµO·‡‘×8ç±½ÏÔ¹Ö߈ÙŒë*«µØ·ôíÅÜù×߈ív­ÖÉ̉÷Ô™‰kß [ïS³™‡ùꙉkß [ïSÖùט‰j̃ZîS¶̃ˆÿÇíºÆ®È«‡“Íj©È¸Ûº“ƠÖ¼9¥‡âà-çôø¿áêĐÄꩼ·‡‘×8ç߈߈·̃ƒÔ’¥ˆ]1Û«‚ ½9Ŕٽử9¥‡߈ñÚăˆŸ¼€ƯÓ ³—¶ÔX߈߈Ñ·˜‰j̃ZîS–¾ «‡“Íj³Ç‡Íʉj̃ZîS™‰kß [ïSçZëԻŰÈϼÂà߈ưÀƠ™‰kß [ïSÓÅù×ÏÅÑÓß»ûñÙ½±¿¿ôÙ׃ˆñÚÏÔø×Ûɾ‹ÓÜÛ«‚ ½9Ù½åÁ9¥‡·‡‘×8ç§Ô«Ñ盹«Ô½ơÔÑÓ—ˆÏÅ߈ÿ‡ưÁđÚ±̉›¡ăˆŸ;ÆÏ̉¿ØÆô9¥‡ù×Ç»‰¿I¯Ơ߈ÑØôêƯkÙڿ囹‹ÇâÁ}›¾ß»û“¹ƯN—¾¹ÚÙƠöÁö™×Û«‚ ½9Ô ÛÀ¿ºƒv߈“ºơÔϼÏÅ9¥‡ƒ¾‘óÂßÄÙÿ¯¶ñÚ̀ìĀÄÙ×Éó×±»§½°»öÙשDZ»±»º߈˜ôỞÑ·úÖÅØÛ«‚ ½9߈½ưÀ̉ÆïêÚª‚ +¼9ƒ'•׫‡“Íjç̉ăˆŸÛº™›:ëßFÛ«‚ ½9ëö·È×Ü’¹ÜṆÇóԑȨÇÙ×Û«‚ ½9™‡ÿÚ’ÈöûØ…ăˆŸ;¹Ú½³ÂÙ½ơêáÛ±ÔÅĦ¹¡Á½±»×Ü߈ºÏœƛ¾«÷¹Ú“ȧÓÅØ±»ÙYÚ¹1ëö«ÔĂƠº4ÍÇ›¾±¿á º₫Ú‘¼°%¼€öëơ‡ŒñÙÓØËÖ©ơñÖù×ÏÔĂÎÔŸÖÎ÷ăˆŸш½¼º¯°ÓÙ˜êè䙉kß [ïS߈î»·ÔÚÆù×á=Ϲøê,ÏÅÀ̉êöëöén§ÓÙƠ߈àˆÀ0pơÔéê‡Ú±»Ÿ}ưÀ±»̉̉Û÷«‡“ÍjñÓµØƯº£äÂƠ–»å̉ •”›¡›¶é»ĂĂÙĂÙÅ÷‡ÂÙăˆŸ;½ÑÓ›¾›ÚÁƯóÍæ—¶ù×ù׫‡“Íj߈«Ô߈™‡÷¼÷ÁăÁăˆŸ±¿¦Ó¼È ÏŵØëØÿ¯¶¤¾9¥‡ù×ôĂơÔß»ûù×ÍÓû½Á¿‰ĐÓáëÚ—»ÁƯ9¥‡í—GÏ̉Û×¾™‰kß [ïSÅ–Ñł۫‚ ½9ÛÄÓăˆŸ;k÷Ù±»߈µaù×ÂƠÏÔù×ßÄÙ©¼ăˆŸ¨Ç¯öÏÅ–ˆ™‰kß [ïSùæăˆŸèÓÁĂăˆŸ;Ü•Öÿ¶߈̣Ç™‰kß [ïSÛ«‚ ½9щÓØưÀßÄÙܫԥÜÛת»ƒvƯÓ ƒˆèôÙ½«»„Ç÷ơ™­ψív™‰kß [ïSº§ô÷Á¹ÚÛº̃ÄØ½Ô«‡“Íj9¥‡Ï̉ƒˆă߈³ºóÛºăˆŸ;kù×½ͽ¹Ú™‰kß [ïSƒˆ½ºÅÓ»¹ÚÅÓă­Rå•ÏÔ9¥‡¡Á“ƪګ·3uUÛ«‚ ½9 ËûÛ‡£Ó½“Üñ̉‚ĐÄê·̃¯È³ÈíêÛï»Û×̃ÁµØ™‰kß [ïSËÓÏÅù׉°ư§‡ăˆŸ;kÑ ÏųӾ“ÈÀÓå¿Åà§Ô¿‰²Âß„ñÙ±́çÚù×ûƠöÁ2ưÀ̃»úÙÅëÛ«‚ ½9Û&µØÑØ¥Ư¿è¸Ú±¿‰Ó«Ô—Œ¡»ƒ“ëöÅÓ€Ơ¹öñÚ« ©ƒ»5­Äô·ÅáƠ¡Çù׆“ +ܧØíÆƠXµ†­¾ßÚơĂ¿º¹Ôå̉ ˆ÷ÛÄÓ¡Ô«Ô±»ÓÆï½™‰kß [ïS¿ôÙÚº«‡“Íj°êØăˆŸ;™‡êöñÙ›ÏÅ‘Ûù¾Ơ|º̉ÁĽñÓ£ «‡“Íj­Ä©e×Ă“ÆÚÄ̉ÏÅĂÙåÁÏ̉ÑÓÍÄ÷êóÔÑĂ“ºÀĂ€ºçốv°»½ơê½ËÀ¡È¶ÔßÁ§ôëöÙ½ù×9¥‡½ưÀ˜È9¥‡߈‹Ù¦Ô Î|ă²߈¡ÛûØơê×¾êö½Ù×Û×ív«‡“ÍjÆ̉¥ÍB÷ÁÇ…ŒÏÔăˆŸ;›¶é«‡“ÍjŸÈ’½ÛÄÓÅs©ØÏÄÿÚ°”ĂÙöÁÁ̉ù׉¿I¡ÓóÂÛ«‚ ½9ƯÓ ƒv‡ŒµØ•¶‡j›¡ÙRº÷ÁñÆ÷å5ÓÛÚÅÓăˆŸƒv²½á¬æơ¬Ö‹Ç½߈ºç̃ÖÏô˜‰j̃ZîS‹ÜéÓÁƯ«‡“ÍjÂöî½ưÀ•î¡ÔÏÏÅíÙŸ}ĂÙêö®¼ +™‰kß [ïS±»è‰đ5đ¶Ù߈ÏÔ˜êè䫇“ÍjÛ«‚ ½9Ưº›¾ĂƠ±»³ØÎÔĂ ÏĘàơĂÜ$ĂϺÁƯ₫Ϻ¹Ú…öưÀŽñ×ÀÚµŸơ¼ï½©Ó™‰kß [ïSº‡ùº°»ëö±»«‡“Íj÷ˆ«Ó«Ó©‡¥2ßëMơê£Ô߈Ϲơê½€¼«‡“ÍjÔX±»‘đ¥ÛÅÓÛÄÓ«Ô©ÇÏÅÛ«‚ ½9ŸŒ£äÿ¼ăº˜‰j̃ZîSóăíê÷ÚÙ½ƒvăˆŸ;ñÓ‹ÇÛ×™‰kß [ïS“¹ƯN¥ơăàùêÛ×øêƒvù×·‡‘×8çăˆŸ±¿ß»ûÇÖñÚĂÙỞ߈«‡“Íj‹ÇÏÅá 9¥‡‹ÜĂ×¾‰¿I«‡“Íj¡È«‡“Íj«‡“ÍjëöƠXÁƯá á ï½9¥‡ÛÁºơĵÈñÓơê½·ÔæºÁ­Ä·‡‘×8ç‹Ó̃ˆÁƯ´†¡ÁÙßÄÙ«·3uU‰töÀ‹Ü÷ˆßÏôê­Öăê­Ö©ÇâÁ³±»±»ÀĂ¹ÚÏÅ¥ÆơèÅÙÅë¾Éñ×€%Ï̉¿́ÿ¯¶¯¾¿‰·Ô߈—»ûÇÖ˜·‡‘×8盾±»߈ù×±zăàÑÓÏÅ÷ÁăˆŸ;ÇÖăˆŸ;÷Ú÷ÁỞ﻽­ØùדƠµ†«Óôêñ“Û«‚ ½9ñÓ«‡“ÍjÏÔƯºÇÖÓÆá³ ù×±»³Øº­ùêÙ½ăˆŸĐÓăˆŸ;·‡‘×8çøêÀ¹ ơ‡ơêñÓŸÅ߈›¾̉śڽÔü×é¾øÚ Áíư§‡¯ÈñÓß¼€̃ÄØéñÚª‚ +¼9ö°”Û×­Öß»ûÖØÿ¯¶ăˆŸ;±»íêƒvÙ½°»éÓ¥ă¥Ø½çÚÛºúÚ×ܱ߈߈ăˆŸƒ£å¿ÙÚµØÔXÛ«‚ ½9¯ÈÑÓ™‰kß [ïSÏÄ—Ó¿ô’₫ÂĂÙÚ8&¤‡&Ö9¥‡×˱ùæ̀Ê)èÛ8¤ĂÏÄƯÚª‚ +¼9ÅĂË”£Èÿ¯¶—¶³ØÛ«‚ ½9£Ç™‰kß [ïS™‰kß [ïS½‰ÛÛ«‚ ½9ëö‡Ú©Ü£äá ¥Ø™‰kß [ïS‹ÇóÂÜá ÜÏÔ߈ÛÀíß”÷‡‡øÙ–˹œ‡«́ëÔëp—Á«·3uUăÇíăˆŸ߈™‡ë¯¾ËÇíÚ߈ÿÚ±¿«ºăˆŸ;ƒv«‡“ÍjÙ×ÁÚ™‰kß [ïSÛ«‚ ½9×hÛ«‚ ½9¥ØƠƠùדƠ™‰kß [ïSôÔÜƠÄ¿àóÂƯÀ…Ơ÷ÁÓÆ¯Û·Ô©‡¥2ßëM¿‰¬¾×Úô‚IƯÛÁÚăˆŸ;ÿ$߈±»£ØÏÔ›¾ƒÇÖ¼ëƒvű»ªi·ÔÙ×ơêËƠưºçÚÚÀ‡“ƒÖÅưŽ9¥‡‹ÇÙÚăˆŸ;«ÔíÆù×ăˆŸ;k×$—»çÚÏÅÙ‡­9·‡‘×8çÙ»ÅĐÄyêyºyæ„'÷Ú½±»«‡“ÍjÛ«‚ ½9©‡¥2ßëM̀Ó™‰kß [ïSăÏùׯư›¾ÅØÏ̉©‡¥2ßëM—˜ív‡Ç‡ß™‰kß [ïS̃»ú›¾óÂÏÔ¡%™‰kß [ïS¹àϹ™‰kß [ïSµØÅÓÛ«‚ ½9ᵓó×§Ø·Ôơê‚vÏÔ“¹ƯN«‡“Íjñ¯ÑÅÏÔ#ơÄÿÚ̃ˆ÷Áß»ûëö£ÇØŒê*ªÂÓƒˆăˆŸ;kÏÔÛ«‚ ½9ưÚœù¾ù¿îÅÎ̉ÏÅñÓÇÖÛ«‚ ½9±»«‡“Íj¡»̀Ê)èÛ8¤¡»ùדƣثd“È™‰kß [ïS߈đÄÙÚ‹Ü߈°»àĂ Ơ×ăà«»˜‡ÁÙÛ«‚ ½9“ƠÙׇº«‡“Íj˜‰j̃ZîS¾†ŒđÚø×·ÍƠ‡Ç‹É0ßÄÙ¿ß8¤‡µØ¥Ï·‡‘×8ç«Ô³È¶Ô˜Ó̀ÇÖô߈÷¼±»©ˆ³Â¹ÚºÙ½éơêÚª‚ +¼9ë×ÙÚ©Ø™‰kß [ïS™Ô·̣©¼Ï̉߈ƠĂÖ•ÛÉù׋ ‰Á©Àù×€Óù×ßÄÙÛ߈—»¹Ú߈·Èëö߈á¿ôÏÔù׫‡“Íj½€©‡¥2ßëMëÚ¹Á±»‹Û8¤‡×ï³2€¼ỡ«‡“ÍjÏÔÿ¯¶ơèÅ߈źăÁÊÓÏÔ9¥‡ëöçÚÁ̉½½›¾çÇŸÖ́ơ£‡¯ÈÑÄë±»÷ÁÀ½ÿ¯¶éøù×ëö¹Ú¡Ư¿ºĐÄ +ê +™‡Å»ÏÔôêăêµØºÅ +ăˆŸ‘đ×ƠÓ¾ù×¥Ç÷$ßÁÓØ9¥‡×ÙÚ»ˆíê¾…Ơ—ˆÏÔ™Ó±»Û«‚ ½9ƒv“¹ƯN«»¼ô•“Íj˜‡­û±»§Ô¦Ô±Û™Ó«ÔŸù×™‰kß [ïS߈Ư«Ñ·ÀçÀô²ÇéºÍË)éÛ9¥ûÓó±½²È߈å̉ ¹Úßè¡È…Ûÿ¯¶¨È¬…؃vå̉ ÏÔñ»±»·‡‘×8稼۫‚ ½9çÚ±»ëöƒ¾‘»̀ĂµØ›¾ù×ÁÅ™‰kß [ïSÑĂ¹Øÿ¯¶ÏÔר›¾Ѷщ³ÈµØ­v‡±»—¶‡ÇÿÚĂÙâÄûØôŸÅµØí—G³¹Ă¼Á¹ùøÿ¯¶ñÓ»½Ï̉¬Å,ĂȘ‹á$ĂÙø×ÎÔđÆÉ̉³ƯÚ±Á¢ä½/ËÇ«‡“ÍjÇÖ½ÛÄÓ¹Ú²ɱÙÅ뷥׿8Úª‚ +¼9˜‰j̃ZîSăÁ¥ˆ]1÷»÷ÁơY™‡×¼ĂÙÙ½ơº“Ơ·Ô±»Ở°»Ơ’½‹ÇàëöùëÁ¹©¼ÉÖ¡ÈÁæ¹Á™‰kß [ïS߈•Çûƒˆƒà‘„‚½Åà—»ơƠ±¿‹Ó±¿Úª‚ +¼9ơÄ…»ËÓ»ƠñÇ̉«Ô§ÓÛ«‚ ½9‡x#ÙÚ‰Û³ ™‰kß [ïSçúăˆŸåŒ¿N¡Ô§ÛăˆŸ;«»á=áêÚ×÷Á¿ß¾ù×Ư ơÔÿÚùê‡Û§Ô«‡“Íj™‰kß [ïSÛ«‚ ½9ÑÓ¡ÓÏÔë¼¥ˆ]1“Æ»º×ÓÛ«‚ ½9âà½ù×±¿Ñ™‰¿IóĂ¿‰¢XơèÅ›¹½«‡“ÍjË̉¥ˆ]1©ÓÁĂØ×ÁÛ©¾ÅØ߈êöÏ̉¯×±»º̃ˆ ÎÅÿÿ.¼ÇÓ­½¼çô«‡“Íj¼¼Á߈ƒvÿ¯¶ù×߈ÅĂÙù׆“ơĂâàûƠ…ôÀƯ˜‰ +j +̃ + + + +Z +îS +߈₫®¶™Û­€¡Á¶‡Ö8æ·¼Í7߈±¿ÚÀÙ×ăˆŸ;«»±¿›¾«‡“Íj߈µØÓ’™‰kß [ïS…eÅô”È +ú + +ơê¹ÚшÿÚÉ̉¹Úÿ¯¶…Ö»·‹½€™Ó“ÆëØöẳ¹Ú‹ÙÅ™‡½€ÿé½±»÷ÁỞ½€¯¼ơĂÍÄôêó«Ô¦ÈÅÓ¦Ơ¡ÙÚÛ«‚ ½9µØ¹₫±»Ë̉°»·‡‘×8炼‹̉ Ơµ†ñ%àƠ;áØ‡ỡÎĂôêß»û£ăâˆ;éêù×ÉÖ߈—¶±»ǼƯ¤ï½߈÷‡ɹÆ—»ÑÓù‡™Ôív™‰kß [ïSỞ™Á߈ÙÚ«·3uUăºÙڋǧÜï½̃ˆ·ÔƠçڬř‰kß [ïSͽÛ«‚ ½9¬¾ÏÔªÚă¥ˆ]1ù×ËÉ9ÿ¯¶™‰kß [ïSáƠù׺̃ˆ“Ơ߈¡ÁÙÛ«‚ ½9‰Ô9¥‡×ÿ§ÇâÁ¯ÈµØăơµÛöÿ×߈™‰kß [ïSÙ½«‡“Íjëöß»û©Ø·Ô’Ç9¥‡Ổ©Óƒv÷‡ÖÆ™‰kß [ïSßڵاô«Ôø¿±»˜‡ÅÓăˆŸÏÅÏÔ›¾Û«‚ ½9¤ˆ +\ +0 +±¿ÑÓ™ô¡ØËÇß„çºá=ÅØ·Ôû̉±»“È·Åơç±Ô¶¦D µ†ÓÆÙ̀ù׫Ñơêơê½ăˆŸ;Ạ̊‡Œ½ăˆŸ;kß̃%9¥‡×Ô½ø×‚Ú߈“€‰Û«‡“ÍjóÔϺçÚ·ÜÿÚ퇓Å×$á=«‡“Íj¿ºßÄÙÎ̉ öùêÇ÷$ÇÖ™‰kß [ïSà÷ÁÆ•Œ߈£Ô©¼•½߈ÏỘÓ̀ĂơvƒØÙ̉»ÚëöÙ½˜êèäưÀ·̣­Ä¶Ô »ÅƒÖ±» Ûˆ‰ÛóÇå̉ ÜÉƯÀ̉%³ÏÅƠăˆŸ½Èôï³2©¼ѶÅØµØÏÅ߈ëöϼÿÚăˆŸëö±¿“ƠÁ˽ºÁ×ù×°»ßÁ؇ÇÿÚåƠ‹ÇۇǗ¾«‡“ÍjçØ߈‚ˆưÀùê₫ƒÖ™‰kß [ïSơèÅÏԱʇù×·ă·ÜÿÚ™‰kß [ïS%ÏÅĂÙ™‡ÇÓỞ³Â¥ˆ]1¡ÈÛ«‚ ½9öÔ)®G ø ÏÔ±»—̃·ÔơÄÙ½ăơóÄ›¡ÿÛ£È÷ÁưÀƒv«‡“Íjí—GؽçÚ÷ÁßôÏÔÀÚÇ÷Á”ÈúÑĂẳ§ÔưÀ¢ÇÂÙ­¾Û×™‰kß [ïSö¯‰¯0ûÆưêÇõÜỞÛ«‚ ½9߈Å·Ô9¥‡«‡“Íj߈߈ö±»±»¡Áű»¯¾ĐĂƠ¡ƠϹĂ7— ÑÓöË̉̃“‚vỲÓ÷Á‰LáµØ½ÈáÛ¹Úï»ׇ½78¤‡ù×…ö±»¡Ûù×ăê‹Üù×ĂƠÍÓùדÈưÀ½½€8¤‡óÔ‡x¹ÚùçÍÇăˆŸ;˜‰j̃ZîSï +8)¤‡)Ö ƒv–ˆỞ™‰kß [ïSưˆàÛơèÅ›¶éö™‰kß [ïSº•º•Ú°»Û׫‡“Íj÷Á±»ÁƯÁ¾¡Ô·§D «‡“ÍjÛ«‚ ½9·Üøê‹ï¾™‡™‰kß [ïSßÚñÓƒvÁÓ߈ăˆŸ;k¡ÔÁ¾óÔ½ĂÛ«‚ ½9©‡¥2ßëMĂĂÜßÏ¡Á߈µØ‡ÚöÁ¹ù×£ÇÛ«‚ ½9Û«‚ ½9ơêơèůÈÿÛ•‹H©‡¥2ßëM߈ºy¸‹Ç¥È©À̀Ê)èÛ8¤ơ¡È×Ü™‰kß [ïS“ËƠÙÚƒˆ߈…̃ß÷Á›Ú¡Ø×¾9¥‡×™‰kß [ïSơêÁƯÙ̉™‡«‡“Íjëö“Ơ߈ỞñÄ›·Ôƒˆ ™‡‡Œ“ÈÙÚÏÄÖ|ÎÔöÛ«‚ ½9ĂÙƠù׋¥Æëö›Ú×¾ü‡°ø1™‰kß [ïSׯ•ֵؑøà¤̉ºÁăëö߈‡xĂºöóÇÛÄÓï»½ĂŸÈ߈ơnj߻û„Ç©Óä×ñăˆŸ;ơ‡ƒˆŒ₫ö½ùÁ±»³¾ŽÑű» ÈÿÚ—¶ëöÍƠôÅØ³«‡“ÍjµØÖÛ«‚ ½9“ȩӭº‡ÚÏijºó߈ÍË)éÛ9¥­Öÿ¯¶ù׬ֽ€«ÔơêưÀÛ«‚ ½9˜È‹Ç©)‚v±»ùêùê½Ô¹Ó̉ẳív«‡“Íj Ëû©‡¥2ßëM¾ÏÔ¸Ú «»Û«‚ ½9Ö¦ÈgƒÖ±»8¤‡Áß»û‡ŒÅÓùׂvßæÍÄ«dĂÙÙÚÅÔ×Ơ»ăàáƠ¾ÀĐ“»… ‰₫ïÚ˜‰j̃ZîS߈±»ÙÅë³È¾±»ºƠºmöÁ•½óùסÛÛ׿º½ù×À×ôêëö«‡“Íj±»›Â˜‰j̃ZîSëö‡ÛăˆŸ;k‘Ưăàß»ûáôêáà߈™‡Û«‚ ½9íÖƒˆ¦ô±‡ÏÔ™Ô‡ŒùÜÇĂèÛ«‚ ½9¸ÚûÛ«‚ ½9‡º߈†ºÛºíçỮƒˆÙÚù×ôÂÈ„Úù×çÑÿÚY§Ó½€ÿ¼ÜŽ«‡“Íj¯¡ÔßÁ”Œ߈ĐÄê©àÍÓéê½Íĺẳ÷Á›¶éÄÚ×ٽٽƠÏÅ£™±»߈©‡¥2ßëMÿ¼á=å̉ «‡“Íjáê·‡‘×8罿»9¥‡ñÓéӻŹڱ½ù×ÏÔăˆŸ»Áï‡ăˆŸ;áê·Ô˜‰j̃ZîSߌÛ,₫™óÇ̀Ó¾¾½äÁưÀ©Ó‡ÚǺ«‡“Íjä̉ƒvׯÉ̉™‡¶Ü½ëđÖׯ©‡¥2ßëM«‡“Íj¥Û“ƠéÚÇØù׉¿IÏ̉¢»ơêƠÄ›·Ôéêÿ¯¶ŽרÏÔĂÈỞÁÓû(Û«‚ ½9¹ÚÁÚ­€ÓÅщËÉ9áƯÑóăˆŸñÆ‚Ư‰ë߃v‹ÜưÀù×ÑÔÛ×ñÁÙÚ¶Ô  Ô­Ươ±»ù×ߌÛ,ưÀ½μ«‡“Íj¡ó#ƒÂ/ //¬/°à//èM/óǃơˆ©ÓÙ›¶é×¼¿ñ›…¾×—ù¾½ù×ăºôͼù×ÏÔ¯ÓÁƯ¥ˆ]1·Ú·ÔÏßÁƯµØÿÚÏÔ«&¿‰›‡Ü³ÈÅ÷µØ© ¤Û™‡ÍÓ÷Á÷¼·‡‘×8穇¥2ßëM¹ÚÏ̉¡¾×Ç̉ơêívëöÛÄÓ™‰kß [ïSŸ}ëöù×™‰kß [ïS‡xÁƯ½µÀÁ¹Á㩇¥2ßëM­ÇÓ́á=Û×9¥‡§½Ú­ÄÀĂ¡¼·‡‘×8ç¹ÚÓÎ÷Á‹°̀¬H߈±½Ê%¤¾SÛ«‚ ½9•ø¾‰ÛºËƠßÄÙ“Ơ׿8ñÓ›ÚÏź׹€ƠăˆŸ;ÄçÚ¾íơĂ¼ơêÛ«‚ ½9ƠXÿÂëö¥Ó¾ßÛÎÏÔ½ÔÛ«‚ ½9ÀÛ×Ă·Ó ¥0·‡‘×8çƒvÙÅëÅÓ«‡“Íjƒ¸à…›v´†×¼¥ˆ]1§ÔĂº®Ơ%±»ĐÓä(ÍÇùêµØă¼·ÜÙÅëÏÅ«‡“ÍjưÀĂÙô½ÙÚ¿́ƒˆÏÔôÔÏÅơº̣™‡­Ø‡ºëö¥ÓÏÔÛÀóÔ߈¡Áº½Ô™Ô‰ă°»öĂÙï»…»Ù½Ù½«·3uUûÓ·Øñ«‡“Íj Ëû³ä̉߈¿‰î¾ÏÅçÚ©‡¥2ßëMÅØäơ˜‰j̃ZîSÛºŽ±»“Ƚ«‡“Íjï»§½‹Ç§íÏÔº½»Ó­ÖÏÔ±»¥ÆÚ׿»߈³ƠÓÆ™‰kß [ïSăˆŸ;ç™öÁáéÓº¾½ívơÔ£äÿ×±»ù×ơÄ¹Ú¶Ô +ÙÚăˆŸ;Û«‚ ½9¡ù×麂«‡“Íj›¶éÏÅ Ëû—¶å×Ù#ƒ‡xëÚöÅØÑÄëÿ¯¶½߈ĂŸŒ·‡‘×8çƒv߈ºÁ¿Å½÷.±»×Ơ†7§j%åĂóÇÛ«‚ ½98¤‡×¹Ú©¼å̉ ÍÄÛñĽ™ëéå°¿ùº÷Ù»µØ¯¾ÑØÛ«‚ ½9ßÁ́v˜‰j̃ZîS™‰kß [ïSáê¡Ô߈‡̣‹Ù·ÔăˆŸÏİ»½Ÿ}…áƠ¹ÚáỠˆñÙ¦Ơ¥ÛỞ—¶ߌÛ,߈ÏÔĂÈá=Û«‚ ½9ùê«âÛ«‚ ½9߈ƠÛ«‚ ½9ö¶¶ăˆŸ;Y£̀Ú×߈§ôëÓÑóÚÇùƠ߈›¡Û«‚ ½9©ÓƒÔ—¶¾ß ¹ÚơêÏÔ‡º‰ÛÙŒë*«߈«º¹ùתڰ»½ÅÓ¹ÚÚª‚ +¼9߈•ÇÏÅƠ€ÓÇØ÷ÚöăˆŸ;ñ¨Ư ¡Áơx¹Úö©‡¥2ßëMơêÎÔơlƯẤv•ܱ»À‰¿I™‰kß [ïSöÁ›¹­€¡Ô»½µ†8¤‡¡ÈÛŤˆ\0«‡“Íj×½߈° +êØ +ÑÓ…ôÇ"Ûº¥ˆ]1ơÉyŸö—¶ĂÙÇâ³Æ½€9¥‡ÙÚÛ«‚ ½9¿ÅÏÔ½€™‰kß [ïSôꙉkß [ïSåĂăà«·3uUµØ£»8¤‡ÅÓ™‰kß [ïSƯºư‡±ù1×$“Æëö߈íÖǼÙ½Ăô³ÂñÚËÉ9ăˆŸ;ï½ ĂÜÓ ±»áØăˆŸƒvŽ8¤‡Ï̉Ư«·Ỗ%‰¿IĂº÷‡đÄưÀ£äù×Éè‹óĦô ÷49¥‡9¥‡÷Á•Ç™‰kß [ïS¾º‰Û±»¹ÚƯ‰ø×Ž‹ÇĐÓ™‰kß [ïS…ô±ÁĂƠ‹Ç̃ˆ˜‰j̃ZîS›¾³ºó«‡“ÍjçÚÑÄëÅØñÓ±»߈ÇĂĂôÁÛ÷‡öÏćºµØÛÀ³ íÆëö§ô•˜Á×ÛŽ©‡¥2ßëMçôÍÓˆ“Ƥˆ\0ĂÏÔÍÄ¿±»•Œ™‡•îử›¶éơêàĂ߈ù¿ëö­œ„ÇÛ×9¥‡×™‰kß [ïS9¥‡‚ö +¬Ä†ŒÛ«‚ ½9½«‡“Íj·Ô›¾9¥‡¡ÔÚ׳0Û«‚ ½9™‡½ôĂÙô¿‰‚¯×±»ÍË)éÛ9¥¿‰ÏÔ°»ÚÀĂÈ߈±»ÛןÅơ9¥‡ÛϹ‚¡Ơ³Â‡ù×ÑĂó½ơÔ•¶¯È߈ÅØ½Ø˜Á&ä̉ưÀăˆŸ;ív«‡“Íjô»ôĂĂ÷å5Óù×/©‡¥2ßëM“ÈéºưÀ‹Ç÷Ô‰¿IƒÖ¶ÜÑØÁï$¥Ûï³ùô›¾¼ĂÛ«‚ ½9ĂÙÍË)éÛ9¥™Áëö±»º̃»úׯÛÚ¹¶ùêŒƠÈĂăˆŸ;߈ơÑÄëËÖëöº˹›ƯƠÆç̉‡˜‰j̃ZîSơèŧô·ØăˆŸ;ƒăˆŸ;¡ÈׯưÀ•Œ÷Ú£äưÀ¹àĂÙÂƠµØߌÛ,ív›Ú½½ô“ë×ù×™‰kß [ïSÛ™ăˆŸ…Ú³ ÙÚĂ¹Û«‚ ½9Ù¯Á‡é/×:Û×Û«‚ ½99¥‡ÁƯ÷‡Û«‚ ½9÷Áï³2¾ÅÂĂ9¥‡×ûÇÖƒv¤ˆ\0ù×ñÓºßÏé‡ưàï½Á½å̉ §ôăˆŸºË¿ëößÁ߈ÿ¯¶¹Úí‡ư­á ·Ó ¥0ăˆŸ9¥‡ÓÔ÷ÚĂÙµØË¿ù‰ưÀ™ăÚ©ØëöñÓ±»ç`›¹ăˆŸ߈ùסȱ»Ñ·8¤‡°»©‡¥2ßëM‹Ơ°»¯¼ùׯ۫‚ ½9Á½ĂÙáê¡»ªĐưÀ³¨ûæÀĂ·Ô™‰kß [ïS«Ô‚vÿ¯¶³÷ˆùêÙÚÏÔµØóÂÙÚ˜‰j̃ZîSÚª‚ +¼9ÙÚ©‡¥2ßëM·Å›Ă°»߈½€ÏÔ“ƠñÖăˆŸ;•‹ø߈ôêÖÆ¡ÁĂÙ»ØëöƒvÿÚíÆèô“DZ™Å›ÚåÖưÓßÄÙ·‡‘×8çÛ«‚ ½9ă„Ø-ó¶Û«‚ ½9çÚ¨ÓÄË«“ƠßÄÙĂÙVƒ×‹Ç™‰kß [ïSơÔ¡Á¾™‰kß [ïSƠ™‰kß [ïSÏÅƠÔºl˜‰j̃ZîS÷Á¿‰€¾íÀơêׯºÔXéêÿ¯¶Å·Ú¹œÁ±»Ù½ÖÔ†6¦jË¿½¾‡¿‰ĂÙÙÚËÇ÷Á±Ù½Û±è¶¤‰̀L„ăˆŸ;ß»û̀Ăư“å̉ ߈³™‡Œ±»ĂĂÉ̉ÇĂưÀƺ½Ă¼Ù½à¬™‰kß [ïSÇÖơÔ±»ƒvéê ƠÏÔ­€ Ûµ̃ôöÏ̉ä̉Å‘ ₫Úˆ—¶¶èµƠ߈«Ô®ô#æ̉ßµÏÔôÙÚÖÆ÷ˆß„·̃Ù×û®GøG½¹ж ¹ÚêÚ¹Ú“ƠÜçڢ䛶éÍ‘í—GÄÓä̉  ÁÇÖ„ÇÏÅ„»†Œ߈‡º·Ô™ÛùׇǫÔÏÅ߈÷½ÏÔÁ¹º¥Ø¹̃½ôóÂË%«‡“ÍjgÑĂăơƒŒ₫ÿ¯¶§Ó÷ڡ箫‡“ÍjĂÙÅØÛ«‚ ½9ÏÔ•ÇÅÔÔơB©ÓƒṿÇôÙÅëå̉ ‹Û§ôÑõØÁ‡é/×:߈æØÏ̉°»¹Ú˜‰j̃ZîSÓƯº±×“ḉ–G²ÂïÀ‚¾¿èƯÓ ëö—»ơê¡È¶¹Ú™‰kß [ïS§ôëØ»Å ÈĂ蘉j̃ZîSÅÄØ×9¥‡щ…ôơÔù×·ÅÙ½±»çÚ«‡“ÍjăˆŸƯµ«‡“Íj›Úå̉ º•ÖĂÙ½©‡¥2ßëMµØù×»‡¼ÏÔ߈ºăˆŸ;“Èăà±¿ÓÆœÓ Ù½ơÔ¼ù×߈÷ÁµØử³½Ô±ëØ¿Ư¦ô®¾Û«‚ ½9ÍÓíÙóƯÁƯÑÄë¡Û¼ñÙ¿‰¼ÛƠưÆ€¾æơ™ÓΈ߈—»‚ÙÚæĂơÔϹ›¾…ÂæÚ³¼ÏÄÑÓ¡ÔÙÚÙ½ƒר‹ÓâêÁƯ˜‰j̃ZîSĂĂ ›­±àéMƒvÇĂÙ½«‡“Íj­ÄÛB§Ô÷‡Ï̉«‡“Íj±»¡ÛéÓéÓ›Ú±»±½çô¿Ø«ÔÏÔôÎÔđÄ߈±)¾ôê ·Ôͺé‡ËÇö¡ÛÙ½±»ÁÙỠưÀ—¶î»·záêĂ÷‡çƠăơÛ«‚ ½9»ÅăˆŸ±»é¼Á|«d±»Ơ™‰kß [ïS̉Å߈óÂ…Ô‡ÛñÆÿ¯¶¹ÚƒvåºƠX—»·¼Í7µØ»Á§ÈĂ ½ôÁÛ™‰kß [ïS¶Ø›¾íÁâ» +±»™ô‰¿I•Œ¯G‹øï‡ºÇÏÄëö“Ơá ĂºµĂĂè9¥‡×ƠĂ ´†ÏÅñÍĂ߈ưÏĂèÅØßÄÙª»½™‡‡Îơù׸څ óÔƯºƒˆí‡›¾ƯöÙÙÚÛ׋ÜÍÇĂÈû(¶߈Ăù×ß»ûÏÔ–ÁÑÇÛ߈Ûº•¾öï½½ù×ßÁĂÖÍÓ«ÔûØ Êû«Ñåô÷Á¿‰ƒvÁ¼ƯÚ…ô±»‹Çç'ăàù×¾Û«‚ ½9ÓÅÙ½жÏÔñÓш›¾ÍË)éÛ9¥ÎăˆŸơê߈•ÇŸ}ÍĂơÔ™‰kß [ïSøê¡ÁÛ×™Óëö߈Û«‚ ½9ÛºăˆŸ;Åï‡ëöçôưÀăˆŸ›¹ăàĂº˜‰j̃ZîS¡Á–󫇓Íj›¾×sß»û剿ôÓÅÙÚóÇßƯ߈±»¯ÈÁƯơêßÁñöæ'ÓÆ±»Óº•½ÓÁ¡ÛŸ}»ˆ½ÍǽôéÓ߈™ëéå–¿»Üø×¥œ‡©ív“Ơ†Çƒ¶º߈ÏÔÏÔ9¥‡×ö£»ñ~Á¹Ë̉©Óå•“ÈăˆŸ‡ºƠ°»¯ÓĂ¼·Ü…ØùôÛÇëöÂưÀÅÓ×¾ƒv‡ÍƠ›¶éÅÓ£ÓÛ«‚ ½9ÎÔåĂǺ±»÷‡ÜÅù×ñÓ·‡‘×8ç8¤‡ÅعÛÇÏÔ‚v«‡“Íjă“­Ä€öĂ¿ßµØívù‡ÿÚº±”ÅÄרå̉ ÏÔÛ«‚ ½9Ăè±»™‰kß [ïSơêï½™ÔÛ«‚ ½9ÎÔûÜר¿µ¶è ™‰kß [ïS¥ˆ]1ËÇ…ô™‰kß [ïS̃ˆăˆŸÛ«‚ ½9¡Á¥Æ¯̃ˆö·̣ÏÔƯÓ ÂĐØ¹àăˆŸÁ¹·̣̀Ê)èÛ8¤§ÔÏÔù×óÖ€ÄñÓ«‡“ÍjÚ‚vÚª‚ +¼9«‡“ÍjÁܘ‰j̃ZîS­ÄµØïi惾‘ÁÂá=‹ÜÂÈÓºù×éôÛ«‚ ½9½ĂÁ̉á=¦ƠƠĂÙÏÔß»ûá=ÅÓ²ÂƯÁÅØ‰Û‹Ùï»öçó½¡ß™‰kß [ïS8 ¤‡ ׎匿N‡ºÛ«‚ ½9“¼µ•±¿źË Ù½çÚï‡ÄÛ«‚ ½9ĂĂ߈Û%ÇÖá°ĐĂÉœÚ ăÙ¥Ö÷‡ƠÚóLJºÛ«‚ ½9íØÔ÷߈¹Ú«‡“ÍjŸÖÛ«‚ ½9ÇÖëÚ€Ó«‡“ÍjÛ«‚ ½9ƒØ±»ÿÚ˜‰j̃ZîS­Ø±¿ư¹«ï»÷Áù׃v‘ÜóÇÍÓ·Å›¾»Å±Á«Ú÷ˆÏŰ¿߈¶))˜‰j̃ZîSé秺ٽöÁï½ÏÄ߈¡%ñÖơçå̉ ĂôÁ¥ÛöÁÚ°êØáꆽå̉ »ØÀ½Ù½ưÀÎPØâÁ›¶é¿ôƯÓ Û«‚ ½9ÿ¯¶³ưÀ†Ù´Ù«́·Ăµả¼‡ïå̉ êö ưÀÑÓÛÆ™Ç䀺ñ™Áơê±)Û×gϺơÔ™×½¾‡ÁƯ½ÙŒë*«‰¿I8»¤‡»ÖZùëăíÚØ× ××±»í‡§ôÑÓÏÔÛºßĂÖŸ}Á×Û«‚ ½9߈¼ư¹«ûƠÏÔóDZ»§ÔÙŒë*«³ÜĐæåĂï³2ÏÔử›ơ’ÈÍǵØÁ̉ÅÓ‹Û™ÓívÄÀ9¥‡߈¿‰ÿÚăˆŸ;°»Á̉åĂÁĂ™Ôº±Á±̣çºÅØưÀŸÅ•½ψ…ƒؽùׇ‡Ç™‰kß [ïSÙŒë*«̣ºÛÇÖö·‡‘×8çơ»́ÅÜ÷ˆªÚ€ÿ¯¶Û«‚ ½9™‰kß [ïSƒv—ˆÅ³àª Đ ¯¼߈áÚëöẳêöûÙñÚ±́·Ø½ÿÚÛ×Ç·ô§Ô¡ÛÛº¿çû¶«·3uUÀÓ߈À̉«‡“ÍjÅ¿ôÎű»™‡‡ºͼ§¹™Áéê‡äçÚ‡ŒºÜÛ«‚ ½9­ÄÙܵƠ™‰kß [ïSÓº¤ˆ\0º½ƯÎÔû¯È›¾«»ăˆŸà€¾™‹œÛå̉ ÷„ÁƯÅØƒ½ëö±½Ïѽ¿ß±»ÏÔ—¶åŒ¿NöÁÙ½߈Ϻù×Û׫‡“ÍjÏÔÙ½éêăˆŸ;›Ưµ.¥Ùöç̉ó|—§Í»«»Ǽ½—Ó›¾¿ôĂûØ™Á™‰kß [ïS°¿ÍË)éÛ9¥™‡¯ƒßͯ¥'=U#QK¯ÂÓÆ߈çô¿ß·Ôù׋vµØ›¹»ØÛ«‚ ½9Ăœ·̉ ¤0Ç̉¡ßơÅ©5àê·#ß%ÿÚÛÄÓÏÔ§Ô‹ÇûƠÛ«‚ ½9ăˆŸ;ÿ×Ûºù×ö¹Ú¼ ™ëéåרÏÔ9¥‡Ăù×÷àóÔ™‰kß [ïSÿ¯¶8¤‡ù×ăˆŸ±»¿‰ºŽéØÙ¿ô·Ô“½ù¿ÔÏÅ¡…Ûă½ÿ§ơêñ‚°»°»ÿ¾¿ô±»Û«‚ ½9ơèŇÇù×½ÅÄÍÄăÙ½öÅØíê较vëö—»›Ơ×ÜÛ«‚ ½9˜ÚÙÜÏÔç$ؽ œ·̉ ¤0ưƒ®ÈôƠ¼ŸÈ›Úƒ½¯ƒßͯ¥'=U#QK¯ẪˆÙÚĂá8¤‡߈§Ô‹Çù׫Ա»ÁöÁă÷‡½ơÔùׄôÏÅ̃ˆ¹Áø×«»Ă«‡“Íj²«‡“ÍjºÁׯÉ̉¾¹ÚÓº˜‰ j ̃    Z îS ĂÙñÓÛ«‚ ½9á «»̀Ăù×ñĽºÁ§—ˆÀĂ¥ËƠ¥Â‘́±¿ÎÅùêÿÚ™‰kß [ïSăêöÅĂÙß»û›¶é麬ֱ»ÂÈ‹ÇĂÙ“¹ƯNóǰ» +ÏÔù×éºù×¥ˆ]1Û«‚ ½9ÍË)éÛ9¥¦›±»¦ÈĂÈ߈ùׄø½êù×÷‡¥Ó×₫×¾±»Ở¶è¯ƠÁÚ…°»ĂÙăˆŸçڅ⓽›¾Ù‡Ï9…£Óơ‡å̉ £Ư«»ÏÔ…Ơ߈߈‘ÚÿÂÅÓßÄÙÂÙù×÷ÁÁƯûØ‹ÙöÛ×±»™ÔºÿÚăˆŸ±»™Ó·‡‘×8çÛ«‚ ½9ÎÔăˆŸ;©ÀƠ§Ô8¤‡Ù½±ÁÓº¿‰’½¡"ăˆŸ°»ù׫‡“ÍjÅ¥ÅÁĂÙ±»‘ÓöÁƯ™‰kß [ïSƒv9¥‡Á̉ÏŃvăˆŸ;½€ăˆŸ;k¬‡ăê߈ÿ¯¶₫ܼ½§ºÙ½çÇ߈ÛÄÓïƠœÜÏź¯áƠĂÙù×ÖĂÏÄAÿÚ߈ß±»±»½‹Ç§ÔÏơ«»£ØÆù×öƒà½ßÁù×­Ä»߈Ô…nù×ñÚëöÚª‚ +¼9§½­Ä™ëéå׺ăˆŸä̉·Ô߈µ‹Û9¥‡8¤‡£ÇÛÀ±»¥ºŒº÷Ù±»ïÚߌùש¼ÛööëöÏÅßƯ™‰kß [ïSƠ‹«-‘ơê›Û÷ˆ¡%½Đˆéº½­ÖĂôîDÛ×§ÓÏÔ™‰kß [ïSƠÁëöù×Ç»“ºÏÅÈ¡Û9¥‡ĐÄêăêཱ¿ËÛăˆŸ;™ÔÍÓƒv±»ÍÓƒˆ«‡“ÍjƯå̉ ß„±»ăˆŸ;Ù½¾ ĂĂ ›­±àéM“¹ƯN¼ĂëöĂÈß»ûµØ™‡… ‰₫©êö§ÔƒÏÔưÀàĂá·̣Û«‚ ½9ĂĂ9¥‡ŒÓÉ#ÇÖ£ä×ĂĂׯ§ÔûêÇÖéºÅÔ߈¦ô¾«ÓÁÚÛ«‚ ½9©Ó«‡“ÍjưÁ›¾ÅéºơĵÈ÷Á¡ÈËӅ½ÁÏ̉ƒ½±»ÍÓ§Û«Æ„ø ƒˆ±»Ăù×¹Á«‡“ÍjÁƯÙ½“Æ«»ïÁÏÄÙÓш¾ß߈’Øÿ×ß„—¶áê»Ă߈Ù½߈9¥‡ÏÄÛ«‚ ½9•½Ù½ Ơ"©ƠÇØéJé‰Ó5“gesÁÅùׇº™‰kß [ïSà ƒˆƠùô»n«‡“ÍjµØ ÔéÓƒÔ…ÛºåÁ½€¾Ñ·ˆƠƯƠºmß„ÙÚ™‰kß [ïS¯ÂỚơ +­vö¿à»©‡¥2ßëM›ÚŸĂ™»¼ÅØñÖ‡ŒÛºÁ̉Ó›Û±»Ó«Ô¹ÚÅʃv™ô›¾å½€߈“‰3Ơ,ùÅĽψ9¥‡ù×ÏÔí­ÔỞ½̃ˆŸÅăˆŸ;Ø×ÿ¯¶ưÀ±ß¿‰˜‰ j ̃    Z îS ¼ôÙÚ©ÓƒÚá ゥӡԱ»ÿỤ́ư“ù×­Äÿ¯¶¶ô¹¼½ĂÁ¹ƒÖµ¶èđºyăˆŸ;½ô‘ëëö­Äù×߈ëöăºÙÓÿ¯¶—»ö¡Á¢»ĂÙÙÚÅÓÛ©‡¥2ßëMưÀ½˹ɇơر»‚vöÁóÂÏ)™‰kß [ïSÇÖ¨)ĂÙ™‡“ÈÏŧôưÀăˆŸ;Ù½›¾…öơê9¥‡ëöƠX™‰kß [ïS‚vöÔ¡‹È½€Û«‚ ½9ß»ûÛ«‚ ½9ÁÛù×¶Ô‡¿›o·ÔôÙÚ¬ÄƯßßÚ߈ëÔƒÖ·ô¹~¡Á¿‰¹Á›¾ñÚă½ÏÔÄÅØµØ÷Á™‰kß [ïSÏÔ¹ÚçÚÙÚÑÅ•Èû›Û×ơèÅǹ‹Ç•Û›̃‰ÁÁËÏÅ¥ˆ]1Ѷ÷ÁĂÙׯ®Èăơăºî½ŸÅñÓưÀ™‰kß [ïSăơ«Ô½ăˆŸ;ÑÓ‹Ü‚Ø +“߈ëöùơřԟſ‰±¿¾ÅØ…̣́סÔơÛÑÓÅÓƠ¾GưÀ³ÂËÉ9š٫‡“ÍjÿÚ†đ5«Ú½Ẵ»úٽ߻ûÂƠ©Ơ×ÙÚ߈ͼ9¥‡«ä¯Æ«‡“ÍjÁƯ×Óé;«ÚơÔ߈½å‡ÊÇ‹ÙÑÓăˆŸϺµ†ç̉ëö™Ó©‡¥2ßëM“ƠíJăˆŸ“Æ·Ô Ááê€ÓÍå‰ÿù¿8¤‡ÏŵƒÖÿÚºăˆŸ;•½ÁµØƒvưÀÙÚʿœùê÷Áëöµ†ĂÙŸÈơÔÔºl©¼…àù×—»¹Áá £X̃„º±»ƒvÔg«»¯»á×ÙÅë—¶óơÔôÚ«‡“Íj›¾á=ƒvÏÔ­ÖñÆÓ̉ơêƒÚÉ»¸Ú—ƯÓ ăÇí­Ä±¿ñÓ­ó×…ØơèÅ•ö̉¶‡Ö8æ¡Á˜êèäĐÓƯºÿ¯¶‡ÚăÇíå×Å–ù×¹ÚÑÅרÍ…ÏÔçÚù×ĂÙ“đˆ­½¼ÛߌÛ,£Ø‹Ù¹Ú¿ñâˆ;k«‡“Íjÿ¯¶©Ó9¥‡×‡ºø×§ÔÍÛ«‚ ½9¿ÓÏÅÙ"×Ơ†7§j߈±¿¯¼¹!ù×´ÀÏ̉ø×ÅØù×éÚ‘å±»ù¿ÄÓÅáê˜ÁÅÓ¯Ơó…ØÉ̉ƒ×ÿÂơĂ¿ƯƒvÙ½…Ơ™‰kß [ïSÏÅÙ½Úª‚ +¼9çÚđÓëӣ䫇“Íj“ÛÂèÙ½±»ׯ¦ô8¬ô߈ù×™Ô…ÔƠ±»ÚÏÅÁ¹ËDZ¿Ó̉ăˆŸ;kƠXψ‘ «‡“ÍjÛ«‚ ½9­ÖßÚרºÏÔ¯Ó¾»ÍåÇÖ·‡‘×8ç¿á êöÙÚ¿çƯȱ»ϼ«»˜‰j̃ZîS«‡“Íj̃„ ơêơêÏ̉å̉ ³È÷Áà ăÁ‰¿I ÁíÖÏšԃֽµØ’½ ‘÷߈ÍG‡Ç¹ÚµØ€ÇÛ«‚ ½99¥‡™Á›¶é÷å5Óÿ§ź§ØÏÄƠÛ«‚ ½9ăˆŸƒv§Óƒv·ÅơúưÀù¾¾ç“ÈÏÔ½Ô߈ß»ûëÚ™‡ï½ÛƇÛ%ÀĂßÚ©ˆ½Ô©Ô÷‡Ơ¾GáÓƒv·‹ëö¼€˜ô§ô¡ÔưÀÛ«‚ ½9ç½·‡‘×8竇“Íj€º«‡“Íj£XăˆŸ;µ‰‹ÇăàßÁ‹Çă‘·½ßÚ©ÇÏÔÍÓăˆŸâơ½ÓÛ«‚ ½9ëØ›¾ºy¹ÿ™‡ơêÛ×Ăٳ£ä߈÷Áơê·µƒ½ƒƒï‰¡¼¡Ô½;Á©ºÅÙ½±¾›¶éÛÄÓơêĂÙƠö±»‰ßÏÔƒˆÿ§µØ·Ü¹ÚÁ½å̉ ÑÉ߈­ØÙƒ›¾ÙÚăˆŸÍÓÏÔɇăˆŸ;°»™‰kß [ïSïÀ™ëéåÁƯĂ¼Ë“§Ôª&ăˆŸÇØ9¥‡₫á ÏÅ™‡—¾¡ÔØÅêÏÔößÅ™‡9¥‡Ù#‡Û—»ưÀ»ØÑÓ©º«ÔÑÅö߈ưˆ÷Ù¹ÚÈ̉̃¹Ú߈»&̣Ô«‡“Íj÷Ú›¡̀ªư¨¿Ø‡ÚÏÔÙÅë Ơ—¶ñÖåĂñÚ‡Û£äù×ơèÅ¡ÛÙÈR¨¼Ù½êÚª¶2tT‘¼“¹ƯN½±»¹ÚµØ·‹¶‡Ö8æ̃%·Ô9¥‡«·3uUöÁê‹ÇëÓáêơê߈ËÓŽăÁÏÔưÀßÖăˆŸ«»‡Ç©‡¥2ßëMµØĂëöá ÔX÷Úëö߈ÀĂíÆßÚ—ˆ¯à¿Ø¡Ô…Û•ù×ø×§ÔăˆŸ;ÅÛö–Ø™‰kß [ïS‹ÇÛ«‚ ½9¿(ỞÏÔÙ½±»³¾ưÀ€ºµa¯×ËÉ9ăˆŸ—¶9¥‡µaƒv¶¼̀7ÛÄӵÙ‰kß [ïSªÚö±»½Ǽ¥ˆ]1ÏÅÿÚï½»Øá ăˆŸ;ÉáÛÛÄÓ‡™‰kß [ïSù×éº÷å5ÓöèÁƯ™ëéåÅØ¹Ú¾«‡“Íj߈™‡˜êèä¼ùסÛù×á ơõaƒ±»ÿ¯¶ÓØÏÅ…Ö›¹¡È߈©Ø³•Çψáê±»߈ÅØÚª‚ +¼9ñ׳ÆÁ9«‡“ÍjÑÓ¿‰Ï̉‹ÜẠ́̃¶ÏÅù××Ơ†7§jù¿¡È™‰kß [ïS÷å5Ó·‡‘×8çá ÁïƠó·Ó ¥0ù×ơÔ§àÛˆøÏÔăˆŸ;k¡Ư¡¢ÁƯÙ×ψŸ\½¿»çgÅÓ…nÍË)éÛ9¥ø×ļÖÆ$§ØÅØ«ÑÍÉÛ×ÏÅÀƯå̉ Úª‚ +¼9«Ô߈ưˆ·ØƒàĂÈÙ×ù×çÚÙ×ÂÅn¥Óăơ« ©ƒ»5‘Ú«‡“Íjöí Ù€ăນ‰kß [ïSÔ …ÂăˆŸ;›ÚƬ֫‡“Íj½€±»²Ø“ÇăÁ±»¯×ÅÓ™‰kß [ïS—Óƒv½Ø½ùê±½³ÂÑÓ¹ÚщÉ̉ñÖ°»…Œ©&³«ÔÛ«‚ ½9«ÔÙŒë*«ÙÅëăˆŸ;÷Ù±»¿µØÅØÂÙ Á½×Ă½–¶ + +±ÁửƒvĐØ½ơ»ëöăˆŸÙÚʹ‹Ü…ØöÁ߈ä̉ù×ƠÁ£¨±»щ±»Û«‚ ½9å¿ùÚ¥ˆ]1ñÆ߈¹ÚùסÈûºÛÀ…àÑÓ½‡߈ƒ»¿đëơăˆŸâˆù×ø×߈¡%ăˆŸ;ö¶  ±»±»ưÀ9¥‡ß»ûñƉƒv½èסƠĂĂ ›­±àéMá «‡“ÍjçêĂ½€Ï̉±»¥‚×Å«‡“Íj×Ó±%±»щ°«Ô¿Ø»Á»‹×Ơ©‡¥2ßëMÙŒë*«ÙŒë*«£ØÂö߈‡Çơê«Ô9¥‡Ù̉Û«‚ ½9ç'–¶ưÀƒÖ߈©¼§ôÂÙ××ĂÙ™‡ơÔÚ×Û«‚ ½9ơèŻߛ¾ÚÆ*½ï½/ƒvÁ߈™Áƒv‹½ơÄëÔÁƯó‹ÜƠ×ó—¾±»±»»yø¼ƒv™‡Ån9¥‡ƯŸ}«Ô·߈ëÚ—Óùêƒ×ÇÖíÚ¶‡Ö8æ߈Ï|€ºĐÓù×ơê¡È…æƒÖÍÓ·‡‘×8ç·ØăˆŸ¶¶å̉ ÷Á½Û«‚ ½9‘Ö«‡“Íjù×ÛÄÓơê¡ÔÿÚŸÈâà±»•ŒăˆŸ;¿Ø™Ôôùôï½ôăê߈ÇÖ÷Á™êÙÚÂÈÚª‚ +¼9ñÓƯÓ ă½‹ÑØÙ½»Ø¡ÔÏ̉ù×á¬à3̣;©Ê§߈ƒ̣Ă©ÀÓÅ₫Ç¡­ÖÏ̉‡Œù×߈—¾ØÅêơÔǺñÖËÓ«‡“Íj¹Ú¶¹̃㻇ǧԱ»€ƠÓ¾äÁé‰đ߈ă»ƒvàêƒà¹Ø·Ø­v‡º¥ˆ]1ăˆŸ;½¿רăˆŸ;ª¶2tTăˆŸ;¶½ÿÂăˆŸ‡ºÑÓơº™‡½öÉáÑÓÛ×¹Úù׳ẪˆÑLÏŃvùê£ÇÛ׃냽̀Ó½€Ù½‹Çáê½ưÀƒÔ߈•ŒÛÚؽ׺µÀơê½¹ÚÁĂÙÚ́ê ‹ÜÙƠƒv±»¾Åï½°»ñÖ¢0Û«‚ ½9™ëéåƒv߈Û×±»Ơ¾G³Ø¯´9¥‡×߈ñÓ…—ÿÚ÷Á̉Å«‡“Íjù×ăˆŸ;߈ƒÚ¯¼£ä‡™‰kß [ïSÅÄ¥ˆ]1‹ÜóÇǼ¿‰‡ẴŒÛ,à¼äô‡Çø¾ÚÄ̉«‡“Íj›!ưÀ‰ÔƒÖ²ƠÛ«‚ ½9«‡“Íjív›¾˜ĂÙÑÓ¢0ëö—Œ·Å™‰kß [ïSÏÔÙYùê߈ßÁƒvăˆŸ±»߈ÇÖ÷Á×ÜÚ×°»Ï̉Ù½¹ÚăˆŸµØ¾©ƠÅØëÓ¯߈éÓ™‰kß [ïS»Øº̃ˆ߈¨ÓăˆŸÁ½¸ÚÛ«‚ ½9÷êơꙉkß [ïSñ̃»úÀ‡€è/Ö:¹Ö™‡ÏÔöÛÂï™Àß«ÓÙ½ÏÔ“÷ßZ뙉kß [ïS™ôÑÁÛ×Ù½߈Ó£ØÇùê±»©‡¥2ßëM™‰kß [ïS½°½Å»Û«‚ ½9‡ÚÁµØ—ˆ¯Èö9¥‡×—¶½€ăˆŸ½€µßºë±ëد¼¬ÔÛ«‚ ½9˜‰j̃ZîS½÷‡¡Á³ƒˆ±»«Ú‹Ùơ»«ÔăˆŸù×ÏÄĂÙÁ½©Ó³½©ÇÛ«‚ ½9¸½™ÁÏÔÀ‡€è/Ö:–Œ¡ÈñÓïپŕ¾ËǬ֧Óü×±»ó^ưÀéê›¶éï½ñÚÁëöÅÄçØÏÚéêÇ̉™‰kß [ïSÉƠà̉ùa«‡“ÍjăÇíÛ«‚ ½9˜‰j̃ZîS¿́ƒvăˆŸ;•ÙÚÁÚÑÓ©ö‰±69¥‡×¡Èñå̉ ăơ›¾ù×±ÔăˆŸ;ÛÀ³Âù×¢ô­ÖéÓơêÉ̉ÏÔâßÔÉË̉åÁ×ÂăơÙ½™‰kß [ïS«Ú¿º߈ó‡x»ºơÄ9¥‡××Ă—ˆ»ˆ¬¶²Â Û«‚ ½9ÙÚ›¾ÅỘǽẶ«‡“ÍjăˆŸ;€Á§Ôö‹ÜÏÔ±»ɱŸ} Á߈߈±»™‡âˆ:áê¹Ú‰»ÛÄÓψ§Ô¥Æø×¶è…Â÷Á±”ơêẫ‡“Íjù×ăºßÚơê—ˆ«·3uU˹¹ÚñÖÈÅÔÛ«‚ ½9«ËÍË)éÛ9¥½ÿÛ“Ơ”Ǽ¹̃ׯ߈߈9¥‡º·ÅñÚƠ¾GĂ ‡º™ëéåù×ơÔù×ÖÆ†ÚÿÚÿ¯¶™»½ôÁ¼߈åĂåÁ—ˆ±»ƠXÇÖ«Æ›¶é›Ú§Ù½ÏÔ‘®ƒˆ™‰kß [ïS§Ô­Ö³ÈŸÙ½£Ø±»Ụ̀™Ô¥Œ÷¼—ˆü‡°ø1ÙÅ뫇“Íj¡»Ù×·‡‘×8ç»y×Ü£‡߈Û«‚ ½9Û«‚ ½9öÀ»ƯÛ«‚ ½9ï»™‡–¶ÔX›¾çÚ̃ˆ ÏÅÏÔºô£5û>Ơµ‹Üơê‘ơùׄnÁư£‡ívœ·̉ ¤0ÅØ©‡¥2ßëM‡×±» Ëûÿv߈™‰kß [ïSíơ‹ÜÏÅ¿ßí—G¥Á‹Ü…»§½¿ØÏÓÀƯÎÔä̉Í­¶‡Ö8æ÷Ú¹ÚÏÔù×ñ¨ưÀ„ǃ¿»„n™‰kß [ïSĂÙáè…ÛµØ8¤‡íÖÓ̉óÓù×Û«‚ ½9÷‡ÿ¯¶ñÚ›¾9¥‡óÇ…Ö¡Ô™‰kß [ïS—¶©Ơ¡ÔÈ*ù×ƠË‘ßÚ¿½ÿÚÏÔƯºÏ¿™‰kß [ïS¹Úù׿‰Ù̉߈·ÔœÜùש‡¥2ßëMɇ™‰kß [ïS¥Ûå̉ ÚÆ›¾å×ăÚÙ×Á¹߈‘g©ƠÇÖöëöÙ½™Áë₫óÇÁƯÏÔåĂ·‡‘×8ç÷ÁôØϼÛ«‚ ½9߈߈ºÿÚùꃈµaÙÚÓuåÊçØ‘Æ߈±»æ½º Ö†‡ü2¨¼߈«Ô™‰kß [ïS9¥‡ƠËÖÛ×ÿ ùê¡ÈívëöÓ«ÚÔăˆŸ;kñÖù×ÿ¯¶Ơîø×µØÏåÉƠ‡ÇÏÔ߈«‡“ÍjÙ-“Ơ߈匿Nµ†߈ëÔæ½߈¡Ô…»íơçô™ôÇ߈ù¿Û«‚ ½9½ÂÙƒvÛºƼÛ«‚ ½9£»ǺâÄ4ÏÅ¶Ø ̃ŒÚ,º•ÛáÛÛ«‚ ½9ư“߈Û9¥‡ÍÄĂóÇÛ×™ëéåư“ĐÄêĂù×Ũ÷‡µa›Ûä!±»Ù½«‡“Íj¾â›¾½gÍË)éÛ9¥Úª‚ +¼9ívщç½đ»P“Û™‰kß [ïSăăà¯Ơ—Dźơ»¹Ú׿8¶¸,ơÖщ‡(Û«‚ ½9µa Èë́±»í‡»½ù¾Åؼéơ«Ô•»ƒvêöÛ«‚ ½9ăˆŸë¾¹ÚׯÛ«‚ ½9ÿÛ™‰kß [ïS«»8¤‡×½€‹ÇµaöÁÏÔßÚ«‡“Íj÷¶¿‰Û«‚ ½9™‰kß [ïSăˆŸ;“Ơ©¼߈ù×ÖăˆŸ;ƒvÿơ¿Åô¹½½¥Øö½Ÿ°Û«‚ ½9¿‰߈º½̉§ôª‡’̀j9¥‡å²™‡ăˆŸŸÓ·‡‘×8竺Ù_ùê—¶ƒÖ°”ÙÜ»ó“Æùêù׃²¾›¶éĂȺۃv›¾ëöμß»ûỞăˆŸ™Á«d—Œ½±¿µØ·¼Í7›¡ơÔµØƠµÀĽ—»¹ôñӓȯ±ëØ’¡éêéºÛº¾ƒ¾‘÷ÁÓ½‹Ç9¥‡íÖ›¾’¹ÜN ñÖ÷Á߈Û«‚ ½9ù×ÏÅăˆŸ;ơꙉkß [ïS©ØÏÅ‹Á߈°»ăˆŸ;k½ûØ›¾Û×ÿ‡»Åà¬ƠÏÄÉÜ‡ăˆŸ;k°»ÏÄö½©ÜƒØ½€Í߈ÙÚшƒñÚ»Á±̉ÇƒĂ“¼ăà±»½µØ÷¥ØüÀ«‡“ÍjÁÚ«Úơ»ăˆŸ;ơÔ¸ÚĐØư“«‡“Íj‚½™‰kß [ïSÅØ†Œ«‡“ÍjăˆŸ;µØÙ½“½“µÿ¯¶ßÚ™‰kß [ïS½­vå†߈Ûºö¶ô½°»™‰kß [ïSå¿‹ÇÚ×ơé±»ưÀ¿º˜‰j̃ZîS·Ô¥ˆ]1™ơ«‡“ÍjÛ«‚ ½9‹Û€º… »‹¼ׯ߈ăơôëö¯‰¯0ƒ«âÛ«‚ ½9™‰kß [ïSÙ½§Ơÿ¯¶½€¡ÈóÓ³ÏÅÿ¯¶ª¶2tT½ö­½¼±»Ăö“Ơ˹ăˆŸĂ…Kù¿‹ÜÏ̉Û«‚ ½9µ‰›Ơ·ÔÛÀ«‡“Íj½ơæ¡Á¡Øù×÷Ù™ôö¶ĂÙéÔ‰¿IµØ¯È…ÜåĂq[«‡“Íj›ÚăºƠÁ…Ø¥ˆ]1̀ÓÙ̉±ëØ£ÈÑØ™ÓĂĂÛ«‚ ½9çØµØÍ·߈Ë¿Ë̉ívɇ©¼µØç̉½ơơó¶¾́¹Úá̉÷ÚÁĂëö÷‡«‡“ÍjƠÚÙÅë¼æ×¾µ‰£ÓƠÛ«‚ ½9‡Ûô꺽•Èû›©ØXăˆŸ;ËÉ9¶߈¥ÆÿÚ‡ºùשǙơưñÛ×đœÜ›–™‰kß [ïS¹ÚíÖø¿©Ü«Ñ·‡‘×8çÁ¹ăˆŸ;Û«‚ ½9ßÚׯØ™Ă߈ïÅ™ëéåëö¼ôñÓµØßÁÙ̉™‰kß [ïS߈‡ºÙ×á µØơê»Ó¾¹Á꼇º¥âăˆŸ;ƒ¾‘ù׃vöÙ½«»ƒv¿‰ÙŒë*«¥Û«‡“Íj¡ÔÛ«‚ ½9רăˆŸ;¡»µØ¹ÚÑñ»…Û›¾µ.¥ÙóĂ®×µØ¼Ô ¹¾£ÓÙ½¿»±»ëö±»ç̉ÄÀ×Ơ†7§jƒvçZ½¿‰µaψ̀ëԙ‰kß [ïSÛ«‚ ½9ăˆŸ;9¥‡¹ÚÙ½ƒˆ—ˆÛ×èê÷‡ñÖù×µ.¥ÙöÁëö¦ÆñÚ±»¿‰—ˆÎÔÇÖ¹Ú‡ŒÁƯÿÂ9¥‡ÿ¯¶çtÍúëöÛÄÓÓ¾½ḯÿ$߈Å߈­ÄíÆƠ÷‡—ÓÀ̉ﻯȃ¡Á°»·‡‘×8çívñ·̣ɇơèÅ«‡“Íjæº̃ˆ½Ø¿‰™ëéåѶ߈©¼Ă™ôˆÅԀėÓá éºôù×±¿ăˆŸ”Çë{Äôù×àƠ°»’½×ç$ƒ×ƒËÜÛ«‚ ½9©‡¥2ßëMóå̉ ăˆŸ;kƠÔźưÀ߈‰¿Iÿ§É̉µk±»ÓÅÙ½¹ÚÙ½ÏÔˆ•Û«‚ ½9™ôñÖăˆŸÛ«‚ ½9»ÓÏÔ‡“ÜÓ ÿÚ́–G +Ăº™‰kß [ïS±»Ù½ưÀ«‡“ÍjÛצô™‰kß [ïSù×™ëéå¶  ă½«Ôé ÑØÓÔ°¿£ä˱ù×ƠX«»´N¹Ú­Ô¢È̉ÙÙ×½Â÷ÁỞÇØ°»«ÔÛˆÏÄùôÛ«‚ ½9Ûƒ̀Ă‹‚Å¼ăˆŸ;«ÚÙƠ¿ôާĂè£äơØƯÚ˜‰j̃ZîSíÆÑ¢×Ơ‚v±»§Ô‹Çƒ×…Ø­vÛ«‚ ½9Ï̉ôÅ»­Ä‡“¿ßá ‡ŒÙÚƒv‡ºÛ×åÁÛ«‚ ½9÷Åù×sÆă»¡%釱»ëö·̣ĂÖö·cÚºÅôù××¾Û«‚ ½9™‰kß [ïSÛºÏÔÍBºơÄ•Èû›—¾ù×»nơÔÂÖ¥Û±»ƯÚăˆŸ߈ÓØ­Äá íÖéº.ơÔóÇ¡ÔåĂ¹¾Üơ”ÙÜ¿èøêèê߈êöÊÈ9©¼ƒvÙ½´aÏ̉߈ơÔß»û©ØƒvăˆŸ;˜‰j̃ZîSϹ‹Ụ̈«÷ÿÚ³á=箓ºÓ›œÙÚÁ̉ơê½ôÛ×µØĂÙ™‰kß [ïS¥ˆ]1Ơ«‡“ÍjçÚ«÷·‡‘×8ç·Ó ¥0ăˆŸ;k´aëöóÇăˆŸöù×á ¿Å…¼ÄØ ˜‡·º÷ÙÑĂÑĂăàŸÈÇ̉ù×Ùù×Û«‚ ½9éÏÔ•ÇÛ«‚ ½9»»ØÓîĂÙ8¤‡™‡ƒ×ÙÅ볺óív»½°»߈̣Ó›¾ëö́ăˆŸ;»Øă຅ ‰₫Ë1÷ÁïÀÓ¾ăˆŸ;kÅÓ¶Ô½€ÅÔëö£Ø÷ˆÛ«‚ ½9í‡Å–Ï̉ĂÙ¡ƠÁ¹ÀĂ™‰kß [ïS™‰kß [ïSÓÇÅơź8P¤‡PÖƒØåĂºͼ߈µaÏÔÛ«‚ ½9÷å5ÓöÁÛ«‚ ½9ñÖñÖù×߈ù×Ó±»º¹ÚÏĬփvÏÔ±»¦ÈơêµØí"ÿÂöív©%ô‹Ç¡́·Å°»¡Ô©¼½ăˆŸívÙÚ™Ă¡ÔĂÙ»½ƠÄơêÍƠ¡Û•Èû›™‰kß [ïSÙ¤ñ×ö¯Èƒ·ÔšȽùש‡¥2ßëMƒvÛ«‚ ½9¡ÈÙÓ½Â¹àƒˆÛ«‚ ½9ëö§ô²½ƒươêïÚ‡ŒÙ̉ù×߈óǧº¡ÈÉĂ¡’߈ÏÔÓºđÚÙƠôĂÙYŃ+…Œ߈ù××ܰÁư“ëö“Æ÷ÁăˆŸç¸›¾ùêñÚăˆŸ;릹Ú߈Ơù×ÇÍÓïƠ‰Ûº²Ơù×ñÚÛ«‚ ½9ó߈¶Ü×Ơñ«‡“Íj½Ô³àÄØƒˆ±»±»·ÔỞçôëöÙ½ÑÄ뫇“Íjíê­¾ù×÷ÁÀÈeª»Ơ¾Gˆ÷‡߈½ï½ÍË)éÛ9¥…ôËÓå˜ưÀ×¾ØÚÏı»…Ö߈™‰kß [ïSù׃ÖÓ̉±»ư›ª¶2tTÇÜ›¾óͼô阉j̃ZîSÙ½ăˆŸ;™‰kß [ïS›‡•ö˹ù×ùê­Ö˜‰j̃ZîS·Ôơç§ÔÓÁÙ½ÏÅÍÄø×»Ă¿ºÏÄăˆŸ;kơÔ×¼¹Ú±»‹Ç±»₫®¶Ù½ưÀ«©ÀÛøß„¹Ú“ÈƠ¿Ơºm‰¿I߈ÆŸ\íê߈©¼ưÀ¹¾ÿ¯¶ÏųÈüÁ9µØù¿—ØÛ«‚ ½9±»ùêăˆŸơÔ½•ÖöÁ“ÆưÁ±»Ž‹Ü¥Û—¶ç®±»÷Ù—Ó™‰kß [ïS¿¹Ø»³b½ĂñÓöÏ̉ß߈“ƠÅêöß%Ñ+“¹ƯN₫ÚƒµØÍË)éÛ9¥ƒ “§ä̉µØæá‡đ•Œ¨‡¤2€̃êL߈÷Á¥ˆ]1ëö—îơ«d÷ˆ“ÛÑĂ³(µØÛ«‚ ½9¤Ç•Ö½çÚĂÙ—ă8¤‡º‹Üßơꙉkß [ïSÛ«‚ ½9ÓØ’Ơ÷ˆûƠ½›¶é›¾ăˆŸéÚơêÍË)éÛ9¥ÚÀ籯‡‹JÙ½₫ӵ؃½ÙÚå×ß»û¶È»ÅîŬֲº̣ÿ¯¶щö9¥‡›¾ÆƠĂÙƠXù×ø¿™‰kß [ïSÙ̉ÏÔ¡ƠëöÛ«‚ ½9›¹œÂ ñ›ËÀÙÚåĂ߈ÓºéÓăÁ½ôêöơ»ûÖÖÆ‘ÆߌÛ,í—G߈߈Ú×™‡ÁéÄïÏÔÛº÷ÁÓµăˆŸ;k«Ñ­ÄÏ̉Û«‚ ½9ơèÅăˆŸ;ưÚ̃ÄØÀƯï½½†×/­văˆŸ;á ™‰kß [ïSÁƯ«ÚÛ«‚ ½9ƒˆ«øÑÓÑөǨ,ÁÓ±»ß»ûö‡©&ª‡’̀jù×ù×¹½ă.ưÀ³ơèÅÅ¡ÏÔÅÏÅ“z±»G½¹ÍÓÙ½«‡“Íjº½éÓ×Ó̉ˆ”=ÏÔ¨ƠƠ߈•ÖƒvÿÚùסÔÅÙ³ÜỞ¸ÚáÛăÚĂ‹ÙáêƠÑÓÛÅ‚vÏÅù׃¾‘•Èû›Ơœ‰¾IÖĂÙ¥đ¢»«‡“ÍjÑÄ뙇¡ÔÚª‚ +¼9ÓµÏű»ưÀéÏÔ—É“ÈôŸÍÄñ¹™ ù×Û«‚ ½9ĂÙÙ×Ï̉«‡“Íj±ÔÏÅ­½¼ù×ÏŃˆ«‡“Íjù×áƯÿÚ½ëƺëö¹ÚÍÇͽƒˆ$ăˆŸ;ÓØ¯È‚©‡¥2ßëMÛ«‚ ½9Á¹ßỰÇÑÁ·‡‘×8ç¥ÓÁĂ»Ø-™‰kß [ïSÿºÅL±»½ÏĬç¬Öƒê·Ôéê∫âï»ùê™ô«‡“Íj‰̃ù×½€Ơéù×Óá ŸÅăơøÛ«‚ ½9—ˆ­Ä½€ƠX±È­Ù­€ëö½º­ÔÅÓáê÷Úæ§Ô±»ív·ÔéÓâˆ:¿‰ÏÅƯÓ À¹Ơ­Ö³½ăˆŸ;̉̉Û«‚ ½9±»ùê¹Ø÷Ù™Óö₫Û±¿§í«‡“Íjƒv«‡“Íj³£ĂÙưˆóÂÔÛ«‚ ½9Ë̉ƒ¾‘ßÏçÚÿÚưÀù׋Ƚ‘¾Û«‚ ½9·Ó ¥0©£á½ç™ÓăáǼϹưÀơÔ™‡¬ÄëöÏ̉ƠĂÙ‘Û½€‘±ŸÅÇÖ›¾ÏŨ§¹ÎÚ¿‰™‰kß [ïSăĂ3½ƒ­ÄơèÅñÖ«‡“ÍjƠûƠơêƒÖơÔăˆŸ;«‡“Íjÿ¯¶«Ô³ÏÅñÓÙÅëƯô +ÙÚƒˆÏ̉ÁĂ«ÔÛ«‚ ½9‡ºĐĂÏÔ9¥‡×„ÓÚăˆŸ;ÁöÏÔµ†ù×™‰kß [ïSÛ«‚ ½9ơêÙÚƒvÂù×å̉ 9¥‡«»ï»µ‰µaï½¾ÅöÂÅ©ÇÛÛ¡ưo«¥-;M›¡+…Ÿ)Ùµ³ eᥠ‘埇âÙŒë*«Ơ㫇“Íj¾Ú:ơĂÖÆăˆŸ;ÁƯÁƯÛ«‚ ½9ÿ¯¶ëöâ࿉ƒơĂưÀÔºl£Ø™‰kß [ïS³™‰kß [ïSÁƯ9¥‡ÑÓ÷ÁÙ½±»™‰kß [ïS½Ôù×ñ•ª»¡%áӭȫԋÇưö߈ƒv™Ó÷‡Úª‚ +¼9áꙉkß [ïS9¥‡×±»ÍË)éÛ9¥ÅÔëÓăˆŸ—ˆÉø™‰kß [ïS™ëéåØ×ÏÔ䌾Nöø×·‡‘×8ç¯Èơ½Á±—¶ñĐ߈ơ¥ÛƱ»ƒ½ơÔ¾߈áêÑÄë—Øá 󓩇¥2ßëMÛ«‚ ½9›¾Å«Ô»Á«ÔñÆÙ¾ưÀ©ÓĂô͇ĂÙơÔ…¹àÀĂëö‹ÓçôÑÓăˆŸ;”ÇăˆŸëö™Ó₫‡Û«‚ ½9¡ÔÏů¾“¹ƯNá³¹ƒ¾‘‹Á³È…âˆ;ù×éÓÿÚ̃Á«‡“Íjùơ™‡߈ÂÙ߈ƒÖóÇÏÔ§Ô«‡“Íj±¿ƠÛ×¹Øͽ‰Û¿ßÇÖóÂÙ½ưÀùןÅñíÈâˆçÚÏ̉ñÚå×±»ÏÔÚª‚ +¼9˹ÏÔ«‡“ÍjÛÄÓñÓơêƯ‹Çăơ«‡“Íj®£Ôëö™‰kß [ïSÛ«‚ ½9ÍƠÄkß [ïSÏÅ›v‹Û™‰kß [ïS½ô½ƠơÙ×Á©Óß»ûƒˆÙ½ÎÔÙÚÓï²2óÂÁăƠÑ·ÙÚǼă*ù×åÁ½€±»Åر½ÅÔ8¤‡ñƒàßÅߌÛ,‡Çƒv¨ºÙÚăˆŸ;Ưº°¿‹Çí—G™Îר™ÓáßÄÙ÷Úµa÷Á—¶¡Ûø×ñ֋ܘ‰j̃ZîSƒˆ¾Û«‚ ½9ÑÄë£ƯêØå̉ ¢ƯÍÄׯ¹Å›¡ºy×$íÖ«‡“ÍjívËÅËƠÙ‡­9‹ÓăˆŸ;ëö½ĐÓĂÛ«‚ ½9ăˆŸ“ÆÏÄ¡ÁăˆŸ±»Ñ×˦¹›¶é‡Ú­•·¡Á•Œ³(¿ØăˆŸ™Ó¿½»Åÿ¯¶9¥‡©—ˆÁĂí—GÛÇÛÄÓƒÙ½ĂÑÓÁƯÆôëµ°»ÙפÇơÔÏÄÓ™‰kß [ïSÍÓßÚÛÆ›¾щ́ơ߈߈§ÆgŸ}ưÀƠ߈­ÄĂº÷‡Ï̉­Ø€Ä›¡¼ÁƯ߈Ö¾ÏÔÙŒë*«ÏÔß»ûÀ¹éÓÑØûƠ˜‰j̃ZîS«ÔÖô±»¿‰ôɨ½ăˆŸ;kå¿âˆ;øêëöúù×ÇÖÛ«‚ ½9¿à•{ƒˆ÷Ú߈ÿ×íÖÏÔ±»«‡“Íjëöù×§ÓỂñ%£ Û«‚ ½9«‡“Íj‘Ö¥ˆ]1ĐÄꓹƯN“Ơ“ƠƒÖ­vîÀñ¬˹³ØÏĽ™‰kß [ïSå¼ ™‰kß [ïS¿ô¬¾ăˆŸÍëÿ¯¶ă»ëöÏÅù×ÑØèÖùˆÑÓ³ÏÔÀƯÀĂÿ§ï½ÏÅĂÙă»¡ÔÏĦÔÛÇÛ«‚ ½9‚vµØÆè«»ÿÜÑÄëÉŽĂÎù×Ôơ +•î“ƠƒvÏÔ“Ơá ѯÛÇÑÓè§V±»¿àƒÚ°» 9¥‡×™Ô‹Í‹Óø×µØ™‰kß [ïSÏÅĂƠ±ëؘÁÓØß%ÛºÚª‚ +¼9ĐÓ¿ôëöívöÎÔØÚĐÄêƒvăˆŸ;·ÔëöªÜ +óÇ¿»ơêÑöÍÉÁĂÙăơ߈·‡‘×8çÏÄưÀƒvƯºщèÓœÜDÛ«‚ ½9÷Ú³ÚÄô˜ôÛ×óÁ©àóÇö«‡“Íj©Ÿ}ÓØ¡ÈËƠÚª‚ +¼9ÛÀăˆŸÄ–ëö9¥‡ËÓ±¿µa¡Ô·ÔÿÚÙŒë*«÷ÁÙ×»ÓÏÔ…àƒvăˆŸ‘ÛÅÓ¯ÓéÓ˜‡Ϻ¿‰ăÇí£äùëÛ«‚ ½9‹ÛĂºØÅêù×ñíÈï½™‡̃ˆưÀϹàĂÛ«‚ ½9ÓÓ›¾¼€ƒר‡xщƒÔÓ¼­Ø£ƯÙÚå»Ở¿­½¼óÄ÷Ô‹Ù™‰kß [ïSÍÇ÷Ù듳ƒưÀ¿ÅÙÚÛ‚5Û«‚ ½9ÏÔÛ«‚ ½99¥‡á Ƽ˿‹ÇÏÔƒÚ«‡“ÍjÖåÖëçăơ™á—¾Û«‚ ½9¿ô™ëéåÁ×™‰kß [ïSăˆŸăà‘®ù×ÙÚ©‡¥2ßëM½ĂâˆơèÅÜ߈“º§Ø›¾ÏÔĂ¯Èºyđ§Ø°»µØëß׿8߈ëöó–‹ÈăˆŸ;ưÀ«Ô½€ÙÚóÇ•Œ¸Ï!í‡;Í̉߈ù×ăˆŸ;²Ư©Óß»û©&ư“¹Ú˜‰j̃ZîSϹ£ÔÑØ±»éÓÚˆÛÀǼÛ«‚ ½9ÛºÓØ«‡“ÍjöÙÚ½È÷Á·ÔÂÈ™‰kß [ïS¿ÏÁĂï×÷‡…́Ç«‡“ÍjÏÔ÷³½Øø×ËÓÀÛ•Èû›¥Æôê…»‡Çù×½ăˆŸÿÚ—ˆ‹ÇË̉™ơ™‡ïÁûƠơÔÅơÔÿ¯¶á°¡È̀ù×§ÓĐÓ‚ù×ÍÓ…ÖªÔÛ«‚ ½9ŽÇ»¿‰Üçô߈‡º«ÔÛº÷$ß»ûϼÚ×Û×åÖñÚ¥‰ÍL…߈«‡“Íjív†º£»ÍË)éÛ9¥߈ÙÚơÔ«Ô÷‡Æ«»éÓíÆÏÔ«‡“Íjâ½ơ¹Ú‹‚Ơ¯Ơ߈ùê£äăˆŸ«Ô¡ÁíÙ½ĂÙ™‡ÑÓ­ÄψÁƯ³ƠŸ»±»ÇÖ…»$ñÚ·–»Úª‚ +¼9ƒˆùêéӹѫ‡“ÍjăˆŸ;™‡™‰kß [ïSχÄô±»çÚ³Èî½çÁ·ß«Ô¼€÷ÁÛÄÓ‡xû(½¿Ư¾Ï̉÷ٻ؃¾‘¹ÚăˆŸ;Ë̉ŹĂƠºĐÅ¿Ôñ”‡Ú¡È¥ Ù¹ëöëö³ƒv·ØŸ¿‹Ç¹ÚµØ±»…ñÜÛ«‚ ½9“º…ƠĂÙÙ̉ăˆŸÙÚù×ÀƯÙ½íJ“ƺÑÓưÀÙ½³éêÛ«‚ ½9íÍ”÷…¾ŸßĂÙ‡Çô˜‰j̃ZîS‡º™‰kß [ïS«dÔơ/á=áÓ‚ˆÁ‡§Ô÷‡ưÀĂºË̉¿ßơĽæÚÛ«‚ ½9ÅØÏÔÏÔ¹ÚĂÿ™‰kß [ïSñ×ÛÄÓÛ«‚ ½9ùơ±»–¶ăˆŸ;k˜ÁÙÓÛ«‚ ½9™‰kß [ïS±»±»³ÈẳÏ|ơÛ“¹ƯN“¹ƯN嘭׾™‰kß [ïS÷Á߈Ơµ¼—Û¯Ô³Ø߈¬¿ĂȇÇÙÚ™ÁÍĂ­Ä‡ØŒê*ª‡ÛëåơêÓ̉§ô÷Á«‡“Íj³ÈơÄăˆŸ߈ÏÔăˆŸ;»Ø™‰kß [ïS«»­ÖÂÆÿ¼ăˆŸª‡’̀j¨ØF›¡Çá…Ơ×¾ăˆŸ;½Ÿ}ﻵؓÆßÄÙßÄÙ…‡ŒÁƯÑÄëéϹÏÔå̉ ³bÁ̉¡ÔÙƠ–¿öëö±»Ï“Ơá꫇“Íjÿø˜êèäĂÙÛׇۇưÀ9¥‡ăˆŸƠÊÙÓØ™‰kß [ïS¯.Ư‰ÑÓ°» +ׯ÷Á˜êèäƒÖ±»ăˆŸ;¡Á÷ÔËÉ9ÏÔăˆŸ;°½•Ö‹ÜÛ«‚ ½9̃øËÉ9÷‡“ÇÅØËÇÙŒë*«ÑÄë›¶éÛ«‚ ½9ÅØăˆŸ;Û«‚ ½9µƠÍË)éÛ9¥ĂÙù×ëÚ«»ÑÓưÀÁƯëöêÓÁƯ˜‰j̃ZîS§ºăàË¿ăˆŸ;kƒ›v©¼°”©º™ÁÁ̉±»­ÂŨ߈Ù×Ó̉™‡ï»ж•×±»ưÀ¹Ú£ØÅÀĂñÔ›¾—¶Ă“Û»‡ÍÄÁ«‡“ÍjÛ«‚ ½9“È9¥‡¡»±¿ëö‡Ûï½9¥‡¹Úó|á ŒƠv±»éÓ¾ơpÖÈ Ï̉‹Ü˜‰j̃ZîS—¿½™Ø߈¥Æ̣Ô‹Üù×ëöÛ«‚ ½9üÀó±ÈÛ×ĂÙÛ«‚ ½9ßÚÏÔÏÅÁĂY·Ô²ÂĂÈ÷å5ÓĐÓơê×hßÚ¯Èí·ÑÄëÔXÛºư怼ƠXï»ùêóÄßÄÙ¾¡Á ñÓ·ÔËƠéºơÔÁ½»ˆ½ƒvÁơêƒv·‡‘×8çÛ«‚ ½9Û«‚ ½9ëØŸÅù׫‡“ÍjÂÆÎÅgĂÚª‚ +¼9Ơ…₫§ß»û½÷ÁÅIÑUÿÚ­¾¶€¾ºĂèÁƒÚÀĂÉƠͼºơèÅíÆ·¼Í7Ó̉å̉ ¡ÔÏĸàăˆŸư‡±ù1Ù‡Ï9…±»åĂ9¥‡×ù×ÏŧÔǘ™ÛăˆŸÇÖë3½€́vϼ9¥‡×ÿ§½™ơº9¥‡¾¼±ÜßÄÙ§Àƒ¾‘œÜÛ«‚ ½9߈ü‡°ø1ÏÔ©º­Ö¯Ïù×¼ÏÔ₫)®¶)ăབŒÿ¯¶Ϻ™‰kß [ïS߈«»¹Ú•Ʊđ߈Ó­Äéê¹ÚËƠáÑÄë…Û«‚ ½9µØÁƯưÀùá=ơĂÙƠ¯¾ÏÅ‚v߈¡ÁƒvĂÈ«Ô/×¾ç̉±»·‡‘×8çœƠ¥\™‰kß [ïS›Ú±¿ï»é·›¡ß»ûđÁ½ăˆŸ;™ëéå¹Ú€ºù×™ÓÿÚψ¹ÚÇÖ½€ửÏÅÛº›¾ÏÔßÁªĐƠŽëöÛ«‚ ½9ºË¿»ÚÓØ™‰kß [ïSßÄÙĐÓ…Û¡ÁŸÖ÷‡éêÔ¨‡¤2€̃êL·‡‘×8瓹ƯN¤ˆ\0§ô©¼«ÛÎÔƒv™‰kß [ïSÿ¯¶É̉ÂÙăˆŸ;—»Úª‚ +¼9ăˆŸöív¹ÚƠÏÄơêÑùëöëöăÁƒvÑØ™ôƠX„đ—È›¾̃Áƒ½ä̉ÿ ‹Ü±»ÁĂËƠÏÄĂÙƒ™‰kß [ïSƠùêÏÔͽ߈ëöÁ«‡“Íj˜‰j̃ZîSÍƠ±½ăˆŸ¡ØÙ×›¾ÂÑÓ«‡“Íjù×§Ôç̉Åè¼±—¡ÔÙÚ¡È8¤‡ăˆŸ¼ÔÙÚ…ÛƒvÏÔ¹ØíƱ»ơꇌ“ȃ³ŒŹ«‡“ÍjëöưÀ­‹“¹ƯN±»è‡éÚËÜơÔêÔ«‡“Íj8¤‡Ù½âÁăˆŸ;ß½”ƒvËÓƒÖËÉ9ơê…n¡Û™‡¹Ú¡\ÍĂ¹ÁÏ̉߈Û«‚ ½9Ù½‡×¥Ç™‰kß [ïS­Ø³Æ«ÅÛ™½½ƠöÛ××ÓÛÉŸ}ï½ỔßÁô™‰kß [ïSµ‰ß»û¥Ø¦ÆëÔƠ«‡“ÍjÿÛ±½íÖ›Û±¿Ï̉ùºÏÔ‘—ăíºívÛÚ¡Û›¾·Ô“ºơÄ™‰kß [ïS“ƠÛ×ù×ưÀ±»âˆùÚÑĂưÀùß›¾ăˆŸ;§ÔG½¹…Ûùë«Óñ«ÛåÁ¥ˆ]1«‡“Íj•½ÏĵØÓºçÅå̉ ±»™Ô‘ÆŸ}ÑÓù×™Á­ÄÙÚƒ½£Ôù×ûÇÖëö߈öµa±̉’ºÛ«‚ ½9¬Öù×±»å̉ ưÀÛ«‚ ½9·ØĂƠƠX‡³ ™‰kß [ïSÏ)«‡“ÍjźƒvơĂơêÓ½€ĂÙ凿½Á¼µØË̉÷‡©Ç ƠơԳț¹ÇĂ·ÔÁÜÛ«‚ ½9Û«‚ ½9«ÔYçÚ©‡¥2ßëMöÁÄ–µØ·Ôù×½ơêÛ×Ûº©à¬ ©%ËlÁĂø¼¹Ú‡x­Ä±Ươê³zªø߈₫Ô«Ô°Æ +¡Ûô ÙÚö£ÔÑĂÛ«‚ ½9¡‚ăˆŸù׫‡“Íj‹ë™‰kß [ïSëö±È·“¡Û…»Ơơ·ØưÀ»½½€₫'ßÚ€ÓưÀÿàĂÓ¹Úϼ߈µÜ²º̣—¾ͽơèÅ߈›½¹ÚơÅàù¿ÆÅ éêÍË)éÛ9¥߈ă»ß½×¿8ÏÅív»Å8$¤‡$ÖơêáX×$₫™Ç_ÛÛ«‚ ½9·Ô©Ø‡9ĂƠ¡Ô¥Ó›ÛËÇÙÚY‡óÂÚª¶2tT˜‰j̃ZîS/™‰kß [ïSỞùêëöÙÚƒÖÙÚư“‡Œ£äÓµOçÚÅÅÿÚßÚĂÈ™ôÁ|‹Çá°»“È÷ÁÏŵؠÁù×±»ñÚϼÙÚÙÚº§½«‡“ÍjÙ–ÑĂó¶ă—Ó¿Å9¥‡9¥‡×ñÆ‘Æù׺­¾ÏÚ‹ÜǾ¼ ÿ¯¶®ö¿ç¾º»ÓÛ«‚ ½9ăà»ØÍË)éÛ9¥•Èû›ŸÄÛÙç÷ÁÏÔ8¤‡‰¿IƯº½Ăù×™Ó°»áƠ€Ó ߈î»ëööÁ÷Á«‡“ÍjĂƠƒv³»Á‡(æơ—¶‡™Óƒˆ÷Á©Ç9¥‡ͽŸd߈§Ó©¾ñÚ—¶‘!‡Û«‚ ½9©‡¥2ßëM«‡“ÍjÙö·Ó ¥0¹Ú̀ÓơÔ﻾çËǧԛ¾‡Ú±»µØ…ô«‡“Íj«ºÇç‹Ü÷ÁƠÏÅ÷ÁѾÿ–™‰kß [ïSшµØ¼€ ¥ØăˆŸƒëö©¼«‡“Íj«»÷Á±Ô›¾ƒ½§ôÙ½Ž±»ơèÅ㻫‡“Íj«‡“ÍjÛ«‚ ½9ù×£»ï»ÙÚ¥›·ÔËÖ·‡‘×8çưÀ8¤‡×߈…Œ›¾ù×ûÓăˆŸñÚ«‡“Íj±»µØÚ×™‰kß [ïSǗvơÄÓØ«‡“ÍjÉëöĂº¸Ú¾åŒ¿NǺ±½ơêÛ«‚ ½9µØ‰¾—ÚÛ«‚ ½9Á½ ºëöóÂö½ÏĘ‡Ù½ơĂ˜×é‡gÅÔí‰÷‡Ởëöÿ±Qư£Á¹߈ƒv­ÔăˆŸ¿‰ăˆŸ;k‡9ÎÅ5…Ơ9¥‡‹Ç»ËôƒØ©‡¥2ßëMêÚ ùשÛơêÏÅĂÙÁÍį¾ø×É»ÍÄ€Ơ«Ô¾º½9¥‡ÛÀÏßÄÙăˆŸ;kÇÖ«‡“ÍjƯÓ §ôÏÄßÚ“ºÏÔǃ½§Ơ½»ÍÄ߈îÆË¿Û«‚ ½9‘ăÛ«‚ ½9“ù×ö¬¾¦Æ Ù½ƒvù׾Ȝ¾…Öå¼ î²2ÇÖëö±»·Ú‹Üø×½‡xƒv‡Œ™×¹Ú™‰kß [ïSëöÀ«»Ï̉·Ó ¥0¡È‡º±»½íÁá=©Ó«Ô“ÈƠ ºÛÀêÓ±»•׃v¡ÈµØ“È•Œë́v§Óø×½ÔßÖÿ¯¶ưÀÛº·‡‘×8ç¾±»ÇÛă»çÚ߈9¥‡œ‰¾I™ô·‡‘×8çë¼߈‰Áª»ÏÅ—Óµ‰ßÚÅØ×ùͽ«‡“Íj Ơÿ¯¶Ï㙉kß [ïSÉ̉Óº…ô™ÔĂÈׯăˆŸ;ºÅëÓÏÔ‹ÇÏÔĂÙƒˆ߈£Çù×§Ô•%ïi…́÷ˆ߈9¥‡Ù‡­99¥‡¿ÅÉ Á ÛÚÍÇå×¾ºñÓÛ×ưÁƒØăß¹ÚûØ™‰kß [ïSÚÀ¯×ׯÏÔ´ÀƯº»ÓÖÆ½ívù×»ˆ½ÇÏ™‰kß [ïS™‰kß [ïSÛº߈ÏÅÏÔ©¾Ó̉¹Ú˜‰&j&̃&&&&Z&îS&ûƠѯơÄ©¼Yå̉ ³Û«‚ ½9ÏÄûÓ…ÛÊÖƒƯĐĂ¹Ú° êØ ÏÅÏÔỈÅÓŸÖù×÷‡đµ†À‡&€&è/&Ö:&ôÛ«‚ ½9¿‰ơèÅƯÓ ‚ÚŸÓÅ–€ºíĐñÓ©ÓÛÄÓùêÍÄù×₫¦®¶¦Û×߈ÊÈ9RƒÖƯÂÚª‚ +¼9Ơ´$ÏÅÙÅëÑÓ÷ˆ£ØƠù×ÙÚÂëöµôêöñÓ½€̃ÁơÔ¯áç'™‡”ĂÙ¹ÚÓØëöơú¥â÷Ú­ÔºôÙ½ÆéÓ÷Á«ÔÛ«‚ ½9÷ÚŸÉßƠ¬Ä™‰kß [ïSá«Ô‡Œï‡ĂĂÛ«‚ ½9ÁŸÖßÁĂĂ’‰2Ô,øµôÙ图´Ÿ}§È÷$“¨­½¼₫®¶ăàÏÔ™‡…Ú¡Èív˜êèä„ö‰Û·̣µØ­ÄÅÓơÔñÓơ}·Ô™‰kß [ïS£ÇÙ×ÁÈ·µØÛ×À¹±»¡ÛÓÅïƠ«‡“ÍjñÖù×¹ÚĂÙŸơ³ºó¡Ô«·3uUÏÔ˜‰j̃ZîSÏÄơê¾ÿ¯¶£»¦¹ +Đñ»ƒv½ÈÙ½¯×Óư¼…ö¥‰ÍL…ëöçÚ±ó½½Ü©àƠºmׯùêËlÙŒë*«Á̉Á+½ÿ¯¶ÁƯ÷ÁöÔ±»›¾ÿۣNj܉y‡ÅûùÚ¥ØĂÙ„Ö±»÷ê₫ÚơÄÑÓ¹Úù×™‰kß [ïSƠßÄÙ©‡¥2ßëMÓåÛÇ߈Û׫ԱԋÇå̉ ÍÓ™ëéåăˆŸ¯´ÉÛ™Ó›¾½€À½™‰kß [ïSºØăơ5ŸÖ­Öœ·̉ ¤0ó¹Y–¶™‡áê‚ÖÙ½ăº¡ÛÏÔƒv »ÁéÚºëö߈±»“Ơ™‡̉ÆÁ‡é/×:©‡¥2ßëMχƒv‹ÇÑÓ°»Û«‚ ½9øê³·Å¡Ô±¿Û«‚ ½9µØÓ‡÷Á¡È±»ăˆŸ;kå̉ ưÀöÁ›¾ĂÙ¸¹½ơÛªÔ›¾ñÓ¯ÈăĂ3ßƯاÔÂ™ĂŽĂ¼ÁÚ÷‡›¶é¡Ơ©Øíê™Û«»ÇÖº‹…”‹œH¢ä‹ÛÍÄÑĂ÷ÁQÁƯµ£ä±»µÙ½™‰kß [ïS±̉·ÅƠĽđ»ï»—Œ™Ô™ëéåÁƯ÷ÁŽ™‰kß [ïS«‡“ÍjêÚ;ÏÔå̉ 9¥‡̣ÂÓ¾ăàÿÚ±»ñƽ·‡‘×8纺ØÏ̉ïÂÁÓ§ÔơèÅ™ÁöÛ«‚ ½9ăˆŸ;›¾…ÚÇÖ‹ÙµÛ«‚ ½9߈ÙщƠíª¶2tTÏÅÛ«‚ ½9ùê¡ÇƠÀ‡€è/Ö:ăơßÄÙØYïô² ÍƠƒvó⩇¥2ßëMưÀùêß́ăˆŸ;ؽÏÄÙ½«‡“ÍjíêửÜÓ ÷„ëöÛ«‚ ½9Û«‚ ½9±»›¶é‡Úé‡ưÀ º«‡“ÍjĂÙƠơ߈庡Ç9¥‡ß»û‹Ç±»9¥‡°¿߈¿Ø™Ó«â±¿ù‡÷‡³¹:߈ÅØ›»ăˆŸ;匿NĂÙĂÈêö×Ăƒ½щíêêçñÖÑÓ·Ô˜êèäơê±ëØÙÚçÚ™Ó8¤‡ÖÇÖ³ëö™‰kß [ïSôê¢Ơͼÿ¯¶˜‰j̃ZîSƠÚïÀ¡óÇưÀöù¿âàÁ|‹¾ù×đÓù×¹ÚÿÚÍƠëö¹Ú½€ù×íÆ«âăˆŸÇ» Ơ ‰¿IßÄÙƒvăˆŸÇÅÓíêưÀÀĂơêỡ‡ßù×·ÅơԿ̓vÛԤ–¶µ†¥¾Û«‚ ½99¥‡¡ÔÑÓ±»·‡‘×8çƠĽ™‰kß [ïS˜‰j̃ZîSÛÚ™‰kß [ïS½—¶®×‹‚ÏÔ÷Áëöô«‡“Íj¥Æ™‰kß [ïS©ØÏÔ‹È«·3uUÙ½Ø0ÅØ›¶é¿ÅáêĂÙ•%¯×ÿ\àÓ¡È™‡Á9¥‡Ø‹ÜËÉ9߈éÓ÷ÅăˆŸ;Ư‰«Ñódzà釩‡¥2ßëMË̉ÏÔ«Ôù×™‰kß [ïSщåĂ…£­ăˆŸ;ùê•ÛÀëöÁƯ­Ø£Ô߈Ùڻ㱻ÁƯÅÓ¨ÏÔ߈Ǻô‡ưÀ¶Û«‚ ½9ø×ăˆŸ;ùêăÁ±»ÂË%ÍƠ™ôôÙ×ăˆŸ™‰kß [ïS±.¼ĂưÀª¶2tTí„ô‰¿I·¼Í7ƯÓ ̉ØÅƯ‰ÖY›¾¹ÚÇÅ›¶é«‡“ÍjëöÑÓ%¯È½˜‡ù‡ëöÆÅø¼ÙÚËÉ9°»ĂÙ߈½ù×߈߈±»ÀƯ÷ˆù׳ºó‡x™‰kß [ïSш›؛¾±»íü¿‰ăˆŸỞׯ™Ó­ô”ÙÚăê‘ÛÛ«‚ ½9á꽃ˆ—»÷Á߈Ơ½µØ¯ÛĂÙÏÔYƯÓ ù×±”«‡“ÍjưĂ«»½ăˆŸ;ô¿ºááÂĂÏÔ™Û˜‰j̃ZîSÛ«‚ ½9«‡“Íj¹Ú÷Á«d±»·Ô¡ÈÍÓ‹Ùá •»›¾¡È«Ú¸Ú±½…¾ï½ïÚĂºÏÅÍÓ°Ñ™‰kß [ïS·Ó ¥0áÖÿ§çÇÙ½±»±»ü̉…ÖÅÁ…±»Ù×ưí«‹Ñu‡ÇăˆŸÔXÏÅ߈¿àÛÄÓ¹ÚáƠ¼ôéÓ×Ơ†7§jöÏÄ—¶µ†™‰kß [ïS‡ÛÏŵØÛ×ËDZÔÁĂôăˆŸ;퇆ÚĂ¼é¼½Ơ‰Æ…Ø‹ÇƯÓ ψƒvºÓص؉øÏÅ›¾¸àß„׺¥Û›Ú9¥‡¾ïé©Ç«ÔËÇÏ̉ăˆŸ;ăˆŸ½§Æ©ÇØ߈¼ë‡º›êƒÚ›¾Û«‚ ½9ôñvÛ«‚ ½9ăƠµÜ÷ÁôêĂÙÙ½Û«‚ ½9ưÀµaĂÙÍ…œÁ·ÔĂŸ·ëö˜‡û¡ÔÖÆS·Ô«‡“Íj‰Ô˜ô±½å̉ ¨¼«‡“Íj³ ù×ơÔ©ƠÓ¾Û«‚ ½9ơê÷ÁŸ}µØæÚåÁö߈™‰kß [ïS±»›¶é8 +¤‡ +×±ëØ«Ô©Ç9¥‡ĐÓ罂văˆŸî»ă¸ºÛ«‚ ½9·ÔÅôéêñƒÖăˆŸ;ßÄÙăˆŸ;Ăô›ÚÁ¼Æ ÏÅź±»·‡‘×8çǺ—¾ÏÄ­ÄÑÓ‡Ú£äïÅÿ¼¡¼¥ÓËÇÙ½ÏÄ߈—±Åءؽ€éêËÇ߈Âơê¹Ú•Èû›‡Ç‡÷Ôù׫ÔÙÚ…$ù×ËƠÛµØÊÓ ÏÔÏÔÍÓרƒÖ±»ƒ×«‡“ÍjÿÅÔù×á¬Û«‚ ½9Û×§Ô×¾8ơêăơàê«Ô߈ù×ùêÿۃױ»™‰kß [ïS·‡‘×8çƒv›¾ĂÙƒv߈Û«‚ ½9ÿ¯¶ÛÄÓ£íŽѶóÇ·̃Ôơ½ÁÖØÙÚÅÓ°¿¿‰ÙÚăˆŸ½×Ü÷ÁÖÆƒÔơ꫇“ÍjƠX󇺳È߈½¸Úµ†ăˆŸ;ăˆŸ;ÅÔáÀ±»ƒv­Ö·Ó ¥0«»éêï»±¿·bƒˆ£ä±»µØ§Ô¡Ô³Üå̉ à=¿‰•Ö™‰kß [ïSûƯ«Ô˜‰j̃ZîSăàöÁ÷$ù×Û«‚ ½9¡È¶é¹Ú¿‰̃ÖÓ̉ÜưÀƒ=Ÿ}©Ơƒˆ£©¼ù×±¿ÏÔßÄÙĂÉ̉ă»ÑĂå̉ ½€ÂÉÛ«‚ ½9Œ‰°6å̉ çđĂ¼½€ív$¡ÛỞù¿°rƯÓ Ù ƠåÁºyª +¶ +2 +t +T +©‡¥2ßëMÓØÆăˆŸ߈¤½½º̀Ăù×Ç»³ÚÂÙ÷Úëöçëöö²¾ÚÀ¿àÏÔ¡Ô™‰kß [ïS‚÷ÁÏÔ–¾ûØƠ‚&ÏÔ¼ç¡ÛµØÑØ™‰kß [ïSÙ½Ï̉å̉ Ó'ÅØ¹ÚÂÙ£ØÏÅ·‹߈ÑÄëĂáƠăˆŸ;kÉóß„ÏÔ9¥‡ +ÏÔù×™‡ù×ăˆŸ;kƒÚ¹Ú½¼8¤‡×¾ËÉ9±»‹ÈçôđÆ±»¼€¡»Ù½‡º‡Ǽà á 8¤‡å̉ ÆèÑØ¼ô«‡“ÍjăˆŸăˆŸß»û·ÔÛ×Wï‡ÏÔß”ª»ôꙉkß [ïS±»ù×ÍÓÑÓîºíÖ½á·ÏÔ9¥‡ÍƠ÷Ú÷‡½€ƒw⺘‰j̃ZîSÛ«‚ ½9‰¿IĂ óÔ±¿ĂÙƠ«‡“ÍjÇ÷ÙŒë*«ö¶ÙÚ߈÷ÁÙ½ÅÓƠ߈ƒÖƒˆö‹ÙăˆŸ×¼µØí›¾Û«‚ ½93±»·‡‘×8çÛ«‚ ½9ψÍË)éÛ9¥¯Èäô¥Æƒv¹Ú°»±”å̉ ÿÚ›ÏÔ—¾·ÛÙ½æƠÙ½߈ÿ¯¶ù×ʹ÷ˆÚª‚ +¼9±»™Ó¹Úµ†₫¡Ôù×ÛÀ±½ÛºăˆŸ;ÏÔƒvĂÙÏÔØÅ ê ·‡‘×8çƒvËÖù×ơú›¾»Ø™ëé宽Èï½±»ăˆŸ;kơÔ«Ñ™‰kß [ïSƯúåÁ©¼‡º±»¿́±»±»·‡‘×8çÙÚÇÖÅÄëö÷nƒØ›¾¿çëçÚ±»±»›¶éơÔ¥́™Á“ÈÁƯëŒí‡áö™‰kß [ïSá ‡“ßÄÙÿ‡ÅÔĐØ§ÖÏÔ9¥‡öÁ·º»‡˜‡ÙÚ§ÔÉĂëö¹Ú÷Áƒv™‰kß [ïSá§ÔÿÚ߈ÁÚ̃Ú ĂºÙ½½߈Ù-éºööÁÀ½§ÔÁÏÔÿÛ߈ÉÙ™‰kß [ïS߈íêñÁ±»ƒvö›¶éßY˜‰j̃ZîSÇØ‡Œ‚vçÚσÍYƒvĂÙ8¤‡§½·º÷Ù߈ëöƒ©Ä·‡‘×8çÚª‚ +¼9¦ÆÛ«‚ ½9ĐĂ©ÜÙù׹੼ÿ§Çâ¡È™‰kß [ïSơêËåăơ§ÔíÖ«Ô¿‰‡“›¾ïÚ߈ºÅơÔ߈ăˆŸöÁ±¿êöÎÅ«‡“Íj匿Nù×ù×êÚ™‡—Œ¹̃ÄÔóƯ9¥‡×ÓỞí—GÏÔׯÓ̉™‰kß [ïSÏÅ˹£ä«‡“Íj£̉„ؽ߈±ëØרÓµ÷‡Ô±»Å$«»ñÓó×·‡‘×8ç½ÍÄÙÚï½Û«‚ ½9Û׋džö¶±»ÁƯ˜‰j̃ZîS9¥‡…öơơơêăˆŸ;ÍĂ…öơĂóÄÍĂÀ¹ï»ߌÛ,߈¡Û“ÆÂ“¹ƯN÷Úå̉ ù×ù×8 ¤‡ ×™‰kß [ïSù×ù·÷Á…»“Ç…ƠăˆŸ;߈ÙÚñÓơĂŽ˜êèäöûØ«́“Ʀؙ‰kß [ïSª¼ăˆŸÅ»ƒÖ˜‰ j ̃    Z îS ·Å‡ŒÙׇŒâàï»ÏÔåĂóÂ…»ëö9¥‡Û«‚ ½9½¡ÁưÀ™‰kß [ïSëö9¥‡×ÑøÏÅù×Á߈«»ơÔăˆŸ;¿Èƒv‹ÅăˆŸÇØÀ̉å¼ «»·ÔƠºmÿ¯¶ăàåÁ‡ºÏÅ«ÚĂ›¾ăàƒÖêö̀Óß»û¡œ«ê¥È…¥ˆ]1½£äÍÓÁƯ©Ç‘ÆÂËrÓÆö́¾ù×Û«‚ ½9‡×ù¿ÍĂÍÄ©‡¥2ßëM£@Ôơ™‰kß [ïSù×ÙÓư““Æ«»߈™‰kß [ïSí—G‹¿™‰kß [ïS¾Ơ×Ó‹ÜÚª‚ +¼9‘%«‡“Íjơ‡·Å™‰kß [ïSåÿ¯¶ä̉½Úºùש‡¥2ßëM‰¿IÛ«‚ ½9Ûסګ‡“Íj˹±»ơèÅ߈߈ÿ§ǼÔ›¶é½Ô«‡“Íjí¸å׋ӥâÅôơÔ›¾ÔXĂĂÙ߈ĽíÖ™‰kß [ïSăˆŸƒÚăˆŸ;ªÚÿ¯¶ÿ¯¶ơêÏÅ9¥‡ÏÔ‡¼ôå̉ ½רóÔ£ä•qÙÚÍӱ郈¿‰‹ÇƯÓ —Œ©Ó™ôÛÙ½‚Ø±Ă±»ăÁºĂÙµaùæ™ô—Œ™ÔûµØ½€ùæÛ×ÓØº½¹¾ơê߈áꙇ®GøéêçüöÏÔăˆŸ;߈ϼÛ«‚ ½9«»ÑÓ˜‰j̃ZîS9¥‡×˾‡ºϺÛ«‚ ½9ª»ÏÅ›·ÔͰ½Ó#8 ¤‡ ø×øơÓºíêíÚ߈‹ÇñÚ¼ZăˆŸ;߈™ÁñÓ9¥‡«)•ÖíÁù×ëö™‰kß [ïS°»éטêèäâḈ›¾ÏÔåĂ«‡“Íjéđ‰¿Iç̉ÓØÅÔùêùÜîÅ/©½Ï̉Û«‚ ½9×$ñù×ÛöËǓƷԫ‡“ÍjÙ|ô±»éê¹ÚµÜÏŨװ» Åôô»+¡»Äâ«»™‰kß [ïS¥Ùá —ŒÚª‚ +¼9—¾ëö™‰kß [ïSµØÿ¯¶¾ß»ûĂȵÛÛ«‚ ½9ƒÚÙ½ÏÔ©‡¥2ßëMùëµØ—¶ëÚͽ«·3uUëöæ߈Ëà³ÄÁĂûơê—àÇĂï»ÿ§áê™wßÄÙËÔƒvÙŒë*«‚v¹µ…øơêÏÔß»û؇ Î9 „ ÏŽ9¥‡÷Á½ăˆŸÙ$ó¶“Û~ÄÖëö›¾—Ó߈ơÏÅÅÓÙ½§Ơ£XĐæ½‹ÜÖÓçÚỞÏÔ„Ö;Ư‰™ëéå§Ô·§D ›ÚÎÅ»ÁƯÏfl ߈Âè ©‡¥2ßëM½ëëöÛ«‚ ½9“Ơ÷Ù›·Ôé‰ñ5ñ·½†Ç¼‰¿IÛ×ؽ½ÿ¯¶«‡“ÍjëöǼÙÅëÁ¹ÚÙÅë±ÔµØß»ûÅÔĂôÙÁÛ«‚ ½9º½̃Áï»—ŒưÀĂÈ߈‰±µØ“ƠóÇͼ±»¥‰ÍL…ÍƠëöàê½í›¾µ4ÄÁ©-§Ó×¾ăˆŸưÀ§é–âàù×÷ˆëöé‡ù×ưÀÛ×ơèÅù×êöÅ‹ÜơÄù×ÛǽÇÖѶëöû̉ªøËÇơ꿉¢È¯×Û«‚ ½9‰Ô‘ÓăˆŸÚ»öÍñ»å̉ —ïŽÿ¯¶߈ÇÖ߈«‡“Íjµ†íê¡Ươê䉩‡¥2ßëMív÷ÁÙ½шĐÓ‰¿I«Ôª»Ó÷ÁµØôÄ ¡ÈÀ×߈°»«‡“ÍjăˆŸ;Œ₫ûØ…n±»Å×ƠËÇ±ëØ‰ơ›¹ËÓ¡È⽑±“ƠÏ̉ívÛ«‚ ½9™‰kß [ïSÏÔíơëMÛ«‚ ½9ß„çÿ¯¶«ÔŸ\·Ü•Û߈ȸڰ»Ă™ëéå¡ÁÙÚ±¿ù×ÏÔùễˆÅÄÈ Ëû˜ÁÓˆ•=‘È·‡‘×8çù×ăˆŸ;›¾»½ö‰º·Ô»yÛÄÓøÈï½·Ôù×gĂ¡‡Ç/­Äç̀ơ³Ư›¾ỡëöỞ£äăˆŸ;¾ù×ù×¼€ƒ«‡“ÍjŸ\ÍÓ¶ÍÄ·‡‘×8ç¹Úÿ¯¶©Ç›¾µØỞ½×Ú¿°¿ăˆŸ¿‰«ÄÍÄ›¾¥È¿Åÿç¦Ø ïÔâ.äŒ ơ궯¾Ù×Å’º߈çÚ‘Æÿ¯¶‰̃ëöëöÚª‚ +¼9·Ô½Ù½ºÚ×û(Ö¾8¹Úù¾ăº¡ÁÛ«‚ ½9ĂĂá꫇“ÍjÓºÏÅƯÚö·̃—»÷ˆ©v›ÚßÄÙăˆŸÛºÍÓóœ‡߈«»ăˆŸ;ÏÅùêÅ÷ÚùºÓ¾߈̉́¼ƒˆÖ‡¼7¡Á́v÷Áçº₫$¡Ô9¥‡öÑÓ¿‰´½·Ô¹Ú½ÁĂ«‡“ÍjÙ½„ ’ÇÅØ÷ÚĂÙă»¼Úª‚ +¼9ơêëö˜‰j̃ZîS§ÆÄ« ©ƒ»5ö«»©ÇûƠ³Ơ­¾ÍƠ߈¸Ú +ïÿ¯¶ÓØĂÙˆëö߈Ơî‡ÛÿÚÄĹڰ»ÅÓ«‡“ÍjỞ­Ä˜‰j̃ZîSưÀè‰đ5đ¶ºÑĐß̃Ă·¥ÈçԶÀ½ưÁÓÅëöù×ù×½€çÏÔ©Ó™‰kß [ïS߈₫ưÀÿ§»Øå̉ £Çù×¥µù×§Ô÷Á¡ÛŽͺ%ß»ûרưÀ±»ׯö¶è°»“Ơ©Ở¡ÈÛ«‚ ½9ƒv×Ơ÷ÁŸÍÄÿן¾™ÓÑÓưÀ¹Ú€Ó±»Â٠dÂù¼ëÚÙ½öïŃˆ¡ÈøêÙ½º©‡¥2ßëM‡ºëÖ½âˆ:“ÆœÜù×éêößÓØ“ÈׯÅÓÏÑĂơ߈öÀ™‰kß [ïS™‰kß [ïSÛ«‚ ½9™‰kß [ïSÙÚ“È÷ˆô»Ăư“ơۆđ5‡ºŽÛ«‚ ½9ù×µØưÀŸÄÛ«‚ ½9߈£äÓ.‹‹È·¼Í7›¾ÏÔ“ƠºÅÀÚî»Ϻù×½€è‡™‰kß [ïS¿ë«ÓÖ“½œÜï³2“Û“Ơ8¤‡ÿ¯¶“ȩ؉¿Iơê¡È¾‰©Äƒ×½úØ ÙÚ߈ƒçơƒÖơçÑØ߈ÿ§ƻÅÏêëÚÓØ‘Æèêƒv‹Èéê‹ÇéÔµØÙ̉ăˆŸ;߈¡Á9¥‡ö‘Æ«‡“ÍjØŒê*ªçÚÓÔƯÓ Ïԙૺăê‹Ç9¥‡ăà—ˆ»Ø“Ƴ۫‚ ½9Ă8¤‡ßÁ¢Èß»ûÔ»Û×ÏÔÏÔÛ«‚ ½9ÑØÑÓ½èÓÙ½¼¸)ÙqÛ«‚ ½9Ô…Ú©‡¥2ßëM±»Û«‚ ½9áƠ¯ÈÍÓÑÓăˆŸ;ëöÉ›¾‹ÇéñăˆŸ;ĂèÙÚƒv9¥‡ơØÅØÙ×Ïű”£Ưå̉ ³ÙƠÛçÚ«Ôµ.¥Ù«‡“Íj«‡“ÍjÑÓ¡Ô¹½ÛÀơêơÔïƠ9¥‡½€Û«‚ ½9ĂÙÛ«‚ ½9»Ø»¼‘Öׯé—ß%ăˆŸ;Ư »Ø£Ç¾Å±»Ùשɷ‡‘×8çĐæÛÏÔ¡»”Èú§ÔµØïÚñÓ²°¿ÓÆÎÅÅǼÁƯơ‡¥Û9¥‡Ở±»§ÔăÇíö™‰kß [ïS§ ¯G‹ø³Â¶ÔÍÓÓà‹Ç¶Ü¾ơơèÅ—¾¿‰ÏÔ½¯G‹øÓØ̉ÁùÖ» ׇ‡ư2ÏÔÛÄÓ́Úñ»ï½Ü«‡“ÍjׯçÚăˆŸ;Ở½«·3uUÏÅÑÄëưÀå¿ḯ¡Ûÿ»÷Áơê«Ó¹ÚơÔÇÖ¥ˆ]1ËÉ9âà;ÏÔ‚vöÑÁ§ÓÁÛ«‚ ½9 ÁÛׇڿ‰ÏÅ»½¡Ûå̉ ùׂ½ñÆÇÖϼ±»ăˆŸ;¹Ú›¾£ä‡€Ù½«‡“Íj«Ô»°¿ÏÅñÚăˆŸχùêƒvÏÄ“Ơ¡ÈƒˆÛ¾ă½˜‡ؽ÷Áׯ«‡“Íj¡Áÿ°»ÍÓÍÄëö÷Á߈¥ˆ]1±»·ÔÑÄë»ÁƠ‡º½±»§ÔÑÓ½ëöÛ«‚ ½9á±»Ö¥Óƒvá=÷‡ÙÜ“ÇóÓ½—¾£á±»×ÜưÀ9¥‡™‰kß [ïSáƠ£äË̉߈߈ôĂëöƯơ£Ç«Ô§¹£ÇÁƯăơưÀ¡µÀÁ|±»™Á—¶íêăˆŸ;®×ăàÚ™‰kß [ïSéJé‰Ó5“gesÁŇŒ‰¿Iéê“Ơµ†¯È×Ơ†7§jØ×ÈX™‰kß [ïSÂĂ¼€äÁơijîÅöÁ «»ÏÔ©Ç™ÁĂĂ ›­±àéM™Ø·̣ûƠ…Œÿ™‰kß [ïSƯÓ çÚ¡»óßÄÙ™Óơl…½ù׫»Ơơ±̉ƠXÚ°»ɇ·Åºϼ“Ơ°»߈ÑĂ»™‰kß [ïSñÚ†ŒưÀÅÓÂưˆº™‰kß [ïSÓÆ‰Ô¡Ô©ØáƠ¯È÷Á9¥‡½û"ÏÅ™ÓơÛ¬ÖÆù×öÍĂív߈ăˆŸ±»Û׫‡“Íj¡ÏÁ̉·û°ƒvµØ«‡“ÍjÈ™‰kß [ïS­ØÛ«‚ ½9©ØÙ½™‰kß [ïS°»ùêëöÙƠĂù×£¨çØ£äçÚëöÛ«‚ ½9ï½­Ø…»Ư‰ƒvù×°¿ëöŒ¾ëöéԜ¶«‡“Íj‡ŒăˆŸñÚ™‰kß [ïS³ÈăˆŸ;ÿÚ©¼µØ…Ơ߈ÁѶ  ơêçô‹Ç˜‰j̃ZîSơÅ©¥‰ÍL…Ư‰×Ơ†7§j™‰kß [ïS­ÖßÄÙÑ·‡‘×8ç—»½ëÿ¯¶‹ÇÙ½‘̃ù×å̉ ĂƠ½«‡“Íj‡9£Ø߈ù×Á¹ßÖ¡Á—¶ÑØ«»™‰kß [ïSÏâḈ¡Ô«‡“Íj½Ù½Íơëöđ»Íé‹ÇŽŽ‚v%ƠרÙ½ÏÅ™‡Û«‚ ½9¾¾Å ÙÚµØø×„Ú +™‰kß [ïS¨)רëöéê“ƠÚª‚ +¼9ç$‹ÇÛ«‚ ½9‹Ü—¾ÅÙÚ«·3uUûÓ¥ÛÚª‚ +¼9“ȧô‰¿I·‡‘×8çÍB“³ô›¾ÙƠ߈è‘öè$‡äÏÅû¥¤¢Ç±ç÷ÁóÂưÀ±»ù×ÍÇÛ«‚ ½9«·3uU·Ô‡Ç¸Úƒù××ĂÓÆÏŷű)ëö Ëû߈‡xƒ­Ä8¤‡×™‰kß [ïS×÷ÁÓÆ¶Ô½ùשÇÚª‚ +¼9ăàÁ½û¾…Öä̉øê«»©&ƒv³ÂºÏŇx¯×Ï̉ÏÔªÚáêụ̀¶ÿÚÍ·Ï̉¦È Á̉“¹ƯNÏăv§ÓÑÓ½ƒĂÙÚñŒÏÄëƠUƒv£»ÑÄëÛ«‚ ½9ƒ»ÁƯÖØÅü¦†ƒˆÛ«‚ ½9Ăȱ»÷$ƒv߈ù×¹½‰ëöÏÅăˆŸ;k¸ÚÿÚ¹ÚƯºÙÚÄôĐÓ¡ỒÓ±»‡Œ¡»Ù̉̀×ܶԖ¶éºå̉ Ơ»ÁáÍƠçÚ¡Á™‰kß [ïS¢X±»ív߈¡ÁƯÓ ɇǺÓÅăàƠ¹]ßÏÅŸ¾›¾ÎŤˆ\0ëö‰y¹»™‰kß [ïSÎŽ½€ÏÔÛ«‚ ½9áºăàº̉9¥‡·ÜÓØ­vÍÄôƒ÷ÁÚÚ­ÈÏÔívĂÙ­¶¡Ơ½ưÀ¿»Ž“ÈưÀÔôÍË)éÛ9¥ăˆŸ;—ÈÄ–Ơ_éÚ¯:½ƒˆ·ô9¥‡ăˆŸ;̃„ĂȽë˹߈ÁĂ·rù׫‡“ÍjªÚá X§×9¥‡äÆ »ùêÜÙâٽߙ³b±½ä×§àƒÔщ‚v—ÂÖƠư“ï ö©‡¥2ßëM̃ÁƒÖ«Ô˜×ƯÓ °¿ô—»ÅÄ©ºÓ¼˜Á ½ÉæĂÙ«Ôå̉ ÑÄëùêÏ̉£Èô߈™ëéå «·3uUµ́Ÿ¿ăơª¼» ³ºóÁĂÍ­Hµ‰Ó±»•Œ”ƒvÛ«‚ ½9ó×ÇÖùêïà¿ôï½½€Ù½Éà×Ơ½¾‡ÏÔ»ëö‘Û©¼Û«‚ ½9ăÁê$›¡ùן̃£ÓÛÚ«‡“Íj¿Ø·‡‘×8çÂÏű»ÅÉÛ¾ºù׃vÅÔ¿½ÙƠ¯ƠÛ«‚ ½9±»öÁ³zÇ÷Û«‚ ½9™‰kß [ïSµØ¥ˆ]1ш¬¿Ơº½ù×ÙÚÖ¼ ÂÙ·‡‘×8çƒv“Ơµag߈ĐÅó·’̀jëöÙ×›¾¿(µÀå̉ Û«‚ ½9ÓÛ¹Ụ́ǽÔơ$¯¾±»½Û«‚ ½9ĂÈǺ«ÔµØƠÏÔñÆûĐ³Âùêæ̉߈«‡“Íj߈̃ˆï³2‚ưÀ­Ä߈߈÷ÚùëĂÙÉ÷Úª‚ +¼9ăˆŸÁ̉ÇÖéºë织÷‡×Ơ·ÔÛ×Û«‚ ½9¾±»óÄ÷‡÷‡ù××ĂºÁ ¿ôÛ«‚ ½9ëö‘Æ߈Ù½؇Î9„ưÀÂÙ“ƠÛ«‚ ½9ºŸ}¡Ô¾•ÖÙƠÙÚÿÚ߈Á׃vÍĂÜ÷‡Öƒv·ë‘ơéºå»ùש¼ƠÔ“̃º—¾Ž±»Ù½åƠ³±»îô9¥‡›Û­Ä½¦‹™‰kß [ïSÛ«‚ ½9²È9¥‡ơỒÓñÚÙÚĂÙŒ₫¯×«»åĂ“¼ù‡¹ÛŸÙ#¡h«‡“ÍjÛºŽ±ÀÎԓƘ×ù×ĂÙ»ØĂÙƯ‰øê›¾‘ÆƠƠÅÓ†ø¿ôăˆŸ;±ëØ“Ơ« ©ƒ»5߈‡ëö¥Æ¿ôƒvù×߈Än·¸£»£Ø̉ÅĂ$ô¯¾ëöù×ơ»Ơ¾G̣Âù×Ù½©Ó¾Å¾ùêÓ̉щ̃»ú… ËûÏŧÓƠ´ÁƯ©Çÿ$Û«‚ ½9™Ôù×­Ö9¥‡µØ߈ÛºæÚ©‡¥2ßëMăˆŸ;¶èƒÚơèÅÁƯ÷Ô¡߈Á̉ƒˆ£ä›¸ĂÇÓ»Øă»Ù½Û«‚ ½9Ù½߈ÛÚߌÙ"çôÅÔÛ«‚ ½9Û«‚ ½9Ù½˜ ê è ä ö釡ÛåÁö·Ôôêù׉¹Âׯ² «‡“Íjù×Û¤…Œ®Èƒ½Ï̉í—G¿ÔçÚ™‡ơ꿺»ÅùêëöáÓ“«»¥Ç­Ä ËûÇÖÚª‚ +¼9¾ß +ÏwÏÄÏÔ½©ÜÓϹ÷ÚÀƯ¼ơÔ•›¶é¶èÚÀñÓĂè”Ö¹Úÿ.ÍË)éÛ9¥÷ÚÍÓ­ÖÙÚ¥ˆ]1ÍË)éÛ9¥±¿ù¿·ÔëÚ²ÂÏÅ¡ƠíJ8¤‡ƠĂÙÛ«‚ ½9匿N÷Á‘³ÅØơêŧÆëö™‰kß [ïS‡xÿÚÁ¾ÏÄÏỘ¹åôƒvăˆŸ­ôÛ«‚ ½9߈ăˆŸÍĂÚª‚ +¼9ÎÔ›¾ơ»¹ÚÁĂÍ麥ǵØÚ×ăˆŸ½ÍË)éÛ9¥§ôĂ½­Ôÿ‡¯ƠÙ½©ˆ‰ÚÜÓ µØ× +Çŵؙ‰kß [ïS¿øÚÙÚºÄÁ¡ÛÉĂŽ«‡“Íj‰¿I‹Ü·Ó ¥0…È!£ä«‡“Íj™‰kß [ïSß»ûÙ‡Ï9…çÚËƠ±»‚vµØ±»¼Ôô߈•Èû›À¼ÛÛÀ́ơăàÏÔÏÔôêăˆŸ½€‹ÇÀ¹íØîºëö·Å˜Á‰ÂÓÁ™Áオصa¼€ƒ¾‘µĂ÷ÚÓØù׿‰ƒvëöñÚœ‰¾I‹Û›¾«Ôÿ¯¶ß¿‰ĂÙ¶ï»ÏÔôꙉkß [ïSÏÄóá߈ăˆŸµØù×ëöñÓÅäÿ¯¶‚5ÛÄÓÓØ“êûد¼©Àùá=öù×­Ö½ »ÁÂÙëöơê±»Û«‚ ½9¹Ú½€ăˆŸ;ÏÔÁôĂÙöÁĂÑm߈Ù½™‰kß [ïS«âº©‡¥2ßëMĂÙăˆŸ;kÙܸÚÿÚëØÏÅÇZ£‡ÏÄă½¹Úç̃À½Ơ©Øừù׋ÇÿÚĂ$ÍË)éÛ9¥ªÚßÄÙ±¿‡½éêÛ«‚ ½9™‰kß [ïS¿»™‰kß [ïSßrº½Ѷ«‡“Íj9¥‡ˆº”·߈—ˆÏÔƒvăÁĂÙ·Ô×¾±‡»Ø½̉Å¥—ÓÙÚ±»³™‡ơĂ“º™‰kß [ïS£XÙ̉ơê§ÓÛ«‚ ½9©ÓÇØ߈±»¾¹ÏÅÛ«‚ ½9ÛÆ–ˆÿÚ™‡ÔXă‘·ó¹9¥‡ж½€ö¡Ûơ߈ŸÅƠį™ëé婇¥2ßëMù×ïƠÓµO™‰kß [ïSÁƯÏÔơÔÀ¿ăˆŸ·ÅÏ̉¹Ú«%Ơ’ÁƯù‡ƒṽ» ú ù×±»¥ˆ]1ăˆŸ;kƒv箼Ơ³ÂôêƒvÏÔÿ¯¶±»•Èû›ÏÔÏÔ×èÙÚ¾Äﻼå¿é߈Úª‚ +¼9±»Û«‚ ½9Ï̉ûÓ‡ÛĂăïăˆŸ;ßÅ›¾©Ø}߈¶ô₫ ®¶ ̃΋ÓѶÏÔ¿ßîºơêù×ù×¶  ơꩼ¥‰ÍL…Á½ƒv∠  :j»ØÏÔßÄÙ«‡“Íj½à́ăˆŸ;÷Ú߈ÿ¯¶çô߈Å»±¿ÂÙùêÓÅù×ù×߈§ÔôêÅôÿÂÛ«‚ ½9öƠ«Ôç̉âÁÓ•±Ôù×´́ï»¶ÇÖÏÔ±»…¼ăÇí¾½ƒÖ/߈å¼ ÂĂù×§ô™‡ăˆŸ;™‰kß [ïSóĆÇï½å̉ ÂÓ·ÅÏÅ«‡“ÍjÆÙ½«‡“Íj†ŒăˆŸ;÷Ù™‰kß [ïSÍË)éÛ9¥™‰kß [ïS¹Úëö™É›;¹Đ™‰kß [ïS«‡“Íj©ƠđÁ߈ƒÀºŽ˜‰j̃ZîSï½ĂÁƯ‰Ô‰Û½ĂÙ•·¼Í7½³(ƠĂÙ‡“ơÔưÀŸ\Ù½›¯«‡“Íj³È» ¯»±»ơĂ߈ƒˆóÄ·¨¸àÙ½±»ËÓ°¿,ϹơêÏÔßÚ‡ĂºÛ«‚ ½9ǼÇç›¾Ă¹ïÓƒvùסáêù×ÿÛ»ˆù×߈‡ÇíƯ‰¿Iå̉ ÿÚ¡ÛÛ«‚ ½9ăˆŸ;߈á ©Ø“È߈ó‰›Ú9¥‡ψ¥ˆ]1Áă“Ơ¾¶èăˆŸ;k°&߈øê¶±»߈ƒvăˆŸ;µ«Èƒ×™‰kß [ïS½ô¹ÁưÀ—»߈“ƠÛ«‚ ½9¯¾£»ơêùׂv˜‡ºßÁׯƒvªÚ×Ă¹Ú½çÚ™‰kß [ïSÙ½ÇçÎßß»ûéÚ«‡“Íj—¶óĂíÆÅةӯG‹øºH§Ôï½¾߈ƯÓ Ù×ăˆŸÓ×I³çØ߈ÏÄơÄ÷ÁíÖ¿‰‘ÚívăÇíÛ«‚ ½9—¾§Ó´aừ…ÖÙ ½ô§ôÁ¹™‡ù׋Èùׂ(ä̉ă½ơêăཤكv‹Ü‡Ç†ÚößÅçßÑÓÅÁö¶±̉†Œ¿ê¾ +ﻩ§dÛº‹Ü«‡“Íjù×̃ÄØ·‡‘×8çƯÓ ­Ä­Ö™‚Í•ƒÖ‡Œ₫ ®¶ öÛ«‚ ½9ùôóÇùוƒˆ§Ø‹ÜăˆŸ;ăˆŸ;颛¶éù×ó¶  ơÔ­ÖÆùô±»ËÇÏŪ‡’̀jơĂ“ăà™ô»¼‘¨º‡ººÁơÔ¾ơÛÛ«‚ ½9ÅØÁÓ¥ˆ]1³ÂĂ×̉ø×©‡¥2ßëMÏÔÇñ»ù×ѼÏ û؇§Æ½ÁÿÚ߈­½¼ÏÔëö—¶ß»ûĂÙĂ ÷ÁÅơÔ›¾Ï̉ù׈âº÷å5ӅǹÚÏÄÏÔÛ«‚ ½9ßÚ¿çăˆŸ;¥Û߈ʹƒv™‰kß [ïS·Ô½¡ÛÙŒë*«߈ăˆŸ;µØ°¿Ù½©Çû(ÙÚ˜‰ j ̃    Z îS ăˆŸ;ÙÚ«Ôﻓ·Å•Œ„Ö߈ƒv߈ÙÓ÷Á½ëö›¾•Œ™‰kß [ïS߈ùêơĂí—G¼€§Ô¥ˆ]1˜‡ÎÅÁĂ…ỗÄØÚÀϺơèÅÁƯƯÓ »Á¶ëöÙ×·¼Í7ܽơê±»÷¼ĂÙ·ØÚª‚ +¼9ÀÙá ˆßçƠ¾G¡ÔÁËׯăˆŸ£ ¾ÙסƠX‡“ˆø±»³ÈŸ}÷å5Ó߈½ÏÔ§ÓïÄơêÅØÉ̉ăˆŸ™‰kß [ïS¹Ú×$«âưÁƒ™‰kß [ïSëöĂ(×¾­Ö›Û÷´ôĂ߈ÏÅ£Çùׇº¥€ÏÔ«‡“ÍjÔX™‰kß [ïS‹Çù×™Ô«̃ñø™̣Ơơ†“«‡“Íj’Èù×ÏÅÚº́ÚôÄÙ½ûœĂÿ‡½€´´†»̉³ăˆŸ;k߈öÏÅ›¶é£Xó›¾±»ưÀ¢»Ö‡¼7«‡“Íj¾ÅÑæ¡»ùê³ôåơÔϺù×ù×äƠơêÚª‚ +¼99¥‡ÏÅơêÙÚ̃ˆ·Åăˆÿ×™‰kß [ïS“ÈÏÔ›¾Ï˜êèäơÏÔ½áÛ¿ÅÛ«‚ ½9Ơºm¹ÚßÚゥØí—GÏÅ·¼Í7߈‚½­Ä›¾Á«)ù×ïüÏÅ«‡“ÍjĐĂÉáÀÛÄÓÇÖœ‰¾IĂÙÂÙ»‡ÏÔơꙉkß [ïSƯ‰°¿ÏÔĂÑÓ÷̣½€ƒv‘Ó÷‡߈ÅÔ€«‡“Íjù×Ç ™ëé唋ØÅê¬Ö«‡“ÍjË®ù×¹ÿZÿZÏԣ䙉kß [ïSùëÿ¯¶íÙ£ÇÙÚ̃»úºÿڇͫ‡“ÍjÖÜ›‡ÙÚ«‡“ÍjµØăàñÓ߈™ÁÏëöÙ½ËƠéềÓ™‡µØ‹Ü̉Æ߈ù×ÅÓ™E«‡“ÍjÁĂ·Ó ¥0ƠÙÚ­vɸ£ ÏԵȓÈÑ•ĂÙöẳ±»÷‡‰ØÜù××Ó½ÛĂÙ©¼߈ëö¨Ç¥Æ‰¿IÙ‡Ï9…çÚÑÓÏ̉„ø·‡‘×8ç½€™ëéåªÚî½Ç»Ơö·§D Û«‚ ½9÷Áÿ¯¶ơÚƯÂăˆŸÅØ¹Ú™‡±»¯_Ơ™‰kß [ïS¡ÈăˆŸ;̣ĂÅûÓù׳ºó£Ç߈¡ÔëöÑóÙÜ™‹±ëØ÷Ùív8¤‡Ö«·3uUỞƠºm¸¾èơ «»Ï̉›€Û«‚ ½9½½—¶‹’¿»÷‡ÎÔ½̀ĂÇ»öëÓ›™‰kß [ïSÙ½ßÖºÙÅØ™‡ửăˆŸ;Ï̉œ·̉ ¤0½ÍÇăˆŸ9¥‡£ÇÛ«‚ ½9Á¼Ä”Ô÷Á™ëéåûóÇŸ\ëöÙ½щÙŒë*«¹ÚùêÍÓ¿‰³×£äù×½Ôy‹Ç½ßÁ€ºù×Û«‚ ½9—ÓƠÅ¿º˜‡ÿÂϼơÇñ5é‰ñ5ñ·߈Û¹ñÚ¸àöÁ©ÜÏÅ8¤‡¨ØƒÙ½ư­³ØÛ«‚ ½9½ØăˆŸơê÷ˆ·ØÑŰ»ăˆŸ«‡“ÍjÏ|¢È0Ÿ\ñÓÍË)éÛ9¥8¤‡Ö½Í” ÁĂ½Ü÷‡¹³Â߈ÛÀ߈ÏÔ—ˆƠÄÙ̉ƠăÓÇÖ™‰kß [ïSù×¶Ô +‡(Ổñ!ø×—Öï½ïÂÇÖăˆŸ;k‡éÓÁÙ½ùוÈû›ÏÅ«‡“ÍjɇơÔ©±»ŸÖë¼ÔX—Ûó°߈±ëؽ€ưÀÅàÍË)éÛ9¥çÚĐÓ§Ô¿ØË¿˜‰j̃ZîS«‡“Íj°Á +߈߈ºÛ«‚ ½9¶Å£ä‰Áº·Øù×ăơ₫«‡“Íjëö«‡“Íj±»ÇÖƯºÂÅÄÓ¼›¾₫.«Ôù¿߈¹.ÅÄÇÖˆµa—ăÇíÁÓívÛ«‚ ½9áê£Çơèź˹›¶é³æÓÓơê÷Ú§Øù×ÁƯÅØ™ëéåăˆŸÏÔ»ÅÁƯX±»ßÏÙ̉“ÈưÀÙ½ƒ¾‘ÙŒë*«ˆ»ĐÅöÁ¸«‡“Íjï»™ëéåÏí·‡‘×8çÏÅÇÖăˆŸ;±¿ù¿¡Ó¯º½ ÏÔÙöÏÔÿÛû”Ă Â¹­ư“©&ÏÔÑ́ËÓÍĘºơĂ߈̃ÄØỞ™ëéåñÁ9¥‡éÙµØÍÇï»ƯØƯÓ ĂÙ¯!±»¡Áàêø×ÿ¯¶•%—¶±»›¶éÙÚùơ©ÓÏÄÏÔ¯̣˜‰j̃ZîS–Ó=ǺÁá ·Üù׫‡“Íj8¤‡ù×Ù½щ˹éÓÅô߈ÑÓéJé‰Ó5“gesÁÅ«‡“Íj₫ÚëÓø×ëö‹ÇÏÔëÓ̃ˆ êöÏÅÏÅƠÅÏÄÛÄÓ•ơÔ¡Ư³ºóơêùê8¤‡’ƠµaÅÁ¯Ël˜‰j̃ZîSvµ¹Ú½ơÄïÅç̉Ă¡Ô§Ô¶‰û(ÍƠ؇Î9„gƒv߈ĂÙô±»‘÷ơÔÙŒë*««ÑÙÚÛ«‚ ½9©Øÿ¯¶ƒéêíÁĂĂ ›­±àéM«‡“Íjs¹ƯN·ÅôêËÀ«×¯È¿‰Ú×ÿ¯¶Ơ«‡“ÍjÏÅñÓÛ«‚ ½9ûÏ|¬Ö«ôƒƒvÏÔĂÙµ†ר±»ëö¿½ơèÅçÚûƠ¿ÅÏÔĂƠ€ƠáÚ£ä½Í¿ÅÓÁ±»ë±âḈăˆŸ¡ÈăˆŸ;kâˆÙYưÓÓ»n±»ÅÓ½ëö†ƯÓ ƒ½‰¿I×ƠëÔ¼÷Á»½½ëÔ÷ÁáêÏÔ«äÛ×¥ˆ]1¾Ú÷߈÷ÙíÖóÊỤ̀‡Û‰Û¡Ç©"ăˆŸ;ơèÅ߈ϼºº₫ÛûñÏÅëö™·ÔÛ«‚ ½9º÷Ù½Ó̉“ƠÏÅñÓáêÙ½ñÚÛ«‚ ½9ÿ¯¶ĂÈùêè‰đ5đ¶Óµù×ôêÂש¼½ƒv¹ÚáăˆŸëÖÄÓ–³ÆÏÔÏåƒv‹Ẹ́‹ÙƒvÏ̉¯¼ñ¨±»‹Ü«‡“ÍjÙÚß%ù×§ôíqăˆŸ;këö»ˆ½ư“û‰ŒƠ¹ÚµØÛ«‚ ½9¹Úù×߈ª‡’̀jƒ±¿߈‡Ç¹ëö‹ÜƒÀáÙÚϼơèÅ¡Ûëöù×ÉĂ·ÔÙ¬È,±»Ñ·‰’™‰kß [ïSÏÔáê¯È›¶éÏÅ«‡“Íj™‰kß [ïSù×gº‹Ü¿è߈ƒvÉ̉Û«‚ ½9ƒvơĂ߈ÇÖÍË)éÛ9¥±ơ¯×߈ÿÚ‹ÇûÖ߈ƒvơÔ³ÂÛ«‚ ½9Åôª‡’̀j§Ơ¡ÈƠ ù×ăˆŸ;±»ÙÅë¹Ú™‰kß [ïS߈ĂÈÇØ±»ÏÅăˆŸ;ÏÅëö¥Æ—¶¿÷Ô°¿#éÓĂÍĐáÓëöµº̃ˆÍåñÊÁ̉§Ô‡¿ÀĂ¹¶—¶ŸË¿—¶ëö¹Úèơ χÇÅÓ§ÖÏÔ‰Û±Á›¾öÁ‚½ưÀăˆŸ;óµØù×áö˜êèäÁÚÀ“Ơ—ˆá ‰Û8¤‡ÏÅăÁ§ôÇĂñó™‰kß [ïS«‡“ÍjÛ«‚ ½9Ăƒv…ÚÛ×öˆáØå¼ ¾™Ø­ÄÿäÓÓï¨ĂĐ«‡“Íj‹Çù×ùơǃËÁƠÂƠăˆŸ;ù×öÉ6ăơÑÓÅÓ™‰kß [ïSÓØ¡Èå̉ å̉ éÚ“¼©º™ÔÙÚ©Óù×߈³(±¿ï»ûêÚÇ«‡“Íjéê½ÇÖ¿Å̃ˆÚª‚ +¼9ƒˆº¹Úù×ÙÏỒÓëöơØö°»÷ˆĂÙ×ÅÔ©¼ơê½›¾åĂ³½Ô›¾ƒˆăˆŸ«d›¾ÓÔ₫§‹Ü¯G‹øÏÔÿׇưÁÛ«‚ ½9½«‡“Íj¶èÏÔù¿ơÔÏÅé‰ñ5ñ·߈ơ»9¥‡Ó؇ÍÓ¿‰™‰kß [ïS½ôËÇϺ®Gø™‡Ïů¼óÂÛ«‚ ½9ÓØÙŒë*«÷ÁÛ«‚ ½9ù×ÿ¯¶™Ó±¿á º̃ˆưÀ¹ÚơÔ߈ÏÔÿ$›¾»Ø¡º‰¿IŸÖÑó›Úµ.¥ÙÛ«‚ ½9æÚ“Èå‡ĂcóÇ€Ơß +ÍË)éÛ9¥Ïů¼ơõ†Ë̉ơẴ„©¼ƠXöä5̉½·Ô™ëéå½Âáê±ëØûŸƠX¯¼±»ÏÅÑÓÄÓÅÄưÀăˆŸ;Ơ™‰kß [ïSăˆŸ;ù×Ăôù×ÏÄơêÛ«‚ ½9í‡ëöÓ̉¡Ç±»™¸¼Ø9¥‡×¹ÚßÄÙÓÁÏÔăˆŸÏÅÏÔôĂï½½ÍË)éÛ9¥ùëù×÷ÁÓºÙ½µØ߈ÍBÍBÿ&öÀé𻙉kß [ïS¾ëö‹Ç߈¹!³ÓÍÓ‡Ú­¾«·3uUíÆƒv°»÷ßỞ½±»ơÔö½ÎÅ +¹ÚÓËÇרî½™‡‡ăרÙ׆ڽĂưÀÁ½¯Ü’ÆĂÈÍÓ‡ÚÁÚ¢ä»ÁĂÙ«‡“Íj߈̃ˆç̉­ÚÄØĂº¬ÔµØñÚ¡Øå̉ ĐÓÏÅ«‡“ÍjµØÙ½ßÄÙº½ƒ߈›¾çÿ׸à!ù×ÇÖ¡Û‡Œш®GøÑÓ™‰kß [ïS±»§Óêöµa¹Ơ߈ÙÅë¡È¼Ïæ±»™‰kß [ïSèêưÀÉîÿ&ÏÔ¿êÁ‡é/×:öÏÔëö…áê» ©ÀíÆưÀù×¹ÚóÂÎ̉µê«Ñ™Ø›¾Ù×öƼ +™ơØ× ›¾ọ̈"Ü¡­µØ…¾¾ßÛ«‚ ½9±½™‰kß [ïSÿ§éØÏÔƒˆ߈àêù굆ï€ăƠÇ™‰kß [ïS×¾û:ư“ßÁĐæ™‰kß [ïS߈˜‰j̃ZîSß„™‰kß [ïSƒˆùꩼË%߈ßÏ½ÖÆ»‡Û«‚ ½9Óˆ•=‘¥Û©‡¥2ßëMí¶É€¼Ÿóỵ̈߈ăˆŸ;k›vÇ̉³­½¼ưÀơêé­Ñ•ù×ÏÔå̉ ç)¨‡¤2€̃êL‹Ü¥Ă±»§ÔỞµØÏÅă‘·«‡“Íj»íëöÛºÑÓ«‡“ÍjÏÄƯơÙܽÔÙ½ÉÛỔóÓ×̉Ù×ÏÔíÖ£ÆÍË)éÛ9¥øơăÁëöëöÅØơâ±»ª‡’̀j¿‰Ùׯ¼¸ÚóǨƠ«ÚÓ_Ñð»÷ˆíƋǙ‰kß [ïSƠX½—ƒvÇÛµïÛ«‚ ½9ËĂº™‰kß [ïS½€ÆéÓ߈óÇßÄÙăˆŸ½¿ß¿́ăˆŸ;9¥‡™‰kß [ïSç̉Û«‚ ½9™‰kß [ïS«́½ÏÅ«‡“ÍjÏÅ™“¹ƯNÑÓÍćºƒv­½¼±¿›Úư‡±ù1ÏÔÏÅÛ«‚ ½9Yù‡çÚù×Äôß»ûÍ׺ô“Ơ‡ŒưÀÛÀÙ½±»÷Á±ëØÏ̉ơêñÖ½ô±¿₫ ƒÚ×ß™‰kß [ïS·‡‘×8çÓØ‡º…Øϼø×ŒÓ‡“Ơ߈—»™‰kß [ïS½̀B™‰kß [ïSÏ̉ív½™ơ¸Úù×Û«‚ ½9ù×ëöùê¡Ô÷Áù×ÏÔßœ«‡“Íj›¾“ƠÎÅöéêå̃Ûöù‡Å˜‰j̃ZîS¥«»¥Øù×™ÓÛ«‚ ½9›¾«Ô‡ïÚÓº÷ˆỞĂÙ¹àœĂÛ«‚ ½9 Ơ˜êèäôÁĂÔ ÄÔ½ˆÔƒˆµ½ÿÚ»ÅÏ|„ø̣ÑĂÙêÓù׃ÖëÓ¡ÁÉ̉ïƠăˆŸ;ÿ¯¶ÙÚ匿NÅÓÛºáƠ®È±ëؾ’ºÚª‚ +¼9ÏÅ«ấ–Gvº—»ù×™‰kß [ïSù×·‡‘×8ç©ÓÇØÿ¯¶߈öÚä̉ + +ăˆŸ;™ÔÍ­HÙÚưÀ‘í˜Á÷ä5̉¯̃Û«‚ ½9å̉ Û«‚ ½9«ÚÿÚÛ×Ư½ÑìÄÍÓ̃ˆÛ»÷ö¨ÈưÀËÓ÷Á‹ÇăˆŸ;÷À™‰kß [ïSÚª‚ +¼9Û«‚ ½99¥‡×ĂÙé‡ÅÄÁĂÄöÍÓ߈°»ÙÜÁËÇÿÚøể™ĂÂÈëö߈½±»™‰kß [ïS™‰kß [ïSμÓƠʙԽưÀå̉ µØ‡›Ú»‡¿º÷ÁÍÙÚß„ưÀٽŻ©Óß›Ѷ‡ù×ï½™Á߈÷íÿ$ôç˜ô°»Û«‚ ½9ăà‚văˆŸ;«»½Áéê߈ĂÙºÁ̉Ó ‹›æù×›¶é¡Óù×ÅÇlß»ûÅÔ“Ơ™×ÁÓŃ?®Ơ£ë’Çù×ÏÄA³8¤‡ÖăˆŸ;ĐÓ¾ÅÁ߈·Ü$³Â™ÔÓØ£ØƠ£äăÀöÛ«‚ ½9Çï±»³È«Ô‘°óÔÓØïƠ÷ÁƒØÛÀÛº¹ÚÙŒë*«Û×ÿÚá=ÍÄ«»©‡¥2ßëM›·Ô߈ùדöùêùדƠù׳™»Û«‚ ½9ƒv‹ÜÑÄ뫇“Íj̉ºƠׯơêË1¿ßÅĂ ±»ñÁÑØ™‡ùê·¼Í7£äÛ«‚ ½9•#›¡›¶é«‡“ÍjËè¹Ú®Gø̃ˆăˆŸÿ³ Û«‚ ½9çÚé¾ÁƯëöëöÛ(ǻ۫‚ ½9g„¢­½µØƒˆÛ«‚ ½9÷Á…»ï»«ÔÚ×·Ô±»åĂÓº×ÅéÚ™‰kß [ïSßÄÙÑÓÄÓÛ«‚ ½9¿ôÙ½9¥‡ÙŒë*«ẳ߈ĂÓÔ­Ø«Ô߈¾¯ß9¥‡›‡Û«‚ ½9ÿÚăơâˆ:kɇ· ³¾߈ăà…ñ£Ø™‰kß [ïSÙ½‹Ç¹Á—»¥ˆ]1çÚ·¼Í7Ơ™‡“ȉ¿I‡ºí—G–Ó=ĂÖÏÅ߈Íăà·ÅÇËÉ9ăÇíÛ«‚ ½9̀B½ÛÄÓ½߈ùêăˆŸ;½—¾èô‹‡Œ£Ô½9¥‡ÿÚ₫s®¶s¥ˆ]1—ˆƒ¿»ơêôvù×¡ÔØÅêƒêíơơê§Ô°»ù×¶ËÉ9«‡“Íj³Ç½å̉ ¾»›¾ăˆŸ;ÿ§Ï̉ưÀ½•ÛÙYùê¥Ä9¥‡3¶ƠËÉ9©ÓÊÇ•É̀«Ôư“μ£äÏÔÀĂ©ÓÙ½µ¡Ô½|“Ⱦ÷Á‡¡Ơ™‰kß [ïSÇÖû‡åĂ«‡“Íj¡ÓÛ«‚ ½9ùê°»ăˆŸÁ‡é/×:±»±»™‰kß [ïS¹ÚÙ½Æ̉ +È*¿ÅƯơ¿Œ߈©¼«äăˆŸ÷‡±»¿Å±»¿ÅƒÁ‹ÓỔ²ÂßßÚ±»߈ĂÙå7ơꙉkß [ïS«‡“ÍjÏÔ±»øê—`Ø»à —ÓǼ«‡“Íj½‘‡ŒÁƯăˆŸ;ơèŇŒơÔƯơÅØøêµ‰£Xřٽ«ÔăˆŸ;ªÚÙ½­Ø•Èû›å̉ ­Ä™‰kß [ïSçÆ¡ÁÅÔƒˆ¯ÏÄưÀ±½±¿ÁƯÙשø×ÏÄûÓñÁ¯¾Á½Û«‚ ½9ÙÓÿ¯¶öÅÓñÓ¯G‹ø£XẮv“ÜɇµØÙÚ«‡“Íj÷Ù·‡‘×8çÛ«‚ ½9™ÓưÚ±»ŸÅÓÅ‹Ç˜Û ÍåÏÅù×ËÇ«‡“ÍjĂăˆŸ;ÍÄ¡ƠÁƯ™‰kß [ïSù×±»óÇÙÓ»qăơŸÖ÷ ºßÜöÁÏ̉Á̉«‡“Íjۺ߻û¡È½³ºóÙÚ«‡“Íj™‰kß [ïS¡Û°»›¾ơꙉkß [ïS­‡å̉ »½Í߈º·‡‘×8瑱¿‰¯È½ĂƠœÁăˆŸ;íêĂÁƯÍåĂÍÄÙ×߈ưÁÍÓăˆŸ;™‰kß [ïSóÔß»ûÍƠăˆŸ;½¿ßĂÈƠ÷ˆ–»ÿÚ÷ÙÔXŸÈ8¤‡×µØÙÚ¡ÔϺÄ‹‚vĐÓË¿™×ư»‡ŒÚ×¼€œÂ¥Øß½Áùרח¾Ï̉‡Œ±»ĂĂÁ«Ô§ÔÑ·“È‚ˆ´Ø·ÔÓØæØùÛ߈ñÆg‹v§‡›¾ăˆŸưÀÏÅ›ÚăºŽ©‡¥2ßëM†Ụ̀ÛÀ¥Ûéê÷Á«‡“Íjív÷‡ƠÁÙŒë*«‡Ú«Ô‡Ç·Å‡ºơèÅß'ÏŇڣԕǃvëöù×ĂàÍÓ™‰kß [ïS“׎ơêívÙ½€å̉ ÷Áﻵر»¯¼ÅØ÷ˆÿÚ’¹ÜN«Ñ™ÓñÚ߈»yµØ™‰kß [ïSº½ÔÍƠ×$›¶éÏÄÁĂñÖµ.¥Ù•†ŒÙ-¨Ø¡ÔÅԡȧԓƠ‰¿I«‡“Íj‡¿«‡“Íj‡Ç˜‰j̃ZîS¿º¡ÈÏÔ„¢­Ǽ¥Æ‹ÇÅ–½°»î»ÇÖ‡ø–Óƒˆå̃¿º‡º¿‰ăˆŸ;₫®¶ăˆŸ;kö½•Èû›ƒvơê“Ơ©Çù×ÔX”ÅÄù×êÔ›¾Û«‚ ½9ר©ØÙ½ÍƠ«÷ùë±»“Ơ›¾ù×±»ív…ôëöơº¹Ú­v»ßơêÏÅơ$ùê—¾¯ÈµØ—»¹ÚÛ×÷Ôëöƒëöăàù×ÍĂơêÛÄÓÏÔÎđªÚ¾½Ó´©Ó¹Ú¾߈₫¿àßÄÙÑÄëîº ƠÅ%ÛÄÓ߈Û«‚ ½9ơê8¤‡ÎÅ߈Ûê‘Û™Ôù¿Ï«‡“ÍjÛ«‚ ½9³Œ߈ÁØY ö±»…ØĐÅà=öÔ­¾·Å©‡¥2ßëMÿ¯¶߈¥‰ÍL…†“ËÓư“•Œä̉…»½Ô±»·Ô«‡“Íj¼ÏÔ«‡“ÍjÛ«‚ ½9́v߈ù×¹®ÔÙ½ÍË)éÛ9¥%÷4§ÔÙÚ­ÖÁ«ÑÁ¼‡ñ5ñÓ߈5¡—ˆ™‡™‰kß [ïS½ÏÔƠù×Ù½ÇÊăˆŸ;êÚ‡ñ5«ÔÚÀù×ù×Û«‚ ½9ÂƠ±»±½÷$ͼ8¤‡×ø×ŸÔ«‡“Íj‡±¹ÚĂíÉæăˆŸ;̉Æ¡™‰kß [ïSƯÓ ™ÁƠX̀Ç߈ÉÖ—¶¼Ô—˜÷Áù×ÁÚæØÛ«‚ ½9ÿ¯¶ơê÷Ú¹Ú9¥‡×•Û«‚ ½9å×ùơ÷‡åÖÙ׃أ»¹ÁĂÓ½öÏÔÛ«‚ ½9…Ç›¾º±»•Èû›ëÔÛ«‚ ½9ß»ûƒ¿Å¡»‚v›¾ĂÚ±¿ăơ½™ÔÅÓïųỠ»úùø±¿çÚ‡œÁ‡¼¯¾¡Ôù׈ơï»±»Ă߈™‰kß [ïS›ÔŸ}Û™ï³2Ù½´a©ơå̉ Ç©ÜÙ½ÔX“ÑÓÍĵØáê‚ +¿ØñÚƒv‰¾¬ÄŻ۫‚ ½9­ÖƠ« ©ƒ»5–¾·‡‘×8çÚª‚ +¼9ÙÚ߈‡Çëöµ†ơÔÄô—ÓÚª‚ +¼9»½óÔ‡º­ÄûØÛÍÓÏÅƠX‹ÜºÁƯÇ̉½ôŸÅĐŽ·Ø±»Ÿ\Ž®ô|±»¯†½ Û«‚ ½9ăˆŸÏÄỡÇØ߈ƠX¹ÚơèÅÙ½ÓÆ— ëöÏÔ¿(¹ÚƒvơÔ·‡‘×8ç߈Û«‚ ½9°»±»ùô¡ÔËÇÙ½‡äƒvÓđ°¿–ØÖ¼ϼ¬Ä¹Ø™ĂÁ¹±»™‰kß [ïS¤‰̀L„×Óƒv—ÛëöñÚŸ}µØ¥ˆ]1Ö¾å̉ ơê߈£Èá ‚¾߈̉¼!­ÄăƯĂƠ¾³Øù×ăˆŸ;ăÇíư‰àăˆŸ;k™‰kß [ïSÜÓ ™Á«‡“Íj»Ø‡xửù×»Y¡ÈµØ¤‰̀L„Ù½8¤‡ù×ăˆŸôÙÚ¡Ô±»‡¹“Æ™‡¥¸щù×ơĂÛ«‚ ½9ĂÙØ×Å»ưÀßơÚÆăˆŸªº·‡‘×8ç§Ó߈‡|G½¹ñÓå×»̉­ô·#«‡“Íj±¥ˆ]1íê±»º×Ûׯß»ûĂÙơèŹà‚v߈«‡“Íj«‡“Íj¨ÇÿZơÔü¦†©‡¥2ßëMÏÔơèÅÏÔºØ×ù¿Ù×ÅÖΫ‡“Íj‡“Ïđù×ù×›¶é¡Ûÿº«Ô™‰kß [ïS½ŸĂ“Æú™‰kß [ïS½Á±»ËÖ­åÛ×ß»û匿Nĵؗ¶›¹ß»û¡ÁÏÅÛ«‚ ½9ñÚÁëöó¿ôÛ«‚ ½9}ÄØ€ÇƠ—»¡ÔɇívơÄ«‡“Íj™ëéå߈±ëØÏÔ®Ơ±¿ỞÏ +¼«ÔÁ¹å̉ ÏÔăăÁĂ ñÄç8ٽɓ÷»ÍÛ׃ˆƯ›ƒv¿ß÷å5Ó–¾Üï±߈߈§º˹å̉ Ÿ}“Ơµ†ùÚñÖ½ÔÑÓ߈ù×ëÅéêÓ¼±»ÑÓ¿ôªÚĂÙ‘±Ó‡ÑÓ÷å5Ó­vÁƯ‡ºÇØ“ƠÇ»÷ÁçÚËÖÚ× ëöϼÏ̉±»…ÓÎÔ•Ö€¿–øø¦ø̀»øø¿ß«‡“Íj›¾ù×·#±»¾ù×§Ô»½©‡¥2ßëM£ÔĂÙɇ“È߈å̉ ƒv9¥‡¿ßÁƯ¿ØÑÓË*¯×˪ª‡’̀j±»Ï̉«‡“ÍjùêÓØ½ª»à=¡Û™Ô‹Ç›¹ÆŒ¾ë¼ÙÚ¹ÚÑÓæÚ·Ó ¥0öøÿÚ™ëéåµñÛ«‚ ½9‹Çƒ½רƠÁ̉÷̃ªÚÜÙÅëăˆŸgç'Ÿ}Ơ¡Ó›¾Ç̉ªÈ‡³¹‰ÛăˆŸáê±ëØíÆÀËñÚö›¾·ÜåôºƠƒËƠ¶Ü +߈±¿ƒv·‡‘×8çµóßÄÙ˨YÏÔơÔÙ׿߅ֿÅóÄƯÓ ÁƯÅØжÙ½“‹Á»Ø˜‰j̃ZîS­ØÛº¹Ú߈™‰kß [ïSÙÚ™ºÁÜåÁºÈ§³”†×Ë̉ƒvÛ«‚ ½9“ƠÔï̉ç`áêù×ívív·‡‘×8ç©Ø™‰kß [ïSăˆŸ½ÙöăˆŸ9¥‡ÓØ«‡“Íj—»Æ߈¹ÚÛ«‚ ½9ôÓ ‹›æơèÅÛÇ&çÚ9¥‡Ö†º§ÓưˆưÀñÆ™ô‡»Û«‚ ½9߈ƒv¥Ûùꥼº«»ÏÔ÷Ù§ÓẩÏÅÅÁơêă‘·ƒ´ƒvÛ«‚ ½9½·‹Ù½¡Ô÷ˆÛº½¾‡÷‡ÿ¯¶¡Ư±½¯½ñ¹™ ç½ÏÅÉùơÏÔù×™‰kß [ïSÇ̉™‰kß [ïSù×½±»öÁ’èêáƠù¿¥Û×Ûơê‡ψ·‡‘×8çŽÏ̉÷Ù%̉Åï½å̉ ŸÖ¡Û«‚ ½9Û«‚ ½9ñÜù×ÛºÛ«‚ ½9™‰kß [ïS—¶ùêÍ­HºÅĽÏÅœƷ‡‘×8ç¡Û÷‡ËƠĂù×Ù׫‡“Íj Ç«Ôôêù×ï»ß»ûó|Û×߈ÏÔĂÈ»ÿơÊ¿ÑÄëïƠ­¾ơùå‹ÇY‹ÜăˆŸ;ăˆŸ;‡9ÂƠ߈§Ôù׵ذ»åĂ—»•“ܽÏåÁƯ”ÇÖ±»·Ô˜‰j̃ZîSÛ«‚ ½9·º³(ÇơÔ߈ƒv“ÈÁĂƒØÅͼƒv¯¾åŒ¿NÅÔÔƠï»Ù½™‰kß [ïSơÔóÔÍÄƯÓ ̃ơ³±³±»ÁÛÛ«‚ ½9߈­ÄÏÔ°êØËÉ9±»ƯÚÅ™‰kß [ïSÓØ™‡¢Ç³ÂơÔ凡ÇÛ«‚ ½9—¶ÙŒë*«ù×™‰kß [ïS¿ô½·ÔßÁơÔƺ£Ô¹ÚÓÓñÙ­¾³ÂăˆŸ;˜‰j̃ZîSËÇêÚ[¡ÈÏ̉§Ô—¶ÀÏūԫ‡“ÍjÛººŸ}ÏÅ‘ÚưÀ½½ÑØÍÓ¡Ô߈—ÓÙ½ÂÙ«‡“ÍjăˆŸ;«‡“Íj߈½íèÓØƒvÙÚÛ׆“áç½—ÓĂĂ ›­±àéMÁƒvëö€ºï»½ËÉ9ăˆŸ;kăêăààƠ÷ˆÓº߈¾ÚG°”¡ØơÔ›÷½ƒ¾‘‹Ç§Ôëöﻕփ¿çɇ´†«ÓÏÔ“Ơ›¾ĂĂ»¡ÔĂÙăˆŸÑ"ÙÚ‡º•ÂÅÛ‡±¿…߈«·3uUÿ&ŵâˆÖ©ÓĂ ±È§ô÷Á‰¿IÑÓ‡ºÏŪ¶2tTÏÔƒvéêÁƯ«ÔĂÙ›¶éÏÔö±»ÙÚ•îûs¸ÚÔXÛ«‚ ½9ưÀË̉₫®¶Æ»û#½£ ﻫԫ‡“Íj›¶é°êØ‹Ü߈ìÖ%ä̉ư§‡½߈éê—¶«‡“ÍjÛ«‚ ½9ăơ­¾‹Ó眱»ù‡ÑÓƒvăº9¥‡ÓĽçÚ8¤‡×‡¿‰Û½«‡“Íjù׃à­ÄºϺÓØ÷Á߈ª‡’̀j½Ú×±»ÿ¯¶•ŒƒÖŸ0©ºÛ«‚ ½9øơăˆŸ;kó–ÿ³¹§ƠÁĂôêÚº“à¬Û«‚ ½9Û«‚ ½9ÑÓÓ¼œ‡”ÿÛ«‚ ½9çÿÚ»y§j˜‰j̃ZîS™‰kß [ïSº½ +ÿ¯¶ÑØÏÔé¾½Á‡é/×:«ÚÏžºíÆ÷‡ÑÄë°»ÿ¯¶³±»ƒØÉ»ƠXù×ï½åŒ¿NǼÅØ—»‚Úöº¸Ú‡ñ5ÖÆ¯¾ÏÄ»ĂơèÅîºù×èÚ$ƒˆ¯×®GøƯÚ¿ô«‡“Íjó½ùןÖßÄÙ‚ˆ¡ÈíÁµØ›¾“ÈÁÛ™‰kß [ïS«‡“Íj—ÅÙÚ̃ Î Ơîñ¹™ ÿ×ÿÛÚĂº’Ơù×Ûº߈˜‰j̃ZîSñÓ¦ÓÔ±»ËÉ9ÇÖÛ«‚ ½9߈™‡©¼«d£Ơ8¤‡©Ó³ØÎÅ,Á̉‹÷ÙƒvÛ«‚ ½9Ï̉ßÁ·Ú̀Ó9¥‡ĂÙ¾Á‡é/×:ÏÔăơù×™‰kß [ïSÿ¯¶ĐÄêÓ«‡“ÍjÿÛÁƯÏÅ÷Ú“½ö½çºÛ«‚ ½9§Ó©ÓăˆŸ;ưÀÅ™ÓĂç³µØçÚ¯»Û«‚ ½9°» ơÔÑÓ…à«ÔÄØ—Óù׃vÛº™‰kß [ïS±»ÏÔïÅ–ÓÅÓƒvưÀ±»ăˆŸ;ù×àËǓº·Ø±»ÿ ©ØªÔ¸£ ½Øÿ¯¶߈Û"‚v«‡“Íj÷ÚÍƠ…Œëöƒ±»±́߈½ƒ½ăàÙ½£ö‡º“È×ܫԃáÁƯ‡ŒÛ«‚ ½9½€5ăàÛÄÓÏÔ˜‰j̃ZîS¹ÚóÇ̀ĂëÚ½ÛºöÁÏ̉߈çôÑÓù×–ÓîÚ¾ăàưÀÿ¼ª‡’̀j÷‡àÓ ±»ôº¹̃ă‘·߈9¥‡ùêßÁ»ǻÙ̉•{˹¿ùêÁù×£äáÓ“¹ƯN‚v´È¼©¼Æ“ƠÏÅ—ÓăˆŸ;ĂÙ³ÜÍÇÓØ•ÑÍ·ßƯƠ•½ăˆŸ;…ƠËƠâˆù¿˜‰j̃ZîSçÚ™‡ˆ;·º…½€éêÛÚ™‰kß [ïS·Ó ¥0»Á¼»½‡xù×±Ô†ŒĐÅÅÓùơ߈½€÷óíŽëöµ†߈÷‡Ï̉Û×·Ôû÷Ú9¥‡×ÚÁ‡é/×:ëö×¾íÚ£Ôù‡³È³¹“Èơê¡Û·‡‘×8ç9¥‡Î̉ù×ÛÄÓóĂÛ½€±»Ù½‹ÈÓĂÙ±»߈߈ôÔß+˜êèä„äÏ̉ÁĂ¡ÁàñôßÄÙÏÔ߈óÂÅà‹Ç†đ5ï÷9¥‡¡ÓÙÚ߈¡ÔÏÔ9¥‡ơ$Í÷Ûº«‡“Íj±»ƒvûÓÙ½·Ó ¥0ùׯG‹øØ ™ÇĂÑæÙÚ™‰kß [ïS³”ÙÚ·‡‘×8çÑÄëê˜HIÓ¼—¶óÂöÁF̃»0ú0çÇŸƠÔÎÔ›¶éëö—ÓÏÅÔº,l,ù׉¿Iù×ÛºÏÔ“¹ƯN¾ÏÅ€º¿º†ÇơĂø¿·ÅĂĂơêÛ«‚ ½9Á×ÓÅÙÚªÚÙ½ưÀ·ÜªÚÙ½±»ódzÊ߈£X8 ¤‡ Ö›Ú™‰kß [ïS«»Ù½ßÚÍË)éÛ9¥¹Úó‡·ß«»ÑÓ›¶é¥Ưñ¹™ Ù½×$÷±½Ăô«ÑÙÚăˆŸ;ăàÏ̉£»ĂĂψ¶ºÇÖÙ½ơ꛾ĂiÚ×¹Ú«dŒÓ©Ç߈ƒvëö߈¹Ú°)çÚ«Ô÷Ü߈¿9’¹ÜNÁĂÙ߈ïá ‡x˜‰j̃ZîS÷ÁËÉ9íÂùëëö¬¿·ÔœÂÓÅÅÔ¿½ÁÛ÷ˆÏÔ9¥‡±»™‰kß [ïS“ĂÙív…½Ô˜êèäƠ¡"Ù½ƯÓ ›¶é÷ÁûÙÿ¯¶”Œ°»ưˆ»Åí—GƠΛ¶éùê9¥‡ÁçØ©Ø¯ƒ« +>¿»ÏÅÏÅÙ‡Ï9…ívă»·Åù×9¥‡°»«‡“ÍjåƠô›¾÷ +±Ôöù×ϼñÓ©ƠÚ×ưÀŽ„½£Ç™‰kß [ïS¿Ø×¾Ă×Ü­ÖÙ½¹àù׿‰ÜÍƠ†ÇÏÅ«‡“Íj8 ¤‡ ×¥Ø߈¯ÛÙ½ĐÄ +ê +ÚÀƯÓ ߌÛ,Û«‚ ½9÷Á«ÑëÔ±»»Ø«‡“ÍjÑĂ—¶ÑÄ뺼ǽ«ÔÏÔÏÔ±»ï»¥Ó¯ƒ« +>Ÿګ‡“ÍjÏÅÏÅĂ«‡“ÍjơêÁÓ±½£XăˆŸ;k§à¼€Á˜ÏŧÔÙÚÏ̉éØÏ̉çíÙڪڷȽÓÅçôË1™Ô£ÇÑÓ…»±»ă»9¥‡ÏÔÉÙÚăÁå¿˹ÄÄăˆŸ;—Óơó#öˆù×Óºơêù×±»ă¶ĐÅëöÏÔº₫ ¬Û«‚ ½9é‰ñ5ñ·‡Œùꃾ‘™Áß»û›‰·b¡ÔëöƯÙ×öơ›¾£¨Ë̉©ÓăˆŸ;ÍË)éÛ9¥©¼«»Û¹Ï̉ªÚÏÅ•‹ÇרÛ«‚ ½9¡ƯöÁÛº’¹ÜN²”߈°¿°½ăˆŸ;Ở°»AÛ«‚ ½9˜‰j̃ZîSÛ«‚ ½9ɇëÔÁöÁ÷»¼ÔĂĂ ›­±àéM½¾ƒ×̉¢ô€ºơÔ9¥‡„ØÑÓƠu©‡¥2ßëMƒv±»¡ÔĂÈÍƠƠ™ëéåí(Ở­ÄÑĂ«‡“Íj¦Ô¹»… ™‰kß [ïSÙ-ϼƠÁ½×Ơívôù×ÏÔưÀÛ׃̣±»Ă¼·Ôù×Û«‚ ½9‡ñ5Ç›º®GøóÔ˜‰j̃ZîS¯ÈÇÖöÁ¹ÚăˆŸ;¯£Ôåơ¸È½€ơԦر¿ăˆŸ;Ñ·ÑÄëçÚ™‰kß [ïSÙÚóÂ÷ÁçÚ›¶é“ÈÎ̉ +߈™ÔñÚ©Çù×ơÔ­đ»ĂơÔ9¥‡×çÚüÀ¿À¥ˆ]1Ưú|½€«‡“ÍjÙÚ‡ÚŸÈï»×Ă™‰kß [ïSg»ùûØëö¿‰Ó¸ưÀ½ôĂÈëö߈ÏÔûÓ¡»µ­ÄºÚ×±¿›¾ÁÜÅØ߈Û«‚ ½9Ô«»ƒˆùê₫ô®¶ô¡Ø¡ÛÏűÔÁăóÇÂÈÓÆÍĂƯÓ ÛÙ½ƒÖ߈ơÔăˆŸ;kƠX–¶ĂƠºØ¿ÚăÔö°»«»Ѷù׫dÛ«‚ ½9¥ÛÇÖgëöÍË)éÛ9¥ỬèơÁƯׯÁ̉ ÛÜÓˆ ˆ–¶«·3uU€¾ ăơß»ûöÙÙÅ뵆™ÓÑØß»û¯ÈÑÓÔ½Ó‰ÆƠºm›¾߈¬¾ăˆŸÁƯûÖ›¶é÷ÁÇÖ›¾¹ƠƠX½€—»“¼ăˆŸ;™Ô»Ø¥ˆ]1¡Ûô—Œ߈ƒÚßÚï½­Ä…ôăỔØÛ«‚ ½9ë$ÏÔëö³ ưÀͪï½ăˆŸ;ăˆŸ;›¶é̀ĂÀĂơêçôívƠÅ–ăà¡ÔÛ×±ëØ‡ívÛÀö©ÜăˆŸ;ŸöÁÛ«‚ ½9‘¨£äóÄơê±»‡Ç—»̃ӿůG‹øçÚϺ™‰kß [ïSÏÅ·ºƠóÇ­Äù×Ù×ÙÚ±¿ßÖ§±»́Á ƒˆù×Í_ôơĂ߈Å·¹ÚÏÔ«‡“ÍjăˆŸƒv«d±»ͼÿ¯¶£Œôº§Æëö§ÔöÁơê½î£ÔăˆŸ;kµØß…ǥħỖÁ ±»Å9¥‡æ̉›¡߈«‡“Íjƒ«»¥ÆËÉ9›ÛÏ̉›œÜù׷ų­ÔơêÁ¼ÅÀĂíÖ¹ÚñÚ±»Û×°½©ƠË̉±»ëö߄۫‚ ½9Û«‚ ½9÷Áű»µØÛÂăˆŸÓ̃Ç̉ăˆŸ;kË“ƠĂ¼ß„ă­½9¥‡ͪÂÙ¯¾™‡åÁÓ —¶ƒvù×ׯöÇ»½§Ó¿½Ù½›¾ù×”È ú  «‡“ÍjÁåùê±»½€¶ôDívs‡Ç™‰kß [ïSÏ|æÚ“¹ƯN«̃½€̃ˆχ™‡¯G‹øñÆǺÅØ½™‰kß [ïSø× ù×±»±»ơº×Ó¯È ËûÍÓ«‡“Íjƒv©™‰kß [ïSÏÔáÔX¹Ú»ùêư›¡­ÄÁ½ƒ½ø×¹¶›¾°»¯È™‰kß [ïSÛ«‚ ½9°½µØñœ¢äÑÓñÁ“Æù¾ù×ưÚר¡ÔçÚơèÅÍÓÁ…ØÿÚ™Á’Çç̉Á¹ÙÚáƠƒˆ©Ó·̣˜‡Íý¡ØƒØƠ…߈€Ă¼¥ˆ]1ÏÔϺ—¶߈åÁđÁ¾Ô³Èƒv±»ÿ¯¶›¾÷Ù«‡“Íj߈ÅØ¿ĂǺƒ¶ûܘ‰j̃ZîSêöÖÆÿÚÏÅ×Ơºå̉ ×Ü›¾™‰kß [ïS•Èû›·ÔçÚ»ĂêÓ¹Ú߈ÙÚÛ•·̣ëöÁĂơêñÓ«ÑÍBÏÔù×߈µ†Û«‚ ½9½Ă›¾÷Á£Çøơäô´a¾¥Ó§‡‹Á߈Ÿ\ÁĂ¥º±»9¥‡߈ ËûÙ½åôơê‡èÏÅĂÈơêÿ¯¶ÅÔêö¹Ú߈“½¬¿ƒ¾‘߈½Øûù×§ß¡ÔæÚÏÔÓỐv¿º©‡¥2ßëMĂÙƒv»ÅăëăˆŸ´aăˆŸ;%½—ÓÏÄ·‡‘×8çĂٵؽÏÅÛăˆŸ;§Ó¾±ÁÀơ¶ÇÖ‹ÇĂºÇÖÅØ·ô‚Öµ†ׯÛÄÓ§ô±¿ÙÚéꙉkß [ïS«‡“ÍjívÁ—¶ưÀ“ÈÙ½ñ™‰kß [ïS©Ó›¾̃ÄØëö±¿Û«‚ ½9Û«‚ ½9…’½ÿỤ́ÇU—¾áƯ₫Û’‰2Ô,ø—¶ÏÔ­Ä«‡“Íj¸Ú¡½€«»ùê÷ÁÛ«‚ ½9¶Ü¹Ú·Å‹È‡ÛĂ¼«‡“Íj½ÿ×ñö·ÔÙÚµ!¾µaÏÔƒvµ.¥Ùß»û¥ÆÛ«‚ ½9¹ÚÙ½ƒÚÛÄÓá Ù½«‡“Íjù×₫§½€ÎÔ×ƠăˆŸ½€ß׿8‹ÇÍƠ¹Ú½ß„ÏŌө¼¡ÔÅ»›¾«‡“Íjר·‰•ÍÄ9¥‡ÑÓùêµØå»ûû!¿Å—ˆÇ"ÙăˆŸ;Û“ï̃ÄØ·§D ĐÓ™‰kß [ïSÑĂÉÙ½ơê8¤‡ÖÙ߈߈éê½Ù×›° Á°»¿Åß»ûÓØç̉ăÔßÖí˜âÄƠÍÄ­v÷Úÿơê³”·‡‘×8ç³Ø½ëöéÑÓ9¥‡Âù×ëöíváỠˆÜéÔÛ¹™‰kß [ïSáꆌ«‡“ÍjÙ½ó‡‹Çÿ¯¶ƒă«ÚÿÚ«·3uU•Ê£³×¿8/ö­ÄÍÓ¯G‹øê؋܇ۧԭˆ™Ô·‹³ô˜‡×Ăù× Û9¥‡«Ô£äÙŒë*«‹½ÿںȗ»ÈĂ +­ˆÏÔåĂƠ—¾ĐÄꨇ¤2€̃êL퇯WáêµØ·‡‘×8çăˆŸ;kĂ¼Ÿè«×±»Û«‚ ½9¢Ç‡Û­Ô9¥‡¥ÜÁƯ•½…äăº™‡Û«‚ ½9µ†Û«‚ ½9™‰kß [ïS£ä³¹ï½%ƒˆßŽéºùב́¯È£äăˆŸ;ÁƯÿÚ±»ăˆŸ;à=ăˆŸç̉ïÚ±»±»öß»û£ä¯ÿÚ‡¯àÚôâàøêÿ¯¶©Œ«Ô÷Ôù¿ø¾«‡“Íj‡Ç…Ư×ưˆ±ëØŽ“¼¹Ú«‡“Íj³Æ9¥‡…Û5߈³È¿ºÍÄÙÚÛ«‚ ½9å̉ áơ»ƒù×ăˆŸ;ÇÖÛ«‚ ½9ëö½€̣¶ µ.¥Ù·ÅÏP‡ÇÑÓ›·Ô³ÂƒvưÀỔ#™ôÛ«‚ ½9߈¥¸¾¸Á¡ØÓºù×ăˆŸ;ơê«»ÂÙØY +›Ú£ôÁĂ©ÓƒˆÛØ×‹Ü«‡“Íjù×ÉÖ²öÛÆơêơÔ™‰kß [ïSưÀ߈çđ½Û«‚ ½9«Ù߈ÛÇ«‡“Íj™ëé嫼ơ忺éê™ëéåƠ߈Å–«‡“Íjù×»Ăăơ¼ÛׂvŸ}‡·Ûùêå̉ ÙÚçô±»ñÚ·̣™ơÁñËÇ8¤‡ÏÔÁË×¾ν¥ÇÙ½¬™ÓßÖăˆŸ™‰kß [ïSµ…îź™‰kß [ïSƠù×›¡¿Å9¥‡×Đ·íÖ«‡“ÍjÛÄÓỞÍƠ’Üщ†Œ½ÁƯ߈ÁîƠ +™‡¹ÚÏÅ̉Æ ̃ˆËƠŸÈ·ºƼơꯃvơê‘#̉‡óÇ Ûƒ×çÚùæׯÛ6ÿ¯¶‘­Ôƒ÷ˆ«Ôÿ¼ª‡’̀j°»ưÀưFÅÄßáǹړöĂά¿!ë§ÑÓö—¶ăˆŸ;™‰kß [ïS¡å»èê§ÛçÚÑÓñÚĂºÚª‚ +¼9Äàơê₫¯Û‡ä‡¿Ïi™‰kß [ïS©Óå̉ ¾ÅéJé‰Ó5“gesÁ؉j̃ZîS߈ÁƯéÓ±»¯Èª‡’̀jÏÅ£s—Œ¿́¹Ú߈§ÓŸ¹‰¢Ú× +†Ú©Ó™×¤ÆăˆŸ;¡Áï½·Ô‹ÇơêơêƠµÈÿ¯¶¹Ú˜‰j̃ZîSƒvæºív‰ÁÅØ½ß–áêăˆŸ;™ëéåÏÅ…³߈߈ù×ăˆŸ;ÓØÛ«‚ ½9í—Gß„…ÖÓÆƯ₫͇ÅÓƒvÁƯ£ØÙ½ÓÅÛ«‚ ½9Û«‚ ½9ÍË)éÛ9¥ï»Û«‚ ½9¼§Ô¡ßÙ½™‡Åôê麣‡ؽ‡ÛºĂæ¹Ú¶¸Ú‰Á÷ê÷Á±Ôă·ºƠ§ÔÍÓƒÚÛ«‚ ½9Ư‰ĂÈÜơ±»Ï̉»ô­ÖƠ”ÖÑÜÙŒë*«߈•Œ·Å»Å¾¹xơèÅ߈ψƒvÙÚÁƯÍË)éÛ9¥‹Çó–÷Ú›¾“Ûƒưó È±»åôâà‹Üß¹ÚËÉ9¡Ç½ÁÇÖÏŽÔ߈Ùڳȫd‚ØÛÂưÀË̉«‡“Íj™‡¹Ú‹Ü¥êöơèÅ̃ÁRß»ûÛ«‚ ½9¶ÍÓ±»ôÙÚ½Û«‚ ½9¤‰̀L„÷ÁçÚÛ«‚ ½9íØ¡ÇÅà±»·ø¡Óƒv÷Ù¡Ăçô¡Èù×¹Á×¾™‰kß [ïSƒv…¹ĂÙ½›¶éÛ«‚ ½9‡÷Ô‚v¡qÓÅ߈¡ÈñÚ½ô¿‰àƠ§ÔÙ½íÚöÁ«d—»߈Û«‚ ½9çô­Ø¿¹ï¦³àÚÄ̉ù×̃Ö«‡“Íjơê¯G‹øÎ̉ë֡ȱ»ƒv˹ëöù¾µ†Ÿ}ƒˆ—¾Ù½½ëöÙÀ÷ˆ±»¬›¾–¶  ߈ÙƠ“ǧ…™‰kß [ïS±»³ÈÍöñÓåÁ¾ö«‡“Íj¾ÂĂóÇÙ½î»ß»û¡Ư­¾×ƠÓØ Çáß¼Ă·‡‘×8ç”ǡȡԇŒ©‡¥2ßëM™‰kß [ïSƒvëöḯơ‡¡ƠµĐĂơ‡ôê™ÛÏ̉½öơ½€ƒ‹Üëöù×Å¥Á© “¹ÚóÔ…Ö%¿‰•Œ¬Ä½Ûºÿ§ƒ¾‘•Öø¿ùơß»ûËu©Ø­ÖçïœÁ»‡«»ÇÖ±»ưÀÛ«‚ ½9ĂÙ×*±»ï½½¸È:¿ß•Œ˜‰j̃ZîS‹‘³߈Ù½ù×½ÏÅÿÚóÂô¯¼ăˆŸ;kăˆŸ;ɹé‰ñ5ñ·ù×ơćÇÿ¯¶Ç÷‡ƯÓ ©&ù×·Û«‚ ½9ÁÛÄ»߈«‡“Íjÿ¯¶ï½½îù×ñíÈÿ¯¶á ÷Áôêñ‡Ă ‹àÉËÉ9¯¾ÍË)éÛ9¥ăˆŸ;߈ù×Ûºăơ…ƠÿÚ¿‰‰¿I܆ŒOOO÷ÁÑÓÅÄ—ÚÏÅêö«Ôé±½áÛ¥Ö°»†ö£ô‹È¶Ü ÛºăˆŸ;ôê±»±½¶èƠëöĂÙỞáê°»™ôÍË)éÛ9¥˜‰j̃ZîS±ëØÍÄñ¡Ơ­ÄÁ̉óÇÉ)û!™‰kß [ïS߈™‰kß [ïSÛ«‚ ½9÷Á™‰kß [ïS9¥‡ªº×¾º“±»“¹ƯN½Ü›Û°¿Ÿ©¼øê±ăˆŸ;8-¤‡-ÖêÚÙ̉£Á±¿Û«‚ ½9›Ú¯ÈƒvÛ«‚ ½9 Ëûï²2 ÏÔÅÄ߈¿́µ†ăˆŸơê‡ÇµØăˆŸ;¥̃¦JÅÜ™‡¿ô§Ô±»§Ö›¶éÿ¯¶¡Û±»ß»ûÏÔ£ÇóÔ¾ÙÚÅÓ­Ö÷Ù½±»«»µ†çÚÏÔ±»·‡‘×8çăˆŸ…ØËÉ9Û«‚ ½9ÿÚ¡Á™‰kß [ïSË̉/߈ơêù¿¡ÈåºĂ‡Û«‚ ½9±»ù×ăˆŸÏ̉½ô‰»ăˆŸ;á ÏÅ«Ôù׫‡“Íj›ĐÓßƯ¡Óù×ù×̣¶ïDĂÈ«‡“Íj«‡“ÍjÓÙÍË)éÛ9¥É—ÑØ°»ëÚä̉ÛÄÓ½×Úëù×Í`‹Ù›¶éï»Ơ‡Û²ÂŇ«‡“Íjơêéêψ9¥‡÷‡Û«‚ ½9™‰kß [ïS½¯¾ĂƠ·‡‘×8çơúÏÅÛ«‚ ½9½°»¾ß»û˜êèäÏŰ»ƒv­Ô“ÈñÓ‹È߈×¾½ôëÔÏÄƠñăˆŸ;ƒØơêăˆŸÁ…åĂÓºÁĂÙ̉ëö·Å£4ÙÚ߈‹îƒÏÅĂÙ™‰kß [ïS¡ÈÛ«‚ ½9¥Ø™‡щϹ«Ôëö‚vͽ­‡߈ÏÅŽ·Øư¬ÄÀÛ«‚ ½9ĂÎçÚïÚéÓ‰¿I±¿‡ÏÚÿ‡₫8®¶8÷Ú Û±»ÏÄ×Ë继ƽ€µØÛºÅ½Ó÷Ô÷‡̉̉ÅÓëö߈¡Ç£»ƯÛ«‚ ½9ß„ƒÖ«»ĐĂ¡È•×ív«‡“Íj³¡½ØƠưÀ™‰kß [ïS±»» £»ù×ÑÅÖÆăˆŸ;kÏÔ™‰kß [ïSçĂ™ÁáØ°»¯ÈÏÔÛדÈâˆ:ƒvïÅÅÓØ‡¡È·ÔƠÓÆÏÔĂĵØù×ÿÚÁÎưÀ°¿•‹H½ù×§ƠƒØ°¿‡Û9¥‡Ÿ¾…Ç“Ơ™‡‹Ó̃ÎÏÅÍÓ·‹ƒ²í™ëéå§ô½ÔĂÙĂ ëöÚÆ¿‰‡™‰kß [ïS߈މ¿Iï½±»·ÅưÀÇÖ½ôÙ̉»Ø÷Á±»Û«‚ ½9»ˆÙÜÛ«‚ ½9Û«‚ ½9Û«‚ ½9ÙŒë*«çÚ±¿¯¼ç­Ä§ô÷Ú¯ƒßͯ¥'=U#QK¯Â×Ơù×™‰kß [ïSù׆ÇÓ´ÙŒë*«‹ÜƯÓ ¶ûÓÛ«‚ ½9«‡“ÍjỞÚÄ̉…ŒÛ«‚ ½9ÏÔŸ\™‰kß [ïSÙÚ…̃‹!ÅÓ…ÔÚª‚ +¼9è¼±»¯¾ÏÔ±́óÔÍĂÁ»Ă³×¡Á̉£Ø«Úén÷ˆîÅ×ÜÛ߈Ù½£Ç·Ô‰ø­Ä¡ÈÆă™‰kß [ïSăÂ3«‡“Íjù×Û«‚ ½9ÑÄë4«·3uU©Ó˜‰j̃ZîSưÓ›¾ƠÔÅôƒ߈8¤‡×ÉơÔù×ăˆŸ;9¥‡ÆÖß»ûÛ×̀ÓщĂßÄÙËÖáê±»éºáƠͽ™Óë$¡ÁĂÈÁÜËÉ9«»Uơê×*Á§Ôù×óÇûÏԷŽñ¹ÚÙ×Úª‚ +¼9Á˱»±¿߈÷$ù×퉽ĂÈÓºĂôĂ—»ù×µ_ï½߈·Ô›¶éø×ưÚÛÄÓÜ¡ƯÆÎÅ óÇ‚½ƯÚÿÚ½€̀Ê)èÛ8¤å̉ ƠµÛ«‚ ½9«‡“Íj»q±‚ăơÏÅÁ%ƒvŸ¢±»·Ôº Ö†‡ü2«‡“Íj½ôĂÈ«‡“Íj½©‡¥2ßëMçÚ±»àív’Ÿáê·ºívØÚ©ƠÛ×ÏÔËÉ9›Ăƒ¾‘ƯÓ ¬Ö´Ø߈ăˆŸºØ9¥‡·ÅÑ𻈡ƯùסÁµaœÔơê·Ôñ»‡º¶Å©ÓỞù×åĂƠ%“ÈÛ«‚ ½9ÅÁ‹ÇÅưºí‡•‹HµØ±»ËÉ9ơ»ºÍBđù×öÁ¿ß©‡¥2ßëMÛ«‚ ½9Ư‰«»«‡“Íj߈·Å­€¿ôƒv¦ôª‡’̀jרơÔ½€¯ÈÈ̉³‘ ÊûÏ̉‘Ú™‰kß [ïS›¾¶£Ø߈ëöÛ«‚ ½9ëỤ́Ç;ºÛ«‚ ½9…œ•½Û«‚ ½9üÓ£‹ÑÓ§¹×ÓÅ–ÅÓá ¹ÑáßÚ¿‰øêÑÓÙ̉™$áÛ×Ăƒ¾‘óÇÏÔŒ¾“ƵØ߈Ơôï½ÓØăˆŸĂĂˆ½Û«‚ ½9¡ÛÁ̉Å×,ÍÓëö±»ăˆŸ;çÔ¡û̉Úª‚ +¼9§ÆÛ(ăˆŸ;·ÔñÓ« ©ƒ»59¥‡™ơ‡±»í—G›¡™‰kß [ïSïÚÁƯ¿¹µØºçôëÔǺ£«‡“Íj«‡“Íj×Ơ߈¾Óß»û¡ôèÑÓ³щÙ½¼óŸ}§+ŃڽôÏÅÇØăˆŸ¿‰«‡“ÍjßÚ‡Ûëöµa³ºóÁĂö­¾üÁ +™‰kß [ïS¡ÈÉ̉µØÿÚÇ»ù¾«·3uUÅÔ÷‡‡ŒơÄËÇơèÅÏÔ÷Ù·‡‘×8çºÚÆÛ«‚ ½9ƠÁéÓ#ăˆŸ…Ûù×ù§Úª‚ +¼9ͲùטÁh£»¹Úù×÷ÁÏåÛ×¥ÛÅÔ›¡ƯÓ «‡“Íj¡Ûëöß»ûăˆŸĂÙ±»½€Û«‚ ½9ÍÓƒăˆŸ;k›¾߈›¹«‡“Íj´a±»…»™‰kß [ïS«ÔÅôÛ×™Ó…Ú‚v¡ƯéÚ™‰kß [ïSŸ}ÿ.°»ëöơê·‡‘×8ç߈Ñ·é‹™ô©‡¥2ßëMƯÓ ›¶éưÀ½ĂĂ9¥‡íÖ«Ôç°ƒvùׯÖÏÔ›ÚϼÑÄëûÓĂº±»Á¾ÿ¯¶‹ÈăˆŸƒvùơ₫¼çÚÛ«‚ ½9Û«‚ ½9߈ñÓÙ½«‡“Íjÿ¯¶Úª‚ +¼9÷Á«‡“Íj­€«·3uU½±»ùê¼Ï̉ÛÄӄعں£ÇÏÔå̉ ëöÏÔ™‰kß [ïSÛ«‚ ½9ù×ăˆŸ;¶è߈êöơ…±»ÑÓŽƒ—Ó«‡“ÍjäôÅÔ»¼‘›1·¿ùêă½ÅØåßẳù懺¹Ú«ªºÙÜà̉«‡“ÍjÏÅëÑÓٽٽ©ØÙ½Ö“ƾƒv‡Œ½±»›¾«‡“ÍjÏÅɇÛÄÓ©¼ƒv°»ÍƠăˆŸ—¾ÏÔéÓÑÓ«·3uUÑÓçÇ«ÓÁƯÊÇ‹ÇĂĂ߈Û×Û×ÇÖù×ÑĂ±ëØ™àóÇæ½ơĂëÓ˜ÁÙ½ÙÚË̉Û«‚ ½9Û«‚ ½9çÀÙÚÁ̉«d“ăົ±»§ô¯›£ÇÔ›¾ó½ª‡’̀jÿÛ®¼öĂÑÄëăˆŸĂăÔÑÓªÔÛ«‚ ½9Ù½ñÓôé½Ă½‹È±»‚ưÀÙ½™»±»Ù½9¥‡£ ëöÏÔáê«·3uUˆ;ăˆŸ½|ÏÔ·ÔƒˆºÿÚƒä +ꓟ}¹Ú±»ÑæăˆŸ;k«Ú…䙇ñÚ½߈ÓØăˆŸ;߈ÏÔ•¾À¼ëö«‡“ÍjÍÇ•ç̉“‡Ç©‡¥2ßëMù×Û̉Å·ÔóÇăơơêËÓÍË)éÛ9¥ͼ¨‡¤2€̃êLâàÍÓ±»ÏÔº±»Ûº±»ÍË)éÛ9¥ëöƒvé‡ǻÿ¯¶ívÚÚÏŃvéºóÔÿÚăà™‰kß [ïSÅÓ«ÔçƯºÏÄĂÙëӭĽù×ÅÓ»ơỖˆÙ½ÿÚ¡Á¶Ü0ºµØ×Ü£ä߈©¼ăˆŸ;ÅÔ™‰kß [ïSÏ̉ßÚ߈§Ûù×Ë¡¹Ú°» ±»ÑÄ뙉kß [ïSƠ°ëöÛº¹Ú‡ÇÖÆ±»ơêëÚăˆŸ;kרÓ‡›¡«‡“Íj™ÔÁƯ½ï»ù×½€âˆ:jù×ׯ›»“Ơ„Ú$Ở‰ÛµØ§ÈăˆŸ;ĂÈ™‰kß [ïS·Ô£ÓăÁµÅÛ«‚ ½9«‡“ÍjgñÖ«‡“ÍjÛÀó•̀¥ˆ]1„™ÁơÔëöÏÔÁƯ›¾±»‡¡ÁÙ×éÚăÇíñÚ¿½ïƠÏÅêöĂÙ¥ÓÅØÑÓ߈«‡“ÍjÍË)éÛ9¥«‡“Íj¹ +©ª‡’̀jÁ̉£Ç«‡“ÍjñÙ÷ÚßÏáêéÓáÚ̃ŒÚ,ŸÖÇÖ÷Á±»™‰kß [ïSÚÀ±»ù¾±»¡Èëöï¶¹ÚßÁưÀ›ĂÛ«‚ ½9‡ÛÙ½Ăô½߈‰Ûơ$½«‡“Íj Áÿ§·Ø߈¡Ơ—ăßƯ£ « ©ƒ»5¹ ™‰kß [ïSÍĂщ—¶ƠºmơÄ“ÈĂĂ ›­±àéMƵؕŒÚª‚ +¼9Û«‚ ½9©ÓÙÅë—ÓÛ«‚ ½9߈ưˆ©ÀÑÓÙÚĂöơ꿉™‰kß [ïSç°ÁñÆÏÔÏŰ»ÙâưÀ™‰kß [ïSÇÜÛ«‚ ½9›¾¡Ơờ·¼Í7ăˆŸ÷‡ÛºÏÄ—¶È̉¨" ƒà‡Ç߈ùæëö»Ø©¼£ØµØù×›¾öéêÛׯ¹ÚûÓâºÛ«‚ ½9½óÇÓ̉ÉóăˆŸÙÚăˆŸơêù‰̃ÄØ“È·ÔŸ}  ÑÄ듹ƯNåÁŸ¾‡ŒĂ…߈gÉ»ÍćdžyÛÄÓĂºâàï½åÁå̉ ọ́¶«ÛÛ«‚ ½9©-Ăºµ}÷ÁăˆŸ;ÏÅ߈Û«‚ ½9ưÀ‹Çù×´ƠöÙ½Û«‚ ½9©Ç«‡“Íj‹Èă¼ï»æ̉ĂÙ½±ºçڇ߷ÅÛ×ùׇçÚáƠÓÅμ₫ԇׯ¼ÍB©‡¥2ßëMçÚÁăǺ£»Đ¹¶‰¿IƒvưÀ¶‡Ö8æ…Ơô¾ÖÔ†6¦j©ºÏÅÛ«‚ ½9îù×ÖÆû(¾ù×Yƒv«ƯÁƯø¾ ¹óôاӳºóÑÛ§âÙÚƠ« ©ƒ»5±»ăˆŸ‹Ç½¯ÈƠÇô«ÓÖÆå̉ ÷‡±»§ÔÙ½™‡ÛÿÚ…¾çº½߈9¥‡÷Á³à¹Ú‹Ü» ׇ‡ư2“Ơ¹öƒvƯ.ƒv¾œ·̉ ¤0ÏÔ×ÓĂ¿Åï»°¿ïi™‰kß [ïSơê›v›¾µØËSÅƯÅØưÀđÄ+Û«‚ ½9âăˆŸ;÷ÁÓºáềlăˆŸÏſŽ߈±»Ͼ¥OÛ«‚ ½9«‡“ÍjÀ¹'¡Á­ÄÇŃvëöûÓƒª“×¹Ú¥ˆ]1«‡“Íj—óËƠƯ‰ëöÚª‚ +¼9çôÙ½Ïß±ëØÓ̉ÿÚ½ô™‰kß [ïS«Ô«‡“Íj€º߈¼Ôëö‹ÜÉĂç½ÛÁ¹±&¾¹ÚéÓăˆŸ;麫ôƒvéôßơưÀÛÇ«ÚÙ½’‰#2##Ô,#ø#“Ü뇙‡³ÂñÓµØÁ¹Åÿ.¶óǧÔäơÁëØ©Øù×±»óív­Ö›Ú¥Ó‡¾¥ˆ]1߈ÍË)éÛ9¥±»ÄÍÓÓ¼¡Ư•Œ‹ÇóÇ™‰kß [ïSÇØéºƒv°»½¨¾ÙÚ¶º«‡“Íjéê«Ô“Ƚôù׿çÛ«‚ ½9‚v›v©ÇƠ'íꙉkß [ïSÂÙ…n§ÔÓŵØÖ̉*̣ÇđÆ…ô˱ëöµ†Ăº±»«dÇÖư܇Œư§‡ŸÛºøêưÀ¿Å©Øëö‡ÛăˆŸÙŒë*«½ôl‘ÆÛ«‚ ½9ÏÔ­È߈™‰kß [ïS½˹ëöºĂéê"½q—”‡ÚØÅêôê‰Øɇ±»ß˹™‰kß [ïS—»ơ»ÜÓ ·ÔÏ̉Û×ÇĂ´ ¼¥ˆ]1¹Ú™‰kß [ïSÛ«‚ ½9È̉ÏÔ¿‰ºy"×$öù׃v·ºï»ƒv÷å5ÓŸ}Û«‚ ½9ăˆŸƒvĂĂÙºÛÅâ»ÄœÁ ƒˆßÄÙĂÈưÀå̉ ÅØ™‰kß [ïSƒˆ©Ó›Ú¹Ø߈ù×±»Î̉ăˆŸ;á¬íØơê°»°»­ÄÅỒÓÛ«‚ ½9ù×₫ +®¶ +ÿ¯¶°»g±»ñÓÅÁ߈™ÓÛ9¥‡”½ïÅ¡Á•ºÙÚ½Ô߈®́½߈Ù½¡ÔỔ²º̣—¾ĂƠ¯¼¶ + +ÇÖƒơ¼€¥Ø‘ÆÙ½½Ă±»ä̉ƒĂÙ½ơêŽñÓÿ¯¶ùׇºÙܰ»ƒvíÜô¿¹­Ä¤Ó¯G‹ø±»ÇðêØôꇋÜcÙÚßÚ™ëéåí—G“ƠÑ·߈½ôñÚ«‡“ÍjÙŒë*«¤‰̀L„ô߈›¾Å̀Ó½€ù×›¾á=ĂÙ¼±»½…Ơ½€ù×í#¿‰Ö¾­Ö÷Á—¶å̉ ËÉ9¿à™ÓéÂé¾.ÛÚ™‰kß [ïSˆ¹ÚÛ׃ڹÚëÓ™‰kß [ïS—¾—Û«‚ ½9±»™Œ½Û×±»à=ƒÍÄÙÚáêÙÚö…£ØÂÖÏÔ§Ó¿ôá Û«‚ ½9ăçÚâ­¯‰¯0ô±»ŧ¯ØÇ»­¾¥ÆÑÓ¾½€ÓÅëÚרëö¯È¥âùשӿ±»³ÈÓÅÛÛ«‚ ½99¥‡»ßóÔÿ¿‰ñÓöŸÖ·‡‘×8çÆƠơư¿Ó¡Ô˜‰ j ̃    Z îS ÷‡’Ó3«́—»ù¾Ó̉û(öרËÉ9ñ‹ĂăơƒÖù׉¿IĂÙ«‡“ÍjưÀÛ×âà›¾íÆ›¡¡ÈÚª‚ +¼9¿‰Û«‚ ½9ơÔù×Á¾óÇ‘9¥‡±»Ôÿڶ虉kß [ïSÏÔ›¡ÖĂª»å̉ ăàѶ¯G‹øÜÚ½ăˆŸ;́½¡Á߈ÏÅǼ߈…Û«‚ ½9«Ô‘éÛÀ×¼•Œ…›¾¯Û½»ø‹Ç¹Û«‚ ½9«‡“ÍjŸÖ›¾¡ƠçÚëöơÛÛ«‚ ½98¤‡×ù׫‡“Íj™Ø­Ô¼ ÿ¯¶Ï̉½Ôơ·Øÿ$Ž€Ù½Ù½¢ÈÛÀ±ëØÅăˆŸ9¥‡á ÷¼™ëéåç½÷Á’Ó-ù×ŵºÙÙ‡ƒvư%ëÖÁÚŸ}—˜Û«‚ ½9‹ÇºŸÅ»Ø™‰kß [ïSË%ÑæÏÔçÚŸá•Èû›™‰kß [ïS™ëé婼™‰kß [ïSµØ«‡“Íj¡ÛĂºŸ}æÚºÅÓà ÍÄ¢»ưÀÑÓÙ½ù×ƯÓ «‡“ÍjÅß纙‰kß [ïSËÀœ&ÔXß»û…»óǽđÓóíóÓêơ¡₫.á ׯÖØÓÓ¥Æ9¥‡‡Œׯ›¶é·‡‘×8çËÓưÀ½Ôù×ψÏÔ•Œ¡Ô½ͽóíÛ«‚ ½9ÿ¯¶ƒ½ÏÅÏÅï»ÚêưÀµaĂÈăˆŸ;ư‡±ù1Ă¹Ú¹Úó—¶¥ÈÓÆ«dÑŶٽ½Ô°Á ’Ơß»ûĂô·‡‘×8ç߈¡ƠÅà“Ơ¿̀ƒv™‡ ËûĂÙ±»¼ÅÙ±»ïD£Ø¹ÚÑĂùÚ9¥‡ĂÙ•{Û×ÏÔÙŒë*«ơlÚ×à ƠÁË߈å̉ Ÿ}Åô½Ô«‡“Íj߈÷‡ëöäƠ¡ÈƠÄÏÔÀ‡€è/Ö:ĐÅ ù×ù×½€‹Ü9¥‡«‡“ÍjÏÚ¿«»³ôáêç±ÔăàÛÄÓ¹Ú·Ô­ÖƠv“Ơ„«ÔÙÚăˆŸ;k³z±Èù×ÏỔÆ¡ÅØ…µØ½§Æ§ôƒvÇÖÍË)éÛ9¥¯ƠóăˆŸ©¿‰ù꫇“Íj߈ψ±¿Ï̉ñÆÙÚ·‡‘×8çƒv˜Û‡Œ‰¿Iù×›·ÔƠÏ¿‰¿I…ŒÏŷԼɻµØ›¾ÿÚßÁëöĂº÷ÁÏ̉¥ÆÏÔ«·3uU¡ÔåƠëö£»¶Û«‚ ½9̃ˆ™‰kß [ïS8¤‡çÚ›¹™‡ăˆŸ;ÍÄíÖ›ÔÁƯ›ŒưMŒÓÛÄÓ™‰kß [ïS±®‰®0ø×đÓ +çÚëö—ˆ÷‡¡Çß¼¯ÈĂÅØß»û¦Ó€Ơ¹Ú¡Ûôéºêö®ÈÛ«‚ ½99¥‡ÛÚéêưÀßÄÙÁƯ¯ØÅÔ“ +«‡“Íj£ÇăˆŸ;½ô¾Ư±»ƒˆ‡ÚƒvöơﻢX +̃ÄØ߈º‡ĂĂ ›­±àéMĂÖë§ơèÅ—ÓªÚ­Äù׃vÛ×ù”Û«‚ ½9ëöáÛăˆŸ;´ÈäÁß»ûÛºÚª‚ +¼9˜êèä߈ÂÎÔ˜ỡÁ—¶÷Á©¼°»¹Ú߈º‡ŒÑĂÎÅùêÙ«Ñ«‡“ÍjÙÚ±»ƠÚív¯Û¾ÓưÀÙ½ÙÚ凌۫‚ ½9…ÖÈăˆŸ;Ú×Û«‚ ½9½€±¾™‰kß [ïSÍĵôå̉ ÅØăơÙ‰ÛÉ̉«‡“Íjù×ïÚ«ÔĂÙ³È߈ơê—¶«‡“Íjí‡̣5†a ƒØËØ®¾ăˆŸ;kë¼÷‡±»©‡¥2ßëMÛ«‚ ½9£ÇăˆŸ;k¹ÍÓ½ô¼ë¾ß‘©¼ôÔëØ™‰kß [ïSƒvßÁăˆŸ·‡‘×8çÿÚ¤Ïùו™‰kß [ïSﻡȶèÁ½˜êèäÚ×Á½•₫±»ù×™™‡Û«‚ ½9“¹ƯNÓzƒ™‰kß [ïS9¥‡ÅØÏÔëöÙÛÑÄ듹ƯNÛ«‚ ½9ñƠóÂÖÆưÀ±¿á ùêỞÏÔ«‡“ÍjăˆŸ¿ƒÛ×ưÀ½»ÅÉĂ™‰kß [ïS9¥‡×ñ‡¹ÖƠX‘Û™‰kß [ïSÓæ‰ÄÉĂ©ÀÛ«‚ ½9Á'ÏÔ¥ÁÅ…ÛÇÖ’Ç•Èû›ăˆŸ™‰kß [ïSÛ×öĂÛ«‚ ½9ửÛ׺ÏÔÑӼ뇺çÚª¶2tT‹Ç«‡“ÍjÛº¡Ô¡Ô™Á́ÁéÓ½Ă ăÁöÓÆ•‡ºÛ«‚ ½9ËÛÙ½ăˆŸ;‚v¸Ú“ÆÍË)éÛ9¥öÁ·Ó ¥0†Ú£È­Ä™‰kß [ïS߈ÛÄÓë̉̀Ó߈€%àÅ ƠäÁÛ«‚ ½9ƒ½Û«‚ ½99¥‡«‡“Íj×Ơ†7§j¡\›¾Ù½ù׷܋ӸڡÈÙÚâºù׃¾‘ùײÈçôơ‡Ç箳 ½Øà¼±»û)—ÓÀ¼ÏÔ¯ÈÛ«‚ ½9ƒv麇‡ºË̉ÓÅÿ¯¶Û«‚ ½9¡Èä̉«‡“ÍjÏÔ·¼Í7ơê¨ ½‹Ç¿à«‡“ÍjƒˆƒÚ›é±»ÏÔ‡«‡“Íj‚Áå»±»щ߈߈ßƯù×»‡Éá₫®¶§Ûù×ívÖ¼±¿¡È£ØŸÖëöÉÖ§Ø™‰kß [ïSĂÙ÷¼“Ơ£2Û«‚ ½9…öÚª‚ +¼9Á³¿‰ù¿ƒˆ§Æù×ĂºÛ×߈«‡“ÍjáƠÍB9¥‡¿‰Á½«»º½߈àƠ±»ăºÍgä×ù×·Ôù×Å›²Â«ÔÏÔ9¥‡±ó¾Åñw³Ôơ¹ÚÇÖöéÙ¼ô½߈ÇôÙ½¡Ûµí¿º§ØƒíÍÓù×±»­ØăˆŸ;k—Óª¶2tT÷ˆăˆŸ;Ç%ëÓƒƯ߈­½¼Ù½ïƠ²Âÿ¯¶ÏÅ•Œ¹Ú›ÚÿÛˆ¼”µ†™‰kß [ïSﻃ½“ÇñÔ߈±»Ă‹Ü¡Á°»½€“Û«‡“ÍjÙ߈߈©È›¶é₫®¶ù×ĐÄê¹Ú·Ôñ̃ƠÇÜÏÅÅĂáÛÙ×á=ÅØùסƠéđưÀƒvÚª‚ +¼9Û«‚ ½9øêźøæ“ÇóÍÑÓï½³zơèÅÚª‚ +¼9äÁ[ĂÙù×ëö«»¡È÷Á÷Á÷ÁÙÚÑæĐÓ “ÈË¿ëÔ¯öăˆŸ;³ºó—»ơÔ±»·̣ׯ§ô½±»ăà©Ó÷ˆăˆŸÑÄëß»ûăˆŸ‡xí•Û«‚ ½9Ơ߈ÔXâˆ:jØ×¡Á­Äơê÷ơǺßÚ™‰kß [ïSÏÅñÚµØÑ+¥ˆ]1·Ô¯ÈơÔß»û÷Á߈›¾±½£äµØ¡ÈçÚÎ&ÏÔëö–¾½Á½ăˆŸ;¿́ß»û½­Ö¿Åív÷Ú½ëö™Ó߈ÑØ‚vô–̣óęԃvÛ×ÏÓáƠ›vª»ôêÛÔ¶«‡“Íj­ÖÛÄÓÙ½å̉ ƒvåĂ²¾±»Ÿ»Á߈«‡“Íj›¾ÚƃvǺ˜ÁÏÔ¹Ú½ơÔÛº…ôáê÷Á™ơƒˆÏ̉ơ߈Ö¾°»™‰kß [ïSï½±»›¾ëö×¾ăˆŸ;ÙÚ“ÈùׇºƒÖ¿ÙĽ½ưÜ·Ô½«ÛĂĂ÷ơƒ‘™ÓÆĂ±»†öÉĂêöÙăˆŸ;9¥‡ôêçÚùêù×ù×á̀ỡ±»”·½€ÅÏÅ«Úg½ßÏÔ¡±½Ç̉©Ó¹ÚÏŃÚå̉ ßÁ™‡ù׫‡“Íjív˹ăơù×Ư³Æûö÷Á‹ÇÛ«‚ ½9ƠÓØ·ÔÛ«‚ ½9œø¯é—Ó©‡¥2ßëMö߈ñÄÑĂƒˆï™ÏÔ›€ơê߈÷‡ÛÀÁ™‡´• +·ôăˆŸ…̃÷Ôơê‡Ç«ÑƯ»œ¿Ïź„a«‡“Íj«ÓèêöÁ¯ÈÏÔ߈ơê÷ +ÏÔÏÔǽ9¥‡¹ÚIÁ½ăˆŸ;kö“ƠÑÄë½Û×Û¹Ú—˜á «‡“Íj¡ÔµƠ߈¡Ô¡Û™‡ĂÙºĂƠ΀5™‰kß [ïSÏÔ¹Ú¦Ó «Úù×—¶Û«‚ ½9™‰kß [ïSù¿·Ü¡»₫ĂÙơéÙÜă"¥ˆ]1Ǻ•Èû›ÏÔÙÚÏÔ·Å¿ô“È9¥‡›¾˜ôƒv¿‰¥àÏ̉ÜăˆŸ;¡Û¥Û•’™ơƒvÛ«‚ ½9Û«‚ ½9…Ö÷ÁÏÅƠÁ¼ĂÙ߈ÁĂÈßÁÙÚÏÔ±»‡ÇÙ½ûƠ³Â©&ñƃv™‰kß [ïSçô§´»Øñ½ơê“ƠăˆŸ;ơê‘ÔơèÅăˆŸ;kóĂÙß‚¡Ơù×ƯÓ Ó§s°êØÏÅÿÚÅÔ±½ăÁív÷Áë ù×™‰kß [ïS½ÏÅ߈ٽ׿8±»̀Óñ×áÛỔ×¾‘Ö߈È×Ơ£Ôëöµ|Ü›¶éÑÄë¡ÓÚª‚ +¼9›¾ÅÓ9¥‡ÿ¯¶«‡“ÍjÓ©ÓÛ«‚ ½9åô½ăàÔ³Ïű½ƒv‡Ú§Óơ³zù׫‡“ÍjƒˆơêºsĂºêöÚª‚ +¼9•ŒăˆŸ₫ăˆŸ;ÙÚƠ ÁÅÁù×Ă¼‘gëöùÁȓǷñ–ÓÛ«‚ ½9Ù½£߈«ÓñÚÛ«‚ ½9˱ûÓÿ§Ï̉öÁËáƒv°¿™ëéåĂźù×ɇ»ăºµ€©¾§ÓÇÖưŒû‰óÂß„½ôù×Üơ«‡“Íj¿ôå̉ ¯ƠóÏÅ9¥‡ëöĐÓ°¿ưÀÎÅ#ͼ‰ÔĂÈïÂ9¥‡°»™‰kß [ïS¹ÚåĂù×å̉ ăˆŸ;ḳ£ӫ‡“Íjå̉ 5­ô“ºÆùט‰ j ̃    Z îS ½µ.¥Ù×Ơç̉Ở£ÇÚ›‡ׯù×å±™‰kß [ïS•—¶ÍƠùרçÚ•ŒĂ߈Ù×ù×Ûº©Ø9¥‡…ÚÁ¹ÙÚÙ́½ ógĂiËÖÏÔÜÓ Úª‚ +¼9ÏÔ¾ÛºÁ½«‡“Íj©ÊăˆŸÏÔÏÅï…ÇÖÍɇ±½ÑÄëñÚÛ«‚ ½9ׂÔÅÓƠñÄ›G¡Ô»½ïÁƠÅơèÅ—¶ƒ½Á‡é/×:™‡½€˜Ôͼ±¿ăˆŸƒØ¼ÔÛ«‚ ½9˜‡ăăÙ½·z퀻±ăơÛºå̉ ¹Úµ†ưÀ±»›¡üÙÙÚÛ«‚ ½9µØÿ¯¶ûÓƯ‰±”­Ö«×Ơ«‡“Íj•̃ˆ§ØÍƠºŽæÇ¯Ơ½ß»ûƒåí‡Ñؽ¿(°»‹ÜÏÅửÑĂ½Ù×ưÀ±½Ë¿ö›¶éưÀ—¶₫Û§ô߈áƯÚª‚ +¼9©¼—¶«‡“Íj³ºóíÙÛ«‚ ½9ÙŒë*«߈ù׳(ƒØÔ½ƒØá «‡“Íj™‰kß [ïSóǸړÆó—ӷŅࡻÏÔÿ¯¶©‡¥2ßëM⻫‡“Íj­€ιñÖ§Ô‰Ô£Øùף䲔‹Ü±»“ƠÓØ߈£ÇĂÙ·‡‘×8ç½ÑâƠ Û™Á˿ϙÓơêºŰÏ̉ơÄÿ$ĂÙÇÖù×ëöͼÿ±»»Å™‰kß [ïS©Ó‹ÓÁĂÛ«‚ ½9Ùù¿߈ăˆŸơÔ©¼߈ÿ¯¶ăˆŸ;™ôưÀÓ±Ăº±¿Û«‚ ½9ûÓù×­ÄçÚ¡ÛèưÀ™Áñ×ëƒÖ‘×±½ă¼́–Göơ½߈™ëé嵨¡È°»¯G‹ø±»±»½§ÔÏÔËÇÓØĂÙ‡“ùרÓí꫇“ÍjÍÄ›¾×q߈ăˆŸ;k¹¼8¤‡ơêÿ¯¶¸ÚÚÆ™Ûù×Áö̃ˆÏÅ©ØñÓÅÓ³«‡“ÍjíÅù¿ơê›Û°»±»éơ¿ôË÷Ù™‰kß [ïSăê“È«ÔĂ ï»ùêéÓĂÈ󫇓ÍjÙ¡È”Èú¯‰¯0̃ˆĂôĂÈÿÚ߈¡ÛñÓÜ»ØñÚáØáι‚v“ƠÇ̉ܵ܉ÁăˆŸ;±ëئÈMăˆŸÛÆË¿¼ÏÅÓÆ«Ñ‹‚§Ô£ä“È“߈ù×ƼëöñÓ£ÔÑ·ívóÂùׇºÏÅ‚À›¾ÿÚ¼ÔƠñÚéê°» ߈’½µØ›vµØ9¥‡×å̉ ăêñÓ«‡“Íj÷‡µØŒEÓµØơĂÿ¯¶’ƠăˆŸ;k­€˜êèäÂÛ«‚ ½9†Œ   ÅÔ®Gø½»ĂĂ“ööµØ¯ñ—¶öщµaÏÅ­ÖÛ×°»…7Ơ¾G߈Ǽ߈«‡“Íj—ŒçÚơÄщ·ÔÛ«‚ ½9ÙÚ˜‰j̃ZîS«»ñÆÓº™‰kß [ïSûƠù×½€ĂƠá=óÇ•Œ¢XcRÏ̉̀ĂƯÚÿ×Û«‚ ½9ëöÍË)éÛ9¥ß»ûƒv°»Ó̉ơĂ߈´aÏÔ‡øçô—»‡Çáê߈ƒ½±½ƒv¡Áƒ×íÆ×¹è¼Á|ñÚÛ«‚ ½9°» Ơƒ×ñÚٽٽÍƠÏÔׯÑźÏ̉ăù¿Û×¹àÖ¾8 Û«‚ ½9×Ơ†7§j¿ôÉ€ÿÚ¿ƒv±ÉƒvÛºưÀÍÓ˜‰j̃ZîSÛ«‚ ½9½ÏÔƒvùê¼·‡‘×8çªĐ¿Àà=‡ÛÿÛ£ƯϼÓÅ9¥‡±¿¸Úí—GăˆŸ;×Ü«‡“Íj¿ôËÖÙÚ¹}êö9¥‡¡ÔùëÖ†ŒÏÅø×çÚ¡ÁÙ½ÏÚù×£ƯưÀÛ«‚ ½9ăÇíƠî˜Á½ÂÙÛ«‚ ½9ÏŹà·ÅëöÛ«‚ ½9щ·ëÁƒ½¹Ú¡ÔÛ×ï³2ùê×Ú±»¿‰ºƒvá ÇÖ«)—Ó¤Öƒvøêó±»µ†¿‰̃„ù×ÏÅÙ×—¶߈¾½ơÔô“È­ÖÜívï½ÿ¯¶ÏÔ‰»¾̀ĂÙŒë*«‡º­‡§·¼îÀ©‡¥2ßëM¢Èù×ÇÖÅÈơÄ™™‰kß [ïS¡Á߈ßÄÙ߈¿‰ºĂÍË)éÛ9¥ÏÅʾ°»åĂĂÅ»ưÀÇ ĂÙßÄÙºÁ¯¼À¹ûØ›¾ƠÁËǬÄôê¨ºăˆŸÏÅÚÀÿ¯¶™‡ÏÅø¾ÏÔ¾Œu߈ÍË)éÛ9¥ĂÙÏÅÛ«‚ ½9¹ÚÏÚÚ±Ư½€ñÖĂÙ‚v߈ôµÛö™ô‹ƯÙ½Ă¼ÙŒë*«Ë̉Û×ëö§‡«&ÑÄëăꙉkß [ïS¥ˆ]1âÄå̉ óÔ™‰kß [ïS¯ƠŒçÚ•Œ™‰kß [ïS¼ßÖÙ½щù×ù×íꙉkß [ïSÇĂÖ¶èß„ăˆŸ₫®¶9¥‡›Ăÿ¯¶ؽÛ«‚ ½9±»‘̀ÙÜơêÖ¼ºqơêơèÅÙ½ÏÅ©½Ươ¤ÆÍË)éÛ9¥£ØÇÖÅÔÀ̉±»ù×ÑØƯÓ ‡ñ̉ÁÛºÛ«‚ ½9¶Ô‚vø¾¯×ăˆŸ¿ÛÄÓ€ÄÏÅÿ¯¶ÏÔÿÚÙÜ«âăˆŸ;ƒ¹Úß»ûƒv¾ưÀ¿ç÷Á·‡‘×8çÆ̉«·3uUµØăˆŸ‹ÜăˆŸ«ÔÿÛÂÙË4ÍÓ­Û¶èÏÔͼơúÁ|éơ¿‰ÇÖƒÚ¤ˆ\0ѶÁοăƒv•Èû›¿ß£ä¾ù×XÏÅÍÓɼ‹Ç½±»±¿÷Á‡Ç©¼ƒvÛÇ÷Á«·3uUÛ×™‡Ó¼­Äß»û÷Ú™‰kß [ïSÅÄ©ÿ§™ëéåö„ƒÖư‡äà ³ë©½Û«‚ ½9«%À¼·ÔÑÓ«‡“ÍjÙÚ¸Ú­ÄƠ°»ưÀχÇØÿ‡¹ïĂٱ܅»†äáŪ‡’̀jë×ܱ»‹ÜÇ̉ŸÅ™‡߈ù׿öíêơÄ÷Á­ØØ—»§Óó³½×Ơăơ߈«‡“Íj±»°»ùꃈÈ̉ɘ‰j̃ZîSùêûƠ½ï»¹ÔÅÔùê¦ôá=•ŒÍÓ¼›¹™‡öÛ«‚ ½9Ù½Ơ•¹ÚăˆŸ;ÁƯÿ×̃ˆ¡ÛÏÅÏÔëö¯ƒ« +>…ƠưÁÏ̉½Ă½Ù½éÓÅÔùë¯Èíß±»÷ÁÿÚù×™Á›¾¹›·Ôâơö¿‰ÏÄ£ÇÏÅ¡%áêÅÓç$Å–™‰kß [ïSưÀ9¥‡°»©‡¥2ßëMíÓ«Ô©‡¥2ßëMÛºôÔ™‡Û×ñÓ«Ô±»‰±6ñÓßÄÙ‚½Ù×½Ă›¶éÙ½‚ṽ%ƒ¾‘±»©‡¥2ßëMË̉߈đÇ»Ï̉«·3uUơÔùê·‡‘×8çơèÅƠî߈ºăàÁ̉™ôÀƯÛ«‚ ½9ëÚ™×ÏÔ¡»½ç½ÛÄÓ³ÂÅÓÏÅĂëö‡ŒÍÄ‹è߈ĂÙ±»¹Ú‡Ú¹ÁÙÅë“Ơù×ăơù×½ÙÚ›·Ô€¾ëö¿‰ăˆŸ;Ù½öÁ +÷ÁçôÏÔ9¥‡·§D …ô§ô½€¡ÔíêË%°»ÿ¯¶ªÚÏÄ«ÆÂơÛ›¶éƽëù×±»9¥‡™‰kß [ïSÁĂÍBµØ³ÈËÉ9ÏăˆÁÓƠÁÙ½âơŸ}©Ơ‹Ù÷Úëöó#¿½±»å’­¾ù×Û«‚ ½9ó%∓Ǿ«‡“Íj¤ˆ\0£XÛ«‚ ½9ù¿°»‡º‹àûƒˆ‹ÈĂÙ½¥Ó°»ÏÔƼÑØ­Ä´Àå̉ ÏćۃÔùë­ÖëØÙÚơêÏÔåè¿»ÙŒë*«ÿÚö·Ü™‰kß [ïSÛ×ùê½ÑĂ½ª‡’̀jăˆŸ±l½ÅØÔ]“¹ƯN›Ă¡Á£‡›¶é§Ó¹¨—Ó‹Ù—ØÍÓñÓ߈«â±»ơÔĂÁ̉‡Û“ȫԀÙÔXï³2Å–߈ơÔ½µàÛ×Ù±»µa¡Û¿uĂÏl«Ô©ºº¶‰ơ©È±»éºü̉ÅÓ퇱»ƒv¿‰çÁù×¹¿›ÏåÁ¼›¾öƒØ¿Å¼€«‡“ÍjË̉ă鯯ØÛ«‚ ½9›¾£Øƒv‰ÁïƠ¡È½€å̉ 9¥‡Ó“Èù×™‰kß [ïSͺívÎÅ—ƒ×ùט‰j̃ZîS̃ÖÛ_íÚ©Ó¥‰ÍL…½€“¹ƯN™‰kß [ïS°»9¥‡ºyÍÄù×¯Û·Ó ¥0ÏÔ•é¡ÍñÁß„ăˆŸ‹Ü߈Å»¡ÁùêăˆŸ;k™‰kß [ïSÛ«‚ ½9ưÀ·Å¿‰ĂÙ™‡¥©ÏÔÛ«‚ ½9śɿ‰ëö‘Ó߈íÆ±»¶ׯñÚÏŇºăˆŸ;ƒù×™‡÷ÚùשӂvÁ̉ä̉‡ÛÚª‚ +¼9ÁºèêÔºlÛ«‚ ½9ñÚÈ™ÁÉ9ơĂơÔ™‰kß [ïSÁĂχ©Œù×Å–Ổ™ôÛº­ß»û½ÏŃvư§‡æ̉«‡“ÍjơÁ¹±¿éê±»ͼ™Ô™‰kß [ïSđÙ-ù×ăˆŸ߈÷‡©-Ϻº̉¯Èá‡ĂÈÓ5‰àØ»ƒvÚª‚ +¼9Û™‡«‡“ÍjÎÅêößSÑÄëÓºÍÓ›¹Ú×ѶăˆŸÿ Å«‰„éºÁŒ–Œï³2û‰·‡‘×8çíëöËÖỞỬñÓéJé‰Ó5“gesÁÅÙ×üÁÅÓ«»ơêêƠ T ÛºăˆŸ;ĂôµØ߈Ï̉·Ô›¾Ó¾Á«‡“Íj¿»Áă˜êèä‹Ù¸Ú߈÷Ù°¿«‡“ÍjˆĂ³Ç™‰kß [ïS¹ÚñÓưÀÏÅ¥ˆ]1ăêëö߈ơĂĂĂĂÙù×ßÚÿÇ·ôÏÅË¿«‡“ÍjǺ¯×óÇÿ¯¶›¾Û«‚ ½9‡ÇăˆŸ;“Ơ߈ĂĂỞ°»ÙÚ—¶ÁĂÏÅƠ¹ÚăˆŸ¾º°½È€ăˆŸ;ó¡Ơ›¾ăÁ¡»ÙÚøæÏ̉߈¼ÔÏÔƒv“¼ñÆ×¾Û—¶¡ÛÏ̉Æ˹ËÉ9›¾¾Å»Úª‚ +¼9Û«‚ ½9å̉ ăơÅÓ£äóÅßµÍÓǽëöĂ¼•Ó£‡ÙÚíÂ9¥‡«ÔëöÏŹàï»ç©Üù×߈•‡¾§ÔơÔ›¾Ù€÷ˆÏ̉ơßχےȃԓƠËÀÍÄó€ƠÏžŴ†°»½ăˆŸ;ç̉¢" ›v±»‹ÜëöôëԭĻñÖÙ½ÇÖ¹Úù׫ÔÍÄĂÙ¹ÚÏÔĂÈív½ß‡x…½߈l½Ù½Û«‚ ½9ÁƯ⼀˜‰j̃ZîS臃v·Å’ÇÛ«‚ ½9øêö°½á ŸÅ˹Ơ½€Ïű»ûÓÁ½“đ½ù×™‰kß [ïS¤ˆ\0ÁƯñ‡íꙉkß [ïSôé*ÏÔ÷Á´(™‰kß [ïSß»û¶ơÔơ–Å–”DZ»¼€‡»ù¿ëö̃ˆáÚ­ØĂÙƒvƒvÛ×¶‡Ö8æׯă½§¹Ơ™‡£Ç‡º½ÑÄëâˆ:÷ˆׯ½ñÓ¿»‡ Ơ¿‹Ç™‰kß [ïSëöÓ¼ÎÅĂÛ·Ôù××Ó«‡“Íj‡Œ̃„½Ϻ‹Üöº±»½ô·‡‘×8çĂôÙ½ơèÅ ÇĂÙÇ֒Ʊ»§óÔ¹Á9¥‡߈߈ï½µq˜‰j̃ZîSå‡Û«‚ ½9±­Äø× ßÖ™vÅØºĐÄ +ê +ăˆŸ;íê›çÀʹƠ½‹Ç³7ÛÀ½Û«‚ ½9÷‡•ÇÁ½¿‰ÚÀ»ÔơèÅí`ÿ¯¶ăàß»û±»ưÀ™‰kß [ïSªÚ ™‡íêËÉ9±»/éö©¼ÑÓá ï½™‰kß [ïSưÀÏÔÁ¼ù³÷Áÿ×½¶ơêñÖĂÙ›»ª‡’̀j™‰kß [ïS ¬°àèMƯº¶ÿ×ùë߈Á µØå̉ Úª‚ +¼9 ÛÏÅăˆŸ̃ˆÿ¯¶±đ½€ĂĂéÓôê·‡‘×8ç±»ưÀÛ«‚ ½9´È¦¹ñíÈÙY߈ù×ÑÄëûËÓÁ××ܽå̉ áö“ƠÁÛ×äƠ±»ÁĂ³ÈÏÔ¿‰›¹˹㻵ØúÚßÏ–Ă;Ë̉öửƒơꇺÏÔÓºûØŸÅ«»߈½ơĂĂÙĐÄê“ÑĂ§Æ¾ç߈½ƒÖ½¾‡“º¿»å̉ ÙÜô·Åơê¹Ú±»µØëöÛ«‚ ½9ÏÅëÓÓÆ½¬ÖÛº÷ÁÏÔñ»™Ô½€ŒÓÅØ8¤‡†Ç™‰kß [ïS«‡“Íjù×ÏÔ½€™×»&Ù½©±»ưÀăÇí±»‡xƒˆÁĂ›»±»‚v‹ÈŽí—Gù×á꛾¾¹èê’¹ÜNßϑƳëö›Ú›¾9¥‡×ÏÔ‚v«ä›¾÷‡ÏÔ†ºØÓÇ»ÆØ·ÅÙÅëÛ«‚ ½9ÏÔ˜‰j̃ZîS߈¸£ÏÄ¡Û÷‡«%ß„«·3uUơêÇÖ¿‰½ÈñÓỞÛ«‚ ½9æ$«‡“ÍjơÜöÁ˜‰ +j +̃ + + + +Z +îS +ÙÜ߈­vêöù×ÿÚÅô²Ô…ŒùôÇÖ¿Åͽùשƅä¬ô×ÜơúËǵ؛¾Ă«Ô¾ßÖëö™‰kß [ïSƒˆ9¥‡ƒĂßÚ¹ÚÛ«‚ ½9÷‡ÿ$‰¿I¼Ô«‡“ÍjƒÖßÄÙåÁ•Èû›™‰kß [ïSÛ«‚ ½9ÁËY£ä‡ăˆŸ;‡¿‹û÷ÁÛ«‚ ½9ÎÔÁƯÁƯÏÔÛº¿‰ÑÄëơê•׎߈ƒvÖĂù׃vßƯºÊ”ÂĂíÆ…©Û«‚ ½9µØ½Û«‚ ½9ơêăˆŸ߈™‰kß [ïS¿ºñÖ¹Ú¡Û£ÜíÅơÄÙ½¢!ăˆŸ;ÀÓûp߈éºíÖ¼ĂÖưÀ±»ơ™‰kß [ïSÿ¯¶ÅØëö±»¡̃ù×°»½ŸÅ‡ăˆŸ;k™Ó̃ˆ·Åÿ¯¶Û׺½ƒví+ôÙ¿‰ƠÛ«‚ ½9•{¹Úï¶ÏÅÑӇǙ‡ǺÇâ«÷Á¡È½ô‹Ü¹óÂàƠơê‹Ü±»½€Á̉‚ˆè꨺ +ëöÿ$›¾ă™‰kß [ïS«·3uU“ºÛ«‚ ½9ơÙ—¶̉šԜÁ$£»߈ƠXÖ Ô† 6 ¦j ï»ÇÖëö‚v¹ÚĂÈ·ÅåĂÛ×±»´†·‡‘×8ç¹ÚÏ›ô—¶Ù€ù×ăˆŸ;º›¥¡Ô§Ó™‰kß [ïS¹Å±»™‰kß [ïSơèÅ™ơÁƯ­Ä·ÔÏij۫‚ ½9½È±»ưÀí—GØ›¾߈àêù׫Ñ÷¼ÏÅ¡ÔơêÏÔö½9¥‡Û«‚ ½9‡9¡È߈ÏÔÚª‚ +¼9ÂÙ¹Úá ‚ÚÿâăˆŸ;ßÖăˆŸëö¡×«‡“ÍjóÂÛ«‚ ½9Ù½ù×›¡ÏÔ™‰kß [ïS£XóÇ߈ù׿ôÍÓÛ«‚ ½9߈߈íêăˆŸͼơl™‰kß [ïSÍ|¿~µØƠ¾GÇÖ«‡“ÍjÑÓ¡Èÿ¯¶£Øá=ĐĂ¹Úçùן}œ‡Û«‚ ½9»ÅđÛĂ₫¼¿‰±»Đ·ù×¥Û™‰kß [ïSÛ«‚ ½9÷îăˆŸ;Û«‚ ½9›¡·Åù׃vÂƠù×ÏÔ ÁÙÚÛ«‚ ½9Ó™×ßÚÑæÜ—¶§Ó™ô±»ëö‹ÜçØûÓ¼€9¥‡ù׿‰å̉ ăˆŸ;k™‰kß [ïS˜‰%j%̃%%%%Z%îS%óÇïÅù׃ÖÁƯÇÖ“Æ̀Øù×ơê•ÚÍÓ§ÔưÁÍǶř‰kß [ïSÅØ‡Œ¿»ƒ»Û×Á©Ç‡“±ÁɇÁïÅ߈ñíÈ™‡¹ÚËǽ躽éÔ°»Ôü¬»Óºñ‡ưÆ9¥‡ÆăàÏÔáÏŰ»÷Á›¡ÉíÁƯö±»“¼߈©¼ÊÓÁ ±»ÁĂëö÷Á÷‡Ó ÷»ÏÔÅԓȤÂÅ–¯¼Ûˆù꫇“Íjƒøê‡Ç‚Ø+°»•½…»›¾‚Ü¡—ĂÙ§Æ·Ô§ÆËÈ9±½å̉ ÇÖ̃»úÙ½ăˆŸ;ùơôê—»‰¿I›vÛˆÂĂÅØâƒvăˆŸ;óÂù×çÚÙ½Á‡é/×:ÎÔ9¥‡×¿½ͽß»ûØùꙉkß [ïS­€áưÀƒvÛÄÓ½ÛÀ›¶éñÓ§ÆÙ½™Áùê·‡‘×8çưˆơÔ %߈ƒv‹ÇĂºöñÚ9¥‡×ƒ¾‘ͼÏÔù×ÙÚù׿ԥƩƠÅØëöÿ¯¶ÁƯÅÁ߈ÅØ™‰kß [ïSóÇùêŸÅ‹Ù“ÑĂÖÆ)₫®¶çÚƠ¾G±» »±»©ÓÛÄÓ©Ø­«Ú÷4߈÷ˆơÔÏÔ"öư“£»Û«‚ ½9Û«‚ ½9ơê±»¡Èƒv›¾ù×ÏÄÅ»å̉ ÏÄǼ鼫‡“ÍjùׯÈÏ̉ßÄÙñÖĂÙ™‰kß [ïS•ÛăˆŸ«›Ï⫇“ÍjïÚỞ·Ôëöí걿߈±»™‰kß [ïSÆ‚߈€ÄơÔ¸Ú›%ëöܳ(ăÁ½é1ïÅ™‰kß [ïSë‡Ă‡‰¿IÛ«‚ ½9»~ëö§ô‡Œ˜ ê è ä ăˆŸ;×Âè÷‡«Ô߈¯È¶r—¶™Ó™Áعګљ‰kß [ïSåĂơĂ“ºÅÔ›¾™ô±ôרƒvçÚßڋַ‡‘×8çĂÙ¡Û̃„™‰kß [ïSÛ«‚ ½9§ÔÏÔ½ĂÀĂ¾Å©ÜÓÓªÚëö¯‚¾ù×щ«‡“ÍjăˆŸ;käôÛÄÓ™Ûëö½¼Ăù걿ÙÚÁ¦ëö×¾ÁÓƒ¡Ôö… ‰₫¡¼Á̉‹ÓÿÂÏÔ½˜‰j̃ZîSĂ]ăˆŸ;ñÖº߈äÁ™‰kß [ïS™Ô½ÏƒvÏ̉ÇèçÚ«»̣Ă¦Ó¨Çº°»× Ù×ß»û¡ÓÅÔđÆÛ«‚ ½9÷‡˜êèäͪ̃ˆƒvÛ×»Áƒv•ĂĂ ›­±àéMÛº­ơ½ë™H½€·ÈÎăˆŸơÔ“Ơ”Èú©¼¡ÇÙÚÈÁĂêö߈ơĂäÁÛψơ…÷Á Ơ¹ÚÀ½¡ăˆŸÏřԶôßÁ‰ôÏÔ­ØÛ«‚ ½9±»ÓØ¡ÔöºăˆŸ¤Æ +’Ơ«‡“Íj™‡±»Û«‚ ½9¡ÁרÅØ±½•×Á̃ºëö•Œ¥ˆ]1ÍË)éÛ9¥­¾ÁËĂÈϺûÓ°¿±½Â ¬°àèM›¾á ơêëöÇÖÅÓ±»ƺ«lƒvÏÅΈƠÛ«‚ ½9߈Á+£ä“ÇëöưÀëöߌÛ,÷ˆ“º±»9¥‡±»×Ơ±»ÇÖ龿‰¥ «‡“ÍjñÑÓŸ}µ†ĂèÎÅßÄÙù×Ù̉9¥‡ưÀ˜ ê è ä ¯G‹øăˆŸ;Ù½ƒv‰ÛÏÔ›¶é«ÔÛ«‚ ½9ÿÚ›¹ëö‡ŒÚª‚ +¼9Á̉¦ôï²2³ºóëöưˆ«»Ø÷ÁåƠÍÓÔXÚª‚ +¼9ÏÔ—¶Û«‚ ½9Ëǃv™‰kß [ïS¹ÚăˆŸ߈¥Ü»•ª»ăˆŸ;ÁëöƯåù×ÿÚưÀĐÓơ-™ëéåÏÔĂƠø×¡ƠÙÅ뙇½ô›¶é©Ó—¿©Ø©ÓăˆŸù¿ƒåê³ôûăˆŸ;÷Ô–Óù×ăàÑÓ¶´́ñÏºăˆŸ;‰¿I«‡“ÍjÉĐØ*ØŒê*ª£ØëÚ™Á‡ºÑÅ™ëéåÙÜ¿‰ưÀĂÙ×̉‹Ù߈½ô½Ăщ‹Ç©‡¥2ßëM‚vÏÔ¿èăˆŸ;¾¹xù׋Çơèʼnˆ×”™‰kß [ïS纃v‰đϹ™ơ¹Ú«‡“ÍjƒvËÉ9¡hơĂÅÓ·‡‘×8癇‡ŒÇ»̃ˆÙ½ù×/ư‡±ù1ëöÏÔ…»³Â߈Ư±»·Ó ¥0ƒˆÄÿºơÔŻܽßÚÛ«‚ ½9ÛÀ¡Ôé*°»ÿÚñÓÏÔÅÙ£­Ö ÇÛ«‚ ½9ßÄÙùễˆ9¥‡™Áăà¡ÁÈëöăàôê¯àăˆŸ;ªÚ²º̣ø×#ăƯƒÖÍÓŵ‡ÔX߈ºôùê±»߈ö…Ø·Ø÷ÁỔ¡Ûß»ûï½Úª‚ +¼9éÚ÷Á±»«º£äÛ«‚ ½9ר˜êèä§%ăÁŸ\«»™‰kß [ïSÉÑÄëÄØâÄå¹ùê‚ ¡»™Á™Ó—¶Á̉îôÆôß»û÷‡™‰kß [ïSßÄÙÆ¹Ú½ôÙ‰¿IƠùדÆ̃ˆ«‡“Íjùë×¢¡ÈÓ×IóǽÄÓ +Ù½ơÔ÷ÙăɹéÓ°»¤ÓÛ«âßÖơ걿½щ9¥‡Û«‚ ½9ƒ¸Úͽ§º߈“¹ƯN߈¯ÛÙŒë*«ñÚïºƠXŸÖÙ½ö₫Ǻ±»˜‰j̃ZîS߈÷Á‡ºÙ½Û«‚ ½9Áåܺ¿ô¡wÛ«‚ ½9°»Ù½ï½‡ÇƒvƠÁ§Ô߈ÁƒÛű¿›¶éƒv‹Ü±»Ô¡ØëöÍÏ̉ÑÓ«Ñ߈ÛÄÓÜÀÑÄë±»Ù̉†Œùx÷ˆ½û¼­ÄÑÓôêÂÈÏÔÇÖ§Æô߈£»9¥‡¥‰ÍL…ö½ñ«»ÓØ›¾ăˆŸ;ÇĂñÓ½ƒ½̉Áƒ½±»±»÷ÔÏŬĺ³àÙ½ÿÛÛ«‚ ½9»ôưÀá=íÖш‡ä°»ăàƒvÛ«‚ ½9ÁƯÁù×ôê°È—¶ƒv™‰kß [ïS¹ÖưÀ‡xÁ ߈ăÁỔ߈ÿ§ưÀÁÓëÚÇ>ăÛÙ½©Ç‡ºív×Üù¿ơèÅÛ«‚ ½9ÑÓăˆŸ;å»ơèÅĂÙøơ©ºª¶2tTăơ9¥‡ÍÓëÔÏÅÏÔƠÓØªĐ·‡‘×8çÄôÏÅó¶³Ç™‰kß [ïS©Óëö È éÓăˆŸ¬í8¤‡ï½§ÆÍÄ匿N‡Œăà±»êö9¥‡Ï‹Ç±»™Ô±»½Í˜‰j̃ZîSËÇëö¯¼щ“ÈÍË)éÛ9¥ƒvÓØ‡9Œ₫¿Øù׃v¾ß·°¿“Ơ»Å—Ó×¾“›Û—¶ÑĂ™‰kß [ïSçÚÅ–±»ăÁ½ö÷Ô™‡Ç%ăˆŸÇÖ½ơêËÇ‚¼Û«‚ ½9—¾Ûºí߈º½ç̉­½¼©‡¥2ßëMÛ«‚ ½9ù×éÓÛÚ©¼ùסԹÚá=ăˆŸ;éÚÜÓ úƠÓ̉¥Øù׃víÁ£äåÁ±»ºÑÓÙ½±ÔË̉™Ô–»ăˆŸâÁñ»½ÏÔ-ív—¶ơêưÀ™‰kß [ïS÷Á܃½¥ÓÀ‡.€.è/.Ö:.¹Úۺ׾‹Ü»‡·‡‘×8çÍË)éÛ9¥É´¯¾ÙÓ«Ú«‡“Íj¿ëÇ¥ÎÔÑÓùêÛºÏű”ëÚ±»“Èëö̀Ó — «‡“Íjä̉“Ơ±»«‡“ÍjưÀ߈ăˆŸèÔ¡Ó«Ô£X€ºñÙ‰Ăƒˆ¢ƠÏÔ±»™‰kß [ïSëö5Óº›¾›¾‹Ê™‰kß [ïSăˆŸ;ƠÔƒˆ½ ºăˆŸ;’ÓÔX§ÔgÑĂùºăˆŸ;½ôÙ½¾ÛÀñÖÛ«‚ ½9ÿ¯¶‡ŒÅÓÛ×¹Áív‹ÜÀưÀ¯G‹ø…Ø™ÓëÎÙ½¥Øâà†º9¥‡ù×·%·‡‘×8癉kß [ïS£ÇñÓ“º¡ÁàÅ߈£ä߈ëö߈&ËŸ°»™‰kß [ïSÆ»Ăȡ۳‰ÛÉ̉Ûºƒv…Ơï»ëÓ‚ƒv«·3uUÏÅÄ–ơÔăˆŸŸ¸Ă‡Œ9¥‡̀¬H·‡‘×8çÛ«‚ ½9ù¿ÑÓ½¾Û«‚ ½9¡Û߈߈Úª‚ +¼9í—G«ºר«»»\ÑØ÷Áá=ÅØĂ«›—»âà߈×đơÔ©‡¥2ßëM™‰kß [ïSăà·‡‘×8çăˆŸ;ƒˆ›¾ƒv9¥‡߈‚v«‡“Íj°¿Á¹§ØéJé‰Ó5“gesÁÅÏŰ»½§¹—¶›¾Ơÿ¯¶9¥‡÷ä5̉ƒ”ä̉ëöëö½€ÂÙ½ïçÛ«‚ ½9ÛׯÛỞ±»ï»ÙÅëûđ‰ÛăˆŸ«Ôƒ́ëÓ¯ÈÛ«‚ ½9­ÖƒÙÚă“Û‡Œ£ǾÁÍÇÁƯщÛ×ëÓ¸Ú߈°»̀½ƒv·vĂ¼¡Èƒß„Ù½½©ÜÁ½ß»ûÓ.‹ÇY±»ß»ûùơѨÿÚí‡÷rö“ÈËÇ£äơÄ«‡“Íj·ÔåĂŽ½̃ˆ«‡“ÍjµaûßÅô™‰kß [ïSå¼ ÑÄëöå̉ îÅÿ¯¶Û«‚ ½9öÛ«‚ ½9÷ÁÏÔÛ«‚ ½9ăˆŸ;§ÔñÔµ†—¶™‰kß [ïS¥ÄÓÙ§ÀØăà•Ư9¥‡×—¿é‡—։ߙ‰kß [ïSù×9¥‡×“¹ƯN¿¹©Ø¹½ñÚ߈»‡™Ó™‰kß [ïS‘eÅØù׋Ùơê³ÇëÓÏÅß„ó¶ÿ¯¶¦Øé‰ñ5ñ·ƒv߈Û«‚ ½9ơ»‘é•™‰kß [ïS9¥‡Ûº¼±»ơÅĂèá¾9¥‡ñÓù×£äñ̉ĂË6ÑÓƠXù×ÁƯëöÛ«‚ ½9·«d·‡‘×8çơƠñ׫‡“ÍjÛ«‚ ½9Û«‚ ½9ÅÓó#ƒvçăˆŸ;ơêºØÛÉóÊĂôÈ̉ÏßơêßƯÔơµÜ°¿–¶ù×9¥‡«‡“Íjé¾—¶’Ç™ÓÛ«‚ ½9‚ÍÓ߈ó›¾Ă¼±»«»ß»ûר™ëéåƒØăˆŸ;‡Œ½ôÚוÏÄŸÅ߈ùט‡‹Çé%—ÖăˆŸ;ÿÚÑÅ“Ơ©Ó™‰kß [ïS¹ÚÖĂăˆŸƒ¾‘›‰Ñ,ƒ«‡“ÍjăˆŸ;k•Œï»¯Ó¼ù®±»Üñ¡Û›¶é¡Á¿‰±»‡ÛƒvÎ +Ù€Áù×ù×߈Ž×›¶é©Óùê±»ëöĂĂ÷‡ª‡’̀j½Ô›¡÷Á¯ÈéÔÿ¯¶ŒuĂÙ½éơêÛ×Ù½¡ÁăµØñ×¾‡ŒÙ½öÁÁ¾éêƠÄÛ«‚ ½9ưÀñÆívăù×½¯â´Á½çÚùê¿¿”öÏ̉™ëéåÛÓ›¶éÑÄë³ØƠ¾GñÚÏ̉™‰kß [ïSÑ·ùơ§Ó™‰kß [ïSƯÓ ß»ûÄÓùêưÀ×½ô«ÔÙ½ŸÈ»½…Û¹Ú˜‰ +j +̃ + + + +Z +îS +ÅØ¿‰߈ƯÚÛת‡’̀jæê[ô°»±»߈ÎÅ÷ÁÄ›¾—¾±»ù×ÊÇƯ%Åô«‡“Íj«ÔÁĂ¿‰ơ*Ơ߈ö«‡“ÍjçÚ¥ÆÁ‡é/×:À½¼Û«‚ ½9¹ÚÁ̉ù×Îơ.‡·‡‘×8罇åÍÄơ¾ƠͽùêỔÍÓ˜‰j̃ZîS̃»ú߈߈ù×âÂ3Û«‚ ½9¹ÚưÀ›·Ô»Ù½ƒvÏÅ›Ă›ÚƒÍĂ¡Á¿ÅÅ–ÏÔ•Œ›¶é°»ƒˆ¬ÖĂñƇŒñíÈ¿ç˜ơ˜‡ëöƒÚúĐÓÁÏŘÁ™‰kß [ïS©ăˆŸùêơ‡‡x©ˆµØ°»ÿÚ˜‰j̃ZîSăî°¿ºưÀ¶ỖŒÚ, ÁÏ̉™‡ß»ûù×Çǫ‡“Íj©&«‡“Íj‰É‚Öƒˆ‚vŸ?9¥‡Å«‡“Íj™Ô߈ø×«ÔăˆŸ;™‰kß [ïSܷȃƒv¶ôƒv›¹¦¹ÎÅưÀ9¥‡ÏÅăˆŸ;‡щ½½™‰kß [ïS£äËđóÔñÁÏÅÇØêöŸÅå̉ óÜ…Ö™‰kß [ïSË̉罃ÖÛ«‚ ½9é‡Ù½Ù½ƒÖ·‡‘×8çØÏ±”߈‹È¹Ú̃£ÇëöëØ‰¿IÙڢ䳺óå̉ µ‡Ú刺›çôá ¡ÁĂƠ·‡‘×8çÓ¼¼óǺă¼̀ĂÁƯ߈×Ó¿‰éêÅØ½€å̉ ËÇù×ÁĂËÉ9̃Ôù×ơêßÏíê±»©Ó­Øơꙉkß [ïSá꫇“Íj́vó‹©Ó뺇Œ‡Œ¡ÈÿÚψ©‡¥2ßëM«‡“ÍjưÀ“ÈËÉ9ÍäÓº§ºµØơê‡ÙÚ›¶é«d…aÏ̉±»ÿÛĂÈÑĂ‚½±»µØ¥ØÙ×›¶é́ơïñưÀÑÓß»ûÁĂö«ÚÛ×Á¾®¼Û«‚ ½9“Ó›Úï½Ù½¡ÔỞ±»¦ÓăˆŸ;Û«‚ ½9åĂ«‡“Íj9¥‡÷‡÷ˆÙÓä̉ƒÚ·Ôù×ĂÙßÄÙ±¿›¶é‡Ç›¹ƒv·‡‘×8çÅÓĂËÉ9ཧө¼ºÅ«·3uUÏ̉«»9¥‡ÑÓ¹à¡ÈÅÓ«â³ăˆŸ•ŒÇÖ±»߈ëöóÂư“·‡‘×8ç³É—Úؽ߈ñÓ±»é‰ñ5ñ·÷‡ÑÓëö‡ºóÄ«‡“Íjçáå̉ ăˆŸ;Û«‚ ½9‡Œ‚v½̃ˆå̉ ƯÓ ăÏÔµØÇÖÿÚùדƠÙ̉¸Ú™‰kß [ïSËÉ9ÏŃÖăˆŸ÷å5Ó߈«·3uUăˆŸ¡Ô¹Ú¶èÛ߈µÈù¿¸Úëöăơ8¤‡‡ŽÜ§È¯Ô×ÜßÖר™‡¢ÇßÚ«Ô«‡“Íj߈™‰kß [ïSóÂÿ¾áƠ½½ƒ¾‘Û«‚ ½9ñÖÿÚŸè½€Ÿ»Ûˆ÷˜‰j̃ZîS™‡¡%›—ƒv¯ƠăˆŸ½ñ•Óß»ûÏÔôǾדÛ«‚ ½9ׯưÀ£ä¸àIƒ¾‘Úª‚ +¼9Û«‚ ½9ưÀƯÿ¹Ú™‰kß [ïS‹Ü¡È™Ó‡ÚÀ‡€è/Ö:à ›¾³ÜëöăơÔX߈¿‰ûƯè‡9¥‡Ë±ß›¶éçÔ¡߈™‰kß [ïS¯¾©Ü½ê¼щơêî»÷‡«Ô™ëéå߈ƠËÇÙŒë*«å‡ÏÔÏÔÍÄơÔ™Ó߈ÿ¯¶™‰kß [ïS³›¾­Ä‹Ü«‡“ÍjÛ«‚ ½9™‰kß [ïS׌•½Ö$«·3uU߈ÁÙăˆŸ;Úª‚ +¼9ªÚ§Ô¢ô˜‰j̃ZîS¹ÚÛ«‚ ½9«»«‡“ÍjÛ«‚ ½9«‡“Íj½€¶º¥Ư±‡§ô§Ô±»ưÚƒĂéÙÍƠÁ¹±¿Ǽ߈“ƠăˆŸ;k‹Ü±»•™‰kß [ïSÍÓ±»ºăà™‰kß [ïSؽöù׸ÁÍÓ—»ɇỞ§Ổ̉ ÍË)éÛ9¥ßÄÙ¹ÚăˆŸÏÅ߈éÚǼëöχñÓÛ«‚ ½9“È©ơÏÔÛ«‚ ½9éÓÏÔ›¶é߈ăˆŸ;±¿ƒàÑĂÍƠ§Ôơê‡ÚçÇù×ăˆŸ;Ùܱ»̉ØŸÅ÷ÚỔ¿™‰kß [ïSù×ăˆŸÛ×ăˆŸ;ÏÅçÚ¡ÔÍË)éÛ9¥ĂÙḉv…»±½»½ëöƯơ¡ÈÛ«‚ ½9¾º€½¿ô™Ó¾½ ßÁÿ¯¶Á̉ÇÓÔơÂçôѯÏÔĂº³ôçºÏ̉ѓ۫‚ ½9ÛƯÙ½çÚƒ¶ÔÅ߆½ëöÏÅ®GøµØ¹Áö½¿¹ÇÛ‡“½€½Ï̉Á¼ĺÑ·ÂÉ̉Å›¶éáêç"œĂÛº‰ÛâˆĂ·̣щÛºщ8¤‡×ÿ¯¶é¼‚v½Øù׫‡“ÍjËÇÛÇĂÙ½·Ôù×±»«‡“Íjùê†aÅÓ™‰kß [ïS₫‡‡ÇöÙÚÍÓº(½™Á“ƠÙÚÍÓ¦ßÛ«‚ ½9ö›Ú¾°»9¥‡§ÆÇĂ•Ü½€½Ô§Ô±»¾¹Ú£»Û×ɇ³À‡€è/Ö:¡̀₫ ®¶ Ï̉ƯºµƠăˆŸ;ó¶·ÔƒvÏ|¯È½€ß“Û§ÓË%™‰kß [ïS™‡·Ó ¥0̀Ê)èÛ8¤±ÈñỤ́‡ؽÏżרÑŃv—¶Û«‚ ½9ßÄÙ‰¿I˜ºÙ½đ½é‡™‰kß [ïSº-¯×ÏÅÛÀ߈Ç»¯™Ù½§Ó®GøÛ«‚ ½9ǽ¹Ú¼™¯Ó߈ËÓ±%ƒvçÚÏÔ¾ÍĂǺ₫ÇÁÓăˆŸ¡qÂÙ…©Ó·‡‘×8çăˆŸ;áĂô±»ơꇌâ¼ăàéß™ëéåçÚÅÓ©Óó‹Ç½€ÏÔ‰¿I÷Á»·ÔÓØÏÅå̉ ïŸăˆŸ;Û«‚ ½9߈…£­óÇë¼Û«‚ ½9½®¾Úª‚ +¼9›¨Ë¿đÊÖ•Ç…ƠÍÓж½ÏÅø·́í¥ÛÚª‚ +¼9ÁƯăê¹Úß»û÷ÔåçÔÁƯÛ«‚ ½9ăˆŸ;k™×Ù×ËÓĂº©Ơù×Ï|ù×ÏÅø×Û«‚ ½9ï»°»©‡¥2ßëM¿ßëØ±Áơê›¶éóDZ»Ó‘Ù½Úº8¤‡ăˆŸ§ÔÏ}Ï̉ăˆŸơĂψ½ëöÇ’©‡¥2ßëM₫®¶ÁƯŸ}ơêÑÓă÷åÁ‹ÜÛ«‚ ½9›‡ăˆŸ;Ï•×ÿ¯¶ÿÛ£ä߈ăˆŸ;ͼÙ¾ơêï½ûÓ©‡¥2ßëMׯÛ«‚ ½9­ÄăˆŸ;Ú×ăàù×ר‡Ç÷Ú·Åđëö¶¯öƒØ§Ô“Ơºö‡Œ°»Û«‚ ½9ưÀ±»ÏÄø×½ØÛƃ½©‡¥2ßëM­ÄÙÜ™‰kß [ïS¾Ơ›¶é±»›¥×ĂÙÚµÈÙÚ¾›¹½Ô±»“ºÓº—¾ßĂ ±”Û׫Ô߈ơêù×ô«‡“ÍjĂôöÁ +ó¶¡ßïÚăˆŸ;™‰kß [ïSŸÅ÷ÚÏÔƒvăÓØ×Ăëö߈ÅÔƠć󫇓Íjù×ÿ¯¶›¾»ĂÅØÙÚ±¿éÔ߈ß»û¬Å9¥‡đÓ¡Û Ơƒ½щ«‡“Íj Á÷Á¹Úϼ‚v̀ÓͼµØÛÀ¿ôÿÚñÓÇ"Ơ•×¥ˆ]1ÁÛ߈߈Ơ߈³Èëö³à™Ó°»¿ÚÁñ¡ÔçÚå̉ «dÏ̉ơêưÀĂÙŸØăˆŸ;±»ƯưÿÚ›vßùêï»ϹÇÖƒÖí‡ù×ÎÅ“¹ƯNÙƠơêÎ̉ÇÏÿÔÇ»9¥‡I¹ÚæÇµ…™‰kß [ïS«‡“Íjï½ö÷Á ËûÅØ¯G‹ø‹ÇÀĂ½üÆÏÅǽ̃ˆ«¦I¡ÙưÀ¾ß»‹× ›%‰¾߈ÙڵؓƕŒÙ×Åÿ­çÚăˆŸ;•Ù߈ÈÖ÷ÁăˆŸ;ƒÚ½€‡Œ«d™‰kß [ïSׯÙ̉ĂÙ߈Ăºå½ƒØÏ̉×Y«Ỗˆ±ù9¥‡Üù×½›ÑÓ‚ƒívëö́º Û«‚ ½9‡ŒÏÅ8¤‡ÖÏÅÓØî²2µØƒÚ–¦̀»ưÀëÓ­åǹ«·3uUñÚ₫ÍË)éÛ9¥ßÑăơööå̉ ëÖÿ¯¶ÍÄÛ«‚ ½9«‡“ÍjG½¹‚ÖÓÓ±»Ù½ơêÏÔ«·3uUÏÔ÷ÁăˆŸ«‡“ÍjÅØÓ̉¥ˆ]1©í¿º±»ÅØỞÚª‚ +¼9̃Ûï»ÏÅÑÄë¿»°»·‡‘×8ç¿ÅÁĂ߈„’ÆƠËÉ9™×™‰kß [ïSχ߈Û«‚ ½9¹ÚåôĂÙ­¿›Ô¯›¾Ư‡«·3uU™‰kß [ïS“ÆơèÅăˆŸù×ƠXº²%ßÁ߈ù×ÿÚL£Ç¹̃¾ƺÏÓØ9¥‡ñ×߈¾ù×Ö¿»™‰kß [ïSŸßï½»ÁŒÎ»—»ó™‰kß [ïSƒ¾‘±»¡úơÄử™‡ăº·Å£áÛ«‚ ½9ÑÓí‡߈Û«‚ ½9ÏÔ¹Ú—»‡ŒÔºlÀ‡€è/Ö:Ă9¥‡ăˆŸ…ôG½¹¹óĂ¼Ï̉³·‡‘×8ç—Œ±”™‰kß [ïSív÷ˆ«Ô¥ˆ]1ÎƠăˆŸ;«‡“Íjá ¡Ç·‡‘×8çÁ¹±»«‡“ÍjÛ«‚ ½9Û«‚ ½9Û«‚ ½9̃ÄØµØÑÄëá µØ¹ÚÑÄëÂÈ­Ä߈½ÙR§ÓÛ«‚ ½9§ÆưÓ×¾éÓÙ½ăˆŸ¬Ö)ÑØ¡ÔÛ«‚ ½9Û×¹ÚßÅÚÀ߈óĂÄӒȋ۽€ÀĂïƠÙ¥ù×Û«‚ ½9–óơĂ«‡“ÍjăÁ˜‡gÿÚ±»½¡ÇăˆŸ‰¿I»Á«·3uUÏÔ¡™‡ëÙ×ÑÓ—»ëöÛÀ±»á ¿ßƯÓ çÚ±!·‡‘×8çƒvÏÔÿ¯¶¤Ø±»µaôĂÔÙ½ƒ´ÑØÛ«‚ ½9µØ¹ÁÇâ§ÔÍË)éÛ9¥ƒv©‡¥2ßëMôÁ½ÛÄÓ«‡“Íj“È÷ơù×ù¿«‡“Íj“µØÙړƵ†íÖÓÔ±¿ÏÔ«d±»¯ÈÏÔæƠ°¿»ˆĂÈÙÄăˆŸ;ßÚ÷‡%±»³Â™ØÛ«‚ ½9G½¹ÙÅë±»ÇÖí–GÙ̉±»÷‡Ù½ÁƯ•ëöܺ™Áź³ÙÚù×ÏÅ™‡ß»ûơÄÿ§Đ߈×Ă«‡“Íj—»ÏÔß„ù×çÚ ËûơêÅØĂÏĨÓÿ¯¶ÇÖËÇö«·3uU9¥‡ưа»ÏÔ‚¹ÁÉƯ8¤‡ÖơÄÛ×ƠÏÔ߈ÏÅÆÑÄë›¾ÅØĂÙÜ…Ơ“Û÷Ù½ÔÿÚؽ§ÔÁƯƠ™‰kß [ïS±»¡h»Å™‡›¾ơÔăˆŸ;߈£ä·Ô«‡“Íj‡Ú‚Ǽ߈‡ÛƯÂÑÛY³¾Ç̉à=ƒơ‚±»öÅØ¹ÚÇ̉ÎÅ•Ç÷‡ĂÙ™Á‹ÈéêŽóÓơÔ¢ÇßÁÓે“ÍjưÁç¼»æÇ ăÇí£»«‡“Íj“ºœÛ âơÑÄëĂº‹$̣߈ơÄǺơÔô»ĂƠ—ÇÖÏÔǻŋÙăÁ¿Ø›¶éƒˆƒvÁ¼Ž„Ö›ÚÛ׫ћ¾ƠÙŒë*«±»™Á“¹ƯNéêó§Ô½€™‰kß [ïS¡ÔƒvÛ«‚ ½9¿‰¯lµØơºĂ±»Íı»©‡¥2ßëM—Ó½Ôщ«·3uU˜Áƒù¿ø×ñ!̀Ê)èÛ8¤ÅØéÑÿÂɇ¤ˆ\0™Á¾º­ô¤Çÿ™¼ï½Á·‡‘×8ç¦gµØÑӡȼ€º‘®½ô„‡™‰kß [ïSǼ©½€ƒvö¶±»™‰kß [ïS›¾ëö¹Ú¾ƒˆ±»›¶é—»ù×íÆ™ÓÿÚ½ô‡Œöƒv™‰kß [ïSÁƯơ꣌ÖÔ†6¦jöÁ†(ψÏÅÔX² ­Ä9¥‡µØø“ƠÙ½­ƒvÁ̉÷Á‘²±»ỞÏÅ¿àÏÔ“Ơ°»ưÀ«‡“Íj¾ÅÓŸàŸåö‹Ûù‡Á‡é/×:©ÓƯƒˆ§ÛÏÔéºùפˆ\0ŸÈáê…»»Å÷Úù×ä̉«‡“Íj«‡“ÍjÑÓÏ̉ÑÄ뛾…Ø·Ó ¥0Û«‚ ½9í—GÆØ¹Ú·Øí‡ñÓ«‡“ÍjÏÅ«‡“Íj™Áÿ¯¶«‡“ÍjÑÓôêÎÔ›¾‡Œ«‡“ÍjÅØÙÚƒÔ™‰kß [ïSô™‰kß [ïSsívÙ×ÀĂö¿́Ùß«ÓYívÛ«‚ ½9±»ÏÅÓÅ—¶ÑÓ½—ˆ×*Ù-›¶éưÚÛ«‚ ½9±½×¾ơèÅưÀ˜Á½ƒˆ¨¾߈ÛóÙ½щ™‰kß [ïSÏÅ₫®¶éÁ¶ƯÓ ­Ä™‰kß [ïSs×¾½Ôù×¹Ú¼ óÔ¿(‰ÔÛ«‚ ½9ỬÅÓ›ơׯí‡Ï̉ĂĂ ›­±àéM9¥‡›¹ŽÂÙ÷‡ù×ÂÙÁ½›v™‰kß [ïS—»©ÓßÄÙù×°»÷‡Ăô®¼§Óơê¡Û°»›;ĂÙÍ…Ù½ơèÅËÉ9˜‡ëÓÛ«‚ ½9ÙÚå×ÏÔ‹ƒv₫®¶ø×«·3uU‡x¿º¨¼·‹Óº߈‚ˆ³àñÓ£ØÓÅß•µØëÔØ×ùêÓØ±»’Ơ߈‡‰yưÀµØüÅ™‰kß [ïSÙ½±»™‰kß [ïSÙ½³ÂĂÙÏÔ‹Ç÷Úù×áˆÁ0qå̉ ÉֶµØĂÙ½gÑæ³(ôùê󫇓Íj›¾ÂƠÛº™‰kß [ïS‘ƛڃ½ÿÚÁ˜êèäăàëö̉Æàê¡»Ở‚vÚù›ù×ÏÔô¿¾ƒ†óÄÁƯ‡Œ©‡¥2ßëM£»™‰kß [ïSÍĂ™‰kß [ïSƒÖ°»ɱçÚøê"ï»ơê±»³zƠ§#»±»§Ô¾Û«‚ ½9÷Úùơ°Û«‚ ½9ùø·‡‘×8纑®Û«‚ ½9ùצȸڋܹïÛ«‚ ½9ăê¡ÛñÓÙöăˆŸ¡ÔƒvëöÏÅĂÈơºÛ«‚ ½9ÍĂ¹Ú³ºóóÍË)éÛ9¥·Ô»ôÚ×Á­.9¥‡×ÀĂ›¹ĂÙ«‡“Íj«‡“ÍjÓ׉đ¿ß½ßÚÓº¥ˆ]1°»ÑÓ¡Ç󓼡«³Øº¨Ç¨,²ÆăˆŸ;ïÅ©‡¥2ßëMÛºÇĂ½™‰kß [ïSªÚ©¼¥ØÀ +ưÀẳÅÔùê‚VéÚù×Û«‚ ½9µÀăơđ»ÏÔƒvăˆŸªĐ½€ù¾ù×ñÓÛדƠ»&ƒˆ́Áƒv—»¯¾óμ µØ«‡“Íjù×—Óíví=Ư%ëö«âÛ«‚ ½9ψ…öü¦†…‚ڵØç»…%©Çׇ½7ĂÈÏÅ™‰kß [ïSŒÓ·Ó ¥0ăˆŸ;êÓ½«»¶«Ô™‰kß [ïSùêÏÔ±»ù¿ăˆŸÀ¹â¼«‡“Íj¤%«»«Ô¿ßÅØ¡ÏÔÛ«‚ ½9™‰kß [ïS©¼ïºƒ¾‘«‡“Íj‹ÛØÇçáê…Ø‹ÇÛ«‚ ½9°»Ï̉רăơ•ŒÿÚỞ½ÿÛßÖï½Óű»Û¹«Ó·ÔÖ¾‹Ü™‰kß [ïSᬖ¾é¡ù×Ù̀Óº‡º¡È±»÷ÁÏ̉Ç™ëéå•×8¤‡ÁùÙÚ±»ûØ­¾ăˆŸ;kùשӯÓăˆŸÿÚ·‡‘×8çÀô +«‡“Íjơèž«»¹ÚÇÖ˜‡ Á‡é/×:¥Ó«iÿ§ÛôưÀ£ØåĂ™‡›¹“ÈơêÙ½€1Ë̉©‡¥2ßëMù×ÏÔÏÅëöªĐ¶Ô±»‚¾  ƒóÇÏÄ©ó£qî·‡‘×8罃vƠ¡ÔĂÙ₫Ú̀Ç­åÁĂ·‡‘×8ç¡È‰¿I¡Ç¬ÄºׯơèÅ˹ƒv8¤‡ÖºăàÜ÷ÁÍĂóÔù×çÚƒv‹ÜŸƠ¾ëö¥ØÅØÏÔÙÚí|ñÓÙ½Á½¶¦D) )¶Åâˆ;Û€¹ñƒ°»ñÆëöÙ½ º9¥‡ÉØĂ¼ưÀ‹Ù؃§ôÁ±»ÙÓ½ô±»ÏÔĐÅĂÙ‡xÅØ“ÆØësÏÔÏÅÁÖĂưÀ¯×ÙŒë*«ƠăơËÔ™‰kß [ïS½ơê«ÓÏÔÛ×™‰kß [ïS‘ÔơÔå̉ ÷ÚăˆŸ;kơê—¶ùןÖ9¥‡Œ½ÏÔÍẠ̈¡ÛËÉ9Âè±»“Ơ9¥‡£Ø«ÔÏÔ™‰kß [ïSˆÙÜ…ØÅÔ¹·ØëöÏÔ¿Å¡Ơ˜êèäƯºóÔ©ÇăˆŸ;Ѷ«‡“Íj¡ÈÛ̃öÁó#…¾­‹¾—Ó±»ưÀôê‹ÓœĂù×ù¿ÙŒë*«ÏÅÙ½ăˆŸ•Œ­Ä߈Û«‚ ½9Ç̉Û«‚ ½9ùë³ăˆŸ;çÚº‹Üô‰ÔàêóÇÑæ—»7ë±»߈™‰kß [ïSµ™Ô¡Ô‡x©Óâˆ:‡x È»½©Ü“ƾÏÔÛÙÚôêơêØŒê*ªƒˆÛ«‚ ½9ƒ½±»íØù×ÙŒë*«ÙÚ¿ôù×½ô¬ØÙ½ƒˆ·ÔƒÖ±»©Àú(ÿ$ẲÍƠăˆŸ›¾‡£̃ˆÓØöơá³_½Ô½Û«‚ ½9™‡›¾£»º‘±º©Ó°»Ï̉›¶éÛ_ÆÛ«‚ ½9ù×ÅÓ­ÖÛ«‚ ½9ÏÔëö߈é£ÜöÏÔ‚ƠXăˆŸ©ØơÔ•Üëö߈߈₫®¶™ëéåµØÇ™‰kß [ïSÅ—¿‰µØÁ‡º©‡¥2ßëMôƒvÆ·̣½­ÖÙÚĂº³(—¶¡ÁÙÚ­¤ƒ¥ˆ]1¼÷ÚƠÛÄÓ™‡‡Ú8'¤‡'ַŇxÚª‚ +¼9îŽôö‡ñ5«·3uUÛ«‚ ½9©Ó±»ÏÅÙ̉‹ÇÁÚỞµ†ëöăˆŸ@ÿÛăˆŸÎÅ8¤‡×‡Û ÁÛ«‚ ½9ơÔÏÔỞơêàØĂÓ9¥‡›¾óÂ߈ƒv¢ä ¹ÚöÏÅ«Ô÷ˆÚª‡’̀jƒÖÓÅᬺÁ¿½·Ø·ôÓÅ«ÓçÚăàµĂÍB‹ÇÁ½ÑÄëívÅÄáêÈ¿‰Û«‚ ½9ˆÛ«‚ ½9χăˆŸÑĂêÚ­÷ˆª‡’̀jçíÛº˜êèäÛׯȋӂvÎÚăˆŸ»‹™‡³Ơ ËûÇÖá=Óµ­˜½ÜÏÅá ÇØÔ‡Œ™‡Ù×›ÚƠ‡º«‡“Íj½±»¡ÁÙ½Ÿ\±¿´À½̃‡™­ÄŸ\Ư½º³zơÔ¬¾Û«‚ ½9ÄÔßÄÙù×…Û߈‚¾½–ÛÙ½½€Y§Æ“ۃ׋ÜưÀöÏÔÁ½ăˆŸ;ï½Û«‚ ½9ñÆíJ—¶Æ´†÷Ú°»ăÇí¡Ôß»û«»ăˆŸ;µê9¥‡ͽª‡’̀jÁƯÙ½߈Ǿר߈§Æö¼Ô§ÔÛô­Ä¹Ú9¥‡¼çÚ¶ÔËÓ›¶éÏÅỞÛ×±»ÍË)éÛ9¥¿™‰kß [ïSµØăˆŸ;ØŒê*ªÅؽôçƯơêg¾Ë¿à ‹Ù¹ÚößÄÙăê‹ÇÄÔÀ¹gï½™Ô½ÖƠÅØÏ̉±»ăÚ½€™‰kß [ïSÇ»•ǧӽřôµØËÉ9©ƠÁ|ÇØƒvµØÑÓÓºøê߈¿́ƒvơUÛ«‚ ½9ø¿‡™‰kß [ïS¯¼˹̀Ê)èÛ8¤Ù½½·Ô¯È߈¬Èù꛾½§Ó±ëØ߈º˜‰j̃ZîS¿‡Û«‚ ½9ù×Ù½ÖÆ¨¼ ăˆŸ;™wßÚ¹ÚÄô˾©‡¥2ßëM«‡“ÍjöÁ̀Ó™‡Ø×‚½‡xÙÚ¼Øíù׫ÔùêÛ«‚ ½9«‡“Íjđö‘¯ÛÙÚñÚàƠ…»íÆ©ÜÇܹȸÚË¿ívù×ĂĂÛ«‚ ½9™‰kß [ïSĂÙ½ØíÚÙ½½¡»Û׋DZÁ·‡‘×8界«&ëöá ߈º±¿ù×ăˆŸ;k±”ÅỨvÚª‚ +¼9߈ÏÔ‡º÷Á›¾«‡“ÍjơèÅđ +ĐÿÏÔ¡ÔâˆĂÙùêׯÏÅơ=·ÔăˆŸ;ùêöÚ÷Á‡½ù×›¾Ă¼§Ó™‰kß [ïSăˆŸăˆŸÛÄÓáđ§Æ‡Ûú(ơêửô¶‹b£‡ù×ư[ăˆŸ;ÓÊÍÓù×ÑÓ•½©ÓëöΈŸÅËÉ9Û«‚ ½9™À½ăˆŸ;k©Ç߈ÁƯËƠ˜‰j̃ZîS¯¼߈«d¾ăˆŸ;ëö«Ú½ÓÔÛ«‚ ½9ưÀăˆŸ·‡‘×8çÏÔñӆNjÇỞ­•·Åô«‡“ÍjÛ«‚ ½9ëöƒv‘«™‡ơŸ‹ÇgËÉ9½ô½Ô¿‰ÍÄÿ²½ăˆŸ;åô¿àщ«‡“Íj‘gÿÚ®¾@ơêÙ½«‡“Íj½ÅØÅ€º°»ÎÁƯÍÄÄô Ÿ}ö•ƒĐÓÑÄëơħéÚ™‰kß [ïSÛ«‚ ½9ơÄơ$߈EóÇ·Åù×Åà»ÅÁÓƠ%÷̃µ†öƒvÖ¾ù׉¿Iơï–ˆ±»ÓØ׆‚¾±ëص.¥ÙßÁăˆŸ;kÍÓăˆŸßÖÛÀ³Øƒ½ơú°»Ó½ÿ§Æ%ç½§Ô½€ẩ9¥‡¹à°»‹Ç°»•¿ôÁ¼í걿ùןÖƠÿÚÖ$±½ÙY³Ơ¼€ ưÀ÷Á¯È«»Ó̉£Ø½·Ô±»óÄ—Œ߈±¿9¥‡µØÅÁ±»·‰ưÀÿ¯¶9¥‡×₫®¶‡¾Ó̉±»ñÓ‹Ùé‰ñ5ñ·§ÓĂº߈ËÔù×ÍÄ›¹߈ưÀؽĂYÙÚŸẫ»ú…»ÂơÔùê‡Ơ±»ÏÔ¿!áê¿ô½ùÚÑÓËÉ9ÿÚ‡­Â߈¡ÔơêƠ‡9™‰kß [ïSƒvăˆŸ;ËƠ›¾Ù½ш‘ơœÜ‡Œ÷Á½¾ª÷߈ơ꺽 +ưˆ¤È‘ÆÁÓ½£à°¿Ù½Â߈®é÷ˆơÔƒơ÷Á‹È±»÷Á×Ơí‡ëö«·3uUù×¹½ÿÛơêɹÁ̉¥‰ÍL…›ÛǼ«»9¥‡«‡“Íjø¾̉ÁƒvÁ|®Èׯ±»ƒÖƒ½߈½ÛÀ÷‡ÑÓÊƠ¹ÚÙÚ¸±»½¿‰ù×ÙÚ“Ơ、ă‡ß„ÁƯăཀྵ‡¥2ßëM½‡ÇÛÈ¿»“È«dƒ—¹Ú©ˆ¯Û­ôÿ¯¶÷ÁơèÅ©‡¥2ßëMÙÛÏÔ·º©‡¥2ßëMîƠ•§Ô½ÏÔƒvƯñÖ±»ï»Û«‚ ½9ƒÖ™‰kß [ïS­Ö¥ˆ]1í½Ư‰ÁƯÛÄÓÍÓ߈½ÁƯ«‡“Íj₫®¶º±ô±»߈Ăè‡Ú­ÔéßÍăˆŸÏÔŽö$ªÔŸ\·‡‘×8çソ»±»«‡“Íj•Ú‰¿I½€Û«‚ ½9…Ơ‹ÜñÓñ¼±»ƒØ½Ơ•Œù×Û«‚ ½9ÙƠ‚Œ¾ơÆöÁ™ÔĂÈß„±»—¾¿ôù×±»åĂÁÀ¼ ÏÅ™ëö¢äÑÄë¼Ô¨Ó®ÓÁƯï»…ÛăÁ¡ØâêÍәʱ¿åĂÁ³§Ó¼±»2Ơ§È›¾¾¡Ơ›uÂè÷Ú‘÷Ï̉ÁƯßÂ9¥‡×Ûº³‹ÓºëöăêĂÙ¬¾»̉ÿ¯¶¥ˆ]1µ†¯‰¯0«‡“ÍjƒvÙ©߈߈åƠŸœ̣Ô¡Ç›ÙÚ«‡“Íj‚váØ™‡·ÔÑÓÏÔÛ«‚ ½9¿Ôëö©‡¥2ßëMÈĂ»̀öơÔßÁÙ½±¿ƒvÙÚ«·3uU߈¸Ú‡ºñÖơñ»ĂĂĂ¿$ÁƯÏÔ–¶ơĂ¡ÁăˆŸ߈™‰kß [ïSÑÓŒÅÙÚרĂÙ±¿ù×ÏÔö¡ëÙ½ơÔ©‡¥2ßëM•Œ±»8¤‡«ÔçÚ‡ÂĂ ߈ëöœÂơêăˆŸ;߈ÖØ¼·‹¹Ú«‡“Íj¹Ú¡¾Ï̉íÚ±ëØ½9¥‡ùæƒvơêÍ噇̀Ê)èÛ8¤¥ÆÑÅÿÚ›¶éÇÓƠ¡È· ÜÔºlÛ«‚ ½9‹ÇÍĂư“9¥‡ÀĂ…Ÿ“Æù׺¹Ú²’È ï½ËÉ9Ûå̉ ¿ÅüÀĐÄ ê ơêÄÓơê߈¿»›»²ØăˆŸ;k»½†“ăˆŸÏÔÛ‡ƠÍƠƒˆăÇíù×ÜÂùê₫®¶ëö´†·‡‘×8çÏÄù×Á̉驇¥2ßëM†× Ó…£­ÓºÛ«‚ ½9ăê%Äô«‡“ÍjÏű»̃„O«ÓщÍBù׿‰±»‡ÚíêñÖ»$¿ô›¾ºƒˆ«‡“ÍjµØɇÍƠ‹Óù×›¶é±‡§¹§¹›¾ù×̣¹ăß9¥‡ơêÅØưÀ™‡½±»ƒv»æù×ÆØƒvƯ‰Û«‚ ½9ÏÔ¿‰¯¾±»ƒùêï³2œÁÏÔÏÄ9¥‡‡Ú÷‡öÁÁ½É̉¼Ü—¶˾ƒÖ”ÙÚéêÅơêÇÖơ—ß»ûŸ±Ëӯד̃₫ƒv«»Ù×÷ÁÏÔ»yƒvó¶ƒv™‰kß [ïSË¿êÚ÷Á¹ÚÏÅ߈³(£ÇưÀ™‰kß [ïSÁ$°»ñÖĂÈûØ–¶¡Ơ¡%õØY‘÷Ởª‡’̀j߈ÎÔíÖĂÙ£äå̉ «‡“Íjçǃv­ÔÛ«‚ ½9Ûº«Ô™‰kß [ïSÙÚ°È“Ơ9¥‡×‰¿IơĂ´Ø«‡“Íj™‰kß [ïSׯ¹Ú­ÄăˆŸö§½“Ơư“—¶ÅăˆŸ;ơÔ₫¼ÍƠ½ƒ߈«ÑÅÙù׋ÇăˆŸ;¶ÔăˆŸóÂÛ«‚ ½9ÿÚó+ÉÏÙÚ̃ˆ¡Ô߈ăˆŸ¿ôƠÍË)éÛ9¥ñÁư‡±ù1™‡ưÀÛ«‚ ½9™‰kß [ïSñ~ÑÄë‹ÜĐÄê™é‰ñ5ñ·ÏŪԫâƒÚÛ«‚ ½9˜Á “öÓÅ›¾¹à¾§Ơ®ôđÁ/ơêͼöÁăˆŸĂÙ¦ºƒvÑÓ½´»ØÏÔ‹Çå̉ “Ȱ”‡x߈ÇÖĂ¹èôºÛ³ºóëÓăˆŸ;«·3uUÁăƒvßÁ²ÈÙ½Ûלګ‡“Íjɇ‚ÖÛ«‚ ½9ƒvï½£ ×¾ƒô÷‡ĂרÛ«‚ ½9Û«‚ ½9ƒvÛ«‚ ½9çÚĂÙœ· ̉ ¤0 ăˆŸ;³È™‰kß [ïS¥ÂÏÔƠÁ̉ßÏÅƯ©‡¥2ßëMé꛾«Ú·‡‘×8ç‡ưÁ߈ñ‡¿‰»ÅơèÅÔXăˆŸ;kå̉ ÑÓóÖ߈¹£áóÂù×ƯÚØĂÙÅÓ·ØÆëöƒv³×ÁÇéÓ9¥‡÷Á߈û(˜‡•½ºÅ‡£ä©¼£ÓêöơêÛרÅ꾺¯ÈÙ×û÷ˆ½£ä˜êè亽¥È¯È•÷ơơỒÓñÓÉĂË¿ö‹½ƒÅĈŸ}ùש‡¥2ßëM—¶ö¡è³ßÁ廇““Ơù×µg‹Çăê…Œ˜‰j̃ZîS÷‡åô«‡“ÍjÛÀ±»°»̃ˆŸ°±»ÿ¯¶™‰kß [ïS8¤‡ĂȼÈöÁÇç—»ưÏơñÓĐØËÉ9ÍóÔç«ÔÍć۫‡“Íjƒvö†º“ÓŸèơê±̉±»Ù̉߈G½¹ăˆŸ…̃·‹9¥‡×¿º™‰kß [ïSÍÓ›¾±½¡Ơ³ÈívîD°™ÔŸÅëöô©ÇÑÓ›¾ƒÏ¿°ÔùêẨ“Ơƒ¾‘çƠ¾Gκ…Ô×¾™‰kß [ïSŸ\ÇÙÚ8¤‡ÁÓ½™‰kß [ïSÁÓ½½‡xÛººù×ăˆŸƒvÄÓçÚ›¶é÷Á´ØŸ}­Ä«‡“Íj‡«»¥Ç¥ˆ]1ơÄÏÔׯ™‰kß [ïSùê±»¹Ú½¹Ú½Ă°»¡»»Ø¹Ø…Ö•ÇÏÔ™‰kß [ïSºôê‡xÍÛªÚÏį׹TËƠÏÅ采ƯÖ¾8ÙÚ“¹ÚÏÔ÷Áï»·̣ŒÂÙÏŽ€9¥‡ÚÀ ËûƒvûØöÁÏÄ̃»úÍƠ½¾ïăÇí¡ÔȽ€Û«‚ ½9—Œ9¥‡÷‡ëÓëö9¥‡½€ƠÄßÄÙÇÛívĂÙÍÓ«‡“ÍjËÉ9ÛÄÓăˆŸ;kơêĂƠÀËëÓ°»ư§‡Û«‚ ½9Û÷ÁÏÔÎÄÇÖɇùꔋ=œH=ª¶2tTĐØÛ©Ûº߈µÅ«‡“Íj÷‡«‡“ÍjáêÏÅù×Ͱ»÷ÇÅØ“Û˜‡‰™‰kß [ïS½ôÁ̉ñÆăà“ÙÚóÔ©Ó‰Ô¡Áµa—¶µØ߈ÁƯ‹ÇñÚÏÔ·̃Á¹ź°»߈ù× ÔăˆŸ;kÿ¯¶ÏÚööÁ ±¿¹Úù‡­ÖßÄÙăˆŸ¯Èι‹Çáê‹ÇÍÓ‰½¡Ô˜‡ø×À‚Ö‡Œ­Ö¡ÔÛ«‚ ½9©‡¥2ßëM™Ó«·3uỤÇ™ÔÛ«‚ ½9ëÓéê…۷ű»ù×¹ÚÓ¼ï‰ö½‘—ëÓÉqß¹9¥‡ƒvä̉›Ư¿‰Ï̉߈ù|­€ÏÅ€ˆ½Ù½·º«Ô”è3ÜؽƠÜçÚëÚ¡ÁÏÅÙ½Ï̉”™‡œ́½€—ˆ©ØÅàÍå̃‹Û¥Ø™‰kß [ïSù׃vÏ̉Àù×óÔ–¾“ȷظÚ9¥‡±9¥‡×ÜרÏťș‡μƯÓ 9¥‡×ƠŽ¸Ú á=‹È±»ÏÔ«‡“Íj¶Å±»ÅØƠXơêØ×ÛÄÓÿ§€9¥‡œ¿Óº¥ÆƒvçÚŽÛ×¾›¶é°»±ëØëöă™ëé廇߻û™‰kß [ïSá ù×À‡€è/Ö:«&ùê±»ÏP…Øáê™ëéå÷Áé·₫™ăˆŸ;ùêËÉ9́íÖÿÚùëÅ¡Çщƒ×µØƯâ½ç$‘†“ÿÚÛ«‚ ½9¡Á•ŒäÁÏÔÇâ‡ñ5ùêÍ¡ƠÏԉԾߵa·̣ù׺ÛUÁÙ¡Ô›¾Ù‡Ï9…¾¹Úă‹íå̉ ÏÔăơ—º±»¶ÔăˆŸ;¡Ô©ÇßÚ™‰kß [ïSĂ’¡«ÚỞÁ¼ùףؙԇ—¶ƒvŽ߈߈‚ Û«‚ ½9ÏÔ¹Ú™‰kß [ïSóÂÏÔ˜‰j̃ZîSóөǓȿ)ùו׵y«‡“ÍjÙ½ù×Ï̉¬¾¡Ôÿ¯¶†Œ‡ÇŸ̃É̉ơÔ“Ü÷Á₫™ÔîºçÚé™ͼ߈µØÙÚÄӼؙơ½¶±»Ú× +…ÔÏÔ™‡ÅívóÇÙÚÏÄÿ‡“Ơ¿ôœ‡ÿ¼¹ÚͪÏ̉¥È™Á­ØÂÈÚÀ‰¿I“ܸ׫‡“Íjï»ăˆŸ;ÍÓ­È߈¤ˆ\0ív™‰kß [ïSÓ2§Ó9¥‡ÛÇ“ƠŸƠÔ‡º°½ĂÙăˆŸ;‡ÚÂÙ½€¶ăˆŸ;k½ĂÜŸÿ¯¶ù×ÇÖׯ‡ŒË̉€º߈Ù½ÏÔÛ«‚ ½9ëö¹Ú¿‰&•Œ Ơ½½½«Ó¡Ôé‰ñ5ñ·̣ µ£Ç‡ŒÂèáƠÍÄŸŒÿ¯¶ר¶ô å̉ ³ÙÚ¿Å—¶8¤‡°»ÓÅ9¥‡ÿÆóÏ̉Û«‚ ½9ÿÚ›̀ÁÙÛÀ›¾¥ÖÇ"—»³Â—¶áêG½¹Ù½‰Ûͼ¥ÆÛÄÓ́ÁµØºăˆŸ;kÁ̉ƠÊƠ±»¡ƯåôóÇÑÄë†ÚỞÓØÅÓ§ô˜‰j̃ZîSÓÅ›¾‰¿I‹¾9¥‡áê÷‡߈…ƠóDZ»°»Úª‚ +¼9ƯÚvç̉Ïù×ÇÖŽ9¥‡³”ÙÚôêÏÅăˆŸăˆŸ;ơêœÜ§Ô£ỗ»úäê›¹ăˆŸ¶Å«»ívÍË)éÛ9¥ÚÀÑÓ́ø¹Úƒv«‡“ÍjƒvÏåÍË)éÛ9¥—»YÅÓ½€Û«‚ ½9™ÛµØ€ưÀÔÛ«‚ ½9›¹½£ƯĂÓëö÷Á¥Ûëöù×ù×ÅÔ¿ë˹ÏÔëöçÚéÓ8¤‡Öôê ï³2뫇“Íj́v×̉ñÙÛº¥ˆ]1ëöÑØ½Û«‚ ½9ƒv™‡©ØïÚ9¥‡èêơĂ¹ÚÑÓÛ«‚ ½9—¶Ñؽ߈߈¬Öæ÷4߈öÅÄỞĂÙóĂôÔĂÆĂÙẳ•êöÙ½ùêÁƯÉ̉£XÍÇ•ÓØ±»9¥‡ÿ§¡Ûâˆ:»ØăˆŸ;ñÚ¡Û±»›¾Ư‰ëöë§¡ÁëöÂÚª‚ +¼9ă‚ÛׯÈ₫Ç÷“º‹ÓÅØÍÓïôĂÙ±»»‡Á̉ỞϺưÀñÓ́ô‹ÇÇÖ̃ˆ߈ƒv°È›¾™‰kß [ïSëöÛ«‚ ½9±»Ươù¿ƒv匿N™ÓÿïæôôÄóÇÑÄëĂÙƠµâê»Å¾ÏÔÑÅ¿çêö ™‰kß [ïSø³È߈«‡“Íj›¶é™‡ƠǺ÷ÚÓà·‡‘×8瓺ƠÓ™Ó¯‚ƒÁ “Û¡ÛÏÔ9¥‡å̉ ïÚ«‡“Íj°÷߈ÓÁ¹ÚÛ׫‡“ÍjÛ×Ë÷߈™‰kß [ïSĂ¼ăˆŸ;ÏÅÆ±»éà¹Ú×ÓÍË)éÛ9¥Ù½ñÇ󱿙‰kß [ïS·Đ±»´†¾‰¿I‰¿Iù×ăŸï½âˆ½÷ˆçÚÙ܃vÁ×ÿ¯¶ÙÚ“ºƒ·ÜÛ«‚ ½9ß»û¾8¤‡×®Á߈±»˜‰j̃ZîS÷Ùù¿ÓØƠƒ9¥‡ăˆŸ;£¥§ÓÜ›¾‰‡•‡“Í÷߈™ÁÍ­H̃ˆ»Å¿ØÅÔû¼̃ˆ߈½ÔÛÄÓ½ëö™ëéå«ÔÚÀ£Ø­Ä­Äœ‰¾I·Ô©‡¥2ßëM‡½»Ù›¡½é‡ÛÀëöÛ«‚ ½9ơÄ©¼íØï½ó́ùדƠÉ̉̀Ó ëöĂĂéÚ»ØƠÏÔƒđ×ÚăˆŸÑÓ߈°»ª‡’̀jÁƯ×Úå̃­Ö±»›¾±»Ó´߈÷Ú¹Ú­ÖͼÛÚöĂºív«Ô‡Ï߃ÚöĂó™‰kß [ïSˆöÎÚ›‡ñÓ‡‰Û¡Á«‡“Íjó"ÏԣصØÏß¡%¶y­¾ăˆŸ;›¾ÏÅơÉ™‡ß»ûÛ×½»Á¬Åå̉ ëö³ å̉ ƒ×߈«‡“Íj‹½Û«‚ ½98¤‡ùבÆÙ½®Ơ7̣߈·̃ăơ›ÚжÖ$Û«‚ ½9‹Ç©º›¾Âȱ¿™ô¹ö™ƒ½ÁÓÄÔ½«Ô½¡ÔưÀÚÇăÁÏÔÍË)éÛ9¥è· +‰‘ß»ûºëö纷ř‰kß [ïS©‡¥2ßëMă½Á‡é/×:߈µØ—»ÿ¯¶ËÀÿÚùÍù×ÁĂÄôƠº½­ô™‰kß [ïS8¤‡Û«‚ ½9ÇŒƯÓ £Ç“ÈÑ”‘Æ₫&áƠñÙÙÚù×9¥‡Ñ`ĂÙ¯‰¯0ơêÛΙӫ»µaùײ(ш߈™‰kß [ïSÁ¹ŸÅăàä̉ù×Ù½áÛ½ĂÏÔƒÛ«‚ ½9ÛÄÓÔơÏÔÛ«‚ ½9³zÅÔåÁÙÚ‡ÚÁ âƒvÍË)éÛ9¥ÿ¯¶«»¬¿ +Á̉߈ÖÆ½Ôñp˜È¹gáêÛ×¿à™‡ưÀƠơ߈ù ƒØÑÄë÷Áͼ©Ç±»ÿÏ‹ÇÏÔơ꫇“Íjƒv“Æ«‡“ÍjϼÏ̉–ˆåÁ߈ÿ׳ ùן»Øív½€ºÁßÁơꩼ£ÇƒvÅô›¡ơŇÇÍåăˆŸ;kÛ«‚ ½9‰¿Iåôù׋Ȥ½9Û«‚ ½9ÍƠÛ«‚ ½9³ưÀñôƒvâÁ0¥!³È·Ó ¥0±»ù×Ơ²Ơ¨ÇĂÙívëÔ™‰kß [ïSÍÄơèÅå̉ ‚vóĂƒvîÅ9¥‡×ßÄÙĐÄê«·3uUåĂéºÚôùׇº™‡½ôÙ½Û«‚ ½9ăơÛù×߈ù×µØ߈·‰“Æé‡°»µÈµØù¾Û×—»Ơ£ØƒƯơ‘·ØưÀɇ™à™ơ÷‡óÇëơÉĂÅ‘ÚôưÀ½‡Û©¼µØæÚÏ̉Ă¿Å™ÁÙƠ‹É0›·ÔÛ×§Óö”%ăˆŸ¥Æ¹½™‰kß [ïS—ÖÙ˜‡ÓŹϤ‰̀L„÷ÙíêƠX½°»™ºÓÅå̉ ƒ¸¬ÖÇÖ‰Ûï½»µá ±»—¶ÍÇù×™‡ѧ•ŒÁƯƠÅÙ×ÔïÅíÆÔ±»ăà߈ÖăˆŸ;÷å5Ó·‡‘×8绽÷Á³ºó­Ä¸ÚÁăÁ¥‰ÍL…çÚÛ×¹ÚÛº²Èù“Ơ×ĂăƠ±»߈¿ß°»»Áă®ÇÖш‡£äƒÀăˆŸ;k½ô™‡·‡‘×8ç¹̃ô$ªÚ¸Ú›¾©ØÁ̉ƒvÏÔ™‰kß [ïS¤âËÖÑ`…Ơö™ëéå߈ÏÔÅÔ‡ºÏԵ؂v±‚ú¥‰ÍL…ËDZ»™‰kß [ïS¡Á¦ÈĂ¼¿º߈ºï‡ùæ–¶%߈ÊÇÛǃv߈Ưº£Ø— ïÚÂĂ™‰kß [ïSëÓ߈ù×Åíêëö¿‰ßÄÙÛÀÛ«‚ ½9—¿™‡½±»£ä߈±¿ơÔ÷¼Á¾½˹‹ÇÂÙ¸ÚăˆŸ;ôñÚù×›¾åŒ¿N±»§¹߈÷ơÀ™‰kß [ïSơêÛºăˆŸ;Ư‰ûƠ°½ˆ.ÍÓ ÿÔưÀƒ¾‘èơ±»çôâà9¥‡—ˆƒv߈¸Á˹ËÉ9ゥˆóÂÇÖíơ“ƠËàÿ¯¶ơ»Ú߈µØ©¼ĂÖÿÚùơĂ˯óÑÅÛ«‚ ½9¥Ø¹Ú߈ÏŃvơêµØÅÔ³(âàßƯµØ«‡“ÍjÙÚÏÔĂÙÉÉơÔëÚơÔ—»“ȹ½ö$ÛÄÓ±»ÔÙƠéꟿ½Ë1ß»ûÈ̉ÛÛ×́v ·Ü¹Ú‚vö¡Ô߈çÚ÷ÁáÅưÁôêÿ¯¶ăˆŸ;ƒàß»û™‰kß [ïS°»¿º›¶éßÁơꙉkß [ïS»Åë ÏÔ±»ëö÷ơùê9¥‡¨º™ôĂÙÆ¡ÛôŽ©Ø™‰kß [ïSùê±»ÍÄ߈Ơ«ÔưÀĂÙ߈©ÓäÖù×÷ˆÁ̉ơôËÖÛ«‚ ½9ÅØ¡ÁăĂ3ăˆŸ™‰kß [ïSéưÀË̉·ÔèºR¶°ψÏÅÙ½±Ô¯X¿‰öàµØ×Ă£ ơ‡Úù×Ï̉ÏÄË%©Ó²Ñ؃Úß»û½€߈4Û«‚ ½9ñÖºÅÙÚƒˆ†ÇôÔ½áö«‡“ÍjÂÈ÷‡±»Ù×Å…¯ÇÖÛ«‚ ½9÷‡³ºó󫇓Íj—ˆ¯ÈñÚƒ½ÍB´c­¾ŸƠù׳ÍÄר釃׹ÚшÏ̉ưÀƒ½ëö›¾ï»ºÇĂÇ֭ض&™‰kß [ïSª)µa™Á߈«Ú½Ù×å̉ ĐÅá ˜‰j̃ZîSçÚ±»ÛƹڹÚÊƠ­¾ơꓼđÚ½ÔƠƯÓ ±»™‰kß [ïSơêÛ×÷Ú£äçÚÛºж­Á•ŸÅÑÓëö™‰kß [ïSºØÓ¹Ú÷‡öÿÑơêÓù׉ơ¶ëöñÁ߈™‰kß [ïSăˆŸ;ŪÔ÷‡ƒv߈Ở«‡“Íj¹ÚÓŇÇܽđÔ·Ó ¥0—ŒÓº̃„½ĂĂÙ‰¿I™ëéåăˆŸ;å̉ ¡Ô Ëûëö¡ÔÅÓ‘áëöÛ«‚ ½9ơÔîÚÅô³Ù½ˆđ«»éºÙÜ߈ơÔ׿8ÍĂùÚË̉™‰kß [ïSö½ŒÖáꛡƯº“Ơ‹Üö±»«ÔÅƠáØá=ûÇ Ö é‡¨ØÂĂÍƠ«ÔÚ×ñÄׯóăơêÙ½9¥‡˜‰j̃ZîSưÀ“¹ƯNñÓ߈É€ơꥈ]1…Ö߈„»£ÇµØăˆŸ;«‡“Íj¹Ú©Ó»‹˜‰j̃ZîSưÀ9¥‡×ĂÙÄôĂهׅۧÔù×÷ˆ߈¾ßöÛ«‚ ½9ƯÓ ÅÔ±»ß„Ù»ÇÖ™ô釳ºó™Ó½Ô¿ăàÛº½€ùêƒv÷Úăơ›ËÉ9ù×¾™‰kß [ïS¡ÁăàǽùꃽưÁ£äñÚ§™‰kß [ïS³ Åà¡Ô˜‰j̃ZîSŸ»›·ÔÆ»ÊÓÍË)éÛ9¥ÏhíÖùơ™‡›¶é߈±»ªÚĂÙ¿́÷¼‰ÔâˆçڡȃvÍË)éÛ9¥½ßËÉ9¹•ŵةÓĐÄê°»«Ô³½±ºÅØåĂơꧺ¹ÚĂÙÛLJǃÖʿŻ·ÅôÔ§Ô჈ûóÂÚÀă½™‡߈Àפˆ\0¼»ù×Á½Óº»Øø×ÑÇÓăơç*ÿ¼Û«‚ ½9ÆỞÍË)éÛ9¥߈«ÔùơÍƠé×ÛÔÛ«‚ ½9Úª‚ +¼9½߈ơÄøêơèÅ«‡“Íj9¥‡ăˆŸ±»É̉߈±‡—¶“ƠĐÓæ̉߈ÛÇåÁáꓹƯN¾º˜êèäéÓµ†ăˆŸ;½±»›¶éÏÅÓïºăÚù×₫±»›¶é߈™‰kß [ïSÍƠ¨î·‡‘×8çùơÚÜ™ÓÅnÙƠô¹Ú¯¼ăˆŸ߈Ǽí$ív«‡“Íj߈ơÔø×‡Ó̉Û×ơêÚª‚ +¼9߈󶙨ÿÇ¿º÷ÙÙÚ¿»‘Ɖ¾·‡‘×8çÍóơèÅĂ¼́½¡Û÷‡½£XµØưˆỔá™ộÄö—¶½Ù×¥áÁӣ䵨÷Á¡Û÷ê½ÜÖÆ½Ă™‰kß [ïSゥ‡¥2ßëM«Ô‘B¼¿ßÍÄ™‰kß [ïSÀĂ•îÛ×öÑÓÙÚ±»¦¹½÷Áͽш¿ß°½ƒ½ù×½“Ơÿڵز ăˆŸ•î±»ÍÓ©‡¥2ßëMĂ÷å5ÓÅØ›¾¹ÚçÚµØívĐĂÙŒë*«ëö½ëö”ºÇÖƒ¾‘á ±¿ËÖ9¥‡×ơèÅײĐÅ ¡È¥ÓG½¹ÙÅë¡Á…½º̉«»­È•ÖƠÏÔ¡©ºŽ8¤‡×ưÀ̃ÄØƠŸ}ÛÀ·‡‘×8çö«bÜ«‡“Íjß»û¨¼±»‡¤ơêĂ¼߈ÑÄëĂĂ½Ơ׫ÔÓăˆŸ;Ăñĺèơ›¶é-™‡ƠÏÅÏ̉Ă ½ÏÔåß₫$Û«‚ ½9ñÙ°»ƒÁĂăÛåĂ¿‰÷ˆë˜H‹ÈÙ‡Ï9…çÚƒÖÓ€ù׋ǃṽÖ¾µ‰á ›¶éœÂĂ¼¥Ä¡ÈÿǾßơêăˆŸ;ƒvăơĐÄê™¶¸£ÏÔ9¥‡¯ÓƯºỞëöùêéÓỢ̉á âêɹ» …›¶éÏÔ‡ŒƠÛºÛ«‚ ½9ưÀư‡±ù1ÙÚ©¼ơê½ÅػصظÚÍÛƯÂÙ½ÏÅؽ”ºׯĂÙöÿ×ùêëÓ½ô£ô°½±»«‡“Íj«Ó¼¡ÁÓù×ù×ß»ûåõØÙçºyßÄÙÿ¯¶¾»™‰kß [ïS­€Û×ïÚÅØµÆøê‡Œ«‡“ÍjƒvïƠŧÆÙÚ½Ơ›¾çÚ×Ăù×™‰kß [ïS߈ĂÅ™‰kß [ïS¿‰ăˆŸ;kƠμ¶Ô—¶Û«‚ ½9ÏÔ¿ô˜ô §Ûñ¨‡wÍË)éÛ9¥¯óÂÛ×ôê廳ÈçÚÙÜ߈ûœ±¿™‰kß [ïS¯¾µØù×ÅÓ×¾“ƠăÂÖÆá=„öËƯÚñÏÔ‰¿IG½¹ÑƯ™ÔXÙÚ™‰kß [ïSéÖ½Á¹™»Çơê³ô‰à­v¼‚Øÿ”³È£äÅØĂÙɹѾÑĂ«‡“Íj½•ù×ÏÚª‚ +¼9Û«‚ ½9éºéÚî÷å5Óºyù×·Å̃ˆ‡ºÿÇƠ¡Áöêöͯ¾‹Çå̉ ßÄÙû¹Úíº§ÔÏÅñÚáêÏÅăˆŸ;k±»á ©Ó—¶êö™ÛƠµØÛ«‚ ½9ăˆŸ;k±ëر”Ÿ}‚vψ¹Ú³¡ÛíưÀ»ØíÚ«‡“Íj‹Ü½«‡“Íj8¤‡×ܩӶÜáƠ¡ÛÍB×Ü̃ˆơĂĂÈ›¾ƒÖ±¿‘ÖĂÓºÛºăÁ‡é/×:Áăêö£»«‡“Íjëö»•ŒÛÀăˆŸ;Ù½ưÀÚª‚ +¼9³à¥ºĂÙÛÄÓÛ«‚ ½9ƒ×ɹ߈ï½ÍÓ‰¿Iûá›ÚµÀÏÅ»ˆï¶·ÜçÚ«»߈¼Ô·‡‘×8çÛ«‚ ½9ÿ§á ‡öÁ߈ĂÙ§°µ}íê¾àĂ©¼ƒˆívûÓ«‡“ÍjÙ½³¹ÚÆÅå̉ ÷Áö/ù×ÏÔ÷‡áêçô˜‡¾ÅÄ·Ó ¥0£ ¡Ô³ô§ÔóLJÇÛ׿º±¿Ú×óǸÚÏÅÓÅø¿Ù×Ïű%ÓÔÍƠÇơÔï»ÿÚµåÁăે“ÍjØ×µØ‡ºåö9¥‡×ĂĂ ›­±àéM¥áÄ»™ëéåȇááËÉ9Á‹Ç“ºÓ̉ñ̉̉Å«‡“ÍjưÚ°¿%Yá ́½¸Úù×ódzé¯é߈¾ËǵØ߈ă‹‚¥ˆ]1±»ÏÅ÷Áù×Ơëö߈±»ÁƯưÀ߈߈×à߈ËÈ9̣ùê¹Ú¦ôùׄÚÛ«‚ ½9ó#¡Óø×D«Ûï½›Ó9¥‡ø×›¾¶ÜĂ»ÅÏÅׯù×₫D®¶Dû(™‰kß [ïS¬¾›¾“Üø¿—º½ÁÇÖ¹Úçô÷Á‡ºơêç'%™‰kß [ïS©Ơ¶ˆ¾ÍÄåĂµØ½€ßÄÙÍÓƒvç®ơêÏԥƾÑÄëÁƯ߈Ă¼¡ÈÀ áꛇăÇíÉĂơÔ߈éêƒÔĂÙ߈µaù×ÏÅù×ĂÙº±»÷Úׯ™‡ÁĂɨăˆŸ;ƒˆÏÅÛêôƒˆ±̉ù׃ˆщÿ¼ø×½€¿ôù×ù×§ôƒ±½ơÔÓ§Ươ½ă»€Ơ¢Ó¨¼ÿÂÏÄ«ÔăˆŸ;±»›¾Î §Ôơºˆß™ÔÑÓ¾™‰kß [ïS«Ñ¯)°̉âˆ:¹}ơê™Á˜‡ï»‹Ü™‡8¤‡©Ç‹Ç¿¹ÑæËdzbîô«ÔƠ½ÔŸ}¥ˆ]1×ÜÜ«‡“Íj‹Ç˜‰j̃ZîSÛ×™‰kß [ïS½Ă±»Ù××̉ƒvº™‰kß [ïS„Ú„ôƒv¡Ô¡Ó±»ÑÓ±”·‡‘×8çÏ|Ç̉º‡Ç«‡“Íj›¡Ă¡Û«Ó߈±½½ǺÛ™‰kß [ïSœÜÿ$½³±»©‡¥2ßëMÛ«‚ ½9gÑ·™ÔíÆ¨ÀËÉ9Áµ0ÅÁơĂ™‰kß [ïSïJ¿ô¥ˆ]1ÏÅ´ÈÛÇưÚ•ÖÖ$Î̉‹Ç¹à†ŒĂÙÅćéÙ½ăˆŸ;ß»ûø‡¯‰¯0¥ºß»ûëöÏ̉ÀĂ°È +ÓÆ«‡“Íj…Ûؽ›¹ÙÚóǼ +ƒv†º÷ÂÇÖ‘Ö´a½ë¿Ø§ô·§D ¯‰¯0»½ï½™‰kß [ïS™‡˜–ÓŃv…Œ߈ÍÓù×ơêµÜƯÓ ɇĂºđùêÅâˆ:±»•Èû›߈ßÄÙÖÙ½Ü÷Áٽ͑±‰äÏÔ±»·‡‘×8ç9¥‡«‡“Íjר·ÅƯÓ Ở÷Ú·¼Í7ơÔ«­Û«‚ ½9¿‰ëö—ˆ‡¹ÚË̉€ׯ™‰kß [ïS«‡“ÍjàÅñÚơÄÛ«‚ ½9¿Úëö™‰kß [ïSÓº•ŒĂÙº¹Úù×­ÄơêßÚ™‰kß [ïSù׃彽çÚÑÓùׇơ«âöÔ‡º¯¾•Œù×·Ô•ÂÑÓ¡ăˆŸ;¥Œ¡Ô¹ÚăˆŸ;Ươɇ¹»«»ƒvÏêÚ™ôÍÓ­vÁƯÇ>ăˆŸ;kÙÚử©½á¼Ø¸Úµ†ÜÙ¨ØÍË)éÛ9¥§Ô«»Ó̉Í­Hÿ¯¶ăê©Çƒ̣Ç߈ÁƯ™ôÏ̉áÓ½Ô³ºóü̉Û«‚ ½9í‡߈±¿߈9¥‡×±»́›ét½߈—»Å‹ÇÁÚƒÚ£ÇÖÆ +™‰kß [ïSµØÏÔ‚½‰Ơ«‡“Íj¶Û«‚ ½9÷ÁÛ«‚ ½9³È©¼ỢĂ߈ĂÙÙ½°»¿(±»—Ó·‡‘×8çÙ½—ˆ“ÈăˆŸÆÛ«‚ ½9¿Ô¡ƠÅØăˆŸ;Ï̉»ÅÛ¼˜‰j̃ZîS¼ëưêÑÓÓ̉÷Áù×ơê‹ÈûØÙ½ÑÓƒØéêå̉ ăˆŸ;k¢äơÔ‚ ¯È™‰kß [ïS­Ó¿ô™‡óÂ¿à“Æ±»½ăˆŸ;«‡“ÍjĂÙ„a:×¾ưÀ«‡“Íj¾©öÓÅ»‡é…ÖóÇÛ׽߻û‡Û߈ƒÖ÷Áø¿³ÈÙÚĂÿ­×¾«‡“ÍjăêßÚµØù×ÏÔÏÔ«Ôâàơê«ÔϺׯ“ȱ»¹Ú¹ÚÏÔ¡ÁûǿÆư‡±ù1Óº±»ívÍË)éÛ9¥ôưÀÑóÁ¾ÛÀ©Øßô±»€º¤Æ ›¾ăˆŸ;ÓĐưÀ«‡“ÍjÙ½ÑÄëáƠɇƒØëÓÿÇ̃„É̉À̉ ߈‹ÇÁ©Ó«‡“Íj˜‰j̃ZîSáƯÂI߈©‡¥2ßëMëö‡ñ—¾˜êèä°¿ÛºÛ«‚ ½9ÛßÚëöƒv—¶—ŒíÖáêù׫ԃàëÓ‰ơá ăˆŸ߈߈“Ơ‰¿I×¾ßÏÅщéºơÔ•½€ù߃µÁƯ¿‰ÁĂù×ׯ³ÇÏÄƠ‡ŒçôƒÖă놌ơÔ×ܧ½…©™‰kß [ïS±»߈³ÇÁÇç³ô§Ø©¼Û«‚ ½9±»…ܳ¨¹Ú¯ ©¼Ïø¸£ÑÓ§ÆÛ«‚ ½9«‡“Íj±»ÍÇÁ̉çỤ́¯ƠÏŃv߈¹ÚÎÔÜ‹ÇÇØ³ ¯°»¯¾ùסº¤ˆ\0£äă½Ñ•‡ö§ÔÙŒë*«ï»ÑØï²2ÍÄÏű»•ûØÏŰ¿ăˆŸ;§₫ÛׇŒ¯Èưù×ưÀ¾»±»ÙÚ¾ùêÏÔù×ÏÔÙ׎›¡µ!·‹ưÀÙ½¹Ö‡“ÏôÚª‚ +¼9ƠS³z‡ÏÅá=›ăˆŸ;kÿ¯¶±»‹Ü‡ºº“Ơ߈ͪ‘Úºy¯È̀çô¨º ñÙÏÔ±Ô‡ŒïƠÅô«‡“Íj̃Ú˜ +ê +è +ä +«‡“ÍjÅí‡óÓØỞºñÖ«‡“ÍjƒvÇÓÿ¯¶– +÷ÁỞ×Â׿8€ºçô÷Á‡ÑÑÓÏÅóÇшôèê±»ï‹ÜÉÁ¼ûÅØ/³ØÛ«‚ ½9½“ƠăˆŸ;߈ƒvŸ}¿æ»~ô·Üùë»q±»ÓØßÚ‘đơĂ­Ôƒơ–Ó +™‡Û×ÏÄIÛ«‚ ½9Ï̉•9¥‡»ØóÂ߈°êØÛ«‚ ½9¼ רư˜êèä½€9¥‡ÁÛ«‡“ÍjÂß»ûÏÅ×Ú“È«‡“Íj§Ôư­Æ̉°¿ÏÅÑØëöƒàÛ׿߯×ÛºÅÔĂ…Ø™ơ—¶º™ëé屿¥º©Óù×ñÓîÀ%©‡¥2ßëMƠ9¥‡ửÅ‚+`ù×ÁƯƠÁ̉ô÷¼¿‰ßÄÙæ̉µ$›văˆŸ¡È©&™·‡‘×8ç߈ƒvŸ\߈½£ä±»›¾ƒv·ÔƒvƒˆÙ½ëö»Ï«‡“Íjù×ç¿ØÁ̉±»ƒvƒv½шưÀ·ÔĂÙƒvơÔ߈Ü«ÔWÏ̉¶  ™‰kß [ïS¡Ç߈ÁƯ½€߈Û«‚ ½9çÚÏÔå­ß»ûß„µØÙíÖ¯¾9¥‡×™ÁµÀăˆŸ;í08¤‡ˆĂÙ߈çÚׯ¬Åß»ûù×±»©¼̀ÓÏÔÓØ¥ÆÇÖß%Ï«Ó×ƠÛ«‚ ½9µØâà凡h—ˆ©ÓÍÄ„›Ă™ëéåá=ß…»‘ÈÏÔôÏÔ…Ÿáê­Ä›¶é ËûùꥉÍL…±»ÿ¯¶«·3uU·‡‘×8ç‡Çƒv®Gøëö±¯¡ºĂÙëÔéÚ¹•¯ÜöÓ̉‹É0»ĂơÔ‡Œ¥ˆ]1àêƯºÀ +˜‰j̃ZîS½Ø³(ñÓÑæù×±ÎÏÅ̀ Ê) èÛ 8 ¤   ¿ß©Ø‘đ߈ËÓ‡9ăˆŸöä5̉›¾—¶½êºƒÚï½™‰kß [ïS±»ÍĂø×ÏÅ¿ùê¿́ʾ óÇ™Á›¾¥Á‹Ü‰Ûƒˆ₫Â߈ơêơê¿ÅĂĂ×¾ƒvÙ×ơèÅÁ̉Û×÷Áăêù×Ù½ôÇÖăˆŸ;Û×ơÔÚª‚ +¼9ô߈ơêóÇ߈³(±¿ƒˆß»û™‰kß [ïSÂ³à“Æå߈§ÔÅØ¶ÏÄ­¾²´aÛ«‚ ½9œ¿ÇÖ»¼‘ùê¾Å¼ßÖ™‰kß [ïSƒv÷­‹Û¸£NÎÔÁê“óǽԩ¼ÇÖ‹¾¾™‰kß [ïSß»û™‡Å؇Ơä¿Å«ö”ỞƠµØÛ«‚ ½9ºƒˆ—ˆëÜ«‡“ÍjÙ½ûÓ¹ÚƒvăˆŸƒv°»¿‰áÛÙ½—»ÆºÛ/麫»üÁ¯Ơ½ôĂȽ€ÎÔÿ¯¶ƒàëöù×—¶ùă©¼Ú#›¾ơê±»³ØăˆŸÛ«‚ ½9÷ÁÛºº̉%9¥‡×µØ¯G‹ø½€·‡‘×8ççÚºùדÆÁĂÅ櫇“ÍjYơÔÁË™Áß»ûóÜ₫½Èù×ăˆŸ߈ºÛ«‚ ½9¡ÈÿÈù×ëöÛ×ơêÑóù×á ·̣•Œ™‰kß [ïSŸ•©ÓăˆŸ‚Ù©‹Ç•ÏŽ‹Ù›!±ëئÔ۷ԯ׹Ú×¾÷‡ÏÔ¯)›¾ƒvÛ«‚ ½9½Ø߈ÑÓ‡ñ5ù×ÏÅóÇ‹ÈÑĂ›¾ÿÛ‚×Ù½Û«‚ ½9ƒ¾‘éÚ™ëéå™Á߈ÏÅ“½‡×©Ø½âˆ;k°Æµ†ơèÅÏÅ©‡¥2ßëMívôF¼¹«‡“ÍjĐĂÉƯÓ ¹ÚÍÏ̉©Ó™‰kß [ïSĂÙ˜‡¿‰é‡ï»ÓØÛ×ù×́v3ƒ¾‘•ÜÂƠ™ëéåơê߈ó©¼¢!߈±»ÅÓÇ̉µ9¥‡ƒv°»YëÓ‡º‡×›¾ñÚ¡ÈÏ̉êö‰»ôÍÓ߈ƯÜç°µØù׋ǫ‡“Íj½Èó“çôăˆŸëöƒôăˆŸ;ë§ÿÛ©&‹æÓº©Ø«»Ù½¿‰¥àÓØÓÆ¡È­ơ‰¿I³ÇÏŧ¹«‡“ÍjŸèù×–½߈ÏÔ—»ăàÙ½ÏÅïÚưÀ±«‡“ÍjÏÏÔ™‰kß [ïS8¤‡ÖỜÓ +¶ÔĂºưÀƒv«Ú¹̃­ÖµØ¶ºÁĂ½ÂÓ ÷Äø¿ëöƒÚ·Ó ¥0ØÚËÇëöû(߈ÿ«»Ù½§ÔçÚ«ÚíÖßÁ›¶é§Óôꙉkß [ïSĂÈ£äëÛ×Ù×̣ĂöĂÙ­ñéÓÓÙÖØ³ «‡“ÍjµØ‡Œưˆ“Ơ›¡߈™‰kß [ïSÿ¯¶ÇéêƒàơÅ·ÅgƺëöơèÅ9¥‡ßÄÙÏÔ߈·vƒvƒv±½—¶9¥‡ÑÓÛÄÓ÷ÁµØâḈăˆŸ;ÍƠÓÓÎÅ™‰kß [ïSÛº¹ÖÑÓÏÅÁ—»ƒàñÚí¢öùת‡’̀j¡ÔÓº™Ó·Ô¯¼ÏÔXÛgơÔñ‡ëöÏÅàXĂ¼­Öº½«‡“Íj©‡¥2ßëM½ÈƒvƯÓ ‰¿IÏ̉ßÄÙ°»ƒ×ÄÓÙ̉Úª‚ +¼9×Ư±»‡ÏĽÅ‹Ü¼ÜºÁƯÙ¼ĂÛ«‚ ½9ø×·Øä̉§Ô·ÔÙÅë£ä§ôñÓ±»ù׫‡“Íjư•«ÓÙ-Û«‚ ½9±»ÍƠŸ}ß»ûù׫‡“Íj½Ž¥ÆÏų1ơêù׃à·Ô߈¯ÈƠưÀáØăˆŸ߈Û‰Ø߈̀Ó4ƒÖ$…£­ÍBÆØúÓ“‹ÉïÛ«‚ ½9§Óù×¶ÀĂ ª‡’̀j±½¡Á¥ËÁăˆŸÛº¯¼ăˆŸ;ăˆŸ;§ÀÙÚ™‡߈ÙÜ÷‡ÍÄï´‹Çáù×߈Ѷ±ëØ“ÆÎÔµ†̉Áá(½Ù½½Ù½Ăºèºù×ÏÔ±‡©Óö¶_߈»Á£X«‡“ÍjÿƠT¿×ר½Ó¼ƒ×‡ÛÇÖ©&Û«‚ ½9Ù½9¥‡ù×½—¶«‡“Íj½ØÓºÓăˆŸ;éºÓƠÁ|Ñ·÷JíÚ‡99¥‡¬¶ñÓÜ«‡“ÍjöÑĂ«ÔÆ¡ÁÔ‡û(½ÙƠÛ«‚ ½9©‡¥2ßëMñÖĐÓơûéÚ«‡“Íj«»ăàÍƠ˜‡Û«‚ ½9¼Ơ±»áêù×î¶çÚÔX°»£Ô×ƠÏÅăÇí¿‰ù×—»µ†ÑÄ뺛¾‡ÇæÀĂà˜‰j̃ZîSƒÖÏ̉רϺ£äÛשӶº›¾ù×ÏŹÚyăê°½™ëéåËÖ·Øø¿ÿ¯¶çÚëöÚ§ô±»ăˆŸ;½ăˆŸ§Ó·‡‘×8ç¡ÁĂŸù׳ÙÚï½Û«‚ ½9¡ÛÅÓưÀ߈Ơ¼Û«‚ ½9¡ÇñÆ߈ơèũغƠù‡ËÉ9‹ÇÏÔÏ̉Ï̉úăˆŸĂƠ·‡‘×8çÑØÓØ߈Û™ăˆŸ;›Ú›Ú¹Ú½Áƒvñƽ€á¬«Û½Ö¾·Ô©‡¥2ßëMœ‰¾IÙ½щÏÄ«Ôß–ׯçÿ›Úù×ÿÂÛº‡ÇƠÍË)éÛ9¥‡ñ5§ô¾Ó±»²Ø™×«‡“Íj½€÷Áרă»ƠXψó¹.•öÁ˜‡±»Ï嘉j̃ZîS£ƠăˆŸÛ«‚ ½9Û«‚ ½9¯)ơèÅÙ½£»÷ÁÿÁëöE©Ó¡È½ëÔÛ×ÅàơêµØ—†ÙÚ¡ÛăˆŸ;Ø×¾ºâÁñı»¶Ü§¹ëƠU₫§ô½´ÀéêßÁ¹Ø´†­Ä‹ÜăˆŸ;Ăkëö9¥‡ÙÅëƒv›¶éŸÈÙÚ¬Ùëö³È¡Û€º½ô÷Áùêµèå—ăơá ƒ½ËÉ9‡Œª‡’̀j‡Í¿Å™Áù×¹‹ÜµØÁ¾ơÔÙ½ƒˆ½Ûºéº­ ¹Ú±»›¶é¥Û¥Óó»ß–³ô£ä¸ÚÙÅë½ĂÙïƠ÷ÁăâÆÍÄ”×̃ˆË̉ß»ûøæÏÔ³¹Ù½ù×Á½9¥‡̣¶«‡“Íj×¾›¡·‡‘×8ç‹Ü©¾ïäáêù×߈¹àµÖÿ¹Áöå̉ ½–¾Ç©Ó“È–ÓÙ»›¶é©‡¥2ßëMÜñÄÅá¡È©Ç›Û¡»•¾—v߈‡Ç“Ơ¼ƒvñÆÛ«‚ ½9Ϲ˜ÁëØ±»Ïű»ÏÔóÆçô©ˆ›¾‹ÜÙÚ›¾—»ÏÅÑLçÚ©¼Á¹Ú½Ô­ôÿÚçÇúÓË¿₫#Û«‚ ½9ÏÅñÁÏÅ™ëéåµÜ«‡“Íj«‡“Íjơê—¾ñ×½°Á°»ÏÔ¡Ô·Ô÷Ú—ú×¾¿‰ëöăà™ÓÁƯÙÚÿ¯¶ÁËßƯ™ÁĂƠá»Ăº©‡¥2ßëMÏ̉¼€ơê×¾±»åI¡ÁËÉ9ç4›¹½Û«‚ ½9ë‡Ù×ÏÔÛ«‚ ½9™Óå¿…1ÿ¯¶÷ÁÓ½±»¢ÇĂĂñÎÅăêÏ̉íÖ‰ñßÄÙăˆŸ;÷ê¹Úµa±»™‰kß [ïSù×ÏÔ·ÅÛÄÓÍÓ±́·¼Í7“Ơăơ½ĂÑÄëË¿µØÓĂÈå̉ ĂÍӾ߄ùדº߈ô¹Úÿ§çÚÅø¶‡Ö8æ¨Ç8¤‡³÷q©Ó³Â雹‚v©Û«‚ ½9₫$«ÔÁĂ³Æ±»Ïijzáß߈çÚ·‡‘×8ç‹Ü¥‰ÍL…ÙÜĐĂá=ÿÚ™‰kß [ïSß„·̣ƯÓ ă½߈ø"ù×áêăˆŸ;˜È™Á­ÔÛ«‚ ½9Ư‰ívơêµ½ŸÖø×Û«‚ ½9—¶™‰kß [ïS½€ÏÔ¨ÚĐÓÓ¾‚v \ƒ¥ˆ]1ç'ăˆŸ¼Ô±¿ÙÚ™‰kß [ïSƒˆ±»‡ÇœÜ¼ÿÚ¡Û¶ÛºâÁ…»™‰kß [ïSÙÚ«çÂÓóÊ…íƒáêï½ËÓèơÀ̉ñ™¹ÚщÛºÏÔÙßÄÙ›¾ר½­Öăơ¹Ú°»ÿ¯¶Û«‚ ½9÷Á‡ºóĂ‚¿ßùו%߈åÁơê×ÜĂôÏÔ8¤‡ÖưÀưÀ߈‚Øÿ¯¶¡Û‰Û¡Á«‡“Íj©àáêÏÔ—¶ù×߈¶™‰kß [ïS«‡“ÍjÇ¿ôÏÄöÁï»®Û«‚ ½9³à‰ë“›¶éëöƒ¾‘ùꙉkß [ïS™‡ŸóƠ߈™‰kß [ïSƒv«‡“Íj¡Á¯t÷Áƒ½ùơơÛ«‚ ½9¿Ø±»¹ÁÑÓăs½ôù×›Ú9¥‡áÏ̉—¶Áƒ•êäôÂÉ¿I«‡“Íj«ÓăˆŸ;£ä­ÔÏÅÙ½‚Û×Û«‚ ½9Óºçϼ€Ơ£äËÖ‹½8¤‡›¾ø×¬ÄơưÀ¿ô½·ÔŸĂ›¾Ç»߈®ÈƒvưÀù×߈ÿÂ¥àù׫‡“ÍjçØá­›¾×¾¡Ô½ûY¹ÚơêôĂÙ½Û×ÁĂ¿‰ơÔÙÏÔ±»å̉ ØđÛ«‚ ½9›¾ẨđÁ‹Ù‹ÓƒvÏÔ™‰kß [ïS—߈çÚÑÄëƒvÁ̉Ù̉£Ø«ÔÎÔ‹«‡“Íj×ÓăˆŸÛ«‚ ½9è·¡È·ÔÙÚù×ưÀ©ºŸ\ϺÙŒë*«í$³Ø»ôºß»û£È×Á ºÙÅë‚àÚdẓÇ™ÔáêŽï½ºÅ’¹ÜN¡ß‡ŒË%ÏÔå̉ Y¶™‰kß [ïSÑÓ纡۹}©Ó«‡“Íj“ØăˆŸ;kˆ›¾ÏÚăˆŸ;‡«»Ặ¶¿ß—¶àêß½ÎÔª½€Ù½ï½ÏÔ«ÔºăˆŸ‡ÚÀ ±»™‰kß [ïSϺ£Ç™‰kß [ïS‘«½߈ëöû”éå̉ ÍÀ½«‡“ÍjÙ×̃ˆ«â¹ëö«»‚v›¾˜ơ·‡‘×8çïÁÙ½ăˆŸ;k£ƯÑĂóÔǽÅ‹Èà çÚ£Ó؇Î9„Á¾Û«‚ ½9ơèÅ÷‡ƒvÛº„Û«‚ ½9Ư‰Û«‚ ½9µ‰±‡ù×¢Ưù×óÇ™‰kß [ïS‡“·ÔăˆŸ;©‡¥2ßëM©Ç©¼ÅØ™‰kß [ïS™‰kß [ïSƒÑÄëÅçßöÙYơèÅù×ëöƯºß»û˜‰j̃ZîSÅÅ™‡éÓçÇƠ±»Û«‚ ½99¥‡…ƠÅáØÛ׃v‹Ö±¿µØ߈ƒØ³È¾ëñÁơê“Ûơ»Ÿ}£Ç±»©‡¥2ßëM°»߈­€Yƒeøê±Ô‡ºÏÔº½½ùꃈ¼ï­ØË˱¿¹ÚÖÔ†6¦j°»öÛ«‚ ½9±»‚׺yÁ‡Çÿ¼߈æ'Ï̉ĂÙµÛÀƒvƒv߈³°ÈѶ±ëØ߈Y½ô±»¿ß·ĂăˆŸ;ï»ô§ÔÙ̉Ù½±¿©½Ỗ„—¾¡Á§ƠË̉±»ï½Ñ‹‡Ç»₫ăˆŸ;­Ä™‡ÿ·ԕŒÙ½›¾ƯÓ ߈ĂÙ™‰kß [ïSÏÄ«‡“Íjä̉ç¸Ǽë™H±»½ÏÅăÇíîô ï½™‰kß [ïSăˆŸÓÆƒvăơؽ—¾ëÔĂº̉Û½´QÎQQ©‡¥2ßëM¸Ú߈¡ƠºÅÏÔ´êÑ·½€±»ÏÄù×÷ÚŒE ™‰kß [ïŚv™‰kß [ïSÔX•ÇƯÓ ÂăˆŸ;ÏÅå̉ ù×âÁ¥ûù×ÀǺ©‡¥2ßëMù×Úª‚ +¼9‹Ü·Û¸£dºØÛÚçÇçô¶ç½åÁÙ½Û«‚ ½9µØÇÖ±»¥Ó§ÔÍBëö¡Áͼ«Ôܧ‡¹ÚÇè9¥‡“ÈăˆŸ;½€«‡“ÍjâˆƯÁóĂ×€ỂÛ«‚ ½9‡ŒׯÈÙ©ç±»ƒvÏÔëöƒˆÅn¡ÁÊÖ ßNÔX•°“¹ÜNÏÔä̉ăˆŸ;Û×¹Ú¾áƠ§×Óû(½YÁöÏ̉å¿«Ú°»ëöÿ¯¶…ÂÙƠÙ½Û«‚ ½9ëöŧԶ‡Ö8æôª»™‰kß [ïSÏůƒ« +>Ï̉Ù½ëö÷ÁĂĂ ›­±àéM5Û«‚ ½9ÑÓ˜ÛßÚ¼€¹Ú¹—¶±»ß»û½ÇÖù×¹ÚÁ×߈ÖĐ¹à»Øµ˜Úª‚ +¼9ÁÉ¿I­ÖƠ³±»ÅØñÓù¿ÏÔ©‡¥2ßëMÙ½ĂƠí˜ç̉‹Ü«ÔÙÚƒ½ƠÁƯÙ½ÍË)éÛ9¥»Ưª¶2tTÑÄëƠׯ¹ÚÛ×·‡‘×8çéçÚ˜‰j̃ZîS̀ßÚ¹ÚŸß¶«Óºå̉ ¾Ï̉߈“¹ƯNù×·‡‘×8癉kß [ïSÑÄëÍqùשÇÏʼn-«‡“Íj·ºÏÅɇÇÖϹÇ¡»‡™ÓưÀ‚׃åăˆŸ;”±»Âó|©¼ĂƠÙ½¡Ô9¥‡¢Ư߈•Ü̃ˆµØĂÙÏÔÙÚ³Âëơ‘ÛƒvåĂ߈á=ưÀ™‰kß [ïSëö±»å̉ Û«‚ ½9Ù½ÏÔÖÆ·‡‘×8çÀ̉ ØÅêǼ±»³×ăˆŸ;ÏÔ÷‡ÓưƒÄÅëöÎÅÛ«‚ ½9íØ¾½È¿ô½Z‰±6˜‰j̃ZîSÁ µØ߈›¶éüÀ¾ï³2±»Ö°»́ÙŒë*«±»̀ÓÛºÁ¹ƒˆùăĂ›߈Ă›Ú¼Á¹ÏÔăơù׿ñÚăơÅ…ƒvƒˆßÏÛĐÓ±»Ïç¬ÖÛÄÓù×ùôñƘ‡ƠÇÖ™Áçô†ö«Ô₫Âÿ¯¶¸ÚÛ«‚ ½9ơ»›¾ˆ߈Úª‚ +¼9†Œ§éÅà£X«%ăêăˆŸµØ·‡‘×8çÁ̉ßÄÙ“¹ƯN‚À±‹₫®¶°»ăˆŸ;Á̉•ăà¥ÆßÁ†öÑÄë߈߈Û«‚ ½9÷Ú¶Å¿ô™Ôư§‡ÏÄÉ阉j̃ZîS©Øù×ñÓÅØø×ü̉·‡‘×8çÛ×9¥‡×«·3uUÁÛ«‚ ½9ẳëöä̉±»‹ÇỞ½€ù×ɇđçÚßÚÏ̉÷ÁßÚ߈ăàçÚ›¾—Ú߈߈߈߈£ƯÛ«‚ ½9ÏÅơÔÏ̉ù×±»§ÔÍÄßÖ«‡“Íj½€¿½ĂäÆĂÿÚăà˜Û±½ỞÚ×!˜‡ÙÅ뽇Ú÷ˆ—»–££¦£̀»££™‡ÄÔÏÔ–ˆø¾‰Û½«‡“Íj©Ø߈ÿ¯¶‚Ö–Ûăà½ëÓø¿ÅÄ™‰kß [ïS£ÇÇÖ¹ÚĂÙăˆŸ;Û«‚ ½9½ׯ¿ׯôêé‰ñ5ñ·«ÔƒˆßÚÛǙӺ±»øơỞÙÚå̉ ߈ÿ¯¶±»ó˜‰j̃ZîS߈‡º»ƒ›¾›Á·‡‘×8çªÚñÖùêÛ™ëöŸÅơÔßű¿±¿“ÛñÓóÇù×µ°‰ÅÓ¿ô‚ÖỞÍÄƠư‡±ù1ÈƠÏÔóÄù×êÚ!ăˆŸ¯Èºéßëö‚ØăˆŸ;kĂÖ©‡¥2ßëMơêƒˆÇØÛ«‚ ½9ÏÅÅÓ₫¶öÛ«‚ ½9“Ơ¿×λj§‡غ½½²½ ßÚ¯G‹ø›ÚƒvÙ½¿‰ÍÄÁƯ©¼Ù½—»9¥‡ÓÆÆÖׯœÜÅÄơêÏÔ±»×$ÀĂ›Ú߈¦Ô±»ơĂæÚ…ƠôêͼƠX´†›Ơ·‡‘×8çÏÔÎÔÙܱÁŸä™‰kß [ïS߈—ˆ«‡“ÍjÏÅéÔÛ«»̀Ó·‡‘×8ç—¶¾ ëÄa­½¼̃½±»±»߈̣ǶÈƯºÍÄỞ¯ƒßͯ¥'=U#QK¯Âñ߈Ü£ä­Ö½Ă§«‡“Íj½Û«‚ ½9–ÓÛ«‚ ½9ÎÔ¿½ĂÙ£ä³ÏÅåàçÚÁ̉Û«‚ ½9ív§ÓÛ«‚ ½9™‡Û×đÓ9¥‡×ÍË)éÛ9¥œ‡¹à¾ºéºÏáêơêĐĂßӬĽ€½Á̉ª»ñïƠ™‰kß [ïS¿»¯Û9¥‡́½߈ÏÅÏÅö×Ó9¥‡ùêƼêÔá궇Ö8æ÷ÁñÓöÓØù×ù×ùÚÜơÿ¯¶«»™Ó½Û«‚ ½9ÿ¯¶ÑÓ½½‡›¶éÏÔĂ×Ă“¹ƯNíËÓ‹ª-‰ÆÛ«‚ ½9ï¶Ù½±»ơİ»§Ó¿ß’Æ“2ĂưÀåÇñ,ă‘·ăˆŸ;ƒvó|ÏÔ©‡¥2ßëM‡ºôù‡Ûº³à$‹–‚ºØ9¥‡ù×ÏÅÁ¼ëö̃ˆ­ÄăàÏŶ‡Ö8æÙ½±WE‚vÀĂơÔá¬ÅÔ‡ºăˆŸ;ËÓëÔ¨ƠÚÀ!ôꕽѶ±»›¶é¡Û‰º߈¶ÅÔÙ×ÿÚ©ÓÑĂ9¥‡×Ă߈ĂÙçôëö‡“½‡ÇźƯ°ÙÚƒvÏơµØ»Ø‡Çơ‡Û«‚ ½9ä̉ăˆŸ÷ˆ¿ç™‰kß [ïS³àÇÖÁƯÂÙŒë*«…ÖÄÓƯơ·̃Û«‚ ½9ß»û¹ÚÍÄÙ½ñÓƒˆÇĂ½Ăô“ƠÑÓÛÄÓÛº±”ùסȇºívñÆùÚº½ ÓØ«‡“ÍjŸé¡Û½€߈¹Ú8¤‡Ö±»å̉ Ươ¶Ü χăˆŸ;á̀Ó5çôÇÿù׋ǵØñÓ‘ơù×ă‘·¾™‰kß [ïS›¾™‡Û«‚ ½9¯×µƠ½“Ơƒv›¾éùơĐÓÛÀ²¾“ȃö›¾˜‰ j ̃    Z îS §ÔÇÖ­Ö÷Á÷¼ƒvµØ‹Çívë‡Ǻ¡ÔHÛº„‹ÇăˆŸ;‡ºỞÑØŸØ½‡ưÓăˆŸ;k°»±»™‰kß [ïS׿º•ÇíÆ‘«¿ôßÁø¼—Ó×Óר–»«‡“ÍjéÓëö½»Åáê߈ëöÛ«‚ ½9£vôù׃v›¾ÍË)éÛ9¥‹Ü¥¡Û﻽ÑÓơèŇºÁ‡é/×:߈ÛĂÙ÷4ж±ÁăˆŸ;âê¶èǼơèÅ߈Ûº‰¥ˆ]1™‰kß [ïSëö¹Ú÷Á‹Ó™™Ó‡j½ô߈麫·3uUÏÔăˆŸ;ÏÔ·Üư“̣ǃvùוÈû›¿ºƒv¿‰ÿ×ÿ¯¶‡ù×™‰kß [ïS³È«‡“Íjɾº…ÔÀ«‡“Íjµ!ăˆŸÏÏÔƒÚ߈ÿÚˆ;:Ç·×ƠÛ«‚ ½9á¬Û«‚ ½9¼ĂÍÓ»œ‡§ÔÛêƠïÀƯơÏ̉£Ø qĂÙÑÄëÏÔƒv›ÁÛ«‚ ½9ÙÈ̉ ¶¶ÍÓ±¿†w³¥‰ÍL…¬ÅÍÄ‹Ó÷‡˜‡—¶ÏÄ@ívăˆŸ½ƒˆ¹Ú›¾¼ª‡’̀j߈¬º¡ÔăˆŸÙ½ßÖ©¼ƒvÙÅë«·3uU–¶ÑØóưñÆÏÔ­v›¾ËǯéÛÀăˆŸ;½€«»óÇÏŧÓñÖùꙇà¬%™ëéåơñ»­Èù×û±k¼ €ƒ ơêƠÜë¼™‰kß [ïSù×—¶Ç߈ƒÖµØ§ÓÑĂá åÁvåÖ­vÛ«‚ ½9©ƠƒˆûÙº…Ô™‰kß [ïS¯ƒ« +>ܾ “Ơщ›¾Á½«ÔÏÔ™‰kß [ïS½€ăˆŸ;ƯơˆÓ›¾™‰kß [ïSÛ«‚ ½9߈½™‰kß [ïSÅ–¡Û%ëöÍƠ¹Ú©ÓÑÄë¨À¯ÈăˆŸ;«Ñ¸½â§ÓϹ©ÜÓ̉¥ˆ]1‡ñ5ưÀëöÅÔöÁ±»ĂÈ·‡‘×8çÆØëößÖɇß„ơèÅø¿˜‰j̃ZîS‡Çæ̃ƒvå̉ ™ÓÛÀùêá ›¾—Óñ«‡“Íj›̃÷ ëö߈ăˆŸ;­Ä«‡“ÍjÏÔËǃv“̀ÿ×™‰kß [ïSƒ¾‘é‡ăˆŸ;¹»Åâù¼ơĂßÚŸÄÛ«‚ ½9ÔŸ}ù×°»öÛ¿º‡ŒöóÔßÄÙ8¤‡ó×Ë̉Û×´†·Ô«)«»Ù½Ù×8¤‡Ö‡ŒÛ×»Áë‚ëöÿÚ߈ñ´ÀéêÏű¿«‡“Íj‹ÛăˆŸ;kßÚ߈ĂÙ‘÷³ôïl“½¹ÚÙÚü é±»“ƠÛºÊÚ¡È¢ôó¶›¾æÚ¿ºéêå̉ Ù½ăˆŸ;9¥‡©‡¥2ßëMơêÛˆ°»Úª‚ +¼9£äàöÙÚ‹¾•¾ÆØ̃ÁöÙ̉±Ô·‡‘×8çá½ëÖß»ûăơăˆŸÛ«‚ ½9óÇưÀÏÔ„°»ßÚî²2Ă¼åĂƒ×₫*®¶*̣óÇÓºƯÓ ÜÓ «‡“ÍjÁ ½ÈÑÄ뫇“Íj½óÓ˜‰j̃ZîSù×Û%«»¾Û«‚ ½9ăˆŸ;¥ÇĐÓ±»¦Æ·‡‘×8çÁƯù¾Ûø‡—áù×÷ÁëöÄØ¡Ô½€ù×Ú×ưÀ8¤‡×©Ó™‰kß [ïS›Ú«‡“ÍjÏÔÅÔÁ½½€°»9¥‡¡Ûçôçڵȫ‡“Íj÷Áôêöơ™‰kß [ïS£Ô₫®¶߈½·Ó ¥0ÿ¯¶߈̀£Ç«‡“Íj߈±»µêĂºÙ×±kÛ«‚ ½9™‡ùר¼•Öù×Ö$ñÓ‡™‡±»ó¡ÛÏԣǹ µØ™‡ăˆŸ;ÿ¯¶Û«‚ ½9Û«‚ ½9äÁÑù×Û«‚ ½9»Å¯×Åôß»û‚vÙ½¾ºăˆŸ;öˆïÁó“¹ƯN¡ÛÑÄëŒƠÛ«‚ ½9¾º©ÜnœÓ¹Ö½€÷ÁùêăˆŸñÓ¿Å«»™‡—»‡xÏÔ‹ÙźÓ¹Úª¼ÅÔ·‡‘×8çăˆŸơÔ™‰kß [ïS™‰kß [ïS›¾ưˆ•߈½Ûº‡x™Ó˾ĂÙѶĂÙùדÈ×¾ỞưÀ¯G‹øĂ™×•ÁôǾª‡’̀jå̉ «»«‡“Íjß»û¼€¿ôµØÑØÙ½Å…Øí/ăơºÁÛÙ½óĂÙ½‚Ô —»¡ÙÅëç(ưÀăˆŸ;ëö›¾ƺ Ç£ØóÔƯ‰Ù½˜ÔăˆŸ;kÑÄëÛ×ưÀƒŸÖ€Ó±»ËÉ9÷‡ÑĂăà­Ä߈ß»ûù×›¾¶º÷‡ƒ•Œº™ëéåăˆŸ¢ÈñÆ›¶éä̉ñÖ­ÄÇÖ«‡“Íjœ¸ÚÀ‡€è/Ö:áê«»Û׃½—¶½³ºó©‡¥2ßëM®¼ ÑÓÎíÅÅ–ÏÅÓºëöăˆŸĂÙ¢Xëö½˜ơÁ¼ÀÓ¼-ƒv™‰kß [ïSăˆŸ¡ÈçÚơêăơÛÄÓ½€˜‰j̃ZîSÙ½ù×±»»ØóÇ9¥‡ăˆŸÏÔËë̀Ó̀Ê)èÛ8¤ëÓ9¥‡ËƠñÓ•Èû›ÚÀÍƠ߈¿ºÙ½ÉñĂÙÍÓ9¥‡˜‰j̃ZîSÙÅë—ÁÿÚçÚ±»©º™‰kß [ïS­Ø©¼ơÔ—Ó¨‡¤2€̃êL­ÄƠ×µØ Ëûú«́³½ëÁëöƒvĂÙ™‰kß [ïSÙÚîô™‰kß [ïS‰-ÿÚɼ÷Áù×9¥‡Ž¥‰ÍL…ÓØ«Ñ‚véÔßÁɵà á ׿8«Ô«‡“Íj¢X™‰kß [ïSƒv‹Ç·‡‘×8ç‡ôĂÙăˆŸÁ½ëöºöÏÔ¡»¡ÁŸÖ¹½ÏÔ9¥‡÷ÙÏ̉ ÇƒØ߈›¶éô«ÔßÏÑ·ưˆ›¾ơêÁÁ«ÔáƠ™ëéå…nƒv½¯×ƒ½ö£Ø›¾ÛLJx‚vÑÓƒv™‰kß [ïSƒv£ØÙÚàÖ±»ºá=©¼ÙÚ·Ô89¤‡9Öº½ăơ…ÿÚđ¹˜ ¹Á®öăàÛÀÀ¹½¡Ưß³ºóëöù¾ÏÏ©‡¥2ßëM™‰kß [ïSưÀëö‹ÜăˆŸíꪻÙÅëƯÓ ƒˆăˆŸ ÈÚź¹Úôꃼ뇺ä̉Û«‚ ½9ÅÓÑÓÔ¿º«·3uUÀĂ߈«âă½™‰kß [ïSö¶‡º߈ơêæ*߈ÓµÙÚ±»£Ø›¾ĂÙù×ơèÅæº§ô²åôñÚÙŒë*«ÏÔâ›vßÁÙ°ÏÅ“Ơ½ÔĂÈÆ÷»ơưÀ¹ØÙ½ÿÚëö™ơ ÁÏÔ‚v·‡‘×8ç¼ÑÄëÿ×á¾±»‹Çơé¥"›¹›¡³zÑÄë÷ˆĂëöí$߈ÁƯƒÖ·‡‘×8çÍÁÚÀ«‡“ÍjͲ±ëǾvË¿¡Áù׉ÔÂÙŽé½·‡‘×8ç¡»÷$™‡©Ó¿èÏÅÛ«‚ ½99¥‡¸ÚăÁÏÅ›¸ƒ¹Ú.¼-ÏÅÅ0Ë”éêµØëö©]§àơĂåÁâÛ×½ɇÙ½‡¾¡É—¾ơ¼áº߈™‰kß [ïS±»…ØöăˆŸ;kÛ«‚ ½9¿‰Ïū⯀¬ÖơêçÚ§ÔÑĂƠ×±»Ï̉å̉ ‡Œƒv‰Ơ˜× Û«‚ ½9«·3uUëö‡ă´†¾ÅßơÔ©Çăੇ¥2ßëMëÓù××Ơͪÿ&ÿÚáƯÓ¼ù×¹ÚÇèûĂÙ™‰kß [ïS»‹çÛßÚĂÈỞÁçØƒơăˆŸ;Ï̉º¹Ú¹Ú°»ÇÖÏ̉½´Ø½Ú×¾÷ÁÍ%ỞưÀ½ơ»ăˆŸ;ËÇÜ«ŒñÖ½ÛÄÓ¯ÈÛº‚¡Á±»×ä¡ÈƯÚƒØÙ½©Ø°ÈĐˆ¢X÷¼±»ăˆŸ;ºySñÖ½÷ÁôßƯ›‡«‡“Íj·‰Á¡»ôǺ¶›#¡3© Ñ%­’κùש¼€ºÛÀø¿ăˆŸ;ÇÖκ÷Á߈ù×Ù̉ôÏÔăˆŸ;öÛ«‚ ½9£ØÑØ̉ăˆŸù×ơ»ß»ûßÖÁ|·‡‘×8瓺‡ºƒ¶ôÿÚåôçô·‡‘×8ç÷Á߈¿ßÏÔ«‡“ÍjÅ–ÏÔ–»ç̉ÏÔ—»±ëØäăˆŸ;kÅØ–»ƒØ™'ù׃ˆƒ¬ÛùשӽœÜ½Ư ÆĂ9«Ö$¾»×¾Óº½ôÔù×ß½Ăºö« ©ƒ»5Ă–ÅÔÔºlß»û³ù×éÓ¿àÚשØùê¾¼ÈơèÅÚª‚ +¼9À‡€è/Ö:¯“½Ôùêù׳ÏÔ«‡“Íj‰ÙÓ߈9¥‡±»Û«‚ ½9ÓØç̉ÏÔº§Ó¡ÔŸ̃ª‡’̀jŸ»çÚ¾ÅÓñăơ»Å¹Ơ¾» ™ÁÁÛÍÓ™‰kß [ïSËÉ9ï½›¾ÏÔ—¶ϼù¿ăàß»û¥Æ÷ÁÛ&÷Á¶§È«‡“ÍjăºÙ×ÿ¯¶«‡“Íjµa½Û«‚ ½9XÿÚå̉ ÏÔ¶ëö¹̃‹ÜÙÚ¹Ú߈íºÙÚÙŒë*«¡Èƒ×‹Üă½—¶·Ó ¥0Ù̉³#ª‡’̀jͼơÔ«‡“Íj³ÈÏÔ×BçÚ©‡¥2ßëM›¾±»ÁÛ×âˆ:kÑØ˹£ä½‡ŒĂÙ߈áê‰ñÁĂ½ÑØưÁ‡~«d±»ÑĂ›¾…Ôï½ËÔ…ØÏņŒ¦Ô±»³ºóÛ«‚ ½9™‰kß [ïSÓºăˆŸ;•Èû›µÈ€º߈¹ÚÄ$ƒ½Ͼ¥OÛ«‚ ½9¡Ô§ô÷‡±¿ÅŽƠÀĂçÔ¡íÖÛÅÔ«‡“Íj«‡“Íj« ©ƒ»5ëöÄÓ÷Á¥Ùé¾›¹ÁƯä‰ÍÄ)«‡“Íj¨¼ÁÛù×±‡®ôEº¹ÁÿÚ̀Ê)èÛ8¤™ơƒ×ÇÖ9¥‡‡ÛÏÅù×䯱›Ϻ‡ÛÅÔä×—¾Á¹ƠÄ߈ù×÷ÚáêŒy¡»§ôưÜưÀăרÛ«‚ ½9ăü̉ŸơóÇ¿‰­Ö·‡‘×8çƠXƒØ¸Ú™‰kß [ïSëö‡Ú±ú«‡“Íj³ Ï̉ơèű»ÀĂÇăˆŸË%ù×½ôÎÔÛ«‚ ½9óÇÛ«‚ ½9¢Ư½Ôꩇ¥2ßëM“‹©Ø“ÆÛ«‚ ½9áºưˆ…Ơ»ØïÚ›¾“ö¯¼Ơ¿º³VûÖĂù×›¾ơÄßÚù¿Ëô—¾·Ô“ƒv×ÜÑÄ뙇¹Úß»û½›¾ưÀĂơ˜‰j̃ZîS÷ˆÛ«‚ ½9Û«‚ ½9«âơÓØ™ëéåơê±»‹Çï³2ƒv–¶ï»ˆº±»›¾“Ơ¾ºËÇ׿8‡×Ơ“ƠÅÔ¾ƒ¾‘§œ÷å5Ó¡ÁÛ«‚ ½9Ù½ÁïƠ¢ ¸ơĂơê¹½èê°»₫¡Ó«‡“Íj§º“Ơ©À߈Û«‚ ½9«‡“ÍjéÿøÓÓđ»+ù×£Ưå̉ ï»ø×‡ƒĂ¯ÈÅ–¥Æï½ÏÔÑ·óºëÓôßÖÏÅđ»“ƠЉ¹Ú—¶¹Áï³2߈½€ˆÿ§›¶éÍGăˆŸÛ«‚ ½9©¼Î̉ỞÛ«‚ ½9…ô½—”ÿ‡§¹ûê‘«ÇÖ›¶é«‡“Íjơꩾ›¡½ƒvÿÚ¨ưÀ—¶Ú׫‡“ÍjÙÚÛÄÓÙÚăˆŸ;kÛ«‚ ½9œÂÏÅרáê¡Á«â÷‡›¶éĂÙ¡Áưˆ“½ĂÙóÇéÚƒ¾‘ăˆŸ;ÊÈ9ÑÅ«Ú߈Ù½±» Ûº¼«‡“ÍjăˆŸ;Ïœƒ¾‘¯ÈÙ½•¾Æ™‰kß [ïSË̉£‡ơêơÔ±%«âƯÓ ăàÍË)éÛ9¥ÇÖ¶ÔÖ߈ºùêñÚ°»߈÷ˆ‹ÈĂ߃ˆ̉Øëöó¸÷ÁÍÄ©ÓÛ«‚ ½9ÍåÏÔ×Ơ—¶™‰kß [ïSÏÔµØøêÿ¯¶ÀÚ"±»Ăä£Çºy!Ư¹Ú°Åø¾Ù×ïƠ¡ÈÎÔÛ«‚ ½9«‡“Íj™‰kß [ïSơĂ«‡“ÍjÑÄëÙ̉‹ÙÅ–ªÚñÚëö9¥‡á=ß»ûíÖ©‡¥2ßëMưÀ½˜‰j̃ZîS¾Û«‚ ½9“ºĂëöÅ©¼÷ÁíÖ߈ È¡È½ÏÅŸè§ÓưÁ̃ˆ߈ÍÓñ8¤‡ÖÇÖ­Ä»·ÔµØ­Ä˜ÁăˆŸ‰Û•Èû›½ßÄÙå̉ ÆÏÄ·ÅÅ·‡‘×8çË̉ªÔƒvÍÄ—¶ƒv¿ß·‡‘×8ç¹Ú™ëéåÙڿ߇ßÄÙ÷$ÏÅ£X¶È˜ơ߈º·‹§ôöˆëö·ÔÛÅíơ¿‰÷À™‡­Ô×ƠăˆŸÑÄë•kß [ïS½·Ó ¥0ƒàÑÓĂºï½çôº9¥‡§ØÇ÷ƒˆ™‰kß [ïSÿ¼߈¹ÚăˆŸ¬Û­ÖÙ½ÙÏÔYå̉ ‹Çÿ¯¶ÙÚ±»ív·Ó ¥0ÅóăˆŸ;߈Û«‚ ½99¥‡×•Ö¼½é¼Ñđ™Á™‡Ù½•Œ̣Â9¥‡²Â ÑÓ«‡“Íj½Û«‚ ½9›¾÷Ú›¾§Ô߈߈³ẲëöƠÑÓÓÅÁƯƒÚÙ½Ư‡—ˆû؛ڽ€µ!¹Úƒvû߈›™»ØăˆŸÏ̉íêóDZ»ĂèÙ½ÏÔµȾ߉ÛăˆŸ¯¼“Æû̉·Ø­½¼¼ÑÓ§ô·Ô›·ÔµØơê™ëéǻØ«ÓỂ‰€±»«‡“Íj¾߈Ê¿ăˆŸ™‰kß [ïSÅØÎÔëö‡Œ·‡‘×8çµa‡x¡ß¿́óÇó‹ƠÛ«‚ ½9“ƠÑÓù׫º»ØơÄÛ«‚ ½9¬¾ÓºÛ«‚ ½9›Ûö‚«Ôùæ¥ØÙÚ·‡‘×8çàûÓ«‡“Íj†“ŸÄơÔß»û߈ơ홉kß [ïSÏÔ®¾Ïĺ½¸Ú±»ûÜù×›¾°»ÂÙ ¼Øщáê8¤‡×ƒ½9¥‡ơÔÛ×·Ô÷‡«â¶ Ëû߈ù¿³*äơÔ +ºØ½ôƯÓ ¿‰™ô°» Ú»öëöË%û̉ÏÅ…¡ׯă°»ÍÄ™‡Û«‚ ½9Ơ¾GÙ…»ăˆŸĂ­Ä‹ÇÀ½½«‡“ÍjơÄ̉홉kß [ïSÛ«‚ ½9ÿ¼¿ÅéÚ©ØûƠ«dÿ½¶ÚÆù‰‘ÇØỞ߈ƒv퇩ӑÚƠăÁ•Œ%ÓÅĂÙ©Ÿ·߈©ÓÑĂÛ«‚ ½9¥Û«Ôíơ™‰kß [ïSăˆŸ;ÑÓ¶ô¨ºÏÔ¹Ú½ëö¶ù×÷ÁÀÙ™‰kß [ïSƒùê»ôëöƒvªÔ‡¿‰¸Á±»¿»öăˆŸ;±»¶è"Ú»ÁĂƠ퇉¿I‹ÇăˆŸ;ĂĂ²b™‡£ä©Ç£äƯÀ™‡å̉ ³Ç¡Èđ¹˜ •àñÖùêƠä̉•ǵÀÚÄ̉ù×å̉ ³ØƠÑ÷ÿ§ơêºÁ¡ÈÄ$á=ÏÅ߈µØá Ă£Å»µ†áçɇơĂ÷Úåéç±»Û«‚ ½9ºÙ½̀Óà›¶éÏÔÛ«‚ ½9©‡¥2ßëM›¾«»߈¡Û¹Úٽ麇v¹Á™‰kß [ïS8¤‡ÏÔÙ½™‰kß [ïS¼Ó¾ä̃DZ۫‚ ½9¶«‡“ÍjƠáºùëíÀº«‡“Íjư‡±ù1ËÉ9¡âŸî‹ÇÎÔöÏÅÿ¯¶ĂƠÓÅ«‡“Íj¥Ç¹ÚăĂÿ×íı»Û«‚ ½9»ưˆ×Ó̃»úµØ›¾‡ÇăˆŸÁÛơê´î©‡¥2ßëM%ÍË)éÛ9¥ñÖØÚơèÅÑûÓ½ëö§Óçơê¡Ô¹Ú¿Å¹ÚßÄÙׯá߈ÎÁñÁǦ¼€™‰kß [ïS₫ÇåôĂĂɸ“Æéº÷$­Äư܇ڃv߈‡,߈‹ôÿÂùבÓׯµs§ôå̉ ËûÛ«‚ ½9˹ö¨¼°»Û«‚ ½9₫Ô¡ÔÂÙẲ«äëöƒÍƠ—ÓăàùדŸé‡×Ơ­Ô‡ḈvƠÛ׃vÁÚÛ9¥‡£äơê¡È“È­ÂÙŒë*«™ôºå̉ ù×đ¹%˜ %ÎÅ ¶ÜÑ·ĂÙ½Œ«Ôù×™ôшÅ–³ÇϹ߈­Ä⽃ºóÇỔ‹åñ½Đ¹½Û«‚ ½9᫇“Íjÿ¯¶á ù×¹–ÀÓÛ×Çè¥Æ£ä«âŒºÁƯ߈ÿÚÙÚïÅÛ«‚ ½9£ä§Æ¡»ÑÄëÁ‡é/×:ơ§ôïÚÇÖç'ÙÚù×YÓ¼ÅÁ₫®¶÷ÁưÁ½€¡ÈûùדƦÓñÚÙY߈ÛÀ±”°»ƒÔ‡ŒÛדƘêèä½€ÇÖ™‡ÿ¯¶Á̉‡ºÛ™‰kß [ïS¶¥‹רÍË)éÛ9¥ăˆŸÑÓĂȱ»Ûº߈€ëï»ưÀØÇ»Y¯È§ØÁÛ©‡¥2ßëM­ÄñÚăˆŸ;Û×½º“ƠơÔ߈³×ÓÛ«‚ ½9ç½ưÀºÁ嫈ÅÄ¡Ôư“ׯÉĂÙ½å̉ ´ÅÿÂÙ½™‰kß [ïSµƠ߈Ư‰ï³2Ù½±»µØëöŸ}Úª‚ +¼9߈½ĂưÀ›ÚÛ«‚ ½9†Ú­Ø—¶ù¿¡ï¸Ă½€¯ÈöÁÏÔđ»ẳÙܬ€É̉Ơ¯¼¬¾ûØÛ«‚ ½9ñÓ³ºóÅ–°»«düÀÔXÏÅ«‡“ÍjщûçÜÏ̉°»®Gøÿ¯¶ăˆŸ;¥Ø›Ú½á ·Ô«‡“Íj•™‰kß [ïS¯Êº¡ÈñÓǛÊ)èÛ8¤߈÷‡ƒn‚×ÿÚÂẮv½€ù×Û¶è߈ơê—¶ëöƒ­¼ù×ăˆŸ;k±»§ôùêÂÙˆÏÅßÄÙ‡ÇçÇË%»¦ûØô꿉³¬¾Ù½…Û‡“«»ưÀÏÅéÓ›¹ºÁ¥ˆ]1¹¾9¥‡‹É0ưÀÁÇñ5å̉ ‡Œ߈¡\߈åô›¡©ÀƒÖ™Ó§ÔœƠ å̉ ù׺»ÓĂÁ‡é/×:™‰kß [ïS„n3«‡“Íj¡÷‡£È­ƒv½€¿‰°ê؇ÇÏ̉¡ÔÛ«‚ ½9—¶¡Èù×Û×°»”ÇëöóÇßÖÁ©‡¥2ßëM̃Áæ8¤‡¥ÚóÇÛ«‚ ½9ÛûÓ´ÈùñÁñÓ˜×Á½Å±»§ô³ÈÛ«‚ ½9»yù×ͼ9¥‡Ơ¾G½ç̉±»ëöÛÀƒvƠX¾»ψíÜÓß»û¡ÁƠ£÷¢“Ơ½¯‰¯0µ!ăˆŸ;k¿‰ăˆŸ;Û«‚ ½9—¶8¤‡ßÄÙƠÅÁĂăˆŸá “¹ƯN¦ÓŸÄÔ“ÆÖÆ ߈ùê§à®G ø Çè“È™‰kß [ïS·Å¾Û«‚ ½9‹ÈÉ̉·̣£ÇăˆŸ±»ÅÓ°ÈÙ½°¿ÏÔûăˆŸÛ«‚ ½9Û«‚ ½9ëÚ«‡“ÍjƠXµÀăà•½±ăÛ«‚ ½9‡ŒÛÄÓÖÆĂÙ‡Ă“ÆđÖÿ¯¶›¾ÿÛ㋦ô“ƠñÖ›¾¡ÛÖÆ™‡Ïĵ؇xù×ÛºÙÚ–¶ăˆŸ;k±»©‡¥2ßëM—ˆü׿ƠñÚÙ½ẳ¿‰Û«‚ ½9™‰kß [ïS°»·‡‘×8çù׋ȅƠÏŹړÆù×ÍÄĂÿ¯¶á=öêơ£äÉÏăơÅ»¹íÁ¯¾ăˆŸ;ÑÅ‹ÓàôĂ™‡́vÛ«‚ ½9ÏÔ›¶éï½À¹“ÍÛ«‚ ½9ĂÙ߈“Ơ—¾̉ÆăˆŸ;«ÔÔÏ̉ăˆŸ;öÛ™‰kß [ïSø×±»ơê™ĂëÔ‹ÜÉÅÙå̉ Á¡Û¹ÚÁ̉©Ø‰<²—ƒv¯Ó»Á¿‰߈ÁĂ¿º±»Ù›¶éư„㙉kß [ïS«Ô»×·‡‘×8çÆØêö“È“ÆóÔĂÙ߈ϼÏÔËlùXÏÔ߈ÍĂ«‡“Íj­Ô’¹ÜN߈û(«Ôôêׯ©°¡ÈµÜ9¥‡ÙŒë*«ßÁ«ÓÔXù׿‰ù×ÏÔ½«‡“Íj­Ö‰x©¼«Ñ¯G‹øÛÇ߈«»ñÓ½µØăˆŸ;½ùơ¾(‹Ù§À±́ăˆŸĂÙÛ«‚ ½9·ØÙ½ưÀÅô¼ôôêƠÛÄÓ£ØíÖ±»Ù½Û«‚ ½9ÇÖ½ăˆŸ;Û«‚ ½9ƒvÁ ¡Èö—>ßÁƯº÷ÁÆÁ¾«‡“ÍjÙëö̃ˆ‚ †Ú¹Ú•Ê% öºÑÓ©)ív©ÇĂn»ØĂÙ“Ç£‡‡×½߈Á¼߈ÍåÇâºÔá=™Óƒˆ§5½€Û«‚ ½9¨‡¤2€̃êLáê½߈Á½Í­HƒµØÛ«‚ ½98¤‡ơèŹڽ½ù×́؃văˆŸßÁ×Ăÿ¯¶éÓï½Ǻ«ÑÑÓ…ÙÓÅ«d­Ä³Áå‡Û³È³Ơù×Ù×߈€Ơá¾Å»Öó‹¾9¥‡ Á«Úï»߈¹£å»ö÷$½ĂÙăˆŸ;«Ô™‰kß [ïSù×¹â9¥‡½€Á½½Ù½ÑÓñÓ±¿ëöÇ̉“Ơù×äÁ +¿ô«&ử餽€åñÆÿ¾ăˆŸ™ÓϓƱ»ăˆŸ˜1ê1è1ä1¿‰êöÛ×׿8ù×±»ăˆŸº·¦Û»÷›ĂăˆŸơêÙóÔơĽÅÔ‹Ùơ›v˜ơ ï»ăˆŸÅÄ—»Ù×ׯÏ̉ûÙ½¢Æ Ù Ơ߈߈߈Ÿ}׿8Ë¿߈Úª‚ +¼9ƯÓ Ä¹Úƒ¾‘™‰kß [ïS±»ÙY¡Ô½ưÀ™‰kß [ïSµØ÷ÙƠí̉Å ăˆŸ;k¹ÚÛºÙÚÙÚù×߈ºÿܼïéåĂÏÔ¾¹!ƒv›ܺ™Ù¦ô“ÆÏÅơêÛ«‚ ½9ËÇ™Á±»ƒv¾Å³ØơèÅɇ¸ÚÙÚˆí‚v½Ă‘Ó‡x£»§Ô˜êèä“Ơ±»á=ß»û¹Ú—¶×Ơ·‡‘×8çơêÛÆ½ïßă¼ẳëöÚª‚ +¼9‹Çë±»×ÍË)éÛ9¥›¶é±»ăˆŸơ껈ƒv˜Ô±»¼Ơơ»ûØ·̃°¿ï»Ú׫‡“ÍjñÓ«‡“Íj³ù×Ù½¿́ơêóÔ‹«-‘ưÀ—»©‡¥2ßëM·‡‘×8ç›·ÔÖô +ÑÓĂº§½Ă٧ྺ¿ºëÂưÀ…Ø–¶Ù×½ƒˆ¯¾Ơơ¸ÚÔ½µ‘¥à¿‰ÈĂÆƠ¯¾Ó̉‡º—¶ÏÅëŸ߈¡Ç߈ăˆŸ;kË¿ÁÈĂ³Â™Á»ØÍƠ¸Úƒˆ߈‚߈­Ö£Ô¯ÈÅÓ½µØ‰ÔÏÔƒÚÛ«‚ ½9Ù½ÏÔÑÁ¦ÆƒàăˆŸ½¡ÛŽÏÅơêù×ĂÙÓăˆŸ;™‹åôÿ¯¶“ȹ»Ë̉߈ϼ‰¿I¿Ø½§º«‡“Íj߈•ºÏÅŸ́ÀĂ ›¶é«‡“Íj¬ÅÖ¾ ‡¾¹ÚÏÔ“Ơö₫Ú™‰kß [ïS©™‰kß [ïSív™‰kß [ïS«ÔöÏŇÿ¯¶¿’Ơ‡ñ5…ƠƠÁ9¥‡Ž·Å±È߈¥Ç•{ÙÚ¡ÔÓ̉˰)‡ưÛº¯È߈éơưÀ߈§¹óĂù×ß»û¾»ĂÈ›̃ĂÙÏųÈù×¾ÏÅﻟŠËû ß»û߈ëÓưÀëö½û…»åÊơÔ¹ÚÙ½ƠÙƒ½ưÀ½€ö߈¡ÔơÄó×ÏÔ¥ØüêơêÙ½©ÓÇÖăˆŸ¿‰öá¬ëö‡Œ­ÄăˆŸ;±»›¶é¬€9¥‡›¾Ơ‡ÇÛ«‚ ½9˜‚ưÀ¯ƠâÂ3ºæÇ +‹ÜÖØ¿Åăê™»Û«‚ ½9Ûºá́Ù×ÿ¯¶¹ÚÏ̉Û«‚ ½9ä̉ưÀ¼“û…ÖÓÔƠÑÓö­Ö»ĂỞÖ ƒvß»ûüÆÏ̉ÏÔƠÓÏÔÏÅÿ.íÁö«‡“Íjơêùת¶2tTơêơꥉÍL…÷Ù™‡›¶éÓ›¶é±¿­!™‰kß [ïS†¾߈ÙÜÛºëö¡Û­Äª»¦Ô£ÇÛ«‚ ½9îD ËƠÛ«‚ ½9ÏÅ߈°»ù×ß»û÷Á·ÜƯ‰öÁơêÑÄë·‡‘×8çù×’½µØíÑÓù׫ÛÛ«‚ ½9ÍË)éÛ9¥ÛöăˆŸ;ăàÅø³Çùטêè䤯 ©‡¥2ßëM©ÜŸ\ăˆŸ;Û«‚ ½9±»µØË̉ñÓÛ«‚ ½9å̉ £ÅÙ½™‰kß [ïSÇÚƠĂȪ‡’̀jù×Ă‹JôơĂ¾߈—»Ѷ£ØÑÓ‰¿I÷¼…à«ÔÈ‘±ßŰ¿¾›¾ÿÚ½³zí—GĂĐÄêÇÅâˆ;ƠX²Ú°È§ôƒˆ½í—GËÖ߈—¶ĂÈÛׯȷÜÿÛ…»¨¾–ÓەדƠͽăˆŸ;·‡‘×8竇“ÍjшƒÚ›¶é³Ơö«Ôµ™‰kß [ïSÓ ‹›æéº˜‰j̃ZîSƒÖơÏăvÏÔơêí‡ëöÇÓ½§àÚª‚ +¼9¬ÛßÄٙ׫‡“Íj߈Ơ ×ÜơèÅÚª‚ +¼9ùש+§ÔíÖ½Ă‹Ç’Ç—ưÀøê«ÚÏÔ±»ïÚçô¾Å®Ó9¥‡×ÏÔù×̃ÄØ«‡“ÍjéÚÂÎ̉›¾½ÏÔ×ÓÇ»«‡“ÍjÏÅ•Èû›ơêñÚ¥í»ÁŽñ™‰kß [ïSÁƯ¡ÁÛ«‚ ½9™‰kß [ïS«»ç̉ÿ¯¶Û«‚ ½9™‡éº±»ĂÙ›¾“ȱ́㻩ÇĂôÏŃÚÙ½߈©‡¥2ßëM½ÔѶ«ÔÙÅëùêÛ«‚ ½9ơÔÑÇä×$º™‰kß [ïS•Èû›ÛÄÓ‘±ưÀú(™‰kß [ïS«»Û«‚ ½9ăÁ¡Èá ÑõØƯ‰™Ôï½±‡¡Áơêéº߈«‡“ÍjÛ%¯G‹ø¸Úƒv½Ô±»™‰kß [ïS­Ûƒv±”º“íơê›¶éƠ9¥‡é‡ăˆŸ;Ï̉ËÉ9ñÓ¾»«Ô÷ˆóÇÛ«‚ ½9~ăàơ~µØ³ËÇŸƒˆĂÙÓÁÔº:l:“Æ™ÁăˆŸ‹ÜÛ«‚ ½9Ù½ĂÁŸ}÷ˆÏÔÛ«‚ ½9ÿڇǨ‡¤2€̃êL‘ÖÓØ¼ăˆŸ;ưÀÅÓ™‡»Á©ÇÏÔÀ¼çôù×ăˆŸ;Úª‚ +¼9—Ó/Ÿ¹ñ±»ĂÙÛ«‚ ½9ŸĂ¡Ô‰ƠÑÓŸË—¶ƒÚû»Ï-ơêÑĂñĂ©àÄÀ½³Â‚Ă­ÖăˆŸ;ù׺¹Ú˹«‡“Íj·Ô±”߈߈Û«‚ ½9ƒv߈ªÚ…¾§Ô¿º¥‰ÍL…ñÖ©¼éÓßÁƒvù×å̉ ܻũ¼ÉĂ¯rº€º̀Ê)èÛ8¤÷‡߈Ôơ ŸÑóÂÙ½­ØÉ̉›¹ÇÖ—ÓŽöơú™‰kß [ïS¥Ç¡Ôµ×¹Úß»ûîÚçôÚ×ĂÙ™‰kß [ïSû(ö‚Û¼©%£Ưö„Ú«Ôù×ëö±ÇØù×ĂÙơê§ÓÅçơêɇơÔûÙ‹Çÿ¯¶ñÚßÄÙƒvÛ«‚ ½9öμçGóÂăêƒv¼ ¼Ơ«‡“Íj¹Ú•Œ߈÷ÁÇÖÿ…ơꙉkß [ïSÜ¿́Û«‚ ½9ÛÀ÷å5Ó¿‰ĂÁÙÈ̉¡Á߈½€Ë'«‡“Íj̃ŒÚ,ÑÄëÎÔ½ÏPö™‰kß [ïSÛºÏÔÛ«‚ ½9™º¿‰‰ÛÏÅ÷Á›Ẩ*ơĂơÔ³«%ñÓ߈éÚµB߈̣¶¡ÛÏÔ‹Üéá¢ÇÛÄÓÙÅëÿÛïƠ¿Óºơê«ß÷ˆÁÀ¹ÏÔ›¾«‡“ÍjĂº±»ưö¡Û«‡“Íj¡ÓÅØ‚Ö—¶‚vÍÓÍÄÁƯơèÅó›¾öƯÓ ³—Óƒˆ›‰°»×¾ÑÓăˆŸ;Á¿‰‡xívívéÛ×߈ÂĂùôưÀ±»߈óÇϹçÚå‡߈öƠ߈óÇëöÁ «‡“Íj»âˆ:këöÓµ—́ưÚù׃vù×ëö±»ưÜÏÔÙ¯›Ú߈öơº¿ß·ØÙÚăˆŸ;™‹ơê±»ĂÙµØù×߈ù×ĂÏÔÍË)éÛ9¥©Ø†Œ‘逾ñ”¶Ë¿ù×̃ˆóǧÔÓÅÿ¯¶ß„9¥‡×ăˆŸ;÷ˆ»½®È‹Ç¡Û±»ơÔ¬ÈÏÔ•½ù×™‰kß [ïSưÀ©Üù–ÔëöÛ«‚ ½9ÈóĐÓ©Ø™ô›¾…¡%ĂÙĂ¼½ó±»«‡“Íj₫ÛíêÏÅ·̃˜ơº́‡½öÁëöÍı»ƒv†ÇÏÔ­ÖĂÈÏ̉ÏÔŸÖ™‰kß [ïSÁ‡é/×:̀Ó•½¹ÚÏԃ؃ÖÁƯÔ—¶Ü̉Úª‚ +¼9ÏPéÓûÓ¤ÆÏÔăˆŸ;ĂÖ±»¡ÔÍĂï³2̀Ê)èÛ8¤µØÅ±»‡“ĂÙÅÄăˆŸï³2¿ßå×¼ĂŸ}߈·ÜÁ¼Ó‰½ÑÄë·‡‘×8ç…£­ưÀùב±™‰kß [ïS·¯³Ù½œ‡éºÍÓª÷ëöŸÄ™‰kß [ïS»‡ăˆŸ;°»÷ÁÅÓñÖóÄÑÄëå̉ ™‰kß [ïS߈¤¾™‰kß [ïSÑó¿(í·­Äº¹ÖÍË)éÛ9¥ÏÔÛ«‚ ½9ÙÚ“ƠơÔ«Ô¹ÚßÚ½íÓŸÖ“¼ùêÁĂ“ƠăˆŸƯù׵ثÓá “Ơ߈±ƠÖå̉ ™‰kß [ïS±»߈¿¹™Ơ©‡¥2ßëM­¾ו«‡“Íj÷‡ăˆŸÏÔÅÓĂ•ÇŸ}‚vÇÖ9¥‡ØŒê*ª˜‰j̃ZîS™‰kß [ïS¯Ó×ö™Ó«‡“ÍjÑÓƒ¾‘Á¹³Æ«‡“Íj­½¼ơº«‡“Íj±Ôª»€å̉ å̉ íÚ«ä₫“ƃvÛ«‚ ½9‰±ĐØÏŵØÓØă§ô‡ŒÁ̉Ø× ¦éùן֪ÚÍË)éÛ9¥›¾ƒvŸÈéºÙÅ뿉רù×Û«‚ ½9æØï½ÛºßÚù׺yăˆŸ;ửĂ¼ÙĂăˆŸ;ͼç‚v´Áô‡Û¶ï—Óá µÜ½€Û«‚ ½9µØÇØ߈ó#çÚÅÓ“Ơ™‰kß [ïS¿±±»©ÇívƒvỂƒ×އŒ™‰kß [ïSƒvñÓͼỞÊÓÛº‰¿IÛ«‚ ½9È̉†›Çå̉ ¢»‚v“Ơàù×™‰kß [ïSÍÓùơá ăˆŸ;ëö¥ºÛƠŷ±»»Đ» “Ơ×̉çÚĂơçmÚª‚ +¼9·Å¿‰Å–Û«‚ ½9ù×Ơºm½Ø¡È«‡“ÍjÛ8¤‡Ö¥@Ÿ}±»߈ŽÍË)éÛ9¥¾́½ÙÁ¼£ƯơêÛ·ÅƠ½Ă±ëØÁûƠßÁÀ¹Ă¼Ù½ƒvûî§Ô¾ß —¶ùë™Û¹Ú“ȱ»Éă™ôƠ9¥‡ÛÄÓƒÖÙ̉Ǽé镌½Û«‚ ½9ׯñÁÑĂ«‡“Íjàù×ÙÚ±»ÏÅ™×ơêÛÀóÇơï»ăˆŸ;ÇÖ£XƠXûÓëöéÚ߈›¾Á׫·3uU¹ÚưÀë™Hï½ù×ù×™‰kß [ïS™‰kß [ïS…öI±¿ƠÜùꆌÙÚù×ïÚ«ÔÂĂù×åĂÚ×ÅÄÓY§Ôµ†Ù½™‰kß [ïS—Ó߈©vÍƠ² †ö0Ç€̃ÄØ›¾¯ÈöÏ̉釘Á¡»ø$ăˆŸ;Úª‚ +¼9ñÓ¿Ø™‡µØñÚåĂºÿÚüÀ«Ú†º£Ơéºû(›¾£ä»ăÁƯÇÖ߈߈ơê©ÇçÚ»̉ßÄÙĂĂ ›­±àéMû×ù×ĂȲƠ¿‰Ù½µ†₫ĂƒvƒƯ‰đ¥Ø­Ä˜êèäÙ½Ù×ơËôê…öÿÚƒÈíÏåÓÅÛÀ±Á9¥‡×ưÀ·Üß„ƒvµØ¡Ûƒá̃ˆ ëÔßÚ«‡“ÍjưÀöơÔơÔŒ¾¹Ú£»«ÔƒvÛ«‚ ½9÷Á›¶éÇÖ›¾·§D ÏÅëöµØ¹T߈¡‹ăˆŸ₫ëöĂ¼ÿ.ơÔăˆŸ;—ˆ©‡¥2ßëMÛ«‚ ½9ÏÅùơÑÄë§›»‡À‡€è/Ö:߈—¾—¶Çâöëö­Ä·ôÏÅ×¾íß»û«‡“Íj­Ö“Ơ©ÇÍÓßÁ±»ËÉ9gù×¥ˆ]1Å“¹ƯNßÙÉ̉ÏÔÙ½ơÄÏԕǃ×äÆŸƠX߈Ѿ¿¡ÈÏÔÆÅÏÔ¡ÛơÔÍĶëö£äš۳Ø9¥‡Ÿ}µÏ¥‰ÍL…§Æ‡Ç÷‡í‡·‡‘×8ç±»óÂÖ¼Û×₫¼Ù½½ߌÛ,ÆØ“Ȥ¯È߈ăˆŸ­Öù¿Ñ`çÚƠí¹Ú߈Û«‚ ½9©Ó™Á™Á¯È‹Ü˜‰j̃ZîS™‰kß [ïSµØ™‰kß [ïSÀçÔÿ¯¶ÊÖĐÄêÏÔ߈«Ú‡ÇơÔçô9¥‡ÁĂ¿ôÅ₫9¥‡àˆ.À0.p.ĺ߈߈á=ơꇌï»Û×ÅÛ¥Ö¼ÔÿÚùêưÓù¾™‰kß [ïSÏÔ8¤‡Öߘ«·3uUçÔ¡äÁ‰Ôëö½€«‡“Íj›¾ơêœܿßÏ̉ù¿Ïįۇ·ÅÁÛùơù×ơêëöù×ÛÄÓÖ¾8ƠóÂéÏ߈߈¦ƠÅçáăˆŸ;߈é¼ưÚׯŸ¯ƠóƒvÛ«‚ ½9™Ø£ôơê×Ơ‡Œ£È÷$³ØÏÔăˆŸ;÷Ú¯¼·‡‘×8çëö Ëûù×°»ưÀÓØëÔ™‡Û«‚ ½9©&‡Çƒˆ‡̀ĂºáêÙÚ£Ô›¶é߈ÍÄưÀÛ«‚ ½9ªÚÙ½ͪơêñí¥½ÔœÁ ưÀëơ±¿ÁƯÏÔ«Ôź½‡º‹É0ÎÅÏ̉½·öÁ¡ÛMÛ«‚ ½9º¹Ú¿ô±»‹àóĂêÓùêÓÅ›¾©‡¥2ßëM9¥‡Û«‚ ½9‡Ç·‡‘×8çÓØăˆŸ;ƒvù×ÿ¯¶·Ô©‡¥2ßëMÅÓÏÅYÏÔ±÷Û«‚ ½9˜‡Ÿ\ɹó÷‡“ÈÁƯ«·3uU9¥‡ƒÖÙÚ½€ù×·‡‘×8ç±»ÛÄÓ™ĂË̉ăˆŸ̃ÁÑĂØÚơèÅíơê›Ú½Û«‚ ½9¹ÚÍ­H©"³Èß»ûƒ½°»å̉ ËÉ9…¼ÏÅÉ̉±»ÑÄëƠÄÿÚ™Á™ëéåƒv±»±»ÏÅéêßÄÙƒËÓû¸£,©Ç±¿ƒvœ‡ ÛñÆăơ¼ô߈ơêщ«‡“Íj§Ó‡ÏÅó½™Á÷‡Ù½₫ÍƠÉŒüÀá=Ù´†ív…ô‡x³(Ÿ}ÙÚÛ«‚ ½9ăˆŸơꇺå̉ Åô¾ß߈ß»ûăˆŸăà‹Çá§ôÙ½ÍÇÓÅ—¶«‡“ÍjÛù‰ư÷ù×­Ø©¾í‡ƒvÂÙç̉ö­ÄƠí¥Ø•ºéØ«‡“ÍjÓØÏŨÇñÚ»ăˆŸ«Ô™‰kß [ïSÏÔؼ&±&÷ˆëöÛÀôĂưĂÛñÚËÉ9ùשƠÁƯ¾ỞóÔƒv¹ÅÄÏÅó×—̃ÏÅ­Äù×™Û«‚ ½9™‰kß [ïS²ÂµÜ£äϹ«Úô «‡“Íj×"ưÀ«·3uUßÁơêƒvµĂ˜‰j̃ZîSăˆŸ;öÁƯơÛ«‚ ½9åôˆƠ‹Ù­v¨¼º‚vÑè§ôçØæơרùêå̉ Û«‚ ½9Ž­Äơêͼ߈ö°»«‡“ÍjÂÙ§ÆíÖÔX…a’È÷Áù¿áÓº™ëéåăÇíÛ×™‰kß [ïSÛǹÚÙ½¹ÚñÙưÀù×ÏÔ÷Á©ÓÛ«‚ ½9ª¼¢ÔñÚ¹à÷‡óÄêԓƵa9¥‡×¿ÛÄÓô ß½­Ø«‡“ÍjŸÈ“Ơ†Œ±»Åÿ¹ÚÛ«‚ ½99¥‡×é‰ñ5ñ·«‡“Íj³Û«‚ ½9ÿ.ÇØ›¾¥Æ߈Ÿ›£Ư™‰kß [ïSưÀ߈ºßÖ¤Ó˜êèäÁƯ«ÔªÅ¶ÙŒë*«½ÙÚÿ¯¶¹Ú߈·ÜÛ«‚ ½9¨‡¤2€̃êLÓūԂÁÚ¿ºƒv‰y9¥‡߈ƒˆǼµØ›¾Í…Ö»÷‡«»ÛÄӃغnÛ«‚ ½9ó‹¡ÔµØç$Ûº«‡“ÍjöØÅê‡ÇÚÅÔĂ½«Ô߈Ø×ÛÄÓ§ºÅÓ™ÔùשإÙÅÔÙ½ËÉ9Á׃çÚ™‰kß [ïSǼÏŧô½ô«Ô™Á©¼•ÑÓ¹ÚŽƠ³Üß„©ØëÚơůG‹ø¹Ú½€Ù½«‡“Íj«bóáăˆŸ;ùÚëÚ°»£̃™‰kß [ïSùêơăvĂº߈Ù×ơê£XÓ¾«‡“Íj«Ôö´a Ư·êª¶2tTĂº½©¼Ơª»ăˆŸ;ÂÙ釙‰kß [ïSÿ¯¶çڷر»°»ªÚÎÅ×Ơ½€Ï̉›¾“ÈÙÚó׃ÔÀĂ“ƠèơEơÙ—Ó̉Æă½ÙÓƯ‡ǭÔ匿NÛf­½¼ºÙ½‰º›¾ï½à=ù×÷Áå̉ ÿÚ±»Ïڕǰ»ÏŃˆ¹Ú›–»§ÈßÁçÚ«‡“Íj±» Ëûù×ăàÀ¹9¥‡ÁƯăˆŸ;ơèÅÏĪd©Ó™‰kß [ïS›¶é«ŒÓÅç̉÷Á߈±»‡Œ¿‰½Ø£‡ÜÓ ÏÅë§ Á£ØƒµØÏÅÔ÷Áß»û¯G‹ø©‡¥2ßëM·Ô±»½Û«‚ ½9µØƒÖÏÔöÁ¾©¼߈¥"½€½Û«‚ ½9•¶©)ơêºóÓ߈“ƠûƠ•Œ½¿‰±»½±»«d Ơ +…Œ³à³(麵ؽ½ơê¡Èº½ĂËÉ9™‰kß [ïSÓ¾»‡û·ÜựăˆŸ;kÙÚ‡ñ5ÅˆÇ •Œ̃Á±»´†™‰kß [ïSùׇÇÙ-«‡“Íj›¾ÏÍÓ“Ơ°ï‰¡Èùêß»ûăˆŸ;ƯÓ ¿ô½ٌë*«ö¯¼½ưÀר’‰Û«‚ ½9™ÔĂÙéÓăˆŸ;ë¼éÓ™‡•Œçô×¼Ù#ÏÅÚª‚ +¼9܃׹ÁÛ«‚ ½9Ù½®ÈăˆŸ;¡רĂÙ÷Ô·ÔÙÚ£ÇÓ½ëö÷ÚƒÖ§vƒÚ“ÇÙ₫Û«‚ ½9‹ÜÛÄÓïôÍÓÏÔ›Ó™‰kß [ïSƒˆÛ«‚ ½9™‰kß [ïS‹Ç´a³z­¾ËÇĂ߈ñ©ĂÙÚª‚ +¼9™‰kß [ïSÏÔÁ̉ăˆŸ;k߈Áƒ½«‡“Íj–¾ÍË)éÛ9¥üÀ±»»¹ÚăˆŸöµÈ¹àƒˆ›·ÔơêëơßƯ™²½Úª‚ +¼9™‰kß [ïS̃Á¥ˆ]1°½ơÔÛ«‚ ½9ăˆŸ;kÏÔçñ”™‰kß [ïSµØĐÓ߈Á½·‡‘×8ç¯ƠÂÓ¬ÄíÆÂ·Ó ¥0±»ר·ÔµØỞG½¹ÿÚÑÄëÛ«‚ ½9¿»½€Ư“ȃ»½½ßϧ¹₫ăˆŸ́ÅØúدטÔƠ؉j̃ZîS¿ÅÑÄë‘ÆëØưÚ±»™‡›¹±»ë×ăˆŸ;ƒv™Ó›¶éñÚÓÅ¿ơê×¾%8 ¤‡ ×±»€ºëö‡ñ5ƒˆ¹ó±»ăˆŸñÖÁ¥{ÙÚƠÙ½ƒˆ‡¿ÙƠ‹ÛÙ×­ÄíÁ™‰kß [ïS‹Èÿ¯¶ÍÓ ¬°àèM‡x…»å̉ ưÀ™Áß„í‡á€߈­Ä±Ô«‡“Íj·Å›¾±»·Åß»ûÅØ™Ô›Úùꘉj̃ZîSÅØßÄÙºy#ưí¡Ù‡Ú¥Æ±¿ÿ‡Û«‚ ½9•Èû›Ï̉›ÛâḈ£Øö ơÔ߈ÏÔ˜êèäÏÔƒvá¸ăˆŸ;ÑÄëîÅÏÅăˆŸÙש‡¥2ßëM·ØßÁ™ÔÑÓ‹«‡“Íj‡«Ô‚™ëéåÓºªÚ ù׿çÛÄÓ‘ë¡Û‹Çùê·§D ÏÅù×́½&°½ ăˆŸ½€™‰kß [ïSëÓ±»¡Èù×́$Û«‚ ½9»½®¾̃ˆ½Y‡©à¼ÎÏÅÏÔ±»¹Ú·Ô«Ô™‡ϼÍŒƠêơß»û«‡“Íjơ8¤‡Ö¯ÛỂ—¶–ˆ©¼—¶íØù×÷Ô©¼…Ú½½Ü¡Ơï»§ÔçóÏÔôÏÔÿ¯¶˜‡ÏÔÏÅĂĂ ›­±àéM̀Ê)èÛ8¤µØ­Ăȃ×ÛºÚǽӾÙÚ³ÜÏÔƯº™‡Ç%—»ï‡‘÷™‰kß [ïSƒÙăˆŸñÓƒv—ÖưÀưÀɇ©‡¥2ßëMÙ½µØ₫Û‡j±”ơèųºóËÔÛ«‚ ½9Á¹±»ÂÙÆ× ­Ä½ÛºÙÅ뺋ÇÓÅ×Ơ™‰kß [ïS°»κ7ï»đĽµØßÁñÓóÂá¬ÇĂëö9¥‡×íºØÓ é‡ƒˆ8¤‡ù×ÅÓº½­Ø¶×Ơơꆺ‘úé‰ñ5ñ·Ó؇俽ÂĂÙ©¼ùוÈû›ÿ¯¶߈ƒv9¥‡ưÁ­R÷‡ß»û‡Ǽ˜ ê è ä “Ơ—·‡‘×8çÁ¹ÿÚ¿»ËÉ9ÛǺy#¹Ú½€“ƠÏ̉9¥‡·Ôơúÿ¯¶ÅµmÅ̀¦ÓÏÅ̃ˆù׫‡“Íjëö™‰kß [ïSÔ§ôơÄơế$ưÀÁƯ«‡“ÍjÏő֣ôÅØ¾¹Ơ‹Ç…«»‘÷Úסș‰kß [ïSơÄĂÙŸơæÇºyƒˆív²ëƯ‰óÇñÆÁƯƒvëö´†“ƠÑÓ‡x‰Ô§Çփ׽ÔÏÔ°̉Žï»­¹ÚÏÔ™‰kß [ïSơêƯÓ ƒvëԣث‡“Íjơê߈³ÓĂÙà¹Ú‡¾ÚÄ̉ÏÄ÷Á›¹öƠXăˆŸ­Äº¡̃ó™‰kß [ïS¶  ¥ÛÛ«‚ ½9÷¼™‰kß [ïS£ ¾¡È§Ó¡ÁÏÔăˆŸ;߈ßáñÓù׃֣X˜êèäÏÔÇÜϺ»Ăù×÷ä5̉íê߈Ǽ߈Ù̉µØôç¿«‡“ÍjĂÓ®Ơ£»±Ø±»ôê¹̃ÛÄÓĂèºÖÔ†6¦jÏůG‹øÛ«‚ ½9ÏÔ´†ơÄ»ÁÍƠ߈ø¿ÅñÚÙ*éêăˆŸÙÜÅÓÙ½Ǽ߈‹ÇÁ¹å̉ ÅÔ¿‰±»‹ÇỞ±̉ù×¹Ú“Ơá ‡ÛÛ«‚ ½9ưÀ«»Û«‚ ½9¦ô·̣ĂĂÛˆù×Ù½«Ô©ÓĐÄ ê Û«‚ ½9ơ깣匿NÚ×ßÁ¹Úá¥<χơÙӱ»±»ăˆŸ·‡‘×8ç÷ٗәੇ¥2ßëM‚vÛ«‚ ½9ßÂÁĂÓÆ…öÏħôº÷ÁÍË)éÛ9¥ơéÏ̉µ‰ÛÄÓÙ½î»óÏ̉§¹«‡“ÍjÙ½ơêÚ ª ‚  + ¼9 ÿÛ«‡“Íj‚Úëö…Ơ›Áù×­¼©ÇµØô»™‰kß [ïS’Ơ‰-ÏԓȺ«‡“Íjç̉µóëö¼€ĂÙáê±»ï½ơÔù×ÁĂ»ØơÔÛê‚Ú”ÖôØ¡ØÏ̉›¾ùת‡’̀jù׫ÔđÆÁÚáƠ©¾§àíêµØư“ĂÙÚ»öÏÄÇù×߈ׯ«‡“Íj‹Ç±»çÚæ’¶ÔÑÓÓÆÅƯÛ«‚ ½9ÍÄÓº¯È£XÙ½ăˆŸ;Ơ¢ä¶Ôg·‡‘×8çÅØù¿ù×ƠÏÔ³×Ơij1ÙÚưÀÿ¼ƒÖùê£Ư™‰kß [ïS¿¹«·3uUϹÅăÁ™ÁÙYÏÅÛ×ù×ùꓹƯN²Â9¥‡ªĐÏÅ™‡™‰kß [ïSŸÖ¿‰ö‘࿉̀LJڥˆ]1Á½ÑÔÓ5“gesÁÅ‚¾ö‡̀·ÜöùơÂ߈ÑÓÙ½¾ơê«ÚÏÅăˆŸ;—¶íÚëö»‡ÜÏÅ—»ÑÓö´Î«‡“Íj÷ˆ‹Üö™Ø»Øá=Û×¥ÛÍÄ̃ˆÏÔơÔăˆŸ;ÙÚ±¿­ÄßÅØ½™ÓµØó#ưÀ½ÈĂÙ±»ƯÓ ôăơƒØöÁ,“ȉ¿IÛ«‚ ½9çđ9¥‡ÊỞÅåÁûƠù׿ §Ôº‚¾9¥‡×‹Ü“åĂăàĂÙÙÚ‚văˆŸåÁ­ôóÂăˆŸ߈ơê°½±»ăˆŸ;ÁÛÏ̉ø¿ÑÄëù׫‡“Íj¶‡Ö8惴™‰kß [ïS—¶‚v³ôÖØÙ×ö«‡“Íj»Å¼÷‡ш·Ü›¶é¡Ơ£Ư ®È…Öé‰ñ5ñ·ÿ¯¶±»äơꘉj̃ZîS÷ÁÚª‚ +¼9«Óù××¾ƒvç¡«‡“ÍjÙŒë*«ƒÔ匿Nù×ív™‰kß [ïSÛ«‚ ½9䌾NƒÖơÔÏÔơê™ÓÔµ›ÛÏÔ§Ô©¼ÅØăơơÙ¯¼µØ‡ŒÍB§ÓµØÍưÀ˜‰j̃ZîSרôÏ̉“ÈÍË)éÛ9¥ưÀ‡ØĂåÛ«‚ ½9¥Ó”Èúƒàƒ×ƒvơêÙ½±»íêêڜ£Çí$©Ç¯¾4£Ø›¾Úˆ…Çÿ×߈ĂÈå̉ «‡“ÍjƒÚ“ÛơêË̉Ó¾߈߈ƯÚ¿‰­È±ÁÙÚÛ«‚ ½9«ÑÓº—¶ Ơ™‰kß [ïS¼™‡Ù̉çôËƠóÂî»ƠÛ«‚ ½9›ưâù×ô·Ô«Ôù× Ơ§ô¸Ú¬€©Ơ˜êèäÏÔÏÔëö«ÓáêÍÄñÚ§¹ ÛĂÙƒ‹Ü·‡‘×8ç±»ƒv§·ÔĂÄôù×™‰kß [ïS˜‡™Ôù×ĐØ€ƠçÚĂĂ ›­±àéMù¾éº™‰kß [ïS¡Ô±»«‡“Íjơ¾‡¿½ă‘·ĂÈö¼­Ôº™Ó¢Ơ½½€Á½¡Ô™‰kß [ïSùê½Á½ù×߈¡%́v²zé§Øƒˆ–ˆùןÍË)éÛ9¥”{Ó´·̣±»É̉ÙדƠœ‡³ºóÙŒë*«Ùסȗ¾³ºó±»ÁƯ¾ív½ăˆŸ;£Ø·µăˆŸ;£Øÿ¯¶ư“í—GƒØ››ÿÚưÀ߈»ô’ȷű»Û«‚ ½9ĂĂ ›­±àéM™ơÁ‡é/×:ơèÅ÷Á¼£äƒŸ\ù×ßÄÙÛ‡ÑĂ³ƠëÔéꇌׯçLJxÛ×ù׋ÛÑĂåƠ‡̃ÎÅøê©‡¥2ßëMÏÔỔaƒv™‰kß [ïSưê±»™‰kß [ïŚvë ÛÀ¯¼½¥ˆ]1«‡“Íjù¿°»½Žù×·‡‘×8çX½€߈©¾µ́ÏÅÛ«‚ ½9á꛾̃ˆ߈ëöÜăˆŸóÇ·‡‘×8ç¯ÜưÀû×™‰kß [ïSù×ó#ÓŧÆăˆŸÿ×ÄáêÛ׺y ³!ÏńֽרƠù¿Ê¿ëö·Ôçô‘‡ÇÖ±»©Ơ雾›v́vëöÁƯå̉ «‡“ÍjÍĂÁĂù×¹½Ơ‹É0ƒ×₫®¶Û׃v›¾Û«‚ ½9³äÖ«Ô³ Û×Ël™ĂÇ»½ØßÄÙÛ«‚ ½9ăà‡¥ˆ]1Ó¼ÛÛ«‚ ½9¼·Üû̉߈æØ9¥‡Ù½é‰ñ5ñ··¼Í7½Û«‚ ½9ñÚ±»÷‡ô÷‡û(ă½ƒ»‡©ÓÏ҄ګ‡“Íjí‡¿ëŸ ĂĂÙƒ×ÅÓƒÑÓ‡xí竇“ÍjÄÓ—»™‰kß [ïSôê·‡‘×8çÅÓÏÔåĂÏÔÓºĂÙÙŒë*«ívÛÄÓ™‰kß [ïSăˆŸơÔ¨Úª¼"ÛÄÓ÷å5Ó±½Û«‚ ½9߈©‡¥2ßëMƒvÅĂƒ©‡¥2ßëMÓºƯơ™ÓĂ¡ñçÚ½ƒˆÁƯ¥ÆƒvÍijºó…ØóÔóëö›Ùÿ¹ڨ‡¤2€̃êLá¬ùסÈÏ|ƠX匿N˜‰ j ̃    Z îS ÂÙǫԫÚÛºƠÓÙ©Ÿ}ù×ÓºÏÅñÓăˆŸ;º½¡ßÏŽ‡ù×™ÁùꙇªØàê߈ó‹ǩ‡¥2ßëM˜‰j̃ZîSÓöÁ ‘éĽ˜‰j̃ZîS•Èû›ß»ûÛ׎±»Û«‚ ½9ăˆŸÿ¯¶ø¾Û×ÇÓºùׂv§Ô­Åï½ÏÅá=ÑÄë±»ÿÛé‰ñ5ñ·ÑØ—»÷Ù™ÔáÛăˆŸÓÅÛÄÓ±¿·Ø‹Èº±»§ôăàæỔ‚‡щƯ.8¤‡Ö“ȧÆÏÄá¹Ú¥ÈåƯ³¹ÑÓ¾Ϻ̣ÇÛƒçÚ±»ÓÍ·Ô…ØăˆŸ™‰kß [ïSơÔ‰ï߈ƒví—G¯×›™ëöÇu¹Ú­Öÿ¯¶™ơöơĂƠÛ«‚ ½9ƒvÚÀ/öÇܱ»ÙÚ»̉ÏÔ™Ô›‰ăˆŸ;k¾«ÔŸÄ±»ßÁ°½ª‡’̀jù×óÂÓÆ›ù×±»ÙÚ½ƠÏÔ9¥‡×©Ç«ÔăˆŸüÓÍÄÏÔź½³ÈÅØù×¶«Í9¥‡ßø­ÄăˆŸÓÆÚ×߈ƒ›¡™‰kß [ïSÄÄÚª‚ +¼9³Ü±»­Ô‹Û«‚ ½9¹ÚÇÖÁºëÓÀĂχï»ô¡Ôÿ¯¶ùדƠéêÏÅĂÓÆ—Ó±»åôå̉ ï½ÏÅëöñÓñÆׯ›Ú߈›ÚĂÙÇÓöÁ߈ö«‡“Íj·‡‘×8ç‹¿ăˆŸ;´aŸßøêª¶2tTó½ÅÓöơèÅ«ÔÅôù׫‡“Íj§ÔµØ‚ÀĂù×ëö½€ÿÚ¥¡߈Ư‰–¿ûƠÍạ̊ØÓÅ£ä‹Ç™‰kß [ïṢ¶ĂÙÛ«‚ ½9³ƠĂÙ™ÉÏÅ£äå̉ ‡ŒơêƯº§ÔϺÇÖ±»­vÊÓߌÛ,ù׃vï»™‰kß [ïS—ØÅê“ƠưÚÅ»™Á…Ö¹ÚăˆŸº Ö†‡ü2óÇóæö±Ưôê ưÀ¥ºËÇöºy +…±Á±½­Ø¡Ô«‡“Íjह̃ăơơĂ´††Œ¿‰ª‡’̀jăˆŸ;±»âˆ;«‡“Íjä̉  Ô]áÔĂÈ­7µaáꙇ¿‰­ÄßÁ±»çđ߈ôưÀ›¾ÙuÓÅ©Øƺ÷ÁăˆŸÏÅ›¾ÁƯùשÜăˆŸ›¾ï½ƒˆ߈Á½̃„ Å™ÁíÓ¡ÔÁÛ«·3uU¿èƒv¹Ú¹à¼“Ơùê½ëÍĹÚƯÚáç±»¾ÛºÁ¼ă»ÎÔûă±ëØÛ«‚ ½9“Ơ߈ׯíê³ß$ƒÁ̉ëÚóĂ‰Ûµ‰áÓ±»ß„çĂ·Å´a¼·Å±»µa™àù×»ƯÛ«‚ ½9´†åÁư“ö̃ÄØׯ±»ăàχăˆŸăˆŸ;‹Ç˜‰j̃ZîS›Ú™ÔáëëÖ—¶ăˆŸ;±»ï»›ƠÁă±»Û÷ÚÛ«‚ ½9ƒvÏÔöÛÔùׇŒá щÛºöÔó¹¡Ô›vƯÓ “¼±»¾»ƒÖĂÏŇÂÙ©à×¾³ºóÅØ»‡ƒv°»Å؛ԓëö߈£äñÚÛ«‚ ½9ơêϺÏÔ±éÅØ¨ĂÍÓ±»ëöÓÁ´Ă™ôµ†­ÔÍÓËƠÂëöÛ«‚ ½9ÿÚ9¥‡ÏÅ•ŒÅØ©±»Ă ÁÅØ½€™‡Ø½Èá ½ˆăˆŸ;»á¬±»9¥‡×‘¾åÁÍË)éÛ9¥ăơéơÿÚÛ«‚ ½9Äô¡\₫®¶ù×î½ơêÙ½ỞĂÈÏÔßÚ™‰kß [ïSăˆŸ;k³ºó¬ÄÛ«‚ ½9ÏÔ¯l¿‰߈—¶̃ŒÚ,ÍÓÏÔÙׇŒëçÏÅĂÈ‚ƒ¾‘Á̉ç4߈ƒvö£ØßƯµq•Ù½àƠëöĂºÙ½÷‡ñÓ¹”Ö¾8çÚơ…»·‡‘×8ç‰Û9¥‡íê˜êèäÇ%‡ÛºăˆŸ;ÛÄÓÛ«‚ ½9߈’‰’2’’Ô,’ø’†“¢Ç½߈ïܽĂ軽ëöÿÚ‹ö¸½çÚ¡»́¨§ôêÓ÷Úëö¿‰¹xáØ߈ÚÀ—»¹ÚÅØÇÖß»û½£Çù×ûØ™ôẳï»Û«‚ ½9‡ñ5Ư‰Ü·Åơİ»£äÛטÁÏÅÖÔ†6¦j‹Ü½Ớ¡ÁÆƠX̃ˆ£Xù¿ÍÄưŒƯº÷¼ÏÔÏÔ™‰kß [ïS§Ô‚ăˆŸơêêö¸Úç4“Ơ©‡¥2ßëM×ƠÍË)éÛ9¥ƒvùêăˆŸ;ếèñíÈëöؽ·Ô›‰ù×ËÇ»ˆ›¶é±»ÈĂ÷Ú̀Óëöù×ù×å̉ ưÚ¨¼Ö¾8÷ÚÚª‚ +¼9ëÚ߈ôÆĂßÄÙÙ½Û«‚ ½9¼€ÈĂ‹ÇïÚµØăˆŸ;ăˆŸ;öʹ“ÈÂÙ́ºÍÄĂÙă࿉߻ûÏÅíê±»ñÚÿÚûƠµaŸÜƠăˆŸ;ƒÖ…Öï½ÆôĂÙ®¼ơä̉¯¾Å₫ăÁÓÅ–Ó¨¼¥ÛïÚ÷Á†½ù×ö÷Ô߈ÅØôĂÿ¯¶±»Ă‘Ö›¾ƒvщăˆŸ§ÔĂÓ¾³ø$9¥‡ÑÓñǘ‰j̃ZîS“¡Ô™̣¹ÚÑĂɱ»¾ù×÷Ú©¼½€åºϹ‹ÜƠXưÀöÁ‡é/×:—ºÿÚ½¶èÏÔ˜êèä½ÏÄÏrµØ§ÏÔᨺ#ç̉ĐÄê÷ÚơÔ×¹œÂ8¤‡ÖÆÚª‚ +¼9¦ồÓ½§Ó„ÁƯĂÈÛ׋Çơʉj̃ZîS·̣ÏÅơÔµaº½›¾«‡“ÍjÙ½™‰kß [ïSü̉•{ÍĂ—¶ÁĂÅØêơ®Ơçô«»ĂÚßÚù׃vëöߌ¦́ù×ÏÔơêóÔÿܘ‰j̃ZîSÏ̉¬¾ÎŃư›Ûåô¼€ù׃ˆ±È³¾ƒvơÔÛ×™‰kß [ïS‚v¹¥<ÓÅăˆŸ;»Ø±»9¥‡¿Å÷‡—È«‡“Íj½¢»³È¿ßñ»Ó̉Ù̉ÏÅ·Åá ô¤ÈÙ½¡Û§ù×̣±»«Ô«‡“ÍjëöÑÓÁñ»ûù¿å̉ ¥ÆÂÓóÂơèÅ¿ºÛ«‚ ½9Ï£ä˱«»“ÆăˆŸ;ö³£ä޽ôʳ + ËûÏÅ߈•Œ²¹Û«‚ ½9ëÚ™‰kß [ïSÏ̉³ ̣ǯȔ߈‡ºª¶2tTơØ•¾߈ƒˆ§ô¸Ú¶Ôϼ¾ËÈÑÄëÅÇŒºÑÄëÙÚ‡ºöÁëÔå̉ ï»±»ÑÓßÁ›Úß»û̉Å¿ôÄÓÙ½ÅÓóºܧԫ‡“ÍjÇ +ªº ¡Á³È«ÔöÁàʼn۱»±¿ăĂ3ÍË)éÛ9¥ÁÓ±»ù×ÎÅѶ¹Ú„ùôà½8‡ä­Ñ‡“ï½ÙÚ函€«âÍÏÔÛ«‚ ½9ñÚ¯G‹ø£Ø¿‰ùêÁ̉ăˆŸóỖˆ±»Û«‚ ½9ÿ¯¶¥Û‚ˆÚ½©Çù×Û«‚ ½9Ï̉¿ºÙ½áÛăư™‡ÍĂ¾»Ç¿º™‰kß [ïSÁƯưÁ™‰kß [ïSûù¡È±¿ÅÓ匿NöưÚ™‡ÝÆ₫éêăˆŸ;ÑĂăˆŸ;±»ÑÓñÓ÷ÁƯÀ«Ô™‡¿¹çÚ¿‰ƒ½Ñ÷ÑÓ߈9¥‡—ˆÙÚ·‡‘×8çÇăˆŸ;kơêÍƠù×½—¶ÿ¯¶ÿ¯¶ëö»nù×–ˆơÔỞĂËÇ™ÓÇÖ›Ú¶ÏÔÛ«‚ ½9Ù½¥ØÛ«‚ ½9߈Úª‚ +¼9‹ª-߸Û«‚ ½9Û«‚ ½9Ñ¢±»™‰kß [ïSø×̣¶ù×ưÀÓº£ä‡xÙ½Äøå×ĐÓ™‡ïÁ÷ˆ¹ÚÓżô«‡“ÍjψÔ“Ÿ́‡ÇßÁ‡)ÏÅŸ\ Û¥Ú°» +­ÄăơïÚưÀÅÔ…Ôß̃½Ôׯ̣ħԷŶÔíÖÅ»˜êèäÅØéêƒv·ôùÚíêß»ûéÓÛ«‚ ½9©&•ÇÏÔÅ»å¼ ĂÙ©¼¯×¿ØƠùê߈Ù½ß„ăˆŸ;ÑÓ匿NëöơÔш›¾™‰kß [ïS÷Áª‡ +’ +̀j +·‡‘×8çÓ̃âˆ:kÍÄù׵؂vñÖĂÙ±»±»Ù½™‰kß [ïS̉Á Äô“º™‰kß [ïSÁƯ‡øÛ«‚ ½9‹’ô§Ô’Ç߈¯G‹ø±»Âٻș‰kß [ïSăˆŸ³–™‰kß [ïSµØơêù×ƠÄ̉Øù×»̉߈¥Ư½Ÿ}ëö×¼µ†µØăºÍÓÆØ÷ˆ₫Úâ +Â3 « ©ƒ»5÷ÚרÏÅăˆŸ;ÂíÆù×¥ˆ]1ƒ½ùט‰j̃ZîSĂÓ³ôχÿÚ«»Û×›¾Ù½߈«ÛƒvÛ«‚ ½9‹É0—¾ăˆŸ;ơÔÛ×ÙÚ™àØ×ÛÄÓƯ¤9¥‡•™ëéåívÖÆ ©¼ĐÄê÷Á÷ÁáQưˆËÉ9³n߈™ù땽Á¹ăˆŸ;k¼Ă‘Æ›¾£ÇÍġԧӇڹډ¿I×*ÏÔ¡Á‘Ö»½çđÚª‚ +¼9ªĐ“ת‡’̀j½ôơÔÛÓ½Äٵ؇aÜÏÅóǽôöÁÛ×éº߈¹Ú‚v¶‡¹߈µØù×û¥ˆ]1Ô×Ó߈ù×éÓ´†ÛÀ«ÑßÚ†×ç̉ÏÔŸ»¥ˆ]1½üÀ—¶ëöÁŸÅù×—¢¿‰ÏÔåƠŽ©߈Û«‚ ½9·‡‘×8çÑØ‡Œ´†½‡×«‡“Íj«»ăˆŸó#›¾¯ÈÛ«‚ ½9¼ôù¿ÑÄëù׃ÎÏÄĂÈ»¯â¼ +ÙÅë½è·Ñæ“ÈÑÓ˜‰j̃ZîSµ†“ë™)ÿÛ߈›Úï»ÿ§™‡½ÏÔëöëÓíê¶ơèÅƯ‰¯G‹ø̃ˆơêƒv§Óùơ™‰kß [ïSÅÄ߈ƒ×ƯbăˆŸ;ÙY¨ƠïÚ»Ă߈µØă½Ü߈ù¿±»¾¿‰‡ß„©‡¥2ßëM‰¿IơÔ£ä߈±»ƒ×‚ˆϼ³ÏÄ@ ¯¾÷Áä̉ + +á=ăˆŸ;Ăă¹ÚƒÚ—ˆÀ¹ööÁ +ơ걿ÀĂÍÄŮӓ¹ƯNÏÔ›¶éщø×÷¼ă½ÎÔôêívé‡ơÔ°»ỞËÉ9ÅÓĂÙ“º½ÂÆ™‰kß [ïS—»ÅÍË)éÛ9¥ÏÏÔ˜‰j̃ZîS·Î£Èÿ§ÙÚĂƠŸÈ¿‰Û«‚ ½9…ƠóÔ«±©Ø‚ÏÅÜÚׯăˆŸåŒ¿Nÿܽ²µØ™ÁưÀéºƠ«‡“ÍjÑæÍÓÍƯ÷ˆ¡È™‡ùêëö¡¹ÚơÔ¿ß§Ô™Ô£¿ÉóÏÔ™‰kß [ïS©º¼€©Ø£Øù×ÏÔ«ÛÅÓ·Ộ¶ĂÙ9¥‡ç°đÓÔX™‰kß [ïSƒv±»ĂÈưÀ“ǽ­vưġ۱¾Ơ×¾ƠºmÛÄÓÑÓ·Ô¯¾±½óÄù¿Ö̉Ù½ÍƠÛ«‚ ½9ĐÄê÷Áÿ¯¶ï™±»Û«‚ ½9ăˆŸÛ«‚ ½9•Èû›̃»úÿ¯¶˜ơ½9¥‡óԜܹÚÁùêïƠƒw¡Û«‚ ½9©Ó•Öåô¯Èÿ§åÖ«‡“ÍjßÖăˆŸÑÓ§Ô‹Ó­ÖÛ«‚ ½9½€ÑӡȽ«Ô߈™‰kß [ïSéÓư“Æ̉‰ÛÅÔëö“Æï»ö©Ü烈ûÙ‡ÏÔµØÑÓ«·3uUŸÅˆ‡ºØ¡̃ĂĂ ›­±àéM›¾©‡¥2ßëMÏÄĂ«‡“ÍjßÄÙ߈ƒ½å¿ưÜâï¥Ù©ƠívͼÑÓÆÏ̉¹Úщơ»߈‡ºưÀ«Ô¿Ù½û̉ăˆŸ¹ÚÖØ₫̉ºưÀ¦Ó +Äơê„̃ưÀ«‡“Íjö¡ÁƒˆĂÙùêơ$ß»û©ëơ·Ó ¥0ÇÖËỜ¬H“Èר߈°»ăˆŸ;k‰đ­ÔŸ̀—Ó÷Ô߈›Ú9¥‡¾ßÂß»ûùׇ߈©‡¥2ßëMăᡵ¡ÁØY8 +¤‡ +׿ßö’¹ÜNÿ‡Ù½Ç̉ÑÓ9¥‡½/ÁƯ«‡“ÍjÏÅă½ŸÖ±»ưÀÇ»«‡“ÍjŸßăˆŸ;ôpç4¿×½Ă—»Ïŧôʹ‹ÓœÚ +­Öù×ëö…»Ă›Û¾߈ר¹Ú¿́ÂÇÖ—¶ƒv°”ÅÔ±ëØµØÁĂÿ¾¯³9¥‡ÏÔÓ̀Óëöƒvùêêö¯Èâàëëöº¼­Ä߈²È©Ơ·̣Ô½¼Á2Û«‚ ½9߈߈ñïÚ™ëéå±»ø¿ăˆŸ;k™‰kß [ïSÚª‚ +¼9™‰kß [ïS£ä½Ù½ĂÙ™ÁÏÄÛ«‚ ½9ăˆŸ;匿NăºÛ«‚ ½9‘Óƒvô߈ËÉ9ÇÅÇܣǃÚÛ«‚ ½9߈¡Èµa8¤‡×9¥‡¡ÁÅÿÚù×½¹ÚƯÓ ùê“ƠÙ½˜%üÀăˆŸ;¿ô‹Ü–¾Û«‚ ½9¹Ú»‡ùêÖ÷ˆ‘«ÇÖ³¹±»ÇÜÛ«‚ ½9Å»‰Ô‘́ùô$±»ßÚ™‹Ë̉¿º½üÀ­ăàÁÚéÓÏÔ‘ÚĂÍƠ×ù₫®¶ÿ¯¶ưÀ—`½‹ÜÛ×ͽÂÙÛ«‚ ½9£Ư»ô‡“«‡“Íjù×±»ù×™‰kß [ïSÁƯͼ’¹ÜN™‰kß [ïS½×Ơ±»¹—éÓ«‡“Íj÷Á̀Ă¡»ù×½€å̉ ₫§ï³2™‰kß [ïSëÓv¼ô±»ÏÔÙÚ—»å̉ ­ÖÿÜÏÔ™‹ÅØ—»ƯÂßÄÙƒvµØ±»ÑØơļ‘ÖÅÓ›Ú̉̉×ÏıëØÜ½‡xù×ÿÚ§Ó.û̃éÓ“½ÍÁƒƒv™‰kß [ïSơ߈—¶­Ä’Æ"•ÇơÔÀ½ÅØưÀ¡hù×ßÖ÷Á¾Ù×¶«‡“ÍjÿÚŽơêù×Á̉á º½ ´†“Û÷Áä̉Ụ̀ó#ÉÙÑÄëÓ̉¯ÈÿÇ»˜‰j̃ZîSưÀÏÔí‡ù×¹ÚÛ«‚ ½9Ă…Ûơº©ÇË̉¼©‡¥2ßëM›¾¹Ú߈¯ú¸ÇĐÓ³ÅÜẳÛ«‚ ½9øêß„ùסƯ¿‰™ëéåơºơêĂÈơº߈ÙÚ‹ÜëöÓ‡רµØÙÚ¿‰Û«‚ ½9ÏÔÏÅ™‰kß [ïSƯƒˆÛÇÁ¹Ó̃ÁÙÛ«‚ ½9Úª‚ +¼98¤‡§Ó¿»±»·ÔưÀ¤Ó‡Úå̉ €º™‰kß [ïS«»®Ó ù×¼ôëö¯È°»·ÅÛ«‚ ½9ƒv™‰kß [ïS¡ÔÓÔơÔ™‰kß [ïSƒvä‰ÿ¯¶¿ß¯̀ưÀÛ«‚ ½9Û«‚ ½9¯àùê§Ôû¼¾º߈Û«‚ ½9ơº¯¾©‡¥2ßëM³Œå‡Ï̉½°» ¸Á¦Ô×¾çÚưÚ×Û«‚ ½9˜êèäÇØơÔ÷Á§ôÁ̉ÏÅ«‡“Íj±»ĂÙÁË™‰kß [ïSÛÄÓŸÓÍË)éÛ9¥ǼÛºÛÄÓÑÓ­«·3uU‘ÆÛ«‚ ½9µØ‰¿I±»ë¦Ϻg½€Û÷ÁĂù׿)˜‰j̃ZîSöꓹÜNí—GíꡃˆÓÅ‹ÇÛ¹¿èÙÚ±»ÇÖª‡’̀j‡ÇÅàùÚăˆŸ«‡“Íj‰Ô¿ÅăˆŸ;æØëö‡ÇʾÏŽç÷Ù›¾›¾¥‰ÍL…ƒï¡È÷Ú±¿߈éêơÔÿ¯¶™ÁÙê½¥ˆ]1™‰kß [ïS·‡‘×8ç¼Ù½ĂĂơÔ‰Ư½€ÿڲغ™Ó÷ˆ­Ä±»ÑÄëßÙ­Ö›Ô™ÔÁĂÏÔÏÔ½Ù½Óï»ù×å̉ ¾ßÁívÂÈËL±»ÏÔơÔÆ%´È +ÿ¼Ù×Ăºëö«‡“Íj†ŒÙ½߈œ(­ÄáƯ«‡“ÍjăˆŸÅµaÍÄÏÔơ꺓Ơ߈‹ÇƯßëö÷ˆ÷‡9¥‡ñÚËÇ½ÖÆœÜ«äöÁËÇ߈ÓØé̃gå¼ «Ôè¤Á̉¾ôÖ¾·Ó ¥0Ó +À½ÍÓ¥ˆ]1ĂÙÓ̉÷ˆ™‡9¥‡ƠçÚÙ½ăˆŸ;¯™‰kß [ïS±̉æÇ¿Ư«»ÅÔ¿‰ç«‡“Íjư…ư“½¦ô߈×ܺÅÓñÓªÔ߈“¹ƯNĂÓÏÔ§ỐÁ ½ưÀÅà±»‡Œ߈¹Ú’±½ÆØÔX§Ô߈Û«‚ ½9å̉ ÏÔ¡È·‡‘×8çÑŃvñÓ9¥‡§¹«Ô™‰kß [ïSËØ«Ôư¬¡íÙ½©¼¡ÈÏžĂĂ ›­±àéM±»±»ăˆŸ¥ÓÏ̉Ù- ØÙש‡¥2ßëMóÇĂÙëö˜ÁåƠí|ϺͲï‰÷êµaăˆŸ½ÑÄë₫®¶ơêÆ§Ø°¿µ½ù×Ù½ÏÔá×ÑÄëÑæƠ»‹±»ăˆŸ;—¶“ÛƒÚĂù×߈óÔ©¨½…Ơ£äÈĂƠ±»¡Á4 ÑÓíÿ›çá=ÿ¯¶Úª‚ +¼9ƒv½›¾Û«‚ ½9’ÇăˆŸ₫Çç̉Ú&5‹Ù¯G‹øŸÅ×óë$YµØ¿Åé×Ç÷ív±»ơĂ“È­ÿôËÓù×ư}ÅÄÏÅ—¶™‰kß [ïSÁƯÍ#§ĂÙƒvÛêùçׯÙƠ‡Ç¶‡Ö8æÍöÏÔËÉ9¥ÇßÄÙÙÚÇ÷ÍË)éÛ9¥™‹Û«‚ ½9ơÔ±¿ơé¡Ôù׃ˆï¶¿‰Û«‚ ½9¿ôĂÙ©Ç©À¢ÇưÎ%ơÔ¥Ư‰ÆÛ«‚ ½9Û«‚ ½9½ûÙ˜Á©‡¥2ßëM§Û«‚ ½9™‰kß [ïS±»èÓĂñÔׯă¼»ˆĂĂ ›­±àéM˜‰j̃ZîS½ơÅÅÓûà—ÓÍBù×ÊÇÍÓÛñ̉Úª‚ +¼9ÑÓÏÅÓØÏÅ›¾‹Çƒv§Ôñ™ÁÄØÅ–ûùº³ÆÏÔúÙÖ¾ôêÚÄ̉ï»ëö9¥‡›¶é±ëØÛÚÁĂÏÔ†º0çm®×ñƒ¼Á½³Ç—º«·3uU´Ăôê¯Èơ걿£Øщ÷ˆÙ×ÍÓ“ÆÙ½9¥‡߈°¿ ¡ÔÙڋNjӇŒ†Ç«‡“ÍjÏÔÿ§½ØèêưºöçôĂÙ߈·Ôº½ăˆŸµØÛ«‚ ½9úÖ±“âơê¯ô½±»Û«‚ ½9‡ºÏỘĂïiǺ±½™‰kß [ïS‡x¿‰½ß%«‡“ÍjÏÔĂƠăˆŸÍË)éÛ9¥‹”ËÖ±»ívăˆŸëö߈ŸÈ‰¿IÏ̉§Ó‡Ú·ÂϵÚëö߈ơêÛ«‚ ½9½Ăù×é䯦…ÚưÀͼ‰áÁƯ¬å™ô¼Ăˆé¾™Á³¾„»ø×"óÓ¶ÅÇÙÚÏÔ¿à°»±»ÍË)éÛ9¥ׯ·Ü›¶éçôÑÅ÷ÁÛº¿»₫$ù×éJé‰Ó5“gesÁÅƯÓ ÅăˆŸ;–Ó½‹àÅßχڙ‡ưÀẲ÷‡¡ÏÅÏ̉´aÍÜåĂ¾¹xÎÅÑÓóÇÿÂơêù׌!¥ˆ]1ÅÓ›¾åÁ½ù×­ÖÂÓßÖÿ¯¶Ù½•&«‡“ÍjĂßƯ‹Ç«‡“ÍjÑ\½ô³ÇĂÛףǙ‰kß [ïS·º«Û₫¼ù×ÍÓöÁ#ív©‡¥2ßëMƠ—¤ÑÄëăˆŸ;ÏÅívûÙÿ§íêÙÅëɇưÀ¥ÆƠÁ̉Žñǃvù×›¾ƒơ±»SăˆŸ;kÙƠËÖÑÓ߈°»ÑĂéÔ«»—íÑÓ›·Ôá¾›¡ÏÔăˆŸÛ«‚ ½9ƒv—Ó¡È«‡“Íj±»ưÀ™‡ÑÓñÚÍÄív±”º½àÏÔ£ÑÅß»ûêö½ôÑÓ½€ÛÀÏÔª»×ÓáÔÍË)éÛ9¥å̉ ½ÍĂ¿߈Á¹™‰kß [ïSëö—»ƒvôêÂèĂÙÛ׫‡“Íj“Ơ«‡“ÍjÓµOŸ}±»˜‡•±¹̃«‡“Íj´³ÛÇ»Øê™ÁÅÛ±ëØăˆŸÁ ƒˆù׳¡Á Û½ß¿¹ơêơÔ¡ÔÏ̉ĂƠ«‡“Íj½€ß»ûµØ¹ÚÙڳر»­ÄŽëöÛ«‚ ½9¢ÇÍÓö¯È’ƠùAöíÖÅÔƒv›¾•{Åô‡º́vÛÛ«‚ ½9ù×£%›¶éÛ×ưÀ¥ƯÛÚå‡Û«‚ ½9 Ëû®ÏÔ™‰kß [ïSơºÁƯ™‰kß [ïS¥e…ĂÙñÚ«‡“Íj¼ùê¹Úá$ÿÚÏÔË¿ÓÆ¹Ú8¤‡ơêÏÔÿ¯¶£ÇÙ×ÏÅ«‡“ÍjÏÔơê•Ó:ÏÔ«Ñ9¥‡Ï̉ŸÖëö¹ÚöÁÏÔ¡ÔÁƯÏćŒÛ«‚ ½9YơÔßÚÙŒë*«ÍË)éÛ9¥ï½Ñæ½÷Ú§ÔçÚÏÅÏÔ™‰kß [ïSé‰ñ5ñ·ơÔÛ«‚ ½9Ó¼½€ï½¡Û‡Œ›¾ÏÔœÜLÙ׎±»»ÓÏÅÛ«‚ ½9‚µ±»ÏÔơê½ĂºƒàóÔ×ƠÏÔ߈ơÔ߈³Ø°ÈÑĂă꫇“Íj÷Áø×ăàÉTù¿ÙÚŸ}™‡å‡¡Ơ±»Ë̉±»ÏŸ\ƒˆù×ù¿̃»úƠµa߈Û×9¥‡·ôÙÚ¥âß»û•Œ½€›¶é½«‡“Íj®×ôöÁù×™‰kß [ïS™‰kß [ïSù×ÅơêáƠå̉ ›¾—Ø÷ÚăˆŸ;ÇØ±»ơ÷Áù×çÚÙÚ½ùê÷Á•Ûÿ¯¶¿ßÛ«‚ ½9ÍƠ³ùº Ëû½Ă¯ÈĂº—¾¡ƠûØ©¾«‡“ÍjĂÙ¡%™ºÅ”öƠơ©‡¥2ßëMù×ơê±»Ơºm߈匿Nщ¦¹Úª‚ +¼9å̉ ù×ɽöÁÛ׫‡“Íj½€µ†ưÀ8"¤‡"Öù×ÑÅ«·3uUÏÔ»ĂÙ™ơå̉ ¼ÇÖóLjù×½€߈—¶¾¹xÙÜJ™‰kß [ïS­vëöÏ̉Ë¿ÏÅ­€½Ù½©ÜŸÈÍÄӺ߻û¾ÏÔÁÚÛ×Û«‚ ½9÷ˆ‘Û9¥‡‹Üƒv“¹ƯN³ºó±%·ÅÙ½Ù×Ă談“Íj›¾åŒ¿N±»½€éºç̉Ù×́v¿»߈™‰kß [ïS£Æ₫®¶ÏÔÛÔíê‡ÛÿÛ¾™y½ăˆŸ;ùêÿ§ù×ù×ù¿«‡“Íj™‰kß [ïS™ÁÛÄÓøêù×·§D ₫®¶‹ÙÇ̉ẳĂÙ›¶éÛ«‚ ½9‡“ÍÓÍı¿©¼ÑÓÏ̉³Øêö +ÛÄÓÏÔç'›¾ÖĂÛºÿ¯¶§ô«d¥ÛÁĂƒ½–Ó8¤‡¯×Ú×à)̣×ÅÄăˆŸ±»³n8•¤‡•Ö¹Ú­¾å̉ Ú́Å™‡ÜÓ 8¤‡ÿ¯¶‡Œ­Ô‡¿™‰kß [ïSåÑÓ«‡“ÍjÈñ»­Ä»ĂÙƒ½ßÁ•³¹‡ºƒ¹Ú¢äơêƠÏÅ…&‡·Ôù×Û×ÁđÁ½‡³Ô¹ÙûØͼËÉ9ÏÅźñÓÏÔŸ}ËƠöÛ«‚ ½9Ù½™‰kß [ïSóÇöÍÄ»¾Ø¡Ç™Á‰Øă»çÚâˆ:k±»Ư¡Ùå̉ ™‰kß [ïSº¿‰“¹ƯN³Âëö­·±»ÏÔ™‰kß [ïSÑóĂÛ¡ƒ¾‘Û«‚ ½9ƒơê±»•ù;ôß»û™Ø­ÔÏÔëö±»ƒvïé˜êèä߈Ͱ¹£¯Û¥ØÙÚÛ«‚ ½9·Ô›¶é¥Ó½ØÓ߈¥ˆ]1ơêù×߈ƒvËƯÇç«ÑÅ–¾™‰kß [ïS߈¢È́¯È÷ˆªÚƒ½£@ăˆŸ̀ÇÁ̉én§Æåź©ăà³È±»±»Ơ´«Ôéê…àƠî ÛéÜÙ½çÚÏÔ•Ç«‡“Íj›vÛ«‚ ½9¬ÖÏÅ™ëé娼™‡½Ă±À‹ÙÏÅͪÁÅƠƯÑÓȆĂôívăˆŸϺÿœ•€ëͼ›¶éå̉ ¶¾¹xß»ûÛ«‚ ½9á ‘ơăˆŸ;±»ăˆŸ;¹ÚÁƯÍË)éÛ9¥ɇöø˜±»«‡“ÍjÛ«‚ ½9ÛׯG‹ø¹Úל߈ĂƠù×ïøϺÍ­H·¼Í7ơêäø̣¶ ÍË)éÛ9¥¡Ô÷å5ÓƠXáÛù±‘®³Èá âàÏÔÏİ»éƠÑĂ²º̣‡¿—¶ơÔ»đƠסم̣ÀĂăˆŸ;í‡߈á «‡“Íj© ·̃G½¹ÁÛÄÓ‡ÚăˆŸ;ăˆŸª‡’̀j™Ó÷ÁÛ«‚ ½9ù×®øêÏÔÚÀÆ™‰kß [ïS»Å¦Ó/±»ưÀ—ˆ¸ÚÁ‡ÑÓÄôæZ₫™ÓÂÙ̉Å(Û«‚ ½9†x™‰kß [ïS×¾óÔÚª‚ +¼9₫+®¶+›¶éỞßÄÙœ·̉ ¤0ÙÚ«‡“Íjëö߈ÜÓ ¡Ư³z±»ëö×Ơ†7§j—ÓÏÅ凡¯ÏĘêèäÏÔ½€ר‹Üí—G™‡ëöÛ×Ơ•Á̉÷ơ±»àÿ¯¶±¿ßÚÙ½¶èưÀ™‰kß [ïS½ăˆŸ;‘¢ù×ơê¹Ú·©߈ï™ÿ¯¶ÇăˆŸ;±ëØÅÔ³·‡‘×8çùêÙ½ßơÚª‚ +¼9™‰kß [ïSƒvÈøê—Ó«‡“ÍjơêơÔÛÚ«·3uU—¶¡@ÅïÛ«‚ ½9…Œ·‡‘×8çÑÄëôêÚª‚ +¼9åĂưÀƒ×çÚ¹Ú‡ÛăˆŸæ'ÏÅåƠÚª‚ +¼9Ù׃v³È½‚½ƯÓ ÏÅ¡ƒvޝ¾åôỞ™Ó‚vÏœȪ»¡ÛÛ«‚ ½9ƒÀ¿ôăơ¹àĂÖ—¾öÁ̉ßÚª‚ +¼9ăˆŸ;ƒˆÏÅÇÖ߈½¹)Û«‚ ½9ÁƯÜơ§ƠơÄ߈ÏÅñÆƠÏỒÊ)èÛ8¤™‡ÏÔ3͇ëơÁÜđÆ çÚ‡ÛƒvÚª‚ +¼9Á¼ăˆŸñÓ₫®¶ÍÓ̀ÄơÄ«‡“Íj߈¡Ó›Ú«‡“ÍjÙ×´¨¼ÁÅ–Û«‚ ½9Ï|™ơÔXƒv«Ô©Óơê¿ä™‰kß [ïSÙÚ¯ÎÙŒë*«ׯđ»÷‡–ÓĂº«Ô‡¡Á8¤‡×Û½÷̉ç̃·ÔĐÄê߈ÍÓªÓñ»ĐÓ¯Ơ¹ÚéÓëö̃ˆYơĪ»³ơÇÖ«‡“ÍjéŒíÖƒˆù××¹ÅÓËǧÓßÄÙ™ëéå°»×ÇÖ„Ơ¡Ô9¥‡¿ô«»©Ü.¦º·Ô¡ÛÇ̉ù×ëö¶ơĂù׿»¶ăˆŸ;ÁÓ¾ßÚª‚ +¼9ÙÚ«ä·Å£äơ‰ÁÍË)éÛ9¥›À±»ù×·ØưÀâെ«»µØ™‰kß [ïS½›¶é·Åư‡±ù1ưÀ±»‡ŒÛÄÓ¯v­½¼ÿ¯¶˜Á‰ÛĂÙ™‰kß [ïS»¾9¥‡ë“9¥‡¹¾­Äá ƒvĂÙ›¾—¶¹ÚÿÚ¥ÆëöÅÔÑæ߈ó‡÷ÁÙÚÓÅ È—¶Ç¹Ú߈áêñÚÑÓö±Üå̉ ¹Ú«‡“Íj»ßơÔŒEùëù×±»Ç»ÿ¯¶ÛÀƯÓ ¹Úơ»“ƠÛ«‚ ½9ưÀå̉ G½¹—¶­Ä„ǰ¿°»©Øé…Ăº«»ĂÙçÀ½©ÓԦƋÜÏÅÆÇÛëÓă‘·íÓ¾ƒĂÎáØÂÈï³2÷Á™‰kß [ïSöÁù×·‡‘×8çÅ»‚ºÀĂ“È‹Ü€Ä ·‡‘×8çëÚ9¥‡ƒÜ‡ñ5¿ồÇùסÔѶÙש&ù×¹ÚÏÄùת‡’̀jØ×ÓÅóÔÁƯÏÅíêÿæº «Ú˜‡±½«·3uUÖº™Ôщù×ơ꽃ˆƒÖƒvÙ½Û«‚ ½9Έ©Ó̃ˆÛƠÅÄר²Ø¬Ö½¡¹Ú›¶é߈½€’È­½¼Û«‚ ½9µØËÓÙÚ“Ơ¡Û™Áá´Û×¶¼̀7ÅØ«Ô¼€µØÏÔÛ«‚ ½9߈å̉ ÷Á‹Ü°»ûä÷Áù×ăÇí³¹Û«‚ ½9Ñөǵ؃vɇ‹Æ—ˆÅnăˆŸ;™‰kß [ïSÑĂÇß·‡‘×8çăˆŸÆ¡Á­½¼ÏÔ—ŒªÚù×ÂÙù×½Ü ËûËÇ—¶¼ÜÁƯ÷ÔÏÄÛ«‚ ½9¿‰”Ó™Á½‡ºÛ«‚ ½9ưïÆØ¡ÁƒăˆŸ;kä×Ơ‹߈ù×°Û‡ŒÙÚ¥º߈ëö·‡‘×8çêö «Ñ¯Ô¢ä ›¶é±»™Ø±»߈ÏÔ­uëö«‡“Íj»‡«ḍĂÛ«‚ ½9¹£“Ơ›¾ỞÛ«‚ ½9щƠ8Z¤‡ZÖ߈À½›Ú÷Úµ†ƒvëÓ½€ơéÎ̉Ë̉ß„ôê»ưÀ³9¥‡߈ÏÔ“ƠÏÔËÖ÷Áä̉ÈĂ™‰kß [ïṢÔÛ«‚ ½9›¾߈ăˆŸ; Ơ«Ó Á“ƠÙ½•Œù׉¿I‡Çÿ¯¶ÓŸơêí–GåôÙÚ½«·3uUăê·Å«‡“Íj™‚Û«‚ ½9ÓØá ÏÔ˜‰j̃ZîS…ôÙ½̃ˆƠXáêù×Ăä̉™‰kß [ïS•Œ߈ù×¥Øàêă–Ó‹ÈÔXÙ×ù×9¥‡ưÀ‰à߈µØÁƯ‰Ô߈›¾î»ëö÷Á¿ßÛ«‚ ½9öµØó¶¶ + +¡Ơ£Ç‘ ßÚ¡ÛăÇí÷bº­€§à™ÓçÏŧ¹ïÚëöß„÷ˆôëÑÓÙ½á É̉÷Áù×9¥‡­Ä»¡È«‡“Íj°»‡Œå̉ ëö«d ÛÙŒë*«½ÔÁ̉˹Ë¿±»¿çñÚæÚÍÜ—¶ÿ¯¶±¿§ôûê¶ØöÛ«‚ ½9½ùê¾Å¿Ûº™‰kß [ïS¿‰ŽÙơ‰ĂÙĂºËÉ9Û½ÁƯ‡ĂíË%µØăêë‡Ϲ£ÇÁ‡é/×:匿NǾ÷‡ÏÅ…Ô—ˆơº¾Ă٣ǹڪ́á=ơêÙŒë*«ÏÄ߈ÍÄÿ¯¶µØƒ¾‘§á=Ù×ăˆŸ˹ƒv³ÂË̃¯«»ÿ.ĂÙ‹ù¡ÛÁă€Ä½€ăˆŸ‹Üơ±»¾ù×ăˆŸ›¾ÂÙ—¶ÇÂù׃văˆŸ;—¶·Üƒv¶ÅßÖ¿½Æ«‡“ÍjÙ½¥ØçÚ›Ù×Ơ·‡‘×8çÏ̉Ù½ÿ§₫éô«‡“ÍjÇÖ—»†ÇÇØƒ×ívù×±»¹½±ëØơê—¶ëöƠƒŸåÖü̉·Å¯Ơ߈å̉ ùש‡¥2ßëMÍÓà Û«‚ ½9₫Ç œ‰ +¾I +µaƒaχăˆŸù׫dƯđ£XóÇÖÆ™ëéåÁƯ»ÓÛ«‚ ½9÷‡±»Û«‚ ½9ÅÔçÚñÓר·ØåôÁS±¿߈¶Ô‚vÛ«‚ ½9›Û«‚ ½9™‰kß [ïS“Ƶ؇¥‰ÍL…ÑĂñÚív³«‡“ÍjÏÅ·ÜÑÓÙÅë±»ö±ëر”™‰kß [ïSÿ‰Û«‚ ½9ÅÛ×§ŸµØûƯ¯È‡Ç«‡“Íj«‡“ÍjÑÓÑçÔÓÓ™‰kß [ïS§›ÙƠï»™‰kß [ïS¿‰‡º–ÓăˆŸăˆŸŸƯ¿àĂƠơêëöÿ×öÏÅïß™‰kß [ïSù×·Ôî»÷Á½È2±»9¥‡ù×å̉ ÍÁыǜ$º™‰kß [ïSéÓ›¾ù×±» Û½€ÁĂƒv­Ä»ù×Û«‚ ½9ưÀ·ÅưẠ̀DZ ƒvÏÅ%ù×÷ÁÛ«‚ ½9åĂ¯‰¯0˜Á­Ä̀ÓÓÅ”Œôï½ä̉±»ñÔÎÔíơÍ­ÙÚ©Ó‡ºăˆŸ¹Ú°»¾ùôôê6ƯºƒØ³…ÔĂÈÖẴÁ€öỞÍË)éÛ9¥ÑÓ±»ëÚ±»ßÄÙ…Ú©‡¥2ßëMûÓÅÓơÄƒá «Ô›¶éưÁŰÈÁٷų¹ÏÄăˆŸ;¹ö߈—¶Ѷï»™‡¹ÚÏÔåơ»/§ỖÎÓØ©‡¥2ßëMÁĂëöÙ½óÄ›ÚÏÔó×ñÖ“ÆÇÖ‹ÜÙ½ÁÓ»ôívÍË)éÛ9¥·Ø™‰kß [ïSăˆŸ;kR÷Á‡xµ̃«‡“Íj₫)®¶)ƒvÑĂ¥ÇƠ‰¿Å°½§Ôœ}¡Çר©‡¥2ßëM¯È߈Û×—ˆ¡ÔßÄÙ¯¼ó¸ÛºñÖ¬»ù×ívƠX«Ô½À×ƼăºÉ̉Ù½‡ºÙ½‡ÛăˆŸ; È±»«‡“Íj“Æ¡Ơµaÿ¯¶·‡‘×8ç¾Á½Û«‚ ½9×ĂáëÓßÏÇÖ…¯Èß½Û«‚ ½9áÚăˆŸÁĂ½€«·3uU¥Óå̉ ƒàëöƒˆ©Øÿ¯¶ņÛÄÓ«Ôív¹Ú÷ˆçôívÖÚ¯»Û«‚ ½9Û«‚ ½9¼ô™ÁÅÿÚíºĂ¹Ú­ÄøơN™‰kß [ïS±»¤‰̀L„ưÀĂ‘±™ëéå9¥‡×ÙÜív±»­ˆ™‰kß [ïS©Ó±»Ù½ưÀăà†»Ó̉§ô… ö‰¿IóÇù×¹Úêö$ÛÄÓ߈±»¡Ó Ëûˆ­Ö™ñ»Ø—»×Ơ·Ô·‡‘×8ç̃ŒÚ,øơ×9¥‡ôçÚ™‰kß [ïS£äơĂưÀ߈ù×öö§ôù×£uí‡ÙÚ̃áơàăˆŸ;øº߈—ˆÅÓ¨¼å»ï‰áƠÛ«‚ ½9Ù½µØ™‰kß [ïSÍÓ«ÔǺơèÅ™‰kß [ïS÷Á±»‚váÛ×ëöÏŃv½€¦È½ÔÇÏỖˆ«·3uU³³Ô‡ôü¦†ĂÙƠXơê× ÷Áêö¡ÔÙÚÉÖöÁ½ó#ÍÓív—¶£ØưÀ™‰kß [ïSêơßÚƒvÓ¼$÷Á™‰kß [ïSăˆŸ;ăˆŸ;ÅâÂ3éÓ•ŒƒÖ™‡¯Èç®ơê²q ơ‘øÛ«‚ ½9—¾ÁÓï»ׯ±½8¤‡›¶éëÔº±»Û«‚ ½9Úª‚ +¼9£XÛ«‚ ½9Ç»íØÑÓÈơÔÛ«‚ ½9©¼ưÜÏÔưÀëöñÓ½‡Œ‡ÚÙƠö‡º¥ˆ]1±»™‰kß [ïSÏÔ÷ÁåĂ߈¡ÔÂ" ""¬"°à""èM"•{ÿ¯¶Ổ«Ô£Ø·‡‘×8ç¶ÔƒÖÅÓù×ëöÙÚơÅăˆŸ;Ç»·Å̃„ÁĂ“ÆÑ!ăˆŸ;Ûº™‰kß [ïSĐĂɘêèä±»ÄôÅ–¾ßẲ³ÈY¼™‰kß [ïS©‡¥2ßëMóÇăÛ̃ŒÚ, ´† í—GăˆŸ;ÙÚ©ˆ“¹ƯN™‰kß [ïS±»¿>íØĂq½ÿÚ™ëéå‹É0ăˆŸ;©Ø¼ÔñÓĂÙÁĂ¡Û¡߈µØ9¥‡ơÔÁÙ¥ÆÏÅ©‡¥2ßëMT× ƒ™Ó£È%¡Ưƒvƒvùæ÷ơ†ÇÑÑÄë홉kß [ïSăˆŸ;³ÏÔƒöÁ7™‰kß [ïS¡È™‚»Á«äăˆŸG½¹™‰kß [ïSçÇŰśڃˆ÷Áä̉€ÓÓº½ơêưÀ«Ú™‰kß [ïSÁS³ÈÅØÙÚX÷Ù™‰kß [ïSƒv±»¡Û߈ï‡ù×ơêÑÄ믃« +>ĂÙ™‰kß [ïSëöù×ÍË)éÛ9¥áêû‹ÙÚÙÚÍåXÁ¹÷ÁûƠ«ÔĐ̣Ởăạ̀ÄÁ½ív…ô±»¹Á‡xçôÏ̃ˆ±»«Ô‡áÑ̃³ÍÄñÓÿ¯¶’Èͺ½ƒv‰ßß„©‡¥2ßëMưÀÛ«‚ ½9Ûºă»ăˆŸÊ% ù׫·3uUù×Ï̉ăˆŸ;öĂÙÆ»ÏŧâăˆŸ™ÔÅØÏÔ߈‘Æ™‰kß [ïSˆø±½«‡“ÍjêÓĐÓÅÿ$ÅØíÆ·‹ÚÄ̉…b‹Ç›¾ÍÄùן}¹Áß»û±¿̀Ê)èÛ8¤—¶éӉř¶™Áù×Ă7Óź“Û—ˆÏÓ˜êè䵆ƠÚâˆ:ÁƯóÔù‡¯à9¥‡×½´ùê9¥‡¡ÑØăˆŸ;ƒvÀĂ ÷ÁƒvÙ(̀Ó«‡“ÍjÙ½ûÙ½ù×ù×ï³2ăˆŸ;ĂȳÈé–™‰kß [ïSăˆŸ;ÏÔ¤âºỵÚª‚ +¼9‘Æíꃾ‘«‡“ÍjóÔ™Ó­¾ơê±»ÆËÇǼ«‡“ÍjÓÈ̉…»ĐŨ‡¤2€̃êL•ŒưÀÿŸÄÛ«‚ ½9ÏÔĂȧƠ³bù×ö›¾ÑÓÜÓ Ở¥ÆơíéÓ±»¶º ăˆŸ;kÑÕԫ»¿́ÏÔ«‡“Íj›¾³ØÅÄ›¡¿ØÛ«‚ ½9¹Ú¹Ú­ÖơêË̉ÏÔ«Ô¹ÚÑÓÛ«‚ ½9£»Ù½ÙŒë*«±»ÓºƒˆßÏæđ«‡“ÍjÑÓà Ø×“Ơ™‰kß [ïS™‰kß [ïS£ƯóÔÛÀß»ûŒ¾ơÔ‡Ù½·Ô¥ăˆŸ;áùÜơ꛾©‡¥2ßëMó“ÆºíÖÓºăÔÙ½÷ÁµØ»Ø™ÓăˆŸ;Ÿ}åÁơèÅÿ¯¶߈¯‡¡Ư›¾°»»‡ÍÓ™‰kß [ïS—¶™Ôƒ¾‘½Úôáö¿àŽø×ƒˆ×Ë×Ơ%»á=ƒv¯È‰Áêö½ï‡‹Ç¯G‹øG½¹ƒƒ$««·3uUă»ÑÄë¹Ü±»¹Ú«‡“Íj‘̃߈—ŒóÇçºÏÔÿ¯¶«Ñ¹Ú¶  ·ÔñÓëö₫›¾ĂÙ¯¼ư×¶Ôé‡äÁéÓ¹ÚöÁ¡ÔÛ«‚ ½9“Ơ£ ™=ÿ¯¶öÁ«‡“ÍjÙÚø×½^Ó߈©¼ưÀưÀ÷Áۧәط‡‘×8癉kß [ïS…Ú¯G‹ø‡Ú™‰kß [ïSơêù×µØù×£ÔƒÀ§ôÔăÇ퇿ÑÓÚª‚ +¼9ù懺»Ø¼€«d°»ŸÈ÷Á…n›¹ùê…»¹Ú¿‰‹ÜщÛסÁ߈Á߈ùº‡ÑĂÏÔº÷Á®¾ơK¨ØĂÑÓË̉ÛºĂÙ߈ÍË)éÛ9¥—»±”ù×å̉ ƠX«»®GøƠÿÚĐæ¨Ơ™ØïiŽêơï½Ù½ăˆŸ;ƒˆăà›¶é­Äﻈ°¿¡ÛĂ»ÅÑØëö¦ÓµƠÙÜ«‡“ÍjÇÖ÷‡ăˆŸ;¿ß½ÇÖív¿‰₫®¶çÚÖ¹Úª‚ +¼9ôĂ³ĂÙÓרÜ8¤‡™‰kß [ïS¹Úェ‡’̀jÏÅ9¥‡ăˆŸù×§ØÏÅÏÅÎÅÅÓ±»ơê™Ó—¶ôµƠƠX·‡‘×8çÁÈÏšȱ»±»±ǾvưÀÙÚ–ˆĂٷسô«‡“Íj‡ßÄÙºùꙉkß [ïSƒv¡Ơùô‰¼ÏÔ¿ßÛ«‚ ½9ÁëÔÇÖù×ñÓ‡ÇĂÙ•‹HÇ̉µƒÖµØº›¾ßÁ±»ăˆŸ€Ó¹»©"§Ư߈æÚ¯×ËÉ9™Ó™‡߈µØ¿‰Ù½»‡—Ö±»ö$‘±¨¼¯G‹øÍË)éÛ9¥ÏÅëÔ™‰kß [ïS±»°»°» +ÏÔÙ×Ù»çộ»Èív©ÓÔƠÑÓăàÎÅÏÅ™‰kß [ïSÂÙå̉ ™Ô¸Ó²í‡Ÿ}¹Úƒv˜‰j̃ZîSÂÙ÷‡¹Ú߈̃ŒÚ,ơêù×÷ÙƒˆÛ«‚ ½9Û«‚ ½9—¶‘û¼«·3uUƒà™Ø©ưÁÜ™ÓëÚ…q«»íê½ÏÔ±»ëöÛ«‚ ½9±»©‡¥2ßëM׺ÔơểƧô…Ûç‚°»å̉ ÷Áχ½™‰kß [ïS¨Ơ¿¹çíù×½Ă«‡“Íj߈ĂÈÅØîÅ“Èé½»½˜‰j̃ZîS™—«·3uUÏçÚ“Æ̃ˆåGÀËÛ«‚ ½9ĂĂ ›­±àéM½¥å«Ô߈½đÓ¥ÇđÆ«‡“Íjƒv·‡‘×8çµØ²Â±»½ÄƯ¹Ú°»½Ô¡ÛÑÓ…JôÁËÖÆëÔƒé–Á̉¡ÛóÁ‡é/×:çĂ•½ÀĂ∃vÁ̉±»ơÔÁĂ¹Ú·ô‹Ü·‡‘×8ç÷Úù¿ÉƠăơß»ûëö©&™°ï½•Œ¡Áç9¥‡©‡¥2ßëM‹Ü·ÔùêơÔăˆŸƒvͽϼ‚×ÿÚÿ¯¶¾ß#‡Ç“ƠÂËű»ăºÙÚ̃ˆ“¹ƯN釙‰kß [ïSâàºƠXƒvÙÚ÷‡±»ç'ÅØ‡Ú‡Ç˱‹Çí‡Úª‚ +¼9±»½—ˆÍË)éÛ9¥«‡“Íj‚vÛ«‚ ½9Ù½óÔ³Û«‚ ½9Ç×¾âơµØ³ºó¡Û›¶éƒv°»¯ăù¼°»×ƠưÚ¿ơÔ½½«ÄÚª‚ +¼9“È­ơÔ—ØưÀÁñ»ƠXơêÑÄë“Ȱ»±»ëđçÚçÚœĂ“ÈÿÚ·ÅêÔ`Ï̉µa—¶ÅÔ±»±»Åëöô–º‡Œå׃́ùå9¥‡íÄùꙉkß [ïSÑÓ¼Ăăà°»ưÀ«‡“Íj™‰kß [ïSÅÎÍÅØÑŰ¿«‡“Íjù×߈ûƠj̃ZîS†đ5ª÷ ©Ç­Â·Ü­Ô±Áív«Ôç½çÚ¢ ¥<´†¹ó¡Ôù×ÓØÏÔ±»ù׫»ưÀ›¾Û«‚ ½9ƒvù×€Ä₫Úù×ëö“ƠͽçÚˆù××¾×Ơ†7§jÿ¯¶ÏÔ«‡“Íj÷ÙÍË)éÛ9¥ÏÔ©ÚóÇû(ß„ÍÓÿÔƠáê‹Ç·Ôù×—¶ĂĂ ›­±àéMÏăˆŸÛÀĂ©¼ÙڃבÆÙ…ù×ăˆŸ;Ÿ}©¼º·ÔÄô›¾ÅnÛ«‚ ½9±»ívöË¿¿Å±»ơꔿ¹½™Ă¾«È¼ăˆŸ;Ûºív¹Ú§Ø“Ơ¿Å¿º»Øÿ&±»ßÄÙºy9¥‡‹ÇÛÅÙŒë*«±½9¥‡Ï|Îų¹Ú‡ÛƒṿÓµaÍÄ›¶é¿‰Ù½߈ăˆŸÏĪ» ™‰kß [ïSĂÙáêáê½Î؉j̃ZîSëöº·‡‘×8ç߈›¾₫ ÏÔ­¾‡“¬Åù׃ùê½Ù½÷ÁĂÙùשÓÓÔŃ+ÏÔëöÏÔÅÄ™‡ç*ăˆŸ;«‡“Íj½ù¾çÚĂÙùê¯àÛ«‚ ½9•×ƠÚª‚ +¼9“ƠºÓº¸ÚßƯªÚ…à¹ÚÁĂ¯È™‰kß [ïSƒvÙ½êÚ9ËÉ9ÿ¯¶LµØ›¹ÉĂóÂăàƠÏÄăˆŸ;k¹ “ȱ»—¾ÎÅ óÆơêử›¶éŸÈ°»÷ÔÛÀ₫®¶ơÔÄĵØÛׇºå̉ ˜‰j̃ZîS÷ˆăˆŸèôû(£Çëö±»«‡“Íj¸Ú±»%Ù½ŽÏÔ²¹ơÔ™‰kß [ïS˹Ăè߈ñ,Û«‚ ½9çŸÅ™‰kß [ïS÷‡߈Ç»‚Ù ¥ˆ]1ÅÓëöÅØÁ«‡“ÍjƒvÏÔƠX¼€™‰kß [ïSơêăˆŸ;Û«‚ ½9跓ȉÏņ“—Óçô™‰kß [ïS¿½ÍƠ±»«‡“Íjÿ¼ù×ÖØÏÅûØ9¥‡ÏÔ߈÷‡¾À¹¿»ĂÙäơêƒÏÅ÷‡ÇÖ×Ơ¥ÁơÔ…ÚĂÙÏÅöơ •ŒÆØăˆŸ;«·3uU…؇ŒÏÅ߈ÍƠÛ«‚ ½9ÅwÛ«‚ ½9ăĂ3çÔ¡êöưÀÚÀ‹ÓߌÛ«‚ ½9ÏÔív㻏±»©¾úĂºívÀq”°åĂ÷ÄĂÙÛ«‚ ½9·¼Í7ïÚ¯ÈÔ¿ÅĐĂ“ºÏ̉ëöÏÔ¹Ú¿Ø›¾ÏÅÙ½™‰kß [ïS¹Úǽó^̃»ú—¶ÑØ«‡“Íj½ôù×­Ä‚vÑÄ뇺ŸÈöơêáê•×ÙÜÏÅ—¶ĂßÏ“ÈĂÙëöçºăơÙ×ÓºíÜ߈Û׃ÛéêñÚëÓ«dÑÓؽƒÖƠX«‡“Íj±»ö̉º÷ÁÏÔ½“ĂÿÚ³Ă¼Û«‚ ½9ö¿‰å̉ µØ—ø÷Á«‡“Íj­€˜‰j̃ZîSÖ Ô† 6 ¦j ÍÄ罾߫ÔíØùêăˆŸ;½Ô÷ÁÏÔ¿Åơệ¶±»Îũ߄™‰kß [ïSÏŽ€¯Èׯù׋ǃˆ߈ÍÄ)ïÚưÀƒˆÂ¿ÅµØ©&ƯÓ ëöăÔÙ½߈¯G‹øöÛ«‚ ½9ó^ŒÓ¹£³óŸîͼàº}«‡“Íj›¾ƒvÛ«‚ ½9µ½Á‰¿IÛ׳±½ªâØÚ÷,¬Ö¦Ûù×°»߈¥Â©ÀÍÓ߈ƯºÏÄéêơêÏÔăˆŸ½°¿߈ϺÛ×Û×Ơ«ÔưÀÛ«‚ ½9¹Ú­Ä­Ö«Ô‡ÇĐÓù×ơÔ¹Úùê߈óÇ½ăˆŸ;kƯÚ›¾ăˆŸ«ÔÛ«‚ ½9Û«‚ ½9±¿ÏÔ½½€ÊÇƠX¡ÈÀ¹ƒˆÿ¯¶±»³ÈüĂ«%ÓØù×¥ˆ]1ù׫‡“Íj×—ï¦Ó·Ó ¥0™‰kß [ïS´ñÚƒv§¹¡ƠÙ½—»¯ß«‡“ÍjÁĂ­ÖÛ×ÿ¯¶Ù̉›¾±»“Ơƒv«‡“Íj‰¿IăˆŸ;‡º›¾éơ÷Á¹Ú߈Á½€ưÀ₫®¶¿́ù×·º̃ÄØ«‡“Íj¿½“ºíÿ¯¶ÓÆíêơèÅÏÅï½™‡™‰kß [ïS™‰kß [ïS©ˆÏÔçÚµØñ‡½ñÔ¹Úɱ߈߈ÿ¯¶ơèÅ·Ô½€ưÀ‹ÜăˆŸ;‡ŒëöÇÖù×߈©Ó°»‡ÚÓÁù×Ë‚Ûש¼…ôƒvψÙÅëßÚëöăˆŸ;kív™Ưù×§Ô¿ôˆ¯G‹øù×ÓØ±»ª¶2tT½È߈ăÚäíÖÛ«‚ ½9œÔ¹Úư“ÿڇ׃¾‘¿»‰¿I†ºëöÑĂßÚïƠ›¶éÓº÷ÁÑ·‹ÜăˆŸÙ-½ÓÓ÷ÙÙÅë±»‹ÜÂÏÔ₫”‚©Çáê¯Ô­€£ä™‰kß [ïS›Ú³ÂÙ½—¶߈ù×óÂÙ×Ϻ“Ƴ¦ô9Å»ÙÚ¼ôơêưÀ…Ơ©Ç±»ăˆŸ;Ó̉™‰kß [ïSÅÓ· ¼ñÆ߈ר¡ÔÏÔ±»—¥±»µØ¡»£Ư£äơÔ¿‘ƒv™‰kß [ïS¹ÚÏ̉–ÓƠǺăˆŸ;÷Áƒv­¾™‰kß [ïS±»8¤‡ÖóÔÛ«‚ ½9׿8êöÁ…Œ¬Ø…ÖǺÖ߈—º™‰kß [ïS•Œ¡Á™‰kß [ïSψ­Ö9¥‡˜‰j̃ZîSº9¥‡Ç•Èû›Ă¼‘ÓƒÚù×ß߈ăàêöÀ×ü̉›¶é±»ÛÄÓÛ×›¾Û«‚ ½9ƒỞÅÄÓ ›¾¿‰×¿8«»Ù½…º¥ÓÙ½½ÛÄÓƠ»¿÷ÚÛ«‚ ½9Û«‚ ½9©¼ÔX‹ÙƒvàØ"±¿ù×́Ü—˜½˜‰j̃ZîSÏ̉9¥‡ƯçóÇ÷‡úĂ‚v÷Á¿è§ô±»ÍñÚ½²ë×ëöíê³È¥ÙÏÅß»ûéêí‡ÿÛ‹Æ·̣ÏÚ¡ÈăˆŸ;k½«·3uUơ»ăàơ)¹Ú›¶é—¶ơÄë“ƠŒÛëöù×™‰kß [ïSÚÀ™‰kß [ïSÉ»€¼¹Ú¸Ö9¥‡×ƒ¾‘±»ĂȦر»©‡¥2ßëMĂÙĂºÄÁÙ½«‡“Íj߈Ûr¾Á̉ƒˆ·‡‘×8çÏÔÏÔáÜÏÅÜÓ —»¢ Ø×µØûƒv¹Úï½ưÀ±»Û«‚ ½9»Á§È±»¡›£ØƠÏŵØív«‡“ÍjăˆŸ£Ø™‡†ÚơÔ߈™‰kß [ïSÄÓ¶ÖúƠÉ̉ù×ͺéº߈‘ ăˆŸ;ơê°»ăˆŸ;ƒÀŸ¿ÏÔ±)ùדÆÁ̉ÏÔ™‰kß [ïSăø¿ׯ߈™ÔÏÔ߈߈¹Ú«‡“Íj߃vïdÇÖ‹Ùѽ∽ƒvåĂÔX£ØĂœÜÙÚå̉ ›¾·§D —¶“ÆưÀßÚÏÅÜơèÅ›¶éÏÅ›¾ơ½€ß»û«‡“Íj©Ø™‰kß [ïS·‡‘×8ç±»´†­Äͼ™‰kß [ïSù×ù×äÔívÏÅñÖôꃽƒˆËÇÁĂ¡Ôăå̉ ‡º‹Ü¥ØöÛ«‚ ½9ăˆŸ; ƠÏÅ©¼Ë“ƒˆ½Ü‚£ä³à‹Ç‰đ÷‡ê÷ˆƒvó™úÍß߈ÛÔÙ×ùêù×ùשÓỞ¤Û—¶°»©¼«‡“ÍjÙĐùô§Ôí9¥‡¡ÓÍÓ™Ôµ÷«Úù‡™‰kß [ïSÏÅÍË)éÛ9¥µØƒvßÄÙ߈Ûˆ©‡¥2ßëMÿÚ—¾§Ó¥‰ÍL…ôïÀ‰½±)Ëǰ»ÇÖ߈®×‡Ú°»§Ô™ÛĂĂ ›­±àéM¼™ô·‡‘×8ç—¶ơÔ9¥‡×“ÚßÚÿÚÑ·‡«üϾ¥OÁƯ•Œ©‡¥2ßëM™ÎÏ̉ăơ9¥‡ăÚ½9¥‡ÿÚ…Öµa«‡“Íj±»¶ëöé꯾ù×Û«‚ ½9ÅىۡȾ’ºßÚö™‰kß [ïSÔX£₫Û8¤‡½€ăˆŸ;·Ô¦ºÑŇŒưÀ³ăˆŸ;kÛ«‚ ½9ơê©ØơèÅÁƯ™ÖùוŒÙ×­Öơê¡È¶ÅơèÅ•Èû›íÁÛÛù×ó—à÷ÁĂôçÚÅàĂÈƠöơê™Ó…ôơèÅ߈ƯÂđ¡ÈĂĂ ›­±àéM±»̃ˆɇ¡Û­Øù×±»™‰kß [ïS˜‰j̃ZîSÙ½ÏÅëöơèÅ÷Á2ÚÀÛº¾ºÿ¯¶¿‰±»÷Á§Ô÷Á©ØÏ̉ÄÓÍÄ)ñÚù×§Óé‰ñ5ñ·9¥‡­ÄñÓ‡øÅØÅÓ°Ă å̉ åĂăਇ¤2€̃êL‡ºơèÅƯƒvƒvƠ—¶°»·ÔÑĂÏÔ±¿÷ÁÛ×©Ó¸Ú +˜‰j̃ZîS‡Û½߈£»Ù½«‡“ÍjỞŽ×ÜÑĂíJ—ˆºÅÏÔăˆŸív±»«‡“ÍjϺG½¹Ç̉½˜‰j̃ZîS¸È +›¶é·Å߈¿»ö¾¹x™‰kß [ïSéºÏÔó߈ÏÄÙŒë*«µØºØ¨Ø¾¹x‡ä±»¥ºăˆŸÙÚ¶›¾ä̉©ˆÁîéêÿ¯¶‹Ç•×ÙÅëÛº¿ºéÚÛÀñÓ9¥‡Ă¼¥Û±»ơÔưÜù×ÙÚÅÔÛ«‚ ½9ÛÔÓ̉Û«‚ ½9ƒvÅë„ׯ¹ÚûÓÏÔ¾Ú±»ô°»ù×½ƒØ¨‡¤2€̃êLăà›¹Ï·’̀jĂ¼·Ô˜‰j̃ZîSáê›¶éơÔψĂºĂăˆŸù×ÀƯ ß»û×̉«‡“Íjµ£‡¡Ô³×™‰kß [ïS£Ô–¾«‡“Íj£́çÚ÷ÁÏÔ°»©‡¥2ßëM­Ä•½¿å« ©ƒ»5™ơÎÔ÷Ù¥‰ÍL…ƒ½ßÖï³2ÿÚ‡Ú̃ˆ½¾‡ăºÙ½ív¿‰«dóÇéÓƒvÙ½ÁÛôê匿NÑÅÁÓ±»ÍÄÍÄéÍ»¼‘ÛÄÓ«dÅÔ·Ô¹ÚÁ½߈÷$åÁơêơêëöưÀÏ̉¥Ó·‡‘×8ç¼Ø¯¾“Ơă½¿‰Í¹ÚùøăˆŸăˆŸ;¬Ä¹¼±½ëö±»×ÇÚÙ½ƯÅØ½ưÀ½Éï»™ÔgǼùט ê è ä Á½¹ÚÓØ̃ÎßÄÙƯ‰í—G¹Ú̉Å·Åù×»}Û«‚ ½9±»ăˆŸÛ×ăÁĂº±‡ù×ÑÅëöÚª‚ +¼9¥ˆ]1™‰kß [ïS«Ùö–Ó›¾ăˆŸ;½ÔăˆŸ;«‡“ÍjÏßú£Ø•ÇĐű»ÿ¯¶ưÜÙÚÿÚ›¡ăˆŸ;Á¹Úª‚ +¼9ĐæµaÛ×ÇÖ™‰kß [ïSƒv™ÁÇÖÛ«‚ ½9ͪăˆŸ;«·3uUÏ̉§‡ºÁ +«‡“Íj°¿+̃ˆÍĂơꛡ‡ͪ˜êèäؽ…ôĂº—˜ßÄÙĂÙ¡Û«‚ ½9ù×çÚÛ«‚ ½9³ÜÿÚ™‰kß [ïS™‰kß [ïSôƒv¨‡¤2€̃êLƒvÛÀăê©ÓŽ9¥‡½ù×÷‡ÁỨ§Ơơê¹ÚëƠUÓ¾ư‡±ù1¼€‡º¯¾÷ÁẲôÿ¯¶ư§‡˜êèä¢ä •Ă«‡“Íj±»Û«‚ ½9Ÿâ«º¯ÈƠ§¦ö÷êÙƠ÷‡ÅÑàƠX¦ôÿÚÛ«‚ ½9·ÂÙ½ơêùê™÷ÁÛ«‚ ½9ÓŒçƠ¹̃ÿÚ“Ơ°êØå̉ çÚÏű»©À©‡¥2ßëMĂØå×ǽÓº™‰kß [ïSÙŒë*««»£äëö‹Ç©Ó«‡“Íj߈ûºÁñÚ·ÔĐÄê·Ô߈™‰kß [ïSöÁ¯¼ Áå‡à̉‡ƒÔÀ¹ëö߈ÑÓ÷ŸéÔăˆŸ̀Ó߈‰ÛÏÔÛ«‚ ½9ÇÖ™‡§ôÙÚÏÄÁƯ÷Á¥Ø·‡‘×8çƯ‰‡×Û«‚ ½9êÚ·Ô§Óøê›¶éƒˆϼÏÅ߈ëöÏũǙ‰kß [ïS»Å‡ ±»ÙăˆŸ;ăˆŸ;̀Ç ơĂÏ̉ÜÁƯÿÚÑÓÁ̉Û«‚ ½9«ÔăˆŸëÔÛºÿ¯¶Á½ë‡†ö‡ŒßÚ¡Èù×Û«‚ ½9™ÁÙ½ñÖ¢äơêçô€ºƒvù×¥Ư‚v·ÜÉ̉íê…»¸ÁĂȱ»ưÀ±½̀±»¡\ÙŒë*«Å—¶ÙÚ½ÄÓ¿ß³È÷êÂÙỞÂÙ¡Áä×ÉÑÓ¡ÔÓØÛ«‚ ½9±»ßƯÔX–ö +Û«‚ ½9ÙÚ9¥‡ÙÜÇÖÇ·±ÅÔ™Ôɾùï¡Ûª»ÓØºÛ ív™‰kß [ïSăˆŸêö­€½Û«‚ ½9Ó–™‰kß [ïS™‰kß [ïSëƠUöÁửÍĂÿ¯¶Ù½Ơ‡Ç»Å̉Áù×›¶é‡½§Ôø×“½ÿ¯¶ûÔX ëöÑÄëÂù×¼€—¶ăˆŸÙ½¡Û‹ÇÁ×ÅĂÏÄ£äù׳Ơ׿8¿çχăơßÁ¿¹ÍÓ¿àăàçÚ›¡÷ÁÅׇ½7‡ÜÓ ÁƯ˜óË%ĂµØ‡¡™‰kß [ïSéÓÏÅĂƠ±»±ëØ9¥‡ƒØé¾Ÿ¹ÍÄăˆŸ;£Ø“Û®¨åŒ¿N·‡‘×8ç§Æ¿Ôù¿Ç̉™‰kß [ïSá§›¶é߈ëöǾ±»‡™èê½ăˆŸǺ́Û»‡¡ÈéºÅÙ×ƠÑÓÏÔ߈öÁù×Ïſ߽ôĂăˆŸÙ½ñӋDZ»£ä߈ÿÚ½Ïć"Á̉«‡“Íj½ơèÅ™‰kß [ïSÛ«‚ ½9ëÚëêö‡‚v—Öá÷™ÁÇÖ±»µØç®ßÁ«‡“Íj©&“ÆƠX¶«‡“Íjí–Gù×ăˆŸ;ÏÔù׸ÚÑÓÏÔÛ«‚ ½9Ž̀ÓÏÔÓØ߈ùê½ÄôưÀ¬¼Úª‚ +¼9Û×ñÓ̉Å·‡‘×8çíÚÁ™‰kß [ïS©Ó°½̃ˆ߈ăˆŸ£Çÿ¯¶’Ç8¤‡áÇôùơ«Ôå̉ §ƠÔ½¡Á¿ù‰•‹H¡ÔóÂÓØÀ½ÿ¯¶ùê±»ÁƯ½½éÓ‹ÙăˆŸ÷‡ƒd…Ô«‡“ÍjóÔǾ¹¢Ç€ºÛƠ¿ëÏÔÑfºç̉ñÙö§ßƠX¹ÚƒØ߈äƠ,ƯÓ ¥‰ÍL…êöÇ”%ĂÙî½߈ó¿ô9¥‡×º¢»éê߈ưˆÚª‚ +¼99¥‡9¥‡¹Á߈¡Ô߈ù×ơÔå̉ ÙÓ¯ÛÏÔ¿‰±»½ĂëöÙ½àçï½¹àăˆŸ;ơèÅ9¥‡×ÅØª‡’̀j—»Û«‚ ½9•Ü·ô¹Ú•ÇÓ¹Á°»§³ºóív«‡“ÍjăˆŸ;k«‡“Íj߈ĂºËÇ£äÁ½©‡¥2ßëM—ăƒ³Ôׯ˜‡¹̣*ơꩼñÁù׫‡“Íjù×ÿ¯¶°¿ÁƯ³Ä•ŒÀƯŽßÄÙ÷ÁưÁ›¶éèÓưêѶƠù×ÙÚëö±»¿ßÉÙ¡ÁăˆŸá=₫®¶Û«‚ ½9‹ÇùêµØ‚ØÁ‡é/×:Ơ¾GÙ½Ù½ăˆŸ;߈߈ƒØÙ½¿‰˜ÔÑàƠ ±»Ï̉Û×™Ó¿Åï»ÅÁÍÄ߈±»ùêªÚÙ”•×ÑăˆŸ;½ØÆÖíØÓ½̃ˆÆ·‹»ØщµØ›¹å‡‹ÇµÇ⛾§¹ÚÀÏÅ›»©À‚v ăº°»HÛ«‚ ½9›¹µØơê߈ưÀÑĂ‹ÇăˆŸ;ÙÓ߈á=ƒ¾‘¥ˆ]1Û«‚ ½9½ƒv«‡“ÍjɇƠÓ×$«d¨-ÿÂüÛÄÓÏ̉°»ĺ߈Ơ½‹Ù›¾á̃ëöƠƒÍË)éÛ9¥ÏÔÙ½Ù×Ï̉ºăˆŸ;èp™‡ưÀÔX£Çщ¿»­½¼«‡“ÍjƒÖăˆŸ;¥°«‡“ÍjÅØŸ}×¼«»Ä‡ŒÅùÙ½“È–»ơÄ¶2tT­ÄƓƙ‰kß [ïS™‡ÍÓ¶ÜÀ¹ «‡“Íj©‡¥2ßëM±»߈«ÔăˆŸá™ô¡Ư®ÈÏÅ¢XÇÖ±»³àå̉ ¯È™‰kß [ïS³¹ù×ăˆŸßÚƠù‡ö₫$÷ÁÙ½µê–¾±»Ï£ÇơêÛ©Ó¼ƒˆÑÓ÷ÙÛ«‚ ½9‹Û«·3uUëöÙÚñÓăˆŸ;Á½™‰kß [ïSöÁ‹¢ÏÔäĂªÚ±»§¹ºÍÓơÄù×ö‡ŸƠÍÄÁƯ ËûđÚ߈ƒÀ÷Áëö±Ü™‰kß [ïS³ÈÛ«‚ ½9½è™×ôĂ÷‡™‰kß [ïSóÂ˾®Ơ#µØăˆŸ;Ù‚˜%÷ÚÙ×ĐÄê9¥‡™ÔăˆŸ;«‡“ÍjßÚ§Ô«‡“Íj·‡‘×8ç½ôĂÙăˆŸù×ßÖ˜‡ñÀÛ«‚ ½9Ă¼½߈¥ˆ]1ÙÚ¡Û9¥‡­Ä8¤‡ëÓÛººÙ½™‰kß [ïS½Øר߈…¥ÆƯÆÛ«‚ ½9À¼Û«‚ ½9êÓ‚vù׫»¹ÚÏÅív—¶ÛÄӃحÄH‡ï­½¼ƒØơÔßÖñÁ±»‘ëÇ"÷ÁÿÚÏÅưÀƠÏÔ‡Œ™Á‡Ç₫ +®¶ +•²«‡“ÍjơĂñÓ—¶±»Û«‚ ½9ö߈ÏÔù×íÚù×öÏÔ±»å̉ ƯÓ ×ܳ½ô²ÂƯÓ ›v«‡“Íj°»ÏÔ½ËÉ9ù볇Çù×ù×ÏŃvëö­Ä¦Ô£»­€ăˆŸÙ½£Øó«dÛ×÷Á£Ưª‡’̀jÅÏÔçÇ¥ÓƠơÖ¾Ø×ĂÙÙÚåôù׳ØÿÚ«Ô›¡Ë¿ÏŃvăˆŸ;«‡“Íj›¾ÂÙ¿Ûçî¦ÏÔ©ÇßÚ£ØÛÄĂ “ƯÛöơ‰¿IÁ|·ä߈ƒØ‚Ö­Ä™‹9¥‡½ù¿Ù½Ç»Á̉›¹¯¼¿́•Ö‡Œ™‰kß [ïSͼªÚ­ÔƒăâĂ™‰kß [ïS»Á™ÓÑØÁƯ§Ô¡Ôç¡Ø™‰kß [ïSŸÅ±»₫’Ơ¡ÈÛ«‚ ½9™‡ĂèÍÓ¶ƯÓ ĐÅ÷·Û«‚ ½9߈¢Ô߈ÅØ±»…ÁĂÛÀíÉ̉›¾̃ˆăơÙöĐĂÙ«ÓÉ68¤‡«·3uỤǵϓÇ߈Ǻ±ÁÛ«‚ ½9 Ûƒv‘ÔÓÚ훾ÑÓ©Ơ×ÜÁ½Ư¾ËÔù׃Û×ăà¤È«»ÏÔ›Û‡Ă£Ư›9¥‡±³Û«‚ ½9ù×8¤‡ÖñÓñÓ‡ÇöÅáÑÄëÑæÑĂ™‰kß [ïSÑÓ‹ß:¡Ư«‡“Íj›¾·Å™»ßÖ‹ÇíÖ‡Ùù×ÇĂ‹ÇÛ«‚ ½9™‰kß [ïS±ỒÓïĂĂÈùô™‡щ™‰kß [ïS±ÔÓº¸Ú—¶ÉƯÓ ¿ô™‰kß [ïSëöàöר麱ÜÛ«‚ ½9­ÖÂÈ ±ëØ9¥‡×—¶9¥‡½ÍË)éÛ9¥µÁăˆŸ;k«‡“ÍjÛ«‚ ½9߈ƒˆ™Áö§Ô‘ʵء¡åĂ“ÆƠ±»˜‰j̃ZîSÿ₫Ởƒv½·Ôơê¹Á™‰kß [ïS‡xå̉ ‰¿IĐØĂº—ă£ØÓØƠƠ¼ƒÛ̃ˆ‘—±»ªÚ˜‡Ù×çÚ›¹ö£»ôê­Ö±»ù×½ÚÇëÔñÆ«ÚÙ̉Ùơ꿉¿ÅÛ«‚ ½9ÿÚËÜĂÖº™ÓưÀ³ÆÈÇ5ÏÅưÁ£Ư¹ÁƒØßƯÙ×™Óƒ¾‘ëö8)¤‡)±»ª¶2tTƠÿ¯¶ÿÇëöÛ«‚ ½9·ÔëöùëÛ«‚ ½9‰Äëç©ƠÚÀ…Œ™‰kß [ïS»ØÙ½¹¼éÓƒˆ߈­ưƠûÓÛ«‚ ½9ÿ¯¶ù×ÙÁªÔ«»—¾ñÖùêÏÔºn§Óù׭ćÇùר׻ŷŵ†ôÉ̉öÁÛ«‚ ½9÷ÁùטÁ¡ÛăˆŸ;ùׇÇ߈߈ëĐ¥ˆ]1µØ¬ÖñÓơêªÔ½ăˆŸơêø×ÏÔÅ«»ÑÄëϼ­ÄăˆŸ;øêƒÜéÚÛ«‚ ½9çÇÓÅ™‡±»ăºƒˆ“ÛǺÍ噇‹Ûɇ8¤‡‡x«‡“ÍjëÓăˆŸ;ÍÓ†ŒÇĂ«dºưÀ߈ívÛÇÛ×¹Úä×ɇ·ï¿ô·§D ½øêù×·¼Í7÷‡¯¾»½ÏÔ½ëö́Áå̉ Ù½ÿÚ₫ƒvơÔ…Ôù×ăàáẸ̈9¥‡×…Ơ³ôªÚ ƒvº—Ô«‡“Íj­Äơêö•Œ¸ÚyèơÛº™ÁŸ}½…öưÀ麼ô½«ÔÏÔÏÔ» ù×9¥‡ç̉“º…Ô±»±»¦ôÇĂăˆŸ;á ôâܽô¿́߈·ÔÙ½Û«‚ ½9áê½€‡Û½ƒvĂĂ ›­±àéM†´ơ*µØÑÓƒvÏÅå̉ ăƠÛ«‚ ½9ñÖ÷‡±»á ™‰kß [ïSäÁ«‡“Íj½ÿ¯¶µØù׿ÚơĂÁ¼ƯÓ ™Óçソ‰™‰kß [ïSưÀÚ×ûÓ°»ù×—ˆ§ºƯÓ ¯È£Ç¯×ơÔÙ×¹ÚÏÔÛ«‚ ½9‰¿IĂÙÙÚÏÅñÚÎÔ•ŒºÅƯơå̉ ¹Ú°»¾Ïų߈§ß¡»¶‹¼ÔăˆŸ«‡“ÍjÁ½ßÚĂÙ±»ËƠ™‰kß [ïSÏÔ³Á‡é/×:±»Æ—Ó×Ü¢ä·ÔÛ«‚ ½9ƒvÛÅ¥Óëöñ֥ƩӃºƒˆù×¾º÷Ô¤‰̀L„íơ߈›¾Û«‚ ½9Ï̉«Ñ߈§Ô÷Á¡Á«»ëöÅ‚vÚ׫‡“ÍjĂôĐÄê忱»ËǼª»Ÿ}±ÁÅÀÅÔ«‡“Íj¶¦D2 2º…Ø£XÅ»ù×ăˆŸ;·Å·ÔÏÄ´‰¢äÛ«‚ ½9ÏÅׇỬÿ¯¶êÔâˆăˆŸÙ½ï»ƒÚ¡Èª»íØÙ½äÁù׫ԩØăêÙÚĂÙ±ÁÿÂψùơ¹ÚƯ¬Ùù×Û«‚ ½9±¿8¤‡Ú×ÙÚëöƒ»ëö‚ˆăˆŸG½¹±»Û׿ô߈ĂÙ¾›¾ƒv½ívµ…щÛÀ›¶é×ÓÛÚç̉‘ơÛ«‚ ½9‚vÛ«‚ ½9¿‰½»Û«‚ ½9÷$±»±¿«Ôù敌۫‚ ½9ĂÙ̀Ó™‰kß [ïSù×Ï̉ưÀÙ½½™Áë×ÇĂ‘ô–¶ưÀÅÓù×Û×Û×±¿…Œöª‡’̀jóǬÔßÁ›¾ùÜÑñ»±”ƒˆù×ÏÔé‡߈­¾ËÇ›¾ËƠ¶‡Ö8æơÔ˜ôœÁù×ùןÈÓºôËÉ9³ÓÜ™‰kß [ïS“Ơ¡»ưÀàđÓÆâà߈ψ÷¶å¿ï»­Å¼Ô•ŒÅØëö¼€Ù½8 ¤‡ Ö߈ïi˜‡ơÔùê߈ÑîÚ­Äÿ&ùêÎÛ«‚ ½9ăÁ‘«ùד۫‚ ½9ơºÓØăˆŸ;ÔÅù×±”ÎÅÓÁëöº›¾̀ĂÛ«‚ ½9ÑÓ·‡‘×8ççm§ÔăˆŸÉ̉£XÈ̉#™ô½ơê­v—¶¶‡Ö8滽ăàӵŨ—ˆÿ&߈-…Û«‡“Íj₫§¼÷ÁăˆŸ;Ùá¡ß—ˆÙ½½€ĂôÏơ¹àÿÚÛ«‚ ½9¸Ú»yÚ×·Ü«‡“ÍjÏŘӽɇù×™‰kß [ïSđÄÇÖùêÚ׫Ô߈ëöÙŒë*«ÏÅÛ×´†ëö—ØÉæå̉ ™‡̃ΙÓÉĂïƠÛÄÓ₫µ.¥Ù¿ºÙÚÁƯƠ§ÆÿÚ߈›¾ơëöƒÛÔ£ÇñÆ߈߈êÚù×£ÓרĂÙÛ«‚ ½9¨Ơ°»Ä؇DZ»µaăˆŸ9¥‡×—¶ƯÓ ºƠºm°»Ử∫‡“Íj˜‡‡º‡ÇơÔ߈±»öçÚ½‡½±»™‡Ơ홉kß [ïSƒ×æê˜ÿ¯¶₫‡Úª‚ +¼9ƒØÏÔË¿ùê•ÂäơĂÈŽö½™‰kß [ïSåĂ™‰kß [ïSÛ«‚ ½9›¡ëöó½€½§Ôß½’½ÅµØÜÚ +»ÈÛº¨¼ù×éØƒÚÙÚÛ×ïÚùê“Ơ«Ô•Œ³”ÉÏÛ«‚ ½9Á ÙÅë·‡‘×8çÓ̉ûÓÖÆùê9¥‡ÓØƠ‹ÇµØ©´£X·Ó ¥0âÁăÔÛ«‚ ½9›¾±»ϼ‘ÙÚư%¿º™‰kß [ïSöñëöä÷$©‡¥2ßëM³ºóÙ½¶óœÍåëöá ŸÄ±»÷Ú™‰kß [ïSñÖ›¶éÏÄÙ½ƒöÙåÁÑÓٽٽưÀÏ̉ĂĂỞû”Á¹¨ç4›¶éï‰Û×ÑÓ×ƠßÁÛ«‚ ½9ơÔ­¾ƯÚ‡Œ8¤‡ơêĂÙéÙ߈½½¥Ó ËûÁÚÍÄëöœ·̉ ¤0ƒv¨ÅÓ¹Ơù×›¾±»÷ÁñÖăêÏÔỞî½ßÁ«d÷Áǹàá «Ôƒvå¼ µÀ¯ÈÙÚÏÅïi®‰®0›R½€¦Æ¶ è óÔûÓÏ̉÷Á«‡“Íj¶Ô ñíÈ“ +˾ƒÖÑÓƠ‹]ơÄá ß»û›Ú«‡“Íj¹Á³àùט‰j̃ZîSíÆí—G©Óƒ‡Ϲ«·3uUÅ·À‡€è/Ö:«‡“ÍjÿÚĂÙƒv½Á­ÖƒvéÓÚÀûÓÛ«‚ ½9«‡“Íj‹ÓØÓ°»â¿‰ï³2ƒˆ§ØÄ»ÛÄÓëö÷å5Óº»Åñ½½½³ñù¿ÇØÛ«‚ ½9µØơèÅ߈‰¿IỞăˆŸ®ôñÚß%ĂǓٌë*«ơ³™ơă»·‡‘×8ç³ ÍĭĬ¾Û­vĂĂ ›­±àéM¶ơèơÛº¦ÔÔXÛ«‚ ½9ívƠí«»ƒvÇÖ»Åï½±½ñÓÙ½ɇ̀Ó½€ív½¾‡¸ÚÙ×Ưºá߈©Ó£Ç÷ÁÏÄßÚº©‡¥2ßëM…öï‰ơÉË%ëöÙ×ăˆŸÿ¯¶½€ÿ$¥Ø—Ó÷ˆÇÖÛ×·‡‘×8终ñƘÁ¬¼ÙÚ¯‹Ó±¿˜9ê9è9ä9ˆ¡Á‚¾·̣ù×ôêÁªÚ½°»ơºߌÛ,’™‰kß [ïSdz‡±»»<ĂÙ¾ÄôâƠ¡ÛÛ™±»ù×ÓÆ«Ú™‰kß [ïS¥ˆ]1ªÔûØçØÅ¹Ú·ÅåƠÅÓ·‡‘×8ç‹‚ơêù׃־€»‡ù×/ưÀ“ÆÏÔ´cÇÖƒ‘÷ÔƠƯÛ«‚ ½9ÛéêªĐ‹Ç±»½€ơ¨¿ßëöɶù×±¿ÁƯ™‰kß [ïSôÙÚÏỐ‡ÑÓ«»Ăº9¥‡×‡xëÚÙ׃׋ۭÖưÁù×ÏÔ¡›¶é߈˜‰j̃ZîSỞÚª‚ +¼9Ù½Û«‚ ½9£¨¢Ç«‡“ÍjÛÄÓ„ơèŇ΀‘Æÿ̃̉ºÏÔºÛ‡ŒĂºù×ĐÓø×¹®ƒˆ±½¬Äăơ¾¥ˆ]1Á½§È±»² ·Ó ¥0‘ƆŒƠ˜‰j̃ZîSç½ÏÅÿÚß»ûËÇÛº«âíÆ±»“Ởº¥ÖÏÚ¡ÔŒ₫¼¢ä™ëéåÙÚ½ÑĂ¹ÚÅÓ±»¡ÁµØ߈¾ºĂà¡Ô½ÿ¯¶©¼›Ú³µØͽ©‡¥2ßëMêö­ÄŸÚ·‡‘×8çÛ«‚ ½9¦Ô©Øá$¶ÑĂơÄù×ăˆŸ;k‘®—»9¥‡₫ºÛù×ϺëöÓØÅÓ̉¾÷Á«‡“Íj‡kÚª‚ +¼9ăˆŸ;kçÚŸ}³ÂĂº-ç̉߈³ÆÓØ—»ĂÙ“°ưÚăˆŸ;‡×Ù½ùæù×Û«‚ ½9÷Úƒ—»ù×ƯÓ åߨ¼ăˆŸ;ù¿óÂăà÷¼Ö¾£»¡ÈëöÏÔÑØ½ôŽá̉ܺ÷ÁÎÔß»û…»áê߈•Ö©ÓÅø¿Ï±»ùë·¼Í7gÿÛ›¾Ó´ĂÙë͹ØăˆŸ;߈ÅÔöÁ̉¿»›ÏÔ÷ÁÍåÅØ›»©‡¥2ßëMëĂÙíĂ›¡ơÀ¼ËÇ©‡¥2ßëM$ÛׇŒùן ĂÙ¹ÚưÀĂĂ ›­±àéMÏ̉½‡™‰kß [ïS±»ƒÖï½χ£äóÆÓº¹Ú¹̃±»›Ăù×ăˆŸ;ÀÛ‹Ù«»ÙƠÙî½ר­Ä»«ÔĂºÖ¾ÑŹګ‡“Íjëö¹•Ăù±½±»›¾«‡“Íj±»Û«‚ ½9¿ÁÙ×—¶ÀĂϼ³ƯÓÅï‡ÓØÏÔ‘÷ù×ă¬ÔÑõØ9¥‡™‰kß [ïS߈9¥‡³·«‡“ÍjÇëö¨‡¤2€̃êLg—»±ÖĂÙÑÄ뫇“ÍjăˆŸ;ƠĂè‹Ü›…µ†9¥‡9¥‡¿‰­ˆ«‡“Íjù×ǾÙƠƒvÙÛ«‚ ½9‰Á߈ÿ¯¶Ïª»éºÙŒë*«‹ÇÁ̉‘ơưˆ¬v§ôÁ½Û«‚ ½9ép߈ÏÔ±»½Œ™‰kß [ïS±»Ϻ½Ăé‰ñ5ñ·‡~ëö«‡“Íj¶ĂÙă ÷ÁÙ½߈ơÔÏ̉ù¸íê·Åÿ¯¶™‰kß [ïSăˆŸ;ăˆŸ;­ÄăơçÚÅô›¹Ư€ß̉ª¶2tTçôÏÔôÅØè‡éJé‰Ó5“gesÁÅ™‰kß [ïSăˆŸĂÙă»·Ô¿‰Û«‚ ½9ÎÔÛ«‚ ½9›¾߈©ÇͪÑæ£ÔÚù×÷Á̃ˆÇñ”߈Úª‚ +¼9»ôáêăˆŸ¹ÁµØĂñÓ“Èù×íÉ™‡Ÿè±»ëcĂÙñӵة«»£Øö§Ó±»‡ŒÑÓ»‡·‡‘×8çœÁ<ÏÔöå‘«‡“ÍjơÔù×ÇƠÏÔÛ÷Á߈ÿ.ÑØù×߈åÁù×™Ôÿ¯¶ƒØ‡ºÎŽô‘ƃÁËÏÔóÂơèÅ÷Áé‰ñ5ñ·óÖ¯ƒßÍ>Û«‚ ½9•{ù×¶ơèÅÑÓÂĂƒØơÔå̉ ÓØÿÚÀ̉‹ÈởưÀ‚½™ÁáÛ™‰kß [ïS·§D %¶¼̀7ăˆŸíÖÏÅ̉¿ăˆŸÜÎÔ™ÓÚª‚ +¼9¡Èæ̃«ÔÙÚçÚëö“ȵØơÔÇß‚v‡Œÿ§÷°¿ƒˆƒv9¥‡¹¼áÜƠXóÂøơ­Ö›¾ăˆŸÛ«‚ ½9ËÇÑÓû؃v£ÇÙ̉«‡“Íj¿ôåסÔÇ»›¶éËÉ9½‡Œ÷Áûؽ€²Œº½ +ׯÁƯÏŽÔù×ívÓÓÍƠëö½›¡ßÁ™‰kß [ïS¹ÚĂ©ÇßÄÙ¼ƒvÅù×̀Ê)èÛ8¤ßÄÙ½‘ơ±»ùêéơ¯Èƒ½̃ˆéºÛ«‚ ½9̉̉ûØơèÅĂºËÇï‡ú̉*Û×½Ô½‡ưÀǺÇÇüÚÙ×åĂÙÓØï½Ž¼ĂµØö™Ô“¹ƯNưÀ›¾•‹H±»ù×đ¾6½ÿ¯¶Ùת‡’̀jçôÙ½§ÿ¯¶̃ˆéêÏÅË̉Ûº‚½Ó̉“…í‡ß„•Ó±¿·ÅŸÖÏ|­Ö¨Ç§ô©‡¥2ßëMÏÅ·ÔúơêưÀăàëö¿ÔµØÅÔ±»™‰kß [ïSÛ×½€Óˆ•=‘Û×߈³ºóÏÔ§ƠßÚÎỖˆóÂăˆŸ;ÙÚ¡Èơ¾Ûê§ô“¹ƯN9¥‡ßÁ…ƠÅØËÇ«‡“ÍjÍÓöÏ ±½X̣ÄÎ̉Ă¼•ƯÏÅ¿ÙÏÔŽçÚíÖù׽ᬫÔơÔ™Ó©ˆź߈ÓØ·Ø¡Á¹Ú‡±»­ÖăÁƒÚ½°»Á¹ÓÆƠơê­v₫®¶¯‰¯0߈ÅôÍÄÁ•™‰kß [ïS‡ºèï²Ơ‚v ËÉ9ϼ›Ú«‡“Íj¯È›¾£ä™‰kß [ïSÉ̉™Ă±»™‰kß [ïS¹ÚÙƠ™‰kß [ïSÏÔÍË)éÛ9¥Ă«Ñ̃»úÀ¹ÿÚăơƒvÛƠɆ­€ׯ¦ô ™‰kß [ïSí‡ÅÔÏ̉¥ÈơçÚù×ơê±»½€ù×™‰kß [ïS©Ó•êĂ ÇÖƒv¯×‚§·‡%­¾™¿Ü›¶éæÚÜ™ÏÅ¡ßÜ«‡“Íj¯líÙÏÄ9¥‡‹Ü·‡‘×8瘉j̃ZîS߈ÏÔ‘ÖêÅ¡ÔÙÜô¯ÛĂË«‡“ÍjÓºĐØƯÀÙƠÅỐvöÁèÚƒvƠƯº›¾ẳµaÀĂÓÅÍÄÏăëÛ‡ƠŸÅ•´ß„…ŒÓµ́v˜Ó±»§½ăàù×щ™ëéå߈ÍÜ“ƠÁ̉‰¿ÌÓêÁ̃ˆ—¶öÙ½’¹ÜNï»±»ơÛß»û߈ƯÓ ±)·ÔơöµØª»±»…Ö­¿°»ÛÑó·ÅÁ̉÷Á§ÓơĂƒ½¿ÿÇ«‡“Íj“Ƙ‰j̃ZîSǹå̉ Ưå©-ÓÔ©‡¥2ßëM½ÛÀW¤ˆ\0¡ÇµØ±»©›¾ÙÚ»‡÷Á™ơï½¹Ú°»߈¹ÚʾŸÅÅØ½ÔÓ̉™ÓÛ«‚ ½9©‡¥2ßëMËÇêö±ëØûîô,¢ää̉±¿½ăÁñÓö«ÑÁÏá=Ç̉™‰kß [ïS«âăˆŸ;ËÀ©‡¥2ßëMáè¯̣ÅÿÛóQÚ׫‡“Íj†ºù×̃»ú·Ø“ÏÅăˆŸ™‰kß [ïS±»ÏÔĂÙͼ·ØÛ«‚ ½9™‰kß [ïSç̉‡₫¼ĂÈûÓĂÎÔ ½¬ÄÏÅÍË)éÛ9¥«‡“ÍjÎÔ•Œ±»ÙÚÜÅ»™‰kß [ïSÛ«‚ ½9ï½¹¶ù×—ˆ߈8¤‡Öÿ¯¶߈ÅØƒˆ½™‰kß [ïSÛ«‚ ½9ͼù׋îă»êơ¢ä™‰kß [ïS©¼™Q߈ơ»«‡“Íj©‡¥2ßëM©ÓÓØ߈¯°Ù×±»á=™ơºéÓä̉11éº߈©ØµØ±»ÏÔÏÔñǓǙ‰kß [ïSëöŸñÖÑĂ÷Áơê‚ØµØèÓĂƠ÷$̣ǹڗÓÛ×™‡°»›¾‘ÆóÇ«·3uU§ÔøêÅÓ©Ó…Âɦ±»—ˆ‡“ÆØÚ›¶éÇÓÏơá‹ëë́̃¸­äáᙇ۫‚ ½9×¾‡ÇÛ«‚ ½9›¹Û«‚ ½9©‡¥2ßëMÏëöñ뛇߈çÚ›¡ϼ÷ÁÛºù׳Ƶ†êö±»¹Î•ŒÙÚ÷å5ÓÑĂ×›¾µÜơìĭ¾÷ÚơlÅÛ«‚ ½9‹Ü½Ơ¾GûƠëöù×ëö«‡“ÍjôÄù×¥ÙÚăˆŸ;…n¡Ưù꫇“ÍjµØ™‰kß [ïSµƠëöáêµØÅĂß%—¶Ù½¹ÚÜ߈°»Ù½³zŸÅËӯȫ‡“Íj Èé‡ù×߈¹›¶é«‡“Íj©º¥ˆ]1Ù½ẳ9¥‡ĂÙ—¶ÙƠ—ÛñÓƠׯÛ«‚ ½9½¶Ôˆ½¯G‹ø·‡‘×8çêöëö©ÓößÚëöưÀ™ÔÔƺ ©ÜăˆŸǽ÷¼«‡“ÍjÁƯ¶èéÓÄ¿(ÍƠÿÿ§º¾±»̃ˆ«‡“Íj÷å5Ó±”çôßÄÙÁ¼âˆ;û(°»ăˆŸ߈úÓÅ¡Á…Ö߈—Ó̉̉ív¿ôù×ÏÅứË¿“Èùê¯È«Û¼-ÍÓµØ×ÜÏÄöÇÖä̉ëö™ÁÙ½½€׌÷‡“ƠŸ«‡“Íjß»ûÏÔĂÙíÖÁĂûØ5¡ÛÅÛ«‚ ½9çÀăƠçÚăÇíÉ̉ƒöÇÖ¥à¿ÅÛ«‚ ½99¥‡ÁƯÏÔûÁd‡×9¥‡ăˆŸ;k«ÑÏĂٵų±»÷Ø¿±ë±»ÁƯ‹Ü߈ƒv«»óÇ£ÜܯƠ·§D ‡ÇÂٲȭÖƠXª‡’̀j³ ơÔƒˆ÷¼ï½èꛡÛöͽ™‰kß [ïS×¾ƠÁ±»ăˆŸï‡‹ÛÓÁ™‡ă˥ƩºƒvμËÔƠÍÄư§‡߈Ó¾é‰ñ5ñ·ÓÅçڣǯȟ¹Ñ߈ưÀÏÔÙ½‚ÿ›™Ôá ƒˆöûØÊØÙ½­Ä¡Ơ߈Ï̉ăˆŸ;ÏÔ†»ï³2߈½ÔÙ½êöÔXÙ½ƒv»ä̉ßÄٓƯ¾«‡“ÍjƠ‡“ɇ¹ÚʝĂÙ©ºăˆŸ“ÆÅÓőۥƯơêñ‡•½ÏÅÛ«‚ ½9€Ơ †×ñÍ›œ¿°»÷Á¦ºÏÅÉÅ«ºÿÚ÷ê‹Ü°Á ƒ¼Ô2ưÀñ—Ó°¿»ÓÁñáê«Ô™‰kß [ïSÏ̉¹ÚÅÓç4Ë̉°»­ậ¶©‡¥2ßëMƒvÖÆôÅØ·Ô’Æ̣Ẳºëö‹Ç¿ßÖÆ‡ŒÑÓĐÄꇵÈÙŒë*«ÙÚÅ–÷ÈĂ¹Ú̀Ä(›¾å»ù×çØ“Æ³¦ôóĺ¬¾ø×Ú½Óµ÷ˆÏ̉ơÔÏÅ«‡“ÍjÙ½ÏÔçÚÍ­HÁƯëÚôĂưÀƒv™ÏÔä̉›¡°»˜‰j̃ZîSù×çÇ™‰kß [ïS•{ÏÔƒ¾‘߈Á½‘¾‘̉ÇÛơêƠ¡Ôùר¼—ÖÓØà ؽ߈«‡“Íj©‡¥2ßëMçÚ§ÔơêóÂшăˆŸ£ÓÛº¶‡Ö8扱6«ÔcÏÔ‡ŒÏÔ¶èÎÅ›¡ëöµ†ÅªÚÇØG½¹•Ó₫®¶×¾º½€߈µ†±ÁÙ½Ă١ȉ¿Iù‡«‡“Íj˜‰j̃ZîS™‰kß [ïS½Ô±¿Ÿ¿™‰kß [ïS›°êØù×å̉ ›¶é½Ü߈€̣±»Á‡é/×:ªÚô꫻ѷóÂÏÔṆ̃ÛÄÓ¥àµØñ¹™ ù׿¹ÇÖÏÉáØ÷‡¸¼›¶éùדÈÚ‡x9¥‡—¾Ñ·ỡ÷‡¹€ơÄшƒvßÄÙĂÙÛ¥ÖÙ×ưÀÅཥˆ]1ÅØ£ä“ÆߌÛ,‰àùêш‡ƯÛëöÿ¯¶ăơÔÛ«‚ ½9«ÔƼ´-“Ơ¶È¡È«‡“Íj¢Ç™ëé噉kß [ïS­¾ƒv±»›¡çÀ¸Ú÷¨9¥‡×ăˆŸ;kµØá=»ßܱ»¥‹ă»̉ºƯÓ ÁÜÏ߈¬¼¼ÿ¯¶çÚ¿˜ăˆŸ߈Ö¼±»ƒvƒv¿À¿±»ưܾº«Ôù×߈Ù±»·ô‡Ç̃ˆÑŧØׯ‰ơå̉ ̃ˆöG½¹³ºó—¶ËÓƒơ»½ÜØ•{ù×­›ăêÓÔ×¾8רƺëöÅÔï²2Û«‚ ½9±»̃Á‘Æơꥈ]1†“ï³2»̉ÙÚÛÄÓăˆŸ;™‡ÇÖ«ÆăV›ÛÔÿÛèçä̉ëÇơêÏÔù×™‰kß [ïSƠ›¾ÏÅå̉ ™‰kß [ïS8¤‡£XñÓù×·‡‘×8çăˆŸ;‰ÁĂăÁÛ×¶èÙ×§Ó×¾½ö±»öÓ̉ù×Ơºm‡ÛơÔ‹Ç™‡‰¿IçÚÓÁ¿‰Û«‚ ½9ĐŰÈר™‡ŽĐÓ‹ª-ƒv™Á•ŒÙ½î»±»Ù½Ưº#™‡Ù½·Å¥Ø›¶éÏÄéÓ–ˆ£ØçÚ¡Ô¼ÙÍÇơÔç½ăˆŸ;ơÔÖÆöƒ¾‘µ†¯×—¶ï½ÿ Î ÏÔ©‡¥2ßëMÛ«‚ ½9÷ÁíÖ›¶éÇÖÛ«‚ ½9ăˆŸ;k™Á“ƠăˆŸ;匿N©ïƠ¹Úëö‚vƠùꙇ“ƺùê߈‡ù×§ÔÚ®Đívï»Úª‚ +¼9¥ĂëöÍBÍĂ½ù×½ö°»ßÏÿ¯¶ÍË)éÛ9¥·Ó ¥0ơÔ߈æØÙÚƒÖùơ¹öÏÔÙ9¹Úùê½ÍÓéÓÙÚ9¥‡’Æ¿½ËÉ9˜‰j̃ZîSô߈ƒv¹Û±»æÛ«‚ ½9ø¿ר½ÇÖ¨Ç ɹơê÷Ú‡x߈ƒv£ØÏÔ߈¡Áă3ĂÙ£Ø9¥‡×ơăvùÚÀ¹ËÉ9ï³2ưĂ‘ +Û×ăˆŸ;÷ơÏÔÙÚׯ½ÔÏÔ₫™‰kß [ïS¼Ă¡ÁÛ«‚ ½9÷ÁỞ³÷›¾ÏŽÈËÉ9ÑĂçÚǼÙדÈä̉ɇ¹‡ÇÛ«‚ ½9ăˆŸ»»­Ä»߈ùêóÔ±»Ѧ™‰kß [ïSéµĂĂĂ ›­±àéMÏÔƒÖÅØï³2ÿÛ·Ô«‡“ÍjÉ“ºƠÂ߈½Ôù×Ù½±»£ÔƒÔÇÖ¡Ô›¾Û×ơŸÚÛ«‚ ½9ׯå̉ Ûº÷$ơêùêëÓăơ°½ +ÁĂƒàè‰đ5đ¶«ÔÏÔ±ÔƒvăệÖÆ‡B÷Á‡»¼‘穱»¼€¡ÈăˆŸ;“ÇÚª‚ +¼9ׯËÉ9ăˆŸ;ï»±»ơÔÛ×çÚ½˱ù×Ù½½€ß»ûÁ̉‰Û©Ó±»áöá Ó•%Á¹ĂÙ¿‰±»̃ŒÚ,ϼƠÖÆß$£ÇăˆŸ;›vó+”·°»ÅÓ¯¾‹Ç¹Ú­RÏÔơ\¡Ô€¥‹‡Ç…ỢÇù×§ôăˆŸ×ĂñƯ¼ăÁ·‹ăˆŸ;¿©¼ĐÄêƒÖÛ«‚ ½9ĂÖ™‰kß [ïSå̉ áÛÛ«‚ ½9±¿ƯÚù×ỡ“Æ©ˆù×ç'ù×ÏÔơÔù×½ÅÓÏÔƒƯùÄÏÅơêƒvơêÙÚưÀ¥ˆ]1߈ư“ĂÈƯÙ½¹¶î½¾»±»ÎÔù×ÁĂöÍË)éÛ9¥߈µØ›ÚĐØ߈Ÿ}̃ÄØ±»ÏÔ«‡“ÍjơÔ·Ó ¥0ëö°»™‰kß [ïS±»˜êèäÏÔĂÙ߈öÚ§¹Û«‚ ½9Ă¼߈—Ö…»ï»ËÓívÛ«‚ ½9‹Ü½ŸÈ‰yÑÄë߈ÏÄAù×ù×™Ô§Ó̉Æ߈ËƠ¶÷ˆ9¥‡ăˆŸÍĂ—¶½Ăá=ëöçôíêö÷å5ÓÑÓ²£Ưáêí§ÔăˆŸưÀĂ›ÏÄù׃ÚơŸÅø|׿8Á̉Ù̉©°Ï̉öÁƒ¾‘ÏÔóӘȮ¾ +ăˆŸ;«ÔÁ߈÷ˆ—Ó—ÓºƒÚͽÏÔØ×˜‡ +¾ß»ûÑÓ°¿ ‚Û«‚ ½9ĂÙ—ˆ÷̉ö¶÷¼¿º¿ôÚª‚ +¼9½´‰¡Ơ™äÿ¯¶Í·£ÇÍÄå̉ ¾«‡“ÍjëöÑÓỔơºƒÖËÇÛ«‚ ½9ͼàÓ ºÁ«‡“ÍjÛ«‚ ½9ÑÓ³!ÏÅÛ«‚ ½9û×~¡Óơê÷ÁßÔëöÏÅŸ}Ăׯ¡Èéêéê¡Ûÿ§ËdzºóơêÑØר¸ÚñÆÙÚ©‡¥2ßëM¹Úÿ¼«‡“Íj±»µØ³ºóí¥âÁÀ¹Ó̉•Û«‚ ½9ÛăíØăˆŸ;׿8¥ÂÛÆÓ£‡ưº°»ï»‚Ú©ÜÛ«‚ ½9Ç֋ǺĂà£ƯñÆgăˆŸ;ÿÚ×ư­ù×»ôÑÅ›¶éưˆ™ơÏÅÏ!í¡È£Ç™‰kß [ïSå̉ ±»̉̉$¨¼çÇñÚÛ«‚ ½9ëÚ½™‡›¾ăˆŸÛ«‚ ½9ªÚÍË)éÛ9¥ëöÿÚùê÷Á‹Ç½¥§±»„Ú £ ÍÓÅÏÔĽ«‡“Íj߈âà(߈€Ó—¶¡Á¥Óׯ«‡“ÍjÏù·‡‘×8çö÷ÁƯÓ ›¡߈±¿Û«‚ ½9¿t¶ôöƒ9¥‡«‡“Íj™Ô¹¾±½á ĂïË̉¼Ă±…Ơ™Á‰à—¶ăˆŸ;£ä½€«ÔŸ}°»ÏŃڂ·ˆ¹ÚơèŪԮ̉‡ñ5ÑÓăˆŸ™‡½™Óæ*£̃±ëØë“Å`³ăˆŸ;Ë̉Ù½ûÓÎ̉…Ö߈ăˆŸ™Á¡ÈáÀ·‹Á‡é/×:₫ ăêƠXÿ×ß»ûÇÖ›œŒÇ½ôùơáê°Á«‡“Íj9¥‡±Ă½€éºÏ̉“ȡȨŒ÷ÙñÚñíÈÙ½߈ßÏÄØÙ½Ử½ÈŽƒÖªøÛטêèäç̃§ÓÓŵØÔăˆŸ;÷Ú‘Öƒ×ù×ôê8¤‡×߈ﺫ‡“Íjơé–ŒŽ›¾× ×Ü™‰kß [ïSƯºñÆç̉¢"¤߈‹ÇĂÙÿÇÏÔI¦Ó™‰kß [ïSëöơêï½Á‡é/×:âÛ«‚ ½9å»ÑÏÄăˆŸ;ѶÔXñƇ˜‡ éÓƒvŸ}³È™‰kß [ïSëöœ‡¡ÁËÉ9¿Úù×…ØÛ«‚ ½9ÏÅÉ̉¿ô‹ÇÁñÓßÚË“½€ơÅÆØ…ÛơêÇÖ±»å̉ €Ó¾ăˆŸ†xív߈â਺۫‚ ½9™ÁÛÀăˆŸ;›Ú›¹‡ºËÇăà¡ÔùëăˆŸ;ñÁù×ÏÔ³Ăô˜‡‚vơÔ¿́¿ÅÛ×ëö§ô½¿ÁËÏÔ÷‡í—GĂĂ ›­±àéMăˆŸ½¾ÙÚ£ØĂÈ‹Çơêëö±»?öÁ¯‰¿Iµaϼ߈Ü­Èù×Ï̉÷ơÏÔÙÚ÷àăˆŸ;k½€ƒ½›¶éƠXÛÄÓăơÓÛø×Ù½éí¹Ú«‡“ÍjƒØ²ơÄÑíë×߈ơÔáçÍË)éÛ9¥ö¾ô‰Û©‡¥2ßëM‘ƃv¿º«‡“Íj³ØÖÓ߈°»˜‰j̃ZîSËǹÁ½ú¡È¿‰ù×ù¿¯È™‡ûƠÑØ¹ÚÍƠ«Ô…Û½€ÅÄù׵ءdzÇù¿Ă½€«‡“Íj»Å߈ׯơĂÏÅ•%ƠX™‰kß [ïSß»ûÛ«‚ ½9÷ˆ¶è›¹™‰kß [ïSùסÁ»ÁÑÓªÚ¿‰°¿ù×™‰kß [ïS³½’½—ÓÛÔËé«%ÏÔ±»Û«‚ ½9ƒvëöĂقءÁ›¾«·3uUËÓ›¾¡ÛÍƠƒ™ÔÅô«âÏÄÏÔ·º«Ô‘±»¹ÚñÖߪívùêÅØ½ƒíÖÓØ§Ô™ŒŒaƒvá=½½—¾ƒº«‡“Íjó¶ùÏÔĂ™‰kß [ïSÛ«‚ ½9߈㙉kß [ïS·¡Ă©Ø߈ÿ×÷ˆÓŇŒ߈í‡ÍÓù×öÙ½ơêÓØƒ›¾·¸—¾‰Ô£ØÁ¹›¾Ù̉ƒv÷Ô‹Ûôå̉ Ư‰Ø̣Ç)ä̉&&Í­HÿÚûÓë™Hׯ«‡“Íjƒv™‡ó#©Œ±»¾×ÙÚÙŒë*«ĂÙ½ÈăÇ탈äĂơêïƠ±»¾ëÚçØĂÈÛ×ËƠĂº‘Ú«%ăˆŸŸÙÚù×ÏơñÚœÄÏÔºëöñ°»û¡Áå̉ «Ûïôÿ¯¶å¿çÚ‹ÓơÔ Á©Ó߈ëö¹Úï½ßÖ‡Û¡ÈçÏ̉µØ9¥‡÷Úù×ÏÔ©Èï»±»ÅÙĂÙƠơÔ¡@×¾ׯ·ÁùבÆ߈̣¶ôĂÿÚó|Ă óá ÷̉á­Úª‚ +¼9“ƠÙŒë*«±ôñåĂ¼ï½™ĂëöÛ«‚ ½9ívµØÙ½£ÇéÚÏŵØëÍăàïƠăˆŸă½́ÚØ-±·Ô…ôơêíơĂĂñәӾ߾»·‡‘×8çĂÙ—Ó™‡»½ÇÖ‹ÜăˆŸăñ߈¹̃ƒváÚª‚ +¼9¯‰¯0™‰kß [ïS«Ú£ÈÛ«‚ ½9Ù½—»ïÚöăˆŸ÷ÁÁ/󯾓Èɇ«‡“ÍjÛ«‚ ½9¹ÚÎÅß„÷ÁÙ½±‡ơö­¶Û«‚ ½9źÁ½¾¿ Û«‚ ½9éÚÍƠ­v“¹ƯN9¥‡Û«‚ ½9Ù½ºƒ߈ưÚ¬¿ÍÓÓÁ“Ơöë̉Ở¾Áaù×›¾µØ߈ĂÙáŸ\‰¿IÙÚ²Ơ%ÏÄÏÔó纟}ô ߈ù×ù×½àºå"ÏÅëö™‰kß [ïS¿Ø½ÅÓÁ̉ÂÖÅÙƯº·̣ÔX¦¹«»Ÿ}‘Æç¼»«‡“Íj¿‰êöî»ïºÏÅ·ÅơêµØƒĂƯÓ ù×Í—©¼¾ß ËÇăˆŸ½ÇĂÙ̉‹È¶ÈÏÅ®Ơ«»÷Á¿»§âƒvß߈ǺơĂƒvßçœÂœÁ…Öÿ¯¶ôر»±»«»¹ÅơÔ™ëéåŸ}ÿDZ»ăˆŸơÔßÄÙ•ŒÅاÓÙÚƒvÿگȷµ¢ƠùêÅØÀƯù×½ô™‰kß [ïS«‡“ÍjÑ+ƒv¸®ăơg߈§Ôëöôé ¸ÚñÓ‰Ûÿ¯¶×ƠÂÙ™‰kß [ïSÙ×Û«‚ ½9ùơÏ̉Û«‚ ½9ÏÔçôƠX÷‡½Ơº™‰kß [ïSñÓÁƯÛº¡Á«‡“Íj£ØưÁ¿ÅưÀ¯Óï»ù×ëö™ëéåăˆŸƒÖô» Û«‚ ½9¾Å›¾±ëتdóǃˆµØÙ½ÛÇƯ‰ÁÛ«‚ ½9³ù×÷ˆ“È÷ÁÀƯûÓƒvÇÖï²2›¾å‡ŒơéÛ×˽°¿—»ëö߈Û«‚ ½9ÛI¯¾ñ×å̉ ßÄÙ¨‡¤2€̃êLù×ÑÓÓØ™×¹Ú¡ÁùתºµØ±»·Ôï½ï»ÙÚÁ̉­Ø…»ÏÔ¹Ú«Ô¸Ú᛾°»ËÉ9¼ë9¥‡ù×ûàÁ̉Û×Û«‚ ½9đÓϼ¾‰¿IÙ½½ÏÔµ†¬Ö‘‹ËÇ«‡“Íjµ¶‡™‰kß [ïSù×ï³2‘Ó½“ÈơêăˆŸĂ¼÷ٵصØÛ«‚ ½9·‡‘×8çæÇÙÚívÁƯŸ»Ï̉áö÷Ôÿ§Ëر»­‹ñ×—ˆÅØÙƠ§ÓÙÚ麹ÚÑ+‡¿ôÉöƒ½ưÀ߈߈ÚƯº‡ºÿ¯¶§Æœ‡«·3uUɇÅØô—»™‡«Óăà‡ŒÏÅä̉¹Ú»½ù×ÿÇ×ÜÙ½ív˜ÁÙÂĂÙ¿‘ơÏÅ‘đÙNêö Û +»Èå̉ ĂÙóÇÛ׫ÓĂÙ¶ ÙÚ߈ăˆŸÛ«‚ ½9Ïá̉™‡¾™‡ƒv¿ë»ÁïÚ‡ÇÈ̉°ÁÛ«‚ ½9ăˆŸ;ŸƠÁ£ØÛ«‚ ½9‹öÁ Û«‚ ½9ùæÓ̉ÙÚºyó«~·Å™‰kß [ïS·ôÙ-áÛÛ«‚ ½9ëö«‡“Íj‡“­ÄÓ‚vß„¨º¸àöŸ}ÿ¯¶ÍÓăàóÇ߈ÏÔ®öüäƠ™‰kß [ïS¯×ª»ơÔ«ÎưÀǼ¢È(©‡¥2ßëM«‡“Íj©ÇÓÅ–¿ÉP®È¿‰Á‡é/×:§‡›¾²ÆÆψăˆŸ;kéÓ—¶Û«‚ ½9ñÙ£ØÍË)éÛ9¥Áă—ˆ«‡“Íj½±»Ơ½̀­Ù½°»ñÓƒv‹Üö¹Ú±¿ÛÀóÔ¿́Ù̉ÛºăˆŸ;ѶÛל«‡“ÍjưÀËƠÁ‡é/×:¹ÚĂÙÛ××Ó·Ó ¥0Ù½ù¾ÏÅ»$ùרëöÏÅơԙؾÏψñ×9¥‡×èÓù׸ȱ»ø¼ÿ¯¶±ó§¹߈«‡“ÍjÏÔ…%¾€¼¡ÈÅ£–ÓĂ›¾9¥‡ÛÄÓƠX™Ô߈ẳ±¿öø×Ï Û«‚ ½9©‡¥2ßëM¡ÔÛ«‚ ½99¥‡ơê·Ó ¥0Ç"©¼÷Á Á÷ˆ±»Æô+›¶éÁÏĵaù¼áêƒÚ‰Û‡Ûö»‹©¼é‡±»½ù×›¡ë ï½¾ËÉ9¬¶íÚûÓ±»ăº›¾±»íê…ÁĂ¡È‡×«Ñ™‰kß [ïSưÀơê¯G‹ø«Ôôؽ€ĂȹÚÙÚÏÔ…»Ơ¥Û。ŻÛÄÓÙÜ‹Çâ ©ÓàêØ½ùêÏÔĂÖ +Ô† +6 +¦j +ÅÔ«ÓÙÅ륈]1ƠÄæØÖ¾8·ÔÆ“¹ƯNËÖ±»ËÉ9µØ·¼Í7³ÈưºíÖ釴êé‡̃ˆĂÙ°»­€߈ÏÅ»$̀Ê)èÛ8¤·Ó ¥0ĂºơèÅ»¶ÜùåÛ«‚ ½9«‡“Íj×Ơ¿‰ƯÓ ù×ʹ‚vù×÷ÁËÓù×™ëéå9¥‡×߈·d‰¿I½€¡\9¥‡­¾ÏÄßÚ̀Ê)èÛ8¤÷‡ù׳ÈƯº ưˆ½›¾Åإ؜·̉ ¤0ăê¹Ú£‹ùשÀ›ÚíÁØÚÄÏŹڕ{¾ô­Äáê“Ơ»ØÏÅùx‚vïÅĂÙôv±ÛÚ“ºñÚßÚëöïä߈—ˆ™‰kß [ïSĂ¼»¢ÀĂå̉ ăˆŸ›¶é±”ñÓÍ¡Ѳ½ĂáăˆŸ;‰Ô‡ăÁÏÏÅ߈ˆшơêÏĹàƠơÏÔÍÓëöÙ½ưÀ¾‰÷ÙơÄÏÔ±Ôé‡߈â¶ÏÔÏÔ½ͼëöǼëÚ«‡“Íj«‡“Íj‡Úèê·öăˆŸ;´ÎùêñÚÏ̉ÏÅ®Ơ²º̣ÅØÑÓ8¤‡Ö©Ç˹ÁËóÇùסԛ¹’Æ,³ÈµØ°»Û«‚ ½9§Ó«Ôëöù×ÚÆĂô×Úƒvơêö°»¥Ï₫&™‰kß [ïSăˆŸùêÛÚÓ ‹›æ±»¢ä¯G‹øÍË)éÛ9¥’º ¹ÁÚª‚ +¼9¹—±»ăÁÅØùêĂÙÑÓĂÈơÔËÓÚª‚ +¼9áö³Û«‚ ½9¾‡Ú¬Ú±»Û«‚ ½9³Ó­vÅØ„ù×ÅÔĂÙÑÓÅâ‹Ç‡ŒÇØ—¶¹ÚÇÓÙ½ÏÔ¹Úăơ÷Áù׆ڪ»åÁéê“Ȫ¶2tT½Ø¸Á·Å°»½9¥‡åÁ߈ÏæÏÅ›¾»¦‹Ü±»Žƒ½ׯĂÙ߈9¥‡éÓÙçôårÏ̉±¿›·ÔçÚ·̃Ă¡Ô±»ăÇíÿ¯¶çôÙ½›·Ô·̣Ù»ÛºÏŃ‚ù×%‘ÛÏÔ¿‰É6±»„ôáê“ƠÙÚ™‰kß [ïS­ÅÙÚ·ÔƠ½‡ÇÅéơؽ›¾ăˆŸÛ«‚ ½9§Ø‡ŒóÇơ߈ËÓñ¹™ ëö߈›¶éµØÅñíÈ•Èû›¿ºăˆŸ³ºóçÚË¿ưö¯߈»Øă›¶éóß×ÓăˆŸ;ÅÁëöăˆŸ÷‡‡»ñÓƯ.ĐÄêçÚ÷ÁơÔ¶‡  Ö8 æ §ÀÛ«‚ ½9¨ ÏÄƯÓ Û«‚ ½9§ôÁ̉›ÔơÔñÚ߈»Øß»ûë̀ÂăˆŸ;«‡“ÍjñÚ©‡¥2ßëMö±»á=¶ßÚ•Ú·Ôÿ§µÄ)Ë Åƒvù×éÚƠ½€·ØÆ̉ƠăˆŸ;ŸÅƠÙ½±»ñÙÚ¾ºåŒ¿N9¥‡đvưˆ±»¢XO±»ƒ½µØ«ÔơèÅëÂù×ÏÔ±»-·º÷©¼ĂÙ°»ùê߈ŸÖƠµ‰ơêŸ}£»½߈™‰kß [ïS¹Øƒv£ä鵨ÏŽ—¾½È°½ù׿ÅÅØ½ëøô9¥‡×‡ŒíÖéÚñÖ×°Ù§ô’È™‰kß [ïS™Óù×Ï̉ằ»‘Æ¿Ư‡Û߈‹ÙÑĂ·Ô³Å¡Û½ÜưÀ÷Ú‰Á¡Øùơø×›¾½ßÖ9¥‡ôø˜¡»¶½Û«‚ ½9±»¡ƯÛ«‚ ½9»yÙ½…%רĂ™ØøêÙÚ9¥‡ăơ9¥‡™‰kß [ïSÍÓƠù×ăˆŸ™Á×̉ºª‡’̀jơèÅù׃v¢ ¹à›¶é™‡щ™‰kß [ïSöÛ%ª¼“¼ÏÔÏÅÿÚ¥ˆ]1«‡“Íjш­đµØĂºùꙉkß [ïSóÇ߈ÄÓëöâà«»×Ë™‹‡ŒÛ«‚ ½9¼ÛùסÔÛ×ÿ.ëöÅØ«‡“Íj…à»ØçÚëö¯ÈÛÇÏÔàƠ›¾­Û«‚ ½9‹ÓÑÓëö±»½ơÄ™ôÂÙƒ¯×‡Œ©%ëÇɽ±»Ÿ„Øâˆ:Ù½ùêñÚöÏÔ¡Û§º₫™‰kß [ïSµØ»Å©¼ăੇ¥2ßëMÏÔ°»¡ÁÑÓƒÖù‡éÓĂ١ȹâÏÔÖÚ×€½8¤‡ß|“ƠÿÚ¯T±»Ÿ}­¾í‡Ç̉‰ÛÙÚû(ÑÓơê±»¯ÈăˆŸ£XϺ±»§Øéº’¹ÜNù×Ó̉°»™‰kß [ïS©¾çÚăˆŸ‹ÙÍË)éÛ9¥à=̃́v9¥‡ÏÔăˆŸ;µØ%ÁĂ‚Áëöá ívÛ«‚ ½9…»ƠX߈—»ÍÄÁƯ¿¹9¥‡×ëöăƠỞ˜‰j̃ZîSñÚ˜‰j̃ZîS½›¾Ù׼癉kß [ïS«‡“Íjí°»·Ô±»ÑÓµß镃vçǶ۫‚ ½9ßÚÚª‚ +¼9ÛÀ9¥‡¥ÁÎ̉ơêÓŇ¼¡ÈáƠí$•ØÅêù×ÔÓ“Æù×ɇ²Ø·ÅƯºÛ×ÙÚƠÚ¡Øç4¶߈ĐÓ9¥‡×ù×ĂÈëöơ¿ëĐĂÁƯÏÔ¹Ú™ôù×µà¡È÷å5ÓÏÅùêßÄÙưÀ̃ˆÏÅ«‡“ÍjÀĂÿ‡̀ÓÖ¾8µØïîÙ×ô +Ø*™‰kß [ïS™‰kß [ïSµÈ‹Çƒ¾‘Ó̉ÙÓ›v©Ü“Ơùê»Øç½ÙŒë*«˜êơQÁËQ«‡“Íj™ơÉĂ™‰kß [ïS‚v +ÏÔ·Å»ĂƠµØ¸©‡¥2ßëMÓÔáºơîÅăơÁĂƠùוÛăàÙ½‹ÇƠƒˆ±»ù¿½ŒæÚÏÔưÀÁ½ËÉ9»ÓÄ9¥‡ïÚÏÔœÂÑÓ¡¡°½‰¿I“ß»û™ëé噉kß [ïS¹ÚÛÇ8¤‡Ö‡îÛ«‚ ½9™‰kß [ïSÿ¯¶¹Ú9¥‡Ơ¶ôëöƒ¾‘ÍË)éÛ9¥™‰kß [ïSÅØÆå̉ ÙÚÁƯµØÏÔŹƒvƒˆÿÚ“Ơ½l÷‡­Ö“÷‡éê›ăˆŸ;¿‰¿ôÛ«‚ ½9Ï̉½§Ô·Ô©¼™‰kß [ïSöÙ½¶̣¥ÓßÖ·‡‘×8çYùê÷‡߈¬ÔӾ߇؛¾¹Ú½Ô½—Ú½¾ƒv«‡“ÍjƯÓ ߈™‰kß [ïSƠê›çïƠ™̃ÑÓÛÄÓ¯H‡ºößÄÙ8¤‡‰æ«‡“ÍjÏÔÏŶÏÅÍÄơÔ…Û̃ˆ߈™‰kß [ïSÅù×ÍׯÑÓ£̃ØÙ½χƒvçÚŸ}«‡“ÍjĂÙÚª‚ +¼9ñÓï³2ÇØ‚vÁ×Ű»¿‰߈ßƯ…ơÆæ4ÍƠăˆŸ‰ÔÙ½ÿ Ø߈Ù×9¥‡éÓµaÄÓíÓËÓ×̉ŸÅß„ª¶2tT½߈ßÖ×Ơ†7§j—¶ăˆŸ;ÅØ°»ĂºªĐưÀ¹Ú¡@á$ơÄ߈Û«‚ ½9߈߈Ưº—¶ׯÏź·‡‘×8çëöƒ¾‘‡ágơèÅÑØÑÄëµØÛ×ơ‡Å£äÖåÁëö§ÔăˆŸ;kƒˆ̀ĂëÓ¡Ôç'߈¥¾™‡½߈½€‘vÁƯÿÚå‡ëöíÆÔXü¶ƒ›‡ÁĂÛº©àív·ÅéºÓţسûӢ䛶é§Ôù×™Ô߈÷ÚŸ}™Ôù׳ۺ‰÷Á½±»êö)çŸÙŒë*«•×±½øêơÔÙ½Û«‚ ½9¿£ƯÍ₫ÓÆÁÓ¿”{9¥‡ŽßÁĂÙÅä­¾›ÚÚª‚ +¼9§ÔêÚƒvÑØˆy߈ÛׯƠÑÄëÑÄë”{½Ẵä›vƒÖÅØ“ƠưÀ°½ ­Ä«‡“Íjӷر»ơê½óÔ«Ô¡Á«‡“ÍjñÓáñÓ±»ù×ÛÜăˆŸ;ß»ûăˆŸ;ÑÓÓÓÁƯÏÔíÆ¡ÔñÂÏÅ«»§ ùׯױ»ÅÔ«Úù×߈ÑÄë¹Ú­½¼¾0ŸåŒ¿NÏÔ™‰kß [ïSĂÙ߈ˆƯºÙƠéÚƠœ·̉ ¤0³µÏÄưÀ·Ó ¥0¹Ú™‰kß [ïS›¶éÑÓ­ØăˆŸ;kéêÿ¯¶µØ‡Ç™‡±¿›¾¿́ùê“È—»Á½Á̉¥ƒ½µØ­ØÏÅôµØª¶2tTö«×ßÏăˆŸ;™Ôª¶2tT˜‰j̃ZîS°»Ù×8¤‡ùơºíÁçø¿ă»Ï̉³Çù‡‹Óƒv­Ư۳ȧӸÚív‰á™‰kß [ïSá$ăˆŸçÔ¡”¤¾ ¡D»ĂÍÓÍı»éỌ́ÓÆƒv½€óÂרùׂԋǙÓËÉ9ºÅm¯»›¹±»¾ºÿÛơê߈å»ỂñÚµØÏŰ»›¾8¤‡Á̉ÏÅëÚ‚¡\ĂÙ½ÿÚß›̃÷ˆ§¹ƠÁ³Ç§ôÁÙY«‡“Íj¾Å÷Áç'·×ƠÚÛ«‚ ½9¾öÏŽÍÇñ̉ÙÚ ª ‚  + ¼9 “&¢»‰Ù½¹àµØù׃Ößôº©¼“ÈÛ×—¿†º·Å¯‰¯0ÿ§ù×…Ơ«ÔÏÄăˆŸ;kåĂé‡é¼³·–¾ óÂÓº˜êè䩼½ô£ä«dß„¥Ø±»‚v÷Áöˆ½¹Á8¤‡ù׺ш“ȫԯÓáÛĂÙÏÔî²2ưÚù×ưÀ»µ£Øøæµ!߈ÁµØÏÔ¼€ËÇƠÚéÔĂÙÅÏı»ÏÔÑóùŸ‹Çç—ˆǽÓØÛ«‚ ½9Ç‡ăˆŸ;Ù ·Ôơº¿́ÏăÁáöƒ‰Û¿‰Á̉•ŒÛ«‚ ½9³Çæ«ÑÎÔ/¿‰™‰kß [ïSÔXÏÔçô÷‡»ØŸ}½ưÚξ߈ÏÔñăÖăˆŸ§ÖÙƠº߈“È—¾£ä̃ˆ£äïƠª‡’̀jŸ}§Ô™‰kß [ïSïÚªÚ ™ëéåÛ«‚ ½9щ˜‰j̃ZîSĐÄ ê ©y“È¹à“¹ƯNô¯àưÀ̉‘†ŒơÔ§ß÷Á½˜êè䯷ř‰kß [ïS÷Áƒv£Ç¼ô÷‡ĂÙÚ×ÏÔ¿‰ßÚå×釫·3uUÏÅÁ™‰kß [ïS·‡‘×8çÑÓ‹ö‡º‰¿IÏÄ‹ÇÁĂ­Ä÷‡éêĂ¶Û‡«Ûß»û­Ô·æ™‰kß [ïSÏÔ±»Áëöóǥ⡩¼ÀĂăˆŸ;kéØƯ‰ͽĂÛ«‚ ½9±»«‡“Íj¯øĂº¾‡đ»`”́·Ô¹ÚĂÙ†Œ   ͪ™‰kß [ïSÛ«‚ ½9Ï̉«Ô‹vñÓñÄĂÙÙÚ°½éđºÉÚª‚ +¼9ù׫‡“Íj¿º€º¤ˆ \ 0 ưÀ—Ó©¼ù×Ï̉°»›¾«‡“Íjívö߈…ƠƠÑÓÏÔ¡ƠÓÓÁ̉Ô΃vÛ«‚ ½9Ở€ÛÏÔăơ™‡̉ÅăˆŸ;̃Ϋ‡“Íjëö™‰kß [ïSÛÄÓÿÚïßö½ñÓơÛ©¼˜ÛÛº™Øƒ×­˜ẩ‚àÔXÛƒÚ̉ů¾ÿÚƒ ơê½³ăˆŸ;ơÔ÷Á¼ôùט‰j̃ZîS±»߈½ÅÏÔăàƒÚ™‹߈ƒvă»ƒv×Ăÿ¯¶9¥‡ï³2ĂÏÅÙÚăˆŸ;·ôÙÚ”½‡ŒÿÇÏÔ‡ĂÈÎԾɽơêùש‡¥2ßëM‡Œ߈ÏÔ§Ô»½Ù½àÓ¼«Æñ~ׯ¹Ú›êăà‹ÜÛ«‚ ½9ơÔ—¾ÓÆ©ÀÛ«‚ ½9Û«‚ ½9­€™‡§ÀÓØ“Æëöµ‰ƒàưÀ˜êèäăˆŸ;ÙÓơèÅœÁ©Ç¹ÚǺçô×$ĂÙ·Å‹ÓÛ«‚ ½9̀ÓYĺÑÓ½€™‡ö¶°¿êößÄÙ½äôÿ$«‡“ÍjăˆŸñÓă»¹Ú©‡¥2ßëMƒàƠÁëö«Ú·ÔûÅÏű»³« ©ƒ»5íÓ‹ø½©ˆ• ưÀ$÷‡‰̃«‡“Íj×̉™‡ưÀÏÅóÑĂÉđÆÓºù×ÁĂùêáØñÓ¨‡¤2€̃êLµä¯}©¼ÖÆ¥‰ÍL…ÿ¯¶ÏÅâàÅĵÜơêß»ûå̉ »̉߈¿‰߈½ÏÔÍĽóÇĂ¼ù×ÙçôÉƯÓ êö«‡“Íj“ÆöÁ¶±ÁùêÜĂÇÖ½€Û±»¥Á«‡“Íj›¾ÿÛ™‡¡ÛçÚ±»ív´†±»ÅØ8¤‡×»Å߈ĐÄ ê ­«ÔµÜù×߈ù×9¥‡—¶éºÛÇèêư“ñÔåN¢ÇöƠ°»ª» ăˆŸ½€¥ÏÁƯăˆŸ;ké꽘ô¡Á9¥‡÷Áƒ½§Ô©Óß»ûăˆŸ;đÁ¾ßËƠưÀĐÓ™Ó«‡“ÍjëöÂÙéŒÜùæ߈ß»ûÁ̉ÓÅå̉ «ÑÚª‚ +¼9ÏÔ±»ƒvË%߈±¿éêÍÄ¿ôÛ׺ŸƠÛ«‚ ½9Éá ½ëÓˆï̉́v çÚźŸÜé‡ù×ëƠUív‚ +ׯƒÖ剹ڰ»ù×ëö4Ó¤ívăˆŸ;ăˆŸ;ëö—¶ù×Ă¼Á½›·ÔÔºl±»µ†ôê­½¼Í­HÏÄö“Ỡˆ¯ÈăÇí׿8ÿ¯¶Û«‚ ½9²¾ƠÚ߈ưÀÛ«‚ ½9ÆưÀ÷×Ó¶ÔĂÈ£äßƯ±¿ù×ĐÓ»¥½…§çÚ©ØăˆŸđÓẳ÷‡üÁNÙ½ƒvÔºlƒvÅÓ»‹ÏԻر¿Ïı»ׯÁ̃¸Ú±̉£ä¹!¼ôƒÖÅ«‡“ÍjÛ£XªÈ‰ŸÖ½ùׯƒvù×ÏÔÑĂÍË)éÛ9¥“º°»º¹¼¹ÚöÙ½Û«‚ ½9Ï̉¦ôÿ¯¶ăơ½€ưÀ—ăÅØ•½“öåÁ9¥‡×‡ …ôăˆŸơÄh°»ËÇ·§D ÅØưÀ¤Øí‡°¿‚vƒvºÑæщëö߈ª‡’̀jû +ß»û©Ç™Óă½Ê%ĂĂ ›­±àéMé‰ñ5ñ·Ë¿ăˆŸ;ÛÔÏÔÍÓÿ¯¶Åϼ˱Û«‚ ½9™‰kß [ïS¡ØăˆŸÓÙùê‹Ù8H¤‡HÖ=£ä©¼±»Ëӡȑؙ‡Åᙉkß [ïS÷Á±»ÇصØăˆŸ†äưÀ±»÷ÁëöĂÈëöùô»ƒØßÚ‹µăˆŸÙ½‡Œ×ëöÅÓ¹óƒv±»ÑÓÄÓ‘°»û(©Ü¹Ú­Ö™‰kß [ïS…Œÿ¯¶¹̃‡ºÿÚ«»Ăô¡Áù×·ÔÑÅÀ ÷ÁÚª‚ +¼9ß»ûẳ½èÀ¹ÓØùס%™‰kß [ïSăˆŸ€ºáƯÅĂƒØÁƯóÇơêù×ÉÿƒvË̉÷ÁÔơăˆŸƒv±Ưâˆ;ºÈçÚ’½5¾ƒÖª‡’̀jđÁ÷ÁƠ£äưÀ‡Œ¿‰ÁăÏÔù×ívéÓÁ½Ù½ÚĂù×Ûº™ĂÙÚ«Ô÷ˆÑóÓØG½¹ÿÚ½ù׫ÔËÉ9ƒˆçÚă½Ž¹Ú‚vù¿ă꥖®×ĂĂ ›­±àéMÁ±½ËÉ9íºĂ ÙÚÛ«‚ ½9ƒ½¿‰÷ÁöÁ£XÁ‡é/×:³ÈÑæ߈ÅÓơÔëÚÑĂ÷ÔÆÿÚ†Œ‰yÙÓ«ÔÚª‚ +¼9¥Øƒˆ¤ÛƯ±á›v™‰kß [ïSÑÄë±»ö™‰kß [ïS«ÔÏÅÁ¾«‡“Íjù×ÁƯÍļôÛºÑÓ«é‹Çƒvíêöä5̉ÍéÚƒvưÀÅ»Œ¾…ö‚ØÏÔÛÚƒÚªÚ …ÖÚê¢äß„±»±¿ÍÄå¿™‡×$Æ ½ĂÙóÄÙ½«‡“Íjëö™‡÷Á™Ô¹‡ÏÅÅØ£ä™‡½½¾ƠÅ­¾«Ô“ÈÍåù×Ûף؟}ù×îÅÏÔ±»ơ걿8¤‡×½™Óù×ù×߈ûƠ°»ÏÅÏÄëö߈ÚÀĐÓµØ߈ƒv¡»Û«‚ ½9ƒô‹Ç‡ñ5ËÇ«‡“Íj‹Ù©ÓµÈß»ûÖÆ µ‰½€·‡‘×8çƒØ’ǽĂÏÔƯÓ ơÄô™‰kß [ïSÓØ߈Û«‚ ½9ñÓ̉Ńv¹ÁÏÔĐë԰» +›œ§Û±»Â†ÙÚƠƯºëö߈å̉ ­ÖÎÔÏÔÛ™Á™‰kß [ïS½úØÍÄ™‡·Ôº½±»ûØÏÅ»íºƒ₫Úß»ûăˆŸ;k¡ÔëçÏĩǙ‰kß [ïS«Ó×Ơîô­¾ÅÓùןŋÜñÆù׳ٽ۫‚ ½9ÆñÓƒvá=›¶é½€˜Á§Ôù¿·ÜËÓ„¾ăÁ…ô¡Ơ·Ô»ˆ„ÚÏÅ«‡“Íj¿ºƒv×Ơµê½ÏÅÆ¾£ä‡Û¾Å‡Œăà£Ư»ô‡ëö߈½ØÑÄëÙÅëơèÅÏ̉§ô¤ˆ\0ưÁÏÅăˆŸ›¶éơèŃכ¾•‘³Ở™‰kß [ïSëöçôÏÅÛºí—G»ÁÚª‚ +¼9“‚—¶Ù‡Ï9…³Ç鼃àÿÚëÓ…£­·‡‘×8ç±»̃ˆ°»Û«‚ ½9«‡“ÍjÿÚóɼ«‡“Íj™Ô¿‰¿»×ƠÔơ)á=Ù½ñÆ¿ßôêÎ̉ÉƠ“Û̃ˆ¿ô¹ÚµØÑ·ÏÔ¥ˆ]1“Ç„«·3uUưÀăˆŸÿ ÖĂÑÄëÇ»óÇ߈ÇÖ™‰kß [ïS©ØùסÁưÀăˆŸ;‡›¶éơêÛ«‚ ½9̣ÄŸÖ₫Ï̉±»±»ö™‰kß [ïS«àª‡’̀jëö¤Ó±¿°»ïƠưÀÆ~¹Ú­ÄÏÔ¡ÁÙÚ™‰kß [ïS¤ ‘©ƠÇÖÏÔ¡Ư‡ÇÏ̉ƒà÷Á¿¾¯ÈŸÖ߈ôÄŽ±»¿ô‹ß:ËÇÛ«‚ ½9¾ă¼÷ÁшÅØÛÄÓĂ)Ñ”ùëÛ«‚ ½9߈­ÖÙ½ôÔÍBÛ«‚ ½9­¾ưÀÿ§…«‡“ÍjÓ¾ù×ùשӫ‡“ÍjßÄÙרăˆŸÏÅăˆŸ«»ÁƯơÔ¶ù×ÇØ¿ºĂȇƒvéÓ‡ùº›v÷ÁñÓÙ̉¥ˆ]1ƯÚï½ÑÓ‹ÇÅÔÅÂÏ̉ßÚĂºßỮËƠĂÿ¯¶£äơ»ĐÄêÓØÍÓ©Ø™‰kß [ïSƒÖÁ ¾«Ô×Ơ†7§j»‡ùׇº™‰kß [ïS¼€ß»ûÎÔÏԹڧԋܪ́ăàÛÚơèÅÛ×›¾Û«‚ ½9ÏÔ…àÙ½ăˆŸ©àéÚ»ØÁ¥Ơºm±»·ÅËÉ9ƒÖ™‰kß [ïS«·3uU³ºóưÀ¹ÚăˆŸÏ̉¿Å©‡¥2ßëM±½‚9¥‡Áø›¾±»ÿö È¾§ÔÆÿ§å̉ ï½›¾ăˆŸŸÈù¿½€ÏÔ­ÔăơÙÅë×ÜÏ̉ơÔ½÷ÔñÓà¤<+ü$/¤¦!¯Æ9¥‡•Ç™‡²Ø«‡“Íj̀ ¬H ÿ¸Ø×£»÷‡±ÔÏÅÏÄÛÀóǽÁÓÏÅ™‡«‡“Íj¾ß°»¿‰½ơêĂÈÏÔơÔÛ«‚ ½9»ÑÄëăˆŸ;½ăˆŸçƠ­ÖÍÄ©¼¯×«Ô¨‡¤2€̃êLù×߈›¾ÏÄÆÓ‘ä9¥‡»ÜÏÅÏÔơÔ±»»Øù×ùרÓÛ«‚ ½9Ù̉9¥‡Úª‚ +¼9¿áÑÓ̉º©ÇåÁ¿ßÑÄëŸƠ9¥‡µØÏÔ¹¼—˜£äĂƠívÏÅ·‡‘×8çクï½Å»“Æéꌾå̉ ‚ÖÅØ“ù×ăˆŸ;k» ùơ„öÿ¯¶9¥‡³«‡“ÍjăˆŸ;ƒvÏű¿«‡“Íj½»ͪá¡ÔÙ½¿‰ÏÅÛ«‚ ½9ù×ÿÚ×ôÏÔÙÚ¿ØóÂÀÙ“Çđ˜‰j̃ZîSăơƠó¶Ï̉›¶éçÚÑÓÏÔ›¾ơÅăˆŸ;“•ŒÂµØù׃ӋӧӘÁơê¹Ú· +ĂñÓĂÙóÂÛ×Ó™‰kß [ïSơèÅ—ØÓº¿ôóÇ÷ÁåơÉĂ߈÷Ú»ˆñíÈñ×ÿ¯¶ÛÀÿ×ÏÔÖÆ—ˆ̉̉߈¿ºÑ·ß»ûä̉ÏÔׯ«‡“Íj…ƠƒĂ©ØÛ׫‡“ÍjÙ×ă‹רăÁËÇÉĂ©½…+«‡“Íjƒ×«d»‘Ó‰¿IÛ«‚ ½9™‰kß [ïS˜‰j̃ZîSÏı»ÿÂ‡ăˆŸù×¾º¹Ö›¶é—ÁÙ½³Á‰ăˆŸóÇö‡x«‡“Íj±»±»ơê߈«‡“Íjº™‡ͼƒvÛƒvù×Ë¿Óϼù×ñÚăˆŸ;‹Ù¡ÔóÔăˆŸ;…n«ÔƒvY١ȻūÔç½å¿ªĐÛ«‚ ½9µØá=¤Ø“Û­Ö÷‡¥ˆ]1©Øù×߈Ơ´Û«‚ ½9ÍÓÁ€º¿̣›¿ôơê±»ùê߈í»‹½ªº–Ø£ÇÓº‹Ç÷Á“Ơû«â±ëØá̉ùê½€¹Ú½€Ơ¿Ú÷Ô©¼›¾ˆÏĹàù׿‰Ưº‡º±»Ù×ù×ôÄóÇ÷Áª»ƯÚ߈ĂÙ›¶é߈¯±ëöƯÜëöµ¨ÿ¯¶ÑÓ§Ôáê¶è¡ÛŒÓØ›¾ăÁ·‡‘×8çÑÓåÖ¡Ó₫ ®¶ ăˆŸªø½·Åë̀ĂÈÙÚÛº¿‰ÛÄÓº¼ƒv´ÎÁ½½°»ÿÚÛ«‚ ½9ƒvưÀăơăˆŸ;kù×щë˜H•ŒƼưÀëÓκßÚ¹Ú“ÆÚê +åºưÀÿ̃ÏÔ½µØ­¾íɶÔÛ«‚ ½9¯¾±»‡xÖ̉™‰kß [ïS¡È÷ÁƼׯ«ÔỊ̈̉¹ڱ»‰yƒˆơèŶè9¥‡ù×ßÄÙÜËÛ±»ØŒê*ª™‰kß [ïS™‰kß [ïSœÂ‹Á½»ˆ±»Û«‚ ½9ÏÔơê×ËYÏÔ¿±»ÍÓăˆŸöÁăơ߈ÖÚ¹ÚŸ\ÍåϺâàóÄÓ«‡“ÍjÍӹړȧӫ‡“Íj9¥‡±»ª‡’̀jù×ÍÓºÑÓßÖ—ÓëڷŵØÎ̉™»ơüå̉ ‡ŒÍË)éÛ9¥ßÁ°ÀÇŒù×±»ÎóµØëÚÁÛ×ñÄ©¼ƒĂăàƠ¿½íÁï½ĂÙ™‰kß [ïSßƯù×ÂÙ±»ϼÛ×Û«‚ ½9•×ơ걿Á‡é/×:ºÅÔĂù×Û×ƠÄÏÔ™‰kß [ïS‹ÇµØ±»ăàÍƠ‡ñ5Û«‚ ½9¯ÈÙÅë/ïƠ±»«Ñß½Æ9¥‡»‡·Ó ¥0À½ëö½±¿ƒv±»óïÙ½—ºÈÛګԣ䛾ÿ§‰ơ½ƒ¼ăˆŸ¿ß߈9¥‡½Ô¡Èv«Ú³¹ơê½Ôíº́Á÷ˆ¿‰߈ÏÔ‹ÇÓÆé¸¹Ú«‡“Íj«‡“Íj½§ÆơÔ½ăˆŸµØï½©‡¥2ßëM™ëéå¯×ï½›¾YóÇÇèơÛ«‚ ½9öÏ̉‹Ç«ÔÍƠºøơºưÀ£ä«»¹ÚÙ½­vƒ×ä̉ŸèÑĂíØ¿èÄô¹Ú«‡“Íj¢Ç‹ÈÇÖỞÀĂ½ĂÙ±»́&–Gyϥư»¹Úù×™‡ï‡¡Á¥ˆ]1˜‰j̃ZîS§ô™‰kß [ïSíÁÚ×ÅØ«»«‡“Íjç…Û«‚ ½9·Ø«‡“Íj÷ÁßôÏı»¡Û®9¥‡߈æ̉ù׫‡“Íjù¿ĐÓư“±»í—G±»—¶¡ÛëơèÅăˆŸÙ½ÙÓ匿NŸ\ƒvĂÙ¡ÔăÇí¿'ÙíËăˆŸ‹Ç­½¼¬¼¼Û«‚ ½9÷ÁĂÇÖ߈đÖß»ûáƠß„ÇèéêµØÛ«‚ ½9¾…ö×Ơ·È®$éßáꇿǽÅØä̉ëö߈±»©ÓÏĹ²ØƯ)í$´ï‡ÅØ­éê8¤‡×»yơ꛾щ‘«Á½ ÊûÛ«‚ ½9ÓØĐÓÙÚÏÔÿÚ±»¨Ççôơœ‰¾IƒàÏ̉ÏÅ‹ëë´Å‡“ª‡’̀j½±ÔÙ½9¥‡×̃ˆéꙉkß [ïS³Â9¥‡ßëö±±»•Çơ‡¤Æχ¡ƒv¹ÚăˆŸ;ăˆŸăˆŸ¨ÚçÚÓ̉¹Á½ĂȇÁƯ¿ß­”Ü̃ˆ™‰kß [ïS­ÄûñÜù׫‡“ÍjÛ«‚ ½9È̉™‡¡ØƒĂâà ßÁơêóÔ·Ø«»–»ÅØ÷ÙäÆéÓÛ«‚ ½9˜× —¶½ƒÏÄA¶Óؽ€ù¿°Á©‡¥2ßëMŸÅ±»ûÓăºĂ÷ÁñíȽéJé‰Ó5“gesÁÅ™Ó߈½Û«‚ ½9Ơ‡ŒßÁ±»ó¾»̣Ç÷ơ„Ö)ÑĂÏ̉±»ơê”߈«‡“Íj±½ù×™‰kß [ïS¹Ú¶£ °)÷‡‡¹½Ø˜ ê è ä ÍÓ”±»ô½ó¶«ÈÏÄ߈±»ƠÅØóÓÆÅĂ¡hĂٓȰ»µØщçơç±»Ï̉™‰kß [ïSívº ăˆŸ;ƒv₫®¶äÁų¹ßÄÙ߈ªÔŸÖ·ÅÙŒë*«…Ôß־ߡÔǽó¤~½Ôù×±»ïd·Å÷ˆ›¾§Ó̉Æ™‰kß [ïS«‡“Íjëö˜‰j̃ZîS£äØ×™‰kß [ïSƒØ½ÔăˆŸ“ÈÍË)éÛ9¥ăơ«ÔÏÔ«‡“Íjǽ‡ÇÛ«‚ ½9ßÚưÁ—»ß»û«·3uUëö½¹)¿»ơêÍăˆŸ;Í­H̃ˆơê×ƠÛ«‚ ½9ù×ëÓ½©ÓÀĂ—¶óÄ«‡“ÍjºÚÀ°½ ߈£ƯçÚ¿Àëö„øô“ƠÚª‚ +¼9ñÓĂ·Ô±»¸ÚƯº•×ÿÚå̉ ±»ƒvñÓÎ̉ͼñÚϺ¿ÅÅÔ±”ׯƯÓ °»ïÅÙÜ‹qñÓÏÅï¶¼߈°”Ă„ÚơêÓEíÆÄØñÓßÄÙ߈ûÙöÎÄ@Æô ™Óô߈߈å̉ ÷ŸÀŸÁƯÑæóÇ“ÆׯÚª‚ +¼9³ÔéĂÙ›¶éÉ̉ˆ;ăˆŸơꎗ¶Ïšȑƫ‡“Íjá=ôăˆŸ;Å¢£ØÄÓÚÅÛ«‚ ½9ºy—ơèÅ¥ÛơëԋÜă๠Ơ÷Áâà±»ù×§ÔÇØÂƒ¾‘Ơ«‡“ÍjÏÔù×Á̉ÏÔÚÀ +¯¾Ù½«‡“Íj߈ÏÔ¹àánăˆŸ;kǺÛ«‚ ½9©¼‚văˆŸ;ƛ˿‘Ûƒˆ½²Æ™‡ÏÅÏ̉‘®“ÆÙ×Û«‚ ½9£qùש‡¥2ßëM÷ÚƯơ×ÓçÚÇ֩ܫ٨Ç×Ó¿‚×ĂÙ±»‰ ¼ÙרÍË)éÛ9¥çí³ØơÔ‡x±»óơ걻׿8ùêËÓ¨¼ë§±»ïÚ±»Û«‚ ½9ăˆŸ;kƠ×ùש-¡ÈÛ«‚ ½9ÿ.Ó~߈±»™Ó½9¥‡‹ëƒv9¥‡¶ÔÓØµØÛ×ÿ¯¶÷ÚØ×­ÖÏÔÿÚ匿NơÔ…öÙ½¶¼̀7¾¾±»¶ºơêÏ̉ÑøÏ̉»¡Èëö¼ÎÔ·Å™TÁƯ»ÅÅàѶ¶ÔêöÙÅ냾‘ñ¨Úª‚ +¼9ív8¤‡ù×Ưڿȃv£Ô«‡“Íj9¥‡ăˆŸ“ÆùׇÇÂÅßÁçô¹ +™‰kß [ïSϨ‰Û߈ƒà®ùײ‰ÛñÚÿ§¥ˆ]1åÓ¡Ó›¹÷ÁñÚăàăˆŸ;ăˆŸ;©«©‡¥2ßëMÉ™ÓÛ«‚ ½9¹ǾºƒvÏŹÅÁ!ơÔï»™ÁÏÔ±»¡ÛăĂ3ñÆ«‡“ÍjÛÄÓçÚöĂÙù×ơê߈¹Ú©Ă¸à½çÚƒv·Êö¹à¡Ơ³Âơꃈ£‡×ǗÚ¯G‹øĂ₫µë•Ú¥ˆ]1Ÿ»›¾¯ÈŸï½—¶ÑÓåĂñÖ­Öó»äÂ ăˆŸ³ùăơùơíê߈ÏÔÛ«‚ ½9‰ÛÿÚưˆ‡¿ồÓù×§ÓưÀơăˆŸ;ăˆŸ;³öÁơê‹Ç¹Ú™‰kß [ïS̀Óé‰ñ5ñ·«‡“Íj¹Úcv­ÚÁƯ¼‹È0¡Ô±»—¾ù×¾­Ä«‡“Íjׯíê‘Ù½‡º­Ñ½™‰kß [ïS±»Ơ›¹Û×—¶߈¯G‹øƒÚå̉ ›¾ÛâÑØ¿ôÉÛº£äϹå̉ ÀĂØY«ªÏÔăˆŸ;këöăˆŸöÄØ—ˆª‡’̀j¶Å“ƠđÂáê߈ Ëûëö¥È·ºÏÔÏÔ‹Ü…Ơẳ½½€«‡“Íj¿‰Û«‚ ½9±»ƒÖ9¥‡ŸÖƒv½ẳÁ̉×¾8 óǧØ÷Á߈ͼïƯñÓ™ÁÏơiÅ̃ˆ½Ø™Ó§ÓûéñÓ†Ú¶ă»½Á‡é/×:ĂÊÙ^ơƠ߈ô§ÔăˆŸ™‰kß [ïS‡Û£»ôÙ×á¾ơê߈·ôºÈ«»ÿÚơÊ Ëûщƒ½8¤‡ÖÏù×·ÅáØ‹Çù×ÆÛ«‚ ½9¿ÔƠĽÔá=˜‰j̃ZîSÿÛÏÅßÄÙ™ëéåË̉ÆçÚñÖ9¥‡·ÔôG½¹Ñ=óÄÇĂƒv9¥‡×éØÏÔ‡º»Ù߈ÿ¯¶›¾ÏÓôƒv™‰kß [ïS”Œ½…Œ™‰kß [ïS¯ÜỞ‚vưÀƒöôêÏÄ«‡“ÍjĂÙƒ¾ëö߈ö߈©éº±»¶½ÛÇ¡»•Èû›ÏÔ‹ÇùוŒÛ«‚ ½9Û«‚ ½9ÙÜØÜä¼Ăׇ֕ÛÇÖ¡öÁGÅØ¥ºÏÔùê‹‚ÏÅ”¾ÍÍË)éÛ9¥£ºÛ«‚ ½9ëöñÓ·ưËÉ9ªi߈ơ»…•½‡Œ•£Êß»ûđ”%¾ù×߈Ê%ơÔÑÓ©ÓëÓ³îÙÚ“½¹Úëöơê½ơêÏÔ›·ỒÊ)èÛ8¤‹s·Ó ¥0ùơѶăˆŸưÀËÉ9Ṇ̃Ï̉ÏÔ¥Zó¥9¥‡ºøư$Û«‚ ½9Û«‚ ½9ÚçÚïÅï½߈ăÚáØ—¶±Áº½§Ó¦ÓË̉¿ô«‡“ÍjñÚ§1‚vơÔÓÆ“È«‡“ÍjÅÁèºËÇ9¥‡×±½¦Èî¸Úëô«‡“ÍjÏØYƠÔùºÙÅ뛾ƯÓ ˜ÁµØ³ÁƯ׿8ɦÛ«‚ ½9ÁƯ±»ÇÖƒ¾‘™ÁăˆŸ;Û”ÏÅ«‡“Íj顙ɯføê½ͽ˜ ê è ä ÏÔ ËûßÄỤ̀ €º ÈưÀ¯ÈûƠ©‡¥2ßëM¡Û‹ÜÎ̉̀Ó½àĂ¹ÁăˆŸ;Ö¼å̉ ›¾™‰kß [ïSªÔ¨‡¤2€̃êLơÔ›¾æÚÏÙ½º™‰kß [ïSÛ«‚ ½9¥ˆ]1ñÚ÷‡âÁÏÔ§Ô·̣¡ă½ÁơËÖÚÀ+ÅÓºµØûăˆŸ;á ơêÅÔå̉ Ûº°» “¼†ºïÚâơù×ç¹í—GÂÙÙ½ơêYĂÙƒ¾‘ÏÔĂÈ߈Á̉Źڿ‰ÏÅơèÅ¥Úḯ¾£»ăˆŸ;ÙÚ¾ôĐÄ ê Ù½œØóÂöƠÚơÔ±½ƒ¾‘¼ĂÛ«‚ ½9ßÄÙÂȃڋÇÉÛùơÏ̉Ǻáê„Ø±»ĂôÑƯ™‰kß [ïSå̉ …Ơ™ÉÛ«‚ ½9ÁƯƒ¾‘߈ëö¥Ó¶Ô›¶éË¿ÄÔ«‡“ÍjơÄëöæÛ«‚ ½9ø×ñÆÚª‚ +¼9ù×çÍÁĂñÆá곺ó߈SÛ«‚ ½9ŸÈÇØ˜‰j̃ZîS™‰kß [ïS±»ù×ăˆŸ;ßÛ±»9¥‡ßÄÙ»Ø߈¯½­Ø½ĂÏè‚vù׿‰ÓØƠ±»¥Óêö³È̀Ç÷Áö߈±¿Ăéă¼Û«‚ ½9®¾ í”ßÄÙù׃vÅîÅ߈çô«‡“Íjư‡±ù1ơêÁ‹ÇÑØ8¤‡×·‡‘×8ç‹Ù½Û«‚ ½9ùë¥ñÑÓ±»—»¬Öå̉ ŽăˆŸ¾ºï»ơ»«‡“Íj§ôŽ¥ÓẮØÇÖ™‡¡Ù9¥‡×ĂÖ÷ˆIù¾½Ù½¡çµa½ˆ!¨‡¤2€̃êLăˆŸ;k9¥‡߈‹Çù×µØÆ¹ÚăºɇåÁÓÅÁƯ߈ÑÓÛ«‚ ½9ÇÖÍÄÍË)éÛ9¥»ÜơĂ­Ö‹³ív¤%̃ˆÉ̉¼ôËƠ…Ô™‰kß [ïS›¹¿ôÛ߈X½çÚ›¡ÏYôêщ™‰kß [ïSﻃˆÙY£Øç$ÅôÓØóLJÇùº™‡åĂÏÔÙ½ª‡’̀j™´©ØÙÚ‰yË̉ùê³Ø½½µØ‘ÆϹñÆăˆŸ;©·‡‘×8çƒvñÖ“¹ƯNƒ¾‘̣ԩƽĐÅB½ëöåÁÏÔ¿ßǼ›¾߈ùë½€ơ»ĂÙÛ«‚ ½9»nµØ¡ÈßÄÙÛºª»³•Ö‰Ô”ÇÖùê™ëéåÙÚÅâˆ:kăˆŸ›Ú“ÆíÖ퇙‹ăˆŸ;ÏÔ±»£ØÁƯøêÿÇ™‰kß [ïS±»ÏPëö½ÔĂµØ¡Á«‡“ÍjÑëđ‡ºï«óÜŸóËǾ™‰kß [ïSרí$ĂÙÂ’ÈăˆŸ;ßÚ“&ùס©¼À¹ŸÅÅn߈ÓŸq™ÁĐÓ#ơê߈‡ÚÿÚû±»¿‰ñÏÔâ½ +˜êèäÛ«‚ ½9±»éÓ‰Ô÷‡©¼ÂÙñÓ«‡“Íj±»Đ×߈ƒˆñÓÙ½ŸÄ¤ˆ\0‡Œ›¾•ÙÙ½¡Áơê¾Ë%ÎÔ¹Ú½ăˆŸ;߈ù¿“ƠơÔëö¯Û¹ư‡±ù1Á½‰¿I¼µØå̉ 8'¤‡'Öù׺¡ÛỞ¹¼«‡“Íj±»ºÿ¯¶ưÀ“Æù×ׯ°»ơÄÛ«‚ ½9·‡‘×8çöù×ëö¼€ ›ĂßÄÙ›Y™‡Û«‚ ½9ÂÓÑÄëƒˆá «‡“ÍjÿÚöíØÉ̉¡Ơù×¥ˆ]1‡ÜÏÔ—Œ9¥‡ÅÛ×ív…Ö߈É'óÇóÇÛ«‚ ½9÷Á¹µă˜ÿ¯¶9¥‡µØ¾¹$Á¼°»ÏŃØí…ÔÓ¹ßƯ×ñÓ¨º‡™·Ó ¥0÷ÁÓØív߈•шùô½€°½ăàáê߈Û¹ÿëÛˆ™‰kß [ïSÅÓéê±»¥ˆ]1ׯ匿N¡ÛñÁµaÜ™ÔñÚé»Áï9¥‡ÓØưÀ±»­߈ù×Åô—ˆ«‡“ÍjÿÚôؽơÔâµØçÚ¡ÔƠùê8 ¤‡ ÖµƠ²Èºy‡º˜‰j̃ZîSĂÙµØÏÔ™‰kß [ïSœ™‰kß [ïS›¾é‰ñ5ñ·“ÈÏžÅơê±»ר˜Û™‰kß [ïSÏÔÏÅ·ÔÛ«‚ ½9«‡“ÍjµØÖÆ‹Çû̉‡ºÛº½ƒרÙŒë*«ÏÄ£ÇíÁ«ÚĂÙ±»½º‡ŒăˆŸ¹»›¾’¹ÜN½ö¶ïi£»‘’Í­H±»ï³2Á̉ÏÔûƠÁ‡é/×:º÷ÁÙ½߈«ÔÏÔÙŒë*«Ưº¶Å¹Ú9¥‡©‡¥2ßëM¹ÚçăˆŸ­€èêψưÀư“Î| +ÿÛăˆŸ;k±»Ù½Ûº½°»ºù×ëÔ“È¥ÛÏÔ«‡“Íj©¼öĂ¢» ù×½€£Ô‡º—¾¶ô ăˆŸ;¸Ú ÷ỒĂéô›¾ÙÜëö9¥‡9¥‡›¾߈îÅ÷ÁèÓĂÙÛ×ĐÓ ăơƒº¿‰ÔͽÅØ÷ÁÙ½9¥‡©‡¥2ßëMÛÀû(ăˆŸÁ½ƒv«‡“ÍjưÀ…»½́v߈ív›̃ÿÂß»ûÏÅÍå·ºÛ«‚ ½9™‡˜‰j̃ZîS‰àÇâ‡ĐĂ%ï½£‡ö¡Èø¿®·‡‘×8çźçô߈ÍÓêÓÏÔ•`»½˜Ñ«‡“Íj8¤‡ÏÅ•ŒÍÄÁ±»ívƒ¾‘ëöÛ×ÇÖÓåĂœ‡©¼ù꫇“Íj•ŒßÁù×ÓØ…‰ơûÖËÉ9Ù½½€½¿‰«·3uUưĂĂæÅàµǾÆ¿ß·Ó ¥0ívÿÚ—¾Û«‚ ½9ßôׯÑĂ¡ƠÛ«‚ ½9ïÚºÅψ߈ŸÈ‹ÙäƠŸ¹›ĂÍË)éÛ9¥ÇÖùêí‡áØ›¡è‡³1¹Ú™Ø™‰kß [ïSöơÁƯÅÄ—˜ưÀ¡»ÿÛÁĂĂÊÁÿÂ8¤‡Öí—GăˆŸÀ«‡“Íj¡Û÷êƒvëö£»ơÏÔ™‰kß [ïSù×Ù½ÂăˆŸ;Û«‚ ½9ëö™‰kß [ïSí´ÑÓ‡x›¹«ÑơơÏÔ±»¶‡Ö8æáÓÁÏ̉¿‰ăˆŸûØÏÔóÔR…ô¹Ç™‡ÓÆ½Ă£­Ö­Ä»Ê¿ñÚẲív߈ăˆŸ;ÅÓ¼Ôư¦߈ñ׆Œ¿ØÏÔ½€̃ˆăˆŸ;k‚ëöœ‰¾IÛ«‚ ½9£äçÚ™‰kß [ïS½Ă»Å«»ï½ívÓù×ëö§ÓÙƠ•©ث‡“Íj‚‡ºăˆŸ½€Óˆ•=‘ƠÏÅéêÅØ¹ÚđÖù×Û«‚ ½9³ºó™‰kß [ïSÏÔ¿‰µaÛ«‚ ½9¾¹x™‰kß [ïSÏÅ™‰kß [ïS½«‡“Íj×ÜơèÅ÷ÔóÔ´Å*¢»ïpÿÚ‹Óº×Ơ«‡“ÍjÏÔ߈ù×ù׹ؑӼßôƠXƒˆ‰ß‚vÙâ8o¤‡oÖ¿ÅưØÙ½“½Á½ØÚóƯÑÄë̀ÓÛ«‚ ½9ă¼ö“Ơ·Ó ¥0¬Ö¿Ù©£ơéÅØơê½ÙÜÁ̉ÁƯö¡ÇÏÄ“ÆÓØÏÔ™‰kß [ïSÁ¹«‡“ÍjæÚø×›‡èô÷ٓȰ»‡ËÉ9«‡“ÍjÍÄÇ»ÑӵزØÀƯ›¡ëơŽù×å‡ĂǼĂÙËֳDZ»₫§ù×°»ÏÅ麷‡‘×8çÛ«‚ ½9…Ÿ}¡ÛĂÙ³ôơĂ¡Û₫¶Ö½Ù½¡È›¾«‡“ÍjÏÔ—äă»½€ù×Ù½ºÈ»₫®¶ÏÔ‰Ûơ$ñÓ¼ơÔỞß»ûçÚáÀíØÛ«‚ ½9߈ùê«Ôá °»™‰kß [ïS™‰kß [ïSÉÏù×óÇ™‡ëöÏ̉Ăºøê¿‰áÓçÚù×߈ùê÷ÁƯ,ÛÄÓơÔơÔ¥ˆ]1‡™Ơøễ½™‰kß [ïSưÀ•Œå˜êèäĂâÔÅ–‚÷ÁÙŒë*«ù×ăèÙ½ÁËóÊŸ}ù×í—G™‰kß [ïS˜êèä¹Úùå̀ÓÁĂÔƒà‡·‡‘×8ç½ÊÛÀ߈£Ø™ŽăˆŸ;µ†ñׯ×÷Á·ÅÈ̉¡·™‰kß [ïS¡ØµØÏÔºµØưÀ×¾…ÖÑÄëÄ–÷‡§ÖÁ‡é/×:ѶöçÚơèÅÏÔÏÔÛÄÓÅÔĂÙ½˹­Ä»ÖÓçÚóÇñÓ9¥‡ßÄÙÑÓÛ׺ÏÔ™‰kß [ïSÑÄë³÷‡§ÆỞÓÆµØ¿́ĂĂ ›­±àéMé£ÙŒë*«ö¯±»—¶ÿÚÀĂǼ•Ù½ÿ¯¶ăˆŸ™‰kß [ïSŽù‡±»Û«‚ ½9ÏÅÿ§ÁÚÇÖï³2ÉĂÛשӼ⼇xÙ-ù×hÉJÖºÏÔÍÓƒˆƒˆ½´ÅƒØƒØ‹ÛöÑÄëívơԯȇŒ߈ñƒv½÷ˆÏÔ©Ø£‡ùê߈§ÓÙƠ›‡߈ÑÓ߈¯È„Ø…Ô™‰kß [ïS“¹ƯN™‰kß [ïSÏÔƯÓ ™‡´ƠÛ«‚ ½9ơ±»éê±ÔĂ“ŸÅ‹È©½ëöƒÖ”Å–ª¶2tT­vư‡±ù1—ÓÁă‰Ô±%ÿ¯¶ëÔơêÖÓá=Ă¼ăÔçº߈ëöÛ«‚ ½9ù¾ëöµÙÚßÁ«ÔÛ«‚ ½9Î_Û«‚ ½9±Ư‡“߈Ă©Çù×ÅÍ›̉ƹÚÿ¯¶ƒ—Ọ́¶–»̀Ó™‰kß [ïSÔÓ̉ƯÑÓƒvë™H¼ÛÀĂÙ±»À¡‰¸Û«‚ ½9ÿ¯¶øæËÇÏÔ½±»°¿ñÚYº¨¼¯˜‰j̃ZîSơèŭ֦ƴ%—¶•÷Á¥Ùº™‰kß [ïSÙ½“½çºÛ«‚ ½9áêÑÓ™‡5ơéƠ©‡¥2ßëMñÖ‡Ú©Ó­¾‡Ú·‡‘×8ç¤ÂóÇÑÓĺÛ«‚ ½9–¦̀»!ăˆŸ;kÉ̉ăˆŸ;™ĂÙÚÍÄxÁçÚÅØ×ÓăˆŸ;ÜÓ “ù×ÁĂǺ³Ç™‡‹Ü‡ßëöÿ¯¶é꛾Œºƒv匿N‘«ÎÅưÀçÚ߈ƠåƠ˜Áù׳ĂÙ÷ÙçØïÚ̃ˆÍÄÙÚ›ƠÁ€÷ÁçÚô°»êéÏÔ÷å5Óî½ûÙưÀÛ«‚ ½9âˆ:߈™ô߈«‡“ÍjÙÜƼáÆÛº›¹רº÷‡«‡“ÍjñÓƯ‰‘™¼Ă±»ÍƠơèůÓßÈ̉(ăˆŸ;ç̉Û«‚ ½9™‰kß [ïSÿ +«Ô»‡·‡‘×8çĂĂêö¡È„Ú̃ï½™‰kß [ïS¾ù×ÏÔ‡Û«‚ ½9ôÑÓ«Ú·Ó ¥0½ö«·3uUŸÈù¿ƒvÅØÛ«‚ ½9•ŒïƠ߈Û«‚ ½9÷¸ÅÓÏ̉‡«»ÿÇû¼¹Ú÷Ôù×½́Æ«‡“ÍjơÄăˆŸ;Ở¹ÚơêùêÏÅÀ‡€è/Ö:ä̉  ߈ÑØ‰»ỞÁÓº½ƯơêÏÄ߈ùô“Ơí‡Ù½ƒÚ«ÔÏÅÍÄ×¾ù׫‡“Íj“ȡș‰kß [ïSÍË)éÛ9¥ù×ëöÁËÍË)éÛ9¥Ñ؆ǽ½×ÜÏÔí—G½Ô¡µâà•½°»÷Á™‰kß [ïS¼€Ûºÿ¯¶ôÛ×ăˆŸ;•Œ™Éøê0°»ù‡À¹«‡“ÍjÛ«‚ ½9ƠËÉ9¡»̃ˆÖĂăˆŸ;k™Óùד½•×¥‰ÍL…߈§ư‹S Ô±»ơ꣇“÷íÆ9¥‡ăˆŸ—½÷ˆ½€ơꙉkß [ïS±»ÛÀµØç虉kß [ïS÷Á Ûï½ăà‡º¿ÅàƠ˜êèäË¿Ơ©¡ÔưÀÏÔ«‡“Íjͼ÷Á³È²È ̃„ºy‰ơ±»ăˆŸ;êöơØ™‰kß [ïSœ·̉ ¤0‚ăÁø×–ŒÏÅ©‡¥2ßëMỞ¡ÈÎ ×ÜĂÈéÓÓÆß»û«·3uUÛ«‚ ½9ëö™‰kß [ïS«%ùêƠ·Ô×¾Ë%¡ÇÅ󸽓ÈË̉…»Û«‚ ½9߈åÁÛ׫·3uU°Èø×½·‡‘×8çË%™‰kß [ïS«ÔµØÅ“Æ¿¹¶èÿ¯¶ù×ÑØôŸÄ«‡“ÍjÙ½Ó¾ÁĂơêçÚª‡’̀jé‰ñ5ñ·±»°»°½ÏÅǓ˿ª ¨ƒº5½Ù̉†ºơêëöÙ½ƠX‰Û‡ºçÚµ†ƒˆå̉ ëö9¥‡É̉ÏÅÙו±»«‡“Íj÷Á”÷́ÆÇÖ«‡“ÍjăƠ»y¿ºÑ‘ƠÏô÷¶—»·‡‘×8çÁ‡é/×:ù×Û«‚ ½9…ØÙÚ…Ơ½€ÁÛÇ"Û«‚ ½9÷ˆùơƒvº±»ù׫ÔƠµ~Ñø´Øưˆ¯¼½˜‰j̃ZîSÏÔ߈ƯÓ «»˜‰j̃ZîSÛ«‚ ½9ùסȫԇºÏÅơê›¶é¡Ûăà—¶¡Ơ·ÅÏÅ“÷¹Úォ‡“ÍjÁƯ߈Ž›¾Ă$Û«‚ ½9óÂåñ»¹¾ưÀ₫ëöÛÀ•‡Œù׫ÑÙ̉›¶é»Ü½ÔׯÁ½Óëö̃ÁÁ̉ÿ¯¶ĂjÛ«‚ ½9‘Ú·̃·ÔÛ«‚ ½9íÖŽ»½©Ó…㻑Ô÷Ù̃ˆ «Ô­Öăà·Ôä×Û♉kß [ïS£Ø‹Ç»Ø›Ú‹ÇƠºmÁ¹ÏŀǫԾ»ù×Ù½Û«‚ ½9Ăº½ô±àơêÿÚ¿½”ºĂ¥Á9¥‡3éê‡Ç陉kß [ïSù×ÙÚẲ·Ô¥Ø߈°»ÁĂ÷†ø¿çÚ±»É̉îÅơ‡ö½ÛÄÓϺñÖËÉ99¥‡«‡“Íj¬ôXơê¼½¦ôÎ̉“¹ƯNÙ½ÿ¯¶›ÚĂƠÿ ×Ơ·ÅívÅÓẸ́º÷Áêö…ø»çϼßÖå¼ ơÔ߈ƯHƒÔ¶Ú÷ÀÏÔ“È±Ă¼ßÄÙƒÀ«·3uU߈ơêÀÍÓ©ºù×ËÇ™ëéåỞá=ưÀ³ÈÂÙÏÔ˜Ô¬ÅÑÅ•ÇăˆŸ;k«Ô9¥‡ª‡’̀j™‡í½ÑÓ¿́ù×·ÔÇÑÓ߈ù×ø×ĂƠÏÅ÷å5Ó·Ü÷ÔăˆŸ;k…ƠÛ«‚ ½9›¾åÜơ ï½çÚ™‰kß [ïS9¥‡ñÓ‡ÚÇ»Ë̉çôƒvĂĂ·ÅÅÄψ•܆ŒĽ™‰kß [ïS£äæÚ°»º©‡¥2ßëMăˆŸ;kÏÅ‚‡Œ†º§Æ—¶ƒṽŒ Ú, щĂ߈ĂÏ̉ù×ăˆŸ;ƒ½߈ƠÍÇ¡—»«‡“Íj Á½ÏÚ½…–«ÓËÖ÷ÁăˆŸ;Û«‚ ½9¼ëöƠÿÚº¦Æ Û9¥‡×¡Ô¡Ô߈®È÷Ú‡ï³2ùצÈ9¥‡9¥‡Ù½÷Ô§Óëö€ÓëöÏ)ăˆŸËǡԕŒÑËçºËƠ½ÏÄ•Œ߈Ϲ½Û×ơê9¥‡×˜‰ j ̃    Z îS ƒ˜‰j̃ZîS·ºÄ¿Ë̉Û«‚ ½9¾Åô“ƠÅ–¯‰¯0ƯÍĂƠٽ管ÁÚÆÛº˜ơ™öÁµØœ‰¾I±½Úª‚ +¼9ĂÙÛ×âˆ:ß»ûÍÓÍBù×ß»ûÚª‚ +¼9ßÚëÔ˹«&Ñ»µ‰íڕ£Ƿ‡‘×8çÔXÜ«ÚÏÔ™‰kß [ïS‘đ‹Çº‹‡ơԻءƠ¯×©Ơƒv«ÓöÁ ™‰kß [ïSưº¹ÚË̉«âĂÙ߈ĂÙ£X˜ôù×Ă¼À¹Ơ¾°»‡ÇĂȵس߈Û¹ÅÔï½½ØѶí½±»ëö÷Á½€ăĂ3ơêÙ‡Ï9…ÏÔ߈µØÇ̉…ÔÚª‚ +¼9¹Ú£Ç̉ºơԋDZ»êÔ±»ßÄÙ£ƯáƠßÁ‰¿IăàéêÇÖÿڄصÀˆÅÄù×—ÓÙ½ï‡ÍË)éÛ9¥ˆƠ0¿‰ëöÙRăˆŸ;Ǽ̉Ø©‡¥2ßëM¿¹ƒÔö›¾߈Ă¼ßÄÙăˆŸ;¥ÈÙïĂÙƒÖ9¥‡¶ÔŒ¿å̉ §Ô˜‰j̃ZîSû)›¾¡Ó÷›¾‰¿I©ÇÍË)éÛ9¥–¶÷Áúÿ–Ú× +8¤‡Ù½ƒñÚöÁĂÙïrÙƠÍĂóÂéÓùט‡Û«‚ ½9ÏÔ™‰kß [ïS©Øÿ§“ù×́½¢»ƒvÏÅĂÙ“Ơ™Á¹̃öÛÄÓ߈Úª‚ +¼9ÅÓ÷Úƒ½ÏÅ©‡¥2ßëMÓöÁÛÇÅÜÓ ù×ĂºÑ ưÚׯÙâׯĐØùײº̣©±¿ơꙉkß [ïSµØÓÔàƠ™‰kß [ïSâˆ;k‹ÜñÚÛº°È™‰kß [ïSÜø…»µØ½¯à“ƠÍË)éÛ9¥©üÀǽ½ù×µØ9¥‡éê8¤‡ÖĂÙ€ö¹à¥ˆ]1öÁĂÆÑ`½·ÔưÀ™‰kß [ïS•«Ô±ëØĂÙù׃vÁÿÚ×ƠŸÈÙÚ¡Á׿8ù׈«»±»ơºøê…ÔŒĂ‹È‹Ç™‰kß [ïS߈ăˆŸÙÚ©ÇăˆŸĂôçôå“‹‡Û“ +‰y½¿‰ÍÓọ́ƒö™‡Ù½«‡“Íj…¾Û«‚ ½9Ó¼½€í'ăˆŸöÛ™¨º ±»ÓÏÅィڵØÛתÔçÚù׿ÈÁ¸Ú©‡¥2ßëMơêͽù×ÍÄëö•½ăºÛ«‚ ½9Û«‚ ½9‡ÛÓÓăˆŸ;Ûº±¿í"ë³¥!©ƠƒˆÀ£ô‹Çù×¶¿¹ËÓ§ÓÛ«‚ ½9̃ˆƠŸƠ«‡“ÍjăˆŸĂÙï³2щÛ«‚ ½9ëöơêơèŪ»?ºÍĂ£ä߈‡̃ˆºØÅÓöÏ̉íÖÏ̉·‡‘×8çÆ™‰kß [ïSù׿ºẲϺ‡xù×°»°»ÙÚ™‰kß [ïSÁÚ¹ÚÏ!í§Ó½É̉ÓØÍÓăે“ÍjưÀ›¾ù×ÍË)éÛ9¥ñİ»›¡çÚ“Èëö¡»߈ù×ÏÔ¹ÚƒÖ³ÈÁÛ«‚ ½9«»˾½«»øæØÅêĂÙµØƯº•—…ÛÙ×ưÀÚª‚ +¼9ÂÙăˆŸ;Ÿ}Ă“Èăºö±»Ă±»ơÔñ×߈Ù׉Ի¸Ó¾â½çđëöăƠ…ƠÅÍË)éÛ9¥‹Ù“Ơ™ëéåƠùô¼€…ô߈·Ô›v©‡¥2ßëM¿ê¹·̣¾éê«ÔÈ̉÷$†¹ÎÅ©ÓñÚ…năˆŸ™ëéåëö¶Ø…Ú½€G½¹«óÛ´†Óˆ•=‘™‰kß [ïS¯ÓĂÙÇĂùןūחۑ±ÏÔÂĂïÚáƠÏÅÁÓؽ ív¯‰¯0½Ơ˜ÏÈÏÇ%—»­Ä¼Áó‹ܱ»½È¡ÁưÀ‡Ú™‰kß [ïS߈¿Ø¨Û×ÏÔ™‰kß [ïS«‡“ÍjưÀÍijÂü¦†™‰kß [ïS—»ÏÔÙ½ó^ÏÄË¿´ØæºÑ•ÏÄæƒvÍÄơ»«º›¶éù×½€Û«‚ ½9ô­•Ó™‰êöƠ߈áөدôÇÖï½€½UƒvĂÈÓ̃°»’‰2Ô,ø­½¼˜×ưÀß»û¤Ûº…öÛ«‚ ½9—»½ËÉ9“Ʊ»üÀÆ“º¶ç²°»³ÈÏÔÙÚăˆŸ;âˆ×¿8™‰kß [ïS‡xÚª‚ +¼9™‰kß [ïS£¨ÇÖ‰ÛÿÚÙŒë*«ưÀ÷ÚÇÜÅÓÏÅÛ«‚ ½9Ù½½˜‡»Á¿ÙÅØ•ÜÏÔ±»Á‡é/×:ÙÚÛ«‚ ½9ªÔ™‡í—G9¥‡ß˜êèäƯº‹Ç½Å»«‡“Íj̉ŃڠÁ½´È!¥ÂÙÚ«âĂô±»Å»Ï›¾ÏÔà=÷Áívºÿ¯¶ÙƠÛ•{ëö́ơù×›¾ĂÙÓŰ½ç½ù×›¶é©Ó¡Ô±Á‹Ç¿à»“¼°»³Ç·Ó ¥0ßÄÙÇĂÙ½µØÏ̉‰¿I§Ó­¾߈¿»Ăà9¥‡˜‰j̃ZîS‚r¬Ö¿ºƒ¿ÅïƠ¯¼Ï|§Ô±»Ăº¯ÆáöÉĂßÄÙÇÖ¾ç½ñÓƒ½¼™ÁßÖÙ½±¿éÓ¾»¼‘ĂÑÛ×ÏÔÖÆÇÛ«‚ ½9ôÛ«‚ ½9—¾ăÛßÄÙ½™Á«ÔÙ½߈“•ÇÇÜÿ¯¶«·3uU«‡“Íj̀ÓăÇí˜ÁơèÅ™‰kß [ïS߈Á癉kß [ïSă‘·ÇÖ›ĂÁ¹›¾½ñÓ¬¾߈¡Á—»ỞÑLăêÄÄçđ½߈‡Çù‡Ḉơ Û«‚ ½9÷ÁơÔ¿Øù×ăà³߈±»߈›¶é±»߈“ºơÔ¯ÿ¾Ï̉ÏÅô°Èª ¨ƒº5êö߈Úª‚ +¼9¯Ó߈™‰kß [ïS÷ÁÛ«‚ ½9ăơ‡×‚văˆŸ™ëéå·‹÷Ùº“ȇƯ8¤‡××Ă¹Ơƒ½Å³ôóÇÛ«‚ ½9ÿ¶ÎÅÇĂÛ«‚ ½9‹Ç™‰kß [ïSûï÷ÚÙ܋Ǚ‰kß [ïS™‡›¾ß»û™‰kß [ïSÙƠ«Ô•Èû›ăà‡Œ‡xÇØăˆŸ;˜ô·¦D ·ºŸÖ“ƠÅÔÏăvÔXŬ¾§‡ŒµÙÅëăˆŸ·Ó ¥0ï™Áÿ¯¶±»ăêøêÏţ؅ŒöÁ +á¼Û«‚ ½9å̉ ©Ç£à‡½Ôù×µØóÂÛÄÓŸ\½ƒvƒ¾‘•ªÚÑÓæÚăơđ‹Çͼív÷ÚëÔ°»ßëöÁ¼źï³2¡ÁÛ«‚ ½9¿‰Ù½ùêËǽ¾‡‰±6¿¸ÚÛ«‚ ½9ÑÓ«Úôëö¿»›¾‘ÖÓ̉‚v¹Ú¹Ú±»«»¬¼÷Á«ÔÇâÀ‡€è/Ö:ßÚ÷á«ÔÁÓÅ–·¸­Öó—¶«‡“ÍjáỞ̉ù×߈é‡ɇóÇăˆŸ;Ϲ¡Ô«ÔŒÖô꫇“Íjƒv₫®¶™‡ƠƠù×ơÄơêºy߈ˆ₫ÜỞ¿,±»‚kÙÅë© ¯È©Ó½–¾Î¾‰ÛÄÓÙÚƒvó½Ă÷‡̃ˆ8¤‡Ö¹Úù×½¢XÅØ™‰kß [ïSÙ×ëöYÙÅ뉿I±»ß»ûƒúçôơê±»9¥‡˜‰j̃ZîS‹Ç°»½±»ívö‡xçÚñÆ›¾™ôÏ(¥ƯỞÛ¹‚¾™‰kß [ïS¥£Ơºmâ<Â3x“ƠËƠ¡»±ÈƒvÁ½ƒv8¤‡™‰kß [ïSÛ«‚ ½9éºù×ƯÓ ·Ô¯Ô‹ÈщÖØ“ªÓÙáÛæº ù׵ث‡“Íj£¨‹¿“Ơ£äơêßÚç'ùêÛ«‚ ½9§Ơñ»Û«‚ ½9ơĂÚÆưÀ™‰kß [ïS˜êèä£äØ»ƯÓ ³Â߈íꣻö½Ë €ÛăÁƠÙÚàºÓµ¿‰ăˆŸ;k©Ó×ƠăˆŸ÷Á©¼9¥‡×ñÆ¡ÛÁÚ߈ùר¼ëöÁ̉½¡Û\Ï»ó“ß„ï½Ơ›¾ù׫‡“Íj¿(̀ơĂĂ¼ÖÔ†6¦j™ëéåöơp±»£Çô±»‡Œ±»›¶é±»Å»é‡¡Ôơº£ä½Á‡é/×:­Ö½ÔÏÔÛ«‚ ½9”Èú™‡ÏÔ±»ëö‡x¥ÈÁ̉ĂÙ‰ơûØàº8¤‡ÁƯ™Ô¾߈—»ƒàù×ñÖ¯Èôꙉkß [ïS© ëƠU“¹ƯN«Ô˱Ù½…ÏÔ˹ÍÓÿ¯¶ĂÛ«‚ ½9ÍÉ…n±»ß»ûëöåÁ˜‰j̃ZîS¡ÛщĂÈ«‡“Íj›¡Æ¾á ’ºßÄÙ§ÆØÆÂÅô9¥‡¿ëơê߈ÏÔˆ® Óº¸Ú Û«‚ ½9Ô¡Û÷ˆÏԻѱ»¼ù×—¶ĂÙÀ¾ơÔ¡ÛñÆ™‰kß [ïSă»½Ó¾ïØ‰¿IëƠUÀ˃×ëöÅ–Ù‡Ï9…ơºÅØÛ×±»ŽóăˆŸµØ™‰kß [ïSÍÛ«d½¡Ô÷ˆ¯È—Ó°»³—¶‚½×܃văˆŸ₫«)ËDZœëö•u¾º̣¶¨‡ +¤2 +€ +̃ +ê +L + +ÅØ߈‡ŒÙÁ¹Úëö±»ÅØëש¼£»ĂưĂ߈«÷ƒ½Ù½Ù×ÿ¼»Ø±Áï½Á̉¡Ô‡Œ™‡ăˆŸ;¡Çµ.¥Ù™‰kß [ïS¥Ưç$ÿÚÙ½ËֵؙëéåÁ̉›¾Ï̉ùê½¼€ï½µØÙÚăˆŸ;ăˆŸ±½›¡¶‡Œ±½®é«Ô Ơ«‡“Íjùê¿×Á½™Á™Ó›ÚăÇí…àơØ­ÄăˆŸ;ÇĂŸ\™Óï»Û«‚ ½9¾»©ÓÏÄ麱»Û«‚ ½99¥‡Ơëö¯¼°»!ùסÔƠÍË)éÛ9¥˜Áƒ¾‘µØ‘뙉kß [ïSưÚµÜÛºív•ŒƠ¾ÓŇÇù×Û«‚ ½9ó)ÇăˆŸ;qÜ…ØÈØÓ¿‰ÏÄÏÔùê߈ÿÚǨ¼ù׵ذ»9¥‡™ëéåù×麃ÄÅÔ±»ÏÔÍÓ÷‡¡Û̀Ó«‡“Íjƒvíê߈‡ºÿ…œ‡ĐÄêăˆŸ;̃ˆ©Øß»û§ôÅØµØÇâ™à›¾ô*™‰kß [ïS¥…Ù½½Q¥ˆ]1ưˆăˆŸ;k߈÷Ùá$ÛÀ¢»ù×ơĹ áêÛº±»ăˆŸºÏÔ«»¹Á±»¨ÇăˆŸ;÷ÁÙÚƯ‰«»ñÔñÖ¯È9¥‡·ÜÎŭăvÍÓ߈ÿ¯¶¥ˆ]1Ñ+£äß%ưÀơêù×ÓÆ¹ÚƠ½€™¡¹Úª‡’̀jơÔÙÚŸÅă½½ù×ÙÚ…Ú°½ÏÔƺ߈Ñ+¸ÚÑÄë߈ÇØ˜‰j̃ZîSĂºíÓ×ÜíÖ§Ó£äïÚ›·Ô¯àœÜ—¸ôúÙÚ½9¥‡•Èû›™Áç°›¾ø¿Ở›¶é÷‡ÅÓêö¨¼ù×Â*8¤‡¡ÁºĂȱ»Ǽ’È «Ó8¤‡×½™‰kß [ïSÿÚßÖùê¹ÚÑÓ«Ô¹Á˜‰j̃ZîSå̉ ñÚùêà¬ñ›™‰kß [ïS¼ ½³¥ØªÚ5Ơù×ÁÚôù×߈»ÜºÔ­ÄÍË)éÛ9¥«‡“ÍjؽñÖ°»½Ổͪ߈›Úù×¼€ÑÄ댾ƠóÔ¸Ú™‰kß [ïSËDZ»óÂơÔ›¾×Û±¿í¥ñÓ«»ôÔ™‰kß [ïSgÁĂ߈å̉ Ëû™‰kß [ïS­Öô꺙ëéå·Ø÷ÁÓØ¥È›¾ô±»‹«-‘‡í‡‡W½Ù“Ơ‘Ʊ»û¾“Æ«Ôá=̀½™Á9¥‡ßÚù¿ÙÚÎÅÍË)éÛ9¥ï½½¯×«â·‡‘×8çÚª‚ +¼9ÁƯµ†µ‰ƒÖ‚àëÚù×ñÚëÚ›¶é™‰kß [ïS™Ă÷‡¨Ø߈Û«‚ ½9߈¬Ö±»«Ñ‹Ç¹߈÷²µ†Ơĸ½¾Ž·ÅĂÚÀ™Ó³È¹Ú߈ù«Úá ³ºóÙÅëùê½¹ØÅÄÙÜëöù¿߈‰ÖÆÁƯµØ¥ºÍÏÔ÷Ú·‡‘×8çÛ«‚ ½9±»Ï̉ßÁüÀ½è«ơ9¥‡‡Ú±»ÏÅ߈½«‡“ÍjwÁĂÿ¯¶™‰kß [ïSùêăˆŸÏÅÏÔ·Å ËûÖ™ëéå‡Å$ßÄÙÖÆưˆ±»›·Ôùê÷ˆôØơÔêÓ»©ØÏÅ8¤‡ˆÇëö·‡‘×8çö¶ºÿÚ±Á»½×ÓÙ”‹ œH ÿÚĂÿÚ÷‰Æç̉ÁĂ½ëö±»ÍBñٳƆºưÀÙ½̣Ô£»ñÓ÷ÁßÄÙŸÓÛ«‚ ½9±»ăˆŸ́v—ŒÛƒv÷ÁÎ̉©‡¥2ßëM¥ˆ]1±»ÁĂËtÛÆ÷‡±»ͪù×¼œ‰¾Iä̉‹Ü¿º½Üô÷‡ÿ§—ŒóĂ÷Ùù×ÑÓù×ëöÿÛ™ôôÇÖß»û¡%¹¾ÑĂçÚ»»ơ'¹Ú¦ÔÁƯ©‡¥2ßëM¡Ô÷å5Ó™Á¡Èû©ˆù×éêơ°¿÷‡ÓØßÏăàÏÔưÀưÀôêѶÛ×·ÂĐĂçă»Úª‚ +¼9§Ô¡Ô™‰kß [ïSô³ÈƯºÏÅÿ¯¶ăˆŸ;ơç'åLŸÄÙ#Û«‚ ½9ÏÔ½óÔÑæ‹èáê½€™‰kß [ïSßÖó¡Ô¡Ô‡ŒéÓ8¤‡ÖƒvÀ̉«‡“ÍjÇÖ§ÀăˆŸï½áƒăƠÓÏÔ‹ÇƠ´³Úª‚ +¼9ÁËöû(Û×ÿ¯¶™‰kß [ïSÑ»·‡‘×8ç»±»Û«‚ ½9ÛƠ±»™‰kß [ïSׯçÆ«ÚÙ½¹Ú™äï»Û×ÍË)éÛ9¥ÿ…½€ôêÉÿ±»¯G‹ø±»íꙉkß [ïS‡ºµÈå̉ Ž©Ç¡ׯ¿ôÜÓ ÎÔ÷ÁÑ“Ơ½¡ÁçDơÄÅôÈÙûƠ•Èû›¿‰ÇÖơÔÛ«‚ ½9¸ÚëöƒØÛ«‚ ½9÷ÙµØÛ«‚ ½9±½ăÚƒv“ơ۱»™‰kß [ïSăƠÙÚË̀¹ÚÑØ×¿8ÏŽ§ÆÏÔù꛾ÙÚ׺߈ù×™‡¯×Î̉ù×àêÅØ›¾«»ÚÀß»ûÓ£ä‹ÇƒvÚÀ ±»ỞñÓ±»ÚÚÏÔÛ«‚ ½9ăơÅØöÙ½—¶ï³2ù¿Ơ½±»ÿÚ‹ÜÚÀ™œ¡ÔÅÏÔíÖĂȽ€ñÙ£ä«Ñ«‡“ÍjÚ—ÿ.ơêÓŰ»“Ơ¯È¯G‹øÁƯ«‡“Íj›¾ƒvëÚ­ÖÓÅͼ·Ó ¥0ƒvÛ«‚ ½9ÑÓï³2£Ø“Ơ¼é·«‡“Íj»‡™‰kß [ïS̃Á‡ŒÛ׿‰ơê½­½¼‡ûËÏÔ™ÁÅØ×ƠƒvÍÓ̃ÄØ¯¸¿ô¢äñ£µØ…ÇÛ«‚ ½9Ñøƒv±»ïÀăˆŸ;¦Ó½½‹Ç¾Ÿ}ùÚ‹ÜăˆŸ;kŸ}¸Ú™‹Ơ¾G­Ô“Ơ÷Ú¨Ơ˜‰j̃ZîS±»ëö¥‰ÍL…öù×™‰kß [ïS¥Óív»‡ÙÚ½ÑØ«‹™Á‡ÚáÚÿ¯¶›¾ÙÚ‹ÙĂÈ¾ăº“˜‰j̃ZîSù×ëÂÅÓォ‡“ÍjĂÙ³×ưÀ$̃ˆ«&ÏÅ̃ˆÖ‡¼7ăˆŸ;ÅêưÀêô×̉¹ÚÑ×™Áù×›¾ÏßÇư‡±ù1ѶƒµÚª‚ +¼9ăˆŸ;kçØÅÓ×÷Á™‡Ç÷öÛ«‚ ½9•Öô +©‡¥2ßëMº»ÈĂÿÚ±»Û«‚ ½9íÚÿׇº‡ºæ(ä̉¾ĐÄêÛ«‚ ½9¶ÅùëÍÓ£Ô©Ç·Ô¿»÷ˆƒv÷Ú©º÷Á™‰kß [ïS·Å¿™‡¨—¶·ÅƯ¼ù׫‡“ÍjÅÁñÖơÄưÀ™‰kß [ïS Á§ƠÙŒë*«½Ă¼˜êèä«ÚăˆŸÅÓÛÄÓù×ơê…÷ÚÏÄçÚăàô³×ƒˆ½߈É̉›¶éÙ½½—ÓËǃvăˆŸöûØĂ«Ô½÷‡¹•“Û«‚ ½9±»°»ËÉ9å̉ ߈ϺáƠŸÎ±»¯È™‰kß [ïS™‰kß [ïS‹ÜÑÓå̉ ÙÚăˆŸ;߈÷ÁñÆ™‰kß [ïS‘Ó̀ĂÜ·Ôå̉ ™‰kß [ïS¿^߈ù×₫›¾£»ñÖ™‰kß [ïS¡ƯöÁ¥ÆƠµ†‹œơĽÙÚƒÔƒvÍÆÖĂº˜‰j̃ZîSŒ&±»‡ÇÖ‰¼—¶ƒÖÍƠÚª‚ +¼9½§Ơ‡ÇÑÓ©¼ăˆŸ¡Ưù×₫Ç ϼ8`¤‡`Ö ©Øß%½Áß»ûơĂÙ½›‰ÏÔϺû9¥‡×ç̉Ó¾º—¶}Ëؽö·ÔÏÔƠă»£ä߈¹ÚÁ½›¾ù×÷å5ÓéÚ֯+ù×ñÖ÷ˆ÷Á÷‡Á™‰kß [ïSéÚ߈¼±¨Ø ´†Ăôϼ‹ÇëöĂÙ‡¯È›¶é“ƠăˆŸ;¹¶ưÀ™‰kß [ïSŸ}ß„ÏÅơÔ©Ó«÷™‡¿‰ÍË)éÛ9¥°»ĂÙ‰¿IÑÓïÁ‚›»Ûº‡º±́ÑÅÏÔƠj¾ơĂ­½¼̀Ç÷ÁÙÚ¯È₫ÉÎÔ§Ôù×™×ôêßÄÙª»·‡‘×8ç”öó߈§ ¡ƠéôóÇ×Ü¡Ôưºđ»ÛºăˆŸ;ÏÔ߈Ϻ÷Ô߈ăàºù×ùêƠ“¹ƯN¯ÈÑÓ™‡ÆØƒv½ôơéÛ«‚ ½9ĂÙÍĂ9¥‡£ÇÀñ×±»™ơÛ«‚ ½9ëÓ±½¹Ú›·º½ñÚ·§D Û«‚ ½9˜‰j̃ZîS„ÇÿỤ́ÇÅÔ™‰kß [ïS߈Ù½›¾ƒv›¾ºñ¼ßÖưÀ™‰kß [ïSƠ½Ï̉ÏÔ÷Úƒvó#ï½Û«‚ ½9›Ơ߈Ù‡Ï9…ù“Ơ©Ơå̉ «‡“ÍjĂă½—Óß„©ơÔ¹»Ơơù×±»·‹ÅÓÁ|Έ«́ùꆓ†ŒÆÑÄëÓÅ“ÈÙÅë•{ö‡ÇçºÁăˆŸ³qÏÅ¿‰߈½ô…à8¤‡×—Ă¥Ø¹ÚÅ–¾˜êèä߈…Ơñ竇“Íj«‡“ÍjĂáÛ•Œ±½đ̉¡Á¿º×ܱ»₫ùơ«ÔÛ«‚ ½9ỡÉêÆ‡x¿Ùù×™‰kß [ïS›Ú³ÈơĂưẠ̀«»8¤‡Ơ%ß»ûÙ´ºñÓ¹¦ôµØëö÷Áºy¹Ú¸Ú”‹œHƠûÑ`åĂÙ½ĂĂå̉ ÓÅ߈×ÓÛ«‚ ½9“ƹ¶†ÇƠÄÛ×ßÖÔơ¡ÓßƯË”½™‰kß [ïSĂÙ±»›¾«ÔăˆŸ;ƒvÚª‚ +¼9Á¹ÑĂ½ƒv±̉Û«‚ ½9ëÂëö±»£Ç̣߈¾‡Ç›Ú¡Ô«ÔăˆŸ;¡Ô«÷ŸÄÑÅăˆŸ;ùơß„·‡‘×8çͼ›¶é̃ˆ­•·™‰kß [ïS™‡‘Æ£ØưÀ©bóâ§‹ÑÓ¹ÚñÖëöÏ̉÷ÁÜ8¤‡đ±»º«‡“Íjå̉ ©”Ổ»½ºß»ûÅ­R·‡‘×8ç¿Úë™H‡ÁĂ½±¿·ÔđÓ +ù׉ǙÁ›Û߈©ï»×§ôÑĂ¼ôƒv…Ú˿ԲƠרÂÇÖ§Øíر»߈ÓÆù×ÏÔÛ«‚ ½9ëÏăˆŸ;—ŒëƯÏÔÁ¼̀Ó߈̉̉ơꙉkß [ïSÓØăˆŸ;å̉ ‚ÚĂÙ«‡“ÍjƠÛ«‚ ½9דƠÛ«‚ ½9µØ™‰kß [ïSö«‡“ÍjшÏÔëö«‡“Íjơêkß [ïSÛ«‚ ½9‡v™‰kß [ïS‹ÇÛÄÓâˆ:ŸÈØ×ĂًȺÁùêĐÄê±»ăˆŸ;ƒvÛÄÓ™‰kß [ïSÄÔç̃‘«ÄºÀĂÁ̉ƒˆÑĂ·‡‘×8ç9¥‡ăˆŸ;™ëéå…Œ«Ôƒv˜‰j̃ZîSƒˆ‡x·ÔăƒÚ½Ø÷Á¢È ¶£Ô8 +¤‡ +Ö£äÛê±»«&å̉ ³ºóóǹں۫‚ ½9ơèÅ—ºÄر»åŒ¿Năà÷ˆÅ¹ÚÁ¹å×ăˆŸ±¿…ƠŒ½ÇÖ—¶±»½Ơ÷‡®Gø¨›ƒˆÛ«‚ ½9ëÚ…»ÓÅXñÚ…Ơ·‡‘×8瘉,j,̃,,,,Z,îS,±»º߈ÑÓăˆŸ;ÿ¯¶¯G‹øÛ×ÿ×Ở«‡“ÍjăößÚÜ…Ơ¨Ø“Æù×¶è›₫ëöÓºơèųºó™‡ăˆŸ;¼Ô™‡ơÔ»cÛ«‚ ½9÷‡‡ĂÙ½Âêö›¾ËÖßç¡™‰kß [ïSÏ̉å̉ ù×ÄÓ ƒÖ¯È°½½ăˆŸ;ù×Ï̉‡xÇĂËÓ£ä‹Ù9¥‡éÓ߈‡ºƠX¨Ó…ôÏÄö‡»§Æ‡9¥‡½ĂÎ|ĂØƠ¹Ú›ÚăˆŸ;ù×ßÏ߈½ÛáÓÆå̉ óÂưˆâˆ:ă‘·ï»á §âÖ¾8ïä¡Á½¾‡Û«‚ ½9ÁÓ«»ùׇx¡ÔăˆŸ8¤‡¿́ëöÑ Á¼ù×Ó¥ÏÔÏ̉ÙÊ‚vÙ½ƯÓ ‹ÇÏ¿ºŽÙ½Úª‚ +¼9̃ˆ‡ºƠÅù×øê +ǼµØßñưÀÛÚ±»‰¿Iù¼µ†öÓµØôĂĂ›¾¹à™‰kß [ïS±”£XÄô±Ô³ô¿è×¾åơ¸Ú‡Úå̉ ð»ñÖÛ«‚ ½9Á½ívăÄ›¶éÍÄ߈ó™ơµØÿ¯¶‡Œ߈ÏźÅàÅÙ÷ÔÁƯ¨ØƯÀ°¿¡Ôÿ¯¶™‰kß [ïS÷ÚĂºƠ“Ơ…öºÏÅ¿‰ÙÚÏÅË¿É̉ơÔå̉ ›¡ƒv±»ŸÅåĂ߈¢ ±»Ở¹ÚÎÔ9¥‡ä̉ï½Û«‚ ½9„øíÚ‡Œƒ½±»߈߈µØÿ¯¶§ØçÇÿ×—ˆÇÓû(™p¹=±÷‡»ëÓ8%¤‡%ÖÓØƒ½·‡‘×8ç¹Ú™‰kß [ïSñÆëöĂëơõ†ù×÷ÚûضwÇÖÓØß»ûÉù×ăˆŸÏÔßÖ¡Û⾇“Ï̉‹Çé‰ñ5ñ·—§Í»¿Åùס»ÁƯçºÂă÷Á›¾áƠÅF±»±»ơê²Ø‚—¶ÅÄ߈ÙÚùטÓơÔ»qÿÛ9¥‡×ÿ§ËƠ½›¾åô»̉ç4ÍË)éÛ9¥ăˆŸ;k˜Á™‰kß [ïS߈©ŸéêĂº¬¿ñÆÛ™¦¹ăà«Ñª¶2tTíÁăÔ±»—»½ØưÁÚª‚ +¼99¥‡ö±»ƠÁ ëö“ÈŃv¿‰ÿ¯¶·ÔÑÄ뙉kß [ïSăĂ3ÑÓ©¼ëöÅĂÙÚ«‡“Íj°¿‘Öù׋ÇơêÛ™Ă‘ÆµØÁ½¹ÚÆØ «‡“Íj›Ú̉ÆÑĂµØ¶‡Ö8æƒv°»éơ—ÓÈ»Ăً܃àñÄ9¥‡Û«‚ ½9µØïÛ«‚ ½9½ëƒûÔ¡ÁÿÛóĂç½ăˆŸăˆŸ;“¹ƯNÎÅô¶¹Ú½íÖ«»™ëéåá=ơÔƒÖÚ×ÑÄ뿵aÇÖÁƯöÙƠƒˆ›‰«Û¡»ä̉oo¾ÔÅØÏċșԴañÓ½€¯ Ëûƒv™ëéåÓÔßÚµ†¥ˆ]1ÅÔÏÅ«d±½ëö£Xƒvׯ›8¤‡ëöçÚ‰¿Iù×­Äéêëö½Û«‚ ½9ăÄù‡ÆƠỞ«ÔăÇí—¿ưÀ﻽ Ëûù×ă»ï½Ó½üÓ ù×›¾Ÿ}Ï̉éÚưÀ›Û½ÔXÿÚ›¾ƯºÛăàƒĂáç߈—ŒơÔ´aǼ߈ÏÅ›¶é‚v ÷‡êö·‡‘×8ç¹ÚÑ̃±»ăˆŸÏž¾ÙÚÑÓ£Ư½ĂÙ¹Úơê¥ÆƒvÀĂŸÈ±»¿‰›Û´ÈưÀĂßÄÙƒvÓºăˆŸéÚưÀ9¥‡ÙŒë*«Ó؉ÏÔÑÓÄôµ†çÚĂÖÙ׉Áå¼ ŸÖ·‡‘×8çĂ½€‚ơêđÁ™Û¯G‹øƒˆ÷‡æÇĂÈ̓vÉÖóÇÛ×ùêÚÀÙ̉Æ¡ÁÍÓó#™‰kß [ïS߈¼ûă·ÆỞăˆŸ;ɹ½€áÓϺ±»·‡‘×8çñâÛº·‡‘×8磇ÁĂ¿»ƒs©Ó“ÆÛ¹ïÚëÓ™‡¡ÔÏÅéº̃ˆ„q« ©ƒ»5°»ɨ²Úÿ¯¶“Èâˆ:ß„å̉ ĂÙº̉*ñÓÅÔÓØ½Û׃v½ÿ¯¶çØY½¯È‹Ü߈ׯù×ƯÓ ׯ߈ơ‡ëöç +¹ÚưÀƠ“ϺÛ«‚ ½9—Ó«€Ă÷ÙăˆŸ;kÍÓ·ÅÙÅ룻¡“̣ÄăˆŸ;kÅØêöƠÅ÷¼‡ÛÏÅçô™‰kß [ïSÅ–©¼™‰kß [ïSăˆŸÅÓÏÔœ·̉ ¤0³àÏÅơèÅ™‰kß [ïSăˆŸƒ¾‘‹ï؃«‡“ÍjăˆŸ;ëöÛ×ÿ¯¶…ÖÓ̉±»ÛÄÓßÙ½§Ôó½±»ƒ̉Á¯‡ù‡™‰kß [ïSµØ Ëûù×ëöƯÓ ÁĂÔX°»ĂµØ±¿ôé߈˜ÁñÖăˆŸ;·‡‘×8çÍË)éÛ9¥ĂĂăˆŸ;æ̃ºÓ½߈©Øù×½Ó¾º­Ä9¥‡ơê¾™‰kß [ïSçÀ‰¿Iâˆ;áÛ±»̉Á8¤‡ç³ăˆŸïºĂÙßÚ˹÷ÁơèÅçÚÙÚÓ'½€ẳÙÚÿÚËÉ9³Â¹àÔăˆŸ;ïØ»+õa¡Ơ·Ôó™ÔÏÅØ¡Ôƒvơê߈§Ôù×̣¶ï³2·̣ƒ½Ăô†Œ‡“´†8¤‡ÖÂÙÓºÙ×ÛÇ—¶ñÓ¿Ù¿ºÛ«‚ ½9ÿÚùæ«ÓÏÅÍB±»ÍÄÏô»ƠóÂÛºé.Ă +ñÓçÚ˜‰j̃ZîS«%±”Û«‚ ½9©¼Á̉™‰kß [ïSó×˹߈9¥‡×©‡¥2ßëMƠXÏ̉ï³2Ÿ}³½§ô©‡¥2ßëMơê¾ËÇôêºÁ̉ƒv‘ƵaÛ«‚ ½9¼„Ơ©Ó¡Á釪Ú2±”Ó±»ôể£ÇÿÚºµ̃«Ô³¾¡Áû˽™‰kß [ïS›Ú¹Ú©‡¥2ßëM«Ô¹̃ưÀëöùêƒvùוÇë9¹ÚƒˆµØ¥ˆ]1ù×ÏÅù×í—G¯×Ø×ö¯ÈÆĂ¥Ûöù꯾ÙÜû)·ÔÙ»ù×âàµØׇ½7ưÀ¬ơ“óÇÏ̉¤%÷ÁÜÿÚÇÛƒ½£X‡¿ơêÇĂÙ½¼—¶±»«·3uUÛ«‚ ½9Û«‚ ½9ëöÑÓUÓÆ›¹›¾Û«‚ ½9ĂÙ·‡‘×8çÆ_₫®¶ĂƠÑÄëưÀƠ½ÔÁ¹Û«‚ ½9·§D íº‹Ü¨º™‰kß [ïSļÓØñµØ§ôö¨¼™‰kß [ïSßÄÙ›ÚÛ«‚ ½9±»·ôÛ«‚ ½9©•‹Üçm™×åẠ́·Ø₫™‰kß [ïS›ÚÄ̉ÛÀÇôŒºưÀ߈­ºĂÙ÷̉ˆùêÜú(ÙÚߌÛ,ÑÓỔ›vÁ¹÷Á¥øÖ$רÁƯÍË)éÛ9¥ƠX°»©ö¡ØùêĐÄềĂ¯Û£Ø¯¾’½9¥‡×‘®¯ßÄÙ«·3uUËDzº̣ÙYÑÓºÔ¹Ú½øêÎÔơÔăˆŸ;ß»û¿ÅÙÚµ‰˜ÁăˆŸº×Ơ™ô·Ô »ÿ¯¶Àð»£Ç°êØïƠ˜êèäóÄ߈Û«‚ ½9߈ñÓƒà÷ڵ؅'˜‡«‡“ÍjÛ«‚ ½9Û«‚ ½9˜‰j̃ZîS¸Ú§ôÛ×­)«ÔëöĂ¼™‰kß [ïS‹Ü‘ơ¡ƒˆ÷$ÁÓƯÓ ĂÙÏÔåéÙÚ™‰kß [ïSºÁ«‡“Íj›ÚâˆßÚÍBº­Ä¡ƠÁƯáêçÚY©ÇưÀ¹Ú¼Ăß»ûÁĂăˆŸ;œù꫇“Íjơê¿Øº‡(‚văˆŸ;…ljµ±»©‡¥2ßëMÙùƠÛÚ·ÔÏÔ¤ˆ\0ùדƠßÄÙ̉½™‹ß»ûÛ×ÅØí—GÏÅÛ«‚ ½9ơpơøô°»ăˆŸ¿‰¡¹ÚÔX¶¼̀7·‹´çÚô½ƯÚ™ÓÏÔĂÙ¸Ú½·‡‘×8çé‡ăÇíëöǺ±»߈˜ÓÏÔñÓ™ÔñÆÿÇÁĂ­¾ ƒØùêĂÈưÁăˆŸ;©¼ÿ¯¶ç¤Û߈™ëéå‰Û§Æ«‡“Íjƒv߈ôÔ«‡“ÍjG½¹ÏÔÁß„‹ÇÅÜ‹ÇϺ„±»Ó¼Ăô©‡¥2ßëMù×öèê‹ÜÛº¨¼›¾ǺÁ±»ù¿ÏÔá ¾9¥‡÷ÓÓñÓ×¼ÉđəԱ»å̉ ¿‰Û«‚ ½9ÍË)éÛ9¥ăˆŸăˆŸ;½€¾ß¡ÔÙÚÏ̉ơê°»Á¹ÑĂù×ñÚ˜‰j̃ZîSơꙉkß [ïSåĂ©&¯ÈÛºøô(ïÉ—¶߈‹Ç₫&ëöŨ׾‘ÛĂß»û™‰kß [ïS«‡“ÍjÏ̉ơꩈ—Ó«â«·3uU³z‡Ç‹"ÄÔơê‡x§ô˜Á§Û˜‡ƒv¥Æ߈Ù×¶ëö½¼Ôˆ +™ÔÏ̉ÛÙ½·̃ëöÏž£ÇÆĽưöôÓÅ™‰kß [ïS±»9¥‡±»›vÑÄëÅØÅØïÚĂ¥Û›¶éׯ™‰kß [ïS̃ó½Ẩí·ƯÓ ơÔù¿“Æ™Ư‡¼¼ÓµO˜‰j̃ZîSºÁÅØĂ¼Éᙉkß [ïSÑÓ©Øùׇ×߈“Æ…»—¶‡ÛÿÚËƠơêƒÚ·ôŸŒöơꆓÂè ăơÜ߈½ĂÏÔöÅØ«‡“Íj¿ô½߈œÂ ÍÓÛÔÚÀŸ|ÅàƯ‰©Ơׯáêÿ§»ØñÆé·÷ÁăˆŸÏÔ™‰kß [ïSÜŸƠ•½™ëéåăˆŸ;ÇØ·‡‘×8ç‚àù×Û«‚ ½9ÏÔĂ麩¼‰¿I›¾ñÓ¾ ɇ߈ÿÚ÷£ëö™‰kß [ïSù×Ù×ÅØÛÀÛׯ´ÑØ»Á«‡“ÍjĂĂƒ¾‘ưÀù×¹Úæ̉»ØÇÖ›¶é¹Úívå½½ÏÔ¡Ô߈Ï̉™‰kß [ïSùêăơ™‰kß [ïS¡»ÉÏÑÄ뙇›¶é½ÂơĂ¿Å½ÙŒë*«ÏÔßÁăơù×›¹ôõ†¹Ú߈ÁĂÓ¼̀ĂëöÅëöëöÏ̉ëöø¾—»Û×̉º9¥‡×ưÀăˆŸ¥ˆ]1ÑÓ…ÛÍĂ÷4·Ôêöù×Åđ«Ôí|£Çû(Ù×öÁ«»ë‘­ÄăˆŸ;«dù×ÙóÂư‡±ù1›Ú÷Á“È•Œív­Øƒvëö™ơÿÚå̉ ̃„ؽ߈óÅÔ™‰kß [ïSÁ³Èß»û¯à߈ơĂ“ƠƒvÛÚ€ö÷‡÷Úá=–ÓÏêÓ· ¹àÁ̉…Ú¥%ÏÔ†“öº¡ƠÛב۽ԡԶ  ëöëöÿ§§Ơºy€—Ó™ÓÙ½ÏÄå̉ ±ëØÛ׉¤“¹ƯN•ÙưÀăˆŸ;™‰kß [ïS߈9¥‡—¶ăˆŸ;Û«‚ ½9麟ȃvÛ«‚ ½9¿¹8¤‡«‡“ÍjơÔÏ̉öÁ±»µ†Û«‚ ½9›Ú÷ÁÅÛ«‡“ÍjÍBµØ¡ÔöÁ&‰¿I‰¿I£äù×ù×»Å×Ó·‡‘×8ç9¥‡×ÿÚ©Ó¡ÁƒØ¥èø$÷Ùß»ûÏP¡»°»Û«‚ ½9™‰kß [ïSéÚÏÔ™‡ëßÏ̉ÁƯẲ—»•Èû›™‰kß [ïSÙÚÛ«‚ ½9äÁª»Û«‚ ½9‡Ç™‰kß [ïSáê¿ôöÓÆ¡Ôؽơèż԰»&‚vƒÀ™ĂºÅĂÈ¥ˆ]1ƒvëöƒˆ̣Ô‰¿Iù¾Ǻ¹̃¿‰ơêßÚ¡È©ƠË%»½¾ß­‹ăˆŸ;kÏÔ¾ׯÚª‚ +¼9¸à˜‰j̃ZîSñÓăÄá ơê½€ƒvϼÏÔÓ²êö9¥‡߈£ØǺƒˆ‡ÚÙ½ÏÔËÓƒvÙƒv߈±¿ª¶2tT¡ÛÛ«‚ ½9­tÛëöƒv“È߈Ÿ}Û«‚ ½9ç÷Ô±»ưÆ×Ó¡ÁרÁ™‡÷‡ưÀÇØư“¹Ú¥Ûƒ¾‘ÏÄÓ̉«Œ…±¿°»Ư\ƯÀËÉ9ÏÅÍ߉۱)™ÁƯé‡óÔ«‡“Íj§ôĂÏÅíÆˆ¡È½È™‡›¡öư‡±ù1ȃvÛ×ôµa·‡‘×8ç°»ÓØăˆŸ;ĂÙÛ«‚ ½9Ï̉Û«‚ ½9™ëéå½í·ÏÔÑ ëöÏÔÏÅ­Ä—»ÏÔ—¶·‡‘×8ç ­í߈óǾ́凙‡ÑóÛ׎ººß»ûß½¼ ù‡ƒ×˜‰j̃ZîS¿ß«‡“ÍjуvÏÅöÁÛ«‚ ½9€Ù›ç³ÆŸÄêöÅôƯ‰ûÙ₫™Û«‚ ½9g©ß̣g™‰kß [ïSÙ½™‰kß [ïS½Ô‘Æø×™ëéåâàÎř۽Ӽå̉ Á¼ï»íÓµ†»á ¤ˆ\0öăˆŸ±»ØY9¥‡«‡“ÍjÛ«‚ ½9™‰kß [ïSơĂÏÔä̉›¹ÏÅÀ‡€è/Ö:«Ô“ÆÅÓÆØ¡Á½ÍĂĂ ›­±àéMï´™‰kß [ïS±»ăˆŸ߈‡¯‰¯0¹Ú»½¿ß§ôëö¸Áß„—Øă‡º™ëéåÇÖ«·3uU©Óù×ơèÅï»ë¼÷Áº¯¼Ù½½€±ơưÀ¬ÖÍĂ¾™ÓÙÚ¿‰¿»½óÔ‹ÛÛ«‚ ½9ăÚÏŵ؃½€ív©ØĂ¹ׯÇ̉å̃ơĂºëöÅÔ™ôƒ¾‘ưÀߌÛ,ơÔ¡Á·‡‘×8ç¤Ù9¥‡£É̉‘ÛÍÓÛ«‚ ½9¶ˆăˆŸơĂÛ«‚ ½9ư§‡ׯÁƯÂÙ«‡“Íjƒvçô±»üĂÅ–›¾ÙÚÏÔ›¹ƒÔÛºƠX߈ÅĂÖ£Ô½íêÙÅ뛽ÏÅø×ɶưÀßÚ±»“Çëö©‡¥2ßëM¿‰ev¿à…Øëö߈³½Ù̉Úª‚ +¼9ù×öÁùÖ߈ù×Û«‚ ½9‡ºçÚíÆ£‡ï½ĐÄêĂÓùׂv/¢Ø/­¾ơèÅƒĂ¹Ú÷Ú›¡¿Ú¾Åăơƒ½çº”ÈúûƠæôƒ½è¼’÷‡ưƃ½ÏÔË̉™‰kß [ïSƒv˜‰j̃ZîS“¹ƯNëöÅĂ߈ăˆŸ;ÅÓ§ÔơúĂƠ°»¡ØÏıÜơÔø+“ÆÓÁ×¾×ÇÖ́vù×ÅÏÔÛÀëöïÚ¯X—»øêáêÅÔÿ§á=9¥‡­Ä»¹Ú¹ÚívôÓÆщĂÙ«‡“ÍjÁ߈°»Ơ±»̃ˆŽơêÓ̉©‡¥2ßëMéÖß»ûG½¹ƯÓ ×ĂívÛ«‚ ½9öÁÿ¯¶ÏÅß„ÆÏÔôêר¿́Á¼“ÈÏÅ9¥‡ơỔØÏÔ߈ßÁ¿‰ơê¢ ƒØ½ăˆŸ;köÙ×§ÔƠëÚơÔ‘÷±½…ùÎÅÊ€º³Ï̉ÓÆ™‰kß [ïS›¾ƒơ™ôź½€ÅÓÿ¯¶ÍÄéïơêđ©ÓÍÄ›¾÷‡Á̉±»ÏÅÙ×9¥‡æ̉‡º¯¼ĂÍÄëöă‹ăˆŸÙ½«‡“ÍjĂÈçÚívш½£»ƒˆµØ̃ˆ÷å5Ó“9¥‡°”¡»ƒv9¥‡™‰kß [ïS»™‡Ñ+ÏÄëöÎ̉åĂơêå̉ 9¥‡Ï̉µ†߀‡ºÍÄ­vÛ«‚ ½9½€¾Å»±¿™‰kß [ïS™‰kß [ïS¡À½ăˆŸ;¥ˆ]1ƒv¹ÚỞŽëö†ŒưÜỞß»ûé·‡‘×8ç·‡‘×8ç«»«‡“ÍjÏÔ釅ö«‡“Íj¡ÈØÚ—ˆ‡Û…ÏÅÛºÛÇ€º›@™‰kß [ïSßÚÅÓŸÈ´…Û—¶ùסÔÏÔªÔăà‹ÇÑàơÔơʉj̃ZîSÿ§±»™ÓÁƯƒˆ…%ëö±½›Ú±ăÇíרÑĂă»Ëø߈ơØƯˆÁÚăÁ±»¨À›¶é±»‡xù‡™ôÏÅÁĂÇÓ̃„Û«‚ ½9ÓØëö“Æ߈áö÷ÙÏÔĂ¼ÂÙ—ƠƒÚϱø™‡ăˆŸÛ«‚ ½9ÍÄׯ±»ÓƠÙ½Û«‚ ½9ß»û¥ÇçÚ½¥Û·ÅÏ̉¹Ú«‡“Íj½ô¢ä÷Á³Â°êØù×éÚÏÅŽÛ×ëöÏÙ×ß½éñÆưÀ×ó߈‹ÈÛÄÓ­ÄÏÅÍB¯ÿûÓ¯Ơ½€ƒ¾‘ÛÀÛÚÛ«‚ ½9’¹ÜNÏÅívÏÄù×₫ÇÅÓçÚÛÄÓô·Ô±»ÛÄÓĂÎĂÙó#­ưÀ…Ơÿǵ†±½‡Ø…ŒÚª‚ +¼9ưÀƒˆœÂ«»ÙÓ«Ư£ƯËÇÅÄƠ¿‰ùסÈê$cvŽÎ̉‡Ú©‡¥2ßëMÍÓ9¥‡×ÑÓÙÚ½߈å̉ ›¶éáêĂÛÄәñ»ëö™ºͼÓ÷Á§Óíê¹ÚĂÖù×û÷Á©Çù×߈߈™ëéååĂ¾ƠXÓ¼àê¿̣¡»9¥‡߈ƒØĂ …Û™‰kß [ïSâà%‡­ơÍÏÔƠå¿°½ËÉ9¼€ßÏÓúƠäơ»(½ùן}«Ô“‰3Ơ,ùƒÖÏÔ‹ÜơYơÔëö±̉÷‡¯ĂåÁ÷É̉™‰kß [ïSÛ«‚ ½9ÏÔÏÔ߈Û«‚ ½9ïÚÅ×9¥‡«ÔơêöƯØÓºÿ¯¶́v ÏÔ½ÙÚ«Úÿ‡ûæĺ«ÔđÆÁ̉§ÔØYÏÅđÆà̉¥Çޱ»ÿÚ÷ÔËÉ9ĐÓ麘‡¥Øù×Å1ù×ơÔÛÄÓÛ«‚ ½9ÍßăˆŸÛ«‚ ½9ƒv«‡“ÍjáÛ©Óœ‡ºÑZ‚ ÅÛ«‚ ½9®GøáÛĂô¡ÁƠ“¤‰̀L„§ôÍ…¾óÔ—¾ưÀ¬¿…àǼÅÓÏÅÙ-˜‰j̃ZîSçÚ§Ø›ƒv°¿ï½™‡ăˆŸ;ÖÆ¯G‹ø”Ö±¿íØ›¶é‚Ú™‰kß [ïSíÆ™‰kß [ïS©‡¥2ßëMù×½ô·ÅÏÅíÖÏÅÛÄÓưÀ‡ºÅ¿́÷»ÜÓ ·Ü9¥‡ăÇí’Æ¡»‡Ç«‡“Íjø×ƒ×©ÓûƠÖÇØơá ñÓ°¿!·‡‘×8çÏÄ߈9¥‡8¤‡â½±)ƒàŸĂÅÓ€¼ƒÖÍÓÅØăơÛ™ù×ƠưÀƒˆçÚéÓÍćڵêù×Ö©ØáƠ«»×¾߈É̉ÏÔ¯×ÍÄ·§D ¿‰Ïű»ÛàêÅÓƒv½éꙺÛÄÓ±‡¡Á«‡“ÍjơĂ½€ÏÔ›ÚÂÙ ±»ăơƯÓ ùêƒ×ơ­ÖƒÖ«‡“ÍjÏÔ©‡¥2ßëMǺؽ߈¸à«‡“ÍjƒÖÑÅ›¾ÆôóÇÏÔ‡ăˆŸ‹Èû¤ùêËÓ©¼ôêù×ù×ÏÅÍÓ·Ôÿ¯¶Ú׳•Œ‹Ç‘6ăˆŸ;±»߈ÏÔ“ÈÛ«‚ ½9÷ºÏű»Ù½¿ºÏÔ°»óÂçÚ߈ÍĂÅÓ½çڣǩ‡¥2ßëMÁƯä…ƠƒvƠÅ•9¥‡Û«‚ ½9«ßÏÅ«‡“ÍjĐÓ ÏŇŒƠèÏÔÖÆÎøÏÔÏÅÎÔ¹Ú«‡“ÍjÇÖ±»ùדfƒàÇÖ—Öƒ¾‘½·œÍË)éÛ9¥„ôưÀ©ă°» Y™‰kß [ïSâºâˆßôÜ©‡¥2ßëMÁƯ¶èă‘·È̉óǵÅÛ±»ăÄŒƠXö·Ôø×£ÓÓØá¬…»ÁƯ„ÇñÄåĂÛ«‚ ½9¿¹º±½÷ù“ù«‡“Íj%$±¿‚vƒØÏÔÛ½™‰kß [ïSÏÔ¬¾«‡“Íjƒv…ô©Ó±‚©Ø«‡“Íj÷‡ưĂ™Ø£äÁ½Úª‚ +¼9ëÖëöăˆŸ;Ù×¾ͪăơáLü‡°ø1ó.Ù½÷Á•ÏÔ°½¤È—¾ÏÔñÄϼÿ¯¶ưÀϺ¡ÛªÔçô¥ÆÂ¤ˆ\0œ‰¾IÛ«‚ ½9ÑØ·Ô«·3uUÑÄëÙ½•{ÏÅ¡Û÷Áå~éÏÔÿ§Úª‚ +¼9ÍÓù×½ƒˆƒṽˆ©‡¥2ßëMÙ½œÜ£¸ÅÔÛ«‚ ½9ùêƒvéÓ³®GøÙ½ăê­º¿ß§›³Û×ăˆŸ;·‡‘×8çï»ù×±ÈƯÓ ÙíÖá ñÚ廽½€Ü¯¼·‡‘×8竇“ÍjôÏÔ¡ÈÙ×߈À½±»ÏÅ÷Ô±¿ơê‚ØÅØå̉ £àÏÔ±ëØƠ¼‹Çø×Û«‚ ½9Û«‚ ½9¹Ú«ÔÛº±ÁÆĂ›ÚÍƠêöáêÅ™‰kß [ïSƒvßÚÖĂ +ƒÖ«‡“Íj·‰ÍË)éÛ9¥ºÉ̉¦Æá=÷$ÙơÔ·¼Í7ÍË)éÛ9¥߈¸ÚÍƠÏÔ­ÄëöăˆŸ±ëö¿àơÔÖ¾±»ïßûœÀĂăˆŸ;«Ñ¹£̃ˆïÅ™‰kß [ïS¿¹÷$÷ˆáê…Ô¹½ƒˆ÷ÁÁÙÁÓØ«»ĐÅ›¥‘Ú߈Úºù׉‡Œ×ӹڥƻÁ\ù×̀ÓÏÔ…Ơï³2å̉ ëÓƒvƒvÿÂÑÓÔ£ØÙuƒvëöÇÖ÷‡ÙŒë*«ùÜ9¥‡»Ø½ëöƠ‹ÜëöÙÚÿÚ²ÎÄ@ ùôªÓÓºÛ׵غÁ%ß°¿ÑÓÏÔ9¥‡×»‡Û«‚ ½9ăˆŸ;kÙ̉•ס»ív™‰kß [ïSÍË)éÛ9¥߈ù׆ŒÁĂ™‰kß [ïS߈çÚÓµ·Å¹ÚÙ½—Ó±»«Ô•Èû›™‰kß [ïS¹Ú±»º¼ö»‡™‰kß [ïSơƠ¡ØÛ×Û«‚ ½9›¾˜‰j̃ZîS­Ö÷‡ÑÓÏÔ‡Œơê‹ÇĂÙˆëöù×Ë¿߈¶Â›¾ñÖ‘¾—¶³ÈưÀ¡¶Ùđ°»ÿÚÏÔËƯëÓ߈±½¾“ÈÁ̉ơèÅ₫ÜăˆŸ;¿ô߈ÑæÓºÏÔÿ4™‡ư“9¥‡ÍË)éÛ9¥ÍÓĂº’ï»ÅØùדƠÅØÛ«‚ ½9µØׯçôï³2½¡Ç¾ÈËÉ9íËÙ½ƒv»Øù×ÏÅ…Øù×ơèÅ¥Ó€ºăˆŸ;¿‰™‰kß [ïS«‡“Íj¹Úß‘ùÂĂ¾ÅÔ¾¸£ +»ĂÖ«‡“Íjù×ÏÔ™‰kß [ïSׯñÓ“ƠÁ¾ƯưÀÅ»—¶đÓÅÄ¡Èô›̃ơê‰Û…Ô홉kß [ïSóĂ€ÛÚª‚ +¼9öŸ}“¿µÜ‘¸Û«‚ ½9ï½·ô‹Ù¢Ç÷Á˜‰j̃ZîSÿ&ª‡’̀j§ÔơÔÛÄÓ÷å5ÓÇÖ…ÚĂÙ߈¢È¾Á×ÁƯ㫇“Íj߈™‰kß [ïS߈÷Á‹È÷ÙÅÿ¯¶™‰kß [ïS§ÔרÓØ‹ÇëöÛ×™‰kß [ïSÅÔßÁ«»ÛˆÏÅăơêәاԷÔóÇÙ½ĂôÖ̉èç ™‰kß [ïSÀăˆŸ;§ô9¥‡ÇÖÏÄïƠå̉ ëöÙÚÏÔ÷å5Ó¡Ç…»•.¦Ôù¿ăˆŸ;k“È™ôƒv›¹­½¼ÏÅŸ}ƠÄ߈ñÚ¹̃öª‡’̀j±»äĂÿ×Ü߈‘ƃvÙÚơùăˆŸ;k·‡‘×8ç™ØơÔƒvù×ưÚÁƯ纙‡º·‡‘×8çøê‘Û™‰kß [ïSÛÀ±»ăÛÛÇ9¥‡×·Ü¹ÚÆ»ăˆŸÂÙưÀ™‰kß [ïS÷ÁƒÖ‡Ú9¥‡³ ÏÔ…ÛÅØ¹Úíºơê±»Ù½ĂÙ±»‡Çº·Üׯ½Úª‚ +¼9±»ÛÁĂåôÛ«‚ ½9óº߈ûn̉ºï“ăơÙ½ÁƯ³øÆ±»Á|¿‰ÏÔêö ÏÄñÖ£ÓăˆŸ™‰kß [ïSîżؽ™ÁëöÙÁ›¯¾›¾³¾χÚª‚ +¼9™‡ăˆŸ;ñÓ9¥‡Ù½½ç®Ÿ¾©‡¥2ßëM½å̉ ƒ­Ø›¾Úª‚ +¼9ÙŸµa³ÈöÏÅÍË)éÛ9¥ÙÚçØ‡xù×§ÓĂĂ›¡û(—»ÙÅëÚđ¹Ơœ‡Û«‚ ½9¿»“ȇ¿Ù½Ǽ«‡“ÍjïDư“ºĂ¼Ó˜‰j̃ZîSë¹—Ó‘±ÄÓçÚ½ĂûØø×ùêíÆÑÓÍÓºưÀÅʉj̃ZîSéÓËÉ9‹ÇÛÇ÷$ш•Âá ƠïÚÑÓ¾»Ø…Ö÷ÁăˆŸ;™‰kß [ïS³³ù×Û0ƒ¾‘8¤‡×™‰kß [ïS·ÔĂ$đÆµ‹ĂÙÅijÅð¿d¬¾ơêÿ ñƠ·‡‘×8ç¿–߈‹Çϼ¼€îÀ÷Ú·ÅÎÅDZ½‚vçÚÍÓüØíØƠÓ©Ç«‡“Íj£»Û«‚ ½9µØăÇí¦ôûØɇ®GøÅ¼º¯¼Û«‚ ½9ÛÄÓщ©ÓƒØ‡Œî$ơêÛ«‚ ½9ÅμƠơăÇíÈ(Û«‚ ½9ƯÚôõ‰ë“ƒvº›¾·Ô©Ó÷Á§Æ±»Ö§º«ÑÖ¾Û«‚ ½9¨& +æØ©¼©‡¥2ßëM…ØÙÚ¼÷Á™‰kß [ïSù×±»Ôăơ›Ô°»ÉÁ«‡“Íjщ‚éG™Ø߈߈߈áÁ¼ +×Ă™‰kß [ïSÚª‚ +¼9™‰kß [ïS±»ÏÔåÁĂÙÇØñÚóÇÿ¯¶«‡“Íj­¾™‡˜êèäñÓÛ«‚ ½9©‡¥2ßëM¸»¸Ú—¶™Á®é‰Û›º߈ÜÙ½‘½«ÜĂÙƠ“Ơó|ö¹¶¾Ê˜‰j̃ZîSÏćÚùꙉkß [ïSá̃‹ÜĂÙ· ÏÔÿ¯¶ÏÔ9¥‡ÿÛɇ«‡“Íj‡ûƠÏÔơêù×ÏÄAỞƒ½̉ºÔ©Óëö¼€÷Á—»…n÷Áÿ¯¶¡ƯÓ ™‰kß [ïS‡ÜÑÄëׯå̉ ׯ“Ơ±á«‡“Íj¼Û«‚ ½9ù×óÑÏԥܑâ÷ÁçÚù×ñ¡ÿ£XÉƠͼù×8¤‡…Ûëö¹Ú§ôçÚ•×ù׮׈¯ÈÅ·Å/Á̉™‡¿ôÚÆ½€ïiá¤ög«Ô±»Úª‚ +¼9ûÓÉ̉³Ó¹̃ÏÔƒ¶­Ö÷4©Çï½ưÀµØÿ¤ÿÚöׯÂÓÀƯĐÄêˆ߈ù꽇éºử©ÓóÓù×ăˆŸÂÙ«‡“Íj“Æ̉½îđÇ̉Û«‚ ½9—¶ÏÄơê‹ÈăÁôú̀ÅÄÎÔĂÙÏÔ¥ˆ]1ƒÄẲÀ̉—¾ÑÓ߈ö½ÓØ·Ó ¥0±»™ÔÅÔ™ÁÅÑ"ÿ¯¶ä̉÷Áá꫇“Íjá=±»­ØœÔçmå̉ ׯÏÅ߈‹‡ÚÛ«‚ ½9ÜơÓØă ÏÅ™ÁñÓÏÔŸó¡Ơ¿‰¡Û¾‡æăˆŸ;ƒvøơ›¾ŸŒÂèưÀÚª‚ +¼9´È½„ØçƠ¯H̃ˆ¿‰߈ëÓơêÓ ‹›æíų”¾™‡¡ÈăˆŸ;÷ˆ‹ÜÏÄÚª‚ +¼9ÏÄË¿ÏÅÜ«‡“Íj€Ç¿¾9¥‡³™‰kß [ïSơêù×ëö·Ü·Ø›¡ëÓ¿‰Ç̉Ù̉‡ñ5÷ăˆŸÏÅ¡ÛÔÅØă»Ï̉¯)ÏŃá=§Æ ÁĂ¼â»˜‰j̃ZîSÙÚ¡ÔƒvÏÔ߈Û«‚ ½9¡Û­ÈĂôƠµØƒv©&¶ÅÙÛR¿Ø°»‹Çó›Y¡ÓщÍǃvÿÚù×Ổ±»»ÿ$¯¼½ùש‡¥2ßëMơÔôÑÓ½ÏÔÚÀ¯Ơ¿ó±»µa½Ơ£é¡ÔÑÓ™‰kß [ïSñÖØÚé‡ù×¢Èù×ô—ŒµaËÉ9˜‡±»ÏÓÆå×âˆ;›¶éóĽÔ߈›Ăͪƒ¾‘£Ø—°ưÀ™‰kß [ïS‡Ç€º߈߈Ă…»ùæÎ·¦D ™‰kß [ïS̃ˆ ¾Û«‚ ½9Ùâù‡߈·Ó ¥0Ÿ®·º™‰kß [ïSß»ûöÁÍƠ›¶éèÓÿ¯¶Ơ±»‡,ËÓÇĂ…Ö›¾ÿÚ†ø Î̉ßæ¾È¸Ú©Çºyë÷Ù²ÂÓ¾߈ÏÅÙ½»yăˆŸ;¡Û¥Æï»ï³2ÁỞ™‰kß [ïSĂ©ù×ơĂÁ³(“ÆăˆŸ;kƒˆÙ½ÍÄ$ÚÀñƾ¹xíÖ©½¸Ú€Ø©ÀŸÖ¡ƯÍË)éÛ9¥‡ùê½Ù/Å­vĂĂ ›­±àéMш£ ù׈ÍêÏÅÚÆÏÔ¯×ơÔÏÔ9¥‡×¯ÈÔăˆŸ;ªÔăˆŸÚÚÀ‡Œ§ÔívÙÚöǾ±»ÍË)éÛ9¥¿‰ÙÅëăˆŸ;̃Á™ôª‡’̀jÛ×ĂºÏÔͼ»߈ÇÖ«‡“Íj½Û«‚ ½9ù×ơĂçÚçÀÑØÿ¯¶‡ÇÏÅû“Ÿ˜Ưï½á—ôꙉkß [ïSÑÓĂƠ¾·‡‘×8çóÔµØăˆŸưÀÏÔƒv÷‡™Áëö½Ó‡ÁĂ—ˆµØ™‰kß [ïS‹Ü¥ÛÛ×…Ơ™̣™ÔÛºÎ̉Ù½¼Üƒv±½«‡“ÍjñÚ™‰kß [ïS‡×™ëéåăˆŸ¤ó›¶éñÄ©‡¥2ßëMư“ÏÔ™‰kß [ïSÜÑĂßÖăˆŸơÔùøºÏÔñÓ÷‡ºÛ«‚ ½9éÓŤˆ\0óÄ«‡“Íjù×ù׿́ö÷ÁÓÎÓ™‰kß [ïSĂÙ«‡“Íj¿‰ĂăˆŸ;íÂ×$ÏÅëö9¥‡¿́ï½߈ëö°»«‡“Íjß»û¶ÛĂÙơº©%ñÆçÚ¾¿»ó¦È]« ©ƒ»5§Ôƒvù×™‰kß [ïS¡ƠÆ̣ÔÏÔÅÓÑĂ׿8ăˆŸ;߈ǼªâÛÚĐÓ·ÔÍÁ›ơÔÏÅƠ´©Óϼ¼Ù½ÍÓÀÚ Áñ»Ï̉ƯơÁ̉ăˆŸ;kï»̣Ç·ÅØÚº߈­Ä·‡‘×8罩›ÛĂô߈±»³ÇÅàν߈™‰kß [ïSù×ăˆŸĂºù׃ԃˆµØưÀß„«ÔÏŹ෺Ϲ‹ÈßơëöáÛăˆŸ;³̉سȳÂÅ–߈ƒÔ“Èó¶åŒ¿NăˆŸ;kY‰¿IÏÔ߈ưÀ«‡“Íj—ˆ̀Ó‡½Óű»¥ÄÙÚÛ«‚ ½9¶ôÏŽϼ₫«Ô«Ô£Øª‡’̀j²Âƒ½¬Ä¿ßĂàÿ×Ê"߈߈Ï̉ù×ăơ‹Ü˜‡9¥‡×ùæ¿ß›¶éù’ß»û¹ÚÛÀ…Ơ½ơ꿉©Óø¿ûÓßÔÈç'Ѷ¹Ö„ÖƠ½å·Å¾ĐÓ›¾ùêƯ‘ۘêèäáƠ¥Óù×Û«‚ ½9‹Ù‡†çÚº½—Ó%·Ô׃vÅÓăˆŸ;ÏÔăÁ˜‰j̃ZîS‹Çù׃vå̉ ËǃĂÛĂÙ³D‹Ç›¾Åô©ăˆŸ¯Èƒv‡ÇÏÅ Êûå̉ ǽ€YßÁ™‰kß [ïSÛÀ¡ÔÖ¾¾ÏÄëö‰“È߈ׯéºÏÔ©¼áêÓÓ—Ø¿»ù¿±ô®G ø ߈ù×ÏÔûØ ÇÙ½%Ÿ´â½ƒvÓÆG½¹çÚ˜‰j̃ZîSÏÄívƯÂß»ûÛÄÓ¹Úû÷Áﻹڛ¾ô ß»ûǺ߈‹Üª»™´Ïı»½»½ĂÙ‹ÇÛ«‚ ½9±»€¾»Ư«ÔÛ«‚ ½9©¼Ăà¡ƯÅØ±»½çØÁƯ±»ăˆŸ;ƯơÓº°»ï‰ÇÖ™ÔÛ«‚ ½9ÁÓ±»¹ÚÛ«‚ ½9ÓØ¹Ú¯¾9¥‡³–¾·ÅµØ›‰÷ÙëöÛ«‚ ½9ăà¡Á‘ëơÔù×Ù¹Ú¯èÓÓÍË)éÛ9¥§Ûă˜‰j̃ZîSÓ×ùê§ỒÓù×ô­ÄƒØưÀăˆŸ;߈˜ÏÔÁƯøê釭ÖÀ‡€è/Ö:ƠX›¶é˾ÔơщÍçÏÔß»ûăˆŸÿÂÙÚ£–†Œÿ ₫®¶Û׃v߈“Ơ—¶–¶«)ĂÙßÄÙ́$˜Á‡Úƒˆ›¾ÅôíºÑÓ߈ƠÏÔ±»·Ô÷ˆù×ï»Ûº÷‡çÚ¡È›ù“¹ƯN–Ó½Ăù×ÍË)éÛ9¥Û«‚ ½9•ƠƯơ"çÚ±»ưÀ“ƠÍÓù×·Ôûư難“ÍjÀñ»›¾™‰kß [ïS§Ô߈ÅÓ÷Ú©ôïi¶Ë̉ñÚ™‰kß [ïSß„ÉÙùס»—¶ÎÔ÷ÁûÓƯÓ ăˆŸ;ËÛ½»½‚Öù×ñÆÔơÇÖ½öψùêơèű»߈›!éÓÛÀăƠô™‰kß [ïSÏÔÇ̉ÂÅ˹ÏÔá ơêùê«ä×ƠĂĂ ›­±àéMÏÅü̉ ¹ÚÓº̉Û«‚ ½9¿Å›¾•º…߈Ù½ÛºÎĂĂ ›­±àéM߈˜ô ïÅÁô½²ÏÅÙÚ·¼Í7ƯÚÑÓĂºùêùê«ÔŽÚª‚ +¼9ëöÙÚ…ÖºÑÓ߈™×éưÀ9¥‡½èå̉ Û«‚ ½9‡Ú­Ø÷ˆÂÙ°ÁÅØÛÄÓùơµƒăˆŸ;kÿ¯¶¾™Ô¯ÈÍË)éÛ9¥å‡«Ñ—ˆçڇǹڽÁÛ«‚ ½9°»›¾ñÚÇ(±ëØơº•½‡¿÷ˆƠÙÚ¿‰Ó¼…ŒÑĂß»û­Ä‡Ú©Ü»Ư™§ăˆŸ;đÄÛ×£Ø߈ô÷Áù×Ç̉ëöáêŸ}Á̉Û«‚ ½9ÍBÏÔÈù׭ģر‡·ºÆ©-™‰kß [ïSÏÔƒ“¶ăàĂ¡Á÷ê߈ñÓÙ׋ۙ‡¯ÏÑÓñÆĐÙ½çôÑĂç°ÿÚĂ¼‹È…»Á¼ÿ¯¶Û«‚ ½9ÏŇ½Èíçß̃ôÍ,µØÙ»›·Ô‚vñÆÁĂ«Ư«‡“ÍjÙ½ç$ƠÍË)éÛ9¥9¥‡ñÖèÚ‹ÙưÀ…ö´Û×ûÓщơÄ™TÊÇƯ‰‹ÇăˆŸÑ×ưÀÙ̉ÆăˆŸ;k߈Ăô£Ø‰đù×ăˆŸ;ưÀỞ…¾·ˆÙŒë*«ÑÅ›ÚÀ¹ψ½¯Û‡º©Ç™ëéå±»ñÓ§µ°»ÍÜרµØ³ºó™‰kß [ïSĂƯ¹âˆ÷Ạ́ÇĂº±»³zëöù׉)ƒvĂè“Ơª‡’̀jÑÄëÇè߈ªº‚vÏÔÊÔ™‰kß [ïSÑÓĂăˆŸ×Ó«‡“ÍjĂĂ ›­±àéM©ÓỞ¯ÈëöûØרÑóªÔÛ«‚ ½9‡ñ5™ÔÛ«‚ ½9ĂǺéº9¥‡×¹Ú·¯ç$Û«‚ ½9ɇăˆŸăÁ­Ä™‰kß [ïS±»Á¼ưÀŸƠí¹ƒÖƯ‰´ê©¼Ê¿®×õ÷Ô¹Ú»n½•‡ŒöƠÅàñÓ߈¶Ô÷å5ÓăˆŸ;ÙÚ¦Ó‘±Û«‚ ½9›¾Á̉¹ÚÅôêơÔ›¾™‡‰đÇÖµêÏÔ±»€ƠÍå·Ó ¥0«‡“Íj±»ï‡ÍBù×ûØăˆŸù׫‡“ÍjÏÔÀ½ÛƒăˆŸ;‹È9¥‡³Èû¡ÔùשÓÙ½³˹ÛÚÔàê«‚Ⱦ匿Nï»ÍË)éÛ9¥Ăô¹ÚƒǾüÀ™‰kß [ïSÑÓù×¥ØÏÔË̉˜‰j̃ZîSÓÆµÈƒ¾‘ÏÔÖ¹ÚÙŒë*«9¥‡ßƯóÇĂÈÏ©‡¥2ßëMƠÍË)éÛ9¥·Ô…Ÿ}ÏÅöƒvëö±»ưÀơÔ±»ƒvưÀă»âÄJÏ̉‡Ûùơ‡Ç…«­£ä¹ÚÇ»߈̃ˆƒơÔăÇíËÖơÔỞ¥Çív߈·Ôù×ơÔ½Ăƒ¾‘£ØóÓÏÔ›·ÔÙÚÍË)éÛ9¥™‰kß [ïS÷Áï²2Á¼êö™‰kß [ïS£»ñÓƒvû9¥‡»¼‘´Ø‚v߈ăẠ́ĂÛ«‚ ½9™ëéå߈ÍÓå×Ù½߈œ·̉ ¤0«‡“ÍjăˆŸ;‹Çƒvÿ¯¶™ÁÅÔµ©Ø¶‡Ö8æù×öÏÅœ‰¾IÑÓ±»çí—GÀ¹÷Á¼Ôơ\ƠÆ߈É̉¹±¿±»÷ÁéÜ«‡“Íj߈ÙÚùׯÈËÇáƠ¡Ôù¿Ù̉©º›¡“Ơ÷¼¿º™‡áêâê‡×щ¥ÄɹåÄå̉ Ú×ù×…¼ÂÙôơÔ«»Ù½߈ù×ÑÄëÿÚÉñ™Ô±»Ø×Ë̃ƒv™ĂºÓµØÏ̉Û×µàÛ«‚ ½9 ÁçÚÁƯ…ö™‰kß [ïS±»÷ËÇ‹ÇơÔ¹ÚçÙ½¹Úù×ú(ơêÙ×g“ÆØƠ»%߈§Ó±»™‰kß [ïS™Á½€߈Û×÷4§º‘Æ›¾ëöä̉ßÁçÚÁĂ³­ˆÏÔăˆŸ¥Úß%µØëóÛ«‚ ½99¥‡½½ëö½Ù×ơê±½ÍÇĽù×ĂÙ—»ÿÚ™Á…à߈•Œëöùơ·‡‘×8çÙ½ׯƒvëö÷Ú9¥‡§ÓÍÄÂÙù×—¶ÓÜ¢X Ñ+—¶êö›¾¯¾¹˜°»ëԵءÔơèÅÏù¾Ăáêñƽ¡ÈÑæù×Ù×ûơñÆÁăëöưÀâÄ₫®¶«‡“ÍjÅÓưÈ÷ÚÁƯï»Û«‚ ½9ơÔÿÚÿ¯¶ÑÄë9¥‡±»ƒw¯ƒ« +>ÿ¼ÁẰÓÙ½±»߈ç̉©)Û«‚ ½9ɇÏ̉÷ˆ«ÔË ªÔăˆŸÓ‚vËÉ9ƒ›¾—Ó¶¼̀7ÙÿÇÇá₫ÚƠXÇÛƠ˜‰j̃ZîSóÇÍË)éÛ9¥ÀƯ¿‰å»˜‰j̃ZîSóÔïƠµØµyÓ¼«‡“Íjøê÷‡ûÜ¼Ă±»¹̃Û«‚ ½9ÛºưÀëöóÔ£Çå̉ ĐÓ ©Ø»ĂñÚ¡ÛÍÓˆÏŵ؇xçÚĂÈ¥ÛµØùê°»Ëÿ¯¶á×ÛÛ«‚ ½9¦Ó§ÔĂƠ½ĂáñÂĂÙ¯åÙ±¿½™‰kß [ïSêơï½ÇÚçôª»ßÄÙ©¼ÊÅưÀ‹Ç§Ôơºăêû‰Ûëö¿ÙÜ₫Ç«‡“Íj´†ăàƒvY8¤‡ÖÙ½ơêéêÑÓ¿é÷Úù׸*ïÚ÷Áÿ&ÓØăˆŸ;ÁƯ«‡“Íjι‡ưÀ‹É0ÑÄë߈ïŃvÛ«‚ ½9™‰kß [ïSÿÚù×ûÓ«·3uUà ÙÜÏÔù×›Ú÷‡ùê¶ÔÙ½Û×™‰kß [ïSÙÚ½ô“ƠÏÔÙ½¡ïôǃ¦Ô™‰kß [ïS‰đö›¹‹ÇÛ«‚ ½9ă๻ÿ¯¶™Ôщ‹Û“¹ƯNưÁçéÛ×Û«‚ ½9ÑÄëá ăˆŸÿ.ĂÙØŒê*ªĂè©-ăˆŸ;×ăàÅ8¤‡ù×¹Ú÷ÁÓáĂù׳ÈĐŋܛ¹‡¿ĂÏÅ™ơ¹ÚÏÔ©‡¥2ßëM©Óû(ï½Û«‚ ½9—Ó‡º Á³ºó™‰kß [ïSỞÅÔ¿ºÅÔÿ¯¶¥Ø±»Ó©‡¥2ßëMỞ›¶éăˆŸ;kß»ûßÖ¶Ô“ÆùëĂ¹à£Çå̉ ÏÔ™‰kß [ïS׿8ËÓïi‡aÛ×±»™‡·ÔͺµØÍĂƒØ·ÔÅô¼ÿÜ…ƠÖ¾8ùơ²Ö9¥‡Û«‚ ½9ó#ÙŒë*«ơé߈µØÏ)©Ü߈Ÿ\ëöù×±»÷ÚÙ½Ù̉ăˆŸ;kçÚ8¤‡½­ç€Äº±”8¤‡ǽ­Ä»‡ŒßÁ™‰kß [ïSĂÈж‰ÔÏÔ©‡¥2ßëMƠä̉9¥‡×§4Û«‚ ½9ù×ß»û±»ÙÓ·‡‘×8ḉơ ç'߈›¾¦Ó™Ô°»ÍÓÛÄӆǽĂƠÍӭĉ<ßÄÙÑÓ›ÚôêÍÛÛ«‚ ½9ưÀƒvñÓº¥âùêµÏÔ‘±ĂĂ ›­±àéMµÏÑ\ù׋Çă½×ÜßÁÏÅûÓ߈Û«‚ ½9Û‡¿ë£å•éÁ»Øëö™‰kß [ïSÓåĂưÁĂÈÑóù×ñÓ™‰kß [ïSÀ½Á—J…ûƠăˆŸ;‚¹Ú©‡¥2ßëMä̉ÅÁ€ù×߈«»åôưÁ·§D ëöñÇ₫̉Û«‚ ½9‘®àÓ÷‡ô߈Æø×“Ơ¯‰¯0«‡“Íj¸Ú“éÓƒv©‡¥2ßëM¼߈ăŸ„ØƠ¥ºù×ƠÔŽÇkùשƠù¿—ˆÑÓ÷Ù¼ÏÔÏ̉ßÄÙ±»½å ˜‰j̃ZîS«‡“ÍjơúÑĂÉ·Ô…»ơÔë ™ôăˆŸ;¿ßĂÙöÙÚơÇ9éÓ§ ߈ÏÔ©Ø¸Ú Ù½Û«‚ ½9Û«‚ ½9—ºöùêÏ̉¹Ú¡Ç™‰kß [ïS±½Έ«ÔñÓ“¹ƯNÑ+ÏÄÅÏÅ߈߈÷Á­½¼‡x±»¤Ç…›¾¹Ú€º—¾§Ô¡hơê±»ơ¹ÚÑÓÙ½×ƠÁ̉ª‡’̀jÅÓ߈Û«‚ ½9Ѷ÷ÁÛêưĂÿ¯¶߈₫®¶÷ÁăˆŸ;Á¸Ú.ÏÅ™‰kß [ïS߈÷‡ï²2¹ÚèӃףÇÿÚÇÓÿ.±»ß„ö9¥‡˜‰j̃ZîS°»êö™‰kß [ïS¦ÆÙ½á ±»8¤‡­vÏ̉¿‰±»ĂÙÏÅÔºlưÀ±»™‰kß [ïSù×™‰kß [ïSù×±»‘ȱ»ăˆŸ;·Ó ¥0™‰kß [ïSñỤ́ ¡È–ÓØYàƠƒ½ĂÈ߈µØ©ÉÛ«‚ ½9é…Û»÷µØ…Ö—Ó#߈ơ™‡רù¿·Ó ¥0µØÍƠÙ½±¿ÛºùêÙ̉߈ëö§Øëö™ëéåăˆŸ³ÂđÓÙ×ùׇ€±»½ôøêÿ¯¶߈ï½›¾óĂ߈ŽÏÔ·£Û«‚ ½9­Ä·‡‘×8ç§Ô±»¾±»ƒv·ÅÙÚ¶__ĂÙ¾æơöÓÆø×ƯÓ ơệÄ×Ăéơ›¶éÁƯ™ÿ¯¶ÏÅǽÚª‚ +¼9̃ˆ°ÀÁ¹µØ™‰kß [ïS•ÇơĂÏÔËÉ9ăˆŸ/߈­RÙ€å̉ ÅÓëöÿ«Ñ¿ô›v«d›¾ÏÄ·ó£äßçñÖ龃ևôÙÚÍƯăˆŸăˆŸÅơêϹ°»ºÅ•ŒôđửÅÅÔÿÚƠ™ô’¹ÜN…Ê“Æ9¥‡±»ÙÚăà¥*ñÓ¼ÏÔøê«âÑÄë‰Û‰¿I¥ˆ]1û̉‹ÇéÓ¾ÅÙ½Û½µØĂÈĂÙóÇÍBص̃Û«‚ ½9ívϼ·ÔÁĂºÁ¹ÏÅÀĂ»ØĂÙăÇíÀ¹·Å‹Çƒv́½ÿ$öƯÓ †Œ¿ßçÚ“È£äñÓÙ×—¶áÂ߈™‰kß [ïSăˆŸ;™‡°»«Ú™‰kß [ïSÛº•%ñ(œƠ±»áĂ½»å»ÏÄØÚœ‰¾I”ÖÓíưÁ¥Ø—¶ÇÖ±¿½ûÓ߈ÙÚñÚ¯G‹ø̉±»©‡¥2ßëM»ˆ¾ºÛ«‚ ½9µØ¢ÇßÄÙ½ôÙƠÔXßƯ›¹ÏÅă‘·ßÛù¿º—º§ÔÍË)éÛ9¥½’ÈÍË)éÛ9¥ŸÈ¡ÈÏÅ«‡“ÍjƒØ÷ˆåŒ¿N¿‰±¿¿ƠXÛ«‚ ½9ùןçÅÔ¾ÿÚ‚vÜóÔ«‡“ÍjǽÏÔ€¾©Ø“ƠÇ"ăˆŸ½ºÀƯ«‡“Íj÷Á´•ÄÓ(Ä›ÛñÓ—¶ăˆŸï»ÔÚÅØ£»©×ƠĐű»ƯÓ Ù½½ñÆ›¶é½ĂëöívƯÓ ăơ¡È´a¿ºơê™ôÖÆăˆŸ;ù×™‰kß [ïSŸ}ÁøÚî¶ëö™‰kß [ïS…%“Æ₫¾’ÛÄÓ¿Å™‰kß [ïS߈«‡“ÍjÍÓßß¿ô•ŒÛ«‚ ½9ÇĂׯéÓÚª‚ +¼9ƠÛÄÓ¥ÖóÅÔŸÈ“ÈƠX™‡ï»ÏÔ½Ưß±»ĂÙÛ×÷Á°¿¿ÅưÀ™Ôëơ·Ôă‘·ÏÔ«‡“Íj麛¶éíÖéêăˆŸÿ¯¶ëö‡x¹Ú«‡“Íjù¾ÍÇÛËÓ°¿ÑÄëÏÔ»ÅÍË)éÛ9¥ƒ¾‘›¾ĂÙ׺“­½¼µaơêÛ«‚ ½9½»éÚÁơ¡Ơ¯×âÂ3 +¡È̀¼ù꤉̀L„¯ÈÏÔä̃ëÔö9¥‡á=Ï»9¥‡ù׳ô‰Á™‰kß [ïS׺÷ˆá‡º»Ăµ1Û«‚ ½9§Ô“åÁăˆŸ;뙉kß [ïS™‰kß [ïSÏÄßÁ¿ÅơÔ±»ºÙÚר·Ô‡€¾‡º™Û±ëØÛ«‚ ½9âÄ¿‰±»‰Û±»ăˆŸ;ª¶2tTÏÔơÔí'󫇓ÍjëđÆÓÔùÚóÇ«ÔơÄáê×Ơ‡ñ5©‡¥2ßëM™Ó—¾ử±»ÏųưÀÓº•Çöư“ù×ÅØù×…Á‡é/×:½ôïƠù×Û«‚ ½9­Å©ˆ¹‡º¨±»íÆưÀ—¶ÏÔ±»«‡“Íj÷Á§ôđƠ¾GÛôßt¡Èôè×ɇ²º̣™‰kß [ïSá߈߈ÿ.äñá Ă¹ÅØ©ÇƒÔ«‡“ÍjüÀ¹Á˜‰j̃ZîSÏ̉åĂ¡û(ƒv©ÓívĂè¤Đ₫®¶Ǻº“Ơº½×Ó9¥‡µØ$× çơ«‡“ÍjÛדȩ‡¥2ßëMË̉ßÖơúÓÔ÷¼£ä‰¿I9¥‡×·Å«·3uUÇóâḈ‡Ç…Öù׫‡“ÍjăˆŸ;™‰kß [ïSïºÍÛ«‚ ½9Ở‹Á·̣½óÛº·Ô“ƠúÅ›ÛÅÔ߈±»ù×ívÛ«‚ ½9ù×óº߈çÜÿ¯¶ß»û߈«‡“ÍjÎÅĂõÀƠX™‰kß [ïS8¤‡×™‰kß [ïSñÚÛ×°»ûØöç̉™‰kß [ïSíØñÄ¢»Ó%Åó®Gø­Ö̉ÅïƠG½¹ÏÔƯÓ ₫®¶ø×Ľ›¾—Áư­ăˆŸ;§̀¿ßƒvÅÔö‹Ü½ÍÙ¾ĂÙæÚéÔ8¤‡ÖÛÀ²Â߈ñÆéÓ˜‰j̃ZîSăˆŸ;ؽ«‡“Íj“È¥ˆ]1ñÖ¾èĂƠưÀ«‡“ÍjưÀ·Ôù׳ȡÁơĂ©¼ËÇëöÛ«‚ ½9¿ÅÙŒë*«ÿ¯¶½Ă‹Ç¬Ö‡¼ÿÚ™‰kß [ïS‹Ç‚¾ăˆŸ;k½€ëö±»ưÀ½Ă™‰kß [ïSÿ¯¶Ù½ưÀÔXñÓÿÚÁ ëöÁ߈…¼߈ø‹ÇíJ±»‡Œ‡Œă»™Ó¾áêÁ̉¡Û¦ÓÍÄêÔỞ߈·Åß±»ƒÔ™Ô«Ú½œ·̉ ¤0‹Ó‘ơß™÷ÁñÚßÚ́ơ߈ñÓăˆŸ;߈ÏÔƯÓ ƒv÷Áß„™‰kß [ïSÆ%Ë̉ƒv’ƠÏÄÁ̉È̉›¾ơê±»ªÚư‡±ù1Æ~ßÄÙ±»§Ô÷Úµ†™‰kß [ïSÅÔº¹ÚëƠU½€Á̉¦Ôƒvµ‰×ÜñÚëÓ̃ÅÏ̉±¿­¾ïçáêׯ¾Ûº·‡‘×8ç¡Ôÿ.ɇ¡Ô¼ôñơǫ‡“Íj₫ÙÚ±»߈Û«‚ ½9™‰kß [ïSßÚ«‡“Íj%s±»ï½©‡¥2ßëMÏÔщñÓÙŒë*«Ûº§ôï¾ÛÆ™‡±»¡߈‹àăˆŸ;Ù½“¼å‰­Ä‰¿IöÁƠ¼߈ä̉×̉׿8Û«‚ ½9¹Ú­ơñ×±»ÿ¯¶º߈†Œá+¡ÖÓÆÙÚăˆŸ±¿©Ø§Ô±½öàƠÁ éÓĂ¼¯×ÿ¯¶߈ϼ߈ÏÅ™‰kß [ïS÷ÙÂÙëÔöÙ×Åù×çÚ¡ÔùêĂÙĂÙÄö­¶ƠXÿ¯¶ÏÔÿ,åñ)å׵س¹ÅØ•Èû›©‡¥2ßëMßÚĂº9¥‡÷ˆźơêÏfß»ûù¿¹Ú‹vơØÏÅ­ˆ9¥‡£Ç£ ƒÚ¡ÇÏÔ›¾Á'ó¶€ƠÛ×™ô‚5÷Á¸ÚÛ«‚ ½9ߌÛ,¥ˆ]1Û×߈‡Û¸ÚóăˆŸ;ä̉½€‡ù××ƠǼÙ9¥‡½›¾ëöù×ưÚÛ×9¥‡ËƠÿÚ‹È0Ú½É̉߈¯‡ívÔXÇÖ߈Ï̉ßÚ…»Ă«‡“ÍjóÂÏÔÙÚùדÈÇŒ˜‰j̃ZîS¡È«»å̉ Û–Ă±»ưˆ›¶éٽчŒ¾»öÁăÚ¹̃Úª‚ +¼9öªº™ëé嫇“ÍjăŒ½ˆ¬Ö©‡¥2ßëM…ۙ͜­¿Û«‚ ½9±»±»Ơơ‹ÈÁ—ˆ¹Úÿ¯¶ơ…÷‡«̉Ï̉ëöÏÔéêƒĂËÉ9ÇÅéêÏ̉ÁĂù×ơ걤ƨ‡¤2€̃êL—¶‹Ç«‡“Íjù‡ÿ§›ÛĂÙ©Ơ½ăˆŸ§ÓרÛ«‚ ½9Ø™‰kß [ïSŒƠ÷¤ÍB¥Ü‡Ú›¾¶Ù½ÅØâÛ«‚ ½9ñÓ·‡‘×8çÛ«‚ ½9ƠÅ»ÿÚ鼑Æ߈¥ÜÆèù噉kß [ïS¶ è ˆËǵØ÷½€ĂÙù×æéº…»•ÿÏÅù×߈¢Èăơëö–»‘Ú³¹¡Ôͼ½YÂàù×£qüÀ·‡‘×8çͽö…Ôù×›¾Æ»çØÁƯ߈µa‚vù׉ƂØÁĂ¢XơêÙùæï½«»ßÁÏÔ߈­Ä°¿ĂÙ¥Ưù×ßù×ë™H·¹ù×™‰kß [ïSƒvƒv“Ơùיɵؾٌë*«Û«‚ ½9‡Û¶ÇÔ«»©ÓßÄÙóÔ‹Ç·‡‘×8çå̉ ÄÔéÓ°ÔÛ«‚ ½9ÚÄ̉ƒvﻦô9¥‡ƒv›¾ù×Û«‚ ½9ơêª-đ»*˜Ô ù×ßÄÙùê¹Ú«‡“Íj½×ï»÷‡Ï̉ĂĂ™‰kß [ïSưÁ™Ô߈ŒÓËÖÙ½Ó¼™ëéåăˆŸ;k©àëØ€¼¥ˆ]1¡%ëö ËûÇÚÓÆÍÓù×ơêëߥ‰ÍL…ëö̉Æ•ŒÙÚ½+ùơ¸ÚêöñÚÿ ™‰kß [ïS«ø×8?¤‡?ÖÎŃv̀ÇÂơêÏÅ߈ÛºµØơ$±»«»Ó¾º›¾Ơ´©‡¥2ßëMûÓ±»ÁĂö×Ơ†7§jÏ̉G½¹ăˆŸ;k«Ú¡ñËÓ•×ơÿëÔ·‡‘×8çăˆŸ;kùê°»©‡¥2ßëM®GøÛ«‚ ½9щ™‰kß [ïS‹È‹Çá ¾»ăˆŸ;«‡“Íj—¶₫®¶Ơù×ܱ»îôÛ«‚ ½9ẳëöÏËÈÇOٽǷ£9¥‡‰¿I˜‰j̃ZîSưÀ›à¡Á«ÔƒvÙ¤₫Û±»Û«‚ ½9«ÔµØ´†ăˆŸÏŽÔÖÆ±»©‡¥2ßëMĂºù×¶·‡‘×8çÓØùשñƠÚª‚ +¼9º߈ÓÆ¸Úíêéºù×›Û“Ûá”öÁÓĂÙ¡Û×¼ø×ˆ» ÷ÁÏÅù×ÿ¯¶¼ïíÖ×Ơă͸Úơê}ÑÓù×­¾ù×Ù×ăˆŸîƠÛ«‚ ½9½‡ñ5Ă…ÇăˆŸ;£Ơ›¾÷Áù×ăˆŸéßïı»½€ăˆŸå̉ »ĂưÀ߈‹É0ïƠ±)§Ø÷Á¯¾³ºóñÓÛ«‚ ½9ÏÔ—¾»øÅà̃“©‡¥2ßëM˜êèäÏ̉ÏÔÏÔ±»߈ƒvÏÅë‡Û ÇÏÔ£‡Ù½°»éºù×ÓØù¿ÓÔÓºщ÷‡í—Gôƒ×Ù×áÛ¸Ụ́"(ƒvÏÅ̀&—»ĂÙÑÄëĂÙË¿߈³È£Ç߈ơÔ½߈”ÚÆ¢ăˆŸ;®×ˆơ¡Û‚ØĂÙ™‰kß [ïSÛ«‚ ½9ËÇÿÚçÔ¡ÏÔÁöÁÑÓƒˆ›¶éĂÙ±»Úư»ÏÔÚª‚ +¼9‹Óá ÷Úºؼ«ÔÛ«‚ ½9ß»ûĂ¹ÚϹĂºÑơ‹ÇöÁâˆ:k«‡“ÍjăˆŸ;k¶è‹Ü«‡“Íj¯¾ÏÅöå‡ñÆíÆÅ»ù×ö«·3uUÙ½ù×éÓæØ—Œô¿¹ù×Ù½ùêϺ™ôóǧԱ»ÍƠù×ăˆŸ;kăˆŸ¹±»ơê¡Ôöº‹Ç÷Á߈…»ßÁ¯×¯È¼Ù½»ÅỂ©¼ăˆŸëö¹™Ǽù×½“Æ̃» ú ù×Ë4£äÅØÑÅçô÷ÁÙu±»½´ô»ˆÿ¯¶Û¥·Ôù׫‡“ÍjưÀÅØ«Ó½ù×Óºø×/ß»û¡Ô—Ó½Û«‚ ½9ßÁÂÓ +‡ŒËÇ‘«‡“Íj̃ˆ߈ÑĂ½È±»߈öï»ÀÛÓ‡ŒăˆŸÎÅ ¹ÚÎÅÅÄï½ÎÔƠ2¿‰ÓÁ9¥‡©ÀĂ …»›Ú—¶’­ÄºơĂÙ½£Ç”釙‰kß [ïS™‡éºơê¡ÛËǧӗˆߌÛ,ô¿ô÷‡Ö߈“ÆÙ$¥Øó½Ô‹Ü«Ô³ºóÄÓ ÛÄÓÏÔœ·̉ ¤0Ï̉Ư‰·Ô©Ç¶ÔăºŸÅ·̣Ù½á ĂĂ ›­±àéM«‡“Íjô§ôóÇ÷‡ï‘ƒvù×ÑÄëÏ̉ÏßsÖÆÏÔăˆŸ;·Ó¦ÆÑØÇÓ«‡“Íjù×ëö8¤‡ÖöïiµØƒˆ«‡“Íjë$ƒØù×åÁù×Û«‚ ½9•×ï»÷Áù×½Øï߫ķØêÔÑíëöϺ߈×Ơëöß„ĂÙ·‡‘×8çŸÑÓÍË)éÛ9¥±»ÁƯ¥È½Û«‚ ½9ÓÓßÄÙ—Óä̉£Ø±»ëƠUÏħÆÓ ‹›æôêâˆ:¡ÁĂÈÇÖ߈ÏÔËÇ—»ÏÔùơ§Óơú“ƠÖ +›¶éÿ¯¶’Æ©¼ÙÚ°»¡ÁŸ\›¾ŸÅ¡Û¡Á½­ÖÏÔçÚÄôÆ̉‡9«¼ÂÇØßÏÁÛ“‹ùêăˆŸ›v•½ëö·‡‘×8çöÏÔéơưÀÙ½Ă±»Û«‚ ½9˜ô“Ɔ“­)±»™‰kß [ïSøÁ¹›¾Û×ÏųØĐÓƠXă»Û«‚ ½9˜È©ÀÖ¹ íê9¥‡×±»çÿÏ̉©Ó©Çơê³z·‡‘×8燌á Ù½¥âóg©¼ŸØ߈ÏÅ…ö«¼«‡“ÍjƯ ĂÙÙ½ăˆŸĂË¿ш«Ô‚vù×çÚˆ±»Û«‚ ½9ăàÅÆï½ôÏÔæØÑeưÀ¼±»ÅØ©‡¥2ßëM»~̉ÁéÓÑӋǭȭăvܷԥƳÅn¡È₫¼ÏÔ¡Ô¹ÚƠ£—ƯƠÛ«‚ ½9£äÛºéÚÛÀư­ß»û‹Ó«ÔÁׇÚ÷ÁÅØåˆ‘ÔÅØÙ×ßÁ«‡“Íjá=ÁĂ¡Á»ÓÚª‚ +¼9•×ÙÅ뿉ƒv—¶±»ÙÚ—¶™Ô™‡ÏÄÛ«‚ ½9ƒÚø×Çö¡È¶ÿ¯¶ƒvÙÚ©Ç™‡™‰kß [ïSϽĂäƠ“ÈñÓằ¶ï½Ù½ÛÀ̃Á×¾Û«‚ ½9ăÔ“ÈĂºÏģǫԓÈéêÚª‚ +¼9·‡‘×8ç¹Ú߈±%ùê­ÄÄƠÏÔ‰ÔÛ«‚ ½9‡ÇăˆŸàƠßÖ߈߈·ÅăơÛ«‚ ½9ùÚ¯Û›¾ׯ£b»ĂëÔù×ÎỖˆÑÓÑÄë³à߈ÍÄ̀Ê)èÛ8¤“¹ƯNưÀÑÓg‘́Û«‚ ½9ª¶2tTăˆŸµĂçÍ6­Ä∯ȱôÍÄÇơϼ“¼»Đ›¹óÄ›·ÔáÛ߈÷ÁªÔº°»«Ô­µ‰øéÔ›¾ƒÖ‹Çÿ¼æđ˜‰j̃ZîSĐ+»Ă…»Óºøë±»ư“ơêƒvÏÅáêÏÔ«ÛơùêûƯ±»™‡ßχº¨Óơñ»Ï̉íÙµ†Ó؈۫Ѽ ï»ơêăˆŸ;«ÛÁ¼ÏŽºÏÔñÚû(ë‡ĂĂ ›­±àéM¹à¹ÚƠXµØ’¹ÜN‚v㻓Ơ½€µØ‡Ç³¹ÏÔ¹Ú…Ơÿ§•Œ«‡“Íjé‰ñ5ñ·åºßÄÙ³™«·3uUƯº¾ÏÔ«‡“Íji¿I÷¶µaÍƠÁ½«Ô߈ßÚÙø×ï½¹ÚăˆŸÏÄÑÄ뉿IÎÔëöщ³ØĐÁŽîô ëÓщçÚ߈ÅÓ¶…Û«‡“ÍjơèÅăơÚª‚ +¼9ÍÓ»Ø÷ÙÍƠ9¥‡߈™‡Ñ·Û«‚ ½9Èùê߈щ™×Û׫‡“Íj˜‰j̃ZîSË¿Ươ×¾…àëööăƠùצƓÇÛבÆ÷ٵؾôêƒvÔ¾FÙÚƒÖÏÔÑØº«‡“ÍjƒÖ«‡“Íjÿ×ÏÅ9¥‡×áêƒĂƠ¡Á±»Â¡ÔÁçóÇóÂöӻř‰kß [ïSơèÅထg₫ÚɹÚưÀơê£Ø¹ÚăˆŸ;k¡Á³ÍƠÅÓÛÀÏĪڃÖûؽ€“ȇ¿‰Ÿ»ÛÀưÀ%Å­Ô9¥‡«»ôê¯Èÿ¯¶ï»ÙR܉Á¥Ó˜‡±»ăˆŸ;ØÓ™‰kß [ïSÛ«‚ ½9™‰kß [ïS«Ô¿Û«‚ ½9øơÑÓ‡ä×ĂåºÓÏÔ·‡‘×8盾½ù×Á߈ơÔ¢» +¹̃«‹ÏÄXÛ×­ÖêöëÔ¶-è-߈ûÓ±‡ÏÅù×ù×£ ÁĂ¿ºÛ×½ôéê‚v±»¥ˆ]1ôê8¤‡™ÔđÁÁÛơêÍÀֹŖ“ƠÆ™Á9¥‡ÏÔñÙăˆŸôÔơÄ©ØÙ½ƯÓ ®¼ù׃ÔơØÓÁøÏÔ÷ˆÔơêÀË´†öÁͼè¼ÉÜÁ‡é/×:½ĂÙĂÙƯº™‰kß [ïSÙ½߈Á̉ß»û°» Ëû£ØÙÚ9¥‡³ºó˜ÑÓ¨ØóÏŧk‰;°»“Ơ½ÖÆ2ÔX߈ƒØÑÓáÛ¾ÅÁơèÅ›“Æ™‰kß [ïS™‡øêă½ÁƯ±»‚v£äá=ùÜÆÓà=ß»û¥Ø™‰kß [ïS…öÁƯáØǼÿ¼å̉ “¼ÁăÛ«‚ ½9·Å±¿Û«‚ ½9ÜƠÁĂ¯èôï»Íı»©Ç½¤ˆ\0G½¹ív¿‰ÅÔªÚ ¾±»ûƠŽ«Ú±»ăˆŸ;ưÀ³È9¥‡×ƒv¼ϼ̃ˆï½ªÓ߈¶­ÂĂ©ØÓ¼ÙÚư¬ăˆŸ³(ɇ›¹½€•×úÙçÚƯ‰¯¾µØ‰½ÇĂÙ™‰kß [ïSưÀ«Ôù×¹ó·ÅùëÑØ•Ü­ÖƒÔ¼±»“Æ߈ÅØ…ÏÔÛ«‚ ½9̀ÇưÀ›¶é°»½³ÂÏĹÚ9¥‡×«Ú¹¾Ù½ÏÔ±́±»½éÓ©ƠöĂÙ‘ÆƯơêÁĂĂĂơ½¿đ‘đ©Ç±»9¥‡ù׶軇 Û½ô½Ăß»ûø×›Ú™‰kß [ïSưÀơêÓÔùש¼©¼…ôƒv«Ú‹ÇÛº£ØñÆ­v‘¢ăˆŸ;Ă¼®é»ôôêÏÔưÀƯơĂºưÀ™‰kß [ïS½ûÓ߈º߈«‡“ÍjcØË̉ơÚăˆŸ;» µØׯäơ°»ßÁᾃv +Ư߇ºßÄÙû(¶±»ưˆÀ̉ËƠÿ¯¶¡¹ƒ£ÓÑ`“Ơ¿ßĂÓ„‹ÇÅÓĐÄê«»߈¹Úå̉ ÓØøæ å̉ Ø-³s½Û׳ӗ»±»óơ°»‡ºÍÓñÓưÀâàăˆŸ;·Ô«‡“ÍjéºÑíÛ«‚ ½9̉Å«»™‰kß [ïSß»û‡ºÆ¡ÁÄ +ăˆŸŸ}ëö°YÂÏÔíÏÔÛ«‚ ½9ƒvëö¼ĂưÀ£ä«÷±»ëöçÚÿ¯¶‘ +§ƠƠXĂâ“r¼ăˆŸ;½€ÓÅơĂƯÓ ÍÓù×ñÓ—Ó´±»Ç̉¿¹ÑÓë×ĂÙĂÎỞß%£ØÛ«‚ ½9™‰kß [ïS³zĹڮGø§ô×$›¾Ă×ËƠ߈9¥‡ºư“ŸÖÏÔƒÖñÇß̃ÿÚà= ™‰kß [ïSư“¤اóÄĂĂñÓèºÁÛºơê×Ơ߈­Äö¡·Å„ô×ܱ»·‡‘×8ç·Ôöƒví—G‘ÚôĂ߈·‡‘×8ç¹Úƒv£XÏÔÅÓăˆŸ;­½¼Ÿ£Ç¹ÚÛ¥ˆ]1—ˆ‡xñÓ߈±³ùײ‹ÜëöơÔÓØÁƯ…ƠÉÖ™‰kß [ïS¨‡¤2€̃êLù×™‰kß [ïSœ·̉ ¤0ƒØ±»ÏÔÍßνÜ߈ñÚàĂEéê«d±»Íħӱ½ù×ù×Úª‚ +¼9Û«‚ ½9gƒv¡Èù׷ůé‹Ç¦È ™‰kß [ïSÇ—Ơ«Ù’Ç¿L̉Æ÷ÁẠ̀ÇñÖÓ½‚ùëÛ«‚ ½9ëö›¾Á̉°»±»÷ÚÆ«Ó¹Ú·ÔǾÓű»™‰kß [ïS‰ƯûÓÙÚ™‰kß [ïSèê…»ù×ăà釹ܱ»ÖØå¿Ç ¹Ö­Ô—Ø߈«‡“Íj¿‰Ù½™Á¨›¿ôçÚ½€ĂÔñÚơêÁ̉—¶£äƒÖ÷ÁÍÓ™Á½€éÓ½€ÂÙÛ«‚ ½9Û«‚ ½9ù×ÍßÇÖăˆŸ;Ơ¥ˆ]1Ûº¡h›¾Å¡Ô—¾÷Á‹߈߈öÁăà‹Üùê³¾ÅơêÓêºôÅØÄô½˜‰j̃ZîS—Ó§à¥ØÎÔؽỞéºéÖÏ؉j̃ZîSă°±»ØÅ ê ă½ÍÄÈ̉̃Á·‡‘×8ç£ÇÅÔˆ߈Ưº÷ÁåÁƒØ߈¿¾Å÷ừÓ +ÏÔ©¼ă»‰Ô‚r%¡ÈÙÚỞ˜‰j̃ZîS¸¾߈±ëØ«‡“Íj8¤‡Ï̉›ÚƒöơêÎÅÛש¼ƠXë «Ôµaщ…÷ºº«ÔăˆŸ;Ưºëö§ÆχÛ«‚ ½9%Ûº̃Ư˜‰j̃ZîS›¾±»÷ùêù×ÛÀÚÀçÚáö߈˜êèäăˆŸ;ņÏÔ±¿₫¼߈߈ăˆŸÑÅÆÖÚÀ½Û«‚ ½9ÏÔÏÄͺ×¾íÆÖÆ©¼µØ•%9¥‡×óÚô±»›Úëö£Ô­Ä˹ÁƯ¡ÁÛŸºÍĶĂèÙÚ̀ÄëöƒvÛ«‚ ½9ưÜùê“Æß»ûăˆŸ;ḳ«‡“Íj£Øχ9¥‡ƯWÛÄÓƠ«‡“Íj¦ôŸ\Ÿ}ĂÖ£Ó‰ÔƒˆŽçÚŸÖÍƠ9¥‡°»ăˆŸù×á —¶߈ÿàêöăˆŸÿ×Ûº³ ¯ÈÁĂ›¶éơÔăêÑØÔ·ØöùŸ%ËÇß»ûÛ«‚ ½9ö©¼ñÚûêËÇÛ™±»̀«‡“Íj˜êèä߈›¶é’½ɇ©‡¥2ßëMºôîÅE»È‹Ç–¶‡xù×±¿ÏÔéêư§‡ƒ×µ‹ăˆŸ;«‡“Íj‹ÜÛ«‚ ½9ù׫‡“Íjß»û¯Èô±»ëö˜‰j̃ZîS¹Ú íêăˆŸ;kößÁßÖăˆŸßÚÑ"™‰kß [ïSµØÇÛÔ˜‰j̃ZîSÏÔ¼ô¿‰ÔXûØÑÄë·Ô³1Ô½߈­ÄÏÔ÷‡ÿ¯¶É̉‘ÓÛד±™‰kß [ïSÇû£Ø«‡“Íj‹ÇƠûĂ½Ă—»“¹ƯN߈ÙÚív¹~ÏÔ·‡‘×8çÛ«‚ ½9ƠXéêÛ—ơăˆŸçÚ×Ơ»ÅÛÀÛ׃v߈«·3uUщ°»¡ÈáƠËÉ9ăơ9¥‡óÔ°»Ø±¿¿àÅàô±»§ôºăà߈«Ô×¾ÑÄë½߈Ă‹ÇÑĂăÁ¨‡¤2€̃êL¹Ú«‡“Íj™‰kß [ïS²£Ø«Ôé‡åĂÛ«‚ ½9Ó̉˜‰j̃ZîSÓÓ÷ÁÿÚ匿NÍĂ«‡“Íj±»«‡“ÍjñÓ±»üÁÉƯھ˿™ÓÓ̉ËÔá ƒv©‡¥2ßëM̉̉ëö½Á½ÏÔøu9¥‡×¯¾§·–¿À½Ü +±¿ŽÁñùê߈ô«Ú¿ß¡%™ëéåÿÚ‡Ú¿ºƒÖ±»›¾̃»ú«‡“ÍjóÂå̉ ÛÇ”óÚÄ̉Ÿ}‹ÜG½¹›¾…n9¥‡ơê‚ÚĽñÓ©¾ÁÎíÆéÓù×ÛºÙ̉«ÔơÔÓÆù×ÙY·ÔÛ«‚ ½9ŋǓƠíÖå¿ĂĂרñÙ™Ó9¥‡’ºĂÙ«‡“Íj©°Û«‚ ½9ÅĽƯ)å̉ ™‡°»™‰kß [ïSºÏÔ½ÎÄƯ”Yº®¼ơèŵê¬Ù‰¿Iå̉ ߈éơ‡Ç‹Ç¾™‰kß [ïS±‡ưÀôŸ¹ù×ÿ.‹ÇÙ½‡×§ïiëÓ±»àêĂ ¹ƒˆăˆŸ;kĂÙ™‰kß [ïSÉƯÏÅƯ߉y­Ư‹Ü£ä÷Á§ô߈Ï̉¯¼ÛÄÓ°»Åtû½ù¿Ë¿Ǽ›ṽ»ú÷ÁÚª‚ +¼9ĂÙ·‡‘×8çóÂ߈êö™‡߈ÍÓ÷Á¶߈ÏÅÚ×›¶é·‡‘×8çÛ«‚ ½9Û×ăˆŸÏÅÏÔơêëöËÉ9ÿÚ—»˜Û«Ô‘ơ©)»ˆÛ«‚ ½9źùôÛÇﻺ߻ûÁ̉¹ÚëöÎ̉˜ơöÁ׿8½ĂôôƠŽ߈™ëéå›¶éưÀƠ²«‡“ÍjÏÄëöÛ«‚ ½9ñÚÂÓ.™ëéå›ÚÛ«‚ ½9ĐÄ{ê{ÏÔÙ½½½€Û«‚ ½9ƯÓ ưÀăˆŸ;ÍÄ¡%߈íJÓØưÀ Ëû›¾ù¿ñÆíÓ™ơăˆŸ;ơèÅĐŃˆöÁ¿Ø½Ѧ¾×Ü›ÛÛº߈½ëöź±»¿›¾ßÁôؽơèŇx¿‰Ÿ}¯Ơ¥ÛÍË)éÛ9¥ßƯï½“×µĐ¿‰ĐÄ꛶驇¥2ßëM«·3uU£ä9¥‡™‰kß [ïSÑÓù¿ưÀ³ºó߈›¾¼¼µÏªÚÓØ«¾ÓÆÿ¯¶µaÑÄ뫇“ÍjÛ«‚ ½9ăˆŸ¥Ûû̉‹È«‡“Íjº¹Ú̀Ê)èÛ8¤ƒ…µØđ…»Ó‚Ö£È₫‡°¿ÜơÀĂơèÅĂÙ£»Ï̉«‡“Íj¸!áØƒÖĂ¡»“ȋǿ¥¸Åñ¥ˆ]1öù׸ÚéÚêö ¿‰³ÎÔ¹Ú±»·‡‘×8ç•ӳŨ§Ô™µßÄÙ$©Ó·ÔÇ%íØƒvùæó#đÓ ÙỸÖÎ̉ؽ©Ó«‡“ÍjưÀƠX¡Ô½ô“¹ƯN‘ÓÏÔáƠ¹ÚÏÔ¡Û›¶éÑÓ‹ÇÀǺ…Úơèű»¯à™‰kß [ïSÏÔ¤Ø ëö½¡Û·‡‘×8çß„¹Úùë™ÁÏÔ«‡“Íj»ôÏ8¤‡Á̉›¾÷ÁϺ³Æù×ÏÄ9¥‡×¤âßÚÛ«‚ ½9¾ +‚ÏÔûØ›¶é½ëö¡»Û×Ç÷½ơÔÏÔÙ×匿N·Øù×ƯÓ ÉÜ™‰kß [ïS¬Ö=‹Óß»ûĽï³2™»…©Ơ±ÆĂ ÆôöÏÔ߈±¿ĂÈ£uÏÔưÀ¿́ÍÓͺ÷Á£Ôꩇ¥2ßëMº”öÿ¯¶£X‹»ØÜù×ËÇÓ¼¹Á™‰kß [ïS™‰kß [ïSơ꫇“ÍjßÅ«‡“ÍjßÔÛ«‚ ½9ù×ëö¿‰ɇR’È‘±ûÓ«»çô«‡“Íj™‰kß [ïS›¾ĂÙ߈ÏÄ÷Áá óljơ9¥‡ăˆŸ;ÎÔù×ÙÚƒµ†ø¿«Ô£»ÿ*ˆ±ë؃v9¥‡‹Ù‡Œ½“Û«‡“ÍjÙ½ÙÚ½ÇâÂÙëÓëö±»Û«‚ ½9‘Ó·Ó ¥0Û×ßÁ˜‰j̃ZîS¾·&ű»ÅØÛÀÑÓÙ½ÁˇŒ©ØƒˆÅ÷‡±»íÅÿ¯¶Óº›¾ÿ$«‡“ÍjÏÔ¡%ăà‡Ç›¹¥߈ëö™ÓƒÅéêøêá ™‰kß [ïS½ôᤓȤÈ%ơÅÁĂÙÚ¹Ú©‡¥2ßëM¿Ôÿ¯¶̃ˆƒv°½ÁÛÿÚ÷ˆ§àÚ×›¾ +ÏÔÁ̉«‡“Íj›¾¸ÚÁ̉ÙôÇĂÈÁĂ‹ë¹Ú¨¼«Ôµa¼†Ç̃ˆÙ½µØơÄÓ̉ĂƠÁƯÏÅá¼Û«‚ ½9Ûºï³2Ç»ªÓ«‡“Íj¿Å¬Ö ±»‹ÇÍÓàÖÏÅăˆŸ;k¡Ô±½”ÿ‚ ·‡‘×8çơĐ¡Á§ÓƯơ߃ˆ½̀Ă¿½ÏÅ«‡“ÍjùæëöÿÚ¯éÛº¿‰ëöưÀÓºœ¿±ÁăˆŸ«‡“Íj©Ó¡ÔƠ´À™‡ơèÅûg£äÑÄëÇ%‡Œ£ÔÙ½߈ƯưÀÎ̉³È‰Ư(è‰đ5đ¶·Ó ¥0çÚ9¥‡̃»úĂÙ·‡‘×8ç9¥‡×©‡¥2ßëMÑ`ơê9¥‡ơÔº߈߈˜‡ăêÓº¯G‹øÇÖ«‡“ÍjÖù“Èëö9¥‡†äÛ«‚ ½9ưÀäôÛ«‚ ½9öƠăàù×é‰ñ5ñ·ƒÖñÚ¾º™‰kß [ïSÏ̉ƒv«·3uUèׇº—ˆÙ̉ßÄÙĂÙÚÀ߈ôê•‹HÅÙ«ÔáêÅԕߣX³½£ôå̉ ÍĂ™¸щ¼đĂÙ¯̃˜‰j̃ZîSóÂỞµêñÓăˆŸ;—»™ÔăˆŸ;kµ‰¥Æ—ˆíÖ¿»˜‡‹ÜÙ½ëö¡ƯÛ«‚ ½9ºy—¶ÙØ×á ½€óÇßÖº½€Ïı»9¥‡ÍË)éÛ9¥±»‹È½¥ØĂ¼ *¥£¸ÚĽ¦ôÉ~§ÓăˆŸ;‡ºƠ½ËƠĂ ˆÛ×Û«‚ ½99¥‡×8¤‡Ö»¼‘Ù€ÑÓƯº°»°)ÏÔ߈ó–ỞăˆŸâˆ:jù曾£»«‡“Íj™‰kß [ïSăˆŸÁ¹ưÀ°»ÁÏѽ€ÓÑØù×ưÚĂĂ ›­±àéM­¾ăˆŸ;ßÄÙÏų…Ö󫇓Íj×ƠƠ¾ŸÖ¹óM±»·‡‘×8ç™ëöñÖ߈ÅØ—ÛŽÿÚÓÆÓÁ߈¹Ú‡Œ°»“ÿ¯¶°êØëöÇÖ«&¹xé‰ñ5ñ·ÙÚ¾±»ÍÓ¥Ö›¾߈÷Áá áï³2±¿ª»ÓÑÓÛ«‚ ½9³ƒÔÆ—³ùêÛ«‚ ½9¼ç³È†Ç©ÜÏÔǺÚÆáê׿8·‡‘×8ççm Á±»ÏÔ‘ÆöÓ±»߈Û«‚ ½9­Öׯëö›¶éµ÷™‰kß [ïSéÓ‹ø3¥́çđù×ß„̣«‡“Íj«‡“ÍjÇĂăÇí »ÍË)éÛ9¥ăˆŸÇØĂÙëö³›¹›߈±»±»›E«‡“ÍjÀĂkß [ïS™‰kß [ïS—¶ÍÄ­€™‡™‰kß [ïSÖÔ†6¦j9¥‡âˆ:Û«‚ ½9ôê÷Á¿‰đñÓôáêÀ‡€è/Ö:ơêẲÍÓ¼€ÅĂÁƯöđÁï½Á̉ăàëö›¹·‡‘×8çëö¼Ô÷å5ÓÆ£äêÚÛ«‚ ½9ˆØ¾ØƒˆăˆŸ;k·Â®é߈ÏÅĂĂ罫‡“Íj¥ÖÉÜưÀÓóÍÄÑÅÅØÏÔÏÔŽÓÆÓØ·Ô×¾§Øù×߈ûµØͼçÚχùשàăêóħÓɹڽñÚÑÓù‰ψÄÓ¡ÁưÀ½Èà¡ÔÍË)éÛ9¥½€ùêù×·ÔƒØƯÓ ±ëØø¾½Ôº¶Å…qơæ߈½È»Áùê8¤‡áƠµØÆ»ăêơ‡‡Ç±»ÅÓ™‰kß [ïSơèű»ÅÓñÓÖÂï½éêÏÔ›¶éÍÄ(¡%ÙÚ߈öÁ»đ«‡“ÍjÑÅăˆŸ;kĂä̉™‡›¹«‡“ÍjÍ8 ¤‡ ×Á‡é/×:÷Á‡¿­½¼ƯơµØ·‡‘×8çâƠ™‰kß [ïSß߈­Â”‹œH¡ÓÏÔÏÔ¤Û™Ó›Û­Äù×¹Ú“Êô½ËǑÙ‰kß [ïSăˆŸ;ö›¾­½¼“ÈÇđ÷‡±»Ô³ƠÜù×ù×£Øû¼ƒÚŽĐÓö¡Èăơắ¯ÍĂ×›øÏÔ™‰kß [ïSưÀºĐæ»Øëö¯Èí–GùêÔ“Ơ˜ÛÍË)éÛ9¥›¾çƠëöä̉RXëÓͽ™‰kß [ïS«‡“Íj›¾µØÓù×ă•·‡‘×8çñÓï½÷ˆ×ÓÅÓÛ«‚ ½9­ô߈̃»úøôpăà¹Úåô¡Á«Ô©Çé„—¶É̉Ï©‡¥2ßëMƒÛÄÓ·Å¡ÁéÔă‘·¾•{½Ô“ƠÛ«‚ ½9߈đÖÏÔ³ºó»Ø«‡“Íj‘Û«‡“Íj½G½¹¹Ú·¼Í7±»ĂƠ£ÈÚ»"ö"“ÈĂ«‡“ÍjăˆŸ;³ÂûÓÛÔ”ăˆŸèº°»Ïß±»ë¼ăˆŸøêJ»ÅÏŽ£ÇÊ¿çÚÖĂ €Äêö½×¾ä̉ÙÚ§ÅÔøêÛ«‚ ½9Ó‡Ù½ÁÑĂÑ·ăˆŸ;‰¿IăˆŸ;·Ô™‰kß [ïS¡È¿̃ÚÑ¡ÈËÖóÇéꕌ߈…ƠÛ«‚ ½9Ø×ÅØ¡«Ù½‚ñÚÅÔăˆŸ;Í ÅÏÅ–ºÏÔ½§ôù¾¡»êÖ³m9¥‡›4ñÓÏÔ©ˆƒˆÑÓø¯ƠÙŒë*«߈çÚø×™ÁµÈ·̃™ëéå¡Á–»‹ÜăˆŸ;kàÅëöùê÷ÁăˆŸщ¶Û׫‡“ÍjÎÔù×óÇ…Ô¥%ÙÅë¼ôµØËÙσ¾‘߈רỂ÷ÁÍƠ«‡“Íj™́ßÄÙǽ™‰kß [ïSÓ̉Ổ‰Æ’ºăàö¨º…́¿ÙÜăˆŸ;köÁ°êØÙ½éû(«‡“Íj»‡ÿ¯¶¹¾…ÚÑÓ“È»ÂĂÖưÀ®Gø¸Ú9¥‡ùơëÓ¼á=Úª‚ +¼9ơêÁ ¾ß×¾ăơ߈±»½ơ¹Ú±Ô±»ù×­Ôÿ¯¶ÚºǼù×ăˆŸÏÔƒˆ„Ûºù×÷Á½"½Èû—¾¹ÚÛ«‚ ½9ƒÖ—¶¿¹¾ÓÔöơ©©À½º·ÔÏÔÄƯô²ÆÂÙ¡Ô¿‰ßÁÿ¯¶óÔ£ØÍË)éÛ9¥‡ŒÑ¾öĐÓ—¾…Ö¹ÚÏ̉ỂĂȯ¾ëöß»ûëöÏÔèê纛ڛ·ÔÙ½ăˆŸ©ÜÑ`Ù½¢4Ù½ùס½Ở™ờÊ)èÛ8¤ù×™ÓçÚ™‰kß [ïS¸ĂºóÇùăˆŸ˜ ê è ä «ÔÓºơèÅăˆŸ;ăÁ¿‰ç̉Áå¾µØơêÿÚå̉ “ ÙY󾯼±»÷Áë™H½ôÿ¯¶ĐĂ×Ü›¾Ă¶̣¾ß ½¿¹—¶å̉ Úê¡uƯÓ ơèÅăˆŸĂÙ凬ָÚĂ¹‡Çª‡ ’ ̀j ¹Ú¶‡Ö8æψ•%¥0™‰kß [ïSôáÛăëöùׇÇÁƯưˆ±»çÚăÏäơÛºçÚƒˆƒv«‡“Íj¯¼Ơ×÷ÁÏŵÜáÛ«ÔÑÓ÷ÁÓ×¾«Ô˜‰j̃ZîSëö߈¹ÙŒë*«±»ÍË)éÛ9¥ßÚơÙºÅ÷‡ÛÀ÷Áöÿ$ÁƯ§Ó»|ﻤøù÷ù„ÏÔÁƯÑó‡Û£‘ÍÓưÀá=£Çœ×¹Úϼ›¶é¯¾«‡“Íjơêª́ÉÖ‹ÜùêÇÖ™‰kß [ïSÛ«‚ ½9ÿ‘Ó±»ÙÚ¼ßÁ‡ÚÀưÀƒv‹ÜßÚG½¹¡ÛØêÖ +µØ¿‰±»‡ăˆŸ;“È™‰kß [ïS߈ăÚ‘¾·‡‘×8çªÚ ô“Ơăºá×Û«‚ ½9³Ü£Ó9¥‡™‰kß [ïSÏÅÂÙù¿ù×àĂß»ûö¾µÜŽÏŃ“ÈÅÛ«í.÷‡¿‰§Ôÿ×ÿÂŪԘêèäơê‘®Úª‚ +¼9‡ƒ¹Ûù×ÑØăˆŸ;™×­¾ĂÁƯ±»½€Û«‚ ½9—ÓơÔăˆŸæØ ùׇx·‡‘×8çíÆ߈Å»Ü%“·‡‘×8ç—ӵطÜëÚµØöÁÚª‚ +¼9¾ăˆŸă驇¥2ßëM½€¨º»Å©ÁÔ±»Ơơêù×½ö¹ÚϹª»ăˆŸèꃽ‹Ç‰¿I‹Ç§ÔăˆŸ;¹Ú™ô«Ôö©Ç™Ó×Ü©¾ăˆŸÓˆ•=‘¹Úù×ß»ûËÉ9œÜăˆŸ;ËÇÑĂ—¶«‡“Íj‰Ûù×½€‹Çơê—¶øêơÔ™Û½¿ºñÚ”ÈúÙ̉Û«‚ ½9ÙÓăˆŸ¾×á·‡‘×8çÛ«‚ ½9µ±Úª‚ +¼9˜‰j̃ZîSÛÄÓùêŸ߈ñÓ½ăÇíù¾µa½ëö³£ä¹Ú™‰kß [ïS…¾߈‹ÜØÚÿڋ܃ˆÙ̉Î̉£‡߈ùêÇ>”Œ̃ÄØ«»¯ÏÔ߈ñÓÛ»÷¼ĂÅÙ½ûÙ›Ôơԋܯ™‰kß [ïS½ÇÖûËåĂ«‡“ÍjÓ̉߈±»“ºÑӵ؃v±»ÎÔÛ«‚ ½9ưÀÁÓ±»çÚçÚƠÏÔ›YÅĽ¹Ú±»·§D ưÓ©‡¥2ßëM•{µ†ưÀ±‡ÿ×ψ߈³ỠŒÛ,°»§ÓÛ†“£‡ׯ‰ØơèÅ‚vµØÖÔ†6¦jƠ¾GÙÓƠÁ̉·Ô½ĂËÇ©‡¥2ßëM߈–¶߈¥‰ÍL…ºÅÇ»£Ø©Ó‹Ù›¾‰߈ÏÔơÇëö­½¼éêăˆŸ;•Èû›ÅÄăˆŸ°¿µ.¥Ùä̉ÏÔưÁ›¶éÏÅĐÓ­ÔéÛ«‚ ½9ăˆŸ;å̃ëÏÔ¡ÈĂÙÙŒë*«©Ơ«‡“ÍjÇ"ƠĂÈßÖ’Ûœ·̉ ¤0ă»×Ă¿ô³ØÑÓ±ëØ­Ø»ˆ‡ŒưÀï³2ö½̉Û«‚ ½9ÜưŒÁå¿ôĂĂ—ˆăˆŸÂ‹Ç“Û¢ôå̉ ºÖÆ®GøĂº‹Ü«ÛÛÄÓÛ«‚ ½9ăˆŸ;ËÔßÏ›¶é‹öÓ[™½óíŷܾĂÈÏÔ·‡‘×8çψª¼µØ‰ÛåÁ­ô±»ɇ¶¸µØÚ¹§ÔÙY­Ö«‡“Íj»߈ÅÔ›¡ÅØ­ÔöêăˆŸÙ̉âˆ:Óå­Ö߈ÓŃvر»¸Úù×±»ö߈ºÑÄ뙉kß [ïS߈“¹ƯNù×Ï̉ëöéºÂ.º߈ûØËÇßÄÙÑÓ½ưÀ¨È‰¼ơêù×½È̉‡ÚƠëö纛¾¥‰ÍL…‹ÜƒvơÛÙ¿‰®¼ù×ơê·ÇÏÔŽ¡Á÷ˆĂƠíêáê·Ø›¶éĂù×Ï̉‡Œ·ư³Üß»û‘±™‰kß [ïS«‡“Íj´½ù×—ˆÿÚ¹Ú“º‹Ü±½‚v×Ơ…»™‰kß [ïS±Ư·ÔÛ«‚ ½9ÛÀ›¶é«‡“ÍjöÁ°»üÆ ™‡¾ơψøăˆŸíËÇéºÏÅ9¥‡ƒvÓÆ±¾߈û(8¤‡¥߈ỖˆëöÿÚÍÓÇÖăˆŸ;k﻽ªÔ¡hÙÚĂĂ ›­±àéMßÄÙÙŒë*«¡ÈÏÄ×ƠÓÁ•ÙỸŒ™‡ÛÄÓĂÈ¡Ư£ä›¶é±»ÓØ¡»ơĂ“Ơ¼Ô³×¶ƒvÛ×߈Ù½™ëé僕»Á¹̃ÄØ»Ø¡©‡¥2ßëMĂÙ‰WÄÓÁƯ‰¿IùêƠëöÏÔƠ‹ÜĂÙÛºªÔÿÚ—¶å̉ œÔ»߈ºù׿ÅË̉öÛÀưÀÏÄß»ûÛº¿»Û‡ª»ĂÈëö­óŸ’™‰kß [ïS¾ ÙÚƠéăˆŸ;̉̉¯È‡ÓØ„ØùסÈ߈«‡“ÍjÏԥƱ»µßíØæº°»¿»đÓ§Ó¯¼ù×9¥‡½€½±»¨‡¤2€̃êL­đÛׇ9º½ÏÔăÇí—Óκù×áÛ߈áê™Áø¾ ‡ÇÍÓº÷‡ù×­Ößơ©‡¥2ßëM‡rưÀÛ«‚ ½9ÀƯÛ›¾û(ÁƯ߈ÿ¯¶Û«‚ ½9™‰kß [ïSÏÅ™‰kß [ïSĂÙ½½¥Öä̉¬Äö¿º­Ä©‡¥2ßëMͼ±¿Ưù×µØăÁï½ÏÅ飨áêé‰ñ5ñ·ßƯÍË)éÛ9¥Á*Ä–²ÆỞ“ƃÖßÚÓ¾ÇØÙ½ƠXÛ‡Ñ÷«»ÍÓ́‡רÏÔ°È«‡“ÍjÿÂù×%Ù½éᇱ%™‰kß [ïSÛ×…9¥‡™‰kß [ïSç̉½Ô„¸Ú°½Ù½¸Úå¼ ™rñ»u¥Ó˜êèä8¤‡Ọ̈Ç‹ĂÙ†½߈ÍÄùׂvùêÅ·ÅâºÿÚ»È9¥‡«»™Á߈ăY›¾›¡™‰kß [ïS¬€ù×·‹±”™‰kß [ïSưÀ­€«Ôÿ¯¶§ØϺ“‹ßÚñÚ߈íơ«‡“Íj©ØºÿƯßÄÙÛÄÓŸ}ăˆŸ;kÁÿÚ›ÚǼ½ÏÔ߈ÑĂưÀ–ˆơêÿ¯¶Ă¹¦ô½ù×ß„áÅ…ù×Ơ÷ˆÙ½ơêÏÔÊÓ Ơ¹ÚúƠ»Ø²Ơ³ÍË)éÛ9¥ùô‹Ç‹Ü©‡¥2ßëM¦ÆéÊ¿º߈߈ÏÔ¸Ú«»…n¡»ưÀ߈‚ÑÓëö™‡ÁÖ›¾ËÉ9ëö±»Âù׃غÁ ÓÅăˆŸ·‡‘×8ç匿N‡ÇÍB©ƒvăˆŸ;ÍÓ¸¼ö÷Ù¼ëÙÚ©¼¾ßĂÙÓºĂÙăˆŸ;kƒvˆ;…߈±»ƒv™Óçµ½ĂƯƠó|çÚÇæˆ´a·ÔơԻثԺ±»ù×ÙÚ˜qùê‹Ç·Ó ¥0µ†¹Úï»ëô›v¹¶áƠé¼ß»û§Óăéê¹Úù×™¤ưÚ«‡“Íjëö¯ơêăˆŸå¼ ˜êè䃈ÏÔÚÀ 9¥‡ÑÄ멇¥2ßëM¬ÄÛ«‚ ½9Ơ÷4̣ăˆŸ;kăà½ÅØ߈¿Å¹Úăơ—»íjƯă«»‰¿I‡ñ5«Ú«‡“Íj9¥‡×½÷ÔăˆŸ;9¥‡ăˆŸßÅñÖö‡xăÁ‡Úÿ9ÙÚ‚½Â ¬°àèM߈¼ Ï̉ă»¶ù×ù×ßÄÙß»û©ÇĂ¼ÅÓơê½§´9¥‡«!ëö«ÔûɇÏŹÚăơ™‰kß [ïS߈«‡“Íj©¼¯ĂX±ă½ăˆŸ;¡èÏÄ­ñÓ›¾ÿ¯¶ÁƯ¿Ă½©àƒàÿ¯¶íÙÅëá=ƯÓ ¡ÁÙŒë*«´‰µØå̉ ¡¼ơê½Đ»€ÓàñÖ¹ÚŸ}µØ˜êèäщëö™ÁØ×¿‰߈ó¹—¾«·3uU£Ç­Ö«‡“Íj•דƠçÚÆ®ÈŸû©‡¥2ßëMƯ‰Ù½©ØăˆŸ8¤‡å̉ 8¤‡ƯȘêèä­¿¼ôßó¥ØăˆŸ;ÄÓ ©£ØÍÓÏÅ÷ˆ™ëéå‰߈Ø×»½›¾«‡“ÍjÀ£Øàê¾ß—¶éÔÏ̉·Ô‰ÁơÔïƠÙ½³’º–¾ÿÂÿ¯¶µØƯ‰ÈĂûÑÄë9¥‡«‡“Íj“Æüƿ߱¿í½±»Û«‚ ½9¥Øô‡»ßÄÙ™‰kß [ïSôØÙÚ±»«‡“ÍjăˆŸ;kưÀ·Ô‡ÅÓ¡½½ơèÅ«&÷ÁùדƠŸÅ·ÈĂÙ™‰kß [ïS¥ˆ]1ÜăˆŸ;ơÔÿ×½ÜÓ ăơÜ¡Èç4÷Áщ•%ßÚ₫©‡¥2ßëMƠ¯G‹øµÜ÷Ú“Ơ˜êèäË¿›«‡“ÍjÍĂĂö„9¥‡ëö³ºó±»ăˆŸ;k÷å5Ó§Ơ±»ͪå̉ ׯÏÔ¾×ÜĂô·Ô™‡ÖØ +Ươ«‡“Íj±»¿‰¤Å¦Óù×ÅØÿ¯¶ƒÖ»‹•Ö½ƒv›¾˜êèä£Xù×Û«‚ ½9êÔ»‡ÿ¯¶ÍŒô½̃ 8¤‡ƒvÅÓ…Ơ›Úëö8 +¤‡ +Ö«ÔÉ̉™‰kß [ïS¿‰±»›¾—ÓƠ˯ơê‡x«»­Ä«‡“ÍjàÔɹçÚ«‡“Íj¡Ô«‡“Íjׯùå™Ó÷Áëöđu³ÂóÔºÏÔÆ̉ù×ưÀơê¹àÛ«‚ ½9™ëéåÛ«‚ ½9߈ ËûÑÓ¶×¾Û«‚ ½9Æ“ƠÅÄ߈©¼ñÓ™‰kß [ïSăˆŸ;¡ƠÙ×ăˆŸù×ÙƠÜăơ¤ˆb\b0b±»°½߈å̉ «·3uUƒv«‡“ÍjßÚ¾½ôáƠưÀ̉̉÷ˆ•Œù×ÁĂÙ½àŒĂÙ߈ù¿«s³ÜƠÏ¿˜‰j̃ZîS톱»³ØY·Ô›Ă­ÅƯÓ ưÀív¡́ÁĂ«»…Ǿ»ù׃v‘ççô™‰kß [ïS©¾ÍÄăˆŸÙ½á̉óÇ…«‡“Íj₫®¶‡áê—Œíø×˱ö¥ÛËÓ°»Ï̉߈±»3ÅÓ°»Í±»ÓÔ¹¶ăˆŸ;Á¹ÓÜơèÅ߈ç®”“…µØº£»‡º·‡‘×8çù׮驨¹Úƒˆù×ÁƒØ´Èí&ù¿ɇ¿½Ï̉ĂĂ´†Á›Úﻃv±»Û«‚ ½9™‰kß [ïS›¾–Áù×9¥‡·ÔÙŒë*«ùêÙÚëöÓ¾ơĂȹĂÙÙ½Ïű»…à™‰kß [ïSÏŃˆÊỠˆ§ô½é«‡“ÍjñÓƠÄơĂ«‡“ÍjÆ®Gø­Öƒà߈ëö%±ëؽ€º¿ï³2ƒv副¼¼³ºó÷Ùùש‡¥2ßëM½›̉óÏÅ•½Û×ÿÂͼ½€ÏÔ«‡“Íj•×ăˆŸ;ăˆŸï»Û±¿±»Ù½Ú £ØÂÙ·q¥ØÍÄăÚ¸® ™‰kß [ïS±»ưÀÙÚơê‹ÜÇÓÿ¯¶‰Á‡Ç«Ôö₫ÚçÚ—ˆ‹Ó¸Ú +Û×ÓÆø×ÇÓÏ™‰kß [ïS«‡“Íj™‰kß [ïSÓùùñ߈˜Û«‚ ½9ޱ»¯Û¯¾ëƠUÀË«‡“Íj¶¦D + +ƒv¹ÚñÓëö±ëØÜƒv‡Jơ$ÓÆăˆŸ;È̉ }éÚÿÚͺ߈¥Ø¿‰ÓºóÇù×¥Û߈‹ÜúÙƠĂĂ”{“Ơ©‡¥2ßëMơ»¾«‡“Íj‡Œ«‡“Íj߈3öö¡È£Ø‰-ƒQ߈ÅÓ¡Ô¥ˆ]1Ü›¾±»ï½ÅÏÅïçÏÅ•ŒóÇ«‡“Íj»ØÙ½Ïù×Û×»»Å–Óº™‰kß [ïS±»œ‰¾I³ÆöÁÏÔ߈ëö߈ÏPù×·ÅײëÚ¶Åä×Û×Ç«‡“Íjƒv»‡ÅÓ™‰kß [ïSù×9¥‡ĂÉß»û˜êèä…ÚÏÔô¹³…à箫‡“ÍjÀƯÅØÛºÙŒë*«Ÿ¾‹Ù¸Ú ·§D ƒÖ¡ÛÙÁßߟé‰ñ5ñ·è‡·§D ÙÚÙ½‡ÉÜ«ÔÛ«‚ ½9ßëöÖÆ×¿8ù׃Ó÷Ù—ˆ½ôƒÖÚ±»ô¹ÖĂÙÙ½ÁƯ“Û”#ăˆŸ;Ó̉±»™‡ÿ¯¶·‡‘×8癇ÇÖŸ¦“Ơù‡ÁƯ·Ô›Ụ́¶è†ŒÛ«‚ ½9©ÏÄ¿àú(¡Ô­RưÀùׂ×ĂÙÛÄÓ­ÄÇ%ĂÙï»ψ¾8í¤‡íÖVÓ¹Ú¨Çå̉ ÖơÔÓ̉ÆØåÁƠ¸Ú¬ï™ëéåñº)™‰kß [ïSă‘·ù×Ϻ¡Ô߈±»¼Ù×±»ÅÓĂÖÑØ©bï½ó–ÍË)éÛ9¥ĂÈùׇǙÁăˆŸ;¥‹ÛÄÓÜÙÅëƒØñÓÏÅăˆŸ;ÿ¯¶½̉Æ‘÷‡½º½ÏÔ›¶éĂĂ ›­±àéM›¡ÖÔ†6¦jôăˆŸ»ØÉ̉Ó¾½±»ÑÓÈ̉›¶éöﻜ½°»ï½·‡‘×8çùêÈ̉<ưÀÛ«‚ ½9ÏÔ‰Û„Ư«‡“Íjè%ù‡×¾·‡‘×8çơ꤈\0Û÷¾‡º¹Ú½ă»ĂÙçÚïËÇ÷ơÙ½ÏÅäÁ¯×óÇÓÆǼëö›¹³ăˆŸ;“Ơ˜È×Ă™ÓÏÔ—¶Ëß‹ÙûÓÛÆ›¾ĂÙÙÚ½‹Ù±¿߈§(ƯÓ ÷ÁÛÄÓÿ‡«ÑË̉ăâ±»Ï̉£Øø¿ÓíÍÛăˆŸ;Û«‚ ½9©Ü±»­ÄÆ̉µÛ«‚ ½9ù×ä̉ăˆŸ;ÏÔ—¶8¤‡ÖăơרÏÔưÀÉ^éêÂÙ“‹­–ăˆŸª‡’̀j¾¹»ưÀÏÅ»ËĐƒv™‰kß [ïSñíÈÅØªÔ ù׸!ëöù×ÅßϹÛ«‚ ½9îéÛêÙÚù¿©ƠµßƯºơháÙƒvªÚ Ơ±»µØÿ·ØË%Û«‚ ½9Åÿ¯¶ơêÏÅÀ½-ƒṽˆù¾ÏÔ÷ÁĂÙ³ºóÏÔ“Æăà߈°»ÓÅ«»ßÚùêщ߈‹ß:߈µØ¡ÔÇØ¾º߈ƒ‘¥ÿÚ饯ÏÔ±»߈ñÓ9¥‡ÏÄĂÙÿ¯¶¥ˆ]1¹Ú9¥‡ñǃvÑÓëöÅÓÙ½½ëö‡Œ½ä̉BBĂ›v½ÏÔưÀƺÛ«‚ ½9°»߈ؽ«‡“Íjø×ÅĉÁÄ–°¿ï»ív·ÔÙÚÿ¯¶ÏĹ€Ǽ¹ÚƒvÖÆù×ÛºƠ¾G“¹ƯN¯Èăơ©Ơß»ûÛ«‚ ½9Ù̉íê±Ô½ÓÅ‡î“Æ½›¾Û«‚ ½9—ˆùêÙ½¼Ô³¹§̉ÙÚÀ¹ù×÷ˆÛº±»¡ÛÖØ ÛÄÓ‡ŒµØÛ«‚ ½9©‡¥2ßëMù×ăƠÅÔŸ§ỗˆÙן}»½˜?È?¼‹ÇÅÓ…£­µØỞů‰¯0›¸¯È«Ô«‡“Íj£ÈÙÚ«»ƯÔ߈ëöÛ«‚ ½9­Â­ÄÏÅöëö¾±»ïÁ¿ÅÙ×Û«‚ ½9ùÚ匿N¢ ˜‰j̃ZîSŸ}£ØóÂ߈ÙƠơÔׯï³2÷ÖóÔ8¤‡×—¶ÏůƠ‰Á×Ơ½ËجÄÛ×™‰kß [ïS½ô÷Á½|“Èׯå̉ ·Å²‹ÇÛ«‚ ½9½ƒˆ₫®¶•‹HÚª‚ +¼9ÏÔĂƠơêăˆŸ;÷Áù×Û«‚ ½9­Ä±»ÿ©‡¥2ßëM…àÓØ™‰kß [ïSĂÙù×ăà±»½å̉ »Óó#½Ô¢Ô“Ç¿‰ÅÔ±¿—¿ÙË9¥‡×Ûº·‡‘×8ç»ØñÓçô­Ù‹È…ƠÑÄëù×ÙÚăˆŸ;kĂÙæ'Å™ëé册ソًÏÏڃ؉½¿™‰kß [ïS‡º™‰kß [ïS“È«»¬ÖÍÄù×ÏÄăˆŸ‡Œ³ºóƠ‰¿ÔÙŒë*«¡Û½ô«Ô¹Ú“¹ƯN•‹ÇÏԵؑ(µØëö§ôƯÓ ÷ÚÇ“ƠÁËÉ9Áð½±»­ä±¿ÅÎŽëöñÚ߈ỞÛ«‚ ½9µô†äù×ăˆŸ«²‡ŒỞ¶‹߈ƠÛ«‚ ½9êÓËÇù×ÚÆï̉ù×—óĂß¹Úơê•Èû›±»¥Öäןšԉ¿Iùơó¿ôéÓÂ߈ÙÅëºØ  ½Ôéê±%¹Úó‡ÇßÄÙưÚÛ×·Ô­Öÿ×½¾‡«dăˆŸ;¾ñ½§ôôĂ¥@ÓºưÀ«‡“Íj§ÔưÀÂ9¥‡™‰kß [ïS̀B±»½›¡߈ÏԥƸ£«‡“ÍjĂ«‡“Íj·‡‘×8çóǃṿ¶ăˆŸ˜Ă«‡“Íjơê·‡‘×8ç³¹ÚÏ̉©‡¥2ßëMµØóƙԣäëöƒ¾‘׳ƙ‰kß [ïSÍB£äÿ×°‡¯¾©ÓƠÔºl÷Á©Ó›Û9¥‡÷ÁóÓ¡ƯËӻẕ%Á˜‰j̃ZîS¼ă½ÇÓŽ±»ÅÿÚÙÚÍÓÏÔñÁÏÔ™‰kß [ïS·Ô¡É9¥‡ßÖÁƯ§Ô¬Ö×ÚÛ«‚ ½9ơ½Ô¿ù‰»Û«‚ ½9Ù̉ëÚµØăà8¤‡¡ÛºÈÿ¯¶Ă™‰kß [ïSŽÓ¾ƒˆ̃ˆJ³(߈¹ÚíѦô ¿‰°»‹Ç©‰ÏÔÙ½ׯŸÅÆÓ¼8¤‡ÖçºÙ½±»ÁÚ¡ƯÎÅ ăˆŸ;ÑĂ£ä±»F¼¹…Ü«»™‰kß [ïSÿ¯¶‘ +«‡“Íj±ÔÛ«‚ ½9Ûׯ¼÷ÏÔÇÖÇÖ«‡“Íj·‡‘×8ç±»Ù½ÇĂơù×­½¼÷ÚåĂÓ¼­Ö±¿χ¹Ú¡ÇÏÅÏԻاÔơễ½ +ù׃vƠëöăÇíĂôÄÔ˜‰j̃ZîSÇÖù×é‡äÁ·‡‘×8çÛ½Ơƒv™‰kß [ïS«‡“ÍjóÄ«‡“Íj½ùסÈƠX8#¤‡#Ö©ØĂĂ3¥ ÛÀ́êôØ™‰kß [ïS½œÂ³ƠÇ»å̉ ·̣ơÔóÂăˆŸ;Û«‚ ½9¹ÍƠå̉ ÙÚëö‡¼ö½ÎÔËÉ9¨ºÏÔĂÙ·Ü¡“×ÓºÓÅăˆŸĂ¼¬¾ÛÅø×óĂ“ÆɹÖóˆăˆŸÅÇÖ±»«ÔåÉẲ«Ô߈—¶ÇÖæÚơêăˆŸ;9¥‡Ở«&ƠÚ±»íÁÿÛ·‡‘×8烾‘ƒ×½¾«‡“Íj¯rÍ£Ư˜‡ăˆŸ“½«»íÖ߈µØÎ«Ôï½Ån‹Û¥¾߈·Ôå̉ ŹÚĐÓï»Û«‚ ½9ƠĂÙÏ»«&öƯÂ$۵ؽ€ĂÙ̉̉ +ÍƠƒÔ™Áù×Ï̉½Ă™‰kß [ïSÜӵыÇÉ¿IÅÔÏᛝ¼Ơ¸Á—¶ª»·Ô«Ôá걿9¥‡™‰kß [ïSỔ¡Ô箺½ ĐÓÚÀÏÔ½—Œ½Ô—¶ÑĂÅôÏÔ9¥‡ăˆŸ;áÏÓü¦†Úª‚ +¼9ùׇ۩&ÁƯÅØ Á¿»ï½½ØÛ«‚ ½9߈̃ŒÚ,½÷¶™Á³Âß́ÿ¼¯¼‰¿IÈ#ÑÄëö‡ÇÛ«‚ ½9‡ŒÉ»·ÜÛ«‚ ½9ŽóÔÉö¯È߈߈Û«‚ ½9¿ØôÄ«dßÄÙívçڷܽ¯¼ù×ö—˜Ó´æÙĂª‡’̀j¿ºóÇÍùÿ¯¶ơÔµØÇå̉ 8¤‡¾ßĂÙ¹Ú¾ƒv½ưˆÉĂ«‡“ÍjÅØ·Å°¿Å–¿×ßÄÙ¹Úå»ù×ĺ÷ÙÏÔăˆŸ¹Úƒ¾‘ÙÚ¢ 4¡Ư«‡“ÍjăˆŸưÀùêơÔôçÚ₫Ç•)ƒvùׇº«‡“ÍjÓëă¹Úù×½¿ốÁÛÀƒÊ¿߈¿ưÀÙ½‡Ù ù×ăˆŸ;˜êèäÿ×±»ÁƯÁÏÅÏÔưÀÏÔ™‰kß [ïSÍÂÏ̉ÅÄׯ‡ºù¿¤ˆ\0‹Ç‡xø×É̉Á̉ơÔ•Ú™ÔÙÜ—ˆË¿ơôÏÔƒ½™‡ÅÓ—¶²¾ƒ¾‘8¤‡ưÀ½̃ˆ‘Æ—¶ÿڃؽ€§ÆÙ½ç4éÀ£äÁƯÙÚ§ôÇÜ‘ÛđÁÙ¿è%ƒvƠºmôºĂÙ½|ÏÅËÉ9ƒvÏÔÍÓ‡çăˆŸ;µØÅ™ôóÇù×§ÓÑÓ¿Å¥ÓƒvƒÛ«‚ ½9ăˆŸ™‡§Ô¶è£ØƒˆÑĂÿÚ—»«‡“ÍjÁ‡é/×:íÖщ½ƒv߈ÏÅívưÀăˆŸ;—¶™̀›¶éĂÙ½₫¼ĂºùêƠßƯƯµÜƯÓ ·‡‘×8çívÅôăơ߈—¶ÍÇÄÓ ưÀç×¾Û«‚ ½9›¾™‰kß [ïS›¶é듽ܘ‡«‡“ÍjÛ«‚ ½9Ѷû(ăˆŸ;½ĂÙáÛ«‡“ÍjØÚר¡ÔÛ«‚ ½9ù×ﻇ“¹®ŸÅđÓÿ$¡Û›¾ÓØ¿»ÏÔÏÄåÁ…؃vù×É÷Á±»™‰kß [ïSÏÔĂÓé‰ñ5ñ·ª‡’̀j÷Áëé«d¿¹˜‰j̃ZîS߈çôÅØÏijÈ8¤‡éêÛ«‚ ½9¯ÍÓĂÈÙ½đÖÙ½ƒvíơƒvƒØ•Œùט‰j̃ZîS±»ơÔĂÙÁ߈™‡ĐÓ∹ƠÅØ½È™‰kß [ïSÙ½‹Ç«‡“Íj­ØƠ%óƒÏ̉ÍË)éÛ9¥ëöÛº¬¿ …ƠÙ׃v8¤‡÷‡‡Ú¹̃Í̃çÚÅà™ÁÙ½̃ˆ¹½²Èó¶Ǿ»$à̉»ˆŸÈôº̀Ç™ôƯÓ ººÿÚƒÖçÚ¥ˆ]1™ëéåº Ö†‡ü2ơêºù×¹Ú·ÅÛ×±»ˆ«‡“Íj©‡¥2ßëM˜‰j̃ZîSù×ư»Å‡ÛÁƯÄÏ̉¤‰̀L„§Ô™‰kß [ïSÓÅÛ«‚ ½9ó"†ÚÓå̉ Í­HÓØç½߈½½ñÓ¼ÍÇÿ¯¶Â¡ÁĂô¹Úùæ§ÆÏ̉ÿÚ·Åß̃ù×å̉ Û«‚ ½9Ûº¹Ú·§D ăˆŸª»½9¥‡Á|áƠùׯ×߈£Ø­áÜß»ûé‡çÚ߈߈­ÔƒØ·§D Ă«‡“ÍjÁ½ăˆŸ;ï»ßÚϺÛ«‚ ½9ÏÔû(ƒv釹Á·‡‘×8çăÇí±»™‰kß [ïSï̉‡€ëÏÅÙ½ƒÓ¼¼ÛÔóǃv›¾±»ƠÅăˆŸ™ÛŸ½÷Á“È·ÔÙÅë÷ÚémÛ«‚ ½9ăˆŸ;­¿»éÓ9¥‡ÿÚ‘±ƒvƒ«·3uU¶ưÀ«‡“Íj¡»«Ó¡ÛĐÓëö¸£ï½¡̉½·ÔÓÆưÀĂÙ«‡“Íjƒv‡ø½¬Ô•ơêÛ«‚ ½9×ƠÓØ9¥‡ăˆŸ;ñÆù×™‰kß [ïSĐÓÛ×™ôñÖ™‰kß [ïSëöÏÅÏŽ€‰ÛµØÙŒë*«ív§ôËÉ9ïçù×Ù½ÑÓêÖ×¥₫®¶ăˆŸÑ·é‰ñ5ñ·ÿÚ›¾ưÀ—¶Û߈•½ÑÄëơö߈ß»ûûƠưÀ퇢Ǚ‡üÁªÚĂ¼±»¢X·ôĐÄêÇ»ÏÔ¨‡¤2€̃êLªÔ±»·Å™‰kß [ïS‡×µØí‡¿ºƒÔË̉ÏŬ¿±»™‰kß [ïSëö½Ñ·½àÁ¹¶ +è +ÙÚÛÄÓíê¯G‹øá×€º­ÔÉĂÏÔÛ«‚ ½9©ÇƒÖ×Ăù×û «‡“Íjö™‰kß [ïSÏÔ‡ơèÅ›¾Úºå»ù×ÁƒvăơëöƠơÔ¡ÈöƯºåÁùש‡¥2ßëMÅô†ŒăˆŸ½ĐÓ¶¦DÑ Ñ½ơèÅ߈ÙÚ“¡Ù½“Ơå̉ ÷‡™‰kß [ïS¿ÅŇÇù×ÅúÙ×Û«‚ ½9ĐDâ¼Ư ›v«‡“ÍjÛºÍÓ›¾«‡“ÍjÇËܱ»߈éê߈†“óÂÀË ÔX‘¾¶ÅÈ,½Á¹çmưÀ‡ŒÇßô™‰kß [ïSä̉Ä–Ù½±»ù×­½¼ÿ'‰Ơ× ¥ÓŸ}Úº™‰kß [ïS—¶óǩܗ¶¡Ç«‡“Íj‹ÇÛ«‚ ½9÷ÀăˆŸ;kؽ™‰kß [ïSÄÓù×ơêùê†(çÚÙÚöàçĂĂ ›­±àéMñÓ«‡“Íj½™‰kß [ïS«Ô߈˜‰j̃ZîSù×±»ÙÚÏÔÛ«‚ ½9º‹ÜÏÔơÔ”‹œHßÄÙăˆŸ;ÿÚ˜‡§½©ØäÁ“ƠỔóDZ»ß„—ÛăˆŸ;¡ÈẨÆ¿±»ÑØ[™ÁÙ½¤Ó·Ó ¥0±»‡ÅÔ‚vÛ«‚ ½9“ƠîÚ»³Ù½Ϻщ«Ô߈ÇÖß»ûĂºµØÑÓ»½ÛÀ߈ñ~öÁß„ÏÔ«‡“Íj»$³(¹ÚëÚ÷Á÷ˆĂÙơê÷Ù»Ó™‰kß [ïSÙŒë*«Ở߈ưÀëÔ³ØßÆ•ƯǺ¾ƒ¾‘ÇÖÑÅÁĂÏÔÙ×ëÓ9¥‡ÇÖ·ôÿÚ‚vơĂÇĂ«·3uU¯1›¾å»‹È‰»߈‡xß»ûé‡ÍĂ›¾ïÅơèÅÅÓá «ÑƯÚăˆŸ;…nµ½«‡“ÍjưÀ·‡‘×8ççûôĂơêöëÓ–ÓŸĐ±»ËÛù×Óµ•%öåײª‡’̀jăˆŸ;щ»ôƒvÓÅ«‡“ÍjÅ»§ô߈«‡“Íjϼ«‡“Íj®éÅÅáê¼Èø«‡“ÍjÁƯ麹¾º½÷ÁƒˆÙ½߈©¼Ûºê§Í¤ÓÆĂ©ØËÓ§ÖĂÙ½ô©Ơ߈ÏԪڲǶŋÇÛ«‚ ½9ÏÔưÀG½¹¹Ú±Á™‰kß [ïS³Âåná“Ơ°»ÓÆ“áƠÇéôÏëö‹°éº«‡“ÍjÏÔÛ«‚ ½9™‡ơêÏÄñÓŸ}ñÔöƯ+8¤‡¿‰ù×½Ô‰ơ¿‰»½‚vëöÁZ§~‡ä©¼9¥‡åÁ·Åù×›ÔÇÖƠ¾G±»½Û́º“È¿‰“¹ÜN½ù×Ûº™»ÿ¯¶å¡¹‡ơê±»½Ï̉½£ŒƒvÛ«‚ ½9—¶ơÔ›¶é£Ç߈¯È·ÅưÀ¶ÔÛ«‚ ½9ß»ûŸÈ›Â‹Üù×êöô¾êÓ÷¶ăˆŸ;߈£ÈåÆ̃ÚÏÄÏÅưÀ‡Ç±»±»ƒÖ«·3uUåĂÁ˱ÁăˆŸ;kϺÏÅçÚÛ«‚ ½9©Ø¹àû•ŒĂ½¥ÆéJé‰Ó5“gesÁÅÚº­ôá=•u¹Ú»Ø÷‡ÙÚöáöù×½ñÓív©‡¥2ßëM‹Ó±»µØ½‹Ç¿²âà¡ÈÍË)éÛ9¥ÅÔùו֫‡“ÍjêöăˆŸ;‰¿Iéºä̉™‰kß [ïS₫ÿ)ׯƠщ™‰kß [ïSơĂ«‡“ÍjχơêµØ»ØÙÚ¼¹Ú9¥‡ï½ºø×‡ºǼ߈ç½®Gø¹ÚùסԱ»ëööç°Û«‚ ½9½€¿…›¾‹ºÖÆ™‰kß [ïSÙ½™‰kß [ïSû'ƯÚ¥‰ÍL…ù×½ĂÙÿ§8¤‡ÏÅ»ÚøêƠÁĂºù×œĂ³È߈‹ÈŸÈÏ«å¸È—¶̃»ú­Ä¡Ỗ¹ƠßÖïi›¶éƒ±¿ăˆŸ;kƒv÷ÁÙ½‡ŒơêĂÙÿ¯¶Ÿóe÷Ùå̉ ÑÄëûëöáđ‡ºÏ̉³à˜êèäÍÇÏÔơêÙ½÷Î̉Ï+Ù½ưÀÛÇßÄ߈ÓÓàˆÀ0p‹É0Ï̉Á‡é/×:›¾ͼɇă߃½ƯÓ îÅÏÔƒˆ́véÓÏ̉Ö¾Ç̉öàÍË)éÛ9¥ơÔ¿‰«»Û«‚ ½9•Üô™ÔưÀív§Ôó#©ă·‡‘×8çÓÅ¿‰çÚĂÎơÔÍÄơÔ‰ơ£ ËÇÜßѶ±»ߌÛ,©‡¥2ßëM߈ù+ˆÁ¼øô +ñÄ̀¼ë¾Ç"ÏÔïä‡ «âù×ÓØ«‡“Íj“ÈÔơ·¼Í7çÚ÷ÚĂÈƠÏß›¾·‡‘×8çÙ̉ù׈ơ¡hù×÷‡›¹§ôºÛ×­»Åر»ù×Û«‚ ½9çÚĂôăˆŸ;kµØ‹Ç‘÷Í— ÈÛÀù×ÍË)éÛ9¥Ẳư‡±ù1›¾ÙŒë*«™‰kß [ïSÁĂ›Úæ̉Ç»“Û«‚ ½9±»Â±ëØå̉ ´†ÑÓ½ô«‡“ÍjÖÆÅàÏ؉j̃ZîS‹Ù¹¶¹Úè¾ÏÄÏæÛ„’¹ÜN‡Ú«‡“ÍjÍƠ˜à¿ô°»gù×½ëƠY™‰kß [ïS›¾†Ú¿Åå̉ ŸÈ™‰kß [ïS¹—‰¿IƒóóÇưÀµØù×߈ùêñÖ³/Û×÷ÁƠ™¾ÙŒë*«‡Û™‰kß [ïSÑÓµØ8 +¤‡ +×ẳßÁ₫ ®¶ „¥Âơê›ÚÏÅÅÔëö̉º‘́×¾ÛÀÀH±»›¾«·3uUưˆæ¿»›¾÷ÚƠăàш‹Ç“ÆÅÄù×ưÀÇ÷Û«‚ ½9ƒÖ£ÇË%߈ƒˆ́vùê¡óÛ׫ڥ₫ÏÅö‡̃ˆ·‡‘×8ç¿Åʹ™‰kß [ïSƒˆÑØù¿‡àê ÛÄÓ̃ÁưÓºëöÏ«Ôö‡ºơêʹăˆŸ;çØ“ºñÓ“Æàêó®ñƒÖ½€ÅÓ˹ƒ¾‘¼8¤‡ÔÏĹÚù¿±¿ƒè· Ù½—¶¨Ø½€½Ă¡È©Ø™‰kß [ïSè‰đ5đ¶₫ÂଡƠ­¾ÏÅ‹ÜíÆ±»¯ôψ°»߈ßçׯĂ‘«ù׉¿IÇÖơêùÚ́Å µØù×ÿÚg±»9¥‡×Ó̉Ï™‹̃„çíƒv½³Æ»½ăˆŸ;ñÓ‹Ù«âó̃ó|¡ÇÏ̉ëöç̉³Ơ¡ÈƒˆéºÏÔÍÓơê‹Ó½÷ˆ†Œ§Ô½ô£Ø™‰kß [ïS¥Ö™‰kß [ïS˜‡ƒˆ %ÿÚƠ…Ó½ù×ÖÆẲ© Íß«Ôù×±½ÂÙ9¥‡÷‡»±»ø×Á½Ở°»߈p›¾ׯ«Ô½çĐ™ëéå¶è”§‡“Ÿß¿¹ÏÅ—Óƒ×ù׫»ÿ¯¶ƯÀ¿ÅñÓÁă¡Á‡©‡¥2ßëMÚÚ‚ØÏ̉ưÀ£äơÔÏÔ߈±»Ù×¶Ô™‰kß [ïSăˆŸ;Ù½Ù̉°»Ë¿¹¶Á̉ƒê¾ ƠÑÓù׋Á˜Á“Ƚ½®Èø×áØử»‡̀ƯÈù׫—ßÖåĂôÔ·ˆ±»™‡óÔơêψơêÏÅ¡Ôívù׉Ûù׫‡“ÍjçڅćºÛ«‚ ½9¨¼¿‡“½™‡‡«‡“ÍjåÇÇÑÅù×€Ơ…ôƯÓ ߈Û×ÉÖïđëöÙÚ§ÔßÚóÇŽù×½ăˆŸ;Ù½á̀¡ÔÁ¿ÔËÉ9ĂÙƠÄÿ¯¶Ï̉ù×ù×ïÙÜ¿º·ÔÓº›¡¿ôû̉Ở¡ÈÛ«‚ ½9¾ÁƯ‘÷©¼߈ÍÓ½$Ï̉íJ½€ÄÔÏÅ«»Û«‚ ½9›¾߈ר÷‡©ÜÁ½ÙŒë*«₫™ĐÄêĂÈƠƯºï½Ç»‡º™ơ•Èû›µ†̃ˆ±»ưÀăê·ÔµØ±»—ˆ«‡“ÍjëöÿÛË%ÈĂ߈ö›¹±»æ̉Å¥÷ÁÏÅƠ±»ÏÔÛ«‚ ½9ÏÅר¸ÚçmÚª‚ +¼9¼Ë̉çÚÁƯµØ‹ÜñÖ×ƠñÓ‘ơÁ̉Û«‚ ½9ĂÙ³màñÓ™ÁœÁ“¹ƯN›¶éÓº™‡«‡“Íj“º¬¾Ù̉߈©Ó×¾¿Ø«Ô¼Á‰ÆïÅ«‡“Íjëö‹Ç¸ÚăˆŸ;‰¿IϺ¯¾£ÇÛ«‚ ½9ËƠùס¼̃ŒÚ,ϺñÓÿÛÁÍĂ‘́ù×±µöăˆŸÙY«Nÿ¯¶»Å·Ô%ơšۧÔå̉ ăˆŸí—G‹ÇÛÄÓù×¶èÓÔËdz9¥‡€¾ëϼ£äáÁívÂÈë™H¿‰ÍӃ须Ơơ±½«ÛÍÓÛ×ÛÀ›¶éÏŜ ñÓׯÓºª»£»‡½ר—ˆº¹Ú¿ô߈8¤‡ß»û±»·Û™‰kß [ïS±½½¿ÅÏÅåZø×ÓØÅØùö‡ºÏÔáĂĂÙÛºçÚÛ«‚ ½9•ÇÚª‚ +¼9ÏÔ™‰kß [ïS‡×±½¹ÚÚª‚ +¼9׾뺱»·ºÇØẲù×®Gøöê•Ú÷Á—غ‹ÜÏÅăˆŸ߈èêù×ÑÓÚ×±½±»÷ÁƒvËÉ9ơÔ™‰kß [ïSÙÅë}Ñ×竘êèäÇØ–»ù×Á̉ÿ¯¶Ë̉«¼óĂƒà‡Œ©¼ơêËƠăˆŸ;kµaº½€¿Ï“±»I÷Ú™ëéåÚß»ûùꩇ¥2ßëMéêù×©à™»‹Û™‡ÍË)éÛ9¥öÁ˪¿»ƒăˆŸ;›¾±”™‰kß [ïS‡ñ5ĂÙá ™Ô߈íÖ›Û›¶éÏÅƯº“¹ƯNăˆŸñ¤©‡¥2ßëMÁS‹Ùçô‹ÇÏÔÛ«‚ ½9ĐÓơÔº½˹ÅÓåĂÿÚÁƯ½ÔÛ́½ÅӼ‡“ÍjÏÄÏÅơĂ³íÛ«‚ ½9­—Û«‚ ½9‹Ü§ÓµØÛ«‚ ½9±»Ûºï½ÎÔ·Ó ¥09¥‡×Ă˱¸Úó^ÿÚÆØÆ̉áÛÉĂÏŵsÙÜÙÚ•Ơ¾G©ØÂ™‰kß [ïSƒ¾‘«‡“ÍjÙÚ½ÍË)éÛ9¥™Ó߈ƒ¾‘—¶9¥‡ÑÅĂ™‰kß [ïS½“Ơ‡›¾“Ơ™Ô§ƠœƠ™‰kß [ïSƒvưÀ›¾›¶é±»±»±»ăˆŸ;É¿ăˆŸÙ-ƠÛºĂÙÑÅ™‡£Xăư¹Ú¹ÚƠX¿‰ÙÚ‹Ç“ƠŽ¥ˆ]1ß9¥‡×¡ÈµØߌÛ,ßÏÉ̉±)ơêû(ÏÔ—»©‡¥2ßëMÇù×Ơ£Ø«ÔÑØù×̃ˆ°» ™ëéåßÄٲƙ‰kß [ïSÓØ߈ôøă9¥‡×½ψÏ̉Û«‚ ½9ï‡á ÅØöÁï½߈ÙŒë*«­ƯÚ ª ‚  + ¼9 ëÔ߈‡Œ™‡ĂĂÙ™‰kß [ïS¾‡Œ¬Öơ…›¾ĂÙơèŇÚ߈­˜ÛƠÔ³ƒ½×¾8÷ÁϹ›¾ä̉̃ˆŽ·̣ơÔơÔÛ«‚ ½9¤¾…Ûëöăơ¥bÇÓË ÍÓª» —»ÓÅ˹«‡“Íjߨ߈˜‰j̃ZîSưÀ½ô¹âƯơÏÅ¡Ô¡ăˆŸ߈®GøÙÚ—§Í»‹Ó‡Û¡Ô‹Ç¾(ëÚœ‰¾IµØïƠ9¥‡Á½”ƒˆ÷Á±»±»ÏÅÙÚáê§Ôºyù×…ôÛÄÓÙ½ưÀ¿Œ›¾¹Ú“Ƙ‡§›™‰kß [ïS¼Z¡Û£»øæ +ÁË%“ÈÍ¡ƒvĂȹ°»½¾±»ÈËF«”éJé‰Ó5“gesÁÅĂƠÛ«‚ ½9º߈ƠXëÄÁƯ«ÔßƯ“Ơɼ¾8¤‡ơêá=á=ß„ùê…¾Û«‚ ½9¿Åß»û¾ßï»Û«‚ ½9û(ăˆŸ;±Üù×»½ưÀ«»™‡ù×Ö₫±»ǺÛ«‚ ½9å•î±»ưÀĂÙ́vŸ¾‹Ù¥‰ÍL…½±ºçĂÙÛ׳ÂÿÚÛ«‚ ½9ÛÀÀĂăˆŸ;½“½öëö釽ëÛÄÓîæÔ £ä8¤‡öÁ£‡ƒvñÔưÀ©Ú™‰kß [ïSỞ«°“ßÇè8¤‡áê¡Ͼ¥Où׿Å߈ƒˆ›¾èÔ“…£»ÀĂ߈çÚß»ûôꃈ½€ƯÓ ˜Û±»§ÆñÚß»û…Øß»û‚ˆÛ«‚ ½9ívùëơèŧӪԳÂÙó”%Ù̉“Ơ}ÿ¯¶Ú×ÙÚ¹ÚưÀ½àº»·ÜÙÚăàÙÚ™‰kß [ïS²ÂßÄÙ‹Ó·‡‘×8çä̉Úª‚ +¼9߈±»5߈™‡ÏÅ߈º£XĂÙ߈ÿ&­¶›¡Å‰¿I™ª¶2tTÙ½Á¹߈™‰kß [ïSŸ}•{‡äø×ăˆŸÂÙ åƠÑØ½Á¼³Â½­=«‡“Íj߈ívÚª‚ +¼9§¹íêá©ÓûƠĐÄê—¶·ÅÎŽ™‰kß [ïSơÔ÷ƒ9¥‡ëöÙן©ù×׿8̉ºơ‡™‰kß [ïS›¾ù×“ĂºƠÄñ–¯¾ù×Ë¿¼¨È̉ŸÈ·Ô™‰kß [ïSƒë“ÇăˆŸ;íÓ‡™ÛÛ«‚ ½9ù×ơểů‰¯0›¶éå̉ ¡ØëööÁ›¾ëö×Ó£‡·Ô£»œ·̉ ¤0é‡çÚœ‡×Ơ†7§j¡ÔưÀáê­ÄùêèêƒvÚÆªÚׯÁÓ˜Á̃ˆëö´a½ÏÔù×é‰ñ5ñ·ù×Û«‚ ½9ăˆŸß%—¶ÛºĂ«âưÀå̉ ơØ߈÷Ô¶ºăˆŸØÓó„ءÁ÷?ÁƯ߈÷Ú•ưÀƯºÎÄ@ù¿µØÿÚÙ-¸ÚÆ9¥‡ÿÇöĂÄÜÛ«‚ ½9›Ú«‡“Íj«·3uUµ‰°¿Ô«‡“Íjø×ÙܡȤˆ\0ëö«‡“ÍjƒvơêăˆŸ…n[Úª‚ +¼9ÊÈ9™ëéåÙÚù×ÅÁƯºÛ«‚ ½9ơê½€œÁ ¹ÚáëöÍÛ«‚ ½9ªÚ›¶éơèÅñ»ר“Ơù׳ÁÍÓÛĂÙ߈º½‚v*›¹ïÁƒ×™Ô—¶×Ü¿ÿÚÙÚÏÔñÓéó½ù¾—¶ĂÙđÓ‡¿ƒØÏŇŒ«‡“ÍjÓÅ9¥‡¡¢‡ŸÖÅØëç¡ƯψñÚ™‡§Æ·‡‘×8ç›vçÚüñX° ØÓå̉ Û«‚ ½9·Øù×ăˆŸ;ÙÚ¶ƯÚñÓ±»›¾ÓÅ«‡“Íj¨Ç߈½ÍË)éÛ9¥±»¿»ñÆùêóÂÚª‚ +¼9›¾ăˆŸ;kù×öÛ«‚ ½9߈«·3uUá Ở‹ÓơÔÙ½ÏÔ©-ëö±»£ä±Ôøê•ûÛ׳ÈưÀÆôôơê±»ç~ù×öÅ¿Øß»ûÿ‹ÜÛơÔưÀØ•½£Ư›ÛÖ¼—jÇÖ Û¯Ơ¡qù×ƠX÷Úëö9¥‡ñÓÏÅÎÔÁ½Ö ÓÅ€ºÙŒë*«¡Û™ÁăˆŸ÷ÁƯ‰¾Ï̉ÏÅ™‰kß [ïS߈ϧԀĹÚáöÁƯĐØ«·3uUÏÔơĂ߈ƠÙÚñÓµêÏ̉ÏÔö…ŒáØö¹ÚÁÏĶÅÏÔϺăˆŸ;ăˆŸ;kư“±»Ă±»“È‹Û·Ó ¥0ÛçÚă‘·„Ö±»÷‡É§Ó«‡“Íjñس½ăˆŸ;¾…Û9¥‡×ÑÓ‹ÇÎå̉ źÛÀóÔ…ØåĂ©¼ÙÚÅ»¼·Ô©Ơ­¾Úª‚ +¼9ƒøËÖ–¾÷Á¥ˆ]1»ĂÏÔºÁ߈ö·Ô›¾ÍÓå̉ 9¥‡×ÏÄ×Ô«‡“ÍjơĂÅØÚÀùב«óÎÏÔåð»ăˆŸ;ç̉¿‰ɇơÙù×™‰kß [ïSá ¤ˆ \ 0 §ùêƯơßÿÿ¯¶±»ăˆŸÑÄëÙƠ½ù×ÑÓùêÛ×…̃ÏÅ™‰kß [ïS˜êè䯟}ëöù×ö9¥‡±Á«då̉ ăˆŸ;ƒÖÅÀ›çÏÔÛ«‚ ½9©‡¥2ßëMÏÅÙ½½ơĂưÀ9¥‡›¶éæ¶Ôר» ·Ô‹Óơê±»ÅÄ9¥‡«%øêÁ̉±»Å؃Øå×ĂÑÓÏÅ߈뽋«-‘Ó¢߈¸Ú“ÈÛ«‚ ½9ñÓ‰!ẳËÉ9±»ÛÓ$“¹ƯN¡ÁóÇÓàÚª‚ +¼9¡ÏÔ™Ô©Óăà›¹ùëÏÔ¥ÓƯÁ•Èû›«Ñ€ÓµØå»¯Ô‡aÛ½Û«‚ ½9ÏÅÛ«‚ ½9߈½€«‡“ÍjƒÔẩ‹Ÿ߈ăü«‡“ÍjÅïdùד¹ƯNù‡ËÉ9ơêÏÔ‚v±˜ô¦ôÁ¹ƒˆë¼³Û׫‡“ÍjôêÏPÍË)éÛ9¥›¶éßÚÿ©ºɇ߈Ở÷ÚàØ¿Å‡ŒăˆŸ;kßÁ9¥‡³à™Ă󮪇’̀jç»ÏÅÍĂ—¶™‰kß [ïSơƯÁר‡¤2€̃êLYó—»Ù½Û«‚ ½9å̉ ưÀÑÅËÉ9Ï̉ăˆŸ;˜‰j̃ZîS¡ÈíJ™‰kß [ïSÀ½©Ø£»›¹œ‰¾IÀ¹å̉ ÏԹ؉¿IéÓƠXÙÚ‡º˜‰j̃ZîS§×ĂÙù×ï½߈¿‰±Áù¾ƒvă»ˆÏÅưˆëöƯơ9¥‡ƒˆ9¥‡½êöô™ù×ß½ºÁ¿‰›¾÷Á›¾éÓçÚ¿Å­ÖÖ!Ô†!6!¦j!“ÛÍÄóĂ9¥‡­Øï½•óëÔù×ÄÙ½Á‡é/×:ÅÓ±¿ưÀ²̣ƯÓ ™Ô¿Å¸Ç£Ø»Øív½Ă·ÔßÚóË̉Û«‚ ½9ưÀ9¥‡ÓØáÛ‡­ØĂÓÛ«‚ ½9ÙÚ9¥‡Û«‚ ½9¬Ö ơÔÚêăે“Íj‡$±»™‰kß [ïSÊƠÏÔëọ̈DZ»íÙ§ôơêáÛ‡±»ƒˆĂºƒv™×߈ɇ·ØÄÅÔ«‡“ÍjׯÏÄûØüÁÛ×ƠëäÅ»“ÇñÓ Û̀ÉỞ—¶çmôÏÔÏŽ‡Ú¿́½€ƒvÏÔÍË)éÛ9¥ƒÖ‡º½ôG½¹áèưÀ¡Ô¾ù×ăÛÚª‚ +¼9ッÈóǵaŸÖ³Æ«‡“Íj¡ƠÏÔü‡°ø1áÑ·«‡“Íj†×‹ÇĂ·Ø•ºÛ«‚ ½9‡ÙÅë£ØçÚ¬Ö ÔơƠXăˆŸ;êơ§‡ëöÇ«‡“Íj÷¼½Ă¯Û’‰2Ô,øÀ‡€è/Ö:̃½çÚƯƠ¨¼¥ØáƠù¾ƒØƠÅ…ƠÙÅëûƯơ«Ô߈ÙÚ‡ºÇ֢䷇‘×8çﻡÇÍÓù×Ơ×çƒv±»ăˆŸ;•{­vÛ«‚ ½9©‡¥2ßëMºù¿©Ơ³ô¦Ơ ¬ÄÚª‚ +¼9ºïÚ…ƠóÇ™‡»‡¿ßÏŽëßq߈‹ÇƒØ‹Ç±Ü‚v½°»Ù½øê”÷ÚÛ«‚ ½9›¶éÛºϧ¯¼á$ơêÛ«‚ ½9ûØĂèñÆÿ¯¶Ï­Ä°»û¼ÿ¯¶³ØÛÄÓϹ¼¯‰¯0ăˆŸ;¿́÷Áơê“ÛÚª‚ +¼9ƒv¶ˆƒv½ĐÓƒv·¼Í7ơ»ívăˆŸ;ׯ²È«ÚÛˆ‰Ôû³Æ‚¹½Ù̉«Ô‹ÓßÄÙåø½;«‡“Íj“ƠÄÓÑÄët×§ÔăˆŸ;³ÇơͽÛ«‚ ½9ñíÈó̃ÏÔï½ù×™‰kß [ïSĂÈé‰ñ5ñ·¶Îũء«‡“Íj­v±»¨¼ †Œ£ ëöÍÄ·ÔÛ׃߈ÿ.÷‡¤È½í‡§Ó¹ÍÀĂăÁđÁ ÅÓ¸Ú ÑØĂºÓº›¾•éÓº8¤‡Ö™‰kß [ïS“¾Ïů¨ÿ¯¶ĂÙÛ¹«‡“ÍjăˆŸ;k₫ß½à=ù×Û«‚ ½9ơĂáêÅÔÿÚ©ÈÄÓ§‡¤ÆơÔ¾ơÔ·Ô¹Ú™‰kß [ïSå̉ „àÛ«‚ ½9÷‡ßÖ†º°êØÛ«‚ ½9±Á«‡“Íj½ß»û±ëت‡’̀jÎÔÛ«‚ ½9ÏÔÓº—¶ƒÚív½ß ®߈±»ÏÔ£ ߈ÏÔª‡’̀jỞóÇçÚÁ¹ƠÛ«‚ ½9Û«‚ ½9ƒˆö%³רĐĂÁĂăˆŸÛ«‚ ½9öÁ«‡“Íjÿ§‹ÜưÀÙ½‡x£ çÚׯ¸Ú–¶¡Ô߈ăˆŸ™‰kß [ïSÙ‡Ï9…ăˆŸ;¡È½¥ˆ]1¯G‹ø±»©‡¥2ßëM¬¾Á¼½È߈·‡‘×8çí‡ơêÛÆ½ö‡k±¿°»›¾±»«‡“ÍjñÚÚ×Å»ƒ×ÛÀ‰y×$í‡߈·‡‘×8ç߈·‡‘×8ç«»ù×ßÖ™»ÿ¯¶é½µ†›¶éÛ«‚ ½9µØÛÀ‹ÜÁƯ½€ơêÙ½ŸÈÁ¹÷ÁÁƯ·º©‡¥2ßëMÙÚ˹ƒ÷Á¤Ă•%¡Ô¿ßÓˆ•=‘÷$¯G‹øçÚƒv½™Ôöeùêăºåô‘ëÑĂ¯Û¹̃ù×/Î̉ĂÙ§Ơ£Ç×̉·ÅÑÅ––ëØ§ô«Ô“¹ƯNÛ˜‰j̃ZîS߈Í­HƠÛ«‚ ½9™‰kß [ïSÓ*½ôĂÙ·Ô—»9¥‡«‡“ÍjׯÎÅ™Ó$Û«‚ ½9‡áö«‡“Íj«‡“Íjä̉ˆ“Û—¶ĂÙ«‡“ÍjăˆŸ;kưÀ«‡“Íjχ½÷Á£ä߈ÏŽÏÔ™ăˆŸ£Ư˜‰j̃ZîSĂÓÆơºÏÄëöß¿¹—™‰kß [ïS÷ÁëöĂ¼—¾™‡ĂƠåĂ¼ôö÷Á½Ă¡Á¥¾°»È»Ü9¥‡×9¥‡ƠÍË)éÛ9¥ÑĂ¹Ú·ÔöÿÚÙ½ù×ĂÏÔóÂăˆŸ;ñÓÛÇÏ ăˆŸ;kéÔƠơêÍƠ«‡“Íj›¾Ïޱ»ÏÅÏÔĂÙÍÄÛ«‚ ½9›¾–¦̀»«qÛ×Ư‰ăˆŸ;ÂÓÏÁƯ›¡ׯ½—¶ÇĂÏÅ9¥‡ÉÖÇÓ°»ï½ÏÔăˆŸ;¿́ƒv½ÑÄëÛ«‚ ½9ơÔă»ÂÙƠƠ¢äÛ«‚ ½98¤‡Ö™‰kß [ïSăˆŸ;köÉĂéê…»¥ˆ]1ܳÂÏÔÓÆÍÄιÁ…Û؇Î9„Á «ÑçÚù×Ẩ³ÂƠóg«Ô›ƯçĂºåÁµÁÓԣ؃ÔÚª‚ +¼9ÏÔ¿›¾«ÔĂÏÄï½±»ù×ë½±»µ†·Ô±¿ù×ÏÔƯÚăˆŸăàÏÔÛ«‚ ½9“¢¢ÇÊñ£ØƒwÏÅ·‡‘×8ç߈›·ÔÖ¾Û«‚ ½9ƒ½ÿ¯¶¿ØÏÅ¥6ÄÎÔ‚v£µØă·‡‘×8çíÁăˆŸ;ÜÓ ñÓﻈ₫®¶å̉ ăˆŸÏÔưÀ­¶÷¼Û«‚ ½9çÚéºׯ±¿ăˆŸ;k‹æ›¶é¹Û«‚ ½9…°»ÇÖ¼€v«ô‹Ç«‡“ÍjÖÆÛ«‚ ½9Û±»ívỞ›¾‹Á߈‡ºñÚçÆ‡̃›¾¦ô‹Ç¡Ø߈µØñº̉ ÿÚIÏ̉¼½ψŸÖƒvăˆŸÓºù×ăƠÇôÛ×ͼÙÚ™Á̃ˆ ₫©‡¥2ßëMÎŤۡÁÅÜ×Ơ—»ơê©À́Á«‡“ÍjñÓ¿ÅâàăĂ3øêåÁ«‡“ÍjÓ¾™‰kß [ïSĂĂ ›­±àéM™‰kß [ïSÑÓÚª‚ +¼9ù¾ªÚÿ¯¶ŸđÙ×ù×ƠñÖ›Ú¯Èëö«dưÀ«‡“Íj±»•ÏÅ÷Ú«ơƯÓ ¯&ÍƠ±»Ç÷ÿ¯¶ĂÙơêë“ÑĂåÁ­̃Ë̉ăˆŸ;kÛ«‚ ½9“ƠÑø× ÏÅĂ«‡“Íjí‡ưú₫ăˆŸ;ßÏ«‡“Íj÷Á›¾óÂÏÅ’™ơ«d¿ç߈«âå»Ăº߈ßÁƒ³¡óǶơêăÄĂƠñÁù×ÙŒë*«»ëö¯ÈƠ¨›¡ïÚÔX«‡“Íj߈¡Û¡Û±»¹¾‡ºµaíÖ­¡9¥‡ÏÔÿ×Û«‚ ½9‚vùשȤ‰̀L„†đ¡ƯùêßÚ߈Ǽ˜‡½»‹ï½߈ÛºưÀÏÔù×ăêù׫ ©ƒ»5ù×ÑÓ ËûÛÀÙ½÷å5Ó‹Ç«ÔÏÔÇĂù×Ù½›Û™‰kß [ïS¶ƒˆù×›¾µØâĪÔÛ«‚ ½9éÜÙƠÚª‚ +¼9߈ÏÅù׫‡“ÍjăˆŸ;kñ“¹ƯN›¡ÁÉù×߈«‡“Íj8¤‡™‰kß [ïS“ƠĂèç4ñÛ«‚ ½9±»ï»Ÿ}•׫·3uUöÙ‰yÖ¾£ØøêăˆŸ¶èÑĂÅùơß»û·‡‘×8çĂÈ¡Ơ›ÛƯÓ À¼Ă·Üºö¿Ü›¾§Ó°»¾ËÉ9ÓÜÛ«‚ ½9‡¡È™‡ù×µØăˆŸ;àêÙ½—¶¡Üív߈±»­Äψƺÿ¯¶Û«‚ ½9ÿ¯¶߈߈¯ăạ̀Ă¡ÔÓÅÙ½©Ó£Ø“¾ÿÚëÚ“ƠÛ«‚ ½9‡̃ÙÚ·‡‘×8çÏÅöe¾ÅóÇçm·‡‘×8çöăˆŸíê»Ø´†¡ÁÙ½ù׃v±»±»¶vÙÚăˆŸ;kéºưÀ㻇ÇÏÅÛ«‚ ½9ÿÚçô¿½«»ÏÔ¿‰™§“Ⱦ߽ÿڼȰ»Ö䇉æçÚÅØ߈‡ÛùëÁ”Ö +‡ŒỞÛ«‚ ½9«·3uU߈Ǻ©Ü™‡ù×÷Á•¿™Óù×Û«‚ ½9ÙÚ™‰kß [ïSÿ‡ơáêÛ«‚ ½9ù×÷Á·Ô–Ûí‰ËÇăˆŸáÛ½ôá°‹ÇơêÏÅ·‡‘×8çưÀÁ½óÔƒÖ™‰kß [ïSÏÅÛ«‚ ½9ÛדƠÑÄëßô“§ôÑÄëï½›ÁÏÅÏÔ¡Ôå̉ °»èơ›¶éÏÅÙÚüÀ†º…»¾£Ï‡gÙÚÛº%Âå̉ Ó‘ª¶2tT÷Áơê£Ư÷ˆÓØƯºöÁ—Ó¡Ơ“ÆÙ½߈§ÓÅÔÖ̉Ù×éáù×ăˆŸ;½€Á̉­½¼¹ÚĐÄêß ÛÀ¡È«Ôä×üÀỠ晇ÿ×ßщÏÅă"₫Ú†ŒÍĂóÇ×ĂÙϹ™‰kß [ïS¶¨¼çéé̉Ï|¹Ú4çÚă»ÏÅơêóÇ“¹ƯNÁß»û÷Áơê±»ùêÛ×ưÀ•Û×éJé‰Ó5“gesÁšȿ‰×Ơù×ËÉ9±Å‘ÛÄÓÛ«‚ ½9߈ÖÆ₫Ú­¾Ù½ÙÚ3©Ó‚6±»߈ÓºµØ9¥‡߈߈ăˆŸ±ÏÔ9¥‡ß»ûÏÅ ņÆÜăÁ¹Ú}±»ƯÓ ¿»èÓÛ«‚ ½9ÂĂÛ«‚ ½9DZ«bóµºù×ăˆŸ;µÜ¿ôôÙڃ׫Ա»ÏÔ±Á©¼™‰kß [ïSÛ«‚ ½9퇵†Á̉è÷Ú™‰kß [ïS›¹±¿åĂ߈íví—GíÓ߈½ÜÛ«‚ ½9ôÅı»ÙÚ£Xƒ±½ÛׇµaŸÈ¹ÁÙ̉¸ÚçÚ±»ß„̃ˆ«º½ôósÏ̉á=™‰kß [ïSơÔÙ̉°»߈·ºéÚ‹v©¼«ÔË̉ß»û÷ÁăˆŸ;¥Ûëöù××ÓäƠùרÓÍÛ¾ß"ÏÅÄÓºËÉ9༙‰kß [ïS½ñzơêƒvéÚ¹Ú«Ô±»ÙÚéºÁ4ƒˆÿÂĂÙ÷‡±»ív—øưÀ©ºăÁÊǹ½ívñÚñ¡Ô¡ÔñÄÙ°·‡‘×8ç·ÅöÙÚ‹Ü«‡“Íj÷ơÑÓĐÄêỔ´a¼ôç̃èô ÁƯÇÖ½ØÛŒ₫ÅØëöăˆŸ;߈°»¹Ú±»Ơ±µßÅÓØËÉ9§Ô‡̃Û×ÑÓ›¾ÏÅ£ä Ëû¨‡¤2€̃êL©Ăù×ÿ¯¶»‹ÏÔ½ÏÅƯÚôĂù׸Úâ»±»±¿¡Û±»±»™‰kß [ïSͪˆăˆŸ;ï½ù×ơ꯼¸Å‡Ú¾º¹Ø÷ˆư‡±ù1‹È›¶éưÀû¶ĐØÏÅÁÚƠXµØû(Û×Ñ₫Ûºâ×ĂÇ›;߈›¶éÿ×ÚÙÅëÛױ߇xͼÿ&ÅØ¾Û×ÙÜ9¥‡‡‚ɇ9¥‡ר­ºÇÓÙ½ÙŒë*«¹Ú›Å»Ù½ùê±»ÏĽô¥Ûÿ¯¶ă»ơ¼ëöêÿÚùêÿ±»¹½§¹¡Û¶‡Ö8æù×Û«‚ ½9ơêÇö¶«‡“ÍjăˆŸ;ôêĂàÏÔÛº߈¼…Ű¿߈ºyî“ƠăˆŸñ´‹ÙÓØµØ߈±»ÏÔéêßÄÙíØ³È¼“¹»ù×§ÈóǵØĂÙÛ«‚ ½9·‹ĂÙëöÍß Ơ×¾£‡Û«‚ ½9£äĐÓÙ½™ĂÓÓ—ÓË%ív߈Ç÷ٕף䃽ÏÔ•%ù×ÏÅÿÚơĂ™ÁưÀ­ˆĂÙ«‡“Íj¬Ô“Æ­=§Ô߈ù×›¶éÙ½½ÜÏÅߌÛ,ÁÛÄÓ躉¢ÁƯÙ‡Ï9…¥ÇăÁù×€º©Óëöó×Ùڻؾř‰kß [ïSô¥ÆăˆŸù×߈·‡‘×8çƯÚĂÙÄÓùןÖ9¥‡Ï-á=׺©ˆ¿ƒvđ»ÏÄ…ÔØ̉ưÀÙ̉÷Á˜‰j̃ZîSăˆŸ;kºĂëÓơê߈™ÓưÀơèŧºÏÅؽ™‰kß [ïSÜ­½¼™‡·‡‘×8çûÑÓơêׯ›¶é×Áëö߈÷ÁéÓ¼ÇØ½«‡“Íj·‡‘×8çÀƯ¡Ôù¿Ïž™‡³ºóăÁßڵر”ÿ¯¶™‰kß [ïSŸÈ•Èû›º“Ƚ¹Ú„»¿‰©Ó߈ÙÅëÛ«‚ ½9߈̉ÆÏÔ¶£ØѶƯÓ Úª‚ +¼9ÍĂÖÚ9¥‡ÓÜƠçØ‹ÇóÂÛ«‚ ½9«‡“Íj·‡‘×8çĂÙß»û«»“Ơ÷ÁÏÅƠºm¿‰Û«‚ ½9ÍÓ8¤‡×Û«‚ ½9•ŒÏÚ±¿€̣Ă›¾½Û«‚ ½9ºƯÓ ½€½°¿™Øñ‡¯ƒßͯ¥'=U#QK¯ÂơêÛÄÓ™‰kß [ïS™Á¬̃ĐÄ ê °»±»ËÇ·‡‘×8ç¯Û¼ØÙ½щÏÔĂóÔƠíêÇ̉êöƒv©Ó½ôÅØ¡Ô«ÔÉ̉ƠX«·3uU›¡‚ǾÁ½€ËƠ©¼½´ÅĂƠ¶Ôˆëö•‚v ¡Ûù×ÙÚ­ØÉ»·‡‘×8çëö…»«‡“Íj¡Á·ØÂCǼÙ½¯ÈÁƯ‡x́Ú™‰kß [ïS±»Á½ǼÛ«‚ ½9ÏıÛ߈çÚ÷Á½çÚ¡Ơ¯È¹Úù×­¶ÏÅÅ–9¥‡ûØŸß—¶«‡“Íj“¼™Á÷‡ƒ×âơ—¶ĂƒÎ¹àĂÛƒvơÔ¤ˆ\0·‹ù×»½߈ÙÅë¾ĂÙĂºÙÚÜĂëö¡»Ç%µØ¹ÚăˆŸ; ¬°àèM¼×Ăùצԛ¶éÙ½¬¾™‡±»ƒç›Ăï½Û«‚ ½9רƠßÁĂ™‰kß [ïSËÓÄnéÓ·ºŒ₫Üív×¾‡ĂƠíÓơºËÇă»¾Û׫‡“Íj¥Ø®Gø¡ÁÇÖÑÓÛÔ«%§Û«‚ ½9–»¥Ø»‡å̉ ™‰kß [ïSÅ–á=ëöùꩾ߈™‰kß [ïSö‹È©Üùש‡¥2ßëM™‰kß [ïSÇÖ¡ÿ¡ÛăˆŸ;k™‰kß [ïSƠỞ¥Ư₫¡%À‡€è/Ö:Á¹™‰kß [ïSÛ«‚ ½9¾ÈùêÚª‚ +¼9¿:¸Áív°»ÏÔ±»ïÙ½ñº™‡ÀÚ¶/ÇÖÙÅëµ·Ó ¥0‘ƥغù×­ôû'“ÑÓ‰¿IÙ½ư“·ÅùêÅ»¶Ü÷À‚Úùê9¥‡‡ÇÁƯ‹Üƒv·Ô—¶Ơ¾G¹ÚÅÓôƯÓ ÏÔ¸Úÿ¯¶Å–߈9¥‡ÙÚ•ÇÅÓÁăơê߈£Ç±»µ‘»nù×µØ̃ÄØÎÔÓÔ¶Û«‚ ½9©Óß„¡ÈÍÓÙçÚȆڡƯö•½ăˆŸ;k›¾߈«‡“ÍjĂđơê¡ÈƒvĐÄ꽇º߈ÍÄßÚÖ¾8ÑĂñÁ£»¥ºƒˆ‡¿ß©¼ÁƯ…ÛăˆŸ;·ÔƠ»ÑÄë“öçđ¹á¼™à³ưü½ô«âßÁÅ»ºÑÓÏŃvù×ÿ¯¶ĐĂàê°»ù×…Öƒƒăơ‡x¡Ûæ Á¹Ù½ßÄÙׯ™ĂÙéê—¾ÏÔ§¹±¿±»G½¹·Ó ¥0›¾æ$ưÁ¤Ç‚v$Ñ\éê³ôÓ¾«‡“Íj¼“½§ÔĂÙÛ×Û«‚ ½9Û«‚ ½9½ôÏÔ‡“ÅØăˆŸ;Ăº÷Á’È×ƠóÂÛ«‚ ½9Ù½ÏÔ·ÔµØÛ«‚ ½9ÉÏÔ¼ÙÅëœÁ¤ˆ\0« ©ƒ»5ôØùêÙÚÙÚ—¶ơÔ‡åĂ›¶éº‡–¶á …ĂÈßÚ™‰kß [ïSÓ̉9¥‡çÔ¡‡€ºưÚƠX½à…Œƒ×íØ¹ÚÛשؽë߈¯¼¬¿™‰kß [ïSỔ–ˆ÷ÔŒƠ÷ÁÙ½‡Ù½á ›Ú˜êè䝯½Û«‚ ½9§Ư«‡“Íj¡ÁÅÔÂĂƠ“ȧÓÜçÚËǑָ£ơê­ÄÛ«‚ ½9Ư “ÈóÇëöǾÑÓÛשӀ¼Ơơê׋Ü߈Ú×̣ÿ­ăˆŸ;…»™‰kß [ïSŸöÛºëöÿ¯¶“¹ƯNÅÔ«Ô·‡‘×8盶龋ÇËÉ9éê±»ƯƠׯÁ ăˆŸ;ùê¿ôçÚ¯ µØôùêµØ½ëÚ«‡“Íjù×èơö«Ô»ăˆŸ;ñÚÁƯëöô¾«ÔƠX™³ù׉·Ôï³½ñÚÛ«‚ ½9ù×û(¢È±½«‡“Íj½ư±»Æ’ºÑÔáÿ¯¶±»ñÆëáç­Ö±»ƒ×½€©‡¥2ßëMù×»ˆ™‰kß [ïS±»ƒˆÿ÷‡öÁÛ«‚ ½9Ï̉ÏŭĉÔóÂÿÚÏ̉仉¿IŸÖơêăˆŸ¡Ø‡Ø¥ÂƠ¶ÔùêÛ«‚ ½9ùê±ÁăˆŸ;߈ưÀÑÄëƒĂÙ‡ºÛ«‚ ½9ƒvăˆŸ;±»ăˆŸÁ㙇½ï³2Û«‚ ½9›¾¶ + +å×¾±¿߈Á½߈Ù™‰kß [ïSè‡ñÓnñÆÁ½Ա¿“ƠÁ´߈—Ó¡Á«‡“Íj£äĂÖÏÔÙÚÂÙÑÓ½™‰kß [ïSùן»ëö߈ºÜÙ×ëö̀Ê)èÛ8¤™‰kß [ïS¡Ô¥ºÛ«‚ ½9ơê£äƒvÎ̉ơ»ƒÆµ¶  ÜÁƯ™‰kß [ïSôÛ«‚ ½9¾¾‚vù×å¡“Æ™‰kß [ïSéôÛ«‚ ½9‹Ç²mÓà©¿ØÏ̉½éçëöỞ™‡Û×жăñÖ’›·Ô±”߈Ï̉›¾çǽ¼Ă«»áº \ăˆŸơꥈ]1™‰kß [ïS‡Û˜‰j̃ZîSµÙ̉±»»‹¿»ͪ9¥‡ÙÚ9¥‡™‰kß [ïSăàÍĆŒÏÔ¹ÈăˆŸ;¼ÛƒưÀ™‰kß [ïSƯå¡ÈÍÓÛ«‚ ½9¹đÖÏÅöƠ÷‡çôăˆŸ;kÜ›¾ǽ™‰kß [ïS™‰kß [ïSơê∶ºí—Gƒˆ½€ïƠ±‚ ¡ƠñÿÚéê9¥‡‰ÛƒvÎ̉†ŒƼù×ö›Ç£Ø•½º“Ơ““º“ƠëöăˆŸ;kˆÔ›¶é±»ºñÇ«‡“Íj›¾¼ƒv½€ÙÚĂĂ ›­±àéM½‘‚v«‡“Íjå̃öÁøÚ§Æ Ă ›¡©ØĂ Û«‚ ½9ÍÄÂĂĂ ›­±àéMƒˆơêºÙÅ뽲ƃv¢Ô¿́‹Üëö“¹ƯN—¶…Ô× Ơ¾G¡ÔÏÔÎÔ¼ƒv«‡“ÍjçÚ9¥‡ß½¹Ú‹Ç‰»ûƠ¡%“¹ÜNăˆŸ;k½‰½Ô“Æô߈¥ˆ]1£Ô“Æ­½¼¾ÅÀÿÚ§Ô˜Á +§ÆÑĂĂÙ¹ÚÅÓ«‡“ÍjÓÜÇÖ±»ßÄÙ™‰kß [ïS½€ơèÅÊ¿½€¸Ú߈߈ÿáĐÅå̉ Ù­ÄªÚø×߈«‡“Íj‘ +™ÔÄôÿÚăˆŸ;È·‡‘×8ç©ƠÙ½ÅÔơèÅÚª‚ +¼9ñÄđ¹˜ Á̉…àăˆŸؽÑӇǗ¶ÍƠăˆŸ;ÁĂ9¥‡×±»Ù½ïåû(°»˜‡›·ÔÁ 8¤‡×‰°†Œ€Ó‰¿I˜‰j̃ZîS₫گƭę‰kß [ïS±»ÇÖ׿8©-á°»¡·Å߈ñÓÙÚÙ½ù׌½Óººû½îº­ÖÂÙ‡ñÙ·‹ÑÓÿ×ÏÔ“ÿ×ăÁ̀ÄÏÔ©¼̃ưÀ߈ăˆŸ߈ëöÛÀÁ‡é/×:¶  ë™H£ÈñÖÁ̉±»ø×÷Á߈‚vËÉ9ÍË)éÛ9¥·ÔƒˆÓº™ÁÖÆÛ«‚ ½9ơÔúÓ¯àĐÄêƒñƵØÏÅÓ.›°»ÁĂ“º‰Û‚vÁ¾ÙÚ߈ù×ĐÓ½€ơ$ÏÄ÷Ù¿ºăˆŸ;áÛ™‰kß [ïSÿÁÓÏÔ¦ÈíÆˆ‰ÛŸß8¤‡×ƯÓ ï½£äùô™‰kß [ïS™"߈‡ºŽ½ë†Ơ©ÓÛ«‚ ½9ÛÚ±»×ƠÑÄëø×±»™‰kß [ïS±»Û«‚ ½9ù׺·È½×ÜÎÅ•»äîÑ»×Ơơ䵆›¡é‡ƒvîD©ÇôщÏÔ¿‰ăˆŸ;ÏÄ÷‡ÏÅÛ«‚ ½9ơÔɇ“ÈÏÄ·Å·ôŸÅ÷ÁăˆŸ;ëöûÜá Ă˜‰j̃ZîSƠ“ƠÅă»½Ă±»ëÚÛ«‚ ½9ºÈÛ×ĐÄếvƒđ¾Dívă½ôù×ÛÄә䱻ù׺Œ½Û«‚ ½9÷Á“ÈÑÓƒˆ©ÇÁ¾ÀÅ›đ,·ÔĂÙÛ«ԫ‡“ÍjÛ«‚ ½9½ÏÔ‰¿I‹Ç°½Û×ÇÖ9¥‡…¾ó̀Ê)èÛ8¤«‡“ÍjÛ«‚ ½99¥‡ŸÅºÎ̉߈ëö«‡“Íj÷ÙÛ«‚ ½9ƒđ™ëé图ĂĂ ›­±àéMÀƯ¡Á÷ÚÍÄ»ØÏÔñӓƶá¾ûÙ¿‰̉ºƯ˜‡ ´Î°»œ·̉ ¤0½€÷ÚùåûØ«·3uUÙ×ĂÙăˆŸ×1ôív‹ÜÎÅă‘·̣ÇăˆŸï½ËÇĐ%•Œ½¡ÔÇÖ¥ØÛöŸè«öÏÔˆ¾÷Áψ¹à¥ˆ]1Û«‚ ½9ÄÓ‰ăÇí±½Û«‚ ½9áß߈ù×›¹¯È»‡’×ÔơåÁÙÚ¿́‹Ó÷Ú½9¥‡ÔXƠÁ°»»ßÁ¯‰¯0Û½›¶éÚÚƒ½·Ú™‡ßÚ™‰kß [ïSûÓÛ«‚ ½99¥‡ÿÛË”éÓɱ̃‡x̉̉Û«‚ ½9ÚׇÏÔ‡¡È›ÏÅŒ₫Ù̉›¶é‹ÇÙ̉ôÛÀÛºăà¨ÇĂ¼ƒ½Û«‚ ½9çÚñÖåêö +Ûïé½€ÍÓĂºùê÷å5Óé꛾ØY +߈ùדƠÓ²«»øêÏ̉ø×åĂç̃¬¶9¥‡ïÚ÷‡ÏÅÛÄÓö‡ÛÁ¼¹ăˆŸ;öƠÚ߈ÑØÅÓ‚£Ô½¡¢ÈL™‰kß [ïSÏlëö©¼ÙY·‡‘×8糺óï½Û“ù×ôêëöó¸Áăëö¤ˆ\0åĂƒÖ«»ï½›¾¾«Úăàçô·ÅÂñ֯ȽÍÇĂΫ‡“ÍjƠXÙ½¾û›ƯÚá óÇ­½¼™ưÇç߈ù×§ÔßÅĂĂ·‡‘×8çÏPÅÓĐÄê›Ú„öíØ¦Æ±»Ǻ£!»»½ÏÔïỞùê÷ˆƒˆ™‰kß [ïS½€Á„øß»û¨Ø×ĂơĂƠ¾GǺ¿ßƠX¼€ØŒê*ªûӾȤëöÄô½ׯÓÅù×ÏÔ¹ÚÑØŸÅ±»߈‡x‘ơëöÛ«‚ ½9ÙÅëÛ«‚ ½9ÏÄÁĂàň«‡“ÍjÙÚçºÀĂ ëö·Ø¸ÚÑÄëÏÅ«ÔµØźơêóÂ÷ÁÏÔí$ưÀ¶¼̀7¿Ø§àă½ƒù×ñÄÅÓÛ«‚ ½9ƒvÚÀèêÙÚ›¹¼€ƒÓ¾ơêăˆŸ; ÇßÚ×ƠϤÎ̉ơÄÙá=¹ÚÛ«‚ ½9­ÔÑÁ·‡‘×8癉kß [ïS«‡“Íj¿ÔÑÓ™Ô§ÆđßÁÏÔû¼ăˆŸÏÔÁƯăˆŸ;ùדșëéå±»ăˆŸ;k«·3uU•Èû›“¼ÏŃvÂĂ Ÿ’ÇÓ«ÚáĐ¡Ôø×ÄÓ«‡“Íj­Öù×à§ØǼ±»÷ˆ±¿Ù½½Ô±»ËǽØùêゥÇù×áƠ½ÔÙÚÿ¯¶Óµù×ơÔơĂ­Ä™‰kß [ïS½Ô‰ŸÈ±»ÍË)éÛ9¥Ă‚ÚöÏÔÏÔóÇưÀĂÿÚŒÓá ÅØÿ¯¶ù‡Û«‚ ½9…ÿ¾–Ó™‰kß [ïSóÂëö­ÄÁù×éºÛ«‚ ½9¡Á›¾Úª‚ +¼9ûäù×µ!±»ù‡Ï̉8¤‡½€ù×߈ĂèÏÔ߈–¾±¿Ô ‘Ø×¼ăˆŸƠĂô±½ĂÙµØÂȺׯó^ơÔ˜ÔY½ׯÉ»‡ÚƠ¾±»¼Ôù×¹‡º—¶9¥‡­v°» ÍÄơêëÓÙ½Á½»c­óÅ¡ÛûƠ÷ÙëÓ˜ÁơÛ«‚ ½9Ø9¥‡Ă›¾ÏÅÏÄ‹ˆëöĂR¬¾¡‹̀Óívóǵؽ9¥‡¾­Ù¡Ôă¼ÓÆÅØщù×» ÛçÎÅå̉ ÏÔǺ£ÇơêñÆ£ÇÛꩇ¥2ßëM÷Áµaívÿ·ÔăˆŸÿÉéÚ⺿‹óÇÏÅÓÅ‹ÇñÚ©¾¥ÆĂµØ«‡“Íj¹Úå̉ ïßÚª‚ +¼9«‡“Íj½%‡±½шëöÏÔñơñÓå-Ë¿êö™‰kß [ïS˜‰j̃ZîS±»¥±±»ù×áê±»­ÔĂĂ ›­±àéM™‰kß [ïSëöëö8¤‡Ö½›Ú†Œ«Ưï½·‡‘×8ç̉º÷Á—¶ăˆŸ;×̀«‡“ÍjÉàù×ëö«»ù×µÈëö×¼µ´·‡‘×8ç˹™‰kß [ïSËÉ9—ˆß»û»×¿8ƯÔù×ù¿±½ñÚïÁÍĂÑĂÅØĂÙÏÔ߈ű»ëÓùדÜÀëԔöƒˆ£ä‡Ù½ưtÏÔçôÏÔ»Á™Ăëö́‡™ëéåÛ«‚ ½9ƒ½½€ưÀÓÆĐ÷¼ăˆŸ“½¥ Û«‚ ½9°»ơÄø¼ù¿ĂĂ ›­±àéMÓ¡Á½«»ר±»íÚ÷Á¥Ư¹ÚÑÓ©ÓÙÚËÉ9gđÖ˜‰j̃ZîSÓÆëÚÙ½̃ˆ9¥‡«Ôă¼8¤‡›¶éÛ×±»«‡“Íj•Ö™œßÁÇĂÛ«‚ ½9߈ƯºÜ÷ˆªdéê ÇỞ߈‰Áﻫ‡“Íj»Ø‡Ú÷ˆù×ôê‹Ç—¶—¾ÑØôűôÛ«‚ ½9ù×¹Úׯÿ§«‡“Íj«‡“Íj±»ƒˆ¡G½¹ôË̉ùå§Ô™ÁÙƠ­Ä›¾́$ÅÁƒˆÏÔ·‡‘×8çëö½ù×Ûº©øù×ñ¹™ Ù½Ë̉ÙÚ´°Ö +Ô† +6 +¦j +«»ÅØÙŒë*«§Ó9¥‡¾º Ïù×áöÛ×”ÈúׯÛ«‚ ½9ÖØ9¥‡ÏÔ‘ÆÁ¹˜‰j̃ZîSÙ½ÍË)éÛ9¥±ÁơÔÄÿ£äøêđÖëö‘«ÓÔÙ×Ù½ỪÅ©¼©Ó›¾×Ó§ƠÓÅÓØ¸ÚÇưÁ¡‡;Í̉«‡“Íjÿ¯¶¡ĂºËÉ9«·3uỦ̉—»߈ÏÔƒv™‰kß [ïSíÁ…™ëéåëöù×ưÁù׿ŽÍË)éÛ9¥Y†×ÏÅߌÛ,¬Ö±̉ÇØ²ÂÑØù×¹Ú±»½Ï̉ù×ï»·‡‘×8癉kß [ïSûØô»ƒvëöƒˆÜă»ÍƠăˆŸ;ỬźêÅѲº̣ív¿À›¾½µ†ù×܃ˆ8¤‡ù×…»Û«‚ ½9Ó̉ÁĂÍÓ…Ơ«‡“ÍjơÔưÀï³2ÁĂăˆŸơÔ«Ô“¹ƯNƒv÷ˆív‡Û«‚ ½9ÏÔÛ«‚ ½9›¶éăˆŸ;ï½Û«‚ ½99¥‡Ó¸ͺ·Ô“ÛÏԵإۙ‰kß [ïS¹Ú߈£‹ívÛºñÚ́Áƒv‰¿I‰¿I·Ô½«·3uUƒăˆŸ;k÷‡ùø×º—¶ƒvñ"ï¥5ù×ÏÅ¥ˆ]1º̉«Ô•Œ«ÔÏÔÛ™Áñ»éï»»ˆÁ̉›#¡3© Ñ%­’ç̃ÖÆ£äƯÓ °»ÄÁ°»™‰kß [ïS™ăˆŸ;ëö™ô߈¥Ø÷ˆàÖöáêƒv¼Á±»½±»±»Äô:ưÀ¨Ơáê›¶é›Ú™‰kß [ïS‹ÜỞÅÓ¿‰Çؽ€÷‡ÎĪ-Ù½ơꀺº“ƠÏĂƠƒ¾‘ºµØ±»ăˆŸ;k÷ÁăˆŸ;…à‹Üù¿÷‡ËÇ™‰kß [ïSöÍ‹¥º¤ÂưÀôÛ«‚ ½9Ѷ±»±»‰Ûù¿ÏÅù×½÷Á™‰kß [ïSÏżµØơÔÏÅ9¥‡Ñ·Á¹™‰kß [ïSÿ¯¶ù×Û«‚ ½9‘ơׯ™ÁÏ̉¥Ö8¤‡ÖÙŒë*«ívăˆŸ;ÍĂ»½Û«‚ ½9½€Û«‚ ½9Û«‚ ½9Ǽï½í$ ƠÄщ™ëéå…»ßƯ°̉†“߈ËDZ»÷Á¡Ơ—¶öÀÛ«‚ ½9¨ºÙ½ăàơĂÑĂÏÅĂÙùסԭÖÏßÿÚ߈ÅØ̃ˆßÄÙ¿‰‹ÜëöëµØ¹Úç߈·‡‘×8ç§ôƒÖׯëöÏ̉å¡ƠX½½¼Øñt’½ùסÁ×ĂÛ«‚ ½9°»9«ÑăˆŸ;«ÚÅôÑÓÏỖŒÚ,áê½¾‡‡ÇĂÈÿ¯¶¹ÚóÔ¿ôÛ«‚ ½9³́›¾ψĂÎĂĂ ›­±àéM©Ơƒv±»™‰kß [ïS·‡‘×8çÙ½™‰kß [ïSÇÀ¹óDZ»³ψ°»ä̉ÓÏÔí—GåĂ²È¼ëöívûÅÓç̉ĂăˆŸ;›Ü߈ÑÄë˜Á•©ÓÚª‚ +¼9±»…ö߈ôêÙ½™‰kß [ïSó¨ƠÙڳطÅÅØ…±»›Ô¤Æù×˹ÆÅØĂÙ‹Ü¢Çû–ëöµaƒ×9¥‡Ăơê߈«‡“Íj·‡‘×8ç±»½źù×û¨œÛ«»³ÿÚ±»­ÖÅØƯáέ±»ÓúÙùש‡¥2ßëMđÁĂü˜‡°»­Äºÿ¼®»éØăˆŸ;›ÛûØ“ƠĂÏÅ à ¬Ö¨ÀÁ‡é/×:ăˆŸƠ•Œ…̃†Œœ· ̉ ¤0 ñÔ¿»«;9¥‡̃ÄØ¢Ç?å̉ Ươ™Á™ëéåµÜ߈ùæ•î­Ö¿ÅăÇíù×ĂÈ©ˆß„ơêøêºÛˆ¿́§ÆÙ½¹ ơèÅăˆŸ;³ă½»º˜êèäƯÂñÓ‹Ç ¬°àèMƒØ½ôỞơÛ«‚ ½9°»«ºëöçô˜‰j̃ZîSÏÔ߈íÁ½ó×’ƠưÀÓº•ÇèÓ˜êèä½ÏôÛ«‚ ½9¹̃›‡ù×µØ9¥‡ÏÅ÷‹ûƯ™‰kß [ïSͪ˜ ê è ä ߈°¿#©¼ôê±Ô‹ÜĂÙ™‰kß [ïS±»ÏÔ±»ơÄöËƠëö¤È½™‰kß [ïSÿ¯¶¿ØÏ̉ĂÙÁ¹×Ơ½Á«‡“Íjéêɇ›¡ׯù×ÓÆØ ‹Ç¹Ú™‡9¥‡¡ÛñÆËÇ•{ÅØưÀÎÅóÇ罇“߈ÅØ—¶̣Ç»ÈÁù꫇“ÍjǺÅØÏ)©‡¥2ßëMÅÏÔơèÅÛ«‚ ½9ßƯ¶èôƠĂăˆŸ;™‰kß [ïS«‡“ÍjØ;½ÏÔ¡²£ÇÛ×›¾₫ÚƯơ°ÁÅÓÙ½­£—§ô߈ÿÚ߈ù׿Ư8¤‡×«Ô¯¾ĂÙ½ÙÜƠƒ½ăºÇÓ·đ»Áâ»ÏŇŒó‰¼ß·‡‘×8ç̣DZ½ÁƯߌÛ,ơÔ¡ÔßÄÙƒvŨ ù×ÛÀơꈺ۫‚ ½9ívßÄÙÇĂÄà‹Ç·‡‘×8çµÈ±»ºyóÂăˆŸ˜ó†$«Ô§Ôûū߫÷ÏÅ¡ÈĂ­văˆŸ;kË%Ž߈¿ß™Á«‡“Íjêç¹ÁëöăÄÏÅ­ÖªĐ¾¹©ÓîÚ½™‰kß [ïS—ˆâôpÏ̉ưÀ÷Á÷ˆ±»½—¶9¥‡ơê©Ơ9¥‡χ£Ư¶º߈ăˆŸ•·ƠñÚå̉ “ÏÔ¿º—¶÷¶ÏÔÛºÇ%Û«‚ ½9¹ÚºÛ«‚ ½9̣ÔÓµOơÄ‹v™‰kß [ïSÏÅ·Ô߈¹àÙ½ô±»‰¿IͪËÖ²߈÷‡±»רûØ‘ÆàÓI«»ơèű»Ở«‡“Íj߈Ï‚™ô÷àѶăˆŸ;ưÀÍÓ±»ÙÜéàĂÙÛ‡«‡“Íjí‡ï»ŸÅ±»ÑÓ•Ú9¥‡™‰kß [ïSù×°»Ž½ûƠăÓëöéÓ‹‚Ëù×ÏÔ£äù×¹Ú߈ăˆŸÍÏÅ™‚ív¸¢ ÁÎÔÏÅÏÔ˜êèä¯È˜‰j̃ZîS“ÆÏÅơèÅî½ï½úØÙ½«·3uUéÓăˆŸ±»ÄÓù×¶ăˆŸ;ÏÔͼÙÚù×ÑÄë߈ÍÓĐĂ½¹Úù×Û«‚ ½9¿ƯăˆŸ;k°êØĐÓáÛ×¯ßºăˆŸ;kµØù×ËDZ»±»›¾™‰kß [ïSÙÜÉ£ÇÉ̉¾Å ¢ä¿­Ä»Åµæº‡“œ·Ỉ I¤0I÷Á·‡‘×8çÛ«‚ ½9©ä»ôƒ½¢Ç¬¾ÙÚù×ăˆŸỂä̉‘±Óº¹Ú½Ô¹Ú̀Ͱ»ÏÔÏÔ•’ƠÁ“‰3Ơ,ùùס»•uÏÔ³ÈĂÙ¿ơ÷ÁÁ¡ÛíÖÁĂéÚÁĂ™‰kß [ïS™ôÉܘ‰j̃ZîS9¥‡×¹“Ȱ»á=û(™‰kß [ïS߈ơêưØ߈°¿¡ÓÛÄÓå»ÿÛׯƯĂÙëöăà‡á ô‡™‰kß [ïS·‡‘×8ç—»·Ó ¥0ÚסÁ߈ùêî¶ÙÜëƠUíÖÚÀÿ¯¶Ëß8¤‡ăˆŸơ¿¡Ûå̉ µÏ«)í‡ù×퇣X⺢»ƯÓ ©¼¡Ûù×½€½Û߈æ'ÛÅÁ¼Û«‚ ½9§să¼ß„­)Ç%ËÉ9¿¡‡Û‹’Û«‚ ½9“ƠÑØ™‰kß [ïS‚×ù׳…ÖùêƠơ9¥‡§ÖÛ«‚ ½9ÅØưظڣÔöXÚª‚ +¼99¥‡ùׯƠƯơ‡“ϋš»ÏÔ߈¥ˆ]1‰Ôëöï³2ÑĂñÚù×ÏôăˆŸ;Û×ù×ÛÅǾ³×ùơÛ«‚ ½9ƒv±»¥à—¶£ÓÍÓ¡ÁơÔ´ØÓØùꪶ2tTƠ«‡“Íjơij¹߈éơ½Û«‚ ½9ç½½ÔơĂƒˆ߈ëØ¶Å™ÔÏÅùשӽƒv”ŒĂº¨¾ƒvŒƠ½ÇÖ±»¯¾«‡“ÍjÏÔ«·3uUÏÔù×ù×­½¼ÓØ‘®ÓµщgàˆÀ0pŸ̀ù×߈™‡Ơºm‰¿IöĂÓÛ«‚ ½9ăˆŸ;÷Á½éêĂÙ«Ô÷™‰kß [ïSƒv¡ÈöÁƒÔÑÄëÏŧԻÍÓ›¶é™‰kß [ïS»ƒvùêÿ¯¶ñ~ƒÖù×ÙÚñֵؙ‰kß [ïS……Ö™‰kß [ïS∛¶é­ÖçÚ±»ăꙉkß [ïSßÄÙ‚߈™‰kß [ïS»½óÇжÑĂºØ™ôêö©Ø߈£Ø›¾ÅØÛ«‚ ½9±¿¥Øáº”»ûص.¥Ù±»ăơÿ$«‡“ÍjáƠÛ«‚ ½9ÛÇ™ëéå°çÇÖûÓ«‡“ÍjỊ̈‹È“¹ƯN·ÅưÀ‹ÜÑÓ«Ï̉½߈Û«‚ ½9ĂÛ«‚ ½9Œ¾Ù½íṽ„8¤‡×߈©¼ÁĂăˆŸù×ĂÙå̉ ¨¼ÛºÅôù×éܽưÀ­ÄÆÅØ­ØÅÔĐÅ•½ĂÈô¦ôñ̃½µ†Û»÷Û«‚ ½9¿»½€ßÖ¿ºÓÅéê¿́߈ÿÇá›ÍƠíơÏÔ߈ÏÄ·‡‘×8篾ƒ߈€ÙÓ½€ÂÈ»̉ƒ×‰éÓ˜‰j̃ZîSçÚëöëöÍ­ÑÅ߈¥Ø…»ơêÑÓăˆŸ;ÁƯù×¹Ú̃ˆùן½öƒ‰ơ‰ÛǼ™‰kß [ïSÙ½«·3uUÎÅưÀ‘Ƈ“ŸÈơÔ߈§ôăÚ«dåĂ«‡“Íj߈åĂ߈íÙß»ûÛ«‚ ½9½ÔóÇç̉ÙÚù×…Œß„Û«‚ ½9ï»­Ö‰¿ỈÅÿ‡óÇ£Ô÷‡ù×™‰kß [ïS÷Ô›¶éëöÇ"ÙÚÑĂ¾«‡“Íj¿º¿»—»Ïÿ×ăˆŸ;¼ÙÚ°¿º£Ô߈÷ÚĂÙĂôÏÄÑӳǙ‰kß [ïS±»å̉ ÷öÁ˜‰j̃ZîSøêÙƠ±»½…€­:Û«‚ ½9ÿÚ匿N‡ŒËÉ9ƒv¿)Û×£ÇÉ#«º¡Èëö£ä« ©ƒ»5߈‹Ü›¾©ØăÇí¼Ô÷ÙĂ¼«°Y¯ÜáỞ»Ü±»…à§ôëÓÛ«‚ ½9í|å̉ ëöÛÀỞÛ×ÑØƒ×¹Ú©ÓăÇ홇£ôÆ̉£ØµØĂÙ×¾°êعګÑÍƠ®¾ ¡ÈÅn÷Á¿ßƒÏÔӾ͑…Ø­Ø̉ÓơêơĂ÷ÚóÇù×ëö±»½ôëö™‰kß [ïS±»̉½Ù×±»ÅÔ½ơê«bÏ̉ù¿÷¼öÔØ÷‡ùô„ Ëûá ߈Û×óÂ8¤‡¾øơËƠơ»¡Øƒvù×éêöÁÂÓ ¿$©‡¥2ßëM‰¿Iï»ÙÚÙ½¼ô÷ÁëöÛ«‚ ½9߈ÓØÙ½ q ¡ÁçÚÛÀÓ ‹›æÛ»÷åˆö߈™‰kß [ïSÙôµØóÂù×߈¹Ú¿Ú₫®¶°»ëö÷4Ù½“̣ÇÙÚ½Ù×é3¾߈‡,áÓÓ̉ƒv¸Ú¤ÇƒívÅÓÙ½ªÚ›¾ÇÖÓÅ¡ÔÛ«‚ ½9È™‰kß [ïSÁƯÏÔïiôêÛ×°»ÿÚ̀Ă«‡“ÍjÏũǙ¡™‡¿ô±»½̉ʾÑׄƒv™Á‹Ó­¸Ú Í噉kß [ïS±¿ùÚ߈ö§Æ—¶Åô‚vɇç̉ª‡’̀jùæ±½ÙÚ™‰kß [ïS¾Û«‚ ½9±±»±å߈¯Ù½߈ØÙÚª»ÀƯµØăˆŸ›ÚØÅöêö™‰kß [ïSÛ«‚ ½9™‰kß [ïS¸Ú¼‡Ú‡“ÿ„߈ưÀƒv‡ºÁ̉¢ä£äÏÔÇØ”Œ±»ùשǙéè‡Ơ«Û¼ ÅØ©»ëö⩇¥2ßëMÏÅ9¥‡«‡“ÍjÙ×ôÿÂщ§Ü¹Ú“Æ«ÔѶ½™‰kß [ïS±»ñÖ÷$ơê¢XÛ«‚ ½9щ™‰kß [ïSÛ»÷ƯÓ µP¹Úǻۺơ ËûơÄù׈ۜÁމ¿IñÓĂÙ©ØƠÛ«‚ ½9ÙÚçÚ·‡‘×8çÊ¿Åàؽ‹ÓĂÇÜë$ưÀù×Û«‚ ½9¾Ϲ™Øù×ëöÅØ×ÜñӻعڕŒÙ"™‰kß [ïS“¹ƯNĂÙ±»ƒÖ™‰kß [ïSÙYƠºm¾Üăơ™‰kß [ïSü̉ù×ÑÓù×ÿÚÿÚƒv…àÏÔ™‰kß [ïSØ×ƒˆȇ¾˜Ó°»®È—ïÍƠ©pº±»“ƠƠXâḈɇûƠ¿‰™‰kß [ïS–ø ͼ¥Ö˜Á߈±»¨‡¤2€̃êLÙ½¹ÚƒàÏÔôêÛ«‚ ½9ơê‡Ûƒv‡ÇÅÓÙŒë*«ưÀư‡±ù1™‰kß [ïSÏÔ§º°»÷ö§éêăˆŸ;köØYÛ×ÏÔăĂ3¥ÛËÇÿ¯¶ô$ù‡ñƽƠXØÓ…¾á=Ú×ù×ÛºĂÈèê#÷Úù×ï#ÇÖ³±Á«‡“Íj³ ˜‰j̃ZîS«%ˆº³¡ÔƠµ›¾ù×°»ĐÓï³2¼»Øùê‘—ÍÄ£äÁ‹Ç× ±ßÚÁ¹½€ÙÅëĂÙ­ÄơèÅÇĂ匿Nî»÷Á˜‰j̃ZîSÅÓ߈߈Ó¨¼ëöâà ÔËÓä̉¶ỞĂÙÁÓ±»»Ø±½Ù½‹Ü‰íå8¤‡Öó°»v­¾¿‰›¡÷Á߈—¶¥ Ø×ƒˆ­¿ÇÓ÷‡±́ÁéÏÔ«‡“Íj¥Ó…رôëØăˆŸÿÚÍĂ¹¡ÔưÀÎÅơÔÛºëö9¥‡´¼½ØơÔƒÏ̉‹ÜÙ½߈Ù½߈™‰kß [ïS¯à™ăˆŸ;këö¡È™‰kß [ïS°»ĂÙÛÄÓµØóǧô£Ø±»Á½ÏÔơêÂÙÛ«‚ ½9ăˆŸ«‡“Íj‡½Ǽ“ƠíÚÿ¯¶ùꃕŒ™‰kß [ïSó#©&°»Ươå̉ ÏÔ³ŒÛ«‚ ½9ÑÓÓÅ߈ï½Ûºơ\ÙéÓơê£Ç™ëéåư‡±ù1«éÛ«‚ ½9ï»—¶“ƠÑÓ£ ‡Ûù×ÏÔ´Èö¯×¥ĂÎ̉ùùêëöù‡ÑÄëỞÿ$½¾Å¹Ú©‡¥2ßëM±û…ôµ!éôù×ÙÅëÑÅĂÙƠű»Û«‚ ½9ºÙÚäĂψ£ØĂÈ̀ÓửÅØóÇóÂÓØ‹Ç°»߈ÏŧԽđÿ򾯴ˆ]1ƒvăơ±»±»½Ϻ°»Óغ̣¶'Û«‚ ½9¯ÜŸÅÑÓÛº£Øă¼ÈÑÄë’ºöÄÓ +ƒv‹ÜăˆŸ߈‡º«ÚçœÍÓÏÅ¡Á9¥‡ă½¿ÅûÀöáêôê¯¼ăˆŸ;·ÅÚ +ª +‚ + + + +¼9 +ëÔ·Å«‡“Íj꽩‡¥2ßëM˧Ӻ˜‰j̃ZîSÅÔÛÀÙÚ÷Ù±½ƒ›¾å¼ ¾Û«‚ ½9›¾Û«‚ ½9Ûº‰¿I˹9¥‡×ßÄÙ›ÚßÄÙÑÄëÎÅ¡ÛÈĂĂƒÖ߈­Äºç̃§ôÊÇ·¼Í7¶‡Ö8æÁ¹©‡¥2ßëMĂƠÙŒë*«ơÔ£ä¸Ú騫×ñ»™‰kß [ïSï ă»¸Ø¹ßÄÙ΋ȩ¼‹Ç–»­÷»½Ü¯¾¿‰âˆ߈ª¼ï³2±ëØÁƯá¬Ư‰é­Ø½È°»§ƠÁ¹«‡“ÍjßÚçÔ¡ĂÙ¯×éêăˆŸ;­ÄÛ«‚ ½9ưtÿ¸÷Á©¼ù×ăˆŸ;“ƠÙÚ³ºó9¥‡øêù×ñÚ«‡“ÍjơÔå̉ ¶ÔÛªÓç4ÙÚ±̉Û«‚ ½9‡ăÛ«‚ ½9çÚ™‰kß [ïS´À±»ÓÓ÷Á½‡ºËÉ9É̉§ÔÏÔ·‡‘×8çÓÅ£áå̉ ÏŵØßÅ–¦̀»Û‡ûÈà »Ø÷‡ñÓçƠÛ«‚ ½9½‰¿IµØ•Âùê‘ơ±»±»™ëéå½±»±»ш©ˆåöíÖÇĂÇÖ/Ơ´±»Ăô“Ơ™‰kß [ïS×Ú“¹ƯN÷Çû匿Nºy°ÁöÁ±»©º“¹ƯN­½¼½€ñÓ±»÷Áƒv߈ÂÊ ÊʬʰàÊÊèMʽçô½³zơlÅØÙÚƯÇÖ·Ó ¥0ÑÓÏŵؘ‡•Œù×ßÁ“ÈÁƯ¥Ø§Ó߈ơêíÁª‡’̀jñÖơ»ÑÓ¨Çù×§áƒv¾ß§ôÉ̉…¥‰ÍL…“¥›¶éÛ«‚ ½9¹ÚÀĂƒvù׉;ºÇ�ó87¤‡7Ö.óÇÜÓ ±»¼Ü·ºÿÚ»ØïŰ»·È8¤‡§ÔÙ»·Ü«‡“Íj9¥‡éö±»«‡“ÍjăÁÏÔÛ×ÿ¯¶ƠºmüÀ ªø¸Ú߈é‰ñ5ñ·»‡ºÙÓ߈°»ÁĂ×Ï̉±»ÏÄ™‰kß [ïSï³2³ºóÙÚ±»߈éôêóÔºߌÛ,ø×¿ßŸËÓéºƠ9¥‡í—G¡ÈĂÛ«‚ ½9íêÂÙèº‹Ç½Ă°»₫Ú¹ÑÓĂÆ»«»Û«‚ ½9߈Á¹Å–›¶éÍË)éÛ9¥ßÚù꛹¡Ô±¿Û«‚ ½9ù×ï⪇’̀jÍÄ«»¾ƠĹڙ‰kß [ïS㮫·3uU߈Û«‚ ½9Û«‚ ½9áêá —¶«‡“ÍjăˆŸ;ºµØù×ÏÔ‡ÇÁÂẲẸ̈ÏÅÛ«‚ ½9ù×Á̉Á̉…±»߈ä̉ƯÓ ¡ÁûÓ÷¼±»±»±¿߈uÊÓ˹½Ô«‡“Íjó¶Ե؉yù×·‡‘×8çíơ¾‡“ÑŽ¿‰ăˆŸ½ÑŶ½©ÜÇÛ§ôƒØÇ™Ô¥È™‡ÅỖ„™‰kß [ïS«»‘ë£ØÙ½߈Ẹ̈‡“öơ½€©Ç¥ºăÇíÑÄëƠûÓ›¶éï½óÔÇ̉ÿ¼›¡©ÓÙ½·ÜÏ̉™‰kß [ïSƠÄß¿́ñÖÏÔ·‡‘×8çñÚ¡ÔöÁó°» ÷Á÷¶ÓØÔX߈±»±»­Äº¸à߈‡Ç·‡‘×8ç±»¾ëö‡Œ°½›¾Ù™‰kß [ïSå×߈ÙÚ‹Ç麾ÅçôĂƠ߈©ÜÙ½¡’ăˆŸ;ăˆŸ;ƒvnù×9¥‡×ÍÄăˆŸ;óÇÙׇÚ߈ÿÚߌÛ,‡ÍùׯÜ辥حÄéÓÑÓ¡Ôơ…ÏÔ·‡‘×8çǼ”ñÂÙ§ÔơÔ¶¼̀7‹ÜóǤˆ\0Ù¥«‡“ÍjĂÙÛºü¦†½çÚÁƯëö™‰kß [ïSƒvù×ĂĂ™‰kß [ïS÷‡·Üƒv·Å¡ÔÇĂ—Ó³î×Ơ†7§j±»Û«‚ ½9‹ÓơêïßóǾĂÙ©ÓßÄÙÑĂÏ̉‘Öô‹Ç¡Ûù×ĂÙíêưÀ«‡“Íj‡¿Ư“Ø̉́½ÏÔË¿“ +…»éÓ™Á¢ä9¥‡ûÏÔ™ƯăơÏ̉ÏŃv±»›¾ø×ƒ…ƒv•Œ¡ÁÛ«‚ ½9œØặщï³2÷Á¾±»¯ÈÏÔÇçÅ¥÷ÁƒÖ߈ƒvûͱ»ëö­ÖÅôù׿í¡ÛăˆŸƯºưÀưÀÀ¹߈«äù×¹ÚÅĽۘ‰j̃ZîS/‡x…%øơ¹£ùׇǿ¿¹öƒà±»½đÔ—¶™‰kß [ïSÅ™‡ÿ.—¶÷å5ÓÏÅ·§D ăˆŸ;±̉߈èn ñÁ™ëéåƒÖ½ƒvÏÔ°»ÿÚщívØ̉ăˆŸͺăˆŸ;¡Ô%ëÔŒ!ÙÚü×¹Ú½Û×—ÓÛ«‚ ½9‹Çɇ9¥‡·ÅÿÔưÀ³ñÓÏ̉ß»û́½ÑÄë¹ÚÏÔ§Ó÷Á¿»Ă—»½́ơá=ÏÅ«‡“ÍjÛ«‚ ½9é‹ÇûƠ‹ÜƠ´ƒ7©¼ơ»ûÓơØÏÅ«́ÿÂÚª‚ +¼9Á̉ơêÏÅơêÏÅñÚ∱»ơÔỞà9¥‡½€ơÔËÀ»±…»Ë̉³Ơù׌ƠΈÓÆå̉ ½€Ž«·3uUÂÅØ·‡‘×8çÆ·‹×ĂÍË)éÛ9¥ĂÓºăົūу½‘ơ¹ÁåÖ¹ÚÄô¾™‰kß [ïSă»›¾̀Dzº̣Ơ±»µ‰ñÆ•î› +×¾Û«‚ ½9©§ÆÇ̉Û«‚ ½9Û×ùêƒÖâḈ«»•ÜרùבàÛ«‚ ½9ù×èơ ăĂ3ăàÅ̃ˆ«ÑĂÙ÷¶±»™Ó¼ô¹ÚĂÓÛ«‚ ½9ù×ÍË)éÛ9¥£äÂÙð½‹ÇÁƯƒˆ’ƽ—»™‰kß [ïS¹ÚñÚù×ÇÓ߈Å–”ºÇ̉ÿ¯¶¼·‡‘×8ç©ƠÍÓ¾À‡€è/Ö:­¾³ „‹Ü£»ùꙉkß [ïS̃Ó'§Ô·‡‘×8ç9¥‡×éº8€¤‡€Ö‘ÆơèÅ“½µØăˆŸߌÛ,±»•×ăˆŸ˸“Ơ›¶é©‡¥2ßëM‘¢÷Á©ÇưÀÏ̉»·Ôù×¶ñÔƠX©Óöψƒ½߈½Áø×±»½•Èû›§Ôù×ỞŽ÷Á»Ø¤ˆ\0ºñÚ£ßÅØöÏÄ—¶±»‡¡¥‰ÍL…÷‡­Ö½ù׫‡“Íj•Œ½€½Œ˜Óơê9¥‡Ï̉9¥‡£äÍƠ±ëØÂÙÛ×¹£ăˆŸ·Ô¹Úơ¯¼߈·Ø™ơ—Œ½€ÇÖ‡ăÎÔ•Üɹ̀½ơ꽃֎ÏẠ̊¶÷Ôåô¿ºûÓׯöÍĉ¼Ô™‰kß [ïSŸÖÁ8¤‡×ăêÑØăơ÷‡¦ô™‰kß [ïSăê߈É_‚Øù×™Á–ÖơÔ÷ˆ—»ÁÖ$µaĂĂù꛾“Ƙ‰j̃ZîS¿º¡ƒÖƠ±½©]Á¡ÁƠÁ¯éÓªÚ™‰kß [ïS½$·ÅÛ×ă»Ù½߈©‡¥2ßëMéºï»¹Úƒ9¥‡×«âóÔ÷Á߈ǼĂ߈ơèźث)Úª‚ +¼9…ÚÂăˆŸ;ÚדǕŒÍË)éÛ9¥ưÀÿÚ›‡ÑÓ÷‡¦ÓØ-‡̃Û«‚ ½9ưÀ÷Á«&ƒvźăˆŸĂ ăˆŸ;Ù½ĂĂ ›­±àéM¡Û‚ˆ×¾ÈĂÛˆщµÏÍĂ§Ô³ưÁ­Öù¿¹Ú›¶éù׎ŸÈ¡›¾ÙÚăˆŸÑÓÓÅ8¤‡Öôêă½»™‰kß [ïSƒvÙ×°»ơÔ߃ˆ¾‹Çµï¡»ăàËÇù×çÚñƯ‰Û«‚ ½9ÛÚ›víÆ±»ùêëö†ºñÚÛ«‚ ½9›¹ÑÓ߈ɇ°»öỞíºÁăĐÓÍĂ«‡“Íj½€™‡ƒ×ơĂ«ÔêöÏÔïÚﻎڪ‚ +¼9÷‡áêÛÄÓ₫®¶ÿ¯¶߈ÏÔÑĂ…ÔÙ½™Ø“È‰Ă‡“ÈçÀ›¾öÑæôß„³ß»û÷Á·Ü“½‚½ơê¹´™Ô«‡“Íj¨ºáƠ©Ó›ĂĂ˜‰j̃ZîSäÁÙñÖ¾ºÔ9«Ô³å»Ó¿‰ưÀÏ̉߈¿½ÑĂ·¼Í7ăˆŸ;kÅÅ£»ù×§Ô‚Öƒ¾‘¾ßƒÚƃvơèŬ¿ưˆ‡Ç­ÔƯÂÅÄù×¥‹Ở«‡“ÍjµØ˹ƒvƯÂû(·ÔƠºm­ÔËÖ·‡‘×8çÁ½Ởµ‰ÉÜÛ«‚ ½9ëö‹ÇÿÚçÚƯÓ €Ơ°»̉ÆåĂ¯×ÁÜĂÈÏÔå̉ …ôăˆŸ;9¥‡ÏÔÚª‚ +¼9˜‰$j$̃$$$$Z$îS$°̉Û×Ù‡­9ÍË)éÛ9¥ÛºçÚöûÙÏÅ«‡“ÍjÙÚÛ׆ŒĐÓơÔÛ«‚ ½9¡Ô™‰kß [ïSưÀéÓ½ù×Ç“±»ÔXË̉Ù—ùêçÚóÔ½ívßÁ†$đ5$†ŒĂÙ›¾±»Û×ŸăˆŸĂº”ÈúÙ½±»ÔXÊä̉ˆÛÄÓÆ̉µùơ“Èà ÿ¯¶ÿ¯¶›¹9¥‡ÍË)éÛ9¥Á̉±»ëÓÙŒë*«ƒÖ8¤‡«‡“Íjª‡’̀jÄÓ¥Âçô߈©Ơÿ§Ù½¦ÓáƠñÓºÅÔ¹Á£‰‘Ô¡ÁÏųÜÍË)éÛ9¥ÍÇ©ÇăơÈĂ½¹ÚÛ«‚ ½9ăˆŸ߈•ĂÙ‹Ç«‡“Íjăà»ĂµØµyÖ°»Á½‰ÜùשØ9¥‡¹ÚÛ«‚ ½9ÉĂÏÔƒv½ÔµÂ±»«âçÚ°»íơî²2ôå̉ ±»‹Ç™‰kß [ïSÙÅëµØ±»©‡¥2ßëM”Œ™Á™‰kß [ïSG½¹Êñí—G†a§Ô«d¡ÁׯíÆ©Ó9¥‡Û×ù׈Ø9¥‡ÛĂăˆŸ߈¡Ôív›¾ƒv±»ßƯéÚëöÙ½é×ëÅù×Óµ±»«Ô™ÁơÚÑÄë±»¨ĂϼºóÇ«‡“ÍjáÂæÚíÖ¾ÏÅÿ¯¶óÛºßÄÙ÷Á®¼ûßÄÙ™‰kß [ïSƒvª ¶ 2 t T –¾çôÏÔå̉ ¡Áú̉Û«‚ ½9ívùë‹Ç›¾ö« ÏĽ€½óÜÓ ÓÅ›¶é½ßÁ§Ô±½ÑÓỞ¡ÈÅÛ«‚ ½9Û×öµØ÷Á±”©¼ăơ·ÔÏÅ«Â•Ü‚Ô‡ăµ‹ÇÍÓƒvåÁ¦ÔÏÔ±»ÏÅØµØĂÈÿ¯¶©Ó·Å¼ׯ½öù×ỡ߈ÓÅ‘ÆÄƯº™‡½°»ÍË)éÛ9¥ÜăˆŸ;ơÔ‹Ç8¤‡Öêö‹Ç—Ú9¥‡Ùă½©ºÁ¯G‹øÅĂÇÖ߈³ØÓº±»ÉÔ‡x߈˜‰j̃ZîSÏ̉߈Ù×±»Û«‚ ½9ÿ¯¶¹̃ĂÙóÇÙÜÛºÿ¯¶ɇ»ÛŸÈƯºăÔÏÅ߈ÀƯơèÅﺣÇúƯÚ»ØÑÓ¹ÚÛ×±¿Û«‚ ½9«‡“Íjù×ù¿™‰kß [ïSíÛ½ϼ¬ÄÑĂ™‰kß [ïS߈ëöùëöƒvÁ¾ö·¸‰¿Iƒv÷ÙÏÔá ÿÂöÙ̉ÍĂñƳؙ‰kß [ïS¹»Úª‚ +¼9©ÓâÁ˴߇龋DZ¿Ñ·ÑæªÚáƠ«»Û×§Æơºç̉ÇÅÛºăÆ·Ü߈ϼ¹»½ƒvÙÜù×·ÔÅØÏÔäĂÏÔ›¹·Ô­ÖñÓµØù×Û꫇“ÍjÅØơĂ¿ç½€âÁ­ÄñÓ£»±»™‰kß [ïS«‡“ÍjéĂ«‡“ÍjĂâ§Ô߈«¾ăˆŸ•DZ»³ÓÛ«‚ ½9µØơÔáꙉkß [ïS̃ÄØÙ½ƒ¾‘¤×ù½Üá=Á•½ơÔ÷ÁÛ«‚ ½9ÑÄë½ĂÏÅđÄ +°»÷Ú߈å̉ ™ÓçÚ±»‡ÏÔ¡Áù‡…—¶­½¼‡ÏÔÛ«‚ ½9µØ±»ñíȱ»ƒÖÙÚ߈‡øê‡ăˆŸöÇ%½•‹Hù×¶½±»«‡“Íjù¿áÍƠÅôăˆŸ̀Ó2«‡“Íj½óÇ™Á£Ôµ†ăˆŸ;k9¥‡åÁ‰ÛƠ½Û«‚ ½9½¹ÚÏÔш¿‰éꃈ˜êèäÏÔ“ÆÊ뙇›¶éûƠñÁñÓ†Œ¿­văàä¾»ƒˆ9¥‡ÙÚ·ÜóÇëö…™ëéåÛ«‚ ½9äĂ«Ôùê¼Ú× +§ô¹ÚÛ«‚ ½9Ă¡ÔỞg¹Øäï¹öÙ×ĂÙù×°» ±½½Â‡ÇŒÅ8¤‡Ö щ߈¨¼ôÙ-9¥‡×ºÿ×µaô¬¶Ù×ÖĂư“™‡²(ăˆŸÍÓϺå̉ ƯÙÚĂºÏÄ¿‰ơꙉkß [ïS÷Ùˆ“ȹÚé«ÔáÅ‚v +ß„©ØôƠÅÓÏÔ߈¼Ơº‡Œ₫½ëöï»°»ăàÏÔ·‡‘×8ç¸Ø›¶éçÚơÔß½ªÚØ̉®¼§Ô߈‰¿IơêĂÙ¥‰ÍL…Ö¹ Ư•ŒçÚ麽‡Œ˜‰j̃ZîS½QÖºâÇÖơÄûØË̉Ăºÿ¯¶á ăˆŸ;Û×Ç™‰kß [ïSƒÏԣȫ‡“ÍjÓÛÄÓ«‡“ÍjÛº«º¶èÓÆÏÔú «»9¥‡ù×—¶™‰kß [ïSơê…ŒÙÚÂÙͼñíÈÛºÏ̉±» Á¥¾ÏŽ€ÏÅ¿»‹Çù×ÍÄÏÅù×߈9¥‡Åે“ÍjÏÔơÔƒµØƒv°»±½çÚÛ«‚ ½9Á¸ÚÁ̉Û«‚ ½9ÿ¼ĂÙ÷Ú«Ô»‡Ù½ÏÅ©‡¥2ßëMÿ¯¶ÁÙÁ‡é/×:ĂÙ¡ÁƠĈǗ»âÁÿ¯¶›¾ôꎵ۾™‰kß [ïSª»Ơ€âÁơꙉkß [ïSÅÓÛˆ«‡“Íjñíȱ»Ă œÜÏÔĂĂ߈¯G‹øÍÓ9¥‡½ëöË̉©Ç—ÖƯºÏ̉•Úù×́ơ9¥‡Ú׃ˆĂÖ½Ÿ}©ëö€›¾±¿«ÔŽïƠ™Ô›¾ŽÍÄ™‰kß [ïSà¬ÿÚ·ÔƒvÏ̉£»ùê»yƒÑ·×¾ÓÅ™‰kß [ïS¬Äăơªd¾ß„—ˆ±»é‰ñ5ñ·ơêÁñø¼Ă…ƠY÷½ưÀ”½ÛÀÇÖÂÙă߇Œ·ÔǺö±»¤ÂíÖÓÔö‹ÇÁ̉ÑÄ믾‰¾—»«‡“Íj80¤‡0ÖÏÔ߈Ă½ëù×¹̃Ï̉’öëöƒv§Ø߈³ä߈ÿÜ™±»“ø«‡“ÍjÙ‡Ï9…ù멇¥2ßëMïƠÎ̉ËƠï½åŒ¿NÉèƠÏůڪ‚ +¼9±ÁºơlÙ½ù×£ÇÏʼnÔáÅ¿‰—¶—¶«‡“Íj§ÆÈíûØÓºÍÓñ«‡“Íj±»ÛÚăºÍ,9¥‡×¹Úív¹±»Ž·Ô©‡¥2ßëMăˆŸ;ơÔÛ«‚ ½9£‡÷Á¹ÁµØ²ríÆϹ­Ä‰¿I‡ºỞ߈Ÿ¡ÏÔôåô¿Å«‡“ÍjÁ‹Û†Œ¡ÈÚ×ÊÙ‚Ö·‡‘×8çÛ«‚ ½9ÛÄÓ¥ˆ]1ÎÙüæ±»ùר¼µãˆÓ´ÊƠỔ‰¿IËÉ9ªÔù¿½‡ÅÔ™‰kß [ïS™‰kß [ïSÑØØY±¿ơº—¶ñ¨±»“ƠÁ‡é/×:·ô³Ơ­Ø‹Ç§ÔßæÏÔÁ½«‡“ÍjχÏÔ÷¼¤ØàêûñÏÅÙ½°¿ Ë4ơêµaªÛÜ-ÂÙ÷Áù×½€÷Áăà™‰kß [ïS¶èµØơÔ–Œ…ÖÛ«‚ ½9©‡¥2ßëMÙÚÆĂàßÚµØçÚÚª‚ +¼9¾ñÚ̃ÚñÓƠÛÚ›Û¯×ăˆŸ;„¯³*±»߈ăˆŸ;k«â߈ÑƠ·ÚưÀ¹Úöơ$ăˆŸ;·‡‘×8çŸÛÁàæÚ ù×›‡·ößÁå̉ çÚ—¾øê±»ƯÓ ÷ÁÁƯºy°»©ˆí¹Ơß»û„ÖªÔ»Ø߈³ ³Çµ‰™‰kß [ïSó¶ƒvÙ½³Óƒר“Ơ©‡¥2ßëMÁ€›‰—¶›¶é™‰kß [ïSÇÖÁ¯Ơß½߈ͪ麙‰kß [ïS Ëû±»×ƠùףȽô™‡‡x·Ô°»Ú× \åÁïź¡ÈĂÆ½€¸È‡߈‚v·ÜÙÚÄôáÛ÷ÁµØ9¥‡«‡“Íj‡Œ¡ÈÓÆÇ虇®Gøù×å¿·Ôù×ñÓ—»ăº9¥‡¶°¿Û«‚ ½9™‡ëö‡xåÁ™‰kß [ïSñÆèºëöÅĂ—Éƒvç’¿‰§âÅØơêívׯ‹ÜéºñÓùטÓÙÚÑÄë̀Ó ÂÇÖÓºÿ¯¶ù×ÑÓ±»áê½À¹߈ÏÔÏÅ¥ˆ]1Ë̉èơ«‡“Íj½ù×߈§ô«ÚíØĂÙ‡æï½½€º´Î“ÆÄØ߈ăˆŸ;ƒ×‚vùסÁÙ½Úª‚ +¼9ăˆŸ;kÛ«‚ ½99¥‡Ÿ'ơê¼ô‹Çª‡’̀jöÏÔ½Ă½Ù½ăˆŸ;ψ›Ú±óÇÎÔ8¤‡Ö‚×ó˽ۺ·Å¾ßç«»ׯÍħÓăˆŸ;ƒv±»ĂƯƠX«‡“Íj£È«‡“ÍjÈ)¥ù׿´†ù×­ßß÷‡ÍBƯÓ ›¾®»ÓçÚ§ÔÏÅÙÚ¡³³ÆƠ™‰kß [ïS·‡‘×8ç·•·ÔÂôºy³Ø™‰kß [ïS߈«‡“ÍjÏÔÑỌ́ĬĆöëöơêéʇºÅØÔơÔÏÔù×éö‡ÇĐÄê߈½ôÙ½ÍÓ9¥‡×«‡“Íj¼ôé Û«‚ ½9ø¿öÁù×ÿÚ«Ú©ÇíƯ±»ăˆŸ;k¾‘ÏÓñß–ª‡’̀j¸Úùơ—ˆơÔ™‰kß [ïSçô©‡¥2ßëM…ƠưÚø¼«‡“Íj­¾ÓØ·‡‘×8çχѶêơñêĂÙÛº™ôÛ×§ÓÈĂÅ«‡“ÍjÙŒë*«©¼ù×ÿ¯¶ÓԇNjÇÙ½ăˆŸÿ¯¶‡Û½ÈŸÅóĂ©Çù×±»™Óù×Ù½·‡‘×8çÉĂÏÔÜÓ ù×»ÁƠ›¾ưÀñÚÇÖƒṽ½ëö•Ü™‰kß [ïSƒvƒ8¤‡›¾Úª‚ +¼9Ù̉™‰kß [ïS§Ø߈Ù½ÁƯÜ«‡“ÍjĐĂƯÓ ÿÚßÏÓÛ±»߈Û«‚ ½9¿‰ÑÓÙÚÓÅöÁơÔ…»ÿ¯¶í‡ÑÄëÙÚÛ×ùןř‰kß [ïSưÀ»Å⽫»½€ÓØûα»ÑÓÙ½„ÔĂÙçÚÑÓ‰¿I©º‰›ưÀ¥ˆ]1£ä«·3uU¿ô±»€ºÏÅÏÔ¡Ôøêéºù×Ù¶ëö™‰kß [ïS߈ñÓÛ×±¿ÁƯÑÄëÚ×9¥‡ßÁú(ÁçLJÚÁ̉§ôăÁëöÏÄÂϹûØÈ̉™Á˜‰j̃ZîS“ăˆŸ¯¼á¬ÑÄë·‡‘×8ççÚûÛ«‚ ½9øê„nơÚ̃Ú ÿđñÚÏÄÓÆß»û¿¹Ü«‡“Íj›vÿµØÁĂûØßÄÙ•æ±»ï»ƠX¯È·Ó ¥0³ºóÿ§™Áó‡ư髇“ÍjÏÔå̉ ™ÔôƯÓ ÿÚ­Äëö‹Ü¹ÚËÉ9ƒv·ØÏÔĂÙƠ±™‰kß [ïSëö©‡¥2ßëM—ØŸ}¡Áù×Ơ¾Åƒàëöµa©Üß»ûŸ¹øô+ù×߈ÏÅèêÜÑÓgËÉ9ß»ûăˆŸ;ăà⺃عÚÛ9¥‡±»®ƒvï’´ÈĂÙÏ̉§ôÿÛËÉ9߈Ù½ù׺Ó.›í·Ô½µ&ƒvăˆŸºÇ‹Çù×ív«âÇÓ¡Ô·ÔĂ£ÎÅ̉ºù+ÛÀŽÛ«‚ ½9ÏÔ¶÷Á±»×¹ƒv™‡ơl±8¤‡™‰kß [ïSăêºăˆŸÙ½ÏÔ«ÔƒÖÙ½˜‰j̃ZîSƯψƒÚ«·3uUưÀ·ÔÏÅÏÔ¡»Å£Ø߈ăˆŸĂív¥ˆ]1çÚÙ½ÛÄÓÛ×äđÛ«‚ ½9‡ƒÖÏ̉éºÁ̉Û«‚ ½9ᾟ³߈ƒˆ±¢½ôÚª‚ +¼9߈ăˆŸ™‰kß [ïS‹ÈơÄ«‡“ÍjñÚƒvëöª‡’̀j¶º ÿ¯¶ôêÙ½åƠ§Ø³(ƒˆßôÛ«‚ ½9ƒàưÀáӓȋǫ&ôꙇ9¥‡ăơéê₫`®¶`ƒ½ϼăĂ›¾߈¾ÙÓ̀Ê)èÛ8¤ƒÖ³¾ͼÖ¹ïÅ9¥‡Ç‡±ëơÙ½¿ßù×Ơ©ÀƒvÛ«‚ ½9Ơ˜×ßçö”Œ«Ô›¶é±»ÏÔµ†ׯÍÓÔX¡ÈỞ›¾“ÛëÓº Ëû‹Ç߈Ê©¼̣ÇÂÙ±¿ù×·ôÏöôÔÇØ8¤‡™‰kß [ïSÑÓăˆŸ;kÙ½ÚÑÄë½™Û³”߈·Åº©ÇăˆŸ;ă¼߈ỞÅŸÅÿ½ôƯÂÁ9¥‡³(ÑØß„â ăˆŸ;ƒà¥ˆ]1×Ơơ굆Ï̉ô­¾ù×Ơ½€«‡“Íj–¶ăˆŸ;küÀñÖÁè¾ Å»çô9¥‡ÏÄ„ÂÛ«‚ ½9ø×ÁƯ÷ˆÍ±»¹ÚÅÓ¾ß̃vÛ~£ÔÏ嫇“Íj£»Ñ*ÉVöÁÁƯ½9¥‡×ßÖù×ÜÔƒơ‰¼£‡áº·Å߈ñÄ§Æ­Ă‹Ü½߈Û«‚ ½9É̉‡ºÁĂÏԩǵؕÈû›ϺͧôÛ«‚ ½9·‡‘×8çÛ«‚ ½9ÙŒë*«±»Û«‚ ½9ñÓ•ŒßÚ«‡“ÍjëöÏ̉ơ߈ñÚÛ«‚ ½9ăˆŸׯ·ÅÛºYÛ«‚ ½9Û«‚ ½9«Ñ³ºó¾Å‹ÇºËÇß»ûºyĂÙ߈ºµvç'ëö™‰kß [ïSódž½†ºÏÔ©æôéÓñÖơꉿI™Á½™Á§°±»Û«‚ ½9‚vëöµØ߈•¾߈“Ơ÷ˆï³2ŸÖ˜‡ÛưÓëöîDÇØ‡x½ù×ׯÁ|ÿ¯¶ù꛹Ÿóe”ÈúœÜÄô™‡Ûº™‡ÊÈ9Ïı»‰¿IÓ̃ơÔƠơ±¿›¡Ϻ·ÔĐÅ“¼ƠÚé×öÀ̉9¥‡ÏÔƠơê—»‡Û‡ Èº Ö†‡ü2ơĽù×߈÷‡íê·‡‘×8ç£Øù×á=ÙÚÛ«‚ ½9‚ÚívˆẳÅÔѶ£äÜăˆŸϹÁĂëÓ›¾ç̉Ù½ÏÄÑßׯ¥‰ÍL…é́«‡“Íj“Ƚ€ù‡ÖØ«‡“Íj‘Ö±»ÑÄëŸ\8¤‡ƒvÁƯ‰¿IûÓÏÔ½ăˆŸ;éÚăÁ³Î Λ¾‹Ç­™ơưÀ±»µØÓØëÓö½à½€çÚ›¾ÏÄëöç$Û«‚ ½9±»ÏÔ“Èù¿±»ÉÖƒ×߈¡È³¿º«‡“Íj¯ƒßͯ¥'=U#QK¯ÂÙ̉ÛÆ™‰kß [ïSÛ«‚ ½9ăÁ»½³ƠƯ‰åĂ™‰kß [ïS©‡¥2ßëMÓÂÙ›¾ăˆŸ;߈9¥‡ÏÔơêÍƠø ù×Û»·‡‘×8ç‹ÅØ™‰kß [ïS¡Û®å̉ ơê—¾ñ÷Áƒv“Ẹ̀Ô߈ùש¾¥ÖÛ«‚ ½9æ̉ßÄÙỞɹÓºÛ«‚ ½9ĂÙÏ™‰kß [ïS·ôù׃ÖË̉ù×̉¼úƯ…ô»ªºßæÉ´·ÜÅ»ëöé’·#åÆáƠ­R׿8ù׃ÔåÆÖ¾8„aÍÓ×ÚÏÅù×Ó¸ù×ÿ™‰kß [ïSି‰°¿ Ûº»Áä̉߈·‡‘×8ç¹Úîô¡Ô÷Á¡ÈÏ̉ƯÂïÅ£ä‹Ü…ôŸỤ̂«%߈ĂĂ ›­±àéMå̉ ­ÈƯ¼½ơêÁîƠÏÅ•ŒöÁ₫®¶ͪ¹Ÿ±»±»™Áù×Ơ₫ﺡ¼‡ơê­Ö™‰kß [ïSßÄÙŸŒµß²ÂÅØ¿»ß»ûÑÅéºëÓăˆŸù×·ôùê±’É̉¨îá=ùêù×¥ˆ]1ëö¹ÚÏÔéºẨÏÔ·Ó ¥0í‡÷Á9¥‡ö’Çù×”‹œHƒvƒĂ·̃·‡‘×8ç߈̃»ú›¾g©÷ÁÙÚöµC™‡•€çÚåĂ÷ÁÏ̉éÓY¹Úù×ƠơÙË̉Ơ¶ª»—»°»©¼µa—¶ÏÔº°½ÅØÙ½¾±»߈∙‰kß [ïSù×ÁÇŒÇÖ¡Ôö€ºÑÓ£ä¶ÏÄëöó°»ăˆŸ½Á×±»¾¹x­Ö‡ºâˆ:jÏÅ•Üơ$á=Áר.ÉÙ‚Ø߈ÅÂù×êÚ¯G‹ø₫·‡‘×8çö÷ÁẠ̊ăơ5߈Û«‚ ½9߈ăˆŸƒvù×ÏÅ—»ßƯö¼ÔŸ}œ‰ ¾I ƒÖăˆŸ;k™‰kß [ïSÿ¯¶ăˆŸ;Ϻ°»ÑÓçm‡Œ©¼Ÿ̉ÇÖ¥‰ÍL…ÏÄÛ«‚ ½9¡È«ÚăơµÛÅÓ¹Ú…ÿ¼«‡“ÍjŒ¾Ù½߈ߌÛ,¥Ø•ÇĂÈơêưÁ×¾±»ÙŒë*«ï½‡ÇĂÙ­Äùܵ߈ׯ˜‚ăˆŸ;ăˆŸ;¿º±Ư·Ó ¥0ÅÓăˆŸ±»Û™‡±»øê +ÏÔ凱»Û«‚ ½9ĂºÇÖ•×€ºÙ½ëöó|ơèÅ“ƠÏPÙƠóÂï½ơèÅ™ß÷ÁÏÅƠơèÅ«ÔÍøÉ„߈ÏÔÅÓ÷ê«ÔßÚ‡“ª‡’̀jÙ½ù×­ØÂÙ ËûĂÙ«ÔÛ«‚ ½9‡áêé‡ƯÓ ¹ÚăˆŸ;ĂÙáƠÙ·Ó ¥0ƒv߈½€·Åù×öơêÍÇưÀÏ%ÿÚéô­ØĂºƠ¼ÙÚº©Ø­Ö·ô›¡ׯ«»º³(‡xÏÄùê£XăˆŸ;×ÓíØ̀¶‹ÇÇ™‡ÁÄç³Û«‚ ½9â Û«‚ ½9Á¼™‰kß [ïSÅØÿÜÙ½‹â₫Ûù×ùơï»Á¼½Û×ÇÖ°»‡x±ƯăˆŸ;¿ÔÁă½Û«‚ ½9߈©‡¥2ßëM±»ơêÀ¼§Óϼëö匿NÏÅ̉¼¨-‡ÇØ̣ëöÉΡ»ç½Ï̉¹Ú±½×Ú™‰kß [ïS£ÇÅØÇ»©ØÿÚ¿‹È0¹Ú¡™‰kß [ïSù×½€Û«‚ ½9À߈Ñæ¡Ô“ÈÍÓå̉ ÿuÿÚôØʹ¡ÁϺº9¥‡§Ô™ĂĂÙñÖ÷‡Ú½߈ñÓÇÖ¹‹ÇË̉Û«‚ ½9߈‹Ç߈ăˆŸ;Ñ̃ƒƒˆÛ«‚ ½9ëöçÚ³âà É̉9¥‡×­ÄñÚŒÅ·Ó ¥0¶‡Ö8溭ذ» ŸÈ›¡Û«‚ ½9½€º›¶éơê¹Ú³àăˆŸ;ăˆŸơÔéºÚª‚ +¼9Íľ‡ÛÁ̉«‡“ÍjÏÔ±»‡ÚÛ«‚ ½9Û×ÿÚ¹ÚÏÔŸë“È9¥‡×ùוº±ë؃½±»ÏÔ¹¼߈¡Á—½߈³Â½™‰kß [ïSĂĂ™ÓÅÓÏÔ8¤‡×Ä’“Ơ‡ºỔû̉Á½…ÛóLJŒÏÅ•Èû›ĂپŻƒíÁç̉ªÚ¯G‹øÛÀ·‡‘×8çù·ÙâÏ̉–¿ù×ï$ÉíơèÅóÔ÷ÁÛ«‚ ½9×ÓûĂ‹æ¬Ôù×߈±»ùº¾÷ÔçmÏÔ›Û߈ÁĂ9¥‡Ûº£Ô‹Ç™‰kß [ïSÁƯ’¹ÜNÛº߈°»£™×Ơ†7§j«-•×¼Ă ¾˜êèä¾ÛÀ…ÂëÓơƠ«‡“ÍjăºÏÅ«ºÛºÓ¿Å—¾ÏÔ¯ÈĂ莙Լ íÆÙ½˜ ê è ä ½Ù½ÑÓ·Ôµ‰9¥‡×çôàƠ#ïÚĂÙ÷ÁăàÓ¾›¶éơ$û“¹ƯN¿¾±»¼Ô½‹Ç·Ô·ÔÍÇăºÄÔ»G½¹ê§°»ơ$¹ívÁƯ߈ÏÄ“Æ߈í—GµÏͼß„«»•{ƶÔÏÔ™ëéåçôàöÛ«‚ ½9½ÜơơêûÓ›¾ơÔë˜H-ơÔ߈ ÁƒÏ̉÷ˆ±¿ß„½ÅÓ¶Èơê¡ÇÍÇ×$Ö̉4ñÓé¶ÔÙŒë*«ù׫ï»ôăĂ3ù×ÏÔ߈ù¾˜‹à ƒˆ¼€©Ó‡ù׫&—¶“ƠÅÓ™‰kß [ïS8¤‡Ö §Ô«Ó—»ơԷŽÔăˆŸ;âºỞ½€ă»ÏÅăơ¨Çƒv߈߈·ÔƯÚ©“«‡“Íj±»·Ó ¥0û(ÛÚ«»‹Ü߈ÙŒë*«½É̉·ØͼöƒvÛ«‚ ½9Û«‚ ½9ơêăơ˜êèäơꂿ߬Ա»™‰kß [ïSĂèäôç¿ß‹Ù·ïÏÔ¼ Ù½ơÔ«‡“ÍjÛ«‚ ½9ÑÓÛ«‚ ½9çÚ©¼ÙÇ™ô‰¶ÅĂƠ™Û±»­Ôƒv¾·‡‘×8ç½öª»«Ôå¿ÅÀ¸ÚÑÓ±»ơÔû¼ơÔăˆŸ;…ÚÙ½ψĂÈ•Œ‡ÛÅ—Óáçö߈éÓ¹Ú‡ºÙÚă»߈ÏÄ©Ø½Ă‹ÇÛ«‚ ½9ăˆŸ;°»±»«Ôß»û“Œ₫‡Ç9¥‡ÏÅœ‰¾I#©߈·‡‘×8ç‚vù×÷Á‡­ÖƠ«©ơÔƠµ¹ÚÎ̉×¾ívÏÔª÷µØ¼Á́ºù×½³߈ơûăơưÀ³êÚùêơÔºÜÂÔÁư”ÜÿÚ¿ØÙ½î»³ÇăˆŸƒ¾‘ù¿̃“‘ÆÛ«‚ ½9ëö—¿‰Û²bñíȃv±»½–¾™‰kß [ïS»ÜÉ9á Û«‚ ½9ƒvóÂÚª‚ +¼9Ư¤ơèÅ¿à›¾ƒv«‡“Íjơê¡ÔßÁÙÚñīԽ©‡¥2ßëM¥Û߈Ë%ỞÅØéº“¹ƯNñÓ±»¥Ù³½ËÉ9éê‡x°»á•ó×ßù×á=ÏŘôĂÈ߈Çùן}éJé‰Ó5“gesÁÅơ¿‰ë™H±»ưÁÿ‘ñ‡ÿ¼¬ơ®±»³Âƒv«‡“Íj½ôÅ…ôĂƠø×ϼéơê…§«‡“Íj˜êèä±»­ÄÓØ¸Ú¡Áù×ÏÔ±»­¾±»‚Ö§½ÏÅơ꿉ÊÈ9¯Èv©‡¥2ßëM…£­¢—¾ÛÀ°¿ªÚǺ§:¿½·Ó ¥0ĂÙÏÔÙ½œ·̉ ¤0—¾ƯÚëÚ¡Ôăà‹Ç¨‡¤2€̃êL÷‡ëö‡Û½߈ø×™‰kß [ïS›¾“̣Yö߈ÏÅóÇ߈¯ƠÛ«‚ ½9—»Ç 9¥‡·‹å»Á§Øëö¥Ö±»ר½ôêÁ½¡ÔÚ×ăˆŸ;ăˆŸ;±»½ô¿ç̉ƒÖ±»ÅÔÅ…ô‚vúÓ䌾NéÚ±»ßÚ匿N«‡“Íj·‡‘×8çÚª‚ +¼9«‡“ÍjÛ™߈‘ÆÅØÍƠ¡¢Çö™Ô¡Á¨‡¤2€̃êLéÓëöëö‹Ùƒv¶߈·Å—»‡xù×ßÚ½¯×™Ô‰ơå̉ ñíÈăˆŸ±» ¶Ô ¡Ù×°»÷ÁăˆŸ;›¾£àè‡ר›™‰kß [ïSưÁ°»ưÀ—¿“ÈÏÔÏÅơèÅù×ÏÔ¯µØ߈‚Ú³ăö—¶™‰kß [ïS¿»±»¿ôƠ´é¾‰Ûͽ¶  ˜êèä‹Ç™‰kß [ïS¹Ú±»·Ô8¤‡ÖÙ½̀Óư‡±ù1¡ƠÏÅÄôƒˆ%µ÷©‡¥2ßëMÛ«‚ ½9ÅÓù×߈«·3uU‡ºç'·Ó ¥0ăˆŸ÷‡›¶ẹ́ÇïÇÖ¦÷Á߈±»±»—Ó¡ÛñÓÑñµ½Æ̉  ¥ø×¹Ú߈¸Ú³”¡Á‡ƯÓ °Ó»ŸÈ«»¿à™‡©ƠÛ«‚ ½9%Û‡÷Áº±Èщ›¾™¿«‡“ÍjX«Ù—¶߈ù×Ă9¥‡«Ô·‡‘×8çØÛÄÓßÖƒv†xëö“¹ƯN³ºóóݽ·ÔÓÅ·Å·ôËÓĂÙăˆŸ·ÅöÁî»ĂÙú(ùëôÙà=Ë¿µáÿÚ× ÏÅ߈©‡¥2ßëM¹Ú¹¾‡Œ¶½¥ ‘«ÍË)éÛ9¥µa¶‡Ö8æÓÅÏ̉é꫇“ÍjÏÔ¢È ¡Û¡Çƃ×ÍĂù×Ù½Ï̉ÏÔ˜‰j̃ZîSñÖå̉ ÅÄÏ̉µêщ¡ÛñÇÖ‘ở̉Kä̉÷Á³(øêƠÍYÙ½ÍÓÓ-ßƯ©Ø߈ù×Û«‚ ½9¼ĂÙé‡×¾«ÔăˆŸúƠ¡»øêº½­̉‡ŒÁƯ‹¬߈ÁܵØÁÚíê©ÇÁ½́ØÑÓĂ›Ÿ¹ĂÈô«‡“ÍjÏÔƒvëöă½¹ÚîÅ•º¿ÅæôïƠ‘ ÑÄë–Œ́êïÅ߈Ÿæ³ëöÓºµaÙ½ºyö̉ÏÔûÓ÷¦å̉ ™×÷Ùëö¹ÚÄÓº“È×Ơ½¥ˆ]1éê“Æ«‡“ÍjψƒØ½€³ƒ×½û(ÑÓ߈‹Á›¾µØÁËÀð»áƠµĂƒÛ›¾ûÙëÓøê“áÁ¾ ưÀµÈÙÅëưÀ©ØÓ̉™‰kß [ïSùׯÖÑơÔ¡Á߈¹ÁÏÔÁƯăˆŸ¹ÚÙ½Û«‚ ½9ƠXéêÅÓÏÔ†Œù×ñ×Û«‚ ½9߈ÏÔ«Ô߈¹Ú¥Ç₫§ƒà¢ä÷ÁăˆŸ;çÚöÎÔ£Çó‰ÁÅÓ»ÜÛ«‚ ½9«Ú½âàÀĂÛ׾ߢÇôijĂÙ­Ö߈̀½ÈÓÅËÓׇ½7›¾ëö߈ƒˆó¶›¶é߈™‡¶Ơ«âÙÚ9¥‡ßÁ¿»Û×ß»ûăˆŸ;±»ùêâ¼éô©‡¥2ßëMóÂÍÓưÀÏ̉™‰kß [ïS÷Á߈™Á·‡‘×8çù×ÑÓÄôù×ă±»‹ÈÏÅÙ½ơ鿾±»°½Û«‚ ½9óÛÚÓ ™‰kß [ïSÏÔăˆŸ;k½¨›¾¥ÛñÖç½̀¬Hù×½™‰kß [ïSÛáÛ«‚ ½9ÍÓúÓµ†Ù½߈¥ˆ]1ÛÄÓ™ÔÏœȥĂù×™‰kß [ïS·‹°»¹Úö™‰kß [ïSĂÙ÷4™ëéå·‡‘×8çÁƯÏÔψƒvû(ăˆŸ;—§Í»…ÓëÚ‡Œă»…£­ÆÅÓÍÓÇ̉Ơ×Û×­ÖÉ€ƒØ߈ù×›¾«‡“ÍjóÂæ'ĂÙƠÚ×ڜ۫‚ ½9¾»§Ó%íºĂĂ ›­±àéMñÚưÀƒvù‰»ƒ×¾˜êèä´ÎÛ›¾‰ÁƒvªÔà!ă»½á̃ÏÔ‘™‰kß [ïSơÄ«‡“ÍjÏ̉ä̉˹éô߈›¾ë¹=ùê«ÈưÀỞ¾á=ĂÈ߈Ù½ùבøăˆŸ;Ï̉àêëöûéÙÅëª<™ÁùסÔÙ×éôẳ£Ô‡ß±»ĂÙÍË)éÛ9¥ƒvÑÄ뛾ç¾çôçÚơlÓØËơêĂº·Ô¹Ú«ÔïÚœ‡߈ƯÓ ™‰kß [ïSĂÙ÷Áù×åÁăˆŸ;­ÄưĂå̉ ÑÓÍỢԵاùºµê…ÔăˆŸ…Â½ÇØÛ«‚ ½9™Ó‡º©)ù׫‡“ÍjÏ̉ø×Î̉»nƒvÅȇµ+ƠçÚ®¾“È߈™‰kß [ïSùë“Ơí—G³ÜÑÄëÿÚ­Ö™ÁưÚÁĂ¡ÔÂĂ¯G‹øăˆŸ;ÏÅĂÈ“¹ƯN±ëØ£»»ÓÛ«‚ ½9ăˆŸÙ÷Á«‡“Íj¹Ú½ׯ¹àÙ«‡“Íj¥ˆ]1ơ»̉Å©ÓĂă½ÏÔÍöè‚v±̉ÏÔẳñíÈư‡±ù1äôßÄÙ½Ô™Øψª‡’̀jÙÅë‹Çª‡’̀jƯܺ£«‡“Íj…Ö™‰kß [ïS麳ÇϼñÖ‡ºăơöù‡ăÁùꃈÏÅó#åĂăˆŸ;¡º™‰kß [ïS«ÚÎÄÿ¯¶§ÓëöÓÔŒƠ«ÑÙÚÁ¹óǃvßÁăˆŸ¡ÈÙÅëƠ©ÀưÀ«‡“Íjù×§Ô›Úß»ûö߈›¾ä̉«Û“ÛçôăˆŸ;kÛÇâˆ:›¶é˜‰j̃ZîSØ×±½ùêÛ«‚ ½9ÇÖÛ«‚ ½9¹ ™‰kß [ïS±»ăˆŸ;™ëéå±»ûáÛÛ×§ØüêÏÔùט‰j̃ZîS߈ƒv¹ÔóÂÓ¾Ă¾ß•·Åôô±)¡¤ˆ\0öÁ¼«‡“ÍjăˆŸ«»ºù¿½óüăˆŸ;kăÔ«»›Û™‡ăˆŸ;ÍÓÁÛ«‚ ½9ÅÁ‰¿I¿ƒàØÁ¹ƒ‘±ÏÔ¹Úù·ÏÔ±»ƒˆûăˆŸ;kÖ¹£»«‡“Íj߈¿Åƒ¾‘Ǽå̉ ºÔ(«‡“ÍjÍË)éÛ9¥¾ưÀù×éºÑÄëù×¹ÚÏÔĐÅ2Û«‚ ½9߈…ÚÛ½½ôºéê­ºí—G߈íB±»±ëØ·‡‘×8ç«»÷ˆ•×÷Á¶è¹̃רÚª‚ +¼9é‰ñ5ñ·ç'™ÓĐ+‘œ«»ƯơñÓñÆù¿ùוuÅÀÙŒë*«ơ…“È¥ˆ]1™‰kß [ïSùדÈÿ¯¶£Ø…Ơǰ«ôăˆŸ;kĂƠßæçÚÛºÔÿ×›¾öÁÚ߈ù×ÑÓÑÓŽ“ÆÏÅĂ¿ÅĂÙ8¤‡…Û¹ÚÚª‚ +¼9«Ô߈ºß„ù×Û«‚ ½9åÖôăˆŸ;‹ÇÅÓå̉ ©‡¥2ßëM±”ó ú’ëƠUµØǼÚ×ßÚ ƠÛ«‚ ½99¥‡߈ƒv½ÏÔƯÁíÖñÓ“ÈĐÓöÁưÁ„ØͼµÆ·‡‘×8ç̃ˆöÏ̉́v ¡Á߈¾Ư$9¥‡½…¼âà‹Ç߈ÏÔç̉§Ô½»‡߈ö±»‰¿Iơê‹Üø±đù×Úª‚ +¼9ăÁ±»¡Ü˜‡å»µØÛש¼‰¿ỈÓå̉ ÙÚñƉ»™‰kß [ïSëöăˆŸ;ơê³»̉íº°»±»ñÚ«‡“Íj˜Ó‘́Ù½¸Ú™ëéåô꫇“Íjƒˆ¿‰¥‹ĂÏàËà˜‰j̃ZîS­¾™ÔÑ»—»ÿ¯¶ùטÁ›¾èê·Øº¾߈ßÄÙù׺íÖ›EÑÓăà›¾ƒơ¼óÂé„¡ÛÛÄÓ‚Øë×…ƠĂÙơÛËÀ½€½™‰kß [ïS߈«ÔŸ̃™‰kß [ïSǺ—¶÷‡°»™Á“Ơ‡ÇăˆŸ;kÅØ­ÈÛ«‚ ½9Ù½ÑÓÑÓ­RÏÔß纡»ăÇí•̃ÏÅĂ¼ͺªÚ™‰kß [ïS»ÓÿÛ§ºăˆŸ;kÏÅơê½ÏÔívÏÔ¶ÅßÑÍÓÀƯ«‡“Íj߈ö¹ØÏŵؙӿ́ăÁÿ×̃ˆ%ºÎԓȳܹګÚăˆŸ;ù×ß%½ÁƯÙ½€Ơơ»·ÔÈDz߈÷ÁăˆŸ;ÚÚÂèÑÁù×±¿ÿ‡±¾ÅÔ±»ăˆŸ£ØĂº×ÚÛ«‚ ½9ŒººơÄχù×íÜÍÓ³ăöƯÓ µØרăˆŸ;ÙŒë*««Û¯¼ƒˆ«‡“Íj¡ÁÙqÑÄë¹Á’Æ߈‹ÇÚ×íÖ±»Ó̉¯¾ÙÚç½ÿ¯¶‚vÑӯ׃vÂÙ™‰kß [ïS߈Û×±̉™‰kß [ïSµºÚ×Û«‚ ½9ĂÈÏÄß„ÁƯÆ_åÁÇ»߈öóÂå½–¶Á‡é/×:ăˆŸ;߈½¡Ö•ŒÜÚ‰¿IËḈÁø×ƯÓ ³ĂèơêëöŸÅ¿ßºẳÏÅÛÚ¼ô8¤‡êö龽Ű»Û×Ă$ÍƠ“ÛÛ×ÁĂû‘£Çùê±»­€É9¥‡—¿©ÓÄ»¹Ú³µØ°ÁÑÄ뜉¾IƒˆăǼ·Ó ¥0ƒÔßÄÙÛÄÓµÈó›¾9¥‡ÙÚ“Ơ麗±»Ó̉߈ËÇ̀ÓÛ«‚ ½9ívß„ñ֣NjǛ·ÔÎÄ«‡“ÍjÍË)éÛ9¥­vÙÁÏÔ‘Ô«‡“Íjêơ½₫•ÿË̉­Ä±»å̉ ù¿øê‚v߈™‡«‡“Íj8¤‡ÁËçÚ›v÷ÙĂÙÛæ₫®¶₫®¶éíÇÖÏÅ«‡“Íjщƒv…Ô©ÓË̉ïƠỞ̉ÆÓØ«‡“ÍjƯÓ ÷Á©Ü¯×¿́½ôëöÏŸצÔăˆŸ;k½«dÁƯ½ÿ§™‰kß [ïS­€ơêÑÓ«ÔÛ«‚ ½9Á×™‰kß [ïSƠÔ߈ơºĽå̉ Ï̉«ÔƠù×ưÀ“ƠÿÚ™ô·Å©ÇÛ«‚ ½9ỞÔXăơ߈ĂÙ߈·‡‘×8çÛ«‚ ½9ĂÈ÷Á¡ÈÏÔÍË)éÛ9¥ăˆŸ;½ô˹ÍË)éÛ9¥¥ÜËÉ9·‡‘×8çù×Á½ăˆŸ;Ï̉©ÇƠX™Ó½€­¾ä̉ëƠU”Ö¡ÈÅ‚ÛדÈ߈̉½‹Ü»÷Áù‡ù×™ëé嵨¼ĂÛת¶2tT“ƠÔĐÓ©‡¥2ßëMÙÚ©¼®×ÁÜ«‡“ÍjÛ«‚ ½9çÚ©ÓƠXÏÔ»ăÚ¶‡Ö8æ·Ô¶è‹ÇßÄÙ˜‰zjz̃zzzzZzîSzÿ¯¶ÁĂ‘âßÖ‘3›¶éĂºËÓ›v«‡“ÍjĂÙùׇ«‡“ÍjåÁĂÆáº«‡“Íj߈߈›¾£ ¿Ù81¤‡1ÖÚª‚ +¼9Ù½™‰kß [ïS°»ÓºÇÖ»ôÛÚ™‰kß [ïS¢ÇùשØÇØ·Å™‰kß [ïS9¥‡÷ÚëöăˆŸ‰ơÖ¼Ö¾"釀ӷԙ‰kß [ïS…Ơ¡•¶ƠÏÅívăÀ½ô‹ÇÙÅëÅÓƒvçÚâơ߈™‰kß [ïSµ¼߈̣ÔÇÓñÓÿ½ËÇÁƯĂÙơ»ïä߈¥í¡ÓÉ̉ÅÔĂàëö‡ÏÔ½ê$¼Ù½±»Á¹Ö¾½€Ú=±»Û×Ï̉8¤‡×§ØÇÖÑÄëшÛ«‚ ½9¡%ùשÀœ·̉ ¤0¹Ú°¿¹Á¡ÛÖÀ«ÔÏÄÛ«‚ ½9߈éºôÇÖùêêößÚ›¾Û«‚ ½9àƠ«Ưă½óg‡Œ½ø×ƒØÛ«‚ ½9ÏÄ9¥‡8¤‡ÓÅÛÇ߈«Ô£4Û«‚ ½9ëö›ŒưM™‰kß [ïS«‡“Íj±»™‰kß [ïS‡ŒÍƠ߈߈ËăˆŸ;ÙÚ¤ˆ\0đÏÅÏÔ»ÁÅÔ™‰kß [ïSÏ̉û:¡ë™ô麡Û̀ÓÏÅŸÅÏ̉ưÀăˆŸ;ĂĂ·…¤ÖĂ ÿ¯¶óÓ±»«È«ÔµØ×ÜöÛºáꙉkß [ïSµ‰¾×äôÍĂß»ûơêÿÚÿ¯¶ơêÛ«‚ ½9ĐÅÓ¾µ‘ŒÓËÿ¯¶߈ƯÚ%ó|çÚ‘ÖăˆŸ;ƒv¡T£»ÏÅĂÙăê„ôŸÅ÷‡ÓÅÑàæơ•Öëö¹ÚƒÖ°»™×ù×XóÇöÚÉ̉ïÚưgŽÇĂÑæ¡Û£ ăˆŸ—ÓăÀÖĂÙóÇÛ«‚ ½9“¹ƯN«‡“Íj¥ˆ]1ĂÙ©‡¥2ßëM©‡¥2ßëMÛ«‚ ½9ĂÙó›ăˆŸ;ăˆŸ;‡“Ÿë߈ÍĂºƒv¡ÛäƠ¹Ú÷‡ È‡Œ«ÔÛ«‚ ½9«Óï³2߈ÙÅ냾‘ưÀ¥Ëù×úÙ…»ăˆŸ;»«»“º“Ơ›¾±»ɇ߈Û«‚ ½9“ƠÍ—¾ăˆŸ;9¥‡«ÓÛ«‚ ½9ăˆŸ;ÅÄéÓ¿‰¯ÛÏűܿ»éÚ¹Úëö€^ÏÔ›ÚƒˆÏ̉Ù½ÑĂͼ©ˆĂÙ‡ñ5×ӓȵØÍÄ£Ó¹Úù×÷̉«ÚÏÔù×ù×ñÓƒv×Óà ™‰kß [ïSÑŽ€ÏÔ±»ÛµÓºÏÔצԵؾ«‡“Íj±»ÓØ£ØÛ«‚ ½9Û«‚ ½9ưÀôÔÿ×Ó¾©ăˆŸ;k‡ŒƒưÀù×—Œ×Ơ9¥‡ÿÂÛ«‚ ½9ÅôĂĂ ›­±àéMù×®×&ăơ߈9¥‡¼€ơ&ơ»§Ô­ÄëÔëöŽôù×¥ˆ]1ơĂÛˆ½à·ÔàƠ ©ùט‰j̃ZîSËÉ9›¾½«‡“ÍjëöáêÁ½í‡ï»«‡“ÍjϺö÷Á™ÓщíêÀ¹߈׺ÑÓƯ‰±»Û«‚ ½9ÏÔă‘·ßÚÛ«‚ ½9ËÓ±ëØ…ÛëÄ Û“½¾ĂÈÜÓ ½ÁÀĂ¢X½Û«‚ ½9†îö¡Û«»ÇÖ›¡Û«‚ ½9…»Û׃vÙƠÎ̉áêÓï™ăˆŸ;߈å¼ £Ç‡™‡±»Ç»Ôơ±»›¾ÏÔ›¾ù×Û«‚ ½9Û«‚ ½9¹Ú¡ÛÛ×á ¾Á̉ăˆŸù×£ÓÖĂœÁÊ”¨‡¤2€̃êLרÆßÁÅ̃ˆ™‡çÚͺçº9¥‡…Ô₫™‡«‡“ÍjơèÅÿ§‰ơđƃv剨Ơ +×Ü׿8±»ëÓ‡…ö™‰kß [ïS‰Û »Ơ›¶éÑ·ÿ§ÙÚÅ«‡“ÍjÏÅÏԱș‰kß [ïSµØĂëöß»ûä̉ßù×ÙÚ»Ư™‰kß [ïS²…ÛÙ½“È©¼ù×ăˆŸëöÛÇĂ¡́ƒüÍÇ«ÔívÚ×±»ºÏÔăˆŸ;™‰kß [ïS™‰kß [ïSÅƯÏħ‡ñÓôăˆŸ;Û«‚ ½9Ûº±»ăÁÛÄÓăˆŸÛÖ½é‡ûÇÿÚÏ̉ơ¾©Óô‹ÇơĂÅØ£Ø»ƒvù×Ù½̣ÂÏԃڮ׫‡“Íj‰¿I8¤‡Öùễˆá×ûÓ…Úù×ö¡Ô߈çÚÁƯ½«‡“Íjùê¯rëöĂƠ÷$ƒˆŹ߈™‡ơÔÙ½ĂÙ˜‰j̃ZîSßÄÙëöÿ¯¶Ø§Ó›ÛÿøñÆẳá=³Ư÷Á̀ĂăˆŸ;å»å̉ ùê…sóĂ«‡“ÍjËÉ9ù׬Ä×¾%߈½€ơèÅŸ Çֵ؋ܟ}̀Ó‹Ü·‡‘×8ç¥ØưØ·Ó ¥0‡×½ù×¹Ú›¾Á̉Û‡ÚÍĂ߈¥Ó߈ƠÓ«dưÀăˆŸ÷Áƒvö¼âˆ«‡“ÍjưÀÓù¼²Âí$ù×ͼ±»å̉ ¢ä¥ºÁ̉÷ˆרÛ«‚ ½9«‡“Íj©¼Ë̉đĂ’¹ÜN÷ÔרáƠ߈±»½¯ÜÎ̉Á8‡ºëöĂÙ·Ó ¥0ôÓÅÙ½̀ĂƒvÛÀ÷ˆº߈ŸÅÍË)éÛ9¥å̉ £ÔăˆŸ;k߈‚ö»çÔX±»ÔX ÏÔëö÷ÁéêĂëö§Ôß»û‹Ü‘ÆÑÄëÑÓívíꙡÔÙ½ăˆŸñÚ߈ưÀ§Æă·ØÛ«‚ ½9ºéºµØ9¥‡×™‰kß [ïSĂĂùׇxô¹ÚÏÅÙÜëÚ»ÅßÄÙ·̣¾Èßơ¸ÈĐÄê°êد¾âơ‡ÇÅØÙÓíêÏÅƯº±»±»¡\ÿ§ô8¤‡ƒˆÏ߉ƯÛ×½©ØÙÚ·Ô½ÿÚíÅ­Ä…ÇÛ«‚ ½9ơ؇xăˆŸ;öëöÉ̉·đªÚ™Ô©‡¥2ßëM°»ƒv¹ÚƒÚ¾ÅÙçÚÀ½ơƯÇ™ëé当Ơ«‡“Íj¤ˆ\0·Å…Ơ›¾üĂ½ÿÔÅø›¶éù×∙‰kß [ïS§Æ‘̃ăˆŸ;kùׇº•Ö¾÷‡™‰kß [ïS»‡°¿7Û×á겺̣™‰kß [ïSƒˆ¼Ô«béêŸ}ù×°» +±»ÍÄëö¼€£Çù×ơÔø×½ỞéêăÂ3 ôĂ½ÛÏÅÆơê“Æ™‰kß [ïSÏÅ™‡ÓØăˆŸ«‡“Íj‚×½ùׇŒëöéêÙÚ·ô«»Û«‚ ½9‚văàưÀ³Ú™ëéåƒv¿ô‚׫‡“ÍjöƯóçô¡ÔÇØăÁÚÚá ÅØÙ½ÅÙ¹ÚÓº߈߈å̉ “Û×—ÀơêÑÓùꇌù׃ăơ¡Ô}ƒv·‹9¥‡‹Ó‡Œ߈™‰kß [ïSщ¡ÈïÜ9¥‡ƒÚª‚ +¼9º­¾½€ÏÅʹå̉ ››¹Ú™ëéå±»™‰kß [ïSº¼ç̉߈ÚסÍË)éÛ9¥߈µØ«‡“Íjô¿ôßÄÙ8¤‡9¥‡×ÿÂơ굉ơêÿ¯¶Ù½Ѷ8¤‡ÂÙµiÓØù×»½ÚÀ ăˆŸ;ăˆŸ;·Ô«‡“ÍjÄÔËÉ9‰¿I‘Æ×¾‡x½€Û«‚ ½9äÁ߈ëöơĂù×ÑÄë¡Ûƒˆͪá­¨À‡Œ™‰kß [ïS›Ăƒ×÷Úƒvù×·#ÛÄÓ‚Û"ÅÔºÅÿ§ü̉÷ä5̉Ăô÷Á›¾§JµØé¼8¤‡×ÁÙÁƯ÷‡ƒvù×ùê÷ÁÙ×½ê%ƒ×߈Ơ‡¿ơêăˆŸ«‡“ÍjĂÙ÷Á$¾º­Ä¹Úù×߈źăÚÏ̉Û«‚ ½9ơêÛÄÓăˆŸ;Ù½©ÜªÓ߈ÇÖ•ŒÚª‚ +¼9߈ơÔ¿ØĐÓĽÙ×ÿ¯¶É̉Æ̉Ÿ\ÄÄÎÅßèÏÔƺÜÅó·ÅçÚ›¶é È±»Û«‚ ½9®Gø™‡ª¶2tTÈÙ‡Û»ØöÙ×½Áƒv·µâˆ:j­¶±½ƒˆöŸóÂÙ½ñÓïÚ½€ăˆŸƯÓ ØÓ ưÀ‘±­Öơ»Á½ßÄÙôĂá×ʹÓ̉Á±»É̉YºêØ ²Â×8¤‡«·3uUÅĂ÷ÁÛÀׇ½7•à÷Ú«‡“Íj¾ºåÆÑÄë«Ú½ëö¿˜‰j̃ZîS©ÓóÇÏÄ›¶é“ƠƒÚưÀ…ÛÁ/Á½ñƠ¶£å̉ ÁƯ—¶«‡“Íj߈ÏÔù×ă౿¼»¡ÔưÀÏÔ£»«ÔĂÙ™‰kß [ïS½Ă¼ëöŸ×ăÉͰÛ«‚ ½9÷‡ûÓ›¾›¾9¥‡×óÂù×9¥‡½€¶Ôơõ’éêơêÛ„ß»ûƯ‰ä̉§ÆƯº¢ƯÛ«‚ ½9Ûº³!­Ö‘±Âƒ¡ÓÅÍË)éÛ9¥¡Ó±ë؉ƻ̉“Û¯ÈÑÓƒv…ǘêè佃ăÔ˜‰j̃ZîSƠºm›Û”¹Ú‡ÏÄö±»óÔñÆăˆŸ›¶é«»‹ÜÇÖ߈½ÂÙ»ÈÏÅăˆŸ;½Û µ.¥Ù‘±³„ĂÙ™‡ÙƒvĐÄê₫®¶Û«‚ ½9“¹ƯNØÓÛ«‚ ½9÷Á¸ÚÆï½­¢Ăٷܽ€Ù½éçÁ½ÏÔßÄÙâˆ:½µØŸè—¾óÇưÀ›%±–ƒvÁĂ•ÓÛº™˜êèäƒƯÜ©ÿÙÚ߈ÍË)éÛ9¥Ă¼Û«‚ ½9›¾ÏÔÙŒë*«ÏÅ©«»ûĐƒv¼ÔÛ«‚ ½9ăˆŸå̉ ë÷߈™‰kß [ïSÅnÙÚßÁÛ«‚ ½9ÿ¯¶ɶù׃Øù×”½±½‡º߈ăˆŸ9¥‡“Ơ‡ŒÛ«‚ ½9ẲÁƯµØưÁ¿Øé›ăˆŸ«‡“Íjï½ÏÅ“ÇÏÅ—ö߈©Ç±»ª»¾ăˆŸµÀø¾…ŒàçơêÚª‚ +¼9‹ÜÅØÛ„¯¾Ù×ç4ªĐ±»ÛÀ€Çå‡ÜơÔáê…Ô©¼„ؙԵ؇ºëÓÅØ½ô¹ÚÇÖçÚ¡›¶é¯Èï³2ïƠä×çƠñÓ׾߻ûƒˆ™‰kß [ïSï½±»߈Û«‚ ½9½èƇǭâå̉ «‡“Íjé‰ñ5ñ·û(Úª‚ +¼9ß»ûôƒ ¸ÚÏ̉—ˆ€ºó|áƠ™‰kß [ïS9¥‡ÑӋǹÚ÷ÁƒvăÔăˆŸ;kÅÔÁ ÷ÁÁƯÙԷ‡‘×8ç¾Ë6Ó̉ªÚ Û«‚ ½9«ÔƒÚăˆŸ­Øª‡’̀jƒÖ߈½µØ¯Û×Ơ‚öûƠ›ÛưÀÛÀ¿‰­Ø£!™‰kß [ïSá ¯×«ÚƠ߈º­Ä˜êèäÏÔ«‡“ÍjñÖå·ôÄơĂƠ›¾¿Å«·3uUµ¨߈¡Ưáê“Èëöáê‚vµØÍË)éÛ9¥ÏÔ˜‰j̃ZîSÅØ…nçôăˆŸÿ¯¶ßÁ߈«‡“Íj¹ÚĐÓ¹ÚóÇÍÓ9¥‡ăˆŸ;ÏÄÏÅÅù냽•×Á½Ïԛે“Íj™‰kß [ïS£ÔŽ߈µ†ÛĂ¥wÛ«‚ ½9½ÁËƠ¬Ö§Óéêù×…ŒÓر»«‡“Íjß»ûĂÙ±»×Ơù×ù×­Ä÷‡‹Ü9¥‡ăàÙÚÏŃvÁ̉Á½ûÓÓÛå×™‰kß [ïSñÚÁRáêù×­Ä›¹íÁíÖƒ‹±»™‰kß [ïS¯¼ĂÙ«Ôư“9¥‡ŸÅ«»Á¾×ƠÏÔÿÚß½§}ÓÁ̉Á»ÅùÅá=±»±»Ơ¹Ú±—¾¡ÇóÇμÏÛ×ëöăˆŸ;kù×Û«‚ ½9½ăˆŸ;kßÖƒÚ›Ă±»°»ÛÄӯ܄Ø߈÷ÁóÇă®ăêø¿ÅàˆƠé×½¡ÔƠÔÙ½Û«‚ ½9‡“߈™ô˜ô·‡‘×8çƒv«‡“ÍjƠXá=ÇÖ¹Ú9¥‡˜Á­Ä˹á Û«‚ ½9߈ÑƠ½ö«Ǻ Ă™‡•Èû›™‰kß [ïSÁe­Ö±»ơê¯Û«‚ ½9‚ˆÏ + „Ç ‡xù×ôūԽ߈¿‰»yñڃؓƠ߈Ă¼ÂÙŒƠù׉텻“ÈÆ̉¯¾©Äg9¥‡×Ơív¿àŸÈ°À™‡«ÔvăˆŸ;±»ÅÔă‘·å×ËÇ ÈÏ̉ơÔ¡Ô‡Œ“ƠưÀíߤâƠÅÛ«‚ ½9“ÇÖÛ«‚ ½9™‡˜‡¶èÏÔ›¾‡Œ¢Ç߈¿‰ÙÅ뙉kß [ïSù×°¡Ô­Å«‡“Íjù×½_ôêÏÓ߈´Àă»…ÇÂÖ³Û«‚ ½9Ù½iå̉ ƒvËÇ̀Ó ơÔ²ùêÛ«‚ ½9ÅÓñÚÑæùêÑ‚Ơ£ôÇĂ¿ô±»߈›·ÔëƠU¹ÚǦ¿‰߈ϼÏ̃¾å̉ ÅÓ߈©Ó߈Û«‚ ½9‘Ʊ¿ßÁăˆŸ;k™‰kß [ïSÇÔ»<£ØáºƒØëö«‡“ÍjµØш°½½ùêÏÔÁĂĂƠÇØÛ«‚ ½9£äëöö™‰kß [ïSçô8¤‡Ö§½×¾ăˆŸ;—»ÿÚøêƒ½߈ơº‡Œÿ§œÂƒÖéºëڇǺ£ä·‡‘×8çËÉ9Ûº‡ÇƯÓ ¿‰ÙܬÖ&ÙRëö߈¢Xû÷ÚñÚƒvëö¿‰…»½Ň²Â +¹ÚÍÙ½߈‘̃ÛÀÏĽ·¼Í7ºåîÀ½½àĂĂÿÚ¡Á¡ÇÛº¹Ú¯G‹øèơ»ƒv“ƾô»ÅÄăˆŸÈŽăàË̉ÅØëö‚½ÿ¯¶°êةحֱ»ѾơÔ²¹ƒv½Á½áêÿ§ĂÑGå̉ »öÓØưÀĂĂ ›­±àéM­¾ăàÛǺ©Ø¯Èùׂvù×™‡ÿ¯¶™§ù×ĂÙ´Áï³2ăˆŸ;œˆ»˜½±ºøÛ×À̉ƠßÁƠôê‡xÓÅ™‰kß [ïSƠ÷ÚׯÏÔÏ̉Ÿ}¼³×«)­v¡Û‰¿IƒÏỐê½€·Å¡ÔèºÙÅëÏÔ߈߈8¤‡߈å̉ ™‰kß [ïSá¢¹à™‡ÿס»ĂÙÅÓ¾†Ç™‰kß [ïSÛ«‚ ½9£»ß»û«‡“Íj©¼ù×ƯÓ …¾ăˆŸ;k¹Ú™‰kß [ïSĐÄêÁĂ€Ù̉Û«‚ ½9±»üÁăºµ‰ßÖÏÔÙÚ‡ºù×Á̉³b¿ß¿‰öù×ÓØ÷êÛ«‚ ½9½¹ÚĂ™Ôé‰ñ5ñ·ƒv«‡“Íj»ØôêØ×ƒØƒvǸÚï½Ïŧ԰»ăˆŸ;ëöă੼‘Ö°»—~½€ơÄ“Èù×·¾·ÅíÆ÷4©½±¿ÏÔ߈ơê󷇑×8çÙÚï½£ÇÁ¼8¤‡­Ä¡Û½ßơï½¢XƠ¾GÛ«‚ ½9ĂÙÑÓǼ›¶é߈ÓŇxÁ!̣×߈±&ԣཷÅù×½âà›¾Ÿ‰àÀ±»Úª‚ +¼9ëö«‡“ÍjßÄÙ‡€ơêÿ§¥ăívçºÁƯÁ¹€¾ăˆŸ;ÔăˆŸ;™‡ÏÅù×™‰kß [ïSÛ«‚ ½9«»”·™‰kß [ïSñÁăˆŸ™‡·Ô½ô©Ç‡ÖÆ ÂÙ¥ÓæơËù×á ÿ¯¶‡Çß»û±»ô®ÿ¯¶½ĂÈăˆŸ;™ÓÅÓ™‰kß [ïSï»ù×Ûº½ôƒˆ©‡¥2ßëMィǗ̀—»–½ ·‡‘×8çܺ Í­H‚a™‰kß [ïS•ŒµØÛÊÙö½·¼Í7½ÿÚƠ…n›¾ù×ç̉§Ø¶ôÏ̉ÙÚ¡ÇÛ«‚ ½9¹ÚóÄÅÂËÓ˜êèäß»û9¥‡éÛºö™‰kß [ïSƒvÿ¯¶Ă¼àÖù׳ºó±»·›åÁëö¡Û߈óÂƯÓ ĂĂ ›­±àéMÛ«‚ ½9—Ơ³ ŸÈÛ«‚ ½9ĂÙÿÂÆØ½Û«‚ ½9£Çơ“ËơǼù×·ÅívĂȇÇƠỠÁ ívóÂôÅħÔ÷ˆï»‡ÛÙÚâà±ëØ÷ÁăˆŸ;kỞ‡»ÏŹڙ‰kß [ïSåĂÛ§ÆƠXµØù×ù×ËÇƯơ‘đÅİÅßÖu™‚¶‡å×߈߈ăơÑÓăˆŸ;ù×ß»ûÛƠ•{ùשÓÏ̉ÔXÛ«‚ ½9›¾ëö›¾ƯéÛ«‚ ½9©‡¥2ßëM³ÇË¿Î̉§çăƯÏÄËÔ©‡¥2ßëM›Ú¸£ă¼ؽăˆŸ;׆ï»·‡‘×8çÛÀÏÔ½°»¼9¥‡×‰yÂÙÓÅÙ½ÄÄơ»ÏÅöù׫ÔÅØù×ψíÖɇxËÖùå߈á Ă ̀ÁĂÙ½¿Å´ØăˆŸåô³¿ôĂăˆŸ߈¹Ú匿NăˆŸă™‰kß [ïSăàëö½„»Å™‰kß [ïSñÆ¡%Á¹ßÄÙ±ëØÿÜ߈ĐÓ߈ăˆŸϼªÔ©‡¥2ßëMä×¹Ú«Ô¼€µØơÔâÓ—Ûù曾ŽăˆŸ—»9¥‡×ưÀ‡ÍË)éÛ9¥·ÔĂÙ8S¤‡SÖ óÇщÏÔÁƯ›¾•‹HĂívÛ«‚ ½9ù×…àóÇăˆŸ;Ï©‡¥2ßëM›¾‡ăêĂÙ™ơÍķŋǼôÛ«‚ ½9ÿ×߈8¤‡×»ØÓ©;ơê߈óǘ‰j̃ZîS—»Ù-‡€ƒ™‰kß [ïS÷Áß»û«‡“Íj­¿ëÓûؿڪ‚ +¼9Û—±”̀ªù׫‡“Íj‡ÇĂÙ߈åĂª‡’̀j™‰kß [ïS9¥‡¿ß©Ó‡Ú™‰kß [ïS±»ÿ§Û«‚ ½9¿‰Óº«»Ÿ\ÛÄÓĐÄêß.óºä̉ăˆŸû(óÖÛ߈˜‰j̃ZîSƠX¢Ø·‡‘×8çôÅØ“¹ƯNí|ƒv₫Æñê—»Å8¤‡Å»ø¿­Ä¬¼¼ăơ·ÔăˆŸ³½•ÿçƠ«·3uU߈ºýƒv§Æù×ï»Ï|±»‰¿I˜‹Û«‚ ½9ăˆŸ;Û׉ơ™‰kß [ïS§Ô›Ú¨Óí½ÑÄë߈ăˆŸ;¤ ‹Ç§Ó«·3uUăˆŸñÓ×̉Ú ª ‚  + ¼9 ù×—»«‡“ÍjÔơÛ«‚ ½9÷‡µØ‰¿I¾½ù¿Û«‚ ½9Û×¶ÁӇۼصaù×̣¶9¥‡å̉ Ù×ƠXáê߈ơ‡XÏÔÏ̉È߈×¾ñÁƒv·̃°»ψ‚văơƒvđÄăˆŸ;›¾Ñ·÷Áùê÷ÁăˆŸ;½¡Ó麛¶éơêƯç‰àĂÙù×Ù½˜‰j̃ZîSΠÁ™‰kß [ïSƒˆïÚÙÚÑÓçØ¥Ç¡Û¹Ö½È‹Ç—°×¾»½…Öؽؼ<¥Û™‰kß [ïS•×–½7å̉ ÑÄë…ö™‰kß [ïSñÖ¡ÛÑ·°»ÔơùץǭԇÇùê¹̃«‡“Íj£»öÁ©;Ǻ›¢•½˜Á ÿ¼™Ôù×¶‡Ö8æù׃vÙÚ¬Ö ßƒÚÏÅêöÔXׯ¡È×ÓúÛ´aí‡ơêϹăˆŸ;k‹Ç¿‰½$Ổ›¾ƒv÷‡áÁơÄ·‡‘×8ç̃»úÁSăˆŸ‰y±»óDZ»ëöÆÉƯ³ÇÍƠÅ»Ă¹}߈ƒvƒ¦Ôźº5«‡“Íj¿ØªÚÇ̉¿ô߈ù×™‰kß [ïS³ºóñÚĂûÙÁRß„½•ŒÿÚ¹Á†×÷Á™‰kß [ïS¥ˆ]1ÅÔÛ«‚ ½9ÑÓíêñ¯Èºù×ĂÙëö“¹ƯNƒvƠ·‡‘×8çưÀưÀÏÔ«Ô§ôĂºÏÔơ±»”Œ—¶ƒ¾½×ƠỞÏÄẠ̊±»ĂºĂôƯ ¡»ëöÛÄÓ«d߈ó™‰kß [ïSÏ̉±»«‡“Íjùꀺ±»ÏÔăˆŸéÓ¸®Ởû(߈÷ˆÛ׃vͽĂÙ¡ÛĂÓ£ØÅÓ™‰kß [ïS·Ô½€½ÏÔ›vÛ«‚ ½9ưÀÀ¹đÖ°»„ô ưˆÓàß»ûơĂËÉ9ĐÓ¯Ơ‡Ç¡Ôµa /£Ø˹ä̉  ï»߈ÑÄë¢ÇƒăơƠơ¶ƒvơĂơê©Ơ³ ‰Û°»¶ϼÑÄëÓØÑÄëïÔ ¬°àèM½µØï»›¾ÿÛ—»£Ç¡ÛѶ»ØÎÄ­¾¹Ú¥Æ“ƠÙ××¾ª ¨ƒº5ºÁ¿ô«ÔăˆŸ½÷Á…Öæơö‚߈·Ô~›vèơ±»ÁñÏ|ƒˆĂ ăˆŸ;k˜ ê è ä ëö¹Ú³ ë «‡“ÍjíÖÅÓ±»ÙÚÙƠ™ÛñÚï½Åœ߈£Øµ­̃»úƯÍáêÍƠÏÅøêÓïô›¶é‰¿Ié‡ÁƯù×§Ó̃»úçÆŸƯ‰y¹Úÿ¯¶ưÁ•{™ôăˆŸ;÷Áä̉ÏÄ»Øî½9¥‡íƤ”߈жÏÔÙ×ñÓÏÄå̉ «‡“Íj‹Ü±»›¹™‰kß [ïSκ‹Üëö™‰kß [ïS‡ƒvívϹ‡ÏÑÄëëÚÅÜëĐơÔ߈‡º·Â«ÔˆơóÔƒv߈Ù½/ưÀñÓ9¥‡×¶‡K•%ëöÏÅÀɤ‹ÓơºơļÈù×—ˆăˆŸ;ƒÖ³ơÇѼù׫‡“ÍjÏԋܱ)çZÙ½‡Û߈ƠÔăˆŸưÀÛ×Û«‚ ½9¾ß%²ÆN½¶--ăˆŸ;¡È߈½€·Ô¡Ô™‰kß [ïS¿‰Û«‚ ½9ëößÄٟŧÔÏŵa¶ƒv˜‰,j,̃,,,,Z,îS,‰̃Ù½ơê§ÔÏÅÖØăˆŸ;ï½ù×¥ÁÿÚ«‡“Íj©¼ƯƠ±»ר÷ÁÏÔ³ºó±¿ÁăˆŸÅÔÇ‘×Ü‚v÷Ù›¾ăˆŸăơëͰ»™‰kß [ïS“¹ƯN°¿ÜÓ ù×Ơ½°»ŸÊÚ±»Íå½™ëéåÂÙ ơêˆÔáƠ«»ƠøëÑÅ߈߈Ù½ù×ơÔ‰ÛµØáƠ›¾̣ÂÁ½ÏÅ—¶ó"©ĂÓ̉Ôăà߈¾ăˆŸ;ø×“öà=˜‰j̃ZîS™‰kß [ïS¿ØñÆ÷Ú½‡ƠôëöÑÄ묾ŸÈµØÙÚ»ØÇÖǽú߈”Ö—¶±»ÙÚ¾Ÿ}‡Ûèơ½£Çô»©Ó«Ô½ăˆŸ;÷‡³ ÷ÚëÚĐÓ¯ÛÛ«‚ ½9‡º«‡“Íj‡ÇêöÛ«‚ ½9÷Á‹ÇùבӶ‹îơêỞÙÚÙ½€ÄµØ•ÛĂº–¶”Èúëöù×¼ï»߈ܱ»ù×Ï̉«ÈĂÙÚÆÏÔ“º—ÓgÛ×°¿˜‰j̃ZîSºóǽôÙڣا¹¤ˆ\0‚vƒØ¤‰̀L„™‰kß [ïSöœÚ›¾©ÇÏÅ™àÙ½©Ó™Ô÷ÁáêÑæÅ·Ó ¥0ơÄ¨ÇƒĐ½€¼ºøê×ÜÛ¹©ÇỞö¯È9¥‡‡ơï™ëö×̉ùơóƃÖù×ÎÔ›¾÷Ú«‡“Íj“Û«‚ ½9¹ÚÑÓëöăàûăßÁ³ºóÔX«ÔåĂÿ¯¶§ÛÙàÛ«‚ ½9Û%»ÅÙÚùêÙÚÓÅÁ™‰kß [ïSÄÓûgŸ}±đ´™ÓáêỬ­Ö́ÿ§§À̉ºÙ½áꙉkß [ïS¯Èö¿‰̀Ó±»¹Úß»û9¥‡ơÔYÅؽƒv«ÔñÆŽƒ½³ÆăˆŸ;ẫàê‡úưÀƒvÛ«‚ ½9ßÄÙ߈§ÛưÀµ†©ˆ“ÆÅؽ9¥‡ÿÚ¹ ëöÙÓÑÄë¿Ï£ÇưÀ•Èöź˜‰j̃ZîSÙŒë*«ÑÄëôé ™‡Å–%«‡“Íj±ƒ‚v߈àêơÄ«‡“Íj«‡“Íj·‡‘×8çƯ¿¸ëö³îÅëö±¿ÇÛ«‚ ½9ù×ÍÓÏÄăÁƯÓ ÅưÀĂÈÿ¯¶߈¹ µØăơÍÓù×Ă¼ÏÔô»´aµØíơùơù×ăˆŸă»º½Ùܱ»ƒv¡ÔèºÚÀ_ù×ƯÓ 9¥‡ùơƠ™‰kß [ïSüÀ±»‰yÏÅá¬ÍÄ«·3uU‹Ç߈±Í¾ßĂñÓׯ«‡“Íj9¥‡ÅÔ8¤‡ÖµØ­„Ç«»Ž¶¡ÇơꉿI«‡“Íj÷Ô™‰kß [ïSÿ¯¶½±½ăˆŸ±»͘ÿڵ؋DZ»¡Û÷¼ØÚå̉ ăˆŸµØ½ç4½»™ëéåºÈ«‡“Íjív¹Ú̃ˆ©Óå̃9¥‡ÅØûƠ¯ƠăˆŸ;kχ¬v¿Î¥ˆ]1ª¶2tTȳ(9¥‡˜ôÙ×ö÷Á߈ÆôƠñÓÏÔ™‰kß [ïSÿ¹۫‚ ½9ơĂ߈…§߈ăˆŸå̉ £Ư‰¿IͽÔëö¦ØÛ«‚ ½9µ‰™‰kß [ïSàê«Ó߈߈¬̀±»ÓÆÛ«‚ ½9ÓºăˆŸ;߈ĂÙ°¿ÙÚÍÄ™‡çÚñÚ¿¥àå̉ ÛºÁƯ߈ơêÛ«‚ ½9«Ô½ÔÇĂưÀ߈ׯ½ßå̉ ÇÖ߈§Øá=ùóÍÇÓØÚוܘ‰j̃ZîSÛ×ăÇí£Û™‰kß [ïSƠøêÀ‡€è/Ö:ªdƯº…»ÏÔ9¥‡›¶éđÆùש‡¥2ßëM«»ͼơØëö¡¼˜‰j̃ZîSă‘·ăˆŸëÚƒvÏÔÑ×߈¥‰ÍL…ĂÙƠXÖÆ‹v9¥‡æØ·‡‘×8ç»Ø™‰kß [ïS×Û«‚ ½9ÎÔ•ÛơË‘‡¹ÈÏÅëÚơêÓ¼­ÄÍĩNj܇ÇåĂ˜‰j̃ZîS±»»Ø­7Æù×¶̣™‰kß [ïSÇÓơÔ¥ágăêß«ÔóÇ©‡¥2ßëM߈߈àƠ¾°»ƒˆÿ¶ơ驇¥2ßëM³Œ˜Ó Û«‚ ½9ÍÓƠ´ï»°»—¶¹ÚæÚ·¸‡ÚÅÔÀ8¤‡‡ºéºÛº©Ü£ÓêØăƠ·ÔØ߈ăÇ퟿ÍƠß»û«&»ˆưÚ߈÷ÚßÁ³ ưÀÛ«‚ ½9Û«‚ ½9©‡¥2ßëMŸÈù×åĂ¾Ûº߈—¾½ÜÀ¡Ô¥ˆ]1ûƠ㻇¼±»±»ôƒ•ŒÛºù×ëöçÇƠ¾±”‡Ç‡ñ5éÓ£ÈÅå̉ ÅÔÈöʹ ưÀÏÔÑÄ뫇“ÍjÙ½­°»ƯßçËđù׉¿IºăˆŸ;·¼Í7ÍÄåĂù×ׯµÜù×û„Ûº«dŽ©Ç½÷Ù₫®¶áîăˆŸ;ÔX›¶éà ăˆŸ;kŸ»¤ˆ\0Ư‰û)«‡“ÍjÁ×Û«‚ ½9ÛÀÀ«<ƠX‹Ó—ˆ±¿ª¶2tT³ŒÓÛ½Ô¹ô¥Ûµ†™ëéåÅàƒˆŽ»‹£XƒÔ©Ø™‰kß [ïSÛ«‚ ½9ÓÆöÁ›¾Æôê£äÛº‡‡Œ±»˜êèä¡ÛÛ«‚ ½9ù¿Ñ·Û×½ÑÓÍÓ¡Ơ½­ÄçÚÛ×Ö¼»éß»û…Ơ‹Û±ß»ûׯÿ¯¶«‡“Íjö4çÚ½Èù׿غù×¾«Úÿ¯¶߈³È¾ºƒˆ…»Ïß9¥‡£ä±»ÇÖư§‡›¾•‚Û‰–»·‡‘×8ç̀́«ÔÁĂ9¥‡×ªÔ9¥‡óÂáÅßÁ½· —¾ăˆŸ;ÁƯÁƯï»Û«‚ ½9ÇĂ³±À›vçÚ£»—ØÓº³ºó“ÈØÓ÷ÁÓ´£ÇÁ¼¡ÇëöåÚơÔû +߈ĂÙçÚ·‡‘×8çëöưÀø×å̉ éºçÆëö±»¤Ç·¼Í7ƒØôíØÏ̉ÏÅí—Gå̉ ¹›°»ϼÙ½Âù¿ăˆŸ;ĂƠ¾Gö˜‰j̃ZîS±½ƒvưÀ¡ÔÿÚ©‡¥2ßëMÙ½Ở½ëöó¹Ú÷Ûø×«Ú÷Ú³ù×ơĭدƒßͯ¥'=U#QK¯ÂÏÔăà·Åăê§ÓùÚŽϺ¡Á9¥‡ÏÅáÅ߈¥½ƒvăˆŸÛ«‚ ½9ëÔŸÅ«‡“ÍjÙ×ÓÔơêÏÅÅÔ÷‡³(Ç"˜‰j̃ZîS¹ §ÔÇÛºƠÿ§ù×ÏÔĂëöå¼ ·‡‘×8çÇÖ‡ŒÙÅëËƠ߈ó%«Ỗ»úÛ«‚ ½9Ù£±»ûƠôưÜĂèùש۫‚ ½9ù×ÁƯ‰÷ÁëöÈÙÚ߈ëö™‰kß [ïS9¥‡«ÔăˆŸ;‘ÆŸÈƠºm™Ô¯‰¯0¿½€±»ϺĂÙ«Ú›œº©¡ºÈ³™ëéå¡Èơê³È߈Ù½ÓÁÛ×˹ơÔø¾ơÔ½ưÀ»̃ƒÚ“Û«‚ ½9±»ưÀù×±»•Èû›Û«‚ ½9ăˆŸÅ–•ŒÓÆÁ̉¼²ƠçƠ™‰kß [ïSĂÈ߈„ưÀƠÓØëӭĹ¾ÂÏÄׯ¡ÛÏÔ°»Ù-ÑưÀ«‡“Íj¸½éêÙ½ƒvÅ»íºù×߈ù×ăơñÚé…Èô•«ÔnÙ‡Ï9…áê‰Ôô§×Ơºùá×¾·‡‘×8ç«·3uUËÉ9™‡Ù׽؛¡ù×íÏÔ±»‰Áµ‰«‡“Íj߈¡h÷ÁëöăˆŸ;Û«‚ ½9…Ûª»±”ùêÏÅ¥ÆĂÙ½¡ÏÔ¡ÈÅ–̃½Á½Ó‰¿IÍÓëöÛºẨăˆŸ¯‰¯0™‰kß [ïSÓà§Ộǽ€Û«‚ ½9ăƯ—Û±»ŸÄíÖñڲ½Øà¿‰“¹ƯN£ º×Ă¡È麃vï½·¬ĂÙ¡ÅơÄÛ«‚ ½9¿ôÛ«‚ ½9߈ûă÷ÁµØÙÚ•ÓÙ½ăщß—ˆÄÖ߈́vù×…Ơ Èº­ÄÏÔ8¤‡Ö÷‡ĂÙ©ØĂ¹¾ƒvú̉‰¿I½™Ááê˜Ó·Ø³àµº÷Úº›¾ÅÄ¿½9¥‡9¥‡á“ƠÛ«‚ ½9ëöŽù×ñÖÛ«‚ ½9‹ÇƠÏÔù׵؆Œ›¾ÍÓÑÓ·Ü߈à ÖÆ¯È•{ëדș‡ÁË«‡“Íj™‰kß [ïSĐÓµØưÀÁÛÁƯ߈“¹ƯNƒvÿ×íêÑØщƒÚÚª‚ +¼9‡º‡°»μ +ÏÔµÏ׿8ÏÔáê¹Ú‹Çâ»™‰kß [ïS›ÚËÇ«·3uU8¤‡«»רÙŒë*«ơêëö8¤‡ÖëÚÿÚ‰¿Iéß»ûáêæ¾­‘Ù-̀ĂûƠ³ºó«‡“ÍjÙ½çđÙŒë*«åô₫Ú±»ëöÀ¹«‡“Íjƒà“Æ™‰kß [ïS“Ơ£ÇỞ«ÔÅØĂº×ÓͼĐÓÏňƯ«Ô³È³‰¿IƠì¾Û×÷‡Ä߈8¤‡±»ÿ“öđÆÏÔăˆŸ;ơêƒv½“ÆÙ½÷ÁßÁĂ„·̣½Ô&óơꘉj̃ZîSỞù׃öÛ«‚ ½9±»Ă™‰kß [ïSƒvûº¥ơ.¾ßƯºå̉ «‡“ÍjÙܹ¼Ù̉ưˆ¯ó9¥‡ÍÓív×ÜçÚÛ«‚ ½9Ïå±»¿»°»¾ù×ëöÏÔ¬¾³Ú†Ú Ëûư§‡Ù×½‚™ÉªºÏÔ£Ô÷ˆ¹ÚÂÈÙ½ÂĂă»í—GƯÔĂ¼ơê߈Á½߈á=ÍĂóÔơÔÉĂ§àµ†/߈ù×ÇÛ‰¿IăˆŸ;k‹Çù×̀Ó ÁƯ¡Á¥ˆ]1Ç ™‰kß [ïS³ÚĂÙ8¤‡©Ó½€­Â«Ô߈ÇËÉ9âÄ™‡ñÚä̉ÄÓ9¥‡ Á±»“Ȫ‡’̀jÛ«‚ ½9óÇ¡‡xËÜưÄÁ̉Û«‚ ½9ªÔôÓÙÚ«ÛÛ«‚ ½9ëööçÚщ÷Á©Ç™ëéåÁ̉°”ÿ¯¶ÇÖÿ¯¶9¥‡×áꃾ‘ÂÙµØĂÙ³îÏÅ«‡“Íj¯ÈÀ½í—GÏÔÙÚƒvéê¡È߈«‡“ÍjƒvƠº‡(µØºÅ8¤‡×óÂ߈¶§ÓÛ×ơĂ“ºưÀ©ˆ₫¥ˆ]1ÑÓö°‡ÏÔ·‡‘×8çËÓÇØ¹Ú´ÎéÓ›¹ơúÓºÓØ›¾Å™‰kß [ïSν±ÁÛ«‚ ½9ÁƯ±»߈œÁôù׫Ñëöº•¾©¼ƠX›¾ÉñÈׯŽ‹ÇшóÇå̉ ‰yÂÖï½ÂÙ ·Ó ¥0ưÀÙÚ÷Ù£XœÛ«‚ ½9Ëǽô™‰kß [ïSÚª‚ +¼9ÂÓ·ÔÆщ̣ªڽÏÅûđ·Å«‡“ÍjĂÙ·‡‘×8ç­Äỡá ±½ăˆŸâˆ«‡“Íj9¥‡ùê9¥‡ªâ¥Ó—»ÿ§ăơ߈ÈĂÙÚ÷ˆƒvÍË)éÛ9¥ăˆŸ´‹ÜºyÖ ³ăˆŸ;kéûÖ‡Œ·È—¶­€ï½ø×ăˆŸ;«‡“ÍjóœÛ«‚ ½9ùê¹Ú·‡‘×8çĂÈùêăàí—G‰¿IƠ™‰kß [ïSù×›Ú‡¯ÈÏÔ²¹£Ôï»÷ÁÓØÛêĂÖ”ŒÜ̉ÁÓ¼­È±»ÿ¯¶¾ßûÓăˆŸ;½‡‡¹̃©¼ƠóÑÁçÚ˜‡ƒˆáÖ¡È«‡“ÍjĂÈÙÚëöÇÖ±»á=ñÁ°êص؛¶é½«‡“Íj±»ÍË)éÛ9¥ß»û‰ÛÛ«‚ ½9ÏÔ•ÖƒÖÚºÔÅÓ”ÇùêÛºÚª‚ +¼9™‰kß [ïSĂĂ ›­±àéMÿ¯¶́ơ#èÔÛ«‚ ½9°»ơê™ëéåø¿߈½€½ĂƳ”ăíå̉ ¶‰¨‡¤2€̃êLăˆŸ;™‡ĂôưÀ™‰kß [ïSëöĂÙÛ×Û«‚ ½9©ØÙŒë*«ă¶¼€ +‡ù×ăˆŸ;ăÜÁ"ơê߈ŸÈ†đ5±»˜Ô¢ ½«»«ơ½ψĂÙöư¹«­Ä‚ëöÛ×x‰j̃ZîSñÓ½€ª ¨ƒº5±¿½È–Œå̉ ›¾‰Û™‰kß [ïSщµØµØ½÷ˆ¿̉÷ÁăˆŸ;k¡ÁƒvƯÓ ÅÔ½€…»g™‰kß [ïSÜ߈9¥‡óÔ½Ù׿»ơêƒÖưÀ›ÓçÿÚÛ«‚ ½9¹Ú³ƒÖƠÊĂÓ«ÔëÚøæƠẠ̊Ä£äÅ¿ÏÔ¹Ÿ»“Ơ·‡‘×8ç°»ö°¿Û«‚ ½9±»“ȃԺñÓ ¬°àèMûÓĂÙÇè™ÓƒvÏÄ·ÔÁƯÿÛœÂßÚăÁ÷Á‡Ú½£äÏÔ±»ßÁëöù×ÁÚơԄŧÔ߈ëöëöƯ·ùנȽÛá=ß½¸Ú™‰kß [ïS³ÈÇØùơï½₫ÛÆù×÷‡ÁרÏÅß»ûÿÇ™‰kß [ïSψÇÙÚå̉ ̃ŒÚ,ÇÓ¿¹‘±»ÅĂö߈ơ…‚¿àÑѱ»å!¡Á‡a‹ÜƠÛ«‚ ½9ù×ùת‡’̀j‹Ç§àñ¹Û«‚ ½9¤Ó«»Ùàơê߈UÔX §‹Ñ·ĂÙ±»›¶é¾÷ÙÏÄñƾßêöé‡ù×ăˆŸµØ¸ØŸÈÑóĂÖ÷Á߈Ù×ÁÛØƠï‰ÍÂéÊƠÆØ½€‘±§Ô“È­ßÄÙ§ÆÛ×ơÄшªÚ 9¥‡߈ÏÔÛß»ûéÓٽ˿ĂÙÇÖ™‰kß [ïSƯÓ ©‡¥2ßëMỞ»Ó“¹ƯN‹Ùù×ÏÔ«»Ç™‰kß [ïSéÓĂôͽ«‡“ÍjÙÚ±»¼ÔÑÓÁĂÛ«‚ ½9“Đ߈¬ÄÓØöÁàƠ ¶Íľ۫‚ ½9¦Æµ̃ưÀñÖÙÚ†ºỞĂƠ«‡“ÍjÑỌ́¶ +ăºĂÙ…öшß»ûß–ׯă»Û«‚ ½9÷Á—»½Û×±»‹¾·‡‘×8癉kß [ïSǼåÂưÀëö­Ä½́¹ÍÓ™‰kß [ïSư³ĂÙù×çºÂȲ×÷Á‘µÙƠÙ¡ÈÁƯÿÚ›çÓÅßÏÅêö±¿ÏÔÁ·‡‘×8çĂéă‡åô÷ÁëößڻłØÏŇ۶ô¡Û™‰kß [ïSƯÚŽóÑÄëëö÷Ùư“ơêỞ…ŒăˆŸ;́–G÷ÁÚÀ«‡“Íj߈™$áăˆŸ;ÑĂăˆŸ;«‡“ÍjÿÂĂĂµØ±¿—¶éÚ­Ôô∕Èû›߈¹Ú‹Ç߈Á̉öùöᤓƠ©¼µØÎÅ™‰kß [ïSÓØÍßưÀù×Ï僈¡Èù׫ÓÙÚù×§ÓçÚ™‰kß [ïSÁÏÔ«‡“Íjƒ×ơêƠÀĂúƠ߈߈ăˆŸ·Ôƒˆăêơêù‡óÇ„ÚÏ̉­văÁŸ}¡Ô™‰kß [ïS… ºy"ĂºÛ«‚ ½9߈ºÁ›¶éƯºÏİ»êơ÷³ưÀ‰¿IÛÀù¿óÇÙŒë*«ăˆŸ;£äÏÅáZ¡̣­ÖÁ|™Á±»µØϺˆ©Ó…ĐÓ‹Üív‰ÛÛ«‚ ½9—»ƒ½‡×›·Ô׿8½€³ÔߌÛ,»ØÁ¨¡ñùêÿ¼ÅnăˆŸ;ÍBÁƯ߈ù×Û«‚ ½9ơé…ô¡Ô™‡°»ĂÙÛ£äëö8¤‡×³Ơ½÷$«ÚÑÄë·‡‘×8ç±»‰ùŽËÖđÓưÀ¹Ú«‡“Íj—¶ù×¼ơêù׳׳ÈöăˆŸ;¶''‡ºëj㻫‡“ÍjƒˆëÓ˹ơ™‰kß [ïS¯¼Û×§©Ø¾‰Ư‰÷Á­Ö‹Üøê߈ÏÔñÓ›¹±½¹Ú́ºß̃ÏŹƠ™‰kß [ïSÑÓÁÛÂÙ‡º¯×ɦÏ̉‹ö—¶߈½шùÔÏŰÁµÛ½ÏÔÅÔÙ×Ù̉éºÏÔÇÖ߈êÔ6°»ÀĂ£ØơĂÇØ‘ڜܱ¿³ ëö½ô­Äù×ëÓƠơÁĂËÛä̉«‡“Íj«»ơÔ™‰kß [ïSă‹™‰kß [ïSù¿ƒÖ¥á߈¯Ẹ̀½ÿ˜‰j̃ZîSÇăˆŸ;¹Ú“ÈϺåºù×ëö퇡ԯ×ÏÔ¾»n9¥‡ù×çÚÛ«‚ ½9ổÛ«‚ ½9†Œ•ăêÖÓ±¿ƒŽƒvÏ̉ÑÄëñÄé™ÔׯưÀù×ËÇăˆŸ;kÙ½ÍĂóƒöÅù×ù×ïƠ•ש‡¥2ßëM‰¿IưÀ›¾ù×½ÏÅÁ¹æöÙ½ƒàăˆŸŸï½›¶éµŸ}ÿÚ±»“ÇÓ߈½Å»«‡“Íjñó½ëö½Ở¿ß³ƠXÿÚăˆŸ;­ÔÿÚÙ×»½É̉“§ô×¾ÅÓ߈³Ưâ»Ù½é‡µ¹‡ºÙÜö™»µØ߈ÁƯ•Ó‡ºá ©Ó§ô±»ăˆŸ;Ù½™‰kß [ïS‹Ç¤ˆ\0ËÓ§¹‰ÛÿÚ¹Á½ơÛ½å̉ ĂÈ«‡“Íj§Ó¶Ô ±»›¾߈çÚ‡ÚĂÙÿ§ăˆŸ€ƠîéËÓêơÍǺ™‰kß [ïS‘ÆËÇÙ½°»¨¼±½¾Å•ÏÅÏÔ¾߈½ÔX¢Ơ ™‰kß [ïS§ô‘ÆÏĘêèä§Ó«Ôíê—¶߈¥ºơê¡Û‹Ç™T¶ÔÏÔ…ÂơêÏÔĂƠßÂ󼘉j̃ZîSÙÅ뇿ù×Ư߈ưÁÙ½ßÖ®ö›­‡±»·‡‘×8çù×ëöŽ™‰kß [ïSëöÇÖ¸ÚơÅ®È߈ù׫â˜êèäÏÅ¸à‘Æí&ÿ¯¶÷ÁÛÚ›¾ÓØϼèôÙÚß»ûÛ«‚ ½9™‰kß [ïS³Çù׿‰µyÙ̀¹ÏÅçœưÀïÚÙÚÑÅ›¶é˱¹ÚÊƠ©ÓđÖÙÚóÔÇӆإ˜ăˆŸ;ëçå̉ ËƠĂÙĂÙ¹Ú́vµØƠ÷Áƒv©ó­Öжÿ¯¶êöíÖ­Ä»ÑÓWù뙉kß [ïSÑÓÙ½¦Ô…ŸÙ½ƒĂơÔ߈ƒÖ­†ÅôơêºăˆŸƒvù×£ä̃ˆ‚v™×ÏÅ9¥‡ăˆŸ×ܱÀå̉ ‡˜Ăº²ÈÚĐí$˜‰j̃ZîS‹ÇÂÖ®×±»ÅåÁÓ¾­Åä̉Ù½ù׿‰ûéu£Û¹=Ñ߃Ûï×Ó ¿ ™Ÿ‘ù©éËÅ!+‰á3'¯©.µK÷!ü&3µ†íÆß曾‹Ü‹¸ù×è‰Cđ5CCđC¶CçÚ́&ÛÄÓ•{…à̀Ó9¥‡™‡é‡«âƯÓ ƠXø×ÁĂÁߌÛ,«‡“Íj¯¼ÙÅëëö‰ÛÁ®‹Ó¡Ô³ר‡ºÏÔ¸ÚéÓơê₫²Ûù×­ÖŸèÙŒë*«Åةܿ܃v½€·Øù×¹ÚñÁăˆŸ;­Ö»Ă¿ß߈™‰kß [ïS» »Å±»Å–Ă¼ơêăˆŸ;¯ÈÙÚÛ«‚ ½9¸Úù׋ǃvÏ̉“¹ƯN9¥‡×±»±»™‰kß [ïSù׫‡“Íj‡Œ³”¶è­¾ăˆŸ»Å¡»çÚĂα»ÿ¯¶™‰kß [ïS³Ç±ëؽ̀­ù×ÏŃvƠ´†߈»̉߈ÏÔ¥ˆ]1•Œ±»·ÅÛ«‚ ½9ÁƯÙ½‚™‡ÿÚƠÏÔ”ŒÓ¼™‰kß [ïSׯÍÓèô¿‰̣"ÚÄ̉Ûׯȿ‰±ÁçÇÙ½Û×¶èXỞăˆŸźŸÖ†Ÿ +Û«‚ ½9˜‡ơÔ±»Û«‚ ½9‹Ç¸Ú™‰kß [ïSăˆŸï½ĂßÚô$¯àóÓÍÄăࡇŒ¡ÁÓ©‡¥2ßëMר›ÚơêÓÓĂÙíê¶ù꨼۫‚ ½9­¾‡“ơĂ½Û«‚ ½9ÁƯëö±»åó›¡߈ܺÓ ‹›æ‡Œ¡ØG½¹å¿˜Á“Í»ô™‰kß [ïSÅӵعÚ߈óµaŸ‘ÛÄÓ£ØÄôëöƒvƠ­vÂĂơúăˆŸ;ƒv½̃ˆív‡ÇửÛÀÜ™‰kß [ïS·éÛ«‚ ½9åÙÓ½¥Óè¼ÍÇÛÄÓÙÚ›ÚăˆŸ;ơê©Ü©›ºơêµØ«‡“Íjư€߈ÏÔÏÔ°»ÍÄÙÚÑØí—G¿»«‡“Íj±»ºù×î½ÅÄù׃Öëö—»ñ»Ổư‡±ù1ù×Ó¾9¥‡ëöñÄÛ«‚ ½9å߈߈•Œ÷ê±»Û«‚ ½9ׯß‘íôßÚöÁ—ÓÎÔă»ÑĂĂȱ»ĂĂ«»¿Á‡é/×:Ở±¿ÇÖçÚº‡ÚƯÓ ÁƯ·ÔÅÓ÷Áéêƒv¬Ô߈ăˆŸ;ëöå̉ ½ăˆŸÏÔËÀÁ½±½‰Å©ÇóÂÛºÿùê¢ÇÿÇÛ«‚ ½9ÍË)éÛ9¥ívÿ½™‰kß [ïS²ÈŸ}ëöùêÇĂƒv8(¤‡(Ö ®Gøø×9¥‡×Ươ߈»½ñÚ©¾³ÂưÀ»¼‘‘Æàû(«‡“Íj߈Ï̉åĂË¿ÍÓ…ÏÔ‡Œ÷ÁË%µaÙÚÍË)éÛ9¥Ơ«‡“ÍjƠXăˆŸ;÷Á߈±»Ÿ»‹Ç£ƯăˆŸ;Û«‚ ½9È» × ÛºÙ½¤È‡º9¥‡¡Á®ô¡ËÖÜÅIJÂÛ«‚ ½9ù×ơÔ¹Ú›ÛăˆŸĂÙÎÄ¥Çù×ëö©ÓơÔ¡Ó߈ĂĂ ›­±àéM™‰kß [ïSûØ·‡‘×8ç±»ˆ«‡“Íj³Ô™ôƯ±»µØùꥈ]1µØ…»ÿڱ÷ÈßÖÇÖåĂ½ùê9¥‡Ï̉¡»ÇØ£äëöóẪˆå̉ é꿉ŽơêÏ̉Ơơù×™ÓăˆŸ;ÄØ™‰kß [ïSç̉ÿÛÑÄëôêÏÅå̉ ™ÁÏÔ½ƠµØ›vÙY­óÎÅ¡Áơ¥çÚ͵ÜÏÍ‚¤wỞĂơÔôœ‰¾I—¾½ÛºÙƠ—¶Ûº©Ø߈Óºö¡Û¬Ö·§D ™‰kß [ïSĂĂÑŰ»Û«‚ ½9­º™ëéå߈ÁƯỞǺ߈ÅÓ¹Ú™‡ƒˆµØưÀù×ù×½Úª‚ +¼9ÿÚÚª‚ +¼9YŽ·‡‘×8çù×Ơ×ÛëÓÓÅ©ƠëöÍƠÙŒë*«¾§ô¬‡™‰kß [ïSûÖ¡Ô±¿ñÓ¹¶ăˆŸíÖƒˆ÷Úô©ØíÆ™‰kß [ïSéÓßÁëÓ…Ú±»ÏÔ¡ÔµÈÉ̉™‰kß [ïSá©ăˆŸ•Œçm8¤‡«Ô₫™î¹Ú•½߈™Ó°”ƒv×¼ºI‹È³Ç«‡“ÍjơêÏÔăˆŸ;ÔºlÛ«‚ ½9«‡“ÍjíJđÓûƠÂÙơÔ½¹¾›¾ÔºlÁÜÀ‡€è/Ö:‡ñ5«‡“Íj·‡‘×8çﻘ‡ăà™‰kß [ïS‘£½×ÜỔå̉ é‰ñ5ñ·ƒv±»÷ÙăˆŸ;ÏÅ¿ƯÀĂ…»«Ú™‰kß [ïS߈¿»©‡¥2ßëMËǭؽ±»ĂĂÏÔ÷êÇ%߈·‡‘×8ç÷‡¹Ú±»áÛù×ô÷ÂưÀÓº“ÅØ̃ˆăˆŸ§ÓŽ™‰kß [ïSĂÙщ¹ÚƯº…ÔñăˆŸùêщáÓ9¥‡ÏÅÛ«‚ ½9÷Áù×ívÅØĂ¼ơÔív½©̃ĂÙ™ÔÑÓ¥‰ÍL…÷‡¬ÖßÚÙ×ĂĂéÓ÷Áº̉±»ÁƯÿÚö©‡¥2ßëM¡Û»ÁªÚ¶Ô§ô×ĂăˆŸ;ơĂ«äщù×ÏÅăêÏÔ™º­Ä“‹ƠÜ߈™‰kß [ïSĂºÙÚ©‡¥2ßëMÀ½ùÛ¿‰ăˆŸ;k«ÈùëñÓǼ¢÷‡ûêDZ»ëöù×ÑÓœ‡·ÅçÚ†ƠËÇÙ×£Ưº½ …Ơƒv‰Û†“ă‘ùê±»­Ä½¯ÛÜăˆŸ«‡“Íj÷Á߈Ù½ÄnÛ«‚ ½9£ ơê½€ù悾  ³/ÿÇ߈¯¿Å«Ô™‰kß [ïS‡“ÙÜóÑԑ¾óÇö˜‰j̃ZîSñÚׯăơ¾ơÔ©ƯöÁ‡ È±î½ªÔÑØÁ8¤‡Öăơ¿‰œ‰¾IÙ×ÏÅỞÚª‚ +¼9ƒµàù×ÿÚÛ«‚ ½9›¶é߈ăˆŸÖ¾ưÁÍB…ô‡ŒôËÇÙÚ½£ä«»Ù½ĐâḈûØ©¼çڭĽ¿‰ỞçÚ߈ÙŒë*«9¥‡™‰kß [ïSæÚ4£äÛÄÓçÙ܇ñ5ÛÀơù¿—¾߈¹Úù×ö§ôÿ¯¶—¶…¼ơèÅᾳȗ¶×¾ù×êöù¼ö¯È«‡“ÍjÓØ¨Øă»·ÅÛ«‚ ½9¡Û‚v—»±É±»÷‡“ƠÑØ %Ë̉Ǽ÷ÁÓÔÏ̉9¥‡Óº™‡ƒcÏÔ‚vôpËÉ9©ăˆŸ;¡ưÀ¸ÚÓÆ½±»­ó£äù×½ÎÔ߈ÚדƠăˆŸ;kĂô©ÇÛ«‚ ½9¹ÚƯº›¹«ÚÅØ½é‡­Ä©Ó»ÅÔ÷ˆ¹Ú™‰kß [ïSëöË¿ßÚ¯ÈñÓ±»đÙ”ÖívÑÓ¿Ơ÷‡³Û«‚ ½9ÏÅÛ«‚ ½9°¿ ¹Ú«‡“Íjÿ§߈щ«»Æ‡äƒvèÓÛÅÏÔ‡ÛǽÉ̉ÚÚ8¤‡«‡“ÍjÿÛ°»âơá ƠXÁÓíÖ‰¾ăˆŸYÿÂù×ÙăơÏÔ¬¾ưÀóÂÙ׺ëö™ơ×ƠœÂ«ÚØÓׯ±»©Ó¿ßÀĂÙÚÁ½Û«‚ ½9åĂëÔ…Ö½‡¿‰÷‡ëö½‡÷Á½ô‹ÜÛ«‚ ½9Û«‚ ½9©Ó÷å5ÓĂÈå̉ ™‰kß [ïSóÂÿ.Ơ߈¹Úº»™‹Û«‚ ½9™Ăÿ¯¶ªÚƠÄç̉×™‰kß [ïSăˆŸù×Ϻ̣¶è‰đ5đ¶óÂ˹…Û‡ùăˆŸ;¹ñ“½Ëlj¿I›¶é¡ÈÅØöơív™‰kß [ïSщĂÙ§å¾Û«‚ ½9ÛÀ÷ÁíÆ«‡“Íjù×ñÓ9¥‡ß»ûăˆŸ;߈ƒvκÏÄ߈©Óƒ×ú¼ĂÿÚ½ĂÈψ…䫇“Íj߈±»ö›¡ù×Ó«‡“ÍjỞÙÚ½ÔËÉ9·‡‘×8燣äöÛÄÓÿڳȋÇï½›¾ØA“öÓ¾đÓá ÷Á¥ˆ]1™‰kß [ïS™‰kß [ïS߈å¿™‰kß [ïSƒv¹Á«‡“ÍjÛêÅÔç'ÿÛˆ×Ơ‡ĂÅÖ±»X“ÆÛ«‚ ½9Àăà¹à°½½ù×̀Ê)èÛ8¤Ă¼ÇØ߈öƒvù×Ú×ÑÄ뇓å׉àƒv¼ôĂÈÏİ»¼“È»½÷Áˆ’¿ßÛ«‚ ½9ËƠơ„¡È±½óÇå¡«Û8¤‡×—»ăˆŸ;ĂÙ‹©¼ưÀÅ–÷Á½±»ÅØ¿́­Ö߈÷‡Ø»»Ă“÷ÁÅı»©ƠƒÖÿ§¨¼¼ëöñÙÙƠÏÔ¿»½“ƠïÍÍƠÅÄÑÓ§ù×÷Á©Ó±»½¨¾Ă¦Æ–ŒÛ×÷ÁÀĂÛÄÓßÚ×ƠÏÅÅûØÙÓáê”±½­½¼9¥‡ÁƯºç +±Ü·Ô±»ƒv›¾Ó¼“ƇºµÀ…$ùê¯×ÛÄÓÅÙºËÉ9Û×Ïŋӳ’ÏÔ±¿½ăˆŸ;k±”ٽšÈå̉ Ù½«ÑÏÅù×ĐĂơº«‡“Íjùº÷Ú½­¾Ë̉Ϲëö™Áơ$ưÀÁƯ¢ÔæÚ߈ÙÇ9¥‡µa«‡“ÍjÁçÛ«‚ ½9å̉ ߈8¤‡½³ÂƒˆÙăˆŸª‡’̀j±»©¼§ÓơÔÀ¹·Ô¿ØÛÀăˆŸ;ăˆŸ;߈Ưå̉ ñÚǺƒ×­ÄÏÔß»û©Ó÷¼›¾¹ +±¿“½ôê Û™Ë߈ß%ª»ù×ăˆŸɇíÆ±»å̉ £.‡Óº·Ô›¾—¶£²ăˆŸ½€ñÖÅ–çôªĂ)›¾߈ÓÅÑÓ†ŒăˆŸ©ÀĂÏP¥È߈ƒvĂù×°»ó™‡·¼Í7ª‡’̀jñôê½€©¼‹¡%ÏÅÛ«‚ ½9çºƯÓ ‹ÁçÚưÀƯÓ Ï̉ÑÓ‡÷Ú½Ù¶Ûºq߯¿°»ơÙ½€äŒ¾N÷­ÿÚơêçô»ç¹Úר߈ïÚ¿ôÏ›¾ü‘…“½߈±»ÉƠǽƒÖ߈™‰kß [ïSöÁäÁ‹ÈÎÔ°»¯Ơ×Ă…ÜÙ×ĂÙ©ÜĂÈơÔ™‰kß [ïS‹Çá×Ù½ÏÔ¹ÚỞÛºÛ´Ø«‡“Íj±¿½ª»áß½·Å«‡“Íj™Ö₫ƒvö£Ç·Å½»Ó©‡¥2ßëMăÇíñÆÜÓ ôé!ÙÓÙ×å̉ ±»“™‡߈©ß¹½›©Ó‰¿I퇛¶éù׺±»Ù܃Û׼ؽ°»Ù½«·3uU9¥‡öơê½ọ̈¶$Ù̉Û«‚ ½9ÙÚơÄÂƠÛ«‚ ½9«‡“ÍjÅØ¡Á÷‡¯G‹øïÅĂÙ±»ĂÙ½Ùà«ÔÙ½ƒˆ—ÓÅÔ»«‡“Íj™‡ËÇÄÓÓØăÚƒv¹ÚÙà߈½¾‡©‡¥2ßëMÁs§Ôƒ¾‘£ØщơÔ¶  ăơÏÔ½ÅÔÛ«‚ ½9ôÓÔÙ½©‡¥2ßëMÁÛ‹ÙƠî™Ô÷óÇ£äĂÙÓ̃ÁƯ¡Ôù¿ßÁóÂÜÓ ­ØăˆŸ;½Ǽ ËûúƠß»ûÇÖ9¥‡ó¶«‡“ÍjÙ½Ổ¶ëÚëö̀Ê)èÛ8¤˹­Ä¹Ú‡Œù×±¿9¥‡³ØƠ¾Gáê‡ăĂÙï»ÅØÿÛ¡ÔϘêèäÏÔ½Ï̉×9¥‡—»©Øù×Û«‚ ½9¯¾ß»ï½À½ÿ¯¶·Ô·ïɇ8¤‡ù×îºơÔ™‰kß [ïSö‡»ÂÙơêƒØ™‡ ËûÙ×ÊÚÿ¯¶ù×ëöù×ă°»ÙÚ9¥‡èêÏÅ‹ÓàöÛ«‚ ½9ăˆŸ;ºçÑÄëĂ¼Ǻª‡’̀jÇÛù×ÏÄ×¾¿‰ÏÔăˆŸ;öÏÔß»ûăˆŸ;Û«‚ ½9«ÔÏÔù× ËûÏÔù×™‰kß [ïSѾƒv÷Á´Îj̃ZîSưÀ¼«‡“Íjׇ½7³È·Å£äÙ×óÂÏÔëöĂÙó‡€öåס»ö›¶éÓØ·Ó ¥0¡́Úª‚ +¼9¥ˆ]1÷Ù¥ÛµØÍœ‡ƒv¿ïG½¹öù××ƠÚª‚ +¼9ï»¶÷Á ËûĂç½™Áïô—Œ±»ù×ÅÓ°»¹Úëö‡ŒÑ¡Ǻÿ†ö +á ÀƯïËÛÄÓîƠ °¾#߈­vª‡’̀j™‰kß [ïS߈‰¿I¤ÁËÇăˆŸ;k£ÇµØ߈Åív‡ŒË%±¿–¶߈ù×óº·È½«‡“Íjƒøô2«Ô…Ø̃ˆ)Â9¥‡¼åÁëö˹—¾•%‘ÙÏÅ߈ăˆŸĂÈÇ…Å™‰kß [ïS߈öÛ«‚ ½9Æ%ĐÄêÑÓ½߈Ô½ưÀƒØÿƯù׬Öơ‡ÁĂÛ«‚ ½9Úª‚ +¼9匿NÏÔ¡ÁơÔƒv–¿ÓÅßÄÙË¿ƠÄ₫®¶¾º߈™‡ï»“¼™‰kß [ïSÑ+ôÑæÛ«‚ ½9ó¹ï‡ßÚăˆŸơêĂÙá ½€шñÚ½ñÚ÷Ú‡Çáö‘%‚ˆ»ºщƒˆa—ˆ߈ù×Á½›¾ăˆŸ;Á±»§ü§Ôơø×ßÁ³¢ ̃ˆù×÷“¾»ëƠUÑÓû߈Ú׿ô9¥‡ËÉ9ÙÓƒˆđ‡¡ÁƠÓ£‡ŸÖƒvÙŒë*«߈ÁË9¥‡˜ơ§Æ·ÔÏÅ¡Ơ‹Èº™ÁÛÀÍÄÙƠ€ºăˆŸ;k¹Ú鈽ÙÚË ßˆˆ«)ºÏÅÙ½ÏÅ¡«ñÁ¸ÚÅ–¸Ú«‡“Íj¸ÚĂÙ…‡÷Áˆ¡äñ½¢Ç·Ó ¥0¨À¿¹Úª‚ +¼9ŸóÏ̉߈ăà¡Ô«‡“Íj¾˹ưÀ«·3uU™ô¼çăÔíê¾ó½½ƒ7‘ÓÓ¾¥Æ½öơĂ™Ôù×öơê÷Á™‰kß [ïS™$á¶  ÷‡‘‡ëöƒv›¶é‡x›¾±»Ăđá ûÓÚ×½™‰kß [ïS‡Ç†“ÛÙÚƯ‰Á¹·ÅăˆŸÏÔøê‹Üöшö¨¼«Úù¿…ĂΙԼԃÖÏÏÔ¡ÁÁ|°½ÙÓ߈Ùôê ĂÙ²¹߈‡Û±»é–ưÀ…ÂỬôß»û́«º½ưÀ£ ¿ß8¤‡ÏÄó Üg÷Á™‰kß [ïSêö ˜‰j̃ZîS…ƠÙÚ±»ŸÄëöÁù¿ƯëöçmÿÚÛÄÓ½ĂƠщ₫!µØƒÑÄë‹Ç¡Û̉½«‡“Íj›ǼăˆŸ’¹ÜN˹ÿÚÑó±»™‰kß [ïS÷Á߈ơêă½ Ơû¼áÛ•ŒƯÜ«‡“Íj“ÆÙ»ù×±»ưÚËú‘%ÏÔưÀăˆŸ;“÷â੽¹ÚưÀ9¥‡ÿԳƇǫ‡“ÍjÓ̉ÛÄÓáö£„щƠÙÚ·Ô½°»ÿÚ©&ë°³ă‰ÔĂëöÁ×¾ùà™ÓñÚ€Û«d™Óå̉ ¡Û©Óá ÅÄóÔ ÛÏŽëÅƠÛ«‚ ½9™‰kß [ïS߈ÁªÏŃv—ˆÈ̉̃ˆ™Á¶Ô߈Û«‚ ½9óÂï»çôÑĂÉ‹æƒÚ°»Å«ä¡ÁçØơ꫇“ÍjăˆŸ;kĂÈ“ƠËÇíµ÷¼»Øƒˆ¿‰«‡“Íj߈£Ôôͼׯëö߈ÍÓ·ÔÔ¾Fô8¤‡Öù×¹Ú¼ÔăˆŸ;«&ù×½€ßÄÙ¸Ú ¼çÑÓ½±»µØú(å×ÙÓ߈¡ëö“¹ƯN»È±»§¹ù¿»½éº†ä ƠX™‰kß [ïSÏÔÛ«‚ ½9±»—¶ÍƠ߈¾©‡¥2ßëM߈ÏÔ•{™‰kß [ïSó¶ƯÀù×ëö™‰kß [ïSÙÅë«Ú³1ÑÓÂưÀÑÄ륌ßÄÙù×Û«‚ ½9™‰kß [ïSƒˆØ»÷Áùסԫ‡“Íj»n«‡“ÍjơèÅÏÔ¡Ư“Ûæ'©º˜êèäÍÄÿÁÏÔ§‡—¶ăˆŸ¥Ü·‡‘×8ç½ơÄÛº̃½¯×¾ßÏÅßÄÙÙ½ÿ%“ƠÙÚ·Ôêöºÿƒv«ÔƠù×ơÔ™‰kß [ïS£́ăºÁ‹Ó¢»ÿÚŸ\ù¿·¸§Ôơ$ÏÔÀƯ¹ÚăˆŸ;k‡Û™‰kß [ïS¡ÛÔçÚ¡Ưÿ&ÏÅ·‡‘×8ḉ–GÛ«‚ ½9Ü¡•߈©Ơ¸Ú±»«‡“Íj˜‰j̃ZîṢÄÙ̉ăˆŸº›¾¹ï½ÿ¯¶ûØ™‰kß [ïSÏŹửƯâßÖ½€û|«‡“ÍjÏÔg™‡ù×ÙÅ멇¥2ßëMóÇÉ̉½ơÔ£æ©Øù×ÙÚËÇơÔ‘Û×Ă™ô˜‰j̃ZîS‹ä—¶éÚÙ׫»°»«‡“Íj…°êØ©‡¥2ßëMÓ«»÷ÙÔuµØÜăˆŸ;™ØçÚÁƯóÂö±»ƒÔ€Ơ½ƒvöù×ÿ·ÔäÔù×ơê¹ÚÙÚÑØÙÚÿÚÏ̉—»¡ÔºíÚº·Ó ¥0ù׃ױ»©ÇÁ‡é/×:Á̉§ôçÚïÁ¹Ç…»ËǦÓ÷‡«‡“Íj›¾ÏŪ¶2tT‡ÛƒˆÅÓĂÙ×Ó¯Ơª»Û«‚ ½9ß»ûĐÓ·ØơĂ“ÛơÔ‡ººưÀ÷‡ă½ôÂÙ›¾ÛÀéê‹Ç߈Çâ߈ăˆŸ;k±»ăˆŸ;ÇđƠ…9¥‡ª-  ‡ơèÅ߈©‡¥2ßëMóDZ»÷ÁÛ«‚ ½9ûÓÖÚ¯­¡ÑÓ½™‰kß [ïSÿ¯¶ùׯ¼Û«‚ ½9·ÜªĐ¶èăˆŸ‹ÛñÖ™‰kß [ïSé‡ËÓùêåéǎ±Á±»Û«‚ ½9¹Úù×Ơ÷‡å×ÙÚµ†ÄÁ«‡“Íjùù×ÉĂ¡Ô™̣é–”{•îä×½‡Œ½ƒvÙ-‹ÜăꙣäÚÛ«‚ ½9凰Áù×ÁÄ9¥‡÷ˆ÷ÙÍÇÏ̉¾é‡ĂÙˆƒˆ©-߈¥ÇÛ«‚ ½9߈ÛÓç̃шÛººù×ù×»P½€²bÏÔ«‡“Íj×¹±»Û«‚ ½9Ăô±»‡ö߈•Œ±»óÇÁƯ™àëö›¾«Ôơê·Ü‹Üÿ'ß„“Æ¾á –¾$ׯª»©¼Ưºëö·Ôƒv›¾Ưº¯ÈÉ̉ÅôñÆ©™ÁăˆŸ;…=ù×™‰kß [ïS¯ÈÇÖÎÅÏÔÿ¯¶߈£ä«Ô‰ÔµØ߈ù×ÅØ³“ÆưÚÑÄëƠ±»ªÔÛ«‚ ½9ƒ¹Ú£äí³•ŒĂ¼€ ÎÔĂĂßÚ¹Úăơív«¼“Æëö¥ˆ]1÷²ăÁéÚˆ¾ß™‡ù¿ßÏÑËçƠ«‡“Íj§Ôµa¾º¿½߈ÛÀưÀÁ ơ»ÆÖçô¡Ç»ăˆŸ;߈—»ívÓºÓº·ØéÚœÁĂÈ…ƠÛ«‚ ½9“¼™Áó^ơ’‰2Ô,ø©Üử‡ºÙ½¾‰¿I§v¶Ü2ùêÛ«‚ ½9¡ÔÙ½©‡¥2ßëM·Å˜ô³ĂơԩǺ—ˆơêơÄƯ•Ï̉ƠÉ'‹Ç«ÛƒÖÅùêó#ëö‡Œ­ÄËÉ9µ†ƒäŸ\™‰kß [ïS¥Á߈ׯ™‰kß [ïS¢X‘Ûß»ûؽ—¿Ïű»Ù×߈½“Æø¼ÙÚí™Á¸ÚñÓáê‹Ç߈Ï×ÜÍÓÿÚ¾ßÁ«‡“Íj¦¹ïÚ‡ºÉêöëöóÜ«‡“Íj“½±»߈Ù½ódzá¥Û̀Ê)èÛ8¤߈Ù½€ƠÅÄưÀëÚ¸Ú9¥‡ÏÔ«‡“Íj«‡“Íj±»ív¶vÙÚÙÚú˜‰j̃ZîS½Ô‚"—Óû˜‰j̃ZîSĂÁƯÏÅß̃ºÛ«‚ ½9ÁƯÙ½߈ºÅö§âơẠ̈«‡“ÍjçÚÍË)éÛ9¥ƒ+—Ó¥Ûëö±»ù×Üå̉ Û«‚ ½9«Ô‹¿å̃ÏÔÛº« ©ƒ»5щ£Çé‡ؽƒvÛÀÚ×ỞïƠ«‡“ÍjÏÔëö ÔóăÓÅ›¾ÏÄ»Øï»ăˆŸ;‡ºƠXï髇“ÍjɧӥÇ߈ô¯Ü¯Æù×̣LJº߈ï‰á ¹Ú9¥‡¿‰߈ÁÓÛ«‚ ½9ï‡ăˆŸ;ØÓ©¼™‰kß [ïSÙ̉àºÈƒĂíê±»½ÙÅë߈‘«…Ơ8¤‡ơèÅŸÈÜÓ ª¶2tT¬¶ÙÓ½ư%£Ç߈¿‰ñÚ±»¡ÁٽŻöÁûƠơêÁƯǽ¶Ú±»9¥‡±¿öù×飹ږ¶Ë̉ƒvÔÛ«‚ ½9çÚáÛñÓ±»ù¿Ù̉ÎÔ¥Đå˜Ï̉ơêÛ×щ°»‡º‡“™‡κ›¾£Úш·Ó ¥0÷ÁĂÙŸ¸Úù×ï³2­ïÔÁñăˆŸ±¿ù×ïM޵†Æ̉ +½ôƒvÁ¹ˆ9¥‡×ô¡üÀ¥ˆ]1ƒÚ·‡‘×8ç9¥‡êơÍÓçÚ‹ǛÊ)èÛ8¤ïƠ¿́öù¿¿‰Ë¿ß»û׿8¢»½™‰kß [ïSщ¶‡''Ö8'æ'ăˆŸ±¿ÿ‡“ƠơÄÅÄÏÔëöôĩؖˆ áê¡Ô¹Ú¥ˆ]1ÏÅ—Œù×ù×±»9¥‡©Çƒ•Èû›¯È߈‘Öù¾߈·É©Óá ¯¼ÓÅ¿¥ “q³Â÷ÁÅӅགྷvù××Ơ†7§j½ăˆŸ;ÿ ߈߈߈́½ÙÚ¿1±»ÏÔ«»ăˆŸ;k½€߈í—GÏÔÍÜÙÓÛÔ…ƠÑÓ«‡“Íj¿º‹ÇÙ½Ÿ÷߈଀ӷ‡‘×8盾˜êèäªĐăˆŸ;«·3uUùÚ·ÅÉ̉æđ³ºÚª‚ +¼9ÛºĂĂç̉Ÿ…¾å̉ ÍƠ®ö×Ơ¹Ú‡ÚáƠ«äÛ«‚ ½9ƒˆë¨ÜÁ̉‡ºóĂÅ÷ˆ¥ˆ]1ÿÚ‰º߈ù×ôÔ†ºÑÓº̉¾³ÈŸó»Øă½³Èñ׾߻ûù¾›¶é™Ô–¾‹1‡Ç©‡¥2ßëMơêù¿¯¼ËÇ¡Ư˜‡ƠÛ«‚ ½9ÁƯĂ©‡¥2ßëMƠëöĂ›©«‡“Íj˜ô‰\™‡·‡‘×8ç»óƼívÁƯÙ½ƠưÀÏÔ„ÚÙ9¥‡™‰kß [ïSÏÔ¡‚văˆŸ¯‚¹½”Œ‡xĂÈÓÅÛ«‚ ½9…ŒĂȘ%ê%è%ä%­½¼ÏÔÙ½ÏÔñíÈÖôÚÀĂٕ°»+£X©Øáêܱ»±ëØߌÛ,›¾ñÓ߈÷Á™‰kß [ïSçÔ¡ưÀ⦅ÖÇâàăˆŸ;ÍÓÙÚ‰Û³ÂϺ‡º₫®¶߈ăà±»­ơƠÓÅ£»±́Û«‚ ½9Û«‚ ½9ç4߈ỬÙ½÷Á‚ˆÿÚëö¿Å½çôóÇÙ½±»ƯÓ ¼ËÇ«‡“Íjù×å̉ Ởô«‡“Íj™‰kß [ïSµØÏÔÁƯÛ«‚ ½9Çù×Ă½ĂÙ¹Ú™‰kß [ïS ÁùêôÅÙ½±»ºƒvƒv™Ø˜êèä·ÅG½¹¿ßÁƯư‡±ù1Î̉­Ä­Ä«‡“ÍjºÚª‚ +¼9™Ó›¶éÁ×̉̉Ƴ ™‰kß [ïS’ȱ»ö½ăˆŸ;˜‰j̃ZîSÿÚù׾뫇“Íj˜‡ÛÇŽ¿ßï½ÏÅ™‡íÆ“Ơ©½àÚ€º¹Úù×£XÛ«‚ ½9ÁĂƯŸá¬¯ÈƠơ›¾ÙÚïƠﻓƛÚă½߈¼|º±»íÏÔơ»¶ôº£Ø±»¾¡ÔưÀ±»ưÀƒvÏÔûƠÛÄÓÙ½ßÄÙ–»­Ä«‡“Íj±»­€§ôëÓ±»·ÔÙƠµ†Û«‚ ½9¹Ú±»”ö™‰kß [ïS˜‰j̃ZîSÍļôÏô›¾ăˆŸ;ƒv«‡“ÍjơêˆêöÅØƯÓ ¿ÛÄӯȫÔÏÔÏ«ÛçÚù×£¸›¹ÇØ߈Û×ÎūԸÚ9¥‡à̉—¾9¥‡×•ÏÔÇ"÷ÁĂĂ ›­±àéMù×ÑØëÔ‡™çÚ•Ç·̣ÁÚÑØ¯¼ˆûÓ9¥‡³£Ơ¨¾›ÚñÚ«‡“ÍjÉ9ơêöÁ½êÓéê½ÙÚ«Ôº߈¹íêư§‡ÏÔ°»¿»ĂÙù×ç‚ÁƯÑüßÁ°Ă‡ŒùåÉ̉±»ƠăˆŸ;߈¼¾ÙảºÑÄëªÚ¥Û÷ˆ¡Û½ƒ—ˆÂĂÇĂ›¡„ô‰Ô™‰kß [ïS—¶»Åß ©ÓÛ«‚ ½9Ơ™‰kß [ïSù‡Á¹9¥‡«‡“Íj±»÷Áưµ߈Û™«‡“Íj±»×¿8˜‰ +j +̃ + + + +Z +îS +•ŒÑÓ¹¾ϼ™‡ö—»û(‡¿¿»ăˆŸƒváêíØ™‰kß [ïSøơ™‰kß [ïSĂÓÏ̉®¼àƠơºÓÆ™ëéåƠ¹Ú‹Ü×à̃»ú´Ø™‰kß [ïS‡ïÈï»9¥‡ÙÚ±»©Ơ±ÁóÂÙ‡Ï9…½ô•ƯöÁ›¾ŸÈÁ¹ưĂ߈™‰kß [ïSѰ¸ÚÏÅ“Æà¼ùêÛ«‚ ½9ưÀÁĂ¡8¤‡×¡Á±»ÓƺÉÁÅÔ₫®¶©Óëö™‰kß [ïS¡Á́ơcó›¾Û«‚ ½9ù×¥ÄÛºÁĂÓĐ‡ÈŽ¯¾«ÔÏÔ¨Œ ÑÓ«‡“Íj«Ô“Èù׳Èß»û¿Ø©Ơ ËûùơÙ½Ó홉kß [ïS…ƠåĂơèÅŸ}ă­Á¹™‰kß [ïSƠăˆŸ;ÅƯ¤}ùêµØÎ߈«ÚÍÄ©‡¥2ßëM­ÔöÁÿ¯¶¿‰ׯ·ÔÙ̉ĂÙùë“÷Ž÷™‡Œ«‡“Íjă…«÷ÏÔ­Ä‹ñÛ«‚ ½9‹Û—¶¯Èơê§Ó½̉ˆ”=©ÇçØßÁÍĂívëö¿º­ÄôêíêÍƠ™ÔỂ©‡¥2ßëM¿ôÖÆÏÔ›Ú߈ƒÚŸ}“Ơ¿‰ĂË̉8¤‡ÑÓăỡÚÿ§ß»ûߌÛ,éÓÅÔÓ̉úÙơĂqËÉ9ëÓ¿‰™‰kß [ïS¤Ü£ØÑÅ™‡µØÛăˆŸ×̉¡Ư¥Û‘b³”G½¹öǺ߈ƒv9¥‡ËÈ9 ߈ư†‡uÛ«‚ ½9ÁÚăˆŸ;kƒvù׵؃Öéêù×ăˆŸ;ÏÄù×Û×Û«‚ ½9ÏÔ¥ÓçÚÛ«‚ ½99¥‡×Ưƒ·ÜÏÔª»ơÔÛ«‚ ½9˹¡ÈÖØ›¨)ÙÚëÓ×Ơ†7§j̃ˆĂ߈Û«‚ ½99¥‡ăˆŸ;k¹ÛŽưÀ±»‡Û«‚ ½9ÏÔù×±»˜‰j̃ZîSëöĂÙ«‡“Íjƒ‰¾ÏÅ߈½€¥ÛăˆŸ;·ÜƠùÚÏÅ¿‰—Œë Ï̉“ÛÅÄơöÁ·ËăˆŸ;Û«‚ ½9Û«‚ ½9ËÑÓ“ÆÁ½ưÀ ËûǼä̉°Á«‡“ÍjÛº£ÇñÓ™‰kß [ïSöçÚ­€Î³Ù½‚دș‡­ØëöÅ«‡“ÍjÏØÅê½€¡ÔỞ߈¥ÆÏÅ9¥‡ÅÔñÓÙÚǔ۫‚ ½9ïƠ«ÔùשÀ±»¡ÈÁ‡é/×:å̉ §ÆɇĂƠñÖÉ̉ù×áƯ߈ưÚß„‹Çƒ½·‡‘×8ç÷Á¹ÚÇÜ›¾ƒv¶™‰kß [ïSÍÓù×·‡‘×8çë±»‡߈±»ÓăˆŸ;k—Ó™‰kß [ïS’«‡“Íj°»Û«‚ ½9Ù½ÅöĂÇ9¥‡ív߈ß»û½ÏÅÏÄÏÅñ‡ƒvăàßÖ·Ô¶Å­vëö—¾—¾ËÉ9»‡·Ó ¥0‹¾éºƒ¡ÈÁ‡é/×:©Çï½ψ÷‡¿́›öÏß¹Úà¤<̣#ù×Ó¼ßæÛºÍÄŽëö¸Ú¹ÚËÏÔYÛ«‚ ½9–Û³­Øͪ‰ß•Èû›±»߈߈ăˆŸ;kÏÅ÷Á¿Å£Óÿ§ä»ëöȉۙ‹£ÔÏ̉ŸIóÄ»Á›¾§ô߈ûœ£ÇơêǼ©Ó“¹ƯNѶ߈ßÄÙÙÜöÁöÁ“ƃv߈ÙÚóñ»Ù½º¯Èé‰ñ5ñ·ÑÓ9¥‡»Ø·Ôƒv߈éêÚª‚ +¼9ăˆŸ;ƒˆÏÅÁă¤ÎÅö™‰kß [ïSѶÙÅëçÚ¡ÁÅn‡º‹Ç³ÈË¿‹È¿ß¿‰÷‡ϼ¿‰ÓÆûÓ÷Ù÷Á†ÇăˆŸ;–ˆÙ½ß—ˆÿ¯¶Û«‚ ½9°»߈Å–ÓÅù×™‰kß [ïS¡Ô™‰kß [ïS°»¯ÏÅ®«‡“ÍjÏÔÅ̉º‰Û›¾ĂÙËÍ…géêËÔµÁ˜‰j̃ZîS½¾Ù¯À̉ĐÓÛÄÓ±»Ø%‰Áƒvÿ¯¶Ù½çôëö¿‰™‰kß [ïSơêÛ«‚ ½9ỜĂù×ÔÛÁ¼Û«‚ ½9éÚá=ăä‹Ç˜‹±»ưÀÿ¯¶ÅÓ÷Áø×Ï̉ÏÔ¹Ú¹ÚáÛëÚÿ¯¶¨ĂµÏŸéà¾ẳ—¾ơÔû‚ˆûƠÁăÑkÖ¼ ¡ÁÅÔÙ×ÿƒv«<ÿ¼™‰kß [ïS¼¹ọ̈ÄçÚù×Ù½°»—µØùרYïÚ„nå=Ă™‰kß [ïSƒv«ÈơÔ‚½ĂÙĂººöÁ·‡‘×8çÏÔÏ̉« ©ƒ»5¸Úׯ±»›¾íº½ÇÖÏÅ߈׺Ñ®Ơ·Ø¹Ú­Ä߈ơÔíµÙÚăˆŸæÇçÚù×ɇÿÚÓ̉ÆÓĂÈăà‡äă ÷Áëöù×£»‡ºä½³™‰kß [ïSÓºå̉ ÿסÈÔX½ÜéÚáÛÍƠÙ½%ßÁ‘ö£ä߈¡Èß»û½ÏÅƯÓ •öÛ«‚ ½9µaƠĂ÷°»¿«‡“Íj³߈×¾ư#¤Ó…±ƒv¿ĐÓºÙ½ø¾«»ûª̀¶''ÂĂ¬ÄºŸÅăơ/«»ÏÅûÜ·Ôÿ¯¶8¤‡Ö9¥‡ϹÙŒë*«™‡åôƒÔ«»ơñ»›¾ÏÅ÷Á߈Û«‚ ½99¥‡¹Ú·‡‘×8çÙ½¬¾̀ºψ‡̃›¡‰ß­ÔœĂƠXƯÓ đÓÿ¯¶‡ÇÇ"Û«‚ ½9ƒˆÿ¯¶–¾™‰kß [ïS÷Á«‡“ÍjׯµØÍóåĂñÓŸ}ƒØÍÓ‡ŒÛ«‚ ½9ƒˆ±»ù¿›¾å»Îž·Ü™ÔË ©æ¶È ăˆŸ™‰kß [ïSÅÙÛÀôêÿ‡½€ÿ×·ÔˆÁ¼µƠ£äº¹Ú̃»úëöëö¶­Äé +ƒˆ§¹ív”Ö‹ÜŸƠÏăˆ¿’‰2Ô,ø¬Ö›!™‰kß [ïS‹Ü§·ƯÚÏŽԃÚÙ½½­ÔÏÔ±»߈ŸĂ¡ÔƒØ›¾±»ëö™ëéåƒØĂÓ©Ø—¶µØ®Èù×ù¾£ø9¥‡©ØçÚ¨Ø +щ¡Èâ»ñÓźơÔ¹Ú½‰Ươ…ÍË)éÛ9¥ưÀÙÚ©ÀéºçÚñÖ™‰kß [ïS«»©ØÇÜÅ–³Ü«dăÇíơê“Èư¬ƒ™€½×$ù×ÂÈ÷Ù¹Ơª»µ€ø×˜‰j̃ZîSÓ—÷ÁÑÁéê‘÷Æ•Èû›ÙÛ«‚ ½9ưÀë™H—¾Û«‚ ½9¿Åù×èôƠÚ¿ß½Û«‚ ½9½ÓÆù×åĂ©ÓÓ¾Ơ›¶éÙÅëÀĂ¶Å°¿̃Á°¿ƒ³ÏÔ•Œµ̣ët¿ºÑÓ¡ÁăˆŸ”ŸÜ°ÈăˆŸ;¸Ú Ëû¹Ú“Çûº“ȯ›¾Ó¾ƯÓ ù×ív•Œ¡ÈÚª‚ +¼9°”ÓÔß»ûăˆŸ;÷Ú®G ø ơÔ™‰kß [ïSµaÅàăˆŸÚª‚ +¼9¹Ú¡ÔÛ«‚ ½9v ×Ü¡Á¹Ö«•‹È¿»ư‡±ù1ăˆŸ;ëö9¥‡ơÔÙ½“ÈËÉ9ÏÔ÷™Ô×ƠƠ8¤‡߈»Ø½Ÿ}¡Èă½§ÓơèÅăàăˆŸ;ù×óԹڥؙ‰kß [ïS™‰kß [ïSÛ׋ÜơêéÓ߈«‡“ÍjñÁíÖçØ™»ßÁ¹ÚăˆŸ;k³¦Óº÷‡™‰kß [ïSÁñ»¾µØÑÓ—»éJé‰Ó5“gesÁÅ…½åĂÀ½—Á̀íÍÓ³¿ºÅ»́v°»ØÚÑÓÙ½™‡ù×½ ÿ¯¶åôÁƯƠơÔ¨‡¤2€̃êLÏÅƯÓ ëö—¾ÿÿ³*¹Ú¥Ó±»±»å̉ ăêÆÖÉ̉ăơ«Ûù׫‡“ÍjÆÓÅ£Ø÷ÙÀ½›¾ăˆŸ;ëö³È›¾‡xóÇɇ9¥‡×½ª»‡Œ¿‰ÿ™‰kß [ïSù×—¿ÁăˆŸ;kÚ×·ÜÍÛÏÔ½Ä5ĂÏÔχ½ÔßÚÙơøơêÁ½«»ÎåĂưÀ‹Ü܈÷ÚÍĽï߈£ùÛ«‚ ½9“ƠƠÍĂµØ§Ô«ÔôêÏÔ‰±¿ÏÔóẦÓ ¾«‡“ÍjÀÛŒ¾¾ׯÊÈ9‰¿I›·Ô›¾éꙉkß [ïSéÔ” ¡ÁÆ¡Á•ŒÏÅöÔ +çÚÛ׉Ûí–G»nʾ߈˜‰j̃ZîSÍË)éÛ9¥­ô‹Ü½ƒ¬Ô ©¼ẳư“ÖÆ±»¯ƒƒû˜ôùׯ¼Ù™‰kß [ïSùê«Ôù×ưÀ¿‰ƒvñÓ“âÂ3¶ỖˆÊƠƒˆù×ôăˆŸơê§à¿Å±»ÅÔÅÿש¼߈Ơ°»Ăà©ÓÏÅƯÓ Á¯¾Úº½§ô£ÔµØûØÉ̉™ó˜ơ·ÔøêE±»¯È«‡“ÍjÉ6ù×ô‹«‡“ÍjÁƯăˆŸô›¾§Óщ÷ˆù×ÀƯ‹Ç¹ÚψæÚß»ûỞ¿ÅE´È™‰kß [ïSƒvĂÈ¥ÿ׫»¼¾†ßÄÙ«‡“Íjޱ»°»ÅÓÿ§ƠǼơÆáƠ¿‰ưÀóÄçÚåơưÀóÔº»ÁƯÙ×Û«‚ ½9‹Çùê¼ÈçÇ´†‚ºß»ûù×™‰kß [ïS«»ă»§ôƒˆù×¹̃¿‰¿́ÙÚ™‰kß [ïS¤ˆ\0ºÙ½øêÇÏÅ˾Û×Åà™ëéåù׽ȱ»‡Û¡ÁÛÄÓÙ½‰µƒˆ×Ó“ƠµØ–¾™Ô»ˆÊƯƒˆ±»߈ÍË)éÛ9¥ù×­¾ͼ«‡“Íj«‡“ÍjƠXóÇÑÄëăˆŸ;÷Á›¾Û«‚ ½9Ѷ°»ßÚ¾ ‹Á߈ëöôÎÅßÄÙٽƟ}½¤ˆ\0ƒÖ¾Åù×öëöÛÀưÀơÊ™‰kß [ïS½å̉ ùתڋÜư“Ù½³Ï̉“ +±»µØ™‡ÛăƠ©‡¥2ßëMăˆŸăˆŸ;ƒv÷‡ÔXË™ÁÏÔ™‹ƒv߈ơÄéêƒvëö·̣—¶ËÓÓØ©¼­¾ƒØˆûØƠÚÿ¯¶ív˜‰j̃ZîSơêµØƠµØ«‡“Íj/çëö§ÔĂÙ“ÈëçÁÓ·Ô™‰kß [ïSĂÙĂĂ ›­±àéM¾ßăơĂáƠÛ«‚ ½9ÍÄǾ‚ˆÛ«‚ ½9é‡̃ˆ©¯¾—¶é·Ó ¥0ÈëÓÛ×™ÁưÀß»ûÏÅñÚăˆŸÁ̉±»úÓ·Ôëö¶èÄưÚ½±»߈Ơùêå̉ ñÓçÚ«‡“ÍjăÁñÓĂÈÛÄÓ±½”ÖŸÅ»½ÏÄͼơùêù×ÅÓÏÅ…ÖÅÔÚ½ÓØÅÔÁ̉߈©ĂÛ«‚ ½9»ˆ»‡£èeç̉Ÿ̉ÅÓ½½ùסțÚß¹±»«‡“ÍjƒvÍĂĂϺ߈§ÆÇ»ÏÔù¾¹öĂÙ—»Ï̉¬ÔăˆŸ;©‡¥2ßëMûÍÏÅÅщëö£ØÿÚù×™‰kß [ïS½­ÄÑÓÏ̉ÅÔëÚÏÅׯëöºÈ›ÚÓÅ₫®¶ÙŒë*«¡Ù“Æ‚ˆ‹Çå̉ ¾ƒvƒv¹ÚƒØ§Æ«‡“Íjº™ëéåơèÅăˆŸ;ÿÚÏÅù׫‹¿́Ѷ¿º¾‰ëöµØ©‡¥2ßëM‡Œ߈•ǘ‰j̃ZîSÑóĂèËÓĂ×Ơ§Ó›¶éѶ™‰kß [ïS½Ô¹Ú«‡“Íj±»ÏÔÓØ¿»ÁĂÏÔëö¯ÍÏ̉ív„ÚÔơ½©Ç±»óÔ°»î²2 èÔƒá­ÏÅÑÔơê½ĂöëñÓÍÄ‘ÆÛº«‡“Íjƒv§ÓăˆŸ“È«‡“Íj߈©ơ³Á­Â÷ˆ®Ó±»߈߈•Èû›•Üù×û؃ØåÎùê§Ó߈ăˆŸ‹Ç¢äóÂÿ¯¶ŸÅ­v߈ívù¿ÛÄÓơ…Å»߈ûÓÁă½ÛºÏÅơÔù×—¶“‰3Ơ,ùÙƯº¬¶Ùכ™‰kß [ïS߈ûØ¿Øôáꎽ±»ăÁͼăˆŸ;k·‡‘×8ç¹ăÇí÷Á«‡“Íjùׯ¼¾°¿)àƠ½ơº«‡“Íj½ëÏ¿ÑÓù×Ńˆºâ½‚ˆÛ«‚ ½9“Ç«»âà³ÛƒƯºÙÚèêÓÅÏÅù×™‰kß [ïS½–º™ôăˆŸ;ÁƯÙÚơê£Ơ³Èå̃«Ú³ÇÍÓơÔ±¿â½¥Ø‡xå̉ ù×ö‡±»ơÔÚª‚ +¼9ưÀëö—ÖƒˆĂÙƒ ÈÿÚăˆŸ;ưÀ÷ÁÅÄ›¾ÂÙÆ̉µ́VÅØä̉ÿ¯¶Ù½¨Æ<ăéêŸÈƠXÑÓŒƠœ}ÏÔÛ×±»ƒÖ«‡“Íj±¿ëÚŸØ×Đ߈ĂĐÄ ê ™‰kß [ïSÙÚ‡ÛÍÓùפˆ\0ÇÖÍÄÛ«‚ ½9ƒvªÔé‰ñ5ñ·™ÓÓµ»‹Ç·̣Ở£‡Ûׂv™Ó߈¾Å—¶Á¹±»£ØÆë¼ăàÁ̉ôé +÷å5Ó¡Èăà™‰kß [ïṢ·#ÛÄÓÎÄ»ôºÈ™‰kß [ïSĂº¿ß‹È0‡߈Ăº™‰kß [ïSăº¥Öñ¯¼ăˆŸ;ưÀƒ±¿àêÅÔ£»­½¼ÁƯïÅíÖù×âˆ#£Ø£ÔÛ«‚ ½9¹Ú¯.™‡™‰kß [ïS«‡“Íj›¶éĂÈç¡È©¼ׯïű»ƠƯ™‰kß [ïSïÚưÀÉĂùÚôö“Ơ™‰kß [ïS¡ÔÁĂîºù¿å̉ ª»&ÂÈáêψ½½€½™‰kß [ïS¿́9¥‡ÛêÙŒë*«÷ÚúÓÁ½½‹Ç¥ØÿÚ™‰kß [ïS߈™‰kß [ïSç°çœ¹Ú«ÛǼß»ûëö·‡‘×8çÉñ»ÅÔ‚vÂÙđ,9¥‡¹.µØăà¹ÚƯĐ£ÇơêÑÄëă»ÁƯ½Ă¾¨‡¤2€̃êL™‡ºÛĂæï½ƒv‹Ç›¾ùêœØá꜇×2Úª‚ +¼9·Ø߈Ÿ Ä–œ· ̉ ¤0 ›¶éÏÔÛ×ÛÚ«‡“Íj·ôŸÛÁĂ·‡‘×8ç¿́óÇéÓ²º̣£Ư¿ß½€£XƳ½¯G‹øªÚ³¹áØÅØ÷ÚÈ0ăˆŸ‚½Ô§Ó«‡“ÍjÏÔåÁ“Æ·ǺÁÿÛͽ¡́éºÅØËÓ߈ÛÇ«‡“Íj©©‡¥2ßëMơÔöÁĂ—ˆăˆŸ;k«‡“Íjá IƒvƒÚùơ¶Ôù×¶q¾Ö¾£Ø¶ÜÅÔ‘é߈ÿÚ°»É̉·ÔÏÔï½9¥‡ù¾ßÄÙ±»«‡“Íjï½Û«‚ ½9ç'Û«‚ ½9±»ăˆŸ;kêÓƠơ¡ÔÏÔ½ëöÏÔÅØ߈Ñ»‹ÜÎ߈ùêÓĐ½̉¹Ú˜‰j̃ZîS±»Ǿ°»¡ÈßË̉§ÓăˆŸ;ơèÅöå̉ ƠăˆŸ;ÙŒë*«öÙ½µØñÓ‡Œ»ÅÓ*ƒvív·ÔÙ$£ÇÙ̉µ"ƒØăàÀĂƒvà52̣;ü$. Ê—/¯¼ ËûÏỖÅƯ÷ˆ…öÙ½ͼ„(˜‰j̃ZîSÇÖ­Ä™ëéå±»êÓÛ«‚ ½9ÁẮvñÄÅØïĐáȺù×Ûº™‰kß [ïS̃ˆ³ ÅØ̀ӭijÈßÓöÁ«‡“Íj—¾¿ºÙÅë߈¨ºööơêùê©Øç½ψÂíÖ™‰kß [ïSºͼ™‰kß [ïSÏÔ‡½€«Ô©ÓéÓ›¶éăơù׃ףäϼĂÙăˆŸ™‰kß [ïSỞɶ±»Ϻ½«ä™º“ÈÇÖù¿·ØǼÛ«‚ ½9¥ˆ]1ÍƠøê˜ÁÛ«‚ ½9ç®ˆăˆŸ;߈ÛÇ™‡ŸÈßđ¾×Ơ¥â™‰kß [ïS«»µTÍĂ“¹ƯN‡‹ÜÛÄÓÿ¯¶™‰kß [ïSƒÚưÀ«‡“Íj‘Óô×Ûÿ¯¶µƠ§ÆÄØĂƠưÀ±»ª¼đÔ§½÷‡í·Û«‚ ½9Å»¡Áơêͺ߈̀¼†½>½¾‡Æá ߈µØƒv¿ºƯ‰ßÄÙßÚ¡ÈÓ̃™‰kß [ïS±±»í—G›¾ù¿©ÂëöĂ¼ÍĆđ5¯ÈٴܵØùê˜êèäÁăÅÓẳ™‰kß [ïS‡Œ•ŒéÓç̉G½¹ÿÚÓÅオ؃ˆ 9Êû9ưÀÙ×›¶éăßÙ½«Ô߈̉´O‰ÛÛ«‚ ½9ù×ëöñÓÅ»ÙÚŸÅỜÓ°»‚v ÁÙ½ăˆŸ;£È£ƠÛ«‚ ½9ׯßÚƒ¾‘ÏÔÚÆƒv\«‡“Íj±ÔƒÔ›¶éÊÖƒ±»Ù½À×¼߈áØ¦ºöăˆŸ¡Ô¡Û£ä™‰kß [ïSƒàăˆ³ÁÓ÷Áó#™‰kß [ïSÏÔ߈ÇÖ«‡“Íj«‡“Íj9¥‡¡Ơ¼Ø÷Áù×Û«‚ ½9÷Á›ÏÔăˆŸ;̉ØËÇ‹ÜĂÈÙ½ÏÅ·‡‘×8狾‘÷µØÖ¼+·Ô™‰kß [ïSíÖË¿ÇĂÛÄÓçÚêö¥º¹ÚÏÅ9¥‡ÑÄëù×µØÏÔ½ô߈±»ƠXƒÓaÛשˆÏņLJŒï•µØ‰¾­vÏÔ¼¯Èáêׯ“áLJø×£ ªĐ›¾ëöëöéº߈¥ÛăˆŸ;ÙÚË¿ù×ĂĂ ›­±àéM«‡“ÍjƒÖ½ăÏÅÙ̉‚»½©ºØ  ߈Û«‚ ½9éôË̉ܺ÷‡—¶©¼©‡¥2ßëM°»ÿ¯¶áÛ±»•×™‰kß [ïS¥Û߈ăˆŸ‰ơÉÙŸ̉«‡“Íj«Ôö¼³å©‡¥2ßëM߈«Ú´†¹ÚƯÓ çÚ»ÅưÀ½¦È™‰kß [ïS÷Á¡»Æ̉›ÚĂỂ™Ôå̉ ¨‡¤2€̃êL“Æ·‡‘×8çǺ™‰kß [ïSçÀơÔÚÄ̉ăˆŸ;—ˆ¯Èͼ•Û˜‰ j ̃    Z îS ±»ÏÅ9¥‡µØ˜‰j̃ZîSƒvÏÔÙשӱ»«‡“Íjù×ĂôŒ¾«‡“Íjƒ¸Ú½Èëö9¥‡ăˆŸ™‰kß [ïSù×ăˆŸ;ĂÈ´Ă«»ívÍÄ™‰kß [ïS„'›¶é¿‰›¾×Ăˆ²È̃„9¥‡×ÅØå»ψÿ¯¶å̉ ‰Æ©Ç°»½€ÏÅ£äÑĂí—Gª‡’̀jù×Û«‚ ½9ơºÓØ߈Ơ¹]ß™‰kß [ïS¡È“ÇàÓØ°»¹Ú®¼ ÁƯ±»¶³È¤ˆ\0ÙÚ—¶÷ê¢ÈÿÚí—GíÖùơơ$ÏÚÓØ›¡Î̉‰Ûå̉ ÚׯÈ߈‡ëö¥Øù׈ +«»‡º«‡“ÍjµØƒvÀĂư‡±ù1±»çÚëöö¹Ú­ÄÍĂ›¾“È«‡“Íj߈ÓØÁĂ™‰kß [ïSëöÍĂù×¼ ³ ÄÓ­vªÚ‡×₫Å»·¼Í7›¾ªĐµØëö±Û‰íÁƯåôÏÅÔ‘ÆÅöéÚÆ«‡“ÍjÂÙ͆“Û«‚ ½9²Æáê±»å̉ ßÚ¡»ƒ„ù×½€ƒÊÈ9ơê9¥‡»½߈Û«‚ ½9ÙÜưÀ§¹½ƒv¦ºĂÙÙŒë*«¸ÁưÜÓ̉ÁƯ±»¾¿ÅƠ¾G­Ä£‡ơƠ߈ÿ¯¶í$ù×Ù½ÉñÙăà¸ÚƒÖßÄٷŇƠù×øêû«‡“ÍjívÅØ÷Ù˜Á•›·Ô½¾ƠÚ±»îÅ©ÇàçƠơèű»«ÔÓÆăˆŸÛ«‚ ½9ĽµØ·‡‘×8ç9¥‡ăˆŸ;߈²¾ö“¹ƯNÙÜĂËÉ9ÂÈ ÷Á™‰kß [ïSÿ¼ßÄÙÿ§ͼửö«‡“ÍjÓØµ.¥Ùù×߈ÿ&Û«‚ ½9ỞœØƒØÍÓ‡Œˆ£»±¿‘€ƠĽ«ÔÏÔëööƠÄÑÓ‰ÄÏ(ớù×Ẹ̈̉ëö›¹ï«‡“Íjº³…ô°ÛÓÅ¿‰ĐÄêóǹÚèê¾¹ÇĂïÀÏÔơÄÚŽ€ĂÈ¡Ôψ¤ĐÓÛ«‚ ½9§§ëöÀ½E½€ÇÖØ&âˆ:kÏÔ©ÀăˆŸƒv9¥‡×æÚÑæ»‡˜‰j̃ZîS©Ơë¼ÿÚ¾»ÏÅ©%ÁƯ±»ßơË”§Óù×߈óǾơÔº¥Û¹Ú¯ƠÔ¾Fù×¥Ø×Óûͱ»ơêµØâê߈« ©ƒ»5™·‡‘×8çø×±»Ë%ưÀØÓö¡µ÷ÁѶ߈ׯǼƠ‚×¾Û«‚ ½9¥ˆ]1™ëéå¹à«‡“ÍjÙ½ăˆŸù×ÏʼnàƠ›¾Óºï³2µØƒv½°»ÏÅù×½çZưÀÛ«‚ ½9åĂơê¡­Ø×¾ƒˆëÚ¡Ó£÷°å̉ ₫éê晇ßÁ•{™Ó“Ơ·ÜñÖ߈ƒÚ«Ô—¿ßÚÓÆ¤' Ở½ÙŒë*«Ï̉₫®¶ÉíƒéÓ×ÂĂÙ߈‰ÔĐÓ±»“ƯÔƯÀ«Ô™‰kß [ïSÚñØ÷Á Ëûó½ÿ¯¶ơèÅÓÆÛºÁÔXù×›¾ù¿•Œ…Ûʾß»ûơê¹ÚƠŸdÛ¡ĐÙŒë*«‡Œ™Û×Ơ†7§jçÚƒ9¥‡×ÎŧôÙ½ù×ƠX—ăÙ׋ÇơêÉ‘§—ÇÇ™ÿ¯¶Ç»Ï̉ù×±»ĂôƠ ËûăÁö«‡“Íj‡Ú©b™‰kß [ïSË̉߈À‡€è/Ö:ÏÔéÓơÄ—Óư“ĂÛ«‚ ½9ƒÖ̃„ ™‰kß [ïS‹Óƒ½©Øɇ“ƠÏÔ˜‰j̃ZîS«‡“ÍjgÛ×ö™‰kß [ïS“È·Ô‹ÇÙ׃vĂÙ¾‰¿I½€™‰kß [ïSÁƯ÷å5ÓÏ̉«·3uUÏÔù×ñÓƒˆ9¥‡óÄ¿à‡ŒÙ½«‡“ÍjÏÔ±¿»Á½€úº£ÇëÓñÓ9¥‡ÿÚß»ûéêÏ̉æZăˆŸ;kÛ«‚ ½9»ç¿́·‡‘×8çÚ× +¹ÚéÓûÏÔßÚƒˆ¡ÁµØơÔăˆŸïƠâ½ç'ßÄĐÓÁñÓÁÓ÷Ù̃ˆ‹Ç÷‡å̉ ÓÆѶÛ—ÓÁ̉×¾ù×ÅØÂÖñÓ±»Ị̈¾Ă­ØÿÂ߈ơıëØëöÛ«‚ ½9ăˆŸ;¹ÚăÁ߈ۺᾪ¶2tT½ơ»†×«‡“ÍjÏÔ¾¡ÁÿÂä̉ψêöˆ«»Ï̉ƯÓ ÑÁ½ƒÖơ꨼«·3uUÛ«‚ ½9ơ˜êèäăÚăˆŸ;âÁ“¹ƯN¡Û›¶éÓØùơçÚëö™‰kß [ïSñÓ³ŸóeëÄưÀ÷ˆưܬÈ₫ÜÛ«‚ ½9™‰kß [ïS¹ÚÛ«‚ ½9áĂ¯×ƒvÜ!÷Ù™‰kß [ïSẲÛ«‚ ½9«Ô‚v‡¡È¡»½löẨ。-¡ÁÏÅ¿½߈›Ú›¶éç4ƒÄƒˆÈÁ—¶çô™‰kß [ïS‹Üô纽³Â Ơ1Ù½ơ»ÓÆÙÚĐĂɵÜív±öƒÖ¨ÓûÑÓăˆŸú™‡¶“ÆÏ̉Á¹™‰kß [ïSź™ëéå™»€º߈ù׃ˆívÏÔÛ×Û«‚ ½9ù×™‰kß [ïS±¿ÁĂŸ}ƒÎÔ Ơáш±»›¾Û«‚ ½9»Ø€º¡Ô¢X߈–»½€‚v ©‡¥2ßëM£ØưÀ£‡9¥‡×îƠø×‹Ç“È匿N³µØ·‡‘×8çÁƯÏÄÍÓÅ8¤‡Ö9¥‡§ÓËÔ¹ÚƠÇÿ‡°»™ôƠºmö¥Ó×¾đÓƠ±»÷‡ơÄÅÛ«‚ ½9±»ß»û˜ỗÄØ¡È§¹ñ×ÿÚïÚÅÄ«‡“Íjµ†±»ăˆŸùơ·‡‘×8ç±»Ă×ÑØ¯×¿́Û«‚ ½9§º©Ó—¾Ơùׄ֩ǣäƒv™‰kß [ïS™‰kß [ïSÿÚĂĂ ›­±àéM¡ÛÓÁíçßÚYרĂÈăệÿÚç*ª»ÑÓÏÔ±»ùêĂ¼̉Ƨ—Åô¾ñ™ơÓ¼À¹ÆÓ°»óÔÙŒë*«µØжăˆŸÚª‚ +¼9§ø«×¯ÈăˆŸ;kùד¹ƯNªâÍÄ뽉ÔÙ½áê·ÅÎÔ·‡‘×8çëØ÷Á—¶µ™±»¹Û«‚ ½9ăơèơƒÖøê£ä½Ô›Ơ߈8¤‡ëÓ×̉ ÙăˆŸÑæơÔÀĂ¡̃½†×ÁƯĂÙ—»éÚ½€—ˆçÚù׿ô•ÜÛ÷Ùáêù׻ؕÇăàï½¥ÛëÓ¾ÅÓ­ÄƯÛÎPº†Œ¶‡Ö8æÏÔ—¶«‡“Íjï½ÔÎọ̈ǯ¼ø×Ø×°¿ưÆ×ƠƯÓ ‹ÇÏ̉¿¹¿ÅËDZ»¡Ô²ÆA›¾¡»ßÅ×Ó§‡ǺÇӳLJŒÁ¨·º¢ä9¥‡×¿ôđơêÓÆ9¥‡®ößÁ™‰kß [ïS߈Û«‚ ½9çô߈±»9¥‡‚vÁñƯׯÏ̉Û׃¤Ûº™Û̀Óå̉ ă»¡È߈µ†÷ˆù׷ű́ÍBÚª‚ +¼9ûƠ‡ñ5Û«‚ ½9½ÏÅÛ«‚ ½9ÛÇÁ¹È9¥‡ă¶µÚëÚ«Ôͽ‡±»8¤‡ĂÙÍÄÑÅÑÄë匿NÁψùê±»÷‡ßÚ™‰kß [ïS½̉Ø¡ƯơêÓÔöæÔ ¡ÈơçƒvµØå׸کÇÛêăˆŸ₫ÍÛœ‰¾IÛ¹±»ÍË)éÛ9¥ÍåÈùêºÏå߈ƒ¼¿́™‡™‡íêùÈ¡ÁëöκÏÅ %íê¥Ç“ÆéêĐÁ‰¿I™‰kß [ïSÛ×˹‰¿IÏÅ¡%Ơµ†ÑÓù×Ù»Áă’º„‹ÓÂèƒv¥ÁÚ׺éÓÍË)éÛ9¥ÏÔç—“ÛĐÅ ‡Ú™‰kß [ïSù×ĂÙ¡›¾ºŸÈÁ¼«‡“Íjƒ¾‘ÆØ}ÁƯăêüÁÏÔƒˆ»y·Ôƒˆ߈ơê–́¯à›Û™àƒÀëÑÓ×ù×Ơ×¥Û—»Áă¿ºÛ«‚ ½9ï½ß»ûù×Å»ÛÀíÆÏÛ«‚ ½9ôƒvÛ«‚ ½9¾ßϽ€ÍÓÅÔƒŒÆôÿ¯¶ÂÙ›¾ç̃ĂẸ̀Ă½éÚ‹È½Ă«‡“ÍjÍÄ߈ÁƯÏÔÛ«‚ ½9áĂ·Å›¾éꋪ-Ởß„ö¶ÅØëö‹Üëö·×¼Ûê߈½ơèÅÇÛ«‚ ½9¹Úí꛾ٌë*«©Ü™‰kß [ïSíÓùơ9¥‡ƒ¾‘Ï̉«‡“ÍjÛ«‚ ½9ォ‡“ÍjÇÖĂÙ¯văˆŸ›¾¹ó›¶é¿ÅăˆŸăˆŸƒˆ½‹ØÓ¼9¥‡̀ÓÏÅ¥ˆ]1Ă‚v9¥‡߈¹Ú÷Áå‰5µØÈĂăྻ±¿ψ½€èơ¨¼‹Ç߈Û«‚ ½9ÑÓ9¥‡¡Á¹Úù×±»—¶ÅØ«Ô₫ "‡ñ5ëö“ÇÛº‹«-‘ÁƯ½ÙÚăˆŸ;kôăÁỞ‹ÓÓØñÓ Ëû‡ñ5ăˆŸ;óÇå¼ ÏÅ•ŒÛÇÅ—¶ă½ßƯÍÓ™‰kß [ïS™ëé嫇“Íj麥ęơùꎪÚÁ¨ »ƯƠÄ©¼‡Œ™‰kß [ïSívñÓ­RñÓǺÍÓ‡ëö™ëé彽ȇä‚v̀Ó ƠµÅ§Ô麿ºÙ½ƒØ™‡£Ç‹Ü±»ô$©‡¥2ßëMƒv߈ĂôɇƠƒvµa™ëéå“ç̉ưÀ“£Ôÿ¯¶̉Å ±»ºù×ÑÓ™Á½€ß»û«‡“Íjº߈ó×ÅôÄ“¹ƯNæÚ¾º˜ôÅØ·ÜỔ™Û­Öª»²Œ‹Çß»ûëöù×©Ó¥ăˆŸ;«Ô°êؾøÙ±»°»ÙÚÎÔ ‹¾ëö™ØÚÆ&Ÿ}½›¡ç`Ù×ÿÛÁ|ÓØ¯ÈëØÿçùêÑÄë…Ơ“ƃˆëÚơ9¥‡Ó¾±»™ôÙŒë*«ƒÁ¥ˆ]1÷ˆ߈±»Û«‚ ½9ÅÓñÚƠ¡»ÙŒë*«ÁƯưÀ©¨«‡“Íjá=¾Èœ́ÓºÅÔ½÷êÙÚ«‡“Íj­Ö¹Ú‚½¶‡¹½ƒ½›¶é¢È)—¶ÙÚ™‡ưÀ±Ôƒv†º¡Ôƒv9¥‡Á‡é/×:öÁƃv“Ơ‡ñ5ƒvăˆŸ;̃ˆÿÂÁĂ¹óÏÔ¾ô×Û́Ú™‰kß [ïS½›ÔÏÔ±Ô±»́ÁÏÔÛº‚«‡“ÍjùÚ©Ó«ÔÛ«‚ ½9™‰kß [ïSª‡’̀jù׿ôµØƠ˜êèäơꙇÅӻس…à¹Ú»ØçÔ¡äôÀĂ ưÀÛº9¥‡×çÚ±¿ê§±»ï»ËÉ9íi™‰kß [ïSƯƯơú̉±Áÿ§ù׃vÁƯµàÓ¼ăˆŸ;ơêÏÄívĂȧƠ—ÁióÂưˆYăˆŸ;°¿¿ôŸÖ‹Ùéê·Ô­Äµ9¥‡™—­ÖÏÔŒƯ½1߈Ϻ§¿Ú¡Û±»߈±»‰ˆ½éº¡ÁçÚº‡º‚vù×™ô¿ÅÓÆ†ŒöÏÔ‡™çăˆŸ;¡/ÏæÙºñÚÚª‚ +¼9ÿ¯¶ù×Ü™‰kß [ïSÏÔơÅÇĂï‰Ç¹Ú™‰kß [ïSúÙư“ĂÙ½åôá ÄÓÓØÓƒ×™‰kß [ïSưÜÛ«‚ ½9Ç%߈™µ!™‰kß [ïS±½ÓƻܷÔÍË)éÛ9¥‹Ç·¦D Á³îÙ̉º‡ºÚ½ẲëöÛ«‚ ½9Ó´ơèű»Ï̉ÑÓÏ̉ĐÓåÁơ»‰Ûí½ÛÄÓ™‰kß [ïSÂÙÑÓ÷Á½€¹}ăơ¯G‹ø°»™ëéåÜßÏÏŽçư˜ ê è ä ưÀ¡ƠÚ×ͼÓăˆŸÅÔ±»™‰kß [ïS©‡¥2ßëMÏ¿¹Úù×íÖ™‰kß [ïS߈9¥‡›¾ï½ăˆŸ;ÚÇ‡ăˆŸ;k9¥‡Ÿ Ñ×Á½ĂÓ‡ù¿ß»ûëö¾ßÛ«‚ ½9ÍÓ9¥‡ËÉ9…ôº̉!¶ù×̣̃¾ß½µÜÙŒë*«ưÀ«ÔµÜ‹ÇóÇÛ«‚ ½9÷ÁÜ߈ÓºÀ‡€è/Ö:±»–ơêƯÓ ¢ä£Ø¥Ó̉¾˜êèäÍÄ™̣©ÜñÖ·‹ÿÚăˆŸ;k±»½Ù½»Ă©‡¥2ßëM¹àÁĂßÄÙ±»á×»ÎÍÿ¯¶¹Ø©Ø‘Æùר׽çÚ±»ÿÂŒ¾ÿÚƒ¾‘÷Á—¶“Æ/—¶…ÔÑĂ…Ơ¤Ø¡Ô“Ơ™ô‰¿Iψëö½­€9¥‡߈ªÓ›·ÔÅØ߈9¥‡›¾đï½ĂôéÚ•ÇÏÔ“¼ăƠ±»ƠơÔ²½à ëö§Ó̃ˆ߈ÙÅëăˆŸ;ßڭĵܛ¾À¹ǽơêăˆŸ¶ è —¶Ă·‡‘×8猾©&£äÈßÁÏÔ£ÈÛ«‚ ½9Ơíш™‰kß [ïSÛ«‚ ½9™‰kß [ïS÷‡߈9¥‡‘µ±»™‰kß [ïS›vöÄô ív™‰kß [ïSăˆŸ±»±»«‡“Íj°¿÷Á´†ÓºÓ̉½€«‡“ÍjóÇ¥Ú½‘÷ƠçÚ¡Çëö¡Èó€Ó÷Áç4Û«‚ ½9߈¨‡¤2€̃êL‘ÛÛÄÓ·‡‘×8燺³Ó̉Ơ«»ùש¼ÛÚăˆŸ;™‰kß [ïSÁ̉Û«‚ ½9›Ú„ÇÛוŒß»ûå»öƠ´‘¿«ÔºÙÚ߈¡Û߈—¶ĂÙ›¾“¹ƯNï䫇“ÍjÛÛ«‚ ½9©ˆ®¾öƒÚ³Æ¡Ôáêö߈‹ÜéŒÅØ™‰kß [ïSăˆŸö‰¿IÛÀ®¼ƒvăˆŸ;î%«‡“ÍjÇÖׯù×íÖ‡×Á½íêÀ½ĂÙßÄÙơꇿ౻©¼ÑĂĂȵaơèÅ¿ôĂô²߈܉Ơ«Ñ§ÓøêÛ«‚ ½9¼¾¹x¡ÔÑæ±»Ϻ±»½ÍË)éÛ9¥ׯ­Ä˜êèäåĂƒ›¾±»רóÇÛ«‚ ½9±»ßÚ«‡“Íj¬ÖÂÈ“ÆăˆŸ³ÈăˆŸ™‰kß [ïSøơÖ̉…©Ơ«Ô¾ĐĂ÷Ù•Œù×½«Ô›Ú9¥‡‘Æï½ÓÅÛ«‚ ½9ÿ¯¶ÏÔ‹Ç÷ˆÏÔ“ÆÍƠ¨Ó°»«‡“Íjó#ăˆŸÛ«‚ ½9ÏŃÔÿÚñÓ«‡“Íjù·ɇ‹ó»Â™‰kß [ïSơê½ôßÄÙëöăˆŸ;k‹ÇƒˆĂJÅØçså¿™ëéåÚÀº“Æÿ°ÎËÇĂÈÿ§ƒvƒv±»’ÛÏÔơ\¡\ܶÜ߈ÇÖ­—çÚ·̣±»ívĂÙ‡ăˆŸ߈ﲭĸکƠ÷ˆÏÅÏ̉­Ö߈—¶ÂÏÔ·ÔÏÅ̃»úª +¶ +2 +t +T +ƒˆÛºÏÔùăˆŸëöăˆŸ;Ù½ĂÙä̉ÅØ›¾¾ÑÓÍÓñÚú(íºÑÓ°»«¼·Ô£ÇÎơ+߈Ù½½±»ÑƠXº§Æ̀ÁÿÛ¯¾«ÄÆÛ«‚ ½9‰Á¹Úù×ù×§½¿ºăˆŸŸ¾™Û™‰kß [ïS€ºï·‡‘×8çÏ̉ר†“·ÅßÄÙÍƠ™‰kß [ïSé¼½¯G‹øÛ«‚ ½9‰Ú«‡“Íj¿‰›¾ë§8¤‡“Á‡é/×:•ôï½߈ƒØ‡ñ5ĂÈưÀø×ªºé‡ÊÙ×ñÚá µ†ưÀÿÚ±»ÑÓ¿ô°ê؃»—¶߈ÑÄ똉j̃ZîS™‡ùëơÄ¡Ưÿ¯¶ăˆŸ;«‡“Íj‡ùש‡¥2ßëMđ»$9¥‡×åôÏ̉éÓñÁ±»­Ä±»ÅøëöÍË)éÛ9¥¹Úÿ§³ºó߈Ûºÿ§ÖÆ‹Üà̉ĂÙƯÓ ½±»߈߈£Ø÷Ù«‡“Íj߈‰¿I¤æå³å̉ §ÓÛ«‚ ½9ơ»óŒĂ¼ơâ±ƯóÇåĂ‘ÂăˆŸăˆŸ;߈ơêù×¶±»‰ÆưÀµØµ†‰¿I±»ñÓ¿è±»û¼̣Ç̀Ó§ÈÏÔÓØ½ÈñÓÿÚ‚vù×Ù½²øëöщâˆë׆ڼØà—ăˆŸưŒĂçăàúÙ²§%•Èû›Ë̉Ë̉ºđ»ưÀôê±»°Á¨ØºÏÅ¡%ñÓ«‡“Íj‘÷¶̣ẹ̀Û«‚ ½9éº߈óÇư§‡½ă»ÍÓ¾»ë$ªÚ,ÙÚ‚vëĐÓ̉·Ô§€º±”ƒvχ±»߈‚ẳ£ØÁƠß»û¹Ú̃ÔX™‰kß [ïSù×ưÀ­ØËÓ·ÔúÖ°ÈĂÙÛ×ĂăºéÓ»ÓÆ¤Ûéß·–¬*¼¼*ăˆŸ;ÏÔ±»ß–ơèÅÏỖîÁƯ¾µa‡Œâ»ï»«‡“Íj‡Ú÷Á­¾¥Á‘&›¾™‰kß [ïSÙæØù×ëỖˆ›Ú—¶‡Ú¿‰ƒˆ•ŒÛ«‚ ½9™ëéåóÄÿ‹ܻ|­ÄÛÀÛ«‚ ½9Ӻ鼵Øá™‰kß [ïSåÁ½¹Ụ́Ô—ó“áù×™ëéåăà߈º½Ăëö½±»†½Ư򾂪‰kß [ïSưÀưÀö¬Öư“ϼăêôễˆ¿‰½߈߈ׯăÄù×£‡ñÓ¬Ù°»ÛÏÄ5ô‡ĐÓ°»߈ư“¦Ó߈ă»¾™‡½å¤Ù×ĂÙỔ‘÷öƒˆß»û™à¯Á‡é/×:øô«‡“Íjª‡’̀jăˆŸư§‡“ȓȺ¡È™.߈¾£äíÁ¥Û₫ù×ùêơêÿ¯¶÷ÁI߈±»‹ÈÏÔ»nƠÄ©ÓÏÔöÛ×í—G¡È²ÆËƠµ†߈¿ô™ëéåÂè³¼ù×Á‡é/×:“¹ƯN…àêË̉˜‰j̃ZîSñÛ½Ÿ}ƠªÚ ­Äå̉ ưiƯ¾߈›¹Ăù×›¾¡È»½9¥‡ëöưÀ½ÓØ«ÔưÀáê¿ù×¥ˆ]1ăˆŸ;8 +¤‡ +ºÔĂÙÿ¯¶ßÄÙ€ÓÑÓÅÓ™ô½µØ‡Ú«‡“Íj‘gåĂ¥Ư9¥‡·ØđÚÍƠ‹ÓƒÆ¡ÛÖÆëÓ߈ËܺåÁµØ«»•ÖƯ»ñƯÈà ăˆŸ;‹Ç‡ŒˆÂÈÀ‡€è/Ö:ûÓÙ½ƠÆØóÂÛ%·ƠÏĉÔóDZ»åĂß»ûăˆŸ½‡“·Ô߈¹ÁÑĂ¹Úäơ·Ô³Œƒ½̃ˆ߈³Ù½Ơơê°»Û«‚ ½9«·3uUëö·¼Í7‡ÚµØ¸ʹƒv˜‰j̃ZîSëöÉ»‰Ç£ ˜‰j̃ZîSÍ…öÅô£ ăˆŸ;·ÔƠщƠ±Â±»‚v¯̃½ÀèÈéê™ÓùëëçµØƠù×9¥‡Ó¦ĂÈ$÷ÁûåĂ…n÷å5Óâê¯Ö‘Ó‡·Ô¡ÁÓ ‹›æĂÙœ‡˜‰j̃ZîS±»ÓØ£äÓºßôÓÅ÷ª‡’̀j±¡ÁáÓÏÔ/ͽ߈ĂÙÏÅ“½ơêăˆŸ;̀Ó·̃ÍË)éÛ9¥ÙÚ’È!ͼŸ}ßÁ߈éÓƠơ«Ô‹Ù߈ÁƯ½€«Ô߈ÿÚÛ«‚ ½9­ŸÈÇÖ½ %³bÙט‹ÔÄÿ§á¹íÛ«‚ ½9ù꫇“Íj“È·Ó ¥0‹ÈÏÅ ¬°àèM»Ó̃ˆưÀưÀö߈ÊÔ™‰kß [ïSÛ«‚ ½9¥Æÿ§ñÖÁƯ¡ƯéÓ‰¿I«‡“ÍjË¿ÄƯÏÄ™ÁÓů¹Ú·̣ÿÚ«¼ÙÓ•ºÏŸØÿ¯¶½đÄ—¶ÏÔ©̀à8¤‡‰Ûµ†ĂÙׯñÆÏÔ«‡“Íjµµ™ëéå×€߈¥ˆ]1«dߌÛ,ÿÚÿÂƠß¿ß÷‡·¢—¶·‡‘×8çÿ§û(£‡߈¯È ÛÙ½¼¼€üÀù×­‡°»éÓăˆŸ;k¹ÚÚª‚ +¼9‡ñ5ĂÈ™‰kß [ïSº½çg¥±¹ÁỞἫÓßÄÙƒÖ·Ó ¥0ĂÏÔ“Ơ‹ÇóÇ©¼‚v +ívÏѽïiÅÓÓÅÚ·Åÿ¯¶̀Ç—¶±ëØ“Ơ¡ÈáêÏ̉³ôÛ«‚ ½9ù×Û«‚ ½9½Ư¿›·Ô›æÀĂÍÓÑÓ«‡“Íj«ÔƯÚÛ«‚ ½9ƒˆÁÚÙÚ™‰kß [ïSÛ¹›¶é¹ÚÍÄ¥Óù×±»½€ÂÙ™‰kß [ïSχĂÏÅ¿ßÇ»ăˆŸ;«ÔÏÅăˆŸÛ«‚ ½9«ÚÍĂù×Ô…Ơ±»»‡“ƹ½ºóÇ߈Û«‚ ½9ù×°»ÙÚ¿ÅĂº߈™‰kß [ïSÙÚÎÔù×ÍÄçôáêÿÇù×Û«‚ ½9щ߈߈ăˆŸ;°»ä̉))˜ÔÏ̉²·§D Û«‚ ½9Ù½ưˆ™‰kß [ïSĂÖÿ¯¶±»å̉ ÇÓăˆŸ;©Àÿ¯¶ơê•וÿ¶/è/ëØŸÅψ¡Á¯È«ÔçÚëö9¥‡ÏÅÿ.ĂÎá굆›¾½Á¾¾»«·3uUǺ¥̃Ăùê—ˆÑÄëÏÔÙøÛ«‚ ½9ͼ¼ôÛ«‚ ½9Ù½ăˆŸ;½² ·ÔÙƠ匿N­Ä—Œ¡»ëÚ™‰kß [ïSºÍƠ¹ÚỞø×íÖ¾íÖ«Ô›¾ƠºµØ̃µØºëö™ĂƒvºéÚŸ}Û«‚ ½9›‡Û«‚ ½9½€9¥‡½€¥ˆ]1º¼Ơ½ß\¹ÍÄëöƉÔÏÔ©₫ÏÔÏÅóÂ…à‡½ÏÔÖ¾8ïƠ…Ââˆ;ÏÔ±»ËÉ9߈‹Ü¯ƒˆù¿“̀ëö¡ÛØ™‰kß [ïSœ‡º¼ؽĂ”ßÄÙ±»Ç}¥í߈¹ÁÏÅÛº°Å•ÜíÚ‡¼™‰kß [ïSÍË)éÛ9¥Á¼‰¿I½ăÚ9¥‡ÙÜ«ÚÅØù×…»…ƠÑƯ¹ÚăˆŸ;߈Ư¾ëöͱ»•é—¶Ç̉¡»ơêóÖ¸Úÿ¯¶Ơ₫ơê₫&áØÅ–ùZ½‹ø­¾™‰kß [ïS†ŒĂÙ±¿½߈×ƠïÅßÖØ•×ư¬ăˆŸÛÀĂÙù×°¿­¾Ÿ©‡¥2ßëM∎ưÀ9¥‡ù×¡ÛøÚ³Ç¡Ù±»ÏÔ½ÂÙÿ×Ç“…ƠĂÙÀùטêèä÷‡₫̃ˆï³2ù¿‡º̃ˆͽ˜Á¹Ú³ù×£äơÔÏÔ“Ơ¯Û† ±»Û׫»¾ÿ¼ă»ÁĂº̀߈µaÿ§éê½Á‹ÇÏÔ»ôăê—¶º½ƒØï»9¥‡¯ÎϼÓØÙ½ºØÅ§ÓÖ«÷̀ÓÑÄë§Ô½±»·‡‘×8癇ôê ²zéÓẳÅù׿‰ÿ¯¶…öóû(›Ûß·̣ËÓ¿¹߈¡ÓăˆŸ;ÁƯ·‡‘×8ç€ØÛ«‚ ½9°È÷ùׯƒ« +>߈§ô»߈÷Áˆ™‰kß [ïS߈ËƠù×ñÓçÚ®×_ßÚ¹‘«ăÁ½ôvκĂ ăˆŸÓîËÜæ¾ăˆŸ9¥‡±»ñÓăˆŸ;ß»û½™‡ÄẰÓăˆŸ;9¥‡öÁ™‰kß [ïS·‡‘×8ç‡Ç«»ëôë™HÙ-ƒv±»™‰kß [ïS޳‹Ç÷ÁƒvÅØ£ö·Ôª‡’̀já=ÂÙö«»°)¦È—Ûçmϼ¿»™‰kß [ïS˜êèäÚ¹£‹Ç¶Ô«»ăˆŸ;ÑÅô⫇“ÍjƯ‰¿Å9¥‡×·‡‘×8穇¥2ßëMƒv¶èơÔ«‡“Íj‹Û₫®¶₫§Úª‚ +¼9߈éºÁĂ—¾Ưº÷Á±»®›ÁÜÑæÏÅׂ‹ÈÉ—‡ŒëÓËÇỞÆ¿‰«Ô½«ºÛ«‚ ½9ÿÚ°»Ù܉¿I“ë¬Ö“ƠÛº߈ơÔ¨¼Ù½åŒ¿Nëö߈¿‰áêéê8¤‡ÖôÅ™‰kß [ïS…ößÖƒˆÙ’¹ ÜN­Ø߈³ºóÙÚù×Ë̉¶Ü‡ºŸÅ½¥+ĂĂ ›­±àéMéÚ߈™ÛÍÇ÷å5Óü̉̃Ú°»µÉ̉©¼™¨߈çÚù×™Ó±»½Ä‰¿IÙŒë*«£»߈ƠÛ«‚ ½9«‡“Íj†º½¹̃›ÁăˆŸÏÅóÇûÓªÔûƠ☉j̃ZîSơêÁĂçÚ™‰kß [ïS’Û¥‰ÍL…ĂÙù×ăˆŸ;›¾9¥‡ÑÓöĂÖ°¿ù×ưÀÏÅÍÓ¶µØÛ׌º ­Ä³Ø˜‰j̃ZîSívá ƠÁéêŸÅÏÅ­Øóǃv‘¿ôưÀÛ«‚ ½9רÛ«‚ ½9߈™‰kß [ïS£ä߈çÚ±»˜Ô—¾Å₫®¶¼€û»9¥‡ÛºưÀ·ÔåÀ¡¹Ú±»«‡“ÍjưÀ¿‰óÇƠÚ½Û«‚ ½9ù×›¶éÚÄ̉·Ô­ÄÛ«‚ ½9§Ơ´₫¡Ôù×ơÔµØưÀ«ÔßÄÙ‡xƯÓ Ơ«»“ÜëööÁ÷ÁơÔỞëÍÄ·ÅƯÓ –»¡ØÇØ÷ÚÁ̉×̉—¶ÑÓ½ư“ƠëÓÖÆù×™‡·#½¹Ú÷‡ÏÅ›¾ÓÁÿ¯¶ñÓăơÏÔ©‡¥2ßëMêöÏÔ¹ÚÑæ¾ö‡Œ«‡“Íj÷å5Ó»ˆưÀĂ¡Èùº©¼ƒØ°»€Ó½Ú&±¾÷ÚơêÙ̉»ĂŸè«‡“ÍjµØ¿ßμ߈ǾƯºÍË)éÛ9¥ÍÄÛ«‚ ½9å̉ ̉´O¶‹…Ö»Øƺùê½ưÀÍÄÅÓÔơŸÖơꢻÙӷųƠưÀ¯È¹̃´Û«‚ ½9«‡“ÍjÏÔŸ}·ỐÅăàÙƠơÔ«·3uU±»›Ú«·3uUâ·¼Í7“Ơ÷Á·‡‘×8çÁØƠù×ĂtÑÄ뽌“ȇ,ÿ¯¶½›¹ëø±»ÏÔÙ½¼Ѷ«‡“ÍjÛÇơĂ¿‰ßÄÙơêŸ}ưÀ£ä±¿ƯÓ ÿÇÁ9¥‡«‡“ÍjăˆŸĂÙï½̉Å®Ó ÙÚ₫ÚăˆŸ;ÍƠăˆŸ;k߈ÿ¯¶¼ó¶ÍÓơê½§ÓéÓµØù×ơêƒvëöÏ̉¯¾ºäÔ¤ûÓƠöÚ©Ó“ÆÛ«‚ ½99¥‡ñÓơêăˆŸ;™‰kß [ïSÍÓ‡Ú¿Ø™‰kß [ïS©‡¥2ßëMÅÓÁƯưÚ§ôù꛾۫‚ ½9ÓØ«‡“Íjß„ƠÏÔ™‰kß [ïS×Ơù׉;­Ä±ë؃ˆơÔ¡ÈÛÄÓÛ«‚ ½9µúÁƯ÷Ú£ä9¥‡ÔÅØƠüÀ«‡“Íj›Ô­©¼ÏÔ¯XóĂù·™‰kß [ïSùדƠ³€öÿ¯¶ͪ‘ÓưÀ¿¹Û«‚ ½9×¾‹Ç«‡“ÍjÁ|ÛÀ߈ÏÔ’½…Ëù×ÏÔ½…€­:åµ³băˆŸÿ¯¶¶kèk߈·‡‘×8çÑĂº‡Œ¡Ûó¹Ể °ÈƠXÛ«‚ ½9ƒvơêµØÙ½ƒvß»ûóÓă‘·Úăơ†º§“ÆĂĂ8¤‡ÖßÄÙÁ̉©Ç¯È±¿ùê½߈ûÛï½ăˆŸ;k³Ø²ÂÙ½Ëǯ¼ØYÿÛûÓÁƯ§·×¼Û×ăÁ÷‡ñ»ÅçÇ֭Ľơê߈ÏŪڡÔǽƒÚ´†âàæÚ˜êèäÏ̉Ù½ëö±»½ƠXử›¾ă굆ÏĂ»~Ơ×Ơ߈Û«‚ ½9ч8¤‡›¶é™Ă»ˆ8"¤‡"ÖÏÔÍÇ¿(ÿÚµƠ¹ÚÛ×™‰kß [ïS8¤‡ÖÏÅơêƯÓ —¶ơÔ™‡ö¡ºĂÙ̀ÓÅØ×Ơ÷ëöç̉ÁĂǼÙ½›¾ÎÅ₫®¶߈ơÔ™‰kß [ïSéÓíÁË ‰Ô…Ü™‰kß [ïSÓº™‰kß [ïSÛ×»Ô¤ˆ\0ÙÚ§ă«»›¾±»§ÔĐÓÙ½‡x™ÓÏÔŸ}ơÔÖĂ­ØßÖöÙ½‹È§ÔÂÙ«»åàƒv¢ÔĂÈăˆŸ;­s¡ÈﻡÈỞƠ±ñÇï»›¾ó×½ôźÁ¯¾½́Á±»ç> %ÓÊÅ»ăˆŸëơÁ½ơÔ8¤‡Ù½ÿ×¼ùד¼ù×ÁƯçÚ¯Èï½¾¾½ å̉ «‡“Íj¥Ư5Á½ñÖ…nÚª‚ +¼9ÇÖơêォ‡“Íj·Ó ¥0—¶í₫’Çù¿÷Áḯ—ÓÍË)éÛ9¥ùơù×½€§ÔíÖßÚƒ‹­ÖÙÚøô8¤‡•½™‰kß [ïSív™‡ù×¹ÚÛ×Û«‚ ½9¯¼ÚÇëÖ­Ù§ÅϼÁÚßÚÏ̉⦅W½¹ÚívƒvÁ"»Å±»ưÀ™‰kß [ïSÏ̉¹ÚÙ½ÿÚöơê¶èËÇ÷Á±»¹Ú»ûº¼«‡“ÍjӺ⦅⫻߄ƒv߈¥Áù×ÀׇÇ÷ê%߈ËÙ™‰kß [ïSÑÄëù׃vÓØ‹Ûº­Öµ-µØ¿ØÏÅ8¤‡ƠÁƯÙ½éđ™‰kß [ïS‡ÇơÔưˆóáêï̀ơºyÂÙ߈Ù½êö’ºÜÿ¯¶ǽ‡Û±»ËÉêơعÚăÇíƠX¾ỞÙ̉³€̉ƽáÛ‹ÓÁ¾÷ÁưÀ±)Û«‚ ½9ëöăˆŸ¥Æ™‡•Ç5å̉ çÚ‰¿I÷Á™‰kß [ïSåÁăÁăˆŸ;«‡“Íj½Ô÷ÁơÔ›¶éùễ½ƒv†Ú³“ăˆŸ½¾ƯÓ Ǽ°»áê߈åÔăàå̉ çÚăˆŸ;•ÜĂÙ¼åĂ߈ÊđÁƯ»̉ˆ”=ƒv₫$›Ăå̉ ·äµØ…Ï̉Û«‚ ½9§¹ăˆŸ;kù×Üơ ˹ǽỞÛ«‚ ½9µa·¼Í7׿8í‡ăơëÔÿÚÏ̉ÿ¯¶·‡‘×8ç¾ưÀ±»ÁƯ߈½€…Ôù×Û«‚ ½9ºƒ×•×óÇù×íÆ·ÅƯ¾Ó؇ÇÓÅó£ÈÁƯơĂỡÍƠ߈×ܼå̉ ăà9¥‡¾‹ÜÅØË̉£Ç‡xù×Ï̉ׯ³ï̀Ă«‡“Íj‚×Ơå̉ ½Û«‚ ½9±»ÏÔÀ ½ưÀñת»«‡“Íj¹ÚÁ½¾íêß„©¼íÁ¢X“ÈÛ«‚ ½9Ư‰ø×ƠƒvéëöĂ¼±»á÷Á•ŒƒØϾ¥O½€ÿ¼÷Áù×éÓ¡Ô™ơ›¶éÀÓŒ¾ĂôÏÔ±»«ÑϾ¡ÔăˆŸÓºƒÖÛ«‚ ½9«d‘ÏÔ­¾Ơ¾G—Ó«‡“Íj­ØÙÜÏÔ«‡“ÍjÍƠơƯåÁƒˆ¥ˆ]1ÙƠ‹ÇăˆŸ±”ÏÔ¿d‡Ú¥ˆ]1—¶ª‡’̀j±»«ÛôÏÔ™‰kß [ïSơÔ³¹Ø“̃ˆÓ̉­Ö£»ÍÄ›·Ô߈­văˆŸÚÀ +‡ŒóẲƘÁ‡ÇăơÑæ™‰kß [ïSéêäơH½€ÅÓ©ÇÅØ¿ºéº½™‰kß [ïS³Èùæ­)öÊÈ9ÛÄÓ½œÂëöÏÅÑØ¶Åëö© Ø-‹ëĂÙÂÙÛ«‚ ½99¥‡™ôß„Óű¿·ô–ÀßÁÿ×WĂĂÏÔÛ«‚ ½9ĂÙ߈±µØ̃ÄØÑØÓשØÏÔÛÄÓ¯G‹øÊƠﻹÁö±»“Æù×›¾ÁƯ¾ß̃ăơͼ¸¾ù×ÙÚ¨¼©÷¼9¥‡ÑÓéÜ‘÷¬ÖÂÙ¹Ú߈ív§Ôú̉ƒv£ƯôÛ×߈¯‰¯0Ï̉̃ˆ¹Ú÷ڇǥˆ]1ÏÔ߈‹ÜăˆŸ;‡º™‰kß [ïS«‡“ÍjÏŽϼ¤ˆ\0•›¾߈«‡“Íj±»ùסhñÖûœ‡ ÛÆëö½ĂåÁăÁå̉ Û«‚ ½9§Ó½°»Û«‚ ½9ÍÄíÆY߈Ù½åÁªÔÅÔù×™‰kß [ïSƒvƯùăˆŸ¿‰£äµØ¹Ú»ØÛ«‚ ½9ù×—¶­½¼ƒvÛÚÛ«‚ ½9ÓÆ™‰kß [ïS™ÁÛÀñÆÑ+‰;½ƒv¿‰÷ÁçºÍÜ­ÄñÚ߈€Áç°ỞïÂÎÄ˾ÁƯö™‡Ø£ØơèÅ¥ØăˆŸ;Çơêäô·Ô9¥‡×£‡‹Ç™‰kß [ïSơ‡ÇÓØ¶‡ÇÛ«‚ ½9ĐÅưÀưÀ±ó©‡¥2ßëM½ùê™×¿|óŸÈÏÔĂ£X©Ü§Ö»ÎÔÑÓß÷‡º«‡“Íj­ÄëÚƒ×ëƠUÍƠăˆŸĂ0ÑĂá çÚ»yĂĂ ›­±àéMûÓÍӣǵỊ̈Ă™‡ï·Ôẳÿ¯¶Æ_óáßÁÛ×ÁÛẳÅÔƒvÄÀƒvßڭćº·‡‘×8çÏÔƠívÁƯñÓ„ívׇÇÓÛ¤ˆ\0Á½߈½€½Á©ØÛǹàí—GœÜË¿“Ơ™‰kß [ïSµØêÚôÔ±»̃ƠîÛ«‚ ½9™‰kß [ïSÿÚÙ½çÚ÷ˆßÁñ½‡ÏÔ‡x©ØƒÖ÷ÁÙĂÏÔ·ÂÍÓÿÛçÚ°»…ÂƯÓ ߈­ÄшÛ«‚ ½9Ø̀ÓιÛˆ¶½·‡‘×8熌ßÅ›¶é÷Á§ô£ÓơèÅ™‰kß [ïSÅùר¸Ú¾±Ôщؾ÷¼öÅÄơêđÆ̃ÄØÛ«‚ ½9Û«‚ ½9»½™‰kß [ïSƠñÚ±»º·Üơꙉkß [ïSÙ½‡ÚÿÂëöù×ÙÚăˆŸ9¥‡ÇØÏÅÛ«‚ ½9‹ÇÛ«‚ ½9ăˆŸù×щɱ»½ï»»Øơ꫇“ÍjƠéJé‰Ó5“gesÁšә‰kß [ïS9¥‡«‡“ÍjñÓăˆŸ;Ư¼’ŇxăˆŸ¡Á¿‰©‡¥2ßëM·‡‘×8çÛ«‚ ½9ÙÅë¥Ø‹ÇÏÓº›¹…»Û«‚ ½9ËÉ9Œ₫ÇÙÅëÛêºÑÓ₫ø×½ÿ¯¶µa½—»‡“«·3uU†ÇăˆŸ£»߈ƒ§ôÁĂ™‰kß [ïSÛ«‚ ½9ôÔÏÅۋDZ»¢äûرëØׯ™‰kß [ïSßÄÙ¡ÈíÖÅØ±»ơÂÆؽÛ«‚ ½9ăơÉ»¡Á8¤‡×ÙÅë釃vëơ½Á¹ù×ơèÅÓăÓºéêÅÓùê¶‹°Á½ÅÓgÑÓ÷Á¿¹·‡‘×8ç±»£ä¾Û«‚ ½9㻛癉kß [ïS¼©Óñӯ׉¿I×đÏ ©‡¥2ßëMÿ¯¶Á³­½¼«ÔÚ×Ă×$ÑדǩؓÇ߈§Óă»щ©‡¥2ßëMĂö±»“Ơù×ơ»Åᙉkß [ïSăˆŸ;ăˆŸ©Ç«‡“Íj¡ÓËÓƒv•ÇôêÛ«‚ ½9麡Ȱ»©¼ͺöËÇ«»™‰kß [ïSﻋÙ́vív¾™‰kß [ïSˆĂ¼ăˆŸÖÔ†6¦j¥Ë… ‰₫«‡“Íj÷Á¡µÈÛ«‚ ½9‡Ç™‰kß [ïSĂÕ֧ô«ÚơĂ±Èƒvô¿‰ô‡äơµØÑÄ뛾ٽ־ív×ê9¥‡ƒù¿ÓºöѶ9¥‡±)»Ù±»Åسȱ¿ôêëöÏÅÛ«‚ ½9ÏÅ©ÂÛשӺ۽ơÔ߈§øÏÔ£Ó̉‡ÇÛÄÓ»‡ƒĂÿ¯¶ơèÅ߈½Ăù×Ö̉÷å5Óí‡×¾8ç—¾ÿ׫»ï½”ÇÅØ¶ÛÄÓ­Öăà‹ÇĂưÀÛÀ±»ñÓßÚ储«‡“Íjë§ơêÏԫԡȇñ5¼€÷‡² ·‡‘×8ç÷ÁíÆóÇôÄÛ«‚ ½9ù×âḈÚºóÇơ‡ĂÙ¸ÚƯơ…ö́ÁÙ×щă"ÜơÔÊÈ9ƒ¾‘ñÓ½¹ÁÛ«‚ ½9³ÈăˆŸ;™‰kß [ïS»‡…×ø×ơꨌÙ̉ö×ƠˆÁ¹›Ù×÷ˆÿÂă8¤‡Ö­Ä©µØ›¶éăơ½ÏÅÏÔ×ùƒˆĂÈ÷Á÷å5ÓơÙèôn—»ªÓù×ÓØ™‰kß [ïS¿¡‰¿IÓØỞ½ËƠׯÙ½ÏÔ‹Ü"ÛÏÔù×÷Á±»ªô±»߈ĂÙ«ÔÏ̉߈ØŒê*ªĂĂ¡«¥ˆ]18¤‡×ÑӣسºóºØ  íÖƒv«‡“ÍjÀ½£ä…»·È½€™‡ëö“áÛƒÖ»ÅĂÈ÷ÙƯÓ ¹Ú«Ó§¹ívÛ«‚ ½9½£X±»ïÁÅÓ„€…ࢻëíÎÅ ¾ÙÓăˆŸÙ½“Ơ‰ÛËḈÁ¾Á±Ở½†öăˆŸâÁ¹&Íñ»ÍË)éÛ9¥ÑĂψ¾×ưÀé‰ñ5ñ·¨ÇÛÄÓÉ̉ÏÔø×߈÷Ú«ÔßÖñÚ߈щË%å̉ ߈œ‰¾I߈É̉÷ÚÑÓưÀ¿ßăˆŸ;k“Ûû¤Á̉—¶öơÄđq ¹Ú§Ôª‡’̀jăÇíµùן¯‰¯09¥‡̃ˆßèÿÚ™ëéå§ÔÏÔÙ½ÑøÚÍË)éÛ9¥±»½Ăô½á ˜à˹5Ù¡–«‡“Íjà ßÄÙÙÅë‹Ü¡Û§ÓĂöÁ‡é/×:ô±ëØ÷ÁÎŲÂó²‹ÜÇÖÍÓ߯±»°» áăˆŸƒv߈¥ˆ]1 ÁÚª‚ +¼9Û«‚ ½9ÓÓ§Ô8¤‡Ö‚àºïƼ§Ô°¿Ó%ƒăˆŸ¡ăˆŸ;ï½¼Ăº’‰2Ô,øµØµØÚÇív™wƒvÏÔ¦ÆņăˆŸ;k«ÔëÓª¶2tT™‰kß [ïS£ØƒÔÇ"ÿÂù×8¤‡ÏųóÄ9¥‡µØĂƠăˆŸ̃Ö¶Å¥Æù×½¯â´ë‡¹Ú£äÁ|½ØÙ½‰Ä¯ÈăàëÚÚª‚ +¼9ºÈ—»ÏÅ볺󤋫‡“Íj½ÓØóĂƒ×Ù½ËÓăơÙ½«±̉ؽ­“Èùæô½âà½ô•Ö£Ø̉ØöÍÓñÆưØ‘÷·ØÇœÜٽ¡Ô×Ở£à…Úƒˆ¹Ơ™‰kß [ïSƠóê­Ä­Ô±»öà±»±»ăêÓØ™Ó¾đ»×ÑÓÚª‚ +¼9ÙÚ—»¥‰ÍL…½€«‡“Íj™‰kß [ïSñÓÙÂå̉ «‡“Íj߈óÄ”ÇÛ«‚ ½98¤‡öÛ«‚ ½9ơl™‰kß [ïS±»ơÙ„Ö×ĂÍB—¶ƒÔ›¾©¼®é߈¿‰©¼¥‰ÍL…¿ÏÅù×û—»ÁÓéÓ•Èû›Ơ߈ºä̉  ù×߈›ÛßÄÙ§ÔÂĂ¹̃éºÁº™‰kß [ïSƒĂ×Ơ߈’½.ưŒÅØä̉ßô£Øû纱̉ñíȉ¾‰¿Iå×£ÔÙÚƠjÏÔ¿‰±»¿ŒƒÔăˆŸ­Öù×ù×È̉ ¯¼Ăٟ›¾µÀèêăˆŸ;ƒvƒvíÆ™‰kß [ïSÙ½ Ç¾Å+ÁơÛÚÛ«‚ ½9ƠX½ô߈Úª‚ +¼9çØ˜êèäßr•Œ“¹ƯN¹Ú¤ˆ \ 0 ôźÍË)éÛ9¥̃ˆÓ̉Ù½ÂƠÙ½·̃çôăˆŸÎŃv«‡“Íj¾́ï½¹Ú麿Ưö©‡¥2ßëM›¹Ù½€º¡Á‚v ù¿÷ÁÏÅ›¾‘±óÇÉ̉©Ó9¥‡Ó½ϺĐÄêăˆŸ;ñÚ½9¥‡×¾ÅÛº©vóÔï³2—¶½µØ¼áê§ØÙÓÁĂÍĂñÓöɨ̃ˆ±»Ǽƒv§ô߈‰Û±»áê‡øö÷‡ÙÁ¡ÈÙܹÚá$û™‡÷$ƒ½«̀ÛăˆŸ;ĂŸÖƠß»û‡$Ǒӗӿ»ÙÚ¼ØĂÙÑÓ™ÁửƠ"Ú×ù×đÓßÚơÔÏÄÙ½çÔ¡¹Á߈ÙÅë×ƠÏÄù×ăˆŸ;ÍÅàÖ Û«‚ ½9Û«‚ ½9ƒv¾º¡ÈÛƒv½ûΈ°» ·‡‘×8ç¹ÚϺÙ½÷Áû(˜ơ±¿ïÁĂÏåÛº¹ÁƯăˆŸ;kÛÇÇÖ߈½ÔÛ«‚ ½9ù×´aÏÔ±ÁÛÀÀƒˆ«Äç'›Ú«‡“ÍjßÑÓ¹Ú׿8ºÅةӇù×íêî½9¥‡ưÀÎű»ƒÖÏÄA¶‡Ö8æÓºĂÙ“Æ•Ù߈ö¶£ ĂºăˆŸ;ƒvù×ÅØ¾£ä«‡“ÍjƯÓ ù×9¥‡ù×µ!÷ÁĂ—ˆ‡ÛơÔ‡ÙƠÛ«‚ ½9ÄôóÔ™Óå̉ ¥Øùê±»Ù½“Ơÿ¯¶ç£äÙÚåÁ›¶éăˆŸ¹Ø¿ÅÏÅơꓼ¹ÚçÚ©Ø¿‰©‡¥2ßëṂDZ»ÿ¯¶‹Óơ‡¡ÈĂÙƒˆÓ×¹«‡“Íj™d¡»±»÷ˆÀ½ÍëÓÙÚƒÖ’‰2Ô,øÛưÀù×ß»ûÇÖȤˆ\0Ø×ăˆŸ±»«Ú«Ôñ߈íơÙÚóĵa嵨éñÓƒÔù×ăˆŸ;êơÛ™ŸÛù¿›YÈÖö±´ĂôăˆŸ;Ù½ÏÔ߈ëöÎÔ߈—»ĂÈ‚ÍÓÿ$»q¯»‡öÎẠ̊Ă½óƂ׽€ºn$™ëéåØÅê߈¶¨‡¤2€̃êL«·3uU‰¿I³µ³¿ô¥Û߈Ơ½¾¿»™‰kß [ïS¯ÈÖØÏÔ÷Á‚Ăºù׸ڵØö‡ñ5ù׫‡“Íj™‰kß [ïS¶¦D~ ~½¯¨Ç ø×Ă¼߈å̉ µØĂĂ ›­±àéMÍBÑÓÇØ‰¾†º™‰kß [ïSĐÓÿÚËƠÓ̃»ú9¥‡«‡“Íj9¥‡ĂÖ­ÄÏŃˆ¯È˜‰j̃ZîS÷ÁÍÓµ‰Ù½¨¼‚ß»ûÏÔÖ̉¹Úÿ$ÙÅëưÀÏŨº§Ô9¥‡™‰kß [ïSá ÷ÁÚ×ÇÖÙ×ù׿èÁĂ£ÔƒØ߈ׯË̉ÏÔ™‰kß [ïSưñăˆŸƒvơÔơĂŸÄÙ×Ởƒˆ±»‹Ó½́v…›·Ô±»«·3uU½Ă¹Ú9¥‡çôá “¹ƯN߈¤Ùö匿N÷ˆ€ºÅӯƥÆ̉Ʊ»ä̉ơêù×ù¼›¾¿‰Ô¾F™‰kß [ïS°»ÅÓÏÔ‡x߈ Ôëö¾¹x¥ˆ]1ưˆơêö¡ÛׯÙ½™‰kß [ïSÍÓ¿‰Æ÷ˆ߈¯¼·Ó ¥0˜êèä°»óÇÛÀ±½ÏÔăà¿Ø߈ÏÅ®Gøëö½ăÿ¯¶ÍÇ–ÓµaÀ½ÅºÓ̉«‡“ÍjÏÅÅÓÔáêÁƯå̉ ¢ÇÇëöñÓùêåĂ߈ĂÙù×ơê¸̃‡ÏĂȉ۹~•QÏÔ™‰kß [ïS¾‰ÁƯÙ̉éïô«»ăˆŸ;ưˆ¿ßëö£ØǼß„•Œ¾»¶ÔÙÚÁ¡£Çºç­ÔÓÁé¼°»ÎԾŠ+™ëéåíøÅăˆŸ·öÙ×›ÛÍË)éÛ9¥™‰kß [ïSëö·‡‘×8çƠí…Û̃ˆ ëö¿ÅÛÀ‹ÇÙ½ù×›¾ËÉ9§Ó«%»yG½¹‹Üơꩇ¥2ßëMù×™‰kß [ïS£Ç¾ÏÅù×¶ù×±»—»÷À߈ơÔưÀ9¥‡ÑÓ8!¤‡!Öǣ䱔щ9¥‡ëöŸ~÷ˆ™‰kß [ïSƒˆÁÓÏÔ±»óÄóÔÑØêö±¿¦áềÓÙƠóÇëƠUµØ§ÓĂÙăÁ™‰kß [ïS©¼¹Ö˜‰j̃ZîSù×ăˆŸ;k±»9¥‡ö×Ó¥Ó°»·Ô±¿ôơÔƒÖËÉ9¿ß£Ôö߈ÆÅ:…·ÔËdžڱª»ÙÚï½Ăó§ÓóÇǼ¡ÓƒvÀƯ™‰kß [ïSƒvÙÓÛ«‚ ½9û̉ơĂáÛ߈ù¿¶¸¶ÅƠ×mÑÄ뻇°»ăˆŸ;¨A¹Úí½½Ô™‰kß [ïS£×ưˆ9¥‡±»ö9¥‡߈«‡“ÍjơêÏÔôƒˆÛºÿ¼“Ơ¾Å½éêéê«Ó߈‹ÇĂº¼È߈ÇÖ¡ÈóÂÜÓ ¹óÑӅׂv¡̣ëöœÔׯ½Ô­ĂĂ¥& % ÇăˆŸ;Œ¾‚vÏÔ­¾ÅÔăˆŸ;߈³Â§çơÔ¿|™‰kß [ïS€ÇÎű»¹ÚÙÚ«ÔÏÅÏîÛÄÓù×Û«‚ ½9†º½ºùêăˆŸ;™‰kß [ïSô“Ơơ…¿º…ÖÑØ§ÔăˆŸ¥Óæºé«‡“Íj‰¿IÚ×·µÍ₫‡ÜđÄåÁÛ«‚ ½9™Ó½ñÚ±»ÓÅĹګԇ­Ôé ÎÅçô ¬°àèMâà ¿ßÿB¾ûØÏÔŸ£ ™Ô߈ÏÅ•½ƠX›¾ÙŒë*«™‰kß [ïSÇÖ½€“¹ƯNÛ«‚ ½99¥‡×ÀĂẳ©-™‰kß [ïS̉Æ©‡¥2ßëMºø¾ϼÁăëBÛ«‚ ½9§ÓÛ«‚ ½9Åà×¾½Á½ Ëû™‰kß [ïSơÔ߈Ï™ÁÖ¾“s9¥‡øæYÁñÏÔăˆŸñÚù×éÓ°»Æ%™‰kß [ïS¾ºÏÄ߈§ôÁ´ÇØ«‡“ÍjÅÔ¾©‡¥2ßëM÷ÁÎÔ‡“ÏÄăˆŸƠÅĂÏ̉²ÈëöÍÄ›¾ŸÈăˆŸ;kçÚÏÅÛ«‚ ½9¬ÖÙ½«‡“ÍjĐ»€ó½ëöÚª‚ +¼9ơÔø×9¥‡ÅÁå£ä£Øô°» àŃv“Èø×÷Á½Úª‚ +¼9ÿ‡Ó<“Ơ™‰kß [ïSß»û¾èơƠ™ơ·Ü½9¥‡ëöÛºÁ̉Ï̉ëöÙÚÓØÅÔÂÙ›¾ßÅÜÍƠٽ߻ûƠÿ¯¶‡ÇÏ̉Î̉™ôÍË)éÛ9¥»Ư¹̃Ù×Ïợ¶ÍB½€Ù½á …±‡ÔXù×Đ½Ûº’߈߈÷ˆ‹ÇÁÓ…Ø»Á™‰kß [ïSÅÏÔ¥ƠßÄÙ/—»§ô₫®¶±»¹ÚÿÚÏ̉ƠÑÓµâđÁÙ½¦ÄÁăíØăÄÛ«‚ ½9ÍÇÅô߈óǃÚùפˆ\0Û«‚ ½9ăơ·ÅÓØÙ̉«·3uUÛ«‚ ½9×ÜÛ«‚ ½9¹ÚÂÖÎÔè‡ăơâˆ:kù×ëöÂÑÓƒÖÙ½½ĂÈơˇä¡ÔßÄÙ¿Øå̉ ߈Æ»›¾Ä„Ư‰ñ”°»߈߈ËÉ9ÙÜá §±¿‡(ƒ—˜á ÙƠ8¤‡×°»µØÿÚ«‡“ÍjëÔëö•»™‡Û×½ăàÍÓ¾ăˆŸù×Û«‚ ½9ơê왉kß [ïSƯ½™‰kß [ïSÛ̃»Á­ÖáêÁçûº‡Çƒ×ÿ¯¶˱«‡“Íjù×™‰kß [ïS¸Ú…ÚƒÚ˜‰j̃ZîS·‹Ó ‹›æù×9¥‡ƯÚ¯ƠơèŢػšÇÛôôù×–Ó9¥‡ăà9¥‡®Â˜‰j̃ZîSÛº§ÔÛÀëöơê±»¡ÔÙϼơúĂƠ±»ªÚ …»ơ›¾ôñ¿ÏÅëö¿»ỡÛ×±»›¶é÷Á“ƠåĂ›¡ŽÛ×ăˆŸ;›Ú™ÓÏÅ«‡“ÍjñÚå»߈½óLJŒ“̃ÁƯ½¡Ư—Ó…Ö™‡÷‡Ï̉«‡“Íj¥ÆíØ—Ø¥ÈøôÏÅ¥ˆ]1ÇĂ©Óƒ½ăˆŸ;©öù×£X½±»Â§Øµ‰§àÛ«‚ ½9‰¿IăˆŸ× ‹ẁÓ +£ØµÅ‡ÇưÀ“Ơ‚ÅØ—Ö廇ÇÏ̉ÙÓÏÔ·ÅËÖƒˆ½Á¿‰ƒvâḈ§ô£ä‹Ư«d·Å½ưÁËÓĂàù×ÓÅ¡Ôç̉‹Ç¾ÿ×Ûº¹ÚŸ}Û×‰Æøơ“ƠÚª‚ +¼9ß½ăˆŸÛ«‚ ½9Û«‚ ½9ÍÄÑÓù×ù×߈‹ÜôÄ…Û—¶íễˆÍӋDZ»©ØăˆŸ8¤‡̃ÄØ°¿˜¿‰Ă9¥‡ăˆŸóôÙ×å̉ ÷å5Ó»Ùÿ¯¶³‡߈ÑÄëµØÄÖ߈¿ô÷ˆƒˆËÉ9“Ÿ·Ô¿‰ϺÏÅ÷ˆƯƠöÙÚ¡³ƒÖ›¶éĂÙÏÔ½|Ù€¡ÛÇ"ù×›çăˆŸ;×¾ßÖ±»ÏÔÅÔß»ûºnå̉ ‚ׇŒ̃ÚÑÄë›¶éÛ«‚ ½9ÿÚÅnØ3ĂÙ£äÑÓº¡Á©ơê—¶ÙƠăˆŸÍË)éÛ9¥³ï̃ăˆŸ;­Ø­ÖÉø¾÷‡½€©ØÛ«‚ ½99¥‡»ç²Âđ»?ÙÚçÜÙ½̉ˆ”=êöÁĂĂÙɇµØ‰¿I¹£ƒ§«‡“Íj¹Ú߈—Óµaç…ößÚ¯«·3uU½€ăˆŸÅØăà˜‡¯È½€›Ú™‡Û«‚ ½9«‡“Íj§º ËûクÚÅ઻߽¡ÓÛ«‚ ½9Ë%áèш©‡¥2ßëMÅÿ¯¶­7ăˆŸ;™‰kß [ïSñÖ߈ƠXá=óÇËÇׯóÔ½Å߈ơÔơê¹à½è߈Ù½ëƠU‡x¶»ÄnÿÂù×ăà½߈ơê±ÔÆêØçÚ§ÅÙ±»ÏÔơ«4éÓéêκ›¾µØĂÙư§‡“Ơ¾ºÇÙÚăÇíÓíÁ‹Çç̉߈—¶·Å¿ß¥‰ÍL…Ûº™‰kß [ïSÏÄ©¼ëÚÍB¡È•Ó:Û«‚ ½9›¹öĂăơçÚñ»ƒvׯÿÚ¼ÙܟżÏÔ½™‰kß [ïS™‰kß [ïSíÀÁבơ¥‰ÍL…¡È’ƠË̉ÓØÛºÙ½ö߈¿˜ÁăˆŸœÁ·ÔÛ«‚ ½9‡Ưéê·‡‘×8çơê§ÈͽÓ¾±¿“È›¶éKÚª‚ +¼9çôÛÄÓéêº߈ôéç̃…»߈óçÔăˆŸ¡Û½›ƠÑăà’ǯÈîôÅØ…Œ9¥‡Ó¼߈¹ÈÇÖûăĂÙ9¥‡×щ›à˜‰j̃ZîS½£ä¾èÛ«‚ ½9°»«‡“ÍjÏÔ½¶ưÀ¨‡¤2€̃êLđ»•׳(ù×Ç̉–¶Û«‚ ½9ơÔéÓ÷‡ưÚŸÄ­Ô߈É̉™‡‰ó¡»µØ‹Ç¹Á™‡߈ăÇíǾÙîﻋÓívÙ½«‡“Íj¡Ô‹Çª‡’̀j¨¼ ±»Î̉·ØĂÙơꙉkß [ïSưÀó×ÍÄÓ¾©À¶Ù̉™‡ß»û9¥‡÷ÁÏÔ™‰kß [ïSÙÚÍÄÁùèׯĂĂ ›­±àéMÛ«‚ ½9Û«‚ ½9ßÄÙÛºĐ9¥‡ù×±»ß‘ÆÑÓà ‹½³ơêÙÚàêÏÔÙÓù×™‡ÁÛÏĵؿ‰ǼÎÅ›¾âà‡xƠÂĂ·‡‘×8ç…Öï½ơÔÖĂ×̉ơÔƒv‹Ü—¾éº›¾ẩû(›ÚØYûÖª¼¾ÅØÓÛ«‚ ½9÷Ô÷ơÉ̉€Ó‡ŒçÇÅÙ›¡Ó׫»Á×ĂÙ‡Œ‡Û±»™ÔÚÁƯ·‡‘×8ç½ÏÔçÚö̀Ó·Øï»±»ĂôÇÖŸ£ƠÛº÷‚Ù½¯vÛ«‚ ½9ĂÈưÀ¡»«‡“Íj×Ư9¥‡íƽ€•ÇÅôù×±¿Ä~ÛÚ±¿â¶øê§ÔÏÔ«Ô´È ÅØ‹Ç­v›¹Ơ´Û«‚ ½9°»ñÚàƠû(Ö¾ëö߈…ÖĂôù×À½íÁÛ«‚ ½9ưÀÏÄ«‡“Íj©‡¥2ßëMÏÅ…ÇÁ/ÏÔ‘±µØ·̣Đ_ÍƠ•Œ9¥‡ˆơ–¶¡Á½ĂºĂà€Ơ±»›¾©ÀÑÓ9¥‡ăˆŸ;Á¥‰ÍL…«ÈăºÙŒë*«¾½ƠÛÄÓ Û­€ùד¹ƯN©Ö‡Ç‹Ü¹ÚÿÛ«‡“Íj³ºó߈ĐÄêÏÔĽÛÀÙÚÙ(Ù½›¾óÔù×ÑÓÏÅÓºÓØÏÔ·ÂßÄÙ́êÙ½™ëéå›vÏÅÍă·ÅÁĂŸÁËÿÚ¡Ô¹µ†£„÷Á8 ¤‡ ×ĂÈÏÅơèż€à=“‹˜êèäŸÖĂÈÙ½ÏÄ«‡“Íj»Å½ôÍÄø×ÑæÓ¾ÏŽ÷Á»Øé¼ăˆŸƒvÚª‚ +¼9­ÖƒóåƠèê±»ĂÙ«‡“ÍjăˆŸ;‹Ç›¶éơê±»±»§ÔăˆŸ;µêÙÜéºăˆŸ;k·Ó ¥0±»ÄćøêÁĂßÄÙưÂßÚ­ÄÓ¾Û×»‡ƒÖ·‡‘×8çé‰ñ5ñ·߈·ºÛºư‡±ù1—¶Ç»Û«‚ ½9Ă9¥‡×“¹ƯN£ä÷Ôǽƒˆ­ÖÓØÏÔ³ÜéôµØÈ̉ßÁÑÄëëöÓëö̃ˆ²b±»¯È—¶ɇ߈ËÉ9³EƯÓ ÑÓ߈™‰kß [ïS™‰kß [ïS—Ó¿ÅÇÛÔ›¾ÑßƯ›¶éÙ̉‰ƯÙÜ߈©ÓŸÖ–¾ +ß»ûƒv—ŒÍÓËÓÉ»ĐĂÁĂÍÓ‹ÜÇä­Ø–»ÍƠăàỜª©ºéº¹ÚÛ«‚ ½9…ÖÛÄÓ½¡Áí‚ÏÔáîĂè÷Ù¯‰¯0°»½€߈—» Ëûî»ăˆŸ;ĂÈñÓ÷‡÷$ăˆŸ;°½µ‡ψ‡ÏÔƠÔƒvéÓ½€¹ÚƼä̉ÛÄÓöóßÄÙ߈ÁƯ₫߈ÛÀÏơ«ÔăˆŸ;Ù»å̉ ÿÛĐÅ÷¾ăˆŸív÷ˆ¶ư“߈·qÛ«‚ ½9ù׫‡“Íj±ÁׯöÙ½™‰kß [ïS±»ƯÚ™‰kß [ïS¯‰¯0Ơ₫ƒvÖ̉ùêă«Ô“Ơ™ºơêñÓÛ«‚ ½9éÚơÔØ×Ăô%ñÓÛº߈ÇÖ½ׯ“¹ƯN±»߈ăÇí–¶ăDZ»÷Ú«‡“Íjÿ×߈޳Ơï‡ÇÅó̃£»±¿ƒv§â£äÁƯ½âŽĂĂăˆŸ;„ôëöù׃‹™‰kß [ïSƯ뇌›¾ÓÆăơÛ«‚ ½9«Ôä̉**¡»÷‡Û×£äÚª‚ +¼9ÅÂÎÄóƒvëö¨‡¤2€̃êLăÁ«ÚûÔơß»ûĂĂ¿ị́¡ÁŸ}߈ưÚíÖă½§{½o£Á뙇ÑÓå̉ 9¥‡×±»½ºº‹Ü¹ÚÏÄ̉Å÷ƒvÙ̉áê匿NÛ«‚ ½9·Å¨ÈÓº™‰kß [ïS½ÛºÅ»‰¿I±»±»½ÏÔù×߈ÑÄëơØ¿ºù¾¡Ôª»YƒˆƒÖ©ÓÏÅ9¥‡́Åơê©Øù뇺óÇÏÄơºƒv±”ÂÉÖ»ÁƯ—¾߈ơèÅÍÓ‹Çù××$·º¡Û±»§ĂÙËÉ9Û«‚ ½9Ù½ưˆ—¶%±ÔöÁH™ơÙÚÙî‡Ç߈‡Çù×ᬅÇơÔÿçµØËdzë§ÿÇÏĽ‰Û©ÓëÚ§ôÑØé‡˼ƠĂÙßÁÿ׃v«»¡ÛËÓ¯Ô±ÜÛ«‚ ½9ÅÙï½ö±»ơĂ·‡‘×8ç«Ô©ˆÛ«‚ ½9ßÁ¢ä£ư9¥‡߈×Ó£ä9¥‡“Æ™‰kß [ïS·Å™‰kß [ïSÁĂ‹Ç¡È8¤‡«‡“Íj™ôÏÔ­½¼ßÂÇØ·‡‘×8燫‡“ÍjñÚ½€áÛä½Ù½ñÓĂÙăˆŸ÷‡ÍÓÙ‡Ï9…ăˆŸ;¹Ú‹Çÿܹڼëö¹̀»ÛÅØíơ¡È́v×¾ÿ¯¶Ù×—ÓÛ«‚ ½9ñÚ©ñ«‡“Íj™ÔÛ×­¶äÁ£Ç¿‰¥ÛÂĂ ™‡ÿ¯¶™‰kß [ïSÛ«‚ ½9±»ñÓºÓØ½ăơđÆ×ƠÛÄÓÏÔưÀƒv§âÁóÂÏ̉ØÚ‡ŒăˆŸ;Ơ¼«Ï½úÙÑÓ°»¤ÆñíÈœ‡ăˆŸ;ÑĂô´a§Ó߈º´Ă¡Úºù×½Ï؉j̃ZîSƒvä¼ø×ÏÔ±»ßÁ›¶é«‡“ÍjÍÓÛÔ­ÄÁí—G¡»gÚª‚ +¼9Ûש‡¥2ßëM½Ù½ê±»¾ôÏÔÛ߇xÛºù×ù׫·3uU£Ó©¼߈ªd±¿ÑæÛºù×ÿ×ï»å̉ ÛÄÓŵ‰¶UèUÉ̉ÇÖëö÷Á™‡¾ëọ̈ÔØÅêéëöÛן}åÁÛ9¥‡߈©ÓëÓ½ăº•î§Ô…ØƠêçÛ«‚ ½9×àÏ̉û̃ß™‰kß [ïS߈çôă„ƒ¿©ÓùêǶ99ù×»Û«‚ ½9¤Óù×™‰kß [ïS8¤‡¿º½€‹jÛ«‚ ½9ĂĂÙÑØ£Ø߈™‰kß [ïSëö°»‡º±»ăˆŸ;ßƯ©¼ơêƯÓ 8¤‡Â#ÙÚëö“ÈÍĺyëö›Û·Ô•Œº¹Ú»ØçÚ«Ú¨¼±±»߈ẳôêÁƯĂă½Ơá=‰¿I«Ô›º›¾­ØÅ؇ŒÀÛ́ƛԾÏÔÏÔ߈ÑÓ†ºƠù×Ô#¡¶èív«Ô¼™‰kß [ïSù×ͼ߈¿‰ưÁÁĂæ̉™‰kß [ïSĐÄê«ÔÔ¾F…ö߈·‡‘×8ç9¥‡×›¡ÿÚ¢ä¯ÈĂºưÀơêÏ̉ÛÄÓĂ¹Ú¥ˆ]1§ÔëöăôĂº‡ŒëöÔăˆŸ;kÙÜùæÛº‹r醹ÁƠ¾±»Û«‚ ½9™‰kß [ïSùßÛ«‚ ½9³(ƒÖɇỂ­Ô¹à¹ÚÁ㫇“Íj«»¼À‡€è/Ö:ơúíØàƒv÷ˆÿÚ§¡Ô¿ôÍĂëÓơèźÁ™Ø™‰kß [ïS—¶½úÙÏÅñÚÛ«‚ ½9ơÔÆ»߈Á|ƒàœ‰¾I›́ơâ߈g­Đ«‡“Íj×¼Û«‚ ½9Û«‚ ½9ñù×½*߈›‡Å–¿¹Ûº̀ÄîÅ»ØăˆŸÂóŸÛëö©ÀÏÔăˆŸŸÅ·‡‘×8ç•đÓ¼ùװȽٽéÚÆĂ¹Á›¾ù×Å¡ÔëӨי‰kß [ïS9¥‡×ƠắÏÔ§ƠËÉ9̉º±‡ÇÁ¹Ú9¥‡%ëöÅÔĂÙÏ̉±½‡ºÍË)éÛ9¥ÁƯ¹¾÷Ú—ÓщÙ½ÙÓÏÅăˆŸ½‹Û8¤‡™ëéåÛ«‚ ½9ψ÷ÁÁĂÏÔ«‡“Íj€Ó­¾—¶ù×ÏÔ½€9¥‡ơể½›¾¼€ 伟Ž۫‚ ½9߈ÊÖ©‡¥2ßëMñÖ÷‡ÓºÚª‚ +¼9«‡“ÍjÇÖá ƯÓ ¥Â™‡ôêơ»­åÛ«‚ ½9ùןƠÏŬȡ¼¥ˆ]1ù×ëöñƩǣØÙÚ¡âƒvé‡ÔX€ ̃»ú­ØƒvÏÔéÚëö©‘”·†ŒÛ«‚ ½9߈ÿ¯¶ăêÛ‘Ó»yå̉ ±́ŽơÔ±½ỞưÁá Ưº°»ÏÄóᙉkß [ïS·‡‘×8çÏÔªÔëöÁƯ¹ÚƠXÏÔÚÏÅ›¹çÚ‡º³È¿½+Í߃•¿àÏß«»ÁƯÂ4µØơèŤâơº±»…»¡Û½…Ø¿‰ËÇóÇ¢ÔăˆŸ;ÓÆÁĂ·Ôù×›¾½߈ô½«‡“Íjă»ƒv¶èƒÖ߈Á‡é/×:ơÔ¾÷‡ăˆŸÅàöŸóeĂÙ߈¤ÆÛ«‚ ½9†Ç +߈›¶éÑĂ÷ÁÏÔgơÔù×á=ÏÔ»ÅåôË̉ó¸¥Ü«‡“Íj¹ó›Ú±”§ôÆÖ£Ç¡Ûÿ­§ÓÜ›¶é%ƒ½ưÀ‚ËÓ±»½âל¥º»‡™‰kß [ïS©¼ÏÔÇØ Ô¿ºÄ߈öơ +³ºóå̉ ¯ÈưÀ°¿ăˆŸ¯Ơùê‹Üñμ–¶ơễˆ߈‹Ü…öï³2»‡œ·̉ ¤0­Ö߈‚ÚgÙÚ߈½ù×ëöß»û₫®¶±»†ŒëÓĂÙ¹Úçô¤ˆ\0Á‘Æ’Æ“ÆÛ«‚ ½9˹«ÔÛ¿‰Ó¾ơ‡›ç­Äÿ¯¶ÚÀù׳Ûù×ß»ûßÄÙÁĂƒvçôÓµ“º™ ½ªÛ»Å°ÆµaºÿÚ¬ÅhËÉ9í—GÔX¡µƠ¥ØÙ½…à³Â«‡“ÍjóÇÂÙ¡ÁÜñÓíÆ¡Ø¹Ú¹ÚîÅö—¶8¤‡—¾“ƠµØÙâÙ«băˆŸ÷Áºơ꨼µƠù×öơ÷Áµ†ïƠ¡Ô8¤‡™‰kß [ïSºÛ߈¡ÁƒvóÂçôÈ̉ăˆŸ;kù×ö¶¶ͼÏÅĂÈ·̣éêÚ×¶º@ÑÄë¼Ô•Ó¡Ô¥ÇăˆŸĂÙÇ8¤‡«Ôëö›ŒưM±»›¶éÏŵأäËÿ¿ÅÁÓ±ÔÏÔ½ơÛºÛ«‚ ½9ƠÁÛ«‚ ½9ơêåôÏÅ£Ó§ÔĂƯÏÔ¶Ôù×Ç ©À§ØÙŒë*«¥Ïß„¶ÈöÁÅn˜‰j̃ZîSÙÚÿÚ¿ÅÎ ́·‡‘×8çÁƠëö™‰kß [ïSù×ÙÓÏÔ9¥‡å̉ áêù׋Ƚô—ÓÏÅÆóĂ²¾âàÙ½á=«‡“Íj±»ó¡Ԍ¾©Ơ߈å̉ ­Ä½€‘æ¸Ú«‡“Íj¾Á½ù×™‰kß [ïS㻋Çêö·‡‘×8祈]1§Ô§Ơ£ƒó…Ö½€ÅةǛ¾«‡“ÍjÙƠ¾ºƒv½ƒˆ9¥‡‘±›¶éÑÄëÀ½‚ŸÖ¹Áå̉ ëÔƒv“Ơ­€‰¿I÷Ú±»›¾»̉˜êèäù×ë×9¥‡ÿÚ¡Û÷ÁÉ̉—»¹Ú»¼‘óÂăà‹Ùù׋ǰ»ơê‡Û¨¼µ!ĐÄ ê Å»ĐÓÙ½ơèÅÛ«‚ ½9¶ô ™‰kß [ïS‚v߈‘äÙڷźµù×Û׫ŒÙÚ›»ƒv»ØÛ¡È·Å‹Ç½€ƒv©Ç¹Ú™‰kß [ïS›¾ÔX÷É…à©y³ôøê¯È°»«́÷ÚĂÓï½ăˆŸÍćŒĂĂ ›­±àéMĂ«ÀÙ½ë×ñÆ‘È§íœø·ÔöÁ¡ó’¹ÜNÛ«‚ ½9©‡¥2ßëMơ陉kß [ïSÇÖ߈¹Ú×$̃Óù×ĂÙíÆÏÔ«»ÅôÙđ¹/˜ /ƒv˽ׯ̣ÔÚ×߈¥Æ°¿‰¿IÍÓơ¢µØ±»¹«‡“ÍjăˆŸ;›¾Ù½Ù½¦ôׯ±»ëöºÅ ‡ŒûØ™‰kß [ïSÛ׳•%ÑÅÏÔÍƠ´Ü÷‡µØÁ‡é/×:߈Û«‚ ½9™‡ñ‡Ăèéêö«‡“Íj³ắÙÚ̃ˆưÀ«¹æÚÁ̉óǵ™‰kß [ïS™‰kß [ïSëöñ׫ºùדï»ÁĂÍÓăˆŸ;‡ŒI‰Ôâàÿ×ÁƯÑ·ùơɇ™‰kß [ïSå̉ ›¶éµØ©‡¥2ßëM函Èç̃ë —Öù×±»߈Ï•‹Çß»û°»üÀ±»ƠÚàö¾ăÁëö«‡“Íj©Ó½€™Ó©Ó£ôŒ«Ô±»«‡“Íj9¥‡™´ö¿ß¡ÈƒÖưÀ߈ùç›Ú¥î«Ôƒ½ÁÛß»û±¿«‡“Íjÿ§ؽáêËǨÂă»Û×󇼘‰j̃ZîSÏ̉Èõa‡º̃„›×á ÁĂÊÇ•‹HơêăˆŸ;k…»߈å̉ íÀ‡€è/Ö:÷Ûíê£äÏŽ“Èÿ¼×¾ׯ·‡‘×8ç身‡“Íj«d“ƠơêÛ«‚ ½9ÏÔù×߈©÷ÙưØĂÙéôÛ«‚ ½9˜êèäù×ñÚ˿ٽÁăÓØׯû¶ÅÓÔÅ«Ôá £»­¶ôơÔ±½ÚÀ‹±»ƒ³¹¹Ú‡¿¡È¥Ø߈Ï﻽ÏÅ“ăà‚¾çÚ°»ÑÄëñÚÅØï½Ơó½ù×Ñ·ó¹¡Û«‚ ½9̣ÄưÀɹïƠ%ñÓ©ÓơèÅÙ½ÿÚ¯ÿÛ•öÿ¯¶áê¯ù‡¤È½“Ơïä× ¥Ûëöë̉¡Ô¹¶ĂÙ³àÿÚÙÚÏÅ߈ưˆïƠ™…ƒĂÍĘởÆÏÔ·Åó‡“ơÄÿø×¾›¾…¾™ÙẳÙÚÛºùêÑÓƒvÑÓÑÓ%ÏÔ™‰kß [ïSÏ̉ëöƒv±»Ở«·3uU·‡‘×8ç߈©Ç¨¼ÙÚׯ«‡“Íjå̉ ¾©Ø±»½¥Ø§Øÿ¯¶ï½®ÈíÆ™‰kß [ïS·¼Í7©‡¥2ßëM½€ăÇ탽–ˆỬ9¥‡ñĹÚÍË)éÛ9¥›¾œ‰¾I•Çù×™ÁăĂ3±»߈Ơ¾G®ÆíœË%½€ÿÚßçÛÀÉĂÙÅëĐøƒÔÏÅư¬éơ—–«‡“ÍjéºëöµØ߈ÑÓ±ë̉·Ôëö¶ÔªÚ×Ơ¥ˆ]1ÿ¯¶Ù‡Ï9…•׃ˆ³ûƠÙÚưÀ¤ˆ\0ĺÁƯ˜êèä¥Ù¯×ƠX±»×¾ÏÔ÷Úß»ûÏè¨̃‰¿I›¹߈߈³ ñ̉ª¶2tT¹Áă½‡‡Û«‚ ½9ăˆŸ;§›½ơÔ±»±»đÓ»ØÏÔëö£ ƒÚª‚ +¼9„µØùשӛ¾‡ñ5ẲĐÓ·§D ùêă.™‰kß [ïS¶êö…ßÚ8¤‡½€ºÑØăÁăˆŸĐÓñÖøô ½ÍÓ‡ÚĂÈĂÙºăˆŸ;Û«‚ ½9¹Ú ÁÓàÛ«‚ ½9±»ÅÔăˆŸ;k¨Ç¨,ߌÛ,‚Á¹ÙÚ»»ĐÓ¡ă¦ôÚצӿñ‚àôá=›·Ôï‡öï³2óÇ›¾÷ÁÏÅ™‰kß [ïSăˆŸ;ÑÓơꛡùת»éôÓØÿ¯¶ñăŒ«‡“Íj½¡8¤‡×₫Ú›¾©Ç¿‚‡xÇÖ©‡¥2ßëM™ÔöÔÂÖ»ÅÙÚÏÅÍ+çôưÁíÖ ƠĂèơÔĂÖÙÚ½̉ØÛ«‚ ½9Ù½¦Ôù×áƠ¯•Œ«‡“Íj¯¼9¥‡—Ó«‡“ÍjôỞÏ̉‡Û±Ô·Ó ¥0éÓÙÚ·ÅóÂơ»çÚƒv–»¹Ú™‰kß [ïS«‡“Íj£ÔÑÔÓ5“gesÁÅåĐĂưÀưÀ·‡‘×8çôÀ¼ùê¨Ó Û¼›‰ÏÅù×µØăˆŸ;k•ÜëÆ߈߈å̉ Ù½đ»Á¹ơèÅơêƒÚÿÚưÀöÁƒÀĐØ±½­Ä»×Ơ«‡“ÍjÛ«‚ ½9óÓ·‡‘×8çßÚ‚½ÏÔ«Ô߈Ó̉·‡‘×8çù×Ù½ŸâÛ«‚ ½9ăÇíÍÄ߈É ±»›Ă›¾™‰kß [ïS߈ÿÚëöŸ}«Ô­Ä·ÅÛ«‚ ½9·Üä̉ăˆŸ;ëöƠçÛ«‚ ½9ôÔ±»ÿ¯¶ùơÓbÅØùơ÷ÁïŒßÁÍħÔÅØ­¾9¥‡×ØùæµØ«d‘ƿśډ¡Ó°½ù×›™Î̉°»«‡“ÍjƠăˆŸ;ËÉ9ơꙇÏÔ±»«»°»·‡‘×8çƒvÑÄëÂÈ߈ÅÑ«‡“Íj™‰kß [ïSÁƯ™‰kß [ïSº÷¾öÙ½ăº‹Ü¡ÔÛº߈±»Û×ëö·ÜÍĂƯÓ ÀĂ9¥‡ÁåëöíêÇÖưÀ‚vÛ«‚ ½9‚¾ă»ÿ¯¶‰ÛÙ½¬ÖÓÏÔ¹ØÿÚƒÖĐÄêÙÅë‡ñ5½¹Ú¡uÑÓ‰Ûöƒvàâăº9¥‡™ï½…Ơù×½ôÍË)éÛ9¥å»ÏÔ™‰kß [ïSÏÔÛ«‚ ½9ÁƯ™‡ׯ³ºóĨ ÇÖ±)íÆÏÔȽ™‡Áö›¾ÑÓ£ØĂÙƒØơèŹڻ½Ån±»ăơÏÔ8¤‡×ÿÂÏÔ½Ü߈«ÚåơØÅê÷ä5̉®ÈÛ«‚ ½9߈µØ§ÔÙ½ù×±»×¿8“Æ·‡‘×8çÑÅ›¾´†щ±»ô±»¤ÇøêÍÓ×¾Û«‚ ½9¾º©Ó™‰kß [ïSëöó#öÚÅØÛÄÓÛ׫‡“ÍjÁˇ9Ơ₫®¶½ëö‡̀ÁÏÔ÷‡ÏăˆŸ;ÙÚ³…ÖµØăêơèÅăˆŸ;÷ˆÛ«‚ ½98¤‡çû(ª»³Æ©&ƒØ߈­½¼ù¾߈ûÓÛº9¥‡ù¼ñÚáˆÁ0q½—Œ9¥‡÷ÁŸ}¥ˆ]1áꨇ¤2€̃êLƒˆ÷Ùëö©‡¥2ßëMÛ«‚ ½9ºÁ÷Á™Ç‡ñ5ÍË)éÛ9¥ƠŽ…ƠĂϺ©Ó9¥‡̀́ëöÙ½ơØơÔÆßÑÏŘ ê è ä ƒvÇÖÏÄéÓ·‡‘×8çƒvׯÂÙщăÁµØưÀƒĂÍÄÚª‚ +¼9Û×ÙÚơÔªÔÿq¥âÍBËááêưÜßÄÙ™‰kß [ïS“½ĂÙöÁÛ«‚ ½9‡Ç¯Ó·ñëöÏ̉‚ûÉ̉ù×߈́ÚÜÿÚ¡ÛºØÁƯψ·‡‘×8çƠđ^ƯÓ ÛדÈÅØ™‰kß [ïSỔ±»ëÓÇäëÚçÔ¡ëöù×±½ơº¾ơ꛾ϼÙ½™‰kß [ïSưÀóÂóÇûÓÅØó|³Ç÷ä5̉ăˆŸ;ḳ× +±»¡ñÖ«»÷ˆëö¼°¿ëöµØÅÔѶ‘Æơ»ÜöêöµØéºëö߈á=߈ÇÅí—G­ØÍÓ¯‰¯0öëö÷$Ûº›Ú¹ÚƒvÏ̉ùëÙÚéÔÏÔÙ-ơÔÛ«‚ ½9éÓºûÜăˆŸº™ÔơèŹÁ̀Ó›¾¹ÁËÇ9¥‡¯Æ³Â§ÖµØ§Ø¡ÛơĂ½ØƯÓ Ûº©Çº£äù׫·3uUäĂ Ûù×ÓÙÿ«‡“ÍjÏ̉Á×™ô±½Úª‚ +¼9Û«‚ ½9âḈ“Ơ₫®¶ƯƠXv§Ô½³Â¶·Ü™‡›¶éƠƒÔÇÖ«‡“ÍjăˆŸÖ‡¼7½Ü߈̀ÓƯÓ «Đ«»½¿àƒÜ±»±»£äÔÎÅëÚÓØÂÙƠÛ«‚ ½9Å–ôƒv·È‹ÇŸȋӰ»°êØÀƯÏÔ“ă½ăˆŸ;ăˆŸêö¹ö©ÓăˆŸ;kÖY§Ôçô³àÏ̉Û«‚ ½9¯ÈÏÄósµØ«»£Çˆ½¡Ư³éëưÀ™Ô™Ó߈߈º½ÚÚù׺¡hùÔ™Áƒ¾‘ơêôéÚ̃ˆ›™‰kß [ïSé¾íÖ\Åëö߈÷Áƒ½‡ŒÍË)éÛ9¥ëÚË¿ƒˆׯ9¥‡§ô±½ï»ơÔ«»÷‡÷‡¥Ü£‡߈ơê½€ƒvù×·ØͪÍË)éÛ9¥¾ßëög÷¼«‡“Íj¹Ú¦Ù·&Ởר÷Ú½ÙÅëív™‰kß [ïSù×èơ¡ÈƠÄăˆŸ±»©‡¥2ßëM™ëéåỞ¿ßíֳع½½Ù½ׯÏÅêöØ-…ôù¿ÑĂÉƠ%‡Œ»ÅöÁ±»‡Œ¹Úÿ€Ô΃vÿ¯¶áƠËÇ«·3uU“ó¶®é ô߈¥ÆÓºëöœø½€‘ơȇÇ߈ñÚÛ×ÍÓ™‰kß [ïSù×߈©Ó9¥‡¥ĂÙ×~ÏÄä̉߈…»ÏÔívÊÖ “•—¶û³8‡ÚƯÓ µÍË)éÛ9¥Á̃«¼“È9¥‡åÁĂÙù×çÚ°¿íÖº߈±»±»ÅÀ½”½ưÀ£Ü‰±6ăÁÙ½ÙÚ¶ăàÙ½ĂȺÓÍÄå¿ÏžåĂ8¤‡×ßÖÅÄÍƠ©Ü…»ưÁ·Ø߈ÂóÂÏÔ¼̣ÙÚß»ûÛÄÓ³ØÛº×Ơ†7§jơꥈ]1ÁĂÅô˜­ÄäÁÇƒĂ¦ôkÏÔù×±»ËÇÜ߈¿‰ƒÚµØăˆŸ;9¥‡˜‡Åô±ÅԨ؃v¥ˆ]1«‡“ÍjÛ«‚ ½9•%«»ù×½å̉ ™₫÷‡ù×ÓŶèƠ›¾ăà±»ÑÓ‹Èÿ$çÚ£ƯÏÙ-ÏÔ¡Á½ĂèçÚÓºăˆŸ;º…»ùơ×̉ôêóÔ÷‡¬8¤‡›¾ßÚăˆŸ;ÿ¯¶¥ˆ]1ׯ°¿Û«‚ ½9½­¾ %³â•½—¶ƒˆ™‰kß [ïSăˆŸ;kÙÚ±»¹ÚçÚÚÀăˆŸÛºܺ½›¶é™‰kß [ïSĂ֓ȉ¿IµØç»̉½·ÔŽƒv£Ç–ˆËÓ¡»ËÉ9ëöíºÛ«‚ ½9ÅØ¹Úù×Ù½Ûڗعګ‡“ÍjÛÆươț¶éÓØéêׯ9¥‡Ù½Ë̉íĐ£Ó÷Á…ÂăˆŸ;Ǻ¶;;ÏÅû «‡“Íj¢XùêÄôëö«·3uUÏÔ™‰kß [ïS‡ºÚÄ̉«ÔßÚרͼ÷Á«‡“Íj³àï½ÍÓ™‰kß [ïS½ë¾ñëö»Ø™‰kß [ïSÿ¯¶ơ·åŒ¿N«‡“Íjññ¥‰ÍL…¨¼¥ˆ]1‹¾‹ÜÇ̉«Ô£Çù×·ÔỞ½ô…»œÁ Û«‚ ½9Ù׃ÖơêÏšӷ‡‘×8çưÀȇÄÓù׸ڕŒçàÏÔëöÿ×Û«‚ ½9ËÇŸ}‡ŒóÇ™º÷Ç¡ÔÛ«‚ ½9é‰ñ5ñ·«ä§ÔăˆŸ;®Gø¹Ó«·3uU«Ô—¾­Øù׫Է§D ăéëöµØăàËÓơÔưÀÏÅÑűéÙÚÙ×ÅÔÔXư?÷‡¾™‰kß [ïS߈¢»—¶ĂĂñÓôꙉkß [ïSµØåÁÀ½/9¥‡°»·‡‘×8çÛ«‚ ½9±»÷‡±¿ëö…¾½Ù½óÇƠŸÅ¬ÔöÇÖç½Ở§Ó½ĂÙĐÄêÛÚ—»ºăˆŸ;—»›Ă¿ß±»¯È½Ô­Ä¿‰ÙÚ…Ơ¡»ÓÅơèÅơÔϺºyôÅå̉ ÏÔ™‰kß [ïS«‡“ÍjÏå̉ ù×ÿÚÛ׋DZ»ÓŶܱëØơêéÔƠXÿ¯¶åĂƒvǺºƯ‰å¿ÓصƯÛ«‚ ½9™´ÇÖƒØÙ ¿¹óÄơêÛÇ¡ÇÙÚăˆŸ;¸Ú‰ÔÆèôêỠÄØÛ«‚ ½9º£í¹Ú ÛÑÄëœÁăˆŸ;™¶ÁƯÏÔ—»½œ‰¾Iͼ”Èú«‡“ÍjÙÅëăˆŸ;ª¶2tT‡Ú߈ĂÁƯÓ¾½—¶ÏÔ«»•ŒăˆŸÆؽ½Á¯È9¥‡×—ºË̉ơÄ£X¹Ú½ƒÛ™‰kß [ïSóÇåĂÍß¹Ú«‡“Íj©‡¥2ßëMÏÔư§‡û«Ù½­vÓ©‡¥2ßëM©‡¥2ßëMËƠ‹Ùù׫äÿ¯¶™‰kß [ïS½ÄÓç*ßÁ§Â”OÏÅ—¶«‡“ÍjÏÔØƠÏÔÑÅ؇Î9„™‰kß [ïS¥ˆ]1‡Ç׿8µØ¹à˜‰j̃ZîSƒÔƯ+Ó¾ù×É̉“¹ƯNơÔÙ×›¶éǺ߈…»Û«‚ ½9¨ƠÏÔ‡€º«‡“Íjƒv…Ö̀ÓÑ—‡Ç­¾ÁƯÿÚ₫®¶Á¹ơº™‰kß [ïS…ضèơ÷ÚéÚ™‰kß [ïS™Ó§ôá¼›¾Ï̉›Û±»°»ăˆŸ;ôù×ù×Û«‚ ½9Í­H§ô›Ú«‡“ÍjçÔ¡™‰kß [ïS—»ÏÔ Û§Ô—ăÛÄÓµØöÛ«‚ ½9‡%½€‹n˜‰j̃ZîS‡Ûá¬ÏÅé꫇“ÍjŸÖéê—¶½ƒvÏÔ›¡¹lív¯È×ùĂĂưÀÏÔÙ½º£Xô½ÓăˆŸ;ºy°”Úª‚ +¼9¥Çơ…™‰kß [ïSÚÛ«‚ ½9×¼¯©Ü™ơÅà¡ÁÙ×Ởùêç̉ăˆŸ;µØ₫®¶‡xâà÷‡ÏÅÏÅàƠ‹ïÆ™ëéåÿÇÍƠ›ºù‰ù×߈½€…ộ«‡“Íjïڷ䵉§iÛ«‚ ½9½€¶Åå̉ §åĂÅØ߈›ÚÏÄÑÄëÏ̉³¾°»«‡“ÍjÏ̉ĺ£@¾º±»ÏÄ«‡“ÍjùêŽÛ×µ†öÁå¹ÚăˆŸ;kăˆŸ;Ù׃ÏÔºÅăˆŸµØÍBÓºùơî²2±»9¥‡­¾Ù×…àó“Ơ±»Ï̉£»µØÅÔùơ¿Å…ù×ÂÙïÚ³ôù×ÓơçºƠϾ¥O»Ø¿‰ûÓÙÚºÛºÆÖĂ™‰kß [ïSóÔ‹ÜǺÏÅÛ«‚ ½9™‰kß [ïSÄÓ́vƠăˆŸ;ú ±»ׯœ‰¾IÏÄëÓéÚëâϼ‡ŒÙÚù׿̉ ß ăàâ±»¡Û¢XÿÛëơ׿8ËÉ9¿‰¯Ợ±»é¾·Ôù¿ÙÚç…Úù¼ÏÔö˜‰j̃ZîS­€ö«Ô­½¼œÚ¿ÅÏÅ¥‹ó›¾ăˆŸ;á$«‡“Íjó·ūԓÆñÚËÖŸ ź˜‰j̃ZîSƯº÷Á˜‡ ³ºóôê߈ºăˆŸ;½Ôƒvؽ¡ÁƒvăˆŸ½«ÔĂ9¥‡ÏÄñÆ߈™ƯÏ¿·‡‘×8çöƠÜŸ}ïỗˆív¿ºÏߣ‘ÏÔçÚ™‰kß [ïSăˆŸ;߈·‡‘×8çéÓÇÖ™‰kß [ïS̃ŒÚ,Ç%ë—«ÚƠù×ׇڿº߈á·Ô÷ÚûØËÖ̀ÓƒÖ•¾ơêÓÅ¿»½±»ù¾‚¿ßöëö¾"™»·Å™‰kß [ïSƠX÷Á†ŒßÚ™ô‡¾ßåĂ÷ÁÙ½߈º±À°»§Ô˜‰j̃ZîSÿ¯¶ÿ¯¶±»«Óù×íÆÿ§ËÓÅÁ­ÄÓºëöĂ¹½Ï̉¨À¡Óùן֩ÓÇÖÍʇÏÔ9¥‡ +ù×ḯù׿‰Û׿½À—¾àØ ߈•Èû›ƠûÓĐÄêë¼Ơ¼·̃ïĂº™‰kß [ïSêç¡È«<9¥‡°»¡Ạ́Âù¿ƒv—¶ªÚ†đ5ÿ¯¶°»Ù½·öÏÔåÁºăêĂÄô©‡¥2ßëM—¶‘±§Ở˜‰j̃ZîS×¾ÿ¯¶ï‰÷Ù˹³™‰kß [ïS¶è’¹ÜNÛ«‚ ½9±»߈èơ¿àÍÁá¬߈ÅÓçÚ9¥‡÷¼•‹HŸ}‚ƒß»û—¶ö´Ûº±»ºÏÅŸÖ½½›¶éơÔÏ̉›¶é߈ëöÓưÀÍ·êö·‡‘×8çÏÔƒvƠï³2ÏÔÛ«‚ ½9ÛăˆŸÿ¯¶Úª‚ +¼9Ơ«Ô“È9¥‡ÍÄ™‰kß [ïSÛ«‚ ½9öÿÚñÚ»Åñèéê·ÔçÚöĂ¹÷‡©¼çôƒ×ăÛ­½¼½€Û«‚ ½9é‰ñ5ñ·½đ»éÓÙÚ½¹ÚÅÅØ×Í©¼ù׃v߈éêûƠăˆŸ;ưÀå̉ ‡ºÏÄ@—¿©¼çÚ™‰kß [ïSöÁË¿±»ù¼ÁËñÚ°»­Ä™‡ÏÔÑÓó½¡È°»߈×¾«ôƠÙÚçÚơêÛ«‚ ½9ÍË)éÛ9¥g«‡“ÍjóÇ«ÔÖĂÏ̉¿‰—ÓáöÙڳȄÑÓµØ9¥‡¹Úù׵ߺ—Óô$Óơ$Ơ±»ÿ¯¶¬€ ½€—¶½áƯù¼Ơ¹¥ÿÚÇǶŸ}‰"ư“Û«‚ ½9±»ÿÚ‡xÛÚÏÔ™Ô™‰kß [ïSßÚù×÷Áó™‰kß [ïSĂôÏÔêö±»¸Ç∇xăˆŸ£Ư߈¡Ư·‡‘×8çăˆŸψ₫˜¯×¬Ô›¾¬ÄåĂçÚ±»¿º°»©“ÛÛ×±»ÏË¿Ơîå̉ «‡“ÍjǼ¡ÁđÁ™‰kß [ïSù׃ˆ̃ˆ÷Á°» ƠÛ«‚ ½9ëØ¡ÔÅÔ°»ÏÔƠÅơ÷ÁÍÄÛ«‚ ½9Á¹¾‰«d½™‡ÎÅ©àÙ½‘ơ¹Úëö±¿™‰kß [ïS«‡“ÍjÅĂËæ̉ÓƒvƠ‡Œ÷ÁơêÁ̉çÚ‡Ú ¬°àèM½€ÈĂÏ̉Û×ÙÚ½߈9¥‡‡x∠  ;kù×Y™‰kß [ïS›ÚÙ×ô9¥‡×›¾ß»û̃Áׯ»ØƠºm™‰kß [ïSăˆŸ;¶Å›Ơ¶‡  Ö8 æ ÅÓäô«ÛyؓÈͼÄ–¾Ù½ù×–¶ͼ¾—ÓÛÄÓ₫®¶ưÀçÚ¾™‰kß [ïSÙŒë*«³µÈ̀Ê)èÛ8¤ö±»߈ơÔ•Œ™‰kß [ïSÏÔ Á¯¼ơèÅĂmí—G󫇓ÍjÙ½߈ÀZÛ«‚ ½9ôÅÔŸÅë×ùø߈«‡“ÍjĂẸ̀Â%±»̣Â÷Á±»ó—ÚóÂÛ«‚ ½9˜‰j̃ZîS˜‡ƒṽˆù×ÏÔº½Ơ¸W—¶»ÅƒàÿÚÚª‚ +¼9ív¡Ôđ×Ù½àê«Ô½ÈϺ©&߈í–G +¿Ôϼ÷Á­Ä½Äô³×ÁÙÈÙ½ÏÅù뙉kß [ïS³àëö«Ô9¥‡½±¥{ÏÔ‹Çá ăàÓØÍƠñưÀÑÓéêォڃv¿‰ëö«‡“Íj߈—½÷‡́ÆÑÓ߈ĂÏỐƃÖÛ«‚ ½9çÚç½™‰kß [ïSé¹ÚĂÙĂÙàƠèºÙ½ͼÿÚÏÔƠâơÛ«‚ ½9£Øß»ûÂÙÛ«‚ ½9£ÇÍÓÏ̉ÏÔ߈ăˆŸûƠÙ½³Ơ߈ÏÔưÀÚ×ùף䗶±»ÏÔÛ×ÏÔØ×½ăˆŸ;çڡȽ€ºùëÄؽ'›¡ÂƠ‡Û¼ £ôÙ\›¾öÏÔÍ߈ëöÓăơ߈Û×±ÁñíÈ«‡“Íj߈“¼§Ôª»«»ù×ÍÓáê×Óƒˆ8&¤‡&֟談“ÍjăÆ²Ơ±»¿·‡‘×8çăˆŸÙ½†Ç“#箽Ÿ½ăà«Ô±»¡Á£‡ŸÖÙ½Û«‚ ½9ƯÚŸ­€±¿Á¹—üùê“Ơ³ÂµØù×ÍÓÚ×ǺÇÖÙ½ăˆŸ®ƠßÄÙåƠÇ%êç½ÅÛ«‚ ½9«ÔÅô«‡“Íjăơ¯È¹ÚµØ8¤‡÷ÚÛ×ăˆŸ·‡‘×8ç¼9½»ÅÑÓ½™‰kß [ïS«‡“ÍjÏÔÙ½¿¹˜‡‹Ç³à‚v¾»Ø«‡“Íjÿ¯¶Ưº̀Ó߈÷Á™‰kß [ïS¯ÈñÓ8¤‡ÖáÛͼ¾«d“Ơ«‡“Íjèơ¹Ú“ÈÛ«‚ ½9†º¹Úëö°»Ư„øßÄÙÏÅŽµØ؇Î9„ö÷Ú¢ôÛ«‚ ½9Åï½Û«‚ ½9ỔÚª‚ +¼9‹È‹ÇơĂÁ”ÓØñc%¡Ûå̉ ỞëÓÉc ĂÙƠ×ÏŃv§Ô·ÅöÚª‚ +¼9±»«ÔĂº·º­ó›¾½¿à‡ŒÓÅụ̂¡Ư³ÁÛ«‚ ½9ƒvÏ̉º8¤‡½ØĂµØĂĂϹ÷ˆăˆŸ;k‡ºù×Âï‡ù׃ˆ±»÷Á«â×¾ÁĂ®Gø…»·‡‘×8çµÈ Ëûơ?Å–™‰kß [ïS¡ÛÙ½× å»ơÔµǗ½¹Ú‡ŒºG½¹·ÔßÖ±»Ÿ “ó‡Ç±È߈º +½ïƠ±»­ÄÙŒë*«ƒváØÿÚ‡ŒóԄؽƒƠ¶  ¡ÛĂƠ±»³eÁ‡é/×:Û«‚ ½9­Ö߈ゥˆ½±»·Ô›¹ÚÀ̉ƒvßÔ›¶éơ½€å̉ ¨ÓßÄÙ©ŒÑÅ÷‡¿ß±»¿‰ơlѶÏÔûƯÓÅÏÔ¹½ôèġȭĥᬿƯÚ½Ă”·‡‘×8çơÔ±»¹̃»‹á çÚï퉽«â½ºñÓ›¹ơêƯüƠXƒ¾‘½Û«‚ ½9Ù׫·3uUå̉ ©ØŸẠ̊דƽó½ÿÚ¥ÛµØÆÇ¡%´Øƒvăെ«‡“Íj¨Ç߈ËÉ9·̣ù×ë̉Å̃ô«đ¶̣­å·‡‘×8çĂºÂÙ…ÂÛ«‚ ½9©¼ơºùêµØÁ¹ăÁÿ¯¶Ơ“ȱ»¥ÓÁ™‰kß [ïS̉½Ạ́©¼ä×9¥‡½½ù•öù×›¾߈öÁÑÄë±»œ‰¾Iº™Ă‡Çú̉ù×™‡±»âˆÿ¯¶±»‡Û·ÔßÖ½ÅÛÚöÔ&±¿ª‡’̀jÑÓ¹ÚºÏűëØáúÓáÛ³½ÛºÇÖÛ«‚ ½9ï»ăˆŸ;™‡ƠĂȃˆÏÅÁ¹°»ËÓá ÏÔÙ-ëö¾»«Ñå‡ôƒv™‡§ÆƯÓ ô™‡‡Ç«‡“ÍjͲÂá걿ٽ9¥‡߈ÁĂ‹«-‘gÁ©‡¥2ßëM߈Û«‚ ½9óÂÛ«‚ ½9«Ô¢äơèÅ‹Üơ!ơêÅË¿«ÔÛ«‚ ½9ơêăˆŸ;kÅÄÇÖ߈߈µØ9¥‡%ơêăÇí³zÉĂ¯ËöÁ‹Èƒà¡ÔÛÀö“Û¡ÄÏÅÚª‚ +¼9™ÁÏÔöÏĤˆ \ 0 ñ×Û׫Ôͪ±»½Ộǰ»½€Ï̉™Ô“Æó–ƒv¹Ú×ĂÁƯ³½₫DZ»À½YêÚå̉ ¶Ü ¡Ç“ +£X½÷$÷Úö9¥‡™‰kß [ïSÑÍĂ÷ÔƠºmù×÷ÁÛº÷Áƒvº÷Ú­Äùêạ̈̉|áºÄÔ‡Ù\»ØưÀưÀƯºÛ«‚ ½9öÅÔ߈…Ú9¥‡ɇĂ½¥Û߈™Ó‹Çù×–  ¦ ̀»  ùơ«·3uU±»ƒ¾‘™‰kß [ïS½³Ơ“ºÛÇ×Ă·‡‘×8çÙÚûƠX®à“ÛÎÔÓØÓÅ̃»ú«‡“Íj¹Ú߈߈¯×ÛÆÙÚ•Œä̉  ¾ƒv™‹…÷ÁóÔ±½ÅÔ߈Á‡é/×:#Ÿ}ăˆŸ;£ØÙ½½Ẵˆ‡ÇñÓÙÚµØëößƯ¹Ú›¾ưÀăˆŸ·Øú·‡‘×8çƯ‹Ç”ׯï½çÚ‡ŒĂ¯¾ăˆŸ¹Úøê§ÓăˆŸ¾Ϻï½óơèŃØÏÔƒÖ‹ÇóÇÛ×ăˆŸщăˆŸ‡ŒÏÅâˆÁƯ£Çº́Æ×Àơê¡¶00ù×Ù½ưÀ«Ôÿ¯¶©º£Ø™‰kß [ïSŪ‡’̀júĂÍË)éÛ9¥Ë̉9¥‡ÓÆ„ 8*¤‡*Ö©¼Ó¾ÏÔ…Ó©‡¥2ßëM¹ƠƠ¼àÛ©¼ù×ƠXëöÁ¿ÔÛÄÓÛÀ±»¡ÔµØÏÔïÚùêÏÔ«‡“ÍjûƠ»9¥‡øê½ưÀÛ«‚ ½9ḯÏ̉«‡“ÍjÛ«‚ ½9÷ˆUơêÏÅ9¥‡ÏÅơ꛾ĂÖ™‰kß [ïSÛ«‚ ½9ÏߺƠ'ƒvÏÔ±»ÎÅ÷Á÷ÁăˆŸ;É̉£ÇÍÄ9¥‡×±»½±»­¾ר‡ŒµØçÚ߈ăˆŸ;k—¶«ßÎÔå¿©ÇëöÛÀÑÓ₫×­Äëö½Ô§ÔơèÅ¡ÓÛ«‚ ½9«‡“Íj½È­¾ëñö£äÑÓßÉÎƠÁ¥̃ĂYçô™Ó«‡“ÍjĐÅÑÓ¿»ÆÿÚ½ëö¾ƒˆ߈«ÑÙ½ÎԵتÚî½¹ÚgàêÁ½—ÓÏÔµØÑÓƒ¾‘¨ºÏÔ›v³ź…ØÛ«‚ ½9«ÚªÔä×·Ôéꙉkß [ïS¡Ô©ÜóÄÛ«‚ ½9™Áó‹ÜÓº«Ôư“Á‡é/×:‡ŒÅØù×å̉ ¸à ÷Á™ôơêÿ¯¶«ÔÙÚ¡Û¨¼¹Ơ§Ô±»ÅÓÙ½ÖĂÏ̉ï½Û«‚ ½9ÅÓˆÙÚ«ÓơêéJé‰Ó5“gesÁÅ›¹§ºó–·Å½ÎÅø×·ÔºÔÎÔ‡™ù×µÅ߈ŸÈ£‡Ă¼ëöÏÔÿ¯¶‡Œ‹ÇăˆŸ;›Ô•Ç„øÎ̉‹Óỡ«‡“Íj¡ÇĂ»Å·Åôê™ÁË¿ÏÅ«‡“Íj¿½©Ó£Ơ½à‚ˆ¡Ûùר¼«‡“Íj»q‹Çß»û“Æ›¾9¥‡×¾ÇÖÏÔÛ«‚ ½9—öÔ³ï»ëØæºßÄÙרß–ù×ơĂÙ½¢X½‚àô‹ÇÏÅÛÄÓù×±»ùש¼÷ÚëÓ±»ƒ½™‚›¾÷ÁŸÖí‡Ở°¿íÆơÿ­¯¼£Ø§ØÖïƠ‰Û¿Å±»×ÓơèÅëöưÀăàƒĂùêÍÓ•ŒíváÛùףؽ€Û«‚ ½9¡»ÀÚêÖ…Ô¤Æ9¥‡ívÍBϹ×ܽƒˆÑĂ9¥‡ÿ¯¶ÏÔƒÖ˜‹ ù×Ë¿̃ˆƒÖ£Ø±¿Û×Ù½ù×ö¢ÇÓá ‡Œ¹}½½ƒˆ«‡“ÍjöÓµÛÄÓ±¿£Ø«·3uUóÔÙÚéÚàƠ + È±»³ …öơꉿI›¶éï½ĐÄêöÁ£ ÏÅÛÄÓ«‡“Íj—ӻŦôăˆŸ;Ơú·ºăÁź‰¿I²Ù½“ƺ×ĂûÓơêÁ̉±»½ª»8¤‡Ö¾ăˆŸƠºm‡ÚÏÔ±»â½Óˆ•=‘œ‡ÍÛ™vÍÄÁĂŒE(ÏÅ£äŒƯ +‹ÙĂȶ߈º Ö†‡ü2©‡¥2ßëMăˆŸ;µ†½ëö¡Èÿ×ưÀă»›¾±»ÂêëöÙÚ§ÆñÚÿ—¶Ÿ»÷‡’Æø×!…ɱ»½Ô™‰kß [ïSÿÛÙÅë¡ÔÅÛ«‚ ½9ăˆŸöŸÖ¡È9¥‡ÿỬÅ÷Á·êÏÔ‚v¹ÚÛ«‚ ½9µ!ÅÁ™‰kß [ïS…ôçÚ¡ÛăˆŸܺøơ߈ßÄÙ±»ÍË)éÛ9¥̀́ù×ÏŽëö•Èû›ơêéÓ«‡“Íj߈ù¿½ÿÚưÁù××Ơ¾µØñÖ÷Á߈„Âùꃘ‰j̃ZîSµØ×ÜÑÓ¯ƠÖ¾8Ơ€ÆÖù׃vù˜ºûÓÅ–ÔXơăà™Óô·Ü߈ĂȽ8¤‡Ï̉ƠÙ½™‰kß [ïSÏ̉ơê¡È™ëéåĂÙËdz(ÇÖ«‡“Íj‚Úólj£ä³ëöâˆ:ÅØƒÖÿ‡€ºÿÚ¼ØÿÚ°»ÓÅ–ˆÿ¯¶̀Ê)èÛ8¤ëö™‰kß [ïS¼Ơ™‡ÜϺö¶9¥‡×™ôÏű»±»ØŒê*ªÓØëö«‡“Íjẳ•ŒÙÚÙ½©ÓïƠ‚vôù×̀Ó½€Åɻ߻ûÏÔñÁûƠ‚vù×ÅôÏÅơèÅÁƯÛ«‚ ½99¥‡×üÀ›¾¸Ú¢ä½«Ñơ꛾ûÑĂÑóóÇùêà=÷Ô±»¶Åñ¢Xƒv߈íØÙ×ׯÿÚ߈߈›¶éµ†ÿڥػØÅn釭ºù×ÙÜ߈ù×¾ù×±¿₫ÛºÙ̉Û«‚ ½9ËÖ–ŒƒˆăˆŸ;ơú½Û«‚ ½9¼ÙÓ›·ÔƒÖëöÚƠ ¥‰ÍL…“ƠăˆŸ«ÚÁ±‰yÓ̉ù×߈áêË̉»ÁǼ釗Œ±»̃ëöăˆŸ;ñÓÏÅåÁϼ«»ÿ¯¶ăˆŸĂÈÿÚÚÄ̉ïiÏÔµ†Í ÿíó¨ÓëöÙÚßÁ¥‰ÍL…ÙÑöÏÔ™Á‹Ü¹Ú¢ä•Œ£‡‹Èï½—Ó³Â÷å5Óƒv«‡“Íj¡ÛÏÔ…Ôù×ơêƒÔăsªÚ½¯÷Áå»…ÖœÁ Ù¹Úơê×ùê‡Ûÿ‡߈íêËíƒvù¾íº«‡“ÍjÿÚäô»ÁƠƯ ïœȵa™‰kß [ïS‡Œù×רß»ûƒ×ÏÅëÔ‘¦±¿ơèÅÛ«‚ ½9ù×Ơ¿à™‰kß [ïSé‡Ùƒ¾‘ñƠ¶£ëö£è–¾½Ô³Œ߈ù׳«Ú¡Û±»åĂù×ßÁ‡ñ5µØ½€ƠÄÙÙ¿ºÅ©ÀÍË)éÛ9¥óÂéºÍÆ×Ơá ç'ƠÑĂÿÂÙÚœ‡™ơ±»±»߈§Ô퇻‹çÔ¡ÑØÏÔÙ½Ơăº«ÔÄÓÛ«‚ ½9̀Ó™‡¹Ú°»ƒvμ̃„÷Á«‡“ÍjËƠƠ߈-·‡‘×8çñÚ°¿ºÑÓ߈‡ŒñÓñÖ±»âˆ;­Ø߈ù××Ơ¾Û«‚ ½9Û«‚ ½9™‡ă཰»‰¿I÷^°»Ơ.× ßˆ¹ÚÁÙƒØÛ«‚ ½9º·‡‘×8çăƠ÷ˆÑăˆŸ;ơÛ‡¼ÔÅØ߈°½¼Ớ½¸£¢ Ăè½›¾߈öÓ̉£Ç½ÈÙÚƒ¾‘±»ưÀë™HƯÂÛÀÙ×ﻼ÷ÔÎÔ‚v?ÉỮˆ¦º’Ç—¶߈ÿ±»Á׫ԫÔĂƠ³–¾íÖ·‡‘×8çñÓ«‡“Íj…Ơ—Ø­Ö‰¿I¥—êö¡Ôăéê™ô÷ÁÙ×Ưâùêå­ƒÔ¯¼‡̀ßÄÙöéê³ôͮӭ€ăˆŸ“ĂÈ•½ŸÅ¿‰ưÀ¹»Û«‚ ½9߈ä̉Û«‚ ½9ÏÔ©Ê߈¡Á³Ø—¶Ǿ¬ô¦å̉ ¥ˆ]1°½9¥‡ÛÁ̉߈å̉ Óß»ûǺ¥‰ÍL…Ö¾8¿́á ÔXăơĂÈù×ĂÈăˆŸ;k÷Á·Ô߈‹°ψå̉ ›¾™‰kß [ïS½…ôºˆ‘Ú߈±»߈ăˆŸÓ÷‡«Ô¿ß“÷ÚͺÇÖÁÖ¡ÈơèŃÖñíÈÿ¯¶¾™ÁăˆŸ“ƠÙ½ăˆŸ;k߈Û×ÅØƒÀ̉ÓØï$½ñÁ•Œ½€›¾ŸƯ¡Û±»ÅÔ±»ăˆŸ;—¶G½¹œÂï»Ă¼å̉ ©‡¥2ßëM߈Û«‚ ½9£ä±»¹ÚëöÅ—ÓÿÚ₫ÏÅíêÙÚÛºÇÜ…Ö¼ƒvôĂ¡È­Ö“ÇÏÔàĂëö›¹ó£gơÔƯ´™‰kß [ïSÛ×× ùê¯Ó¡ÈçÇëö±¿©¼ëö±đÏÄ·¼Í7ÛÀÿ¯¶ù×±»ơñÁ÷Á½¹Ú¯ÈÑÓ߈ơ¤ÂÚª‚ +¼9´C¸®ÿ¯¶ñÖí—GƒáăˆŸ;¹Úëö¡ỒÓ»»¼‘ÑÎÏÔ—¶ƒ¾‘‡×ơÔËÛÿÚ½i›¾Ă¼ơ걿ÿ§ׯ¹ÚÛ«‚ ½9µØ±»µØí—G™Ô‡“ÎÔù¿ø× ÏÄƯÓ ¡ÁËÖ“‹Ïŧô9¥‡×î½™‰kß [ïS߈‹ÈÑÓƠX߈Ø×ÍƠ߈ñ«‡“ÍjŸØÏÔøô +¾Úା³ÈĂ[±»‚vǼ…Üă½øêĂÙä̉!!àê‰̃ö¾ƒv½ŽÁ½Ôù׫»×Ó½±»ƒv¿½«·3uU…»ƒv¡Çá «Û«‚ ½9™‰kß [ïS߈§Ô·‡‘×8çëöÁ̉ÏÔ·Ô­€¹ÚăˆŸ;ëöƒÖ8¤‡Ơù×ưÀơÔ«‡“ÍjÙYåˆƠ‹năˆŸ;ǼôźÛÄÓå̉ ±»ĂÙå̉ ª»̣Ä—»«‡“ÍjêÚ—¶ж°»Ù½Ù½ĂºÓØÛ«‚ ½9ëöơĂËÇË¿Ï̉éêŸÖ˜‰j̃ZîS§Ơª¶2tT±»ؽăˆŸ¡Óơ꫇“ÍjĂºû³ĂÙ̃ˆÚׇŒß„›¾ëö«‡“Íj¹¾¿ô¬¾ ëöÙÚèºÏÅ…ÇÍƠ£Ơä̉ÅØ̣ó½ôóÇĂÁ£ÇÛuÏ̉ͪ½ô½ôöÁ̉°¿·ÔØ áÙ½˜‰j̃ZîS‡×Û«‚ ½9߈ÏÅƯÇÖ…¼ËÓ¹£ÿ×ÇÛ¹£ëöÛÄÓׯ˜ô=çôÛÄÓ±»½€ø¿Ù½ăˆŸăˆŸ;Ơơ©Óó§Ôëö½ù×ÏÔ­½¼ăơ¡Ôï»߈ƒ¾‘«Ư™‰kß [ïS±»å̉ óÇǽïçË¿ÁƯçÚ•Œ½ëö¦Ô˜‰j̃ZîSóàÓÅ™‰kß [ïSÅ¥½ß«‡“Íj­½¼ûÛ«‚ ½9áöáĂ™‰kß [ïSø×öÁ9¥‡ív©À«‡“ÍjéÛü߈«ä߈Ë̉˜Ô…ƠÛ«‚ ½9Ơç'™ëéåºñÙưÀ•%ÏÄ‹Üéºà Û«‚ ½9°È™‰kß [ïS·‡‘×8ç…ÔëÖ¡ÓôÛ×é‡߈ÿÚâàơê©ØÿÛ·‡‘×8ç°½9¥‡¿ô¿»Û«‚ ½9ăˆŸ;kÿÚé‡Ă”%߈¿Åμ ÏÅÓ÷ˆçÚ½µØϼ¡Ỗˆ +Û«‚ ½9g×Ơ†7§jưÀ«Ô·Ô™‰kß [ïS÷ˆ¡ÈỜÓ›÷ÙăˆŸ߈̃„«È‡½ë™Hщ°»9¥‡ƠºmÏ¿ÏÅ«‡“Íj‰¿I™‹ÿ½ëöăˆŸ;Ơ±™‰kß [ïS±»™‰kß [ïSÇØ•ŒéêÅĂÙÓ™‰kß [ïS‡Ûëö¡Ç߈½€«‡“Íj÷ʃv™‰kß [ïSϺù×Û«‚ ½9ơê–»ăˆŸ;߈Û«‚ ½9‡º¡È§-ßçßæíŽçÚáöỊ́ƠÄÖ©¼¡Ôù×±»Å»ø×Û«‚ ½9źÙ½ơÔ8¤‡ïÅưÀÿÂơêÅôĂù×å²ÍË)éÛ9¥¯ÛǻɻóÇ̀Û«‚ ½9ôØÙÚ±¿‰¨ñö¦Ôºêö—»øÓö»å̉ ¸£·Ô±»¯¾¿‰Û«‚ ½9À¹(×Ü­¾½Đ߈ÏÅ™Éăà®×¿‰9¥‡£X¿ô™Ó÷‡á ‰ñ³Äí½¯¼ßÚºÿÚ˜‡¹ÚÛ«‚ ½9ûÙÿÚŒƠöÁ½ØưÀ©‡¥2ßëMœÁ±»¯Èíê÷‡å̉ “Ûø×³ÛףǽÁÎÔ÷ԇǷ‡‘×8çÁ¼—üÏ̉éÓÙŒë*«©±ĂĂĂÛ«‚ ½9«‡“Íj”Ö щóÄ÷Áà= ËÉ9ÑÓؽíê¼ăà·Å°‡ÏßÔX$ëöëöùêñßö‡¯)É«‡“Íj§Ô½Ă¶‡Ö8æăàƒˆÛ«‚ ½9Ö¾ùêö¿‰©ÜÈ̉ ÷Á管Ôå׃vµØÍƠÏÔ…àËÓÓ¶­•·ʹ˹ÏÅéºăøê£ä‘‘÷Á߈Ü™ơù×ÿÜÙ-Û«‚ ½9ÏÔívÁ‡é/×:åÁ¿èơèÅơꥈ]1çô€ºăˆŸ;çÚÀ–¾Ù½éº«d±»ëÓ¿‰€Ó­ÄµØ‰ÁßÁßơºÏÔÛỔöÛ«‚ ½9߈˜‰j̃ZîS¿‰ívª‡’̀jăˆŸù꤈\0ô™Á߈™‰kß [ïS÷ÁÎŰÁĂÙÙ½߈£‡ùêׯ)…̃9¥‡½Á‡é/×:£Ơ–¿ơÔö¿‰÷Á÷ˆ£ ±»†ŒëöÚÚÙ½ƒˆ›‡ĐÓÏÔ³»ØŸÈ¾ÛÄÓügÅÓù×ơêŸÅê$ÓØä̉ĂƠ“Ơ×ÓĂÏÅÓ́×ƠëöÓºϼ¡Ô©ÜÛÆª¶2tT™Á»Ó³×±»Û«‚ ½9ŸÈÅÔ‰Û×ĂĂ ›­±àéMÙ׋ܘ‰j̃ZîS9¥‡ÿÚ£ÇqÇÖ·‡‘×8瘉j̃ZîS™ÔœÄ¯È߈‹ÈăˆŸ;ƯÛçmÇ߈̃»úÑÓÙÜ«&‚ر»ĂÙ±ÁÈ̉Û«‚ ½9áƠíØÍÓ¨°·‡‘×8çëöÜÙŒë*«ơê5ưÀ™×ƒv“ºù‡·È«‡“ÍjÎű»ĂÙ«‡“Íj›¶é¿ô¡Á¹à®½ẳǵØ₫§ÔœƠ‰y߈«‡“ÍjƒvØ«ÔÂÙàꙉkß [ïS÷ÚùºÙ½9¥‡ïÚ¯Ô»~‹Û…ôê±ÈÙ×ăàÛ«‚ ½9«d³ưÀûƠÏỔÆÁĂÓî„Øâà§ÔÀƯÑ÷ÏŧwÿÚÙÜÙ×ß„—ó¶ß»û±½ă»›¾ăˆŸ;ÏœƃơêăV›ÚÛ«‚ ½9߈ëöƠ¾GăˆŸ;£X‹Èù×½ăơ„öơúºăˆŸơêă»––¥ÛÏ̉ỂÓæ³È÷Áÿ&ƠÜ÷ÚÙïív¿‰ÅôĂÈ߈ƒˆơꙇŸÖăơƒ½ăˆŸăˆŸ;®È™Ó¡hƠÅ»ÅÛÄÓñÚŸÅôúĐ¥ˆ]1›¶é›¾Ù“Èùê·ôï²2‡ŸÅ·Úëö›é¹Ö9¥‡Ơ¼½»¼‘‡ŒƠívÏÔ«Ñá ƒÚÛ«‚ ½9ăˆŸ;Œ¾‹Ç₫ßÔïÚ÷¼‡ºĂÓØÏÔÓív‹Üƒ…½ăˆŸ‹Ç°»÷Ïű»µØ½ơ…©›°»¥âå̉ ăˆŸñÖ´†ÁÿÚ±»ăêƒÖÂșӇaù×8¤‡ÖËܙ‰kß [ïS߈ôÑæ½9¥‡ĂÙ‡x¿º“­v­v³ÂÍË)éÛ9¥™‰kß [ïS·‡‘×8çèêÁ̉ϼßÚ„×$±¿÷‡Ơ¾GßÄÙÏƠ·‡‘×8çîÅÙÚö±»§Æ߈ƯºÛ«‚ ½9€öïÅàºÚÀ0›¡¹¼‡äÏÄƠ'‰¿IÏÔƒ,Üш¡Ơ›¡ë}«·3uUƠ±»¹Úç̉ÏÔ§ăùê±»´aÛºÛ«‚ ½9凷ř‰kß [ïS‘Û×$ưÁç̉÷ÁÚª‚ +¼9ôÄâˆÚÀù×ùדƠ÷‡½¿̣ËÈ9£»¿Å߈›‡½̣ å̉ ƯÓ ÏÔ÷ÙÅØÙÚç̉§q±ëػ誻°½Ûº®å̉ »ĂƠºœÁÂÙ­̃ÙÚ‰Û½™‰kß [ïS…Ô“Û±̉§ÆóÇéÙÂù×êöº˜Á¡ÏÔÏ̉ßÄÙ¾ºªÜƒv•Œ‹Ü«Ô÷Áù׿ºưÀûỌ̈ǹڮ¼̣Ûß˹ÑĂÛÔXơêĂëöàƠÛ«‚ ½9…»ÿÚù× ¬°àèMÙ½߈‡Çµaëö©£ƒvÙ½Û«‚ ½9º±»¢ ù׃ØÏ̉°»ׯÛ«‚ ½9éÚù×Ï̉߈ÁÏÅĂºƒ›¡Û«‚ ½9¡Ô™‰kß [ïSŸ¸™‰kß [ïS±»Û«‚ ½9ë ‡ŒÁ™Á«‡“Íj́v+›văˆŸăêÏÔûƠŽĂºøơ‰ßçô߈Á×ûèùê½Ô±»ÑÓ›ÚÖÜ÷•ß„«Û«‡“Íjëö߈ÚívŽù×·¼Í7¡»¯ù×ùăˆŸ;­ô±½™‰kß [ïS“Ɖuÿ½›¾¡¡µØơêÀ½¼ĂĐÄê߈ÿÚÛ«‚ ½9»yöƒÚÛ«‚ ½9—»¶èÏ̉×$íÖ¹àåƠ©ÇÏ‹ÇÚֵׄܯ‰¯0ñƠ¶£ÂĂÙ߈Åԯșԫ‡“Íj«‡“ÍjÙÚơëÇ"ñÔơÔù׃Ö÷ÙÛˆ›¾£ÇÙŒë*«³ôߟ\Ѿ‡ù×ï»×¾Ïź«­Ûơ™‰kß [ïS¿ÅÀ¹ív9¥‡éÓƒ©‡¥2ßëM£‡ưÀƠÉ̉Ơ¯G‹ø™‰kß [ïSÛ«‚ ½9±»¹½Ç­Ø«äù×߈ßÄ٩DZ»Óºơê‚v™‰kß [ïSr÷‡€öôèÄ’­Äº ù×ù×—ˆÛ«‚ ½9¶«‡“Íj°»ùêÏÅψéêØîàê ±‡Åá­Ä§Ô¡ÔêØ­Ø¨‡¤2€̃êLÍĂÿÛ˜‡ăˆŸùêöÁêöçmĂÙ¿ßĂȋܡÁ¹Ú·ºíƹ¶©‡¥2ßëMưÀƒÖ£9º±»§ơꕌïƠ±½³Ø˜‰j̃ZîS†Ú߈“½Û«‚ ½9½Ô½ĐÓ‡íơƒÏ̉¹̃ÅÓÏÅ›¾Ï¿×¼ÅØ߈×Ü­ÄËÇÚÀ½½€·qÙ½ùט‰j̃ZîS‹Ç±¿ăˆŸ;9¥‡ÚºÓù×ñÆ›¾ÏŇœ«»¯ƒ« +>™‰kß [ïSĂÙǼ½ĐÄêÚ×߈ÍáƯ‰Íӿů‰¯0ÿ¯¶›Ú¿Å±ù×­¾óǼô߈—ˆ8¤‡™‰kß [ïSív«‡“Íjø¾ñÓ­¾Û™Á‹ÇÏÔº0«ÔóÇÉ̉ûØĂÙÿ¯¶«‡“Íjëö¥ºÙ½…Ơ«·3uU¿ÅáÛ‚'ª‡’̀j«·3uU߈÷¨…Œ½°½¼íÖùפ½½€߈·È¯ÛéÎщù×9¥‡߈¯ÈÓ¼Ä.ƒˆ‡Ï̉߈ÏÔ­v«Ô¹Á¡Á/Ă¥Û¡ÈöÏÔ™‰kß [ïS“Æ£X÷Á‹Çù×—~¼ơÖ¾8½°½Úª‚ +¼9xÔÂÙ…¼Á“«‡“Íjù×¶‡Ö8晉kß [ïS½™‰kß [ïSŽ«‡“ÍjרÛ«‚ ½9ÚÀµaïƠ™‰kß [ïSÜÅØÑÓÁ½öơăê“Âù×íêæº«Ôù×ƠÄ߈¹Ú¯ÈûƠÛ«‚ ½9±»™‰kß [ïS‘ÆĂٵء»ËǹڵØÁ½§Æß»ûÏÅÑÓ¡Ó¶Û×Á‡é/×:ÙÚ±»ÏÅ·?⺰»ĐØăˆŸ;­›«‡“Íj«‡“ÍjưăˆŸ;¡Ơªº ÷ÚÁĂ£Ô¹Ú£Çöơê¾™‰kß [ïSÛ«‚ ½9½$ù×Ù©¼ç̉“ÈĐÄê¹­Ä·ó/á ±»ưÀé•Û«‚ ½9ׯé‰ñ5ñ·½ù(¡Óµ†±»ØƒˆÜù×ơêƠÜåô·ØæÚù&Û«‚ ½9é‰ñ5ñ·½ÿ¯¶߈ơÔùסÁàÏ̉½ËÉ9ƯÓ ¥ÆÛ«‚ ½9¹¤ĐÓ½ù×íÆ¼ĐÓ߈¥*Û«‚ ½9—Óơêǽëöù×ÁËă࿺©ÓY¡ÇÍƠÛ«‚ ½9ëÓ¾å̉ ߈¿¹í—G™ÛÆƯÓ ­Ä­ă೺󿉫‡“ÍjÛÀ§Óö×¾çÇ™‡“gÜơú½€¯Xª¶2tT³È­ºÂ½ÔÏÔ™ëéåă­½›­ö¼ëö±»™Øù×³Âøë©ÓƠ×½Ô«»ç½ưˆơÄ£ä“Ⱥ‡ƯÓ ±»­½¼ä¼.™cÿÚơÏřӫƠÏÔëöëö9¥‡Û«‚ ½9Ù½«‡“Íj̃Ö½§Æ‹Óá=ó±»àđá ÏÔƒv™Åƒăº½€÷‡ùëÛÇívÛ«‚ ½9Ø×ÁỞψĂºëö½Ëǹ¶˜êè䉿IƠívçCÙ‡Ï9…ăˆŸ³È±¥íÁ̃¹¥ÈùëÛ×±»“¹ƯNÏÔù‡½†º»«‡“ÍjÖ·‡‘×8çÿ¯¶Ç»óÂÓ̉ù¿ëöù×ăˆŸ;ĂĂ ›­±àéM߈£„¿‰«‡“Íj¡Ôר÷‡°¿]…Ö™‡ÿ¯¶ĂôÔùוDZ»ÙÚ·‡‘×8磻׾öÙºăƠ±%₫®¶‹°ơ“ƠƼù×‹Ü¨Ø +Ë̉íÆË¿Ϻ¡ÁơêăˆŸ߈·Ó ¥0‹ÜàƠÛ«‚ ½9·‡‘×8çƒ×ƯÓ ÓÆ‡º€º÷ÚŒ¾™‰kß [ïSÅÔµØÙö‘¾ÙڑƽôăÇí̉ºôĂÙ—ÓÏÅÛ«‚ ½9ù×ñƫԽ›¡ÏŽ€«Ô€ÔXщ½H߈ơêÛÄÓ­ÄËÉ9ÑÄëÛ™ÅÓŸÈ́vÛˆÁÛÅÓơèÅ›¾Ûˆăà€º¢ôÅăö”º¹™àeƠ߈£ä9¥‡×ä̉åëöÙ¥Øơ껽›¶éÛ«‚ ½9Ŷ‡Ö8æơêƒÄØÁ¼ÑÓív·̣‡ĂƠ¿‰ªd–Ă9¥‡Ÿơ÷‡ïÅéêĂŒ̉̉ +ăˆŸÙÚ«»ù×µØÍË)éÛ9¥Ó؇ºù×ĂÁ¹½·‡‘×8çív±»ï»†“ÿÚÍË)éÛ9¥œÔÔXëö߈½ơ$¨º¡Èêöψáß»ûƒvÓµçơ굆™Ô±»Á‡é/×:ưˆÏĵڥºåôù×¹~¡ÁơÔÏÔ™‰kß [ïS±¿߈»ƯÚ׵ءŒ•ÿÔ™‰kß [ïS¿‰߈¢ô©Ç‡x±½ó̃Û«‚ ½9Ӽ纥ˆ]1·‡‘×8ç™ØÛ«‚ ½9Á̉ï³2ÚÀ²ÇéêÏÔơÏÅßÁ«‡“Íj߈ÏÔº¹ÚơÔ“½ÜûاӽçÔ¡ƒ¾‘Á‡é/×:›ÛơêÅôø¸£×Ü«‡“Íj½ô‰¿I˜ÏÑØÛÚÑÄëưÀǺÆÁ­ó«¼™Ó“Ơù×ù×À½›Úç–»߈ºy Û«‚ ½9–Óø×ưÀ»Å%ÎÅÇÖ‘Ö±¿ă­ơêÅØÏÄ@©½Û«‚ ½9µØƯÓ ›¶éù×¹Ú«‡“Íj©º°»Ù½Û«‚ ½9·Ô“ȋܧÔÅØûíƯº¼ô߈ƠÁ«‡“ÍjúàÇÖµ™‰kß [ïS±»₫®¶™Á÷Ú­½¼äơăˆŸ;ƒvù×½Û«‚ ½9ăˆŸ;³Øëö¼ôå̉ ‰¿IÏÔ£ä¦ô,º“ÆöÁëö¾ôĂơêđÖÁ×ăˆŸçÔ¡ơèÅÓÆ߈ÿ¯¶›¾9¥‡‡ŒËÇƠçÚ»ÿ߈߈ÍÓö³ÂƒvÄ÷Ư³È߈!ÙÚÑÓáƠÂÙ»±»ÙÓçÀƒØ÷Á§ô¥‰ÍL…8¤‡ÖçÚÏÔï»÷ˆ“ƽ߈·Ó ¥0ă½™‰kß [ïSÿÚỞÙÚÙ̉Ñ·ăˆŸ;ÑÓó͇Ö8æÛ«‚ ½9‡Œ±¼ơêëö—Ơ±¿éºÁÓÏ̉ù×§ô߈¹Úëö•̣±Ü9¥‡Ÿ\ÑÓ¹Úµa›ĐÄê¼ô×¾¡ÁÎÅÙ×™ëéåÙ½Û¦Ó ëö9¥‡¹Úëö߈ÈÇ…öÙÚ€¾éÓ™ö±¿íßƠX“×°½щ³ºó¡Û߈ßÚ‡º›¶é‡Û釙‰kß [ïS±»©Óܱ»¿»ù×ëöº·‡‘×8çÛ«‚ ½9Ù½8¤‡ëö›Ê«»í—G«‡“Íj²Æ«ÔăˆŸ;kÚª‚ +¼9ºÿEÛ±»«‡“Íj¥Óù×ñÓ¸Ú™‰kß [ïSñ‡³Üùד¹ƯNåßÜưÀñÖ£Ư¹ÚÏÅ­F³ºóÿÚÙŒë*«ăˆŸ;©¼ÏÔ™‰kß [ïS÷Úî½̉º“Æơê±»™‡Ÿ}·Ø‚ÔăˆŸ;©Ó°¿†Œ˜‰j̃ZîSù×Óº™‰kß [ïS±»ơÔÛ«‚ ½9@߈½çôÛ«‚ ½9̉´›¶é—ơ§Ô¼ØÁܳ۫‚ ½9³ ÛÀưÀµØÛ×Ù½€Ä½Ô߈¿àÓØ³ÈÇØ¥/‚½­ÔĂÙ½¥Ư‡Œ™‰kß [ïSÓ½Û«‚ ½9ƒvƒˆÏÅ×Ơ±»ªÚIûƯ•Èû›çÚÁŸ­Ö̃»úå̉ ÛËևי‰kß [ïSŸ\ưĂ8¤‡Ö“Æÿ‚vÏÔ…Ûéê¿ơ±»å̉ å̉ ív‰ÛßÚÛ¹½ö¹ §Ö°»«‡“Íj§ô¹ÚŸÖ‰¿IóÇ"ÅÓ™‰kß [ïSå̉ Á½ÅûÏů¼ïƠ¡Á«Úƒ§ô¥ˆ]1ơêĐ…± ƒvÛ«‚ ½9ƠXĂÙ¡Ó¡Èê˜H¹ëÓăˆŸ;Û×ÛÄÓ±Áí–GĂÆ«‡“Íj¹Ö˳ÿ%Û«‚ ½9Û×·‡‘×8ç¡Ô¡Áï½ËÉ9¹â·‡‘×8çƒv˜‰j̃ZîS±»Ó¾—Óù×¼Ûăơ‰¿IÁ‡“ƒà¡ù×÷ˆ£Ø«âơêÜñÓ·Ô¡ÈĐØêö©Ø߈öÿ¯¶µØÁÖÛÄӵث‡“Íj‹Ü·‡‘×8穼¥ˆ]1ÏÅ9¥‡÷Áù×Û‡9̣×ö¶”Ơ˜±»ÂÙ¾…Ô‹Ç̣öèƠºm½߈ÍƠ›¾ê¼™ÁÑØæº™Á±»ơ»©‡¥2ßëMƒëöß~÷ÁÖÔ†6¦jÙ-“‡ºÏÔ™‰kß [ïS¤Æ‰Û«‡“Íj½ơÔĐÅ©‡¥2ßëMÛÆí—GÍË)éÛ9¥™‡ơóÂăˆŸ;́ơùơª¼âˆ:Û«‚ ½9÷å5Ó̃»úƒvÉ̉ÏÅÅØù×Ïű»“Ơ9¥‡åĂÛ«‚ ½9ÙÚº½ÎÄźÍÓÍÓï»±»ù×÷‡°»­Ö£Ô‹Ü«‡“ÍjƯ߈ÛÀ÷Á±Á™‰kß [ïSÏÄ™ÓăŸÇ»9¥‡¿ßƒvÛ«‚ ½9߈ÎÔ¥ÆëöÁ̉—ÖÏÅ×Ă—¶ëØôøͼ‰®ù×÷ÚưÀÛ«‚ ½9ÏÄç߈ÍÓ‘́çÚ¼±»§Ø½½Èí'9¥‡‘-̃ˆç"§Ô°»íÓơ±»Û«‚ ½9ăˆŸö߈ăˆŸùơ™‰kß [ïS³ƯÅíăˆŸ;ÿ$ă½ÑĂăˆŸ;Ăº½cû™³ªÔ¾³ÎÅ/ÿ¯¶Ù×¥¿ªù×™‰kß [ïS—ر̃ÏÅÓºăˆŸ;£Ø«d‰y¬¾‡ÛăˆŸ;”ᙉkß [ïSưÀ«Ô×ù׃ØĂÓ™‡±»«·3uUĂÙɵÀ¾—¾߈Û«‚ ½9™Áêöƒvö—¶Ï£»Û‡Ç©y߈ơÄÏÔÜà¬ûØăùןƒû(µØ­ÄÖ¾Û«‚ ½9ưÀû щù×£ØÏÔĂôÙÅë¸àƠÔ¹Á†a凾Ç%áß½Ă“Æçô…ÂăÇíÏÅÇżôëöÉ6·‡‘×8çù×ơêѶßÇ̉±¿«‡“Íjéê¾½߈‡Û»½ÏÅä̉ƒ×Ù½ÍÓëöâˆ:ƒvÙŒë*«Ÿíº™‰kß [ïSÇÖĂÎñƧÔÙ½ºÈåׯ½™‰kß [ïSƒˆ¡h•Ô±»†6‹È¿ÅÛסÈÙÚöÁ̉ăˆŸ;ƠÛÄÓ¥Ù™‰kß [ïSçĂµØ¾ŸË̉·ÛƠ›¾½ÉÖĂÙăˆŸ;·̣³Çù×Ö$ʹù×™‰kß [ïS·ºëöƒvÍƠ߈Ǽƒ¾‘‚¯ƠçÚ÷‡ÓºÁƯơèű»ơÔÚ×’ÇăˆŸ;kŸ ߈ù×Ù½ö¶º÷$ª»ă»ÑÓơĂÓÆÙÚÛÀ߈ƒà̉ر»á=ăºăˆŸ;©¼ƯÜŽ¶ ơçÚûØÛ«‚ ½9ÏÔ±»ƠóĂù×麻¢Ô“¹ƯN©‡¥2ßëMÛñ¨™‰kß [ïS£»” §¹ô±»«‡“Íj¹Á—¶Ü ơ꫇“ÍjÏÔăàÙÚ·¸ûB×Ơ†7§j±»ÀƯù×ơÔͼ©Ü±»ËÖ«Ô¹Ú±½ư•ñÚÑÓÛ«‚ ½99¥‡ä̉‘ÓöËܰ»ËÉ9“ƠÔĂ¼ÙÜ­Ö¹àù״ذ»Íı»ÿ¯¶‡9‰₫ơèūѠ%»º¡»ö“ÆŸÜñÖ÷ÚÅ»™ƒËƠƠöëöµ‰›¡ƒv‹Ùöˆù×ÖÆÙŒë*«½€ơĂÑóÏ̉˜ÁƯ‰·ÜưÀïÂ÷ÁöíÙ¸«ÚưÀ¿ßù×ßÄÙ‡Çù×ÿÚĂÈóÄÿ×ù×ÜƠºm†“ơꙉkß [ïSÿÚßÖ±»ÓóíºÙÚÂÙ×ưÀÛ«‚ ½9ù×́Ū»ÜÓ –½ÅÔ›¶éç½×¿8Å£íÖ˜‹ñÓßÄÙ³9¥‡«Ô›¾߈„£ÓÉ“­Äơµ†³½œà¡Û«‚ ½9™‰kß [ïS•×Ù-Ú ª ‚  + ¼9 ‰îçÚăˆŸ;å̉ á ¥‰ÍL…Œº óÛ«‚ ½9©¼»y˜Œ́văà™‰kß [ïSçôºnèêÙÚÑÓÓÔ¡ÓÛ«‚ ½9߈£Ç›¾½ÁÛ÷Úå̉ Åë¡Èÿ§·‡‘×8ç±ô¶˜Áå¼ ߈ÓÔ™‰kß [ïSƠ±ÔñÚ“¼Ǻ±»³ÙÚÙܶ«ÔƯÓ ›Ư‡x©Ç§Æí—G¹Ú™‰kß [ïS‘Ó˜ôŸÄ¼Á¢X±»ử¿‰«ÓÁ́Û«‚ ½9™‰kß [ïSơ‡x¸ÁÙ½ù×﻾ÎÔ«dÏÔχ¿Û«‚ ½9釽ȇ·ÔĂÙ°»‹ÇÏÚ½ï½߈ÿÚơÔù׫‡“Íjù×ñ~“ƠÛÀ߈®¼ ½­¥ˆ]1ÑĂ²Â×hÁ¹9¥‡ôÏǺÁÂăöƒÿ$™‰kß [ïS߈óÇùêí‡Ùâນ‡ÙÚÇØÓ*µØ¾ÅË®ÎÅ“Ơ«‡“Íjψé‡ĂÙù꿉ɹ½×¾Åăv·Ô™‰kß [ïSÏÔ”‹ œH «dƒvÄÓăºưÀƒ«Ô÷Ú©ÜÉ̉ù¿ïƠÏÔ£Çå̉ ÛưÀ«“ư‡±ù1ƒvâà߈éÓù׫‡“Íj׿8ơÔơĂóÄÁƯÏÅçÚ½߈ÏÔµÀ9¥‡º™‰kß [ïS߈„Ø•Ơ‡bÔëöưÀ«‡“Íj«Ó¡ÈÛ«‚ ½9ăˆŸŸèµØ›¡§ô¡ÈăơÏÄÙ×±»•%߈ÏÄÏÄǻ־( +ÿÚ9¥‡«‡“Íjù걻Ϟÿ¯¶±”Û°¿ÙÚëö߈±đưÁ©‡¥2ßëM׿8«ÔÁÛÛ×ÿ¯¶găÁ÷‡ÿÚÈ̉™ëéåăˆŸ;¾ªÔÏ̉“ºÛ«‚ ½9ƒvÛ׿ҶôÚ½½Ø™‰kß [ïS½ôñÓçÚ̉ØưÀç̉Ù½Ï̉Û«‚ ½9°»ñÖưÀëö“Èù×ù×ÅóĺØÿڵؘ۽ÿÚéÚñÓ÷‡çÚö\ëö™ëéåëÚơÔù×À‡ +€ +è/ +Ö: +Ǽ•ŒÁ̃¶¼̀7„Ç¡âɹ¤ÆÅ‡Œ̣éêĂº¶  Ù½ÀĂÈï³2ßŵؽ۫‚ ½9ùơ÷Ú‡ºµØ–~·Ô€ºëö›çßÄÙ× ¼ư½Ô›ÂΈ¹ØùêÓ¾§ôÍÓÅÓ·Ô™‰kß [ïSçÚÏÔ¹ÚÚª‚ +¼9ăˆŸ;½¡»å̉ ’½±¿éÚ¾ßÿÚ̀́ăˆŸ;«ÛŸ}Û«‚ ½9ÏŽ“ÏÅÅÓ¼Ă9¥‡¡Û₫®¶“ƠơéƒËƠ™‰kß [ïSª»—¶±»ÚÄ̉—¶¡ÙÏÄÙÚ¼Ö¹ù×™bƒàÏÅ߈ƼöÏ̉¶Û½€ùׂ½¤ÆĂÙ÷¼£È8¤‡óÂù×·‰°»«‡“Íj½¡ÁñÆ«‡“ÍjßÔº±¿›¾ûÓ̃ˆùê‹ǛÓ™ÁåĂƒv¿‰‹Ü­ÖÚª‚ +¼9Ûº¤¾±»±»Ë¿Ÿ}§ÔƒÄ™Ă­ô¹ÚĂăˆŸ;ƒv«ÓĂÓǼÿ¯¶ëÓĂºº»μ©¼ëö¶Å®G ø ·§D Á|—Úùê™ÁăÁä̉ÍÓÏŽᗻÅÓŸÖ¡Ûùñù×å¼ ÛºÛ×ơê®ÅÓÇÖÑ·£È߈±»ÅÑÄë·Ô¡%àƠ +Ï̉º‡Œ™‡߈ÅØƒˆ‰Ô߈½ĂÙ±»ï»‰Û—ˆÏŹÚñÆ–ÓñÓºÅÁÙ#÷Áƒv¯¼«—™ëéå Óà›¾¸ÚÓ¸£»«‡“ÍjăˆŸƠ¾G匿Ná ƒÔå̉ ùêÉ6ù׺ÙÚ߈ËÇù×Û«‚ ½9ÁĂ½€«‡“ÍjÛ×Ăö×¾­Äơé¶›¾™‰kß [ïSÆ¡ÔơÅö®¾ +éÓ¿‰·‡‘×8çăÁëö±»…ºóÔ»½³ØÜ±»ºôƠÙ½é‰ñ5ñ·­vƒÖưÀ£Ü¨ÀĐĂ Éº§Ôă»å̉ ÿ$×Ă‹†ÏÅ÷ˆăÆ̉  ¤ñ +ÑÿÏÔ8¤‡9¥‡‹ÇªdăˆŸ;ù×…Ú×ÜÏÅơÔ߈Ü»ØưˆÛ«‚ ½9¡Á̃ˆÿÂơÔÍn±»—Œ‹Ç¾ưÚơ꛾©Ü½Á¼å̉ ߈™ÓŸÅɇö³ ơêå¿ù‡¶è¹̃™‰kß [ïSƒÖÑÄëáêŸ}щƼ¯Ơ‰Û«»ÑÈ»Øû٭¯È߈ᇌ«‡“Íj»Ø™ơ˜‰*j*̃****Z*îS*¯f‡xáç9¥‡ÍĂ…Ơå¿ưÀĂºăˆŸ;kÙ̉ÑÄ볂ڽÑÓÍÄô¹Ú߈ÏÔÏÔ߈±»ỡ¬Ô Á|ă»ñÇÛÍË)éÛ9¥¡Á¹Ú¾³ÈµØ­vơèÅ—¶çÚù×ƯÚ¯¼—»ƒ×Ơºm™¢ääĂ¾º¸ÚÙ½ó#¡ÓÏ̉åÜÅÍƠ·‡‘×8ç±ÁщÓ.›Û«‚ ½9Ăô¹Úªd ½ͽÛÇăˆŸ;kËÇ»ˆÇÖ¹ÚÁ¹ƒÖơÖÙ̉™Á¶‡  Ö8 æ ©Øͼ«‡“ÍjĂÙϹ¾½€ßƯ€Çëö½€ÏÅ©ÓƯºŒÓ‰ßï»ÿ¯¶Ơ«‡“ÍjÿÚáˆÁ0q½¥Ç™‰kß [ïSâ¼€ơÔôê‹ÙưÀº Ö†‡ü2ù׬¶ù׳ Ùڇdz(º™ô…£­9¥‡ÙÚùפÛßÚá̉ÅØÖ߈™‰kß [ïS‡ÅØåÁ‹ÜÏÔÿÚר·ÔåĂɽԃ؟ƠƒÑÓÓºơÄơêÙâ9¥‡¢»ăˆŸưÀËƠÛ׫œǼ߈¥ˆ]1Û«‚ ½9¥Ûï$ˆƒvƠÜ·‡‘×8çĂÙ½™Ó«‡“ÍjÙÚ›¡ÓÆÏÅ߈•îß–ÿ¯¶ù¯÷ÔŸ\¢X¡Ô‡Çëö‡” ưÀÑÓÙÚ˜êèä¹È½ĐØù×ù¹Ú· Ù½ơêóÛ×ÍƠ­váê¥Ọ́Çíơ’¹!ÜN!¸Ö§Ó«‡“ÍjÑ߈¡́߈¿ôă½›Úèêµ.¥Ù­ØÙ½Û×å̉ ù¿Íćº«»Û¥ºϹ½Ó̉ƒ¾‘­Å«Ôơú¼ÓÆưÀÛ«‚ ½9ơÅ«‡“ÍjÙÚ½±»̃Á×Ó³zăˆŸ;¿¨ØĐr›¶éÁ“ƠŸÅäơÑÓ…Ơ¥ºƼỂ ÛºÛÄÓ‡ÚψéܧÆûÓù×ßÄÙÑÓăˆŸüÀă½­î…Ú´†߈ëö߈ï³2Ơ Ëûƒ±đ±»ËÇ™‰kß [ïS©‡¥2ßëMϹŽÁ̉­ÖÇÖƒÖ¡Á¹ÚáƠ™Á9¥‡Ûˆ½€á=éºÎÔÙƠ½€¿ăˆŸ;ß»ûÿÂǼ“ÔóÇçÚ‡Û¹ÁÿÚá Ûºù×ÑÓ߈µÜ“ÆëÔ÷Áïiù¿óÇÛˆ«‡“Íj“¹ƯN†×•Ç·Ó ¥0›ç±»ôê­¾Û×á=ß»û¡Ơ—ˆËÇ߈ơÔñƯÈöù×Û«‚ ½9¹™‰kß [ïSƒÅ»½ëדÈщ±ÁĂèÊÇ »Ø¦ÈÛ«‚ ½9ñÓ±»ÅÔ—¾ÂÙƠ¼ø×…»µ‹“¹ƯN߈ĂÙµa›¡Ù½«‡“ÍjĂÙÛ«‚ ½98‰¤‡‰Ö À¹« ©ƒ»5Ûư§‡óÔăˆŸ;·‡‘×8çÍÄ‚v߈ơèÅ‚½öù×±»ëö±»÷‡Ù½À¹̃ŒÚ,ơêƒvÁ›¾ÿ×û(ŒÛăˆŸ;k‹Ç¡Ô™‰kß [ïSÑÓ÷‡Äù×±»Å©ÓÙ·‹½€߈·‡‘×8çĂy‡×¾¹xº±»ívôê½Ô½€¾«»ÿÚ°»°»êö½›¶éñÖ̃Áơê¾Ç֯ɣÏÅĂºÇÖŸ}ËÇá ±Ưÿ×÷Ùù×›¾×ƠÏÅÛ̃ÿ´—¶ƒvơêÏ|Ç ˜êèä¸ÚœĂÏÔ½ѶµØ¥Ó‘éăơưêơêÛ«‚ ½9«‡“Íj¶8¤‡Ö·¼Í7«‡“Íj›ơ¼Û«‚ ½9ƒvá ưÆăˆŸ;kƠX̀ĂÛÄÓ¡ß™‰kß [ïS÷Á÷óÀĂÓº÷Áä̉é‰ñ5ñ·ƒv¶è—»߈ÅØÔºlÿÚƠX¯¾—Àÿ¯¶‘«ù×ÿ$ỡÛÄÓíêߌÛ,·ïï³2ÿÚưÀßÁÏÔĺ߈ËƠÿ·‘™‰kß [ïS¿à›߈¯ÛÛ«‚ ½9ñÖ§ôñÆÿ¯¶ù×™‰kß [ïS¾öÙÚơê™đ÷ÚöÓ̉ªdĺ́v ±»‘Óëöơú±»ÇØ¥ĐñÓÛº×ÛÙڤعÚͼçZ©Ó–¾™Ó°»—ŒÁÇŒƒơ¹Ú­Ö÷ơÿ¯¶±»Ü«%âÁµØÅØơêÅÏ̉«‡“Íj«Úù×߈߈¾Û«‚ ½9ñÚưÀç̉ÓÆѶß„÷Á«‡“Íj“ƃÖß»ûÏĽá̉Óˆ•=‘ÀÚ߈£ØÁ‡é/×:ăˆŸ;çÁÅÍưÀ—¿ɇµÛù×Ù™Ô9¥‡Ó±ÑÓ“ƠñÓËÉ9—¶ñÆéçÚÙ½¹Úƒï»ÿÇË̉ù×ÓÙÖ¾ÿÚçôí‡üÆù×±̉¹ÚđÓ¯Æ¸Ú ”™ôËÉ9Ù½ÏỞá=‡ŒºÅăˆŸ;›¶é½¯×ù×ÿÚéê½·Ô¼ÍÓ·Ø·Åă»ù×ÇÓÿ×›¶é˜êèä₫®¶½€ï½™‰kß [ïSƒÖªâí—GƒØÙ׺¸½«ÚÑ·©Àœ‰¾Iß»ûñÓƒˆ÷ÚĂÙ±»å̉ ß½Á½å̉ ëԯײ¾éÍĂË̉É̉߈ªâŽË̉¶è¡ÛƒvµØù׫Ôơ₫ÚÍÄĂÙÓ÷Á»Áå̉ ù×ù׫ÔĂÀĂÿÜÙŒë*«ÏÅË¿„Úçô©ˆÏÔƒv¿ôèô‡x®GøƒvăˆŸÿ¯¶¹Ú8 ¤‡ ×ÿÚƒóÔëØ•¾™‰kß [ïS¡Û‡́«•¾ôĂ €˜‰j̃ZîSÔ¾ F ÑÅÛ×±»ª¶2tTöÁëöèơßÚ߈ï½èçø×ÍĂă»ÿơă»Úª‚ +¼9«ÔÛ«‚ ½9üÀ³ÈÑÅÛ«‚ ½9Ï̉Û¹ÏÅơĉÛĐÓäÑÔÓ5“gesÁÅĂÙÙuâ»ù×ÏÚ¿‰‘ö¿‰ư¹«£Ç›¾÷Á¹¼‡º­v‰±6£ä¥ˆ]1ÿ×Íăֽ«»߈µaơêÛ«‚ ½9¼ĂĂÙöëöêöùêö°»«‡“ÍjƒvÏÅ‹ÛưÀ™‡ÏÅ罡È߈©‡¥2ßëMƒ½·Ô›¶éĂÈÛ«‚ ½9ñ‡¦Ø²ÂăˆŸ;ĂÙ₫®¶½Ô¡Ư¡Á×ƠÇŽù×ÑĂÆ½߈ųºóÀ¾é£ÅØÓºÏÅï»—¾ơº“ƠùÍËÅ߈ª‡’̀jÙ#ÑÄëưÀ¬ïϺåơñÓÛ«‚ ½9ùơ¸¼•Ơ¾é³Ø¼½ƠXÛ«‚ ½9ºƒdÿ×ăÇíù×¼Ô‰ ½™‰kß [ïSĂº߈öÁñ³ÂĂÙ±»½±»¥Ø9¥‡ơŸëöÑØ™‡ăˆŸ;Ÿ»±»ƒ½éÓóÇ¡ƠÏÔ½ăˆŸ;Û«‚ ½9ºÁ‰¿IØYÖØÍĽÙS™‰kß [ïS¹Á÷ˆÛÀá ©Ø­ÈÏÅá ·ïéÓí=Û«‚ ½9·̣ư%¿Ù…»‹Ù™‰kß [ïSăˆŸ;kÁ½ơFưÀ­ÖÑÔÓ5“gesÁÅÑĂĂÓïÚíÓƠƠħßĂºù×½߈Ù½ÿ¯¶µØX½€ËÉ9ŸÅæÚƒ§¥Û³záêëö‡x«‡“ÍjÖ̉‹ÜôØc¹Ú™‰kß [ïSÙÚׯ±»—ذ¿‡Çƒ[ăàáƠ™‰kß [ïSƒvɾ£ä³Â½Âà€ ™‰kß [ïSø×³™‰kß [ïSÑÄëß»û›¾ÙÜÏÚÏÅ›¾ÏÔƠù×êö›¾ơÅŒÍÓëöÑÅ÷Á¯àÿ¯¶çô«Ô÷ÁÑÄëûê¬Ä嘫‡“Íj«‡“ÍjÛ«‚ ½9Á̉Û׃ֱ»Ç8¤‡Ö½߈Ÿ}…˹̣¶ÙŒë*«ëöÙ½‰¿I™ơÙ½½ÍÓùêăà½ÜøêăˆŸÛ«‚ ½9©Ø™‰kß [ïSơê±»œ‡ÏÔÙŒë*«‘Û߈«·ÏÔ©Ó·ØÁÙÚ‡Œ8¤‡Ö©ÇÁƯÏÔù×߈™‰kß [ïSó‡۽¯Ó¢ä&¾ Èß»ûù×ÁëöÛ«‚ ½9߈›¶éÿ¯¶‡¸†Ç¦ÔŸè©ÀƠ™àù×ơêÅØăơø¼©Ç™‰kß [ïS·ÔÁ½“ÆÓÆÓÁ«»Óň½€¿à“‰3Ơ,ùĂôÏÅÏÅ÷Ú™Û½˜‡µØ߈ÏÔ‘Ó߈Ù½™‰kß [ïS£Ư«‡“ÍjÁĂÛÄÓ÷‡…öà ¹Ú«‡“ÍjçÏԽůƒßͯ¥'=U#QK¯Â±»£»¥ˆ]1§Ó±½ưÀ¿à¥ÓƠÿ§ưÚ›ÚÁ ™‰kß [ïSÇÖ¡Èÿ¯¶Ó‡ü¦†߈ăˆŸÿÚù×¹ù×ö߈…Œ½ƒĂù×¶ÙÚ¿Å¥Èëö«‡“ÍjăˆŸ;—¶«»ó¶Û«‚ ½9™‰kß [ïSÁ½̉̉ƒv“Ơƒv®¾ÙƠÿÚÛÖ½Ơ–ÅƠ߈ßÄÙ“Ơµ­Ä›!«‡“ÍjßÁª‡’̀j«‡“ÍjÏÔüĂéº÷Ú̃ˆƒÖçÚƒÔÔÏÅÍĂÿÛ©Ó߈Ơ¼ÍÓĂÍBÙ½©Óï½¾·ÔÓÅ‘±̀)¬H)ï‡ïÚÙÜĂƒˆ‡Œß»ûáê­Ö¡ÈçºרÆ¿àăàÙÅë³ïù¿ƠÄưÀưÀùêáîÅĹڽ¬ÖÂÛëöĂÙ½±»߈±ÔívöÛ«‚ ½9ÛÄÓŸÜçđ¢ä½ÏÄÛ«‚ ½9¶ĂĂ ›­±àéMưˆơê£YéßœÁ³Âù×8¤‡߈±¿“ß»û¾«‡“ÍjƒˆíÆ›¾ÿÚñ~ÙÚ›¾ëÓëöÛ×Û«‚ ½9¥Ö•ÜÛ«‚ ½9ñí½9¥‡ö¿ß¹Ú«‡“Íj8¤‡½ôµØ‡Ú Ëû“¹ƯN·Åƒv¦Ô¹ÚƒÖÏ̉ø‰ăˆŸ;Úª‚ +¼9Ç̉ϼÿ&·ïĂÙ¿ăàŸơÔ·ÔÏ̉²+a™‰kß [ïSù×óÇßÄÙÛ«‚ ½9å̉ ¦ôăˆŸ;º÷öϹăàăˆŸ;k›¾ăˆŸ™‰kß [ïSÁÏÅĂ¿ÇĂƒÚívûØͼ«‡“Íjù×ê$½ëø«‡“Íjù×Óº×Ơ¾»ØôêºÏ̉—¶ăˆŸ·‡‘×8çÛ«‚ ½9ĂĂÛ«‚ ½9ơÔŸÖ™ÔÛ«‚ ½9¹Á›¡ÙÚ·ÔïÚ£Ô©ºÓØ«‡“Íjçºáʳ çïÛ«‚ ½9ù׫‡“Íj½·Ồ¼ºª‡’̀j߈—¶·È‡ñ5ÇÖ¡ØÑÄëÛº½ÿÛÑÓ¯¾‹ÜŽ·}ÇÖĐŹ¼™‰kß [ïSíÆ…ĂÙ¹¼­Öëö›¾Û×ï½±ëØµÀù××̉›¾‚v¿»“ƠÙÚ߈¯Ơ·¼Í7Œ½ ±ÔÙܕܹÚơẠ̈¶ĐÓçôĂÈŸ\ô›¾ÿ×ù×ƯÓ …öÍÓî»ÁÁƯ«‡“Íj¥Øù××ĂÅËƠ÷ÚÓÅëö9¥‡ù×·‡‘×8çÛ«‚ ½9“ÈI½ƒ×¾¶Ôó–“›Ú×¼9¥‡ÈÙÅô߈ñÓ¿ôƠX̀ÓÁè­ÄÍÓâ‡Û—¶ÿ.ƒv¹Ç«âÙ½Úׯø×ĂȳԽƒùæưÀ±»ƒ½9¥‡¹½ĂºÓØñÓ›¾¡ÈÙ½Á‡é/×:ÆÅÓ™‡ѶơĂÍÓÛ×¾ÏÔëö±ÁÛ«‚ ½9ù×ï»Î̉ăˆŸ;Ù½Ë¿ăˆŸ;ăˆŸù×Û«‚ ½9³¹Û«‚ ½9Ϻ¾™‡¯Èùêå̉ ©ùׯG‹øëöóÂщí½9¥‡ßÄÙü̉ƠXûÑÄëÙ-û(½Ô€ØñÚƒvíơóÇáÉÇ¿‰“È„øÙÓÈ»¶Å«‡“Íjå7Ï̉”×ƠÓÅ£äù×ÑÓđÁ“¹ƯNĂ•˜êèä½¾‡ÅØâˆ·Ô«ÔÙ½ƒv±»ÁË·‡‘×8çíÿÇÿ¼Ó[–ø«‡“Íj«·3uUóÇù׈ùåǼ Ëû8¤‡ùê›;ÛÄÓ÷‡Ù×½ÏÔ…ÖƒvÑØçÚ•ŒÅå̉ óDZ»º߈ª‡’̀jƒˆÏÅ÷ÁÏ̉ăˆŸ;“Æ«‡“Íj̣ÖơêÁ̉½óÓĂȽ…€­:ƒv… ăˆŸÇ»ºù×ÏÔ½¾‡÷Á߈›ÚßÁßÄÙ¿́˜‰j̃ZîSăˆŸ;ëöôÔƒ5Á̉“È‚ØÙ½¡Á˜Á¹Ú·Ôó¶…̉Ù½½߈™‰kß [ïSÂÓÿ§·‡‘×8ç9¥‡öÙ½ÁÛÏÔ½ĐĂ¥‰ÍL…ăˆŸ‡ñ5¯Ơ£Èö¡Ô¨ÇÀ¼í‡öơù×ƯÓ ñڭȸÚóÂÛ«‚ ½9ơĂ¡Ơ›¾Ü¿ÅĂĂ ›­±àéMù×É̉¢Ư«Ôó¶å¡¼ÓÔëöƯºÓØä̉ͼùêËÇăˆŸ;߈©£¾Å«‡“Íj—¶ÂÖ“Çר÷‡Û‡™‰kß [ïSÛ«‚ ½9ơ¨‹Ü8¤‡×™ëéåÙ½¹—½ñÓ›¶éÓØ±»߈«‡“Íj¨‡¤2€̃êLÿÛ‡Ç±ëØ½€öù×߈«‡“Íj˜‰ j ̃    Z îS ĂăˆŸ;ù×ñÓ«‡“ÍjÏÔÑÓ›¾ÅØ£Ôëö™‡щÇÏÔ¥ÖñÙ§ôÏÔ«‡“ÍjÉ̉Ѷ÷Á»Øù×»ÅË̉ëöÍË)éÛ9¥˜ÁÍË)éÛ9¥§ÔăˆŸ;¯ «‡“Íj÷ˆ›¾¹Á÷‡ăˆŸÛ«‚ ½9ÙƠ±»‡Û±¿÷ÁĂÙưÀ™‰kß [ïSÁƯÛטô›¾ơê¸Ú‡“ÏÅ—ˆëö¹ÔơêÏÚ߈ăˆŸ;ÙR«‡“ÍjƸÁùë‹Ç¾Û«‚ ½9±»ư“ơ阉j̃ZîS©Ó¡Ûù×™Áëơ¡ÔµØ˹ߌÛ,¶èíL߈½€éº8¤‡…àáºơê±»«‡“Íj±»µÀǼƒÖµaºçĂ¿Åƒ½“ÇÛÀêöéß“ƠÍÄñ!ă½«‡“ÍjÛˆÛÀ߈ù¿±»£»8¤‡ÖơØ¡‰Û«‚ ½9Ÿ*§¹ÿ¯¶ÏÄ̃„8T¤‡TÖEëö¶ëö‹ÇăàÁƯ‹ÜÁ㙇ÏÅơÅéº߈±ëصÁ¹ÚÛ«‚ ½9åô­ÈµØ™‰kß [ïSŸ}¡Ô½ÔψØ×ñíȇڃÖÍÇÑĂ‹ÇăˆŸ•îĂÙ9¥‡½Ô™‰kß [ïSưÀ9¥‡µ‰îŃàß„íÆ߈íÖçÚß»û‡—ˆ©ă“ƠÓ̉ơêù×8¤‡ÿÚᬶ‹ÏÅ·ÛÿÂÿÂöÁù×ÿ¿ÅéºößÖ×ƠÏÅïiÿÛơÔϼ߈ç$Å¥ÑÅÏÅù×÷‡ÍË)éÛ9¥™‰kß [ïSµÛÉΧôº²™‰kß [ïSđÄm£Á༭‚vÙ½ĂºÛ«‚ ½9¯¼ÜáƯñÓ«)ÑÓéÓÍÓí½Ù½¦ÓÛ×÷Ú°»ÿ¯¶ÓƹŸ«»Î|ÏÔÛ«‚ ½9‡¿«‡“Íjö¡Ư§ô¿Åç̉߈‹ÜĂÁƯ¯•¹¶¿‰ªĐư“ĂÙ¹Ú߈™‰kß [ïS߈ĂÙù$ơêÿ¯¶ƒÖ̃Ú˜‰j̃ZîS¡È¹ÚåĂ©Ø™‰kß [ïSç'ÁÀÚɇ½Å–©Øà »ÜÊÈ9ù×Ûת÷°»ù×±»‹Ç±¿«Ó—ÓÏŰ” ơÛ™'߈Ûêá ĂÙÛ«‚ ½9߈±óăˆŸç̉…Ö§ØôרÿÛ×ÓÛÄÓ߈§ô«‡“Íjù×ùê½›ÚöÁ£Ø‹ÇÜ|«‡“ÍjÏÔ˜‰j̃ZîS«»±»—»ÅÔ•Ç߈̃ˆ£Øƒ¾‘ÙŒë*«ưÀô߈«Ôµ†ÏÄ̀ÓÏô¬Ö Ÿ\߈¯ÈöÁ¯ƒßͯ¥'=U#QK¯Â—˜Ù½‹ÇÓ̉ƒvƒĂ“Ơ«‡“ÍjÛ«‚ ½9ÿ§¡ÔĂÙ«·3uU…¯©Ó…زчŒ™ëéåóÇ߈ᬓ¾ñÖµØÁĂÚÀÍÏÄù×Ổ§÷¶¯áăàƯ ÜÀª‡’̀j­¾ñíÈíÖ¼ăˆŸ;ÇăˆŸ;©ÇÏÔ—¶à‡àƠïŶ¼̀7ù¿­Ä™Á½ùɶۃ×ÍÄù¿ÛÏÅ₫Ü—ˆù×߈ăÁÄô •ÇÚª‚ +¼9߈ÓØ•Œèơ +µa“½ơÔÂĂ*Ở™‡À¾å̉ Á˽€9¥‡á$¯¼»ØÍƠñÚưµ—¶ƠÛ«‚ ½9¶  ₫®¶ăÔ‡ÚÙÓÏű”ëöÏÔñ¿¡ÁŸ’±»‘Æ«·3uUăˆŸ;ëöƠ¥ˆ]1ñúÅØÛ«‚ ½9ưÚ·ô¯‰¯0Ἷ߃ڵ†9¥‡ù×ë⫺‡Ç›¹Đ«‡“Íj£»ëöÀÙ½˜‰ j ̃    Z îS ï»—¶¬ÄơĂưÀôÔ±»ív¾Ơé‡߈ƒvôå̉ ù×ïÚăˆŸ;kÛù×÷Á·Åq°»‡Œù×ăˆŸ;k—ăÇÖÙÚ›Úª‚ +¼9™ĂؽÛºƒvϺǼ½©‡¥2ßëMçÚüÁ—»ăˆŸëöív÷Á½Û«‚ ½9Ưº÷Á³ºó«‡“Íj÷‡ùêÏÄùêĂ à¬ÏÔ“Ơ·¼Í7­Ø߈§ÈƠÏŘêèäñÓå̉ êöưˆÙ½¡Ô±Ô›¡ÿÚÙÅëᬽԱ»çÚ9¥‡Û«‚ ½9‘±×¼»¹Ö‰ƒ½ÙÚ£ÇÏÅƒà›¾Ăº9¥‡ĂÙ߈Û«‚ ½9ˆÙ×ĂŸÈĂ£ØơÔÛ×¾º÷ًǯƠ¤Æâê߈ëöï³2ŸÜƒˆ·ê9¥‡×«NÏ̉ö½ăꃾ‘§ÓẩÏċǫ‡“ÍjëÓăÇíÆ›¡±»Ă¼Ơ%Ï̉ư“¹Ú“½ăơׯÁƯ±»߈¹'¦d %÷ˆív×¾º›Û‹Û¹ÖơÔ·Ô½¶ËÖ¹ÚăˆŸ³m¹Úù×™‰kß [ïS»Ø™Á§Ốv“ƃˆÓ̉½Úª‚ +¼9êö +Û«‚ ½9½­Øíꃾ‘Û«‚ ½9ăàÇ̉éôù×ấóŒó¬ȿß}¡È†ÇÿÚÛ«‚ ½9¡Ô÷Áù¿½€Û÷Á™‰kß [ïSĂÙÚºÛ«‚ ½9ÙßÅôê­Ö±½½€ÎÅ‹ÙÓ«º–ØƠ•Ó߈—¶›¾Ù½ôăˆŸ;̀Ă«‡“ÍjëößÄÙø×߈»Û™‰kß [ïS™ô‘ÙÓéàăˆŸ;É̉£Çgù×½ưÀåÁåÁ9¥‡«ºµ†ăˆŸ;‡Ơ­½¼Á±»­ÖÛ·ÔÑØï»·ÜÑÄë—¶°»ƒv½ơÔơÔëöăˆŸ;áßÓÛºÏÔÛ«‚ ½9 Á•{÷‡߈Ĩˆ›¶é˜‰j̃ZîSçØù×™‡ÏÔçÚâḈ›Ù׃vÿÚ߈ÛƒwÏŕǵ²ô¾ÑØív½Ó ‹›æëö£ØÏ̉ÏÅëÚÚª‚ +¼9ç4ÓƒˆăˆŸ¯‰¯0ăÁ±»åÁÇÖÅ«‡“ÍjÙÚ™‰kß [ïSƯº¡Ûæº߈›¾‡áƠù×çØĂïÿ¯¶€Ơá ÅØß»û™‡ùê«Ô¹½±»È̉ù×ÏÔö‰Ûëơ¡ÛưÀºƯ‰¾…ØÛ«‚ ½9Ö +ùê°»ÑÄëƠÏÅ·´¤Èϼ›¶é£ä›¾«‡“Íj9¥‡°»½½n›¾ç̃ÇÖç̉ĂºÏÔÛ…ÛÏ̉Û«‚ ½9âˆ:·Å™‰kß [ïSƠÓßÚ°»ëö߈ªÚđÇÏ̉ơÔÏ̉ÏÔ™Ó߈Ă›¾ŽÛºÈíÙÚÁƯÙ½ª‡’̀jûÓ½Üÿ¯¶ù×ؽ»ØµÜш™Ô¿‰ùơË̉£Ø·ô—ºï»Á̉«‡“Íj߈ÿ§Ï̉ô±»ôꃽ½¹̃½˜êèä«»½ç»½Ơó߈¹Á«Ñ¹ÁÏ|«‡“ÍjÅØ̃„·Ô—¶¯¼ÛÀµØ±¿±¿Ù܇ÚçÚ9¥‡“Ơ×Ơ±»Û«‚ ½9Ù½µ÷ÑÄë¾ßçô¿(ưˆ“Ơ‡Ó™Ô¯ÛƠX±Ô‡xù׃ֽđÁÖ¼±»¥Ó›¾Û«‚ ½9ïÁ¡Ô‚v×₫¾§ÓÇE§Ôö$©‡¥2ßëM¼ĂÙ¯å…ÏÔÿ$»Åûº‰Ûơê°»›¾ÖĂÿ¼ÛÚ½ÔƠëöÏÅ9¥‡ÇÖ±»ñÚÿ¼™‡ù×Ï`ÍĂ¹€±»Üùæù×óÂÏÔƒÖ‰Ô¿‰ÍrgíêáØø×±»Ë¿™‰kß [ïS¡Ơ™‰kß [ïSù×߈¡±»º£Ư›¡߈Ó¾¸£߈§ÓÙ×ÇÖçơ©¼äô¿½½Û«‚ ½9ÙÚ߈›¹ÎÔ“Ơ™‰kß [ïSgăˆŸ;kĂØµ.¥Ù™“¹ƯNÚ×™đ¹̃³ÅÓ©¾ö߈í—GŸÈ‹Ó˜‚߈¹̃™ăÚ÷Á½ÙŒë*«áÛƠX Ơ™‡߈°»“ƠƠ +ưÀ—Œ½—ŒÅ̃ؽ(ăơ„¢­í—Gëöï»߈ƒˆ‡½ß»û…ÇÛ«‚ ½9™ëéå­Ôƒv±»·Ø¿‰Ă¼›¾„-fÁ̉ÁĂ¹ÚíÖăˆŸ•Èû›ưÀù×°»ÇŵØùדÇß»û¿‰ă»±»éÚù׫»Ü Ëûß»ûÛ«‚ ½9Ó̃‡Ú›¾Û×ÏÄ÷Ô›À½¾ûÓŸ\ƒvøê½ăÁ°»•Çơê÷ÙÅØĂÙéÚ½û¼«‡“ÍjåµÇÙ½«‡“Íj™‰kß [ïS‘È÷å5Óºëöùת¶2tTáê§Ø߈åœÏÔ˜‰j̃ZîS÷ÁăˆŸÏÄ߈ù×ÏÔ•Œ×Ă©‡¥2ßëMÔ¾Fù×¥âÏÔ”ºơêëÚ™‡ÅÖ$»Üă±»àÅ߈™‰kß [ïSÅĩӱ»×ƒ×ĐÄꙇ˜‡ƠùêăˆŸ­Ø©ÄÿÚï»́ơÁƯ£¿å̉ Ó߈ш—IưĂÅÄ™‰kß [ïSơÔ•ŒÙÚ—¾•Œ™‰kß [ïS»×ÙÚ£ä÷‡Û«‚ ½9ÏÅÎ̉ÅØ«»ïiĂÙŒEÓØßÄÙù¿«‡“Íj§ÔÏÅÈ̉¿»ëöív«‡“Íj¹Ô÷™‰kß [ïS«‡“Íjöº§Óå‡×¾°»íÚ±»Ï̉ÛÆỔºɇ́vÿ¯¶ƒÖ½÷Ú™ÔÚôưÀ˜‰j̃ZîSƒ×µØÏÅÔơ.µß½½ôˆ½ăˆŸ;“Æ› ăˆŸ;ƒÔ˜‰j̃ZîSƯơëöăˆŸ¿™‰kß [ïS½¡dÅÁÓÆăˆŸÓž÷Ú½ƒˆ´a¶ÔÓ¼—Øͼ°»̉ô«ÛÙ×¾½€©º¹ÚƒàơÔăˆŸ;ƒÚ£Ô˜ô匿N—¶½€ѶĂăˆŸ;kô»̃ˆĂÙÛÔßÚ¡ÛăˆŸ;k©Ø¿Ôª»Ơè‰đ5𶙉kß [ïSÓÔÍË)éÛ9¥’¹ÜN‡ẩÍË)éÛ9¥âÁºăˆŸ±»½ù×Ü¿¹µØá Û«‚ ½9ăˆŸ;÷å5ÓÆï»ăˆŸ‡Ç¾́ø×­º«‡“ÍjŸÅ›¶é«dỂơêưÀăˆŸ;ï»Á…˜‰j̃ZîS¥Û«Ô߈߈ƒv™Á™ô¡ƯYÛ«‚ ½9Û«‚ ½9ù×ëÚÏÅ¡Ûغ‹Ü½êöĂÙÙ½¯«‡“ÍjÑÓÏÔ³ØêÚ…Ơ›¾߈ăˆŸù…–¾‹>‰ÜéÓÙÚưÀƒvÿ¯¶ï½«‡“Íjơê…”àêë×±Á·º™ëé壨§Ô¼€‡Œ©Óè‰đ5đ¶öÀĂ½µ•½9¥‡©‡¥2ßëMØ™ëé嵨©Ø¿›¾¥Û±»Ï̉ÑØơÔÏÔ—˜ùט‰j̃ZîSùêÛ«‚ ½9߈å×ăˆŸ;°»±»רÓ ‹›æÛ«‚ ½9ƒv…»±»›¾ưí»Å¡Û‰Û»Áß½«ÚƠ°¿­¶™Ô¹»øê½ô˹ÏÔ‡™‰kß [ïS§½£ÈơêÛº±»º½çÀ£È´aù×¥º¤ˆ\0ù‡«‡“Íj¯¿»ĂÈăê¶++«‡“Íj…Û©ÓƠơ‡©‡¥2ßëMÏű»ÏÔ½ÏÅăơ¡Èơê•ö¥Ú×ï½߈©-9¥‡Ù½ƒÖûàÛ«‚ ½9óÔ§Ô‡ù×ÅØ‹ëăÇíÛׯÓĂ˜Á×ÜÍ|·º¡ÔÁđÁǾÙ½¾›¾«‡“ÍjƒˆÓØ—¶øêYăˆŸ;9¥‡Ă¼ÏŌӱԽѶ§Ó§ôù¿ǽ‚Å¿‰©ÜÏÔ†Ç߈¡ÔăˆŸ;§Ôå­¾­Öëö9¥‡´†Éï»öƒÖÙ×ÇØ¼0ï½ÑÄ뱿ºù׵ؙ‰kß [ïS½Å8ëöëöÁ¾ùל‡÷Á×¾¶₫ÑÓ¸Ú½—ت́©ØµØׯÚ×çÚơÔăˆŸ;½ôù×ù×Ïž‡ñ5ÁÛ«‚ ½9ưÀ›¾ÏÔÆÖ¹Ú¦ÔÑæ±»ĂÙ—¾ÍÓ¡ÇÏÔßÚç̉Rä̉ăơ±»Ù½×Ơ†7§jÛÄÓ™‡µØËÇɇçÚÙ½ÅÓÆÇÓăˆŸ;ÇÖÙÚç̃Ÿ»ơ»ù××¾Ù½¥ÛÛ×½¯Û«‚ ½9«‡“ÍjçÚóÇ¿ØÁĂׯƒ¾‘ơԮȳ Û×ÏÄÏÅØ´†ù×ăˆŸ;kù×ÚÀ“ƻ؎ô꫇“Íjƒv·Ôï³2‡¾¶ÈµÈÖùÙ½±»áê§Ôù×Û«‚ ½9ß»û©ÓªÔ½ÊÓƒˆ™‰kß [ïSÛ«‚ ½9æºĂ¹Øß»ûÏÔÓ̉±»¿ôËÉ9‡ÚăˆŸ;8¤‡ÖŽÁ¼ëÔÍDZ»Àƃv›¾ĂĂ ›­±àéM̃Î߈©£ĂÙ¡h¿‰Ă™‰kß [ïSçô±»Ù½™Ôă½é·ÎơƠ³Ø«%ٯ׫‡“Íjù×£äùêæºÏÅ’³Èùצô&ÏÅ¿¹ù×…Ó³ÈÁ¹™‰kß [ïS¡È™‰kß [ïS‡º›¹ơêں凑Æ÷Á¥àßÏÙÚñ×8¤‡×ËÇÏĵØăÇíÙÚåĂơ꛾Á̉«Ôƒ¾‘ôêööÏÔñÓƯÚƒvÿÛ·‡‘×8çÏÔºÇÖăÁÙÚ™‰kß [ïS¼Ô)×Ơ±»ÓµØ¯G‹øËÉ9»Ó™Û‡ñ5ÏÔù×§ÔñÆơêăêŸèÙÚÑĂĐÄêø×‹ÇÏÔÛ«‚ ½9µ†¯×ƒv¯G‹ø‰¿IÑÄëù×ÁƯÛ«‚ ½9Ϻ½ĂÙù×±»ô©‡¥2ßëMëöÏÔº‹ß:߈ăÁÙ½ùơåçרå̉ ©Ơ¯×¸ÁÓØ9¥‡9¥‡ׯơê§ôă×8 ¤‡ ×ùëªÚ©‡¥2ßëMÛ«‚ ½9·‡‘×8ç»Åœ¿ËǛڛvÛ×ÙÅëÚÇêÚ÷姯çÇĂ6ë£åø°»9¥‡̀Ê)èÛ8¤ ¡Û9¥‡öÁÛ«‚ ½9§›ÿÚÛ«‚ ½9“ƠƒvçÚƒvÚÀ¡ÔÏÔ»¼‘Û«‚ ½9”Ö ±¿¡Ø߈›Û‹È™ëé囹…»Û«‚ ½9ñÓ‘¾ÑÄë“Æ£ÇñÚÁƯñÆăˆŸ;kœÁơèÅ Ûù×èêµØÛ«‚ ½9«‡“Íj™‡±¿ÛÄÓ™‰kß [ïS£äôÓØ£ÎÔ±¿ºyÏÄăˆŸÿÛơÔÑÄëí°À‡€è/Ö:߈ÑÓíê܃•́½ƒÓÅ¥ÆÔ¾F“º÷ÁÑÓ™‡Ñةؙ‰kß [ïS箽ô­Ä™‰kß [ïSÅÔ…ƠÙ½£Çÿ×ÑÓ½ÏÅ“Ơ™Ó¿‰é‡éºï»ùêƒv±đù|ׯ«ÔÅØ½ñÓÍÓ™‰kß [ïS¸Ú߈¹ÚưÀÏÔ麙‰kß [ïSªÚ ÊûÓźƒ«‡“Íjô¡ÿ§­€Û«‚ ½9½ÏÅ™‰kß [ïS±¿†ŒùæÅàëöÖÆÛ«‚ ½9Ó¾™r½›Û߈‘ù¾ßÁÁƯ8¤‡§Ô9¥‡ëÔü‡°ø1 ƠăˆŸá ­Ö“Û„.ĂƯơ¾»¹¹ÚX¿‰´†ĺ·‡‘×8çÑæï™¿‰÷Æÿ¯¶}÷‡ºđÙ›¾é‡¾²¹– ¾¸ÏÅ¡»Ă¸à«‡“Íj÷ÙÛÄÓÛ«‚ ½9ÑÅñÓ›¶é©ÓÛ½±»߈ÓµOÏÅÍÄ«‡“Íjá=߈©‡¥2ßëMÙ¾½Ư ÇÛ©ˆ‡Û¤Æ¯×Ơù׃ÔÅôÍË)éÛ9¥½ƒ½÷ÙéêÏÔ‰ÔưÀÂÓĂÙÓ¾Ở߈ñÓăˆŸ;kå̉ ºÅ…Û…»Åô¿ùô›¹ĂƟȱ»—¾­ÔÍÓÅ–‘‰Ç÷ß»û©‡¥2ßëM™‰kß [ïSå×÷ÁáÛƒƯÍÓ¯ ÍÓ‹ÜŸá ‚Ë匿NÏÅÑÓ·‡‘×8çÅØáꙉkß [ïS߈ĂÙŸ}«‡“ÍjÍÇÇÛÇ—»‹ÜóĂÙ×߈Î̉¹lç'Úª‚ +¼9æØÅØß™‰kß [ïSÇÖëöƠơ³‡Ơ¯¼ÏÄưƠñڦƾ˜‡‡ÇçÚ—¶“ÈÁ‡é/×:ƒvß„¹ÚÏԒƈ«‡“Íj˜Á¥™ăˆŸ;À1÷ÁÏ̉Ë%9¥‡›¶éÎÅÅØ±»¾ºÑĂÙŒë*«ÓØÛ«‚ ½9§Ô±»™‰kß [ïSëö“ÆÏÄÏÔ–»¾å̉ ¨‡¤2€̃êL‡ŒÏű»ËÉ9½ÓÆÛ«‚ ½9µØ» áÙ?¡M-ËơÛ‹ù×!#¹ Ơ ×Éùư • +‡¹'ư¥ííØ¡Á£÷¡ÔÔX†Ù½±¿‹ÇÛ«‚ ½9ëö́–G¶è«‡“ÍjÅÄÑÄë—ÛÙ½Û«‚ ½9éê˜ +ê +è +ä +ơêù×Áœ‰¾I½ĂÏŢNjÙ߈úÓö“ÈơêµØ‹ÜŽ¸Ú½Û«‚ ½9¿́Ä–«‡“Íj8@¤‡@ÖÁ¾ÇÖÛ«‚ ½9¡h¯ƠưÁăàă½߈¡ºñÓăơ±»Žù׳ÚöÁï½ËÇâºØ‘±±»ó¶‹ÜôÑÄë߈ÁƯƯÛºçmÛ«‚ ½9íx§ô·Ø«ÓÓ̉“Ơß»û¸ÚщßÁÏ¿ûذ»›¾±»«‡“Íjª‡’̀jëö²Â¿™ëéåŸĂ©¼ç'•%º¾ÔjăˆŸ³ºóÀË +öŽëÔƒ×ÚÀ‡»ÿ¯¶ù×щÏÔ9¥‡×ƠZ«‡“Íj̀߈ëö™ëé忺Ñә×Ó8¤‡ǽ¿Ø½ăˆŸ‰ÛñÚٽ߻ûÙŒë*«ÓØ×Ơá=ÁÛ׻ū‡“ÍjµØÂÙ×Û«‚ ½9‡Ç§Ûívơ꽟}ÓØ©ÇµcÚª‚ +¼9ÏŽªÚѶÓ߈ä̉ÑØ‘¾¹½Ư„¢Øƒv‡ÔáêÉÜĂñrƒv¡ÛÏÔÙÅë¦Æ¥Û¼Ñ›¾…Œ›¾ÑĂ² íÆÏÔ™‰kß [ïSÅôºù×·Ô“ƠÙڭıÈëÚ±»«dñƠ¶£™‰kß [ïS­ÖÅÄçô±»Ûÿ¯¶§ôÏÔ¹ÚçS±ơµÛß„…»ØăˆŸ;™ëé嫇“Íj‹Ç߈ÙÚ±»ưÀéºƠĪ»…Çù×½ÇÖÔ¾F›¶é»Û™‰kß [ïSÑÓơêÖ¹4Ѳ߈±»¿̣˜‰j̃ZîSăˆŸÏÔŸÅ…Œ…Ơ›ÚưÀ™‰kß [ïS¹Ú»Âú̉‡Úå̉ §‡—¶©Ç€¡ÔéêÙÓ†ºµƠÛ«‚ ½9ꙉkß [ïSưÀ•ŒÛÏÅéºÁ½ï»ăˆŸåÁ»Áß»û߈—Ó¥ÆóÔ«»Ă¹óÿ×¡ăˆŸºÅÿ§¥Øª‡’̀j½€È)ñÆ£ÇÓÔưÀ߈8¤‡×ÅÓí—GÿÚÏ̉›Úÿ¯¶µØÁÏÔÁ»Ø¾óÇ¯Û Ëûå̉ ÙÚ«dÅÁëöﻫ‡“Íj߈óu÷ˆ±»öÚ…ÖÈ̉ăÇíøêåÿ¯¶ø×߈Ö¾ăˆŸшÓºíºè§£»ƒvÎÔ…Ơ­¾ñÚÇ̉¡ÈרĂÙëØå̉ ™‡ÿ×ﻃÖÅïÉ€ăˆŸ;ÙƠûƠĐŧØíÖ³Èçë߈éÓ߈—¶÷Á™‰kß [ïSÉ«dùêÅÔ¢ä‹ÜÜ +`ơĂù걿áƠËÇëöùêĂÙ·̣—¾¡÷½™ëéåÛº›¾«‡“Íj˹Ù½µØǼƠ›Ú›¶é©Ø߈‹Ç§ƠÏÔ±»‡ÛÛ«‚ ½9¿‰Û×Á̉ăˆŸƒÛ«‚ ½9ÄÀ9¥‡ÅÚÿÚº½½Á³zÿ‡ù·§‹öÁĂơêŸ\ؽív¨À«Âµ»qÙ½£Ư¡Ü§Ø±»‡Œ±ÔüêöÁœ·̉ ¤0ß«Û«Ó§ÔºÓ ߈Å¢ƠµàÙÅØơêñÖ±»¯G‹øÏÅÅÔ»Øø×©Ó³ºó÷ÁÛꩇ¥2ßëMÓ¾ëöçôăˆŸ;󷇑×8ç̃»úÁĂÏÔù×9¥‡©‡¥2ßëMØÅễơËܵØđ‡›ƯçÚÏÅ—¶Á›¹Ăù꛾ßÚÓØë Ëû·‡‘×8燺—¶»ˆƒv¡Ưù׫‡“Íj†ºÓØơÔ•™‰kß [ïSĂÙ %ơÄÚ½¾ơ‡ÏÅ…½­Ôÿ$ŸØƒÖù×÷Ù߈ïßÛ«‚ ½9ÏŻأ‰‡ÇçÚ›¾¡ÔñÍçơË̉®Gø¿»¶ù×ù×ǽ±»¡£½·‡‘×8çå‘ù×¾¹xßÚåâăˆŸ;ÏÔÛ«‚ ½9ƒvÙ×ÑÛ«‚ ½9ÜÓ ¶¿‰ùꎗ؇x—ÓÏÔ½ƒÖºÛ«‚ ½9ĂÙÿ‡£ä›¾»Ă³ăơơ‡½ëöÿ¯¶ÓÓÛ«‚ ½9ͪơĂŽÏÔÙ½á ›¾ïƠÓ¼ĂÖ¿ºƒ×ÁƯ±»›¾­vÛ«‚ ½9ƠÿÛëö›¾̣߈Û«‚ ½9å̉ ÏÔơêñÚß¡“Ơ›¾˹ÙÅëĂ™‡±»Å÷ÁĂĂóÔô«»¥Ûëö—ˆ™‰kß [ïSËûƠÛÀùê”Ó˜Á₫®¶…à§ßơèÅáÀ™Óû¼ÎÅ—Óƒv‚v$—»›óÇÏŋӃv»÷Á‰yù׋½³È™ơù×ăơ‰àăàù×ĂÙëö“Ơ«ÔÍÓ‘ÖïÅÛ«‚ ½9å‡߈§ƠÛÀóÇÛ«‚ ½9½ô¹à½íÁ‡é/×:¹Ú±»¶Ôưˆ—́ăˆŸ;kù×÷Ù²ÈÛ×ß߈ÑÓăˆŸ;‡ºơÔăˆŸ;°»«‡“Íj§Ôï»ÏÅÓØ­¾ÿÚƒ¨ñÓÜßÖ•Œß»û±:Ë4ăˆŸÙ½‹Á©ß½Ô。ÔÉ̉Æ̉¿ôºɇëöăˆŸ;éº9¥‡«»÷4¶Ô ؽ•-ß(ưÀå̉ ÿÚǺăˆŸ;kÿÚ±»Ù½ÓØ·Ô¥Ûƒ¾‘Ù½ưÀÍÓ‹Ù¡Û¡Çù×Ô¾F½0Ơ*Ă³eû«‡“ÍjĂƒ½‡xéÓçÚÀ½ñÚéơưÀÏÔçÚו˜Á™‡ºç +ívÅÄߌÛ,ƃÚăˆŸ;™Á‹Üù×§Ô³œÜÔÆ̉µ†µØù×±»µØ9¥‡ù×­Ô´†ùºå̉ ½±»ÎÅר«‡“Íj½Áơê«Đä̉±¿ÏÔ¿ôÏÔßÖÓÅ£ƯÚÄ̉áêÙqó§¹ÏÅר«‡“Íj‡¿ȇºăˆŸơ꛾™‰kß [ïS̃ ›¾ûƯăˆŸÁÙ½Û«‚ ½9±»à¬¡Á·Åå̉ Ó߈ÅÀ˜‡ ™‰kß [ïSù׻íÖçôƒv™‰kß [ïSÛÚ¹½ù×ÅÔ®¾£­Ä“ƠăˆŸ;kµaǻ۫‚ ½9éêỞщăˆŸ·‡‘×8çå׃ØÙÚÏ̉ŸÈÍÄ߈Û«‚ ½9¶èî½ơꙉkß [ïS©Ó½ÔÍË)éÛ9¥·‡‘×8çÛ«‚ ½9»ăˆŸ;ăơ›v÷‡óÔ¡Ø̉½Û«‚ ½9éºÂ‘ÆăÄĂôöÏćx«‡“ÍjƒvëÓ‰Œëö߈ç'ăˆŸɇ›ĂÆĂ´ +£äÙÚÛ«‚ ½9ûØÁƯ₫Çá íê–¾—ˆêöù×ܽ Ëû³ºóóÔÏÔ°»߈·äؽ­Ö¿‰ëöªÛÄÓ‹ÇׯÓµÏÔ±»§ô÷‡‡ï½±½¤ˆ\0¡È½€å̉ Žƒå¡ÈÅÙÚƒvùê±»ĐÓыǃˆ¤Û«ÔƒvÓºï‰ă¡¹Ú߈÷ˆăˆŸ;k߈•Œï½ơÔ餈\0㻄Ơ퇱½¯Û‰ù¿Á̉ĂÙ9¥‡×£»·‡‘×8çÖÔ†6¦jĂºù×™ô½½Û«‚ ½9½ß»û·Ô“ưÀ߈™‰kß [ïS±»߈½߈ßô°» ‹Ü½“÷Ă_µØăˆŸ;áêñÓçô³9¥‡‡ÚÍĂëöÇÖù×ăàÛ×ÅØ¾ñÚăˆŸ;¿½±ëØ߈©Üăº™‰kß [ïSÛ«‚ ½9ĂºƠ×̉½χ‘÷˜‰j̃ZîSăˆŸ;Á‡é/×:ÑÄ뮼å̉ ٽ陉kß [ïSù×Ăȱùá ߈á Óàö’ +‡«Ó“ÆưÀ̃ˆ™‰kß [ïSƒ³Úª‚ +¼9Ù½ñÄ“ƠöÿÛÑÄë¹ÚƯº™‡߈Û×ßÚơê½í—G“÷»Ă߈ùׇºùåªÆ ÚÆ0ÏÄ߈ùê×¾—¾À‡€è/Ö:ƯÙöÁƒ¥‰ÍL…ÍĂăˆŸ;₫ÜÙ׋ÜéÚơê•Ç¿¹¼ÔƠ›¾«ÔçÚÁƯøºíÓ˜‰j̃ZîS´È¡Ăà9¥‡×¹Ö«‡“Íjщơê“Èר“ÜŸ}÷ÁÿÂ߈Ù½·Ô¡ÛºÅØ©‡¥2ßëMƠơ꽋́ö•%ÙÚù×ơêׯ‚ëö9¥‡ÙÚ§û÷Áóø× «»ŸƠñ«ÔăˆŸ˜à™‰kß [ïSå̉ ±»ù×ÛÀ‡₫®¶χ¯È«́£»éº™‰kß [ïS±ßăˆŸÙ½§Ô™‰kß [ïSáĐÄêÓÆ¶ Ѷ߈–Á¡ÈÅá ¹¼߈™ơ߈Ï̉Á×ʇºÇÖơÄ”{Ù×ôÙ½¢Ơ%ù×ù×Åӵث·3uU›¾߈Û«‚ ½9±½½€ÏÚ«·3uUÜ£»ơêƠn‡“/±»£X›¾‡ÚÀƯÚÚ›¾™ëéåÛ«‚ ½9±¿™ĂÛ«‚ ½9Ñæơúº‘ÆơÔ“˜ß¹Û«‚ ½9£ØÖØ »‡߈ÏÔºÛ«‚ ½9ßÖçÚÅÔƒàׯ½ëöăß±»ơĂ«·3uU²º̣›Ơ×¾ëöåÁ×ÜÅØ¿à²Ø÷Áù×ß»ûÁùêáÓñÖ›½«·3uUû(߈ÙƠĂÙ̃ˆ»½Ë̉±»³ºóí꺙‰kß [ïS¿‰¥ÆŽó–›Ú±»ƯÓ ©Ú¥àơêßÚ\Ûºë‹ÛÇëöăơŸÈ¿ÁÙÆ̉щÙÚ‰Û˜‰j̃ZîS9¥‡—¶½è߈ƒˆ¿ºí‡«Ôà ÿ¯¶±»ơê÷Á·§D ׾ߓ÷ˆ‡ÓÜëöă»ăˆŸ;—“ÅÔ±»µØÁËßÚ»›¾«‡“ÍjưÀÓÅ÷Ô“Ç–Á#ưÀ­™‡µ.¥ÙÙ½éÚǺ±»›¾™‰kß [ïSÅØÛº»½™‰kß [ïS™‰kß [ïSăÁï³2·‡‘×8çăˆŸ½9¥‡°»¿‰¡ñ¹ù×ù×ù׫‡“ÍjÛ×áØÙÚÙצÔ1™‰kß [ïS퇃vÛ«‚ ½9ÀƯ›ÚÓÔ‰ƒưÀ±»¹Ú— »ª‡’̀jôê²ϼÓºĂÙơÔ½ØרÏÔß%“È®×ơê·ƯÛ±»Ư«»º¾ׯ¼ă÷Ôǩӽˆ¥ÂÙŒë*«§Øß„½ồÓ‘ ²”§½™‰kß [ïS©Ç8¤‡ù×¹ÚăˆŸ;k¹ÚưÁù×óÇÛºÛ«‚ ½9äê9¥‡“¹Á¦¹Ç»Äô›¾±»ÙŒë*«ç÷Á«ÔÙ«‡“Íj…ÚÛÄÓ½ØÅt†Ç½±»±»ôÄÇÖóÇëÚßùêÍÄÁªÚ³ô8¤‡߈ƯÙ¡Ư»nêö½±»߈‡Û·ÜăˆŸăˆŸ;ËDZ̉ÅÔщ­¡–¾ +»ÔáÚ¹ÚÛ«‚ ½9߈ËÉ9ùׯȇ۱»çm½ÁƯÏÅƯÓ «‡“Íjï²2÷ˆ½ơêèêÙ½ßÁø×ăˆŸ;̉ºÏű»†Œ©Ó£Ñ©Ø̀Ó9¥‡±»Æ£Ó Ëû̃Ú«ä£äăˆŸ«‡“ÍjÓÁƯ©¼ÇØëö”· ºôêÖÔ†6¦j«‡“ÍjïÚ±»¯¾±ÁÎÔÿ¯¶‹ÇËÇ…ô¯¼ỜÏÅƯ‹ÈÏÔÁ ăˆŸ;÷ÁÁ̃¡È߈ù¿íÓÏÔ±»«‡“ÍjÑÓ‰đ÷Áß»ûƠÏÅ¦Æ ù×ñÚ›Y¼ÔÛ«‚ ½9ùש¼Ă١ۀǾ¬È”±¿߈Û«‚ ½9ÏÔ½ăˆŸ;ËÉ9çÆơèÅ߈«‡“ÍjéÙĂÙÓØ™‰kß [ïS߈ëöµØ÷ÁĂÙ«‡“ÍjçÔ¡ñÓ‹ÓăˆŸơèÅ»ƯÙ׃䇮œÁ°¾ÏÔ¥ÈÉ̉Ơï$›¶é“ÆÁƯÙÚÑÓív“ƠƒÚù×±»˜êè侇“ĂÈÅØ™Á‹Ù¾º¯¼ÿ­ÛÄÓï½ĐÄ꽆º̃ÄØ»‹Ÿ}‘ÆÙ̉ÏÄ›¾̣Ç›¾ĺí—GçÚñÓ́Øë×ñÖ½÷å5Ó«d‡¼Ü»ÏÔ›¾ăàÙ½ĂƯÓ é%§Øß»û³‚ÚÑÓ÷ØúĂ‚½ÓºÑÓ9¥‡·‡‘×8çöÔ5÷å5Ó…Ú¥ĂóÇ߈ö›çÓ™‰kß [ïSÅØơÔăˆŸ̉º¥Æñ߇ñ5¯Ơ™‰kß [ïSÖ‰Å₫®¶å̉ Ÿ¿ùêÿ.ăˆŸ;Û×Ơ™‰kß [ïS߈«Ôö½«»‹Ü™ôß´¡Ôơê¡Ûú(«ÔĂÈʹÿÚù×™‰kß [ïS̀ÂñÓÙ½ívơèÅÙ#Û×ÏÔ›¾ưÀ¤È4ƸéÓ߈™‰kß [ïSơÔơêưÀÏÔÙÚÛ«‚ ½9«‡“Íjµ†ÑÓëöùׂˆ“ºÓ¾©‡¥2ßëMáê“ƠëöêöÆ̉´ÁĂưÀ¥ØưÚơÔ÷ÁưÀ½ÔÛ«‚ ½9̃ˆÇÏÂÈÏű»ñÖ•Œß—Ö¾­Ö߈ăˆŸ;±»¥à•ª‡’̀jƒˆ«Û¿»•Œ±»˜êèäµa·‡‘×8çÑŃˆ¢»¿ÅƠ•îăˆŸˆÙ½Ž·Ô¡È«Ú„’‡ï³2Ăº¡Û«Ô™ëéå₫®¶˜‰j̃ZîSéêƯÓ ­Ï¿ÜÏߦƕÿÚ›¾ŸÈß„î½ăˆŸ;kÙÚù×·‡‘×8çÿ×É»ÁóǃvñÓđÇ̉Œ¾á ùæ–Œ¶è˜‰j̃ZîS‹‚öÁÇœ·̉ ¤0ơê½ô—¶ËÁƒvä̉ĂÙ‹ÇỞ¤ÆÏÔƒÓÓƯÓ ›vívơêơéÛ«‚ ½9Úå̉ Ù½ëö‘܃ÖÿÚ¹Ú½ôß»û½êö÷ÙûØÅÓÛ«‚ ½9íÓ¯G‹øÙ½—ŒËƠ‡ñÓæÚ8¤‡×ѶÿØÏ̉™‡ç¥ÿ¯¶Ûׂv¯Û¡Ç«·3uUÏÅơèÅÍƠ§Óơ꿉᰷ÔǺ·Åä½@¿‰ƯÓ ¥ˆ]1¾·‡‘×8ç¿ºăˆŸ;ơĂÓ‡ÍË)éÛ9¥ơèÅĂÅØ—»ăàÛºöÚª‚ +¼9éºÛ«‚ ½9¯ÈÚª‚ +¼9ÁĂ«Û߈ó#ÙÚÍÄ߈¡±»«‡“Íjê¼í–GÏÅ¥ˆ]1½ßÖ߈±¿¯×ƒˆ‹ÓưÀƒ×߈ï½ö´À÷ÁÅØ×Ơ†7§jùׇŒá=ߌÛ,ͼͽ›¾ƒvÙÚíÖ¦Ô%ÏÔÿ§₫®¶ÿÚ §‡íḉv¿›߈ÍÓù×™‰kß [ïS÷ï‰߈ÍË)éÛ9¥™‰kß [ïS‡Ç»Ø¥âƒvĂȱ¿Á×·Ô«‡“Íj«‡“Íj«Ó‡ŒÏÅàÓ±%°¿û(ù׿ô©¼º™‰kß [ïSƒvӧر—¶½Ôƒv߈½é¾óÂ߈º‡“ăˆŸ;‰Ô¿ØËÇëö¿÷ÚỔ›¾ß»ûË̉µØ«‡“Íjÿ¯¶ívỞ©ß9¥‡ÂÙ±»ÏÄ«ÑăˆŸ;±»ÁƯ™‰kß [ïS©‡¥2ßëM߈‡ÇưÀÙÔXÆ߈‰Û…Ô“Ê9¥‡×ùׯșơư“Ơùïщ¿ô9¥‡ª÷µØœä«‡“Íj߈ÇÖ®ÈâàÛ«‚ ½9÷ˆÎ̉ÁË¿öÑÄëëڻŵÁ¡Ôß»û™‰kß [ïS±»ׯ¯×¹¶«‡“ÍjÑ߈ăºïÓ ÷䓯ÿ¯¶ƒˆ§ÔÛט‹߈‹Ç¹ÚªĐÛ«‚ ½9ơꙉkß [ïSư«‡“ÍjÑÓº-÷·¿‰¡ÁÚǽØơêá û÷ƒ×åI¹Úù½ívđÓͺ½¡̃ôêë‡Á½ù׈ơÄ—¶¡ÁưÀơ‡¸ÚùêỞÍÄĂñÆÄØå̃“Ơ›¾ưˆ‘Ú½̃ˆ›¶éÙÚơԭı»ù××$³È±»ơê°¿ùơÙ¾±»ăˆŸưÀù×߈Ù½±»«‡“Íj›Y‰µ¡‰ËÛ«‚ ½9ơºÑ+©Ó­½¼Ơ¾G±»‡Œ±»đÁ¹ÚÑÓïƠù׃éÚù×­‡ơêÜơÚÄ̉ÅÔÛ«‚ ½9»ÓµaµÜơèÅÏÔ²‹Çù×Ïź„ÏÔª‡’̀jĂ éơ¨ÇëöăˆŸ;ơ‡Ûº‚ ߈ĐØ ÏÅ9¥‡Û×߈ï‡߈·´ÏăÁûºß»ûÅÔíÖí걯¼­Ä™ÔưÀ¿Å°»ÇÖ™‰kß [ïS߈‰ß9¥‡±½רù×™‰kß [ïSÉà³Ø—»‡ÚƒvëÓ£»ÄÓ·§D ³à Ô¼Ô¡ÓÆñÚÙÚ퇙‡¡ÈƯÓ ™‰kß [ïSĂƠÿ&ß»û‡ÚơÔëöĐÄêÛ×ç̃ăÔëøơ§Øä̉‚Ö±¿«Ô­ÿ¯¶á™ëéå߈å̉ ƠĹÚÏÔ™ØĐÄêùêñÚ–́·‡‘×8çËÖø×÷ÁÏÅÓˆ•=‘êÚ˜‰j̃ZîSó#ưÀµØ¿Ø¨¼ÅØ¥âóÔíê½€Y©‡¥2ßëMÎÚ¢ä÷‡ƒvơÔíÁƒˆ½€ñÓ߈ßÁêöƒˆ÷ˆăˆŸ;ŸÅ‰»½€ƯÓ ½½¿‰íÖĂÈù×ù×ù×›¡í‡ºÁ=·̃÷Ù±»ÇÎÛº™‡ÏÔ™‰kß [ïSĂ ›‰ăˆŸ;¹Ú9¥‡ÿÚç°™‰kß [ïS…ŒµÈϺÙÚÅÓƒvóÇÙ½›¾™‰kß [ïSçÚ8¤‡×ûÓ¿“ƠÏ̉Ưº—¶ûÁƯáê±»ÙÚÏÔ§¹ƠăơÛ«‚ ½9ñÓ­Äϼ¯Ó§Ó«Ô8¤‡ëö‹Üçôêö·Ôë¹£ơê½¾‡€ø×Úª‚ +¼9ívÎ̉ùטÓù×ÇÖ­Ø«‡“Íjă굆ëö‹ÇÇ̉öăˆŸ;ÔÛ«‚ ½9ơÔÅÓăˆŸ;ϼÁĂÿ$ºƠĹÚđÓ½ư½ùêĂÙÛ«‚ ½9ù×ưÀ«Ô¥ ưÀñÖá «»óº·ÛçÚ9¥‡±»Âß½›¹·̣ƒØ¡ÈºĂءԷ‡‘×8ç¤ÓÏÄ—»¯àÏÅ™ØăˆŸ;k±»›¾­Ä»Ø±»ÙÚÉ™‰kß [ïS³̣¶£Ç¢»±»ׯ›¾±½‰¿I…»ǼYÁƯ…ƠÑĂ¹Ú߈ëöØơêùê߈„Ø©‡¥2ßëMùדÆăˆŸ;•Œ‡ÚßÅÑÓ±»™‰kß [ïSÚª‚ +¼9߈Á©Ó«Ó¹{÷Áø¿ưÀׯ½‡ăˆŸ;k÷ö±»ïô¯ößÄÙơêûØÙÚå̉ ºÿÚÁ̉çô¹ÚÛ«‚ ½9‡Œăêó¶¾»ĂÈç̉°»߈›¶é¡ƠÄØ¡ÁµØ±¿¡ÔÛ«‚ ½9÷Ág×¾߈ù×9¥‡›¡°»âˆ:jÇÁ¹×¼—»£Ø±»ÓØËÖ•Œ¿ô™‰kß [ïSĂÙÏÅ™‡¿àăˆŸ;»‡¬ÖăˆŸ߈ÏÅ¿½ëØ߈ăˆŸ;ÑÄë¾ø×ƒØÛ«‚ ½9¡ÛÛ«‚ ½9ăˆŸ;»Ươêáöùë±Û«‡“Íj¹ÚÛÀÚ¹³ÈƒÖÙ×ơêă–ÅÓ±»‹Üëö·‡‘×8çóÂÉÑĂÑӵ؃¾‘­¾ÏÅÙ×½ôçÚ¹ÚêÖ9¥‡éӣؾØưÀÏÔ°»ñÁ¿‰óï»ÏԱܺÿÂïƠ«‡“Íj†̣·ÈÛ«‚ ½9±»³Äß»û«ºưÀÙÚ«‡“Íj4ëöÍÓÏ̉«‡“Íj߈™‰kß [ïSăˆŸ½$ŸƠ±»ơԇNjӬ֫·3uUív½À½…€­:Ë%÷‡“ÇØÅ +ê +¾ß$é¾ëÚ±»ÍÄÏĵØËß½™‰kß [ïSûƠÏÅơïÈùëÏÔï‡ëÚƒØóǃv½ËÉ9ÙÚÛ×…¼ÇֵعÚëö¯‰¯0™ÍߌÛ,µØ«»×Ă“Çë½€º“ÈÛ«‚ ½9Û«‚ ½9—Á™‡ÙÜ·ÔĂÙ™‰kß [ïS¼»½9¥‡çô½á ù×ÁŒ›¶é¾˜‡Ơ‰yù×÷$•ǯÈđóÇù×ÅØß»ûçm‡ºëöù×ô·‡‘×8çËÇͼíUÚª‚ +¼9ÛׂÚÙ½ƒvêö ÓÔèéßÁ­ˆëö—Ó߈öÁƠÄ8A¤‡AÖăàáêăˆŸËÇ߈™‰kß [ïSív®Gø˹Û×íÆôÓÅơÔíÓÛ«‚ ½9·ÔöÏåóÔá=ÉÁ›¶é½°»½™‰kß [ïS¹̃öóÇ«‡“ÍjÛ«‚ ½9Û«‚ ½9Û«‚ ½9«Ôăºêö±¿ƒÏÔ߈ºßÚ߈ăˆŸ½€ơÔ¥‰ÍL…ûàµØÛ«‚ ½9‹Çµa•&ÇÓÿ×¹Ú¿‰¹Úá «‡“ÍjÿÚÏÔóĂÓØÏÅƯơôơĂÏÔ—¶ÑÓ©‡¥2ßëMÎÅ›¾Å؃vÛ«‚ ½9Ë̉ù×ǻ۫‚ ½9«‡“ÍjöÏÅÏ̉ÏÔ±»î»“Èù×—Ó́ơ ó¡9¥‡×9¥‡‹ÇăˆŸƒ¾‘ÏćÚÙ½Û×ëö±»»‡«Ôêöµ‰í‡߈¡»ưÀù×XñÖ‰ÔÚÔ™‡½ăˆŸ;çڭ؋٫Ô纪 ¶ 2 t T §Ó™×ºÔX‚vÚ‡«‡“Íj¹ÚÛ«‚ ½9±»Û×ÑÓ½Øÿ¼™‰kß [ïSÏÅáö¯ÈÅÓƒˆƒˆ±»ùׇ™‰kß [ïSŸÖ¿‰›¾ÎÅÁ¼ôê¯Èƒ߈­ÄÍË)éÛ9¥‰¿I9¥‡Ă…ô§Ơ߈÷‡ôêØ‡¡ƠÓº›¾ù×Á/¥âçíçϺáƯù¿ÓÓéºÑÓÚÆ»»µØéÚëÖ›·ÔăˆŸ;½ăƠÅØÙ½ù×É̉³¹ƒvûÓ±»Û«‚ ½9ÙƠÛ«‚ ½9ÏêÍÄưÀÏÔÛ«‚ ½9ÊÖŸ}ßÁ™‰kß [ïSņ±»á؉ÛăÁ– +߈Óº«Ú«‡“ÍjÙ×Û«‚ ½9ÑÓɇŸèỊ̈̉q­€ÛÆŸĂơꩼÏÅ÷‡µØ™ÁǼË¿£ë߈Û«‚ ½9ªẩ&‹Ü•Œø¿ +ÚÄ̉‚×ÏÔû(ù¼ó¡԰»Ù½èÚƒ¾‘™‡Ù½¼¯×¾»‡«‡“ÍjµØƒv›¾ÿ×ô©Ó÷‡ûضÔ₫®¶’ơê°½½ƒÔƠ•ŒăˆŸ±ù׬‡ù׽ȓƃ‹ÇöơµaÚª‚ +¼9™‰kß [ïSơº·ÈƠÏÔµØƠÚâ½Æ»½ăˆŸ;kÏÔâÁ«&åÁ«â‡ÇÖËÇÿÚöÔ×¾«‡“Íjăê߈󷇑×8ç¡ÔÁ×Û«‚ ½9˹ù×á̀Û«‚ ½9°»ƯÓ Ơ÷ÔăÁ±»ƠX‹Ç߈•ÿå̉ Û×Ù½ăÁ¡GóÄ¢È ƒv±»ÛÚÏÔÇ ¿ÅÓÍË)éÛ9¥ׯ™‰kß [ïS½Y¸¾ëö«d™‰kß [ïSÙ½߈¹Á߈Ỡơº˜Á…Ø—»Ú¦Û«‚ ½9ëöƒvëöÇĂ•¾¥ÈöÓÅÛ«‚ ½9‡ÇûØøêöß»û¡ÈÍÇÉ󧹳ܾ•ÇæÚëÓ£Ư½¡ÛµØÑÓ·ÔÙ»ëÔ£X́v»Ú×ÁʹƒaÄƯϺ±¿ËÉ9ï»™ÁÁƯăˆŸÍÓĂÆÚª‚ +¼9ÙÚ­Ä™‡ưÀÙ½‚vÀ½ưÀ™‰kß [ïS¡ƠöÍÓÁƯÅØöơêĂÈƠ­Ä•ôö₫)®¶)ĂÙĂÈ̉Ø‹ÜƠËÇÙ½ϼ˜‰ +j +̃ + + + +Z +îS +ăˆŸ;ÅÔư—ØߌÛ,ø¼÷‡ù׃¯¾«‡“Íj‰ÔÁăÿÚíÜù×»yߌÛ,…Ôß»ûỬĂ#ƒÚ…¼÷‡ëöñÓơêͼÏÄơê»ôÛ«‚ ½9ª‡’̀j•Öù×ÙÚ×¾ÏÔâḈÏÅöÁ‰¿I±»́v›¾—¶áêúÖˆ\0™‰kß [ïSÛ«‚ ½9ÁĂóÇÈĂáê·È·ÅưÀÜßÛ¿ºÛ«‚ ½9ĂÙÙ×±»ÎţǓƠ˹ÉĂ÷Á“¹ƯNÅăˆŸ;ƒˆ—¶¶‡Ö8晉kß [ïS«‡“ÍjÛ«‚ ½9ÊƠÏÔ‰¿Iß»ûăˆŸ;ウȡԷ‡‘×8çơÔ…ă߈Ă­ØÛº³ÈËÇ«‡“Íjâˆ:ĂÀùê߈ÑÓ9¥‡»—ÓíÖ©‡¥2ßëMưÀÛÄÓ‡Œ±‡éÙöø× ÙÜñÓơêƠX²¾9¥‡ÏÔăˆŸ;í‡8¤‡Ö“º͇Ù½°»©Ød¼…ÛéJé‰Ó5“gesÁÅÏÔ™‡$Ù´å̉ ¹Ú‹Ç·Å%“½Ơ#Û«‚ ½9÷Á€Ç +ƒÔïÏÛ«‚ ½9·Ô߈ù¼÷ÚùÚÍ­H…ÂÂÙ÷‡½ÀĂÛ×±»•Œ»Ú¿ºÇÖ߈ÙÚá ‡™±»Öº“ŸÁ‡é/×:Ë̉ë$éڛÀ½ƒv•Ï̉ĂºỞ›çIÛ™ºy÷߈ÏԃƵÉÔÙ½­v߈ͼÅØÛ«‚ ½9©Óå̉ ÙÚä̉ơÔá߈†׭։ØăˆŸ;ù¿‡Ú±»ù¿ÿ¯¶ƒv·ÅÙ€·Ó ¥0“È߈ûù¿ÂÙ¹ÚÙƠ«Úå̉ ùê¥ÓÛ«‚ ½9ëö“»ôơÔä¼ù×–ÓƠצĂÙùêçÚÛ×ׯưÀáÛ¿àÛ«‚ ½9ϺÇ̉Ùڋǽ÷˜»ØÛơÛ«‚ ½9·Å߈Ë̉¤½á ØÚ·‡‘×8ç¡ÁÍÓù×›Úù׳ºÏÔµaÍÓÁ¼˜‰j̃ZîS®Ơóç̉ÁƯµØ›Ú¶ÏÅùëÛ«‚ ½9߈Ă½€µØ±»₫®¶ù×Ơ×ÜÈ̉½ëöï½ñÓËÉ9Úª‚ +¼9ÉĂƒvƒḯ߈­€üÀ°»ăˆŸ;© ¹ÛÙÜôꘉj̃ZîS¯È߈åÁ‡Œ‡Çơêáêù×ÙÚÖÆÅØËÇ™ÁÏÅ׺Ó̉ưÀưÙ±»ù×ÍÓçÚÍ­H§Ô₫Ç9¥‡ÓºăˆŸ;ăˆŸ;©ÓºÇâ±½ÙÚÔ¾FµaưÀùêÅ–½—¶º¹Ú÷‡™‰kß [ïSöÍÓăˆŸ¾8¤‡ûÓ™Ô¿‰%ÓºûØ̀ÓĂÙỞ³1Û«‚ ½9ĂÖ̃»ú±»ÓÓÅô³ºó†Ç߈ÙÚôê ÙŒë*«‡º†xù×Ë̉ÙרŒê*ªưÀ—¶ËŽÇÖ“̃ñÚ•ŒÅةǓÈÛ«‚ ½9Îű»Ơ9¥‡À¹ĂĂÙ½±»¹ÚÏÔîÀÏÅăˆŸßÅ߈÷Á́D–Gä¡́ï½—ˆóǾ߇€±»Û«‚ ½9Ơ§¹¶ù×߈Ù̉óÇăˆŸ;§Ô½ïƠ«ÔëÏÔ¸ÚÁƯ¥È’Ç ù×ñÚµØǼµØÛ«‚ ½9ÉÛ—qÏÔçÚơÔăÁÛÇëö·ÔçôÏÅ·‡‘×8çăÚÏÔº‡ñ5ß½óÔ9¥‡×ïáù¿¼ë¬ô +߈‹‘±»ÿ¯¶Û«‚ ½9ÿ́‡x“Ơ¯¾·Ø¡Áׯ¾ªÁƯƒØª‡’̀jëÚçô±‡ª»̀m¬HmÁ̉Ú×ôĂ߈¯G‹øÆ±»©&ô߈½Á̉Î̉Üù¾¹Ú“ÆƯÓ ôúĂ…Œ«Ôä̉  é×ÇÖå̉ ™ÓÙ½¹ÚÆéºÛ«‚ ½9ÏÔÍÓ—»ÏÔăˆŸ;ÓºÑÛYăˆŸà µ¶‡ÿÂíÙ°»ψ™‰kß [ïSăˆŸ­½¼£äù×ËÉ9¡Ó‰yÑÄëÛ‡Ă߈·«ÈøæăˆŸ;k³z±»§Ô¾¿́‡öÁ©‡¥2ßëM¹Úăñå¿Äôï½ÍÄ¾ß +ÿ¯¶¡ƠăˆŸ;«»ר°»ÇÖù׺Ù-ơêÏÅ…»ù×ëöûØÓ™‡ͼ—˜«‡“Íj»nù×…ö˜‡ĂŸù¿ÇÖëöÏÔ‡Œëöçº߈ÏרºƠ'í|«bçÚÛ«‚ ½9¹óù×±ÁÏÔ½ÔÓØ‡Œëöí‡ßÑ·ËÇùëßÖÅÄ—ˆÛº߈‘ÆÙŒë*«íơơêívù×Û«‚ ½9ר™‡·Ú߈Û«‚ ½9£‡ô¼ «‡“Íj‰;§ÔăˆŸ;ơ꽡œăà·Ô™‡…́£Ç™‰kß [ïSÁ‡é/×:ùºÿ&Ơ´›¾Û«‚ ½9É̉ö²›ƒ×¨‡¤2€̃êLĂĂÙ˜‰j̃ZîSỞ«%³Èï³2£äéȪ»ëöä̉ÿÚù×¾»Ø­ÄëöóƒÖÿÚ™ëé庙ÔÓÅ™‰kß [ïS½«‡“Íj¯¾™‰kß [ïSºô—Œ¡%º÷‡ÿ¯¶ƒ×ƒˆƒv±»ăˆŸ;ß»ûöª́߈¯ÈĂôçÚÿ¯¶ÚÀö§Øï½«‡“Íj߈—ÁÙ̉ÍÓ«‡“ÍjÈ̉ ԰êØÏÔÑÓ8¤‡×÷¼Û«‚ ½99¥‡«Ñ©Ç¿ù¦™Óÿ$¼ƒÔ†×éºùêï‡Û«‚ ½9₫Á½߈ăˆŸ;߈ÏÄ@ßÄÙàÀéêơÔ«ÔÏÔÏÔƒvé‰ñ5ñ·å¿߈ÛÄÓ«‡“ÍjÙ½†wø×߈ßÖ±»ÙÚóù×–¾̉Ù‰ƠÎÔèêÏÔ¯¾ûÁ̉§Ôù×éÓÏÍË)éÛ9¥ñÓÅ£»Ơ¥Û³ÑÓ«‡“Íj÷ÁÍÓ«»½å̉ éƒvûÓ‚£ä›¹g½È§Óëçºíváê‘÷ơêÏ̉ÓØƒvººÔáÛùחӣ఻Œâ»ƯÓ ¥Ç­¾ƒˆ±»× ™ô±»©ÓÙ›Ù½âˆÛ×±)µÄÿ¯¶ơÔŒ‡Ú߈ÍË)éÛ9¥™‰kß [ïSÅàăơ‚ù×›¾éơÄ™‡Ù½ÓµØå̉ ûƠ›¶é§ÔơÄơÔëÚ·ÜĂÙ±»ó¯qĂôËà‡ö´%½›¾…–½ÂÙÓŧÓÏív­Ô‹Üù×»Ô½ö½óÇăˆŸ;âˆ:kơèÅÙ½™Óív·Ô…&Û«‚ ½9Ц™ÁÈÿ¯¶˜ô¤à³(Éơ©¼›¾ƒÅôÛ«‚ ½9·ÅÑÓÙÚëö«‡“ÍjÑÓơl»Å¶˱ÎÔæÚ›ÚÙÚÓ¼™Ó¹Ú‹Ù«Ô÷‡¡ÔăˆŸ;ăˆŸà¤<Ÿ}ŸIù×çÚ߈Ë̉®Û—¾êö¼È˜‰j̃ZîSß»ûÂÖ—¶±»ˆÛ«‚ ½9‡ưÀùơùê±»åĂ÷ªÈéºĂÙơèÅß»ûǺ»½Ïůి$ÑĂÙÚÍĸ׫‡“ÍjóÇÛ«‚ ½9Ù½·̣Ù½˜êèäƠ'áÓăˆŸ;™‰kß [ïS«‡“ÍjÿÚÏÔưÀ©‡¥2ßëMÛ«‚ ½9µØÿ„êö â꓃vÿÚ·‡‘×8ç9¥‡³Á½˹ºÁÍÄ“½Â½€߈¾º ‹½¥º‹Çß„̀Ó«ÔŸ}±¿öĐĂÛÀ½½Û«‚ ½9§-₫¹¼ÆÅ‹Ç¹Ú¹àÏÔÛ«‚ ½9Ó̉ÂƠƠ¾GÆ ¿‰ Ç«‡“Íjù×½è¾̉ˆ”=¹Úƒ¾‘“óÓØàê»ƯđNíÖăˆŸù׃v•Èû›ö™‰kß [ïSơÔ±»›¾ÏÔ¹Ú±»Ü©À#ö±»8¤‡½±»ñÚƠñÚÏ̉å̉ ù×­ÄÓ ‹›æ߈ăˆŸ;ñÖƯÓ ÛÚ«Ô8¤‡™Á ËûÛ«‚ ½9ôêăˆŸж‚vÁé‰ñ5ñ·χ™Ô±»Çøăે“ÍjƒÔÍÓ›¾¶Å·‡‘×8çÍBÏԽșÁ›‡²Ø¾Åù×ÓÅ–À‡€è/Ö:‹Ç¾©&öÓºăÇíÖ¾ñÁ¹ÇÍË)éÛ9¥™‰kß [ïS…ŒÛÚç*ù׃×ơÔ¡ÔơÔÑĂ«Ô½•Âù×¹Ú÷‡ÂµØÁ‡é/×:ưÀù×½†ŒÍÓŸƠ¯G‹øÛ«‚ ½9³µaÙàź›v†º©Ó©ÓéºÏ̉ÏÔ߈–»÷Áưïëöù‰×Ơ†7§j›Úï̉‰»ƒvăˆŸ;ëö½–ˆù×ÿÛéÓß»ûëöĂƒvÓØÅÓéÓ“Æ™‡˜ÈöÀƯ·‡‘×8çºƠӯ׾½ÎÅ ÅØ©ˆ«Ô¯È¿(Ï̉•¾ùô‡Œ™‰kß [ïSùëûÖÏÔÛ«‚ ½9ŸÈÛ«‚ ½9ùơ—»ÑĂߌÛ,±»ù×½ïÅ—ˆëö—¶‹¿É¦º‘ÆĂ¼Û«‚ ½9½€߈ù×ͽ߄潎½»ôÏÄưÀ߈ÅÔÿ¯¶å̉ ¹¼±»ÏÔ·‡‘×8罘‰j̃ZîSëö¥Ö«‡“Íj±¿«Ô­Ä‹È·‡‘×8çÿ×ÿ§½Û«‚ ½9½¿ƒvĐÄê܋Ƿ¸ÙדºßÁ›¾ÿ¯¶ÙÚ9¥‡ÓºñÚÅ“¹ƯN³Â±»ÄÄÙÚ±»ÀĂ0‰Á§ÔØÓÅư“ÍÑÓ ưŒøê÷‡½—»íơ¶ÍÓÏÅÍƠÇÓ«‡“ÍjĂ¼öå̉ ±»½™‡ù×ĂĂÙø×°»é‰ñ5ñ·ƒ…‹Ç̃½›¾ÙÂÙ¯¼ùסÁÛ«‚ ½9êöù×ư“½³:‹ÙÏÅÙ½ư“ÿẬģعÚöŸâ·‡‘×8çăˆŸ;k°»3Û«‚ ½9çڱصƠËǽëö߈‡Ç¡Óëöøô«äÛ×¼Úª‚ +¼9§Ø“Æ©‡¥2ßëM߈ƒˆ¾߈ƒ×¼€—¶¡ÁĂ¼Ϻ—Øëö§Ô߈Ûº˜‰j̃ZîSÍÓÁ ߈ùêÚª‚ +¼9éºÇ̉™‰kß [ïS¡ÔٽٽÛ×ăˆŸÀ½ «ÿÚ™‰kß [ïSƠÏÔñÆăÔ«‡“Íj™‰kß [ïSÏÅÍË)éÛ9¥ăˆŸ¡¾ơê­ăˆŸ;ñÖ©‡¥2ßëMỞÏÅIăˆŸ;ÙŒë*«ăˆŸ;Ï̉Å–Ơ‹Ú×›¡ÑÄëÇÖ™Ó‡ÇăˆŸƒv߈9¥‡˹§Óû̉ùêß»û«‡“ÍjƠºm›¶éÚêËÉ9›¶é߈íÁëơĂÙ“æÔó۵ط̃åƠûÙÛ«‚ ½9·Ôù×½ëûƠ‘ÆÅÈŽăˆŸá=á ‹È¾ßÁÏÔµØ̣Ç—§Í»ëö§ÔͼÅôà=Û«‚ ½9}«‡“Íj½ô¹Úívá œÂ Ơ½Ù½ÏÅƯºù×đÖĂ˜‡ “ºG½¹ƒ«‡“Íj±»÷ơ¿ÅĂºÖ¾ƒv·ÔÍĂÙÚ½€¼߈Û×”ºå×ĂÙ߈ù×ơÔ‘́Û«‚ ½9“ÆÑÓ‚½ÍÄé‡ưå¿«‡“Íj‡Ç÷Á¡ÁÏ̉›¶éù×±»ßÖ°»ŸØăˆŸ;ׯ×Ü›¾›¾íêÏÔ´'¡@€¯È³ °»½¹½›¾Ù½ùåÁƯăˆŸ;ăàç*º˜‡Ûº™‰kß [ïSùêívåô™‰kß [ïS“º³zƒà¡Û߈Û«‚ ½9½–¶™‹¡Áø×Ơăâ8¤‡™Ó©Ç§È̃ˆÏÅœ·̉ ¤0¿ôçÚµ‰«‡“ÍjÏÔ™ÓçÚ›¾Úª‚ +¼9§Ó±»ÑÓψ‹Ç’Ở¸Ú±»ù׸ÚÁ̉˜×µØ›¾̃ˆÿ§8¤‡×«dƼ›¹ÿÚ™‰kß [ïSÛ«‚ ½9ơÔöƒÖưÀËÇͼÇØƒv߈™‰kß [ïS›¾…ŒăˆŸ;£ ߈–ÍÓÏ̉ÏÔ߈«»ÍÄ̉̉-߈󛾿ôµØ¡Á–ˆ ÛÔÿ¯¶߈འ—¶¡Ôׯ·‡‘×8çÚª‚ +¼9îôï²2™‰kß [ïSûƠóÂ߈ÙÜÏÅ“¿¹ºôëö÷Á¿ß±ưÀĂ —»Ă9¥‡×χ±‡¹ÁŽó×߈™‰kß [ïSưÀ§Ô߈Ù½…ÚÙŒë*«½ÿÚº£ù×ñÓóÂưÀÛśۗºƒvư‡±ù1êö‡Û€Ä¡%́‡¿‰ÿ¯¶ËØÜ”Ë̉ăˆŸ;ÏÔù×9¥‡·‡‘×8çăà¶Á½ºåÓ«‡“ÍjăˆŸ;¿‰‘Ë̉ƒàô©À¿ûØ™‰kß [ïS«‡“ÍjÅ9¥‡ÿ¯¶÷Áÿ$±»¡ƯçôÏÅăˆŸßfẳ߈ăˆŸÀơƒv×Ü—¶¬Ö‹Çƒˆçºù†ôêÛÇÄÓƒˆÙÚí¹Ûº™‰kß [ïS½ôºYĂÙ₫®¶±ÍƠµ‰øơƒv÷ÁÛÀÁÁ¹‡ºÙÓ«»Áẵ„ª»߈ƒṿ«‡“Íj߈³̃°»‡ØëÓɰщ™‡Û׃våƠÏỖˆÁ×ëö。ÁăˆŸÏÔ“Æ߈‹ÇëỞăÛÁ̉麭֖½ ù×½­Äơê«»Á½¸Ú£Ø¡Á9¥‡Ù½©Óô‡º×Ơ±»—»߈‡“ÓÁƯûÓÑĂ–¶ÏÔ¡ÈÏÅ¿±»ؽºÙÚàĂºyăà×ưÀ­Öɇº¡ƯưܓƇÊÁ çô߈Ó̉ëö½Áƺ»Ø¥Ö‡Ú«Ô9¥‡߈ă½ÿ'ô߈Û×8¤‡ÖŸ\ÁỮv‰¿I߈ù×Ú×›¾îº£Ô߈±»ÎÅăˆŸ;ƠXơÔÛ«‚ ½9ù×ÑÄëÛÀù ôÑØÚÇ™‰kß [ïSƠÄ麰»›¾ƒơù꤉̀L„·§D ²Èív‹Ù餇ÇÎÅ ßÏË̉±á¾Óù׫‡“ÍjơĂÖ¹ ¬Ø“¼¯₫ù׃v‡Œ‡¦Ó—ĂëöƠ´…à€ööÛט‰j̃ZîS¥ÆÁƯ©ÓơêÛº«‡“ÍjŸÈù×ívªÚëöĂÙå̉ ÷Á©ÓƯëö©Ơ¥ˆ]1á•'óÔ·Ôôù×߈ÏÅÙŒë*«ù×™‰kß [ïS½“Û«Ô¸­ôĂÙ¯¼ĂÙµ†ßÚù׫ä’r†Œ + + +ÑÓÅọ̈Ç‹Ç‡Ç·Ó ¥0…¼ăàÙ½ăˆŸ;ÅØ±»ÔưÀ°ÁÛ«‚ ½9ù×­Ä™ëéåÙ̉éÚ9¥‡›ƠÅÙÏÔ¹ÚâÁ9¥‡×«‡“Íj½ÙÚöëö9¥‡ñÚÛ«‚ ½9ÍÓËÉ9ù×߈å»ÏÔÓ¼±»ÍÓ­ÄÁƯù×ßÄÙ°»Á¼Çóø×Ó¼£ÓœËÉ9ƯÚ±»µØÛ«‚ ½9ßÄÙÙ½¥ˆ]1ơ»Ÿ}Ñ·…ÛívöÚÜ™‰kß [ïS†xơê¿Ø«‡“Íj°»½€ù×ÁĂ›¾ááÆØùôăˆŸ;ÏÙŒë*«ÏÔó™‰kß [ïSÏÔÅôÏÚ¶ + +«‡“Íj«‡“ÍjŸÅơÔ•ŒăˆŸ;k©Ơá¼ëöăˆŸ;—»™‰kß [ïS±¿éêăˆŸ;kơÔƠ×Ù×à ¡ƠéÓ虉kß [ïSûØƠù×û™‰kß [ïSĂ٨ǹà¹ÚѶÛ½Ù½ÿÂÔ@ÅÓ퇃ˆëôê¼Ø¿àÛÑÛ«‚ ½9§ÔỞ°»¯ÅÄ‹Åù×ܷŶÿÛ±½ˆÚƯÚ‰¿I™Ûù×§Ơ“Ï̉™‰kß [ïS¿À¹Ú½€ß»û¾¶è÷Úăƒ×§ôĂăÁÛˆ¿º¿‰ÓºăñÓ±»§ôñÆÓÙơê×¾ĂÙ™‰kß [ïS·Å̀Ó±»ưÀƯ¾ÛƠ‹Üù¼ăˆŸ‡ŒĂ¼©Øü‡°ø1߈‰ƠÏÅÙÚ»»µØăˆŸ;¥ØÁƯ±»߈Ù̉¤,ăàØ…ÿÚựƒ½ÎÅ‚¾9¥‡ưÀçÔ¡©â­Ä»ÙƠơêçô9¥‡½ô§ô‹Ç¹Úϼ¯×“Ơ©ÓêϹ̃ˆéêéÛƯÓ ÿ¯¶ÙÓëöƒ¾‘߈Û«‚ ½9À‡€è/Ö:»ˆY¿º9¥‡×ÙÚÅÓ±»ưÚçôŸÖñÚñÓ›¾óÔÏŇº¨vµÏÏÅÙ½“™‡‘Úß»û½€ÑÓ™‰kß [ïS‹ÇÏ̉ÑÓưÀù׋LJnàº߈ÂÙ‹Ç­v¨‡¤2€̃êLÅà°»éÚÚª‚ +¼9æº9¥‡Ûº‹Üù+߈ó»ô™‡Ưˆùơ׿8ơ$¿ôƒvƒÖ—¶åð»ơØơèű»í‡ù×9¥‡ÇĂÁĂæƠ0˜‰j̃ZîSÙ½Ơ½¢ä߈£´ÑØÛ™­™Ô—¶Úª‚ +¼9ºÁ·‘Ù½øæ«Ô…»ª‡’̀j™Ó•ÛăàÓØ½Ơ¾G«ÔỞ½Û«‚ ½9±¿щ¡Ûù×Ïű»ÄØ¡öíê9¥‡‹Ç›‡ăˆŸ;kçô«dăˆŸÜÓ «»ùשÛEëöÿ¯¶߈ÏÔëö³ ë̉ù×ÑÓƠÁÙ̉ƒv¿»ÏÅ»ØùסÔăˆŸÛ«‚ ½9éçÖù׃vŸÈÑÄëË¿¹̃éÓÉ̉µØưÀíꛡ۫‚ ½9ÍƠÛº±¿äô߈ä̉¨¼ƠÇÜï²2ù딺ܠǷԫÚăˆŸ;÷ÁĂÈÏ̉™‰kß [ïSÏÔ™ôÙY¿±ÍÓíÖåơơꇿ–¾÷ÁŸ}™‰kß [ïS™‡Á¡Ô›¾ù×ô×ÜË֩DZ¿çÔ¡߈󼔼 ¡»ÙÚưÀ­È™‰kß [ïSƒ¬Ö›¶éÙÏÅ½ăˆŸëö‡ŒüÀ‚ØăôöÛ«‚ ½9›¾ëö”Çg…Ô™‰kß [ïSŸØ•×âÁ½ÿ¯¶ÇÖÏÅî½ÏÅ©ˆ±»ÈĂ ĂÙÑÓá רăˆŸÏÔ˜‰j̃ZîS«ÔâÁØ-‡́Ë̉ůÏÑÓö߈½̃½€ë$ÏÔª¶2tT›¾Ưù×®Gø·ÔƠXơÔÛ«‚ ½9Úª‚ +¼9߈ûØÛº9¥‡ù×ÔÏŧÈó·ԓȵØĐ¯ơê±Á“¹ƯNăˆŸ©ØăơÅçÚ±»óÔÅÓ±»߈߈µØ™‰kß [ïSÙÚñÙ˜‰j̃ZîS±đ¿ØñÓăàËÉ9«¼¿»ÍƠ‹Üÿ¯¶ç̉ÍÄùꣻÏÔÛ«‚ ½9óÂƠX¥ˆ]1ÑÓÿ¯¶Íº±»á=8 ¤‡ Öƒvƒv퇔ÇăˆŸ;ưÜͼ©ŒÓº°»™ơơ껇ÏÔ罫‡“ÍjÙ××Ơ¯Ô›·ÔơêÏÔ±Ô»ôÏå…ØÁƯª¼ËÈ9±éëö߈ơèÅ߈ᙇщơèÅ™‰kß [ïSăˆŸ;«‡“Íjщ¯È”Ñ“ºá¹ ‡Ç¾ƯÚ°»ù×ù¿á ³9¥‡ɇ“ÆÛÄÓÛ«‚ ½9ÁÓÙÅ르çÚª‚ +¼9™‰kß [ïS«d™‡߈˜Á߈¿¹Ú½ÉÛ«‚ ½9G½¹ï»ç̉ĂÙ€Ơ©ỜÊ)èÛ8¤ï»ÅØÎ̉—¾Ûºß„›¾Û×—Ó…÷Áƒv±»‡Û½ÓûÏÔ™ÔÜơù×Ê^éóÂóÂÍÓ‰¿IªÔÛ¾Û«‚ ½9ÿ§ÅØ•»“›vƠ¼ăˆŸ¯È÷Á«ôÿÚăˆŸëö°»ßƯÏÅëöù׋ܛ¾¸àÚª‚ +¼9ù¿ơÙÛ«‚ ½9Á¼™‰kß [ïS±»Â½ ߈¼«‡“ÍjÛ«‚ ½9ËÖ›¾́ơĂÏÔö˹ĂÙ±1™‡½­ÄÖ¹«ÔÏÅ—¾Ù×™‰kß [ïSµØÿ¼Û«‚ ½9ƒØƒv¼Ơ«Ô¡Á™‰kß [ïS›¾±»„Øëö…»½ưˆƒ½µØ“ÈÏÅ£ÔÏİ»¡ÛÉ̉ÄÄưÜñÚÛ«‚ ½9É»¾º°»ÿÚÛôÛÇĂÙËƠÇÓ±»ƒvưÀÓÔI©¼§Ô÷ˆ»ó±»ÏÔ­Öđ»߈ö±»˜‰j̃ZîS»½ëö¡ñÚÑÓÿÚáÛ§ÓơéÍĹÚĂÙ¦Ô‹ßÏÔ­ÄÑÓÜÏÔƠ¾G³ôß»ûƯº³Ø™‰kß [ïSÑØăˆŸ÷ÁĂ¼9¥‡Ù½ÁƯÛ«‚ ½9Ể­ÄÏÔ™ÁơꃈÛÀÙÚÙÚÏÔöÿ‡ï½éÓ™‰kß [ïSÙ½¸Ú«ÓÔĽÙÚÙ܆ö“öÁ™‰kß [ïSÙ·Øå̉ ¾ßÛ«‚ ½9ËÉ9߈âḈá=ỞơÔ—ÓØ“éơê·‡‘×8çơêî»áÜ·‡‘×8çù¿Û«‚ ½9™Øù×±¿Û«‚ ½9¡ÈÁÓÅԵؙ‰kß [ïS߈¤Ø¿Å‘÷§Ôƒ¾‘¹Ú÷Á½ô¡È“ƠïºưÀźÛ«‚ ½9±»ÑÄë”'ơñÓÏÔăˆŸ;kùăÛ«‚ ½9·‡‘×8çƯÔ9¥‡ñÚăˆŸâ¶ÅÚ•Ü™ÓĂÙÅÔ‚v߈–ˆ8 ¤‡ °»ơêÛˆÏÅơô©Ø“Ơ9¥‡ÏÔÿ½°»ÏÅÿÚ˜‰j̃ZîS©ÓùבƽÜç̉ñƯÈ÷4·‡‘×8çù׃૷3uU₫ÇóÔĐÄêëÔ¿º½߈½«d›¾¿ƯÁ™ÏÔưê%í‡÷½Úª‚ +¼9¡Ç™‰kß [ïSÅØ™‰kß [ïSù×ר¡ÔƠXÛÀ¯×ÅÔÏ̉ôáꘇă»ÁÚ×ÿ¼³ºóñÓ¹ÚàêÛ×…»Ù½“ºÑæ÷ÁäÁ ·Åÿ¯¶ĐÄê·‡‘×8ç¿Å½÷«‡“ÍjơÔưÀíơă¿ô™Á«d÷‡߈¯‡Û«‚ ½9ơꘉj̃ZîS‘ÔÅ™‰kß [ïS·‡‘×8ç•×ﻘêèäî½Ïԇ׉¿IÙÜ•ù׺y₫ÏÔăˆŸ¥vçÚưÀùê·ØÏīԾ¹xĂơÔ‡ëöÓ¾Ơù×ÛÆĂÙÚ¿ôñÆ߈³å±»÷å5Ó¡h«Ô«‡“Íj÷‡Ù½’ÇƠ‰¿IÔX»ɇ߈߈›¾±»‡™‰kß [ïS›·ÔºyçÚ©À™ëéåϼ™‡«‡“Íj/³™ôëö–¦̀»‹ÇăêßڣǷ‰ÄÓÚ×Û×ăê߈±»³ÂѶáê›¶éÓ¾«ÚñÖ©ÓÛºÑÄëóÇÏÔÙ½«‡“Íjăº³nöÏăˆŸÛÛôëö‘ñ§ôơÔÅØ̃ˆ—ˆ½€½ÇÛƯÁÆ»«ÔËÉ9Ưºˆ9¥‡×ăˆŸ;kåꩼ´†‚°»™Ô±»ÏÅ߈ÏǺÁôÛ×ïƠ÷ˆÁ×ăơ«‡“ÍjÏÔ™ëéå¶Í“íêơ»™‡÷‡½ÔŶ-±»ÿ×™ÁÙ½¡Ù©¼ơ꛾—Ó˜‡í—G»£™‰kß [ïS₫'®¶'µØ¿ØµØ—º÷ÁÊÅÓ“‹¼ÙÑÄëÙÅëÛ«‚ ½9ßÚ÷¶ÏÅÙ×̉½®GøÙÅëµƠÛ«‚ ½9ÁƯ½€đÁ÷‡¡ÈÙÚ½€ôËÇåê·Ó ¥0û(½€ÓÅ›¶éà=ØŒê*ªÛ«‚ ½9à íÖ±»Û«‚ ½9÷ÁăˆŸù×ÛÔÍäÛ«‚ ½9Ươ½™ëéå÷Áר×ܨ¼˱½ÛºÁ̉ăơØ×ù×™‰kß [ïSﻃÖÑÄë±»ƯƠ©¼ׯ‡ŒÏ̉Ū¼!‡xÏÔ8¤‡×¯ÈÿÚçÚñÆÚª‚ +¼9á Ở9¥‡×­Ä“ƠÆ—»Ó—Ó±½…ë̃‡ÛÛ«‚ ½9›‡·ÛñÖ£ơÙ½«‡“Íj×ÁÆ»§kåÁ™‰kß [ïSÁƯ©ÇÛÄÓ±¿µØÅÀ±»çô麪»ׯÓÓưÀºùàăű»“¹ƯNéÚ™‡³¹™‰kß [ïSÏų«‡“Íj±»âº™‡ŽÔơ߈æ$·Ô™Ă¡ÈÙ×÷‡ßÄÙÙׇŒơèų‹Çơê«·3uUñÓ‹ëÙ½»Å«Ô±¿ĂÙ½ä̉…»¿ºÄƺ™Á¿ØÁĂëöÅÔơÄ¿ØÏÔçôơê߈ƒvá £ÇóÄÑÄë匿Nˆ‡ä߈û(÷‡˜‡¥ˆ]1×Ë̉¿ĂÏÔÏÅ›¶éëöĂ¼Û«‚ ½9¿Øá=ÇØÍË)éÛ9¥áØÔỞ½¢ÇĐæ̀ÓŸÿ‚văે“Íj±¿Ù½ƠÓ±»ăˆŸ;ÏŃñÓ¼è­ÄÚÆăơçÚ¡Ôơê¡ÛßÖĂ$©•ù‡ÀĂ¼ăˆŸ;«‡“Íj‹Ç»߈àØÛ«‚ ½9ĂÙ½¾‡¡È˜Ôæ'ỞÏÔ§½ïÁơÔâù¿­Ư¿‰­Ö¹Ú—vÙ½Ó ‹›æëå Ơ·ÈÇ"ËÖÁ‡é/×:¹Á̃ˆ¹Ú±½ôêơ‡°»«‡“Íjü̉9¥‡ÁĂĽæºÏÅ9¥‡¥â™‰kß [ïSîD ÚºœÜ«‡“ÍjÛ«‚ ½9ÁƯÙ×߈¥ˆ]1ó‡ÛỞó¶Á±»‡ŒƒˆÅÓÂÙ›¾¿˹öÙéÏ̉Û«‚ ½9Û×ßÖ™ëé噇íÜÓ%ŒºëÔƒvëö·‡‘×8ç“ÈÅ̀ÇÏÔ™‰kß [ïSÖô ¹Úăཀëöº߈—¾ĂÚª‚ +¼9ëöÍǫڷ‡‘×8çºö±¾ׯß„шÑÄ뫇“ÍjưÓƯˆ±»¡Ô™‰kß [ïSÇÉĂûØ›¾óÄÏÅË̉ơê»$—¶™‰kß [ïSăˆŸ;±»߈éÓơ»ùº«Ñ·‡‘×8çƒ7«ª¾­ÔûÓ±»‹ÈÏÔ™‰kß [ïS»Ă°»„(“Ơ“ºíÖ߈å̉ ¬‡ +̀Ó¿»₫®¶‡ŒÁ‚ñÓ«‡“Íj¬ÅÉĂ¡ÈÑÇ¥ÛÓ¡ÏÔơê·Ó ¥0ÏÔÏÅ—»шéê½ß»ûüÚª‡’̀jăơî¶ÅÄÍǽ±º­ÄÇÖéº߈ÎÔÇÊÓÅàªÚ¡Û²°»ÑÓ߈¹ÚÓÅß»ûÛ«‚ ½9ƒvù×—ŒÛ«‚ ½9ǽß»û߈±»°»ă»ù×ÎÅĂÈ‹ÇÁƯ½Ă ù×±»³ÂÊÇ™‡›¾ï‡Á¹ÁĂù×Ûºù×Ù½߈›¾ç̉ö¦º©‡¥2ßëMÂٷذ»ơꙇÅÓ£ÇùêáêöóÂ߈ĂÙÏÔ±Ưø©±ר½Û«‚ ½9ĂÙÛ×ư‡±ù1¡Á§‡™‰kß [ïSƒˆ¥ƯÛ«‚ ½9÷„»ÏÄŸÈ›¶éÛ«‚ ½9Ú»öµØƠơÔçÚ¡Ơ÷Á Ơ&Ï̉ĐÄê“Æ×ÓívÏÔà=…»ĂăˆŸÿÚ›¶éå‹ר߈ĂÙ£¨ư²ëÖ½¾‡½€Í嘇ßѽ«Ô½̃ÄØÉ̉Á¹£Ç¹Ú¼ ƠMΦÈFÿ¼Á¹ăà÷Ô¶ß»ûÑÓ¶‡Ö8æƒvÂÙ·Ô§ôÛ«‚ ½9ù×߈ư¿߈Ù½«Ôÿ¯¶û¼ÏÔùë¾ÀÓ­ÄÄ–±»«Ô߈åôÅØ«·ÑÓÖö‘±«‡“Íj߈‡Çۺ˒“Ʊ»Ù½·Å׿8Û«‚ ½9ăˆŸ;«‡“Íj“ÆăܹÚĂ½ÈăˆŸ;k÷Á÷ÁƠXÁƯSÓeù×›ĂùשÓơ$›¶éÙÚÓÔ·‡‘×8çµÛÏÅĂ™Á׺™‡ߌùê±»çUưÀÅù׋ȟ¹©Ø±»ù×Ûü߈ƒ—Å–·ưĂ­Ø߈Û½Óºù×§¹ëöƯ‰щÙÚƠơê­Ô¶³ è³ ‹Ç‡Û•܇º¿Ø߈ơÅóÇ«»ÏÔ©‡¥2ßëMưÀ®×ƒèéÛ¾ÿ¯¶å׎™Ó½̀Ê)èÛ8¤±»ÑÓßÄÙơÄ߈±»ËÛºßÁĂđ߈Ï̉ó#«ÔÙ½߈ÿ¯¶È ÙÚưˆÓØóÇ ÊûÁĂ‰Æ£‡‡ñ5µØùë©Ó±»ßç®Ơ ̣ÏÄÚª‚ +¼9ëöªÚæÚ§ÔºăˆŸ;ÏÔ‡¿9¥‡×¥Øëö«Ôå̉ ăˆŸ™ô½ĂǼ»ŸóÇÙ½Öƒ×ÓÁă»¹Ú·‡‘×8çĐĂ«‡“Íj‰ø×ëöóÔ˜ÁÏÄ׿89¥‡ưÀ¡ô•É̉߈©À›½Çƒˆù× ¬°àèM¡̃ƒ·‡‘×8çù×ëöÿ¯¶߈öơ߈ÙŒë*«ÅÔưÀÛ«‚ ½9½Û«‚ ½9ơÔ©ØœÁׯƒ« +>ăˆŸÅØ‡ŒËÇøæƒ½·ÔÙ½ăÁß»û±»¹Ú›¾Ư‰ÏÔù×ÿ¯¶ÔX÷ÁÓÔ¿»×ĂĐÓ'ÛÀ¹ àٽ߻ûÇÖ»ˆé¼£ƠÁÏÔéÚûÖÏÔ¨‡¤2€̃êL“Ʊ»ÏÔY„ØÎÅÏÔ£Xü̉ƒvÍƠöÓÆÙÚ÷å5Óùן}¹Ú§Ôö¹ Û«‚ ½9ĂÈñ“œÜÙÚƒv”ÇŒ₫́Æ·‡‘×8瓹ƯNëöăˆŸÙÚÙ½¥Ü—»˜‰j̃ZîSĂÙ•ŒÿÚăˆŸ;ëÓÿ¯¶߈ÿÛ±Ôƒvö±»Ô›¾µ†ơêçÚʼĂÙÏ̉óÂÅÓÅôÓØ±»ĂºñÓ­vƒv¹ÚëöÓ½±¿ÄÓ«‡“ÍjÑĂ Ơ›¾ƒv½߈±»‡Ú˜êè䕾í‡Ô₫ƠX¼›¾ÏÅÓÔ¥Ö•×›¾ùפ½äôÍÄÏÔöĂÈöÁÙ½ăˆŸ¹à«ÓƯÓ €öÙ×ɇùêʹĂó¦ôŸ}ư­óß÷qĂ¼÷Á߈›¾±»ù¿ĂƠóÇË¿ôÑæŽơêµØÏÄử“ǯ×Ӻ麴†÷Ç›¾ỞƒĂÛº“ö¾÷Ú™Ó°ÁŒE ƠX€Çºר½€¯È©Ó–¶±¿߈Íă¾‘¹Ûº߈ëö½€Û«‚ ½9Ă™‰kß [ïSƒùן}¹Á†Œ­ÖĂْƳƠÅ¿‰á ÇܣᄛĂÙ×÷Îă»ÿ׃ÄơÔ¥ưÀ§ô³ºóׯ¦º½Á ÈÙÚ›¾ù×ÏÅï³2ƒ½°»ÏÔơ꫇“Íj½Ă°»đÙ½‘à¡ÔÛ«‚ ½9Ÿ}ù×ñÓƠÁëö˜‡ÂÙâˆ;ŸÄ±»÷Ú­ÄơØ©ûƯª»¨-ÙÚ™‰kß [ïSù×ÅÔÏ̉ŸÈ߈‡ÅØöÛ«‚ ½9ă‘·™‰kß [ïS‡·ÅóÂ9¥‡ÏÔé´Á¹ñÓÙÚÍƠ±»߈9¥‡߈®Ơ›½ÓÉúͱ¿‹Ó¿ßëö÷ơăˆŸÂ‹ÇÛ«‚ ½9›¾Ư‰ëö¥ˆ]1ĂYÁ̉Û«‚ ½9đÁÙŒë*«¤¾ ‰‚æÔ ơĂÇ̉ ¬°àèMµØûµ‰ÇÖæôÔ¾Fß»û¿,‡¿…Ö«ÔơÔÙÓÏt“½“Í¡Áë¼…ÛÚ×ăˆŸ;kíØ•Âç߈󶫇“Íj߈º¼÷ÁçÚÛ«‚ ½9‰»÷Ú½×$ÄÖ¡%ơèÅ›½߈™‰kß [ïSƠ½€ÏÅ‘®ÙÚźŸƠƒÖÛ«‚ ½9ñÓ¹Ú·̣À½.ưÀơê©-¡ÔÿÚ×Ơ9¥‡ôĂô§Ó½¡ÔµØǽ™‡ăˆŸ;±»›¾™ëéå÷Ú¡Ô¯¡ÔÇÖÎÅăˆŸ;æ̉§Ó¹Ú¦Ô퇙‰kß [ïS›¾ív߈ưÀơê8¤‡ÖÍDZ¿™‰kß [ïSåôͪ©ØÁñ»»Î…ÔÅÔÂÙĂÙÏÔ—Ø÷Ú£äëöÓÆ¹Úăꙉkß [ïSÁ‡é/×:ÁÓÏ̉óÂÓº“È9¥‡ùרי‰kß [ïSƒß„߈ù×ëö­ÖĂ›vùן}ÑÄ뛾Ư‰×ƠÛ«‚ ½9½ÔÑæÅØùêÇר›¾‹ÛĂ¯êív°”ëÓ½9¥‡®¼ÂÙëöß\ăˆŸ;ëö% ÅÓªĐÍË)éÛ9¥9¥‡ơÔ¡ÓÛ«‚ ½9™‰kß [ïS±»™‰kß [ïSỞÙ½ù×®¼¼ÂÙÇăÚù×µØù×ïƠ½‡ÏŇÇÙ ©‡¥2ßëMĂÙ—¾ÙÅëÍÓ¦q +÷ÁäơÏÔÚª‚ +¼9Ú‡ÇÿÚÏÙY·¼Í7Ÿ}êöÙÚó|ÿÇÑÓ¿ßÏÔ­Ä¡Ûù×ÙÚ™‰kß [ïS±â˜‰j̃ZîSùê¯ÈƠÙÜ·‡‘×8ç—»ÏÔ¹Úÿâ߈ª»¯G‹ø/ëö£È™‰kß [ïSg±¿ËÇÍÇ·Åæ¾Ư+µØ÷ÁóÛ«‚ ½9ưÀÓ¾«‡“Íj“ǬÖ9¥‡ĂÙƒÔ÷ˆáºÿ¯¶ăˆŸ;£äÏÔÏÅ麧ԓÆ÷Á‡ÇéÚ̀„¿‰߈±»‰ơÜêö‡“˜‰j̃ZîSÛ«‚ ½9£Ø­Ä»Ú¹Ú±»£Ư÷ÁÇ»ψº™‰kß [ïSû¹äÉÀỞ¿™É«‡“Íjđ»Ç"É̉½ôå̉ Ù½—º¬¶½€èºß„ăˆŸ¡ÔÁƯ›¾ºÁ«‡“Íj́%¹í©‡¥2ßëMƯÓ ÿÛù×߈÷u›¾¹ÚÓéó­½¼ׯÑ₫ëÔ߈ƯºµØ¡Ô÷‡߈ív³ï÷‡ÁĂ“Ơ«‡“Íj³(±»Ă™ëéåß»û±»¨¼÷Á÷ÁƒØÁ½ÅĂ×ßÓÆÍÓш¡ÁÏߑƫ‡“Íj9¥‡ŸÖͪªÛ‹ª-ß% Ëû¢Çö¶Æ×ùêöÁù×­‡ôÉ ©‡¥2ßëMăˆŸ;ÿלÁôæºóÇƯåï»™ơăơ›¾ívăˆŸ;k½Ø½ù׿‰ư‡±ù1±»»ØăˆŸÏÔçÚưÀ«‡“Íjºó|ƒˆù׵ط‡‘×8ç¨È£Ø­Ö¨È¹ÚÁ½ÏÔ³×癉kß [ïS‡Û·‡‘×8ç©ÇÏÔ‹ ß¹ڵØÛ‹Ç—¶ÓÆ¢ÇïÅÛ«‚ ½9·Âôƫ·3uU«‡“Íj­Ä›¾±Ư»°ù×ô‹ÜÅψ™‡¹ÚÅÓß»û€ơêψÿÚóÇÓØƒß»û8¤‡Ö•Œ‰Û“Ơ«»“Ơ£0ïi“Æù×çÀÿÂÚ×™ ›¶ééÓǼ½€ëöăˆŸ;‡…ö«‡“Íj¯×Ï̉ăÇí錓Ơ“ȫԕ‚ñÚÙâÁËơÔ¹Ú“Æù×ƠXÙÚù×Û«‚ ½9å̉ ½ỗˆºÅØơÄù×ơÔÅÛ«‚ ½9ƒvăơ§ÔưÀăˆŸ;‘߈—¶Ûº‰Û™‰kß [ïS»Ø™‰kß [ïS«‡“Íjëö«Ó߈«‡“Íjëö»ØăˆŸơàĂăˆŸ;ù$Û×Û«‚ ½9ÇØ«Ô“Ơ«‡“Íjƒ×ăàëơ¿ôÛ~÷ˆÂÙĂÙ¸ÚơêÛº—ˆÎÔö­Ä»÷Ú¥‹™‡‡9ψÛº9¥‡ÏÄ¢ƠI³߈µ†ù×ù×™‰kß [ïS8 ¤‡ Ö¿ĂÙ¶÷Áù×ù×ù×5ù×ăơר۵ØùêÛº¿(Ù½ơÔÓÏÅÚ×§ÔơêĂÈƠÿëöͱ½¥Æ¨Ơ±»ÍË)éÛ9¥©¼߈ƠϵØ×¾߈›¶é¿‰˜Á&«‡“ÍjµØÍË)éÛ9¥ÏÅÖÆëö¹ÖăˆŸù×ÿ¯¶¹–ßÄÙ̃ˆ߈¹à«‡“ÍjâêỞÏ̉’¹ÜN¸½Åذ»¡Á‡ºÏÔÁ½ăˆŸ;úÙ߈Û«‚ ½9¯×—»¯È‘«ùê×¾8±»±¿˜‰j̃ZîS9¥‡ăơg«ÏÏÅ8¤‡Ö §ộÚª‚ +¼9×ăˆŸ;«‡“ÍjăˆŸ±»«»ù×ëöó¡ÈÍƠ‘‹ÇƠÀÓ·‡‘×8çå}Û×ׯåĂßÄÙçÚ‡x±í½ª‡’̀jÛ«‚ ½9«d×¼߈ÙÚ©ÓÙ½ăˆŸ;à=߈ÓÉÖáÔÙăˆŸ;ÁƯͼ›¾“¹ƯN—¶߈€×Ơ†7§j¹ÚôºÏÔ8 ¤‡ ×±»ªÚÙÅë³¹ăÇí穃½Û«‚ ½9ŸÈÛ«‚ ½9߈«ÑXÙ׺Óêö;ùK³½ÏÔ¯ÈĂºÔXÿ.³ÅÓ庈’߈щù×ù×뉙ÓáˆÁ0q°¿ÏÔ™ô«‡“Íj±»YƒÀ¹¶•Ç߈Ơ˜êèä9¥‡÷‡ø¼ ­ÄơÔñÖƒ¬¿©¼¿±êµØÅ»ĂÙĽÏÅ…»ùà"½€•Œív•½°»“ÆÇÖÙ̉”Èúơê§ô¡Ôù×ô§Ô…Ú¡Ç‚vËƠ‚à±»‘ơö¿ôÏP›¾ä‰ñôóÓó˜‰j̃ZîSºµØđ +ĐÿÁ̉ăˆŸ;ù×ÀĂăà±»¾ßÓØñÓù<ÇÜơêéÓ«Ô÷å5Óù×9¥‡Ûêµ·ÈÙÚÎÔ›¾Û×Û«‚ ½9«‡“Íj߄⻇ׯÓÓºùוîÖ¾ÁÓÇ_‹Üß»ûªÔ¡Á߈̀Ê)èÛ8¤߈½€ó#¥“³Ơ‹ÛéÓ«‡“Íj«·3uU«»¿‰ƒv·Ü›¾±»ơê“ۓư»¢È°»ƯÓ ߈ÙÅ뙉kß [ïS$•ƠóÁÅÓϹûÓù檻©ØÅÔ‹Üå‡ÙÓëöËÉ94‰ï™‰kß [ïS÷‡Û«‚ ½9ù×±¿9¥‡ïiÚêù×ûÓØ¹!ÿÚ’ÆÏÅ—Óâ(äŒ ©ÓƒÔ¿ß¯Èù×™‰kß [ïS°»Ç"ñÓ±»Ư§ӱ¿›¾œØïƠ±»˜‰j̃ZîSÁåÅÔÛ«‚ ½9«»’Æëö…–ƒvÛ«‚ ½9‡ĂŒ¾™‰kß [ïSăˆŸ;±»¯ƒßͯ¥'=U#QK¯Â‚v Áù׿Å߈9¥‡¾ ǼÙÚơêÛ«‚ ½9ÍƠ‹ÜÛº₫‡‚v÷Ú§ÔÓÛ«‚ ½9øêÛÄÓÎÔÏÅÏ̉ù×·‡‘×8çóÇăˆŸ;ÏÅñÆÅÔ¥ØçÚ«Ô¡Á±»¡»öơĂá=—Óô//«‡“Íj†ÚơĂó¡ÁÖº$±Áơê9¥‡‡¶Â匿N™‰kß [ïS™‰kß [ïS…¾éêÛÛ¡ưo«¥-;M›¡+…Ÿ)Ùµ³ eᥠ‘埇âëö«d«‡“Íj¢»ÁĂÛ«‚ ½9½ŸÈ¹Á½›ÔÏęө߈áĂ’Å…»áê®ôưÀƒv‡Û©Ó÷Á·Ôä̉ñÖÛ×­óëöóÂăêÑŋܓÜâˆĂó‘뫇“Íj߈‘ÆÛ«‚ ½9‡º«‡“ÍjăˆŸµËϼ÷¼½ƒ°»ÓØä̉Ûכí֫Ԓ½¾ßß»û߈íÖÁ×øêëǾ½ ¼½ÂÙÛ«‚ ½9¡Ôÿ¯¶†ºÙÚÅØ¡ÔÏ̉ŸÖÛ«‚ ½9ÑĂï½Ở¯¾ƒå«‡“Íj߈̉ű¿ù×¥Óáê¼ôÓÓ¡Á¯G‹ø‹ÇÿÚ­Öª‡’̀jù×Û«‚ ½9ÖÜÏſžưÀ›Û¹ÚÛ«‚ ½99¥‡ÅÔ”Ç×Ó©¼¹öŒ¾ƒvÙÅ뫇“Íj̃ˆ‹Ç™ÁßÚ⻳›¾¿¹ %ù׫‡“ÍjǺơêÍÓ»±»å‰Ñó¾éÓơÔ©›Ÿ}ٽ퇡ÁÎ̉¬Ö¾¹x₫ §Ôß»ûù×ψùê½±ëØ×ÜĂÙÆ§Ó©ÀÛ€¢‡«‡“Íj±¿Û«‚ ½9ơêăˆŸ;ù×áƠ󫇓Íj÷ÁÛ«‚ ½9íÖưÀ˜‰j̃ZîS߈µa½¾³zÛ׳(™‰kß [ïSƒvÙ½̀Û«‚ ½9û(ëÔöợǦش΃֟Åù×íÆ¿‰¹ÚƒvƠưÀăˆŸ;¡Đæß»ûÛ«‚ ½9âơï½£Ô™‰kß [ïSơţȅnóÇ«‡“ÍjăÄ¿‰ È ăˆŸÁÜ÷ÁÛ«‚ ½9‹Ü©ºÑó·Ûà½ù×ơèŽܨ‡¤2€̃êLºƒ¾‘á=‡ƒíֳ“Ơ¨Ç¨,½Ôï½—ˆÄÓ«»«‡“Íj¦È—ÏÔËÍëöÇÓăˆŸÅÓ…»¡Ư›¶é½í—GÙ½˜ôÙÚ¦Ô߈ç$µØ¾ĺ™ơĂÙ8¤‡ï0gĂÙ÷$Û«‚ ½9‘¾ÍÓǡԇŒׯ׿8…ôÛ«‚ ½9±ôçÚ¡ÔÄ–Ûº§Ó…¾̃ÄØ‡Œ‡Œ¹ÚƠÁÜù׸ÚÏÔ¡Ô‡º™ëéåÑÓ“½ÑÓù×…§ëŒÿ¯¶·̣¿‰߈ÑÄëßÄÙÙ½¼½¡ÛƯơơ¡ÔđÁ˜¿߈ùơĐÓ·Ó ¥0ăˆŸû±¿·×£Øø×“Ơ©ÓûƠ÷Á˜‡¶÷‡˜‰ j ̃    Z îS ăˆŸ;ÏÔ¿ô—Óß»û¢Ç÷‡½‡½ƒ½óÇÄ–Ë̉›Ú«Ô¿ß™ëéåÛ«‚ ½9·‡‘×8ç÷ÁÏœƹ*Û«‚ ½9©¼¥Øâˆ:ª»º©‡¥2ßëMä̉ÍÓăˆŸ;kơÔóÏÔÛ×°»Á¹©ˆëö·‡‘×8ç⦅ÈñÚÎ̉½€Ÿè„Ø‹Çù׋vùÚÀ½©Ü±»ŒE¸Ú­vÛ«‚ ½9ä̉›¡—̉ƯÓ ߈‡“·#»²¿‰÷Ôß÷Á߈Œu™‰kß [ïSµØ•Œ“Ü»‡ߦï«÷Ùùׇº±»›¶éŸ̃·̃›¡Î½ƒÖµØÿÚgƒ™‰kß [ïS¡ƠƠ߈»ƯơÔ™‰kß [ïSŸ\ăˆŸ;ơµ±Ư“Ơ±½±»™‰kß [ïS߈Û«‚ ½9ƒ™‰kß [ïSÛÀăˆŸÏÔ±»·‡‘×8çÅØß»û«‡“Íj—¶9¥‡߈Ô߈¡Û±»©º›¶é©‡¥2ßëMçđ·Ó ¥0¹Úà œ·̉ ¤0ÿ¯¶ư% ËûÛº9¥‡ËÓ߈«‡“Íj㎋&¡À±Ô߈÷‡ĂÙù×ÙÚÛ«‚ ½9›¾•Œ‘Ó©£«‡“ÍjáÛ«‚ ½9ùר߈öĂĂ¡ÛỞï½á ßÄÙï³2â½…Œ›¾ÑĂ¯×ăˆŸ;±»‡º߈±»«·3uUëö£Øä̉½’‰2Ô,øưÀù×”ĂĂ ›­±àéM×Ơ†7§j›¡…Öù×ÍĂ÷ÁÏÔ¹Ú±»©º9¥‡£Ôµ…ƒÖ͇ø̀Ê)èÛ8¤™‰kß [ïSơêÛ«‚ ½9›¶éÓ̉±»ƒÖƯºíÁ‚è‰đ5đ¶½‘ÆÁ©Ó¤½Ѷ±»‘œñÙÿ$ñÓ8¤‡ºÄÓ¶ÔăˆŸ;kÁĂâˆ߈ƒÖ‡רÙ×¶ôĂÙÛÀù×°»ơèÅ£ÜéêÓØ÷Ú™‰kß [ïSº¿‰µØÑÅÈ‹‚ơô½ÏÔ׿8›¾°êØù×êöù×ó₫¡Ç§É‹È³z™ÓáêăˆŸăˆŸ;k¼ÏÅψôÅÓ¿ĐĂɰ»ÇĂăàåĂ¥Û™¸½È™‰kß [ïS·‡‘×8çăˆŸ;§Æ¾ƒØăˆŸív±»Á×™ëéåß»ûÙÚƠݽƒ•™‚£äăˆŸ;k™‰kß [ïSçÚôê·Ô½€«Ô›¾‹Ç‡ñÚ«‡“Íj¡Çơ™é‡ß»ûùׂ ÍÓǽ9¥‡Û«‚ ½9®GøăˆŸ;ăˆŸ;ÿÚ±»ÏÔ}é‰ñ5ñ·½Ô›¶é•ǃv»‡Û«‚ ½9¨Ơ“¹ƯNưÀÛ«‚ ½9‡ÇÅØ¹¶‡ơêƯÓ “Çÿ¯¶Ûºăà¶«ÔÅôĂÙ­Ö÷øѾ‡º‹Çƒ¾‘ƠÍ›¾±»Åù׫‡“Íj‡Çµ†ÿÚù×ÅÔàĂăº—¶»Å̃„ÊÇ™‰kß [ïSÍ­HªÚƒˆ“ƠôꕌƠ´ưÀ©‡¥2ßëM«‡“Íjͽ…£­ÛÄÓ›¾˜‰j̃ZîSƠÁƯĂÙ÷Á™Ă™‰kß [ïSÑ×ÏÅ¥Á‚­ÄáƠĐÄêáÁƯ«»ÿ[á ©AÑÄëÑÅÜgÏÄùן\ßÄÙ•Ó½Ñæó­¾¿‰‚v›¾êÓ—¶çôå̉ ƒˆ†ŒÅà‚Ö·ÔËñÖÙ½³ØÅÔ‰¿I›¶éÓºÀ½ưÀïÚñÄơê߈÷Á™‰kß [ïS©‡¥2ßëM½Ăº·Ó ¥0ÍÓÖ¾8ƒ™‰kß [ïSê˜H+ƯÓ ‚v•Èû›9¥‡âḈ‡á ÅÓ™‰kß [ïS…ôÛºÛẠ̀"ùê¯Û·ÅđÓ§ÔÙŒë*«±¿™‰kß [ïS9¥‡Û«‚ ½9÷Ùívø×ÓÙŒë*«·ÔơÔ“ƠÀƯơê‹Ç±»߈ưÖĂĂÙÙÚÅØÙ½ÓºĂÙ¯G‹øÏÔûÙÛ×™‰kß [ïS‡ŒÛ×Ô Û«‚ ½9ăˆŸơèŸàÏ̉ÏÔ›¡™‰kß [ïS—¶߈«dÙÓ¹ÁêöçÚĂÈÙ¾ƒv·‡‘×8çÛ«‚ ½9ÓØáê¥ØŽ÷îÙ×ù×Ă¼¨Ç—ºÇÖß»ûƒv·̣÷Á²µ‰èꃈ§Ô©œ·̉ ¤0«»±»±¿̣ÄÁƯ«ÔÙÅëĂÙ¹ÚăˆŸ;­Ä‘ÓÛ«‚ ½9¡Ơ«‡“ÍjÏèỞẳ¿Ù/ơê±ÜùדƠù×µØׯíÁ9¥‡×Ú¾ƠÛב³µĂÏÔ™‰kß [ïSăˆŸ;å̉ ›¾å̉ ±»ÅØ­Ä›¾«Ô¶ÏÅ·‡‘×8瓹ƯNÛÄÓÂv£ƯăÛ¥ˆ]1Á¹ÿÂà=ÏÄùˋǴ½ù׎¾‰ÛÛ«‚ ½9ƯÚ8¤‡™‡Åذ»ơËÉ9ôÔ +ƒÖǺ‚Øçô‡ºëö­Öơê©Ç° ù×ÅÙ÷ÚÍă½€ư“ĂÈóÂăˆŸ;kĂÙßæçÚ‹ÓÇâÚª‚ +¼9ø¼‚vÁ‡é/×:Á̉©ÀÏÄ߈«‡“ÍjÍÓ퇡Á܋ȻôƒvÛ«‚ ½9ívÛ׳áêợÍƠăˆŸ«âù×óÓù׵؃v߈°»¡çÁÍË)éÛ9¥Îđĺƒˆ§ÓÏÔˆÛäôͼƒ¾‘¦ôA—¾ Ëûù×ĂÙá ˜‰j̃ZîS»Ø¥ÛÔơщÁƯ‹&ÓØĂö«‡“ÍjùôơĹÛúôǺơèÅ߈§ºívÿ¯¶Û«‚ ½9Û«‚ ½9ÛËÉ9¿‰¡%¹Ú÷Ú«‡“ÍjÏÅăˆŸ‡ÚÙ½›¾ăê½ÓÅ«Úù×»Øù׳·ÛÑÓ“ÆÙ½•̃ÔơóÄÍË)éÛ9¥«‡“ÍjËÉ9ÏÔÛÄÓÿ¯¶ûëö«‡“ÍjºÑÄëßÄÙú‹ƒØÎÔù×ÇÖµÏĂ÷Á‡ŒÙ‡Ï9…Á̉Ñóëöö½±»¥Û¶ù×»~§ôÙ½¹̃ÁƯ—Øéêùײ”°½ù׈߈—ŒÛÏÔ¥ºÄ±ÁÁ̉ùêÏÔ™‰kß [ïS½ĂÏÔñ½ÿ¯¶ơêÑÓ—¼9¥‡ĂÙÜƠơèŇÅÜ©Çù×߈߈‡Ç½™›¶éö¯ñÓÿ¯¶Ơ—¶ăˆŸ;“È´aÓÅËÉ9•×§ÓƠù×“Øø×÷ˆ°Á +óëÓÛ«‚ ½9߈÷Á«·3uUÁƯăˆŸÛ«‚ ½9«‡“Íjß»û¹Ú½·Ø̃„ÏÔëöׯ‡Ç¹Á¯G‹øÍÓăˆŸ¼ĂĐÓ °Á©Ü½ÁÙÚÿÂ’½£äƒÖ¡ÁÄ–Ơëö‡ÇàøºĂơ꽃ֵØ߈Ù½ƒvéÚûÓ—»ÏÔ‹½ÿ¤ۙ‡Ó ‹›æÛ«‚ ½9ĂÈÏăˆŸ;ﺃvÏÅƯ%‡aëöÏÔ™‡÷ÁÙ½ÍèÏ̉ơÔ›¾̉̉™ëéå£Ç¥º³ÈùêÁ½“ÈăˆŸ;¿‰ ÇÁƯ₫‡ÚæmÅÀ÷Á¾Ú‡§Ó©Çëö±Áïä±»߈ÙÚ‹Û»Ư•ăˆŸ;k߈÷Á£ä½ØÓ̉Ï̉ñÚÁâÄ«»߈ÏÔû÷ ´† ±»ù×Ϻù×óÇÑÓ™‰kß [ïSÏÔ£‡á=ơêưÀÓóĂ‹Ùù×ÏÔ÷ˆG½¹¾ßÚ…Ö¿º–¾¡/9¥‡ŒĂÏ̉å×»Á× êö÷Á™‡ɇߋǧÔĂÙ߈çƠơ“ÆûÖ÷Á‹Ü̃ˆ éỤ́çôçºăˆŸ;—»ù×±»ƒvÑŇÁǶœȤˆ\0û;™ëéåÔ¾FóNjǕŒ߈Û«‚ ½9œÁÈ›¾å̉ ½€·Å½÷Á½€ívÛ«‚ ½9±ëØ“¼Ù½ăˆŸºÅ¹Ú›zÁ¼ÁăÛÀÿ̉µØÑÅ¿½ŸQÍӓȱ»ỰÙ½·‡‘×8ç½ÁŸ¥ØÅÔ½Ô‘¾çØ™‰kß [ïS™‰kß [ïS«Ô匿N™Ă©Ó§Óщ±»ÇÖ™ÓơÔ°½º¹Ú̉ÅóÄ÷Áï½ÙĂ½‡x™‰kß [ïS“Ơ·‡‘×8çơ}‚+£Ç©Ó¡Ôù×ÍӘ׫Ôá ÍơÛ×ÏœƱ»Û«‚ ½9ÁĂà —¶íêâˆ:•ơèÅăˆŸ;íêơĂ9¥‡ĂÈÑÄëÛºÁƯÙÚéÓÙ½Á̉ưÀơÔ™‰kß [ïS­¿ùë9¥‡×¡Á«‡“Íj±½Ï̉¤ˆ2\202Û«‚ ½9̃ÄØÛÀÛ«‚ ½9»yè‡Ï«×¿éº‹“Èゥӳàñ¾¹xăˆŸ™‰kß [ïSư§‡ï½£Ç‚·‡‘×8çÙÂØ×ĂăÇ퇌ÏÔ¤ˆ\0ñ»—¶ïøåŒ¿Nù×±»ºÁƯÓÙ½ù×Û«‚ ½9™‰kß [ïSÙ½©Ç¨,8¤‡×߈å̉ ëƠUÏÅÓÅ¡ÇƠX°»™‰kß [ïS«ÔÂèÛ«‚ ½9Û«‚ ½9ÏŽƒØÏÔ»‡̉´O—»ăˆŸ½­v߈«‡“Íj½€߈ùê¹Á¶‡Ö8æëöù×±»ÀƯăËÉ9Í|ơÅñÓ‰Ù½ă½©¼Ñ×½»ÁÙ½µØÏÔ°»ôÄû‹Üåô±»ÊưÀóǽÔăˆŸ•½á˱»“ȳºóăˆŸ;µa¹ÈñÓ™ÁÑÄëùêçÚ¿‰—ÓïƠ«Ô™‰kß [ïS›¾ù×™‰kß [ïS¹Á±¿ƒv‡Ç«‡“Íj©Ó—¶¿‰©‡¥2ßëM‰¿IĂÈÛ«‚ ½9µØâ¥Èï³2ÇÛ«‚ ½9Û«‚ ½9±»‹ÙÛ«‚ ½9¹ÚßÁÆ€ºƠܾù×ơæɇG½¹Ù½—Ó¿»ÏšۓÆơúö½ô™‡¢Ơư›Ăٵغ“½ÙÚ«»ÜăˆŸ;k§ôÑÓ½»‡°êØÁƯÛ«‚ ½9ͼăˆŸ§Øùơ×¼±̉ß¹Ú‡“¹ÚñÚ«Ñ‹Ç߈ỒÓöÁå̉ íÆ«·3uU“ƠψôÅØ™‰kß [ïSÏÅ÷Á°»ẳË̉›ơÔ±‡¡·̃½µØûÓËÖưÀ‚Öˆ̀Óù×ÑØ¶êöÅ»¥â÷Á±»¿‰™‰kß [ïSù×·‡‘×8çÖ ©‡¥2ßëMÛ«‚ ½9߈퇵ƠÙƠƒ÷ª¶2tT±»£ä˜‡¹Ú«Ô™‰kß [ïSÙ½Á‡é/×:½¡Ô™Ó߈®È¹ÚßÖ÷Á±»•ÏÔơèŰÔÁ9¥‡ô–¾1߈ÍÄéêµØ§‡ơêĂȋܩ¼ơê›v¡€§ÔÏÄ™‰kß [ïSÏŇƒÔÛ«‚ ½9«‡“ÍjöåÁ“¾ß™‰kß [ïS߈Úª‚ +¼9Ä–µØ…Û«‚ ½9£äƒˆ€º߈ùêÙÚÁ̉³ï̉ñ̉¥‰ÍL…«¼®È³Ûøô×ÜƯÓ ƠX™‰kß [ïS%“Ơ«‡“Íj³ºóÑØ¯¾±»߈ăˆŸ;kÑÓ³£ÇµØ«ÔÏÅâàׯű»ç̃›¶éÍÓ«‡“Íjëöéơ÷Áƒv¡ÔóĂĂ ›­±àéMȱ»ƒå£Ç“ƠưÀ›ÚƠ«‡“Íj¾µØ½÷Áăà™‰kß [ïS¹Ö÷ÁÇ̉™ÓÍăÔù×íÆƠ÷ÁÛ«‚ ½9ƒØÎÅåÁé‡à½,Ï̉ƒv9¥‡©Œ©Óù×߈ăˆŸ;§¹‰ÊËÇăˆŸ¾́º÷Ú¡ÛÓØöŽÛ«‚ ½9ßưÀ“Ù½×¾Ù½ĂÈÑÄëÓ̉±»‡äÙÚßÄÙ½™‰kß [ïSÏŇº¹ÁÄn¼È «Ô¿‰³½•½û(ÊÜÅØó¹óÔ›¶éøêÅÓ±»µØ±ëØÄÔƒÔ¡"½·̃ăˆŸ;₫Û ƒÜáư±»« ©ƒ»5ÎÔÑæÏŽö§ÔÏÔöÁÁƯïÜÎÔ½­ÄăˆŸƒvµØ8¤‡¹ÚêöÁö«»† ÍƠ¯È²Âùט‰j̃ZîS™‰kß [ïS—»ä}ăˆŸößÚÛº™ơ×Ă«‡“ÍjÛ×á·±»¸¿äëö«‡“Íjß%«·3uUÙÚ¶‰Û«ÔÛ«‚ ½9ăˆŸ;k›¾³ô»ÓÏÔûƠµÀcv³Óؾ‚v +ƯÓ «‡“Íj³߈ỈÿÅÏÅ™‰kß [ïS˜‰j̃ZîSỔºÙ½™ơ‰Á™‹…ù×±»ÅØÙ™‰kß [ïS·‡‘×8ç±»ÁÏ̉Ϻăàíê½³ùסۇǜԽô˜ ‰Û­qíØ¿ôÿ¯¶ăˆŸ;¶Ô Ù½g™‰kß [ïS³zù§ÙÚûØĂơèÅÙ½ŽÙ½ÇưÚ«‡“Íj¹Ú̀Ó±»ơèÅÁĂÙŒë*«‰¿Iï³2§½±¿™ëé復¼©Ø߈åĂÂÙÏÅßÁ½ôÙÚ±»ăˆŸ;kÓ¾°» +³µÜ¿‰¾‰ƒØ‡ÇŽ„߈ăÁñ¾¶èχơèÅ©‡¥2ßëM¥Á©‡¥2ßëMÏÔơĂÁƯѯµ•ôԳȪ ¨ƒº5߈ŒÿÏÔƒàªÚ«‡“ÍjÏƠç̉ç«ÑÏÅÁƯíễˆ %߈ñÚø3ăíƠXç'ཙ‡«‡“Íj₫½ơÄÄăˆŸáı»½ôêù¿¡ƠĂȧôăˆŸ;á ‘Ôº°»êöĐÅËÖ…ØÚ‘Ë̉“ëöí‡ÅÓ£ØƠÛÆƒˆëöÏÔ”ÈúĂÙ™‰kß [ïSÛº©¾ñÓ“÷ÔƒvâơăˆŸ;«‡“Íjùê9¥‡ƒvÛ«‚ ½9±»Û«‚ ½9è¼RơêéêûƠ™‰kß [ïSÛ«‚ ½9ˆÏÔ›¡ëöɇÛÀ«ÔëöÙÚùêÎÅăˆŸŸÈ®¼Ó؃ÁܣǃÚÛºÛ×…´Ø™ëéåÚÆ ¾ÑẰÓÉ»ơêÑÔÓ5“gesÁÅù×ÏÅÀƯÏÅ¡Ư¼Ă±»ĂÓƯÓ ±»ÁƯ¡Ôơê§ÅÔ·‡‘×8çÀ½­ÄĂÙÙ½9¥‡ƯÓ ¹¼àê¦ÓñÓĂºÉíøê›Ơù¿ß½Û«‚ ½9§·ï½¡Ô©Ó™‰kß [ïS«»éÓçù©¼ÿ¯¶ß„«‡“ÍjÁHưÀßÖ©ÀăˆŸ;ëö™ëé图¹¯×ëö—¶±»ÙŒë*«ĐÓÍÓÅĂƠ¶ÜÛºù×Ù×ù×­Ä­vÛ«‚ ½9‹Ç¶ÈƯÓ ™Ô“½úÙÙÅëÿ¯¶ÿñ¡»߈«Ú¾ÂÙ«ÔĂÙÂêôưÚ¹Ú£ØÏÔ߈ó¶·̣ëÓƒˆ‡Œơê×$Ïß½€•%„'±»ä̉‡×³Ơ›¹ÿ¯¶ª»…ે“Íj±»×̉÷‡Ÿ}ÏÔ±»™‰kß [ïSª¶2tT—Ø£Èó¯¾9¥‡×ă­ĂÈ©ÓÙ̉½€¹ ߈×Ơ‹ÙëÓăˆŸ°»«Ó¾öË̉«·3uUш߈ånƠºmÿÛ¶ÚơêÀ¹ ™‡§Ôù×§½¡»Û«‚ ½9˜‰j̃ZîS§‚߈ívµØ—Óñ‡ÿ&±»³Ç÷¼÷Ù·øÓÅ‘ÆÆÀÚÁƯÛ«‚ ½9ù×éêáÙ½›ÂÛ׫‡“Íj§ô¢Œ"ÏÅơÔƒ½ÏÄÍÉÛñu߈ÏÔÜÏ‘°û‚ÑÓÓ‹Ç­ÖËƠ“½£ÓơĂçÚ×Ó±»G½¹è¼ùוÏèÓăˆŸ;ö÷Á›¾ö¹ÁñÓ€Ơ¥ØÓºĂĂ¹Ú¬¿…ÿ¼«‡“Íj©ÓÛÇÏÅéÚ©¼ÍßÏű»ĐÄêÓ¾9¥‡¡Ôíê߈«ԙ‰kß [ïS•ÜÙÚĂñ»ñÇÏŪ»ëÓ½çZëö¯Đëöµs™‡÷Áø×ëö›¾̀ÓÛ«‚ ½9½Ô©¼‡º·‡‘×8ç½™‰kß [ïSÏ̉Ơ½Ç[æÚ·‡‘×8çÿ¯¶ưÁ±”±»±»ù¿ÿÂùוÇÏű¿ƒvé‡ÁĂĂăˆŸ;©ˆïß̀Ê)èÛ8¤ơ»™‰kß [ïS™Ó߈‡Ú÷ÁÍƠĂ­Ø§Ó«‡“ÍjÓº‹Çïô±»¯¼ÙÚưÆß»û«‡“Íj¡ÁôêÅÆØºÁÂÈĂÙ£‡8¤‡9¥‡±»™‰kß [ïSÛ«‚ ½9¹ÚÛÆ¥ÇÍÄưÀ›·Ôéơ°¿g­ÔÛÇív²¹ÎÅщÙ½ùêI™‰kß [ïSƒv¾‰øÁÚưÀëö»ØÇù×Ù½ÿ‡‡º«‡“Íj…‡x«‡“Íj¿Ă™‰kß [ïSëö¡Óù×çmơû½9¥‡³¹ÁƯ¯ÜêöÙ×ÿÚ«Ô½шÏÔźׯÓØ¯È£X„çÚÍ߈¾º÷Á°»½»‡x‚vùט‰j̃ZîS”Èú¯G‹øÛ«‚ ½9µ±»™‰kß [ïSŽĂºƠºm÷Ù±»ÑÓÏÔ«‡“Íjö¼ƒë¶Ü.ăÄÑÓ÷ˆÙ½£Ư߈Ë¿ÍË)éÛ9¥§Ó߈ÑÄëăˆŸëöÎÔ©Ó¥ñ÷¼ëö½€«Ú”̓¹đÛ«‚ ½9Ÿ½€³óÂÿÚ§Ơ‡»í‡Á̉Ÿ¤ËÓ»˜‡›¾¡«‡“Íjù×öÙ½›¾•ŒÔX%³ï»‡Œ́ÁªÔ÷$ÁƯ»ØŽ÷Á¿́¥Ü°Àt₫®¶ÙÚéêºØù×½«·3uU¿‰ù¿Ỡ«»…±í£ä÷‡ëÔ‡Úá=µØͨ»ưÀ¡ÁªÚ»ÓÀÓµơèÅÙ×´.¤Ù¹•½̉º̉½·‡‘×8ç†Ú›¶éẩWÛ«‚ ½9ÿÚ·Ô€Ä.ëö›ĂƯºÏđÖ™‰kß [ïS9¥‡ÙÓ»ăˆŸ™‰kß [ïSù¼ù×§Æ¥ˆ]1¶ôÙà›¡ÛºÚª‚ +¼9‡±»Û«‚ ½9«Ô߈é꛾‡ÇÅÔƒˆ9¥‡ÙÚ±½Ú×Û«‚ ½9ƒ¹÷»Ÿ\¹ÚơÖ‘Ö“ÆëöÏÔăˆŸ±”ï»ĂÙʾŸÈÇơê߈9¥‡Û«‚ ½9·‡‘×8ç½…ôÑÄëÅÓ«‡“ÍjÛ«‚ ½99¥‡”Èú³ºóÙÚ»«½­ưÀ—ˆ¶ú)ÛŒÏÅĂÙơĂÏÔêöưÀ—Ó‹ÜÍÓù×§Æ©‡¥2ßëMÙ½‹ÇÑÓÛ«‚ ½9ÂÙ‹&‰ÛËÖÑÓ±»÷ÁĂƠÛ«‚ ½9̃Úkß»ûרÙÅëûăˆŸñÚ¹̃ù×ăÇí¥ˆ]1²Èëöù×ôúûÓ«Ó„ƒâˆµa¡È—¶ơê9¥‡×âêó׫ä÷ÁÁƯơêùסÛÙڹڣر»ÎŋǭÊçÔù×ƯÓ Ù½½‡Ùڣ؇xºá=ÏÔ9¥‡œÜëö«‡“Íj±»çÚ½Û«‚ ½9›¾×ÚÙ½Û«‚ ½9‚v Çˆáöùê±»«‡“Íj°»ÇÖ½çÚä× +ÓÅ­½¼ø×±Œ÷Ô÷ÁăÁÏÅÅØ½™‰kß [ïS¿ß±»·§D ˜‰j̃ZîS¼ưÀÏÔƯÓ øêÿ¼½Ïű»ÿ§±»±»ÜÓ ÙŒë*«ù×ăÚỂÏÔ¹ÚÍÄÛ«‚ ½9ɾÏÔùꃈ§Ó–¶ÏÅóÂƯ¾ÁĂÁĂ÷Áù×­ÄË%å̉ ­vß½ù×Ù‡Ï9…ÏŃvÍ·éµØÛ«‚ ½9Û«‚ ½9ÏÅåĂ·‡‘×8ç½Ă ªÚ¹Öùêó|ơĂư‡±ù1ÅÓˆÏ̉çÚÍı»ÙÅë·§D ơÄ­vÛ«‚ ½9ăˆŸ;ƠX¥Ø߈·‡‘×8çׯƯÓ ëöĂÙ̃„Û,ư‡ù×ơ»¡Íˆ™‡±»±»í½ăˆŸ;ăˆŸщ½äĂ™‰kß [ïS˜‡£Ôù×·‡‘×8çƠ߈̃Á™‰kß [ïSÛÄÓÁĂÏÅ«‡“Íj§ô±»½—å™ëéå߈ÏÅ3í—GÏÅ9¥‡ï»ó“Ơ¾»×̉߈åÁăˆŸñÓ³Ơ·Å—¶âˆ:k™‰kß [ïS»ÏÅĂô©‡¥2ßëM‹Çï½Ï̉¶ĂƠ¨‡¤2€̃êLÏÔù׿‰ôꙉkß [ïS‰ÁÂÏÅÿÂùê‘ơ9¥‡Á×ÁÙ̀Ê)èÛ8¤ÑÄë±»R´†ăˆŸ•ÂđÁµØù×±»ăˆŸ;·Ó ¥0›¾ÑÓļ +‹ÇÛ«‚ ½9•‹HÛ«‚ ½9ÙÚå̉ ‰¾¹£¾÷ÁơÔăˆŸöµÊ« ©ƒ»5ùꕺ©Ó°»Ùש‡¥2ßëMĂ¼ËÓ€ºëöÎÔ¯ÈåĂÁĂƒvỞưÀ½ï‚³ºó‘ÈëÔ¶èƠƠ±”ÑÓăˆŸ;ỗˆÏÔͺÈÑù׺½ĂÁ×›¾Å»¤½ÊÖëöƯÓ ÓÅùשÜƯÓ ™‡ƠñÙ¿ä³àÅÏÔµØÑؤÓÏ=³çÚăºèÓ±»ùê¹ÚÍË)éÛ9¥‰Á¿»ĂÏÔçÚ¹Ú×ĂÛ«‚ ½9Á˧Ե؎ͼư„щ‡ÇÏÔ·̣½©‡¥2ßëMÙÚË¿YÚÀăˆŸ;ׯ¯¼áÛí—G»Ó¥Ó™ÓöƠXÎÔ½•×ăˆŸ¸È½‡Œëöº̉¶ơê¿ôỞÓØ™‰kß [ïSÏ̉™‡ÁϺܳÈ%·‡‘×8盹·ÔăˆŸ;k™ëéåêö +ÿÚƠ¾GÙÚ±»íÖív%÷ˆ±¿ßÁ™ÓÅĺ½™ëéå߈ơúö߈ơÔ壱ԵƠ‹¤ö¶ß„ù×ÁÓ©‡¥2ßëMƠùêùתÚÓØÍÄÙÅëôêØ±»ƒvûتÚ釙‰kß [ïSùéÓ™‰kß [ïSỞ›ÛßÄÙ›¶éÏĿߪڽ԰»±»«‡“ÍjﺿÀÏŃv™ÓÅÄÏ̉‡¾ƒÔÂá¼£»ăˆŸ;k™Ôáꃈ™‡ử“È¡ÁÚª‚ +¼9‹ÙÑÓ©¼«ÔÑÓÍË)éÛ9¥ăˆŸ;ÛÄÓ‡ívï½Ǽơê«»ỞÑÓ“÷Ô›¶é߈‘Ó±»ºƒ½˜‰j̃ZîSÇ"ù×Ù‡Ï9…ÅØöëöå̉ ¿Ạ̊$àƠ“½ÑÓƒvÙ½Ă¹Áø×ø¿%ỞÇÓ÷Á›¶éÍÓÿÛóƒ֥‰ÍL…ÛÄÓƯºÔÑ·©Óß»û™‰kß [ïS…DZüñÚÑæ™ơ߈åÓñơêơê£ƯÆØ˜‡«‡“Íj¾߈êö¹Ú™ÁÛ«‚ ½9ÍË)éÛ9¥̀µ¬HµăˆŸăˆŸ;ÓƯÏű»»ÅâàĂô߈£Ç¿‰߈Ăè½€Ùq£äÛ«‚ ½9Í[÷ÁÙŒë*«ù×Ç(ᙇù×Ûº½¿åÛ«‚ ½9ÑÄëëöÚºơÔƠ¾GÔXô‡ºÑÓƒvY—¶çôĂ˜‡º½« ©ƒ»5›¶éĂÙÁÇáê÷ÁưÀ¯Û°»ÏÔ™‰kß [ïS×Ó́%ÁƯ9¥‡½±»íÖíơÁ½ƒvÁĂ÷ˆơêơê·Ô†ºùÜÏÔª‡’̀j¹ÚÙÚ½«‡“Íj™Á—ˆăˆŸ§ÔÖ¾߈ọ́ÁĂù׺ѷ۫‚ ½9«ÔÁ¼ÄÓÏ̉ѶíÆưÀẳ•Œ£äщsóÓ½Ôơ곺óưÓË̉ÙÅèÓ×ƠëöÉ ¬¾ăˆŸÏÔ÷±³ØÑÄë•}Ă߈Ï|߈ÏÅäỡˆơêÓØ߈™‡ÙÜ—#›¾ëöʹ ÓØ—½ñÖù׃v–‘ר¡Ô߈³zŸÛ÷·ëö ÛµØ™‡ª÷²½ăˆŸ™‰kß [ïSá ÍÄ›¶é™Á‡Û«‚ ½9°¿9¥‡±»Ú׫‡“ÍjÅÓëöƯâëö«‡“ÍjÓ¾ÑÄëù×ơÔª‡’̀jôºç̃½“ƾåôºƒv™Ô«â/¢XѶÚª‚ +¼9Í1˜‰j̃ZîS«‡“ÍjÍļù×ƯÓ Óº°»«‡“ÍjשƠ÷Ô‰Âá=Á₫ÂñÖ²Ó߈ôÏ̉¿ßÚÄ̉̃ιڙ‰kß [ïSâˆ:߈óÇƠá=ƒ½Ù½ăˆŸ;¥ˆ]1½±»ëö«‡“Íj±»”{ăÏÅÏ̉߈©¼߈ßÄÙ—ÓơÔÏÄÍ ±ëØ™‰kß [ïSÏÅŸÖ«ÔÖ¾8߈Ï̉ÿ¯¶ö«‡“Íj•Ö¥‰ÍL…û̃ÁĐÅ«‡“Íj߈™ëéå…ÚẳëöĂÙ±»¾ô›¾•“ÍjÙÚרÏ)‹Ç¶ÅÙ½™‡Úª‚ +¼9ÏÅ߈ĂÁƯ±ôÉ̉™‰kß [ïSăàơÔ9¥‡×¾Ïăv¡Ç¸ÚưÀÙÅë¹Áù׫‡“ÍjĂƠµÀû+߈ªÔ­ˆ¶‡Ö8æƒvăˆŸ±»ÿÆß»û¡È¡Ôµ.¥Ù¹àÿÚ›·Ô—¶½€çÚƯÓ °»àĂ Ó[©Ø©Óß»û‡éêĂÙǾ¼€ÏÔƒvèœHĂ… =™ëéåº¼ÓØÏÅ«Óÿ&«Ôª‡’̀j«X›¾ÍÄ)ß»û©‡¥2ßëM¹ƒĐÅØ+Û«‚ ½9ºÁçm8¤‡Û«‚ ½9ïÀ™‡ÁƯó̉“ñíÈÛ×ÛšӀƠơƠá¿ßÓº­Øăơ䌾N€ƠËl½‡ßÄÙ¥ˆ]1¿îÅÍƠÏÔëö°»ÏÔ‹ÁûƠ½ç¯¼Û×ÿ¯¶ÁĂăˆŸ¡ÔËÛ™ÁéÓ…ôĂƠ‡º–Ó ÏÅÿ¯¶„ô ù׿ßÛ«‚ ½9›ˆÔ±đÑÄëéÚăà߈ăˆŸû:Û«‚ ½9Ú½—˜߈§ô—ŒÏԩӷšȽ›¾ưÀêÔÛ«‚ ½9€½×¿8Á|èß«‡“Íj™‰kß [ïS±»°»Î ́Ö™‰kß [ïS¡ÈéÚÓØ«»¶Å»ï½¥½™‡ñÚµ.¥ÙÙÚưÀ±Ă™‰kß [ïSù×¥‰ÍL…ƒvÍĺÙ̉±‡±Á™‰kß [ïS©ùê£äÏÅ™‰kß [ïS›Ú“½ưTơÔù×ù×¹Ú¥ˆ]1§Ô€ºĂ¼íÓơêÄÔ9¥‡Ï̉¶ Ç™‰kß [ïS²Â‡¿£Ç½Ô¹å­¾ùêÛ×ËÖĽ‡¿¬¼¼¶;;ƒÙŒë*«ÙÜçơæ̉‚ØûŸôÔĂÙ›¾±»ñÚ̃ˆÓºÓºïÚ·‡‘×8癉kß [ïSëÚÛ«‚ ½9ÅØÏÔôĂÙ÷ÚĂ¼g‡Ç³ÂƒˆåÛ«‚ ½9ÙÚóÂß„ù¿ưÀ«‡“Íj¯¾Ç÷™‰kß [ïSÏÔ¡Èÿ¯¶ö„Ø µØÙÚĂĂ ›­±àéMµØơÚ‹Ç“í—G÷ÁÛ½ô«ÔçÚơêÅ_ÏÄơÔù×¹½Ÿ}á ƠߌÛ,Ăº·Ó ¥0¥ÆÙ½£ÔăˆŸÁ½µØçŒ—¶ưÀ·ÔÉ€§Ô±»áƠ߈ưÀùëµØ™‡ºÑ«¿‰ÏÅ9¥‡×¿»Á¼Û«‚ ½9±Ó%›¾ÅØÛ«‚ ½9¦ÔŸѶ¯¼ăˆŸ;·ÔÁù׫‡“ÍjÖÆĂÙ›¹ăˆŸ;kÏöăÁ¥Öư‡±ù1‘ԭ؆ڰ¿ Î̉ăàÑÓÙ½ăˆŸ;¿‰éÓĂÈĂƠÏß߈Ơù¿‰¿IŽăˆŸ;k÷Áÿ¯¶ĂÓ¼ŸÏÅ‚¾ÑØɹ±»µØ½€»‹Ç÷$ưÀơèÅÏÔ÷Á›¡̀¼çÚùê†Ç‰ơƠ¼€µØï»ƒØëöÇ¡ƠÅÔä̉·„˜‰j̃ZîS…»Úù×ßÖô¹Áù×Ǽï ‡ºå̉ ²măˆŸ;ù×ÏÔ±»Ÿ»«Ôëö§ÓÁ¹¼³zÛ«‚ ½9§ØăˆŸ;ÿ¯¶‡ä¦Ôëö¿́÷ÁÍÓ߈ÿ×ĐÄ꛾ïƠÁ‡é/×:ÅÓÛ×9¥‡“Ơ·Ü§Ô„a9¥‡×Ú½ƒvù×Û«‚ ½9ÓØ¹Ú°¿߈%›¾öÁª‡’̀j£»‰»Û׃ˆ¨ÇñÖÏÔ™‰kß [ïSƒvƠ¡«‡“Íj¼ø×¶«‡“Íj•ÂÇÖÛº߈™‰kß [ïSùêöºÑĂ­¾ÙÚñí÷êƯº߈ó$½·Ô%ăơù×ÛסÔçØÛ«‚ ½9‹Ü˜‰j̃ZîSøê—¾Á'ÅØ™‰kß [ïSû㙉kß [ïSó#¹ÚǼ¹ÚÚª‚ +¼9³ ÅƠưÀÅØ»Øï½í=³×÷ÁY³ÇơÔơê×¾±Ô©¼°»È̉Ở¬€ăà¸ÁÛ×ùêâˆ:߈©Ơ¿‰ÓÔĂÙ·ÔßÁëöÓº…ôº‡ŒŸ\›¾ÿÚù¼Û«‚ ½9˜Á÷ÁôùêËÚ¸Ú÷$•×÷ÁơÔ%ׯ…»ϺƒvÂÙáêïö—¾ưÀ·§D ÙÚ߈麙‰kß [ïS±»›¾Ñ4ăà±»ÛǪâ ÜÓ ‰đ±»¡ÛÁÏ̉ƒ×—°›¾­ăˆŸ;ÛºÖ̉§Óá ù×ÍÓ˜‰j̃ZîS™‰kß [ïSÑ̀È»ÏϯȻ£ÓÙÚƠ¾G÷ˆ©‡¥2ßëM·º½Ăƒר±»¶ÛáßÁ±»ø×û(ÿ¯¶©¼–»¹àÏÔÙÚ½ú(ívƯÓ ±»߈íÑĂ­½¼ÿÚû;¥‰ÍL…½íÆ¿‰ưÀµØ8 ¤‡ ÙÚù9¥‡Ë¿¯Èö½«ÔÅØ°»ù×ÇÖ¾¡ƠÓż‹ÇÙà¹Úëöí—G³߈«ÔơêÇÖä̉ù×ÇÖ°¿ÖØăˆŸ;¼°»é¾ñÄ·Ôù׎¸ÈƯÓ ¥Ü³ª©Óö±»9¥‡óÇÏÔ·Ô߈™Ô—¿—Œơꙉkß [ïSº̉ăˆŸ;ƒ‹ÇéêËÓ…ƒˆơ»ï½˱Ï£‡Û«‚ ½9ăˆŸ;ôêà ĂÙçÚ9¥‡Û«‚ ½9ç̉·Ô¯Ü±¿¡Ô½ÿ¯¶»ÓËÇ©¼ÏůƠ‡º“Û‰ÛÏÅĂđ÷ÚơêóÂùƒ˜«ÔÛÄÓ‡Œ“ƠËƠăˆŸ;kÓº́±»ùê»ÁĂÙ߈Ϲͪßæ±»ÎÚ́Öÿ§•ÉïƠăÇíƒv߈©Ø½߈ÓÆíÖƠ¾GĂỢijÏÅßÄÙϼ¡ÇƒṿÔÛºщĂÙ›wûƯ™‰kß [ïSöùדƠ¼€¼ ß»û½¿‰¡Á÷Ù‡ăÙ½߈©Óµ̉ăà™‡ù×ô…‚àüÆ߈ùׇÇêÖưÀ±»±»Áưˆïºƒà«‡“Íj©Óùêåq߈÷‡ë¼«‰„·Å÷Á̉ØÁƯƒ×½ÔăˆŸ;kƒvÛ«‚ ½9¡Á›¾³ ô÷4‡ºÙ½¯¼ÓƱ»™‰kß [ïSợÄÓß%‚á ›¾ĂÙáêÊكևLJ¼ÙÚ™́Á‡é/×:߈ÑĂÂÙ×¹•ƯÍÓ§Ôư£ăÊŒÓǺ«‡“Íjˆ ÅÓÏŨ¼‡ÚưÀßÚ«dÛ«‚ ½9Ϻ½™‡é´™‡·Ô‹ÇëÚÙŒë*«ÅÔÊÓ©¦«‡“ÍjŸ}™‰kß [ïSÏÔñÚ¿ºÚ×™ëéå±»°¿ Ơùêùט‰j̃ZîSËÉ9áêùטêèä߈ëö±»…Ơâàëöâ»»½‡ç®ÿ¯¶ív½€¬Ô ¿Åáç¹ÚơħÔăˆŸ;¹Ú9¥‡ßÄÙ«‡“Íj§Ô¿¹ó©ˆóÔß»ûëÓóÂÏÄAÎÅá˜߈ăˆŸ;ˆƯ¯ÁÜñ‡Ù½ăơ¸ĂºƒÚơ‡ÿǃ¾‘½ÙŒë*«“Æ«»ó½Á̉‹Ç•½«·3uUơÅưÀĂÈëö©¼ѹƒˆ©Ă÷Úù×ơêĂ¼«‡“Íjû̉½àùׇÚÁƯăơ½€‰„¥È¿‰ïÁ²Â“È߈߈¿‰ï‰YÂÙ±»ˆƠ/ш±»ăˆŸ;×¾8€Ơ™ôàêÇ«‡“Íj¶9¥‡×ׯ‡Û—¶߈¼€ï³2Û«‚ ½9«»°»ĂÈÏŃàù×ëöƒ×½Á½™‰kß [ïSÅØÏÔÍÇÑ·ăˆŸ‚ˆ«ÔÛ«‚ ½9ƒˆÛ«‚ ½9¡Âƒv¥Ä®¼¥¡¾ºĽ߈öÛ«‚ ½9ƠºmÁĂ߈̃ˆëö¥Ø½߈›¾ăˆŸ;‹Ç«»ÅÙ±»ÏPëә׋Ü߈½Ö¹»½«‡“Íj­ÄÄÓ«‡“ÍjÁƯ„Öù×·Ô½ù×¹Úù×»½߈ËÉ9…Ö›Úùê·È©Ç¿‰ù×Á̀ëöîŽƠ¥¿™ôăˆŸ;«Ñëö«‡“Íj߈öÛ«‚ ½9‡ÚùêÅØ8”¤‡”Ö+Æ̉ºÏÔï½½±»“Ơ·‡‘×8ç̀Ê)èÛ8¤Ó×ÿ‡ׯ·Å«‡“ÍjƒvóĂÏÔÿ׳ Ü›¡ÛÜå̉ ÔX½ĂÏÔ߈₫®¶ƒÖ©‡¥2ßëMÅÔ›¡¿ßÓÔ›¡ÓÁưÀÁĂƒvíØ¡ÈÀÙ½ŸÜ¶ăˆŸ;Ûö½€öÁơêăˆŸ;±»…µƠ«‡“Íj¹ÚÏÔÛ«‚ ½9ÏÅ«‡“Íj‰¿IăˆŸ;ëö퇫 ©ƒ»5ܺÅØ•» Ëû³(çf™‰kß [ïS§ÑơÔ½Ă¼Û«‚ ½9ÁỮˆí‡À÷Á§ÈŸÅ߈™‰kß [ïS½±¿ÙívĂưÀ“Ơá¾8¤‡ËÉ9¹Ø·Ô˜‰j̃ZîSÅÓÍÄ¿»£‘é%‡×—»ÊÇŸ}Ï؇́v´³¾›ç¹ÚÅÓ9¥‡£ÔÁÚ¬ô>̉ƦƗ§Í»߈«‡“Íjƒv˜êèäêØ­RưÀ©¼Û×9¥‡÷Áô©Ó‹ÇÑÓ¹Úÿ¯¶·vÙÅØÛ«‚ ½9́vÑêö”Óö±»‹Ơ£»‚Ú‚vá}ß»û¯È¹ØÙ½Á̉“Ʒܘ‡ +ëö¼̃Á½¹ÚœÔ£Ç±»߈­Ä÷ÁƒvăˆŸ;ºù×ù×™à߈ÙÚăˆŸ;ÏźÿÚ¼Û«‚ ½9Û«‚ ½9™‰kß [ïSÚCơ꫇“ÍjgÈ¿‰Û×§Ô™‰kß [ïSÙù×¼ẳĂÙ®Gø«‡“Íj÷ÁưÀ›¾ơêÏ̉á ưÀơê«»ăàÿÚù×áÑÔÓ5“gesÁÅíê¡Á½ÓØÅăÖËÉ9¡È±»©ÜºÅÓ›¶éÛ«‚ ½9ﻇړ÷÷Ù́$ÍÄÅ»å¼ôÿ‡ÏÔÑÓ¡ÔăˆŸăˆŸ•½¡Ô›¾¹ƠÁ™‰kß [ïSׯÍÓÏÔô™‰kß [ïSơÔÛ«‚ ½9ƒv׼뱻©ƠÚª‚ +¼9ƒv‚½ «·3uUøê¹Úƒô°½¯Ø³½ÈñÖÙÚ©Ü«ÚùêçÚơèÅåëÛù×߈µØÖăˆŸ;™‰kß [ïSá=åÁÛ«‚ ½9ưÀĂÙôÄYơèÅ»ĂµØù殉¡Ûÿ¯¶«»ó›»ñÓ˜êèäÿ¯¶±»‰¿I½Çëö±»©Ó±»öЫԙ‰kß [ïSÍĂ“¹ƯN¡Ô§Ô߈Ù½ÍË)éÛ9¥щĂº±»¡ÁÓº‡ÇËêëöÑÄëóÂÙŒë*«Û×ÄØƒˆ§ÔơèÅÏ̉ù×Û«‚ ½9ß„ÙÚódz¾ç™ƒĂêö• +9¥‡×߈̃ˆ½ĂÍË)éÛ9¥½$¨È½€ÀĂù×±ëØµa™‰kß [ïSăˆŸ;çôŸƠêÚ­‡ăˆŸñÖÇÖ̃ÄØĂÙªÚ ƯÓ ûỤ̈Çö™‰kß [ïSÓÅ߈‡Ûˆ¥Æ«‡“Íj³ ÓÅ™‰kß [ïSù×߈ëöÏÔÙÚ¸È̉ºÍĂÙŒë*«Û«‚ ½9ôê½ÙÚơ«dƒˆçÚ¿º߈ŸÓ9¥‡½»߈«÷µ.¥ÙùêÚª‚ +¼9™‰kß [ïS¹Ú÷Á½‰Û™‰kß [ïSëÚàÛÄÓăˆŸö°¿¿Å—àưÀéê¯ùêĂÙ‘-­Ô§dÇÖßÄÙ¡Ûÿ«‡“ÍjơÄÛÚ±»µaÑÄë߈«‡“Íj¿ÍâˆÑÄëßÁ¶ÈÿÛ±»¿Œщ˜êèä«Ôă¥ơ—Ó«»»Øù×Ø× ˜‰j̃ZîSÛ«‚ ½9¶è×߈éÓÁËĐˆ™‰kß [ïS—¶ÏÄèØ›¾÷±»½ô­ÔßÄÙ™‡ơê­ÄñÓÑÓ½µØƒˆƒ¾‘ơê9¥‡ÎÔù×Û×ûÙÎÔÙ½ÉÖ±»­ÄÉÖ’ÆÑæçÚ…ƠƯرÀ÷Ù¯¾ÏÔÙ½Á½Ë̉ÏÅ«‡“Íj¹È̀ÓƯÓ ẳ°»ØÓ̉ƵØÿ¯¶èô‡xù×̣¶˜‰j̃ZîS©ÜñÆÁ¹½ï½ăàÇ”ÏÅăêơêúÙÅÓƒÎ̉8¤‡ؽ˜‰j̃ZîS±¼öÁơêăˆŸ;kƒˆ«»ÏÔơÅ̉ÆØ”îù׫ک%ÅØ­ÄÊÓ‰ÛñÚ™‰kß [ïSăˆŸ;ø×Û×ÁĂ«d·ñÏÓ߈ Ëû¹Úºơê‡]”ù×ĂÙĐÓƒˆ½€—÷Ï̉Û«‚ ½9ùêÇØăÁ߈¹ÚÿÚºÏÔ¹Úï³2½©ĂÙö±»ÏÄ™Á¥ˆ]1Ë%ÏÔáꆓƒØÛ…¾ש­ÄăˆŸøê¯]½…í$ÅÔ÷Á«‡“Íj°»Îű»ëöÿ¯¶·ÅÙ½±ëØÉĂĂº™‡­Ä‡óĂÙÅëÁÚß„̉½ø×ăˆŸºàƠ¹Ơù×ưÁßÄÙăˆŸ;kÍË)éÛ9¥™‰kß [ïSăÇí½ĂºÙ½·‡‘×8ç…nù¾ßÖ©ÇĂĂ ›­±àéM¿‰ߌÛ,¤Ü‹Ç¥Áª»$ùơ¾·ÅÓÆÏÄƯˆÙ½ñÆÙ½8 ¤‡ Ö ½Ă¯È¥Âƒ»ØưÀÓūӡÈưÀÛ«‚ ½9Ïű»‹Èív‹Ç½½€ÏÔ™‡₫5®¶5ù¿ĂÙßÄÙ¼Ă£Ç¯ÈµØÿ¯¶»ØÛ«‚ ½9Ä–‡Çù×ßÚ±»ù×µaѶ́v·ù×ß™ưÀí½ơê³ÂÏæ©ØưÀ©ÓưÀơêÑÓ‡k°½ÏÔơû±»¡ÈƠÛ×öÁ¹“ƠÁĂÅÔµØÁƯÙ‡Ï9…í—G¸à ăˆŸå̉ ÛºÁĂ©ĂăÄ£äÿ$Û«‚ ½9°¿ ±»“ÈÅÔ‡Ù½ËÜß»û«Ô߈¡ÛĂÈï»̣ÔÛÄÓù×·Ô·¼Í7ºƒˆ›¹Áñ¿±ÈÔX˜êèäçÚ¹Ú÷‡ÖÓÁƯăˆŸ;ÑÄë‰Û£Ø±»ƯïñÓÀÛÙ‡Œɶ±»°¿ßÚĂÈ₫”îµa°»ƒ½ÉÄăˆŸÚÆƒvăˆŸ«Û¨ÇËÇ߈±»ºùôëöÁƯÏ̉ư<™‰kß [ïSëö¡Á›¶éɇÚêƒv×¢±»·‡‘×8ç߈©‡¥2ßëMăˆŸ;±»ăêăˆŸ;kƒ½ăˆŸ;̃ˆ Á¿ä½€ÛÛ«‚ ½9Ơá=đù×ÅÔ÷ˆ¥ØÀĂù׳Èö½ Ëû£×ÓơĂù×Ñó›Úº±¿«‡“Íj½жóԡȩ؋ÓÚª‚ +¼9ÏÔ§¹§ÔÛ«‚ ½9ù×₫™Ó‡×¿çƒˆ±»Ù½™‰kß [ïS“ÈÁ½º߈ôêç­Ú/ÇÖ̀öơ«‡“ÍjŸÖçÚÏÅپٽ³ƒvưÀ“ƠÏÔ«‡“Íjÿ‡Û«‚ ½9¾½°»¿²‰Û¹ÚÏÔƒˆßÚ߈íœǺÁ×±‡ ÙÑÓ±»ëöº©°©¼§ß™‰kß [ïS“‰3Ơ,ù‘éù×…Œ°»ñÓÏ̉›·Ô«‡“ÍjéÓ¯‰¯0µØÏÅÛ«‚ ½9§¹ÏÅƯÓ íäûÓÓÅ›¾¾Û«‚ ½9£ØÛÀ±½‘ÖÚª‚ +¼9¡ÈÏÅÿÚ߈ƽèÇ%đƠÁ½ɱñÓÓÅ¡Ư¹ÚÑÓñÚûÜï»߈82¤‡2Ö áÛÎÚăˆŸ±ÁÁ׫·3uUÓ́ÿÚÛ«‚ ½9ÏÔí—GâḈívÑÓ³ƠăˆŸ;†Œ—ÓăơÁ‡é/×:ï³2ăàôê·Ô9¥‡é½¾‡¡ÔƒvÛ±»©Àù×Ûº¯È˜‰j̃ZîS«‡“Íjù×­¶²Æ9¥‡µÈ½ºyˆ˹ È¾º¹½­¾¤ˆ\0´†9¥‡ÁƯív¡q½öå̉ Åàß¹ÙڣؑÙùדƜ¾ơêŸ8¤‡ÅÀÛ«‚ ½9ăˆŸ;ÄÓẩĂ ÏÔÑÓăˆŸ;¬Äû(å׃w£ƯÙƠ…öϼƠÚƯ¸÷‡³ï³2»ộÇËÉ9³¹å¿ñÓÏÔG½¹ÏÔ釾́ÏÔÏÔ‡ºÙ½Ϻ߈¿º§ÔăˆŸ;³…X›Û“ƠÅ–đØ…Á°¼ØăˆŸ;kĂ¼ívÑӯș‰kß [ïS…ƒv·ÔÛטêèäÁ¼µØµØÏÔ匿NËÀΈâï½½«ÔÛºù×Ưß¡Á©Ó¼ƒvÙ½¢ä±»›¾ß»û9¥‡×ö±»«â©¼ơê©Ó¶  «·3uUÛ×ü¦†›¾ăˆŸ;«‡“ÍjưÁ9¥‡×¼»ƒÚÏÔシܱ¿̉ŃvÂđ˜‡ḯÛ«‚ ½9ÍË)éÛ9¥«‡“ÍjÂÈÛ«‚ ½9‡º˜‰j̃ZîSŸÖÛ«‚ ½9Ž«‡“ÍjĂÖÛ«‚ ½9‹Ç»Ă³ï«¼ƯĂ¹ÚÍĂÙÙÚ“½ëöçÚ­ÄƠƒˆÛ«‚ ½9ñÖ³Ó®ÙÚ«Ú߄۫‚ ½9‹ÇÙ½Í߈̃ˆ±»ơêÓƠñÖóÇăˆŸ¼‡™‰kß [ïS¯àăˆŸ;½ëÔàƒvçô‰Ô¾ù׿àÙŒë*«¦Ôñ•ó¶˹ëØµ†ÏÄ×ĂÛ«‚ ½9íÖ¡Á´ê©Ø“Ơ߈“¹ƯNå̉ Á½ƠơĂ¿‰Ơ¾G…«»‡°»©Ø÷$§Ô‹ÓÁ¹ψÍB9¥‡X¹ÚÙÚư‡±ù1Ù½µØ½‹Ùâà9¥‡™‡½ƒ¾‘«Ô÷å5ÓÅÀ·Ôœ«‡“Íj™‰kß [ïSăˆŸ;» ø×·Ôù×ưÀù׿»‡º­ỡù×̀ +Ê) +èÛ +8 +¤ + + +ƒ×—¶µa¿ßÏÔëöÁ½‡•{ăÁ ËûÏÔ±¿éÔ׿8ÎÅử×¾á́Ø™‰kß [ïS߈×¾ÖÓ́گȽÙÚ·‡‘×8ç°»ăˆŸ;Ă½¾ù×ƯÓ ™‰kß [ïS•{§½Û×½™‰kß [ïS÷ê…äçÚ·ÔÄô£äë¼ăê¢ÇơÔÅÀ©‰¿º±»߈£»¸Áơ…n™‰kß [ïSăƯ™‰kß [ïS¼Ô™Ô–Ó›¼…»³×«dù×˹¿à«»ơêÙŒë*«ĂÙå×›¾Å–×$ÍÓÁĂÚª‚ +¼9ƒvè‡'ƒw›¾ø×§Ø’™‰kß [ïSźÏŶ‰Û«‚ ½9…ô‰¿IơĂµØ·‡‘×8ç™ÁÏÅÅÖ¼¡ÇÛ«‚ ½9ÏÔ½Ö¿Æëö§ÔÀƯéêËĺ¼µ́­Ö¹Ú«ÔƯºÿ +óǤˆ\0Ù̉ù×ù×Ơă¼‹Ç«d·Ôô£äÛÆ‹Ü±»ÏÔ‰Ûù×Ă®×#¡%Ϻ½ôíÖăˆŸª»ù×éÚ˜êèä©Ó‡x¹!Û«‚ ½9ª‡’̀j§…éÓÛZ÷Ú˜Á÷Á¯È±»ßÖơê˜êèäô±¿ËÇơêăÚ°»«ÔÙ½çÚ½…€­:ÁåëöơêËƠÛ‡̀Ó +ÛÀ©¼Û«‚ ½9á ߈ô¡ÁÙ̉ûÓÀĂóÇǺ±»ªÔøêó·̣éăˆŸăˆŸ;âà—ÓáêµØß„•Ó÷ÁÛ×ĂÙỞ߈›¶éù׃vƒÖŸÈăơù±»ÓÅó»Å±½ɇ“ÈÛ«‚ ½9ÅÀ¼Ë̉Åӵط‡‘×8çăÇí›ÔăˆŸ;»yôơı»‡äÛ×ĂưÀÇ̉î²2߈«‡“Íjߌÿ§íÆÛ«‚ ½9©‡¥2ßëM·Ó ¥0ñÓơêƒØóß©‡¥2ßëMŒÓ£âä̉Ơ»½á ùê¡Á`ưI•×±»߈›Ơå̉ ½‹ÓÏÔ§ÔƒˆơÄ™‰kß [ïSßÄكי‰kß [ïSÏÔëöƒˆóƒˆ©Ç°»₫®¶ưÀû)ù×±»ëöÏÔ›¶é‡x±»ÿøÿÚ’ÂÏÔù×›¹›¶éƒ¾‘˜qơ¹»±»åĂ…Üêö›¾‚å̉ ¡ÁÙ½»ívÛ«‚ ½9ÙÚ‘ÖÅØß„ưÀÖÆóÔĂ×¾÷ÁºëöÜÂ$›¾Û«‚ ½9ø Ù½ăˆŸ;ÓÁ‚ĂÈëÓ¿ÙĂÙùׂv ñÖׯ¼¹Úùëêö ߈ƒv©¼˱ĂÙ´Ø›Ûï½ÙÚ¯¼߈ÁƯÓØß»ûëö½¡Ô&™‰kß [ïS·‹ÇÖ9¥‡•½ĂƠĂÙÁ¼»£ͽ›¾™Ó¡%‡íêăàùשӂ¾¿Å¾́ªº ¡Á‹Ù«‡“ÍjăˆŸ;kº‹ÙÛÄÓ‡ƒˆåÁŸ’ỔÏÔÛ«‚ ½9“Ơù×±»±»®ƠªÚĂ÷ơƒvƒvó–ĂËÉ99¥‡×溳؃ØׯÏÔ9¥‡×ÛÆÓØÏÔ™‰kß [ïS˜‡Íăڵسأ»5ùê¿ßíØƒĂù×½ĂÙ£‡ÛÄÓơºưÀ‡#íÆÁƯÙŒë*«Å™Ü«‡“ÍjĂÛ¯G‹ø½±»ửôêëöÍË)éÛ9¥½ͼëöÏÔ…&ßÁơÔ¡ÁÓˆ•=‘ƒv£Ưù×̀¬³¹¾¹xÏÅÅÅÿ¯¶ËÉ9©‡¥2ßëMñ×Åô¿ôÜÓ ™‰kß [ïS9¥‡Å‡ŒÁ‡ŒÑÄ뫇“ÍjƠá=ÙÚ‰¿Iƒˆ¹ÚÏÅÎÅ‹œ̣ǽÙÅëéÓÛˆÓº™‰kß [ïS™‡ÑÓ±̉£Èôêׯ½ôåñºùסÛñÚ«‡“ÍjÙÚ·‡‘×8ç«Ó—¶ĂĂ ›­±àéMíÚơèÅ»ØóĂù×ù×ù׫»ÿÚÙ½µØË¿Î̉½ÛÔXƒ÷Á÷ÁÛđăÇí˱ÉÖÂØ¸Ó̉ù×±»ºÛ‰Û߈ÛöÂÙÖÆƠ¢ÇÓàÉ“߈½·Ô§ôơê¬ØÇ»«‡“ÍjÛÆëÖ¾›¶éíÜ釾ÿÚ¶(ÅØ»‡ëöƒv£ØÇØÙ½ù×Ù×Ù½Û«‚ ½9ưÀăˆŸ‡Œ©‡¥2ßëM¦ô±»ơêëöÏÅÙ½éÚÙÜù꛹ÏÅÍĂ¯¹ÚÿÚñŸăˆŸ;Ơ§Ó³(Ơ߈çôßÄÙÛ׹ؙ‰kß [ïSßÁÿ§½È·‡‘×8瘉j̃ZîS©Ó«»Å«ÔƒÖ¡ÁÏÔ§Æß»ûÓ̉ÏÅƠX£ÔÉ̉ÅÓ߈µØ̃„燑×8çÇ~¾öÁ—¶Û«‚ ½9Ûˆ‰ưçڥ؛¾ëöÓØçØv ½§ÓÿÚ߈ỂÑÓÛ«‚ ½9«Ó¾¤ÖÿÚƒÏÔ™‡Úª‚ +¼9ơÔ±Ïħôó½ĂƠé›ÛµØº߈‡(߈ÅÔáƠÜơÄëöÏÔñÄ½Ñ ±»·Å—»߈«ÚéÚœ‰A¾IAG½¹¹ÚÏÔÛ×ׯưÀù×.ăàưÀÛÄÓ§ÔƠ©¼ĂƠĂÙ±»ưÀ«‡“ÍjùꕌñÖ—¶¥ˆ]1‡Œëöß»û±»øôæØ¸Úơê©Ơ›Û­ÄƠ›¾·ÔÏÔáƠÜù×±»«ÛÁ·ÅäÁ½ôƯ‰ăˆŸÙ̉Û¯G‹øæZ‹ÇÏÔæÚ߈˹¾ƯÛ«‚ ½9ƒv™‰kß [ïSă»ăà‡ÏÔÓº¹Ú¦Ó±‡ÍÙ½ĂÙÅëëö₫®¶¬Û9¥‡Û×öÁ‹ƠÛÚÄÓ«»Ù½߈ù×ÏÔ·Ô›vÏÇÖ¶Ôù×»Èùׯ›¾Ǻ™‰kß [ïS³ÿ§ùơ¡»Û«‚ ½9Ù½¹ÚÎ̉›¶éÛÄ«‡“Íj™‰kß [ïSĂơÔ·÷©À‚¾Ù½±½ÿÚŸÖ•ºËÜ™‰kß [ïS›¾·ÅۙשÇ߈ï¶ăˆŸ;k×ÚæØ€º™‡£Èß½ÙÅ뽕ÖĂ¹Ú¯¼áêÏÔ÷ˆđÄ÷ÚÓŹØûƠ߈¹ÚÅØÛ«‚ ½9ĂÖƒv˜‰j̃ZîSí½Ơ˜‰j̃ZîSù×Û«‚ ½9ÁĂ£ÇØ×ĂÈĂÈ÷‡«‡“ÍjÙŒë*«‘ÆÙu‘[íÆçÚ߈ƒˆ§¹›Àùơ»ˆåÏÔƠù×ÿÜ©ÙÛ×½ĂÅäƠ±ØÉƠ9¥‡ÍË)éÛ9¥ÁƯ›¾¹ÚëÖơ»€º»ÿÚôêÛ×Ï̉ƠÏ̉’܋ǃڙÁ¹ø¡ÔƒàĂÅØ®GøÙ×ñ̉̃Åù×׿8›¾‡x³ÇñØ¿º«Ú¼ÔđÆ¡Èׯ«È©Ç Ëû¯¼áƠɇ±È×Ó½ÊÓ°»‡÷ÁƒàéÓ±»Áå™ÓưÀÛ«‚ ½9ù×߈á꽩ƠÙ×±»ơèŰ»¾ß«·3uU¶ỞăˆŸ;₫9¥‡ñ·̣ñƯ‘ÖÛ«‚ ½9ËÇ™‰kß [ïSϹĂâ¡Û™‰kß [ïS÷Ù»ØÍÄÙÚå̉ º½€©Ø™‰kß [ïS߈Û×ͼ₫§ÓăˆŸ¡ÔÁ½ÀâḈÄô·‡‘×8ç½߈ø×ßÖơêÛ×±½Û×éÓ—øƒåÅÓÙ‡Úù×·ÅáÜÅÓ%ĂƠ¡ƯƒÖù×±»«â»‡Ù̉á ĂÙ½ƒv8¤‡é á꫇“ÍjĂÙ™‡­½¼ĂÁ¹YéÓ9¥‡¬¾ĂƠ°»߈ù׃ˆ—Ó‹ÇƯÓ ÎÔÿ¯¶Û«‚ ½9ç'›¡¹Ú×Ơ…»³ô·ÅăˆŸ•½Äƒ¾‘ơé©Óøê +ÏÅøêù×ÿÚ«·3uU—Œ߈¿»ß9¥‡ÛÀÛ«‚ ½9»½ăˆŸ³Âå̉ ùêù×ÑÏÅóÇÛ«‚ ½9ë¼½€½±»Û«‚ ½9«‡“Íj9¥‡×›¶éùê§Ô—¶‹ÇÁĂÏỔÅ”‹œH«‡“Íj»ØĂƠÁ€Ǽ˜‡߈ă½ù×ôơº¿́§Ó¥ˆ]1™‡’½“à“¹ƯNƯ$™‰kß [ïS½ÏÅ›¡‹߈ơê½ô‹~¿¹߈ëö½Ø‡êưß»Ø÷$χŽ©±ßơÔµ†߈ØYöÁÏÔÁÙ߈×Ơ±ÁÏÔÙ÷‡±»›v߈¹Ú”º™Ó«·3uUö9¥‡óÂÅÔ¶÷ÁÑÓ‡߈‚vχ«‡“Íj©Ó¹½ÁÀ̉á íÖ›¾­Öª»„ÔăơÏÅшëö©Ü™à«Ô·ÅÇÖ—»ù×™‰kß [ïS߈÷Á×¼›¡¶ÚÓÔŸÖ—ºù×·º½Ø̃„‰yÓÁ₫ÇÇĂ¯ÈÏg™‡ÍÄñÓƒvéôƠ‹Üô¹ÚÙÅëá$ƒÔûÓ‡ßÚ…Ç­ÖñÚ™Ôÿ¯¶ß»ûÏ|Ÿ µØר¤íăˆŸ;ă»ơĂ× Á*³ÆçÚX—¿£äÅØ±»»ÁÛ«‚ ½9§ÔÿÚÙŒë*«™‡™‡­ÅÔư¬ÆæÚ«‡“Íj¿º£ÔƠ™‰kß [ïSßçêöĂÙŒ¾ñÆÇ™‰kß [ïS©‡¥2ßëM«‡“Íj™‰kß [ïS…»ѶçÚœ·̉ ¤0ĂÙÅÓƒv›¶éÿ¶‰ºÏÔÓÆ©¼ö¥Ö‰ƠïƠßÚ߈™‰kß [ïSÏÅ̃ˆÖ¹«»ăˆŸ;±ëØÏÔ™‰kß [ïSùêËÉ9±»¡ñÚ½ÍË)éÛ9¥¡“È•Œß»ûÓÔçơơ‡·‡‘×8ç˜êè仃Úùơª‡’̀jơê¹Ú·ÔÛºù¤ăˆŸ¯×å̉ 8¤‡‰Ø“Ơ9¥‡ׯơꙉkß [ïSŸèÏÔÈÿÚ‹Û¹Úù׫‡“Íjרcv߈½•Èû›ºăˆŸÖ‰ơ½߈áñÚÙ½¯àéÓăˆŸ;kăˆŸ;ÙÚ‡œà·‡‘×8çϼø¼¬ÄÀÙëöÿ¯¶ÅÓóÇư§‡µ.¥ÙƒöƠ‘ơù×±»¼€ơê܇ñ5ÆÈ—Ó߈©ÇÓ̀™Á™‡ÛµØö$ƒÖÙ½™‰kß [ïS¡Ûű»߈›·ÔĂÙ¯¼ĂÙ±»™‰kß [ïSưÀ‚Ñ·—ŒÁ½·Üƒ×ÎÔÏÔÉ̉ׯÅ0±¿ĐÓ«‡“Íj¹Ú߈™‡ñÖ¾íÖ·º¹Ú¯+ï¬Ä¹ÚÙ½YÍ„«×³³È߈µØƒv¸ÁÇÓÖ¾‰ÔŽ߈ó°¾Á̉©‡¥2ßëM·Ô‡èÇÖñÓ™‰kß [ïSƒÖ߈«‡“ÍjưÀÑÓŸ¿÷Îêö™‰kß [ïS·Ó ¥0ÏÔ™‰kß [ïSù+©Ó¯×›¾ơÔ¡Ỡˆ߈öÁÏÔ‹Çá ¶ÚÛÄÓ߈ÛÀ°¿£»ïÁÈ̉n©&ưŒÓ̉‰¿IÍË)éÛ9¥ϼơêáˆÁ0q̀Ê)èÛ8¤Ž¼ơÔÏÔ9¥‡Ăôơº›¾߈ă*±»éÓºù×·Ó ¥0µ™ÁÙ9¥‡±»™Áƒ™‰kß [ïS™ôƒØ©Ç›ÚØÓ‚ví—Gƒv‹ĐÛ׸·Ô½ÏÔÀ¼¹ÚăˆŸ;ơêɇÙ½¹Ú¡á¬›Ă‡ŒŸ\Ơ¡Æ¡Á9¥‡Ă™‰kß [ïS©‡¥2ßëM³©·»߈Ù9¥‡߈ƒv Ḉv«‡“Íj·‡‘×8ç™ÓàêñÓ·‡‘×8类ϿưÀ—Óă÷Á«Ô±»™‡³ºóÅ÷‡á=¯Ơº Ö †‡ ü2 ëöëöăˆŸ;káƯä׋íÑĂ߈™‰kß [ïS«‡“Íjï»âˆ½ÓÆ‹ÜÀ¹·¼Í7ñÚ‹~˜‰j̃ZîSĐÓ¯Ơ†Ç ÏŰ» ˜‰j̃ZîSù×ÂÈׯ§ƠăˆŸ;k­€Ä×̀Û«‚ ½9ËàßÁ·‡‘×8çù×ÁÛ—ˆïÚƠX¹ÚïƠơê߈ôê߃µØ…Ơ߈éÚâˆ:™ØÅôÎÔª‡’̀jêöµ߈Íå‚vƯơùơ×¾™‰kß [ïS«Ôä̉Á̉ÍË)éÛ9¥ù×ß»ûëöÛ«‚ ½9±¿«Ô«‡“Íj±¿Î£ Ë̉¢äơêëö±»»ÁÅÔ™‰kß [ïSÎÅ­Öùו¾·Å·ØÙÚĂÙĂ$ƒÔ™ô¸àYöÁ6Æu°»ùê»ôÏÔñ‰ÑĂÎÔׇ½7×$¿¹™ĂûËƠÚ¶ +è +߈߈³Ở›¾÷‡Ù©‡¥2ßëMׯ™‰kß [ïS¤ˆ\0ĂĂ ›­±àéMŸ}ÏÅ߈ƒ•ăàÁçôơêÓºÚ×ơê±»Ï̉ÙÅë߈…‹ëÍƠ™‡ÿ‡ØƠÛ«‚ ½9߈߈ª»ù×ù×ÛàĂĂ ›­±àéM­ÖăˆŸ;­¾G½¹ƒÖ¤ˆ \ 0 Å਼ÅÛ«‚ ½9 Êû˜‰j̃ZîSÁĂëö9¥‡“ƠăˆŸ;ÏÔ«‡“Íj±¿ÏÔăˆŸ;å̉ ™‡ÿÚ±»ÑÓ·‡‘×8çĂÙÇÖ¡ÁưÀ¡Ù8¤‡×ĂçÚ½ưÇÜÓ ôê߈¥ÓÁ̉ơêÓà=éÓơêµaÏŋܗÓẳéÑÓ›¾…ù¿·Ó ¥0Å–ÏÔöÁ߈Îÿ¯¶¶ĂÈùסÔëö—¶ëö‰Ôר½µØÛ«‚ ½9°»©¼‘ÈÏįȋÇăˆŸ;¯Èä̉½½ØÍÓƒvéJé‰Ó5“gesÁÅÅØÛ׃vù×ÏÅÔª¼ù×ăˆŸ©ÜÀÙÙ½µØ÷ÁÏ̀ĂÙÅ Á¶Ơ¼Û«‚ ½9ßƯÇŒ‡Ú¾¹Ú¶ÂÙƒvËÓ·ÅÆôêµØÙׂvăˆŸ;ÍË)éÛ9¥°”¶ºÛ«‚ ½9Ù½˾ĂÙï½ÇÖăàÍË)éÛ9¥£ØƠ“º‡Çù××ÜéÚÅØ̣Çí—G—ˆÀĂ çÚëÔïÚù×™‰kß [ïSăˆŸ;Áă•×…öăˆŸåÁĂ£Xơèũӫ‡“Íj±¿«‡“Íj߈Ù€ÓưÀéꙉkß [ïSư‘釺åÁÍÄưÀ³½‡öÓ¼ĂÓÅÓ̃ˆÙÚƠX÷‡ÍË)éÛ9¥Ưº¯¼÷ÁăˆŸû¢‡ºÛ«‚ ½9ëöñ"ï¥5µÏÔÍË)éÛ9¥#ñÁ‰¿I߈8¤‡°»µØ¯È‰¿I­«‡“Íj³ÈăˆŸ;kÅôÏÔ—́·Ô߈™‰kß [ïS¡ïÚÙ½ÙÚ³†ÂÙ±»Áˇxï‡öÁù×µÀ™ÁÛ«‚ ½9ÏÔÛ«‚ ½9¼Ô9¥‡¯¼°¿ǼăÚ·‡‘×8çÉƠ“ƠëÚ±»ºôê£\³ÏÔÿ¯¶Ơçô·ÔÓԵؽ“¹ƯN߈ívޱ»±»ÅÓ°»ÅôÙƠÛ«‚ ½9…ƠÁ©Ø߈ÍÓƒ½ˆÓ +ôÔù×¹Ú—¶±»ơèŶÔLJŒ·ÅÅÔÛÀǺ…ƠÂÖ£ä«»ăˆŸ«ÔáƠÛÔÿÚơêÏ|ÉĂ«‡“ÍjѶ«·3uUƒđ³Âù×Üù×ÿÚ“Æ«ÔǼ¹•£ä×î™ëéåËÓÍÄ»n¯Èù×÷ÚñÁ»Ûº¾…¾˜Û¯È8~¤‡~փزº̣«ÑÑ´­Ä߈…ÖÏÔϼÅØ£ä«‡“Íjƒv߈•Èû›ĂÙªÚëöƒv¥ˆ]1ù×”¹Ö«‡“Íj9¥‡¹ÚĂôô÷‡©¼¥ÓưÀëö½ͼåĂù×›ÚŸÖ½ÇÖ₫®¶‡ÇÀÁ(¯ƒ…Øù×ÅÓщáàµØ™ÁÙÅ냈™ÓỔ¶¸ÍÓψÏÔ«%ŸóeăˆŸ;‡ºÛ«‚ ½9ù׋ÜÛ«‚ ½9¥Û·ØÅ–ăˆŸß%ÏÔ½ù×ÑÓíê¥ƯÏÔ߈¹Ú‰ÙÚ™Á±ëØÉß»ûĂÙÁÛ©ºÆ›Ă÷ÁÑó¾ºÏ̉Ø×½ÙƠÛ«‚ ½9Ûº¿Ù•ŒߌÛ,̃Á±»›¾ƯÓ đÆäƠĂĂ›¶é¾ÓÅ©¼ăˆŸ“Æ£Ưº­Ä͇Ở‡ÚÑ+ö߈»º…»ÿ.µ.¥Ù‡̣½½«‡“Íj•½«ÓßÄÙĐÄêϱ½Øƒ–¶ù²·‡‘×8ç·Ô…»Û«‚ ½9›Ô™‰kß [ïSç‘çÇëöàêô­€ƯÓ ăˆŸ;k‹vëö¶ô Úª‚ +¼9íƠĂ‹Üơèʼn¿I§ÎƯºÏ̉ùê«»ÏÅå̉ °»߈ÀƯ9¥‡×ÓÔ‹ÅÙ̉ï³2£XÍƠƯ‰ĐÓơú±»́Æ›¾߈÷Á€ÇÏ›¶é“Ơđس̃ˆºÁ÷‡ÁĂ9¥‡¡Á߈ÿèỞï»ëöêöÍË)éÛ9¥º¬Ö߈µa·‡‘×8çûثԛ¾÷¾«ÔóÜ—ÓáĂƠø×ËÇ™‰kß [ïS₫ ®¶ 9¥‡™‰kß [ïSƠô₫¶·¼Í7°»ˆô™ÔƠÛ׫‡“ÍjÏĽô³ĂÙ›¾¥Ç߈Ñ`›¾ơÔÛ×ÍƠáêÓÊÈ9§ØĂôƠëö›¾ÅØ“Ơ³È£ä‹Ó½ÈĂÏÔ©ºĂÙ² ™‰kß [ïSº·‡‘×8ç›·Ô¡Ô±»±»Ûºÿ/ËÉ9˜‰j̃ZîSµØív¼‹ÈÙ̉Ù½Ă¼ÏÅéê÷ÁƯƠ¥ÈÁĂÿ×›ơĂ‰Û½ÄØ÷Á™ëé婇¥2ßëM±ÈưÀ«‡“ÍjÔå̉ ÅÓ©¼²ÂôŸ}‘±îÚñÚ§ô³–߈Í‘ ÍË)éÛ9¥Ž›¾½›ÛưÀ”%›́߈²ш¡Û߈ƒˆăˆŸ;ß„óÂÏÅÁÅै]1™‰kß [ïSÁĂëö›ºǼËv忘ÓÏŇă॓÷ˆ™‰kß [ïS©‡¥2ßëM»ĐÓ«·3uUÿÚ¥ˆ]1¡Û±»ÑÓ•ŒÍÓăˆŸƒwƒĂĂÈù×àÔYôµØ»Å§àÏÄëö™×‡Ư‰߈©‡¥2ßëMƒvá ăˆŸ£äùסÔơ¹ÚÁ‡é/×:ív‚v߈™‰kß [ïSŒ¿ăˆŸ;ù×ñÖÏÔ›¸Á‡é/×:óÇñÓŽ¿ßơâ­ÄỞÑÄëéÓöÁívµØ™‰kß [ïSƒvŽÏ̉©ØñÓ®G ø ½×¹9¥‡™‰kß [ïSíÆ×Úö¹Ú»ăÊÛÀ°»ûêÙ›¾ÿ¯¶ÓâÁ̉ù×ÓÅé¢Úª‚ +¼9ßÁ߈ÏÔóÇ™‰kß [ïSç̃Ÿóe©Ç̣–­µ†ÙÚ¸Úư¿‰§Ô½­Ô·#·¼Í7ï»™‡ëÔăˆŸÏÜö„˹ăàÙÚ­½¼ÀçÔ߈¥n±»©Ø±ĂĂÖÆ±»Ï̉ű»ăÇí³ºóßÄٵص4Ôơ/ÏÔƒv™ÓóÂÿ™ûƠÅÁÛ«‚ ½9ăÁÅ–«‡“Íjàö×Ü™‰kß [ïS©&«»ȇ½ß„ÑÓăˆŸ;€ºÏÔÏÔö°êØïÁ·ư¼“ÛÁSÙÚ÷ÚÏÅ™‰kß [ïSƠÂÙÙÜÙ̀ß»ûƼ°»ñÖĂÙĂÈ›¾èêôꪶ2tT₫!½í—G™ëé剿I±»ø¿´±̉Ơ‡ºÍ¥±»ô؇߈‘Æ“âíÙÙY±»±»“ÈĂÙ«%÷ê¯Èƒ¸¼ö™Áù×ƠÙŒë*«™ÔÙ½ôª¶2tTăˆŸĂéÅØö©¼áö‡ë‰íº×àÏöéÔ׿8㻵ơêÏÔÛº‹ÜỂËƠßÄÙăàר­Å›¾çÚ‹Ûû¶ÓÅ„ødË̉é¼ăˆŸ»¡Ô߈±»ÔXæîÚ½áÓưÀÉù‡¿́”£ –ˆ·ÔĂ߈Û«‚ ½9‹Ç½­ÛÇ“ÈÖÆƯÓ ¾£Øí¹‡ºăˆŸ;щĐØ¹ÚËÉ9Ù½¨Øơê¯ÈÿÚ±»ÙÅ뺱‡ÏÔẳ±»íơ§Ô˜‰j̃ZîS“½ƒœÜcßÄÙÙÚÏ·öÁĂÙÑÅѺ{í—G«Ô™‰kß [ïS“¹ƯNÅÔơÄßÄÙÑÎ÷ÁăÇØ¶Å߈ăˆŸ;܇Œ¯́‡ŒÙƠ¡ÁÏÅ߈ç̃«‡“Íj±»Û«‚ ½9̃Öµa±»£Ư¯×Û«‚ ½9ïƠ·Ô«‡“ÍjÚ×߈àƠ‡ŒåÁÊƠ«‡“Íjͼɇù×ÓÅ…%¾ß¥ÓóÔÚÆÙ½±Ô·ÔăˆŸ;·‡‘×8çËÉ9÷Á™‰kß [ïS¿¡È߈½ÎÅ ©È©‡¥2ßëMËƠÜ-ßÄÙ½™‰kß [ïS™‚–ÓÙÚ߈Ø™‰kß [ïSû’íêµàØÓ©ÓñƠ‡×îƠä̉5¡ÁíÅưù€ºƒˆÏÔù×ơÔù×­¾ù×ÍË)éÛ9¥©Óѯ™Ô½éÚăơÿ¯¶ó#™åĐÄêăˆŸÿ¯¶¹ÚỞÓ̉¡Á·Æ·¼Í7ăˆŸ;ù¿ù×Ö¾8ß»û½ĐĂ¹½À̉¡È䌾N¸ÚëöÙ½÷ˆÍÄ‚v¡ÈÏÔĂÈŰÑ߈ó¶µB«Ô«º8¤‡×ÓăˆŸù×ņ“ĂƠ˜ÔơêêÔÀÙÛ׃vóԎ׼¿Øÿ°ŸÅëÓơÔÓØéÓƠù׫‡“Íjô«ÔÑ ×¼»Á‡¿߈·Ô£ƯÏÔ±»çÚ«»ª‡’̀jÅÓ™‰kß [ïSÚª‚ +¼9óµØ߈ï»ÏÄöâÓË×Ù½ÂÙß\ÇÖµØ÷å5ÓÛ«‚ ½9éê§½™‰kß [ïSÛ«‚ ½9›ÚÏÔ™‰kß [ïS›¶éÿ¯¶ÁÛ«‚ ½9ĂÙÎÔŸŒ«Ôù×ƯÓ ÏÔ¸ƠÖÇ߈­)½Ù½í—G¦ô· €º±¿ĂÙĂôÏ̉­ÄóÄáÛ“ƠÇÖª‡’̀jËÇ·‡‘×8甋Ë%ĐĂ8¤‡₫µØ‡¿ÏÔ™‰kß [ïSÛÆ›·ÔôƠ¼ÏÄÓØôÄöÁÏÄÇĂ×Á™à̃ÄØ›¾º«Ô«‡“Íjé¸9¥‡«‡“ÍjŽµØ±Ñ·ôĂĂ½›çĂ٢ǘ‡̃ˆÖן¡Ưùꛇ̣Ä́v ÿ¯¶µa߈“È×¾«‡“Íjùê¥(«‡“Íj¹ÚïÁ«‡“Íj¥–ÿ¯¶íJ¸½ÅÓ±»µa˜‰j̃ZîS£ä“ƠÎÛ«‚ ½9¿ØµØï½Û«‚ ½9Û«‚ ½9±»ºçÚëÚ߈߈‹ÓÔÜơ$8¤‡ỞÍăؓÍĂơÔçµ­Ö—¶ƒvçÚ«â÷ˆ§Ô­Ä§Øå‡à ‰É̉™‡÷Á­¾¥ºÜûƠå̉ ÿÚƠĂÙ·‡‘×8ç±»¦¹›Áƒv±»Ø×ÅÄÚ»̀ö̀ăˆŸ;μØ“Æ›¡—ØĂ×$¹Ú©½—Ó™‰kß [ïS¦È¶¾¾»‡ÄعÚĐÄ ê ²¶߈ÏÄÉ̉Úª‚ +¼9ăơöÁù×Ë̉ăˆŸµØä×á°»Ñ́£äÙ£äÙÚ±»Çèëö±»Ơ»ñÚ̀ªÏŜ›v÷àôñÚ÷Ùٽー»ÖÆ5ÿÛºÁ«ºùê¬Ä™‰kß [ïS«Œ¿¹¾¸ÚĐ¹Û«‚ ½9½œÜÏÅ¿‰›vï½û†̀ÓûƠÛº±»ÅỐơå̉ ¯×ù¾™µê×ËÓ³Äô˜‰ j ̃    Z îS ä̉ÖÆ +̣ÔŸÅëö»qó¶ù×ó±½öˆ…ö«‡“ÍjÍÓ³·ÚăˆŸ;ăËÏ̉’½ßÁÛº±»¯¼Ë¿«÷ñuÑĂÅØ÷‡߈µØߘ¡È߈ù×­R‹Ç½€«‡“Íj₫®¶±»™‰kß [ïSó©¼ăÂö„ØăêỔ£ÁÁƯ…ô†Œ›ÚÏÔ´ØÓºÙ½ÓÁ±»“ÇĂÙ•Èû›“ƠÎÅŸq£Ô½™‡߈ÏÔ™‰kß [ïSơê±»«‡“ÍjùêóÂûÓ߈·Ü¸ÚϺ±…Ö9¥‡¿Â9¥‡÷Áô¡ÁÏÔ‘—»«‡“Íjâà 9¥‡¹Úëö½ưÀƒv¯E“Ơ«‡“ÍjÑĂĂÙ̃ÄØÛ×å̉ Ån½öÁ(°»½ôÁ"¶Ù½©Óœö:ưÀÔưˆ˜‰j̃ZîSăơä̉,,ĂÙăˆŸ;¢ä‹ÇÊ%ƠXỬ›¾8¤‡ÀưÀÍË)éÛ9¥Ûº³ºó™‰kß [ïS·§D ­Ö»¯È³Á‡é/×:¥ÉĂÈ™‰kß [ïS‡×ƒvÙ½ƯÚ±»Ơơ·‡‘×8ç½ÈưÀ®¼ ÁĂù×ăˆŸ™‡ÙÚ₫±»èêµ.¥ÙóÇ߈ƒ×Ï®¼ œø Ôºl—¶ÿ¯¶ÏÔ«Ô߈¬¶å̉ Àù×§ØƠÚ³•Œù×ÙÚăÚù×ÿ¯¶̃Ä Ø ÑÓăÁÛ«‚ ½9Á¹÷Á±»°È ñÓ™‰kß [ïS£ØẳƯÓ Û×÷Á¦ô +°»«»ƒØ÷ÁÛ«‚ ½9çÚ́v™¶¿ÅĂƠ¾ñÚ…Œæ̉§ÔÙ½ñ׫Xù׫»¦ôŸÅ˜‰j̃ZîS§ÆÓÂÁñÏÔ廀ÄÏÅ›¾ëöÏÔÅ­Ø…ØÑ+ĂC“Ơ™‰kß [ïS–¦̀»ùê¹Ú…»Ó̉ƒˆ±»…ÅØëöƠ¶ÅĂô¥‰ÍL…ÑÄë÷Á£äăˆŸ;8¤‡ÏÔ—¶Ä«ԑÖï»ù×ù×Ù½ÿ¯¶¡Á߈ׯ«‡“ÍjûÓº; ;Ö;†‡;ü2;ù×߈„½ëöŸ}³×µØ¥‰ÍL…̉ØưÀ­Ä¡ÛØÓÏԵؽ‹ÇưÀơ»˜‰j̃ZîSù×çÚ߈¡Ô³ºóïǃvù×™‰kß [ïSÜ̃ˆ—Óơêëç§߈³ưÀù×›¶éÑÄë‹É0ĂÈ™‰kß [ïSùæ÷‡ĐÓ³“Ơ¹Ú̀Ê)èÛ8¤Û«‚ ½9ưÀăˆŸëö«‡“Íjñ‹È÷Á½€½ÉåôG½¹Û«‚ ½9̃Å ÏÅœ‰¾IĂ¡Áù×çÚö߈Ợ¶Ç"Áå̉ ëö“éÛ«‚ ½9Ù½¿‰ƒÖỞ·Ó ¥0«ÔíÏŽ·‡‘×8窇 ’ ̀j ăÇíÙ½̃»úôĺíê±»ƠîưܾƒvưÀË%$ÿ—¾…ăàỞ߈뇥ˆ]1í‡ù¿X‰Ûæ'ưÀå̉ ÓÓ¼Ô¿‰çÚ‰¾‡ñ5»§¸ùë±»×Ơôù×÷Áï½™Á¹ÚÏÔ«‡“Íjùס‹Ù¿Ø£Ô߈ÏÔ¯Èù×±ëØ»Øщ‘ù‡Û±»û‚ƼØçÚö₫&ÓÅÁ‡é/×:µØ½Ă×ÚơĂ÷‡ĂÈûÖ߈»ná߈ëö½ßÁƒvÇÖ”Èú™Ó°»‡Œ ºăàµØ›ÔÓº·ÔÛ«‚ ½9çÚ›¾ª»Ç̉‡Ç£Ô×¾߈©¼±»ù×Û»÷Ûí—GưÀá¤êơŸÖƒ½–÷ Ϻç̉́vƒÖơĂ‹ÇóÔ¯¼«‡“ÍjÙÚ«‡“Íj­Ä¿Øÿ¿Ë¢Û«‚ ½9µaƒvÜÓ ëöØ×ÍË)éÛ9¥¼ôÛ«‚ ½9®»Úª‚ +¼9ÿ¯¶ºÁå̉ çôăà‘Ö©¼ơÔ«ÔǾ÷¾ÿ§™‰kß [ïS߈Í©ØÙ×߈œÂ…aÁ¾×Û÷ÁßÚØY©ÓÍÓ™‡ËÉ9™‰kß [ïSû“ÇÏÅ¡ÔóÂר¹Áÿ¯¶ÓاÔÙÚ½߈« ©ƒ»5Óº½¿uù×ăÁ‡x™‰kß [ïSúƠÙ½›¾̀Ê)èÛ8¤«‡“Íjăêï½ñÚù×ÏÄ·̣©‡¥2ßëM™×ÊÖ¯¾ø×ívÿ‡ëړȹÚƠáƯèêëö•×½½ÂÙ߈ỂÏÅơÔ9¥‡×ăˆŸ;ï~9¥‡÷Áƒv¯¼å̉ ·Ó ¥0¿º¶̣÷Úù×Ûó¥ǽ›¾·ÜÁăívù×÷ÁÓºÿ¯¶›ÂñÆ™ơæÇ©ÓÏÔ9¥‡™‰kß [ïS—¶Ïź±¿ơÔăˆŸ­Ô°»¡ÇĂ¼ụ̀‡x×ƠûÀăà¥Â߈ÑÓĐùׯ¾±»µØÙÚơê«üÉ™‡™Ó¹Øö©‡¥2ßëM½Á÷‡ÑÓëö È®Gø“Ư÷ˆ‰ÛÂÙ˜‰j̃ZîSëöÓØ¡ÔÚÀ߈ơ«‡“ÍjóÄƠïÚ«‡“Íj•Œ¨ÓÑæ«»Ó.ÿÚ¡Áß»û‡º»̉§¹˜‡—»́ơÁĂùׯÈƯÓ œĂ9¥‡×¶Ï̉íäƠµÍÇÇĂÑÄëÁĂ«&ª»½¶çm¹ +ưÀ÷Á¹Ú³u‡úëöù×ëÓÜ̃ÄØ¶Ü¥ÓÓ­¾ׯÁĂăˆŸ;÷‡±€Á¼Óƃر»¾“ƠơÔ¹ÚĂºơÄàĂëöùêŸÄ›ÔÑĂ·ÅÚ½‚vÛÀµØëö¡È®¼ÙÅ뙉kß [ïSƒÚ9¥‡×Û«‚ ½9߈±»ëöï»›¹ơèÅëöÙׂÖĂæ˜‡¡Èƒ½ÙÚχÛ«‚ ½9ÙÚ¾9¥‡ăˆŸ;ƒˆ°»…Ư½߈ÛÀÁ¼ÁĂÙ½ßÄÙưÀ›¾ù×ñÁµØăˆŸ;߈ÏÔêöĿر»ûØÓ·‡‘×8çÓ¾ÂÙÿ¯¶áöª¼¾ºù×ĐÓó|ăơ½ƠÚ÷ÁỞ¿ôÅĂÿ¼­€Ûº§Ô›¾íưÁ±̉ä̉ÙÅë·È©ˆÏ̉±»߈±»ÍË)éÛ9¥ôÔ»½×¾‰¿I™‰kß [ïSăˆŸ;É̉ƠË÷«‡“ÍjËÈ©Ơù×—ˆ̀Ê)èÛ8¤‹Ç‡ºàê ÏÄëö匿N±¿Å Û÷å5Ó¸È9¥‡Ånù›ä̉—ˆÏÅç̉äôơêÅâ9¥‡ỞØ߈ƒØ½¸ÚăˆŸ;«‡“Íj¤ˆ#\#0#Ûº´ađÁÙ½÷‡ͺ9¥‡÷ˆ¶Å«»ñÖăº»½öÜ·Ù½÷Á›¾ĂèÏÔưÚµØÙB™ÓÙÚ›‡“Ó±»×Ơ¿Øư“ư‡±ù1Á¾ơêçÚÚÀ¾ùד½ׯ‡Œ‹ÇÏÔƒ—뼫‡“Íj©Û×ÏÅ‘ÆׯÖÚ«»Ž¼ôó×á=½ÉĂÖÓËÇ›¶éưÀ­ÄÆ̉ơÄív›¾‡Œ™‰kß [ïSÏÔ½ÔÈ̉ù×æÚ½û¹—ƒØÙ½÷‡ÁË߈ÑÓ—ÓÛ¹¡Ô½³Â»Ư»‡¥Ûä̉·̃Ù½±»ßÚÏĉ)µ½ÑÄ볈9¥‡£Ó§ÓµØÑÇŒƒvßƯ™‰kß [ïSå̉ Ơ²(ù×™‡Üˆ©Ó¼åÁ£¨™‰kß [ïS±»µ†Î̉ù×߈‚¾Û«‚ ½9ÎÅÁÅÓÿ¯¶¸Ú€êØ«‡“Íj߈ëö¸Ú©ÓµaäôÛ«‚ ½9߈˜ÁØ1ïÚÑÓ×¾ψéºƯÓ «‡“Íjá ¯¾™‰kß [ïS¬Ö½‡Ú…Ûô¦Ó™ÔƠéơÿŸêö·ÜÓº›¾÷Áɇ¿Ơº½×Ü¥ÛÙÚ—˜‹æÙ×ƠỘ«‡“Íj¿ôéôáê߈ª‡’̀jÁÖçØăˆŸ;ÜÓ ºƠXƠ¼«‡“Íj©&…ØÙ½ưÀ›¾¡Ç±»Û«‚ ½9—¶Ê%ëöº±Å‘½ÔÏ̉ƯÚËƠÿ¯¶ˆßÚÏÅ߈‡ĂÙÓăˆŸ;kóÇ‹ØY±»±»ÅÁĂçÚưÀ˜êèäÖÆÛ«‚ ½99¥‡ÑÓăˆŸ;€Ơ½€ÏÔ凫 ©ƒ»5ÛÅ ëöƒv›¾ùÏÔñÓ™‰kß [ïSÛ«‚ ½9ƒˆü÷€́vØÚ±)½ª¶2tTÏÔó«Ơ‰ÆñÁ·Ó ¥0…ô÷‡ÅÔ¡Û™‰kß [ïSñÖÏÅÏÔ·‡‘×8çׯ«‡“ÍjµØ«Ô½ĂÙÅë߈߈ëÔËÉ9ưÀÏÄåĂöÙ½߈¯ÛÏÔÛÀ̉¿½ưÀ¹Á±”Û«‚ ½9«ºŽä̉ŒuăˆŸ™‰kß [ïS‰•×§Ó¼óÂơÔ¥º‹Ù«Ô›½ëöÙYëö°»§ÓƠÙÚĂȶ߻ûÁ¹Ô°»½÷ÁßÁ߈ÏÅÛ«‚ ½9ÏÔ·‡‘×8ç߈‚vŽÁø¿™ëéå¡ÛÛ«‚ ½9«‡“Íjơê‹È¹•ƠÚшÚŸ»«·3uU9¥‡Û«‚ ½9»Û«‚ ½9—ˆ½Á¼ăˆŸ;¾ׯ$„؃vÍÓ«‡“Íj½ô©Ó®ƠËÛëöăˆŸ£ÇÿÚ­ÔÙ½¹Úɇ¹»ÑÔÓ5“gesÁѾ‘ăˆŸ£Ø߈ÏÔ‚ˆ/½ăºƒÔăơ‡ŒÙ½ÇÙ½å̉ ô¾ßưÀµØÿÚ8¤‡9¥‡üÀ–¶«»°¿ËƯ±»ĂÙ™‰kß [ïSâÁ‹ÈÑÓÖ€·‡‘×8ç·ºµ†‡•ŒéÓ½ƒÖÏµØ­Ä·Ôź…™‰kß [ïSÏÚ±»ăÇíÙ×辫Խ¡èÂÙơÔ›Ú¾ßԣاƠµØ¶—¶¡Áö™ïƠÑÓßÛ—¶«‡“ÍjÛ«‚ ½9—ˆëöÙŒë*«§Æÿ¯¶¼ØºÙ½Ù½ív Ç¶¥ˆ]1á¡ÁéÓ߉¿(߈Ž›¾‡›¶éÏÄÿ¯¶߈«Ôéºáêëö™‰kß [ïSƠ%߈ËÉ9Ăº½€‰¿I·ỐơçÚăˆŸ;kçôơê¥Ö«Ú¹ÚÓ̉ßÖù×Ù×é‰ñ5ñ·áÅúÓæÚÙÚƒ½°»ëéÓ—¶ÏÔß§Ơ‹ÇơØ¿‰ÿ›ÅÔƒv9¥‡Û«‚ ½9߈ß»û¸*…“Ơ§Ô›¾°»Ư‰«‡“ÍjщÛ«‚ ½9½ëÙYñÖơê›±¹ÚăˆŸéÓÓ̉ëö—Œ›‡ÓƱ»½ª¶2tT®¾¾˜‡ …»†ºÏ¿‰¿Iÿ¯¶ÑÓ£ØÛ×Ă×ƠÑÅ‘Ö÷Á«‡“Íjư‡±ù1ßÁ±Ô˜‰j̃ZîS»ĂơêĂÙÛÇÑĂ½Ô½ù×Ë÷ÙŒë*«½­d÷‡ѯºÅÅÓ™Óçô½ŸÅÁ‡é/×:“ÆƠăˆŸ;˜‰j̃ZîSá°Ï̉Ă…ƠßÁù×öÙ½•›Û«‚ ½9éÚÛ«‚ ½9±»ăˆŸ;ưÀư‡±ù1ׯÛ«‚ ½9ÏÄéÚÑÄëÙÚíØÅÔÅØˆ8m¤‡mÖ8¤‡Öö¶¡È˱÷ÛÏ!íÓØÓÀí$™‰kß [ïSóÔ‹È÷‡̣^÷Á½ưÀ₫³S³ƠÛ«‚ ½9߈ÏÔÅ–ÿÚÏÔ°»•ŒĂÙƯÓ …ũثÔÛ«‚ ½9ƒvÿÚô»ˆ£ØºÓå³ÈƠ¾½¾×Ơ߈ÅÏÔỂ‰¿IÏÔ•Èû›™‡™ÔÙŒë*«ÜÛ«‚ ½9߈º¨¼±đÙ½áƠùƯÿ^ÏÔ£Ư˼«‡“ÍjăˆŸ«‡“ÍjùןèëÓ¼¾†¿ßÍÇÏÅ«‡“Íj¿ºæØ¼ù×·¯ƠŃv°¿ +ÖÓ·‡‘×8çÿ¯¶¡ÔÙ½”ă½§ÈëößËÓÛ×5« ©ƒ»5ËÖơê±»¹ÚÎԵحԩºó#ñơóƒÚÏÅơv›¾›ÂçƠÅÄ߈•₫Á¹«‡“ÍjåÁ…ùôÛ«‚ ½9›¾ÇևׅʭĢXÓØÅôºÏÔµ‰ăˆŸÙÅë±»½™»dž½Ž“Æ‹ÜÛ«‚ ½9ó Ơ…—‡º½ÛÀù×µ†‰™ăˆŸ;åăĂÙ—»ÇÖùêƒØ߈™Ô9¥‡Ù½ß»ûÿ§öÛ×ÓĂ¼¨Æ½ÏÔ¿çÁ̉—Ó¾ăÁ¹ÚêÓµØÛ«‚ ½9¹åëöÅÓëöơÔÓ¹ßƯׇtÓ~!ñÓùº§ôÇØÑÓ§ô÷Á£ÔÁ‡x£ëªÚÁ€¼ ±»Û«‚ ½9éÓó‹ÇØơÔ’½ù¿ßÄÙѶ‡xµa9¥‡QÙ½«ÚĂÙñÚ߈­¾Û«‚ ½9³Ç£Ø©‡¥2ßëMŸ»ÇַصثÚơÔÿ¼«‡“ÍjÙÚ­ñë̉ƒˆÅÓÇÓƒv€¥ØÀ¹›œ˜‰j̃ZîS½ÏÅÅôß„›ĂåƠÁƯ‰ơ™‰kß [ïSÿø‘ÆÛ«‚ ½9Ë̉¹Úܧ›…̣ÏÔŽÛ«‚ ½9ï½ÛºôÙÚÑĂ©Ç׿8ÇÖïƠÅùêñÙÿÛ‹Û‡Ú±»ơÔÅÓ×Ü·–‹ÇçÚ†º±»îƠÓÁ›ÚăˆŸƠµêöăÁà 9¥‡ÂÙ½€›¾­º‡ºŽÏÅÏÅăˆŸ¹ÁƒƯ›¶éå̉ ÀĂæ̉·Ô©Çåùùæ÷‡™½€Å–ñÄéºÛºăˆŸøê®G ø ÉÖ±»×$Ê%ơÔù×ăˆŸ;ăˆŸÄÓ Á¶̣™ÁĂÙ½ă»÷ˆĂÓ‚vŽĂȸÚ]9¥‡Ă‡¿ÜÛ«‚ ½9½¾‡óÔ™‰kß [ïSù×ßÄỤ̀«‡“ÍjÏŇëí$éüÀ÷Áå̉ Ϻ´!щ«ÔĂÙơï­¾ĂÙƯÓ Ë־߃v½¥ˆ]1ù×9¥‡Åà«Ô¾Ù½«»ÅØÓØƠÑñ»9¥‡×¾ăêóÂỞ­ÖŸ}«ÚĂÙß߈ù×Ù̉û¿º‡“ÏÔáê‚vÅØĂ¼ëöߌÛ,Ó¾ѶŸÜÿÚăˆŸ;¾º«»ôăˆŸƒvÔ¾—F—ù¼ÚÀ#•ÍÄÍÓ˜×ÏÄÏÄç¾Óؽ™ëé嫇“Íj߈½ôÛ«‚ ½9ÏÅ™‚ăơÙܰ¿ơê“Ơñ†ăˆŸ߈óÇÙ×¹Ú¹à§ÔÄôÛ«‚ ½9¡«»º§ÔÁĂ˜‡£ØÛÄÓÁ¹˜‰j̃ZîSÍÉívÏ÷$µ‰§Øá¸½¾‡Ù̉ŸœÁƯÙ9¥‡9¥‡©¼Ù¾–»«‡“ÍjÙÚĂÙÁƯöÁ߈ƒÔ›Ûå»±»³Ø9¥‡ù×½€¹» Ëûó¶ßÚ¶‹Ü¦ÆïƠÜù×£äÛ«‚ ½9ÏÅÍË)éÛ9¥Ø×íÁ±»¥ĂưÀ¢Ô¹ÚóÔÆ™‰kß [ïSĂÙÇÇ"ÏÅưˆÔX¥Ă₫®¶©‡¥2ßëM×¹ÚŽÑØ±»ơûÿ'¹Ú™‰kß [ïS±»™‰kß [ïS̀¬H˜‡åÑØÅºùץغÁĂg©º­½¼‘³ ËûÓºăˆŸ;öÛ«‚ ½9ëöºƒëº ·‡‘×8ç¡Ô‡Úª‚ +¼9×ÓÏÔăˆŸƒˆơêƒÔơÁË®á ±»°¯÷ÁÓÔ·̣߈ÑÓ׿8˜‰j̃ZîSëöù×Ù½Æ÷ÙרéÚß»û©Àµ÷ĂÙ‡x¶‡Ö8æñÓóÄ×Ơ—ó Á ›¶é±»öêÛ«‚ ½9癉kß [ïSÂĂù×ÔXº¿(÷ÁÉ™‡ØÚçÚëöáˆÁ0q“º¯Ơ¶ï½¯È•Âӷܬ¾¿ôׯăˆŸ‹Ç »yá ƒv”‹ +œH +‹¾­ÈÇáÛ»Áù×Ç䫇“Íj…ŒÙÚỞß„߈²Ç±»§ÛƒvÙÓăˆŸ;ăơŸ}«‡“ÍjÓ̉¹ÚÛ×…ÛƒvĂƠ«‡“Íj±%ñÓÊđÛ«‚ ½9áÓø×—¶߈Ñ"‘÷»½Î̉“ÈïÚ“¼ö÷Ùơ|÷Á߈«‡“Íjƒ×êöñÀ$µØÛ«‚ ½9øêù(›¡™‡ÙŒë*«ß»ûƒØ«ÔÁÓëöÙÚĂƒvàöµØ×¼ÍÄ«»ÙŒë*«ÑÓ…ÖÅØå̉ ÛºÁÙƒvû㫇“Íj¯¾“ +ơê¡Èëöû¼ƒÓØ™ëéåƒvñ֤¿‰ëöѶű»ƒvº•Œ™‰kß [ïSȾŸ}ï½ÍĹÚÛ«‚ ½9¨¾¿Å‡º½øêƠ¡‚v¾ăˆŸ;k‹ö߈ÿÚ·Ø™‡ÿˆԽ›¾̣|₫®¶щ‘³Ÿ}”ĂĂ ›­±àéMÊÇá׃v°ĂăˆŸ;À¹ĂôơÔ·Å™‰kß [ïSØŒê*ªÍÇ£ÇÛ«‚ ½9ĂÙ™ôרơêèº8¤‡¹ÁÁƯÙ߈ëö̃ˆ­Â8¤‡½€ö퇥ˆ]1ﻼ™ÔăˆŸ;¬¾¥ÛÇØµØƠ«‡“ÍjÅÓø×ͺ©‡¥2ßëM·¼Í7Ù½ï²2ÛÄÓø×ơêÁ̉ƒvƒvßÖÓÁ–Œß„·‡‘×8ç×Ăƒ×ÙÚ™‰kß [ïSÍĂù×ÏÔ³ô±»÷Áö©ØÛ«‚ ½9ºÔéơ£äÏÅá×ç½Ù׃vơèÅíÛ«‚ ½9½€µØï»ăˆŸÿ¯¶ÏÔ³z›¾ôöéÓù×µÅ÷ˆôÔÏÔÁ½ƠñÚù׵ؙëéåßÅù½È£Øöơ ƠÔ₫ºç·‡‘×8癉kß [ïS±»íÖ±»‹Ç™ÓÛ«‚ ½9ăˆŸ;Ơ¿‰·ÈĂÙÇÖ½€ăˆŸơáƯ‡ŒÏÔÿ¯¶Ï̉ë¼¼ûÓßÄÙʾƒv½ψƒv¨º›¶é‹Ó™‰kß [ïSÁ̉Û«‚ ½9¹Ú±»ĂƠ§ÔĂÙUÙ#ÏÔ·Û«‚ ½9ĂÙ›¶éÅñÓÁ½±»߈ÅØÏ̉©ÇÏÅÛ×£ÇÛ«‚ ½9ÙYÎ̉‘÷ƒv½Ø¸Èêö¿‰·Ó ¥0«»ƠX́ºưÀÛ«‚ ½9ÑÓÙ½éêÍÄíÊÈ91÷ÚĂ«»¶ÏÔ†Œº‘ÆÏ̉ïÚëöÏÔăˆŸÓ¼½ØøơÖỞ±½°» +˜‰j̃ZîS߈ơêÏÔ¿¹߈Ôï½ĂÙ—¶±»­ÄƠ9¥‡9¥‡«Ô9¥‡×ä̉ÍåÙÚÛ«‚ ½9ßÄٵسïË¿ƒˆÙÿ×çÚ«‡“ÍjăˆŸï½ĂÙí=ÊƠßÚËƠÏÔ…»ƒˆß„ñ}¡ÛÛ«‚ ½9ÏÔÙ½ơêÛ«‚ ½9Ûº«Ñ׾ϡÛù×°»Ÿ}›¾5­ÄÏÔĂƒv߈¡ÔÅÔăˆŸÏÔÎÄưÀ­Äÿ¯¶8¤‡×ơÄÁ9¥‡×¹Ú—»íØ¡Èơꕽ™‰kß [ïSÏÄÿÚÛ«‚ ½9¿ôăơª¶2tT˜‰j̃ZîSƒvùײ¹Á‡é/×:óḈÚ½«‡“ÍjÙŒë*«ïƠƒˆùê…™‰kß [ïS‘ĐéÜÿ¯¶Û«‚ ½9«‡“Íj«d›¶é™‰kß [ïSµØÂñ5É̉°»̃Œ;Ú,$9¥‡×½Ư‰ơÄÛ«‚ ½9å¿Ï̉ĂÙäÁÿ¯¶ÅÓÑĂ¹ÚôăˆŸ;kÖĂ™ëéå̃ÄØ©ÓÛ«‚ ½9±”ÏÄôÙŒë*«Á“ĂăˆŸ;éº×¼™‰kß [ïS¾Åù×½ăˆŸ;kÛ«‚ ½9«‡“Íj¼ÔơĢ俉ùê—»Ù½½ØçÚÅ™Á¯×¢Ç“⩇¥2ßëM£äĂÙ›¾§ÓÏŮ½½¿ÅÑӵؓÜÖŸù×߈¥Øâˆ:ñÓÑÓÛÀơÔëöơï߈¥¼Ôé‰ñ5ñ·ößÁÙ½Ö™‰kß [ïSÎÅù׋ÜÍÄÁ̉‡“«ÔùÚçÚù×왉kß [ïS—ÓĂ×Óÿ§£ÇÏԥƷÔ߈·Ó ¥0ơèŨØßƯºÜ߈ºÛ«‚ ½9©¿đÛ«‚ ½9í’—ˆ•ŒÏÔ³ù×ăàÏÔó¶è騵Ø×̉Â’¹ÜN±»ß»û9¥‡¸•øæ߈é"Å« ©ƒ»5öÀưÀׯ˜‡¡ÛÙ×Yψúà•Ö‚Ô¹Ú—ÓÍģ䇺¿Ù•ö™ôÛÄÓ̃ˆăÇíÓ̉‹Ü¢ƯµØéÓ÷…ÅØÑÅ«‡“ÍjÙ×ĂºÙŒë*«ă÷Ú’¹ÜNêÓÍAÛ«‚ ½9Û«‚ ½9Û¡±»ă}Ơ´ĂÅÙăˆŸ;€º·¾½á ƒv™‰kß [ïS÷Á±¿ßÁÏÔĂÙ™‰kß [ïSơÔÙÚÙ½ÑÓå̉ ëöëö«ù×ÑóÛ«‚ ½9±»“ÈùơË¿ÍÛ±»ơ‡Û«‚ ½9±»Ă­vƒv«Ô“ƠÓØ÷öËÇåĂ˜‰j̃ZîS±»ÂÙÉŒ±¿Æ÷ԫԵةˆ™‰kß [ïS£äœÚăˆŸÿœçÚëö±» Ëû—¶̃ˆƒØÀ¹ÑØáơ¡ƯñÓăˆŸ;¿Å¯G‹ø¹ÚơÔ¯ÿÚ›¶éÍÄ•Œ½ÙÚ«‡“Íjç½÷ÁíÚ‹ÜÁ|Ó£äù׳߈­ç˾¯ öÚ÷Áù¿‡Œ߈¡Åàç˜߈¶÷ˆ«‡“ÍjרơÔߖコ·Ø›Úµ†ª‡’̀j¯È½$Ï̉ñÓ‘ÛǼÙƠ‡߈‚á×ÏÔÏÅÂÙ’Ơ“ˆźç̃“½å‡Û‹Ü«‡“Íj¹Ú÷ÁơĂÁ™‰kß [ïS‰ƯĂߙĽØé‡ËÓ«‡“Íjá«·3uŨ»ú×¾ïÜùë­È™ÁÎëöơêÏÅÛ«‚ ½9±»Ë¿›¾Íı¿₫ÅÓ°»™‰kß [ïSù€½½Ø†\¹Ú¤ˆ\0÷Ú³ôÅÔ›¶é™á¹=ö‡ŒáØ’Ơƒv·Üû(¡ÓÙÅë®Ơƒvç®­vÏ̉ÏÅĂÙ€¾˜‰j̃ZîSÏÔ¹»ƒváƯå̉ ™ëé嶇Ö8æï‡߈¯G‹ø¡Ô¾ØŽ±»Ăٽر»ƒvëöéêëöŸè¾9¥‡ ƠÑóºô»™‰kß [ïSăˆŸ;kÅØăÁù×¥Û’³¹ÿ×™‰kß [ïS¹Ú8¤‡Ö‰¿IëÓ™Áøê¡»ÑæÏÔÛÀÛ~æ̉¥Øß́Û«‚ ½9éºÙ̉™‡©½µé›¹°»ç’ơÔê‹߈Ë%íêÏÔ±¿½¾ßµØ÷¼ƒÔŽ9¥‡Ïå¹̃µØ¶è©Ç×Ó…¼½Ù»ƒăˆŸ;kǼÖ¹9¥‡Ù½¹Ùï½›…»§ÓưĂßÁ©Ó÷ˆ©Ü±»·‡‘×8çŽÙÚÿ$æ'ƒ½·‡‘×8ç±»‹Ç‰¿IâÛ«‚ ½9ÙÚÿ¯¶—¶߈ÁƯ¾Û«ÓơèÅ·Ôƒ¾‘ï»߈ﻳƽĂû ©¼±»ĂĂ ›­±àéMǼ߈Á‡é/×:ÿ§°»çڨ؇ǦÆăơ9¥‡½»‰ÛÓµOÑÄ븣™Áôêù×Ï̉Ľ‹Üǽ纛¾ơÔ¹ÚÙŒë*«ëöºÏ̉ßÚăˆŸ;׿8á v 8¤‡ÖÏÅ߈ôêÿڃי‹«‡“Íj÷ˆĂÈÑÄëÙÚ™×ͼôê߈̃ˆùæăơÛ«‚ ½9•Ü™‰kß [ïSöÙ½ŸÅÏÄ߈á=«×ßÄÙÂ艤³Âùº­ØÏ̉™‰kß [ïS¿¹û ƒv߈ƯÔñÓÏÅ÷‡éºÏÔ¾“Ơ߈éÓÅËÉ9ù×—¶ÏÅö…»Ï̉µØú(ƒvçÛ«‚ ½9Ç“÷ÁƠăˆŸÏÅûçÚÏÔ…%Ơ¾G÷‡ñÓÑØжñÓơèÅÍÓÁ‡é/×:뇯½™‰kß [ïSơêµØ©Ỡ»ú–»­¾ÑÓß»û…óÓ5—ŒưÀÛ«‚ ½9ĐØ7Ö$™ÓŽèơT™‡ÏŃv9¥‡™‰kß [ïSÁ½óÇ‹ÇßѳƯº§ÔÙ½ăˆŸ…Ö›¾í¹Ở¿ —Óí—GßÅà=ÁĂË̉íØóÔ™Á½©¼ñÁăơÿ­ơêƠçôÍĂ›¶éƒvỞ«Ô™ëéå…Œ±»Ï×Ăû™‰kß [ïS߈¡ÇÑÛYƒ…Ú©¼‡ŒăˆŸ°»¯ÈÛ×½9¥‡¼Á …»¯)ÏÄ»ØßÖ̀Ê)èÛ8¤ơÔÛÀƯº¦ôÏÅëö߈Á½¬Ö&Á ›¹ơ$₫ív¡íÅ£äĂÙºï½щ‰Ô‘O‡)‹Ç›¶éÏÔ³«Ôù×ëÔæ̉›¾÷Á±ÁëÔœĂ»ó9¥‡·µÙ½™‰kß [ïS™‡ƒù×ÏԻتº:ù×ñÓŸÛ‹ÇưÀÏÔ§½ăˆŸ±½ăˆŸ;k߈¥Âï»Û«‚ ½9ƒˆêÚ›¹«‡“ÍjăˆŸ;k‘%̣dz(£Ú½ĂôŽɹ§©Ơ‡ÇÅá›¶é±»¿åỬó¶Û«‚ ½9™‰kß [ïS߈ؿŃvéÓ÷Áƒv˜‰j̃ZîSÑÄë¯×³£Ççº߈‰¿I³”ù×åßÚÏÔ•Èû›Úª‚ +¼9×$·‡‘×8ç騷ÔÏÔæÚ˜‰j̃ZîS¬ô¡Ç™ÓóÇåḉơ«‡“Íj߈ăơ±»߈ÙÚ¡Á›Đ…böÛ«‚ ½9«Ô›ó©¼¥Æ™‰kß [ïSëö臼¯¼ÿ¯¶Å÷‡ë±»Ù½߈Ơ˜‡ÁñÏÅù×Ă­Ä¿ºÅØ¿́ÛÄÓ¯¾‘Ó±¿#ăˆŸ;̀ÓƠÚ·¦D ±»»Ø¹Úûر)ëÚ—Óù×ơÉ¿IËÉ9û(…»·‡‘×8盾¯.›ÔÑÓ̀Ó½€µƯ§ÔÉ÷¹Ú¾Ù½ÙÚăˆŸÛ«‚ ½9™‰kß [ïS›‡¹Ú‰¾‡Ç¡Á±»ÜƒÖ°¿Ù½ËÇÍÇöÁ±¿ĂÙ“¹ƯNû؇ºÙ½ƒvơÔù¾æØÏÔרÅÓçÚÍĐ̉£äÛ«‚ ½9ï½ùơ߈ĂÙöÅĂÈÏÔù×—Ó¿ô›·Ô±¿ƒæ›¹«âù×8¤‡Óº¥ØÓØÏ|™ơñÚ¯ƠÙ½÷ÚÑÓƒv8¤‡Óˆ•=‘ÁƯø¼Û«‚ ½9ÅÔ¹Ú©ÓÛ×ÏÔœÄ̉ưÀÁĂ«·3uUëöù×ßÖÓöơê’đ‹ÓỞ¿‰ï‡Ï̉ù×™‰kß [ïS¿ÿ¯¶« ©ƒ»5Ă™‡˜‰ j ̃    Z îS ¡ØƠXƒvù׫‡“Íjá ©:Å“Æç̉₫DZ¿•׫‡“Íjƒˆ½Ơ£Ó»Ë̉Û«‚ ½9ëöÏÅ­Øà ưÁàêË˱»ë…½ôÍË)éÛ9¥½…€­:ÅØÛ«‚ ½9߈µØ¯ÈẠ́"«Ôù׳¾ÏÅ‹Çăâ×¾áê·‡‘×8ç½…̃‹Ü¤Ù£»ù×ÙÜÙ½¢äÊÓ麭v£Ô¹Ú¶̣Ä̃ˆÑĂƒˆóÓ·‡‘×8çÙ½ơÔ±»ÏÄ@™‰kß [ïSûơĂÙ¥Ááù×÷å5ÓÁĂó–â¶Ÿ}—¶ưܧôĐ¹¡Ôƒv‰Ưƒ×˜êèä9¥‡Ù¥ˆ]1ĐÅ +ƒˆÍÓ±»µØ×¹Ù½Ö$¡Á™ëé娇¤2€̃êL½ƒˆ«ÔùêÛ«‚ ½9±»­Ô›ÚívÁăø×µØ9¥‡»µăˆŸưĂ₫\®¶\Ơƒv³È¾öׇ½7Úª‚ +¼9«‡“ÍjëöÅ%Ù¾ăˆŸ;kƠÓƒˆåÁƒÚ½€Á‰ÛÛ«‚ ½9…»É̉‚v‡Û“È¡h½£Xù‡“Ơÿ¯¶™‰kß [ïSÛ«‚ ½9ơÔ‡Ú‹ÜÏÔ‡ºÛ×̃½ÙŒë*«·‡‘×8çÿ¯¶…açÚÚˆơºÛ«‚ ½9Û«‚ ½9ïÚù׃½÷Ú¿ØÙ½9¥‡¼Ø¿ºø×XÏÔ­Ø«ḍ¶—ÜăˆŸ¾öÁûØÿ¯¶Ñ×§ÆÛ×߈ÏÔä̉ă‹Ù±»ö½æØ˜‰j̃ZîS—»ĂºÂ¡Ôá߈§ºƒưÀ̃ÎăˆŸË̉ËÉ9«·3uUÙÚ“¼ñÖÛ«‚ ½9ÓºÁ̉ÙŒë*«©ØÛ×ăˆŸă½ƒv«Ô™ôëö›¾»ÜăˆŸ;¼€åĂơê±»ƒv¿‰·Å߈óÇ÷ÁĂÙ½Ô퇙‰kß [ïS¤Ø Û«‚ ½9߈±½ÁÜ«‡“ÍjéôƠ·‡‘×8çÛ«‚ ½98¤‡ÓÆÿÚ±»ơÔêçÁƯ‡ÚÄnù×÷Á¯G‹ø›Ă‡ÇƠÚ“ÈÁíw™‰kß [ïS›ÁÛ»÷›¹Ăàá=ôĐÓÅÄÇ̉ù×Û×ûĂĐÄêƒvׯÏ̃Ù×»ÏÅ₫ÛÏÔơ#êöçÚÍäôêŸ\«÷§¹ׯµÛÚª‚ +¼9đ»ß»ûÇÖ¨Æ ơÔ½ơêƠµÚ¡ăˆŸơÔëö—¶ëöÍßÁƯ±”ÏÔù×ô˜‡“Ơ«‡“ÍjĐÓưƯÏÔÄØưÀ­ÖívÏÔ€¾ƒà¸ÚßÄÙ©Çñ‡¥×ĂÈöÎÔăˆŸ;釡ÁÈÛºơêŸñăˆŸÎŲÂÛ«‚ ½9á ÿ$ÍË)éÛ9¥—Ó“ÆÜÛÄÓÚª‚ +¼9ÿÚÏÄÛ«‚ ½9ÏÔ¾—˜ÁƯñƠ÷‡å̉ ăê¹Ú‡Œùꙉkß [ïS½±»Í·“ÆéÓÁ·‡‘×8ç­ÖáêĂƠÿ¯¶É“±»¾“È»½Œ₫³Ø™‰kß [ïSÛÄÓ·‡‘×8çÖƠÇÓÆÖÇ蛾¾Å»ÓÅĂÈív‚Ûº‡Ç©¼ƒ¾‘±»Í½Ôơùט‡½€±»Ûº‹ÜơêỞÏÅăˆŸ‰¿IÙY¹Ú˜‰j̃ZîS߈•‹HÅÇÖ9¥‡íꙉkß [ïSÏÔù×ëö«»¯×ÙÜ›¾«&ÁƯèºù¾ëö©¼÷ÔÏ̉ƒÖ¹ÚƒvÙ½ëöÛ«‚ ½9©Øƒv÷‡ÏÔăˆŸ™‰kß [ïSƒ‹Ç—ăëö™‡™‡ÛºÛ«‚ ½9‡µØ¡Áƒ½ĂÓŸÛ³ ÂƠàƯƠù×ÑÓø×ăÄ–÷‡́ű»Å߈ÿ¯¶ơÔâà´Ø¸ÚƯº›¶éƯÓ ©Ơß„ăà‹Çù×½ÙÏơĂỞ“ƣǹ»½ăơª‡’̀jù×öÁ·̣Û«‚ ½9¡Ô9¥‡Û«‚ ½9ơêÅôÓ³‹ÜÚÅÄ›·ÔÙÜơÔ‹ÜÊÁ ³ºóĂĂ ›­±àéMµö±»ôÛ«‚ ½9Û«‚ ½9ø× Û¯ƠÀĂ©‡¥2ßëM™‰kß [ïS‡ÓŹ»đÓÍƠöµØ‚ˆ«×ƒÖϺ‡º߈—ˆ‡ÏÔ¼ơèÅ«‡“Íj9¥‡ơÄßڵؓƠß»û™Øÿ§ù×éºÏÔ¾×ùë™ëéåËơÔôê ‹ÇÛºͪ¡Ô¸Úá ¿‰±¿ù×Ù½›¶é±»óש‡¥2ßëMï³2½€¡ø·Ô߈ùêºù׃vé¾ĂÙÛ«‚ ½9½ÜÍÄÇÖÙ÷Áû:›¾μƒvÏ̉Û«‚ ½9±»™ÓŸÄº…»ûØؽÿ¯¶«‡“Íj©Ç±»9¥‡á Ûׇx¡ßÍÄôƒà«ÄçÚ±ơ™‰kß [ïS—»ßÖ±¿ơèÅœ‰¾I™óÛÄÓ‡Úº™‰kß [ïSÙlj±6‰°‹¿ÓƯ×À½ưÀ©‡¥2ßëMĂÙ™Ôá ™‰kß [ïSơềÓ¥ÜëöçÚ™‰kß [ïS”Ö¼¥Ø߈ënÓØ½«‡“ÍjÏÔưÀ÷Áƒ½ÄÙ©‡¥2ßëM÷‡×Ú¡ÁÿÚº̉PÙ½™‰kß [ïSÎÅÇÖƒÛ«‚ ½9/­¾ºØÿ$ëö¡ÛÏÔí—GºÿÚ„Ø ËûĂĂçڅԵ؜Á½‡̃ôƒˆ¡Ø¿́¿^ƒvÏÅÑÄë±»å‡ù×›¾¦Ó±»ơØĂĂ›¾¡ÁÄÂÚ×ĂÙĐæ‡ŒÏÔ¹£éºïƠóÇÏÄ¥ˆ]1¬¶ÏÔ±»éÓ®¾½ëö¿º¿ô9¥‡ëöéÚÀËÂ$­ˆ“ƠăˆŸ;Û«‚ ½9§ÔñÚ‹Çû¼ó·¼Í7é׫d‹ÇÁñ»½µƠٽ凗»ăÁơĂÜèêÿ¯¶₫ÚͽƠÚª‚ +¼9«Ô9¥‡×ဣ4ßæ™‰kß [ïS›¾©ÜÚª‚ +¼9Û«‚ ½9—Œ߈ëöª‰kß [ïSéÔ›¾ ÁĂĂíꕌ­åÑÓÙ½¡ØÁăË¿®£Ư™‰kß [ïS«ÔÄÏÔ¡ÔÛ×ËÇ•ܾù×·‡‘×8çƯº‡Œ…ÔéÓ‡«Ú¡ÔÁĂ¾Å‡ơÔÓØψ¶è߈Åÿ.ÜƠ_©¼Ăºá¾Ç%ù×ïƠ•Èû›ûâÂ3á á Ï̉€ôăà§Ơ×¾ÛÓăˆŸ;źỬâˆ:k̀Ê)èÛ8¤íڇǥˆ]1†Œ¡Á§ÆÁĂ₫ÔăˆŸ;»‡‚vˆ×ùÁË·‡‘×8ç»Á™‰kß [ïS¢ +çÔ¡ăà™‰kß [ïS½€³ø‡Œ‹Ç߈8¤‡Û«‚ ½9óÔùê߈™‰kß [ïS½±ëØÛººÂ±»ׯŸ}Íı»©‡¥2ßëMï…ÔƠÙڟȇ™‰kß [ïS«‡“Íj©Ơ߈ăˆŸ©¨߈›¹ÿ&œ· ̉ ¤0 ™‰kß [ïSƒ×¿Ù߈—¶×Ă£‡áÛÙÓºÛ½ïͯÙÚơêÀƯÎÔăˆŸ;Ùે“ÍjѶß„÷»Ă¼½ăà߈¯£äŸ‰ÑĂÛÄÓ°»Ù½˜ơƒ½µØ™‰kß [ïS¥‹‚ăˆŸ;k¡Ôè߈8¤‡ù×ÁƯÛ«‚ ½9ÁĂåĂỡ9¥‡×ƒÖÏÔç' Ơ™‰kß [ïS°» ₫®¶À¹Ù×ÏÅßÚ̃ˆ¹ÚÏơ÷¼—»ƒÖá …$µØăˆŸ߈êö§ÆøêĂÙ›¾¡Ô‰9¥‡×ívơê±»™Ó‰¿IÑÓχëAÍĪ»±»“¹ƯNå»μרù×ÏÅăˆŸ¡Á­v±¿½€‚ÖÿÛöÁÛ«‚ ½9ßÁäÁǺđÁ ±»ßÚ«Øö9¥‡߈ưÀÏÔ½€“Ơ¹ÚÛÏÔ˜‰j̃ZîSÅÓ«Ô‹Èü¹̃ÏÔÙƠÏÄĐÄê•Çå̉ ©Ó™‰kß [ïSëöăˆŸ;±»ùדÈÑѼ×$‡ÇĂÙö£Ư±»ù×¹Á•îµa«Ô±»­Öơ‡ßÏÙ‡Ï9…ÿÚ¹±»±»¹Úíêưˆ¹¶ƒv“Ơ߈ÇÖͼ¿‰߈çôÂÙ 9¥‡ÏÅ߈ù×ëöùôß½ăˆŸ;ﻓÈôêăˆŸÏÔóÇĂÎʼn;ƒvĂë3߈ÏÔ…»“Ơ—¶¹ÚóÂù׫‡“ÍjÊÈ9ÙÚÛ«‚ ½9·ỖŒÚ,öö¶ăˆŸ;k¡Ôº»±»µØ¡ÈÛ«‚ ½9ÏšDZ»ưÀƒvăˆŸ;ÏÔÿÛÚª‚ +¼9ơêƠ±ôø¿‡×9¥‡ÏÄÁÓѶÁáÛƒv¹ÚđÙ½߈́v½Ă÷Á›¾™‰kß [ïS•Œ߈½¹ö«·3uUÍË)éÛ9¥ĂƠÿ¯¶ÏÔ˜‰j̃ZîSÙ½ăˆŸ;k¹ÚÏÔß»û™‰kß [ïS­Óù×÷Á¢ Ơ™Ô°¿·ÅÚª‚ +¼9÷Á“¹ƯNûàÛ«‚ ½9ÁƯμÏÔ¼ÛßÄÙªÔ·Ơ˜'ê'è'ä'ƒvÁå©Óˆø©‡¥2ßëMÿ±»ÛÆ›¾áêÏÔ«»ÑĂÙ½ Ô9¥‡—¶ôơÔưÚëö߈’ùÅ߈ÏÅ©‡¥2ßëMăˆŸëö߈µÇÖ±»ÙƠÛÚó´‘Æ¹Ỗ癉kß [ïS±»Á̉×çô9¥‡«Ô«ÜÛ«‚ ½9í#Æô‹Ç߈å̉ ™ôŸÏgß%«‡“ÍjÙ½¡ë½³Úˆ½È½ô߈Ï̉›¶é‡ºódzÓÑÓƠÓÅÏÅÙ½±½‹Üù׃½±»ÑØÑôơÔ߈ƒˆĂÙÛ«‚ ½9™‰kß [ïSÍÓ³ÈÀƯ¡ÔßÁ̃»úơêÁÓÙڣ䓽™Áù×èê¾¾û•¡Û߈½ù׳ Ù½¿º¯‰¯0Û«‚ ½9ƒƠÚ˜êèäÅ»ÍĂ߈Ç%Û×ô›¾×Üư“£»ÏÅ…¾Ù½ƠÅßÁ±»±»ƒ¾‘ŸƠ­Ö‹ÜùסÛÛÄÓ­ÖñÆÛ×ѶÛ«‚ ½9”¶ơº߈óù×ƯÓ ‰Û߈™‰kß [ïSÏǺÆ®Èÿ‡ÇÖ8¤‡ÿ¯¶­Ö߈™‰kß [ïSÙÛ«‚ ½9ÁĂƯçÚǼƠÿÂí—Gù×̀ÓÛ«‚ ½99¥‡‡¿ơÄƒØĽËÉ9ƒvï»IרÎÅơÔăˆŸÅá µØÙ½¿Ó‹ÜÚÀñÚơĂ©Üëöƒv›¡̉¾–¶­¾½€ÔÏÔơêÔÇÖÑŽđƠ¡ÔưƱëØùƒưÀưÀ«‡“Íj³àôÔ«‡“ÍjÏÔÛº¡Ô§ô¯È¯G‹ø±»¯àÏŰ»áô˜‰j̃ZîSǃvÙ½­ôƯ«ÔÚˆ¡È—Ó¾ơĂ߈ï½¹ÚßÄÙùסԦعڧÔëöódžǹګÚÑÄëǼÿÔªÚưØơă¡Ô™Ø±¿±»v•ŒÁĂ8¤‡ăˆŸ«‡“Íj­Ø²Ç½ĂÛ%ƒv Ơ½9¥‡™É“½™ÓÚÀۺ렩‡¥2ßëM«‡“Íjï»ăˆŸ…à±»ÇẴ·ÜÜ¢»ƒvʹƒv™‡«ÔÏÄ«·3uUÛ«‚ ½9ê$ ߈ʹ™‰kß [ïSËÉ9™‰kß [ïS­½¼÷Áß»ûùט‰j̃ZîSÙÅë…ïÖ«Ô£äÂñ»ÁƯÑÄë߈ăˆŸ;߈½ÛÚ±¿°»€›¾ưÀ·ÔØ×¸Ú^ăˆŸ;­€Ü߈·¿ËÉ9¿Ù‡ºÅ–Ưn߈̉ƽ‡xó›¾ëöÔÀÙ½Ú½ï‡Û«‚ ½9ƒv÷ˆ™‰kß [ïSáåĂ½ô8¤‡ÖŸ}Ù½£ôͼÍĂ˜‰j̃ZîS™‰kß [ïS¡‘°à—“Ơ¡Á©‡¥2ßëM•߈É ËléÚ¡Ô¹ÚÙ½ƯÓ ÇØăˆŸ;«‡“Íjơº—¶¿‰߈½€×¾‚vĂÙëö߈êöÓØ߈߈ù×ïà½ĂăˆŸ;ÂÙ¾ĂÏÔÏ̉߈âà÷å5Ó×Ü•½ÇâĂÙå˜àêÀùæ½€Ù½éÚ߈ùꩇ¥2ßëM8¤‡ÖŒ‰°6ùêÅ£ÔÇâöÙÚívÛ«‚ ½9«ÊͼÁƯ£ä™‰kß [ïSÛ«‚ ½9几\Ở¹ÚÓÁ±»¢ô«ÔăˆŸ;ÂÙÁÖăˆŸ;¡Û£ä¡È©¼›¹ÓÙÅëËÇÛ«‚ ½9ơŹ«Ô™‰kß [ïSĂÈăˆŸ›¾±»«»́½ÅÙÛ«‚ ½9ơú²ÂÏÔ«‡“Íjí½ëöú‡ñ5ÏÔ‹Çû:ĂÙơêÇÖ™‰kß [ïSû\ƒ½öÔơêă»°»÷Áà¬Ö¾8›¶é˜ôª‡’̀jóÓƒvµ.¥ÙÁ̉߈‡ŒǼ«ÑÑÄëµØªÚử—¾ƒvÁÓ¾›¾ĂȸÈË̉±»²Æ5÷‡’º ·‡‘×8盾9¥‡‹Ó»ÛăˆŸ;kÅÓÛ«‚ ½9ơ꛾ÑÄë“ÈĂÈá ³Èƒv›‰Û×°½ß«‡“Íj£Á˜‡‡߈£Ø±»·ÔœÁÙÚö¹̃ÏÅăˆŸ©½‹Çơ߈щ™‰kß [ïSº«‡“Íj¹Ú˜ô—¶©Ơ±́‹È·ÔơêÛ«‚ ½9“ƋDZ»ƒÖÁ̉×ĂăºÛ«‚ ½9ÏÅ¡È߈ù׃Ư߈ÅÓ°¿ơêăơ¿ÅÛÀ×ƠĂ Úª‚ +¼9âˆ:k½‹Ó¤ˆ +\ +0 +»ØÁƯƯơ½ô¹Úëö߈Ñ÷ăˆŸ;±»÷¶Ç"«Ôä̉öǺÏÄØÅ ê ±¿ăˆŸ;ơºỞơèÅϼͼÙÓ½¬¿«ÔËÉ9±»©‚ˆ¹ô߈ƒ½û9¥‡º³ÈÖ Ô† 6 ¦j ·ÔɇÏÔù×ăˆŸ;ÏÔÓù×ăˆŸ;ÿ¯¶ÑÓÄô¥Æ‚vÚ¹ƒv¥Ä°»«d߈ƒv©Üׯë’§ôŸÅëöËÓß»û÷ÁÙƠÓÅóÙŒë*«½€Û¶  ëö¨ ¡Ô—¾¬ÖĂĂ«‡“Íj㫇“Íj‡ùסÈ̀ĂÏÅÁ½¶₫&߈©ÿ¯¶Í­Hå̉ ±»»Ó÷‡º•ǵغÛÀÅ9¥‡×™‰kß [ïS˜‰j̃ZîS£‡½€±»ïÅ¥º̀B±»³bÅØ²zñÚ½ôë×ÏÅù×åơÙ½¸Úÿ–ÍƠ©Ø™‰kß [ïS›vöÛ«‚ ½9ÙÚ¼ăơË̉£Ç«Ñµ†ñÓÛ«‚ ½9µĂÿÚÅØ³ụ̂…‡º÷Á‰¿I€Ó¸ÁưÀ£äÛÚª‚ +¼9רçØƒàôl¡Ơ½«‡“ÍjƠXù×‰ÛÆ^ÏÅ›¾ưÁù×ù×›¾Ù½ÑÓÏÄçäáêơÔ—ăÓØ°»—¶½€‹ÇơÔùׯءÔÖÆ˜‰j̃ZîSÛ«‚ ½9µØƒÖÏÔ¦Ơß½ßÚ¡Áù×߈ÓØÍĂ·‡‘×8çÛÇçÔ¡›¡ÅĂ¢  È°¿½€ÏÔĐĂ«d—¶Ï̉£Ư±»Ÿ}ë§Û«‚ ½9ؽª‡’̀j Û‰àëöä·™‡º½×¾ëöŸŒר…ƠÁă߈ïsÎÅ¡óÇ£»ÅÓÛ«‚ ½9ù×¹Úå‡ׯø×§ÓƠÚؽ¡Áù×Û«‚ ½9ø×ùôü̉ ăˆŸª‡’̀j̃ˆî²2°»߈½Ù×ÓØ»‡8,¤‡,ÖƠ€Û«‚ ½9ß»û§ôÚª‚ +¼9âˆ:•ŒÍëöƒ¾‘ăÿÚĂÈÏÔôØ™‰kß [ïSƠÍ­H™‰kß [ïSùדƻĂàẶÇ™‰kß [ïSÏ̉÷‡«‡“ÍjÆØ½ǼÍÄ½ăˆŸöăÁ‡äË̉ơÔ™‰kß [ïS9¥‡×ù×ÅÓ™ô½ÿÚíØ½€™‰kß [ïSŽÙ×êØɇ™ëé噉kß [ïS«‡“Íj›¾Û«‚ ½9‹Ç˜ÁăˆŸƠ©ÓÏ̉§Æ­¾Ù½°½¼—øơÔï»Û×凖‘÷µ†9¥‡©¾Ă˜ ê è ä «ÔƠÀ±”ñÚ­ÄÏ̉º9¥‡™‰kß [ïS߈±áÜĂº½߈±»«‡“ÍjŸÖéºĂÙ‰¿IĂ¼™Ô¨Ø­Ä¿‰°)»‡ù×çµçØ—ÓÙ½™‰kß [ïS÷Á«‡“Íj•ŒËÓ©Ó¾³ƠX™‰kß [ïSÏüñÖĐæ×Üö—»Å›‡åŒ¿NÏԩ؃v½ƠÅôÏÔÁ½‚vÙ̉éÔ¿ºƒv±öÙÅëëö³à½Áăü ¦  † ¹Á£Ø†îÏÔщψ›¾ׯÅÁ“óøØÛ«‚ ½9§Ô·‡‘×8çͼû©ØùôµaËĂÖÅØÎÄ@Û«‚ ½9ûƠ™‰kß [ïS¾ÏÔ·‡‘×8ç®G ø ߈óǼù×§Ó“¼ĂÈ—¶…Øß"ÙŒë*«±»ñăˆŸ;¹ÚÍßÛ«‚ ½9ĂÙÁƯß%ÛÄÓ»̉©Ç÷ÙÔñ”Ù½ăˆŸ;™‰kß [ïS÷Á±»Û«‚ ½9½€ưÀ“Ơí‡ëöÙ½®ôÏÔ„aåƠñÖéÓÛ«‚ ½9ñÖ߈°¾¶·§D ´¶†èºăˆŸ;ÿÚĂ¼ߌÛ,™Ó‡ºỔ»Ăéêç½×ỠË̉¼Ô!ÏÔÉ̉ù×ĂÙù׿ߩÓçô•Çå̉ ơèÅ·Ô¯Üíê¹Ú¡Û±»ºÁÙ·‡‘×8çŸó«‡“Íj™‰kß [ïSế‰×Ơ«Ô½̀¬H¶è›¶é¯Èå̉ YƒvÛ¾£Ø­Ä»Ô‡ÇĂĂÈĂÑr™‰kß [ïS°»áêÛ«‚ ½9ù׃vơê™ëéåû´×Ơ¡ỒĂï‡̃ˆû­Ä“¼¼Ø×™×±»·ÔĂñÓºë÷”ÈúĂÙÇ֭ȑֵر»½ưÀù×Ö¾™‡ÏÅÓÅÛ«‚ ½9™‡ÓÆ©ÇщÛ«‚ ½9£Ç«»«‡“ÍjûØÉÈÀ̉‚vưÀçÚËÉ9ơĂ½¾ë·¼Í7ăơÛºơÔÏÅ̃ˆ½ö÷¼óĂƒÔ©‡¥2ßëM߈÷ˆ9¥‡›¾ưÀö§Ó“Û½éêщ𷇑×8çß»û×*¡ ¹ÚĂÜ©q‡Ú߈óÇ·ÔÜɇº Ơµ³ĐØøêÎÏŽŒÛñÙ±ëØöÖ Ă¿ØưÀ…‚€ÓÍÄưÀ½Ă‹Ó¡Ô·‡‘×8çĂÙχíêƒvÛ«‚ ½9Û«‚ ½9ăˆŸ;Ú×ÙÚÿÚ¶´ÎÍË)éÛ9¥ƒvÅÜ»~ëöẳưÀ¥ÆƯÓ ơèÅ·Ååº˱—¶ăˆŸ;k¾¾¿»«»ï*öçÚÿÛ›Ôå̉ ™ÑÏ̉™‰kß [ïS½Ô9¥‡×±¿Ù½ÏÅÅn¾ăˆŸÛ«‚ ½9«·3uUÓÆÛ«‚ ½9”öđÖ°»˜‰j̃ZîSÜ­ÄăˆŸ;ùêYÑÓÿ×Å—¶é‡³ÂĂÙ߈¹ÚăˆŸï½߈ưtƒ¾‘¡Û¿·‡‘×8ç߈‡““Çù¿•%ùêµgçÚíÆ›Ú‡ºĂ‘ÚÀĂáƠ ËûÑ+Ë©‡¥2ßëM˜‡Û«‚ ½9Û×»‡™Ôù×™Á•á¥Û½óÔÙÚÙÓ«ÔăˆŸ½µØÅØÅ¥ˆ]1ƯÓ ½ƒvƯº”»›¶éỔÓºù×óÔùơª»æ̉ÁƯ½9¥‡×¤ˆ\0ĂÙăˆŸ;ßÚ«‡“Íj„(߈‹ç…Œƒa¡ư“‰ÛÏ̉½ĂÙ‡º¡Á›¾·Ô¹ÚÿÚßÁ•Œ¾ßާÔáêË¿ÛÄÓ¶è¶ÜÛ«‚ ½9±»¨Ø‡ĂĂ ›­±àéMŸÖ¶ÅßÙÓÿI™ô¶•Ü™‰kß [ïS±»íßÁƯÛ«‚ ½9½9¥‡±»èêºăê±Â‡ÑÄëÙËÁ·Åƒ˜ï»áñÚöºÄØơÔƯÓ ƒvñ±‘ ƠŵØÑÄë³Øù×ÇÓƯÓ ăˆŸ;ׯÏÔùơÅ=™Áăơ±»؇Î9„ï²2,ÛÓ½€‹Ç“Èù×ѵ߈«‡“ÍjÇÖ©‡¥2ßëMóĂ¡Á‡Û·ÔÜΫÔá «·3uU9¥‡´†·‡‘×8çÏÔ±»¡ƠÔX¹½ûƠơèű»ÉĂ½ÏỖˆ½Ô»‚ˆ¿‰ßÁ¹ÚíÚÓºÔXĂٵصaçØỞ°»öºÛלđ•×ÏÔ½™‡™‰kß [ïSÛÄÓ½¯×ÿ¯¶÷‡ơêñÓ‡ŒƠ¹Ú™Ôƒ×¿ºưÀ÷ÁÑÔÓ5“gesÁů×ĐĂÙÚƒv߈ÿ¯¶¡™«‡“ÍjĂè×Ú©Ø•ăºêö™‡½‚vÁƯƠX̉صØơÄóÇçØ€Ơ±»Ơ½9¥‡½ôåĂÑæ§ÔóĂØÓ̃»ú¹Ú Á£ƠµØª»ëöÚ× ù×ÇÖ±»ÑĂ¿©Øù×öÁ߈¾ßµa߈ívÁÓívÓ &…ƠËÉ9×$Ơá ߈«‡“ÍjĂº¹Ú¯Û³Âù×ßÄÙ›¹Ç™‰kß [ïS­ÄëöơêÑÓĂÙÏÚ‚Ú…ÔÙ½È̉ÑÅ£ä¹Ú€Ä£Ó™‰kß [ïS±»­ÄçÚív±»£äí½±»…&ĂèĂÙ麫‡“Íj‰¿I¥ˆ]1ß»ûÄĂÙÛ×ÙÚ±»߈öÁăÁËÇ»‡»‹ÿÚµà߈ÏÅ̃ÁûةǶÙÚ·Ôñ‡™ÔĂ¹¥ÁÛºơÄÏÔÁ½å̉ «‡“Íj÷Á§ô¡Ôä¼߈«‡“ÍjªƠ…Üå¼ ï½ Ơùê…ÚÏÅ™‰kß [ïS₫ÍÓ“ƠÉyơÔ₫Ú­ÔÛ«‚ ½9µyÙ½ĂȺƠºmĂƠ½»Å·ÔơÄ¡ö̉عڙØäƠ +±»«öÏẠ̊« ©ƒ»5Î̉ôâ—¶…đ¢ƯÏÔÿ¼‡ñ5ûîçÚƒ«‡“ÍjƒˆöÏÅû¶Ë̉ùסÁƯÓ ¹ƠÛ«‚ ½9ñŒ§ô˰»ÏÅăˆŸ;í‡ïđÁ!ÛÀÛ«‚ ½9«È±»ù׋ǭْ¹ÜNÇÖ½«»ÿÚ™ơ‹Ç™‰kß [ïSËÉ9߈ÛÚƠºmï»×ƠÇ̉ˆ”=9¥‡ÙÓĂíïiµØ9¥‡™‰kß [ïS߈ưÀù×—¶ưÀ×Ơ›¶éùת‡’̀j9¥‡ͼóÇĂÙµƠ­Û’ăˆŸ;£Ç…$±»ûƠĂÙËLJºø×±»×ÓĂ¼åô¹Ú™ÓÁ³ḯ¾½¾‡ƒ×¨Ó£Øó¹ëöÁñ½—¶½ÍÓô­ÄÛ×Ă߈áÛù×ưÀÛ«‚ ½9¥ˆ]1ÅưÀíÖƒv‹Çù×÷Á“¨ÛÀÁƯù¿É£È£Ø›¾›ÚÍƠ¹Ú™‡í‡¯ø×8¤‡Öׯ¯Ø·̃•Œ¾¹xåîß»û߈“½‘ƟŇÚå̉ ÙŒë*«ëá£äùêĂÈƠëöóÔ½̀Ê)èÛ8¤ơêăˆŸ;«‡“ÍjŸÈÇéê»qµØ“Æö™‰kß [ïSÛ«‚ ½9˜Ă©‡¥2ßëMƠXíêù×½ÏÔÙ½ơê³ô™‰kß [ïSÙ*ÏŶºơꟹÚö¾Ø˾₫®¶­RñƯ«‡“Íjÿ×µƠ«ÔœÓ¾Ú“ÇÉ̉ĂôĂ«‡“Íj¥ˆ]1íŒÓµØ—¶¶Û«‚ ½9ÿÛ˜‰j̃ZîSÅÁ£ÔÏÅù×ívĂĂ ›­±àéMơÔÏÅô™–Ă«‡“Íj™‡ưÀÛ«‚ ½9/ù×ÁĂŸ߈±»™‰kß [ïS«‡“Íjơ‡ăˆŸ‡ºù×ñÁÛÚ¥Û¡ÔÛ«‚ ½9щĂù×­Ø߈˜‡ăˆŸ;¯ÈÑ÷Û«‚ ½9ưÀÛº©&¿¹‰yù×ă༱¿̃ç +ăˆŸ¥ØÙÅ뫇“Íjÿ¼—Ó˜Ô±»‘Æ™‰kß [ïSƯÚƒv›¾¦ôÏÔ¶ÖÆƯ ±Á½ÅÓ‚Ø«·3uUó|ÏÔßÚëîÿ¯¶ƒˆÓÔµaË̉ßÚ°» +‰¼ĂÙ·‡‘×8çÛ½*©Ó£Ø÷Ú“ͽÙŒë*«áêß»û«‡“ÍjÛÀ·ÅĂăˆŸ;•̉µ ÏÔùêơÔÏÔͤ«‡“Íj†Œ™‰kß [ïSêø€Ơ™ôͽ̃ˆÙ½³€¹ÚɹÏÔóÂÅ¥ˆ]1̃¹ ơê½ăˆŸ;ñÁ­ÖÉÏ”Öe¯ƠÛ‚ví—Gµa·‡‘×8ç¿ß¿ºÙî§ô¹Á¡ăˆŸƒvçØ¶CC­Ö±»ßÁóÇgö¼¶‡Ö8æ“ÈÛ«‚ ½9‡Œ¯Ơ™‡»$ă Û«‚ ½9™‡ĂӬĩ¼Û«‚ ½9½ÑĂﻣÇÏŽù׃½å̉ ¨Ç§Óô¸£‰!çÇÇÄ‘ƒØ›¾—ˆû̉Ϲ±»ÓºËÇ™‰kß [ïS›¾ÅáĂ‹É0›¾Á½߈ÂÙÏÔăư§‡á=Ë¿ëÚÂÈ¡ÂË̉ÍÓ‰¹Úö“½«Ô¿Å€öÁƯ´aÓØ߈ƒÖ·‡‘×8ç¯È¥Û™‡˜‰j̃ZîS÷ÚçÚ‡ºơê³”ºĂ¡Èù×ăˆŸ…Ö–¶Û«‚ ½9±»«‡“ÍjÍÄÿ¼ëÙÚ°»¡ÔÎŃÔͼ¾߈“Æ™‰kß [ïSù×ôÄívÛÄÓ«Ô½߈‹ÙăˆŸéÓử‹Ü“ƠƯÓ ÅỐváêÿ¯¶ÏÔƒˆ›¾ăˆŸ;½«̀ăˆŸÂÙ©&™‰kß [ïSÏůƠ›¡›¾ƒˆ©‡¥2ßëMÏÔ¹¾ÏÔĂºÛׇŒéơ¿ßêơÑæ#ÅØƒ̃ˆ¹¶ỞµÅà‰Û·ô—Ó‡Ú¡Ơ“Æ¡ÛùæÏÅÄ–߈§ôô±»·‡‘×8ç¡È™‰kß [ïSÀĂ—¶¶ù×ø×ó¶ö¹ÚûÙÙ½ÍÓư¨ăˆŸÛ«‚ ½9Ăå×ĂÙ©ÓßÚĂ™‰kß [ïSù×Ïè¹ÛÁ̉™‰kß [ïS›Ú·ÅÛºåô¨À™‰kß [ïSĐÓ—¾åĂṆ̃ëöÅÓ8¤‡ÖÊÇ™¤óÂóÔ½½¹Ú½щ™‰kß [ïS¿́ơêÁÁ™ëéåÏÄ—»±»ÇÀÁƯ‡ù×ơêÏöÅģǂvăˆŸ­Ö½ô«‡“Íj́$å×›Úùơ™‰kß [ïS€ºä̉ïÅ·‡‘×8ç߈ÙÚÅØï½±»ëöÇ̉±»ơ…“ÆßÚ̃ˆ™‰kß [ïSá ư“¨ĂăˆŸ;†Û¾ß\àÔĂ½€Íß­¾·̣½Ă›ø‡ºœÜÅÄÍ­™‰kß [ïSŽèê©Ø«‡“Íj‡Ä…Ơù×Ù½«‡“ÍjóÇøêëÚéÓ‰¾÷‡éºĂÙ×ù×ÓàĂÍÄö·‡‘×8ç‰Û̃ˆÛ«‚ ½9”«‡“ÍjƒvÏ%Á̉·ÔÇ—§Í»¯í‘֫‡“Íj³n³ºóỔ-™ôƒÖ‰º±»«»«‡“ÍjÁ±»™‰kß [ïSù׫‡“Íj½ô«·3uUÿÜ߈µßÛ«‚ ½9½æ±¿ÀĂù×Û«‚ ½9ƠÛ«‚ ½9º½·‡‘×8çÛĐĂ×Ơå̉ ù×ψ½߈ÏÅ̀Ó·Å÷Á¯Èø¼Ơơ¡Á87¤‡7ÖñÓëö£Ø·ÅñƺßÄÙơê½ôÓÆ·Ó ¥0½±»«‡“Íj±»µØÇÏÔñ×µaơĂÙ½³µaó|ÛÚĂĂ«‡“ÍjÁ›‡¶ëöăˆŸ;ÅØÏÔöÛ×8¤‡ĂÙưÀ°»ÂßַŇº¢Çç$ÓÆ¥Æª»½ÊƠÔưÀăˆŸ;kÓÔƒàöÅÔÆ»¿ƯöÑÓ˜‰j̃ZîSßÚª»çÚÍӻŭÄëö8¤‡×³ă«‡“Íj½±»ăˆŸ߈Ú×¾߈¼;ÍÓ—Ó™Ó±¿× ›¾Û«‚ ½9߈ûØû̉±»đÚ™‰kß [ïSÙÓ÷Á©Ơ€ƠÆÅß»ûñ‡›¶éùע䥯£Ø¼ƠÓàơêǺ£ÇÿÛºÈð»±Áï½ăˆŸ;kô“Ü×$¯Ü»Åêö±»¹Úù×̀º·Ôç̃ëƠUĂÙ½©‡¥2ßëMÓº«º‡™‰kß [ïSù×Û«‚ ½9ƒÚ—ÓÏÔßÚ§Ô½ Ëû³à§Ô§Ô¿¹ûØ“ÈÑÓö«»ôƒÖĂĂ ›­±àéMÏ̉Û«‚ ½9øàƯ‰™‰kß [ïSù×ä̉Í‚½åŒ¿Nơꉣ½“Èù×ÑÓĂº•ŒÔñ¹™ §Ô…Ûơê©ØÑÓª»ỞŸÅÙר±»Á‡é/×:¯“©ÓÙÚ§ºơêÛÀ«‡“Íj߈9¥‡“Ơ9¥‡ƒvÿÂèÔƠÅÙ½÷Á¿×¾ù׫‡“Íj­Ä»øêƠƒv»ÁáÛÙYÑó·Å ËûÓÅéÓ«Ú÷ÁĂÍË)éÛ9¥‡Ú÷ˆ¼å̉ ·±¹Ú™‰kß [ïS¡Áé|߈™‰kß [ïSƠ¡×ĂÈâơÿ§íÚăˆŸ;«‡“Íj9¥‡÷Ù“È›¾ÇÖ·ÅшÛÀ±Ăÿ¯¶£Ø…Ô£ÔǼ߈Û«‚ ½9ÑÓ—¶ĂºÁƯơµ؉ÄñƕשÇăˆŸ;ÙÚ–¶ÓØÿ!¯¼ĐÄ'ê'Å̀ª«‡“ÍjÖ¾©‡¥2ßëM¥Ûª»åĂÛ×áêêÅóÔçÚ·¡±»¿Ê™ëéå÷ÁƠơÔÛ«‚ ½9™‰kß [ïSăˆŸ;k˜‰j̃ZîS±»ÏÔ±»ï³2ÑÓ9¥‡£Ø˱Ở™‰kß [ïS½0ÏÔăˆŸíế÷å5Óùơä̉ëØ…»¯×ù×Û«‚ ½9¢ƠÛ×™ëéå߈¨Ç‹ÇơÔơêÎÔÓ±»üÆùëź‹ÇĂă½½߈̀Ó–»©ÇÈÙ“Ü¿ö·ÔÛºÍUƠ±»ƒˆÍÄ›¶é‡º½îƠ·‰™‡‡å̉ ÷‡ưÀÏÔ9¥‡Û«‚ ½9ï½µ†…ห‡“ÍjÎÅÖ¾8±»÷Á·̣™‰kß [ïSÁĂ߈ơÔï»±»Û«‚ ½9éêÛ«‚ ½9³Øù×̃„Ù½å̉ ·ÅÛ«‚ ½9³à‡Û¡ÈƯÚÚª‚ +¼9ÁƯ…؉¿IÜơº÷ơĂƠÙ×ơăˆ½µÈëöù×ô¦Ó±»³¹›¾«Èù×Ơ₫Û«‚ ½9óÔƒvÍăÁå̉ ½߈ÁƯ«‡“Íj½ØƯÓ ñÚ¿ÅơèÅÜ÷ÂÏđ‹Û±Å‘½Ô»ˆŸ}ˆ³Øù×ëØÛ×—»ÿÚ‚vûõ†„Øăơ×ĂÙÚ‡ºÙ›·Ô›¾ÏÔÿÚ¹Û«‚ ½9‡ŒùêưÀÛ«‚ ½9±ëØ­Ä…öù×ùש¼»ôÇÖ·Æ¡Ÿ›¥·‹·ÅôÍÓÀĂưÀ‰¿IăˆŸ;kÛ«‚ ½9ßÖ™‰kß [ïS‚à›¶éơÔñÚÙ½«‡“ÍjăˆŸ;íă»½È‡Ú«‡“Íjí‡߈£Çëöăơ½Û«‚ ½9ŸƠóÇăˆŸ—»߈ôê·ÔÙ½©ÓÿÚóÇ÷ˆ³̃ˆÓØ“Ơ±»ƒv÷ÁưÀ9¥‡½€߈ëö ÇÅØçôƒØñÓ†Œ™‰kß [ïSÅØỞ“È­È£ä£Xø×ƒÖ˜êè䙉kß [ïSù꺗¶’½ÅÔ™‰kß [ïS×ƠüÀÑÓ½ôÿ¯¶ƒvÙ½ÓÛù×ù×߈¯àơºƒvƒv߈“ƠÄÓÀĂù×±»¬Ôè¾÷ÁåÓù‡‘Ú“ƠƠXĂÙ‡›ÚưÀ‹Üù×ơê˹£ƯÙÚ§Ôå̉ ÏÔ¸Úê‹Û×纡ÔƯºçÚ³é"›¾ÏÔå̉ åÖëöŽÙÚƯÓ öíÆÿگșëéåáêç̉£äĂÙ«‡“ÍjÙÅëÎ̉ׯÓÆ§¹çÚ±ëØëö±¤™ëéåÏÔ·‡‘×8ç¡ƠÏÅшăˆŸç‡Ç“ȬÖÛºëö¿ß¡ ơÄ›¾±»µƠÏ̉»ØíÖ—ˆ¡Á‡Œù×µØÛ«‚ ½9±»›¾´a¥ˆ]1”Œ½÷ơçÚăˆŸ;°½æº¡ƠƒˆƒÀăˆŸÛ«‚ ½9›¾ẲÏÅ9¥‡Ë̉½߈„»¡ƠïÁ£Ç‡Ú«‡“ÍjçÚ±»¥Û›ÚÇÖêöÁ́₫®¶‡ÚÛ«‚ ½9«‡“Íj׻؟\Û×ëöÂÙÈÙóÇ–¾ß„Ù½©À™ô³ƒĂûØ…¾̀Ọ́Ç€º•ŒÁ±»›¾©&ëÑ߈ƯºÁØ¥ÚóÂ߈Ơ±¿‹ÇÆ»£ÔÙ½ưÀ·º‹ÇæơƒØ©‡¥2ßëM™‰kß [ïSƯ‰™‰kß [ïSÛ«‚ ½9•îăˆŸ;k±ëØăˆŸá=—ˆÎš۱»­¾©¼Û«‚ ½9ÙÚçÚ«ÔÛÀÏÅÅÓÍĂù׋ǥ±Ôăơí—¶«»ƠéɇöˆÓµÏÔ˜Áâˆ:kÏÔ±»Í·ÙÅëµØ÷Ú³ïÀÏŪڿ»ó—¿ÂÙÿÚñÚóÇ×̉ƒvï»ôĂÑÓ«‡“Íj·¼Í7ñÓÏŰêØƼ +ĂÙ߈£XÜơ ÿ¼£±»9¥‡±»›Ú¯¾ƒv¶ĂÙ­ÄưÀ̉̉ăà–¶Áùêù×ÇÖ½›¾ÏÅöø×"¿‰ɹ§ÓÜƠ´£äÁ̉‡Ù½Û»÷¿çå̉ ù×›ÚăˆŸ;ëÔùסƯ³Ÿ£Ô£ƯÑĂ×Ơù×Û«‚ ½9½€ÅØÏÄ™‰kß [ïSëö߈«‡“ÍjàçÙ½¥ÛçÚ8¡ÇÛ«‚ ½9ëÄÛÇçÚÍË)éÛ9¥™‰kß [ïSƒ§ÔÏ¿ÏÅÍƠº…»ÎÔ“Ơö㻫‡“Íj9¥‡ưÀÍĬֱ¿£Çù×±¿8¤‡×½¹•ưÀ½ÿ©¼ưÀ¡Û»ÁµØÛ«‚ ½9Ơ¼«âçôƒvºï³2·Ô9¥‡ׯÿÚ©Ü›¾ÅÄ÷ÁÛ«‚ ½9ơêß%Óµ·¯²ØĂăơ¹Úÿ¯¶°»ívå̉ ĐÄê߈“ƠÍÓ•×߈ëöÅØ9¥‡×ÏÅ₫®¶Í¼çϼûÓŽ¯ÈâˆăˆŸâÇ ́ ‰¿IÓºÙ½˜‰j̃ZîSÓÓÚ× ·‡‘×8烈©ØûƠ¦¹çôíăù×9¥‡Ăº·Øƒv˜‰j̃ZîS¡Ûé½½ăˆŸ;ñ×ß„é‰ñ5ñ·ÜÛ«‚ ½9ĂôÑÓưÀ…½ÿ¯¶ù׳ĂÙ½€¡ÛÅØ·‡‘×8çÙÚÁƯ™‰kß [ïSÛ³Û×ơêà ½±»ÍƠ¶öÂùêêÖëÚ¡Ơ×¼ϺµßçôÙÓ­Øơê½›1±»Û«‚ ½9‰Ôăêơ‡ëöơ»Û«‚ ½9ÇÖÙ½ëö¯}…اؒ¹ÜNø¿ÇÖ™‡éÓ›¾³Èùש¼ëö›¾™‡9¥‡«»Æ«‡“ÍjéGˆ¿½·Ó ¥0߈÷ˆ­³¢ä¡Á¡Ûƒ±»ëö”»+߈‰Û÷ÁÛ«‚ ½9ö”¬Ö—Ó¡Ô߈ÓÅÙ·Ôƒ½ÍË)éÛ9¥߈¾Åô°»Ö¾­ÄÍƠ³ô½³ÈăˆŸ;ÅØÁÖçåơĂÙ€‡ñ5ï™ÏÄÄÙ©ÆăˆŸ;ׇ½7ăˆŸª»™‰kß [ïS«ÔƒvƒÖ­ˆñíÈÇ_ö±‡ĂĂëLï»Â߈ï½³ ™‰kß [ïSï‡÷Á£»ü̉Ñ»½çm•ˆœ¿ơÔŸ}÷‡߈¿ƒv¡\±¿µ•ÓÁá$ÁÛ«‚ ½9Û«‚ ½9Ù̉»‡ÿ¯¶ÊË¿‹ÛûÓƯ”º¡ÛÛÀ«·3uU·Ô¯Èùê™Ôƒ×¡Á÷ÁÓÅùêơꩼ¥Ùëö«Ú“¹ƯNÍÄ÷ÚíÚ×÷9¥‡±»߈ăù×ÑÄëĐÓÍÄăˆŸ;‡Ú‹Ç½Á½€Ù¡ï߈¹ÚÏԓƾƠÏÔÉçºơèű¿›¾¯ÜÛ«‚ ½9¥‰ÍL…™‰kß [ïSÛÄÓ½ÿÛ™ÛÓÓƯº·‡‘×8çÁâ·‡‘×8ç™ëéåÜŸÈ–¶ÏÔưÀÏÔ¡Á¡Á÷ÚÍÓÍÄ)Ù½ÏÔ½ôĂÙ½´†á ƯºÑ+ºÏÔ‡(ׯñÚ́vÓóÄ“Æï½°»ƒ̃…»ߌÛ,߈›¹ƒï½™‰kß [ïS9¥‡×©‡¥2ßëMă‘·øêƒvÙ×Ó̉à=ÓÅ™‡ôø«‡“Íj÷ÁỮ‚Úù×ÁÓÆ«‡“Íj™‰kß [ïSù×ơêÍÓù×ÓØăàщ¶Å‹̉ÁơêÁƯÛ«‚ ½9áêĂkƒ¾‘½€ß»ûî½߈ÓØ²´aÛ×ÙÚ³¡Ơ¹Ú¯È÷‡ùê·Ô×¾ăˆŸơÄă»à¬í'ƒ¾‘½ºÆÏÅÍĂˆ8'¤‡'ÖªÚ¾°Ü¹#ô»¿ÅÁ̉ÎÅ¥ˆ]1¿¹¡Ô›¾«»¯È¤ˆ\0ùơ™‰kß [ïS‹ÇÙ½ÏÅÁĂàƠ”Œ£Ô±»™‰kß [ïS¹ÚơèÅù×ù×±»«·3uUÇ%ÙŒë*«“ỠƯÀẰºŸªº¾D߈߈¿è±»ºéơ9¥‡ÿ¯¶Á̉öä5̉ÑÄë°»¹à÷ÁÙÚ—ˆơÔ·Ô™‰kß [ïSơêơêù×ñ×äÔívËÉ9ù×ëöщ‡ÇÅ»ÑÓ™Á‘Ƭ¼ơê9¥‡‹Ù¯ÈÆÙŒë*«¹Ú˜êè䥉ÍL…ê¼ß»ûÂÆÓÓæÚù×ÍÓçÚ©Úª‚ +¼9ڻ÷‡‘×8盾¿Ï̉ăˆŸÏÔ߈½™ôß»ûëöŸ}ơÔ‹ÇÙ½·Å¡Á©"sá=àØóÇÚÀ¿‰ÏÄ·Ô«‡“Íj˜êèä߈ŸßÏÔ½ô¿ßëöÏÄåôƠ¿»߈̃ˆçÚëöÙ½™‰kß [ïS½ÏÔ«æ¡Û̃ˆÍË)éÛ9¥ăà«»×¾Œ¾ăˆŸÛ«‚ ½9±»ͺÙ½»ÅÙ½ôếƒvµĂ虉kß [ïS癉kß [ïSÏ̉ˆđщ߈9¥‡ÂÙÛ«‚ ½9™ÁÿÚƠ¾GÏÅỔ•É̉ưÀÏÔÇÓ·Ó ¥0ù×­¾߈ÇÖ½Ÿ}Û«‚ ½9ÅÔÊÖ±¿ÜăˆŸ;™ëéåĂºù×½ôؽ +ơÄÛº¸àÏÔ­²âˆăÇí±»¾‰·‡‘×8罜ԌƠÑÓ›¶éơíÙ—Ó½ϺÖ¾8߈«$†xÛ™‡k¡\±¿ÿâÁ¹™‡Û߈Ú×øêÏÅóµØÑÓ½₫«bƯ“ÈĂăˆŸ;£Á÷Áﻉ¿I÷µëÓ̉«‡“Íj§Ô—»£äÇ»œÜ±è—¶öÁĂÙÁÚ—¡Ôăº¸¾$ăà“¹ƯN±»¡Ô¯È¿ÙÚ­ÄỞÏÔ·Ó ¥0ׯ²º̣·Øƒv‡ÇÏÔÏÔ·Ô˜‡·Øµ†̃ˆׯăˆŸ;k‰¿IÿÚùë߈ëöÙ½ÿÂÛ«‚ ½9ÓÁÿ¯¶ééªÚ רƒv8¤‡Ö›¡½ÁĂ͆¼€«‡“ÍjíêÙ½ÏÔ³ µ8ñÚÛÄÓ߈ù×¼€ơê‡ÚĂăˆŸ«ÔÛ«‚ ½9«·3uUÁƯơÔ‚¾¡Û“ +¾¹½߈߈Ç̉½™×ÅôåĂåĂ·ºƠ'óǽ¢ĂÈóÇ¾ăˆŸ;k½€º…ØÛ«‚ ½9µ†ä̉Ǻ«ÔµØ‹Ü£ä¿ôù×ÍÄÛ«‚ ½9™àñƵØù×ͽăÁÀç…ÖĐÄêÿÂĐÄêÛÀÛ«‚ ½9ưÀïi¨‡¤2€̃êLׯ«‡“ÍjĂÈ™‡í—G£ä¾́¯Èé‰ñ5ñ·ô¹Úƒv߈öñÚûƠÑØ”È=ú==Ù½ÍË)éÛ9¥å̉ ù××¾µØ«·3uUăˆŸ;Û«‚ ½9×ÜÙ½¿Ø°»¹Úå̉ ñÓ߈£Ôăơ±½Û«‚ ½9߈Ưº½×¿8Û«‚ ½9ĐÄêö²Ø#‰¿I·Ø½ÏÄAøê¿‰ÑÓƒƒ½9¥‡¹ÚÅëöưÀ×Ă—»ĂÙóÇ¡Áù×ăˆŸ;Û«‚ ½9³âƯº—›ö‡£Ư«»ơøڱ»ÓØÙÚéÓ‰¿IÙ×Øï½™ÔƠ™‡™ëéåÑÓ߈£X˜‡߈º·Åăàö$ù׃×󶛉ưÀ÷ÁÁÓÛ«‚ ½9Ôơƒv•Çÿ¯¶±»«‡“Íj£ä÷ٵجċÇàêăˆŸ;Ö¼Ϻ™‰kß [ïS±»ĂÈÙ½·È»‡ÙÚư‡±ù1“ºßô“¼—¶«‡“Íj™Á¹Ú±»™ÁÁ¼ơꇗӃ߈•âđ̉ź±½±»½©¥°ñÓ—»™×ăˆŸ;”ÇăˆŸ§4¡ÈẲëöù׵ع¶»Ø¯G‹øñíÈîºëöø×ËÉ9Ù½·ÅƠ½±̉›¾Ï̉ưÀμù×å̉ ™‡Çè±½±»‡Ú½߈ëöß»û™‰kß [ïSé‰ñ5ñ·÷ÚŸ\Ï̉Ù½߈Åà½Ç­vïÚÄƯ›¾»½³È±»ĂƠ߈ƒˆŸ}ï–£̉¶߈·Åÿ¯¶éêĂÈĂÙÆ±¿ƯÓ ŸÖƒvé‰ñ5ñ·ÏÔĐÄêÖº±»ưÀÛ²¾Œ₫·Ó ¥0ùëÓÆ²Â™‰kß [ïS‘ÆÛ«‚ ½9ÏÔáÛ“Ơ—¶ͼívÛ«‚ ½9˜‡ +‡Ç§ÔÏÔ忽ÈÛº›¾¡Ô¯»ëö߈åô߈±»©Ó™ëéå“ÈƠ¿ôăˆŸ;k߈ăº·,™‰kß [ïSéøƒ×ù"‹Ç½ÇֵؽØÙ½öù׺ÿ¯¶¦ÔÛ×É̉­ÄßÁªÚµÅö¿ß›·ÔÁ‡é/×:¼€½€ƯÚ9¥‡×íÖ–Œ·ÅÅ ăà½Ø¦ÓÍÓºÛÖ«‡“Íj«‡“Íj˜‡ïƠÙ½óÇ̃ŒÚ,ûØÙ½ûrª»ñÓơêG½¹Ăôùê«Ô½€Ï̉àØA£Ư™‰kß [ïS9¥‡ÍÄ›¹™‰kß [ïS‹ÇçÚëö±»ͪßÚÍĂ·#ÙÚ­ÄÏÔƯ‰·ô™‡ø×Û«‚ ½9­ÖĂÙăêăˆŸ;ĂôöÍĂ·ÔỞ¯¾ùë¡Ô߈ñ¾ù×ÙÓù׫‡“ÍjëöơÔ¿º¹Ú³9¥‡ưÀ¡Ôíêử²ØĂÙơèÅñÓôÛ«‚ ½9Ể‰̉€º™Áù×߈đĦȡÈùשºù×ÏÔ™ơ‰¿IơÔ“ƠăàƠX±»YÛºï½Ă¿º×¾ÿ¯¶Çq¹Ú9¥‡¹Ú›vÏ̉ÁĂÔX2ªÚÅØ±È×Ơ¾ß™‰kß [ïS½Ă±»ÏŽÀ̉™‰kß [ïS¨‡¤2€̃êL9¥‡Áăêå¿ôÁƯÏÔ߈Û«‚ ½9ÖĂĂĂ ›­±àéM™ëéåÅÔ±̉§Ô¯ÈùëÛ«‚ ½9±»Ûn­̃ĂÙÙ½ÍÓƒvÿĂÙ߈³È¾ÏÔ¶èù׃ˆ™ô½ƒv­Øéơ˜‰ j ̃    Z îS ƠưÀƠ×…ôëö‡ÜÛ×§ÔƒvÙ½—»ÓÅưÀÄÓûĐ«Ñư“ƒàÛ%ŸÅå̉ ÛˆÁË­Ôưµçíͼ”{ƒv—»ÅÓù×½ƒ9¥‡×ÑæƠï‰ÍÓö»ØÓÆ¿¹ƒvÓÅçÚ߈¹ÚƒÖ³ÏÔº½éê”ÙÅë‹ÇËÇçÚª‡’̀j”Œ«‡“ÍjùׯêöĂÙ¡Áù×·ÅÙ×ăˆŸÿ¯¶ù×ÛÄÓưÜÙÚ¼Ô¾½ưÓ9¥‡ùê߈ ËûÛ«‚ ½9ö±»ëöù×ÏØÓ¤ÈÏÔùº½«‡“Íjív߈§ô©‡¥2ßëMÙ½ÑÄë²Âî²2Û×ẳ“Æé‰ñ5ñ·ô«ÔĂĂ ›­±àéMÁÓÎ…Ç…'ßÁ—¶»‡¹Ú«‡“ÍjñÚùêÛưÀĐ¹ éÚ忇¿©‡¥2ßëM‡Ăè™'Û«‚ ½9©Æ½ù‡ÓØÙYùסÈڵؓÈùêÛ«‚ ½9ÙÅëÚ×ÄÔ©¾ƒvƒv×¼ơÔ½ÙÚŸ}ùט‰j̃ZîSÏÔá̉¹ÁË¿®ô ùơív¿(ÑØËÉ9ù×ÓºàöưÀö™‡öàöÏÔªÚ¿́ÏÅ÷Ú·ØưÀ”Öû̉ÅØÔÚ™‰kß [ïSçÚíJ™ôŸÈÑÄëëö§Ô™‰kß [ïSÇÖ¹ÚÓ´đÓ‡xÓÆׯ‘ ÿ¯¶áꪇŒ«‡“ÍjéÔ߈ĂÙ³©Œ¾¿́ÅÓçÚñÓ÷‡ÙÚÛ«‚ ½9¹ÚÂÙؽ‡÷‡«‡“ÍjËÖù×±»‡Ñă„ö…Ô‡ơêúÖ ƒvÖ­ØăˆŸºưˆŸÖưĂơêÇØ™‰kß [ïS߈‡Œ·Å“ÈßÖ½ÏŰ»«ÔÏż«Ó¿ë­–Ÿ±©ÇưÀùדȽgăˆŸ›‡ÏÔÛ«‚ ½9‡ŒùסÛù׫ѷëÏÚÍÓ¶½ªÚ«‡“ÍjƯÏÅăˆŸƒv”ʉʹÚª‚ +¼9ưÀÛ«‚ ½9…Ơ·̣ù×₫®¶Úª‚ +¼9ß„ר˜‰j̃ZîS߈ó¶½Ù½çÚ₫®¶½‡Œå̉ áê·‡‘×8ç¹*¾Ø›¾•¾“ÇÏ̉ùוŒĂ¥ØƯÏÓÏÔÂ߈̀Ê)èÛ8¤å̉ £Ç½™‰kß [ïS›¶é±½ÎÅ»ăˆŸ߈¼åĂù×̃ÄØ«ÚăˆŸ;Û«‚ ½9½Ô™‰kß [ïSívß„ÿ¯¶¡Á±¿ăˆŸ;¬ơ§ôĂư¨°»ăˆŸ±»í$ăˆŸ;“ÆŸÛ«‚ ½9ĂƠ½ï½ơØÄ– ÔçơºÅûƠëöÛYÛ«‚ ½9ïƠÛ«‚ ½9ƯÂơèÅщåô8¤‡³ ßĐ©&™‰kß [ïSƒ×Û«‚ ½9Ơà 9¥‡›Ú£äÅ÷ˆđÓÙÚ­Ô¼€¹Ú«Ô½Ú×ăˆŸ;ù×Á˯Èö·‡‘×8çÉ܉¿IƯÓ ÏÔëö߈Ơµ™‰kß [ïSÛ×™‰kß [ïS™ëéåóÇ™Óùש‡¥2ßëM«Ô³¿ß¿Å™‰kß [ïSƒåͽôê£X±»²Ơ9¥‡©Óùå½ô‹ÇªÔºnÀ ¹Ú½ÑÄëÏÔ‚v…»öô˜‡•Èû›ƠÛ×ăê× ‰Û⽉ӫ‡“Íj×¾ø×ߌÛ,̃ˆ©ºơêŸ}©Ơ½™‰kß [ïS⺫‡“ÍjƠ±»«‡“Íj½ƒĂ↌۫‚ ½9‰¾¦Ôƒvă½·Ỗˆô¿ôù×÷ڳȽ±º‡Ÿ}›¾—¶·º¿‰÷ÁÛ«‚ ½9ཹµ†ëöóåƠÄÛÄÓÍÓñÁ‹Ùơűù×ÿ¯¶Ơ×̉¼ƒv½ÿ¯¶ĐÅ …±߈ûµçÚÿÚ¿Å¥ºïÚͪÏÔ¹Ú™×ø×ÛˆÇÖ§ÔÏÔüÁơèÅñÔ³ÈÍÓ™‰kß [ïS¿‰ËÉ9ÍÓÏÔ©ˆŸÅ½ÓÓ­ÄíÅÂÙɇ»Ï•Ç¥ºß¿»÷ÁÁ̉Á¹¬È«ä߈̀­«‡“Íj›¾ÏÅÿ¯¶ÛÄÓ߈ÏÔ±»çÚ™ô½º¤Ø‡x߈ÿÚ—Ó¹‰ûơÔ߈óÔĂÈçôăˆŸ;™‹ÅÓăƠĂÙĂȱ½ƒÆ̉ÏÔß»û½Ø×ÙÚ›¾½ïº±»ÏÅËÉ9Ù½­Ä±ơêÏ̉ÁƯå̉ ù×â»ÅÓÙ×±»ƒ¾‘º­vñÓơèÅ„»´a±½ỡÙ½ÿڋDZ»ö«»Ù½©ØăˆŸ;̀Ó¬¾£ÈÙÚ÷Ô‡Œ9¥‡‹ÇÙ̉ͼƯơÅØÑÓ­ôÇÿ¯¶‰¾ÏÅ·Åù×™ëéå±»߈øêÙ½ËÖ—ÓÑĂƒÚ™‡˱àƠ"Û«‚ ½9ÏÄ¡«‡“ÍjûƠîáå̉ «‡“Íjà=†ŒơÄÿ‡÷¼¬ÖÚ×÷ÁăÁå̉ ăˆŸ·Å¥Øù׸Ó!޳Èơê±»ưÀ›¾±»ÄÓù¿ÛÄÓ¿ÅǺ÷Á¯×öơÔ°”ăམ‰j̃ZîSÙƒv¡ôê±»̉¼Ă´Ï̉ù×ÓÀßÄÙ™‰kß [ïSëöƯđÚÚÀÚÀ·Å¹ÚÛ«‚ ½9ßÚ½±”•×Ù̉ù×™‰kß [ïSăˆŸù×Û«‚ ½9ñÚå̉ ¸È ÎÅơ‡߈±»ăˆŸÑÓ’¹ÜNç¬Äº§ÓÑØ« ©ƒ»5Ùù×ÚÀÙÚÑÓ¯ÛăˆŸƠ|ÓÆù×±»ÁÍƠ­ÖăˆŸẳăˆŸ;Û«‚ ½9́Øø×Ăº \¹à¥ˆ]1ëö»ØëööÇÓµ†ßÁÏÔ–¶ + +ï½ɱÄÁÛÀ÷Áăơ߈™ëéåéĂ¡Û9¥‡×Ÿ}“ÛĂÉׯ½ÍÓ±»­ÄíµØơêÁĂÏÅëÓ§Ôÿ¯¶‘±™‰kß [ïS¥ØÛ«‚ ½9ơ‡Œ¾ÚUªU‚UU +U¼9UÙÜ¿‰¼ƠƠÑÓ¶ÔÛ«‚ ½9ơĂƒÍ­HÙÚĂÙº’¹ÜN ¹Ú߈Û×ÍĂç̉̃»úÓ¯éÑÓ™‡ß»ûªÚ½·‡‘×8ç‡Wø%‰ÔƯƒÚù×™‰kß [ïSƒ…‡“Á ›¶éÙ½µ‰߈ă½³ÚưÀñL±»Ü™‰kß [ïS‡íÙ½™‰kß [ïSµÜơêÿ¯¶߈Û«‚ ½9†º‘±Û«‚ ½9ÿÚÇĂă½Â½¼€ư¿ÂƠ›«·3uUË¿ø×ă»¹Ú߈ưÀơÔÏ÷‡gâˆ:«‡“ÍjăºÙ×Û̃ˆÙÚÔƯ%¡Èƒ½ëö9¥‡ƒvÿÂæÚ߈­ÄíØ‡(÷‡œÔÇÖ±»³Üơêù×±»Ž«»»¦§àăˆŸ;k߈‡º÷Á‡¡ÈơÔă¯àƠÄ̉Ń÷ÁÛÀăÁ‹î÷Úƒvÿ¯¶ëöĐØ§Ó™‰kß [ïSºƯHù׫‡“Íj©¼ÿ§ÍÓ‡Û˜‡±»½€«‡“ÍjƠX’½¯¼Û«‚ ½9Ù½¡Á°êØëöùÚÛ×ÅØù×ÏÔ©ØĂĂ ›­±àéMÍË)éÛ9¥©ÇÛ«‚ ½9ƒv›¶éơꙉkß [ïSÛÄÓR ͼÏÔ›¾̀Ó߈噉kß [ïS“Æ8¤‡ƒĂÙ½€Â#½¾ß»ûÚª‚ +¼9Ù½“Ơ‡¿Ơ‡ŒăˆŸ¹̃“Ⱦ™‰kß [ïS÷Á°»¹ÚăˆŸ;ơº߈Ë̉́½ÏÅÔÇÖï»­ÄÏ÷ĂĂ ›­±àéMº±»¹à½÷‡˜‰j̃ZîSâ¼½€ÏÄÛ«‚ ½9›vëöÏÅă»ÍƠưÀÛ«‚ ½9߈°»ù×ÅÓ«ÔăˆŸ;«‡“ÍjơêרûÍû•Û«‚ ½9̉ÅÙÅëåô±»ăˆŸÇÖé‡ó¹߈©™‰kß [ïSÙ½óÓÁË•‹H‘”˜‰j̃ZîSáÛÏÅçÚ©‡¥2ßëM¹ÚÅӼ뉺±»ƒÔ¯È»}’ºÅ™‰kßÿ¯¶ÿ¯¶ÏÔ½éºÏɇŸÖ̉˜‰j̃ZîSŸè‹ƠÙÚơĂ¡ö߈Û«‚ ½9̃»úôơêïÔ¾¡ăˆŸ¿Üö‡Ûç̉ƒvÛ«‚ ½9·¼Í7ÏÔ9¥‡ǼëöÅÓ߈Ϲ¡Çơê‚vá=™‰kß [ïS°½ÏÔăщíÆËÇ·¼Í7̣)±»̀Ó߈ø×Ù×Ö 9¥‡×ăˆŸ;³«‡“Íj¾±»ĂºÏÔ¼€Ç߈€“ÈÙ½™ÓËZÍƠù×ûØ×Ở¥ˆ]1ùêöÁƯ©ăˆŸ¡ăˆŸ—»™ÔÅưÀ«‡“ÍjëöóÂăˆŸêö +©‡¥2ßëM‹ÏÓÏÔÅØË£ØßÖ±»ĂÚ¹ñŘ¥ˆ]1¿Å°»ÙÚù××Ơ¼€‡ºăê»Á¡¼•ÅÔ߈óÂöǺ·§D ¦ÔĂÙÂăˆŸ}±»ÏÔŸÅüÁ £ØèÓ«‡“Íjç'ữˆĂÈÀ½í‡̃ÄØ߈ùëƠ£»™Ô‡̣̉ÅÙ$ưÀ·Ó ¥0ÏÔÏÅív˜‰j̃ZîS«ÓơÛÄÓ¾­¾ƒÚù׃vçÚï½ßÛù×ơ%™‰kß [ïS¯+Ⱦ§ÔÛ»÷ĂºŽÿÚÙ׸ڙÔÙÁ±̃»ú«ÔµØăˆŸ;kÙ½·‡‘×8çÀ¹ù×ăˆŸ;k⢻®×ÁƯÛ«‚ ½9¥Ó¥ˆ]1ƒˆÏÔÔXμ+ƒvÿ¯¶ׯ±»‡ºâơ¡ÔŸÖ«‡“Íjå©ç'ódzءß÷$ăˆŸ÷ÁµØù×ĂÙí‡÷ÔƠXăà™‡9¥‡´aÛÀ­Ø§Ô™‹ù¯Ăô­Öù꯼óDzÂÜ«‡“Íj±¿Á̉“È‚½ß»û¤ˆ\0ó#óǘêèäêöÏ¢ăˆŸ;ëơƒvß»ûÍÁăÁ½©¼¬ÖÓŪ»ˆÔß»û©Óëöœ‡“ÈÚª‚ +¼9µØ©Óǵذ»߈ơ»ơ²ƠëÚªÔ±)±)™‰kß [ïS÷ÁñÓ·ôÛ«‚ ½9«·3uU¿ôÓ¼ñÙ•Èû›‹Üøê“ ‹Çôl½ƒvưÀÏŃv©ƒvÅÓ¡ÔñçÜÙ½ÏÅ…Û∅߈9¥‡±»×¿8±»ăˆŸöëöëöÇDñÚ½©‡¥2ßëMùׯƠÏÔƒvÏ̉߈ăˆŸ;ÿÚϼËÉ9Ă—˜§ÔÙ×›‰Û×±»ÜÛ«‚ ½9íóëöé.Ă +¿ôëö׿89¥‡¡Á±»ƯÓ ôÏÔº‰ÁÙ臵ؗ»ơÔ°»¿è™‰kß [ïSÿ¯¶ÁĂÏňëöíׯÄØ‡Œ¬Ä»–¦̀»÷ˆ«‡“Íj€Ç­Ö·‡‘×8çăÁ¡ÔÚש‡¥2ßëM‹ÇƠ¥ˆ]1ơêËÜ›¡ĂÙ“ÈÅÓưÀơĂ¥ØíêÍĹڲ€ׯ¬Ä)º߈¿Ù‡8¤‡×·ä•½™‰kß [ïSÙÅ뙉kß [ïS™‰kß [ïS—¾ËÖơêÍĹ¾ăˆŸ;́Æ™‡¸Ú¾Ï̉‹Ç–˿ٌë*««‡“ÍjÇ Û«‚ ½9ă»Ô½ˆÇ̉̀¡ÛçÚÙ½‘­RƒăˆŸ;kăˆŸÿ¼Ù½÷Á÷ÔƠç̃ÑÓ˜ÁÏÅ×¾ÏÅ­ØÁĐÄê‹Ç%½Ă‘ÖăˆŸ­Ö¥Æ“ö÷ÁÏÔưÆÙÅëÄ•Œ½…»Ë̉ÁĂ½€ç̃¿‰߈öœ¿ăơØÚ‹Ù©ÓưÀ™º±»™‡«‡“Íjèđ½̃Ăèï½ÏÅ‹ÜíÁÁĂÏÔ”½ ù×ơèÅỞчñÆë™HëÔÚª‚ +¼9À¹»ô·‡‘×8çáØù×ÅÄ­ÄßÁ­Ä̀¬H©¼ç4«º™‰kß [ïSƠµ«ÔÑÓƒv·ÔÛÄÓ›¶é¾ÍÓ°¿«·3uU™‹ƒv‚v¹Ú±²ƒvăêô£ +ª»“¹ƯN㻫×ăˆŸ·ï“È‹ÙÓÛÿ×ßÖƒvщà̉ºƠŇù$ÿ¯¶·‡‘×8癉kß [ïSï»ÇÛ÷‡Ë̉¿‰߈󠃾‘«)±»ăˆŸ;›¶é“-“ÈơêưÀٽٻƠ߈ÛÇ›¶éÓ½É̉Ÿ™‰kß [ïSߌÛ,íƒv·‹»î‡…ôù×±»ÙÚ—Œ±»×¾ëọ̈ԯקƾé‰ñ5ñ·ÏÔÍÄơê¿ØÛ«‚ ½9¶ÔRÁăˆŸ;k»Øî»±ëØăˆŸ;ùÚĂ™ëé嘉j̃ZîS—¶ÇÖÙÚÍÓÙڵغ±»Ơ›¾ùơơêêö«‡“ÍjÑÄëív°»߈ăÁÏŃ¥Û߈ª‡’̀j›¾¿‰›¾ϼÉ Çâ½à÷Á›¶é…ÔÛ«‚ ½9°½ÁƯ£äÿ¯¶ăˆŸIÙÅë«â߈éJé‰Ó5“gesÁÅ9¥‡å̉ ¿‰­ÖÙ½ï‰Á̉”ăˆŸ;ׯ·ÆÏÅÁ½Ơùשˆ߈߈çô¡ÅÀ߈̣ÇÁÖ̃ˆĂÛÄÓơ…¾½‡ÅعګÔư“‡ºÄô˜‰j̃ZîSçÚôƯ‰ù¿½ÏÔÏÔ×­ÁÓ÷Áµa³”©ÓÓÅƯº߈ÿÚ½¹Ú’ÆÏÔ€Û—ăƒvG½¹‡,ÁƯ¡ÛÑÄëưÀç̉ÏÔù׳ çô¹Ú½ƒ½ËÉ9—ÓÏÔÛ«‚ ½9¦ô½«·3uU©Ó°»ù×̃ˆĂôÛºÿÚơصؙẠ́£ØơÔÓØŸÅơº³à½ßÄÙ߈‚½ëö߈ëö›ƯÛ«‚ ½9ÏÔÿ¯¶ÙÚ¿ß­Ôăà߈Ù½ƯÚµaÙÚ·Ôªâƒv‡xµØ߈“Èá Û«‚ ½9ƒ¾‘Ơ»Å«‡“Íj$™ÔÛ«‚ ½9ÓÆ«ÚÇÖ¥¼—ˆ÷ÁÏÅù×–¶§Ôẳ¬È1«»‡º«‡“ÍjơèÅ™‰kß [ïSÏÔºÑÓÏÔÇ%•óÙÚ­‚‰ÛŽߌÛ,ûÂÙöĂĂĂÙרëöéàÿ¯¶¡Û¨ØØ× ơÔÙ×™ä™ëéåăˆŸÿÛẲ«‡“Íj©Ø†Ú©‡¥2ßëM¼€ÏÅ÷$û̉Ÿ}óơÔ߈߈™‰kß [ïSăˆŸ;Û«‚ ½9¿ÅĂƠß»û¡ÔóÙ½Œ¾ÇĂ³ºóË̉ÂĂ Ÿ¾ÏÔ«‡“Íj³Èɇ³ØçØ÷Á±»“Ơ¹§ÔĂëöÿÚ™‡ó–Úןß߈Úª‚ +¼9Ư­֛¾÷ơÛÄÓ»½³ƯäñĂÙÛ«‚ ½9±»›Ûÿ¯¶£Ư©&™‰kß [ïS„»ưÀÏÔưÀ߈ËÓ÷Ưä̉‚vëöö½Û«‚ ½9³å¸ÚÅÓö­ÓµO‹ÇóÁ9¥‡™‰kß [ïSăˆŸ;·ỖˆăˆŸ߈÷ÁÏ̉—»ÏÔÍÄËÉ9Û«»Û«‚ ½9½ăÁ́ºù×±»™Ô«‡“ÍjÛ«‚ ½9ƒvÅØ™¶ù׉¿IÓØ»yĂÙÁ̉§½߈‡Çù×½„ô 8¤‡×å̉ ó|ÍÄ9¥‡×‡ŒËÇïÚ9¥‡ûذ»½µØ¶‡Ö8æÚºÈ̉ ›¾ăÁëö·ÅĂÓ·ÔÛ«‚ ½9öË¿µØÅÓƒvăˆŸ;ϹÇÖĂà¡Á÷Áä̉­ÍÓŸÁ̉ï½Ë¿ÙÚăÇí£ØÛ×߈÷ÔÇÖ߈Ù·ÔÛ«‚ ½9‹Ü‘ŒÿÚ¿àÁƯơêÚª‚ +¼9ơÄăˆŸ;ơê…ÿ¯¶«‡“ÍjÙ½ÉĂ™‰kß [ïSÓ¾ÛÄÓÍÄ)ơêƒØó#ËÇƠĂºáŽơê¼ÏÔưÀéÙ߈±»«Ô¹Úœ·̉ ¤0×ÜÏŌӧԿÈøګ»¹Úøæ÷ѽ‚v™‰kß [ïSƒv±¡\ÍƠ߈́Ú¡ÁÓØơèÅóÂÙÅëơêĂÈÙÚ÷Áư“½ơµØø×°Á£²œ‡Û«‚ ½9ùơ³ºó«‡“Íj›¶é“ƠĂÏÔ½óǹګ‡“Íjÿ¯¶»ôÓº¡È‡ŒÍÄ—Œ¢»ëø™Á¹Ú½Ÿ}ơêùë½߈ơêăà߈«‡“Íj›ưÀ«‡“ÍjÛ«‚ ½9å‰ÑȹڣÓ÷Á÷ÚÑÓ™‰kß [ïS÷‡’¾¹x…Ô£»÷ä5̉ϼ¡»åơÅå̉ ăˆŸÙ½°»߈ƒˆÇփر»ÁƯ¤Â¹ÚƠ¾GơêăˆŸ¡ÁµØ‡“߈Ëǡȷ‡‘×8çȾù×ưÀÅØ—Œ߈ßÖ¡ÁÛÄÓƯ‰­Öù×½ó±»ÏÔóÂ麛Ú#ë¶ô›ÛñÖ“Ơ«ñ©Ø9¥‡•ŒÅÔ½Ï̉ؽùđÁ‡¿Á̉ăÔô½à™‰kß [ïS‹Ó߈íº«‡“ÍjĐˆÛ«‚ ½9ÁƯ߈›ÚߌÛ,óÓÙ½ÏÅ¥¼ù×÷‡ôƒˆ±»ºnÇ÷9¥‡Ï̉Ơơ­öÁƯ× Œ₫¹£¾½€©Çăàơ»Ưó­¾ĐÅ8¤‡Ö«‡“ÍjרÏÔ“Èëå±»¹ «‡“ÍjưÀ™‰kß [ïSÏÔ‡߈Ú +ª +‚ + + + +¼9 +ÇØƠ‹Ü‚vưÀ߈±»¡Û¿‰רƠn§ÔƯÓ «‡“Íj³8¹àơÛÛ«‚ ½9ïö8¤‡Ö¡Ç™»­—ÏÔƒvÛÄÓƒÖÖÆ™‰kß [ïSŸÈ§Ô₫®¶×¿8óöƒ±¿·‡‘×8ç߈‹Ç߈ôÙ½ÂÏÅÛ«‚ ½9߈±»ơꇺ©Ç“Ơƒ§Öù×ơêívơ½Ϻơê»Å߈Ó±ù×ÏÄå»çÚÁ½ÖƠ™‰kß [ïSƒvψƒØ–àŸèøêƠ ¡Áù߈ÁĂùèÏỘ"ĂÙ™‰kß [ïS“ÆÅÔóǯÈçÚɹá=±½ñ×ͽ½Ă׾»ử“½߈‹ÇÏÔɇ¡ÓïÚÿÇ߈ëöÇØÏÔæ$£»gƒà¡̀Ó»‡ëöö™‰kß [ïSƠÉÏÔ™‰kß [ïS‰öÁ8¤‡Ûº÷Ù°¿ƒ½ÍIJÂƠϺÄÓ ‹Ç÷ÚƠĂơèÅå̉ ưÀµ·̃›¾Ù×ëÓ߈ăÁº›¾ØÅê±»±»Û«‚ ½9匿NăˆŸơê«·3uU¸Ú¬Ö +ÿÚÎÔ™‰kß [ïSµƠˆÛ«‚ ½9¹Á›¾ƒå‡¹ÚóÂưÀ«Ú³”½¬v˜Óï½߈ăÇí¡ÛÏÚơÔöÁ#Í­H«Ôăàëö§ÆÿœÁÚª‚ +¼9¯ÛÅëß«‡“ÍjơếơÛ׫‡“ÍjÏÔ±»ëöªÚ©Ù×éºøê ÁƯ«ÔÏÔ…Ôó×½€·}¢ÔÑĂëöáÅưÍ|Á̉‡Ç®ÈÑÓ߈±¿ƒ×ßơù×ÅÙƒÖ±»…ØÏ̉™‡߈±»™‰kß [ïS9¥‡×›¡™‡Ïԋܱ½ß»û¡'Ê¿½ưÀ‹É0Ư¸©‡¥2ßëM™ëéåËÜ Ơ±»Æ« ©ƒ»5ÁƯóÔ™‰kß [ïS¡ÛăàƠ«Ú›¹µaéơ¹£”Ö©‡¥2ßëMÙŒë*«‘Û¡ÈÏÔÙŒë*«ƒv ËûÙ½ä̉‡Œ½ưÀׇ½7ùđù×½ÀƯ¡È±»̣ÄƠÚª‚ +¼9²º̣9¥‡×ŸÖÜ™‰kß [ïS·Åƒ “ÿ¯¶ÇÖ߈߈ù×ăˆŸ;9¥‡·‡‘×8ç¶ô±»±»ÿÚ³ßÄÙâḈÙ׽ȪÓ÷å5Ó»‡Î̉ÑØùåù×ß»ûËÉ9‹ÜæØÚסÁûÛÙ½ˆÇœÚËÇÏź߈sƿô©Ç«»¡»ơê¼Ô™ØăˆŸ¯È»ØöX9¥‡ù׺۫‚ ½9†º›¾½ó|ÁƯ₫®¶½ĂƠÿ¯¶‹Ç±̉ù×ơ»«Ôøô•Èû›¬¾‹È‡ñ5ăỮÁªÓÏÔ–ŒY»Øƒv˜‰j̃ZîSå̉ €ë ù¿ÙÅë×ĂÍÿ‡ơÔï»íÖ™‰kß [ïS˜êèäåôœ‡ÿ¯¶…ÏÔÏ؉j̃ZîS§ôׯö†ŒÖ¹ÇÖù×Ù½₫÷Á×"“ÈăÏÅăˆŸ;ùדƠ™ÉçÚùו‹H°êØÛÄÓ«‡“ÍjùסƠ߈±»Û«‚ ½9‡Çï½™‰kß [ïSçØÁ̉ÙÚçڧư»Ă_ÑÄë±Á½ơêμ«¼ÏÔùêơêûĂÍË)éÛ9¥«ÚôêÍÓ½—ØÛ«‚ ½9Û«‚ ½9°¿6­Ä¤ˆ \ 0  Ơ߈ù×ÓØ‹ÇŸØ̉í4Ç%µÈûÏÅơ‡˜‰j̃ZîSñÓÁ̉ÏŹڵ«‡“ÍjçÚ²ÈăˆŸÙ½§Ô߈±»‡Œ½ù×ö™‰kß [ïSăơÔË̉Úù×ô¥ ºÅ÷ÁÛ×ù׃Ä"·‹÷ÔËá½Ø§ôŸèù×̀ Ê) èÛ 8 ¤   ›v™ÔñÖ߈‰¿IĂÙçđÛ«‚ ½9Á̉ñå̉ Û×ĂȘêèäƠ¬ÖÛ«‚ ½9Ù̉›ÚùêµÅ©¼‰Ûù‡Á̉ø¿¥Øơéêö¯Û£ä$±»Û«‚ ½9§ÔăˆŸ;ÑÓÛ…ÚăˆŸĂJ߈™ô±ÀÁƯ½¶ +è +ÙÚö±̃ëÚù×Û×ăˆŸ;ăˆŸëÖ¼ôƒvẩ‡º™‰kß [ïS‹ÇŽĂÈ߈ñÓ×ßÑӵث‡“Íjº¨‡¤2€̃êL½‡“Úª‚ +¼9ôê÷Á‡ºóÂó¶ù×±»ÏÅÛ«‚ ½9»Ø«‡“Íj·Ô‰yËÇỞœÜÇÖÙƠóÔ—¶ÏÅăˆŸÍË)éÛ9¥ÏÔ½ßƯÏÔ‡íêÏÔáê³Èàñ»ñÓăà÷ˆôÏÅ—»³Øù׫‡“ÍjÚª‚ +¼9Ể·Ô‹ÛÏÀưÀÂÑÓ‚›¾‡Ơÿ¯¶äĂÙáê‚v•ÏÔÛ×ăˆŸ—¶™‰kß [ïS½¶(è(™)9¥‡ÿÂÙ½ÅÀ§J«ÔƒvëöÿÚßÖåÁƠ±»”ÿ£Ơ·º½±»¸Øơú™‰kß [ïS߈®éÚª‚ +¼9€º¼—¾ñÚù×ÍÄ«‡“ÍjÏÔöñÚÛ«‚ ½9öÁ™‰kß [ïSÿ§ÂÙçđ¾ØƒvëÓµØơÄù×ׯ«‡“ÍjëÓ±»›¶é«‡“ÍjµØ›¾ưÀù×̃»úÅÓ™‡ÙŒë*«̉̉Û«‚ ½9›¾‰Û¹Ú›Û¹öăơ«‡“Íjÿ¯¶å̉ ‹Ü³ù×ĂĂŸÈ߈Đ/ñÁéêĂÙÑÄëưÀϺ́ –G ö¶ưÀ·‡‘×8çơêƒvåĂ™‰kß [ïS£Ø¹ÚÛ«‚ ½9¿ÔƒˆÛ«‚ ½9 Ơ9¥‡‡xăÇ톌«‡“ÍjỞ½›¾ß»ûÙÅë8¤‡ơê¡Ç³ÂƯ»‡Åà÷ÁÁ̉™ÁÏÅٽɀÿ¯¶½ ŸẸ̀Âç½ù×êơÿ¯¶ÄéÓå¡°ÈÁ†ĂÙ Ơß»û£́EÓ̉…›¡Ô§ô”ÖíÖ¹Á±»ÿ$½ĂăºÏÔ­v—¶°êØÛ«‚ ½9ǽ™Áëöơêá íê›ÚソŇŒ»‡ÙŒë*«9¥‡±Ô·ÅÏÔ¹ÚÆ»©‡¥2ßëMơêẵ™‰kß [ïS·¼Í7Û«‚ ½9ư‡±ù1£È×¾ÇÖ˜êèäßϪ¶2tTÁŸÉÿ×¹Ú›Û˜‰j̃ZîS½ÁÑĂ¿̃߈™‰kß [ïSÛ×ÓˆÏÅÓ å¹É—ØëöûÓÁü‡°ø1½ÊÚàÅ“Èù×ÏÔ˜ôÑÓŽÄÓ«‡“Íjưćä·Ôçºí§Ø߈¿ôËÉ9ëöµØ•ÓÔ«·3uUøê°½̃ÄØ½ôß»û‚ر»ëö…Öơèŧؽ£ôµØ‹ÇÛ«‚ ½9ß»ûûÓ¾ ëö°»­Ä—¶«Ôg±»éôäơëö“ƠÀƯƒv‰¿IăˆŸ¡ƠÍÇÛ«‚ ½9£Øƒ¾‘™óÇåôå‡ùº«ÔĂÙ­ÄÏÔÑÀçđYçÚÙ±»ơê߈ù×ŸÜæÚÿ¯¶½ưˆ«‡“ÍjƠ‹Çÿ¶ăˆŸ;Ă¼ó^½°»‡ºƒvçÚ₫®¶ï»éêÏÔùæĂÙ¹Ú½‡ßÁ¹ÚÏÔ÷Ú¶Û«‚ ½9ơĽÜùטêèä÷‡½ùÚ¥çÀăơÏ̉ă»™‰kß [ïSÛ«‚ ½9Ó8¤‡Ûº±»ù×æÚ©ÇĂÖ÷ˆÏÄ™‰kß [ïSÍÄưÀÿ½‹Ü‚³÷ÚÏÅơÔ“Ơ߈ÓØï³2ù×ÿ Û«‚ ½9¸Ú§ÛơÔ†Çăàëöù׳Ȱ»«‡“Íjù×åô®¼™‰kß [ïSØ×“ÆçƠçû(Ñ™‰kß [ïSôểØƠË-Ûºí¼©ÇÅăˆŸÁĂù×à…¾ăàÿ¯¶ăÁÓÆǼ·Ø¿‰ƠX·Å߈©%9¥‡ÙÚ—¿Ûº±»ÑÅÿ¯¶™ÁŸ\©¼ù×ƯÓ éÓ®ÓĂô‰¿Iå¾Ù½‰Áç·Ù·¼Í7ưÀù×Û«‚ ½9¾Û«‚ ½99¥‡Ë̉½ôívóÂ’È«‡“Íjä̉8¤‡½€ƒˆ¿»©‡¥2ßëMŸ}Ă¼߈ĂĂ ›­±àéMƒv±»ƒv™‰kß [ïS™‰kß [ïS¼ÛÂÓÅăˆŸ;ß»û­¾»yÛ«‚ ½9Á¹ív™‰kß [ïSíËØ¹ØơêÙÅë‡Û×»‡ăˆŸ;kửƯÓ ùס߈ÅÙ½ù×ĂĂ›¾­½¼½ñÁÅàµØÅƯơÔËÇ™‰kß [ïS˜êèäƒvêÖ·Ôéơ›ÛÙ½±»«‡“ÍjơÔ9¥‡×ơêßÅÙÓƒÖ°È í—GŸÅÛׇ“ëöÛ«‚ ½9áؘܵêèä̀Ê)èÛ8¤«‡“Íjù×ÙŒë*«ív±»ÑÓ󇱻«·3uU«‡“Íj߈íÆßÄÙ9¥‡×ăˆŸ;ÎÅÛ«‚ ½9匿Nù×߈߈ơĂơÄÏÔđÔ«‡“ÍjºÛ«‚ ½9ÏÔ«ÔæØ8Ň“©‡¥2ßëM̉̉'Û×çÚ£ÇÙŒë*«ñÓ¹Úî²2âºéêöÁÛ×Û«‚ ½9̃ˆˆĐÓÑØ°»ỞÍěڱ»¥ÛơÙÚ̀¬H·ÅÅØ¿Å™‰kß [ïSºy!°»±Ô™‰kß [ïSÅØÏÔ‡ŒŸÖó°ù‡Ó櫇“Íj’Ç÷ÏÔÅ,ËÇ߈щù׫‡“Íjơê±»öưÀăéÏhÔĂÙưÀïÅÛ«‚ ½9·ÔơèÅ™‰kß [ïS³–É6—¶9¥‡̉Ø8¤‡÷ÁÛº–¾æ'·ÔÙÚçÚæô¡ñÔ¹ÚăˆŸ;—ŒĂî¹Ú÷‡©«‡“Íj…Ø‹ÇٽﻶÜÏÔ±»÷$ÏÔù×óÂĂƠ‰¿IÙÅëÙ½ù×½µ†›¹öÁ̉Û«‚ ½9ă»—˜©Ø«»µØÙ̉¿‰‹Ç‹ÜñÓ‡ªÚá×ñÓ™ëéåïÚƒ½ơêÙÚƠµØ±»¦Ôơê²½ƯÓ ߈ÙÚƒv¿‰­Ö÷‡đÓ‰Ơù×Ù₫ψ½¹̃©¼½ÀĂ½߈óÔßÄÙÏÅψÁƯăˆŸ™‰kß [ïS«Ú£ÇăˆŸ;ß»ûºyÅØÏÔ»½ÍË)éÛ9¥íqÑÄëñÓÛÚÑ·ăˆŸå̉ ³z‡xÑÓÛÄӕסԱ»Ăôưˆ®Gø‹Ç‹ÓóŸÖѶ߈ăˆŸ;ôê×ÛÇÓ͹»‡›¾‹Ó«‡“Íjû¼¤ˆ\0çÚ™‰kß [ïS«»ĂÏÔ©Ơ·‡‘×8ç÷ˆÆØ¿Ø߈9¥‡¡ÓÆ¥ÖöçÇÇÖÇ»µØ§ÓçÚƒvëöä̉  ¹Ú«‡“Íj¡ÛĂ½¼Ă ¼€µƠ´aʼn<µƠß»û˹÷Áƒˆ—¾Ë̉ĂÙÛ×ăơ™‡«‡“Íj±»°½§Æ«Ô‡¿±ôñÓ™‡¹Ú“ƃv¾ơÔ®G ø ÛÄÓåĂ«·3uUơÔóǦÈùë•̣é‡éÓëÏÔăˆŸ;kó‚ˆÓºÑ ù×Ù½³Ç¥ßÏÔĂè™ôĂ¡ÛơêÁĂ÷ÁÏÅ̃ÄØÏÚÙÜ߈‡ŒĐŽÔÛ«‚ ½9×¾Ă™‰kß [ïSưÀÀéǭ¾¹Ú×ÓĂٵؙ‰kß [ïSÙÚăˆŸ;ÑĂœÂÓ¸ÚS±»ăà’ßÁ¥Æ¹ÚƠ~߈·Ô߈ôêă‘·8¤‡×ù×ñÓ«‡“Íj«‡“ÍjÏÔăÇí¿¹³È‡¹Ø•Û½”Ô½­Ä½óÇăˆŸ;«‡“Íj“Ûëç—»›¹ÙÚ™‰kß [ïS߈ŽóÓ¥¦ù꫇“Íjù×¾ëÚß麽Á̉ÁË¢X±»ßƠƯºô·¯…ø˃ÆÅ¥ ›¶éưÀÑÓĂÙ½°¿ÓضƒÔÆûêó#“ºËƠơÔù×™‰kß [ïSĂĂ™‰kß [ïS©ºÛ×ÁÓˆơèÅ™ëéå9¥‡ª¶2tT™‰kß [ïS«Ô¾ĂÈ—¶ßÄÙö±»ŒƠáêëöơèʼn۩ÇơÄÛêÂÈÜ£Ø߈™Á½€‡ºƒTÙÚĂ߈ăơÛí9¥‡˜‰j̃ZîS™‰kß [ïS̃ˆưÀưÀÏ̉߈™ëé嫇“ÍjưÀçÚ°»¶ÙÓÏÔ“ÈÑÓ…ƠñàÁ½·‡‘×8ç¡ÔÅ¥Ù×8¤‡ív¿»ß»ûÍÓ³ô™ëéåŸèÑű¿¤ˆ\0ơÔÏÔÙÚ烈³¿ß«‡“Íjï»Á©‡¥2ßëMï̉Ͽٽ¿ô™‰kß [ïS¹Ö™‰kß [ïSÑÄë“î»̀ÓóÇÙ½±¿·̣ùׇ£Ç₫Ú9¥‡™‰kß [ïSỞ÷ÚÑÓëöª‡’̀jàØ’‡Œ«‡“Íj߈Ù½Û×—¾º½©‡¥2ßëM·ÔßÏƒŽ«‡“ÍjñÓ‹Ư‡Œ«‡“ÍjÅÓׯă½ưÀßÁ½¹ÚÿÚ߈›¾Û׿,¶ùó×¾ï»óǘӽ€ÏűԯÛö°»ÿÚgưÀ…ÖÙÚßÚ•Œøêê¼½ÏÔÏÅ₫Q®¶Qщ£@—ÓƯ1ƒvå̉ 󫇓ÍjĂÙÁĂÙ½½÷ÁÿƯóÂß»ûëÓ9¥‡Û«‚ ½9·¼Í7ĂÙÛ«‚ ½9 Ëûù×Û«‚ ½9ËÇëö÷‡ÿÛôêÏÔ†“¹ÏÅØ¸Ú™‰kß [ïS©&ëöŽ«ÓÛ«‚ ½9¹£ÛÚ߈«‡“ÍjÁƯ±ëØÓ'ă੼½±»ëö±»ƒvÑÓĂÛ×Áχ«‡“Íjۺ׿8߈½«dƠ³Ø«ÔϺµØùÇå¡÷p¹ÚÅØå̉ ½Û«‚ ½9ÏÔ›¾ñÓÁƯͼ¦ôÿ¯¶ÏÔ©Ó™ÔµØYô©‡¥2ßëMơÙ½éơèÅëö±½ƒˆÏ̉ÿ¯ƒv•ÓƠÓÑØù×Ñ×·‡‘×8ç àëöψ߈ƒvív—ïĂىʑÆÍË)éÛ9¥¡È§ÔÁ×Ö¾́ơÍÓÙŒë*«½˜‡øê«‡“Íj́ØƠXG½¹Á½¶‡Ö8æǽïôﻩ½ôù׋ÇơÔÔ‡ŒÏ̉ƒvĂà9¥‡ÅØăˆŸ;ưÀ¹ÁÁĂ·Ôÿ¯¶•ï›¹Ñæ§ô±»ÍË)éÛ9¥³ºó›¾ßÚѶ¦Ô߈—¶ö“ƠăˆŸ;ù×9¥‡ϼßÄÙ߈ù×ç/½€¿́̃ˆ­v‡xÇ"éÚơÔÂăˆŸ;ÎÅù£Ø›¶éƒv©Ó®ùꙉkß [ïS‹Û9¥‡߈ù×ß»û›ƠÖÆh·ÔưÀÙ½îºÏ̉ëö¼ù×’¹ +ÜN +»Áù×½ĂÙÛ«‚ ½9÷Ùû´ÎŨ¾ù׫‡“Íj½Ü»Á±»‡º8¤‡ùë±»ƒv©‡¥2ßëMµØ«‡“Íj½Èùº˜‰j̃ZîS†ÚâˆüÁ™‰kß [ïSăÁĂÖÖÆǼĂÙưÀÛ«‚ ½9¡Ôø×³±»™‰kß [ïS¿‰±»Ïű»ăˆŸ;ívÓØ­Ø¸Úÿ¯¶ĂÖËÇÛÄÓ÷ˆÑÓÛÇÅù×ơê½ôê÷§Æ»¼‘ç̉ơÔÛ«‚ ½9ßÏÑÅÍĂÛ×±»ơêщ÷ˆÛÄÓ߈ÁËƯºƠX·Ó ¥0±»ÖĂªÈ¹Ú×Ó«»…Ú̉ æăˆŸ;ưÀªÚ&9¥‡º‡ºÓ'ÙÚĂÙăơÅÔŸ¿Ă©ÓÓæƒvåĂ¡ƯŸÅшÛ«‚ ½9±»ÛׇºăˆŸôê“Ơù×Áñ’ÈÏÔ™‰kß [ïSÅÄÿ¯¶™‡₫Ú§¹ïÅăˆŸ;ÏųÈăˆŸÏÔ«ÔÿÚ­ÄĂº›¶é»Åƒˆ˜‡ØÜÏıëØƠÂăˆŸ±»±½çÀͼ±»©Ø̃ˆ¿‰Æ̉™ÁưÀăˆŸ;ơèÅ¿»“¹ƯN­Ä«‡“Íj£äå̉ ±»®Ó¼¾è–««¦«̀»««ÅØáꘉj̃ZîS±»ϹÅÄÛ«‚ ½9Ïí‡ăˆŸíÖ÷Á¯Û³Ư¶‡Ö8憺ÏÔÙ½ƠX™Ó¥Û›¾̃Úëö‹Ü§ÓơºŸøùט‰j̃ZîS¿ƺÙÅë†îÅƠͼ¡¼ù×ç8óĂù×·‹§ÔÛÇÛ«‚ ½9Ở߈ívƠÿ¼9¥‡ö¶è©ØÿÚ±ëØ¿ôßåÁ²ÆÙ½¶²™‰kß [ïS‹ÇźÏŹÈ₫ÚơÔºͼ9¥‡ù×é‰ñ5ñ·À¹¿‰³båƠ¿́ÙÚÙ½™‰kß [ïS¡Á·ǛÓ-ÛÄÓ±»™‡ív°êØÁƯêçù×÷ÚÍË)éÛ9¥ù×ĂÙ÷ˆ‹È÷Û«‡“Íj±¿ƒƒˆé¡ÁÛûó×ưÀ¾Á‡é/×:ÛÄÓÙ½“Ơ÷ÁáêåăÿÚëÓÇáÙ½ÓÔÂÙƒvœ·̉ ¤0™‰kß [ïSÍË)éÛ9¥³ôăˆŸ;Ÿ«‡“Íj«‡“Íj«‡“Íjéꇌ˜Á̃«dׯ«ÓÛ×ÏÔßÄÙƒvĐ©¾óÔÿ¯¶±»ûƠª¶2tT¿‰çÚ߈߈ßÚ³à¡Èÿ™‰kß [ïSùơbv²+`߈8¤‡ă§Ô…ô©Àö±»߈ÏÜ’ºüÆ«‡“Íj¡Áº½«‡“ÍjÏŃ˜Áâà‚ÖưÀ·ÅÀĂÇô™‰kß [ïS©¼¹™‰kß [ïS÷Á«‡“Íj‰¿IÛ«‚ ½9»Ø÷Á«‡“Íj›¶é¥Đ…Œ̉®çÚÎÔ±»ÁÓù׫‡“ÍjŽÙÚÑĂÿÇÏŃˆ%©Øơê©Ó—ÓƒvơÅơꆌ°½Ù×óÇ·‡‘×8çÏÔжµØíêÛ•«Ú·ÅăˆŸ;¡ÁÏÅ‹Ç߈·ÅăÁ́ơ¯È™ôÙŒë*«9¥‡ÏỒÓ©‡¥2ßëM ß™ÔG½¹ĂÙ…»åô™‡̀½å̉ ôØ«‡“ÍjµØ±»»Ø»~çǪ»§ƠÅô§Ô¼ĂÎ̉ÍÄơÔéÙ¡«‡“Íj™ëéå©ÓơêÀ¹½€÷¼Û«‚ ½9™‰kß [ïSƒv›¾ÛÄÓá ƒÔ±Ô…»±»½ăơ›à·‡‘×8ç±»ÿÚ¿‰ă©ƒ×Ùڃ؛¾ËÖI†ĂÁÙµÆơ™‰kß [ïS©Ó«‡“Íj½¨‡¤2€̃êLçÚñÓăˆŸ;±»É Ͼ¥O‘ÚöƯÓ ơêÏÔ“Ơëöëöá ưÁ¿‰ăÁ·‡‘×8çă½ÅÓå̉ ܧÔѶ¾ßĂºÊÖÓÆ¼ ăˆŸ“¥Ù¥Ÿ«d©ÓïiÙÚר…µØ̉Áù×ËÇ™‰kß [ïS臃ø›¾§Ø¹ÚăˆŸív©ˆ×ܽԷÅß»û×¾±»ç½çÚ½óÔ±”»ÅÍÄ) ÔÙÚ†º߈±½ßÚ‹Çå̉ ߈ÎÔùôó›¾ÿÚ×Û«‚ ½9î$¤Ä“ÏԙؽÜϺăˆŸ;ÏÔ߈ÿ§߈ưÀÎÅÏÅ«ÔÆÅÓ¹Á™‰kß [ïS¹Ú Á‡‹Ç«Ú³ºóĂÛ»÷¶¸SµØ©¼«‡“Íjù׋ßăˆŸ·̣ÁƯ›ÏÅ­Ô÷Áëö«ÔưÀƒv™‰kß [ïS˜‰ j ̃    Z îS —¾™Ø Ô‡º¡»ëöÏ̉Æù×µ‰ÿÂÛ«‚ ½9ơĂ¡ÛĂȺÓÓ«‡“ÍjÍË)éÛ9¥›ÚơÔÛ«‚ ½9—؛۷ñ¿‰‚ˆ‹ÇÏ̉ÓÇ™‰kß [ïSưÀáêéêÁƯר½µÆèÓ±»ù×µaÏÔ—Ó½€¶½€áê»Ô¿́…Ơ߈ÑæÖ̉Ù…»ÜçßÂĂ¶Ô£Øƒ½Ôù×ÑÄëÏĂÙÈ»›¾ÇÖ߈™ëéåĂ¼µ†g¡È±»»ô»Øë Ï¿«‡“Íjû½€ï»ô³†ăˆŸñÙăˆŸ;éÓ߈ưÀ̃ˆ™‰kß [ïS­óÂăˆŸƼ½—ó±»߈Ù½ªdâˆ:œÂÏ̉“°€ƠÅÓÅØÛ«‚ ½9ëÚÑÓ¡ÔÛ×±»¬Öƒˆ÷‡ĂÙµØÛdzعÚÙ×ÏÅ߈ÿܱ¿߈Ù½ÑÄëªÔƒwëö¯G‹ø°»‡Ơ½€±»ĂJăˆŸÛÀ¿ƒÖÁˡȵØÏű¿±»§Ô₫ÇËÓ¥‰ÍL…ƒv¬Ö̉²Â«‡“Íjµa‰¿I»¼‘ùê‘àăˆŸ;­ØàĂ¡Ôù×™‰kß [ïS³ÂÛºçÚ÷Ú¡Ø¡Ûÿ¯¶ù×9¥‡ƒ½ÅØñÚ›¾‰¿I©ÓùêÏŵ•ƒvÏÅëöÙŒë*«ƒØƒĂÅØ‹Ç߈Å9¥‡×µÜË̉ÍĂø¿£Ư·ôơꙉkß [ïSÏÅ«âäƠóĂª¶2tTß»ûùׇŒ®È߈ÛÄÓ§ô™‡ù̃ÏÅĂÙ½‚ ÅôÙÅëÅñÓÙ½ÇÖù׺ÙÚ™Á̃ˆÅ»“ÈŇơĂÛ«‚ ½9°»©ÓÏÔÑÓµ†ÏÅÿ¯¶­Ä»ÅÓ̉wơÅơÇé‡ùל‰¾I±»£äëÚ¶øæĂĂ ›­±àéMù×¹Ú…¾‡ñÓÏŶ8è8›¿‰Úª‚ +¼9©‡¥2ßëM±»¹ÚôÔơÔàˆÀ0p¸Ø«‡“ÍjåĂå̉ ½߈ß»ûÛ«‚ ½9·ØÏŶ‡Ö8æÛǣǃvÏÔơêĂºƒvưÀ¿‰¼߈÷‡ăˆŸ›¶é©ÇÛ×Û«‚ ½9«‡“ÍjÛ«‚ ½9ăêÇÖ«‡“Íjçɡǘ‡‚v×Ơ†Œ!!!²Ơå̉ ÷Á©Ơ¿‰ÂÙ™ÁÛÿÚ«ô±»÷ˆ8¤‡±»ÏÅñÓŸÈÇ‹¸Á¡Ôº÷‡˜‰ j ̃    Z îS óÇ•ÓÏÔƠįܱ»™‰kß [ïSơêĂÙßÁ߈×ÜăˆŸ;Ï̉óÔăˆŸ¡ßɹ°‡÷‡“¹ƯNÑÉÛăˆŸ;â›KäŒÚ> 9ƒv ËûöÛꓼ„ơê¼ÏÔ߈Á‡é/×:ù×­ïĂĂ ›­±àéM¯¼ÿÚ¢äĂ ùץĿ¹߈™‰kß [ïSÙ×ÍÇÿÚ›¶é£ÂµØ½ÏÔÿ¯¶ÍÄëö*ĂÙăˆŸ;kµØ¿»ù¾ưˆ£Ó«Ó»Å÷ÙßÄÙï½Û«‚ ½9Ë·Ûùê±»ơ»ëöÀĂÛ«‚ ½9·Ø›¾‹Ù±»ó½ù׫Óÿ$ÎÔƒv«‡“Íjϼø×½ăˆŸ;ÓÔîÅǼùº½ưÀƠ•»©«‡“Íjñ­é%œÜÓÉá…âˆ:ÇÖ«ÔÅĸÁù×ßÖ™Ó©½£‡ÓÔ˜‰j̃ZîS÷‡ÁƯăˆŸ;µØëöÍßË¿¯$’¹ÜNÇֵعÚÛăˆŸ“È“ºñÚ»ˆ·‡‘×8çƒv­Ö麙‰kß [ïS™‡½ÁÙỜÊ)èÛ8¤߈°¿¥Ï¹ÚÙÓÓÔùơ¹ÁÔË1‡Œ”ÚĂôÍBÁĂ™ëéå÷Úµ†ÇÖï‰Û«‚ ½9©ÓǺÙ½£Ç«»ÆĂù׳×Ù½’¹ÜNß%à ÏŤˆ\0½€̃ÄØăơỞ‚vçmÏÅăÇí°»ÑÓăˆŸ;»Å¥ˆ]1±»™‡›¡ÅØÙÅëÏ̉«·3uUÅÓëöĂÙÑ`½µÈ»ÁÏÔ½ĂăÄù×çÚÓØ̃ˆư¬ăˆŸ;¹Úùº¦º ÅØå´öùê•Á̉½É£µYÏÔµ†ïÚ±́ù×Ù̉µØñÚù×›¶éÛ×ß„¥ˆ]1Ù½ăơ‰;‹Ó±»§Æß„߈¾ă½ø×¡Á«Ô÷Á÷¼ÙÅë»Ú¹ØóÇɇểµØïÇÖß„ƒ„“ÇËÇ߈¹Úº½ù×Û«‚ ½9Û«‚ ½9ơÄ9¥‡߈™Áµ†߈̃ˆ—Óëöÿ¯¶¹÷ÇÖëöÍù×̃ˆ©Ç«%Ơ˜‰j̃ZîSù×¹ÚƯÏÄÅ鵆9¥‡½Á¿ô5º¬Ö ¹'ăˆŸ¥Æ«ÓƠỘÔ›•Èû›€ØíÖïƠ‡Û¡÷Á9¥‡âˆ:Û«‚ ½9́½ ăˆŸăˆŸù×½Û«‚ ½9ï»ñÚ™‰kß [ïS÷ˆ߈±»‘Æ£äÓÛÿ¯¶¾³¸Ú™‰kß [ïSåĂ£Ó«‡“Íjá̉8¤‡×ÇÚµaÏÔ‡Œ‚vµØÚª‚ +¼9ñÓ“Æׯ±»ÑӽؕÜ9¥‡“¹ƯN™‡“ƠÔÅëÚ™‰kß [ïS©ˆßÄÙÁ‡é/×:ÂÙ±»·#½‡Ú‰øûØËÀ©‡¥2ßëMÛ«‚ ½9‰¿IÿçÛÄÓù×ư“ÏŽÔèôÑÓׯµÀưÀ¹Úß»û©‡¥2ßëMñÖ§ôÏÜÇ ÷‡ƒàÅ–ñÚ·‡‘×8çÛ«‚ ½9‡˜‰j̃ZîSƒˆÅÄ‹É0¡ÁÓÎ̉±»µØ§Ó¹Ú«‡“Íjù×ù¾߈‹Û̃ˆ–¶ù«‡“ÍjµaăˆŸ;›ؽß»ûé‰ñ5ñ·ÙÅëÙ½Øëöÿ¼ú™‰kß [ïS©Ǿơ™‡ß„Ú×íê…Ơ•ÇÏ̉³±»‹ÇƯé…öö¶«‡“Íj±Ù½߈¡ÔƒˆÛ«‚ ½9ƒˆ‹ÇỞÁ̉¾ß÷Ú‡Œ±̉çä½ô·‡‘×8çĂĂ ›­±àéMcºù×…ØǼ¡Á«Ïŋٙ‰kß [ïS™‰kß [ïS«Ô½€˜êè佃(Ï̉¼€Ä©ˆ˜êèä¾§Ó¹Ú±»“ºù×9¥‡å½™‡ÇÖ«‡“ÍjëöÅ–éÚ‰¿I“ÈǻٽÙăˆŸ;«‡“ÍjŸ}Û«‚ ½9¹Ú¥È߈‡ŒÅ]¯È‡ÑÓăàëÔƒ¾‘ăơÛ«‚ ½9¾ĐÓ¯×ÑÓăàƒv¥£ăˆŸ;¯Èù×ơêéÓ·Ó ¥0”ÖÓßÁ߈Ïԙ؟ØÛ«‚ ½9ÏÔñÚ‡ŒÍË)éÛ9¥ă»ăˆŸ¾ÏÔÿ¯¶½ÊÇÙÚơÔóÂÛ™‰kß [ïSåĂÏÔ»GéêÏ̉ƒˆµ¥Û¡Ơ±»ƒ½߈ù×™‰kß [ïSçÚ‘ÆÅÔÛ«‚ ½9Ó̉›¾±»߈çÚ›ÚÓØåĂψ½«‡“ÍjĂ¡ÔÁ½„n1ëöæÚ̀Ê)èÛ8¤ËÉ9«‡“Íj¹Ú«‡“Íj«»—¶ï½Ù×§Ô£»‘ +™‰kß [ïSỞÍÓỊ̈ÅØ9¥‡ơêÓ¾Ở½Ô…öë¼ÿ¯¶Í­H߈ƒÚĂÙơÔ¸£ ÈÙÚÖÔ†6¦jăˆŸ;…»ă¿²éêÏÔĨÀÜƠ%áö±»ǼĂÙ°»ăˆŸÙÚÿ‡¾¿ô‘ÆÛê¹Ú¯ôưÀù×Á|ñÔÁÛçmÎëö¿Ø½Ơ·ÜçÚơÔÿ$ï½—¶¬ÖöÁ¨‡ +¤2 +€ +̃ +ê +L + +ɇÂÙóåẴŒÚ,¼´Øg¡Á½ÏÔù×}‹Ü½ùש߱»®Ûµ†«‡“ÍjÙ½±»¬¾ÛÀ­½¼÷‡ÑÓƯÓ ăˆŸ;kơêÏå9¥‡×‰¿IÏÅưÚ®Gø°»“¹ƯN߈ø¾ÑïYÛ×èêÛƯăˆŸ;¨¼ —¶¥ØÏÔƒÖĽù×ÏÄá꯼ÑÓÓÅÏÔ“ÈÄĂ›¾̃ˆ©ÀǻÉ̉¡ƠщÏï½³¿đÖÆ«‡“Íjï»°» +Ë̉ơÔµØô·Åå̉ ëö½¹ÚĂ¼µ†¿¹—î½±»̃Ö—îÙƠÅÔ¼¡ØÏÅ¡Ơñ»»qóǣؽ߈Ï̉ÿ¯¶³Æö‡‹Ç­ÇÅÔÖ‡¼7߈›Û›¾ƠŒÓ‰ñµÚ½©Ø§Ó¸Ú³È«‡“Íjç̉ÅØù×Û«‚ ½9Û×ÄÀƠÏÔχåÁí‡ƯơÅÛ«‚ ½9ëÓô»ĂĂÙóÇôÈ̉™ÇÏÅà=ñÓƒˆÁ½·Â­î« ©ƒ»5üĂ·Åß»ûÈåô«‡“Íj󼁯…ÛçÚăˆŸ£ÇÏÔ±ŒÙܨƠ‹Ü¢X ÑĂ«‡“Íj™‰kß [ïS±»³¼“Ơ±»±¿Ù×Úª‚ +¼9™‰kß [ïSéêưÀăˆŸ;—¶ăˆŸ;¥‰ÍL…ívñÖ«‡“Íjù×é½€±»¸Ú÷ÔƒˆùÚ«d” ºÔ«Ô±»ăˆŸ;½˜‰j̃ZîS¹ÚÙ½¹ÚđÆ¥ˆ]1ÿ¯¶ûÙù×çºô©ØÿÂù×™‰kß [ïSùôèÓíûíŸÈ™‰kß [ïS³«Ùëöª»Ù×§à±ƯơÔ³¹Û«‚ ½9ơÇĂëöåÁÏÅĂ£XÀ×±ÔÛ×́Û×ÏÅ™‰kß [ïS‰¿I™ëéå±»«‡“Íj. ÍÓ£ ±»ß»û…Ø•ŒëöưẠ́ǙӃظÚÏÔ°»Ù-‘ÆûÑÅ™‰kß [ïS“ÇưˆÍË)éÛ9¥éÓ¹ÖÛׯù×ÏÔ›¾Û«‚ ½9÷ÁơêíÖÿÚĂ×É›¾9¥‡´Ăă¢uÁ•ÁÛ©Ó×Äă½‡ÏÔÚÂÏÅƯ£äíÆ“Ÿ̉«‡“Íj«Ô¢ôåƠÛ«‚ ½98¤‡ß»û÷‡ăˆŸ;ơ‡½«‡“ÍjÉ™‰kß [ïS¥Á†Œ₫®¶$›¡ÏÅëöƒv—Œ¿º¯G‹ø·Ôù×ĂĂ¹Ö›¹ƒvÇ—ÿ§ĂÙœÔëö®¼ÙÜăà°¨”Èú˜‰j̃ZîS­Ä’½ÏÅ‚v™Ó¹«Ô«‡“Íj‹‡ăˆŸ;këÔ«‡“ÍjÎ̉»ØÑÓ₫߈âëöăˆŸ;kÛ«‚ ½9‚±»Û«‚ ½9¡Èÿ¯¶¿ôÏ|ơê¿»ÅØ³ºóñÖËƠïÁ¿¹ÚưÀ©ÓăˆŸÂƠëöƒưÀÙ½±»ï½™‰kß [ïS¡Û™‰kß [ïSĐ¹¡È™Ûô±»“Ơׯ‹ëçÛdzàáÚ‘ơ·Û±/ù¿ơéù×ĂÙ°”›¾™ÓÏÔÙڣ؉¿I¿ô¶ù×·‡‘×8ç—»ëÓÁ¼ëöù×̣Ä™‡©¼ï½ăˆŸ;k«‡“Íj•Üó›¶é™‰kß [ïSù꽯¾Û«‚ ½9¡ Á¹ÚăÇí9¥‡ĂÙăˆŸăˆŸ;ÔÚÛ«‚ ½9Ÿ}™‰kß [ïS™‰kß [ïS˜‰j̃ZîSôê§àóÂ¥í“ƠͺƯº°»ưÁØ×·ÜÛ«‚ ½9Ù×ù×™Ô½€±»íº§Ôƒ×¡Á¾¹x¼ôí0ƒÖå̉ ›¡¾ß›¾™‰kß [ïSÛÑÙ½ùׯ» å×ÁĂĂ÷Ù±»ùê±»ÄÀ߈Ó̉©‡¥2ßëM₫©Ó©Ü±»ưÚûÙG½¹߈Ăº­ÄºÁƯºăˆŸ¯È…ăëöó›¹ơê¶¶¶‹ÇóÔ¶‡Ö8æ–¾–Œ‡Œ™‰kß [ïS“ÈɇÑÓƒÖ«·3uUµØ·ô•Œăà˜‰j̃ZîSĂÙÓØ¡È½ôÛºëö…Ü¿øß»ûͼ» ÷‡³Ûº¶Û«‚ ½9Î̉«‡“ÍjæÚĆǟ÷ˆ«·3uU©¼‡ÚÏÔƒˆÉÏÔÛ«‚ ½9£Ø̀ÓÜăˆŸ;k»‡ר‚·Â³È“öëÚÑĂÙ÷Á߈ÏÅÁ¹º³n¡Èí‡çôÙ×öơÔºƠØÏŘÁ ÍÓ©ù×—»רù¿ÏÅ…‚ÂĐ"¤ơÄÿÂƠ±»¹Úç߈¥ÇÛ«‚ ½9ÑÄëĂÙ½ô‹ÜªÔ±ëØâàÛºăàÂÛ«‚ ½9åĂרĂ߈廃¾‘ñÙŸàÅ—"ÏÓ¥ºçÚ“Ơëö¹Ú±»ÅØ È߈ö©‡¥2ßëMăˆŸ©‡¥2ßëM¹Ú¯îù×ùש¼‰Û­€›¾±»9¥‡ăˆŸ¼­ôÏŇۗăÜù‡«‡“ÍjÛº½¾‡å̉ ùơ…Ơ¥¾ƯÓ º™‰kß [ïSƒÖ¾ĐÅÛ×µØùëĂ³ÂÉ6ív“¹ƯN½ƒÑĂ8¤‡×¾™‰kß [ïS»ÈÏÔƒv­Ù÷ÔŸÖù׳؇áÇ߈…ö«ÛÁƯ‡ŒÏÔÇ̉óÇÎ̉ÿ§‰¿I纋̉Û×₫Ú·‡‘×8çÎÅÙ̉ÅÔăˆŸơÔ±»÷Á¯¼Á¹Ë̉«‡“ÍjÑØ£Ô†ŒÙÚØôß—¿»éº§ÓäÛס۫‚ ½9ëö…ôö$ưÀÙ½ăî·Å˜‰j̃ZîS¹ÚÅÔ¢X×ڪ‚ +¼9™‡»‡ëöăàëö߈ưÀ÷‡ñڋǫڵå÷ÁßÓđÁ܃ëö±»߈©ØÓµO§ƠÔXßÄÙ±»½»£»¿‰ÁĂ¡ÈÙܱ»†ŒăˆŸ;¡Ô߈ŸÅ¥ˆ]1ÏūԣتĐóÚª‚ +¼9¿ô«‡“Íj߈äơ «‡“ÍjơÔÏ̉́ºƯÓ ׯ­º·ÈƒÔôú¾™ÓÅØơêÏÅÎÔ—¶ÍĂ¿Å­̃ÿ¯¶öº³(•Èû›¡Ư·‡Œ”ÙÚÏÅëöù×ô™‡«»Ù¡Èà¡È¿ÅĂÙßÄÙß}û¸ÚăˆŸ»ºóÇăàß™ÓóÇ« ©ƒ»5ù×™f™‰kß [ïSơû9¥‡×£Çå̉ ëçÍƠÉÁĂ³Æ·ÔÛ«‚ ½9µØÂ¹ÚĂĂ ›­±àéMơê߈ÏÔ߈ơê“ƠµØ߈®ô¯ĂÙù×ÿÂù׫‡“Íj£Ç̀ÓжëÓƒØÓƒ½Û±»ÄÓ·Ôº߈óÔù׫‡“Íjÿ$™‰kß [ïSĂÙÆï½ĂÙ½ÏÄăˆŸƒvÑÄëív÷ˆỞÇ̉›¹…&ÏÄÙÚ9¥‡éºÚÆÙÚ÷ÁÉé½ơĂ½€ơèÅÔº +l +¹Ú‡Ú™ŒñÚ©‡¥2ßëMºÏÅÅÆ«Ó†Œ™ÁÛ«‚ ½9¯×½ôÙâùÚ¹Úø×Ơ ưÀÛƠ]Ûˆ¾±»ó^Ÿ»ÏÔÅÔ±»ܺ©Ơ߈«‡“ÍjÏ̉̃ˆµa·Ô₫+®¶+»ˆùׇǧôÛÄÓÁ½«‡“ÍjŸè¹ÚȹÏű»±»¥ˆ]1ƒvÛ«‚ ½9ïȹÁ¡Á8¤‡•½Ø×Ëù×Ù½ơÄæÅÓ‡º™‡«‡“ÍjÁƯ±»‡ŒÙÚÛ«‚ ½9¶èÏÅĂÙŽçÚ ÈË¿·Å™‰kß [ïS߈²¹Û«‚ ½9±ư·Ô9¥‡µ‰ÿÚçÚƠµØÁ½±»½ÙYçÚƒ×9¥‡«‡“Íj•Kﻵؽ€߈™–¶ÔŸÈăˆŸ;ßœñ"ï¥5ÿ¯¶‡xßôÓÅóơð»Û×ưÀƼ̣Âí—GÍƠµÜ™‰kß [ïS“Èü̉¡Û9¥‡Ù½ÅرƒĐĂ߈ù¿¬¾±»ÇÖËÉ9ÁÛ›¹Ă‚ö™ôÛˆ«Ôé¸Ú$ûơ‡½ơÁ߈˜‡›¾ơêăàÅÔ•ÿơĂ9¥‡™‰kß [ïSăˆŸ;k°»Ó̉Û«‚ ½9»¼‘¿‰×Ơ±»ĂÙç$ù×— —¶ăÁ˜êè䦹9¥‡×˜‰j̃ZîS€ßÚÙu±»μù¿¡Áå̉ áê߈ÏÄÛ«‚ ½9߈«»§Ó匿Nÿ&ÁÙ×ÓØÿ×ÏÔÓÔíêÇÖ°»¡ÔÛ«‚ ½9́vÿÂ󌫇“Íjá=©‡¥2ßëM¿£äâˆ:ơêóÑÓ™‡™‰kß [ïSÛº±»úÖ¯ñ×ÁÓ“Èù×ÿ¯¶ÏÔ‡ÇÚ½³¢ùÚÏÔáễÄØđÖ—¶ÑĂô›¾—»±»ĂÅÔửÙ½¿º¹ÚË̉©¼£»ù×£˜·ÆùêÑÄëÑÄ뺽€ïôƒ×±È÷$ù×ăơŸÈƒvÅÙ«‡“Íj«‡“Íj߈ÙÚƠÅ»Ăå̉ 9¥‡ăˆŸçÚ™‡ÏÅ£¿¡ÓŽç̉çÚöƠÉ«dÍÓºƒÚưÀ·Ó ¥0Á½áêÅØ9¥‡×ÜóÔûÙÁĂ»½Û«‚ ½9Ë̉¥́±»ñÓÊƠöå̉ ÅÄÙÚ¿‰ù×­ÄáƠ߈Úª‚ +¼9ÍÓù×ăˆŸ;k‹ÇîôYÁ¼«‡“ÍjÛ«‚ ½9•Èû›Éí¹»‹ÇÛ×éÚ±Ô÷ÁÛ«‚ ½9á ­ÄÿÖϾ¥O÷ÁçÚ…ö£ä×tÏÔÿÚ©ĂÁÜñÚ¾ơÔÏÔ«â£Ưµ†×ƠÑÀ÷ÁƠÓÅØñÙù×߈¿Ù9¥‡ñÆ̉ ÿÚôµØÓ¾±»߈’ßÁƒv§ÔÓØï‰ĐÄê Û™‰kß [ïSăˆŸ™Û·ÅĐÓƯÓ ¿Ø™Á™Áÿ¯¶½Û«‚ ½9©ÓñÓĂÙơÔỞ§Ó©Ü½¾—ăʾ:χ½ˆ!·Å›¶é˜êèä½ù×ïÓ ÷䃈±»áÛ«‡“ÍjûÓỞׯ±»Ă™‰kß [ïS¹Ú—ˆ±»óǸڋÇÀĂăˆŸÅÁƯù×¾ºËÓ¿ˆ!÷ˆçÚçfµØ«ö™‰kß [ïS¹Ú·‡‘×8çëö«Ô³ºó±»“ +ơÔͽƠ¼Ă¾Å“½đÄ–ˆù×±ëØ›¶éë#ÓØÑæ·ØÛ«‚ ½9ĂÙ£XơÉ¢ơèÅ«‡“Íjƒ¾‘³̉Á§á÷ÁåƠ«‡“ÍjỞે“Íj™‰kß [ïS§ÔĂºÛ«‚ ½9ÏÔƒv•{µ†™‰kß [ïSÙŒë*«ÏÔÿÛáêù×›¾ñÓßÄÙ³Ó¨¼ Ù×±»‚½ ÿ‡߈¾ÏÔñÓßÏ©Ó9¥‡¾ÇăˆŸ;ÇØôß»ûơÄÿÇơê­Ä·Ó ¥0¹ÚÏÔß%ÜơÔÑ¿“‰3Ơ,ùÙ×ơêÀ½½€ơêÓÅÓÙ-Û«‚ ½9¹ó¥ˆ]1£äơúñÚ“ƠÓ઻­Ä¡ÁÛ«‚ ½9ÍÄÍÄăˆŸ›¾·‡‘×8ç“«ÚׯÙÚ‡Çÿ¯¶ÁĂù×¢»ơÔ™‰kß [ïSñױЇù×™ÁÀçm9¥‡×±ëØ–¶ÓÅăˆŸ;ÅØßÁĂơèÅ›l¿‰ÙÚ©Àù꫇“Íj±»¡ÔÙ×˹‡ÓU…ÓÚ×ĂÙ¯ÈÁ‡é/×:ƒvù׾ŋȱ»¡Ô›¶é˜ơëö½ăˆŸ¡Áó™å»·‡‘×8çơ»Ù-÷ÚƠ÷Á߈°»Ù׃ث»µØ™‡³Â¹¼«‡“Íj… ‰₫ØÚ·ä½ù×Û«‚ ½9·‡‘×8ç—ÇơÚÙ½ùêµØÏÔ«Ô½ç®ôß»ûÂÙĂºóĤÛÙ̉§Óƒ¾‘›¾ƒv™‰kß [ïSÏ̉éß́v߈ăˆŸíͪ¿‰ÁÈø×ß„߈±»ơ»—¿±»ÏÔË̉¥ÇϺ×̉½€±»¹Ú‡“ëöÔXùÚËÓ÷ÁÏšӓƠëöăˆŸ½ƒÆµµÈ‹ÜăˆŸÿÚóz÷ÚƒvÊÇ#ù×¶  ±»ÏÔëç̉ÙÅë»çá ÙÅëáƠñ¨Ăôï½ \§ÓåĂ˜‰j̃ZîSÛ«‚ ½9Ë¿ñÓùב֑ӷÛÛ×ÜÑÆÈ«·3uUŸÅ™Á›¾Ï„ƠŽ™‰kß [ïSÄÔ «·3uUƠ¯Û«‚ ½9ÿ¯¶ÓÏÅÑÓ…ƠăˆŸÁĂéJé‰Ó5“gesÁŪ»çÔ¡­¿±́¡̉˜‰j̃ZîS‚ĂÙëöÁÛÏÔ4ëö9¥‡¼ ÿÚÉÙ×¶èºyăöƒ×‡ÇÏÔÏÅ€ÓÍĂصƠ§ñº«»ĂÙÓÓ€ñÚ—ˆÍB8¤‡ûƠƯâñÓƠưÀưÀù׃v‘Æ­Äư6ăµØ¯È¬¾ëöËƠÀ‡€è/Ö:ÑĂÇ€Ơ}ÏÄÛ×öÏÄ߈™Ô¹Ú¡ÈơÔ¼›·Ô£ÇÁǻؽ€ïÅ­ÓØÛ«‚ ½9±¿ªÚăˆŸ±»ÅưÀ9¥‡›¾ÅÁ‹Ç߈¿ÓëöÇÖ»Øï»ó›¶éÿ¼©ˆÿÚÏÔǽǽÛ«‚ ½9³¹/™‰kß [ïSóÔ߈ƒÖ߈߈¦ôÏÔƒºĂÙù™ÇÖÑæưÁ±»•ܱ¿¥ÈĂÙ¹ÚóÔƒvÁƯÛÇăàù׳½¾“‹÷ê¡ÛÛ«‚ ½9çÚ™ÔÍBÙ½ÁƯëÚÁ¹ơÔ‘ƯÀĂ߈‘Æÿ¯¶ƯÓ µa¥èù×á¾߈ùꕌ¯éöÁóc±»µØÛˆö±»´8±»ƒv§ÉăˆŸ;kØY«‡“ÍjóÇß»ûå‡öù¡€ØöÔ«ÓÅôơêµØ¢äóóѶ™‰kß [ïS±»ăˆŸ×ƠƒÚ¿Øù׳·‡‘×8ç’¹ÜN8¤‡Öçô«â¤ØËÉ9ÿÂâ»Û«‚ ½9«‡“Íj¯ÈËÉ9ÙŒë*«߈…öôé¡Ôă‹½߈µ‰ƠÄ́Ó»¿‰çËÉ9ơ×/Û«‚ ½9߈À½Û±‡ßá̃ˆ¹ØƠX¡Ưëö£ÔöƠX÷ƯÛ«‚ ½9‡Úè¼ÇÖ¡Èôê­Ø“Ʊ»…¾ÑçԋǛ¾ÙדƠưÓØÿÚÄ–ôÙÚ¥ÓÙÚÇÖ›¾©‡¥2ßëMÏÅ«‡“Íj×¾©Û«‚ ½9ư‡±ù1»½ƯÓ ĂÙÛÄÓÛÀؼ§Ô¯Ê«Ú¹Ú›v×¼ĐÅ  ÁÍĂ¿Å‹ë«»›¾½—Ó¶èÓÅ÷‡ÇÓÿ“÷‡™‰kß [ïSùꙉkß [ïSÅÔ±¾½ÙŒë*«߈‹ÁÎÛ×Ó̉ÚÇúÓívÙÚêöÚן´ÀµØ¾­½¼ƠXăơÅ¥ñÓ¼ơê½Ăƒ²½úƠåĂ“¼ï»™‰kß [ïS£ä9¥‡ÛÄÓ™‰kß [ïSẳχø¿ÂÙÙÜٽォ§Û«‚ ½9µØ½¾‡»ØăˆŸ;ơê£ØgƒˆÁ̉ăơá¼߈óDZ¿­¾ÏŧôíÆ“¹ƯN˜êèäĂÁ̉ö™‰kß [ïS߈ĂȽöÙ‡­9“ÅëöÙ½ëö›Û߈ăˆŸ;çƠ…Âơăv¥ˆ]1ÿ§ÇÖÅơvá¡ÛµØͽöÁơºû̉ï½ù¿á «Ô­Ö£»˜‡»ØưÀ©‡¥2ßëMźÏÔ½™‡›¾ù×߈•½…ƒvÛÄÓó^¡Û¾₫Ô±»™‰kß [ïSÙÚăˆŸ;Û×Û«‚ ½9ÏÔ½ôÙÚ߈®Gø§÷9¥‡×ƠÙ½ƒ»á—ˆç½Ù½×¼£Ø½Ø”̀Ó½ØÅêßÁƒv‹ÜñÚÏÅßÄÙËƠÂĂYăˆŸëöª¼߈“ÈßƯ«»ăê»½ĂºÙÚăˆŸ;½ù×±»¹ÚÏÅ߈½¶ff™‰kß [ïS9¥‡µyôơÔ±»ĐÓ2ĂÈ‚€ĺ†“™‡§¹ĂĂ ›­±àéM匿NÅô«‡“Íj§ÔÏÅ›¾—¾ơĂ߈߈ö»­ÖĂȨÇĂĂ ›­±àéMÛªÚÿ¯¶ÏÔăˆŸ;“¹ƯN•Û߈߈¼Ñï»±¿½€ÑĂí+™‰kß [ïS¯È³£́ëÚ•%‹hµ‹«Ô‹ÜµÏøăˆŸ;k“Æ·ö‡ÇûØùêăˆŸ‡ºăˆŸ;köÛ«‚ ½9‹vµØăˆŸËóóÇÏÔ¶Áñ©¼ÿ¯¶ù×±»÷¶Û«‚ ½9ëöϼ½£Ó«d—¶µaÛ×å̉ Ó ‹›æ5ăàÚÀë¼Ù×¹£Ù½̣ÄÆÖĂ·‡‘×8çơ$½È‡äÛ«‚ ½9½ô±¿«·3uUŸ}Úª‚ +¼9ƒ©‡¥2ßëMñ×ÿ‡ÅÓ­½¼±»ù׵ر»ÅßÓÅÛ×óÇ߈«·3uUÁ̉Á̉ÛƯº¿ß®GøëöÛ«‚ ½9ŽÛ«‚ ½9Ç̉ÓØÎÔ›¹¼Ô³Âƒˆ¿ơ¡ÁÙ×ÇÖơèű»ï»Èù׃v¡ÁăˆŸ;«‡“Íj”ÍË)éÛ9¥éÓ‹Ç߈ÎÚ‘ÛñÆ߈ƒØ™‰kß [ïSº«‡“Íj§Óæ½ưÀ±»¥Ö߈·Ô‹ÜµØÑÅ—»û(™‰kß [ïSăˆŸ;k•Œ߈ó½ÔơÄù×±»½€¼–ÁÙ̉ïúƠ¥Ó›vßÁĂÈ…ö—¶˾ùê¹±»ÏÔăˆŸ;¯ÔçÚá°ơêñÚƒvƒÖû¹]ăˆŸ̉̉ùײØăˆŸÏÅívÇÖ´†«»¿åÛ׿‰ăˆŸ;‡ºù¿…»ơêÓŵÀ•ŒÓØ9¥‡öÿ§³ô±¿÷Áµ†ïÅưÀÓÆëö•½“Ó…ÔăˆŸăƠó¹9¥‡«‡“ÍjŒºœ·̉ ¤0ÂÙăˆŸ;½§Ôù×°ÈÂà™‰kß [ïSÅÓăˆŸ;ëöưÏÔä̉  û‡xÛ«‚ ½9µØăˆŸ½߈Á̉Y«ỡ»ú߈˜ĂôêÍǦƠ溙ëéåöÀƯ«»Ä»ùר¼ËÇÿÆỂï‡ÙÜ…à·Ô¥Ø÷‡¾Å߈™‰kß [ïS¯ÛÙÚưÀ8J¤‡JÖ ĂÙÁ‘È™‰kß [ïSøê×mùêƒvïÚG½¹µÂÙÖÓÆÁ¼«ÚÛ«‚ ½9Ơ9¥‡×ÙÓÍÓ±½ăˆŸ;«)±Ô©¼‡ëÚ¸Ú¡Èʾƒvù×›¾í—G—»Û´›¾á=ăˆŸ;k÷Á°»Û«‚ ½9ç$üܹ̃¯×Ǻ¬Öûºó‚ڧÔù×äÁƒv—Ö‚v6ưÁ±»Á̉ơº«‡“Íj̉ÁñÚׯ«·3uU¹cÍÓˆÛÛ«‚ ½9óǘ‰j̃ZîSÛ«‚ ½9ëöÅơê­ÄÙ׷šԉԿ‰¡ÈµyÛˆơÏÔ‰ÛǼ߈±»ÍÓëöăˆŸëö±»±»‡ÇñÚ߈Åưˆƒv÷ˆɇƒØ¡ÁÁÙ±»ª‡’̀jĂÙù׉¼Ù½µØăˆŸÇ̉«·3uUÛ«‚ ½9±»±̉ËÉ9±»ĂĂÙÚ§ôíÆöơ™Ô“Æá=±»™‡™ÁµØ€Ơí$щµØÙÚÿ¯¶¯ß—¶ĐÓ™Ó«ÆƠ½“¹ƯN·‡‘×8çÑÓ‡»‡(½€«‡“ÍjÏÅ«·3uUăơ¡%›¾°» Ù¿‰˜‰j̃ZîS9¥‡ ƠÖ» ó‘®ôĂÑæ¨¼ˆÚª‚ +¼9‡º—¶Ơív¥ØƯ¾«‡“ÍjッÛĂĂưÀù×›¾ăïÙ»¬¼¼•Œ߈ăÇí¹Úử±»›¡̃ˆ߈ơêß%·Ó ¥0ƒvÓººÓÅăˆŸ;ăˆŸ̃„₫ƒÔ™‰kß [ïSÏ̉÷ơăˆŸăˆŸ±»ñ +Ñÿ­m§ÔÑÓÛÄÓ«‡“Íjëö¾Ç»ñÁëö/…Ơ±»ÇÖ ÛƒvíÙù×ȹڷԼ۫‚ ½9çÚĂ ·ôÏÄé‡Ûº¶™‰kß [ïSÀÙ…ÚñÚ߈Î̉ܺơê©Ó¡Ô«ÔăÁØÅêÅ“ƯÓ •ÖëדÛï»ăˆŸ˼ Á˜ơ™‰kß [ïSÏÅË̃ƯÚ߈«‡“Íj™Ă«»ߌï»›½É̉ËÖñƕڗ¶Û«‚ ½9…Û½ô¢ÈƯ¸ÚÓ̉öívÏÔÀ£Å±ÂóÇăº³ °»ßÄÙ·‡‘×8çƠX™‰kßơÔ‰œµßå̉ ËÓóÓƒvÏ̉߈ĂÙ«FÑÄë¡Á›¶é©ØĂÙ§ô¢X¨ÆÅÓëöưÀ€Ä ¿ôơê³߈ƒÚÍBŒE¹óŸ}öÁƠ‡9ÓØỞăˆŸ;k߈ăơ½€™‰kß [ïSù×́óÁĂ‘Û±»åĂçô‚v߈ŸèÙ½ëöùê™àgơêƒvÁƯ‡x˜‰j̃ZîS“ƘơÙ-µØ™‰kß [ïSÇÖÏÔ߈ñÓׯÏÅƠT±ëØßÚ›¹̀Ê)èÛ8¤¡È¯È‹Çë×íê±»ÍÄëöÿ¼ù׺ôê5ù¿ÓÅ­ÄíÖÏÔƒÖƯÓ ½Áëö·ôơêÛÆºÁ±»ßíæ²È÷Ú«ñăˆŸ;å̉ ÙÚ±»«‡“ÍjªÚù׵؃¾‘±»Í­ŸÅ—»áƯÿÚǼƒÖăˆŸˆưÀ­v§Ôé‡ÑÓù×½ăˆŸ;߈ßÖ›¶é™‡¿‰ÁƯÏÔ¡áçÚ›¶é¼–Œ ÓØƒâÎơ ¿‰9¥‡ÏÔĂÙÓØƒvëỖÄØÅí­€ĂÙ½ĂƠéºÙ̉9¥‡Ù—¶ÁƯ¹ÚÙ×°ÁăˆŸ;k‡º·Ô‹ÇÀ½³ÈÁƯ¹ÚăˆŸ‡ÚÛº½€í‡¹Ú£Ô¼’˜‰j̃ZîSçô½­Ö«·3uU‡×¯Ü߈ù×°”ùרĂñªÙ½ÛºµØ±»߈…ƠÛÄÓ—¶¡Ôù×±»ÓØ߈í—G¡ÈÅØĂÙÁÚï³2¾(Å9«‡“ÍjÇÖ©¼÷‡©ØĂÙ¯Èù×đÈ“Ơ箫·3uU‘÷«‡“Íjƒ¾‘±»ëöソºÁƯăăv¿ôË̉ơèÅÓ‰í©©£âêơêºÙÅëëöÛ×§ØưÀ…Ÿ—»éºíÛ«‚ ½9¶å×ù×Ơÿ¯¶ăˆŸ³ÈñØËÉ9«»û†Œ߈Ïŋǽô§ôí÷­·Ô½€ÛÀÏÔÎ̉8¤‡ñÖ÷å5Ó©¼µØ‰¿I߈߈§Æ÷Á‹Ü¥ˆ]1¾ù·ÅØÂà™ëé婇¥2ßëM9¥‡óµØß»û¡Ç÷ÁéêѺù×…Û»ÓưÁÍĂœư‘€ÍÄ÷Á‡Œ§ô¿ô‹Ü‹ÜóÄç½́v·ÔơÔÜÙ×̃™Øù¿±»‡Óï½ĂÙ±»ÑÓóÇăˆŸ;ăˆŸÑØåøڅ—ˆ–¿±»¦¹ëö¥ˆ]1§ÿ©Ç×¼ÏÔÏÔƠæuÁ½ÍË)éÛ9¥ơĂ“¹ƯN°»ûØ9¥‡ñÖߌÛ,̀ÓÏÔ™‡…»ưÀ›¶é¤Óív®Gø•%å,”ÇÍÇÍÓׯÙ×ﻕ½ơÔÎÔÄÓ߈ÏÔ±»¯È˜‰j̃ZîSŽÁ‡é/×:ăˆŸ‰ơ­½¼À½ÏÔÁù×·Ô߈׺¹Ú̃ˆ±»å̉ ™‰kß [ïS÷Ø™‰kß [ïS¡ÓÏ̉ù×߈±»ûØùëï³2“Æ›¾ ÈñÁ¼ôÙÚôƒˆơÅëö߈ﻘ‰j̃ZîSß»ûëöí½—¶û̉™‰kß [ïSµ‰“È®Ó ¹Ú™ëéåÏÄăàÛ«‚ ½9›¾÷ÁçÀ·Ó ¥0×¾½ÔùôøÅª»·Ó ¥0ăơ™‰kß [ïS“ǯ¼÷Ú™Û̃¹ơÔª¶2tTÙÅëé‰ñ5ñ·‰…ÂÙ™‰kß [ïSøôŸĂ‚v¿‰ÿÚỂ·‡‘×8稉½ƒ«»½«Ô÷Áô‰ÁÚª‚ +¼9ÏÅ™‰kß [ïSăˆŸƯº“È8¤‡×8 ¤‡ ×퇫º߈‡§Ô•Óƒv‹Ü›Û«‡“Íj›¹߈±»±ƯÓßơƒvÏÅ©ÜÅôÙ½ŸÖµØ‰Ôù׃Ü߈ÿ¯¶¡h¡%ù×ôù½9¥‡ÆÓ»Å¿8#¤‡#Ö«‡“Íj¾ÅºÔºl»Å¡à«‡“Íj—¶ׯµÏ߈™Á•Èû›¶º¹Úœ·̉ ¤0©º˜êèäăˆŸÁƯ‹ÇÛ‡Úª‚ +¼9ö­€̃Î÷ä5̉½±ÅÙÚ¾µ̣ű½¾ºçô±»±¿Ôơ9½›¾¡%$Ï̉Ơ«äÿ¯¶Úª‚ +¼9ÍË)éÛ9¥™ôĂÈÏÅăˆŸ;±»‡ÏÔÁÜ‹à›¶é¿Ù¼ăơƒ×ï½ưÀÏ̉¶º·‹æ̉Ö‡¼7÷ˆù׫‡“Íj߈ơêÛ«‚ ½9 ËûÏÔ¾°¿ ÛÀ߈ßßÚÓÓ߈«‡“ÍjÍÓ›¡¥@ø×ψ±»ÇÖÛÀ߈ÿ¯¶Ü¿¿‰­Ö9¥‡߈Ë̉¡ÈÙ½Ǻ9¥‡ơèÅï½ăˆŸ½ÛÚ·ÜËÙ̃ŒÚ,߈¥ˆ]1·Å«ÔưÉÓÅéêăˆŸÙÅë±»ÿ¯¶߈ƒˆÛ«‚ ½9ù×ï»éºÎőƙ‰kß [ïS±»½ÍÓºª‡’̀jÙ½÷‡Ÿ}“Ç߈ÇÖ¾“¹ƯNÍB‹ë̀Ă9¥‡€º·ÔơÅû̉ëö«Ú̃ˆ̉º÷Ú×ÖǼëöĺ ßƯÛ«‚ ½9Ù½ÿ¯¶¹Úƒ×™ëéå±»‡Ûùת‡’̀j“Ơ™ôßÁÙÚû›¶é«‡“ÍjµØß»ûåĂ·‡‘×8çíêƯÀơê›ÛµƠ³È…»µØ–¿ËƠ±»ÏÅÇÖ÷Á¡ƠÂÙœÜÄÓ'̉ØÛ«‚ ½9ơêë×áêăˆŸ;k¿¥Û‡™»÷Á߈Û«‚ ½9—˜߈°¿Ơ›¾ÁËÏÅô¡ÈưÀµa©Óâˆ:߈·‡‘×8ç¶«‡“ÍjÛ«‚ ½9ăˆŸï»ø×Û«‚ ½9«·3uU­Öͪ“¼Ù½…Ơ„Ø›¶éÑÔÓ5“gesÁÅưÜßÚ”Èú÷Á(±»öăˆŸ¡ÔºѶ߈ăˆŸ;åôÜ÷‡Ù½¿ÅÓÆ½ơêåĂƒv߈̉ÅĂÙö麛¾ñÚÏÔƯÓ ơÔ䉙‰kß [ïS·‡‘×8çăˆŸ;×ƠĂÙ9¥‡½ëÚÏÔ»~ØöÍÓù×§ÓÏÅ›·ÔÁĂ¹»ÎÔĂÈßÁ§ÓÏ̉ù×Ù½ù×éê½Ô½‹Ç™ÛơĂÙÚÀÏÄéºÙ½ÏÄív™ô逨ÇăˆŸÇÖËÇÏÅ罓ÈƠ’‹ÏÔƒ·¼Í7ÇèùơăˆŸĂđªÄ ›¾¸ÏÔ¹Úăà™ÁÉ6Ù½»Á™‰kß [ïSáÁÜÛ«‚ ½9±»ăˆŸ©Ü±¿ǽăˆŸ;“‹½ĂÅ»ªÔÛ«‚ ½9ưÀ¿ÅơĂăˆŸ̀Ç߈ÏÔ™‰kß [ïS÷‡£‡ÇĐØ¡Ô®ÈơÔÀ¼Ô¿ÅăˆŸ;k±»¡Ó…»£Ư·ØÁ ³¾ë¡ÔÉûƠ÷ÁéÓ­Äó‰đχ“ÆÑ橺×Ơ†7§jÛ«‚ ½9«‡“Íj₫$®¶$—»¥Øơêƒv¡Ư»±»±»¡»ÏŶĂÛ׳¾ăˆŸ;™‰kß [ïSáÛđēȫ„ÿ¯¶«‡“ÍjÛº—ê°»ÄØ—ˆö±¿߈¹ÚÚª‚ +¼9åñ»ăˆŸ;ùףث‡“Íj¿‰¿‰ÓŃˆỂ™‡ùÔ»ánƒơÔô©À³çºÑĂºơêöÁƒvµØÏÅ̀Ó÷Á߈ÏÔöƒvƒÖ±‡÷ˆÏÔ™ÓĽëö«)±Á“í÷‡Ă¼ÏÔöưÀ«ÔơềĂÿÁ‡Ú̃Ư¡ÁƒvĐÅăˆŸ;kÁƒvĂÙÁ¼ÁĂ¡Á¤ˆ\0¿ôçÚ¬Åù‡¹~ïÅ·Üótùơ¿‰ÏÄ…Ô™ëé庶…àÿÚ˜êèä±»̃ˆù×—ˆ«‡“ÍjăêË¿ƒvÙÚ߈«‡“Íj›¡ËƠăơÏÔéӇǫ»ÙÚÍË)éÛ9¥÷Ù•ĐƒÖÖÏÅÛ«‚ ½9ô¿»‡µa£ä׿8›¹ëÚÁ¼µ†­Ö·¸«bËƠơèÅáê›¹Ă˜‰j̃ZîSÏÅÙ½ĂÏÔ“Ơ² íøĂÙÏßăˆŸÖÆù×ĂÙ¹Ú‰¿IáÛÚÇÏÔéÔÛ«‚ ½9ơ꜉¾IÑÓÛÄÓù¾“ƠÛ«‚ ½9ăˆŸ;±»̃ˆëÂĂŸÖ©Ó½Úª‚ +¼9°»™ơ¾́‡‡̃‰¿IÄôûƠñÖ«‡“Íj‚ˆơÔăˆŸ̀¼¹Ú½®8¤‡ËÉ9¡đ¹m˜ môơ™‰kß [ïS›¾ƒÖרóÂ߈‚½ØÚưÀöĂè«Pƒv¾ψ‡xéJé‰Ó5“gesÁÅù×Ó±»±»“¹ƯNµaăˆŸ«äăˆŸ;kÏŃ»±»—Œ«‡“Íjï½Û×ÖÚÈĂø¿íơơêÓ̃Ï|íơù×¥à…ô‡™‰kß [ïS÷å5ÓÓ‡åƠ÷‡±»°»ÿÂÓØˆ›¹ƒˆ߈«‡“Íjï$™‰kß [ïS‡ºá »Å“Á¯¾©&ĂÙŸÖƒ˜ÁB½¹ÚâÁ÷¶ÏÄÍÓ«»Üçôư“¥‰ÍL…ă­êöƒv߈̣¶ëöÙŒë*«ăˆŸ™‰kß [ïSëӲ؃vÅßÚª‚ +¼9ÙÚƠÄ›v™ÁƠÚÑæÛ«‚ ½9›¾̉Á¿‰÷Á™‰kß [ïSëö¥Ö¿‰ÀƯ¨Ç¨,Ăđ“¹ƯNñÚÙ½Ú»EöEä̉±ñÓáÛÙÚăˆŸ;kÅØÑ•öª‡’̀jÑĂɘơ¡Ô£ ‹Ü߈щƒ¾‘­vÏÅщăˆŸ;ï‰ëö´‰ùÚÏņŒ®Æ߈÷ÁƠÍưÀsÛ«‚ ½9«‡“ÍjÙY±»½ùׇƒvÿÚ½¡È½À¹Ϻ«‡“ÍjÏÔóÂô÷Á™‰kß [ïS9¥‡ëÓÏÔ…%³±»çÚ©¼«‡“Íj‰¿I×¾ÇÖ¯¾ÏÔ¿Ơư퇘‰j̃ZîS¾½™‰kß [ïS¡Ô™‰kß [ïS±ƒˆ±íÆßÁ±ƯÔX>Û«‚ ½9Ù½߈ù×ăˆŸóÔ9¥‡×ơê¾ÅÏŽ€¾‰Û§Ô±»ÏÔ߈›ƠÙ½öªdÓų–ÍÓ¼€¸µÈ­Äív½›¾ƒ½±»—¶§Ô§¹éºƒv›¾û(½»ÙÚ£»Û«‚ ½9©¼ưÀßÄÙ©¼†º·‡‘×8çÙ׃văê±Á÷‡›¾Ó؃¾‘ÛÄÓöù×ëöƠ—¾ăˆŸ;̀çƠ‚ÖƒwăˆŸ;‚¹ÁËÇÉ×÷ˆ±»ùơ¹Úç̉ăˆŸ;k½€°»¼ÏÔ£@ÅÔÏÅ›¾ơ»ûØÁØŒê*ªƒˆ½±»éºÛ«‚ ½9»ÅÏÔ‹½́ØÛ«‚ ½9×Óç̃•½¿ºÏÔ™ơưÀ̃ˆǽÁ‡é/×:Á¹ÏÔ½½€߈ïÅăˆŸ;k‡g±»“ÈĂíÆ­ÄăˆŸ;±»đưÀóƒv­ØϺëö‡Çơê¯È°»éº­vÍÓ‡Ú­Ä…ÖÙ½•ǃԫ‡“Íj±»̉Á³¡Ưÿ¯¶±»³ÍÓ·Ôè‰Hđ5HHđH¶HÆÓo¿ôù×ù׭֩ÇơÇÏŇ“ă½©‡¥2ßëMơÔƒvù×9¥‡߈ưĂ¡Áÿ§ƒ×ÇÖ½ñèùꙇù׃v±»ăˆŸ;ÆŽ™‡ơê“Ơ«È9¥‡́º̃ŒÚ,öÏÔ±»ù×¥ÛÙÚ‰ÓóÇùêé£ǺÅØÁÓĂô¡Ûœ‰¾I±»ר±½¾±»ÁƯĂÙĂ%"±»ù×ÍË)éÛ9¥«·3uUơêÏÔ«‡“ÍjbơÔ±»߈–ŒƠÏÔØÅê»Ø½§‡ù×ÿ¯¶Ö¾ÿ¯¶ƒvÏÅÅÔΫ‡“Íj—ÓÑĂéô•×ÑĂ˜êèäÿ¯¶«ƯÛ«‚ ½9éßéÓù勘¯à¾‡Úù×å̉ ¯ñÆå̉ èơ¿(ăáĂÙ¿ồĽ™‰kß [ïSÛ«‚ ½9¹ÚËÉ9°»«Ó߈£ƯÏÄ׿8Á‡é/×:ñÓ÷Áƒv›¾ĂÙß»û‘8¤‡ƠÏÅÙ½áê±ëا౿çÚÛ×™Ô°»ÏÔ‘ï°»Ϻ½ưÚÀ¹ÎÔưÀ“¹ƯNéÚ™‰kß [ïS±»ív߈ÑÓ¾¹¶ÜÂ)‡ǽ¿‰ª‡’̀jơ»Ï̉÷4™Ø¿‰˜‡ÍË)éÛ9¥߈ơê߈ÔơêÁ¡Û8 +¤‡ +×ÇÖº§ÔçØÿ×±»£XÂÆíÖëöÑÄëŸÅÛ«‚ ½9£X·ÔµØ™‡™Ø“Ơ«·3uU©ÜÅ“¹ƯNÓ¼˹½‹Ó“Ơ9¥‡ăˆŸ;ÍÓçô躙Լ÷Á퇳”…Ô™‰kß [ïS™Óÿ«ÚÑÄë‹ÜÏÅ£ –¾߈ỡëö¢»ÏÅY¡Ÿù×Ù½ÿâÏÅâÁ»½·‡‘×8çχ«‡“ÍjùÜ•™‰kß [ïS™‡«‡“Íj­Ä±ëت ¶ 2 t T ÏÄƠŸÖ™‡±»å̉ °»§Æ³ºó›¾àêÏž«‡“Íj߈¿×½ÿÚ«‡“Íj›̃ÿ¯¶½ív¨‡¤2€̃êLç̉±¿£ ½±¿›¹»ØÛ«‚ ½9ơÔ‡º̉Æó²öÏÅ›¾÷‡™‰kß [ïS‹ÇÉ̉ÁĂ‹ÜÏÔƯ‰Û«‚ ½9Ï̉ù¸àŸÖ™‰kß [ïS±»ù×Ăô‡ÛÖ¾ơÔóÇ“Ơ9¥‡‹Ç‰yø¿»Ø߈ÇÛ¸Ú忽̣Çư“ŸG¹Úù×…»²ØÿÚ߈ù×́vưÀù´ÿ§Žß“ơê½÷Ú¡ºÍÛáƯ½€Û«‚ ½9 Ëûáб»ơèÅÇØ‡Úïæ§ÆÁĂù¾ÅÔÛ¾¯Èó¡ÁÅ»ăˆŸ•Ü߈¿ôóÇÅØ¡ØÏÔưÀ±¿«‡“Íj£0âˆ;׿8×Ó±¿™ëéåÿ$Ë¿ñÖưÀ«Ô±ÖƠÙ½¸Å½™–ß%¶ è ÎÔ߈ù×9¥‡½ÍË)éÛ9¥ÙÚĂƠщÙ½«Óׯ¤ˆ\0™ÓÛºÙÑ™‰kß [ïS÷ÙÏÚ߈±»ÅơÔñÆÍĂƒÖß»ûĂÙדƠ·ÅçÚáê»ôûêù׵؋Ǜ¾›¾ù×ÁöÛ«‚ ½9±»Ù½âÁ¿ßǺöÁ—¶ö‡Œ«‡“Íjç`Ô߈ÁĂ«Ôù×ÿ̃ ¸Úå̉ ±́§ÔÁñ»µØíêÚÄ̉ëöëöÛ«‚ ½9Û×ËÉ9‹Ó Ç©°ÑÓ¡ÔÇË̉߈‹ÙÍƠŸÖƠćº˜‰j̃ZîSƒÖ÷Ú­½¼ÎÅ êơ«‡“Íj›¶éÓºáêÙYßÄÙËƠ«ÔÿÛÁ÷ˆ»°êØÛ«‚ ½9»å³Ø±»…Œ߈±»ù×ëö¢ÈöóDZ»ÏÔ¹½¡ƠŸè©ÓØ™‰kß [ïS›¾±¿¹̃ăˆŸ;ø×º«ÚơºÙÚ¸à‡Ú·Å™‰kß [ïS°¿ĂÙưÀ́½ÏÅùꉿI¾åËû(¿‰àºÇ·ƠăˆŸ¢Ç«»ƒvëöơêÇ̉…Ơ¥ÛăˆŸ;k9¥‡ËÇèơ½߈”ÖCƠX™‰kß [ïS¿‰ù¿Û«‚ ½9ÿÚ¡Ûù×ùëƒvÖÆ™‰kß [ïS»Øï½ëöï»ÛÄÓÚª‚ +¼9퇗¶ù×ÅÓ‚aơêÅăˆŸ;kăˆŸ;çÚƒv߈9¥‡×ä̉‹Ü퇩Ơâà﻽±»¬Ä­Ö÷‡ƠX߈ƒˆ«‡“ÍjĂÛĂñƺŒƠÏÔ±»ơ»·‡‘×8çô›¹çÚ߈—á—ˆù¿À¹ Ïš۱́Ơ¼ăˆŸ‘ïÎÔÛ«‚ ½9™‰kß [ïS¿»ǰÑÛű»·ÔơÔ½ç¡ÈŽŸÖŽáØÙ½߈Û«‚ ½9÷‡߈Ơ¡Á‰y¿Å§Æ¶ÅÓŶôêËÉ9«d¶ÔçÚßÁÑÇÛ×ăˆŸ;¹Áç½̀¬Hñ +Ñÿù×ÛÅăˆŸ;ÅÄ«‡“Íjº½‘רÏ؉j̃ZîSÍƠ߈·Ô‹ÇëößÚ9¥‡ƒÖå̉ ơÔÜÀ¿Øרëöß„¹Ú‰ơƒv¼Ô +å̉ ÁĂÈÑÄëƠ9¥‡ưö¿‰™ëéå¯×ϼåôƒÔƒvƯ‰߈ăâ¹ÚËÓÏÔÛ«‚ ½9ÑÄëÓ߈¹Ú—ˆï½™ÔΈ½€±»·Å©ÓÚª‚ +¼9™ÁÙ½ˆÁ³ëö¾«·3uU‹ÇƯ‰ƠµÔºl«‡“Íjö×¾Á̉ÿÚÂèöö­ÄÇÖÙ½ÿÊÿÚăºå×›¾Á ăÁ‘±“È£Øÿ¯¶ÙŒë*«á ™‡«‡“ÍjăơÛ«‚ ½9íꙇû؃v̉̉½€«‡“Íjç½÷ٵرµÉ›¾éêÛ«‚ ½9ƒv…ù×ÛïƯÚÁ¹ÏÔÖù½Ë¿ưÀ¹Ú‰ơỢ̉Ô‹ÜÏÅùשÇË̉Û«‚ ½9߈ăàÏ̉˜‰j̃ZîSßÄÙ¡Û±»ÁÙ”½ÅÓ癋ۙ‡¿Ù›¾߈ƒˆĐÓăˆŸÿÂƼ‡ºƠÚăˆŸ Ëû¸»©¼À¹³¹áÜùë•Çí긽߈…ƠŸ}Û«‚ ½9éê߈ŒƠÏž̉Åùë̃¹ÙÚ°»ͼ¥Ø«ÔçÚ·ïÅøùæÁ‡é/×:Û«‚ ½9¿»¶ÅÛ«‚ ½9«‡“Íjɶ¡Ó½±»±»߈ă‘·Ơ©ÓĂȰ»ƒv‡ÇÛתÜë¦ĂĂ¹ÁÍË)éÛ9¥™‰kß [ïSͽ›¡ÏÄÏÅÛÀ•¢°»«̀Ê)èÛ8¤ŸÅ®GøÍÓÛÄÓ©ºùơ½ô·Ü›¹ĂÈå̉ ÅÄ߈›¾¡Û³¹½€§ÑƠµØô™ÔÁĂßÄÙù×¶çÚÛ«‚ ½9—ˆàê£äív9¥‡¹Úéê“Æûӵ؛¹Ù×™ôÏÄ—ˆ÷Å–ëö›¾¿Å·̀ëö߈½‚ÖÙ½ËÉ9ăˆŸ;Ưº‡ºó­¾Á ¹£Ù½Î™‰kß [ïS«d½ßÄÙơê­¾ù×ăˆŸ;¹Å߈ؽï»±»³à߈óÇùêÑÄëñëØơèÅ·#·‡‘×8çËÓøêÅ– Û¹Áô߈»ÇÖºyÛÀÚª‚ +¼9™‰kß [ïS›Ó±¿ï½ù×£ÇơؽÛÿڟȫԃv·Å‡“ÍjÙÚ¡Ư÷ˆ9¥‡”º©Ç̃ÄØÁ¾‡ŒÚª‚ +¼9°¿„£äơêÛ×ßÄÙ9¥‡›¶éϿ͇Ư™‰kß [ïSÓØÓÆƯºưÀ‡Œƒvù×ăˆŸ;‡×ÿÚïƠ‡©ÓñÙŸÓØá¥ˆ]1¿ôø×„nÿ'‹Çù×’Ç›¾Û«‚ ½9Ó¾ßÁÁ¹÷ÁëöáƠ·Ô¡»‹›ùë߈”‹œH÷Á¿¹Ÿß÷ˆ±»ÇÏ«‡“Íjß̀«‡“Íj€ºñÖóđÎƠ†øÛ„ƒv±»ÍË)éÛ9¥¶Ü±»¨ØÛ«‚ ½9ăÁÅỞßÚÓ̉™ô9¥‡¥Ưư“ÓÅíÖẩ¼¿ºÁƯ™‰kß [ïS«‡“Íj“Ơ¿‰˜‰j̃ZîSáöÏÔÇϾ¥OÏÔÍÄ)©Ø¯Û~ÏăˆŸ;ÏijȺ߻û߈Ÿ}ăˆŸµa£ƯăˆŸ;ƒrë™H±ßéäËƠá=Ăô€Ç¨߀ñÆáêÓ˹«‡“ÍjñÓ¯å„Úר‹Ü ¾‡ŒĂÙï½Ó́÷Ú˜ +ê +è +ä +™‰kß [ïSÿÚăˆŸ;ơÔăˆŸ‡ÇźÄÄ™‰kß [ïSÁƯ©ƒvÏÔ»ÏÅÅ™‰kß [ïSĐÄê™ơÿ¼ÙÚăˆŸ³ÈĂĂ ›­±àéMï½çÚƒƯ¯Æÿ§ăÔ߈¤¾µØ¥,ÍÄÿÛ·ÔíÚÂÏÔ±”«‡“ÍjƠ¾G›¾ărĂñ»߈Ññ»«‡“ÍjĂÖ•»½¾ƠXí‡ưÀ“¼ÿÚÛ«‚ ½9¦ôƒvÚª‚ +¼9ÑÓ›¹ëöƒvêöÛºæÚ™ÓÛŸƯØƠXù×±đôß»û÷Á€Ơר¹T…ô³Ø̉̉đÆè¼ ù×ỞƠ¿ñưº«Ô‡Ü¼€¿ßî²2¬¾öçôôê·‡‘×8çƯÓ Û«‚ ½9¡Á™‰kß [ïSË̉ăơ¯È³ºó¿ÅÏÄ߈߈ëÓ…Œô±»½ÁÛ×™‹½9¥‡°»—ăÅØ½‹ÓóÇ“È÷Ù«‡“ÍjíÚí¡Çµ†á=°¿´ÏÔ¿ÅÇĂÁ̉‡9“ÈÑÓ©&«ÔçÚ̃»úÇ÷S‡ŒÛÀ߈ưÀĂºåÁª‡’̀jƒv©µØñÚ™‰kß [ïSíê°»ƠíêùơÇÖñÚÿÚ­Ö¥‰ÍL…Ù½±»ù×—¶Ù½—~íØÍÄÓØăˆŸ;kă™Á‹hÛ«‚ ½9ăơ¡È©‡¥2ßëM¹Ú߈ÓÅÙÜÏÔÁĂĂÙ©¼9¥‡¡›óÔÙ̉ùê‹ÈåÁ½Ô‹ÛÏŃˆỞ¹ÚƠ«‡“ÍjÛ«‚ ½9ÏžƒvöÇèăÇí%÷̃ôé(‡Ươô²(±»¨¾ơêÁ|ăˆŸ;k×¾₫®¶Ó¾™‰kß [ïS§Ô÷Á¹ ¾ÅµØØƠ»ØÙÚÛˆăˆŸÚ¹âàµØƒˆäñ޹™ßÁÍ­¡Ží‡«»ÇĂÇØ9¥‡ËÇ«·3uUíÁÍĂôêÓØ™‰kß [ïS߈°»™‰kß [ïSăˆŸ™ơơêù×ÅÛáƠ“ƠËÈ9«»±»ă½ øÿ‡‡º§ÔÛ«‚ ½9§ă»›¾ÔăˆŸ­Ä¿‰đƺöÛ«‚ ½9«Ôǽëöơ꾺ۺÚÀăơ™ëé图ưÀûØ÷‡€¼¡ÛŸ\ÏÄ@Ổ›¾»¼»ÅÓ̉̉oéÓßÄÙµÛăˆŸ½§ỐvÏÔ¡Ô߈‰Ø½ơԳȩر½µØÙÜó"½ƒvÏÔ‹ÇÛ×ÅØăàÅÓƒvĂÙ¼ØÏÅ𻥈]1ù×ẳÓÁ§ØƠXÍӋLJÛ₫®¶±»ÍÄ™‰kß [ïS›¶éÈƠéÚ¹Ú½ôÙ×Ù½Áÿ¯¶₫­Ö÷ÁÛÄÓå̉ Á9¥‡ôóÇ¿û¯¾¥í¥Û›Ơëö·‡‘×8çÛ«‚ ½9«‡“ÍjùêñÓ‰Úív¼Eö»ÁĂٷ؉¿IƠÏÅÏ̉ËƠƒvËÖƠÁ™‰kß [ïSÎ̉±»ù×ù×9¥‡×ÅĂƠöÁÏԅؘêèä“ƠăˆŸ;›¾«ÔØÅêùê™ÁưÀÑÓñÖ±»ívÑÓ߈˜‰j̃ZîSƒvƒv÷‡ñc½åƒ×ù×£ÇÁƯ‡Ư¥ÆÛÄÓ•÷§º±»ÿÚÑÓÙÅë5ï³2Ă©ØÛ×¶™‡Û«‚ ½9ÜÀ¨¼©¼±»ưˆ‡xù×¥º™Á¯G‹ø×¾9¥‡×¤ßÛÀÿ¯¶öÁÇôרÏ̉Ï̉¯G‹øö9¥‡ơÔå̉ Ở¡ÔÅÔôÛ«‚ ½9½™ÔăˆŸ;ÙßÚßÄÙ©ºÙñÚ‰Û¨ºÅĂ¹»ƒƠ؉¿IÇ̉ăơèÓ°»Ô8¤‡°»Ăó©ӫ‡“ÍjÓÔ÷Á¹Ú™‰kß [ïSƠĂÙÓºÓ¹Úºƒ¾‘¥½«‡“ÍjĂƠXÏÅëö™Ó†»%›¾ÏÅăêƒv·ÅñÓđÁƒv¶9¥‡½€‡Î|¡ÁÙ½Ÿ}¡È¾ùê׾߻û߈ƠÚùêÓÅ“ +ÜÓ ›Ầ½ăˆŸ±»±‡·Ü±¿ưÀơêă‘·ơêƒÑ•Èû›èÔ•Œ߈Ù½Ñړۡȱ»ÙÚ±¿Ù½ß»ûƒ­ÔĂÙ·Å߈ù×¾º9¥‡×»Øëö¡ÛÏÄ—¶½ôñÚËÉ9Û«‚ ½9¹ÚÁĂÅÄÛ«‚ ½9̃ˆÿÚÁÏÔÆ̉¹ÚÅt±¿é‰ñ5ñ·ï½£äå̉ ù×ưÀĂĂùê±»ÿ‡ׇ³•ƒÚ½ºqơúØ×…Ơ‰ÁëöÍÓëö±”ÏÔ¶ÑÓỞçÚơÔ߈·ôÛ«‚ ½9ÿÚËƠ«Ó¹Ú£XÏÔ¿¹ÏÔÿ$Ơ߈™Óù×¾ÏÔ¿ÅöơsÏÔ¡Û™Óë½̃ˆƒv©ÓơêƠ“ÆĂÈ­vͪ¥Ø‚văˆŸ߈ÛºÁ¹߈½€­€ÏÔÏÔǺƒÖ·‡‘×8ç°»ơ»ªÚ£ØÛÁƯ›¾áƠÎÚ ±»ß„Ûگȫ‡“Íj…Ơƒv™Ô«ÔÜÂêÅåÁ‚ĂƠÅÑÓÏÅŽ‰¿I÷ˆ¸Ú˜‰j̃ZîS9¥‡³ ¸ÚÏű½Ë%ù×¹Áÿ¯¶“¹ƯNµØ·Å½‘àƠƯåŽăˆŸÛ×½ÛººÈ —¾÷¼™‰kß [ïS±»½€ÑÓ·Ó ¥0ÇÖºyêÙ½ô«ÔÆÛ«‚ ½9ß»ûƒ˜‰j̃ZîSÏÔƠ™‰kß [ïSơê9¥‡¥ÛÍƠÛ«‚ ½9Ă¼Û«‚ ½9¾̃ŒÚ,߈ëö©‡¥2ßëMôÛ×¥ˆ]1°»§½ºƼÂÈå̉ •%¿Åç'ù×÷ÁŸ\ÏÔ‹ÇÍÇæ'ׯ›¾²¾+Ñ×ÂÓßÁ×¾ó™‰kß [ïSÑ!©¼ưÀ߈ûĐ½±ÁÙY÷ÁË¿˜‰j̃ZîSÅÓ«»›¾ÏÅ«ÑăˆŸ;kăˆŸ߈ëöívŸĂ¡ÁỞß»ụ̂ÄóÔ8&¤‡&Ö‡Œ½«»™ôù×̣ §Ô«‡“Íj±»¥ˆ]1Û«‚ ½9ïd߈…»ƒ´a·‡‘×8çϺÂÙÿÚø×§©ºغ ñ"ï¥5Ú™‰kß [ïS™‡½€Ï̉áÅ©À¿ß߈ÅÔרƒvÛ«‚ ½9çÚÜơăˆŸ;ĂÈ̉Ʊ½è‡½ơ«ÔÓà˜êèäƒ÷ÑÄëăàϼÏÅï½´ƠËÇ«‡“Íj·Ô©¼™ÁÅØăˆŸÏÔă»å̉ ŒÅ“Æ­ÔÚö‡ă»˜‡ƒvívö©Çÿܘêè亽¹~ĂÖ™‰kß [ïSÛ¼€™‰kß [ïS߈ơñÓăˆŸ—Ø™‰kß [ïS´êÓà‡­ÈÚÄ̉êÖ¾ɇâˆ:k¡ÈơĂù׫‡“ÍjÿÚ§›çÚơèÅ™ô·Å™ĂĂĂ ›­±àéM°»Ù×ăˆŸÑÄëñÓÿÚ¹Ụ́¶ñíÈߌÅôßÚăˆŸ;k낇¹ÚÙ×ׯø×·Ô±»‘ëßÁ́ơÙÅë£Ô«‡“Íj‘½‡ºÛ«‚ ½9ù×°»Ë%ƯÜ9¥‡éê£ä÷Ú߈9¥‡×ÏÅ«ä‡÷™Ó™‡¿à§ÔĂÙ«‡“Íj©ÓÁ¼ưÀ߈‡©àº°»ÏÅ̉ˆ”=ÍÓăˆŸ;kÍÓ«dó½ôÍƠÅØÏÔÍÓÏÄg±»½¡ơêŽÑí¿«ÔêÚăˆŸ߈±»”܃văˆŸ;k¶è÷ٽܟֶ‡Ö8æÛ«‚ ½9ôꩇ¥2ßëM³¥‰ÍL…Û«‚ ½9·‡‘×8çªÚöÁ‹Ü¡ÁÍƠÏÄĂƠ™‰kß [ïSơê›·Ô¢ÇêöÏÔ¹ÚY¹ØăˆŸ;kéÓÿÚÙ½—ˆÅÓ«Óö˜‰j̃ZîS÷ÁëöƯª̀ÄÙƠÛ«‚ ½9߈¡Èÿ¯¶ÅÓ₫'î½±½ơÔ½€ăçôÛ׃vơêĂÖéÓá=Ơ´ívŸÖăˆŸ±‡ŒŸ&ĂÙƒÂy yy¬y°àyyèMyĂÙưÀëö°¿߈°¾ÿ¯¶›¾ø×º«Ô±»‚¾¯¾º¯¾ÿ§›¾÷Áå×ăˆŸÓØ«‡“ÍjgơÔăº™Ơ˜Œ߈ăˆŸ;kÿËÇ¡ç*ΈŽ›¹ƒvñÖù×ÓÓÓí;¹Á³È£Ø´€ÏÔÛ«‚ ½9íÖÏÔ›‡ƒ«‡“Íj»¼‘Ǽ«‡“Íj¥Ûív™‰kß [ïSßÚư8¤‡×ƯÚÆ»ÍÄÅÔ­Ô·‡‘×8çóÂ—Ó»Ă½·‡‘×8ç¯×»Ăẳ¡Ô«‡“Íj߈™ĂÁ̉ùô/ƠXÛ«‚ ½9ăàºÙÚɇÅó#½ƒv†×Ûˆ߈ÿ.«‡“Íjƒv±»ơê§Ø½í؋۷Âÿ¯¶°»ô»½Û×ÏÔؽù×ÿ¯¶­ÄªÚ«%‹Ü½‰ÛóÛ«‚ ½9·‡‘×8çưدȹ釛۵†¡ÁÙ½ßÄÙ±»é×߈ă» ÁăˆŸ;¹ÚÉ̉߈¼¿‰Ù½°¿™ëéå¯G‹øăˆŸ—¾ẳá 9¥‡±Ă©¼£ÇÅØ§¹ơƠÎÔû(›¶é±»ĂôÖ‡ŒËÇÑÓÓÆ±» ̃ª‡’̀jñ‡Ú׎ù×¼ëăˆŸÏÔĂÙ/ÑÓ¡Ơ·›©ˆéê‡Ú••ƒvĂÙá牿Iøê„Ø«‡“Íj§ỖŒÚ,öÔtçôËÉ9ˆÆ˯åÁ—ÓăˆŸ…‡ŒñÁĂß•îëö™‡¥ØÅ̀߈Ü©¼£»½‚ÑÓăˆŸÙ½₫ëöÑÄ뻕‹HéÚ·Ó ¥0Ơµ.¥ÙÜËÔÔX5ßÄÙĂÙƒvÙ½߈“ÇßÏÍË)éÛ9¥‡·‡‘×8癉kß [ïS¦Æ³(Û«‚ ½9ăàëöƒvä̉£ØăˆŸÏÅÏňáêµ.¥Ù½ưÀ«Úͼ÷‡¿‰±]‰Ôù×ß»û̉´ +ÏÅÇÖéÓ—»‡Œ»ñÖÅ–Ù×éÓ°»²÷ˆưÀ« ©ƒ»5߈›¾ù×ÇÖÏÅ•Èû›9¥‡¨Ç€Ç§Ô±»—ˆŽ½‘Û¯ÓÇÖăˆŸ°¿{Ç̉·Ôßëù×ÚÚ¡ÛÓÅ™‰kß [ïSˆùêªĐ™‰kß [ïS̀ÓÏÔ«·3uUר³È‰Ôÿ×¹Úăû°»ÏÔÂĂÛ«‚ ½9›Ú⦅}Û«‚ ½9†ŒÅؼô߈8 ¤‡ ×Û­¾«‡“Íjƒv£äƯÓ ù×߈ßÖ麅öưÀÅëö¯G‹øÓºÇ֡ؾĂÈÁ¹Đ÷¼×h½µØÙÚ罟Èá «‡“ÍjƇº÷ÁÚŽ̃ˆ½Åù×°¿,±»Û«‚ ½9«‡“ÍjØƠÅØû̉©¼ÛºçÚô²º̣¾ºÍƠåĂö¹Ú¶½ĂÓØ‡Œ9¥‡ơêăˆŸưÀ́ÁÏũǫ‡“Íj“Ơ¹ÚĂŸÈ½ù¼ø×›¾ù×½ƒĂÎÖ¾8­Ùăê½€ÎöµØƠXÙ½©À§¹ºç߈£ØÅív¥Áù×ÏÔÖĂñÓ¡Ô‡Œ»ˆê¼!±»ÛÄÓÛ«‚ ½9³Ù½ă»©Ç½«‡“ÍjáêƯÚÁƯÛ«‚ ½9·‡‘×8çù¿Ïԥذ»’ÈÏÔëö™ô¼Ă…Ú‹Ç“Ơ¯G‹ø ËûăˆŸ;‰yÛ£äÙړƉ¿I˜‰j̃ZîS߈±»¥ˆ]1ĂÙÙ½ÛºËÉ9åÁ‹ÇÏÓÅàË̉êöá ăˆŸ;ÁÛ“ÇăˆŸ߈±»¯Ơï½¹ÚëöçÚ°»Ơº÷ÁËÇ9¥‡×‚Ôµ†ï»¥¡¼9¥‡×«‡“ÍjÇÖÛ«‚ ½9¯¾ª‡’̀jÏÅù×½›¾%¿ÅçÚù×›¾³Øºyí«‡“Íjå̉ ù׃v—¶߈÷ˆ«‡“ÍjÇÖíêÛ«‚ ½9ׯÛº8À¤‡ÀÖÓº©Ø÷­Äẳ¾ÛǶ‡Ö8æëơÔÈ̉÷ˆ‹Ç¹ñ×¹ÚÅnơÔăˆŸ;ívÍ“Ơ™‰kß [ïSÓר“Æ¡ÁŸ}£­Ö¼ĂÊ¿—Œ«‡“Íj‹È«Ú­ô›¶éÙ½«‹9¥‡×«‡“Íj§ÔÍÄëöĂ¼ÛăˆŸéê߈‹qÛ«‚ ½9ưÀëö«‡“ÍjƒvùêォÔű»öÁóÂưÀܱ»ĂÙ‹Ç›¾ăˆŸ;k ËûÙ×¾©‡¥2ßëM‰Ø¡È9¥‡ŸÈÅÔù×§ÆÛ«‚ ½9Ù½œÁ +™‰kß [ïSÛ«‚ ½9ÙÚ©‡¥2ßëMù¿ó¶ÇÖ©ÜÍ߳¹ڽ»ÏÔ­vµêăˆŸ¶èáêù×Û×ÿ¯¶ÿ +÷I­Äù×Ù½ÍƠñÖ«‰„¡È—¾©‡¥2ßëMû µØ½«»ÍÓơÔüÁửÂÙÓŪĐͼ%߈ív³ß§Ôơԧؾ³È¹Ú纱»G½¹ăˆŸ½€±ÜƒˆÏÔÚª‚ +¼9¡»÷‡‹ÜóǨº߈‡“ơêƯºăˆŸ9¥‡ĂÙóÔçÚùêèç÷ÙÏ̉Û«‚ ½9¡Ô‚vٽǖ߈Æ߈匿N™‡Ù½á ¡Ư±»ëöăàÏÔ8¤‡Ö³Ú×ÍË)éÛ9¥Û×ù×¼ÍÓù×ơÔ•ù×™ÓíêăˆŸ«·3uU†×¡ÈÙÚĂÙÀĂù¿ÁƯƯ¾™Ôá=÷‡ëöǼûÓÖđăˆŸ;kÇׯ™ô½ÍÓÍö›¾°½«‡“Íj·ÔöǺ™ô9¥‡Ù€Åر»•Ç«Ô9¥‡—¶±»‚vɇöÔ éÓ§ô›ÚŸ}ëöù×§ÓÜù×çÚưÀ¸à×ÓÓ¼Óº¸Ú­ÄÅ–ƒÚ¡Á«‡“Íj‰¿IơÔ¯G‹øƠÜƠëöÅÁăàñÖ£ØÛ«‚ ½9̃ŒÚ,³ºó߈ÛÄÓÙ½ơ»Œ₫½¥ØăˆŸơê½ÓØ©Óö¶ µØ£@˜ ê è ä ©‡¥2ßëM¢äÁĂù׋ÜëöÏÔ÷ÁÙ̉Ù-×¾ƯÓ ¹ÚÏÄ™»™ÓơÜñÓ×ƠñÄăˆŸ;kù×ÇÖÙYù×ÍÄáç±»ÍÓø×ưÀƯºÓµµaơêăàĂ¿‚ûºÿ¯¶ù×׿8ƯºÚÀ°”ưÀÓ¾߈ïÚÁëöÁÓµa©‡¥2ßëM©‡¥2ßëMßÄÙÙܵØÿ¼£Ơ«‡“Íj™‰kß [ïSÁ†ºù×±»Û«‚ ½9ƒvͪ߈­ÖÛ«‚ ½9ív¹ÚÏÅÁÓ¿ß¡ăˆŸ %ăˆŸµÜ±ëØË̉·Ó ¥0ŽÖر»ŒÓ©¼¹Øß»û¾³ù×ÏÔƠ߈¡ÁÙ½ñӽスÁ̉÷Á­¾ưÀÍßơèÅ©‡¥2ßëMµØƯÓ ólj¿IÙשǩ,å̉ ̀Ă‚v•ÓÜ‚÷ÚơêÙ½̉ÅăˆŸ;á Û«‚ ½9‡ơÄÏÅéºßÁÛ«‚ ½9µØÛ«‚ ½9±»ÏÄÅØ…»‡ŒĂ «‡“Íjù½¾™×Ơú̉ÇÖÏÔđÓ°»ăˆŸëö–¾éêơêö™Ø‚v2‰ơưÀ‰•…ƠŒÅ¿¡ÈÁ¹°»˜‰j̃ZîS±»ÙÚ›¹ÙÅëÍƠăˆŸ;k©¼ơÔ±»ÁĂÙŸƠ›¾¢… ƒvưÀ߈˜‰j̃ZîS«‡“Íj¹Ú8¤‡Ûº®œ‰¾I—Œ÷Á¡ƠÛ«‚ ½9Å–½«Ôá+ưíÖ¡ÈăˆŸ«ÔßÁưÀĐÄêăˆŸö8¤‡ÖåÁƒv₫Á½Å»µØĂƒv߈ù×ëçÛ«‚ ½9̃Ä Ø ÿ½±»ßî»ÁÏ̉߈™‰kß [ïSᬳÔ÷Ạ́ ¬°àèMơ걿̃½ËÉ9ÍË)éÛ9¥½½‚vû₫ÍÓ½Ăíø«‡“ÍjµÜ³ØܺÁÛ¢äáƯ߈ƒv¶¶  ›ÚÅ„®×щ—¶‚vÛ«‚ ½9•ÁƯ߈߈™‡Ï̉¡ÁÂù×åü¥Ø™‰kß [ïS™‰kß [ïS¶½·Æ¡ÔÍÓ±”ñÙ¥ÓÛÀâˆ:ó¶Ù½ƒØ—»ơêö›¾ơ»ó^›vµØÿ¯¶³ºó‘Æôê÷ÔëÚÆÜ߈º©º‹Ç¹Ú±»ĂÙơĂÙ½ÙÜÛ«‚ ½9ºù×™‰kß [ïS§ÔÛ«‚ ½9ăˆŸ;ƒØ£Ø¯×ĂƠ˱“Ơëö‰¿Iéê½­Á̉9¥‡½ÏÔ¢»ù×߈©¼·‡‘×8ç…ØÿÚ³Â÷ÁÛ¶n½ŸÖ‡ÚóÂÏÔÏÔí‡ÍƠµØµÁ±»º¯¼ËÓơêϰ»ö¼‡·Å†“Á‡é/×:É̉»‡ơê‘«±»Äëö£Ø±»ÙÚö—»«‡“ÍjÏÔº±»™‰kß [ïS±½ßÏĂƠ›¾ûñ»ÂÙ³(ÁƯëọ̈½ÏÅÁ̉Ó¼áêÏÔÏÅÙ˳¼ô§ÓëÖڻ؃v™‰kß [ïS·ÔÖÆ¡È9¥‡ĂÙ߈«ÔÓ̉¾ßëÓ½ZÑÓÁĂ’±»Û«‚ ½9ÁƯ߈—¶ÏÅψ»ÁƒÚăˆŸ;‡ÚåĂ౿ÏÔÍÓƒˆÏ̉½™Ô‹Ù˜‰j̃ZîS¡ÅùשŒù×½Ô÷ù×ưÀÁÈ›¾…ÔÏÅív¹ÚƯÙ«‡“Íj½•½Ù½ùôö÷ơÚª‚ +¼99¥‡Û«‚ ½9‚vÛ«‚ ½9íêÛ«‚ ½9‹ÜÙ½ƒ¾‘Ù×™‰kß [ïSº-߈„ í‡ôê¥ÆùæívÛ«‚ ½9ƒĂÑÓÛ«‚ ½9«‡“ÍjßÁÊ¿°»¥ˆ]1Ϲ‹Ç¾êöñÆ̣Çå̉ ƒˆÅéơùשÀơêóÇ›ÚßÖư§‡™‰kß [ïS߈™ĂÅÏÅͼÏÔù×í Ëû¿Å­Ä‚vÛÇÛăˆŸ;k¯ÈƒàÎų8®™‰kß [ïS«‡“ÍjÁƯ¹Úơê³’ÈÛ×­ÛûÓ½¨¼ăˆŸÍË)éÛ9¥8¤‡óÂÁÓÓØßÿ¯¶½€ÙŒë*«¥ØŸƠ°»³±»ƒÖƒˆÙ½÷ˆưµçÚëÖ»»ĂÈơÔ¥ØÏœȰÂËÉ9÷Á«‡“ÍjÏ̉»‡½íÙƒ¾‘§ôï³2…ØöÁ å&̉Æ¿±»µØơ$Ú׿ôé€ëÍ¿‰Û«‚ ½9¡Ơ‹Ü™ÓăˆŸ;¡Û«‡“Íj©Øôù×Ó¼›¾¶ÔăˆŸ߈ïƠ·ØÚÆ÷Áå̉ ωÛÁ½‚ÚÚª‚ +¼9Ở±Á·Ø¼€ÿÇÛº›¾§Æ÷Á¹±»ëöÓØ«‡“ÍjµØàӻ˿Ÿ}¨‡¤2€̃êL™‰kß [ïSÎÅÇá±̉›¾Û×öÁÛ«‚ ½9½ôÍÄ™‰kß [ïS£ÇÏÔùơá¾³Âß½™‰kß [ïSĂÙÄØëö½™‰kß [ïS÷‡ÏÔƠ«‡“Íj‡Œ߈Û«‚ ½9߈Û׫‹ßÄÙ—¶ĂĂ ›­±àéM¼ µÜ·Ó ¥0‡eôÿ¯¶«Ú™ëéåäÆ#¿¹óÔ‡̃å»Ë̉ùơ³Èù×ưˆóÇ»‡÷¼Ù½–¶§Ó»ƒÅƯY÷Á·‡‘×8çù×ÍÓưÀ’Æ Ơÿ¯¶ø×ÓØ«‡“ÍjĂÙÛêăˆŸ‘È9¥‡ăˆŸ;kï½·ºÙÚÛºĐ̀ÇºĂ¡º£Ø³èù ÂÙ›¹ĂôơÔÛ«‚ ½9¹ÚÙÚ›¾Ăº‘Ó™‰kß [ïSÛ«‚ ½9ùæ8¤‡Ö™‰kß [ïS«‡“ÍjÏÅÍƠÿÚº·#Ÿ»Û«‚ ½9đÑÓ·‡‘×8ç©¼ăˆŸ™‰kß [ïS•Ô³ÚăêŸƠ½¥à˜êèäÙÚư“ÏÔ·‡‘×8ç÷ÁăˆŸ;kơê£Ô£Ư忇”Œ ƠXÿ¯¶óÇœ‰¾I•¤øê ª»ơĂƠ„ßÖ¾™‰kß [ïSơÄÛ׫Ñá ¤ˆ\0Ï̉ù×±»߈¡ÔÛ«‚ ½9«‡“ÍjψưĂÛÓ̉ÑÄë÷ˆ߈ɇôѯƠíÖµ†›Ú9¥‡¾µ†Ç؃vĂÙÙ×À¹ñÓ»½ëö»˜«‡“Íj½÷ÚƒˆÚ.ƒˆ»Øÿ¼ßÖ߈Á׿ô«‡“ÍjÁĂ¿‰Û«‚ ½9¯´£XơêÉ÷‡ĂÙ˜êèä£ÓøơÉĂÛºăˆŸ;k±»‘®ÿÚ÷ÚÑ…ÁƯˤ9¥‡È̉Ổ½ÅÄù× Èù×™ô߈³™‰kß [ïSÅı»ưÀ£ƠߌÛ,ñ  ƯÍÇ¡ÛăêÏԻȹÚͼ¥É§Êï‡ăˆŸ£ä™‡ƠÏÔƯÓ ĂÙ±»«»ù×±¿ëöª¶2tTăˆŸ;×ívµÅçÇÙÚ·‡‘×8ç©Ø߈çÚÛ«‚ ½9Û«‚ ½9ù×ăˆŸ;ív·ôÔºlÁƯ¨Àù×±»•ŒëÔÙÚ÷¡Ưˆ߈ăˆŸ;ïƠùå‚Öº%½™‰kß [ïSÛÿ¼ëöăàÛ«‚ ½9©Ç³±™‹ăˆŸ;Öù×û™Ê—¾ơĂ‹Çø× £Ø»ÁƒÄ߈Ǻ¹ÚëöƯÓ ±»ù×£ä߈™‡Ù×±»ù×éÍÄÙÚÁ™‰kß [ïSª‡’̀j©Ü¬Å﻽€Ù½ÔX±»•%ívº™‡Å؃×ưÁ¿́«‡“Íj8¤‡Öù×·Ó ¥0±ÖºÛ×ßÚ«Ô߈ÑĂöê 9¥‡ÛÄÓưÀ¡ÔăˆŸ;k«·3uU߈•ÇÓˆ•=‘½æ*©ßªÔÛ×å̉ » ÁÁ¼›¾ûÓÏŃְ¿çÚöÑÓÙ½÷‡øÓă²Ưÿ «Ó…»—¶đ»ù×á ™×«‡“Íjùש¼ƒˆ½€ívï½Ï”ĂÈ¿¹ÔX +ÁƯ·Ó ¥0½ÔƠÍË)éÛ9¥Æ™‰kß [ïS¥ˆ]1Ù»™‰kß [ïSăˆŸăı»ÖÆơĂù×ûØ̉Æ¡‡ăơ©ØÛ«‚ ½9Ïı»ÔÅçºË̉÷Á‰!ñÖ©ØÏÔăˆŸ½€ñÓÍÓ‹ÇÁƯ©‡¥2ßëMåÙ̉™‰kß [ïS±»ǼÅÔơê³×±»ÍÓÙ½ÍÄøơ§Ôë9¥‡àÅ5£Ø˜êèäß„µ‰©‡¥2ßëM}6߈ÂÙ¸ÚĂ¼†Œ   …Ó̉ÆĂºí굆…nñÚº÷÷Û×̀½ÏÔå̉ ù×¼²ÆrÅÄăơ9¥‡˜‰j̃ZîSÍñ»ÅØׯƠ÷ÁÙÚ™‡­ÄïÛưÀ™‰kß [ïS™‰kß [ïS—ØÏÅĂÙö±»߈߈£äù×ăˆŸ;ĂÈæËÖ»ëÚ½ô±Ôƒàëö§Æ¡ƠăˆŸ;Ù½·ô麙‰kß [ïS¥Óׯ¯È±»»‡™‰kß [ïS…Â¥Óăà‹Ç±»«‡“ÍjăˆŸÁƯ…ØßÅù×Ó¾«‡“Íj¡%ơÛ«‚ ½9­Ä»χ¥ÆÏÅÿ§¾ăˆŸ;ơÔé‰ñ5ñ·…Œ•{ăÂô±»Å°»߈“Ơ¹̀÷‡¡ÔƠÏåÏÔ¹„ưˆơÔ©¼¿º­Ä“Ơâˆ;™‰kß [ïSÛ«‚ ½9™ô»ÅÍĂ“ÛăÚ‹ÇăơóħÓÿ¯¶ ÛĂÙñÓ½ù×ử¹ăˆŸ;ƒÚö˜ÁÎ +߈޹ÚăˆŸ‹Í¿‰ăêÛÄӥر̉ï»¶ÜùêÛ«‚ ½9ׯêö‚½© ¶è›¶éø¿Ó̉…—¾¯Ô¸Ú¥ØÂÛ«‚ ½9‚ºá=Ÿ}Úª‚ +¼9ËÉ9ÍÓ ÈË̉‚vÿ¯¶½€¿‰¿à߈£ä橇¥2ßëM÷‡öù×́v“Ơ±»ăêÙ½½‰¿I÷‡‰ÇíØùׇ“ëƠUÛÀ¡Û±¿ƒˆéÚ±»íÆÏ +Ï›¡¾è˜‰j̃ZîSÙÚÙ½ÙŒë*«Ç»¦ÔỞ±»߈¡Ô¡Ơ‘ø̣Çä̉‡xÿÛµ†ÏÔ¡Ô¶èø×º½₫ ›¹Û«‚ ½9Ổ߈ÿÚ¾|ÑÄëÁ½ơÄăˆŸ;kăˆŸ;±»ÅÓ±»À¹Ñæ·ÅÓÁƒ߈ơÄ·ØÛ«‚ ½9ù×ï½ÓØ÷Á‹ÓÎÔëö“Ơׯù×›¾ơêÓ̉«‡“Íj«»Ù½°»…à±»ßÄٹڵخGø™‰kß [ïS©‡¥2ßëM×Ơ†7§j₫Ú›¶é”Èúö߈¶Ô±”ơĂ·̣ưÀ½ÁĂ…Ơ¦ô½Ơîù×¹Ú™ëéåÙY‹ÜưÀƒvö÷ˆƒv›¾ÿ¯¶á꛾߄¿‰߈ÿ¯¶ăˆŸ;Ù½Áß»û«ä½½…€­:›¾ï»—ïÛ«‚ ½9ĂÖ‡™‰kß [ïSïÚ¥ÖăˆŸ;‚v©Ó¾ºÅ–¹ÚÛÄÓëöẳ£ÔăˆŸ‰ÛÅÔăÚƒv™‰kß [ïSÁ‹ÜƯºó¶áĂơêÏÔÿ¯¶™ÉÁÛ±»ô­ÄƠ“Æ߈Ë%óÂù׫‡“ÍjÚÀÛó¶¶'è'×Ơºͼ¾ûÓÏÔÇĂơ껳ư¦£äÓØ·Ó ¥0¥Û¿‰8 ¤‡ Ö çÚÙÚ«‡“Íj­Å™ôơ꫇“ÍjƒÔƒvÅà‹Ç×Óï½j£»ƒà°»߈ëö«º…»ÙÚÑÓÀ+߈‰Û¥Ø“ÆËÔĂÙÙ-¡Á«»›¡ù×Ó̉¡ÁÍñ‡¿‰³ÁƯ…ơê³Â±»«» È“Ü™‰kß [ïSË‘ôÙÚ²Æù×ĂÙ›Ú㙉kß [ïSµØƠñÖí ÏԿߣX9¥‡‹Ü÷Á—»¾éÓĂÙ‡º™‡‡9‹Ü¢Çùט‰j̃ZîSÍĂèív¿«‡“ÍjơÔɃ̉ùơù×ÙàÜÓ Ù×ăˆŸ½ÔơêưÀ×¼·‡‘×8çè‰đ5đ¶ƒv½€ëöỞÛº«ÔƠưÀÓ’™ºá ùê£Çù×·‡‘×8ç±»ĂÖƒÖ‰y±»»½­ÄÛ«‚ ½9ŨŇ«»Ă­¾›ÚÏÔú£t½€ƠÛ«‚ ½9ßÚÛÀ™àăˆŸ;Úª‚ +¼9ñʇ™‡8¤‡Úª‚ +¼9Úª‚ +¼9«‡“Íj‡Ç±»ù׫Đ× 9¥‡×™‰kß [ïSïÅơêĂƒv°¿ơ³ØÙ¡âàÅØăà±»÷ÙᤋÈ0·ÔÓÅÏẠ̊Ä™‰kß [ïSơê³È³ÔêöÏʼnøÏÔç̉ỗˆưÀ‚ÑÓ«‡“Íj‹Û‡ăˆŸ;¸ÚƯÎơêƯ¼€ƒ©‡¥2ßëMÙڙثԛ¬ƒˆXÏÔÏ̉÷ÁưÀíꌽƠ°»ǼæÚĂÙä̉÷‡¿ßäÁ‹Û‡aßÁÙÚ·‡‘×8çÑĂÉ6Û«‚ ½9«‡“Íj·ÔÛ«‚ ½9íJ²Â µØØ×ƠÚ±ëØù×ûƠ߈Ù½ù×ù×ôêµ¢ؼ"ÙŒë*«›¶éµØÁĂ¿‰«Ô™Ô߈Ù×å̉ ï»ăˆŸ;߈ăàÄÓÿ¯¶‡Ç“é¹Ú˜‰j̃ZîSÛ«‚ ½9©‡¥2ßëMưÓ“¾ß¿‰¹Ú°»§ôÅÑëöơ»™‰kß [ïS߈ÅøíÀ¹߈ذ¿ àר¥ˆ]1߈ÿ¯¶±»χ÷Ù´aëöé󩇥2ßëM§Ôëö‰¿I…»½¡ÛµØưˆ¡Ô±»9¥‡×ơ莀ÏÅ·‡‘×8绽‡ÛëçƠç&߈ÏÅ—»éêĂÙ—»đÁ«‡“Íj·º°»©ä̉ÔÅÍĉ¼•ÛÏŭĹÚö¾¹xßÖñÚÁ̉ù×£äăˆŸó€ëÜ‘ØÓ±ñÚÏÔĂºëö¿ºÁ‡é/×:ăˆŸ;ÏÔ߈çZăˆŸ;kÜù×û×ĂƒàèÓÆâÿÚĂ$™ôÛ¿ăई\0ßÁ¯ÈÏÅ¥Ư¡Ô³í‡ăº½ÔÏÔ»­Ø›¶éÛ«‚ ½9“¹ƯN½ưØ«‡“Íj«déê½Û«‚ ½9½ØÛ«‚ ½9¡ƯÛ«‚ ½9ù¿ÂÙ½Ô¹ÚÓÆ±»¡Ôº½€ƒˆù×™‰kß [ïSÏÔ߈ï»éêơêÅØÍÓ9¥‡›¡¯È½ăˆŸ;°»߈×ƠĂÈö̉Å«‡“ÍjưÀ±»£Ø—Óö‰Ø±»“¹ƯN釯ù׫ک¿äÁ†ưÀ‹ÜíÆ£ä÷–º‹Ü›¾ëÔÏŃ䙉kß [ïSù×ỡ¯×›”ÅÓÑÓ«âÏÔÍƠù¿§¹߈ơĂ½ÏÔëö®GøÛ«‚ ½9?ơØÏÔ9¥‡×̃ŒÚ,™‰kß [ïS‡©%¡È±»̉½!›¾Á|»½÷ÙơêÏÔëö£Œ½ÀĂ‹Çß̉Û«‚ ½9‹ô£Ø½ÿÚ«´­ÄÇÖ¹Úï»Û«‚ ½9YÚª‚ +¼9ă»ÏÔ½‹ö£äª»ÏÔ«)ăơưÀ×¾Û«‚ ½9ÁƯÏÅÿsÛ«‚ ½9ß»û—Áº˾“±»½áµaùêơÔ—¶Û«‚ ½9©ÓÅ»®Gø±»ßơ9¥‡ùêñÚÁ½ĂÙÏÅóÂÚª‚ +¼9ñÖ™‰kß [ïS£Ø‡ŒܺÇ·¢»+Û«‚ ½9Ѷ÷¶ÿ¯¶±»ÏÅï½ăै]1¡Û­vÁ̉ÿ§ÍÄĂ™‰kß [ïSÙ̉“ºÏԼȣƯĺÛ·Ơ™‰kß [ïS†Œ½€¯È³ºó©‡¥2ßëMÇÖ¹ÁơĂá=çÚ˜ĂÖÆ÷Á߈£ä±¿±»‹ÜÏÔôÍÓ½¬¿ÏÅ9¥‡¯¼ăˆŸơÔÿ&¾ÑÓö٧Ԥ«ÔÛ«‚ ½9£Ôù‰÷‡Û«‚ ½9ë̉Ń+ăˆŸ;9¥‡Û«‚ ½9•{µÈ¹§êöåÁ±»ôêăˆŸ߈ăˆŸ;á ºɇ¹Ú›¶éŸ’ÇÖÀ̉ÿ¯¶Ơëöï½×ñÖ©‡¥2ßëMù׫»ïiÑèÙÚù×ÏÔÛ׿ºơêƒv¹Ê±»ÙÚ…½ÎÄͼ÷ÁñÆëöó¹½­—éê­ÖÏ̉‹¿¹Ú–»­Ä÷ÂƯÓ ™‰kß [ïS¡»¶ïÚ¯ÛÛÀ» ׇ‡ư2ÛÇÏÔáÛëÚ²ÂÿÜ€Ó©¼³ºóùט‰j̃ZîSÑ¿ơăÛ«‚ ½9™‰kß [ïSÛ«‚ ½9á •Œ•ºưÀÚÀáçưÀÙ½¿èʹÙ½ÏÔÛ×±»Ø̉«ä‰yÏÅͺ߈ÛêØÚîÅ߈ăˆŸ;kºyûº™‡ƯÿÚÏÔÁĂçǾvƠXëÓƠÁË¿‰¿»§Ø9¥‡Á½ï²2±¿Ă÷ÁÛ«‚ ½9ܺ§ô—¶ÙÚù‰½½Ă“Ƶ.¥Ùƒv­éê‘Û×µaÓº“ºå̉ ưÀ½Ô‘ÚÏÔ½€©¼ŸèïÚ™‰kß [ïS˜êèä½›¹·̣ƯÚÛ«‚ ½9ù晉kß [ïS·º³ÂÏÅ÷Áƒv£ä¿̀߈ĂÙăÇí…Û½·ÔÑÓ…Á‡é/×:·‡‘×8çëö›Ú­Ö©Ç߈Û«‚ ½9à ÍË)éÛ9¥ñƘêèäù×½âḈăˆŸÏÅÅÓ½÷ˆËÇî¡ùêéÓÛºçÚ÷Á±»Óˆ•=‘°Á ¡ÔµØ°¿á ívíÙÛ×éêÙ½¦È…ø¡Ôÿ×ơèÅ¡ÔÚÇĐÄêûºëöƒ½…Û߈ëöëÂé™åÁ›¾ÁƯコ®GøÍË)éÛ9¥̃‰Ô¥ˆ]1¸Ú&ÏǺ–GăˆŸ£Çưˆ°»«»ăˆŸ;­ÄÏÔ‚vçµØµØǼËÇÛ«‚ ½9ÙŒë*«™‰kß [ïSùׇŒ¿»ăˆŸ;ùêóÇăˆŸ›¶éÏÔĂÖÚÆª¶2tTÛÄÓíÚ…ÖÏÅăê½ô«‡“Íj׿8°½¬¾ĂĂ ›­±àéMÑ·×Ơ†7§jô¯‰¯0ÅÓĂôµ%Ă¼Û«‚ ½9Ăٵܛ-™‰kß [ïSĂȋLJ¹Ú©‡¥2ßëM›¹˜‰j̃ZîS—»½Ù½ÇÖ«‡“ÍjîÅö™‡•Œ¡ƯĐØ“ѺơèÅËƠÏÔñ»ëößÚ₫#…ÚăˆŸƒØă» Ëû±±»›Ú‚»ØóÇăˆŸÿ¯¶ÁSÿ¯¶ß»ûƒv߈ÖÆ½ăˆŸ“×µØù×±»ÏÓƒàË¿ù×ÅÁ±»~ăˆŸ;Û«‚ ½9óî°»³ăˆŸßíă» Û߈ŒÛíÖùב÷ÁÓÅn½ÅØÑÓÛ«‚ ½9ÏūԷ‡‘×8ç§Ô¡Áщ}ëöÇÖ߈¹Ú¡Øîô ¿<ëö‹Ẹ́âÁ´-$»‡€º™‰kß [ïSÚ¹±»Ž‹ÇÛÀß„©ĂĂù×ÿ¯¶ĐĂƒ×±»‹Ç•ŒăˆŸ;kơêƒvÛÄÓëö©&Û«‚ ½9£‡Á×Ï̉ôê‡ÿÚåÜ­Äó¶ÍÓ™‰kß [ïS£Èù׃vÿ¯¶ÿÚ®ö©Ó³ÜăˆŸƒvëöăˆŸºÓÏÔ¹Ú•{•ט‰j̃ZîSư“ưÚö¶±»±»·Ô´Ăëöï½§ÔÍB°»ƯÓ ƒØ£‡•Èû›ÍƠÅØÓ̉ÑƠXÓ¿‰·ØÍƠ߈›v“¹ƯNß»û•Œ¨‡¤2€̃êL߈®î©ÜÍÇáÛÛ«‚ ½9óÇ߈óÂù׃½ÏŲØÑäˆ\0©‡¥2ßëMăˆŸ̃ˆÙ̉‡Û£ä±¿¡µ»ˆƒØăˆŸ;©Ơª¶2tTú̉÷‡ăˆŸ;ăˆŸ;ÛÏ̉£Ưëö·‡‘×8çپŖĂÈ߈ưÁºƒëÖá ĂÓˆ•=‘—ÓÍÄÄ»íêù×¥Ưƒvô«‡“ÍjäÁËÇöùô™‰kß [ïS¶“Û½ºÅ¼“ܽµåù¾Û«‚ ½9ă»₫ܽ²Ø$³ºó©à™‹­½¼é‰ñ5ñ·ăà·&±»‹Ç‡ÇÈÙ±»¡ÓÓº—»ñÓ½₫ÇĂ߈ùלԩ‡¥2ßëMá ¾º›¡ùꙉkß [ïSûٯי‰kß [ïSÏ̉öä5̉÷ÁÚª‚ +¼9²º̣çÚ¬ô³©Çá ­ÖëöÔ߈óÂÛ«‚ ½9ÆËǺyĂg‰¿Iù×Ă¼ƒÛ¡Èöƒ¾‘¿ô÷ÁɧÛ«‚ ½9ÿÚÅÁưÀÛÇưÀŸ§ô›¶éÁÇÖî²2Û«‚ ½9ăˆŸ8¤‡×˜‡«‡“Íjù׉Ûö8¤‡«Óù×½ÔXÙ½¥ÆƒṽÄØ·̃ÏԹͰ»àêá̉ù×ù×ÓÅÑÄëÛ«‚ ½9ϼ“ƠŸÖ©Çÿêăàœà“ȼØéØÏÔÄnÁ¹¸ÚÑÓÜÂÙÿÛ½€«Úÿ§«Ä–ơÔª‡’̀jÏÅÏÔ߈¶Ó¼­Ä™‰kß [ïSå̉ ¹Ú›¾—»ªÔ¿‰á ©́ĂƠñÓưÀùêÑÄëôê¹öˆ½ƒơƯơ¡ÓăàùêÿÚéÚ¹Ú߈±»¡ÛĐŧÔÙÚ—¶ưÀŤM±s™ÔóÇÛ«‚ ½9™‰kß [ïSŒ¾çÚÁå̉ àƠ«‡“Íjºç'œ·̉ ¤0“È߈Í­Håô¿‰‚Ú É̉ÅÓ°»ñÓÅÓŽ½ŒÏÅÑÓƒvµaơèšԩ¾Ñ÷¶Ô ±»•¾«™‰kß [ïS¹ÚóÔǺ…Ơ—¶éꘉj̃ZîṢƒăˆŸÛºÏ·ÅÁĂËÉ9ÁĂ—ˆÇÖ•ÓÏű»ÏÅ™‡½‘Ô±»Ă¼½ß™‰kß [ïS¯‰¯0«‡“Íjä׿ذ»ÏÅ̃ˆñ×ÓØëöí—G¿å÷Ú€Óí꛾ëöÚª‚ +¼9ôđ»Ơ¼èÓ§Óœ‡·Ô«‡“ÍjÏÅ߈£Û׫Óñگװ»ñƱ»ĂÙÍÓó°»ÿ¯¶÷‡Ž™ØăˆŸö«‡“Íj­ÄăˆŸ›¾ưỞ»¼‘Ö¾‰Û¸à +›¹«‡“Íj߈öÿ‘&ơ³ÁÛƒvÛ«‚ ½9ƒÛỞù×Ơ¾GÏÚϼ±Û¾ơêĂÙ¹Ú…öå̉ ‡xºĐwƒ®߈Ù½ï»ù×ăˆŸ;®¼ œ·̉ ¤0ÿ¯¶×¿8™‰kß [ïS±»á¡Á¸½™‰kß [ïS£ØÖÆëöÛ«‚ ½9ÏÄAËd³ØÛ«‚ ½9ăˆŸ;Ç»«Ôơ»—ŒßƯÍÇ߈߈߈Ưº¿ôù×ơÔửơê‘ÆưÀ̀Ó/å̉ ßÁé‰ñ5ñ·ùê÷‡«‡“Íj—»ÛÙŒë*«±½½ȇûÜ—ÓÛ«‚ ½9³ºó½±»µØÛŸ¹Ú×Ăỡ±»ăˆŸÓŽ¿º§ô—¶™‡•Œƒ½ăˆŸ¶û(½Ü£Ơ½Ôå̉ ‚ÇÖÏ̉ôçôŸü9¥‡Ù½רÙŒë*«±¿™‰kß [ïSÛ«‚ ½9‘ÆÅ·ÑÓÙ̉«Úß»û·‡‘×8ç§ôùשØóÇÏÔÓØ¡»û̉ÁƯÁĂáÅơêׯñÆÛ«‚ ½9÷ÁǽỞïÅÍǃvăˆŸ;kׯÓÔÚÀ™‰kß [ïS€º‹ºÏ̉œÁ“ăơÏÄÁơº™̃£Ç½€©ÁÛ‹ÜỂăˆŸ¥ÄùדÈăˆŸ;kŸÄơúËÇù×ơê¥Û›Ú°)ăơÙ±›¶é¨‡¤2€̃êL÷Ô…Ô߈±»߈é‰ñ5ñ·ÍĂ©ïÁ©‡¥2ßëMŽ¸Ú«»ù×ëÍÙ½˜‰j̃ZîSÏÔï½ÄÖ­Ä8 ¤‡ ׋ÜÏ̉Ÿ}ö±»ửÙ¾ăˆŸƒư‡±ù1»ô¥ˆ]1Û«‚ ½9‡ŒÏÔ¸Ú +·‡‘×8ç§́™‡̉ÅëöÄôK±»ă»¿‰ªô™‡#…äơâ·Žù׫‡“Íj«‡“Íjù×Û«‚ ½9³Ç߈ơê›¾Ž«‡“ÍjĂĂùæù×ñÓÛºùê߈ÍÓÙÚăˆŸ;«‡“Íj…¼ƒvÁÛ«‚ ½9ƒv½ÏÅÑÄë߈ơê…£­ÍÄÿÚ‡Ú«‡“Íj¿‰»È»Å©Ó§½¹!ﻃv­Ø±»ñÚ¡Ù«‡“ÍjƒvÛ«‚ ½9Ú×±»8¤‡±»ù×å̉ ́Øư§‡ưÀ™‰kß [ïSëö߈ÎÄÙÚÇÜÑÓÍÓ‹Ü‘÷·Ø°”ơꩼ۫‚ ½9ÛºăˆŸ‹ÇĂăˆŸ;˜ ê è ä ơèÅ̃ˆ8¤‡×úÖçÚƒÚ™‰kß [ïS£Ø‰¿IǺưÀ߈½Û«‚ ½9…ô©Ó¯Ơ¿ÓµØƒvù×ùׂÖ̉Æûù×ÏÔĂÙăˆŸ;k¡ÔÁ̉Üăơ÷Ú•Èû›‹°ƒÖ·‡‘×8çù¿ßƯµØ‚'çÚÏ|ÏŃvÛÄÓÛƠĂĂ ›­±àéMŸ³±߈ăˆŸ;kö›¾½Ăª‡’̀jÛ×Ơ·§D êÖÅ–±ƯµØ§à¬ôÿÚÙÚÙ½¥Øÿ¯¶ơèÅÏ̉­ÄщﶇŽÁñ»Ù½ăˆŸƯºÇ&ßÔ©Ó©‡¥2ßëM½¾‡í‡¶¦ôÅØ¼¡Ø8¤‡×—ˆ±¿™‰kß [ïSö§Ô™‰kß [ïS߈ÇØÇ»±¿­v«‡“Íj¾̉Åëö÷å5Óù×ȃ»«‡“Íj‰ÔËçÚ†º“Ơëö”ÑÓ̉º³°» êÔ7æÚ̀ÄÙÚµ‰öăˆŸµÀ¡ÛửăˆŸ;û(ÏÅ÷Á•ÔÓØÛ«‚ ½9ö‡ŒÇÖúÓ¥ă™‰kß [ïSµØ‰ƠÛ×щÅÓ±»Óؽ۫‚ ½9ơêÛ×á¤<ưöÏÔëÓß»û£äÛ×߈½шÙ½º»±ë؃vơê™ÁшƒàËÉ9Û«‚ ½9ëöô‰±¿°»™Áëö±»¿Å‹Ù̉ăˆŸö÷‡Ù½ưÀÿÛ‚vËÉ9¶èơÔÛ«‚ ½9Ÿ}ÈÛסÁÚÀÅÔ¿‰ë™HơÔô«‡“Íj₫‘±Ó؉¿IƯ܇x‹Çµ‰«Ô›¶éÖØ¿»§ƠƠ«‡“ÍjÛ«‚ ½9¥ÄÏÅ®Ợ½‡ß¿œÚ¥ÓưÀç®§ÔƯ¸«ÔŸÄá ƒØ¥Áëöù×ĂÈÙ½ûƠ±»÷å5Ө׽ô·› ¶Ô Û«‚ ½9Ï—»Û×龇ŒăˆŸ9¥‡ÿÚ‹ÜÛ«‚ ½9µØ±»ÓÅó‰ çÚ¡Á™ÓŸÅë½ÇÖƒv±Ô¥Æ¶..­ÔÅ»“Èư“ר«‡“Íj±¿›¶éăˆŸ߈ÅÓɹ¿½™‰kß [ïS‡߈¥ÛăˆŸ«‡“ÍjóĂÚ½ÙÚ›¾¡ăˆŸ;©Ø·ÙÛ«‚ ½9·Ø·µ£Ç°½ĂĂ ›­±àéMÏÄù××¾˜ơ ĂÙ¹=å¿¶Øù×½߈²¾½ÈƒØ½߈ùב±Ù½ƒÖÅØóÂÛƠÏÔƒˆ÷å5ÓÙ½™‰kß [ïSßÄÙ™‰kß [ïS‡ñ5ưÀăơåơÛ«‚ ½9߈«·3uUª»9¥‡× ÁóÔ…»ùׇŒ‹ÜËÉ9ù×躽ëÄô²Ø™‡§Ô߈‘Æ™‡Á̉ؽ½±»˜êèäáƠ߈®Ó“¹ƯNÙÅëÏž‡ÇÏÔăˆŸ߈«‡“Íj‘³ÙÜÏ̉¹ÁÁ̃ÂÙÍÓÖ¾¿ôǹڇÇÏůө¼ëö™Û‡Ú«‡“Íj½£Ø—¶ĂÙÑÓƯ ÅØØûÀÅàŽå̉ ÈơêĂÈ¿Á«‡“ÍjÆÍÓÖ½»ô¹Úźׯ3øà™‰kß [ïSçô“Ơµ†ÑÓå̉ ±¿Û«‚ ½9ƒăÄă*½‡¹Ú¼«Û¹Á¯ƒ« +>Óï³2ơÔ‡ƒÖăºÏÅ߈ÏÔ8¤‡™×˜•½Û×±»ù×÷ˆÿÚ±¿Û«‚ ½9Û×߈å̉ 9¥‡߈ÈÁƯ‰ØÓØûßÁ‚văơ›¾ĐÅ…ÚăˆŸ¦Ûù꿉±»éÓăˆŸßÄÙ…ôĂÙ߈ËÖ¯¼å̉ £äÏÔË̉Ù½çÚ‹ÓăˆŸ©‡¥2ßëMÛöÓØÀ‡€è/Ö:Ơ±»ëđ¿ßï½áÓÅÓù×Û«‚ ½9êöƠ·‡‘×8çŸÖƠ¸ÚÙÚüÀ¥â·‡‘×8çÉ”ùßăˆŸ;ëÔëÔóÔ‡9‡º´Å¡ÛéêĂÙ¼¹ƠñÚơèű»§ÔăˆŸ»ØóÔÅÔøë˜‰j̃ZîS±ë؃½º“ÈÛ«‚ ½9ÛºßqăˆŸ;kç‚¡ÔăˆŸ;ÏÅ©‡¥2ßëM×Ơ†7§j¿ß­¾™‡ÂÙù×ß́Úùן}¸ÚèÓ«‡“Íjƒv½™Ó™‰kß [ïS¸Ú™‰kß [ïSŸÈ·̣ÿ×›¾ăˆŸ‘ÆÖØÍÓûƠ¿»˹±»«»ăˆŸ;¾½è߈“ĂÙ9¥‡çºü̉ÅØ‡Œ¯àÙ½ĂÿÛơÔß»û™ÔơÄéêƯÓ ‡Œ¥Û—»Ë¿™‰kß [ïSÚÄ̉ĂÙçØ˜êèä©à9¥‡ËÇ̃Áơèŕܻ¼‘ƯÓ ߈ÏÔ8 +¤‡ +ë̀¡ÁñÓ‡ºÅ–߈Ăô™ơƠX©ƠÙÚá ă»ËÉ9Óº§ô³ÆÛ«‚ ½9…»ù×ƾăˆŸƒvÙ½£ü±»‹È™ÛóÄ¡ƯÇÖơĂ¹àÏŽ‰ÛêżÔ߈£äÚÆ̉üº“ƹÚùêå̉ ©‡¥2ßëM«‡“Íjƒv‹Ü½ÔăˆŸ;G½¹Ă ơÔ©¥‰»ÏÄÏÔÛ«‚ ½9ψ€Ø߈ù×ăˆŸ;Ù½ĐÓ¹Ú€ÇëöưÀÏ̉¹¼á °»9¥‡Ï̉ï³2ÍË)éÛ9¥›Ăȱ»£Óшø× ăà—ă›¹±¿•½ƒv©‡¥2ßëM߈›¹ƠX߈÷4ƒvÔÙƠçÚÑØï½Û«‚ ½9ăˆŸ;k™Á¶è¶©Óß»û½¾‡ăà÷Ù߈ÎÊƠ«‡“Íj­½¼ËÉ9¯‚ш°êØ̉ˆ”=ÁƯÛ«‚ ½9½ƒ×ï½óƒÚóèê¶  Âñ»¹Úăà•Œχ©‡¥2ßëM‡·‡‘×8çºyª¶2tT—¶¡Ô¶±»ÛÄÓ“Đ½¾‡µaÙÚƒù«Ô‡ºƒ‡ÜÏÔÏÔƒÓ̉ƒ߈©‡¥2ßëM₫&޶Ô﻽˜ÔçÚơÅ™‰kß [ïSàê¼çëöƠÅÔ×¾©¼˜‰j̃ZîS÷ÁđÚ±»ù×ĺÈÁ±»ăˆŸؼ™‰kß [ïSöψ·‡‘×8癇ÏÔÅÓÅØ»ˆ¿¹Û«‚ ½9™ÔưÀ­¾Óº‹ÇÏÔ³Èăơ›¶é¥¾¿ºéº¹£ÇëöÏÔ߈ß„ϺÛ«‚ ½9À½©-•Œ£ØºÁÁơêëö¡È‡ÏÔ—¼‰Û”öưÀ߈ÅØỞ±»±»߈̃ˆ¿ºĂÙñ×£Ôß»ûÍÓ´Ăæ™Á·ÔñÓ¹Á¡Ô¡í‡é‘ø±½ñÚ‡ŒÏÄ—»“ÈöÁ÷Ù‹Ç™‰kß [ïSƠǼ­Ö9¥‡¶ÔºÏÔ§½˹́ºĂÈù׌Ơ…»³ ù×âÁŸÖÛ«‚ ½9°»ïƠơêá íÓ߈ơÔ™ëéåù×Û«‚ ½9¥Ö«‡“ÍjνñÓŽÛ«‚ ½9Ê¿¼¶ăˆŸ«»÷‡ơÔç½9¥‡ÅÔăˆŸ†ÇƠ˘êèä₫¼ơÔ·‡‘×8çÑõ†ưÀ¶‡Ö8æÇĂ¹½¼ØÅÔĂơÔ¿Å—¾÷Úưº—¶Ăô¡ÔÚª‚ +¼9‰¿IÍÓ·ÅÙ̉±»¾¡ëö‡ÚÀĂ èê¡Áº§Ó‘ëÑŰ»áƠ±óÏÔ±»ăÁǽ¼«ä÷ÁíÖùå“Ơ÷ÁÛÅ–’ºµÀĂÙ÷‡9¥‡χºÙÚÛ«‚ ½9¥ˆ]1Ë̉ŸÓ«‡“Íj±»“öÛ™ÓăˆŸ;k©Ó½ï»ƒˆ‰¿I±»ăˆŸ;«‡“ÍjûÀ²¹«Ô“ÔÔơ×Ơ·‡‘×8çßÚ…Ö£»º¾ÿÚêöƠÎŃv›¾½—ˆæê ¶÷‡Û«‚ ½9çÚ«Ô÷Ô¯àÏÔÿ¯¶ŸÜ« ©ƒ»5«‡“ÍjÙÓ«ÔÓØÛ«‚ ½9ĂÙăơ—¾ưÀ߈ÏÔÁƯá̉ÏPưŒù×™‰kß [ïSÛ«‚ ½9™‰kß [ïSæÇ©Ó÷ˆƠ„ƒˆĂº‹Ç÷ÁéÓù¼­Ä«‡“Íj½º÷ˆ±»±»ùꩺ±Û«‚ ½9ˆëö±»ÙŒë*«•Œ½êÏÅÉ̉߈߈¡ÔǺâàăÁÏÅĂÈÆ»¿ô߈ÏÅ¡ÔÇÖÅØ‡ºí·Ù½˜Ă½€ÏÔăơßƯ©ÇăˆŸ;kăà›Ưшù×À‡Úù׆“›¾Đˆív°»‹Ü₫®¶™‰kß [ïS¶ĂÙĐÓĂÙ±Û«‚ ½9ËÉ9éÓÍBçÚùê%±»¤Û̀Ó₫ ®¶ «ÔÖ¾‰Áù×ơÔ™Á“™‰kß [ïSÙÚ±»ÁñÖ¹¡Ơ¿‰‡º÷ˆ›¹ÀËùë8¤‡×ívĐÄêƠÛ«‚ ½9˜×¹Ú½ÙÅë·Ô¡¢›¾±ëØÛ«‚ ½9À½߈ÏÇ̉ÑÄë߈¥Ó“ƠÏÄçôÁƯ³ØÏÅỢăàâ»̃ˆñØëö§ô߈߈³Ÿ\ÇÖÁĂơÛÏ̉«‡“Íj›¾§ôËÉ9«‡“Íj¯G‹ø™‰kß [ïS«‡“Íj‹Ç£» Ëû¿º™ëéåêö†Ââˆ:·̣‹Ç‹ÇçÚơê÷êÓÆƠœ·̉ ¤0ƒÖưÀ‹Çơêá0Á‡é/×:ÂÅÓË¿µ‡¿ß¡ÁÁÛÓԣǩÓÓ̉ÇØÁ̉ăˆŸ¯ÈÛ×ÏôÏÔ½©ØçØÓÅÏÅù×ÅÔƯÓ ¯×ÅØăÁ¹ª‡’̀jÅ–ƠÄßÚơÄëöù×›¾«‡“ÍjơÔ«‡“Íj’ÏÄÙÚ“Û·ÅÙÚ£ƯÅÓ™‰kß [ïS·‡‘×8ç½§ÔŽ8¤‡Öù׃׫·3uUä̉™‰kß [ïSÛ«‚ ½9±»ÏÅø€½ùס%µa½ß½íÚ‰ÛÈ̉½ƠáÚơÄăàăˆŸ;ƠX¸Ú +‚v°»³”óăˆÂÙŒë*«³Ú‡™‰kß [ïSÿµأô«&ÛÄÓ‡ºÇÖ³Ơ§ÆóÇƯÓ ‘à±»ơôĂĂ ›­±àéM«Ô¶™‰kß [ïS“Ơ¦È¡Ôø‹Ó¿ßÍÇ­RßÄÙÏÅëö߈­ÑÛڙ‰kß [ïS—¾ƒvĂÙĂôƒÖÎÅÓºñÇèĐÄ꫇“ÍjƯ‰µß̃ˆ­Ä¶ù×ÙYëöºÛ«‚ ½9µØÿÛ‡“¼ÜÇÖ‚v§ô“ÆăˆŸ߈Ö¹%ƒÖ©Ø¥Û¬ÖºØ·Ó ¥0×¾‡ÚÛ«‚ ½9§ÔóÂÛ«‚ ½9ÏÅ¢ÔÓØóơÔ¶±»»ÅÙÚ₫ÙÅë‹Åµ¶‡‰øƒØù׳ºóßÁ9¥‡‡Ă ñƠç̉Ơÿ¯¶™‡‰̃ßÖÛ«‚ ½9½€¥‰ÍL…×Ơ¬¼¼±»ËƠ‹Çƒˆùêƒv«»ö»̉™‰kß [ïS³Û×ᧃv¿º©Ó¦ÓÏ̉¿ßóÇƠ¿»«‡“Íj̃½ë×—ºÏÔ«‡“ÍjÿÚÅØñÓ«‡“Íj¾Ïŋș‰kß [ïSûÓŸÈÀÁB±Áåô¹Úív¶ô—ºß»ûƠ˜êèä¡ÈñÆíØ…×ù×§Ôïơƒv‡“Ë̉Çëö¥å¿·ÅÅØù׿‰̃ˆ›¶éM¯¼™Ô¥ëöˆº÷Ú‰¿IÎŨÈƯ%Ơ× ÛºơĂ½*ÂàÛ«‚ ½9¡ÁªÚ—¶±»ăà·ÅưÀóÇôÿÚ ¶Ô ¼»Û«‚ ½9ƒ½¾Äôù×Ûº¹ÚÛ«‚ ½9çôÏÔƒvß»û½±»¡Ô«â¡Á“ȽïƠgí—GÛ«‚ ½9éÚÏÔíÆéÓä̉߈χ×ĂÚÀơ»¥ÛÛ«‚ ½9…³ƒø×ÏÔ½àÚª‚ +¼9¶èù×ăˆŸ;kµ>½´%ÍË)éÛ9¥©‡¥2ßëMÇØéÓơèÅ«Ô÷Ù¿‰̃ˆÁĂ˜‰j̃ZîSÏÔăˆŸ;çØ¨¼Ó¾ÎÅ™‡ăˆŸ߈ƒvÎūԻ½±»™‰kß [ïSáöđÔëöëö—»ÏÅïºïºñÓ±»ƒˆëö°¿ÁƯö¥ÆϼÏÔáƠÙƠØäô Á׆ŒºÁĂù×ç̉ÛÇÊÇ;°½̃ˆéº˾¡ÁơÄ£ØÛºóÇÙqƒvŒ¾£ơƠëÿ¯¶ÓÛ«‚ ½9ÍĂÙ·ÂôÛ׋dz+ëöö‹Ü«Ó£Æ ³¹«»ׯ¶̣ÓºÏ̉ƒv±»“¹ƯNĂăà›¾ĂÙµØöÁ×$ÿ¯¶ƒv·‡‘×8çûÓù×ĂóăñÚÙŒë*«±»ÿ‡­Öñ×̀ÓÅô—¶çØ߈9¥‡ÇÖ9¥‡ÏǺv•À̉ׯ÷ÁÏÅ¡Á›¾øê&¿»½£Ç“Èÿ¯¶ëØÏÔ­Ö́v‹ÜÄØƒv9¥‡×¼È߈ƒ½Ù½óÔ³Âù×™‰kß [ïSŒ¼‡øóÅ“Ơ£ØívÁ¾ÏÔ™ô¡ÛL½Ç»ÎÔ±»ŒƠ½ÁĂßÖÏÔ±»°½ă½ĂÈåÁÏÄ¿»ù×ÏŶ±±é½€ñÆƯÓ ÑÓÁêöỂÏÅ‚vÏ ±âéÓóö¿‰ Û¡ÔßÁª‡’̀jđÓÙ-ÁƯÛ«‚ ½9‰­½Ô߈±»ïºÑÓ±»çÚé£÷´øêë¼Û«‚ ½9«‡“ÍjƠXơÔÖÚù¾߈™ôコ9¥‡­Ô§ô÷êéºăˆŸ߈ơÔ¯¾9¥‡ưÀ±»ÑÓ¹Ú«Ôª‡’̀jƯÓ º¼ÀĂ­Ö‡»÷ÚµØù×ォ‡“Íj±»«‡“Íjщ§ôơê9¥‡±»ûØÏëö‚×Û×ăˆŸ;¡Ô­ÄÅôÛ׉ÔĂÙ½¡ÁñÚ½€Ở«dÿÚùêĂÙ‡ºù×÷Ú•ÜÚª‚ +¼9ĂôăˆŸ;•DZ»±»ªÛ߈ĂĐØÏÔ«Ñ¿‰©‡¥2ßëM¿€Úª‚ +¼9ÉçÚ±»Ư¬¾Û×óĂ®Ó̀Ê)èÛ8¤‡ºÅÙËÉ9ƒ×•Œ™Ó™‰kß [ïSƒvÛףܿÅßÁưÀéê±̉óǵØ߈¹Ú™‡̃ˆëöóÇôÛº›¾ơÔ¡ÔµØăˆŸ‘ÆÏÔù×ׯÑÓ™Á­ô—¶ù晉kß [ïS½°»«‡“Íjٽٽ‡ŒÙÚà·Âù×µØßÁÓÆ½”Ö‹Çר½¹à©‡¥2ßëM—¾˜êèäï³2ÑØ9¥‡ÏÅëöÿÚíÖ«·3uUÿÛ‘ÆÅĂ÷‡ĂÙ©ÓéØÅØÏÅĂÙ›¡¤‹¹ÚÍ́±»»́±»ËÓù×¹ö×̉‹ô½ר߈ù×¾¹߈éǷ‡‘×8çµØ—¶߈½Ơ»G˜ ê è ä ÏÅívÛ××̉ïiăˆŸ߈Ù½ÑÄë›°ÑÓ÷‡¶‡Ö8æƠµÛ­Äù×g¶¼̀7¡Û™‰kß [ïSăˆŸ;ÿÚÍå¯×é‡ưÀôÀ½¢ä₫§¹ÚÏÔÛºƠËÉ9ÿ¯¶«‡“Íjÿ¯¶ñÚƒv¹ÚËÖ·‡‘×8ç“ÛƠXÛ§ÔưẠ̀Ă £»±»‰¿I¹¾»ñÓØëöÈ—¶±»߈½ĂÙÜÙ½ù×߈©‡¥2ßëMÅÔÑØÇÖ—¶ÑóÏÅ«‡“Íj™ơêöï½ÿ¯¶̀2¬H2щüÓ˜‡­R§ÔÁƯË¿ÿ×ïÚ¾™‰kß [ïSçô¿‰ăˆŸ;µØ½߈ÙŒë*«—¶ƒvửñ‡ăˆŸ;ƒv±»º½ÈÙÅë—»“Ǫڱ”­ºó‹ًÈ÷‡µaÍĂ‚vˆ¡Èívш¹ÚÏšȉ¿IăˆŸù×ñ‡îƠëöÙ½ăˆŸå̉ ̣ǂևºÅËÖưÀơèÅÉ̉“ÆăˆŸƯÓ ø×«‡“ÍjÇĂù·…•ÅôáêÁĂÅà̃ˆÏÔªÓ·ô™ôù×Ë̉ׯÍË)éÛ9¥çÚÏ̉§Ó§ô»ÁÍÇñÏÔđÆĂ™ÉÉ̉ؽÑÄ멇¥2ßëMÅÓÇÖ°»Ó̉…¾ăàç'ÏÔơÄ‹Üù棙Á‡Ç®×™Á«ÔÇ÷ºơêù×÷Á­Ø‹È²”¨º +íÆÉÛ¹Ú™‡Ù½½ù¾‡Œ̃ˆăˆŸ;kĂÎ’÷–ÓŸ}“ +¹ÚÙ×̀Ê)èÛ8¤éÓ‰ÛûÖñÆ½ÅØăˆŸóÇÏ̉‰Çù×ơê±»™‰kß [ïS©¼›¾«‡“Íj‰¿I¨¼ Ñö‡Ö8æµØ¼€ƒåĂ•½½ñÓÑ·9¥‡×Ç%ív÷¶›¾ÁĂôêÛשÓÏİ¿Á½™‡³Ô߈ÇÓÇØ߈½ô™ëéå·Å÷ÚçØ¾ñ™ëéåÜ߈ÚŜؗÖÓ̃—¶±̉ăˆŸ;ß»û9¥‡ù£™‰kß [ïSÆϹÏÅăÇíÏÅØÚ÷ÚŬ߈’¹ÜNÇ·̣£X Û©ƠƠĂÙ™à™‰kß [ïSƠù뙉kß [ïSÍË)éÛ9¥Ù½ͽÏÔºÏÅéÓщÑØ÷‡÷ÀŽă­̉º“ºß»û§Ô¡ÁơÔ§Ô߈÷‡°»Ù×ÎÔĂèù‡ư%8¤‡×å̉ «‡“ÍjŸ¡È¯ÈñÖº©Ó­ÄĂ#÷Ù߈жϼưÀưÀ™‰kß [ïSÍË)éÛ9¥­¿Ù½Ó¾¹Ú¶  רăˆŸ;k«‡“ÍjÀ¼ÅÔ߈½¾‡±½ëÚÛÀĂù×£X$ÅØÆ•Èû›ñÖăÁƒv̀Ê)èÛ8¤½Ô±Ô×$«‡“ÍjƒvçºáÓ×ÜăˆŸÑÓÛÄÓ¿½ƒv¿߈ÇÖơê· ÷ÁÙÓư§‡9¥‡ÈĂßÄÙí½¨¼ĐÓ÷Á“ȱ»½Æ¥%Â߈¥Ó¥ØívàŽÿ.…ÖÇÖ™Á“¹ƯNĂÙäôÍBÍ­HÔX̣ÛÇ«‡“Íj™‰kß [ïS÷Áëöï½™Ô“ƠăˆŸƒv®ÔµØÖƹڙ‰kß [ïSÔôûÙóĂ½ÔµØ‹Ç߈ơêß„¸Úç'ÍĂÇí—Góīуˆ¾çÚÅÔÛê‹Çëö½€“Û‹Ü™‰kß [ïSơê¾ăÁß»û¡ÁÏÔ¡Û÷ÚÙÅëÑØăˆŸÏÅçÚ‘%÷ÁĂÙ÷‡₫Ï̉̃ˆĂÙ*ĂÙ³zăˆŸ±»ù׉y¨À™‰kß [ïSÓÛ«‚ ½9ÍÓººƠ«‡“Íj•¾å׫‡“ÍjăÁ«‡“ÍjăˆŸ;k§ÆÅÔ½çÚ…Ø­Ô•%ăˆŸ;ñÓ™‰kß [ïS½­Ä•ŒƒvÛÄÓ÷ˆ߈½€±»ÚÄ̉³ÈïŰơºÁÁĂ·Ôƒµÿ¯¶Û«‚ ½9ëù×ÙÚăà·Ø©Ü½Û«‚ ½9ÙŒë*«߈ơÔưÀ½ë·›́Æ»ÅÏÅÏÅÎ߈Úª‚ +¼9ÙÚív©¼ơÔ™‡«‡“Íj×Ơ£Ø±»ÏÔûØ߈‡“£ä¯¼£äô»ÛÿÁù×ßÁÿ¯¶·‡‘×8çÛ«‚ ½9›¹çôØùןֽ߈¹Ôù×ö°½ëöÙŒë*««Ô™‰kß [ïS¾°»¹ÚơÔ­ÄƠ›¾¢ÇÂÙÚà–ÅØăˆŸ;»½±»ÙÜí$ó¶÷ÁÁƯ™‰kß [ïS±½ë×ơꙉkß [ïSù×¹Úă”ª'™‡ÏÁ¹ưÀµ½Ăâ‡Ç­ÄËÖÁĂ‹Ç§Ó³°Áíê¥ÆĂÙ¹ÚϺ̉Áñ,8¤‡×ÛÅ«‡“ÍjơêƒÖûÓ½Ưº£‡…Û÷Ú±»ª‡’̀j¹̃³ùט‡ ¯È¢È›¾÷ˆ…ÖñÓëáƯ‚¾¸£Sɶ½ăƒØ—¶ÓƆڿ‰›·ÔÙ׫âưÀă¼Ă¹Ú¾ùô‘Ô² ƯÓ °»»ôƒà›¾̃ŒÚ,ÑĂÈÏ̉ñÚµ…ôÏÅ©ÇËÓÍË)éÛ9¥Û«‚ ½9PÏÔíÆơê¹Úù×ăˆŸí«»ÏÔƠ¾GßƯöÁÛ«‚ ½9¢äÛ«‚ ½9›¾ Áå̉ ±»ÆÏÔs½±½¡ÈëöÛ«‚ ½9óÓç̉߈Ù×Û«‚ ½9é‡ÙŒë*«³ÅÓíÆ¾öỊ̈ƯÛ™‰kß [ïSÛ«‚ ½9Ñ+ĂĂÉ̉°»¯¢Ç¶¼ËÔĂÈ9¥‡ÏÔµÏñӣ䱻ơÔïƠùןÖg¡ÔÛÀ§Ø̃½߈“ƠƒvÑÓ·‡‘×8çăˆŸ;Ó̉Ù½™‰kß [ïS«‡“Íjß»û™‰kß [ïS÷Ú½ Ëû³Â¢Ç˜‡¦¹“÷¯Ơ«‡“Íj°»ÏÅ›¶éăˆŸ;Ù%麠Ơ¡Ơ™Ó²Â Ûù×Ûº‡Œçôó%±»¡ÈÙœ‰¾Iô™³ƒˆÏÔÛ«‚ ½9ÎÔª‡’̀jÑÄëơºăˆŸÅęԫ‡“Íjâ½ă»ăˆŸÚª‚ +¼9ƒ€˜‰j̃ZîSéêÛ«‚ ½9û(ÁƯçÚëöëö¡ÔŸÖêÓ‘ûá ¼€öưÀ°»±»ÖăˆŸ§Ó—Đö½†öÓŽ×Ơ©Çï½%½ëöĂÖß»û¥Ö¥ˆ]1½½°½ăˆŸ·‡‘×8罡ȱ»«‡“Íj‹™Ó¢ Î̉Û׳¹Ø¡Á߈‚(û̉³È‹Ç¹Ú½óÂËl½Ôơ¿́ËÓ•Œ…Ô…»ơÔï½÷ÁÁù×ÅÓÏÅÁÓµ˱¡È•£ƠÀ½¿â¡Ơ¿(ÏÔ±»½à¬•Œö¡Ûù×¹Ú°»…öÀƯ©º«Ô‚Ø¿‰ơÔƒv¥Ø½ôăˆŸ;ơ°›¾™‰kß [ïSǼ¾ºñÓÍrïßùë¥ßçÚÏŧԵ‰Ùœù×±»ûĂÛ×ív±»ëöëöÑÓ¡»¥ˆ]1‡ñƱ»û̉“Çù×Ù½¡ÏÅ«»ÛÔ™‰kß [ïS°»ÓÙÅëÅÜ¿À°»µØ•Œ™‰kß [ïS—¶ĂÙ…Ô©ØĂٓȳ«‡“Íj߈ô߈ôñ»Óà“ȉ¿IÙ½™‡£»ÓØß»û«·3uUĂóÄ»½ÏÔ‡xƒˆ¥ÁéÓ”ö8¤‡á󵨡Ơ߈§Ô¬ÖéÚ¹ÚÅØë“…»±»“¹ÜNÛ«‚ ½9¡ÛƠĤˆ\0«‡“Íj±»ù׃v¶‡Ö8æ«·3uU‹ÇưÀ‚v±¿Û«‚ ½9±»÷Ú™‰kß [ïS—ă匿Nׯ¡È©¼³(äôÆĂÁ̉ÿ¯¶Û«‚ ½9°» ßÁ±»· ăꔌÏ̉Ă$ñÓÛ«‚ ½9ùêÏÔÛ׫‡“ÍjÀÅªĐ—ÛéôÛ«‚ ½9„öÏԵؙ‰kß [ïSåוî®Â¨¼ÏÔ•ÿăˆŸ;ƠÏÔÏÔׯùêÙ½çô«‡“Íj߈Û«‚ ½9߈»ØÑÓͼ¯¾ăˆŸï³2ºÿ¯¶¿ÅÂÙÖ¾8¹Ú‡9áêåĂøu…Ô߈ÄØÁƯº¼ »™Ô±»‡º·Åíơ·Ø»Àù‡9¥‡Û«‚ ½9§Ô߈‡“˜‰j̃ZîS§ØÓ²±%™‰kß [ïS߈щ°»߈ÅàöÓÛ«‚ ½9ÏÔÑÄëÏÔ!§ºơê߈ùơö÷ÁăơØ×‡º¨ƠÍB±ëØù׭ؘ‰ j ̃    Z îS ù×ÁĂ½€g‹È0œ¿èÓư×…ÜßÄÙ½€ÍBæØƠ¼ˆĂ±»·Ó ¥0Ï̉ÅÄƠX…»ăàÙÅëơệ ½€ơêÔX +ÙÚá ÍÄÁ‡é/×:åÁ™‰kß [ïSÀƯ÷ˆđ»¾Ơ™ƠóÇ«‡“Íj³Ó™ëéåÏ̉Û«‚ ½9‡ñ Á±»Ú¼Øï½¿¹ÁƯ߈Ù̉ơêï³2ÿ¯¶ù×Ở›¾ÑÄëëöǵÊû½€ĂĂèêµØ×¼ƒ9ù×́½êö‡CÏÔ¯ÈÙ¾ûƠù×ÏÄ@¹ÚùêơèŇDžÏÄ߈°¿ơêÙ½Äôă‘·Û«‚ ½9ïºÁ×™̣ïôY½€‹Ü¹Ú½ƯÓ ½Û×8 ¤‡ Ö½£Ç°¿±ăˆŸ;·‡‘×8çưÀ߈÷ÁđØ½±º¡Áµ‰ÇÓÙ½¹Úè‡âơ߈§½́ơ÷$ɇµØç̉å̉ †Œ½Û«‚ ½9÷¶ÇÖơê™Û½÷ÙưÙ麙‰kß [ïS¿̃ˆ‡ôƒvÁ̉ĂÓºͪéÓ¯ ‰¿IĂƠı»¬Ä»ư’©¼‹É0ăÇí«·3uU釛ÚÇØ½Ñ¾ÿÚÁ¹¡Û¹}Á½ĂÙ±»…Ơï½ỞÈĂ߈Ë¿ÅÇØ¡«Ô»Ó£ƯÛ«‚ ½9›µØ±¿—¾ƒˆ¹ÚÛ«‚ ½9ưÀŸØܺƒˆÅwÛ«‚ ½9ñÓר¹Ú½¬¾Ë̉©¼ÅÓ•ŒŸÂ£Ô…ÁۭĽưÀ½à¡º³ºóĂÙ™‰kß [ïS™‰kß [ïSÀ‡€è/Ö:“ÛØ×ÏÅø×ƒˆĂăˆŸ;k¿˜‰j̃ZîS¹ÚÍÓ߈¾ù×Ǻ—º¯‰¯0±»ăˆŸ;¯›v®Gø¹Èù×œĂ›ÚăˆŸ¡ÔÏ Ïű»“Ơ½Ü™‰kß [ïSÙ×ù׃v©‡¥2ßëMëö§Àçôÿ¯¶—¶§ÓùןÅĂĂ ›­±àéMîÅùơÛ«‚ ½9ăˆŸ¯ÈÛ½Úª‚ +¼9ƒvù׽NjǗ½ÑĂÁÛ«‡“ÍjÏÅ¢XÛ«‚ ½9Ï̉Û«‚ ½9ÏԤؓ¹ƯN½߈ׯø×­Ä߈ù×å̉ ɇ°ÏÅëöÙ½«‡“ÍjÙ½ÑÓ8 ¤‡ ÖƠ™‰kß [ïSÛ«‚ ½9ÛÔ±»•ÑÄëÓØÙŒë*«™ơ‰¿IĐÓ’¡ơê½±¿¾(ơê±»«‡“ÍjщÇ̉¡ÁÏÔơĂơÅ€ºƯºưØù꫇“Íj¾ØÛ«‚ ½9‰¿Iÿ¯¶G½¹߈Û×̃ Î ñÓ½ËƠ…»«Ô™‰kß [ïSëö«‡“Íjµ÷ÁĂÛ«‚ ½9ËƠ™‰kß [ïS½¡öï³2Ă߈‡Ú©¼½½…ÏÔíÆăÇíó£ÈÇĂÁƯ½ËÇùêĂºÏ̉Ù±»‚vĂ¯Ù½ăÇí·‡‘×8绽¯¾ùêívÙÁ—¶±»ß„®×æÚ÷$§Æ߈ùà™‰kß [ïS©‡¥2ßëMÑ+±¿•½ăÁ¯G‹øÙ×ù×ơêăà8¤‡%Ïåù×ëƠUÏ̉˜‡Í¡Ô÷Á™ÓĂ١ԣ䫇“Íj«Ú½€Ù½•Œ¿ôª¶2tTÉúÍĂ«‡“Íj…ÛưÀó¶Û«‚ ½9Û«‚ ½9ơçÓº½ß²ăˆŸ;ăˆŸ;¦ôù×̀ÓƠÏ̉ÁƯÏÔ¿́÷‡ÿ¯¶ÙÚµØƠ9¥‡³ØæÚ¤ÆÍË)éÛ9¥ÑÄëéûÓù×·̃™‡é‰ñ5ñ·ÚÆü̉ăˆŸëö·ÜÛÍË)éÛ9¥ù×±)ƒv‰í߈ùê±»ûÓ™‰kß [ïS…ùÙ½™ëéå…Œ¬ºÅÔ«·3uUÑĂĂĂ ›­±àéMăà«Ô™‰kß [ïS¶…ÚÛ××Ú̉Óƒˆ±»ƒvï¶©¼ß»û¡Û¯Ô”½ùêï½Û™î»¡È«·3uUĂÙ‰¿IÎ̉ÏÅÙĂĂ‹ÇÛ«‚ ½9Ü«Ô×¾…½¿–ƶ¾ß÷å5ÓÍË)éÛ9¥Îơ‰ÛÔơźæ̉™‰kß [ïSµa“Ơëö³ùדÈÏÔ¥Óª‡’̀j߈„Ø÷ÙôµØåŒ¿NÙÚµ†¥ÅÏ̉̃Ú’¹ÜN—¶ËÉ9ϼ½çÜÛÆ±»«‡“Íj™ô—»߈Û×ëÓ‹ÎׯßÑÄë±»Ç̉ψẩ߈¿ô“ëö÷ÁÛºÿ¼½€ÍÄ¿»ÙĂÙ»ƒvăˆŸ™ÔơơăˆŸ«ÔùæçÚ¹Ú©ÇÛ«‚ ½9ư¹«ăˆŸưÀ¾ÊÓù×ÿ×ïô±»Å–Ö¾8®ÈŸ}ßÄÙ±»ÍÄú̉Å»Åù×ù×­½¼ù¼²Æ™çÚƒˆƯ‰ƠÙÚÙÚïô¯È߈ƒ«»Û«‚ ½9ÅØ÷Úù×Û«‚ ½9ÆêöØŒê*ª¶èÙ×߈Ù׋Üî½Ơ¼Ă™‰kß [ïSù×ùוŒïi©çºÁ×ëöư““Èăà¹ÚÁÚ¾ù×éÓÏÅëö¹ÚåĂ߈ö߈±»Á¹ưÀ™‰kß [ïSéê·º©Ø9¥‡ùת¶2tTͼ•½âàù×±»±»£Ö«Ñ½‡ŒÑÓ·¤ ƠơÅø×ƒvµĂá¬Ûת¼ ¢äƒˆºψù×߈é‰ñ5ñ·¶q§ôÏÔµØĂÙ߈Û«‚ ½9ï³2ëöăˆŸ;¹ÈÍÄ»«ÚÛ«‚ ½9߈đÔ¦ô¶Ô±¿ûØ€ƠÏÔǼÿ¯¶™‡›¾—»ø×ßÄÙ¼çÚÛדÆßÄÙëö›¶é‡x…ÔÏŹڣǽÙ̉¥â¶Á‡é/×:̃ˆÛºö—¶ăˆŸ;k‹½Û«‚ ½9ăê%‰¿I·‡‘×8竇“Íj±»ÛÙÚ“Ơ¡GÅӃɟ±»Û«‚ ½9¡ÈñíÈÏÅËÇßÁ퇫ӥˆ]1ăˆŸ™Á×ƠëÓ›¶éÓºĂ¹Û«‚ ½9¹ÚÏ ¯¾Ù̉±»ï¯©¼ù ¡Ô¡Ûă»Úª‚ +¼9±»ˆ±»ÔXˆ©¼ăˆŸ;»ÅƒvưÀ«d±́÷‡˜‰j̃ZîSỞ±»½€ơăˆŸ;k߈·‡‘×8çăˆŸ;«dÔóÇơÄá=µØ¥ˆ]1߈·‡‘×8篼ÁÜ£Ô¢ƠßƯĐÄêä̉ÓÛºëÓ§·™‰kß [ïSù×¾ŽùÙ·‡‘×8çÓÅüáêËÉ9°Á·Ôÿ×›ÚÁ¼ÙÚ•‹g¥ÜƠ©¾ó‹ƒ×‡ÇăˆŸ;k«‡“ÍjëÚù×¹ÁÛº¯G‹ø“˜Úª‚ +¼9‡¿ă»ưˆơԵػÁ¿½“È÷ÁíÆăàùê¥ÀÏű¿µØ½ë˜àăˆŸ;‡́ëÔÙ׃ÄàƠăˆŸ;ĂÙăˆŸ;º»½ÙÚÑÓô¶éÓ«»ÙÚ«‡“Íj¼Ù½ù¿ăê½çƯÚ½«Ôʹ³È½™‰kß [ïS«‡“Íjû(ăˆŸ; Û«‚ ½9©ÇăˆŸ;˜êèä½ÔƠ’9¥‡Û×ó1£äù×óÂàÛ¿àÏÅ­ºÑÓµ‰Ôå‰ׯ«·3uUù×™‰kß [ïS¹Ú‡×ÏÔ¸ÁăˆŸ;Ù½û̉ÖÆĂĂùêô½Ôå̉ ¯È©Ó›¾£äêöÁíÛÄÓưÀëö÷‡éJé‰Ó5“gesÁÅƠù×­ÄÑóͺâˆ;½±»å»߈ëÓơÔÑÓ߈ơÔ½ûƠ—¶‡Ç™‰kß [ïS™‰kß [ïS߈/Ư‰ÛºÛ«‚ ½9å×ơĂ™‰kß [ïS½Èù×¹Ú½Û«‚ ½9Ơ—“ƠưÀ³ËÇ›¹ÈÁĂ½ËƠĂơÔÁƯÁ½­ÔÙ½ׯ߈ăˆŸ;ÓẠ̊Ç™‡™‰kß [ïSÁƯ‰̉¹å̉ ¿(™‰kß [ïS“Ç«ÔÛ×£Øù¿ëö£@³ºó«‡“Íj›v‡\âˆ:½á¡ÔöæÚơ¿ß9¥‡̃ˆ·ÅÛ«‚ ½9Û«‚ ½9·‡‘×8绽“Û“Ơ‹¿Ơ߈°¿›‡¶›è›Û«‚ ½9™Á±»©ºˆ™‰kß [ïS†Ú,¿$Ó±ÔóÂĂÙ¡ÈßÁù׳¼™‰kß [ïS©¼ÿÚµÀ₫ÑÄëÉÏ»Ăªdź÷Áâ¼¼ÏÔù×9¥‡×¬€‡̉›Ô°» •%÷ß÷Ú‡º́v±»™‰kß [ïSêöó¹ګ‡“ÍjÓ̉̀ÓéºùêµØëö9¥‡¡ÔÍû«‡“Íj«ñûÙ“ƠÔ—¶ơ\«‡“ÍjóÓĂƠ‡““ÆÛ«‚ ½9Û×ơêÔ•9¥‡±»ă_Ѻ{ù×ơ»ÑÓ£èÓÅưÀëöăˆŸ;ÁÏÅ›¾ÛºŸÈœÜï½Û«‚ ½9ËÉ9ÓÆ™ơëöù×·ÜÏÔ¥ºơê«Ü߈ø×‘Ưœ·̉ ¤0Ù½¶Ø ¹Ú‹ÇœÜá=8 ¤‡ ÖƯÓ ̃ˆăđ» ù¿±»¹Ú¾º¿|‹ÜÛÀ±»«‡“ÍjăˆŸ;±»ÏÔ³¹½ÏÔ±»ÛÀ¹Ú¹àÓ̉‘ơù×á̉öÁ‡ŒÀËåÙYµa™‰kß [ïS³zûÓ™‰kß [ïS¨ÇYăˆŸ;©À…Ơ£ØÛ«‚ ½9•Œ‡ŒÍÄÙŒë*«ñÁÛÄỌ́¶ë3ñ͓ζooĂºµa麳Ÿ}‡ä¼ô‡Çơ+Ă¼ƒÙ½›½Û«‚ ½9¼Øöô¹Ú›¾ư‡±ù1ËÇÆØï½߈˜êè䑾‹”™‰kß [ïSĂÖÛ«‚ ½9×Ơ±»ÏÔ—ˆ½ÑÓăˆŸ³ÛÏ̉ù$Ưåñ¥‰ÍL…ëö­ØéôẨÖ ÏÔñÖ¡ÇỞ±»ù×¥ˆ]1ỡ‡¡ÔϺ±»ÿ×µ®‡ÇÏÅåĂñÚ×¾¡ÁÀƯƒˆ±”Û«‚ ½9ơĂ·‡‘×8çÏÔù×¹¼ơÔ«‡“ÍjÛ«‚ ½9퇯ßÏÅÇ™¿»°»°»Ù×±»ƒvăêÙ½¼€½º«äÿ†·‡‘×8çÚǃˆÚª‚ +¼99¥‡«‡“ÍjÄ·‡‘×8çƯÓ ßÚ³àËæר€\”ơê—¶‹ÇăˆŸ;ĐÄêÏʼnø­=—Œ¨¼‹ÙµØ¥¾Û«‚ ½9É̉¦éÁÙ¹Úå̉ ±¿³Ç•ÅÔ߈ß»û›¾ï½ËཷŔ!™‰kß [ïSăÁăêµØÏÄå̉ °&ÏÔ–ÓÙŒë*«Û«‚ ½9ùׇÛÄÓơêóĂưÀ¿ÑĂù×ÏÔơê·È—nô±¿߈×Ơ†7§j¡Û½‰yăˆŸ;ăˆŸó“ÏÔëöÚª‚ +¼9™‰kß [ïSÁĂÛ«‚ ½9±»ªÚ ߈½·ÔóƒæØƒôĂßÄÙăˆŸ½Ô9¥‡¡È‚ØÀ‡€è/Ö:—»¡ÁʹÙŒë*«߈ĂƠĂÙÏÅŰ¿·#ù׃½ë׺áê“ÆăˆŸ;¡ÿ¯¶÷ÁóÔ±»ƒ¾‘¯ÈÏÏ·Èù×÷ÚƒùסÛăˆŸ;k«‡“Íj›¾߈“‰3Ơ,ùËÉ9—Ó™Ô£ÇĂÈöÓëöƒÖ×¾™ÇÖ½Î̉ß„ăˆŸÁ‡é/×:Û«‚ ½9ÏÅă½Á«‡“Íj™‰kß [ïSä̉‡ºù¿·ÔÆØ ùêívÛ׿Ø5½ăơßÚ¶ÅáÓïÚĂº±¿Û«‚ ½9˜Á‡ºƒˆ£Ø•½öµƠÏůÈâ ­̃Ö˜‰j̃ZîS½ÏÅËÚù×¾ß·Ó ¥0–ˆ™×ËÖçôÆơê¿ô›¾•‹½¨Ó§Ôøê¹Á¹Ú«‡“ÍjÛ«‚ ½9›¡ƯÓ Üºµ†«ÚỔ¿‰ÏÅăˆŸ;³Èù×ñÓưÀăà°»ÏÔçô“Ơ·vơê÷ÚăˆŸ;‚vÅØ¶̉Å8¤‡×åÁͽùêó#߈ƯÜäô ­ÈÏÔ—¶Ư‰ñÚ…»Û«‚ ½9ëö«Ôù×Ù½ºưÁÙ½ƯÓ ­ÄÏÚ®¼…ÖÓư“êơP±»ÀöÔ#¥Â½Ă«‡“ÍjÏ̉ø«ÔƯÑÓG½¹Ë1ơê„&ñ‡•{áƠ«d9¥‡×ÏÅƯÓ ߈µØéơ‹ÇíØĂ±ëØĂĂÇÍÓ›¶é•Œ™‰kß [ïSƒvÛ«‚ ½9шơ»ơꙉkß [ïSÙÚùדȹ®ÏÅ·‡‘×8盾ÙÚÁ䌾NßÚ8¤‡£ä߈•Œ†ŒÍË)éÛ9¥ăˆŸ;•‹H‡aí꫇“Íj‹½ÏÅưÀñÚù×á=¬¶±»ÍǡԫԪôôêÑØ¯×‹Ç¡ăˆŸ;Ó¦Ϲ©‡¥2ßëM»È•Óé‡ëö¾¾º©‡¥2ßëMŒÅ̉ÆĂÙĂä¯×á …ÛơꉿIÉĂ¯ÎǺ·£ơĂ¹•ơê÷Á÷Á»Ù“Ơ«ÔʼnôĂëöưÀ©‡¥2ßëM·Ó ¥0ƒvé…ßϹڷÔÏÔơ™‰kß [ïS·ÔĂƠÿÚ̉½Ïċș‰kß [ïS¾­ÄçÚỞƒˆÏÔăÇíù×ù×ÙÚôê˜êèäÏÅ’ÔM̃ˆ±¨Ơ ËƠëöĂÈ“ºÙ½É±ô߈ùץǓۘ‰j̃ZîSăˆŸ;kÿÚ¡ƯÙ½“¼öÛ«‚ ½9çƠéÓăˆŸ;¿ô߈ăˆŸ·Å›¾Ơ±»Çص†ÜÀƯĐù꫇“ÍjÇÅù×߈¹Úëß™‰kß [ïSƒv½ƒv¥ˆ]1ÓØÜœ‰¾Iă»Û«‚ ½9ûÁë̃©Ó€ëÛ«‚ ½9¿ØÛ«‚ ½9ß»ûưÀÏÅƠ%9¥‡߈µê«»°»Û×ÏÔÛ׬ij“Û¨" Ëû“ÛÛºĂ¼ªÔÊÈ9éàÍÓ°»̃Îäô×ƠÅÇĂÍ™‡’ÅưÀ£ØǺÆØ“Æ߈—»°»áêăˆŸ;kÛøÓÔ½ô÷ÚĂȹÚÙÚĂÖ›¾Û×çÚÇ̉™‡©&«Ô³ºóơèÅÖÆÛ«‚ ½9Ó̉½¼̃»ú¿‰ư-ĂĂ¿Ǻ–G½€·Ô׿Æ߈“È·‡‘×8籽Ă+ Û«‚ ½9ù¯­ÔµØ×Ó“ƠÛ׫ÑÍY³"Úª‚ +¼9Å–ÏÅܫԑƱ»á¬¾ưÀó#ƠÙÚĂÙ›¾ÿ&öÅñÚÇØˆ‹Ù­Äù×ÓÜÏÔÇĂØ×§‡ÁĂç»Åئô·Ó ¥0ĂÙÿ¯¶ơêÏÔ8¤‡Ö8¤‡ăơø×¥ˆ]1«Ô߈Ơ¾Gƒ×רà ߈̃Ûƒvª‡’̀jµÏ›¶é³÷ÁăàĐÄ ê ăˆŸëö™‰kß [ïSù×ñÖ¹ĐĂÎëö˜‰j̃ZîSơÔÏÔăˆŸ;ơÔ›Ú¯ÓÙ«‡“Íj‹ÓÏÄ9¥‡˹Ăă꡼Á‡é/×:ăˆŸÛ«‚ ½9«ÔÅÓÑÄë·ÔƠ·×Ươ‡ÓºÏÅơÔÓ¼ưÀÓ³¹ûƠ¶•Üç̉ºéØ®×ëöºö‡“§Æ™‰kß [ïSÛ«‚ ½9Á™Áù×ëöÏÔƒ×·Ó ¥0ù×¥ƯƠ Êû9¥‡·‡‘×8çĂÙÜăˆŸ̀¾¬H¾÷Áª‡’̀jßÁÙÚƒÖÓÓ߈ÏÔƯÓ ½ß»ûÓÁÏÔÏÅ©¼ă߈£‡üØù¿±»½™ÛÏÅ“Æ9¥‡ǺưˆåßơêÉĂÅÓ¶«‡“ÍjÖÆ¡™‰kß [ïS·Ó ¥0§B¹ơÄÿÚ±¿ëµ†¹Ú¹î™‹å̃¹Ú߈©£ä8¤‡™‰kß [ïS±»ï½Ñ·ׯÓØÓ̉ÏÔï«“ÏÅăˆŸ·‡‘×8ç½ÔơĂëöÛº̃„å×ÅÁºØ..¯ÈÇÖÏăˆŸ;ÿ¯¶¡̀Ç·Ô§ô—Û«‚ ½9çÚăˆŸ;¹Ú±»Û«‚ ½9ÅÔ9¥‡×¿ºûử·Ô޾åĂăˆŸ;Ï̃Î̉»½™‰kß [ïSÑÄë½ÁÛ̀Ă«‡“Íj“Ơă½ëöÁ¼¿‰©ØƠƒvÙ½£Ç™ÓóÂ…ô¥ˆ]1ê$ ÑÓ«‡“Íjù×ƯÂ߈·Ü®¾½ñtÓÆ̀ÍƠ™Óêö߈¿ô÷ˆ¡ưÀï»—ÓëöĂÙ¿‰ù×ÙÚăˆŸµØß»ûĂÙ­Ö“Èç«ÔÎ̉™‰kß [ïS¨‡¤2€̃êL•äØŒê*ª¥ˆ]1¡È×Ơ™‰kß [ïSÙ̉É”«ÔƠœ·̉ ¤0ûØëö¿ßÍÓÙ‡Ï9…©¼å—»ơÔµÇûÇ•×Ơ™‰kß [ïS߈…»Óà­•·«‡“Íj¥Á÷¼›¾á±»ƠX©Ç—¶Ăºëö‹ÇÇ"ƒvëá«ÚÀĂ/Ởº±»Úª‚ +¼9Íļ€Ă›ù‡ëö›¶éăˆŸ;×¾ĂÈẲƒná¤áÓô·ÅÂĂÙ߈ÜÍBÅÓ«·3uU½¡ÈÿÚƒvÏÔ±”ø×ăà×ÛÖÆé‡ƯÓ ûÙơêµØơêù×½ăˆŸ;kĂÙ±̉ûىїӸÚßÄÙ±»«‡“ÍjÁĂ›¾çÚëöÖÔ†6¦j»‡̃ˆ™‰kß [ïSǼçÚ¼Ơ½ăˆŸ;·ÅăˆŸĂÙñÚ·‡‘×8ç­½¼ĂÙ9¥‡߈ƒv¿Ø—ÓÏ÷‡Ă…ÔËLJ׵Ø̀ Ê) èÛ 8 ¤   ù×ÁƯ±»ơꃽªĐ‚اԋǟֳ‚Ö›vͼôÛ«‚ ½9ßÄهװ»µØèºíêăˆŸ;ăˆŸ;±»°»«b±»ÁÜơ©À«ÑŸ»ăˆŸăˆŸ;·§D ĂĂ ›­±àéMÂƠ™‰kß [ïSƯÜù×Û«‚ ½9·Ô½ÑÔÓ5“gesÁÅưÀ¿çÀË% §ƠơÔƒv߈ÍÓưĂ›¾ơꓺù×§ù׵؛¶é™‰kß [ïSêöÆăº£Ç£Øàê±»À‡¦ÆÛÄÓÚÂÙĂÙÁ‡é/×:§Øç$ăˆŸ«‡“Íj©ÓßÄÙ™ÔÙ×ÿ¶Ż³Âù×ÙÚÛ«‚ ½9ψ¤ˆ\0†“ ÏÅăˆŸ;Û«‚ ½9©º±»ñÄăˆŸ;àˆÛÀ0ÛpÛ½Ô«Ô½€ÙÚù׿ŵØÛ×—ˆù×ù×…‡…ǯ&ÏÔÑÁ‡xºÀĂ¹Ú†ÛÚ¹©¼ù×½éJé‰Ó5“gesÁÅÛ«‚ ½9Óº™‰kß [ïS߈‹Ü©¼¿Ô±ëثԿ»¸Úͺܳ…ÇôÓØîÅÁÓ¦ô•Û™ëéåưÀĐØưÀÛ«‚ ½9ÉÜăàƒˆÙÚëö¹Ú°¿éߓƳëÔź¿ùêíÆơêƠ÷”ÇØ8¤‡×ÁĂĂÙÓØ­Äµa©‡¥2ßëMøơàñ́ÅÔϺ—ˆ¡Ô³ÏÔ¹à™‰kß [ïSÇÓ±»ơÔ«ñ½ÏÅͼ‘ÆÊÓÅØÓ¾‚Œø*ơê9¥‡ÙÚÍÓͽơèÅ­¾Ù½™‰kß [ïS£Ø·óÏÅ£»¹Ú™‰kß [ïSϺ«‡“ÍjÛÀưÀƒÚ×÷ˆ¹¶³zñÚöÁ—¶¸ÚœÂ¦Ơ­v½ÓØ·Ô¹»̉º›¾Û«‚ ½9‚¾ĐÅ«‡“Íjů¼ơÔÛ«‚ ½9«ÚäÁßÁơêß»ûË¿Êq»øê›Úï‡߈Ï̉Ñ·û™‰kß [ïSăˆŸ;….·Å½«‡“Íj½£»§Ø£é¹ÚơĂ›¹ÛÄÓÑÓÍÓÍË)éÛ9¥ôÙ½æºíÖ±½±»½™Óù׆Œ8¤‡×«Ó‰ÛÁ°»ơê¡Ô¿‰çó¤Ç"£X›¶éăˆŸ;k¯G‹ø‡»ˆĂƠ÷ˆÛ×±»Ù×߈Û«‚ ½9›ÛϺéºÇö™‰kß [ïS½oÑÄëÄØ¡p߈ăˆŸ;Û«‚ ½9ñÙÅÓÉºÅØă®±¿®é¿‰«Ô¾«‡“Íj߈×Óº¿́‹ÇÛ«‚ ½9™‰kß [ïSÙỬƽ€à “È£ƯÆØùêÁăóLJÇù×Óº™º™‰kß [ïSÖ™Ưª¶2tTơäÅÓŸÈÿ¯¶ùåïƠ™‰kß [ïS÷‡…£­áº‰Ûù×ßá³ÆŸÅÍÄăˆŸ°»Û×±½÷Ú«Û«»ăˆŸ/÷ÁÿÚ«‡“Íjμ Ù½¿‰ÁƯ9¥‡ÿ¯¶ö™‰kß [ïS½±º±»çÚ·‡‘×8çưÓùô¡hĂÙƯºßÁƒÖ¢äâÁ¹'Á¼å̉ ¹Úù×½wĂÙº°»ç²«‡“Íj¡Èăà× ½èµØ¢Ó“Èù×…ÖÎË̉₫ÔÎßÚÉ̉óÇ߈¡Û¯×ĂÈÓŃë£XüÀ̀Ó˜‰j̃ZîSÅôĂÙÁ¾ÂȽߡÓÁ¿‰h™‰kß [ïSĂ¼“ÏÅƠ¨‡¤2€̃êLÇuƒÚå"‰Û³å›ßä̉ƯÓ åœÜơÔ×Ơ†7§j߈éÓ߈™‡•Ó×¾ĂÈø×)щ¹ÚÛÖ$ưÀ‚v™ÔƒØ¾Á¾߈½ơèÅ©‡¥2ßëMívï»Ù׿Å̀¬H‡ŒăˆŸ™‡›¶é›¾±»ĂÓÍÄ߈ÓºÙÅë匿Nô»ØíÖ¡ÛÆ£Ø‹È±»ëÓ«»»Ăä¼™‰kß [ïSù׃v¥ˆ]1÷Ù¹ÚƒÔ߈«Ú­ÄÛ«‚ ½9µØ¦ŒăˆŸ;÷½±¿ƒv¸Ú‹ÇÚ×½çØù×Ù½Û«‚ ½9âàŸÈÿ¯¶“Ûù×ËÇÚª‚ +¼9×¾ĂÙ·ÔÿÛ‘ÖóÇ•Œ¹ÚỔ÷ÁửƒÖÏÔ›¾ü¦†ăˆŸ;…Ö‘à߈éêÁĂíű»±»9¥‡çÚêöÛÄÓù×·Åùê‡ñ5˜‰j̃ZîSƠXù×±»àêÙÚÿ‡™‰kß [ïSăàû§ô—¶̀Ó°»·ÔÓ‡±»¼Øäơ“ív·#è‡ÏÅÿÚÿ¼*½Änáê߈Ï̉ëöÅÁéß½¢Ơ Ơºm¦ô—ÓÜÉÜåÁË̉‚¹â߈™‰kß [ïSÏöÁË´ɇ"Ç9¥‡€Ơ–¾Ö؃Ọ̈Ô£Ó›¾щÅÓÏÅ÷Á·º‰ÛëÅûå¼ ÏÅÓÁ½€«‡“Íjº߈¿¹±»ô³£Ç³ùêÛÍ™ôÏÔơƠϹ«‡“Íj×Ơ†7§j…ŒÏ̉ßÄÙÛ«‚ ½9₫ÛÙ½‡xÛ«‚ ½9Ïá°»^›¶éι´ØÏ̉¶ÍÄăàÛ«‚ ½9ÿÚëö‘ÖÏÔ«Ôÿ¯¶¹ÚÛÄÓÍÄÓŹڶܵؓȡÛăˆŸÿÚÁµØơêŹÚª‚ +¼9÷‰Û«‚ ½9—ˆ¹ƠçăˆŸ;ó"™‰kß [ïSÄÔÛ«‚ ½9Û«‚ ½9ĂÙơềĂăˆŸ;¡Û±̃‡ºăÁÑÓù×ÑÄëåôÇ»ÑÓ½Ø÷ÁŸå×Ó¹Ú…»í—G™Ó9¥‡Û«‚ ½9—¶«‡“ÍjîƠ9¥‡ĂÙ’¹ÜNë™HÅÄöÙ½£ä³Œÿ§ưÀÏÅ¡½ÔÙÚÏÄÎÔ߈±»Ă٬ȉ±»«‡“Íjë$ƒv½áåöÙ½‰Æ₫®¶¡Á†º³Ø™‡Û«‚ ½9ÿ °»Ø߈°»±»ăˆŸÁç›¶éÇÖª‡’̀jóÂ׿8ֽǼ‡Œ¿Ư匿Nϼç½çÚÿ§½ëö‡ºÑÅÿÚ—¶êçß„‹¿·‡‘×8çÓÆÿô±»ë¼ÅØÛ«‚ ½9Ù×ÁÚ«‡“Íj›¾«‡“Íj½ăàơº±¿ïŒ߈ÇÖƒÚ›¾½…€­:Ặv‡ÚăˆŸÆĂ'¼ ³×ơèÅù×ÿÚ˜‡­ÔØ-ØÚÑÅÎ̉ƒv™‰kß [ïS¹Ú¾œÁ“ȇǪ»û%µØ‰¿I©‡¥2ßëMïƠ‚ÚÏÔκĂ—¶§ÓÅØ­Ôøơ¸ÚƒÖñÖÁ̉™‰kß [ïSĂº½·‡‘×8çưˆ߈«ÔÛ×Ă™Ô罩¼…ñµØ‡,ăˆŸÅØ±»ÇÄ‘…ØäÁÛ×óÇëØ »Æô‹ÓăÚ½Ô©Óù×±½­vívç'רÏÄù×âˆ;³b³b”Œöͽ†“ƒÔÁăˆŸ;±¿߈çÇÏÔ§Ư›¶éÁñÁ߈Ç»¹áêưÀƒÖ¶Ô߈¶ăˆŸù×Ù×̀ªƒv«‡“Íjù×Û«‚ ½9ơÔ©Ç¿™‰kß [ïS匿NµØ½©¼Áâ5Â3½ÙÚ™‰kß [ïS£äÚª‚ +¼9¿Ô‰³́¥—¼°»ơ‡%ƒÖíÖ«Ôº½ÔơÔăº“¹ƯNÁ óÂ÷‡Á½©‡¥2ßëMϹ¡ÔăˆŸ;°»ÏÅ¡ÛÏÔÅÔÁƯ™‰kß [ïS«·3uUíêÿ¼ÿ¯¶µ†ưÀ9¥‡‹Ç¯Ơƒv‡Çƒvºëöö½µaͽ¯È÷ÁơèÅßÛ°»ƒ½ơÄÉĂ¡È9¥‡‰²­Å›¾ƠÑÓ™‰kß [ïS‰±6½ÔóÇöƒàÛ«‚ ½9™ëéåÍÄ÷‘Ñø9¥‡×¿ºï½µØÅÄׯûÓ‘ÛÅØ߈́vƠƒv¯Èù׉¿I™‰kß [ïS½ôƠ‚½Ú°»ƯÓ —¶ĂÙó½ÆĂ±»‡º­v§æ¡Ô›¾ÑÄë¹¾ùש‡¥2ßëMƒv±»ïƠ¾Ơ¾GÛ«‚ ½9±»èڷś纙Ӈ¼ăˆŸ;ơÄÏ̉óǸڸÚ(߈‹Ç¬ÖMµ†·Ô¥½ăàµ.¥Ù¿ß÷ñ±¿ăˆŸÛ«‚ ½9ăˆŸ;ƠX£Ø»nÛ«‚ ½9ר×¾ƠXëö¼Èùׅǃ½̃Á°»Û«‚ ½9á ËÉ9ÇÖ¹Ú±»ù×ߌÛ,‹ÛÙŒë*«Û«‚ ½9ÙÚ°»€ºé‰ñ5ñ·ä̉øêáêßÁŸÅÏÔß»û—ˆÓØ«â†Ç±¿ûÙ¶è§ÓÛ«‚ ½9߈Æ̉ÓÆĂÎöçÚµØöÅÍß‚º̃ˆ°Ô +ù¾ÙĂ­ÖßÚŸ}óǭľ9¥‡±»‹Ù½ÔÛ×°êØÛ×ơêƒv¡Ô‚©ÓÄØăÁËÇ߈µƠñÓ±»½Ë̉¿ôăÁ±»¹Ú›¾çØØYØ×ƒùêơ®Û±»ÏÔźÅ¯–¡ÈÛ«‚ ½9߈…̃™‰kß [ïS«‡“Íj˜êèä«Ô߈óÓ߈Û«‚ ½9ëÚÏÅƠƠºmƠĂp˜‡0Ù½àÅÓÆăˆŸ;—´£»ù×ÚÀ™‰kß [ïSíÜ߈¡Ô÷Á·‡‘×8竇“ÍjĂ¯ÈƯº±»›¶éÛ«‚ ½9ƒv߈ëöéÓå̉ ‰Ç°»ƒˆíÓƒvưÀ±»ûƠ‹óó×ÅØϺ¶ÔĐˆ“ȧ¡Ø¯G‹øƠ¶èñÓ߈ƒÚưÀûơê÷‡ÄÔÎ̉›·Ô9¥‡ƠăàéÚöƯÓ íÆơê¹ÚÛ«‚ ½9¯ÅÛž‰ÅÔßÖ÷ˆù×­½¼‡ơĂ½¼ë±»áÛÂÙÅØ›¾ϼßÄÙ·‡‘×8çÁÛ‡Œ©¼å̉ ƒ¿ßơêÚª‚ +¼9ĂÙÖƒvÏÔøê߈§·³ÈƠ¾GĂô³!ù×™‰kß [ïSµÁăˆŸ;ƒv×¾ñÚù×÷ÁưÀÏÅ™‰kß [ïSÓØ߈çÚ¡Ó±ëØĂÙéê9¥‡öưÀï½щÄÓ™‰kß [ïSÛ»÷ơèÅ™‰kß [ïS»Å±‡¶è߈߈ỞÛ«‚ ½9‚ÖéºöăˆŸ;ÿ¯¶ö£ä÷å5ӯܩӳؖóë¼Ăè‰ƠÓ˜ÁÛ«‚ ½9¹Ú“ºí—G™‰kß [ïSÛ«‚ ½9ÍÄ«·3uUÛ«‚ ½9ºƠ¸¶‰Û»ÁĽ›‡‘ÖĂÙ̀ÓăˆŸ;áêƒvÚ¾ß<ñÁÓÆ›¶é™Ô÷‡Û×ĂÈÑÄë™Áßâà׼󆺫‡“Íj—¾³ƠÅØ‡Áå³ …ø±»ËÉ9¶è¥Â¯¾ÏÄ9¥‡×ÏĐÛê·‡‘×8çüÀ¹àᬙ‡ëöÆ÷Á¶Ø ËÔ÷¼¥ˆ]1íêîl®ƠóÁæÚ߈­ÄÏ̉À¹+ä̉˜‰j̃ZîŚÁÍË)éÛ9¥9¥‡Å­Ä–¾ ÍÓ׿8ÇÖơ꫇“Íj߈Ö¾8ËÇ̃»úÏůÈëØÎÅÏÅá¢ÍÄÂè×$…Ơë‡ǼÇáêÂñÚ•ÇÏÄó¶Ÿ}ăĂ3ÙÚ½˜ +ê +è +ä +±»ưÀ‡ÇăˆŸ;ÇÖÛ«‚ ½9ÏŇºñÚÛ«‚ ½9‡ùë´aÈù¿½Ô±»›¾ăÇíçô«ÚßÄÙ½Ûº» ½€ăï—Œ¿‰º½Û«‚ ½9ƒ×ù×ăơ°ÈÑÓăˆŸ;k×¾·‡‘×8çƒÙºÓ¼ÇØ‹Óù×Ù×½ÔÏÅ«‡“Íj½Ÿ}ù×ÏÔñÙËƠ«ÔƠóÄÍÇó¾ÿ¯¶­ÛÁƯ±»ơèŃv«‡“ÍjƠÛ«‚ ½9ÙÚĂÙ麡ƠßÄÙ9¥‡߈³½º™Û¦ØƒvĂÙ¿»·Å«Ô«dÅÔÛ«‚ ½9ùôµØ™‰kß [ïSµavùëçÚ·Ø©¼Ư‰ăˆŸ;å̉ ±¿÷‡ÏÔÑÓơê¢Ç™ëéå±»îÅëÔ߈ù×߈½ô›ƒ¶ÅăˆŸ©ØÙ½ûÏÔÿÚ߈á $±»߈áê—¶Ó¼•Èû›¯È‹Üƒv¡Ô×ùêψ±»½£X–¶ÍË)éÛ9¥µaܱ»·ÅâḈóÔÇÖ÷‡Ç÷ùêøêơºĂº¨Ç߈±ëؽ«ÔÂÛ«‚ ½9ơÔÏń؃vöƯÓ ™‰kß [ïS½ô­ÄÇØÙÚơÅרùÛÅÓ¹Ú¼é‡Û«‚ ½9¯ÈËƠ©Ç«·3uUÇÖ±»ß»û½ÙÅë«Ô‰ù×ÅÙ½˜‡ÿ¯¶ơׯщ߈£Ç•×ÙÚ̉Å +Ë̉ÈÖ£»ÏÔ纡ÈÛ«‚ ½9Ă“º‚v °»-ăˆŸ;ăˆŸ;Ơ»½ö“Ơ9¥‡ăˆŸ;ËÉ9¡ºưÀÓ̉«d—¾Ưåï»áØ·‹«‡“Íj¿ë±»ơê‰Û̀Ê)èÛ8¤™‰kß [ïS÷‡ÛºÓˆ•=‘ÙÓÛù׫ԃ¢»§ÔưÀµØÜµêöÁƒˆ«Ñù×›DÑĂ›ÚƠ÷ˆùâ·¼Í7ÛÀù×ưÀÏ¿™ÔĂÙ©ˆÏÔÚÀ­ØëöĂÙ«‡“ÍjñÓëö›Ô¿àÓ¼9¥‡÷Ù£äÆờêö¡È½¸£ưÀ¶ưÆĂƯºÏÔÓÆŸ›¾œ·̉ ¤0ưÀ%™‰kß [ïS·‡‘×8çù»÷n£Ø‘±Ù‡Ï9…‚vÙ×ÏÔ«&¶ïÅÓăˆŸ™‰kß [ïS¿ôß»û¯È̃ÄØĐÄêÛ׋ǗŒƒvĂ™‰kß [ïSÅÙécăˆŸ₫Ú«Ô9¥‡ĂăˆŸ•ŒĂƠù×ÑÓ±»«‡“ÍjđÑÓ¯Û§¹á ˜‰j̃ZîSƒÚ­Ø™Ô߈ƒˆóÂÁĂ©‡¥2ßëMؽ8¤‡µ†¿ß©¼³̃ŒÚ,ÿ¯¶í—GÔơóÂëöÿ×ÏÅăˆŸâàÎÅưÀ‹Ç¹Ú߈±»£È٥ٽ™ÁăˆŸ¯È×¾ßÖÎÅ ÏÄÿ¯¶Ù½ÇÓơêƒv™Óăÿ™‰kß [ïS‹Ç£ÇéÚ±»ר«Ô™‰kß [ïS«‡“Íj̣ÇëöÛÙ½÷Á«‡“ÍjÏÔ©Ç›¾ÁƯßÖ©̃»úÛ«‚ ½9ăơ£Øơkׯ«âçm™‰kß [ïSơêóÂáƠöµß‰¿I¾×µ.¥ÙÑæê$ƒµØ¾ƒˆ™‰kß [ïSßÚ߈Ú׫ÔÛ«‚ ½9Ú×­ØƠX«»ÅăˆŸ;ù×åñ»Û×½»Ă¡ÈÏÔ¡»Ÿ¹ÑÓ”ÿ¼ÔĂÙ™‰kß [ïS›Ú©‡¥2ßëM•Ǭֽ€¥ƯÏÔæºNñ”ÅÔăàÏÅ‹vÏÅ·‡‘×8çõØăˆŸ;ív¿ÏÔ©‡¥2ßëṂÂơê™‡ÙˆăˆŸ;kÁĂù׉øÿêÇßÁçôƒˆ¼ø×åƠ›¾™‡Å»¾³ºó—»°»çÔ¡ŸÖ‚vÿÛƒ×çºĂÙï»ß%–ÀéÓ›¾ăˆŸ‡Çƒˆ¾ăÓưÀ߈ÅÓĂ Ù½Á̉ù×½à‚½ —¶ÍÄûÓ߈ƒv¼€áÛÅØ‘ÆơèÅÁĂñÁ뼿́£Ç¿ỗÚƠºmưÀ±»éÓG½¹Û«‚ ½9“Ơ™‰kß [ïS±»ïD™‰kß [ïS‚v«»™‰kß [ïS9¥‡ƒv8¤‡¿Ø½ăˆŸËÇ‹ÇÛ«‚ ½9™‰kß [ïSÙÚëö½ï½߈½ÙÜ·Ü—¶÷Á÷ˆù׫‡“ÍjËÓ߈ùê²̃ˆ°¿ ¶â%ưÀ£Ô§Ô™‰kß [ïSÏÔÑÓË%Ûº—¶åññÁçÚÔơîňƒĂÙĐĂÉÓØô¾³ºó·Ư«»ô±¿Ưàå̉ ‡Û£ÓÙÚç'Á·Ôº¯×ܱ»Û«‚ ½9•Èû›÷Á·‡‘×8ç±»·Ôׯ¹Ú‡“ÁĂÏÔ଱»ׯ¹Ú™ëéå½Û«‚ ½9åĂáˆÁ0qÅÓÛˆ›¾¡Á5™ÔåôôơÛ«‚ ½9¾Ø‡ÇĂÙÏ¿ăˆŸ‹Üù×ÎÔ£Ô«»Û«‚ ½9ơÔ™ÔÏÚƒˆ°½߈˜‰j̃ZîSÁƯ§ÔÁ½‹Çç̉˜‰j̃ZîSÙÉù×ÙŒë*«ëÓăˆŸï½ƠXùêÏÅñƯÏÔ›¾¯¼ÉëÚ…nŸÈÿ§ÍĂß»ûù¿“ȃàăˆŸÏÔ₫®¶‡ŒĐæö÷‡¬ÅÙڭĽ˜êèäÁ¹‚Øëö«‡“ÍjßƯ©ÓëöÏÔÏÄÛ«‚ ½9רÿÚÏÔ־ώ€£Ô·º©‡¥2ßëM•Èû›ç̉̃ơÎÔñÚƒvơÔôƒvñÓ›¾Ç>Û«‚ ½9³â™ëéå½±»ù¿ÚÄ̉̀ ¬H Ưº³È½ă꫇“Íj»Á«‡“Íj¡%±¿̃ÄØ½ÓÜÏÄ«‡“Íj•ÖơêƠXƒvĺÛ«‚ ½9‹ÜĂçØÉ€Ơ³9¥‡™Ó»Á߈÷É9¥‡߈©ÇƯÓ ¹Úß»ûơêѶÁĂ߈Úª‚ +¼9”ǃïFÍÇÅÓ Á«Ô¹»ăˆŸƒv™‡đÖùÓ”½̃ÎƠáÄƠÄ¿àG½¹·œÙ½¹Ú¹ÚÇÖ«‡“Íj‚àöéÏÅ—ÓØYÿ¹ÚÙÚ߈Úª‚ +¼9ÿÔÍB‹æù×Ï̉ăˆŸëö½€ÿÚ•ÛÇØ—»߈º§́÷Á˜‰j̃ZîSØ×Ö¿à³Æ­ÄëÚÆÉ̉ÖƠ³È«‡“Íjù×…»«Ñ̀Âđ∋ǟ}ơè؉j̃ZîSÙÚå̉ ¡íÖ Ơù×Í/ÏßưÀªÙµƯù×Û«‚ ½9ÓÆ•Œ߈á ¿‰÷Á߈ßÄÙ“Æ×$§Ó¿‰ñÙ¥Û½†đ´đÙƠÓ̉½€°ÔÏÔ½ÂĂ˜‰j̃ZîS߈ñÓÁ½•džºź‹Ç¹ÚÑÓä‰ÁœÁ ¾ÎÔÙÚưÀ§Ô¶º¬Ö ¬°àèMù×Ç»ù׿½ÛÀ·ÅßÄÙƠ¹£ƯƠ«‡“Íj»ˆ–»ívÅØ¿ƒà·‡‘×8çÛ«‚ ½9ÓŹڿºÛÄÓ©¼™ÓåÁơ…ƒæù×±»Ó؃ÔÙÅëöƯ¿‰·Ôï¶×¿8Û«‚ ½9›!ÏÔùהǫ‡“ÍjỠỤ̀’¹ÜN«‡“Íj™ÁưÀ߈«‡“ÍjÙÚưƇǗÓÿÓñÄ‚vù×ÛÄÓ¡Çëö¡ÈåÁçôỞ9¥‡ăˆŸ;½8¤‡£äÙ€8¤‡߈ÖÆƯỞµØ‹Ó½©¼ĂºÆ̉(´™ÛßÄÙŽ¯È™‡‚v±ÔƒvëöźưÀÿÜëöù׃ÖÏæ´a«ÔÍÓ߈߈«‡“ÍjïƠÆê¿ÏÄá꛶飻™‰kß [ïSņ念%“Ơ±»ïƠùטÓăêØ»±»±»ï»ßÚǼăˆŸ‘Æ®Ợ߈¡Á§ÎÔ½½ƒvÅôÆ߈ưÀƯÓ ù×Á‡é/×:†Œ¨‡¤2€̃êLăˆŸß„·Ó ¥0ăÁ˜Áå̉ ׯƠXĂÙ“Æß»û«‡“ÍjÍÓ¹ÁƠăˆŸ½›Öå̉ «‡“ÍjÑøóǽô¯È½ô£ÔÑÓÛ«‚ ½9±¿á=÷‡߈Û«‚ ½9ÿ¯¶ôÁËóÇÛÿ¯¶¡Á•‡x±»¡ÁåĂ™‰kß [ïS¤,™êÉ̉Ô½߈ûûÓÁ ĂÙ·‡‘×8çñƽר̃ÁÏÅÇÖÛ«‚ ½9ÏÔ³È÷Ú‘ñ߈¿ºêö¿(˜‰j̃ZîSƒvǻ—Ûß»û™‰kß½Ă½Á¼ÊÖ¥à›¶é­ØĂÙÏ̉Ûש¼Û«‚ ½9«‡“Íj‡ÏÅÙÚĂÙ™‰kß [ïS˜Á˾µØ­¾Û«‚ ½9ŽÇØ¡ƯƒăàĂÙăơ¢»«'ĂÙ«‡“Íj·Ó ¥0ƒ€­¾‚™‡ù×±»™‡ÇÓÏÅăăˆŸ;áÿÚÛÀÏÔŸÅáØøôÍÇ߈•ŒŸÈëÚ©ÜâÂ3‡±»½ôÛ«‚ ½9ÛÄÓ…Ö¡Û9¥‡ÿ¯¶ßÚ™‰kß [ïS߈ÁٳǗ¶÷Á߈±ư˿ƿØÁƯ߈÷$ׯ߈ƽôëÔï»±»º±»ưÀçÚ¤ÆÏÅĐӵ؇º­ØéôÛ«‚ ½9ÏÅßÚù×™‰kß [ïS«·3uU™ÁÏ̉ÅÓÑÓ»ô¡ÁéƯ›¶éëîñÚÏÔĂÈăˆŸ;ÉƠùÚ“ +ñÙÏ̉߈™‰kß [ïSщé¼­Äù×éô9¥‡™‡߈×ƠÁƒ©‡¥2ßëM˜‡9¥‡ÓÁ¾›Û³Ư›vÇ¡ÁµØ¶¦D •Ç Û‰¿Iûá Í­шç̉ÙÚ©Ü™‡ç°ïÚ̃ˆÛ«‚ ½9ÛÄÓÛ«‚ ½9ưÀÏÄÅbÛºÆô +…ăˆŸ;߈ÑÓ¾ºÉ£ØŽ‚׫́ÖÆƒÖ½ĂơêåƒÖíÚ«‡“ÍjÙ½±»™‰kß [ïSùê¹Ú™‡·ÅÙu‰Ôéꙉkß [ïS߈ÍÄăˆŸ͵¥ÇÛ«‚ ½9éê€Ơ½€ÄÏÔÛ«‚ ½9¢È°” +ƒØ߈‡ĂÙ•ŒÙ̉ͼËƯ˜‰j̃ZîS̀­“‹¼G½¹áØË̉¯ĂÙÛ«‚ ½9¡ÛưˆĂº±ÁÏÅÛÄÓø×½ô§ô©¼ĂÙ°»Á½ÅÁ½™Óü‡°ø1ƒ‹Çº»ăˆŸ;ơèÅÓÅå̉ ߈‚HéÓÏÔ©ÓƠăˆŸ;Ăȱ»‘ÆßÄÙÛ«‚ ½9ÍÄ8¤‡×ăˆŸ;¼Ûˆ₫®¶ŽÜ…Ô³×ÏÔï½ĂÙÙ½Ơù×±»ăˆŸ;9¥‡×9¥‡ƠÓØê Ïű»ñíÈ‘ÛĂÙ…ÛƠ½€Ă߈§âÚ +ëö÷Áăá߈ăơ«‡“ÍjßÄÙéº÷»ù×ơï½Ûºç̉ÎÔÏÔÏÔ₫®¶µØ«»çÚƠĺ±»¹ÚÜñÖñÖÿÛå̉ ‡9¬Ö‹ÇùêÚ×›ÁƯ©ÓßÄÙ߈ŧôË¿ÁƯñÁÏÔ¹Ú™‡߈ÏÄÄöÁÜ߈ÏÅỞ÷ÁÅÏÔ9¥‡×«ÔáÙÚëö‡x¹Úƒ¾‘ÿ¯¶ùדÇщưrËÉ9Ïôº½¢»Ù×öà=ׯëöÙ½±»½¿»ÓÔ‹Ç߈ĂĂ ›­±àéMÎ|ƠơÏÔ™ÔØY›¶éăˆŸ¿ß÷ÁÏÅ«Úëö½ăˆŸ;Ë̉ÿ–«»ÎÔ§¹ƒˆÙÚϺÍÄ9¥‡«‡“Íj«‡“Íjçô‡¹ÚÁơêëöÏÔùê¨Ç œˆù‡ù×±¿ú(P‹ÇƠÏ|ÛÇñÖÓÁù×Ử/‡º”‹œH·ÔƠXÂĂí½Û«‚ ½9ù×¾¹ÚÅôƒÖÛº£÷á×ÛÀù×å̉ µ†YáÛÀ¹¡È°ÁăˆŸ;Ï̉‰ÁÿÚ½±»ó¸ñ8¤‡öä̉øæÛºÑÓăˆŸÍÓ™‡ëÚª‡’̀jÏÔçô8¤‡°¿ƠÁ¹ƒÖăà½‡ăˆŸ;©ơĂÿ’ȧéưÀĂĂ›¾½€³Øï»¿ôÍË)éÛ9¥½ÙÜ™‰kß [ïSƒˆ§Ô¦Ô›Ó©¼©‡¥2ßëMç'½½‹ÁÏű”›Â÷ÁÜ̉¥Óùש‡¥2ßëM¿¹ÿ¯¶áê¿ÅÏÔ±»ä̉‘«÷‡Åر»»ˆëö“ÈëöơĂù×½™ÔÏ̉™‰kß [ïS£ƯéºăˆŸ;íÖ9¥‡À߈ĂăˆŸ‡º£ØËÓăˆŸ™Ô«·3uU·ÔµØ±»ºÙ½̀Ê)èÛ8¤ƒv‘²ùדƳ›¾µaÇØºÏỖ»ú”{ëÓ9¥‡éÓ“ƠÛ«‚ ½9©ÀÙ×Å–’Æ…à³È‹Ç±»§ÓơvµØĂÙÂ… ……¬…°à……èM…ăºÏÔ«‡“Íj ÊûļqëöĂĂ ›­±àéMỡ¡ƠŸÈ½ù×Ó~ù׋ÈÛ«‚ ½9ùסÁ·ÓºǽÿÁ¹ÓÔ“ƠơÔ‹¿Á…×$ÂÍÄË¿å̉ ˜‡ËƠÓ.‹‹ÇߌÛ,ù×ÅÓÏÏ̉©Ø«‡“Íj™Øáêµ¹Ú÷ÁÂȵÏÔÑÓÈí°»óÇơêר›¶é¿á ™Ó€¼ÁƯ‡ŒÇÖ÷êĂÈ“ÓØÖÆ£Ç‡±°»¥Ó»q¡ÁâॉÍL…§Ó8¤‡½Ü‹È³¯È(ƒv¥È¹ÁûƠ‰ÛÛ«‚ ½9¸Ú±»å̉ ‹ÇăÇíÛÚ™ơÿ¯¶—¶ƒvơzٽ߻ûØÅ@ê@á ñÓÚ×·ÔÓØï½½»Á—¶¼߈߈Ån˜‰j̃ZîS‡¿–Ó·ÅĂºơÔƠÅÓ­aר§Ơ‹Ç߈¯×ĂÙÓÅ™‰kß [ïS³à‡Çô½å×éÓ¾ÅÏÔÛ—ˆ¯¼ÏÅƠÑÄëđÓÛ«‚ ½9±»ÁƯ»‡…à·ÔáêƯÓ ±»¿‰‡Û¹½ÎŰ¿±»“đóǽウöÿÛù׋ßñÚÛƠX½¾‡÷‡ĂÙ•ŒÓÂèÏÅñÓÁƯ8¤‡ÖóÇÏÔ™‡›¹ù×Ơ­vѶ½àƯÓ ÛÄÓëöƒ¾‘̃ˆ +߈ÏÅÿ×߈Ü™Á´7›¶é©‡¥2ßëMÏ̉·‡‘×8ç­vËÇë¼ÍÓÙ½“ÈÏÔÍÓÛºÛ«‚ ½9‡ºûÓù׃vÏÅÙ½Û«‚ ½9ù×Ử™ôÙ½­Ưº±¿½ôÛ«‚ ½9Ù½”&ÛÄÓ·‡‘×8ççÚ₫$ÊÈ9Û×ñ“›Û߈ÏÅ߈±»ôä̉Û«‚ ½9ĂÏÅ‹É0Û«‚ ½9•©vùׇŒ¹Ú¿ôĂÙÛÀ§ÔÛ«‚ ½9ƠË1™Óâˆ:jôöÁ —»«âơÔô¿ØÏÔ•%‡Œ§ÓܧâÏÔơêóÔÓÁ‡ÇơÛ«‚ ½9ăà×̉ĂơÄùê忺ƒv±»›¾±½½gÛ«‚ ½9›¶é­½¼Ù¬ƒv™Á·ô¥Çáºù×ñÆƯÓ ë×—€¿ØÏÔŽÁËù×Ûù³ƒÛ«‚ ½9íØµØËÉ9§Ôù×9¥‡ŸŒÙ½ô¶¹Ú߈Û«‚ ½9©ØºyñöÁFæØÅÄ™‰kß [ïS‰ÛăˆŸ;ëù×¹ÚÑÓ¶è·Åï»}ÅØƠƠæßÄÙÏŹÚĂÙÚº·Ôù׫‡“ÍjºåŒ¿Nù×ơèÅơêÏ´œÜ…»÷ÁµÜưÀÛ׋ÙÏÔ×¼‡ÇÏÔëöơ‡«‡“Íj߈ơê߈ÏÄßÁ™‰kß [ïSÉ–Û«‚ ½9¥¾»Ÿ‹Ç×Ơ†7§jÁŸÖÏĈ·Ó ¥0£äå̉ ¿¹ßÚ‹’³Â›¾£Ø»Ă₫÷Áù×ăˆŸ;·ÛƠX½€ëÓ™Ô«‡“ÍjÇÖß»û—ƥ⿺÷Á˜êèä¥âºŸ­ÄàƠ¿´߈øêÙÚºøơêÊÓ߈¾•ÂÛ«‚ ½9߈÷ÁơèêăˆŸ߈÷ÙÛ«‚ ½9÷Ú߈áØ›v³óÇÏÔí¸™‰kß [ïSÛ«‚ ½9ÏÔµØÑÄëÛù×µ›È̉ɇ·ÔÓ½¿»/“ÆÆ +¡Û¢ä“ơÅ­ÄÛ¹Ú¹ÚÏ̉‹̉ˆÍË)éÛ9¥ù×ĂÖ½ú(ù×»‡‡xׯ’ȇ9ăÁăÇí9¥‡‰¿IùêÖ¾ßÏÚ×…ÛË̉ưÀ¸ÚµØå̉ ï»Ù½Ù½ù×µØÅ£ÇĂ«‡“ÍjÎ̉÷Ú¢ î±»óÂ¥Ó÷ÁµØ½¦¹©‡¥2ßëM•½†½Ù½°»ĂÇÖÑÓÙ½°»¿‰«·3uU×Ơ†7§j·‡‘×8çÎÅ«‡“ÍjơèÅÓº߈»ĂÙ½ăÛÍË)éÛ9¥±»߈­Ö©Ø¡Û«ÓéºçÚÛ«‚ ½9·‡‘×8çÑÄëÄ–ÍÓÅØ9¥‡₫®¶£‰£ä“ÆÙÚ׋éº̃÷å5Ó½‡¡Ô½‡ŒÁĂ߈¿‰ƠÚÁƯï×ùê½€Îô™‰kß [ïS9¥‡ÇÜÓØ£Ø«·3uU×¾ÏÔÁÑ%á°ƯÁƯ¦âñÆñÚçÚÓØ©ÓçÇ&©¼ÍƠ£æƠÓ­Ä%ñÓÔXB™‰kß [ïS߈äÖ½§ºÿ¶•¾›¶éÛ×èÓç̉±»å̉ ½ƠXëö‹ÜẲ9¥‡½ä̉÷¼³È±»ï½ơêö‚½ó¿¹»½ÏÔ½Ô9¥‡…Ơ߃ơê9¥‡×³(•½ÁÚ߈ëºÛºăˆŸá î»Ơ9¥‡«‡“Íj—»“ûܽ¾‡å̉ ÑÄë©ñÚ‡ºĂÙ½ÏÄA߈ÓoƯ‰¿IÙÚƠĂÛ«‚ ½9ôêÿÂă½™‰kß [ïS₫¼ +ĂÈ¥Ç₫$•×ÅöÏԭăùêÛ«‚ ½9ÆÓÖŽÚÀ°»÷±¹ÚăˆŸ±»Á̉¯¾µØ9¥‡ƠÍĽ—ˆÏúÁ¿Ø‹Ù¡̃‹Ü¡ÔÏÅ«‡“Íj•Œ̃„9¥‡­Ô•Œ×¾ăˆŸăˆŸ;ùÚ‰¿IơÔÔâË̉ǽÙÚ³ăˆŸ«‡“Íjµ.¥Ù™´Ç`߈ï²2‰ƒˆ±»ăơáóÜÆˆĂÖ£»µØÑÓ¤ˆ\0˜êèäëö‡‹ÜçÚ±»ÂÏÔ±‡©‡¥2ßëMÜăêÁĂ¾ÍÄ»¥Ûƒv×Û›¾Ù×ÚÀÏ̉ÿÚöÔ"›¶éî½×Ă«‡“ÍjçƠ·‡‘×8çë¼Ûˆ˜‰j̃ZîS߈‡ŒÇÖÏÅÛ«‚ ½9«»Ǻ¡רÛ«‚ ½9ăêëÓ™‰kß [ïS“È‹ùªÔÈ»–»±»Ù°»­¾Û«‚ ½9á Û«‚ ½9‹Ü­ÖçÚؽ«‡“Íj¹Ơ´öÁ¥àĂÙôú ߈Ôơï•—¹Ú¼ƒvËƠ·ÔĂºÍÓ½×ôƒvßÄÙ¾»߈ÆÁƯḯ«‡“Íj߈ËÜÁ‡é/×:ÛºƠù×ÙuÅØ«‡“Íj®¼…’ÅØÙÚ«‡“ÍjÆÖëöƠ‹ÇĂÙ÷¹߈™‰kß [ïS©‡¥2ßëMÔăˆŸŽƯß«‡“ÍjÑÓĐÄê¶Ô +“¹ƯNËÖÙ½ơꫪ¿»ɇ§Ôƒv™‰kß [ïSê˜Hù×ÛÀÅÏÂÙ×Û«‚ ½9ĐÓ +Û«‚ ½9ÿ‡öÁÅÓÙ½ù×ơê±»Ơ“%Ë%˜ôÿÚ‹È©‡¥2ßëMùꇺëö§Ô‹Çù×±»ÙŒë*«…Û­váö†º‡ưÀ§àöçÚ‡Œ‘đ÷ÁË̉ר™‡éº„ÖѶĂÈ™‰kß [ïS±»ôÔÀÅ +±»ÄħÓ÷Ú÷ÙƒvÓ¼Û«‚ ½9ƒv9¥‡߈¨Øº‡ñ5ưÀ½â‹ơêăˆŸ;™‰kß [ïS½½–¿ÉƠ»‡ŸÅ½€‹ÓöÁ߈̃ˆ›¶é…Ô¡ÔöÁ “ÆƠÏÔ±»’ƠăˆŸ¢äÏ|°»¶—¶ÿ¯¶¥‰ÍL…«Ôíơ™‡™ëéåÄ–ÍÓøê߈Á̉ƒvƒvíº߈ñÚ·‡‘×8ç‚v­Ø—»ÙŒë*«ùêÏį¼ùÚ»ˆưÀºÂè½ưĂ߈Û«‚ ½9§ôÿ¯¶Ưº¿‰ô꫇“Íj­ÖăˆŸ¥…·‡‘×8籇›¾ăˆŸëöåÁÿ¯¶ù×›±¿ÛÄÓÛ«‚ ½9Û«‚ ½9™‰kß [ïSµ†½Èá¥Æ™ëéåăˆŸ;kù׃ˆ¼Ï̉ÿ¼ơꨇ¤2€̃êL9¥‡ÓÅĂوLJÚÉß»ûăˆŸ;½€ÛÇ™‰kß [ïSµØÛºêöÏÖ9¥‡×ÅÔÛ«‚ ½9Á½Á̉™‰kß [ïSóÄ›¾ïđóǃvÅ„ÏÔ½½Ü%á …ëû«»Û«‚ ½9g¯ÿ¸‰µơê³²±»—¶ÅÔ¶‹È«‡“ÍjưÀÑ·å̉ ²ÁĂĐÓÙ½ÏůÈ̃ˆÓØíơÀáÛº‡ÔXÙ¼Û×ùײØăˆŸ;k¹ÁÍÓÛ«‚ ½9ñÓëÅ«ÛóÇßÑåôÛÄÓƒˆéêÑÓ߈—»½›¾Ù½Ù½Á囵ÙÇ»óÇñÓ³(ÍÓ¾ëØ߈ÏÓâÁ ÿÛ©ư›vĂ ăˆŸ;Úª‚ +¼9ßÁơêÙ½̃ÄØÉŒăˆŸñÍă¶ßÚÏÔßÚ±»–ó¹ÚĂô‹É0øê±»¡ÛÄÓIÑĂ¹½‹Ü«·3uUăˆŸ•Èû›ƒÖÛ«‚ ½9‡ŒëöƯ‰Ăº“¹ƯNר­ˆăˆŸ;﯆º±»­½¼Øÿ§߈º̀Ê)èÛ8¤ïÚ±»êöœÁĂÙéºÏÅ™ôÛÀŸÅÙ½¯Ó¼¨È +ׯ¡Û‰ÛÏÔă»âÁ™‰kß [ïSƒˆÙ×­¾Á†ÚöúƠơÔù¿¥ĂăˆŸÛÆƒÖƒ¾‘öÆ·¼Í7±»‡̃ƒÖƯÓ ß™´“È½×ø™‡öÁ©ƠƒṽˆëöÏÅ•Œ×ƒv­½¼ÿÚØÅêÁ‡é/×:¬ÅÓµOÛ«‚ ½9¾ºÇÖÏÔ9¥‡×½«Ô˾ÇÖ™ô…½Æ~¢Ç¡È¥Ö£‡ôÛ«‚ ½9½éÓǼ‡xµØ©‡¥2ßëM©ÇÿÚ›¾·‡‘×8çµØ‚¾ĂíÚóĂ™à¹Ú9¥‡«dǺ¹̃£»ỞÀƯ¡È¥ˆ]1$›Yẳ¡Û½Ơ°»÷ÚăˆŸ;ÚÀ#óÂÏÔÇ·°¿³Â•߈½ÔñÓ³ßûƠăˆŸ;ù×éê·‘÷‡Ù½ß»û›¾™‰kß [ïS½ÚÇÚª‚ +¼9çÚ¹Ú͵ØÁ™‰kß [ïSÑØëö±»«»¥ºĂ”î»Ù½ßÁ™‰kß [ïS¾Ù½Á‡é/×:Ó¥¿}ÿ¯¶ăơăˆŸæÚÙÅëƒÍ¶è™ơÁÓ׳µa½ŸÅʼÏÔ¾áÅå̉ —²øơÏÔƒØëö“½«Ô©ÇÑÓ¿Ù˹½ÙÚ‰¿I©Ç±»ÓºÅ™‡ŸóăÇí»È«‡“ÍjŸ}¥Û±ëØăˆŸ;™‰kß [ïSÇÖ›Úº«‡“ÍjĂÙËÖ½éÓûÓ¥ˆ]1·ôÛ«‚ ½9溃ÖÚ×·‡‘×8穼Ó׫‡“Íj»ˆÁÆŒ¡Û§Ø±»°»©¼÷Ú¿‰ÏÔĂÙÛ«‚ ½9ưÀơ깓ス«ÓÛ×Åàß°Ø×«ù×Ù½«Ô±»…›ÑÓ§Ó‘Ô™‰kß [ïSăˆŸ;ÛÄÓÙŒë*«Á•ƒØƯË̉«èèÓ™ơ™‰kß [ïSÏÅ™‰kß [ïS›¾ÓÓÓ̉ĂÙÁ¹Ÿ»çí£Øø¿ß»ûÙU߈ßÄÙ§Ơù×ăˆŸ;èơ¢Ç¯¾߈©Œ8¤‡×ăˆŸ;±ëؕۙ‡ÿÛơ궉–¾ƒvçÚɽưˆ·ÅµØ™‰kß [ïSöăˆŸ½ăˆŸ™Øóçµa·‡‘×8盇¾ÍĂ¯Û›¾™‰kß [ïS9¥‡Û«‚ ½9¹Ú±¿·ïœ·̉ ¤0רÙ×À̉4ÿ‡åĂôĂ ²ͽÿטÁ™‡«‡“ÍjÙ½ƒvµa³(ù×Ư—¶ÓØíØóÔÙ½·‡‘×8çåĂ˜‡›¾÷‡¿ÅÅ–€ô«ÔƯÚ©ÎëÚÛ“È™‰kß [ïSÅØƒv̉ÁÅô·Å¹Ú÷ÚÚ׬ô§ôÙ̉Û«‚ ½9˜Ă«‡“Íjú(£Ô½¹Ú¿÷߈¯È£Ô‘öñ×Ơ“êߌÛ,¾´aưÀÅÏ؉j̃ZîSÏÅăˆŸ‚Ú“ÈăˆŸ;ưÀ—¶ÇØßÄÙÍƠơÔßÄÙ¾ƒvªĐôđÓ߈½ÍÓñÓÏÅÏÅÛÀÑ»ÿ½ËÇĂÙÛºƯ‰±»߈ùê½§Æ­v­vÓØ9¥‡×ơĂÅÔ±»É÷ˆ©Ø¢«‡“Íj“Ơ¿ô§ô‹ÇÛ«‚ ½9ÑĂ˜‰j̃ZîSëö“ +ĂÙëöÙÚ¥åĂ¼Ë¿߈ß»û—º«·3uU¡ÈçÚµÁÏ¿™Ô¹Ú¹ÚǺß„ÁƯÁƯ¯¼ơèÅ‘ơñ~ÇÅ›¹«ÑѶêö³ØÛ«‚ ½9³ºóÛ«‚ ½9“ÈÔ¾FÅÄÛºƠ©‡¥2ßëMëÚ·ÅăˆŸ;kÅØÍË)éÛ9¥ëö†ÇăˆŸ;¾ß“Èơ»™‡½ƒˆ‰¿IÓ¼ĂÈăˆŸ߈³È«Ó…ÚƠ¡Ó¯È½¹ÚơèÅù×9¥‡Ê¿ûƠËÇ׿8ĂÙÛ«‚ ½9¤ˆ\0ï²2öƒˆóÂù׫»߈ÑÓ±»“È™‰kß [ïSù¿ÚÀÏÔĂÙ¹›¾é¼߈ăˆŸ;߈߈Ù×Ó¾ôöƒˆ±”߈’‰2Ô,ø÷ˆÍ­ØƒvÇÜÅô±đ‚v¿ßñ—߈8¤‡¾«‡“Íj¤Ậ¶Û«‚ ½9»Á™‰kß [ïS¿·‡‘×8ç—Ó“Ÿù¿’Å/«‡“Íj«‡“ÍjÈĂưÀßÄÙñ%©énÛÚú“ÈÁĂ³È¯ÈÛ«‚ ½9ù×á ̣ÔÅØËÇÎÔ¥Û¯é÷Áí—GÆ»ׯ¥ˆ]1àƠ9¥‡×…ŒÅn«Ú™‰kß [ïSù×ËƠ¹Úº«‡“ÍjרÁƯù×ï³2­Ä÷‡ÏÄ×¾†Ú ù×›¾ơרßÁơÔÏÄÁĂ‘Æ©›ÙÚÅÓêÔ߈²Â Ëûxêè䫼߈»ÈÅ¥ËÈ9çÚ¥Öû̉öŸ ™‰kß [ïSØŒê*ª†ÇµØ̀ÇơêÇØ‡ÇăˆŸ;ÅÓ…ÛëöñÓø×’º·Å܋ǽÍË)éÛ9¥¡ëö†Ç·ØƠ¹ÚÙÚëöÙ½ßÁ©ÇÏÅëöËÇÍÓù×ÅÔă»±»áöׯ•™‡±»¹ÚüÀƒ½ăˆŸÛÄÓÓÅÏÅ8f¤‡fÖ ¹Úíëö‰ÁܶÙÚµßÎÅ.ƒ½«Ú¡È°»ƠXăàÛ«‚ ½9ÏÅǼٽٽûÓµÏÅëöË̉₫ +®¶ +­Ôù×™‡«‡“ÍjăˆŸ;¾ÍÓù×íÖÚº½éÜÑÓ½½÷ˆÜ¥ˆ]1ï½ÏÅ¡Ûkß [ïS±Á÷Ú଎õ˜Á÷ÙơԵءԶ®GøªÓ‘÷«‡“Íj™‰kß [ïSƠçôơ­Öå‡ÿÚ¯“ÆÄø×ó«ÔË¿›¾¬Ôøô½|¹Úù×Ù¥Øù¿ëÔŸ}«‡“Íj̀ Ê) èÛ 8 ¤   ³Æ›hأ䃾‘ËÉ9™ëé噉kß [ïS«‡“Íj“Æ‹ó·ÔÑÄë£X9¥‡×Û×ÓÊÏ +ºÁ¹ƒvóĂ©²Ù½Óºëö…Ôщ›¡‹Üï³2¹ÚơÔÓÓµØĐÄê§ôÊÈ9Û«‚ ½9ôūԓƠ¥ØëÖ¹ÚßôăˆŸ;½ơê÷Áử˜‰j̃ZîS·ØÏÔ÷Áơèű»8¤‡߈£ØÁ—¶áê߈Å»™‰kß [ïSßÁé‰ñ5ñ·ºyăƠ™‰kß [ïS™ëéåÿ¯¶ßÄÙˆyûƠæÚăˆŸ¶º óĂ‹Ç߈óÂÔï»±ÁÏÔĂÈÁĂ÷ÁỞ±»ăˆŸ±»ßÖñÚăˆŸ¢Ç­ÄŸ¹Ù… ‰₫шÛ«‚ ½9Ù̉±́÷Á¾…¢¸½߈ÏÔ«‡“Íjøê¼Û™Ô£Ç§Ô§Ô߈ƒvÛ«‚ ½9ÔXôƠĐØÅ–å‡ºá ơÔù×ÙÚ‘ÓÛº¿‰ăˆŸ¾Ù ưÁÁZ—¶ϼŸ’ăˆŸÚª‚ +¼9Ǻă½ƠÚª‚ +¼9߈…ưÀÙÚ±ëØ†º®µa©¼ăˆŸ;ÑÛ«‚ ½9ÑÓ™‰kß [ïSƠ»ăˆŸ;kٽٽÏÔĂÖ«ÔÑÓÅØçÚ¼€ªÈ©¼ƠÈ̉ăơ¥Æ½ử«·3uUß„ï½đ“Ȱ»‡ÚÛ«‚ ½9¹Ú̀Óß»û߈¾Û«‚ ½9±»¿‰¹ÚéÚÏ̉âà ·‹߈ÛÄÓóÇăˆŸ;ÙÚíJĂÓ™‰kß [ïSÅÁÅ–́v₫³ÏÔ•ŒÓÆâà »&‰yÛ«‚ ½9Ô”•Œ±»ÿÚ¿ºÛ×°¿™‰kß [ïS‚vÛ«‚ ½9ËÉ9ψô÷̉éÓ±ëØÚ×߈‘Æéꩼ×̃–¿Áă½ĂÛ«‚ ½9·¼Í7³ă“ȭơÁÙﻣÇ߈¼½ôÓ̉Ûד™ơĂÙ›¹YÏÄÚ½ó?«ÔöÁ9¥‡¢äù×ív™‰kß [ïS™Á‘ơµØ‡ÉưÀíêµØ‹Óï»ÍĂ­Ä÷‡ỞÿÚ³z÷‡‘ÆăˆŸ;·Ø«·3uUÉM™‡Û«‚ ½9̀Ó‡ĂØ̉Ι‰kß [ïS¥Óá ·ÚçÚêÂÊÖÙˆ™‡ẳÑ·«‡“ÍjëöÑÓñ¼ÅºÄĢǧӉø½œ‰¾Iô½ë›¾κ[¹ÚóÇÍÇÖ䉽ÏÅ¡ƠÙŒë*«÷Á†Œ§ô×ƠƒvùæƒØÙÚ§ÅÓ÷Ùº¹ÚµƠ—ˆ£äù×ưÀĂÈăơÓØ’ÆÇØ÷‡ĂÓĂ_«·3uUµØ½ôăˆŸ;¹»æÇăơÛÀƠ­ˆáê÷ÁƠëö‡ù£ä½éÓé×›¾ÉẲØÅØẲĂđ§Ô‚ˆºéêâˆ:kåçØÈ +¼Ăº· ÿÚ†ÇăˆŸ“-«ÛƠ´¾ÓÅÛ«‚ ½9ƒ̀Ê)èÛ8¤ó·§D øæ³ºó•Œ‡8¤‡¿ß¿çÛ«‚ ½9‡ŒÛ«‚ ½9Ï|‚vÍÓÙ×ăˆŸ;÷Úëö÷ÁăˆŸù×ÛÜ«‡“Íj߈›¾³–ŒƒÖƒvûÓɃˆ Ëû›¶éY˹Û«‚ ½9Ó¾µ†÷ÁŸÖåĂ«‡“ÍjŸ ½½ÛÄÓưÀưÀơÔ±»«‡“Íj‰¿I¥ˆ]1“Ơ÷¼ívÅÓ©‡¥2ßëMÁƯ­̉óÇÚû“ŸáƠÏåçôÖÆ‰Û›Úù׿ſ$ÏŶ±»Û×úĂÏÔăˆŸ;ơ»ƒvĂÙËÉ9ÑĂñÓµa₫®¶ÏÔ±»™‰kß [ïS߈ºŽ½ÖÅÓ×¾ĂĂ¢»Ở₫®¶ÙÚăˆŸ;ăˆŸ;³Æøêçº9¥‡‰ÔÍÓ£Ôơê§Ö›¾ûÛ߈ƒvơê‹ÛÖÔ†6¦jÑÓ”Èú±»¡Ôùêí$—¿¶ôăˆŸ¹Ú‹öù×ù×øêà¼ÁĂƒv™‰kß [ïSßÅơ‡§ôºËǃvçm‰¿I‡Œ±»ƒˆø×­Ö¯È˜‰(j(̃((((Z(îS(đÓ¯¼Ù½Ÿ}߈Ù½²Ø§Ó߈ĂÙ±Ô«Ô¹ÚÍß…¾±»ºØß+ëöçô©¼Ù½‹ÇÏÔÏÔưÀ߈á飳ÆívÛê¶&Ù½¹Ú‡i¹Úï+ëöà=˜êèäÙÓˆ—»߈Ïԭkß [ïSÂÙ‰Ô›¡§ôÊƠéºá$ÚÀFñ»ÂÙ™‰kß [ïSưÀƒv»~‡Û¦Èe‡º̃»ú‘÷«Ôô»đøê™ëéå底Èû›ƠX›©™Á©½ÍÛưÀÀß–¿‰߈›¶éµØÓ¼ÛÚª¶2tT¨ÓŸÈÿ¯¶íØÑæ‚vщÙÚ߈ºØÑÓ›¾ùëÛÆéÚơê³Æ¶ăÁ¹Ơ™‡»Åëö³ăçôÙ½Ư™Á·Ô¸Á†Œ«·3uUѾµa÷‡“ÈÙY¿Ô»ØÁ öÓưÀù׫‡“ÍjÍƠĂ߈áê×Ü»‡ÿ¯¶Û«‚ ½9í¹ÏÄÿ¯¶ÅÄ™‰kß [ïSå̉ ù×¼Èå̉ ï»°»ơØâºÈºáƠ’È÷ˆâ½ù×ûÙÛ«‚ ½9‹Çù¹Ú±Ôƒà¯ƠƒˆÿÚÏÄÏÔ߈ïiơèŇßÛ«‚ ½9±»™‰kß [ïS¹ÁăˆŸÿ¯¶߈Áă»Û«‚ ½9©ØÓư»ÏÔ³ÖÆ +ưÀ™‰kß [ïS˜êèäÏÔ±»í—GÙÚÚª‚ +¼9Û«‚ ½9ăˆŸ;Ù½±»¿‰÷Ú‹ÓÛ«‚ ½9ï²2̃ˆß»û°¿ +ÄﻣÇÇ"9¥‡×¹߈ëößÄÙÍÓ©‡¥2ßëM˜êèäùêÏÅăˆŸ;ÏÔơÔĂÈù×ÍĂơêÍË)éÛ9¥±»¢Ưëöơêë¼Ùº¿ÍçÚ«‡“ÍjÄÔâ઻9¥‡Ž™ÔÙŒë*«ùÜă»çÚíÁëöÏÔ¨¼µØÀƯƒv›¾‹Ü“ÈĂºƒv¿ ϺÏÔù×9¥‡×ăˆŸ;ƯÓ ¾ßËưÀ¹£–»ôưÀÏÔ½ûØ«‡“ÍjơôÄëÏÔÙÜ«‡“Íj›¾ÇĂ—»ưÀ—¶ƠÇ̉ùêơÔ™ÁĂÙµ‰8¤‡×±»°¿ëöÓśڱ̉ÏÔ‚ÖÿÚ߈ÛÀ÷Áñ¿™‡éº“ÈÉ’ơÔ†ÇÏԭĹڱ»›Úÿǰ»™‰kß [ïSï²2߈æØ ©ÓÍÓ¿ÙăˆŸ;™Ó£»äÁźÙÚ°»g‹ÇơêáêÁÚ÷‡öóÔ™‰kß [ïS§à©Ó‰ơ߈ƒ¾‘ǽßƯ߈Æ̉ø×ĂÙÙ½Û×£ÜÙ½߈µÀử«Ô½đÛëö­½¼ÁÓ9¥‡á́v ¡h·¼Í7ÆĂ­È8¤‡ÏÅÿÇỞµØ™‰kß [ïSăˆŸ;½³¹ÏÅY¼̀Ó;±»™ÙڭعƯË#³ºó¡Ô߈9¥‡×¹ÚăˆŸ›vG½¹ó¶ï½›¡ÑÓ‡ŒăˆŸëöù×™‰kß [ïSÑó¹çéºÿ¯¶ûÓÛ«‚ ½9ÏÅ¢ØÅ̉Æ̣ĂÏ̉¿çûØß»ûƠX´a™‰kß [ïS½€½¹£«Ú“H±»“Èëöœ‡Ç"ăê™ÔƠX‹¿ʹ¸È³È¥‰ÍL…±¿×Ơ…ÚƒvăàùîÓ̉ûÓÇ·“ºßÁ™‹Ü˜‡߈í§ØÛÅÓǺÛ×Ë¿ÛÀÛíŸèÅÄ™‰kß [ïSöµÇÖ¹ÚÛ«‚ ½9ù×߈Ïʉj̃ZîSœ‰¾Iʔ۫‚ ½9·‡‘×8ç½™‰kß [ïS‚v™‰kß [ïS³ÂÙƒÓ ‹›æ¨ «·3uUóԨǃÖ9¥‡ÏÅ¡Óï‰ÀĂ÷‡ĂÈYÔµaÅÓÆ‚ØÛ«‚ ½9ƒvËÇÏÔá ˜ÁưĂÁĂ¥Æă½ĂÙëö÷Á§Ơ·Ô¸Ú—Ó9¥‡óÇëö»¥½ÏÅËÇÉ̉²Ø«ÔñÓ½­½«Ñ½»Èùê­Ö½“²ÈÁĂ¼€«·3uUƒˆ«Ôß»ûóÓƒvëö₫®¶ÚˆÓº߈›¾˜ÁơèÅÙŒë*«’¹ÜN™ô—¶©Ó“ƠÙ߈×Ơ†7§j©ÓûåĂÄØ·Åû`ÙŒë*«éºËƠá ëö·Ô³ºó£Ç߈‹Ç½ôŃÿ/ù×÷Áăê߈±»щΟơÔ«‡“Íjư‡±ù1ƒv™‡Û«‚ ½9¹ÚÛ«‚ ½9ŸƠ×°»½­€¨º™‰kß [ïSƒv—¶¹½Û«‚ ½9æ̉ƒˆá ¥ÆÛ«‚ ½9À%߈ùë¿å9¥‡ƒvÍĉԙ‡ĂÙ±»¾™Ó‡xơèÅÏÔÛ×ÏÅŒ¾©¼ù×ÙÚ§Ôå̉ ™‰kß [ïS»±»¯¼×Í9¥‡Û«‚ ½9ÑÅ«ÔÍƠÏÙÜ щéºÅÓ›¾ÿÂ߈Û«‚ ½9ÿ¯¶9¥‡Ăó«ÛÁ̉ÁƯºăˆŸ;™‡¹Úƒvɇź­v­Äø×+шª¼“ơóÔ«»߈ÛºÂÙÚÁƯÛ«‚ ½9«‡“ÍjÔơ¼È«‡“ÍjđÁù¿¹ÖĐæ©Ü­R©¼Ù½†ÇªÚ ÁƯ‡Û™‡ĐÅÛ«‚ ½9Û«‚ ½9Û«‚ ½9ívÚÅ«‡“ÍjĂ#Ë¿­Ơǻ۫‚ ½9ưÀƒÖËÏÔÑÄëÙÚ¶Ô·ÅñAĂƠ­Ø•½é‰ñ5ñ·¡ÔơệÔƠ¾ơÄơÔ±»‡xăºÛÄÓƠ§ÓÔXºØ±»µ«‡“Íjñ»«ÔÑÅÓ¾ơĂ›¡ÎÚƒÖåĂ¡ÔçÚăˆŸ;µ‰¶ơÔĂĂ ›­±àéMëÓăˆŸ;ƒˆÿ§§Æ߈ƒÖ›¾™‡±»±»÷Ùƒv÷ˆ«Ôÿ×Û«‚ ½9÷ÁÍÄÁ̉ñÖÿ‡÷Ù±»ù×ëö©‡¥2ßëMª‡’̀jơêÛÇÖưÀ8u¤‡uÖ¾9¥‡¯¾£»ç‡ÚÀƒvÅÄÁ«‡“Íjưˆ«‡“ÍjÑĂÛ×ù×ÙÚ‘±Û×ĂÙË%™‰kß [ïSíćÇÁËáÀY«‡“Íj«»¡×¾¿‰éº”ăÁơÔ½¦¹ù¿߈ÛÀéÓ°¿×$̃ÄØƒ´£ÇÁƯ›ÚăˆŸ;ă½gáƒv½ûӻس±»Ûºù׀Ǚ‰kß [ïS¥ÖñÖ¾ơĂÛ«‚ ½9ù×ÏԕܹڣØÅ»Ÿç˜‰j̃ZîSϺÏÅÚº±»½¯¾£Üù×9¥‡ÆÛ«‚ ½9ĂÙÜ÷êÛ«‚ ½9Û«‚ ½9Û×±¿¹Ú¯¼ˆưÀù×ăơ·ØÏÔÑÓ…½ËÉ9Úª‚ +¼99¥‡ÍijÜư‡±ù1¹±רµØÜÏÔ‹Ç•ÏÅÿ§«‡“Íj‘Ö»ô«âÛ«‚ ½9›1œˆ†ºÜ凶ٽúÓ«ÔÛ«‚ ½9÷ÁÛ×±ëØ±»™‰kß [ïSß»ûßÄÙđÎÔƒv©‡¥2ßëMù×Ù׋ܙ‰kß [ïS£»áƠ°» —ÓéÓ™‡±»ƠX‹‘ßÄÙ߈«Ô¹êëöÙŒë*«Úºù×ß»ûăˆŸ;±»ÁĂçÚûƯ°»Åô°¿…¼đÖá ëö€ë¶èûØÁ½©Óáêî‡߈ĂƠÁẴ檇’̀j™‰kß [ïSå̉ éê¿ß‡xĂÙñ»ëØ«»ù×ëö¡ÛĂöđÖ™»µØÖÚÏÔ‡ÚÏÔ†ºÙ×Û«‚ ½9™‰kß [ïS̉º÷Ù‡•ăˆŸ;ó€¾ÏÔ§¹á Û«‚ ½9ĂÙå¿û›‘ÁÿÚ“ƠÊÖ¾çÇÖù׫‡“ÍjƒvöăˆŸ;߈¨¼÷Ù™‰kß [ïSçÚ£ ƒvù×çô‰¿IƯÂăˆŸ½ˆ¥ÓÛ׫‡“Íj¯éÛ׫‡“Íj™Ô¡ÈăˆŸ;±»ïÚ½«‡“ÍjÛ«‚ ½9щăˆŸ;éơûƠÙ×ơù×™‰kß [ïS©‡¥2ßëM¡Ô›¶é߈ÿ¯¶ăêùp­Äâr÷Ú½€ñÖ߈Ž߈ív߈˹«ÔÎÅǼ9¥‡“ÛĂĂ—¶ÏއºívÖ¾¥Ó…àơÔ÷Á9¥‡âơÏÔËÇ£!ƒ×ëÓôÅà“Ơ±»›Úù×™ÙƠÓ½ûè…œßڃ䱻ăơ¦ÓÁ‚Ù̉áÄÛº—ˆƯÓ ºĂß„™‰kß [ïS›¾ÏÔ¿ØÁ½ÙÚö½øê1ä̉ÙÚù×ŸĂ™‰kß [ïSÎÔ½÷ÁÏÅÎÔ«Ô¯ƒßͯ¥'=U#QK¯Â•%«Ô§ÔÿÚüÁÏÔẠ́ăˆŸ;«ä§â9¥‡×߈ϺơÔá=¡ÔơêÛ«‚ ½9±»¿Ô¡Áăà“™‡™Á¬Èfå̉ ̉Å ƯÚŽ½àµØÖÆ‚vùêÍƠö½€áÛÏÔ¯¾ϼ© ƠơÛ«‚ ½9À½ĂôÏÅáÆ°»ź›¾ÎÅÏÔ…Iû(çÚ±»…Ö‹Ó߈ù×߈À̉…n™Ó™Ó±»¼‰ÛÍÓ›ÚµƠçÚŸÖñ»“Ơï½߈ƒvëæ°›¹Ù»߈ß–«‡“ÍjƒÇ̉™‰kß [ïSéê£X¿ÁƯщÛÄÓ·ÔÏÔ›ÚăˆŸ½É̉å̉ ñÓƯÓ ó#Üí$™‰kß [ïSÚ×ÂÙçÚÛ«‚ ½9¿Ø¦ô›ÛùסȹÁ™‡ơê¡ÔĂÙÅß»ûÿ×ñƘơÏÅÑØ¶Ö­Ä¢ÔßÄÙ°»˜‰j̃ZîSŒÎ¡ÔÏÔÍÓưÀ£Ø™‰kß [ïSÏÔüÁ·ÔͼÙÚÎÔÏÅÆ̉9¥‡ÍË)éÛ9¥Ë鵨ĂĂ ›­±àéM¼€Ơ߈óÔµØăº¯«‡“ÍjÄØ¹Ú¿½¥Û“¹ƯNö÷Á±ëØÏÔÂÓÓÁ₫ø¾ ù×ׯ…Ø÷Ù™‰kß [ïSªÚ ûØăàëáêî»·Ô§sÛ«‚ ½9™‰kß [ïSŸÈá ‰¿IƠ—¾÷$ÓÆ©‡¥2ßëM±»´†9¥‡÷‡ỞÉÜôƠñ¿¬Ö ñÚ«‡“Íjå̉ íÛ×ĂưÀÑÓß»û“߈…»›¶éËÓ½¾‡Ǽø×ͼ™Ó·Ô‚½™‰kß [ïS©ÓÏÅñÓù×½¾‡ÍĂàź́Úù×ùă÷Ù¥ÛĺăˆŸ;k™‰kß [ïSơĂ߈÷ÙÚÄ̉¿»—ŒßÁ•ÖØƠ’ÇXí—GË̉¡Èï»ûƠؽÿ¯¶רÏԡاƫ‡“ÍjÍÓœÁÊÔÖÆÙÚëöùê±»ÏÔ8¤‡×ÂÖ¹ÚÀ‡€è/Ö:̃Œ±»̀ïÏÅ«‡“ÍjÛ«‚ ½9‡×ÏÔ“Ơ±ÔƠ‚ÔÍÓôơèÅ«‡“Íjñ“ٽŇ½–¶ËÉ9±»ĐæưÀíÁƠ…öÍÓÇ»³Æù׫ÚÙןÍj÷؛ʃvö±»‡xëç'ƒˆå̉ ùëƯÓ ƒơê™Ôå̉ 釩¼ºĂÈĂ¼ßÚÙÚ¡ÔÑÄë߈8¤‡×™‰kß [ïSĂÙ™‰kß [ïSäÁ¥ÚµØ…ÇăˆŸƒÚô¬È·‡‘×8ç9¥‡ÏÔ#ÏÅà‹Çƒ¾‘ùêçôÉ»è¼ëö•%«»ƒà§ôù׫‡“ÍjíØÿÚ)“½Óºø×›¾™ÁÛ×ß»ûŒ¿·Ó ¥0ÍĂ¡ÁÎÔƒˆơ»ù×°»ÄÁ‰)߈÷Á›¹ăÁÍÙ½á꽨Ơˆđ9¥‡½€™‰kß [ïSù껇ׯß–ïƠÚÀ߇ºÅÔÛ«‚ ½9Á|·‡‘×8祾¿‰€ºƒv™‰kß [ïSæÚÏÄƯº¸àÙɸÚßÚù×ơêëöăàëÖ›¡ơÔĺçÚöˆỔ½Ÿ¿ùêívÑÓĂỞéêµØ±»èø߈·‡‘×8ççÚ8¤‡8¤‡×$ĂÙ¿‰Û«‚ ½9ñÚ™Ôψ½€§Ó«·3uUÛÄÓ«‡“ÍjÛ«‚ ½9‹Ü©%Û«‚ ½9ÅôƱ»©Ø×ĂăˆŸ;̀¬H™‰kß [ïS±»˜‡³(ĂĂ£¿»×ñùêïß™Á·Ôï‰ç̃°ÈÚêÙŒë*«åÁ¼ÈǺÙÚĂôëÚ›Ơ·Ô«‡“ÍjĂƠºmù×ÑÄë…âÍÓ•Èû›8¤‡öÇØÆØëö·‡‘×8çăàÛ§Á˓ȋܣӄàăˆŸ;¹Ú»ˆŹÙÚ³ ‡Œ™‰kß [ïS³ ∠  : 9¥‡ƒvƠuÅ»Ѷ¶Å·Ó ¥0«‡“Íj¹Úå̉ Û«‚ ½9ÏỐÓíØ±»߈¥Æôù¿±»ơ×óăÿ§ưÀﻹڽô—¶½½÷ơ©Ó²Ơ‡€ÁËÏÔåĂ—Ó¶Å™‰kß [ïSш½ï½ÅÔ©ÓƒvăˆŸ;&¡ÁÑæëöÈĂ™‡ÑÙÚû–·Ø·Üöơê—¾½…€­:ÙÚ›¶é«‡“Íj‹Ü¾ºí‡ÍÓïƠ‹ÇÏÓ™ÓĂÙźëöÅÓ™ëéå°»̃ˆº˜‡ăˆŸívăơçÀ«»¨¼ÿ¯¶ÏÅ™Á₫®¶½üµ†Û«‚ ½9˜‰j̃ZîS·ỔŽô±»ßÁ½ÏÅçôñÖш߈¡%›Ú±±¿¡È9¥‡ưÀăˆŸ;k߈ó¡ȗӲØAÄÄ8¤‡Ö•Èû›ƒÖ—Ó“ƠĽëöÇ»ôÄ©Üù×ÑÄë±»̉ÓăˆŸ;9¥‡̃½ƒØ¿­Ö…ôă¼9¥‡âơºÑ÷ë¼Á̉°»±»«ÔÖ$ïƠóÂöÇÖ×$·‡‘×8ç·Ô½€™‰kß [ïSÍÓù×çíÙ×µØß»ûÛÄÓ™‰kß [ïS߈±»ơêƒ×—Ó×s©ƠËÉ9‡Œ˜êèäơÄ߈½ÈªĐ޽«‡“ÍjÍƠ°½ĂŸĂÛºÙÚ˜‡º•%±»ưˆ·Ô›¾ÏÄ÷‡Û«‚ ½9­Ø±»Ǿ…Ø߈™‰kß [ïSƒàÏÔ߈£’Ơ«»†(àêøê÷ÁÙÁÅÄÅn‰Ûăê Ç‚vñÓ¿‰ÏÄívÓ̉ï½™Ó‹Üù×Û«‚ ½9·Ô‹Ù‡÷Ñù×±»ÅÔÏÔ©ÓÙ½±»¡ÁÂÙ9¥‡9¥‡™‰kß [ïSưÀ̃Á¾ĂÙÍƠÙÚ§ÓăÇíùê›¶éÇÅƠRùê§ô‡ŒñÁ‡’‰£˜‰j̃ZîSëöÁ×߈ÙÅëæÔ ߈߈Û„½¹Ú߈Û×ÅØÇÓ…ŒÍÓư“ƒˆù¾øê“¹ƯNËƠƠơăˆŸ™‰kß [ïSÑÄë8¤‡ëö±»ÍüƠ°»Û«‚ ½9óǡȽ€ÍÓƯÓ ÿÆ Á§¹Å»ˆ‡“ơÔ9¥‡džÏ̉˜êèä߈¥ˆ]1ăˆŸ;ƒĂöÔÏÔ‰a×ƠÏÄáê«Ô´†9¥‡×˜‰j̃ZîS¹Ú™‰kß [ïSöÁ«â±»¼½€Ơ‹Ó»ǾvơÔ™‰kß [ïS±»ỞÅÔăˆŸ×Ó¿ôÅëÓ³ù×ÏÔưÀùשÇù×¢ä·ï±»Ù½åĂÏÔ«‡“Íj°½©Ó«‡“ÍjëöăˆŸ;k9¥‡—¶ăơ™Ô³̃ˆƒ»½Ù½·‡‘×8ç½ùê9¥‡ôáÛ¿Ç߈»ó¼«‡“ÍjÁ½ÍÄéÓ·‡‘×8çÅÓÁ Û«‚ ½9ù×ÁƯÙ×±»ç'íÅóÂơếÆ™ëéåøơ©Ø—»߈ß»û“Ƨö—ӣȃàÑæ߈ëöϹĐÅñÚï½Ø»ÍË)éÛ9¥₫®¶ïƠæÚøơ°»Ù½ÿڧدÈÍË)éÛ9¥°È¹Ú¹Úÿ§¶ è ËÈ9ËÇ“Ơ¾Úª‚ +¼9ß»û‹Ùëö†đ5½€»ØÁĂƒv·ÜêÚ×Ü™‰kß [ïSŽ‹ÏÑÁ‡“îÚª»ѶăˆŸ™‰kß [ïSçÚ—̃°»¯ÜĂĂơêµØ½Û«‚ ½9çÚéê¬ÖÿÚ̃ˆÁƯĂÙ·Ôׯ«Ôï‡Ơ¾GĂôĐÓÛ«‚ ½9ƠX¿¾ƒ…º¶  Ù½ÿ¯¶ÅÓ¡»¹Ú³ ƒˆëöÛÄÓ«»ÏÅ·‡‘×8ç°»½"߈°ùĐÓ¿«‡“Íj—¶ƒåÓº¥ˆ]1º/ă‘·¡»«‡“Íj±»ÜßÁÙÅëµ.¥Ù™ÁÛÀ§Ô™‰kß [ïSñÚÏůªd¹ÚÙÚ9¥‡ÏÔƒØÏÔÁÛ«‚ ½9àĂ¼‘ß½Ă½ëö¯$ĂĂ ›­±àéMÛ×߈›ƯÛ«‚ ½9‘Æ•ö‰¿I߈ăÔß„‚½ +é9¥‡ªÚ™Û«‚ ½9ËÇÑĂgØ×§Óø¿Û¿º̀Ă­Ä‹ÇơÔï»È̉"ç'™‡±»ïØƒÖØ-8¤‡ÖƒØå̉ ›¶éíÖÏ̉•Œ±»£ØëöÿÛª‡ ’ ̀j ëö±»ơÔù×ÙÅëDZ»™ÓƠơ½½°½ƠơÔÑÓ¥ØöÓÔơẲÅÔ½€ĂÙ‰ơ‰¿I­Äº£ÇÏ̉ù×ï»ù׋ÇưÀ½€†ÇµăƯ™‰kß [ïSöº‘÷ÍÓ߈“ÆñÓúØ €ë™‡ͼ§Ó™ÓÍÄŽù×Ñ·•ÇÛ«‚ ½9É̉ÓÅÄô…Øæ½ÏÅ™‰kß [ïSêö“˜Áă¶ôÅÓĂÙ²¹ ̃ÁëößÄÙƠ¿‰ăˆŸ;k̀Ó§ÔÇÖ—¶ÚÀ±¿Û«‚ ½9Á̉±È™ÁùôéÚ±»¿µ°»ó#Ù½é‰ñ5ñ·ăˆŸ;ưÙÚÛ«‚ ½9å̉ ™‰kß [ïSơÔ…ö·‡‘×8ç±»ÇÖµ†Á̉ëö½­·ÜÿÚÇØ˜‰j̃ZîS³Â™‰kß [ïSÅÓ™ëéåơèű»¹Áƒv“™÷Ùơê«ÚÏoÇɇù×ï½Ù½ĂÙù×Üëö߈ăˆŸƠÔÅv½™‰kß [ïS»½ô«ÑăˆŸ;ƒÖùבܙÔơê£ØôÇÖ©ºăÁç̉æ̉½ù×ưÁ­Äˆ·ÔÏ̉›¹Úª‚ +¼9ͼÛ«‚ ½9ßÄÙ¶“ƠØ×ëØ›¶éưÀéԢء»©‡¥2ßëM²Â߈ÇÖ²«‡“Íj÷ÁÄëÔç½½¾‡ÏÄ Çâà“‹½ô±¿ÏÅ·Ô°»ù׃vëö™‹¹Úơ‡ß»ûÑ+ùŸñËăơ¡ß¿‰ÚÄ̉±»߈íê¤Ûÿ¯¶º¿‰ÜÀöƠÛ«‚ ½9ß»ûÏÄ÷Á¶ûÓ߈Ûצôà=›¶éɇÛ«‚ ½9½×Ơéêï»ơĂ½Ư™‰kß [ïSóÂÅÓ«ÛăˆŸÏÔÅØ½ƒvçÚÍË)éÛ9¥Ăó›¡߈÷‡ùë¿ô§Ô¯ÈÿÚ™‰kß [ïS«Ó·Üƒvÿ¯¶ÏÔÛ«‚ ½9«dí—GÏÅù×ÇÖùל·̉ ¤0¹ ©Ø¿‰ÆÛ׿8¿Å9¥‡ùê÷Ú¥Ö©‡¥2ßëMÍÂÙ½«‡“ÍjÙÅë·Ô«‡“Íj¡ØÛ«‚ ½9ø×¡Ûרå×ÉÖÛÇÏÅö×Ơ«‡“Íj™‰kß [ïSø×­Ø±¿߈ƒˆ‹Ü¯×³zƒv½€ăˆŸ;±»‹Ç«‡“ÍjÇĂơê³Íùף䩼·Ô߈Ó¼ÁÑ­¾‡Çç·¯ƯÅØ±»óÂ÷å5Óñ¿ưÀÛ«‚ ½9ÏÅơêöăˆŸÖÄÓív³ºó˜‰j̃ZîSœ¹Ú£ØºïdÏÔ߈çmÿÚ¿‰Û«‚ ½9»Å߈“ÆÖ؃v™́‡Ç«™çÚ–½H¶ÍË)éÛ9¥©°½Ó½ßÚù×›¾̉º±»̣Ôëö¥â߈“ƠÙƒvÛº¹Úß}Óå̉ „ö¼±»ơêªÔ·‡‘×8çËÉ9ëö¥¾ƒvù׳´€Ê>ßÄÙ«Ôû(ëö±»¹Úäđß盾‡ïâˆ:Û«‚ ½9½“Ʊ»ăˆŸ8¤‡ÑÄëûÓƠưÀ¡Û™‰kß [ïSƒà½€˹ñÖÙ½Á é¼Áܣ乶«»ÊÇăˆŸ®×«ÚĂ÷Áÿ¯¶’ÈÙ½ˆỞßÁ¶›¶éăˆŸ;£ÓÁă§°êØ±»Ïăv¯È§Ôƒv·Ô™ëéå­Ö÷ÔçốơØÅĺ̉ £ä¯È±»Û«‚ ½9ùIĂÙĂÈÛ«‚ ½9§ÛÄÓ³™‰kß [ïS»nÍÄͼ—ÓÇï‡ÙÚơêûؘ‰j̃ZîSµØ«d…¼´Ü…Ơ™ôû£ÏÔ·‡‘×8ç³Çô°»Ë̉³(ÅàăˆŸ;ÙÚß»ûÑóËÓ·‡‘×8çÛ«‚ ½9ƒÛ«‚ ½9ÅØ­Ä‹Ç«‡“ÍjÓÔå̉ 彵ط‡‘×8ç­Å±¿ơ꛾™Á‹ÜëöÛ«‚ ½9«‡“ÍjµË̉áê˹ăˆŸ;©¼ߌÛ,8 ¤‡ ™‰kß [ïSù×ÏÅ÷ÁăÁàˆ.À0.p.©‡¥2ßëMôÔ +Ï̉ăêơº°»߈ơÔ߈ÙÚÙÏÅÚª‚ +¼9•¸ÏÔï»±»‹‚»ƯÉĂÅô›¶é‡º·Ôí·¼Ø¹£§ôù×ËÇÙ½ÿڣؽô߈ƠX広ر»ơÛ«‚ ½9«‡“ÍjµØѶÏű»«‡“ÍjÜ­·ô«‡“Íj«‡“ÍjơĽ…–¾ÏÅÏÔÏÅ›vÓ¼ƒv™á=È™‰kß [ïS®È…Ø߈­½¼ÛÀÛ«‚ ½9±¿‹Ù³–˿ٽÇÓÏÄưÀ½€¥ˆ]1ƯÓ ¹ñÖ¡%«ÔÏÔ8¤‡£äÁ¡Ôáêíơ­Ö߈•ŒÙŒë*«̣Ă™‡°»ÿ‹ÇÓíàï»·ØÓØ£ ­Öăà©Ó©ˆ°»×Üׯ’‰‹2‹‹Ô,‹ø‹º»¸ÚÛ«‚ ½9©ÜY±»¯ÈơÔ—»½Ôáêÿ¯¶¹Úÿà¡È­™Ó¹à9¥‡¡Ôû¼߈ÂÙÆ˜‡Ă‰¿IÎĵÀ¯È9¥‡ÅÓ™‰kß [ïSñÁ߈ăơ«ÔÙÚ“ÈưÆùơ߈ăˆŸñÚÙÅëåƠơÄĂàÏ̉ÛÄÓÛ«‚ ½9ÙÚ£äç¼»¹à…ÖôĂÙ½ơêÇÖÙÚ˜‡áƠ߈—¾ÛÆ·‹¯½Ă߈·‡‘×8ç¡Ô•îăˆŸ;ÑÓ©Ç­ÔÍ¥Û«‚ ½9ÍÓÁƯ¹Ú½ơêĂăˆŸ…Ơöưؽ»éô߈º·l·ÅÓ¼™‰kß [ïSºá ¡Á÷çê¶Ó́đÔ›¾ĂÙưÀ¡Ạ́˜êèäöͼÅÔ™‰kß [ïSñíÈ߈Ó́̃™‰kß [ïSö9¥‡¹ơÙñÓƠÜÅØÙ½߈‰ÛñÚ³ÆÏÔ±»…»ĂÙ–¶߈ưÀ÷ÙăˆŸ;½€‡½ÓØû̉Ù½ƒvÛÄӵطÅËǧÆĂÈß„«‡“ÍjäÁÛŇŒî»ÿÚ­ÔƠÚ§ô­¾¿‰£ ĂÙâӷŪĐ÷Ú™ëéå±»ÏÔ±ëØ«‡“Íj±½‹Ùµ•÷‡Û«‚ ½9¥ˆ]1ÛÔăºÇÖÿ¯¶ơêáÁÓºö™‰kß [ïS£äƒvëö‹Ü»n«‡“Íjß߈åĂª¶2tT¹Ú½°»ƒvù×ƠËǃvĂÙ¿‰¥‰ÍL…ºù×™º•Ö¤ÆẶÂƠ§ôÓÅß„߈±»ÎÔ‹Ç₫$ûÅù×ßÄÙïƠ™ëé册ƒv•×߈½îӺkDZ»±»÷Ù­‡±»ƯrµØ̃ˆĂÙÿ¯¶åÁ¬Ô›ÚÓØƠ¡êö °½ÖëỔÁñ.“Èăî߈ỞƒvÁËĂȵa÷‡ŸÖ¤ˆ\0Ö ưÀÙÜÅÅØ¥‰ÍL…æ±»ÿÚ©ÜëöÛ«‚ ½9ÚÇăˆŸ;Ü߈߈·º‰Û€º™‰kß [ïSỞ­Ùù×…»ĂĂ ›­±àéMùêÁÛåºơº™‰kß [ïS¼³ÈÁ̃˜ôƠívÛºă=߈Û«‚ ½9÷ˆáêø×b¹Ơ¦ÓÀ½éJé‰Ó5“gesÁŹű»ëö«‡“Íj¼ë¼ ߈…ÛƠĂȩǦӷ‡‘×8çÿÚÉ©ÍƠçÚßÁóÂăˆŸ;±»™ëé剌Ởù׳ºó߈›¶éù×ĂÙ±»¡Óßű»µØù×¹Ú¿ôÛ«‚ ½9—»¯×ª‡’̀jÁỮˆϼÿàßÄÙƯº߈ăˆŸ;k§ÓƒvØÅÑêÑä$™‰kß [ïS¯G‹øº±»™‰kß [ïSăˆŸ;¡»ź—ŒÑÓ‡ª¿ô«‡“Íj—Öù¿‹Ü½€ăưÀź©ÓÙ½Û«‚ ½9÷Ú‡ŒĂºù×ÏÔ8¤‡×ªÔ£»߈±»ñíÈ«»ăˆŸ’½Åج‡ƠXÏÅÛº½ô¶  °Å  ÏÔ½đ­Äº¨ƠË¿ƯÓ Æ»‡~ÍÓ×Ó„ôáƠ‡ºÛ«‚ ½9Â÷Ôª‡’̀jΗˆëöưÀ¡Û±»9¥‡±»½ô¬ÚƯÓ ǼÍƠ³È›¡ƒÔ÷Ú¹à߈´a¬Ö2ÿF¹Úg›Ú¶±È£ƯăˆŸ;ơÔơ꛾ٽ›¾›ÚÙÅëÏ̉ÆĂù×½€Úª‚ +¼9ĂÈG½¹åĂÓ¾›Ú˜‡ÏßơêщĂĂùו™‰kß [ïSÔ¾FîƠ₫'ÅØÛºá Ëûíṽˆ ăˆŸ;­ÖÛÀǪ‡’̀j¯‰¯0Û¥̃»úÙ½ÍÓ“ÄÍå‰Ô«âơÔ³ØáÙºÁĂÛàÅØ½§Ôù׳ ߈ô£ä¢äÙ½Ă¼ÿ¢†×ëöèêÛÄӭġԿ́Ă艿I¼„Ơ¡ƠñÓ¸ÚË̉ƒvá G½¹‡ÇÙ½µ†ûÓÏ̉±½ÏÅ»ôسׂ*ƒà«·3uUµÀÏÔ‹ÛăˆŸóÇơÄƠåăơï‡á ù×́vŽªÚ«‡“Íj«Ô½ï»¾Ù×Âí—ˆ«»ѶÛ«‚ ½99¥‡Ï̉½µØ₫Ú’•̀Ơ*ơÔ·‡‘×8çÿ$×¾ĂÙ׿8±»ăˆŸ;Ë̉ÙÚÍƠûÓ¿çµØ¡¯&ª¶2tTôkß [ïS߈á ÷°½§ÆÏÔÏÔ“ÛƒṿÔ±»9¥‡ẵóǯטÁɹ߈ÉÖÛ«‚ ½9Û«‚ ½9ơâăˆŸ;‡xù׫‡“ÍjÏÄÔ¯́«‡“Íj9¥‡™‰kß [ïS‡Œ›¾«»«Ôô…Ơ§ÓÇĂÖÚÆÍįƠóÁĂëöÍÓÓØÛ«‚ ½9ÏԯȾ±»çÚÆçZ‡ëöáÛÑÅÏÔƒv­ÖóÔ¹Ú¬¾ƒvÅÄÚÚ÷ÁĂĂ—ÓïƠÏÔ麃Է‡‘×8çÁ̉ăˆŸû¼¶..­Ä½óÇ·‡‘×8çÏ̉˜ÁÛª¶2tTù×ÀĂ¡Û×¾ëöÿ¯¶ï½«‡“Íj™‡°½±»Ÿ}Ë¿ưÀ€Ó‹ßÙÚ«ÔÛר¼ÇØÎÔÏÔÏĺÙÚÚª‚ +¼9½Ø߈÷ÁĂÙÏ̉Û×âà‡ ÷‡ßÚơĂêöψ“ƠăˆŸÛ«‚ ½9ưÀÂÇíÍË)éÛ9¥Á‡é/×:½Ă©‡¥2ßëM£äµa¹ö¿‰ăˆŸ;ïÚÎÅÅÓù׫‡“Íj™‰kß [ïS‰¿Iƒv’ÈăˆŸƒvŸÈ“¶‡Ö8æÛº«‡“Íj¥ú‹ÇÏÔĂô›vÁƯ(¿(öÁÏÔÛ«‚ ½9¹Ú¾ÇÅ߈™‡ÁĂ²–ÏÔ߈Û«‚ ½9ơêăˆŸá¼Ù½ï¶ùׯ +™Áç'©Ç±»Á¼Ă·‡‘×8çï‰Ûù×Ç–Ó¿ºÛ«‚ ½9ÍÄ‹Üí—G«Ô˜ÔÁƯå̉ ½€9¥‡–¿‘Ʊ»߈ÂÙÍÓÍË)éÛ9¥ôêïôÓÆ‚vؽ¿Ù›¾¡ÛÍÄÁĂăˆŸ;™Œ˜êèä±½½ôß»ûÁ‡é/×:ÁĂÛ«‚ ½9¤Ûå̉ ÏÔûÓ›¾Ă Ơöơ»êơ¿ôˆ«ÔỞăˆŸåÁùæ‹Ü÷ÁÑÄë‡Û«‚ ½9ƒvµØă»óĂ“ÆªÛÿ¯¶Ûº´‰·ÜÀĂ¿‰Û«‚ ½9•ÓßÁĂºưÀ¸ÚÅÓ’ºÁ¼ơÔ‚vÛ«‚ ½9Ù-±”Á±äÁ™‰kß [ïSÑÓñÖɇËÓơÔÇĂ¿́ù×¶//½€‡§á=ÿÚøôç̉ƒv•ÿ«‡“Íj­î麪Ӈºªd±»å̉ µƠù×߈êÓµa£äÓ«»‚ߌÛ,9¥‡©ÜÑÄëÁÓÓÅùתäù¿±»“Æơêù×ÔXù×߈µaÑÓö™‰kß [ïS₫®¶·ÜăˆŸ×¾©‡¥2ßëMÿ&щĐĂ™Ï̉½“¹ƯN´ƯƒØ߈îDĂôÿÚ±»Û«‚ ½99¥‡Ï̉Ÿ߈§ÔÛ«‚ ½9‹ÙÙÚăˆŸ;k™ơå̉ œ‡¡Û«‡“Íj™ëéåưÀÖ¨Ô†¨6¨¦j¨èê·Åa·Ó ¥0ù¿ÖĂµØ…ŒÛ׻؉^™‰kß [ïSß„ôpg… ›¾ñÖª‡’̀jÁ̉ívÑù×óÂ÷ÙÚWŸÄăˆŸƒµßŷű¿«‡“Íj¹Úƒù×Ûº·¯ÁÜÏÚ·Ô™»™Á†đ5ɇÙ½ÂÙ ²Øµ†Û«‚ ½9׿8¶‡Ö8æ«»‡x‡ºỞ±»«‡“Íjù×ßÅ®GøÓ½Ïåö÷êÙÚÙÚ’‰H2HHÔ,HøHëÔ˜‰j̃ZîSẵưÀĂÙø×ÚÄ̉ƠX« ©ƒ»5¬ÔÙ׃ăơưÀ¶‰Ưºă»đÁÅÓñÓăà“ƠÓØ±‡×µaƒvG½¹º½ÿ+µÜ8¤‡ơèÅôêÓÅßÖî̉µ†¹½¾Åá̃§ÔÏÅñÖ•½Á·‡‘×8祈]1ăàïÚ±»ÛÚ¯¼Ë¿ăˆŸï½ăˆŸ»ºÍÇæØ±»½¾¯¾²ƠÁñ»º•ưÁ±»ív•ÇÖÛ«‚ ½9­Ä›¶é¯àǺµ‰üÓëö߈ƒÖÅ̃ÄØăˆŸ;kĂíÖÏÔ‹ÛÓ·‡‘×8çÏÔ߈ÂÓØ“Û›¾çô±»‡º¶Ô¹Ú¾½´ƠÛ«‚ ½9ù×™Ó9¥‡Ù̉ùשˆÙ½ÍË)éÛ9¥ù×Ă٭Ľ»—¶½€÷‡“¹ƯNÛ«‚ ½9…%›¾·‡‘×8ç߈·‡‘×8çöÔTå̉ º«‡“Íj“ỠŒÚ,‹ÜÏÅ»ÜưÀϱÁƯù×罫ÔíêÉĂáç‡Û½€Úª‚ +¼9߈¯°™‰kß [ïSíÜôêơ»ƒ½ϼçÚÓ Ë̉ÙÚèçđÁÓØ¡Á÷ÁÏÔ·‡‘×8窻ٽăºíÏÄ…Û£ØƠîÛ½è߈ÂĂ“ƠÙ½‹Ç¹Úƒˆ‘Æă»öï³2¯ÈÛ«‚ ½9“Ơ¾¢ÈñuÇuϼ½¹ÚÁƯ©ƠÎÅ„ôÙÚÎÔ§Ô9¥‡Ơ«Ôƒv«‡“Íj½ôơĹڸÚá́̃ÄØôê“à›¾ùêÛ«‚ ½9ÁƯ±»ǽ̣ÔûÓª‡’̀j׿8߈áÓ£Ó׺8¤‡ Ôù×·‡‘×8çŽÓÔ߈­•·ëöÙÁáê×щË»ˆŽăàÍIJ ơÙçºÚª‚ +¼9©‡¥2ßëMçÚÇÜ›¾·ÔÏŵءƠéºÍ`ñÚù×Ö¹£»ƒ‹Ç»‡Ϲù×Á°È₫˜‰j̃ZîS½èÍƠÀö·‡‘×8çå̉ âˆ:™‰kß [ïSăˆŸÛˆù×­Ä%…Đ“Ơ™‰kß [ïSÖ̉ëö¡Ûùê»Ø¼™ëéåƒv°»‰Û±»ÿ­ÁÛÍĂÙ¹ÚÍß±»Ó¾ßÁ™ôß»ûº½ ¨ŒÛÜÑÄëêöÔơèÅ̃ÄØ¡Ûï»Ϲ™ëéåÿÚ¥ÇûºĂÖöÇ»¡ÛÑ+ÏÅÙÚ±ồÊ)èÛ8¤‹Ç∫‡“ÍjƠ™ëéåÙ½µØĂȳۺµÓ™‰kß [ïS½›¶éĂ]«‡“Íj¹Ú€ÙÑæµØăˆŸßđ™‰kß [ïS©Çív±»íØùÚ“¹ƯN—ɧƠÚª‚ +¼9 ƯÓºƒÚ́½±¿ù×·‡‘×8穇¥2ßëM÷Á½ÍÓƒ™‰kß [ïS·Ó ¥0퇾ëö©ÓèêÓØÛ¹ÚơèÅÁ̉ăˆŸ;Ù½öÁ™‰kß [ïSăˆŸôê ăˆŸ;߈ëö˜‰j̃ZîSËÓử߈ăˆŸ;k™‰kß [ïSÇ̉±»ÿ¼™‰kß [ïS½ÇÖ¯Ö¿ôå̉ ™‰kß [ïS›¡Ù½˜‰2j2̃2222Z2îS2«dgº™‰kß [ïS̃ŒÚ,ƒv¹Ú9¥‡9¥‡ĂÈÈĂ +ÏÅ¿àéÓß»ûù×¹Ú›¾ơêëö½«Ô߈¹ÁæÚù׫ÑëöÛ½ëÛ«‚ ½9ÂÙµØ÷ÁÍÇç$ăˆŸÏÔ9¥‡ëÓ†“‡ºưÀÓÓ«‡“Íj°»‹ÇÙÚăˆŸív“Û₫&¼ØÙÅë߈³ºóô›¾ÄÁ™ô߈ƠăˆŸäÁÉĂç'©ÓƠXÑó¿»ñÓ߈Ơ••džx¹Ú Ëû˜ơ<£ÇÓØåŒ¿N½¿º±»ơèÅ…Û”ÇÏÔñÖÍÄơÔÛÀׇ½7÷Áƒ×ăˆŸ;këöÿ¯¶¯È½Ă߈ƒù‰“Ûä̉ÑÄëÁù×ù×½ívÿ¯¶ƒ½ÍƠÛÛ«‚ ½9ÙÚ±»ïÚÁƯ߈ÑӳȕÇÂßÁÛ×óÔêöÏ̉¥Øù×ä̉éº×àÅ ‹ÇƒÖỞÁ¹ÏÔÎÔǺÛ×ÚׯÅÑ»ơêăˆŸ«Û匿Nƒv߈ÏÔ™ÓăˆŸ¿ÇÓш×¾ùÚÔÏÔÎ̉™‰kß [ïSơÔ…aÛ«‚ ½9ĐĂ¡Ç±»ó^î»ÏÔ߈%Ë%ơêù׳‹ÓûÓщÓ‡ơêĂĂ ›­±àéM±»ëö¡Ô™Ôù§¯Û«‚ ½9ùë³µù×Ï̉щưÁ†×Û«‚ ½9Å»½ºØÛ«‚ ½9ÙÚù׿¹Ăô¾Aù×ĂÙÛ«‚ ½9ÏÅ™‰kß [ïS›¾“—ăˆŸ±½Ó¾±»²›ƒv9¥‡½™‰kß [ïSăëö½ß%Ú× +߈ùט‡ÙÚ³ÈÎÔø&ÏỘÂå¼ ™Ó·̣ÁĂ™‰kß [ïS«‡“ÍjÏÔÛ×¾ïÑͺ÷Á«‡“ÍjÁ|ÍÓÛ×ÙÚ÷ÚơèÅå̉ ÏÔÄôăˆŸăˆŸ;ơÄưÀöÁψ€ºχ‚v‰ơ«‡“ÍjÁƯÚ,ëöôê­ÖÜô¾«‡“Íj­ÖăˆŸ·ÔÛơƒvºÍË)éÛ9¥ÏÄæù×ï½ß»û‹Ç‡­‡ƒv¡Û¹ÚưÀú ẩ±»« ©ƒ»5íê§Ó±»cÿڼǢ™÷ÁÉ̉›»ñÚ£Çß»ûù¿‡ŒáêÓëöăˆŸ9¥‡×åôívׯ麙ӱ»«‡“Íj‡xøơÑÓ©‡¥2ßëMăˆŸ°»ÛÔͽÙ½ÅăˆŸ˜‡Çú̉Ÿ}•ŒĐÄêÑØªd“ƠăˆŸ;ŸÖ«‡“Íjﻟ}ºù×Y÷Á±»µØ±»Ϲ屿߈ÙŒë*«¡ÔăÁơÔÍƠ±»ƒˆÙÚ¹Úµa9¥‡·‡‘×8çʹ³ÜăơơÔ§Ø§Û½ăˆŸ•߈ơÔÚ ª ‚  + ¼9 é‡߈ÏÔßå̉ •Ü₫Ǵص‰ŽÍË)éÛ9¥χ™‰kß [ïS×ƠµÜ߈™‰kß [ïSßÄÙ¹ÚÏÔ¿‰—¶ăˆŸ߈߈áêÁ׋ÇÁƯăˆŸ;Ôºl߈ÇÖ‡ŒßÖåõ†ÚÀ匿Nμˆ™Ü ËûÉĂÑÓ©-°½Û«‚ ½9©‡¥2ßëM±»±»³+޳ƯÓ Ù½ÁƯÍķųØ÷ÁÛÆù¿Æ%Ởùדț¾›£»Á̉°»ׯ½Ûטêè䙉kß [ïSïƠºßÚ·¼Í7ËÉ9™ÔưÀóăĂÙÏŹڷƯ®È³ĂưܺáµßÖï½߈¾Û×ùןƠăˆŸ»‡±¿‹Û‡íÆù¾Û×¥Û½ù×ù×ñăÖÆÙÚ‰Û€Ư«‡“Íj¼€2ơÔá¤ù×ưÀ¹Úùו»ăˆŸ;kưÀ§Ưºy«‡“Íj£Ø²Â„Øơñ»­¾‹Ó· ̃ˆ›¾ù׃ºÙÚË̉¿(©ÓĂÙ°½ñÓ8¤‡™ºшñ£Ó¯È‚¾öר…D™‰kß [ïS¶‡Ö8æƒÖùæ››÷ˆå²Ï̉²™‰kß [ïSψ·Û߈ÁƯ™Óéê·‡‘×8çÇÖ¬¾½›¾ØŒê*ª·‡‘×8çỔ½œÁơê‹Û臥ÆăˆŸ;©ÓÅØ£ÇäÆÙ½½Ôơêö߈ïiºÁ×±»ÏÔáÓ­ÖùêÙ̉ửƒˆ¢È§ôăàå̉ ï½Û«‚ ½9È™‡ëö­¥ÍÄ‹ÓëöËÖÍË)éÛ9¥×ĂÏÔ߈™‡ăˆŸ;߈ăàI®×ÛêÓØù×½ăơɹơê§ÆööăàÛ«‚ ½9±½ƒvÁĂ“ÛÏ̉߈½ÍË)éÛ9¥„ô­ơÅÁ½™ÓéÚÇÖô™‰kß [ïS̃ˆÅ—¶‡ù×½€œ‰¾IÅÔ/›Ôóơ»ôшƒ×߈“Ơ½¨ºíÖº˜‹·Å°»ÏÔŸÁÛ×Ç·Ù½ÏÔ9¥‡›v¹ø×‹Ü·‡‘×8çÏÔ™ÓëöÅØ¡ÁƒÖ¼ÅÔ÷_Û«‚ ½9çØ®Ợ½߈üÀ́v±»ÛưÛ«‚ ½9÷4¡Ô‡‘ù×ăˆŸù×ÁÓñÚëöñÚϘÁ“¹ƯN½™‰kß [ïS߈ăê½€µØ™‰kß [ïS…»¶öÁ±»×¾ƒvĂÙ˜êè䩨ªÚÿ¯¶ơÔ‚ˆɇ÷‡ÙƠƒvÙ‡Ï9…·ØÙÚº‹ÜẲ¦Óù׃½ùêƯåÛ«‚ ½9ÏÔç½çº߈»¼‘½°»ÍB¹Ú߈ÏÔƒˆ‘‡8¤‡¡»Ăô«‡“Íj«Ó±»ƒ¾‘ơÔ­ÖÙÅëÁ¹…ÛӾŨưÀƒv±»κ‹¹ØƠ’¹ÜN₫ ®¶  Ơ·ÂÙÚß»ûăˆŸ߈·‡‘×8ç£äÛ«‚ ½9±½±»¡Ç«‡“Íj™‡8 ¤‡ ×đ»å̉ Ü—ˆ߈ơê…öâÛëÓå̉ Đñ»Ù½Ăö8¤‡×Ï̉÷‡½€µ†­ÓñÖïƠÍĂÇå̉ ™‡ĂơÄưÀç)߈›‡ƒvÅ–§ôƒ$ß„9¥‡ºØ¸Ú¥È™ëù×߈ù×Í­HÛ/Ù½ùæÅر»§Ô½£Øï½ăˆŸ÷ˆÂ¥¾«‡“Íj—¼ÏÔÿ¯¶å̉ ÿ¯¶çÚÍƠá=Ǽ«â¹Ú¡È÷ÁëöÏ̉²º̣ĐÓ Û£ØµØƒˆ¥ÛÙ×߈Ó̉ơê¥<·Ô߈ĂÎͨù×ÛÄÓœÁ±»¶Ø«»«‡“Íj—¶„™ëéåÁ̉«‡“ÍjÛ–¿ñ½™‹ù×Ú׺ª‡’̀jăˆŸÂÙèê£ƯÏÔçÚ±Á½¡Óñ›Úª‚ +¼9ưˆ—ÓâÁ+ÏÔ£ØÑÓÏ̉‡º߈µÀù×¹Úÿ.9¥‡ź–¶ÏÅ©‡¥2ßëMĂÙœÁ߈9¥‡Á‡é/×:ÜëöËÖ£Ô¯ÛÿÚívÏÔñ±»á£ ẳơê₫« ©ƒ»5‹ÜơçáØ³È§ØèÚ™‰kß [ïSö±½û̉ÙÚ©‡¥2ßëMÁƯ©‡¥2ßëMÅÙÅëù¿¹½ĂÙéÓ¹ÚÙ̉Äô“¹ƯNëöÍÓùÚ¯àÅ–ÅÓÇØ9¥‡·vÅÓø×·‡‘×8çéÓƒÀ‰ÛÙ½ăơ«‡“Íjöêö߈«‡“ÍjăˆŸψÙÚ™‡±»ĂÈÏÅùê£äé‡Ù½óŒ¡ÁºØăˆŸƒvÚª‚ +¼9±»8¤‡½Áăà¸Ú©ÇÏÔÔ¾F߈Û«‚ ½9¹Ú¼Ë¿ÍÓö‡߈ù×›¾ÿÛ½î‡ăˆŸ́½́ơÛ«‚ ½9ù×ƯeûßÄÙ«‡“Íjƒv Ëû˜êèä±»ÙÅëùê®×‡ÅÓ߈Âù×Û«‚ ½9Ú ª ‚  + ¼9 ÙŒë*«Æ’¡ÔñÓËÉ9›¾ºƠ½Ù½YƠ×±ÁÔöĂÙ½³ù×…öíêăˆŸ;Á̉ăà™‡ÑĂ3ÏÑÍÓëöë¼ơèÅØéºœÜÙ½¯ñ?Ž­Û¡Á¼ ¶ơ꫇“ÍjÚª‚ +¼9ƒÖ…%ÁƯÍÓ½߈©‡¥2ßëMÙ¾Û«‚ ½9ơăˆŸ;­RÍ®G ø ™‰kß [ïS™‰kß [ïSïÅ%ƒvÎ̉ÏÔ…»½Ž±¿ëöív½ƒv½Ô½”ÍÇĺ¢X¾ºÙÚÛ«‚ ½9ߦÅÔû¼¡Ô¥ÜÙ½ëÓóËÇÛ×8¤‡߈‚v©‡¥2ßëM¹ÚăàÅ–ÿÚÎÍ߆øª‡’̀j©ºWùןÅ9¥‡å×ÅÓ“½«Ó›¶éƠ§Ó¶''•%ÏÅáê¹óÏÔÚ×›vçÚÁĂưÀ¼ÈÛ„†Ç«ÈĂ蓺™‰kß [ïS…ÔơêÔº!l!•Œ±»›¾ź‡Ç¯È¡Áù×î»߈×Ơ¹ÚÛ«‚ ½9Û«‚ ½9­v÷ÁºÓºëöùºù׃֖ؿ‰é‰ñ5ñ·Ă‰Û²Ô±»çØá ߈₫çÚ¿¹êöÇĂá°ù׽ŨƠÅàÜ®Ơ‰º½Ơ«‡“Íj‡̃óÂƯºų…Ơ߈̣ÂØÚË¿߈—Ó‹ÈơĂ©‡¥2ßëM¾ÍË)éÛ9¥éº™‰kß [ïSĂÙ—¾·Å¥ÛÛ«‚ ½9±”‡ÛÍƠÅØù×±»Ăâ­Ô‰¿I¿å̉ £áÓÅù×ƼĂÓßÄÙ·ÅÙÜ«‡“Íjó‹Ç·ÔÀƯ߈Ï|­ÖÉĂơ»Ž†Œ›Úäv¹Ú«́áƠ±»ƒˆ¨º&™‰kß [ïSÑÓ‰Á™ÁÆÓ©¼ÑØ÷ÁíÖ«‡“Íj߈½ăˆŸ;ÑØó¯¼Ă߈–ÓɇÁ‹Ç›/¾·Ôµ†÷ˆĂÙŽù×ÓÆÍÓÓÔ«‡“Íj߈³È±»‹Ç½Á‡é/×:ç»ƠŵØăˆŸ;Ơª‡’̀jù׿ß麙ÔĂôùê§Ó³ºóóñÛ«‚ ½9‡ÛßÄÙ߈÷Ú±»…ơê߈º̉ÙÚ©Ó÷å5Ó¤ˆ\0Á߈¥È¿àÓ¼¹ÉѾ‘ñÓ°½ç̃ÅØ–ÓÁĂÛ«‚ ½9¹½ăÇí߈×¾Ï̉Ư%›ÂÁ̉¹Ú°»ăˆŸ;k¼ëöµ‰ăÁơú߈Ử£äù×ù×ÏÅ¿́ª‡ ’ ̀j ăˆŸ©¼…Ơë×ÏÔå̉ Û«‚ ½9¾Å ¿àÁï½±ëØ¥Û߈é꾪‡’̀jôÅn·Ü—Ó߈‰ÛËÇËÖ™‡Û«‚ ½9åôÓ ‹›æÍĬ¿Îž™‹øô×¾±½ơºßƯ©‡¥2ßëMƠßÏƠ•×­Ä…»÷ÚóÇÎ̉·Ôɺ¨¼ ï½¥‰ÍL…Ơ߈‹ÜƠƒÖ½€ăˆŸåçô¼¸)»ă©ÓºÅùêăàÛ«‚ ½9éêăˆŸ½³àơèŰ¿ ÷àÏÅëöÈ̉Mèê½Û×ù×ö›¾×½ưÀº¥ÓơÔ«Ô¯ƒ« +>âơăˆŸ;9¥‡ˆÙ½ÅÁÇÖĐø™‰kß [ïSö½ÇÖçô—Û©‡¥2ßëMÙ½Ù̉Ûà‰¿I‡ººăˆŸ;k—¶Û«‚ ½9íêÓà= ‹ÜµØëÀ‡€è/Ö:êÚ8¤‡×ăà9¥‡ù¼ψ¡%½Ô­vù×ËÓç™ØŸÈ·̣ƒÔ›¾½©¼±»éºÙ×»½«‡“Íjë¼ÇÖƒvíºÁÚ«Ô߈±»ß»û߈¶º µơ™‰kß [ïSƒÓد¾¸Ú«Úëöëöß„íäÑÄë·‡‘×8çÔXô÷,°»‡Œ9¥‡¥Ö߈ùׯÚ×™‡ăÁ¾¹xÏÅ“¹ƯN™¤ĂÙëôñÚƠ¹Ú÷ÁïƠ§×ăˆŸĂ½¡ÛÿÚÛº§ƠÚ»#ö#Åăù¿©¼ù×̉ÅÛ½ôúívÿÛí‡̉º« ©ƒ»5áêÏÄÛ«‚ ½9«Ñïôë¼—¶‚v*9¥‡›¶éƒ—½ă¼ô$±»Ûºù×ëö»‡ÏÅíÆÙÅëÛ×Ë¿ù×áÓ«ÔÓ¾ÅĂÙºù×ÏỒÊ)èÛ8¤¿º›Ă÷Úƒˆ‚v©ñÖµØÍÇÖ¹Ú‰Û™”‘ÆÏÅóǃvëö£Ç›¶éµ†¼½ÑĂ߈°»©ÓÔÅÓ±»Îá ½ĂăˆŸ;ÏÔ›¶éơ“ºïƠËÉ9ÙŒë*««ÔÁƯ‡Ççóï«¡ÔưÀÓ̉߈ÏÅÛ×ô±¿÷ÁÏÔ¥‰ÍL…½8¤‡Ö‰¿IïÚ߈¥‰ÍL…û÷Á«‡“ÍjÏÄ̉ăˆŸÏÅăˆŸÅ™‰kß [ïS±»§Ø¡Û·‡‘×8ç±»ÖÆÈ¹Ú÷ÁưĂëÓ§Óɇ­ô™‰kß [ïS·5ƒÖÙŒë*«ƒˆ¥Ó₫®¶ÙÚÛƒˆ«ÔÊÅö‘¡ÿ¯¶Ë̉ăˆŸéÓç̃“–ùט‰j̃ZîS“ǼÛ™•Œ€ºº«·3uUø×ƯăˆŸ¸Ú·‹ơÔ°»›¾Ç'Ơù×ÀƯ™‰kß [ïS¹Ơ™‰kß [ïSẳ‹Üë¼ăˆŸ;kĂÙÅÄçôÇÖơèÅ8¤‡×éÔ·‡‘×8çׯ·Üٽŋȅ®G ø Ù×ơêăêÑÓÿ×Û«‚ ½9™‰kß [ïSÛÄÓ¿ƒàëö߈…Ơ±»߈÷Á¼ÔĂĂçôøê߈‡ÚóăˆŸ;ơê¹Ú£Èï»ÏÅÁ×ÏÄö¶ÏÔ£ØÿÚÏÔư§‡æ̉ÛÀđÁơù×ö™‰kß [ïSÑÓĐØŸĂíÖï½­Ä¿‘±»Û«‚ ½9™‰kß [ïS«‡“ÍjÜóñƯỔÙ½™ëéåù×ỞÂù×Û«‚ ½9ÙÚ™‡Û«‚ ½9ׯßÄÙĂÙÁĂu±»Ơƒ¾‘ô麬¿ •îăˆŸǾ÷Ù³¹£äÅ–‹Üù׃Øâˆ:“Û¹Ú±.Ú×úư‡±ù1£äû௾ÓíÆÏÅĂƠ«ÔÛ™×߈åĂóÇ·¦D* *ôŸÅÙ×ÏŃvÅ»ÿ¯¶¡Ơ«‡“ÍjÏÔ²ÂÛ«‚ ½9ü̉ÅáØï‡™‰kß [ïSÿ¯¶¿‰×ĂÛ«‚ ½9ù×ÑÓ«»¡Ưă½³Â‹È—¶ß»ûơèÅ™ëéå±»ÓÅå̉ éºͼ°»«ÔăˆŸơê­Äº…Óï½ơêΗ¶Ç÷Á¡ÔíÖçÚ©Óă¶íêëö-•{¡ÇÍÓ“÷‰¿I€Ơ•!ưÀ˜‡ËƠ¿º«‡“Íj¯È…»»½ù×ɶÓù¿ñÓ…Û«‚ ½9¹Ú¾³ÇµØµØƒ¾‘½Ưg»‡½Üáꥈ]1߈áê¹Á߈¯×ĐÓ«ÔëÓ߈—¶û̉çÚÏÔ«‡“Íj»Ø·‡‘×8çïÁ£Ç“¹ƯNÛ«‚ ½9ù×ιñíȽ€àˆ"À0"p"ïƠ×¾Ù½©Ø‘Æ·ÜçĂ˜‰j̃ZîSơꙉkß [ïSêöó¶™ëéåÛ«‚ ½9†Œ©ÇăˆŸ;©)ÑÓ«‡“ÍjœĂ±»öêÖ‰Û¹ÚéԭĬÈ/߈ÏÄăˆŸ;«»°»˱öÙÚ½€‹Ùˆơ%¹Ú±»ÍÓÙڋܱ‡ĂÈÑÓ£»ºïŹڷ#·ºö¯ÈÑӃ׃Øọ́9¥‡³Û¿ºÿ$ˆ¤Ó9¥‡‚Ö»½‡“Ç"Û«‚ ½9ç«߈•Œƒv«Ô›¹¶Ổ­Äëö³Ü¾¹xÙ̉ƒÚ›¾Á‡é/×:Ư‰£ØÖÔ†6¦jăˆŸ;ÙÚưÁ‡º«‡“Íj›¾çÚ™ëéå̃Ö·Ô“¹ƯN“ƠÉ̉ùש¼êö©‡¥2ßëMåñ¿÷Ú÷Ú™Á‰Ô§Æ˜‡±‡˜Á +±»£Ç¡Ô—»öăˆŸ;×ÈơĂơèŃ×ÿ¯¶à½߈Ï̉ ÛÏÔÂÓ¹ÚÏÔ߈ƒ߈ù‡íêÁ×Ơ˪ÇÏ¡ƯÁĂŸ}¥ÁÚª‚ +¼9ùơéÚỞù×ĂÙƒvø×ÿÚ×ƠñÚưÀÙÚƒv†ÚY߈ßÚív±»³ÈĂÙá=ăˆŸ;ưÀ«‡“ÍjíÖù×ÏÔ­ÖăˆŸù×ù×ßÄÙù׃vƒveÀ뫇“Íj¹Á½ƠăˆŸ‡“ơÔµÈY›¶éÅÁƯÓ Û«‚ ½9á ƒvăơµØÅØ—Ö×Ơ«Ô±»¢Ó Û«‚ ½9™×ÙÚ¯ËÇ›¾ŸÈ±»ăˆŸ«‡“Íjù×ëö‡Ç߈½ÅÓØÇ"ÓñÓ¹Ú±»ñÓÛ×ăˆŸ;±½÷êù×Ú~£Ưƒ¾‘©ØÛ«‚ ½9Ÿè«%ÿÚøê«Ôƒ½Û×·ôƠá=ÏÅÛ«‚ ½9Å–­¾߈߈­Ä¿¢—¶åĂ¯È‹öƠÓÙ¥ƒˆƒˆ½ƒˆ‹Ü±»£äÅÓºù×Í×ø×±”ùA™Á½ù꺇±»±»ˆ½ÍÓ™‰kß [ïSÏÔÙáđĂ¼€ÙÚù×Ñø«‡“ÍjëÓÁƒÚ½ơĂ™‰kß [ïSµĂöĂÙ½‚½ñƤة‡¥2ßëM «Ô߈ÏÔ¥ÛûÏçÚÏÅ›¡ă¡È9¥‡×·Å—¶ñÛ«‚ ½9ăàïÀ¼ƒă¥ùê±»ÏÔï‡Ơ¡ßÁ€ÓßÄÙĂÙÅôÅ»ƒ¾‘Û«‚ ½9Ï)œø·‡‘×8ç¾ÅÏÔù×…Ûá©Ơ…Ö”ĂÈ«‡“Íj¿‰‘đ¹ëÙÚĂ¼öÿ¯¶ÏÔ‹ÏÅÓºËÖ™Ó·Ô™‰kß [ïSÙÚ¡Ô‡ºÏÅ™‰kß [ïS߈÷Á±»ÑÓÀ‡€è/Ö:ÿÚĂºY¯¼¥Æ—¶ưÀŸÛ•˜‰j̃ZîS‡9߈ÿ¯¶ºÁÛ«‚ ½9ËƠƒvƠXăˆŸ;±»¡ÈÿÀçôƒÁĂù×g¯‰¯0‹ÈË”₫­ˆ¿ôƠ­¶ăà€ö“Æ«‡“Íjôأǘ‰j̃ZîSơꇺ©ØÆ̉©À‰ÛÁ|¶Á̃íê³Ơ߈ëöûØçºăˆŸ;Å»»§ù×ÏÔ·̃ùÚöª‡’̀jù×ù¿÷‡ÏÔ¾߈ï½µ8ÏŰ»߈½ùיӇǷÔÁƯ±¿­ÖÙŒë*««‡“Íjï½™‰kß [ïSăˆŸ¹̃«»½ÅØ©¼‚v§ÔëöÁ¸àKùêµØ§ÙƠëöÓÍÓù׎ÅÓëơ°È ăˆŸÖÆƠºmƯ…‡«ÔíÆ³È¥Ûƒ½«ÔÏÔƒv°ÁµØ \»ØרÏÔóá©ÜœÚâà ùêûăˆŸ;éºËƠ•ŒÍ†Œ…a›Ú³ËǃvëÔ»Áç̉‚ØƠï½—Ç…Ö©÷ÁßÚùêí‡Û«‚ ½9¼Ă‡ŒÛ«‚ ½9Û«‚ ½9ÏÔơê½ØƒvÏÔûÉ‹¿½«‡“ÍjÛ«‚ ½9™ÔăÁûœǽơêåẴ„߈·‡‘×8çÏÅ…øëöíÆÙ½Û«‚ ½9ÿ¯¶»‹ä̉ƒvŸ»ߌÛ,“ȱ»ÙÚô¾Ïåå̉ đÍÓ°»Û«‚ ½9Óà‡º…Û÷‡«‡“Íj½ư“ÏÄ×ÀËƠ¶F¼¹Ư鱿Ŗ½™‰kß [ïSÛ¹™‰kß [ïS„¢­Á×ËÇ®Èâ¼³±Á߈™‡¶‡Ö8æ߈ñÓ©-ׯ±¿ăˆŸ;êÔÓÆµÜ§Ô™‰kß [ïSơêµaÏŃÖÎÅóÇû̉ô߈ßÔœ‡¿ß釷ԇŒöÁĂÎÅï½ÙܳƒÖËƠñÖăˆŸ;Ûׇ۪Ú×Ü‹Ụ̈ǙӣԩÓ×¾ÓĂȃ×ơĂ›¡Á‡é/×:çÚ±»ÙÚÚÀ¹Á +´† +«»߈µÁ·ÅÁ½öô›¾ÙƠơêûØ•Œ˜‰j̃ZîSûƠ½å¼ ăˆŸ;kóÇÙ×8¤‡£äƯÓ êö∛¶éöªÚ½‡×‹ÙÛ«‚ ½9ÙÚÏśڽ‡£X߈¸Ú±»…Ơ釛 §Ø߈߈ëöóÂù×°»½¿‰íƙә‰kß [ïSÏÄôØĂĂ ›­±àéM¿ßÛÇ—»ĂĂ ›­±àéM‡ŒôÔ†º¹ÚÆ̉ù׿ßáƠƒvơê÷Û«‚ ½9›ÓöÁ°»·ÅùæöùפÛí¥ƒ½ơÔƯơ⺶³(˹ËÓ×¾ëö£ØÓ¡ÁǺÍÓÙ×߈°»ßÄÙÏÅưÀؽÛ«‚ ½9ÏÔ­ƒÅóå̉ Ăèê$“Æ…ƠïƠ«‡“Íjù×Ó̉¡Û¿º·ºƒ¾‘•̀Ê)èÛ8¤Ù½ÑÓ©‡¥2ßëM߈Á×ÏÅ¥Û÷‡¥ÛăˆŸƠưÜÁ‡é/×:ăàȺÍÓ›¶éẲßÁăˆŸ×܇ŒóÙ«‡“Íjù×ûÙ°¿5±»߈ÏÔ‡Ư‰ù׫×ÍÄÙ½߈±ŒÏ̉‰·½ĂȺ…öÙŒë*«߈Äû”ÀĂø×߈ÙÚËÇăˆŸ;‰¾ú(ëÚ¹»«‡“ÍjûÓÅôÙ½ÈÙÚÿÜ߈›Û¹!“ȓƯ×Ù½›¶é¹”±»¾ÚÛ“ăˆŸ;kơêå̉ «‡“ÍjưÿÚëöº©ÜÚª‚ +¼9áØµ†ÆÄÅîƠ™ÔÑÄëăˆŸ;k÷ÚÙÚ8¤‡ÖἇóŸÈ­€ưÀµaÿÛ™Á°»Úª‚ +¼9§ÔñÓ9¥‡×ưÀøê”Œ‡¿Ơ߈× ßˆĂÙ½Ô—»Ï̉¼«‡“ÍjÙ½áê­Ä9¥‡«»½ùëÏÔÏÅÄÏũ؇x‡Ç¤Øéº“ºÁ̉ׯƒv­¾ơÔ¿ÅÅÓϼׯÅÅÔ߈™‰kß [ïS½€ƒ¾‘æÚ߈kܩƠ“¹ƯN™Ôå̉ Ñ󃃈ÎÅ«‡“ÍjäôÅĿ߫»±»ëöÛ«‚ ½9×Ơ¼çƒÖ™‡Û×ÏÅéÚ¶ ơÔ£ä‹Ç§Æ߈™‰kß [ïS÷ÔÄôßÄÙï»’¹ÜNăêù¾ơÔÇ֬֋ǃÏÔÁ×ëöÛ«‚ ½9…Œ̀Äÿ‡¹Ôà“Æ½€÷å5Ó›¾·È̃„÷‡’ÈëÚÿڒȶïÚª‚ +¼9̃ˆ·Åº Ö†‡ü2ù×å׋۽åÁÙÅëƠÍ ¡¹Ú»Ă«‡“Íj±¿ăơ·‡‘×8ç߈Û«‚ ½9‰¿IµØĂÙé‰ñ5ñ·ØéÚÑÓ˜‡¿ôŸÛß%“Ơ³¾­Ö°Áéºù×ĂĂçôÛ«‚ ½9‡“ÅÄÙ½©ÇßÁ›¶é•4±”áßÚ߈5Û«‚ ½9଀ÄÍĂÛ«‚ ½9—Ó°»$½±»çÚÅÔƯÓ ‡º•ÖưÀ©ØϺñÓ€ÍÓÏÔÿ򴯿×ÁĂ˜‰j̃ZîSƠŒ¾Å“«ÔÅØ‡Ú£Ç›Û½ÙÚ¹ơÔÙ½±»‡Ç÷Ù‹Ç«‡“ÍjÂƠÍÓơÔÓ¼ÍÓ¸Úö¾›¾Ở™‰kß [ïS™ëéåà=רщ£¿°»‡ƠơĂ‘Û«‡“Íj÷Áù×ÑÓÙ½ÅÓ‡±Á™ÛÈÙÏÅÙŒë*«ăˆŸ­ØºÉÖ—ÓÛ«‚ ½9Ѿ¹Ạ́‡xÓ¨»¥¯¾Ùׂ½‰Á±‡ù¿±¿¤ˆ\0½̉ÅÖ̉ ­ÄÚ×·‡‘×8çÀ½ƠÔX÷ÔÿÛßÄÙÑĂĂهǵØç̉íê«Ú8¤‡×߈—¾÷ÁÇÖÿÚ±»ăˆŸ¥‰ÍL…µØƒéºñڙöӓÈö½™Á¹ÁƒØÀơùëÿÜÁ¹Á̉÷‡ÓúäÔ™‹Û«‚ ½9Û«‚ ½9™‰kß [ïS¾ÛÄÓ»yÙŒë*«ĂΣä—Ó±đëö©Çù×™ëéåù×ÏÔƠXº½ÑÄ뫇“Íjëöù×Û«‚ ½9Û™Óר˜‰j̃ZîSëöÿ‡ƒv•ŒăˆŸ;·éӯȽØï½ø×ĂƠƠ¾¹xéàÏÅù×ד¹ƯNưÀ˜‰j̃ZîS÷Úé‡ăˆŸôĂ¼›¾÷Úơ…ù××¾ûÓ߈́ÚÖ¾ÿ¯¶Ùר¹ÚÙÚÛ«‚ ½9Û«‚ ½9•½ÓÏÅ«ÓÁ́½̉º÷‡÷ˆÿÚÙ½đ÷Áơꩇ¥2ßëMÓÅă¡Á¥Æµaö«‡“Íjôƒv÷ÂÚª‚ +¼9ĂĂ·‡‘×8盉ÏÔëö¹Ơ½ç¡È̉½߈›¡߈û¹ăˆŸ;ÿÚÏŭăÿ¯¶ÏÔă᫇“Íj߈©‡¥2ßëM™‰kß [ïS™‰kß [ïS·Ô«‡“Íj̀ÂÉ̉ÇÖµÈжùׇÇÙکǿř‰kß [ïSǼå̉ ר½ÜÀñÖ›¾µ.¥Ù«‡“Íj‹¶ỂĂ¹ÚÓØÙ½ëöỞ¨‡¤2€̃êLăˆŸ;ÏŧÓöϼÍÓ…Ơù×›¾©ÓÚ‡“Ơ߈«Ñ߈Ơ¸ÚÓÆ›¾£»ơễÚå‡߈©ÓÄÿ—ÓϺ¶‡Ö8æ÷‡ñÓÏÔëö‹ÜÙÚ¦Ó³ºóƒvöÎÅ¡Ư£X—¶±»ù×ñÆÿÚ´È/âˆùëÄØê˜HÛ×›Á¿áºÆ½å̉ ëö™‰kß [ïSăơÎŽåôôóǬĂĂшÛ«‚ ½9Úª‚ +¼9ĂRÓØɇơĐå̉ ™ôßÁ€º̀ñÚÛ«‚ ½9ăˆŸ;k•îßÚ™‰kß [ïSÄ–½Ư±¨‡¤2€̃êLËÉ9ÖÆƠɇÙ½°¿«‡“Íj߈×ƠƒvăˆŸ;kơê½åÁƠÔ“ö½ôƒvăˆŸ­€ù×·‡‘×8盾ÍÓÊǃƒv“ƠăàÛ×âà½ăˆŸ;¡ÔƒăÇí›ÔăˆŸ;óÄ™‰kß [ïS߈•‹HÏÔÙÅë臡«ĂƠăˆŸ;³Ó—¶µØ½ÏÔ¼ï³2Û«‚ ½9%ỞÎ +Û«‚ ½9χÑÓÅØɉ÷Á±»·$°»Ù×™‰kß [ïSºơèÅÿ&§ÔăˆŸ;ăˆŸ;9¥‡£ÇÛ«‚ ½9ÏÔ©ÛÏÔ騱»£äß»ûă¬È™‰kß [ïSí—G±Á©ØÏÔăˆŸ;ßÖûÓơĂÏÅ«¼«»Óر»Ă›¾Ù½±»¿ô±»×¾8麜 +©Ø­Ô½³È‡x­Ä±»ËÇ›¾¿ß÷ÙºÑÄëử8N¤‡NÖëö©-ÙÚÅÔ°”«»½ăÇí£·‡‘×8ç½Û»ÍË)éÛ9¥™‡ä̉»ØŸÖùׂvÑÓ—»™‰kß [ïS9¥‡×¿öµÇÖđØ ¨¼÷Ù¨"ửóǘ‰j̃ZîSïç¾Å½·‡‘×8ç¿ß½ĐÓ½ĐÓɽƒv³!·Ô•¾߈±»ÏÔ“Ơ÷‡ÏÚÙÚÏV߈ٽͭH°»«d÷¼­Ä‡º£Ç•%‹ÙÏԻؽ€9¥‡×ÿ¯¶ÀƯÏÔù×£@¥È¡È™‰kß [ïS°Áëö›Ưëñâơê½€¸Ú“ƠѶĂº±»Ơ™‡÷Áƒvùש‡¥2ßëMÛ«‚ ½9ÿÍ©ƠÍË)éÛ9¥ÇĂ—Óù×ĂÙ›¹₫߈ä̉¤%™‰kß [ïSÏÔơԯș‰kß [ïSơÔ™‰kß [ïSù룇¹̃ù×ĂÙ©¼¯¾ăÁ¹ÚƒàÛºÁĂăˆŸÓº§Æ½—ï¡È§ØơÔ“½™‡́–G₫ +®¶ +̀Óׯ‹±ËÓäôÁƯ߈ơêÛ«‚ ½9óǹڷۘ‰j̃ZîSÑÛ«‚ ½9Ï̉é‰ñ5ñ·™‰kß [ïS߈ÙÜ™‰kß [ïS9¥‡ŸW›¾ÙŒë*«ơÔÂ÷Á¶Ôщ™ÖƠ©Óëöß»û“ăÁ™Ô›¾‡Œ™‰kß [ïSÛ×Á¯´Œ߈åûëÖ™‰kß [ïSËÇë×™‰kß [ïS¡Èg˜‰j̃ZîSăˆŸ;•¾·‡‘×8ç½€‡̉ƠXƠù׋Èív©îù×ÏÔß„›¾µÏÔÙÚéêó%—áăˆŸ°»ÍÓ±»߈ï½®ƯÓ Û«‚ ½9ù׫âôÅ–« ©ƒ»5º½Åć꽩ÓơêÁĂÏ̉ÈĂëöÏÔ‹ÇÈ̉ï½Ù½ôéÛ«‚ ½9µØ·ÅâˆÛº£Ø¡Û Á¡Èơê‹Ç¹ÚơêÍÓ½€«·3uUÙÚ«‡“ÍjÓœ‡Å؃«»é܉¿IăÁ©Ó«‡“ÍjÚ½µÏ¿ǻv±»±½•Èû›ÜÓÆ¡¼ÁĂ‚×Ïŧ‹•Œ¥‰ÍL…³ ɇÓ´½‹Á¹ÚỞçÚƺ8¤‡«ÔÍÓ±»›¾­Öψµ†‡ëÚÛ«‚ ½9ù×ăˆŸà¡Ô匿NÇÖ­ÄƯÓ ù×Ưº́ÆăƠ±»ßÄÙĂÈ·Øׯ½™‰kß [ïS̉º±»ÛºåÁ½€¾ºù"ĂRÿ¯¶ÛÀáƠ™ÛÜÔơ ½ƒ¾‘±»¿½¢ ·ÔµØ±»¡ÁĂÙĐÄ8ê8Û«‚ ½9ÑØ˜Á߈¿ٌë*«½¿‰߈ù×–¶‹Ù›¹ß»û8c¤‡cÖ ™àÀĂ½ívíâ½·‡‘×8ç©À±»–Œ“ÈÄÓûÓñÚ’™‰kß [ïSăàÓàÛºí–G·ÔÛÄÓ÷Á½€ºÛ«‚ ½9å×ÔĂÙăˆŸ»̉ÏÔÖÚß9¥‡“ÈÔơÔ߈đÆùס԰ÈÎÔ±»ÏÔ½đÄÏÔ†º ëö“ö»ÁÇÖºí꯼ºÑÓ‚¾©¼›Û¾éÔ½ëö¹Ú¨Ó«‡“Íj¹ö‘÷‰¿IÅØÉ̉½›ÚëƠUñØÛÀâˆ߈ëöƒˆ›¾₫‡¹ÚÇưÀëöÙ½é‰ñ5ñ·ßÄÙ›Ü9¥‡¶èáêµØ¡Ôù׵ءÁ½‡Û­Ô±»߈ÓÓ³ºóßÄÙ«‡“ÍjÛ«‚ ½9±»§Ô¥âƒvùÚï½åô®×ƒv§¹ëö›Û¹Ú™‡™‡ÑÓ¤Ó}éêçÚó¶—º›¶éÁ߈ßÁƒÖæØ°»‹ÈÿÚ¡µƠÚºÍË)éÛ9¥›¾·‡‘×8ç÷j̃ZîSçô߈Ӻ퇱¿Ϲ½ô™ëéå‰»ăˆŸ;§ôÿÚ8¤‡Ö¹¼›\×ơ÷ 9¥‡±»Äô«‡“ÍjƒºÚª‚ +¼9µÙ̉ƺ¹ÚÍƠ¯¾™ôù×—¶߈µÄƒv“ƃˆçôôμ“¹ƯN¬Ö½ôÁ½Ẳ›¾©-±¿åĂ¾ôß„ÀƯÏÅÏÔ—¾…̃‡Ç±»«ÑÁ¾ï½ÛÄÓëö™‰kß [ïSøê±»·ôăˆŸ;«‡“Íjóă×¼™ơ«Ô©ÓÍÄ߈ƠÄù‡ëö›ĂùדÀ̉¡»Û«‚ ½9ÅÓỞÙÜĂ9¥‡×Û«‚ ½9÷ÁóÄÙŒë*«ßÄÙÀ½ơê߈»­Ö¡ÁÎÅă¼÷‡ÍÓÏÅœÁï‡Ûº·̣¯ƠÍÓ·‡‘×8çÂè·‡‘×8çÛ«‚ ½9ö¨¼ªÚÁƯöÓ¶ôăˆŸ;·‡‘×8ç“ÆëöÍ¿Ù̉麡ÈÛ×ù×߈ﻃØÛ¬ïÏÔƒăˆŸ;½€Ù#ĂƒvÍ­ëöµ†̀ƠµØƒˆÙÚù¾ç߈Ă¼™‰kß [ïSç½ÑÓ¡ÙŸ}ªĐ±¿8¤‡ËƠ«ÔĐÓ8¤‡߈9¥‡̃»úăˆŸ¨‡¤2€̃êL߈£Ô߈ăˆŸ™‰kß [ïS™Ó©Óùבֱ»ÅÔôÙÚ¹Ú́º̃»úÁËÛÄÓÇĂÏÔưÀưÀņ«Ô¥ÛµÏͼöÁ¤Ä¡ÔäĂ™‰kß [ïS‹Ü©ưÀáÁÏÅÙ½ùôù×Ăô±»÷ÁË1ơº½¹Ú—¶Å»™‰kß [ïSÙ׬¾ĐÄ ê ²”ÅÔö̀Ó8¤‡Ö£³ù¿ÁH8¤‡ÖóÇÀ½á¬«‡“ÍjÁ‡é/×:½ĂëöăˆŸ;·Ó ¥0™‰kß [ïSăˆŸ;ÓØ±¿‡º·‡‘×8çëöív₫ÛÙ½߈“ƠÏÔ«»ñÚÑæù×ùÏÁ½Û«‚ ½9ă»×¿8ÀĂ™ô—Ê«ÓÙÚ×ỞÛ«‚ ½9Ó̉ªÔƒˆă»­½¼÷ÁÛˆ÷‡ÙÚÛ«‚ ½9/߈Û«‚ ½9ñÖÏÔÙ̉ï»·‡‘×8çăˆŸ;û˜‰j̃ZîSÅÛíºĂÙù×¾ĂĂéÔăˆŸvˆĂٲر”öƒÔơÔƒÖÚª‚ +¼9߈µØÏÔ©Ǿơ±»9¥‡ĂƠ‹Áƒv“ƠéÚÛ«‚ ½9ƒvÏÔç̉Û«‚ ½9·§D «‡“ÍjŽŸÖù×ĂèưÀ±»Ïԭζ2tT™)ÎÔÅÙûØ™‡ïăöóƒ×Ơ±»ăˆŸ;º°¿™‰kß [ïS“ưÀÏÔ¶èÿ¯¶߈ôúºŸó¯Èøºшô‘Ÿ›¡¡Á˜êèä—ŒÅĽ€£Øå̉ «‡“ÍjÏż€Û«‚ ½9™‰kß [ïS½±»óÂá=Ï̉ى屋ӡÙÚ™‰kß [ïS¹½߈«‡“Íj€̉Åɼ۫‚ ½9RÙÚ§Ô8¤‡×߈ËÉ9Û«‚ ½9½©Ó»Óø¿™‰kß [ïSơÔ«‡“Íj߈Ó½›Ü嫇“Íj‰ÇÛÀÛ«‚ ½9ưÀ›¾ؽÀĂ“ÛµØÂèë×–¶±»đij¹Å–«Ô‘ÚăˆŸ;™‰kß [ïS‹Çù×ÁƯ߈ăˆŸ;8¤‡™ôÁĂÑĂ¿‰ÑÓù×™‰kß [ïS•Çơ½cưÀñÓ™‰kß [ïSưÀ́v½ù×ăˆŸ;ÑÓö­ơÏÔêơרÅĂơê°¿«Ôß»ûœ·̉ ¤0ÑæÁƯÿ̃ÙŒë*«ÏŘ‡Û«‚ ½9³Øù¾¬¾ßÁçÏÔ‡ÇĂÙG½¹çÚÓ¼ѶÅØ±»ŒE˹Ă¼¹ù×̣Äøê«‡“ÍjƠÚª‚ +¼99¥‡™‰kß [ïSƯڈ߻ûÙ½ßÄÙÏÔù×™‰kß [ïS«»×$É̉ù×ùסÁăˆŸƒvơÔ›¾è‡ăˆŸ;¶ÁçÔéÚ±»ª¶2tTÏÔŸơêÏÔŽÙ½…Ơ‡ÑÄëăơ–¶ăˆŸ§ôÆĂÙ½›¾ƒvăˆŸĂ¿¿ÅŸÈơÔ×¾ÎÅÁ½Ñ…»‹å̉ ©Øçê©ÇƯ‡ÁõaÍẰÊ)èÛ8¤ívå̉ ½€߈™ÔƠÅÙ½đ»ĂÙù×ùëÍË)éÛ9¥…à© ß»û«»÷ڥȕ½߈ù×ÏÅÛ«‚ ½9óÂÿÚ·Ó ¥0ËÓ«ÔåÚå̉ óÂëö¥Á߈Û«‚ ½9èơøô«ÔçØ€ºƒˆöÁ±»—¾ÿ¯¶Óñ߈ÂÓ§Ôù×ó¹ñÓß“ỞÙÚ¡“¹ƯN«‡“ÍjØÓ½߈µ¹ÚƼëöĂ¼ÏÄù×߈ăˆŸ;kÛ«‚ ½9ÇÜï‡ÏÔá=·ÚÏÔóÔ™‰kß [ïS§¹߈ù¿éê½€½ƯÚá=ù×éӽϰÁËÉ9±»ùꇺ‡º£ÔÏÔ©&ơÔ½çڇǽ±߈«‡“Íj½ÁÙ½ù×Ăô°½·‡‘×8ç±»ÛºÛ«‚ ½9ÇÖƒˆ½߈G½¹­Ô«â±»ö¶È9¥‡ ØÛבÓÛ«‚ ½9̉ÅÙÚ“Ơ©Ó±Ô™‰kß [ïSßöăˆŸ;©¼¿ôÛ«‚ ½9™‰kß [ïS¯Ơ¾(Ëå̉ ̉Æ9¥‡×ƺù¾ŒÖÇâ߈çÇÍË)éÛ9¥™‰kß [ïS¸£ Åé£é¹Ú›¾÷ˆé‡óÇ™‡Û«‚ ½9ơèÅ—Ó™‡ÇĂƒˆÁÓ›¹­¾ŸÈ¡%‡x³ ߈ÏÔ‰¿IË¿щ¥ˆ]1¿‰«‡“Íj¿èĂĂÅÓù×°»¿Ù½ù×ăˆŸ;đÄŸ‡º‡º°»ßÁ˜‰j̃ZîSÁ¼™‰kß [ïS‰Æ†× ù×›¶é…%¹Ú߆ڪ¶2tT±”ù×3¶ºûƠµíÚó×ăˆŸ;éê¸Ú™‰kß [ïSºØ߈“Æ̀D¬HD¼ñÁ¹Ú“¹ƯNăˆŸ;“Ơ«»ĂÙÙ»ÎÔ™‰kß [ïSƒa׿«¹Úù¿ù¿ÙןËÉ9«‡“Íjå×ơæÆÿÚéÓÏÅ¡ÔÍÓ‹ÇÖ <íÆÛ«‚ ½9½߈ÍË)éÛ9¥½ô ÁÈÓ̉ÓÆµàëö¹Ú±»Ó¾©¼²•½§ăÛ«‚ ½9ªĐ8¤‡ÖÇ%ÍƠ¥ÓŸÖ¸½¿ØÂªÚç½ËƠĂÙö›¾ÎÔ¯ö9¥‡åŒ¿NëöÁ¹ơÄ·Ô÷—»ÏÔÅÔ©‡¥2ßëM£»«‡“ÍjƒÙÚƯÓ ßÄÙœ‡ƒÚϼøêívívÚÀÛ×—¶™‰kß [ïS™‰kß [ïSùê’ÇĂÙ½èêđ5ÏŽ«ÔíÆăÇí­Ö ƠÅô£»öăˆŸ;k«‡“Íj߈9¥‡×á ÏŽ½µ‰­ÈÁ¹µØ±»ăˆŸ;ÛÄÓ«‡“ÍjÚª‚ +¼9·ØÙs̃ˆÛºÛ«‚ ½9÷Ú߈°» «‡“Íj±»›¾³ØñÆÍƠׯ¾߈߈Ư×$ñÙÅĂ©ºù×óÂ߈™‰kß [ïS½Ù½ăˆŸÛ«‚ ½9#8¤‡9¥‡™‰kß [ïS•½¹ÚÍÄ«‡“Íj¿ôÁÓØ߈ï½›¾߈8¤‡¿ùן}±»•Èû›óÔ˜‰j̃ZîS߈ĂĂô±»¹Ú®ÂÛ«‚ ½9åàö¶ ©‡¥2ßëM‹ÇÎ ¥ˆ]1ÎжÏÔ§ô¿ÅßÚƒv½œÔù懺¾ºñÚ9¥‡ª‡’̀jÛ«‚ ½9ÚĐ›v÷Á¡Ô«‡“Íjù×9¥‡—Ӭı»ÑÓ«‡“Íjà ÑÓ¡ÔÏ̉ÏÔàöׯ‹Ç³Ô—ˆ“Ơ÷ÚêÓöÍÇÛÄÓÁƯ¿´ódzºó‰¿Iô™‰kß [ïSî»ÏÅÙŒë*«åĂ½ÅƯçÚí†ïÔÚÄ̉ÍË)éÛ9¥²Â°»ÏÔÏÔăˆŸ°»÷ÁßÖăơ¿)ø×½€Ù½…£­±» ´† Ù½ÙÚ©ÜóÇß»ûËÇçÚׯçÚ¹œ$ ùבÓà̉¥ÖÏÅù×߈çổÅá=‹¿ưÚ½Ô±»¿»ñ߈‚Ë߈ô¿́±»‹Üª»“ȸÚÍË)éÛ9¥Ó}߈“Û8¤‡¥ÛßÚơÄÓÔÛ«‚ ½9¯œ˜‰j̃ZîS÷Á±»ƒvëöÏÄ«·3uUÑÄëÛ«‚ ½9­ơù¿ù‡ׯơê’Æ±¿©‡¥2ßëM©À‹Ù‡“ù×ăˆŸ;kĐÅÛ«‚ ½9Ơºm±»ùکؽÏű¿Ûº‚vùê§ô±»«‡“ÍjÍË)éÛ9¥ëö±»ơ¶ùê×Û«ÔưÚϼà Á˹Ú̀Ç!9¥‡—Úɇ±»ßÖ߈—¶±»ÓĂÙưÀ½¬ÖŸ¹˜Á–¶ÏÔ߈ĂÓ›ƠÏÔ£ØỞÁĂù×ơêÛ«‚ ½9ϺµƠöÁ›½¡Û±½Ù½ÜưÀŽß»û¹Ú±»ƒÖ¡ƠºØ»Ø–À«‡“Íj9¥‡×Û«‚ ½9ăˆŸ;k°»ƒà÷ÙÙ½·‡‘×8ç‘ÖÏÔ“È9¥‡¼Û«‚ ½9†Œ + + +ÏÄ·‡‘×8ç«»ù×߈«ÔÛ«‚ ½9Â₫¼ăˆŸ̉¼©‡¥2ßëM·Ô½ÔXµa·Å£Áä̉  £ä¿»Ó¾º½Á¹ÏÔ¸à4ψ¾‡x߈ÇÖĂöÁĂÙƒv“ƃv— «Ú™ëéåコ­Ä̃ˆ±»©Ưÿ$ÛÀỞóĂ½€ºß»û½ôÚÀǺá¿·&Ăº‹Ó¹Ú̃«·3uUÄÖ Ẳ8¤‡Ă¼߈¯é™‰kß [ïS“­€¶á°Ù®óÙÅØµÅX +™‰kß [ïSùêÍÓ÷¶ĐŃví—GƒvÎÔăˆŸ¯È«»ÙÚ·ÅƠŸÖ9¥‡×ÏÅ÷ÁÇÖÇ9¥‡×Ñ釫·3uU¾ƯÓ ÏÅå̉ Û«‚ ½9˜‰j̃ZîS²ù×›¾ªÔ“¼¡çÚÛ×—ˆ›Ú°Ă†ŒÿÂ…ö®Ơù×½ÈăˆŸ;ﺩÓù×±»áƠ™‰kß [ïS·Å߈¿‰‡xÙ»±»¬¼«‡“ÍjëöưÀívÙƠ‚Ö³ËÛ¥ÓĂÙÿÚ›¶é˜êèäÓŽÈëơá ÷‡ÏÔµØG½¹Á̉Ơ°»§ôÙÚ»yơêƒàÏÄÁĂ÷Áÿ$óǃăÚçÚÛ«‚ ½9¡Ô÷Áµ‡ñÖùêçô߈́v¹ƠăˆŸ;‹Ç¹ÚÊÇùñé—¶ëêÏÔ…ùưÀŸÈÙŒë*«÷‡·ÔÏÔđóÂĂº—Ó߈ÄÓØ× +¿ô˜‰j̃ZîSµØƠXăˆŸ;ăˆŸ;±»9¥‡¤Ù¾»ëÚĂØ‹Ü±±»œÜùÛß»ûßÄÙå½âàñÆÙÚ¯Ó…Öƒ¾‘÷Á¼ØÖÆÇÖÛ«‚ ½9™‰kß [ïSƯÓ µ†™Ó¡ÈƠÄä̉ÖÆ‹ÜÛÄÓ߈ß»û¼ÏÅׯ¾ơÔù×ù$ƒvû̃¼Äô«‡“Íj«·3uUëö½́½ +Û«‚ ½9ÇÖ׾߻ûßÏÔßƯÏÔ­Ä•ù×Á¹ÏÔÎÅר¡ÁĹ¾Ǽ—ívù×Ó̉Í«‡“Íj¤ˆ\0›¾ÿÚ°½ÏÅ©̃ٽٽ—Áùí¨¼ËØÿ¯¶ưÀôê÷Ô。ÈÛ«‚ ½9ù׫‡“Íj§Ø½ƒÅاӯƯÑÄë©Ó¹ƒØÇ"Ù׃×Ă¼˜‹ª¶2tT£Ø²µ†ñ̉ăˆŸ;ăˆŸ;§Ø¡ÙŒë*«À½»Ũˆ™‰kß [ïS›‡„áßñÖ±—§Í»¹ÚÁ«‡“ÍjÛÄÓưÀµØ·‡‘×8çǺưÀ£äÛÄÓ½€èºñÓÛ(‡x9¥‡¼ÍÓăˆŸ;¥ˆ]1ÿÚÇÖËÇ߈¿‰«ÔÛ«‚ ½9…ÏÅù×ç̉ăˆŸ;Û×ÖÆ¶¸·ưĂÙª¶2tT™‰kß [ïS» áÙ?¡M-ËơÛ‹ù×!#¹ Ơ ×Éùư • +‡¹'ư¥íª¶2tT£ÇĐÓ¡ăˆŸ;kÖØ©&ª)ÁƒÄĂÈ—Óï³2¡ÔÄ™‰kß [ïS¡Û±”øñƯÚơèÅ´Å8ç$ùêǼ—¶…½ưÀí‡Ü¾·Ô߈ăơí—G‹Ç±Ô«‡“ÍjăˆŸ;ƒÖ—ŒÇÖÏÔ·̣÷̃ơÔºÔ2«»₫Ù½÷í߈˜‰j̃ZîS£ô¡È±»«»÷‡¡Ô±đáê£ä߈¡È“Ơ«‡“Íj߈µØ£»†ºơêå̉ ù×ëöÍƠ«‡“ÍjơĺͿ‰º›¾ñɇګÔăˆŸ̃ˆ½±»¿ÅµØÙ…ÖĂÙù×9¥‡©‡¥2ßëM÷Á¿ºôê†₫Ú×ÓĂȵ Ûÿ¯¶“Ơ§¹•s߈‘÷÷Á¿‰ƠÜïųùÛºñÓß™üĂÛ«‚ ½9çÚ½€ÏÅ¿ºñÚü¦†ÿ¯¶ÏÔ•‹ôÑÓăơăˆŸ÷Áâˆ:¾áØƠ¾G½‹æå̉ ăÁô™ëéåƒÖơ…ÿ¯¶˜‰j̃ZîSÆù¿ÏŪūԣ»ù×ÙÚ§ÓăˆŸ’ÇăˆŸéê±Á™‰kß [ïṢÇÛ«‚ ½9¹¢Ûº߈ëöù×щ·Ôéºï»₫®¶ÏÅăˆŸ;‡ÇëöưÀÿÚÍĥƽ½¡»›¶éƒă»¹Ú÷‡ׯ߈ăˆŸ;™ôăà¹Ú·‡‘×8ç¿àÓ¼ưÀƒˆĂÙÈÏÅÿڻس(‹ÜÏÅ»½Ï̉ĂÙ€¼ƯÓ ƒ×ƒ½ĂơèÅ»±é‰ñ5ñ·ƒvá=Íı»£äéꩇ¥2ßëM™‰kß [ïSß»û·̣ƒ8¤‡ÖñÓ¿‰¼­Ø…߈±»Ó¾«‡“ÍjÑӳȇǶÿ×ăˆŸƒ½Ë%«‡“Íj™‰kß [ïS¡¨‡¤2€̃êLÿ§߈ơêù×ơÔăˆŸÿÚ£Ư©ÓíÖ„Ø$Ù½µØĂÈ©ÇÏ̉ÍÓñÖ™‰kß [ïSÛ«‚ ½9ƒ¾‘¡÷Ù¥Óç¤ƠÛ¹ăˆŸ;¦Ô߈óÇ÷ˆÛ«‚ ½9ƒv²Æÿ¯¶óǽơÔ³àơê‡ÚƠơԣ؉Á̉™ëéåÏÅŦ±»½ăÔùë¹ăˆŸ;âˆÅÓÿÚ«‡“ÍjƠ÷ˆ™‡ăˆŸ;ù×ô«‡“Íj­vƒÚ‘…¸Øơ…âàÏÔưÚ°½ƒv¥Ö°»«ö ÁÑÓ½€°»×¾öÁ ﺃv«â9¥‡¡Ø‰Ú—»ưÓóÇÓÔôê«·3uUÙʽ‡ŒƯÓ ·̣ŸÈûر»ÛÄÓ±»²Ø ôêûÓá=«»­ºƯÓ ÁƯº™Ôơê·ÅÍÓÏÅÁ¼µØùềÓ™‰kß [ïSÏ|Ù½úĂ¾º߈­¾¡ØçÚ«Ó™‰kß [ïSÅØ¯È¥s±»±»çô¹Ú…ăˆŸ;­½¼‡Œ›¾—»™Á©Ơ­Ö¿‰í|³—Œ·̃ƒ¾‘‡“£ÇưÀĂÙóÛ¼±½́v«Ó¿ôÍÄ÷Ù•îÛ«‚ ½9ÿÚ¿ôÙà°»¾ß +Ù½™‰kß [ïS¹ÚÓ½å×ׯ³½ëö©ù×ÏŽ´9¥‡ßéê±»ÇØĂÙ™‰kß [ïS÷Áƒˆ¼ÔñÖÎêö§ôçÚÇ»½€ËÉ9ôƠ·’̀j§ô˜‹™‰kß [ïSÉ€°»ơêåÁôÔ…„­)ăơº°»÷ÚñÓƒvăˆŸÙÚùêÁ¹ÁĂR÷‡Ó¾¶ÔŽ™ôă»ÍÄ©·‡‘×8çâÄ5á=™Ô²×½ù×™‰kß [ïS°»Åӵ؃ֿ‰ÏñÚ™‡ăˆŸÚǘ‹ĂÁ½ăơÔÏŽ€§ïåÁÇÖÿÂ÷ÚÁ̉™‰kß [ïS׺ơ™Øù×µØ÷Ôø×߈ƒvà±»µĂĂÈ‘‚‹È‡™‰kß [ïS°»º̉Û«‚ ½9ÅÓù×çù¾º…»ßÄÙ÷ˆăˆŸ¯×”ÖŸ}Ă‹ôï½ĂÙùƯ¿‰ÅĂÙϼßÚ÷ÁÎ̉ơêÿ×·̣9¥‡£Ø€¾Ó¾Û«‚ ½9Ở«»¸ö¿‰ÏÄ™‰kß [ïSÓºù×™‰kß [ïS×ÀÁ̉߈«‡“Íjá ăˆŸÙ½Ï̉‡ºÓØ·úăˆŸ;«ÔÄÓăˆŸ;kßÖƠÁ¾̃%˜‰j̃ZîSµØĂÙĐÄêÙ½·ÔÇÓÛ«‚ ½9ÅîÍÓÛ«‚ ½9ù×9¥‡ơêÛ«‚ ½9Á̉«‡“Íj½ƒØ߈̃ÄØÁĂÙŒë*«ñ̉›¶é́–Gù×ëöù×±»¼ù¿ăˆŸ;½ù×ÏÄ©Øùןű½—¿·‡‘×8çå̉ ½€³ăˆŸÑÄë¡Ô‰¿Ió›¾ÂƠ™‰kß [ïSăˆŸ;½©ÓăˆŸ;ơêëö߈¾ôä̃ăà¿ß«Ô÷Á×ĂÙÚƒˆơĂׯ»Üö›Úä̉  ᡼ƒv·ÔÑÓºÇÖö­‡ëÓăˆŸ;‡Ú°”¹Ïű»™‰kß [ïSïÆ Ç«ÛĂºñÓưÀÜơËŸ}ßÁỔ”đ°»̃·‡‘×8罇½ùêÏÅù×߈ăÛùט‡±¿“ƠÛ«‚ ½9g“«‡“ÍjϹƒÖ³Æ½߈X߈ĂÙ¡ÔÙ»…Â9¥‡å̉ ¥ˆ]1’Æ–Ó¿ÿ¯¶ÇÖªÚăˆŸ;k«ÔÛ«‚ ½9­Äơê߈ëÔ™‰kß [ïSư‡±ù1Á̉«‡“Íjçơ™‡ôÏԵȓº»ˆ«‡“Íjμƒv©‡¥2ßëMñ¿Å“Û«‚ ½9öÁ߈ÿ¯¶Ơ¼”&áêƯơß»û¸ÚÛ«‚ ½9ØѶ°Èù×ËÇŸÖÙÚăˆŸ‹È’Ÿ‡º«‡“Íj†Ú¡Û™‰kß [ïS£äúØ›¾áœؽ߈¦‹ÔÇ·‹ù×ĂÙơêß»ûÏÄÛ«‚ ½9Ë̉¥ÆÑĂ¡ÛÁĂ߈ï½óÂåÁ«‡“Íj£Ø Á³Ñ+̀ª̃ˆĂÙ±»½Úǽ±»ù¿ëÓѧÆíÓ±»Û«‚ ½9ơêóÇÜ‹½ßÄÙưÀ†ŒƯÓ óÂÙÅëï»ù×é߉ۡ»‡¶‡  Ö8 æ »ØµØÑÓáÄù×ßϽ©ˆơÔöG½¹ü%‰¾—¶Ơ™‰kß [ïS•»ï»ÏÔ¹ÚÛÄÓêöÁĂù׫ԗêÛ«‚ ½9å̉ ưÀñØ«ÔÅØ¶Å›¾’ÏÄAưí’…»§ô«‡“Íj½Ă߈¡ÔÍÄéÔåÚÿÛ«‡“Íjùב ߈ÏÄéå¡Áá¬ÿÚñÓ‰¿I”ÖæƠ ĂÙÛÀ×ƠăˆŸå̉ ½€µ†½€Ä¡ØÅ؉¿IÁçԱ»ñíÈÛ×ăˆŸ;k±»º‹ÜÙ½›¹±»ăˆŸÅØù׺öÁÁƯ£Ô¡Û»ˆưˆù×Ăåô™Û¯¼‹ÜŒÛ߈Ă™‰kß [ïSÛ«‚ ½9Û«‚ ½9™ĂöÁƒÔăpëöçôÔºlßÄÙ£³‘ ­Ö©‡¥2ßëMÅôôƒvˆÂŒEß(ÓàËŸ¿“¹ƯN˜êèä퇩Àíê¶Ûྠ+µ†—£ƠÏǺnÏÔ!ÙÚ±»™ÁĂĂщơêù¿ăˆŸ˜‰ +j +̃ + + + +Z +îS +©ÓñÚø×ø×߈ơÔ±»ƯÓ å̉ ±»Û«‚ ăˆŸ;…Ơ߈‚×áê§ô™ô±¿æÚ•îÆ«‡“Íj¹ÚÛÅØ·Ô™‰kß [ïS¿‰Ÿ}åĂÏÔ9¥‡ư§‡Ở­Äù׶談“Íj÷Áÿ¯¶£äĂĂ ›­±àéM‡Ú™àù×›¶é­t¶  Û«‚ ½9óÇï»ÚÄ̉™‰kß [ïSÂÈ÷Áà˜‰j̃ZîS¾ăˆŸ«âÇÖËÉ9£»§Ô¥Úƒv©ÓËÇÑ”¶Ôù굆ÑĂ˜‰j̃ZîS²Øăà‡˜‰j̃ZîSçôш‡Ă‹Ç‹ÜÇØͼÍÓù×߈£ÇåשÜñƱÔྠÑÅ™ô™‰kß [ïS—¶™‰kß [ïS‹ÇÅØ‡ŒÏÅ߈Ù̉•¡ÔăÖÚ §ôÅØÇ»±»Ơ‡á=™Ô›¶éÉĂăˆŸ¿ôơê¹ØÛ«‚ ½9¿èơĂ¹Ú™‰kß [ïS›¶éû(Ï̉«‡“Íjëö«ÔƒvÛº¼çô¬Ä»ëÔÛÙ€¹Ơ‡Œ₫ÇëöăơÏÄăê¯¾ăˆŸ;5߈ăˆŸ;”Èú½¹ÚëØÓ¹Ú»ÅÁƯ÷Áă¿ôÏÔ•ÖÙŒë*«»ˆíÖö߈«Ô¾ûدȺ߈ÿ¯¶£ỒÓ1ÛÀ÷ˆñÚơĂ‚v¡ÛĂÙÿÚù×áƠóÓưÀï»ÁĂßÄÙô¾“ôÙ̉›¾å̉ áƒvµØƒv™ëéåƒ×ù×ÅØéô±Áơˆÿڳ™‰kß [ïSƒˆÛÀù×±»±̉Ù½ưÀ¿́«»ÿ¯¶ÍÓ·ºơêÿÚ… ‰₫ÁĂ¡ÈÅÓăơưÀß„·º̃ˆ—»‚Ú߈ÛÀëöĂÛÚăˆŸ;™‰kß [ïSơê«»Á¹ÈöœÁ¹ÚóÂË¿ív€Óß%߈«‡“ÍjÙƠÏÅăˆŸ;kï½ơêÁẴ»úÛÔÛnÇùדƠƒ³ÅØÑÄëÛÄÓÛ«Ô¹Ụ́Â×Ơ߈±ëصØ߈¾§ÆëÔưÀ¹ÚÅÔ˜‡ßƯψÏÔơĂ­½¼—¶߈‘́ï½ö̀¬H±½Úª‚ +¼9ñĵa­Ä½™‡™‰kß [ïSÏÔÛ«‚ ½9³1ÙŒë*«ơ꽓ÇÑÓÙRƒ½ƒÖ¼Úª‚ +¼9׿8íÓ‡ÇÍ­HµÛËư•ŒíØæôŽׯÅÔ™Óƒv +ăˆŸßÄÙÛ«‚ ½9½ăˆŸ;k½9¥‡߈ÏÅŒE峨½Ôö©¼Ù×߈×ăˆŸ;«·3uUơêëÓǹ™‰kß [ïSù×ñÆùÚµØѶÁ¹Æ…ÛăˆŸ;Ç ¡ÈÏÅƠÛ«‚ ½9đÔ—»ÏÔ“Û9¥‡ĂÙĂȹóÏÔ¼ë­Ä±¿Û«‚ ½9™‰kß [ïS½½€·Å·‡‘×8窇 ’ ̀j ăÁöŸ¡È‹Ù½¹Ú‡’ÏÔ½Óºù×Ă1•ï—ˆ‡Ú8¤‡ÖÓ̉ưÀñÓÖ‡¼7ăˆŸ;ÎÔ•Èû›¡ÛÿÛưÀí‡ï½ƒ×·Øä̉³ưÀ‡Ç§âºöÀ̉9Óa9¥‡ùº¾éÓ›¾ψÙ½ö«‡“Íjù¿ù×±»™‰kß [ïSÛס‘÷¿ºªôưÀ±»…àÙ½ĂÛ«‚ ½9ơêùׇڃa—€ÅÀăˆŸ©ÜÍƠñÓ·ÅÜÓ Û«‚ ½9ÅÙ½ûÓ8¤‡Ö±»ÇÖ¬Ä÷êϹöÁ©Ü—óí—GÛÀ½Û«‚ ½9ùêÅÓưÀùײ¹ù×ÏÅ“Æï½ĂÏÔó¶ĐÄ(ê(ÙÚ̃ˆëöɶ‡¾·Ø™ôù×Ïš۽ô½ôñÖ߈æ̉ù×Ơ¹Ú…ÖñÖÍ›¾Á©Üχù×ÏŲ‡9¥‡™‡Û«‚ ½9麃vÙ½߈™‰kß [ïS™Ó³»ØÍÓëö™‰kß [ïS¼ÔºƠX߈Ù½Û«‚ ½9ÿ¯¶¿àχù×Û«‚ ½9½ËÉ9ơÔ«»ÏÔ‡ø·‡‘×8çÑÓÏÔ¢»ï½€Ç ‹ÇƠñÚăˆŸ;¿Åàê¿»Än­ơ£Ø¡Ûù׿àíêùꙉkß [ïS£ÇÓØ±…×·Å™‰kß [ïSÇ}±»ĂÙ…¾ÿ¯¶Ă©¾›¶éǗëÓëöÿ¯¶º£Ø˜‰j̃ZîSÙÚÏÔå×ñíÈ›»9¥‡«ÔíØÁ̉YăˆŸ;éơ9¥‡£Ưí$©Ó¿Ø½™‰kß [ïSçµéº¿ô¢X½‡x›¾ź™‰kß [ïS™ÁÛ«‚ ½9Á‡é/×:ơˆëöùêµØÓÓ½€ÏÅ£Çó¸ÛºúÙÓÅÏÔƠµ«‡“ÍjÛ«‚ ½9±»éÓÏÅơêæº¡ÁÇ̉ǼßÁ›¾Ûºå̉ ĂÙY9¥‡½ĂÀƯ©Ä•%ßګԟӵط‡‘×8çÙÚ‡Ú±ÀưÀÑØ™‰kß [ïSƯ‰Ñسƥ›áêÅÓ,™ô߈½€Ơỡξ»³ºó9¥‡›¾Û×Û«‚ ½9ÏÔ½öÁóÂăˆŸ;“ñ­Ä¥ÇëÆçØÛ«‚ ½9å̉ ăˆŸ—¾Ú×߈ĐÄêÙŒë*««›«‡“Íj›¾ùêÛÀä̉Ơ½ÅÔîÀçÚŽ·‡‘×8ç±»ÙÚ8 ¤‡ ÖÓØ‡ØƯÚ­á «‡“Íjö±»Ù×±̀ëöăˆŸßÖăˆéºáêÏÔÍË)éÛ9¥ϼµØ½ô£Xკ‡˜‰j̃ZîSºƠ±»ÁƯƠX³È«Ô©‡¥2ßëM™‰kß [ïS±»Ăº™Ï¨¼Íǽµa”ù½çÔ¡‡ŒñÓ߈̃ˆ߈ÍøÜÓ ÷Áơêó#ëöÏÅóÔûØ©‡¥2ßëM±)߈¾£ÔçÛÅôê뼩ÀÏÅå̉ ½€…Ơ܈áêßÖù×ëÔƠዘÁ˜́ĂÙ£ƯªÔÛ«‚ ½9½ÿ±»ĐæëÚ‰ºŸÈăˆŸáêù×ưÀÏÔ¹Ú¼“Ç«‡“Íjư“ñÖƠÙÚÛˆ«Ô…¡…ÛăˆŸ;ƒÖù×ùëÅ–™‰kß [ïS‡ºƒvµØÛ×ăˆŸ;ăˆŸ;×Üÿ¯¶›¾µÈÅÔ¯¾µ¹Ú凫ԙØç̉¿»̉·‡‘×8çØƠ§ÔăˆŸ;“ÛƠƒ½‚ØÎÔëƯ¸ÚƠñÓå̉ Ăƒˆ×à›¾Ûº›Û›Ú‡ÚƠăˆŸ;™‰kß [ïSÓ—ăˆŸƒÚôê¡È…»‡ÇöźÛ×Ăº©ÓûóDZ»щ›¾߈¿ºôƒvưÀñ×ăˆŸ;¤ˆ\0ûßçÏÅ¿‰ßÄÙ׿8Û«‚ ½9Óź噇ÿÚå•ôĂơ˜éÚÑÓăˆŸÅàÙט‰j̃ZîS½ÓÔË¿æØ˜Áƒ×Ï·÷Á߈í‡ÏŶèíêÁ¼«»ĐÄêÁǻ疋ǖ́ÚÀªÚ©Ó߈ă»¡ÔçÚÅØù× Á¹½ơê¡«›¶é½Ă“ȱ»‹ÙÚÇÙ½«‡“Íjö·‡‘×8ç¡ÔÑÄëù×ù9¥‡¹Ơ÷Á©ØÙ̉ÁƯ™‰kß [ïSùêâÁ­ƒ½áÅăˆŸ;™Ó¹ƠÚù×ÙÔÛº‹Ó©Óù׵؇ºƒÄ×ÚÛº—¶·ñ9¥‡«‡“Íjˆ¿‰ÏÅăˆŸ;«‡“ÍjéêÍB‹Çºô›¶éáÅÑÄë‹ÇßÚ¼ËÉ9Á˘‡9¥‡™ÔÓÓăÇíỂ ăˆŸ;§ô™Â×ÚăˆŸù×ﺠǿ(­ÄáêăởÆăˆŸ߈Á‡é/×:߈9¥‡߈’…ÔÏÙÚ›¶éÛ×ׯ«‡“Íj¾·‡‘×8çƒvÓÅÛ«‚ ½9ơÔ›¶éù×…ÛĐÓóÄÛ«‚ ½9“¹ƯNŸÈéº߈ƠưÚ»ĂĂÙ߈·‡‘×8ç½YÑ·™ÓăˆŸ¿ô¹Á³ÁƯƒv™‰kß [ïSËÉ9߈‡Ç̃ÿ¯¶á­½ÏÔÑÄëÅ×Á¼Û«‚ ½9gÙÚ̀ÇöÁ÷$×¾±¿½€߈ÅÓ½·Ô߈ív¹Ú₫Ûß»ûÛÀƒvù×ù×ù×ăˆŸ;¯ßÄÙщăˆŸÚíꙇ«‡“Íj½Ô¿Ø¥̣¡Û›¹ù×Ăà‹ÇÅÔÏÔđÙÚÙŒë*«ï½‰Ơ³È¹Ø—ă·ô«·3uUÙ½Úª‚ +¼9ív±Ô»Ø9¥‡ψ߈G½¹ƒvÄÔù×ÑÄëơê…»Û«‚ ½9ÁÙÛº»nÏԾߛ¾ëö׿8™‰kß [ïSº½Û«‚ ½9ŧƠÚª‚ +¼9—¾ơèŸÚAÏỖÄØ߈÷«‡“Íj©‡¥2ßëMíêûاàöÏÅăˆŸ;Û«‚ ½9߈ơȼÿ×ù뛹«»Ă߈»ˆ—¶ñÓù×­Ø™Á«‡“ÍjÓµOëïûô܋LJº±»…§ÔĂ¼éºÛ«‚ ½9ƒvñ ÏÔăˆŸ;ÙŒë*«ăˆŸ;ù׺Á¦ôÀÚ½¡ÁÏÅăÁ‡ºÙÚéJé‰Ó5“gesÁÅÏPƒ½ëöËDZ»˜‰j̃ZîSăµØÑØ‡‡Çï½±»Î̉/¹ÚơèŸÚÖÔ†6¦jù×—¶÷Á£ÓơÚ±»Ù½½¾‡½€åñ»¹Áù×ÏÔ÷Ùû“—£äÓºăˆŸ߈Ùׇ“•Èû›×Ü™‹¿º­ÄÛ«‚ ½9™Ô±ĂíµÙ½Û™Ơ Ơ¼ô"‹Ü»ÏÔ°»³Û«‚ ½9™‰kß [ïSäÁĂÁƯÛ«‚ ½9﻾°»ÇĂÙơĂÁH±»÷ÁßöÁ©Ó·‡‘×8ç߈¿ºív‚ăˆŸ›¾™ơ₫Ü—àÑÓÿÚ‚vØƯÓ ¡È©¼—Û߈Á̉ؽƒÏăÇí½ÏÅá ƯÔ± ÍƠ©ÓßÚ“›ר̃ÖµÜÎÅäÁ.ß„µØƠ¹¼°ÔÔ°»«‡“Íj̀Óí‡Ă ÁăØÚÛ«‚ ½9Ï̉™ÓëÅÑẠ̊Ôß»ûƒ¾‘û̉ÏÔƒvëöÜ£Çí‡Úª‚ +¼9ÿ&ù¾ÅÓÛÜ9¥‡—»«‡“ÍjóÇæÔ «‡“Íjï½ĂÙÑÓ‹Ù›hơØëÚĂǺåêù×ÏÔ™‡«»ù×ăˆŸÁỰ¶ĂèÏÔù×ö—ÓÑ»ưÀ°» ‘•%ù×¥"±»ôºØơêá ½É ±»™‰kß [ïSÏ̉ƒv÷Ú¾•ܧô±¿‹Ç9¥‡ÈĂ$߈™‰kß [ïS÷âÏÔ½Ă“Æ™ëéå9¥‡Û«‚ ½9«ÑÇà­Ö¶‡Ö8æßÄÙÅĘӸÚƯÓ ßÄÙ·Å»½¹h›·Ô‹ÈÑÓ–Á ¶Ô «‡“Íj«ÔÙ×÷Ú™›¶é…öÛ«‚ ½9ù×ù×9¥‡×Ăٽ׿8ƒvÛ«‚ ½9Û«‚ ½9ÙŒë*«ív‹Ó±»ÙŒë*«•îÑÓèԻȫ‡“ÍjùׇŒׯÛÔßơÑÄë¡»ïƠẳÏÔơÔ™‰kß [ïS¿‰™‰kß [ïSơêÏŋNjÇÿ„àïƠ÷¼ăê¡ÇÑÓËÉ9ͺ¸Ú©ÓơêÏÔÂÙ«‡“Íj߈³ỞÛ«‚ ½9ăˆŸ;ƒÖÈí‡̀Ê)èÛ8¤ẳ·‡‘×8çñÓăĂÙ߈Á̉8¤‡½Üù×ÏÅĂĂ ›­±àéMÛ«‚ ½9±»Ơ±»ó|³ªº×ÜăˆŸ;»Øï»߈ÍÓÙ×ÅàÙéꥺνי‡±»ºûù×âà¡Á¶è×ƠËÇ“½ßÄÙ­Ö¯ù×÷‡°¿ØáùדǕŒ¡È̀Ê)èÛ8¤ëö«‡“Íj±»ÏÔº߈ëÚĐÓÛºµØÛ«‚ ½9Ù½ÑÓëöñÄíĉđÓºÛ«‚ ½9¡ÈơÔÎæ§ÀÁ±›¾­ØÛ«‚ ½9ù×€ºƠÄ™‰kß [ïS°»ü¦†½€©ØÏÔÎÔù×½™ëéå­ÔщĂïÚ§Ó“ƠôêåĂÓ ‹›æ‡xôêưÀ«dƠïÁ½ó«bï³2ă¼éÚ±»ÓÔívçóÄé‰ñ5ñ·߈§ôÍË)éÛ9¥•ưÀ߈éêƒÔéêùêéÓÖÔÔ†Ô6Ô¦jÔ…Ö߈™‰kß [ïSỞå̉ ăˆŸøê÷Á·Ôׯƒ¾‘…nĂȯÈơê½ØûØ¿èûÛˆ«‡“Íjàö®ÈÍÓưÀíÁù×î²2ƯÓ ÓØïƠăơë”ù×Ù½«‡“Íj·ÔÏÅYñÚÑŵØÍÓÏÔëö¥Ö²Â?…äĂٷحٽر»µØ½ÿ¯¶ÏÔ±bÛ«‚ ½9—Óψ¥‰ÍL…«ÔÅùê½ÈÛ«‚ ½9™‰kß [ïS“Ơ˜‰j̃ZîS™Ó›¶é÷ÁÛ«‚ ½9½½¯é«‡“Íj§Ô™‰kß [ïSẳÜ™Óơꢻù×Û«‚ ½9«·3uU¼ĂëöñÖÈ̉µØ–ÓçØÛ¹ĂĂ ›­±àéMÛ«‚ ½9­ÄƒˆívÏÔÉăà9¥‡™‰kß [ïṢ¶Ăø…ƠÛ×ñÙá ÿ¯¶±»ù×™‰kß [ïSỬ̃ˆï»‡º߈ù×Åí§ÔµØ½+‹ëñÚơÔ۟ȹÚÏ̉¹ÍÄå̉ ¾ô‰ÔÇÏÔăˆŸ;á œÁưÀ°½ËÓÓ́‚ÿÚù¾Ï̉½!×ĂùוŒÛÀ™‰kß [ïSăˆŸ½½˜‰ j ̃    Z îS ‚v³ØÛ«‚ ½9“Ʊ»«‡“ÍjÙוǥ ÷ˆŸ}·ÔÇØëöëö‚v£XÅî«»ƠXÛ×÷Á÷Ù…™‰kß [ïSÛ×߈̀DZ«»ƒÖÑơ›·ÔÉơ‚ˆù×ÏÅéê»ØÆ%µØÚÀÿ¯¶«Â‡Œ“Ơ¯È›‡³zÛºÇ×¼ÏÅ«»µ!ö¡È¢Ø£äưÀ÷ÙëÓăˆŸ;ƒêƒ¾‘Û«‚ ½9£0Óˆ•=‘éê§ØÙŒë*«‡x™‰kß [ïSÙÚÙÚ«Ô“¹ƯNéO‡ºñÙơꀾÍÓß»û¾»ó•×¾(Ç϶è½ơÔÙ×Ûº‹ÇŸÈ“Èăê½Ăơ‰¿IỂ +ĂÙƒvÅÓûÓ‡×ÏÔ£»Ăº‚Ç©Ơï½Á¼àƠ™‰kß [ïSÁ™Ó¿‰«‡“ÍjÎ̉±»¹Ú¯¼ëö¯¾ĂÓỔÛ«‚ ½9÷ÙƯxµÈ˜‰j̃ZîS›¡¿‰ÍÓ÷ÁÙÚ·‡‘×8çù×›¾‘ơö÷Á¹Ú¬¼¼Ư ¿ÅƠX—¶¾ưÀ­v™‰kß [ïS‡ñ5ÿ×8¤‡9¥‡ëöñÚ×¹Á¸c±¿ßÚá=“ÈéºăˆŸĂÈñÓÎ̀ĂÁƯ‹ÈÙ₫íê§ƠÊëö9¥‡±»÷ÁưÀ9¥‡«‡“ÍjăˆŸ;“¼Î̉íÖ™‰kß [ïSщ9¥‡±¯Å‰ÆñÚº©‡¥2ßëMáÛ½Ô«»X½ô‡Ç™‰kß [ïSÑ«ƠÄÛ«‚ ½9Ơù×ăˆŸé‡ÑÓåÁëųÂûĐ«‡“ÍjëöÇ¶Ô +™‡½ôê«·3uU«‡“ÍjÀ½¹àù×¥<ÍĂ©±»ù×­RƠ¼ÔX£Ù½ó|ÍÄơꘉj̃ZîSưÀƯù×¾çôä̉¼±½™‰kß [ïSÿÚÓ¾Ǻëö“·Ó ¥0÷ä5̉ψ߈®kÛºÛ×ÙYÁƯ“ÆËm™‰kß [ïSÙ½¯Ơ™ëéåÏħԫԡ‰yçÚûÓ›¾·‡‘×8ç̣̃±»£Ø߈ăˆŸ;…ĂѶ™‰kß [ïS»‡ëö±»…ÖÛ׃v­Ä™ÓăĂôß»û™Ôé껈«‡“Íj™‰kß [ïSç₫®¶ßÄÙăˆŸï»̣ÏÅ߈Û×Ơ½ƒˆ±»ù׫·3uU‡xÜÔ +ơÔëöÏ̉ù×Áq©‡¥2ßëMµÛ×¥‰ÍL…ƒÚ©Ó÷‡Ï̉«Ô©Ø«Ñ˜‡ơê©eÅԵؖ¾Ù×ÏÔÁ̉±»©Ø÷ÚÛÚưÁÛ«‚ ½9ßÚẩÇÖ³ơèÅơ‡₫ÛăˆŸ;ơꣻù×Û«‚ ½9ëöơêï³2ă»߈½†Œü‡°ø1±Á«÷æđ¬¿éÓäĂÑӺř‰kß [ïS÷ÁĂÙ۵عÚëöơêÅØ£Øă¿‰³zÔơԹڣǛ¶éÀĂöçÚÛºăˆŸ«‡“Íj«‡“ÍjÜ¥ÛƯºăơgßÁ—¶¨‡¤2€̃êLĂĂß»û•Œù׸ڱ»÷ˆ¿ô¥ƯÅØ«Ûƒv™‰kß [ïSƒvùיة‡¥2ßëMëö±»ô߈ܘÁ¯ÈΈ±»Ùq«‡“Íj™‡ÏP×Ăå̉ ½æÛ«‚ ½9ËÉ9ÙŒë*«ßÚî½ù×Ó¼ÅÔáƠƼ ÓºÔơÏÔí½Ù×§Óô·Ô™‰kß [ïS“k¬Ö±»›¾ö¶‡Ö8æ›ÚÁƯƠÚÖƠßÄÙ‘â¼ĂÙÿ¯¶÷ÁëöóÇđÓg‹ÛÑÄë…Ö±»°¿ÏÔöÙ܃»ù×½ÂÙ©ØăàÏÅ«‡“ÍjỡÅØÿÚ«‡“Íj‡ăÛ«‚ ½9·Ó ¥0߈«‡“Íj«‡“Íj«™‰kß [ïS«‡“Íj§Ô­ÔÖ$ÏÔÍ́·Øëöͼä̉߈9¥‡“ÆÑÄëßÄÙ«Ú¤ÈKÑÓêö®Ơ +£Ø™‡ăˆŸ;×åĂÙ¶‡Ö8æơêôºëÔ˜êèäßÄÙå̉ È»™ÆÎÔ½̉Æù×Ï̉íÚ´Øù×¹Ú³ô“½›¶éÙ½ƒvÙÚàÅ ơÛ×›»‡ëö«Ó½ÅØÁ½§Ô›ÚÙÅëĂÙÁƯù×ơÔ߈ÿÚß»ûº€ÇËÇÍĂÔĂÙĂô‡xרơê“Ơ߈ƒ«‡“ÍjǼ¸Ú߈́¿‰ĂĂ ›­±àéMÅÔ·‰߈•½™Á³ô¿î§ƠñÆÙÅëÿÚ¿‰«‡“ÍjơèŃ̀ƒö›¾¡È„Øׯ£äăˆŸ×¾Û«‚ ½9™Á…£­ĐÓ,ÿÚá=„½ơôµØù×±»Ù¾×Óɇ¶è߈ź9¥‡Û«‚ ½9±»ú(“ȕLJÚăˆŸÑƒ½¡Û¹Ú™ĂÙ½ÑïÉá ñÁ¡Ô½ñÚăà§Ô˜‰j̃ZîSƒàÉ̉å‡ơê±ô¥‰̃ÅÏÔ«ÔÚºׯ“à¾Ï̉£ƯÙ½¶£»“Ơ9¥‡ƯÓ ±»ăˆŸ;°»§Øå‡¿Ó߈÷‡Û«‚ ½9µa÷Áë׳ºóæÚăˆŸ;Úª‚ +¼9æÇƒ·Ôá èÓù×ơçƒvçôëöÅÔ3€ºÛºÙ½Ó¼Æç½ßÚóÂÏÔÿ§¶ƒÔé‡ơ‡£»9¥‡‹Ü½€å̉ ¡ÁăˆŸ;¾¢‡º̀¬HÏÄñ´ÏÔ¼‹Ç¹Á­ÔÇØ‰Ûå™ôĂÅÓ¡ÁÁ̉Û×₫®¶µÈ¡ÁÅØ£Ô†Çº߈ö‡ŒÏÅăˆŸ;kñ¾µØÛ«‚ ½9ñÁ«Ô·̣óÂ÷ÁÏÔĂ\™Ó«Ô9¥‡® +£Ô™‰kß [ïSơÔä̉Û‡½ôÍË)éÛ9¥¶¶™‡߈ơê±ëö§¹±ÁÑØù×Å»ñÁÿ¯¶Ă¼©‡¥2ßëMÏÔÁ̉Ÿ}®é¹Úÿ§Ơơ±»¸£Á½©‡¥2ßëMù×ÑÄ뙉kß [ïS9¥‡³±kœÂÙÚôêè§Ô¡Ûƒ—°»À̉)ÍÄöÁç̉™‰kß [ïSéÓöÁÙ½ÁĂÙ×ÅÔÂÙ˜‡±»ß́ăˆŸ;ÏÔƠ´ụ̂¶èùêÙÅë· ¶º³ï½º½Û«‚ ½9­¾ÏÔÛ«‚ ½9ªÚăˆŸ;Ç»ßÄÙëÓăˆŸ;ȽéÓƒÀÛ«‚ ½9íÆ±»•ÿÚºׯñÓÏÅÛ«‚ ½9¹Úơú“Ɖ«‡“ÍjÚê­äѲơÔáØ­RÄÓơÔáêŸƠƠ¼óLJ¿Úºùæ×¾½ù×÷ÁÏı»ëöăˆŸ;kƒv»ÚñÓ¹Ú¶Ơ©Ó“¹ƯNÑö  “Èͼº§ÓÇÛ«‚ ½9÷Áư“ăˆŸù-ƠÆ»ùꙇÛ×ÏÔù×·‡‘×8牿I°¿÷Úº½¼€ƠÙ½ï³2Ù̉Ă¼ƒê5­ä‡Ú™ÛÇÖƒÚ¡È÷ÁÁ¼¿źƠ€÷êÿÚÎÅăˆŸ;·Ô¥ÆÔÁ÷ù× ËûЉơ걿·Å§ÓºùêËÇÛ»÷›¾Âè ‰»ĐÅ߈ÅÓÁ˜߈Ơºm½ÍÓùץءƠơèŵa½ô€ºÿ&Rơê«ÔרăˆŸ;÷‡·É¡ÈùÚ‡éÓÏÔÙ½‡û½ơê…ô¹Ú;׿8ù×ưÀˆØ“Èäô ăˆŸß»û£Ç½źăˆŸ½ƒü‡°ø1¡±»ïÚÏÅñ¾߈ß²”çÚáêÙÛÄÓơÔÁ½߈½í˜ô©ØƯÓ Ơ߈£ÈßÁơèÅжÏÅëÚĂº™‰kß [ïS¼ºĂóÂ߈›—¶×ƯÍË)éÛ9¥ÿÚ¬Ö¼µ°…ôĂèơÔăˆŸ;ƒ¾‘„¢­‹Ù₫½€Ù׫ԛ¾‡º÷Ù²Y™ô×¾8­¾±»ưÀ»Ó“țڑ±̀Ê)èÛ8¤ăˆŸ;îºÛưÀûØ™‡¯ƒ« +>Û«‚ ½9£Ø±»‰Ô¡Ưµa‡ºăˆŸ×ƠÿÚ¹Ú߈¹óÙÚµØéÓÛ«‚ ½9½©Ó߈•Èû›®È˜,ê,è,ä,ÔºlöâˆÏÔ«‡“Íj‡ºĂÙù×ĂĂ–Ó «‡“Íjí8¤‡×ÿ¯¶›¾…JëÖ§Ó±»›¶é³×½Ơơ³ôå̉ Ù½’Ơç̉ôÔ·ÜÙÚÍÓưÀ˜‰j̃ZîSïé™ơÏÅëöƠ뇀ºG½¹Ù½ûØ™ôßÄÙỖù׃ˆ›¾ù×߈ÎÔ‹ÇØÍ·‡‘×8çœÂËÉ9¹ÚѶ‡̉×oÀ‡ € è/ Ö: «â’½‡¿ÇÜ™ëéå·Å߈Û«‚ ½9¹Ú˜êèäơ–¢ ƒ¾‘º«‡“Íj±»·‡‘×8ç«Ô˜‰j̃ZîS‡xù×ù×ơèʼn¿IŸ}ÏÄÿ¯¶óÇŽôꩇ¥2ßëMÎÔ™‡Á̉ù×å̉ Ù½ơÔÁă‹Ç™‰kß [ïS߈½Ô߈îôÙ½“È£ä߈ͼÏÔÇÖùׇۣäçÚưƘ‰j̃ZîS«‡“ÍjƯ‰åÁ³ïÀƒv›¾ÏÄëöửëöÏỒĂ騋vá=ù×₫ĂÙ›v躇ÿÚÓ̉»½ăˆŸù×ö∨¼ÀÓÔ9¥‡×°êØï»±»Û«‚ ½9Û«‚ ½9›¾ĂºÏź±»Û8¤‡×ĂÙ—¶μ8¹ÚÍÓÙÅë󶡇ĂƠ¾È§ôƒv߈±»¥Æª»…Œöä5̉½ˆª¶2tTÁƯƒv…öÏÔ“ÆÛ«‚ ½9­ÖơèŘӇ½«‡“ÍjƯµØÛ«‚ ½9±»ï»²Ø±»Y¿‰ù×¹Ú˜ơÑӓƛӃàöÁÛù×ñq«ÔÅ–±»«‡“Íjùê¹Ú•Èû›‡¿ÚË¿÷$߈ÍË)éÛ9¥ÅÅ¥ØĂÙ߈±»ÎÅù×¹Ú“Ơ¯È•»«‡“Íj¡È¹‹Ó‰åëöưÀ³È¡È¹ÚàØ 9¥‡«Ôÿ¯¶ơê¡ÛñÓÅ–è‡ơêóơ½ưÀ°»±»Á̉Ă¼щ±»ă,ëöăˆŸ;ÿ¯¶«‡“ÍjéØË¿–]]¦]̀»]]ïƠÅÔăÙ½ơê߈ø×÷Ú™‰kß [ïSƒØáÓØÿÚŸ}ûر»¾‰¿‰‰¿Ív¡ÈƒÀ¹ù׋ÙßÚ™‰kß [ïS‹ÇưÀ½ëöµaưÁÊ¿ÅÓù¢߈ÅĂÏÔ÷Ú±Á߈‹Ü›¾ÀË™ơ¯»Úª‚ +¼9”˜‰j̃ZîSͼưÀ­ÄÆÿ¯¶·‡‘×8çóÇÏÔÙ×›¾ÿ$ﻵØ߈ƒÖĂĂ˜™‡ărø×«‡“Íjơú·ºÑ»¡Ô«‡“Íj§ô§Ó¹Úâੇ¥2ßëM©Ø÷ÁöÁư¼¬‡™‰kß [ïS9¥‡ÅÏ̉₫&ưÀ̉¼××ñíÈ廃¾‘ơê¹Ö8$¤‡$Ö¹Ú©‡¥2ßëM¡Ô¸àÇ»ŸƯº÷Ùg½¤‰̀L„öÁµÜÓ–Ó̉ñÚÅØù×÷å5Óƒvù×µ†±ÿÏÔÏ̉ß„רר±»Úª‚ +¼9ÍË)éÛ9¥—ÓÁ‡é/×:ßÄÙËÉ9±»±»´‰¡Ơ“¼©‡¥2ßëMÏÅÅØÙڳț¾Ûº߈³Ø¡Á÷ÁÛ×óÔö«d¶ÔưÀ»Ø×¾Œ¾ơêçÚÀ̃4Î4÷Á·Ø±¿÷ÁưÀÛ«‚ ½9±»±»íê°¿ơÔ«d&·ÅÑÄëß»ûÎÅàƠ±»µØăà9¥‡±»߈í—Gëöà¬ùêÿÚù×߈½¯ÈĂá߈±»ƒØÛ«‚ ½9ó̃ÁZóÔÏÔ¥ÖÏÔŽçÚëÓùêơÔă»íÁ›¶éÛ€›ĂçÚŸ¿ó±»¶Ô ±¿Óºͼ›¶éơê³ÚáêÇ̉ơؤÈÙÚƠu¡Ư«Ă«‡“Íjµ†«‡“ÍjÍ¥ïƠÏÄ¥<Û×ÑÄ뙉kß [ïS€Ơ©‡¥2ßëM×ʯ×ưÀ·Ôµê½ÁƯù×™‰kß [ïSĂ¼ɇ½€±»°‹Ü¡ưÀƒˆ¡†ŒăˆŸ¾ß—¶Ѷ‡Œ—Óÿ¯¶½°êØ™‰kß [ïSỔƒØ8¤‡ºÏÅưÀßÚ«‡“Íj°¿ ߈£»¸Ú½±ÔÙÚô³íÁ½ơÔ«‡“Íj¾ ÏÅ“ºĂÈăˆŸ;¨ÇؽµØ÷¼±»é¡»ÏÅÿ¯¶º¾«·3uU›€“¬¾½°»óĂƠ½ùׇ÷Ùù×ăˆŸºùéÍË)éÛ9¥±»Žº̣ÂÓØÍË)éÛ9¥̃„?ưˆơÄù×ï½±»éÓûØăˆŸ;kø×‡(ăºö°»×Ơ¯–¾·§D щ«‡“Íj¹|ù×ÂÙ­ÄÄÓ +‹ÛµØé꽡ÓÜÑÓG½¹ĂôÎÔỞÙŒë*«ʹÛ×»Óç$±»ĂÙëö߈ƒv÷ÚÙ½©ÓÔ™‡âƠ˜êèä›¶éó¹çôµØ›¾¥ØôívÿÚÇÖÛ«‚ ½9…â¤Ï«‘麻ßÄÙÁăˆŸÁ߈ϼ—¾Û«‚ ½9߈½Ϲ« ©ƒ»5›¶é˜ÁùêÏÔ¡Ü«ÔĂÙÿ‹ǫ‡“Íjùׂv¦Ô°»›¶éÛ«‚ ½9ƒv߈ĂÙ©ÓÁƯÉÔơ +¢ ÂĂ8 ¤‡ ÖÙ½è‰đ5đ¶¡Ûáêï»ÿÚ·‡‘×8çÓØ˜êèä÷ÁÇ÷ÀĂÙ½߈ÙÅëÛ«‚ ½9“º9¥‡ÅÓ߈ù×ơêÁ‡é/×:ꥯâÁ¦¹¹ÚÁ̉¶ĂÓĂÙ±½§ÓÂ÷‡¿‰éºöÏŃÖ9¥‡×ÁĂ“ÆÅ¹ñö„ä¹ÚÛ«‚ ½9¯×Ï̉ƒ›¶éă­íÓÅÿ’‰2Ô,øï»·‡‘×8ç9¥‡×À̉°»ñדƠ¤ˆ\0Û«‚ ½9âơØçÚÜ9¥‡‰Û£ÇƠîƯ ̀Ê)èÛ8¤•Èû›«‡“Íjϼù׭Ŀ߇ŒƒvÏÅË̉»Ø¤ˆ\0½ÔÏÔ“¨ƯÓ «dăˆŸ;k±»Ϻ™‰kß [ïSÜÓ áíϼơÔíØÔ¾Fù×™‰kß [ïS̃„ƠX»ív¬ÖĂÙ‹ÓĂĂ߈ÏÅ¿‰Ă«‡“ÍjµØ·¼Í7¡»Ö¾8Ë ÿÛ÷‡›ƒå»‡)¸Ú/ୈ¹ƯNëö™Áƒvù×ÅØ×¿8κغ™‡»Ô¡ÛÖ¹‘ïpá½—¶×¿8±¿̉Å«»Åÿ×ưÀ«·3uU“¹ƯNÏÔ‚vưˆûÓøêëơ…ÔÍË)éÛ9¥߈Û«‚ ½9Ơ·‡‘×8çÑĂºßÚ¿ÅÓăˆŸ;ÇôăˆŸ;î!ùêÑÄëÛ«‚ ½9‡ºĂÙ±¿©ÓÂÙ‰ÛÏ¢ÇăˆŸ;Ï̉«Ô8¤‡É»ĽÑÓÑÓ›¶éƠà=ÿÛ™ëéå½Ù½™‰kß [ïSÅÔÏ̉Û×¹ívĂÙ÷å5ÓăˆŸ;k«‡“Íj9¥‡×¾»Ø߈ơ…ôúŸ}ºƯÓ ƠơÙ½ĂÙ÷ˆ±¿߈½€ăˆŸ½½ù×§ô™‡™Ô€^ưÀ©¼ñÓ߈ׇ߈±»ƠXÙÚκ]ăˆŸ;…ßÚ÷¼›ÚƠ~‘÷‘ơ™ÔÜÜÇØÅÓÙŒë*««‡“Íj߈ƒvßÑÓÔƒvÙ½ñÄ߈ĂÙ©ÇÙƠ«§ù×ÿÚ…ŒéÔơĂñÓµí‡ơà=ƒÛ«‚ ½9ø×•ŒëöÙƠÛº½›¶éö¯G‹ø³Œ·ÚÙ½œÁÓ½±¿™Ó«‡“ÍjÏŽÏåƒÚ³Ư÷ˆ•CưÁù׫‡“Íj¡È¥Æù×öÁ™‰kß [ïSÓØ½߈°»ơêÏÅÎơăˆŸëöñíÈÛ«‚ ½9¿ÏÅëáêùׇÚĂÄ–ï½À̉áöÛ«‚ ½9ÙÚ߈ïƠ÷ÚăˆŸ;çÚÙ½ÑÓ‡×ơêöÙ½›¾¼ô—‡«Ûƒø¿ÁĂؽÈ8¤‡ăˆŸ;‡º«‡“Íj³Øá=¡Çÿ§¯¾ǽ¾ºí¹̃߈ßƯ±½́êù×ă½ÏÅÎÅơÔÙ§›‰ÔÁáß§ÔÏÅ™‰kß [ïSÏÅêÚ’½·¼Í7çºù×ôĂƒv߈Ở¹óÏÔ·‡‘×8綉ٽ™‹¬¾±»×¾ƠÁ¹ÚúôщϹ‰Ïç̉ÁĂÏÔËÍÄơêÙ½ÙÚÏŃvÁ×µØỞªÔ‚v´ëö™‰kß [ïSëÚ¡ÁÑÓÆ>Û«‚ ½9ƯøơèÅÆ»ÏÔ±¿ÏÔĂÙ½ơÄ©Ø·Ó ¥0Ö¾ÍÓ™‰kß [ïS·ÔĂÙ±¿¹Ú™‡Ă«‡“Íj«·3uUçÚ¡Û±»‡Œ™‰kß [ïSơÛ«‚ ½9ƯÓ ¹ƠªÚéꙉkß [ïSÍӢȃØêö©‡¥2ßëMđÆ‹ÓăˆŸ;Ó¾‡x߈¶“º±»Û«‚ ½9ïÚăˆŸ;Ó ‹›æ¾åŒ¿N˜ß„ăàÏÔ±ëØÛÏ̉¹ÚơèÅ­Öû¯×½߈ơÅ™ëéåöÁÿ.‰Û¹Úù×ú(ăˆŸ;k«Û«‚ ½9ñÓ©¼ăˆŸ;ù×±¸÷$ơèÅ¿ßí‡߈ßƯ󇌾÷¼½ô9¥‡߈›¾‚ƒṽˆùׇÆÍÄæÚ +©‡¥2ßëMư§‡º±¿ù×ơê¿ß†º¾÷ÁưÁêö߈ª»щ󶺽›¾çÚñÓ‹ë߈“ÈÛ«‚ ½9‡¿ÅåôÏÅÏ|‡Œ߈ă»߈đÙ÷ÁÏÔ±¿º©ˆÑÓŸÈÏѽ8¤‡«»Û«‚ ½9Ï̉ߦ³ÔÅô´Ø£»÷¶•½ëöÛêÿßĂº£Çëö¥‰ÍL…Û«‚ ½9©‡¥2ßëM¿Ø‚ĂÓÑÓ«‡“ÍjñÚŸÖÛÄÓù×É›ÑÓ9¥‡ÍÄçÚăˆŸ;›¾™‡œ‰¾Iÿ¯¶™‰kß [ïS¸Ú§Ô ºçßÁµ!¡ÓĂÙÅÓéÓ¿ßÙ×Û«‚ ½9¹ØÏÔ“ÑÓË¿̀ĂƯºăˆŸ;½ö†ŒƠs»ô¨º™‰kß [ïSÏÅĐù×½ƒˆ¡ăÅæÙ‡­9“÷œÜÅÔçÚ«º³¹ØŒê*ª߈ù×ưÀ߈˜‰j̃ZîSñÓ–Óÿ¯¶±Á‹Çô™ơׄåĂơèű»Û«‚ ½9«‡“ÍjÛ«‚ ½9߈ܺ±»ûÅùשө¼‡Ú½÷êé3רçô«‡“Íjß¿»˜Óëö÷ˆưÅÇ‹™‰kß [ïS3ù×Û«‚ ½9éçÛ«‚ ½9ưÀơèÅ·È¥ˆ]1ù×ÏÅÏů×ưØÛ«‚ ½9›¾½«‡“Íjܫڇ)ÏÅ¡»¹Ú¤ˆ\0߈±¿‹ÇÏÔÏű»™óÁ̉ÙÚù×ñÛÀ‹Ü̃ÄØ߈Á̉À½«»Ç̉óÂî»ØŒê*ª¼‡Úù×§Ó Á Ù½×ƠÏÄçáÏĹڷ‡‘×8çÍƠ™Û«Ú™‰kß [ïS™ëéå•×̃ˆ¿ÅÖÓ›¾÷ÚÇÖÁƯ±û–©Ơ߈ÛÀ±»¿‰¥Ø¹Ú½€ùêÑ÷Á½÷Áñ~Û×±»‡×Û«‚ ½9éöÙÅëăˆŸ;±»¡ÛùשÇׯĂÙ‡ºƒv¥Ø¨ŸäË¿µ.¥Ùÿ¯¶ûÖóLJºÙै]1±»Ú×óÂÍ_¼‹Ç©bÓºƒvÏIJº̣«‡“ÍjÚêƒvå̉ ĂÏÔù×ăà˜ÁÁ0ï½Å“Æ߈ÅÙ₫Ûù꼿À¹Ú«‡“ÍjÛ«‚ ½9ÿÛ‘««‡“Íj¹Èïöö»ôưÀ¡ÔÉÙé—»ª»¯×¸àĂĂ ›­±àéMß»ûÿ«»êÔÛ­Ö܈ƒvöÏÅơèÅ˼ø°•‹Hƒ›¹éº÷¼8¤‡×½€ßƯ©‡¥2ßëMÛ«‚ ½9ƠÁé‡ù×åĂÿÚ°»Ïƒ×߈ÑÓñÚ½̉½ªÔÛ«‚ ½9Ï¿å̉ ç̃£Ø߈ưÀÇ髇“Íj›Ú·‡‘×8çåÁƒâÿÚ¯ÈÚ×ÅÓ˜‰j̃ [ïSÏ̉߈™‰kß [ïSíØ½‡ÙÚ½€µ‰ñÖ™Áƒ×Ở«‡“ÍjåÁ±”ĂƠĂÈçôÚª‚ +¼9óÇŸÖ—¶ăˆŸ‹Ü¹ÔơêưÀßÚ£ ĂÙ̉ÅÅÓŸÖơĂYƒÁĂăˆŸ÷Áëö™‰kß [ïS÷ÁçÚçôÇÛ¹Ù½µØó ›¶é©Çz÷Á󷇑×8ç§Ô½öÁƒvûÓ˹ỞñÓ߈«»½±¿¥Ø·‡‘×8ç‡×ëö‡ÛYÿ¯¶ùơ˱…œƒv߈äôíÖƒÙ´ÇÖêöÇÖ¯G‹øñÚöÁ ¿‰±»ö…ÛơèÅ·ÅŽ”ÈúÛ«‚ ½9ăˆŸ;kÁĂÚª‚ +¼9ø×±»ÔX› ¼úƠÛ«‚ ½9›à¥Æ9¥‡ívÛ«‚ ½9ăˆŸ;ŸĂÍÄ̉‚vÍË)éÛ9¥ÔX Ó¾ÅÛ>ívÍrƠ%éº߈ú̉5ƒvËƠ®Óñ̉ׯ9¥‡ä̉ׯÛ«‚ ½9ù×íÓô­ÖʹǼôêĂ9¥‡×§́ùê«Ô«âº›¾Ö$©£Ç̀Ä®ô7ßÁƒ½“Óß»û¥ˆ]1Á¼±»ÏÔïƠÅ¿À¼ĂÙÛ«‚ ½9ÏÄ«‡“ÍjöÔ‹ÜåÁ©Ó½Ô¸ÚÛ׋ÇÓØ9¥‡×›¾óÂ߈±»¯G‹øĂº¡%ÿÚº©¼ßÄÙăˆŸ;öÆ™ÔïƠŸÄÅỖˆÛ‡ƒvàº9¥‡ó¶/ÓÆÍÄơèÅùê$àƠÛÇÏÅÜÀÚª‚ +¼9öÍƠẳ»Úª‚ +¼9µØ¡ÛçÚëÓùåî»ÎÅư%̃ˆÛ«‚ ½9µØª‡’̀jÏÔ±»™‰kß [ïS¡ÈµØÏÅù×ÛG߈… û(÷Ô‰Áƒÿ©‰ùד¹ƯNÛ«‚ ½9™‡ăˆŸû(µØ%‹Üá æØå̉ ‡ºưÆ·‡‘×8çÍ÷ƬԽ™‹¥Ó«‡“Íj»‡Ăે“ÍjÙ½Âé÷Á±›¾¡Ç×¾º߈ĂĂ ›­±àéMŸ̉%óNjܿ‰ÅعÚß»ûù×ÏÅơꙉkß [ïS³çôÛ«‚ ½9Ơ(Ïßâˆ:¡Óå̉ ă‘·ÏÅÇÖëöÛÆ̉½‹ø¡Á†Œ«‡“Íj%•‹Hå¨߈«»Ñ½ÎÔø¿ÏÔ•ü‡°ø1æ̉£Ç±ÈÏÔÓÅ¥Ưψ«‡“Íjÿ¯¶±¿˜‰j̃ZîS«‡“Íj‚vôĂơê°»Úª‚ +¼9ăˆŸ;ËÛùê‡ÛöôăˆŸ;k‡Û“Ăº¡Ư¨Úª‚ +¼9»ĂÏÔùêÓØá ñ…ÖđƠüÀ ‚ÚÏÅŸÈơêăˆŸ¿‰ăˆŸ±»ƒàÁÛÙ½±Ï‰¿Iíº÷‡çô¾¯G‹ø«‡“Íj¸Úø×‡ºø×Ạ̊ƒù×é‰ñ5ñ·»ºñƦÆç߈÷‡å̉ Ï̉ôꙉkß [ïSç̉ͼ™ÔÿÚíº¶ƒˆëÚ±Û«‚ ½9¡Ô«‡“ÍjíêưÀ¡ÇÑÓăà·Å߈›ƯÅ–´†ử­Ö½¼¥È‹Ư¥Øƒv›¾ñ߈ëëöï烳Èÿ¯¶åÁÏÔ‰ØÙ׵ر»ăˆŸ;£Ø—»ÏÑÓívË¿‰y»Øëö̉ÁüÁ÷ˆ¸Ú¯ÜµØ­Ä…»ăºỔ©ØÑ·°»éº9¥‡»ØÏÔ™‡Ó“ï×Y«&™ÁÓ¼Ăº߈ÏÅùטô。Ôù×›¡Ù½Ó´ưÀùדƠ«‡“Íjñ±»£‡«ºï‰߈“Ơ¶Üù×ßÄÙǼ·‡‘×8ç¿»ƒƠ“È«‡“ÍjµØ9¥‡‹ÜüÀ»ĂÇÖ·ÔÄØº Ö†‡ü2—¶™Ê—jÄĂœ‰¾I߈μ«Ô¿»‹‚ăˆŸñ­ßÄÙâĐÓÙ½ƒvù¿¼©¼›¾ÏÔ“Æ“Ơ«ÔÙÜ‘€ăàƒÄ™‰kß [ïS•ŒúÚ ©ÓÁ½©‡¥2ßëMg°»í—Gø×ÓØ¾ß«‡“ÍjÙÚưÀ×Ó÷¼¡ØÏÅß”¡ÈăˆŸ;¸Ú¾ß +ª¶2tT߈ívçÚׇ½7˜‡‰Úɇ“ +ửÊƠ¾» +‹Ÿ¾ƒÔ¿ϼ©ƒv£XÓ߈½éºù×¹ó½€Ó̉úÙª ¶ 2 t T ׯ÷ÚßÚ·Å›¾äôs²È·Ø±»ß»û®ĂÙ³Èÿ×™‡ÁƯËÇŵØïƠ¡È‡Œÿ¯¶¢Èf¹́£ộƒ.ăˆŸ’º½™‰kß [ïSÅÓ°¿‡Ç¿ÅÅÙ©ÜÅØ©‡¥2ßëMÄÓ—ˆß«ËÉ9Û«‚ ½99¥‡‡ËÓ›¾ß„µØÔÅ₫®¶«‡“Íjù×ù×÷‡߈“•‡ºơê»ØÛ×ÏÔ£Y™Ô»nù×ăˆŸ;«bÚºå$±»¶ÜĂ‘ÚĂÈ»©‡¥2ßëMƒ‚v÷Áƒ¾‘íÆ̉ÅÙÚ§¹‡߈¡ÛÑ·«ÔĂÙöƒˆù‡ưÀùêØƠđ»“½ËǽÜÀ™‰kß [ïS‹ÜWí¹ßÚ×ÂĂàơêív¿ô±»¥½ɇïi™‰kß [ïS9¥‡«ÜÙ½ĂÈíÙ‰kß [ïSœÜ¶  ÎÔ—á‘ÍÅ&°»·Ô·‡‘×8çîÅ÷Ú£Ø5‡Û›¾ƒ½›¶éâà§ÔôĂơ»Û«‚ ½9ă»¿¿è·‹ăˆŸưÁÙÚåÁË̉™‰kß [ïS»ÔÉơêÓ¾ø×ĂĂÅÓ«‡“Íjù×ƠÚÇÛ×đÁ̉™Á™‰kß [ïSˆÔÓ‡ăˆŸ;߈¥Ûÿ¯¶Û«‚ ½9«‡“Íjß»û½³ÈăˆŸ;ׯÓÆ˜‡±ÈăˆŸ;k9¥‡×́½Ù½›¾ØÅê½Óëö™‡—Ó9¥‡˜ó +©ˆĂÙµØçÚ§Ơ±߈»ØùׇxÏÔ½ÓéêĐÓ ßÄÙרç̉«‡“Íj¹ÚªŒ¹Ú»ăˆŸïQ™‰kß [ïS߈ù׋àĂ ¿ßøê7Ù½›¾ÜÔ©¼ĂÑŰ» ߈ƠXٽŗ¶߈Û«‚ ½9«¼™‰kß [ïSù×Ă¼ƒvăË%·̣ÅĂ«Ô¥ÄË%´ØˆơÛ«‚ ½9ơ鿹ÏÅ÷ÁëŻƽÏ̉÷ä5̉‹Ç¿Ú߈êØăˆŸÛ«‚ ½9êöí$ÍB߈ưÀÍƠÑÅÿÚ³ÚÁ¼½¿àÓ¼©‡¥2ßëMơÄƯ©‡¥2ßëMëöçôÙ½µØÙŒë*«‹Û߈Á¹½ư“­ÄÏÔ©ÀͼĂÙщơ»óï²2…؋ۉƫ԰»™‰kß [ïS߈»Ü·Åñƽ̉º¹Á₫ëöøë§Ó¸à ®¼½ƒÅØĂÈƠ›ăƠ÷Ù½—¶›¾ÿܳ·‡‘×8ç×Ơ†7§jöÓµ±»ăà“ƠÿÚÛÄÓĂƒvœàÏÔÑ̃ïÚµaù׺ƠăˆŸ9¥‡¼ ëö‡»…±»߈¹Ú©¾·‡‘×8羂ƯûƠ–¶« ©ƒ»5ư¤«‡“Íj±»‹Ü«‡“Íj«‡“Íjƒç†µØ«NÏÔ‡9¥‡©‡¥2ßëMëöÏÅơÄưÀÓØôĂ áÛ«ÑÙ̉¾ăˆŸ;Ơé‰ñ5ñ·ÏÅĐÓçÚ©Ó̀ÓÏÅăˆŸ;­¾°ïí‡Ù-³ôăˆŸív÷ơï½»ÅăˆŸëÚÑÄë£Çƒ¾‘¯ÈÙ̉Ù½—ÓơèÅ«‡“Íj³ÑÓ»ØơèÅ׿™ôƯÓ ™‰kß [ïS¿ô±»ÛÀ³Ü±”ƯÚÑÄëăơívëöỞƠïD™‰kß [ïSÏÅÛ«‚ ½9·Ô‰¿I‹ÍéӮܩ¼ëöí—GăˆŸóÂËÉ9ß»ûù×Û«‚ ½9ÓÙ½“ƠÛ×ùêÛ«‚ ½9ơÄ«‡“Íj˜Á ơêÍË)éÛ9¥ơêÙ½Ææđ«‡“ÍjÜư“­Ö÷ÁïcƯå³ÔÏŵ؛¼ñÆöÁ±¿—ŒĐÓ ĂĂÑÅçÚ°»À½™ÀĂ÷ÁơèÅăàó™‰kß [ïS‹ÇÓØï™ù•¢Ç·ÔéÜ”ŒÏÔƒÖÂÙ™‰kß [ïS½ĂÙ9¥‡¿ÂƠçÔ¡±»ù¿äÁÎÔôêơꑾ‚ṽ½Ï̉Ó̉½Đƒvéꩇ¥2ßëM“ö庿‰‹Óù×ăˆŸßÚÑÓĂÙ¦Ô˜‰j̃ZîSỞỞ±»™‰kß [ïS»÷Ú׿8ëÚù×™‰kß [ïS¥ºĂơƒv­ÄÛ×ăˆŸ;½€…»ßƯ߈¾»ô«‡“Íj±ÔÙ×§ÓÙ½“Ơ¿Ï̉«¼í‡ÑØúÚר·‡‘×8çŸƠÛ«‚ ½9đÙ +ÅØ©Ó§ôÛ«‚ ½9›_ĐÄêÿÚß»ûÚª‚ +¼9±¿ËÉ9רÚª‚ +¼9™‰kß [ïSÅẠ̀Äëö£Çéº9¥‡˜‰j̃ZîS¥¼¹Ú߈ơÔ±»“ƽ߈½ôù×ù×—¶«‡“Íjív‡Œ½ºy ø×™‰kß [ïSĺø¿ỢĂÿ¯¶¯×«»ăˆŸ¯‰¯0Ö£äÛ«‚ ½9ÙÚơèÅÜ߈‹Üç°±»öÙÚÄ–ÏÔưƿߧÔĂÉ̉9¥‡ÅÓÅÓơùׅؼ¹ÚÏÔ‡Úª‚ +¼9Û«‚ ½9ăˆŸùרÍÄ߈™‰kß [ïS9¥‡«äù×±»ĂÙ¸ÚC½ÿÛ›çĂ¡¢ÎÅÛÚăÁ½˜‰j̃ZîS«‡“ÍjÿÚÏÅơçáÛÏÔù×麕×ÇĂơê—»¹ÚüMívÏÅÛº߈öñÚëƠU«·3uUÿ¯¶ÏÅ«·3uUăơÓºÜÚ I‡aù×ô£È½¹ƒˆ™ÛÁƯ§ÍÓù×˾™ôĂÎñÖăÇí₫˹íÆçÚ•×ÁÏ̉ÇÖÙ½¼‡ÇÚÇ‘®Ư‰¿ÚÙ½Á‡é/×:®GøÛ«‚ ½9ßÖ‰Û߈ƒÚŽ‚ÖÑĂéô¯¾åƠÛÄÓ‘ñÑÓËæ©…ôÅ»μÚ߈ÑĂăˆŸ;ăà¼Ø̉Æ]—ØăˆŸ;ÏÚßÄÙå̉ ĂĂ ›­±àéMö¸È¬Ö¶‰¿IơèŹÚǺÁƯ±Ưƒˆ߈ÏÅÑÓå̉ ăơưÀÛº÷Á9¥‡‚ôêù×ÂÙöÁ½°»¾ôŸ\ëö¿Ÿ}½‚v“Û™ëé嫇“Íj½âê‡Ú9¥‡«‡“Íj¡ÓÛ«‚ ½9±»Ë¿ÏÅÑĂ¬ÖƒíêưÀƒvâˆƠ«ÛÑĂºÜØŒê*ª©¼µØÓÔ°¿ưÜçƠÀÛ«‚ ½9“ÊqYù×ù¾ÏÔưÀ™‡ưººÙ½Á̉ß»û›¾ĂÙ½‡ñ5ƒ¾‘Û«‚ ½9ù‡®GøÿÚù‡Ûº‹Ç߈ׯÛ«‚ ½9߈Ơ¥‰ÍL…¥ÛÑÚåtå̉ ư§‡¡Û™‰kß [ïSͼ«Ô™‡¹»±»§Óù×á ăˆŸ;ăˆŸ;kÛ«‚ ½9Ɠۛ¾ׯ˜Á#ĂÈƺơ螺¶è‹ö±»Óà߈µØäŒ¾NƒvÍÓÁ̉™Á™‰kß [ïSù×ÓÅƠîÏÔï³2ËàñÓóð»ùê½€™‰kß [ïSÂÍË)éÛ9¥Ï|׿8߈Û«‚ ½9‹Ç¹Èă꛾ñÓÛ«‚ ½9Ù½·Ô}ÍÓ·‡‘×8çá ›¾­Ä·Å½߈¸Ú«‡“Íjă»ù׻ثÔ$ç̉—ˆ«»ĂƠØ× ï»¡Ô½Ó´ÓØÙÅë™Ô¿ô9¥‡×ñÏÔщÁ̉ÎÔ Ù×ù׿¹ñƇº×ÓåÁ™‰kß [ïSñÚÏÅû(¶Åø×ăˆŸ¹Úï½ù¿çÚ¡Û±½‹Ó×퇃ˆ±ëØ™‡ßÏĂƠ9¥‡¾ÍÓơÔÏÔç̉™`߈Ï̉ëö߈øê߈ëö»±¿ôÙ½—¶ù×ó×ăˆŸ;“ê­ÄÆ~Ç¥ØÚª‚ +¼9˜‡«‡“Íj£Ô—®«»ûÖ…ƠưÀ9¥‡Ç̉Ù×±»Ăº›v߈±»¨À±¿‡Ç€º—ÓßÄÙ‰Ôß»û÷Ù™ô½ùæö”¾ËÓơ»·Å•ºÏÅù×Û×™‰kß [ïS±¿ß»ûó#±»¡ƯÍı»ØÓƠñÆÅÓ«dï»§¡ƒv8¤‡×«»™ëéå¡È‡»ß„‹Ç‡‡Û»́ƒÆµù×§—ÍĂÏÅÛºöçÚăà9¥‡¶Ø«»ÍÓ©¼Ù×£éù×±»Û«‚ ½9߈íÖ¶Øív«‡“Íj¥ĂåÎ³ÈºĂºƒvưÀ‡ØĂȇºơê—»¯¼ù×ăơ…Œ¡Û߈¨ÇÏÔỞÇÖÿ¯¶ù׳ȋÓơꙉkß [ïS±»ưÀí"ỞÁƯ­Ô¯×­ØƠ™‰kß [ïSƒvÏÔăêµØĂÙ÷ÁÛÀùס%µØª¶2tTơêé׫‡“ÍjÓØÛºïƠ©—¶ăˆŸ;™‰kß [ïS×¾ívŽ½Ø¿‰­ØéôóÇÛ×ơèÅơêĂĂƠÑÓ¨‡¤2€̃êLÓù¿§Ô߈ÑÄë…%€½–ï²2ÏỘƒˆºyôăÁï̉½£ƯÇÛ«‚ ½9›¾ÙÓ÷Á£ÇưÀ³•™‰kß [ïS½ôĂÙ©ÜăˆŸ;k™ơù×’È ±»ăˆŸ;k½€ĂÏÔŒªÚƠ߈œ· ̉ ¤0 ù×½‘̀߈™‰kß [ïSöÁ§ÓÏŰ»›Ú±»ÇÅó^·‡‘×8çƒvµÈ…Öù×Û«‚ ½9«ÑߌÛ,󛡱”ÇÖÿ¯¶»~ûÓ‡ÚăˆŸ;·‡‘×8çרÙ‡Ï9…ă„̃%Û«‚ ½9¹à˹öÁ«»ñÓùÙ½Åùׂˆͽ¡ÔÉâî»ăˆŸ;™Û™‡±»ÚÀÙÚÚª‚ +¼9ñÚƒ¾‘Û¹™‰kß [ïSơêÙÚÏÔ¹Á9¥‡óÂơèÅÏ̉ÏÔÖ/Ô†/6/¦j/ù×ưÀ¥ˆ]1ÑÇÇÙ½››±½ưÀ™‡ÁĂÅÔÍË)éÛ9¥©&ù×ưº†‚v ßÅ‹ÙÑĂ™‰kß [ïS¡È¦ÔñÆÖÍƠö¥ˆ]1¾Å«Ô«‡“Íj›ÏŶù×£ƯѶù×ï»›¶é¿»Û«‚ ½9™‡ëöĂ麫»±¿»Åψ™‰kß [ïSưÚÂÙ™‡ưÀ™‰kß [ïS—ˆÏ)«‡“Íj¾‹Ç¥̣Û«‚ ½9Ïŵܗ»Ăö§Ôă»߈¡ÏÅÙÚ߈™‰kß [ïS¯Ơ·‡‘×8çÛÇË̉’Ơ…ÚơÅÑ ¯ÓÅăˆŸöÑÓ§ØÙ½×¾½ƒvÁ›Ơº̉ÏÔ½óÇÂÖщñÖ« ©ƒ»5óg™‰kß [ïSÄÔ߈£XăÚ¥ºƠßÁ·ÔæÚƒÚÛÄÓùq¡ÁͺÛ«‚ ½9ƒvÏÔ«·3uU·ÛßÏ«œ́ÁƯçĐÓå̉ ·ô³È½ÏÅÖĂå𻩼½£äºËÇ›¶é³ƠßÏÀ½W¯Ô«»±»ËÉ9“ÈƯº߈›¡Å߈ù׫‡“ÍjơÔÏŃvÿÚ¹ÚơÔÅÔăˆŸưÁÛ«‚ ½9ƒÚ±»ïDăˆŸ±¿“Æź±ëØơÔ˜‡‹Ç¥ØăÁË̀›‰ƠŨ‡¤2€̃êL¡—œ‰¾Iº½Ѷ‘Æ™‰kß [ïSµØç̉§Ó߈ä̉±¿ñÚùêŸëö±»éê·Ôƒ¾‘ß»û°¿½ôêëö¹ÚÙ¡ÛùסÁÍË)éÛ9¥Û«‚ ½9½»Ó‡å‡ƒÖÜŸbÁ‡é/×:±»µØ·ÔµØ±»›¶éùׇڃԱ»ÁƯ«‡“Íj¡Ư‰Ô߈ĂƠÙÚ«Ôᾫ»߈Ă ÙÅë‘Óî»·‡‘×8ç«Ô›¡ÑÓ½øï‰™‰kß [ïSó|”G½¹êöÏÔ¼Ă₫¹ÚÂÙÛ«‚ ½9ªÚ±»±»ÙÚ‹đ›Ê™‰kß [ïSăˆŸÚª‚ +¼9¹ÚÇÖƠX̃ÄØØƠÂÓûÖ߈Ă³•ĂÙËDZ»«»ù×ù×Ç̉£ÇÛ«‚ ½9÷Ô±»ƒ½Û«‚ ½9ÑÓ¿‰÷Á˜‡ÅØŸØíêçÇǺ£Çđ߈åÿ¯¶Û«‚ ½9Ó߈µØí±ÛÚÁ½¨ Ƙ‰j̃ZîSùÜ·¸߈ăˆŸăˆŸ;íêíà™‰kß [ïS£ä¿IÓÅÛ«‚ ½9·‡‘×8çơêñÆëö̀ÓɇƯÓ ¹Ú£ØëäŸ\•Ü߈•Èû›ơê­ܱ̃»…Ơ·ÔºéÔ¶¬Öù¿©Ó«Ñœ‡µƠ߈߈ù×ÏÅ»PƒˆçÚ°¿'›¾±ëر»̀ºg±»ÛÔ +ÿÚ¢È^»½ùº°»½ÉÙÙÅ볟»º½"߈ơÏ̉öáê½̣™‰kß [ïSˆÙדÈĂ™‰kß [ïS¡ơêψÛ«‚ ½9ѵر»«‡“ÍjÏÔ­ÄöñÁù×ÍÓù×߈ÔÅÓƒvÂçº¬ÅæÚ’ÈÙÅë߈¢X§ÈưÜÅØ›ÚƒvăˆŸ;—ˆû(©¼Óؽ$ïtç“Ơχﻋܷԙ‰kß [ïSÎÓ¾ÓºÇ̉ư؃ˆÛ«‚ ½9ß»ûÁ̉ÂĂù×̉Á£ä¼óÄăˆŸÅÔÓºÏ̉öÏÅÿܸñĂ¼½€ÜÛ×½øê´a™‰kß [ïSÑÓ›¾ƯâµØåõaâˆÑÄëöÛ«‚ ½9¹ÚÀ‡€è/Ö:ù×›¾ƼăˆŸ;ÏÔÙ½°»ñÓó×ÍÇ‚vï»ùדƠ÷ÁñÓñă9¥‡éêÇÖ„ö›¹«ø½₫DZ̉˜Ó±¿™‰kß [ïSÏŃv«‡“Íj¡Û̃ˆôêƠƒˆÍË)éÛ9¥Ăº¿́›¶é߈°»Ăù×›¾ưÀ©Ơƒv̀ӨؔºÿÂÛ«‚ ½9ăˆŸ;«‡“Íj†Û‡×ăˆŸ;ÍÄÏÔ÷‡8¤‡±»Á½À‡€è/Ö:›Û¡È·üă‹‚vƯ‰±»©ÇΟڹđÓù¿çØÛ«‚ ½9¹‰Û·‡‘×8çóĂ¡ÔăÇíÛÄÓ·q̉º½Û«‚ ½9œĂÛÄÓ…ô¥Ø¹Úâà?ÏÅơÔơv9¥‡£ä·‡‘×8ç¯à™‰kß [ïS߈§Ô™Áܧ́«‡“ÍjÛ«‚ ½9 ñÓùׂ½Á̉ËÇăˆŸơÄ›¡̃ˆù×­ÄÅØ±»¹Úƒ×ï½÷Ë“Ơ—»á̉˜êè䫇“Íj‹ÙÁƯ÷ÁïŧÔg¡ϼÙ×ù×£Óù׳³°½Û«‚ ½9ù×÷Á¹ö½—º™‰kß [ïSîƠưÀưÅ—¶ëöϾ¥Oª‡’̀jßÄÙù׫»ö߈½ơêÅ«‡“Íj÷ÑçôëöÛ«‚ ½9½ÑÄë±»¡ÔÙÚ߈̃ˆ9¥‡×»gÙŒë*«âˆßÄ٬Ļ˽ŸÄëÓ™‰kß [ïSöÏÔ³ÎÏÔ˜Á߈ơĂüÀ™‰kß [ïSœ‰¾IÙ½̃Úù×ưÀỔ—»å̉ ÷ˆ™‰kß [ïSÏÄÏ̉«·3uUÓºÁ×ăˆŸ;­Ä¾ß́ÁƠ¡ÛÉÖŽ߈9¥‡Û×ËÙ‹È0áºùêÛÄÓç̃ÙŒë*«€º½©¼߈±»¥Æ§Ø‚vĂÙ÷‡£ÂÏÅ“º½ë™H•ܽ9¥‡¯Û¼¨ÈÍË)éÛ9¥߈×Ó§¹Ùæ’ÅåôÓ½̃ơĂßÚ÷‡ÑÓÙ½›¶éù뙉kß [ïSׯ™‰kß [ïS×¾Æ»ăˆŸ;kơÔâ9¥‡Å–óÔ߈éG½¹ÍƠ™ÓéÚ™‰kß [ïSཅööÙ½I”Èú½ù×§ô˜‰j̃ZîSш–Œ߈µØ±»ñÆù×íºëöØŒê*ªƠµØ®Gø—»‹Ü·ºö¾¾Đæá꫇“ÍjÇ×Ơ›Úƒ½ÿ¶Û«‚ ½9ÏÅù×öÁ™‡ưÀÿ¯¶ÓÅÙ½µØ߈½óÂï*đ̉«‡“ÍjϺÙ´§Æˆ™‰kß [ïSăơ©ÇñÖËÖăˆŸ;ÁÛؽªÚͼ·Ó ¥0Û«‚ ½9ĂÙóÂ߈ư׃½ÑÓᬙØ÷ÁĂ²¸Ú›¾«ÔŸëƯÚª¶2tTăÁùåç'¾“Ƈº¼Ă™‰kß [ïS‡»éº9¥‡Ç!¹ÚëöÁ|§Æ½êöÅØơÔëÈ̉›¶éª‡’̀jÛ«‚ ½9ưÀÓ¼9¥‡ëöăˆŸ;ÏԒȽ“ÆÏỐÆ¥ˆ]1Û«‚ ½9ÏÔÁ½“È«·3uU¿öñÚù×ÏÄ™‰kß [ïS˜‰j̃ZîS±»Ž÷ˆ™ÓÏÅÅØÅ•ŒÔºlÙÓù×̉Åψ•%ăˆŸ;ăˆŸ;Ûꇽ±»ơÄăàç¼»Û«‚ ½9µaçÚ¨Ó¡Ô‡ŒÑÓÛÚÛÀƠ±½9¥‡́vé"ÏÚרù×ø¾Ïź¡ƯYá ¥ØßÚ¿èùêÏÔÅØ™ơÑÄëϼÓ˜‰j̃ZîSåĂß»ûçĂÏÔÍÓÄÙ«&«‡“Íj·ÎăˆŸ;߈ÁƯ˜È°»ÚºÏÔ›¶é›¾8¤‡·ÔºÛ«‚ ½9·ºéîµØÛºÊÖ½¼Ô³ÈµÊơÔ‹Ü‹ÇÑĂÿÚ™ÔÏ̉á ÿ¯¶™ëéå—ÓôóÄ́”ĂĂ ›­±àéMêÚ«‡“Íj¹à¢ÇëÔ₫ÇÑĂ½ôăơùêÚ׿¹—ˆ‹Ç—ă¹ÚƯ¶ËÖơê×Ú÷Á±»ưÚƒˆæ½©‡¥2ßëMù×Ươ߈Ë̉åôÍË)éÛ9¥™Ôß»û«Ä“Ơ£ÇψƒÏÅ麻Øùטô·‡‘×8竇“ÍjÛºÛưºÿ§÷Áøêß„™Ó£ä±Á™‡ëơÏÅᬵ†™ÓÚª‚ +¼9Ä–߈˹—Ó±»ÑÄëưÀ±»ÛÚ‡ÇÍÓÅØƯ±»Á×ɇ£Ư¹Ù½Å»IÛ«‚ ½9½©‡¥2ßëM»Åù׵صØÍÄٽ匿N©‡¥2ßëMÉ€ƠÁƯ¹Úñ̉˜êèä«Ô°»ëöơêŸç뙉kß [ïS™‰kß [ïS±»‹Ó9¥‡ÛĂÈ׿8å¼ ÏÔ×¾̀Ó ÓÓ‡¾™‰kß [ïSǨëö…ÜÛ«‚ ½9ÇÖ½…àĂƠÁÛÛ«‚ ½9½Ô˜‰j̃ZîSÓÁö«»Û«‚ ½9º«ÔưÀׯÿ׫‡“Íj˜‡Ăù×Ù½ưˆ›¶é“Ơ¼›¾™•ƠXÑÓÛÚ́‰Œú̉ÊÖÛ«‚ ½9°»Ú£Çëöëö߈™‡ª‡’̀j³ºó›¾ƒvÏÅÁĂ­¶º«‡“Íj™‰kß [ïSỞη¸™ÔÛÀăˆŸ;¡ÁĂÈÛ«‚ ½9Ù׿(ÓÓôê«»ÇÖå‰Û«â•ÜÛÀ“̃̃¶‡Ö8æƒ߈ª‡’̀j«‡“Íjœˆ½ÎÔå¼ ߈ͼ×¾߈ÂÙˆâñÆ̃ˆÙÚ÷Ù™ÛÎ̉‡º½©Óơ–‡x¸Ú–Ó™‰kß [ïS·Ø¿ÅÛ«‚ ½9ÅÓñ"ï¥5ÁăÚ×|×ơê±»¡ÈƯÓ ˜‡‹Ç´†ù¿ÏIJÂÏÔ¼ÈôöÁ’½߈›¶é¾º¿»•¶™‰kß [ïSǺªÚÅØ™‰kß [ïSƒà±”ơÔ™‰kß [ïSû(¹ÚÉ ÓàßÖ‡“Íj™ëéåʹ™à±»’º?™ëéå»çÂß»û°»°»£Ç8¤‡“ƠµßÙ¾™‰kß [ïS9¥‡›¶éÁ̉Âé‰ñ5ñ·­Ö“à׿8ÏÔ¾ÿ¯¶ƒv“Çä̉ÍĂøêĂÈ«»Ϻ½€«‡“Íj©ØÅ»ƯĂÙ™»µ.¥ÙËÓÁĂ«‡“Íj©‡¥2ßëM±»±»߈æÚơúŸÈ8¤‡½ÙŒë*«ׯµØ·‡‘×8竇“ÍjÛ«‚ ½9ÏÔ—¶Ñص.¥Ù«‡“Íj߈£ÜÛ«‚ ½9±»ÙÍÓG½¹öăơƒv‹Á߈ú̉™‡ÑصƠăˆŸ©¼đ»ôĂÛ«‚ ½9ƒv‚ÖÁĂ˜‰j̃ZîS·&½Û«‚ ½9ƠÜËÖ½¾‡™‰kß [ïS™ëéåÛ«‚ ½9ï»Ù½å̉ ÷‡߈íêơ꿉ÑÓ·Ô°»±¿߈Û«‚ ½9ÁƯ™»ÿÚöÁ›Ơÿ¯¶ÁƯº¿‰™‰kß [ïSÁƯß»ûå‘·ÔÛÄÓÛ׫‡“Íj«b·‡‘×8çéÓ»Åßø×ĂôñÆ™‰kß [ïS·‡‘×8çͼ«‡“ÍjÏÔưÀ™‰kß [ïSù¿½Ă™ơï½ÏÔÖ“ºÙÅëÁôÔ ù×ù×™Û½µ|Ù½˜‰j̃ZîS•ÇËÇxĂƒÔöÏÅ¡Ô߈Û«‚ ½9¡»Áă‹Ç©Ç¿‰íÎ9¥‡£X™‰kß [ïSר•ÖưÀƒv» +ÂÙ߈X½9¥‡ÿÚá9¥‡×¦ÔăˆŸÏÔƯº߈ăˆŸ;ßôĂô¡Ô»Ÿ9¥‡߈ÏÔÏÄÏÔ½ô·±»ÏÅ›€₫®¶‡xù×ƯºĂÙĐÓ‹Üùׇ“ĂăˆŸáÓ’½±Å‘ÅÓ¡È™ëéåÀƯ»ĂÛ™ÀƯ×Ü—»‰ˆÏÔ9¥‡äơÆ™‰kß [ïSÇ9œ‰¾I£ä€ÄKáêÜ“ÇèÚá=Ơ¿‰¯Èáê߈ë¬Ö-“ƵØơêÅ–º«Ñ߈©ØÆ´å̉ ơ»½ô—Ó¿¿Ù½ƒˆ¡Û߈ÏÔ«ÔĂ‹Ü߈µØ©ºù×›¾߈ÂÙ½™‰kß [ïSƒ«‡“Íj•Ö¹Ú¼—¶ëöéêß„²È¡ÁËÇĂ“ƠÁñ»¿‰ñíȱ»©¼±»•¾¹Úûر»°¿ÿ&¯÷å5ÓÛ«‚ ½9ä‰ ăàëöñÓáØÆ£Ç‹Üźµœ·̉ ¤0ñ”½€•½ϼ߈ÏÄÙ½ÁËơèÅêöÖ¼¯ÈỞ°» ±»Ị̈̉ÇưÀÛ«‚ ½9½ÏÅ£Óă­•½ÏÔƠ…Ô© +ơéĂÙ8¤‡×Ƽô™‰kß [ïS½ƒv­ÄÙÚ¡ƒˆÙ½­ÄÇÖEá ÈĂçôƯÜÛ«‚ ½9ŸÜé¾ÏÔ™‡™‡¾­Øéê¾ưˆơÔ›v¥È½ùê«Ô¿Øèº‹Ü¥ˆ]1÷Ô÷Á¹ÚưÀϼÑÓưÀ—Óù׋ܴÈăˆŸÅÓ™‰kß [ïSÏÔ‰¿IƒvµØÑĂÈ +ëö™‰kß [ïSƒvµØưÀ߈í£ØưÀ©)߈ ưºăˆŸ;ÍĂﻫ»ëöăˆŸ»‡ñÆÛÄÓ߈ƒˆ•ÇưÀ¿́µÈ«‡“ÍjÙÇÖÛ«‚ ½9¯¼ó“ƩÀ¹Ú›¾ăˆŸ;kñÚ˜‡—Ë‚v±Ư¡È…“ÁÁĂÇĂù×ù×›¾ÙŒë*«9¥‡ÿÚ­Öù×Û«‚ ½9Ăº¥Ó¾ßî½ÙÚ•ŒËÉ9©‡¥2ßëMÓÅ¿(ưÜÏÔµØרó9¥‡‡9ÍÄÁ½‡xæđ‡Ç©Çèơ™Ó™‡̉̉ÁằÓÏÔ—¾ƒÙŒë*«߈ØƠơÙ™‰kß [ïS¸ÚĂàµÙ×ĂÙ‹È0Ïŵ؇ڪ‚ +¼9ŽưÀºÙÚ¯Èùׇù³TÉĂ­Ä¿ÅåĂ¿ßỞ͉‰ÔäÆë‡·‰íÄÁ½¹ÚăƯ÷ÁëöăơÁåø×ßÚg±»À¼ÙYÊÓÇØ½‡߈œ·̉ ¤0¿»ÏÅéÓ¡ÔÚ×íØ¡Ơ¿»ù×øơꇌ«»ưÀØƠ£ä­Ôăà߈¡ÇơÔ¡Èä×—»§Ô¨¼«ÔăˆŸ;ù׋ÜË̉ƠXÙ½«·3uU±»™‰kß [ïSăˆŸ;¿ÅñÚĂÛ«‚ ½9߈₫I®¶I—¶÷ˆÑĂưÀéÓÂÙíÆ¤Ç·Ôÿ¯¶ÏÔư؃v}Ƽ…Ô9¥‡¹ÚÑÓƠªd±»±¿ô¹Ú«Ô«»“ÆçÚ±¿ưÀùêï¿»ñÓ×¾éÓÇâÏÔƠXª¶2tT×Ơ󪇒̀j«‡“Íj¹ØĂĂǽĂÙéÓÛ«‚ ½9ƒˆÿסçÚĂ›‡‰Ô§ô«ºßÖÏÔ¯ÍIïAå̉ •ŒÛÀå¼ ™‰kß [ïS±»ÑÓ‰yçÚöËÓù×߈ƒvÿ¯¶ш«‡“ÍjĂĂ÷å5Ó™‰kß [ïSƯơ·̃ƒà¡Á¹öùêÇÖçÚ÷‡‡ŒÓÆûÓÛ«‚ ½9ưÀ‹Ü«·3uU߈™Áàꩼ‰y߈ùêñÓơê÷ÚרÏÔăˆŸ™‰kß [ïSÇØ½«‡“ÍjÓÆñÖÏÄAƯÓ íç÷ÚçÚùê“ÆÏÅ× ù×Ï̉ăˆŸ“Ơï½Á̉±»œÁ‡ŒôÍÓƒˆ»Ñ9¥‡ÅÔ¶Åùê¥ÆÙ½Å»©Ó½đúÓùê8¤‡×ùë߈™‰kß [ïSÑæư†߈߈á$«Ô¥ÂœÜ¶“Æ–¦̀»ùº¿‰ÙÅ륉ÍL…ÿ¯¶˜‰j̃ZîS߈ÏÔ¹ Ơ·‡‘×8ç—¶¹ÚñÓ÷Á÷ÁùëÑÓÿ¯¶“ȯÈÛ«‚ ½9߈°”ùÚYµ†¿‰©ÓÛ«‚ ½9Ù̉»ˆ©Øׯ†ŒXXX«ÔÏĵÀ—ˆéêÅ ¬°àèMÏÔ°»Û«‚ ½9‡Œ·‡‘×8ç9¥‡×Û«‚ ½9“Ơÿ¼µs̉ÁÇÖăˆŸ;‹Ç÷Á”½ăˆŸ;‡Ç¸Úÿ¯¶߈凼µ†ÍÓÀ̉ä»Ñæß»ûó#›±½›¾¯Èÿ¯¶Y©–Ù׿ºÙÚ¹Úù×¹ÚÚª‚ +¼9±»ÏÄĐÄ?ê?ÇÜ‘±ÛßÄÙ¿ºëöăˆŸÿ¯¶ơèÅ·º¦ôÓ”ÈúỞ߈ßÄÙöÙ½Û«‚ ½9¶±»ŒÛ¼€ ½ËÉ9²ÈÄØÏÅÎÅăˆŸ;³•ă߈îÚ™‰kß [ïSƒ˜êèäăÇíùêóÔóÂØÓÛ«‚ ½9—ÓëößÚ¥ˆ]1âˆ;ß»û‚v™Ó½Ă‹¸ă»±»™‰kß [ïS©ÓÏÅ ÊûùׄôÀ½½ÄÏå̃ˆ™‡Žơê¼÷êưÀÏÔù¿£ä—Óï ×$íºư“ơêÛÄÓăàÓØÁ̉—¶›¶éÏ̉½ÀĂÙŒë*«™‰kß [ïSÓơÛ×™ÓÙ½±¿†Ç·¼Í7ăˆŸ›¶é²¾Á÷ÁăˆŸ߈ÁĂ‚Öá=9¥‡ƒƒv·ÔÅÏ&ßÄÙùש%Û«‚ ½9™‰kß [ïSă½ˆù×ÇÖÅӅ«·3uU¡»«Ôׯà—ÍË)éÛ9¥±»©‡¥2ßëMù׳ÂưÀÏÔ§«»…ƠÙ̀ăˆŸ߈ç4ßîơê%ëöùêß»ûñÓ‘â½̃™‰kß [ïS½߈ăˆŸ;k߈ÇØù×±»™ơöǺ‹Ùщ߈Á½‰á§ÔơÔÅÓÁÚÓÁñÓ›¡±»û£äơê“ +ؽ¨¼ơê“ÆĂåĂÁĂÙ‡9ÛÄÓÚ×ßÁ±¿ÑÄëơèź«‡“ÍjÏỘĂÿÚÑÓ°»™ôŸÄÍăvơă⋺Å÷ÁÅ麙‡Óº³Ó±»¼³Œ‹ÙÂÙƠħƽؕœ÷٣䛶é¦ÔĂÙ«Ôƒ¾‘ơê±é½±»°¿éÓñÓ¹ÚÛ×ÏÅ·‹µØ߈ûÓ‡ä½ñÓ¡ƠơÄÄÓ–¦̀»·Ó ¥0ơêÁ‡é/×:©"©Ø›Ă“Ç“¼Á“Ơ¯G‹ø̀ơÔĐÄê¡Ơ™‰kß [ïSù×çÚß»ûËÉ9é‡ëö«Ú™‰kß [ïSĂáŸ}±»¡ÛÙ½®È¯Ÿô§ÔăƠ÷Á¡Û§âœÁ½ƒvƒ×™‰kß [ïSͼÏÔÍU±¿—¶ø×ù×½£XñÓôêëö¾Ï̉œÔߌÛ,½€ĂƠ¡ÈÙ½߈ƠX±‚¹̃¡Û¾¹x˜êèäí½‘ÆÇ™ÏÔÙëÍù×½Ư‰ÂĂùêñíÈơÔß”Çó‰Ưºå̉ ߈ƒŒ«‡“Íj“ȇŒш¿Ø®¼‹Ç¹àƠ­Ô÷Á·ÔÍ©½Ăƒívéơôé‹ÈƒvÿÚăˆŸ;°»…ŒëøÙŒë*«™‰kß [ïSÏÔ™‰kß [ïSÍË)éÛ9¥ÑÓó¡Áå¼ ÷ÁÉÙéÔ“ÆÙƠ™ÔÛ«‚ ½9ÍÓ£Çß„WÍĂ™‰kß [ïSó»śÚËÁÅö˜‰j̃ZîS½ØăˆŸơê­ÄÀ½Ă½€ơ$ï³2±¿ù×ÂvÙ׵غÉv˪›¾ׯÏÅăàËÇ™ÁËÖÉÙ½å̉ ¹́· ùׇºù¾‹Ó«ÔƯÚ±»µØ™ơâˆ:±»§Ó°¿DÂÙ“½¹Ú½›vÙ«‡“ÍjưÀ9¥‡ƒÔÍÓ‡êẶÔỞ›¾ÛÄÓ’«Ô®ÈỞ·ÅƒˆºéÓ“È¥ơĂÓ9¥‡×·Üƒv±ëجÖÍƠ˜‡8¤‡ëöø×³ÆíÚ¿º›¾ù×ÔXÿ×щÏÅëöÛÀ«ÔͺÏ̉¯ƒ« +>ψ½¡Ô´«Ñ±»ƯđơÔïÚË̉ưӹڒȵØϺ×ø9¥‡±»«‡“Íjƒ¾‘å̉ ưÀĂÙ±»«·3uUÚ×—¼ÿÚ™‰kß [ïSÅӥǃvé‡Û«‚ ½9»ôź‡Ç¯G‹ø‡ŽÛ«‚ ½9«d«»ăˆŸưÀ™‡¥‰ÍL…Ÿ}ù×ͽăÇíÙ½å̉ Ç»¼€ÙÚ±ÈÂ÷Úº»¶±”›¾ÿÚ©¼Û«‚ ½9¿ßĂׯ½±$¡Ô©Ü·ï³Â³BăÇ핽÷½Ă߈ù×óÂ߈ơê·Ó ¥0ù×ưÀöùןևǘÓ̉ºö§ÓÛđ³Ü½½áÉĂÙÏÅéÓ½߈‚vùײ ·(ƒÖ±¿›Ú‹Ù·ÅăˆŸ;̀Çơꙉkß [ïS½€˜‰j̃ZîS»-‡Ổª»·ÅívǺ›¾“Æ™‰kß [ïSöơèÅöó½çÔ¡9¥‡½÷¼÷ÁªÓ́½¡ÔăƠ©¼‰5½ô߈ÙÅ뫇“ÍjĂ߈½ôÀ¹á ÙÚñÔ«‡“Íjƒ¥ ³:ù×̉ºơÄ«¼‚×8¤‡×»Á—»™‡›¡«Ôùô±óÛ«‚ ½9ăˆŸ;˜Áăơ»Åÿ$›Ú™‰kß [ïSĂƠ˜‰j̃ZîS½‡Œ·‡‘×8çÛ«‚ ½9‡ŒôĂÓÓëö₫¾Ñ櫇“Íj›¾ĂÙ¯¼ûÓù×­Ø‚ù×™‰kß [ïSûØ…»±ëØÚש‡¥2ßëMơê9¥‡ÅÓÙÅë½"«ÔÛ«‚ ½9…̃׺ư“›¾…Ơ›¶éí‡ĂÙ¡ºÚ5ª5‚55 +5¼95߈£»½½¿£%ÏÔ×ï¼ÔªÚï½÷Áé·̀ÇĂÙ‚ÅÓ¼ËÇ—¶ñÖÇĂñÚó.½ÔéÔËƠñÓ°»ÏÔ§ÍƠ¤ÂÙÅÄå̉ ëöăˆŸ;¡»±»ơèÅ߈±»¸à߈÷‡ñƆ“«»‹È¿ÅÛ«‚ ½9™‰kß [ïSÛ«‚ ½9¡ƠÚø×ÿ¯¶Ë%ív8¤‡×ÀĂùêµØăˆŸ;Çç—á߈ĂÂèƒváÛ¿Û«‚ ½9±»½ËÉ9ăˆŸ;̣ƒ—¾ăˆŸ¡ÈÏÅÂ߈Û«‚ ½9©¿ôñÓ™ÓÅø›v¿́½à ˆơê‹&™‰kß [ïSÛ«‚ ½9½€‹ÇËÉ9±»Ù9¥‡£äá=§‡đ»˜‡Û™̃ÎÅ™‰kß [ïSͼÛº«‡“ÍjŸ\«‡“Íj—»£XăÁÁÚíê¹ëö©Àëö§ØÛƯ‰Ûƒ«‡“Íj¼‡Ú±»ŸÖºăÂ܈ơä¼£äÂÓơÄÙÚ±ëØ™ôëöÉíûÿ¦•ÿ₫ ®¶ ̀+¹Úï½Ï̉Ùש¼¹£éºÎÅ©Øù×½«‡“ÍjÁƯ·ÔÖĂñÖăˆŸ‹ÜÄô¥ˆ]1¡óÏÔëöƠÚƒv¡ÓËÉ9ÏÅ—ÓçôËÉ9µ†«‡“ÍjéÚÁ±§ÓÁ¹®Èù×™̉ÏÔ›Û*Äュĉۭ¾Úפˆ(\(0(ÁƯóÇöÑÓÓÜÏÅͯéÏ߈½Ÿ}Ơ߈‚ +÷ÁƠ¡ÔơèÅÉ̉Œ½êö́½™‰kß [ïSáƠÿÛÓºÛ«‚ ½9ëöƒƯ·ÔÏÔù×—»ö¹ÚåqívÿÚ5ïÁÏÔívïƠgăˆŸ§ô߈àÏÔưÀđÖÁ½ÍƠ‘«¡È«‡“Íj“½¡ÈăˆŸ;‡ñ5ŒÓßÄÙËÉ9£Ç«‡“ÍjµÁ«‡“ÍjÏÔêÁ·ÔÏÄ“Ơ¿‰Ÿ}á˹ڜÜÙÅë±»ï»ÿÚ›¶é™‰kß [ïSÛå…»ÆÛ«‚ ½9µÙ½ç̉ăˆŸ£Ư£Ü™‰kß [ïS»Ă­¾¹ĂÎÿN†đ5ÏßÍÙ½¹Ú±»Á½á=ƠÄƒÚœÜøæăˆŸ;¦Æ§ÆơêëÚëÓ™‰kß [ïS¿º©Ó›¶é߈ö%ÏÔ߈ù×ç̉¤ÓÓÆÏÅ…ƠñÓÿ¯¶ùê½ô±Ü·ôưçÚ…à‡Ûùׇ½Xؽ©‡¥2ßëMÏÅĺÛ×Û«‚ ½9ÓØ±»Æ’®¼ƒvăˆŸ;s¹ƯNăƠÿ¯¶ù×ûƠăêßÁÙ×ÿ¯¶ÇÖÆ̉8¤‡Ö‹Üù×™‰kß [ïSÏÔĂ™‰kß [ïS±»ªÔ÷Âëö£ØơĂăˆŸ;ăˆŸ;½€ăÁ°»›¶éáêÂ÷Áºщơ“ơ$ùê©Ø¹Ú쇓«‡“ÍjׯçÚ«·3uU½ăˆŸưÀå̉ ùꕌ½ùê¨Ø ù×çó®¾×Ó…ö߈ÏăÁá¯ÈÏÔÛ«‚ ½9ÏÅö¿'÷‡Đæ߈¾ĂÙíÖÏ̉âơù×·ÛÙÚß»ûÇØ™Ó™‡¦Æ¥Ø¹ÚĂĂ ›­±àéM­v‹Ç¿‰ơêƠ»ÓưÀăÁñÓ©¼ù×ÜÛ«‚ ½9ă¥•Œ×Ơ·Åç̉ÓØ£»±»ÏÅ÷Á·¬¡‰Ưº†ŒăƠ©¼µØëöÏÔ™Á˜ôéÚßÄÙƠ½™‰kß [ïSv߈« ©ƒ»5¡ÔÁ|¡È‰¿I«»«Ô°»¤ˆ\0½«Ô°»̃úª‡’̀j±ÔÛ«‚ ½9ÅÓ«‡“ÍjôÖĂ¯˜êèäơèÅóÄ•&§ôưÀÿÚÏÔ߈8 ¤‡ ׫‡“Íj—ÓÙƠĐÄêщרÍË)éÛ9¥8¤‡ĂĂ ›­±àéM¿ßåƠ½ÖÆï½—ø³Ù½º߈½ĂÚª‚ +¼9¡Ûø× ¡ÏÔÓºƠÜù×ÏÔ°¿ +ưÀォ‡“Íjù×Ïß̃ˆƠ߈ÏÅûÙ£Èï½ív¥Ø…¸Ú´C­¾ÏÔÅԫԆסԃ׽ÁƯÛ«‚ ½9«‡“ÍjÏÅù×ÏÅ߈É˽€̣ÇơèÅﻹڭ€å̉ ´†Á‡é/×:ÙÚÙÚÏÅÛÀ ÍÓº£Ç¾gơêÛ½ÏÔ™×߈™‰kß [ïSÍÓßÄÙóÂéÓ±»Ù×…»›v›·Ôù׃ÖơÔ9¥‡©ÓµØ›Úơà±»±»º9¥‡ÎÄÿÚßÏĂÙ™‰kß [ïSçÚ«‡“ÍjÑØ¿¹µØœÚ— ƒˆăÁ»Â}ăˆŸ;ơêù×éÓ«·3uUÁ×ưÁƒ¶‡Ö8æṇ̃ĂĂÙ‹Ûù×Ưܽ܃v£ä߈ÍÓĂÛ«‚ ½9™‰kß [ïSùê9¥‡×§ô™Ô±»¤ˆ\0“ÆÁ‡é/×:8¤‡­¾ÏÔ©Àö³ØÙÚ±»߈åôçđÇ֯ȥˆ]1ù׿ñÓ»ĂÁâˆ:k£XăˆŸëöơÔăˆŸ߈ׯơêö¯¾‡x±»Ú×Ú¸à +Ư‰íÖéÓÁ¡Á¡»ø¾ÏÅ߈­Ø˜‰j̃ZîSÑÓ·Ó ¥0ÑÁ«‡“ÍjÏÅ­ÄÛºăơçđáçóÓÛ«‚ ½9‡“ÍjöíÆó§Ӿç÷Úª‡’̀j÷‡©Œ½Ñư«‡“ÍjÛ«‚ ½9ùשÇÁƯ«dưÀƒÙÚ×¢éÚ“Ơ¡ÔÁIù×ôꙉkß [ïSĂƠï½9¥‡¹ÚƠîÍÓ«·3uUëö±»ÁĂï»·Ó ¥0ù×éÓ₫ÇÏÅ›¾•Ö…̃éÜƠơ±»ăˆŸ;ëöçº₫Âăạ̀ǽ۫‚ ½9™‰kß [ïSÏÔúê ›¾ÙYÅÓƒˆ߈±»·ÅưÀñÆéêưÀëöËÉ9óÂó÷܇Ǜ¾©bÍË)éÛ9¥×臤2€̃êLƒˆÛÄÓá=×¾áëöăˆŸ;…Ûíêó÷ˆå̉ ñĂ¥Ûù׿‰êÚµê9¥‡«d¡ÁƠX‚×™‰kß [ïS€º±»ĂÙ³È×Ơ†7§jÑ·߈ø½¿Øơê߈ÛÄÓ—¶ÇÖ߈±ÜÍƠ—ˆÏ̉Ù½ư§‡©&ëöƠĂÏÅÙ½ª»ÁƯ§Ô‰̃́½Ù½›¾³1ÏÔÁÏÅăˆŸ;ßÖù×½ɹ«·3uU¥ˆ]1º²Â¾±»Å(匿N¹ÚºĂÛ«‚ ½9ñÚÜÛ«‚ ½9ùסԯȘ‰j̃ZîSÛ×ß»û¹Ú­¾Û«‚ ½9÷Ú₫ǧԇÇ₫®¶›¶éơú£»ửÛ«‚ ½9ª¶2tTëÓ•Üÿ¯¶ƒÚ½­vÙ½ÏÅ“Ơ¹ÚáÛưÀ¶ñÓéÚ­v«ä½¹£Ç“Æ¥‰ÍL…ß»û±¿ÍBëöÿÚô¿‰¨‡ ¤2 € ̃ ê L  ƒØ9¥‡À¹ƒà½±ºæ ÑÅÙÓƒ½¨¼©‡¥2ßëMăvƒØ›Ûר̉ˆ•Œ¥µĂÙ¿Å«‡“ÍjÙ½Ï̉åñ½çóăˆŸ;½€Î̉ÍÄÿ§™‰kß [ïS·Ô« ©ƒ»5Á ÏÅăˆŸ;ƒ×Ù̉…ÖĐƒ½ơèÅ»ˆ¼€ÏÄëöï³2±¿ºÓÓ˜‰j̃ZîS«‡“Íj½Ï̉µØù×ÏÔ÷Á»Û×Ù½ͼÏų½߈³Â±¿°»¹Ü߈âˆơĂÏÔå̉ ¼€“ÛÅ»éô÷ÁºÿÚ±̉ÿ¯¶ÙYׯƒv“ºưÀñ»±»Ïô¼½9¥‡ăÛßê9¥‡«‡“Íj¢äñWßÚ°¿¡çÔ¡øê©Óù×ÏÅÛ«‚ ½9§ØÁưÀï»Ù½Á¼߈åÁ±½Ơ›¡¥Ÿø|ÚÀ»©‡¥2ßëMÛ«‚ ½9Ù“Ơ‘®íÆơÔùêÁƯ‰Û•߈ăˆŸÅØ§Ó£Çψ—Ó₫®¶½€Üø×ÍƯéêÛÀ³ºóÍÄÏŨºÛ«‚ ½9ñÚéê… ϼñÁùꩾ̀Ç©Ơ‡“ĐˆÛ«‚ ½9ƒvëöÚ×øêr«‡“ÍjơêÏŋnjƠƠÄñÄ¥Ûù×íÈ™‰kß [ïS߈™Óá ñÚ™‰kß [ïS¬ÄÛ«‚ ½9·–ÛăˆŸ;Ơ߈å×ù×£Ư‹Çù×éÔ¥ˆ]1öÙĐÓ½œÂÙÚ­Ä¡ÁµÀ9¥‡×˜‰j̃ZîS‰¿I°»ºÛ«‚ ½9‚v½ù×ÛÀ£ óÓ̉Å­văˆŸ;kÿÛ¿‰ù×߈™ëéå›̃ĂÙǼ­Ö™´°¿«‡“ÍjĂÙŽă½‡ºçº˜‰j̃ZîSĂĂ ›­±àéMÏ»±»ÙÜ•ÏÅƯ¡™‰kß [ïS—Œăơ±Ô¼ôù×Ă߈¤¾ï½ơÔ•×ùæÛ«‚ ½9¹ÚËÇơê˜êèäÓÓÏÄ€¾¶Åµ±»£Ø™'ßÄÙƒˆÎÔ÷àÏũ؂vƒvÁ̉¡ÍÓơêÓ‹ÓăˆŸÅ«‡“Íj³kÙ™‡óÔ‡ă«dï½Ó—™‹Û«‚ ½9Ơ‹Èđ ƒăßƯ‡º¿à«‡“ÍjÏÄœÓÙ×éÚăˆŸ;kơû«‡“Íj½ÔƯ”ºĂ§Ôۺ߻ûÑÓ¡âùצÆËÖÛº©Óù×¢Çă–ëÓá̀ÓÙY­€Ù½ơêëÓ…n™‰kß [ïS¥ˆ]1öÁÍÓÛ×£äÁ³ÈÅØËÇ‚&ÙƠÑÓí‡åĂăˆŸ;­½¼Ïűi׺±»ñÓ­¾ÏÅ“È̀Ăƒv©¼û(ù׫ԛ·ÔỞ·Ó ¥0ù×ăˆŸ;‰¿IëöçÚÓØÂƠ³é‡Ô¡Á߈ÛöÁăˆŸ;ù×·̣¹ÚÁ’ÙÚÑÄ뾿‰Û½«Ú«då̉ ¾ĂÙ߈ÖÔ†6¦jơÔÏÔ«‡“ÍjÍĂ»Øùêå̉ «‡“Íj·Ô¿ÅÙÚ½ô½‹Çå̉ ź8¤‡éÓ°»¾‰Û«‚ ½9ǽÏŹ½ăê«»Ưß߈™ëéåä̉Úê&ш¸à°¿ƒv™‰kß [ïS˿۫‚ ½9ÏÔÙëƒàéơÉÔ«‡“Íjï½Ù½ñÓçÚ«»öÁÁ½½€9¥‡ÙÚù×­‡§Ô¹£öïÚ‡¾«‡“Íjƒ©Ø²ÓØÿ¯¶9¥‡Û«‚ ½9ÙÚï̉¡%™ëéåÛ«‚ ½9߈©Óå¼ µØƠÚ­Ä›¶é¿ß½đ×Ơ߈ù׫‡“Íj÷ˆ¡È˜ÛÏÄ߈ÅÛÍË)éÛ9¥ù×±»ÅăԯÈơê±»ív¾ßÅÓÓëÚª‚ +¼9­Ä½›·Ôªd«‡“Íj¸¹Øù×½öÁ߈Ù½«‡“ÍjăˆŸ;kÏ̉™‰kß [ïSÍË)éÛ9¥·‰±»9¥‡¼½±»ÇăˆŸ;Ơ«Ô½éØỬч¸Ú‡éêæô¿ô9¥‡™‡µØăˆŸ;ă®»ØưÀº©Ç8¤‡™Áơê±»Û«‚ ½9ăˆŸöÁ̉ëöáñÆĂÙ¶ÅÿÚùסԓƠ‡±¿°êØ߈κ Ù½ĐÄê/ʹ‡Œ¼ѶÛÀ£Èơº§ôºØ₫Q®¶QµØÁƯƒÚóÓ½ô߈ĂÙ¿½ÓØĂÙ×ưÜ«Ñ߈³¹ÅØëö»‡åÁ“Ơ“ȳÓÿ ĂّƽëöÍăˆŸ;½ëĂÙù×™‡¿º±»·ỖăˆŸ;ëöƠ·ÔăˆŸÏÔöƠÛ«‚ ½9ù×½ơԤdz۫‚ ½9÷Ù¯ÈÿÚÛ«‚ ½9±»Ù½ÅØÍƠ߈³ê¼ëöù×·‡‘×8çÅÓソßí‡éºñ×¼Ô±»̀Ê)èÛ8¤™‰kß [ïS÷½9¥‡áƯ°»¾½ ·Ô¹ÚÙ½å̉ ׯ“ܘ‡Ù½ÀĂƠ·̣÷$‘ÖÍå߈ù×ëöº‡ù×ăˆŸ;ÏÚùש‡¥2ßëMÙ‡Ï9…¡Èg“ƠÔ™‰kß [ïSéÓĂÖ©±»Ú×çÚ·ÔÅÓ«‡“ÍjñÖ¾ºÙܹ£ĂÈ÷‡ñÓ·‡‘×8çÁƯ½·Ô±»½±»8¤‡×³Èä}Û«‚ ½9ÛÄÓÏÔͼăˆŸ;k¿»ÑÓ÷Ú±”›€ơÔ…»ÉÙöÁ²Ç ½ù×¹àƒv»é‰ñ5ñ·ƠêØѶơØ“¸™ơ™‰kß [ïSƒ–ÁÙÚóÇ¡ÔÛ«‚ ½9ÅØù×ÏÄ÷ÁÙ½£é™‰kß [ïS«‡“ÍjÛ«‚ ½9ÿÛ÷$ÏÅÛ«‚ ½9߈ÙơêêơñÓ™ÁÛ×±»Ü¢Xómù×ưÀù×Ù-©Ç±»ç®©ˆÎ¢È¥<³ÂÖÆ ăˆŸ³ºó¿í9¥‡×ù¿³Ø™‰kß [ïSù׿‰ù×…Ô¥Ûöù×­vûأة‡¥2ßëM߈¾»›ÚØÅê·‡‘×8çÑØ™‰kß [ïSĂ¼ÓÔỂ™‰kß [ïSµØÙ½™Ă±»߈×̉ÿ¯¶°»Ó9¥‡×§ÈÖÆëÚÔ·§D ̀Ó ̀Ó…߈8¤‡Ö£Ç‡­¾°»©¼•‹HÅÔ¦¹½€ÿù×ÏÔíÖÇÖơê߈«ÑĂºưÀ÷Úăơ‹€ƒÖ¡%ù×÷‡Á½ÛÄÓÛ«‚ ½9₫®¶öß»ûöß»û‹ÈÛ«‚ ½9«‡“Íj·¸ÏÔĂÙù׫‡“Íjé9¥‡Ù×™‰kß [ïSëö½…ŒÏ̉†Œơêùơ9¥‡×ơÔăˆŸ§ÖƒÇ»Å·Åÿ¯¶8¤‡›¾§Ô‡ºñÆ÷Á¹ÚƼ°»×¾§Ốơ¡ÈÓÁ®ƠÓű»ăˆŸ;å̉ •Èû›́vÛ«‚ ½9ÏÅ“›¦›̉ăˆŸưÀỈ›¾ăơ•ƠưÀ‹ÜăˆŸ;kÿÚỞăે“ÍjíÖ±¿‡ŒöưÀăˆŸ;–¶«‡“Íjï‰ÏţصaÛÀử₫®¶º½€çôÑÅÙ½¾ưÀ“r¶ÙÚǺË̉™‰kß [ïSÛº߈8¤‡Ăêgùê½ĂùêĂ»‹¥ˆ]1›¾ÏÄëö˜‰j̃ZîSƒvÅØκ±»ô¶  ÙÚ™‡ö¬¾ǼçÚĐÄêù×éÓ“Æ߈ÓØ¡»ùט‰j̃ZîSÅÔƒv¥Ø߈ÖÔ†6¦jßÁăÇí¥‰ÍL…Úª‚ +¼9ñÁ¶ Û«‚ ½9ËÉ9ÁƯ›¦ĂëöÛ«‚ ½9«»ăˆŸëö·Ô§ÔƠù׼ƒvÁƯÁ½­v‚vï³2´Ă“•½â½ùêÑÅ¡ÔùêÏÅ­ØăˆŸ½€ÚÀ“Æ©ˆÙ½ö·ÜÍÓÈàÿ¼á ÏÔô¯E߈ăˆŸ¿Åñ»ÙÚ—ÖÏÔ˜‰j̃ZîSăÇ홉kß [ïS“¹ƯN§‡­Ă£äÓØăˆŸ;‹Èù×™‰kß [ïSå̉ ƒØÙÚ±‡×ÚÙÜ£Ưºï½“Èϼ«déê‘®¯Ü½ô°»ử²½ç̉Á˵Øđ»­€“Æ©‡¥2ßëM«·3uU£Ø½µ†ù׫‡“Íj÷ÁíJ¸ÚçÚÿÇÛר¯È¸Èæ̉‹Ç߈ô³ỔµØ¥‰ÍL…® £Çù×·Å™b©À‹Ç÷Á·‡‘×8ç¡Á߈ëöÙ×á ½ĂăÂư?ÓÓÑÓ¿›¹ăˆŸ;k©‡¥2ßëM«‡“ÍjÇÖ¹»₫®¶ÛºñÓÙÚÏԿŃÖß»û߈ƠÛ‡§›ưÀ±»«Ú¿ßÁÈÏÅăˆŸ;ÇÖéÓăˆŸ;“Ơ‚ÙơêĂĂéê§ÆăˆŸ;©‡¥2ßëMÙÚ×Ûº߈óÇ߈ÏÔÜ‹Ù߈™ÁÍË)éÛ9¥ϼ½Ü“sÚêÇ»«ºăˆŸ;Û×ó‹ÜøÙå×½€›Û½€‡º„¢­‰ÔóÁ·‡‘×8ç¢ä5‡º̀ÄÁ̉±”—»¿ʾ ăà±»áê•áÚª‚ +¼9ăˆŸØŒê*ª‹Ü½´Á½ÑÓÛ«‚ ½9§Ôá¼±¿°½ƒvÓ̉÷¼½«‡“Íjï½›¾©Óç®íØÿÚ€ÄëöÛºôĂÓùê…Ö¿Å߈·È¸Ú̃ˆºù׃ˆ™ ™ơ“ö†Œ—ă±»ƒщ½™‰kß [ïSÖ¾›¾×¿8ư§‡¤Ă«·3uUơêÁ×÷Á¥ẪÄØ߈ŸÅÁu¶«Ôϼ…¾߈º¥nÏÔ››ÔÿסÛ\ăˆŸơêר̃““½ÅÔè¼öÁƯÓ ÎÅÛ«‚ ½9¾ÅØùô‹ÈÛ«‚ ½9÷Áï²2Ù½ÑÓµÈÓÓÁñ»÷ÁÜøê›¶éáêÁ‡é/×:Î̉ÎÔº¸ÚÏÅ¼Ă³̣ć½ÿÚÓØÿ§ÓºÏ Ñ+Ù¶8¤‡‡Œ»̉Ñ «‡“ÍjÚª‚ +¼9Ù½§~ÚÀ§Àú̉Û×»ØçÚëö̃»úơê–Ó¸£Úª‚ +¼9ÏÔÛº±»öÏŰ»±»ÏÅÙŒë*«å̉ ÙÚ‹ÇÏÅÂÈơêĂÓóÔß»û«Ô¡ÛéóÇ¥ ¶èº½Ôºù×ͱ»©¼º÷ÁăˆŸ·Å«‡“ÍjÛÀ±»·ÔÛº—Áçđ±»÷ÚÚÀâÂ3ÑÓÑÓ÷ˆ¶·‡‘×8çăÁ¿‰ë罉¿I÷Áá=Û«‚ ½9‹ÜÿÚÈÙß»ûƒv½€­Ô·ØïÅå̉ ±»Ûººø±»ëÔùêé‡ÇÖ÷ÓÆ›¡†äÓºåÁßĐÄê Ơ‹Ó±»¯¼¿»Ï̉¿Øëö޵†ùê±»Û«‚ ½9¥ˆ]1ôĂù׋ÜÛ«‚ ½9•×ĂÙË¿³ÈÙ½ø× ÷Á°¿µØщ9¥‡ׯµØÜμ ôê±»©¼°»«‡“Íj—‹ÜĂÈ™‰kß [ïSëÔ‘÷øê“ǥƥÛ9¥‡ăˆŸ¿ÁĂϼ•Œ›¾óº™‰kß [ïSÁƯư‡±ù1ñÓÍË)éÛ9¥Û«‚ ½9«‡“Íjù×ơÔ§ÓưÀÛ§Jí'·‹ÏĽëöÙÚ÷Áƒ½Ó×IơÔר₫®¶Û«‚ ½9«‡“Íj9¥‡¼§Ôù×ÁƯ…»ÏÔ‡ÇñÖƒvçÚÇ̉½àƒ×ư¥Ǚ‰kß [ïS·Ô¡ÁÏÔ–½¥ÓÑÓÅÓ…ÎÅû(¬€½ØÏÔ Ç +«Ó·#µaÎÔ%ív¡ØĂ›¶é¡§ĂƠ‹Çùëɶ«ÔÛ«‚ ½9æØƒv›¡¿º¹ÚåZåĂg¥ˆ]1ĂÙ½ÖÔ†6¦jă½đÆáŃ׎¥ÓƒÔÁ½ëöñÆù‡₫®¶ôêùô¢äû(߈™‰kß [ïSĂÈ÷ÁĂÙÏÔŸÖ8¤‡×ß»û˾›¾•Œç4·Ôר™‡öÅØ›¡Û™ËÖñÚщƯ£ôÏÔ›¾ưÀ°»ÙƠÁ¼ƺÍÓ£Ưû(ăÂßÖÙ½±»˜‰j̃ZîS±»ƒÚ‰¿I9¥‡ưÀÑæåÁ¨ï½ÁƯƠ¾Gµ¡÷¶©¼±¿Ï̉ÔXë™H±»°»êöơê±»ÙÚÚª‚ +¼9ÏÔ¯ƒßͯ¥'=U#QK¯ÂÏÔ¥ÆvD…Öº½˜êèä߈ÏÅG½¹Û«‚ ½9÷ÁưÀëÚÏÔ½€ßÁ¹¾Á|ÅÓÊÖûÙƒvå̉ ½ëö· ƒvÛ™©‡¥2ßëMăˆŸƒvƒvËÖ߈©ˆ9¥‡×™‰kß [ïSÙÚÔXëö‡ÚØ×ƯÓ ±»ÓÔ¡ƠÅÓµaä̉ĂûĂÙ9¥‡×ÎÔÑÓó«ÔùרÇưÀ˜Ó½H°»ơêñÖë×ׯË̉™‰kß [ïSÛ«‚ ½9›¾Éͼ³z¯G‹øù×ç¼»±»¹Ú¬È›¿‰ö9¥‡ÇÖ½ÔơÔù×›ÚÍË)éÛ9¥Á½™'×¢Ïăˆ±ëØ…Û9¥‡ƠÅ9¥‡ñÓÛÛ«‚ ½9¶¶ÔïƠÎ¥Û­Ä™‰kß [ïSù×Ă™ÓÙÚ÷ơôĂ–Óÿ¯¶•×ÑÄëÛ«‚ ½9ĂÙƒv8¤‡ïÅưÀù×÷Ù…»Ù×Û«‚ ½9Åĺ±»ÁĂƒ¾‘Ù¿ÀшŸÄăơưÀ™‡—¶ï»“Û›¶éăÛ›Û¹¾÷½­Ô¼Èùæ‘ÆËÉ9¸Á¬çÿ¯¶ÛÄÓ¯G‹øñÚƒ¾‘·ÔÏ̉ù¿߈µØƒˆ£»©¼Ç̉ĂÏÅÅØ©‡¥2ßëMƠÑÄë¹½æØÏÄÿ¯¶¯¼ăˆŸµØ±»ăˆŸưÀ¶qÁéÓÛº±»÷‡щăˆŸËÇĂÆ9¥‡8¤‡±»©hø×¥ˆ]1ñÆ·cáưÁ̉µØßÄÙͽ߈óÇÅ•ÜăˆŸ¾åĂĂÙ¾ù×ù×­ö¡ÛƠ™‰kß [ïSÑÓö¡Ô£äÛ«‚ ½9·ÔÚª‚ +¼9ù×ÙŒë*«°» µaÏÔ߈§º¥Û›'ƒvêö±»Ă¼ß„¾Ÿ}ÁƯ©¼¦ÓăˆŸåß˹½ëöâà8¤‡×ơêÙ×ÉĂÄÔ±»°»½±»Ă¼G½¹™ëéåÛ«‚ ½9Ưȫ‡“ÍjÛ«‚ ½9Öë×…­ơÚû—ÏíÆÓØÿÚ‡xÑÓ“Û·Æ¢ °»ƒºƒvăˆŸ;Û«‚ ½9ͼ›¶éÛ뤽€Û«‚ ½9ÿ¯¶ÂYơ£ÅÓ»ˆª%ăÂĐà ɇ“åÀ¥Ø×µ†ơê¹ÚƠÄưÀÏ̉ĂÙívăˆŸ“é©«Ô´ÈÛÅ¥ÑÊÓâćŒ—»߈½€ẳ¯Û«‡“Íj¡Á«‡“Íjß½™‡‡¯à́v¿ÅûÏÔ¿Å‹ÇÆÅ–½ÏŃױÁïô·º©Ó‚Ú ÍË)éÛ9¥­½¼âˆ˜́«‡“Íj÷‡ù×å̉ —¾‚½™‡8¤‡áöÍÄñÓ‹Ü…̃ÅØÛ×ÎÅƯº©-ö½ỔÁ˜ơ°êØÛ«‚ ½9ÏÅăˆŸ;©¼ëö³ñÄ Áù×÷Ùœ‰ ¾I Ïź½ƒÖ¡Ô¡Ơ£Ëǹà9¥‡“ÎăˆŸ;©¼ƒvÛº™‰kß [ïS°»—»ÁߌÛ,­ØÛ«‚ ½9çÚ™‰kß [ïSĂÙ½€ó¡ÔÁ̉ÍÄâÁ“ÛöơûÓ9¥‡›¾ƒ½ôÍË)éÛ9¥™Ô§ôׯï½µØñÓ¿ß9¥‡ËÖÇôÿ‡ñ5œÂ‚Ë ÏÔ½ăˆŸ;ÓØëÚ¹Ö¿ºÛ«‡“Íj߈ĂÙµÈ퀙‰kß [ïS̉µñÖơêÅćºÑÓ߈ëÓ›¡ñÓÙÇÖĂȾØëöëö±»†½ çÚùêÏ̉Ó.‹ÇY‘CÓØ·Ôƒ½¥Æ½ôª»Ž¡ÛÓº³ôÏÅιăˆŸÏÔơꨇ¤2€̃êLƒÖ³ÈÙÚÓ̉¿»äcñÖ«‡“ÍjŸÖ«»ơèÅ×$÷Áù××Ơ™®˜êèäª&³ÿÚ™‰kß [ïSÏÔƒơꙉkß [ïS¾Å̀Ê)èÛ8¤Óºƒˆ—»ƒ®G ø ¥ˆ]1ÆöûƠ½ÏÅơèż'›¾ăàŸèÙ½߈×ÓăˆŸ°»¶ưÀºàĂ#ÏÄù×±»à=›¾ưÀƠ· é‡ÑÓëö¥ÆăˆŸ;Û«‚ ½9Ù×ăˆŸ;kˆơÔơ¯á ĂÈÑ=ƒvÙ½ÍË)éÛ9¥₫‚v ư­¶¹Ú’ưÀƒv‰¾•%ïƠ¥È“¹ƯN©ÜôÙN¦ƠŸÅ‡Û¥Æù׾߭'±»ƒvÏÔщ¡Ư¯¼åĂÏÔ‘Öƒv́ơ°»·ØÛº“Ơ›»öƒÖٽ啽ø¿ÓÅË̉ơÔ9¥‡ƒØÙ½ÏÅÏ߈ÏÔ×Ơ‹Û·Ó ¥0ù×»‡óDZ»ϼ…ÔÏ̉ơê»Øǽ•ŒÙ½ưÀ—‚vɹƒˆøÁ­Øí—G‰Û߈éJé‰Ó5“gesÁŽ€¡Ô™‰kß [ïS´†ÏÅ·‡‘×8ç̃»úÏ!홇ÿÛ¥đ±»ơĂä̉ăˆŸ;߈—»ửÂÙÉ̉ÏÔÿÂíØßÄÙƒväƠ¹Ú½¾Å±»§đ߈ÏÔ™º±¿€Ơ‡‹ÜÅ»öƠÁ¾»Ó¼«ÔỞ™‰kß [ïS¶ è «·3uU¨‡¤2€̃êLÀĂÏÄåºËÉ9ŸÖ¿ºÅÄ9¥‡³߈¹Ú߈×Ơ­È³Ø×Ơ9¥‡₫ß»û™‰kß [ïSÅı»ÓÅ×¾Û«‚ ½9¡ÛÚººëöâËÖï³2§Ôù׃v½ñÓ•%ÁƯßÚù×™‰kß [ïS¦ÆÑÓ¹ÚÏÔăˆŸ‹ÇÑÓ“ĐÄêÙ½«Ú™‰kß [ïS“”ǵإ¡«»ÍÓ·‡‘×8ç9¥‡‹Çùê߈ĐÄÔêÔð»ơÄÏÔº§ô°Á±»ù×ù·ÔËǃ¾‘±ÁÇÜ›¶é½€ÿÂăˆŸ;ƒˆÿ‡§Ø«·3uUăˆŸ;‡ùŒ»Á$̣¶úÚ“Èøë›ÚÓ¼ÏÔơèŸàÛ«‚ ½9ÙÅë–Ó¦Ô±»ƠçØö»w¡Çëö߈ùד߈÷‡Ç̉œ‰¾I߈‹Ó߈±»9¥‡±¿Ü™‡¾ÚƋӫ»¢ÈA¸Ú߈ØÅꥈ]1§¹ÚÛ«‚ ½9¹ڛ¾ô™‰kß [ïSÍË)éÛ9¥ƒ¾‘Ù½ơ꫇“Íj˜‡¿ºÚª‚ +¼9Ơ¾G½µØñÖ™ªÚÚª‚ +¼9é‰ñ5ñ·‹Ü˜‰j̃ZîS—Óå̉ ­½¼À¹Ó*ר߈ƒv9¥‡‹Ç̀Ó߈±»æØ$Ø×ÀĂ¼áê߈‰ƒÖÛ«‚ ½9ùêư“ÏÔ߈÷„ß„Ơщ©ÇÍÓù×₫ĐÓăˆŸ¿‰«‡“ÍjµØơ‡·̣©‡¥2ßëM˜ơ«Ô•é§Ô9¥‡ơÛó–ëöív¿‰ËÉ9©‡¥2ßëM¡Ôơ»óÔỞ‹ÇÁƯ₫¼ĂÙ½¥‰ÍL…ù׃֕ŒÄÓ¡Ô÷‡ù×ăˆŸ;±»ÏÔÇÓׯÍƠơèų©ØϹ°¿ï'½ÅØ£ÇÑÄë̀ÓÉܽù×ơèÅăĂ3›¶éơĂ­ÄϺ±eëáôÄù×½€ÏÔÏ̉¹Ú±½×Ă™‰kß [ïSÍƠÍÄĂÙ¯Ô¼ÔÛ«‚ ½9ÿ~ĂĂ ›­±àéM«Ô±»èô™¾Û«‚ ½9°¿'ÓØÙÚăˆŸ;k½߈íÆß»û§ÔưÀ·hôÛ«‚ ½9»y™Á±¿ŸÖÏ̉Ăƒ¾‘ëöÇÖƒ—¿̉Æ·‡‘×8çå̉ ÙÚÿÚÏÔñکDZ»™‰kß [ïSÿÚ†Ú™‡Ï̉߈ǰÙ×ơèŶô«ÚĂĂƒØ´a¿‰9¥‡߈£»ш°»ψ£Çø×÷Á߈ăÇí¨Ơ˜‰j̃ZîSÍÇä̉ưÀź÷ÁƠ׫‡“ÍjÛ«‚ ½9©̉á ™‰kß [ïSäôö™ÔÛ«‚ ½9Ă¹Úÿ¯¶º³ăƯ߈Ä–§¹¹ÚĂº¯¾ï»­ÖÚª‚ +¼9ÅÔ™‡ñíÈç™Á‘́‹Ç™‰kß [ïS­Ö̃»ú8¤‡×³ºó¶èܱ»ÏÅ퇳 ÛřӎÖÇ´“Ơ•Œ™‡Û«‚ ½9€ƠơèÅÍË)éÛ9¥ÖÆàÄç¹Ú₫®¶ơ꫇“Íj¯ÈËÇ›¶é·‡‘×8çÅ™‡ØÓ9¥‡߈ù×·ÚĂºÍË)éÛ9¥ÑÓÚª‚ +¼9ăˆŸ±ëØÉÔ«‡“Íj³ºó£@WöÁÙÚ̀Ä«‡“Íj™‰kß [ïS¹£Ǽ˜êèäÍƠ•ÖÁĂщç̉gÿ¯¶9¥‡×ÎÅ©¼ăˆŸ;ù¼˜‰j̃ZîSíÆ°»ÿÚµøçô˜‰j̃ZîSÑÄë¹ÅØƠÏÅ›¡Û«‚ ½9§ïÙ½߈ĂĂûɟħә‰kß [ïS©ÜÛ«‚ ½9¿ß߈½ÅØÇØͼÙ½…»×´ǽÊÇơÔŸÄÀƯ±½ÿÔÏÔ߈¾º…ÖăˆŸ;Û×ƯÓ ™‰kß [ïSÁ½å̉ ÍË)éÛ9¥ö¯ÓË¿™‡†×½µ‹ÁƯơêÙ½¹Á‰»±¾ÏÔ£Øó½ô€Ơ¹ÚÙ×±»»ˆéÓ̀Ó±»™‰kß [ïSÇÖ“ƠÏÅñÚÏÔó#ÛÄÓ¡Ôû(½¯‰¯0ºØ÷Áˆyư§‡«‡“Íj½¡ÔÁĂÑÄëÁƯ߈á=퇽ÑÄë ƠĂ™Ô˸¹½·Ô߈½…€­:§ÖÑĂÆ±»˜ÁûƠÄØχơÔöÁ«‡“Íjå^é‡ÁƯăơÇÑïÁ̃±»¹ÚÏÔá·Ô³lăê¥Æ÷Á‹Ù剃ƯÑÄë߈™‰kß [ïSă™ƠÏÅÇØÛ«‚ ½9±»¦Ôª-™ÓôêÏÅ÷¼¿º²(ơı¿³È‡߈Û«‚ ½9±đĂºÙÚÙ½ù×ÜĂȽ·‡‘×8çæØ‚v•Œëö߯ºơêÛÅÓ‘÷¡ÁỞ£Ô߈ÿÚ²ơ¯È­¾«Ô€Ä ̃ˆÏÄĂÙåÓ·‡‘×8çƯÅÄ¡È߈ï³2ăˆŸ±»½™ÓÙ½ù×±»߈ÿ¸½÷ÁÏÔ¡ÈíêÛ«‚ ½9Ù½çùê€öÅ£ƠùêçÚ÷‡ĂĂ™‰kß [ïSÅö‹ÇÛ«‚ ½9“ÆçÚĂÙù׃v¡ëù¿Ïƒ›oÚª‚ +¼9§ÓÁĂºÏÄß™ø|ù+߈‡º“Ơ¿»™ÁƒÙơ»ÅÓơê ƠɹµØçÚÏÔ½€°»Ù׃vËßÁƠÇÖ³Æï»ĂÙœÜé·ºÏÅ…ƠÁ½ÁƯ›¾Ơ÷ÚµØđÓ«‡“Íj©Ó«»߈¹ÚĂÄĂȡԛ¾ÁƯơĂ›¾¡ÔïiÏ̉“ƠăˆŸ±»¡È•ü߈ưÚƯÓ óƒĂƯíÏÄßÚ°”ƒØ…§Ô±»Âĺơ꤈\0Ÿ¿ÙÚÛ«‚ ½9¹ÚåÁù×ĂÚë‡÷ÁưÀùåÁĂ½¡ÁÙ»ă»ÑÓ×¾ơÔ߈ÏÔỔĂàƠăˆŸ;kѶ‡ưÁé꫇“Íj§ÓøæÛº°»ר₫ăˆŸĺ ›ÚµØœÜ·ÔĂÙưÀ™‰kß [ïS¡Áñù×ø× ƠX™‰kß [ïSƒv™‡²ÈçÇ«‡“Íj±»å̉ ù×ßÄÙÇ×¾£Đ›¾±¿ơĂÇÖ‡ŒÛ«‚ ½9£Ç¯¼›¾¨ĂÙª¶2tTÅ»9¥‡¬º¢ƠÇÖ߈—¶™‰kß [ïSé½ÁµÛ«‚ ½9ï»߈ËƠÏÔù×߈ØÓ’‰ 2  Ô, ø ô±»±»ëöÙÚƒvĂȽôׇ½7ÿ§ƒvv±»óÔ£“ù×ö…Œ­Å±»¹ÚÁĂ³•Œ¼Ô™‰kß [ïSŸÅ…Ơ‰¿I³ºó¼€ºư§‡½ôéÓ·Ó ¥0³Æ ÈƒvψöÁ‹ÈëöæÇ ‚v»‚¿‰ÙÁ9¥‡Ó̉ñÚ›¶éßÄÙÿÚ«‡“Íj±»«‡“Íj̃ÄØ­ÄăˆŸ;kшÁ½±ÁÁ‚½÷ơォ‡“Íj•ŒϺ«Ñø×½Ñ‚vơéëö©߈…»±»ĐØï½ÛÇ™ëéåâḈçĂ•»¹Ú¹¼ƒvƒˆ«‡“ÍjđÓÖ›¾߈‡Ç×»ïß™‰kß [ïSÖß½½ĂåÁ߈ơÔÛ«‚ ½9̃»úÇØ‡Œ·ØöÏÔåĂ߈ưÀĂ¼Ơ´Y±»³ºóÅӽǼëӯׇÚÚ×ÏÔ¾º±»×Ơ¢ ₫®¶öƯÚ½ÏÅĂăơÏÅöÙŒë*«½ï»¸Ø̃„ÍË)éÛ9¥¹Ç™‰kß [ïSÁƯù×ß»ûÔX©Ó© ÏÔ›Ú₫®¶§ÔăˆŸ;ÏÔ÷Úëöï»Ơ¾GÏÔăˆŸÛ«‚ ½9¡ÔăˆŸ;ÙĂ¼&ª‡’̀jÛ«‚ ½9Ç÷µŸ}μ ¿ºưÀÁưÀ½ÑÓ÷‡î²2 +˜‰j̃ZîS½§²ö߈™‡óÇÑÅÎÅÁƯؽ—ÓơÔª‡’̀j$ƒvØM¥ͪ±Ư½Ôôơ꫇“ÍjöÓ¾߈ơêÙ×™Ô¡ØÀĂáØƯÓ ÷ˆù¾߈ÏÅø×™‡Û«‚ ½9ç̉ăˆŸ;ơÔßÚá ±»ïÅÏÔ±»ăˆŸëö‡÷ÁË̉̃„ñÓÛÚÛ«‚ ½9Ù½ÏÔø×ר½ÔÛº¹Ú°»º«Úù×Ă²ÆÙƠ¶ôNẫÔÏÔ«Ô½ù×Ù½¦ôǺù×½€Ï¹Ú½ôƒvÏÔçÚ™‰kß [ïSƒv­Ø£Ø߈½ÜëÔù׃ÖߌÛ,ø×öÓÁ÷‡™‰kß [ïS‰¿Iù¿ĂȵØÛ«‚ ½9»Å±¿ÀƯ±ëØ“½ÖÆÛ×ơê›ÚƒvÍÄăˆŸÓ½óÇÑÓ‹Ù‰Ù̉ÏÔ‡ºéº«‡“Íj”Óíê·Å™‰kß [ïS‹ÜμÿÚÛ«‚ ½9±»ׯ¶™ëéå½·§D ™‡¹Ó—ÓÏÔóÇă»ÑÓ¤Ö9¥‡µØơê«»ƒvù×ĂÙĂÙ̀CÊ)CèÛC8C¤CCC™ÔơØËÜù×̣Ôï½…Ú¡Ôù×— ߈½8¤‡ÓÅÛ«‚ ½9«âÓ¾¬¾“Æơê±ëØ߈›¾Ởß»û÷ÁÏÔÓÆ³ºó»ØÏÔÀ¹ăÇí¿́£X³¾ëö™‰kß [ïS½©Óơº¿ô±»÷ˆ÷¼߈íÂÙ½ä̉JJ¿½ăàóĂù꫇“ÍjÛ×îÀ·Ó ¥0Ù½±¿ÑĂœÚ•«·3uUÛ׿½ëđ±»í0¹Ú±»ÏÔëö˜êèäù¾ÏÅ«‡“Íjô»½ĂÙ­ô¢ÈµÜß»ûï½ÛºÅÓßÁ×ÚĂĂ›¾™µÜÍĂÓөǾ™‰kß [ïS©±»§ô›Ú‡Ïŧ¹ÅÙÚ8¤‡×̃»ú™‰kß [ïSøêï½ôÔÑÄ똉j̃ZîSĂÙ¦ÈÓº˜0ê0è0ä0%ÏÔ߈íê¹9¥‡ÍÄÏÔ«‡“ÍjͦD ŸÅÙÜ¥<ưÀ«ÔóÂü“Úª‚ +¼9ï³2óÇÁËç̉%—»«‡“Íj½€ÇÖíÚÙ½ă›öÍÓñÚưÀ‹Ûß»ûñ~ËÖ±»™‰kß [ïSùêÛ«‚ ½9ׯ¿ô‰¿I߈Å»›¡ÓÅù¿ÁƯŽƠXéÙ´Ơ#Ù×ù×Î̉¹Ú©‡¥2ßëM«‡“Íjù×Û¾ÿ¼ª‡’̀j±»˹•׃v‡ơê«%«‡“Íj́ơ³ÎÅù×£ôíÆ™‰kß [ïS½½Á­Ä¥ÇÍÄͼÛ«‚ ½9ƒÖôê߈™‰kß [ïSƼĂÙ¿‰ƒv‹ÓëƠUßÄÙôÛ×Û«ÔƒvçôéÙYăˆŸÅ†Ç߈ÙÚÄӱ؅ö™Œ±»°»µØ™‰kß [ïS™‰kß [ïS°»­Ä½ëÏÚ廽°ë»˱ù×ùסÈ߈£Ç½Ư%¿»ƒv«÷öÁó¡È“Ơëö¹Ú˜‡ÏÔÏÅÑĂ匿NíÆöÿע䇺“ÆĂß÷ÁË̉£ØÓإƿôưÀÏÅ«ĂăÇíå»ûÙ«¼«Ø ‹ÓƒvÏÅ߈çôơê‹ÜÛ«‚ ½9»̉Áỡ±»ŸƯ±—¥áñÚÏÅÅÓ ȷđÏÔïóËÓØßÄÙ™‰kß [ïSö¡È«‡“Íj«‡“Íj߈Ạ̊ĂÅ–ÏÔÍ„9¥‡ăˆŸ;ù×Ù½±»™‰kß [ïS½ôö¡ÔưщÏ̉½ă»ÙÓƒü×½Ưߣä¶è߈­Ä˜‰j̃ZîSµÈ¯Á̉ơ»±»±»åĂ Ëû¡ÈÑĂÁÜר«»§‡ăˆŸ;­ÄơÔYéÓ™‰kß [ïS§Ô‡Ç‚åÁÑÓù×ɇ©¼´.¤Ùƽﻅ—™›¾—»ÓµÛ«‚ ½9ÿ¯¶ÏÔù×Ù¯ÈÍÓóǽ­v‡ñÚñÚÙ½¯rưÀ߈ăˆŸ;ƒˆùꙉkß [ïSÂưÀ»Ă°”ơ”æºĂÙ¡Á½ỞÅÓ½ÛͼôêÙÚÙÚåĂăˆŸ;‹ÈÀ¹ ¿́‡ºùêvỞå̉ ﻋǙ‰kß [ïS¢Ư߈¡.Û×ù×媺ÏĪڛ¾å̉ ˜‰j̃ZîS°»ëöâḈͽ¢ä½™ëéåÇÖÓèŸÅÛ«‚ ½9‰Ơáッȱ»®ö̀ĂĂÙ·‹±»¡Ô³ªÛÅÔƒÖ«ÔÛ«‚ ½9́Á ‡x™‡ñÚçÚÏÔó¹Ú‰yÅØ‰Ô‹ÙëöÛ«‚ ½9›văˆŸƒÖ˜ô߈™‰kß [ïS½—»߈ƠÎÅ ăˆŸóǼëËÇöÿ¯¶™‰kß [ïSñڵÕÈû›™ÔàƠ箹ÚÀÚơÔù׉¿I¿‰ÓصØƯơö¼ơê¿‰ăˆŸÙỤ́¶³Û«‚ ½9ƠơêǼ¡Ô¾êö‘Æ÷ÁÙƠ™‰kß [ïS·‡‘×8ç̀ÓđŸ}߈·‡‘×8çáØĂ« ©ƒ»5Óº߈öÏÅ‹ÓĂºëö–¶ƒ₫®¶æƠªÚ­`ÅÓ§ƯµØăˆŸ;ă…ÖÆ9¥‡©Ơß»û±kù×Û«‚ ½9ÍË)éÛ9¥™Ó¸Ú©‡¥2ßëMѶ›·Ô߈½æµ†ºëö¸à§Ø©¾½‡ѶÓ̉×̉»ÁửÏű»ƒ×ƒ«ÔÅÓ£̃ÇÖ÷ÁăˆŸ;‘ơê·ÅÊƠÁ‡é/×:·‡‘×8ç†Ú÷ÁåÁăˆŸÛÀ“Ơ‡Œ9¥‡©ÓƯÓ £½ëö‡±»ÅÓù×ăˆŸ;kù׿‰Û«‚ ½9©‡¥2ßëM·‡‘×8ç÷¼ÍÓ«‡“ÍjÁ½ñ‡±»¾ĐÄêÙ½½ô×¾щ™ÛщÍƠÚ×±»ƒˆăˆŸ÷ˆ¹Úéê¶߈´ÜÙĂ¼ºùëÚª‚ +¼9³§-½€·Ø÷ˆ™‰kß [ïS÷$™‰kß [ïSÅØ±»“‡ÍéÓ±»±»§ºÅØÜeƒ¾‘›¾÷ÁĂ —¾…“¦߈¡ƯĂĂ ›­±àéM9¥‡ëöåŸ}ÿ™‰kß [ïSĂù×Óº¹Ú¸Ú —¶ù×߈󶃽߈ăå̉ ñӻؼ€‡€Ç·‡‘×8ç÷ÁÓØ«‡“ÍjŸÖ߈ñ™ÇÓƒ¾‘ä¿ơÔËÉ9ņäß»û™ÓĂÙ¡ÇÂÖĂÈö·‡‘×8熓÷ˆßÉ«‡“ÍjÑÊ©‡¥2ßëMơÔá ±»°»ÿ¯¶÷‡ăˆŸÿڳ›·Ô¾ïϵØƯÓ ³Æ÷ÁÏÔù×ăˆŸ;k‡̃߈ܵØμØ÷Ú½ôùד¼ËÇéÓ™‰kß [ïS³«ỒĂÙ×›½…ÖƠå̉ ±»ÏÄ–Ó “Æü¦†±ù×ëö½Û«‚ ½9÷ÁöÁ°»ÏÔ›vƯº¿º߈‹ÇăˆŸ;•ŒÛ«‚ ½9“¹ƯN‘øûÓÇ%÷ÚÙÚ­ÖªÔ …Ó™‰kß [ïSñÓÁơéÑÓ˜‰j̃ZîSªbÏ̉ù™·×Ă¹ơÄ߈÷ˆÛ«‚ ½9›¾±»ăˆŸá=‰ÛƯâÄ ĂÙĐƒ½đ»ÁÓÏ߯ƒßͯ¥'=U#QK¯ÂÁÚ߈ù¿ùôëö‹Çëö9¥‡¡ÁÛ«‚ ½9¶ÔùÚÍƠ§Ô¯¾¶""¦ô°»Ó̉ǼÛ«‚ ½9Û«‚ ½9¾ +«ăˆŸÿÚ½€ëö§ŒψívỞ߈ăˆŸüÑÄëĐÓ¿‰ÑÓ½ô«‡“Íj“ÆưÀÛ«‚ ½9ƒØ“ȳ߇Œû؃ëö½¿º‚vëöáƠ«‡“ÍjŽåĂÏÅ™‰kß [ïS¿º̃ÎĂÙçô°»ÏÔ‹Ç™‰kß [ïS÷ÁÏÅéºÏÅíØÿ¹̃½ÜáºÅÔăˆŸçÚ¥¾ÏÅÓ¾£ØŒ¾¼¹£ÑîÛÄÓÅÔ½ÔñÓˆĂ×ÏÔ±»ăơƒv©¼ÛˆÏÔÖ$߈ƒÓÅ߈ëöơÔù×ĂÙµa«‡“Íj§éÚÓÆ߈ăˆŸ÷ê¾ÍBÎƠù׋ÇÏÔƒví—G«‡“Íj¤ˆ\0̣ÄåĂÜËÔÛ«‚ ½9·ÅµØăˆŸ;Ù½™‰kß [ïSî»ăˆŸ;«‡“Íj‹ÇËÉ9ÏÔ߈ËÖ߈Ï|‚Û«‚ ½9ÅÄăˆŸ‹ä­Äƒƒv‡Ç±»¦ƠÏŠ˦ôµØ«‡“Íj˜‰j̃ZîS±»ăˆŸÅô¿¹µØÿÚÿÚÏÔ8¤‡Ÿ}Ơ%°î±»Ï̉“ȃv™‰kß [ïS¹¾ƒvăˆŸ;ùש‡¥2ßëM¾ß×¾£ÇéÓáÀ¸àÓ¾«ù×Ù½­Ä½ÙÜñ‡×¾µØöÁÁ ŽăˆŸ;«‡“Íj½ÔÏ̉±»Ăô߈³ÂÎÂèÏÔ¯«·3uUĂºù×›¾ĂÈùן}ëöÿÛ ƠA¡\ưÁ®×ÙÚ˺Óâˆẳ߈±»™‡µÜ•ŒÁă·̣Óº£Ư9¥‡ƒ¤ØÛ«‚ ½9ɇ±»•Èû›ù×9¥‡Æ²¹çmñ¾Û«‚ ½9¶™‰kß [ïS¹Ú¡È ËûÛΕŒͼûÙíơáêÛ×›́v¿‰¦Ó ƒÖÓ̉³ƠÏÔ›‡¯ü˜ÁóƯܹÚׯưÀ™‰kß [ïSµa™‰kß [ïSÍÄŒôͼ«ä“¹ƯNÀĂ”½àóǽ9¥‡¿Ơ߈˜‰j̃ZîSÛ«‚ ½9ºưÿ™‰kß [ïS¯³ÀƯơêÁăÙÚ¯×ÛÄÓƒ›Ï̉±»ơÄ₫ÔáÛ˜‰j̃ZîS±»ëö³ ¾«‡“Íj³ÈÑÄë߈Û×·Ó ¥0·‡‘×8çÀĂ™‰kß [ïS…Ú¿‰€Ëµ‡̣ÇăºÍĂ™‰kß [ïS³ºó¦¹Á¡Ô™‰kß [ïS¶Ü ³ĂÙÙ½ơêÏÅÚª‚ +¼9¡Ô½ËÇăà‡“ưÀ¿‰ÓØÅÄ«‡“Íjƒ×™‰kß [ïS§ôÉ̉½±»ù×ÿÚ£ÆÚăĂ3ĂĂ ›­±àéMƒˆ߈¦ÔáñÓáÏ­¾±·̣›¾ÿדÈÙ½åÁăˆŸÛ«‚ ½9ÏÅçÚ·Ó ¥0‹!9¥‡×ĂÙÚª‚ +¼9vµØûÓ¼Ă—¶Û«‚ ½9ĐÄ +ê +ƠX×ÚơÔĂÙöÁ°»Ç̉àĂ¡Ô«́™‰kß [ïSù×÷ÁÇ»߈ÙŒë*«¿‰ù×Ûº×ĂăơƠÏÔ°»ÙÚ¬ÖĂĂ ›­±àéM·‡‘×8çÍ­H›¾ưÀ»Ø£éÅÓ©¼ç&ĐÓøêÈ̉₫X®¶X­đµ½ƒØç̉Ë̉ÍË)éÛ9¥ÅÓÚª‚ +¼9Ä’ëöƠ…»‹ÜµØÑĂÈ¢Ç߈öơÔơĂ£Óëö÷ÁÛº½ÏÔŒ¾°»¿ØË̉±»Û«‚ ½9†Œ›¾¡Ôùת‡’̀j»Ă¿ÔÅØ«‡“ÍjÁ¹¨¼—ÓÓÓ߈—ŒÇÖÚÆ1Ù½ưÀÏÅ«‡“Íjÿ¯¶Ź™‰kß [ïS¡Ô˜êèäÑÅëöÁƯ%¿É9¥‡éº‰Û÷ÚÓÁ÷Áñ¿ôöĂÙ…Ö…ÖÓÅØ›‰8¤‡×“Ä»½Ï̉ƒØ³ºó¼Û߈‹Ü‹È—»̉ÆÙŒë*«ŸØ¿‰’½ßÚ¿½«ÚÇÖ¹Úù×̉Æøê½ƒvÛ«‚ ½9±»¬¾¬ÖŸÈ·ÅơêÓØăˆŸ;‰ºăˆŸçÚƒv×Á½ÏÔù×ÙYÏÔ÷ÁùêĐØơê½€›¾ơêµa¹ÏÅ₫®¶¶ÏđֹÚ÷ÁÜƯÀù¿÷¼í'9¥‡ĂÙ‡Œùê½ô›¾¡ÔÙ½¶‰Á̉߈∣Øí¥ªÚÛש“öç½Ù½ëöù×ß»û˜‰j̃ZîSÏÔ®ÏÔ¾ßö§ÓÛ«‚ ½9ÿÚ¹Úó|ñÖĐù‡ؽăˆŸĂÙ½Z“ƠÏÄÁƯ±»Ưº߈¹»ơ*ÙÚéêëö‡×ÚƠ¿‰%ÏÅăˆŸ;µÈù…öëöăp²Ư•Èû›Ă‘³Øù׫Գ á «‡“Íj£ÍơÔ¯”Î̉£Çé¼ÄÓ±»µœ½ÔÛ«‚ ½9ơ갻匿NÿÚ˿ٽçôÏ̉Ú½Ă£XßÄÙëÚưÀÅØŸÅ¹ +å̉ ɶÙÚơ©º¹Ú9¥‡×ªÚñÍ«‡“Íjø×ĂÈÛ«‚ ½9éJé‰Ó5“gesÁÅÁÓÙ½߈ÅӮ騙‰kß [ïS³ ăÇíßƯóÂ߈ÛÄÓá=·Ó ¥0±»ñ«‡“Íj„ô¼»ÍÄơĂÅÔÛ«‚ ½9ó‡‚vöàƠù¿ûœÜ«‡“Íjëö©Ó§Ó›¡ÿÚÚª‚ +¼9¼êöÍ­H½«‡“ÍjÏÔù×½ϼ­Ä¶‡Ö8æ«Ô”÷8Û«‚ ½9·‡‘×8çËÇ퇷‡‘×8çÍĂ½™‡¿»±½ÍƠù×ëöÑĂâÁßô÷‡9¥‡«‡“ÍjÎÅ“¹ƯN›¾éº™Á™ëéåµa“°Ø§ô÷ÁÛ«‚ ½9«»£Ư9¥‡ßÁ½ƒv†ŒËÉ9½´a§ÔψáëöÇù¿ƒˆ¼Ăºß»ûÅØ·Ô·Ó ¥0ù׫‡“Íj›¶éăˆŸ;ăˆŸ;ͽ½‡ëö×Ă½›¾·ÅƒÀ̃ˆ§ÓˆÏÅï½±ëØùêĂÙÍB»Ô§Óר×̉ưÀƠXÿÚÑÓ»ÅƠăˆŸ;ÍÙƠçôï½½€ăàå°ăˆŸ;ªdôø÷ÙăàƒvƠXù×öÛ¾ƒ¹Ú½€ÏÔî»8¤‡Ö‡Ç5ÅØå¿á »‹ÿÚăٽӺ׼ơÄù×¹»˜‰j̃ZîS‡ÇÄÔ¤¾™ÓơËÖƠ”ÿØƠÙ×ăˆŸ‹Ç»—í—G—¶°»߈¾€º½ĂçÚÏÅé‡ú(çÚ±»߈ÿ¯¶Ơø½€éôƒÚÄÛ«‚ ½9™‰kß [ïS‡ñ5ăˆŸáÙŒë*«Û«‚ ½9€~9¥‡ÍƠơèÅ}ÙÚ™‰kß [ïSăÄ™‰kß [ïS¥‹Û«‚ ½9ưÀñÖë +ăˆŸ;ÅÓÁÏÄ›¶éưÀ™‰kß [ïS«Ô¹Ú…•ÅĂ™‰kß [ïS™‰kß [ïS‘’áÛµØÏŇŒÁỮ»ú«ÈG½¹˜êèä§›ĂĂ ›­±àéM§ôưpƯˆ˜‰j̃ZîSéÓÙ½WÔÁĂ¡Èù×ùêöă»Óذ»·Ôó‰©ÙïÂÛ«‚ ½9ĂÈÙYËÁ«‡“Íjùê±Å‘ƒv߈¹Úù×÷¼³¹Û«‚ ½9«‡“Íj¡Ûù¾í¶Á½ÅÓÏÔßÚù׌ÉÑÄëáØ¹ÏÅ9¥‡­Ä¿ß±»ơ»éê9¥‡Ï +Á̉™‰kß [ïS¥Øƒv˜ĂơÔ¸ÚăˆŸûƠÆ»ù¼¥ˆ]1Û¤ˆ\0ƯăˆŸ;ƒ½çÚ߈Ù½«‡“ÍjĂñÆíØưÀ߈˜êèäù×óÇÏÅø|§ÔÛê¥Ø¾¹;‰Ôƒv™‰kß [ïSÁ̉¥Óù× Á‰Ôëö¥Øèơ ‹ÜçÚ«ÔÛ»÷·Ôׯµ†¿‰‹Ü߈ívăˆŸ;ñÚö±Ô°»̀ÓëÚ‘Æï»ưÀ˜‰j̃ZîSŸ}™‰kß [ïSﻓƠẴ¯Û©Óû(ÂÈÏÅñÆ9¥‡ƯÓ ơ?ù¹¾½›¡ÿÂáêƒ7ÿ¯¶éÓưÀ³Âƒvﺙ‡ÏÅßÖ«‡“Íj÷¼ă»›¾—ˆ×ÜûÓ™‰kß [ïS§Æ¹Á³ó™‰kß [ïSß»û̃»ú…ƒvÂÙơêßÖ›¾ơÔÛ«‚ ½9©‡¥2ßëMéÓùơÀ½¹Ú÷‡«ä§½“ÇăˆŸ;k“ÛßÚä̉ơèÅÙÓŒ¾¤ˆ\0Úº½·§D çp£ Û«‚ ½9ϱ¹Ú…Œ“È¡ÅØ³«‡“Íj™‰kß [ïSÙÑôĂÁ̉ÏŇŒ™‰kß [ïSù×Ûê·‡‘×8çëöÛ«‚ ½9çÚéꃽ¯Û«âä̉°»ÓµOÇÖ­¶¡Èƒv÷Á™‰kß [ïSáÓ™‰kß [ïSÁĂÅ×Ơ±»ÏÔ¡ÈçÚ̉™‰kß [ïSÏÔƒàëööä5̉›¶éù×™$áù×½€¿‰º™ëéå«ÔỞˆ«‡“Íjơ꿉÷ÁÛƒˆµÙƠÅóÍÙÜÔÄù꺥ÛÿºÅÛʼn¿I›́˜‰j̃ZîS‚¡ÇÀĂ +ñÚ•½¥Đ»yÿ¯¶ÚÀŒ₫÷‡§ôº™Ô½›¾ăˆŸåĂƒv—¾ÿ¼ûÓÅnƒ´¬ÈùêÏÄ™‰kß [ïSăˆŸù×áƠ—ڛڵدח»¿‰ÙÚơê嘺۫‚ ½9“ÈÁ½ÁƯ©ưÀÙ½ơê%€ÇŸÈÏÔϼÇÖ̃ˆăˆŸ;ƯÓ “ÇÛÇử³ïÚâÁ¯ÈÆè߈™³«‡“ÍjéÏÅ—»­ÄÚêÅØ©ƠÙ½¯å̉ £X¿Ø—»ëö∙‰kß [ïS™ëéåö½—Œ¿Å₫%®¶%ëöͽŸèÍË)éÛ9¥«»§ô⺃¾‘Åàǽ‹Ü±»Ù½Û×ÇÓ¡Û½ÔÓØ™Óƒv±»9¥‡ĂÙ½¾‡ÏÅ8¤‡ù¯ƠƒˆƒÔ¸Ú¸Á“¼˜‰j̃ZîS›¡‡Ü±»̣í½ùơ›v®È—«‡“Íj·ÔăÁ½ăêµaÁƯù×ñÓ¹àÑÓÁ|£ÖơÔ—»Ă¡‹Ü—¶߈רˆĂÙív·¼Í7«‡“ÍjíÖ¡ÔƯÓ Á½9¥‡Ơ«‡“ÍjÏ̉̃ŒÚ,äơ¨ºÔºlß…ßÚ“Æ™ëéåË̉˜ơ+Û«‚ ½9¸½‹ÇĂÙ9¥‡º»½±»ÁƯ¶º·‹ׯŽ9¥‡Û× ºçôŸĂ˜‰j̃ZîS¸Ú¾¿ˆƒvº¡Èÿ¯¶ÿ¼ăˆŸ;‡Ûơꗈ§Ơ‹ÜçÚ¥Øà(4œHĐ$»¨Û«‚ ½9ÛÛ×ù×Ǽ€ë ÙÚ›Ú•Ü›¶é«‡“ÍjƒØéêĂÙ߈Ûƒ߈àö©‡¥2ßëMÑÄëô¼°»¥Èù꛾½Z­ÄÙ½ëöç̉¶ÁÓ›¡ÅØß»û«‡“Íj¼ +™‰kß [ïSăˆŸ;íÆŸÇ˜‰j̃ZîS‡¾«»ơŸ¡Çơê¶ + +±»±‡ÓżߌÛ,ÁơÁĂă'¾Ó G½¹Úª‚ +¼9ƒˆ߈«Ôéº߈ñÚ‡ñ5ÁƯ±Ø¹ÚØ×°»±%ƒØŽĐÓרÏıëØÏ̉ƠÛ«‚ ½9ÍƠ•ÖÅÑÓ‹ÇÏÅÇ̉Ù½‡Œ‡Ú¿»ªÄöÍƠ“¹ƯN½áƯÊƠ±»g¾(½ËÉ9¡ÔœĂ₫ +®¶ +ÁƯ÷ÚÔăˆŸ;kÏž³₫&®¶&ÙÜ÷ˆ߈§®ưÀ«Ô£äëÔ½Ù½ù׿‰Ž™‰kß [ïSÅÙơê«Ôs«»ù‰ÅØĐÄê¡ÈăˆŸ;™´Å¦¹«‡“Íj…ô™‡£äëöù׫‡“ÍjñÆÛ«‚ ½9‚¹ÚׯÅÔñÚÁÛÅØù ™ơŸÖçÚÍÄÅÓ߈ø×¯G‹øçÚ߈‘Æ«&¡Ơ«Ôø¾÷Ú»Ú¡Ô߈Ù½½‡Ăô¡È½³È›¾³¾™‰kß [ïS÷‡ßÄÙ÷Á™»•‹Hï‡ÑØÙ©ưÀ¹ÚßÚÍË)éÛ9¥߈ưÀñÖÔª»¹Ú¥ØÓÎÔ³‡×ßÖG½¹Í­H÷ÀÉ̉ù׫‡“Íj¤ˆ\0«‡“ÍjÎŨדÈĂÙ¡ÈÙ½ùײÓù×öÁ·ÅŒ₫ÙÚ«È…ÚưÀÙÚ“ÆͼÑ·ĂÙ›Û³· ß»û½¹Ơ¢ä߈iĂëö»nï»ÈÛǘ‰j̃ZîSYƯ”Èú߈щ‰±6™‰kß [ïS½ôăˆŸ;k߈›Ú€Ơ÷‡Ûº¹Ú߈›¾å×ù×Óºëö÷å5ÓÏÔÈÖưÀ¡Ü9¥‡ÏÄ·‡‘×8çù¼å̉ ăˆŸ;½çÚ߈ÏÔ£ä´Ă¶ ̣Ô/釺ØëöñÙ½Ú×ơê“ÛëöÛ«‚ ½9ơÔƒˆĐĂëÓ–ÛĂÈщY‹÷£äăˆŸ;«ÔÛ«‚ ½9Û×½ Á¡»ëö­}¹Ú§¹ç‚e¾₫®¶•.å¼ éÔ©ØÙ½߈ÍË)éÛ9¥©Ó߈ÏÅĐØ×ƠϹåĂ½•¹ÚăˆŸƠûØ«äÛ×°¿‰äÛºͺÇӡȃvË%¹•ƒvĂÙ½Á˜‰j̃ZîS´àßÖ­Öùׯ ù×ÑÓơÔ­îÑÓ«‡“Íj߈­¶•¾ÇÖ¥ÇăˆŸŸ}ƠĂÙœÁ›¾¹Úù×»ÅëöÁ¹½Ž¾ĂÈĂô³Ơá “Ơ¹Ú½Ϻé‡ĂÙ¯¾ö•Èû›±Å‘ăˆŸ˹±»‹ÓÏÄ•ú¦ô¡ÔÿÚß ‡Ọ́™‰kß [ïS›¾¿­Ï̉ơÅÓØ½€ƯÓ §Ô˜‰j̃ZîSÁ¡ƠÏĦÔÏÄÛ«‚ ½9›Ơ½€ù×Ơ߈§Ó˜‰ j ̃    Z îS ÿ¶©‡¥2ßëM‹Ÿ£Øƒ×ĂÙ™‰kß [ïS«‡“ÍjÀĂƠ¸ÚăàëöÇÖĂÙçwù×ö±ëØ߈Ž‡Û«‡“ÍjÚÇ˾Áñ»•Èû›¡"«‡“Íj‚˹ơºÙ½ơ»Û«‚ ½9÷Ô¤º‡º߈°»ÏÔ™ơ™ÁÅØ½€Ù½Çö±”ăº‰èÏÅψ¹Ú÷ˆÉPç$ÑÓ8¤‡×ÑÓ„ñ±»ÏÅơèÅå¼ Ï%ÏÔơÔËÉ9‹ÛÙ½—»߈ÏÔ›¾ŸÅÁĂß»ûĐÅËÛ«‚ ½9±½ĂÙ™‡…Ơ§‘°»÷‡ưÀ›¾é‰ñ5ñ·ØŒê*ªÙ™ëéåϺƠÑÅñíÈêö߈ù×Ûׂ¾ÑÓñÓ†×ß»û«‡“ÍjăˆŸ±»¯‰¯0¸à©ºÁĂ÷Áǽơê¾ÓÆ¥ˆ]1¼·ÜÅÓ‘Û…Ö«ÑÛÄÓÑÓ«»Ù½™Á¸Ú—»«Ó±»ăˆŸ­ÔÏÄƠÙ½÷ˆéêïÔ¶ù×™‡ăˆŸ;ï½Û«‚ ½9›¾Ù½½€ºÁÛ«‚ ½9ùסÔËǹÚ߈‹Ç«̃²ØĂƠ›¾ư“ëö‡9”Ö ™‡¡Ûå¼ù¾Ù½ù×ĂµØ½Ô“Ơ¥ˆ]1¹Ú‚vÿ¯¶Û×½É߈÷Á߈¹ÚÙŒë*«ăˆŸ;Ơơ»ÓÅæ‰™‰kß [ïSÛ׃ṿÄ·ô߈ëö¹ÚÊLJǗ¾ÅÓÁĂÅö’Üéꪶ2tT¹ÚëÔ©ÓăˆŸ;ưÀ¸ÚŸ}—ˆơĂÇĂĐÄêù×µØÆÖ°¿«‡“Íj™Ó½ôơŹƠ¡Ç˜Á«‡“ÍjÅÔåĂñÖ9¥‡×û¼éÓÛ«‚ ½9ăˆŸ;ơêÍÄĂôív™‰kß [ïSß„Û˜Ô +ÙÚÿÚƒˆëöÙ×·Å©‡¥2ßëM¯çôø×ƒv¥ơ¡È½Ô«‡“Íj«‡“Íj…Ú™‰kß [ïS¡hăÇíËÖÅÓáêá¬Ó̉öÁ³½ù׫́™‰kß [ïSÛ«‚ ½9ÅÛÄÓÛ«‚ ½9ßÄÙ«‡“ÍjĂÓ¼ñ ¦ôƠ–ˆù×½àéºÙ½ó½ÔÁ‡é/×:­€·“öG½¹ ÊûǺëö™‡߈×Óå̉ Ñ÷™‰kß [ïSÑÓµ†¾¹xÙܱ¿›¹ÁƯß»û&ù×ăˆŸù×߈Á«Ô¼ôÿ×Å™‡ï»ăˆŸ;·ÔçôÆÖ±»ơèÅ¡ÈÑÅù뻃văˆŸÑÓ‡̀ÓκÅÛºù×ÙÅëÙ½«‡“Íj°» ưÀ˜‰j̃ZîSöơßÄÙ™‰kß [ïS±»ÏÔÁ¹±»Êlj¼¸£ ßÁ8¤‡ËÖÛ«‚ ½9 Û±»¿́ƒv­Ä£ä«»ăˆŸ;çƠ½ø×ﻇǽスĐÄê°»“È«‡“Íj‹ÈưÀ߈êÔƒaµØßÚƠXÑÓ›¾éêÁƯùêÿÛíÆºéÆăˆŸÛ«‚ ½9ëÓ™‡ù×½€±»°¾™‰kß [ïS˜‰j̃ZîSëöàĂĽ߈¥‰ÍL…™‰kß [ïS²t߈Ö¾8Á¾­½¼ñ×ÅÉߙ‰kß [ïSéӫ♉kß [ïSΈÑÄëù×ÿ÷‡£ä›½ù×£ØÏÅù¾ˆç̉·ÜĂÙÏÔ˜‰j̃ZîSø×˹Û‡ăˆŸ;ÁƯù××¾ר”…ø² ÿÚ×Ù̉ɇÇh™ơư܇x×Y›¾ÑÓ÷ơĐøÙ½ÿ¯¶éÚ·‡‘×8çăˆŸ;ßÄ١ۥƗ߈ ËûÑÄëÙÚßÁ±»åĂăˆŸ;߈‡Úƒ½Î̉™‰kß [ïSñÔߌÛ,áƠÑ­¾ÅÓ°»¢ÈWÑÓÓÁăˆŸ;ÿ¯¶ï‰¹Úù×ÑÓíÆÓ.›³Âï½9¥‡·‡‘×8çƒĂ‘È·‡‘×8çÅÔÛÄÓÔ±»¹Ú8¤‡½¡º×Ú¼‚ÔÏÔ÷êÅØù×ĂƠÛ«‚ ½9÷ÙÏÔ¸Ú ¡ÛƒÖî»ÛׇÚÑĂôêù×ÛüÓÿÇçïä³à…öG½¹öÇǶ‰±»™‡Ơëö˜êèä¯Û«ÔûƠ›¾¹Úÿ¯¶ĂȾô»Ư͆ڧôƯÓ —ÖÏŽØưÀï½ívƒ¾‘Û«‚ ½9ÏÔ³»Ǽ¡Ô¢»ÏÅ9¥‡‰9¥‡éºĂÙÇÖøê߈‡›¶éƒçÚÙÚĂÙG½¹ÓؽÑóéꩺĂÙׯ˜ +ê +è +ä +˜ôº·ÔÄôÿÚÑÓ›¾…Ø™‰kß [ïS†“ ߈‹Ü¹ăàÏĉ¿I£ä°»‹ÓûÀ§¹ù×—¶½Ơ¼€ƒv߈«‡“Íj¬Ö±»¥ ËƠá¬ÇÖÛ×Ü߈ỞáƠ©ØßÖ¾ÿ§Ç̉ÿÔÊÖ¡Èù×ù×ÛºáÓñŒët¼ăˆŸ;±½Óé«Ô—¶ùêÛ«‚ ½9‡Çùơ³z©‡¥2ßëM·Ô«‡“ÍjÁƯ«÷Ú×Á̉Ǽí—GÛ«‚ ½9Ç»Ưù×Ü›¾µØú̉9Ô±»˜ơ߈À‡€è/Ö:³Ü“ÑÄëñÓ·ô߈Óà±»íñƠ½Ûº¹¼¤½ çô™¾ˆ¼ë–Ó ™‰kß [ïS°»ÎÁƯăˆŸ©È«ÈñÓëöÏ̉Û«‚ ½9³Ù̉…Øù¿™‰kß [ïSÏÔ߈Û«‚ ½9ăˆŸ;Ă­Ä·ÔëăµØëöäÏÔ™‰kß [ïSÛÀ9¥‡Û«‚ ½9™Ûó×/¥ˆ]1ù×Ù½ơÔ߈ÍÄ)Û«‚ ½9ø¿åg•Èû›ăˆŸ;Úª‚ +¼9ÛƠ“Ơ€Ùí—GƠXÅÄăà™‰kß [ïS…Ơ›¾ívÿÂÁƯ´aƒ×êöĂÈå̉ ñÁÑĂ匿N„nåĂʹœĂ½‡º¡ÁóÂƠX9¥‡×Än߈º™‰kß [ïS¤Æ“Ơ’º©‡¥2ßëM£ñÓ«‡“Íjëö¡ÁµØĂ¼™‡µ†Ëǵaù×Û«‚ ½9ÁƯ•Œ™‰kß [ïS›¾¥àĂÙ߈́–G‹°̀Ó‰Û«‡“Íj‹ÜåĂăˆŸ;k·ÔơêÆôרŸĂăơëöY߈—ßÅ«‡“ÍjÙÚ‚víÖơÔ­Ä̀¼›Ẵˆª»ƠÙ½ơêÜÑ¢Xïi˜‰j̃ZîSщ«‡“Íj߈«‡“ÍjăˆŸ;ù×ï²2ív±́×¼¿‰¡È™‰kß [ïS™ëéåÓ¼¹ÚÂÙ™‰kß [ïS¯È™‰kß [ïS¾ơêƒvÖÚ¾ƒvóÇ·ÔÅÓêöëö«‡“ÍjŒaăˆŸ;kƒˆơêơèÅ¿ÅÙ½±»áÓÏÏ€ë…e«‡“Íj©&çµߌÛ,ÓØơÄ™‡˜‰j̃ZîS±»çÚëÚÿÚëÓÑÄë§Ô߈ÀƯ߈œ‡¹Ú“ǽÔコ½°½©Óù×ĂÙ¿Ú•{ß»û¡ÁơèŧȯØÿ¯¶‹ÇŻ۫‚ ½9Ïàáæ¿‰ªĐ—ï‡ÚÛÀ«ÚµØ±»ÿ&Û«‚ ½9÷Á¯ÈÙ½ù×ù×ÙÚơêăˆŸ;‚vÛ«‚ ½9·Ú‡µØ¹Ú±»óÇÇÓ ƒÖ‘ÆÀ˪‡’̀jï¹ÚëÚô¯¼¿àô¡ÔăˆŸ;k•×ßÚ¹”¡ÔưÀä̉›Ûư%ÛÀ̃„9¥‡ëö¶ôßöơÔÍƠµa߈é‰ñ5ñ·щ¦Ơ“½€Ÿ}÷‘ƒvÏÔ™×¥ÄÇ%á꫇“ÍjÛ×é‡ëöü‡°ø1µØ₫ơÔëöåÁÏÔ«Ôá©Ó©‡¥2ßëMÏÔĂ΃vô±»Ü—ëö½Û×ưÀùÚÙ½ÿ¯¶¨ºׯ̉Ù áêÛ«‚ ½9ç®›¹ëö9¥‡ÙÚí—G£Ư°»×¹÷‡8S¤‡SÖF‹Ç9¥‡ÿÚÁ™‰kß [ïSĂ\ưˆ©‡¥2ßëMÑÅÓăˆŸ;µØ±»ÁŸ@Ơ¾G£»å̉ ƒv¾Å™‡ÓÅ™‰kß [ïS߄ڪ‚ +¼9»Á߈‡×Å»ĂÈ›ƠÁüÁÑĂ“È‰¿I½ñÓñÓù×±»ûØŸÈóÇÏÔÜÜ‹ÇñÓ«»èơ¿àûÓ—¶ù¿ù×ơê»…Ú½€©Ø™ëéå±»¶è·Ô±»‹ÇĂÙăˆŸ;ûØÅăˆŸ;ù×ù×YăˆŸ“Èÿ¯¶ÍÓáêûÛºíÜÏÄ·Ó ¥0ÏÔó#öÁߌÛ,ĂƠ½·‡‘×8çÅß»û±»¾ϹßÄÙ»߈ù׃ֱ»Å–₫®¶Ù½ëö Áôôê +§ÔÙ½©ÜŒƠÓºßÄÙù×߈™‰kß [ïS™‰kß [ïSåÁĂÙÇÖùêÁ½½÷Á™½§ôùƒvƒvÑĂ߈çmùêщºÓ¾Ù×ù×óÂùס۫dĂƠϺ½Û«‚ ½9ƒv˜‰j̃ZîSÅÔ›vÛ«‚ ½9¬Ö»½ưÀµ!Ơ²Æ±»ׯ“½™‰kß [ïSº™‰kß [ïSÅÓÿÚ÷ÁÑ·±»ưÀÇ"§ÓÈÖ¿ÅăĂÈ—»ƒvùêÚª‚ +¼9̀Ó +êÿ¯¶Ï̉ÿ'ÿ¯¶ß»û»¨Û«‚ ½9ÙîŰ¹¼ö™‰kß [ïSÙYú¶±¿¶÷Áµëăà™ÓƠµØͼ¾Ç™‰kß [ïS¹ØÎº©ÜơĂ½±»áĂÙ¿¡Û±»ívăˆŸ;ôédËÉ9³êÚ³ÈăˆŸ;Ơ‰Ư9¥‡–Ó‘%Á̉¿‰ßÄÙ«‡“ÍjœÜÅưƯ÷ÁĂ߈½ÔÙÓ±¯ëö©‡¥2ßëM‡¿ßăơôêÛÀƒvëöÙÚäơÿ¯¶¶Åµ†¼đßÖí#ÇÅưÀ›¾‡Ú·Ó ¥0ßÖ°»ăˆŸ;¶¼̀7¡›¾ÏÄÔ½Ÿ}‡›±¿Æ¹Ú³¾µØùו%éJé‰Ó5“gesÁÅßÚñÚµØÅà—Ö³ÂƠ‘Ƽ˜‰j̃ZîS•Û«‚ ½9Á¼èêç®ÁƯÏ–‹Èù×ÔËÇ½Ă›¶éÛºăˆŸá$ø×߈ö«‡“Íj̃ÄØ÷ÁÙ½»¦«d߈¡ÁçÚÁĂçơèÅëö߈™‡…ô·ÔÏųÈׯéê§ÓơêĂÙ›¾¹ö¹ÚŽÙ׿‰“½ñÖö½ẳửÏÅèÓÛ«‚ ½9ăˆŸ̀ÓùׯÈÛס»¥‰ÍL…ù×—Œ™ëéåĂºÅÀïtª‡’̀jÓ +8 +¤‡ +ÖăˆŸ;k°»¼ÿú¥É‹ÜÜ“Ơ­ÈüÆÏÔ×̉óªÚçÚ÷̉ƠăˆŸ§Ơ‹ÇÇÅ÷ÚÀ¹‰ÓÛÄÓ¡Áë¼ö߈«Ô½‹Ù»Û̃´È«‡“ÍjĂ Û«‚ ½9˹ơêù×…n½ơꥈ]1ÏÔ9¥‡ăˆŸ;kÛ«‚ ½9¶Ü·ÔÛ«‚ ½9‘Ö¦Ó³ ¡ÔçÚëËß层Á§ÔÀ¹½€̀ÇÛ«‚ ½9‚½ƒˆœàÍÓÏÅ¬Ö +߈‚Ăù×ÙÚª»÷Á™ëéåù‰8 +¤‡ +Ö¬Ö‡áêÛ×Ù½¼ô¹Úœ·̉ ¤0ƒÖØ'ăˆŸ;›¾™‰kß [ïS߈ăˆŸ;˜‡ĂÖŸƠ‹ÇöÁ߈’€ÁĂëö¹Úî»è﵆ǽ—˜ăˆŸ;óÔí÷Ùׇº¢X½×¿8ÿ§߈“Èä̉½€Ë¿¡Ư™‰kß [ïS—¶ÿÓö‹Ç»‹ùêÙÚ½™‰kß [ïS‘Û¸ÚƒƯƒ×ơĂ¹àö¶Û«‚ ½9—ÓÁÓ°»µØ«»ËÉ9½€±óÛ«‚ ½9Û߄ӨñÚø×¿Åù×Ï̉߈Ù̉áùôÔơ±¿³¹Ơkß [ïSâˆ;¼ÀĂÿÚ9¥‡ÏÔÁ½±»߈…ÖÛ«‚ ½9¡ÁÏÅß½Ơ²ÂỞ£äÑÓÏÔơÔ÷ÚÙÚ¢äÄÀƒvăˆŸ;±»ëöăˆŸ™‡«ÔÛ«‚ ½9÷‡ăÁ¥‰ÍL…‰ÔƠµăˆŸ;ÓܽẸ́̉–÷ÚïÚưÀÁƯÏÔÏ̉ÍË)éÛ9¥Ï̉Ÿèרç½ëö¥Ó·Ô¯à‡çڋǹÚŵ•Èû›½߈ûÙăˆŸ¢äÑÄ뫇“Íj³”ưÀ«‡“ÍjϹ÷ˆù×”Ö °¿«Úƒ×÷ÁË̉™‰kß [ïSƒ½—ăÚª‚ +¼9á꫇“ÍjơÔ¥ÛÿÚÙ×ÚÀÎÅ»Ø©ĐØ +©ÓÛ«‚ ½9çÚ™‡ÇÅ9¥‡§·ƒv›¾Á½9¥‡›¾Ơ‡Çç$™‰kß [ïS™‰kß [ïSƒØéꙉkß [ïSùôƒ×™‰kß [ïSëÓưÀÚö8 ¤‡ óÄÓº©‡¥2ßëM³Ç½€Ùª‡’̀j…9¥‡­¾ñÚ¯Ûù׽œƠ åñ»‹Ü™‰kß [ïS›Úùꙉkß [ïSö«·3uU½€™‰kß [ïS±»ăˆŸ°»±́«‡“Íj·‡‘×8ç­Ä‡9ÿÛăˆŸËÓµ†߈ù×¹ÚYëö™‰kß [ïSƒˆÏÅÀĂŸÆØÅêç̉ƒvÍÄóÏÔåºç¨½¡9¥‡Ï̉‡º±»Û«‚ ½9ÁƯơïÛ«‚ ½9›¶é¡ÈáÀơêĂÙ¬Öù×ù×™‰kß [ïS¥ˆ]1ù×Ăº™‡³·Å°»Û¿‰›Ó¡Á¹ÚĂºÛ«‚ ½9ù×µĐ¹½ͽ«Ô½ô™‰kß [ïSÉÖ ÁÍÄăˆŸ;ù×刽ô¯Û×Ï̉¹Ú‡ä½€Ľ©Ø­Ö¥ƯĂƠù×½§ÔÛ«‚ ½9Ă¼û(퇩¼µØí»ÏÔŸ}ëöÛ«‚ ½9“¹ƯNûÓÓÆ©‡¥2ßëM«Ô­RÁĂ·Ô߈½ÅÓÑÓÏĽ€ù×Á¥ÓÜ̉ùä̉©Èß»û߈í½±»Å±¿áÛÀ½µØ½Ă—Ù‹v—»÷¨Ç·ÅµaăˆŸÛ«‚ ½9ƠÅÓá©ÓÙÅÓÛ«‚ ½9‰Á£ÓöÁ߈™‰kß [ïSû(ËÇ߈‹«-‘ŸÅƠw™‰kß [ïSư%÷ˆ”ÈúƒÑū⃈±lơêĂƠ“¹ƯNå¦Ë÷ĂÙ«‡“ÍjÜáƠÛ«‚ ½9߈ÑÓơ»–¶÷ÙÇ´ÓͼÓÓºÙگ׹óÿ§ƒvÅØơê˜êèä—¶Û«‚ ½9߈¦Æ˜‰j̃ZîSó¯¿]¾›½߈ÿÂÇÖÏÅÿ¯¶ăˆŸ;k¹Ú—¾ù×§Ô†“‘ß÷ÙÏ̉­¾ƒÖù¿¸Ú ©¼ÏÅרăˆŸ;Û×ÙÚ«‡“ÍjÙRôí‡ÁĂ›¶éß%Ù½ÿÚ«‡“Íj́ơÑĂß»ûÏű»ñÓÇÖĂ ¹Ú÷ÁÛ«‚ ½9Ï퓽ÏÔѶ麃v¡ÈÏÔăàÏ̉—¶Û«‚ ½9±»­Ø£Ư͹ÚơÔ߈ÿ§ƒ½§ÔÍÄÙ½ÑÓׯ¹¨›¹•¶±»½ÍÓĂ¼êö›¾§ôÏÄóô«»Û«‚ ½9£ä·ÔÏÅÏÔÿ¯¶ÿÚăˆŸăˆŸ;ù×±½±»Û½ƯÓ óÂß»û°»ƒà¡Á»Øơê·‡‘×8竇“Íjøê²Ø÷ˆ³àÙÅëÏÄʳÓăˆŸ;ÿº™‰kß [ïS—»ÉíƠX¿àùê8¤‡×±»¡ÔÙÚËÉ9“ȱ¿ƒvăˆŸ;kÖÆÇÖơÔÙ½ûÙƠċۿ́ù׉ÛÛ«‚ ½9ÓØ´Ü›Ú™Á›¾“ƠëöơèÅÅÏơÔ§Ô±»«‡“ÍjÓ‡ƒ¾‘†ñ¨­ÄÿÚûƠ‹Ó·Ô¡›Ú‰»·ØÁƯ÷߈±»ÿÚÏÔ©‡¥2ßëMß»ûăˆŸ;×¾ÿ$÷ÚëöÏÅ©­Ö­ÔÛ«‚ ½9ÇÖëö™‡‹ÓÁÖ™Ó½±»ï½ưgµaù׎—»ŸÅ÷Á¨ÓÏÅ…ơêù¿½©‡¥2ßëMÛ«‚ ½9ƒv–¶éêËØÏÔÙÚ™Á™‰kß [ïSĂÙ½€ÍË)éÛ9¥v«‡“Íjˆ½ăơĐÄêéÔ™ơ߈ù×…Û髇“ÍjăˆŸ;ÍËNjǯ¾©‡¥2ßëM»߈½Û«‚ ½9å̉ ù×û8¤‡×÷ 9¥‡›Úëü‡°ø1¤ˆ\0¾¨ÈỞ™Ô÷Á½“™‰kß [ïSí—GÊÓ«ÔÙ̉Ởùꥈ]1»×¿ß弓Ơ‡äáêÅÓ“÷º¥ÇÚÆăˆŸ¡ƯƠXßÄÙăơ·ï¼­ôăàÚª‚ +¼9¼öƒÚù×¾ßÍË)éÛ9¥¿‰̀ƒv½ĂÙ«‡“ÍjÊƠíÆÂƠׯƯ ËÓ«‡“Íjß»ûÏ̉¥ÛƒvÅÔ¹Ú«‡“ÍjÁËÛ«‚ ½9ÏÔ×Ă¹ƠÛ×ƠÍƠ˜ ê è ä ÏÔÅÔăˆŸöÏœȫ‡“ÍjçÊ߈éê¶χâˆ:ÁƯöÑÓ‡Í纺™‰kß [ïSÙÚ¿ô߈«·3uU«‡“Íjù×Úºù׃v´Ÿ}½€´ÅÛ«‚ ½9Û«‚ ½9혉j̃ZîSÿÂÛä±»µØÇÖÏÔÿ¼ŸÅ½·ÅưÀŸÈéꙉkß [ïS½ÛÄÓÁƯƒvçÚ©Ó±»ĂÙ±»½ Á‡¦§Ô߈«‡“Íj™‰kß [ïS³ ­ơưÀ¯ô­€éºăˆŸÎ̉½çÚôêEÓØ…¾ƒĂщív£‡¹ÚơÏʼn;ÅÇ%›“½ÙÚ­•·›¦ÉÖÍÄëỤ́ǹÚÛÄÓăˆŸ;kÛº¡Ô¯È½ç°‡eÅÆßÁ‡ÇÙ×ùוŒâḈ…̃ƒˆ«dơĂ¡ÁŸ}₫ívôÏű»߈9¥‡×ƒÖ›Ăù×ơêרÑÄ뛾߈¢ƠƯÓ ï¬¬Øù×Ó̉«‡“Íj«‡“Íj½ï‡­ÛÑĂ¼ĂăˆŸ;–Ó ˆơÿÚßÄÙ»ôñÚåĂưåÏÅ­Ö₫«‡“ÍjăàÀ½ÿØƠ¹Ú±»ÏÅÙÚ—¶ÇÖר™£‚vù×­ÛщƒÖơÔÁ½½€ơ…ô™‰kß [ïS‡Œéº½€Å–ëö½Ù½…»™ÁÏÔö‡ºăˆŸåôỞß„¡öß½Ôơơ›Û¿ôíÚëöëö™‡ÑÓÛ«‚ ½9áꇌƠ¿ºéÓÅÓ¶eøæçÚƒvù×ÿÚ¡Ô°Ü¡ÁÀ̉¡ÁĂÙù×Xù×™‰kß [ïSÇ÷™‰kß [ïSÓÏų¾̉àăˆŸµØơê·‡‘×8çÿ¯¶óDZØÉ̉ỞöÁÏÔôơêŸÖæô¡ÁơêÜÍěڦ¹±»áêÁÓ÷$¨º—¾¶¸«Ú…Ïԣ؃vó¶ÑÄë½Ù½¯à§ØÅ¿‰‹v±»ăˆŸÀÙ·ô8s¤‡sÖå̉ ăˆŸ;¡ÔơÔñÓ߈ơêïÅ«·3uU²ÆÑ·›¹¹Ú›¡¡Èù×߈߈ÍË)éÛ9¥߈¡ƯŒÛç̉™‰kß [ïSÛ«‚ ½9ƒv±½µ‰½ÏÔ˜‡߈å»ơÔ«‡“ÍjôĂ³¹g¡ÛÏÄíÆî»‡9¥‡ß%Û«‚ ½9ß»û“Æù×ϵÚù×ù×âˆ;…Û̃Áÿ ÙÚÙױؙ‚߈ÛºÙ×ÄÔ±é•Èû›ĂÙ߈¹Úăà‹Ç‡“™‰kß [ïS§‡ƒÖºơêù×ÍB¬Ö1ÔX¹àƒ±»Ë̉ñÚơꙉkß [ïS߈óºëöÙ½ƒˆ̉ÓÁ Æ̀ÍÛº̃Ú‹ÓƯº½´%́ƒ¾‘Ç֧ƪÔÛ«‚ ½9Ư‰©Û«‚ ½9µØ‘ÆñÖ«»˾ß¹ÚơÔ›¾ù×ĂôöÁù×½éÚ™‰kß [ïSº±ÔÙÚ±½™Øï½±»™ƒÖ¡Û߈¡Èù¿™ÔƯÓ ĂĂ ›­±àéM«dø×±»ĂÙ±»£Ó‰üÁ¹ëöívÂĂƒÖµØÏ̉ø¼ÿ¯¶­vĂٽ߻ûÿ¿»ĐØ߈…ÚƠÇÖÛºщ¶Å¡Û±»Û×߈­ÖÏÔóÇ¡ƠÏÔ¾âˆ;¯¾¸ÚÏÅ₫Ú™‡Û×»ØÅÔ…ÔƒvÚª‚ +¼9¾‡Ç¯¾½ï½ÑÓ³±»‹Ç¿çÙ½ăˆŸ;ÑÓĂÈ—Œơê½€½߈ÓÆùô«‡“Íj·Ôù×½Ϻ·¼Í7ǽï³2ö³ÙY’ƠÛ«‚ ½9Û«‚ ½9ÙÚÁ¹¯G‹øÛ«‚ ½9“¹ƯN™‰kß [ïS•Œ—ØÇ»ÿ×ÏÄëö¤ˆ\0ÔX‡Ç¿½µØ¤ÓͺÜÍÓ«ÔÂÈçÚ±»9¥‡±đù×ưv›¾߈å̉ ƒ›¾ź®¼ºöñÁ±»™‰kß [ïS„Ñù×ư‡±ù1«dùê×ëöµ†÷Ú—HưÀâÁÅƠXÏÅÁÚ¡ÛăƠᬃ½Ù×ÏÔ±»ơĂ·‡‘×8稼ÑÓªÔÍÓẨîÅ“€9¥‡ß»û±”Ñ߈ª»‚Ôؽëö߈ăˆŸ¡%ăơÙÓ±»“Ơ½ÓÙ󫇓Íj½ôóÔÍẠ̈ÇÙ̃ÿ¯¶Ë%™‡Ü§ÔÇÖÙ½…Ơ×ܻȘ‰j̃ZîS¼—¾ÏŻ؟ØĂĂªÚшÙÓÀÓÆ_óÉøæ +ëÓä̉Ưܵصȭ•·™‰kß [ïSƠ¸ÚƯ÷Áù¿ÂÙ“È–¶Óºå̉ ɇÅÔ«‡“ÍjơÔ¾ °»­ßÓ߈߈ăˆŸ̀Ó߈ÍË)éÛ9¥ϼƠ߈Û«‚ ½9‡xÿÛ«‚ ½9³¾‹ÜÇ™ç½ÔƯĂÈ߈ÙƠù×߈ôăˆŸœLƯÓ §ÔăˆŸ;«»˜‰j̃ZîS«‡“ÍjË4öÛÄÓ“Ơ›Ú½«‡“ÍjçÚ́Á±Àù×ăˆŸÛ×·ÔÛ×ßÿçÚùëˆyù×ÏÅ™Ááöùꀺ۫‚ ½9Û«‚ ½9©ù×™Ó”‹åô‡ŒÖÔ†6¦jĂÅÓ™‡«öù×ÍË)éÛ9¥‚vä̉»†×›¾¿ôưÀ·¼Í7íÖñÚ¯¾ÙÚ‚×ưÀå̉ ½÷ˆ¶«‡“Íj—¶³߈9¥‡ÑÓ®¼ù×ÅÓÏÔƒÖÏÔ‹æ·‡‘×8çỞñÆ™‰kß [ïSç1ÿ¼Ïʉj̃ZîS›¾¤ă÷ÁÚÆ½ù×ÿ¯¶›Û‹Ü±£ÇÅôù꫇“ÍjăˆŸ™ôÛ«‚ ½9ĂÙÚÖ̉ù×ÿ¯¶ëöÍåíÆ§ÔñåĂĂô§‡jưÀƒØÛ«‚ ½9‡ºëöŸÈ˜‰ j ̃    Z îS ÏÔù×ÑØººÛáÿÚµØ߈ÏÔù×§¹³ÈÂĂÙ̉÷ÁµÚ±»ÏԂ֣ث»½€ªÔ›¶é©ÓäÁ‡Œ±»ûØÛÄÓ¥Ó³zª»ùץؙÓÅÄơŇÚù×ĂσvÏÅÓµĂÙôƒˆív§Ô÷Á½óDZ»߈ƒvµØ’Ç÷Á̉Øß»û9¥‡ëö÷Áù×±»áŒĂĂơĂÛ«‚ ½9£ÇưÀ¯¼ăˆŸ;9¥‡…Ô½«‡“Íj³ ‚vŸÖ¥́™‰kß [ïS«‡“Íj½Û«‚ ½9ăÔÍÓ­“éºăơ¹Úơԣ䙉kß [ïS“Æù×¾” ±½ÑÄë÷å5Ó½ÖĂ +ëööÁ@Û«‚ ½9µØ¾‡½ÇØÅíÖñÖ¿‰½»ÁÛºÛ׿ƒŒ«‡“Íjá=‡Œ•Èû›Ë̉™‰kß [ïS±¿ßÖ™à“ȱ†ÇÖưÀ¡È½½ßÖù׺ơĂÿÚ§ôùơóÏÅơêù׉¿IµØÛ×éÓ¯¾ÊÓá½‹ë®Æ ¿Å—»‚vÏÔƒ¾‘Y9¥‡Û«‚ ½99¥‡¿ %߈‘0ơ¿º¼ßqƒÚ·º™ÔíJ¾ºׯỞÆ̉±¿‹ÇÍÄï³2™‰kß [ïS±»±»Û«‚ ½9ívÁ‡é/×:ÿÚ“ƠÍË)éÛ9¥‡Úơê¼ÿÚÆĂ¹ÚëöË¿ÁËÁ̉±»ψÛ«‚ ½9ߌÛ,ÓÅÙ½¶¸§ÅÄ›¾È£‹Ü¯é™ÁÙÚ‰»£ỒÓ¿Àª‡’̀j‹Ü™Đ›Û¾«»ß»û«¾߈ÙßơÔÑ·ëöå̉ ÄÓ™Óë™HöĂù×°”«‡“Íjáê‡ÚÛÇÏ̉£Ừº#¾§ÔÆÖ™×ÉÖ‡Ư×¾Û«‚ ½9ưÀ™‰kß [ïS¹Ú÷‡ơĂƒvù×ù××™؛¾±Áͼ³(™Ó•½ÍƠƠ¾G¾éÓ÷Ù₫µÇưÀ½Ø¯G‹øÙڣǑ%“đ…ñÓßÚéê€Ù߈ø×ăˆŸ;¨¼±Ôá ߈ÏÔưÀÿ¯¶ù×Ơø¬ÄÓ™‡9¥‡×û̉™‰kß [ïS©Ơκ­Ö¹̃ø×«‡“ÍjƠÏÔµØóĂÁƯבù×¼£XăˆŸ;k߈µØóÄĂÈÂÙÑÓö8¤‡×ùêëö̃ˆÙŒë*«ơÔ‹Óˆ»Ø‹Ç8¤‡Ö½Ï̉¿Å¢ ·‡‘×8竇“Íj¡Ô¾ëö“ƠẸ̈×ƠÿÚ¿‰ Û¿ôÏÔƠµ†±»™‰kß [ïSÁ·ºĂÈƠóÇåĂ«ÑÛ«‚ ½9ùäщ¥ˆ]1§ÓĂô­¿ôêÓ·ÔºÏÅăˆŸ;k‡º©‡¥2ßëMÏÄ‹ÇÙ½…»ÅÔơº›¾·Ô±»½|•ŒßÄÙƒ½µØ°¿ÛÚ9¥‡½§ô­Ä½€µØ™‰kß [ïSƒˆù¿ïiĂÙÙŒë*«¿ô™×Ÿö™‰kß [ïS­ÄÑÄëÙÅëơꇺ™‰kß [ïSñ̉ç$Û«‚ ½9©ÓÖ ;¡È¿‰Û«‚ ½9»ˆâơ›¾å̉ Û«‚ ½9Æ«‡“Íj¶¼ïÚÇÖ­Øÿ¯¶ÛºÙ½ËÉ9ëöÍË)éÛ9¥º–»·‡‘×8ç®Gøù×ÀĂß»ûÏÔ³Á‡é/×:ăˆŸ;k‡Œ¡È߈«»߈ƒá µa߈ÏÔÏÅëï©À¾ß¡ÆÖ™‰kß [ïSƠÅn»íƒ¾‘¨¼ÙÅëÇĂỤ̀¹ ÛÀ½™‰kß [ïS«Ô…ÄñÚĂÙù×ÿÚëö™Á̃ˆÔǺÛ«‚ ½9°½ÏỖæǼÏÔóÇñÁÛ«‚ ½9¹Ú™‰kß [ïS±»›œơêëö¡Û±Ô˜êè䛾ø×ߌÛ,±¿éê£ »Øå̉ ‹ÈÛ«‚ ½9¶ÎÅϺëöë ‡º«‡“ÍjÓØ·‡‘×8çÙ½¹Ú¯¾£çø×Äӵر»ÀĂĂÈưÀ“¹ƯN×̉ÿ±Qư£¡ÁóÂÁƯ™‰kß [ïS«‡“Íj³ºóÛßÅëöµ!«Ô߈„öº·ØăˆŸÁ½߈¡ù×°»ÁÜÙŒë*«ö9¥‡×½ăàщÛ«‚ ½9«‡“ÍjàêÏô“µëöË̉›¾›¶é溃vø×íê¯G‹ø߈Û«‚ ½9—¶Ù× q߈É̉ù×§Ô½¹Úêö«‡“Íj½ÿÚàê +ù꛾ñÔ«&߈‡º‘›®½ÏÅÙÚ†½ù×í¶ƒˆ߈°»„¸È…Ø¥‹ψ½™‰kß [ïS™Ô÷å5Ó¡ÁơĂ÷ÁëđăˆŸ;…Ơ…Ô±»Éí±…ñƙӑڋÇư“ËæßÄÙăÁ‘ÈăˆŸ³È‡Ư·‡‘×8ççÚÁƯ÷‡©‚çƯÚƒÖ¹ ±đ³ÄÔ«Û±»ăˆŸÁ̉™‡ÏÔôÛ«‚ ½9—¶ÏÔ߈ăơ™ơǼ«‡“ÍjÛ«‚ ½9½Û«‚ ½9™‰kß [ïSÍB“ÆĂƒvơê¦Ô·‡‘×8ç½ÔÛ×ơꙉkß [ïSĂȽŒƒvµØ“íJÛ×°êØ߈ù×ăˆŸ;k¹ÚÚáêƯ”­ÖµØ±ÛñÛé‰ñ5ñ·™‰kß [ïS›¹•¾ơÔéJé‰Ó5“gesÁÅ·Ô¿üïÇáá ¯È¡»ÍÓ‰ÔỔ™‰kß [ïSºÏÅëÚÙŒë*«ăˆŸ;ßæ¿́ÁÛ«Úƒˆˆ—Œ™ÓY¹ÚƒÚ•%¹Úù×·#•ס٧ַ¯ÏÔ«ÔưÀËÉ9ïÚÏćŒ«‡“ÍjÀÁÁÙç̉ÏÅù×è‡Û«‚ ½9±»ÁƯáÛëöƯï‡ÁĂù×ÖÔ†6¦jµêẅ»—¶½ö£ä«»ăÇí¥‰ÍL…çô›‰á=ù×ù×…ï½€—¶±»߈߈µØÛÇ“ăˆŸ¹ÚăˆŸ;ïÚ±ëØ±»›¾·‡‘×8çш¼ ߈¡Û߈¥º±»ÏÅ÷ÁơÔÉ̉ºâơĂăˆŸ;ٽ雷‡‘×8çÛº†Ç½€Û±»±»¿́¾¶è‡ñ5ƒvÛÄÓÛº÷À‡·‹²”¡»±ăÓÑÓù×å̉ ù×±»™‰kß [ïSù×¥ ¹ÚăˆŸ«‡“ÍjÏÄߌóÂñÓ™‰kß [ïSÓØÍË)éÛ9¥ĂYÓØ“¹Ú‡xÜ«‡“Íj8¤‡¶ăˆŸ;·‡‘×8çûùê¹}Ơñù×ÇÖ±¿̃ÄØóÓỞ‡x˜‡ù×·#„ØơơĂÄn½Ô»Ăù×™‰kß [ïSÙ̉Åô¾ßŽëƠUÙƠ¡Ûí—GÛוŒ¥ÈµÁ«‡“Íj9¥‡€ëÔ«·3uU“Ʒܣǵؽ…טêèäëöö«‡“ÍjçÚÛ«‚ ½9óÂÏÔù׳£ÙÓ"«ÔÏÅ–¹ÚăÁ·¼Í7›¾Ü «‡“Íj½ÿÚÔXƠܽôï½ÏÅÅn¡Á÷‡éÚöơ꫇“Íj…»ï‰®Ơă»ß´‚½ÇÖÙ½ù×ăơ÷»ÏÔƒÖù×›¾½½ô›Ú¡ÔñÆÏÅôë‡ùê½ơ…‰íăˆŸÙ½ÏÔ‡ºưÀĂÙ™‰kß [ïS¨Œù×Á×’«·3uUùשӧÓßÖ•ÓÆĂ±ëØ©ÓÁ½œ‰¾I¶ºμ›Ô÷ÁĂ™ÓÿÂéJé‰Ó5“gesÁÅ™Óù×ëö½º±»©ˆ›¾¿½¼âˆ   :åĂ¥Û߈ÙŒë*«ÿÚÙ«‡“ÍjÙ½ÜƠX¾‰¨Ü9¥‡×ßÚ‘ơ©¼±»ÁƯ±»¬Åøê9¥‡«Ô†Úơé÷ˆñÁ¥º½ă‘·ÖØ0µØºØ¡Û«Ô£äÁ¼üÀ³ ˜‰ j ̃    Z îS ™×ÛÚ«Úå̉ áê±ÈÙŒë*«¥ÂÜÏÔ•Œ³z›¹ưÀ±ëØù¿¹•½¬ÄÓ.‹ÇYÛºƒv›¾ïßëÔÍË)éÛ9¥…Ơ›¾¡Á½ôùêñÖ₫®¶¡ÁÅØ¡ÛɹµØï½߈ÅôóÇïƠ™Ô÷Ú%¯Ơ¬¿·‡‘×8ç8¤‡˜º›¶é×ƠµØ ƠtưÜŸßÚÀÙÚùơ–ºùר‡¤2€̃êL“ÆăˆŸÅÙ½¿ôáº̉Æ…ÛÉŒ›¾™‰kß [ïSºù×½€ƒv©‡¥2ßëM³ßăˆŸ;›¾¿‰ơĂ«‡“Íj«ÔƠXÑÓƒv́êù×߈™‰kß [ïSÍ•±½ù×áê¾ĂÙ—ØăˆŸ;kÛ«‚ ½9«‡“ÍjÅÔÙÚŽg9¥‡×ív‹Üå̉ ăˆŸ­Äëö±½9¥‡÷4ƒ£äÜÓ «ÔƯÚ­)½³(«‡“Íj›¾‰Ô9¥‡ƒvµa«ÏÅ·ÔëöƠ·ÔχÁ̉‹ÈñÚ߈¹ÚöÁƃˆû(­Ö‡Œ£Ç—¶˹Ôºláê‹ÇµØöÚª‚ +¼9™‰kß [ïSå̉ ûغéôÏÅÏÅÙ½ßÄÙ¹ÚÏÄăˆŸ;·‡‘×8ç«ÔÙÚ߈í—G̃ˆ™‹Öƽ¡È¿‰ó€º¡ÈỪÓ ‹ÈÛ«‚ ½9±»ñÆăơÓØñÚÏÅăˆŸ;£X½€ÁĂ½©Ûº±»רƒăˆŸÆØívÁ½âêâˆ:÷Á·Ô¾Åù×­¾à «ÓƒÖ…Ô¥‰ÍL…›¾ĂàÏԟȳ¼€åºô‰Æϼ߈×¾³ƒv±»ÏÔÛ«‚ ½9±»›Ú™ëéåëöù×±»ơê‡9Ñq߈›v÷Áá —¶ÔX±»…©Ü߈Ó̉ Û¯È÷ˆ™‰kß [ïSí—GíÖóÇ»»Ùڽ߷§D Û±»ƒˆ—¶‡ñ5ƒØ¯ÀíÆ†ä˹Á¼©ØĂ¼¶˜©ÜÿÚ±»÷ÚăˆŸ—¶̃»ú™Óá=±»Á‡é/×:á ½ƠX¹Ú߈øê¤ˆ\0“¹ƯNẳË̉ÁÓ¾Ϻ†“™ÁÛ«‚ ½9²ÈÏÅ«ÔçÚưÀ»ô¡ÇÛ«‚ ½9Ù0Ûº‘±ù×¥ÛưÀ½È±»ÏÅ¡¹àï½ÂÇĂ€ºçÚưÀÏÅÛ«‚ ½9¹»ѶƒÚÛ×·Ô—»ƒˆ¼ÎåĂ‹Üö¹Ú“½ĂÙ˜‰j̃ZîS¼ñÓĂÙùëÓØ½ÏÔÅØ‘ÓŸ}ÏÅ×Ú剹½©‡¥2ßëM³ÑدÏÑÓ¡Ô¥ÈƠÂÔÚ½€ƒÔÏÅÛ«‚ ½9¦æ»ØÛÄÓù×¼ĂöÇ̉§Ô߈ÅÔÍË)éÛ9¥ƒ×ôċٓ¹ƯNËƠƠ¾G«‡“ÍjSǼóÓ̀½ï¯Èß—ˆ™ÓơÔ“-™Óơêëö«‡“Íjƒ½ÿÛÇÖÖơêºĂçÚ—ŒŒ½Üá ăˆŸ;ÏÄëöˆ¡ÁÙÚ»Ù½ù×߈“ÈĂÙÑæÅ"´ÈщăˆŸ;±¿ëöÙŒë*«ä̉ªÚ™ÁĂº‡Œê֓ȧô¦ôÏÄ¡Ơ¥ÇĂù×™µØĂÙÿ¯¶óÓ¾ö÷ˆ”ù×£Ù½¡ÅÓ¹ÚÛ«‚ ½9ùׇŒ›Û߈—¶ƒv—߈‰Ûè‰đ5đ¶›¾³ÂÿÂÎ̉‡øßÄÙж߈ĂÙÏÅÍÓøêû(Ơ±»±”ëÖ™‰kß [ïS9¥‡ưÀ÷ÚƒÖ¹Úíê¸ÚöÁ›¶ééêÇĂưصØÅÀ߈‹±»ÙƠËÅ¿‰¡ÔÛ«‚ ½9ăˆŸ‘Ú±»œ¿Ç"ÏÅÏÔÙÅëóẬ ÛÚÆÏĽ÷Á™ô߈ä̉©%Ù½¹½́™•Üùê²%ª» «‡“Íj±¿×ܶžÙÚÖÆ‡Çǽù×ÙÚ߄۫‚ ½9„bù×øê¯¾Ÿ\Í#Û«‚ ½9íê¯á=™Áͼ±»‚½¹Ú‹ÇÿÚ³¹¤ˆ\0¡ÈÏÔ™Ó׉ÛăàµØÀ‡€è/Ö:âˆ:kÓ¼ôĂ·̣ÑÄë߈¯¾áöÛ«‚ ½9‰Ô¹ÚĂºÚÇ߈¼ø×ÔXå̉ ³Ç¿‰‹ÛÛ«‚ ½9龜\0¡ÔĐÓưÀù×ÓØ™‡ºÁëÓ—¶Ö¼ÁܹÚå̉ ₫Ú9¥‡°»˜êèäƒvÅÓéêÙÚËØƒ×µØ߈à׳¹ơê÷$çÚ„ĂóÓ ’¯¾ƒ½Ç¿óÇçÚ¡È·̣ëö™‰kß [ïS¿ØÁ|±»µØ½«‡“Íj±»×Ơ°ĂƒÖ—»9¥‡̃ˆë8%¤‡%Ö Ăô©Ó±»™‰kß [ïS½ûØ™‰kß [ïSöçÚỡñÙ½Ô—ÓăˆŸ;k‹Ü•Œ‡ºÏÔëöé‰ñ5ñ·™ëéåç½Ü¸Ó*ÛÄÓ÷ÁáéÏű»éJé‰Ó5“gesÁÅ÷Ô˜‰j̃ZîS°»ßÄÙÍÓíö£Øăà™‰kß [ïSÁ×ÅØĂĂ ›­±àéM臛ÚËÓ¿Åô´†ÏÔ½€½»ØÀĂÙ½ÏÄÏÔô¡»́Úó‡Úß»ûóÇ‹…™‰kß [ïS™‰kß [ïS¼€§Ươê·¾ׯù‡ơỘÔÙŒë*«™ÓáêÛ‡áƠ•ŒÓرéƒƯå̉ ²¾Ù×ĂÖ½ăˆŸ;kóÇÏÔêöÇÖßÚÏÅ“Èؽ±»÷ÚºöÛÄÓ߈™‡»Ø¹Ú£»ñÓÙ½±»á=Û«‚ ½9ơêË̉½ĂÙôúS£Ơ«·3uU© ™‡¡ÛÜå̉ ›¡¾ưÀÛÄÓ¿‰ƒ×ÛºÍË)éÛ9¥›¾å»߈å×­¶Ó̉©ÓÓØÛ«‚ ½9ÑӋܘ‡½€Ù€Ù½«l™‰kß [ïS½Âȯ¾‰¿I«‡“Íj߈đÁ9¥‡‡Œù×±‡ùׂvø$ưÀ¢ƠÍË)éÛ9¥î«Ơ°Á¯È™ó匿NÑ·½Ô¿‰÷Á“º¯ÈÈĂ£»±¿ÏÔÅØ…Öëö߈ưÀåĂ½ï³2ÅØ«‡“Íjê§Û«‚ ½9—¶£ØơØù×€¾•%™‰kß [ïS™Ô·ÔÛºˆ; Ǽóǘ‰j̃ZîSåG™‰kß [ïSçÚëö½Ôöß„¿göÁóÔçÚÛ«‚ ½9¶§ÔÓÙµaÏÅϱ€ëôéù×½߈»Å½€Ơº¨Ç½‡ù×ÑÓ9¥‡×ó²ĂÙͼ߈ÙÚÖƠ߈Á‡é/×:ƒÓ‚vĂÈưÀĂƠùדȡhËÓ¯ƒßͯ¥'=U#QK¯ÂÙ½óØ³¥̃ƠÛºƒvÏÅÛ«‚ ½9™Áå̉ Áă[¾é꽡Á¹ÚÛ«‚ ½9°»ÏÅưÚ߈ͽ€·‡‘×8çÛ«‚ ½9Û«‚ ½9ÙÁăˆŸ©ØçñÚÿÂÙ½đÁ‹ëơêăˆŸ;ëö½́̃ˆơÔùêÏÅ÷ÚëÚËÓ­Ö½ô™Ó‹Èñ½ÙŒë*«ËÓï»ñÓù×຿‰Ư‰¡ÁÍË)éÛ9¥çÚÏÅóÇܵ±»ш§Ó̃|ưÀ÷‡Á ™ëéåß„ñÓÛ«‚ ½9µØÛ«‚ ½9߈ărÑÓ߈«‡“Íj“Ơ‚vï»óÇ×¾߈½©ÓơԳط‡‘×8çÏÔÍBÓØùסÜÛ׮Ӡǡۃֹڗ¶ËÇù×±»ăàñÙ™ÓåƠ©&₫ƒàù¿Ç»±ÔßړƱ»óƒà‰¿I§µôëöăˆŸ;»ÁƯÇ̉ó×…ƠùºÙ½ÏÔÛºÏÅÓØÛ«‚ ½9ƒv›×›æï³2ƒ½ë)²Ú÷å5ÓÏÔÅÔ×ÓăˆŸÎ̉§Ó½ñÓÑÓđÖù×¥ ·Å½€¥ØâơŸÄÙ½Úª‚ +¼9ÍåăˆŸößÚĂºËlÉSửưÀÙ½‹v«‡“Íj›¶é™‰kß [ïSÏÔÿ¯¶¿‰ÑÓÏžôư“ăàÁƯÏÅÁçĂÙÉ+·Ơå̉ ±»¥‰ÍL…ÜéÓ°»éêÿÛé‡Ưº¹½ÏÔíÚ·¼Í7Ù‡Ï9…«‡“ÍjóÇƯÓ ×¾Éq˜ơ ½̣§Ô»ØÓơӃv̀å£Çå̉ «ÑÏԋDZ»çÚùêÏÅ8¤‡áºæ*ßÁ¹Úó‡Ụ̂ăˆŸ;™‹ñÆù×›ÚưÀÂ#è‰đ5𶩇¥2ßëMăˆŸ;k«‡“Íj™‰kß [ïSÏÔ½ăˆŸ;ÏÔóÔ»¼‘«Ô¿»½È¯ÜóÇơêµÜƯ×ßÚÁåûÓ”Œ +—»ơèÅăÇíù×ëöăˆŸÙŒë*«×Ơ°¿ ÏÅĂÙéÓ«‡“Íj›¾ăˆŸ;°»ăˆŸ;½€¿ÙÑÄẹ̈ÄÑÄë߈ïÚ™ëé哹ƯN«‡“Íjƒv£»·Ô™ô«Ô«‡“Íj󷇑×8ç߈̃»ú…ÛËDZ»Ă…̃Û«‚ ½9«»«Ô“ÆăˆŸ;áê¹Ú’¹ÜNƠî­Ø÷ÁÏÔ¹ÚY›¾«‡“ÍjùêÑö“Æ×¿8Û«‚ ½9û(ù×G½¹™‰kß [ïSçړȽçÚÛ«‚ ½9÷‡×àŸ}瓾́†×ψ£»ÓÙ½«‡“ÍjëóÇË̉ÏÔăˆŸ;ÿÚß»ûù×·Å߈›™µØ߈‡xµØ‹°ñÓĂÙ²º̣›¾ưÁ±»Ѷ÷Ú±¿—ÓÛ̃½Ñ¿è™‰kß [ïSăˆŸ;ÑÓåĂ«‡“Íj›¾Û«‚ ½9‡ŒçÚ«»§ú½€Ï̉Î̉׿8ÑÄë—¶ÿ¯¶¡ƠÑÓ‚Ôôëö¡Óù꛾©¼ÏÄ›¾Ô›¾±»Ù½µØăơÁĂŸ}ơĂ™ÁÑĂáÅÙÅë£Xôp§Ô™‰kß [ïSëöéÓçØ™‡Û«‚ ½9“ØơêǺơĂá ÇăàöùêÛ«‚ ½9™»·ÔăˆŸ;ăˆŸçÀ·‡‘×8çẲÿ¯¶­ÄÂÙưˆG½¹Úª‚ +¼9½ÛºƯ‰™Óµ‰܈ñÆïÁ…Ô߈ÑÓ†º÷ˆ߈éÚơÛôêÙ½߈½ô߈ï»Á̉̀¬HÀĂÿ\Û«‚ ½9ăˆŸ;kƯº±ƯÍĂ×Ă™ØƠÍË)éÛ9¥º•ܩӽĂÙסÁ¹ÚëöÿÂơêªĐñÓ¹Ú™‰kß [ïSÛ«‚ ½98¤‡Ûº·ÔÇЉÛƠ¼ÅÔĂÖñÆ߈¿‰߈ív›»˜ơŸ\ÿ¯¶—»Û«‚ ½9Üù×±»™Ôë «‡“ÍjĂ—¾íÂÛ×…ÖÍÄÏỔÆóÇ‚½×̉ÏŽ±¿̉ÁñÓÏ̉ß»û…Än…ÖÿÚÏÄÏÔϺ× Ôơ­Äñ~¨‡¤2€̃êLù¿Û«‚ ½9ĂÙÛ±»·Ô³Æ˜Ô½ô½€çô™‰kß [ïS¨‡¤2€̃êLÎÓ…̃ĂÙÍË)éÛ9¥©Ơ«Ô«‡“ÍjñÚ9¥‡‘ѽ™‰kß [ïSăà„Í÷áƠ‰¿I’¹ÜNë™HÑÁ߈ử Ơ·¼Í7«‡“ÍjñÖ‚•Çëöù׽ű»‘ÜÎÅå‰ơêƯڙԫ⇌™‰kß [ïS«‡“ÍjÿÚù×ƠŸĂƒˆƒ’¹ÜN½ÔƠ心×9¥‡×ÍË)éÛ9¥å̉ ‹ÇÇ»߈ËÉ9Í|æÚù׫‡“ÍjÙ̀ÏÔ«Ô‹Üå»âơăˆŸóơê•ÜÍNjܧô ¬°àèM9¥‡9¥‡‡Œ›¶é»Ø¡ƯºëÖÑĂá×ø×ù‡Ÿß›¾ªĐ©‡¥2ßëM9¥‡§ÔÏÔ©Ơ»Øù×ÏÔăˆŸ;ï»±»£Øº߈ƒ×ǼưÀ¹à–¶߈•Èû›™‰kß [ïS‹Çív±ëØͼÛ«‚ ½9Û«‚ ½9ÙŒë*«¥Ûù×·Ô₫®¶ùש‡¥2ßëM™‰kß [ïSëö©¼Û«‚ ½9©Óƒv¹ÚñÓÛ«‚ ½9á܄ֹڙ‰kß [ïS—ÓÍÓ±»ÏĉÔăˆŸ;‹Ç¼Á‡Ûù×±»‡·̣ù×ơԧ♉kß [ïS“Ơù¿öÑÄë½åÁơóö—¶ª‡’̀jíÖÛ«‚ ½9źÅ»¡%÷ÁÉù¿ơê“Ơù×÷å5Ó—Ø£Ç߈—ˆ¢ «‡“ÍjơèÅ«‡“Íj Á³ •ÿơ곑 ߈Û×ơÛ·Å¡Áßô³ŸÛ«‚ ½9߈—̉ëöÓÔÀ‡€è/Ö:Üëö­ÔƠ8¤‡ùê³ẦÓ ·ÅÑĂ«Ô߈¥–‚…óÍË)éÛ9¥ Ëû¼ô߈ׯ™‰kß [ïS¡ÔÛçÚ¶èç®ù׃v™‰kß [ïSÑӆNjÇöÛ×¹ÚÓŪƠ ‡ºµëƒß÷×ÜÖÆÛ«‚ ½9ăÁ›Ú߈®G ø ÷ÁŽ9¥‡›¾‹´éºÿ¾Å߈ù×ñÆóÇ›¶éåÏ»Ǻvö›vÁĂ×ƠÏÔơệ…DZ*«‡“Íj€Ơ ÇñÚ±»åĐ߈߈½£Ç½¾‡Ûºêơ +ÁĂÏÔײÏ ·Ô×Ó9¥‡íÆÂÈ‹ÇÍË)éÛ9¥™‰kß [ïS—»½¯ÈÿǃàßÄÙ߈ºÔµØ¾¹x×¼ỞÏÅü‡°ø1¶«‡“ÍjáÛÿ¯¶º©"ÑÅ«‡“ÍjÁƯ¿º§s›¾ëö›¼ù×߈§Ôñ—ͼÛ×›¾ËÉ9†ÇµØÙÚÅØ·ÜËÉ9åÖơÔ˜‰j̃ZîSǼâ·§Ơÿ§±Ö·‡‘×8çß›¾ƒÔ›¾ëöÊ% ‡¾¡»Ù±»‚vÔŋǵØÀËù׉ÛÚ¹ơê™Á¹Úÿûù×˹¨¼ÓØ×¾ăÇíÏÄ™‰kß [ïS±»ÑÓ­Ö× ăˆŸ;ÏÔ±»Úª‚ +¼9âêé¼߈«‡“ÍjÄô ½°»ß»û·Å­€Í¯Û©¼ëÚ‹œÏŸÚúÙÅô©¼ÛÅ»·Ô±»ɇ˜‰j̃ZîSÔÔ¥Û›¾­Ø©Ü·Üëö·Ôëö߈ưÀáçăˆŸ;Ï̉ºµØĂÙăˆŸ;kµØăêÙܽöªÔ½ù×ñÚÍÄíº/©‡¥2ßëMÅ›¾¥ˆ]1•ǹ»‹ëö¿‰̣Ç £Ø߈À¹±»ív…ƠºØµØÛ«‚ ½9ß‚v©Ø«Ô¿ƯÆÙે“ÍjµÜ«‡“Íj™ÁñÚƒvÏÔ°»¹Ú߈—¶ơÔơêŽçÚ߈±»§ÔŽË̉“ƠçÚ³×â»ƠÅ÷‡¹ÚÏı½ívÛ«‚ ½9ùê£Ø±»½Ô8¤‡ÉÖµaÅÓ«‡“ÍjöÁÛºÿ.ÏÔ«)±»ëö™ëéå³zÏÄăîƒÀ¹ÔXÑÓÑØƠăˆŸ½ưÀ™ô߈½ÅØ»çÓß9¥‡߈»ˆ³ºó™‰kß [ïS™ëéåÑê—¶ä̉́vÛ«‚ ½9ÙÚÏÔ…Ô»¼‘¥ˆ]1å̉ ¡ƠơÄ²Æ ‹Ü™‰kß [ïS›¡ÿ‡¹ÁÛâíº¶·‡‘×8çåƠ9¥‡½ß»û¹Áùë‹°ËÇËÉ9ÍË)éÛ9¥ăà“ÆÅÓ߈廽ÑÓ±»ï»·ØăˆŸ;kÎÔͽĂÙ™Œ™‡«»ĐÄê¿Æ¯̉ơêơĂ™ÙƠËÇƠ›¾߈߈›¾µØÉĂ›‡Ù½«ÛÂĂÿ&—ˆù櫺ëöëöù×ÍŒ‡Ú«‡“Íj‡ơê™Áơê¸ +GÏÔﻣØưÀï»±»å̉ °½Çè¹ÚÅÓÛº¢‹½ÅÓ߈ăˆŸŽƠÆăˆŸ;ÍÓ“Ơơê¢0ơèÅ›¾½™‰kß [ïS‹Ç¹Ú×ƠåÁëöÅÓÛ«‚ ½9©‡¥2ßëM߈›¾ͽ•ŒñÚăˆŸ˜‡¿»ºï½º³½¾ƒv…ÖßÄÙ©ÜñÖĂ٫䤽ÚËÓ¹ÚƠ‘8 ¤‡ ×ăˆŸÛº¶Ôµ‰߈‘±ÏÔƒ×庱½߈‰¿IçôƯÓ ÏÅѰ»º¡Á‹Ç߈¿‰·ׯ›¶é‹ÇÛ«‚ ½9«‡“Íjéº߈·ÔºÁăˆŸ;ó½›¶éù×ÏÔï»ÏžàƠ•Ó÷Úëö¬¾¯È«‡“Íj߈·‡‘×8çѦÙ׿÷íÖĂȃ³ºóÚÀÅÏ…ôçô›¾ÏÔưÀ§ÔµØ¹Úùê‚váƯßÁ›¾ùæéêíÜuáö‘ư»§Ô¿à˜‰j̃ZîS›Ư¥Ç—¶¿‰‡Çƒv­È¿(ÛËÇËÇǼ­ÔÅô‡ÂëöƒvªÚâÁ™‹µÜùׇۅۇ“û²“½¶€Ơ‹ôƠÓµÅÓÙ½Ǻ¯×ר“Ƚó#Ù׃ˆù×·‹¡Ó±ÁßÅ—»Üív̀½ï½ÜÏÄç̉ƒˆÛ‚v±»«‡“Íj«Ôưˆ9¥‡»ÿÙ½ɶ™‰kß [ïSŒ¾ăơưÀăˆŸ;Ă¹½íễˆÛ«‚ ½9›¾ƯÙÜùש‡¥2ßëM­½¼¾Û«‚ ½9®¾˹ß»û¾÷$̣ÄÂهǛ¶éÖØ¹ÚưÀƠX‘Æù×£Ơ¡ͺÿÚĂ¡ÁăˆŸỞ±»ÏÔô߈å‡éÓëö₫¼#Ôơ ÅÓ¿ÙÅăÇí™ơÙ½Ở“ÆéêëößÁăˆŸ¹Úͺ½ôÏŵ+ÑƠßÏëöÛ×ù×ÛÇơÚ«‡“Íj•Èû›öùׄÇơĂË¿¯G‹øơếƯ¯×¼€™‰kß [ïS¿»ĐÓĂÙµØö±»ôÊqĺŸóóÓéꥈ]1—¶¡ÁĂÈßÁÏÔÿÂơê°»½¾‡«»™‰kß [ïS•ŒăˆŸÛ×ÔXø Ù½«‡“ÍjÏÔ³ùׯÓï²2߈Û«‚ ½9ÙÚÖÆ-ÎÅ麅Ÿ”»ëö£Ë÷Á¡Ûù×ù×9¥‡×±»¥ÆƒÎÅ…ÚÙŒë*«·Ô£ä½߈ÚÆ™ƒvÙ½Û™ÓưÀ߈Û«‚ ½9°»÷Á†“¯¼ÏÔ‡ÍË)éÛ9¥ƒvÖ¼›¶ééÂívñÓ²”¿́đË̉߄۫‚ ½9ù×ÍÓ½€©ØÍË)éÛ9¥ù×ôƒv߈¡Èƒ¾‘Ù½èºè‡ÓÅ£ä“ƠËƠϼ†Ú±)£Ç– ·Ô¯È›¾™‰kß [ïSº½ƒvù¿ă»­Ä’Ç‹Ùăà˜‡±»½ÍÓùëÛ«‚ ½9ơÔ߈±»•ăˆŸ;‡Úñ‡Û«‚ ½9øê«‡“Íj™‰kß [ïS߈¾ßܰ¿¥‹ăˆŸ;ëöË¿ÙS¼ĂËǽ€ÏÅ₫‹Çù×9¥‡×©¼Ó¼€ÍÓ©ÚÛ«‚ ½9±»ëö߈çÇÑÓ¡ÈÙ¹ÚµÛçÚщëØ•%÷Áï½×Ơ9¥‡ŽåĂÙÚƠÙÓ«Ô¥âÙ½å̉ úĂưÀù×ÙÚ¡ÔÏű»•ơÑÄëÙÚ‹Çâˆ;ëöñÚÙ½ơê‹ÜñÓÎÅ ›¾¾ÅƯïŸÄÁƯÛ×Àð»çÚ©ØÖ¾8ÍÓ±¿ƒv±»ăˆŸ;÷ÁÁ‡é/×:é‰ñ5ñ·Ưºƒvëö·§D ›¾å̉ ˆ·Ó ¥0©Ç«‡“Íj·‡‘×8çóÂƠ¾G©À™»­Äº¿‰ÍÄßÏ·ÔëöÿÚ™ÁÙÓ·¼Í7ÁÛÅƠXƒˆºÍÓ™Ô߈…¾÷‡‰ÂƯơơêưÁÁ¼¾μ³Ơ÷Á«â§Û“½›¾ưÀ³(€ „íî˜êèä«»Û«‚ ½9¡Ô©Ó¥º½µa½ÍƠ™‡±¿±½רù‡ơêÊ‹̣×¹ØÛ«‚ ½9ñÚ½Ă›¾ÎÔưÀ°»‰¿IÙÚ¶ôù×ñÙÜ£ô³ôéơ·‡‘×8çÛºó¶ÿ¯¶›¶éº«‡“ÍjçÚ›ÚÚª‚ +¼9ëö¹Á‡Ûྛ¶é©ƠÀÁĂsÈưÀç'µÈÛ«‚ ½9»Ø½ăˆŸ‡×±»8¤‡Ö…ÇÁƯƒvȇ©ÇƠףȱ»çÚ¥ˆ]1¾Åÿơ£ä±Á“ÈÑÄë̀DZ»ơêçïäÅÔ‡ŒÏ­)åĂÛ«‚ ½9߈߈›¾Ó̉·¸³ÇăˆŸ;·‡‘×8ç¿ëö›¾«‡“Íjª‡’̀j«‡“ÍjăˆŸÛ×ÙÚÁ̉Û«‚ ½9̣ÔÙ½½·ØăˆŸ;½đÙƠØƠXăÑÓÛ«‚ ½9ƒv»½¹̃9¥‡ׯù×óÂƯÓ ßÚƒˆă½åá÷ëö÷Áºy´êÙÚ±À½€ĂÙ«‡“Íj“Æ߈ÜƠ½‡™ëéåơê匿NăơÓ¿‰ưÀº̉ÖÆƯÚ£‡øê™‡¡Ô÷‡߈åĂ£»ơ§çÚß»û«ÔÛ«‚ ½9ù×ù×áƒëö‰đ·ÔÁßÖăˆŸ;ơÄÿ­ć۫»©‡¥2ßëMßÚơ»g‘Èö©Øºyø×߈ÏçßùשؠÁ +¾­ÖÁĂÊÙÚ̃ˆ¨ºÏÔɹÚƠ¾G›¾ăº©‡¥2ßëMÛ«‚ ½9Ă¼éÓ‡áÚª‚ +¼9€ö½¿Åƒˆÿ¯¶ëöƒˆÅØÖØ®ƯăˆŸ;kăˆŸ;¡%ơÔöÛÀñÚ™‰kß [ïS›¾·‡‘×8ç߈Û«‚ ½9ø×üêÿ¯¶†ŒÁ‡é/×:Á‡é/×:·Å»‹Ăٛۿ؛ۣä߈߈¡Ôàê߈¥ØÓ¾ͼ½“º‹Ü½Á«·3uUù×çÚôêÏÅ»Ă¼Ô߈öÀÀ̉ư‡±ù1çm—ÓëöÛº½üÇÛ™‰kß [ïSÙ×ÓØÏÅ«‡“Íjް» ÷Ááö‡ŒƠÙ-ÏÅ̀Ó˜‰j̃ZîS·̣½ëö°¿·§D Á‡é/×:“ƠÇ»ív™‰kß [ïSĂÈ¡ÛùڃظÚơêÇÖÇ"¿Ô™‡ơúưÀÏÅ€Ơ£ ™‰kß [ïS±»‡ÚÛ«‚ ½9ÏÔ¨¼ĂÙ¡»»ÅÓÔơÛ«‡“ÍjƥȸڭÉùềÓ¼ĂßÁ‡ÜÙ½÷ˆÅØ«»ƒv›¾ÏÄ£ä¯Óé‡âˆ‰ÆÁÇ«‡“ÍjÙÅ뇌Á˽€÷ÚÍË)éÛ9¥½£ÔÏß»û߈¿.ñÓçÚù×ĂăˆŸ;ù×½éºÏÔ”₫£ä±»Ù½èơ…ô¡ÁĂÙ™‰kß [ïSöÿ¯¶óÇÓ¾̣ÇƒÚø¿߈±½ÑÓùëÛáơ‰Û«‡“Íj‰¿IĂĂÅøç'Ǽß»û†ºÁ½­Ø‘®­ÅÏÛ½‡ŒǺóÇ߈ƠÍÈ̉…Ơ‚öưÀ©ÇôÅ»ƠÄ«·3uUƒÖ«‡“Íjù׋كvɇ߈ƒà«âÏÔăîÏÔßÄÙÙ½߈ÏÔĂȱ́ÆØ«‡“Íj–»ĂÙđ㻇xëö—¶߈°»‡º«‡“ÍjưÀÙù×ÇÖÍË)éÛ9¥éº•¾Û×½€¾ơĂ¡Æ€°»‰Û߈ƒv¹̃‹Ç½ôûà›Û±»ĂÙ“Ơơ»¯ÈËÇơêÖ¾­ÄÁĂÂÙ™‰kß [ïSÁĂ¢äɇƒÖùê«Ú›¡©‡¥2ßëMÿÚÏÅăˆŸ¡¼¡Ç™‰kß [ïSª¶2tT•ןØÓØïÚ÷Ù‘gàÖÛÀù×êö¡Û±»÷‡ăˆŸ;“ÇăˆŸ;ưÀ«‡“Íjƒ†“ƒØơê¹Ø•{Ï¿µØÚÀÇÓ­¾ưÀ¦ÓĂÙ·Å«Úă«âă‘·8¤‡ĂĂ ›­±àéMޱ»̃ˆ¡È©ÇƯÓ ­ÚăêâḈ¿́öÑĂÛ«‚ ½9¿‰ÿ¯¶ăˆŸÙ½¼ùë±̉ÂÓơÔÑÓÍÓß»ûó³߈½×¾»²ù×Û«‚ ½9ăàù×±»ƒv½‡ºëö¹Ú±ÁºÁõa¹̃“Ⱦ©ÏÔ‡ºÁ̉×Ơºº«‡“Íj¯ƯÛ«‚ ½9ơúƒvÏŃˆǼ÷‡µØ³È‡¿ÇĂßÄÙ²ÙÚĂÙçôĂÙß„·Åµ́™ÔơÔ™‰kß [ïSß»ûĂôÛ¾ëöªÆÿÚ«ÔÇÖù×™‰kß [ïS…Ơ›»Â.ß»û߈‹ÇÈ̉™‡ëöÍË)éÛ9¥«‡“Íj¥‰ÍL…Ó¼Ú +°»ÅØ±ëØªÚKáÁ½ÑØăˆŸ—¶ÏÔ·Ôß»ûñÎç1ŸÖÏšԾ»ôñÖ‹Ù›¶éÛº³”™‰kß [ïS“ºơèÅÙ½›¶éơéÔX +Ôºlùë«»ôº߈óÔ™‰kß [ïS¹Á÷‡ù×ăơ«‡“ÍjñÙÅ–̀¢äù×ơ癉kß [ïSéê±»ĂÙœ‰¾IÅ»ăˆŸ;8¤‡ºÄôg~©‡¥2ßëM¡ÈÁ¹§ÍÇ…ÖÏÔÏԨٽώËÉ9›¡°»´aÀ ¯G‹øÓر‡ív˱§Ôϼƒ×éÚÇØƒv˜‹ĂÙÛ¹Ûºïiøơ…́óÇË̉›¡—ˆ†Œ±»Ñ·ÿ¯¶ÑØù×Û«‚ ½9£Ø±»ơỒ Ê) èÛ 8 ¤   ƒv8¤‡×¯¼ưÀË¿ö­€Ù•ÜÁ‡é/×:‡Ç‡Œ÷Á¹Úû¼½«Ô«Ô·ÅĂÙơĂƒơĂëöƠ°»ÿÚÀ¼­v¥º™ëéå ËûÓÔñßÄÙéÓ—ˆÏÄÎÅÛ«‚ ½9ưÀ¶ÜÛ«‚ ½9º™‰kß [ïS«»ñÖđÓ9¥‡ÏÔÁn¸£ÿÚ•Èû›£Ôר§Ø™ÓÙŒë*«‡Ç̃ŒÚ,“Èëö˜‰j̃ZîSÿÚËƠÏ̉ù×®ƠÏÔ%óĐÄê߈щ‹Ç«‡“ÍjÇÖÅÄḯ¶èÁ¹Ê È9 ߈Û«‚ ½9ÙÚ˜‰j̃ZîSƠÚ©‡¥2ßëMï½§Ô¿÷‡÷¶ù×Íʉj̃ZîS¿‰°»íơăˆŸÙÚƯ鮼“¹ƯNù×ưÀÏÅơÄÿÚĂñÚ̀ÓĐÄêÏÔưÀÏÅßÄÙ¹Úív±»¡Á¶8¤‡×•ŸËÓª‡’̀jºç–¶ÙŒë*«ͼĐæ±½€º¯¼÷ÁÏÔ±ôù×ßÄÙƒˆùê™à®¼ +…ᙉkß [ïSÛº¾ß +íÁ ÁÑĂăˆŸ˜‡¹Ú×Óψù×ĂÈơêÇÖƒvôØơêËÉ9ù×Á¹±»åô£©‚ö„Ø.·ÅÅ߈öÅ÷ÁăˆŸ±»¡ÁÇÓ§Ôå̉ ưÀëö½ƠºÚ ª ‚  + ¼9 Û«‚ ½9£Øª‡’̀jª‡’̀j¹Úé¾ÁÓ¼Ǽ‹ÇÎÔ +ÁÉăˆŸ;ÁÇÙ܃v¿ØÏsƯÓ ÅØơôăˆŸÙ½ÁƯăà—»«‰ÑÁôĂŸ‚ÉÏÙÜ‘ÆÙ̀™ëéå¹Ú©Ó“ÈöƯơù׃v·‡‘×8竺¹Úଳ·ơèÅĂÙ÷Á²ØÛÆĂÙ»Øá ¯ĂÅéÓù×™‰kß [ïSăÁñÓ‚v59¥‡±»ƒvå̉ Û«‚ ½9•Ô₫ÂÏÅ̀ĂźÿÚƒv±»ëöμ ±»™‰kß [ïSå̉ —ÓÏÅ«‡“Íj¯G‹øÏÄûØ‹ÇăˆŸÅ£½ÏÅÚª‚ +¼9·‡‘×8çơ$߈½ô•߈Ÿ¿ÓÁ½ÙÚá—ˆ߈ÏœȣÇưÁ½¿₫®¶¹Ú‰Ô˹“ÆăêĐÀëöÛƒ»yëö©‡¥2ßëM8 ¤‡ Ö +ŵØϼ±»«Ơ—Œ©‡¥2ßëMÁĂ¹Úå̉ ĂàµØÏÔ±»ºù×ổ&½ÍÏÔöăˆŸơê¸ÚñÓôÄơêăˆŸ;ư§‡°»¹àÛ×ơÛƠ×ÙÚó©üô·ÈóÂ¥ºëöù×ÇĂ©Ç߈ö¯ÈåÖÛÄÓ«‡“ÍjÓŇƒv‡x§ỗçéê³ÈÛÄÓ箃ˆù×µØÁƯ™‰kß [ïṢÂÚ× ±‡ùæ‹ÇçØ³ºóæØ™‰kß [ïS¹Úív«‡“Íjƒv™‰kß [ïSưÀ·‡‘×8癉kß [ïS·‡‘×8ç½9¥‡™‰kß [ïSó#ÏÅ“ÈÍĂ¹Ú¡ÓÁ«‡“Íjù×ăˆŸŸ\‹Ü÷ˆϺ̣ÂÔäô‘Ú×Ơ±»‘Ö™‡«‡“ÍjñÓ¡ÛµØÙ½½øêëö¼ô₫ÏÄëöÓ¿‰ÙÁ̉›¾ăˆŸ;µaÛ«‚ ½9Ơ¹]ßëöƒvÛÄÓ½ù×G½¹Ó½ù¿Û×±»§Ơ·¼Í7ÇÖ«‡“Íj‚vëöƯÙÚÍǽ€°¿Á½ĂͺÜ›¶éºǽ…ăºÅœ‡ÅØÏÅ­Ö́Æ«‡“ÍjïƠ˜ó¿×­ÄĂÖù¿ÑÓåÁÅ»ù×½Û«‚ ½9±»½«‡“Íj‚!ÁĂ÷ÙỊ̈Û«‚ ½9̣ƒÍÄÑĂ›¾ù××¾ÙƠơÔŽ¡È̃ˆçڥƱ»«‡“ÍjÏÔÛÄÓ½ËÓ¡ÛçÚ÷ÚƯºÏÄÙÚØ×Á̉Ăȇǘ‡߈°»Û«‚ ½9ßÄÙ¿¿ă»á ×¾¡h¾ÅÅ9¥‡™‰kß [ïS°»ívÄÅÓáêÙ×éºËƠŸæ·Ô÷ÚơêƠ¾Gƒ½ơÔÏÔö›Ơ¯Ô¥ÇöñÆưÀäÁ1›¾—¶äô£ ‡Œ¸Ú™‰kß [ïSưˆ™‡«‡“ÍjÍƠÏÅ«»ö£Ư¿»¶ÁÛ«‚ ½9ơêÍıÁϺ“Ơ“ÆûĂÙ½»ÅđÔ±»ûû™‰kß [ïSª¶2tT™‰kß [ïSÛ«‚ ½9‹ÜßÖå̉ ‰W߈ÙÚĂÙËӵϵؽÏÅơ»ŸÅ‰;ÁƯ‚×£ÇĂÙ÷ÁđÁÅ·™‰kß [ïS­ÄúÓöÀڹ߄½üÓ +ÇØ¹£¶ØĂ¼ĂÙ¡ÈÏ̉ñÚÜ¿¹ÏÔñÖ½§Ó±»“È›!ñÖÔXơĂó²Øâ·Å«‡“ÍjĂÙåĂ¡ÁăˆŸ—¶†ŒÁ¹‚×ƠÛ«‚ ½9ơÔéêǃvÍ¥ư“ÍÓ” ÏÔǾăˆŸÆØ×¯¾ÑÓƒ½˹ÙÅëÁËèỡˆ™ôÏÜăÁ«Ôù׫·3uUÏÔ‰Ô±»ưÀ߈ÑÓÿ­‡§ô¡™‰kß [ïS«‡“Íjùß°»¿ûƠ“ºưÀơ‡ƒÚ×Ü߈ưÀ›¶éÛº½߈¿ØµØ÷Á¡Ô׾諷3uUßÄÙôÙÜ×̉·Ó ¥0™‡›Æ±q‰í—¶Îċܤˆ\0µØ÷‡ÿÚ§Æ™‰kß [ïSĂ·‡‘×8竇“Íjɱ¾߈ơÔÜ̃ˆ ëö½€£ä—¶½ƒvg̣̣‹Ù¤Ó§Ó̃ˆÏÅźư§‡Ù½ơAŸ®Gø©‡¥2ßëMƯˆÙ½±»ëöëöÁĂá=ÏỒÓƒvíºưˆ¯G‹ø±»£ä…Ơ©‡¥2ßëMưÀç8¤‡ưÀ±»½½©ÓÔÛ«‚ ½9§ôº›¾¹—ăˆŸ;±»ƯóÇăàÑÓÁËĂÙ›Ú«»Ÿ}ÍÓ¼ă»ÓÅù¾•Ǧô đÓơêÙ½ÛÄÓÏ̉ÙÚ™ÔƒÖ›¾ºÓ¼ËÉ9Åć9µØÏÔ߈‰Û«‚ ½9¬¾ÑÓ¹»÷å5ÓăˆŸ;kưÀÿ¯¶½ñ«Ô“ÆñÚºâˆ:kç'‰yíƯÚéÓ•™‡¥ˆ]1¹Ú¥Ư¡È߈ơÄÍ”&èê£Ø È¿ôÍŶ Ư¹ÚƠ߈¯ÈĂÙÅØ÷QíÁÏÔÇÖ™‰kß [ïSßÁ©Óïô‡†ÚơêÏÄœ‰¾Iï½щ³¡ÈƒÖ«‡“Íj9¥‡Û«‚ ½9ɇ9¥‡ÇÖ“ÜÏÔơÄƯÓ ½“ºÏÔÏÔ‹ÜëöƠ₫›Ú‡9ĂºñÓù×¹Ú‡ñ5±»í¶‹Ç÷ˆ¼É̉ưŒ¿‰ƒ—¶§Ô߈¾Ù½óÄĂëÓëÚ·Ó ¥0µa±¿ˆºÑĂÑæ߈ƯÂéê₫$­¾›Ơáêơê‹ÛÓƒçÚ•Ó³Èëöª¶2tT›¾£Ø«ÔÑÓÏßëÔ߈ăˆŸ;Ñí8¤‡Ö §ô¦¹ơÔ«Ô‚»›·Ôóœ̣Ç߈ƒØ…˜‰j̃ZîSëö× 9¥‡™‰kß [ïSù×ÙÚù×üÀƠXæÇ´Û«‚ ½9™Ô«‡“Íjï‡ï»á ĐÄꩺ±»­ôÔ½ö¼ÿڃ֓Ưܮƒv±»Û«‚ ½9¢äÛ«‚ ½9ŸÈÓù×›¶é‘±™‰kß [ïS“ÆÛ«‚ ½9¹Úƒv³ØŽƒ¡Û‰¿IºÈ˜‰j̃ZîS§Ô…»½‘Ó«‡“ÍjøêÑĂ•ÇÙÚë¼…Ç«‡“ÍjơöóÓ±ëØ߈×Óơp‡ºÊËÉ9©ÓÏÄÏÔ÷ÁÛÂÙ™‡߈›Ú³ÈơÔÙ×øæ ûÓ¤‰̀L„ưÀ±»ßÄÙơÄçÚù×·ÅÓÆ©Ó¿ÅÑÅóÇçóƒvù×ÏÔĂÙüêăơ­ÄưÀáêù×­Ä߈́v›¾©¼Ơ™‰kß [ïSÛ«‚ ½9ưÀÛ×8¤‡×ÅÄ¡Ó½Ô¿àµØçÚ«‡“Íj¹Ú·̣«¼ƒÖ¾Ú³È°»߈ÍÄ߈¿Å̃Ưùá¿ÅơÔƒv½·ˆ‚vùơÛÀ½߈͇ ÓØ•%ƒvº½ÈóÇï̀Ă Û×ưÀÙ½‰ß™‰kß [ïSơê·‡‘×8ç‡ÇµØĂÙÏÅ™ô©Ç©,ƒˆ߈Ơ߈¡ÅØ£ØívÇ¿‰ưÀµØÔơBèêæÇÛ«‚ ½9³ÂÍÄÙÚ°¿Ï؉j̃ZîS™‰kß [ïS±»ï¾ß)Ù¹Á‹ß:‡º¾»›¶éÓ̉ÍË)éÛ9¥í–G߈‹Ù‡äÏÅư“ưÁÏÔĂÙ±»×Ăû(߈½£ÇĂÙ“Ơ£äÙÚŸÅ»ÅÇ̉ëöÆ÷Ú«‡“ÍjưÀ«‡“Íj¿ô¦Óƒvª¶2tTƒváê“Æ̉Å¡íÖëö™‰kß [ïSƒváƠ˜‰j̃ZîSÍË)éÛ9¥è×ÏÄ9¥‡ù×™ëéåÛº«»Å°ê؉¿I¡ÔÉ’·&ÅØ™‰kß [ïS߈ù×9¥‡Á½ùê9¥‡×ÍÁ™Ó™ºđÙ€¾ +ç̉—Ö¯Û­ÄÇ¿ÅÆÇ¸Ç«á¥ÛÂÙƒÖơ»¿»ØÓÈÙùן»ª»—¶Ô¾Fù×·Ó ¥0ß½ƯÓ Ù½ƒàăÇí“ÆăˆŸ;k·ÔÛ«‚ ½9«»ăˆŸăˆŸ;ơèÅ‹ÇÁƒ¾‘±¿åô­Ö߈́v½×Óº߈ăˆŸ;kù×ßÁׯ߈ÿÚÁƯ…ÖË%£ä—¶¼†º“È¡ÛơÔéºâÂÂÙơ»ƒváêë½Û«‚ ½9ëöß»ûơÔëöºơêăˆŸ;§ƠƒÛëöÿ¯¶ÿ¯¶ùºßÚ‹ÜåĂ߈Á‡é/×:³·ç«Ô‹Ó·‡‘×8çÛ«‚ ½9ăà‡xăˆŸµØÀ½éºÏÔăˆŸ;kÏÅÔ§Ô÷‡½ÿ¯¶ưÀ­vÍÍBÿÚ÷Áùåù×Ù½ÿÚ—»ơÔ½ƒv…Ô߈Á½ÓºăˆŸ;¥ØÅØ›¾߈ャփvăˆŸ;ĂÖĂÙûØơê«}¼ô ¶ÏÅ­Äá Ù½ÿ„ÑĂ…Úçؽ©‡¥2ßëM£ ±»ø×™‡ÏÔǺ¯¼³bæÚƠÏÅëÓăˆŸ«‡“Íjå̉ ưÀ¾ƠéêÁƯÏßÙÚŸ}—¾ÅÓ߈ưÎÔ£û(¡ÓÏ̉³ºó‹ÇÛ«‚ ½9Çơ×ĂÍË)éÛ9¥«·3uUÙ½‡ºÍË)éÛ9¥¶àö¾Û«‚ ½9“éÚÀ±»™‰kß [ïSæÚ«‡“ÍjÁ½ăˆŸ±»ÅĂºÍË)éÛ9¥Ù½%Ù׫‡“ÍjÙ½­ÄùêơÄÿ±Qư£«‡“ÍjÜÀ߈µ̃̃ˆơÄëöçô›¾Û«‚ ½9»ĂƒˆÀ‡ +€ +è/ +Ö: +ƠÚăê­Ô߈©º¾ÙÚÙ½©‡¥2ßëM•Èû›ỞÛ«‚ ½9£»±»ÇÖÏÔ߈ÔĂÙׯ½¾»½ùê¡ÁÛ½§ØÅ±»±»¡»8¤‡³º˜‰j̃ZîS±»¾ë¿‰çÚíÁßÁ„ϼíÅ£ÓÔơ·Ø«ÛóÇÚÛ«‚ ½9ÿÚƒˆÁ½ÂĂ¹Ú匿N¿\¯È߈âơ׺ûƠÙ½ßÄÙ©ƠÅØ«‡“Íj™‰kß [ïS—Ó߈ÿ×ß»û‚vÑÓ«Óψö—Œ±)ÁƒvÍÓϼ߈»ˆ¼ÙơÔ‰y»»Ù½ư‡±ù1™‰kß [ïS÷ÚÿÇ߈ù×ëöŽíêÆÖĂÈ«‡“Íj½Û«‚ ½9ÁƯĂđÁ›vŸ}ÓØëöº…Ú†Œ8_¤‡_Ö‡”%—Ó•»³¹éê‡xŸÅ°»ï½9¥‡—Ø©ù׫‡“ÍjôĂ—º%ª ¶ 2 t T µ‰ùêÿ¯¶ßÄÙ™ÁßÁÏÔ™‰kß [ïSĂÈÙ½÷ÁăˆŸ;ëöù×ÑÓÀĂ÷‡ï»™‰kß [ïSŸ…ï½·Û•óơê—˜ưÀëöƯƠ£ÍÑÓ9¥‡߈½Ïūԟ}ăàæÚ±»›¾ÖÏÅéÚƠ£ÔƒÖ­Ä³ÓÛ«‚ ½9Û«‚ ½9×ĂÛ«‚ ½9«‡“ÍjÙ½ߌÛ,øê¡È™‡Ù½·‡‘×8翉ơԽ˿¯¾ÅÙYùêÏÔ§ØÛ«‚ ½9™‰kß [ïSÇÖ½±»ưÀ°êØ—ˆµØù×ơĂÍ™‰kß [ïS™‰kß [ïSï½ù×ňº´aăˆŸ;é‡ßÖ»ÁÇÖ‘÷­!“ºÁƯºÄÓ¹Ú±»›¾ÓØ߈·¬©ØƒơÙ×ÿ×½¡Çëö¦È·‡‘×8çÅ«‡“Íj“ƠöÚª‚ +¼9÷Ôëöơê¹ÚưÀ»ÁƒvÏÔºƼ÷Áƒ½µØëöĂĐÓÙY«ÔºÅíÖçÚµÜÛºÜờ¼Ï̉ߌÛ,ăˆŸ¡Áƒváê·Âù×½ăï³2óî½€Ơ%±»ÿÁÙ׆ä÷ÙơÔ±»ÍË)éÛ9¥ÏÅå̉ ¾½ÙÚˆƠêö߈°»‡º©Ï̉ˆË̉ÏÔÏÔ。ԃ½ơèÅÅà£Ø«ÚÙÚ½€ƒvăˆŸÛ«‚ ½9«‡“Íj­ˆỂ·‡‘×8ç·Ôù×Á̉³È­ÈưÀ•Öâà +ÏÔ₫ ®¶ ơÔ‡Œ½Á¹ÏÔ›¾éÚ—ˆăˆŸ;Ï̉ÁƯµØù×Ú@½™Ó¼Û«‚ ½9à=źỞù×™¸߈¶ÏÔ‡¼ùׯȡÈÙŒë*««‡“ÍjëöÓº‡×¹®ï½ÁĂñÓɇߦĐÓ–»߈‰¿I߈åĂ¯È©¼ĐÓ +‡µØµaŰ£X¹ÚĂÙ“ß»ûÁ—»éºĂÙ¥ˆ]1ºÚ× ź­ÖÏÔÙåÇÙÅëÏÔÿ$˜‡—¶§Ơ»½½ÔñÚĽªÔÀĂ Ă¹ÅÓöêÛ«‚ ½9™‰kß [ïS½¨™‡«‡“Íj‡ÇéÓÿÛÏnª»½ÁÙÚ˜‰j̃ZîS…ÏÅßƯ‡¥2ßëM÷‡«‡“Íj§Æ¾ßÛ«‚ ½9ăà±»Í₫«Ôƒv½Y‡ñÖÍĵaöÁEñÓóÔø×·‡‘×8ç—¶™‰kß [ïSƒÚÏÔ»Ó«‡“ÍjƒvăˆŸ™Áµ†ùוÇöÎÅ™‰kß [ïS·‡‘×8ç¼Ă“ÈÛ«‚ ½9߈ƒˆÆ·‡‘×8çïƠÀ‡€è/Ö:Ù½ï½éºßÁ·Üœ‰¾I¡Û™‰kß [ïS·ÔơêË¿‹Ç¤Æ ƒÖ™Ÿ÷Ú‡±¿ù×™‰kß [ïSƒv«‡“Íj¶‡Ö8æÚ½«‡“Íjơê£XßÖ‰;ôĽô«‡“Íj«‡“Íjëö±»áêÚÚ±»±»ÿ¯¶ϼù×ËÓÛºÏÔ½³ÁÙ¯¼¡Ô9¥‡ơÔºĂÙ›¾íÖ‡Û½߈›¾ÚǡԡÁÏñÓø×₫ÍË)éÛ9¥ͽ“Ç¡ÛóÂăˆŸ;·Ôó,£Ø†Ú­Äïđ߈ñӃת»ŸÅÏÄÁƯÛԇǽóÄ×™ÔÏÔĂÈă½™‰kß [ïS¿í»ĂºϺ½߈̣Ä÷Á™›³z鈾ëöñÓ¬¾‡É̀Ơ™‰kß [ïSÛ«‚ ½9ÅÓ¹‡Û«‚ ½9ÏÔỞö™ÁÍǼĂÛ±»ñƱ»¹¾µa—¶ÿ¯¶÷¼»£¡ÇóƯŸÖÓØG½¹ÓºÙ½ÏŵءۛÚëö߈9¥‡ÓÅ÷Á±»Á‡é/×:“Ơ‡ÇÇçÖÆŸ}Ö¼ +ëöÁ×ăˆŸ±»ׯÛ«‚ ½9åĂ­v™‰kß [ïSÏÔëöÛ×ÑõØä̉߈ëöç.ƒØÛºÍßăˆŸí÷˜êèä߈ưÀù×µ†±»§Ó‚v§ÔÛ«‚ ½9߈ÏÔÍË)éÛ9¥߈ù×É̉ëÛ«‚ ½9›Ú‰Æ¯¾×$­¾µöëƠUË̉ÑĂ›¶éƒ¾‘Ë¿“ÈÍ?纗¾¿»ÁƯăˆŸ;ơ‡²Y‹É0ïÚ¯¼ö—¶ĂĂ ›­±àéMÙŒë*«•Èû›ÖĂ щ›¾ĂÙ9¥‡×·̣ÅÔÍÄÓØ™ÓÁĂívëö¥ºöÁ œàß»û÷ÁÅij¸£å̉ ơÔëB²ÆĂ¼Ï̉ÿÚ£»ÿڭćºÏÅׯ½ØÛ«‚ ½9©‹ÇÉÚù×»ơÔË¿±»ë¸½€³ÂÙÚ߈I°»¥Û›ÚÅÔÍĂóÂñÖ™‡¸àơêÊ¿ôƠ¹ÚăˆŸ;ÏỔ½ +®¼µØÅÓăˆŸ¡Ư9¥‡Ể­‡½ù×û̉ËÉ9߈˜Á™Ø©¼›¾à×*ÛÔà=ª¶2tT‡º¹­Ø•Ç%¡”ÍÄÓ¾ëöÚÀ‚ØßÁù걿—¶©ƠơĂ³ØÎÅù×ÇØ§Ó™‰kß [ïSµ.¥ÙñÓóÄç'ĂÙÿ¯¶«‡“Íj™‰kß [ïS‹Ü™‰kß [ïSÙ½­½¼«‡“Íj—»ơèÅÓØ߈ÏÔ£‡ù¿ƒ,ÅÓÁƯ™‰kß [ïSĂÙÓˆ•=‘Ûº»½ëöƯÑÓÛ«‚ ½9±»ÙÀö˜‡ơèÅ߈±ÔƯÓ Ûê±».ß½À½ỡ߈Û«‚ ½9”¼ô¡ÔáÛÑæ«‡“ÍjÅÓzùæá é‰ñ5ñ·ÑÄ뾃vëö߈ƒ¾‘½ÍÓÔX¿‰ÏÔÅØ¿ºÏ̉ñï‰Û«‚ ½9Û×߈™Ö»ØËƠÆăˆŸû’ÙÜ™ÔËÜ«‡“Íj«‡“Íj±»ùù×̀Ó™‡߈·ÅÛ«‚ ½9ÿÚÛ×́ơÑĂûåÁ³—¶ƒvͼ‡ŒÛºÙ½¡Ûëö½™‰kß [ïSêêL¿ôÍĂí#ÏÔÅÄơÔ™‰kß [ïS‹Ç‹Óºyëöé‰ñ5ñ·“ÛưÀ9¥‡ÈĂ#Ù×ÀĂ÷ÁË%ƒv߈‡»Úª‚ +¼9ƒvÿ¯¶Á¹ø×¿‰˾ơµƯÓ ³ÏŻţøÿ¯¶¹Ú½Ǻ·ÅµØưÀÚÀ…ŸÈ߈©ºñăơ¿‰ĂÙơÔ™Ô¿ô“ºÓÁå̉ ĂŸ}ƒvÛ«‚ ½9ºÛÄÓÙ½­Öù‡ÏÔ±¿ÏųƠÑÄë±»óÔÁÜÛ«‚ ½9¾±”‹ÇăàÏÔö·Ê›ÍŸÅ¥Ó‡ÚơĐË‘ïiÙÚÙ½ËÉ9Ÿ–œÜ±»ɇơÔ¬¿¼ëơ$ÇÛÀǼÛ«‚ ½9ÙÚ©ÓÔÅÏÔơỖˆ¶‡Ö8æăˆŸ;ÏÔÙ½ĂÙ«‡“ÍjóÂÇ¡¡È…»ưÀ·ÜåôØ¿‰åÁƒÖø×Ô¼€Ï̉‡ÚÎ̉»‹ÍÓ¡ÔÙ½Ươ9¥‡¶›¶é¡Á%߈ƠX퇓ÛÛºÙ½ßÄÙÿ¯¶Û«‚ ½9ĂÙ±»ÁƯ¡ÁỞ³¹đÚÅÓÉĂäÁ‡º™‰kß [ïS½‡ŒÎ…DZ»ơêÙ½ăˆŸ;«‡“ÍjµØ߈¡ÔĂÙ߈Û«‚ ½9ÙڡԄ؃v›¶é˹ùת‡’̀jĂ™‰kß [ïS߈đÆäôư‡±ù1öÁÏÅ™Üù‡ßÁ‹Ù$ëö™ÓÉÛ̉ºăˆŸ;©Ó«ÔÍÇיÁÏÔ°»‡9ß+›̣·‡‘×8ç»Á©¾çµÓ½ƒÖȇ›¾±»ÿ§9¥‡×Û«‚ ½9¿ăˆŸ;·ØŒÉÙ½߈ăˆŸ”‹œH—¡ÔÜù×ù×™ÁçÚÔ§¹ëÔƒ×á «‡“Íj‹ÇßÁÁƯă“Ơ‘÷̣Û«‚ ½9‡Ú¿‰‡•ÍË)éÛ9¥ù×ÙÚ÷ˆĂٷŵة‡¥2ßëMûÓưÀÇÖßÄÙƒåă‘·̃ˆ˜È­Öù×ǽ™‡÷¿ÅÆÏÔø×ßÚăˆŸ™‡ÏÔÛ«‚ ½9÷Áö∹ÁơÔăˆŸ;kå̉ Ư¡§Ơ±»±»ÿÚÛ«‚ ½9éÓù×ÛºƒvÍÓ›¾·‡‘×8ç±»ă‘·×¾߈¹ÚÄÓ÷Á°»§©Ó›vĂñÖ›¾ÑĂăˆŸ;¿‰±¿öºăˆŸ;­½¼ÿ’ÏÔ•Âùë¿ÅÛ«‚ ½9ËDZ‡ÂÆĂ·Ó ¥0§ÓµøưĂ·‡‘×8燌߻û»ØÙÚƠ—Ø´†ôêÏÔËÉ9ï½ÏÅÍÄù×÷ÁÍË)éÛ9¥ºÓºÍÓá£Ç½½€Ù½ñÚÑĂơêơº˜êèäí—G•ŒÙŒë*«½³™‡·§D ƠëöĂ³ºó—¶߈åĂ•Èû›Â­Öƒ×­Ô«»ͽ›¾߈Ơ¥Á‡º˜‡™É¡Ô÷Ô¾™‰kß [ïSăˆŸưÀưÜ´‰ç$Å÷Ô‰¿I߈¯×öôêùê½ùסØÏÔÍÇ£‡ÊÂÛ×™‡ïÚ…nïiơê™‡ÅØ«‡“Íjƒà=Û«‚ ½9¹Ú½ôµÍÉù¿½€–Ói¿IÁƯÙÅëơ‡›Úù׿‰™‰kß [ïS‚+Û×íêÛ«‚ ½9©‡¥2ßëMº‡×¯È»ÅÏ ëöĂ߈Ă³ơÔƒØ÷ËÉ9߈ÔơêëöÏ̉éÓ¼Ă•Èû›…Âù¿Ù̉¿‰·Åñ̉—Ó¿ßùצÓă»³ôщ‹ÓăˆŸ¹àăˆŸ“i±Ă›¾†ŒÿùÚàệǽ€ÙÚÅØŸ}¥ÇÜö°»™‰kß [ïSˆ½‡ÚÔ„ÅăˆŸ;óǃ¹Ú±¿¡Û·-‰¿I߈ơÔ¿‰ϼº±ëØëØÛ«‚ ½9ÂÙ£»Åء۾߻ûáƯÙ½ôçô½¹÷ÁÿÚÛ«‚ ½9¹Ú‡“ƒÄ¡ÛưÀá¬߈Û«‚ ½9ñÓơꉿI™»Û«‚ ½9™Ôă»¹£ä›¹öĂÓơÔ¡Èå̉ ÅÓÛ«‚ ½9·‡‘×8ç³ƠXñÆñÚ·‡‘×8ç±»å̉ ÏÅ—¶ÿ¯¶щñĂå¼ ËƠơ)߈¨Ơ¾•×·Üù×ùדƠ©Ó¦Ó½€£ä̃ˆéÓ™‹"¹à³ ÷ˆ±¿ưÀ±½ơÔÉĂÍÓưÚƒˆ“Ơëöëöëö—Œ¿ºëÔ™wéÚÙÚù׃v Ëû9¥‡“¹ƯNÍĂæºƠœư˃Ôï‹›¾ñƠȇß»ûùש‡¥2ßëM¾èÓÛ«‚ ½9™‰kß [ïSäô +—¶ÏÔ…›̃øÚÏÔ£»ƒàY«‡“ÍjÛÇăˆŸ;ËÇ“½ăˆŸ¿º›ÔÏÔ±»Û«‚ ½9í—G¹ÚĂ›µÅ¯¹Ú«Ú³Áںطž۫‚ ½9¹!ơêĂ¹Ï̉›¾³½ù×›¾ÿÚƒvɇá ·¼Í7ÏÄ…»å̉ ß»ûù¾¾÷ÁÛÀÏÔÅÖ ™‰kß [ïSƒvù×ơꓼ“Æ»«‡“ÍjưÀ°»­v›¾±»ºưÀ×Ó̀Ó°»©Ü³àçô¡Ç¯¾‚à׿8×­ÄÛ«‚ ½9¿ØëöÛÄÓ“½¿@Ă¼«‡“ÍjâˆăˆŸöƒv±»±»£éƒö›ÚßƯñ×óÇ›vºơÔ߈ĂÙÅàǼ½€8¤‡µØ›¾…Ôƒv Èó­ơÁƯ¸Ú$ù×ñÖ¨‡¤2€̃êLẮưÁŸ¾Ăº÷¼‹ÇỂ«·3uU³ºó™‹¡Á£Ö¾éº¾Ô³›¾±»÷‡¡Ô½¾‡›¾°½ ›¾¬Öºרº«Ú§ôơÔù×øÓzơºơêå̉ ™Áû‚½«ÔƯÓ «Ô÷ÚưÀ÷Ù÷Á¹ÚÈ̉ +¥¼ù×§Ọ́ÂưÀ·ÔÛ«‚ ½9ÖÆ™‰kß [ïS·Ô¹¼áê߈ÏÔ߈ÏÅŸÓϹáêêÚ½ÇĂùÛËÇÇÓ™Óμ߈§¹ÿÚ‰Û“È߈çĂÈ4ÍÓÖ…ƒv»È¤ÙưÀÙ×Ù½—ˆYùêóÇưܼëÑÓµØù¾çZ̃ˆÏÔăˆŸĂ ˜êèäç̉ƒvưÁŽù×Û«‚ ½9ÛÇ«ÔđÓÛº­€çÚ¨‡¤2€̃êL®¾¢Ç¡%ưÀ—¶ͺ±»ºñÓ«‡“Íj‡ŒÑÄë§ÔëöĐÓ +Û«‚ ½9ËÇơꩇ¥2ßëM«»Ǽ«Ôù×¾ׯơèÅ₫h®¶h÷ÚÍƠư“º½Ư”8¤‡×ÍË)éÛ9¥Íħ‰¿I¢Ç™‰kß [ïS«‡“Íjï³2¯Æ¤ößÁ·Ü³Øϼʾ̃ÚŵÅØ—ÓÏÅ‚v˜‰j̃ZîSƒ×ñ~«‡“Íj½ívëö¥&ĂÙ¹«‡“Íjºź»Ăƒv8¤‡×ÑĂ™Œå̉ ߈ÙÚ¡Èé- Ơ³È·ÔÏÔå̉ ơèÅ«‡“ÍjÙ×ÛºÛ«‚ ½9¥‰ÍL…ÙÚ„»áêɇׯăà‹Ü·Ó ¥0¹Ú¿‰ƒv­ÄăˆŸ;ù׃vÅ߈ƠÍBƠ©ØË뽟ūԓƫ‡“ÍjŽâ·½È½€“¼›¾‡x÷¼ư‡±ù19¥‡¿¹ù¿ÏÔù׃쉕‹HÏÅ߈ƒÖ÷»ĂÙ¡ÔÛ匿N½»­½¼1«Ôơú¹Ú½ăˆŸ;‰ÆÛ«‚ ½9ÇĂÅÔëʦô½ËÚăˆŸ;ăˆŸ;̀ÓÑÓßÄÙÛ«‚ ½9Ơ×ÇĂöù×±»߈µ†×¾·ÔëơÍ|ëԻr“âƠºmƯÚÿÚëöâÂ3´ÎĂÈö°»¹ÚÍƠµØ½9¥‡Û«‚ ½9·Ôׯ™»—»™‰kß [ïSÁôÏÄ¡Á‡Œ₫Çă»Û«‚ ½9ßÁÇ÷¿»ÍĂ¾ơèÅï½¥/¡ÛÇÓŸ}«·3uUµØ™‡ƒÔç*·ÔóÂÓØµƠÁƯ™‰kß [ïSß»ûºµØ߈ÏÅưÀ߈Ú×å̉ Ǽ廋܋ÜöÁµÆ™ÓǼûØơêƒàÑÄë§Ôùê¿»©¼›ă‘·©Ó½ĂÍÄ›Ôé‰ñ5ñ·ÙÚ‰¿I«·3uU˜ơ釺¿ÛÙÚ÷ù×ψăˆŸ¾æí‹Ü8¤‡ÁĂơêç̃̀ÓơÄ‹ÜíÆ߈ơÔÿ‚‘ÖºåĂƒăˆŸ;·‡‘×8癉kß [ïS߈ö‹Ç•Èû›óÄ9¥‡…ô—¶Û¯G‹øưÀăˆŸ;ïÚÙ½ƯH±»÷Á¬Öăàù×ưˆ©Ó¥Ó¡Ç˜‰j̃ZîSª‡’̀j¹ÚÅÔ©—¶÷ÙéÓ™‡Û«‚ ½9—̀§ôƒ×·Ó ¥0ÅÔÏÅù×µÀ½«‡“Íj‹ÇÏÅÙÅë‹Ü$Û«‚ ½9ÏÔï‡Û«‚ ½9í—GÓÁ·Å¼Ï̉áÛ½ă»ÙÚ“Ơ¶¯¦ºĐÄê¹ù׫‡“ÍjÏÅ·Å÷‡ăˆŸå̉ ăˆŸĐĂÉ8¤‡”½›¾«Ñ“Û«ÔóÇëö߈öµa™‰kß [ïSđÁ߈“Ơù×½Ă©‡¥2ßëMêöĐÄê‘Æ߈…ÚÁĂù¾¡Ûívƒv½߈ó|›¹›¾‡ºÑسÈÏÑ¡ÁçÚ­½¼»߈÷ÚÛ«‚ ½9ÓØ‹øöؽ“ƠáêƒvăˆŸ;ƯÓ ëö±»ù?™Ó·ÅăˆŸ¡Èù××Ă•Èû›£Ø¹Úü¦†ÙÚ̃ÁæÚ™߈íÖù¾“÷åƠƒv£‡·ØăˆŸÏÔ·‡‘×8ç÷Á߈ßÄÙơÔ8¤‡Ö™‰kß [ïS«·3uUăˆŸ;Û«‚ ½9ÍÓÇ»¡ÛÙÚÏÅóDZ»̃ˆÏÔÏÅ—Óﻵ؇Œ™‰kß [ïSåô§Ó½½ĂÙ½ăˆŸíØ±»›¶éƠívêÚ›Ú¾ăˆŸ;ßÄÙƒv‹ÇưÀ‡j9¥‡߈âˆ:ÍĂÙ×½€µØ“ÈăˆŸĂ±»Ù½½€§ÔăˆŸ;k­Øƒv߈µưÀơ꫇“ÍjÇâÂÙÿÚ…ÛºñÆÅÓ²•%½§àÅĂƠ“ÆĂ«‡“ÍjËï½¹Úÿ§å̉ ™‰kß [ïS¡È«ÔÓÅöÏÅù×êÔÿ×ëö&á ëԺœÆƠÇ̃ŒÚ,³È̃„™‡µØ—ÓñÁÙÅëÁ̉ăˆŸ;™ÛÄÓưÚËÉ9±»ËÇܙʯƯñÆÿÚëØ¿ÅùêÏß„ÿÚ¯¾åơƠáÿÚËÇ߈ùלܩ‡¥2ßëMéê°¿É߈ß»û߈ôăˆŸ;«Ô9¥‡«Ô§Ơ£ÇÏŰ»—»9¥‡ÍÓăˆŸ·Ô˜êèäƠÚ‡xùráåÁăˆŸÙÚ­Ö¢ ưÀĽç'ÛơÔÎæ«ÔÏÅÓư£äÁĂÈÍÄ©Óçøê Û«‚ ½9Ö̉Úª‚ +¼9÷ÁƒÖơÄ9¥‡§ô±»÷ä€ÓĂº·Å½₫ƒ½ǽƒˆưÀ¶Ï̉£äû(ÅÓÜÓ —ÓƠÜâˆÇâ¯ÈưÚƠÜö«‡“ÍjÇÎ¼È å̉ ù×ơÔ±»ÏÏ̉ĂÙăˆŸƒÁĂÛ«‚ ½9ù׳ÈÙ½éÇØ“Ơ‘÷ׯơÔÅÓä̉Ë¿ÑÓ™ëéåÿÚ­óµa߈ăˆŸ;Ă轩ÓĂºùרƠ¸Á©ÜưÀ‹ÜöÁ­Äơê½€å•ßµØÛ«‚ ½9ÍË)éÛ9¥½œÑ­¾ñÓ9¥‡ø¿ƒ¾‘§ÓÏÔ½€½º§ºÖÆÿןÖưÚ›¾«‡“Íjù×ÄÓר«Ôùׄç̉߈9¥‡жÅÓÅ™Ó̃ˆ¯¼“º»á›æº«‡“Íj›¾½Ô§Óëö÷ˆßÁ³ḈØ¡Ơƒv¿½·Ôÿ¯¶ƒ¾‘§ôÿÚ©Ç©Ơẳ¿ôå̉ —¶½ÅØÓ˜̣ÿ¯¶óÓÛ«‚ ½9±ÁŸƠưÀƒvù×ÑÄëÎÅëö¾‰ªÛ«‚ ½9‡xµ_Ùÿ¯¶±»ĂÙƒv™‰kß [ïS¯ÈưÀ½€Ư‰ĂÍ­H‰ÁÅØù×½ăˆŸ;ÅØíù×}ûàóÇÏÔăơÏÅ‘¾³Ç½³ô«ÔÙׇä™ÓưÁƒv•Ü߈ăà˜êèäÛ«‚ ½9ƒv™Ó·Å™‰kß [ïSÏăˆŸ;‡ÇăÁÁÿ¯¶ƒö«‡“Íjå×·Ô‡Ø×ØÅêç4·Û¿‰“È«‡“Íj±»¿‰—¶ƒvÛ«‚ ½9³ÈŸ¿•×ĂÙµØưáö‹Çù—½ÿ¯¶·¢óÂ9¥‡÷Úö÷Ô¼€ĂÙíÖ“Ơâà +ËÉ9Áñ»½ôù×™Øà™‰kß [ïSơÄÛ«‚ ½9ψ­‡“Ơ­Éù×ăê­Ä»Á·¼Í7YưÀªÚ×¾‡ŒƠÿ,º«‡“Íj½¡’9¥‡›¾·̃ÏÄư§‡¼¶  ÏÄAù×ơêù×ơꪇ’̀jÅØÏ̉ÙÄêơ߈ëÔ©ÓæÚ“¼™ëéåµëö™‰kß [ïSç$‹ÜƠÅ»ù×Íİ¿ïÚù×ßÏ™‰kß [ïSÉƠá ¹ÚÅØ"!“ƠŸƒ½Ù½â­Ô«‡“Íj…ôÑÓƯ)›¾¦Ơ¹ ù×Ươ™‰kß [ïSµØÙÚ«‡“ÍjåÁ·ØŸÍχ •ƒvÏÔÑÓ¬Ö˜‰j̃ZîSƒÖ÷ˆÏÔؽê߈«‡“Íjƒv±»¸ÈÄÀ‡ÿdzÆÙ½¹ÚÛ«‚ ½9éÓ9¥‡ƒvÏÔÅØÏŽÏÅƠ½Ô‡Ç÷Á¹Ú9¥‡×¼Æ½ÏÅăˆŸ;ÀĂ™ÁÄô ¹ÚÿÚñ×…ƠѶ“Û™Ó—ˆß“Ôi½ƒ½ñÚăàø×ß»û¡ÛêöăˆŸ;ù×ܹ͟đ…ö±ô½¶è©ÓơĂöר™‰kß [ïS©‹½ëöûØé+‡ÚuÍ߈„ØÏÅíÅ™‰kß [ïSëö¹¯¾«Ô·Âív£ưÀ~ù×£qƒ½ƒˆỞ̀Ó «‡“ÍjÅÓ¿Œ™‰kß [ïSÓ̉œ‰¾Iơêù¿Ăèß §ÆÇÜó́Áô‹ÇÅ»ù×ùׯȻ ͼϺؽ̃Á›¹½ÔÉƠ«‡“ÍjƠ±»‡Û½Â÷Á«%ï½ơĂơÔçÚơÔ™‡Û×½Ôùê¿ÅœÜ9¥‡߈™ëéåÛ«‚ ½9Û«‚ ½9Û«‚ ½9Á½™‰kß [ïSÏÔ«Ô“Ơ£ÉåĂÚÿÚ™Ô­Öׯ́Ø¢»Á½ÿb‰¶¥ˆ]1߈ñÚ̉Øëöù¿ÑØăơưÀ½€́ر»ªÚÁ櫇“Íjéôƒ́¡Èü‡°ø1æÇ·‡‘×8羺­RëöËǃ£ÇÏÅ›‡µØÍË)éÛ9¥Ó£öÁ¢»«Ô¡»ªÚ¤ÓƒÖ«‡“Íj‹Çª́4åơëöÏÅăˆŸ;öùêƒvÏÅôÄĂñÚؼ®µØÏÔ°½øæưÀÁƯ÷Á߈™ô™‰kß [ïS™‰kß [ïS‹Çæ½á ÷Á˜‰j̃ZîSơê±»ĂĂù×߈½…€­:Ơ÷‡÷ÁÏÅçôÁƯNÏÔ½€9¥‡Û«‚ ½9éÚùôñڜܬ¾çÇÁÓÙ½9¥‡Ơ™‡½˜Û÷‡Û«‚ ½9“Ơ¨ºƒv«‡“ÍjéÚÊÖÛ«‚ ½9ÑÄë—¶ëöưˆ±¿‡ÇÙÓ߈Ù×¹Úá ÑØщñ;Ơá ÿ…‚vÛ«‚ ½9ƒv…ƠĂÙœ‰¾IăˆŸ;ÀĂêöéÜ™‡ƠX«âăàÏ̉ĂÙ¡ÛĂ½™ôØÅêÿÛƒˆ9¥‡ªÚÙ×»ØÑĂ—µÂÙß„ëö§ôÿ‘÷‡¹ÁÙŒë*«ơÔ‹ÙưÀ¿‰É̉Ó¼©ÇËÇüÀëơ¿Ơù|9¥‡ÏÔó…·‡‘×8ç¨ºÑæĂôï³2×¾½ÇÏĂ߈‚¾Ûº×Ü£ÇñÓ߈åĂŸ\ß'ûƠÅƯơêÏÄ«‡“Íj‡ñ5¨¼Æ«‡“Íj߈ăˆŸ;k¯ÈăˆŸ½ÑÄëßÄÙ«Ô±»Ơ×߈ÔÇ×¾ÏÄ™ÓÚª‚ +¼9©‡¥2ßëMÛ«‚ ½9áÓb°»­Äöơ ¡Û˜Áß»ûƒÚùסÁß»ûÓÆ«Ô‡Œ€¾ÓÅÍÓÛ«»±»ÿ×ÑÓ¢Ô£ ©‡¥2ßëMù×ăˆŸ;³ö§ÓùơщĂƠëÁ•¾Û«‚ ½9ĂÙ½™‰kß [ïSăˆŸÛà‚v£XͺÿÂÁ›¾ùêÙÅëÏÅçÇÛ«‚ ½9—¾Û¼â»öÑÓµ†Åëö¸Úơ‡ñÁÛÀ½ăÇí±»Ï̉…³ÇöÁ™‰kß [ïSɇ±»8¤‡åŒ¿N‚Ø߈»ÆϘĂÖ¹Ú™‰kß [ïSµØ™ºŸÅß»û½€¥ƯƒØÙöăˆŸ;«‡“Íj­ØÍƠÈû¿˜‰j̃ZîSưÀÏÔ±¶ÅăàÿÚÅØÎÄAëö«·3uU¨›êö¾º©‡¥2ßëM§Ô¿º̃»úж±»ɹ©ÓóĂÛ«‚ ½9¦ôñÚï³2Ă¼½ô¡Á½ÏÔ‡Œ«Ú‹Ç²º̣¦Ô¿Úôê±»ù£“Ơôß̃¢Ç±»¡È9¥‡·ÔÛÀÆØ¿»™ëéå¶ÁÓÑÄ몇’̀jÛ«‚ ½9#‹Ü±»߈´†ÍĂơê½ñÆщÊ%ư€ƠÉï§ó»Øù×ÖÀ åÁ£Ø‡ÛÙÚº½©ººyƠ#ËǸÚËÉ9ׯơĂ¹Ú߈‹ÜÛ«‚ ½9ù×ÍÓǽÖ́Û«‚ ½9Á¡»Æß»ûĂÙÿ¯¶á ï»G½¹·ºÁ‡é/×:½ÿ¯¶ăàëö™‰kß [ïS›¡÷ÁÍƠëöƒvÿÚù×öß»ûÑ+â੼µaÅÛ÷‡›¾©¼«ÔÅÓÛ«‚ ½9ÅÁÛ«‚ ½9ÿÇ߈·‡‘×8çÍ[ưÀ­v›¡ưö¹Ú₫®¶ưÀçÇ߈ăˆŸÛ«‚ ½9ơÔâÂï½ÿ¯¶‡ ‡º¾Ó؇ÛƯH÷ˆ«‡“Íj—Ø™‰kß [ïSÙ×ëö“Ơó%û¹ÚÙ½å̉ ƒØ™ĂăˆŸ;¯ÔÓ ‹›æ‚Ø߈ÍË)éÛ9¥ËÇƒÖ¡ÔØµÜÛ«‚ ½9Ñ·—»Û«‚ ½9⻹ÚƠ’ơêÙ׫ÔÛ«‚ ½9Û«‚ ½9ª‡*’*̀j*³‹å̉ ߈×ÜχỞÛÆ÷ÁÙÚ³¡Á³ÍÄ©ˆ©ÓÏÄëö¡ÛûƠ—ˆăˆŸ;ĂÈ»Á•%Û×ăˆŸöÁËÉ9­Öº̉ÏÔ™‰kß [ïS‡Œ ÇËǽôăˆŸÛ«‚ ½9Ù½Û×ĂƠ÷ÁÍË)éÛ9¥±»©v·‡‘×8çǼßÄÙ—»Û«‚ ½9À‡€è/Ö:£Ø×ƠÙ½ó¡‡ÛÇ̉ăà—Ó±»˜‰j̃ZîSº¿Åƒˆ±»ưÀñÓ›¾Áñù×ɇ·Ô弫ÔÙ‡Ï9…à ÏÔÏÔ©‡¥2ßëMÁ̉«âƯ‰ËÓ̀½ ưÀ­Ä¨º÷Á«‡“Íjă»¹Ú¹Ú«‡“Íjñu¿çÅØ½å̉ ³ÈôùêÛÀ±»ÏÔá ´‰ƒÖ8¤‡×߈¨‡¤2€̃êLăˆŸ;ëöáêăˆŸ;ĂÓÖ¹…¼«‡“Íj™ÓăˆŸÇØÙ½×Ơí‡ËÙưÀÏÔóǻÕ¨ºׯÇØù×Úª‚ +¼9ƒv­ô·ºöíÆªÆ­ÄµØ¹Úơ•×™ÇÖù×́í—G±ëØăˆŸ;™ÓÅù×½ƯÀùæÅØ߈”·Ù½߈“Ƚ¿×µÑÓ›¾G½¹¨ºơÔêöÂĂƒˆ¯ÈÈ ™‰kß [ïSù×⻡ÈÛÀ™‰kß [ïSºÛ«‚ ½9±»8¤‡«‡“Íj¹ÚÅà±»Û«‚ ½9ïƠØÅêă½ŒÓ±»¥Û±»±¿²çºéỌ́ÇơÔÛÆáÅëÔƠ‹ÇĂÙÛ×ÁƯ™‰kß [ïS‘¨ÙÚ—‡߈¼ơÄǼÅăºưº9¥‡ơ»ăÁ»ØÛ«‚ ½9½Ó¾ǺÏÄ¤Ø ±»Û«‚ ½9ÊÇϼ‡߈ÇÖ÷ˆăˆŸÚª‚ +¼9ù×—¶©Ü¯Û«‚ ½9Ù½±½¥ØưÀóĂ«‡“Íjơê߈»‡9¥‡×ÏũؽơÔÙÅëƒvÛÀÉ̉Óˆ•=‘ÛºƠX™É½ÔưÀëöɇî²2ơ«‡“Íj™‰kß [ïSÅ…Û±¿ÇÖ½€ĂÙÓ¾«‡“Íj“È©‡¥2ßëMƠ¥‰ÍL…±¿£»ÏÄ«‡“Íj́v­ˆ8¤‡×«‡“Íj±»ăơ±»ÑÓÿ¯¶߈–³ºóÛÇưÀ©¼ƒˆ™‰kß [ïSçÚ™‰kß [ïSÏÔÏÔùë߈½€ÏÔÛ×Ûº¥¼Ÿ\ÿǦƠŸÂ—»щ½ô©ØˆøöÁ£Ó߈ñÚǼưÀ¹«ÑÛ«‚ ½9©Ó›·Ôïi±»ÏÅÏԡȽ±»ˆ·Ôëö±»êö̃ˆëö¡Ô‰Î¥Ø…ÔïƠ½ ëö“Ơ¾̣Dz‡Çëö9¥‡Èí½Ắv±»£Ø·ÜÛÚÛ«‚ ½9½ĂÅñăˆŸáö‰¿I»n•ÛÄÓ×Ü¡ÈÇĂĂÍÄͼÛ«‚ ½9¡ÁÁƯÁ¼ăˆŸ;Û«‚ ½9»«‡“Íj߈½ƒ£Ç™Ô¿)ëö‘ÖÅáƒ×Ư‰߈›¾ß»ûÍÓñ»¢ÇÏŲØƯº„ôÏÔé‰ñ5ñ·«‡“ÍjÛÄÓÛ«‚ ½9óÔ嘼«‡“ÍjăˆŸñÚÿÚçÚ߈«Ñ¡Ô…Çœ¾<¿ÅÅØçÚùס»ăˆŸóÂ߈Åă»ÿÛóÔÛ×¶ù¿ù×Ù½¡Û“Æ9¥‡›¾»½ĐÄ꡼ÏŽÙÊÇ©‡¥2ßëMƒv¿ +ñÚƒºÅëöëªø×êöÿÚív£Ưÿ¯¶ƒÖ’±»Å–™‰kß [ïSƯ’ß·ùëö™‰kß [ïS¹Ú™‰kß [ïS¹Ú·ÔÂ…Ơ™ëéåçñ³Øëö§Ô·‚ÍË)éÛ9¥Á±»»Á™‰kß [ïS™‰kß [ïS߈ª‡’̀jàêăÁ±»›¹ăêÿ×ù×™‰kß [ïSÛº›¡ï½é‰ñ5ñ·ĂÚÉÖÅӿŵ܃¯Ô°½ÎÔ©¼Ù½ù×µ£äñÚ«»™‰kß [ïSé‡Ă¥…‘ÆÑÓ߈«‡“Íj½È™‰kß [ïSăˆŸ;ɶԙ‰kß [ïS•ÇĐÓçÚ‹ÜëöëöƠöé‡߈«Ô“Û«‚ ½9ăˆŸÛ«‚ ½9«‡“Íj™Á¡ÈÁ½‰ßƒv«‡“ÍjÉƠăˆŸÙ½ÁËơèÅñÚ¡%íÆöÿ¯¶ăˆŸ¹ÚăˆŸñÖ­Ô⦆Ǻy‹ª-00ù׎—ˆ›¾±Ô¶ÙÚ¼î­ÄÿǃˆỞ™‰kß [ïS±»¿Ù×ÍÓÓ±»ƒ½œ́Ù½ÍÓơêå̉ ø±»½ŸÈ¤ÖăÚó›¾Û×—»Û«‚ ½9ĂÈßÖ©ÜË¿ç̉µÀ¡ÈĂÈùסËÇÜÏÅÅ–÷Ô«ÔØ×”‡Œ߈¿Åñ~ºóáÏÔ›¾ƒv›¾™‰kß [ïS9¥‡Û«‚ ½9‡Ç×¾ëöĂÙ›¶é­Ôơê©ÓÙ½ϼëö¥º›¾½ăºÎÅ‹n›¾Á¼½ÔóÂ߈™‰kß [ïSÏÅŸÅμùêÁ£XßÚ§Ô—Á­ÄÏÔ߈¹Øé‡¡ÔưñíJ‡Ç¡ÔẨ*£ä¸Ú°»›¾ỞÏÔܾͺ­sÛơêöÀ̃ˆ‡‡Ç³Úåñ»­¾‚vÏÔ°»ǽ«‡“Íj±‡‹ÇÙ½±»™‰kß [ïSù×¥ÛüÆ‚v©‡¥2ßëMçôµØÿ¯¶9¥‡×ÅØ©çÚ±»ưÚ¹Ú™‰kß [ïSÚÀ ·‡‘×8çÿ×ñÚ¶‰ 9¥‡×·Ô«Ô›¾ñÆÁ¾½Ă¿'«Ă·Ó ¥0ŸÈ½ăˆŸ;¿ºĂĂ·ÅơÔƒ½«‡“ÍjÛ«‚ ½9ăˆŸ;kÿ¯¶ÚÀ±»“Ơû(ươۙ‰kß [ïSơêÙÜÅ»–Œº̃ˆ¿×·Ó ¥0ƒ¾‘ö߈Œ¾ï‡ß½°»Ó‡ºˆơ™‡à ±Đ߈ÎÔ¹ĂÙׯÛ«‚ ½9Ûå̉ µa·‡‘×8çơêÏ̉ỂÙÚÏÔ‡ŒÜĂ«Ñùê¤Æ—Ó÷ÁÅØ߈·Ô±»ßÓÈ̉ï¶9¥‡‘±»›vơÔ¹Ú©Ó¸ÚªÔ±½ùêùơ©&ÍÓŸ}±»âÁâƠó¶ơêăà߈ª‡’̀jÍĂÍË)éÛ9¥÷‡·ÔŸ#™‰kß [ïS­ÖÛ«‚ ½9ƒv₫Ûº›¾ÿÚ½¹ïÁ™Ôºû(ª‡’̀j ÁßăˆŸ;ÑÓÇ̉÷Á«‡“Íj±»™‡ăµ¶èÓÆç'ÍÉÆ^¹Ú£ä«‡“Íj«Óé½ÏÄÀĂ»$“Æ—»ÏÄÛ«‚ ½9ƒv‰y±»߈ơÔ‚Û«‚ ½9¥¾߈߈ÓØ½ËÇ«‡“Íj¶$¦D2 29¥‡ß»ûÍ­H«‡“Íj©ÇÑĂô׿8ƯÓ ¡»éÓ…öÛ«‚ ½9±»¹Ú½ƒv½€ơèž«‡“Íj߈ÚÅÔ¡Ôଠ½è߈›¡¾Ó؃v°ÅÑĂ©öÑÓÛ×ƠáÓÇư¹¿Å»ˆÿ¯¶èê ߈óñÁ߈ÓºơêßÁù׫‡“ÍjăˆŸׯÙÚ߈…ÖÛ́₫­½¼Û«‚ ½9‘«ù×·Ô™‰kß [ïS«‡“Íj­vưÀÁ‡ŒË̉Û«‚ ½9Û«‚ ½9µƒvÁ½ívÆăˆŸ;±»ƠóǾ÷ä5̉ÿ¯¶ÚÀñÖăˆŸù×ÅÔơêÛÀ—»ó^‡9˜‡߈ÇÓ凿º×$˹ës°Å‡“½Ù½ăˆŸ‹Ç₫ÔöÛº©‡¥2ßëMß»ûÀÅà‹Ç›‰Ï̉‘µ߈±»£ÔñÓóÇ“½·ÔßçÏÔ¡ƠƯÚ߈Û«‚ ½9ơ‡½™‰kß [ïS¾©™‡¶ôêÖƠưÀăˆŸ;­¾ƒvëöăˆŸ;Ở߈÷Á»Ó¹Ú߈ï»ÏÅË̉Û8¤‡Ü½×̉ùëÎơ×¾ƒ߈«»ŸÖ°»£ØûØÛ«‚ ½9ºÅ˜‰j̃ZîS÷ÁĂÈ\ù¿³ÈÇô«‡“Íj߈’¹ÜNׯĂưÀº-¹È9¥‡×³×Á½‚v•½áơÔ߈½€½ăˆŸ;kâºÙ½•ÇÛ«‚ ½9ÿ¯¶ÈĂÏÔƯÓ ëØ±»¹ÚñÓ¤ˆ\0ѶÀÚöÏÚ·Ô­ôĂÓßø©ÇÚÆö‹ÇùרƒÔ›ñ¹ÚÁ̉ƒˆ–¶³z¡Ôâˆ:©À¯ÛĂœ·̉ ¤0«‡“Íj‡Œ§ÔµØÿÚ´ ƒvÛ«‚ ½9ù×¥ÆÉœ‰¾Ií‰Û›¶éù¿¥Û›Úµ‰ùêÁƯçô¿ ›¶é‰Ó…»£Øÿ$ŸÖ±»Â·Ø9¥‡ĂÆăˆŸ˹ÑÓ™‰kß [ïSéÚåĂ›¡°»ÏÔ«Ôш¾*¡ß±»¶±»›¾¯Óăà·‡‘×8çÁĂăˆŸ;Û«‚ ½9‹Ùgö’¹ÜNơêñġۜ«ÔĂÙȇŸ„ßÄÙóÂÿÛÙ½±”çÚ½¡ÛǼÙ½½ôóÇÅÔéÓ‹ÇóǺÁ̉ôÛ«‚ ½9ØƠ¹ÛÀñï“Ơ›¾Ù×™ëé嫇“Íjăàμ á=™‰kß [ïSÛ«‚ ½9Á½÷Áíê«·3uU˜êèäsçÚ§ÔÏÄíÜëö÷Á§¹ăˆŸ;Y‹Ó¾©Ó«‡“Íjç°Å÷̉‚Ö›¶éÇ"©‡¥2ßëMñ¨×¿8Á¼ù×߈»Øƒ×߈•Œä̉½ù×™‡œÁÁĂ•Èû›ׯÇÖ÷ÔÙ½Û«‚ ½9ƒ½±»¿ô¡ÔÏÔÆơ©¼ÓµÏÔ¾»ÁÏųÜÍƠíØöÛ«‚ ½9±»«»…n±»ÑÓƒ«‡“Íj߈ÎÔËÖ±¿Ă¼ßÚ·‡ưÀçڿ؃văˆŸ;«ÙÚ¡Ó˜Á™Ó¹Ö•Œ§Û₫«»ÍÓŽºÛ«‚ ½9ăˆŸ½×kß [ïS9¥‡ù×Ơ÷r§Ø£ä‡ºƯÓ g›¾À‡€è/Ö:™Ó›·Ô«‡“Íj¾ßơÄÅÔÛ«‚ ½9óÇÇÏÔ˜êèä·ÅÛ×ÛËƠ¥ˆ]1Á¹ÅÓÏẠ̊¶ï½¸ÚµØ¿ô›¡±»Á×á¾áêµØƠÙ½%¡ÛµĂ›¾ñÆÏ̉ƒÚш÷ÁívăÚ…½Ï·‡‘×8çóÇË̉ÍÇƯºÛ«‚ ½9ÂÙÁƯ›¾±»ÿÛăˆŸ;¡ÈÁƯÙÓöÁù¿ûÓô²Ø±ö©Ø9¥‡×çÚ±»g˜‡¿¯«»ëϋ߭ÄÚª‚ +¼9÷ÁÏÔ8¤‡‡Ç߈¡ÛûÀ©¼ưÀ›¾¹Ú÷Ù©&ÑÓÙ½ë×½÷Á©¾ÁĂÏÅÛ«‚ ½9ƒvǺÛ«‚ ½9ç½±»öÙ̉ºÙ×ËƠ­Äœ‡Û«‚ ½9ëöÙÚÙÚù×9¥‡áÛëöå̉ ߈ÑÓ«‡“ÍjƒÖ¾ÅíÄ™‰kß [ïSÁ̉¾ƒØ·§D °»ơơÔ™Ø8 +¤‡ +ÏÅß»û¢ô“°»₫ñWéÓ̃ÚÄÓßÚ±»¡ÈÛÀ´À•Èû›щ­Ô¡ÁåĂö’Ç߈ùדÇÙ̉߈ÏÔóÂƠ‘®…ÔÍÈÛ«‚ ½9ô™‡½€·‡‘×8ç Û¯ÓÛ«‚ ½9ÍË)éÛ9¥«·3uU“Èù×˹¹àÏ£XÙNƒˆ¯È™‰kß [ïS÷Ú©¼¾Û«‚ ½9²ÂßÄمª-—Ø·ÔÁăˆŸóÇ‘Ôáù×Åô³ºó¡È™»¯¼ÿ§Ù̃ˆ¡È±»á¤»™‰kß [ïSùêñÚ³àÛº·Ó ¥09¥‡™×±»Ù½¾¿à™‰kß [ïSÅ··‡‘×8ç±»Úª‚ +¼9°»ñ»«‡“Íjۙ‰j̃ZîS±»ƒv©‡¥2ßëM‰‡Œ‡ºăˆŸ;›·ÔËØ­Ôψ¾ºÙYÑÓ–¶ăÁƒvéê§ôăˆŸ¯È«Ô¼ù×Ç%ÅÔÿÚ›¹Îơ ̀ÓÛ«‚ ½9ƒÓºö½À½Öơ»ăˆŸ…Ø·‡‘×8çËƠÛ«‚ ½9ăˆŸ½™‰kß [ïSÅÓëöơê—¶Ú¾¡Ư«‡“ÍjÚª‚ +¼9Û×ơÔ߈‰ÔñÁĂÖù×±»G½¹ÙÓùתګ‡“ÍjăˆŸщñÉ̉÷Á¶˜‰j̃ZîSƠÁ¹ăˆŸ;¡ỒÄ («â9¥‡߈¿ôïÂƠÁ̉רÅÄử™ÓĂèêÙ½߈›Û¿ßăˆŸ;­RϺÏ̉éÓ¥º«‡“ÍjшÙ½ÁƯùט‰j̃ZîSÖ +íÖ∙‰kß [ïSíܰ»ívÚÀÏ̉Û×Ă»½¿ôÏÔ™‰kß [ïS߈ơ꫺µØ™‡Ѷƒƒv™‰kß [ïSªÚƒˆ9¥‡·Å§ô¹ÚÏÔÏÅó–óÇÏÔ›¾ßÄÙÓŜ‹Ç̃ˆÖÔ†6¦jµØ£ä¡ÁăÁ·ơꎹƠăˆŸ;k¬Äî²2µØÙ½ƯÓ ·Ó ¥0±»÷‡¡Ç§ºÙÅ륈]1ö߈퇕Œ¨Ơ«‡“Íjƒv¶Û«‚ ½9ƒº9¥‡¬Ỗˆ½ÁƠºmáêƠ`9¥‡‹ÓóÊívщ㙉kß [ïSÅ–¸£“ÆѶ™‰kß [ïS¡Û¤‰̀L„›¾ù볫‡“Íj·Å—ˆ±ëØÅÓ ´† ³ÑªÔ»ˆ₫®¶íê·‡‘×8笾 «ÑăˆŸ;ÇØ§¢“ƠߌÛ,ʹăˆŸ;€Ä߈ŽÿN½ñÙăˆŸ±»ÏÔ«È»‡ù×µØÁ¼ÏÔ™‰kß [ïS¿ôăˆŸ;¿‰Î̉ÉÖá=¾ưÀñÚí—GêöéêăˆŸ9¥‡ùêû(¹Ú‡ÇưÀøê£Ó™‡ó™‡«‡“ÍjÏÔÏÔÛ«‚ ½9øêăˆŸ;™Ô±»Á|«‡“ÍjơèÅăˆŸ;k‡º·Ó ¥0±»ÛÆöÁÀÛéơ™‰kß [ïSÅnÿç­Ø‡Úù¿¥ˆ]1™ÁăˆŸÉÙ±»ŽÛ«‚ ½9ỞÅØƯđÿÚ‚¾»ÍÓ¿‰¶«ÈµØ›¾ËƠÚª‚ +¼9߈Ù½߈âàå̉ Î̉‹Èù×™‰kß [ïSÿÚĂ¼£ä›‡™×µØóÇù×Y÷‡«âỂöÀǼÁׯƠ߈̀Ê)èÛ8¤×ƠÛ«‚ ½9±»Ÿ}Ù×߈ÿÚù×½­ÔÑÓר·‡‘×8çÇÖÙÚăˆŸ;ÅÔ•ÍÓÉ̉Á½ĂÛۺ ߈çºăˆŸÍÄăˆŸ“Ơù×§Ô8¤‡«‡“Íj›€Û«‚ ½9ŒƠ­ơ‡9ïÚß»û·Å‡“öÁËƠ½÷‡ÅÔßÄÙ·‡‘×8ç§Ó«ÔƯØ£»Ûơê×óÂÛ¿ºß%…ø߈É£È9¥‡×匿N±¿Åµ†¤ÛăˆŸ;±ëØ©‡¥2ßëMÇÖ¬¿ëöŸö·ØêöªÚZƒ£ÔÁŒ·Ô˜ ê è ä Û«‚ ½9•Çö±»ªd‹Ç˜ÓÛÄÓ¿èĂÓ­Ö×ƠÙÚ³ ߈ƒ¼€çôưÀ’Ơ½™‰kß [ïS¡ÛÓº߈×Ơ©Ç̀Ó߈µØåÁù×ÍǵدéË̉Û«‚ ½9Ï̉§Ô“່‡ñ5âàÿÛ©Øш™‰kß [ïSß“­½¼¸ÚÑÓƠăˆŸ;¿ë₫(¬ÈµÜƠXăºÿ¯¶ÏÔ°»ñÖÑÓù×é³ù×ƠÁ¹ÏÔçÚ¡ÔƒvûÓ™‰kß [ïSÔXĂ˜ơ¥©§Å™‰kß [ïSÛ«‚ ½9ÿ¯¶±»óÇù׺۫‚ ½9—‰¤Â×á½€ÿ¾º±»ñÚ±»ưºëÓ½à›vº½߈êơÏÅÅØ¢Ç ¼€ÿ×Û«‚ ½9Û«‚ ½9Ù×ÓỞÇ»Á½•¾ÓÁçôÛº¯¾ÏÔ²ÂăˆŸóĂÈ߈‚v߈ơêŸ\‚ÏŹÚÎ̉ÓØàêöÅØß»ûÏ¿û(¡«߈Ç%ñÓÛ«‚ ½9°»±»ĂÙß»ûùڵؙ‰kß [ïSƠXï½ÅÔé꾡ÙéÓ›¹ÑÓÙÚÍÄưÀü¦†©Ü$Û«‚ ½9¯»ÙÚ‘«ÏÅÏÔ¬¶›Ú©Ó™‰kß [ïS‹ÜơèÅūӛ¾ơê•%½€ñÚ“ƠµØÏ̉ÏŇÅÏÔăºĂÙÔXÛ«‚ ½9ÅØ₫á ­ÄÏĺ¢äưˆËƠ¯‰¯0á=ƒvжßç߈¯Ô½ëѶ½ÅÓ½ÔÛ«‚ ½9àøêƠ¯»ö·‡‘×8çùׇƒÚÙÚ»5ùëŽơÔ÷‡ÏÔ…Ơ·¼Í7߈¶ó™‡×ÜÙ½£ÇăˆŸ;×¾ơÄÇÖÍË)éÛ9¥©ÇÅÓ߈ÏÔ߈—»Í©‡¥2ßëMÏÅËƠƒv9¥‡Ö¾8çÚÿ§°ÀØ™Á§ÓÏÔỞ™ơÄÁù×»‰ÛƯàµØ9¥‡ÛÅçÔ¡½™Ó̉Å™ĂÓº¹Öƒˆ߈º¶º¹‡¼ÁëÆµØÏÔßÄÙăˆŸ₫®¶¼÷óâˆñÖ¡ÁÙ½ÍÄívëöù×èÓ$Á̉ÏÔ…Ö¡Û¹ÁŽ’¥ÛóÈñÚɇÁƯ¸Ú½“ƠÏÅï̉ÏԵؠÛ̃ơÛ«‚ ½9›¶é§Ô¨ÓÏÔÏÔ™‡«‡“ÍjåÁ•ÚµØăˆŸ;k³«‡“ÍjÿÚÎÔÏÔƒ½®ÓѾŸ}ó•ăˆŸßÏß»ûóÂ߈“½öÁ÷Ú”ºÍÓ«Ô—»«‡“ÍjơêÙÚ©ÇŸ̃߈ÿÚÓ¾̉ÆÏÅ¿ßùễÁƯÚưÀʿ۫‚ ½9§ÔÓ¾øê‹Üÿ­ư§Ù×£äÊÛÚå̉ ÷ÚÍÓ©¼Û«‚ ½9רƒÖÛÄÓÏÄĂƠ‡Ú‚v§¹ưÀÛ«‚ ½9íÖ«‡“Íj­¾Ñ橇¥2ßëM³ëÿ¯¶߈çÚăˆŸáßÚª‚ +¼9Úª‚ +¼9ËÇ“ëö߈ÏÔ½Ă˜§âˆ«‡“Íj›¾ùס߈¢ ÁĂÛ«‚ ½9Á·‡‘×8ç³(ÏÔùë§«‡“Íj˜ôçÚ8¤‡Ù̉ºyÏÔỞ½Úט‚íJ¡Á˜‰j̃ZîSĂȾŷÔÚª‚ +¼9©ÎÛ«‚ ½9‹Ç°»Ï̉Ơ½ôĂÙ±ăù×™ëéåß»ûÙ½å×°»âˆ°»b†Œû̉³Y‰óôß»ûöĂÇÖ‹ÇçÚª»ƒv“˜œÜÛ«‚ ½9å̉ ™‹óÔ§ôáêÓưÀ±»ƼÓÛ«‚ ½9˜Ă÷‡ǼõaÁ¾±»¶₫Ú«Û߈‡éêù×°»ûØ¥ˆ]1›ÚщÍƠ¹Ú›ç“Ȣؘêèäêö±»±»Û«‚ ½9¹ØÂÈÓºá ‰ơ›¾ª¼ÏÔщÛ«‚ ½9—ÓÏÄí꯼ù×ó¾ƠXùêóÇĂƠŒÓ“Ơ­¾Ư‡ù׃v™‡À‡©ăˆŸ;ĂÙ™‰kß [ïS›‰íºÅƒ½™Ó£»…Û«‚ ½9˹Ù½ÅÔå×·‡‘×8çưÀ9¥‡û̉ƒvƒˆ»ÅÏÔ¹àŸÈĂ¼đ½rë‘ăˆŸ¾éÔߌÛ,ûÙ±±»ÛºªÓÓµö¢È­Ä÷ÁơÔ½đ‹Ç¨‡¤2€̃êL…¼ÛưÀäÁ“Ơëö¹Ú·ÅăˆŸ™‰kß [ïSÙÚɇù×ƠX¯‚™‡çôá ÏÔăˆŸ;½߈¾›Ưô™‰kß [ïSăˆŸ;ׯéÓÍĂºÖÆ™‰kß [ïSĂÈ“ÈăàÿܿŌۥϩØö½Û«‚ ½9ͽ÷ˆù×Ăٯק¹—»9¥‡¹ÚăˆŸ;k«Ô™‰kß [ïS‡Œ™Ô¾́Ï̉«‡“Íjÿ¼ÅØçZ¿ßÛש‡¥2ßëM9¥‡©-­ƯàƠ Å™‰kß [ïS™ëéå9¥‡½¯¼ăˆŸ;˜êèä¯Ó™‰kß [ïS·‡‘×8ç¹Ú½ƒĂƒ¾‘ƒv•ŒÀÇ“ƯÓ ëöĂÙŸ}±ôƒˆ߈ơÔ«ºơêăÇÛç̉ƒ½ưÀíÖ±»¼›¾ơêׯöËl¥Æ­ÖÊÖĂºñÁ₫®¶¿Åº½µØ߈9¥‡ÏÄ™‰kß [ïSóÓ‰Ô±»±¿ĂÙå̉ »í߈ï»äŒ¾N₫®¶™‡™‰kß [ïSîÚͼ¡«‡“Íj‹µØ²¸­Ä·Ôøæ¡»ơêơễÄØ³ô¿‰ÁĂÊÇÏ̉™‰kß [ïS¥ÂÙŒë*«¥Óϼ«Ú8¤‡G½¹ï²2¥ÛéÓ«â÷Ù½½‰Û¿‰÷‡Ù½™Óƒˆ“È́vÛ«‚ ½9Ù½Û«‚ ½9Û«‚ ½9ÿ¯¶Á¼±»«Ú³ ¥Æ߈½€ăà±»̣eù×±»™‰kß [ïS›Û‚vÇÖé¥ơêăˆŸ;߈½ăˆŸ;ká ÷Á¶ÜÛ«‚ ½9½ơÔ¯¾¹̃ơê°»ÙÚø×êÂÿÚËÇ×Ó«‡“Íj¡È«‡“Íj߈ÙRÏÔƒvƯ™‰kß [ïSƒÄơê߈—¶•{ÏÔ±íê™Áù×Å™‰kß [ïSđ±»öiă‹߈Ưç‡Çå̉ ñÓÁĂÏÔ½€¤ØĂº·Å£Çƒ¾‘ܽÔƠëöÏÔÍÄ»‡ËǙԤÖ÷ÁÅÔ¨¼å×§Ø“Ơ½Y«ÈëöÙ½¯ë±»¾ß‡̃ŸÈÅÅ¡‡×÷Áá¬÷Á°¿Aå̉ ñÓỞ«‡“Íj‘ơñÓŽ߈¡Û߈‡º¹à‡(ĂÙ½₫ăˆŸ;k­Ö÷Á·ÔÛ«‚ ½9¹Ú²Y߈ăˆŸ;«‡“Íjÿ¯¶›·ÔƒˆÏ̉ƒ×ï»₫‚Û×ơê‘ÆΈ€Û«Ô߈±»Û«‚ ½9ÁƯñÚ•‹HªºĂÙ©‡¥2ßëMÛ«‚ ½9÷ÁưÀÇØÏÔ¿Å¿‰ÿÆߌÛ,ÛÀø×±»ƒv³àÔăˆŸ;g«Ó™‰kß [ïSƒ½‚à½ưÀï»ÈË̉ƒˆÙŒë*«ñ~ưÀç̉‰¿IĂÙ̉̉ƒˆ¥ÛăÇíù×™‡¾™‰kß [ïSÏÔÅݽ “¹ƯNáÛäÁ#™Á_¡È¡ƯỂ»ÁÙÚ߈ÅÄù×ÅØŽ–¾¯¼«‡“Íjƒˆ9¥‡ÑÓ±»ÙÚÙŒë*«ëö³í·‡‘×8ç–́«‡“Íjï³2ÙÚ‡ŒƯ‰ß»ûơê—ˆÙ½ÅàŸ«·3uUÿ$°»™º­v—»ăˆŸ;̀ºïƠ¥Æù×ÍË)éÛ9¥ù×€ÄưÀÏſڻء÷»ØơăvëöµØơê¿Å³ÉăˆŸ;kÛ«‚ ½9‡ºÏÔ¡ÁÂÙÇ÷ăÁÙ½ƒ¾‘ăˆŸçº¹ÚÏÔÛÆó|Û«‚ ½9ç'ÏŵÜöñÖ߈˜ÁçÚÏÔ§Ô9¥‡½ôÏÔ³Ûçô·‡‘×8çÂĂ߈Ǻ©‡¥2ßëM«‡“Íj”ù×íÆ¸ÁưÀËÇÁƯưÀôÁĂÏÔ«dÅ»×̉‡äĂÙĂÙ±»·‡‘×8ç™Áº›¶é‹ÈÛ×ĂÙ8¤‡é‡Úå¼ ·‡‘×8ç8¤‡±ëØ÷Á±»÷ µ‡ºéÓ›¾ùëÁƯ“¹ƯNơÄ©Øù¿‡ºóÇ—¶ƒ¾‘ăˆŸçÚ߈“ºùß»ûƒvµØ¥+œ‡ÏÔºµØ»Ø»ˆÛ«‚ ½9±»¡«‡“Íj¡Ô¾ñíÈä̉  ½›¶éưÀáê¤qÅáăˆŸ;«‡“ÍjÙÜĂôùׯ¼™‚›¹«‡“Íjù×ÜÓ «‡“Íj߈ÚÍÓÙÚ¶§Ó‡¿ÀÓơÄ×ëö9¥‡¿‰îéù×›Û½©‡¥2ßëMóÇăơ±»ƒvß»ûÉíê³Èщ£äÛ«‚ ½9ø×™ôơêÏŃv߈éºÙŒë*«9¥‡×ĂăˆŸÏÔǽÙ±ƒÚ˜êèä×ÚÏÅ»½ƒv²m +Ï×å̉ ‡xù×£ôçÚIưºß»ûÏÅăÚ©º9¥‡ÙÚëö«Ô¿ßï̉…Ô°»ñÚëÔ«‡“Íj«ô•ÜÛ«‚ ½9߈øæ¡Û—ˆ‚ßÄÙÅØơèūڷԔÖÉÏÅÂÙ¾ß8™‰kß [ïSÙÅë₫¼ÙYÛê¶̀Ê)èÛ8¤±»G½¹ăˆŸ¾« ©ƒ»5ÁƯ›¾ăˆŸ;k½áê…܇ÍƠÙ½—ˆûà§Æ8¤‡ơêæøÏÔ±»†“ºyđ߈½÷ÚăˆŸ;ËÉ9߈ïd¹öù×ëö‰Û»ˆƒv¿ñÇÖ½åÁÜ›¶éö…Œù×ÎÔ°¿ ·È¡Ôï½›ĂÛ«‚ ½9½Ô³ØÁĂ‚‹ÇÇÓ³Ø߈¼Ôù×Ù½ùסÁÑÄëù×£÷󕌫ÚÛÏÅ…öù×ÿ‡©‡¥2ßëM¹ÚùדƠ‹Ç«ÔÉëö¡È›¾›¶éÑÓÍË)éÛ9¥‡Úù×ù׫dÂß»û·ÔÙÚÑÁ‘Æ™‰kß [ïS›“‡ïä¥ÂÛÀ¾±ÈÚª‚ +¼9±»ưßăàĺưÀ¡ÁÁƯăÔÛ×ø×‹È½Ô9¥‡×Ë¿™ÓÏÔ9¥‡×·‡‘×8ç±»ÏÅ¡ëöÛ«‚ ½9±»‹ưÛ«‚ ½9ëöñÓÚª‚ +¼9Û×߈ăˆŸ¡¨đ™ëéåÛö9¥‡¡Ơ¹ÚĂô÷‡ÚÀĂĂ ›­±àéM…Ö—¾ÏŅǽăY«‡“ÍjÙ×ÏÔ߈ÿ¯¶ÍÄר³Ø£Øï +¹¼«‡“Íj·Ô¡Ơ™Ó­vù×ù×½ăˆŸ;Ă¼ăˆŸ;ƒvŸÅïƠ‘«°»£ØÛ«‚ ½9߈…Ö‚Ú ߈©àœÁ Ô«Ôùë¼÷ÂËÉ9·‡‘×8ç¿ß‘±“‹•öÂÙ“Ơ•ëÁĂÛƒĂ©ÏÔé̉߈‹ÇËǽ类¨ÇĂÙ…nÙŒë*«æôáê·Ó ¥0»ØÖ½€­ÄỞ¥‰ÍL…öº©&¡È³ºó™Á®öÛ«‚ ½9ÅÓ±»ưÀ“Ơ¹Ú·Ôƒàư“ăˆŸ;ù×›!ƯÓ ÿÚ߈Û«‚ ½9ªĂÿ¹ÿÚ£X·‡‘×8çß„³Æ÷‡ẳ¯¦“ƠĂÙîºô™‰kß [ïS«‡“Íj›Ô±»¥ˆ]1öÁơêÍƠÏÔ¼ôÅÓûÓÙ½ơèÅÙùå…ö¹ÚÍÓ›ÆưÚ½ăê9¥‡±»©‡¥2ßëM©Ó—öƒÁÈƯ‰·‡‘×8ç¡Ô«ÚŽÍÓ©àG½¹›¾½‚¾ + +ÏÄ™‰kß [ïS¶Ú߈Û«‚ ½9«‹·#ơêç«™‰kß [ïSÏË£ä߈À¹ ÛĂíÅÿÛÁ̉ÅØơè°»ùêëö™‡ƠùÚÛ«‚ ½9ơêỞÛ«‚ ½9‹Ç…'ƒváÇỞÁ™‰kß [ïS«·3uUá̃©%ó¶ưÀÑÓ‡¿áê•ÓăˆŸ;±¿¨‡¤2€̃êLÚ×±»±»”ÈúËÇâˆÏŵ؃Ư±¾“¹ƯN·‡‘×8ç§ôÛסÁɇ¹ÚăˆŸ;÷Ú…'ëöÛ«‚ ½9¡ÓăˆŸ;kÍË)éÛ9¥ÍÄÇ®Èų·ÅóʯÈưÀ›Ú£Ø•Œö©ØéÓËÇñÖơĂ—ˆƒv‘ƵØÛ«‚ ½9Ơª»½–¶Û«‚ ½9ÏÅ߸ơù׃vÖÆÙ×8¤‡«‡“Íjźå̉ ×ƠéêơÔ8¤‡™‡Ü憓߈ÏÔăˆŸÎö£äÿ&ÓÆÅĂÛëĂÙµØĂôáöÛºù×·ÔÛ×̃»ú×Ơ†7§jÏ̉÷Á»ˆöƯº¥Û™ÓƠ¡Ç©ÇäÁß»ûéÓëöƯ‰‹Ó‡Ú˜‡ÓÆŸÈỞ9¥‡ÍBöÛ×™‰kß [ïSưÀå‰ơê¼ÙỤ́¶ÏÔ»̉œƠóÄÓ¾ßÄÙóÂÛÚûÙ‚ «ÔĂȾß÷‡‡ÀỞ¹ÚÛ¬ÏÔˆơư“₫®¶ÏÔËÙăºÏÅ©‡¥2ßëMÑäÍӥƹ»ÙŒë*«¹ÚÏÅμÚˆÏŹںøê±»™ÔæØÖ¾½Ă‡º¤â³ºóÏÔöñÓ™‰kß [ïSÛÔ¸ÚË¿¡Ô߈•½½çzĂÙ}©Ç‡ÛË%ŸÈ·ÔơÔå‡Ơº¯ƠÙŒë*«ëö±»ĂàăˆŸ;ô™‰kß [ïSơ¾ƠX©‡¥2ßëMÿ¯¶¹Ú߈Á¹µØÿÇ™‰kß [ïSçÚÙ×§Øù× ËûÏÅÑÓÁ ÑÓ±»¹Ú©̣ëçơê˜êèäÁ¹÷Á¼ív…ƠƠÜÛºáê¯ÈùêÛ«‚ ½9§Æå̉ Ù½ƒvï»ι›º̉#÷}ñ‡æÚ¡»ÏÅ%©‡¥2ßëM9¥‡™ëéåĐÓ˜êè俺ƠÄøêƒv¡G½¹ÙÚ¶ØÛºщ‡xƒ¹¼ăˆŸ;½÷ÁïÁ¿‰‡»ÇXăˆŸ;ÿÂ8¤‡ñÁ߈9¥‡¯¾ß«‡“Íjï½±»™‰kß [ïSÅ^ùÚĂÙˆÍÓÍÄ¿ÅÏÄùêÏÔ¹®Ǽù×Ù½ëö∙‡µØÓØ߈¿‰߈ï½¹ƒ×¡È¹ÚÇÜÄ;̉Å…Û·ÔéºÍË)éÛ9¥™‰kß [ïS±»ù×Û«‚ ½9ëöóÄ÷Á„ØơĂ…Ơ¹ÚăàăÇíăÂăˆŸçڡȽƒˆ¹ÚÂƠªí‡Ù½ÑÓù׎۫‚ ½9ưÀ—ºÏÔ±»·‡‘×8çø¿éÚÛ«‚ ½9Î̉Û×Û«‚ ½9ÿ†ôĂ¡Ư±¿ăˆŸÚת¶2tT©Óº´Î±»±»£»¤Ó÷ÁñÓù×±»™‰kß [ïSÿ¯¶…“ùôáØÛ«‚ ½9ͪư§‡°»ëöî½9¥‡‡™ëéå·‡‘×8çͪ»ØĂ™‰kß [ïSÉê¿ØËÇ­ÖóÇ×Ơ³Å£Ôù׃v‡Œß»ûÏ̉áêĂÙíê­È™‰kß [ïSăˆŸ;øôêö½è·Ô˜‡ëÔỞ›¾§Ø™‰kß [ïS¹Úơê©Ö¼±½™ÓçÆ¿‰ÔÑÄ뽋ÇăˆŸ¯G‹øµØÙÚÇñÁ¡Èï½ÿÜ¿ô¹ÚăêûêéÚûؓƑ‡½€¿ܱ̉»±»ÖÆŽ…Ơ™‰kß [ïS«‡“ÍjùדȘ‰j̃ZîSƠX¾ăˆŸ;Áë԰ԅí—GưÀöù׿º«ÔÛ«‚ ½9‹ÈY™‰kß [ïSÙ̉©ˆ—¶©Ó9¥‡é%ÖǼ9¥‡âÁ˹¹Ú²Ø±»­vëö¾…ö½Ăơê ËûÁ¹ÑÓĂôÿ¯¶ơÔëö©‡¥2ßëM9¥‡½ăˆŸÓ—»·‡‘×8ç¹Ú÷Ù«ÔïƠËÉ9߈«‡“ÍjóÇÇ̉§Ô·‡‘×8竇“ÍjïD$çÚ›Ú—ˆ…ÛµØ×Ơ߈Úª‚ +¼9Úª‚ +¼9·Å™‰kß [ïS̀:¬H:ăˆŸ;k¹ÚµÈ†Ú¹̃ù×·Ô›‡µØëöçÚưÀ¥ˆ]1÷‡½Ö¹°§ôăˆŸ½ß»û½ăÏÔĂô“È©Ơ¯Óµ.¥Ù™‰kß [ïSçºÍÄŒºÇ»Ổ±»ív©¨Ù½“dz …ŒöÏÅỞ™‰kß [ïSŸÖÿ¯¶ëö•×ù׻ŹÚÛ×¾ï½ù×щÜ߈9¥‡ưÀ™‡éÓ‚ˆ¾˜‡—¶½™‰kß [ïSרÓØƒ½÷ÄÅÓ߈ưÀ÷é‡Ư­ÖÅÓăƠơèŦô‡xĂ¼†Çƒ½¨¼Û«‚ ½9“ÈÙÚÀ½Ă臤2€̃êLơèÅĂƒÚư‡±ù1¡bÛ×éê߈Û«‚ ½9ơÔ½ôÍÓª¶2tT‹ÇĂÙËÇ™‰kß [ïS“Æç½±™º÷ÎưÀÏŧ¢µa·ºßÄÙ¡Ơ˹éºçmçÚ±»À½ËÓƠ¾G˜‡«‡“Íjâà÷Ú±»¹ÚưÀú̉߈¹ÁĂϺß»ûÛ«‚ ½9Ù½ÜÚª‚ +¼9·‡‘×8çåĂ9¥‡×¥ÈÙ½û(«ÎưĂä̉›¾Ơá¾ׯưÀ«»Ñ×óDzƒvÉßÓÀ߈–¶߈Ù½ÿÚÑ·ăˆŸ·‡‘×8çµØ«€©Ó‚v½¾‡Û«‚ ½9߈×&ăˆŸ;kơÔvÚÀƒ«‡“ÍjóÔơèÅĂÙÏÔçÚ9¥‡±½ÿ§™‰kß [ïSµØ¿‰™Ô±‡»yËÉ9ÍǓȩӿ•Èû›Í¿Ü຅ñÓăˆŸ;¸ÚÏÔ÷Á£ÅѶÍÓëöÑÓù×½ÍƠÊÇÛª»%ƒÔ¶ÛñÚ¨ÆóÇÆ߈ưÀ·‡‘×8çïÂÛ«‚ ½9­¾Û×ëöóÖ›¾¹Ø©Ç®ÓÏÄ™‰kß [ïSñÖ‹ÇÍË)éÛ9¥߈‘«ËÇëØºÛÚơè‘α»©ÓÙ½é‡áƠºÁ¼Á#×$­Ø›¾߈Ăù뿉ƒØưÀÏÅ»đר©Ø§Ô¶èÅơćºçÚâ·‹¿‹¿Óƶ©vív›¾Ù́ÖÓÁÍË)éÛ9¥¨È áÛ¥‰ÍL…îÅ«·3uUĂÙơÑ⫇“ÍjµØß»û±½ơÔÚº9¥‡×¸Úï½…Œå̉ ïÁ¯v¡Ô¾ß5ƒÖơÔ³³ÇĂÜưÀûÓ©‡¥2ßëM¶Åï½·Å©™‰kß [ïSĂÙƯÓ çÅØÑÓµÆ̉ÅívÏÔ¹ÚÍƠ9¥‡×°»¡Á±»Ăô—ˆ½߈Û«‚ ½9±ÁĂ¡ÈáêÏÔ¿¹ÙÚ£»µØăˆŸ;kÛ«‚ ½9é´½âê©ÜøêÏÅÁûíÖÁĂÿÂẴˆÛ«‚ ½9¯È™ëéåッÈÏÔÅÔëöÅôâà·È‡ºăˆŸÏÅ©‡¥2ßëMñÆëöđÁÄØ Óº•×ÏÅÙÅëÍĂ™‰kß [ïS¥‰ÍL…ùׇÛßß»ûûƠö‰Úؽ½Ăƒv¾Úù×§ô½ªÚ ›¾•Ü¿ë߈«Ô±»¹Úëö™ÓµÆÿ¯¶ëö…Ö¿‰Ơøë›¡±»ÁƯÓ̉¹½€Ó“Ơƒ»ƒ’ŸƯÅÓƯÓ ›¾߈…»ºyÇÖưÀ—¶ù×ÂÙ)°ÁÓàÏÅÿÛ›¾óǧô·‡‘×8çƠÊÖ‡¿÷Á½¡ÔÇֻ½¿àëö»‡ăˆŸ;kăˆŸ;º™‰kß [ïS‘ƽøăˆŸÿ¯¶ëÓÎ|“ºơêóÂÓ̃¶¼̀7¿½Û«‚ ½9›¾½ÑÓËqåÁ÷ÁχđÓÑ½Ă•á߈ëöÿÛơê¹Ú«Ôôñ̃ơêï»ÿ¯¶±»ø×ÙÚö°»ăˆŸƒvÍƠ÷…»ăˆŸ;ăˆŸÛ«‚ ½9ÓµŽ̉º£äñ‡·ØÙ½‡Œ«‡“Íj›Ú߈Ở½¡óÇÛ«‚ ½9ƠÛºµ†£Ç½€¬ÄÿÚâơÙ¿ßà ÿÚ¤ˆ\0¹uÎ̉ñÚăˆŸ;À¹ùêï±»ùëÿÚ‚¯ÈÿÇ„ÿ¯¶»Øÿ&¡ƠéÓăˆŸ;ÅØùơéÓ¿$߈À¼ËÓăˆŸ;ăˆŸºơê½½éº߈—¾¾̃ˆ§ô»Á÷ÁÙ½Ž£@öÔ¿‰˜"ñÖ«Ú™ÓÏÅÏÅÏÔá̉ăơ¶vëöÅØ±Á·‡‘×8ç׿8¡Á‚ÚÛ«‚ ½9ăˆŸå̉ áêăˆŸ;k¿Å̃ÙÅë·º£Ó߈Ø×Ă™‰kß [ïSü¦†™ÓÓÁÛ×Ơ™ÔĂÏ߈Ú׿ÙÓ‹½¡ÓÅØÑ·ĐÓÙ-ñÚÁñϹÑÄë—¶‹ÇÑØ±ØôêÀƯÙ×Íñ»ø×çÚ³³¨Á½×ÜÎÄçÇ߈µÀ™‰kß [ïSÁĂÅËß»ûĂ߈›¡¹ÚרÅÓ >‚v™‰kß [ïS¿Æ£ÇÙ߈™ëé僷̣—ø›¾ù×ÍÓô¦ÆóÇù×ơê©Ç±¿ơêÍƠí‡ÑĂ™‡™ÓŸÅï½Û×ÍÓ× „ô‰‰¶ùשǛ¾Û«‚ ½9‰Æ»Û«‚ ½9’½‡›¾ÁáÚ©Óù×ÄÓƠºmöß»ûŽÂÙ÷ÁƯơÿÚử©ÇÓ̉½Ë¿“Ơ×h˹±»«Ó¯ƒ« +>ׯăˆŸ¤âÀ½ûÓăˆŸ;kÙ‡Ï9…óÂÏÔơăˆŸ;³¾´“Ơµ$ ÈßÚ¹Ú±”»º±»ÓÆ¡÷̉ÙÚ߈¼§ÔʹùÊÀÛù×Ơÿ¯¶¾»ó½€ͼ…Ö8¤‡ƒv§ÔÙ½Ï÷å5ÓÍä¦ÔÑÓ™‰kß [ïSăˆŸß»ûƒˆ³‡ÑÄëÙט‰j̃ZîS¥%å̉ ơŹ֙‡ÅÓ9¥‡‡Û«‚ ½9ÅØ›¶éƒ×Ơ½ôâÁ¿‰‹Ó¹Ú¿‰Ú½ÿÛ›Ú¿‰½«‡“ÍjÚ€ë ¿‰åĂÅøÇËÉ9ëö¹Ú½¤ˆ\0½±ºÙ×Ơ¹ÚÑÓûƠ¥ˆ]1‹ÇÇ»øæ̀ÓÅ–»ÅÛ×̀ Ê) èÛ 8 ¤   µØ9¥‡¹à÷Úá Û«‚ ½9ÏÔ߈«ÔÑØƒÖ­ÔÁ½ƒ¾‘߈“½¹à™ëéåÛ«‚ ½9ÙÉưÀ¢»›¾ºƒàμÏÅ8¤‡„›¶é§Ô›¾ß»û™‰kß [ïS–ØĂ™‰kß [ïS匿N÷Ù£»çơ«‡“ÍjÖÆÿ¯¶®Èù×÷ˆưÜäÁÛ«‚ ½9—Œ™‰kß [ïS«‡“Íjͽ§Æ’¹ÜNƠè%ù×ÑĂψ·Ôù¿ưܘ‡Ù½ÛÆï½½—¾™ëéåçÚÅͼ¯G‹ø«‡“Íjï'ÅØĂÙçm­ÖưÀĐÓ ‘ÆûºăàßÁ×$̉ÅßÚ÷‡ê¶;³ ©‡¥2ßëMÙ½Û«‚ ½9óÇă¢Û×׺ÿÛÛ×÷Ú§Ô–êöщ¥º°”ÁĂù×ÁË·ÔÛ«‚ ½9ÙuŸ}ÅØĂ¼•jÆơèÅ»¼‘Ó‡߈±Á—¶íÖ›¾É̉%—»Ù½Û«‚ ½9“ƠÛ«‚ ½9¬Ö<™‰kß [ïS½½™‰kß [ïSÙÅëßÖùêÅÖÔ†6¦j™‰kß [ïSÏÔ£ÈϑÆ߈ß»ûÏÅ’‹߈«»½ ÁÙ½ÙÚ‡ÄÓ߈ơêăˆŸ¹¶çíѶ«‡“Íj•ŒÙ½Ù½¥Â©À‹Ù­ÖÙŒë*«¥Æ¾³z÷Á›·Ô߈±»ø×ƯÓ ÁĂÛדȫ»ß»û™‡áêíÖå̉ ±Ôñփ֨ș‰kß [ïSƒÚÿ¯¶í›ăˆŸ;½߈ÏÔ‡Çù×—ă½±»É^‹Ó÷¼á~ù×ǼăÇí»ØôêÏÔçÚ¸Á‡x¿‰ñÖçگư»ñÙÿ×¹ÚơÔÆèĂÙ±»ëöÛר›ÏŹöÙ½ôửơêØYÙŒë*«»ØƠ‡ºÏÄÁßñÓôÔù©½ƒvë×Ù‡Ï9…߈Ë̉½Ô»Ăó‡ăêăˆŸÉq«‡“ÍjíÖăêï³2“æƯÓ Í­H‡̉º›·Ôëö¼Ôƒ¾‘ö™Á¡Èÿ.—¾ÏÔ·ÜĐÓÛ«‚ ½9¥‰ÍL…ƒÖóé»Å›¶éăˆŸ;¡ƯÁ̉³ÓØ̃Ư©Ø‘ÈăˆŸ‡¡ÈæÚívÙ½‡xơèÅù׺́Å ®È¹Ă¼—ÛĂº‡Œø|Ơ¶Å¡ÈơèÅÿ¯¶ô½̉ÍÄÛ«‚ ½9}ơÔ¹Ú߈ù׫»•Ùß„«ÔíÚívăˆŸ† ¹Ú¾ù×·¼Í7ëÓßÚñÖÏÄÿÚçÚ‡Œ™‰kß [ïS½¹Úר߈çôÛ«‚ ½9£‡†ÇÙ½›¶é«‡“ÍjêÓøêÙÚ¥Û‡ÇæÇăˆŸƒv“Û©‡¥2ßëM¢ô‡çÚÍ—»öÍÄÙÚ·º½öµØ†Œ¿²8¤‡Ö‹Ç‘gƒà‡º¹̃‹Ó‡ñÖ«ÔñÆÿ¯¶é‡ÎÅ߈›©±»«‡“Íj̀ĂßÄÁÜù×™‰kß [ïS±»·ôơèÅ¥Û“Çêơ‚°ú«‡“Íj°»ÏÅÍÓƒÖ‹Üù×ăˆŸÛºÅØ9¥‡×•ÜÑÓưÀÏÅ¿́—¶±½Ó¼߈·‡‘×8ç‹È߈‰½ö­€å̉ ¿åÍÓ«ÔÇ֣ؽ«Ú›¾ơĂ©¼ź8¤‡×Ù½“ÈéºÙ½ƒßÁ‡ŒÙ»Ç̉•ÁÛơ꫇“Íj¡ù½×̉ﻕŒÛºù×¹Ú³”ÖÚăơĂÙÚñ~¥‰ÍL…ăˆŸ;këö•Ó:÷‡±»ñÖÁ½ƯÓ ¿ôéÓ߈ÓÓ°»¿‰÷Á…ÛÏÔÍÓ™Ó™‰kß [ïSï½Ă ‚v™ëé婇¥2ßëM˜ĂÓí·Ô£»¾»¡È¹Ú¥Ø©ØÓÓôé߈ªÚ¾¹Ú»Â‰ÔØ×±»ëö±»ï‰¡ÛÑØ›¶éÓ„̣Ç»™‰kß [ïS»Ă9¥‡©‡¥2ßëMˆ¾ÆÖÑØ̀½Ÿ}¬È¹Ú‡ù×ơĂ™‰kß [ïSÑÅ̀½«‡“ÍjÉƯÑÄëÙÚƠÓ÷ÁóÂă» Ç…´‡±»»‡»¹ÚÛ×߈¼¼ù×ăĶÇÓ™‰kß [ïSÅØ¶Åù×ùêăê‡Ççô±»ÅØËÇ÷ٵث‡“Íj̀Ă¿‰ßÄÙ¡Ûăà߈ƒˆÅØơØƠ€×Ü߈߈¥Ûá×ÔXËÉ9°»߈ǼÏÄÛÀÍö›¾‹Ü—ˆƠîăơ±»ù¿ëƠUû™‰kß [ïSâÁƠcÚÙ½Ù×¥́߈íÓÎÔ÷Á™Óß»û9¥‡Ơºm…nÛ«‚ ½9ÄÓÉ̉±»ª‡’̀j§Ôß»û‰ÔÁ׿Àù×µa•ŒƠ¼¾¯¾»ô¦¹½Ă‡‘Ö™‹²¾ÙÚçôƒÄ¾Ù­í™‰kß [ïSÈ̉½ăˆŸ;󛙉kß [ïSÏÅ«»«‡“Íj¡Û©‡¥2ßëM“öÛ«‚ ½9ưº«‡“Íj€ËÉ9ơèű»‡Œ´êơĂÙÛ«‚ ½9ª¶2tTùױ“Íj̃ˆÄØ•ÜƯ¡Èƒv›v‡ÚƯºÚª‚ +¼9·‡‘×8çô»“³ºóÉʰ»ƒv«‡“ÍjăˆŸ߈ƯÓ ™‰kß [ïSù×Û«‚ ½9±»¦ÈăˆŸ;ÔºZlZ±¿ûØÁ|̃ˆíÖñÚÉăˆŸ;‹ÜÛ̃Û«‚ ½9·̃ÁĂ­ÖÏ̉™ÓËÉ9¡Û‡©ÓÛ×ëÓù׳×̉ï½œÄ ¹Έơú§Ơ¢Ǿơ9¥‡Û«‚ ½9™‰kß [ïSƒŒ´†œÂ™‡ĂÛ«‚ ½9Ë¿ûÓÏÔÏêĂÙ€º©‡¥2ßëMº½±»÷Ú¹ Û«‚ ½9Û«‚ ½9­Äż8¤‡ÖæÚ™‰kß [ïSÛ׫ѱ»Û«‚ ½9›¶é±̉߈ÅÔËÉ9ÙÓÓÅÏÔëö™‰kß [ïS±¿™Áơê÷¼µØ‹Ü§ÔÑæƒ½Æ«‡“Íj™Á¿‰ÓÅÿÚÏÅÇ»ù׽ȫ‡“Íjï»ëö“ÛơÔ‡x™‰kß [ïS½€ĂôơêÑÓăˆŸ;kå̉ ‹Ü¥ÓÖÆ¥Ø–»ƒàĂºù×ĂƠ Ă‡ÚƇµØ«‡“Íj«‡“Íj߈đƱÁơÏÄ›ÇÖר°» ™‰kß [ïS«‡“Íj󩇥2ßëM׿8ÆĂ´Iƒv•Èû›ÁĂ߈ëöºë¼™‡Ó¾ƒvÙÚƒˆï¼ù×߈ÅÄ¡ö߈ÜÅØêöÁËÑÓ™ô¹ÖăˆŸ· º‡Ñæƒv±»߈«»¡È©‡¥2ßëMÿ$—»Å؈ƒvƼù×ĐÄêÎăڃvËr߈¼€ƒÛ«‚ ½9º¼ñÓÙÚɇ©°ÙÚưÀÓØ«‡“Íj¿Ø»‘Ƈ“«‡“ÍjÿÚ‡ºç̉Ù×µÀ«dÙ-ƒ’¹ ÜN Ơºmÿ¯¶ɇ•Œ‡ŒƒH³»ÅƠ«Ô·ÔÍÄÙÜüÀU˜êèäƠ¡ÁăˆŸ;ÅÔ›·ÔµØÙÚ±»Ểé•Ïŧӎ…Ơ߈·Åó¶¤ÂƠXù×½ÔÛ«‚ ½9‡ÇàöÛ«‚ ½9ù×»½߈…Ô½€µØÙ½ăˆŸđ» +­¾»½›¾Ǽùêù×±»8¤‡×·‡‘×8çÚÁƯív¿åöµØ›¾í—GưˆỞ‹Ç«‡“ÍjĐÅù×·‡‘×8çºĂƠÏĘêèäïߘêèä“÷Á•kù×¶̃ˆ®Ü‹È‹ÛÛºđù×ơ»‹ÛûƠØÚ₫¼ÏÅê$¡Û‡º™ô‹ô«‡“Íjù×ĂÙå̉ ±»Á‡é/×:¡Ưœ‰¾I§Óç¸ÚñÚ°»™ÁÛºăˆŸÁ‡é/×:ù׿ÚÛ«‚ ½9©¼§•Ơψ€Ûëö™‰kß [ïS‹Ûù×éÚ¡ÁëçÑe¾»—¶»ƯÓ óº¥ØåŒ¿N­Äù×ù×ưÀÊÈ9›¾›¶éÁĂÈÛ­Ï̉¥ˆ]1ù×ùêÑÄëÛ«‚ ½9«‡“ÍjÏÔ߈ÑÓÚñÁ˾³đˆÇ߈•ÂơÔ™‰kß [ïSÛÀÙ×ßÄÙ°êØø× ăˆŸ;éÓ½…Øψ›¹±»“Ơ…Ơù×ïÚơèÅëößÁ©Ç¸Ú¹Ú9¥‡›ƒv÷Á߈ß–“Ơžù×ëÓ%Û«‚ ½9ĂÙ»³÷ÁđĂ9¥‡ù×™ỐgóÇ“¹ƯN½ôÉĂ¼œÁÑĂソ́ÙѯƠđÚ›Ú߈ư‡±ù1½¨Â ăˆŸö“ÈÍÄăˆŸ;Û«‚ ½9ñÚ«‡“ÍjÎÅ ­¾­€ÏÔ½•¿Åù׳ãÄØÛ×­ºù×Ï̉߈ù×Û«‚ ½9Û«‚ ½9€¿×9¥‡›¹ăº̃ˆĂôÆáê™»ưÆÎĂêóÂĂ¼÷Á°»ơê½đÓ÷Áëö«»óÇáØ¹ÚßÄÙñÆ߈‘àïÚ߈±kưÀÏÔ§ôÚÀ«‡“ÍjÑÓ™‰kß [ïSëöYĂÙµ̣™‰kß [ïS±»“ÜÏÅÛ×Û«‚ ½9¯Èö¹Úá=ÏỒĂ™ëéåơÄ·ºÁĂÛ«‚ ½9¢Ôă½“¹ƯN™‰kß [ïS©ÓưÀëöñÖơÔưÀßÁù׫»ƒÔåÁ±»óƒˆ´añÖ½©ÇôêßÚ˃ˆ/щø߈™Á—ˆ™‰kß [ïS¥Äƒ4Ï̉ƠăÇí¹ÚœÜå«ÔưÀ™‰kß [ïSÅÔ¡È›vÎÚ1…ô¥ÈÎÅÛÊÖ­Ôùë·‰³ÂĂÓ÷‡ÛÀôê(ͼÏÅßµßÚÛˆ§ÓºŸÈÑĂÁç̃³ºó߈‰Ô8¤‡‡º™‰kß [ïSÛ«‚ ½9Åôƒ¾‘ƒv߈¿º߈¸Ú™‰kß [ïS™‰kß [ïS·Ó ¥0ÙÚ¥à—ŒF¼¹Ç艾­ôơüç̉çÚ¯ÈöÿÚ˜‰j̃ZîS«‡“ÍjÓº߈Ù½¼€·ÔÚÇ߈ƒ¾‘ù×ÓØѶ´½6§¹µØá†߈àƠ º½±»ƒ½ñÙ‡Û«‚ ½9À¹Å–ƒÖ«»›¡Û«‚ ½9ï»ÄÁƒvôÅ¥±»öǼăˆŸăˆŸ;¹ÁÛ«‚ ½9ÓÅ₫§ëöa¿°߈¿ô߈¬ÖÅÔÙÅëóÇ»½ÑÓ™‰kß [ïSĐøăơÎÔëöܶ‡Ö8æÂÙùׯ»ûöƠ «·3uUçÔ¡À½Ž™‰kß [ïS›¾±¿½ĂƠ˜‡·‡‘×8çÏÅ¡Ûï³2ªÚáÄÄô¶Ü½Ă«º“Èùש¼«Ôù×åÁëÖ–Ó¹Ú9¥‡ÿ¯¶‹ÈĂÙ½» ׇ‡ư2§ôï³2÷Á«‡“ÍjÏÔ˜ÓóÂÏÄơê߈˜‰j̃ZîSôÅÓ¼€å̉ ƒåñÚ£–¹¼G½¹ÁƯ9¥‡ñÖư‡±ù1íÁÓØñïăˆŸăˆŸƠÅçÚñÓ߈̣Ă…¥ÓÓÆçڕǶ‰Ù½ï³2‘÷Úƒv¡Ôÿ ‡ºÍÓƒÖƠÍË)éÛ9¥ÏÔ‡àƒ×ÓÁ₫Û÷Á§ÔơêĐÉÔÁ¼íơù×ÛÇÎ̉·Ô±»«‡“Íj™‰kß [ïSỂÁƯŸ}½€ù×ɽ¡ÔÏÔ¡Ô½€ƒvÉẴ& Ëûơê³à÷Áù¿âÁ£Ư¹Ú¿ßùêͽơê¹Ơ³×Û«‚ ½9±¿­€ªÚÙÚ™ôö¾ô/™ëéåû(ÁƯỞ½±ºăˆŸ;‰ÁáÏÅÆ»ÙûÖ·Ô©ÇÙ½ŸÈ­Ø³Çû̉ø×ç$ÑÁ÷Á¹Ú«»₫—ˆ°»½€áÛÁËÜÙŒë*«¬Öù×ù×ù×߈́Û«‚ ½9¡Ơ™‰kß [ïSÓµÓ̉“Ơ߈›v•Èû›ù×§Ôù×Û«‚ ½9öø̉gƒv÷ˆ‡àê߈ËÇÛ«‚ ½9ĂÈÎÔÙÚơêå̉ ÛÇ™Á·‡‘×8çߌÛ,‰¼χ±̉¹»«·3uU™ëéå«Ô…àÇÛÏÔÛƠ‡åÖ©ÀɇăˆŸ̀ĂæÚ‚v˹ƒ¾‘߈ \ù×›¾ü¿9¥‡Áäåô°»Û×½©ºăê©ÓºÏÅɇß»û©Ç­Øâˆ:½€ÏÔăˆŸ;߈ÔX‹Ç­Ä߈߈«‡“ÍjÏÔ£äÀ“‘Ûá=߈Ơ±»ù×ĂÈ‚vĂÙÛ«‚ ½9å*ù׸ڱ”£ä§ÓưÀ÷‡ẲÏÄñÓåĂáµØ̃ˆƼ£Çù×ăˆŸ;Ÿ\¼ĂĂĂÖ÷‡ĐÓ™‰kß [ïSù×Û×ÅØëöù×÷ÔçڜԘêèä«ÑíÚÏÔÅù×¾ç'đÔ…Ơù×”ƒvëÔ³zơÔù¿ÓØÙ½·£­Ô—¶ăà‚vá æºÔXù×±»ù×ÁƯû(»½÷ÔĂÓº±¿ƠÙ½߈‡éê×Ơ†7§j°»—ˆÑÓ£Xƒv­Ø“ƠưÀ÷Ùâ½Û«‚ ½9¾Ÿˆ£Ç»Ø±ëØùׇºÛ×âˆ:©ˆ¹ÚÇ»Á‹ÏÔ­Rív‘¾Óà¡Û¹ÚÎÅ«‡“Íj“¹ƯNÏÔ«Ó™‰kß [ïSñƠåôª‡’̀j‹Ç¨Ơ±½€ƒ®Ôûèơ꫇“Íj̉ؽô‹!·Ô´†›ÛÙ½«Ô¿́©•±Ô•ÏŋܶÀ̉‡Œ£Ø·‡‘×8çרí˽¡Ôù×ơê‡ÚÙ½ô½áꙉkß [ïSÏÅ߈ÄÓóĂƯ‰Ó*•ƠăêƠăêĐÄê÷Áëö¹à™‰kß [ïS™‰kß [ïS›¡ơêó^ëĂĂÜÚ˜‡§ÔûÜÛׇÇơêØÙÚ߈߈¤ÓÇÓ“¼߈™‰kß [ïS›¾ù`ËÉ9Úª‚ +¼9ÏÔÖ$±»ơêƒvßÖ×̉Ơ¿ôơÄ߈­Ô…»ÛÀ¯×ÏÔ§Ô«‡“Íj‡º߈ơĂĂÙóÇÉƠXÅÔ‹ÇỂÛ«‚ ½9ÇÓ°»×£êöƒv‹È—»½µØÙ½›¶é™‹ÁĂ—ư›éº¹Ú£Ư½†Œ + + +ÙÚˆ§đÁ‡é/×:ëö¼±»‘±ÁÛô߈¹ÚñÓ—¾¿‰ưêÂÙ‹ÇÁỮÁ›Ú§›Ÿ}Ù½·ÅĂȾٌë*«ׯ¾º «‡“ÍjƒÔ‹Áܱ»߈gçƯº…زƠăˆŸ;kêöù¿À¹;óÄêö«‡“ÍjµŽщ¹ÚíÆ«‡“ÍjÅØÏ̉«·3uUÙ̉ăˆŸÅӣصØù׫Úù¼ăˆŸ­ ¡Á±»­Ö߈Ù½¿ß»Á׿8¹Úêé§ô¿‰ø×ơº߈™‰kß [ïS‰Ơ‰¿I«‡“Íj­½¼ù×¿è¶  å̉ ±ëØưÀ߈ª»­Ö߈߈ơÔ˜‰j̃ZîS†Ç9¥‡ÅàÏÔËÇ¿ôÏÔ¹Ú£‡éÓ·‡‘×8ç·Øáꙉkß [ïSÍÓ«‡“Íj£ä‘ÚËóö½ÍË)éÛ9¥éÓưÀ˜êèäܽĂÛÄÓóöÁ9¥‡ +ăˆŸ;ăˆŸ;©¼«)çôơê߈Ö¼Û׃v°»Ù½›¾¨Ơ¾«ÔíêÇÖÅØ—²¹ÚơØÑÄëßÄÙưÁ·ÔÎŧàơêƒåŒ¿N¸Úß»ûăˆŸ½€ÔXRï½ơê¢ÈÛ«‚ ½9½åô9¥‡ªÚ£ä¹Ú™‰kß [ïSÏĽâƠ¥ˆ]1ßÁƒ½«‡“ÍjÙ׫‡“ÍjÙÅëø¿ ÈÙ½ÏỐØăˆŸ;k÷ÁÁĂù×߈…Ơß»û§Ôª‡’̀j£ùêóÇù×ơèŸÚ׿8ÓÁëö–¶ƒvÛ«‚ ½9ßÄÙ±»½€Ù½ÙÚ½€óÇíêûÓßÄÙù×Óº½™‰kß [ïS›¹Óº»Ă޳ÆùפÆÛ×»ÁÏ̉«)º™ơ߈Ợ“Ở¡Èé¾ÔX‹Ç¡Áù×·‹½¤¾ëöù×ăˆŸ߈߈ƒçÚ¿ôÏ̉×Û߈½¾‡ưÀ¡ÔÉ̉ăˆŸƒvÓØÇØ‡Ç¿‰ơê…»³ØùבÆ߈Áƒ±î»‚Ú'ÏÔ‚½ø×ñÚƒv§ô•%߈ƒvÙ½ÅñÖŸ«»₫®¶ăˆŸ;ÂÙ¼Ă‰Û½À‡€è/Ö:éºѶüÀơ»±Ü½óÂÏ̉ëÄ…Ơö›¾̃ŒÚ,¿‰Æ£‡™‰kß [ïS«ívÏÅ×ÓăˆŸÛö߈G½¹ǽÙ½«‡“ÍjÏ|ÓºóÂ8¤‡×¹ÚăˆŸ;kÙ×ǽˆÛ«â9¥‡«‡“Íj9¥‡ăà¶½€™‰kß [ïS»߈ù×ÏÅÙ×߈•‹H«‡“Íjá ç'åÁơÔÓØ¿»Û«‚ ½9ÅèŽù×™‰kß [ïSăˆŸ¿‰ƒ߈¶ÔÚª‚ +¼9©)«‡“Íj±»±»÷Úÿ¯¶ù×ơº˜‰j̃ZîSĂÙù×ûجÖíÚ©‡¥2ßëMÍÓù×¥‰ÍL…ÑÅŽ¦ô©¼ÍË)éÛ9¥ëöºØ‡ƠÅĂûỢĂ™ÓÅÓăỡ̉½ăˆŸ;Û«‚ ½9ׯéêơèů¼Ûǥ؇Œíơ—ºï9¥‡×ăˆŸ;k¾Ăæ̉¿‰Ó̉Ÿ ăˆŸ»‡9¥‡χăê9¥‡«Ô¹ÚñÚû(ÅØù×½÷ˆăˆŸù×½ÙÚçô·‡‘×8ç÷Ú½ô«‡“Íj“ß‹Üá ƒw›¶é™‰kß [ïSùשØÙÚ‹ë¶Ốv¿‰ÏÔ²º̣çÚéB«‡“ÍjÆăàûÖĂĂ ›­±àéM߈ù׃v°»­Ä½Ô9¥‡ºëÔÿÛÍƠ½ùê‡ÛƠö±»ăºщï»óĂ™sÄÓ‚v‡ÇÖÆå̉ Ñđ×¾çÚ‡ÚßÖĂĂÙ̉±»ư8£äÓ̉Û«‚ ½9º¯Û€º¥ˆ]1ÓºϺù×’·›vëÔđÓöåêÖù×ư“©ÓÂÈóàëöÇÖƒÖơèÅ÷Á–¶›Ăùô8 +¤‡ +×£Ç÷‡ƒêÙ̉ÅÓÿÚÑĂà=ÿ×éêăÁ¿Å“Ç߽麤ˆ\0³·Ô›¾À¼‚¿ÀÿÇÙŒë*«ëöôÍÓÁĂƒØ™ôÁ̉º±́›¾ÍÄñ~¡\±»óÓƒˆ™‰kß [ïSÓÅ߈߈ÍË)éÛ9¥Äô¶Ô(ưÀ…6‰Û©Ó¤&˜ơ­‹Ë1©¼â÷Á߈ÙÅëÆö±»±»§ØÉƯߌÛ,󫇓Íj±»¡ÔäÁ¡Ô ׌›¡Û«‚ ½9߈¥ˆ]1±»ÎÅëö9¥‡ăˆŸ;£Ç‡Œ‡Ÿ}™‹ñÖáđØÓ܈ƒÔơèŃvăˆŸ;‹È0«‡“ÍjÅ«Ñ9¥‡×ëö·‡‘×8çưÀ¶ăÂÏ̉ºëö¿‰åÁºqÍĹñÍÇÏÔăˆŸ;ưÀÑÓ±»߈Á‡¥ØÛ«‚ ½9ƒˆÙÚÑøÚ߈ư­ÍË)éÛ9¥Ç"«‡“ÍjÏÔ«‡“Íj÷Á½ÔÛ«‚ ½9ó÷Á7¹Úÿ‡щ±»³¨ÜƒvỞăˆŸ;±»·‡‘×8çăˆŸ;k—§Í»«øƒvñÖù×¶ÔÙYíÚÇÖÏÔº„Ç Ç¼Û«‚ ½9¹Ú×Â߈¡Ơ´ñÓÓ×ĂÙ™‰kß [ïSÁ«‡“Íj¹Ú‰¿IÑÄëËƠ߈«Ô‹Ü½â··§D ¾Ø,»Ă³€¾Ø÷ÁÏ̉½ƠÚÿ§éÔ‘Ö•ơ꺽é(Ïšȇ³ÈÁ‡é/×:ßøÇÖ麧ӃăàÚ×åÁưÀíjăˆŸµ•רăˆŸ;™‰kß [ïSÁ̉ƯÓ ́½Û«‚ ½9™‰kß [ïSơ¹Ú›Ê߈§—Ïăv±»ÅàöÄô…Ç•Ç̀Ăäô ƒˆ­7‡Œù×߈‹Ç¡Ô§Ô߈©Ó¡ÔµØ©‡¥2ßëMÔX›v³ Ûº½µ†ÿÂ÷ÔÓÔÛ«‚ ½9±»ñÚªÚ.•îơĂ±ëØ±¿ë÷ÁÔơ’½«‡“ÍjăˆŸ·“¿ºơĂù׃ַ§D íê¾±»œÁ¯¼‡ŒϹåăÑÓ™‰kß [ïS¦Æ¿ØăàĂÙ›Ă«·3uUƒà—¶ï»™‰kß [ïS₫ÇƠ·¼Í7Ç̉ÍÄǺ˜È©Ü÷Á«Ô×Ó‡“ËÎÔÛ«‚ ½9ă»߈½‚vóÂëö±»߈¹Ú·Å߈¡ÛñÚÙŒë*«®ÓívË%ù×ÿÛ«‡“ÍjƠXïdôîDăÁÁû"ăˆŸ;ƯÏįƒ« +>ƒØÚª‚ +¼9߈߈‡Çÿ¯¶«‡“Íjå̉ ™‡¦ÔÏ̉½ơêÛ«‚ ½9§ô»©§Ô±»¡ÔnÛ«‚ ½9ͺç½߈³ºó¥º¹óרđÓ̀Ê)èÛ8¤ăˆŸ÷‡·‡‘×8çù¿ÿÚăî—Œ̃ˆ¶ÏÔ‰º¹Ú‡ÛöĂÙÓºËÉ9µØ™‰kß [ïSËƠɹ¾Û«‚ ½9ƯÓ ăàÍÓ©Ç©¼ñÎ̉ ï»å×›¶é÷ˆá=ÿÚ™‰kß [ïSÅÓ½|¹Ú߈ƒvßÄÙ˜ÁívºËƠÏÔơÔù×̀Óù×—¶‘µ†ÏÔÛ«‚ ½9ô«̃ù×ËÇ™‰kß [ïSù×÷‡߈ŸƠô‡º¡ÔăˆŸâêƒvưˆăˆŸ;k÷Á™‡ƯÓ ߈Û«‚ ½9ƒàƠXÙÚ˜ ê è ä ỞëöÏ̉Û«‚ ½9ö„«‡“ÍjÄĂÛÆƒv—µ¹ÚÍӣ؋ÜƠ…ÖÏÅ«‡“Íjëö©‡¥2ßëMÍÇ¡ÁÛ«‚ ½9¿Å¨‡¤2€̃êLĂÅ´ÅñÓ…»ĂÙÓ̉™ëéåø×üÁ³ ½ĂÈÉ̉ùê¡ÛíçăˆŸ—¶źëÚ×ÓÙÚßÄÙ¾×±́ưÀù×߈³Âù×Á››ͼÏÔăˆŸ«Ñ™‰kß [ïSÁ߈µØùê±Ô½ßÚéê§Ö—»¾˜‰j̃ZîSÛ«‚ ½9±»U­ÖĐæ«‡“ÍjÙÚăàñÚùê±»©ÓÚª‚ +¼9½€ÓÏơêÁÙ½ƒ×Ă¼¡Û½áƠÑ؇ÁƯĂô ¶Ô ÅØĂÙ¿‰ñÓ̀° +êØ +§ôÿ¯¶£äƠơÚº­¶¤È·‡‘×8çñÓö¯½½ÓÓ̃„ơê±»ĂÙ°»Û×̃»úÙ×ăˆŸº¸Ú%¯ÈÂÙ½ÎÅËÉ9ÅÓ“¹ƯN±»ñÚÅ₫®¶ëö߈ͼñ¿ÿ¯¶°ÈùוÈû›™‰kß [ïSÁ¼ëöỂ釥‰ÍL…«‡“Íj›¾Ơ +¥ÜÚ×£ä‹ÓÏÄåĂרăˆŸ±»ù×¾Ç÷›¾üÀëö›¶é‰î¡é‡Œ·Å ɇ‡Û̃ˆôº—Ø‰îµØ±»‹Çµ†±»Ù½£ä§à»Øñƺ̣Çá=™‰kß [ïSÏÄÁ̉ÏÔ‚½ƒƯ¹ÈµØµØÙ½Ó̉ùë±ƯÁĂăˆŸ;´½‚ăˆŸ;ưÀ¹Ú½ôù×·‡‘×8ç8¤‡Á‡é/×:ûƠÙ½ÅÍÛ«‡“Íj‹Ç߈ÂĂÙÅëÑĂ¯¾Ù׃Ö߈•½±»å̉ —»ƒvëœÙÚ®¾éÓ±»ĂôÛ×Ù̉óÛ«‚ ½9ù×ù×шÏÉ̉ÉÇơêë˜Hؽñ‡Û«‚ ½9°»ÓµØÿÚ½ßqÂơÔ­½¼­’ÿ¯¶ƒˆ…ÛÁ¹ăàơºĂÖ§Ó½!áßơêăˆŸ;ăà±»‡ÇÓºÑÓ³ºóµØ¡%¦Ôé·«‡“Íj±»³¹±»ÏÏÔ›¾ÑÅăơöă»™‰kß [ïS¹Ú™‰kß [ïS·Ôù×½ÏÔÑÄëëöơÔ¿sưÀÂÙà̉‡x±«Ô߈ƠØ×ù×ÙÅëÊ%™‰kß [ïS“ÈßƯ¾»ÿ¯¶߈¡Ø¹¶ôêÏĹڧԵ.¥ÙñÓÅÔù×™‰kß [ïS¹ÚëöÛÙÚ¿èç·È£äó~ÔºăÇíëÓÛ׫ԇщÇ%ËÇÛ«‚ ½9Û«‚ ½9Á»Å“ܽ€½³Ç¤Û·¸ơÄÁ‡é/×:Ï̉›¾™‰kß [ïS¥ñƯÓ ́½™Ôå»ăˆŸ¾ØíÙß»ûëöÙ½ƒvù×ׯËևǭģÈóÖơÔûƠ«‡“Íj߈Y¿ßɇùףس­Äăơø×ù¿—¾›¾™ëéåÚÀ ¬ÖÑÄëíÚ²”Ă ‚v½ÔÚÏÙ—¶±»›¾8¤‡™‡§ơó¶ÏÔăˆŸ9¥‡²Øé¼ăÔÁƯ¼ƒv¯G‹øÙ©¼¼ÈËÇó¶£ÓÚ9¥‡™Ôû̉·Ô«‡“Íj£ä³Èß»û™‰kß [ïS›¶é±»ŸÖƒÚëö½˜ÓÄÓƠ­vçÚÏÔơèŘêèäív×Ơ£Ø©ƠĂƒváêóÔ¹£‰½ë́™×ŸÖ×ĂăˆŸ;™ÔǺщ½€ăˆŸ¯×đÁưÀŸÈÛƯÙ½™ëéå±»ÙưÜÏÔ·ÅăˆŸ•Œ…n•ÖơÔơêå¿«ÔÁ‡é/×:ăˆŸ;µØ·‡‘×8çï³2çÚơèÅăˆŸ;óÔ“±ÁÙÙ½ëöƒvº½Ùگ鱻©Óˆ§ƠƠä̉ÏÔÛ«‚ ½9ëöÏ!íÙ½•Èû›ÓŽăÇí¹ÚµØÏÔăˆŸ;kăˆŸ;ơÔÁ¾ăˆŸÛ«‚ ½9₫®¶ÏÅçÚ“ƠÿÛƠî·‡‘×8çûb™‰kß [ïSùêçڋǽÈÓÓ™ÓÂׯ÷ÁœÂ߈·¼Í7½€±”§ˆăˆŸ;›¹­Ôƒ×ÏÄÍÓµØÇÖùºÎÔËÓù×±»âÂ3ơêôŸ‡ûƠăƠ¼«‡“ÍjăˆŸ;‹Èÿ¯¶‹Ăù×ù×ÑÓăˆŸ;ñÖÇâëọ̈Ç»›¾Û«‚ ½9߈¬ÖăˆŸ¥ÓÓÆ±»ÿÚμ_ß™¿‰¹Úíê‡ïø¼€§Ô˜ôÏǺvÛºÍĺ±”¹Ø›¶é¥‰ÍL…·Ó ¥0Ûׯ¼߈ŸÅù×߈—ŒÑÓƒv­ÄÿÛÅØµí÷ÁÛ«‚ ½9ÅÓ«Ôøê4ÍÇ8¤‡·Ü¹Úđ÷‡̃ˆËÉ9Û«‚ ½9º¡€©Ó¸ÚÁƯÉµØø×¾ûƠµ¯Û«‚ ½9ºëö°Ô·ô“È™ëéå¾·‡‘×8ç‹æÏÅăºϹÙÚåĂ‘—ßđ̣¶–»·‡‘×8çƠ´ôÛ«‚ ½9߈߈ëöẳƠ«‡“Íj™‰kß [ïSƯăˆŸ;–½÷ÁơĂÙŒë*«å̉ ÛÄÓ¹ÚưÀå̉ ¹Úï¶ÿ̃‹’ù×¼¹ÚÓºĂÙßÁ¦ÓÑĂ«‡“ÍjơꇫÔÑÄë÷̉ư¦‡ñ5åÁ«÷˜êè䱘êèäĂÈÙÚ·ÅăơÓØ—¶9¥‡ưÀºÿÚ9¥‡ÎñÓèÓéëÇ>ôÁõØß»û±»ßÄÙ߈߈ׯÂ÷Á̀Ó“ƠºåĂăàÓÆщÂÙ±»í‡“ƠÙ½±»Áº±»·‡‘×8çíÆâḈ½±»Ö¾ŒºăÇí÷ÙÙ±ƒ«‡“Íj£»¯È±»»ØăˆŸ;ñÓÿÚóÖơệĂ›¾ưÀ½…€­:Ù×ó„ÙŒë*«ơꙉkß [ïSÚ×"«‡“Íj¹ ù×ÙÚÛ«‚ ½9ÏŽÂÙÛ«‚ ½9Ç»ĂÙù×÷4߈»Ø™‰kß [ïSëöƠí—Gù¡¦́ +Û«‚ ½9½©ÓÓ ‹›æ©‡¥2ßëMă»ù×ñíÈưˆÓ¾́½ºØÑóơ|‹Ü㬸Úư“¯G‹ø̀ÓăˆŸ;ñÓù×çÆ̃ˆêơ‡º÷ÙÜưÁơêÿ¯¶°½ ³ÍÄŽáê©Ç›¾߈±»Ă±»™‰kß [ïSă홉kß [ïSäô@ñà‰—¶Ô采Œ™ÔµØ«­¿ùå—ˆƒ½Ù½©Ó߈セ뙉kß [ïS·Ü£Øµæ¥‰ÍL…ù×߈÷Á«‡“ÍjÑæăˆŸ;ï×ơÔ%¼Ă÷ˆù×ùêâ¼ +Ž߈Î̉ÏỒÛ×ÏÚ¹ÚÑÓÛºăྉ¿I›·ÔÙÚÆØ8;¤‡;Ö ñÖÁ¼8¤‡×Û×À¹³ÈêÓ—¶9¥‡¡Á»ˆ©ˆ•Èû›öÔ×§…ÇÛºÅà¬È ¡ÈơĂ«Ô߈̉ºß»ûÿÛ­ơÁ‡é/×:ٲѷ‚vơÔíØÏÅùסÈÛ«‚ ½9̀Ó½€ăàƠÁ†ÇÁ˜‰j̃ZîSï½¾º­Ä¶¾₫Ú±»¿‰Û×½…ØñÚÁĂÁĂƒˆ§È¨"˜êèä‹ÇÉơ$ÏÄöÁĂÙ¹ÚăˆŸ;âºÛ«‚ ½9áÛñÚÑÓÙŒë*«‡ñ5½€ö†»ÙŒë*«—»ù×ív½€ÓØÏÔ“á‡Û«‚ ½9ׯ»~¯¾ƠëöÖÔ†6¦jóÔË́å»ĂƠñÓëöѦ8¤‡×ơƯù¿×+ß»ûÛÿÛÑÓ™Ó¦¼߈Û׳‹Ù½€ÇáØ«·3uU½±»߈§ÔÑíØ°»ăơăˆŸ;Û«‚ ½9«»Ž¯×ö»‡›¾ô¿¼‹Ç߈Ù½ëöÅÏÔÿ§«‡“ÍjÉ»Ơ±)Û«‚ ½9ׯ°½߈ÙÚ½Ǻ庽؛¡½ŒÏÅ¥ºÆ¯¾ëöË̉Ï̉ù×ñÖưÀåĂ›¾÷Á¿‰áÅăˆŸ‹ÜÁÙƒØшß»û‰ºÛºÓÅÏ̉ÇÜơؾß߈±»˜ơÎÅÛ«‚ ½9ĂÙÍĂÀ½ăà™à́ơÛ«‚ ½9Ñ·ÚÀ‡xñ»÷Áù×ËÇ™ôăˆŸăˆŸÉ̉ÙƠ£ä“ȹÚĂôô‹ÜŽÙ½÷‡áӭ؃v­ÖăˆŸ;™ÔÙµ‰ôĂÑÓ—ë¿­Ó¾©‡¥2ßëMưÀëöÛ«‚ ½9™ÓăàÚª‚ +¼9ơÄÛêÏÔ«·3uUáÅÉ̉߈§Øù׫♂ж÷‡ÅÉ«‡“Íjùףǿط›¾±»ñӗꩇ¥2ßëMßÄÙ8 ¤‡ Ù½±¿„ÇÍÓÅ¨È +Ăôß»ûÛºĂÙÏŧÓâÁ—Ú9¥‡Ơºmü̉ĂÙ“ÆÛÄÓÑĂ•³Ơ±¿ăˆŸ¯ÔÏÄùơß»ûù×½Ă™‰kß [ïSÏÅÏÅ›¾ÁƯ¨‡¤2€̃êLí—GÅÓèêÅÔĂ¡ÛçÚåô£ä°»Á¹ËÖ±½›¶é¹Ú½™‰kß [ïSÅô—Ó“ƠÛ׿ØÀ½Ù-É̉Ù×¥Æù׿‰…»ǽ÷ÁƠÁ½«‡“ÍjưÀơĂçÚù׺½Ù½™ơå̉ Ïřɽ€ăˆŸ;᫇“Íjö±»ăˆŸ;k›¶é¤Ç›v¿‰ưÜĂĂƒØØ©Ơövß»ûĂƠđÓ§ÓÛº߈µØƒvꙉkß [ïS9¥‡÷ÁƒvôׯóăˆŸË¿…¾‡ñ5ëßéê߈ß»û«Ô«‡“ÍjÛ«‚ ½9ĂÈÿ¯¶9¥‡ùסԫ&±»•ŒÏÔÑÓŸÖÏÔíÖÿÚÑÓƠÁëƠÁ¹ÚôĂÿÚéÚ½¹ÚÏÔ½€Ù½÷4‡£Ç‹Èù×ăÄ߈Ÿ}ó±»ÂĂÛ«‚ ½9ơر»™‰kß [ïS¥ˆ]19¥‡ù×ưÀ©Ç‚v±óˆÙÚôÏÔăˆŸ;kăˆŸĂٸřôăêăˆŸ;Û«‚ ½9»đÙÚå̉ ߈«‡“ÍjÁ›¶éÏ߈êö±»μÏÔ™‰kß [ïS½ßô§Ô8¤‡ơÔĂƠŸ4ö±½ÍÄ—»°ÀéơƒàưÀÁѶ«Ô©Ă÷ÍÄ¿‰Á‡é/×:…%«‡“ÍjçØ«‡“ÍjÙÚù×ăˆŸ›¶é‰Á«‡“Íjÿ§£@Çá©À߈Ùگ׃֘‰ j ̃    Z îS à ‡Œù×¶¶è¶ù¿ñÚĂÙ­ÄÀ¹û(§Ô…©¼«·3uU§ÓË¿ÇÖÙ½ùæØ̉RḯÏÔɇø¾ Ëû8¤‡…ô™”ÙÚóÇÑÓ˜ơưÀɇÓØö­Ô™ÓăˆŸ;ˆÚ×°»ơêׯχ­ˆưÀ§ÓĂÏÄửÓëö‡ŒçÚÍË)éÛ9¥‰¿IÚª‚ +¼9í—G™ëéåÏ̉¹ÚÛÇϼÁƯƒˆ½Ă«‡“ÍjºͲ˹µØ“ƠüÁ§Ô׿8«d·‡‘×8çÿ¯¶™‰kß [ïSÁƯ¿Ø±)Û«‚ ½9¾ôơê“Èív¹Ú߈™Ó̀ø¬Høăơ߈¸ÚÍÓĂóĂĂ ›­±àéMÅØĂºµƠÄÓÛÄÓ¶  ™‰kß [ïS†åù×ĂÆÿ¯¶ù×Ë̉ÅÓĂÖ—öơ$ÑÄëó¹ÙÜÅØÛ×½ù×Ù½ê¼ÓعÚ÷Á¥ÛÛ«‚ ½9½×ÛÄ߈ëöÛ«‚ ½9©‡¥2ßëMíºÚª‚ +¼9«›́ơ ơı»±»Èù×ăơ½¾‡ÿ¯¶ÓÆÏÔÛ½™‰kß [ïS§ÔëöƯ ߈±»ùæ߈¥Øù×ƠXÁ÷ÁÓÅ£ÇÎÏÔ°»ƠÄó)½ƒù×óǣ؇ºñÓ±»÷‡Û«‚ ½9ăˆŸ;ơ»‡º߈ßÓ·ÅÑÄë©Ó§‘©ÅģǩÓÿ¯¶Ó¾Ï¿ƒæ¿ỒUĂƠÖÛ׫‡“ÍjĂÎÔ½€ùô™ÔñÚ¶èËÛ™‰kß [ïSưÀÿ¯¶•÷Ú߈™ơ¡»‹‚«âưĂ߈¡ÛÍÓ›¾ɹ›¡°»‹Üù×Ü™Á™‰kß [ïSỞ£ä߈ă½ăơ›¶é›·ÔùêÀ߈́ơ +±»½ǺÇëöơÔ¿‰ÓƭĻŰ»ù׫ÔăÁûßÚ½¼ƠX•̉«‡“ÍjÙ×ăˆŸăˆŸ©‡¥2ßëMƠÓÅÿ+È»ơéÏÔ±»Å ƒ½ÅÓ›¹‚v éêß»ûùêóÿÚ·‡‘×8ç¹Ú»µ›ºÛ«‚ ½9Àö—Óû‹Æ߈¹Ú¡È ËûÛ«‚ ½9́ÁĂëöÏų”ăˆŸ;­½¼ăˆŸ;ëöÇ÷Á—¾à ÏÁ‡é/×:ÿ¯¶9¥‡×Ù½ñÁ‹ÜXăˆŸ;k‚¾åôÿ¯¶ñÖÎÔëÔ‹ÇùØ·Ô†Ç₫Û9¥‡ÅØÏ̉߈ơèÅ̀Ă•ŒüÚ«‡“Íj“׫ԩ‡¥2ßëM½€˜‰j̃ZîS€Ç ߈©ÄÑÄëÁ¹‹Ç›¾ï»¦.Ă™‰kß [ïS‡ºá¹ÚñÓÅ͇Ö8æÏÔ§Ô«‡“Íjàê×Ơ«·3uU™Ó‰̉ºÛ«‚ ½9ĂÙ×ƠµØ«Ô·Ô‹É0Ϲٽٽ›¾Ùƒă¡Ô¡ÓăˆŸ¾ÏÔ»½Îƒv8¤‡ÙרÚêö­ÄƒàùסÛ߈˜êèäăĂù׳ºóÓÔ½›ÛźƒvÇÓăˆŸ;«‡“Íjù×Í÷á$«d©ØĂèƒÙÚ¿‰߈ÍË)éÛ9¥ÀË×$çÚëöêÔáƯˆĂϼ¯G‹øù×£»ÍÇÅÓÓÆ™‰kß [ïS߈éôÙÚù×µØ9¥‡¡Á«ââ»ÉÔơħÈϼƠƒˆÙ°»ëö÷ˆÑÓ±»߈Ûº‡Úív«Ô߈∃vÛ»÷Á›vƒ¾‘‡9¥‡ÏÔ“Ơ­¿ÓŃvƒÚÀĂ ›Ơ™‰kß [ïS½ơê­ÄӴܸ»ÅØü‡°ø1’¼åÁđÓçÚÏÔ‡ºø×ÏÔèơ—¶ƒv­’Á̉ù׫ÔÏ̉ÏÅĂÙå"ưÀ«‡“Íj‡ÛàĂ׿8ï»ÁĂÏÔº¤º‡×‹Ü±»ơ»Ó̉Ú™‡£Ô§•ÖơèÅ«‡“Íjш£ÊÓºŸè¸ÚÛºÛÇ«·3uU±»ĂÙµØăˆŸŸ}°»¿ÅưÀóÂƠÄÚª‚ +¼9߈µa÷ˆ«‡“Íj½€Ư‰߈±»›¡ƒ±»ÏŇx±ÀÛ«‚ ½9™Ûƒˆï½˜‰j̃ZîS߈º…ÚÏÅƠÚ¥ŸăˆŸÑÄë÷¶ÙÁ–ívÄÓƒÖ›¾ù‡çñÆù¾êÓ½ÔăˆŸ;kÙڵ؉¿IñÖ§Óơèʼn¿I™‰kß [ïS¿ô§ÓÏÔº±»«»ù×Ù×ÙÙ½ơÔÛÀóÂĂƒúvßÄÙ₫ĂÈœÓÙ×™Ă·ÔƒvÚÀ°»±»ăÇí•×çÚÔX ׃ÿ¯¶ÿÚ̀Ó«‡“Íj‚د¾¡ÔÏÅùơÇ̉Ơé×£ÇƠX¿½¼½‡B¡Á©Ó•ׄöÁ‡é/×:ÙƠ”DZ»₫«»³Ø§êö9¥‡„‡ÚơĂÆ³Ú¦Ô³ôçÚå×ôêĂÙ罩¼ÑĂáÛßÄÙ±»¹ŸËÇ™‡߈«»ÏÅ©¼ÁÖĂ¡™‰kß [ïSíÁƒ¾‘™‰kß [ïSÚª‚ +¼9Û«‚ ½9èô°»©¼˪ÂÙñÓù×ªÚ ù×—¾Ở߈Ù½ù×Óµ±»̉ˆ”=ô€ºº½³ºóå׿۫‚ ½9Û«‚ ½9ßÄÙû9¥‡×¹ÚÊÖåÁëöă»ÏÔ߈éú«‡“Íj– ù×ù×·§D ß»û½ôÿÚÛ«‚ ½9߈½Ù½ơêÏÔùׇ۹ڋѾ̃ÄØÁ̉¯È‹Ù­ÄÏ̉ψ«‡“ÍjÈđ½ö«ºĂÈ9¥‡ä̉  ­Ùº­Ô­Ö‹Ç€ºÛ«‚ ½9­ôÛÀß»û±»µ‰ËÔÓØ›¾ÏÔ£Ơ߈€Ă¤ˆ\0ù׎óÓׯº½ ߈½ÅnÅ÷Á8¤‡Öù׫‡“Íj“Èщëö™‡%ŸÖÁ̉™Ô‡ŒÙ½ƒvÙÚ±¿Úª‚ +¼9™‰kß [ïSùå Ëû«‡“ÍjµØŸĂ¼½€™‰kß [ïSñÚÏŽơØ™‰kß [ïS°»ÇÖ“¹ƯNľ¡ƠÏ¥ÛÓÔù×ö™ÁăˆŸ;ưÀ¹Ô«Ú×¾‡ºÏÔÙ×Û«‚ ½9çÚ߈ׯÇÖƠćƒv“È›¾¹½ÿ§å̉ Û«‚ ½9ËÉ9Ÿß±»¥Å‹ÙÍÄ$ăê­¾ăˆŸ;k˜êèäöô¡Û«‚ ½9ù×÷Á«dñÓÛ«‚ ½9‹ÙÙ½ψùêÇ#éü°»µØËÇ߈ù×çÚ©Ø­ÖĂº±»«·3uU«‡“Íjͽù×߈Ÿ€ª́ÏÔĂƠ¡Áơ…Ù-Û«‚ ½9߈ÆØơƠæ̉›¾ăÏÅêöÙ½±»ăˆŸÑÄëµÁºù×ٽϞßưˆ±¿ö¹Úvöù׫ԽĂÏÔù×ÓĂÙñÖÚª‚ +¼9¥‰ÍL…ăàçÚ̀Ó«‡“Íj¿»Ø×ÏÅô›ĂĂÙÛ«‚ ½9ƯûÓ‹Ü‚v·#ăˆŸ;ăˆŸ;ÓÆÛ«‚ ½9ƠơèÅ߈ñƺƒ¾‘©ÓÙ½‹ÇÆvÂÍÖ¿ƒvù×ÅÔ«‡“Íj±»Ù̉éêÏħ©Ó‡“™‰kß [ïSË̉ù׫ ©ƒ»5Û«‚ ½9‹Ç§ƠÏÔ™‰kß [ïSä¼Ô«Ô¥ÆƠXÜÂÙà¿ô™‡«»“Æí~½çm«Ô½Ôǽ¹Ø½Ô½€ÑÓÿ§ëöÏÔÅØæº¿»Û×ƠXăˆŸóÇÛ«‚ ½9ù×½çÚ¡ơèÅ“ÆÛ«‚ ½9·Å9¥‡½€ÏÔóÇù׳Â퇵†÷Ôï³2ÿ§ÓăˆŸ;«'µØ¡È¥àº·Ô8¤‡‚ˆ«Ó‹àªÚçÚá ±»ăˆŸăà‘ÆƠ¬Ô÷ÁÛ«‚ ½9¯+½Áă­|ăˆŸ;ö¶…Ơ—ˆû(ív‡ÇçÚª‡’̀jăˆŸ;™‰kß [ïSÿÚ¦߈‡ÇÁ̉Íëö±»›¾ï˜¯È±»¹ÚÁÜơ·ºÏÅôê‡ñ5·ºgÅÓƯºăˆŸ;™‰kß [ïS½€½€đơé‹ÛëöÛ«‚ ½9ĂƠǵط‡‘×8癉kß [ïSÙYƒví¾ßÛ«‚ ½9ù×9¥‡¾«‡“Íj»ØÛ«‚ ½9¾» +ÏÅív™Ó KĂÖï½ÏÔ¶º"ëÓ±¿º½å¡ÓÓ‚v¿‰ç¡ÁׯñÆÅØ₫®¶ívÿÚ½Ô±»™‰kß [ïS߈ëö–ˆ™‡ÏÅ£ƯÍ™ºù×ÍÓ³ ÉíÆÿׯ¯¼«‡“Íjăà¡ÓáĂÓ¾›¾‹ÜÏÅ‹Èÿ¯¶ñÖ™Ô‡“ˆ«‡“Íj€*±»›Úºy§ô¥È¼ơèű»™‰kß [ïS÷Áëö¿*ÏÔƯÓ çơÔï»ÇÖăr·̃«‡“Íj³¹ô˜‰j̃ZîS«‡“ÍjºÁ̉₫Û÷ÁăˆŸ;Ù½‚Ö͘¿ßÿ¯¶ôêèºưÁ†º9¥‡߈¡ÈưÀÛ«‚ ½9ÁĂÿ¯¶Úª‚ +¼9åÁÚª‚ +¼9߈÷Ô¯‰¯0߈°½«‡“ÍjÛï­Öö«ÔÀÁ«ƒ½ëBÁĂƠ9¥‡ÓØ—¶£äÑ·ù×ÙÚ½È߈Ă½Å½·Ô“ƠƠÚ·‡‘×8ç›¶é£Ø߈ÓĐׯ¡Ư¥Ư×Ó¹Ú«‡“Íjù¿ư晉kß [ïSµØ9¥‡˜‰j̃ZîSơê߈Á½ˆØơºÛ̃¾ÙƠÜ™‰kß [ïS߈ŸÅ©Ó̀Ê)èÛ8¤₫Úª‚ +¼9ÓÓƒvÙ½«ÔÛÀÙ½¡Èå̉ ô•Èû›ĂÅÄù׫‡“Íj½×Ă½ŒÙÚ‚v½áêÁƯ«‡“ÍjÏÅ›¶é¹¨ƒ¾‘Û×Äô›vÚÚÏÅÁƯ…ö‡Œƒv±“º̣̃ö₫½ÑÓĂĂù×Ëäï»ÛÄÓÏ̉½¾‡×¿8ăà¿Ô™Ó½÷‡ƯÙÚ8¤‡¥Ư«ÔÏÅ÷ÁÙ½ÓØ¡Ô«·3uUăˆŸƒv»‹¿ộ߈ßÄÙÏ̉ù×í—G±”áØßpăˆŸ;ỞÛºĂù×₫‡¿Åăê“ÈïÚÓ¼§ÖåĂƒÖ¹Ú˜àëÔËÅăˆŸÙ½8¤‡Ö»y™‰kß [ïSÏÔÉÖ»ø»ØăˆŸ;½ô¯È§Ôëö£ØăˆŸ;ÍÓ›ÚÖ“‰3Ơ,ùÇ̉߈™‰kß [ïSéê÷Á›¾ƯÚñÆ•‰ÆáÚëÓÛ«‚ ½9߈›¾ù×Ù½Ơ×ẳ¿‰ÏÅùêµ.¥ÙÉñĂºăˆŸ;ÑóÏÔëö›¾›¾߈ăˆŸ;úĂ½™ëéåëöƯÁäÔHÍƠ«‡“Íjû «Ú©‡¥2ßëM»Á•¾ƒˆ¿ôçµ½€‹Ç½ĂÙ³ñ‹Çăê™ëéåĂÙÑÄë8¤‡߈·Ôø×•»¶½ØÏÔ‡Ú™‡ơº߈÷Ú±½çÚí—G¶ôÏÄû™‰kß [ïSX߈ÏÄï»Ó¢‰Ô¡Á÷ÁÛ«‚ ½9¢äÍÄÅÑÓăˆŸưÀ·‡‘×8çéºÛ«‚ ½9±»ÅÔX߈¨¼¿ô¦Ô©Đî» +÷Áƒ×ÊÖĂĂ ›­±àéMᨒ7ëÚơêÏ̉ÿ¼‡Ú×¹¯ƒ« +>ÁƯ›¾éê× ½€‡º₫¹ÚÖù¼ïÚ½€½™‹“½ù×ÏÅöÔƯơăˆŸ;k½¨Ø +ĂÙÓ¶èơèÅ·Å™ëéå›êº™ÁƠ·§D ºy™‰kß [ïSÓÅÅ–÷Ù™‰kß [ïSÏ̉‹ÜÅ–™‰kß [ïS¼Ë̉ソŃˆ«‡“ÍjÏÅÛÇíÖ«‡“Íj߈Ă₫®¶á¼§Ô«øÑÓ¾å»ø× «)—ˆï³2±¿ˆ¿ºăˆŸ;º½‰¿IĂ›¾—ˆĐÄê½ñÓỡưÀÁơ¿ôù×ăˆŸ;k©‡¥2ßëM«‡“Íjÿ¯¶÷ÚÄÓ ¡Á‹ÇĂÎÏÅÛ£»©‹Û«‚ ½9ưÀƠ×ÁÅÛ«‚ ½9…Ơ©Ó™‡çđ¹˜ ˜‰j̃ZîSÇ +9¥‡Û«‚ ½9†º ºŒºƒv¯Û¼»ÍĂÙÙ½ƒvư»̉‹íÆ«‡“ÍjÑÄëó^ÏÔăˆŸ߈Ă¼ÏÅÛº½ù×ăˆŸ;—¶ưÀˆÙÚ½™‰kß [ïS‡Û¼Ø̃ˆ́ơ›¾—‘¾«Ô߈²ù׫‡“Íj¾Ø +™‰kß [ïSÉĂ¾ºăˆŸ;ÏôưÀĂĂÇØÎÔ ½ö¿´ƒˆµØ·Ó ¥0ÑØÏÔÛ׃v“ȃˆ‹ª»¡»߈ÿ¯¶½Ẳ«ƯÙ×ăˆŸù×âˆ;Û×à¬ø¿ưˆËÉ9ÓØ߈× Û«‚ ½9·Ó ¥0Û«‚ ½9˜ÔÏÔä×߈«‡“Íj¶Ü“¹ƯN߈µÅöö×Ơ«ÔăÈ÷$ư“ĂĂù×±Êÿ×½ĂÓºÿ¯¶«Ô¶™‡ÏÄÄÛ׳z«Ô†Ç§Ô›¶éù×ÏÔ’ƠÎÚÏÅ¿‰»Ø“Ơª»¥ÛÛ«‚ ½9ׯÁ̉ơØÇֆǛ¾ëö匿N÷ÚỞăˆŸ;½·Å»ăˆŸ;†aÿÛ§Ô¿‰“Ưù噉kß [ïS©ØăˆŸ;½Ô·Ø±¿¶ºÏĽԾ£»ơê÷å5ÓÏÅÄØ…Ơ™‰kß [ïSÁ̉·ÜྒྷƠµØ±»Ơ¢XƠºm©Üӄ׿ôĂ¹ÚÙÚêöǼ¢»ÂËøĐÓØÜÂ١ȣحı»źׯƒvăˆŸ;³(—¶Û«‚ ½9ÛÄÓÅØù¿߈‰¿IḮéºÛ«‚ ½9«ÚÏÔñÆ¥ÛÀÓ ½³ÇÖƒ¾‘Úª‚ +¼9ÓµµÚµØß»û¡“ƯơùêÏÅ™‰kß [ïS·‹¹½€Ó÷ÙÏÔ½€¶ƒvÿ‡º¡ÇæÀÁ̉íØ“Ơ¹Úù×ơèÅ™œăàƒÖ½Ÿ}½ôƠù×§ô®ôË¿·Ôƒˆ½ƒ¾‘Ó¾«‡“ÍjÅÓù×–¶•{Û«‚ ½9—»ƠºmªÚTĂĂ ›­±àéMƒÖ£Ø±»ÿÛÏũؗî߈™‰kß [ïS麯ơ¢Å¡»úÙjí—GÛÀÓÅăà¼ôÏÔ™‡ÿƯÏÅ ‚½ưÀ™‰kß [ïS«ÔÎ̉ù×8¤‡ăˆŸä̉±»ỂׯÛ«‚ ½9ưÀ»Ø™‡Û«‚ ½9̃ˆ“½¡ßù×ÍË)éÛ9¥ºÅóÇ߆Î +½¯Û¿™Ư•î·‡‘×8çỂ̀ÓñÖÙ×÷Á׿8€ºµØ¡»ëö¼߈ͪ÷ÁÏÔͼù×¼£X×ĂÇĂ匿Nؽ¡Áă»ù׋ܗÓ߈á “‰3Ơ,ùÛ«‚ ½9Ç"ÉĂôù¿ăơÂ8¤‡ºĂÙÛׇ۫‚ ½9™‰kß [ïSǹùêăơ‰ăˆŸ́½•Ô¹˜‰j̃ZîS Ëû°êةӾßYôꙉkß [ïSÑæ»ÓÛ«‚ ½9ͼ™ëéå½Û×™ơß»û÷ˆ•ŒƠ’Ơ…Ôù׿8¤‡×ƒv¡Á½ăˆŸ±»¡È­¨±»½ÉĂ9¥‡±»±»ÏÔÛ×§ØÏź˜‰j̃ZîSÿÚ­½¼‹Ü•Œ̀Ê)èÛ8¤™‰kß [ïSÏ̉Û«‚ ½9Ë̉ơÔ½ĂÚסÔÑÄë×Ü·‡‘×8ç–ˆ Û×±‡Ÿ\×ƠóÇŒûÛ«‚ ½9µØ¼·Ôù×›¡ƒv÷å5Ó«¼Û«‚ ½9ĂôăơµØ™Ô߈µÚçØñÆơÔơêïDéÈÙ̉…nª‡’̀jư“ù×Ï̉ơÄ·ÅÇ»ăƠÛ¹íêµÀ¡ÈăˆŸÛÄÓ¹ÚÏÔ™ôÿ¯¶ù׃‹ÇµØăˆŸ;₫®¶Ûº§Ô߈‰Æëö÷‘á ’ÅÅØÑØ¿Åă¿ºø3¹Ú½¹Ú߈¡Á¨Óø¼ŸÈ›·ÔăÇí™Ôƒv«·3uUÍ凌8¤‡×Ơù–Ç%§ÜéӤǩ‡¥2ßëMÙ˽ƯÓ ÁƯÙÚ¥Ư¹Ú߈¡È±»ÏÔéà·Ó ¥0³Æëö…ØÏÔưÀöÁ™‰kß [ïSáÓ™‰kß [ïSăêÚÄ̉9¥‡·‡‘×8çÙëÔƒvëöçÚ™‰kß [ïSöµØ°»©º߈º»‡² ñÓ÷ˆ™‰kß [ïS°»߈ù×ëöɇùêíÖöÿ¯¶µØÛÚƒ™ơăˆŸ;kƒƒÔ«‡“ÍjÍßÏÔ½’¹ÜNÀ̉ÑÓƠ¿½Ú׃Öù×°ÁăˆŸ™‰kß [ïS¶ưqÿ&Áå¹ÚÛ«‚ ½9³ºóÿڿů™‡ŸÅàÄ™ëéåÛ«‚ ½99¥‡×“ƧÔơꥉÍL…©¼¯¼û·‡‘×8癇ø×ƒ9¥‡ËǩǮÆÏÄï»ëôỊ́Ô°ÈÁ¹ơê™ëéåơêå̉ Û«‚ ½9—»ơê×ùêơèŵ.¥ÙǺëö×Ó9¥‡Û«‚ ½9ưÚ½¡ÔĂÙ͇Ë%ƒv±»™‡¹ÚèêÙ½±‡ă»ưÀăê߈‰¿I©ÇívùêưÜ廫 ©ƒ»5˜ơĂÙ™‰kß [ïS•Œ™‰kß [ïSÁĂ²Ú©ÇơÔµàí·ƒˆ™‰kß [ïSé꽟Zµ]ŸÅÛ×öí֭ĽØƠăˆŸ;kÏÔ½Ơ‘ÛÛ«‚ ½9›¾ÙÚ±»ÁƯ«ÔăˆŸ;ÏÔ߈Å–‘âÛ«‚ ½9‹Ó±»Ûˆͼù×ăˆŸ«‡“Íj»ØĂăÁßÚÑ·ëöÏ̉ÜôêĐÓ×¾±¿ÖÛ«‚ ½9ÏÄåÆéÓ™‰kß [ïSû¼¿‰ˆ…ÚŸÅ«‡“Íj¿‰¹ØÙÚ¶ÅĂÎóÔ¿»âê™Ô₫ܱ¿ăˆŸ;₫®¶›úÙŒë*«™ô“Ư߈¾½éêÛ«‚ ½9ÓÅ…ÖñÚơÔ«»Û«‚ ½9ưÀĂƠÙÚÚÛ«‚ ½9›Û¿́ÁĂÁ£Ø½ØÙ‡Ï9…«‡“Íjщ¨Ă‡Œ©Øö̀Ä)ψçÚ̃ˆ‡Œ¿ºÏ̉±»™‰kß [ïS߈ư¯¹»ƯçăˆŸ£Á±¿—¶åˆ•îËDZ»ñ‡™‰kß [ïS ]ÖÆ¦ÛÛ«‚ ½9™Á÷ÁöÓàùêÁ«ĂÅôƒàƒvëöûÚÅÔơêçÚŸ’™‰kß [ïSÛ«‚ ½9·µÿ¾½̉›Ê‡¿Ô‘ÖÍË)éÛ9¥³ØÍË)éÛ9¥ĂÙå̉ éꇿÁƯ»Ă¡h£‡Û«‚ ½9ÓÔÙÅë¡ÔçÚÏÔ½ÁĂ›¶é¹ÚÍË)éÛ9¥¯Ÿ³z½¯È¹ÚíJÅÓçôñÓ±…ŒÆ™ôí—G‡ŒƒÔëöÖØôØÅ»§ƠưÀíÖĂëăˆŸÛ«‚ ½9ăˆŸ;ưÀ߈ëöÅ­ÄÏ̉™‰kß [ïSù¿§ÔăˆŸáß«dÅØ Ô»‹±»«ÔơÔçô¿‰›¾ưÀÏÔ¹Úå̉ ÍÓÏÄÏÔ«‡“ÍjñÓơêăºưÀƒvĂÙ½›¹ă»ăˆŸ;¯G‹øÛÍB§½Û«‚ ½9ûØŸ}Ç´­ƠÏ|É»Ø̣ĂÑØưÀ½Á½±Á$רôá ÑÓå̉ Ù½£ØăˆŸ;¨ÇơêÁƯùש¼çÚ߈ŸĂÁ•Ç₫®¶Ơ¶ +¦D ‡Œù×󫇓ÍjéÚ¡ÔăˆŸ;kÛ«‚ ½9ÇØ™Ô߈ÖĂÓÅÏÅרËlÏÅ«‡“Íj߈ñÖ²‚vϺ»½í—GóÂëö¡Èµ½—»ÛסÇơƯÓ Ơ¥Æ±»ÏÔù¿ÈÙ‚ÀơêĂ¿ºçåĂ£ä®¾ăˆŸ;ëö߈Û«‚ ½9¼ÛÙÚĂ¹Û¿ÅÑÄëƒÖÁÛíê¶¥‹ù×ơô¯G‹ø©&¿‰Ă*ÿ¼­Ö¥ÙÚå̉ ‰ÛªÚâÈÑÄ멼Ïԩؾé‰ñ5ñ·¹ÚùêÏÔå̉ ÿÚăˆŸ;™‰kß [ïSéÚƒˆÓÅÁƯ‹¾Ơ“ăˆŸ;ר­€µØ·‡‘×8çëöÙ½ÁƯ¿‰‰ƠƒˆÛÀêöÛ׫’£Ø›¾÷Áó|ß»ûÙ×ÙÚŸÅâÁ™ô¥È™‰kß [ïSÙÚó©ÇËÖÙq«ÔëöÛ¹ùë§ôơĂ“ÆöăˆŸ;ÿ¾¹ÚƠåÚ«ÔIíØ«‡“Íj–¶ÏÔ—Ó«‡“ÍjÑÓ·‡‘×8ç­Ä»ëöÏÅÀ½ ¿ë„Öù×ƠĂȾßÅïÄÙ×»½‡Ó¾µØñÓƯéÉ߈åZƼ¹Ú»Åă¥â9¥‡×…»•{‹Üå›¶èÅØ›¾÷‡ßÚ¿́—ÓŘÁăçÚ9¥‡ÁƯº½ƒÖøê߈ëÚÏ̉ÏÔ«»ÛºϹ₫£ØËÉ9›¾×ܹڕŒưÀË¿ׯăˆŸÓØŸ’¡»ÓƃơÇûÓơèÅ«‡“ÍjÏÅù׫‡“Íjëö½»n߈“¹ƯNº¥ÆëöÏỒÊ)èÛ8¤³ Û«‚ ½9™Á×ܶ¡Ç—¶¦ÓËÉ9ăˆŸ;kï»߈ưÁ‡ÚăˆŸÿÚ¡È»«d߈Ë%«‡“Íjù×ÙÜëö™‰kß [ïS«»9¥‡×ƒv»Ø·ÔƒvÇ"Ó¼³ÇÛ«‚ ½9ĂÙÛÀưÜÙڇɰ½·§¡Áă±¿̃ˆ¶Ôù×±¿ÙÓ±»ÿ§­¾™‰kß [ïSăˆŸ;k«öÅØ«b¿ºÇ¾ơê±»£Ư©Ø»Åç½ÖĂ÷Úä̉ÅÄ„Ç óª‡’̀j±»8¤‡Ö ™‰kß [ïSưˆ˜ơÏćºµØù×¹ÚÙ×™‰kß [ïSÊăˆŸĐöĂÙêÚ˜‡ăˆŸ;°ÔÑÓ³‡Û¹ÚÁŤˆ\0Ÿß9¥‡ưÀử¢öÏÅ¥ˆ]1ơÔ¥È×åÙ×ơê±»ºØ×ƺ–»¯r›¾×‹ë×Ó±¿߈ï½9¥‡߈…Öå̉ ™ÓÏÔÓÅơâ±»ù׸£©‡¥2ßëMù׃ÁƯ±Á€ºßÚôŸ}œ‰¾I÷ÚơÔ™ơÛ«‚ ½9«‡“ÍjÀ½Ăȱ»¡È÷ˆ÷Á«‡“ÍjöÀ‡€è/Ö:º€½ÿ¯¶åô߈”±»ÅØÏŰ»ë™éăˆŸ©ÇíêĂôßÖñ§Ö/µØ«‡“Íjâˆ:kăàñ̉ÀƯÅ©ØÍÄ)‹Ç߈™‰kß [ïS«‡“ÍjĂÙăˆŸ;§Ôٽٽ¹ÚÅØÏÛ×Û«‚ ½9ôĂœ‰¾IÛ«‚ ½9ÏÅóÂÏỖ™‰kß [ïSëöïŰ»ÿÚ˜‰j̃ZîS Ëû‡kô½€…Ơ½½ÇÖĂÙơê­ÖÏÔµØñ»¯…·ÔÁ̉ơêưÀÏÔÈßæ“¹ƯN¶½¹ÚùÚËÖ߈±»§ûºɰ‡»ÑĂ€Ơ™Á¯¾ª‡’̀jĂÙÛ«‚ ½9¥ÓÓŇŒơê9¥‡×ƒv·Ó ¥0¡Ơ¼ÁSÖ¾8«‡“Íjêö¹Ç°»¿́ÍË)éÛ9¥Ơñ‡¯Ơă½½º°¿ ï³2¥ÈµØ߇‹ÙßÁƒvÁ¹ăê½ơÔÇÖ›¹½¥ÈÏÅÛÀ«&ÂÈ™‰kß [ïS£²¸Ú§ÔƒvơÔ¯›ƠèרĂ¼ơꙇ߈Å«Ôå̉ ߈•ÇĂ™‰kß [ïSÛ«‚ ½9ÏÔ¡Ô½ËÉ9«‡“ÍjÑÓ¡€ÑÓŸÈƯÜ/ƯÓ ăˆŸ;k™Áëö™‰kß [ïSÙ½ ĂƒçÚÙ½ÅÓÆăˆŸ;ƒvª»«Ô½%ß~¡ÈỞ½¡Û½ÔĂÙ÷ˆ×Ăû̉ùêƠ¹ÚùÚÑÓĐÄê£XÛ«‚ ½9Ù½ñ¦ó‹ÇĂĂ ›­±àéM·Å›¾é‰ñ5ñ·§Ỡˆù×½ô߈å̉ Ûº»½ƯÓ ñÓ½‡ŒưÀñÓêö½Ù½¹ÁĂ$ßÁóÂéÓÏÔ¶ÅÑÄëÆƒvÏÔ…»­¾™ëéåÛ«‚ ½9å̉ §ÔçÚ‹Ç“ºƠ×Û«‚ ½9çô™‚ơêÛ«‚ ½9½ ƠƠÛ«‚ ½9™‰kß [ïS»öƒÖÅÓöÁÛ«‚ ½9ÏÔĂºÇ“ƠùꇲƠ …Ơ¼ƒvŒº™‡ºăˆŸ;‡é‡ÿ$«ÑÛ«‚ ½9“Ç«‡“Íj¹Ú·̣ר庉Կßß½ăˆŸ;߈ÅÓÖ¼ +‡§ç̉Ž×Ơ‹ÇÅÓ«÷9¥‡Ï̉§¹ù×ëöŸëöœÓ +–¾ơÔưÀÛÄÓ÷ˆͽ©Ø˹%½¼›¾ÙÚƒvç$ÑÓƯÀ›¹̃ˆ™‰kß [ïSÓŃñÖëö«‡“Íj›¾£ÔÁƯŽ‹Ç½Á…å̉ ½±ëؽÙƠ÷»«Ó÷ơơú›Ú‡Ç˜êèäơº«‡“Íj¡ÔÁƯñÖÏÅ™‡öÁóÁƯßÄÙÛÄÓ™‰kß [ïS½€ơø߈·‡‘×8ç߈èꙉkß [ïS—»©Ó¡Ô÷̉ÅÔÏÔ§Ôßơ“Ơ×Óå̉ ưÿ¯¶˜ÛĂ¥Á‡é/×:¾ơêÁ½«‡“Íj™Á¾ßơĂ¡È›çèçù׫‡“Íj±»ø×ù×Ä–±»ƒ¿‰Đæ·Ô˜Ô™‰kß [ïSç'… ‰₫ÊÇÍÓ›¶é…ÛɸÚơêÛ«‚ ½9¨¼‹ÇÙ×½Á¹¹Úá(§ØƠ­Ä9¥‡©Ø߈ĂŒEư§‡½€ÿ¯¶µ‚·Åº­Öƒv½߈Ï̉“Ơ±́åĂƒˆÓºÇÖÙ½ϼù×™ôơê׺‡ŒÿÚưÀ«ÔшÛºùÑƯ‰™‹±»߈±»³¾“ÇÍBµa÷ÁƒØ¿‰£Ç‰ÛºØº½ÏỖˆÛ«‚ ½9«»™‰kß [ïSù×½ƒÿÚÛ«‚ ½9«‡“Íj½Áÿ.ù×ùê»ÿ¯¶•`•Œï¶›¾½ÇÖĂèªÚ …ÂƠXÛ«‚ ½9¶9¥‡ß¿ÙÚ–Àá¸Ú™‰kß [ïS‹ÈׯÏÔÏ/ñÓëµØ¨¼¡́…ÖôëöØ×¡%¡Á½Ă“ơ»ơèÅ»±»Ç̃ޱ»Ơí—GµØË“ÈÑð»¹Ú·‡‘×8ç̃½Â ¬°àèM»ẰÓ©Ü·‡‘×8ç°»ÏÔÛÀ∠  :ḱÚÛ½ËÉ9½ư‡±ù1¨º™‰kß [ïSÇØÓÓ¼Ô߈°¿²₫Ú±¿å̉ µ†ªĐÏÔăˆŸ;g•²å̉ ăˆŸ;k«‡“Íj¥ÛçÚŃ×̃ÄØ߈ç«Ñé¾Û«‚ ½9ÁƯ‘ËÍÓ8±¤‡±Ö%™‰kß [ïS·Ôö³oÿ$™‰kß [ïS›¾Û«‚ ½9ƒˆÍħôù×ăˆŸ;êöÖ¾ÙÚÁ̉ăˆŸ¿»̉½n±»ƯÓ ÅØÓµƯÓ ±ëØïiôê¡Ô…Ơ¥*µØñÙ™‰kß [ïSƒƒvƒvơÔĐÄê˜ÁÓºĂÈÛ«‚ ½9«‡“ÍjµØ‹¼ÔÁ‡é/×:߈«‡“Íj›¾Ë̉±»Ú׿ôÿÚÿ¯¶›¾ù×ÏÅÚ°¿‡×êö…ÖÏÅĂÖÙŒë*«ÏÔù×ïƠµØéÓ´½>ëÚ¸ÚÏ \ ¼ĂÙẳÖÆ¹ÚÙ“ +Ơ£ÔÛ«‚ ½9ưÀß»ûµaỞ•ÖÙÚ’¹ÜNÉ̉·‹™‰kß [ïS9¥‡±»ÑÓĂÙÄØ¹Ú»ˆ³Ưå̉ ưÀĂ•ĐëöG½¹ëö°¿£Ç«Ô÷ˆăˆŸ;÷ˆ±»óÛ¹ĂÙÍÓ¹Ú€ºĂÖÆ­ÄÇÖô›¾Ơ“·ÔßÚë˜HÅỌ́Ç€ÄƠƒ½°»ëö£X±»ÏÅä̉¾Úª‚ +¼9Ï̉ï½¹ÚăÁ½ôÙ̉»½áꇭÅù×߈“àù×É̉“­ÄÛ«‚ ½9éÓχ™‡…ŒŸ}ƒv¿ç©‡¥2ßëMÏỒÓ™‰kß [ïSÏÔÂÓàêăˆŸ;k±»߈ËǹگG‹ø߈ù×¡ă‹™‰kß [ïS‹ÓƒẬÂÛ«‚ ½9™Ôă‘·Û«‚ ½9ưÀ¥ØóÂíJíÆÏÅ›¾ù×ÏỖ»(ú(óÇăˆŸưÀ›¡€Ó™Ó‹ÇëöçÚ±»™‡Ă¿ô§¡ù×Û«‚ ½9Ơ¾G¦ô´Ø9¥‡×öÚϺ·Ø…Û½€ëÚ±‡ƒv‡wÇÖ§ô߈Û«‚ ½9ù׃v½™‰kß [ïSÛ«‚ ½9̃ˆ×ÿ™‡Û«‚ ½9¯È½ƒˆÿ¯¶ù×ÑÄë½ÂơêÇĂ˜‰j̃ZîS‹v™‰kß [ïSưÀ¶ăˆŸŽ¿º¶ÍÄ­¾›¶é߈ǺÁƯ8¤‡×¶ô ăˆŸ;k«‡“Íj£»ĂĂ ›­±àéMù×ÎÔĂ×$Ç™ÁºµØ±»§™çZíÚ¾íÁ«äÏÔ€º·‡‘×8çÛ«‚ ½9±»ßƯơ‹Ü¯¼á¬‘Ö©Øù×¾ăˆŸ;»ˆăÁ£²«‡“Íj߈¢»ƒÖ¡Á±¿ÓµÁĂëö±ÈƠ߈רưÀ«»·ÅØ× ±»‡ŒÇؘ‰j̃ZîSívÏÔß%¹Ú½ƒ́Á¹Ú©½åõØÑÄë“È™‰kß [ïSÛµÏÍÄÙ™‰kß [ïSÿ”±»÷ÁÛ«‚ ½9÷ÁçÀ“Ơ÷‡©;«‡“ÍjÍƠÛ«‚ ½9ĐĂ—»ÿ¯¶ưÀ€º߈ù×åÁăˆŸ;Ó̉±»ÑØÇ̉˜‰j̃ZîS«‡“ÍjÅnöÙÅëÑí—Ó™‹ù×—¶̀ĂăˆŸ;¯Ë=©Óޱ»Á‡é/×:¼ĂË̉³ïÅÓǺ›¾߈™‰kß [ïS×ÚÏÅù׺½ưÀ¿¹ĂÙ¡»ăˆŸ;³Ø¥ˆ]1ĂÈÑÓơ궃½¿»ÉÖ‚ÿÛˆù×Û«‚ ½9ĂÙº߈ŸÅ˜‰j̃ZîS–ĂéÙÚ…Ûù׸׆º·ÔƠÄăˆŸ;Âù׎ƒ“¹ƯN±»£Ç¿‰ăˆŸăˆŸ;™‰kß [ïS¯›ơêĂÖ¶èóÓáêŸÈ…Ô‡99¥‡«ÑëÔ½ÍË)éÛ9¥“ŒµØ¸ÚăˆŸÍÓÁƯƒº±»¸®ăˆŸÏÔ›¾µ¶‡»¼‘ÏÅÙÅëưÀ­ÖǼĂÙé¾™‰kß [ïSơÔ÷ˆÏ̉߈ù×·‡‘×8盾©¼ñÖ¹Úÿ¯¶«‡“Íjù×ăˆŸ;“Ʊ»Ù½à=ºÅ™‡߈±»ñÁ½™‰kß [ïSß„߈ÿ¯¶߈¶‡Ö8æ߈±Ô‡Œ«‡“Íj¶Ôéºƺ ÑÄë́ÅÉà‹ÇƨÀÛ«‚ ½9ă»ºåôᓹƯN§‚«ÔµÁ…ßô¿ô§ôù¿µ“ƠçÚÛÄÓá½ëöăˆŸ;¹̃Û­£÷ÁÁ¹¾½ËÇ£Ó±»ÏÔ°»ÛןÈ÷ˆëöÿÚ÷¼ëöù׃ØÏÔƒØư‡±ù1ù׉¿IÈ9¥‡¥Ăù¿ù×߈å̉ ùæ»ÎÔÙÚ™‰kß [ïSưÀ̀ÂÈŸÈø×Û«‚ ½9ó‚ÏÄ•ŒƒÖרù×8¤‡×«»ùêÙÚ‚vÄÓÛºÛÀ½ÛăơÙ½ÏÚϼ9¥‡¿Å‰Û¨ºáÚž(ĂÈ¸Øœà•Œ½ôÙ½½ƯÓ ±»¼Ă«‡“Íj¹Úù¿±»±»ÁÚ£Ó߈ÏÔ™ëé屿ÅĂơêö‹ÜƒvưÀ×Ơ±»ª‡’̀j©ÓƒvóÇщ©¼èê‡9äÁ°»ïÁÏÅÇÖ÷Á­Ö«Ñù×ĂƠăˆŸ;ƠÛ×™‰kß [ïS³߈ơĂ£ÇûưÀ©Àª¶2tT¿‰—¶™‰kß [ïS€ƠÙ½™‰kß [ïSëöÛ¡ä̉  ›¾Ǻ¼€ơÔÛ«‚ ½9…Ø Á±ëϼ¹ÁßÖß»û¬ÖÇÖóÇưÚơÔơÔçơôå\ÜÙ½½€º£Ç‘÷±Ă±ëØÓØêöƯÀÆÅ߈₫†º‡ÛÔó©ÜÿÚ²’ÆíÆ¡Á™ÓÛ«‚ ½9ăˆŸ±»̃ˆ²¾ù×™‰kß [ïS÷¶ß»ûĂÙÇÖßÅÅØÏÔÿÚÙÚÁ¼åë·ÜÅ–ÅÔ³Øù×ÚÀÙ̉щ™‰kß [ïSûÇèơêëö‚vå»êÚ˜‰j̃ZîSÏ̉‚ÖôêơºăˆŸ©‡¥2ßëM÷Á؀h½€ăˆŸÛÄÓăº±»öª‡ +’ +̀j +­ÄÏÔ½Û«‚ ½9ĂºÏÔ§ôƠºm߈Ú×ؽ±½™‰kß [ïS±»…ƠÏÔ₫ñÚ±”Ûÿ¯¶ÏÅ¡Ôăßöχëöå̉ ưÀÙ½ơê¼Üă‡Œív÷å5ÓéêÙÚ£äÿ×›¾Ó³z‹Ü©Ç£Ø߈ͼÁĂ߈ù¾ë ˜‰j̃ZîS8¤‡ÍÓ¼Û«‚ ½9ƒvƒv±»½¦ôĂ¼ψơÔÙÓÍË)éÛ9¥€ºå™‰kß [ïSÅØ“ƠëöÅÁ÷å5Óùױܙ‹±»ëÓ½€ï»Ö³È… ¡Ô·‡‘×8ç…ăˆŸÛÇÁƯÏÅÚǼôă­å̉ ¡È¶ØăàÍĂ«‡“Íj8¤‡µÇÖă½ëÍË)éÛ9¥¹ÚăˆŸ;™‰kß [ïSÏæ«ºËÖÿÚưÀ¾µØĂÙ¡ÛÏÔÇ冱 ºÏÔ©ÇùêÛ«‚ ½9ƒÖ“½›Û½¾‡ơ– Èô©ÓƒvÛ«‚ ½9‰ß÷Áº§½€ñÓéJé‰Ó5“gesÁÅàƠ߈9¥‡ªÔƒˆÏÄñÚà ¾åÁ°»‹¿âÁ·‡‘×8翉ó¶ăˆŸ;Ï)æºÊƠÉ€¾ÏÔ™‰kß [ïS¦¹Û×Eù׫‡“ÍjëöóÏÅË̉´ØÖ ¹×¾ĂÙר—»¶è‘›«ÔǽvÏÔÏÔ±»Ϲ“˜Á·Ó ¥0… ‰₫ÅÓ·ÔÏÔ™UŸíà±»Û«‚ ½9ŸÈ±»á ₫®¶߈¾ºÿ¯¶­ÀË ”Ç‹¨«‡“Íj«Ô›¾ÙÚÙÜăˆŸ;Û«‚ ½9₫ơêÎÅôÄ ß»ûѶ‡a¶ƒÔ¡Ô§(º½ûĂÙÓº­ÄµØ±»ÅÄ׿8ÏÅÔ¾F«‡“ÍjÓºéêÁƯï³2ÅØÿÚáêËÑÏÔº±»™‰kß [ïSÇÖ½ÑĂÑÄëç̉íÖ³Ơë̉÷Áé‰ñ5ñ·Ǻ½Ï̉›üÀÛ«‚ ½9߈›Ơß»ûÁÚĂºăˆŸ;‡“±»ø×›Ú߈½ÈåÁÙÚÙ½•£äĂÙÛ«‚ ½9µa¡ÛöñÚÑÓ±»áºÓ¾©Â„‹ÁăˆŸ;µØ‹Çÿ¯¶ÅØ߈ÏÔ·Ô‹Ç™‰kß [ïS›Úưˆ˜ÁÇ»ơÊ߈ÂÙ›ƠËÅË%«í߈©‡¥2ßëMÔX"ù×ÑĂ5¡È“ƠĂºÙƠ¹Á§Ơ9¥‡ăơß»ûù׫Óëö«»ÍƠçÚÙ½߈ǽ¹Ú«‡“ÍjơĂëöƯÓ ’¹ÜNơÄ×Óºyëù×ù÷Á·‰ơêóÔ§ÓîÚÍË)éÛ9¥ƒˆ§Ø«b÷ÁÍľψ™‰kß [ïSªÛ…àöẨéÓăˆŸÚª‚ +¼9½µÈeƒv·‡‘×8çÏÅ­ÖĂÙç4‚vÛ«‚ ½9ƒÔÛ«‚ ½9ÏÔ¹Úăơ«‡“Íj—ˆùêù×±ëØôÔ›¾ăê8¤‡ÖíØùêóÄ₫ËƠÑÇñ¯È©èơèÅïÅùדƇڿY߈Ëù›‡Á‡é/×:åÁϾ¥O±‡µØ‰¿IÀ¹Û׫»ï»̣ÇÁƯ½Ôù×߈ƒv·Å›¾…Œ°»‹Üăà›ÚÏÅÛ§ÔơÔä׀뙉kß [ïSÛ×Ó‡ŒñÖÿ¯¶ỂÁ×ϺÛ¹ÁƯßÄÙ›¶é×̉¼à¬ÔíÆ‡ºçđËÓĂÙûÚ¹ÚÿÛÏăˆŸ;¡ÈÏÔ·Ô× ÏÔƒv÷Áù×™ÓÛ×å̉ ÷Ú°Ô¡»½÷ÁÅÍÓăˆŸ;kƒv±ë؃vÛ×±ŒÙ½Ë¿˜‰j̃ZîSñÓÙ̀©&ÏÔ¥ÁÁÚăơñ½ù×ĂٓƶƠXÛ«‚ ½9÷Á½Ă.ăˆŸ;„ø•ŒưĂ«‡“Íj§ÔªÚ÷‡·‡‘×8çăˆŸ;ÍÓá ³÷ˆÛ«‚ ½9Û«‚ ½9‹ö™‰kß [ïSÿÚ«ÔÛÄÓÏÔ³z«Ú™‹ô½ÏÔ¶±»êöºnÅØ¡È›¾ÓÅ°êØ§Ô‚v¹ÿÚ™‰kß [ïS€¾ª»±»Ï̉ù×›·ÔÑæ‡ŒăˆŸ;kû؉¿I¹Ú»»ĂÙ§àăˆŸ;ÁĂĐÓϺ¯È©éºÛºç½ĐÓÙÓÛ«‚ ½9Í́߈áꢻñä•{ƠơÛ«‚ ½9·‡‘×8ç»ívÇÏÔ߈ÓÈ™‰kß [ïSºµØëöëöơ°»Û«‚ ½9±»½·‡‘×8ç̉̉ƒvù×…ô­Øê˜HOË¿߈±»߈¡¹µØÍĂóÂóÇ«µØÙ€ăˆŸ;k¡ƯÅÔÙ½«Ñ¨ÈƯÓ ÏÔï»™‰kß [ïSƒˆùê–»ÿZ£»¡Ô×ăˆŸ½Ô‡ŒỔ±Á¿ÅơèÅŸÅ߈«Œ¤ÓÓØ³Ø½‹Ç…Ø™‡©Óóƒ½߈Ă¥‡ŒßÄÙ(Û«‚ ½9߈ÑæÏÔ—»—»ƯÓ ëö̀ÓơêÿÚ£»³Âå̉ «Ñ«‡“ÍjуâËÉ9ßÄÙ߈߈ù×›Ú±»µØÔXăơ9¥‡÷Á·º߈“Ư¼¥Û°»å̉ ‡ŒăˆŸ¿öûÓâơ߈ÍĂ™‰kß [ïSŒàĂÏÅ¡ÁêÅ«·3uU…öÿ$ăે“Íj¹ØăÁ¡ÛăˆŸ;k»¼‘ăˆŸ;ÑÓ¾Û×Û«‚ ½9†Ú¿‰œ$¬!ĐÄ#ê#Ûº¹ÚŸ}‘ ûÙ±¿·Üÿ«‡“Íj·ÅăˆŸ;ùê½ƠÏÔù뿉ËÖÓØÛ«‚ ½9ÅÔÇ·›Û»Á÷Ôœ׺¾ñÓ«‡“Íj»»ù×ÇŃv˜ÖÏÅ»ƒv½€á̃ËÀÉÖÍƠë‡á øê½ƒvúÙÔXŸóeñÖ«Ô߈÷Á·‡‘×8çƒv麕Èû›ÇÖ¿ß×Ỡ»ú¹ÚŸ¹ÚÍÓºÛ«‚ ½9›¡¯È̃ˆÓˆ•=‘ÙÚ‡Ûß„û̉ƒ¿ßÍË)éÛ9¥ù×øêƒvƠXÏÅăˆŸ;û(ϼ˽ѶÙY߈ëö™©Ç²¾ù¿·‡‘×8ç“ÈÉ ÅÔô™ÔơêêÔ˜‡Ïơ…»ĂÙÙ½¹=ÏÔÛ×ûةӽ€½ûå×ñÖ™‰kß [ïSö¶·¼Í7÷Ùù¿¯Óôơê¢Ç¹'ÑÓ¢»Ă߈ù×µ«‡“Íj£äëöưÀƒÔ߈шøêƯÛ™‡µØ‘ơÛ«‚ ½9ÁƯ¹Ú™ëéå¨Çá׳ƒ˜‡×*©¼Úª‚ +¼9ÑÓ¼€ö›¾ÅØoåĂË¿‚ÇÖÿÚÛ«‚ ½9«‡“Íj©₫ơØ™‰kß [ïS«‡“Íj½¿‰µØ¢ ±»ºĂÓăˆŸ›¾ï²2±»£Ø¾ºÈÍÄù×§ÑăˆŸ;Ở˜‰j̃ZîSÊÈ9?Ïēƃvƒˆù×Áɇ¹Ú«‡“Íj§Ôëö·ºÿÚÀƯÍÓƒb÷ÁÀ‡ € è/ Ö: «‡“ÍjÊƠ‡º™‰kß [ïS¯ÈÁƯơêăˆŸö™‰kß [ïSÏÅàƠÂù×ÎÔÙŒë*«ÿ§àö‚¾ÿ¼ŸÖ±»đ¾=›¾ưÀưÀƠÎ÷‡¡Á«Ô³½íÖÛ•ÇÖá ă꟒¹Ú߈ŸÅăˆŸ;“ȯÈÑ·ªdĂÓØ÷«‡“ÍjªÆÇÓơ«‡“ÍjưÀƒ¾‘¹ÁƒvĐĂ©¼Û«‚ ½9ÇÖ½™ơ¸ÁÄô­ÄÏÅ¡Á‚vÏԲ §ôÏ̉ñÆÇ̉éÓñÖƒ(âˆíêƒv9¥‡ÑÓï»™‰kß [ïSï³2™ëéåăˆŸ;Û«‚ ½9öăˆŸÁƯ™‡½Á£ØÓ߈ÉĂ³Óÿ§½”Ǿ ÔûÓăÇíÏÄăˆŸÁ‡é/×:ÇÖăˆŸ…»Á̉ÏÔ…́½Á̉ù×ÏÔ£ØơèũӃvĂ ăˆŸ;Ùׇ¿©Ó¾µØ₫¼“ȻŀƠíÖçô¡ÓÅ«<Ù½ăˆŸ;³È’ØרĂºĂăÇíøæ‡Œ¿ô‚v)«‡“Íj¤Øƒv—§¡»¿‰½Ô³ÇÏÅù×½¯¾ÑÓơºÁƯÛ«‚ ½99¥‡Á˱»í‡«ÔóÔÛ«‚ ½9¿û(ÏÔYù×Û×∓Ơ%ưÀĂĂÈÁƯ¡»„÷ÁÓñ¹™ ëÚ¡Ư¡Ô™ëé噉kß [ïS«‡“Íj÷Á߈ÿÛôùש‡¥2ßëM£»½ô¡Ç³ô™Ó™‰kß [ïS·Å߈Û×Ăôƒˆˆù×ÏơƒÚ¢ô±»º¦ô½ÅỞ¹‡º›¾™Ó±»ÙÚgư™‹ë½ù׳ôå!¹̃ÏÅëƠUÏÔÏÔÁƯ«‡“Íjº™‰kß [ïṢ‡ÑÄë±»ÅØĂ ơÄ₫ ®¶ ß»ûưÀç̉¶ùׇŒ¶  ËÇщ¿‰ÅÔÓöùæ߈9¥‡«‡“ÍjÑĂ«‡“Íj±»åŒ¿Níêư7±»Åí½g«º¢äÙÜíØëö߈ÿ­ǺĐï߈ƒˆ™‰kß [ïS¡Ë̉ßÚÇØÑÓăƠÂĂ˜‰j̃ZîS§ØÏÅ·Ôá ưŒĂ±»á ™‰kß [ïSÛ«‚ ½9ƒv™‰kß [ïS³%©‡¥2ßëM“Ƴô©À߈Ó̉·rºÁưÀ³zĂÈ9¥‡±»×¾8¹Úø×÷ÁÙ}°ÛÏʼn¿I¹Ú±Û×Ú©ØÁĂ%™ÁĂÙÏÅëö…Ú¿»©ÇÓó°»ăˆŸׯͲÙ½³È¥ˆ]1ÁÓ¿ơê­Ä£Ç×Ü™‰kß [ïS½Ó½ëöÿÚ˜‰j̃ZîS¯ăˆŸ;ËƠ¥ˆ]1¹¾ÓÆÏÔơơ꛾ä¡Á9¥‡Ïű»«‡“Íj¥ˆ]1ÙÚÙ×»ĂǼ½ñ»½̃§Æ§ç¡Èá $&ëö­ÄŸ «ÔÁ̉‡ŒßÚù¾™Á/­ºÿ‰qߌÛ,ÿÚ‚׆wÏ̉ö¹ÚÙÅë߈•ÓĐÓ±»°»ÇÖ³ô‰¿I§ÆơÔŸ}ƒÓÅÍÓƒ˜‰j̃ZîSæ½ôê±”™ôÏÔ¡ÛÏÅ—±Å‘«‡“ÍjÓ̉½€ÙÚ˜‰j̃ZîS‹Ü¹®à¼«‡“Íjƒv÷Á¡Èù×Ï̉•Ü«‡“Íj¯ÈYÅñÙ™‰kß [ïSƒ½­Øé×× «­•·µ†µØ‰Ô½ÂÙæÚ©ØÛ«‚ ½9Ơ¾G£äÏÔƯ‡ŒâºÙ½­ÄăˆŸË̉ùצô˜‰j̃ZîSÛ×Û×ăˆŸ;«‡“Íj¯–µǾvÏÔáêÛº­Ø¸Ú“Ơ«‡“Íj±»ÅÓÛº“±»ÏÚÛ«‚ ½9ÑÓ™ëéå¤Â±»±”ÏÅ̃ù×å|¤ˆ\0›¾ƠÑÓéÓº9¥‡Ù½Ù½߈ĐÓĂÙ°”ª‡’̀jµuÛ«‚ ½9ÁĂơØ·‹Û«‚ ½9Û«‚ ½9Ç»÷ÁăơÍĂÙ½µØ…àĂÈщÛ«‚ ½9­¿Ởá̉ëö‡×Ú½ƒvçÚ߈‹ÇÔX·ÅÂÙó–•Ü®×RÑÓ½ôÇÖÙ׫‡“Íj׾ŸµØÏÔä̉½½ÏÅ«»ëÓ«‡“Íj÷ÙÆƒvù×°»ưÀéô½ăˆŸ;ª»ơÔÙÜáê8¤‡Ö ăÁßÁÛ«‚ ½9ÍÄööÿÚ«»å̉ ÏÔçÚáêóı¿°»£ä°¿¸ÚǺơêéÚ¡Ôׯ½€ŽûÙƒ½߈Ǽ­¾È̉‰¿IÁÙÛÀ̈́ソíÅÔơê½™‰kß [ïS¡ØăˆŸ߈ÙÜ™‰kß [ïSèêÏÅÛ«‚ ½9̀B—¶ÄØĂÙ½™‰kß [ïSÙ½ôê§ÔơèÅăˆŸŹ÷ÚÛ«‚ ½9Ù×êöÏ¿ƒvÍË)éÛ9¥“ÈÍB†ºơ$©Ơχׇ½7ÉÛ߈ƒØ¡ÁƠ°»©À©¼Û«‚ ½9ϼÊÓƒv±»¾ÿÚív¡Û¡Ô±»ưÀ’¹ÜNëöï»·̃ÓØƠ¾GĐÓăơ÷Á±»Ù½Ơ§öĂË¿‚Ô±»߈ơêÿÂù×ăˆŸ³Øׯ×¾éºÛ«‚ ½9ơ­Ǿơ·̣«·3uUĂÙ¾ËÉ9×Ơ‰Á߈ÿ¯¶ơû̃ÎÅÔóÇÓ%¹Ú·‡‘×8çÛºôïÙÚ÷ԳɩǭÄ₫Ü™¾“Ư₫&“ƠÿǹÚÙ½÷ˆ¿Å‚v¶ăˆŸ;«â¿ºŸƯÏhÍå¯G‹øÙ×9¥‡ËÖ» ·ô™‰kß [ïS¡Û†ŒÆĂơÔ¡Ô¡Ôǽ™‰kß [ïSÁƯöáƯӺ󙯣â£q9¥‡óÇÎÔ±»‰×¿8™‡±»™‡›¾ƠXçÚ̀Ó ½߈ÙÓßÄÙ߈ß»û‹Ü½€°»Û«‚ ½9‡ŒĂÙív‡½Ÿ ¹Á¿‰ç­ªÚ̀ÓóẮºÙ½‡“ÛöùêëöˆÛăˆŸ;kƒ¾‘ñ×Ù½«‡“ÍjÛ«‚ ½9ßÄÙ«ôÙ½ëöÙÚµ.¥Ù˜êèä½ôÉë˾«‡“ÍjÇ̉âˆ:øêéê纣äù×ăˆŸ;k¡È™‰kß [ïSí‡9¥‡†¤ÇưÀ߈ÙÚçÚỔ Û«‚ ½9¡ưƯºÛ«‚ ½99¥‡»‡ÏÔ½ÙƒˆƯÓ ­ÈÏÔ¡ƠƠơêµØăˆŸ;«‡“Íjù×±»§Æ™‰kß [ïS¹Ú’Ç +‡Ú§ÔĐø §JÏԹȧô‹Çß½³(íơ™‰kß [ïSû(ƒv¿·ÅßÄÙÛ«‚ ½9ߌÛ,«Ôù×ᔫ‡“ÍjÄÓ™ÁĂÛ«‚ ½9±»Ç%óÇ̃ÄØăÂ3‡Ï̉¸qƒ¾‘߈߈óñ»³•{߈ùײ +9¥‡Æ÷ÙĂô±»Ïžº ÅÓăˆŸ;8¤‡Ö³ØÖÆ +ŒaÍƠ«ÔÉó—¾½­Äá Û«‚ ½9±»°»‰¿I‹Çó—Ù½ÏÔ©-™‡¡Ç‡ÏÔ‹ÇùæÇÆÓØÙ™‰kß [ïSăˆŸ;k‡Œ©‡¥2ßëMØŒê*ªÓÔ½ôé‰ñ5ñ·±»÷‡ß„ăˆŸ߈Ó¼ñÚÁ ëöÿÚ¯¾™‰kß [ïSÔ™Ô«‡“Íj“ơϵaÜ ÏÅ­ÄĂíï»™‡™ÔăˆŸ;k©Ó«‡“Íj³ÈÙÚ«‡“Íj¡ÈÀ¹ Û«‚ ½9›¾ÁƯñÓĂÙµ.¥Ù˜‡ĂƒvûÓÍƠưÀÓ̉Ñ؇±»ÏÓøæ·̣Ơ³×™×«‡“Íj¿‰»Øÿ§›Ú߈·ÔÏÅÛ«‚ ½9ÄôÙ½‚v«‡“ÍjÁĂ³ºó£ƠáƯó̉̉ùêÙŒë*«¿‰­Äÿ¯¶­ÖÓØÙÚÁĂ•×ăˆŸÏ̉̀Ó±ôåô®ƠñÓăˆŸƠÚÿ¯¶µØ“ÛÙ‡­9‚v¡È§Ô‡“‚v”ÔíÚ©ÓÙ½±»óÇÂôơèÅáƠĂǽ² Ù½Ởç'™‰kß [ïS₫®¶̃ˆÁËÍÄă‘·Ù½ÏÔ’Á™́ƺƒv¤Æ“ƧÔÛ×ûöëöÇÅ«ÛÔ½µØË%ÁƯàêăˆŸ;³È½ë™‰kß [ïS•ºÏÔ³à˜êèäË̉Ơ‡̀ÍƠƒvÏ|¹Ú½Ó´ơêăˆŸÛ«‚ ½9–¶߈²Ø ÎÔ†»ăˆŸ;ÿÚ·‡‘×8çĂñ»ĂÙ¿‰˹ûרÑĂÏŲà Ǻ±»‰Ô£ä…ôívª»ívºÜÓ ߈ÿ¯¶ƯˆƒÙÜ÷ˆƒvÏÅëÓĂÙº½²ØĂŸÅ·Ó ¥0ÛºÓ'¡Áù×½Œ¾ù¿Ù½ÏÔºÙÚ߈ÛÀ™ôÏÔרÏÔ©¼Ó¾ăÁ¥Ó…ƠûƠç̃¿»…Ôë™HǼçÚ€ºívăˆŸ;‡Ûă½«‡“Íj½ÈăˆŸû¹ơèÅù×±»ëÑĂÙÚ®ỢÛ«‚ ½9éÓ†ŒçôùڳșØäô¹Úù¿¶íJ‡Œ‡º§ÔÇÖå̉ ¹Ú§ÈÇ~¿»ÍÓÛ«‚ ½98¤‡±»Ơăàéê%Ï̉˜Ơ2Ươ›¹º©ÇÏÅÙ½™‡É—¾9¥‡©©‡¥2ßëM¸Ú¥ÆƯº߈ƒvƯºŸ»߈°»ù¿£ÔÏÔ¯G‹ø½»Ø­¾µØöñÖŸÈÙ½æôŸÅ‰àĂƠ߈í·ª‡’̀jív³ô‡Œ÷ˆư§‡‹Çÿ¯¶…n§ÆăˆŸ;Ϻívä̉ﻨØơÔÿ¯¶‡Ú÷Á¼€ ÅÔóÇϼÏ̉ñÓéÓùơ匿NơÔñÓ—Œ±»×ӇǩÜͼñ̉Ûº»ƒ½÷ˆù×±¿öñÔÑÄëß»û—¶ù¿‡ÚÉ¿‰ÍƠ˜‰j̃ZîSÉÖ¡ÔêÓƒ×ÏÄ߈ªÔ§ÔÍēƙ‡ÏÔ«»‚v߈—¶ĂÁËÁ|߈ù×·‡‘×8çùêß„¯¼çºëöˆ!¾ØÁĂƒvÏ̉ÏÅóı»å»‹ÇµØXÛÆô.ưÀ“ÆåKù×ß»û·Å©ØƠÛ«‚ ½9Úª‚ +¼9¹¼ɇ™‰kß [ïSưÀưÀơ곺óË¿́êíê·¼Í7ñÚщï»÷Á™Ô«‡“Íj«‡“ÍjÁƯ°»Œ¾öÁÇÖ¿ÅÁĂׯ÷ÚưÀ¶¿»—¶Ë̉©Ø†Œß„ªÔÁÓ±»éôÏÄ߈»ˆÚª‚ +¼9Û«‚ ½9™ÁÏÅ«‡“Íjº•ŒÛ«‚ ½9™‰kß [ïSơêÏÔå”ñ‡’ÈшºÅỞ™‰kß [ïSÏÔ›¶é½ô½Zß»ûĂƯu½÷Áƒàëö™ÁƯˆ‡ñ5ëö¤ˆ\0ׯÑӮ雹Ũ³Èƒ×©¼ËÉ9¦ô™‰kß [ïS¥Æ©ˆñÓÓ̃Ö×ƠăˆŸ;ÑĂ¿ßëö߈°»¹Ú©Ó©ÓÛ«‚ ½9åÁ×ƠĂÙ÷Áµaëö«‡“ÍjßÚÁĂÏÔ—¶ù×›¹ó¯×ÿÚªÔ™‰kß [ïS‡xăàƒˆưÀ½ØÅØôê½ÏÔƒ½ƒv—ˆï½çÚ‘é÷ˆÛ«‚ ½9›¾©ˆ½™Á߈‡ºѶÏ̉™Á©º˜ƠÑĂèÔ­ÎÂÈÏÅ©̃ù×ÁƯÏÔ›¾¾ô…n‹Ç߈釱¿–ÓƒvÙÚóÖö›¾™›¾á¾µØÏÅ¿ØÔX0±»Ÿ¿«»±‡ăˆŸ;«‡“Íj¿‰éê³ ơêÛ«‚ ½9ÏÔ߈ÖĂ¡Áàêà °»ƒqÛÄÓ±»ëô‚¾߈ƯºÇØ™‰kß [ïSß»ûÙ×ǺơêùׂÀ×–Ù½ơÄùê«ÔăˆŸ;kù×ù¿ÏÔĂÙÿÚ¹Áí$‘±ÿÚï½öö¿‰°»’ÇÛ½«Úơꀺ±¿áỢÔªÚ·Å›¹ĂưÀ™Ô½ÁƯ½€ù*ă»»ÚÁ¹óÂÛ«‚ ½9™‡ôÖ߈Ưˆö÷ˆÛºŽơê½€ĐÓƠÁ‡™ôÓ·‡‘×8çÛ«‚ ½9†º¨Øƒv«‡“ÍjÚª‚ +¼9Å»½È°”ĂºÆ ÛÓÓ›‡¹Á‰y¬È ½ÓÅ›¶é9¥‡©v¬ÖƯđå¿ĂȰêØËÇ›¾¹Úâˆ:k—¶™‰kß [ïS¿ô%ÏÄÛºØ×¹ÚÏÅ•)ÏÚÆ»ßÄÙº¼€Ÿ\÷ÁºÛÄÓ÷Á½ĂăˆŸ£È™Áç̉ív›¾™ÁµÜÑÄëÁ̉—…Ž«‡“ÍjƠ߈±»¹ÚÓÆ‡Û«‡“Íj¡Ô©ˆÙܵ؇ÚỞ¹Ú³Ç9¥‡™ơÙ½ñÓù׫‡“ÍjßÄÙß»û߈™Ô÷ÁƠÙ½ñÓăˆŸ;«‡“Íjă‘·¹¦ëöŸÅÇ̉ƠÜéÓ•Èû›©Ø“¹ƯNÍĂטôº߈ëö·‡‘×8çƠĂÙùơơèÅùê¡á·‡‘×8çÏÔÅÉ…nÙŒë*«ÏÅÅö«ÔÏūԿث‡“ÍjăˆŸ;«‡“ÍjÙ̉«»‰¿I™‡›¾ƒv¶ûƒˆË®ǺÛ«‚ ½9­Äÿ¯¶Ư—¶»Åăàù׫ÚÓ̉ÏÄ߈߈€¾̃ˆưÀăù×åĂÏÔÛ«‚ ½9ỞăˆŸ;kỡÉ}£ä…“ȱ»çÚ²µØ߈9¥‡ˆ›¾Å»à× ¯Åăà›¾ƒvå̉ ÜÙÓ9¥‡ơĂù׃¾‘ôÏÔ߈ƯÜ“ƠÙگ׃¾‘çÚÛ«‚ ½9·‡‘×8çÛ׿ôƯ¯ùêƯºÙÚóÇш°»êơ߈ƠµØÙ½²ÂÏÓ ‚vå×ùס™‰kß [ïSŸÅ¸ÚÖ¾£äơèÅùêŽÅӦƽ€߈½Û«‚ ½9 ËûÏÅ’ƠÁ‡é/×:Û«‚ ½9×ƠÁĂá=ñÓÍÇëÖÙ½ƠX9¥‡Ù×÷ˆ»½áêƒà÷Á÷ÁîÅ +µØŸÈ“Æμ™Á¾ù×±»ơÄÙŒë*«9¥‡Ôºl£»‰Æ…Ú±»ù×ăˆŸÅØû¨ÈÏÚ™‰kß [ïSå̉ ưÀ×Ü«‡“Íjëö½Ă˜‰j̃ZîS₫Û¼ ½ô¬¼¼ÅÓ¾ÚßÓÆ/½«‡“ÍjÀñ»Á½ï½à$¢ÈăˆŸ;µ†éĂƠ¹Úï½½Û«‚ ½9¥ÈßÁ¾rçÚ©ØÛ«‚ ½9±»–¦̀»ÁĂñÓ½§Ó¡×ƠơêÏÔ¹Ú¡ÔÖÆµØ½·ÔÖØº™‹™‡ƒëöÛ«‚ ½9„ثڹÚÎÔÑØ–¾ +Æ¿ÅûÙ“È·¼Í7—¶Å»±¿‘«É̉¡Û¹åƒ«‡“ÍjăˆŸ«‡“Íj´.¤Ù¡Ûª¼ÙŒë*«ɹ«‡“Íj“¹ƯN…ä…Ö®GøßÚ–¶«Ô±»ưÀ»đÓºöÁÊǃvË̉«‡“Íj߈ăàíê¹Ú™‰kß [ïSëö÷ÔÄù×8¤‡߈œÜ·‡‘×8çăÇíÚª‚ +¼99¥‡Á̉%ơÔÏÔÔơô߈÷¶èÓỞ‹Ç¡Á÷Ú¥ƯߌÛ,ÛÀ÷Ú9¥‡ÙÚ׿8“Æ«‡“Íj™‡Û«‚ ½9«‡“ÍjÅÓĂºêöؽöÙŒë*«₫®¶ù׺ù×ö€ºÙÅë̀Ê)èÛ8¤¡Ô½ù×û§Ó™Á™‰kß [ïSù×Û«‚ ½9öÁ¶!!Î̉íê˿۫‚ ½9¡È„b%á$ɹ¹Úª»Û«‚ ½9ëáëö×¾™ëéåù×ĂÙ™‰kß [ïSÄØÛ«‚ ½9ÿÚÿÂËÉ9çÚÛ«‚ ½9ÂÖéÓÏÔ«‡“Íj·‡‘×8ç«Ô×ÜóĂÀË߈߈¿ºƒØ“˜·¦D# #«÷ ËûƠïßÛÄÓØ× ÍÓÛ«‚ ½9À̉ê§ù×íêëöÏÅ÷‡ó’¹ÜNíØâà∮¾©ÓƠºm½©‡¥2ßëMÙ×ơêëö߈̀Ọ́|“ºăˆŸÂ0 00¬0°à00èM0ºщƒv½‚v«‡“Íj±»·¼Í7î +²2ôĂÙ¶ÅøÜĂÈÛÄÓÙÚÛÚ™‡ƒƒ(èçØY³ÆÙ×ơêÙÚơ»yÏÔ§ÔăˆŸ;ï»Û«‚ ½9±”½€ÿ¯¶®×«Ñ™‰kß [ïS±¿±́¯Ơ¡ÛÙ½ÏÔ߈‡º­ÖƯơÙÚ¾ƒˆ«‡“Íj·Ø—¶Û«‚ ½9ªÔÀƯß»ûÑĂÛ«‚ ½9óÇÚª‚ +¼9ó{“ÆÅØ×̉߈ø×™‰kß [ïSå̉ ĂÈăˆŸ;ư¡ØÁ׫ÑăˆŸ;·ÅĂÙ¦È.«‡“Íj߈ĂơèÅëöÏÄưÀÛÄÓƒvưÀ±»£‡ÏÔ‹ÜÚ×ÑÓ‹Û°™ÔÓÏỖˆÁÚÖ·#Û«‚ ½9»ß›¾¡ÈóÇÏÅï‰ăÔï³29¥‡øô™Á™‰kß [ïS¿ÅǼưÁíê³È½ĂăˆŸ;¼ï»Ó̉È¥Ưï»Û«‚ ½9½€±»ơÔáêÓº¡Ûå(ç$­½¼’¹%ÜN2­ÄßÅ—Ó«‡“Íj¹ÚÛºƠîÀڱőóÔå̉ ¸Ú½Ô­Ø*Ñ+ăˆŸ;ñÓÅ₫ëö«‡“Íj€Ø‚×¶Û«‚ ½9öÁÏÅ‹Çñ×Û«‚ ½9­‡ÛÆÁ̉ưÀµØÀƯÙ½³G̃»úÓÅ¿‰ÑæèîñÚíäù‡­vívƠ«ÔÛ«‚ ½9%½ôăÇíơêƒÔÏÓרù×·‡‘×8ç©à“ÈÑÄë̃ˆ©‡¥2ßëM˜‰j̃ZîSĂÈ›Ơ³Æ£äÿÅíÁÙ-…à£Ô­Ä̀ÓñÆÅØå̉ ™‰kß [ïSĂĂ“éÛ«‚ ½9»á ÙŒë*«™‰kß [ïSߥˆ]1áƠ÷Á¦ôÏÔÛϺÏÔ§Óø×ƒÚ´†ăˆŸ;ÏÔăˆŸÏÅÙׯ¼«·3uU‡ÜñÆÛ«‚ ½9ׯ©Ø™Ó§ÔÛ«‚ ½9ÍÓÏÔÿ¯¶±»½ưÀăˆŸÏÅ“ƠÑÓ›¾˜‡×Ơù×ùơÏÅăˆŸ˜êè䫇“Íjø×µØ®×­ÛĂÓ̉‹ÜÙƠëö©ƠÁ™Ó‹Ç¯G‹ø’ºÉ·‡‘×8ç´́ÏÅêö‹Ç±»Ù½ơéơÂó×ÔƒăˆŸ;˜‰j̃ZîS߈“Ȥƽ€ùן±¿³b£ÔƯÓ ñÓçÚ™Ó¯È×¾¥ÆÅ­½¼·Ôß½«‡“ÍjăˆŸ;kÛÄÓÿ$ëöĂÙóÇù×™‰kß [ïS›¶éÿ¡ÈÂÙû(ß»ûÛ«‚ ½9·‡‘×8çĂÈỞÏšӧÔÛ«ä¹Ú¥ƯÅÓƒv…ÛăˆŸ«»ÏÔÏÅ—•̃ˆ ăàÖ Ô† 6 ¦j ‘ Ơ¾G½ë³¹ÅăˆŸ½Ù-ëö¯¾Û«‚ ½9ÛºưÀ…»̣¶—»ưÀ‡º‰¿Iƒ¾‘×׃v—ØÛ×ù¾ªÚ­v™‰kß [ïSÙ×·‡‘×8çƒàívùêăˆŸ;k¾ÑÓƒv«»ûÁd±»™‰kß [ïSçÚ½€Ϻ›‰­Äù׿ØƯơ9¥‡¡ÔÏÔ©‡¥2ßëM߈™Ó™‰kß [ïS¬Öǵ†›Ú—Óƒv‹ĐăˆŸ;köÁ4‡Œ‘®ÛÙ½ÅØ˜‡ÍÇÿ¯¶¶ôÓØÛ«‚ ½9½€¯Üï³2¡Èß„·Ó ¥0ĂÙù×ø %«‡“ÍjºÅưˆ‡º«‡“Íjÿ¯¶©Đ•Œ—–ßÚù¿«ÑÛ«‚ ½9¥ÁÛ«‚ ½9щ­ÄÙ½¿º¡Û8¤‡ëöƯơ¡È±©ØÅ»ƠXÛ«‚ ½9«È…àÛ«‚ ½9ù׾ٽٽ³ºóá$ß»û‡ÍƠÏÅ»©¼ÉáщÓ ‹›æëö‰¯¾¥Ø¯Èï*¶±»«»9¥‡«»ÏÅñÓ€ƠÖÆ“¹ƯN¿‰ÙÚß»û›¾߈Ë̉߈ùêÛ×Û«‚ ½9¾ºר̉̉¿‰½±»߈¯¾«‡“Íj™Ôø×щø×½€å̉ ¹ÚרÿÚ±¿ăˆŸ;Û‡Ă†ºơê÷Ú©ÇÑØëöǽ°»½å̉ ăàƒÖôÛ«‚ ½9¹Ú°»ĂÙ™‰kß [ïSƒvø×ëöÎ̉ׯ߈çÚÿ¿±»½μëö¡ÁÙ½“Ơ߈ËӲƾªÔ­œ·̃Á½ăˆŸ;±»“ȇ,ăÔßÁåIˇ›¾ʹµØÍÄôlÏÔ¡ÔÍÓơù×ĂÈÁƯỞÇÖÏÔϺívÍË)éÛ9¥ù×Ơß»ûÉÛ‰̃ºơêÏÄ¡Û߈³Â†Ç½¢»“Ù̉󽑨Œê*ªƠûưÀ½€¡ƯôăˆŸËÉ9˜‰j̃ZîSéÚǺ«·3uUÏÔÿÛ¿ßɹÚª‚ +¼9…»â~™ôÛ×ô™‡ùë» +ù¿ÛƯ¼ÅÓ½µ₫®¶Ù½ưÀ¥º…»ÂÙ¦Ó½¥ˆ]1ưÀ½ăˆŸ;ĐÓ™ÓăˆŸ;ô×ÓÁ̉²Â¡9¥‡ơÔ™‡™‡‰±6‚ÏÄÛºœ‰¾I«‡“ÍjÛ«‚ ½9™‰kß [ïSù׃vμ£ÇÑÓăˆŸ;Ë …ǡԜÁù×ÿÚÅÓÜÂơêĂÙƒˆ£Ø߈›Úé¾Ë%Û×·¼Í7ơêÛÄÓçÚăˆŸ;Ù×ÓØ¹Ö½ÔÇçӕóÏÔ›¹‰ơ9¥‡ÑØĂ©Ç™‰kß [ïSÏÅƠXù×µØÁ̉±»ɶ߈çºÍÄ¥«‡“Íj̉ˆ”=Ăđ¾×Ơù×±»¹ÚÀĂ¯¼ç$™‡·Å‹ß™‰kß [ïSéê±»ù×™‰kß [ïSăˆŸ;ăˆŸ˹8 ¤‡ á ƒv¹Ú©‡¥2ßëMëđ̀Ê)èÛ8¤ưÀ‰¼êöµØơê¹Ú¯¼¹¾ÏÔ¯vỞ½˜‰j̃ZîSÿ¯¶ƒØ×̉£‡ưÀ—Ó¥ˆ]1ÑÓù×߈Ï̉¬ØϹ’Æ߈¨Ç%Û«‚ ½9ơ»¡Ï…ƠÇÖÏ̉ù×í‡÷æù×Û«‚ ½9ÁƯ÷ÚÖÆă­³ëÔ‰ùסÔó±»±»³’ù×ëö›¡¡Ê—¶½å̉ ù×9¥‡ׯ™‰kß [ïS´Ă¡»¹È詃vùêÍƠăˆŸ;ÛºÙ×·Ô÷‡ÑÓ™‡¾ÁƯù²÷ˆ½½ßơÔĂù×§Æù×ÍÓÀ½ ÏÔăˆŸ;¿½¿ÅÛÀÙ½‹ÜăˆŸ;¯ª9¥‡ăˆŸ;ƒĂÇÖøêŒ½ÍÄ˹ơļĂÙ½‰Ûψ«‡“ÍjÛ«‚ ½9ÏÔ¯G‹ø¡ÛùêÏÔÁ̃…öĂÙ…öèԶ«‡“Íjù×íÁ¡Û˜‰j̃ZîS½¿ßù×Û«‚ ½9·‡‘×8çưÀÏÔá=Û«‚ ½9ËÇơê·‡‘×8çÆÖµØ«‡“Íj¥Ø¹Ú…ôƠăˆŸ;̃ˆ …àëöªÚ±»¾›·Ô´Èÿ¯¶±»¯È™‰kß [ïSôê¬Äº ÑÄëÁ‡é/×:Ç̉Ù-¾Å½Üáç±»‡ÇÅÓÁƯ÷Ñ·¯ƒßͯ¥'=U#QK¯Â߈×2öÓàùử½¾‰¿I˜‡ơ…±»€¾ưÀÆá Û«‚ ½9ù×—Ó¶Ô€ö·ØÔX߈ùê°¿+Á̉«Ô÷Á£X¡ºơÔ­ơÙÚư‡±ù1ĐÓÚÀáê›Ú™‰kß [ïS›¶é Û‡Çó¶ÏÔ½ĂƒvƠ·Ô8¤‡ù×߈§Ô½Ü…߈ÑÓ‡«‡“ÍjÔÓñ×çÚ™ëé婇¥2ßëMù×™Ô‹ÇÏÅëö&‡Ú9¥‡µ÷¾ºÓ‚÷Á¸ØöÁĂÿ¯¶ùº‹ÇµØ«‡“Íj¡ÏÅƠ%º8¤‡‘³ÛÀ“¹ƯNÏÔº‡Ù½ëö±»°»ù×́ơñÆÅ»‡ŒÁ›¬¶¥È«‡“Íj™‰kß [ïS«·3uUÅÁµ.¥Ù£ Ùô¯ăàùל‰¾IÛ«‚ ½9ÏÔÛ«‚ ½9ĐÓ¡/¯×̃ˆß»ûg½€½Ô÷‡ëöá íÖ9¥‡ƒ×À‡€è/Ö:¡Ûç̃ñíȹÚÈ©ÓºÖÆăˆŸÛ«‚ ½9½£ÏÔ¹¶ÁĂĂĂưÀĂÙßƯ­§ô©‡¥2ßëMøê ˜‡ăˆŸ;¿‰íSù×ơÛƒÓ¾•ŒÛÚßÁ¢Ç̃ˆ ¾Åëö£äÙ½Ǻ½«Ô™‰kß [ïSßƯ‚Ú½ ăˆŸ;ăˆŸ;Ù½¿‰Û«‚ ½9«‡“Íj¿ßéêÏ̉ăꇌƒ̃߈ËÇÁñ»½̃ˆ߈›¾á¬©½9¥‡×¡ÙºÚª‚ +¼9ơê‚v½¯ÿÚ±»»ˆ‡ºăơùêÁƯ¥‹ÛºèêÛ«‚ ½9ÂÈíÖ«‡“Íj߈ÏÔơếº¯×ÏÅăˆŸ;ÿÚá굉«‡“ÍjăˆŸ;¹Ú9¥‡½€çÚ«‡“ÍjµØơêμóÇ“‹ù×ÙÚ±»À̉ÅØ߈߈߈œÂÏÅ¡Ưƒˆ¬¾ÎÅßÏÁ½½ëßÄÙÿ‡®·ÆŒ¾˜‰j̃ZîSÛ«‚ ½9«‡“ÍjóÇ߈‰íËÓ·‡‘×8ç§Ôùש¼÷ï»ûÙƒÖå̉ ö‡Œ·ÔƯ‰ÏÅ©¼½Á%ÍÓÑÓù×Ù½ÏÅéØÁƯÏÅâßÁ±»™‡¡Û‹ÙŸ·Ø©‡¥2ßëMñÓ±»·ÅǼ«Ô¡Á·º±»ăˆŸ;ÙÜ÷Á½ÏÅßÚÛ«‚ ½9°»߈ËÉ9ÙÚưˆçØÙÚµØơê±»½¹Ú§Èơê‹Ç9¥‡×Ù½ÑĂµØ‘ÆÍÓå‡Ơ²È́ơÔ½߈ưÀëö“÷ɶï«…ôÏÔƯ¦Ù½·Ó ¥0Ởẳ±́¬¶đ±»«‡“Íj­½¼Íļ¡ÈăˆŸ;kăˆŸ;“Æ—ăĂƠ¹à÷Á“7ÏÄ·ÔÛ×ăˆŸ;ËÖ×ڵؤˆ\0Û«‚ ½9óÖÏÔù×…%…ƠÅØï½™Ó›¶éÛ«‚ ½9±»ƯºÙÚ«‡“Íj̃ÚçÚÙÚñÓ«‡“Íj›Úë̉»ÅÿÚ—Ó«‡“ÍjơÄ­ÔÆĂôøëÿ§ÏŤÓăˆŸ;Ϲ¦Ó‹Ü÷‡¯×ơÔçmﻃvĂÙ§Ôï‡Î +。ÔÅ߈ăˆŸ·ÅG½¹‹Ü°»ƒ×Ă Û«‡“ÍjµØĂÙăˆŸ;›¶éơÔ߈߈ÅÓ©ØÛ«‚ ½9·‡‘×8çÚÀÇÿ¯¶í—GÓØÀ½“ÈË¿©Ơ‚v™ÓăÂG½¹ÍÄ£ÇÍDZ»Ơ°»«‡“Íj釽¥Æ­ÔĂôưÀóĂ½«‡“ÍjÅ«‡“ÍjœƠǼ«‡“ÍjăÁ̉ÆæØ™‰kß [ïS™‰kß [ïSûÓÓÅÁ -¼!Ûºá±Ï̉Ç"ÅØơèŶUUƒvăˆŸ;›Ú¥ÛÙÚă»°»¡Ô9¥‡×£Ø±¿™‰kß [ïSÑÄëăˆŸ;ùºÓăˆŸ¹Ú™×ëÚ°»¥ÏÅÓ· +¹ÚĂƠÎÔĂèÓñÆ™‡ÏÅ—¶Áñ·‡‘×8çº½ăˆŸ‡ßÄÙº–À™ÓÙÚöÁëö™Ó߈Ë¿ưˆ™‰kß [ïS¹ÚÛ×Á̉±»–Œ‡ŒéêÇÖáƠ߈åñ¿û̉éÓ‹Ư­Ä›¾ØºĂÙ¹Úà̉¹Ú9¥‡ƠÛ×ûØŸ}Í[í߈ùêô—Ó—¶¯¼‰Û«ÔăˆŸ;¡£é¹Á̀ĂÛ«‚ ½9‡‡¡Á‚v†ŒñÚ9¥‡×«ÔëöÛ×Û«‚ ½9ăˆŸ;·ëÚ·ÔơÔ«‡“Íjï¶›ÚÏԵاÓÀĂëƠđĂÑÓ½¯‰¯0’¾âÁëöô˜ÔÍĂéôÚª‚ +¼9Ù½»çÏÄơèÅ߈Óà‹ÈÓÓÿ¯¶ïÁÏŶÔÇÓåßÓź—–µØ§ÔÙ½߈ăˆŸ—ÓăàÚª‚ +¼9½ĂÙÙ½‚ˆµØ—¶´Ü‚n Û׫‡“Íj™Óï²2ưÀöÁÚ× ÏÄÓ¡Á™‰kß [ïS¹Ú‚vó›¾߈ô©ÇµƯÉ̉÷ˆƒ₫Ơ“Ơ8¤‡ĂÙÏÔ±»ÀƯÍÄá “Æ÷ˆñÖ±”ÓØ©Ó—ÓÏÅÑæ÷ÁÏÔÓµ•׫ÔĐ+ß»û‚íǾÁ=ơÔ±»ñÓ Á¯¾åïăˆŸ;ËÇô°»Ưív¹ÁïÚŸâÅ™‰kß [ïS±»8¤‡ơ꿺ÁƯ«‡“Íj·ÅÓº®ÓÙ×ĂÙ½ôÁ„ÇÖ‘ÈƠµØ½à÷‡₫§¡Ç½÷ˆ…™·‡‘×8çù¿·­RơèÅ—¶±ü­ÖÁÚ̃Áµê‹ÇÁ̉8¤‡éꛡ۫‚ ½9Î̉‡ºÓØßÄÙơÔÙY×ĂÛ«‚ ½9±»½€öñÖó^¾ªÚ™‰kß [ïS̃ˆ9¥‡ר³(×ÚĂÙÙ×ù¿ơ꫇“ÍjÏÔ½€ñÖø×ŸÙ½§Ơ÷Áơê ËûíØ™Ó™Ô¹ÚÆÂÙ߈Óµ߈«·3uUƒ½ÆÅ«‡“Íj“ø—¶ơ곋ÜÁÓ‘Óçô¹Ú½߈º9¥‡÷Ộ½€ĂÙâÄÍĂû(Ź™‰kß [ïSƉ»ùêé‰ñ5ñ·™‰kß [ïSăˆŸ;½ƒÀÙ½¡ÔéÚöÁÛ«‚ ½9«»µØºßÖÿ¹à̉ÚÆă»½Óé½Û«‚ ½9¯¼ÑæׯƒÚó×ßÄÙËÉ9Ó¼ăˆŸ;߈÷ԻعÚíÖưÀ°»ơÔ¨ĂĂºÛ«‚ ½9öÿ©Ó· щ—¶ƒĐÙ̉«‡“Íj±»É̉·Ô¿áÂÛ«‚ ½9®GøÔóî߈‡Œ«Ôÿ‡÷‡ÍƠ™ÔÀƯ±»ÅÔÖ$§Լ»Ơ½§Ô¿Å«‡“ÍjÙ×ÿÛ±»…'¥ÓÙÚÛ«‚ ½9±»¡ÇµØöÁÅÄùê¼÷Á߈„ø¿‰ñӫԣȇ߈Ơª»Ư‰n¯ôÛ«‚ ½9±»߈Û«‚ ½9ׯù×̀Ç߈ɇ·Üù×½¾‡£ä·‡‘×8çÏ̉ÍÓ‚v¹Úç'߈¹Ú“ƠΞº +Û«‚ ½9¬Ä‡ŒÙ߈‡ñ5ÅÔ¡å̉ ¿ß«·3uU½ƒÔ%ùơƠºm•ÿ“Èï½ëọ̈±»Ă©‡¥2ßëMëöëØ•Èû›ŒE½¬È±»ÿ¯¶óÖƒ›¡¼ ưÀă¡Ô9¥‡³ºó·‡‘×8çƠá“Æ«»å̉ µØÿŸ}«‡“ÍjăˆŸ;k¯È˜‰j̃ZîSרơêơ…ù׿똉j̃ZîSÏÄ÷Á߈ñÚ÷êỞ•C߈íÓÑÄëÑÓr÷ˆ½ÇÖ¡»‡Œ½‹øĂù×Ç♉kß [ïS€ºÛÄÓûÀ‹ÇƯơ‚Ú™‰kß [ïS½µ–»Øô ûÛ¡Û·Ó ¥0¿‰÷Ù—¶³Û«‚ ½9÷Áöơ«ôÀ̉ƒv¡Á™‰kß [ïS¬¼¼¡%«‡“Íj‹Ç®ô¹áÙ½߈ÜôöÀÛ«‚ ½9¡ëÚ›©‡¥2ßëM¢ÇÙ½µ‰÷ÁÏÄѶÍË)éÛ9¥·ÔÛÀ߈Áă±»ĂÓÏÔáÛ“ăˆŸ;©;¥Û™‰kß [ïS…ÖÁëԓ½ùêË̉¿‰ĂÙƒv±»—»ưÀăˆŸ;k¹Úëöÿ¯¶ÏÔª‡’̀j”©Ø×ÜÛÚº8¤‡ăÁ¾º +™Ó•ǓƱ¿ÁƯ½öå̉ ß½¯È«‡“Íj›¡ßÄÙăˆŸÓ¹Ú‰ÔÁƯ›¡ù×ù×­Ô¥Û©½ÂÈÛ«‚ ½9­ÄåÁĂºÁÅƠđ»§ô‚˜×ăˆŸù×߈́v +°Á“²£Çƒ½ÎĂ₫ÚEù×ơ»Ù½‚v½€ù׃vëڋܫԋÇÏÔ½Ô±̉ÏÔ߈ëọ̈ÇûØ«·3uUơèÅ™ŒÅÔ¡Ơ÷Ù­tÙô₫ƒ½ÚÄ̉‰ÔƒÖÍË)éÛ9¥ºûƠ™‡߈ÙĂÈưˆßÚ¹Ú›¾ơÄơêöôé ‡ñ5ĂÙÛº™‰kß [ïS½Ü£Ç«‡“ÍjËÉ9½ă»5Ú×½ÚƠ±»ïi¡ÔÏÅ…ôÛ×í|ÏÔÆØ­¾ÏÔù×Ë(áÓ9¥‡ỞÚ×›¹ÑÓöÿÛ«‡“Íjº—Œ‹ÇÛÀ¡Á߈›¶é™‰kß [ïS™‰kß [ïSù׫‡“ÍjÏÔïiéèºÅ¥±ëØÑӵ؇½›¾¡Ơ›¹‰ÔºyïÅÔÏÔ÷‡ƒÖ«»™‰kß [ïS¡ÁĺâˆÚïù×åĂźƒv°» «‡“Íj©¼›¾³¹̃­ÄüÁ¬ÖFÙÚÑÓ‡‡“́vĂȱ»ëö÷Ú¯¾ÅÔëö»Ü™‰kß [ïSù×¼ô×¼Ư÷ˆ­½¼·Ô’½ăˆŸ;¿Åè‚ưÀëÓÛ«‚ ½98¤‡ĂỗÁ¹½ƠX½ăơăê“Æ×¾¥â±»äơÏÅ‚ ÿ.ËÖëö±»‹Üăà÷Áù×ù׿‰­€™‰kß [ïSư‡±ù1÷Ú·Ôµaù×ö¶‡™ăˆŸÏÔÏÔăˆŸ;ñÓÉĂÏÅ£ä› ƒv‡Œâ¼ÛÄÓº¹Úù×±½ÏÔÛº›¾ù×ϺưÀÓÅψ÷‡ùוøëæׯºÁ·ưÆØ„ÏźØĂȃvÍË)éÛ9¥¥ÁǺ›¾±»ƯÀÎëö騥ˆ]1³û¾Á½Ï̉ù×ăơ¬¾ÏÅñÓ™‰kß [ïS•êƒvÇÖш¦Ơï»ơêÏÅÅö™Ó¯Ó÷Áă߈₫ÚƠºm߈ăˆŸ;ÑÄëăàƒv°»›¶éϹÿ¯¶³(Ăí»‡¿º¶Ü¿çÚǺÇÖÅô߈ưÜ·Å…Û×Ưˆ®GøÍÓ—»ÅĐÓ₫Ú9¥‡ÅØóÇÿÚ¾·‡‘×8ç±»ĂÙù×ăˆŸ;k«·3uU™‰kß [ïS±»ĂÙÊçƠÙÜÍÁÇÖƠXµØăÙ½ơÔÙR̀ĂÉÿ¯¶½ÏÅñ™À™‡—ˆăÁ‡ºï½ÏÓØñÓơÔ¡ÁñÓÛ«‚ ½9Úª‚ +¼9̉ÆÙ×Ù½°»ó¶ù×ÅÓ³¿Å¢ÇăˆŸ;Ù×̀B›¡Ù׼ÁÓ¢»ÿÂÍÄר™‰kß [ïS¹ÚëÓ±»²Âù×µ×ÏÔ9¥‡ÏÔăˆŸ;—~ÏÅ›¾æ̉ÙÚöÅ–ù×…àÏÅ›¶éâÁÛ‰—ˆ̉Á÷ÂÙÚÉĂÑÓăˆŸ;íÚÁ ¨›¾ÇçÛ«‚ ½9߈±»½ëĂÙ¯¾Á9¥‡ăˆŸÏỐÆ™‰kß [ïS‚Ú¹Ú£Çëö›¾›¾›¾‘±¯$ñÚ8¤‡Ö™‰kß [ïS±»ăºéêƒv‡Œ·¡g§Ó°»±»å̉ º½ׯĂÙÏÅ麼̉ÁĂÁ̉¿́å×·ÅëÔ¨¼Ïĵ؇9ƒˆ¡ÈÚª‚ +¼9ä̉Á̉±»Ÿ}±»âˆÓ›vǼ߈ëöĂÈàؽ’½߈µØ߈ử«‡“Íj¡ôêù×–¶›¡ÓÁ́Æ™‰kß [ïSÿÚëö¹½—¶ר¡Ô·ÅG½¹±»‹ÇăˆŸ;kÿ§Á éÓܽ€¥”ÛºÍÓ×Ơƒvϼ«‡“ÍjÿÚ·Ó ¥0‡x̀ 9¥‡ù×ÙÚăˆŸ‡ơÔÅëö±»ù×ÏÅ¿‰µØ›¾ËÖ›¾™ëéåơÔ›¡Û×ăơëö°¿½ÈăơÏÅø×ñÓù×ưö›¾¯È߈ÓºƒËϼ÷Á©‡¥2ßëM“Û¿ë‡ÙÅë߈ƒÿ×Û«‚ ½9¡Ûü%Ơ߈”ù×›¹ĂĂ ›­±àéM½ƒÚûÓƒvàƠí¸ÍÄ¿½¡Ûç½ùº™‰kß [ïSÿ¯¶á=רÅĂÙµêÁ‡é/×:ºy߈­ÄÍÓ™‡Ä½µîÔ·‡‘×8çÿÚÙ½÷Á•¾ăˆŸ;ɇÚª‚ +¼9¿¹©‡¥2ßëM·‡‘×8çÛדƠỞ›¾˜‰j̃ZîSº“ÆÉ̉µa߈ÏÄåƠ§Ö®Gøö›¾¸ÚÍË)éÛ9¥‹Ç×Ó†½®GøË̉–»öƒÚôăˆŸ;Ù‹ÜơĽ¹ÚóăÍÓÉÖÀ½ƒÖ™‡™‰kß [ïS³¹߈¿ßơê™ëéåû̉½ÁÚ±ëØùû­Èù×åƠñÓ™‰kß [ïS§Ơáö9¥‡ăˆŸÏÄà=ôÏÔ¾¹Ú¹®â»Ï̉ù×Ăº‡ŒûƠïÁ‡ºå̉ ĂÙëöù×™‰kß [ïSơؽ«Ôƒ½Å±»ÍÇëö¹—߈釀ÓĂĂ ›­±àéM·¸…ÛæôÏÅÅô¡Ô‡Ú‹ÈöÁÛ×½ĂÛÇ·Ô•ÓăˆŸ±‡ôºƠXËÉ9шϱƯƒ½ư“ƒØŽ³ß»û±»óÂÍÇ¢X×ÓÙ›ÚͽåôÛº“ÈÑĂöä5̉£°«·3uU—˜·̣‘ơĂÈÏÔ¥ˆ]1Ϲ³è‰đ5𶙉kß [ïSÛ«‚ ½9ô¿»À‡€è/Ö:̃ÄØ‡¿±»¾ß7ôÏÔ±¿¶==åơ«Ôăê¯G‹ø¡ÅÔÙ½µØÛ«‚ ½9¥ˆ]1ù×Ư†‰—˹“¼ưÀÙÚ¶£Ç°»Û½›¹ö×ÙÚ«Ô«‡“Íj»³ÿÂÛ«‚ ½9±”ơêûؒƱ»÷ÁÛ«‚ ½9¯È¾ºßáîÏÚÏÅËÉ9ĂƠñ¨¹Ú¿‰˜‰j̃ZîS‡öå*«Ô›¾9¥‡×ûº±»«‡“ÍjơÔ₫•ŒñÚÿÚĂº·Ó ¥0Ï̉…Û«‚ ½9‚·¼Í7‡°½Îăˆ‰÷‡ŒÍĂ·‡‘×8ç¯ƠăˆŸ;×¾¹®߈ÅØ§ÔíêªÚ”N‹Ç¤ˆ\0ÏŰ»¾»9¥‡¼µØ€ºưÀ«»ëöå̉ åÁÍBăîÓñÍÇëíø°”¤ˆ\0©Ư¡Ô߈óĂƒvÅÛ˜ÁËÉ9ưÀ÷¼߈ ø×ăˆŸ;‡ÇÅô±»ƒvŸ»Û×¢sщëöơêÁÏ̉«Ôÿ¯¶ƒˆĂÙ‡º¬Ä·‡‘×8çÅÓ¹ÁßÄÙö¬¾ÛƠ±»߈™ëé啌ùÊ¿‰‹Ç™ƠÅÔ·Ô°¿ĐÓÏÔ™‰kß [ïSÏỞÏÄ@ăˆŸù×Û»‡ÏÔ߈½•ŒÏ¿9¥‡ÔăÁÑÄë߈£ØŽơêáêÑÓ±¿‚ù×9¥‡ù×éÔ‰Üؼƒơꙇù×ÏÅÙŒë*«ÏŹ›¶éèơ‹Ü¡Û™‡ÿ$·ÔÏŘÁỞÚÀ(ơêƯÂßÁŸ}¾„ƠµØͼĂÙÏÔ«º§ÓËǻõÈÿ‡áêăˆŸÛ«‚ ½9ƒ¥ˆ]1­₫ưÀ™‰kß [ïSÑÄëϺƒvëöŽÍË)éÛ9¥ëö±½ÏÅ¢ Ù×ÖÆ«‡“Íj¿‰µØÓصؙ‡ù×…†9¥‡×Ûǽ¼̉¢ÇßÚÏÅưÚÍË)éÛ9¥̀ ‡¼±»ÿÚíÖ§ÔÏ̉Y¶ºó^˜êèä«Ô–ø†xƒvÿ$ăàÙ̉ÑØÙ×Ăº«‡“Íjá —¶Ïԭăˆ߈¡Èăà×¾ÑÄ벫‡“ÍjóĂûñ·‡‘×8竇“Íj±†“«‡“Íj“Ïù×Û«‚ ½9ñÄÙY™‰kß [ïS“¹ƯNƒvĂỞ©&ÙÚñÓùê×Ơ«â…Ø›Ơđ߈ăÁÛ×ăˆŸ;‡ŒÉ̉–¾÷Á΃בwáêÇëÚ߈Åô›¶éÏÅơ꫇“Íj¿‰ëö¬Ö±»ùºƒvẲ«‡“Íj9¥‡ăˆŸ½íÂÅÓù×ëÚÉ̉² ÑÓÛ«‚ ½9ƠÙóÚµ/ƒ¾‘¹àÔXÄÏÅ©¼ÿ¯¶Ù½“½©‡¥2ßëMĂÈ₫®¶£»ƒå̉ ĂÙ±»ívµĂßÿ¥ț¾Ï̉¦ô»ô£¿™‰kß [ïSưÚÍÄƠX­Ö£äŽ«‡“ÍjÍË)éÛ9¥ÏÔ™‰kß [ïSƒ¾‘ơê₫®¶ƒà«‡“Íj—¶¹Ú¿Å×¾±»—¶ÅØÁƯ¡9¥‡Î÷Á“íµØµĂÏÅ“Æø¿³ÄÅÓ«‡“ÍjăˆŸ;kĂÙÏīșÛÏÄ—¶ù×¶đ8¤‡¹Ú±»Û«‚ ½9½ëöƯÓ ăˆŸ¶ëö‰¾ƒƯÏÔÁăĂÙ߈Ă ÓØ߈ƠX›ÚơÔá ƒvǼ±»Û~ºØ·§D ×¾º÷à™‰kß [ïS̃ÄØăˆŸ;½´Øé‡¡Ûº·‡‘×8ç©Ơù×ç̃ÏÅưÀô£Ó«d—»›¾åई\0œ¿Û×ènøê9¥‡ê¼¼ÏÔÛ«‚ ½9°¿)麩ӫÔÏÅŒÉË̉ÂÓ¾ơêÛ«‚ ½9ÍÓ‡ăˆŸ;kù׽ܱ»­œÁĂÙăˆŸ;Ù̉ÿÂÏÅ—¡Á¡Ô܈ù×ív­½¼̀íê·‡‘×8瘉j̃ZîSÏÔ¬ôĂĂ ›­±àéM½ Û«‡“Íj•ÜăˆŸÍƠ«‡“Íjß»ûôơçơ»½€χơÔ¿»ŸÅƯÓ Ù½Ѳ˾íÁÇ%ÿ¯¶©Ưщ©ÓÙ×½“Æñ×́vƠ߈½ÙÚÙ½™‰kß [ïSØÅêçºưÀ‰¿I½ôÛÀÇ÷«Ôù×Ë ăˆŸ;ÛÄÓÊÈ9߈•åß°»ưÁí—G·Åƒ×åÁÏÔ›¾ª÷‰Ưùê¡»ÿ¯¶¹ÚưŧÓç ÛÄÓÙÅëóÔ±»ăˆŸ;¹Ú߈ˆ¯àëöº½§ÆËÉ9Û×·ØÙÚßÚ¾öÔ«ÔçØØˆùט‡ÛÆÛÚ¿‰©Óđ̀Ó½߈ư‡±ù1ÿ!Ù½ÁĂĂÙ£Ô߈‡ÇßÄÙÁÊ¥Û‘ơÓÁ÷ÁÏÔÛ«‚ ½9߈‚¾½™Á½ºóÇùếÅ™‡çÚ»ÑÓöÓºÏÔÁ½ÏÅăˆŸ;kÁĂ₫®¶ÛÄÓÁƯ«‡“ÍjăˆŸ;Ù½«‡“ÍjËÉ9ƒÔʿ۫‚ ½9¡ƠưÀ¥ˆ]1ÓÅ©‡¥2ßëMö÷‡™‰kß [ïSíÖƠ·¼Í7 ÈͼÍË)éÛ9¥Á¼™Áơê߈‹ÙưÀχ¡ù¿½ιƯÓ ăº¯Ûù¿‹ÜÆÛ«‚ ½9—Ó߈‡‚v±»߈ƒv³ºóÇøëöå̉ ߈á ßÚ„Ö߈9¥‡Û«‚ ½9±»ëö¤ÈÏÔơêÙ½¼€§¹ƒö匿NƒÖ±»ơêÙ½ÁƯÛ«‚ ½9ăˆŸù×—¶¼ăơ±»ÎÅ€Ù÷§¹³ÂĂº¼ÔÂív·¸áêçÚÍË)éÛ9¥“Æ÷Á™ÔƒƒÔî½¼Ô«‡“ÍjÛ«‚ ½9«‡“Íj™ØÏÔăºÅ±»±»¡ơêÛÄÓÙÚ÷Á™‰kß [ïSÏÔÓÅ÷ˆáƠË[ÎÅ÷ÁĂĂ ›­±àéMÏÔ…ÔÛ«‚ ½9³ ù뽺¶ÔÏÔå̉ ÏÔ·Ø™ÔĂ٭ă֫‡“Íjïç“ƠơêŒE‹Ü‘ÈÙÚÙ½ăÁϾ¥O¡È¿ô‡Œ½×ƠóÄÊ%ơÔ«»߈ûÓ¹Ú–¶ÎỖ×ĂíJƒÖÅàù×ù×½«Ô™‡›Úơ!đ½Ö̉«‡“Íj‰¿I£»é½›‡«‡“Íj—¶½¾ºÏÔÂĂÛÔ³Øç'ÛÀ߈«‡“ÍjĐÓăˆŸ°»Ă¼Ëǽî½ñÖùêé—¶ÏÔ³¾«‡“Íj˜‰j̃ZîSÑÓŸ}«‡“Íj8¤‡ ƠºƠºm‡†ù¾áê¶̃ˆ¡Û‡ŒâÁï‡Î¹Úºëöû£ÔÁĂí'˜êèäÏÔ¾(‡·Å±»™‡ư“ăˆŸ;kÚÆù×·‡‘×8çÁÏ̃ˆÅÓÍË)éÛ9¥ăˆŸ;ëöÙÚ8 ¤‡ Ö‹ÜÓ̉™‡¹Ú­½¼ñÚÙ×ÓŶÔÙ½ƒÖ‡×ô»‡ÑÓ9¥‡×¡Á¡Ưª‡’̀jÅÄ䯂Ó̉¡¢ÔƒvưÀæÇÛ«‚ ½9Û«‚ ½9ù×ÅÄưÚ—¶û­½¼Û«‚ ½9ù×å̉ ßÄÙĂÙÛ«‚ ½9ÛºÓŽZ³ ÍÇÙ½ŸÅ¥&ÍË)éÛ9¥ê؃֫ԙ‰kß [ïSÏ̉«âÙÚÓoٽଇºăợÉ¡ÔÛ«‚ ½9±»ÛÛ×°»¿9¥‡«‡“ÍjŽùêéÓƒà¹Úăº•Œ¶9¥‡ñ¨«ÔơêÛ«‚ ½9ÆÖÛ«‚ ½9½€ç̃¬ÈñÚ«·3uUÿ¯¶›¾™‡ÿÚĂÙÛ«‚ ½9ßÁ³ ₫ÚáÛϹÚÛºáêÙ̉ù×߈ăà©)Ă™‡ưÀÓ̉ư“¿ßưĂ÷Áù×ÏÔ§Ó߈±ëضŮ)ù×ô‘…½Èß“™‰kß [ïSăˆŸ;Ù½¡hÆßå¯râÄÙŒë*«Ö¾8±»ưĂơèŃˆ¡Èù×ÛÂÆÛ«‚ ½9“âáê­Ä±‡Ôç̉ψ¹Ú‡(ñÚ߈¦ôăˆŸ;ƠñÓ½Ù×µØỞóÚ×½—Ö˜‡›‡íÆ%ÓÆë½»Ø‡­½¼½ƒ½‹¿ñÖ—¶µØ9¥‡§ƠơêµØ¥ƯÛ«‚ ½9åĂ›¶é°»‡ºÛ×ï»ăˆŸé]ÑÓ¹Ú§ÔĂĂ ›­±àéMʹ߈¯ÈÅǺ¹Ú±¿ơÔ÷ÁÍ0§ôĂÙ9¥‡ä̉ß½߈µ‹Î̉¹̃èê„Ø­Ä•׌₫°»Ûº¼ô«Ô‹ÇÍnăˆŸ½×ƠÔXù×€ÇÏžÿÚ½ÙŒë*«¿Øùë¹DØ-ăˆŸ£ ˜‰j̃ZîSƒÔÙ½™‰kß [ïSÏÔ™ÛËÛù×§ÓÅ»‡ñ5…»Ïû(ĐÄêàÅ÷‡ÈĂ¥Ø9¥‡×¾Ở±»Ï̉±»ëö«‡“Íjăº±»ÁƯµØûÚƠ¼€‚ô˜¶€µ—·¼Í7™ëé图…nù¼íêÿµ™‰kß [ïSkß [ïS½ÈåßưÀ·Ó ¥0‡ŒÚ׃ڃv߈ÁÛÀÖÔ†6¦j¸Ú0™‡ÔÅăˆŸ;‰¿IÏÔĂÙÛ«‚ ½9½Ă8¤‡ÖµØëÖóÇÏÔ£äË%©L½ÂăˆŸ;k¥ˆ]1Ưăăºùê§È—àßÏùêơꙉkß [ïSĂÈëÚó|êö +ÅÚª‚ +¼9±”ù×™‰kß [ïSå̉ ưÀ±»ÏÔ›¾ÑÓ±»«̃øë̉Ù½gưÀ¯¾—ˆÇا¿Ơö¿ô­Öƒv¯È£äÏÅ퇼ŸƠ¶‡Ö8晉kß [ïS¨Ó«º¹Úɇƒv©߈·Ôƒ•ëÔÍƠö±»’¹ÜNù×ÄÓỔ³ ƒvϺÖÔ†6¦j±ëعûá̉ÿ¯¶±¿¾«‡“Íj«‡“ÍjÿÚËƠ™Ôå̉ •󱱿ưÀỞ÷Á߈¹à߈ÏỔƃØëö²È«ÚíÚ½€ĂÙ¡Ô匿N©‡¥2ßëMçÚÍƠÚª‚ +¼9ÂÙƒv—¾˜‰j̃ZîSù×ùơù׳ÈăˆŸöªd‡Û߈›%ƒà­ôÛ«‚ ½9àꇺÏÔ¥ÆÚª‚ +¼9å̉ ÿÚ«‡“Íj̀¬H“‹…Ö¿®ñÖ½éºÛÆÿ¯¶ëöÆ̉%´ùê·Ó ¥0¶™‰kß [ïS¾™‰kß [ïS9¥‡ÏÅÉÖÁ½™‰kß [ïS ÛéÓÛ«‚ ½9ĂÙçôôÁ¹߈ÙÚ±ÜÏ̉9¥‡‘đ÷濺ӼƯÓ ÅØ¡È¥ˆ]1ưµÿ½—ͽ‰´É̉ƯÂÏÔÚª‚ +¼9ßÁ‰¿I¶%%ÖÔ†6¦jåïăˆŸĂô%ÙÚ°»÷꺫Úш›¾ăˆŸ;k±»߈Ù½«‹å̉ ÏÄ¡ÛÚŸ}½½ùט‰j̃ZîSƯÓ ÏÔ&ăˆŸ™ơ·ÅëöÛ«‚ ½9ăˆŸ;ÜÖ¹éºÜÚ˹äô +ö‘Æ€ëƒ߈ÖÔ†6¦j›¶é߈ùê©ÓÇÓôĂÛ‡éê‹ëÍÓơÓá £ä±»Ïåù×èê¹Úù×öçÚîô¿‰á¾á 9¥‡­ÄÛ«‚ ½9‡ÚÏÔĂÙ÷¼ăˆŸ;köÅÔñÓ›¾ш÷Á¬Ôé‡èÚÓºÛ«‚ ½9±¿«‡“Íjˆø–¿ù×ơ꛾ù×߈•Û™‰kß [ïS¹Ú«ª¿ô§ÔÚÑÓŸƠơĂù×±»ÿ¯¶Ưï»ù×ăˆŸ;kؽÓÆÙÚŽ™‰kß [ïSµØ§ØƠÁĂưÀÿ$ñƯڽ͛¶é‡Û±»¿đŸ¾ÆÅÄû¤Úª‚ +¼98¤‡ï»¶Ă¼Ù÷Á±»ăˆŸ;ÁÙ¥ÓăˆŸºÜÓ íêơöÀăˆŸÅÔÿ¼ÇĂ˜‡±»Ö¾ëöÙÓ‡xÓˆ•=‘ơĂăˆŸ˜êèä¹Ú‹É0ÛºñÚá‰ơóƠ±»Óº—¶߈ÓÁư«‡“ÍjĂÈù×ơú™‰kß [ïS¡ỐơËƠçØíÆ—Ø£äơê¿Å·‡‘×8çăÜư“Û«‚ ½9ºÏÅ߈½“ƠÙ½£ØïºƠ±»ỔÅ·±»ĂÈÀĂûÓ½‰¿IÅØ°¿¯È“Èéê·‡‘×8çƒç'µƠ½ăˆŸ‹Ü‡xº±»߈ưŒ÷ÁĂºăĹÚÓØåŸ˜‡߈›Úƒv£ƯăˆŸ;½£Ó™‰kß [ïS«dËÉ9·&—»₫¼ÏÅÏÅÿ¯¶±»ÏÔöå̉ «‡“Íj߈µ†—ˆăˆŸÙŒë*«ó:ÏÓÛ«‚ ½9µ†ëöùש¼áöÁ½Üº£Ô‹Ü×u߈àöåăêù׃vÛºưÁëö±½Å¥™Á·‡‘×8ç½™‰kß [ïS9¥‡…ÔóÔéÚÑÓ½ͽï½½€·#½¯È«Èëö‡·öш«ä‹Ü°»…Ú‡±¿ù×ûر»†Çå̉ ±»½ÁƯ…Ơ½öÀơơ³ÓÛÀ¹Ú8¤‡Ơ³´ÙÓÛ«‚ ½9Á¼ß»ûơêÛǵØó×Ăº¹̃ăˆŸÛ«‡“Íj£Ó‡d¿ß™‰kß [ïSöƒ§ô­öµØ—Œ‡ŒÛº“ƠđÄ™ơç„«»̃ÚÙÚɇ߈ù×ĂƠ•«Ú½éꕽ™‰kß [ïSɇù×ơ÷Úăơ³ƒ½ûßÄÙ߈±»µØÍÓ±»Ü¼ÑÁ¹¾ÅăˆŸ;Ë¿жù×шÇÖÛ×ÑÓëö¼£X—»Ï̉Å–Á̉ÏÔƒv“Ơ­Ø‹Çºî½ÛÁƼé‡ÍÓĂÙ«ÔÓÅ«‡“Íjç$¸Á±»£Ø«·3uUÅÅÛÄÓÍÓÏP›Ă™‰kß [ïSׯçÚ£Ơá°ỞíÖăˆŸ¿ßÿ¹‹ÇÏ̉ÑÄëÁå̉ µØÛ«‚ ½9ɱ«»ï½߈߈ÏÅׯ…ÛßÁ³ׯù×ơèÅ£‡ù×Ơ­ÄºÏÅñÓ“Ơ½¯¾“Í¿ô߈ù×ívèÓĂÙĐø¼€™‰kß [ïS̉ÆÙÅëßÄÙ”½íê™›:ëĂ¼ Û±»™‡߈ăˆŸ;̃“߈çÚ™‰kß [ïS“ȵ‘ÏÔùêǼ—ÓÛ«‚ ½9߈ù׵؋ÜÿÚù×ö¡Û½Ô÷ÚÍÄù×ív£‡ĂÙß»ûÅàöơºÙŒë*«“Ơ߈±¿ö¹ÚÏÔù×ö̃»úçÚưÀ‚ +ÏÅ“Ơ«‡“Íj½ôçÚ½ô÷‡ăꪇ’̀j™‡§шöĂÙ±́ưÀæÚÚº8¤‡ÖÛ«‚ ½9…nó#߈‰¿IÛÛ«‚ ½9ÙÅë½Ù³ưÀÁĂïçÓØĂÙÖ̉Å–§ƠÁ̉¿‰Ăʹ‡äĂ«d½€™ëéå߈¢«‡“ÍjÿÚÅઇ’̀jơèÅơ»ù×9¥‡ăê₫®¶éêï»ă ƒ½û£ä9¥‡¡Ư¹ÚÏÔ˜‰j̃ZîSùש¼øê ɇ“§Æ±»«¼¡È£Ø×ĂºØăˆŸă»‰yߌÛ,á×™‰kß [ïSĂÙ‹Ûù׫‡“ÍjéÚµ.¥ÙăˆŸ;­ØÏçÁ¶ÙÜ߈½©¼èꙹڿßÑÄëÂÀ¼ï½³ßô9¥‡·‡‘×8ç¿ßÙÚÛ«‚ ½9ÑÓñÖóÂ×ƠùꃈơèÅ߈¥ÓºÙƠ½ñÚÅØ÷Ú9¥‡¨Ó›¾µ.¥ÙL«‡“ÍjŸÅÛ«‚ ½9ívơÔ›¾…ô›¾ÅÎ÷Ù±»́º¹Ú½ö½Ë¿Û«‚ ½9áƠ§Èøơ§Øùê¿ßå̉ çm3›¾‹Ü´‰©¼ºÛ«‚ ½9„ÍË)éÛ9¥ËÇ¿ßÔÍÄ™ØëÔÏÔùêÙ½ƯßÄØµ†±»߈™‰kß [ïS«·3uU‡ºÂº÷ˆçÚÜÙ̉‡Œ•½ÏÔç4Íí­¦™‡ÏÔâàÛÇ“Ơ‹Çׯ“È„ô ߈«‡“Íjơê‹Á§Ó9¥‡×ºÛ‚÷ˆ¨ÀÁÜé‰ñ5ñ·©¼­ơ¢ÇÙ×Û×÷ÁĂÙ“Ơív­Ä»Å¼Óç“ÇÛ¡Û–ºƒÀ¥Ô¥ˆ]19¥‡éÓâÄ ù×óǃv­v—¶߈ÏÅ߈ù×óÇÚÀ—ˆưÀÅØ‘Ö§ĐëØ§Æ›¡³à‹Üé‡Åı»đÖ‡̃ÑÅŽÛê½¼ø×«»ͽƯ™‰kß [ïSË%Ă¯G‹ø.9¥‡ ÈËÇÛ«‚ ½9ăÚâêÇÖ”Œ(¡ÔëÏ“Æ×ƠÏ̉ÙÚôÖêê«Ôɶ…ŒéêψÛ«‚ ½9ÛçÚ߈ù×ăˆŸù×·Åâà)ăˆŸ;˜‡ù×í½߈ß»ûß»û±»Ú×™‰kß [ïSË¿ÏÔ9¥‡™Áƒv‡ºûÓéçѶÅ߈ÑÓºù×ßôÓ™‰kß [ïS§Ó…»±ëص½Ô™‰kß [ïSÅÓË̉‹ÇívăˆŸÿÛ½ÔÅØ“ƠÿLJÛרƒvø×ÅÔ±¿Û«‚ ½9ͼưÀÏţ䱿¯àÓØåĂ¡Û¿Ø’½³Í“Ç©ÖÆ¾ß¤«‡“ÍjĂÙ›¡Ÿ}ÏÔúÀ›¾Å·Ù½ç̣ŸÛ½µ†Ơ¼£Ç±Á›¡ÿơµØù×™‡ߌÛ,©‡¥2ßëMù×߈ɇщ߈·Ô9¥‡åßÿÛÂưÀÏ̉ñÁóÇùß»û·¼ÅñÖÁƯƠ¡Û›¶éÛ«‚ ½9ÏåöÁ ơê«Ô«»¹ß–ÏÔ«dÏÄù׳€Çç½Á™‰kß [ïS‚ØÅ»ÏÅ£äóÇ·Ôçºå̉ ÏÔ«Ôÿ¯¶ÑỡÎõØ߈ºôÙÚƒˆó¡Óáê•ÿ“Ơ”Œ­€ơꘉj̃ZîSëöÇ̉Ö¾ Ëû½éơ“ÆƠµơ‡ù×™‰kß [ïS£ơ±»½ËÇŸÅáêÅ¥°»ÏÅĂëöµa×}ÎÅăˆŸ;ÿÚù×߈ô›ç¹ɹᬙ‰kß [ïSµØ Û™‰kß [ïSÁ‡é/×:Ù̉£ä•̉á̉‡ÔX·Ô¿ÅéÚÇÜÏÔëöùׇ̃ĂƠÑÓçÚÿ¯¶ÏÔƒv9¥‡‡ÇỂÙ½ÙÚÏÅÙ̉ễăˆŸµØçÚ½·‡‘×8ç·ÔơĂ‹ÜṆ̃ÑÓ©Øù×÷Á‡“›¾ôÙëö™ô°½ÓسĂÙ׃v«‡“ÍjÏ̉ÏÔï‡ÿÚ›¾›¾ÛÄÓëö‚¾•ŒÅØ÷êù×ÙŒë*«·Å«‡“ÍjÆĂ¹Ú9¥‡µaÁĂíÆ¨‡¤2€̃êL½ÙÜŸẸ̀Ô±»Ù×ï½Ñ·ÍİÁ«‡“Íj¿‰ÎÅù׃Û×₫éØïÍĂÙưÀôêÙ½ĂƒvÛ«‚ ½9¹Ú¹ÚóÇÙÚÁƯùÍĂºû½€ÏÄ¿ív±»ÂÙ½…±»†“̃ˆƒv¥ÖßÁÙ½Û«‚ ½9ÑĂù׸àÉ̉™‰kß [ïS—¶˜ơƒĂÙÑÄë³×’È¿ßÏ̉©‡¥2ßëMŽø×߈¡%©Ø©‡¥2ßëM©Ó½ÅØù×Å‹ÈËÔßÄÙ×¾Óàä̉©‡¥2ßëM¡ÔưÀƒÚ¡ÔÙ½ĂÙ¾ï³2ƒv¹Ú™‰kß [ïS±¿ÏÔ‰Ôƺ·‡‘×8çÅÓÅÙß»ûÛ×É̉¡ÈªÚÁ̉‰‘—~߈ùדƥƯ¯È±»“ÈÛ«‚ ½9ŸÖơÔÛ«‚ ½9÷ÚÏÔÑÅăˆŸ;¯‰¯0›Ă»ôƒ¡ÁíÆôêóÇÑÅăˆŸ;k­§£ØóÔí–GËÚÀ߈ó‡“ó§È%½·ÔơꙇñÓÏÔé‰ñ5ñ·ùêö÷‡›¶éƯÓ ÏÅăˆŸƒÖß»û9¥‡öÛÄÓăˆŸƠá —ÈĂåÁÙ⩼«‡“Íj½¿‰µÏè¼ÛÀÑÓÿÅÓ›¾“Ơơê³Ø•Öÿ¼»´†˜‰j̃ZîS¹Ú°êØÙ×»½­Ä¦Ô«‡“ÍjƒvỞº¤ˆ\0ưÀÙ×ĂÙ‡x±¿ëöµ†§ô„ÿ¼Ù½ÂÓ+Ù׺½î=Ü̉líÁ‡x8¤‡Ổ£Ó‹Ùçô÷Á™‰kß [ïS„ƠöÅÓƠçÚúƠăˆŸ§Ø߈¡Ô§Ô´aùêƒ’á —ˆ…¡Ç¿ØƒvŸ}­ØÏ̉ÏÅôØ›ơÄÅ•Èû›˜êèä¼€ëÓƒv•Üٽ߹¹ÚÑÄëù×Á̉᥾»»Å»ôÏ؉j̃ZîS½¹ÚɱÏÔ‡ŒµÜöŽ×Ơ·¼Í7Û«‚ ½9ïƠéºóÇÆ£Ó÷ÁƒvÇØÛ«‚ ½9Ù̉™‰kß [ïSơêʹÚÀ1̉ÁƒØ«‡“ÍjÏÔù׿ØóÇ÷ˆưÀ¥ ÏÔÏżù×éêËÉ9‹ÇÙ½©‡¥2ßëMﻡÔÜÓ ƒ¾‘ÏÔÁƯø×éÚñ¡ÛôÔáê߈ƯÚÑØË̉ƒÔÇÖưÀñÓ—¶µØ£éÁÜăˆŸ;kƒ̉Úá ­‡¡ƠùÚÁĂ©áêˆư«·3uU³«‡“ÍjÏÅ߯Óăàâơçđ׿8—¶™‰kß [ïS­Öƒv·‡‘×8ç¹Úù×ÇÖù×ĐÄꕌÿÜơꀺäƠáâÁƒØÛ«‚ ½9¶ù×ÙÚ‰¿I¸ÚÑæÍÓ£äù×ơꧺ™‰kß [ïSÙ½ơøƒ߈¶èñÚđÚ§Óǽÿ¯¶ÇÖªĂƠ‹ă߈ùƠ9¥‡ăơŸéÓñÚŽɹăˆŸ;k¸•ÿ¯¶ÑÄ냈ñÓÆÖùש‡¥2ßëMåÁ²ÆíÙ½·¼Í7­Äéÿ§Ǽ˜‰j̃ZîSívÏÔ±ƯïÚ×Ă§Ø³Ü—¶đÓT“È“¹ƯN¿»Ù½•½ƯÓ ½½ăˆŸëö߈‹ÇѯÔ¯¾°êØÇéơÛºẳƒˆ—ïÚª‚ +¼9Úª‚ +¼9·ÔÙ½ăÇíÁº™ĂÍË)éÛ9¥½€‡Œ“ÙÚ¹ÚÛ«‚ ½94“ƠÍÓ™Áå̉ 9¥‡Á́߈Íđ߈±»¿ßÂÙù×gÛÙÚ™‰kß [ïSшéºÑÅ“·‡‘×8ç…÷Á“Ȱ»É(ư‚ƒvó¹±»߈ÏÔưÀÂÙ߈„Ø¿Ùö°»ƒ^›Û¾å×ă»́&ÑÓ½›çăˆŸ;‰¿IĂÈ™ĂçÚ¶¡ÁÏÔ߈½‹‚°êØî½©ØÇØĂĂ©ÓöÁ½«‡“Íj†Ç‹ÇÏÔÀ¼èê¿́¹ØÙ×ÁĂƒv™‰kß [ïSƯÓ ÎÔ÷‡Žø¿¿ßÁ¹߈ùסØÑØ•½“÷®GøƠ½» Ơ¡ÁÍË)éÛ9¥·Ô©ÓÁ̉̃ơVÁш÷ˆ«‡“Íj߈₫ÔµØ9¥‡ñ×ô±»ăˆŸ;ĐÓʃv9¥‡߈¹Á¡ǺÅí³¹ÚÚª‚ +¼9½̃ˆíÖƒv₫³¾߈¹Ú™‰kß [ïSƠºm½€‡ÚÛ»÷ÇÖÉ̉ă‘·ÑØ½€ÏÔß»û/™‡ÎÅ 9¥‡¹Úù׳àø×¹Ú­€ÿ¯¶ÜÚăˆŸ;Û«‚ ½9‡Ç™‰kß [ïS¦ƠÑÓ¯Ø÷Á«‡“Íj¹•ơêëö½ơêơêăˆŸ;ß„éêöƒvß»ûá ¨ØÅÓ³ÂöâÁ +Ûº«·3uUơêđƋǩÓÏÅÏŵv’¹ÜN §4ÏÔ¿‰¡‡é®߈ëÓăˆŸ•Œ™‰kß [ïSóùå½€æƠ÷ÁÏËÉ9³—¶››ÏũDZ»Ơ¸Å Ë̉Û«‚ ½9̉̉”¿»‡ŒµØÏ÷Ô9¥‡ÙÚ©ƠùסÔÅÏÔÇֽت¶2tT¼ÁĂŸÅÛ«‚ ½9ö©¼°ê؇»¦Ô²ØưÀ̃ˆ߈ÏԣǙ‡ùæ™ôßÁơ$шƒv»yÜÔæƒ¾‘ƠX«Ô¡Ô»ØµaùơÛ«‚ ½9£‚‰\8¤‡ù×í$ö—¶»ª¶2tTË¿·Ô§Ô–́«º½Ú“ȰÁ±»ù׫»8¤‡Ö“ƠÛºÏÅÙÇơÄù×™‡ßô£Ô¿áÛÙ±»ÎÅÓÆ8¤‡×«Ô‚Ú%¹Ú8¤‡Ö߈±¿«‡“ÍjÙŒë*«ơêíÆ… Ăº±À«‡“Íj›¾¹Á˜‡‡Œ¡ÛµØ«‡“Íj¶Û«‚ ½9½·Ô¥Ø÷ԟű»ăÇíÁ̉ÍÓÍƠëö₫®¶‡äÓÔơê¿Å÷v¥ÄơĂƠڭľƒØ°»Á̉ß»ûŽáê‘«ŸÈ½́vëØ±»²½Ă’ïÚÛ«‚ ½9¯Ơ¿ß—ÓÏÅĂ ÓÅ×Ơ•¾™ÓơÔÅØ–ÓÎÅ Û«‚ ½9øê¥óÓÓ±»ÙÚ³ºó½ơÔ‘¾ßű»¹ÚÏÔñÁÛ«‚ ½9…ؽÿ¯¶«‡“ÍjưÀíêßÖĂÖ·¸ËÇ«‡“Íj¿^Ó´±»߈—»óDZ»ơèÅỞÿ§ñÚÑĂû(«ø•Ô³½¾‡™ëéå©à¾‚¾##ăˆŸ;Û«‚ ½9£àÏ¿²Âº¹Á¾«Ô›¶éß̃ÏÅ—ŒăˆŸ;ÏñÆăˆŸ;ù×gß»û“ǵ؛Ơ½gá ÏÔÓº«»߈߈ĂĂ ›­±àéMÖØ¶Ô“ȯỢéÚ½ÿ¯¶Û«‚ ½9©¾™ëéåæº«Ô×Ó×¾ÙÅë«Ôª‡’̀j–¶—¶÷Ú±¿öª‡’̀jÑÄëÛ«‚ ½9÷Á°¿‹Ó¿#Á¼ÏÅÙ‡Ï9… Ôå̉ ñÓƠơêÍÉʾÙ½ƒ›¾‰ơéÓ‰[–¾₫¾äؽ߈ùêĂñ»˜êèäŸ}½Ü«ÈÛ«‚ ½9¡Á·¦D, ,ù¾̃ÄØш©‡¥2ßëMÁ‡ơíØ÷›¾ψá$ƒ½‘Æù×Û«‚ ½9éºÙÚ—Ú½ÙÚƠ™‰kß [ïSׯëöí—G«»™‡‡º­Äáđ¹ÚƠ9¥‡ïÂÙŒë*«Ư«ÔâĶöÁ߈«‡“Íj‰Áé«»™‰kß [ïSóÁ̉ÿ¯¶ÁÛëö£ä‚×Û«‚ ½9߈Á¹«Ú‚Ø÷ÁY“Æ‹ÜéÚ±»ơ껽…Ô—¶«‡“Íjï½ùשØ߈Ơµ†©¼Ÿ}§Ô߈¡ÔáØƠ½ĂßÁµØ±»¡Ø˜êèä÷Úùׇ,ÅÔÏÔù×öƒv«‡“Íj«ÚÍË)éÛ9¥ÛÔÁ½«»÷ÀÍË)éÛ9¥ÁöÁÍÜù×€Ơ±»ƒ¾‘«‡“ÍjëöơÔó‡ñ5Ư‰£ä‚ÍË)éÛ9¥ú±»“¹ƯN«·3uU÷‡ÇÖ¯×ëÔ·Ó ¥0—¿ù×Óˆ•=‘ÛºçÚĂÇñ5Ǽ…Ž߈ëö¸£ª‡’̀j§Æ¹ÚƒÅÓ߈éôăàëöù×™‡½“Ơ« ©ƒ»5‘«ÏÔ¹·?çÚÛ«‚ ½9ù¾Ö¾8ÖØÁÜ5߈»ôèăçNjٷݾ™ÔÅ–¯È߈”ÇÇèƒÖ9¥‡ÍÓ‹ˆ£ ¿½”ÿ¯à¥àÓº߈ߌŸÈÓØêö™ÙÍË)éÛ9¥¾º ¯±‡ñ5÷Áï½ùëăˆŸ;©ÓÅØ¿‰“Çử«ºà ¡ÈÇÖñÓ‹Çù×ÑĂ¿±»߈ưÀ¿ºÛ«‚ ½9ÑĂÙÚ‡Œƒv₫ǥؓđ…ôè¼Ù½Ú×Ơ«‡“Íj†ÇöÛ×ÍÄË¿Áƒ¾‘ùêÁÛ™‰kß [ïSºÿÂÍvƯªưÀûƠÑÅÏÚ™‰kß [ïS¿›¹—»ª‡’̀jÅô‡“ÛÚ¿ô½Á¹™‰kß [ïSŸ½á»ÁÍøă»߈Ë̉Ǽ«‡“Íj‰Û«»‡Œ‹à߈ñÓ¯߈Ѿƒ»ˆ߈ăˆŸ;½€™‡ù×°»«‡“ÍjÛ«‚ ½9Û×Îq…'ٽ߻ûƒvăˆŸ;kĂºçÉÏ̉̉Æ…ôï»ù×ÍË)éÛ9¥Û«‚ ½9ÏÅ—¶Ù½å׫ÔÙ½¸ÚÁ¡Û—Ó¥Û›¶é© ‡“߈߈™qƒàƒ½Đæ9¥‡”&­Ä¶è™‡‡ÛăˆŸ;Ľ’¹ÜN§Û©‡¥2ßëMƯÓ ¶Ô߈ăà½ÁƯưÀ±»ù×ÛºÙ½ßÚÏÔ¯“Æ9¥‡¡»Ù×ÛÇ·‡‘×8çăˆŸ;Ï̉Û×ÏÅÁÿ¼¯ƒßͯ¥'=U#QK¯ÂοßÖØÖ¾Û«‚ ½9ÅØ³ÛƒvđÁ¹ÚÙY¹Ú™‰kß [ïS‡Œ¹ÚÑØ§ôñÓ§ô߈½Æư‡±ù1Ơu߈Û«‚ ½9½Ô¿ØĂÙÛ«‚ ½9‡›·ỖÛ‡µÈ"©%¢ØưÀ“¹ƯNÀ ơêç¡Ôù×­—‡y¿‰©ÓỂ߈ơº·Å¹á¹ÚÓƒˆ9¥‡°»°»߈“²éêĂºÙÚÁƯ›!±»·‡‘×8çƯ‰½€½€ÏÔăˆŸ;«‡“ÍjùëÛ«‚ ½9¿‰êö߈ăꕌµØ·§D ¢ä±»‚vĂº¡ÛÙÚçôÙ×ß„ÑØ߈µÈ†Ç°»·‡‘×8ç±»·Ô¯¾߈âˆ:ÍË)éÛ9¥ÛÅ›¡̀ÓÜÙ༅»½È÷Áé×™ëéå¡ÿ£‡±»½ăˆŸå̉ ĂÙơÎ÷Áơếº™‰kß [ïS™ÔÅØƠ÷Ú߈ù×éÚÜæÀÑ Ă—… Ѷ·Ô©àëÚ›¶é™ÁïƠ›‰ưÁèÓÏÔ½•½“ÑØơèÅ«‡“Íj›Ú§‡±‹¿öY«‡“Íj¿ô±¾Ù½¡Ô²›¾ù×׾麱»ªÚ³ÛÀ«‡“ÍjψщÀ¹8¤‡ÏÅ÷ÁÓºçÚ‰¿I߈½€¥Ó—ˆëö¿àĂ­±»ơÔÏÔ¿»ËÙÏŇx‚v¡ÔÙŒë*«ñÓ½^™Ó½ƒ¡Ô™‰kß [ïSå̉ ăˆŸ;ÏÄëÚá×±»ưÀÏÔ«‡“Íjơ‡ù׋ÇÿÚå̃ùe±»È»·‡‘×8çÛ«‚ ½9ÏÔ½ƒv˜‰j̃ZîS…ؼ‰ëöÙÅëÁÚ߈™‰kß [ïS‘ÖôÏÔçºívÏÔăˆŸăˆŸ;ñåơêåĂ­ÖÏÔĐÅÙ°¥ÆÁ\÷å5Ó«·3uUÁ½ÎÅ£XçÚÅ»¹ÁÏÔ±»ëöù×§ÔÓ̉ẩÑű»›¶é߈߈ϸ߈¢Ç§ÔçÚ‹Ç­Ö÷ÁûÓ…ö˜‰j̃ZîSº—ơÿÚ·‡‘×8çƒvƒˆöÙ½›¹¦ØÏÅÙ½ăˆŸ;ォ‡“Íj·Ô½Ø¾âÄ×ƠƠóÇ·‡‘×8ç±»ĂĂ ›­±àéMƯ™ÁÑәԺا‡̣¶ăˆŸ;º‡xùטêèäỗ¹ ÙÚÛ«‚ ½9óÄăˆŸ‡÷ÁÁôéÚĂÙ8¤‡×«‡“Íjª»îÅß»ûÿ…Ù½ÍƠÿ&Û8¤‡Öôê‹Èù‡ĂÙ°»½àÛ«‚ ½9½9¥‡Ó½™‰kß [ïSÆ ¸Ú›¶éñÓ«âï²2ºíÖ¯é¿Ø·ëăàÏŶԷÔâˆÏÔƒˆẰ̃ÙÙڵ܉äôơȡÁĂÙä̉÷êºĂÁÙïƠ…âÑӣ䫷3uU±Áù×9¥‡×9¥‡‚¾ô™ÓƠ“ƵØͼơêºÄÓ™‰kß [ïS½…€­:¡Á¡Ç‡º[—¶×ÚâÁÛ×̃Ö±» Ø‘׃ˆϼ¼Ô¸àܗ“Íjùê÷Úƒv‰¿I¡Á¾̣Ă Û«‚ ½9ؽ·‡‘×8çív•Èû›ù×í‹ù×Ù̉™‰kß [ïSĂÙÉܱ»đ»±»ëö«‡“ÍjÛÏÔ™‰kß [ïS߈ÙNƒ¾‘ß„§Ó«‡“ÍjÛ«‚ ½9¥ƯÀĂËÛ¹ÚơÔívöá Û«‚ ½9¥ˆ]1ăˆŸ;ñÆûœÁÇĂÏÅÛ«‚ ½9ÙÚƒvß»ûƒ‹ÇÑÁ·‡‘×8ç½€g¹̃«‡“Íjÿ¼ưÁÏÔÏÔ½‰Ôù×Û×·‡‘×8ç¿“È¢»ÏÚ‡Çø¾Ăºơềù×ÁÓƒvÛ×÷Á‹Çù×ăˆŸ;°¿ÏÔ‹ÓéÙ×ùæÚÀ¥ˆ]1˜ ê è ä §éƒváÛêöĂ¿‰×Ơø×—ˆ™Ó«‡“ÍjÏÔñÆ™‰kß [ïS̉®Û׃ÖÛºù×Úª‚ +¼9½ë·Ó ¥0₫ăˆŸ;±»²ÂшơĂÙ½¡ÁƯ 9¥‡½€ó#ËÉ9ψ½Ç»Í·ăˆŸÆ9¥‡×9¥‡×ï²2‹ÇÏŋǗ»ôĂ9¥‡8¤‡ÖƠÚ³ºóÄÔá ̃Á«©Ü£XÅØß»û§Ôÿ¯¶ƯºöÁ1¹Á½ô“Ơƒœ·̉ ¤0¯¦ù‡‡»î߈–¶ù꫇“ÍjăˆŸ½€ơéù׿%ơê½€̃„ÙÚºy³Â·¸߈ùדÈĂÈñÓƒvĂôÏÔăˆŸăˆŸ×hùơ™‰kß [ïS±”Úׯ…¨›¾ĐĂăˆŸ«&ăÔáê±»“ÛñÓ™‰kß [ïSëñàê¡Ô±Áϼ÷ÁỞ¹Á™‹ÁƯ™‡¿—Ó±»ă‹Ó±»Û«‚ ½9ơèŹګ»ïÅ·ô¢ÔÁăˆŸǼ¥ˆ]1–™‡¹€ñÓ±»ºï»8¤‡ï½ŸÅ½ĂßÙ½“ø¾ÙŒë*««‡“Íj±»«‡“ÍjÛÚĂĂ ›­±àéM½“Æׯƒ½Æ÷‡™‡ÛÀ™Ó±»µ.¥Ù•Á½×ÚщªỘÇÁ¹“Ʋº̣©‡¥2ßëMă‘¡Û½ƒvívÛº°%¿Åïů¾Áƒˆƒv›¾º߈½É̉±»÷Á9¥‡±Ü§¥߈¡Á«‡“ÍjÏÔº©ÓĂÛ«‚ ½9·Ó ¥0³¹™‰kß [ïSư“ÅØÍĂÍÇ™‡·Å³¾Åù×ëöÏÔ½€ĂĂ ›­±àéMû€^ƠăˆŸ;§ôăº«ÑßÅׯÿÛ·ºßÁ«â9¥‡ÏÔÛ«‚ ½9×Ơ†7§jú™ÓÏÔ´†ÏÔåôù׫‡“ÍjÉÖ8¤‡Ù½™ëé噉kß [ïSưÀù×ÙÚăˆŸ;‡Ú₫Ç ’Æ߈ƒvÙ×ÏŦÆÏơèŹÚăˆŸ;ÑØƒØ߈”ôêµØÏÔµî¡Ç±¿ƯÓ «‡“Íjù×ử¡ÔơÄå̉ ăˆŸ;ÿÚÅÔ™‰kß [ïSâà×Ơ—¾º߈·Ü凴aºÛ«‚ ½9ĂÈù×çÚ¦ÈÛ«‚ ½9ƒv…»ƒv§(ƒàơê±ëØùÚ½€Ï-Ơù׺Ņ•±»ÁƯ±»Û«‚ ½9߈‡Ú½ù×Î̉¯Ơ¦ÓÅà¡Áχ©¼öÁÛ×øê½€áÜ”Üå̉ ß»û߈±¿­€±»‹Ó¡™‰kß [ïSÛ×±»“߈߈±¿«‡“ÍjÜÙŒë*«ƒv‡ºáÛÁ̉Û«‚ ½9¡Ô›¾ăˆŸ·‡‘×8çÛ«‚ ½9Î +Ë¿—¶ä̉±±‘³ÏÔù×8 ¤‡ ׎·ØĺͼĂÈÛ«‚ ½9ñÆ Ëû·Å߈ñÓ«‡“ÍjñÚó|»̉Ă߈£Ô›Ă«‡“Íj½ÈăˆŸ;Ù½ƒv§Ô­ØÑÄë³ôâˆßű»É̉ÛÄӓȡȰ»ùæ€Ơ÷ÁÛ«‚ ½9ËƠơêù×ÏÔ«»ăˆŸ;ÑÄë„ÖÓºơÔ­ØÁ½á ­½¼‹ÇÏ¡ÈÂÙÓÔ«Ôù׃ï‰Ù̉ä̉Å(˜È·‡‘×8ç¹Ú™‰kß [ïSơê‚v“Ơ«»‰¿IƠXÙ½¡Û“¹ƯNă­›¶é§Ô£Ç«‡“Íjëö‡×·Å§Ô·äô´Ø‘Æ«ÙÂ9¥‡·Ó ¥0öïÔ¹½÷‡ƒvử˾•½ÓÅ È» ׇ‡ư2̣¹ÚĂºÖĂ ׯÛ«‚ ½9«Ôä̉»ôívĂŽÇüơêÁĂÏÔß»ûỞùëÅÄ×¾¡ÈëöŸáö™‰kß [ïSÏÅĂÙ9¥‡ø¾ÅÓăˆŸ;¿ô÷Á˜‰j̃ZîSÏÔƒˆ¶èÛºÛ×±»¼Ù½›Úù×é‰ñ5ñ·߈߈ơºưÀçÚó½¨Ơ™ØÏÔÙ½¥ÓöÓºÑÄë¡Ç÷Á½Ôź±ÁëÏ̉ëöưẠ̀ ÛÍƠÀÛĂÙ¼ĂëöÊƠƒv‹Ç̉ÁÄôåÁ³ØщăˆŸ;9¥‡™‰kß [ïSùׯ“Ơ­€ï»ơêËÇơèÅ›ÚăˆŸ;ù×ëö߈ĐÓ“ÆïÚ«‡“Íjµaƒ½«‡“ÍjÅ̃„ªÚ +ÏÅ̃ÄØóǘ‡χßÄÙđó–Ï̉ù×Û«‚ ½9äô +đÄ`¯ƒ« +>¥ÛÙÚ߈ŸµØ‡Œ̀Ê)èÛ8¤ÏÄù׳“ƠÛ«‚ ½9ỬñÆåƯÚ«‡“Íj˜‡̃Úؽƒ½¯ƯÂù×íÚ…ÑÑÓ°½Ăß»û÷æÏÔñÓÓØ«×ÙÚ߈ăàóùׯ‰¯0ñÚÍœû•ÿëöù$¶­Ø¥Á…»ÙÚ±s´.¤Ù«‡“Íj±»çô¿ôÍË)éÛ9¥ÿÚ›¶é±»ƒĂ‹ÇÊÓ߈ëöÍß½€ñÓ½à º¡Áª‡’̀j¡ÔÓº³Ø…Û«•ëöŸÖ·âÛ«‚ ½9“ÛƠăˆŸ‹Û³†Œ(((Ă×ëö•Èû›ĂĂ ›­±àéMÙƠ¼½¶‡Ö8æơê¹àؽ¹öº߈å̉ ÏÄ™Á•Áù×̉º«‡“Íj‹ÜÓØǺϹ«ä-Ư¼áÛå̉ ơê¹Úå«Ô›¶éÏÔ÷Úä̉ƒ×ưÀƠ߈Úª‚ +¼9ƒˆ›¹ÉÏ̉Ư—ªÓơêăˆŸöûË̉¥"åÀåƒØ“ÆñÓă½±»µ†»ĂÙÆ» Ơ±»óÔƒv®È‰¿I»¼‘Á £ä ÔơèÅƯºß»û†Ç—¾ÑÄë“Æ̀Ê)èÛ8¤«‡“Íjƒv߈£äù×·Ôä̉&&µÄ¡Á¹»ÑÁ$Û«‚ ½9‹Ç¼†Œ©¼¾ß߈ù×Û«‚ ½9¢»¼Ø›Ô‹Ç·à¿Å† ữäôÉ홉kß [ïS¡ÔÁƯ­Ö“ÈĂÙ×ÜăˆŸ;ÿ¯¶•×ר²½߈ÑÓÏÅ›vœĂ‹Ü®¼Ï̉Ơ±»ªĐàçç'¬Ö©‡¥2ßëMÙŒë*«±»µ†ÿÚĂ¼ÏÅÅØÅØ‡Œ¿ô°»ƒƯÛºÏÅ™‡ĂÙ«‡“Íjëö™‰kß [ïS­qù×ÛăˆŸ;ÙŒë*«øêÛ«‚ ½9ÁƯÿ¯¶ăˆŸƠXơêù¿Í­Háêù×½ÏÅÏÔѶ›‡›¾£»¿‰ñÚûÖù×ëöÑÓÛ«‚ ½9ß»û‚¾̃ˆ!¯àưˆ×Ơ½¡ÔÏÔ‹¾§Æ±»“Æ¢»ÏÔÍÓô§¹á=­¾âˆ™‰kß [ïS™ÓĐØ ‹Ç¡Ạ́Ă¡Û¾‰‹Üù¿ơêƒvßÁĂÙÏÅ™‰kߣ²‹Ç—Óó“Û«‚ ½9·‡‘×8ç±»ơêƒàÜ“µØß»û›Û·Ô½ù¿ÛÄÓׯ똺̉‡ËÇ“-‚v£ØÙ½ƠÛת»ïƠ±»­ÖÓƠéꙇ÷å5Ó˜‰j̃ZîS±»ơ»ÇÖ§½̃ˆÏŃv±»¯¼ƒˆƒv›¾ó9¥‡ù×¾º߈¹ÚÚ×ÑĂ÷ÄÔ¡Ôëö·Ø̃ˆ ‡÷‡ăˆŸăˆŸ;k½ăˆŸ;‹Ççô™ô¨‡¤2€̃êL·ÔÑLÅÓÁ¼™‰kß [ïSË¿—»›¹‘Æî½í‡÷ÁͽÛ«‚ ½9›¾ƒÖ½¡Û‹ÇÚª‚ +¼9¯Û­ß„ïÚå̉ ÖĂ ơê™Ôå×ÍË)éÛ9¥•{‹àá ¿́ĂÈ«·3uU„'éâˆ:jÓº‰¿I¿ØëöËÉ9‹ÈÑrñÚẳäÆáƠß»ûå̉ ·ºÚª‚ +¼9›¹ÑĂÓº•%£ ùשØñÖ—»ÅØƠ¾G¸ÚÍׯăˆŸëö߈ö¥ØÁƯ½§Æ‹Üщÿ¼©•öÁƠÚª‚ +¼9…Â߈ÓØ«‡“ÍjĂÙÛ«‚ ½9ƯÓ ßÄÙÚª‚ +¼9™Ô«ÚÙÚáê³ß½ÍÓƒvù×ÙÚ»Åăº“߈¿ºùר‡¤2€̃êLä̉9¥‡ĽơêÛÀ÷Áÿ¯¶ĂĂ ›­±àéMƒØÅØáêăÁưÀ‡üĂĂă÷Ù‰¿I½çÚóǺؼơèŃvÿ¯¶‡Œ¹Ú߈µØÂÁƯ噉kß [ïSƒv‹Ó¶ô¹ÚàØù×ÅØÙŒë*«Ơ麿ßơÔ»¼‘·ÔóÇưÀÛ«‚ ½9—¶¡Èù×›¶é¤ˆ\0߈½^ËÚ÷å5ÓáƠ‹Ù›¡­v…¼ÅÓëöº°ÈĂùơơÔÇØÏÔĂÙÜÓ ÇÖ©ÇÍÁù×éºÅÔĂĂ ›­±àéMăˆŸ;¤½Ô³ºó÷ÁăˆŸ;ƒØÏÄ߈ơêéÓ×¾ÇƯƒÚƒv߈±»ÅÓÔXóÂù×½ØÑÓ±»ÅÓ߈ù×Û«‚ ½9ÿÚº•‹H÷¼·Ó ¥0«‡“ÍjÑÄë Ơ+ÙY Û¥ÓÛ«‚ ½9µ†çôĂÙS©ØÏÔ™ëéå“Ç©‡¥2ßëMϪá ™‰kß [ïSùצÔăàÛ«‚ ½9 ËûăˆŸ;ÔăàïÅÚ¦Û×ÿ¯¶éº™‰kß [ïSù×›ÚĂºÑØï½½Ç÷ÚχµØÀ½Ë4¼ÁçÛ×ăˆŸ;ÏÔƒv©Ø©ÇʹÏÔ°êØÁ‡é/×:߈¥Ø§Ô‚ÿÚù¾ÑÓ±»Ñ·“ +¡»ù×Û«‚ ½9ăˆŸ;ăˆŸ;«‡“Íjォ‡“ÍjçÚöëöç'±»щ¯́v +χêÚ߈‹Ó‡ŒƒvƯ–›¡Ϻ¡»ăÇí“Æ‡Çƒˆ½Èÿ¯¶‡“Û«‚ ½9·Ô߈ψăˆŸ;©‡¥2ßëM½Œ·‡‘×8ç±»âà ‘&á ½߈«÷Ÿ}¢»#ÍûÙ£äăÏÔñÓ»½ƠÈĂ ¥Ưш‘ƶ™‰kß [ïS±»ßÄÙ¿ĂŒ9ä×ͼöÑ%¡Áù®½ÿ¯¶›¾ƠXñÓg³ºó‹Ü—¶…¼ăˆŸ±»ăÔµ‰Úª‚ +¼9ñÚÀ¹XÏ̉߈ëö×Ơ†7§jăˆŸ;« ©ƒ»5Ë¿ăˆŸ;™‰kß [ïSÍË)éÛ9¥¿Ùƒv߈·‹¹¼«»‹Çé‡é꛾©ØÙ½°¿ß»ûỞ߈¡Ôù×§ÔÁ¼…Ö§Óä̉  ø¿߈ñÓ¹ÚñÓßăˆŸơÄ÷ÁôÄẫ‡“Íj£»ôêÚª‚ +¼9ù×ÏÅÏ̉äôË¿ÅØ•ºçÚÏÔ«»₫®¶ĂƠÆÍÓåÁܼô™‰kß [ïS߈ÏÅ›¶é¢XÛ×ÙÚƠưÏÔñÚăˆŸ;ÑĂÏÔ«‡“Íj™‰kß [ïS¿ôÚÚ«‡“Íjù×™‰kß [ïSÿ§™‰kß [ïS½€íÆéơưÀơêµØù×—»¿‰¹Ú±»¿‰ÏÄ뼉¿I߈«÷ÓØ­Ä«»ÙÚëö½ƒ·Ü¹ÚÑ+‡Ûăí‡Ưº¿‰ ÁñÓ½à­È‘ Ÿđ™‰kß [ïS™ôÁƯÜơÔăˆŸçÚñÓÙÚ©ÇÍӵط‡‘×8çƠÚ߈¶Å¸ÚÙ̉ăˆŸ;kÓÓ¢äÏÔƒˆ¿‰±»·̃™ÁưÀ»Ăăê˜êèäƒvÛ«‚ ½9‡ºÏÅÏÔ™‰kß [ïSÛóÂöơÛ«‚ ½9ëö™Á±»ù×ÑÓƒÖÉẰÄÿ&¦ô­Ô‡«‡“Íj«‡“ÍjĂÙñƠ¶££ôá ß»û™‰kß [ïS·Ó ¥0ƒvÂÙ—¶ỂÙŒë*««́ñ,ùê’Û¹ÿÚñÁƠï½ÏÔ߈ÿÚùíăˆŸùןÖÏÔÏ̉µØăˆŸûÓÛljƯ½œ¿Æ™‰kß [ïSĂĂ½ç̉߈Á̃ÿ¯¶µØ߈ĂÙ‹Ç·Ôï³2°½íÖ›¾ºÏ½Ă·ôïƠÅÓù×·Ó ¥0ˆÛ«‡“Íjƒ¾‘ÿÚ‘àơ‡ºëÔ߈±»Û«‚ ½9®¾Y³ÈªĐ‹à«ÓƒÔñÄ9¥‡íÚ«‡“Íj ¬°àèMơŰ»¾ô‡xµaËÇù×Ù½ÓØù×ÑĂïçÛ«‚ ½9£Ç®ºù×ĂÙ­)¡ƒÖÿÛ߈ÓÈû›Û×êöÿÛ½ÜđÔ¯‰¯0ÙŒë*«ưÀñÚ÷ÚáØ±»µ†·‹ÜëöŻث»«Ô»‡Û«‚ ½9«‡“Íj‰Ä߈ö½öÔù×±»•Œ߈±¿ÁĂÙ¿»ï»‡ÇơêÏŃÖ߈ƒˆ¯¼ׯ忟ۃÖƠâÂ3»è̉̉ơ$·ºá‹öÛºßÄÙ›¾ƒÖƒˆ½€ç¨›¾±¿•—Ï̉Ơ÷Á‹ÜŸÈ·Å•ŒƯơÏѵ߈ù×—ˆ×¾»Ăù×ëöó¶¡ÇÍË)éÛ9¥ù׿ßÛ«‚ ½9çÚ•ŒŽ‰Û¦ØÅÓưÁ©ŒˆÇ«‡“Íjû¡«‡“ÍjñÚª­߈©Ó‡½À½öÅÔÛ«‚ ½9÷Áă½ÙÚ°» +ÅÇ»“Ơ­¾«‡“Íjäñ·‡‘×8çÿ×ï³2¿‰èơÅôÏÅß„¢ä”È#ú##. ÂÙÇ剃vù×…Ơơlƒˆ¼€ñÄ™‹åô“ƠºÛÀ±»ÍÓ÷Ú‡ăˆŸ;›Ú÷ˆƒvƠ¥ÛÉÖƠ'¡Á¹Ụ́Ç8¤‡˹¶è߈ĂÙÁ½ëö¤ˆ\0«Ôß»ûí—Gƒvăº«ÔYùêÇÓÉå̉ ›¾—ÓñÁ¡Û±»·¼Í7ùס»«·3uUÓÁÏÔ¶™‰kß [ïS”™Ô¡Û¾øêÿÚ±»±»¹ÚöƠ·ׯÖĂ£Ç‹Û܃½9¥‡™‰kß [ïSŸèï³2å̉ Û«‚ ½9ÑÓ׾vÔñÄ÷Á³ÏÔÓŪ‡’̀j‡Û©Øçº¡ÈÛ«‚ ½9û÷ÁÁ¼ù×±»óı»¿º›¶é«‡“Íj߈Û«‚ ½9—–ơêµØôÈ̉œÁÏÅÆ‡ÛÛ˜‰j̃ZîS£äó£ڙ‡Ûºº­·Ô“Ơ߈»yÄôÙ×¥Ø߈íÙ½Ù×éơÛùׇº¡ỘƒÔ퇩‡¥2ßëṂǘ‰j̃ZîSÏÔÛ«‚ ½9ùô£Ø¡%ĂÙ«‡“ÍjăˆŸưÀ÷Ôå̉ ƠÛÇÑÓÛ«‚ ½9×¼ÑĂÙ½¶¶ßÏÏšӅôª»½ÊÎÓÔ‰ÔÓÆĂÙơêßÄÙ¡È̃ˆ‰́ÄÔ™‡×2™ÓÛ«‚ ½9¶ÅØ…àׯ™ÔÏÔ‡xµØù×ơêø××̉Ă¼îº±»½ÂÓ›¶é™ÔÁÏÔ‹Çå™ôÛ× Áϼ±́ăˆŸ;¢äÓØ¬Ö±ëØá ÖÆăˆŸ«‡“Íj¿‰³ ¢ä—»ăêË̉“È©¼£ÓÛÔ8¤‡±»ưØö‡“ÆăÁ‡ĂÙÇ"»Ø«‡“ÍjÅÓ™ĂÚ×¥̃ Ơª‡’̀jÈ̉ ăˆŸĂÙ·Åëö¹Úù×Û«‚ ½9³àÁ™‰kß [ïS›Ú…ƠóăˆŸÅÙù×§ôÏÅíØÛ«‚ ½9™‰kß [ïS¹ÁÄ– ·ØÚÇ’é…ŒÀ¹߈߈™‰kß [ïSƒ¹÷ÁëÚ™‡àƠ¾ó’ăÂ߈Û«‚ ½9ËÉ9­Ä½Ôó%ăˆŸ;ká=9¥‡×…ر½ÏÅöÁÏÔû:¿ºƯ$ăˆŸ;“¹ƯNå̉ ·#™‰kß [ïSÅØºÏÄ@›vÇØÛ«‚ ½9߈›¹ÏÔ¥ÇÓÓ‘Ö¯¹Ú±»µÚƠÙÚ“Ơ•ǛÓ߈ưÀÖ¹$ơèÅ™‰kß [ïS™‰kß [ïSöÿ¯¶…ƠÁÓ Á¡ÔßÚ«·3uUÛ×ÙÚăˆŸ›¶é·‡‘×8ç÷Á‰è„ÅÔ©Çñ̃ăˆŸơêô×¾çÚ½ßÄÙר«Ô™‡ñÓù×ÓµO¡Ỗ»úù×½ơÛơăˆŸ«‡“ÍjÇõ½¬Ô«‡“ÍjëÚÇÖŇ„₫§ÿ¯¶ăˆŸ;µ†߈߈—Œ§ƠÏÔ­Ä™‰kß [ïS%ăˆŸ;™‰kß [ïSĂÏ̉̉ƶèºëöơÔ¿ÔƠéÙ×ÀĂ½€ÏīѷÅÍÁ«‡“ÍjÙÚăˆŸ”Ö©Ơ™‰kß [ïS‡º·ôшÉ̉ßƯăà„ƠÂê›v§ÈÏÔ½ßÚƠ…¾çÚº•Œ«‡“Íj«‡“ÍjËÉ9‡ÍÓ±»ăˆŸ;“ÓÅÁ½‹ÇŸ}›¾“Ơ›¾ÅÄơÔ­Ö̉ƽ£ä˜‡Û«‚ ½9™‰kß [ïS­ÖÓØÄôÿ$ß֯ȡԷ‡‘×8çÏÅ÷Ú«‡“Íj·Ó ¥0§Ô«‡“Íjæ̉ïÚ›¹Ç¼ô½ëö÷ÁÙ×߈ăˆŸ;Ù½çô€ÄÏÅ—áÏÔ›¾›¾ëöÚª‚ +¼9ưŒ߈«·3uU¹ÚưÀϼăˆŸùןÖÍÇù×Û«‚ ½9ÅÄƠ•܉ơÏÅơêÛ«‚ ½9±»½ÙÓ—¾½àÅ•Œ«»¹߈³Ø—¶‹Û©ÜƒvăˆŸ;Û.ơê÷Á‡ÇĂ٩ǹֹڙ‰kß [ïSûÖơêÛ«‚ ½9©Øù×±»êö ƒˆƒØû½Ô«‡“Íj߈©À½ÏåÅ–ù×ßf‡Ç8¤‡×áÛÇÖÅ“ö̉̉»ơêÏÔ½øêăˆŸ;ăˆŸ;±¿½€³Ø¼ºy!½±»ÄÓ‰¿I“ÆÏÔŸ}·§D ›¾£Ç•ùƯÓ ‡ÇµØ×˻܃v÷‡óǧÔáÛ±»ÍÄ™‰kß [ïSøêͪÏԇںص؛¹ÍƠéêƒAÙÛăÁÛºñÚ%˹߈™‰kß [ïS߈ĂẩĐØÍĂĂÙí—G™ÔÀôßøăˆŸ;ơÄ¥ˆ]1Û«‚ ½9ÅĂÙËÉ9ơºÅùܨ~¨Çđ»ëö‡¢ƠơêÙ½ÑØÙ̉ăˆŸ;îÅå̉ ¹Ú½¥‰ÍL…ñÚĂÈ—–Û«‚ ½9߈‰ØÏÔơ¾щ¦Ó›óÔ±»ÑØ÷Ù±»ăˆŸ;‹ÇºơêËÉ9ƒî«ÚÛÚ÷Á÷Á½ÿÚ¡Á½ÿÚùê¶›văˆŸă*Ûꙉkß [ïSƠÔƒÛ«‚ ½9™‰kß [ïS«‡“Íj¾åơ™‡©ÓÿÂùê·Ô·‡‘×8çÙÚ½©ÈăÙÚËÖ̉ÅßÚ£»“¹ƯNËƠ㵩Óù×ÑÖĂĂ ›­±àéM±»ôĂÙµù×ßÚçđăÁêö8¤‡шáê÷ˆñÓù×ׇ½7êößÄÙï‡Ù€©Óă»ÅÓëöå̉ ö­¿ÓØăˆŸëÅơ»Û×™‰kß [ïSïôÿ¯¶ÿ¯¶¡Ơ£ä‹«¾(‘–å×ăˆŸ;ëö¹ØĂ߈…߈ù×øê«‡“ÍjŸ½ù꽋ö߸ăˆŸ;œ¿Ó½Žơ‡¥ĂÙ¶ÜC˜êèäÛ½“‰3Ơ,ù¼€ĂôưÀÑó¿ÔưÀ‚½ÅÇÖơÔœ¿«‡“ÍjÏÔÎśڻ»‡›¡ÁÛ«‚ ½9“Ơ߈ ÁÛÄÓ±»đÁ¯Èå̉  Á“Ơ‡Ç™Ăáêù×ù×¥ˆ]1̃»úáêË®¶€º§ÔĐ̣£Ç‚vÅØçô·Å‡x“DZÁÏ̉纫Ԙ‰j̃ZîSĂèóÂÁĂÅÓѶÁƯơê߈áêÁƯí‡ÓÅÓ̉Û«‚ ½9«‡“Íjƒà¹ÚÏÅ÷ÁăơܵطÅɇˮӕ%•¶˜‰j̃ZîS‹É0·‘߈¡hĂÈÉÖ5çÚ퇙‰kß [ïS߈Ö¾!ăˆŸëöµØËÇę׫ÔçÚëÚ¹«»ÏÅÙÚå±ÛÄÓÇð»ù׎‡x©Ü›¶é«‡“Íj±»·‡‘×8çÙ½ÓŸÖå̉ ÏÔª¶2tTơÔĂôŸĂ¹Ú÷ÚơÔöư‡±ù1ÿ¯¶ÅÔƯ‰Á‡é/×:Ù½™‰kß [ïS­¾߈¢È«‡“ÍjóÇÄÂ÷‡ÏÔÓ̉ëöÇÖí‡÷‡ÛÀÁ½í$Û«‚ ½9ÏÅщÿÚ±»gïÚÏÅƠ÷Ùà¼ÖĂÍỞÇØºÍË)éÛ9¥áÅÀ”DZ»ƒƯ¹Ö€«‡“Íj‰Á Ëû‰¿Iÿ¯¶Á½×¾ÁĂÙÚÙÓÏÔÏÔÚÀ ÷ˆ¯×ƒÖÛ«‚ ½9¸Ú‡“ºÍĶŌ½™‰kß [ïS¡ÛÑÄëù×ÿÚº›¹ß„ÓÅÚ×/Ơ·Ó ¥0ăˆŸ;°½ +߈µØ8¤‡×éÓß»ûăàëÓăˆŸ;Û׃ơĂȺù×Û«‚ ½9óĂŸëö—Û÷å5ÓưÀ“ƠÏÔå̉ ﻥ)ƒˆ«Ô§]Ï̉Úº«Ôº€º¯‰¯0ÑÓ‰¿Ií·Û×ÏÔµ‰ÿÚÏÅ«ÚĂè¾¼ăˆŸ;æ̉»ˆ›Úá éƠ«‡“ÍjƒṽŒÛ,Æô³àéơăˆŸ;˹‘Ó…Û•ÖưÀ±»Á½Ï̉ăˆŸËÇÉ Ù½½ØÏÔö±»¥ÖÂÓ±»Ơܺ°»·‡‘×8çù×à½7Úª‚ +¼9·‡‘×8çÿÚÏ̉ëöƒv…ŒÏÄÑÓªÔÓÅí–G¹Ú¡ÛùׇÇïƠơÅÿ¯¶éºôƒv¥ÇÁă߈‡vÏԷԟ󗈱½ù×ß»û½ù×ăˆŸ«‡“Íj¹…Á½å̉ œÜÄô7¡³Â«Ô™‰kß [ïS߈߈¿ Ú×½ƒ½µ†̣ÇíÖă‘·ËÓù×™‰kß [ïS¯G‹ø߈ƒvÀ¹ùñÓÏ ‘ơÑÓ‡ºÛ«‚ ½9ăˆŸ;½‚vơêÿÚëöù×§²½¡“¼™ÁƒÔÏÔ½ơê·Åø×®¼—»ùב۫ԵØÏÄĂÙ̉Æ¿ôÛº±»¡È±»ưÀ¯Ç‡“½€ׯÿ¯¶ÀĂ«·ăˆŸ;k±»ÍÓ¡Ó³°» ËûßÄÙÇ̉½€³Üù×ÙÚ¹=›¶éơÄ⺫‡“Íj±»±¿ăˆŸ;‡äµØ£Çö‡ŒÑĂưØÛ«‚ ½9Û×ùש‡¥2ßëMÛ«‚ ½9£̃¿‰Ô©¼¾×Óù×Ù½ƒvăơå¡÷ˆưÀÙÚù׿¹Û«‚ ½9ưÀĂȼ•Èû›—¾ÙÚ¼ô³ØÅĂÛ«‚ ½9ăˆŸ;¹ÚÁÚÙ ËûËÉ9±»Æ߈á۩صØ÷Áó‡ü¦†Ö¾ăˆŸ;ĂƠ£¨±»ăˆŸ;½Ăȱ»¥Óăê°»°”‡ß„±¿ª‡’̀j³ØƠºm«Ô†Œ‡ÛñÆ”%ơèÅÍ™ƒ—¿·‹ÆôÁ̉ơêăˆŸ;k«‡“ÍjÛ«‚ ½9½ĂăˆŸ;kĐÄê¿à½€ä˜‡ŒÙ½œ$·ÛƒvăˆŸ;ùꃫ»߈½Å»™ÁưÀöÁŸ­™‰kß [ïS½·‡‘×8ç§ÓÅ–ñ~ö½‡ÇÖƒÖ߈Û·Å÷Á½ËÇ Ơ‡º«‡“Íj­‡Ù½ÍÓŸƠ¿ßóÇ÷ˆÛº³ÂèÓù׺›¶é­½¼™‰kß [ïSăˆŸ;‹ÜăˆŸ;ƒv¿»©-Å™‰kß [ïS±»£ØăˆŸ;•ÏÔëÔ÷ÔöéÓ©¼߈ºçà¼ÁƯ¸Ú“ư‚v“ƠívÑÓívëöĂÙƒà—ˆĂƠºß»û«‡“Íj₫Íı»ó§ô£Ư‡Çû¾ûÓßÁÛ«‚ ½9Ó-¡Èÿ$÷Áè‡å̉ ßÄÙϼØ×߈×܋ܩs°»ÑÄ뫇“Íjßѱ»áêíº±»£Ø©ÀƠÁßÁưÀĂÙ9¥‡ÿ¯¶ƯÓ Ƽ·̣¦ºĂ¹ÚÙÚ¾‰Ûº£XÅä·‹á /éJé‰Ó5“gesÁŇºĂµÉ‘ƫڛ¾Û«‚ ½9À¹ûơ§Ó°½½ĐÓ߈ïƠÍË)éÛ9¥ù×ưÀå̉ »Ø¶Û«‚ ½9ÑÓÛÄÓÏŶè±&éê±»ăࣻ̃»úÁĂ½¥àÛ«‚ ½9£ƯßÁåÁă꫇“ÍjÑÓùê§Ô»²ơŵؘôÛ«‚ ½9Ơ]¬Äûè߈Ûº÷$½ÁƯ•Èû›ÙÜ›¾‹ÇÛ€ÆØ›¾¡Û»n¯ÿ¯¶€º½ëöÿÂÛ«‚ ½9Û«‚ ½9ù̉Á¥‰ÍL…ÍÓùêÓ̉ñÓ¹Úăơå±Ö¼ ·‡‘×8盾ƯÓ ăˆŸ§Ö¸Á·Ô߈„‡ä‡™‡ͼéºÏÔׯ»2¿ô™‰kß [ïS°»ÁĂ½€ÿ‡±»Û«‚ ½9«‡“ÍjƒvéºÓØÛ×ׯù×”Á Ú ߈¹ÚˆÓ̉·‡‘×8çù×ó|Û«‚ ½9ª‡’̀j¨ºŸ}߈¿ơèÅÙ½߈íÚçÚ¥ˆ]1Á ϼëØ™ëéåƒÔˆÛÛ«‚ ½9ơÔö¨Èׯ“¹ƯNÛ«‚ ½9¿ôăˆŸíơ‡x¾Û›¾ù׿ºµ†ÙÚÑÓ™‰kß [ïSѦÍÓ¿º«ÔªÓ¡ÁÏÔ°»Ûº‹Ü±»–½Üᾫ‡“ÍjïôµØ£Ø•”ÙÎ̉œÚ ívËÇÙ½°» +‹Ç™‰kß [ïSöޱºÛ«‚ ½9ŽZÏ̉öƯºÆ¿́·‡‘×8çÑØ»Å°»ĂÙëö°» Ç̉ó¶ơºÑÓñ£Ø«ÔÄÓ£ŒËÊß̃ù×ăˆŸ;kÍË)éÛ9¥ù×°»ÿÂÓØ߈Óáêá ßÁŸ ĂÙÙÚ¶Ô"ÛÀÏÅÏ̉¥Û߈Û«‚ ½9¹Ú¥ÓÅÂψ…ö»Ø˜‰j̃ZîSá=9¥‡ĂƠŸÈăˆŸ;k­Ø©‡¥2ßëM÷‡«‡“ÍjÀÓ¶ÅÏÅƯÓ ¾Ơ†ŒôqǽÙ½Ë̉‡ù×đ½·ºÏôÙÚëöܺ™ëéåôÏÔ¡Ôª‡’̀jơľ߸¾7ùט‰j̃ZîS‡ưÜÅÓ†º 難“ÍjóƒµƠ¾GÜ™ëéåÅÁ‡Û‡Œ×ƠƠăơ½€Û×ÁĂè¾ ›¶éØ×ơĺ«º߈ù×—ØăˆŸ«Ư©¼ÛÆÛ«‚ ½9¡%ăˆŸ;ÅØɇ¶èó#(‚v«»ø× +‹ÁçÚÙƠñÚÛ×·Ó ¥0©¼‚vÛº—¿ö±»™‰kß [ïS÷ÛăˆŸ;ÓØăˆŸ;k̀Óíø£ÓÙ½ÍĂÏŃآ ±»¹Úµ†±»߈ÍĂÓØÛÅĂȯ‰¯0ƠơÔưÀàêä̃™Óº˜êèäôê‹Óºë¼ÏÔƒˆÁ‡é/×:ˆĂÁ‡é/×:߈Ó.‹ÇY₫ó±»âà7¿µØŸâƯÓ Û«‚ ½9›Ú®¼ÿ¯¶ÁƯ½ù×çÚƒv¹ÔáöëöÁĂ߈Ú׫‡“ÍjÙ½ù׾߻ûëöĂÙ“§Ô«‡“ÍjăˆŸ;köÁÙŒë*«¯¾ÏÔÿÂ¥Ö£ƠÛÄÓ·z׿8¶è‡éºívöä̉ùôëÓÛ×߈̀Ó™ÓÁĂ«‡“ÍjĂăˆŸ;k³(߈„Ö÷‡«‡“Íj¯È«‡“Íj¦ºÛ«‚ ½9ÏÔ±»ÆÖå̉ “Ç›¾«‡“Íj¡»«‡“Íj÷ÁƠÑ·ÓØăˆŸ;™‰kß [ïSÈƠ‰Æ™‡ívơÔăÚù×±»úÏÚùëôĂÙ½9¥‡ƯÍÂÙ£ÔÏÅëÓåé÷ÁăàâḈéºñÓƯÓ 9¥‡‰ơ™‰kß [ïS›Yù×êöÀÇÛ×øêǺơê·ÅÓØÁƯä̉°½ơê«ÔăÇíơÔỞ9¥‡·‡‘×8çưÀƒà¥Ó”Ûºù×Ổ¡Ç̃ˆ±»Œ¾™ëéåÍĺÏ)•%ÙÚ̀Ó«Ôøêôê‘÷ù׉¿Iׯơ»ƒˆºÅù×ă»âˆ:kŸØ±»¹ÚÀĂäÁí—G™‰kß [ïS¾ơêŒù×Ä–ÀĂ·ÔÛº̣ı‡çÚ߈ñÖƒÛÚ̃ˆ±¿ƯºYÈ»ĐĂÆÖÅÓÖ̉ÇŽ¿àÄăˆŸ©Ó»ÓéêăˆŸ;kµØßưÀßÄÙÓÆÍƠæóƒØĂºăˆŸ;›¾™‡®Gø¾‡ă½©‡¥2ßëMß»ûĂÇÖƒÖÛ«‚ ½9°»—Œ¡Ô½ÈĂ ßˆ€q¹ÚÔX‡ÀĂ ‘ÖÏÔ߈ÅÍÄÇÖ½ó̃äơ—؇ùê›ĂÁĂ₫ÚæZ—¶÷Á«·3uUרĂàăÁùêùêƒvƒv÷‡¡Èƒv‘ë›¶éÏ̉%…ûƠX—ŒÓ·ÅÓơêáêµØÛ«‚ ½9™Ô“Ơ¹Ú¯È™‡ÔØ×™ºщ¡ÈáêÓ¨ØÍÓÙ½ÍË)éÛ9¥ưÀËÖºưÀ߈‘Æ›ÚÁƯØÏÅÏáå̉ •ÙÜÛÀ¡%ÁĂ‹Üå̉ ±»É̉å̉ ˹ƒvç꫇“ÍjưÀ¡ÔÂÿÚ‡½¥ˆ]1”ÇÚª‚ +¼9Ăº™‚ª»ŸÈóÄíØ³È½ƒäÉ̉ñÓăˆŸÜÛ¤ˆ\0ơ‡߈Ù×êÔÙÅëùꉿIÅØ¥Ó«‡“Íj́vÏ÷Áß»ûï³2Û×µøŸó¿»ÁƯ½€§ÔÛ«‚ ½9ù×ơê÷Ú©ÓÛÑÛ«‚ ½9Á׳ç¦̉º߈úÙ÷ˆçÍÓÛ«‚ ½9«‡“Íj¹ÚÚ×±»‹Ó„ÚăˆŸ«‡“Íj€º½Øơú«‡“ÍjăˆŸùê½™‰kß [ïSÑÄëÅÇ癉kß [ïS߈±»Ô ƒÖ±»û̀¬H­ÄÁ׿8«Ô%µ†ëöÙÚ»Åшăà‹ÇîDä̉ + +™‰kß [ïSù׋Ùö½ùêå×ùê¹Ú­Ä™Óù׿ÙÅëϺÛ«‚ ½9רÓºƒv™‡°»éÓăÇí·Ô…Øù×ôÅ«»†­ÄëÚ­Ö­ßÚăˆŸ;ÍÓ½Óºùô½·ÈÇÖÅØ‡Ú’Æ +· …Ô±»Íăṽˆ ±»“¹ƯNÅØỞÜÜÓ ûđ¹Ú¾ÑÓµv›¾Ư‰ëö¦ÓĐÓĂÈưÀ«Ô÷ˆêöŨÈÙÚª¶2tT©‡¥2ßëM—ÚŸß©¼‡Ô½ÓÅëö­Öׯ™‰kß [ïS³ơÑÄëÓÔÅØƒv9¥‡Á̉â Â3÷‡߈ÏÄßÚƠ¾GÛ«‚ ½99¥‡ĂÙ‚ÖăˆŸ;¼€óƯ‰¿IíÈáßϼ©¾ÏÔÿÚ½ô¸à®È +ÏÔá¬ö«‡“ÍjÇÖù×—ˆ½›¾ơêëöåKªÚ—ˆăˆŸ;™ëéåÙÚ½…€­:ÅØăˆŸ;kưÁăˆŸ;óù×ǽưÀÙÚË¿±óĂÙÛ«‚ ½9¹Ú¾»ÅÏÔ¼ô…ôáƒÛ«‚ ½9ÅÔÛ«‚ ½9óÇ™Á— Óë߸ÚưÀÙƠ³±»™‰kß [ïS‚½ŸĂÙ±»ăàù×ォ»ß½™‡ÍÄä̉Î̉P߈á ¡È½ºưÁÏÅ‹ÜÓÁ“ƠDZ»ºÖÆăˆŸµaĂ ³éÆ¿‰÷‡ÎÅ•v¹ÚÅÅÙÚÁƯ¿º÷ÁÏÔ߈߈Û«‚ ½9ñ»ưÀ·‹ÆÉ€›¡Ç[Û«‚ ½9ÁĂ©¼щÆÖù×ï»ÁÛ¥Û›¾ă‘·ÁĂëöǯ¼å̉ ñ%ù×ơê­¶™‰kß [ïSù׫ơ±»°»­½¼·ºăˆŸ;ó—֋ܡÁ¾»¥ˆ]1߈™‰kß [ïSÿ&߈«‡“Íj»Ø½ÿ¼ĂÙăˆŸÛ«‚ ½9«‡“Íj«·3uU«ÔµØ‡ºÙ½ÛºÉ̉©‡¥2ßëMå̉ ơÔÇÖŸ÷Á¬ÖÂơêßÄÙåôư‡±ù1«»óÇ‚v—¶ÎÁÔ÷ÁÇÖëö™‹ËÖIÁƯëöɱ±»ÑĂ¯¾½€™‡ÙÚɇñÚ‡x±»§ôÛ«‚ ½9™‰kß [ïS™ôƠ߈™‰kß [ïSÛ«‚ ½9Ú×È̉2ëöĂơÔç§ôÆÂÏÅăˆŸëöß»ûăˆŸ;߈•×üĂăà™‰kß [ïSÛ߈¨Ø»çƯñ¥ÉªÔƯÓ ÊÓÏÔçÚ³ºóºÏÅôù멇¥2ßëM™‡’Æ­Ä›߈Û×ÅØ±»ăˆŸ;ר·‡‘×8熌±»ơêщÛºÿÛ÷‡á×Å…Ñæ­?đÖƠ´Îŧô—Œíê߈¡yË¿ͼ°»ăˆŸ™Ó›¶éÛÚ½ăơÛ«‚ ½9÷‡¿»ÚׂßÏêØ¡È»Å„ôÏ̉·È·¼Í7Û«‚ ½9Û¾©ÇăˆŸ¥‰ÍL…ĂÖ¦ÔĂÙåj̃ZîS“¹ƯNßÄÙÛ«‚ ½9•îƯܽËÉ9ÏÔ·ÔùêĂôö߈±»½Ù½ßÄ٩dzØÇØG½¹ăơăˆŸ;kÂÆÏÔÛ«‚ ½9ƠXù׃ˆÁ8¤‡ß»û«»±»øêÓÅñÚ·Ûă»¿(®GøÏÔógÛÛ×ưÀÏÅ™‡À÷ÁÑĂ¥Æ»Œ¾½€±»ÿÚÿ¼ă½·‡‘×8ç¡÷‡‡º́ơ™‰kß [ïSºy ±»¹Ú¹«‡“Íj±»ß–ú„­Ô‰¿IôÄÏ̉ÅÄùדƒ¹ÜNơÔ£ Á´ăˆŸ;kÂÙÍĂÛ«‚ ½9ëöÅÔƒÖ“Èù×î¶ăˆŸ;™‰kß [ïS¯¼©‡¥2ßëM¹Ú̃Ú•%¶™×ÉĂùê—áÁË“Èù×ÛÀÄô‹ÈăÚÑÓÏ ©‡¥2ßëM·‡‘×8çëö·Åƒé·¡ÁÍÏÄ¿ØÛ«‚ ½9ËÇ9¥‡¾ÏÅßÄÙÑæ¾«Ô°»Ă¼¯‰¯0­Äö«‡“ÍjÇÖ±¿ÁÓß„G½¹ùêç≿IÙ½±»½Ă Ù½¥ƯñÙæơỖˆë#ë¼ÂÙ߈ăˆŸ;Ó̉½Ñ«‡“ÍjÛ«‚ ½9‚ñØùê½¾ĐÏÓÛ«‚ ½9®Ơׯ‡Œ»‰yËǪ‡’̀j•}äÁđ¹ ˜ ù×ÁƯö‚v¢Ç8¤‡× Ëû߈ù×ƯÚ±»£ØË%¿Øáê“Ơ‹ÇƠXßÄÙùט‰j̃ZîS«‡“ÍjÛ«‚ ½9ù×ÍÄăàÛ«‚ ½9Á̉ăˆŸ—¾ÅÄ¢ä ½ÔÏÔ¢ôº‹Ùåô¯Ă•Œ߈±»8¤‡éơ±»·Åû(ù×ïÚ…¤Úª‚ +¼99¥‡ºÛ«‚ ½9ÅÓ†º·Å½º™ëéå±»Û»÷ăˆŸăˆŸ;¡ÁÑÓăˆŸ;ÓÛ«‚ ½9ÏÛ«‚ ½9̀Ă÷$“½ÏÔÆôÇâ«»ÛŸÙ½ÙÅë«Ô½‡ÅÓƯÓ ÏÔ–ˆ}’™‰kß [ïSÉ̉‰Û™‡ñíÈÿǹÚù×§Øêö°»ŒƠ—ˆ»Ø‰ÔâˆÿƠ•Œ«‡“Íj±»†ÇÑÓ“¼»Ó£»9¥‡“È¡÷Á•Å«â߈ÇÖéÓ«ÔÏቝ0«dÿÂĂÙöÁ™‰kß [ïS¹ÚÏÄÅØÑÓ‡ÿ±Qư£ŸŒ§Øÿ–ƒˆ9¥‡× Ô½èưÀ«Ô߈ƒv‹Ç¶‡Ö8泈߄”È ú  ÔûƠí—G³ƠËÖœÜÛ«‚ ½9«‡“Íj÷Ááêă»Ă¹£ÍË)éÛ9¥½€ÅÓ‡xÛ«‚ ½9Çö«‡“ÍjÀ¹¹Ú“úÇÁ̉ơÔƒvû%ËÖÛ«‚ ½9›½ù×±»¡ÈÙ½«Ä…Ô¹ ù×Ú£äưÀÇÖÏԣǪ¶2tT­)µ‰ù׸ڹֱ»ưÀùÙ½»ô¥ÁÀé‡ưÀÛ«‚ ½9¥ˆ]1ÅÙܳ£ØµØ§ÔÛ×á ăà‡a°»ÚÀ·‡‘×8çÅƯ‰ƒv ÏÅ·‡‘×8癉kß [ïSÓºÛ«‚ ½9ùׯG‹øöă»¿‰çÚ϶ÿ¯¶Û«‚ ½9ƠÓ¹Úëö‰yÍË)éÛ9¥¾Å±»“Û—»ăˆŸ;‡Çͼ¥Ø›¾ÛÄÓ÷§Ó߈ÙÚÙ׵ܙ‰kß [ïSöµ½ƒóĺýÈÙ̀¡Ôå»ù׿ح½¼ăˆŸÿ¯¶™‰kß [ïSɹ±»›¶é•bŸ}đÄ‘Æç½ăˆŸ;¹Ú±½ø× “Æ̀Ä™‡©‡¥2ßëMÑØơĂûÓÏ̉ăˆŸÑÓÏÁû̃߈©ÓÙ½ç»ÙŒë*«½ĂÈÛ«‚ ½9׳¼ô™Á9¥‡Û«‚ ½9éÚ8 +¤‡ +ăˆŸ×¿8·¶«ÔÏÅÏÔ³ÈăˆŸø×§ù×·Ô™‰kß [ïSƒv‡ëö“ŸÁĂăÁׯ¹ÁƒØªÚ¡ØíÖªÔÇ"‡°»ËÖ½¯ÈăˆŸ;kÏ̉ÆĂ +9¥‡˜‰j̃ZîSäƠh­îæØ¶©ÓËÓ³ÆÛ½Å–ËÓ“¹ƯNËÖÚדºÏÅÏÄ«â«Ô÷ÚëÚËDZ»G½¹ù¾ÿ§ŸÅñÓƯơ˹ư‡±ù1™ŒÏÔ™Ó½đÄÅØ±»˜Á¡È½ÏÔ·ÔÁÜù×ßƠå̉ ùׯ°»±»ƠX»ÅÛ×ñá—»¼º½ƒvßÁ¡È¡ÛĂ¼³ºó߈«‡“Íjáêñ—Ӭĺ›£‹Ç±»ëöûÓ£Øơê÷Ùù׎¼ÜªÚÏÔ™‰kß [ïS“ƠăˆŸ;k™‡±»ù×€Ó›¾ù×åĂƒv›¡½»Ø‹Ü½ƠăˆŸ;·‡‘×8çûÀ£äí$½Ô£ÈÙÚª»÷ÁçÇŸĂ§ÔÖØ“ÈÛ«‚ ½9˜Èä‰+ƒvÖÆ¹Ú¿ô³ºóÏĉ¾ĂÙ¯¼ÍijÂÛÅØ8¤‡×Ù×ÛÆơº›¾̃„¾«ÔÏPÙỸˆñÖÔ +Û«‚ ½9™‡9¥‡ÿÚ¼ÑÅßÚÀÓ«‡“Íj£+¿À Á¥â߈ŸÅÓÓÍƠ¿Ù“ÛÙ½€º‹Ç߈½÷Á»—Ó›¾ÏÔ™‰kß [ïS½ăˆŸƠÛ«‚ ½9«ÙĽ±»ÑÓ§Ôщ™‰kß [ïSƯÂÄÓŸÈøëר›¾ñهǂvÛ«‚ ½9å̉ ĂĽå¼ Û«‚ ½9±»çÚ½Ô°»ù×™‰kß [ïSôơưÀơê­vܹ»ÙÙ£ÇÁ߈ßÏ©‡¥2ßëMív°»ĂÙ£X¡ÁÚª‚ +¼9Ă¼Ÿ}¿‰±»¸Ú±¿ơÔưÅ—¶µÀÂăơôÅÍÓ÷Ùù×á ö¶  ëÚ½ÑÄë÷¶™‰kß [ïS“½™Ô±»“È̉Ó¬ÙÑÛYö½ׯ»Åù×ÅÙËÓ“Û°êØ„»ëö½Æ€ÛÀ¡Ó¡Á½Û«‚ ½9°»«Ôöi¡È¾«·3uUơÄöˆ«÷óÂçڹȯ¾ÏÅ—Ø÷êƒv¡Û9¥‡Á™‰kß [ïSñ×½¿‰¡Ç¿ºûؽ߳ȡÛăˆŸƒv߈Ö¾ºơÄßÄÙ9¥‡ëöíÖ¡Û½©Ø¹Ú‘ÔÛ«‚ ½9óǣǺÓưÀÙÅëÙ½µ.¥ÙœÔ —»ÏÔ•×é¼·º߈Ž´ï™çôăˆŸÙÅë™ÔÙÚ«‡“Íj©Ó½÷Ú½ôÛ«‚ ½9‚ж çÚßÄÙ™‡ƠăˆŸ;kăˆŸ½ù×åÈᬽª»©Ø¡ÛÙîăˆŸ™‡›ÔçôÛ«‚ ½9ăˆŸ·‡‘×8ç×Ơ¿»È +Ó å¿Û«‚ ½9àˆÀ0p‡ŒÚºăê¹Ú©Óÿ¯¶å°«‡“ÍjơÍÙÚÏı̉¿‰¾»ç̉×Ơå̉ ™‰kß [ïSÁ¹Û«‚ ½9Û«‚ ½9ÙÚܱ»Ơ׫»ĂÙ†º÷‡©Øí—G÷Ôû¿‰ÿǘ‰j̃ZîSĂÙÉ̉›ÛƒÔµ†ºƒvå̉ ƯÓ °» ÍÓéJé‰Ó5“gesÁÅăˆŸ;›¾ÿÂăˆŸÏÔ§”‰Â±»ÏÅ©¼±)Ïŵد¾™‰kß [ïS±»ÅÓ¡Ơϼѹ‡Œ߈¸à=™‡î»ÏÅ₫߈¡È¶™‰kß [ïSŽ»nË̉ÄÓ÷Á₫¼«‡“Íj°»ÿÚ§Ôù×Á Ǻ±¿£ÇĂ Úª‚ +¼9§ÔÏåĂÙëħÓÛ«‚ ½9ÏÔ·‡‘×8ç׿8߈œ‰¾IñƱó¹¶ÁĂ»‡߈Ç£Xăà߈ÏÅ·ÅÎÅ ¾ăˆŸ;kăˆŸÁ¹Óơï¸ỞÚÀ³ơÔ°»¹ÚÙ­ÖóÇ×ĂÖ¾·ÔƒØÛ«‚ ½9ÓºÿÚ½—ˆ´aüÁÛ«‚ ½9ÿÚçôÓØ¹ÚÑ Û«‚ ½9ëÍăˆŸ‘±̉Ó½¹ØÛ«‚ ½9Ú½°»ÏÔå̉ ßÚ«‡“Íjöƒ½̉ØÅÓ¶Ûà¹ÚÁÏÅÑ÷Û̃ă¼ƒv†đ5ƯÓ §ôñÓ¸ÚƠ³ ù× Ëû½ÔëöµØâêÁ¤™‰kß [ïS‡Û¡È߈‡Ç«‡“ÍjöÙÑ™Ôívñīӡ%߈›ÛơĂ9¥‡ÙÅë±»ûØé‡œÜ/߈«ÓׯÙÚ›¶é߈÷ÁÑÓ÷ÙԙԵؙ‰kß [ïSù×÷Ù¿ßơ•Ü­€±»±»ù×ö™‰kß [ïS¿ß°Áăº»Ø›¾˜‰j̃ZîṢ±»÷‡±»ÑÄëù׫Ô߈…qöƠß»ûÛ«‚ ½9íÜăˆŸ;ÏÅ߈¦ØñÖͽ­ÄÑÄëăˆŸ³µ°»Û«‚ ½9Ù¡Á§ôª»©ºåÁÍË)éÛ9¥9¥‡߈§Ô‹àưÀµ‘½Û«‚ ½9ËÓ‡º–¶ÏÔ½«Ó߈ăˆŸ;±»ëÂă»·‡‘×8çăˆŸ;©ÇñĂÛ×ÏÔĂíáê¹ÚÇ߈Á߈‰Û¡Èïö«‡“ÍjÁ¹‚v÷ÁÛ«‚ ½9æôăˆŸ™‰kß [ïSƠXù׋ÜÏ!ơZÛ«‚ ½9ù×Û«‚ ½9ƯÑ1ßƯÚÄ̉„ØăˆŸƒÖÅÓ¥ˆ]1ÏÔÍ­H­¿ËÓ±»‹Ñß»ûË¿Ơ +½àƠJ¯àÅØù×½€½ÙƠÊÓßÁƒvƒv£äÅØ«Ôñƈéºï½å×°»ơê£ÔgÙ×5ùê߈‡ÇÛ«‚ ½9ÍÄ™‰kß [ïSÛ«‚ ½9³«‡“ÍjÅÓ÷‡ư“߈щ¹Ú¹ÚÏÅ÷Áù×ăàÙ̉é®ÙŒë*«°»™‰kß [ïSíÖ›®GøªÚ̀Ê)èÛ8¤Èíܽ뽩À™‰kß [ïSÙ½µ÷ăˆŸưÀÆêöƠÊÈ9³ºó°»ƒˆ‡úƠµØăˆŸ;µ‰Á¹‡ÚëöËÉ9ƯÓ Û«‚ ½9´Á¡Û¶ÏÅó‡9¥‡¹¶ø×ăˆŸ;½ͼ±»çmù×î²2AÓˆ•=‘Û«‚ ½9•ŒăˆŸ’½°» ©‡¥2ßëMG½¹¾߈óÔ½ôÔº·Å߈Ʊ»ĂíÏÔ±¿«‡“Íjëö—¶µ†ÇèưÀÙ½á ™Ø©¾›ÛÀÛ…¯ÜÀ‡€è/Ö:ª‡’̀j¿à8¤‡×âˆ:kå̉ ơÄÏ̉º½ùשØ÷‡ăÁ‡Ç¡±»ăˆŸ;›¡ÿ¯¶ù×ûÓ¹̃̃ÙÚ•Ö‡ôĐĂó¶ó¸Ç̉ë§›’­ÍÓ›¾ù×đ9¥‡ÛÄÓϼß»ûÙÚ¬‡·‡‘×8ç¹à¥âËÉ9‡Çÿ¯¶Ươ™Ó‡ÚµåưÀ¶Ơ¡Ûù׌ŗˆßÄÙÛÀ›¶é­Ü«‡“Íj€߈¾Ú›¡ĂÙ·‡‘×8çăàá ‹ÇÅÓÛ«‚ ½9/ÍÓÛÀ‹Ç½¬Ä‡ºÑÓóÇŸîïäåÁă¬ÿ¯¶Úª‚ +¼9Ç̉Ï/©ǫ‡“ÍjÙ¾åÁ˜êèä‰Û«‚ ½9ƒvÚ×̃Á½ßÄÙ·ÔĂƠỞßÚëöÙÚöăˆŸ;k»ˆÍÄñcÑóßÄÙÛÄÓ¹Á˜‰j̃ZîS¹ÚÅôËÖÅÓ¥‰ÍL…¾ßÚÚÿ¯¶ö…ØÅ©‡¥2ßëMɇưÀÛ«‚ ½9äñëö߈ÑØĂưˆ·Å­ÄÛ«‚ ½9°»ùê½½‹È¯Ôơ߈­_ÑÄëÖØ…Ơ‹ÇøôƒÖ½Áź­ÖﻹÚ"ÏÔ׿8¾öÏÔ†Çív“Æ“ÆĂÙå¿߈ÏÄ9¥‡×»~́vßÄÙùס»ï½Û«‚ ½9ÏÔ¡h̀ªà•Œ9¥‡­Åêöÿ¯¶ăˆŸÇÖÛ«‚ ½9ĂÙ§¹«‡“Íj±»ưÀÍ/ơĂé‡ù×Úª‚ +¼9œÜ߈ÀñëØ߈ëöχ¡ỖˆÙÚµØÚ×ÍB‡×ăˆŸäÜ«»₫˹Ûºµè½œÏÅ©àÑØ™à9¥‡¿Ù£»ÏÔăˆŸ;ñ~µØÓ¼ÙÚƒv9¥‡å‰ô›¾½€ÁỨºçơ»»‡¼Ø±»»Ăß»ûÅ»9¥‡¹Ú«‡“ÍjÛ«‚ ½9Û‹Ù¹ÚÏ̉ׯ‡ÇçÚÏ|Ï̉Û×Ùö«Ô·ÛºÛºÓŧÔÑÓưÀÑÓëö²Ø¢ÈÏÅ߈ÅÔù×ÑÄëƠXå̉ ÓØ©Ø±»ùê…ñÖ9¥‡Ùڣظ̉̉ÿÚÑÅ«‡“Íj±»­Ô¿‰…Âׯ9¥‡ôÑÓ±»éô߈­Ä©Ó–À˜ÿ¯¶ÑÓÙܶٵƠÓºÛ×Ă¯‰¯0ÏÔɾñÆ›¾ÿ¯¶‡Ă½ÜíJÏÅù¿Ù½©ÇăˆŸ;k߈ï½Ù߈ëö¡ÔĂº¹Ú‡ ŸĂ½öÁµa¿ß߈¶Å¹ÚÅÓƒÔÏÅÍƠ°»ƒˆëö½ÔÏÿ¯¶ÏÔ›¶éơÅưÀ·̣ĂȯÈù׸ű»é‹à¡%Û«‚ ½9¹à‡ºăˆŸ;×¾ÿ§µØ›¾ÏÄ«»¢äÓºߌÛ,¯Ûù×±»ÏÔ÷ƒ€Æ_÷Á›¾Ù½8¤‡×©¼“ÈƠĂƠ™ëéåƒÚĂ¹Ú̉س¹Ú³đÁ™ä÷ÁăˆŸ;Ù½·Ô“½ăˆŸëö€ºÓºÏŽ諻߈ÿÚ´.¤Ùƒ¿‰ÁẮÁ¼À³Æƒˆg₫®¶8¤‡§ÔëöË́™‰kß [ïSĂ‡Û«‚ ½9–»ƒÑØÏÅËǯ°ù×‰ÔÆé‡ëö±.ûƒvưÀÁĂ¾º‡ÛÿÚơÔÙÚƒÔ߈Åơêÿ&ơÖơĹ½ùëÛ«‚ ½9ơÔ‹Ü¿‰·‡‘×8çEÏÅÛ«‚ ½9ÏÅơØ–¦̀»ëöÿ¼¯ÛÏ̉ÁƯËÓñÓ¥Ûë́ÏÔû©¼ßÄٵ؃vƒØçÚ™‡¾‰±»ĂÙÂĂöÏÔƒv­ÄרñÁù×±»çÚ›ÊöƒØÛ׵ǻăÁ¡Ô¥ˆ]1£ÔÑÄëÁĂÑӒȘ‰j̃ZîSëØÍÇ¥ÓÂÖ¹M߈éºÔºlá̉ơêưÀ£»ĂĂ ›­±àéM¥ÛËƠñÚÛº÷ڃכڃvö¹Ú™Ó±»±»ööµa·‡‘×8çĂ߈ÅÔ·Ó ¥0ËƠÍƠÛÚÇ̉…©ÓíÙÇœƒˆÚ€ºƠ¹Ú߈ăˆŸ;k߈ñÖÛ«‚ ½9µ‰ÿÛ₫öÏÔ˜êèä÷Ú¼ë…ôªø ÍƠ¡ÔÏÚßÄÙư‡±ù1ÔX±»‹Ü߈Ï̉ß»ûù×®Gø»±»ÿÛƠ¹÷¨Ø¹ØÙ½ơêöÁ°»ơĂ‚ ÿܶܺ«‡“Íjù×ÍƠË¿±»™‰kß [ïS³(‹Ç™‰kß [ïS“Á×÷‡ÑỞ—¶±»©¼Û«‚ ½9ă»ôçÚùׇ«Ôù×Ë%ƒv¿‰™‰kß [ïSçÚ‰¿Iív§ºåב́÷ÁÚª‚ +¼9§ôËÇÑæª»Ù½Ѧá=#ƒˆÍÄèêµÜ±»ÛĂÙƒƒáêŽÛ—¾ăˆŸÓÓơèÅñÓØY¡Ô±ËƯĂÙíÙïÚ‡×ÇØÙ×ßÚĂÈ¿‰ù×Ú×ăˆŸ—¶ÏÅæÚ¥̉öÅÙß+çô»yÍÓøê߈ÂëöĂĂ ›­±àéMá ²Èùô§½ß»ûÅÔâˆ;k±»™‰kß [ïS—ÓÅԵءș‡ơêºÄÔ‡j§ôăˆŸ;ƒÖ“íÙ°»ºØÅØ«‡“Íj°»½€ù×ƒĂ¡Û«‚ ½9æÚ…ÜôêơèÅÏÔ÷Á™‡ûÖÂÏÔƠÄï½§ÔÚ×ÛÄÓÏÓ¿‰˜‡$¹€èơÙÚỢ«‡“Íj“Ʊ»¸ÚÛ«‚ ½9Ï̉ŽºƠ±»…Öư¯ÏÔçmÏ̉¨ÇÙÚĽԡÁăˆŸÙ½µaùêăˆŸ;ßÖơÔ±»߈9¥‡½ÏÔ¼Ă©·¼Í7÷ÁƠXéöÎÅ™‰kß [ïSơÔ߈¡Á™‰kß [ïS×$±‡ÈĂ“ƠåưÀ±»èêœøÚ×ÂØñÆÓĂÙëÚÏİ»†º˜‰j̃ZîSèê‰y™ïŸ}í½ÏÔ“¹ƯN¿‰›·Ô· ÁƯĂĂ‹ÜÿܵØơêăˆŸ;Û«‚ ½9›¾ăàöÔÔºl²ÂÉư¿©+ñ̉«‡“Íj‚v´Ø—º÷ÁÁÅÄù×Û«‚ ½9›¾“¹ƯNĐÓù×™‰kß [ïSăˆŸ;k̀Ê)èÛ8¤¹Ú«‡“Íj°»¥qóÔÔ߈ăˆŸ;Ö¾8˜‰j̃ZîS·Å¡Á›¾߈¹Ú›¾…£­ưÀ߈™‰kß [ïS¯×ö“È»ˆå̉ ›¶éÈĂ'÷Á—ăˆŸ;ô£äÓØûذȫ‰„çôÛ«‚ ½9é‰ñ5ñ·‘ÆĂÏ̉ÅØÛ«‚ ½9ÓÛǛۓÛăˆŸÙ½›Ú·Å©½ơêăˆŸ;k™‡»Á˹½ồӵؿ‰÷Ô™‰kß [ïS߈߈¶Û«‚ ½9¡ÛÙÚå̉ ÿÛ°»Ϲ½™‰kß [ïSµ‰•Œơê­•··ÅµØăàÎ̉ßó‹ơĂ™‰kß [ïS¡Ûù×ív“ÆÑÓÂêµĂÙÅØƒvù×µØ߈»¡Ç‡ÇŸÖ9¥‡Û«‚ ½9Á?†´†߈±»½¯ÈÎÅ ¥Æ›¶éÙÚƒv÷Áû؃Ôă½Ơ‡ŒÅÓÙ̉Û«‚ ½9‡ÇơêƠX¿ôß»ûÁƯ¿Ô±½åĂÛ«‚ ½9ßÄÙ÷ÚéưÛ‡ŸÅơÔƯÓ ±»øëµØ©ØÅÓÙÏÅÔ…¿½™‰kß [ïS‹¿Ë%ÁĂóưÀ§ôô±ëØ«»߈“Æû釷‡‘×8çÅØÚDZ»¹ÚÙ½™‰kß [ïS«‡“Íj×¾©Úƒv·‡‘×8ç—¶ÛÜĂÙ¯G‹øăˆŸå̉ É»™Ó‡xƒ½³ô¶èơèÅËӒẛºÍÄ¥ØĐÄ꺣Ó󺱻‹ÏµØßÁáê­¶¥Æ¡ÇëöưÀ¢Æ̃ˆƠĶñÚ«‡“Íjơ»»½Ù½‚v›·ÔăºÁÛ…ô÷ÁĂĂ ›­±àéMƒˆÿ¯¶ăàĂÙ×¾á=ñÚÛ«‚ ½9£X©Ó˜‰j̃ZîSÙ½̃ŒÚ,•Œëö“·‡‘×8盾ưÀ¾ù×щ“Ơ±»́½ửÏŃvÀ̉§ÓÛ«‚ ½9«‡“Íjщ¿ÛóÇ%˜êèäÿ¯¶ĐÇ·ÔÛ«‚ ½9¼ơÉíËƠåÖưÀÙÚâˆ:‹ÇǼÜÂ*½߈¢ ¥ˆ]1µØƠX»ÓëöûÓ÷ߥÿÏÔÑØƒH˜Ó­Ô“ƯÓ ³ÂÆÇÓû¹Úá ùêăˆŸ¡ÛóẬ§Ա»Ïİ»÷ÚÍË)éÛ9¥¾™‰kß [ïSÅôÛדƠ¦ÆĂĂ›¹ù×ÏÅÑÄëëöƒvƒvƠŒÓĂÙijƠÿÚ”&Ú ª ‚  + ¼9 Çÿ¯¶ºƠ•Œù×­Rù×Ăºƒù×™‰kß [ïS«‡“Íjó8¤‡ÙÚ«ÔÇÖ™ëéåÿ¯¶á ߈ñÓăÏÅ߈ƯÓ ·Ü™‰kß [ïS°»±»ƒ¹ÚÍƠ™‰kß [ïS̉ÅÏÅ÷Ú«ÛưÀÙƠ·ÅƱ»ÏÅ”‹œHÙ½«‡“ÍjíÆŸÖ¿Å߈ÿ™ƒvô³ÔûÓ™‰kß [ïS½ßÖĂÈ…ƠÓ߈›Ú«Ôơêù¿ÅÓ›¶éß½®̉àùê“Ø—¶÷ÔÖ‘«ơÔ"‹Üƒv匿N•Œ³ÏÔ‹ÇĂ³(Ѿ8¤‡ëö†“¡Ó›¾ ÛµØ­Ä­ÄÑÓ¾߈á9¥‡ăˆŸ;߈ÖÆ߈ù×í£äÿ¯¶™‡áêÁñÿ¯¶Ë̉ÿ¯¶χË¿ùׂöÑó÷ÔưĂ÷ˆ÷Úÿ¯¶ơØơèż€ƒ‚vßGăÇíÍÓ·Ô‹Ç×ÚĂÈ™‰kß [ïS±”£Ø‚v…“ÈăˆŸ;ù׿‰µ†îÅ—§Í»“ÆûƠXéÓ•ÇÏÔÛ«‚ ½9™ëéå¹Ú«‡“ÍjĂƠ£å·ÅéÚ÷ƒ‹ÜÓÆÏĽ¿ØÂ¯Ø·Å—¶«ÛÙÚÛ«‚ ½9°»¡Á©‡¥2ßëM߈­Ä₫ƒˆ³Ø‹ÜÛ׫‡“Íj±»‹È½«‡“Íjƒv©Ø›¶éó§ƫ‡“ÍjÙ½ï‡É̉ĂÙǻٽ£Ç߈ÏÅ#ÙŒë*«º·ÔƒĂ©¼™‰kß [ïSưÀĂÙ™ÔÏÔÛ«‚ ½9ưÀÿ¯¶÷‡ăˆŸ;₫Ú‡ÛºíÚ‡xñÓ߈ăˆŸ;ÅØ‡ºä‰º“ºăˆŸ›øâˆ:߈ÿ¯¶ÙÚûÓ„0¾ÅÙ×ơêׯÅÄă½ÿ$÷Á©‡¥2ßëM߈ƠăˆŸ;ÄôưÀưÜ«‡“Íj匿N­Úù×߈ÇǼơºÛ«‚ ½9ÍÓ߈ơê¥ç¡Ôơêí—Gÿ¯¶ăˆŸ;°ê؇xÛ«‚ ½9›¶é—¾ª¶2tTɇÉà¾Íw©‡¥2ßëMñxÑÓáêù×—¾±ăˆŸ·ÔÛºË%äׇºùôŒE—ˆ«‡“Íj¾ŵ¤ØÓØŸÈŸ}¾¿ôù×Ưº“¼¿ºó¡¡ÔăˆŸ£è¿µØóÇ›¾‹Ü›ơ§Ô9¥‡âŸÖ«%à¬×Ơ†7§j£Øé´ơèÅ÷ˆÁƯ߈÷ÿÑÓÅàëÚÛ«‚ ½9·̣×¼«‡“ÍjÏÔÏÔ™Ó™‰kß [ïSÂÏÔ•Œ›¾ƠÁ³”‚v±»¶Ô™ơר߈±»ǼơÔÖ°¿¿‰î²2ưÀ¯́½8¤‡×ÿ¯¶µØ9¥‡çÛ«‚ ½9ÏÔµØÍƠ—ŒèÑÄëÿÚƺÏćÛÎÛ™›¡ơ|ÅÔßÁ߈·ÈêöéêưÀ¼êö +Ăñ»̃Ú ăˆŸăˆŸÅÓ©Ó¥ˆ]1—¾ƒ½çơĂĂ ›­±àéM“ÛÏÅù×8!¤‡!Öˆ©‡¥2ßëMưÀơÔùê9¥‡ÑÓ°»ăˆŸăˆŸ;¡Ư‚vơ‚×±»êöˆÁƯ“â»ôÿÚơÏÔÏÔË¿¿Å‹Ç“È¿‰±»½G½¹‰ÜÚª‚ +¼9ƒvôĂ™‰kß [ïSĂ虉kß [ïS³Î̉ú(ßÚƠX9¥‡Ăö¨¼Ûº­Äƒ×÷̣çÚ¾ŒE´È ½…·ÔÛ«‚ ½9À‡€è/Ö:×âÁ¿Å·Å›߈߈Óºщ‹ÇµØÿÚưÀåĂëöỠ„Û«‚ ½9ƠXáƠËÉ9©Ơ´ÈƠ¾G߈₫§á¹Û×ËÇÏÅ™‰kß [ïS£»±»™‡ËÉ9ÿLJÁÏỘÇĂÙ˜‰j̃ZîS»ôăêÍÄ»«‡“ÍjăˆŸ;éêëƠUÏÔŸÄÆ„Ç—ÓÅØßĐăàôêçøëö›¶é»Ø˜êèä«·3uUơê½€½îĂÙ»ó–™ơĂôơÔăˆŸ;–¶χ÷‡áÛĂÙ¶è½ù×ÙÚå»À½™‡¢Ç¡ÈËÉ9Ù‡Ï9…ÅÓ¿Å™‰kß [ïS÷Á½¾‡›¾½ƠX‘±ƒvÎÔ¡ÔÛ«‚ ½9¹Ú™Ă±”ùדȼñÚÿ¯¶Ï̉ă‘·¾Û«‚ ½9ÙÚ©‡¥2ßëM‡ÂÙù×ß»û‡÷Ú®Gø½ôχ¼ß„»½ÙÚ×Ơ†7§jÛ«‚ ½9•Èû›Ëlj¿IÙÚ™—¶Ø•‹HÙÚ›‡«‡“Íj9¥‡±¿°»Û«‚ ½9₫uµÛ°¿›‰Ù¥Æ¿‰±¿ăˆŸ;ơê߈±»ß„¿‰¹»ëöŒƠ8#¤‡#Öù×ßÄÙÛÄÓ߈»Ü÷Á¿ÅÏ̉§ÓÂÓÁÓÏÔáƠçÚÍÓ™ă©½“Ơ¿»§Æ°»ÉaƯ‰·ÔáêÏÔ­Öùׯ̉àƠÅ•ßÄÙ߈ù¥À¼߈‰Á8¤‡Öá3íêơêăơơÔÇçÍË)éÛ9¥‹Çív¡ØÛ«‚ ½9ñ֣䙉kß [ïS‰¿Iÿ¯¶Û«‚ ½9ÏÔ߈·‡‘×8çÛ«‚ ½9Û«‚ ½9Û«‚ ½9ëÓ×Ơƒv›Ú߈ÍÄ»¡±»›¾‚ïÚÏÔ½ÈÁƯívĂñÚµØÅت»·ÅÏÔÁ³ÁĂƒ½ׯÏÅæÚÁƯ¥åáØ›¶éă»Û«‚ ½9ÏÔ£äÑÄë‰Ö½™Á‡Œ“ÆÇÖÍÓù‡9¥‡×©Ç›¾´È˜‰j̃ZîS±ĂÙÙ½çÚ¸ÈÏÔ¡’Û«‚ ½9ăơ¼ÈÑÄ멇¥2ßëM»ØÔ“ÈơêÁܵØéÓ½ù×߈ßƯÁÁƯ™‰kß [ïS‡ÚµÏ£»ÇÖ«dé8¤‡«‡“ÍjỞˆ ”=  «‡“Íj¾µÛ×ĂÔ¯ÈY›¾ ƠÛ«‚ ½9”´ÈăàµØª‡’̀jĂÖÿÚ£äÎ̉ÆѶ±¿ËƠ°»ëÓ¡È̃ˆ£»¦ºä̉ƠÅ™‰kß [ïSé·߈8¤‡§ô€+Ở•ŒÓ‡½€ĂĂ³ÁƯĂÙăÇíÑÄë“Û‡¡Ơ·¡öÔ›¶é‡Ûù׿ÅÀƯ®àƒåƠÁ™‰kß [ïS§ỔÁăˆŸ‹Ç«‡“ÍjÑÄëÿ¯¶¹Ú–¿àöëü—»ÄÄÛ×û¿»…àÀƯö¬ºÏÄ™‰kß [ïSgø×“Û•ÖÓùÚă»åĂ∷ŷ‡‘×8çưÅëö¾º°»‚½«‡“Íj̀Ê)èÛ8¤½ƒ¥º—²¼¸ÁÏÏÅăˆŸßÏÛºûψÇÖ±¿ăˆŸ;ËƠ›¶é™‰kß [ïSÚª‚ +¼9ĂÈ—ÓÛ«‚ ½9ÅÔ×Üëöù×øº߈Ó̉™‰kß [ïS™‰kß [ïS÷Á“Ơ÷Áù¿ÍÄßÜ€ƠƠ‹Óƒ¾‘ăóÔˆø×‡ŒÙ½ï½ÇÖ½€¡ƠçÚôÁơèš۱»€Û—•ëöơ…¥Á׿8½€ø×œ‰¾Iă࿉“Æ×Óß»ûܺơê½ƯÓ ØY†»Ü™‰kß [ïSñƠ¶£Âƒvù×®ăˆŸƒvó|Çä¹Ç‹ÈÏÔ½Èè¼%¶ + + ƠŸ\µ”ÇÖº)ÇÖù×ăàëöÛÀŨ׾ưÅíêăˆŸ;›¶éÅÁ²¹ÏÔ÷Á¡ƠÏÔùסԡÁœÂÙ½ÏÔ9¥‡‰y¶‡Ö8æƒ×ñÚÙ×ăˆŸ;Å%åÁ9¥‡“ÈïƠ·ÜƒvßÄÙăˆŸ;̀BÙ½«‡“Íjôçô™‰kß [ïS¯ÈÏÓ̃ˆ£Ø½€­ÄÍË)éÛ9¥G½¹ĂÙ¾ñÓ¿ÅưÁïÚǑۿ౻ƠµØÛ«‚ ½9ªÚ ÛºơÔ³ºóÏ̉ÍƠø×₫®¶µaăˆŸ½ÔỂ߈ăˆŸ »¿ß£ÇƒÖưÀÓ¾¬Öœ‰¾I“ƠĂĂ߈ٽƻ +‰¿I™‰kß [ïSăˆŸ;Ï忇Œùê9¥‡‚v¹ÚÅØ·‡‘×8ç߈Ù̉óÇ·ÔĐĂø×ÿ¯¶±»ÏÄÅÓ…à ÁÙÚׯơº½Z¼ñÓ‡¥ÓöÛ«‚ ½9ƒ½‹ÙµaÇփ׫‡“Íjö»ÁĂÿ¹ÓÛƒÖ¤ˆ\0¸ÚĂÙä¼¹Œ¡Ơ–¾ÏÄ›¶é©¼ÓÅưÀëÓ‡ívăàæ$ÏÔÂÙ¹ÚûøÁ̉›¶é»ÏÔ߈پ퇧ؙ‰kß [ïS¯×퇩ÓÙ׃ˆÏÚ¦Æêö©‡¥2ßëM™‰kß [ïSßÚ›vûŸ}¿‰ĂÈ©¾œùê›ɇ‘Ú¾ùׯƒ« +>רÛÄÓ¢ôÛ«‚ ½9½ÔÛƯº‘̃ƒˆ•ŒÁƯ½ăˆŸ;k»½ëÚçÚ±»ºÏÅׯĂßÅéºËÉ9ƒv¡Ô¾Û«‚ ½9½ăà©Ó±Á÷Ú±»À½ºí̀ëÓù×ÏÅ߈™ôáêéÜ“Ç×¾Ù×ơ»¿“¹ƯN߈ơê¥Ø«»µÈưÀ8w¤‡wÖ…¾Ù½Ù½µØ«‡“ÍjÁñÚª‚ +¼9†ŒÅÔĐ·ÂƠı»ñÖ߈°»ºÈѾ™‰kß [ïSåë×úºï»ÁƯù×Á¼ùÚưÀ“Ơ«Ó©‡¥2ßëMÛ«‚ ½9ùט‡™ÓƯ¶‡Ö8æ“Æ˾ƒ¾‘ÍƠƠÚÀÇÚ°»¡ÿÚ̃Á–Ó߈½¶ˆñÚù׃v™‰kß [ïSûؽ·È­ÄĂ÷ÁăˆŸ;Ó̉¤Û¿‰%ăˆŸ;9¥‡Ăèyëö›Y½«‡“Íj—Óϼù꫇“Íj°»‚vÙ½́½¿™‰kß [ïSÓ¥éêÛ×±»Å–9¥‡™‡©ó‹©—ă›˜‰j̃ZîS™‰kß [ïS¡h÷‡÷Á¾¶ËDZ»Û«‚ ½9ñÚ÷Á¿Å…Ô¡½¼Ơî½€·Å±»åŒ¿N¨ºß»ûƒˆÑÓßÖăˆŸ;—Ó·Ó ¥0¡ƯĂÙ›‰ƒ½íJ߈™‰kß [ïS÷‡™‡ƯÓ ™‰kß [ïSƒvY¡/Û«‚ ½9đ‘·ăˆŸ;½ï½ÑÅ߈̀Ó½°»©‡¥2ßëMăˆŸ;̃ˆ´†ÑĂåÁ߈Çç©Ó‡ñ5߈¿‰ß„±»›¾ÿ¯¶ÏŵØÑØĂƠĂ¿ôؽ›¶é÷ˆÂ©ˆÓºù×Ï̉‡ÙͽÔÏÔË%±»¿‰ÿÚªĐÓ*ËÉ9ËÉ9£Ø°»­ǾÆÚª‚ +¼9‡Û~±»ĂÙ߈ơÔưÀ"±»—ï“ƠîƠ»Óÿ¯¶…ÖÛ«‚ ½9̃ˆ‡ÚàóÓ•ÛÛÄÓô‹Ç߈¡Ø·§D ‹Ç¹º¢X½ÔñÖÿÂÇäưÀ½±»ăˆŸ™‰kß [ïS·ÅÏÅơÔÏѽơÔ¡›¡çô™‡µaù×ëöœ‰¾IưÀăˆŸ;ÿÚ«‡“Íj—¶„n8Z¤‡ZÖÖ¼ëÔ9¥‡«‡“ÍjÙÏÔóÔ‰Û¿è±»·Üù×—¶¹ÚĂĂ ›­±àéMÈív‚văˆŸÁËÅÓëöăˆŸ;kÁËơÄù×Á¬Ö½Â™Ô9¥‡ÂÓ «¼ÑÅĐÅ¡¼߈²Øׯ߈±»̣ÇÛ×ĂÙû(·#«»­Ä‰Áƒ9çôºăˆŸ;™‰kß [ïS¡È—¶£‡‹½±»¥âÇÖ™‰kß [ïSˆƯÊÓ¸ÚÏÅ÷ÁßÄÙñ +Ñÿ‹ö±»‹Èæu±ëؑړƠäô›¶ééÓÍáĂÙåѯƠ½–»ù×·‡‘×8ç±»«Ôø×ñ—°”±»‡ƒvĂÙƒv«Ô°»ă­ÛßÁ߈­Ä‘Æö©ÇÚ½·Ô€%Ž«ÔƠî÷Á«ÚƠơèÅëÚ9¥‡•×óǵØÑØă½Ă«ÔÏÅÓỞ™ëéåÿ¯¶ù×9¥‡¡Ôăơ¹Ú±½ĂÖ©‡¥2ßëM÷Ú—»‘Æù׿”±»Ă¼™‰kß [ïSÛºß+›¾ĂÙ½Û×ă‘·ÏỘÔá=ÿ£ØÏÔ¶èí¿³ï½§Ơív·Ô°Ô º¿‰ëöË߯ӽ€ŸÈƒÖƺƯñ»¶ÅƠÉ™‡ØÅêÏÄÁƯ§Ó›½¾º˜‰j̃ZîSÙÚß»û«‡“ÍjÏäô’ƠÏÔüÁ Û«‚ ½9­‡ºÑĂÏÔÙ½†a +Ù½“¹ƯN±»½ù×Ä›¾ù×9¥‡·‡‘×8ç³¹₫çÚ¯¥Ûƒæá¡ÔƯºƒvº̉ÅôÔË̉±¿›¾ñ~éê˜ÔăˆŸ;äÁ¦Ô9¥‡Ïű½™‰kß [ïSăêÀƯÙ½ÛÄÓ±»¹Ú¾ăˆŸ;kÛ«‚ ½9ù×ÏÔÂÛ«‚ ½9ÂÈƯÓ ƒˆŽÛ«‚ ½9óÜù×߈ñÖ¡G‹Ç™‡ÏÄ™‰kß [ïS½“ù߈Ñæ߈Óºß+ñÄ›¾°»£ØÑÄëÚÀ߈éÚ…¹ÚñÚÓ¼÷‡‹È½ôÛ«‚ ½9Ñ×ÍƠµØÛ«‚ ½9«Ô©‡¥2ßëM™‰kß [ïS¯È¹ÁÛÆÛ¦£ ÓÆ™‡ù׫‡“ÍjéêÓØƒØ½€Ơ±»™‰kß [ïS½ôÚ‡Á¡Á9¥‡ëÚÓÆƒv˜êèä߈±»±½¸ôƒ¡ÁĂ…—¯‰¯0¿ßñÓÚª‚ +¼9‡àơĂ¿ó¶Û«‚ ½9ésáêù×éÓăˆŸ;ÇÖñ»óÇ߈±ëØá=ÏÔ™Ôä̉ɇ–¶……¡ÔÅØívª»öƒv×Úö%¶Ô«&™Ô“Ơ¥Øå̉ “Ơ»n¹ÚÁ™‰kß [ïS}¡ÁSù׃vĂÙăˆŸ;kí—G¬ÔŽ߈›¶éÛ«‚ ½9Ươ½ËÇáÅĐæ†º ÂÈÇ篼ưÀÅÓÁ½ÁƯ«Óå̉ Ó¹Ú¯G‹ø¹Ú½Ă«̃ÂÙÙÚ÷‡ÑÓ£Ơùꙉkß [ïSø×q«‡“Íj½ÁƯ×ÜçÚ÷ÁáÛƒÖéôưÀõØâ­ÄŸ˜“áƒv9¥‡߈Û«‚ ½9¡Û£Ø߈½›¶éÿÂψÏÅ«â½̀Ƈx÷Á·‡‘×8çăà´†¾“È₫Ç.ơÔĐĂ$›»¼«‡“Íj”ÈúĂÙ‡x߈Û«‚ ½9ÏÔ÷Á߈ÇÖĂƠ©‡¥2ßëM§Ø›¾ÛÄÓ¸ÚƒvïÂÙÚ«‡“ÍjÔù׳ÈÏ̉÷ÁĂׇ½7Å“ƠÉ»‚v“Ơ¶ÄÓGív±½ßÁÛ«‚ ½9½Ï̉ơº»ÁÁµƠ¾ßơ»©Ç—ÓỞ±½ñÁßÄÙ¡È߈ÏÅ™ÔăˆŸ;‡½™Á¾‰µØŸ’©‡¥2ßëMíøñÚ¹àØƠƒv߈ªdĂĂ™‰kß [ïS†Œ   Ï̉ơê»Ø­ÖÿÛ³ºó麺½©Ó±»Ó÷ÁÏÔÀĂÁÚ×ƠóÇÏÔÏÔăÓØû ÿ¯¶ƒÑÓơèŹڡԫ‡“ÍjĂê­Ô߈«‡“ÍjËƠĂÙù¿߈ív“±»ăˆŸ;’¹ÜNÛÄÓÙÓù¿ÏÔ× ëöÏÅñÁÛ×߈ă½ÏÔÁ̉‹Óé׿‰íØăˆŸ;±»ÙÅëÏÔá ĂÈăˆŸ;óÂø×ù×­ÖåÁơÔă°™‰kß [ïSÁƯ¯×£Øå‡߈ûØÛ«‚ ½9‡ñ5±Áù+¾º˜‰j̃ZîS±»ËÉ9©¼ñÖʼn`ÅÓçÚ¨‡¤2€̃êLÙ½¾ß߈«‡“Íj“¼£ ¿‰‰ÔƒßÚ¿ºà=߈öÔܱ»·‡‘×8çéJé‰Ó5“gesÁŵaăˆŸ;áۿŵØÙÚ₫ÏÅ9¥‡«·3uU°»†×±ô8¤‡çÚ›‰ÓÛù×™‰kß [ïSùêÂăà™Ó¾¹óÔ’ºÛÄÓÑĂß»ûçØûإܹ½ÿ¯¶›¾¾øµØ߈Ơ›¶éƒˆ±”°»ƒá=ÙÚÿ¯¶áê‰ɇçÚ½ÏÔ¡È9¥‡ăˆŸ;çÚÂĂƒṽˆ”%ÍĂû¡Ư™‰kß [ïS–¶™‰kß [ïSÙ̉¥ÛơêÚª‚ +¼9¨Ø߈ĂÈ߈ƒ×ñÓù×Û«‚ ½9ăÁ‰¿IåÁôÄ™‰kß [ïSÿÚù×™‰kß [ïSÏÅ…»ĂèÁÛơÔĂÙ‡xÓº½ơÔßÖ¡»™ëéåưÀăˆŸĂÙù×穇¥2ßëM‡ăˆŸ;«·3uUÁƯÚª‚ +¼9ùÚßí«Ô¾óÇ™‰kß [ïS±»‰ÁÛ«‚ ½9„'ÁĂ߈±»÷Ú“È«‡“ÍjăˆŸ;9¥‡¥Ø™Á›ơÄ߈Ûêí—Gûә࿺ÅÔÙ½…¼¿‰Û«‚ ½9Ûׂˆå̉ ½ô퇪d‹ÇÏÅÄÔ§Æ÷Á¹ØñÆ­Ô­v›¾¡»ÅÓ§¹¦Óí꫇“Íj¡ÔÙÚͼ¦ÔÛ«‚ ½9åçÓÍÓ«·3uUÓ«&ßÁ™Ø¹ÚùêÛ«‚ ½9߈¿Åùô«ÔŸÖĂĂ ›­±àéMÀëö¯È¡áê¡Ô‹Èß„ùת¼½€öÓˆ•=‘ˆáêêöÚÀív™‡ÄÔßÄÙơêù¾߈°»ø×êת» ƒ½™‰kß [ïS¨º¼ZÎŵØÛ«‚ ½9ỞY™ơ™‰kß [ïS߈«ÚÚª‚ +¼9›¾¬Ö÷Á‡ºưÀùơ½u‰ÛƒØ«‡“Íj˜‡ÍÓóÇÛßÁŽÚª‚ +¼9³È¢äƠµ¹ÚƒÚ“Ûù׉¿IöÉóÓÜ̉ÆÅÓÙÓ÷ÙÙÚÛ«‚ ½9«ÔÇÖ±»߈¸Ú«‡“Íjçô™‰kß [ïSƒvÍáÙ½½Ü…ÔÖØÏÅɇÛ׿‰Ở̃ö̃„“ƠÏè߈ñÆĂĂ£Ó‰¼¡‡ºƒØ¸Ú¢XÏ̉˜‡ñíÈéê·‹™‰kß [ïS±»çÚñÖĂÁƯ‡»ç$«Úâ +Â3 ưÀ±»“¹ƯN©‡¥2ßëMƒ´߈†ô™‰kß [ïSơÄÂÙăˆŸ;›¾ù×ÑÓóÇå×ÎÅ÷ÁÉĂăˆŸ;G½¹Ởöʼnԃˆå̉ ©‡¥2ßëMͼĂ¹ôé ëö™‰kß [ïSÁÑ•̉±»ÿ‡߈ƒkÊÇ£ Ž©Û«‚ ½9«‡“ÍjĂÙ±»ĂÙ߈ÏÔ§¥ÏÅÍÓµØĂÈ÷å5ÓƒˆăˆŸ;…Û›¾ƒÜÑÄëßÄÙ‹Ù߈©Çù‚Ë¿»ˆ²™‰kß [ïSôꩇ¥2ßëM“¹ƯN¨Ç©Óíê÷ˆƒÖơêÅØÇ»é‡å̉ ÇÚÚÏŶô•ø¡ÁăÇíÂÓ÷Á‰ÛỞ¥½ÏÔ÷Á¥ÛÅÓéè9¥‡ÍË)éÛ9¥×¾ƯƯ«‡“Íj‡ñ5‡ĂǛÓ³Ø·Ó ¥0›·Ô‚„ØæôÙ½ÑÓĂ—¶«‡“Íj‹ÇæÚÅĽơê«Ó̃ؽ™‡±»»Ó—¾Ë ưÀ½Ô¿ Ëû“Ơ™ëéåăˆŸ;×¾8ǻ۫‚ ½9µ.¥Ù×Ơ«·3uU›¾©‡¥2ßëM·§D Û«‚ ½9ٽũӟ½ô Ù‰Ô©º™‰kß [ïS©¼ÿ×ÑÓóÔ•ŒăˆŸÛ«‚ ½9íÚß©¼ËƠ«‡“Íj‰Ơö‹ÜÙ½Ï̉ĂÙ›v›¾ơèÅÚª‚ +¼99¥‡Ù½ËÖÖÔ†6¦jơ궓ƧԷܱ»çô¾ÿÚËñ×Ü“Ơù×̀ÓăˆŸ;Ñóù×Á±»÷ÚüÀ‘ăà‡ù×ƠóÙ½¤q˜ÛI™‰kß [ïSIƒˆæÇ²߈»¼‘çáÓ̉›v·§D “ÈÏÅ«‡“Íj«ÔÎÔ§±»ƒÚ9¥‡çô¥Ó8¤‡ÏÔ¬ÖÙÚ¡ÔÁĂ½ÔÙq߈£äÓºư“—ÓÛ«‚ ½9ĐØ½€“Æ™¹ÏÔ“ÈéÓÏÔÛºÛ«‚ ½9Ï̉°¿ÓÆ£Øư;÷îñÖöä5̉®¼Úª‚ +¼9ĂÙÙ½ÛºËöÅÔăˆŸ‹¿Ẹ̈9¥‡×ÿÚ»ÿÏÔ¹ÁÏÔϼù×™‡åĂơ\ßÄÙ©‡¥2ßëM󫺵Øå̉ Û«‚ ½9†äÿ¯¶ƠÄÓÅưÁ¡%«‡“ÍjăˆŸ;kÏÔƒv‹ÇáƠ߈ß»ûÙ̉µØ™‰kß [ïS9¥‡ÓƃvË¿ÉĂ½ÙŒë*«9¥‡µØ£Ô™ơ«Ôª»ơÔÙÚĂÈÆ߈÷ÔívºñÓ›Úæ“º¬ÖÚׇøëö¿Å̉ƽÏÔ¯·ÅÛºïÚ­¾Á½›ÂñÚù×Ï̉ŸÈ¿«‡“Íj±ÁơèŪº•Öƒæíºׯ«‡“Íj¹Ú¡ÔŸ¾¥ÆÏÅ¿ốv°¿ÛÄÓüÀĂĂ¡»·Ô”‹œHƒØøơù×½§Óù×çÚ²ÂÁƯă½ÁĂ¥‰ÍL…±»‰;½È½÷Á߈›‰±»‹ÓùêÏÅÛ«‚ ½98¤‡×ïÚƒˆ«‡“Íjù׿ôßÏÎÔù׉ÔÓÛ«‚ ½9«»ßÁ÷å5 +±»Ù½ù×̉Å¿‰™‡9¥‡£»ß„Û«‚ ½9¶(è(ÿ¯¶çÚ¡ÛË%ëöív÷ÁƒÚơÔ¢X“øÛ×™‰kß [ïSív߈ßϱ¿å¼ ×܉¿IâÂ3QÁ‡é/×:ƠÇÖ©Ó«‡“Íj¸Á±»Ÿ}™‰kß [ïS퇽å̉ å̉ ßÁÏŻӺ§È¡%Ô™‰kß [ïSơ»½È«ÚëöÙÚĂƠ‡Œ» ׇ‡ư2ăˆŸ±¿߈½­Äƒvù×óÇ߈Çô™ôÁ̉÷¼—¶áê‡Çí$›¾ơĂơỐ¿‰½]…LJè¹ÁÏÅÏÄăà™‡¢äƒvƒ½à=G½¹¥Û©‡¥2ßëM߈“¹ƯNº ¹ÚåĂå̉ ¬¿шÍÓщÉÉ·§D ÅØăˆŸ;ØÚÍÄ©¾·¼Í7﻽¬Äơ½…ŒÛ«‚ ½9$Ü÷Á¡È¿ÅË̉ È‚vù×ñ̃ˆÇÖ±ĂÁ™‰kß [ïS¹•±»‹ÇăˆŸ;öø:¡ÔÆăˆŸ¿́—ˆÛׯÈ́ê£Æ½Øçá……Ơ«ÔƒvưÀÍË)éÛ9¥­¾¡Û›¹·Ô«‡“ÍjÊ!²È,ơèÅÿ¯¶©˜‰j̃ZîS߈‡öˆ½ù×ÿÚâḈƠ­¶“‚±¿¡ÈÍÓ̃»ú£»³Â£ƯÛ«‚ ½9Á¹­Ä†Ú½ăˆŸ;‡xù×ưÀĂÙ‘Ú›Û½€«ÓéÚƒˆ…Ú«‡“Íj¯È¾Ø÷ăˆŸ™Á±»ñÓù×™‰kß [ïS•́›·Ô‡ŒíØÅÁåÁ«‡“Íj¿‰ù×ÏÔÏÔù×óÇÛ«‚ ½9Á×ù×Å»öä5̉å̉ ̀½ơˆÑ̃±»ó±»ÀĂ ÍÓ¹Úÿ×ç½ñÙ™‰kß [ïSñÖµ†߈߈±»±»ÇÖ߈ׯÁƯ¼ôÅÏơ­Ä¹Ú½ùס۱»íØÏÔY·Ó ¥0ăˆŸ;úÔ¾FÎ̉‚v“¼ÑñëÚ›¾ëöÏÔ›¾Á“º¡Ô…²ÏÔăˆŸƒvï½çÚ­v±”¥b­Ëéê·ÔÛ«‚ ½9ÁÚ•Èû››̣Ù½‹•½ù×å̉ ·‡‘×8çψ©‡¥2ßëM¶%%ÍƠ™‰kß [ïSں籔¯×ĂÅ·߈ÖÿÂèºßÄÙ÷ÁÛÇÂÙß„ïi±»ëö£Ç­ßÛ«‚ ½9³ÂơԷذ»ͼµØ»Ă™‰kß [ïSơÔǺж¼€ƒü¦†«»¹Ú™‰kß [ïSçô‡ÚÙ½›’Ï̉ïƠ§ƒ”ă#߈߈Û«‚ ½9ơê¼ôĂôĂơêÛ«‚ ½9íÓ‘˹÷Áëơ¦ºÅÓ«‡“ÍjÛ«‚ ½9ÓÿÛ‘[ă‘·©Ó™‰kß [ïS¿‰ßÚơÔƠëöö‡Û«‚ ½9Ú×÷l›¾÷ÚÛ«‚ ½9ù׫ ©ƒ»5ƒv›ÚÙ½ëöåÍÄ)“ƠÁ¥ˆ]1ĂÙưÀ“Ø«ÔÇÏÔƠÇ̉ÓÔÏÔá »Ø‡Úûú‡Ç—¶«‡“ÍjÙÅëơê­ŽçÚ߈ơêÍÓY÷Á‰\›¾¯é³ñÆ +ƒÏÔÅÔƯÚ꫇“Íj Ơ ¡ÛĂψßÚßÁơ‡½½™Ô±»ñÚó¡ÛÏÅåÁÂٽ匿NƠ¾GỞÛÀÆÛÄÓ›¶éÅÄ™‰kß [ïSù×éêÛº™ëéåôÔăˆŸ;kÑÓå̉ ˜‰j̃ZîS߈·‡‘×8çÑÄëô‡ù껽×mëö™‰kß [ïSÚºÛ×ëö˜‰j̃ZîSËÉ9™ëéåÏÅÁƯ‹ÇµØ»ÁƯÓ —Ó÷ÙµØăˆŸ;ËqÜÓ ©‡¥2ßëMåÁăˆŸ¨ÑÓ߈³à±½«Ôщ™‹ÖÜĂº¹ÍÓÀĂ¾°»±ÁÜ·ÔÏÅÁ×Ù‡Ï9…™‰kß [ïSƯơƒv߈ψưÀ‡9“ÛÛ×ÑÓ—»Ѷ¡Û¤ÛÁ̉Ë¿ÿ¯¶߈‡ÇăˆŸ¬Ö±»ÁƯ∵ØÊ%·‡‘×8çщ·#ßÄỤ̀Ô—¾Ö‡ú¼7úË̉™‰kß [ïSơêÁS·Å›¾ơÄá=ÇƠÚ»ơƒvÛâ“Û‰¿I°Å¤ÈÏ̉ư“ÊØ™‡ƒw9¥‡ßÖÅ™ơ“ŒÉăˆŸ¨¼Á߈¼ívÑ·«‡“ÍjăˆŸ÷£ëö¯̣Ä$щƒôêơêƒvƠXƒˆß»û½·‡‘×8çÁ×ơ‡Ó¾£ä“ÈÙܹó­Ä߈ĂÈÁƯÿ¯¶…Ûш«‡“ÍjđÖÿ¯¶Ă¼±»ÿ¯¶߈ñ…Ö÷‡÷ÚơꇅưTÀđÍƠÛ×½ăˆŸëö¸Ù½Ăß»ûä̉ƒ×ºëöÅ₫ÿ§íÖíê±»ź¡»ăˆŸ;ăˆŸ;ë—ˆ³àûƠ×̉ßÁר½­¾±¿Ôºlͪ«‡“Íjƒv„ùׇڗ¶ƒ§ô¢Ç ÷í—GÙ±»ï½ĂÈáêƒÓÓåêâؾ·ÅĂÙ߈Û«‚ ½9º÷ÁÑ·ÁƯ«‡“ÍjµØÏÔ¾ÔÙ½ơĂñÚôÑØ©È±»…=ËÇÚª‚ +¼9ĂÙăˆŸÏÄ™‰kß [ïSå̉ ¦Ó‚vщ×¾ĂÙù×Á̃ËÉ9›¾á ù×÷Ù¼ô߈§¡hË–ï½9¥‡éºưÀµØƒv—¶ăˆŸ½¿Ù½¡ÔÎ̉ƒÖÙ½±ƯÓ ÎÔ‡߈ëöẳ»qÏÔù×öăˆŸ;»Øö¶Ơ9¥‡ôêŽËÇăˆŸ;‰í¡Ơ¾×$9¥‡Û«‚ ½9¹Ú“‹°¿™ëéåÚª‚ +¼9¢ä¯Ó» «‡“Íj›¾¢ÔĂº¡ÔµØơèÅ¥¼ăˆŸôêÙ½½ÜÆô™Ôׯù×çÚĂÈëöÚ½̃ˆ«‡“ÍjÇ̉½ôƯºùÓÓ­Ô½ÿ­©ÇăˆŸ;«‡“Íj¡È©‡¥2ßëMƒv£Ç˜‡÷$ËÉ9±»‹Ó߈™ÓăˆŸ;áöËƠ˜‰j̃ZîSÑĂϫԯ‰¯0ßÏ›ƠƒÀÛÅÙ×ïÚÏÅưؽä̉óÂÏÅÍӹړƆÚÙ½ƒˆĂºÏÔù×á̉±»Áâˆ:‰Ăå̉ á=׿8Åñ™‡¡ÈϼÏæÔºù׺Ư‰ÏÄƠ½€«áÛ÷ÚăˆŸ;™‰kß [ïSêö«‡“Íj·ÔÛ«‚ ½9ódz׾߅Œ‡xăˆŸ»Ø©À¼Ôç½öÁù×ÁẰÓ½€“ƫԅ۳«‡“ÍjÓÅƯÓ ÏÔ€‚áê™2¡Ôº½€›¶éºç*ÍÓÅØÛ«‚ ½9ׯơ»ÏÔ¹Ú½½£Ô߈ơÔÛ×ø×ĐÄ꡿ŵØ߈™‡©Øơ꫇“ÍjǵØßÚ‹ÇåÁăˆŸ÷ÁÏŽԉƯ$‡º½ăˆŸó¶±ôƒưÀ¯‰¯0ŸóñÖ±¿™‰kß [ïS«·3uUÁ̃ ËûǺƠ'ưÁ©ÏÅØÚª‚ +¼9»Å½ăˆŸǶßֻةÓàÅ'©¼ùêñÆï½ƒÖÑ×ûø•'̃ˆÛ«‚ ½9ÓăˆŸ;çm÷‡ù×àê È±»ÛÄÓÏÅéû±»«‡“Íjº‘Æï»“Ơö¯G‹ø£‡÷Á±»‹ÙÅơÄ÷Ú©)™‡¡Øç'Ë©¼•÷ù×ăˆŸ;Ú×›î™ôÍß¡ÇơÄÛ×ƯÚƒˆÓºÙÚ¿º§Ô©‡¥2ßëMäôêØÛ×ÏÔĂÙÙÚ§Œ£»¬¾•ÓƠ½“ƠñÚ½€Ó½§‡Ù½…ØÁ®GøÇÖ‚éºăêÚÀỞ퇺±»ùן\ ơèÅÅỌ́Âù×ÏÅáÍÄÏÔ·Ô·ÔÁÓ̀Ó«âƠÔöÁ›¾ö¿Å‡9›ÚÖƠ÷Á«Ô¹Ú§Ơ›¾ÏỖˆ߈¶ăˆŸ;k¡»‡ÚÓÔåƠăˆŸ;ÅØ™‰kß [ïSû¼¯G‹ø™Ó¼ĂËÇá ‚ƠóÉëö³’Ûº‘Æ…̀êÔ1¯ÛÁƯÚÀѶĂÙ…ø•ŒăˆŸ;›¦Ï̉ñíÈĂ#áê­ÄÇâùơĂ’ˆ«Ô›¶é¯¾8¤‡ƒàưn°¿߈¿‰ÑÅæÀ‡Ú₫÷å5Ó±»߈߈À‡€è/Ö:­¾×¿8óÇÁƯ¶ăàÅØÛ«‚ ½9º™‡ƒvÙÚ̃Åù×Ăô€öüÓëÔƒv“ȃˆƒv¤ˆ\0’˰ÁÛƒÔƠXÍƠªÚù×Å̀½Û«‚ ½9±»ù×ëö«Ô™³µØ±»ÿ¯¶“È•©ø¹Ú¬ÖÏÄ÷ÁËlƠ±»ÏÔ¹½ĂÙ­@ù×ÙÅëÿ¯¶«·3uU÷‡©‡¥2ßëMóÇưÀÛ«‚ ½9ÅØ©‡¥2ßëMëß±»ÁƯöŸÅ–Á‹Ü™‰kß [ïS÷‡Ç‡Œ̃ˆúµØö¡Ó̉÷ÁÅn¿ßëöá “¼“ÆÚˆÙ½ïƠ£ƯÛ«‚ ½9Û«‚ ½9ßÚơԩӱőù‡°êØ«‡“Íj¡Ô¾*ăÇíçÜívÎÔËêö¡Ô—Ú«‡“Íj“Ơơ곺óçÚ߈ÏÔ×ƠçëÓ±»Û«‚ ½9ؽµØ̃ˆñ֣ォÔÀ½ưÀÁ¡ï¿™‰kß [ïSÆô߈¿Å‰ÆµvÚÀÁ̉õ.¥Ù¾ÑÓÙŒë*«ª»ăˆŸ₫¼ÿ¯¶ Ëû¿£ƯÏ̉¦Ôª‡’̀jĂÆ‹Ç«‡“Íj½ÑÓ½§Æøêü̉ׯơèÅÑÄëÑÄ뿹ưÀ©Ø½±Á»‡ؽ‰y›¾רߘơÔÛ«‚ ½9™‰kß [ïS¢äưÀ¯)«‡“ÍjÑÓ›ï½ÏÅå̉ ï½ñÄÓØøêƒ×™‰kß [ïSÏÄ¿¾Å߈¡ÈăˆŸ±»ÑÓ¿ß·Ó ¥0¡Áv§ØÎű¿™‡ÁĂ™‡›¾î½Ơׯ Ơù×ĂÈ©Ø·Ó ¥0ÏÔ¾÷ä5̉ñÓ̉*ºñ­±»Ù½߈ö‚½߈ù×û¡ÁéJé‰Ó5“gesÁÅ÷Áë¼÷Ú¿́«‡“Íj™ĂÁ½ߌÛ,ï¹ÚÛ«‚ ½9߈¥ÆÏÔùôÛ«‚ ½9ơÔ߈ÇÖ¿»ëöÛ«‚ ½9‹Ç߈ưÀăơëöÏÔ™‡óÔï³2ùôçôX¿‰ĂƠ¡»£»Ô°»ĂÙÛ×ÿ¯¶±»ÛÀ½€Ø×™‡©ØÀĂÿ¯¶³Øơêáê…ô«‡“ÍjßÁº«dËƠ·Å§Ó©ÜĐÓÍĹÚüÑÄëÏ̉‰Û¹Ú·ÔÑ»Áß²ÓµO¹Ú¹ÚĂÈäƠăÂăˆŸ‰Û«ÔăˆŸ;ÖÆ ơÔ™ÔÖ€Ô†€6€¦j€Ë̉߈ăˆŸ;·‡‘×8çÅ–ä×ăÁ³Â Ëûù×ÍÄĂøôëöĂƠ¶ÅíêÛÁ̃»ØíØÑÄëíê¡È¾¡Á¡ÑơêùׇŒßæëöÛÄÓ±ôâj̀Ê)èÛ8¤ƒöªÔ«Ô…Ơ¿́¡È̀Ê)èÛ8¤åÖ¡ÁÁÓɳĂ‚v÷ÁÖ$å̉ ™Ø¯¾Ú×›¾ơꩇ¥2ßëM›Ú«‡“Íj°»ÑÅ¡h­ÄÛ«‚ ½9ù×éêơÔÁ‡é/×:‹½ÿÚ÷ÚÖ °»›ÛùשÓßÄÙ¼€µKƒv·‡‘×8ç÷Ù‰Á±»½µÀå̉ ívÔơêÁ¼ùêùêơį*ăˆŸ‡Çƒv™‰kß [ïSªøºĂÏÔ߈ׯߌÛ,ưÀËÖàê¹ÚßÖ«dù¿ơêăˆŸ;kƯÓ ¸ÚÅĪ ¨ƒº5ưÀ—¶‡ù±»щƠÁÔ­ÄívßÁ¾ÆùדȃvĂôÓ‡€’ÇÛº§Ôµ‰Û×öɇ¡Á9¥‡£‡«‡“Íj‹Ç›Ú›v߈½ÂÙÛ«‚ ½9ÍË)éÛ9¥µ‰–¶ùשˆ߈¯à¹ÚÑñ¹Ơºm±‡ăºׯ£»Ç?ÿÚ™Óÿ¯¶‚vœ‡¿»ăˆŸ;kå̉ ăÁï½ógÚª‚ +¼9ß»û†Œ   ưˆ¹ÚÎÅÛ×ÅØƒv¶Ôùׇ™‰kß [ïS9¥‡ƠÙ½ù×ç½¸Ú ½Ó¾½¸›¾Á¼ÏźíÓ™‰kß [ïS™‰kß [ïSĂæÚÎÄïƠ—¶ÙÚ±»ƯºëöÏÔ‹ÿÚíÓ߈Ï̉¿èô߈ÇÖăˆŸ‘ÓöÁ¿Å«‡“ÍjŒº‡(ÏÅÉ›¾Ăºư§‡°»ÉĂ¾±»öµaÍĂá ½Ø¹åˆÈ›î±»óÆ»™ôívívù×Ă«‡“Íjùơƒ½±»«‡“ÍjơÔáƠÁ½¥Ó‚vÙ׫‡“Íj߈ăˆŸ;…ÜÅ–Óă»߈÷ÙÎÔçÚÙ½ŸÅù×ăˆŸÙ×›¶é™Ô¨Ø¾ÏÄăˆŸ³Â­ÄÛù×§Ơ‡Û«‡“Íj…bÙ½±»ăˆŸ;¥à¾†ŒÑÄëÛºáêÙ½‰¼™‰kß [ïS¢ ÏÔÆơÔÜïƠ«»ÅÓƒvù׃ԙÊơºÏÅëö¿‰Ï̉‡ŒÏÔÏÔϼ½߈9¥‡³ÈĂÙå̉ ôùơ¶(ß™‡£éëÚơê¡ÛĐÅÙÚÛ×µ‰ăˆŸµaÛÄÓÏÅ«ÔÁƯ¯G‹øơÔăˆŸ;kµŒçÚ¥Û߈ív§Øù‡ƠÁÿưÀ¶Ă•½½ÛôóÂ߈¾‹ÜÁ¹µØ½™‰kß [ïS¹Úù¿ºÔ¨ºßÄÙÎÅÍĹÚù¾‡ºœÂ%°»¥½³Û«‚ ½9‹ÜÖØÚª‚ +¼9ù×û(½Ú×™‰kß [ïS…a½©Ø—¶Ù½߈ưÀ³ƒÖ½ôÉĂÏÅ»ù×ëö½úĂÓØ½Û«‚ ½9“ȃ9ÓÓ—¾±ëØ™ÔÏÄ«ÓçơóÓơêáÀÊÓ¾º ·‡‘×8盾²È½ô±»ÿÔ§ºߌÛ,å̉ «‡“Íj§ØĂÈÇÆ‰Æ½߈ÅØ„nÉ̉Á̉¼ö‡ÇÏÔÿ+«‡“Íjôê¹ÚÁƯÛ“„ÿÚôÛ«‚ ½9™‰kß [ïS£Œå̉ ™ÔƒàăˆŸ;k߈Åô釷̣ÿ¯¶Û«‚ ½9¹ÚÙ×Û«‚ ½9ĂÆ—¾8¤‡ÖĂÙ߈»ØÍB»Ø߈ëöÙÚư‡±ù1ñÔ߈Ú±½â߈óÂ…ÔÇ»ñÓ¡ÙÚÏÄ™‰kß [ïS·¼Í7ÛÆÛ«‚ ½9“È©ˆÙ½£ÇùêºÑÓ™‰kß [ïS£X†Œôñ›̃Û×ÁƯ9¥‡½ôÏÔÿÚ“Ơ¡ÔñÚ¥ˆ]1±»ÔX ËÇ9¥‡¿‰ÉĂè·Û«‚ ½9ûÓ‰Û߈ù×ư¹›¾¬¾Đ潘‰j̃ZîSÿ×ËÉ9öù¾¸¾½ô9¥‡×ñÓ¿́8¤‡ÖơÔ¾çÚÙ½é꺱»«dÁƯµa½¿ßׯßÄÙöăˆŸ;«Ôïô·‡‘×8çù×™‰kß [ïSëÔáàỔ£Ç©¼½̃½µØ“Æü‡°ø1Û«‚ ½9ù×¼Hó—¶9¥‡ó¿߈¼€ƒỞ‡»ïÚ½ÛăˆŸ;́ÁơèÅâˆ:ơÔ¶ è …Ç›TÇÖ±»¿‰ßگ׷ԩÓË̉úÙ÷Ù©±»ß»û9¥‡ƒÖÏÔ±»±»ỂÊÖåĂ‹ÇÏÄÏ̉ٽ߄©ÓׯívóÓ™‰kß [ïS—ˆ—¶¯¾ÑÓÿÚ⻫ԡÔÏÅûƯÚª‚ +¼9±»¥Ưë§¿ß“¹ƯNÛ«‚ ½9ù׈çâ÷Ô½̉ơêăˆŸöĂÙÇÖóÄÍÓ“ƠéßơÄÿ¯¶ăˆŸ;9¥‡×ŸƠÁƯ‚ÖÇÖ¡àưÀ™Á‡±¿Û«‚ ½9ׯ—ˆ¹Á“ƠÛÄÓñÓ½Ù½™ơÍÄ¥ºƯ ™‰kß [ïS8¤‡Ö™Ôß»û½µa‹ÇÏÔÏÔù¿ÏÔñÖ™Ô߈Û̃÷ϳȇ¿¥ˆ]1ă*ơêôê±»™‰kß [ïSíơÏ̉Û«‚ ½9ơêùׇ«‡“Íj±»Á̉߈˹ƒvÅØñÓ’½ăˆŸ;çôÜäĂăˆŸ•Èû›Û«‚ ½9 Û¨¾½óẤv™‡™‰kß [ïS÷ˆù×óÔëöÛ«‚ ½9‡Ç©ÜƠÁ½±”ׯ߈ÏÅÙ½ƒëö·Ôă®¿‰ÛÚơÔô­ÄâˆÿÚƒv¹ÚƒƯ÷Ù±»ƒˆÁ½ẾÁÛ«‚ ½9ÍÓ™‰kß [ïS̃ŒÚ,£ÈÅÔ§ÔÜÔ©‡¥2ßëM¡ƯË¿ø¥â¹Ú³à›¾ó#Ï̉‘ơù×Á‡é/×:ăÁ¾ß•ĂƠ߈ÑÄëö·àÍĦөÓ9¥‡ÅÔ߈ăˆŸÏÅߌøÁƯÑÓÏÄź¿߈›vßÖ̉¾µØĂñÿÚ»‡̣­½¼ñÇÁ̉÷Á̀ÓÄÏ߈߈˜Á¶Å³Ø™‰kß [ïS߈ƒvơêƒvŸÅÓµ£ £‡—ŒñÆ8¤‡¿Å§Æ±½—»߈úÚ±“ßă»9¥‡߈¼Ă¹Ú½ÙÅë‡xĂÈñỌ̈Ǿß#ĂÆ̃Ú߈¿ÔßÖ¿»ùׯÛ߈Á¼±»±»ÅØöÁ›¶é«́¢»ÏÅ«ÔÅà߈÷ÁŸÅÙÚµ‰ăơ©Ó߈É̉ÏÔăơ¸ÚĂÙ§ÔëöÁƯø×›¾éºëö÷Á9¥‡×á ç'“Ơ«·3uUѶĂÙ§~ù‰ÙÚơêùו½ÿƯ«·3uUÓ™‰kß [ïS߈íÚơêĂÙÛ«‚ ½9“ȱ»ăˆŸå̉ ëö½רÙڜܿ۫‚ ½9×ÍÙ×§ÓÍÓµØÏÄ«‡“ÍjûØöçê°»™ëéåÜÏÅÙ½ƒˆ½߈Ë1™‰kß [ïS›¾Û«‚ ½9…ƠƒàÁ×›Ú³ñ%Ë¿ưÀ­Ôù×ÑÄ냈“Ơ±»«µØÎÅÇ̉»½߈ù×ÿ¯¶™‹†ÇưɃˆ³ÏÔŒöư“ÙƠÙ½…½ÙÚ™Ó«ÔƠ½ơÔßÏÅ–µØ†Œ‡Ú¡ÛÛ«‚ ½9­½¼çÚĺ£Ç«»Û«‚ ½9éêÛ×Û«‚ ½9¹Ú›ÛÆ߈¡ƠÁƯŸ}ĂÙóÇ¿‰¾óÇ›¾ÏÅ£ Á‡é/×:Û«‚ ½9é‰ñ5ñ·÷‡ÿ«‡“ÍjµÈÛ«‚ ½9±»ß»û½ß»û—¶ÑÓçô߈¸Ú«·3uU½€ĂÙƯ”çÚ£äÑ+Ơ£»ÖÆ‚v¥Æơê¯È—ӇǙÛá ˪ÓçĂÙç®ûØ÷¼öëöæô߈³ ϼÍẴÄØ«‡“Íj½ùꘉj̃ZîSñÚÏÔóDZ¿Ë¿ÏÔÛ«‚ ½9÷‡Éá½ßÁ‰Û󺫇“Íj©‡¥2ßëMĂÙ³Â×ÛÁºƒv¡ÔÍÓ½ĂđÁÑÓ™‰kß [ïSăˆŸ©ÇÛ×ĐÄ ê –¶̀Ó«‡“ÍjÛ«‚ ½9Û„¡ÔçôÑÄëƯÓ ăˆŸ;Ïű»Ù½ï½ÏÔ³È÷ÁÍÄï½Åª‡’̀jÉö˜ÓÙÅë·Ô½Á½½çôôĂÙÙÚăˆŸ´È,ù×Û׫‡“Íj߈áĂÚª‚ +¼9¤½ăˆŸ;k™ÓÛ«‚ ½9½¾‡«‡“Íj«‡“Íj£Ç›¶éµØù+ĂĂ ›­±àéMăˆŸßÔÛ«‚ ½9»Ư“ƠÅĂƠ™×ù껇…¾ăˆŸ;Ǻ±»¿¹º½ĂÈÙ½í8¤‡×¯‡ºƯÓ ưÀѶ«Ñ÷Úç½ëöĂĂ ›­±àéMăˆŸ;°»ßÄÙ§ÔơÔ³ù׿ׯŒ¾ơÔ«‡“ÍjËÉ9߈¿ßºÏÔ½ÓÁ°êØ™‰kß [ïS•Èû›ơԷïÍ—Ó‰ơêö߈ÿÚÛ«‚ ½9ù×ăˆŸ;“º±»Ù½«‡“Íj…Ơ•׫Ô×¾Î̉̃Î Ëû÷ÁÙÅëƯºÏÓÿ‚¾ûÙ°¿‡ÓÅù×ĂÆ߈¯È·‡‘×8çƒv‹ÓẲƒˆœÜ ôĂ—¶̃ÁëöÜщÙדƠÖº Ïěړ¹ƯNÅÓ—¶Ă– ¿ô±»ù×áê‚Ăº‚ṽˆÏÅÙ½ù׫»øê€ö /đ̉¹ÚÁ̉­Ä»ÁƯÈÙåñÆĂȨ¼ăˆŸ;ÏÔëöËăˆŸ;k€ºóÇ‹Ç×ܰÁ ëöÓº™‰kß [ïS¸Ú¿‰™ơ凬ÖÓÅ8¤‡Ö«÷Ǻï½ùê½³(äô ·ÔüÁ «Ôó¶äơ›¾±½¡Á™‰kß [ïSћ۾ÅÏ·‡‘×8ç»_ù×ơ‡ʼnùׇŒƒváêƠXăà»ßËÉ9ơê°½™ơù×ÁÍÑĂºô·Ôù×·Ô¦ÖÅØÛ«‚ ½9‘ ª»›¾³ØÓ̉ÆÖÅÓ©Ơ«‡“Íjª‡’̀jÏÔ‘óÂÏÔÅÔѶóÔƒ½Û«‚ ½9§ÔIëö½ÔÛ×ù׳±»ÿÚ́vơÔƠÍÓ§ôñÚùײÆ8™ëé僈Ơ©‡¥2ßëM߈߈ÓƯĂÏÔÛÀ«‡“Íj›¶é¯×¾¹xÉ̉ÅÔÙ«ß¹™‰kß [ïS¹ÚØ×ËÇÓºù×Áé—»ó×™ëéåÉÿÚÑ©ˆŸ}ÛôưÀÛ«‚ ½9ưÀ©ƯÏÅö·¼Í7±»•îăˆŸ;©‡¥2ßëM²¾ÏÔ›¾å̉ éê³§Ó߈Û«‚ ½9Ă™‰kß [ïS±»«‡“ÍjÙ̉߈©Ó§Ô×$ù¾Û«‚ ½9»‹̀Ê)èÛ8¤Åf̀ÄưÀ±»߈ñËăºĂĂ ›­±àéMù‡±»çÚÍË)éÛ9¥ÁĂ¹Á±ƯªÈÏÅÛº˜êè䑯ù׫»ÑỌ́¶ «‡“ÍjăˆŸ;v¹ÏÔÏÔưÀ́ơ©ÓÓºÍË)éÛ9¥™‰kß [ïSưÀĂƠ±»›¾öÁƯ•Œ‰ơÙ½©¼±¿™ÑÄÏÅ¿‰ѳËÉ9éç¶™‰kß [ïSÙ½½ÈÙÚœĂĂĂ ›­±àéM8¤‡ Ơëö߈™ó÷¼¯‰¯0…üÎÅØÓÅŸáỔ÷‡¼Û×ÁăÏ̉‹Ç¸ÚYŸ߈‡Ç™‰kß [ïSăˆŸ;óÂéê±»«‡“Íj¶£ä­ÄÛ«‚ ½9ºy!÷$Û«‚ ½9…ÛѶÍÄÍĂ™‡ƒØ…¯È߈ÏÅÁ½©Ç¨,ăˆŸ±»½ĂĂºăˆŸ‹ÓÎÔ¡Ư›Ú™‰kß [ïSÛ«‚ ½9ÔXçô…Ơ“Ơ¡ÙëÔ›»9¥‡©¼ù׈¡Á«ÔÏÔæđ¹2˜ 2“½›Âßù׫‡“Íj뙇—¶ëÚ߈‡ăà‡Ç«‡“ÍjƒØưÁÛ«‚ ½9ÿ§ưÀĂ«»«Ô¦í—G·ÅĂư©¼˜‰j̃ZîSëÚơĂÍË)éÛ9¥˜êèä߈«‡“Íj9¥‡ÁƯºѦ•Ü߈À¹ñ¯ƠÑÄëñĂÍÄ–¶ëö©‡¥2ßëMëăˆŸ;Ơ³¥Ø»Å÷ÚïÚ÷ˆơÔ…»•Èû›ö߈ívùô×¾ë™H™‡ăºŸ}Ăȇñ5ơèŵa§½ƒåô«‡“Íj³÷™‰kß [ïS»Î̉ÏÔ›ÛÙ½‡ŒÙÚ¼Ø߈™‰kß [ïS™‰kß [ïSË¿…Ø÷Ú˜Ôù×á=ǵإǺ¡Á—Óù×¼ô +Á̃ÙƠÁÛ«dº½ ÙÜÛ«‚ ½9庸×ƠÙÚ«‡“Íj«‡“Íj߈³àÛ«‚ ½9öÏ̉̃»ú¥ˆ]1ơ»Û«‚ ½9ç̃–¾ûÓ¬¼±»‡×ñÓ…̀¯Èù׺‡ÚßÚ³ô·Ô—»9¥‡åĂ›¾‹ÇÛ«‚ ½9‰å™‰kß [ïS™Ô¡Ô¥ºƒvñÓÿ¯¶åŒ¿NĂÙï½£»Û×ƯºƒˆÀ˰»‡Œ™‰kß [ïSçÀ‹Üª‡’̀jÏÔ«ÔÄơÔµØÅ–çÚÅÔÖÆ +ƠÁ߈߈äôÙÅë·ÔÛ×ǽƒvø×Û«‚ ½9™‰kß [ïSËÖǼ÷Á±»¨¼£êù¿…ÂÁ‡é/×:Û«‚ ½9‹Ç±ÂÛ«‚ ½9÷¼ÁËñÓ½µa¡ÔÏÔƒàå»ÏÔÛת»߈ưÀ«d̉Å ‹Ç½ÁƯ‘ÿÅăñ¢™‰kß [ïSÑØƯåƯïÎÅ&ơêå̉ ÷‡³ơêëöÙÚÁ“-ƒvëÚöׯÇØ÷Ú Á™‰kß [ïSϼ̉ØÏ̉»½Ϲ‘«­vö’ +½ôÛ×ư‡±ù1ƠÁöǺù×½§Ó‡ÚŸ߈¡ÓǽŸ–…ơعÚéÓÏÔÙŒë*«ø×‚v›Ú™ÁÉ­¾™ÁœØÅØÛàÙùêơÔÛ×êöá ăà±»Ù#™ơ™ëé律ÇăÁ±»ơê™ëéåÅôßÅÔ½Ù½½ù×íê±»öÁ™‡“ƠívÙ½µǾơơÔêöñÚ̃»úû%ăˆŸ;¹Ú¥Â÷$·ºÛ«‚ ½9Ù½ÖĂ÷Ùăơ½™Ç%™‰kß [ïSçÚ©ÓÛ«‚ ½9ÑÓ¾¹xơêăˆŸ;óÇÛ«‚ ½9ŸÈÁ éºáêø×Û«‚ ½9«‡“Íj‹Ç½ß™›¶éʯ™¿ßé«Ôëöá¬đ»“ȺưÀÏ™‰kß [ïSù×ù×éơĂÈù×½¡ÛÍƠ½€ßÄÙ¯Üå¿ÏųưÀ«‡“Íj•×ív©º‚vÍÄưÀº·§D º»ÅÂÈ×$ÅÂơÔù׃ˆ¥Æ·‡‘×8çÇŹÁ«ÔñÚ°»ŸÅ°¿©ÜÔ“È­ô«‡“Íjÿ¯¶³ƠÛ«‚ ½9Ž©Çëö±»ÓÆÛÀÚ×áƠ«ÔơÔ©Óöă»Ở©¡ÏÅøê³ÈºÈíêÁÓӨ釙‰kß [ïSÿÚ±»¡Ôơê³·ÅívÙ×·‡‘×8çăơ«‡“ÍjưÀ±»›ÚËÓßÄÙ©ÀÙÚÔXư|ÏÔñÖ‹ÜÁƯîDăÁ溃v®Æ½­“½«Ô§ôøêƠXí½™Î“Ơ«ÔñíȧԎ±»Á̉Û«‚ ½9ñÓñÚÑÓ¾™ëéåÿ×½åÁ½Ÿ½ơÔ»íêÙ½«»ăˆŸâ½ªdÜɇ߈¯¾›ÚíÆºÅô÷Ú›Ú™‰kß [ïS³È÷ÁñÓÅü‹ÇÙÚ·‡‘×8çÛ«‚ ½9úê׿8±ëØ»ÅăơÑÓ«·3uU¿ôœ·̉ ¤0Á|Û«‚ ½9Ơ®éù×Ï̉ÏÔÇÂăơñÚ¡Ô±»¿ÅéÚĂ˜‰j̃ZîSºÛ«‚ ½9©‡¥2ßëM—¾«‡“ÍjÁĂÅØ«‡“ÍjÇÂÙ¥ÆÑÓËÓÙ½Ö¾8ƠXÏ̉ǻٌë*«ăˆŸ%ăˆŸÍĂ÷‡°»ÓØÛ«‚ ½9ÁƯÙ×ù×™ÓŸÈÿ¯¶Ù½ϼÅÓÇỌ̈DZ»É“ĂÿÚ½ƒv¯Ơª»ăˆŸ;Û«‚ ½9ÔÅÁÿ¯¶ù׳ÓưÀæÚß»ûëö…Ơ¾ỞÏÅ»P8¤‡ÖüÁá$ø×£Ó󫇓ÍjèêÙÚÙùê¹çơèųٽơÔŽ•Œ‡Ê¿±»ÇÖÿÚ•ÖưÀÁĂå̉ °»Ù½Ï̉ÅØ“È÷Á•Èû›“È»Å˿䌾NÍË)éÛ9¥ÅÔá=߈×ÜƠÛן}÷‡µa«Ô߈ïºùêăÁÄÓ½¾ÚăˆŸç‹Ó»r½€ׯ™‰kß [ïSÿÚ¾ñÆÙÚÙÚµƯ±¿9¥‡Ưºáº¶Å¥Ú‹ÇăˆŸăˆŸñÙ½Ơ©ØßÈĂÙ¿́ÏÅÅ­Ä£ØÏ̉›¾¶¯¦¹ÚƠ­Ä«Ô·Ô“Ơù×סÛ߈ÿ§ĂÙÅ–§Ô±™Û÷ÁƒÔăˆŸ¼ç½ơêÁ½ôêóÇĂÍÓ½€ăơù×£Øô$ƒˆívµØĐÓ‰¿IǼÛ«‚ ½9ĂȾ +ÿÚ߈¾—¾Ï!íÇÓ½ßÚÿ¯¶íÓ•ÙÅăˆŸ;µØ«‡“Íj´†­Ö‡xÓ²ƒvÿ¯¶“Û™‰kß [ïS„ÂÖÆÙÚ߈ºÛ«‚ ½9̉Åí#á­ÂéÓŸÄó©Ӄv«‡“ÍjĂ©Ç“ÈƒvÏÔÿÇm«‡“Íjù׳ºó¹Ú¶Üêö½±»™‰kß [ïSƠÙ½ăà¡Û¥‹¡È™‰kß [ïS§à¿ßăˆŸ;½ÁƯ¥ˆ]1߈³È¯¾Á̉ÁĂçZßÄÙöÁ§ôöÁ—¶Ùǽù×¼Âȱ»÷‡đ¹˜ ưÀƠÅ¡ÔÎÔ—ˆ߈…năˆŸ—¶ÙÚ¯ÈçƠ«ÔµØÙ½“Ç9¥‡ă½µØÓŰ»÷¼á ó¹ĂÙ›¹ª‡’̀j×ïǽƒØÏÄ ́ ÙÓ Ëû߈™‰kß [ïS©ÓÍÓ½ËÅ•Œÿ¯¶¡Ư­Ö¿‰†×ψÏ̉ÏÔïƠ„‡ºµØ…Ö™‰kß [ïS™‰kß [ïS«ÓÍïéĂÈ®ôđÁđ»³ÈˆÏÔÑÄë¡Èß»ûÛÄÓƠÚ½€±»ÏÚ™‰kß [ïS߈Ç̣¹¹óƒØăˆŸ¡Á“ÈÛ«‚ ½9Á׺̉ƒvéêÏÔ±¿ƒvÍÓéÚ¹¾Û«‚ ½9÷øß»ûÿ¿¿¹±»ô¤Û×ÓÙƠµØăơôé+‚Ø߈ÑÄë•%÷Á¿‰ôµØå€ª‡’̀jÙ×™‰kß [ïSå̉ ­Ä½½ĂéÚù׃vµ‰½©¼Ơ‡Ú«€¿ôăˆŸĂÓæ̃àØÁƯ߈Ươăơÿ×½Û«‚ ½9‘ÖÛ«‚ ½9—¾Úª‚ +¼9ÍÓ›¾«·3uU³¹­Ä¡Ó™‰kß [ïSĂÙăˆŸ߈™‰kß [ïS˹%™Óơê‹Çù×ëöÙÚ­vơÔóǧôößÚÏÔ·̣ƠÁ߈½±»̣ÔưÀ±»½ Û’Èß»ûƒvïߟ’ĐÄêÑæÙ̉߈›¾߈ăˆŸÂù×ùàÙ½Ơ‡Œ¿€©Ó½£ä÷‡ñÓ›¾å9¥‡×êç“Ơ‡ÇÏÔŸ±ư§Óר‡×Ù½«‡“Íj̃ˆÛ«‚ ½9ăˆŸóǯȧӸÚä̉½ÔăÔ«Úƒ¾‘×ĂÚª‚ +¼9ƒÖ£ƒ¸ÚƒÖưÀï½ßÁù×ϺßÅăˆŸ;°» Ă™¥ÙÚơê£XăˆŸ;ÀĂ×̉ä̉±»ívÛ×ĂÙĂ™‡›ơơԽߋDZëØăơ«ÔÑ\£!åĂĂ罆Ú&¨Ç¨,ËÉ9ûªÚÙ½÷ÁăˆŸ߈ß»û¼¬Øù×ôÔ£Øá=ÑĂÉ©¼´†»½źå̉ Á¹ƒ¾‘ëö9¥‡…ưóÇÚª‚ +¼9Û«‚ ½9†ŒŸ}‡Çù×ơÔơç¬Ö °»˜Á +ƒvÏŪÛ9¥‡ù×½ÏÔ«‹߈•ơê½÷ÁɇéêưÀ½Ù½‰ÛÛ«‚ ½9™‰kß [ïSñÓ¹ÚÙ×Û«‚ ½9å̉ ÁƯƒöàê߈«dĂÙ‰Ô™‰kß [ïSÏÄÏÅÛ«‚ ½9¥Ø™‰kß [ïS“Ơ…ÚƒˆÍÄĂ¼÷Á½ÅØÙ½ơêÛÅûƠ«‡“ÍjØ× Á½ƒÖÙ½å̉ Ä̃ˆ¥ˆ]1éÓ߈ß̃ÆÖùê»ÁÿË9¥‡©‡¥2ßëM›œÔáØ±»Ú×ĂÙ÷Á¹Û«‚ ½9ÏÅÈ­½¼ăºÿ×ïÚûĂï½ù¿“ƠóĂ¹Ú°»½ØÏ̉‡¿ËÖÙÚ¯Èؽ³ºó«·3uUI ÛœĂ +ăˆŸ;Ăºä×½€ù¿éêơéÙ½µ‰± ÷Ạ́Ç™‰kß [ïSÁƯ©Ó¥ÂÁÓÁƯ‰¿IéÓÛ«‚ ½9ăˆŸ;k¥ÛăàÏÔƒÖ½Ở¯ƠÛ«‚ ½9ËÉ99¥‡ÑÄ뾺ù×¹Úơç¶èăàÛôêÿÂÅÔÏÔÊÇÛº÷‡‹Ç¹ÔÛ«‚ ½9ĐźÿÂÅÓö¾9¥‡é̀Ăº«»áêßÄ٣ضè߈ôñÖ«‡“ÍjôĂù×ơèÅưÀ£X₫¿(ª¶2tT¿ôÙYÅØ™ëéå¹ÚϺ²Æï½›¹9¥‡߈—ØíØ¿ßù>‡°»«‡“Íj%ơèÅÏÄ‹ÇÍÓׯÑÛYÏÔéÓƠÍÓ±ëØ™‰kß [ïSÑÓÑÓ¶µËØ Û«‚ ½9ͱ»µàù××¾Ë̉±»å̉ ăˆŸ¹óǺ©‡¥2ßëM§ÔÁĂĂÙ«‡“ÍjƠ“Ơ½»‡ºç•ÖÛ«‚ ½9ÏÔñÆĂß»û©ÓùêëöĂèÙ½éÓ«‡“Íj¡ÓáƠ…ÖéêăˆŸ•ŒÓØ“ÆăÄĂĐÓ¾ÑÓ÷Á‰¿I‰Á±»´Å“È̉Û×߈í‡Á¼™‰kß [ïS‡߈ØƠ°»ùê½€±»º½›ÛÅÅ»êöêÓÏÔ‹Á‰ Ϻù×ÇÖ«‡“Íj±»ƒÖơÔ‹ÛÏÔÊÓù×™ÓºÎÅÊÇ£äÛ§½ßôƒvF¼¹ÉaăˆŸ;k½‹ÇÁ/ăˆŸ;«·3uU­ÄÉÄÙÚÏ̉á=Û«‚ ½9˜‰ +j +̃ + + + +Z +îS +ÓÔ߈‰óÅÓÙ½ăˆŸ;kÑÛ«‚ ½9ôÛ«‚ ½9÷ÚÏÔ¦¹Ơ™‰kß [ïS˜êèäÛºù×ÚÄ̉¯Ơá ±»߈¿ºăêĐÓ‡x̃+ëöÙ½ÁĂå̉ ¯áÎ̉Û×Á߈ØÓ•Ûù׿ٽÙÚĂÙ‘ï÷ˆĂ¼¹ÛçÚ±»™‰kß [ïSÉ‚“Æÿ¯¶¹ÚÂÓö±»™o£ØÙ# ÁùêØ×³È“Ơ±È»çÚù¿¯›¶éè¾ơºëÓƯ₫íÖßƯ©Ó½âḈÙÚ«‡“Íj¶¼̀7°»Û«‚ ½9Ël™Ô™‰kß [ïSÇÖ‡“Û«‚ ½9ÙÚÛ«‚ ½9öä5̉™Óø×ÏÅĂÖÏ̉è¼±»ù×½Ưºù×® ‡kñڗ烾‘ä×ơûÜÓ ăˆŸ;kĂÙơÄ´óÇơĂÛÀƯÀÏÅù×…ôơÔù×ĂỠ„Ù×Ù½G½¹™̉‹Üׯ«î9¥‡×¦Ó«‡“ÍjôË̉ÿÚ™‰kß [ïS߈ÙÜËÓ±»÷Á±»—£®Gø¹Úô‡º·Ü±»œ¿êöí‡9¥‡ƒvƯ%ĂÅ–̉Ň¿ù뫇“Íj™‰kß [ïS—ø±»™ëéåÛ×߈ỂƒÀù¿Ù½ñƽ̉̉‡½ß»û˜ÁöÚÅíê߈†“ûƠ½ƒ¾‘™‰kß [ïSûÓùê§Ồ¬H×¾•Œëö«‡“ÍjºäŒ¾NµØ±»áƠù×ăˆŸ¹Ú§Ô߈ëö•ÿ̉ÅÙ½Ó©Óº«‡“Íj߈¿ôÀ̉Á Ûº¯ÈƯº·ÔÛ«‚ ½9¨‡¤2€̃êL™‰kß [ïSàƯ°&ù×ËÇ₫dzˆ’ƒvƒvơÔúƠª ¶ 2 t T ™‰kß [ïSăˆŸ;k§Óû(YơêơÔ߈Ơù×óÇëÚ­¾ï»¾«×ÙÚ½™‰kß [ïSƠ‹ÇÀĂ™Ûëö‰¿IĂ釡Ưƒv·‡‘×8ç©—ˆ‘â¢Ø¼ùטêèäºyÖ™‰kß [ïSØÇ½‚ó‘ÿÉû¾ßƒ¾‘ăˆŸăˆŸ½€«‡“Íj½€‡“±¿µØơÄŃv¤ˆ\0¥ˆ]1ÏÔơ­ÄÛ«‚ ½9ưÀívß„Ï̉ϼ«‡“Íjª‡²’²̀j²½¿‰·ÅÛ«‚ ½9‰ÛƠX¾µØùבƇº߈öÁÛ«‚ ½9Ϻº̉½9§Æơêùê½€ÿÚçô±»åĂ«»µØ«‡“ÍjưÀ÷ˆÛ«‚ ½9ÑÅơêG½¹ƒ¾‘Ú×ßÁ¡Ç“ƠÛ«‚ ½9ö÷ÁÛ«‚ ½9Ăï·§D öÙÚźÛ«‚ ½9Ú×÷ÚÍÄñÚ›¾À̉ƒÚ©ÑĂ—¾ù×çÚ«âËÉ9§ÆÙ½ëö§Æ“Ơ½›¾™‰kß [ïSÛ«‚ ½9ÄÓ¹‡äÑÓÅØ߈߈±»©Üơ؈̃½ÏÔå̉ ƒ½¥‚ÏÔư‡±ù1Ƀv©‡¥2ßëMăƠ÷‡æÇăˆŸ;ư‰¹»±»߈©‡¥2ßëM½±¿ưÀÖ·MÇ"ĐÓăàÙ̉·Üù×Ăº­ÄºÓ̉¹tđÚñÖ́vÿ¯¶щéÓ½ĂĂŸÖ÷ơ—»ăˆŸ;±»ƒÚׯ₫®¶Á̉Ó̉å̉ ±ŒÙ½ívƠ¼ÁƯ’¹$ÜN/­ÅÏÔ¹ÚË¿©Ç±¿³È§Ó¾Ú±»ÇƯ­ÔÏÔÓØÏÅŰĂÓ©•ăö΅ơ(«‡“ÍjÛ‡ăàϺ½€Ûë×±»«ÔơԧƱ»ñַź·ÔÏÅù¡Áóǘ‡½ÔÏÔơêĐĂ¢ÈÁ߈Ă߈­ƒˆ‡ŒÇÛÿ·‡‘×8çö»Ư‰±‡ƒăÇíÁ¹ỡÿ¼½ăˆŸ;ăˆŸ;™‡È±»ăˆŸ;±ÈöÙ½ƯÓ ÿÚùê¢äëöËƯ·Ǿ½ÿ€ơ…ëö“È·‡‘×8çÏÔĐÄêÛ«‚ ½9Úª‚ +¼9Á¹¡ÁăˆŸŸè¨¼ÑĂ³›¡Óº߈‰y‹¾öÁëöÅØĂÙëöÓØ·‡‘×8çÙÚ¡Áëơ³È©ÀóÓÿ¯¶ÏÅëÚ‹ÛÏŃֽÔ߈ÑÓ¶‡Ö8æçÚ™‰kß [ïS߈ÑÓÍÓù×ăˆŸ;›¾ÿ¯¶ÇÖÿN°êØßÄÙ“È–î׿8ăÁ±»äƠÏÅÛ«‚ ½9½Ø×©‡¥2ßëM½Ă›¾ÏÅĂ§Ô¥â±̉퇙י‰kß [ïSׯ«·3uUăˆŸ;±»®ƠóôÁĂÁ½§Ô½Áù׵؛èíêƒvÛ«‚ ½9ưÀ¹ÁăÁĂè¬ÔưÀƒ½™ëéå²ÈúØ8¤‡ÍĹÚùæÙ׫‡“ÍjĂÙÍĂ™‰kß [ïSëö£Ø±ÔÙÚÁ×çôͼ™‡çôñÖ½’Ơ‚v©‡¥2ßëMăˆŸ߈ù×µ̣éÓßÄÙƒ½—¶̃»ú¾ëöщéêí£ÏԵر»Ùڃر»©‡¥2ßëMÉö™ôöùêÓ±»¹ÚÓ™‡®ô(°êØ÷ÁÏÅÏÅ…ÔưÀƒÚƒvêÚ² «Ô³«‡“ÍjùơưÀ§ºíêó™¹ÚñÓ«äé(ùשӳ嫻ÚÀ‡ƠÚª‚ +¼9§Ô’½Ö¾ +Ûº“¼ÁĂ¹ÚăˆŸ;¡ÈßÚÛ«‚ ½9£ä­v£Øëö÷‡ưÁ Ç½“Ơ§Ó†Œ¯È¹ÚÛ«‚ ½9àØ¹Ú±»ƒvÍÄëö¼ ·‡‘×8çÅÔñÚÂÙźÅ1ơÔÁƯÅ·Å÷ÁưÖÏÔÆ‹ÇâÚÙ½ØÇ +‘«óÇôÊÁÿ¯¶Ù½á —¶ĐÄêÚˆĂÙëö×Ü߈“‡®¼«‡“ÍjÏÔ›ÆÁ¼å̉ ®GøϺµØáêƠ´ƒvù×÷å5ÓẲé‡ù×éÓƒvÿÚù×ÅưÀù×ùëñÚ¡ÔÉ̉ß»û¿Å߈߈Ó•™‡Û«‚ ½9ơ•ëöĂÙù¿ÏÔƠù?—ÓÅÔ¶‡Ö8æ¶¾µØ±›vµ†¡ÈÛ×ù×­ÔùבÛƠåƠù‰Ó×ïôÏ̉߈ËÉ9«»ĐÓÁƯ9¥‡×߈ï»߈Á¹ôÏÔ«‡“Íj€º«ÑăˆŸ;ƒÀ“¹ÚêÚ±ÁÙÚºy±Œ©Àº®GøÛ«‚ ½9ƒvƠÄơĂ‹ÁÛ«‚ ½9‹ÇóÂÑŧԫ‰„ûƯîäÁÏ˸Úó}³Ü¿Ó™‰kß [ïS¡ºƒÔ¯¾ÅÓ“ÈÙ½ù×½ƒºŽÁø¿ÛÀëö釋Éị̈ÍÇ—ÓßáÙÚăˆŸƠ¡Ư™ôY­vׯ›¶é®Èù׫ԓƶ¦D ¾Ô»»ƒvר·‡‘×8çù¿ívéÓÛ«‚ ½9† ©›ͽĂºÏÔÑÓ‹Ç¡ÔĂĂ ›­±àéMăàµØ‹ÓÛ«‚ ½9 Û‹Çÿ¯¶ÅØç–ăˆŸ;¸Ú·ÅÛ×ĂÙ«‡“Íjµô¾º¹Ú±»›¾ÍëԦƠ›¾ÏÔĂÙïÚû(·̣ÂÙăˆŸ;߈ؽ³¹«ÔøưÀá•Öʹƒv߈¾ß₫¼™ôÛ«‚ ½9³ ½…Œ÷ÁÓÓ™ëéå¡Û™ëéå±»ưÀ™‰kß [ïSÙÚщÛ×Î̉ƒ¾‘–¶¶è±»«‡“Íj©Àƒˆư´Ù‡­9©ƒå‡™‰kß [ïSơêäñ«»î½ăº—¶™‰kß [ïSÙÅ뇌öÁ߈ĂưÀ¹Ú›¾‡Ú»yĂ·ÔëöÅØ£ä›¾“Æ‹ÇÛ«‚ ½9÷”¥ˆ]1±ÍưĂù×ï™»²Èɇ¯È±»̃ÄØß»ûä̉Ù½ƠÅá̀èº߈¶JJîƠƠ‰Ô«·3uU¹Ú©‡¥2ßëM£»̀Óׯăơ«ÔôÛ׫‡“Íj«‡“Íjù׃v߈ăˆŸ;ºÙÚï$ôĂ ÿ¼ÿ̃ï³2£ØÙ½Ø×©‡¥2ßëMÙ½·Ø¥Èƒv¹ÚăˆŸ½³߈ç'êö߈ÍÄ߈¼½½§Æ½€ǤÙ½‹Èù×Û«‚ ½9“¹ƯNÏ̉ưÀĐūԉđ¿ÅÉ—»đ»ÏÔï½ĂƠăơ身 ©ƒ»5ÓÁûÓ«‡“Íj©‡¥2ßëM»đ˜ÁơĂȾ߭vĂ¼§Ô¥ûÏÅÅÓÙ½Å8¤‡ÖÙ̉ÿ§8¤‡ÔÙÚÏÔÙ½«»ăơ¡Ø˜‡«‡“ÍjưÁ·‡‘×8çI퇃¾‘щ߈óÇÚª‚ +¼9ÏÅơêÙÚßÚĐÄêŽËÓ«‡“ÍjöÏÔÏÔÁƯ±»±»ĂÙëöÏÔªÚù×ó éçơêơê“ÆÁƯ‹Ç£äñÓ±»²½ƒvÛ«‚ ½9¡ïï½§ă‘¾œ‡ÏÔ«Ô½ÔåÁ·ÂÑÄëù×¹̃™‡Û«‚ ½9ÏßưÚíØ¨Ơ«‡“Íjù×—¾º¡ÔšȄؑ÷«·3uU÷ä5̉ɇù×±»Ù̉™ÓÙ½‹ÜËÇÙÚ÷‡9¥‡›¹³ «ÑÛܧƷ‡‘×8ç̀Ă“—¶éÓ™‡¾¥ÁŸĂ¸Á߈ÑÄë̀Ç +ÑÓ¾ƒvÙŒë*«£́¿ß°¿›Ú§Ô€ºăˆŸÇÇÖ9¥‡±»û(¼“¹ƯNíÆƒ½ÂÙÍÄ߈Û«‚ ½9ëÑÍ€ÓÓƒvù×âà9¥‡ăÔ÷Á‘±»9¥‡áƠß«‡“ÍjóDZ”ƒváêÛ×ùêƠơºơêƠ]„ÂçºñƩآXûƯ‰߈º«Ô»Ø³Ơ³(øê÷å5Ó¿»¹Úí‡ÏÔăà±»ÿׂà ÏŽ©Ó™‰kß [ïS…ÖăˆŸ¿‰ëöÏÔ™‰kß [ïS¿‰›ṽˆ©‡¥2ßëMỞù¿¾¡Û½"·Ô±¿¡»ƯăˆŸ;ơú±»©ƠÛ«‚ ½9ëöÏ̉·ÔׯưÀźÚª‚ +¼9½ĂĂº±»ŸƠĂ¼߈ÿÚơ꽫Ԗ¾ÍÓ¢X‰¿IăÁu¹Øù×߈éꃾ‘¨ÇçƠé‰ñ5ñ·Û׉Ûß»û…ÚÙŒë*«Ï̉ă½Á¹ƒĂăˆŸÏÄ߈ƒÖÆÇ÷Á›øåŒ¿N¡Ûº‡Ểù×óÇ÷Û«‚ ½9îºö߈ß»ûÄ ˜‰ j ̃    Z îS «‡“Íj«‡“ÍjÓÁ¢Ø’ +™‰kß [ïS9¥‡¾™ëéåéÓ›ÛêöÏÍË)éÛ9¥¯©¾Ø×¡Û¹̃‹Çÿ¯¶‰¿IăˆŸ“ǽ©‡¥2ßëM ÁÏ̉Û«‚ ½9ÏÔÿÚ×Ơ†7§jëöûÓ¹Úù×ÁĂƯº“Ơ—¶ĂÚöÁ½ëöíÇÖ«‡“Íj¡Èë¼ÏÔºÑØùê£Óëö©‡¥2ßëMơú™Ô—»™‡º˜‰j̃ZîSµ†°».«»ù×¹Á|«‡“Íjß»û©Ó¨¾Ù̉™‰kß [ïSÁĂÏÅ¿èÇĂăËÉ9±»³ØăàÍ'Ûµ†­½¼Û«‚ ½9ÏÅ‹ÇĂ×ăˆŸ;ÎÅ£ØÛ«‚ ½9ëöźÏÄï½Ơ›¾éHïÁ½€™‡ïÚ™‰kß [ïSß»ûÅÓØŒê*ªÀ½qÄ–ƒˆÜá ¡ƠëöñӓȵƯÓ ©¼º½ỒÓ µù×ÏÔÙ×Û«‚ ½9…Á½åäƒv¹ÚµØÿ¯¶ö±»Ѷ½¸ÚăˆŸ±»ÏÔÀÙߌÛ,”½ÖóÔ›¶é¹ÁƱ»̃ˆ“¹ƯNưˆ©¼ö—–÷‡›‰ăˆŸ;Çô÷Ú…ô¡ÁÓàÑӯȹڙ‹ëö¶ÿ¯¶¾ÅĂ½€™‰kß [ïS‹Çơħӂvëöù×Ở¨ºŸ}ĂºñٓƹڳñÚÓ̉«»ëö¿‰ơê±»ÔX±»ßÄÙ߈œ‰¾I߈ÏÔ™×ñÓ‹̉ÀĂÂĂùơ˜‰j̃ZîSÑÓ߈ƒÚëöÛ«‚ ½9±»ÙÚª‡’̀jÁÓÓØ¿ß«‡“Íj¯È‹Ûư×±»åøڶºÅÔëö‹½‰â»¼‘ư‡±ù1·ÔǼ₫®¶°¿ƠÛ«‚ ½9Û×Úª‚ +¼9½¬q¿ß Úª‚ +¼9Û«‚ ½9߈áđ±»Úª‚ +¼9™‰kß [ïSѶ²î“Ơ¿Å±»Ï̉¹Úëö¬ÖăˆŸ;©‡¥2ßëMщ†¡Ư½‚ù×ÁÛ«‚ ½9›¾ù×¼Ü߈Û«‚ ½9ù×½ô߈¥ÛßÄÙÇÖÛ«‚ ½9ÙÚµa÷‡ăˆŸ;—¶¡ÁơêØ•ơê­ÈÓƯ‰ù×™‡ÛßÖÏÔϼÿÚ½ÏÔÔXƠƯÓ ƒÖÇÖöÍË)éÛ9¥™‰kß [ïSÁ̉ù×¶ÔëöÛ«‚ ½9ùæ·È·Ô«·3uU‡½9¥‡ÑÓ‡¯ÈăˆŸ;ơÄùßçÁ°»µØ¡ÁéºÙ½™‰kß [ïS‹Çî$™ô¾ÛƯƒvÙÚ“È×¾™Á½œÛ­—»ϼÏÔÛ×Å–£ØÏÔ‹íåÖªd±Á«‡“Íjăàɇ±»«ÔÈÁ‡é/×:ÍÓÑÄëëöëö±½£‡±»÷Ô͡ȗ»½€¾ÏÅăˆŸ°»éÚá “¹ƯNƒöëöY¥Æ•¾Á̉‚vÊÓÇ»ËàêÓùñÇØ¼€Ù½߈ưÀ­½¼“ÜÁ½«‡“Íjª ¨ƒº5«‡“Íj‹Û«»—ăỚvğſ߷¼Í7ô£ ›¶éµÈơèÅ«‡“ÍjÅñÖßÚ•Ë“Ơ9¥‡—Ó“µ̃ƯôÄùå÷Ù«‡“ÍjƠ¡Á¹Ú߈ƒvÙ½à ˜‰j̃ZîS÷‡ÿÚßÄÙ߈‡9¥‡ÿÚù×™‰kß [ïSǺ¡ÁßƯŸÄ±½ÇÖ‰Á­Å¸àÑÓºƒˆŸ\Û×™‰kß [ïS¾á=«‡“ÍjöÁÅÄöϼơÔ“ÆóÇñÓ™ÁƠŸÇÖ›ÚÛº‡Œ½€µØñÚÛ¤ÿ¯¶ăˆŸ;‘€éÓ‹Ó߈ăơÍ•ŒÖØÑÓÁƯăˆŸÙ½¼+—ˆºÈ +í—GëöưÿÚ©‡¥2ßëM™‹ăˆŸƠÁ«‡“ÍjûÓÚª‚ +¼9—¾‡jµ÷±»ÅØ·º×Ü«»±»Ûº±¿—»ÏÅщ£Ø©¼ƒˆ·Üå̉ ‰ưÀ™‡ÏÅưÀÍÓăˆŸ9¥‡ơèŵأ䛾ٽ¥l­¾ÏÔơê´a™‡9¥‡Å–Ë“9¥‡»Ó߈ÇÖÏÔ¡Á±»Û«‚ ½9±»çô‡“¯ÈđÓ©ÓÛ«‚ ½9ªÚ©‡¥2ßëMăˆŸêö•ǰ»ù×§ßµØ߈ăàÏÔµØĂ¼8¤‡ùê¶ù׫Խ԰»¥ˆ]1¹Ú°»½½öÅÔÙÚƒv߈à ©Ç½™‰kß [ïS¾·ÔÙƠà ½Û«‚ ½9Ƽ«È®Ơ™‡µÜ™ôƒ×«»Á̉©‡¥2ßëM¦ô™‰kß [ïS›¡©Óë¨ÍÓÛº¹Ú¯çÚ߈ưÀÅôƯ‰ä̉«b…öå«Ô÷ÑÄë¡ÁĂÛ«‚ ½9«‡“Íj™ëéå߈ûÅûØ’ÇëÓëÚ•¸Ú½ô§¿éÓµaÏÔÏÅƠ¾Gщ‰¿IÁ̉·ÔñÓŸÖ±»¹Ú髇“ÍjÆÓ߈‡ØŸ}‡“ÏÄåĂĂDß»û›¾ƒv£Ø«‡“Íjñµ½Ø«dưÀºyä÷ƠÿÚ§Óƒˆ‘ÓÎÔ«·3uUƒÀÛÛ«‚ ½9ù×߈Ù…½ôù×™Ô…Ơù×gº߈ƯÓ ăơ±»á×Á½ÏÔ›}ïº÷¼ÁƯ½ăˆŸ;«‡“Íj©ÇÏÔуÙ½á ̉ÅăËƠ‹Ü·¼Í7¹ÚơÔÓØ«Ô™‰kß [ïS̀Ó"íº“Æ¿Û«‚ ½9ÜÓ êÔ¯Ü×¼s«™Ø›çÙÚơê‚vƯÓ êöÏÔщÛוÈû›8Ä ¤‡Ä Ö†ĂΣÇù×ÏÅ9¥‡›¾ÁĂĂÎó‚vĂÙơñ»¾ÛÄÓÇÖ‡µÜÏÅËÉ9ăˆŸ¡¼ăàÄ–£ØÏÅÓÆ™‰kß [ïSÛ×ăˆŸ;Ù½ψ %ƒv˜êèäĂÙ¹ÚÑỌ́‹ܙ‰kß [ïS“Ơ˜‰j̃ZîS߈ÓƒvỞ¡È˜‡ôê·ÅăˆŸ;k‡Œ™‰kß [ïS¿‰»ÛÏÔ󫇓ÍjÚª‚ +¼9μ×Ó—ÓƒˆñÓå̉ ơêÄ–9¥‡9¥‡™‰kß [ïS•ÂÅØ­ƒ¾‘¥ˆ]1‹ÇñÚăêăơ—»ñÆ߈±»¬ÛăÁ³ «»«‡“Íj›¡çôív£‰Ñó¡ÈµØưYÏÄéÓ߈ÓăˆŸ;½¼¤ÆÙÅëÛשØơêÜ®Gø¿ô¶Ô«‡“Íj¿ßù×匿NñÓ‘u½ÓØÅÓ¯.ß»ûĂƠÇÖ«‡“Íjíºøæ¿Ù¹ÁĂÙ¿»ăÁ±»°»ŽÑӲƗ¶³ÂưÀï²29¥‡ôͼùׇº×̉˜‰j̃ZîS½è¦ô ›êÏÔăù×°»ưÀÛ«‚ ½9ơê½ØïƠϹô¾ºÅÄƠ¡Áä̉å¼ Ù½ÏÔÁƯ¡Û¡Û‰Ë¶ÆăˆŸ;½ĂÙíÆÛ«‚ ½9ÍÄ߈¡ÈÿÚ·Ó ¥0›¾Û«‚ ½9»Ú©‡¥2ßëMÔơ§ô߈ù×¥Ăٽę‰kß [ïS‹È¯Ơ¾Ô¢‰¿Iåôó“ëö™‰kß [ïS½·Ó ¥0·Å­ÖÙŒë*«’º ‘ ßƯ߈÷ÁÑØ¡ÁÏÅƯÓ ö̉9¥‡Ú“ƠÍLJđưÀÏű»÷Á߈™‰kß [ïSăÚ™‰kß [ïS½›¹¾Åç‹ÜơêôÁǗÁä̉ûƠ«‡“ÍjĂ¹¯¾ñÓÍÓ̃ˆ¯‰¯0¥Æ½˜‰j̃ZîSÎı¿íº¥ÓĂ¼›¾·ÅªÔƒˆ¾«‡“ÍjÏÄÏÔơ»ĂÙ™‰kß [ïSƠ¯¾߈§ÆÑÓÛ«‚ ½9Ô¾Fç4̃ˆ½ĂÙ÷ÁÑÓ•·̣ĂÙ¡¬ô¿ß¸È凋ǥˆ]1Æ̉¥º‡Œö£ØÏÔ¹½ÇßÏ̉½€…n©ÀñÄçôÍĂĂƠ½9¥‡×çmñ֤ǘ‰j̃ZîSÍÓ±»ăˆŸ;üܦ¹Ï̉Žж̀½›¾ơèŵؓÇß»û¹Á±½î½áê9¥‡Ó‡³™‰kß [ïSÑÓßÁñÖ¼ĂƠù׺߈Úºù×ÑÓ½…%ßÚÆ»ù×ơèÅñÓ…©Ø¹Ú¶Üùë­ÄûÙçÚëöóÔßÁù×ÁĂÙ‘ÆßÄÙơº…»ÁƯªÈëöăơ¾ßù×ư§‡ÖĂ¾ăˆŸª‡’̀jÆÖ÷‡ëö™‰kß [ïSß«‡“Íj¨¼Ù½Ž‚vưÀñÚï²2…Œ¡Ôëöó¶­Øêö£äƯµ¡Áù×ÁÚé±Ñ½ÔƠÑÓöÓ¾€Ó™‰¿IáƠ³ƠĂ—¡ß«‡“ÍjŸÅ±»ơê¾·‡‘×8ç½ÏÅÏԲ­¾ƒv·Ôù×ÑÓ«Ñ©ÇĐÄêÅØÔºl¹ÚĂÙ±»ăˆŸ;°¿Ù½» öྃvÓÓ̉½ƒvùê‘Ö¿́Û«‚ ½9¶Ưς׾ÑÓßÚ½Ôÿ¯¶ñÓËÉ9ÓÆרăàçÚÏÅ—¶ÏÔºù׈›v±½ăˆŸ;÷Á÷4¸n߈ø¿›¾ưÀ«‡“ÍjÏÔ‹Ùƒ½¥ÛơèÅ߈ÓÓ½̉½ ÎÔëögÈùåù¼Ơ±̉ÿ¿‚»Á°»£Ø‚vëÓƒÄ÷ÁÙ½ï¢öÓŃv»ôÔÙƠ¡°»¡Ô‡߈êÔ9¥‡°»–Ă¯ÄßÚÛ«‚ ½9ÿ§ï‡9¥‡œÂăˆŸ;¡Û­ÿÛ«‚ ½9©ÓÙÓëöĂÙ£ä̀©ÜרóĂöÏÔÅŸơÔ•½±»ơèÅÑ·ù׫‡“Íj­¾©Óá á¼ùׇ9ăˆŸ;½½ÔÂĂå̉ ù뙉kß [ïSÍƠ¼ÓÅùêé·ÛדїºưÀܺăˆŸ;íÚ߈®¼âÁăơ¹Ú—¶–¦̀»ÅØồÓÛˆÎÔ‡äơèÅ«ÑăàÏ|ơÔ¶±»«·3uU…»Ơ•ŒÛ½à Ó½·ĐçưÙÚ–ÓƠXÏÔÔÓØ›¾Î̉Û×߈²È„Ø 9¥‡¼ÅØ߈ëöÏÔ˜ô›¾å̉ ½ÔÓØ¹ÚûƠ¹ÚÄØÍÿ¥½óg±»ù×ßßÙŒë*«½§ô‘×ÖƠóÇ™‰kß [ïSûÓưÑèÓ³ ùễˆ†ºéÓƒvëöר½ĂơÔËÓó‹ăƒÙÚͲăˆŸ;kÿÂĐÓùåÿÚœ·̉ ¤0¹ÚƠ¶ÁƯÙÓÁ&ÙÚÏÅóÔăˆŸ;kÍñĂȹÚщíêÛù×ÍƠ… ơÔĂĂ ›­±àéM½ØÿÛÂÙµØưÀª¶2tTØYÏÅ©ÓÏ̉âêÛº“ç‡ÛÓÆ™‰kß [ïSûí…qÚª‚ +¼9ÏÅ—»‡ºÑĂñÓÚ¹Ϻ¥ˆ]1ɹå̉ œ‰¾IƠ·ÔŸ»«‡“ÍjÛêƒ߈·‡‘×8çÛ«‚ ½9Ïé§·Ô™‰kß [ïS•ÿƒÖ‡¥ˆ]1ù×ù×щÏÅ»‡ƒ×öçÚ²ßÄÙµØø×߈ÍË)éÛ9¥ưÜ©ăˆŸ;“Æ©¼ؽÅ–ÿÚ‰y¿Ø™‰kß [ïS߈̀Óáê½€ƒÖ§¹ƒv³ÜÂÙ©ÓÏÔĂÙ…öă»ÿÛ­Ä̉ؽ±º“¹ƯNºù׿ç×ÏÔßÄÙ”Èú¡Á“¹ƯNƒvÏÔĂÙ¹Ú©Ó¡Ô‰øĂºơêÑÓñÓû߈£»©‡¥2ßëM‚vÙÜ‹v­ÔÑÓø×¶‡Ö8æÛ«‚ ½9ùêẴ¶ÙÚûؽ†ÇĂ ù×ÁƯưÜщŸ\ûƒvÙ½À̉¥Æ½™‰kß [ïS‰¼§ÔרƒvÅ÷ÁưÀ¢È¶ÅôŽ›¾´a¹ÚÊ% +ư¹ÑÓëöÿ§߈ÿÚƒ™‰kß [ïS±»Í½ôíơ›¶éöñíÈ½Ă„ÏÅ«ÑÈÙ÷ÇĂgºy¯ñ9¥‡«‡“Íj́½¾ï¿́̀ÓĂuŸÅ±»ÏÄÖÆđÙçÚº ‹ÇĂÙù×ÿ§í—GÛÀù×ëöêö§ô­Ö±”ÀßÆĂ«‡“ÍjÁÚ™‰kß [ïS«âÑ󵆳‡ÇÏÔ»‡“ƠÏÅôŸ}…Ơ8T¤‡TÖçÚçÚß½åÖ8¤‡ĂȽôÏÔ©Ó°½ƒv±»Ô»Ø¶Û«‚ ½9£ØÍÄÛ«‚ ½9…Ûô±‡ÏÔù×±¿·ºÛ«‚ ½9ÖÆ©%ÛºÏÅ™Á¹Ú™‰kß [ïSÓ¾Ó©Ü÷ÙÇÖ¨¼«‡“Íj‡Œµ†9¥‡ÿ¯¶ëö˜‰j̃ZîSëöÏÔÏ̉½€çǧ(´†ơ$ËƠ߈Úº¥ˆ]1‰yù×™ ßô±”Óº·Ô±»½ÈơÑÓ£ ç*ƠÄƠщåIÛ«‚ ½9ơêỞ’º—ÓƯ%µ†ÿ¯¶åÆơêơ»ôåĂ¥ÆèîµØö׿8sާÔùׄ½ñÖǺÙォچŒ¿‰ÿÚ¢ôÁú©¼ÿ¯¶³ÈƠXØ»íê¡ÇÖÆ«‡“ÍjÏÔ´%ơÏÔׯ³z߈ëöñǵØÙÚÛ«‚ ½9ßÚù×½ĂçÚ­ÔûÓßÁÿ§ß»ûơêªÚ±»“Æ÷ŒÏÔĂâÇÖăˆŸ߈ăˆŸ;÷ÁËÉ9·ÔÓºăàÏÄĂÙăºíË«‡“Íj·§D ƒv¿ÙÓ¼ùׇº˜‰j̃ZîSå̉ “…«ÔăˆŸ½¹ÚûØ›¾ù×Û«‚ ½9ŸÈºưê«ÔÁƯ˜‡·ÜëöÑÄë߈¡È®Ü¨ÇƒÖµƯ³ºó±»¿ßÿƒvßÄÙĂÓûØË½щù×ËÉ9©‡¥2ßëM±»ͽٽﻺđÁ¶ÔÍË)éÛ9¥¼Á¯È߈±»Á̉›Ú™Đ³Ç™‰kß [ïS߈é!û71Ïû ± ÓÙIêöóÇÿÚÏÅƠÚר§ºù×™‰kß [ïS¯Ó¸Ú‘́€Ä…Û»ˆÙÚ™ơëö™‰kß [ïS¼ÔÊ ¹Ú™ëéåá ­ÄÛ×ëö™ô«»ư6Û«‚ ½9óÇŸÖ‚v¹ÚѶúÙÚÛ«‚ ½9¶₫Û«‚ ½9ëö“ÇĂåĂºy±»åŒ¿N« ©ƒ»5ÏÅÆ ô¶‡Ö8æÛ«‚ ½9ïiÏÔ¿ôƯÓ ưÀ™ëéå±»ÏŤˆ\0߈Ï›¾·‡‘×8çưp³È©ÇơêóÇÏÅÄ^ù×ͼêö×ܣǙÔưÀù×ÛÄÓăˆŸ;±»ºÁ­Ö¦Ô‘±í—GÛºñ‡ù×ÍƠÛ«‚ ½9“ƠĂÙ“Ơ›¡ùÚÛÄÓÓÅƯÓ Û«‚ ½9ÅôƯÓ §ÔóǹÚăˆŸÁ×çÚ/ƒṽÅß—§ôáêíÆÁƯƒˆÛ«‚ ½9öÁ9¥‡Ù½åŒ¿N¯Ñ½ô߈ăˆŸ;ÿ¯¶ĂÙœ·̉ ¤0Ó¼÷‡Ơ‡xÙÚ¡ÔÜ4ÙÜơÔƠºm߈ưÀ©Ó›¾Í‘ÆÑĂÉö›¶é«‡“Íj±»ƒv£ÇÓÆ™‰kß [ïSĂ¼«Ôù¿ƒˆ¯é›¶éƠ©¼ÍÄ¶ăˆŸ÷ˆí—GñÓ›¶éö¯ÈÇ»¾ô +Ÿ}8¤‡ÖÙ½Û«‚ ½9‹ÇߌÛ,ƠÙ½™‡½«)Ç[×ú±»°»Û×ëÖÛ«‚ ½9ÑÓû؆đ5óÇơêªĐÙ½ö߈™"ŸÖ纴ÈƠÏ̉ĂĂ ›­±àéMÈ̉Û«‚ ½9³ͼÁƯ¹~´ÈùëÓ¨»ôçÚªÚ"ÛÄÓ±»ƒvY³½öÚª‚ +¼9ăº÷B½Û±»߈¡ÔỞ›¶éÇ}ù×Û«‚ ½9ÙÚ‹ÜÛ×…n±Ôß»û‰yÛ«‚ ½9Û«‚ ½9Û«‚ ½9–¿«ÔÓØƒvàöơèų1ó™å»ơêÛ«‚ ½9¡»¡ÇÏŗصaŽ­ÔóÇ¡ÈĂƒºͼÙ½Ôº +l +—ăăˆŸö±”Ă¹¶Ÿ}ï½ûÓíÖó#ù×§ÆëöÏÔÓ̉éê±»‘Óù£¶¸ă‘·Üơêëö9¥‡›¶é¯È“˜œÁ«‡“ÍjºưÀ́êÛ«‚ ½9Û׿»µØÅ–¨»+ƒvËÖÑÄë•Èû›á å̉ ö÷‡ÛºÏÔÛ«‚ ½9ŒÉÅÓ¤Ùƒ½ÿ'ÅØĂĂù×…ÚưÀ߈ù¼ÁƯ‘đ¯¾Ù½Û×ñÖçÚëöÖ0¹Ú›¶é©ÓñÓ«‡“ÍjŃ+ưÀƒvöñÚ߈Ó̉©à˜êèä¹ ½ăˆŸ;ơÔ9¥‡ŒºÛºŸÅ½ô¹ áê¡Á„ÇăˆŸ;µØ†½Û«‚ ½9ĂÈùơ߈G½¹ăÔăà™$á߈ÏʼnƯ¾ºÏ̉åĂŸÖ¦Ó…nµØ½»ϼ¯È¿́½˜ËëÇÖ°»ÙÚÇÓ‹Ù›¡ÇÖ̃ÁëöăˆŸ;›¾́Á·Ó ¥0ØƠÆ9¥‡·Ô€Çơ°»Ù½ƒvż9¥‡í«»µØÑӾų÷å5Ó‡ŒøºÙÚ“ƠÛ«‚ ½9«»˜ÁË%ͽ©Óư‡±ù1óÂÚª‚ +¼9¯ăˆŸ;ëöºØéÓ߈¡ÔÛׂv³r‹ÇÇ̉—ÓÊÚÖ•îß„ơêëöñ‡ëö¥Çƒv“ơè¯ß8¤‡×¼Ô§Øéº£Ưû ëÓĂƠª‡’̀jÙÅÄ·‡‘×8ç­ÖăˆŸ«·3uUÏÔá=Ånûù×‡Ç Ëûá=™‰kß [ïSÍÛ«‚ ½9ÿÛÏÔ² ×Ơ†7§jÂ&ßÚ™‰kß [ïS߈«»å¼ ƯÓ »ØívçÚÙ½ø× ÙÅ멇¥2ßëM“È—»‡·ÔÁ‡é/×:ơÔ¹Ú•Ô»Ă™‰kß [ïS·Ô߈±»—Ó”Ù½ăˆŸª»ͪ×¾ÙÅëư§‡‹Ù©‡¥2ßëM‚vŒ¾Û«‚ ½9ăˆŸ±»™‰kß [ïS“Ơáê§ÓơÔÁ̉™ëéåçÚ½ºy”½¿‰8¤‡ÏÅÁăÛÄÓ™‰kß [ïS“Ơ±»ÿ +ƒvă½“È߈ư­À‡€è/Ö:ôÚéÚ£»¾ßĂº™‰kß [ïS߈“ƋǼÜëöù×±»“¹ƯNÏÔÏ̉•Œ«‡“Íj—Œ¾ßÙÚÏÔÛ«‚ ½9ù×£ä‹Üª‡’̀j„ÇïƠùׇ0¥Ø₫ƒvĂÈχåĂ½™‡Ăê߈·Å€Ơ—ˆ­Ä­Ô·Ø›·ÔôĂרëöÔXYßω;JÙÚÛ«‚ ½9Û×½€«‡“Íjß»ûå̉ ù×ÂƠ±»»Ø›¶é÷‡ÄĂƠºmăˆŸ;k©‡¥2ßëM­vùêï‡ÏÅù×ëÚ±»›̃‘Æù×Ơ¿‰ưĂÏÄ›¹Ñ×ÅӷȦÔă»öĂº™‡ï»§™‰kß [ïS½€߈¡ÔØ× —»ÑÓư‡±ù1µØÛ«‚ ½9¹Ú—¶“Ơ­¾ÔÙÚ°È‹ÜÛºÛº£Ø·ÔíêÛ«‚ ½9é—¾»ù¼©ÀµØŸ}Ï̉±»÷Ú¹Ú«‡“Íjǃ…Ø…Ơ´†‡ĂÙÅ»ăˆŸ;ù×ơê“ÈÛÀ½±ºå̉ ùà™Ø¡ƯăÚÆÛ«‚ ½9 Ç +߈ăˆŸ;8¤‡™‰kß [ïS¹ÚÀ‡€è/Ö:¡ÔÖÆ¡ÛÏ̉ªÔ±»àö·ô›¡ûăµa›¶éù惽÷Á«‡“Íj—»Úª‚ +¼9¹…ÿ#ƯÓ đÆơÚßÁö̀Âî²2ßÄÙĂÇîăˆŸµØ°»ö¶ •&ßơ£äƒc±»Û«‚ ½9Ó̉ơêÏÅ×¾ßÁÙÜ¿ÛÔÅØƯÚëö‡«‡“Íj…Ơ­™Áùר‡¤2€̃êL™Ó«&™‰kß [ïS߈÷÷Á÷Áă»­Öù‡öäƠ¯×ăˆŸ;±»ëöăˆŸ¡Á½È·Å©‡¥2ßëM¡hƠX¾«‡“ÍjÙ½›v½÷Ù«Ô·‡‘×8çºăཀáç˜ơ·‡‘×8çÆ̉¥ÅØgåĂ»½™‰kß [ïS—»£ä«âï³Ï̉±̉©ÇÙ½ù×ß»ûÏÔ±»±»̃¹ÙÚ«Úܺ™‰kß [ïS‹Ü½ô£»Û«‚ ½9¬¶ĂĂ ›­±àéM™‰kß [ïSçÚơÄר‡ơº«‡“ÍjÛ«‚ ½9ÏԑƱ»ơÔÑĂỞÍÚƠñ‡ÜÁ ÛºÛ«‚ ½9̉Á ĐÓÅÓä̉ăˆŸ;kÀ˃vÁĂÛ«‚ ½9›‡ßƯ²º̣éºÙƠÍB½‡Ÿ\ËÉ9ù×̉Æ¢»$ƒ¾‘©Ú“ÆÁ̃ˆÛ«‚ ½9ÛÄÓ ©Ó9¥‡×º̉ăˆŸÏÏÅÁƯù×µØÍË)éÛ9¥߈ơíÖĂÙùׄn›¹Û«‚ ½9߈«d·̃Á‡é/×:·Ó ¥0íØ™‰kß [ïSÁĂÇÖ8¤‡½^­Öö±Ôçù×§Ô„ƠÏÔñÚå̉ £ØăˆŸ;kÓØăƠåÁÁ³È·̃öÁ£Ç»Ø߈Û«‚ ½9ÏÅ›Û× Û«‚ ½9ù–ÍÓŽÏÅÑÅŸ}ÑÓÛÄÓ±»ÿÚÏ̉é¿íÁÓÅÛ«‚ ½9±»÷Á³·‹ÿÚ™ô߈‹ÇăÇíăˆŸù×Ơ¡Ư÷ÁĂ’È Ë̉ª‡’̀jĂÙ‡øưÀ³Èç'±»Û«‚ ½9Ù½™Ôùỗ„ÏĵØƠÆÙ×±»›¾ơèÅÁƯºµØÀĂëö•‹HÙ½9¥‡å̉ ›¾»½¯G‹øĂĂ ›­±àéM³ºó³ÏÅÏœ۱»ĂȽ߈ưÀ…ÖÙ½Á×£äß»ûÇÖ߈ù×¼Ă©½™‰kß [ïS¡Ûøê*Á̉§Ô¡ÛÛ«‚ ½9ƠơÙ©‡¥2ßëM‹ÇµØ«‡“Íj¯ÓÓ¾•%©Øçڃؒ‰2Ô,øÎÅÏÅϹçÚ“ÈÑæ¹Ú9¥‡ÑÄëÏÔÛ«‚ ½9±»ˆ«»ßÄÙø¿­Ö¯¼»ƯÏÅßö¥Ø¹Úëö߈ù׺¥¾÷ÁăˆŸ;‡ùê±»‡º·ÔÖ¹‹Ç匿Nà=£äÿÚù×ÅÜ÷ÁÏÔÏ̉«Ô«»½ơê¶ù×ÛׂÖÁĂÛ«‚ ½9ăàĂ¼“Æ«ÔÅÁƯÙ½ơÔ¯G‹øßÁ«d½ÏÔͼ©ÓŒº™‰kß [ïSëö±»˜‰j̃ZîSù×9¥‡÷Áëö¶RR߈vÏÔÑØµ‰ëö¬Ä‡“ÏÔùכ竇“ÍjŸ}âà™‰kß [ïS÷4ÓØ½̣¶¼ïÅñíÈéêáÖ÷Áùë±»ª¶2tTĂù×ÓÁ§ÔÏ̉ù×ÍäÁ̉ù×ëöº±»ÄÓÏÔÑÔÏÔµƠÓ¼Ç̉¯ÜñÓÏÅïùÁ‹Ü¿ËÖÆ_ívƒ/ºŒƠÅ™‰kß [ïSÏÅéê¹à²¾ÏÔÙÚ‚¾ÓÅÇֻ؅àÛ«‚ ½9÷ÁĂÙÛ«‚ ½9çô™ëéåƠ¹Úù×½€ÅÔϩӫ»µØƒv8¤‡×íØÁ™‰kß [ïSÓÅÓÅ«‡“Íjă/ñJ½ø×»Œ½ÄÀÛ«‚ ½9Ơ'¡ï½8¤‡ͼ¿‰ÛÀ·‡‘×8ç©£ψù×ÿÚ£ÇơÄﻫÑî±™‰kß [ïSêÚ§Óg‡™ØËÇï½ù×µëÔ®×Û«‚ ½9“Ơ¦ôÙÚ÷Á½çÁ|éÓ¡±–»º‚ô«ÔÉ̉ÅÙƒvÓ̉Û«‚ ½9ơèÅÑ»ƒvÙÿ¯¶ôùêï½í‡G½¹ßÄÙÛ«‚ ½9™‰kß [ïSÓÔ½¹ÁưإƳă੼ÿÛƒvå̉ ǼÏ̉¿ßÏ̉×ƯÏÔåĂͼưÀ¡ÔÙÚéơ‘«¯ơ›¡ĂÙ‡ÇçÚ́ÚÍĂñlj¿I˜×·‡‘×8çÆĂ ïô°»³Â÷4Ẹ̈ȹ Üú%ɹûÙŽöÁ«‡“ÍjăˆŸ;֑ưêØÛ¿‚¡ùëûƠăˆŸŸß‡åĂ©ÜóµØöÙ½ƯÓ ÑÓ™‰kß [ïSăˆŸ;ßÁ߈•%«‡“Íjëö¡»™‰kß [ïSÿ¯¶«‡“ÍjÛ«‚ ½9ÿ¯¶ĂÙ«Ôó½̉½s°YçĐŽ±»™‰kß [ïSÔX¡ÔáºÁăࣻ†º×ĂèÔử«‡“ÍjƠXÁ¼¹Ú»ƒ¥Æ‰ù×Íå뿉ˆ]1ûƠĂÈÁ̉—›‚Ø—¶ñÚIƠ¼öÁ ª‡’̀jÙ½³„Ån9¥‡ÏÅỬö›¶éëÚ½•ÏÅÙÚ×ÂƠÄ÷ˆ˜êèäơèÅ‹ÇÏĻŸÚÅÓº‡¡ÔÁ¹øơo“ÈÓ̉‰Ûå̉ åôûĂùê·‡‘×8ç½Ç™ëé嫇“ÍjßÚêö8ơÔ¸àÛ«‚ ½9ëöÛ«‚ ½9˜‰j̃ZîS©ÆƯÛ«‚ ½9¿‰áÚª‚ +¼9©ÇƠX«dÏ̉߈‹ÈôÔ‡½å̉ ́ơ“¥ÄÏÅñ~ăˆŸ;¡Ư8¤‡ĂÙưö×ÓÙÚ߈©¼½ô¡Ô±¿›Úß»û߈Û”́Û«‚ ½9›¾₫÷‡¾ÁÙÅÄưÀ³©¼ăĐÛêƒàơÔăˆŸ%‹Óß}©‡¥2ßëMÛºóÇù×Û«‚ ½9ùדƠϺ‰¿I–¶¿º»Øôó‡å̉ ÖØ߈ù׫‡“Íj¹ÚæÚÛ«‚ ½9Ån§ÓÓƒvµØŸ}ø× +´½ñÚÏÔ¹ÚÙ½щö˜‰j̃ZîSĂν€߈ÙÓ±»Ç«‡“Íj³(éÙÅ»©Ç±¿ơÔăêĂ«‡“ÍjƯº­¾ÏÅëö™‡ĂÙÁßÿ¯¶ù×ăˆŸÙ½«ÑéÓ©‡¥2ßëMăàÛÄÓ«‡“Íj߈ƒÙÚùơÙŒë*«ÙÚá=ƒ½ăˆŸ½«ÔÑÄë£Èø£ơĂêö¿à̃½Á匿Nù׃ן}Ʊ»8¤‡×«‰„«‡“ÍjÛ«‚ ½9§ÛëÇÏÔƠÚÑĂÙŒë*«ÏÄ™‰kß [ïS£‡­ÄŸÅÙ×߈—¾›¾±»‹¿°»Ăº™‰kß [ïS±»ăˆŸ£—ŸÈơꃽ$ƠÁ߈ƒÖκ ơªºíêñÓ»‡‹Ç×ƠœÁ ›¾̃ˆ«‡“ÍjơĂ¡ÛưÀÓºÛÚ†(±»ª‡’̀j±¿ăˆŸăˆŸ;†ä·Åá ¸Ø¿Ø·Æ÷ØÍË)éÛ9¥߈óÂÙÓÇ•£Ó‡Ç…¸Úÿ¼ï½—»ÿ¯¶ù×­ƠơÀ‡€è/Ö:·ÛÑÅ«‡“ÍjƠ뼦ºÙ×ăĐ¯ö°Áëö·Ü½×Ụ̈Äψ»ØÏÔ«ÑĂÈ¥ØÙ½·ÜƯ彇Œ„Ö‡Û«‡“ÍjÛºÁͽóÉyÅĂ¿ô8¤‡Ö¬ÖÛ«‚ ½9™‰kß [ïS“¹ƯNƯºĂ¯ÈĂÏÔÁƯư­ÁĂƠX“½ͽÛÑÓ±»«‡“ÍjÙÚ»~ăˆŸ;³¾ƒvж6¹Ú°»µØ߈ÏÔ«‡“Íj´Øö±»ÏÔÈÛ×Ù½ÎÔY߈•¾·‰ưÓĂ߈ź©Ç«ÔôÁƯưÀ›¶éY¾́ơ†$«ÔY¨ÇĂÙËÇÅ»›¾å̉ ëöíÖƒÚơÔéÚÄô¡ÓÔÁ‡é/×:ÁƯ‰ÁƠ󹩇¥2ßëMĂĂ ›­±àéMù×Å»¹Á‡×ÿÚ¡Ô¯‰¯0ªÚ ÏÔÅ÷Áẳ‰ÔÂÙÙ½‰Ơ“Ơ±ëØщ¦È‡Û¡çÚ¿ồ³ÈµØ¡Á˜Á ËûÏÅù惙‰kß [ïS¥ˆ]1½€åŒ¿ŃvñÖ‘ÛÄÓñÖ—¶ù×ĂĂÈÏźر»Û«‚ ½9¡Èù×£‡ÏÅ߈¡Ô¾ù×±»ăˆŸ•Œ·‡‘×8çăàÖÚ­º«‡“ÍjÓ̉ÏÅ«dâÁƠ³zù×ÎPÏŧ±»·ØăˆŸ;¯Üóǽ߈«·3uU¡Ư‰Û«‚ ½9˜‰NjÑNNNNZNîSN›Ă¯ÄÛ«‚ ½9±»ƒ½ôˆ¹»ăˆŸ;±»ïƠ9¥‡ăˆŸ™‰kß [ïS·Ó ¥0¾·Ø›ÛâÁ™Ó±»ùêăશ2tT« ©ƒ»5˪­ÄÙ»÷Á¨¼±»ăˆŸ;Á ÏÔ™Ô©ÇÙ½ï»ơèÅăˆŸÇÂ( ((¬(°à((èM(ÙÚăˆŸ©‡¥2ßëM™‰kß [ïS¯„ƒà©‡¥2ßëM÷ÔÛº±»Á›¶é8Y¤‡YÖ Ù½“ÛăÁ»¡Ô¿º÷‡₫ñÖùꧺ—Óù׃ˆéê÷å5Ó“ƠG½¹ưÓ°¿ơÄÁáêåô£ §Ø¡È¡ÓÅ÷ˆ‡߈ËÉ9ƒv‹Èù׿ôư³‰ƯơêơĽ˜‰j̃ZîSàêÿ¯¶½µØ‡ŒÅô»ØÏļÔ×Âï»ïöăçç4£Ø߈Ù´™‰kß [ïSùơÂÙ +ÏÅÍË)éÛ9¥§ÆùßÏÅ¢ÇăˆŸ;‡Œ®¾ù×ëöÅØµØưÀ¼̀¬Hå̉ ÄÓÏÔ߈“ǹÙÚ÷‡ÏÔó™ëéåă»Û«‚ ½9™‡˹%ëÓ˜‰j̃ZîSƒ¿‰¡Á±ëØëöôê8¤‡ÁƠXË̉¥Æ©àưÀ«‡“Íj†ơ´ơó¹Úï½ă½ÙÚ±»™‰kß [ïSÑØ°»áñÆï½‹ÜÆØÙóơê¹ÇăÔ›¹Ï̉ª¶2tT«‡“Íj½€³ù׫YÏÔưÀ©/ÏĽ»½ËÓ«Ñæ˹—¶çÚÄÓÙÚ Á½€íơ·ˆ±»•¾‡ĂÙÁÑÓ½º›¾Ăç»ô±»Ë¿ơĥ⥈]1§ÓÇ֯ȵa×$†“ÿ¯¶ơêù×™‡ÿǛÇƠXù×·‡‘×8çăơχ¿Ø­Ö·Üơê»ô“ÏÔǼ³m±»­Ø±»§ØØ™$᫇“ÍjñÓỞ¿Ù½ơÄ߈̃»ú߈ÁĂëÔ½Ă©&ƒÙÙÚ¯ÈÆ…Û‹ÇÏ|ă×ܓƳщÏÅ߈ÅØàƠ¿ñ¡ÔÛ«‚ ½9¡ÁûÛÀÙÚăˆŸ·‡‘×8ç߈Á½±»¯ÿ¯¶¸ÚăƯ­ÄÅØßÖ«·3uU«Ôù×—¶ơêÁ½±¿Ó̉ëßË̉ÏÔ₫ñÖêÔ™‰kß [ïS“›¾ăˆŸƒv™‡Á¼8¤‡¿»™‰kß [ïSµaƒØ±»ơÔß»ûµÜƒˆøêăˆŸ;µÀ”Ç µØ¡Ûù×½Û«‚ ½9ÅÔ¾ÏÅơê¢äăàăêöơ‡ưÁÙŒë*«•Œ¶Ü©¼óÄÅÓ›¡±»ÿ¯¶ÓØÅ±»Ùôív9¥‡Ă¹«‡“ÍjéÚ«‡“ÍjªÚ×¾‰¿I¡Á÷»/‹øĂºÙÅëÂưÀÇÖûÓƺÛ«‚ ½9ÙÚ¾ôƒvßÚ¾ù×̀Ó óÇñÄ̀Ó ‘ÆÙ̉Ëǣ䙉kß [ïSơêßÄÙ¸Ú“Æ£ÈÚª‚ +¼9·ÔÛºăˆŸ‹ÇăˆŸŸ}·Åëö•Èû›Ô¢»$ƒvơê躃։¿I›¶é߈仵ØÓº߈ăĂÅàÁưÈù׫‡“ÍjóĂÁçëö̀Ó¶èăˆŸñÚ›Ú½½­ÄÅÓÑÓ¿ß¹Ú©‡¥2ßëMÙÚù׃vñ»ÑĂÁƯ߈9¥‡ÁËñÓ£Ó‡…ûØç̉º—…¾»ÅĂÙùׇŒ×ÇŒÚ׳ …Ö‚v™‡å׫Â÷Á9¥‡—ˆºë$æØƒv߈Û×íÖ¶™‰kß [ïSƒÖ™‰kß [ïS…Ô߈½Ø…ä›Ơ¯×ƒ¾‘Ăè§ÔÙÚ̀¼9¥‡µØ«·3uU¼ ‡»‚văˆŸ;›¡Û«‚ ½9…Ù½Û׋Ƚ÷Ú­ÄY…Ó«Ôƒv³¾½öĂÍÓ³Æå̉ ëöưÀǽ‡߈¿Å÷Ù˜‰j̃ZîSº““ÈÙ׃½±»æ$§Ó¡Û¡Ô½ÁƯñÓƯÁ»±»›v߈9¥‡ÓØö߈™‰kß [ïSш°¿̃ ‡º©Â§º߈ív³ÙÏÅï»Ù×ăˆŸ;đß־߻û¹ÚؽÛ«‚ ½9¤‰̀L„ßÁÏÔíØỞăˆŸ;×̉ƠăÔ÷ÁƠÚ—¶™ôö«â«‡“Íj«ä»½·‡‘×8ççÚ·Ô‹ôÛ«‚ ½9½€³z¡»™ÁûÉÚª‚ +¼9ÎÅ%ËÓ¹ÚӺ߻ûÿڸȃv•%“Ơ¾₫·‡‘×8çăæרÇÖƒvƒ®Û«‚ ½9ËÖçïï½ÏÙàÙÜĂôùô™‰kß [ïS«Ô‡×ˆå̉ ưÀYÛ×ƠÙÛ«‚ ½9‚Ú‰¿I±»Ư‰·ÔÛ×ưˆ•Ë›‡÷ơ­Ö³nÏÔ匿N‚à¯à±»÷‡ƒ¾‘½ëÿ¯¶ûر»—ˆ¦¹ªÛû¾ëö™‰kß [ïSíêÙĂ¿‰ƒvôçÚÑÓªÚ×¾ÏÔ³ÆóÔö½Ûº«%ù××Ă·Ô9¥‡ơͺưØÚª‚ +¼9åĂĂÙƒÛ«‚ ½9Û«‚ ½9ÏÅß»ûùסÈÛÀÛÅơÔ߈ơŒÁƯ±»Ï̉‡x…‹·‡‘×8çƒÖ‹½‚vôơêÎÅ9¥‡‰¿I÷Ô·‡‘×8盾ËÇ•Èû›߈™‰kß [ïSÜ…Øëö›¾ºË¿щÙÅ뫇“Íj߈ƯÓ ¶߈ăˆŸ;§ÓؽăˆŸÿ¯¶›¾‹Ç›¾éØàê߈ÙŒë*«̃„ÙÚؽƒv¼ë™‰kß [ïS©ÀÛ«‚ ½9µØĂƯ‰©Çº߈ÇĂù×ÿÂÛ×ÙÚĂôăˆŸ›¾»‹‰y«‡“Íj™‰kß [ïSóÇđÁăˆŸ;k™‡¯‰¯0«̃₫®¶ËÀ±°™Á¹—±»óÂgÓŵعØĐÓ̉ù×ëöˆƒ¾‘Ă£ä©‡¥2ßëMƠ•Œé‡ơÅߌÛ,™ÔïÚÔÁƯá̉Á̉í ¡ÈÏԙԳȋÓgÙƠƒv̀¼‘˜‰j̃ZîSÁ̉—¶½ăˆŸ;߈‘›²×ßÄىۻܗ»€ºÍİ¿µÈ¹Ú¹ÚëöñÆ9¥‡ƯèØ¾º™‰kß [ïS½äºù×®Èÿ¯¶ƠX“¹ÜNϺÓÅÛ«‚ ½9«‡“Íjé¾Í­HĂÙív«‡“Íj™‚™Áù¾÷ÁÈăº¹ ÍË)éÛ9¥Ń‡­vÁ‡é/×:•Üăê³£äơêùê™Ç9¥‡×ÿÚù×ÙÚ—ØÓºù׫‡“Íj±̉¹Ú¹ÚÛ«‚ ½9ùÆÏÔ§ÔÆëöĂÈÅÓßÚơĂỞƒ½8¤‡×Ûº¾±Á¿ßÇç“ȯG‹ø“ÈơêÿÚ£Ôà¬Û«‚ ½9›¶é½±»̃ˆF¼¹ƒv°ÀŒß}å̉ Û«‚ ½9œĂĂÈÚ×9¥‡ó躖ӳț¾Úª‚ +¼9ÅÄíơëö•hÛ«‚ ½9ÏÔå̉ ¯G‹øù×ùê—¾¬Öϼ«ÚºƒØëö¹Ú›¾öÚؽó#³ÿÚăˆŸÖºăˆŸ;kçÚ›¡ƒv¥‰ÍL…߈ăàéÓ¤Û·̣±»ù×Åµà™‰kß [ïSƯ­ÔơÔÛ«‚ ½9ĂƠÿ¯¶ªÔÔXéÓÓØÿÚ‡“¹ÚÏ̉ÿÚó—¶áêơÔ9¥‡ÙÓ±ëØ¯×ëöñÚëö¬Ô‚ÔưÀëöŸÖëöø§Ï”îêöăˆŸµØ½½€Á̉›¶éûZ÷Á•Ó‡“Ơù×±¿ˆ«‡“Íj™Áé›¶éÛ‰¿I“ÈÚª‚ +¼9ưº±»Ÿéù×ÍÄßÁơêµØŽ¡ÁçÚÇØÍÄü“ñÆ·‡‘×8çëÔź™‰kß [ïS—»›¾“º™‰kß [ïS³È«·3uUÿ¯¶9¥‡§ôÏÅ½Ă½Ñű»߈™‰kß [ïSû¡Ç±»߈í‘—Ôßô½ÄÓ‡ŒºÅÙÜŸ}ù×™‰kß [ïSăˆŸ;›ÚÚ&ơÔ߈ơ9¥‡̉ÆñÓçÚª»ăˆŸ;ưÀ߈«‡“Íjܪ ¶ 2 t T Á́߈»½ÙÚù¿ÑÄëçÚ©Ó¾ôù׫ѹׯ±»â½¿Ô›¾Ë%¾ßËÉ9ßÚ‡Œ¼ï±%å×–»¶ÅĂƠ±§¹¦ôƠÓΰ»ÙÚăˆŸÍéÚÏŃÁæßÚ¨¼9¥‡ƒv›¾°»ÙÚăàÅñÚÀ½µØøê÷Ú¡Ç™ÁçºóÔ«‡“Íjù×9¥‡9¥‡×¡ÈÙ½­¾º·Å³×öëöܺÏ|£X•÷ùê¯Ăù×ÓÆÛ«‚ ½9Û¹½ñÓ™‰kß [ïSàĂÓ̀Ăª‡’̀j™ÔÍË)éÛ9¥¦!™‰kß [ïS±»×¾©¼£¢ƒv‚vÏÅơûÇÖÎ̉ŽœÔĂÙ߈Û«‚ ½9ÍÓ÷Ú¾‡ºëöĂÙ•Èû›™‰kß [ïS™‰kß [ïS¨Ơ ˜ÁÁ‡é/×:§ô™‰kß [ïSƠXÅØ‹Ó₫ưÀÿ¯¶•Â}߈ơ©Çó^߈ÂÙÉ̉¿‰ù×ƯÚăˆŸÛ×ëÚ½ô‡‘ÆơÔ¿‰”&Ï̉ưÀÂÈ +߈ù×ÚÀŸÖØ,˜êèä¡Îׯûíï»ë™HöÙ½ϼ÷ÚËÉ9ơêöÁÀ½º÷Ù•Èû›½‹vÓºµÛ½ơº±»Ô¼€›¾ăê«·3uUù׃văà•Èû›‡ºí‡ÁƯ¿ôÜÓÑ™‰kß [ïSƯÓ ÅÙÚùסƯ߈₫Ú¹à¹ÚßÄÙÈưÚÙ½¾(Û«‚ ½9‡ÚơèÅĐÓ™‰kß [ïS·Åº›¾µ†ƒÔ¤ÜƒÖâˆ:˜‰j̃ZîSëơơºÅƯ½­•·•Èû›ÙÅëăˆŸ·ôíꃈå̉ ÿ¯¶Ï̉߈ÁƯ·ÅÅÔ퇽ƒvÛ«‚ ½9°»ªÚÚỬùיحÖ8¤‡Ù̉ù×Û«‚ ½9±»©ØÅÇ"‡×ĂÈỞ±»ƒù×÷ÚơÔÏÔ¿ôÓÆßÁñØ¡Á𫇓Íj÷Á™‡ƯơĂÏÔ‡…»Á½óÔ¯×ñÖÙ½öëößÚÛ«‚ ½9ÏÔÉ™‰kß [ïSÏÔÏÔÏÅ̃»úËÉ9«‡“Íj™ÔíÆơêÇuưڜ܉ÛÇ‹Ù̃ĐÓ àễˆ¤ˆ\0êöÆ™ÓÿÚ§ôëö¥ˆ]1øê«‡“Íj³ºóƯÉơꃭÔñÓÏŧÆÅïơ´ÙŒë*«ÏŸ½½ơèÅÿ¯¶½…£­—Œ±»¿‰öÁ±»ÙÚơĂưÀ½Ô£ÔרÏŋٳܘêèäĂÙŒë*«ăơÅØ§Ó±»·‡‘×8ç˜à±»9¥‡×÷ÁǼŸ}À½ÓÔù×ÍÄ×$ÓØ™‰kß [ïSÅ»ÏÅå̉ щÙ½«‡“Íj°¿ơĂ¿Å©‡¥2ßëMßÚϹګԷ‡‘×8çå̉ ¹ÚEÓÛ«‚ ½9¡»Û«‚ ½9̃ˆ ¿ßÙƠùêăˆŸ₫¡Ô«‡“Íj̀Ó +Ôơù×µa™Á¬¾߈‰Û­€ù×…Ô߈›¡ÇÁĂỞ¥Û«‡“ÍjéÚ‰Ô«‡“ÍjëöƠô™ơßÁÏ´ÔɇÙ½³zĂÙ«ÔÜØĂÙ«ÔóÇ«·3uUùפÇçÚ¹Ú•̃߈èêÅØ‹ÙÍÜăºÛ«‚ ½9ûä̉º½§ô©Óù×÷Áß»û‹Ç—¶™‰kß [ïSïƠ“¼ƒˆ¼íƹڭÄóÂăˆŸ;á ÷‡˜‡åÁƒˆÿ¯¶µØåƠ¹ÚóÇÛºù×›¶éçm½€Ưڡȹڑ‚Ù½‹Ç·ØơêªÔ‡Ç©ˆ¹ØÅÖ—¶ÇÓùêçô§Ó‰¨ö9¥‡µØ±»ùæ9¥‡å̉ ÏÔ™‹ß„—¶ÏÅ“Ơñ׃ر»¶ÔăˆŸ;‹Ç̃ÄØØ…—¶ăˆŸÏÔ±»—¶±»ºÛ«‚ ½9·‡‘×8çƒÖëƠ·Åá=½€ÍÓÛ«‚ ½9«‡“ÍjỞÑÄë9¥‡§ÓÑØ¿ßơÔ€ºßƯÁĂ«äµØöù×Ï̉Ơ•îƠ±½™‡ƯÓ öÙ-Œ½™‰kß [ïSÛ«‚ ½9½¹Úå¿«‡“ÍjÙà‹Ü‡µ÷½Ø½€ôÙ½ă9¥‡Û«‚ ½9¹Ú½ÿ¯¶ÅÓ±»щ¿ÏÅÔXăˆŸĂÙù×½ÛÄÓ¸ÚơÔ§Ô߈ÀĂâ»Ư÷ơ»̀Ó·Ô§ôùê뇹ڠۭ¯‰¯0ƒvµØ߈«‡“Íj¦ºïű»çÚ“Ơß»ûµØơÄÅÔ™‰kß [ïS¢Œ߈½ÅؽÜỞÛ«‚ ½9©‡¥2ßëMÏ̉®ö㫇“Íj‡Œ˜‰j̃ZîSÏÔʹ «‡“Íjß»û¯×±»ù×߈ÇÖÛ«‚ ½9©Ó½§ÓœÜÅ íÆ¹Úª»Ơ¾× +æÇ ù×ívÿÚĂÙí—G…àëö‘ÚÙÚø×ëç±»Ù­ü¡Èù×½€ŽÚÀ±½® +áÓ»ÅÏ̉À̉Á*º‘ª ¨ƒº5¿ß‡9ùׂ ߈½ồÊ)èÛ8¤Ô‡ŒºÓˆ•=‘—¶„Ú±»­‡º±»½ÙÜר½•Èû›ƒĂ—¶«âù×±»Ï̉Ơ¾GÇ»̃„·‡‘×8çÇÖ˜‡¾ăˆŸ;k›¶éñÓ«‡“Íj»ô±»«»™‰kß [ïS9¥‡©)«‡“Íjׯ߈“Ơ±»£Ç«‡“ÍjÛ«‚ ½9ôơÔ…£­¾¿‰µØ±»߈óĂÿ¯¶‡ñ5Íë䗶¿đźưÀ±»̀Ă߈ñÖÍÓÛ×·‡‘×8çÛ«‚ ½9ăÁÏÄ™×¹ÚëöÏÔ°ÁÑÓª&߈…ö±ÜïÚ©ØîƠ¼Ô±»̣ƒ¿ô«‡“ÍjÁ¯¼“Çë×…ô™Á߈«‡“Íj‹ÓÏ̉Ưˆ¡ØĂÙÙÚ£é¹ÚƠ™Áăà¼ÔơÔÏ̉åÖ‡Ú©‡¥2ßëMÓÙ8¤‡€¾Û«‚ ½9ë¦ËÜ߈±»“Ơ¹à«‡“Íj±»­ÄûơÔ±éÏÅÁÉñëØÏÔϹÛ«‚ ½9¯ÈåÁâöÛ«‚ ½9́‡ø¿ỞÏÔ«Û‡¿Óơê³ô±̉ăÇí½™‰kß [ïSƯ8 ¤‡ ×ÑĂ߈Û«‡“Íjù׃vívù×íÚÍÄûÙ÷‡“Û‹ÇơÄö¹ØÚ×±ëØEơÔÛ«‚ ½9Ă¡Û¹Ú±»Á̉¡„½€‡×ÁĂ÷Á±¿–Œ“tÏÔÛ«‚ ½9œÁ +ÓĐăí÷ÁµØ×$ƒvñÆÅا؉۳!ñ—¶ùê܃vĂÙơÛ«‚ ½9߈ÓØ÷Ô›¾¼Ăƒv½ƯÓ ö«»ÈÙĂÓÑÄ뽵ؙ‡ưÀª¶2tTÀĂƒvëö±»©ÓªĐ½Û«‚ ½9ăêơêå×߈ôơêưÀ©‡¥2ßëMŸÅĂyơèŮ阉j̃ZîSĐÄ +ê +™Ô€Ä9¥‡×Ù£ÇơÔív׿8·Å°»ÏÅ±ëØ‹Ù«‡“Íj9¥‡“Ơ¶ÔívÍắ©ˆ±ë؃ˆ¥Ø¥Èξ߈å¼ ±»ÄÔúƠ¸Ú§ÓÛºÛ¹“Ơ±»°»Û«‚ ½9ĂĂ“ÈĂÙ×$̉ÁÁƯ©ØÚºû «FéJé‰Ó5“gesÁÅÍË)éÛ9¥ׯ¹½›¾ƒØỞ̀ìÄß»ûÏÅû³ †x›»Û™—¶ưÀÔá=Ơ¾çơꯉ¯0ă»¥ˆ]1ÿ‡ÏÔ©‡¥2ßëM¥Ø»Å˜êè䉿IÇÖ™‡ÁƯăˆŸ;kæØăˆŸ;é”±»ÂÙ'ÅØ«Ô½‡ÙÜñÓăˆŸ;¦ô0ù×ÏÔù×ÖÆ¿¦¹Úɇ©ÀɹĐĂ߈źëöíÖăˆŸöĂÙëöăàáÛíÔ Ëû½ùêá ±»•×å̉ ÿ¯¶ơêÅÓ¼ôϼéꙉkß [ïSôĐÄê·ÔÑÄë•׃Øơ/ơÔ«‡“Íj₫ÛÁ›¶é»ˆë¼«·3uUƒvï½ÏÔë«ÑçÚû(¹Ú½ĂÙÙÚ«‡“ÍjÙ̉¹Ú±»ÅÓå̉ »ÅïƠÛ«‚ ½9˜‰j̃ZîS¡ÛëÆöˆç̉ÁƯ¯¼ƒÚÛ«‚ ½9¦Jº±)Ăø×µØ¡Ûûơê†ÚÛ«‚ ½9ÓØËÖ™‡öÁŽ˜ô¹Ú«‡“ÍjÏű»¿Ô‰Û“Û¿¹»ĂÓ×I±Á«‡“Íjñíȯƒßͯ¥'=U#QK¯ÂáƠ¹Á‚v¿ô±»íÖµ!Ơ©%«‡“Íjóñ»₫·§D ‹Ç¡đÅØË¿‹±½¼ÁÏ̉Ùדǰ»Ϲ±»™‰kß [ïS8¤‡ŽÀËëö¬ơC̃„À¹›¾ö‘÷ơÔơêñÁ°»ăˆŸ;»ØơêÍåâ¼ë‘™‰kß [ïSỞơêơêưÀùׯ¼Ó‡³ï‰“ƠưÀëöËÅ™‰kß [ïS±»±»¥â“饯ù×ù×ăºÍ÷ßÚ߈½±»ö™ëé噉kß [ïSÿÚơêÏŽØ×¯¼©‡¥2ßëMívÔ —÷ä5̉߈ăˆŸÏÔÙטêèäăÂ3©±¿}Û«‚ ½9‡º›ƯÁ³‡e¿‰¯Ü™‡½“È߈ÿÚùê8¤‡ÅÔÁƯ™‰kß [ïS8 ¤‡ Ö‡ÿ¼áØÏÔù×ÙÚ›±»ï³2½±»Á¼¡ÔơĂÏÔă‡9¥‡ÄÔ™‹ßÚăơÁ ›¶é¨Ơ ơÔ™‰kß [ïSƒˆ©ÈơÔëöÀ¼ëö½¿́ùº¡Ô²ØÙ½ÖÆÙÅëÇÖǼ½Û«‚ ½9ưÀÓ¾ƠơÅáן·ÔÙܹڗ»‡Ç©ÀºƯơÔX±E­¾߈±»¾ß +ƒvÑÓÛ«‚ ½9À‡€è/Ö:ô…»Áăë×±»ÏÔ»Øÿ¯¶‡Œ—Óù×Ѷù×ÙŒë*«±»ñÚ›¾×Ơ†7§jÑÓ­Ô¥ºï•Èû›ù×ù×·‡‘×8ç³½‰y¿¹µ‰Û«‚ ½9¸Åƒv•Ç«ÔÛ«‚ ½9ÙÚÚÄ̉éÖá=ßÚëö‡ù“È­ç„äéëö¶ è ÏÄ߈«ÔÛÄÓăˆŸ;Ư‰Û«‚ ½9£ä¦ÓçÚ9¥‡…Ûƒ×ËÉ9´›Û­)ưÀÖÔ†6¦j“Ơ“ƠÁƯ÷‡ͼâ½­¾£»™‡åÁĂÙơÔŸÖÛ«‚ ½9‡áêÛêÚª‚ +¼9ÏÔÏÔ¶¸¡»ÁÛ™‰kß [ïSŸ}ívׯ¶Ù̉ùט‰j̃ZîS½ôñ‹ƒÖ¿½ÏÔÛÍĂĂÈ9¥‡Ô“Ơ¢ÈÓØĂÙ¯WÏÅÎ̉¼á¹Ú¶̉Ø«ÔØöôê$«»ÿ¯¶·̣÷Áº»ˆ‹ÇÁ‡é/×:ĂÙù×âˆ×—ĂÙ—¶±¿µÅ߈¾ø·ÔÑÓơêÁ̉ÁSÓØ₫Û½€‚9¥‡ëöÓ¼»‡ÇÅ·Ô÷ˆâ½©À™‰kß [ïSĂ ÑÓ›‡ƠijÏ̉ù×é‰ñ5ñ·ÏÔ Ëû‘÷ÿÚÑÓÏĵ†ËƠº™ÓÑĂ•ÇăˆŸ;kß±»ë¼ÇÜçđăˆŸ¿‰ÏÅăˆŸ;Ăô£»߈™‰kß [ïSĂœ›¾ƠXÏÔêØ߈ß»ûÛ«‚ ½9ơêø×‹Ü‹ÓÍÓơØßÚƒˆß\å̉ ߈ù×ÅÓ½¾Ơ'«È¯¼¶ Ù½ëÔƒ¾ưÀé‡ñÁùëÅÔëÓ₫íêÅÔ¸Ú£äív—Œ½Íă½½µaÙÚ§ÓÏÉç8󓸡Ôщ£ØëöÁ̉öà=ÏÔơêÙÚÏÔÇsÏůßưÀ•Œ8¤‡¿ºÙ½äܱ»ÁöñíÈ®ÿ§ƒˆé"«‡“ÍjŧÔËƠµØËÖᨕŒ—»§®ÔXÏÅ×¾­¾Û«‚ ½9ƒˆăÛăàë·‡‘×8ç—ˆưÀăˆŸ;kí–GĂÙ½ăˆŸ;ö÷ÁÓØ‹q‚«‡“Íj­Ú±¿ăˆŸÛ«‚ ½9¨º·‡‘×8çĂÙÑÓĂ çá—û̉÷ˆù×ưܵ¶™Ổ£äÙÚÏÔÏÅÙYÏŽá ÏÅ«‡“ÍjÁ´ëöù×½ƠχëöÁ½ÿÛĂÈù×ׯÓÙ‹ÜÇÖñÏÅ·¼Í7¡Èͽ¶רƺ½Ë¿·Ü“Ơ»· £ä·ºׯ—¾êÚ߈³ù×—¶Úº°»·‡‘×8ç₫ăˆŸ;¡Á߈ƒv¹ÚăàÚ× ₫‰¿I±»«d匿N«‡“Íj¥ºẳºÏÔŸ}ơ$ƒˆ§ØÙ½½ëö¹ÿ§ùꩼµaù×›¾«‡“Íj¿ƠǼÙ¸ºyÊŸÅĂĂÇÊÇÛ«‚ ½9¼«»¡È˜‰j̃ZîS½/ÏÔĂĂÿÚÁ½¹È±ÔÄ–£»ƯÚûEíà™‰kß [ïSøơ‹Ă$º…¼“Ơơê߈×Üá=ù×Ï̉±»ùëµØäù×ÓÛ«‚ ½9̀Ó›¾©Æ«Û«‡“Íj½Œøêÿ¯¶Û«‚ ½9Ù́ơÉẳ ËûÙ׳ßĂÙ™‰kß [ïS“ÆÅÔI•ŒëÓĂĂ ›­±àéM£»¹Úóķػǻ©Ç߈ƒv¡ÓăˆŸ« ©ƒ»5¾ßÏÔ9¥‡ëöƒv“ƠϹăˆŸÁåăˆŸ;ơԶ蘇¡ÈơêÇØ¹Ú«)ÓÔøơ½×Åô¾Øù×ëö£ä¶¸ù×ÑÓ›¾ăˆŸÏÔ‘̃Û×§Ô律ÇÏÔ«‡“ÍjÑÓăÇíá¼÷ÙưÀĺă»ĂƠ¡\­¾‹ÜÚêơ¡ÁóÇÉĂÑÓ‹ÈáÛëö‹Ü¾ß9¥‡×¿ßù¿ùׇÇÛ«‚ ½9ÇÖỞÏ̉Æ›¶é½¯×ăˆŸ;¾ƒˆçԡԙذ»ÁỰ¹ƒvÙÚ±»³È—¶$ƒ½ÁƯ‡ƒÔ¡%Á½§Ôù×ĂÙđÇñÚÎÅëÆ¥ˆ]1öÏÄëöåĂ÷ä5̉“º±¿Ûº‘ơñÖăˆŸ;—Öăà‰Ôù×»ưÀµsëö¡%«‡“Íj‘Û™‰kß [ïSăˆŸ;ƒˆ½Ă¹Ú×Ơ߈ưÀ™‡̣Ô±»µaÏÅ÷ÁѶ·¼Í7…ôĂ—ˆëöëö¬ÔƠ‡Ç§ÔËܽĂÚÀSç'ƒˆưÀå̉ ÁƯù×ëö¦ô—¾ÿ§¿ÅöÏÔÅÓù׫·3uUÙ½«‡“Íjß»û₫9¥‡­Å¾ăˆŸù×8¤‡ÁË—ÓÏÅ•ÖǽËƠ¡Ô«‡“ÍjëöçØưÀ¥Æ‹Ç¶™Ô÷ÚóÔå̉ ÿÇå¿Û«‚ ½9™‡éºÑÓđ̉³шχ™‡ׯÛꙇ™‰kß [ïSƋ܃v‹ÙñÚß»ûƼÉÏöăà»ÅßÚÿ‡ù׫‡“Íj©¼Ïŵa±»Û×麵Øêö±»ǺÏÔ™‰kß [ïSơÔÀ¹¡Û™‰kß [ïS©Øơêù×½ø¼·Å›¾Ûºº½›Úùë»Î«ô£äù×¹Úƒà¡ÛăˆŸ¶èÄÀœÁùêïÚ«Ôµ†ƒ½Ù£»ÓÆÛ«‚ ½9ƒv›¡çôɱêöù¡ÔƒvÆô¶÷Á߈Û×ó„ô˜Ûׯëö‡Œ™‰kß [ïS³ÜÅÄ¿ßÏÅĂĂ ›­±àéM«%ûæ÷Ù™ÓívÛ«‚ ½9Ÿ̃˜‰j̃ZîSô¡ß„ÏÔĂÙ«‡“Íjä̉³È²Æ‹ÇĂ “Æщơ»ĂÙÏŇº›¶é¯ÈźĂÙ…ö÷ÁóÖă»ñÚª‡’̀j™Á™ÁăˆŸ;Œ«ÔñÓ߈ïÄ9¥‡…ŒơÄ™‰kß [ïS麪ôÈăˆŸ‡™³ÆÙ9¥‡߈ñÖöÎÅÏÅÅÓ™‰kß [ïS÷‡÷Á›¾¸Ú߈ßÄÙưˆ´†›‡ÿ§›vÙÚÈ̉ÍË)éÛ9¥‹œ‡“Ï̉«Ô߈ơù×îÚù×—¶ª‡’̀jưÀ¡È½½€ù×ơÔÙÚƒvÏÔ÷‡óÓѱÛƠóÂùă¹à±»¥ˆ]1³îƠÏÔÏÅôê¾ ÈÏPç½±»½ƒ÷Á³ºóƒ¾‘ñƱ»Û«‚ ½9ÿ¯¶ÏÅ‘±­ÄÛÇï¾å̉ ¿Å±» +Ù½́Ø«ÔÛ«‚ ½9™ÁƒÖÖÆI½ù×ÓƒÖĂ¡»¥º½±»½ĂÚª‚ +¼9"ƒˆ•Œ©Ó‹Ü«‡“Íj›¾×á퇋ÜÀƯĂºµØϼ¶è©¼³ ­ĐÅÔ™‰kß [ïSÙ½º«»¿º¥Û™Á£ƯÓØùê·ÔưÀ½¡Û‹Ç ÔëöÏ̉éÓÿ¾±»ï½±»ÏÅ„ö«‡“Íj™‰kß [ïS“½ß»ûÄÖơê÷̀ùå±»߈£ØưÀ‹Ü¿‰™‰kß [ïSÛ«‚ ½9¿½ß±œ™‰kß [ïSù׫‡“Íj9¥‡öÏÔÑæ%¼ôù„¡ºëÓÏÔĂÈÛ«‚ ½9߈ăàóÔÛÄÓƒÖå̉ Ă«ÑĂª¶2tT߈«·3uUψ¿ºÁĂÛ×ÅØÍÄÙ½ëö—»¹̃ăˆŸ;kíêÏÔ߈÷Á°»Ñ̀߈ŽËæíơ•'‡ÛǼ߈ÙYù‡¥ÛÂÙ™‰kß [ïS‡ơËÉ9³óÀÛï½ăˆŸ;½±»ï‰óÇ€Ó ƒÖ½ô«‡“ÍjÑÓêö߈«‡“Íjá¾ơê¯È¥àƒvÙԗ¶±½‹Ü¢äÙ½ÈơÔá ¿‰«‡“Íj™‰kß [ïSăˆŸ;¡ÔơŒëöû؉ÁÏÔÉĂÈ£ä™×Ó̉á̉½Ô÷Á¾º´ÈÁ̉ÑÓÙ×½€™‰kß [ïS¿ºÓØ–»ÙÚ…»ÔX«‡“Íj‹ÜơÔؽƠƒ½Û«‚ ½9«Ú“Ơ–đđ¦đ̀»đđÏ̉ơê·̣ÏÔÀĂÅÛ«‚ ½9ºщëö¬Ä4º½¥ÄÙ½ù×óă(ÍÓÙ½̉Á½ÇÖ©ׯÍŸ̃ˆÛ«‚ ½9ÄØùê…nĐÓưÀƠ9¥‡»ÓÓàµØÙÜÿ¯¶¸ÚÓØ·‡‘×8ç8¤‡×ͼĂÙ±»˜êèäÑÄëÿ¯¶Ưîº߈ßቿIÛ«‚ ½9ù×Ù½•Ô8¤‡Öđö±‡±»ơÔÁ̉›·ÔÓØơêăˆŸ;è§fư“9¥‡¹ÚÍË)éÛ9¥µØăˆŸƯºÛ«‚ ½9›¾±»„½é‡‹Û½Ô±»«‡“ÍjÛ«‚ ½9‡Ú¡ÛƒؽÓ¸£Çרçô—ˆÛ×Ç'µØ§ô‡ŒçÚ‹Ü₫¼Ă™ëéå·ôà=߈…ÚĂÙ±»‹ÜËÉ9߈å÷å5ÓÁ˜‰j̃ZîSàסƯƯ܃ˆÁƯñÛÿÚ½€ÏÔ›¾ŸÄ«·3uU‰Û“ÆÛºÅÓéơ…'ëöùê“ÆÂÈ~‡Œ±»ù×µa½Á̉ÑÅ¡ÁçºÅØù׫ڹګ‡“Íjµ½½ÑÄë·ÔÙÙƒÖÏÔƒµ©‡¥2ßëM±½É̉ù×ÑØÙ׫ÔÅØÑƯÓ ơêËÉ9ÉÜƠ‰ĂÙ×ï»ăˆŸ«‡“Íj͵ث‡“Íj™ØµØä̉Úª‚ +¼9½€ÙÚÏÅœ‡áƠ¤ˆ\0ñÓÊƠƒvƯÓ ›¶é߈±¿ß»ûÏÅăà¡Û™‰kß [ïS–ŒăÁö¾Å郩‡¥2ßëMơ꛾ù×¹ÚĂÈÛÀ§Ơ±¿±»·ÔËÓ°»8¤‡×ÍijơêëöÇ#­ôÇØ«‡“Íj߈‹ÇưÀÎÔ“Ơ«‡“ÍjöưÀÏÔƒƠºm«‡“Íj9¥‡ÏÔ‡98¤‡¾¹›¾ÙŒë*«½ßƯ±»¹àß»ûÄù×°ÔÏÄ—ÔƒvÛ×Ϻ“Ơ›¾̃Ö·‡‘×8çî#°¿ù¿ÉêĂÙïÚívÍÄ™‡Åôơ.¡×߈³Ä¿ß×¾±»ùê«»ûÓ9¥‡×‡Ư9¥‡шí—G‡Ú°»·Ô•½¼Øéº‡Œ×¿8ÏÅÙ½³ºóÏÔö©ƠÜÙÚÚ×߈̣ê>ăˆŸ;k“ºÇÖë‰߈ăˆŸ/ù׫‡“ÍjëÔ±»©¼ĂÙÑÓ½ÔÍƠ߈ùơ³ÅôÅÓºË̉ÍƠùױȾö±½ñÚåÙơèŹź¡ÁívơÔơèÅ«‡“Íj‚v×$½€9¥‡¿́¢È"ôù×éêßÄÙº¯‡ĂÙăˆŸá ³àÁĂăà«·3uU¿ç“¹ƯN·Ó ¥0éăˆŸ½€/¾ ËûẲ9¥‡×ÏÔÁƯĂÙ›¾£ä¡¿ßŸ3ÎÅ »ÓÚª‚ +¼9ܺéê…½ÛÀä̉@ƠÁÑ}ỞÁƯµØÏ̉™‰kß [ïSÔÂèÏÔ™‰kß [ïSÆơê»È¼·ÜăˆŸ™‹ÓØ«‡“ÍjëöÇ…“Ơù×ĂÙù×›¶é߈ù×¶ØÏ̉ưÀĂÙ¥ˆ]1ơÄ›¶éרÏ̉ͪ³(‹ÇÛ«‚ ½9µØ«·3uU£Ç‘ÆăˆŸư‡±ù1Ở´Î½óÂéÚ•Èû›ÿÔ²ÆåÓÚª‚ +¼9ÏÔ“Ơ«»û÷߈Ú× ÏÔëơĂÙ¡¯ÈÛ¹›¶éçÚ¶ÈÏÔùׇº“È—ˆÍî½™ëéå«ä£»°»ßÁơê§Ô¿ƒ©ÓĂÚÙÚ­ÄÛ«‚ ½9«ÔÇÖ«‡“ÍjË%ßÄÙ¼ç×ƠƠ±»ưÍÛÆÏ̉÷Ù£ôÁƯÏÔÏ̉§Ó¡Èí—GÇƼ¾‚ăàœ·̉ ¤0«‡“ÍjƠÄ®¼ÏÔƒv±»ÿ¯¶¼’½¼ùơ«‡“Íj™‰kß [ïSÓàÏÅÙ×—¶ʹÁ÷Áù×ѹä½’Ơ±»̉ºù×ëö†x9¥‡÷å5Ó˜‰j̃ZîSß½«‡“Íj‡Ç‡Œ³àăÏ¡»×ĂÅÓÁ×ʹ‰Û¾‰É6óÂßÖƠĂÙÿÛûéØÇ»×¿8Ûºù×ëö¿½·Ô‹Ü±½ûÓ›¹¾ß‚…ØĂÈ™‡ƒvŽÛÄÓ‘ÆăàÛ«‚ ½9߈ä̉‹Ç¾ÔÛ«‚ ½9ơêÖ‘ƯƒÖö»ÿ§¸Ú‡ÇÇÏÅËÇø×½àùêÛ«‚ ½99¥‡߈öçÔ¡÷ÁÍË)éÛ9¥·‡‘×8çÛ«‚ ½9¾±ÁÓ¾§ØĂÊñÄ™‰kß [ïS9¥‡«‡“ÍjÎ̉½«‡“Íj˜‡8¤‡›¾óÂÁÙÇÖͼ°»±»ïÅß»û÷Á…ÔרÏ̉¡Ô›¾ăÁ§ôỡ…Û­vÇÖ¿»±»Ÿ}÷ÁôĂ™‰kß [ïSÙÚÚ×½ÂÙùë³Â¹Úëöƒvåố–G½ÔôêùêăˆŸ;½€ăá Ç"ß»ûưÀ¼ùë…Ÿá¬Ù½ÏÅç½ív½ó¹›¾¯sív¹ÚÁ½Å“ÆÛǧ࿻ÿÚ½³ ËûÛ«‚ ½9ÙÚË̉ÑÄëÚ×Á¹ü‡°ø1ׯÙ×߈¡Áá=ù×ÍƠó™ÏơvƠX™ëéåÂщưÀÍƠ±Á§Æ³àăàÏԵ؃ˆ‡ñ5˜‰j̃ZîSăˆŸÂÙ®ÿ¯¶Ù½µÏÂíÖƒÖÿ¯¶Û«‚ ½9µ‰•ÜÏ̉™‰kß [ïSß»ûG½¹ùê¹Úóh‡º™‰kß [ïS¡ÔÏÔÇÛ«‚ ½9ÏÅơèÅívơÔ÷ÚµaÆØÛêÙ̉«‡“Íjÿ¼Ç»Û«‚ ½9Å»ăˆŸăÁÎÔ¡Û™Ô£»óÔïÁÑÓ¿‰–¶©ÓƯÓ ơÑÄë8 ¤‡ Ö½«»I—ÓÑĂ¯×ù×߈ÿÚƠµØÅô²ÈăˆŸ;Û«‚ ½99¥‡ëöëöÁ¹½ôÍåá̉ÚÀ«»¿ÅÏÄ›¾ÊƠ÷ˆùט‰j̃ZîSÿڋDZ»÷ˆáê½½Ôºy9¥‡¡Ôó麒ÛÖÛוÈû›˜ÛÅÓ©Óëö±¿ƒvsȵaרßÏʉ +j +̃ + + + +Z +îS +ăˆŸ;kÑÄëׇ½7ºÛ«‚ ½9ÿÜÛ«‚ ½9Å›ĂñÓ°¿ƒv÷Á³÷ˆëöƒÖ…Úƒvôùꥈ]1ù¿÷å5ÓóÇÁ¹Ï̉ޱ»±¿ívùל·̉ ¤0Ñ׈¾™‰kß [ïS¾ßăˆŸ‡Œ߈˜‡ơÇŒñÚÏ̉“Ơ޹¼ËÉ9ä̉  ÁƯ³́©)ưÀ§ôù¿¡Û߈Úª‚ +¼9«‡“ÍjÛ«‡“Íjù×á §Ó߈«‡“Íj¹»߈·Æ‘ơ›·Ô¼¯¥âḈŽÏű¿ơèÅ¡ßÖ₫ù×Û«‚ ½9®¼Ï̉₫÷Ú·‡‘×8çù×ëö8¤‡±”ñÖÿ¯¶ÏÔÙÚ²߈¥â—“Á­Äÿ¯¶«‡“Íj›·ÔÚ×ÛÄÓ‹º©ß½Ù½Åáö¡Û́º‰Á©À™‹·̣ăÇíÖÆûÙ¥Á³ºóăˆŸ;ÙŒë*«ù׺ÁƯ“ȾµØñÖ£ơÔÛ«‚ ½9¡Èô»½ÀçÆÛ«‚ ½9ÏÔûơÄøê¾¡Ç—¶ùטÁqÑÔÓ5“gesÁÅÛ«‚ ½9ÏÔÀ̉߈“Ⱦ퇟\¶ôƒưÀÔ‹Ü÷‡ß»ûǹĂÈÿƒvăˆŸÙÓ÷øƠX­ØăÓ'å¿êÚú̉ÅØÓÔĂ½ưÀ™‰kß [ïSΙ‰kß [ïSƠ¾G¼€ô¹Ú«‡“ÍjÛˆ´aÉƠÅ™‰kß [ïS÷‡ƒÖëöéÓ½÷ä5̉ÑÓÅØ‚v“ÆÅÓöÀ¹¾ºÙ½ÏÅÓØƠñÓ‡“ăà߈‡x¿ô™‡…»߈¡Ç÷ˆ‚É̉Ÿ}ưÀ¶èÿ¯¶³­¾ÁƯÏÔ¹Ú¥Øù×ÁƯØ×ƒv‚a)ÅØƒvæÚ½€ÍË)éÛ9¥™‰kß [ïSù×ơÔ«‡“Íj›¶éÁ½½¿(ÈĂ«»«‡“Íj߈£Øùêψ¶ÅÛ×× …¾ªÚ¹Ú´¶†ï»Ø×˜‰ j ̃    Z îS ­‡âº½ÏÔÏ«‡“Íj9¥‡÷ÁơÔÛ«‚ ½9±»ƠX߈Á‡é/×:ơÄéïÁùדƠï»éÓ½ôÛÆéÚ߈ç[§ØñÖŸÖ“ƠÙY™ëéåϳ₫ Ëû•óÁÅÔÙÚăˆŸ;ï½£ØÀĂù×ưÀƒvƯ‰ù×̀Ê)èÛ8¤ăÔ߈%©‡¥2ßëMµØ«‡“Íj‰¾¡Á°»ăà³nưÀăˆŸ…ôù×÷·°»óÂéºñÆÿ¯¶¹ÚÏÔ§Ô¡Èă½ƒv™‰kß [ïSÅÓëÚĂÈ߈ăơ›¾«‡“ÍjñÓ±»ÿǽßÄÙŸÈßÄÙñÚéêùêëö‡ºÑÓóÇÇ"÷ؽ‰‚×Ñù×ù×÷$ù×Ụ̂“ÈӺӹƯÑÓơêÛºµØĂ ±»ƒv™Éù?ÉĂÆ·‡‘×8罩ܯ¾ùơ…Ûơ*ơêÛ«‚ ½9µa—߈›¾½–¿…̉ôê™»í߈ùơ÷ÁŸ ‹Ç¿Å™ôǼăˆŸ‹ÇưÀù×°đµ‰ăˆŸ;k½Ù½óÇÁ±»ñÓăˆŸ;·§D ”ǃØăˆŸ;ëöơêºĐæ½9¥‡ïÚ÷ÙÑó½Ÿ\±»ăˆŸ;ï³2ÅÔ·Û߈¹ÚགྷvÏÔ›¾²Æ.ÏÔÏÔRùסÁ߈‹ÇµÜÅØăˆŸ½›¾¥ÇëöÀ¼̀¼øô™‰kß [ïS߈±»äÁôô«‡“Íj±ÛÅØëö—»¯ƒßÍ>ƯÓ çÚº₫ÛĂÈ­³»nơê¶Ü‚v ©ÓÔ‹ÇĂÈơÔöơ|󓙇ö±¿ĐÓ›¾ù×ô±»óÇß»ûù×™Óºà¬ỡG½¹ă­ÇáYƒåôĂÙ¶ÜχôÙ×₫Û«‡“Íj½Á±½ñÓ‡ºÏ̉˜ ê è ä ÷å5ÓÚÆ±)óÂÏĹڛۣ䂾¿ß¡Û“ȱ»ÎÔ “Èù×±»·§D ăÁù×Ù‡Ï9…Û«‚ ½9çôñÆÁ½‡xưÀ×±»̉ÅÙ½öÁƒƯï½÷Úöùå°êØ¡ÔăˆŸ±‘ăˆŸ;ÇĂơù×€ö½ƒĂÓÅƠƒÖ÷ơÏű»º—Œ÷‡%±»¹ä̉Á̉Á½ưÀ•ŒĐÄꙉkß [ïS¶¿‰ÜÓ  ÁưÀĂ×Óö½€¥ˆ]1Ù嵨ÏÔÓÅăˆŸ;k›̣Û×èđ¿Åù×ơ±»™‰kß [ïSăˆŸ;kƠÀĂ +û!ø×ÁÛ›¾“Ü©ÓĂƠ¹Áù×ëçÓØºÁ±»Ö‡ +¼7 +«‡“Íj½€ªŒâ»Û«‚ ½9å‰ù×ßÖŒÉù×±ö¡³¬ÅăˆŸ;kÏÅ©ÓÅÔ¡%±»ËÓ•Èû›“Ơ¥Ç¡ÇÙ×ơÔöùô‡Œ•Èû›₫½½Ôơ»¡Ô™ëéåóÂĐÅ 9¥‡¤ˆ\0®GøỞ•†Û«‚ ½9±»ăˆŸ;È̉ +ăˆŸ;²«‡“Íj›¾å¼ ƒvăˆŸÙ½ă»ăˆŸ;·‡‘×8祉ÍL…óÇăß›¾ưÚ©‡¥2ßëM½£×ÓÙÚ‡Ú¡Á̀Ó¡ë•î½ëÛ¦ôƒˆ¬Öéº÷ÚÅØ̣Ç¿‰ÏÔ±ëØÏŃvÿڵ؃v¯ö¥ÓßÄÙáµñÚù×÷Áù×áêĂÙÙƠǼ¼ë Ľß|½ô߈ăˆŸ;¬¾Ôई\0ƒˆ™‰kß [ïS±»™‰kß [ïS«‡“Íj∵ث»«‡“Íjè¼ĂÛ(Ûº…Ơ«Ô¤ˆ\0ăˆŸ;çỠÚÇÖ«‡“ÍjÓØùן}ƒvƒv߈¥Óƒˆ½×´ÑÄëù×ÙŒë*««‡“ÍjưÀëöÅÓ™‰kßù×Á̉³ă»Ûº™Óﺼ멇¥2ßëM£ä¦Ø«Ó§ÔµÀÙÅëÔXÛ«‚ ½9ÍË)éÛ9¥°»Ûº—¶·ä¡Ô±»§À·Ó ¥0‡‡ŒëÑĂ„Ø(ÊÛ€ÓûƠËÔß»ûù××h¸Ú߈ŸÈ±»Å»ëö«»ÔXóÔĂÏŃvơÔ߈ô¯È¯à›ŸÖ¹‹Ç¾±»§ô…»åŒ¿NÛ«‚ ½9߈›¾ă»¥‰ÍL…ù×Ï̉ù׃԰)»y§ô‹È™‡ш¥ÛăˆŸ;çÚ·Å›¾•ÛÓÇÍÓÖĂ÷‡±½ÑÓÅϺóÔ¡Û·ÔơéÛÄÓÛ«‚ ½9­Ô‡¿ÿ¯¶8¤‡«‡“Íj™‰kß [ïSẳ«»ƒÔ£ä…Ôúu½Ă¶‹ëö©ñ©›ëö·‡‘×8ç‰ÆÏÄç±»Ë̉ăê½£Ư™‰kß [ïSÎŽ€ĂÙ§›ÚׇxÛ«‚ ½9¹ÚĂÈ÷Ùº©¼¡ÔÑÄë®Èß»û™‰kß [ïSµØçÎÅÙ½ÊÖÏÔÚª‚ +¼9éơêË̉ăˆŸ;߈ơêºëá‰ÔÚª‚ +¼9áêÖ¹¥ˆ]1g¼€³×½÷ÁĂÙßÁêơ˜‰ j ̃    Z îS ­Ø±»ö©À÷Ú™Ó•ÜÙ½°»ËƯăˆŸ;«»Ù½¿ßưÀ⻵ØÏÔ«»ív•ºăÇíáƠÏÔƯÓ ù×§ÔÿÚÖ$ívæđ×$ñÓµ…Ÿ\±Ïƒˆñ¯È¿(‹ÓºÎ ù×›¾ÛÄÓÀĂ9¥‡ È÷ÚÏÔ¹Ú—¶‡º«º·Ô½«‡“Íj©Çëö“Ơ±»±ƒƯ¾́ù×£XƒvăêùêăˆŸåĂœÂëöË%·Ô¡ÁÏÔø×§Ô±»·‡‘×8çÏÅëÙ£ÇX·Ô™‡ù¿¹ÚçÚóÚÙÚ«‡“ÍjÓº߈ÿ¯¶ëöïƠÅØ߈ơèÅăˆŸưÜû(±»‡º¡ÁăÇí‹ù×Ï̉÷ÔăˆŸ;ƒv÷ÁÇÖ»½¹ÚôÙ½¹Úù×®GøÛˆÅÓæºç̉Ă¼߈“ƠơÔè™ÓñÓÑÓô›¶é¶ÜöÿÚ·ØáƠ™ÁơêщĂ½€ÏÍÄÑĂ½Ăר»ØÇØÙÚËÇ™‰kß [ïSÙ×öä̉ưÀëöùשµ«‡“ÍjÎÚøêăˆŸ;™‰kß [ïS̉ØÿÚ‰¿I¹ Ưßÿڃ֜ӮôơÄ߈ᤃĂÙ½™‰kß [ïSư“‡º¢äÈƠù׋Ǽ›¹«·3uU¡ƯùæÑÓ­Ä£Çsơê´aĂÈơ‡ÑÄëäĂå»íÖ›Û¡”%÷ˆỞ£ä—ˆ›Û«Óé‰ñ5ñ·ÏÓ«‡“Íj¡ÈºƠơ—»™‡µØ‰wÇÖ™‰kß [ïS₫ăˆŸ;kÍË)éÛ9¥ƯÓ £Ươê›ơÔ§¾çô½™‰kß [ïS±½9¥‡Ÿ}߈ĂÙÅÓÁƯ­Ø̀ÓơẴ»ú±»¹Ú‹ÇÇÖÏ̉ëöÏÔͼÇ߈ß¹£‹Ù±»¹Ú‡ÚÅ‚ívĐĂ™‰kß [ïSº“ƠăˆŸ;ù×9¥‡ăˆŸÚÚ ¶©Ó¯ăˆŸ;kéߑֳƠ¹ÚûÓÛ«‚ ½9ù×Ôï³2å廇¿±»¢ÈÛ«‚ ½9ù·èꙉkß [ïS¿‰²¾ ăˆŸÏ̉—¶§Ô©‡¥2ßëMÏŵ|çØ—ÓÏÔ§ôÍÓßÄÙ™‰kß [ïS™‰kß [ïSä­×Ó±½ăº·Øƒˆ»-±»ÑÓ»ô‚ˆûí‡ËÇؽϹ9¥‡×±¿ÁÓ½€ÅÓáºĂÿÛ«Ôă½ô8¤‡Öó±Ôɾ%ߌÛ,ÓºͼÍÓ’ûÓơćŒ«ÔÍÄÓÅơԩܾÅỞ™‰kß [ïS³ÆÅÓ؇Ž߈ÑÓ¾ßÛ«‚ ½9ĂÙÅÓ̀Ê)èÛ8¤Û«‚ ½9±»ăàÑÄë¡Áÿ¼¥‹߈₫®¶çÚ¬¾ù×Á¹ÓŽ¯È¡Ô÷Á‡Û‡ºÀ¹¿Úª‚ +¼9ÍÄáÛ߈¹ÚÙY¡ÔåÁƒvßÄÙ¡Û¿Åâˆëöÿ¯¶ƠÜ©‡¥2ßëMưØ«Ôá̀™‰kß [ïS÷ˆ”%»Ó·‡‘×8ç§¹ëÚ×¾ăˆŸ;k«‡“ÍjµØñ!đ»ÏÔÓØ½€©Ç9¥‡ÅÓ¸¾ù×¥ˆ]1ƒÚÅÔ߈ÿÚ™‹ë‡Ơ¾G޾™‰kß [ïSñÚ߈¼™‰kß [ïSăˆŸ;±Å‘»Ă“Ƚ۫‚ ½9·ÅơꇺÙ׫‡“Íj¶ź‘đ‘ÆÏÅ·Ôơ»ăÓØƠ‰ƠXƒvÏÔăˆŸ÷ÊμóǃˆăˆŸ;‰øí½åŒ¿N½€­ÄµaÙ™‡»¡ù×ăˆŸ;Ở½Á˨اÀ¶ù׫ÔÓ̉ÏÁçÚͼÇè“ÆÁ‡é/×:ëÔ›¾±»öiñÓœ‡Žù×±ÁÇÖG½¹ÍÓͽúÓÏÔ±»ù×ƠÏ—Œ̀ÇÓÆµØ§ÓßÄÙ߈ÁƯ‹È0½€Á̉±»à¬¿‰ÿÓñçù×ùëƒ×ÅÙÖĂơèŃvâˆ;ĂÙ«‡“ÍjÏŹڽĂơħô«‡“Íjå̉ ÓØëïォ‡“Íj•%Á½ëöÏÅ—ñăˆŸÀ×á=«ÔăÁÈÑ·¯Ô߈̀Ó&—»‡Û›¾—ˆ«Óª¶2tTơêËíË̉÷ÁĂÙƒvƒvô±ëØ‹¿àƠƯơáƠƒvº÷ÁáêÉ6™‰kß [ïSùÔ«‡“Íj©‡¥2ßëMëöá ¿ô©Ơ´Ø¡»¤Æôêƒvơ‡ÇÖ§Óù¿Ù½îôñÖ¿³Ç«‡“Íj¼ÿ¯¶‹Ó¹TµÀ³ÈߌÛ,߈«‡“ÍjÖØ§ÍÙ½ưÀºÙŒë*«¡Á¼€ù×ÛÀ°¿ ÓØÁÛ«‚ ½9áº÷Á¥ˆ]1ÙÓ•Ç¥‰ÍL…ÿ§×Ó€Ç ƠĂÙ«Ó›ÚéôƠÅ8¤‡Û×ívщùׯÈåƠ©ØËÖ«‡“Íj¤`ÏÔÓ¾ÿ¯¶ƠĂϹµ†Ô²áºßÖËÉ9™‡¡Ç«ÚQăˆŸ;k¢X½ăˆŸ;ƒ×‘‚×¾‡₫®¶ùêƠ´ƒó%ÙÚ‰Ô±»ăà‡Ă™á§±»™‡ß±»ÑÄë¡È°½ĂÙµØÁƯ‚ˆÇ«‡“Íjơê³ƠơÔÁ̉Ù½™ÔöÙå¼ ĂÙ³¹ơÔƒvăà÷Áå×ñÚÛ«‚ ½9ÍÓô»ɇ½ï«‹Ü«Ô½€½Ơ°»ẩÏÔñÖÿ&™ô±»ơØÇ̉ÅàËƠ½ÏÄÛ«‚ ½9˜êèä¾Åơ»«–¢È[œ‰¾I¹Úưˆù×›‡ƒĂôà=÷¼ÿÚªÔÏÔ8¤‡ÑÓ‡ŒƠöƠ·ÔñÓëö“È—àÿ̃ó—ÓçÎơlưÙù×›¾À¹µØ¿=§Ô÷ˆư“½÷‡±»Á¾³È±»ÛÀ«·3uUÖÆáêŽçÇáê Áưê¡È¬Ö§À¶ÁƯá ëö¾Åˆ†Œÿ¯¶ê$Ùÿ¯¶ÅØĂ™‰kß [ïSè¼ÑÓ¶º¿ØÛ«‚ ½9³Úª‚ +¼9–ØÛ«‚ ½9ư§‡—ºÙ½ù×ïÚ…»™‡¿ô—»Ù½Îŋǿ‰ÛÚщ™‰kß [ïSôêùêưÚ·Û¡ÁÅù×¥ˆ]1ŸÅĂĂÇ«dÍÛYÙÚÏŃˆ±½¤ˆ \ 0 ›¹½­¾™‰kß [ïSÙÚÍÓ˜êèäµÎ¾«‡“ÍjÁƯ¹ÚÏÔüÜå̉ Ơ£ä¹±¿¶  ˜‰j̃ZîS™‰kß [ïSÛ«‚ ½9íëÁ¾́v×¾¸ÚăˆŸ;‹ëơĂÛ«‚ ½9ƠÅÛ×Û«‚ ½9ĂÙ¹Úöï‡̀Óơê™Ô«ÑÛ«‚ ½9꧇º÷Á×¼ơÄív‰ơéêô¡È‡€®ÓÅ¥ÓŸ’íÖÁÓ£äÇ֣طԎ߻û₫®¶½™‰kß [ïSº$ĐØ‹Ç·‡‘×8ç8¤‡Öáƒ÷Ú÷w߈ĂăˆŸ;óǼ›Ú₫̉̃ÄØ9¥‡›¶éĂôƒvÙ×­¾ƯÓ Åơéù×ׯ§Æ¤ôêƒØï½Ÿ†Çëơ±»ÅØ¥ÑÅØ±ØƒˆߌÛ,±»¥á˜‰j̃ZîSׯÁƯ½ỞÑØÆ̉—¾½±»ÓØÀĂ›¾¡Ư÷‡ÏÄùêÇØÛ«‚ ½9ưÀÛ«‚ ½9‡ÛƒàÓºÓÅơŸÖívƱ¿‚·Ôèê¯ƠĂÑÓ“È®×Ă¡Á£Ôư“Ơ·‡‘×8çĂÖ­Ö¬¾¤Æơèű»ógéÓÛÄÓÅØËÖ÷ÁdzÇÅÔĂị́ÇĂĂ™‰kß [ïS÷ÙÓºÛ¾ăờÊ)èÛ8¤ăˆŸ;¡ÈIÛ«‚ ½9ù×ÏŲÈăˆŸ;¥Ç«»߈Ï̉åÁ·Å´†ăÁµ†÷¼­ÖÑĂĂºǺÚª‚ +¼9±»ùׇŒƒv«‡“ÍjÖǼ½àÎ̉¯G‹ø»‹ƒ½Û«‚ ½9«Ó¿ô߈ëö±»ÏÔ“ÆûƠÏÅŸƠÏÔ™Á8¤‡×ÇĂùê¶ÅÏÔ°»öơèÅÏÔß»ûºn±»9¥‡öÙ̉·‡‘×8çƒ9ËÇïÅ™‰kß [ïS߈¥ÁûØ®ô°½ +ÿ¯¶ĂÙÅÅÁ₫Úœ¿'“Ơ­Ö‰¿Iù×ù×Ï̉ăˆŸçm«ÔÁ̉ÏÄËÉ9ÑÓÆù×¹ÚÛ«‚ ½9©-«Ô“Ơ›¹߈̀Ó₫ơÔß»ûµØ‹ÇÅ—áÛ×¹ÚÙ½Ϻ¬Äéº߈«‡“ÍjÛ«‚ ½9ûÓ«‡“Íjæ¡Û… ‰₫̣¼ù׵ؓƠ‹ÜñƩӷÅ×ƠÍƠ»Ø¥Ó™‰kß [ïS™‰kß [ïSƒ½ñÖÀƯÔ¡Ó›¶éÚª‚ +¼9°½ˆ±»½ù×êơ9¥‡߈÷Ùíê™Ó́ÁÚ×Ï̉êö·Å˜‰j̃ZîSÍƠ˜ơçÚ‰ơûº«ÓíÖ±̉›¾ÏÅ‹Ü÷Ư¼€¾¶¹»«Ô¿»Œ₫ØÚ‰¿IưÀÁƯ₫'ÑæÛ«‚ ½9ÿ¯¶ƒv·å̉ ø×gË̉ëÓׯëö¥Æ½Ù½ưÀ¿ßá=É™‰kß [ïS÷ÚăÁĂºív‚½Û"±»¿‰ÏÔ½ÏÔ÷‡ÓØóÇƠ…¾Ăȃˆáê‘Æº—¶ÏÅËØÏÄ“Èùל‰¾I·‡‘×8ç·Ô«Ôơê«Ô­Ä·ÅÍÄÛ«‚ ½9«‡“Íj­ÔÏÅƠíÚ¿|µ³ÈÏÅ€ƠÅ–¹Úƒvëö¯¾¡ÁơÔ˜‰j̃ZîS‰Û°½ï½ÏÔơêéÓœÜïù©‡¥2ßëMá=ăêÿ‡¿‰¿‰́›…Ơ™»§ÓĂÙ%9¥‡ƒÖ–¶ôÅ9¥‡ÏÔÎÅÑÓæÚÏÔ¹Ú«‡“ÍjøơÛÄÓñÚÑØÓÆ©ÓßÁ…Ö¹à‡Œ€(ÍĺyÿÚñíÈÂȩӓƠ¡Ç±»ÿÚ¸Ú߈ËÇÙÅëăˆŸÏÔ°¿ß„°»±»¶×Ù׫ԫӱ»ăˆŸ;k꼿»¹ƯáÛ«‚ ½9ÙƠ¿‰«ÔÛ«‚ ½9ăˆŸ;Ơ±»ƒ߈ËÇó¦ºëö߈ÿÚƠ¾G«·3uUúÖ½€ăÇí´È˜êèäÍƠỞ©‡¥2ßëMÁĂàˆÀ0p½ËÛÍù×÷öívơÔ¡ÇÓ̉ơĂ™‰kß [ïSÿ§Ë̉çÚÑÄë¡ÁƯÓ ·ÅÍǯÈǺ¼¯¼Û«‚ ½9·‡‘×8çؽÑÓ©Ó±»½€ÏÔơêжÏÔăˆŸ;µa·‡‘×8çÇĂăˆŸ;ÑÓơèÅơêôÙÚ¿ØưÀ±»ƒv™Ư¿ßÏÔíÆŸơèÅßÄÙùê—ÓÍö›¶éÛ×ǺưÀÿ§ơÄôÑÄëù×߈ÍË)éÛ9¥ơÔĂÙÙ½ù×ùê·§D ö±¿ö߈Ï̉ßÁ¼Ă±»ÛÏÅÛÙơèÅű»«·3uUá ½©‡¥2ßëMÙ̉ߌÛ,•Œ̣ÇăêŸĂ›¾ưÀÛ«‚ ½9£Ø߈ưÀ±»éÓ›¾±»€í—G·‡‘×8ç–ˆûÖÆǼ·ØŸĂăàźÏÅ¡Ôÿ¯¶ù×߈ÉÖ₫Çâà±»ëöû¼‘Ó½­ÔÙÚôêơĂ“ƠÏÅÑÄëƒvù×·Ô™Á߈¥ˆ]1§Óù×°»÷ÁÏÔùסԽƒvÑÓï»₫ÏÔ‚v™‰kß [ïS̃ˆ›¾ưÀ›Ô«‡“Íj«‡“Íjù×ăˆŸ̉ÁÿÚóÇ̉̉±»¹Ú‡ŒăˆŸ;k¡ÛóÜ‹ÇƯƒףÓÔîű»™‰kß [ïSƒ½¥Û›!ß»û™‰kß [ïS§ÔÙ½“È¿º˜‡é׿Åëö§Øƒˆ¡Èׯ%óÇ×Ă©ÀÊƠ€ºñÓ“ÈÁÚåÁéê¶ûíâljׯ™ÔÅØ9¥‡ÏÅÈÙÇÏÔ“Ơ¡ỔØ½ăˆŸ;·Ôß%Ç+éÓ¹Úù×ăơÿÚÛêÙÚ›ĐÄê›·ÔăÚψ…ÛÖ¼¡Ó½ƠÛÀ¹Ú«%Á×›¾ËÉ9ψ¹Úù×ộÇăˆŸ;ÿÚù×­¿ÀÓ߈ăˆŸ;á=ÛˆÁĂÿ¯¶ÛÄÓ½ăˆŸ߈Ï¿ÍĻث‡“Íj™ÁËƠ«‡“Íjù×çô½Û›ÚĂôơêÆ» ˜ +ê +è +ä +ơèÅ ă¼Ù½ơú¶´ÈăˆŸ;ơ꤈ +\ +0 +¥ˆ]1…½º»µë·Ü9¥‡Ú×µØóëÔ-à ơꛡٽ°»ăˆŸ;kܳăà‹Ü™‰kß [ïS°»“ÈáÛ¹ÚØÚƒw™‰kß [ïSÇ÷Á9¥‡×ÀËơ»¿ô߈áƠ“₫™‰kß [ïSĂâÂÙÛöÇÖ¡ÔÚª‚ +¼9ÅÔ͇ǫ‡“Íj™µăˆŸ;kåÁùêù׃vŸÈ·È̃„ÀçÚÛºâˆ:k«Ôƒù¿ïÚ™‰kß [ïSÏÄ™‰kß [ïSÑ÷Ç%ßÁƒ×³ëĽ£ ›¶é«ÔÈ̉­½¼«·3uUívÙÚëÚƠÛ«‚ ½9Ù-ù×»”™́Ñö‡Ö8æ§Ë%ăˆŸ;›¶é¾°»„ÇñÚ‚ˆáƠá¼é˜ăˆŸëØ9¥‡®È›¹•ÜÁ¼ƒ½åµ‚vùט‰j̃ZîS½¸ÚÏÔë×Ûº­ÖÏÔÂÙ Û«‚ ½9ÏÔ£Ç8¤‡Û«‚ ½9ÑÓ•¾ù×ëöÛÜÓ̉ưÀä̉ĂÙ˜‰j̃ZîS©‡¥2ßëM×Ơ†7§jィ¼óĂ Ç‹ÇĂĂÏ̉À½ׯÙ½ƠÍîĂÁ‡é/×:ß»ûỞÁËӭ‡£ÓăˆŸ;ËÓ냹ÚăˆŸéºùơÛ«‚ ½9ù×ö™‰kß [ïS¡ÁÊƠù×ëöŽ«‡“Íj¶ŸÈ°È#½¿º¦ºù‰º«ăˆŸ;«Ï‘·߈Éơê±»éÓå̉ Ž“º÷Áí‚Ù½ÁƯ󽙉kß [ïS™Û¡Û•Ôщ÷ÓÆ©Ç£»á ưÀͽñÓ«»ÿ¯¶ÑÄëϼÅӳƇÛÊÖ…×ƠÚª‚ +¼99¥‡ºÁ™‰kß [ïS¥Í­RÏÅùׂփv©ÓÎÔăˆŸÏ̉ẦÊ)èÛ8¤ëöш×¾Û«‚ ½9¿ÅëöǺßôϺñÓ8¤‡×ăˆŸơÔÏÔăÁç̉½”î•Çé€̉ÚÓÓùׯӹÁ½‡Œ“Ơ›¾‡Œ÷̃±»ÁƯù׃׹ڻ½±»ª‡’̀jÜÚÄ̉ëÓ«‡“Íj˜‰j̃ZîSív±»רƯëçï½Ù-Û«‚ ½9µØó±»ÏÔĂ«ë›¥ÇĂù׳ÈÛ«‚ ½9ÂÆ áºö™‚‡Œ¹ÚÙ×ăˆŸ;Ü̉ăˆŸ;ÙŒë*«™‰kß [ïSÇôÅ›™‰kß [ïSÏÔ߈ÅÓ÷‡­¶Û«‚ ½9êö½ô¹ÅơêÛ×ù×ù×ÿÚëö¡ÁÛ«‚ ½9±»ñăˆŸư§‡«Ô§ÆăÁ±»¿ºÑÓívơèÅ‚ÖÁ›¾Ñ·™‰kß [ïSÛºÙÓĂèÿ¼€™ØÚª‚ +¼9âà-”ï³2±ëØÏÅÙÚƒÛ×ÏÔ½£.ÏÔ½¥ÓÓ̉¢»T»&ÿ¯¶ÿ§ÙÚ¹ÚưÀÓÆËÉ9™Óß»û½¹Ú¡ÛÚª‚ +¼9€º™º·‡‘×8çỞ…ÂÙ½çÀÛ«‚ ½9ÏÅÎԩر»¢ÇÖĂÙ™ÁÏÅ«»§ôôå̉ ÀĂÎÅăº™Óáꙉkß [ïSÏÔ½½ù×ÿ§ƯƠù¿ăÛ¹ÚÑÄ낾Ü߈í—GÇĂ“¼߈½á Û«‚ ½9ăÇíßÄÙăˆŸĂÙ߈ÏÅÛ«‚ ½9߈ÿ¯¶‡“Ⱦ÷Á߈›Øù×¹ÚơèÅ«‡“Íjå̉ ÏÔ×ö‡x߈¾ÚÏÅØÓÏÅ÷ŸÖѶÍı»ĂÙ›¡•½ă¶ăơïß߈ü‡°ø1çÚÓÆơèů¾¹½‘âëö•Ÿ³¹¡È€ƠÙ̉”ÏÔ·‡‘×8çÛ×Û«‚ ½9¿ÔƠ¼¶8¤‡à=ù×шƯĂÿ¯¶Ë̉ÅÔơèű»ƠßÄÙ¯ÓăˆŸ;©¼ÏÔË̉9¥‡ÍUƠơ‡ÏÅ®Ơ§ΈÁÿ¯¶¾Å·ÔûïăˆŸ;©¼·Ô™ơùêµØ‡¢·ÔÓØÎÔƒvÙÚºßÛưÀëöùơͺƒvÏÔ½߈÷ÁíØưÀË̉ơÔ¼çÚóÇÁĂù¿ƯÓ ÅÔϹÍÓñÚ™‰kß [ïS₫®¶Ÿ’«ºéÓëöÚª‚ +¼9Ở½€º±”»ˆ›vÛ«‚ ½9̃ˆ™‰kß [ïS¿»ËÉ9ƒˆ‰¿I¸ÔâÁ±»ɇë™H߈Û«‚ ½9ªÔ±»Ï×™‰kß [ïS¡»—¾ëöÁ¼ó̉ŽơÔù×ßÖŸ}½©‡¥2ßëMùê‹ÇµÊ¶‡Ö8晉kß [ïSÙ½åêŸÅóÂđG½¹ÏŽ€¹ÚÙƠĂÈ­Äù×߈¯¼ç̉™óÄñÁöÁ₫®¶™‰kß [ïS—¶ó«ßÔÚÇ©¼áƠÑÓưÀƒ÷Á‰ÈưÀù×߈ÏÅăˆŸù¿̀ÓÏÔẨ›¶éÎÛ«‚ ½9‰¿I»»ưÀ›¶é—́›£íáżôÍƠ‡Œù×ÙŒë*«™ó±Ô÷$Û«‚ ½9½èơÆ‹Ó߈ƒvÑÓ¢Ç߈×̉×Ơ†7§jëÓÓº¬Ö†“™ơĂ½÷iƒØ ÇŸÓ×¾“½™ëéå…Öá ÅÔÛ×đÁ‡ÛĂóÂÁ×±»ÿÚßqăˆŸ;œ¿ÏÔÛ×ơèŇºêŽ±ºÙÚƒà­Ä‰¾ƒv߈¾ëöÏ̉©¼—»ĂÓéº̃»úåú¥‰ÍL…»s©‡¥2ßëMùêø×Ï̉Ë¿Ươ9¥‡Ù½©)›¾ÙÚñÚμüĂƒ½µØ¡%ÏÔ÷‡ÜƼÙÅë¾øê›¾ºĂ½€ù×ËÉ9ơÔ›YƠ¾•–ÁỞÑÓ÷¿»ƯÓ Û«‚ ½9©ÇÛ«‚ ½9߈ăˆŸ;óÔµ†ßÚٽﻙ‡ù×÷å5ÓؽµØÇËÇ¡̉Û«‚ ½9ơ郓ȅưϱ»ôºÚª‚ +¼9׿8ç̉÷å5ÓơèÅ߈ñÆ™‰kß [ïSÁĂßỞ«‡“Íj‡Ûôáê߈«ÔщǽÏÔƯÜ‡âˆ­ÖÆ_ù×ăˆŸ;kù×ƠÛ«‚ ½9³îÿ§‡Ç“Ơ«»‡ŒÛ×·ÔăºÎÅ ÛŸóeÍËÉ9¯¼«Ô§Ó«‡“Íj¡ÛÛ…ƠØ ơèÅà ™‰kß [ïS9¥‡ăơ߈º8¤‡Ö÷å5Ó̃ˆƯÓ ™‰kß [ïSçÚù×›¾·‡‘×8瓹ƯNá ¥Øéê‹Çăêß»ûñÓơĂÓÆ߈½Û«‚ ½9—ŒùơÏÔĂٵاԡÛÇÖ¾·Ô¨À¹Ú…Ơá ÿÚƒˆÑÓ°»§ÔÙŒë*«Ûºù×ÇĂ˜‰j̃ZîS½ăˆŸ±ÜưÀÙ½ƒÚÄ‹ÁĂÙùשÏÔù×µØ߈¡È¯¼ăÁÖ‡¼7©Ó׿8å̉ ËûƒÖ÷Úù×ׯ¥ÁÏÔɹ¡Û—Ó«Ú¦Ô™ô¸Ú ¹àôêƒvÓØ¥ÓçÔ¡™‰kß [ïSéÄ¿‰©×¼ÑÓ¿óÇĂÙçÚ½°¿à Û«‚ ½9öñÓ¡ÔÏÅÛ«‚ ½9»ÁÂÙ‡ºù׃9¥‡ÅĂ»ØÏÅ™‡™‡ÏÔ·‡‘×8çÍƠ½Ï̉­ÖçÚ½‡±¡ëö«ÓĂר›¾ăà“Ơ©¼¾Ë ‚¼°»±½­ú·ä߈ív›%¶§D Ï̉Ù½Û«‚ ½9Û«‚ ½9óÙ½ͼÙÅÓÙÚÑÓÓ̃ơÔÇÚƠĂơÔ«»ÁÛÄÓ°¿ăˆŸ;ÇÖëĐƯÓ ÆÏÔ™º÷ÚŸ}¦ÓÏÅÏű»±»¡Á¡Á³Ü¹†ñHëöéºä̉ii³ºóÏÔ—¶ψÜŸÖöˆ—ØÙס۰»ëöÏÔÁñÚ¾ß+÷Á¡J̀Ê)èÛ8¤ÑÓÏ̉Óí«‡“Íj‚à‘Û«»ÅÄ¥Ư™Ô‰ßÁÙ½ÍƠ«»Û«‚ ½9ù×¶ƒÖÛ«‚ ½9à=’Æ&«‡“Íj•%ơêÛ«‚ ½9›»Ù½ÿÚ½ëå̉ ¢Øö»ØÇÖ£ØǼĂôöÛ«‚ ½9˹°»ƠÙ½áÁ±»ñÖƯÓ ±»ÙÚÇÖ«ÔưÀÿסÛõØÁ‡é/×:ĐÓöÁ߈đù×ÓŸ}ù×Ù½ÇÖ±»Û«‚ ½9Ăٯܫ‡“Íj³Â½€±»%½«Úׯùê±å§Ôƒƒˆù¿ưÀù×ĂÙÏÔÁÙËÉ9Ïu߈ÿtĂÙ§ÔĂÙ9¥‡öóÔ‡ÇơÔ‘ÆÛǺŒƠëö§Ô¿½¸Ú±»¡È÷Áư“Ø×Ó̃›¶é±»ù×Ù̉…Úª»±»çꉵơê£ÇÓØ·ÔÑÓٽɋ“Ơ‘±‹ÛŸÅ—¶Óű»çÚ§ƠÙ½§Ó·Ôó›¾̉Å¥ØưÓØŒê*ª»½ùט‰j̃ZîS«‡“ÍjÁ̉ÑÓ°»±ëر»ÿ¯¶÷ÁÏŃֆŒ÷ÚÅÓÄØ̃„ר¹Úï½߈›Á£ä™ëéåăˆŸ;“ÈÛÀÙ½ăàÛ«‚ ½9ÓÅ¥ÛóÇßÚ°»‡xăે“Íj¿Å¨ØÍĂщ…Ö•Èû›¿‰«‡“Íj‹Á…Ô—»ù×±»Ù½ơ\­ˆ°»™‡±½½ʹ­È­Ö…çÚéÚgù×å̉ ©É½ă‹ÉæÅ§Ôö—ó§Ô«·3uUƒv¸®ÅÔßÏ» ¹á‘‹ù×û ƠăÉơ• +å¡Ơ1ƒØăơçƠ߈߈Û«‚ ½9ÏÔÛ«‚ ½9ÿÂëöơđƧÓë‹óÄđ‡̃ˆçô«‡“Íj׿8‘Ơ™‡¿º½«»߈½ôĂÈ߈ÑÄë̉¼ÿÂÙ½·ëù×›¹ƒØÙ¯ÛÄÓƠXëÚ½€º·Ø‚™‡ơăØåĂ¡Ôƒv¡ÈÀÛưº³‡º‡(±»ëö·Ó ¥0ƠºmÙÚÍƠ•½Ơ¿çÓ̉âˆ:9¥‡ù×ÏŽ₫Ǻ߈µØáÛáÛ«‡“ÍjÏÅñÆƠăƠÏ̉Ơ×™‰kß [ïSăˆŸÁƯáØăˆŸï³2»Ø›¶éĺ‹Ó¡ÓÁ‡ûƠ¥Æ¹ÚëöưÀ½ƠÓÑÓƒĂÙ”Èú‡ŒăˆŸ;•á¾ßÏÔ˜‰j̃ZîS™‰kß [ïS³zº‹½•ÇöÍË)éÛ9¥Ç̉♉kß [ïS­ÖµØ©‡¥2ßëM™‰kß [ïSï³2¡ÔÏ̉·Ø¥ÖƒÚ·#•ÇÅăˆŸ;¿ô¡Û«‡“Íj«ÔÎÚăà˜‡ơêêö™‰kß [ïS—ŒŽÅ$¹Ú—¶ÄÓºñÖƒ¾‘ÏÔÛ«‚ ½9 Ëû±»íØ™‡ÏÅ‹ÇÛ«‚ ½9™‰kß [ïS‚v“Æ÷Á߈­Û‚¾«‡“Íj€¾Û«‚ ½9éº߈ăˆŸ;ׯñíȿʼn¾ûµØɹŸ}³Äÿ¯¶ψ™‰kß [ïS™‰kß [ïSÀơñÓ·Ô§ïÁ9¥‡ơêÙñóí·™‰kß [ïSñӣǃvÏĺơÔ«‡“ÍjÙ½©ÇĂĂÜÓ ƒÖ±»û™‰kß [ïS•j̃ZîSÏÔÇÖ-ăơÑæªÚăˆŸÁƯƒˆĂÙßÄÙ‹ÇëöËÉ9¢äöÖÆéÔ©Ó¿ºׯ•ŒåµØ÷Ù¿‰ù×ßƯŸóĂÙ™»ăˆŸ;Öôù×™‡¡È÷‡¹ÁëöŽëöù×ơèÅ™ÓÓ¾ƒÿÚëÔ‰¿I‘ӯȰ»ͺ‹ø«Ô߈Ă£È¹Ú¼À¹“Ơ“Ɯܟ}«dưÀív߈Íœ›¶é•̉ÍÓª»ơÔ¹ÚăˆŸ;˜‰j̃ZîSƒv»…ÔÁ¹ưÀ÷ÙË%ßÁăˆŸùסÁ»½ÙܼÏÔѶ·Ø̃»úëöˆ»ëö€Ơ©‡¥2ßëM½Çôăà¾́•ŒơÔ³Û«‚ ½9¸•©ÀåƠ÷‡±»á ÛÄÓ¶è…ÛÁ̉ÂÙÛ«‚ ½9±»ɇÙ-µØµØ÷Áéڃ׷›ÿ +‰¶ ¿å™‰kß [ïS£äƒÛ«‚ ½9î²2ăˆŸ;Í­HªºßÚÛº°»ÅÓÏÔ÷ˆÏÔÑơèżåÁÍÄ(ÇÖƯµ½½ôĐÓ +ăˆŸ;éÓù×߈Û×™‰kß [ïSëöÄô©¼ÇÖ‚Ö˜ÁơëöË”«‡“ÍjŒĂÁĂ凾ߵØÛ«‚ ½9ăˆŸÛÄÓͼ¯¼9¥‡Ï©ÓØYöÁåǺơê”Ç̀Ê)èÛ8¤×Ơ¼ĂÏÅëö‡xͼå̉ ˜‰j̃ZîS‹Ç©ƠÇÖƯÚÛóñÚ±»øô ÑÓÛÀ±¿Ö¾ßʾÑÓ‹Ü™‰kß [ïSïÚ߈ÿڲȇÇöøëưÀââà·ÔŸĂ߈ôëöÁÓÛ«‚ ½9©£»í–G›ÓÛ«‚ ½9ĂĂ ›­±àéM«‡“Íj°¿ƒˆÓ¾Á¥+‹Ù‡Ç‹Ç™‰kß [ïSĂ­v…Ô÷ÁÁĂ¿‰¾º‹Üơ釺µÄ¶ÅÛÀµØÁăăˆŸ©¡¦ôÍÓ˹Ï|ç̉ưÀ×¾·ôív÷ÁíÆ¡Ô‹Å“Èơº±¿ùệ 9¥‡9¥‡×ï‡ÁSưÀY×¾½ÏÚ₫»ßÄÙëÓÙÚ™ÔëÚ“á¹&ù×ÏÄÍÄûÙg߈ĂÙ×ƠÑØöívă¼ù׃v¥ˆ]1›¶éö߈ÑÓăÂ3µØ¡Û«â±»¿öăà˜‡¥%ăˆŸ;ÈÍË)éÛ9¥á ‘ƽ«‡“Íjá¬Ởƒˆáż€ù曡ÑÄë¡Á¡Ô×Ơå̉ ÙŒë*«âˆ÷Á8¤‡×÷Á/ÏÄÛê·‡‘×8ç¶·Ô˱ƒÖăˆŸ;ÇØéáê¾ÅÏÔöŽô߈ͼÙƠ›¾·‡‘×8ç9¥‡±Ô„ôéê9¥‡ƒˆ×ܳȫÚƯ±ÎÙÓỞÏÅĂÙ±ëØÇÖш¿ºïƠÙ½ÛÔÚ×Û«‚ ½9‡̃§Ô™‰kß [ïS½Ô›v߈ÍƠ™ô₫®¶™Á’ÛÍƠåñƯ£Ø«»ÏÔ÷Á™ôƒvË̉Åàö½€Û«‚ ½9˜‰j̃ZîS±»±»̃ˆ±¿§ÔÍñÚÁÓ“ƠăˆŸ;üÁăˆŸ;ù×ù×YÓïÚßÔË%Û«‚ ½9±»ÑÓ§Ó´†­½¼¿ô¿Øñ"ï¥5Óűٽ®ÈÍÓŽ©¼Ù½Ï|Çô›Ú±»ñÿ¼ăˆŸ;ÿ‡û‡ÇÓ¥Û¿ß™‰kß [ïSÙÚÛ«‚ ½9Û«‚ ½9ÏÅܳÂÍ­Hç®ĂÙÅăֽ™‰kß [ïSù×ĂƠ«‡“Íj‹Ç߈ô ö¹Ú‡ÚÏŹڨǩ,ׯù׋ܛڇÚÅ‚à›¹ù×§Ô¼ëî»ùơ«‡“ÍjăÇíôé +çÚÀĂÙ½¹àÉ̉ĂÙ’Ü—ˆ©¼ƒvù¿©¼éêÛ«‚ ½9Ó ‹›æá ßÏ™»ĂÙ±¿߈öÁưØơêô‚Ô·ÔŒ}‡Ç¡Èơ‡å̉ ¯ÈûÓ“Ç“¹ƯN¹Úª‡’̀j“¹ƯN Ëû—¶¤È̃ÅÍË)éÛ9¥§ÓóƯ¿ÏÔƠ™‡ÿ׿‰߈ÿÂÙéºì«‡“Íj߈ăˆŸ;9¥‡×ƒ¾‘«Ô­ÔÅ‚vçÔô‡½ÑÓ÷Ú™‰kß [ïSÛ«‚ ½9ÜëöÏ¿®¾ÿÇơèʼn©Ơñ̃ë§¹®G +ø +±‡Å¹ÚÛ«‚ ½9¡%ùơù×ÁƯÿÂíÆµ†ÏÔÆåŒ¿Nç̃÷ơæÚ—©Ç¡Ô¤ÁºíJ߈¹ÚŽĂĂ¼ͼă½gÆ̉JÔX¡Û™‡†ŒƯÓ •ƠĂºÿ‡¿¡<¥ÆƒØƒ½Å»‡Úƒ¾‘ù×רµ¸ÓźĂ÷4¾¡Á‰¿I¹Ú›¶é±»…Ơ¾³È£ä߈–Ó +Žº½Ϻ߈ß»ûËÇăà“ÇüÀß½Û«‚ ½9­‡™‰kß [ïS„Ÿ}‡Ü£óăˆŸ;9¥‡ר§ôëÁËÖĂ¼ëö¶“Èáê™Áñíȱ¯ûƠ¹ÚÛ«‚ ½9ÅÄÛ«‚ ½9«·3uUɶÓÆ˜‰j̃ZîS¾ùÚ†Œ£ä±»°»™‰kß [ïS“ƠĂÙ¨¼«·3uUåô‰ÛÓÔÛ«‚ ½9à=—Ûµ†÷ˆƒv‡ŒÙ½£ñùÚ¿‰µa¹Ú›Ă«›ƒv¥Æ̣Ä•½µØ“Ơƒˆơê»̉±»ç$«Ú’½÷ÁÛ«‚ ½9Û«‚ ½9ï»ïxí†ÇÓ…ô³á 9¥‡«‡“Íj¡ÔóÇóºĂÙÿDZ»¥ˆ]1ưÀ½€±»èơù×ÅØ’º́ÚăêàˆÀ0pưÀÏÔ¹Á¯G‹øÓº©Ư9¥‡×ˆơ則́vÁƯ¡Û¥‰ÍL…Ø×™‰kß [ïS÷Áôá «‡“ÍjÏÄ«·3uUÛ×ë¼ăà™‰kß [ïSßÏ­=ñÖÿÚñÆĂÙ߈›¾Û«‚ ½9߈¿øˆ…¾ăˆŸÓ‚£XïÚă»çº²½‹ÇÏÔ“½¿́ăˆŸăˆŸ­Â±»‰¿I߈½¿‰ĂÙÛÄÓÁƯ§¹Ù½±»±»ͼ‡‹¿ÙƠÂÙÏÔửƒvúƯå̉ ß»ûĂôéÚ÷‡ÏÔª»™‰kß [ïS½ỞÍ1߈÷ˆÏÄƠ¿»çÚ¸ÁÁÛ«‚ ½9ØƠÏ̉·‡‘×8烈ËÅùơÛ«‚ ½9‡“±»ù×¹ÚỞºö±»Ăºö™‰kß [ïSôê§ô¹Ú¯ÈÁĂ¹Ú½ô‡º™‡Å»Üïºׯ±»ÏÅôê‹ÛÓˆ¹Ú߈ƒˆª»½ƒ̣‹Çí‡Ù×÷$«‡“ÍjÍƠùëƠ9¥‡«‡“Íj›¶éö™‰kß [ïS‹ÓĂƠÏÅçÚäÁÓ¼°»½€‡x¡Ơ×¾àêĐñ»©¼°»âˆ;k™‰kß [ïS¡ÔóÇ· Ư‰¿ºĂµÜÆÓ‡Ç±½åƠ±»«‡“Íj“ÆăˆŸ;©Óí—G߈Û×ơêÛ«‚ ½9…×9¥‡ÏÔ׿8™“ơ»Ư«‡“Íj±»ÑĂăÁù׫‡“Íj£Ø™Ôù׃ÖÛ«‚ ½9‡‚vŸÈĂÙ¶˜ÈçÚñxñÓ™ëéåôÑĂ¥ÛÓ~ÏÔ«‡“Íj™‰kß [ïS€ºÇÖö—ˆÿÂçù×íê·¡Ở¹Ö¸àÏ̉¡»n“ƠËÇÿ¯¶ØÅÁêÁï»ËÇĂ¹Á™‰kß [ïS·Ô“ÖØ±ß›¶é±»˜Á½ƒË¿éÓÓ¾áÅës‡º™‰kß [ïS‡x¹߈9¥‡Û«‚ ½9ÑÄëÛºëö…ŒŸ»©‡¥2ßëM±¿ÁåÛ«‚ ½9½ǺăˆŸ¹ÚψăˆŸ;›¾×Ơµ†ËƠíơ—¾¯×ù¿•Û»yçôĐÄễơí—GƯº«Ôƒ½¼€çÔ¡©‡¥2ßëMÍË)éÛ9¥Ûº¾ºâˆ:ÚƠăê÷ơÍƠĂÙƯܽ×YăˆŸ;…ÚÍƠÏŧ«»µØ£Ưëöß»û߈½ÔĂÙÁëöĂºơº‚ØÛ«‚ ½9ưÀ±»ÏÄؽơêñÓÅ»ÚÆïÁ¢äÙ½»Ü¨ ¿Ù騙‰kß [ïSù׿‰¿‰›¾Ú×ÁöׯÓÑÄëÙ½ÓºßÁËǽ½¿ô«‡“Íj¢Ç½ăˆŸ;ÙÚ߈ùơµØƒvíêơÔëöª‡’̀j¯È¶ ·#Ú×ÏÔÅÓYăˆŸ§âÛ«‚ ½9ÿÚ·Ô߈§¹˜Ăø×ëöÏÔëö¾ß ™‰kß [ïS‡ĂÍnj۫‚ ½9½ÔưÀ¹ÚÏÄ™‰kß [ïS½Ă™‰kß [ïS÷Áïí«Ô«‡“Íj±»ø×ÏÔ ƠĂ›‡Ă˱»©ÂßôăÅØù‡¶×±»Ûư‡±ù1Ưºå̀õa×ÜÏÔŽ¡Ô÷Ûƒv‡Œáœƒv›v£ØûØͼăˆŸ•½ºy ÚÆ«‡“Íj½ù×­Ô™‰kß [ïS߈ăˆŸ;k±»ëọ̈ªÚRÛ«‚ ½9ăˆŸ;…Û×¾ơÔ߈ÿ£ǸڃvÍÄö9¥‡·ï°»ùן÷ÿÚ“÷Á«‡“ÍjÛ«‚ ½9ËÛ¤ÆçºÛ×̀ÓăˆŸ¯ ±¿±»߈üĂÇ·ëÔÎÅÏ̉ƒß»û߈©‡¥2ßëṂÔ‡Çáêƒv«ÔëöÛ«‚ ½9̣Ăẳ•îÙ×ׯíÏÏÅĽ ïƠÏÔ½€Úª‚ +¼9©º÷‡¿ô÷„Ù½³È†ŒÏÄö©Ø—¶ÏÔĂÈăVó߈ºº Ö†‡ü2Áù×½…¼—»¼ÿj¬¶8¤‡Ö麫Ô߈†Ç«‡“Íj´àĂ §ôçÆß»ûù¿¿Ø™‰kß [ïSËáÛ«‚ ½9ÏÔ™‰kß [ïS™‰kß [ïS‰”ăÁ™‰kß [ïS×¾ÏÄ›¹«‡“Íj½€ÿ¯¶ÇÓßÄÙ«·3uUϺưÀßÚù×ĂÙ«‡“ÍjĂÈщ¥Ù߈™‰kß [ïSÏÔϺæÚ§à¡¼±»©Úù×߈ÉŸ—́Ù½½Û«‚ ½9ÙÚ±»±»™‡½ù×Û«‚ ½9µØĂô©Ç·§D ™‡±»ï»Ïű»ªÚYùê“ƠëÑ«»ŸÖ±Ô§Óƒvº¹Ú“Ơ×Ơ£Ư¯G‹øÅÔĂÿÚ½€«‡“ÍjÁÇ߈éÓƒv±»ù×ăˆŸΈăˆŸ;k›¡ƒ×µØăˆŸÛ«‚ ½9¯×ÛºÁ̉ÄÔ™‰kß [ïSđ»Wư’¡ÔÎÔ÷ÚưĂƠÅôçÚóÇñÓÁăăˆŸ;‡Úá­ƒÖĂ8¤‡ÖëöÅ¥Ä½ăˆŸ™ëéåÙÚÿöж ºÅÏ”ùôé¼±ăĐÅù×»̉±»›¾üÀ¡Ơ÷ÁăˆŸưÀ‡ñ5½ÏÔƒv퇹ÚÁ¹߈ÀĂÙ½ĂÙ©Ó‡ñ58¤‡Ç̉»Ø—¶•ÜÁÛ˜‰j̃ZîS߈ÑӇÙ‰kß [ïS±»ĂÈ»ØÛ«‚ ½9ÁÛ«‚ ½9«‡“ÍjÁ¾ăˆŸ;ÏÅŽăˆŸ;k†“ ‡ËÖ…ØÙÚ™‰kß [ïS±»©À9¥‡ưÀ¼ô9¥‡×Ư»»½±»ơêöù×ÍË)éÛ9¥ÀƯÙÜ´È–ÍÄ8¤‡Í¶qĂÈÇØÛº™‰kß [ïSĂăˆŸ;k¬ôG½¹£Ç³ÈÏÔµ!ÇÖ·ïƠ¾G߈Ñű»ÑÓ“È™‰kß [ïS›ÚÓØ›¹ׯ¶»ˆÆ™ÈÙÏÅÑÅ‘ÖÇÖ˹¼₫®¶ÿ Û«‚ ½9Úº±»¿‰–¶߈ăˆŸ;k‹ÇóÂñÚÛÚøê ÍĂ˜‡“ØϺëöù×§‡ÁÛ÷ÔĂ׿8 Ëûăº¾Ở½Ăå̉ ‡Ú9¥‡ÔÏÅù×Ù̉÷ԟű»̉ˆ”=˹ửåÁơêÙÙ×É`ĂÙëöŸÖÆÛ«‚ ½9ø×™‡ÑÓ‹Ç„߈ëö‘áÙ½ÙÜëö–Ó±ëØ½½»çôŸÅû›¾̉ÆÏæÿ™Ïʼn¿IñÓÅÔ8¤‡–©©¦©̀»©©¥ˆ]1‡ŒăˆŸ;öÁ©‡¥2ßëM…ä£Ç«Ô¶ÓăˆŸƒ¿»̣Ä»ØÅ»™Ó´È™‰kß [ïS­Äñ±»ƒv«‡“Íj÷ÁÏÅÅÜ“Ơ±»߈ăˆŸ;¶‡Ö8æ¼Øö½Á¹´Ø›¹¥Û¹Úµ±½߈ư‡±ù1μ’ȡ۱»Ù½ÿ¯¶±¿ëÚ‰“°ŸÈÇÖßÁ·Ô¹à¼Ø·‡‘×8ç¹Ú̃Öƒv®Ợ"»Ơ¾Géºå̉ ÍÓ·¦D ëöĂÙŸ³z¯Û«·3uUÙ½ÜuàĂ½ÿ¯¶¹Ú¡Ư©Ç±»Ú‡Œửÿ¯¶³Âơl߈ÇỌ́ê³Ç“ƠêöÆùåïƠ™‰kß [ïS³ƒøÛ×8 ¤‡ ôø¾Ơű¿ưÀß»ûÛÀù×̃½¦Ø÷Á¹Ú‡ÚÛ·§D ẳ·º©"ù×Ö¹Ú›vù¿8¤‡×µÜ÷Áơêùê麋ǽ€ÙÛÓÆÎÅÙÅëûƠăàÛ«‚ ½9̉ÅÏÅ½Ă¿‰›¾ºưÁ±ëØ«â­Ø̉ÅçÚù¿ÅàÅĉ¿IÙ½£ä߈±»‰ơ½ø—¶߈«‡“Íj³çÆô½€Û×öù×ÙÚÅÓÎÔƒˆ°”Ó̉Ó¡Ûï½ûÖÛ«‚ ½9©)ÓÅùסȫ‡“Íjù×9¥‡éºÛ«‚ ½9öëöăˆŸ;ËÉ9±»÷ÁÏÔăˆŸ·̣·‹Ăđ¶³é™‡Ë…b˜‰j̃ZîSëÓ߈Ï!í¹Ú›ÛñÓ¯¾ÎÅÓÅ«‡“Íj¿̣ÛÄÓº©ÓÅØÚÀ¿ºɇăˆŸ;k̃„Û«‚ ½9Ïăv«‡“ÍjăˆŸ;k…ÛƒÚÛÆíÆ‹ÇƒvöÛ8 ¤‡ ‡ŒăÁ™‰kß [ïSÁÉ̉èÜÏÔÁĂ¡Á߈Á‡é/×:Û«‚ ½9ÅÓ߈«‡“ÍjÏ̉ÏÔ·̃³È÷Á›ă}½Ǽ±»€öơê›¶éÑ ±»”±»¾ÚçmÛ«‚ ½9Ù×µ†÷ÏÏÔ9¥‡˜Áå̉ ߈©¼¼‹(È0(‹Ùơ¢ÇÏ̉°¿•‹H«»›¾÷‡ÛÄÓ‚v™‡À̉¹ÚÛ«‚ ½9ÏÔ¹ÂăˆŸăÛÀÅăˆŸ½ñÆÛ«‚ ½9ĂÙêÔŒ½Û×ÏÔ±»Û×ÅÓØ̉Û«‚ ½9’ÛºƯ_¡ÁơƒÔéêö“ȣǡƠûÛÔ­ÖÙ½́v߈¿ÈÙÜ·‡‘×8ç¹à±»Á¼±»³ÈªiƒÖ›çÛ«‚ ½9¿»ß»ûÿÛ«‡“Íj£XÇØ«‡“Íj™‰kß [ïS¡È߈£ØÂÙ‰¿Ív̀Ó₫ ¹Û«‚ ½9‘°Á&™‰kß [ïS¶ÅÓëöÏÅÓÓ‚½ơĂù×Á̃±»€ÓÍË)éÛ9¥¸ÚïôÏÔŸÈöơ»Ï̉ÏÔưÀ½“ƠăˆŸ;Û«‚ ½9ɇÏÅÉPÅØ±»³Â•Œ«‡“Íj½ă™Ü¹ÚÁƯ«ÔÁ|ăˆŸ;²Ăè±»ƒØÏÅóĂ߈̉Æô««‡“Íjù‹³(׿8±»ûêÁí9¥‡Ù½ƒˆÑÓÁĂÏÔûÙ½“¹ƯNº½Ïţ䵨½ÔƯ‰ÏÔŸ0ĂÙÙÚ¯‰¯0‹Ü™‰kß [ïSÜơ­ÈívÛ«‚ ½9ÖÚ£“é꽫ԷÔÛ«‚ ½9›¶éƒvÏʼn¿I߈ù׫‡“ÍjơÔÅØ«ÔŸ}™‰kß [ïS©Óæ̉ù×™ëéå釘‰j̃ZîSëöÏÔƯº·‹×¾çô9¥‡áׅͳºó—»Ø̉ŸÅÙ×£ØÂÓ‰¿I‡xÏÅ­Ø߈¥àÔăˆŸ;ûÙÁ*ŋǙ‡ù‰»̉»n½ß»ûăˆŸöä5̉óÍÇ¡‹Ü“›¾£÷©Ó÷Á–»¡ÛÏÔµØÛ«‚ ½9¥Øùש‡¥2ßëMĂƠñÚ¡Ư¡ÁμăˆŸÙÂÿÚ›Ô9¥‡щ‡Ûív¼Y™‡ÅÔ”ÖÇߡԾF¾߈÷ˆ«Ôơêƒv±»«»́ºIƒvÏÔûƠáê±»«Ô¥Û¯Ô©¼ÅÔ™ëéåÇ̉ëö˜ÁÆçÚÓƯÓ ßÍ9¥‡×±¿Ù×ÏÔÛ«‚ ½9߈Ñ£ăàÅÓüêÏÅ°êØ‡ºÛ«‚ ½9«‡“Íj›¶é›Y¶¦D ߈È̉ÏÔ·Ô‘«‡“Íj…£½¼ß„áê½™‰kß [ïS½ăƯ€öăˆŸ;ĐØÍË)éÛ9¥Ö¼ÛÍÓï»·ÔăˆŸ;ÙÜØ×¿àÁ™‰kß [ïSĂÙ‹Èù×·ôêöƯÁ ÑĂá̀ºÁÛ›Çë›Ư¨äôר‹Ó8¤‡¹ÚËdzºóÙÓûăˆŸ;߈ăˆŸ;§Ôùꇌ¾ßæZ¹Á»(½ÔƒÀ±»»ØëÓÏÅ¥ÁßÖ¡ÛÅØ—¼ÇÖÙÚ›¾›¶é“È›¶é‡€™‰kß [ïS«‡“ÍjÛ×ÓØź¹ÚÂÙíêÙÜöˆÿÚù×ß»ûù×Ó©Àơ‡ăˆŸ;k‡ºĂô¿‚ ·‡‘×8ç߈ø×ÑÓ„¡Ó™ôµêåôܱ¿8¤‡…ƠăˆŸăˆŸ;k·Ôƒv߈±¿߈í—GÏ̉Áƒù׿»Ϻ¨Ợ¶÷Á…ö°»³È߈߈߈½€Û«‚ ½9Óù×Úª‚ +¼9Ơ´ù×Û«‚ ½9‘»Ûϵت‡’̀jÏÔÛ«‚ ½9÷Á×¾±¿©Ó™ÁÙÏÔñÆÙ×ăˆŸ;ëØ¹ÚƯß“½óÇÆôÓºöûƠẦûЙ‰kß [ïSÛ«‚ ½9Ÿ}ÙÜÓ ‹›æưÀ÷Ô©Óè‰5đ555đ5¶5øêƒv³Æ¡%ÂÈơÄרÑÄë“Ơ«‡“ÍjĂº¾¿ÄɃ׿‰©ÀË%Ưºƒvƒˆ™ëéå©Ó—¶¬ØÓ´ăàëöưÀÛ«‚ ½9ʾ›ÆỞß»ûôꛆӻÅÍË)éÛ9¥щ߈™Ó߈±»ăà“Æ½±ºÛdzÑÓßÁ™‰kß [ïSµÄ)ùêÙ½©’ßëöóèÚă°Á •%ñÖ¼€±»‰ÔĂâ߈·÷¼ÍÄ«ÔǼÅ–ßÚ±Ư÷‡“Ơ߈…™‰kß [ïSăˆŸ;ơèŇŒÿ¯¶—¾ÍÄS̃ˆ±»½ôÑØ‡ƯÏÔ™‰kß [ïS߈ù׸Á±»ëöƒ¾‘ù몌Ńv›¾¡ÔÅØóǃvơÔ›¾ơê߈›¹̃ˆÏű»ƠÓơê›¶é“ÈăˆŸ;á=³ÂœƳà“÷ÚơêψÛ«‚ ½9·ÔŸ\ƒvßÄÙÇ̉ù×›¡ï»¤ˆ\0£Ø½¿‰÷‡§Æ‡­vß»ûÍĂ¿ô—¿«ÔÙÚƒ×ĐÄêÛ«‚ ½9£ô¹Ú·‡‘×8ç·Ô±»Ơ¾GöÔ9¥‡×ÏÔ™‡ăˆŸ߈ÅØçôíÚ«ÑñÚÓÅ·Å¡Á¼½ĐÄêùæÈƯ⛾ÁƯ¥º±ëØÛ«‚ ½9½ƒv¹Ú£Ó·Ô›¾ăˆŸ;çÚÏÄéÓå̉ Å»ÅôăÔ—»·̣̀Ó§ôÚª‚ +¼9µØỞ÷Ú™Ø߈‘›¶é™ÁƒÚ½¾ƒÖñÓ߈₫®¶‹Û‡¿Á½ÏÔ¿ÔÅØ̉Á¹ÚûÙ±»ăÓÙ½߈ĐÓ«ÔÑÁƯÅØ¾ßÚ±Á“Ơ™Ă½ÔƠëö9¥‡™‰kß [ïSßÁÏÔ‡Œ‘«§ÓǼµØ±»ÁĂñÓ´ÈÛ×™‰kß [ïS·ÔưÀщ8¤‡Ö ߈廨½«·3uU‡°»ÏĤ⳺óĂ×Ơ¦Æ—¶ơÔ™Áè¼ó#á=́(ûœ©Ø‡xÔX½ëù×ׯ«‡“Íj«Ô™‰kß [ïS£Ø¶‡  Ö8 æ ëö³ÆÁ½™‰kß [ïSµa­¾µ†ËÉ9Å–ôưÀ¥‰ÍL…¿Ñøƒv…Ơ‡âˆÁ¼ưÀÚÀ±»‹ÇƯÓ ¿‰ÏÔ½ˆÁÙ½ë¡Ơú 6Ăô­Ä˜‰j̃ZîSơêăˆŸ•‹Hû(¡ÔĂÙÉí³Âóļ”ÇïƠ½¼ĂÈ̃ˆ±»¬¿ù×ϼ‡ù‡̉º­—”Œ ßÚï½Í´·Å‡ËÓ…ÚóÇ‘˜«ÑưÀơĂ¯ß¿ôû(ÏÄ»œÜ›¾›¾É̉ăˆŸ;ÏÔÛ«‚ ½9¯ĐƠÅÓ¨‡¤2€̃êLé‡ñ5Ó̉߈‡ºßÚ½‡©ÓŽ™ÁëƠUÅØÓ̉߈¥º¹ÚËÍÓ·ô·‡‘×8ç£äáꛡ™‡ÏÔ½ÔñÓÙ½ÊÓ ëöÿÚ̃“±ëØ’º“ÛơÔăˆŸ;ÄÓ߈ƯÓ æù×ÿ¯¶»ôñ»¯ÈơêÇÖêö¹Ú…»´È9¥‡½»Ø±»¤Æƒ½¾ÔÿÚ 9¥‡×ËÈ9©ÓçíÍË)éÛ9¥™‰kß [ïS£ÈÅÁ¹ÚÏ̉°»ÏÔÑÓÇÖö‡ó|Ù½±Á±ƯơƯÏÔ‹ÇŽ±ëؽ¡%똫‡“Íj§Ô%Ù½ˆÙÚÁ̉嵆ăÁ³¹íơ9¥‡«·3uUơê£ º÷Ú½߈ÏÔđ¡Á¡ÛƯ‡ÖƸó½Û«‚ ½9ăˆŸ;ù¿ÇÖ”½ß˵ر»«d¡Ô·Æ«‡“ÍjÓ̉ù×™‰kß [ïSƯÓ ›¾ÈĂ4©ÜĂƠ‚vø×Ÿ ±»±½щÑÓ߈ƒˆĂ£Ø¶º¿Å£ ºâÄ1øêÅàÏÄăˆŸ;Y¼ăˆŸÈ̉:©Æ‰Ô¾µê«‡“Íj́v¨¼±»«Ô±»™…Öù×ëöëöù×шÏÅŒö·ÔăˆŸ£ä÷ˆăˆŸ;‚ØÁ¹ưÀéÓÏ̉¾ưÀƼ°»™‰kß [ïSÛ߈³×“ÛÙ½ÑÓÑù×–¶Ù½Úª‚ +¼9ªÚ%ÁƯÏԣت ¨ƒº5ßÚƒơ“Èù(©‡¥2ßëMûÙưÀ©‡¥2ßëM±»öÛ«‚ ½95¹ó¢ä‚ÙƒÚù×›¶é˱ƼáÔÏ̉¾ßÑÅÜ®È̃ÄØ£ÇÍÓæºÏÅó¶ÑØŸÀ¹¹ÚĂÙÁĂ£»Ö´aó°¿ƯÔÙÓå̉ ¸Úͺ²È‰¿I­€å̉ ³ôăˆŸ;Ú×ï&½ëÎÚ˜‰j̃ZîS£ÓÍÓ¨Øçڳȷ‡‘×8çóÔÖÆ¾ºßÚ‹„ăˆŸà=¡±»‘«́$щ¡Ô÷Á«·3uU±»÷Ñăà₫¼ư§‡Ÿ}™'Æ¡Á™‡…‡«‡“ÍjáêóÂ߈¶Ü߈ÅàưÜö¶*Û×ÙÚŸ}‡º™ÔÏ̉ïÁø¾ÛÄÓÍË)éÛ9¥ÂƒØ‡ŒÓÅ­Ä“B›·Ô¿‰¹n¹Ú8¤‡×Ï̉‰à—¶̃ˆçăˆŸÛ«‚ ½9߈º°»…ôô¿‰¿ÏÅÅÓñ!ÅÔ¶Ü™‰kß [ïSÛ«‚ ½9ƒ¾‘ÙÚăÇíÈĂÙ×›¾ëö¸ÚµØù׳ù¿Ù̉Çô±»ÍÄÛ™‰kß [ïSÏÄÏ̉ƯÓ “Ơ“ÆÛ×߈°»ă½ ‹Û«‡“ÍjÑÓÙ½ßÚăˆŸ;±»½ÛÇ›¡ƠÎå9¥‡¡Èà=±»çÇÿÚßÁ·‡‘×8çé›ÑÄë¿ß«·3uUÛ«‚ ½9µÅ™‰kß [ïS™‰kß [ïS×Üç̉™‰kß [ïS¹Ú߈×¼éÓù¿ơêùêÆôăà­ÂŸóe‡äÛ«‚ ½9ÏÅëöửăˆŸ;߈ßÖÛ«‚ ½9™‡«»ÓºƠÍÓÏÄÎ˹ưÀ‹ÇơêÙYçôœˆ°»¡Á¶Ó¹ßƯׇtÓ~!ơêăˆŸ«‡“ÍjÙ½ăơù×µØÜÂÙ½ăˆŸ;¼í߈߈̣Ô¨¼ưÀß»û±‡¥ÇµØăˆŸ;©ˆÿ×›¾Ó̉ù׃¥ˆ]1ùêѱ“ƠöÏÔщ™ŒöÎÄÍÄ̃ÇÖÙÅë‚v©Ü“¹ƯNÙÚ¿çÛ«‚ ½9߈á ߈¡ƯµÆ÷ˆ·‡‘×8盾©ØÛ«‚ ½9«Ô©‡¥2ßëMÅØ‡…ö±¿ÿÚë×ùå¹ÚçÚ¹Ú¨ºÏÔË̉ËÉ9©щ×̉—¶½ƒˆâˆĂÙÏŇºơÔ½™‰kß [ïS½Ă©ÇĂ¡±¿шÍƠÙÚù×ñÖ̉*Ÿ\½êרÚר½ơºưØơĂ£ÔăˆŸ;ÛêăˆŸ;Úª‚ +¼9ÏÅá Á|½½ơéÏ̉߈«Ó³‹ÓÑ»˜ÔÇ"ßÔï½ù×ăàÏÔû̉ưÀîôÉ̉öµØ«ŒëÍÍÓ™‰kß [ïS½™‰kß [ïSÛÛ¡ưo«¥-;M›¡+…Ÿ)Ùµ³ eᥠ‘埇â÷Á¥‰ÍL…ÁĂ%ĐÓ߈±ëØ›ÚƠëö÷ÁơÔÇØơĂôệĂëöÆØÿ¯¶ë髇“Íj…ÔªÔôñÚ½µØ»ˆ°»óÔ°»¥ØÂٻ؛¡ÿÚăˆŸ;ù× +¡ÔÛ«‚ ½9Û«‚ ½9ׯɳƯ«‡“Íj÷Áµ†Û«‚ ½9ÁñĂÙéÓÛ«‚ ½9߈ÉơÔÿ¯¶ÅÓ ÿڵث‡“ÍjóÇçÚ±½¹Ú™Óù×÷‡§‹­Ô߈µØ­̀«‡“Íj¿‰ÏÔ“Ù»›¾±¿¡Ù½%«·3uUˆí@íÚ‰¿IáƠ™‰kß [ïSÛ«‚ ½9›¾¤ÈñÆÛº·Ø¯¾ñÿ¯¶ù뙉kß [ïS¡Û½ÅÓåĂá éÚ«»›¾«‡“Íjëö½¯½ĂíÖĂ¥Ø£Ôá ¡«ưÀ÷Ú§ÔáêµØíêÑ«¡Á¿‰Û¯°ñ߈ù×¶èï³2߈ăêÛ«‚ ½9±»åƠ¥ƒ­ÔÖÆß»ûọ́âˆ;k¾ºàØ›ƠñÆĂÛÅ©ÓרËÉ9¿:Ù½ׯ™‡đÁ"˜‰j̃ZîSñÁÅÓÍÛưÀ¢Ç—ˆóÇÁ̉¯È›¾™ëéå­Ä½ÎÅË¿½ăˆŸ;ÅØרëö½€߈„ö‹™ëéå—ăˆŸÏÅÂÉåÁ£₫ó½¥Û÷Á–¶ƒÖơêÛ“Ơëö˜‰j̃ZîS‡è£Ư™‰kß [ïSùê÷‡¹ƒÖ˹«‡“Íj®ƠÛ«‚ ½9©‡¥2ßëMÛºÛ«‚ ½9÷$Ăº¥ÆÛdzÂă»ÏÔ·Øï³2¿‰ăơ·ÅÙÚÅ–À½¥Áƒvù×Ó̉ËÖÍÓíÖÁßÚ¶¾ŒÛ«‚ ½9È®ôóÂ8¤‡ơð»“ÈôƒÖÍå¹Úí‡ר˜Á‹Ü²§Ø«‡“Íjă¬¿«Ôñ‡å¼ Áçm÷‡ÑÅ™‰kß [ïSÛ«‚ ½9₫ڑহǺ±»¶Èׯë×Û×ÉöÁ£ä›ÛÅØĂô“ÈÁƯŸ}؇Î9„¿́†“¼Ă©‡¥2ßëMŽ¼Û™“ºÛ×ÎÔ‡¿ÍéÙ-ÏŇñ5˜êè䙉kß [ïSô™ơÙÚƠîÁ¹Ú9¥‡ôêßÄÙÙ½­½¼ÑÓÿ&̀Ê)èÛ8¤ØŒê*ªăê“¡ùסÈÁ¼ÅÔ§¹ơ–¹ÚÚÀ́ÅăˆŸ;Ù½©%߈ưÀ«Úéê×Ă麫‡“ÍjµØ«Ôư“Ñ̃EĂ¼ÏÅ߈ëöß»ûơ䋟sá¾ÅØ™‰kß [ïS…±½±»«‡“Íj“º߈½Ư½ÙÚ±¿°»ŽáêØYÓº¡È·‡‘×8çŒø©‡¥2ßëMóÇçmÅĂÙÛˆ¯ƠÇÙÚÛ×±»ÑÓÛ̃ˆ½ÏÅ«‡“Íj™‰kß [ïSÔơ‹ô¥ˆ]1̉Å߈ßÄÙ«»̃ÄØçÚ ÔÏÔ‡ƠÅà½ô»Ùщù×ăˆŸ;íÜͺù×±»ăˆŸ;߈Îĉ… ƒØÍU“ºÚª‚ +¼9ưÀÓ¡¼¶º߈ƒÁƯéӿꙇỞ·‡‘×8çß„Ổ áÏÅăˆŸù×·ÜơèÅóÇ‚vĂ ÁÓ©¾±»½€ó“ÛסÈÙÚ÷ÁÏÔƒ½åº¹Ú¾ºé‰ñ5ñ·¬¾åÁ™Ó±»á ÓÅ™‰kß [ïSÙŒë*«ÏÔ߈ÎÅăˆŸ½‡ÇƒvƠñ›ÏÔßÄÙáê‡Ú߈߈©‡¥2ßëM›¾µØáêÛ«‚ ½9‡ºÖ ±”±»Û«‚ ½9—¶9¥‡ưÀĂº½Â›·ÔăˆŸ­vÛ«‚ ½9́‡Ô]ÙÚéºááÜÓ £»ÈăĂĂ ›­±àéM·ÔŸå³ÂưÀ±»™‰kß [ïS‰ƠêÓ ßÄÙ×ÓƒÛ±»«ëÑÄëÇ«Ôå×ÁăˆŸ;Ï̉«‡“ÍjÏÔ´Û«‚ ½9ñÖ·Å›¾ƒ½‘áéÚ˜êèä₫ ®¶ ÏææÇµØáễŒÚ, Ëû½—¾ÿ¯¶›¶é§ôëöÏÔÑÄë«ÔÜ §ÔƠŸç«‡“ÍjỔªÚƒv×¾ơêăơ·Ô½ăơÜÂÈơÔ÷ÁÿÚăˆŸ;ͼŸÅù×̃„ï%ï»ÏÔƠóÇăˆŸ;ƸÚÅẫˆÂÛ ÛÛ¬Û°àÛÛèMÛ£ÇËÚßÚÏÔ¢X éÓ¼³ÈĂϳºóéJé‰Ó5“gesÁÅăˆŸ;¥‰ÍL…¢ÇăˆŸ;ëöÏÔÛ«‚ ½9ǼÙ׃Ÿ£‰¿IñÖ©Ú­Öû(‹È¿́¡ÔƠψ»Á˜‡«»ív­ÔëØ‹Ó«‡“Íj‹ÇË̉9¥‡×¿́ÑĂ½€Ç%öƒÖ«Ñ«Ô¡óÔ¹Ú«‡“ÍjÿÚỞăˆŸÁ¼½€ívà8¤‡×ÍÄĂÈ•Çÿ¯¶Ă߈€ƠÙ½ ̣ö™‡ÛÀ¿Å—ÛËuĐʼn¿IŸƯ¡ÔăƠ9¥‡×†º“Ơ£äÏ̉ù×Á ‹Ç±À£Ô±»£Ç¡ƠÁ¾©‡¥2ßëMửׯ­Ø‰¿I©ƠÛ«‚ ½9ù¾Ù½¥È±»™‰kß [ïSöÛ×ù×–»ÜÓ ©‡¥2ßëMËÉ9±ëØ›¾£Ø­vÀ‡€è/Ö:ÙÅëÓÆñÖÚª‚ +¼9Û«‚ ½9¡ơÔñÄÙ½û\‰¿IÑĂ߈ш«‡“ÍjăˆŸ¨¼‰Æ±»“Ƈ£+¶ó“ø×çÚŒºÏÅ¿½Ž߈ơềĂăˆŸá꛾Œ¾—ÖÍẠ̈¶߈³߈∾©Çôꩱ»Ù½߈¶±»¾¯ƒßͯ¥'=U#QK¯Â«‡“Íjͧ¯×Ơó#Ẓ̌¶ÇÛăÇíù×ăˆŸ;§ô©°ï³2™‰kß [ïSëöù×Ù½ơº³ ·Øù×é‰ñ5ñ·Û«‚ ½9щ·‡‘×8çƯơ½ÔĂÙ›¾ƯÏÅÔ™‰kß [ïSĂÙ9¥‡ùê­ÄÏÔåô‡÷Ùÿ¯¶È"ÁĂ²Ø£ØĂĂ ›­±àéM±»÷Ô‹ÄĂÙ«‡“ÍjÅØ̀Ê)èÛ8¤Û¹ưÀ߈ænÅô½€™‰kß [ïS™Á£Ơ÷Áå»ơÔ±»ƒˆéí¾߈˜‡Û«‚ ½9ËÉ9ņÏÔµ©ÇÛ«‚ ½9çm™‰kß [ïSÁƯ¬Ö"½ÏÔßÚ­Äù×öẳ“Æ£Øù×̉ƃÚç”Û«‚ ½9«‡“Íjƒˆ¥ÆßÅ·ºÙ½©Ç¦ôÑÄëÑÓ¿́Á½¹Ú“Èơúƒ½ͽơêăˆŸ;¡ÁÉ)ù櫇“Íj«‡“Íj°»ƠX¶Û«‚ ½9¯‰¯0¡Ô¯ÙÚ™Ûå̉ ăˆŸăÁ­ơÙ½½‹ÙgéÚ/ëöùô°»Ù½Ñصàăà‘đßÁ߈™‰kß [ïSƒ½Ù»ù×ơ‡jăˆŸ;kª»r†ÈÏÔ÷ˆ߈¯×ÏÅ9¥‡®ÈµØĂ¼Óؽ5ç̉ÙÚ‡ÚùסhƯ……»…×öÁ ±»âˆ;ăˆŸ¹Ø¿‰°»ÁÜÏԣ䙉kß [ïSôƒvÙÚÍƠ¹ÚÁ̉¹àå̉ Û«‚ ½9ôÄô¶Ô ±¿§ôöÁ ĂÙ¥Çóø×ßÁ«º­¾íJźưẠ̀¶߈©‡¥2ßëMÛ«‚ ½9½µÀÙŒë*«½…ñÓÿÚÑÓ§Ô¿×ÇĂñÓ÷Ô߈߈™‰kß [ïSËƠÇÖ±»ÙÚâˆ:½Ù-»ôï½ÿÚ¢ !ÏÔï̀“ÈåÁ“FÑĂÏÄ¡È뼬Ľ¤ˆ\0©‡¥2ßëM¡½€ÓÅƠ9¥‡Ù̉™‰kß [ïS¶ô)ëö÷Áăà³á›¾º·ÔưÀƠØ×绹ÚÙÚƠXÿ¯¶ÇÖ¿ôâÁÙ½ï»vÛ«‚ ½9ù×éôÏÔ°» º8¤‡Û™ñÓ‘éƠÑÄëÑÄëưÀ½Èƒơêéê·Ô‡Ç߈¹ÚñÓËÖïiµØƒøˆ³ÿ¯¶ÍƠ«‡“Íj×Ă«ÔψƒÔăˆŸ;k™‰kß [ïSÅÔÉ€߈×±»¼˜‰j̃ZîS£Åͼ·ÅÎÅØÅê&ù×™‰kß [ïSÑØ½¹¶Û«‚ ½9ÛƠëÓ½æ̉ưÀÑÁăôĂ·Å½Û«‚ ½9çÚéê½Ăƒ‡€·ÅáêƒvÍÑŽçôƒˆù×ǺÏūԻÅùêËÇö°»E™‰kß [ïS‘¥ơêß»û¸Ú•¦ơÔÿ¹ÁĐÓ‰»ÂÿÚßÁ©ØÓ¾Û«‚ ½9Û«‚ ½9±»ƒˆ̣Ô¿ºù×ưÀưÀƯˆ’½ơêù×ưˆ±)ĂÙöÂƠÄÇÖƒvá ·‡‘×8ç‹Üü¦†íöÁ߈™‰kß [ïS߈™Á‡Áí—G”Œª‡’̀j«Ú¿¹½Z‹Ùù×ơÔ߈߈ß„«‡“Íjºyôó¼Ø̃ƯÛ«‚ ½9¡«‡“Íjåôáê¶èÏÔ“ÑØ¶ƒÖÛ«‚ ½9߈ơèÅƠ×ÂÖ‡ÇÏŃØù׫‡“Íj¾Å߈‡ĂĂÙ˜êèäß»ûñÚÛ«‚ ½9Ï̉́ºéÚ8 +¤‡ +׻ر»ÑÓèơỬƒˆ̣ÇÖơèÅ«‡“Íj™‰kß [ïSÙ½“Ûív÷Áù×°»ÇØÿÚŽ›¾‚™‡£äÙ½ÅØ߈£ä¢X¤ˆ\0±»ñÆé×ﺛ¾™ºëöó¾ÙơèŽƠÄßÁ•íù×ï»°»™ëéåùÚщêö¹Ú‚v‡½ÏÔ±»•îĂÙËƯ«d¡ÔơÊÍƠï»ĂÙ™‰kß [ïSỤ̀ù×Û«‚ ½9फ‡“Íj™‹±̉«‡“ÍjçêÏù×µØ¦Ôø×™‰kß [ïSßç¡%̀Ó¿»ăˆŸ;kÛ×ë§±»ÏÄ¿́¿¹½ï‡Û™·Ó ¥0Á‡é/×:ăà¡Á˜êèäщÅØ߈ƒv©‡¥2ßëMÚÀï½³»™ÁÁÙÓºÿÆÑÓÏÅ×¾ÍĂơĂ¼9¥‡×¦Û ÜÓ øæ̣‡ Ëû÷Áø‡Ç…ŒÑ ùש‡¥2ßëMăˆŸË̉ù¿§Ôù¿ÿÛ¿£Ư9¥‡¯ÿÚ·Åñ’óÇä̉›‰ƒé©Ó…ÅØÏÅ„ô˜êèä½Ă‹Ç“¹ƯN×¾ÛÚ™‰kß [ïS½¹)—Œ߈å̉ Ù½Úª‚ +¼9™‰kß [ïS³È…nÙ½ưÀëöÙ-Ù½¶văơ¡ÁÛ«‚ ½9û˹·‡‘×8ç³(ăÁ³ÈơØ™‰kß [ïS“áÅÔÅ­ÄÍ­Hù×±»Óº“Ûƒ¾‘×̉å̉ ÷$߈÷Á…ÔÿÜĂÓ¼ĂÈâˆø×Ÿ}Ï̉±»ÿƃØÛÓ«‡“Íjƒˆíêèơ‹É0ÁÚ‹Ù±»Ù½Œ¾ñÆ·‡‘×8癉kß [ïS…nŸ}ỡï»χ߈¦Æ ÙÚù×ĂºåĂ %§ô»ÅñÛÎơ퇹ڛ;ñ¾ăˆŸ;ăÁ߈ƒˆơêÊ¿¹¾ăˆŸ;kó¹¼ûƠăˆŸÛ«‚ ½9™Óå̉ ăˆŸ;廓Çî½îÀ²¾½çµ«Ô÷Ù©‡¥2ßëMăˆŸººº¡Ôó©Ḉƃv¹Ú·̃ÅØ÷Á³ÈÏÔí?µØ·ÔœÁ™‰kß [ïSÿÚǼ—ÓƒÑÄëÂåĂ•×¹Ú}÷Ú—¶ÏÄ̉ÍÓÅÖ©ù×ï³2ͼƒ¾‘íơ9¥‡™ëéå—¶”éºàêƯ™ÔëöǺ‡Ú·ÔÛ«‚ ½9ĂÙáºü¦†±½ÚÀ™‹ÍÄ߈Ă¢̉ÅÏÅëö—Ó9¥‡áƯơê÷‡½ô¿ßăˆŸ;ÓØ¯¾ï$߈ËÉ9ăˆŸ¼Øºy¿‰¥ØÏÔ€ö¿Ư™‰kß [ïS¿àÀƯÏÔ™ÓơêÏÔ‹ëÛ«‚ ½9éÓ8¤‡¡ƠÅÂÛ«‚ ½9Á̉öÔÑĂ¹̃ơèÅăˆŸ;ÓÅ߈·‡‘×8ç¦ôÏÔ­—ưçÓù‡›;—‘½ơêß»û·Üƒˆ¡Ô™‰kß [ïSÙq†ïƠá רËÇÙ½½€§àÇ̉ưÀ™‰kß [ïSÓØăÁ¡»߈™‰kß [ïSơÄÅƯÚª‚ +¼9éÓ–Øרôñ»™‰kß [ïSúӇǷ‡‘×8ç°» ¯È¾₫—Ó­vù½ÍDZ»†¶•ŒÂù×߈ăˆŸÏÔ߈¶ÅØ×§Ô™ÁÛ«‚ ½9öĂÙß»û§ÔßÏÍåÏÔơÔË̉©¼çÔ¡É̉«ÛưÀ·¬‰¿IϹ±”á ÙÚ߈ËÇ‘ÓùÚ§Ô¹Ú“ÆÛăˆŸ;±»«‡“ÍjÇØÀ¡ÛÙÅë9¥‡Æ±ÔƠX̃ŒÚ,›vÍBƒ×»‡ù×§Æ߈èê»ívƠ +÷Áƒv‹ÓÛ«‚ ½9ëöù×ëöáƺ9¥‡×Ç»½ÏÔăˆŸË¿®¼å̉ ·Ø‡™‰kß [ïS‡Úª‚ +¼9߈¡Ô«î‡Ú¹ÚĂÙ¾¼€ëöơÔ‡×χµØÍË)éÛ9¥Ă™Áª» øơăˆŸ;k«»ƒ×ÖĂíÖÇÖưÀ߈ÏÅÏÔÏÔƠëö£ØÛ«‚ ½9ÅÁÙ½ăˆŸ;™‰kß [ïS˜Ă´a»yÿÚ¡Áùê¹Ú“ƠëöÏ̉¾ëÚå̉ ÿÚ³Ư¹ó߈ø×§ô·Å¯×ßÄÙ«»±óÛ×›¾߈ºÛ¾Ó°»Û«‚ ½9Ăù×ÏÔù×™‰kß [ïSƠÁëÔö‚vŸÈëöñÆÍÓׯÙÚш’È +ù×ï²2¿‰ĂÙá Ơá¬çÚÜ̉™‰kß [ïSÏÅ·Ô‡àóĂ“Ûåñ¿“ÆæôƯÓ ¿º¯È›¾¨‡¤2€̃êLŒ₫±»™ëéå¡Ôó¶ăˆŸ½ɱ’‰2Ô,ø»Å›¾™ơăơ¥Ø‹ÜĂº¡½€Å±»Û«‚ ½9ß֒ƹگ߈÷ÁỞÛ«‚ ½9߈¿×½ôÍ´áKçô²ØÉ Ëû§ôƠûëöÇÖ÷‡ÏÅ–¶™‡Å߈¦ô ÏÅøêăˆŸ;k÷ˆÙµØ€ºù×Û«‚ ½9á ±»¶¸ÑÄë÷ÓÅÓÏÔÙŒë*«ù×Ú0ª0‚00 +0¼90ÄÓ÷‡½›Û›vÛÄÓ³È÷ˆÜù×ÙÚÛ«‚ ½9ăˆŸ°¿«ÔöÚñ~ÁƯ›ÚÁ‹ÜÙÅëÙÅë£ä›vöçÚßÁ̃ˆ“ÆăˆŸ;9¥‡×ÚÄ̉ƒÑ9¥‡Û«‚ ½9³—¾ÁĂºØ‡»Ù̉Ă‹ÜÏ̉©¼̀Ó»ØϼÏlçÚÄØœÜ×Ü建ۺ˜‡ ±»óăơ©¼›¶é­Û½ßÄÙÿÚ߈±»“ÛµØÖ¹Ú“ÈïÅÛ«‚ ½9ÅÓƒˆơÔ‡“‹ë«dƯÓ ‡ŒÖơĂ߈•%Ÿ}Ï̉˹ăˆŸ;ăˆŸ;«‡“Íjƒvă¼ăàùצô·‡‘×8çƒÄ«‡“ÍjÿÇưÀ¾±»Å‹Ç™ơ÷Á½ô¼ửƠÚÓÆƒvà ³zٽٽ¹Ú³ÆÇ"Ù̉›¾ơê麫Ԃ +ËÇÛ«‚ ½9µØăˆŸÅØÄÓ¯ô™Á–¿÷ơÁÓ¹Ú§ÓŒ¹ÚÅØÖ¾8«‡“ÍjƒvÙÚëö±»™‰kß [ïS°»Ç؆º¯Û¡Ơ½Ø™àÏÔù×µa»Ø©Ơö¾Ù½˜‰j̃ZîSÙ܆ڇx­ÑĂʹ«Ô«‡“ÍjǼ˜êèä—»ÀĂÙ½¡Á¡Ô«ÔÛ×Ăºï½Å¹Ú°»ŒE$±»Û«‚ ½9߈ĂÖƒvƒˆ¾ÑĂëöÓ̉÷½·‡‘×8çÙÙ×Ë̉íơåôéêÏʼnÛù×Á‡é/×:âˆ:¶è™‰kß [ïS·Ô¡Û¹Ú›¾¶¼̀7°»ÁÓöù×Ù½ÅÔĂƠ™‰kß [ïSƯåçڛŻËƠ³z£äׯɱăàăˆŸ;±»›¡ơêÏÄ9¥‡ĂÙËÉ9àØÁ‡é/×:¿ß­Ä«‡“Íj¡Á¡щ¿‰߈¯×©ÓÅ¡Á«‡“ÍjâˆơÄùơ›vŸ}Ûºùד÷‡±»ëöơèÅ™‡ßϾÁƯ±»›¶é™‰kß [ïS箬֡ÔÓ¼™ôÎÅív¿è¼ƒÚ޾ÏÔçô»ÁÑÓáÉÏÄû(™‰kß [ïS™‰kß [ïS°»¥‹»•…ëöÏÄ…n™Ó«%ƒàÑÓ¥ˆ]1±»ĂȽ߻ûÎÄ@æôÏ̉½ƒ×¾™‰kß [ïSµØƠ“ÈÏŹÚơêÙÚ¡Ô±»º½µØçº’Ôù×Úª‚ +¼9›¾ßÁÓ¯ƠÛºרÍʱ»îƠơĂêéºļă‘·“Ơñáƒv±»ƯÓ ª‡’̀jĂÁƯ±»ơpÏÔëß½›Ú÷Á¨º¶ÅÙ½­v߈̀Óォ3°½₫®¶ĐØ™‰kß [ïSÏô¥‹É—« ©ƒ»5»Øºƒvö¶:Ûº©Ó°»í…Ú©&ÿ¯¶Ơ´¯ƠÛ«‚ ½9ù×Å·ÔÔœ‡ÏÅï½çÚ¼ơÄƠù×ëö¾́…àƒ߈ÁÛµØÅ3ëö¼»ÏÔ±»’ÇÂÈ–»ëö±S‘đăˆŸÏÔỞƯÚ«‡“ÍjÛ«‚ ½9Û«‚ ½9ÿÂÛ«‚ ½9ƒvëö‘Ú¸ÚÏŃv½ͽĂôƒÖ‚v°»±½ñÓ¿ÅăˆŸ;ëöéÓË̉ä̉°»Úª‚ +¼9½•ŒÙÓÁ±ÁÏÔ£ä߈±»ßÖ“ƠщË̉‡º©ÇíÆå¿Úª‚ +¼9Ù׵ؙÓăàßǽ̃ˆ‡£ØÛ«‚ ½9‡Œ×BÏÅ¡ƯµÜ·‡‘×8烈‰¿Iù×κÙ×ÑÄëÙŒë*«ù×ÿÚÅØĂĂ ›­±àéMÙ‘«ùêƠX¿ô³Øׯ­¾ÇÖ±»§Èù×ÍÄÛ«‚ ½9ÙÅëƠơèÅù×Ù½ĂÙÛÄÓÆÙÚ9¥‡£ØµØÛÀ±»ÏÔÓ~›áƒvá ơÔÓÙÚÛǹóàØ ƠÙ‰Û™ơщ¡Û•ÿöÉŸ}×̉ñÓµØÿ¯¶Û«‚ ½9¥‰ÍL…˜‰j̃ZîS•«‡“ÍjôÅ£äÊÚÆëưÀ¦Ô›¾öÁ«»™‰kß [ïSµÏ»Áá Û×ùêĂÈøæç'™ëéåÊÈ9¾¨‚ù×ɇ˜‰j̃ZîSëöû“Æ£ØÆØøê™Ó»»Ûƃv½ǺÍ­HñÓĂÙëö±»¿çÙ½߈§Ô½ƒÖ‚v÷Úß»û½çÚÛ«‚ ½9ôÓ„Ø›·Ô™‰kß [ïS§Öר™‰kß [ïSÛ«‚ ½9®¼ ‡R°»±»ÛÅ™ÔÑØù×ûÖÛ«‚ ½9Ú½µØ…Û¸ÚÇÖÏÔÛ¹ù×½½ù×ËÇ¡»ù¿±»ƯˆµØ™‰kß [ïSăˆŸ;߈9¥‡%ƒà‰Ô­ÄÑÓ߈ŸÅŸÅƒˆ‰ÛËÇ÷ÚÁ·ÅëöƒvëöY½®Ơ‡ĂÙ™‡ù×…Ơ×$±ë؛ۡ¡«»M±‡߈½ÏÅ·Ù½Ñ+ăˆŸ;ĂÓ½ÚÀ›ÚăˆŸ߈±»Ưº™‰kß [ïS‹Ç¡Û­öß»û›¾­Ä̃۵ؼ½ơõƠƒØƠâ¶̃Á̉ÏÅÿÚƯÀù×ù×±»¹ÚóÂëöϼ±‡å̉ ™‰kß [ïS…ö™ÁÍË)éÛ9¥ëöƒˆ½ô£»וù×׿8ëöÇív«‡“Íj™ô߈ưܾ۫‚ ½9ÙĂ˜êèäƯº“È«‡“ÍjỔ"©‡¥2ßëM₫Ú›¾›»ƠăàÏÔ‡ÇÛ«‚ ½9­v¡ÁËÖăơ*Ù½€¾‘ơ™‰kß [ïS±»¹Ú¶è…Öùê¹üï½ÙŒë*«߈°»«‡“Íj¢»ẳÏÄ߈¿‰±»µØµØä¿²“ÈËÉ9™‰kß [ïSöÁ¿ôÎÔ­Äù×™‡¾ÅÇÖߙ߻ûÙÚÛ«‚ ½9˜óƠĉ¿IÅâjŽåpĂÙûصØÉĂ߈øê·‹…~ơÔ©Øôé%ßÚï½ù×ÙŒë*«­ØËǡԽÉ̉9¥‡«ÅívÔXç½ͼÅàËÇ«‡“ÍjƠÛ×·ÅïÁ÷Á/ׯ®éƠÛ×ßÄÙñÖƒv¾¾ËƠÛ«‚ ½9å̉ ¿„øÛ«‚ ½9ø×ù×±½«%™ÁÛ×"ơꉿIƒv¥×ÂÈ¡Ûù×ß„÷ˆ•Œ÷ê£äƯÿ¾çñӹ凛¡˜êè䓹ƯNóÔ߈÷Áù×·‡‘×8çû؃¡Ơ°»§ÆñֵȳȯÜĂÙ»ô¡hëöÁ̃à JJJJJJJJJJJJJJJ đ;R¬ Đ$ ʦËÂ… ÁÏܓƙÁ߈ñ̉¶µØŽóÇ—»Û«‚ ½9™‰kß [ïSßơ«ß‰¿IơÔµaÅÄơ»ƒˆû)É»½€ï™‰kß [ïS±»·‡‘×8çăˆŸö“·ơêÑñ»ÛöÀÖĂñÖ™‰kß [ïS₫®¶­v߈½Û«‚ ½9ÏÅù×ïƠ°»9¥‡‡Œù×½±»¾øêơĂٽ麉¿IåĂ«‡“ÍjûÓî̉Á½ñÖÏÅưÀæÚ×Úá=Ï ª»Óº™‰kß [ïS®Gø¿ô³ô߈¡ÈĂÙƒ×ëXưÀăˆŸ;»Ø߈‚Á¿º½Ăơêø×ơÔï½ăˆŸ;ëöºăˆŸ;¡ÔÛ“ÛỞƠ½ßÄÙ߈ÍÓå̉ ÏÅÙ½ĂĂ¡Û©«߈¯½ÛăˆŸ™Á÷‡«‡“ÍjñӯȻÛá=ÁHÁ ëöëö½ˆ™‰kß [ïSÍƠ½«»ºéê›ÛÚƯÓ ø×/Ë%™‡߈«‡“Íj«ªÓˆ•=‘¥¾ÏÔ±»Ø×ÏÄÏÄÏÅù×ƠÆ–ØçÚÙÚƒÖ˜êè䨥Ó×¾ư“ÿ¯¶߈ưÀÙ܉ԭ€‡ÚÏÔ™‰kß [ïS¡ÔƠ…Ø߈ÙŒë*«ÑÓÛÀíjº$Ă$ĂÙ߈í—GưÀñÚ©ÚñÚ9¥‡×9¥‡ψ¹ÚڽᄑàÅơçáê¿́ƠXÛ×ÙÜĂÙ¾¡Û«·3uUö9¥‡øßÂÏÄĂÙÏÅưÀéô·ÅÏÔ©Óö†×?ÙÜ«ÑóÔ¡ÛÏÔ߈ƒv°¿4öѾßÁ•ÿëöËƠß»ûƠéÛ«‚ ½9ª‡’̀j©‡¥2ßëM½™‡‹ÜÇ_ÏÅ›¾2°»ƯµßÄÙ¤ˆ\0ï½ƠŸÅ¯¾ƯÓ »~°»$ ïỠˆûôăˆŸ;ÍB¹̃ÏÔù×ĂÙÏÔ÷ÚĂÈ‚ăˆŸ¼ ½ăàăê°¿óÄÅØ‡º×Ă×ܾÅÔÙÚíÙí&Ÿ}åÁƒˆ½9¥‡§ôÛÔŒº¥Ưívü̉ơÔáê™ÓÛ«‚ ½9½£äÏ̉±»Û«‚ ½9áÀ¯‡ăˆŸ;éØëöÛׇívẽà ÏÄưÀßÄÙ‹Çç©ÁÏı»…ë‹ÜÓÆæZá Ûºëö§ÛͼçÚ±»‡‡º©‡¥2ßëM•×ßÙ½«·3uU¥ˆ]1ï½Ë¿¹Ú¡ÈØÓơêÛº¡ÙÚßÁ™‰kß [ïS‹Ç½Ăß»ûÙÚíÑÓµÀ‰Ô›ÚûÓÚ×߈ù‡Û«‚ ½9™ô‰¿I™ÓÁËÍË)éÛ9¥Íı»§Ó×¾ÙƠ—˜߈™Û»Ø«‡“ÍjÁƯ¸Ú«Ú“º­¾œÂ™Ø»‡ÛÄÓ¸ÈÖÆÛ«‚ ½9«Ûù׿º÷ÁÚª‚ +¼9ĂôơÔƒˆœ‰¾Iéă±»Ûˆ¯àº¯²Ô«d—»¡Û‡Œ›¹óæ›Û‡́Á9ÏÅÅÓÛ«‚ ½9™‰kß [ïSå̉ ƒÖëöµàƯÓ ëöăÁÙÓ»Ø×¿8ñƈµØå̉ Ï̉ëö¹Ú£ä‹Ç½ô¡\±½ăˆŸ¶ƒèƒ«ö›¶éǽµØƒÖÛ×¶ÅØ·¦D9 9àƠçÚóÔÛ«‚ ½9ăˆŸç¥Ăȱ¿§ÓÙÚ¾—¶åĂơé¯È±»“ÆñÔ÷Á™‰kß [ïSîÅƯÓ ƠĂĂ ›­±àéMñÓÛ«‚ ½9ÙÚÇ÷Á˜ ê è ä ©Ø«Ôºyëù×µ÷—»µĂ±¿‡Œô± ÏÅ9¥‡×߈ĂĂ©ÓÍƠƯÓ ·‡‘×8ç®ÆBÏÔăˆŸ;ŸÅưÀ«‡“Íj߈ˆͼÛ«‚ ½9ƒÖÙÚË̉ÏÅ؇Î9„½߈©¼¾Ó‚vƒv“ÇùëÙ½«‡“ÍjïÚÓï¹ÚáêÏÅ¿º½ØÂĂ óÔÛ«‚ ½9…߈9¥‡µØ¾Ž±»èÓÁƯÙÚ©Üù×ù×ơÔƠö‡Œ‹ˆÙŒë*««‡“ÍjµØÙÚ߈Ï̉9¥‡Á½ưÀ—¶ÓůÜǺ¨‡¤2€̃êL÷‡±½ÁƯù×Ç™‰kß [ïSƒ½«dŸÅÙÚÛ«‚ ½9÷ÁƒvƠÛ«‚ ½9Óº’ŽöïƠÓº»Ø‹ÇăÇíéê“ÆÁƯ–ˆñÓ9¥‡×ô×ĂØÓ¾âå̉ €Ơÿ¯¶±»9¥‡•½“Ơ—»«‡“ÍjöÔÛ«‚ ½9½·ÅŒ•ŒăˆŸ©Ó§ƠÚÇù×›¶éÙÚÓÅ¡3߈Û«‚ ½9ÑÄëóDZ»É̉ƒv±»Á«‡“Íjôơêï²2 ±»ÙŒë*«߈¥ØÁÙÿ¯¶†Úƒv̀Ç¡ÓÓØ߈ű»ñÚäôºŽẲù×™ôÏÅ9¥‡ô‚vëö﻾çÚĂÙÁ²ÿ¯¶ÄÔ—»©ôÓÔ‹ÜÙ½Œ₫á ơÄ¿½½ùÅô«‡“Íj½óÇëö¿»ù×îÚÙ½Ž…ÏÄăˆŸ;‹€«»9¥‡­v¤â½ëºÏ̉ù×£‹‡ƒˆÍÇưÀ“Ơ߈£ä£äëăˆŸ;kÏÅÙƠĶ&&̃ŒÚ,‰Ô‹ÇĂÙ¸Úÿ Î̉µCơê߈¿à«‡“ÍjĂÙ×¾‹Ç±»Ûº¥ˆ]1ɇ©Çëöƒ¾‘™‰kß [ïS±ëØëöù×߈àö ëöÓ¼ßÁ8 +¤‡ +Ö8¤‡«‡“Íj÷Á«‡“ÍjơêÓŽˆº£Ï‘Û¨ƠÅØÅØăˆŸ;å̉ ߈ÂÓ›¾ƒṿ¶ëöÛ¹Úå×±đ߈ƒ÷‡ÍBϹÏÅù×ÓÆÏÔó«%ơễˆƒvͼ™‰kß [ïSù×߈ÙÚ±»ÓÅ³àØ¹Ú¯¾©‡¥2ßëMơêäôăÁăºµØï½ƒv½ÿÚ«‡“Íj«‡“ÍjÙÜă»˜êèäÏÅÛ×ÑӯȿßĂÙ§ô·‡‘×8ç‹Ç±½ưÀëö¿‰ù×ÙÚ³ºó˜‰j̃ZîSׯ±ó̀Ă¡ÁÓØ8¤‡ÓºĂĂ¼Ÿ«Ô­ß»ûƒvÛ×±»߈½€«‡“Íj™‰kß [ïS ÛùæÛƠùëù×ù×íÙœÖÀ·ôôĂËƠÏ̉ưÀăˆŸäƠƒˆïÚ…¾¾±»ÍB߈½™ÁƠ¾Gщ¿‰‡Ú–»½˜‰j̃ZîSÛ«‚ ½9ÇÖÿÚ·Å©‡¥2ßëMÛº¾ĂÙ«‡“ÍjƯ‰ƒ¾‘éÓ߈ÑÄë©ÓÑÓͼ«ÔœÁùX½ø×·‡‘×8篾™‰kß [ïS°½Ù½ưÀÛ«‚ ½9ÏÄÛ×›¾©ÓÁƯÑÓ×Ơ©&Ơ¾GÛ«‚ ½9°»ÿ¯¶ƯÚ»ÅÛ×¥Ó™‰kß [ïSÚÀ·Ó ¥0ĐÄê9¥‡¥Çß„ƒơºÛǺ¦ôËƠ½€¯Ó¾‰ßÙƠ¹ÚĂÙáê—àØŒê*ªÏÔ­ÄÏ̉©È›¶é“ÈÛ«‚ ½9±đÛºăˆŸ;™‰kß [ïS…ÔßÁÏÔ­Ä¿‰Û«‚ ½9ĂéÓ—ÓÑÓÓØÙ½ÙÚÛÄÓÛÍ™ô—¶ưÁä̉Ơ߈½€ô™‰kß [ïSö™Á”Œ߈ÛÄÓ±»‡º¤Ùù›·Ô߈©ˆª»½€Ăº·‡‘×8ç³ÉèưÀù×íÚÇÖ̃ˆÿÜÛ«‚ ½9îŃ«Ô÷ˆ‚vƠÇØ‡Û—Ó½ÔÁ̉Ă𿩇¥2ßëMÛºÁËÉ9₫ÚߌÛ,½äô“ƠßÄÙ«ÔĂô߈±»ÿ×½ÑØ©ÇĂٷܛڙ‰kß [ïSÍË)éÛ9¥ñı»‹Ü›ÚñÓÄôÛ«‚ ½9³ÈÏÅËƠ·Åƒvº½̃Áûøê€º¡Óơꛡø× ¹Çëö½ô«‡“ÍjỞÛÄÓ̀ÓÛ«‚ ½9߈µa.7ß»û‡Ăß»ûùט‰j̃ZîS¯¼—»ÁĂ›¾¤ˆ \ 0 ơêØÓĂÙöƒˆ‰¿I¾È̉ùæ¿»ÄÁéơÿ¯¶Û«‚ ½9ÏÅÛ«‚ ½9…ÚçÜơê·‡‘×8çđÓÛ«‚ ½9ÅàÑÓÛ×¼ƯG©©‡¥2ßëMëöܺÙÜ«»£äÙƠ±»¶ÈÛ«‚ ½9±ëØçÚÅåˆăˆŸ;k±»߈ר÷Á÷Ù›Úôêùê£äóÇăÁëöơĂ™»ÁƯÙŒë*«ÿ×ÏÅÇ¿ºÙÅëÛ«‚ ½9©‡¥2ßëM©đù×ø×Ëܼ±»ÏÔËÓ«Ô×Ơù×ĂÙ™‰kß [ïSăˆŸăˆŸÿÚ½§ßí—G°»§¹‡¼ÜÀơÔßÄÙ‹ô‡̃¹Úá ¹Úƒ¾‘߈Ù½߈ơ»™Ô£Øú%±»ù×»ØçôËÓÁƯ©™ÔX™ëéåĂÙ×¾Ë̉µØ½ç̃ùבÆ߈ÓÁÁ½¹Á±»¤ˆ\0­¾³Ǧƒˆ¦ÈƒàíÖ±»9¥‡רƒ×ă°ÏÔö½Ăº߈ŸÖÛ«‚ ½9ăˆŸ;ÏÅ¿(Ù»¿º¡ÔÎÚ™‰kß [ïSóÂóù×߈ăˆŸ™Á¤¾¡Ô›¶é™‰kß [ïS†ŒëöÏÔăˆŸéêÑÓƒˆơêëöñÚ«‡“ÍjǼ‡Ú–»Û«‚ ½9ĂƠ¹Úͪ÷‡½ô¡Ô¼€ùô×Ưº́Ø‘}—¼·Ô«‡“Íj±»ùêëö…ǾÅàÿ¶¿‰÷å5Óƒ×Áơê¡Ûψ̃Á‹ÇÎÅÑÓÑÅåĂÁÛÏÔ9¥‡çƒóÇå̉ ¡Ô™ëéå¹ơÚ›¶éå‰í=ƒvÊÈ9ÜÓ Ă¼ÛÄÓ›¾Û«‚ ½9£Øù×ÏÅ̀Ê)èÛ8¤ï³2±‡ø×‡ŒÍBù×›¾‹Çç'Û«‚ ½9›¶éÙ×å̉  ï×ƯÓ ™‰kß [ïSÙ½ÙÚíºăˆŸƠîăˆŸ;­Èâ꤈`\`0`ÁĂÆ¡Û÷Áùל ٽá꫇“ÍjºƯÙÚ±»—¶ÙÚÏŃvù×ÎÔâ­ÔăÇí•¾Ă™ëé奈]1ϼ—¶§ô½ш÷Ú߈¶ÈÏÔÉÎ̉ñÖƯº‹ÓË̉đơêÑÓûÓáÿ¼Íġԫ‡“Íjă¬ô÷ˆ½Á­¾ëö’ȱ»·Ôµ‰†½߈·̣Ù½¢ÈÛÀ“ƠÔX½ÿÚ¥ƒ×›¾å‰Ï̉™‰kß [ïS•³Žó¹«‡“ÍjăˆŸ;ÏÅóÓÂÈơÔƒvÑĂËÇÙ½½ắ¤Ûï‹©‡¥2ßëM·Â߈“×›¾§ôơÄ™‰kß [ïSß̣ßÖ³è›ÛÔĂÙɹ›¶éêö›·Ô‹É0íºöŸ}ÓØ¿±)ß„߈«»ăˆŸ;k÷ÁÁÓ̉º¾ÿ$ù¿ÿ¯¶µ.¥Ù‚vÓÆ½€˹ Êû†ÇăơëơÓØ’Ơ¬Ô ñ»ăˆŸ;kñ$«äÅ›¶éÁÏÅÙ½«‡“Íj‹à̀ẲÅ ‡ºå̉ «»«‡“Íj¥ˆ]1¯G‹øÛ«‚ ½9˹̣)±»ëÓùשر» ËûăˆŸ™‰kß [ïSáêÛ«‚ ½9ÛêƠź±»ëöÂÓ áÓƒvµØî» ơÄƯ‰Ó.‹‹ÙªÚùêËÖ÷‡ÛÀöæº ëöÀ‡€è/Ö:­¾ÛÄÓ±¿̀́«‡“ÍjÏ|ÓŃöÛ×á“ÛºÑÓơØËÔ•öƒv™»ăˆŸƠÁÏÔÛ«‚ ½9ÏÅûÅÓ™‰kß [ïSÛ«‚ ½9ơÔºơèÅ‚vÏÔ½€Ó̉­ÔµaÛÀÇÖÛ«‚ ½9ñƺ™‡‹ÇëöÙ¼ëöÙÇÜÏỔˆ”=«»àº Û«‚ ½9÷‡öưÀ¿‰ÏÔ¡Ô‡Œ½€éÓÿÚ°»ƒ½åĂçÚù×Ù½Ûº̉ÅÍĂơÄëÔƯÓ ǽ«‡“Íj߈§ùô³ÂƒÔÙÚ÷Ô©ÜÖ‡¼7ơ걿å̉ ߈ơêăˆŸ;™‰kß [ïSÁăÏÔù×ùá™‡ÅØ‘±°»9¥‡›¾åÁù׫‡“Íj߈ăˆŸ;ß›¶é‡x½‡߈¡ƯûÖáßâÁơê›¶éÅĺÅÓù×½́Úùæó–½ÊÈ9%½¶ÔĂÈơê«ÔưÀ“ÈËÉ9«ÔƒˆăˆŸ;¡%g±»ƒv¿‰îÅ€̣ăˆŸ;‹ÇĂÙ«Ô›Ư¥Á÷ˆ߈óÂÆÿ×ĂÏÔß»û”ÑÓƯÂß»ûăˆŸ;̉º²×±»ưÀ¹ ß8«‡“ÍjơÔÛ»÷¹Ú߈±»ƒvăơëöÁ‡é/×:ÑÓÙŒë*«Û«‚ ½9ƒv›‡ŽÁ½ÑÓ½ºỔÏŃ›¶éÑĂ¿ÅÅÓƠ±»Âê çÚûẳÙ×çÚỞùפØëö©‡¥2ßëMëö½߈¡ßơêñÚϺăˆŸ·Ø½€›¾ǽ‹ÇÏÅË®߈›Ú¢Æ½Á¾Ü§ÔÏÔ߈ëö±½ăˆŸ;ËÇ«‡“ÍjơÔƒˆ߈‡߈³z…öÏ̉›¹ªÛ ß»û·Ó ¥0ÇØÍ­HáêÛÀû…Ú½ĂëÔëöö±»Ù½Á¹ؽ¹ÚƠíüÆñÓ‹ÜœÜñÓăơăùׯÈÇÖÙ×çÚ×$Ï̉ÓØívÛ«‚ ½9ÄÓßÄÙª¶2tTíêͼ°»‡ŒƒçÚ°»­¾‹æ®¼ñÁ­Ö÷Áö¡Èùêù×ÏỐÅØƠX«‡“Íj·Ó ¥0ăơÅØ†Úóù×׿8ßÚëö®¾ƒÖÅØ±»Ù×̉ÆYÑ̀ÏÔ·‡‘×8ç߈³ºóĂƠ«‡“Íj™ëéå…ô‡aß»ûÛ«‚ ½9ù×Ù½«‡“ÍjçÚëö÷ÙׯÏÄ߈¹ØĂ™‰kß [ïS±¿ˆăˆŸ¶º·ÔȰ»™ØÄ›̃ˆÿ¯¶›¾ÿ»Ű»÷Áă»ívÏŃvµØ¨Ó‹ÇơÔù׃ëÚơÔ¾ÓØ·Ø¾ëØ™‰kß [ïSÑóǦ̉̉ĂÛ§Ôú|Û×¾ßÖ©¼­ÖívÁé‰ñ5ñ·ơêá ÷‡«ỒÓÏŃØç̉ÿ¯¶ôôÛÇëö¬ÖĂÙ‡Ăͼƒv߈ăે“Íj߈µØÏÔÏÅ«Ñ߈“Çù¿½«·3uUă¿¤Û«‚ ½9°»¶¼̀7ׯׯñÓëƠU«ÔÁĂƯÏīћ¿‰ơĂưÀéºƠăơêÓ´Å߈«ÔÈí—óåĂĂًȾ‰¹½›¾‡Œ©‡¥2ßëMù¿µØ£»Ó~á ¾ß—ˆÏÅËÖÍË)éÛ9¥ƒvăÁ½óÇỔ¯9¥‡­¾߈ĂÙ±»ơꩃ¾‘™‰kß [ïSÚª‚ +¼9ơ=Û½Ă½¡ƠÏŋܽƒßê±»½ăÄâˆ:Ǻơ,ëX¢äÛ«‚ ½9đÄ©¼ÑÓÙÚƠ™‡«‡“Íj™‰kß [ïSÑÄëíØ÷‡¨¼µƠåÁË¿ŸÖ…Øë߈ë§ĂèóỘÔ…»±»¯ÈÛ×ïDרÙ×忯×ÏÔù×›‰ª¶2tT´‰ §̉ÑÓ™‰kß [ïSăˆŸµØÏÅÙ½©©ÇĂºÛºÛ別ÎÛ׺ÿÚáÛƠ¾G9¥‡̉ºÛÏÅăˆŸ×¿8¶‡Ö8æ¥Ö´=Î==¼²È¶¹Ú§ÓĂ¼¾“ƠăˆŸñÚ8¤‡­Öå̉ Î +“È©‡¥2ßëM·¸¨ÇéÓÙ½ă»…àÓØÛ«‚ ½9Ù½­~ƒv­Öí¿q¯×¾ºăˆŸÅûؘ‰j̃ZîS½³Æ¡ÁÙƠŽ‹ÙÙ½©»ưÀÄô*™‰kß [ïSœÁơÔ±»½ßÁ˜‰j̃ZîS«»¹ÚªĐ9¥‡ĂهתbÅÔº¡Üƒ½ƒvùê½ơê­¾›Ăµ‰›¾¨Æ#­¾ÑÓñÓÍĂϽ¡Èù×8¤‡Ö³È”̉ëö߈£»…¾—¶ƒá×ù×Û«‚ ½9¶ÔĐœ·̉ ¤0Û«‚ ½9°¿§ô‡º³»̃ÙÚơê«ÛÙ™‰kß [ïSÁ̉‡ÇÀ«ÔÙÚ¿Ú»áê™ơÿ¯¶«‡“ÍjÇÖ½“ăˆŸ›Ô«ÚÁÚÿ$¦ôÓؽ«‡“ÍjÏ̉³™‰kß [ïSëÔ÷ÁÏÔ´‰£ä©ÇÉP¿́ưÀÙ½çô™‰kß [ïSơê¿́Ù‡Ï9…£ÇÏÔºØù×Úª‚ +¼9ñÓ§Æ߈«‡“ÍjÇâÚª‚ +¼9“Ʊ»ËÇÏÅÏ̉ùדº…Ø›™óÇ…ŒÛ‹ÇíÆơèÅÏÔ“ÆÙ×™‰kß [ïS«‡“ÍjÛ«‚ ½9«»±»˜êèä½€§Ø™‡½—¶ˆÛƒˆºy‚ùëÍijÂÙ½½á°»—ˆ¿ß̣¥ē¾ÑÓÿ$ƒˆµ‹ŸÅăˆŸ;ËÖ«‡“Íj½¶‡“ĂÙßÚ³Áüëö¥‹½ß»û­Ä÷‡ĂÈêÓ°»‡§ÔѶ«Ô—¶Ù½´aĂô8 ¤‡ Å–öăˆŸ;»‹øÖÚ±»ÂÙö…ô“ȹÚăºñÓÏÅơÔơÔƒ¾‘³ºóËÉ9ö±»«‡“Íjƒv±»á½̀Ê)èÛ8¤½«‡“Íj %öàÿ¯¶Û«‚ ½9ơé«)Ï̉ƒvÈ̉ƒvÑÄëà¾ø×½§ô›ÔŰÁƯÏ̉Ǻ÷Áù׃ˆÛ«‚ ½9¡Ô˜‰j̃ZîSû¿ÓÆÇÓăˆŸ;kÛ«‚ ½9½±¿ÍË)éÛ9¥Û«‚ ½9±»—Œ§Ôơê«»Û«‚ ½9›¾û¼Û«‚ ½9߈›¾ƒàÛ×¸È ÏÔÙ½ëöÛ«‚ ½9×¾ëö½°»ëö±»À¹÷ˆăê½ëÛ«‚ ½9´ÿ¼̃ˆ•µàÉíÇï³2ÏåñÖëƠUÉèÍÓ·Ø™ĂÙ½À½ÛÏÏÅăˆŸ;kù¿˜‡çÚăđå*÷t™‰kß [ïS‡Ç™ºÓÅÛ«‚ ½9́vï»ëöÏÔ߈µØÓÆ·Üϼ†ºéÓ‚ÁĂơꃎ¡»”ÛºÂĂƒvÅØÏÔø×ÅØĂÏÔÿ§±¿¡Ô½³̃ÄØÂ#ÏÅñ֣ءÔ߈Ä–™Ôä̉ăˆŸ߈«‡“Íj·Ô½¶ù×¹Ú¹Ú߈Ọ̈·Ü߈›¾« ©ƒ»5«‹Ù½߈Ûºº«ÓÂÙ Û×›¾™‰kß [ïSÛ«‚ ½9«Ô߈›¾Ơ¡Û߈ăˆŸ;߈ÏŇ۱)é‰ñ5ñ·™ØÍÓ¡ÔÅØ§Æ±»¿ß‹Çƒ½Û«‚ ½9ÁƯƯÂĂ߈ß»û¿áûƠÛ«‚ ½9÷ÁŸ}ェ»÷Áƒv±»©Óù×±»÷‡½ù×Â홉kß [ïS§º¤Ø©¼Å½€ơêíêéÚ£Øщ“ƠÑÄë߈±»½ÙÚ™ëéåù×›¾Ă/ëöÙÚû%§–ÑÄëËƠƒÚùס%€ºăˆŸơê‚vÍÄÿÛ…ƠăơÑÄë­ˆƒàƒvÛ«‚ ½9¡Ô•Ǽù×óÓ«‡“Íj©‡¥2ßëMăˆŸ¥ˆ]1£Ø—¶ÅÁÛ«‚ ½9‚Ø½ăˆŸ;åÁñć‡Œ߈‹Çă»ó±»ù×ÏÅ凃vç̃ÏÔ¿»÷ˆ¨‡¤2€̃êL«ÔƒˆÚª‚ +¼9ÅÄ™ô±¿³ °»߈†»ăˆŸ; Áù×ǺÿÂÅÄÅÑÅĐĂ +ÈƠٽ׿8™×Ơ߈À¹±»©‡¥2ßëMáá “¹ƯN·́ĂĂÛ×ívơê߈çÚĂÈÏÄù‡÷ª‡’̀jᬷųyÙ̉̉ˆ”=å×ăˆŸ߈ªÚ9¥‡ñÚ…ÛÛºƒ×ÅØ‡Ç£Xö‹Ü–¶ù×ÛÄÓăêÂƠ±»ëöʉ•Œ¿‰ÊÓù×ù×Û«‚ ½9߈Ï̉²Ô ëö‹Ó±»ËÇ8'¤‡'ÖÏÅ Ôɹÿ¯¶‚Ç̉9¥‡ưÀ½ßÄÙ£Ç9¥‡¾ÿÛƒvö$ÿ¯¶ëö©Ø¹ÚçĐîºoÿ¯¶ù¿‚vƯ×ƠϺï•ơÔ˜‰j̃ZîSù×¾»çÚƒvéơơÔ·̣Ú¹Û«‚ ½9ĂƠßÄÙƠÁÖ©‡¥2ßëMöơ¦ô»ØÍĽ±»½·‡‘×8çÎơ÷å5Ọ́¯ȋà™щ8¤‡Öó–“ÈÛ×ßÚĂÙïÂÑÓù×߈gơèŇÛÖĂ9¥‡·Ôû[Ù½±»ƒØ¸ÚñÚÛ«‚ ½9¿ÿ¯¶ËÉ9éêăˆŸíÁ§Ơ¥áơÔ¸Ú‡ŒÙŒë*«åŒ¿N½ơêÛ«‚ ½9ơÔÑĂ“ÇĂ$º½ÏÔ£ØçÚ°¿¶¦D· ·ŸÅù×™–ù×ßÄÙË»ëöƯÚŸ}ÏÔ±»ÙÚµ†ƒÚºĂ­ØñÓ™‰kß [ïSº́´aÏ̉ÙÚÁÛ߈߈ù×߈«₫׿8´Ø× ù×đÄ™}÷ˆ÷Áƒv£»ơêĂÈ›½µ‰µØÆ¡̃ßÚÇØ³ơê¢Ø©ØËÇĂÙ«Ú̉Á Û«‚ ½9׿8½ÂÙçÚỡG½¹¾ùצƋÇÛ¿ßûØÛºơÔÑØŸÈíØ¡àÏ̉߈ëö—¶±»’Æ™º¿ô¨º„߈‹ÇƯˆ߈ÚׇŒå̉ ÏÄ˹ïôÛ«‚ ½9߈«÷çÔ¡ÏỐ½ ĂơÔ¡Á߈¹Ú©Àç'½ö¿Å¯×ÛºÙÚµêßëö“Ơ¥‰ÍL…±»ƠÁ»Øëö¡ÔăˆŸĂäô-Ïů¾³Ẩˆ”=ưÀ³Ơ÷ÚùëíÖëöñÓ™Á9¥‡œ‰¾Iƒ¾‘߈󟾧ÔơÅ·ÅÏÔăˆŸ;ï»ÛÄÓëöÅØ¡È§ôÙÚÛ«‚ ½9¶Å©‡¥2ßëM̃„Éõa—ÓÅØ™‰kß [ïS˜‰j̃ZîSá꛹ÁĂ‡ăƒ½Â#ÄÓ¯‰¯0«·3uUÓÆ°»ÙÚÅÔ¹ÖôÔٽ߻ûÏÅ÷‡ËÇ›·Ô‚vőƫԇŒ¨« ©ƒ»5‡ä¥ˆ]1ù×ă½ƒÚÙÚ“ÆĂÙï½ȇ•ŒÔơ™‰kß [ïS¿ßÛ«‚ ½9¹Ú‡ÇßÚÂÙßÄÙ±·È÷ˆ‡º˜‰j̃ [ïS—ˆÇÖơêç4™×Á×åĂÛ«‚ ½9Ï̉·Ô›v§©Çơ–ƒÙÁ̉»‡ñÚ̀ÓÑĂ¿à–¶  ạ̊̃ơ ơÔ™‰kß [ïSa÷Á±¿½›¾Ăº÷Á·‡‘×8ç–ø Û·ỒĂè‡çº¹Ú±»Çç߈Û«‚ ½9å×ù×÷4Ó\ƒvµØâˆÚÆ4¹ÁƒÔ巽ر»óÔÛÄÓ¹Ú©Ó¶éô¹Ú¾ßÏ̉Á«́ÑØÁ̉•½Ûº¶™‡ƒvù×åÖ°¿±½Ë̉ñÆÇ̉“½™‰kß [ïS±¿•{µØ™‰kß [ïS‹Ü»Øëö°»ÆÅù×çÇÑĂ«‡“ÍjËÜËÇ…»˜‰ +j +̃ + + + +Z +îS +ø×đÄ +Ûº•Œª‡’̀j̣í«‡“ÍjẳĂÛÄÓçï¡Ô©¾±»¹Ú™‰kß [ïṢÂí—G«‡“ÍjµØƒÔù×ăˆŸ;Û«‚ ½9‹ÇÁ½±»ÏÄ鼽퇵إˆ]1†“ׯºyÛêÛ×ëö›¾ÍĂÍ­ׯßÚ¶“¹ƯN™‰kß [ïS¾ÍƠĂºÍÄ›¾Ë¿µêÁƯçÚ‰¿IóÔçỗqg±»±»¹ØƠ½€ưÀ›¾ÄÓ—»£‡ƒv¹óÇÙŸÈ¹ÚØY‘ÚéÓÑ·‹ÇƠ±»±º¡ÛăˆŸ©-ï³2Î̉‹Üï±½ׇ½7¹Å±»ùן\™‰kß [ïSä̉­Ö³Æï½ñÓ±»½€±»±»ÍĐíêµØ߈›¾¿™‰kß [ïSßÄÙ̀ǶØÙÚÙ½úØùצÆÚº·‡‘×8ç¿»ÛƠ’÷ˆƠ³z½Ôôêƒw×ܾÚ&ë˜HÓÓ«‡“ÍjÛ«‚ ½9¬¾ơÔăˆŸ;»½§ÓỞ‹¿›¶éăơ©‡¥2ßëMÔ׿8‡ŒÛÇ½Ăº·Ó ¥0î ²2 ƒv¡È±k¼€Á˰Ա»ÏÅ߈ÛÄÓÛ«‚ ½9¿º‹ÜÍË)éÛ9¥™‡—¶߈ívñ,áÀưÀôꙉkß [ïSñÚù×…ÛưÀÙY£»­Ø™‰kß [ïS±»ÏÅçÚ麑÷±»Ù½±»‡Œƒ×¾ß¶ô÷Á™‰kß [ïS«‡“Íj¸àß„ÑÓÍ₫ªÚÛ«‚ ½9±»ËÇÁÛ߈º«Û»ăơÿÚÏÅÓ̉Ǽùë±»·‡‘×8çĂº×Ơ·Ô¡Ơ°»ø×£Ç«‡“ÍjÿÚ™‡•’ó›¾…ÂĂÙ“Ơç$¾­Å¹Ú·Ô«‡“Íj¿ØĂÙ©¼ÅØ“ƠÁ‡é/×:±¿Ù½›¾ëöă½ø×áêƯp¥Â—¶Á̉½¨ÆÓ¾Ï̉÷ÁÏԙ؜‰ ¾I ‡ŒÍÓĂÓº³(ëöñÓ¯¾…ÙÚăˆŸ;Çè£Ó‡Œƺ÷‡£ä9¥‡×9¥‡™ëéåͪ£%¶‡Ö8æÛ×ív­Ä½ôÁĂÑÓÙ½˱§Ó™‰kß [ïSĂÙæÚù×采±»Á¹ă¼ùơŸ}½ù×ÑÄë߈ù×ଠ­Ä¡ ₫Ú½Ø̃Á¨Ú™‡…Û«‚ ½9½Ù½ÑÄ멼¡»«»ÅÓÇÖï²2óÂóÓ—»³zĂÙÙYç”Úª‚ +¼9·¦D åĂ›¾§âéÓ䌾NÅƯÂÛ«‚ ½9‹Ü½öôêͼÛ׉¿Iëö›¶éñÖ½»½ëö°Ô²Æ +ù׺¹=÷å5ÓÏŪ¶2tT±»Ù½ƒ½ÏŸÚÙ½°»‡“›Ơ÷Á³ôÍÓơÔÇÖ°»Û§Ơ¾Gö«‡“Íj™Áƒv×ܽ°¿DÔ½«‡“Íjщƒˆ‹ÈÙ×߈™‰kß [ïSÛ×Û«‚ ½9«‡“Íjù×ÅÛ×§ÓƒˆăˆŸ«»IÑĂ Ç¹Øï»ñÚ¿ºñÖ±»ù×Û«‚ ½9»ôŸ\ÓÁ¹ÜÑÓ©ˆÛÔ™‰kß [ïS·Ôó|™ôíÖÁƯå̉ ›ƒ×Á½ÇÖƒv¶óÔ È߈߈±»åÁ›¾ÛÇàØ…£­߈ơÔÓØ™‰kß [ïS߈̣¹˜‰j̃ZîSăˆŸóÔ9¥‡‘ÆßÏơÔ½Ă«‡“Íjùו{‹È©¼±»—»Ơ×éêÏÅÛ«‚ ½9·‡‘×8çÅØ‹Çï»Ûפˆ\0âˆ:›¶é‚ˆ¯—…¼Ï̉ëöÇÖ¹ÚÓ̃½߈ÅØÛ«‚ ½9™‰kß [ïS¯´¹Ú̃ήÓưÀ©‡¥2ßëMăˆŸ;‘Æù׫ÔÍÓ%ÔXÓù׸Úơêöăꩼ¿ß·Å©ÇƠćxÈÙÁĂ½ó¿éô·‡‘×8ç¼èÑĂ/ưÀí—G³ÅÍı¿ơćŒ™Ó™‰kß [ïS±»ù׫»щ˜‰j̃ZîSăˆŸ;ăˆŸ;kÁ̉‡ºÿ¯¶™‡§ôâàº߈Íå‚×¹Úï²2‡ÇÙÚgÍÇÁÓÛ×Ù½³¹µØëöơÄÛ«‚ ½9ƒˆƒvÅÄ“ßÁ‹Û€ƠÑ·±»߈§]‡ŒÙ½ăơ¥ˆ]1Ùרº±»gÛ«‚ ½9ÓưÀ™‰kß [ïSׯ‚½÷Ù»Óˆ¥àªÚ…ß»ûÙÚ°»߈›¾Á ƒˆÿÚçÔ¡ÂÙ¡Ûª»ÓÔÙ½ÿ¯¶º±»ßÁºö¶ׯ›¾g‡Ú“ÏÔÎÅ«‡“Íj×ö߈ôÏÔ÷‡ñÓƯµ©Ó“ƠéêÙŒë*«ª»C÷Úá¬߈½€ăˆŸ±½Ïź°»üÁ«‡“ÍjơÔÙÚç̉«‡“Íj½éÓéêÛº÷Á©™ĂĽ“Æÿ¯¶»ÅơêơŪ‡’̀j̃ÄØ™‡ª‡’̀j“¹ƯN‡ÇăˆŸ‰¿Ió ËûŽÂ½÷ÚƒÚÉ̉̉Á™ÓжăˆŸÖëöăˆŸ;©ˆ¾ÙÿÓ‚áÏÅßÖÜÛ«‚ ½9¹Úë䥯›¾µàÓ8ƒ»Ø¹ÚăˆŸĐÓÏÔ·‡‘×8çÏÜ©‡¥2ßëMá ëöëöăˆŸăÇí߈ơÿ‡º³ ™ÓÛ«‚ ½9ñ†Ǻ«‡“Íj¶èÿ¯¶™ÍÓÉ÷‘÷ƒÖ•%ø¿óÂăˆŸ;Û×Ö¾¥ˆ]1çô›¾ñøëö™Ôơ$÷Ùå»đ»¹Úç½Á¹ÿ¯¶ï½á Û×Û«‚ ½9˜‰j̃ZîS£äÏÔ›¶éµ¸‡“‰¿IçÚÙÓ™‰kß [ïSµØÙÜÍÓüÀ•ú麇ŸÅÿ×±»“çÁÜơÔƯ^—¶̣ÄâÓ!ÛÀÛ«‚ ½9€ë²Æ6»ÅÙâ}ăˆŸ¨Ç“b™‰kß [ïSƒv­¾Ợ̉‰yÙ½‡àÙÚ‘Æÿ¯¶ë¼·Å„»íØƠíÆ™êÏÙÚ«‡“Íjˆ§£Çù×רăˆŸ;k…ŒÛ«‚ ½9̃»úñÖØ½€âº¿»ó§¹«‡“ÍjŽưÀÍË)éÛ9¥™‰kß [ïS±»—»ƒØ·ºÑÅÅØßÁ™Ôă½×¿8÷ÙÏÄ•Œ—¢äÅƯéÚ©ØÎ[í‡ăˆŸáÛ׫·3uUͼÙ½«»ÚÆ»‹₫›¶éϺ‡º‰Æ½ŒÛº̃ÄØ×ÚơĂ™ëéåÑ×Ù½ÙÚçô9¥‡ÓØ™Á‚À…ƠÛ«‚ ½9ë©&™‡¤ˆ\0ö™‹í‡ÜƠôºơÔĐӷܱ»ơÔÏ̉«‡“ÍjÑÅơêÍB÷à“Èψ™‰kß [ïSÇÖ±»Ë̉ï»ëöÿ¯¶ív“¹ƯN‘ơ«Ô™‰kß [ïSăˆŸ;ăˆŸ;kơèÅ«äÏŵØơèÅ«»Ơ ÑæÏÅáƠåê¡Ơ™‰kß [ïSăÁ½›¾Ơ™‰kß [ïS­Ä߈ßÄÙ´aÇÖív߈ĐĂùסÈä̉Ù×vƠXçØ­ÄßÄÙÓö…Ç›ÚÏÔ¿‰ÍÓƯơƠÛºôéơÚª‚ +¼9…Û¢£ô£ô¡È©Ơǧáù×ơê¾ßƒv¦º‡ŒÉÖƒÍÇï½øæ…±ëØăˆŸ;ÍÓ±»ưÀưÀ§ôå̉ ƠXÛ«‚ ½9ÿ¯¶ĂÙ¡h₫‡ÚÀôĂ…£­ͽªÚƒÑÓ¡È£ØÁ™Ó™‰kß [ïSÍƠù×߈ÎÔ±»̃ˆơÔÑÓ­ÖăˆŸ;Û«‚ ½9îºÏÄăˆŸåŒ¿NêöƯ%³·‡‘×8癉kß [ïS¯ÏÔ«‡“ÍjơêÙŒë*«Çâ½Û«‚ ½9Ăå¿ĂÖĂÙÏÔÿ¯¶œÜËǘ‰j̃ZîSÏÔ™‰kß [ïSÛ«‚ ½9߈«‡“ÍjÛ×9¥‡ÇÖÍÄáưÀ·‡‘×8çÁĂ߈ÇÖơÄבÚÇÑÄ뽫ÑùêùêG½¹ŸÈÇÖÛ«‚ ½9ç̉á ¥ÛăˆŸ;¡»±»á=ëö¤Æ¡̀‘±ăơô—»¡Ô‚×₫±½™‰kß [ïSªÔ‹ÜøêÚׯùêùשØù×ÙN“ƠçÚÛ«‚ ½9ß»ûÛÆ«‡“Íj¼Û«‚ ½9Û«‚ ½9Ï̉ù×›¾¥ÓÅÙÚ™‰kß [ïSăˆŸÍÄ÷ÙñÚ÷‡—¾ÑØÙ½»óÇÙ½¹½ÛºµØÏĽ£»ùׇŒưÀ¯ÏÔ‡ßÄÙ¡È«‡“ÍjÓØù×ÓºăˆŸ;ÍÓ†Œ9¥‡ÏÔ¬ÈCív©ÀñÚƠ©‡¥2ßëMƯºÂÖ£Ô™Ô½ƒv߈·Ü÷Á9¥‡¾Å©ÜÛ«‚ ½9ĂÈăˆŸ›¶é¾Ô¥Ø™‰kß [ïSôư¿ƯÓ ö«‡“ÍjÏÅ÷ÁƒvÙ½±»¯×©Ơ¹Ú¿‰§Ơ¸Ú±¿ù×ëöß»ûÏÔÛׄdz ÔËÇá=ÑÓ½€Û×Û«‚ ½9¬ÅÀĂ麷‹¿ôÑĂăˆŸ;k¯¾ÁÓÿÚÄØÇÖ¿ñ½«ÔôÑ•¿‰¿I›¾ĂÙ½ëö«‡“Íjç»9¥‡ëÚëö̃ˆÉƒvÍÓÏÅç'¿‰¯G‹ø½‚•»ùê»ôÜâ»߈ÏÔëö£Ø߈ơùå‹ÇY·Ô‡ŒâḈÏľåĂ¡Ô™‰kß [ïSÙÓëöĂ¼ưÀÿÚù¿ƒÖ匿NƯÓ ÁÏ¡»ÂÁ‹Ù©ØÏÅÙ̉£»Æ~•¾¶WWÅ»gù×ï+‡ºÛƒëö›¶é°½ơê÷‡ËÍ̃ŒÚ,ù¿ÇÖÁ‡é/×:ÅØ™‰kß [ïS°»Ư ¡ÓÙY™Ô™Óà꛾ùê›™‰kß [ïSăˆŸ;¨‡¤2€̃êLívŽÛ«‚ ½9ăàù×°»Óʓșëéå߈רœ‰ ¾I çôăà´Î“È‹ÜùêơÔó™‰kß [ïSÙ׫‡“ÍjỞ߈•Ö³ºóĂÙ¡ÁƒvÏÅ“ÆÍÓ¨¼«‡“Íjù×¼Üï½·Ô·̣ăˆŸ;ĂÙĂÙ½ɇÂÓ±»ÖÆÎÔù×ÍË)éÛ9¥óÇù×ÏÅ÷ˆÂ÷ˆ¡Á›Ú³ÿ¯¶½¡%¶°Á—ˆª»«‡“Íjÿ§À½߈Á‡é/×:˜‰j̃ZîS”ửăˆŸ;ñÖăˆŸ;k÷Áƒv‡öź߈»«­ƒơçôƯº­»º…ڃ׷ôù×—¶Ở¹Ú«‡“Íj÷Áƒv«äÑÓ½ÏÅÛ«‚ ½9ëöÁÛ•ăˆŸ;ù×Ëܽ¹ÚÏÔăˆŸñÙ¤Øïi»½ù×ư¨©º™ëéåŸè‹Çù×߈ψ¸Ú8¤‡ÖÅ̃߸ÚûÓØ›‡ÇÖ™‰kß [ïSơ걿¿‰™ôÇôÚª‚ +¼9߈½¡Ôƒˆăêï»ăˆŸĐÄ +ê +ƒˆá=°¿˜ôăơÏ$ +®ƠăˆŸ;ñǺ¾ºơĂÎÔơèÅшƒ½‡ºÅ؃vî ²2•±»·Ó ¥0ọ̈"Ăôäôơêơê¤ÛöĂ—Ó«Ó§ÜÏÔ¥âåĂ½ÔÜÙ½½ÏéÙÚ́©‡¥2ßëM±Á£‰ÏÔʼn¿IăˆŸ;±»¿ß‹Ùçº̉Ž/¹Ú÷ڣأ»“Ȥٿß߈©¼™‰kß [ïSăˆŸ;ñ(ªÈºívăˆŸâàÏÔßÅó»ĂñÓ­)–Ó·¸÷‡ơêÇô߈íº›ÛÓëĂƠñÖÛ«‚ ½9Û«‚ ½9½ß»û”½½€ÍĂéÚ½å̉ ưÀ³È¹Ú…ñÖ±»«‡“Íj³zѶÛ«‚ ½9߈ƾº +ëö¬ơ'‹ÙÄô›¶éÉ9¥‡’½í‡ÑÓ¥øÑ+ơ꛹䌾NÙ×шóù×ĂÙ›v™‰kß [ïSù×ߌÛ,ÛÄӀǃ½ĂÙÙ½ÏÅŸ}óÔ­ÖÚtƒƯơê™Ø›¶é¾ơèÅ©Àƒv¯™Ô¿ Á̉›ÛÚ¡Èå¿‘±ºơĂá ö·Å÷Á·Å§Ó¥ˆ]1ôê§À÷ˆ¦ôÙÛɇÑÓỞ́Å̀öÁ¨Ç¨Œ¾™–™‰kß [ïSï»ÔXĂÙº›¾­½¼½±&¯Èù|Ù½ăˆŸùê»ß±»Û«‚ ½9ÍÄùê§›¾ăˆŸ³à«‡“Íj‹ÜÔăà«Ôù×÷Á·Ô×¢«ŒëƠU»ôÚª‚ +¼9÷‡Û½¹Úá꿺å̉ ơçôơÔƒÛ«‚ ½9߈ÂăˆŸ;ăƯăˆŸ;Ưÿ§ͽĂƠÏÔù×­ÖŽ߈ÍÓơê‰Û»y׃ˆØ×9¥‡Ûˆ±»¡Ë¿ÓÅăˆŸ;ÂÙù×§ô±»©ÓÓØψµß¨ºÏÔƒv̀Óăơœ‡½éÚ½€©‡¥2ßëM¼Ô·‡‘×8ç÷ÁÇâµØÇ%…»·‡‘×8çÑ•ŒÔÅ,Ûº€º¡Û¥©ơÔăˆŸÙ½ưÀơê߈¸Ơív³‰¿Iû°»©¼·ºËÇ–¶«‡“ÍjÏÔúÍçÚ‚ˆ“߈“ÆÛˆ‹ß›¾©¼Úª‚ +¼9Ơ³ ©‡¥2ßëMψÀ̉ÅÔºÎÔăˆŸ;«Ô™‰kß [ïSÏĹڙ‰kß [ïS™‹ëöåû™‰kß [ïSßÄÙñƠÎÅÓÚ·‡‘×8癇ź¶èׯçÚÙŒë*«ÍÓ©±»ƒÖëö³ơèÅăˆŸ;™ÓăˆŸéºÅÁ«Ô÷…Ú¿́›ÚóÇ›¾—Ó₫®¶÷‡±̉‡ºß»ûÏÅß»ûù×ÏÅÏÔ·(ăˆŸóÇÓØéºßÖÀ‡€è/Ö:§Ø‡±»ôŸ}۵اáƯ™‰kß [ïSÙצ۱»±»±»í界«·3uU‡x½˜êèäưÀ­Äđ»«ÔÁ̃§ôí½ĂÙ“Èóÿö•Œ“Ơ£»‡ÇÍćŒÓÆÿ§«‡“Íj®¼­ÄºñÖµØÍÓù×9¥‡ÓÓ‡º‹ÜڂvĂÙ›¾¥ˆ]1₫®¶9¥‡ÏÅ!á ̃ˆ©¼ăˆŸƒvÁƯ±»ÏŃØöûÙùêÅİ»ÍÓ…Ơ°»÷½ï»½€жê§ÏÅ–Áç̉½“¹ƯNÛù×߈ÅÔ™‰kß [ïSÅ–øơå̀߈±Áù×íêë̉Á‡é/×:đÖ¡Ô±»ÈÙƠÏű»ơĂÁí¡ÈñÓÔX±»ï»“ȵÄ߈»Ø̀Óëö¥ˆ]1™‰kß [ïS÷‡—éêˆÇƒ¾‘Î̉߈¿ÅûµØ»ÁçÚåĂ߈ëöÑĂË̉ù׫ڨ Ở™Ô¯†±»­ÖǺÅ–«¼Ë¿ƒ×±»ƒvûºù±÷ÁŽ»ô÷Áàê‹ÜÏăØƯ‰ƒÙ³(ñÚƒÖå‡çÚơÏÔ$·‡‘×8çÚª‚ +¼9ËØƠơé‰ñ5ñ·ª‡/’/̀j/ÿ¯¶°» ÷Áºù׃ˆá ±»½ûƠöÇÓơê«»¯³¹à¹ÚË̉ăˆŸ×¿å³(Ø©‡¥2ßëM±ÔëöÛ×½íç¿ß«‡“Íjù×§ÔƒÖÛ«‚ ½9­Ä£Ø߈±»ß„Û«‚ ½9ÅØѶËƠƒˆ¸ÚͼívĂëÑÄëÄô&±»Û‡ÓÅ«‡“Íjù×ÏÔö‡ư“Ñø₫ÇÇÛưÀÙÚëö›v™Ø‰ÆÅ«‡“Íj™ŒºÈ%ăˆŸ©ÓÅØ½i¾©Ø߈¯‰¯0ùê‡ÇÓºưÀÿǺ£ÇĂù×ÙÚăˆŸû(ÓØÀ¹öù×±»¶‡Ö8æ±»ó¡»°»ûÖ̉ÍĽ߈§Ô±»çÚÏÅÏÔ—ŒØÚÓÓÙŒë*«“Èù×ïÚ߈•½߈ö‡ÇÛ×™Á™ÓǼÏÔ‰¿IơèÅÿÚ—Ÿ±»ù×ùê±½Áï»Øª‡’̀jÿ¯¶ÑÓÛ«‚ ½9©ÛÀÛ«‚ ½9†Úá ù×ù×ÁƯë%÷‡ơÔú̉ÓºÙ̉ăà³ØÑÓ­Äöå̉ ¾߈¡˜‰j̃ZîSö¹óÇÛº¹ÚÅØƒ¿ß9¥‡ÖÆ ăˆŸ;¼·‡‘×8çÙ׿́©Óƒˆ·ÔÖÆÛºç̀›Ú†Œ£Ôï½ÏÔ«»óÔÿ¯¶ơÔ”½«¼½̃ëöª́¸à +­ÄË̉½±»ËáµØ™‰kß [ïSƒv§Ôv(̀ªăˆŸÙ½̀ÓïƠ÷Ú±»ăˆŸ߈ăˆŸ£äẳ½€ưÀµaÆß»û«‡“ÍjÙÚ¯àƠôÓºÛ‡ăà±ëØ½Ô Ëû¶ÔưÀ£Ø›ÂŸóeƒ×¯×µÈ÷ÁĂº“Ơ´†™‰kß [ïSƠ®Gø‡Œ߈™‰kß [ïSëöá ÙÏ̉­Ø߈°½Ù½«»¹Ú̀õ…ç̉°»¥º©%¿YÎÔ±»±»ơ$́–GÑ··ư¯öщÛ«‚ ½9ŽƯÓ ưÜßôÁtÓØ°»¡Øù×á ™‰kß [ïSÁÚ½©Ó³çÚ¯Ó¡Óà=ÁƯ±Å‘˜‰j̃ZîS̃ù×ăˆŸ;øê›¾½€ÏÔ”Èú«ÔÚª‚ +¼9µØëÔăˆŸ;̃„™‰kß [ïS©¶ŽßÄÙ«‡“ÍjĂÙ›Ú«Ú½»›¾߈߈∋Üë¼™‡áê‰Û«ÔÿÂÿºƒ½ïÅÙÅëÁă•ÜÁëרơ$§ôÛ«‚ ½9½ß»û±»éÓ™±½§ôôÏÛ«‚ ½9«ơ™Ø™‡ăˆŸ;›¾ÏļµØĐˆ™‰kß [ïS™ëé嘉j̃ZîSĂÙ™‡—Øù×ùןâ߈áêûĂ™ÓÙÚ±»߈Å–ÈĂñÚ ÇYÛ«‚ ½9ĂÍÇÛ«‚ ½9¯È˜ơ¦Ơ±»Ë Á+¡Á½±»ÛÄÓ9¥‡§Ô ÈéZ©ÇßÙ—ÓÍÄ–Øëö…ÁƯƒÚ‹ÇĂí—Gùב¨…ØÅØ›¾£Ç›¹ô»߈é‡Ù½÷ÁăơĂĂ«‡“ÍjăˆŸÏÔÓ«»ƒÖöơÔëö­¾ă¨ă‹Ó¶‚ ¡ÈƇÚù×£ØÏÔăˆŸ;‘ÆÁƯù×µÀ–¾¾ñÖ߸¾›ƠñÇÖù×£ÔªÔÆØ߈¢ ÙÚöɇؽƠù×ËÉ9ÍÓ™‰kß [ïSƠÓ̃ˆå̉ ™‰kß [ïS·ºËÇÏÔ‡“ÏÔ™‰kß [ïSöÁ»$ÏÅ×$ăˆŸơÔü™Ô߈›¶éÙÚư§‡§Æ¿‰Ê¿œÙÚÏ™ëé彦ÆÛ«‚ ½9ÑĂûÓ¡Ôÿ¯¶½̀Ê)èÛ8¤ơàb  đ;s¬ Đ,ËCdËÂ… ®¿ÙÛÆ©Ó½Ù̉ß»û÷å5ÓÏÔ•ù×ơê¢È%±»ỞÛ«‚ ½9½‹Ü£XööÛ«‚ ½9§ØÙÜơêÇÖ©¼ÂăˆŸ;k¡»ؽ¿ÅíÖƒvºôÈåÓÅÁƯ÷Úơꙇơº°Á%Û«‚ ½9ƒ×áƠ½ƒvçºöÁƠ|ĂÈ“ỢÇëöÏ̉›v›¶é«Ôùׇ¹Úˆ9¥‡ĂÖù×ă½›¶éÈĂëöÛÀŸÅÛZÏ̉¾ç̃ăˆŸĂÎñÚöƯÓ ±ëØíê½—å½ôǃˆÁ‡é/×:߈ĐĂÈÙ½¹Ú¯Èü̉Ươ³È®Ơ=‰¿Iưº̉溾ëöÈ í‡¡¥ØÅÛ‚¬Å¾ơꦺ “ÆÏÅÜ™‰kß [ïSµØ±ÁơĂ¥Ö™‰kß [ïSœ‡¿±½ßÚ߈ËÇÚ×±»Ù̉ơêù׋ǫڃÚÛ«‚ ½9ơêÙ½߈ăˆŸ;™‰kß [ïSÿÚ›¶éŽ¡ÔÛ«‚ ½9ĂÈƯơÛ«‚ ½9ơê±»ĂºâḈ̃ÄØ ËûÿÚ¿‰ÅÓñÓ̉Å“ÈÖ¼VëÓƒv¹¼µØÅÁĂ…ÂÔ¾FÜÓ ÍÄù׃Ú×ɇëö”» +9¥‡×ăˆŸ;kơêù×ưÀ›¾…ÛÏÔỞ±ëØôó¶ơ÷å5Ó•¾ơꙉkß [ïSÏÔåºĂÈ߈¡Èå̉ ›¾÷‡߈Ù½ËÇăˆŸ;ŸÅ–»߈ív×Ơù×§« ©ƒ»5³™‰kß [ïS»Å®Ơ«Ôù×ăƠù׉Ơö%µ†À¼«‡“Íj¡Èú•™‡ĂÙª¶2tT¡Û¥ˆ]1ÛÀå̉ Ñœ×Üß–¶Ô½ôƱ¿³Ü÷Ùû(ù×Û«‚ ½9‡ºÙÚóÇŒù¾çÚơê£Ç­vưÀÁƯ™‰kß [ïS—±߈¥<ưÀÛ«‚ ½9Á̉¥Æ¶ÅËÜ÷Ù÷ÚÙÚ™‰kß [ïS›çÇ̉ơêºÅÁƯăêưÀŸÈáê±Á̃ˆ#™‡Û«‚ ½9ƒvÁĂù×­qù×°»ŸÅ“ơºúêăăó¯ÈëöÛ×ơêÀÙÅơꙉkß [ïSËÉ9»ˆº›¾ÿ$ù×à ÓÀƒvçÚ¹Á‡߈ÑóéÓư¬ÛÄÓưÀï½₫q¡Ôß»û¹Ú¿ơ$÷¶«‡“Íj½ë«ÔÏÔÙÚ¡Ô™‰kß [ïS“ÆrǼ߈…»±»ăˆỴ̈Çó¹«Ô±»Ưɇ±»½Û«‚ ½9щùơÍÄíÖ™‰kß [ïS™ÓׯáăˆŸ;k̃ŒÚ,ÓÅ÷ˆẲæ̉ƒØù×çôÛ«‚ ½9™‰kß [ïS̉ÅơĂ¡ÈÏÅÛî÷ÁÁƯ–ÓăĂºù×ÉÛ¤ˆ\0á ™‡£‡±»߈ÑĂ¾‰…߈ĂèÅÓ°»©ÀÍÄÛÙÚåÁ›¶é™‰kß [ïS¡́¡Ô›¶éÍÓëö•½±Ù·ØÁ‡é/×:±½ßÄÙÛ«‚ ½9ĂŸÖù×ψ¡ÔÛ«‚ ½9½€ËÉ9­ÄÏỖÄØƒv™‰kß [ïSщ÷Á·™‰kß [ïS›¾Óº»Ü­ØøêĂÙ‡º©‡¥2ßëM—Û߈ĂÙËí—GÙÚß»ûÙÚ߈ű»³χ· •–ÙÚäĂƒÁËưÀÉÅØ– ÙÏÅ­ÖùÜ÷ÁưÀ¯G‹øº‰¿IÀĂÈĂ½Ă‡º¿Å‡Œ¿‰‚÷ÚùêĂÈÑÓƠ½êöƒv½ƠöÙÚỞÏÔ½€ăˆŸ;k©ÓÄÓÛׇ™‰kß [ïSܾF̀Ó½ÙÚ8¤‡Î̉Û«‚ ½9щĂĂ ›­±àéMù×ùטêèä½ÿÚóÄẳéÓŸ}©¼߈«`₫̀ĂĂº÷¶ÏÅ£Ù¾·#Ơå¡§ÔưÀó¼¹Á«»ÎÅÛ«‚ ½9£0ëöÓ™‰kß [ïS—¶«ºƒˆ«·3uU“µØ®‡Ç»÷‡ï³2ÿÚ¥‰ÍL…‡ºâˆ:jÙ̉߈¿‰ÍË)éÛ9¥¹Ơ¾ºçÚψ´êưÀẩóÂăêíºăˆŸ;߈·µØ¡ºÁ³zÇÖ°»³Â­Ö·ÛׯỞ¶™ơ¯¼ºù×ÏÄǽ‹»ù׃‘̉ù¿½́v‹Ç¹Ú¾Û«‚ ½9½€›¾êÚ‡µ·‡‘×8çù×·‡‘×8çÙ9¥‡ôĉ¿IÖÆ¾ÏÅÏ̉ư“±»ưÁ³È«»±»ơ¹½“¹ƯN×ܱ»ù×ÛÀ¯ÈºáºÛ«‚ ½9Û«‚ ½9•½·Å¹ÚÂÙ½ñÆÛ«‚ ½9«‡“ÍjĂĂ ›­±àéM‚½ÓÅÛ«‚ ½9ô³ÈÇÖ‰¿I¹ÚäÆψÛ«‚ ½9ÏÅѶ›¾í̃™‰kß [ïSá ĂÙ÷@ƒàôö½1ö߈¹Úר߈ÏÄå̉ Û«‚ ½9ăˆŸăˆŸ;kùבÆÁËƠï½±»‡ÿ¯¶ö±»₫“ÆùÅÍÛ«‚ ½9¹Úÿ +™‰kß [ïSù¿›×߈ëöï»ÏÔ߈Ó½³Ø­Ä“ÔÔXSÙÚÏÔÿø·Ö¿Åư°߈‡9¥‡‡“°»ö×Ơ±»߈éºÑÓ9¥‡ăˆŸçÚ³¹Å•Öív™‰kß [ïS9¥‡™‰kß [ïSÛ«‚ ½9‹Ç÷ÚăˆŸ¼¡È—Ó™à«Ô¶Ù½Ù°¿ƒÓØÿ¯¶Û«ÔЉÏÅĂÙIÏÅ“á‹ÚµØ̉Æ£ ùêù곃v·Å‘ŒÛ×ÍÓͼ«‡“Íj¦ÆׯƒˆÏÛ«‚ ½9íÆ¼çơ·Ü¸Ú³Ø±»×Ơể¯Ơí—G§Ô¼ĂÑĂƒˆ•Èû›å̉ ëöÛ«‚ ½9«‡“Íj÷ÚĂÙư‡±ù1©‡¥2ßëMĂƠ•Ö«%¥‰ÍL…ÓºƒÑÅÛ¬ùÜ—ÛÆ·¼Í7­Èÿ¯¶©¼³Ô9¥‡µ†ƒĂÂǺ¢È ¹ÚÛ«‚ ½9Ù½ÍÓ«‡“Íj™‰kß [ïSưÀ×Ơ™‰kß [ïSùê¸ÚơèŹ½¯‰¯0щ“Ơ߈·ºèơƠÁơêÁƯùׯƯÓ ‘Æ߈ÓØÏÄ÷Ú™‰kß [ïS½¼Ơ‘®ù׫‡“Íjó¶ËqßÚö Áív½ù× Ùµaø×ÑĂ©‡¥2ßëMƒv¥Çù×…Œ›Û«‡“Íj÷Ù«»œĂ߈éêÏÔẙ‡ »Ũ­Ö¡ÔơêÀĂ¹Ú»Ø½¿¾ƠÏÅñÓöơÄô«Ôö§ôÙŒë*«™‡°»9¥‡›¾Y›¾çÚâ»ăˆŸ;ê¼ +‰áù곺óóĂö±»÷êưÚ•Ç÷ÁÅ–ÑÄë̃ơB«‡“Íjϼ½çÚ÷Áƒv¿́‚v!Ù½߈¡È“÷™‰kß [ïSƒÖƒ·ÅËÇƠëö¾ÙÚƯºÁĂë$øêÑÓëöùæê$ëöú¼ÏÔ½ĂÙµØÁƯÁ‡é/×:˹»¼‘ăí±»«‡“Íj«‡“Íjû‹÷Á×ÓÍË)éÛ9¥Û×å¿ăà̃»úé¾ù×°»‡x«‡“Íj«ºÅ½Á±» ÛÛ«‚ ½9óĂ˜‰j̃ZîSå‰̃ˆ×Ă³½½€Û«‚ ½9«‡“Íj¡ÁÛ«‚ ½9“Ƨôó^—ơꙉkß [ïSƯÓ ¥Ö“°Û«‚ ½9áƠ÷Á±»·ÔïÚÉ̓ṿƒˆơl·‡‘×8çÛ«‚ ½9щ«‡“Íj¡Ô9¥‡ù×Û«‚ ½9ĂÙù׎Ưº9¥‡߈ƒvÿÇ™‡‹ÜơèÅï³2«‡“Íj麎¹ÚÛº—¶‚vÖÔ†6¦jÅØĂÙá 9¥‡×·‡‘×8çÚ××¾ëöùסí‡߈ùêψ°»ƠÏņÇÛ«‚ ½9™‡ç÷â³ôº™‰kß [ïSÇĂë$ÙÚ³1щëö«‡“Íj¤ˆ\0Ùڣǰ»¡h«‡“Íj‹Üå̉ ª»Ú×ï½÷Á%áêۇ߻ûăˆŸ;+ÓÅÛ«‚ ½9«Ôư¿áêÙ×ɇåרb™‰kß [ïSö“Ơ©Ó½9¥‡°»Úª‚ +¼9߈ăˆŸ;k±»˜‰j̃ZîSÏÚ±»£XÁƯ»̉º߈½Û×óÔù×ßÖ˜‰j̃ZîSƒˆƠX«‡“Íj©ÜºÁ̉çđÅØ±¿ĂºûƠÑØá ·̃ơê¸ÚÍäƯÓ «»åÖ³ØÍË)éÛ9¥ëö›¾áÛưÀÙÚùןÅù×ÏÔÏÔ† ơÔ—¶¡Ô­½¼ŸơáƠ‹Ó¤Ó‡ºº×Ăƒv« ©ƒ»5Ø«‡“Íj÷øÈ̉ÉƯ߈“ÈĂÓ§Ôƒv®Ó¾Å®GøưÀÿÚÀ½•Œ¹ÚÛº̀Ê)èÛ8¤«Ô¾º·¼Í7åÁĂÖçù‹ÜĂ¼Ởù×Ù½ơÄĂÙ¹̃™‰kß [ïS«Ñ±̉›¾ÅØÏĽ߈ăˆŸ;k‘Ö›¾½³ø¡ÔÛÄÓö«‡“ÍjÄéÓÛº›¶éÂÙñÓ‹Ó¡hù×âˆ:ù×ĂٻثԡÁơÔ‡¢Û«‚ ½9¶Å•Œ¹Ú·‡‘×8癉kß [ïSÙ߈åÁ߈߈ÂÁÛ÷Ú̀Ơ“ÆÛ«‚ ½9«»½ë߈çÚª» ưÀ¾ôăˆŸñÄÂÙ1•ƒvơÔ¡Á߈†Ú Åà™‡ö‰ÛÅÿµØׯå̉ ߌÛ,Ÿơ$ƒÖ»yơêƒÛ«‚ ½9ƒÛ«‚ ½9ơÔø×ăˆŸ;ר¿Ç–ÿ¯¶˜‰j̃ZîS¡Û™‰kß [ïSɵƯơ¥Ø¡ÈẳÁ¿‰ƒÑÄëĂȃÚơêχ¹Ú©à­ÄñÖăˆŸ°¿Ơ°»ôù×Ó¾ƒv¶ô‰©Óëö™‡œ‰¾IÏÅ™‡åŒ¿Nư­½¼ÏũܵØăˆŸ;½­Äëơ«‡“Íj“ÄØù׵؋ܫ‡“ÍjÏÔ™ôŸ}ÆØ«Ñ«Ô³ôÿ§»‡÷£±¿«·3uUµØĂôưˆûÙ±»ÙÚƒ¾‘§ÓơÔÏÔ®«‡“Íj›¾ÏÔù×9¥‡ƯºƠÚ߈å̉ ÁƯ‹Ç‘ăˆŸ…ƒv«‡“ÍjÛ«‚ ½9¼ ߈׃«‡“Íj­Ö™‰kß [ïSׯ×Ơ¡ƠáöÑÓ›¾ăˆŸ;ׇ½7‚×±»ß»ûÖÚÓÔ‡xù¾½€åÁÏÔ½¹ÚăˆŸ;»ˆ‡ñ5½ÿÚív‡ŒÙÅëù×ụ̀·ºưÀ½ơÔÙ½•Ç£ØơêƠ¾Gù×Ù½ÓÓëöÁĂÓà¥Æ±ó·Ô›Ôû̉“Ơ¹Ú›¾ăˆŸÍÓá °»ù×÷Á¹ÚÅı»â»³(߈åô“ȱ»Û«‚ ½9±½›Û™‰kß [ïSñÖƠÿ¯¶áêϱ»ăˆŸ;±Ü¡%²(ơÔ™‰kß [ïS£Ô·Ô¬ÅĂºĂÙ°¿ĂÙƠ߈ºơê³JƠµØÏĽ›vÏÔÓåÁ×ÓÍÄå̉ ¯ƒßͯ¥'=U#QK¯Â߈ÏÔÓº¹Ú½±»ÙƠÿ¯¶½£Ô“ÆÂẹ̀¶ ±¿̣¶ăà«Ô„ƒ™ÎżÙ×ÁĂù×ϼÙÚù׳á=竃v±Ü̃ˆöñü½º°»›vÏÔëöçÚíº«‡“Íj¡Ø½æØ“È9¥‡ăˆŸÏ̉ñÖÛ«‚ ½9Û«‚ ½9ù×ĂÈÛÄÓ¿́÷Úù꽿‰ùê‰Û󗵨ơÄƯơϺ¼º¤Ç ÏÔßÚ˜Óß»û«‡“ÍjÙ½ù×›¶é…ô¹ÚÛ(êöå×¹Ú“¹ƯN¾ßÁ±»ª‡’̀j–¶™‰kß [ïS̀ĐØ§Óï»ă‹çăßÄÙ¹Úívÿ.Û×´†ùëÏÔ»Ó™ëéå¹ÚæôĂÈÁËùë™ơçô‹ÙăˆŸ;ÏÔ¹ÁóÂ߈߈Ăáêщ̣³Û«‚ ½9™‰kß [ïS߀ÿ¯¶ĂÙ¡Á¥æĂÙÿÚ߈ù×½ëơÔ÷‡Å»ăˆŸщ́‡xñÆÙ½­¾¾ßͪ߈—»¸½¥ ±»‰ÛXĂ‹ÜéºÙ½ÿÚù×µaùׇŒÏÔƒˆ«·3uU«Úß»ûƒvĂÙËÇ­Ä•ŒÏÔ±»ó¶ùë‹ÜéÙ¼¨‡¤2€̃êLÜ ¤Ø‡½ ÛùơÏÔÛ«‚ ½9ÅÓÿ­¾¹àÏÅ‹°¥Ư‚vù‡©‡¥2ßëM¡È³È·ô»ÏÔ÷¼ÅäÿÚơÔºÇ̉éơÑÓÏÔăˆŸ™‰kß [ïS»Óù×߈“È÷‡§ØÏÔ«‡“ÍjåˆĐÄêĂôăˆŸ;ƒÄáêăˆŸ;kÅçÅÔ÷‡ÏÅ™ŒÛ«‚ ½9¾¹xßÄÙö§ÆŸ}˜ ê è ä ûÓѾßĐÄ꽇¼€ªÚï»°Ôöơ ¯½„äĂº÷$“¹ƯN™ºÛ«‚ ½9˜‰j̃ZîS‰Û±»¯Û±¿«ÔÑÄë¿Å«‡“Íj«‡“ÍjơêºÛ«‚ ½9ÑÔÓ5“gesÁŃÚÚª‚ +¼9ívï½Å̃°À«‡“ÍjäÁ«Ô‡x₫Úƒv¶‰Û¡ÇëööÑĂ߈…ÇĐÓ̉Å‹ÜăˆŸ©‡¥2ßëM¡ÛôéºßÄÙ匿Nn™‰kß [ïS©Ó™Ô÷å5ÓöÁ +ûĂÏÅ©¼›¾ß„©‡¥2ßëM‹Çáü÷å5Ó߈߈ưÀ‹Ç¹Ó̉ÿÜÓºרơĂ9¥‡ÿ§å̉ €öÿÚÏÔ·¦D ơÔÏʼn¿Iܱ»Ó™‰kß [ïS¾ÙÚ°»9¥‡ÁƯÙ½ßÖĂÙ‡߈Û«‚ ½9«‡“Íj±»±»ö«‡“Íj¿º±½߈»Ă£ØưÀÿÂ÷½ÿ¼Åر¿»Ø…ØÑÓ˜Ăô߈ÍıƯÏÔé×ÛÊÇßÅöĐÄêÁƯùëÖ̉ûƠÿÚæº̀󸱻Á̃¡ÈơèÅ߈™‰kß [ïSר•Œƒ“¹ƯN¹Ú׿³ƠÏÅÅÁ™‰kß [ïS¹Úăr9¥‡—Œ÷‡áêëöרÔXï»ǼºÅ¤íø¿—¶í‡ÇÖŸ¿»ØÙ×Û«‚ ½9‰ÔåƠÛ×Û×™‡¡ÈéÓ“Ơ™‰kß [ïSûÙ¡È́ÁÇĂÙ×ù×å̉ ±»ù×±»±»ÙŒë*«èC—»¡Á“Û›¾©Ç›‡«‡“Íj“ȧ‡ăˆŸ;œÜ½ÔûỠ»ú¡ÔÏÔăơÇ»ÍÓ§Ó§àG÷5½Ưº₫ÇÿڬĺÎÅù×Ù½̀Ç›ĐÓ¶öơÔøê«‡“Íj·ÔôêÏÔÍÓíꔼ|âˆ:›¶é«·3uUÛ«‚ ½9µ†ù×ÇÖÛ«‚ ½9¡Ûô½ ›¶éÁĂÇÖ™ÛÛ×ăˆŸơêëö›¡«ÔÙ½«Ô¢ä±»›¶éͪµØôñ×Á¾§ÛíêÍ„½™‰kß [ïSå̉ ÁˋǃÚƠ·‡‘×8çÿ¯¶Û¿́ŒÓ÷‡ÏÅ×Ơ†7§jÏÅÏÔá=åĂ߈̃Œ Ú, ¿ßÅnóĂ¡Áă½øêáƠÁ½ź¶èÑÓÏÔÇ­Äí—Ǵơ—Ó‚ØÛ«‚ ½9ÏÔÏÔ³Ư·Ô₫ƒÔù×·‡‘×8çá$·Å«·3uUơÄ™ëéåÑÔơÔ›¹Û«‚ ½9…Ú°»ù×ÛÀå̉ ºơÔËÔÛ×£äĂÙÛ×ĂĂ½­¿ôŽăˆŸ½ôƒØ±»Ù½Ù½½‡ưÀ÷ÁÑÓ÷Á«â›¾ï™óǾ‡ß¿Û«‚ ½9߈¶ßÍË)éÛ9¥»ÁÏÅå̉ “º×ÜÑÓ8¤‡×ĐÓ—Ó²™ëéåăˆŸƒØÅÀÏÔå̉ ½¹ÚưÜÁ½å̉ ߈9¥‡·‡‘×8çÏÅñÚƠ±»«Ôÿ¯¶½ë÷‡÷ÁÛ«‚ ½9ỞăˆŸ;ßÄÙù×ÔêØ÷å5Ó¡È¢XăˆŸ;ëöÛ×å̉ —ØƯÓ ƒÚø×ÏÅÛ¹ÖÀ ÉàØÅê¹ ·‡‘×8çÀ¯àéqÙ½ƠÚÛ«‚ ½9™‰kß [ïSéºÔX ¶‡Ụ́ÔLÙ½ϼôơꮾ“¹ƯNÏŇ¹Ă¼±»߈êö¡ÁưÀ·‡‘×8ç±ÔƯëọ̈Ô›¶é¡ÛûƠ±»ˆÄ¹ÁƯï½±»¡ÔÏÔçÚ«‡“Íj«‡“Íj«‡“ÍjßÄÙ¡È߈߈ÛÆÍÄÍÓ̃ÚÏÔ©ÓÛºáơêĂÈ«‡“ÍjÛ«‚ ½9•ŒáÉ—ÑÄëËÖ‡Œ₫ÇơêÍ¥à™ëéå·̣›¾¹Ú›¾߈ׯ«‡“Íj‹Ü¹ÚƒˆÙÚ½¿‰éï»Å½ÁÜÙ½ïíÆ›vŽ³È“È™‰kß [ïSéêưÀ±”·Ó ¥0›v•×ëöƒŸ8¤‡×™‰kß [ïS…÷Á¿ß¥‰ÍL…ÁĂ£Ô¼ôÛ«‚ ½9µØ¾ß»û™ùÆ»ˆÑÓ—»ëöÁ£ ÏÅïiùêäñ뽯Ơ·Ó ¥0߈»‡ß»ûăˆŸ;̀Äöơ¶‘ÆÙÚÆ»ÙÓÛ«‚ ½9Ûºå»ûÓϼ¹Ú¿¾¹ÚÙÚ«Ô½±»¨¼î²2×*߈ÏÅËÔ¯Èñ,ăˆŸ¡Áù×½Úª‚ +¼9ưÀ«‡“ÍjÍÄÚ’÷µëÔË¿©Ó߈ÏÅö¶…Ơº£Øƒv߈öר½ĂèǓȷ‡‘×8ç°»ù×߈Ÿ}Î̉“Ơ±»©Ó½Ïű»ăˆŸ;ƒˆ×ƠơÔăˆŸ¯Ü«‡“ÍjöÁ£ä±»ĂĂéê©À°»û‡ß»û±»ÅسÁ™‰kß [ïS¼€ÿÚÛ«‚ ½9«ÚÏ̉§Ô­ÔÙ½±»¹Ú¡%›¹ửÚ߈™ÓψÙ½ëö߈ỞÉ̉ù×½½‡ëöÿ☉j̃ZîS±»ßÄÙ¶BB½…»Å»½åô¶‡Ö8æ½€߈¼×Ó™Ô¾½±º¾èêưÀÛ«‚ ½9‘ɺ۫‚ ½9‘̃™‡ºĂ߈ׯ•ŒÏ̉÷Áñ¨÷¼˜‡µ‰åĂÛ«‚ ½9̀­ÁĂÙ­€©‡¥2ßëMơèŹÔå‡ưÀï½ÛÄÓ™́Û×߈߈ͼå̉ ÏÔ±»ÑĂȱ¿÷Á«·3uUÙ½éꔽÛÀ³‡ŒưÀÇÖ‰y™‰kß [ïSơÔöëöR ¹Ú‘ƠáÅ©ÓĂº‰Û‰¿I«ÔÎÔăˆŸ;߈ùê¡Ô½íơ™‡Ö$ £»ÿ¯¶»ÁỞöÁÑĂ¹ÚËÉ߈«‡“Íj›¾«‡“Íj Ơ&ơĂÏÄ«ÑÚª‚ +¼9÷Á¥¨·°‡Œ»ê‘ƹà9¥‡«·3uU•ÍïڻŧÆï»‹ÇăˆŸ;¤ˆ\0ù×ƠÙ\ùêăˆŸ—¾½§¹ÙƠǼ߈ï»·Ô™ëéå߈ĐųºóÏÅĂÙ—»á º½ÇØ­ÄëØÈ̉¶Å½ÑÓ¹Ú›T‡Œ¹»›½ăˆŸ;ăÇí½€åß¡»÷¶ö¡Ç8¤‡ù×Ưº‹Ç躋٠Á©ØăˆŸ;kƒ¾‘÷ÁĂÏÔöÁ•ŒûÓ刋ٷÈ9¥‡Û«‚ ½9ĂóÔµØÙ½Ö¾߈ÇîÚª‚ +¼9ơÔñÓº·ÔÍÄÁ“¹ƯN“¹ƯN°»9¥‡Ï̉°êØ¡™‰kß [ïS«‡“Íjª‡ +’ +̀j +‘Æ¿‰ß‘Æß„º±»Û×°» +¿‰ÿדƠçØˆºĂÓ~˹­Ø±»ơÔ‡ŒϺ«Ô½Ô߈ù×¥‰ÍL…÷ä5̉¸ ÍË)éÛ9¥Ϻëöï»ׯ©‡¥2ßëM½¹½Á̉ÂÙ‡Ç£ä»»ÖÆÙÚùêÛ«‚ ½9¥Ï™ÁçÚÛ«Ô›¶éăˆŸ;k±»íêŸÖÅÄ¿‰½›¾Û«‚ ½9ƒÔïƠ½ô߈ö߈̃ŒÚ,›¾ËƠ÷ˆÙ½ù×Û«‚ ½9̉ØÛ«‚ ½9½ÍÓ£»±¿ĂÙ±”Ù½¹Ú§ØùׇÇÏÅшóÂÚYëÚ×Ơ†7§jô¥º—»¬ÖËÇơǾv‡ŒăˆŸ;ëöÙ×½ö߈ÏÅă‡£äß»û8¤‡ôø¾Ư‰ÁĂ9¥‡̣Ÿ ™Áó߈߈«#ñÆ̉ŵؗӷԹÚù׫ӵê³È¬Ø ÏÔá §Óù×߈ëö‘Û£ÈÏßñÚ÷Ú“Ơ×ƠăˆŸ;ßÄÙ›Ơ±»Û™‡Á̉Ơâˆ:káêÛ«‚ ½9ơÔ9¥‡¾£îăˆŸôé¶ôÙYÛ×Í­H߈₫§±»†º±»¯½Ă§ôívùׯ÷Ú›ƯÍÓƯñëöï˜áÛ°½éÓ«·3uUœ‰¾I½ô°¿ÏÄá=•ĂÙÙÚù¿±»½ô¢Çƒˆ­€§Æù×£éÇ~ïiù×Åà©ÇỞê§߈›Ú›¾³̣¨‡¤2€̃êLïÚ¡ÔñӒǼÈçÚÛºÛˆ³«Ôùׯ×Û«‚ ½9ù×¾ô먟ÈĂÙ£äÙÚôíêÅÓ߈Á‡é/×:9¥‡8 ¤‡ ׇéÚẤvơê­¾€öù×Ăè߈†½ëÚ߈ùê½ỔÅÚº«‡“Íj©Ó׿8ùׂ½ù×§ô‡ÚÇáÁƯ©ÇŸ —Û¡L߈‡Ç›¾±½÷Áÿ¯¶ªÚƠºmÛ™µØỡ¡ÁÁĂÁÜËƠ°»«‡“ÍjưÀ¹àívÍÓ•Œ̣Çív±»˜êè䙉kß [ïSóÇ©Óù×ÜÀ×¾¿Ưá ö½±»°»÷‡ơÔÛ«‚ ½9©‡¥2ßëM“Ơÿ¯¶ƒ×Ăôăº«‡“Íj߈ÙÚ߈éê®ÈËÇÛ«‚ ½9¡ƯŸ¹ƒvѯûă߈Û«‚ ½9˜‰j̃ZîS†×…غĂÙ­¾Ó'¿ÅĂĂ ›­±àéMá=Ù½ï‡ơê¹¹Ú±»¡ÔͼÑÓ°»ùשÁƯ‹½™Áù׳ș‰kß [ïS¡Ô¥Ø˾›¾•ŒÚª‚ +¼9ÏÔÆƒ£XÚ ª ‚  + ¼9 Ó̉™×‹Û¥Èƒ­¾ÏÅ™ÔơµñÓÛܾÛ×óÂû˜‡ÏÔ₫®¶ƒ´öÙ₫«Ôơêé‡î²2ăÁƒ¾‘¡Û«‡“ÍjăˆŸ;¥ˆ]1³(©&ÿÇÙ½Û«‚ ½9·Å½“Ȱ»9¥‡®¾™‰kß [ïSﻘ‰j̃ZîS±»½ºù×לÈËÇù×ׯ̉Á̉̉ÁÆ»›¾ÏÔéºÁÜ߈Ѷ‘ÆÙ½œøßÚĂ¼£äï½·¸ÏÅ×Ăͽ™‰kß [ïSöÁ9¥‡ Ơ ÑÅÙŒë*««‡“Íj˜‰j̃ZîSơÄÓ:¦Æ¢äí̃ĂÙƒvÊÇ9¥‡ÏÔ›¡‹Ç¿ßÛˆÛ«‚ ½9¡Ûå̉ …Ú»ØăˆŸ;·Å»ÅسÏÅĐÅëöĂÙ¥ÛY§Ôơꦹ9¥‡•Œ¨‡¤2€̃êL‡ŒÙÚ¿ºÿ¿½ƒv‹&ô¹Úº÷Áëö‡»ßÚÓ ăˆŸ;k—¶£è´•ÿ¯¶ÇÖµ†“Ơ¢»ÏÔÙ½ŸÅ•Èû›ñÓĂư£Ó™ơÛ½£Ø±È₫³̉ÅëöȶôÙÚ¨‡¤2€̃êL«·3uUÊÚ±»ívÛ×­¾…ÔÍƠ¿ÙÏÄă‘·“¼ƒđÊÓƒvå̉ ºưŒ‹Ç«»½€™‰kß [ïSÛ«‚ ½9Ú ª ‚  + ¼9 ¹ÚÏÅ€º­vó¹‹vÀËÔS¿ôÏÅÄØëö£äºÁŽ·Ô¡ÈăˆŸ;ỞÙ‘éê¡Á¿ß9¥‡ëöö¡ñ»ÏÅù×ơÊÙ×û(«‡“Íj采“Ù•ăê⺛¾×éÑĂù×ơÔ«»ÏÔëö™‰kß [ïS»óƯÓ ¶ơÔ“Ơµ†¡Ô›¢ϺÓŽ€…Ö‰ƒ—»¿ôëö½´ê½Ă“½Åت»·̃Û«‚ ½9ùÚï³2«ÔÏÅÎÅư§‡âˆ:Á×±»µØÅØÙÚ™‰kß [ïSºß§߈§·½©£«‡“Íj·‡‘×8çÛÀ߈ß̃—¶Û«‚ ½9°»©Ó«Ô©Ü߈ƒvÁÙơÔ›¡ÏÔÅÔ߈ƒ±»Ù‘««‡“Íjù׫‡“ÍjÎԶ۵ث‡“Íjđ߈÷$Ûˆ¢÷߈ỗˆ½€Ǩ•ÏÑØçôÛ«‚ ½9ơ¡Ûϼ—¶™‰kß [ïSñÆëöëÓÓà̃ˆùסԮӱ»ÏÄù×±¿µè¡ƠôêƠî½ÍÓ߈—̀Û«‚ ½9ƒ“ƠÅÄ߈¡Ûù×¥ÓœÁ +ưÀË%ßÄÙ³ô‡úâà …ŒÛ«‚ ½9ÅÓơê©Çï»ÿ¯¶ù×›¡¿ß¥Ù¿ô©‡¥2ßëMÛǙ۵aÛÄÓ¨ḈƲȘÁ§ô¹ÚY¸Ú«‡“Íj§Óâàƒ9ù׉ԧÔ÷ÁÚª‚ +¼9ŸŒÑÓ¡%«Ô3‡ËƠĂÈ×ƠơØ«ÔÎÔå¿ß»û‹Ü©‡¥2ßëM›»äƠ ™Á±”µØ›¾µØÏÔº9¥‡©Ó9¥‡ºׯ½Ø‹ ÛÄÓ˜‰j̃ZîS‚v ™ÓÛ«‚ ½9¶ÔçíçØ™Ô™‰kß [ïS·Ô¹Úë׃½“º߈–óĂÙ9¥‡щ“Ơø×›¶éßÖ°»½ôêª ¨ƒº5›¾ùê·‡‘×8çÙÓ¾¹xù¿»ÍÏÛ«‚ ½9Ó̉íê‚\÷†“ ßÄÙ¥ÆăˆŸù×ׯÛ×°»ĂÙÛ«‚ ½9½ù×߈̀Ăщ›¾ô·ÜÏÔ“Ơ›v¡ÛË̉¯ÈíÖ€^ăÔóÇÅÔÛ«‚ ½9±»ëÔׯí$•Èû›ÅØ›¾¿»ơêäËăơÁµØĂÙ«»ÏŽẲôưÀ™‰kß [ïS¯G‹øçđƒ½>÷‡™‰kß [ïSÅÓëöøê«‡“Íj‡Œ“†­Ä˜‡½¦Ó‡Ú÷ÚÁH׿8©‡¥2ßëM‹Ó›¶é«‡“Íjơ%§Øùt‰»ñÚƒvơÔïÚ«Ôß»ûĂÙù¿ÏĹÚÓØ߈Ù×ù׷Źګ‡“Íj™‰kß [ïSÏÔ÷Áûơê­Ä•Èû›—Ó™Ó€-ù×ĂÙÓÆ‹ÜÍƠ¨¿‰9¥‡ưÁÍÄâ&ê&è&ä&Ởóǽ·‡‘×8ç±»¹Ú£»›¡‹Üù×ÏÔÍË)éÛ9¥ù×áƠ™‰kß [ïS»ØƠ¾GÏÅéÓåŸÈÛ«‚ ½99¥‡ËÈ9ƯÓ ×Ơ†7§j¡Û†ºÑÄë̃ˆÏÔƒvćƒvÏ̉÷Á«»±»™‡¿‰ÏÔ™‰kß [ïSÙ½›¾¿Å¡Ư«‡“Íj­ÖÙŒë*«ív¹ÁơÔϼĂ#—³ôƠXÓÅ«dë‡Á¹î²2¯« ©ƒ»5Ơëöë†߈Ù×ÙÚëö9¥‡×Àù×Åį۫‚ ½9¬ơ¶§ÈëöƯƠÑÄë·Ó ¥0шơêù×Åă§Ơ¡Û«‡“ÍjµØ¸àˆ½ßÁ«Ô±»½ë½¤ˆ\0ÏÅÉĂ®™ºưÀ³·ɇ¡+¡Á߈¿»™´ù×Ù€çºßçß„߈ß»ûÛÙ»ÙÚÙ½ƠƠ¹Ú«Â›¾YÏÄÙÚ±»Ÿ}Û«‚ ½9‡ÚǼËăˆŸ;áêÿ¯¶ăˆŸ;ÎŽ½€³Ûƻ؇çÚÓÓ»ô¨À̃ˆơԽ뿉Åԋlj½èÑØ­ô“ƼÁí—Gƒ×ÙÅëå̉ ·‡‘×8ç‚Ø³Ø½ÄÓ£Ô¡ÁÆÅÛ«‚ ½9ÿÚÏÔßÁívÍÓƒˆ‹ÜÓØÔX¿(±)G½¹£Øă­ÑÓñÓ±¿Ú¹ä̉àƠµß³ÈÙ̉ívù×±»çíâै]1×Ó›¾ÏÔ»ØÅ“ˆ£Ç¹Ú½½ƒù×Û«‚ ½9ơêŸÇÖÛ«‚ ½9·̣ÏÔ«‡“ÍjóÔªÚ—ÓÛ«‚ ½9Ăª‡’̀j¹Ú»Á©¼ÑÓ™‰kß [ïS¶Å“½‰ÛÙ׋LJÇëö‡º·‡‘×8çóÔ±»ëöµØ߈½ô­ºăƯăăˆŸÂŸ}‹ÛÏ•%ñÓÙ̉·Ô߈ƒƯÚÛ«‚ ½9œ·̉ ¤0°» sáÚ–  ¦ ̀»  ỞăˆŸ;©sÛ«‚ ½9gử±ëØơ“ÈơêgáÙ½ÏÔ¯¾ù×›¶éº¨¾8¤‡åĂỂË̉ơÔŸƠéÖƯºÙY˹Ư‰©À¥ÈÏÔ£äëöáêË̉߈½¾‡±»·Ô±»ưÀǿ¤ưÀÍÄ¡Ûå̉ ¡ÈéôÏÔ˜êèäƒÖ¼ƒˆÁ½ñÓúêưÀ‘ ›»ăˆŸ·Ó ¥0åÁ÷‡ª‡’̀jå×¾̃»ú¸ÚÙÚ÷Ú¬ÖíÁï»ù׿ ëÓÙ‹¶Å¯¼§ôÙÚª‚ +¼9ÁS«ÔÏŃˆăˆŸ;ơêƠḯ“Æî‰€Á‡é/×:™‡¹ÁçÚ«‡“Íj‘ÆàöKÁƯº•Èû›‘*7˜‰j̃ZîS½®àÑæçÚ‡ºä̉ÑÄë­¾ơĂÆÅÏ̉¹ÚăˆŸ‰ÏÔ±»™‡ßÖ½€éê¬Äÿ¯¶Â¥ÛŒƠùêéßÊ֢䵨ëÓ½‚½ïÚƒvÛ«‚ ½9߈ăơ«‡“Íjú¹ öÍË)éÛ9¥ëöñÓ©¼öåĂ½É{߈ơêÁ¼“øûĂ^ăơåÏÔÏÔÍË)éÛ9¥̉̉ºÁÎ̉ ½ÔĂĂ ›­±àéM9¥‡çØÍƠéêƯæ½ôÓÔÊ÷¨«»Ç»ÙÚÛ«‚ ½9ߌÛ,¶ϼÛ«‚ ½9ù×¶‘ívÍĂÂÖăˆŸ;³ÇÛ×ÑÄë·ÔÖÆóÇ麋ÇÍË)éÛ9¥›¾çƠá꿺˹ÚẠ̀¶ƒvÛ«‚ ½9ͼ½Ü™ëé嘉j̃ZîS°¿ +ăˆŸ;ßÄÙºå×âˆ:ëÂÏÔơÖ÷Ôáêùµ•Œơê¡Ôå̉ ß ǽ¹Ú·Ô™.ù×›¶é·ØÙ½9¥‡‘Ö߈óÇß»û߈ñƤÛå̉ —%óÇÿ¯¶áÚ«‡“Íj÷ÁĂÙˆÍÓ›¹ăˆŸ;ä̉ ÈÂÿ¯¶Ϻ±»×ηԗӯș‰kß [ïSÏÔ›¡ôê“á“Ǻ«Ú¡È¯È½ĐÓơèÅÓÔ߈¡ÔÓm­Ôÿ¿‰·&Ù½­ÄÏ̉¯ÑÉ»½ÂÙ±¿™‰kß [ïS¹Ú«ÔÆ +°»§ÔñÄÁÛÿÚ™‰kß [ïS±»ăˆŸ;ÿ¯¶ׯ¹Ú¡È«‡“Íj«‡“ÍjÛ«‚ ½9ÛÀª¼·̣߈󶫇“Íj‹Çëß9¥‡×ºÅÓƯÚƒ×éăˆŸ;§ÔăˆŸ;‹ÜÂÅÄÖöƒÑÓÑ÷›Ú±»ƒvå̉ ÓÆ‡ÏÔ÷ˆ‡ŒÛ«‚ ½9ׯ±¿Ù-‰đåĂÙ‡Ï9…›¾ù׫‡“Íjù×Ï̉߈‡xơÔ›¾¡Ó¾ăˆŸ™‰kß [ïSăˆŸ;¹¾Ϻ½Ă¨¼ß»û§ô˜Á™Ó߈«‡“Íj߈μĂ¼Æîÿ+Û«‚ ½9ù¿ºù×íÆæºơv¹‹!›¾߈ù×ÙÅëÏÅÍdž“§ÔÏê¹̃ÛºöÙÚ“÷ÆôñíȰ»™ÔÄÔáßÚív,Û«‚ ½9™‰kß [ïSö—»¯¼ï‰À½ƒv›¾›‡‹Ü‰ºăˆŸ;kÛ«‚ ½9Úª‚ +¼9·È‡“í~á ÿÚ‚Û׿èÖÏÔÛ«‚ ½9óµث‡“ÍjÙ½çÆ½€Ăô‡ÇÏÄƠå̉ ±»µØ¼Ô™‰kß [ïS߈ăˆŸ;âÁÙ×™ÛÇØ˹†“ ß»û«‡“Íj¾™‡ÙÜÅØ°»©ĂÙ£X´È˜‡Ù½½ƒÔÅ…Ă÷ù×ï³2Ù½»ÅÏÔưÀÛ×ÍÄö½º°»«‡“Íj±»§ôƒv¿»ưÀăºùơÿ§đ™‰kß [ïS«‡“ÍjÅô™‰kß [ïS9¥‡ëö·‡‘×8çáÛÑ·öÁ‚vÑÄëÿÛ¢Xÿ§ë’ëö©‡¥2ßëM߈ëöùשÓÏű»½±ºëÓñÁ±»ñÖÛº™‰kß [ïS¿̣ÍĽଶ­Ä­¾ïiÆĂ«»ï$ÓÅăˆŸ;kÑÓ߈¤ˆ\0ͪëö³÷Á9¥‡‘êăˆŸ™‰kß [ïSÏԇǿßÙ½ô‡ăˆŸÁ ¡Á­¾™́Û«‚ ½9Ÿ}±»‰yù×Ă#¶ÏÄưÀÏÔÙ½Á½¹ÚñÓỞÏÅ£ä÷Á£»ÎÄ9¥‡ñơÔ߈ñ×Ú °»Û«‚ ½9ƒv›¾ơĂ¡Ûƒvï³2áêß›ëÔĂƠ‘ÆóÓÎÅ‘gÓ¾°»½ăˆŸ;™‡×Ơ†7§j«‡“ÍjăơƯ‰Û«‚ ½9ר‹Ç›¶é«‡“Íjш±¿ñÙ±»ñÖ½ëöơÔŽ«‡“ÍjóÂÛ×³Đ«dÈÙ±»ăˆŸ;‹Ç—¶™ÛñÚÏÔ« ©ƒ»5ÏÅÙ×ߌ¡„ù¾«‡“ÍjăˆŸ½®¾GçÚ·ºïÁ±½³Ù½ø¿«Ñ—¿Åô½Ă±»¡Ôˆù×ÖŒëöñÚøêßϹÚ߈ÇĂä×ăˆŸ©-³z™‰kß [ïS¨ØÙÚŽóÇëöÏÔÇÖËÉ9ûÓ È¿‰§Æ§º½߈·Ø±»߈±»Û×Ô]ö±ÁÏÔƠX·Ô¿ô«‡“Íj¿Åµ‰ăˆŸׯ©ºßÁĂÙ˜Ô³(ÙƠ­º§±»³Âơê•Èû›ù׋Ǚ‰kß [ïSµØüÁ•Ó¡ÛçÚă»Ơü×›¾€% +ß»ûñ³́Úƒ½§ÔµÑ¿ßù׫‡“Íj½›¾®×ÏÔÁ½©ÇưÀăˆŸÑØ÷Áï½ơêƠ‡ñ5ăˆŸ‰¿IÛ«‚ ½9ÿ¯¶¬¶™Û9¥‡±»±¿Ă¼ăˆŸ;—¾Ÿ}ÏÔÂÙƒˆ‹Çù×߈÷Áщ›¶é°»ùê­Ä±»ù×ƠX‘çăơ«Ô9¥‡Ϻ£äÎÅíÆÅ %ñÓù׳ÔßÁ™‰kß [ïS¾íØ߈ñÓ÷ÚÙ÷ÁÏų(§ÓĂº›¾£äØ×ôÏÅ÷Ú‡“±»ï½ñÚ¯ÛÙÚÛ«‚ ½9ÙÚÔX“ÈƠXéêÏÅù×ÏÅ¡ÔÁ½§Ô«‡“Íj‹Ü±»ÇÖ©‡¥2ßëM̀ÓÇÖ°» å̉ ûØñÁ³Ç߈Ù½ƒvµØúĂăàÍË)éÛ9¥©Ó¬Ö•×¹»÷4Ûºƒv™‰kß [ïSïƠ×Ơ»ĂÏÄ}ÿ§ÿÚëö×¹½¹Úë ߈“Ơëö÷Á¡ÁÅÓëÔ퇰”Ï̉÷ßƠ‚™‰kß [ïSăˆŸ©ØÙÚ±»¿‰‹ÜÙ½Ï̉ÿ§ƒơê¹Ú‘ÆÙ½óǽ„ööÏÔ“™ơ»‡‡ñ5¯È½̃ˆè%áêñÚ™Áöôëö—ØĂÙ£»˜ơÏÔ…ÖưÀ±»ÙÚ±»«‡“ÍjöÁå̉ „ô¡Ôë‡g¼È¾ºáÚ¼Ô ăˆŸñÓ™‰kß [ïSÛ«‚ ½99¥‡©ÇƠáƠˆÚª‚ +¼9‰y»½™‰kß [ïSÛº«‡“Íj¢äÊÇăˆŸ;ƠÏ|•{ƒv’Èơ‡߈ößÁ÷ÔÏÅôĂ³ȶ¿»ẳ¹Úèêù×ơêĂ¿ß…ỞŰ»í½€·̣ôÄùÛ«‚ ½9«ÔÅÜà=щÏẠ̈Ç·̣Û«‚ ½9¡ÔË̉§ÆÉĂßÅùơÙßÁăˆŸ;«»8¤‡©‡¥2ßëM¼ß»û½µØ«·3uUĂƠëö«&å̉ ˹Û«‚ ½9÷‡ñƒv½Ü›¾³ºóÁ‡é/×:ÿÚäñç'«’÷ÁâàÍ©‡¥2ßëM½ÿ ¼¡Á¤‰̀L„«Ô߈¬Ö¡Ô#Ë4ä̉  †ŒÙ½§ÆÛוÛÑÓ—¡ÈµØÏ̉ĂÈí—G9¥‡ĂÙö«‡“ÍjÅØ­vù×ï»á¬Ở÷ÚơêĂ—ˆ™‰kß [ïSù×ăˆŸÚª‚ +¼9ÁƯÀ¼öÁ¯ß¼ë´ÜÙÚ ËûßÖùׇä߈߈¯ƒßͯ¥'=U#QùẦÓ—ˆ9¥‡Á̉¹Ú¿‰…Ô½˜êèä±”×°Ö¾«Ô߈ÁÍß™‰kß [ïS½“ºéÓëöÙ÷ùêÏÔÓÁ߈¥ˆ]1ƒvëöäĂÇÿÚÓ Ù½Ï´±‡ĂĂÈÙ½¡ÈËÉ9³ ©ØƯÓ ù×¥ÆÉ߈Û«‚ ½9±¿¼ëÁÜå̉ ÏÔ›Úш‡ŒÛ«‚ ½9Ơ©‡¥2ßëM±»ÿ¯¶ù×ÇÖÏÔÁƯ‰Ô}ăä·Ô›·Ôϼëö™ÁåĂ¯Ø§¹ï»Ù½ÿ¯¶¶‡Ö8æñÚ¿ô“Ơɇ›¾“ƠÑæñÖÁ½½µÈ߈«‡“Íj×ươúöÁ‹Û«‚ ½9½ƒĂĂ ›­±àéM̃»úí—Gö£ä­Øß»û·Ó ¥0ößô»ßÚ¿‰©›é$§Æí¹¶ôŸ%ôêÛ«‚ ½9ƒỂÏÔǺ¼°¿¹Ú·ØÔSù×꼃vœ‡‰ÛÀۻث䙇ñÓÚו¡ÔÛ×éê³½ăˆŸûÓĂ¼ƒÖÿ¼›¶éÛ«‚ ½9™Ô˜ơƒØô¯́v¿‰ÏÔ¨ÜØŒê*ª©‡¥2ßëM«ÔăÁơÄ…÷ÅÔûËÛ™ÑÅ™‰kß [ïS9¥‡ÏÄÙ½¸¼‹ÜÏ̉ơăvßÏ̉™‡ÙÚ±ëØ»ØƒÚÛÀÁÓØÄ–á «­¯ÈăˆŸ;±»«·3uUăˆŸ©ØÑØ©‡¥2ßëMåß½€ߌÛ,öÿ¯¶ó‘ñÙŸ}Ù½ë Åêö9¥‡¿Å¹ÚÁÇñ5É6ăˆŸ;úÙ×ëÔƒˆŸÖ±»¼›¹Ѷ«‡“ÍjÍË)éÛ9¥ÑÓ߈Ù½›¾ÑÓ·Å«»­€Ûø×&Û×Ù½ׯưÀÜƒÔØŒê*ªĂ çÚßÚĂĂÙĂ¼¨ØÛ«‚ ½9½Ù×·Ôº¼ÏÔă»±»«‡“ÍjÁ̉ÛÂÛ«‚ ½9°»ívù×ÏÄË¿±»ô»ˆÛ¡Á«»·‡‘×8çÁĂÇĂ™‰kß [ïSÅÓåÁ™‰kß [ïSÇÖÏÅÅÓưÁ­åÏ̉Û«‚ ½9˜‰j̃ZîSé껽™‰kß [ïSÛ«‚ ½9ÙÚ›¶éï³2ÖÓ©¼ÿ¯¶÷£»ïÚ§ñĂÏÔ•Á¹½‡“ÑÄë™ëéå©Ơƒàχ±¿ßÁóÇí—G£ 9¥‡â¶ñ‡½¾‡ÙÚÚǽï»ù×ñÄ©ºçÚ±¿ăˆŸ;±»«‡“Íjë„«‡“ÍjơèŇڷ‡‘×8ç¿‰ăˆŸ;k±»­Ä·Å½ĂÙχçÚÏÔÛ«‚ ½9ÍÓĂÁ ‹ÈăˆŸçÚÍÓ³ÿȹÚéêÿ¯¶Úª‚ +¼9Û«‚ ½9‡ŒåÑǺåĂï½ĂÙûصث‡“Íj¡ÈÇÖ½ëöÍƠ9¥‡ö±»¹ÚÛ«‚ ½9™ÔƒˆưÀ¥ÆÅÔ©ÇÙÚÓ̉«»ÙÚ¹ÚÛ«‚ ½9ÍÄßÁéÚăơù׃ØêÚª‚ +¼9ÙƠơêÎŶï íÖ÷Á‘Ƈ“́Á «‡“Íjù×ÙÅëéïơ»›¾çMº¡Û߈¿‰¿»½ö9¥‡áÚáƠƠƒaº߈§ÔŸ\ƠX±»ẰƒˆÏ̉ÓØûØÙ½¡ÎÔăˆŸƒÇ̉ÑĂ¾½ơèÅù×½ƒă‘·üÁ‡¾¡Ô¯×Ù׿ơêÏÔÆù×›×Ù½¡ÈƠX™Ô}¬Äö߈«‡“ÍjÑÓÛ«‚ ½9“Ơù¾·Åш¹ÚÛ«‚ ½9½€«‡“Íj÷Áâj°¿Ï̉ˆÛÀùêµØăơ™‰kß [ïSŽ۫‚ ½9ù×¥ØÛ«‚ ½9ˆĐçÚ£Ô™‰kß [ïS¹Ú탽߈ÙÚâê…»ÜÏÅÚª‚ +¼9óĂÏ̉ÏÔï½»ØçăˆŸ;ƒv±»­ÄÏÔÛ×±»ƒv©‡¥2ßëM½³ÆÁËÙ½ù×Ř½ôºáêÏPĂÙŸèăˆŸƒvÉƠÍÄÏÄëöëö‹ÈáƠ¥Ü¸ÚßÄÙăˆŸ;ÓÅ•¾ÅÓƠ×Û«‚ ½9ÿ¯¶©Ç·§D ‡Œ­½¼Ơ±¿•¾ơ꿉ĂâàÇØ߈« ©ƒ»5½ívưÀăßǻ§Ó9¥‡ưÀ匿NÎÅÏųȇÛơêÓ·ÅÙÚÛ«‚ ½9ÙÚÁ‡é/×:ùÙ‰¿IưÓÂÙ‡å̉ Ù½Åô£ÇÁƯáÓăäĂĂ ›­±àéMưÀñÓëöéê׺ÑÄëÛ«‚ ½9Û«‚ ½9—»ÁĂƠÏÔÛ™‰kß [ïS…Ơù×Û¹–¾ƒvưÀ©‡¥2ßëM¥ÇÿÚưÀ™‡Ó¾¡ÔœĂ ›Ú9¥‡×ĂÙ÷»ÏÅ¡Èß»û©Ó˿۫‚ ½9ƒvÛ«‚ ½9á‰Ơ³¹ÿ‡¡Èùט‰j̃ZîSƒÚ‡Œ•%ÛÿÚª»Ó)Ó‹ÇÏÔ™‰kß [ïSƒˆ9¥‡ĂĂĂƠÑÄëµØ¿ÅåÏÔ퀟|ßÁơĂª»Ǽ™×ŸÅö½×̉¶‰µØ÷äáSÏÔ›¶éÏ̉Ô¾¹Áù׫‡“Íj¾çÚùơ±»·‡‘×8çƠ´ßÖÙ×ÿ$¿‰™‡߈ÙÚÁÓÉ̉‡ºăˆŸÇ¶ôIÇûÛ«‚ ½9÷Á©º§ÔƠ‹ÇÿÇ·̃ƠÙŒë*«±»’Ȫ‡’̀j»‡ñn·̣ÑÀÿÛƯº‹ÜëöÙ½₫®¶³ºó‚¾ÿÚÓµa·̣Û«‚ ½9߈ưÀ½«Ôß„íƠ½’¹6ÜN6ëÓ—Óƒv™‰kß [ïS8¤‡߈Ơ˜‰j̃ZîS¹óœÜÿ×™‰kß [ïSÑÄë±»ëöר¹Å·‡‘×8çÑË̉¿Å™‰kß [ïSơÔß„ùוŒÿ-Èù׿ơèŧ±ăˆŸ;œÔƠºm±Ưô“ƠÛ«‚ ½9ưÀ«ÔăˆŸ;ÙŒë*«‡«Óÿ$ƒvó¹ù×ÍË)éÛ9¥±»ù×ăˆŸ;ƒv™ëéåÀ½#ƒ½Ưº¹ÚÿÚ9¥‡ơÛÁ̉ËÉ9¿‰ù×Å›·Ô»~±”‹Çʾ‡ŒƼ›×¿Ù•Èû›ĂȽ·‡‘×8ç§Ó©ÏçÚđ¡·‡‘×8ç§ÔÛ«‚ ½9ù×™‰kß [ïS™‰kß [ïS—¶±»«Ô­ÄÆơê—¶«ÑíêơØÛ«‚ ½9›¾Û«‚ ½9¾»щ±¿±»Û«‚ ½9Úª‚ +¼9±»™‰kß [ïSù×ăˆŸ;kéºå×9¥‡ëÓ¤Óï™ơêÛÔßÁưÀ߈Û«‚ ½9Ù½ưÀù×½ÁÿÇ×̉åĂÙáÿ·˜ơ·ĂăËÇ߈áëöÍË)éÛ9¥ÏÄ™ĂÏ̉£Xù×ÅỘÇ߈ùơăˆŸƯˆ߈ëÓù×ÿ¯¶¶Üù׿÷ÁÜĂ«Ôù×ù×߈Û«‚ ½9ïÚ±»«‡“ÍjƠÈ*Û«‚ ½9ù×߈ôéé‡ñÚăˆŸÑÄë½ÿ‰ë”‹Û«‚ ½99¥‡×߈˜‰j̃ZîS—ºæ̉ɇñÓôăˆŸ;ÏÅóá ûºÏÅ‘ÖÛ×çºÀĂ߈Ơ Ù¡È«ÔÛ«‚ ½9·‡‘×8ç°»ñÖ­̃ÿÚóÇ·Ô™Ó»ˆ8¤‡Ư÷Áù×ëöÍƠ“Í©‡¥2ßëMù×™‰kß [ïS‹Ü½€ù×ÓÆÛ«‚ ½9ºÅÏ̉ƒ½öơÔ±½Ă٣䃳‹«‡“ÍjŸØûÓĂÙœÁăˆŸ¡Ư߈¶ÍÓÏÔơÄ÷ÁƯºÿÚëÓµÅÛ«‚ ½9…ôÛ×ăˆŸ;ɼôô߈ºùê°êØöÁ߈ăˆŸ³Åá Û«‚ ½9ö¢ä®È±‚àÓáêù×¹ÚñÓ­)Û×¶“¹ƯNÏÔ±»´a±»ù×áêÇÓÅÏÅÛ«‚ ½9Ă³ÂÛ¹ó¶́vù׳Âù×Ûºù×¢ÂÁĂÈ»ù×÷‡½€Ù½åôшù׉¿IåĂÏÅ9¥‡§ÔÂÙ“ÆưÀÛדȧÓơê±»ùړȾŒ¾9¥‡¯ ùä‚öÁçÇåĂăˆŸ;½€¹Ú¡ÈÙ-›¾™Ó—»Ïĵ›ŒưMÙÚ¡ƯϼŽîƠÙçÚơÄö’ȱ»ÅÀ•Œ¥ˆ]1đÆưÀ©¼½ÍË)éÛ9¥߈«â˜êèäËÉ9רÏÔÛưÀ˜‡ÙÅëëö±»¢»߈ÏÅù׃v¿ôë‡߈Û«‚ ½9ÙÚëö¡ß™‰kß [ïS«‡“Íj±»ÏÔË̉%©‡¥2ßëMñ%ºù×óǃv¤ÂñÓÊÖ‰y퇽ôæÚ׿89¥‡Û«‚ ½9߈›¾ñÓÑñ»ï½“ÛÁƯáêÿÚ“ƠăˆŸøæµØ»Á³ÈơÔ²zÍƠºơêíêë¼·Ôµ‰ï‡߈»$Ÿ—¶­ÄÏÔÙÚ­Ä™ëéåÍÇă‘·́vߩذ» ­Äƒ½ùêÅÔ¶Ô éơơỖˆÅ–‹Ü›¶éŸÛ‘«ăˆŸ¼€ơèÅưÁùëăˆŸ×¾ÍY«·3uU÷Á™‰kß [ïSϺöơÔúØ ù×Ö¾8(ÁăÙ½¿ô“ÈÓÅéÚù¿щ¯¼ÿÚĐÄê߈¥œ¹ÚÓ¼½ôÁ±ÜÉ=ÉÖ‚vÀĂÏ奯ÏÔ°»ÿÚù×щ×Ü™‰kß [ïS£‡ÑÓç̉§·ª‡’̀jÁ—Ó¼ëÏ̉ƒ¬¾£ØöƯơ»Åøê™ù×ÅÓæÇ¡Ơ™‡ÁĂÏÔ¯Ơ™‰kß [ïSÑÄëÓØ߈™‡ÏÔÏÔÍĂÛ«‚ ½9¤Èƒµôëö‹ÅÙ-‡ÛéÓ9¥‡×÷Á¯Ơø×Ơ±»¹Ú·Ô߈ÏÅëÓƠÅØ±»§ƠÏÄ™‰kß [ïSëöùꙉkß [ïSỞ—¶ăˆŸ;k°êØä̉ÏÄÛ«‚ ½9“¹ƯNï»±»íư»çm®Æ¹Úß»û™‰kß [ïS¾ß™‰kß [ïSªÚ™‰kß [ïS²ÂÆ~æÚåôù×Û«‚ ½9ÏÔù×ÏÔ±¿¿£ÑÓÏÔëöÿ¯¶ÏÄñ»ƒ‰º™‰kß [ïS±‹Ù³ºó—¶¿ôÛ«‚ ½9™‡Û«‚ ½9ï½ͪ”»ăˆŸ;—»ù×ÅôáƯ½‡ä«»ù×ăˆŸ;kшÛ×÷Á¿àëöÑÓ±»ÿ&ñÓÔ¹Ú«ÚưÀÑÓ«‡“Íjÿ¯¶ºù×ù×ÏÄơÄÏÔívÍƠëö9¥‡ù×Å»·‡‘×8çƒvÈĂ÷ˆ±»øê©ÓéÓ¼íÛ¾ßÇ%¶đÖù×ßÏù×ßÄÙ·‹½½ï½ßÁ£äÏÔ¯̀ĂôÀ¹ŽÑÓ‚vù×Û«‚ ½9ÚÄ̉±¿½ëÚ¼«‡“Íj˹½®é¹Ú°»ïºƒv߈ơêÅçÚ±»©ÓÆù×ƠăˆŸ;k±»̃ÄØ¥ˆ]1ÍĂ“º±½Ù‡x¨ºóƯëö÷ÚÏÔñ¨ùêñÚ˜‰j̃ZîS«»°»›Ú¿»ÙÚÎÅăÇíơꘉj̃ZîS±»ơúÍÓ­Ä߈·ÔĂÈå̉ ₫ÂëöÍÓÓØé‰ñ5ñ·Åƒˆ´ÅÏÅ¿Œäơ§Ó°¿߈ù×½½€Í„ÅÓÏÔÁåĂà­ÄƒvÏÔ·Ôù×ÍÓŸóeơêÑ·íÖÄù×ë“¡È›¾ívÓØßÄÙ«‡“Íj«‡“Íjö¿»G½¹—Øù×Ă$±»«Ô÷ÁßÏß»û°»—»‡ñ5É̉ëÔ€ºÊÈ9«‡“ÍjÙÚ˜‰j̃ZîSßé™Ó¹Ú·ØÛ«‚ ½9¹ÚÛºÙŒë*«·¸¾ÏÅ™‡ăˆŸ™‰kß [ïS£äÍĂù×ß»ûÁËSơÏÅùêÛ«‚ ½9ù×ăˆŸ;¯ƒ« +>ĂÙ¹ÚÏÅơê­Ø«ÔÁ‡é/×:Íăv¸ÁÏÔÏÔ9¥‡­)ñëö¹ÚñÓ¹µ·ºù×âà,8¤‡×·‡‘×8ç½™‰kß [ïSăˆŸ;kÁ½½€£¿™ÁÙÚñ‡«‡“Íj¯¾É̉ƠÛ«‚ ½9‚½ÑÁÓÆíê³åù×߈ÅӱȷԟØÛ«‚ ½9ù׳۫‚ ½9«Ô½€Á̉ỔÛ«‚ ½9çÚăˆŸÛ׫ԗ¶‚v´†ƒÛÂÂÙÁË¡%ÀĂß»ûÉ̉Žº½±»˹¯(ÙàăˆŸÖ¼ăÿÛáêù׃ØÛ«‚ ½9Ÿ±¾ĂÙ•Èû›¹½™Ó•½‚EÏԳǗӮGø¶ùו¾ôÔÿ…ö«¾ƒvª‡ ’ ̀j ăàá=çÚb¡Ưç̉Û€ÙÅë퇙ә‰kß [ïS¯Èï»Ï}ÍÓ™‰kß [ïS‰ÛÙÜóÇÙ½߈–¾Ç؃×8¤‡ÑÓëöµØÇÖă½‰¾ñÙ‘±¿±»±»8¤‡ưÀ‡«‡“Íj“¹ƯN¬¼÷‡߈ÏÔ·Ôù×ĐÅåÁψÿ¯¶ôéôÛ«‚ ½99¥‡ƒvÛ«‚ ½9Ù½Á_ß%·‡‘×8çÅÄ™‰kß [ïS°»Á¯ƒßͯ¥'=U#QK¯Â¹±ôÓØÏ̉íÆ·ÔÁÙÚ”ŒËÉ9߈ÿÚ¥Æ߈Û«‚ ½9éÓ›e÷Áù×½½÷ÙÅØĂÙ¾ĐÓ÷ÙÓµO«Ô•{Ñæ¿ÅƒvÏſث÷™ôÛ×9¥‡±»ăˆŸ¹Áö“Ơ±»±)¹£¾›¾íÆçÇóÔ¶߈«‡“Íj™Ó(…ÇùôÏ̉«‡“Íj÷Ç«‡“ÍjÓëÔ¯×ëö«ÔÑÓٽ߻ûרơûëöÑÓÏÔÑÓ±»Û«‚ ½9›¾ªÈơÔ’¹ÜNÏļ€×"£äµ.¥ÙăˆŸ­¾ÅضÜÅÄơĺÁƯ߈¡Ơ‡ºÙŒë*«ăˆŸÏÅëöˆƠăˆŸ;k±»«‡“ÍjÛ«‚ ½9óñ»Û«‚ ½9öÿ¯¶÷Á˜‰j̃ZîS‡x¾ßùº™‡¶‡Ö8æá̃߈…Ơ³ÙÚÏŵسºó«»¦ÔëöÖ ÿÿ¯¶ßÚ…Ô•Èû›«Ô¯¾ËÖ½¾‡ûƠƒÖ¿‰¥ˆ]1߈ÎŽô³íÖ“Ơ9¥‡ëöô»‡Ú™‡êÚÏţعÚĂĂ ›­±àéMª‡’̀jóÇÙÚÙ×Ó±ôÙ̉ª‡’̀j™‰kß [ïSëö½ŽÛ«‚ ½9Û«‚ ½9ƯÓ ÏÔ‰ÛÙŒë*«½€¹Úü*¦**†*ăˆŸé‡Û×ÈÖ£»ÅØù×Ơ›¶é½ÙÚ¬¶ÁƯ¬ÖÛÄÓÑÓ±»Ñ¬È·‡‘×8çÿ.™ô™‰kß [ïS·Ô×ܾùêăà›¾çÚÀĂƠ9¥‡ÑĂÏÔÅôÛוÈû›‰¾Ûº£Øº³Â¢ä +ưÀ§ÆÏÔñÓÑæÅÁá=ëöÏÔÍË)éÛ9¥‡Œ™‰kß [ïS€Ơ™‰kß [ïS…Ơ©ÇÛ«‚ ½9¹ÚÅÓ¹ÚÛ«‚ ½9±ó|ëöéÓáêßÚË̀¯àƒvÅØù×ĂÙ½½ÁÑĂ“½·Ø˜ơ©›™Ô´†ÅÓƠ¶·ÅăˆŸ™ÓÍǹÚăˆŸơÔù×ĐÄêăˆŸ;£öÙÚÏÅö¹Ú“¼öÁ߈́Æ™‰kß [ïSưÀ·Ô½Ó̉•×ƯÓ ă»߈›¾ƒ½ŸÈ¹ÚơêÛˆ‡“%ôâơƯ¹™ÁƠñÖ»ØăˆŸÁƯđÙÑÙӷư·€°»›»ÇÖ«Û±»¹ÚÙ½ôơĂá·ºÛ«‚ ½9ơĂưÁ™‰kß [ïS¼«‡“Íj¼Èéê·‡‘×8çơêáêå̉ ×Ơâˆ:ÖÆéÓ½ƒˆơꘇñÓÑÓÅ»9¥‡×±»Ÿÿ¹ÚŸè¶ô÷ÁđÖßÚ›ÿèêÓÅåÁ­ÖºƒăˆŸ;£äÙ½ϼƒ×«ÔùêĂĂ ›­±àéMÅÓÙŒë*«߈źƒvó#¿»†wâˆ:î»ÏÔ—»ƯºÛ«‚ ½9¿áØéÓäăˆŸ;ÍĹÚÛ«‚ ½9Ï̉˜‰j̃ZîSà×ÛZ£ÇơêÙ½ÅÓŽù×£X‚v«‡“ÍjÑĂÑ·ùêÙ½×̉ª¶2tTÏÔ¬¿½Ô©‡¥2ßëMẲÙ׫·3uUÛ«‚ ½9ÿÚÛÄÓÆơÄ·‹˜‰j̃ZîSơêÑÓÑæ‚vá •Ü«‡“ÍjƯ­v«‡“ÍjË̉ÿ±Qư£°»ÿ¯¶߈«·3uUÏÔ«‡“Íj»Ø˜‰j̃ZîS«‡“Íj¡ÛĐÅÿÚç̉¯ËÁƯ‹ÇĂó×̉Å©ăˆŸ;k»ØËÖÔ™‰kß [ïS͘ÆÏÄÙÚÜ߈óù×…ôƒÚ™ÓÍË)éÛ9¥¿‰‚vµƠÿÛưÀ¿‰G½¹Å½ôơºÙÚµØăˆŸÙ½Å›¾«‡“ÍjưÀùרǙ‰kß [ïS¡ÔÖÆơÔ¿ÈÉĂÏỖ½ ĂÙÅØ­Ö™‡£XÎÅÿǶM©‡¥2ßëM«‡“ÍjÑÅØÏÔ…‰»ß™ƒ×÷ä5̉Û«‚ ½9ơê‹ÜÿÚ±»ƒÖ‡Œ¡ÁËDZ»±»ñÓù× ÊûôăˆŸÍË)éÛ9¥«‡“Íj¬Ö ‡º½«‡“Íj½³ô½Ăù׫‡“ÍjÛ×Û«‚ ½9ÅØ‡Çă»ëö¥ˆ]1ôÏÄơÔ÷Ú“ÆÛ«‚ ½9ÏÔÑÓª»…äÙŒë*«ÏÅ‚$₫á¤ăˆŸ;³Ơ±½Ô󛾫ћÁÓº¹Ú—ÓÄô¼€µØ¯Ơ¶ƠĽôô𻑫³ÈĂÙÏ̃½Úª‚ +¼9»‡¡Û‰¿IỞ©Ùº±»ÙÚ9¥‡ŸƠăÁ¿ù×™ô¿³åĂ«ăà“‰øÍĂÿ¼ÙYù×ùê߈ר›¶éăˆŸưÀ›ÚßÄÙ£Ç̀Ê)èÛ8¤ƯÓ Ûߺ Ö†‡ü2߈öơĂÅ»µØµaçÚîööŸĂ°»…Û¹ÚăˆŸ;Û«‚ ½9¸Ú·‡‘×8çÙÚ”{©‡¥2ßëM‡̃‰Ôß»ûñÓăˆŸïÚ₫‡Û準ˆ©Ó—Ú«‡“Íj·ÅºËÖĐÄêÏÅÑÓ•¹™‰kß [ïS«‡“ÍjÍÄƠ÷Ùᬅ¾ôÅÛ«‚ ½9ºÁ‡é/×:¸Ú µaßƯ…¤˜êèäç`Ù½±»ñÚù×ÓØ½€ăˆŸÿÚÇØÅà“gµØÀƯïôʹ÷Ù³ºó߈£‹ăˆŸÛ¾Ở§ÓóÇ«ÔÏÅÛÄÓúƠ9¥‡©Ó¡Ô«‡“Íj·Ôü̉ +™‹ßƯ±»³±»Ƽ߈‡xÙÅëäÁ›¶é̀Ê)èÛ8¤ơº™‰kß [ïSÏ”‰¿IÁƯ…»ưÀèê÷ÁëÔé·ï½¹ÈơêщÛ«‚ ½9§Ô“Ƚ€™‰kß [ïS™‰kß [ïSùºÛ×øÜ›Ú‘̣«‡“Íj“úÙï³2ª»…ôçôÛ«‚ ½9ÏÀÙ½™‰kß [ïS‹Ü“ȿӗÓÍË)éÛ9¥ÓăˆŸ;‡ŒǺÛ«‚ ½9ÏÄÛ«‚ ½9G½¹ăˆŸ8¤‡ÖÍƠơêá=€Ơ­¿§·Y×jÛ«‚ ½9¹̃§Ô¯È÷ÚƒvŸ²ơêÛ«‚ ½9©¼«ÑăˆŸ£ä¯Ơª¶2tTƯÓ ÑØăˆŸ;ÙÚ—¶«‡“Íj´êÿ´ĂÙ÷Á¯Èù×ÿ¯¶ÓÅïđƠª‡’̀j¡ÇưÀ™Û«‚ ½9³³ºóÙ½ÍÓÏÔ“ºå̉ ñÖ³ËÉ9û!ÍÇ•½Û«‚ ½9§Ó÷ÙÛ×¹Ú›¹ư‡±ù1³º–ÓiñÚ„ưÀÛ«‚ ½9½ôăêÏÔ‡Œ‹É0ˆÂăˆŸÿ¼å»ñÓº¾æÇ…¯Ơ€ÙÚ‚ÖăˆŸ߈ª ¨ƒº5åƠ—ºơÄÛ«‚ ½9¹¶߈·Ü·ÔÛ«‚ ½9íÁÚÄ̉•}‰½ù¾åˆÏÔ§àÿ¯¶×Ü«º®Gø‹È«‡“Íj߈÷‡¡ÁƯ‰“‰3Ơ,ùÿ¯¶½ôƯåÏŧÓÅ㻑©µ.¥Ùëö±»Û«‚ ½9å̉ ơù×·Æ™‰kß [ïS×Ơ›Ú™‰kß [ïS¯È·ØÿÚÓØÅÖ— ™‰kß [ïSĂÈĂĂÏÔăà˜êèäÅØ¡ÛÅÓù×ÙŒë*«ÅÓÓ¾ÏÔ—ˆ™‰kß [ïS›¾½€±»áÓó™‰kß [ïS‡Œ•ŒåĂƒvÿÚ‡ö½ưÀµØÛÄÓơÄ™ÓưÀưçŸ}ó™ÖÆ5±»ƒ¾‘Û«‚ ½9ªÔƒˆ!ÓØ¾ÏÔ·Ü™‰kß [ïS9¥‡¿‰™ëéå½ö¶±”µØßÁ¸Úív™É»ØăˆŸ;ù×¥/ᬗ¶«»ưÀù×ÙÚÇÖçÁ‚À×Û•ŒÙ𫇓Íj‡½Á¹G½¹˜‰j̃ZîS«‡“Íj·‡‘×8çùדɶ¾ÿ¯¶½¡ƠëöçÚư7¾ºÑĂÓÓ¬¶ĂÙÿ¯¶éê¡ÁÙ̉‰ÛÉ«ÔÎű½§/°» ƒØ߈™‰kß [ïSĐÓ§Ô£»íê«ÔŸÜ¨vÏÅ™‰kß [ïSÁĂưˆöéêù×ơ莀ƒÍ’9¥‡Û×ĂÙÚǹÚׯ«‡“Íj£Ç„Ö¡Ôù׸Úå̉ Û«‚ ½9ºØÛÄӵؙÁûĂ#÷‡ù×Ăƒ¾‘«ÔÅÁ£Ôù×⻩ÇËÉ9Û«‚ ½9áê¾Ù½ăˆŸËǫԙ‰kß [ïSÙ½ÓØï½éê¯È•ŒïÀׯ¹óÏ¿ñÛ™ÁÏÚººăàĂÅ––Û£ä«Ô·Ø«‡“Íj³ÈÑĂ™ëéå›¶é‹Ç±»½ñÆ­Äù¿¦Ó¨¼ÏÅóÇÑð êØ ·§D ‡ŒóÇ™‰kß [ïSÓÔ Û߈ÿÚÛ«‚ ½9Å»½±ôµ†ÓÅÂÙ‰Ûù×ËÉ9«·3uUîD‘«‡“ÍjÿÚù×°»—Ó߈­ÄÁ¼Ѷ÷ÙÍƠ߈ŽÚÓŸÈơêù×£µëö³¢È™ÛÛ«‚ ½9µaƒv©¼Ó¾™‡º«ÔÛ×™ỗˆ¥ˆ]1Û×ßÄÙ߈ƒ¾‘‡Œù×½Ôñ×ï½9¥‡ăp©Ó§Ó™‡•½Û«‚ ½9•»ÿÚ³àﺹڙëéåÍÓ¾ÓÆ±¿ö­ÖƯ ‰¿Iå̉ ˜Á¿»ƒvÙ½¥ˆ]1Ô¾Fù×½ç[£ÓÅØívÛ«‚ ½9±»½ØÿÛ˜‰j̃ZîSÅØăˆŸ;k‰Ô™‰kß [ïSơêÍÄ߈êØÁ½ÑÓù×9¥‡“ƠƠX½ôƒˆ±ÈÛ×ơèÅÀ÷‡μ9ÑÄëĂÙÛ«‚ ½9Íß±¿œđưÀ¡Ûp¶«ÔûÙÅÄù×ÁĐÛÔ÷‡½³ÿړƼ™‡ÅïăàưË›¶é̃ŒÚ,çÚÏÅÏÔ¹Ú¹Ú¸Ú÷ÚíêÀ½ăˆŸĂ€ºù×Á×ͼµØƒÔåô¼ÏÅ«ÔÿÚ©&ăˆŸ;úb©Ø«»ƒÖƯºñÓÛ«‚ ½9¥ØÙÚ9¥‡ñ·ÅÛ«‚ ½9°» +À̉ «»±»˜×£ŸơêăˆŸơÄéÓ§ÀơêÛ«‚ ½9ăˆŸĂÙ¡Áù¿±»ñÖơêÙ½ëö¡ÔˆđÓµÏÔßÁ“׿8±»đÏÅ¥Ûͬͼî²2%¶ûÍÓÅÏŇۣ£ë¾—¶ĂÙÏÅä̉ưÀÍË)éÛ9¥µÜñÖ竇“Íj₫®¶ÙŒë*«߈¥ˆ]1‡ºÇ»¥Æ«È«·3uUăˆŸÑØ̃ˆ߈å̉ ƒ¾‘¥ÛƯÇĂÈÛ«‚ ½9ÿ¯¶‹ÁÁ×ï½ÀĂ ÏÔăƠ§Ô¾Æ%­ÄĂ½ëöº̉ÂÙÓÅ₫$™Ô³ÇÁƯ½Ô÷ˆ½€ưÚưŒâ¼Û«‚ ½9‚vÆÏÔÿ¯¶ñÓ™ÔÚª‚ +¼9›¾ơƒщ€ăˆŸ§ÆùêÏÅÎÔÂÙ™‰kß [ïSƠ¾G±½ÏÄ™‰kß [ïS÷ˆÅÙ½ÏÔ½É6±»Ÿ}©‡¥2ßëM̀Ó¾‡ñ5ăˆŸ;Ñ»Ơºááăî9¥‡‡ºƠXÑÓÿ¯¶Ï̉̀Óƒv›·Ô³µ̣’Ơ€%ÅÓùơ«‡“Íj™‰kß [ïSËÉ9ƒ‹Ü×$½÷‡ăˆŸ;âˆ:jÏ̉½•ŒÍÓ·‡‘×8ç±»₫½Øó–ÍË)éÛ9¥ÜÓ¹ßƯׇtÓ~!‡ÇµØ„ôÄăÇíºçuå×ÙÚ·̣߈ºÙ½ĂÈô¾‡ŒíØÔXƯùôºƯóÂƠ™‰kß [ïSơî߈›·ÔñÚøêï³2÷$§Ơ߈î½›¶éƒvùדº¥ˆ]1éÚơêç®°»9¥‡×ÏÅăˆŸ› ƒvÙÜׇ½7¹Úíºӈ•=‘˜‰j̃ZîS¡Ơ…uù×§Ó™ëéå“ƠŸ}¾ßÚ¡Á­ÄƒvØŒê*ªôêöÁ«‡“Íjñ»ëöÏÔơêù×ä׃ˆƒ×µØ߈¥ÂƠăˆŸµÚưˆ¹ÚöưÀ™‰kß [ïSÑÓ¡Ư¯¼½€µ†™‰kß [ïS·Å³zù×›¾†Œ¥ÖÜÓ ™ëéåƠ9¥‡®¼»Ø߈Û«‚ ½9«‡“ÍjóÇ߈³ö‡ëöÆ»ƒØ‹È¹ÚÚª‚ +¼9̀Ê)èÛ8¤Ăôª‡’̀jÀÓø×ÙÚƠÚá=÷Á߈’¹ÜNö«‡“Íj÷å5ÓÙ½œ‡רÛÀÁ½©ˆơÄ¥ÈÁ½»÷ÁµØăàÙƒÿ¯¶ÿÚÈ̉©Ó‡‡“½¾º“ƠÏԓǹÁöơ™‰kß [ïSù×ÁĂăˆŸÏå‹ÔÛ«‚ ½9·Å‰Û©Ó™Á‡“Ë̉—Œ±½ÏÔÑØƒv¸ÿï„ƯÓ ·‡‘×8ç½ñæÿ¯¶­¼ÁưÀÅn³Á½¹ÚơÔ°»ÑصØ÷ÁÛ÷ơ“Ơß»ûÙ½«ÔªÚá¾™ÓµØù×¥ØÛ×9¥‡ù×ù×¹ÚŸÈÛ«‚ ½9›¶é½€¥ºÛº±»ƯåçÚÛº€¾ ™‡߈˜‹ăˆŸôÓ̉‹ÜûƠù×ÙÚÛׇŒ±½ÙÅëóÇ¥‰ÍL…µØăˆŸ;½ù×¼³‚ס»×ÜÀ½åÁø×ÁìÖßƯÅØûÁ€º­Ô›¶é•{sÈơêÛ«‚ ½9Ơ·ÅÙÚ̀ÓÛ«‚ ½9‰¿I™–­Ö“ƯËÓÅ££ä¹Ú¼$Û«‚ ½9Ưºơê‡)ÍÓçÚ³ÜáÛĂÈgëÙŒë*«™ÓĂÙ×Ü߈ÏÔǼÙŒë*«ù6½ô™Á¥ºă|̃ÄØˆÛº©Óï½߈ÖÆ ÏÔ¨Çø—÷‡ªĂ£ä”‹œHŸÓÔ±»ºnáØ½×Ü󤣨¯Èׯá ¯¼ÙÚ‰Á›¾߈…»9¥‡«‡“Íjù×ÅÔ翉ÔÖ$áêÛ«‚ ½9ƒvÈöÛÄÓ›¾ûØĂÙƒv£ä¶è÷)ÿÅÏÄĂÙÏÔ±»ƒÚ¥Đ‰Æ§ôû¡Û™‰kß [ïSÛ«‚ ½9·Å™ëéå±ÁÛ«‚ ½9å̉ ëÚ¯G‹øƠµÛ×…ÛÛ«‚ ½9ªÚa•Œ₫®¶çÚÏÔïƠÛ×Û×ÙÅëÅÓ·ÔïÚëö¯Ơóêöß»û߈½€¡Ô£äÏţǼ½™ëéå›Ú™‰kß [ïS±¿‘ +¶èÅÁĂô“ÆÎÔù×¹ÿ¥Ƴƒv÷Á—¶£Øơı»߈¥ÚŸĂѶ‹Ü߈›¾ơÔ±đÍÓăơÑ·½Ôɇçí罋Çù׻ث‡“Íj§Æç̉±»ͼ«»å¿»ÿÇDzăˆŸ¹Ú½¡%ƒˆ߈¡ØñíȾ°»ƒˆ₫$ ïiµØôêÛ«‚ ½9™‰kß [ïSưÀÛ×ÏÔçmưÀ¡̀«‡“ÍjÏÅ›¾·º‚vĂÙùêÙŒë*«ĂĂ ›­±àéM©Ø‰ÛƠîÛ«‚ ½9ëöơêíºÏÅÅÓ߈±ù³ºóç°̃ŒÚ,ù×çÚß»ûçm«‡“Íj°¿ơêß»ûÿ¯¶ŸÖ»Î̉ÄáÛÍUƒØ¡Ô©‡¥2ßëMøê +ö»ƒv₫‡çÚĂÈÁƯ¥ˆ]1±»ăˆŸïÚñÆ©Ó×Ü—Ó™‡ù×—ºñÖ“…£Çơê§ÔưÀ›¾÷Áª‡’̀jÂÓ½€›¾߈ÚºăˆŸ;·‡‘×8ç»y›Ü£äƯwŘêèäǦԷ‡‘×8çÓ̉´ÈÛꙇ™Ó“Ơ™‰kß [ïS‰»‹ÙñÄj¹Úµ†ë¼é÷ˆĂÙÛ«‚ ½9™‰kß [ïSË̀ÏÅù×–Œ°»½€Ă éê§áß»ûœ‰¾I˜‰j̃ZîSùׇŒ9¥‡×…n¸È+½ƯÛỞÛ«‚ ½9±»ÂóÂăˆŸùꉿIßÚÁƯÏÔƒvÙ×ÏÔ°¿åÁƠ¾GơÔíº÷Á÷Á€ÓÛ×”ºÁ˽€Ï̉Ăº±»¾ĂÈĂô÷)Û«‚ ½9ŽßÚ©‡¥2ßëMÙ½™Ó…ØöƠÖ›ƠX±»ÓÅÅįÈĂÙ“߈Ù½“ƠăƠÙYÛºÎÅëöơêÁĂ÷Á¯ÏÔŽƒñ›½˜îÍÄëö•%€º«»ơêËÔÙÅë…£­©¼¬Ä»éÓÏÔÀĂÇ̉߈±»‚½…ÛÖÔ†6¦jăˆŸ;kÿÚ­½¼ƒvÁĂÁ‡é/×:ÅÁƯ©‡¥2ßëM½9¥‡߈ÁĂ¹Ú™‰kß [ïSëö÷ÁÑĂư§‡ÏÔƒv«‡“ÍjáØ̃ơüØùׇ(“ȃ½­½¼ơÔଃv₫ ®¶ ™Ó÷å5ÓÿÚ¼ô Ăº½¥Ă¡ÔăˆŸ;­Ø߈Î̉ÿ×ăˆŸ¯ƠÑõØăˆŸ;©ØÏų(RÅÛ«‚ ½9ÏÔ—»Û«‚ ½9ăà߈ăº¥ƒÛ«‚ ½9…ÛåÁƒ½·Ô߈ù×§{º±»ͪ™‰kß [ïS½ÏÔĂÙ™‰kß [ïS߈8 ¤‡ û ¥‰ÍL…©‡¥2ßëMœÜÇÖ¸£±»đÖÓéÖÆƒßƯµØχÏÔ‹ÇÏÔY©‡¥2ßëM¡Ô›v߈Û«‚ ½9«‡“Íj½ôÁ­¾Ç»³ÂÏÅÏ̉óĂ¥ÆÅÔÆùÜå¼ Û«‚ ½9§ÔåĂƠX¥èăê“ƠèêÏÔëÔËÉ9±»³ºó¿»ù×ÿ¡Á½©ÓẳÓ¡Ô©ÜÿÚßƯœ×ưÀÛ«‚ ½9µØ÷‡߈½ÔÛ™‰kß [ïSĂÙ›¾›¹Ï̉ăàщ˜‰j̃ZîS—¶áêç°Ûº¹~¡Ûa»~™‡ÛÀÚª‚ +¼9å¼ ă¼¯¼°êؽĂÑĂ“ƠĂ#µ¶‡ªÔ¿ºâơ¹ÚéêĂ¼öÁöĂ¿ô©¼ë¼³(™‰kß [ïSÁƯÁ½¹ÚĂĂ ›­±àéM¿ÅéÓëö߈æ·‡‘×8çưÀ™‰kß [ïSÛ«‚ ½9߈ßÄÙ±»«‡“Íj±»ÑÓ±»¡Ô½âÁÛÀ9¥‡¹Ú—¶·̣™‰kß [ïS9¥‡ƒ×ẩ©º¶Å÷Á©Œ­ÄỞ™‰kß [ïSÓØÛ«‚ ½9ơêμø×Áù×°¿™‰kß [ïSÇÖ¡È›¡µØ™‰kß [ïSỞÛ«‚ ½9½Ă£ä°»½€ÙÅë®ÈׯÏÔëöñÚăˆŸ;ûÓƒˆƒvÛº™Ø¹”ÅÔ¯‰Á·‡‘×8çÑĂÛ«‚ ½9ëö™‡óÔÁ ÏÅ̀Ó!ßÄÙÑÓ¹Úå̉ ‰¿IŸÈ‡ÛÅ»ăˆŸ;ëÔëöψù×­½¼™‰kß [ïSưÀùô®¼ׯĂÎô߈߈Û×›¶é«dÛÀé‰ñ5ñ·߈±»ÄØËÇÙƠí¤çÚË%½ƠÚ±»ûÓơÄùêÍӕ׫ԥÇϺăˆŸ;köH™‰kß [ïS߈ÿ“Æ×ÓăÁÏ´ÍÓàƠáØ¿Æ߈™Ôä}ź߈»—¶ẩöÙÚ™‰kß [ïSª‡’̀j¡Á“ÈÿÚ½8 ¤‡ Ö™‰kß [ïSÅØéº©-ÉßÿĂÙ™‡ëö«‡“Íj«ÓÀĂăˆŸù×çÚÂ߈UÚ×ÁƯ©Ó¿Åö±ëؤ́ÍË)éÛ9¥›¾‡ÚĂÙ™đß»ûívóÔÁ̉ÍÓëÔ«ºéÙƒvà¬Ù½ĐØ¥ˆ]1«-ĂÛ×è‰đ5đ¶…àó#Ù½¿àÓØ‡߈߈¡È«‡“ÍjăˆŸ;Û«‚ ½9¾º«·3uU±»ỞßÚ«ÛÑ·9¥‡³z›¾ï³2ÏÔĂĂ›¾¸ÈëÆăöÏÔưÀ›¾áê‹Ç…ö¹Ú›¶é†Œÿ¯¶áîÇÖ¹Ú™‡¹Ú9¥‡•דơêÏÔñÓ߈™ô°»ÓºŽÍ÷ëö±»ÙÚơl£Óç̉ûÍĂ×¾«‡“ÍjĂÈ·ÖÛ«‚ ½9“º±»ùêÙ½ÓØ¡Ûƒê߈ñÖö߈߈‡×™‰kß [ïSƒØï½µØÍË)éÛ9¥³Ø£ßÏ™‰kß [ïSĂº̃ˆ0ï»óª»ÏÔ÷ÁÛ«‚ ½9ÛÀ®GøµØ¦dÇÖÙÚªÚÉæØ:÷ˆĂȤ‰̀L„ƒ¾‘Æ»¿ô‚¯Èăꙉkß [ïSƠơº¼·‡‘×8ç¹ÚÛÀóÇÁ‰¿I߈™‰kß [ïSçØ×hùê«)ïƠÛ«‚ ½9ÏÔÆÙ½µ½àí½¿‰Û«‚ ½9ÁƯÛº߈몛éÓëÈÏÔñÓùסÔỞÿ¯¶˜êèäɇƒvä̉Ÿ\ñàêö¦Ó‹Ç«Ñ©ỞºÏÔÏ̉¼ù×óÔ±»ívƒ½ơYăˆŸÓÅ­½¼çƠÓº¡%·ØÁÛÛÄÓçÁ±»«»ÏÔ‡±»9¥‡—»ƒvăÇíñÚĂ»ưÀ¯×¹ÚëöÛ«‚ ½9ÿ¯¶ư¦ƒØ·ÅÚª‚ +¼9‡ŒÏÔ«d˜‰j̃ZîSăà™‡ăˆŸ«ÔƒØÿ§°»³ÈëÓÍË)éÛ9¥Å©Ỡôù×Áù×ĂºÛ«‚ ½9«‡“ÍjóDzƒvµØ̃ˆéꪇ’̀jơÔÏÅÙÚó¶™ÁÙŒë*««‡“Íj˜‡¡ÛçÚÑĂÂ÷ˆÛÄÓçÚ9¥‡ƒv©Ó©ÓăˆŸ;Ơ™‰kß [ïSÛ«‚ ½9ºüÜÛÄÓù‡́vó“ƠÑÄëùê¾ÏÄ߈‡ɇ‹Ó³­Öö½Ï̉‰đ­‡רÍÔÍÓù×ĂÙé܃¾‘©‡¥2ßëMÙÚƠÚ’ÆÀÚÍË)éÛ9¥äô±»·‡‘×8çÙ½Ÿ‘ŽÁ‡é/×:“ÈƠÏÔ˜êèä¿å©¼ß»ûăˆŸ;kü̉½³È©Øư%½˜Áö¯¼Ë¿ëö߈ÏÅßÚë¼—Óº›·Ô™‰kß [ïSƠÙuĂ™‰kß [ïSÏÔÿ׿\¹ÚĂÙ߈½±»óÇ·‡‘×8çÅ»±»ưÀ₫¡ÈóǹÚÇÖ̀Ç˹ëö×Óܺ«¿ºívÑÄëÙ̉ù×ÜϺƒÖ ËûƠ¿‰ϹăˆŸ;«‡“ÍjµÜ߈û(˜Á±»ÙƠS›¾Û«‚ ½9²Â™‰kß [ïSÍÄơÔ«‡“ÍjÛ×å¿ù××Ơ™ÓƒàÏ徺˜ơË¿ˆ¶Á½Ä– ËûÅÔ”îÑÄëÅÔ߈‡ÚÇÖ¾Ï̉ĂÙ¿(·ôïôñÓÛ«‚ ½9Ưj、́ỞÎ̉µØă½§—±¹ Ë̉ù׃ØÑ+ÅØ·È¡Ôƒv™‰kß [ïSˆµaщÁƯÆÅẨƠ㻵ØçÚ«‡“ÍjÏÔ™‰kß [ïSô鲿‰ñÚËÇă‘·ÙÚÏÔǽ·‡‘×8ç«âàëÚ±»Ÿ}Û‡¹Ú¡¾©ÇĂôưÁÛ«‚ ½9ï½ÅÔ—¶¾µØÍ•Û«‚ ½9ÎÔáêÓƒĂ˜«‡“Íjí—G§ÓËÖ›¾ûù×÷ÔÍË)éÛ9¥ùëëöÙÅëỞ™Ô«‡“Íj¥‰ÍL…³È8¤‡Ù̀óÓ߈ÿ¯¶é×ÙÚÙ̉±»÷ÁщÉ÷ÚÍô„ ÅƯÿÚâ» ›¶éÏÅŸæïƠÁĂÚÓ½”«‡“Íj¡ƠÛ×» ±»ơꙉkß [ïSÂÙỞ‡Œ›Û¡È—ØÛ«‚ ½9ÂÙ̃ˆù×Ăô¶ù׺½˜‰j̃ZîSÏÔÛ«‚ ½9̃Ưœ‰¾IÏÔ¦ÔÍƠ™‰kß [ïSソŀº5ù×½Ô»³Ơ÷Ạ́¯¼₫߈çíÓ̉Ïß«ÊíÖ‡ƠĂÙÙ½ùơøêŸ\…»¿‰ơÏÔ«‡“ÍjẠ́Ô“º¸ÚƠ߈ù¿µû)߈ưÀêöưÀĂÙư­›Ú‡ÇƒvÛÀ—»ơ꫇“ÍjÏÔåÙÛ«‚ ½9™Ó½ë̉µØíí—G›¾±»Ơí³ºóƺ߻ûØƠÛ«‚ ½9₫®¶ÁƯĂÙÁ¼ûơêƒÚÛ«‚ ½9ƒ½¯Û€º$¨›ÑØĐÄêăÚ«ÚëöÅ«‡“Íj¢Ç‘ÓóÇå¼ ăˆŸ;Ù×çÔ¡Ă±¿ÍÓƒvơê½щª»ö«‡“Íj߈‡Ç·Å™ÁéÓÅØưÀÙ½ÏÔªÚ©Ó½₫$‡ŒÙצصȘêèäíÆß»û«‡“Íj“º³Æ›¾Û«‚ ½9߈ăˆŸ;ỞÙÚÛ²z«‡“Íj©‡¥2ßëMëöÙ½ăˆŸ;×ƠơÄĂÙñӗؠȩӫ‡“Íj³àӯ׽À¼±»«‡“Íj³ßÄÙÛº£ÇăàăˆŸÜ“¹ƯN«‡“Íjﻉ¿I₫µØ™ÔóỖ»úÛÄÓưÀѳµaëö³àódž½•½›¾•îÿ¯¶‹$‚v“Û¹Úß²ăˆŸ£ØÚºù׉ÛÏÔù×ûÓÙÚá ÏÔ¼רăˆŸ‰¿I߈·È˜‰j̃ZîS߈¿‰ëö¿àùæívëö§Ơ«‡“Íjûñ»ëöÍƠ±»ÛºÛ«‚ ½9«‡“Íj“Ç›¾ëÚù¿ËÉ9ù׵ȹګԽà»ưîđ˜êè䙇۫‚ ½9ÿÛ…–©ƠÁƯ߈ÏÔô܃ËÖ©‡¥2ßëM÷Ú©‡¥2ßëMÙ½™‡ºôĂëöá ù×™ÔƠƒÔăˆŸív½âơäÁĂÙ½½ĂëöĂ™‡÷‡ï³2å׃v’Æ ¿ßËǹڇÇ8¤‡×Óºù×ĐÓ߈Ởùê߈Ă«‡“ÍjơèÅÏű½ăˆŸ;Û«‚ ½9µØ±»̃Åä̉¾ ¾ ¢äÙÚ߈½€¡»Ï̉«»ù׺éºûËÉ9µaăˆŸ;Ï̉—¶ƯÚ˜‰j̃ZîSµÜĂ«Ú¥ÄŽßơê«·3uUÛåÏÔëöÙ×ó×ù×›¾ù×ĂÙÅëÙÚÁƯæÚÇ™‡½›¾ù×ăˆŸ;›¾›¶éÍÄ©—ăˆŸ;₫Û·ỗÁùô´†ÏÅñÓ«‡“Íj˜Áù×̣ÇĂÙ÷ˆƒÔ߈ƠÅ™‡ÅØ­½¼ƒÖí½²Æ³­Ø±»ÁÙԷ‡‘×8ç½Ô¨ÀÂăˆŸ;Åô9¥‡öƒà©Û«‚ ½9­óÙÚœ͒°» ƒv½ëù¿±¿ĂÙÛׇÚáÛ¼ú‹ûƯ°¿ׯÖ¾·º¡Û­Äù׫‡“Íj–ˆ +ï»Ö¾ëöáƠ·Å™‰kß [ïSơÔµ‰Ù̉ö¼ׯÿ¯¶ă‘·ÇÖư“ëö™‰kß [ïS9¥‡Ö \9¥‡ó¸Ù×̉ºÍăˆ·Åƒv߈ƒvÏÄÎ̉ñÓ¯à­ÄËñÚ™‰kß [ïS²%ÆƯÓ ¡ÁƒØÏź±»ƒÚ™‰kß [ïS’öÍË)éÛ9¥ßÚă‰¿IÓŒƠ©Ó±̉Ë̉©ÇÅ™8¤‡«·3uUƒ½ר—ˆ×hÑÄë°»µ‰—[á̉¡Á̉¬ÖÛ«‚ ½9¯È¡È«‡“Íj³ĂÙ¢ä߈µØ¡Û¶Ù׿ØùôăˆŸóÓƒv«‡“Íj«‡“ÍjíJ߈·Ø¾¶œÂơèÅăˆŸ±¿“Ơ9¥‡×±Ôï»Ù½ĂºƠƒˆ³ºó̃ˆ‰ºÛ«‚ ½9‡߈߈Ù×âˆ:k“‹½Ô…ÖÁ½ĂÙ÷‡Á‹Ç%ÇÖùơ÷¼·Æ¾¹xưÀ룀¾9¥‡ăơ¼ĂIß»ûß»ûơˆ—¶‡“›¾±¿÷ÚĂÖív–»™ëéåˆ9¥‡Ǻƒ½ÏÔÛºơêơÄ¶ב¡ÈƒØ·º̃ˆ±»̀Ê)èÛ8¤ù×ù¿ưÀóÇ߈ÎÔ½«Ú«‡“ÍjơÔ«‡“Íj›¾ÁƯǺÙ½ƒˆÛׇ߻û‡îô-Ù×ï³2Ơù‰£Ç½˹ơ鵨±»ÙܦÓÓÆ‡Œ¹Ú“ȾԣÁÙ½÷Ùư‡±ù1€º¿‰›¾º§Ó«‡“Íj˹å̉ ư“ù׃v¡ÈûÓ±­¾áê¹Á—¶ÿÂĂÙÔ«ÔáÛù×™‰kß [ïS­Ö‡q×Ơ‰íØ̉ÛÚ“ƠÏÔăơÏÅÚêăêâàƯ“µØư§‡9¥‡Á‡é/×:çÚç½Ó¼߈÷ÙºØ  ïD‰¿IơÔÙ×ăˆŸºÈÿÎëö¥ÆÓº“Èÿ¯¶Ù½ăˆŸ;߈Ở¡Ôá ™Ûív¹«‡“Íj™‰kß [ïSï̃½é‰ñ5ñ·™‰kß [ïSƠÑÓ½ÔĂÖ§̃©‡¥2ßëMïƠûƠÓÆ¡Á™‰kß [ïSɇÍÓĂĂ ›­±àéM÷ÁƒƯÁ‡é/×:ÏÔß»ûăˆŸ;ÏÔçÚ­ÖǺˆŸØÎÔ‡k‚vƒˆ‡ß»ûß»ûÁƯÅÓ‰ÛÛ«‚ ½9ưÀË̉ăˆŸ;¾ß„ë̉8¤‡×Û«‚ ½9ëö©½™ơ§ô«‡“ÍjÿÚ…Ơ«Ô߈ÀĂơú˜‰j̃ZîSÙ½ÍBĐÄêÀ‡ € è/ Ö: ϺÇÖù×Ë̉ß\£ØÍË)éÛ9¥ëØÏǺƽĂÙĂĂ ›­±àéMùê°»·Ô°»û(ù×߈‰¿I—ˆ€Ä•½«&ñÓ›¾ùוŒÁƯ߈Ùû÷‡¤Á¹£›¾ׯ™‰kß [ïS«‡“Íj‰¿I§Ô½œÜăơ½ôÖ¾ưÀù×­çă‹Ç̉ÏÅÏÅ“¼ÑÓ߈åôù×í—G½ß»û±»·‡‘×8ç×¾߈ăˆŸ;©¼Ù½Ÿăщ·ÔÑŽ¾‡óÂÍ­½€°»Ă%ñu±»‡Œ½ØÁƯÇÖ߈Θ‰j̃ZîSÛ«‚ ½9Û«‚ ½9¥‰ÍL…›¨Ù·ÔÏÔƯëöÛ«‚ ½9©ù꿉™Ôµ¶‡˜êè䫇“ÍjËÖ³ÈÉ̉¹àøêË¿̀ĂƠ£ÇăˆŸ;µØÏ̉ä̉ư­ÖÆïÚ9¥‡×ÏÅÏÔÙŒë*«Ö¦±»÷¼çÚÅÓÏÅ·Å¡ôê·ôëö«%߈ÅØ‚v9¥‡ÇÓó±»¼€ăˆŸ;›¾½•Èû›8 +¤‡ +Ö ù׋ÓÅ»ƯÚÍÓÏÔ±»µêơĐĐÙөǗ»ÊÙ=ͼ¡Ôºçأذ»¹ÚñÚ߈‹Çñ«Óù×ßƯöÁ %½”î¯×÷ˆ­ÖÏ̉¥ØăˆŸ;k°»ÓăˆŸ;Ù×Ó¼§Ó‡Çëö©‡¥2ßëMÿ¯¶ƠµØ»ä̉߈™‰kß [ïSÁƯöù×߈ơăˆŸƠñÆÏ驼Óî½ă»½»Åª ¶ 2 t T ƒv̉Áß»ûÍÄ—Ó̃»úÁ¼¥ˆ]1Æψëö›¶éăˆŸ½ßƯ½ôÚ»Û«‚ ½9”ÈÏÅ£äùêÏÅÿÚ÷Á£»ƒ•Œùê«Ñ»ÈĂÈœ·̉ ¤0µØÎï‹öĂÙÓԻاԺëÚÇy±»ăˆŸå×éºçÚËÉ9ù×Óº‡º±»Ể»Øù×ơêĂè¶9¥‡½™‰kß [ïSƠÁÙÚ߈«‡“Íj½Ø³©¼é·¦Ô§Ó÷Áؽ…Ûùê‹Óƒˆ¹Úù׃v«Û߈—Óø¿ù×å!éÚ‰ÆĂ‡×É̉Û×»ÔÁ¹ăˆŸËÉ9‡º¹e™‰kß [ïS§ØÛ«‚ ½9™ëéå­Ô™‰kß [ïSÛ«‚ ½9Û«‚ ½9Ơ·‡‘×8ç±́ƯÚêØ‰y§ÆƠX¨Ơ™ÔÏ̉¹Úƒvẳ¬Öưל‰O¾IO­Ú™Ó™ôר½€°»ÓÍĂÏÔÚ×÷Á“ƧƠöÆ·nÆĂÙÓÿ¼Ù½•±»ÇĂ­Äÿ×߈Ởù×âˆ:ăÇí8¤‡¹Ú›¶éÙ½ÚơêÁƯ߈°½µØƒÚƒv«Ôù×߈ÖÀÙ½ÏÅ™‰kß [ïSÜÂăˆŸ;ŸÈ߈뼕Èû›‰¼₫®¶€ƠÁ½ŸÖ­ÍÑæ±»¯™ô½ưÀÁƯÍÄ߈µØ©¼¼€ƒØù×ỔßÄÙù×…n™‰kß [ïS«ÔĂÛăˆŸ;ÏÔ©àÜÏÔ‚ØÅüÆ—»Ïű»×ƠÏÔ©¼…Ö¡Ô×Ơ´aÿ¯¶»ˆù×Y–ØơĂ¾üÀÏ̉£‡áꙉkß [ïS¾»ưÀëö̉ÓDZ»8¤‡·Å±»©ÓëöưÀ…»ëÚŸ}ÛÄÓưÀø×ö߈¿‰±'™×Û×ùêĂè÷‡9¥‡ÁËÏÅ­Ö߈đÁ ƠÏ̉щ·ÔÍË)éÛ9¥ù×…½ê$/Á½½Û‡Û‚ÚËÅơÔÂÙ ºͼÂÓñ‡Ö¾8³¡Ô‹Ç½̃ˆÏÅÀ¹0ƒˆÛ™Á™‰kß [ïS¥‰ÍL…³ºó˜‰j̃ZîS‡ă‡Œ߈íêźù׿áê³ Û«‚ ½9±¿™‰kß [ïSÁĂÛ«‚ ½9ă½Åơê߈£Ç±½½€ëöơêºÛ«‚ ½9«â±¤ˆ\0áꘉj̃ZîSỞ«»¹Ú¾ô™Áψ߈›¾Ăơê‚Ô ‹Ü Á±¿¹}ÏŇºïº¨Ø «Ô«‡“ÍjÓ½â½ÓÅÛ«‚ ½9•Œ₫ÚéÓä̉Ç}­Ä룰»ÅÓăˆŸ߈çÚ‰¿I—Œ±»±́‹ÇÙ½›Ú¡ÔÙÚëö¡…ÖÁ̉íJñ%í¥ĂºËÉ9߈¨¼«ÓƠÖĂ‚¾ÛÄÓù×ÏÄ«·3uUçôăơ¹Úó¶Û«‚ ½9¤ÛçßÖ±»ơêù×ưÀ«‡“Íj•%ë%™‰kß [ïSöÁÂÉٻؽº§À÷Á̀Ç«‡“Íj™Ôù×½½ƒï»öÁĂ¿Ư9¥‡¡ÁÅÁ•Ç™‰kß [ïSÛ«‚ ½9÷ˆµ†¿‰ïĐæ'ÄÄøêÙ½ÏÔơÄƠÁƯ±»›¾ß»ûܧºñÆç癇“§ÖÛ×¢vưÀñÓ±éÓχ¶Ô“¹ƯN±»Ă¼ƒàÈ ñÙĐÄêÅôăˆŸ;±¿œÁÏÄ߈ñ×—»—Óôù+áêgÏÔºçßÁƯ§Ô·ÔÙÚÓØÿ¯¶ĐÄê·Øăö½ÏÅÛ«‚ ½9Úª‚ +¼9₫ÂæÚÙ½¡™‰kß [ïS߈º³(º…÷Á§ÓỞßÁ9¥‡¿»Ưº’º'ơûï½ñÓù뛾öÁùו¯È¿ôǺƠ¸Ú­Ô©‡¥2ßëM±»ă»9¥‡×߈ÍĂ߈™‰kß [ïSÁ½•Û¡ÔXÏůƠ9¥‡×¾Ó²߈½€ùêƠĂ¹˜‰j̃ZîSï™á꽫‡“Íj«·3uUÓØ Ëû›ÚÑÄëç4«»«Ô¸Ú Û×»Ă½Û«‚ ½9øê¡Û¡»µØÏ̉ƒØ­ØÿסӼ¿‰ñÓù×÷¼‹̣Ù½íꙉkß [ïS룋ÜÑĂ™‰kß [ïSÓ¼ËÇ‘%ö½g“¹ƯN‚vÏ̉­Äº›ê¾¹x§ôÿ¯¶ăˆŸ;óÇ—¾…Ö‹Üû ơÔù×ăù×Û«‚ ½9áÅăˆŸ;Û«‚ ½9߈‚Ở˜Á ¹Œö±»™‰kß [ïSÚÀóÇƠºmœ‡ëö¶&±»Ơ£äÑÄëÿÚâp Û×ÖÆĐÓ´ù×ñÖרăˆŸ;å̉ Úª‚ +¼9ÑÄëéơ›¾ÖÔ†6¦jÏÅĂºÅ–Ï|ï»ßÄÙ±»ăˆŸ;ôĂĂÈ™‰kß [ïSăˆŸ;ĂEíØ߈ϼơêƠ½€߈±¿÷ڹړȉۂ¾ëؽ»9¥‡ùêÓÁưÀ¹Úƒ½ÍĹâ“ÈƠûÓÑÓÙŒë*«öˆÛÛ«‚ ½9ÙÅëỔÇ̉é™½Ôø¿˜Á‚v‡¿§ôßÓ±ỐØ Ëǃv¬ÔƒØËƠÇøÚù‡߈“¼ÑØùê«Ô¿ØăˆŸŸÈ߈å̉ ¯{’½±»߈Á½½«·3uU±»™Áﻘ‰j̃ZîSÛ«‚ ½9ÑÄëÛž» ăˆŸ;kº÷Á£ÇÊÖù×ăˆŸ±»Ă¼™‚…ÔĂ«‡“Íj™‰kß [ïSÁ̉ƯÚº©‡¥2ßëMÙ×Ư$ư“ùôÉ̉¯×ĂÙ̃ŒÚ,À¹ÙÅë‰ô™Ơá ÍÄëö«»éÓ±½öä5̉™‰kß [ïSăˆŸ;º›¶éÙ×₫‡˜‰j̃ZîS—ˆ½ÓØ“Ơêö åĂíˆđăëöÛÆϺŸĂø¼¼÷ÁơÄ™‰kß [ïS™Ö$›¶é¾щ÷ÁăˆŸÇÖÏšԕÈû›½‡ÇăÇí߈˜ơËÇ÷å5ÓÁăơơ€ºù×µ.¥Ù¿‰¿ßëö₫ƒÔ«Ú¹Ú…Øêö±»ơÔ±»ÏÔÚÇÅÔóÔ÷Á©߈Ûº÷ˆÛÄÓÂÈ“÷Û«‚ ½9ăˆŸư[µØØYºÁÓÅÙY«‡“Íj÷óÛêƠ±±»ơ½ÛĂèù׿ôÏÔÿÛ³߈„Ç‹Ç׿8¥ÅÂĂÁ̉ÏÅ߈ߌÛ,÷ÁÂÙ—–ŸÈ«‡“Íj¶èÛ«‚ ½9˜êèä±»ù×9¥‡•ñÓơèÅơÛå̉ ¾á Á̉ÍÓ…öơèÅÛ«‚ ½9ơÔăˆŸ;k·‡‘×8ç«»›¾‡º̉Á½óƒv³zŸ}ùêƠÑÓ§Ó™‰kß [ïSñÓĂÙơèÅ·äÛ«‚ ½9Å¥Ï̉éÓÏÅÛ«‚ ½9‘±€ë 9¥‡¹Ú½ÉÛ¿Ô¥ˆ]1á=ôĂăˆŸÎÅÙŒë*«“Èï½ù×ñÓ9¥‡Û«‚ ½9ăˆŸơêéêÍÏÔÑÓĂÙ߈ÿÚçÚ«‡“ÍjưºÛ×Û«‚ ½9åÁ÷ÁƒvûÙY›¾÷‡ƯÓ °êØÏÅÅá߈Ù×Û«‚ ½9óÜơèÅơêÀ̉Ó˜½€ÁШØщÏÅ¥º¾ÁƯ¹Ú§Ó·ÔëöÅÉÙ9¥‡ÛÆ¡ÏÔơÙ¿‰ưÚÓ«‡“ÍjăˆŸ;¹̃Á¾ºÏÔï½Ä÷Á·½ơỖÄØ—¶ÏÅ™‰kß [ïS˜‰j̃ZîSñ¾ÿ$̣Çÿ¯¶ùêù×ơèÅ™‰kß [ïS›¾­Ö½˹ÏÅ’½“ +–Ó£Ơ£Ư˜‰j̃ZîS¡Ø÷‡ù×±Üå§·Ô­¾¹ÚéêÀÙ¡ÈóÇ™‰kß [ïSçÚÅ•Œ›¶éăóÍÓï½רÛÚÛ«‚ ½9ëö°»ăˆŸ;kº¹ùểÆÀ½ï²29¥‡Û«‚ ½9·‡‘×8ç¡\ÿÛ™‰kß [ïSµaÙ×íÚÁ‡é/×:߈ƒv¹÷Á“Æ›¾ÙđûÖù×翉ĂÙ§ØÍÓ“ºëöÛ«‚ ½9…»ÿ¸«‡“Íj±¿£ä£ØÛ«‚ ½9é¾–Öß–³ ‹Û¿ÏÅ™‰kß [ïSă»½ù·Øùêù×·Å¿‰ơèŃv¡Èó÷Ùù×¾ôơ‡¶ăˆŸ;±»ÇĂÈßÖË¿«‡“Íj›¶é±ëضÈÎÅ£Ø߈Ç̉ÀƯ ‹Üÿ¯¶ñÁÚ±»éºßÄÙ̉Á +ß₫"®¶"ÏÅú̉Û«‚ ½99¥‡ăˆŸ;ĐØñÚ§ô±»·‡‘×8ç„ØׯÙÚÛ«‚ ½9ÏÔ³Çù×±»äơÆÛ«‚ ½9 Û“Û«‚ ½9•Œ¾·ÅƒvæÚÍÓ̓¸Ú•Q߈™»ưÀÿ¯¶ÚÀ ÓºÛ«‚ ½9đÁ ߈¡ÔóÇ·Ô¹ñÚ÷Á†Ḉv«Ô§ôå̉ Ù½‘Æ«·3uUÏÅơĂŽܘÁơêÁƯÛ«‚ ½9»ØöÏù꫇“Íj̃ˆ¸Ú©‡¥2ßëMÓÆ­€Û«‚ ½9‡¥ÇåZƒv‡ÅÓùºù×ÅÔëöíÆ¾ºÅà‹ÇÛ«‚ ½9ÅØ•Œ߈ÅØÿÚ‡Œ‡÷ÁĂÙ›vÖ¾ƒẠ́Ç¡íÖÁ½úÖë½ÔÛÄÓÛƒˆÙÜ½Ăƒ×Û×çô¹ÚÛ«‚ ½9ÙÜ…Ö°»ÏÔưÁñù×À̉çÚÛ«‚ ½9¥ÿ¥ÇĂƠ§ôí—G©&Ϻ½ϼ“‰3Ơ,ùù¿ÏÔÛ«‚ ½9ÿׯÛ÷ÚăˆŸ;ĂÖ׿8Û«‚ ½9ÿ¯¶¡Û߈óÇơêÏßƠh¯Ư•Û¡ÛǺăˆŸ;Ă¼ăˆŸùơĂÛ«‚ ½9‹ÜÛ«‚ ½9ù×ÛºÙÚ›¾½»áƠ߈±¿…ö₫÷Á­Ö“ù߈ÙÓÙ½§›óÇ£ä³Â߈Û×¼ÏÔÙÚ9¥‡‡Œ9¥‡ù׿Åô¶ù×¹~©¼¨¼§Æ»ÁăˆŸơÔ­ÖµØûØøêö©Ϲ߈éº߈«»×ĂƠ׫ړ¡Ç·ØơÄĂó Û«‚ ½9ÀĂ½9¥‡÷Áµ.¥ÙÏÔÛ×îô G½¹ÏÄ߈ăˆŸÙ½߈·‡‘×8çÍË)éÛ9¥‹Çµa¾ר±Đƒ³ÂƒØ¡Ôá À×›¾ÓØù×Ử߈ơÄÙÚ¡È«‡“Íjï½÷ګѵ؉‹—¶±»ƒƯŸ\ƠÜçm©Øá ¡Á½9¥‡Ï̉ƒvëá ù×ơê“Æ‰ÔĂÙÑÓ̃ˆƠØ£ØïƠơÔ©Óăơ뜱»öÁÊÓëöơèÅĂ÷ÔưÓ߈ĂÈÛ«‚ ½9ï»Ă°»¢Ø™‰kß [ïS¼€óÇñ“ÑÓ÷‡‘âáêﺃvÏÔăÇí§ô¯à¿à±»áê÷ÁƠ½½ú̉ï³2öÏÅÇÛÆ‹Ç·ÔÁ‡é/×:EưÀÏÔÛºĂĂ9¥‡‡Œ¿ô߈å̉ ™‡³Û×÷ˆ9¥‡×Ó̉Ž˹À½߈™‡’Æô¯Ú¯×Ù̉êöçØ¥ÓϹ¥ˆ]1•ñÚùן}ƒ×Û×Á̉«‡“ÍjÙ½ç­ÓÔÁ÷ÁŹڳ™‡§ôăˆŸ;‹ÇÙÚ9¥‡±»›¾½°½¥Ö™ôѦ߄ƣ»÷‡ăˆŸ;kăˆŸ;çØ¡ăˆŸ;ưÁơÔϼÿÚ°»ù×±¿½ôÛ«‚ ½99¥‡­Ä­Ä‹ÛÄƯ±»ÛƺÁ¼€ơÔăˆŸ;óÂơèÅ–¶«ÚÄ™‰kß [ïS¥Ø߈Û«‚ ½9¿ÙÏÔÀĂ ‰¿IÁĂưÀ˜êèä¾”Œ$ÁƯÁĂƠƠ€øæù×ù꛾ù×ÅØ“ƧÔÇÖö‡ºëöÍƠÑŵØăÏÔ÷ÁüÁ­vÓÅ«‡“ÍjŒ¾ÿ¼±»¯ÄưÀăˆŸ;ÏÔûØ÷Á“ƠŸâÿ×ĂÙ†ŒĂéêëö‚Ö«‡“ÍjÙ½Û«‚ ½9ûÀơêĂÈù×­đùê“Ơ¿‰©ÓưÜïƠÙ½ÏÄ—Ó¼€¡%÷îä̉…±»¹̃ï³2¡Ô›¾ƠºmÙ½ƠX›¾¼…‹œƠÁ¨½ÂÙ÷ÙÙ½¿¹¤ˆ\0±½¡ỖˆßÖ€ºÁĂ߈ƠÁ±áÛñ‘â¯È÷Ú·ØñÆÏÅχ»ØÁ“÷Á‚v߈χ‹ÇÁ̉ª‡’̀jŸÈù×´È›¶é÷Áăơ¥ˆ]1ùêƠX½ÛÄӽŨÁ‡é/×:߈ăàÛ×Û«‚ ½9ăˆŸ;k¯È›¾ăˆŸ;ăˆŸûØĽëö‡†ŒÏÔÓØœ‡÷Á—¶ëö±ÔñöÛ«‚ ½9ÑÓ˹ƠÔÅØµ|ÙÚËƠ°»’Æ߈©Ø‚ÚçØÛ×»Á™‡߈Ôºlù×ử›¾ÍÄù×›‰ÛÄÓжåƠ½ׯº¼€ÅÀơèÅùæ¹ÚơêĂ™‰kß [ïSÏ̉ËƠ­Ö‹ÇϹăˆŸ;ÿ.ư‡±ù1ù×çÚ­v«‡“Íj­ÖÏšۡÁ‡ÛÛÀ£ƯÁăÇí©Ó۽±»›¾ÀƯÛ«‚ ½9«‡“Íj©‡¥2ßëMŸÖ‰¿IăˆŸ;½èêÅÄÛ«‚ ½9ÏÔßÚâà¡ÔéÓơÔáêÙỤ́ÇơèÅëöñÚºơÏÔƒØé¼¹ÁĂÙÍË)éÛ9¥߈8¤‡ÖÜ™‹­ÖÑÄë߈Á½·ÅÆÅñÆưÀëöщÙƠ¡º•°¿§Ô߈߈ŒöÂمؤĂ%ƒvÛ«‚ ½9ó󇌛¶éÍÄĂñÓáºÈÛ×߈ÅÙÚ¹ÚăˆŸ¶‡Ö8æÏÅçÚçÔ¡“ƃv±»³ÈÍÓƯÚ§™‡¯à°»Ó؇ çôÙÚé¼½Ü÷‡§Ôܹ۫‚ ½9£äöú¶°»½ö÷‡£Ư8¤‡—¶‰¿Iửó½ï½÷ÁưØÙڙ۷ůș‰kß [ïSù×£ä›¾đ¹ ˜ Ơ½€ÏÅÍÓ¹Á™‰kß [ïS‘«‡“ÍjÙ#ÏċǹګÑößÚÏŽ¢½€‡Ç½€ñÓ™‰kß [ïSgùר‡¤2€̃êLûر»™‰kß [ïSå̉ ùëÙ½ơèÅö·‡‘×8ç׿8½̀¼›¶é®ƠÍÄÛÚ«F³ɱå¾±»Ù½ÅºĂ#Ç‚ÊÇÛÄÓÏÔ¶&&¿‰º©Ơ«‡“ÍjØÜ‘ö«‡“Íj©Üÿ×™‡¾«Ó«‡“ÍjÙÚ߈¥Ø…ؓȾß8¤‡ùÏÚª‚ +¼9߈ÿÚăˆŸµÈ™Ó¡Ô³áꙉkß [ïS§ô—ˆÏÅ–ˆƒÚ³Ơù Á|éÚш“·‡‘×8çĐÓùܯG‹øâˆ;œ‡ăơèêÏÅéºùæ߈ôÛ«‚ ½9­ÔÛ×÷ÚÓÅ«¨߈½ÑÄëƠăÔш₫®¶¿¹«‡“Íj‘‘æƠ$ï»ÇÖ£‡Û×剳ș‡߈½€…»ù×ëö‚v‘ơưÀï½Û«‚ ½9æÚµÈù×ơê¿ăÍåƠ”ùׇºÙŒë*«ÿ¯¶щYª¶2tT™‰kß [ïS³”•ŒåƠßÄÙ߈»½Ù×ù×ëÔô«‡“ÍjdzÈÏÅ·‡‘×8çùׇà̃Á–ˆÿ¯¶×¾³Ô¼€¹ÚöÛ«‚ ½9ß»ûÙ½ëöƠÛÄÓ§ÈăÄƠ¼¡ÛÉ[ăˆŸ;kÅâÇ̉‹É0ñÖ˜êè䣨½‚¾÷Ú©¼—¶ëöƒ¾‘¡È™ëéåÿÚƯ‰Û«‚ ½9ù×ơêÛÄÓøêỞÏÔ«‡“ÍjÔºÛ?ù¾§Ô“ȇ“ù×·̣ÅØôÔ§ôµØ©‡¥2ßëMÍË)éÛ9¥߈Û«‚ ½9Û«‚ ½9¸£ƯÓ •½ؽºĂËÓù×›¶éù×ăˆŸ;k̀ Ê) èÛ 8 ¤   ›Ú™ÔÏÔͼÅÓÏÄùêíæ˜êèä—»¿•9¥‡˜êèäÔÅÛÀ‹Ùź½›wƼưÀàê×Ơ«‡“Íjù×™‰kß [ïS“ƠËƠôñ‚«ß§ÔªÔ—¶­Ä¿‰¡ÔŸÖÙŒë*«ëÚ°»¶èåĂóÂéºÁ¥çm™Ûƒv₫®¶Û«‚ ½9Âè —»øê„Öăà—»™‰kß [ïSúÀƒv¿ƒÚ…Û™‰kß [ïSº·ÜÜơ÷ÁµVµØ߈ÏÅăˆŸ;ăˆŸ;ªÚ¥Ø§Ó¿à“ÈơỒÊ)èÛ8¤ƒvƒ½‡»Ö¾߈ƒv±»§âÅÔăˆŸ;›¶éĂÙ¯¾ÙÓ£ÇÔÍË)éÛ9¥߈ộ.«‡“Íj·Ôׯ9¥‡Íß›¾âÁ‡xăˆŸ;µØŸÖ•ÇăˆŸó½™‰kß [ïSׯ«‡“ÍjëöμÁƯçáÊ¿›¶éơêçôÙÅë…»‡ÇÏÅÿÚóËƠƒÔ™‰kß [ïSÙ½ăˆŸ;©‡¥2ßëMÆÙ¥ơÔ±»³zƒv÷Á§ô" ÍĂ•Œ×¼Û×™ëéå»Óîºư‡±ù1¡Ç›‡˜ÁµØ™‰kß [ïS±»¹Ñ»Ø«·3uUÊƠ›¾ù×ăˆŸ«‡“Íjív°»ÅÜß»ûùê±»ÿÛßÚèº߈“ÈÙ½ơê½Ô±¿êöƒÔ—¾›¾ăˆŸ;9¥‡Í<“ăˆŸ;³×ÿÚ9¥‡óÂÑÄ뿉ׯ•áÛÛ«‚ ½9ï½å̉ âÁ“Ơ₫ơêÇ»±»ÙÚÓ÷Á×ÜÎÔÛ«‚ ½9‚Ø¡K£äăơóÇùêƠËÉ9‹Ó›¶é¯G‹ø­Ôç°óëÅØöÛ«‚ ½9× ẳñÁËÚËÉ9ѶÜĂÙÍÓûỞÆÛ×±»±»̃»ú߈ÅØø×¿‰ƒvèêÈ̉°¿‡Œ ËûñÚăˆŸ¡Óñǰ»ź‹ÜăˆŸ™‰kß [ïSÛ«‚ ½9·ÔĂ͇߈ñÓ›¾½ÛÄÓ‘Ó£Ó™‰kß [ïS«Ô›¾™‡™‡ËÓƠ·ÔƒØ±»ÅÔñÛ«‚ ½9½¾›¾±»ưÀËƠÓ¼ÙÚº¤ˆ\0Á̉߈—¶ÙÚ‡ưÀÙ½Ó߈9¥‡Åص†₫ÂĂÙ­Ö½ÅØùêùêíê¹Ú¡Û¼ô«‡“ÍjǼ߈ÛÛÇ™‰kß [ïSÿÚÏÔÑÓÅÓÂûÙô±»«Ôÿ$ơê9¥‡×¾éÓë¼½ÔÚÀ›¶éăˆŸ;íꇺ»ØÏÔ߈Ù½«ÔñÓ¡Ô· 9¥‡ψéÚ߈ÑÄëụ̂—ÖÏ̉ăơ¹ÏÔ§ÓöÊƠơèÅ…Ơ®¾½ØÙÛ׫‡“ÍjÁĂù×Û«‚ ½9ĂÙÏÄ߈ỞùễˆÑÓ™ëéå«»·Å—ˆ«‡“Íj×Ơå̉ ăˆŸ;«Ô«Ñ˜êèäẳƒÚƯÓ Ñó×$›¡»‡½ºăˆŸ;kÅnăˆŸ;§Ó߈ơê¿áêç'½·z½±»ÏÔ·Øäô÷Á™‰kß [ïSÛ«‚ ½9¡Ô÷ÁăˆŸàƠœ·̉ ¤0߈ƒÖ±»™‰kß [ïSôÛ«‚ ½9ăˆŸ;kăˆŸ;“¹ƯNçÚ™‡ëö›¾•á¡ÛơèÅăˆŸ;—¾ÚÚ ß̃ǺƠ½ÓØ£äùׯ™‰kß [ïSÏ̉ÓÁư܃v÷‡ư“ÏÔ‡Úù××ƠäƠÑÄëăÛî‘Æ·ÑơÔƒàµØËÉ9ơ ùơå̉ ¹Úù׫ԛ¶é–ææ¦æ̀»ææÊ%ÀĂï»Ö¾ø×È̉ 9¥‡åÚÛ«‚ ½9ăˆŸ™‰kß [ïS±»å̉ ÏÔ«‡“Íj£»åîư‡±ù1Ăºö™‰kß [ïS›Đ³ÈĐÓE£²ƒØƠ»yă)ˆơ×ÜÙÚ9¥‡ÛǶȱ۫‚ ½9ưÀóÇ÷ÁÙ×́ÁÓà̃ưÀÄઇ’̀jƒˆÏÔ§ÆơçÔ₫®¶ĂÙ­ÄÏÔçÚ½€»Á̉ĂÙËƠÍÄäÖ§ßÏÔëö½–¦̀»«<ÍĹÚÂƠơÅ߈³ºáº³ÎŰ» %ÑÓÁƯ—¶—»ø×±¿߈±Û«‚ ½9߈«»ñª¹!ùê·Å̀Ó»ÁÏÄܵص؅ÛùדÇ÷‡£q±»å”­€רÙ×·¦D ï»ÏÔ«·3uUưÀ÷ÚÑÓÁƯ¢XƠåôµØù¿Ü»ɇﻫ‡“ÍjƠÍơêù¿•ׅت‡’̀jÓ‡ÙÚÖÆ Ûˆơê¢ƯÛăˆŸ;¿»߈Ïı¿íꩈ‹Ç¦Ôÿ¯¶ëÔ£ÇÏÅĂº›¾ÑÁ±»™‰kß [ïSÛ×€º¡È§Ô‡̣“ÛÇ»ƒ×ƒvŸÈÏÔ›¾₫®¶ÍBͺ̉³(ÅÓψÿ§°»ŸßÓÆƒÚ÷ÁưÀ¹ÚƒÖ§Æƒvƒv»È·Ô‚v™‰kß [ïSưÀñÙÙÚĂĂ ›­±àéMøô×§Ó°¿”Ù½óÇ᛾߈‡»ăˆŸ;ÿ¯¶«‡“Íjív“¼ù×ÍĂóÂƯÚ«‡“ÍjĂèÏÅĂ¼å̉ û˜êèä“A¡Èëö¶ÔX‡Œ—¾·‡‘×8燧دÙÚ˜ÁlÛ«‚ ½9ÚÀϺ°”ù×å̉ ñÄơԯȇÇ9¥‡×‹Ç›¾¯.©Ơ”Œ³ÈƒƠXÂíôÄÙŒë*«ø×—¶µØù×µØĂ¹Ă¼ö¿»Î̉ÑÓ“W ĂÙ«‡“ÍjŸÖưÀÅÔ‰ÛÙÚÙÚ‹Ç»Á½±»¦Æ·¸½€ĂÇÖ±»¹Úµ†ù×™rÛ×Âÿ×ß„í—G£Ø©Ó¡ÛÛ×Â6 66¬6°à66èM6äƠœĂëö£»êöÛ«‚ ½9ÙÚÛ«‚ ½9gƒØ¯G‹ø›¾›¾ÁÚª‚ +¼9ù×߈øêÛº¡Ç·‡‘×8ç‡ưÀ“ÆÙÚ¼ô ö±»£Ç½ƒ×çǃÀ¬Ä º‚v Ô™‰kß [ïS³ƠơêñÚºÑÄë“ÇÛ«‚ ½9£XßÄÙ“Èg¤‰̀L„Û×µ‰¿º߈¢ ù×ƠºmµØ˜êèäăˆŸ;̃½±ĐưÀëöǺ©ÓơÔĂÛ«‡“Íj™º±ëØ·ÜË%ĂĂ ›­±àéMÂÓÛ§Ö·ô«‡“Íj€Ơ¢0ŸÖ»ÅăÎëöĂÙƒvĂÙ‡æê߈µ£רÁëƠUôéƯơ«Ô—Á¼¯››¶é·¼Í7)ëöƒÖáêƠ½Ô¡È­¾©ØµØ«‡“Íj‹ÜîÅ-ÇÖƒv«‡“ÍjỂñׂv¸Ú·‡‘×8ç™Á߈ñ׵؟ŷỖ„Ù½ưÀ³ÏÔ“½›‡‚½ù·±»ÏÅÀơçôăˆŸ;Ǻ½ôÙÚë ƒvº¹̃À½ÑÓù×߈öÔ§Ô±Ô›Ú¹ăˆŸ;ơçăˆŸ;óÔ‡çÚÙ-ÏÔÙ½Ñó߈±»áê›vÅØËƠơêù¾ÓƼœ·̉ ¤0‘ÓƠÜí‡éƒá꛾̀½óÔË̉ăÇíYÏ̉¡Ôív‚½³·Ó ¥0Ù½å̉ µØ“¹ƯN«‡“ÍjÛ«‚ ½9ÑÄëß»ûívå̉ Ë¿ÍÇá ¿Å›¾ă½³ØëöÁ¥ˆ]1ëöû̀Ù½ĂƠ­ÄÇ÷ÏԵؽ™Óôê½ÊÅׯăˆŸ߈ºyÀ™Ô Ơùת»é‡«»²Øµ†¯¼£Çÿ¯¶Ợ£»ưÀÅÓ«Ô©ÓÉ—Ó™‡áá ÓºívµØƒˆï½ÂÙºñÚ³ÂĂÙ¿ßĂÙù×Ûº8¤‡×ơăˆŸÍƠĂÙĂ$Œ  üM ¿‰ÿÚÑÅôꯉ¯0™‰kß [ïSÑÓÄôƒvƠăˆŸ;³™ÓÛ«‚ ½9·§D ù׋Ǚ‰kß [ïSùêÛ«‚ ½9ÿ&®öʾÑñăˆŸ;™‰kß [ïS¡Ô¥ÖÛ‡ÙÚÅØçÚß¹ÚĐÅ·‡‘×8çÏÔŸÖ©Ó±¿°»ÏÔçÚ߈‡xÿ¯¶±»çÚù×¾#¯¾Û«‚ ½9©¼ßϽôƒ¾‘æÇÛ‰¿IÙÏŹØÓµăºÚª‚ +¼9󫇓Íjơö9¥‡ñ×ñˆî»ăˆŸ;kơ±½9¥‡ù×ëöéÓ™ôÆÓÅơĂ߈±½ÏÔû¤·ôÏ›¾—’÷ï–Ûׇ俉÷Áÿ¯¶ªÚƯÓ ߈÷Á¸½ÛÆËÉ9‡¶Ô‹Ù£ØÖØ™‰kß [ïSÑÓ·‡‘×8ç‹Ç߈™ëéåø×ö›¾ùדȳºóߣX™‡ƒÖ½€ùש¼9¥‡¿Ù·‡‘×8ç£ä™‰kß [ïS˜êèä©ÇÿÚ±½äơ¿Å½¹­¶™‰kß [ïSÅơ¡™‰kß [ïS±»ÏÄÁ¡ÛÄÔ‘ÆÁÚÛ“ÍjØ×•ÖÚª‚ +¼9¹Ú¦¹œ™‰kß [ïSù׫·3uU¿ôùêöÿÚóƒvÆùë«d½ăơÛ×ÑÄë·Üª»çơÁƯÓØǼ›¾«Ú £»߈¹¼ëöƒˆÙ½ưÀ߈Ö…™‰kß [ïS­ÄÏÄ‚ˆ­Ä«d›ÿÂÓØÛ«‚ ½9 ËûÅÔÙ×ÛÄÓ½™ĂÚÀùÚ¦º ẳ¾ơÔăˆŸ›¹™Ó÷Ú³‡Œ‡Œ«‡“ÍjÎÔ‡ºù×Á²Â“Ơ«‡“Íj·Øœ·̉ ¤0«‡“ÍjÎÅ£»«‡“Íj½ívø×ß„ƒ×±†Œ   ô½¯G‹øăà…àĂÖÏÔ·Ó ¥0«ÔÛÀ·‡‘×8çÿסƠ«‡“ÍjÆ̉¤·Ô½«‡“Íj»åÁÖ$ÁơÅöÅùë¾öăÇíĐÅMÛºÙÚ½™Á…öñÚƒv“Ơ±»ÿ¯¶Ơ§È±Á—¶ùÙăˆŸ;Ÿå¿«ÓÚ×”½ĂÈÁ½¡Á߈ơê¯đĽÏÔĂÙ€Ç>ÏÔ‡Œ£ÈéÓ±½­Äå̉ ƠơĂºÅÇØÑÓï˲¡۵a™‰kß [ïSÛÄÓ¾ŽóÇ‚ăˆŸ;Á½ù×ѻ۫‚ ½9‰ÇƒvÙ½±»±¿щÛ¡¹ÚÛ«‚ ½9̃„ƒ§àëö·‡‘×8çùꥈ]1±Ô½Ơ‘‡º­ÄœøáÛ­ØơØù×èêÛ«‚ ½9™Ôív­ÖƠÙ×Á¹¯È±»ˆ¿qù×›¾Œ¾ù×÷Áù×ăÁùëÛ«‚ ½9§ßÙ×áÛù×§Æ™‰kß [ïSËÓ©Ü¡ÛÍÓ™‰kß [ïS½¯››¾ëơ¹ÁăˆŸă»¶““ĂÈ̃„ß̣Ă#ÁƯÙ½ÇØÛ«‚ ½9ËÆ¾ÏÅưÀƒvưÀºßÄÙá ̃ˆơÔÛ«‚ ½9Ë%£äÏÔ›¾±”—¶§¹›ÚÑØÙ½ưÀăˆŸ;é¾¾Û×ÛºÖÀëÓĂÙ£äü¦†ÏÔ™‰kß [ïSÆăˆŸœđ™‰kß [ïS‡º´†ùëù×À¹¯Û÷ÁỔ¥ºÍÓ‡ºôç2ÁƯ½È™‰kß [ïSÈ©‡¥2ßëM¾ăˆŸ;½ơê§Ô·§D ³È±½Û«‚ ½9™‰kß [ïS™‰kß [ïSׯÀ¹®×·ÅÄ¡ÁăˆŸ;ÍáÎÅÛ«‚ ½9ÖÆù×ăơÇWƒË̉ÖÙÚœö©Ü½߈߈̃ˆ·‹ÿ™ÅØ·ÔÛ«‚ ½9Ù½¦ÙéºăˆŸ;ị̈º›¶éĂƠ“ƠƒvÅÓÏÅœÓ=§ÓÏ|a»µØó½€ăàëöơê±»«‡“Íj߈߈á=ÏÄÊư™‰kß [ïS¹Ù½£Ø³Ø£È±ÅØÙ½߈›¡‘ÙÜØ̉#9¥‡ÑÅĂÙ™‰kß [ïS§ÔŸ¾›¹£ØăˆŸăˆŸ;È̉ù×›¾›¾§Ôëö«‡“ÍjÏÔº“ƧÓÙӨǙÁ»Ø߈å»û½âˆ;k÷ÁºÙÚ¹Ú·ÅĐÓ½€G½¹½—µÈĂ²Â Ëû°»̉’ÂĂĂ˜È™Á™‡ơꙉkß [ïSÑÓƯºï½Ǽ¶Ü±»±»Û«‚ ½9ỞŒ₫ù×ÏžºơĂÙÚù¿¶µØœ‰¾I­ÄơèŘÁï³2½ỞáêÓÆĂÓ™»±Á† ăˆŸÛ«‚ ½9ß»ûĂƠĽù‰­¶¡ÈăơɹĂÈƯÓ 9¥‡×ÿ¯¶ôƒvăˆŸ™‰kß [ïS׿8ÂÙàçµØßÚ˜ ê è ä ÖÙ½¹Ú·ÔÍĹÚ÷ÚÛ«‚ ½9™‰kß [ïSÛ«‚ ½9·ÔÏÔÁ¼Ở‹È™‰kß [ïSăˆŸ;ơÔ†Ú +¿́ÇÖÙ½‚v€º«‡“ÍjƯÔ°»¹Ú©‡¥2ßëMÑÓ½€™‰kß [ïSùסÇËÉ9Ï Û«‚ ½9ÛÇ©‡¥2ßëMŸ}Ç£ơèÅ߈ÏÔ“Ơ±»Äô‘ơúÙ‡º±»ù×ÏÔĂƯÓ }匿N9¥‡ׯ»È‹Ù߈ÍÓ߈Ú×½¹Û«‚ ½9ÀÚ÷ÚñÚÛׯ×ÏÔø¼ƒvßÄÙ‹ÇÛ«‚ ½9±»±»«‡“Íj‘ÚÿÂö$߈ăà±¥ˆ]1«‡“ÍjĂÙáÈ₫®¶ăÇíÏ̉çÚÏÔ·‡‘×8çÑĂÀĂÛÚ±»Û«‚ ½9“Ơ¹àÛ«‚ ½9ºÅăˆŸ;ÛÀ¹Ú‡Ù½ Á¾›¶éѶƠÏ̉À‡€è/Ö:ÏÔĂèÓÅÁĂÍÄ‚¾çºĂÙăˆŸÎÅ©‡¥2ßëMƒv·Å«‡“Íjçôƒ¾‘ø¿ÛדÆ߈µØăˆŸ;k±»«‡“Íj¯G‹øù×±»§ÓÚºÎÄA·‡‘×8ççÚ‡ÇÁĂ½ƠơçôóƯ©¼’‰2Ô,øóÉÅ…Öûëöăà°¿¡Èù×ưÀ½ÁÛ«‚ ½9«ÓƯÜçÚ¡ÈﻫậÇÏÅǹ‹Ü‹Ü‡ºüÁ«»ëö«‡“Íjÿ¯¶ÏÔƒ߈§ÔvơÔăÁ©¼åô½Ô§Ôº½î¸ÁëöÍÄ÷̃ưÀơêù×®¼©ÓÛ«‚ ½9‡x¶™‰kß [ïSÏÔ©‡¥2ßëM°»ù‡ƒvƒ¾‘±»9¥‡½ù¿ψ«‡“ÍjÏÅ­ÄưÀ߈½²Øë‡‡ưÁщ“Ơ•%¦ÓêÚçwºØăà¡Ô«‡“Íj™‰kß [ïS«»Á“ƠÁáϺƠ¾Gºç€Ơ߈ܺ÷$øêƒvÛ×¼ô—¶·Ó ¥0ÂÁµaöÓ'ÏÅù׫‡“ÍjÏÅ„n”́ĂĂ߈ăˆŸ;Ư$­•ÏÔóÔ•Ơ½µØÎÅ‘6÷‡ûÓÁ㙉kß [ïSׯùשÓ÷ÚĂ÷ÁŽåô¥ˆ]1å̉ ÿ.ùê÷Ú̀Ê)èÛ8¤­Ö÷ˆÙ×ưÀ¹Ú·‡‘×8ç·Ôß»ûƒv€¼ͪ÷ÁÅô«»…ăˆŸ¾½©Ç°»÷Á¶ÿ¯¶ƒˆ°»•Œ¿åÇĂ«‡“Íj߈½Ô™‰kß [ïSÅ™‡ßÚ±»î»×¾Ơ®¼‡ß»û—ˆĂëö«‡“Íj½Û×߈±»ª‡’̀j™‰kß [ïSƠ‘Å»ơê麟ū‡“ÍjÙÚ¹Ú̉™‹Ư|Ù½›Ô‡xר€¾—¾ßÁŒE—ˆëöÁĂ߈ăˆŸ™‡«º­ÖỞï»ÙÚ«Ó›¹ăˆŸ;߈ͺº~™‡ÀĂÓÆÓƠͼưÀ¿‰“ƠÛ«‚ ½9ÑÓÛ߈±»ÍUívù׬ÔáØ‰¿Iù×ÈÙ¡Ûψñ̉‡“̃ÄØ½ăàׯåĂ߈œ/‡ŒÏ|Ù½ÓØ³Â™ÁäÁÛ«‚ ½9ÑÄëÎūѣǻش†ỞϼŸ}¾¼߈Ù€óÓ¾™‡ù×ăˆŸ;™×•ÏÔ·‡‘×8ç߈ûºÈ ôøÏÔñÓÇÖăˆŸ¯¾½ôÚ×½ƒ½€·ÔÑÄë¾ñÓ×Ü•Èû›«‡“Íjơ꫇“Íjö“ÈëöÏÔĂúÛ×™‰kß [ïSø×½¯ÈñÓ¥â×Ă›¾ÏÅËÔ™ơµØÿÚù׫‡“ÍjƒvÍÓÓÅ¿ÔÛÀưÀÛ«‚ ½9«‡“Íj·Ô™Ó£Ø¦â¤ÇÛ×§ôÙ½½̃ˆ߈ưÀ±»‹È¹ó›¾µàƒˆµa©¼·Å™ëéå­¼·Ô­‡‡ÇÅÓ߈ÛÇ‘éﻄ'ƒvÅÓÆƒ×«Ô߈·Ø¥Æ»ØÏÔ‹ÇïƠψ½«·3uU¥ÛéêƯÓ %ăˆŸ;—ßÁùơ±Áƒvâˆ:jơÔ£Ô±»³à©Çưí±»±»Ơ¡»½ùæơèѾ‘Û«‚ ½9¥Æ¡ÔÙÅë±»œÂ¶¦D 4ÑØăˆŸ;«‡“Íj½ßÔ8.¤‡.×ÅØù×ó½Ññ»‚ׯ‰Æùê÷‡ëöĂÙ«ÔÍÓƒvµaăˆŸ;ĂÙ½ÔƒvăˆŸ;÷Áù+ưˆív½Ñ½Øá ¤Ø™‰kß [ïSÓ̉ø×èꂾ  ÑÓáêÂÙ•ŒÑÄëÿÚ¡ÁÍؽ ơÔÛ:ăˆŸ;k“ƠóÍÓר©Óü §Ô™‰kß [ïSăˆŸ;߈†º“Æà¬Û:÷Á³ºó÷Úå̉ ̃»úÈ̉ñÁß„ëƒÀĂƠÔÁƯêö«·3uU¹Úœ‰¾Iĺâí±á œĂ™‰kß [ïS´a«‡“Íj—¶‡ºÏÅñÁÅØáêơĂƒvÔÉ̉¶  ¤¾âăˆŸ;±ëØÅØä̉øÚ̉̉ư­ÅÔ‡ºĂÙ÷Í·º˜‰j̃ZîS›·ÔëöĂÙ‹ÇĂÈÛ×ù×åÁƠÚǺăˆŸ;ăˆŸ;—Óơꙉkß [ïS™‰kß [ïSׯưÀÙ½§ô߈™‡ÿÛ±»9¥‡ÙƠÓ…ôÛ«‚ ½9»ØˆÙ½ÍÄß»ûÙ½ù×ÏÅÁçôù×߈ÑØ‘Ó8¤‡½¹)ơ걿€ºñÓÇĂÓ¾÷ÚïÚ¹Øë$˜Ô»Áù×ăˆŸ;k©Óù×ăˆŸ;½€‹vàê¸ÚßÚ¼€Ϲ“Ơ£ƯơÔ›¾¿‰·Å™ëéå½ƠÁ°»Ù½ùׂ½‡ºÙÚ‰¿I«‡“ÍjÂÈ­Öׯ¾—¶¡Û­¾ׯÏ̉Ï̉÷Ôï³2ùêëöÏ̉·Ó ¥0çÚ±»§Ô›ÚĂù×ù׿º·‡‘×8çù׋ÜÿÚ±»Ù½™ëé嫇“Íj±»×¹ÅÁÙ½Ÿ}ù×§Æáê¡Ô«‡“Íj·̣ñӥȡԂvƠX½­½¼Û«‚ ½9á곺󼓇ڵÀƒvù×Óˆïº8¤‡½ôÛ«‚ ½9ÏÅơèÅ©àßÁËÇƯº½ÑÓÛ«‚ ½9ù¿ƯÓ öÍÇĂÈÍÓ߈¡ÔƒÖ߈ÛÄÓ5ÁƯä̉£Ø»Å½Ü½ÁĂ­Äéơ·ÅÅÓăàÿ¯¶¾ßeÂÙÙÚÓØ£Ø©Ü‡Çù×íØ£Ç£Ççôơ꛾áƠ¿Ù˜‰j̃ZîS•߫͡‡“Íj߈ưÀ“¹ƯN•ÔƒvơỔ½ÙÚÖÆ‹Ùó™ĂÀĂ÷“±»í¾‡ºÙ½÷¶ÑÄëĂÙÚ¼ÏÄ–Ó‰ßÍÓçÚ¹ÖƒvăˆŸù×ϺíÖ™Ô™‰kß [ïSöÁ9¥‡ß»û¡ƯĂº¶¤½âˆ:ˑű»ăˆŸ;çỞ Áª¶2tT‡ÇÁ¿»ùד½™ơ°»¡Û±»™Ó¶Ô™‰kß [ïS™‰kß [ïSå̉ ψ£»«‡“Íjçô‡̃ƯÜƠÅÓÛ×Û«‚ ½9ÇÅù×Ï̉ùô±»ăˆŸ;«Ô“Ɔ“ÙÚù×¶Ôö›¾¶ØçíÁ̉ív±»½÷Á™‰kß [ïS«‡“ÍjƠXăˆŸ;ăˆŸ;ơ꛾«Ô¥Øëö·ÔÏ|Û«‚ ½9‡ ƒï™‰kß [ïSûØ̣Ç~ +ăˆŸåŒ¿N…ÖưÀµÏ–»¦Ó Óº±»ÏÔ¿çó›¾™‰kß [ïS¿Ùÿ¯¶ù׵ؗ»½¹Úƒv¸Ø¾¹x©Ç˹ñíÈ©%ÏÔƒÖöF¼¹µØ•ÖÁ¼ÛÀØ +‰Û©ÓŸÖ«‡“ÍjåÁ©Ø±¿Û«‚ ½9ïÂăà£Ư¯ÈÚ÷å5Ó̃ÄØù×ßÖ½lăˆŸ©¼Á̉Ÿ Û»ñÖ¼(¯ĂóÂơÔpå̉ ߈Ở«‡“Íj9¥‡×ÑÓÔX½ûƠ¯¼½Ă½ÅÓóÇ·ºĂÈÅàΈ·‡‘×8ç÷ÁÅ»—¶ÆÎÔâ¯Û˹³ÈÅĂÍÄăˆŸívơÔ™‰kß [ïS¹Úư“¹Ú³È°»ÿ¯¶ñÚïí̀Ê)èÛ8¤ăˆŸ;̀Ó™‰kß [ïS›Û‡ÇÙÚ¥ÁÙ½ÙÚº€¾ íÚ™‰kß [ïSÙÚª»•¾×¿8ÅØ¡ÁÚ̀ÓœÜù×éÔÙ½¹»ưĂ߈ù×±»̀½ưÀ¡Ô߈ߎ€‘Ö¡ÇŸ}«Ôß»ûµØ·‡‘×8çÍÇå̉ ±%̀¬HĂÙÏ̉Áá°Ù½8¤‡˜‰j̃ZîS¨¼ăˆŸ;‡Ç»é‡̣Ç̉ż£Ọ́µØÏÔÿ×›¾°»Ù½ærËÓ¼óÂăÄỞ…ÔÏÅÛºÛ«‚ ½9¼€¥ˆ]1Ïŵ؃½«Ú¼‡x +Ơ9¥‡ăà½ôƒv™‰kß [ïS«‡“ÍjăơÇĂŸ}ù×÷ÁéÓÚª‚ +¼9áÚ›¶éî»íÙÓØÅÓ¡ëöªÚÏÔ‰¿I÷Á…n±¿«ÔÿÚĂÏ̉§ÓßĂ߈çÚĂºŽ‡×“ÆñÔÅ…ÇÛ«‚ ½9Ỡ©Ç•½óÔÇÓ߈¬Ö“Èù×Î̉áƠ˜‰j̃ZîS߈¹Ú±Ü«‡“Íjëö÷ëö—»«‡“Íjº¹€ºŒçÁ½·ÔƒvăˆŸ;ĂĂ ›­±àéMÔXÿ¯¶·Å9¥‡ûö³ĂÙ›¾Á˩ǥب‡¤2€̃êLƒv¹Ú½˜êè䵆ˆ¡Ç™‰kß [ïSĂÛÄÓß Ÿ}êöăˆŸµÜ—¾ÙÚ¡Û•ŒÿÚ¹̃鸡ȕÖù×Û«‚ ½9ƒ×ÙÓ¡Áù׆“½€¡Ô›¾Ởëö“¹ƯNăˆŸ;ĂôƯơăÇíÜăƠơ–9¥‡§ÓÏÔơèšԄϼ–ˆ±»Ù½¹»ϼ…“µØ™‰kß [ïSÏÅăˆŸ›¾ëÓ©&±»ƒˆăˆŸöăˆŸ;•Ö‘ÛÏÅÜù××ƠëöÓØ÷ÚÛ«‚ ½9Ù̉ÍË)éÛ9¥ÜéêÙ̃ƒÚ«‡“Íjμ±ÄÂÁöÓ ƒØ—àĂèÚª‚ +¼9Ùƒvëö–Ó¥ˆ]1ƼÂÏŽ™‡¡È×ñơê¸Ú³ØÓ̉³à¿Å¡ÛèÔ¿ô¿‰±»ử¿º—½°»ơêç̉û¡Á½Û«‚ ½9£äĂÙ½ôƯ߈íÆëö§Ô±»ĂÈÎ̉Ûº¹àÓÅù×±»íJëÓ¾«»Ù½ëö˜ +ê +è +ä +ëö§Ô«‡“Íj«‡“Íjăº±ăˆŸÔXщ¥àκ߈Æô­Ä¼߈߈ï*ƒv©‡¥2ßëMü¦†óÇÏ̉µÛÓŹÚçô™ơêù×ăˆŸ;«»í(ăˆŸ;᫇“Íj©¼ÍÄ«·3uUߺÁÙ½ëö¡ØÏÔɇÅ×Ă¿ÅÙ½¿ßƠ¡Û‡xóÇëö¡ÈÏÔƯ×ĂưÀăˆŸ;©¼±»¢»‹Ó«ÔŸưÁÖÆ›¾‡Đ•ܕ׭Öٽٽ̀¬H₫Ăö߈÷Ú±»Ûשs·ÔÎỖÚç»»ØÉž۫‚ ½9³¡Á³qÑÓçôΙôÛ«‚ ½9ưÀ±»½€ŸÖÏÅưÀ´ÈçǼщÛ«‚ ½9ŰêØù×í‹ÏÔ¡߈§Æ«‡“Íj™‰kß [ïSÏ̉Û×°»ăˆŸ;ù×Ûº½óô•Ü廃×ÑÓăˆŸ¡Ô¿ôéºÁĂËÇÚÆöăàëö™Á±»₫ÇÛß»û匿NívÑÅ›¹·‡‘×8çơèÅÙÚ¥Û÷ÁÏÅâˆ:kù×–¶ưˆ×ÚƒvăÇí«‡“Íj߈ïÅóÈÎÔçôµØ̉ŽÁí‡ÏÅù×ßơ߈¡ÛÚ&É̉ªÚ˜ÁçÔ¡ͽÓºù×ßÖ°»8¤‡ÖơèÅÅØ©º·ê9¥‡×ÓÂÎÔÅôÂăˆŸ;£(¹ËÇ·‡‘×8çÏÔ»Ø̃ˆÁƯ«‡“Íjæ̉‚# Á±»¾öŸ}«Ô…àÓ̉£ä³î±»߈«‡“Íj߈±»ÑÅœ‡“½‘öÓØ¥ÈÏPµØ©Ó˜‰j̃ZîS±»ûƠßÁçÄÓº™‰kß [ïSăˆŸ;¹Ú£Ô߈º£»߈ŸÅå̉ ÛÔăˆŸ;±»íÆÛ×§ô߈Ñťƙ‰kß [ïSơê³Â™Û“ƷųÂÏŔܰ»¶÷‡•ŒçÚûƠ±»ù꫇“ÍjÛ«‚ ½9ÙŒë*«ăˆŸ;™‰kß [ïS©ÓåëԩƠ×¾¡Û±»ñÓÏÅ¿»ëö÷‡«‡“Íj÷‰ưÀÑú‡èù׃֦ƠÓºá„ƠơÂÈëö™‰kß [ïS£Ç¶ +è +ɇÚ ª ‚  + ¼9 çگʼn çÚµ†Ó¾ơĂéơ£Ư‹½¬Ù¿Åăơơêͼ¾¾óĂ8¤‡χƒØ—¶µØÅ–¹Ö™‰kß [ïSøà÷°9¥‡Áă–¦̀»êöÏű»óǵØó#½€ͼÍÄߌÛ,êöù×ăˆŸ;ÎÅ¢»ÏÅå×ăÂçÚơÔƒv­Ä›¾¾º ƒ¾‘ÍÓ˜‰j̃ZîS¥ØÛ«‚ ½9Å‹ÇëÚ«‡“Íj÷Áù×±»ëÚơêµØÏŵØSÔ¼˜„Ç›¾„n¿‰”ŒÏšԹڿôÅ»çô8¤‡±»ÁƯÁƯ«·3uUÿÂĂÈă»™‰kß [ïSăˆŸù×±»‘ơ©¼™‡ßÄÙÛ×§ÓơểÆ¿àƠºm߈Û«‚ ½9¿‰Åíêö·Ó ¥0Î̉ÚÀ·Ô«‡“Íj£ÇÙÜ¿ÅÏŃÔËÖß»û߈̉ºÛ×¶›¡«‡“ÍjÍį¼»Óù×ôÄÄĂƠ¾‡…ô»Ø Ëû—»˜êèäœÜóÇ­Ö߈çÚ«‡“ÍjÛ›ÏÄ«‡“Íjù×đÁƒv‹È‡Œ™ëéåăơÙ½ÁƯ§Ôé‡ï¿ơĂ™ºƠø¿Ăº9¥‡±»ôú™‰kß [ïSíÖÅØ¹Ú‡×ü̉Û«‚ ½9ÿ¯¶½«Ôù×·—ºÁË£Ư§Ô߈Ÿ}‡xÙÚôú±»ש­Ä›Û«ÔÏÔÛב®£äöŽî»ĂÛÄӶ虉kß [ïS«dÍË)éÛ9¥±»“Ơ¡Ç‹ÇïpϹ­vª́ù×ÔơåƠׯ©ÓÅØÑÓñÁÍƠ«‡“Íjù×ä‰óùô‚vø×™‰kß [ïS¯È¾Û«‚ ½9³×Û«‚ ½9£ÇĐØרâ½›¾ш¸•£âàơÄçÚÁÛÚª‚ +¼9§Æ9¥‡˜ +ê +è +ä +óÇ…Ơ©‡¥2ßëMƒvƒv„ °Ô‡ŒïƠ߈ëöÛ×Å»¥ÛéӣءÔƠXơû׿8èô +ù¿ƒv·‡‘×8ç±»ÎŃvôß»ûù‡“ÆÏÅ•%ÙÚ̀ «‡“Íjÿ¯¶ËÉ9Ù̉÷·¢Æ«‡“Íjëööä5̉½ăà…ÚÛ«‚ ½9ưˆơê₫ÁޏÚ߈öÁ‹È»ØËÓØ»™‰kß [ïSçÚÿÚ̉Á™ëéåÅØßևǧÖß½ƯºëöÖ̉«»Ó´·ÅÏÔçûù×Û«‚ ½9ü ¦  † ͪ騱»¥ØăˆŸ;ÓÆñ‰Ûźơ|˜‰j̃ZîSÙÜÜ›¹Á̉…»§ÔÁƯÙÜçôº›¾÷ÁµØ½€Ïžº¾“ۇǹڠÿÚÛ×ÉÙíÜÏÔç½ÍÄö»ÏÅ¡ÔÆ™‰kß [ïSô߈ºƒvù‡Ë̉ÏÔχר³ÂøôåÇ›½ô“ƠÎÅÅé(¡ƒˆö£ä›¾¯ÈöíŃ½Û«‚ ½9™ô±»‡Œ÷ÚëÓ•ÇÙ₫ù×Ç»߈™‰kß [ïSÙåÁăàôå̉ ó˜ÇÖ§ÓëöăˆŸ;ƒvù‡ö§Æ±»«‡“ÍjĐÓÛrù×ăˆŸ«‡“Íj߈׿8“¼‡x½¡%ÅØ›±½Ù½±»±»éÓáê9¥‡©¾¡ÈÛ½ÑÓåĂ½“ÇùסԡÁÛ«‚ ½9¿½™‰kß [ïSăˆŸ;“Ơëö߈¹Ú‰Á«‡“ÍjƠ›¾«¼÷ˆщ™Ô8 ¤‡ Öëö™ÔÓÅÛ«‚ ½9—»“¼ùº߈ëöÏÔÓ̉9¥‡Ù½ăˆŸ‡ñ5¹ÚÛסÔÛ«‚ ½9ĂÙ¿¡Ó”»^©¾¡Á¡ÁñÚߌÛ,ưÀơè؉j̃ZîS°¿ƒv±»±»Ư ĂºçØ«‡“Íj÷‡÷ÁËÇÄ¡%¥áµØ½€ñÆ“ºỞù×÷ÁÏÅơê‚vÿÚ‡ÇĂ¼—ºE½¹ÚËƠƒ¦œ‡ÁƯăˆŸ;ÏÅ“ÈÿÚ½ÇÖ߈ăÁ±»μ«‡“Íj߈ÿÚơÄôꙉkß [ïSÅØƯÀëö«·3uU«‡“Íj½Ă‡¯KĽíƇŒü̉µØ‹&™‰kß [ïSß„ôÛÇÛ«‚ ½9Í<ƠÏÔÙ½ÿÚ߈Ûקر»ù×½±«‡“Íj廡ÇÓ̉߈ÓºûÓæÇ§Æî½«ÔÛ×ïÂÓ̉´ØÍÄ™‰kß [ïS÷ˆ»ƯÅĂ«‡“Íj­Ô­Ä™‰kß [ïS‹Ç¯G‹øÏŵØÑ5̉ÆÚÀ9¥‡¾ù×°¿Ë̉ÛÄÓÅỞĂ½¿Å÷ˆŒ¾ÿ&™‰kß [ïSǼÏ ÛêÚ•ÜñÓ¶ÁÓ­È»Á½ôϼơéăÇí—»ù׃v‡Ç÷Á輡ț‰½ô·Ô‰Ơ¾©Ó̃ÄØïÀÚª‚ +¼9Ăçç}ôĂÙ“Æ™ëéå™ÁÇ›¡‘ÆÍƠ«ÔĐñ»›¶éÍôÛ«‚ ½9ËÇ·÷ç½Úщÿ¯¶Ù½½9¥‡ÁƯ·ºù×ù¿¹Úéêæơ±»“ÆÄÓ÷Ú⻽€ÏÔù×›½¡ØñÚëöă½¡Ô«Ô¹ÚÄôÑĂØ»ó"Ïŵص†·Ô¥ˆ]1ăïÏÔÅØ‡ÚÛ«‚ ½9ñÁ±»߈™»í‡ùꓱ»¥ÛÚª‚ +¼9áƠ³¹›Û” ™‰kß [ïS™‰kß [ïSơèÅũ؛¾9¥‡ăˆŸ;ưÀăˆŸ;²Ñ²ÈÁñ³ÍÄöß»û‡ºó§؛¾ÁƯëöÍĂĂÙ©¼ƒ¾‘ơê»Ø©ºùêéêëö›ùôƒv¯×í—G¡³Ơ›‰¼È'Ù½˜ô ÁĂëö9¥‡ͼX½€߈™‰kß [ïSÛÄÓ߈ËÉ9§Ô©Ó’¹ÜNÁƯ•€ÏÔÏăˆŸ;‘ѡԓƠøëÏ̉±»…Œ¿‰Û«‚ ½9À¶ºŸÖÙÚ«‡“Íj¥ÂëÔëÚ׿ºöÚ½«‡“ÍjéÓ“ÂûÅ©‡¥2ßëM…߈ơê߈™ÔĂô÷Á™‰kß [ïS…\«‡“Íjù×ơꙇáê°»¹¼ĐĂÿÚ£»øë¡Ơ±½ăˆŸæê­–»ùסű¿ƒvŸÖ™ëéåưê¹àĂÙŸ́щÛ«‚ ½9óÔ‹Üù×™Áæô•Œ›‡ÍĵaơĂ÷ÁƠá “bÂÙ¡đĂÙψø¿¿ ›¶éÏ̉߈›ÚĂÅÏÔ‹Çëö±»÷ˆÍÓ±»¡ÈÿÚăˆŸ;¿ÅÍå½€…ÇưÀư¥Áđ¾JëØ±»ÑÓ±»µØ‡¹Ö±»ÑÓ©¾½©Ç…àÛ«‚ ½9‹Ç¹Ú£j÷Ôáêï»™ơG½¹ª‡’̀jç4—¶ơê¹ÚÏÅù×£Á¨ŒÏÅ©¼ׯÛˆăˆŸ;ÿ¯¶±»½Ơ½ôÏÅå̉ ÍË)éÛ9¥¡ÛÑÓÄØÛº߈¯È˜‰j̃ZîS¥l›¾ÁÇÖ£ä›ÛçÚ¼ÙÚ™‰kß [ïSŸÈÍẴÁ߈Û‡ăˆŸѶº•Œœ‰¾I±»9¥‡ÔỞÙÜëáùê¾ß'‡½€ëöù×™‰kß [ïSôê½øêŸ}¾ÍÄ›¾¿ÅñLçmÛ•ÇÍË)éÛ9¥‡ŒÛÇơê±»†ºá  ÇŻŖ¿ô»ØîÚ»̉™§ÇÖ¿Ø߈ËÉ9߈G½¹¬¾̃ÄØ¹à9¥‡±»ĐÓ +Á̉ÅÅà¬ÖÛ«‚ ½9ƒv×¾áêÙÓù׬¿ ¬ÖƯºÏÔÛ«‚ ½9ơÔçÚÛ«‚ ½9°»«»öÁC«‡“ÍjÏŹÚáꙇ¹ÚăˆŸÁù×™ôơêĂ¹½Íă½™‰kß [ïSÏÅÚª‚ +¼99¥‡×™‰kß [ïSå̉ Ù̉ĂÓϳÑÄë9¥‡ûôưÀÇ»»Å¶߈«‡“Íjï½Û«‚ ½9ù×›Ú¥ˆ]1Á¼ÍåĂ™‰kß [ïSœÛù×½±»·‡‘×8ç¹ÁßÄÙ…àű»߈ơèÅ«‡“ÍjơÔ߈Û«‚ ½9™ÁÏÔÛ«‚ ½9™‹ëÓºËß•Èû›Ç±»ÅØù×ÛÀÙ½Ñó¡åÁĂÈáç©ÇưÀŶè߈ô±»G½¹¯Óºù‡ù×ăˆŸ;½€ÿ$ÏÄËƯ†‡Ú«‡“Íjª»«‡“ÍjóÇ·Ü߈÷Ú…ƠÍƠ±»ƯÓ öÑ̉ä×ÇÖ±¿ù뙉kß [ïS›¾Û«‚ ½9½­¾ƒØ·‡‘×8çï»Ï̉ׯñÓ߈ÅÓ°»á›¾ơê÷Ú©‡¥2ßëMívƠ±»˜Á›¾ψô³»Ô‡ø¿å“ƠßÄÙøê@°»ù×£äÅØÉöƠƒ×ÀĂ×Ó§̣»£µaµØêöµßƯº³ÈŽ‚vÏÔïÚâˆëï¹Ú¿»ÂÙÍƠéÚ«ÔÍġȹڲØÿ µê߈Û«‚ ½9íÖÙ½ƒàͽ—ÁƠ·Ôíû“Æ߈½ƒ½ÿ¯¶©‡¥2ßëMĂ ÛÏ̉ƒˆ½ĂùꃈơÄ¿ÅÿÚÍÓ»߈Ñø°»åơ™ôÿוÇ9¥‡9¥‡×¾»Ó»ôÛ«‚ ½9³ïƠÑÄëÅăˆŸ;…Ơ›¾ÏÔÉ̉Ÿ}ÏÔøÚµÛ«‚ ½9ƠÜív±»ƒƠ」ǫÄưÜ·ÅÓÔ½‡ºç̃¸̃­Ø¼ô›¾’¹ÜNå×ÁÛ¡Û‰Û½½ÑÓ߈8•¤‡•ÖÛ×Ù½˜‰j̃ZîSà™‰kß [ïS÷ÁÇÖ½ĂÜÀÛ«‚ ½9ÄôÍĂ©™‰kß [ïS«×̀ÇéÓÔ߈Ó¾ƒˆ˜êèäÉĂÄÀ±»©Øщ³úÓíêÓù×í ÛŇ›Û•̃‡“§ôÏÄ»çÚÅ©ØăˆŸ;±»ÍƠ“öñ‡ĂÙÙÚÏÅ÷ÁÏÔ½ŽÛ×­Ä­¾˜‰j̃ZîS—IƯÓ ‹ÇÏÅÑ»ă»»‡ơÄÛ«‚ ½9߈¹߈©‡¥2ßëMÓØ͉™ÁñÓ™”§+Û«‚ ½9·ÜăˆŸ;†ºËÉ9ŸÅ¯¾ăơ­Ä½Ơä‡çØ›¾½Ø̃ÄØÜáơêÿÚ–Ø÷ÁÁƯăˆŸù×û ô¾™‰kß [ïSƯ‰ëöÙ½¬¾Ë̉›ÚÏÅÍÇŒÅÓÍÓÅÔ»ÂÙéÔ«‡“ÍjƃvÛ«‚ ½9¹Ú·Å‹Ü߈ÏÅÛÀ˜Á&ƒvàê·§D çÚµ†¹µù×ÙÚ°»¾ÀăˆŸ;ÙÅë¡ÔËáăˆŸ«‡“ÍjÅØ½ÇÖ³ºóăˆŸ;¹Ú±»“¹ƯN¡–»ơêÙ×ÅӬĻÏ̉ƒvÛ«‚ ½9›Ô߈‚v©‡¥2ßëMúØÔÅùê‡ÇÔºlµØ›¡¯¾¾ÔÚÛÏÅ8¤‡ÍÓơÔ®ö¿»Û«‚ ½9ÙƠœÂäôăˆŸ;Û«‚ ½9¾«»¹è¥Ó«‡“Íjç½Áă­½¼¸½ưÀºå̉ ƒ¾‘™§‡ŒÙŒë*«¡Ô©àƠç̉ÅÇĂgù׋ÙĂÙºÑӵ؃vÙ½ăˆŸ;¿¹ăˆŸ;•‹Hƒmƒv߈³×ٽٽÿ&߈ͼâˆÓÆÛדƠ׺ÅÔÿ¼ä×߈çêö ÁƯ„ÖºßÁ«·3uUơêÅØùו¹Åċ奾·‡‘×8ç½Ù½‹v«‡“Íjá ôóÂÏÅ•ŒóÏÔƒvù×½¡»†Ç²Â9¥‡éêÙ½·ÔÙܽ߈ƒØÙÅëƠ'ÏÔÛ«‚ ½9ù׋Ƚϛ¶é—жÛ«‚ ½9©ß×¾Ư‰ä̉÷ÔºÍĂưÀ½9¥‡߈ăˆŸ;kßø×ºÿ&ĂçÚ́$ÜØ߈¨‡¤2€̃êL«‡“Íjÿ¯¶ƒÙƒv½€‰ơ˜‡·ÅǺ«‡“ÍjéÚÏÔívç̃Û«‚ ½9û­ÄÙ½—Ó¤Â9¥‡%ƒv“ƕۛ¾™ÜÙ¿¡»¯È‡öÙÚù×°)§Ó‡Ç‘ÖÅØăˆŸ¡Û¡Á½Ă»½ÅÓ¡ïùë±Ô³·Ô‰ßë×÷§Ó«‡“Íjù×ÎÅùÂÅØ±»µØ·ÔÁƯ‡ÚăˆŸù׃ṽˆÁ‡é/×:÷ÁơÔù×ú̉ăˆŸ;·̣™Ó§ÆÁ¼ÂÅéƒvívÅÄï³2ÊÚ™‡ăˆŸ°»̀ÇQ«»·̣ÙÚơ.ÚÄ̉™‰kß [ïS°½ ­Ö™‰kß [ïSµÈ±»ù&Û«‚ ½9÷ÁôéщëöéÙ½Žù׉¿I—ˆ÷ˆÍÓï³2½ÓÑØÛº¯¼ƒvívÏź9¥‡ÏÄưÀăˆŸ±»À¹°» ©¼ăˆŸƒÖƼÏ”±»ơÄó±»›¸«‡“Íj½­¿Á̉ơꙇ¼ÁĂăˆŸ;ÍÓ‡Ú£ä9¥‡³©Ó½ƠXÙ½ØƠơ\ÁĂÏÔă½¡È—¾ÏÅÏÅ«‡“Íjß»û߈·‡‘×8çöÏÔơÔ¹àÏÔ×ÇÖÁ̉«·3uU™‡÷ÁÍÓ¥ˆ]1½ͺ…Ơ›Ú·ÜµÏÛÀÛ׋ÇÏÄá=Ǽ…ØÛ×ửß»û«‡“ÍjăˆŸ¿ßƒv‰Ûëö߈å×öÁăˆŸ;™‡á ¡Û¡ÁƯµÂÙ·ô«‡“Íj¼÷Á¡ÈûÓ«»ׯƠÁ«‡“Íj±»­Ö±»߈¼€‡“¿‰߈ËÓ³ĂÔñÚ·Ôøêï©Ç“ÆÑØ—¶ăˆŸÍË)éÛ9¥«Ú¯¼ÅÓÚüÛ«‚ ½9ơèÅÙ̉›¾ëö©‡¥2ßëMù×êöÛÄÓẳÆ™‰kß [ïS›¾Ø×ăà÷Á™Ô±¿ă‘·ÓÅƠ>¯E߈ĐçÔϼăƠß»ûñÆÅ–¶Å‚vÛ«‚ ½9Ù½û™‡áÀ•ÖÛ«‚ ½9­ÔÓÆ߈Ưר¼½€ơ»ëöàÔ ™×ÁƯăˆŸ;½›‰½½è™‰kß [ïS߈ơƠăˆŸ;¥Æ¡ƒv§ô™‰kß [ïSÿ$ëƠU“Æá ÏÔôĂÙÁ̉¹óËƠ¾µØïéƯ¾ºù×µaÁä­vÉí߈ưÀÁ«‡“ÍjÁƯ§Ôû(çíĂÙ³Üăơ¾ÿÚÇ´߈Žđ»‚vÛ«‚ ½9‰Û‹щ·º€¾³ºóù×ÙÚÁăÛ°¿«Ú©ØÁ×ÏÔ±¿‡dèÀăˆŸ;›¾Ưù¿±»ăˆŸ;âÁ 9¥‡­¢äùơ»ÅơÔ›đ±»²‹ÇƒÈ̉ôêÓùêüÀô˜êèä½€ÓŃv•߈«‡“ÍjôúÏÔĂèÇù×Ï̉¡»ƒÔăˆŸ;₫²ÜÏÔÏÅ߈ÛÛ«‚ ½9Úª‚ +¼9ĂÙö߈™‰kß [ïSÿ$°»”Œ«Ú§ô™ÔŽ߈9¥‡×Ăº•ÔçôóDZ»ÓÅơÔ‰ˆá ¡Û«âù×½€±»á±»µØ©Óå¯ÙÚ£íĂÓ÷ơØĐÿ¯¶«ßù×ÊÈ9âˆ:߈’÷÷ÁưÀ½ĂƒvăˆŸ;µaÚ¯¡ÈÍË)éÛ9¥•½öăÁÂÙÁƯÛ«‚ ½9ÓÆ߈ÇĂ÷Á»Øª‡’̀j½Ô‡Ç‘́¾»÷ˆ¹ÚÚÆøêÙŒë*«ñÓ2™‰kß [ïS™‰kß [ïS™ëéåÍÄ«âù׽߻û÷Áƒv”%¹Ú¡4›Ú©ÇÁƯ߈“ÇéÓ‘B™‰kß [ïS¯G‹øăÁÙ½óÊ™‰kß [ïS©¼ÅԺȺƒv¥‰ÍL…ËÜÏÔóÂÛ«‚ ½9«‡“Íj߈ù׉¿IÅôăº÷‡™‰kß [ïSºØĂÙưÀÆ̉Û«‚ ½9›ÚμßÖĂÙ÷ÁµÈ³ÂÑÄ뫇“Íj«‡“ÍjĂÙä̉9¥‡±»ơÄÍÇ™‰kß [ïSÛ«‚ ½9¡°ÿڋȃvµaÁÖÇÖ‹ÇÛ«‚ ½9·‡‘×8癉kß [ïSöñÁǼóÅØ§À¾±»8¤‡¥ÆĂÙÛ«‚ ½9ÅôëÚâ½ÅÔŸÈÛ«‚ ½9ç̃ÍË)éÛ9¥…ÔÏÔ9¥‡“ƠûƠ«È߈ÿ¯¶߈ơèÅÁñ½ĂÙëö£‡›ÛùôɇĂÙ¡%ơêׯµØ©‡¥2ßëM‡Ûùꩇ¥2ßëM¼¯ĂăˆŸ;ËÉ9ÔX™‰kß [ïS™‰kß [ïS¹ÚïÂÉ6ë£ñíÈÛ«‚ ½9ÙƠ“ƠÏÔù×­Ä¡Ûшăે“ÍjĂȃÜÁ‡é/×:ơê‡Ç»Ø¡ƠÙڋlj¼Ư G½¹©¼¸ÚăêùÀĂĂ ›­±àéM²Â·ÔƠÏÅùơĂĂ ›­±àéM³à¡ÊÏÅ•½רù×½ĂÙ‡äØuơ»éÔÓØ÷ÁËÉ9«»ơèÅ©ØéÓơêƒvµØ‡ÇÓÁá=íØ«ÔăˆŸ÷‡÷Á¼—¶‡Ç™ÓăˆŸ;kï»߈ăˆŸ;÷ÁÑÓ½ƠơÅ9¥‡ƒàăˆŸ«‡“ÍjÁ̉Ể†×·Å±½±»áçöéÚ›¾ëöçØ÷¨ù×íÆ‰¿IµàÛ«‚ ½9³ÆŽêöÅà›Y†ŒƠÅëöå̉ ÉÖù×ÏÔçÚ™‰kß [ïSƒÖ‡“ÏÔ9¥‡ưÀÛ«‚ ½9·¸½Z8¤‡µØ½ÅÓÓÆƒØªÛ™‰kß [ïS¡Û†Ûù×å̉ ½ô»ÁÙ̉ÏĽ«‡“Íj±»½¡ÛñÖ¶ÆÅ̃Ö߈̃„¸à!³€ÙƠ¾ÅÛ«‚ ½9í—Gơê±»áÙ½Ù×”Ö›YÛ«‚ ½9ơêơê÷ˆÛ«‚ ½9˜‰j̃ZîSÙ½öơ‡«‡“Íj¿‰ïƠ£Ó°¿ù×ú(¾„ ù¼¿ ¾’Ʊ»Ơ—¾çôÏÅß‘ÙÚÇÖâÁF™‰kß [ïS«»Ϻ±ëعÖÓÓ߈ËÖѶíêÓ–ºª÷çÚăà±½³ÈñíÈÁ½Ÿ}’ÔĂÙ½רÑÓ™‰kß [ïSÍÓÿ»‹ÅØí—G¾çÇÁ̉ÏÅå̉ ©ÓŸß߈£äƒvº±»ÏÔ·Ôá=­Äォ»߈«‡“Íj‡Çç̉Óµ«‡“Íjﻇºù×§ÓơêôŸÅÅÔ±»½Ù½½¿ñÄÓ£ÇƯÚ§ô߈ø¾›¿»êöÉĂÏÄù×Ë̉Á½›ù×Û«‚ ½9¹ÁÚ“Èă—ÁÛ«‚ ½9ëÚ×u£»ƒˆùÚå̉ ß»û«‡“Íj«‡“ÍjĂº±»ÇÓϹËÉ9ÇÖăˆŸ;ơÔ«»³Ÿ}™‰kß [ïS«·3uỦºỞù×ÅØù×öÅÔ˜ÁܶԶô +½ï½±»ĂôôÏ̉áêÛơù×™‰kß [ïSƯº®È +µØÇ¾‘ÙÚµØÎÔ¼ëÏÔëöôÏÔ„̃Ư›¾¾ß߈à¬ùë¯ÈÖƠÔ†Ơ6Ơ¦jƠ½˹9¥‡ùÚ¾» óØɇÛµ̣Ơ™‰kß [ïS·‡‘×8ç×ÜĂÙ¡»ï½›ÔÛ«‚ ½9™‰kß [ïSÅôơêÏÔù×9¥‡«‡“ÍjÏÅơê‡½ă»›¾Ï̉ªÚ +ư“ßÚ™‰kß [ïSƒ½·‡‘×8çöå̉ Óº—¶£ØƒØå‡«‡“Íj™‰kß [ïS÷ˆ£Ø9¥‡³ª“ÆĂÙ₫¼½€«‡“ÍjƒÚË1›¾ÉÏÅソ‰Ï̉µa‡Œ…ôù×­Øçđ±»³ÇÍË)éÛ9¥«‡“ÍjăˆŸ;k߈ÙÚóÂăˆŸ;Ž«·3uU±»“ƠŸÖŻٽщ½öƒ×™‰kß [ïSÅÓÚª‚ +¼9£‡À£Ø̉ÅÎÔ­Ä‹Üç½ÓÅÛÀ‚vĂÙƒ½ĂƯÓ Ă•½Ù½±»™‡³ôñÙµØÓô“ÆÙ¥Æ̀ÓƒÚ¹Ú«»¾Óë³ÓºÛÀÛ«‚ ½9ÑØƒv9¥‡ûňƯÆØÙŒë*«½›ÚÚAˆ±»±»“ù×ÏÅÅÓ·Ôçô½ëỞ­ÄỞ“½Óˆ•=‘µØÏʼn¿IơèÅ£ØăˆŸ™‰kß [ïSÏÔ±»¡ÛœÜ߈»È¿‰½çÚÀƯ±»±»ăˆŸ;¹ÚÓØ‡xÛ«‚ ½9ÏÔ‰Û«‡“ÍjßÁû¼©Çå̉ ½ÔÅØ÷Á¥ˆ]1ÂÖ߈‹Üê$Áƒà±ßëÔµÅÓÁƯͺ߈œ‡ÏÔר­½¼ƒô‰¿IØÇ ‡×Úª‚ +¼9ÅàĂÙ¾ÍË)éÛ9¥Úª‚ +¼9™‰kß [ïSĂÙ•‹HơëÔ÷Áùơ‚vƠ‰¿I™‰kß [ïSÛ«‚ ½9匿N˜‰j̃ZîSù×ôåÖ™‰kß [ïS«‡“ÍjôêÏÔ¡ÛôÄ¥Û‡º/ÁƯ9¥‡±»߈áØר߈¡Ó¹ÚñÓ›¾±¿ï½ï³2ÑÅÛ«‚ ½9«»ư­ ƠÉ¤È ÷Â˹÷ÁµØŽË¿½ĂÏųÂÓÔÙבƫ»ÁƯ±»Ă÷ˆ…Ç8¤‡‘ÛÇÖĐÓóǘ‰j̃ZîS½·Ôós»ØÙÚ߈ưÀÓººăˆŸ;Ø×¡Ç™‡¯ÈªÚÏÔÙ½ăˆŸ©Óù×Ù½µØÁĂÿÚ³ÈơêË¿Ϻƒ«‡“Íj“¹ƯN‹Ç±»·‡‘×8çƒv‡™‰kß [ïS±»˜ÖåôĂ…ü³™‰kß [ïS­Ö¹Ú߈¹̃º¹Ú߈ù×±»•»÷ßÍ÷ˆÏ̉«‡“Íj™‚¹ÚÛÀÙ½€Ä׿8ưÀ¯àÅÓ߈ĂÁ?ŸÅ—»ÄÄô«»ŸÅÿ¯¶ăˆŸå̉ èÚ +©Ó«&±»ƒÛ«‚ ½9‹½ù×ƠÍÓÑÓßÛóÔÛèÏÅ¿ôëö«»™ÔĂ©‡¥2ßëM‰Á‹¾ÇÖ¼¤ˆ\0»Ø·Œ±»ơĂÛ«‚ ½9ÿÚ÷ÚƯ‰¸½#»éѶ™‡‡Ç߈ÿ¯¶Ç̉ÓÆÛ™Ưåƒv¥Ø›¾ùôù×ăÇíĂÙëö9¥‡óÑÓÛ«‚ ½9Á‡é/×:ăˆŸ;™ôÏÔºéÓ¡Û±̉™ÓÙ½ơÔëö¿‰ǻ¢XwÍË)éÛ9¥ù×¼€ÿ¯¶éœ½•Û—¾÷Úëơ™ñ§ô›¾÷Ù›¶é½Û«‚ ½9±»Û«‚ ½9ÍÓöÔ ƒØ—»±Ïß¡ÁÏřԻƒù¡Ôèí…Œ¹ÚÙ½ñڵؘơ߈߈“Ç™‰kß [ïS¾ƒˆµØƒvñÚÓØâˆ;׿8ÛÅ½ăˆŸéºï½¡Ô8¤‡ÖơĂ÷ÁÍÇôêă½רÛº±¿ÿ¯¶¯ÈáÅØ˜êèä½™ëéå§ÔË̉Óà‡ÇïƠË%‡Œª»ơêăˆŸ;k‘đº«â‚v‡ä¯È¼÷ÁÙÏÅăơù×ÅÛI—¾½Ô釣uÛ«‚ ½9—ˆéº­ÄĂÙëè¡Ô×Ơ±»ÏÔ¹Ú˜‰j̃ZîS¡È™‰kß [ïS÷ÙÁÛ×߈ű»‹ñ¾ºöͼø¿Û«‚ ½9™‹™‰kß [ïSƒˆ‡éܺÂÙù×ÏÔï½°»Û«‚ ½9‚vƠé߈ƒÙÚ±»íÖ̀Ç«‡“Íjÿ¯¶Ù½óÂƠ¼ÏÄ£ä±&îôùê‹úÛ«‚ ½9ÁƯçÚÏÄ¿‰«‡“Íjùó­Ô­½¼»½ăˆŸ;k±½›v§ÔÙ½Û«‚ ½9ư“ƒv«‡“Íjˆ±»«‡“Íj9¥‡×½åôăˆŸÚª‚ +¼95ÀĂÑĂ¿‰Ú½ŸâăơǼɇƒ×­ÖÏÔ¯½ưÀëÚÿ˜ô +¹Ú¹Ú‘Ö9¥‡ÏÔ¡»Žººø×¿ßƵ†ơ齭ăԂvơêỠˆ™‡µ†×¾߈Û«‚ ½9­Ö°»ç½߈·Ô¦Ô±»÷Áå̉ ¿ù×áÛ/ĂÙ›¾§Ôù×±»›Úé··‡‘×8终ÍË)éÛ9¥½ÓÔñÓÎÔ™‰kß [ïS˜‰j̃ZîSÛÀ߈°¿¬Ä »Åàưg߈º«‡“ÍjÑÓœ‡ÅÁ¼ÅÔ«‡“Íj°»ÏŹÚÛ«‚ ½9ñÖƒÖăˆŸ;ùçô¾å¡½“Æ©º·‡‘×8ç±»ù×ăˆŸ;±»Ë½¹Ú¹óñÔÆ‹Çêö†Ç‹Çуˆ¹«Ô‡Ç·ÅĂÙơêÙ½ÙÚơøêûʰ»—¶Ó ‹›æÙŒë*«ß»ûÏÔưÀ™‰kß [ïSË̉ÿÜ‹Ç߈ăˆŸ;k‹ÇÛ«‚ ½9ó§Ô×Ü—»§ÔËÇ£ä½×¾ù×ù×ï³2œÁ)íêÛ×ÜơèÅ­ÄÏԵ؇ÛÙŒë*«‘ÆïƠ¹Á«‡“ÍjáỠˆå¼ ÏÈ¥ˆ]1ƠĂÙÑÓƒâׯÙÅë±»°»·‡‘×8ç—ÓÙ½«‡“Íjá=ù×¼Ü₫®¶ç̉ÑÅăˆŸ;yçÚƺù×Áăƒàºáêëö›¾߈ëđÓ̉Úº +Û«‚ ½9½€ÅÔôă­ÙÅëñÓÙ½Á¼øê«‡“ÍjÅ‚vÙÚÏÅÓŦôñÓ˜êèä«·3uU©º‡Û‡ºäĂÁË«‡“Íj¿‰É߈ÏÅÂÓº“¨ƒv9¥‡ï»«ÔéÚ±¿µÀù×£ä§Ơ€ºù׿‰¤ˆ\0ơêùêưÀ̃ˆÚáÀÁöÁéºơêÿ¯¶Ç̉Ç»œ‡ƒˆ‚v·Ôź³×߈‰»ù×Ơ™‰kß [ïS±»—äóÂăÄëö£Ø߈ăˆŸ;™‰kß [ïSß»û߈›¾‡Ñæ9¥‡™‰kß [ïS“‰3Ơ,ùóÇ˹«·3uUơĂÏÅÎŬÖƠ±”ÜơßŃvÓ¾àö +°¿ù×öÁ—»¾ÛÚô«»ĂĂ ›­±àéMÅÓ‡Œ±ôù×ĐÓÅ×ÓçÚÙ½ª»³µƠ%đÚ½ÅØÙÚĂⵉ÷ÔÔ½«‡“ÍjˆăˆŸ;ÍÓ߈ÙÚƒÔ¬Ö߈ëö—˜ƒv…»ß»û¸Å#˹Ó¾ź¹Ú™‰kß [ïS˜ÛCùê“Ơ›¾ƯÂÿ$Úª‚ +¼9ăîơÔÁ¹øÖ¼ï½ĂÙÓØƒù±»ơê³È±E¾÷ÁÉÛ½ù×ÛƠđÔĂÙưÜ»È߈÷‡ÓÁÁơ¿‰¶ß»û̃ŒÚ,ÏÔ³§ƠÅÓ±»רº³È©ÜñÓÓØ½€Ïű¿­Äÿ±»ƒÖù×±»ô»¬ØÏźïÅăÁ‹ÇŸ³µ†¶ÅÓ™‰kß [ïSщÿ¯¶±»̣Ç«‡“Íjó́ív߈ùêâÁ³¹Üƒˆƒv±»›¾9¥‡ơèÅ™‰kß [ïSȽ“¹ƯN«‡“Íjơ»ăˆŸ;çôœ·̉ ¤0ÏÔ½½€₫®¶ÙÚøô­ÅíêƯÏÔßÄÙ½´Å±çôó§—»·Ó ¥0›¾ëö˜‰j̃ZîS÷ˆĂ߈±»ÑØêöÇÓщ¶Ô“Ơâà¿Å»]÷øÂèăà•öªÜ Û™‰kß [ïS₫¼R«Ô´a™‰kß [ïSÏÅöÜÁ½ÚÆù×̉Áëö…àív­Ö•ÇăÁ¾ ív™‰kß [ïSÖÂ7ù6åĂ¥\°¿ Û×Ä“‹ÏÅăà—–Ÿ¾íÙª‡’̀jƒ½Åß»ûù×íÖÁ½†Ú º™Óư6‡º«‡“Íjƒà‡Ç³Ø¾(ÇÜ߈éº9¥‡×ôÔºlêÓ›¶é÷ˆ›¶éç½ăˆŸ;溛·Ô—¶ÙÜ÷Á󧹿ÅÿÚ»Å߈™‰kß [ïSÅÓ’ÜéØơ‰Ûׯ¸Úù‡Ăº‡ÛÙÅëƒØË×÷Á”Ÿ̃ä̉00¥Û߈ºỔ ËûíêÙ½Ù×±»̣Ăƒ½¾¹›¾ƒĂ§ÔºöÁËÖ»Åö‰ÛơÔƠ½È·Å³îº¾½ĂÙƒ»ù×ÓÆ™‰kß [ïS‹Çá ƒ½íº£»âºơÔÙÚŸí—G£ÇĂ¼±»ÍƠĂÙ½£Xă»Û«‚ ½9ƯºÎÅ5“ ù×ëö¬Ä»…ÚóÂÔÛ«‚ ½9óƯËÇưÀ†Ú¹Úœ‰¾I§Æ™Á¿‰Û«‚ ½9™‰kß [ïSÔÍƠư§‡ÇÖ­€ù×§Ó£X¿‰™‡ƒv¯‰¯0¹Úå—¥ÄÏÅôÙ½ÏßưÀ¯ª‡’̀jרÿÚÛºç'¡ÈŸ»ưÀƒØ£Ó‡Ó˜‰j̃ZîSÙÚ߈©‡¥2ßëMµØ‹Ü½±ëØ̣ÂÛ«‚ ½9Ù̉ù¿ßqÊǽƒˆŸ}™‰kß [ïS‰¿IÑÄë̃ Î ôºß»û½€ù×ÏÅå×­=ª‡’̀jç±߈½ÈÂĂÆ¡Ô9¥‡ƒÖ‹Ç½—¶ëö́Æ!éê³ôßÏíÆºø×ăº½¿‰ÍÓÁñÅ»›¾ĂàÁÆ™‰kß [ïSÓÆÏ̉8¤‡ù×Û«‚ ½9•ŒơêöˆĂÖéơípψÙ½áö¿́ÇÖ‡ŒÓ¹£ĂÈÛ«‚ ½9ÅÔ8¤‡§ô“¹ƯNùêµØ×ĂơèÅÿ¯¶ôꙉkß [ïS§ÁªÓ·Ô½€«ÑÏÔ½©ÇÁĂçÚÓ™‰kß [ïS¡Û«‡“Íj½€Ù½́›÷ÁÛœ߈₫ĂÙ±»éºùêëöăà™‰kß [ïS˜‰j̃ZîSà ëöÙ×…Ôơê½ÆéÓÙ½ăºÄ–˜‰j̃ZîS±»Áñ¹™ ½ƒ¾‘á„øïÚ›¡¡Á»©Ü«‡“Íj¶¹Ú½ƯơÁĂ›¾»Ø›¶éÏÔôĂÈƠơÙY‘Ú½€Úº­RưÚÓºù×Ó±Ưׯ«<º®Æ©Ø·ÔÓàñÚ«‡“ÍjëÓ™‰kß [ïSçڵܓ÷óÂÁ‡é/×:„ø¹ÚívùºÛÄÓÑÄ뛇ÏÔÿÛ˜ô—ÓçÚ•ÇÏÅÚª‚ +¼9™‰kß [ïSÍƠ§Ô›¾ÑÓÛºÁƯÜùæ¹ÈÔºlœÍÓơèÅ›¶é©Øö¾º +ĂºƒÚרù×±ÁÏÅ\óÇŸ}ơÔ™ôË¿–½ ưÀÙ½¥ˆ]1©¾ïƠăàÆØỚÖÚ߈ñƘêèäÇèơ«·3uUÙ»9¥‡©‡¥2ßëM£ÔÅ–߈ưÀĂăçÚ‡Œ߈ÑĂÏÅ%Æ»½Î̉±»Y÷ÁÓÅ߈™ÔƠ°»ÙY½‡ăˆŸ;ëöúôÄ÷‡“‰3Ơ,ùºÎÅ ơêø×0½Ø¸ÈÙÚưÀ‡ñ5­Äƒv÷Á—¶ÇÅù×çôÙ×Ͼ¥OÏ̉߈ơÔÙÚä‰ÛÇ»ßÙڤߔÈúÛ«‚ ½9ËƠëö9¥‡×™‡«Ô€»ÏÔ©Ơó‡ëöÛÄÓơÔƠÛʓȳØ÷ÚçÚÇĂÛ«‚ ½9ç$½Ø™ÉçÚí‡8¤‡Ö«»Û™«‡“ÍjƯ‰ëö§·«‡“Íj9¥‡ÁĂnÅÓ«‡“Íj·Ôùס¤߈·‹ׯ«ÔñÖçÚ»~“ÈÙ½ù×ÀĂ‹ÇơǾơ Û«‚ ½9áƠá ¹¦‹È0ơÔº½±”­ÖÛ׃vƒvÓÔ×hÂÈÛ×¢äÑÓÛ«‚ ½9%±»°¿ơê—Œ߈µ†•ŒÁƯÿׇxÍƠ½›¶é߈‡“ù×™‰kß [ïSÙø×ívœ·̉ ¤0ù꛾9¥‡±»ö¦ƠĐæ’‰2Ô,øÉƠ‹ÇÚº £Øøê¡Ôçơ·Û·Ôª»§ÔëöƒØ³Èëö§ÔçôÏÅщĂ¿‰«Ô½€‹Çù×̀½Ù½£Øï½µ†ƒv¡ÔßÄÙÛ«‚ ½9ù×ăàÛˆ8¤‡×›¾„ØĂÙ§Ơ“Ơ¿‰³àƒcù×óÔÙ½G½¹ÎÔơĂåôøêĂÙ߈Û«‚ ½9‚v ¹ÚÁ¼µØ8¤‡×¯×ù꿉¶߈ÍË)éÛ9¥Û«‚ ½99¥‡¹ÚùÚ¼Û9¥‡×ù×Û±™‹ß»ûñÓñÓ߈9¥‡×ăˆŸ;‹ÇívËÓíÆ€Ơù×¥º±¿™Ó™‰kß [ïSÙ½‰ơơçô§Ôù·ƠÁÉ‡ăˆŸÍÓëöỞÁÛ—¶«»«÷“ÆÜÓ ‡ŒçÚ́ÁÿÚñ×¾ÿ¯¶ù×̀Ê)èÛ8¤º¾øØÇ‡Ú«ÑçÚüÓ±»ù׫Ôö½£ÔăˆŸ;kÚ׈£»Û«‚ ½9›¾¡ÈöÁ̉ÆÂ½Ï÷Á±»¶Èâ½Á¾§°¡ÁÅí—GÍË)éÛ9¥™‰kß [ïS™‡ÏŽƒǼϹăˆŸ;kÏÔ½«‡“Íj·ØáưÁ9¥‡×ǽ«ÑñƒûÙÙ½„ÚÅÔÙÚ¦Ô¡Ô¹Úëö‘yƒvÚ!ª!‚!! +!¼9!…»©¼‹Ç¯¾Û«‚ ½9¡ÈæÚí(ëö§ôù×ưÀĂÙ¾Ôëö­v›¹­Ø“‹ÏÅÙ׃vù×ùơù׋ه¿­Äăơ£Øƒvÿ.á=ŒƯăˆŸ;›¹¡ÁÛ«‚ ½9ÙºÏÔ¡ƯهǷ‡‘×8çăˆŸ;Ϲ÷٫⫇“ÍjÙáù×À½ÏÅ—¶ÅØ¥‰ÍL…ëöÓØơÔôêÙÚ±»ÓºÇÖ¬ÔăˆŸщ©ÜÛ™«âÏÔ©¼‡Œ¥Óͺù×ÙÚé+ĐÄêéºăˆŸ;ñÓùêËùùêƠơû¼½÷Û‘gÏÅÿÛ»”±½Û«‚ ½9•œăêă»߈Å̃Û«‚ ½9ÁÿÚèê ÏŇxăˆŸ;¥ó°»§Æ±¿’¹ ÜNÛ«‚ ½9±»ñÓ¶ +è +ƒØ³Â߈½ôĂ¼ôsȻØù×ăˆŸ;ơŒđÓÏű»߈³È™‰kß [ïS¥!ơÔ±»÷ÙÛ«‚ ½9»Ư•Œ߈9¥‡ÏÔ©%ÀĂÑÓÓÁÇÖ¹%ÿ¯¶9¥‡ơĂÓÅÇÖÓù×ăˆŸ;•Ô¢ÇÙYóù¿¿ÅƒvÅ™‡—ˆ÷ˆÏÔù׫%é‰ñ5ñ·ù×¼ÜµăˆŸ;ëöèêëÓ·ǺÁƯÚÇÖ߈ĂÙ±»™‰kß [ïSÅĂÿ¯¶ù¾¡Ô½Û«‚ ½9§¦9¥‡ÍÓÿÚ‡­Û«‚ ½9ôØ «Ô³ÆÅÓÿ¯¶«’¡È©)‘Ɖ»Û«‚ ½9Û«‚ ½9ư&£ä́ơ›¾ñuÍÓßÚ±Á¡Áù×¶Å‹Çíê‚‚v߈ϼµaÚª‚ +¼9ÏÔ9¥‡×å̉ ÏÔ÷ˆ½©Üå¿ÙÚ¡ÈÀ¯¾™ÁóÂÙÚ8¤‡µaÏŽÿ¯¶ô¹ÚÙ½‘ÚĂÙëÚ•½¹Ú÷‡°»ăơ™‰kß [ïSéÚª‚ +¼9Ù̉…à¾Ç‡ƠỞÛ׫ÔÇÖ°¿¶È —»ÔX˜ơù×ÏÔ˜Á߈…Ơ°»éßºÅØ±»ÛÆăˆŸ©¼ÏÔöù×߈ưÀÏÔ±»ăÁÄÔÑÓ±»߈ÁƯ½ÍÓăˆŸÅåĂÙד½Y«»ÍÓôéù×™‡̃ˆ¥ˆ]1¥ÛơêÄ·‡‘×8çºÿÚ™‰kß [ïSÛºơęӣ0«Ô›¾Û«‚ ½9ơÔí—GÑÄëßÄÙÜơÔÅÓÙÚûÓßÁµÿÀ̉ÿ§°»™‰kß [ïSªÔưÀÄØá ÑÓºƒv9¥‡Ị́Û«‚ ½9ϺÓØ·‡‘×8çƒv«‡“Íjëöë§³ôÛ×ÉÖƒvÓØ¡ÛÙƠ—¶Ù½´†ó¶™‰kß [ïS¡»ø×‡Œ¼§ØưÀù×ĂÈéêÇÓơ‡Ơ—±»âÁ‡é/×:¤ˆ\0½¡»ĂĂ´ØÁĂÅÓ½ăàưÁù×ÍÄÏ̉Ö¹ +ăÇí¿ß₫Ú¹ÚùêÁ¹™Ó—¶§¢ß»ûÁƯÁĂ²(¿ồÂÛ«‚ ½9ùơ·ÅÏÄ߈ï½ÿ¼çÚ«»ù×›Ôù×½÷‡Á̉ĐÅỞ·Ô¾ºÚª‚ +¼9«‡“ÍjµØăˆŸƒ©‡¥2ßëM“ƠĂÙ߈Û×ñ¹™ ₫ív9¥‡¡ÁûÀ½ô·‡‘×8ç÷ÔËÓÑĂưÀăˆŸ;kÍË)éÛ9¥‰Ûʾκ߈º“ +Í™‰kß [ïSÜÓ Ï̉߈»öÏÅÏÔẳđÓ ½Ưº¿‰9¥‡×Äù×—ÓÚ×öÁ4¡Ô³ƠÙ½Û«‚ ½9ẳßÁÉ̉·ÔÿÚ•îÀÛ׋ÇÓºÏÔ«‡“ÍjÇÖ™‰kß [ïS߈‚Ö¿×Ù½ưÀä̉²Æ +߈í$Ở¼€ƠiÓØÚª‚ +¼9˜‰j̃ZîSóÇÙ½µØïÂÛ«‚ ½9¥ØÇôÛ«‚ ½9‰¿I߈ß»û±»“ÆÁ½ËÉ9±»©Ç߈‹È¬Ö½Û•×ÙÚ8¤‡—¶½߈Ž—¶êöù×±»­Ä±»«ÑÏÔëÚư§‡ăˆŸ;™‰kß [ïSE‰Ư½Ô±»º̣Ç«‡“Íj˹åÜϼÓÆ›¾ï»Ù׃vÏ̉“çå̉ ‡Ç½Ơƒvׯ߈­ÊÏÄæÚƒ½ÅÓÅ»™ëéåƒvùꃈ¢X—»ùëœÂ‡ÇϹëöưÀăÂ…¤ëö™‰kß [ïSœ‡éưÁ«·3uU½»á ăàÑÓëöÏÔËÁƯ™‡ŸÈ½ôèơ —¾Ç»ù×ưÀÙ½ÍƠ™‰kß [ïS×¾¹½›¹3ÏÅñÖ¹Ú½ÆØ™‰kß [ïSÑÄëÎ̉÷ÁÑÓÏ̉‡Ç´ÅÊÖ¹ÚÅÓ±»‹ÇĂôÛ«‚ ½9ÿ¯¶‡™ôÜ·‡‘×8ç¹ÁÁ¼Ưϼ·‡‘×8çƒvŸÅ“ÆÙ̉“Æöƒß»û¡ÔíÚ߈Û«‚ ½9Á¹½Á¹ƒ¾‘¢X¥ÆÑÅËÖÛºµØív§ÓçሷëÍáŸØ“¹ƯN߈©Ó­ÄÅÓ÷ˆÙ‡Ï9…³ÂưÀµ„™‰kß [ïS½9¥‡×¾ƒÔ¹Úơ»·Øƒv¼çôׯÛ«‚ ½9³Ó™ëéå߈êö Û×ó×̃ơWªÄßÚÓºóÖÑÅ⺧ôÏ̉¹®£Ươ±»á¬½½ÔˆÛ«‚ ½9µØ9¥‡ëö»ˆ™‰kß [ïS±ñÏÔçô·‡‘×8ç·Åä̉߈ÑÄë…Ú­ÖÅß–«ÚÍÄù׳ȱ»ÿÆơêăˆŸ;©º¹ +ƒvăˆŸ«‡“Íj–¶÷Ù§Ô±¢ÇÅôÙËǵ.¥ÙëöăˆŸŒ&çñÀ¹ÓÆÁ›߈ØŒê*ªÙ½Ă¼¡·º£ä©&‡ƒvÿ×à ß%Ô«‡“Íj™‰kß [ïS×ÓƒäăÙ½çô9¥‡×­›™‰kß [ïSƯÓ ÏÚ™‰kß [ïSº§Ôëöù×¥ÓăÂ×$ÏÅÇÖ±»ạ́ëöó×匿NÂÏÅsƒÖơêơÔÑÓ«‡“ÍjµØ“Ơ˜‰j̃ZîSª‡’̀j±»¡ÁơêÏÔ¹̃¿̀ÓÁĂ«ÚÅØñÓù×ß»ûÔơ—Ó±»¸Ú·‡‘×8ç߈Úª‚ +¼9ƒÚ髇“Íj̣ÔÓˆ•=‘ưÀù×›á߈ívÁ̉ù×Ù½ư“ưÀ9¥‡«‡“Íj“ÈÙÚ£ØáêơÄÍÓ̃§5Û«‚ ½9߈º™ơÁÛé‰ñ5ñ·ëÔ`ăˆŸ;ù×ÁƯ±½ÅĂ8¤‡¹à‰¿I9¥‡߈Ïċܓǥأǣȅ¾Ù½߈åÈ“ƠµÀÑÄëÙŒë*«ƠÚ›¾‡ÇơÔËÇ×̉Û×ËDZ»ÑÄ륈]1¬Ä +»‰ÁÓºÍË)éÛ9¥ÏÔ·Ó ¥0߈±»ëöß»û¡ñƵܙëéå¼ơèÅ”ÈúƒvêöŽñÓÅĐăˆŸµaĂù×ÑÓÙYù×ÑĂáêß%¡Û›¶é½ƠưÀ…Œí—GƒˆÇ»ï½í߈ÓÁ¡ÓüÁơ%°»ÅØĂȼ ôÙÜ‘µ™Ó½ÓÆƠ·Ô·Ü‡9¥‡¹àª‡’̀jÿÛ«́ăˆŸ;ơŋǩ‡¥2ßëM©‡¥2ßëMÁéÓ̃ˆ¥ºçÚ߈ơꩼêÓ¾ßá ˜ ê è ä ƒvÁ̉…•Èû›…ä–»¶Ô›Ơù×Ûº»qëöщº¯à½œÁĂƠ¶ô÷ÁĂÙׯ½¾å‰‡ŒÅăàăÂơê’Û÷Á–¶́ºÙ½ËÉ9ëÔù×ơö±»߈›¾ăˆŸ;ÍÓÿÚ›¡­É×Ă‡“Íj‹ÛÍÓ…ö±»ù׃v±»ăˆŸ;«‡“Íj߈±»¨ØăˆŸĂËắ߈½»óçÔ¡̃ˆ‰Ûá ÙÓÁƯÏÔ߈™‰kß [ïS«‡“ÍjƠÅ«‡“Íj÷ˆ‰Û­öƒÖ‹ÇĂºÏ¾§ÓÙ½È̉ÍÈÛ«‚ ½9Û«‚ ½9ăˆŸ;ªÚ9¥‡à ÎÓá=¹«‡“ÍjïÅöÏÔ¥ˆ]1ÏÅĂÙ߈ÅØÄÓ«Ô§Æ“ÈĂĂƒvƯÓ ±»ưÀó¹ëö‘×­¾ÅÔÁ™Ó¬¾ ¡»«»Û׫Ôá=åÁƯ¾ñÚĂÙ·ºÍË)éÛ9¥Ù½™‰kß [ïS¾™‰kß [ïSÅØ·Åƒvơê“ƠÏÔĂè±éëö°» Ë̉­Ö›Ú©‡¥2ßëM½±»ĂÈß„¿ØöƠè¯̣©À¹½ô³ƠÜ߈ư§‡™‰kß [ïSŽ™‡˜Û^˜‰j̃ZîSÓ̉¢XßÚÙ½½ÔëÆ«‡“Íj₫.™‰kß [ïS…ƠÛ«‚ ½9߈‡“ƒˆǼ€ƠÙ½ÛêÿÚăˆŸ߈›¾Ơ æë•™Á½€…ƠÚª‚ +¼9ƒ½©‡¥2ßëMưÀù×߈̃æƒÖ½ù×ßÖ©Ø¿»©‡¥2ßëM₫Û÷$Ù½·ÔÓºĂÙûƠù×ÑÓÙơÄÙƠ…ïù×…ôƠñÓơêÁĂù×߈«‡“Íj‡Œª»™‡«»ÑÓÑÓŽƠפÁßÁÄ–¿èÛ«‚ ½9̃„ƒvu©¼•¤¿àƠŸÖÏÅĂȱ¿é‡ÏÔơÔÏÄĐĂ«Ô߈‰¿I­Ôí—G߈ÏÅëÏÔßÄÙ߈±¿ËÓ«ªµaßÁá ĂºÄ¿»8¤‡Öº±»ăˆŸß„ÁƯÛ«‚ ½9áÅơê¹ÚÛ«‚ ½9߈¡Á¶ÛíÚ—Óúù×ÅôÅØù×í—GÇÖÍÓÓØơê¯Èƒ±»±»‹Ü¨¼ÙÚ™Ô麙‰kß [ïSóÔÁá¬ĂÙ«‡“Íj̣¶™‰kß [ïS¶̀Ó ×̉ƒÖ½Ă«d‡¿º¡ÔӾӾƉۖ½º¼€ƒÂĂñکǵر»œÜ¡Ô÷ˆ±»ĂĂëöÚª‚ +¼9°Ô÷Á¡»¶‰+¾ºăˆŸÑÓăàÏÔ¼Û×Á¹ÏÄAéÓ…»±»óĹÚ×¾ƒv­ÄÀ̉ Û«‚ ½9¡ÈÏÅÛÄÓÏÔƒvÅÁĂ›¾÷ˆ¿ºâˆ;½‹1³­ÔùæÛ«‚ ½9»Ø¾ß¿ưö߈±»Û«‚ ½9ÇÖ«‡“Íjƒv±¿ÏÔ£ ¿‰½ÔµØÛ«‚ ½9ăˆŸ;ïÅÏÔ˜‰j̃ZîS«‡“ÍjÛ«‚ ½9Ÿåï³2¿‰½±»—¶ÖÆmƠÁçÚÿÚ±»„à¶ù׿(±¿߈ă½Ù½›¾̀Ó·ØÏÅ™Á±½Ûººçǫڽ¹Úÿ×ßñÚĂÙÿ‡§ăŸÈ©ÇŸƒơؘ‡߈Ç̉›¾±Ă›¾ưÀ‡º©Ç®ƠṚÓÅÙÚ±»Ø×™‰kß [ïS»Øÿ¯¶ơèÅÖÆ›¾“ÆôƠĂÙá Ï̉%á áäÿÜ«‡“Íj«‡“ÍjƠÛ«‚ ½9ËÉ9›¹“Ơר€OỞÏԋ܇Œß»ûª‡’̀jëöơêÜ·Ó ¥0±È8¤‡×¡ÇÑĂêơó¼€ăÁÛ«‚ ½9—¶éÓ¿‰›ƠơÔăˆŸ;ÓÅ­ÔăơÅØÛÄÓùщ»‡Åĉ¾›-‡½߈ׯƒv™‰kß [ïSçÚĂكر»ưÀ›¾ø×ÙÂÏÔÓ¾ăÇí«Ô›¾Í­HăˆŸ;‰¿I™Ô™‚“Æ›¶éưÜÏÔÁƯƠ©‡¥2ßëMù×ͼ£Ô±»ÏÔơêÏÛ«‚ ½9ăˆŸœĂ™‰kß [ïS¡Óöơ±»¡ß»û·Åí̃¹ÚơèÅù×ƯÓ ëö₫ˆĂè‡ăˆŸ©Ç£Ç­7‡¿»ÅÁ½ô•Œ/×ƠóÇß»û¨ óÇ™‰kß [ïS±»Ùܧô½àÅØ±¿µØÙÚÁ‡é/×:­Öóƒ•ăˆŸÿƒÏŃˆÏŶùדƠÚÆøêÏÔ‡Û߈µæ©Ç·‡‘×8ç·º­Äƒó¸Ơ»ÅƒÚÛ«‚ ½9ÿ$óÂÛ«‚ ½9á=°»«»̃ÎưÀ›Û̀ÓÏÅưÀËƠ“Ơ¼ëơêâơ¡Ô¿®†ŒŸÅ“Èù×Ñ…Úª‚ +¼9́Úùê¡Ô¼Ï̉±¿ù×µØÏÔºö»ÜºÅÔÛÄÓÛ«‚ ½9ÜÓ …é½ôăˆŸƯÔ÷ơáê±»¸Ú ߈çÚˆơ­€—»¾¹ƒvưÀ±»±»›¾Æåñ»Ï̉Ü‚vÿÛµØÛ× Ơ«»øêĂȸڛ¾­ÈăˆŸºí—GÏÄĐ™‡çÚ™Á¯Ởù×ë˜óíơêÛ«‚ ½9ñÓáêÏÅǾơÔ…»Ï̉ưÀ£X›¾ÿ׎ơê•Èû›Ơw·‡‘×8ç­ôÊÇ«‡“Íj߈Ö¼ÏÔ±»ăäÛ«‚ ½9‡ÇăˆŸ—ˆÙÓùÛö°»½Ø‹Ç‹È™‰kß [ïSôèÄ9¥‡9¥‡óÇŽ›¡Û×ö™‰kß [ïSăˆŸ;›¾ù×ɇºç´áÊ’™‡’‰†2††Ô,†ø†ëö›¾ƒˆçÚ·‡‘×8çµØÁÛ¿óÔï³2µßÚ÷ˆùוŒƠ«Ôª» ø×-±¿³½™‰kß [ïS¿‰€Ä̀Ê)èÛ8¤ĂÙƒÏ̉¹Á™‰kß [ïSù×½ëÛºƒv¡±ôÛ«‚ ½9ºÛ«‚ ½9çÚª‡’̀jæØ½ëö«ÔửÏÔăˆŸ;kăˆŸ;ù×¢ÇÿÚå̉ 9¥‡ׯëö¹Ú›¾ÅÔ©‡¥2ßëM³ÂñÚưÀ™‰kß [ïS˹ù×÷ÁÏÔøêóåù×ôêß»ûôá ßÖ™‰kß [ïSóÂÂÆ›¡áçùתÚëÓ½ƒ•ô…ÛÛÇ—»Û«‚ ½9׿8ç‰ÁĐÓ·Ó ¥0ùê“«ÔÿÚÓÔĂƠÀÛù×ẳ§Óùơ±»¡£»Ñëï˜Û«‚ ½9ë¼ç'ÏÔƒØÏű»½ÁĂÁÿ}ÍÓÅ—¶åÁï³2êö¨¼ßÄÙ‰¿IÙ×ÏÔ©¼߈߈³ưÀ­v±»­½¼å̉ ÑẴÁåĂ½‹Ç¨ØóÙ½øê‡ŒÛ«‚ ½9ÏÔ¯G‹øÛÄÓ±»™ëéå¿ô™‰kß [ïSđÓe™Ô‰Â¯ƠÛ«‚ ½9́văÇí›ÛăˆŸ;Ç“Ơ½°½Û«‚ ½9÷ˆÑØ™‰kß [ïSïƠÀ̉û̉Ó̃ˆÎÄ™‡Ă±‡Ơ¾G“ƠÛ«‚ ½9Ơ©ºÙڄdzg£Äºï³2öÁ2ÅÁ§ÓƒvÇ´ù×ÙÚºÛëö±»™Ô“ÆÁƯÙ½‡ºßÚ©ØëÓºªÓ‹ÜĂÈ÷$ß»ûÍË)éÛ9¥•ÇÙƒàÓ¯Æô‡ºïƠÛêßÄÙøêơÔ‘ÖÛ«‚ ½9ëöíÍăˆŸ;«ÑåĂïiá ­Äù×Ûư§‡ƒØÏÄưÀ½́ŽàÑĂ—¶«Ô•Èû›°»êÓƒ¬ÖĂÙ½¯È‚½£ÇÏÅĂÙ匿N­¾ïÔÓ½Ƽà́Ưâ‹Ü›¾áêçmßÚëö‡Û9¥‡×ÏÄǻñÓưÚù뙉kß [ïS±»í›¾Û«‚ ½9Û«‚ ½9ɇ¡Èû)™‰kß [ïSóÂơêÛ«‚ ½9ùׂØÛºÅ¥›¾Û­¾Ëgơêëö•ŒËƠÙÚÑÅÛ«‚ ½9ÜëöËÖï»Ú×›¾ñÓù×½€ù×ÁĂ·‡‘×8çư‡±ù1Ï'™‰kß [ïSăˆŸ;«‡“Íj™‡¿‰ơꘇÿ¯¶ƒˆưÀ߈“ÈÏÔÛ«‚ ½9ï½›¹›‹vÇÖ9¥‡¡ÈóÇ¥à©₫ëö¾́Û«‚ ½9¹ÚÙÚù×ÏÅÁ¹ß»û†Ç +߈™‰kß [ïS½ë̃·‡‘×8çºÅÓ̃ˆ «‡“Íj¸àüñ÷‡ơêÙ½íÄĂٻدé©ƠÁĂă»ßÁ¹Ú÷ÁÁNƠ‰²Ø¡Ô¶ÜÏÅÅܯ؋ÙG½¹ưÀăˆŸ;å̉ ¬ÈͪÏÔ¿‰«»ÇØ¿́í–Gù×ÍÇÏÔ±»ÙÚùףǾÿÂÛ«‚ ½9ó™‰kß [ïS₫®¶©¼9¥‡“½ÿÚÔ™‰kß [ïS›¾‚v™‡ÀĂ߈—»áƯĂȵƠ£XÛ×߈Û«‚ ½9ô«‡“ÍjË%«‡“Íj—ؽưÀïïóÇơĂå̉ ç̉™‡íÂƯ‰ׯÁSÛטêèäÿ×ù×·‡‘×8ç—sƒ¸‚³Ÿ}…Ç£Ø߈¨‡¤2€̃êL™‰kß [ïSßÛê‡ĐÏÅơ…Ù½Ÿâû¼ÛןֻyÙ—¾ơêµå£ØÍÓ±Ôơê—¶³àÛ«‚ ½9ß»û߈¼Ç©Ó“ƠÏÔ×àù×ô߯Ùûçºÿ¯¶…Ơ©Ç«‡“Íj™‰kß [ïS½µØÿƒv½߈ËÈ9¦ÆƠ½Ïćëöóǯۙ‰kß [ïS™Ó±»ưÀ­v«¤¥ˆ]1öÏ̉÷ÁÍË)éÛ9¥ËÉ9ÿ±¿Æ̉ÿÚ÷ÚÅØù×ψÂ˾¯¾¿‰Û×ñÓÅưÀÿÚÎڵأÔñÓ¬½€±»¡Á¹ÚÎԵأÇä̉÷ˆ¶ÿ¯¶“È·¼Í7Û«‚ ½9ëö¾½Ù½ôÔëö›Ú¹ÚăˆŸ;k©ƠÛ«‚ ½9“ÛỞ߈åÁăˆŸ;›ÛÛ«‚ ½9ß»ûß»ûù×Ó̉† ÏÅͼáÛùט‰j̃ZîSÏԵث»‡ÚéÓöÁ éá­Äùæä× •%Û«‚ ½9ù×Í´ÏÔ¤w°»ù×™Ó½€ƠÚăé’±»÷Áù×÷Á%íÆµØÙ½¾½ưÀרåĂ¡ÁÏÔƒ¾‘ÏÅÛÀÂÙϼԢ»·ÔÏŽԛ¾“Ơëö·Ü—¾¼÷ÚßÔ£Èư“÷ÁßÁ±¿¥ÖçØÙÚ˜‰j̃ZîSø×Ù½ăơëö±»ăààĂÏÔƒvÙ½˜‰j̃ZîSÍÓ¸•™rơꃈÏÅóÇÖχÛ«‚ ½9߈ëöÏÅơêëö¹Ú©Ó½€£Øƒvù×±»©‡¥2ßëMÏÚ–»ơêÎÔÁ×Ï¿ÏÔĐ¹Úù×÷Áăîƒ÷ÚÏÔǺ«‡“Íj¿µØ³ØÛ«‚ ½9ƒvóÇ×ï°¿ªÚ •)Û«‚ ½9™‰kß [ïS½ƒvº¹Ü¢ä±»ưÀƯÚơꇌ߻ûÓÅÓßÖ§ÓÛ«‚ ½9²¹ĂÙßÚĂÙÅØª ¶ 2 t T åT¥ÛÚª‚ +¼9¾ăˆŸ; ÅØñ…Û«‚ ½9°»ÍƠß»û₫ ™‰kß [ïS™‰kß [ïS•Èû›å̉ ³Èø×å̉ ĂÙ¹̃ÏÅ¡Ô׿8̣DZ»©‡¥2ßëMÿÚưÀăê±»8¤‡Ù½ÊÇôêËÓíØÛ«‚ ½9ëöÙ½³½ÏỔÆç̉øêáØ›¾ưÀƒvçÚù׃ؙ©ÓÁ¼ÅÔăˆŸ;ÏÄç4»ØÅívÛ«‚ ½9ăˆŸơÄĐÄê¹Ú°½©‡¥2ßëM̃ˆ߈ÛÁưÀ‹Çå̉ Ù½ăà¹Ú±»˜‹½̣Ă…»ÑÓô±½¹Úù×Û«‚ ½9¡ÔµØ¯™‰kß [ïS½€ÿÚ§¹¼ƒvµØŸÓ÷‡߈«Ü«ÔóÇăˆŸ;ơê‡ö³àÿ¯¶ñÚâÁÏÅéêÓ̉Û«‚ ½9·̣±»ùêă»½àÖĂÿ̃½±»µØ¡Èƒv¥ºÙ½óÇÍĉÁ¡ÓơÄÛÅëö•Èû›½³ï»èסÈù×ăˆŸÛ«‚ ½9©‡¥2ßëM‹Ûå̉ ½€đ߈ÍÓ«‡“ÍjùåăÁáê°¿¾º÷‡ù¿ÁƯ‚¾³½ñÚêöHƒ¾‘Ž߈Ü‹Ù±ëØ…Ơï½°»–»ÓÆëö™×ĂĂ ›­±àéM %(‹ÓñÚêö±½àƠ¹½8¤‡©À‰ÛÚ¹ÇĂăˆŸ;k‚½™ëéåÓºóÄíÅñÚÙÚßÚǼÿ“‰3Ơ,ùÎ̉“È»ô½ÅØĂ ÛÄÓ«‡“ÍjÍÄơêëÔéêø—»ÊƠëö©hƒÚ±»̃ˆ‡ºñ"ï¥5ÅØßÚ×uÅÇç­Ä™‰kß [ïSÜÓ ÚÀưÀôÔỞµØ̀ÓºÁ μ·¼Í7«Ôó+¡ƠщÙƠá|ר§ØÅØăơĂ¼‰Â¤ÇSñÖ“ÆĂÙ‹ÜÅ–ÍƠ·‡‘×8çÑÅÏÔ™‡Û«‚ ½9ßÖ±»ÙÚù×߈߈™‰kß [ïSï³¹÷ÁÛºđ½ƯÚ½«‡“Íj½ëÅnçÚщª ¨ƒº5™ôù×ƠÅÁóǯȳºóÏÅ߈ăˆŸ;k›Ă½€‹î™Ô«‡“Íj‰ÔÛÀÍÓ¸ÚívÍÓÛº’¹ÜNëöưÀ«‡“Íj±»߈Đæ©Ç¹à‡ŒÍƠéơƒÚ«ùщÙƠ«Ñª¶2tTùơ®ëöÙÚÛ«‚ ½9íÖ‡ÚưÀèßĐæüÀ ù×ß»ûĐØâ½÷Á™‰kß [ïSơÔÇ̉™Øëöù×™º¼³zù×’ ÊÛ«‚ ½9麟Öôêă»±»ÛÄÓш¥ˆ]1¹Ú£»÷Á̃ôáÂÓ«‡“Íj‹ÜùׇkñÚăàËƠË%ôêÏÔ¬ÄßÁƒ×›¾Û«‚ ½9­Â½Ô‡Û™‰kß [ïS·Ó ¥0º Êû‹ÇƠÅà­Ä»ăˆŸ;¢ÇÔñÖăˆŸ;áçÚª‚ +¼9ÔÏÅ뻃v¹¶ù×Ơ™‰kß [ïSáˆÁ0q‘±¶Å߈˜ ê è ä «Ô‹ÙøơỞ£ÇÍÄ)Ơ‰¾ª»ăˆŸÛ«‚ ½9¡ÈÛ«‚ ½9ăˆŸ;ׯưÀ‡9¥‡“—Œ¥ˆ]1ÛŽÙ½Û«‚ ½9ß¹åÖ™‡Óº«‡“Íj¶ƒv¼đ«ÔăˆŸ;¥ÁÛ«‚ ½9…¿Ơ±»Ü¹̃©¼Úª‚ +¼9Û«‚ ½9½ä̉ÏÅ™Û߈µØ³Â‡ºÂăˆŸùÚÛ«‚ ½9ưÀ‘Æë×ëö¾ëöˆÿ¯¶ƒÄ±»†Œ†Çâ½ÇÅ¡Á†Œ   Û«‚ ½9¡è·̉½ù׫»·ÔÙ½Ơ™ôÊÓóÔ‹ÇĂ™‰kß [ïS‹Ç߈­ÖÜíÆù×½‹ÇËLJŒ±»¾À×¾áƠöƒvؽºáÛÇÓË̉·‡‘×8纫‡“ÍjăˆŸ;É̉9¥‡Ùܱ»ßÁù××¾°»—¶ĂÈƠXùêŽêößÄÙ€%Ó.›µÜÁ¹íÜÙÏı»ÇĂ¡ÈÇkÛ«‚ ½9«ÑăˆŸ±»ăˆŸ;ƒˆ߈§ôƒØ¦ÆÀ¹ƒơįȓ·‡‘×8çÏÔ¬ô퇿‰Û«‚ ½9ƒÛ«‚ ½9Ÿ\„Ø₫§rÉƯÓ ±»«‡“ÍjĂÙÁ½ß–½Û«‚ ½9ÇÅ™‰kß [ïSÏÔ©Ø×ƠÛ«‚ ½9“ƠơĂÛˆ™‰kß [ïSëØ¶₫®¶µØ·‡‘×8çÑ××Ûö×¾éºÔ¿ºÏỔÅÛ«‚ ½9¡Áß½™‡¶¼̀7ÏÅ8¤‡Öƒv¼™‰kß [ïSùơÙ½Ô“¹ƯNû¼ñ×Û«‚ ½9“ÆƠơ±»ï³2‡º¦Óá—¾ÇÚàö ù×·‡‘×8瘉j̃ZîSñÚ9¥‡߈ŸÓø×ÁƯÚƒÙƠăà8¤‡¿½°»'Û«‚ ½9ùê“ơêù׫‡“Íj¶“Ơƒˆ®àÛÀ¦ôßÁ™‰kß [ïSăˆŸ;óÔƒÚ•Èû›Û«‚ ½9÷Á¹Ú¥ˆ]1ûÓÛ«‚ ½9óĂ³“Ơʱ»±¿”»#ùê¹Ú³Ư—¶ÉÛù×߈™‰kß [ïS̀Ê)èÛ8¤Óº‡ŒÙÚơê˜êèäơêÏÅËÖø×߈´‰«‡“ÍjÛ«‚ ½9×ÜÙ½‡jƠçºù×Ơăêû:éÓÛ«‚ ½9ÿÆåˆ”Èú¡Ôùê»ÁÖ̉ùºÙƠăơ†ºí‡ù×罵ءñÓ¡ö—¶ù뙉kß [ïSĂÈí‡߈÷ÙSΈï»»Å‡ÇëÑăˆŸ;ß›YÅØívĂÙă$¯/Ó¾½ĂÙëö¡Á‹Ç¡Á‚vÅØçÚǺÏÔÛ«‚ ½9ùæï»«%«ÔưÀÑÓ…ŒÁƯº›¡°»ív›ÚÅôÖÔ†6¦j¡»Û׫‡“ÍjÏÅ­½¼÷Á¸ÙÚëöëöÙ½‡±»ùש‡¥2ßëMÇÖÇâÿ§ñÓƯÚ±»ó•å̉ ƒvçăˆŸ·ÔíÖơÔƒÖÛ«‚ ½9ƠƒvéÚ­Ø«‡“Íj˜‰j̃ZîSÓ¾öÁ×ÓñÓíÚ·Ô”%߈ï³2Ѷ¹Ø±»ÖØ߈¶èçÚÏ̉‡ŒơÔ™ÔÏÔËÉ9ƒØ‡ơêëö±»©ÇµaăˆŸ;ĂÙñÔ±»ÓÁ“ȸÚ÷‡«·3uUÅØщơêëÓÏÔ8 ¤‡ Ö ăàëöù¿Ç̉ÙÚ±»ù×…ƯÅØÏÅÆØ…Ơ£Ô°»ƒvÛ«‚ ½9·Å¹Ú©½í¦Ó-‹ÁÏÅĂÙ÷‡±¿ăˆŸ;¾ÙÚÛ«‚ ½9©¼Ù½Ù½Û«‚ ½9€ºÎ̉·ÔµØÛ«‚ ½9̃ˆÂ*߈ñÚ½ØùסÁ¹Ú‘÷œ‰¾I™‡ÿÛÅgëö—¶ÂÙüê÷ÁƯÓ Ë%Ïų½Û:Ǽ߈ĂÙù×›¶é†“Ç¡Èׯ̣NjǨÓÛ«‚ ½9âƒĂÁƯó#ÏÔ}Û«‚ ½9ÏÅÙ‡Ï9…߈© ™Ô™‡°»ÂÙÓÔö÷„—¶߈ºôÆĂÏÔ«ỘÇË̉™‡ßÄÙ‡¿ăà¡Ôç̉ÙÜ“Û̀ÓăàÙ½߈ÁĂÁ¼†̉ưÀ±»éêß»û¿‰¡‹̀ûØ߈Û«‚ ½9Úª‚ +¼9íÆŸ}™‡«‡“ÍjÛ«‚ ½9™‰kß [ïSﻇ“º­Äá óŸƠÓ¼ñÚơèÅø¾“ƠưÀƒvăˆŸ;³éÓåÁÍ­HæÚ¿ôƒv•—·Ó ¥0ËƠëö™‡߈ôù׎¾߈ÏÅûăơÁăĂÁ¹ÏÅ™î齿‰­Ö™ëéåơê»Å—ÓĂ¼ñÙŽíÖÖÆ“ÆÉ››¶é¿Ú±»µ‰©‡¥2ßëM±È©ÓĂ¼‰Æ«ÔÙ½Ï̉‚½ă»«‡“Íj«‡“ÍjÙ½‡ºƒvƠùדƠñÓ°»±»™‰kß [ïSëÚ½€ÏÔÿ¼Û«‚ ½9ù×Áđ™‡ÁĂ—¶ñÁ›ÏĂíÖÚ ª ‚  + ¼9 í—GôÙÚÙ½ÅÁ¶¶È"ăˆŸ;k¿(÷Ú«‡“Íj©Ơ߈ù×ĂºËÜ‡ăˆŸ;«‡“Íjù¿ºåÆÇ»Ûº™‰kß [ïSñÔ‹üơÔ߈¹È¶Ôÿ¯¶áêÊÇÍíñÆëö¿Ø÷ÁÏÔƒv‹Ç¿‰ëö½ơĂÓÅ߈ËÉ9ÇÖùêƠºmÛ«‚ ½9Ăôá=ñÓ«»ĂÖƒƠ¤ˆ \ 0 ÁĂ€¼ +¾·‡‘×8çÙ‡Ï9…«‡“Íj«÷±»̃ˆƯÚ°»ĂùÜÏÔŒÛù×ׯù×½ºÏÔ›¾ѾÑÓŸ}¿ßØ×½ỂưÑÏԳ•îƠ¯›ÚÛ«‚ ½9×ĂÓ¸ùëßÄÙơêơÔÁƯ½€ÀÁµØ½ơº§ÔÏÅÍÓ½ôƒvÁ̉ăˆŸ;ÿÚÏÔ£©Óö̉ ©‡¥2ßëM½ÁÛ«‚ ½9Ơ½Í”ăÖ™‰kß [ïSÑÅùæ³ÆÏÅÁĂƒÖº§¹߈Û«‚ ½9ăˆŸ;ôêăˆŸÙׯÅï³2¿‰ËDZ»¹Úù×ƠăˆŸ;‡ñ5¡Ơ‡€ƒvÛבÆÅÓÛ«‚ ½9߈ ËÇÀĂ™‰kß [ïSÙÚÁĂƒÚ×ñÓ¡Èר™ÓσÚéơ³×«Ô¿‰£»ö$ƒ©ƒv÷ˆ©—ùêÏÅ«‡“ÍjŤˆ\0ăˆŸ;Îħӡ۷‡‘×8çÖÁÅĶà=ơêơï߈­Ö§ΈƒÔ—»±»ÙñÓ߈„ôÛ×ÁåíêăˆŸ;kÛ«‚ ½9ׯ߈óÔûÓÙÚ× ỡ ´† ë˜HơèÅ׿8©‡¥2ßëMíêÓ ¿»¿Æ·‡‘×8ç¡ÁÇÖÑĂÇÖ߈±»™‰kß [ïSƯ‰Àñ»™‰kß [ïSÿÚëÔ™‰kß [ïSĐĂßÓ½ŸÖ«×—¶ä̉Å×¾ÅÔØ×ƒvß»û¼·‡‘×8ç¸ÚûÓ—Ó«»“ÆÿÚ³º½Ơï³2ë™Híâíê½»ĂÛ«‚ ½9ßÄÙªÚÚ× Á̉™ôÑ+­Ä±»½ÿ§™‰kß [ïS÷¶ÙÚå¼ …̃ëö×ƠåĂÿ¯¶±»·‡‘×8ç¥ØĂ°»Á­Ä¹ø×₫ ®¶ ߈÷ÁµØ¿âƠÙÚ“Çÿ¯¶ϹåơÙ½á ­ÄÙđÙ›¶é¶Ô™‰kß [ïSÁƯÅØ9¥‡ÚÆ/™‰kß [ïS«Á̉½ôÔ¶Û×åĂ«»÷$₫ÛßÚ©ºù׿‰éêó¦·Ô³àù‡ö™̣­Ä÷Á“¹ƯNßÄÙ…µØ±»ËDZ»Ăº·‡‘×8çÛ«‚ ½9ßÄÙñÚ×¾«¼ƒ¯¼ăˆŸ;߈óÇƯÓ å‡®ÓÛ«‚ ½9ơÔ8¤‡×ĂºÿÛ‡ÇæÚßƯÙÚ»Åăà™‰kß [ïSÛ«‚ ½9Û«‚ ½9ÏÔÏÅ¡ÁöÇÛ«‚ ½9ªÓƒÔÏÔ“Æ£Á·‡‘×8çÛÀÆ»ØûƠƒÖ‹Ç¡Á¹±»ÏÅăˆŸÍ©‡¥2ßëM‰¿I£ä¿‰ÍƠÏÄ¿º­ô¡ÈÙ½ù×å̉ ‹Ù­Ô·ÔĂÙ¸Ú±»Ơ…»ß°ö£ÇÈ̉™ĂÇ֯ȋÈὫÓÁËù׉ÛçĂ½ÊÚ‚v‡Û½ÎÅ`ĂÙÔX½€ø×™‰kß [ïS©ˆÇÓµ†ƒ½Ñ±»¿‰“±»›¾êö.”ö›¾Ưº½ÔƠËá°»—¾›¾Û«‚ ½9ơÔå̉ ĐØÛ«‚ ½9× ±»Û«‚ ½9«‡“ÍjÜÓ ăàè÷ÁǼ±»°»ÙÅëß»ûăˆŸ;“½ù×ォ‡“ÍjƠ÷Ùï½Ơéꧺï³2̃ÄØù×ÇÇ™á ™Áƒv™‡·Å™ĂÂĂưÀ¯È߈߈öƯºä̉߈߈ÛÄÓóÓËƠ€ƠÏ̉Ù½ơê³ ÅÔ©¼™‰kß [ïS߈±»à½D°&÷ÀñӃةØÅØÙÚé₫±»ܾEơĂ³(“Æ9¥‡ßÖăˆŸ;·ÔÀÓÅßÚ¿‰ăˆŸß½¥Ø«ÔÁ ™‡ûÁƯºÑÓÙÚ™“ưÀö™‰kß [ïṢĂ÷Ú«‡“Íj߈¶¿Å­Ä·Ô؉j̃ZîSÆÁƯÍĶô½ù×™‰kß [ïSÏԯ׿µƠÔÛ¹“ƠÿÚĽÍÓ¡ƯµØ™‰kß [ïSåõØáꦺé‰ñ5ñ·8¤‡ÄôñÚå̉ ăˆŸ;—ØóDZ»«‡“Íj¹ØµÜêö¿‰ÏÅăˆŸ;±»ß»û₫®¶߈½Ô™‰kß [ïSׯ߈ûÉơĂ—Ø·ÔÁ̉ûº±½™‰kß [ïSÑÓÛ«‚ ½9Ÿ̉×ÿÚăˆŸ;Œ₫·È—¶°»±̉«‡“Íjêö«ÓçÚÿÚôꙉkß [ïSºÛÄÓÀƯ…Û‡“©‡¥2ßëMËÖÿÚ«ÔñÚ»Å÷Áƒ¾‘Ơù×Ăëö°‡­ÔÛ«‚ ½9°» ƒ¾‘Ăôÿ‡Ơ±æđù×ÏÅ¿Åù׿ư­R½ßÚ¿»»¿‰ư“ơÔ‹Ç߈½÷‡¼ÔÀ‡€è/Ö:ºyú÷Á§ºđ»0ôÓØëö÷‡‚v½ăˆŸ;ù¿åô½µÁ±»¡È½Ô×ÓÛ×ưÀº½—¾™‰kß [ïSÑÄëù׳à“Û½ͺƒÖƒˆß»ûÑÄëÿÚơêÏÔÈÑÓ˜Áÿ¯¶ÆñÖƒv‡Ç›¾ÏÅƯç±»ï»Ôëö€öÓÅ«‡“Íj…ÔóÄƠ«‡“ÍjçÚë$÷‡ºͼ™ÔăºăˆŸÁщÙÚ·‡‘×8烈ôê +›ç±¡Èù×Đ·‹Çùº±»½›¾ǽ̃„ƠXÚÇÛº¿‰½‘‡‡ŒăˆŸ;kÅÓëö¡ÁöÁó·̣½€­»é¥ƯﻬÖƯº“ÈÛ«‚ ½9ĐÓ•đ§Ô±»ûؽ…€­:ͽÿÁ¹ÚÙ½ùדƗ¶™ÁçÚµ†÷Á¿ÅëÑÓơÔçÚ¿ºĂÙÛ«‚ ½9™‡ÏÄưÀù×Ù½ơõØ߈à ƒÀׯưÁăˆŸ‘ +›¾·‹§ăŸçß»ûÛ«‚ ½9ôơŸâˆ™‰kß [ïSÿÂƠ¡Ụ̂Â₫·Ôv—ˆÛ«‚ ½9«‡“ÍjÿÚÛ«‚ ½9ñÓ£‰½¶©Ó›¶éí—GăˆŸ;³ºó©ÜçÚï½Û«‚ ½9µØ¹Ú›‡ÙÚơêׯẳ̀Ê)èÛ8¤‰Ô¿‰È߈±»ÁƯíêƒv±»ơÔăˆŸ;ÇÓ߈‡Ç©}ÏÔÿÚ±»ëöµæăơâˆ:…â»Ó»ÅµØ߈ÍÄÚª‚ +¼9“½¸Ú߈ÁƯ£Ô±»Á¾«Ôщ€º—Ó÷»ñÓ§Ô­¾ÙÚÉ̉‡˜úÀçÜÇÓËÇÛ«‚ ½9÷¼ÏÔ¥ăˆŸ;ÁƯ›¾À½³ºóñÓ™‰kß [ïSŸÛ½ôƒÖ±»Øơê±»ù×9¥‡ÏÔÊ¿å̉ ÍßÅÁơÔ˜‰j̃ZîSÏÔ½Úª‚ +¼9ơꙉkß [ïS‰ñ̃½›¾†Œ™‰kß [ïSÔºlÇÖöô·Ó ¥0߈ư‡±ù1ưÀÑÓù×ÑÓÛ×ă\¡È»Á¼ïAÇàĐÓÄÑÓô»Ÿ}«·3uUÁƯÛ×å¿Ơ˜‡½ñ¹™ ™‰kß [ïSÚª‚ +¼9ׯÙÚ×¼ĂÙ¾߈ÏÅÂÙÆÖñÖĐÄꦹg½›¾Ľ߈§ÔÙÚôù×™‡‘Íôÿ.ÏÔƠÍƠ·‡‘×8ç߈ƒv9¥‡µØ¾¨¼ÏÄÏ̉™‰kß [ïS߈ÓØË̉߈ùדƠưÀçôƠơ¾Ól¹»œÚ|™Ô±»½|ívß»û±»³ÈăˆŸ;Û«‚ ½9Îơ‹Çơê…Úÿ¯¶µívù¾½ăà₫‡‹ÛăˆŸăº¿ăˆŸ«‡“Íj°»›¾£Ưƒv©‡¥2ßëM¥Ë×Ơ†7§jăˆŸ—ˆ°»ĂºÏÄ9¥‡É¿‰¶Ô¾‰©-ÛÀÙ½ăˆŸ;Á½çØ9¥‡™‰kß [ïS·§D ùÚ«·3uU°ÔßÚăơ©‡¥2ßëMỞÇ»ăÛéÚרÓØ^Ơø×,œÁâÁăˆŸ;«»»ˆ˜‡ÛÄÓƠX«‡“ÍjơꓽÏÔ¹Ú¸Ú£äÛ«‚ ½9ù×ßÚ™‰kß [ïSßÖÁ¼ŸÈƒv˜ÁÙÚ›¾±¿Ëáøơ˜ÁIÛ«‚ ½9­ÄûÙíÆù¿ïß·‡‘×8çç̉Ăȃˆ°»½̉¾½b“Ơ‹ïư9ơơŸÅÛ«‚ ½9ĂÆÅÔĂÙăˆŸáçưÀÑÅÛ‡ÏÔ©‡¥2ßëM₫́ÿdžºưÀÁĂ½ÔÏԋǫԽÿ¯¶«‡“Íj™‡³ÑĂƠÅăˆŸ9¥‡×ÂíêơèÅÛƠ÷ÁăˆŸ;kûØûÓÙ½…»†º±»ăˆŸÏÅ×Ơ½̀ÓÛ«‚ ½9̃»ú÷‡¹Úă½̃ˆÛÇôđÖµØÛ«‚ ½9ÇÖÙÚ¸Ú9¥‡üÀÙÚ«‡“Íj™Á«‡“ÍjÛ«‚ ½9߈Û«‚ ½9˾çڃדț¾ɶá×ƯÓ ¹ÚÁƯ˜ÓÏÅù×Ùu½€·Ôª»ß»û¾ö•×ù׿ŹÚÑÓ½´•ù×ÏÅ«·3uU±»“¼±ÔĂĂ ›­±àéM˜êèä₫ăˆŸ;•ŒÛ«‚ ½9ù×¾ăˆŸ;·#ă“ÛÀơăàŸÈ‘ åÁÛ«‚ ½9äÍ–Û‚¡Û‹¢©‡¥2ßëM«‡“Íjí—Gÿ¯¶9¥‡½ÏÅ—Œ¡+ưÀÙÚƒˆíÖƠÇÖĂÖĐÓĂË߈ư­§‡‘ëă½¹Ø¹÷ùơ™‡Úª‚ +¼9¹³Ăö÷‡ƒ^Ă¼€¾çڵ갻ĂÙƠƠ±¿«‡“Íj—»™Ü˜Á«‡“Íj›¾ßÖÛÄÓÚ¹‰ơï»Ù"Ñ+¡Áà=ñÓ³˜ôå̉ ö±»±»ỞÁĂÓÅ»ü¥Ø›ÛéêÓÔX)Ưå“Ơ½ÅÔÛ«‚ ½9™‰kß [ïSÏÄĂÙù×ƠÁ¹щ̃ˆƠXĐØ=ÅôäÁ»‹Üï³2™‰kß [ïSßÄÙí½ùêÅØ¼Ø°»ƒÖƯß‹ÇÛ«‚ ½9˜êèäÅÔ·Ô×ƠéÔÅÖÁø×ÓÆ½Ở½Ôá꫇“Íj›́ÖØ ÜơÔĂÈăơơêÑřӇǺăñÖ₫Ô†Œ™‰kß [ïS«d²ơèÅ÷‡ºÛÀ©ÓÙ½ưÀ³ô£äÏÄå̉ ơêù×Î̉«Ô‰Ô°»ñ×ùׯ×çÚ³ØÁ¹›¶éÿÆ€Ơ½ĂùºÓÅƠXưÀĂ¼´ÎÔ¾FÙ½‡¸‹ÇưÀæ̉¸Û«‚ ½9öø/ÓØßÄÙ³ÇÑÓëö¡Áù×ùô©‡¥2ßëMơĂ߈̃ˆ™‰kß [ïS«‡“Íj·‡‘×8çóÔ/шƯÓ óÂáˆÁ0qÛט‰j̃ZîSå×9¥‡̀Ê)èÛ8¤½€øê÷ÚμÏÅ—¶·ºÏÔ§(ù×ñ×çÔ¡ùêÎű»÷‡ß»ûÑÓÓÆ¸Ú¯¼í‡áê«ÔÑÓƠ¡Ô­Ä‘¤߈ăÚÁĂƠ¡ƯáêÛ«‚ ½9ñÖ»nר™‰kß [ïSÍăˆù¿ÅÔï³2Á‡ơúÛÔĂÙ“¹ÉPؼÏÔ‚vÑæ·‡‘×8çÿÚ—Ú¹Ú™Ó›¾ï²2ÍÄÖÆ ½ß»ûØ×—¾½¾©÷ÚéÓû(‡÷ÀôàÏźỞÙ½“…ăˆŸ;¿ª»å‡±»÷$ËƠå̉ µØóÂùæ½È›¶é«‡“Íj±»‡ºÙ½ƒv‹Üƒv•ÇÏÔ£ØÛ×¹®ºÙ½›v…ÚÀ µØÉ̉» áÙ?¡M-ËơÛ‹ù×!#¹ Ơ ×Éùư • +‡¹'ư¥í¹Ú«Ô°»ĂÙÁƯÛ«‚ ½9³Ơ‡x‹ÜăˆŸ;kĂºéêÍÄÏÔ½ØÛ«‚ ½9ÇÖ«dÙ½‡ÇÁ½ƒvâˆ:k˜‡Ù½éÚºÈ̉Ó£XâˆÓ´ÑÓ…Û«‚ ½9™Óû(Ù½—»ăêÅØ¿‰™‰kß [ïS‡ºÏ÷ÙáÇÓ±»˜‰j̃ZîSơ¯ÁĂ™‰kß [ïSÛ«‚ ½9Å‘üÛº߈ޱ»£äñ̃±»°»¯È¿ç·Ó ¥0³uçÚ÷‡ëö߈ưÀÄ ‹Çщ«Ôÿ£©‡¥2ßëMÙ½‹¿Û«‚ ½9µØµØ¶º9¥‡›¾½™ÁçÀûÓÓØ߈Û×ĂƒvµƠ±»Ù±́¹Ú9¥‡ø¼ơéÁƯÍÓ­Öô멼ù×ù¿±ÈơèÅ£ØÏÔß»ûÁ×ưÀí–G·¼Í7«‡“ÍjÍÇ÷ÁëöéÔø¿‡Ϻ9¥‡½çÙ½©ÓăˆŸ;÷ÁÇÖ̃ˆ™‰kß [ïSơ$ñÓ±»ƒv­Ô›¶é›Û̀¬H߈¹—ƒvÙ½ơԵؖ¾™‰kß [ïS˜‡…Ô¸Ú«‡“Íjă½ψÍÄψ«‡“Íjăê—¶ăÓ₫ñÖöÑĂÏÔƠÓØ€öÏÔù×ß¡ÛƯÓ ߈ơăˆŸçøÛºÏÏŇŒăˆŸ¹̃ƯÓ ºÙ×ö×°»©¼ÁĂ׿8Ç«‡“ÍjÏÅËÉ9Û¹ÚàNÛ«‚ ½9ÿ¼™‰kß [ïS釧Ӊ•ĂÙÛ«‚ ½9ÙÚ«‡“ÍjÁ̉ư“ẩщ¾ß¡ÈØŒê*ªÛ×Ûº߈¹Ú£XăˆŸ;k‘ù×ÄØ½™‰kß [ïSÛ«‚ ½9ßÖ·ÔăˆŸ;磅ÏÔ¯¼ÙÚÏ)ÍƠÛ×—¶ÛÄÓ«‡“Íj‡é¿¹Úª‚ +¼9ăˆŸÿÚđ»ÏÅ·‡‘×8纹ÚåộÄÓăˆŸÏÅỡ‚v!߈Žÿ›ӱ»ĐÓí—G¡Ó·ÔÀÉÖ»Û«‚ ½9ăˆŸăˆŸÛ«‚ ½9ßÖ‡ÚöÂÙ«‡“ÍjÁ¼…Çëö˹ĐÄê‹Ç±»›¾£ä±»ź™‰kß [ïS÷‡¶véê߈½ÛÄÓÅÄñÖùײÈe¡ÈׯăˆŸ;kùט‹ÜJÛˆù×ơÔ¡»ÅÓƠ´ºøBÛ«‚ ½9¹Ú›¾±»ăêÛ©ØëöǼ˜‡ƒˆ±¿±»˜‡ Å‚+F‹Çøê³ÖÆ\¿ôñè%ɇµØëöŦÓÏăˆŸ;¿ôƒÖ¯Èø×ÎÅœ‰¾IùפÜơꛡª)纙‰kß [ïSóÇ¡ÁÑØ߈̃ˆăêÅØ߈ăÔôđÆơ½ÇÖ©Û×ÅÙ†äßÄÙÅ»™Ôư“·‡‘×8ç®×±»§Ó»½‹&­Ä×Ă““ÅÛ×¾ÙÜÑÄëăÇíăêÏ̉ØÚºˆƠÉĂ›¹·Ô“ÈÁĂÙ½ëöù¼–Øí—Gƒˆ¬Öƒv™ëéåơê·‡‘×8çÅØ—»°»Û«‚ ½9øÜÑØÏÄ5³(ù¿ÏÔ÷Á‰¿Ié”%óÇ÷ÁÏÅ™‰kß [ïSªÚ…Œå×µØÑÓÅôù‡¡̣߈¿‰Å؇º÷ÚơÅÏÔưÆÉ̉½á «ä½ơêÛÀ…½©ƠíÙÂƠù×3©‚vÏÅĂôÙô߈öùêƒv9¥‡ºôªÚÏ̉±»¿ºµØ±ëØ«‡“Íjƒvàç̉åĂơ꫇“ÍjÿÚơԱŧ,«]ƒØ£„8¤‡̃ˆÑÇ׵ØÏÁƯëöÏÔŸÅỂơêŸ̃™ơ߈÷ÁƠéôË%çÚöĂ«¯‘½ +‹Ü§ôÍƠ‡ơê¤Ó«‡“Íj«ƯûÙơêÏÚ—›¾ºq™‡ÅµØ߈Á̉ƠŸ}Á¹™ëéåăơưÀƒ¾‘“È™‰kß [ïS¹Ú™‰kß [ïSĂÙơØ·ÈÏ̉Ư•–ÙÜçØçmÓÅØơÔëöÙ½»Å8¤‡»Ø¡á‡x₫®¶ÙÚ£Øáê–ƒƒ¦ƒ̀»ƒƒÛÄÓ•½©&‘Øù×›Ăÿ¯¶ëöùææƠ«»¥ØÍY©Ó¾‰ÛÄÓ±»Ù½Á¹¡Ô½€8¤‡ÿ§ƒv…£­Û׳ºóÛ«‚ ½9Đ·ñı»ÛºơÔ½ç³ÈÙ×Á½ÿ¯¶¹Ú¹Áö9¥‡×ܽù×߈Ư§ôôêáÄô₫ÂÅ÷Á±»9¥‡©ØÁƯ°»߈½ÏÔæ½ÅÛƠX߈̀Ó¬€ÙŒë*«ÎÅÛ×ÜÜ¿‰äÆÛ«‚ ½9ÜííùêψơÔëöÍǧÓÙ½ŸÈ™‰kß [ïS÷ÁÏÔɇª¶2tTºÛ«‚ ½9ỞĂÙ½€ưÀÛ±»߈ăˆŸ;äôÿăˆŸ;ơê¶«‡“Íjù×ù×ăˆŸ;ƒv·ÔơèÅÏÅǼ¸ÚÏÅÛ«‚ ½99¥‡ÂÙ¥Çö›¾¡Ô·Ó ¥0׿8«Ó™‰kß [ïSƒv¿ÙÁƯçÚ£ØºĂ©Ó½ÙáÅÁ̉¢äº½ÁƯ‹Çù×½™‰kß [ïS×ƠƠÚ¿‰ÍË)éÛ9¥‡Œ­¾‹ÜơĂẳÑÓÏÔëö±¿£ÇźÛ«‚ ½9‰²ƒv¸Úƒˆ˜‡ψ‡ÇĂºăˆŸ;kñÚ³”«‡“Íjµ “Ơù×ù̀Ó›¾çÚăˆŸ«Û¥{ÿÚ¢ô¹ÚçµØÏԳ׫‡“Íj³Ø›¶é¢ÇÁĂ« ©ƒ»5÷Ú±»·ØÙ½Û׿ËÉ9«‡“Íj±Ï̉Ÿ}×ƠÇÖËÉ9«ÂÛ«‚ ½9û(ăˆŸ;ƠXÛ×÷Ú÷ÁÓºÅÓ×¾ăˆŸË%ăˆŸ;›¾ÂĂ™Á÷ˆÚª‚ +¼99¥‡ăˆŸ« ©ƒ»5ñÓÛºÙÚñÓëöĂÈÏÔÿ¯¶ø×!߈—¶å̉ ÑÓÙ½·Ø«‡“ÍjáØƒˆ½¶ÜơêíÆ˜êè䦹åÁ…ƠÉÚª‚ +¼9߈ÀË÷$ßÁ³ÑĂÈÏÔù×ëöĐÓÑÅåÁƒ߈ù×ÏÔôêö´ê‡ŒăÄ%ÙÚ߈Ăô›¶éÓØ™‰kß [ïS߈ϺăˆŸ;…àÛ«‚ ½9¡ÈÏÔơ껾¥‰ÍL……»ËØÏÅψÛÄÓ׿8½‹Ü›ĂưÀĂǼ¡Ôƒv£»“ÈóÇívÍǰ»¤Ó£ä§‡Œ¹ÚöÚª‚ +¼9Âщ‚ÑĂëöéêË̉Á|ºÏÔªÚ™‰kß [ïS¿×¯×ƯÓ ƒˆ«‡“Íj߈óỒÛ«‚ ½9ÏÅ߈‰Æ›ÛÅØĂĂ ›­±àéMĂÙÿ¯¶Ѷ›¸·Ôß½ØûÖíơ»ÓăˆŸî»ơèÅû¨× ËÉ9ơêÑÓ™ÓǪӱ½—ŒÛ«‚ ½9߈÷ˆÛ«‚ ½9ÿ§Û«‚ ½9Û«‚ ½9‡ŒÙ½ϼ…ØéºÍÇí|ÏÔöÚàÛù×µØÛ«‚ ½9ÿ×ÆØµØ‡’Æׯâ®߈ÜÓ gôú»Ăư“·Åơê½€±ÔĐÓ߈ơÔ‘—ă»8¤‡ßÔ—ÓÙ½Ơƒ¾‘çÚ¾ºù×Ù½ăơá Ü߈ÄôăˆŸ™‰kß [ïS‡xŋٷ‡‘×8çºêơQÇÖ¶™‰kß [ïS¶Å‹Ü™‡Ù½êöóÇÖ·Ô¶22ƠÛ«‚ ½9ßÁâ½Ǽ«»‡ÚÇÖÛ«‚ ½9¡Ô÷ƒ׵ØñÖ¿»—»«‡“Íj½§Æ½€ºï½Ù×ơĂ¥ÓÅØ£ĂæôÁ̉€ƠöñÙÙ¾µăĐ—»•ÇÅÓÓ̉›¶é©ĂăơÙÚù¿¹Á¸È¯ƯÀĂËâ“Û™‰kß [ïSÄÔ½ôÏÔûÀóÄ«‡“Íj‡ŒÙŒë*«÷ÙºƒˆÏÅêöË̉ß„¦Ô“ö™Áÿ$ăˆŸ;ûº·Ø‘Ú•%‹Á‚v½±ºÏÔ‡ºăÁ¹ÚĂĂ ›­±àéM÷Á‡…ÿ§ÿ‡™‰kß [ïSåăêăơß»û•Öáá߈åĂÛ«‚ ½9å̃§½ăˆŸçÚ ØÏÔ¥Øíê¹Á²íÚƒ™‡¹ÚåÜÀ²Ơ$ỔÙƠ¶ÔơèÅöµØßÔƒvÚª‚ +¼9ưÀ»÷ÚơġԘ¿Ø×₫®¶»ù×ÓÔƒvưÀ¿Å¡È™‰kß [ïS¯ßÍÄ­v½¡ƠÇÖ§ƠëöÏÅỠ߈‘̃—»µØï½Žăơ­¾߈ßÚ‚×·‡‘×8çÙ½óĂùףئôÙ½—Óù×ƠÛº·Ô·Ô©ºˆƒà9¥‡¾ºí¾Ï̉«·3uUÛ«‚ ½9áêºy Ù½ÍÄ©rñÖŸÙ¸Ú¨ØÙ½…‹«d¡Á¿»§Ô“ÛĂ› Ëû´Ă·‹—ˆß»û³ô°¿߈Ûű»³Î̉éÚ8¤‡½­ỔĂÙĐÄêÁ|ƒv©Óù×ϼ—Óù×ù×߈çĐñaƒvƠ½‰¿IưÀŽ›¶é̉½!ửÛ«‚ ½9ăˆŸ;½€ưÀßÄÙ¥ơĂùêÏÅÛ×ơÔÆ_³Øψơê×Û«‚ ½9•ܱ»™‰kß [ïSçmơÔµØÏÔ»úñíÈ…&ºÛ·‡‘×8ç‹Üº÷ˆ·ÅưˆÛ«‚ ½9ù×Úºª<ͼÓ̃ˆĐˆ9¥‡ëö›ÛŒĂ«‡“Íj¾™‰kß [ïSÉ`߈ÅÓ®Ôß»û›¶éëö«‡“Íj™ÓƠÁ½ÏÅǽù×ù‡ï»Ă¼½Ôơ™‰kß [ïSÄÛ׆Œơ‡…»÷Áă°¢Ơް»›¾ͼ‹Ó¶ƒa½€¢»¡ÈÎÅ9¥‡×£äÛ«‚ ½9ûÓ½Đæÿ¿߈ïô‹ÇăˆŸ;k¼€’¹ÜN·§D ù׫·3uUưÀ©ÓÏÔĂÙ°»ÇÔÏÅç̉¾ºưÀ‡º­Ô»Ø¡Ô©‡¥2ßëMơÔÛ«‚ ½9ÇÖ߈áêÇÖ•{‰y›¶éăˆŸ;k‹ÜóÇà œ‰¾I‹Ç¦¹Û׉¿I«Ü½ët߈9¥‡±»™‰kß [ïSíêÿÂ9¥‡¿ß¿×ÿ§ÍË)éÛ9¥¶™ëéå¯È—ó¿½™‰kß [ïSÏÔĂÙ¿́±‡8¤‡đ¹˜ ½ơÔßÄÙ½ÈëöíÖó|8 ¤‡ ăê÷‡öÁ“Æù¾¡Ô¡Á߈₫u9¥‡ÏÔ8¤‡“ƠÙ³ÇÓ¼ÙÚ߈¤Æ¹à¦‡Ú½€å̉ Ï¿‡×߈ăˆŸ;™̃—ˆĂÖơêÏÔ߈íÊ₫§ăơâˆ;ÿ¯¶¯Èë9†$·ÜÓºåôáê«Ô—Óÿ׫‡“Íj·‡‘×8çµƠùềÓù×½¾‡“¹ƯNù×ưÀÇé8ß»ûư“ÁĂăà€º‹ÜÏỖˆÙƠ߈¡¨Ç é‰ñ5ñ·Ǽ™×ñÓ¾»‹°ûêö«·‡‘×8ç߈óÂăàÏÅ߈Û«‚ ½9—Ö߈˜‰j̃ZîSщ½ÔκÑĂâđ¡Èù×å̉ ŽÛÄÓ°”™‰kß [ïSÑĂƒ™‰kß [ïSëöĂ½€ÏÔéêÇÖŸư׿º¡ëÁËĂÙ«%±»Ó +ÙÚÛ±ߟ½«Ñù×½œ·̉ ¤0À¹ï½ù׉۹ÚăˆŸ;™‰kß [ïSÛ«‚ ½9å̉ “È«‡“ÍjÚÄ̉å̉ ³ưÀËÉ9U™‰kß [ïSô.ÓÆª¶2tT­¾ÁƯ€ØÍÄ8¤‡ÙÚỞ•ŒËƠ߈¬_«»Íä¥Á»ÓÆóÂÅØ÷Ô9¥‡×™Ô÷ÁÛ߈9¥‡ßÖ́ÅĐÓå̉ ñÓ™‰kß [ïS¾½ÇØϼíJ½ÔÈÏÅÎÔ˜‰j̃ZîSưÀ©Ó“߈µ†áêÛÀăˆŸ;÷Á÷‡å̉ µØª‡’̀j«âùêưÀ—¾ØÇÛ«‚ ½9匿NˆÚª‚ +¼9ƒˆ³ºó—¶ăˆŸ߈«dÛ«‚ ½9ƯÚÙÅë߈Ÿ̀ƒvψ›Ư߈ÇØù×Åà¼ë™ÔÏ̉£ƠĂÈ“È噇å̉ ‹Èíµؗө‡¥2ßëMÅØƒÖ—¶³ÇÙ½ñÖÿ¯¶©‡¥2ßëM‘Óù×®¼™ëéå›vÏÅÅØ‡Œ̀ă­Û«‚ ½9ÍÓâˆÎ̉麷ԺĂÙ×±¿ù×éêÍË)éÛ9¥ÇÖÇÖ±»›¾ñÓÏÔ—¢£ä×Ü߈ç'µÏÁ“ØÅ±ê±«Ñ“ÈƯÓ ĂéÓ«‡“Íj…Öɹ́ÁÊÖ׆Ó¿Å…»9¥‡߈›¾éº±&ÑÓ¡Ô߈ÖÆ ƒÚï½ÁƠŒƠ±»½ăˆŸñÚƒ«‡“Íjăà™Œß„íê±»í½ù×öïƠöœĂ +ÿ¯¶ŸÈ™ơ•ŒÙÅëÙ½Û«‚ ½9ï»ëö§ăù¾‡k©‡¥2ßëMá ߈¹Ú…‡ŒÁĂĂÙëöúƠù׉%Çôɇ“ºơÔ·‡‘×8çñÄÊq‰¿IăˆŸ;kßÏĂë±»ÏÔƒvá¾ăˆŸ›¶éăễ„ï̉ÏÔăˆŸƠÑÅÚª‚ +¼9߈³àƠü¦†Î̉ĂÈ¡È8¤‡öáêǺëöôñ»«‡“Íj®Ôù×÷‡•½‚ÓØ«‡“Íj·Ó ¥0ăĂ3½‰ỞívÙ×9¥‡×Ÿ9¥‡×¥Ç«‡“ÍjùêÏÔëö%ÏÅăˆŸ;kƠî»ÿÜ™‰kß [ïSơÔù×ù¿ñÚÿ§߈³Úœ‰¾Iëöƒ¾‘ÏÅ…nÍË)éÛ9¥•ŒơÛ‰ø™‰kß [ïS“ÈóÔ¿ø·ÅÙ½₫®¶í‡à¬óLJùת¼‡Çá₫ÅĂ¡ÛÙ½×܇·‡‘×8ç9¥‡¶Ởƒv½ÎÔÑó£ä©‡¥2ßëM¹Ú“ƠÑe±»µØơÄôpœñÓăˆŸÏÔÛןŷÅÇÖ­ÖÍÄ™‰kß [ïSơ»8¤‡ưˆÚª‚ +¼9±»±»üÀ—¿æÚËÓÛ«‚ ½9·̣—¾«‡“Íj°»Ơ³Â凱¿¡»ù×™‰kß [ïSĂ¼̀ijØ̃ˆß»ûŸ̉ˆ”=ăˆŸ;k™‰kß [ïS“È̃ƯÏťƟȅŒñÁSß¶Ô©‡¥2ßëMíØƒØƒvÛºµØÙÜÏ̉÷‡ÍÓ¸Úß»û߈å¿ăˆŸ;«‡“Íj…ܼ؉߇º½áêÁÆéÓ°¿™‰kß [ïSăˆŸ;ÙŒë*«©ÇçÚŸÖñÓ³z›¿ÛÆö¤Ç±»Åá ¼àưÀçÚÏÛÀ±»ç½±»߈½ơ»µØƒˆ¡È»—T‹ÇíÓ‘«Û×ɧÔÊqéÓ†ÚÑÄë‹ÇûƠüÁ +÷ÁÛ«‚ ½9±»˹ÿƒv÷Á­—Ï Đ»€‹đƯÚç½ĂÙƯơ™‡ĂÙ¹¶¹Ú½º½£ä™‰kß [ïSù×±¿‹Çëö½€öÁ—¶™‡ÅÔׯùæßÖ½Úª‚ +¼9—ˆơêñÚå̉ çÔ¡÷Ú³ă¶¸©Ó›¾ùê½€¹Ú5«Ô›ăˆŸÙÚù×ºĐØ +óǫӕŒ©Ø÷Á·‡‘×8çG½¹ÑÓ“ÈÜŸ¹Ë ÏÔƒvÀƯù×Û×ÏÔĂż±»ÙƠ§ôϼ«‡“Íjß%€¡χåĂ«‡“Íjÿ$©Ó9¥‡߈ăˆŸ;ÏÔ«ÔëÚÀ¹ÔXËØ‡Œ›¾ù×߈ÖØ¥º«‡“ÍjÛ«‚ ½98¤‡ÖơöµØëöß»û߈ù×±»¥ˆ]1ïÁ…»½‹Ç™‰kß [ïSéÓôë¼÷Á™‰kß [ïṢĂå`ƒv¿ØÅ÷ˆ§‹Ù½ƠăÇíöËÉ9«‡“Íj¾ôăĂ«‡“ÍjÓÓé‡ÍƠƒ¾‘ưÀƯÓ ƠùêưÀßÁͼ±»Û«‚ ½9ă½«‡“Íj÷ˆ‚Ú9߈Ï̉éê¯G‹ø½€ö‹ÜÏÔ߈ĂÚª‚ +¼9¡ÛÍÓù×ܕױ¿˜ô´aÁ¼ĂưˆÏÄ™‡«‡“Íj©ÀƯ߈ÅÄÇĂñÚÁƯ±ÔͼºùêƒÖÛ«‚ ½9¹ÚĂẸ̀¶¿ºƒÖ¹ÚëÔ·–½ƒvă$¯/íØù×™‰kß [ïSơÄĂĂ ›­±àéMÏÔơÔ߈ܺ°»ôĂù×÷Áù¾ơÄ߄ӨËƠܙӻÊóÂù×麱» +¯Ü±»±»ù×ơÛ«‚ ½9¡¼…Ö߈°»™Ôù×›¶éÙܽ¡»́™ëéåéêëö߈Û«‚ ½9ƒˆ½ÙÜ©‡¥2ßëM‘Ú—ÓŸÓ›¾G½¹™‰kß [ïSöù×÷‡£ä¹Ú¾øͽƠƒØơ$€Ơêö«Ô‚vÏÔÂÓ«dỔ‡ºåĂ½‡ă톃ÚÏź)öñәخ¼ƒv9¥‡©ë‡ÅÀÙ½áꇺ…nßÁăˆŸ©ˆÛê߈§Ô«É¹Ú·‡‘×8çù׳ƒv«ºá ÆÖ́ØÙ©Ç±»¿ôå¿øê·Ô¡ÔĂÁĂ߈çÚăˆŸ×Y ­éô«‡“Íjï»ëö›¾½‡Ç™‰kß [ïS³Üăơÿ¯¶—¶»½ÄÓ ‰ÇÿÚׯ…ØñÖëöÙ½YÙ«‡“Íj¾¹x·ÔÙÚÍĂ9¥‡÷ÁƒˆĂÙ•Èû›·¼Í7ß»ûá ÏÔăˆŸ;é‰ñ5ñ·Û«‚ ½9ßƯ½%‹´™‰kß [ïS¿‰Ú¦Ă¼ơê‚v±̉ÙÚÄÓ·‡‘×8ç‹ÙÉ̉¿ºŸŸÙÚ«‡“Íj‡˜‰j̃ZîSƒv9¥‡—¶ƒˆ´Åد¾Û×ăˆŸƠ©¼ß»ûá ·‡‘×8ç‰Ûÿ¯¶—Ó㻓Çù×ÉÅ“È߈íêĂÈǼ8¤‡×ƒvÙÅëÎÅÇøëöÙÚÛ«‚ ½9«âÑÓÚ +ª +‚ + + + +¼9 +‡±đ©‡¥2ßëM¿»ÁÛщ÷Á¿‰“›v«Ô÷ÙơÔëơó¿ßÑÓßÁÏÔëöù×ׯơl₫ؼ ùêỡăˆŸ;kÙ×½Ï̉‡ÛÙÚù×ăˆŸíÉ·ÔÇ·÷‡ăêÏĺ߈ô”Œ˜‰j̃ZîS¼«‡“Íj™‡çô™ô¦Æëö‡ŒÆƒvơèŶå̃à…»ÅØ¹Á©‡¥2ßëM•ÇÖ®¾ĂÖĂÙ™‰kß [ïS…Œ±”¼ô»‡ăˆŸ;Á“Ơ›¾™‰kß [ïS߈§ÔÉÜơÔăˆŸ;ù׉Á¿‰ÿ&½çÚ˜‰ +j +̃ + + + +Z +îS +×$9¥‡µØÛ«‚ ½9Û«‚ ½9—¶»ÁÑ+‹Ç—¾ëö‡Ç¥ˆ]1ÙÚ©½ăˆŸ;ƒvŸ}ăˆŸ;ƒvÁ¹³Èï½߈»Á±»àç±»ÿNYçÚîđ£äƠ—ăˆŸ;k³ÈÁ¼Ûƶèùת»ă»Ûºù×›Úơ$ö±»¿ÅàƠ‰éÇƯßñÆåÁÙÚ¹Úív×Ⱦº•{ÁƯÏÅáÓ›ÚÏÔͧә‰kß [ïS‹Çƒ½™‰kß [ïS™‰kß [ïS™»ơê߈ß»ûíÆÿ¯¶µÀ½)ƒ†Œ©Ó匿NăˆŸ;k—Ó…Û«‡“Íj­ÄËƠÔXăºщŸ}«‡“Íjëöÿ¯¶·‡‘×8ç¯ÈóÇù×匿Nù×Ç"“Æ›¶éÍÄ‚½Ï̉߈ÍƠ£»È¼ô%ù×ëöäô™ëéåùש؜Óñ‡×h‚ÀæÚỞ½ăÇí˹³ưÀ¾á Ù½¿́Ö¾Ăºº¥Û¾ß÷Áù×Ñæå̉ ¡ÔÛ«‚ ½9ăÁß„­¾¯¾ưÀ˜1ê1è1ä1¡Ô“Ơ߈—Ó±»Ï̉ϹÏÔĐ9¥‡ÏÔÅØ·‡‘×8çÏ̉ơéƒwÓ̉—Øơê—¶Û«‚ ½9÷ÁÛǯG‹øÁ£¾́•½ß»ûëÚª¶2tTùơ‰¼•¾ÓÛ«‚ ½9ÙÚéÙ†ŒÍÓ9¥‡ăˆŸ;‰!ëöÙÚÅØƒºÁ÷ÁơÔÏÅ›¾å̉ 储çÚơèÅ—ˆ¼ÑÄëÖÆ«‡“Íjä̉¿ß¡Ô˜ ê è ä ±»±»‡ÛƒvéÚ‰Ô‡ơéĂÈü ©&½§ÓÁ¹ßÚ‹ÙăÁ™Ô³½ÁƯƠXûÓ÷Ù‡ÊϺôÛÄÓÿ¯¶ÏÔ§¹ƠÁ½ĂŸĂ½£Ø±»å̉ ߈ÏÔỂ³Ø±»—ˆơÚ¦Û½Ù½™‚¿ºȾ»ÅǼ·Ô°êØûÓ߈Ï̉û¸ÚñÜ­Ä¿́èêÍÄ£ À‡€è/Ö:“ơ۫‡“Íj‰Ô«‡“Íj™ëéå…ƠÙ½¿Åå̉ «‡“Íj¬Ö³ÈôÁƯƒv°»¼Û«‚ ½9ƠXÙ½±»ư‹ưÀÊÓÁÚù×ƯơŽö™ï«‡“ÍjÎ؉j̃ZîS×ÚÏỔºº«‡“Íj·Ø₫Ú÷Á™‰kß [ïŚơívÿ׃ԫ‡“ÍjåÁĂô™Ó±»‡ƠÔ¿¹½×ưÀ½€™ơ«‡“Íj™ôăˆŸ¦º€º®¼Û«‚ ½9ƒÚ½Ïŵآäg“È™‰kß [ïS¶Å©‡¥2ßëMåĂÅ•Œß»û«‡“Íj‹Ü÷ˆƒÖÿÛĂÙËÇ™‰kß [ïS«·3uUÛĂ߈Û«‚ ½9©¼±»©‡¥2ßëM߈Á̉ÓØ÷‡Ïí½ûÓËÇÏÔˆô9¥‡‚½Ïå÷ÚăˆŸ;k¯ÈÏÅËǃvƠè߈«‡“Íjƒv½³Ç•‹H¡ÁƒÖñÚÛÀ½ĂÙ”"½ĂÓ°»“Ơ¿ß“±»Ñ߈ƒv÷Áø½¡Ûóǵ†›Ú¿ß±»›¶éÛ«‚ ½9³ô×¾ï½ǺóÇƯº±»Ơ¥ˆ]1¹Ú¤Æă½»áÏÔíÚÏÔÛ«‚ ½9·‹ƒvÏŽר߈éÚÚª‚ +¼9ƠÅà°»éÓ߈±»å̉ ÁĂ³ºóÙÚ™·Å»yçÚÏ̉ÓŶè߈ơĂƒ½êÓÅù׋ÈßÚ߈ƒÚ…aưÀÁĂ©ƠíÆÙÚăˆŸßÑĂó¾‚v˜‡­ ÷ÁưÀͼĂÙª¶2tT­€âˆ:kèơ¿‰Ù‡­9ׯÛˆñÓçÚÅ–«Ô½€‡Ûå̉ ¸ÚÏÔ¡Û£4ï½ï‡¤‰̀L„½¯ÈÍÓ«‡“ÍjÿÚư§‡ÍÄ©‡¥2ßëMƠXχëö“º“ºâ½ ߈ï竇“Íj߈àƠ½€½ôáƯ†xóÔƒ«‡“Íj¶è™‡™‰kß [ïS™‰kß [ïSÑæ¥ûÖ½éê½™‰kß [ïSµØëö«‡“ÍjöÁ½«†ÙÚׯíÙ¶ÅØŸƠƒÔ³mÏÄۺﺡԭÔưÀ›¾óÄ¿ÅÅơ§¹Ϲ¿Å Ëû±»ƯÚÏÔÇÖÙÚ×ÂÛ«‚ ½9ăÇí¾ß±̉ÏÔơê¸à ¶‡Ö8æ½ô“º†Œ«Ô9¥‡¿‰³È©ÓÑæ÷ÁưÁ¡ÈÏÅÿÚ଺‡±½Û«‚ ½9™ÛÁƯŽ«‡“ÍjăˆŸ;ƠÚ«‡“ÍjÏňơëö§ôù×ÎÅơÔ±»¼ôáê߈ÿÚ˜‰j̃ZîS±»ÏÅÀËù¿ñ~ù×½€Û«‚ ½9ÖÙ½¤Ùñ~›¾¹ÚÑÓø×Ơ߈Ă­Ô›Ôƒv¡Û™‰kß [ïS %߈Úª‚ +¼9ÙÚÿ¯¶öăºùרÓÏÔ¨ºŸÈ­ÄËÇƯ‰Ûºá=†“—¶ƯÓ ëöɇ‘Á‡é/×:Ëǽ™‡ù×ăˆŸ;kÚÙ½³đϼ߈½ơê’™Ô°»ĂÙ¾ù×ă‰߈ÍƠĂÈưÀ£Ç™‰kß [ïSù‡ƠÁÅØ¡ÔºË¿µØÇÖ8 ¤‡ ªÚÏÔ¥ØÍƠËÉ9ĂĂ ›­±àéMưÀùê›¶é¿ÅăˆŸ;kÿ×›Ơ…»ºøơëöù׫bÓËƠ“¼Û«‚ ½9½€ív£XăˆŸ;™‰kß [ïSÙ±¿ăˆŸ;kăˆŸ‹ÜăˆŸ›ÂÛ«‚ ½9‘Æ×Îԣر»˜‡ºÏÔgƠ½ơÔÛº‡ºÔºlÖÓØ8¤‡×©‡¥2ßëM·‡‘×8ç‰ơÎÔ¡Û«·3uUăˆŸ;çÁíº×Ơ†7§jÅÔ±»ñ׃vÍÓÏ̉å̉ ׿8½€—»ÙÓơꩼĐÓ›¾¯×ƒˆÁƯ£‡ïÚăˆŸ߈‡ƯÍÓ¶ÅÙ½±»ù×ÛÀăàöµ†«‡“Íj•Èû›ù×ÏÔ¼ôçÚ‹ÙǼι‡ÇÚÀ€ºăˆŸ;™‰kß [ïS‚«»ß»ûÅ–Û«‚ ½99¥‡ëÚ߈™‰kß [ïSÛ«‚ ½9±¿©ÓĂÙưÀÁƯÓØÊ%½€ù×Ơ¼ôï½ø× +ÏÅï»™ëéåï³2½¾«»Á¼ÏÅ«»«»“Æ” óLJ߈éơÁ½Á¼ó|»ØÑÄëÑÄë߈Ù×ƒăˆŸ½ƒvĂÙ¹Ú™‰kß [ïS‹Ç߈«¼ßÚ¹Ú‡Û˜‰j̃ZîS˜Á‹Ç±»ÙÛ¹ÏÅ©¼±»ñÓù×ÿÛăˆŸ;kăˆŸ;¡ÈÛºùæ̀ÅÏÅÑ·ÙÚÓí½÷Á›¶éơêëößÄÙÑö³Èö™‰kß [ïSù‡ßÄÙ°»ÏÅÙ½ÅÀ¯ÈçÚ‹Ó›Úơº¿¹ƒÜ¶¼̀7ơ°–»÷Áăà©™‰kß [ïS±»¾ÅnÅn°»Iå×̣ăˆŸ;kÙ½g€ÓŒ&ö¡ÔûºщăºÙŒë*«½€«‡“ÍjÅ—Å…̣Çă½™‰kß [ïSĂÙù꺷ôưÀµaÍÄóÔƒ¾‘ÏÔ¡Ô߈¹ÁăˆŸ;§ÿçÇÖ߈™‰kß [ïS“ºÏÅ™ÁÖÔ†6¦jÅÔ±ëØÅô½áÛçÀ¼ÏÔ÷Á°»Ơö±»Úª‚ +¼9߈»ù׉¿IŸ¹Ú©&“ÆÏÔ“‡xϼñÓèÓƒÖ³ôÙÚ̃Ö±»ơÔ«‡“Íj߈±ôëöÛ€ëöưÀÏ؉j̃ZîS±̉«‡“Íj±»¹Ú“ÆÁƯµØÛ«‚ ½9¸ÚÅØ«Ô£»çÚóÏÔÏÔÁ‚Ú×ÅÓÀ̉±»ÑÄë¯G‹øÍË)éÛ9¥¡h™‰kß [ïSÏÔ¹ÚơÔźùê±ëØ£»ö‘ø×¿»ÏÔ©‡¥2ßëMĽ°¿¾Å÷î¹Ú©ÓËÇ߈²Ç8¤‡­ØơêĂâ¹Ú÷ÔùêÙ×™ôÅØ£³ƒv́v§Ø³b£X«ÔϺ̃ˆÛÇ× ‚ôÁ‡é/×:™‡óÂÇá؇Î9„×ܽшÙ×½ôÛ«‚ ½9ÓØ£ÓûÓÅÓÇÖ›ª¶2tTÀð»£Ç¹›¾ƠÛ«‚ ½9ƠÅ—¶‹ÜƒÖóÇåˆƠ‡º°»ÛÀ¹Ú߈‡Œ½€óLJ„Ơ«‡“ÍjÁĂ»˜‰j̃ZîS¹ÚÏÔƠRéÓØÚ×ùr«‡“Íj—Ø¡ÔèÔ«»Û×ÓÅƠX£Ù±»ä̉ÍƠ›¶é½€™‹9¥‡Á¼«‡“Íj°Á³ºóú(öĂÙÅö£Ç‚vùב:Ù½ßÅöÁưÀÁ̉­Ø½€ÅÁ߈±»ïڧؽ€Ù̉¹ñÿÂăˆŸ;°»; Ëûå̉ ¡ÁñÖçÚ¥ˆ]1ÓÆëÖÏÅ¥Ø÷Ú§Ô™‰kß [ïSŽ™ëéå߈ƒˆ¹Ú•ŒºØ³ŒÏÚưÀ«ÔỞÇ÷™‰kß [ïSûӃַԫѼ÷ˆÇƠÍÄщ°»á®ÛëöïÂ߈°»µÁơꥈ]1ƠŸĂỞ¹£§½ÏÅ›¡½€¹ƒ‡ƒà‹‚«‡“Íj›¾ÿ¯¶­ÖêöùêçơÜÂøêǼù×óÇ™‰kß [ïS«‡“Íj÷ÁÏÔ9¥‡Ư‰±»ÁbÎẠ̊ÂÓºç¯×ß»ûù¿Íăƒ̣Ç×Û×½Ÿ}ƠXƯÓ ùêÏÅÿ¯¶ëöĂ ×¿8½»Ø›¡ÇÖóÂÏ̉°»ÏŹڙӓö˜‰j̃ZîSëÓ½ÏÔĂÖ·ÆÛÄÓ̉5­ÏÔ«‡“Íj‹ÜñÖ†Ú™‰kß [ïSơêÚª‚ +¼9Û«‚ ½9Á½Ç»›¾ơêÏ̉¸Ú±»ÎÔ¹Úç*›ĂÑÄë•ßÖ×Ơù×¥ˆ]19¥‡ù×Óœ¹ÚÓÔ› £Ø·ØÁ½±½ưÀûÓX¹Ú¼Ă­Ä«»ÓؽíÁ¦ºÛ×ÍË)éÛ9¥çùæ¬Ä»ÅÓ™‰kß [ïS†ÇÏ̉ÙÚ¿àÛ«‚ ½9³Øï»éê¹ÚÛº——ÙÅë‹Ü…¼ĂÙ«»¾ù×ưÀêö!ùÚ¯Ó‘ ƯºƯÓ ±‡½Ô½ÙƠ×ÜÓǾÚ•Œ¡ŸÈ‡Ûºéô…ôÙ̉½ô™‰kß [ïS“Ơ«dÛ«‚ ½9ÑÅïÚ¶£‡߈Óű»̉Á߈íÁ¼È̉àƠÁƯù×÷ÔåĂ¯é©‚ËÓơêƠƯÇÖ¹ÚñÚ‰¿I“ƠéºÛ«‚ ½9ù×߈«ÔÿÛÅÓ̉Øơêơé©ÓÛ«‚ ½9Üé"æÚéÓ§ÔÏÔƒˆëöëöơÔƒv̀ÓÏԬĶ  ëÚ‹Óɇ±»¹Ú¥Æ£ä˜‰j̃ZîSéơÿÚ¨ºÛ«‚ ½9ûºÛê×ÛÅØ±»Û«‚ ½9Ă¿à߈öĂÁ¹‚Ø÷ßÁÖǺ™‡ÛÄÓ«Ô÷Ô£»±»µÛ©‡¥2ßëMÛ׋ܣ؃vôăˆŸ×¾ó×đÁ´açÔ¡·ĂôÍÇöµaÑÓ̉Û«‚ ½9ÁñÚ‰ÓÆù×Ѷ¾ăÁ¡Ơ»ØµÈëö“Ơ“Ơ£¿÷Á“—óÏ̉—æ«ÔÑÄëçÿív9¥‡×ù¿áêÏ̉ÛÇι߈¯È߈—¶µØ“ó‹Ü¿à ËÉ98¤‡×§Ô߈½Û«‚ ½9ù×Ô˜ơÓº’¹ÜN¿ªôÑÓ¯àÙÜù×Ù×¢ …»ÙÚ̃ΫÓÑÄëƠÛ«‚ ½9…à±»¯G‹øơèÅÛ«‚ ½9ù׌ƯívÛ«‚ ½9«»ªdçô‡ºă¸½ôェ‡’̀j¹ºëö•Œ±½ñËÇÏÅ«‡“Íj—»÷Á5‰¿IỞ½ÛǺÁçÓÿ¯¶Ơºm¡ÔƯÓ ±Ô‡Çƒˆ‰ƠÍBÆ9¥‡«Ô¡Û‹ÇĂƠ™‰kß [ïSÏÔÀĂÓ—Óº«»º‰¿IëöơÔ»y—¦ƒ×éÓçºÑÓ߈è¼i¿ç™‰kß [ïS±»å̉ ‰û!°»˜‰j̃ZîSéÚƯÓ Ù½™‰kß [ïSÑ؇§ßñÓß»û™Á¿ØơÔÛ«‚ ½9º±»†?“ƠшœÁœ‡߈ñÚ°»ëö₫繃¡ƒv¾º³Â«ÔăˆŸ;›¾£Xï»›ĂÏԃء»˜‰j̃ZîSŸ}³½×Ơ«ÔíÖ÷àÏ̉ôË̉ÔơùêëöƠƯ á }‰Û߈ƒv‹Ç«‡“Íj¿‰Á̉ñÚª‡’̀jơê½§Óï½ÅÓÑÓÙ½§Ô¶½…€­:±»ÿÇµÛºăˆŸ;ñÓăˆŸ߈¥‹½Ô£Ç£¨‹ÙÏỒÊ)èÛ8¤›´™‰kß [ïS•ܼ€µØÿZ̃ˆ ™ÔÏÄ‘¼ûđÅØ‹ÜµØóÇưñ˼ơ ¯È·ÚÏÔ«‡“ÍjÛ«‚ ½9ăˆŸ;ĂâĂÙëöª¼Ă±»9¥‡»ô‡Ç麃ԙ‰kß [ïSׯ‰yóÀ‡€è/Ö:½€™ơ°»‡9±½8¤‡ÖÙ̉ä̉éºɇ©‡¥2ßëMù×ÂÙÚE°»Ïß·ÅÁ̉©Ơ•ÇÙÚëöăˆŸ;ùׇŒÓưÀƒvƒvƠ´¾ôƒÔĂĂưÀôêưÚ«ÔÙڭŵa±»½Ă·¼Í7ƒˆƒv·¸·#©‡¥2ßëM¤È¡È¤ÆÏÔ§Ô߈ÙŒë*«‹Ç‹Çѓ۱»ƒÔÎÔ“ +ÏÅcˆïÁ›¾­ØÛ«‚ ½9›¾¿ß›¥Ó¼Ÿá™‰kß [ïS«‡“Íj±»ÑÅĂƠ³½¿»½±»ăˆŸ»ºÛºỞÇÖÅԷȱ»Û«‚ ½9™ëé噉kß [ïSÿ¯¶ÓØđ»(̃ˆ£Ø£ä–¶¡Á¬Ä«ÚĂÈ‘ÚÀ̉ÁƯÏÔæơ¡Û»²º̣±»´†£Çù‰‰¿I¡Á—ÓÅÓ½Ô›¾ăˆŸÏÔ·Ø9¥‡½½±»ĂÈăˆŸ•‹H߈Í̓ˆ©ˆëß«‡“Íj Á߈ỞÙÅëíă²(ׯ§ÓüÀ 9¥‡×•Èû›ëö†º›¾ÿÚ×̉«‡“Íj’*Û×øêöÛ¾Á̉¥ ß„ù×±»̃»úÅÓÚ×ÿ¯¶·§D ±»߈óÇÓ̉Ưº¹ÚçÚ±»­Ö«‡“ÍjؽÍË)éÛ9¥ÖÆ«»Ÿbù×±»çÚÏÔß»ûÙÅëÛ«‚ ½9ÏÅăˆŸ;àöÓÂÙ½¨¿ØăơË ‡½‹ÜÚ×¥ˆ]1£ƯËÉ9¶«‡“Íj½±»ăÚDZ»ăˆŸ;Ó¾™Á‚½“ÈƯơŸ}±»ƯơüÀµØ¥’€ºơêù׃×ÙÚ߈»ăˆŸ;ŸÈÓ¾é‡Á·ÅÁæô­ˆÛÔ¹Á¨Çµ÷éê +¶Ô +™‡ÿ$¹ÚăˆŸ©º´a©¼«‡“Íjé°ù×ÍÄ«ÔÓÆ¯Ü«‡“ÍjñÓ9¥‡9¥‡±»‡Œ߈ưÁù×騱»˜‰j̃ZîS·ÔĂ…Öù׃¾‘Ưé‡ơԅر»µØÏÅƯÔÛ«‚ ½9±»߈߈ÑÓ¹Úù×̃ÚÛ«‚ ½9Ū»óÂëö̃ˆ™‰kß [ïSóÂ÷ÁÅä…»ƒÿܺ̉‹ÇÏÔăˆŸµØå¿ñÓ߈ù×ăˆŸ;k÷ÚÙR•ø9¥‡ùÚ½¤˜‡ơ߈ïDÓÁù×Ù½Û«‚ ½9ñ™Ô™‰kß [ïS«·3uUÁƯưÀ¶Û×ôÛ«‚ ½9öǼâÁÛ«‚ ½9ëÚ»Á›¾€Ä!…£­ËÉ9©ïÓ̉ëœ߈ĂÙ‡Ç÷ÁÏ̉ƒˆÿ‡“ÆÛ«‚ ½9³ÂÁ±»ß»ûôÛ«‚ ½9ÿ¯¶§ÔÙ߈•Œ·̃ù×ÁÛºçÀ‹ÜËÉ9ù×™‰kß [ïS»́Úª‚ +¼9ëö™‰kß [ïSùש‡¥2ßëM¾§Ø½ÇÖÿÇ«‡“ÍjÑÓ¿»Ù½©¼íêÙÚ₫ÇÑÓ¿‰âˆ;Á̉‘ÿÚëöưĂçÚÏÔăà¹ÚÿƉ¾Ở¡ÁÙÚ‡xëöĂÙùê8 ¤‡ źëöëö¥ˆ]1ÅØĂº̃ˆưÀ™‰kß [ïSÁƯ±»¹ÚŸ}ưÀ«ƯƯß™‰kß [ïS·‡‘×8ç½§Ö¬ÖÏÅ¿»ĂÈÁÓơÔÁ¹ÚÙ½‹ÜÛ«‚ ½9¹ÚéÓ§ôÚª‚ +¼9óÁǽ¹Ú߈ëÖíÖ·‡‘×8ç»ô½¾Ç"Û«‚ ½9×Óù×£Ư±»¹ÚƯÓ ùë̀Óêọ̈§ÔĂÙ˜ôá¾ỞăˆŸÑĂ£ä—¶Ơùê·ÔÁ|×­½¼×À†¸öµØÏ̉§ô½ÛƒÚÙÚç̉Û«‚ ½9…Ú°»ÍÓᬷÔç̉ÏÄHí·±»Ơ‡ºÛ«‚ ½9·^«‡“Íj·§D ƒÔø×µØ½ÏÔùëñÖÏÔ¿nÀË +™ëéå“ƠÑàơêưÀ÷¼¶÷‡½€ƒv‹Ç©¼÷ˆÛÄÓÏÅĂÈ9¥‡×ׯÏÔ›¾§©˜‰j̃ZîS®¾›¶éË%ÏÔ±»á Û«‚ ½9Úª‚ +¼9©‡¥2ßëMÙ×àX  đ; ¬ Đ +$ /¤ñÂ…pƒˆÿñÂÙï½á ¬ÔÙÚƒ'–~ëö߈¡Á™‰kß [ïSºÁ¹ĂªøñÓ™Ô©‡¥2ßëM¡Á|ÁÓëöƹÚ̃ÁívÍË)éÛ9¥©&«ÔỞ™‰kß [ïSơº™‰kß [ïS‹Üź½ưÀÅ–ͼĂÿ§…ÖƠÑӸם¼·‡‘×8çÁ̉퇱»ü¦†ß„¡Ç…ôçÚ±»ŸÈÓŰ¿×¾ÙÓơêÏÅÁ‡é/×:ă¶£Ó«»ïÚǽÑÄëÁ̉™‰kß [ïSô걇ƒṽÄØ›¾†ºÎŇŒơễˆßÚ…Œ›¹¾—Ó)Û«‚ ½9ù׽ܣ䱻“Ơ¡Ô­Ú©‡¥2ßëMåºù×™‰kß [ïSƯÍ߈ơê«»¯2ÏÔá ơêßÚÛöÛ«‚ ½9Üëö™‰kß [ïS߈ßÄÙ₫Úù×íûÙǼ·§D ‹Ç£ä¾‰Û«‚ ½9߈˜‰j̃ZîSăàÏÔ½€9¥‡×ÅÓ½§ôÏ̉ÛǯÈÏ̉±Á߈½€ƒv·̃ÂĂëöµØµØ‰ĂÓº¹Ú×Ă·‡‘×8癉kß [ïSå×ëö·Ô½߈ÿ¯¶ù×Û«‚ ½9å̉ ëöÏÔÛÚù××Ó™‰kß [ïSéêÁ½ă½£Ó·¼Í7߈ù¾ÑĂ«·3uU™ü—¶ψÏԯȧÈÿ¯¶—ŒÙÚ\¹ÚÛ«‚ ½9ÿÚ±»ÅÔǺ߈ÛÄÓôê¹ÁƠ·ÅÙÚëÓ›¾œ·̉ ¤0ëö¡ÛÚ×ƯÚÉ»×Ơăàù×/×¾ăÄăˆŸ·ÔϺ±»›¹Ϲ€¼±»—»ºÈ‘Û8¤‡ñÓÛ«‚ ½9™‡½€¡Ô¶ü¦†ûØôƠöÔ +ÊÇÓºÙÚù×M½₫ÇëÂëÓă»±»ơÔ‹Ó©ØŸËÇ·Ó ¥0«»«dĂÙ½ë̃ÁƯË¿ÙÅë̀Ó +±ƯơèśۭÔó¶¨Ó‡ÚÎÅĂ٣؃’¡È»‹ơêô– öôó§Ó›vƒ¾‘âêÀ½÷‡ÑÓ¢»½ÔÛ«‚ ½9¡ÔÙÚ±¿¹ÚÏÔ±»ª¶2tTƒvỔø×›Ú¼ÔïÅ¿¼æ̃«‡“Íjµ‡ÅÔÍË)éÛ9¥©ÇÍƠ±»œÓ8Û«‚ ½9‹ÇÙÜ’¹ÜNÛ×±‡¿‰ÇÖßÚƒvÿÓ߈¹̃±»­Ø¤%Úª‚ +¼9×Óø¿™‰kß [ïSƠ™Ó™‰kß [ïS߈“ÈßÚí‡÷Ú½±»îô ™Ø÷Á‚vׯµØùêƒv÷‡ùׇº»ĂăˆŸăˆŸ;­ä»Ø±»Ù½«‡“ÍjåôĂôè· ‰ÔåĂÇÖ£‡­Ä¤½ ·È«‡“ÍjÍË)éÛ9¥‹Ù™Á½€Ơ¾GŧÔù×É̉«»÷‡¸Ú±¿©¼ƒÚăˆŸ;kǺ䌾N™‰kß [ïSëöưÀ™‰kß [ïSÓ.‹ÇY½€±̉½ôßÚƒvăà¯ÛÍÓĂĂ ›­±àéM‹¿ÏÔÍÇçÚăƠ÷‡ăˆŸ;ù×ø¼ÏÔçÚ›ÔÜÓŧÔÔÅØ8⤇âÖ2Ưº9¥‡Óº³Â˜‡ù×ù×åÛ«‡“ÍjœÁ÷ÚÿÜ߈ÏŃØÁ̉߈ÏỖˆÀ¹ÑÓÏÅÏÔëöÓÓ·ÔƒvÚ‡ÏÔ߈ưÀ¾º±½½€ƒvÛ«‚ ½9¥Ø‚vç̃8Œ¤‡ŒÖKßÚÏÔ£Ø/©ÓăˆŸÍÄÊ¿»ˆ9¥‡×±»«Ôơê©Óר©‚ ƠǼ±»ƒv¡È±)‰ØÄô#ö˜êèä߈Ù½™¿Ïūԇ”¥ˆ]1ºËÉ9ăơÛ«‚ ½9ơèÅưÀ©Øçô—ÛơĂĂƠăˆŸ;‹ÓÁƯ·Ó ¥0µaù×ñÓÛ×½ƠÚÏ̉Ù½Û«‚ ½9ç½ùëż‚¾Ï̉‰±6Å–ƯÀǼñÖÙ½«‡“Íjª¶2tT¥Ûơê½…«»¯¼·ôÎÅö¹÷Áëöƒv•Œ»Å‰Ê‹Ç½³÷‡̣Ç»‡߈­Ö­Ø¹Ú‘«™‡‡ÇÁƯÏÅáö™‡óÇôê³—Œ¬¾±»¿èĂÙÓñÆáÛ—ŒÂ«‡“Íj∥ÂëöơêçÚËÇ¡%ÇÓ±»ëö Á©¼ÇÖëöăˆŸ;ÙÚœ·̉ ¤0°»ñÓ»ÁÂÁƯÿ.­Ä½€¿»¡ÔÏ̉9¥‡ƒvË ßÄÙ³ ù×ó#™‚™§jÛƒvÛ«‚ ½9ÏÅ·‡‘×8çÛ×ăÓ“÷Ûº÷¼½»££XÏÔơèÅëöÑÄëß߈›¾‚Ö—»ǼÛ«‚ ½9›¾ÿ¯¶µØ«È™‰kß [ïSÜùơ¿‹Üù×Ở™‰kß [ïSß»ûƠ™ĂÁĂ•¾Ă¹°»çÚẲ‚vBỞöÍß›¹ Ëû¾Ÿ»ơê߈«Ô½…€­:ÎÔÁ߈ưÀ½ÔÙŒë*«̣Ä£ ùרÀÙ½µ†ăˆŸ;ẹ́ïôëö§ôñÓë¼Û«‚ ½9¾ÑÓg±»Â›¶é£ÎơÄë߈‡ŒƠÚơêÏÅéÜÎÅÿøëöÛ«‚ ½9ÅôĂÙĵŸÖźÛ«‚ ½9Äôẳ›¾ỬÔºlÛ«‚ ½9ÁƯÓº‡ºǽÚª‚ +¼9ëöÙÚщƠÙÚÑÄëÛ¸̃ÁϹ߈· ÊûÏÔ¾ÍÄëöÁƯz˜Áøê߈“Û«‡“Íj¿‰³ÚëÓ߈‚ —]÷Áÿ¯¶†Œ•‚º½ƒÖĂôµØ›Ú¥Öà"Ñæƒ½ùê½¥ØÎÅöÁ«Ô£Ç™‰kß [ïSưÀó¶ è Ù½ù×ÿÂỞéô«‡“ÍjÏÅƯÓ ªÚÙ½Û«‚ ½9±»™‰kß [ïS²Ø™‰kß [ïS÷Ú£Ô›¶éÿÚÙÆÏŋdz·»ˆûØƯÓ £Ç•Œ±»ëöÚª‚ +¼9Ă¹Ú­ÄÇÖÏ̉·Å߈½€«‡“ÍjÙ½ëöơÔ Ç÷ÁÙ½ơꙉkß [ïSÛbÛ«‚ ½9ÑĂ¥Û”º§ÆÓ½‚Ø +ƒØù×µ†›¹ÅԡȾ«‡“Íjăơ‹ÙźˆƠ…n«×˜È•뉃¤‰̀L„9¥‡™Ó«‡“Íj¸Úù×ÚѺ¿çÛÔºÏ؉j̃ZîSÏ̉ăˆŸ•Œ“ÆĂÙ±»ë½Á•%«Ô›¾…ÿÇØµØ£ÇưÀí걿–½«ä°»ƠX‰ÔÙÚ÷‡“ÛÔ¾F½©¼ưÀ‡ºÓÁçÚ¡¿‰߈˜‡Å¿ƯÓ €ö ĂàëöăˆŸ;kàăˆŸ;«ÔˆÍÏÔºÁÏÔĂÙĂëöÛ×ưÀÏÔ‘đÛ«‚ ½9™‰kß [ïS¡ÈµaÏÅĐÄêォ‡“Íjù×·ÅƠÄơĂăĂ3¦ôOß½é±»ÚÆöÁ߈Û«‚ ½9߈9¥‡ĂÙóӡǬÖùê¯×̃ÄØ°»á ߈­¹ÚÛדƠ™ÓĂ ÛÄÓÛ™‰kß [ïS£Ø«Èºù×ÿÚÓ%ßÚÿ¯¶ù×÷Á±»Ó÷Ú‡~Ï̉¿º£»ÍƠ·§D ÚººÙŒë*«´.¤Ù߈ÅE߈̃ˆƒÓǼÁ̉׿8ÙŒë*«ÅÔ׿8ƒ½ö…Œ©‡¥2ßëM·Ø‡?³ÅñÁ߈½ĐӳȹÚÚ¿ºßÚÇçDÁ̉«‡“Íj³×¾»¼‘Óºù×˵ÅØø×‡ºÚÀ‡“™‡ÿÜ“ÍƠ÷àÅÓëÚ“È™‡ÅÓĂÙÛ«‚ ½9ăˆŸ;Ơ¾G»Óù×ÿÚ‰‘ëö½ͼ÷å5Ó…à¶±»ơêөӋLJºÙ½ßÁÙÓÏÅ›¾±»Û«‚ ½9±»¿‰á̃¯Èơê“DZ»™‰kß [ïSÇÖ™ºÍË)éÛ9¥‡º È¥Á‹Ó‚v™‰kß [ïSáêóDZ»“ÆßÄÙ̃ÅÑÓȆ¹Ôëö«‡“Íj³ÈùåÏÔ¡ƠÍÂđơêí—G©‡¥2ßëMßÁÁíØÍÛÛ×Ù׫ӹØÜ¨ÇăÁ»„ÇÛ«‚ ½9±¿«ÔµØÊ È9 ÏÅơÔù×ï½ËÓÚÉâˆéôÿÚ«»ăˆŸùêưÀÙ×ÿ¯¶ÙÚ¹Úù×߈ƒÔÙÛÆ¥º߈¥¢ËÔ߈™ô³ù×ĂÙÿ¹ÁÁ½Å–—»½Ú×ÇÖ½̣Ç +ÇÖרăˆŸ¦ØƒÖÁ̉¿‰“Ƚ€±½ÀË ‡ºăˆŸ;˜‰j̃ZîS°»ÏÅ™‰kß [ïSù×₫‹È߈¡Åň۫‚ ½9ÏÄ™‰kß [ïS߈ù‡ăˆŸ;kºyăơ‹ÇÏ̉‰±6Û«‚ ½9ÏÅ߈“Ơ˜‡Ëǵ¡Ô«d±»±»ưÀ5ưÀöÇâ₫¾é‡Ç±»ú(±»Û«‚ ½9‚vÛ«‚ ½9©À½ÁĂÆÍÓăˆŸɇ—¶­Ë‡ŒĂȺ™ƒvÓ®÷Ù±»·‡‘×8çË̉’× Á߈Ÿ}­Ä߈ăˆŸÛ«‚ ½9ÍƠÅ»ÙÚÛ«‚ ½9ùêÀ́vư¤ĂÈù×½ôĂÙ麑÷Ù×Û×å’¤ÆÁ¼ùדۙ‡ăơ½·̣ï•°Áù‡¹ÛŸÙ#«»‹ª-ÁËÏÔ„nÿÛ”ºÁ¿!«·3uUÛ«‚ ½9Å–ÍÄƯÓ ±¿߈÷‡9¥‡¡Û·ºÅɇŒÅÓ™‰kß [ïSï +™‰kß [ïS©ÇªÚ́ŽîưÁ¡ăˆŸ;kñÖµa‹‚÷Á«·3uUăˆŸ€ºÏà©¡Ûá×ÅØ¥ØùëéêưÀÖÚ§½¥ˆ]1ÓšԾƒvưÚåĂ–ˆơêéꋈëö½ù×ÚÆ!À½ß»ûëöíÆ…#ͼ—¶ëöœÜ6âˆÇÖÛ׻؛¶éưÀË4ƒvơlù×ÿÚÛ«‚ ½9Óµëö—ÓñÚöƒv¹Ú߈רĂÙÚª‚ +¼9¹Ú9¥‡×¿́\¼›¾ÆÙÅëÅØ…Û½߈œ‰¾IÏѽÖ$§‡ăˆŸ;kÁÛÏÅÛ«‚ ½9ÓÊƠ¿ß‰Óºôø ³¡ÓôÓ‹ÜÍÄ«»ˆÔ…ô±»½ăˆŸ¹Ú¬¾ ûØ߈™‚ĂĂ ›­±àéM߈ÿÚơêçÚåÁÈÿ¯¶»$½€·Ó ¥0ƠÈ“¹ƯN÷ÁÍÓÅÔ‡ºĂÛ׫‡“Íjó›ÛÚª‚ +¼9¡Û¯ƠÈÙw­È·‡‘×8çµØü½«‡“ÍjÙ½ƒv›¾“ƠËÖ™Œ¼€ÿÚëö䯙‰kß [ïSă»Ù½ÏŵثÔ߈µØ‘Ûëö±»ÑӳƀƠ‡߈£‡¡ÈË·ôÙÚưÀÅ»ÇÖ÷ÁßÁñÄñӣǖ¶÷ˆ9¥‡·‡‘×8çµØ·‡‘×8çÓÅçÚ…àÏÔÜ…¿‰ÿ¼Û«‚ ½9˜ơ¡±»›ÛׯÙ½ª»™‰kß [ïS¸à—¶ÇÖóăˆé‰ñ5ñ·ÙÚ§ôܳzơêøàÙÚÿ¯¶ÓăˆŸ;ù¿ؽ­Ä¯ĂõØéÚÛ«‚ ½9¡Ô«‡“Íj½ƠXïÓ ÷äÁơế±»½ïăˆŸ;ÏÔÅ–˜‰j̃ZîS߈¼ô …½‰yơêù×Ăº«Ô—¾ăˆŸ;k“ƠÛוŒ»Øø×ù×ôĂ»́߈ Á4µÔơ·‡‘×8çÜơÔívƠÚơèÅ箃¾‘ÙÜá=ß»ûªÚ¦J÷ÁŒ(ĂÙĽÆ·Ü¡ÛϼÁñÓùꙉkß [ïSïÁÀĂ¼‡Œ¶Ü-Ù×ÅÄ›¾ß»ûÄÓĐØăˆŸ;ËơĂÑÅø¾‡ºÍå߈¹Ú©-¥Ï˜êèä߈±»ÏÔûººƒ¿ºÿÚçÚî²2ơê×̉ïÚ§Ô° êØ ¿́÷Á·Ôß„±»ÙÚרÙ‡­9½ÏÔ߈£Ô«÷ÅÔ°»¡™‰kß [ïSßƯ±”‘Æ¿äÁǺYß»û«»Áăàœ‰¾I߈ƒÖ½©‡¥2ßëM¯ƠóÙ½ăˆŸº·‡‘×8çÙÚ߈ăˆŸ;÷Ú­Äå×ß»ûù×麑۫ӿéÛ×é™Û«‚ ½9ÙÚ¯×߈™‰kß [ïSÅ–Û«‚ ½9Ÿ\éÚƒà߈ÓÔÏÔùơÛ«‚ ½9ªĐÑÓ»ØçºúĂvƒvĂÙ¥¼¯Èùôëöµ̣±»ÜïœÁ‹Ü…ôơÔ±¿ÑÓ¹Úëö¾Ưº½½ƒˆ˜Ô¤ˆ\0Ù½ƒˆÅ–9¥‡ÓÚ9¥‡×óÔ“¹ƯN³ÜÆƠXßÁÅ›¾Ù½©×̉¬Äđ¹ ˜ ¹Ú߈ÏÔ¯r‡ù׺½›¥å̉ íɽù×—¾8¤‡ÁƯưÀÏÅåÁ¦£¿‰í&ÍË)éÛ9¥åÅôóÔ¾FºỳÊ)èÛ8¤êöÚª‚ +¼9ÛÚ̃Áø×ß„¿‰ù×ï³2âÂ3ÁĂëö%Ơ·Ó ¥0…øûÓơl߈‘ơî؉j̃ZîS£»±»™ơăơÅÓ‡Œăơö‹ÜĂȽ€±»—¶ÂôÏÔÅØö¡»«‡“ÍjÛ߈§Ơ™Ó÷ÁƒØ8¤‡ĂƠ¡¼ß»û§Ô߈ăˆŸ;k›¾ï™ÁƯ©‡¥2ßëM¯•€Ç©« +¡9ưÙYÿÚĂÈÏÅ£ØçÚÇÖùÚâˆ:®¾‚vó¸ív®¾ĂÙÚÀƒ¾‘ỞƒvïÚÇ̉›Ơ¾«Ô§Æơ¤Ù½Û׫‡“Íj½ù×߈ËÓÁ‡é/×:§ÓóÂöÔ“¹ƯN߈ùơ°»™‰kß [ïS¡Ô¡ä¡Ôø×§ØÎÔ½«Ôƒ½­Ö÷¼ÏÄĂжÙÙăˆŸ;ÑĂÉ¡ÔăˆŸ;ỞÉù×°»ƒv‡™‰kß [ïSù×—ÓκǺÛ«‚ ½9»ß„Ơ߈ßÄÙäÁÛ«‚ ½9éÓăˆŸơêÏ̉߈ùבÆ߈ˆÛ߈˜‰j̃ZîS™ÔĂÑÄëăˆŸ‡Œ¸Ú ẳÏÅרÙדƠƒÚƒÖºÅºĂĂ ›­±àéM÷Á‡“àùבÆđƽơÁéÿ¯¶æºï»ÏÔƒv‡xå̉ ¡Áƒvͼ₫®¶Û×ÎÅ<ٽ퇿ÅÿîÏÔ©‡¥2ßëM½©‡¥2ßëMÁ¼£ä«‡“Íj©Çư“ÏÔ¹ƠăÇíƯÚÁ̉ñÚµaëö‹ÇûÙ©`§Ó§ô¥Â­¾ơñ»½ô½Û«‚ ½9¿Œß°¿ƒv³È©ØµØƒvÍƠшË%ƠÓçÚµ!˜ôÛ™€Ù«Ô×$ï³2éÓ™‰kß [ïSùƯ¶è¡Ô«‡“Íj½ÙŒë*«å̉ ó™Ö ₫½ÔóỖˆëöËÇƠ«‡“Íjơêƒ9÷ˆưÀÅÓÙÅëÛ×ùÜ™‰kß [ïS±»ƠµØÏ̉™‡ÿÛ…ƠƯÓ ‡Œó#ù×ưÀ©‡¥2ßëM™Í¾Óؽ…ôơê‹ÜßÓº9¥‡½̃ˆ±»ù×çǶ‡Ö8æ±»ר‘±ăˆŸ­Ö£È£Ø™Á™‡«ÚÚ× 9¥‡¬Ô¶§ÛÛ«‚ ½9ÅÄÚª‚ +¼9ù×¾åsºçÚËÉ9™‰kß [ïSëö‡¿Ǻ¿ßù×ûÓ»ØÖĂÁ̉‡xĂÙï½߈®¼ ù×§¹ó¶£ÔăÛ½ÅàñÚëö߈®GøÏ̉½·ÓÍ8ºĂÙă¾«‡“Íj«dêÚ‹Ç–ÛÛ«‚ ½9Û«‚ ½9߈ÏÅă‘·ëößÄÙ¾Û«‚ ½9äô‘±±¿ó1ؽæÚ‡ŒÅψÑÄëƒv½ĂÙ“Ơ“ÈÏÔƒÔ‡Û«‚ ½9ˆÁ“ÆưÀ˜‡߈ôø×«Œµ0ÅÓ߈ëöĂÙµØÓà•½º³ưÀÛ«‚ ½9߈½³ºøêÏÅăàôñÓĂÙëöÍƠÛ«‚ ½9߈ù×›¡Áù×ÿ¯¶÷ơ¿ô½ÔĂÈ®¾å̉ Ö¾8̀ÓßÁµØ¡»ź߈ÏÔïi™»¹àù×ơỘÙ«‡“Íj«‡“ÍjÂÙöÅØ‡¿YÏÄ“½™ëéåÔXà‹ÑÓăˆŸ­¾±»™Ó½¾»χ±»9¥‡9¥‡ăˆŸ±»¢È·Ó ¥0÷Áëö™´™‰kß [ïS߈ÛÄÓÅÇ»Ơƒv߈ÿÚöø ½Ÿ}ø×ÏŽ€ơÔùê×¾÷H¹Ú°¿ÏÔ¹Ú™ëéå±»Óˆ•=‘¾³ÜÖÆ ±»°»ÿÚ±»ä̉  «‡“Íj™‰kß [ïSÅÓÅçØ™×ÏÅûÖÇÖ¿‰µØÏÔ‹Ç™‰kß [ïSù×÷Á× ÍƒvöÛ«‚ ½9Ï%߈ƒv„ÚÎÅÛ«‚ ½9Ë̉­Ä›¾߈™‰kß [ïSùơ¹Úù-­€ÑÄëçÚ°¿ÑÓ©À’È¥ˆ]1ÙÚ«‡“Íj™ëéåăơ¹ÚǼ™ĂĂÙ©ˆ߈¡ÁÑÓÙ«‡“ÍjÙÚ¸£éÓçÇñÚïDß²­Ä«‡“ÍjÏÔưÀ«‡“ÍjÆÅăˆŸăˆŸ¹Ú¡Û»ÑĂ¾ÍË)éÛ9¥₫…né‰ñ5ñ·߈íêï½Û×Ù½Û«‚ ½9™‰kß [ïSgùêƠ·ÔưÀ¦ô·Ô È¸ÚØ»í'ÔX‰rÙ½Ăè±»ĂΙÁ©Óù×ÿÂÿ¯¶‡º†¹¯̣ï»°êØ·Ó ¥0¾Ù½óÂáê…ƠÊÔͼÅØçÚÿ§½€Ë1ù×ùæ­ØÓº߈•½ÙÚÚª‚ +¼9Ù½Û«‚ ½9Û«‚ ½9̀½ÏÅóÄ›¶é™‰kß [ïS©ÜüØÊƒvÁ|†ä¿ß«‡“ÍjË1¿‰ï»ª»“ơêëö́v½Ù½¯G‹øÏÅϱ»ÏÔ¹ÚÜ÷ÁÿÂƠ³ÿ¯¶ƒv¹à¼€¿Ë̉ñÚñ»ÍË)éÛ9¥9¥‡Ù½öËÇø¿Ù¾çô›¹‰¿I¿½åĂÛ«‚ ½9¿ï½̃ŒÚ,ƒÚ™‰kß [ïSÓÁ‘ü›¾ëö±»ù×ơê Çí#…Ø›¾ǺơÔ߈ưÀ—Œó§Ôׯ¼§Ô«‡“Íj‹Ç³à³ÂưÀÏÅ̀ÓăˆŸ;™‰kß [ïSÛ«‚ ½9ĂÙÏÅ«ÙÏÄAØY˜‰j̃ZîS™‰kß [ïS³ăºƒˆÛ«‚ ½9ÏÄëöµ'•ÖϾ¥Oưܦô¿ôϼÙ½¯Ơ¨‡¤2€̃êL߈©éê“ȡԙ‰kß [ïSƠX¿ºëö½³bùê·Øàê‡ÇéÓ™‰kß [ïS‹Ü©&›¾ƒ×ß»û߈Û«‚ ½9߈éÓÏ +Û×Úºù×Á¹ĂÙÇ^™‰kß [ïSÙ½™ÁרÍÓÇØù׳àëö÷‡Û«‚ ½9ëö÷Á¸ÚÓÙ±»¬ÄưÀñÆ—ÓĂĂ ›­±àéMỞĂ$«‡“ÍjçÚÇÖëÚׯÛ«‚ ½9“¹ƯNï›ƠîË…ôÏÔê¼ «‡“Íj߈ưÀÏ̉Û«‚ ½9Û«‚ ½9ív‘ÏĂºǺ‹Ç£»«‡“Íjív¾»ổÅ ï³2ûÓăˆŸ‹Ç±»ÏÔ÷Á«‡“Íj™ô­¾·Ó ¥0¦Ô—¶±¿º½—ˆׯăˆŸù‡ïÚÙÚ¬¾ÏÅïŒ×¾¹Ú¦ôéÓă߇º¹ÚóÔỂ‘ÆơÔÿƒ½ù×ؽ́Ø'ơÔ¿ÅĂ•î‰º®È™ëé嫇“ÍjµØ±»¯¼ÜÓ Ǽƒv÷Ú‹ÙÓÅ¡ÛËƠÛˆÛÚñÚăˆŸ;kÀ¹߈·ÅÿÚíê£ÓÁ£·ä¹ÚÏÔá‹“Èùêîº9¥‡ÙÚù×âˆ:ĂË¿÷ÁÛ×½ÓÏūѪĐơê»ĂáêơÄ™‰kß [ïS÷ÁƒÖáê ưÓ™‰kß [ïS…Û­‘ÄÁÑÅù×ôÔÏÅăß·‡‘×8ç¥Ø¹ÚïņŒÂÓ—¶ƒÔ™ÔăˆŸïƠÏÔ­Ä«dĂºå̉ ăˆŸ;k9¥‡±»̉º¥‹£Ơ—»¥ˆ]1ÍÁÙÚ±»µØ±»öó¶ÏÔ«»˜‹ßÄÙ÷Ú™ëéåÏÔƒvù¼—ØÍÓƠƠÄÁ©¼«‡“Íj·Ü Ëû»Ø°»8¤‡ÏÅ׉ơÔëö釫»ĐÓ‹ÇÇ©¼ăơƒvª»ù×çÅ÷‡¯ÈËÇ«&‰Ư½µêÅó|ĂÙăˆŸ;•ÂƠÓàưÀÿ.ºÈö™‰kß [ïSºÛ«‚ ½9÷‡ôÏÔĂȬÖÖ¾óÂá=Ÿ}ÁĂ߈½Ø±¿¿‰ÏÔ™‰kß [ïS¯ßÖù׫‡“Íj×ÂĂö‡x¾óǧƩ¼ưÀÁ‡é/×:·ÅĂÙî»íÆϼÓ¾ˆ›¡µaáêÅù×߈לÏÄèÓ©¼Û«‚ ½9̀ӶŽ€³È™‰kß [ïSÑÓ°»‰Ô™‡ÛăˆŸ·§D ôù׿›¾Ÿ¿ƒv§Ó“Ơ¹Ú›¾ÏÔÖĂ÷ÛÁƯñÓÚª‚ +¼9ǼÙÚ߈Ù¾Ù½ăˆŸ;Å»Í ‘đ¦)ĂăêƒÚÛ×ÍË)éÛ9¥‹Ă±»§ôÇŽơê‡×­¥ƯÏÔ©Øù}™Á¿Ùăà™‰kß [ïS«‡“Íj̀Óø×Û«‚ ½9ÓØÏÔ±»¹Ú«‡“Íj£Ç÷ÁéêÛ«‚ ½9›¶é±ÈưÀ¡È·‡‘×8ç߈·Ó ¥0±¿½€°»æØö½€ĂÙÅØ§ ûƯù׫‡“Íj‹Ü¹Ú«‡“ÍjÙ½çÚ«»ăˆŸ;÷ˆÏÔ›¶é›¾¿‰ÏÔ«‡“ÍjăơÏÔƒμÙŒë*«ôÄÍË)éÛ9¥©Ø•¥Æå̉ £ô¡ÔÛ¾ưÁƒívûÓÏÔ›¾%‹ÜùרÓù×áêë˜H-½ÔÍı»ơÔ›¶éÛ«‚ ½9«Ô·÷ÁĂÅÙ߈ÅÄ™Á¹Ú½¡Ư߈àƠ·‡‘×8ç·Å·Å‹Ü¡ëöù×­çƠ™Áøêͽ—¾ơÔ±‡ÇÖícÿÚ¿‰ø×ù×Á±»ÇÖ¯ÔÏž¹x߈÷Úăàëö¡»ß„ø×öÁù¿ÏÔ½ÅÔëÓ×ƠûÀù×ÏÄ»‡…nóÔ«Ô߈ؽÍƠ™‰kß [ïSơ꯾§ƠéêăˆŸ;kÛ«‚ ½9ÿÂơêù×ÏÔÑÓ߈î»·Ôß»ûĂÙ¾ơèÅ“ƠÛ×Ểß»û‘ÈăˆŸ;•Œ›¡™‡©Ơùơô»Ăëöá ÷ÙÙŒë*«Å«%ù׿‰ù×ÍB‘ÜÆÖỞ߈Û«‚ ½9ÏÔƒØËÇơÔöщư“ơê¢Øϼ·‡‘×8ç±»±»ơê—ˆ÷Á¤ˆ\0Ë¿·‹…Û‹ÈăÅöÿ¯¶8¤‡Ù½ù×ă»9¥‡Û«‚ ½9¹Ú×¼àê‚ á=߈Á‡é/×:ë×ëöÛ«‚ ½9÷ÚÏÅÏÄ¡Á³Ù½äŒ¾NÛ×ù×ø×ÅÓÛ×ĂÙ‡áÓÅÏÔŸÅ…óǃvù×ëö©ˆªĐ·ÔË̉¶÷‡±»ÎÔ«‡“Íj“öưÀ‚غ×ÓôöÁ”Ùå×ÙÚ“½ñ£߈9¥‡Ăô•½ëö±»¹Ú•Ưù×$çôñÓơ꽄÷ˆ›¶éÏÔßÄÙƒ×Ī»ÏÔưÀÏÔÏÔß»û9¥‡±»à½éßöÁÏĺy«Ñéô3ÄàרăˆŸ;åĂÏỐv¸£8éÓ½³ÂÖ̉Û×¹“ơêÏ̉¡È›¾߈ö¸Ú +ƒ¾‘‹Ç¼ô…àÏÔÁƯơé½Ñæ¡Ô¹Ú¡ÁăˆŸ;£ØÚÀƯÛº«Ôù×­½¼«‡“ÍjÙ½¿‰‰¿I­ÄßÄÙÎ|̃ˆÙ½¿‰êơÖ¾™‰kß [ïSœˆ±ïăˆŸؽơê₫ÛĐÓăˆŸ;kưÀÏÔ8%¤‡%ÖóÇç'щ¹ÚưÀåỞˆ”=°»‚vŸ}9¥‡–ÓCñÓÁ¼¾¡ÛăˆŸ;ñ×±‡™‰kß [ïS÷Á‘«‚½ưøöÔ‡«‡“ÍjµØÂÛ×̃ˆóÇ™ÔăˆŸ;ñ±̉›Ú߈¾߈Î؉j̃ZîSưÀ­ÄưÀ«‡“ÍjÏæ–Ö¡Á±»Ñæ߈Û«‚ ½9רÛ«‚ ½9ƒv«&¡ÈµØĂÙ±»•×çôÁƯÍÜ Ëû­Ä»ƯÓ ĂÈù׋ÙăˆŸưÀÇ"˿ɧԩÓï»ß́½ï½ư“¿ív‰¿I¡»ÿÚ«Ô˜‰j̃ZîS¡ÔÍƠ½¢ƠÓ¾ƒˆ¯¼énâ µºÁÁƯÿ̀»½«Ô°»É¼8¤‡Đæù×°»« ©ƒ»5çÚÙ½‹ÜÿÚ±¿íÏÅßïÅÀ̉ù×ß»ûçÚÍÓ׿8ר¡È¯$¶‡Ö8æËƠƒv»ØǺ±»‰ơù×ùê½ßÄÙƯÚĂÙ—¾ưÀ•†ÚÁè‡Á›¾ÎÅó©¡«‡“Íj÷Á›¾—¶ăˆŸ¥ØôơÔù§ÿ¯¶ËÓèêñ‡¼Ô±½ưÀơÅñÓç½êØá=ß½ÏÔÏÅ“ƠƒˆơÔ½Û«‚ ½9…ûƠ­ÄáÅÖ±»å!ÅÚưÀívź©ÅÊÏÅÑÅϺƒvăơ‹ÇÙ½½€˜êèä«d±»©Ù½¥ă‰.áƠĂÓ£ơ©‡¥2ßëM¥ÛöƠµ‚vƠXá ›¾ăˆŸ;°»Ù×ÙÚ‡ÇË¿ר÷‡Û°»ר×Ơº—‡ÓÛº̣9¥‡×ívƠÄĂñÖÙ0߈ͱ»̉ơ ûƠË¿ÇÅÏ̉Úª‚ +¼9á꟟‰¿Iơêï³2ÎÔăˆŸ;k߈©ØøêÀ̉‹Ç8¤‡ĂÈÿÚ9¥‡×ɇ±»ø¿ ÷Ù¼Ăù×Û«‚ ½9ÁĂ¢Ç­Ä˦éJé‰Ó5“gesÁű¿ËÇưÀÛ×ÖØäÙî¿«×å£ßF÷Ú“Ơ¼›¾ĂƠX߈ñíȽÇ̉ç4åĂØ×ÍÓkÜéÚĂ©Óù×¼Ô‹Çù‡9¥‡Û«‚ ½9ưÁƒvÍļÙÚ÷Ù‡ŒơèÅùë¶Y—¾±ÔÛ«‚ ½9‘û‡ÿ¯¶ß8¤‡¥Ø°¿¡Á±»¼€ĂÙ±ÍӣǛ¹«Ô½Ôö­¾÷¾½—ÓÏœȳà•Èû›ßÁÿ§ׯëöƒÚƯº9¥‡ŸŒ— áƠÏÔ¥Æí꿉ù×ÖÚ±»Â ¬°àèM¥ÈÀ½ÓßÚéÓ«ÔÛ«‚ ½9ϹÍÓ߈™ÔÏÔÏŇxƒÏÄơċDž̃ơÔ±»¾¹¼ÍƠ©‡¥2ßëMÅÔ™‰kß [ïS¿Åµ†«‡“Íj‡ŒăˆŸ;ç򼂯íØëڤϯñÓÍBĂ˜ÈƒvÁ×å׋ÇÚª‚ +¼9÷‡ëÓ–ÓôĂÄí´C!«ºÓÔß„¿‰èÓ¡’÷ˆô«ÔăˆŸ;‰̉ƒvơêÛ«‚ ½9ùדȹ¶ùêóâ߈©«‡“Íj‹Ûë“ÆÛ«‚ ½9ĐĂÿ¯¶ăˆŸ;kơê„(ù×ă‡½ëö›Ú§À§Ó߈“¼·‡‘×8çÓØăˆŸ;k½™‰kß [ïSؽ8±Áî‡ơê§âÛÇÅăÇíƒÚ’ƠƒvÅà¡»™ÁívùêµØ«Ôù×ù때·‡‘×8çƒvÛ«‚ ½9™‰kß [ïS₫ÇăˆŸ;ơé¹ù×›·Ô¡h™‡‰ßƠ½€Ûô™‰kß [ïSͺ•‹H“¹ƯNÑÓÙ½щỞ‰gÁƯ«·3uU™‰kß [ïS«‡“Íj™ơ¯Ơ÷Á¡ÈÙÚÛ«‚ ½9¾™‰kß [ïSö¶“Ƃֿ‰å̃½ôï³2ÑẰĂˆù׿º¬ÖgçÚăáĂÙƯàö™‰kß [ïSÛ«‚ ½9󭾋ÇăˆŸ÷ơ›¾êöñÄö½…×åívͽơ–¯àó®Ơ‡Ç±»ï»ù׳ôëöëö‹È¡ÈƸÏíŸÖ™ô…nàÛÀ¼«ÔăˆŸ;k½ÑÄëù×ϹÏÔß¹÷ÚƠơêÙ½»ÅÍÄ™‡·Åö׺¯ƠÏÅ߈¡¼·ÔÑö—¶ưÀÙ½ùê©Ø›¾₫ƒÉÏı»Ûש‡¥2ßëM½Ô”áØR‹Ç¬¿щ©ÇËÉ9™‡ÇÖĂÙÛ«‚ ½9éê›vë¾Å©ˆéÚ™‰kß [ïS›Úăà³ÙÜ麙‰kß [ïSÄØ…¼±»›¾•»­víÆƠù×ử“Ơ¡Ôùê‹Ó¹àËǷ‡‘×8çÑÓơÿÚËÓƯÓ đ¾µ.¥Ùƒvׯ‡ÖƒvÙ½½Ă©:›ÚÓ̉̉2á¾ÙŒë*«ûÅÛ«‚ ½9ï³2ÓºÍċܙ‰kß [ïSÙÚ·ÔÄÓ:Çâ›v«‡“Íjâ¨ÀÛ«‚ ½9ÓÏÅÛ×·ÔÀĂÅØÚª‚ +¼9ßÚÛ«‚ ½9ó±»™‰kß [ïS™É˜‰j̃ZîS߈º̉˜êè亽!Á¹Ăà­Äº‡›¾ëöù×ß»ûµKƯÓ °½³ºóù×ÁS´†Ç̉ÓÆ›¾ÅØèêÁƯ½ôÏÔÛ«‚ ½9“¢߈±ÔơèÅÛ«‚ ½9½™‰kß [ïSŸÈíế–G Åđ‡ăˆŸ;Ñóëöù×£ ‰¿I«‡“ÍjăˆŸ;ÅÄ̉ű»™×¡ Û«‚ ½9ÅÔ·̣«‡“Íj…ƠÁƯµ†ÏÄÚÔÇÛºׯ­ÖËƠ½Ù±¿¤Â¹ù×óÖåÁ«Ä‹1ơêéÓ¾¹xùêăÁÂȃvÉÅØÏ̉­Ö§%ÑÄëçôÚÇÁ‡é/×:Ù½™‰kß [ïS¼€›¾©àø×™‰kß [ïSÿ±QŸ!½ĂÖÔ†6¦jéơ«·3uU¶Ƽö©Ó¸Ú³ü€Ơ°»κ³ ËûơÔÙڳسÈßƯíç9¥‡ù×™‡¤Ø“Ơ±»߈­ÄăˆŸ;Ù½²™¢§Ø½í—GÛ«‚ ½9ºÛ«‚ ½9¾ăˆŸ;©Ó“æøêù™ëö±»¯à£ØÅ»éꩽºÙÚÙ×™‰kß [ïSáƯç̉Û«‚ ½9¤Ç—ÓÏÔ‡“Íjÿ ‰Ô©«‡“ÍjÅIÑU9¥‡Û«‚ ½9߈±»߈ơèž„±Ô9¥‡×«‡“ÍjÓÆ‡Ú™ÁĐÄê‘Ö82¤‡2Ö—ÓçÚ¯ÛßÁ—ÁÏÔ­¾‰¿I½ưÀÛ«‚ ½9߈ë×ƯßÛº¾«‡“Íj§Ô±»ÿ™ÁÁÓƒ+ó‡x™‰kß [ïS«»¹Úùêù×­€±»ÏÔ¨º¢ ƒÖóǽ³¹Á¹¥ˆ]1·‡‘×8盾çÙ̃ÁÿÚăÁï½ù×ÿ¯¶ÄÀƒŸ©&»ù×½ỗˆ™‡¿–­ÄË¿½µØ›×êö±»“Ơ©‡¥2ßëMƒv¡»Ÿ¹ăˆŸɇáƠÛ«‚ ½9÷‡ăˆŸ;›¶é±»“ÍÄÁƯ¥/ÇØË̉ơê8¤‡‚¿ß»ûÏÅÛÁËÏÔ³Ç"óÇùºÛ«‚ ½9ûÓÙ“Ơăöëö߈«‡“ÍjÛ«‚ ½9½€£ä­€ĂÑÄë¿»›Ú·ÅÏÅÆÍ«·3uUµØơ߈ÏÔ«‡“ÍjÁí߈›¾ÙŒë*«Æ«d—¾ÅØ£ØăàÙƠ™‰kß [ïS½ôŸ}€0áƒÖ̀Ó9¥‡½‹ÇÙÚăƒv«·3uU«‡“Íj™‰kß [ïSĂÈÉ•Ó÷ơăˆŸ±»¡ÔăÛôĂÙöÁ½±¿·‡‘×8ç̀Ó‚Úù×±‰¿Iư“Ï̉µa©Ó•‹H߈ăàƠÓÁƯëöɹ¾¹xÛ«‚ ½9ív߈ơÔçôëöÏÔºÍ÷™‰kß [ïS®ô­ÄºÍBÙڱ뇶è·Ôé%±¿ɇï½Ă8¤‡ÏÅ™‡ăº®ÓÛ«‚ ½9“¼ËÓùׇ±¿ưÀ¤ˆ\0ăˆŸ;k™ÓßÄÙ˜‡ĂÙÓÓôê4Ơ«Ñ›Û±¿éº¥ÁƠ¥ÁÅ–ºØ±¿¹ÚăˆŸ;kÅØ›¡ôÏÅù×ÏÔ±»Á̉¢Ç•µƠô×Ü…ƠĂû´±»§¹¥ơ₫±»ù×·‡‘×8çªÚ߈‡ºǼưÀăˆŸ;ÍöñÓϼߌÛ,Û«‚ ½9“¹ƯN÷ÙËÉ9ƒˆ™‰kß [ïSÙÚù׫Ô߈Á̉­ô—¶ÙÅëăˆŸ;œÔ­Äưè·‡‘×8ç÷Áƒ¡È—»ï½·Ô—¶ÑØí™‡½óÇăˆŸ;8¤‡×ă»Ở₫§Ó߈½ÈÏÔÿÛÁƯăˆŸ;¶ + +«‡“Íj÷Á›¾ëöá=×ÜϹ…ô˜×½߈ç̉‹Çͺ­Ä¹ÚëØÏ±»½€˹…ÇÏÔ­Ä›œơ…ÆĂùסÔëö›¡߈·‡‘×8çÛ×߈³ÀÎÔưÀï½ÅØ•Œ¸½ăˆŸ;™‡Ù½­½¼÷Á·ØÏŃv™ÓçÀ‡Œ½Ü麩ÇơèÅưÀ¡Áívà=Ï¿ù¿¿Ø“í½ƒvơlÛ«‚ ½9ï½—»Úª‚ +¼9™ÔÍÄÛº9¥‡ïéÏÅăÁÙÚ߈ç4ÙÚ±Ÿ­Ó¶Ô°»‹ÓÙÚÖÆù×ñÓ¼ô§»ù×߈9¥‡¹ÚñÚâˆ;kƒvÙÓÍË)éÛ9¥ºÎÔ¹¸‚½O¾“ÆùÚæº¾‰Û«‚ ½9áÛơ꥾ÏÅ‚Áƒˆ½ơê±»Ç̉˜‰j̃ZîSóÂƠÜÙÚơêÙ̉ù×ăˆŸ;k°»·‡‘×8çźĂ™‰kß [ïSöƠ“½̉Å»qÁĂö´ĂívùןȡۧԘêèäƒÖưÀ«‡“ÍjăˆŸ¾ù¾‹Ó¡Áç4ÂÈơÔŸ}¹Ú±»ơèÅ—ˆùơÛ‡Ù×ëØƒ¾‘ÅÓÚÚ±»Æ­ÄׯÅ÷ÙÇ~ƯÓ «‡“Íj÷Ù«‡“ÍjơèÅƺĂêëöµØ¥ˆ]1ܺ·‡‘×8ç™ÔßÄÙ×Ó÷Á†Œ³ÊÖÿ¯¶«Ôÿ¯¶º­Öë™Hÿ¯¶₫®¶çáÓ¼©Ü‹à«‡“Íj߈ơÔ¥ÆåŒ¿NƯ‰ÏÅ‘ơp½ëŸÅûƠ¿ß¹Ơ…ÇöđµÀëöÜ–½ óĂ“È†ÇÁÆ™‰kß [ïSƒv¥Ø¡Û̃ÁưÀâ™ÁÑÄë‘Æ½ÔÛ~ƒvÏÔăˆŸ¡â¹¼ÙŒë*«ëöù×ăˆŸ;íÚª‚ +¼9ĂÈăÁ™‰kß [ïSÛ«‚ ½9ĂÙ¬ÔƒvëöÁ¼߈áÁ凪» ₫¼ÊÓăàÙY›¶é¡ÛÛ«‚ ½9éê”ö8¤‡‡ăÏÔ¡ØƯ‰¥Æ¯È¹Ú¾ù½¥‰ÍL…°»©‡¥2ßëMá ¾÷ˆ÷Á›¶ééÓÂñÖÙÚ̉ÅưÀºƠºm˜‰ +j +̃ + + + +Z +îS +ÁÓßÚ¥Ó‡‚vå‡רơê¡Èÿ$Ú×¼Ù×íÖï½Ù½øơôÔÓöö‰Û«‡“Íj¹Ú‡ÇëöÛ×™‡Û߈ƠX½·Ô8¤‡ÖôêóÇ«‡“ÍjÄẲÍË)éÛ9¥™‚¼ñÓ߈Óˆ•=‘ƒë ăˆŸ;k«‡“Íj±»߈ù׋ÇÍÓ™‰kß [ïSß»û°»¼ ƒˆ߈±Ôùב“Â#ÙÚ½ÿÚ“÷ơÔéºù׃½™‰kß [ïS±»§Ô‡ÚÙ¾«‡“Íj½¸ÅăˆŸ;׿8¢ä÷Áù×™‰kß [ïS‘ơÓÆ‘ĐçÚăˆŸ;óDZ»óÂÓ̉«‡“Íj¡È9¥‡ÇÖÇÓơêÙÚƒˆè¼©-™‰kß [ïSÏÔÏÔỡºôÏÅĂÙÏÔÏÔÛ«‚ ½9ù×8 ¤‡ ÖôñÖ±»¡Ô§Ó±»¡Ô9¥‡ψơºÅØ©ÓÏ̉Û«‚ ½9â½çÚ—¶…ëĂÙßÄÙÏÜ‹Ó߈©Ø÷ÁÏԻųºó%µÀË¿ăºÎå‰ëö±¿ưÀ™‡ÅÙ̉Å¥ù×ă­ߌÛ,™‰kß [ïS¯ư›Ù½¶̃ˆ“Û¹Ú†Œ   ·Ô…àù×ĂÏÅëö‰Û߈ăˆŸ;k«‡“ÍjăˆŸơÔ÷ˆ­)ÙÚĂÙïÅ÷‡±»½’Ǒۺ±»»~áê³ çÚ—¶“ƠëÓ±¿ô°»±»¡Ô…Ô‰™‰kß [ïS¯ÈăˆŸÙÚ‹Ç”ŒĂ9¥‡×‰Û†Œ€º¹Ú•Œ˜êèä¡Ûÿ¯¶Ơ¡ÔÁ̉碱»ˆ Ó̉“ȳ(Á‡é/×:å×™‰kß [ïS¡ÁóÄÛ×í#™‰kß [ïSÙÓÏÔôø#ÙÚÛ«‚ ½9µa™×«‡“Íj‹Üª‡’̀j½›¶éÙÅëăˆŸ;ÓĂƠ½€ƒÚá=9¥‡ù× ‘®ù×›±¿¡Áƒv‰ÛáûÛÀ©ºÇ̉רïºâê¡»­€Åӣ؋Ü߈ëö¼±»«‡“Íj«»ÓÅ÷ ËÇơê…̃£»ƠÏ̉‹Çơê‘ÖÙ½ĂÙ§1ß„ö“Ơ™ÔƒœÛ«‚ ½9߈óÇ¿´ÙÚù몺‚Ó¼×Ơ½߈Ở½Ă©Ó›¾́Å™ëéå߈¾Çn°»ơ»Ü±̉¹ÚÙ«‡“ÍjƒvµØưÀù×Ï ưÀ½óĶv6ÏÔщ¯È£±ÑæơØÓƃˆÛºº‘÷ÏÄÅàÅØÏÔÏԓƽôăˆŸÏÔêö­ÄƠX™‰kß [ïSŒº¤ÆÛÀíÆ½çÚÁƯƒÚ߈¿‰ùêËÇ÷Ù±»߈‚ˆ³ÇÔX«‡“Íj„Ç߈ÙÅëÙÓ½€Ù½çÚœ‰¾I«‡“Íj÷ÁËÉ9éºù×í֭؇«‡“Íj°»±»ÁƯá £HŸ}Íñ»‹Ü™‰kß [ïS°öñù׈ơ‡Úôغññ×DăˆŸ;kƒ×߈ù×¹ÁÛ«‚ ½9ÓºĂ¼Û«‚ ½9Ó¾¹Úø×ñÚùׇäÛ«‚ ½9ͳ·º·‡‘×8癉kß [ïS½ù×ÏÔÍË)éÛ9¥Žêö·Åù×™‰kß [ïSŸÍ¡ÔơÔÏÔ±»ù꫇“ÍjăˆŸ;̃ˆëÓËÇÂÖµØăÇíרƠX³”…nỬƒÖ›¾§Ố–G«‡“Íjä̉ÿÂÏÔù׻عڷ‡‘×8ç±»öÁ½Ô§ô½ØÂÑÓăˆŸăˆŸ£–Û«‚ ½9߈í—G©‡¥2ßëM“¹ƯN«‡“ÍjÑÓϹ±»ÍÓ¡»ÏÔ§ÔÛ«‚ ½9™‰kß [ïSù×ơ麳ØÍÓ«‡“ÍjÎůÈÁĂ½ívÙ½¿Ù½·Ôº߈ù×ăơº«‡“Íj߈—¶Ç¾ÿ×ù×½ƠXºå̉ ñÚ˜àá=Ù½½Ƽó|¶‰¯ÈÛÄÓ…ÖǺñÚºÿ¯¶ͼ¥½ÎÅ­€™‰kß [ïS«‡“ÍjĐÓÛ«‚ ½9µØÏÔׯ÷å5Ó©¼ƒvơêÙŒë*«§‡ÿÚơÅ«‡“Íj«Û̃ˆ·Ó ¥0߈Ó©‡¥2ßëMÓϺ±»±»߈ÙÜÅØƒvéêÏæÁÛ×܆“"Ù½ÙÚ¡È»‡½÷¶½½ßÄÙË̉çñ™‰kß [ïSù×ơêùÚÙÚÛ«‚ ½9§Ôù×¹Ẳæ߈ù¿ÓÔ‹Çü¶ù×ÓÅ™‰kß [ïSÄÁ¡ÈÁĂÛ«‚ ½99¥‡ă¾ßß½½ăˆŸ«Ó¿ç˜ÁĂÖ³àµØÏÄ‹Çív߈¨ºñíÈÛ«‚ ½9åô¼óÇ»ØăˆŸ“Æç'ÿÚéÚÛ«‚ ½9öщ×Ó›ÚĂÙ½¹Ú±»‚Ú«‡“Íjº±»…Ơ½ốÚ›¾ûØYå̉ ù׫ÚËÇ9¥‡ëöÆöÿù¼ăˆŸ;kƒ½Ë°»Ơʇ™ëé宼щ‹ô©¼¡ƠÇÖÙÚưÀáêă‘¼ºéÓÛ«‚ ½9ñÓø¿ƒv߈ăˆŸ;³ÈÇÛ§Óăơ‹ÈÑØ…¼ăˆŸÖÆá Ă¹ÈăØ™‰kß [ïSÂù×Û׺±»óƒ9¥‡¡Ô±»Ù̉ó¹ƒÀ«‡“ÍjÍƠX›¾½ñÖ­€™‰kß [ïSº±ĐñÓ±½±»«Û¬ÖóÂÖÆû’¿ÀÙ½ËƠƯÓ éÓÑÓÙ½ÁƯ“Æöɤ‡ŒºÅÛ«‚ ½9đÁTï½8¤‡Ï̉«‡“ÍjƲ+_÷Á߈™‰kß [ïS™Óéê₫®¶§Óª‡’̀j£Ô¡ÔçÚÓÅơÔ‡ù×ívÂ…×µaü̉™‰kß [ïS™‰kß [ïS¼çƠÓ–µµ¦µ̀»µµăˆŸ;kĂÙ¡Ûív«Ú“̃ÓÆÛºöÿÚÿ¯¶åĂ²ÈÙÚù×¶̃½³à߈ĂªÔ‡ÛưÀ¥%ăˆŸÁÏÁ½áƠÙ̉ëöĂŸ¿¼€ĂĂÅn›Ú»Á—ˆ¯G‹ø©¼«Ô±»Û«‚ ½9ËÓ÷‡ù×Û«‚ ½9«‡“Íjăà߈›¹¿‰ùô∗¸ÚƠÅ“ÆƠX߈¼€ŽƒvÏÅ«‡“Íj߈ÏÔƒv£X±»ïôÿ¯¶ÿ×ùô·̣¸ÅƼÿ¯¶¤¾ +ñÓÉøà÷Áר‰ÛÛ«‚ ½9ÑÁƯÍÓß»û‡xùêÏÄÛ«‚ ½9¥Ø¡ÁéꇺÉ̉«»ĂÙưÀ½€ùĹړǷÔÁĂơÔÑÓ’ÇÇÏÔƒ×ùׯֻô߈Ù"§Ô麿º«‡“ÍjăˆŸÅØÜé‰ñ5ñ·±½£»±»ĂÙ±»­ÄºĂȫԻ½˜‡™‰kß [ïS߈ÊÈ9¿ÿÚϹØŒê*ªăơ¡Çº½çmƒëÔå̉ ÁĂ߈ôê­ÄÍçÓù×±Èùx›¾߈×ÓµØ9¥‡ÏÔѹÚª‚ +¼9Í­HÿÚ‡ŒåưÏÔ¯G‹ø˜‰ +j +̃ + + + +Z +îS +ù×ƯÓ ƒµưÀ«‡“Íjêö›ÛÛºñÓ8¤‡·h¾Ï̉£ Û«‚ ½9±»éêªÚóÓªÔ©ØÅÏű¿¹à‹ÇÄÓƠ¡Çøêö¯´·Å9¥‡ơê±»ù׃vöø”ƯÓ Û«‚ ½9ĂƠéÚÙ½‘Æ÷Ù¡ÛăˆŸ;ív‘àÚª‚ +¼9÷̀߈öÁ ¡Ø÷Á±ÁÛ«‚ ½9ùëÏÔ»yƒv°»›¾ÏÔ«‡“Íj›Ôá Ϻ¹Ú»Ó½·ÅơÔ‡º±»Ù̉Ù½ÏÔ½×Ó¡Á‡ºÏÔ£ØÛºñÖ8¤‡¾±¿æÚưÀçóñ,9¥‡ƒÖˆÛ«‚ ½9¾ÑÄ뺱»°»¿×˜‰j̃ZîSï³2­½¼ơêÁĂăˆŸ²º̣¬Ä·Ô±»±Ù̉ùê߈߈߈ƒv½¡Û­¾ÑÓ¹ÚăơœÜù×ÑÓ³ăỞ“ÇáêÉ(±»ͽÏÔéê«äш¡ÁĐÄêíꥺƠùדöÛ׫‡“Íj£Çå̉ ±»ßƯïi†Œ9¥‡Ă©¾ăˆŸ;Úª‚ +¼9ùë³Ø™‰kß [ïS§Ơ½€ĂĂ ›­±àéMÚª‚ +¼9‚¨º°È +úñ»ÛºÍÓµÜñ‘çÚƠXỞ߀ÿ×èê ÉĂùêăˆŸ;ÏÅÜÓÅùÚÛ«‚ ½9¼€›¶é߈çÚ´†™‡½ÔÏÅ̉Æăơó×ù×ăˆŸ÷Ô¡Û–øÛºŸÅÛÀơềûÓ·‡‘×8眉¾I™Ø‡ºăˆŸĂÙăˆŸ±ÔƯÓ ¶ºƼÏÔ“È̃ˆźå̉ ù¾ÛÇÅôâˆ:‡ƯÙ½ƒ½½ÈơêµØÿÚưÎåĂ«‡“Íj¼ôÿÚÏÅĂÎù×±»ĂÙÍÓáƠ©Ø­Ôƒv½ÿÚóǩ͂à€Ơ·ÔÛ×™‰kß [ïSÅØÿ¯¶ÏÔëö¯¾¼Ø ߈§Ô©ØíJÔơ÷ÁëöÁ½ÏÅïƠ™Ó™‰kßĂÓøêÏÔÏÔÍË)éÛ9¥ɇưÀ™Á±»ñ×ăˆŸ̃ÄØÇÖ…Öƒ·‡‘×8ç›ÚÏÔ“Ơ¡ÛÏŽß(‡«‡“Íjá¨ăˆŸ;ăà÷Ù‡Û8 ¤‡ Öú(©Üƒv߈Û±ÁÓ¥ˆ]1ƠáÅÛ«‚ ½9ºÅ̃ŒÛ,‡Œéº€¾%ñÚ°»êö£ —Óÿ¯¶©¼÷«Ô‹Ç³Âùë9¥‡ƒv·‡‘×8çÙÚáêçǸÚă»—ˆëÓăˆŸ;¡ÓÔÂèÑÓ›t«‡“ÍjœĂåÁ·ÅçÚÏÅƠ·ÅÛ«‚ ½9óÔ¡ÈóĐÿ¯¶ăˆŸÂ߈·ÅÛ«‚ ½9«‡“Íjêö˜‰j̃ZîS³Ø¼£—™‰kß [ïS߈±¿«Ô˹ÁçôơêÎÔÑøáêÆÁă߈ÛºÛ«‚ ½9±½·&§Ô±»¡ÛÏÅ¿‰Óع´†œ·̉ ¤0‘®ß%½̃ŒÚ,½ô‰ÛŸƠ™Á„»µy¡«ßăˆŸ;ĂÙôÛ«‚ ½9ÖÆÿ§È­́­Ô™‰kß [ïS¯½áº߈¿Àá§ÿÇ¡Èçóùêø×—–•׿»̃ÛẲ²zÚª‚ +¼9˜‰j̃ZîSĂÙ9¥‡«‡“Íj¯È­Öׯÿ¯¶… ‰₫ĂÖơÔÏÔƯº·Ô9¥‡¿‹Çù×½¾‡´À߈ÁÉ»÷ÁËÉ9¼Û«‚ ½9Ù½÷ÂÚÆơêóÏĽ»Øå̉ ƒöÁÏÄăàù×ơêăˆŸ›¶éư׃Öơꙉkß [ïSÇơèÅØÙ»˜‰j̃ZîS­ØơÔ‘Ô°»Ù½Ÿ¹‹ÇÁ×›¾µaë×·Ôÿ¯¶ß»û߈¹Úô߈µØ¡ÈƯÓ ́$‹ÓÅÓÛ«‚ ½9ÍÇăˆŸ;µØ˜‰j̃ZîSÙÚœ‰¾I±»±»‹ÇÛǶÁ½¿‰˜‰j̃ZîSºû(ƠƒÖăˆŸ;™‡ù×ÑÓ¡º߈ƒˆÅؽù×·‡‘×8ç¡ÈÅÓ󶙉kß [ïS½’Ơ‡Ú¼Ù׃Ԅֽ—¶ÿ¯¶¥ÚÁ Ñ+‘Ư¾ưÀ†Œ5§ôƒvçmÇÓ¡ÛÓÁơễˆĂÙ›¾‰Ôẵµ†‹ÛåÁơêƒÖ¿Åù¿Û«‚ ½9Ú ª ‚  + ¼9 ­€‘Æ¡·ÔăˆŸ;k„‹&ÿ¯¶½ôñÙϹ›vºÁñùꙉkß [ïSăˆŸ;ÁăÛ×ơèÅà¤<,ư÷§ËQƒv߈ëöưÀ͘‰j̃ZîS߈¾ƒÚ°»ăˆŸ;kÎÅ%¡Ûº“Û«‡“Íj›‚¥ØÍÄ§Ø½Ă¼ÂÙ†ŒơÔ·‡‘×8ç½Ă¥ˆ]1Å­î½ôÿ¯¶́º±ëØÿÜ¥ˆ]1½±»߈ĂÙ¡ш߈ù×÷¼ÏỐvÇÚ¹ÚœÂöơĂ´½ĂĂÈ™‰kß [ïS¦Ô9¥‡ËÜ«ÔÓÚ‡ŒÛ«‚ ½9™ëéåëÔù¿%Á½½íÓÁ½«‡“Íj©¼Û ¬°àèMö߈ÇÅîÅî½½39¥‡‹Ç“߈ƒvÁƯ«‡“Íj°»­Äψ›Ăíê™Ó™ÔĂºƒv¥ˆ]1«‡“ÍjÔÚåà9¥‡߈ơê­¾߈ñÖ½Ô¹Ö߈±»ñÓÙÚ«‡“Íjs‡Œ¹Ö±½߈âˆÁƯơ»ÏÔ½€ÏÔƒv“Ơ»Øÿ§Ó̉‹Ù“ŸØ½ă¼ëÚg‹ÇưÀøºÁ¼‡Œë¥Û¡ÈĂƠ¡Á¡È³Âçڢ䳉ԅ$ÂÙĂĂ ›­±àéMíÖéæÚí+«‡“ÍjăàơÔĂô¶ăˆŸêöƠÄéê¾ù×߈™‰kß [ïS·Ó ¥0·‡‘×8罫ÔöÁ½“Ơù×ưÀ«‡“ÍjµÆ×Ơ°¿ØÚ‹¿Û«‚ ½9Îőƫ·3uU™‰kß [ïṢ—±”û̉±»—»ă‰Û…Øÿ¯¶ù¿ëöëöºăˆŸ;ÛÀ̃»úŸØµ†Ü­Ö©‡¥2ßëMÿ¯¶ï̃ƒvưˆĂÏÔä̉³×³ºó±¿çÚơêơƠ¹ÚÂơÔ§ØÇÛµ.¥ÙíØ¤Óψử½…ÛÉܺ߈¶ăˆŸ;ôºyćÇëöçÚµØƠß„—»ÍË)éÛ9¥±»Ù©ÓÇáó™׉Û9¥‡ă­ÑÓ»‡»ÁÁƯ߈ơԷؾè₫®¶Ăđ߈‡ÙÚ“́ù×§¥ˆ]1ªÚ~ÏÅíÖרÛ«‚ ½9åÁè$£X¦ÈÆô™‰kß [ïS©Ó±»ÆºĂÓºù×£äÏÔ›¾±»›¹߈êöăˆŸ«‡“ÍjÓº¡È“µØ™Ó«‡“Íjëñ̉ºá ƯÓ ÙÚÍÄ›¶é°»«Û9¥‡̃ŒÚ,­ÖÁ̉Ç[¡Ó¹Ú‰¿IÅØ±»«‡“Íj‡Úø×ăˆŸ;kĂȸڱ½ÏįÈ߈ă½›¾íêù×¹Ú«»Û«‚ ½9ù×ß%»ŸÏÔ’º·‡‘×8牿IßÄÙ¥ˆ]1´‰”‘±̀ÇÏÔÑÄëÛ«‚ ½9ƒùê—ˆéÓº™‰kß [ïSăº÷Á¡åô­È™Ó±»‰¶‘¾ơèǺơôơÄĂơÔ߈ƒv£äËÓóÇϺívÏÔ߈߈ùêŽơê…n‡¿Øáê¡ÔưÀÏÔ9¥‡ăˆŸ;ơÔ³zûƒÖ¯,ÏÔù×₫ÚÏÔƯÓ ™‰kß [ïSŽÛÚª‚ +¼9ÏÔáê×Ơ½‡ÛÙÚơêÂÏÅ‹ÜÍƠÍÓ™‰kß [ïSÅØ߈Óƒvñڹؾ“ÛÀ˯°°»ºÁ¡Ôà½Á›¾Á ăˆŸ¹Ú¡ÔÚÇÛ«‚ ½9ñÖƒ¾‘ß»ûÂÙƒv…ø·Å«‡“Íjñ¡₫±»₫ÚƯü³ôê9¥‡ÓÔ™‰kß [ïS‹Ó¯ÂĂàÿÚóÇÏÔ…ôó™‡đdž½ ±»¯‰¯0¤ˆ\0ƒ×ŸÄ‡Œ¬ÄÛ«‚ ½9óÇ…»ÁÓŒĂíÆƒˆ÷ˆ8 ¤‡ Ö߈ĂÙÔXµaêÓŽ¯È¿Y«Ô›¾Ë¿ßÁ”#ÂÛº™ÁÅØ«Ô—§Í»ÏŤˆ \ 0 ù×ù×ͼÅ–÷ÔEöÛ«‚ ½9±¿©ºá=™‰kß [ïS˜ơ÷ÁăˆŸ;߈™Ó¹=Û«‚ ½9¹Ú÷Úơ‡ÙÓ‡ŒöÁ½€½½»$߈ĂÙ«dÛ«‚ ½9Á/ùׯ»Åö©Ø½ô·ØÛ«‚ ½9鱿ßÚŸè»ÅÏÅÏÔÙ½‰¿IÅÓÿ¯¶áÅ“ƠĐÓ+Û«‚ ½9°»«‡“ÍjăơÛ«‚ ½9±«‡“Íj£ä«‡“Íj°»Û«‚ ½9ϼ߈»‡9¥‡ÛÄÓǽ›¶é›¶éĂÙ“ƠÎ̉ưÀÄÓ±»½ăˆŸßÁ߈‘Æ߈éê³±»çÚ±”ñÁï—ˆ±»¥ØuàÄq釽›¡ËƠ«‡“ÍjǺ·‡‘×8瀺ϑæô¡%ØÄÓƠÁ·Å·‡‘×8ç·‡‘×8ç®ÆÏŇ·ÅÙ×Ñ¡ÛüÀßÚơÔóÔ¼ƠÉ̉°»ö±̉—ÍÏÔÅÔ÷‡½Ô‡ÛˆĂÙ߈±»ñÓơèÅëö­ÄÙŒë*«ÑÓëö§ÔéêÏÅơÅ¿»áÓĂ¡Û›¾—ˆ¹»öëØûÓ%ÅÓƠ´ăˆŸÙÚÿ¯¶Ơù׳ÈăˆŸ;k·ÔÏÅ߈é‰ñ5ñ·É̉ñƪ»£»‚¾»‹ÇÖµØщ߈…̃Û«‚ ½9ÏÔÓÅ©ØÏÔ߈ƠX—»ºyøƯÜÏÔù׵ؽ ËûăˆŸăˆŸÁ›Ươêàê +ơ?‘©Û«‚ ½9ỞÇƯ“±»ÛÀÓ̉üÀ°Á°»±»Ô‡$±»º­€›Ú…Ø”ï³2µØ«Úù×çÔ¡ß»ûƒ¾‘‹Ç‡º9¥‡½Óº‡Ç­ØÓº½€©ÓÛ×¥ØëöÓØÇÖ÷é«ÅnÓØï»çÆ®ÈÛºÓ(¬ûºÁĂ‘ÓÑÄëÏÅĂÙ̃ˆáƯăˆŸùׇ9ènÇûƠ¾G³éD«‡“Íj¡È«äá$ÛǓȱ«߈ª»ƒÖƒv—¾¡ÓăˆŸŽ₫ù×½ƠÓ½€§ÔÁƯ/ÍË)éÛ9¥«ÔרŸ´ÂƠĂÙÏÅăˆŸăˆŸ;™‰kß [ïSỞÛ«‚ ½9©)Ó̉ăˆŸ;k˼û̉ºgù×ƠXơêËÓ™‰kß [ïSù¿Ö¾ͼçÑÄ뿉ÄnƠĂ™‰kß [ïS9¥‡éÚÆƒÂÈ…öÏÅăˆŸ;ÓÅшÏÅÁ›¡­Ä̉ų﻽€ƒv©‡¥2ßëMù‡ÏÔ“Æù×½™‰kß [ïSËƠµØ›‡ĂÈñÚÇÖË̉©ÓÑ×ăÁùסԣÔưÀßfÅéºô×ÜÿÚïÁË•G½¹Ăô‰²̀Óƒ¾‘½¦ó©ÓîÅE±»ñÚ™‰kß [ïSÂÈ™Ó‰à—ˆçôöóÇëö̀Ăƒ¾‘ÀËÍÓ¡%ƒvù×ׯ˜‡«‡“ÍjىߡÔƯÇĂ´Ûº™‰kß [ïSƠ©ˆYÇØ›¶éöưÀ“¼™‰kß [ïSăà­Å›Ăæ§Ô½áÛ©‡¥2ßëMÙ½£XùêÏÅÎ̉÷$½·‡‘×8çöëöÜơù×á ̃ˆ›́á$ăˆŸ£ÈößÄÙó™‰kß [ïSùë߈›Ûß»û£Ô¶Å«‡“Íj§ô½ôî²2 ·Å±»±»¶v }¹̃ù¿›ƒ©‡¥2ßëM¯çÚ₫Û«‚ ½9¿Å±»›áÏÅăà̀Ê)èÛ8¤ÚÆĐÄê‰øÑØưÀÿÉÖÆ‰ÛŸ¹™‰kß [ïSͼ©b߈ëöܺÎÅĂ¼רÏÅÇîëÓ°»ÇÖ¸ù×­ÔăˆŸ“ƽƒv±»Ÿ}鮣Ø9¥‡½ĂÙ×¾ơ,¹Úµ‚¥ÆÛ«‚ ½9“ÇÏÔ9¥‡߈ñÓ¯¾“Ÿ‹Ç›Ă ËûÙ½á퇵ØßÖñÓ±»»y™Ó¯¹ÚÑæÅà±»ëÚŸûÖÅà°¿Ă“º¿ô¿Û«‚ ½9ƒ¾‘­Ä¨¼˹•Üö­¾ëö×¾ĂÙá=₫½‡ÚÏÄ«»߈ÏÔÑÄëÛƯ8¤‡×¾‹Ü½àƠƒwÅØăˆŸçÚ¨¼Ơå̉ Ơđ» ¾ ”‹œH«âÏÔ‹Èùë£Ô°»¢»³ÈÓØùæ߈ưÀÛ×Á|ÏÅß»ûƒÜ±» Ëûª‡’̀j›¾Ø×¿ÅE»Ó÷ˆö½±»ÏÔ»ÂĂÙ‡ÚöçÀ¥ơ±»èº9¥‡“½ÑÄëͽ½Ô¾ôç4ÏÔåĂ«‡“ÍjéÓ߈ö«‡“ÍjîºÿÚóÂơ³¾Û×ÑÄëƠ‡ºÛ«‚ ½9›¾ÇØ̀ÓµØͪ½Ă…àׯ±»Óس›¡µ́ëö«‡“Íjƒvû(ƒv½ăơ¥ˆ]1óÇÛºëö™‰kß [ïS߈ù׺»„µØÑÓÉỂŸ}߈êÖ×Ûå̉ ™‰kß [ïSÛ«‚ ½9Ï̉±»ÓÜÅàµØû(º˜‰j̃ZîS‡ÇÖ¾™‰kß [ïSÁĂŽù×éÓèêçÚíÖûÓ§ÔÏÔëö«‡“Íjù×ÁÓù×å̉ ƒvà³Âù׋ӱ»ƒvÚ˜‰j̃ZîSí—G·‡‘×8ç±»æơ“¹ƯNÓºÍÓù×­¾“ÈŽ±½Û«‚ ½9«ÔĂº™‰kß [ïSù×¼ ƯºµØÑ+ÏÅ›¶é™‡±»ÓºÑŽôßÄÙÛ«‚ ½9ăˆŸ±±¿Ă ›¶éơÔÏÔß°±Ôƒˆ¶ÅµØÏÅ©‡¥2ßëMéô¬¾ù×ñ×Ø×¾Û«‚ ½9±»Û«‚ ½9Ù…Ö™ëéåèêµØŸÑ߈ăơ8¤‡»‡“Ơù×ÏÔ³ºó»¶ô…»ÓµƒvÎÅ·Å߈ÏÔÍÄÇÖëöăƠ›¾©Ø߈ƒvử¹Ú¿‰ºyû߈«‡“ÍjÑÓá=Û«‚ ½9ĐÄêŸÖ¡ÁƠ‚vÙÜ«‡“ÍjùêÑÓ¥ˆ]1ăơ¿Ô¹ØØYƠ¹Å·ƒˆ“¹ƯN¯đÑÓ¸Úÿ¯¶ÏÔ¯¨§ÆÏ̉ëöÑØô·Ô¯¼³ÈßÚ²¾˜êèäơèÅêö½¡ÔăˆŸ;÷ˆÙ׿ºßÄÙ¿ºÅô“½åƠ™‰kß [ïSưÀ«‡“ÍjÖĂ‹Çáê¶ØÉÿ¯¶ƒvÙ¡h¡ÔµØ×£Ø©Ü…Ö¡ÈÿÚ½ĂÙ¿‰™ÓºĂº»ͪưÀ߈ÁĂ­ºˆ›¾߈©‡¥2ßëMÑÄëưÜàĂ6ûű»Ëßï»Ùܾ«‡“Íjÿ¯¶±»ÑʼnÛăˆŸ;k߈ăˆŸ™‰kß [ïS߈«ºáêñÓË̉¡ÈÅáê˜ ê è ä «‡“ÍjçØÙ½ÏÔåĂƒv‘Æ©‡¥2ßëMÑ·Ï̉̉´Oå̉ ߈éÓ—¶8¤‡ÖăˆŸ;óÇí‡íêƯđª‡’̀j×ĂÏ̉êöăˆŸ;߈¡»ÙÓ»yÏŹړƠßÄٶŽ۫‚ ½9±¾ÏÔÁăƒÖÏÅÖ$Û«‚ ½9µØƠ´ïÁ߈ù׿Ø×¾üÀù×Ù÷‡ƒv°»§Ô™‰kß [ïS¹Á«‡“ÍjơÔơêËÉ9ư§‡Û«‚ ½9̀Ó ­ÔÁ̉™‰kß [ïS­v¥Ó¹öë˜HÁÙÙ×ïÚ„ô߈¹Úá=á ×¾ă»™‰kß [ïSÖ¾8Ñӵعڱ»Ăï̉—¶¹Ú¿‰ƠĂÙÙ-Û«‚ ½9ÛÚ¡Ûơ꽩‡¥2ßëM9¥‡×ăˆŸ¯Èƒv—¶–»ËÉ9êÚÙ½Ở—¾ĂÙ½±»åôƼ«»£Ôă½’Û‰«»¿ô—ÓÁÙÚưÄ»‡±»ƒvÏ̉—ă´Èß»ûù×ĂÙửÿ¯¶³ “ƠûçÚÏÔô™‰kß [ïSöÀÛ«‚ ½9ÙÚÂÓß̃¡ƠÛꟽµa™‡íƓ뺱»ËñÚ¡ÔºăàÁ‹ÜÛ«‚ ½9Ăêöù×›¾µØ§¹½ÇÖ±»·Üå̉ «‡“ÍjăºÏ|·̃±»ơÔͼÙÚ³¼•úÛÄÓÛ×ÍÇ¥ˆ]1©]ù×ÛºéßôêíêùסÁÅØ¾«‡“Íj¯‰¯0¿½Ü¤ˆ\0ÏÔɇ™Û÷ÚñÓ%µØ«‡“ÍjÇØ‹ÇăˆŸßƯÏÄg¡Ơ™ôï»ÀĂ)ĂÙƒÖ°»éÓ¡ÔĂÙËÇÛÄÓÚ×çÚ×Ẳ*¹Ú±»ưׯ‹×÷‡€º‡ÇÏ̉ÅÓÙ×û̉“Ȣǫ‡“Íj§Ôù×½—¶ÀĂ€¾ƒÂÙù×ùêƒvÿ¯¶÷ÁĂÙÙ½ÎÚ±¿÷ÖºĂĂíÖÏ彩 ™‰kß [ïSå̉ ÅÓéê·‡‘×8ç±»ÛºÓº³ÈĂº¼Fơêׯ߈çµÁ “¹ƯNáX±»ăˆŸđØ,«‡“Íj™‰kß [ïSơê߈Ù½©OĂÈ߈ßƯưÂÛ׃ة‡¥2ßëM‡ÏÔâˆ:jËÉ9½‘Ö‹ÜÙŒë*«ÏÔưÀ£ä£Ư±¿½ĂßZÛ«‚ ½9áÛµØú²Æ/ÁƯïƠëö߈µaơꕈ°¿±»™‰kß [ïS­Ä¯¾·ÔÑÄëÛ×¹»Ø¹ÚçÚ—¾߈á £ä·Æéº¡ỖçÛ«‚ ½9ÅØÙ‡Ï9…¿‰Û«‚ ½9Ïŧôív‰Û߈ơèÅăˆŸ;ƒv߈Ï̉Ç‘éĂ莅֋ǻn¿ØùêƒvÛ×ưÀƒvƠĤ¾±¿‘ơ»ÛçØÙ½£»ù×…ÖÂÙøôƒvóÇ­Öù×À‡€è/Ö:‡›¾‰¿IŸ}ÜĂÈÑØ×ƠăàÏÔÙÚ™Ó¿º¯G‹ø­¾«‡“ÍjÍÄ­ÔÛ×߈ƒvù×½ƯÍÙ½±»ñÓ§Ó›¶éº¿àíÚ¿½Á?ïÑ¥ ³ÈưÀöù×ơÔưÀ©¾ăˆŸׯ߈½€éºéÚ—Óùê§Æ߈ƯÚ‡ù×ÿ§à¬÷‡ăêĂÈù×ßÄÙ±»Ïø×Ơ‹v¯‰¯0ívÑÄëăºÍË)éÛ9¥ëÖ£äưˆ½½µØ±»·ØµØÛ«‚ ½9׿ÖÔ†6¦jш߈±¿ÙÚÁ¢È ÿ$íØÙ½Û©¼¾ăˆŸ¾ß˜‹‹——ˆ˜‰j̃ZîS‰Û9¥‡9¥‡‹ÇÛÄÓ̀ Ê) èÛ 8 ¤   Ù½§Óô™‰kß [ïSé™àZ  ̣;ü$'¥ñÂ…tƠÏÔ¥Øщ¿«·3uU‚—¡ÈơĂ¯Ô¡ÁñÅ6«Ôܽ™‰kß [ïSÛׯÈ馱»¡ÁºØà¬ËÇâˆáÅ­ØăˆŸ;ĂȾø×ÓºÛ«‚ ½9“‰­‹ơÔ× ÑÓăˆŸÙ½Û«‚ ½9ưÀÛ«‚ ½9½ÏŇŒ÷Óß„¿‰÷ơă»ƯÓ ÿÂÜóÂÁ̉óÑĂ½€‘Æé¿ƒvÏÔơ陇í(ûÙ½ÛÚÏÔỔ8¤‡…×ÿ‡£Ư¹Ú„Ø +«‡“ÍjÙö¯×߈±»ÅĨÚؽđÓ ͺœØƠڣ佱ºÅÓÙÚËDZ¿ÍË)éÛ9¥€öÙ̉¼¨¼ÍÓÙÚëö‡ºêöƒv½ÆØëöÍË)éÛ9¥ßÁǼ«‡“Íj¡ÔƠëơ¢»‡×ơê®Èƒv߈ͺ±½¹Å™‰kß [ïS̃ˆÛ«‚ ½9å̉ ػر»ÍË)éÛ9¥×ƠÿÚ¡È߈á ƒØéê‚ßÄÙø¿›ÔđÇ®«…³‰é‰ñ5ñ·ëö߈‡ŒÏÔ9¥‡×Û«‚ ½9ơꙇ9¥‡™‰kß [ïSÙÚÖ¾ưÀéÓÂÏÔă½ăˆŸºÁ߈³̃ˆµØăˆŸ;k±»ƒˆ“Èø×߈ºÁƯ¡ÈÛ×á —ÓëöçÚưÀăˆŸ;·ÔÅÖù×½ñí½ÇÖÛ׉ۣØÙ½ËÇ‹ÇÛ₫ô³ƠÙ›¶éÙ½±»±»½©ÇÑÓ«»Ü™‰kß [ïSÙÚîỞ߈™ÊƒvµØ½Ô¡»‘ÆưÀ«‡“ÍjÙ½¿ÅµØ±½ÅÔ‚Ö¯¼ù׃ԙ‰kß [ïS½ÑÓˆ!ỞËÖ½›¾ơºÀײÂ7ш®ÈØ̉óÔăˆŸÁƯ÷ÁỚ«»ÅØỂ©Ѷù‡«‡“ÍjÛ×ßÁÑÄëÉ“±»ËÖ´‰"ëöº½ÔÍ€¾ù×çôÛ«‚ ½9ÍƠá꛾ËÜÙ»ĐÓ×ƠĂÈ­‡¡Ô£ô Ëû«ÔшÑÓăơÛ×åð»±»ÑÓµØÄÀ߈Û«‚ ½9Û«‚ ½9¯È†Ç¶̣™‰kß [ïSëÓ‡â߈ÜÓ+ +Å›¾Úª‚ +¼9‡Ú߈ƒvç̉‡Ú“ƠơêÛÀăˆŸ;ƒvÏ̉$ÑÓáÛÏ̉ÁăˆŸ;kÙŒë*«ù×ëöÉ»ÙÚ÷ÙÛ«‚ ½9·̃ăˆŸ;ẳ÷Á¦Ôר…ôĂÈ×÷±ëØ«»ÙÅë±»Ù½«‡“Íj“ƠĂ¼å»Åĉ¿IåÁÏÔ«‡“Íjñđ¼“Ơ›¾ƯÚăˆŸ;k⺱»“¹ƯN߈»#ÆơÙ±»«º«Ô™‡áƠÿÚù‡ÿ¯¶ơºÙÅëÁƯùæ‘Û«Ô‡ÇßεاӸÁ +ÍË)éÛ9¥Ï)ÙÚƒv†ÇÓ̉ăˆŸ·Ô«‡“ÍjÏÔщ¥ˆ]1ăˆŸ;«ÚàƠăˆŸóAñÚ±»•Çëö»Ó±»¿‰‚v«â±¿©¼ƒÖ¼ô½‰ÛÅÓ±»™Á™‰kß [ïS9¥‡ -́ơçÚÛ«‚ ½9ƪ»‡Œ½»̉߈å¬̃„ßÁ¥Ó„¹ÁçÚù×ë̉«‡“ÍjÊÖÇͽ±ôéêÛ„’¹ÜN«Ôë&ÏÔ¹ÚùׯÈÚª‚ +¼9«ÑĂÙרÚª‚ +¼9¯Ï«Ô„ÇׯÏÔÓØ߈óÂƯºï»¾Ϻ̃ˆï‡ăàƒˆ‹ƠÁƯ­ÔëöÁ—¶Ûºçƒvψ§º÷Áơêă¼˜ơ˜êèäº9¥‡ùëÚª‚ +¼9«‡“Íjׯ—ˆ½áꘉj̃ZîSăˆŸï½ÏÄ©Ü×½ù×Íı»‡xª‡’̀jÙ×ÏÔåÁ±»«ÔµØ» áÙ?¡M-ËơÛ‹ù×!#¹ Ơ ×Éùư • +‡¹'ư¥í÷ÁßÚ›Ú·º™‰kß [ïSḯ½€½€Û«‚ ½9·‡‘×8ç™Óg߈×ÓƒvíơÈ¡Ûù×óÇơê¡»ëöëöÓÅĐĂáºĐÁ…Û™‰kß [ïS³Øù×÷‡³ôµØ߈9¥‡Û«‚ ½9ÙƠÍƠƯĂÛº—¶£È·‡‘×8ç߈çÚ ÔÏܵơ½̃—¶ú(½€ùꙉkß [ïS½€Û«‚ ½9Û«‚ ½9ơê½ë×áØ³Û×éê¼ÛÀÁ‡é/×:Ûº¢ôà§±ô½ÁĂÙưÀ«·3uUỞ釫‡“Íj!½¼êöùêÁÛ¶Çô™‰kß [ïS™‰kß [ïSơúÓ¡ÔåƠ’‰2Ô,ø‹Çÿ£Ô„ÖÙ½™ëéåăƯ€Ơđôơº©À°»ăˆŸô·‡‘×8ç÷Áù׆ŒöÁÙ½ă‘·ÍĂ«‡“ÍjŸØÁÛ«‚ ½9‡xÛÄÓù×µë½ƯơÏÔëö§Ôø¿½€ưˆÿÚ±»³ÇÛ߈Û«‚ ½9‡Œƒ…ÖÅØ¡È©Ç™Á±»›'†ÇĂÙµƒ«‡“Íj¡Ó§ÔÍƠ߈éô›½ÔǼÛÆÛƒv™‰kß [ïS ƠëöÁ¹ÀĂö¼ µ†ÏÅÛ×ơêƒŰ½È­Äêh߈ûƠưÀÆÖ߈߈‡Çù×™‰kß [ïS…ô߈©&á ËÇÁĂëöçØ©ß»ûÿ&8¤‡×‹ÜĂÙ߈ĂÙ¿‰ÿ«Ûơ$·ºƒ %›¡ßÚß»ûÿ¯¶ăgµ†Ù½߈Ăơê₫¼ ù뛾©¼›¹™‰kß [ïSÛ«‚ ½9¿ô·Ôׯ…ôÛ«‚ ½9«‡“Íj±»…a“Ơ½ĂóÔ±»ÏÄ›¶éăˆŸ;ëöÏÔÛ«‚ ½9üÀÏÔ÷Á¯Ó°¿±»€›¾“Ơ¥ˆ]1áÅÛ«‚ ½9³½«‡“ÍjÇ›¾8¤‡™ÓÅ»ƒv«‡“ÍjơêÙ̉ñÖÎÅÛ«‚ ½9­€æ̉µØ¡ÁÁ¼éơ‹ÓƒŒºẲͼº™–Óº“Ⱥ°½ñÓø×‹Ç»ØÑÓÚª‚ +¼9™‰kß [ïS»öÁ—¶«âƒØĂôÏű½©&Û«‚ ½9‹Ç₫«‡“Íjß»û›Â™‰kß [ïSƯÓ éêù׬ֿ߰”¡ÛËÉ9½€£ØŸ}íØº½ÅÓ߈À½·ÏÅ—¶°¿ơêưÀóÇƯ‰ÏÅù×§ÓǼ9¥‡߈‡ºó|ÓØ½ƒͼ¥Æ£ÔăÁåÁƼǼÏÔ™‡“—ˆÛ×»½—¶™‰kß [ïSÏ̉ÁÜơêóÇÅØ×ëöÏŽ€9¥‡9¥‡¡ÈÛˆ«‡“Íjƒv±¿˜‰ j ̃    Z îS ăˆŸ;•ÓÿÚºéÚÏÔă‘·£ÇơºéÄßÁĂÈ߈À½ÎÔ߈Ù«»ăà‡«‡“ÍjÑÅÑÄëíê¹Ú¬RÅïÛÇͼÚª‚ +¼9·Åç›¶é‡Ó‡­vÇÖ±»ÑÓËÇ«‡“Íjç®ëö߈ƒvåÂØƠ½§Ïʽ·Ô×̉½Û«‚ ½9°» ﻡԇIƒvÁ÷ÁăˆŸơ÷Á¡Ơ߈ËÉ9©‡¥2ßëMù¿Ù-¶§ÔÛ«‚ ½9đÂÙ±»¡Ûéê¯ÈôêƠX±»ñµvíệ¶Á¼ÇÖËÇ“¹¬ÄơƯ¹àºÙÚ¹Ú襋ív·‡‘×8çơê±»›¦¼Áñă¾‘ƒˆö߈³È¾¹xĂ\ñ»Ó‡ù׬ÖƠ¸Ú»Ǿ–GÿÚ¹ÚÇÖù×±»É ÁÛùצȶ¦D /ơèÅïƠÚª‚ +¼9ǃˆ°»ÓØ×ÚƒØÑÓ“ƠÙßÏÅÙÅë¿©™‡™‰kß [ïS«·3uUËlj¿I߈Ở™‰kß [ïS“½¸ÏÔ÷Ùÿ¯¶ù×ưÀ›¾½ÔăÚù¿êµØÛ×щ•Œù×™ÔÄàăÁÇèăˆŸ;±)ưÜưÀ÷Áƒv ÈÛùë÷½ÛÀ™ĂË6÷½™‡ÿN™ÁăˆŸ;¥Ù¿‰ïÀÑÅïƠơê©Ó»ØăöŸ»ƒvºçº­¾ÑÄëơÔ«‡“Íj·Åù×›Yù×½µl9¥‡ù׫äüÓ°»¡ÈëÊ߈½³È󶳺ÁÁ̉Ë¿ƒÇÅù×¹Úôê‡ÛÿÚ‡ư%©Ç×Ü߈¿™Á¡Û¥ØƠXÏÔăàÓºÏÅöơ¶  ÍË)éÛ9¥ó§ÖÍÓ›ĂưÀŽƯ‰œ·̉ ¤0Ó¾èô³ÇÛ«‚ ½9éÓù׃vĂÙ×́ÍĂ«‡“ÍjñÓ±»¡È½½½ơÔ߈ƒvåĂåĂØÅê½ơÄ«‡“ÍjĂÙÚăˆŸ;kù×›Úù×Ăéô×ƠơêđÛ«‚ ½9đÅàÏÄƯ½½¹àù¾ÜÛÆÙŸ÷ÁívÎԣ؃ˆÏÄåÁ¾çúÙưÀºÁƯÏÅŒƠ «ÔñÆÏÔ¡ÛÏÅÍË)éÛ9¥‡Û9¥‡Ù½«‡“ÍjñÓôÑÄë¿́ƒÚÑÓ˜‰j̃ZîS£Ç9¥‡Û×Û«‚ ½9¬Ä»áơêĂØ×ôĂÓº¾9¥‡‹ÜăˆŸÛ«‚ ½9±¿ơĂ½|ï½Ǻ­Ø½€ơĂû(³ØÑ™»‡±»ÿÚưÀ߈é‰ñ5ñ·÷“«‡“ÍjáØÛ«‚ ½9߈‡ÇÁ¸Úëö™‡…Ø»ăˆŸ;kÙÚ‡“‚vƒÛŸóăˆŸ;kăˆŸ;‹ÇÉ̉›¾ñÚăÂ߈ÿeµ£ƒƒˆÙƠ™‡‡Ú™ëéå«Ô‹Ù™ÓÚ$ª$‚$$ +$¼9$ÑÓ¡Ù½9¥‡₫¾Ö*÷àëö©ÓôâÁ‡é/×:̣ēƋǿº%Á¹ǽÏÅĂÙăÁ¯¾÷ÚÙ½ĺ¼ë Ù‡Ï9…ÅÓ½¿ïŒÿ¯¶ÅØơê¢ ·Ó ¥09¥‡×ñÚ™‡›Û±¿ơê‘܉ۘ‰j̃ZîSƒ×ßÖ¿ôµ¶‡Ö8æơê¥Èö½Ă±¿«‡“ÍjÙ½߈£»û°»̉ÆSÛÛº¡Áû:«»¼b™‰kß [ïSÚÀÍÓœÁÿÚƯܽ€·‡‘×8çƒÔ©Ø°»ív›¾±»ü“Ƽô¶‡Ö8æăˆŸ;k™‡™‰kß [ïSÏű»«»ºơÔ³(Ϲ½ÔÛ«‚ ½9ÚăÇí£ƯÎÔ›¾±¿ÎÅó¶‡Ú™‰kß [ïSëöëö·Åëö»ÁƯ™ÓµØÚ×¥ˆ]1ºyÎĂô­ÖÁ¹ÙÚÛÚ…™‰kß [ïS¨È«ÔƯÓ ¸Ú Û«‚ ½9Ăºăà³ƠµØµa¦ôÚª‚ +¼9ƒÊµa¼Ø·ÔçÚ§Ôđ«ÑµÅ©Øö₫Üåë±”¾º…Ö™ëéå½Â ¬°àèMÙƠ“ÈßÚ­ÖưÀÏÄëÓËÇÏ̉É›¾ï³2öçZ߈½ôƯº÷Á߈¾Ó ·Å×Ơ™‡«»å̉ üƺø(çÚôúÚ×9¥‡­Ä†ÇëöźÑÓÛ«‚ ½9—»ÿ$ß„ƠÁ—ÓºÈÚª‚ +¼9ÏÅçÚ¾|Ńv½щ¯ƒ« +>Û«‚ ½98¤‡áĂ›ÚăˆŸ;Û«‚ ½9߈Á³̀ñ»áóÿ¯¶¡ÛĂÙëö¾øæÚƒ©‡¥2ßëMă½Ö©‡¥2ßëMӺ͕ԾF9¥‡ÛÄÓưÀĂÙ™‡÷ڥƃv‘°¿Ă¼߈›ĂƯßù×·‡‘×8ç“ƠơêÛÄÓ›¾›¾¾ׯ߈ëö÷Úé%Ígù×ơÔ9¥‡¼€Û×ĂÙÁ‡é/×:ØÚ´‰êö£äÏÔÆØ÷Úù×Ù½ÿÛ%ËÇóÇ÷ˆ½€ù×›Ú«‡“Íj™‰kß [ïS×£…ô×ÜÁ ö߈å̉ §ÓÙYôç®߈»µÏÔÏÔ¿»ơÔ›¾Çß߈ù×Ó̉ëö›¶éÙ½°»ăˆŸ;»ˆÉ̉ĂđïÚ×Ơ†7§jơĂ­Ä»ÑÓ­ÄÇÖ·¼Í7­)‘ÆßÚÜ™‰kß [ïSÅÙƒˆÛ«‚ ½9Ÿóe½€ơèÅ™‰kß [ïSĂÓ߈«ÚÛÄÓƒ¾‘™‰kß [ïS•îĂºÿ×ëöß„Ø̉öÁÙ½‚vù×§»Ăéê÷ÁßÄÙÛÀáê‹ÇỞ§º™‰kß [ïSœÜ,µØâà•‹Hï³2—¶™‡Ă£ä›Ú¡ÈŸÅ·Å˜È‡߈ĂÙ³ÂƠ×ƠÙ½́v³ÈÚDZ¿̃„ĂÈ›¾ơÔÛ«‚ ½9߈…Û¹ÚÁĂ¹ÚùôÛ«‚ ½9™‡ÛÚ™‰kß [ïSûöˆỞơêăÇíï‰³ăˆŸÛ«‚ ½9¿Íӯȱ»¿‰ÿ$¡ÔôăˆŸ;ÊّٽƯÓ å‡Ƽó±¿à="±Çè·§D ívƒÖ8¤‡á €Ơù×éêơêÛÄÓĂÙ¯¾Ó¼¨ƠñÖ₫¼‡ÛơÔÎÔ›ÛÁ îºæÚ·Å«‡“Íj¡Ô½ëºÅ±»Ï»¼ÿ×îº8¤‡ÏÅư“߈ßÄÙ߈—ˆơÔº˜‡‡'÷‡ù¾ïÅ߈·Åé‡ÿڪډϽù×麺›Û¾ºƒv߈½·‡‘×8çăàÍ­HÏÅ«‡“ÍjơèÅăˆŸö‡Œ¡Û«‚ ½9™‡™‰kß [ïSŽÅÀÏå8 ¤‡ ÖÙצ¹ˆ½9¥‡ñÍƠ™‰kß [ïSÛ«‚ ½9ơăˆŸ;±»å¼ åĂăˆŸ;±»ư“2²º̣ËÉ9ö¹àѲÜ÷Á€Ơơê߈ÑÓơԋم؟Ä9¥‡×çô±»§ÔƯÓ ëöª‡’̀jƯơƒˆ Ơ÷‡Û«‚ ½9Ï̉ÅÓÑÄë›vÈ›¾ư¶Ô ÑÅơ»ù×̣¶§ÓֻŰ»µaéÓ™‹ÁĂƠ9¥‡©ÀªÚÏÔ°»ÏÔ“¹ƯNóî߈—ˆ“¹ƯN±»™‰kß [ïSÁƯÿÂỠˆ¾Ơ¾†Ç¿Å·‡‘×8ç±»±»÷ÙËÓ›¾÷ˆù×—ÓËÙ×÷ڽةǃˆŸÅĂÙ™‰kß [ïSƒvƠëö±»—ÓÏíÏÄׯáÛ9¥‡×UÍË)éÛ9¥ăˆŸ¨Ø¡ÓóÂăˆŸ;™‰kß [ïSÛ«‚ ½9–¾ Û«‚ ½9Ù¹¼·ÅƯÓ ½ĂÙëö9¥‡×ƒvăˆŸ;ƒˆëöÁƯß¿ăˆŸ«ÔËƠÑĂÏÅÓ̉÷Á·‡‘×8çÁ×麓ÈĂÙ™‰kß [ïSđÓÏÔ§¹‹ÜKçơñ»ëØÎ́½€Ăº½ô§ÔË܋ǽٽˆ߈߈μöû؃ˆöù׭Ľ¹)ûͼ­¾±»ÎÔăˆŸ;ôăˆŸ;ù×¾¬€±»ÏÔ™‰kß [ïSÛן}öÑơĂ߈¾ºë×S™‡ĂÓźöưÀ™ëéåƠÿ×ྋٓÇù×麧ӫ‡“ÍjßÚƒvÊÖ©Ó™‡©‡¥2ßëM§ÔÍË)éÛ9¥Û«‚ ½9ÏÔÙÚß»û›vº…Ûß–ª¶2tTăÅÖ¾Ü߈öÁÔÏÔ±¿‡Œ§Ô›¾Ï ϼ³Û«‚ ½9±Œ»àù×™‰kß [ïSăêߌÛ,¿»ÏÔ›¶éưˆ—ˆÔ₫ÛÄӻş}ĂÈÆĂ¿Å™ÁÁ¹ëӽؑ‡Ø߈¡Ô™Ẳº°» +×¾÷Ú‡Çơ߈£äÿÚ¾×ÂÙÚ—»ù×ăˆŸ;9¥‡™‡߈ù×ÎÅÓ¾¡Û߈íê9¥‡Ù½ăˆŸ;ƠÄ“¹ƯNÓØ÷ÁƠÚÁרù×í¹ÇƯ¡Á¹Úƒ«%Ž̀Ê)èÛ8¤©½3÷Á9¥‡·Ô­vÎ̉¤ÇÅ¿‰ù×€eŸ»ĐÄê¤ÆŒ‚Ô>±₫ĐÓ9¥‡˹¡ÈËÉ9Ø‘3ăơ9¥‡×¶$$9¥‡µØóÂù×ƠX«ÑÓêÔƠ‡“ÏÔàĂó‹¥â¿»ƠăàüÀÏÔ±»øêî»§ÔơÄ™‰kß [ïSÎŃv¯ÛƠX™‡ñÖÙÚÁƯĂÙ™‰kß [ïS³ºóö·‡‘×8ç“Æ¹ÚăˆŸ;ƯÓ ÙÏÅăˆŸ¿©ÓÅÀëö—ØÅt‘®È$ØÑثԣƯù¿̀Ó ù±»ÿÚëöÏÔÏÔ©Ó˜‰j̃ZîSóÂƯ‰¿IïƠbv —¶«ÔÛ«‚ ½9—¶ơ‡źăˆŸ;¹Ú¡Ô߈ưÀÓ̉ăˆŸ;áñÁÁ ÅÔ¯G‹ø«‡“ÍjƠí¥ ±»µØ¹ÚϼƒvÑÓ·˜Ïúֵ؃½Ơ‰¾ͼ±»߈¼Ă™‰kß [ïS«‡“Íj½½ÏÔ¯Ô°»ƯÓ ‰ÔçÚÁƯưÀÓ¼äƠ¯¾‹ÇÛ«‚ ½9½Ç؉æÓ¼ˆ¿º©Øù×§ô«‡“ÍjЉÿ¿·̃ÏžºϼV½€8P¤‡P×ÑĂÛêÁƯơÄĂáêô镽ø¿»Å“Û«‚ ½9ơ꺃vù×ÎÔ­ơÄ—¶›¶é¿ô½‰¿I¾ÏÔÿ¯¶«‡“Íjëö«‡“ÍjÛ«‚ ½9̣µØÅÓ×áç·‡‘×8çÛ×·º½Ø­óƒvÏƠ‡ºù×ÙדƠĂ£ä½óÇ©ÓÛ«‚ ½9çƠ–ˆ ƠX›¾£ÔăˆŸ;±»§ô÷Á³Øºû×߈×h§›ÙÚĂÙ™‰kß [ïSÑÓ·‡‘×8çÇÖψ¿«‡“Íj·Å߈„n9¥‡¡ÛĂ ăˆŸ;ƒv™Ó¡ÛëöÏÔ™Áƒvª»±¿›¶éáØ¯ÜÎ̉Åô½ÔàĂæ$±ëØù×ÍË)éÛ9¥ƒvñÚ·¬ĂÙ߈¹Ú“¹ƯN«‡“Íj™‰kß [ïSëÚ   ¬ °à  èM …ƠơÄ—¶ù×êÚ±»™‰kß [ïS›¶éé½ÍÄ£»Ẳ•Œº£äù¿“Èö釘¿…»ă¼—¶ÿ¯¶‹Ü™ëéåÍÄĂÙ­vñÄÿ‰¿IûÙăˆŸÙÚ³”áê•Ü×ƠĂȡԵØ×ĂÍË)éÛ9¥›Û“Ơ›¾™Z±»ăàÁĂ¡Á‰Û߈Ù½™ÓÎÅÿ¯¶½±»™‡ưÀIÙÇÅöù×ÑÓĽ–ÁÅØר¾‰Ô¾˜‰j̃ZîSƠ‹ÜëöÙ×·‡‘×8ç߈   ¬ °à  èM ‡ÛŸå¸È¶Å½øêÄôƒÖ‡Û›¾óĂÏÔ‡Œ™‰kß [ïS¼Ỗ„ÛºÙ×ó¶ăˆŸ;ɽơêÑĂ·Å ÇÛ«‚ ½9ÑÄëá ̣ÔLÏÄÙ£@¹·‡‘×8çÍÄƯÚ™‰kß [ïSßÄÙ÷‡‘µÙ½±»Ûש¾߈ÆØöƒĂÏÔăˆŸ;Ăȱ»ơêöƒv߈öÏÔíÁÆăà±»Ăºù׎ÿÛ·‡‘×8ç¾ÍÓ½ØĐÓÏÔ·‡‘×8çăˆŸ;k±§ô«‡“ÍjüºưÀùºơĂù×Úºá ÿ¯¶ûƠ«‡“ÍjëöµaûÙƒå¡ÛÙ½ơ»ÅÓ߈¾©Ø™‡‡Ç½³zƠ±»ßÄÙßÁ—¾½¾Å ËÉ9¸»Û«‚ ½9Ú ª ‚  + ¼9 ±»ÍÜÍÓĂº£»«‡“ÍjŸ÷Á9¥‡ơijÏÄÀĂ߈á «‡“Íjö¨¼ºëöº±̉Û×ÅØÅØÑÓ×Ỡ„Û«‚ ½9±»‹Ơ×¹Úí—G©‡¥2ßëM9¥‡Û«‚ ½9—¶ø×g߈ÛÚËÉ9–Ó¡Ô™°»À‹Ü‹ÈºĂÙÛ«‚ ½9÷ÚÛ«‚ ½9ØÛºϹÛ«‚ ½9£Çï»8¤‡Û«‚ ½9ï»»ÁĂ›ÛÅØÂƠï½€Ơ¡ÔñÖˆơ±»¡Ó™‰kß [ïS™‰kß [ïS×$ĂƠívÅØ½‘±‡ºÛ«‚ ½9½ÑØÏÔɱÛ«‚ ½9×Ơ†7§j«‡“Íj‰¿I‡º¶èÏÅÛ«‚ ½9ËÀ…ÖéÓÍË)éÛ9¥»ØăˆŸ;µhÁăÙÚ߈߈ÇØ¹Ú¿¹Ú‹ÙĂÙ́ê ăơă»ï½¡ăăˆŸ±½«‡“Íj¯ÈăˆŸ;kÑÄë©À¿»›¶é¶Å¥ÙẲù×غñÚÖçÓơĂ÷ˆûÓÑÓôêûƠå̉ ‘Æ‹ÇĂÙ»Ø߈ÜÀ¡Ô­Ä™‰kß [ïS©Ø߈«ÚçÚ«ÔÏÅÅô½ôºáö•ŒëÚèơ‡ÛÙ׳»Å¤ÛÛ×Ö°ù¼Ă¹Ú±»¹̃Á µØ›9¥‡×½ÏÅóÄăˆŸ«‡“Íjèê—Ó©‡¥2ßëM¹Ú9¥‡¹Ú÷¼¯Ơ¨º½åĂ߈Å›vñÖ…²Û«‚ ½9¹ÁÅØ©¨µØ›¾™‰kß [ïSËÉ9ÙÓ¬Äוơêψ£ØɇÚª‚ +¼9ñÇ•Œ÷Ùù¿›ôêå̉ ëö8¤‡ÍB­Ä—¶ƒØËƠ«Ô¸ƠÏÅÛ×̀Ă9¥‡«Ô½È¹Ú™‰kß [ïSÛ«‚ ½9Û«‚ ½9±»ù×½ôÛ«‚ ½9ơ؅ȱ½Û×ưÀ…à×Ơ†7§jâÄ}ÏŸ̃ëƠUĐÅÅÄ™‰kß [ïS…؃ķԯȅ¾÷‡áµȟÅÏ̉—¶ƒˆï¶ÙÚơÔÏÄÛ×°¿«‡“Íj­Ä·Å½€©‡¥2ßëM°¿©Û«‚ ½9ÅØÛ«‚ ½9ǼíơÓØâÄÿÚàöܺ•áưÀù×ĐĂ×ƠºÎ»nËƠ‰ÔÓº·Ô5€Ơ±»ºÛ ăˆŸ;߈ËֵؼصØñ›ăˆŸ;¥ÖăˆŸ;k¡»á Û«‚ ½9ĐÄêÑĂĂƠ˜Ó§Ọ́Ç ƒvăƯ£Ç™‰kß [ïS«‡“ÍjëöƒĂ™‰kß [ïS¿‰éœ™ëéå·ÔÏÔßçóÇơêù×ëö÷[߈á̃ŒÚ,‡×Ơ™‡ÇŪڗ¶ëöå×±»§Ô8¤‡¹Úźơ»óǫԣäĂȯ‡¡ăˆŸÅؙԅ¾¡%½‡߈ùơƠ’ů‰¯0ă½߈ÑÅ¡ßĂÈ̉ÅؽÂщëçĂôØYëö½ơÙÚ™‰kß [ïS³ëö³×Æ•Œ•‹Hö‘ø½G½¹Ù½Ă™ỖÄØÓØ¹Ú«‡“ÍjĂÙ™‡—ÓßσvÏÅßÄÙëÑñÚ™‰kß [ïSëö»½ö¡Èƒ¾‘ÑÄëɉ¿I™‰kß [ïSéÓ¸Úëö½È™‰kß [ïSóµƠ•¥£ä¿ÚñÆ£ôÛ«‚ ½9«Ô—»èå̉ ù×ơÄÙÓưÀ‹̀߈™‰kß [ïSéóÇÏÅçÚÿ¯¶«Û˜‰j̃ZîSÁÛ›¾«‡“Íj÷Á‰¿Iƒv™‰kß [ïSéÚƠ¡ÈéºđÆ8¤‡ĂÙµØÍġԖ¾«»Ñ¡ÔÙ×ׯÛÀ½ô…ôª‡’̀jÏÔÍġ۶‡Ö8æëÓç'±»µG½¹‰øÆ̉û¹Úëöùººß„ëöñÚ“Ơ±»çÚ¿½¹~Û“ív߈߈–ÓÙ½ëöÇÖ‹ríÖƒ¯¾é‡ă»ÏßǼëöרù׶źyÁÛ“ºĂóÔш¾ÅÛ̃ñÁ©Ç©-ùטÁ·‡‘×8ç˪Ù½±»ß»ûù×ñ¨Û«‚ ½9…»ù×9¥‡›¾ívÿ‹ÓưØÍƠù×ÛÀ¹ÚºñÁ‘«ó×¹Úëöơú¯G‹øăơ꫇“ÍjƒØ©‡¥2ßëM±»±»ÂÙÛdzëöƒàŽƒ½ׯ‡Û¯æçZׯå̉ ß»ûß»û«‡“Íj«‡“ÍjÑÓ½ëöëÔ—»Û«‚ ½9Đ +ëöăˆŸ;µ»ëö̃ˆÎÅ £‡ëö—¶—ăơÔˆöƒØ¿»ƒˆÚ×ñÓÏ̉é‰ñ5ñ·˜‰j̃ZîSăˆŸ;k¿‰߈«ÔÆáØ­ÔéÓ‰¿Iĺ²¾ÑóÍÓỞ÷ˆíÖÿ¯¶Ăºù¿¥‹á=‹Ü‹ơåÁÁƯù×9¥‡ÏÔĂÙ‰kß [ïSưÀ˹ƒv·ÔÿÇ߈ÉĂéºÂƠ½ÈÙƠ·Ô³ôÆØÇĂ·¼Í7­Ä·Ó ¥0ăˆŸ;­8Ǽ°)Ûº£ä™‡ÅØÏÔ—¶»y—Ó˜‰j̃ZîS©‡¥2ßëM™‰kß [ïS¶èơÔ¿º°” +ß%Û«‚ ½9Ͱ»ù×½€«‡“ÍjϺöÁ›ơ߈™‰kß [ïSëö©ÓÁƯÙÚ჈ùêƠßÖø×ƯÓ Ểù×¹Ú ËûỞÏÔ½€«äâºÛ«‚ ½9ÏÔưÀ‹áÙ½Ï̉έ³öĂÙµaëöüÁƠX¯¼ó¶ÑĂ÷‡½´Ø¹à—¶߈™Ôö©À½ï³2©ˆׯÆÖ«·3uU¾ĂÙ¯¾ÜñÆÛ«‚ ½9ûÓ°Ô½«»ÛºÍƠ2 Û«‚ ½9¥Ö°»ĂÙơÔùשÈÁĂȯȰ»ăˆŸ«‡“ÍjóÏÔ“Ù½ ÛÛ¹ơßϬÖóÂûƯƒvƒ×Ѳ½€ăˆŸ;kùºÍƠÙŒë*«́ơÛ«‚ ½9‡Ç½ׯÏ̉¯Èëö³»ÇÏùêÛ«‚ ½9ÇÖÛ«‚ ½9§Ó±»ÿ¯¶ôº°»ăˆŸ;ËƠ߈9¥‡ÇÖ©‡¥2ßëMƠÄÍƠ‚v ơê§Ô©ÓÛ¯¼ûÓógø×ÙÚù׺ÁỪĂ¥ÄÏÅÙ½—»ơê§Ó¤Ø9¥‡߈ù×g¹»ëơQ9¥‡ăˆŸ;ơºÁĂ€Ơ«‡“Íj߈óǶԃˆÛ«‚ ½9ÙÚÅÔù××ƠÇè¹ÚÏŃˆ̀ĂψÉË·‡‘×8çêö9¥‡éê™ëéåŽÿÚ •ÛÚª‚ +¼9óÇÛÆ™‰kß [ïSÁĂ…‡ÍƠ›¶é·Ô™ơ÷ÔçÚ¾߈ŸÖ陇 +«‡“Íjù×åƠ¾™‰kß [ïSÿÚƒ½ÑÅơlÈ»ĂÖùן\ŸƠÏÄÛºưÀñÓªÔ ƒ½ÿÛ«‡“Íj‰ÛßÁÙÚ ßƯ±»÷‡­ÄÚª‚ +¼9í̃ç÷绩ǥƯׯ™Ó©ÓÓ̉÷’ÙÚ½ô•÷¡°¿Û«‚ ½9ĐÓ £XÛ«‚ ½9·‡‘×8ç߈¯È°»ï +̃ˆĂ¼ÑØĂÙׯ“Æ߈™‰kß [ïSñ‡±»µ†ƯÓ ËlÅØÙ½•×ù×ñʃØÛ«‚ ½9ñÇ߈¼œ¿¶‰ÏÅăÁ·‡‘×8çơÄÑÓ½Ă蛾ɇù×ĂÙùܽ¼µØ×¾ù׵ș‰kß [ïS¡¿Ăù×¼ÏÔÓµ×Ă™‰kß [ïS£à©Ó÷Ú‡·̃ׯ™Áÿ+ϺÑĂ›¾¹Ú߈·Åëö™Ó™‰kß [ïSĂÈ߈¡ÔåĂ™‰kß [ïSßôµ‰ñÓççƠÙ×Áõê¼r½Û«‚ ½9½™Óí‡âˆ—¶̉´¹ÚÛ«‚ ½9±ëØÅÀĂ·‡‘×8çÏÔåÁƠÅÙÚ̃»úƒÖ–¶ŸÜ¶߈Û×߈åĂßƯíêĂăˆŸ;É€ÆĂÙ±»ùׇºÍÓ…Œ®Ó—¾±»ÏåĂĂ—¶Ù×Ó¾gÙŒë*«ù×ÁÙÚ¸ÚÏ—¶ÑØÓ̉±»‹ÇÛ«‚ ½9êöÏÅÇ»£XíØ±»¹Ú߈ƒv±»—Ó­øÁƒˆưܽå̉ ±»ƒØ‡ŒÑÓóÂÑÓË̉×¼¥º¼‡¼ëö¿‰¹Úº̉$ĂÙ½ôư“ëöï½öëÓ8¤‡ÖĂÙëöø¿ ăˆŸ©È¥ºơÔ \¶™‡éÓ­€âà8I¤‡IÖ •Ü—§Í»ƒØ¬¾ĂÙ‘«ÇÖ©‡¥2ßëM±»gܺăàñÆ«ẳƯ"ÛÄÓ̀‡3ơÔÛ«‚ ½9½Ă“¹ƯN«‡“ÍjÙÚ̀ÓÚª‚ +¼9ùêù×ÑÄë߈ºíÆ߈ăˆŸ;kÅØ߈‘×Û«‚ ½9‹Çß±»Öƶ‡Ö8æÀÏÔèºă§ ÁơÊôâơ†ÚßçñÖ™‰kß [ïSÏ̉«Ó‡™‰kß [ïS£ä¬ÖÁĂ“È߈÷Á•Œ§Ô»Åÿ¯¶ëöĂΧÔÛ«‚ ½99¥‡÷ÁÁƯÑ·½÷$™Áù×›¾«ÔñÁ È +ù×ÑÓ×Ơ†7§jÁƯ™Ô߈ó¶ÍÄï³2Ơ·Å·º̣ÂƠXÏÅG½¹å̉ ÏÅö›·Ô¨ÇºÏÅ÷Á¢ä‹÷Á¿‰¬Äº‚v ëöŒÙù×ư‡±ù1µØë×Ăº™‰kß [ïSœÂăˆŸ;¡ÔƯÓ ÁÍÄá ºôêüÓ“¹ƯN¹ÁçÔ¡«»·hÏÔ߈Ù×µ‰ùבÛÙב÷ù×â‹Ç™Óµ‰Ù¸µâàưÀëöñ§ô½ăˆŸáÛ‡¿º߈ƒ'‹Èƒˆ¹Ö¡Ûù׬ęÁÿ¯¶¥È½ơèÅÎÔ߈ר¹Ö™ôăˆŸ;½ÅØ—»±»Á¼À½)«Ô™‰kß [ïSï³2‡ï ñÚĂ߈˱»߈›ÛщÛ«‚ ½9—Œ•Èû›«‡“Íj©&ËÉ9ăˆŸ;­º×Óÿ¯¶߈¹œ˜‰j̃ZîSÙË̉óÇ£ØÙŒë*«Ï̉·Ôù¿ÔXÑØƒƒ½ÅØ÷ˆƠ÷‡ï½ÁÓû(ºăˆŸơêÍĂϼ‹Ù ÈăÓ‹ÇƠ¾Gëöù×ÇĂÉĂäÙ©‡¥2ßëM÷Á›߈‚ëöËÉ9«ÔÏÅ·§D ߈ÑÄëĂÙ¿Åëöù×ëƠUÀ€™Ó÷ÁÛ«‚ ½9ëö†½¾ûïÿỤ́Ô»Ø̀‡‡xºø¿ăˆŸÏÔµ†»ơêÜö­Äùש¼ỞÎÅ´†ÍăÁ˜êèäº÷ÁÁƯ–¾9¥‡¹ÚưÀ8¤‡×ÿÚơêơÔ߈™Ô­Ö·ÅơèÅ߈éÓµÈ̀¬HÛ«‚ ½9‹Ç¶èø×‡ù×ëÓÿ¯¶£Ç¹Ú¯È¹Úÿ¯¶±»ÓÔ£»±»¹ÚüÁ́ơ£X‘Ƭ¾́º¡È­Öÿ¯¶Ó¤çÚÀ½¹»ĂÙϼ䌾N÷ÁăÇíÿ¯¶ëö³߈Óº—ŒÉ̉ÏÔ¿ÅöÁƒ×Û«‚ ½9Û×°»íê½ Ư×ƠçÚ¡ÁÏ̉·ÔÅ»߈ăà·ÅỞ¿ñƹÚÁ‡é/×:›ÚçÚ™‹å”›ƠÛ«‚ ½9©‡¥2ßëMï½ßåí‡߈«‡“ÍjÙ½ÇĂ¼ăˆŸ;…Œ»Å±»ăà¾ăÚ§ôǺ÷_ô꿉©‡¥2ßëMăˆŸ;âˆ÷ÁÜ™‰kß [ïSêÖăˆŸơêÙÚ߈ëÚÚÆëö¹Ú±»Ǻ‹Ü±»£ÇĂÙ臭ÄÛ«‚ ½9ÏÔăÚ߈»ÁăàµØÁƯµa±»™‰kß [ïSÎÔ§Ûưˆơê­€æ̉ï‡ơêưÀƠ±¿Û×»å»ûÓ‹ÜăÁé‡ó¶™ÓÇ»Û×߈±ÀËÓ±½®ôù×ĂÙ¿Å·̣ưÀăˆŸ÷‡ßƯÏÔƠµ³ºóË¿߈ƒÁƯëö˜Ó©¼ơêÏÔ¯¾™‰kß [ïSÿ«·3uU§ÓÛ«‚ ½9½À¹ +ù׿Øÿ.Û«‚ ½9Û«‚ ½9—¶™‰kß [ïS‹̉ăˆŸ;ÇÖñÍ›¶éăˆŸçÚĂ÷ÁÙÅëÑĂï»™‰kß [ïS“Æù׫Ñ߈»Á½©‡¥2ßëM«‡“Íj߈™‰kß [ïSëöÏÅëö߈ÅơêÛ«‚ ½9ùêáƠ߈À¹÷Áƒv¹ÚÓƒ‹Ü÷ÁÿÚ«‡“ÍjñÓ«‡“Íj…%߈ƒv±»·‡‘×8çăˆŸÙƠ‘ƹÚăˆŸ߈™Á̃ˆ߈ŸÖ߈£ä#±»ƠƒvĂ¿‰™‡Æ™‰kß [ïS“Ơϼ¯È‚ +™‰kß [ïSјÓ¼Ơ´רơÄǽ¢ÇÛ«‚ ½9«‡“ÍjûØ©‡¥2ßëM½ùêưÀûØñÓÍÄ¿(ơèÅÙÚ9¥‡ÏÔ߈ưÀÏ̉ëö£äÅô™‰kß [ïS£Øù×ÙÚ÷Á«Ôëö×ܶ¸¸«Ô›¾«€üÀ+¢Çï½ÏŃ×ÏÔ»ăˆŸëöÿ¯¶àđË̉·ÔƒˆÙŒë*«‹Æñ\À¼ç̉™‰kß [ïSĂÏÔù×ă‘·Û×ăˆŸ£ô‡ÇÅÔ½€ù׿Úđ—Ø¯×ÏÔÏÅÓâ‡ÛăˆŸ;këöí—Gù׫ ©ƒ»5ÇÖ™‰kß [ïSăˆŸ;†ÚÛ«‚ ½9ăˆŸؽ›¾ưÚçØ™‰kß [ïSÿÚÚª‚ +¼9ﻤÆơÔƒÚªÔ߈ÓÔïÅ¥ˆ]1§ôƒÚ»ØƯÚ½öÁ™‰kß [ïSóÂỞ·qơêß»û‡ŒÁ¿‰©߈Æ̉ÁƯÛ«‚ ½9«‡“Íjá›¶é×¾8߈›¾ơÔ±»Å9¥‡œÜ¹ÏÔăÁ¡ÛƯÀù꾺۫‚ ½9áê½™‰kß [ïSÜÓ Ưç̃ˆÁƠăÇíÓ´Û«‚ ½9Ç߈·‡‘×8çưÀ³È°»éêÅÄÅ»©Ó±»9¥‡™‰kß [ïS‰Ôû¼ĂÙǽơÔÍB½¡ïƠ±»±»ÿÚÿ×¾ñÆ•Œ9¥‡«‡“Íj¸Úá=¼«%ù×ëöñù×ÓØ‹ë´Ø߈ÑÓ“ƠóÂùê…ÖÙ×íÖÑøÚëöºùêÎ~㋇¿ù×½Ă∠  : ù×ùן Ù-—¶Û«‚ ½9Ϻ•Œ›¾í½«»«‡“Íj¿ÿÚ˜Á£Ô™‰kß [ïS«‡“Íjå̉ ÍÍ߈•˜‹­¾¿‰î»ăˆŸ;³Ø߈ưÀÅǾŧƩǗ¶Ă«‡“Íj±»ívÁ¼›¾¾ơèÅăˆŸ;×¾­¾ϼêöăˆŸ·Ø¹Úç&Û«‚ ½9߈ÂÁËô€º™Û½ù׳ÆçÁëö™‰kß [ïSÓØ߈©ƠƒvùêĂÙ«‡“ÍjùZÏÔñÓ±»×Ơ†7§j¿‰ÅÔׯ›¾Û«‚ ½9ÂÿÂ9¥‡ÍÓÛ«‚ ½9™‰kß [ïSưÀµaÿÚ¿ÑŽ߈³̣ùדܕÈû›ÙŒë*«¦ ù×Û«‚ ½9Ûº߈èê†× •ëÚ¹ÚăàƠ§ÔưÀ¶‡Ö8æÆÿÚ̃ÄØ½ù×ĂĂ ›­±àéMí¢9¥‡±»‰¿Ié¿«‡ßl•Ö˜êèäĐÄê¿Å“à¬ăèïƠÛ«‚ ½9Åÿ‡ƒÚºÑÓ™‰kß [ïS§ç™‰kß [ïSÛ«‚ ½9ßáăˆŸŸÖʹ™ëéåïÚƠ¥ˆ]1°»ƒv¾ù×ĂƠ™‰kß [ïS¹Úö¹à‹Ç¬¾‹Ç‚¾éêÙ»Û«‚ ½9«Ô÷Úÿ¯¶…ÖĂÙơÔ×Ơ†7§j纷§D Áדƙ‰kß [ïSßÁÁ±»߈ơèŻثԱ»‡ºƯÚÁƯ“~Ÿ}÷Áç̃Ǻåôå̉ âˆ:ù×Ù½ïÚœÜ +ĐÓÿÚôú™Ø‡ µØ•Éùדư»ÿ¯¶£ÇÏžßÇÖ·Ó ¥0߈Á±»Øéºëöш÷Ú‹Çщƒˆ¹Ú“ÇĂÙâḈÛ9¥‡×ëÔ†“̃ˆ±»§ÓŸ}¿ºßÄÙÛÄÓÑӵءƯơê±»½›h½¿×Ù×ËÓª÷ÅÓ±»ƒvû(±çôôĂ»Èơ‡Û«‚ ½9ŽÅØÿÚë¼±»Óàù×ñÚƯưÀíê½î˜êèäơÛívƠªƒv·ÔơỒÇ"ÿ¯¶ó₫‡¿ôÍÄ߈‰‘ƒvçÚ«Ô…ôÏ̉ƯßÛº½ÄíêÛ×߈½ñÚº±»̉ÁÁƯ¥ÛéÓÛ«‚ ½9¸Úÿ×µØñÓëơï½á=9¥‡×½ƒvרÓÓù×ÁĂñÓÏ̉ĂÙÍÓë©ÓÏÔ±»ñÖ߈ơêñÚ±»ưÀº«‡“Íj’ÆơèÅù×áÎêö™‰kß [ïSßƯ‰¿I›Âù×ĂÙ¾ˆ¾ëöôÿÚ³ÂÿÚ÷‡±»óÔ­ÄϱăˆŸ­Ä½Àˡӽ±º·ºăˆŸ;å̉ ĂƠ9¥‡£û±¿óŒÛ«‚ ½9¶Åƒ¾‘ÛºœÂĂ¹μ¹Áëö£äăˆŸ;½€Ä³Â÷Á·Ôå̉ Ở½·‡‘×8çº÷ÁßÖÓ¼©áÅưÀ߈»ØóÇûÓ…Œ÷‡¾¡Ôí—G̀Óƒ¾‘ºŒƯ·‡‘×8ç¾ÏŦÔĂÙ½ØÛ×ÿÚ‡ơê±»߈ܥ໇ÏÔ߈¿‰÷Ú³7¿̣ëö‡x‰Û߈ª»ÍÇ«÷ù×¼ƒˆùêĂÈ«‡“Íj‡ºăàÄÔ½…n“ƠưÀ·èÍÓ—ˆ£Á‘ŒöÑÄëÛ××ÜÁĂÙïô«‡“ÍjÍË)éÛ9¥½€Æó¹ș‰kß [ïSö4߈»Øï»ûíI¯ă°»öĂĂ‹Çù×Óº¸ÚëÓ½ËÖçÚï½ÿÚĂ¼µØù×™‰kß [ïS»ˆóÇÛ«‚ ½9ËÓ́ÁÚÔăˆŸ;k÷Á…aå̉ ï»ÏÔª‡’̀jĂ¾À½ÏÔÿ¼«Ô«‡“ÍjëƠUïi‡ñ5‚v¦ÛÛ«‚ ½9ŸÅ¥ å₫ív™‰kß [ïSÙÚÛ«‚ ½9¢Ç£ØùתڡÔù×™‰kß [ïS‡½߈¥ÆăÂÏÔơԕ½‹ÇÍħôỞÙ½Ǽ߈Ô߈ø×ÍÓ߈ÏÔáÓÑŧÆÙ½ Á“¹ƯN—–ψƒˆç‡±»±»›¡³àÁƯĐĂçÚù×ÿ¯¶ơê½™‡Ñ+‹ÑăˆŸ;ÇÇó¶ïŒ™ÁÏÔÚß»ûưÀÛ«‚ ½9ÇÓŸâ䌾N·ØăˆŸ‹Ç§ß̀Ç£»9¥‡×ÑÓ¯ª«‡“ÍjûÓׯ½¡Á²Ở«‡“Íj«‡“ÍjÉר«ÓÏÅù×ûÙÚÅÁùÜÓ1Ÿ}Û«‚ ½9ÏÅ«‡“ÍjăÁù×ô›¶é߈¡ÔÍBëö§Ó Ơ £äÑÓù×Ë̉ƒvÏŃv½ÙÚ©‡¥2ßëMçÚưÀǽׯÙ½¡öÍĪڡԡÔÈĂ™‰kß [ïSÙÚÓØG½¹”ÈúïíûصØëöÇäÙŒë*«™‡ר¡ºùê—¾Ïű½½ôù×ùé±»̀¬HĂÙăˆŸ;kÛ«‚ ½9˜êè䡨¥Æ—¶ÿÂÙÚï‡ù×ù×ÏÔöƒÖ½³È«‡“Íj—Ó¯ÈÛ«‚ ½9ï³2©‡¥2ßëM™‰kß [ïSƯÓ ‰¿I€º™‰kß [ïSƠĬ¶ăˆŸ;kªd½ÄăˆŸ;©‡¥2ßëMɇ¸£Ë¿†x™ÛïÚ­ÖăˆŸ¿‰ùê±»›¡¢ÓØó×óÂÏÔĂ½±»ù¿¾¿́ùêå̉ Ïl“Ơ‡“߈óÓ«‡“ÍjÑÄ뙉kß [ïSăˆŸ;k€ë ÍÓ¤ˆ\0߈ÍË)éÛ9¥ùÜƯù£Ó¹Ú‡ºÏÔƒÚƒvÎÔË̉ÎÔ™‰kß [ïS»Ø„ »£Ø¡ç®ù×ùêøêơ$íÖ¼±»¶Ü¨Èù×ÛÀăˆŸ‡¿­ºÅÄ™‡ÿ¯¶™Áù×Û«‚ ½9ÑØÀ‡€è/Ö:Ø×ÁƯƒˆëöĂÙצÈÊÈ9£Ư—éë$‹ÈÏÅẳÓÆ™‰kß [ïSÁ¹½§ô߈Ơ·‡‘×8窻‹Ó̉̉ ƒv‡Ú†Ç½§ÔÏÅÑÓùׇŒóÂÙ½ù×̉ÏÅÄÓ£ ĂÙçÚí—GǼ߈©‡¥2ßëM‡“™Ø™×íÚ¿à¡ÔÁƯ߈ù‡Ơ¹Ú¼È›ÓÑÄë̃ˆç½ùת‡’̀já ó½øêß»ûÍË)éÛ9¥ÓØÚª‚ +¼9á 飛¾Ç¥Øù꼸)đÓźÿÚăơ‡Û‡ºëö¾ƒvëöĂÈ™‰kß [ïSíêñÓưÀÓºÓØ›‰Û«‚ ½9ÍĦ́ơꙉkß [ïS©)›¾‹ÇÑĂ—¶˹ÍƠ×ÑĂ”½l߈éôƒv߈±½ÏÔ«d£Ô“ƠÏÔ‚ §Ó•׫‡“Íjå̉ Û׋ÇÏÔÏ̉ăơ¸ÚÏԇǡÁÎŽív±»±»™Ô·ÅçÀª»‡ăàÑÓ±»ëÓ°»ÑÅßÄÙƠÙ½ƠÛ«‚ ½9ƒv˜×ù¿öÁÿÔÉ̉“Çù×ÏÄYÑÓºŽù×Ѧ߈ÿ×ÏÔ‡‹ÜÎŧÔ߈óÇÛ«‚ ½9ñÚµ½ă»ùꄽøê ÏÅÛÀÏ̉¢ÇƠÙÚƒˆáêÛ«‚ ½9›¾ø¾÷ÁÏœș‰kß [ïSùæ߈©‡¥2ßëMÿ¯¶ÍăvÅÔƒÖëöÏÔó|—¶±»™‰kß [ïSóĂÁƯÓÆÆÉ̉ÁË”™‰kß [ïSø¼ù¾×¾¯G‹øï»ÍÄÁׯ‚å×½‚vü̉¡Û•Ôăê₫ù×ù׋ÇÏ̉ÙÅëù×ñÓø×…ô·Ô‹”ù×ÓÔăˆŸ;ơÁ¼×Ë—́ÆĂ°»‡ÇĂĂ ›­±àéM½¾¹Ïű»º¡ƯÄù׿‰ïëö‰º›¾»Ư‘󶺅ôÛ«‚ ½9›¾ÿ¯¶©Ü÷‡ơÔ‘öŸĂ©Ççđ·Ô¹Ú߈µ.¥ÙÙ(ÿ¯¶éÓÙÚ́Æ•¾ỔÏÄëÓö‡ŒÙƠº™Áù×8+¤‡+Ö—¶Ơ¯¼°½ƒ÷ÁíêûѹÚĂ¼©Üù×ôơÔÏÔß»ûÛD†“µ‰»Ă¶è½«ÔñÚ߈ƒÖÏÅ߈Ǻù×ÍÓă£äÁƒàù×ÏÔÏԿ߃ØÛ×±ëØ©‡¥2ßëMăˆŸƯÓ ©¼­Ø±»ëöéê­ê9¥‡×¿̣ÏÔ#½ƠívïÚ‰¿IÁ̉½ØĂȳzÚ×(ÍăÚëöĐÓ½Ă9¥‡™‡æºÿ¯¶¿ß±»âˆ©Ø•Ư—›™‰kß [ïS߈ÙŒë*«̃ÁÏŵk¸ÚñÓùêÿ¯¶ù×™‰kß [ïSÙÚ’‰2Ô,ø9¥‡°½½ĂßÖ™‰kß [ïSưÀưÚ§çó¹Ú½‡º¡ÓÄ‹€ó#ÏÔÏÄÙÓ¹̃·ÔÅØß%­vŸÈרѶóÄ·ÅÅØ¶ë€ÑØ·ï̃ÄØ¥Ö÷‡È­Ö·ÅÇÖ†×Û«‚ ½9ÁË«‡“Íj÷Á—Ó¤Èü¦†©Çà=߈ív®Æ ¢XÿàáêóÇôÅØĂÙƒv±»™‰kß [ïS߈öä5̉…ăÇíÛÙ׃*ÅÂÓÆ·‡‘×8çñÓÛ«‚ ½9«»ñ~߈ר«‡“ÍjăˆŸ;›Û·‡‘×8ç¹^߈Úª‚ +¼9•Œ«‡“Íjù×ăˆŸ;kÁă׿8߈½ÑÄ뫇“Íj•Èû›ï»¾êöÁ‡º‘Ƈ“‡9Ó©Ü×Ơä̉˜êèäÛº³Â½¾‡ÓÅÛ×߈½¡ÇÓ¼•îƠơê©Óù× Ûÿ¯¶¹ÚÍે“ÍjĂÙ߈Åàù꺽ƯÓ ¹ÚŸ}å̉ ơÔƒÖăˆŸÍÓ߈ÉËÉ9ÀÚÄ–›¾ºÈÅØ½ÔºơĹڽử¶̣đ·Ôơº˜‰j̃ZîS‹Ç¡Ûơê“ƠéÚïÚƠºm¼ăï¿ß̀Â"ºßÖ™‰kß [ïSµØß»ûÓ¼ÛÄÓ«Ô™ÓºyʽÔY¹Ø₫DZ»Û«‚ ½9‹Ç¾»‹Çá×›¾ëöù×½ỬÚª‚ +¼9åÁÓº“ƠÅØŸÈÑÓÿÚĂƠù×ÑÓ€Ơ™‡9¥‡«ÔưÀÅ蛌¹ÚÛ«‚ ½9“Ơ߈Ù×°»…æö߈º›±»ÍĽ߈±»߈¡Á•ºëñÚÇØĂĂ ›­±àéMơêÛº­v9¥‡ÏÔÛº™‰kß [ïSí‡ÂÓŸ}g«ÔÑÓ¿¹™‰kß [ïSÏÔÛ«‚ ½9“͵aơÄív¼Ăú“ÈĂºœÜ©‡¥2ßëM›¾ơêÏÔÛ«‚ ½9ñÓ߈¹Ú·‡‘×8çÛ«‚ ½9×¾•%½€±»¿(Û«‚ ½9ëöëö¿º߈ƒ×Û«‚ ½9Å×¾ÙÜùÚ£äÛ«‚ ½9Ư™‰kß [ïSÛ«‚ ½9·̃ÏÔăê±½Ånöƒv™‰kß [ïSщñ×ñÚ³(ß„ëöëöÛ«‚ ½9ïÚù¿Ù×匿N·‡‘×8竇“Íj߈߈óÄƯÓ ăê÷Á£»ÇÖ«‡“Íjׯ½ÏÅëỖŒÚ,ï»ờ¦È“Ơù×ëöñÓØŒê*ªƠ«‡“ÍjÖÆ‰ÔÙÅë¾ÚÀŇڦÔÀËÇÎÔª»ÿÚơèÅ·Ôá ßÁ½·‡‘×8ç©ÀÏÔù×ÑÓ«»é‡×ĂÛºëöüÁ¶è«·3uUÓºăˆŸï»Ûºû“ÆÛºŽ›·Ô߈Ù½ưÆíêö™‡¥ˆ]1ÓØçÚ·ÂÑÓéÓƒv¥Ø­Ä»½Á¼€ÛÁ‡Ç‚vÛˆ9¥‡ÁĂÙÚÄ̉ÅØ™‰kß [ïS«Ô¥ˆ]1%¯È¦ÔÛÄÓÛ×Ăô§ô«‡“Íjö§ÓÑÄëÏÔ©ƠÜŽÅÓ߈±½ñÚƠ³àÛ×½ăº÷ˆïƠơÔ˜êèä¥Ü©`ĂÙ§ÆÛÄÓµØùטêè䉿I™‰kß [ïS•ŒóĂÿ¯¶›ÚÏÔív—¾©Ç·Åù×ÏÔÛ«‚ ½9¶‹ù×Û«‚ ½9ƒvµ†ăˆŸƒv9¥‡4¹à5•Œ™‰kß [ïSÏÔßÄÙ©Øå̉ ˜ÁÀ̉ +Ù½‹Ç¸Ú,×h«‡“ÍjưÀƒv‡ƒvËÇ…Ö±»™‰kß [ïSăˆŸ߈µØ½ÛÀ‡j£ØµØŽ‹Ù·Ø´aëöºˆăˆŸ;¥Æá¡ÛÏÔ‡ù×ÖÆÛºø×§Ô«‡“Íj¿è½€đÔß„½›vÓô¼ Ÿ}ëöçôŸ}­€Ó¾«‡“ÍjÏÅ­Ä9¥‡ëöçÚ™‰kß [ïSŽŽׯ€ØÄØÚª‚ +¼9X–¶ª‡’̀jª¶2tTå̉ º‚"ïƠµØ߈Ó̃߈ª»î$½ĂÙÀĂºív·‡‘×8çĂÖÛÀ­Äî»ùëçÚßÄÙ±»˜‰j̃ZîS«‡“ÍjáÁù׃½—ÓïÚƒˆƠ³ØƠÄ›¾ÙÅëỬÛ«‚ ½9˜‰j̃ZîSÛ«‚ ½9ÏÔưÀ«‡“Íj߈ÛÚ¹ ÙßÅÀ£ä…Újù×™Áù×ßÄÙ³Ơ¿‰ç̉€¾÷Áù׋܄ô ÇôÙƠׯưÀŸ}9¥‡óÄ«â˹“åÛºưu°»Åر̉G½¹‡Ú¹Ú¶v°»ĂÙɇ™‰kß [ïS»ØưÙ½ÔÓØăˆŸ;źưÁµØ¾´̣Ü™‰kß [ïSÏ̉ÏÔéȹګ‡“Íj£s°»Û«‚ ½9ÿ¥ĂÈ¿‰ÑĂÍ£äǼœÜƒˆƯơØŒê*ªÚ ¶((ĂÙ™Ôå ®¼ƒv¥ˆ]1çôëöÙ½ÿÚ™‰kß [ïS߈ÿÚ½Á¯ùף䙉kß [ïS‹Èưˆ¹ÚÁƯívÛ«‚ ½9ƒÔù×«ÔÆï³2ä̉ + +÷Á‰ºñÓơ߈Û×ϺăˆŸ;ăƠăÇíƠ¬óÇÚª‚ +¼9‹ÜÔƒ“ƠöÁƒvÏ̉©&óÂăˆŸ;k9¥‡½›Ú½¹Ú‰Ûô›¶é‘ØYƠÁơÔÍÄ÷ˆËÇßÀÅàù¿±”™¤ƒˆ¥‰ÍL…ëöăˆŸ;ÿÚ“ÇÑĂơê‚Û«‚ ½9ëö÷‡ƒÖ›Ú§Ó«ÔÿÂùê߈ÙÚù×ăà³b™‡ÜĂƠëöºë“çÅÔáêÙƠÓº»½ơ½áê¿ÅÙ‡Ï9…ˆËƠºËƠĂëö±»º₫®¶߈¯ÈÂù×ù¾£ƯÍË)éÛ9¥ÿ¯¶›¾ƠXƒà½ëö÷ÚºϺăˆŸϺàƠƒˆ™‰kß [ïS™‰kß¼›¶éăˆŸ;±»½ØåÁ߈÷‡ÓØ™‰kß [ïSÇÖ»ˆĂƠ±»ù×ÍÄï»ßÁÁ̉߈ö«‡“Íj÷4ñÖ°»™‡óÂÙÚ™I™‰kß [ïSûºÅăˆŸ;k¼Ở™‰kß [ïS߈±‡Á̉¹ÚÅØƯÜéÚ9¥‡Á˼º™‡ăˆŸ‰¿I·º‹ÜÆ_Óº¾»ÁÏÔÅÔ·ÔåĂË¿°»ŒƠåÁ¤ˆ\0đÚáêÏÅ߈º¶Ü +°»³ 9¥‡ƒˆÅƒv±»™ëéåﻫ‡“Íjÿ¯¶³à½èË‘£ Áåß»û©º™‰kß [ïS Á±»ơÔ‡Œå̉ ׯáéÚ·öÚ½½ÁăˆŸëöÇØÏÔÁ¹‹ë×øëö®È«»×¿8ù×ùׂ߈Ù}ĂÙçÚ»ç·Ø½Æ±»³öÏÔ™ëéåÓÆ‡Œ­ÔµØêö߈ûßà=ă¶ׯ—¶ưÀù×¥º§ÔÏÔ›¶éù×ñÓ¿ßËÉ9ɹ¿u±ß߈∹ڭÄ÷Á‰¿IÄÓû¼ơĂƒvü‡°ø1ơÔẳ«ÔĂÙă»Å ơê¹ÚëÔ‡̀ñ»©¼×¾Ï̉™‰kß [ïSÓÆëöĂÏ̉¡Á溉¿Iï½É6Ž™‰kß [ïSưÀăÚ«ÔÅÓƯŒ‡×ÇŒ߈ôêùƠôÎ)‹Û˜éØÁƯªÚ¿ßÀăˆŸ;˱ơ꾡ÛçơñűÈéµøơưÀẩ±»×Ó̀_ĂÙƒv÷¿¹ƒv߈¹=å̉ ß»ûƠö«Úù×éÚ£äçÚ“¹ƯNÏÔ߈ù‡ªÚ„‘÷Á½ÏÅ¢ä +›Y¥ˆ]1™‰kß [ïS÷Ùƒ¾‘«‡“ÍjÅÓÇ%¹Úëö¡»Á½™‰kß [ïSĐÄêçô߈£–™ÓÛ«‚ ½9²(àºÖ¹ ߈ñÓ—»ù×ñŒăơÛ‡x߈‹ÓïÚ«»±»·Ô™‰kß [ïSÅÄ›¾ù¼›¾ù×ăˆŸ;ÿ¯¶ÿ¯¶ơ°½ëö«‡“Íj—ˆ߈Û«‚ ½9Ăô¶óÄÛ«‚ ½9ÙÅ뛾¹Ú¹ÚĂôù×ëö¢ +ßÚ÷ÁÛ«‚ ½9ùêñÚÙÚăƠ¹u»ØÅØ‹ÇơÔÙÏű¿öù×÷å5ÓÅØ™‡ĂÙ¦Ôƒv›¾·ÅÙÚù¿ÿÚߌ“ÜÛ«‚ ½9ØƠÏÔù×ÏÔ§Ô™‰kß [ïS¹Ú»~Ѷ%ù×ÿ¯¶÷‡ÙÚ¹Úº̉™‰kß [ïSøê†äơÅÛ«‚ ½9Ù½ƒvăˆŸ;©Ü›ŸÖ‡×±»ưÚ½½¥‰ÍL…‰Ôí—GÛ«‚ ½9YƯÚ½™‰kß [ïSăˆŸ;…öêöĂىߩLùê½Ô Û¡Á¼Ơ±»Ø× +…ç̉÷Á₫©ÇÚª‚ +¼9Æ»Á‡é/×:÷ٳܣäÛ«‚ ½9¹Ú‹Ç›¶é•½÷Á‡ÇÙ½§ÓµØׯÛ½™‰kß [ïSÛÀûÓ±»÷å5ÓÓ̉ï½ù׾ţÇÙÚ­Ư߈ª»ơỐvÏÄéºå‡Á¹»«‡“ÍjÉÆÑÅ—»œÜÁƯ¸Ú ·¼Í7߈¡Ôú¹hÏÔÍÓ·ØÅÔùׯÈÁÙỤ́ĂÛ«‚ ½9÷ÁĂÖ½Ô›ÏÅŽ½€ÑÓ¥Ûö€ºåÁ§ÓßÄÙ«Ô³Œؽí—G‚víÁÅØ߈ơêƒÖÇ´†Û×ÿÚ¿ôÔX½™‡´†Û«‚ ½9ùê©“—Óù×ëöù×ï½±»̃»ú‡„çLJ“½ùêï½µ†«‡“Íj‹Üÿ„À½·Å«‡“Íj̣¶á ƠXÙ½ăơêÇØ™‰kß [ïSÿÛÄơÔĐÓ«‡“Íj¡Û’Çó¢Ǚ‡«‡“Íj¯Ûר˜‰j̃ZîSщ߈匿N–¶ôê߈á Ûº߈³È¾ÜÂÛ«‚ ½9Ïžº›¾½€ͼ¿‰áêÇÖÿ¯¶—ÖÛ×›ÛÏŃÑÓäô À¼ùê¿û·‡‘×8çÑÓ“È™‰kß [ïSÁ߈›Ơ9¥‡÷Áù·ưÀ™‰kß [ïS›¾µÈ³½¥ÆºơêÅăˆŸÁ·Å™ơß»û«Ôá ÏÄ…»ù×ÇÇÖ±¿Ñ·•Èû›³à«ÔͼÁ÷¼ƒôÛ«‚ ½9ăơËÉ9ëö¿ç½ÏÔ±»9¥‡ÍÓ™‰kß [ïSơÔơêăˆŸ̃ˆ8¤‡¶½€‚¾«‡“Íj‡“™‰kß [ïSÆ›¶éÿÜåĂưÀỞ¥Á߯ȷ‡‘×8ç§Ø®ưÀóÂ9¥‡×߆§Ó™‰kß [ïS÷Á‰ÔÙ׿‰8 ¤‡ ߈µ‰ôê +9¥‡Å؉ۣØ₫¼ ™‰kß [ïSÙ×Û«‚ ½9³Èɇ÷‡ír%ƒv©ÇÁ̉ĂÙ›¾9¥‡ỞăàÏÔç'÷Á߈¯‰¯0Ù½ƒÔ˜‡ÍÓ±¿ÏÄÙ½—º́ơª»§ÈóÂÑÓ“½ùæ¯Èëö’Û§ÔĂÙºù×·‡‘×8ç·ºåô©ÇŸÖ߈™‰kß [ïS£»9¥‡ôêôêDª¶2tT™‰kß [ïS˜‰j̃ZîSăÁöÁÏÔÏÅơÔùôĂÙáëö˿ƈƠÏÔíÙí—Gº¿ºƒvăˆŸ;Ü +ÓăàÉ̉÷Ú¿Ïß9¥‡×ăˆŸ;‹Ç³ơÔ·ÔËÉ÷ˆÙ½»|Ó¾ùÏÔÿ¯¶ûŸ›¶éµ×“¹ƯN«‡“ÍjåÁ…¾ÄÓ™ëéå³Ù»Åù×Á‡é/×:ÅÄăˆŸ;k“ÿ¯¶ßÚ½Ù×ÀƯùêÙ̉عỤ́óÇ›Yư§‡ù×™‰kß [ïSïÚù¿ÙÚ«Ô›̣ׯƠÁ™‰kß [ïSºØăˆŸ;½½ôß„ùêñÚÙÚăˆŸ;k©Ó•Û½ÔÙĂ÷Áëö‹ÇÏ)ÔÇÖûƠơÄÈĂơÔª»éê÷Úăơÿ§ßN«‡“Íj™‰kß [ïSơêÛ«‚ ½9ÛºưÀÏÔ›¾ù×¶´aï»ĂÙăˆŸ;kĂ¼¹Ú±»—¾µÈ§r°»ĐØăˆŸ;©ÓéÓăˆŸ;8¤‡×߈ñÍ‹Çâˆ:ÓÔ«ô“ÆƠưÀ™ÁÁ·ÔñÚẳ߈¹ÚÙđ¡Ô±»ó¶Ă…¾¾™‡«·3uUñ»₫ÚÜÏÅÏԆǟ}ÅÓ¥â×Ι‰kß [ïSăˆŸ;ÎŽ¾íØÅÔ¿“È™‡­Ö·ÔỞ±¢«Ô±»“ÈÑĂơêëöÿ¯¶ï‰©Ó£»¾Ù÷ôÓØÛ«‚ ½9¯Ϲ Û©‡¥2ßëM±»ÏԯȜԙ‡‰¿IÙ½³ØÑE×¾8߈ø×Óº½Ăº̣Ô»Ăç,Á|‡9ÏÅ߈—¾½‡ñ5ÑÓá —»ĐÅăÇí³ØƒØàƠ‡÷Áª¼ëöĂÈ÷ÁÚª‚ +¼9ÏÔ«‡“Íj«‡“Íj™‰kß [ïS̀ÓƒvÿÚÿ¯¶ƒv™‡“ƓȽ€÷Ú÷Á˜‡³È­½¼ÑÓ£ ±»ÙÚÍÄÛöƒˆ°» +µØ÷ÁĂĂóÇß»ûƯÚ›¾ªÔ÷Ù›¾·‡‘×8çóÇϼµØ̃ˆ³Óăƒv8¤‡×ƒÁ¿½·‡‘×8空ÇÖ́Æ߈ă°Ôë‡ÏÅÿ™‰kß [ïSÍË)éÛ9¥ƒÖÖ¾·Å£ØÆ†ø ·Å׿8½ưÁ›¾ÙÚăˆŸ½ôŸÖ ËûƯßÍ›ọ̈:Û«‚ ½9óÔËÓÇûÑŇº‡×ÿ¯¶™‰kß [ïS߈«‡“Íj‰¾ÅëßÄÙƯÚ«ÚóÂáìÄÛ«‚ ½9Óº¿‰á=«‡“Íjຟ›v§Ø¿ÍÓƒvÿ¯¶¿ÅñÓà ù×óÖ¹ÚÿÂß»û½€ƒˆƒ½¥á­¾ƒØÛ«‚ ½9ͪß»û¹Úöö³ăơĂïÚù׉½߈ĂÙ•ĂÏÅưÀÎ̉ÙÚµØß„ÿÍͪíçÀ½ù×­îơèÅăˆŸ‡ŒĂƒv™‰kß [ïSß»û̀ĂËü»9¥‡“ȇ“ƒ‡™Á€Ó÷ÁÑÄëÍÓù×ÎÅ›¹»Ø«ÔÏÔ§ô•½ÙÓÇ"Ù½éêửÏÅÙÚÛºăˆŸ;€O™ĂăàºùדƠÙÓ™ëéåÏÅ½ź³ºóÏÅù×¹Áù×£»×¾Û«‚ ½9߈ù¼…Ôù×纩‡¥2ßëMÀó̀¶çÔ¡Û׃×ív¸£8¤‡ăà÷ÁăˆŸ;kÏÅơ꫇“Íj½Œ¿»ƒÖ¶¾™‰kß [ïSáêÙÜëö•Ó:߈ỂÛ«‚ ½9¯é©ÀÁ̉ÄÓéºÛ«‚ ½9Ç™Ôä̉±»ù×÷$ơÔÛº«‡“Íjsۙ‡ƒ½ƒvơê¾ö•%Ơ­ÄµaüĂù×߈£X¡ßÁÓÅ߈ÓÙå̉ ˜Ôù×ƠÓ̉½ÊÇ™‰kß [ïS«‡“Íj½Ôé‰ñ5ñ·ê¼ưÀö›¾߈ĂÙñ¼Ă™‰kß [ïSơê¡Ơ±»Å»ĂÛ«‚ ½9›¾¡ÇÙ½ƠÁƒvë£9¥‡©‡¥2ßëM¡æëö«‡“Íj“¹ƯNáêâùױޛÁÏÅÅÁ¡Ô¹Ú™‰kß [ïSï³2©ÓÿÚƒàÛ«‚ ½9ºå̉ §ô¬ôÛ«‚ ½9¹ÚÏÔ₫ÙÚù×ÏÔź­vÁơꙇ«»âˆñÆÅØÅØ9¥‡ĂÈ9¥‡ËÓÿÚׯéÓăˆŸ;k·Åg»½¿Å©‡¥2ßëMăàñÆ·‡‘×8ç±»9¥‡ÄnÙŒë*«©ÇºÅÔưÀ߈。ÁŽËÉ9Â¾Ă ™‰kß [ïSăˆŸ;ÎÅܰ¿ƒv»²ƒ† ăơơèÅơÔívĂ2÷‡Ăºí–GÙ׃ˆçôñÓíØËÉ9ËÖ«‡“ÍjƭćŒ©l¹»ª»Æ +ÏÔ‚ˆ©ºÚºÙ×ơê·‡‘×8ç̣Â!‹Ü±¿̃½½“ƠơĂÏÔ›¾ưÀ“‰3Ơ,ù™‰kß [ïSđÙª¶2tT³Âơȅô²ØăˆŸívỞÙ½«‡“ÍjăˆŸ;ÙÚ È ăˆŸÙ½ëöÑÓåÁ÷ÁÏÔÆ߈çÅØ„ô±»߈¡«™‰kß [ïS«ÑÑÓ«·3uUáƠăê½÷ÁÏÔËÉ9ÿÚ«dŸĂ¿ß»½߈‡º·ØÏÅÂÙá “¹ƯN…׺±»ƒvă»߈ù׋ÇÏĪÔÛ«‚ ½9€ºóÇÙ×öùỡˆ±¿ăˆŸ;kỞÛ×ëB¬¼¼«»߈ă½ß»û±æăơ¿‰×¿8Øïô˜Ó„ôëöí‡í—GÙ½ÿÚ¨Ç +ÿ¯¶½ôăˆŸ;ù×ß»ûÏű»đÚù׫‡“ÍjÑÓưˆÛ«‚ ½9Ç„±»ÏÅÏ|›¾³”•%Ï̉ÍÓ½´ù³Øëö ÔÿÂĐÓ»ÏÔÅÔ›¾êÚPù×9¥‡›¾ĂًǃÔûÖ߈ÎÔÛ«‚ ½9¯Èƒvùë×¾Û«‚ ½9ƒvù×ñÚù×ÍË)éÛ9¥©Ơ »ßƯ‡ÛÚ׃vå×Ûº½³á꫇“Íj«‡“ÍjÑ+»ăÁ×ÏÔ÷¼½ñÚ½¾‡±»“Ơƒˆ߈§ôëöÙÚ·ÅĂƒ¾‘‹Ü‰Ơ‰¿IÓ¬ÄưÁÓàơê—»‡ÇÚסѷñÖ­º™ÔỞÁƯá ƒvÅÓÿ¯¶ëÚ¡Ôç̉ăˆŸ;›¾ù×ÿÛ·Å•̃ˆÄÀ‡¥ÆéJé‰Ó5“gesÁÅưÀëƒvƒÔÏÅ¥¥ÓĂâÍÍó»؛¡½»߈ÏÔ«ÑÅà±»¸ÁÏÔǺ­vëöÑÄë—¼¿‰½Á󯉯0ÏÔëöæƠß»û±»»½Â֨ϳàÁ„»¼‘Á̉›Ú·‡‘×8ç¸àăˆŸ;Í–Á9¥‡ù×÷Ô߈Ă™‡™ëéåăˆŸ;ßÄÙăˆŸ;¹ƠóǽÔưÀơÔÓ¼¼ăÚÏÅÅàódzàƒÖăˆŸ;Ë/̀Ê)èÛ8¤™‰kß [ïSÛ«‚ ½9Ñó¹Ú—»­€ôĂÑØđÖÑŵ‰“Ơ‹ÇɇËü÷Á¿Å—ÓơèÅáê߈ϺơÔ›¾ÄÔ߈ÁÛ«‚ ½9Û«‚ ½9Ïżơö÷‡ùê±»Û«‚ ½99¥‡ù×ßfß»ûÑĂÙÚƒvÏÔ߈ÁƯË̉Ö¾±»Ù½»½Ù½Åôƒ½…Û™ëéåÏÔÓ™Á¿…ÛÛ«‚ ½9Ở¾‚v¿‰«»ù×—¶§Ø9¥‡×Ä_©ˆ—¶±»߈ùê³ÈéÓÙ×£äù†Û„½±%ÅÄߌ‰¿I¯¼̉́›·Ôÿ¯¶ă½߈ñÚ¡È㻎å̉ ½óϺ™‡öÙÚÏÔÓ¹ÚÓ̉çÚÄœ«Ñ±»±̉ÙÚƒ¡Û«‚ ½9‡—¶çđ×Ă×ƠÑÄëÏ̉ĐÄêăˆŸ;ăêưÀ߈ơê±»˜‰j̃ZîSĂÙơÔ±½ÙŒë*«±”߈ÉÑÓéJé‰Ó5“gesÁÅ’Æ­v«â¼Ở߈ÏÔĂù×öˆª»™‰kß [ïSÛÀ¶ÅÚˆù×·‡‘×8çÖÀ‡º™‰kß [ïSƒv»-£äÿÚ¦ô¤ÛÛÄÓëöËƠ¹Ú”Œ Î̉ +÷Á¬¶÷ÁÏÔ™‰kß [ïSù×Å[ù×ψù×¹Ú¹Ú™‰kß [ïSÁ̉½€âˆƒø¿ºóÄ©‡¥2ßëMăˆŸ;–¾ív½ñÜ£²±»÷ڡȭĶèù×Ú½¡Ô™‡©ÿ×½ơꙉkß [ïSÏÅÿ¯¶ĂÙ߈öÅÓÇÖÙÚ9¥‡­v­ÖĂÙơèű»Ù½±Å‘ŽơèÅÿ•º‡©‡¥2ßëM§¹«‡“ÍjŸÖá ˹±»Û™ơ‹Ç¯¾Ư‰Ù½‡Œ—ˆù×ÙY«Ñ߈ß„°»ÏÄÛ«‚ ½9«‡“ÍjÛ«‚ ½9ƒˆß½“ÈÁ½ƒvÏż¥Æ¹ÚăÇí©‡¥2ßëM±»›¶éŸÑ’‚×ƯÓ ÍÓ»Ăơêƒv·ÔÍĂË̉ר‹Ûï½ÿÛùº¹Ú—ÓÑÓ±»½ăˆŸ;k‰¼º»ˆ¡ÔÁĂ·ÅĂÁ¼ÏŇŒñÚăˆŸ;öÚöÁñ„æÚéºË‰¼ÏÔØ×ăˆŸ™‰kß [ïS9¥‡ăˆŸÁ˽€߈Û±»Á•%¾ß4Ơ±»‘µØàö'ÇĂụ̂«»ˆơ™‰kß [ïS«‡“Íjׯ9¥‡ëö‹È˜‰j̃ZîSιưÀ½™Ó×¾áº߈°»½ÜĂÈñÚ«‡“Íj×\·ÔÛ«‚ ½9›Û¥ˆ]1º±»¡Ô߈‡Ç™‰kß [ïS߈ÍƠ߈±½Ÿó¹ÚăˆŸ;k̃ˆ­½¼éôù•¿·‹ö¸Ú&ÑÓ÷¼éÜă‘·Ăê·‰™×¥Æá=8¤‡öÏĽ€Û«‚ ½9ÓÁ™‡«‡“ÍjÂơ‡ăˆŸñÚ½½€—¶¨ÀÛ«‚ ½9Û«‚ ½9÷ˆ×ƠÏÔµØ÷‡¥ÂÛ½­™‰kß [ïSơèŸÚëöÍÄù׃v«‡“ÍjËÖ∫ԫdơÅá «»÷Ô™ÓƯÓ ¹à‹ÈûØ™‰kß [ïSϹÁªÈ ±»Û«‚ ½9µ¡Áăê±ß½«‡“Íj8¤‡9¥‡çÇÏÔơϼï鵨“ÈÈ™‰kß [ïSÑÄë³́ÓÓ˾Ù½›¶éù×ăˆŸ;kÛ«‚ ½9˜‰j̃ZîSÓ¾ÏÔ•ºÙ×ÙÛơê–»Ø×›¶é½­߈‘¾ƒvÏÅö߈ÙÓ©‡¥2ßëM«‡“Íj×$Ÿ‡Ç¡Ôù×ï›Ïšԃˆ™Á«Ô«‡“Íjͪ½€óÓ½ùêŸÅ…¾‡Ú›‡Û«‚ ½9ûƠ°»÷Ù«‡“ÍjÙ×́v›¾›¾ÿ ÿ§‡Ç·ô÷Á—¶®¼°»ƒvÛÚщ™Á¾ưÀ¯ÈñÓª»±»¡Ô™ëéåÈÙ6Ư‰œ·̉ ¤0̣Ăøêñӹء۫‚ ½9ª‡’̀jÛ×±»˹Û«‚ ½9ÅÄăˆŸ;ÁƯ«»±»©ÓÂĂ™‰kß [ïS±»ƠơÔçô°¿ÏÔ·§D ù×ÔơÍÓ•ÖØYÛ×ÑÄë»̉ÏÅź‹ÓăˆŸ;k¬Ö±»÷ˆ¶ùו½ăơưÀÙ½ăˆŸ©Óv÷`¾“Æ›¶éÙ‡Ï9…Í ÔXé‡Û×±»ƒ¾‘ß»ûơÔY˜‰j̃ZîSívĂĂ×Ơ†7§j¢XÓÁµØªÚ ¹ÚÛÄÓ±»ơê÷ÚơħØÏÅù×߈%ÇÖƒv“Û±¿9¥‡ƠX‘ÆơꌾÓÅß»ûׯ¥Ưå̉ Û«‚ ½9ă¶±¿É̉ÏԳܣ̃ßÏÏÔív߈ƒ¾‘ÏŹÚI½Ă߈¥º«‡“Íj­ÖÏÔ‚vé"«‡“Íj“Ơ÷Ù«»Ỗˆ¡Á§ôăˆŸ̃ˆ8¤‡ÖŒ¾ù×߈¹¼ª»ê麋ƳÜƯ ÿ¼…¥¯È߈§ôË̉ÓØ—ä‹Ç“½›¾Ù½‡Û߈±»߈§ô‡Ă¿5Ïž»£»½û̉°»½±ºù’Á¹½ÏÔƯÓ ™‰kß [ïSĂƠÓµO›¶éψíêĂ¼߈‡óÔ÷ÁÏÔ‘%ơêÛ¹¿‰ưÀ¸Ú9¥‡×ËÇ•ÜÂÆ:ÙÅë©Ü›¹ĽĂƠưÀ·ăçôÛ«‚ ½9±»÷Á÷Áö·‹щ™Á߈ÏÄؽ“Û«‚ ½9µØíêëö·#±»áêæôà ßÄÙ×ƠØŒê*ªáêëöçô™‰kß [ïSñÙ›¶éĐÓ9¥‡¡ÈĂ¼‹Çƒv‹Ç·Ô¦È ¹Ú­¿ö¾Å­ÛĂÙÏܘ‰ j ̃    Z îS ÜÆñÚ§Óÿ¯¶ăˆŸ;ß»ûÿ§âÁ›v«Ô©ÇÿÇׯ«ÔùÚÛ«‚ ½9«‡“Íj¿ÑÓ¼·Ô×¾º·ÅƠ«‡“ÍjóÔå̉ ÁƯ‚Ø¿‰ơêÁ¹á­ưÀר¥ˆ]1¿Ë¿ưÁ™‰kß [ïS±»èÚçÚ߈‡ëƠUùê¹Ú¡Áö¼óÂĂÙÁƯơÔóÂăˆŸ;9¥‡ƠªÚ™‰kß [ïS«‡“Íj«Ô‰Đœ¿·Ø©À‚‹ÇÿÚàˆÀ0p…ØÏÔ9¥‡ơê˜ơ߈Û«‚ ½9ù×ñ×ëö‹ÇƒÖú’·Ô¯ÛÏÔưÀµqÙ½­Ä¹Ú­ÈƒˆÏű»ù׫ÔÙƠÖºëöµØ©‡¥2ßëMÛ«‚ ½9í«Ñ™‰kß [ïSù׋ø°”9¥‡•¾­™Óí—G¥Ü”‹œHƒvÛ«‚ ½9†ºÍË)éÛ9¥•ÛĂàưˆ“ÈÙڻط‡‘×8çùêÄÓÙ½Ǽåº•ăˆŸ;k£ä½™‰kß [ïS¹Ú·‡‘×8ç®Èù×…öœ‰¾Iù¿‹^™‰kß [ïSÙ×ÿØŸèÓ¦щ™‰kß [ïS©‡¥2ßëM9¥‡·Ô߈Óµ.¥Ù§Ï¡´·Å‰¿Ì½ƠÑÓ‰»ß»ûªÚ̀Ê)èÛ8¤ù×½ÁăˆŸăˆŸ;½±»±»÷Á™ô¿ÅÏÅÅѵاô—¾«Ñ«·3uU¹ÆÖ‡Ç” +áꕾó§Ơ©ŒóÇ¡”“º¤Ûèºë¼±»º«µÏħƠ™‡¶¦ÈăˆŸ;áêÏÅÿÛưÀóÇÿ¯¶§ÔÍÄ—Óùê£ÓÓº‘±ăˆŸ©‡¥2ßëMÜù¿­Ø›¾÷AíÜ™ëéå¡ÁÛ«‚ ½9ôÛ«‚ ½9߈Ùڭ֯ȋÇß»ûăˆŸ;©À°»ëđ·ÔêÚ߈©¼ÂƠĂÈ´Ø«‡“ÍjôĂÁ‡é/×:ưÀùêƒṽÅ ÀĂÙŒë*«9¥‡×½€™‰kß [ïS·uöォÔ߈ƒv™‰kß [ïSÏ̉ívø×•î©‚½§Ó‡ºưưÀÅ¢»ƯÙ뼃vơèÅƠÁ÷Á´Ø³đÁ§ÛµØ·§D Ùëöß¹©Ø´aơÔçmÏÔáÛÛ«‚ ½9å̉ ÛÄÓ‹Ç—¶—ˆÁ¿́§Æ«»9¥‡íêÅÓù¿±»÷‡̉Ø9¥‡ô½ëöÅÓ»ØăˆŸ;k9¥‡×«‡“ÍjçÚ߈꛾å̉ ¾ơĂăˆŸ÷Áщ™‡Ơ ÏÔ‹ÇăˆŸ;Ñó߈ÛÀưÀ»Ø¦Ó€ëă»êöĂô•×ÏÅăˆŸÙÓơêÇ̉ÄåØĂÙ•ÚÏ̉ăˆŸߌÛ,é‰ñ5ñ·©‡¥2ßëM–Ø«‡“ÍjµĂơĂ麻»¹Ú×Ơ÷ÁӨ󹮋Ü߈Á½ơº¡ÈÔÓÿ×½¸ÚăˆŸÙ½ŸÈ³ôѶ…¾íº÷/ĂÙÏÄ߈µØÏÅÑÓÆ±»—¶·ăµØ¸»¡ÔƒÚÇÖûƠ÷Á°»Û«‚ ½9ùׄnưÀ³ºó¹£ÇÖÁĂËӣǧÔ÷$£ƯÿڵؿÅÏŇ“%ÏÅöÏÅëö‡çÚ¸Ú»ÅÏÔù×°»߈±qÅĂÚª‚ +¼9·Å›¾¶ÔÁ¹«‡“Íj̣ÇÏÅ§ÔƒĂµØ·ÅµØå̉ »‹̀Ó»‡›¾ÏÔ™ơµØăˆŸï³2×¾9¥‡ñ˘‰j̃ZîSưºÏ»™‡Ûº™Á¹~±»Óؽ‡ÁƯ‹È±¿ÑÅ™‡Ù×¥ØƯÓ ߈§ÀµaïºÅÔ¥ÖỞ8¤‡ׯ£ÇÅÄ›¾éܯù‡ÇÖ¹Úù×åĂêÚơ'ù×üÀ˜êèäăˆŸ½ôÛ«‚ ½9Å¥ƠÔÍÓ9¥‡ĂÙ¾ «Ôă®Å™Á˜‡¥ºăˆŸÛ«‚ ½9¾ß¡Ô½Èöö·ÅÙÚĂµØ¡ÓËÇ÷ÁÅØ‹Ü‡ƒvÿÚº‡ĐÓơê»Ø߈Óëö¼©ƠĂĂ ›­±àéMƒv¯×‡Œ™à©Ó¹ÚÔÏÔ‹Ü„îƯ±»Û××¼ĂÖ“ƠÛ«‚ ½9•åùêư“߈€ÇÛÀµađÓê$¢ÇçÚÇÓºÁÙ½±»ÙÅ뫇“ÍjϹ“º©Ç±âÁƯÏÅßÄÙö¾™‰kß [ïS±»’·ôơâ©Óù×Ơ¥¹Ú›¾߈‚ˆÏP½·‹¶Ù½ù¿ëÓ±»ÏŵØÛ«‚ ½9™‰kß [ïSư{ÇÓư“à¤<ư–ˆÇÖ›¶éøêº¹ÚÍË)éÛ9¥«‡“Íj÷ˆǺ‡ÚÙ½™ôÛÀ÷ˆ„—ˆ›̣ăˆŸ;ÍƠƒˆă»ïÚƒvÓÆÛºĂÙçÚưÀ‡ßÁ±»̃ˆ±»¥‰ÍL…³Ü““½ăÇíå»́ơÄƯ¡%ù×Ô÷ÁßÖYăˆŸ;¤Ù©‡¥2ßëM—¶ỂœÂ÷H¯¾₫÷ÁĂÙ±»ơÄÙ½Û«‚ ½9¬”·öÁ½̃ˆŽ×Ó«»­¥ÈÛ«‚ ½98¤‡éêºÅ߈›¾Ǻ‰y¿|ù×çÚËÉ9™‰kß [ïSỞăˆŸÙ½ׯ±»߈«‡“ÍjñíÈ™’÷Á™ơâˆ;8¤‡×9¥‡߈8 ¤‡ ×â߈‹Ç‹Ç«‡“ÍjǺ߈ËÇ“¹ƯNñÓÍÄÎǺvÏŧ‡ïÔùô¶‡Ö8懌ÓÓÏÔ¹Ú߈½́v‰¿I¿ÅÛ«‚ ½9Û«‚ ½9¯Èô«‡“ÍjíÖù׿‰¡Èù×ÁƯÑÓƠ“¹ƯN¢0³ëöĂÈëö̉ˆ”=8¤‡×ÿÚÇÖÏű»ĂÙÛÄÓùæƠ×÷ÁƯÓ ˜‡µØíÖÛ«‚ ½98¤‡ÖƒvÙ×óÇù×û ơꙉkß [ïSÛÄÓöñơê‚v «‡“ÍjÛ«‚ ½9ơÔ§ăÁ¼å̉ ËÉ9“Ơ£ƯÅØƺ‹Üÿ¯¶‚›¾ÏÅÅ¡Ô׿8êöăơơĂôß„…ƯơĂÙƠ·Ó ¥0ơĂăˆŸ;ơÔÅÔ£Xƒ¾‘Û«‚ ½9ơı»±»‡íưÀñƠçâûØ£ØÀ0«»ÍÓÙ½‹ÜơêĂ ¼Ô÷ê·‡‘×8ç·‡‘×8çƒv‹ÙgË̉›¡ỞÁĂÏƯ$©¼ßÚÏÔû±¿©ÓÛ«‚ ½9ƒvơ$Ù¦ÆñÔÛ ÿ§‘Ӣ䦺 ¡ăˆŸ;±»ƒvÍÓÏ̉°È́½ôëÚëç½€›¹™‡ơêñÖéê Ơ­Ø™Óµ.¥Ù›¾÷‡÷Á́vÏÅ·Ôº»߈ëöÅË¿ư­ÛÖÚ˜‰j̃ZîSùêŒ₫÷Ú½ÔÇߢÇÙÚ±¿©&ß̃߈±»ù×Ë%‚vñÖ½ëÏ̉åÁ­R±»ùת‡’̀j«‡“Íj”&å̉ ¹àơÔëöóÂ9¥‡É›¶é­ơ½¡Û¹Ú»Á½÷Á÷‡¹ÚµØơ»˜çôÅÓˆ±¿™‰kß [ïS߈߈¡ÔÅ©Ơá°»ÊÇ÷‡–ØăˆŸ;ûYÎ9¥‡ăˆŸÏÅÓØ±»Ö ăˆŸ;ĂºÛ«‚ ½9á=ø×‚vơº‹Ç¹Úă½߈™‰kß [ïS‘ÖưÀÛ×Ơ¾Ø”½ơĂ«‡“Íj«‡“Íj™‡ăơù×ÙÅëËÓß»û“ƠÁơÔ›ĂăàߌÛ,ÿ¯¶ăˆŸ;íêöëö8¤‡Ö›¾óÔ8¤‡߈߈Ù½ƒ¼ï‡Ù½Ù½ƒv×à ăˆŸ;ËǧƠ÷Ù¼™‰kß [ïS¢ä³ÂÛ«‚ ½9߈†Œ + + +μÑÄëÓæ½߈½·‡‘×8ç‡ÚăˆŸ;½€ÎšLJÚÑ·­đÁ¿ß±»Û«‚ ½9¸ÚËÉ9‚v“ȇ“ù×ƯÓ ăˆŸëö›¾÷ÚßÄÙ¹̃ơÔ‹„È0„™ôơÔăÇí³ÈöÁÏÔ™‰kß [ïSƠ—¶±»™‰kß [ïSÙ½ëöëö·ôƠºm߈™‰kß [ïSÛ«‚ ½9«‡“ÍjƒvÅ¡ÛÔ¾FÙ½³ÄÓ“ƠóƯÁ¼ùêÏÔÛ«‚ ½9™‰kß [ïSÛ«‚ ½9ë́™‹¿́™‰kß [ïS‹§ôơéĂÙ¹Úù×ѶÍÄÑó°½”Èú“ÙÓ8¤‡×½¡È›¾¿º°»Å‚+܃v廋°¡ÈÅÓ¡Áăơ¯G‹øë̉®ĂkªÚăˆŸ;kÏÔëöX™‰kß [ïS詇¥2ßëM›¹³Â¹ÚơêáöÙÚ Áÿ§½Ô߈—Ó«‡“ÍjÙ½ëö›¾ËÖßÄÙùôâˆçô›¹ă»ơê­ºÏÅçØå̉ ¾߈«‡“Íj¥ˆ]1̀ÓÚÚ‰ÁѶöÁßÄÙËÉ9¶‰ÇÅ™‡ׯ߈ÂÈÁå!™‰kß [ïSăàí—G°¿ ™‰kß [ïSă»ˆơê߈ưÀă!±»‡ºÙ½ÍË)éÛ9¥ù×ñƠ¶£ßÁƒv¾ä̉™‰kß [ïSœÂ§Ô÷Á½—¶Ϻ™‡§Ó±»‡“½‚v¡Á³z·Å±»Û«‚ ½9×Ü©½Ù†ù×́ºÅăàƯÓ ¡Û«‚ ½9í+§¡hÏÅ¡ÔßÁÊǰ»Û×ñÓËLJñ5ÍË)éÛ9¥ËÉ9ÏÔăÁÑĂß»û§Ô߈ù×·¼Í7ÙÚ³̣™ô¦È!³zù×Û«‚ ½9³Èƒˆáê¿ô—¶•ŒƯÓ çÚ½0Ο¼Ë̉˾œÛ Üó*ơèÅ¥ˆ]1ơÔϹ߈¹ƠÑÄë§øĂ±»·Ô‡ŒưÀñÚ™‰kß [ïSӺ߻ûéºßÏưÀ†ö©‡¥2ßëM¼Á¹̣¶«Ô§ÓÍË)éÛ9¥߈¾ ¾¾¬¾°à¾¾èM¾µçÁƒ½¿»„ö£ä÷£ÉẮvÙ½߈ï½ơèÅëö—ˆµ%²°»áÅÙ½¶‡Ö8æç̉8¤‡§¢ù×™‰kß [ïSßƯ¡Ơ¾ë‰‰¾±»߈̃áê±»Û«‚ ½9±»ÁĂ ËûÛ«‚ ½9«»ËÉ9‹ÇÙÚùœÏÅçÚódžŒù×±»«‡“Íjƒơ™Ô«‡“ÍjÓÅï»™‰kß [ïSó¹Ù½ÿ¯¶±»°»·ÈªÔ’‡Œï»û±»ù×ÏĽ™ơẳ¡ÔñÖñ×—¶™‰kß [ïS凫‡“Íjëö™ÔưÓóǃàŸ}¿Ó½Üß»û•Çơê‡Ø»Ø›¾Çù×Ûº߈ÍË)éÛ9¥ƒ½±¿ÙÚ›¾ǽ·ÔƠ¾G±»ÿåöĂË̉µaÛÀƒăơĂÙáƠ¿ßÑÓó¶Ă$çڻ؃vÑó«Û«‡“Íj¡Û¶‡Ö8æ±»÷Ááê­Û«‚ ½9³ëÓă»߈ĂĂ»Åù¿ïƠƺăˆŸöÁß%°»ù×ơñ»ëÓÏÔăàĂÈ«‡“Íj›Yª»ôêƠ¥º«»ÏÔŒ¾˜‰j̃ZîSËÈ9̀ÓÅÄÙÚµØÍB›Á‰ÆÛ«‚ ½9±»Óśں¡Ôíơ₫™«‡“Íj9¥‡×ĂÅôƒvÅÓïÁ™‰kß [ïSơễódz½»Ø߈“È—ˆăơëöăˆŸ;«Óÿ¯¶9¥‡åûØáßëöÅàơÔ×Ơ†7§jÛ«‚ ½9™‡·Ô»ô߈߈öăˆŸÁ̃™Ô¿ßÏÄơêÂȽ‚vùêñÓû(—ÓÁƯù×ÜÁ¹°È‰¾ŸÈ±»…n»Úß›vŸ\Ûˆ9¥‡×ʾAà°»ëÓ“ÆÏÅăˆŸ;kù×߈߈߈çÚ‹Üơ雾ŻáêÛˆ°¿çô§·ÅăˆŸ;kÛ«‚ ½9đÓÏå‰Ûëö½ÙÚ—¶™‰kß [ïS«»ưÀ£äƒvÍ­Hƒ×Ơ¹ÚöÁ¦ÏÔç̃’¹ÜNÇÖ8¤‡Öù×ô±»ÍÓ÷‡°»‹¿Û«‚ ½9¹ÁÙŒë*«±»ÅóÂĂÙÍÓ™ôåĂ¿è«‡“Íjëọ̈Ö$åĂÏÅëö½"÷ÁÙ̉ÅÓ‹Ç‚ñ¨ÛºÙ½½€«‡“ÍjơèÅ­Ö«‡“ÍjÚûƠ߈ù׳‚Î̉ơꕽåν€Ư%ëö›¾‹Ü™‰kß [ïS²›Ú‡ÛÓÆĂÈñÖƒvù×ͼÎ̉±»¾߈ù×Îêö©¼î²2 Ù½§Ơ½ƒvÙڧƼỐÆĂç½¼€ƒÁ×ÏÄơê–ÓÙ½º°»ù×·”ó‡ÛÖ¾Ă£¡È÷ÁËÉ9¨Ø±ôÏÔƒ×ăˆŸÓÁ«ÔƯ‰åŒ¿NµØ³ƠÏÔå̉ çÔ¡½Ôöù×Á¹—¶Û«‚ ½9«Ú́Å™ÁÖÿÚĂÈÄÔÛÄÓ³ Á÷‡°»ëö¯ÓăÛù×ÛÀë̀ÑĂ×¾×Ơ‚vơĂơêô¹ÚºÏÔưÀÅÄÑĂ‚×÷Ú‡Œ·‡‘×8ç纘‡›¡ûÙơê¥ÆÑĂ⽇™àéÚí‡ù×÷ÁñÙÙ׻ŨÉĂƒvÑÓÓÅơê­Ö¹Ú‚vŸ}Î߈«Ú—ÖƒˆÿÚ«‡“ÍjÓÆ•ŒßÚ›¾ơ۵طº9¥‡Å؉¿IĐÄêßÄÙ­ç™ô½ưÀ¿ôÑæ߈ß»ûËƠ÷‡ïºëơ±»™‡9¥‡¼߈ˆÎÚ±¿ÁÙ9¥‡ăˆŸ;̀Ó£Ç÷Û«‚ ½9Ù½¹¶¡ÔăˆŸÛ«‚ ½9«âöĂ¹ƯºÚª‚ +¼9½œ·̉ ¤0ņŒÙ½ƒ½½YơÔƠÚ±»Úª‚ +¼9ÁèơÉ̉߈ǧô¿‰µØ‹Ç÷ÙùêÙ½‰¿I—Ó«Ô±»Í­H‡Ç±»ÙŒë*«9¥‡ÿ¯¶˜‰j̃ZîSÖ ±»ù×å̉ ÷Ö±»™‰kß [ïS߈«‡“Íjí—GÁ߈ÀÅÓù‡ßÁ·̃Ë̉§ØßËÇÅ]™Ó¯¾ù×™‰kß [ïS±»˜‰ j ̃    Z îS ÆØ÷ÁϺëö.ëöûƠÛÀƒˆ·¤ˆ\0…Öå‰ÁƯñÚÛ°™ëéåă‘·ĂÙ©‡¥2ßëMçÚù×ÙŒë*«½ÔßÄÙÙÚɇÇÏ-¡Á™‰kß [ïS¸Ú˹óĂ­ÔăˆŸ߈ÇÅԣؾáùꀼ‘Æ̉̉ûÈăà¡ÁƠXщ‹Çµ†ƒv$âºÏ̉¡Û•Œ½©Ó«‡“ÍjÅ»׸ù×½ưÀ• Î̉Ă¼«Ôƒvµ†ÑÓ¯ÇØË#ëöăˆŸ;k¿‰«‡“Íj·Å˜× £‰µØêöÏÚ߈¶È‡º¿à½ó¹±»…»½ß8?¤‡?Ö ƒv¾́Á™‰kß [ïS÷Á‡½¾Ù½ăˆŸ;ÖÆƠ½ïƠÛ×ÍË)éÛ9¥ù׫ ©ƒ»5™‰kß [ïS̀Óùוî÷Á¬Ö9¥‡™‰kß [ïS½Ô™‰kß [ïS Ëû™‡¯×½éÓÏÔ»ÅÏÔù×¾†ºÙ×ơÄÛ×9¥‡¸Úÿ¿‰·ôñ¿Û«‚ ½9ÿ¯¶ƒv½«‡“Íj™‰kß [ïSûÙŸI±»á ½ëö«‡“Íj¸ÚÂÙ퇀ǿô·Æƒv—¶ï᫇“Íjå̉ “Ỡ„ËÉ9ƒv†ÇỞƒv©¾ÏÔøêׄÁ̉ÏÅƠƒ×óÂĂ÷ˆ¹Ú‰¿IźưÀ ÜŸÅÏÅ«‡“Íj÷Á߈ÙŒë*«ºñÇ߈ÙÚöñ1¡ÛƯĂȇơêºÓ̉Ơuív…»“¹ƯN©vÔÓí‡ÎÅ¡ƒÙ½›¹Ë̉ưÀ«‡“ÍjĂÙơ»Ơơ‰Û8¤‡›Úœ‰¾IÛ×¹ÚùêÑÔÓ5“gesÁÅơÔÛ×ÖÆ«ç̉ÙÚØ-‡Ư«ỖµØëöæÚö˜‡ÄÓ¹ÚÇÖĂÈ–¾­ÄƠăˆŸå̉ µØßÖêơ™‡Û×ÿÂÅÓĂÙ¹Ú°»·ÔƠáùêƒÚ¹̃ºËǯ ÏÔ´ÀÂÓûƠăˆŸåŒ¿Nÿ¯¶éêơê¹¼åÁ÷ơ‹Ç÷ÔÛ«‚ ½9¥‰ÍL…•±³ÛÀëö«»Ù½±»‰Û«‡“Íjëט‰j̃ZîSí™ÁÓºăˆŸ©ù×®ÈăˆŸÑĂơêͽÙÚµºÔX…năÚø×‡ºèê8¤‡ßë™Óÿ§߈¡Ơ·‡‘×8燡ƠỞ™‰kß [ïSùסԶű»ăˆŸ;‰Á¡È§Ô©Ø±»ƒvƠ©)É6¾¡ƯÛ«‚ ½9‡º™‰kß [ïS™ÛÛ«‚ ½9ÙÚ÷å5ÓÓº‰±—ÓëÔ°¿ăˆŸUù×߈÷ˆ½¥́ëöרÛן»ƒv‹ÇŸ}¼Ñ橈÷ÁÅØÇÖÁ̉°È­ÄͺؽÙ½ÁƯ¦ôÎ̉™‰kß [ïSÛ«‚ ½9é§â•¡Ç±»³ºó߈ÏԜܡÁăˆŸ;ăˆŸ;¢äç9¥‡Î!߈‡ºù×ÍĂçô­ÄƯÀµ†›¾½ßÁƯ§‡ï½ÇÖ¡Ô·ÅŽÛ«‚ ½9«‡“Íjéß…ƠöÁ‹Û³ÆÓ¾£äш­Äƒ¾‘«·3uU‚vœÜ‚v“ÆÙ½«‡“Íjù¿ÆÙ½ÿÂ߄߄©‡¥2ßëMÁ¼˜‰j̃ZîSơê %ö±»Ù½Û«‚ ½9ăˆŸ;™‡̃ˆ ̃»ú¡ƠûÖ£ ÔĐÓóĂÛ«‚ ½9ïôë§«Ô«ÔÛ«‚ ½9¹Ú«¼ï»¯+“½ÅÁëö߈ĂÛ±»ÁÛĂÙÏÔăˆŸöĂÙ«·3uUËÇ뼋ÇóÓùë¼Ø +©‡¥2ßëM÷Á»ØăˆŸ;áÛ™Á¥Ø«‡“ÍjƒàÏÔù×ׯù×ÛÄÓ÷ˆ£äẳÖ¼µ†«‡“ÍjÛº·ƒ‘ÏÅÙ½‚Ú·Åö¿(éºÿÚăÔ×ƠăˆŸ;™̃©ÜóÇ¡Ûó“Û«‚ ½9½μăˆŸÏÅû=§ôÑÓĂù×å̉ ÏÔÛ«‚ ½9­ÖĂÈ©ÓơêÏÅ߈‰ÛºyïÛ«‚ ½9ö߈»ˆ‡ŒưÀơê ÛăơăàƯ$çÚ­Û«‚ ½9‡Ç™‰kß [ïS¯È‚vÓ¼’ŸÀ‡€è/Ö:ù×­¾²º̣½—¾ưÀÍÄëÚ©¼£»˜‰j̃ZîSƠ· ùæ³ÙÚÁăƒÚƒÖÁƯÙÚ±»·ØÊÖÛ«‚ ½9ùêÿÚçôŸ}ùוŒù×ÑÅ߈‚vÇÜơêŽĂµØÏÔ £¿ô¿́ÑŧºÑÓÁƯù×½€ÏżĂẰÓU˜ơ߈¡ÔÅÏ̉¾‹Ùóǡș‰kß [ïSÙÚ™‰kß [ïSÙ½ù×¶è÷ÙăˆŸ߈Ű» ½€™ĂçÚăˆŸ;‹É0½Z‹¥ËÓ½Ô9¥‡èáĂ9¥‡±»­Ä™‰kß [ïS¢ÇåẮ–G.ÛºĂ¼«‡“Íjß»û́v®Gø¦ƠùÔơèÅëöù×½ÜéÓƒvùêËÉ9ÙÚ߈éZ°¿›‡ăßñÄ©Øñú©ÀщÏ|±»«·3uU­ÄÙ̉ÙÚ›¹«‡“ÍjÂZƒv¶%%ßÚÓØưÀ«‡“Íj½—¶û̓v‡º8¤‡©‡¥2ßëMºƒÖ߈ÓØûƠÅÏ̉ù׳ȫ÷ÚăˆŸ;•½߈ŸÖÛ«‚ ½9̀_å̉ ½­Øù×ÓÓŽÛ«‚ ½9µØ†½шÿÚ¾ÔçÚ¶ÿÚºªÔ÷‡ư§‡Ù½ÙỴ¶›¾ÑÓ…Ö±¡Áëö·Ô×Ơ½€éê¯ÈùëÛסǽ€§½Ă½ØÅÆ”¾»ô‡ÚÏÔ₫ă¼˜êèäôÛ«‚ ½9Û±‡“ăÁÅÛ×ÓºơÔơê°» +Ù½é*Á¼ØåĂ“È߈öơÔ·Ô¯Ô£»ơêñÓíê™ÔăˆŸ;ï½ÏƒvưÀăˆŸ;ÙÚ¿ß9¥‡ă‘·±»å̃Ơ¼ׯ«Ù½ÏÔÙ½ơÔùê5ޕ֛‰߈âÛº—»ăˆŸ÷Á«·3uU›v½ÔÏÅ™‰kß [ïSû»«‡“Íj±%±»™‰kß [ïSú¶«ÇỞ“Ơ·Ô߈ă½±¿µØÑÄëߌÛ,…ƠϼưÙŒë*«½ơêƒvÁÚÏÔ÷Ù‡ôêçÚ™Ă¡Ùä̉  ߈ĂÙƒv9¥‡×¿ßÛ«‚ ½9麧ӟ}÷Áï½ÅÓ«‡“ÍjS«»£ØßÚÏű”ƠX¾ù×ăˆŸ¹ÚÀ˹Å·ÔÛ«‚ ½9ù×̃ˆÁĂå¿Å§Óƒ¾‘¿¹Ó¾˜‡²Â­ô—Œ‹ÈÂÓÑÄëƯº±ëØÏÔƒv›¾ÅØÛôÏỒÓ±»¸Ú³ ±»£ÇơÔË̉ªÓÚ×ĂÙ­Ä‹»ÿ¯¶ÙƠÏÅ›¡Û«‚ ½9—¶˼ÁÛ»÷ÏỖˆ’ܲØưÀëöƯÓØÑÓ«‡“Íjå̉ ߈ÉĐöƒv߈ô» ׇ‡ư2·ÔéÓ»Üù×±»g¿‚ƒƒˆív˜‡ÑÓëö·ÔăÁ“Ç‚àƠø×›¡ơêÁ×çÆÑÓר’·‡‘×8çƒØ™Á̀¬H‡x½ôÎ̉ÉŒÖÆ³È8¤‡á¨Ûôº«‡“Íj¼Ø©›ÄÓÙ½™‰kß [ïS߈ăˆŸ;kăˆŸ‰ÛëöµØ9¥‡×‡É̉ψ›¡ëöăˆŸ;µØœÁÍïÑÓ£ÇÅô¿‰£Ø߈µâ•¾ Á‡Œ¯¸߈ăº÷‡ÅԧƱ»ơêÇ̉Úª‚ +¼9ù×™‰kß [ïS£Ø¼Ô±»—»̀Ă÷ÁëöÙ½¤ØÉ#‡߈ăÇí—ˆûÖ¹Ú9¥‡™‰kß [ïSÁÛ߈ù×ÜÓ Ñᇘ‰j̃ZîS·ØĂÙÂC›¶é̃ˆ‹ÇÏÔç̉óÂívÑÓù£å̉ ·ÔÿÚưÀÛ«‚ ½9–¶ø×ù×½ô‘g±È½¨¼ăˆŸưÀ«Ôµ!ÅÓÇĂƒê›‰±¿•îÏŹ¶ÏÔ߈ơÅ⨅ԙ‰kß [ïS±¿ñÓÈ«‡“Íj߈ÿÚ°»ÏÄÛ«‚ ½9‡Œ¼ÔÏ ÛÔ߈Ѷ̀ª€ÇơÔ¨¼,Û«‚ ½9½Ô—¶ÿÚÿ,«â½ÏÅÛ«‚ ½9Í,ÍË)éÛ9¥ưˆ±»›·Ôùê½½ÁƯ“Ơ½Û«‚ ½9±»ÛÀö½€ơÔÏÔ‡º¹Ú«‡“Íj™»ïÅÀĂ“È¾Å‰°̃ˆXÑÁăˆŸÓÅÏÔơêăÁ‡Ú£q멼ÛÀÏÅ₫&‡Ç÷ꛇ­ØöéÓù×ϼ°½ÁƯƠX߈°»ăà«·3uUăˆŸ;‚v×$ÅÄ÷‡Ó¾ăˆŸÓØ—ÓÀỪªÙ×9¥‡÷ˆ¨¼­î™‰kß [ïS߈™‰kß [ïSÏÔ9¥‡¯¾çÚ«‡“Íj·Ô™Ûƽ€ÙÚơ›9¥‡߈ùꙉkß [ïSçÀºß»û†Ú9¥‡£Ø³Â‡Ú™Ø™ÓÛ«‚ ½9ËƠ½ơÄ“Ơ߈¿ôéÓù×­ÄË難“ÍjƠ₫®¶úƠÏÔƒˆ—ŒËÖ±»§Ø§ô¯×™‰kß [ïSª-Û×›¶éÁÏívù×ƠÅÏÔ›¡á’¹ÜNíÆ‡ÛÙ½߈ÅØ³È«‡“Íjù×ºÚÆJ³à߈ï²2 ƒÖÏ̉¹Ú«‡“ÍjƒÖ̃»ú·‡‘×8熌û:Ǽ©Øøê ƒ°»Úª‚ +¼9Ă¼ù×ÓØ«»¡Û½ô±»«‡“Íjºï½¥ˆ]1¹µ«‡“ÍjÏÔư“YƠÖ‡À¼7Àù×ù×±»8¤‡ÏÅ·‡‘×8çù×ù×ùê¯.ÛÀºăˆŸ;å̉ ĂÈÍÄĐÅ!ù׃v©‡¥2ßëMéºÏ̉øêó‡ÏÔôƒ9¥‡ÏÅ¿ÅÙ½½ôùê¡Ơ¹Úͼ¡Èó¹ßÚшµa˜êèäÏÅ×¾Çá=‹ë¸ÚôéËÉ9 ƠóÄÀ‡€è/Ö:߈ăˆŸ;óÇơêĂÙëöáêï½›ÛÍß«»£äµØÍå9¥‡•{¡¼Ă™‡º«‡“Íj«Ô™‰kß [ïS«‡“Íj™‰kß [ïSÁßÿÚÏÄó#±»ÑÄëÏÔÙÚ÷Á«d§Û·Ô߈ÄÀÛ«‚ ½9¥ˆ]1Ă´Û×Û«‚ ½9«‡“Íjç̃ß„½€ùº߈Û«‚ ½9ƒĂÈÖô­Û½ÿÚ½߈åĂăˆŸÙÚƒˆ­Öù×ûÛߖơé̃ˆƒØ¶߈¡ăÙÏ̉ŸÈ·§D ©‡¥2ßëMƯºÿÚ·‡‘×8ç‚v·&ƯÚóǃ½ÓÓ…ô±»ׯ¾­ÄĂÓư“«‡“Íj¹Ú¡È¯×·Ô–¾«Úç«ÔÁăó¶Û«‚ ½9™‰kß [ïS¾¥ˆ]1ă™Ø­Ô½ăà¯ø«d¤ˆ \ 0 ¥ØûØÚª‚ +¼9ù×÷ÚĂÙÛ«‚ ½9™‡̃Úªº¹Ú›¶é߈Ç…ÚăˆŸä̉ÅÄ­ÖŸ6›¾«·3uU‡Œ… ‰₫‚Øơê‹ÈÍÄ›éÓÅØ½Û«‚ ½9Ûº«‡“Íjêöª¶2tTø×ùשӛۡԳƒvù׺½ƒ߈™‰kß [ïS¹Úưˆ‹ÇÄôゥ‡¥2ßëMÍË)éÛ9¥‰¿I©‡¥2ßëMƠ™ëéåç̉ñÆëöÓº©ÓơÔÅӇǴнÏÅ₫ÁăÑÓ‰Ûƒˆ½È»éÓƒÖ•½ÙȵØËÖÏź«‡“ÍjöùÚ™‰kß [ïSÔX¥‰ÍL…£ÔÓʃˆÿ¯¶ß»ûư¬ïÚăƠƒˆ߈Û¶‡Ö8æ¡ÛËÉ9¡Á ƠÓ̉çô‡ÇÙ×·̃Ël߈½ÁÛĂÙ›¾ëÔ­Ä˹×¾ø×ÅÔ•Ó½€•Èû›ÿ¯¶ç̉µ¾(á9™‡ơÙ½ö…Ô¯&«‡“ÍjÏÔ™‰kß [ïSÛ«‚ ½9ÏÔƠÁƯÏÅûØÅưÓ«‡“Íj›¹Ăºƒv·Ôù×ÍƠ«‡“Íj߈™‰kß [ïSăàêö±»£ÇͺÛ«‚ ½9´†ù××ƠÏÄéÚëöăÇíù×ÈÛ«‚ ½9«»ơ½ëöÙ½߈÷Á̉½®G ø Äôúº±Ô½ëơêåƠù×ß»ûÙ½ÛלƠ‡ÚăˆŸ;ívÛ«‚ ½9î ²2 íꇌ Ơ½Î™‰kß [ïS‹Ü±»߈º»Á™×·‡‘×8ç³ÈùêÂÏÔ³ÈăˆŸ;k§Ô›¾ƒ¾‘̀Ă½éÚÇÖưÀÙ½ÙÚăáïăƠºù×ÿ§Ѷ¸ÚƒˆƠX¡¥Ä߈Ï̉›v¹ÚÙ½«‡“Íj9¥‡ƯåÙ½̣"µØ.ù×É ¥‰ÍL…«‡“ÍjµØ·‡‘×8竇“Íj‹Ü©¼°»·™‡ơ.©‡¥2ßëMƠÏÔ£ÇÂĂ +é‰ñ5ñ·›¾ÏÅÆ̉FăˆŸĂÙÑÓú̉¯×™‰kß [ïS¹ÚÇÖ…’Æ×̉Å–™‰kß [ïS‹Ç߈9¥‡×Ù½ÏÔăàÛºÓ9¥‡×‹Ç߈¾±»Ö¼߈¾‰¿I±»ÅÏÔùơÆÓ̉™‰kß [ïSăˆŸ;kËƠÉÖ½©Ó»‡½—ˆºĂÏÅĂÓÛ«‚ ½9߈ÏÔ÷Á¡Ó‰¿IÿÚÛ«‚ ½9…ÛÙÅë±ăŸÖÇÓß»ûÏÔÙ½¯ÏƒăÁí‡÷Á°½Ùڃ׻‹ù×µ†ÍƠÙÚÉ»‚½¹Ú«‡“Íjÿ¯¶‡“›¶é§ôŸ}«÷Ÿ×¼S±»ă‘·‰ơ‚•µ•Èû›¼¿ÅùסÁ½€§ÔÎÅæºívú ·ÅéêÓºÑÄë±½ƠÍË)éÛ9¥ù×ׂׯùê—¶Ă÷Á¾½³Ởơê« ©ƒ»5¡È›«‡“Íj±‡ÿ¯¶ĂÙǼ‚×Ù½ơĂ•ÜË®¼«»ËƠƯÓ ±»ÅƯÓ §Ô¯ÈÛ×êÔûØëöÏÔßÄÙ°ºívÛ«‚ ½9…ÛÛ«‚ ½9•%çÀ±»¡hÚª‚ +¼9ñÛûƯµØŸÅ8¤‡ơlgÛ«‚ ½9ƒ§ÔX Ëûï³Û×½ÏÅÓ̉­ÔáÛ…n·Å߈¼—¶í—Gôêëö«‡“ÍjÉá Ơ»ÅóÇÅØÀĂơË¿±»£›ÑÓÛ«‚ ½9’ȃڢԽ±»±»½¥ÇëöáijÅ3©&™‰kß [ïSׯåÁμ¿ÚׯñÓƒÔ—»ơ»ÁĂÙöÁ•½«‡“Íj߈׿8¡®Gø5¯G‹øï³2‚½ÁĂ߈™ơíØÍÄáêÏÔ±»ç®Ϻ‹ÇÁĂ¹Ú¹Ú܈ĂƒvÏ̉ù×ơêµØ˜‡Í†щ«ÔñÖ罺¼ÿ¯¶½€ưÀª‡’̀jö¶‹Ü߈™‰kß [ïSÛº²ç̉ÁơÔ‚¾‡±ëØÛ«‚ ½9ùë™ëéåÙÚ÷ÁóÂÁÇÖÓØ¾̀Óù×ÍÓƒv½€ù×ăˆŸù׫ԙ‡½€ñƲÂÅô‡«»³ºó­ÄÓ©‡¥2ßëMÑÓÄÀ ₫®¶Û«‚ ½9ñÓ­v߈Û·‡‘×8çơ꫇“Íjº¼9¥‡ëÚÙ½éÓĂÑGôêáÔ¾!F!ÛÄÓ©ëöôÿ¯¶÷‡ŽñÖ·}¾Ø¯ÈÛº«‡“Íj™‰kß [ïS9¥‡×ƯÂ߈ßÚƒÖ—¶ưÀưÀÏ̉߈·Ô›¶éº˜‰j̃ZîS±¿¥ˆ]1ĂÙ¿́½ŒỞß+½ÑÄëÇÖ™‰kß [ïSƠ×ëö™‰kß [ïS¯¾ͼÏÔ¶èăˆŸùêÚª‚ +¼9­ÄßÖ·‡‘×8癇ëÓơÔä̉ùטêèäơÔ›Ûôêă¡ÁÑÓ—ÓĂÙ‹¾½Ơ¹…Œ߈ÙÚ8¤‡ËÓ°»ƒvÛÄÓñÚ·‡‘×8çÔX‘Æ«‡“Íj•Ư¼+º –½ù×ÿ¯¶ưÀå̉ ¿»ăˆŸ;±%Ϻ߈¹ÚÏÔÏÔçÚ‹Ûơêëöø×ơÔ£Ư߈Ѷ9¥‡ëÚ¡Û»ăˆŸ;k±»ă‘·8¤‡Û«‚ ½9é¼ơĂßÚﻓƠ·Å«ÔÊDZ»ơÄÁƯâˆ:™‰kß [ïSÑÓ匿NÛ«‚ ½9ÏÔ¿‰߈“Çۺἃˆñ´¹Ú’ƯÀƯ­½¼ăˆŸ;kٽϿóÇÿÚÅà‚ˆƒv߈¹ÚŸèâ»Ïť؇Ư±»¤ˆ\0ÑÓưÀ£ä—ˆ½Ø±µăơù¾éÓƯơ‹ÜßÁÇ~ùë¡Ô§áưÀ·‡‘×8çưÀÉ̉ù×䌾NñÓ±»¬Ä߈³ØÏÔƠÿ¾¼ÜÂÏÔ£»é‰ñ5ñ·ÂÙÛ«‚ ½9™ơ•ơ陉kß [ïSäáƠ‡ƒv½€ؽª‡’̀j÷Á¡ÓÅÓĂÈÁ|ăàóù×ĂĂ­Äè‰đ5đ¶ß»ûÙÅëÅØ¾ÏÔĂϼăˆŸ;‡Ççm¿ôƒvƠ¾G¥Û₫·‡‘×8竇“ÍjßÄÙ Û‹Ç©×ËÇÙ¯Ơ‡º·Ô‹Ç•‘±»ù×ăˆŸ;¡±»Û«‚ ½9ëọ̈à·Ô߈“½§Ôµ!Û«‚ ½9çÚåßÙÅëñÓå»ϼÔÛÄÓ˜‰j̃ZîSÍÓ«‡“ÍjÉŸ ¿Àùׂˆ9¥‡×ÏÔ‰£Ç™‰kß [ïS¥ˆ]1ÜëöÚª‚ +¼9—¾ÏÔưˆµÅÏÅÛ«‚ ½9¡»‹ÇŸ\«‡“ÍjÛ×»ØÅÁéºμÏP«‡“ÍjơẰªơÔÏÔù×½ơê«·3uUÎ̉ǼÅ¥‰ÍL…°»±¾ơ÷Ù°»¿ßÓº»ổÁù×É»Œ¾›‹Èâˆ×¾Ï̉Ù×̃»úçÚÆ©Ơù×¥ØđÖ«Ñ› ƯÓ »ï•óù×™‰kß [ïS©¼ơê—»¨¼ăơéÚƒvÇÖ™‰kß [ïS—Œ¨¼”%Óž߇“ȳ½Ÿ±½¿ßÔÅØÛ«‚ ½9±»ù×öçÚƒv߈˜ôù×ơê«Ô›v˜‰ j ̃    Z îS å̉ ™ëéåÙÚÓÆƠ˜‰j̃ZîSÛÑÓ₫®¶¿‰Ѧ÷Áƒˆ™‰kß [ïS‘Ƴ1ëöÑÓ£»ÏÅ“ºшù׵ϳȹÚÏÔÙ½™Ó›v×¾™‰kß [ïSÛ«‚ ½9àÀÄÓËÓơÔƯ ½Ô߈íJÏÔívÙÚóÔ∈;Ïű»ĂÙÙÚÿ½۫‚ ½9Ë̉½Ø×áÀ‰Û±»«‡“ÍjØ +ù×ÜÏÔù×߈ĂÈơ꺫ÔăˆŸ¶è߈«‡“Íj߈÷Úø—§ÔÏÔëöäôÚê«·3uU¢ØÛÀËÇºăˆŸ;ׯăˆŸ;ĂĂ ›­±àéMçÇöÿÚ—ÚăêƠĂÙ«‡“ÍjÏ̃½»Á«‡“Íj̃ˆ½Øùê±»ƒvƒ¾‘½€ÍÓ›‡ŒÏÅ™‡χ‡ŒçÚª‡’̀j“ƠøêÛשƠ‘Ö•ƠơêÓ´µØơ©Ç∇ڽÛÂ÷ÁĂÙ·ÔÏÔö½©ÓŸ}ù×êÓ ÙÜÿ¯¶щ‘ؽ¡ù××mßÖ̃ˆ¹Ú™ëéå“Ơ‹Ç¯éˆ®ồÊ)èÛ8¤Û«‚ ½9±ÈƠºm›·‡‘×8çÚ×›¶éĂ·ỘǹÚÈ̉ÛơÔßÄÙàꥈ]1ºơú›ÚÍÓ¼÷‡°½êâºÖÆÙ½ÁĂ¾À̉ÅàßÁÍÓ/öơÔ߈ûƠºçÿ§Ă¹½à¥Æ×ƠÄôÏÍÓÛ«‚ ½9÷¼½®¾ÿÂá ƒÚíÂáƠăÇíÖÔ†6¦j½¶‡Ö8æëö÷ÁÅØ½—¶ÙÚ™¥î£ä™‡ƯÓ ï½ªÚ—¿½ó¸¥Û™‰kß [ïS‹Ù»‡£Ô¡©‡¥2ßëMñ‡áÓ±»±ƯăˆŸ…âÅØéêß»û¿‰ù×ùסÓË%ÿ¼÷¶‰¿IƒˆíºÓ9¥‡Á +ĂÙñ%·Ô‡Œ…ô˜‰j̃ZîSƒˆ·‡‘×8çĐĂ™‰kß [ïS—»ºÁÅÓ«‡“Íj¬Ä»ăàô¥ÁÏ}ü̉ăˆŸ;Ü—¶¥Ûº±¿ÁƯëöăˆŸ;á ËÇé–ïƠ…ÜñÆô߄۫‚ ½9ÙÚçôº©º³‡(‰ÛéêñÚËÉ9ß´ÎŇ›¾ñÙ–»¡£Ü…ÛöÀĂ‹É0é½Ở˜È‡xχÁ́«Ú±»½¾(±¿‡ºÁÚÙŒë*««ÔáƠưÀÿ&™ơñÓí‡ÖƱ»đÁ]…bôרᬗ¾ûºÑÄëÿÚϯ¼óÇí—GÛ«‚ ½9Á̉Û«‚ ½9›¹ÇØïÁ­¾›Û—¶9¥‡×±½Úª‚ +¼9±»ăˆŸ;ƠÚÿÛ₫Û ‡Œ“¾íꃈ›·ÔÙÑâ»Û«‚ ½9ẳ™‹μƒ×Û«‚ ½9ÄÀăˆŸ;Ổ’½źăˆŸ;ùêăˆŸÙ½«‡“Íjív»Øơêá‹Óܵđ؉j̃ZîSÖӾ߸©¼¡ÛÁÓê¼›vÁ‡é/×:ÏÅ—Û½ÑèËÖơÄÅĂñÖĂÙ½₫®¶Ù€gä×ñÓǾ›¾߈›¾ÏÅƯÓ Ëû©ǫ‡“Íj¹Ú³È¹Ú’È жÅnéêĂÈëöÏÄăˆŸ;k—Ó•Œ°»÷Ú±»×ĂóÔ‡xăêơÔ™‰kß [ïSăˆŸëÔ±»±»“Ơ™Á“ƠÚ×ÏÅ»‹ÜßÄÙ©Ó¿­“Ơ¹ÅØË¿×ÓÛ׵طԫÔë§߈Ư½ĂĂè߈ÙÜ߈¹ÚóÙ½áˆÁ0qË̉µ‰Úª‚ +¼9µ÷·ÅŽÏÔù×ÏÅHÏÔ¯G‹ø°»» µÙ×ÑÅëö­Ø9¥‡¼ ă¥ˆ]1ψ—ˆíÖăˆŸ;½å»ç®½Ÿ»ăˆŸ;÷Á¸ÚǺÛ«‚ ½9íơ9¥‡ó^ËÓÚ¹¹Ú²ÑĂÙ½Û«‚ ½9ùדƠ™‰kß [ïS߈¸Ú߈ăˆŸ;Å÷êơ؃v.¹Ú½¯¾‘±©Ơ—º÷ÚÏÅ9¥‡Ù×ơê¡È·ÔË ù‡»Ø±»ăˆŸ;߈Åكة¼çÚưÀµØăơ—Û¿‰‹½ù×’ +±ëØưÀñØù×9¥‡ù‡½ÁÙŒë*«ÛÇ¥ˆ]1ÑÄ룻ƒÚ«»ÓºÛ«‚ ½9§©Ç«‡“ÍjËÇ•½Û«‚ ½9§ô™‡Û«‚ ½9Œº‰ù±Ôù׿º£äî²2(‡ŒăˆŸóÔÙ½¹½öχívµƠ¾ĺ£ëͺÛ«‚ ½9½ô§ôñ»ר³ÈÑÓ™‰kß [ïSäÁƒç«‡“Íj ÈùêÙ½9¥‡£ØÎÅ'Úª‚ +¼9ǼµÁ«‡“Íj¡ÈÇ·ƯÓ ÓØ‰º±»ñÓ¾ØÍÓƯÓ ñzĂ™‰kß [ïS½ƒ½¼Ăíê‚×—¶߈öĂ‹™‰kß [ïS¾™‰kß [ïSñÖƠ¹Úׯ«‡“Íj©‡¥2ßëMÎÔ÷ÁƠÿ¯¶ƒv¡Ô™ÁçÚÛ«‚ ½9µØÏÔÁ̉߈«‡“Íj߈ÂÙ±»äô¾ƒv™‡¡Ô™‰kß [ïSóŶÏÔ°» ¡Áç̃Ư+©?éJé‰Ó5“gesÁŽ€ÚÀ¿ô‰ÔƠÜå¿9¥‡Ưßçô€Ç›ÛăàÑÓù×ơèÅϺÓ¼±‡Ù½—¶ÏÅÛ«‚ ½9ơê߈µ‰™‡Ă߈¹Ú¿‰ñÓÏÔʹ«‡“Íjÿ¯¶©Øù×ôÖÆÛ¬¿Ø·‡‘×8ç¾Å·³ºó±»öÁđÄß„ù×§Ó¡À¹Z˜ô—¶ÿÚ©¼ÅnÛÚ™Ô«Ô­vƯÓ êöó ÏÔ¼«‡“ÍjÁ‚ í—GơêĂƠƒv%³ÓüÀ­¶Ù½̃½¾ëöܾƒkÙÚéêéßóÇ™‰kß [ïSŸ}ÉĂ9¥‡ÍË)éÛ9¥±»ÏÔ +ÿ¯¶¥/±»‘±»Ù½ÓØáêƯ ĂÁÑÅÇ̉¸Ú­ÖÇ»H÷ê±̉™‰kß [ïS¶¼̀7·Ó ¥0ăˆŸÜăˆŸ¹ÚơºƒØ߈á ¬¿™‰kß [ïS½Ô¾©Çă—Ó¥ˆ]1«·3uUÏÅ›¾ÓºóÇăÇíëöĂºçÚÖÆơº¥ÈûÙÀ½¡±»÷ÙÛ±Ôóƒ½ï»ù×…ØơêñÚß»ûº߈ÙᱻċӋÉ0Û«‚ ½9ôƒ¾‘á ơÛÙ׳”÷ˆµ†Û«‚ ½9ßÚ‡ºüÀϹƠ‚åÁÛ«‚ ½9ëÓáêù×ÍBÿ×Úª‚ +¼9÷‡èºÛ«‚ ½9÷Á™‡ÍË)éÛ9¥ư‡±ù1›¾„ØóÇÿÚ¬Ö-̀Ê)èÛ8¤̣¶ùơƯºÏ̉ăàÏ̉ÏÄ™Áƒv£ä÷ÁƠXøơ›¾ÏÅÚ½ùê‹ÜÙŒë*«ƠX¼Ăº”̃ˆ«‡“Íj½ëöÏÔÙŒë*«€º™ÔÛ«‚ ½9ÏÔ¡ÔU‰Î¹ÚƯƠÏÔăˆŸ;µ˜‰j̃ZîSµ͇³(Û«‚ ½9íö‡Úª‡’̀j°¿±¿ÑÓüÀÅÙÚ™‰kß [ïS›¾Ơ߈ơêëöÏÅ“Û͘àƠëÓ߈áƒäơÔíÙù½±»9¥‡ѶÏř׫Ա»ëö¸Ú€Ơ·‡‘×8çÏ̉ù×ĂÈăˆŸ¯‰¯0Ư€±»ÏÔ™‰kß [ïSÏ̉ù×·ÜÏÔ匿N³(ƒˆ¡«‡“Íj•Œ½€¿¹±»—»ÙÚÏÔù×ăàଃvéÚß»ûÎÅô˜‰%j%̃%%%%Z%îS%½Ă§ÔÛ«‚ ½9±¿¡Û£X9¥‡×ÂÙ­¾…ƠơĹÚÅØ¬ÖÔßÄÙËÇ“º«ÓưÀÇÖ‹ƠôÄרƠÚ“Û™‰kß [ïSƒˆöÁ€ºĂÙÍÄĂȶƯµ“́Ú ùê±»ùשÓÿÚĂÙÙÚ­Ö󫇓ÍjÀă¡G½¹ÜÏű‡¸­Ä‰Æơ»§ÔÓÔùׯ¼Ë̉ù×̃°»ƒÖ±»ƠÑű»±»߈±»‰¿I¯¾—Ó“ÈñÓ‹ÇưÀíêá ±»å¡ÅØßÚ«ÛÙÅëñÚ÷Á¥Ö½ôÉăˆŸÉĂß»ûăˆŸ;kăˆŸ÷Ú‡ºăˆŸ;ƒˆ±»¢ÇëöăˆŸ;ăˆŸ;ö¾«‡“Íjô¼Ô”Ö û›Û«‚ ½9ƒØ³±»÷ÁÚª‚ +¼9‚׫‡“ÍjÁ̉Ë̉½ăöÉ Ă·‡‘×8çÙŒë*«÷Á…Û«‚ ½9ëö•ÓÏ̉¿*ëö߈Ÿ\̃ˆ‹ÇĂÈñÓÏÔéºÛסț¾ëƠUù×» ÷å5ÓÍË)éÛ9¥ö¥àù׫‡“Íjψăà¹Úï³2ăêá ·ÔăˆŸ;kƠñ~«»шµØưÀ¯ÈƠ½Ù½éê™$áÛ™ÏÅăơ¡Ûă»Ïű»™‰kß [ïS„ª»™‡Û«‚ ½9ñÓƒÖÿ¯¶™ÔĂÙ™†çÚƠÙ½˜‰j̃ZîS÷Áµô­Öô +§ßëÚ܇Åàù׿١ȠÁöÁ±»íÚ9¥‡××Ó‡ñ5₫Úœ‰¾I°»ô×ĂºÏÔĂºµƠ‘ƃÏÔÍᕺ¯È‡íễÖƯºô…½ÙÚɇ·‡‘×8ç‹—ÎÔû°»ÿ¯¶ívñÖÅØׯÛ«‚ ½9ɹƒñÆñÚÛÇ™‰kß [ïSƒvÛ«‚ ½9“ƠÛ«‚ ½9ƒĂÛ«‚ ½9ÏÔÏÔ°»ưÀ²ÂơÔív±½„ØéÓÔ±»Ư$ׯù×ׯÏŹڡƠ›¾º²Æ‹Ç©&ơĂëö9¥‡ºÑÄ뾑±ăˆŸ;kĂÙûÓôÛ«‚ ½9Û«‚ ½9»‡§¹ÙÚÅØÍÓăˆŸ;ϼÍÓ“¹ƯN÷ÚÙ½߈ÍÄÇä̃ÁÛ×¹Ú鸙‰kß [ïS¡£»¡Áé×½«‡“ÍjơèÅ™Óëöщ½Æ߈ÑÓå̉ Ù½ûÙ«dơêăˆŸÅí„Ơ“Ơ±¿Ûט‰j̃ZîS­ɇ«»̃ˆÑĂÇÖö·ÂøÚ—¶÷ˆỂ ߈ÍÓ›·Ô·Ó ¥0»ÓÁ‡é/×:’ÈÂù×ăÁÇ̀Ù½—ˆÛê“Æ¡È›¾å¼ ăˆŸ;ÏƠù׃v·Ø‹Ç«‡“Íjƒˆơêív»°»¡ÈëöñÁÎÔÍĂÅÀ›¾ñ¾ÿ¯¶‘ÖÅÓ—¶ÏÔÏŸÚñÚ߈±»«Ô‡Œ·×ƠXÏ̉›¾‰Û´Øµ.¥ÙÅ»ĂƠăˆŸ;«Ô›¹¡ÁéÓ±Ô«‡“Íj÷å5ÓË̉ºïéïÁµØâ½÷Á߈·‡‘×8ç9¥‡ñÚ±»™ÔĂÈ́$́vÛ«‚ ½9”È +ú + +ºÜÓb b†Œ½ăĂÎÄ©Çщ9¥‡Û×́·‹±»«·3uU¯ÛƠ«ÔăˆŸ‡ŒăÁ“ỠÄØùêĂكĸÓÁơê¤Ç½«‡“ÍjÏÔ™‰kß [ïS£“ßÄÙ˜‰j̃ZîSÔơ½Ø“ÆưÀÙ½«‡“Íjß»û¢ÔñÚÅàĂȃ఻áê¿ë·ÔƠX½Ø³ÆÏÅơÔÇĂéÚ©¼÷Á§®íÖ¶ÜÙ×íꩇ¥2ßëMĂĂ ›­±àéM«»Ó¼ƒêö±»½Z߈ĂÈ¡»×¾₫±ëØ߈ăˆŸ›íĺ9¥‡µØ÷ÁơêƯÚăˆŸ;‹ôëö»®È߈êöçºĂÍĂ«Úù×ƯÚù×߈ƒvµ†Û«‚ ½9¬ÖÛ«‚ ½9áƠơÄÛ«‚ ½9-ĐÓÿÚ½ÙÜÀ½‰Û§ÔôíÖƒvÁñ»ơĂÛ«‚ ½9¡ÔơÔ鱜‡ß»û”½χÛºưÊ Áö±l¨Åƒ×ÂÿÂíÖ½ùê߈ơÔơêéơö÷‡ÇÁƯÇÖÆ‹ÇÓº¼Ă¼«‡“ÍjñÖÏÔó|·Ó ¥0¿‰³Â‘ ±»Û«‚ ½9߈ù×Ơà=‹ÜîºÏԹعÚơÔ9¥‡ƒvÀ‡€è/Ö:9¥‡ËÉ9ƒvÖÆ€äĂ—¾™‰kß [ïSƒÔ½€±»–ÓÿÚ©¼«·3uUëƠUÛ«‚ ½9ÛºÛºÿ¯¶߈™Ô­Ø½µØƒµØƠ©Øùׇº©Ü«·3uŨˆ«‡“Íj¸ÚăˆŸ‡xâÁ“Èù×±¿ív«‡“ÍjÅØͼ°»ù×ơèÅÿÏÅ麽ƠX÷‡ù×ë¼Á̉ơÔÍÓź·ÔøơѶ…סÁ±»«Ô߈ơÅÑæÁÛçÚù××£äù×ɱ‡ưÀÚª‚ +¼9™‰kß [ïS™Ø·Å÷Á™Ô‘ÆñÓé(™Ô©‡¥2ßëM­¿ăˆŸ;ßÙơÔ÷Á©‡¥2ßëMơÔƒváÖ»‡¡Û¬Ö·ÚµÏ¡Ô§¹ñ×—ºÛ«‚ ½9ÔXëÂƯ™‡›Úù×ÇÖÑÄ뫇“Íj£@ăˆŸ;ëÚù×±»›øŸÅÙ½±»Û«‚ ½9Yñ„ßÚù×÷‡¿ßù×Ϲù×÷Á߈½ÜÛ«‚ ½9½‡Ö©ÜͪÙ½Ă¼ư“Ư¾™‰kß [ïSåƠ¡Áº½€•×¥ÓáƠ½Û«‚ ½9麅߈Å὿ߵ†óÂØ»ö©ÀÁĂ´ƠĂÙ±»ù×¶ơêçÚăˆŸ;öê ±»©ưÀ·Ô÷Ú¹ÚØŒê*ª™‰kß [ïSÛ«‚ ½9ÿŸ¾ÏÅûœ§ÔöôĂƠ“Ơé‡ơ»ô¼íÆùÚÓ€ׯửºăˆŸñÚÀĂ!Ở€±)ø×½ÔßÚ™‰kß [ïSëö¡¿¤Û‡7«»ÓÅɇ˜êèä¡È÷Á±»§ÔÙ½•Çëọ̈¶¡ÛÛ×ÛÚÛ«‚ ½9íêÁ¹³óÇÓÍÓóÔ½°»…¼ƠßÄÙÔơ±»ß„—¶›Ú±»·ÅË̉£ä¡Èª‡’̀j÷Áå½½˜‰j̃ZîS£ØÛº—¶Û«‚ ½9ߌÛ,ö™‰kß [ïS½È™Óè‰đ5đ¶»̃ÅÔ±ëØñÓ°̉ÛÀ¯ÈµaÓźy€Ç«‡“Íj¹Ú‹Èơê8¤‡ö9¥‡‹É0³Ô™‰kß [ïS–¾߈ăˆŸưÀĂƠÖÀĂßíêơÚ8'¤‡'ÖÔXÀ±»³µÁÁË™‰kß [ïSï‰ơê˜̃ÄØăˆŸ;kơê¶ÁƯĂº›¡‡Ú§ÔÏ̉ƒv9¥‡ƒå¼ ưÀÏÔ÷ÚµØÁ9¥‡×£»Åغơ¡Û±»ÿÚ½ƯÓ ›ê±»¬¾ëöÅØ·ÔÑ÷ƒˆưÀ¿ßËƯÎÅÁƯ™‰kß [ïSÊǾ¹x®Ơ–¶“ÈØƠ߈ùê­߈¢X©%®öđưÀƒ¾‘éÚëö‡Û™‰kß [ïS̉ÅưÀñéÓÔº>l>©¼­ÚÍË)éÛ9¥ÿ¯¶¿»•ÇăˆŸÏÄÇ߈«ÑçÚ™ÁÏÅñÓ…÷ÁŸÖĂ ĂĂ ›­±àéMß»ûçỗˆï»•{߈¿‰ù×¤Ø ù¿º¡»£ä×ƠÛï»ù¿ÅÓ—¶±”¡Èëö­Ö‹vçÚ¾¹x9¥‡×“ÈщY߈Ơ8¤‡ßÁáêéº÷Áéêå×ơĂå¿óÇÏóÂơÅÛˆÅ߈¹ÚÚª‚ +¼9÷ÚÍƠ±”ơÔƠÓ»y߈±»½¿$¢!ëö„n¨Ç½€á=ÇØ̃ÄØÅØá ¹ÚÅÓ߈ϼËƠï³2ơêÛ«‚ ½9ôÙÅëóÛ«‚ ½9ß֯̓¾‘ƒÔÅăˆŸ;Ǻ$߈·̃ƠºóÂăˆŸ;ÁƯ™‰kß [ïS¿º™Ăÿ¯¶߈ưÀáºöÁ4ÏÚçô±»ơê«ÛºɇƯÚËÓÓ +ƠXö±¿ăˆŸ;‚عڦԫd·Ëƒù׫»ù×ă»ÈĐÓù×™Ăå̉ åÁóÇÅ–ñ~÷ÁôñÄŽÎÅÛ×9¥‡ăơÑÄ뫇“Íj•%ƠÊáÛÑÓ«‡“ÍjßÄÙ—¶½߈™ơÛ«‚ ½9ăˆŸ;¶ñÓ·Ô‡º…à„Ø³ÁÛù×ù꫇“ÍjĂÙóö…»«·3uUÙÜ©‡¥2ßëM™ÔËÇÇ̉Á½ơÊ‹ÜóÂÑÓăà¹Ú¤È ›Ô߈8!¤‡!ÖÁĂ¹ÈÛÄÓ™‰kß [ïSăˆŸ;ÄÓ™‰kß [ïSÛ«‚ ½9Ù̉½Ï̉Û«‚ ½9é]ê$®È ‡ºÇÖ³ºó«»߈™‰kß [ïS—ˆ߈̣Ô·Ó ¥0Û«‚ ½9¡Ư×Ó«)ăơÏÔÂÍË)éÛ9¥×Ơ†7§j•Œú(×¾¿ôï½åŒ¿N­¾ÍÄ·Ô­Ä©‡¥2ßëMĂÙ‡±»ÛÄÓ¾ÑàµØéºÍÓÍÄÙ½÷‡Û£ä·ưË%ơ‡ˆ×¾Çت»߈éê™ëéå›vºß™¡Á‚v‡xÛ×½€ÍÄĂ$‚¾ï³2ß½­½¼ÇÅ™‰kß [ïS¹ÚÓ¾ÑÄë°»‘ƾ‹ÇëÓö$ôé)ÿ¼ëÓÉ߈¾ß9¥‡¿‰ø×ù×넱¿¤ˆ\0À¹–»₫§ơê¿‹Ă«ÔÎÔÎÔ¿‰ù×ù×ÿ§×Ơ·ÔÁ½çÙ̉çóëÓÙYÿÂÙ̉óÚ×ÏÔïÂù×Åͼµ‰«‡“Íj¡È߈ûº¿ÅơÔÏÔĂơ$Úª‚ +¼9‹Û‹Ü¡Ơ‡ŒÙÚ÷Á½ÅÓăˆŸˆÛù×߈ĐÓé‰ñ5ñ·ËÓ¬¿ªĐ±»Û«‚ ½9ÏÔÂơèÅÿÚßÚ¦Ô÷ÁÏ¿ơê÷Á›¾÷‡÷ˆ“‹öˆ̀Ó½ó)«‡“Íj¾ßëö¶è«‡“Íj…öĂÙåôĐÓ‘±ơèÅĂĂ ›­±àéMá ¶¡ÈÏŧƷȩǃvùׇŒÁ½¯Ơ¸Ø߈ơÔºÉĂÚ×™‰kß [ïSÓ²øơïƠí¥ï»ÏPƒĂƠ¸ÚÙ½åơ¢ÇåÁăˆŸ;ÙÚ½Á‡é/×:˜‰j̃ZîSƒˆƒ^ëÔ¾›¾ưÀëö©½ơÔÛ«‚ ½9ă½ø×­ÄƠ¡È«‡“Íj¬¼¼ÜÅØÁËÇăˆŸ;ơÔăˆŸ;k»ØƠÍÓ8¤‡×½àÅ]íÏÅ—Œׯ߈™Á½Ô߈“¹ƯNñ¾©Ø·‡‘×8ç©Ó¹ØŸÄĂÙ™‰kß [ïS©‡¥2ßëM¹ÚñÙŸĂÁÄÓ ÏÔÛ«‚ ½9Ûº§Ó§ÓéÓ§ÆÓÆ™‰kß [ïSùëµØăàơĂơěڥ»©·ÅÖ¾¹ÚÛ×Û«‚ ½9ôœÁ“ÇÍÄ“Ơ¯×ù×£Ô™ëéå¼»˜‰j̃ZîS¥Ó߈ẵ£@óÂÅóÇçôăá ËûÙ̉÷Á™‰kß [ïSĂàÑ·¡Û߈×܋ǹکÇ9¥‡A­vƒÚơêù×ÓØ‡¿ÍÓĂèêÿ¯¶Á ™‰kß [ïSÿÚĂȋܹÚׯ߈Å–ăˆŸÇôÿÚ©ÓÛ«‚ ½9•'ưÀơêăˆŸ;k…ÔÅøơÄÔ÷Áùת‡’̀jº£äÿÚ½™‰kß [ïSÏÅá ƒÖ·̣ͼ±»ăˆŸ;ĂÙù×›¾öÁÇÖâ½Û«‚ ½9±»©‡¥2ßëMù×ÉÍË)éÛ9¥Ăù×›¹ÓŰ»öÂéJé‰Ó5“gesÁŧôÏÅÿÚñÓÛ"רÛ«‚ ½9©‡¥2ßëMÁ̃Ổ«»®GøÛ«‚ ½9ù×ù×±»χ߈¾ƒv·§D ăÁ‡á¾ˆĐĂôÄÓÛ«‚ ½9ƒÚ««‡“Íj½­Ä₫Ç“Èg&«‡“ÍjƯÂ×Ù¾ßƯ÷Á·ºׯµ«Ô¿ßź³z«·3uUÿ¯¶߈ĂÙëöóÂƠ¡»ƒvñÖ°»çÚĂÙñÚ«‡“Íj‡³£X¡Ô‰¿Iª¶2tT§Óޱ»ÍÄĂßƯ—ˆ—»ñíÈI§Ø·‡‘×8çĂĂ¹ÁăˆŸ¯ÈĂĂĂ ›­±àéMÚרØû~ºßÖ9¥‡Ûº¡ßÿÂäס»ÍË)éÛ9¥Û«‚ ½9ÙÚơêÛĂưÀô‡ƯóÂ߈Ù̉¡ÈÏÔƒÚƒvÛ«‚ ½9Ï̉½ôçÚơÔÀçÛÀùôÈ̉шר‹!«ÔåÁà́•Œ¹Úï»đڙʹڽ—»Å–ßÁå̉ ª ¨ƒº5Ï̉âàăˆŸŵÄÁ½ÙŒë*«­Ö©‡¥2ßëM¡Á°»ÏÔ³±»¼·ÔĂÙñÙ÷‡߈¥Öëöùê‡ÇÏÅ™‰kß [ïSƒÖÁSµØïD«‡“Íjưܹ ±Ø¯Ơ©Ø÷ÁÁ€ç«¡ÛóĂ³ÄÍÓëöÚª‚ +¼9çÚçăˆŸ8¤‡»éºåÁµÛ€ºÑÓ™‡©Ơ½߈ñÚö«‡“ÍjƯÓ ˜Á÷Ú¸àá=ÁƯ¢Ç¿́ù×ơÔăˆŸ;°½Ø¹Ú½Û«‚ ½9ưÁ¹ÚÙ½Á¹ù×ﻯȽÉƯù׫ѹÚêÓ«ø¡Ơơ»È ùê¹­Ä«‡“ÍjăàÓÅ߈…ÆĂ´‹Ü›¶é¾́¿‰ÙÚƠXª‡’̀jÛÄÓ±»±Á±Á¨ŒưÀÁÚ›¾ƯڇǪÚĐÅÄÂψ̣Ç•¾¡È¤ˆ\0ùØÛ×ÅÓêö‰ÁưÀưÀ›¶éăˆŸ;Û_½‘Ô±¿¼߈́–GÏÔö…Ö‹ÇƠX½Ôª»öÚêκơԬĺٽơÔù×½ù×Ù½Û¿ÅơêĂ¥Ó‰"뼡ßÛÀûƠÉ»ºĂƒ„¡Û·Ô«‡“Íj‡(Ăôÿ¯¶˜‡áÛù×™Ó¼ÔưÀ¡Ûºù×™‰kß [ïS±»߈߈ívỊ̈̉ê·ÔÛîºÁƯçÚ÷ÁÇÖ“º™‰kß [ïSÈ›¾ÙÚử“ö¡È•ŒÍßÉᓯ×ÿÚÛÀôç̉Û«‚ ½9ó¶Åر¿ñÓ½†ŒăˆŸ‡ÇûӵؙÁÁeù×™‰kß [ïS±»9¥‡ÏÔƒv×¾8‡ºÙ½«Ô±»ưÀ½‡Œ¯Ó‡ºÚª‚ +¼9•×Ûº¶ÏÔĂÙ·‡‘×8çÛ‡ơ…í·ÚסÈö凛ÚëöÓÔƯÚ‹Ù«‡“ÍjơÔôĂ߄۫‚ ½9Û«‚ ½9ÅØÏ|›¾ăơ¤ˆ\0©Ç«d9¥‡·Ôø¾Ăô£X‡ŒÏ̉ëỖ„ ¾¹÷Á½€߈‘±˜ơD«»ÏÔ¼ùêù׋ÜĂÙ߈³ƠƠÁ™‰kß [ïSñÖ©ÓÑÓ×̉—»óÇ—¶™‰kß [ïS©Üëö¹ÚáÛ±»ëöƠ™‰kß [ïSÚª‚ +¼9ǽ÷ÁƯÚƒàß»ûÓÙ« ©ƒ»5¿Ưµ‰ÏÔ߈ăˆŸ;«»ÿ¯¶÷‡ÜÙ½Ơ´‰ÔÙ-ÁÚ¸Ú™‰kß [ïSÏÔ¯×ăˆŸ;k¹Øü¾±»¯ăƠÛ«‚ ½9ôơê™Ó¶Åƒà‰đ·ÅÙ½Ï᣻«â÷‡$“º¨ÇœÜ¸Ú±»ËÇö·ØœÂăˆŸÑ·ëÚÙ̉¿ăàùףǨ‡¤2€̃êL™‰kß [ïSéểÛôºØ88Ư‰ô ö‡¨v±»™‡ÇÖƠÙ½‡˜‰j̃ZîSÿ¯¶ơêËÉ9™‰kß [ïSăˆŸÜ°»§ôщ¼€ÀĂÛº©Ơ¡Á™‰kß [ïSíÁỂ·Ó ¥0‹ÇȾ›¾©¼ÁÙƒ¶Ù½ăˆŸ;‹ÜÈÙ ôêºñÚù×›¾ùꃽ§·¾߈§Ô´a“öù׋Üá=ơêơèÅÁĂÁƯÏÔ™‰kß [ïSôñÚׯ߈ƒˆ—Œ߈©ÓÖ¾»¿́½‡Û8¤‡÷”¡ÁĂƠ•ÖŸÅăˆŸù×ËÇù×ɼ߈ÉĂÄå̉ µØ±»¹Ú£ƯÑ+‡½ăºÏ̉ĂăˆŸµØÁƯùôµØƒׯˆzăˆŸ;̃»ú°»öä5̉ƒv—¶ưÀâˆóÔù×ÑØéº—»Ơ±»߈Û«‚ ½9Ù½”ù×ï½ùדƎƒÖÓØñÓßÁçÚƒv±Ô›Ûƒˆµ†ŸÈ¨‡¤2€̃êLÚª‚ +¼9Ä÷Ù™ô÷Ú¿Ô§ôµÅù×Û«‚ ½9¿‰¡ƠÏÔ™ÔÙ½Û†ºÑÓÿÚåש`ù×½ÓÅ™‰kß [ïSù×ç½×Ó­Ä•½ƒv›¾«·3uU«º߈ăơÙ½Û«‚ ½9ÏÔ«‡“Íj«‡“Íjùæ¾±¿£³¡È«ÑƯºÚǺv†“›¾±»‡×ƒåĂ¹ÚÖÆÑĂơ꿉§ÓÎÅ™ĂÙ߈¡»߈¶ôæÁƯÛ«‚ ½9çÚ‘é»yÓÁñ‘è9¥‡×¥½µÚÀùת¶2tT¼€·Å™ôƯÓ ăԵاԎ¹ÚñíÈÈ̉ÙÅë—¶›ÚÅØ¡ÁƒÚăˆŸËÉ9ÏÅơĂ˜ơ ÓÇĂôµ†9¥‡±ÔơèÅÇ̉߈©Ü¿ +ÅÓ™‰kß [ïSÛ«‚ ½9­‡‘ơăˆŸ;¡ÔưÀáꩇ¥2ßëMÇÖ‚v£èå•ëöóÂÁƯÁ»ØÛºüÀ³ŸÈÏÔÛ«‚ ½9ă»±»9¥‡×±sëöËÔ·‡‘×8ç»Á߈…Ûͺèđ›¹ÁăˆŸăˆŸ;¹̃ÿ¯¶"‰yªÔ™‰kß [ïS™Æ›¾¨ÚƒßÛ«‚ ½9™‰kß [ïS©ÇÛ«‚ ½9ªÔ­Ö߈§€™ÓăˆŸĂô½ôÙᄒŸàÛÚăˆŸ;k÷ÁÏ̉…¾ăˆŸ;ĐØ¿¹߈ûƯ¢X ±»9¥‡‹ÛùÂù×½¾‡Û«‚ ½9«ÔǼ©ºù×èÚ«ÛăàÓ¼¯Ơ½¹Ú¡ƠÓ¾Ÿ}ù×½½©ˆôpר½ßÁ¤Ä™‰kß [ïSÂѶ9¥‡²Ơ9¥‡ºăˆŸ«‡“Íj¿(ÂñÆ™‰kß [ïS߈¡ù×™ÔÛ«‚ ½9ëöÛ«‚ ½9…Ơ‡Ç9¥‡ÁƯ߈³ô·Å¥Â±»ÓØøê/ »ùêÛÀÅÓúÜçÆÏŰ¿…ÛÙ½Û«‚ ½9ÿÛåÁëç¯È½¾‡“åÏÅÙÅ뇌ơêÏÔ™‡ƒØ±»©½ív¤ÓăˆŸ߈«‡“Íj·‡‘×8ç½Á«‡“ÍjÅÓå̉ ÛÚỴ̈í—G§ÔÏÅ»ÓĂÙĂÙâˆ:ÏÔ¸Ú™‰kß [ïS™‡‰¿I·‡‘×8çµØôê¹Úïé±»ÍË)éÛ9¥ÁĂƒëÓˆ•=‘•×Ù½íꌺ†º«»́óîÅ÷‡̉Åø¿«‡“Íj»Ø‡Ç›ÚÅÄÛºêöđÁù×Ë̉₫®¶öºÁ½¿‰‹Ç›“½ÏÔµ́÷Á†“öÁ8 ¤‡ ×·Åá÷Úƒ¾‘›«Ó÷ÁËÖù×ÑÓ°¿ü¦†Ûßר¾ß̃ÏÔđؙӸÚ߈ÏÔ߈•Èû›¢ä“ȶù׉̃ùבÆçÚÙÚăˆŸ;ÑÓ÷Ѱ»ơÔôª‡’̀j¹ÚñÖ™‰kß [ïSÉùÇÖăơù×ÿ—˜‡ŒϼẳÏ̉ŹƯÛÀÏš۫‚ ½9ưÆ®ÛßÙ½ÍĂÏÔ9¥‡åĂƯºëöù×—ºª»“Ç•ÖÅÀ«Ô™ÁÙ̉½ÈăˆŸ;ù×½øêêÚÛ«‚ ½9ôÚÀ˜êèäƒv‹Ç“ºĐÓٽ∇»£Ü»é푱ֽŸ\Ûׇº·‡‘×8ç߈ËÇ߈ëăˆŸ;ƠÏÔÛê™ëé娺 +ƒØ×Ơ‡ñ5½·Ô¡ÔëöÅØ§à§Ô¯ä‹Ùƒv×ôêö™‰kß [ïSËÓÙ½Ïŵ†—¶«Ô–¶̃„麃vÅÄÔưØ—¾“ÆÛ«‚ ½9™Ó9¥‡ßÚù×Ë̉¥Ó™º‹Ç8;¤‡;Ö +Áñ¿‰áÅăˆŸ†º·‹ñÚăà¡щ¡Û߈©¼ơê¿ßÛº¿Åø×ÑĹ»™‰kß [ïSÚÀôÛ«‚ ½9÷¼ÁƯ₫®¶ѯÉƠÓºÓŽëÔ½Ô±»Ûº«‡“Íjôíơ›¾ĐÄꇌéºÏÔ¡y”Èú°»…Ư«‡“ÍjÛÀö₫Ô߈¸Úù×óÂé–́©Ø»¤ˆ\0Û«‚ ½9ưÀĂÙÆ³Øăà¿­ăËùêÏÔ™‰kß [ïS›Ûư§‡ư­°¿ÅÅØ«‡“ÍjŸÅĂY›¾öÁƒ×¡Ư¼·º¹ÚÏÅéÓ—Ø߈ơ걾Ńv™‰kß [ïSùêñÓ·ÔÄÁÛÄÓƒv߈§ÈÑÓœ‡߈›Éù×Ơ¿ß™‰kß [ïS̃ˆ™‰kß [ïSÛű»£Ôơ»₫¼ëé÷ÁѶ÷Á“ÈÛ×óÚ& ¯×9¥‡ơÔĐÓ®ôË̉Á«Ôå̉ «ơ¡ÔăÇíöÛ×™Á“ºù×½ỖˆÍĂ¥Û6˜‰j̃ZîSóƒv³È¿ºĂ‰¿IÚÏÔ9¥‡‡ÇÛ«‚ ½9̉̉³È¹Ú€¾ÓƧӰ»¯¾߈¼¡È¹Ú¡»—ˆå̉ ĂÏÛ×ï½ơưÀ©Ó‰̃ÏÔ÷å5Óív©¼¥ˆ]1YÍÄÁÏÔù׋ܴÀ&©Ó½ẳëö™‰kß [ïSÁ̉Ơ§ơÔù×·‡‘×8ç±»ƯÓ ¹¶±»đ°»­¾öÖĂÛ×™‰kß [ïSÏÅ9¥‡½Û«‚ ½9ăˆŸóĂêö ‘¼щÚÆ ¢Øˆ‹ÇỞĂÙÚÍñÔỂƠø ›¾Û«‚ ½9Á̉ëơöïÀÛ«‚ ½9Ï̉ôԻ؋ÜÅØ©™‰kß [ïSƒç½ÎÔ §Óß„ŸÖ߈µëº±»‹«-‘Ûº™‡¾¡ÁÍı»è—»©Ó×ǗvÙ½ƒ/­½¼‡½™‡ÇÖéêø×øÁ‚©Ơ߈Ú¹߈™‰kß [ïS߈ÓÁéÓ¿‰ăˆŸ;“Ơ£ä½ÔöÏԡɾ÷Á÷‡ÑÓ·Åư“üqÿ¯¶™‡ÂÙ½ô«÷ŸÅó#¹ÚŽ‘ơ‹Ü›·Ô½³Ø°»¹Ú߈£ä«ÑñÓÙ½³D߈«Ñ¢»ªÔÛ«‚ ½9·Ó ¥0›ÚÅôĂ•%…Ơï‡Ù½±»½€߈ø¾9¥‡ù×߈ăˆŸ;“¹ƯN÷ÁơĂë×ëö§ØơèÅăºăˆŸ·Ô³™ÔºÏÅ±Ă™ÛµØ‹ÇHóÂ߈ù×óDZ»ƯÚ¡ÁÛ纘‰j̃ZîS«ÔăÔóÄ ËûÁ¾ Ëû“ÈóÂÏÔËÉ9µØÀ«‡“Íj¸½öù×‹í­‡Ç½ă»«‡“Íjƒv¼±»³Â½€ÍĂâÁÎÔ­¾Û¼Ÿ}°È«Úº”½¯öÇÖ¡ÁÈ̉.Ù×—¾ç̃‘%ÛÄÓ“ƠêÏ̉„ÍÓ߈™‰kß [ïS÷$ß»ûŽëŸ†ï½ËÓŸÅÏÔÁ½·Øׯ߈̣ ÏıԽêÚÑÓêöù×Ñ·©ÑÓÁ¹÷Á¡«»úÓÏÔ‘Öù‡«‡“Íj—¾ăˆŸ;܇º©ÇÍÓÏŶ¶ÓƯે“ÍjÏÔÍÓçºëöµØºï½÷Úщ¾ÙÚ¿‰•ÖĐÅƯÜ9¥‡×‹Ç±»Ó« ©ƒ»5ƯÀÛ«‚ ½9—âÏÅá ơêù×ñÚ÷å5Ó«‡“ÍjÑ·ÏÔù×ÏŹÚÙ½›¶é¿¹ÍÄÅ»¿Ø‹ÇÙ½Ơ͇Ö8æ¹Ú­ÄÏÅ‹Ç߈ĐÄêÛרơêщ·‡‘×8çŸßÑÓ¯à"øê‹Ç¿ßרß»ûÁĂĂº¥Ø™‰kß [ïSÅÔí‡ơèÅŸ™ôÙ½ùê‘—½ÿ¯¶ÙÜÏ̉±»³ĂÙÛº¥ØÙ½ÍÄÏÅ“Ơư“¯È…Öï̉߈ơÔÛ«‚ ½9ơêŸ}‹a‰¿I¾ơ‡¸Úÿ¯¶÷Áƒ½›¡ưÀé‰ñ5ñ·Ÿ}·Ü \¯à£‡™Ô‚ØÁƯ±»ỡĐÅ“&‹Ü½­Ú·Ôù×ÏÔĐ¥È³ºóÜÓ ÏÔ‘«ÍӃԨǿ»€º‹ÓŸ}Ù½àƠÙڭijàæ4ÄÓ™‰kß [ïS°½›¾ù×û¡Ô¥Ö­€ỞµØÓÔ£ä凫·3uU‰¼ơêÀ¼¹ÚơèŃ֫»¡ÈÁ¾…Úª‚ +¼9«âÍÓÏÅívÙ̉ÚÆ ›¾½çÚ߈ù×§Ô÷å5ÓƯÓ ̣%Á½ù×ăàĂ·ô߈ßÄÙƒˆ¹Ú‡ëöö©ÇƯÓ ÍĂä× «‡“ÍjÏÅ™‰kß [ïSÏÔ³«·3uU›¾ÅÙÏÔï»ÿ¯¶ÍË)éÛ9¥“Ơ¯‰¯0º·‡‘×8çô÷ˆĂèơÔ½½µaÜÚÁ¹¥‰ÍL……Œăà¾߈ǡȢqºÅÙÜÑÓÛ«‚ ½9¬Ä »Ûù×›‡ÙÚ…ö¹Ú©Ă™‰kß [ïS«ÓººÈ“¹ƯNơêчëö°»ëöÙ×­½¼½ÔÛÄÓưÀ•Èû›±»ĂĂÙ‹Ü£äǦͼ·Ô«ÔñÖµÚ¹Ú÷8¤‡×™‰kß [ïSív°»ơèŃvƒvËÇ¥âưÀ¾ĂȵطÅ×Ü¥ºŸ}ăàå̉ ÿ$ÓØÑĂú̉ƒàÏÅÙ½Ö¾ÙÚ÷‡ƒv«‡“ÍjÁÆ©‡¥2ßëMƒvö½™‰kß [ïSăˆŸÛ«‚ ½9·ÈªØ ă‘·±»½g™ Ù×É»™‰kß [ïSÁƯçÚû˃à߈ôéà ¡¼·ÅÀ¼á«‡“ÍjÔXñÖĂå¼ ‘ÔỞïÂÿÚÎÅ߈ÿ§߈Ÿ}ù×ÙסÈжÁ‡xĂá×™‡¹Ú9¥‡­Ø¼Üÿ¯¶í½×ƠơèÅÏÅÚºóÇÚÀưÀ»ØŸ̃«dÏÅÛ«‚ ½9½³ÜÑÓ Ëû¶èï½™‰kß [ïS“º߈Û«‚ ½9ßÚÏÔÑÄëĂÙײ˜‡÷ÁàĂƠ­ÄÙ½9¥‡—؃ÖüÀ©‡¥2ßëM§Ó߈ø¼Ç…&éơ‡ÛơÔ¡Ô¿»ÙŒë*«Ë ù×Û«‚ ½9÷Ú¶èƒÚ½Çâ÷‡ưÀĂÙ½˜‰j̃ZîSÖØ ×$9¥‡çÚƯºäĂëöǺ‡Û̃ˆƒvƒØ¡ÏÅÑÓƠ×ÓÇÖù׳ºóÓØëöÛ«‚ ½9Û«‚ ½9ÿÇ¿‰·ÔÅØ¿ô퇩ӦÆ₫ÇÍË)éÛ9¥9¥‡ÿ§†Œׯ±»Æ»ÏÔû(±»½ƒv•¾IŸ-¯¾´•ưÀĂÙ›¾½·Åш«‡“Íj函¬Ö «‡“ÍjµØÁ|ù×¾•×ëÓ·‡‘×8çưÀ©‡¥2ßëMƠ߈›ééê߈áßĂºÇÖ“Ơù×Û«‚ ½9«‡“ÍjÏÔÏÔº£äëö÷ÁÖ¾°»¯ă½¹ÚÙÚëöÓºùשӡȼϺ8¤‡·‡‘×8çØƠ»Ø“ƹÚăˆŸ™‰kß [ïS߈¿À¡Ôƒv¯ÿ™‰kß [ïS‰¿IÛ«‚ ½9Ư‰Ơ߈çÈå̉ ƒØ©ØŒ¾ú̉«‡“Íjóùé§ô¿́¹Ú9¥‡ƠỞ™»Ù½™ÛơĽÅÓû‡ÇÂăˆŸôêơèÅׯ‘÷ÁƯÓ ‹ÇÛ«‚ ½9÷ÙÙYơÔơêù¿·ÔËÇ—>ù¾¹Ú¿¹ߌÛ,½ôÓÁơêăˆŸ;ÑĂ©¼«‡“Íj™‰kß [ïSĂÙÁÂăˆŸ;k­Ä‹ÇÙÜÂÙ™‰kß [ïS™‡ÓÓñÓÙ̉Ûºáê©ÇÂÁ̉ш°»¹ßÚÙÚ«‡“ÍjƒˆóÂ9¥‡ËÉ9ù×§ôçÚùôËÇ6«‡“ÍjĂÙ±¿ăÁ—¾¶º½Ơ¹Ú˜‰j̃ZîSÀÓ˜×ÁËÿÚ·‡‘×8ç߈»ªÏÔ™ô§ôí—G±»­Û«‚ ½9Âë§Ïļԋǘêèä›¹ăˆŸ;kœ·̉ ¤0›¡ͽù×ïÍ…ïƯÓ ó#ƒÚăˆŸœÂËÉ9Å·©ÀáêăˆŸ;ƠXÅôéêö9¥‡8¤‡ßÄÙÁ̉¡ÛÙÚ†ºùơ½÷¼ơĂ½™‰kß [ïSăꙉkß [ïS·Ô«‡“Íj°»¹ÚÏÔùסÔÓØ÷ÁĂÑÓ¯‰¯09¥‡×éÚ‰¿Iíêùæíváùêï½ÛÄÓôêƠÄô‡Ç̃„‚vfÅÓ廆×ăêÓØ¯ÆÙ½¥‹Û«‚ ½9îDÍäƠèÿÚëöÛˆ÷ÁÛ«‚ ½9ÍÄ(›¶é‡×½Ô¡ÛåôÄÔƒÖàĂ µØ•́¡ÈƠƒvÖ¾8₫¼ Û«‚ ½9«d¯×—¿ăˆŸ;ĂÙù×Û«‚ ½9›ÚƒÔ߈°»9¥‡÷âÚƒv÷ÁË¿¹ÚăˆŸ;k›¾Ç̉¥ˆ]1À½±́ÊÚÛ«‚ ½9ù×±»¹Úäëö¡ÇÂ߈—»½ù×·Ó ¥0½­ÄÏÔ™‰kß [ïS¶Å“¹ƯNơÔÓà±»éÓ«‡“Íj߈Û«‚ ½9ăˆŸ;™‰kß [ïS­¾¹ÚéÚĂƠù꛹ơê—ˆ™‰kß [ïS°¿ơÔ—¶¡È˜qăˆŸ;ƒëö‡¹§Ó½Ë̉̃»ú×$ƠÓ¾÷Ô₫8¤‡ơÅëöÚª‚ +¼9£ÓÿÛăˆŸ;çô«ÔÙ½÷Á¿Å‡Œ™‡á=™‰kß [ïSª¶2tT³Æ™ëé嵨áëÓר“ÈÓ´½ÏÅéºË¿ÓØăÁŽù×ăˆŸÇñÚµØ÷‡ƒvÛ«‚ ½9¡»©‡¥2ßëMëöơèų©ˆÅÓ•ŒµÜ€º¹ÚÙ½» «âù×÷ÁºÛ«‚ ½9Á ơê•Œă‘·8¤‡¿‰å̉ ™‡ºÙÚ÷ˆ«‡“Íj™‡ÖÆÁ߈éê麡Ôß»û¡Ô‹Ç§ÔÇØ½€Ă½^ƒv߈¹Ú»Ă¬È¥ØÅù×¹¶ăơăˆŸ™×âˆ;«·3uUĐĂăÇí¾ù×߈ù×ơÙ½€ù×߈·Å«‡“Íj‹Ü™Á£Ư¡Ô±»ăˆŸ±»Ù€ƒvÍÄ(±¿ƯâÁçáÙ½›¾Ư‰î²2ù×Í­Hëö¾ßù׿‰‡~ívùÜóăàçÚâˆƒÅøô½€Ù½Û«‚ ½9«·3uU°»¥Ø—¶¨¾Ï̉ÏÔ™ô‹ÇµÈơÔđӥǘ‰j̃ZîS·‡‘×8çù×ÍÓ½÷ˆÅÔ¨¼¹ÚËÖéÓ‹ÈÏſſ‰¡đùôưˆÏÅéñ¹ÚĂĂ ›­±àéṂÖÛ«‚ ½9¡Ơƒ«Ô«‡“Íj±»‡Ûˆ‡ùêæù…&ăˆŸ;ăˆŸ;—»ÑÄëéӓܹÔù×·‡‘×8瓹ƯN¡Èơ$«‡“ÍjưÀ›·ÔĂÙ¡ùơÏÔÓà§Æ‰¿IϹƠ÷à‹ÜÅÓµ÷ăˆŸ̃Û«‚ ½9¬Ö°»‡´ăÙ Ëû™ÓÑÓ½ÏÔăơ×¾‰…ÓíÏÅăÔ‘ÛÊÇ“Ơ›»™‰kß [ïSÅØÁËçÚù׺±Ư‡ĂÙ¥±ñÆ™ëéåؽ­Ø«‡“Íj«ŒưÀûûµ‰ÀĂ‹ÇöÑÓ‹ÇÚÆä̉Ưै]1éºĂºÙ½±»«ÔăˆŸ;k߈ëöœ́ơê߈ÅÓ·ôơêÛ×éºËÉ9óÂù×´ĂÙŒë*«ö°»½¡ÛăˆŸ;kắ9¥‡ưÀÏÅú ƒvÛ«‚ ½9ùסÁơêáĂÛ«‚ ½9ăơÏÔŸ©¼ăˆŸ;î½ûÓăˆŸ;kÅØ½^ƯÓ ÑÓ・…ڇŒÅ߈ÙÚéºÑ̃åð»¸Ú™ĂȫԜǙ‡íÁ·‡‘×8ç‚vơêôÑÓƠ£äƒÖ«‡“ÍjóÂï»±»ÙÚÁÁ&Û«‚ ½9©¼™‰kß [ïSù(‘Æ›¹Û áê ÈƒÚ.±»ë͇(ƯÓ ĂéÓ³¥ù×ăˆŸß„Ưj•Œ¾Ø× +ù×Ä–Û«‚ ½9×Ơí—Gơ꿉¶ô†ºăˆŸÇÖ½½‹ÇăˆŸ³ºó¶.è.ƒvϼÏĺôƒv“Ơ¶Ö»ÅưÀÙ½±»ÅÄƯÓ øz3ë©Ó«Ô¡Ô·‡‘×8ç»ÅơêÁỨ‡ëÓĂÆ§ÔË%ÑÄë߈­¶ÅÓó¹éº9¥‡“Ʊ»ăĂ3ĂÁĂïƠ›¶é÷ÁׯơÙӫⵕ߻ûĂÙ˜‰j̃ZîSȹ +ĐÄêû¶ăˆŸ«‡“Íj½ĂÈçÚ—Óăº¡Ôø×º•ƯÚù׋ÜËƯ³®Gø™‰kß [ïS•%ÏÔ÷ÁÏ̉ÙÚƠÅ·ÔÏÔ‡Œ‰ÛµaÏŲ¹ëöƯÓ Å»ĂÙ¡È—¶ؽ™ÔµØÛ«‚ ½9ç̃ëöå̉ ñÖŇ“‘Æ×Ơ°»¿º…ÖàÅ­ÖăˆŸĂÙ·‡‘×8ç·ÅÏ̃ăˆŸ;ñÆ¥ˆ]1©Ú̀Ó—¶«Ú±¿ÿÂá=ɇרÁÓÛºÏÔăù×ƠXûÓĺÓŇºµØÇÖ½€ºăˆŸ;ă»å̉ °½Ơ—ˆ›‰ù×€‹Ù¨¼ĂÈơÔù×½ơÔ§À»‡½ÍĂ½Ôä̉ƒÖø «‡“Íj߈Âùêẳäô›¶é÷Ú×Ú¿ß«‡“Íj8¤‡³ÂÅà¥Æ·‡‘×8ç₫®¶âÁ È«‡“Íj™]‰¿IšۋǙ‰kß [ïSØƠ™‰kß [ïSưÀÛƠùêóƠưÀ©‡¥2ßëM£ä̃„á Ú ª ‚  + ¼9 ívÙ½Ån™‡ï‰ÿ¯¶áÅôçÅĪګԘ‡¥ÆÁ çÚ£ÇÙ½µØÖƹÚåÁ̀Ó½€‡©‡¥2ßëMÓØº°»ăĂ3‹Ç™‡ÛˆÛÚƠX¦Æ‰¾ª‡’̀jÙÚ±»åÆÇχŒº“Ơ«Ñ·ÅưÀ·‡‘×8ç–‹ôễ»úÙÚÙÚÙ½‡ÏŧÔÁ‡é/×:çÏÔƒv“È»ØÚª‚ +¼9˜‡ƒˆÏÅơê³߈›¹ùæăˆŸ;kỞ½±»ăˆŸ;Û÷¿́½Ô9¥‡±»ƒvºĂ¶ØŸ}ơ»ëö½´a£Ø¹ÎÙÚÏ̉釋ÇÁÏÔĂÙ·‡‘×8燓ĂÓ£Çô›¶é™ờÇ ÏÅ¿‰шÏÔơƠĂ¼§ÓÛÀŒ¾™ëéåêö±»ÁííÁƒv߈ÛÀÁ Ăº«‡“Íjù×ùøê¹ÚÏÔƒˆíÖ¡Áµ¤ăˆŸ;ù×ö÷‡íغy¶ÙÚăˆŸÏÔ“Ơ¾º‰yÙÚÏņŒ±»×Ơ‡“ÛºçÚÛ«‚ ½9³Â°½ƒÀÚÀƒǼ÷ÁáƠ¿»«»åŒ¿NÊ%9¥‡ù×ĂĂ ›­±àéM—»±»ÑÓ›¹ÛÀưÀñ©¼µaöù×½ÔÛ«‚ ½9ªÚ·¼Í7­ÔăÁ°»÷ÁáđØ×ơÔ¡Áád·‡‘×8瓹ƯNû(«Ó߈ÏÔ™Ó©¼ù×›‰Ù×ÅĂѶÎ̉ƠÁÔơꙉkß [ïS¡ÛÑÄëƒÖơĂû÷ÁµØëöíßÄÙéÓ»ÑÄë±»ƒÇׯ©À匿N¡»ñ”Û«‚ ½9°»ó×–Œ—¶«‡“Íj¤ÆÛĂÈ ÁÿÛ9¥‡åÁÁË¡Á›ÔÛ«‚ ½9ÏÅ—Ó÷Á•Œö« ©ƒ»5Ơ‰Û»ØÛ«‚ ½9×̉‹Çá ÏÔ£Èï²2°» Á½çôÅÓÓÓÔä̉«‡“Íj¢»÷‡ØÓ±đÛÀơÔ­‡»å̉ ƒvç'½ë‹­Äë¿áêͼ½“°ă½™‰kß [ïS½±º­¿ÏÔ¯Èè¼¹Úï³2ăÁ™‡ưÀßÖÍÓ™ơ½€‹ÇÅÓ™‰kß [ïSƒvß»ûëö°»đÓÏÔ±»Û×Û«‚ ½9ƒv™‰kß [ïSéÚûƠ›¾ÆØĂÙ±»ÑÄ볺óëö—¶¬ÄÇϼÍĂ¿ñÙÅëÑÓª‡’̀j°öÁ›¾ù×ÙÅëϼ½¿ß©Ç½ÑÁĂ•×Ù½ùÔëöù×I£äßÄÙÁ̉ËÖÅÈϼƠ¾G›Ô¤ˆ\0ÅÓ¿‰êơ ëö­ÔăˆŸ;¾ßÙ½óëöĂÙăˆŸ;ó™ù×Á ÿÚ“ö¿1ÂƠ©¼ÁĂÁĂ«‡“Íj÷Á¥ñ¿Ơ9¥‡½ñíÈùê§ÆăˆŸ;Ë¿ºÏ ÿÚÁĂ·‡‘×8ç‡x—‹Ç¹Úơèű½½ôÏÔóÇ—§Í»ĂÙùêÙ½ăˆŸ;kÙ½Û«‚ ½9û†ÇĂ ë̉˜‰j̃ZîS­ÄÛ«‚ ½9Û«‚ ½9÷ÁĐÓÛ×Ï̉¢Ù½©Óù×°»߈öƒvăˆŸ;ƯÓ µÈ…á·‹߈¼Ü…½³»ĂÙŒë*«ùׇx Ëû¹ÚßÁù×¹Úñ̉›à±½‡$ùרËÉ9“ƠŒÓÛăˆŸ;ưÀÖÆ©Ó»Ó±¿Ươ߈»Å‰±±»µ‰±»”{·ÅçºÁ´¥µˆăê‡×«‡“Íjù×ù×âà¡Ô™‰kß [ïSˆÁ¹›¶éÚ×ĂÙĂÓ±»ç˜‰j̃ZîSÁ½ÏÔ©‡¥2ßëMµ±½ív½½³(ÍÄÛ×ß»û×ƠáêùÅôưÀ›·ÔÖÆËÉ9ÏÔ¿½‹Ç©Ç‰Á™Ûï½ÉĂ™‰kß [ïSËÉ9ùש¼ưZ©Àѷ﻽ôÛ«‚ ½9ñÚ‡äÿ¯¶™‰kß [ïS·ÔÂĂó¦ô•ŒöûửÏÔ·̃ñÇ«Ôß»ûƒÖơêăº…Ø°»Ú×±Ô°»ÛºơÔÛÇÛ«‚ ½9ÏÅ¡»Û×ÓºÀ̉Úª‚ +¼9¶ÔÛºÙ½ơæù×Àñ̃½ưÀÂÓ½Ô퇃Öăº߈áếÆ ơÅôµ‰±»ËÉ9ùÚöù×—¾óÔ¾¾£»™‰kß [ïSïÅ߃v÷ÁÑ·±ÁơÔÀ¼­Ä«̣¯«‡“ÍjÀ¼ăˆŸÁÖËÉ9‡ÇĂºÇÖöÁùׇ˜Y­½¼·Ôƒvø×¥<ÿ¯¶·§D «‡“ÍjưÀ³ïÀ́ơƒ½ỞßÚƒv·§D §Óñ¹™ µØëö«d½ËÉ9Ñ·›vÏÔßÁ‡Ç߈Û«‚ ½9„ÚÏÔÛÚª‚ +¼9Û«‚ ½99¥‡¡ÈçÚÛº›¶é€ºăˆŸ;âºÏÔ±»ăˆŸ;‰Û›¾ëöñÚ¾ºy߈Û«‚ ½9ëöƒv½ù×·̃¼Ă™Ô—ˆÑŹÚÛ«‚ ½9ùêш­Ö·‡‘×8烇ŒÂÈ­Ö†ŒĂ ̀Ó(¬ÖµØđÖÓØ÷¼™ÓÏÔ·‡‘×8ç÷9¥‡¹ÚÙÜ»|ÿ¯¶©‡¥2ßëM£ˆÓżêÔăˆŸ;åÁß½9¥‡×œÁ®Ơ«dÛẲÍÓăˆŸơ·§D ù×á ±»ưÀ˜‰j̃ZîSÛ×ɇ·Ó ¥0‹ÓÍË)éÛ9¥Ó̉ïi±»ËÇÁåÀ½ÑÓÚª‚ +¼9ÇÖù×—¶ơÄ»‹¹ÚèÚß»û±»¡ƠÅÄĂ˜êèä°»ĂȽ½̀½«‡“Íj“Ơ¶Ø•Ùڵغƒ³ëöó·¼Í7ƒ¾‘ù×ÓØ™‰kß [ïSßÄÙƒ[«‡“Íj±»ápÿסƠÏÔ‹Ç·Œ“ƠÏÔ”îíêñÓËǛڇÏÔ¡»±»©Ç½€ÇÚ¿‰«‡“Íjëö¾±Ç₫½ ĽăˆŸ;™Û«Ôù×‰ÍL…¹ÚÏăˆŸÛº›vÏÅÙ½Ù×÷Úÿ¯¶½ƯÁ¹«dÛ«‚ ½9ưÀưÀ«‡“Íj±»Ơº‚³ µ‰£ØÙ½«‡“ÍjͺĂÈ߈Ë÷÷Á™‡ƒv¿‰Ÿ}ăˆŸ;›¶éơê¯ÈÛ«‚ ½9ùêÙ½«‡“Íj·ôËÖ߈ËǽôïÚ—ˆËÉ9é‡ă»ËÇư±‡‚½ÁĂÅívªĐ«‡“Íj·º¿º¶èÓÅÅÁ™ôÏ̉¡Ø×ƠíJ™Ô«‡“ÍjƒvŸ}Å–ăˆŸ¥Üß»û¾Ù½…»ôÖØ"ÿÚĂƒĂ¶è₫¹µØ÷ÙăàÁĂ·‡‘×8ç¿»ơá¬åĂüÀ¿‰¢Ç¥È™‰kß [ïSĐÓ™‰kß [ïSù×µØ÷Ù¾Ăáêûù×ăºÓؼÔË¿×Ă¡È—¶Û«‚ ½9à¼çă»Ø­Ä× ¹Ú½ỮÏÔ±½9¥‡×ăˆŸ;¢X×ܱ»߈¯×ß»û¬§Ô™‰kß [ïSר×ÛÛ«‚ ½9ËÖµØóÔ—ÓÇÖñÓăá÷ÁºÛ«‚ ½9ëÔ½©&íváÛ÷‡çÚÍåƒvƠîÅ8¤‡óÂÏÅÍÓív9¥‡±»ÏÇĂ¯±»É̉ô½·Ó ¥0Ï̉»Åëö™‰kß [ïS«Ó9¥‡Ó½€ăˆŸ‡ºÑĂơêăˆŸ߈ĂÙơêÛ«‚ ½9‡“½ív”‹œHá™ơùêƠºÛ«‚ ½9ơê‹ÜÅØí¹ÍÜÇÖœÁ&£³«Ô°»߈ÇĂá±»ä̉å̉ û̉ùפˆ\0ÏÔÛ«‚ ½9ăÁ™‰kß [ïS¿‰Ÿ`ÑÓ«‡“Íj«ÔăºÏŇکǂv¹Ú±»ºù×­Ö›¹ơêăà߈µưˆÙÚ‹È0û9¥‡×Ÿ}Í­H¸Úëöù×ùëéêÛ«‚ ½9ƯÓ “Ơ㮫‡“Íjù×¥v¡Ơ…»9¥‡ưÀ§¹¡««‡“ÍjÏÔŽÿ‡ß»û‡ŒÛ«‚ ½9庙Óăơ˜‰j̃ZîSÁ̉¼Ôµaå̉ ơŵ÷ƒ×™‰kß [ïSơꥉÍL…©¼ÍĂĂÙ¥øº²ÈÏÄóÔ…£­ñÆ¿‰óÇơÄøê¶ÅßÖ™‰kß [ïS½®¼ ù×Óº·Å…Û•Û«‚ ½9ĂĂ¡Èß»û퇽ÜñÆ×Ăÿ&ëöÛ߈ăˆŸ;éÚăˆŸ;ºy£»ͼÙ½ÙÜăơç̃çÚåôÛ«‚ ½9È̉Q߈ă.÷ỘסØÛ«‚ ½9·‡‘×8瀺Ø×çÚ—…ƒÄÛˆÿ¯¶áÅ¿Åͼ±%ØŒê*ª’½éÓË÷«·3uU¿Å½ÏÄͺ§Ôÿ‘•×ÑæÙŒë*«̀Ó™‡°êØïÚÑÓ₫ªÔ×ËÓº²ƠׯăˆŸ™‰kß [ïS‚vÛ«‚ ½9µØÓ¾Û«‚ ½9廽€ͽßÁíÚ±½‰„ƯÓ ™‰kß [ïSùׯ́ơêÏ̉ÑÓç4„ÇƯÉùסh¥ˆ]1ëØº̉u°»Ï|ù׃v±»Ûº߈ÏÔÑÓƒv‡ñ5ɱÙ½ÇÖêÓăˆŸ;kHÁ»ƒv·̃ß„™‰kß [ïS߈»Ø¯×ưÀÏÔÁƠ’Ǿ«‡“ÍjơèÅ·‡‘×8çÏÄÉ̉߈ÛÇÑØ™‡ù×˿߻ûÙÚÏŃv߈ơêçÚÎăˆŸâˆ:»Áö³ëö¡ïôù×é‰ñ5ñ·ơĂăˆŸ;ù¿ƒ–»ÍË)éÛ9¥±»»:™‰kß [ïS8¤‡×÷ÁïÚɃ½—ˆ±»ßÚ¼Ô¿‰²Èơ9¥‡™‰kß [ïSôêÏÔ•Œ†½ƒ#Á¼ù×½ƒv9¥‡×ƠG½¹·Å÷‡»éê¡ÓÏÔÁĂå̉ ½ÙÚ¯ÓăˆÚ×׳ï³2µØ¶±ëØÑÓÿÚ9¥‡߈ïƠ›¾Ž«‡“Íj«Ô¿‰åĂ‹ÇơêơÔñÁÍÄŸ}ÙÚưÀ«‡“ÍjÑÄë$—Ó¯¾±Å‘ƒvÙÚª‡’̀j…Ö÷Úÿ é‰ñ5ñ·£»±»ºỵ™‰kß [ïS󻽫‡“ÍjƒÖơĂ™‰kß [ïS©£±½¢»êö±»™‰kß [ïSçÚßÖ«·3uUÇĂăˆŸ;ÇØÛÀɇ%½ô¾•Œ±»…Û¡»ö´½;ĂÙÍÓÇÖ߈éç·Ø߈“Ç«‡“ÍjíØÿLJϿÛêµaÏ̉×ÜăˆŸëöÍƠÏÔ¯¼‹ÙĂº±»µï½Åm¯£ÔÙÚ¯‰¯0ĂÙ÷‡ĂÈ©ØÀĂ߈¥‰ÍL…ÙÚ“º±»×₫ŸÖÅÓ§ôásç¾ÅÁË¿8¤‡¹ÚàщĂÙÑÓ«»±»©Ó”ó¿×ƠÙ½Û«‚ ½9±»ăÇí¯È߈9¥‡×®ÛÍË)éÛ9¥Æô÷‡Ă “ÈÏÔ‡Œ߈ăˆŸ;k8¤‡™‰kß [ïSÍÓơÔ©à³ùê¤íù¿ź¼©ØíÖÑÓù×Á竇“ÍjË¿ơĂ߈¡Çƒơ¯È™‰kß [ïS½â“Ơß»ûχĂÙăÇíÖºăÇí‘⪇’̀jÛÀ‹Üëöÿ¯¶ĂÙñÖă½¹ÚùןÖñÛ߈ï½×µƠœ.ƒÖÛ«‚ ½99¥‡×å̉ Ù½©‡¥2ßëMăˆŸ;¿ßỊ́ßÄÙív™ơ¨¼áê­º§½À+çÚ°»ÇÖÖ߈ƒØ°»ùש¼÷ÙñÓ—µñÚù׿Ø߈ôê·‡‘×8ç­Öû̉¶ØûØÓ̀¬H·‡‘×8çƒvëö‡ŒÿÂù×£ÿ™‰kß [ïS«d¥Ç¬Ä—ºÅn£ ¹Ơ—¶ñÁÓÅ—¶̀Ó·cÍÉ«‡“Íj©‡¥2ßëM©v³àÛ«‚ ½9Û«‚ ½9߈ù×íơ‡Ç·µƒº…(˜‡ëöƯơñƹ֫d«»éÓăˆŸÚºµØ¡Ô§Ôׯ¾ßá߈Ó̉±»™ÁŸÖơêöÁơê“ƠéÓ£X™Á£Xÿ¯¶ÍƠÁÏÔÛ«‚ ½9ñÆÂÓµưßù×߈Ơ'Û«‚ ½9ÿ¯¶˜‰j̃ZîSƯºƒÖÛ×Å–½ר߈‹àÏÔÁÿÂăˆŸ;k÷ˆûØÅØƠÄÄÓ9¥‡‡Œº-ëö‰Û™‰kß [ïSÛº¥ÛÛ«‚ ½9ÁƯíÖ¹ÚëöăơêĐ`ËÓÿÚëö÷ÚöºØẳăˆŸ;߈ưˆÿ$±»ɇÍĂƠƒvù×÷ÚŸ¿«ÔăˆŸ;kÏ̉öƒv‡Çá¬ÏÔÙ½¤ˆ\0ÑÓ“Ơ¸ÚăˆŸ;¿Ô‡¿ù×₫®¶ëöêö‚×ߌ½‡‡Œø×Á½˜ÔÆÛÄÓˆÙ½ĂÈ«Û÷Ô–À§Ơ9¥‡Á̉¾‰8¤‡Û׉;¹Úå̉ ơêø×ÓÆ×܃֫‡“ÍjàÓẳÈ€»¾±»ù׫ÔÓÁä̉ăˆŸƒvơ$›Ô½ôïéºăˆŸ;kÙ×÷$߈é‡ͽ…ôÄô8¤‡×±»™ëéåă‘·Çø¾÷å5Ó´†êơƯơׯÁëËơêŸ}¤Æ +XăÇí©¾Óµǽÿ¯¶ÂĂäô­ÖÅØÖï»ÁĂïç·‡‘×8çÑÓĂăˆŸ;k­‡Û׋ӯȃưÀÁ܉¿I¬Ø½¾‡ăˆŸÛ«‚ ½9˜̣ɶ°êØׯăˆŸô¡Û­ö±»«‡“Íj™ưÀçơÁ̉ÊƠ³z̃Œ Ú,Ÿ}½ƒvơê‹ÇÍƠ‹Ù‡aù×…ö÷Áº³ºó¥ÆÁ¹•Èû›ù׃׹ڇŒ‰¿IçÔ¡ĂÙÛ«‚ ½9ñá Ể +÷$¾©‡¥2ßëM‰¿I°»½ÔƒÙÚ×5³ív›¶éÏŽ€·ÜỂƠ¾G‡Ç9¥‡‰¾ĂôŸ}â½›¾×¾§ï½̃ˆ›¾µ†³ºóû̉÷ÙùæĂÙ‡Œåî—¶¡»«Ô“º·ÔôÇ©‡¥2ßëM—¶ÍÄ·ô§ôø×#߈åºĂº±»ŽÍË)éÛ9¥«Ôôêׯäđ»n¡Óß„°»½!îŶèƒvϺ†îưÀµØ­ÄáÅÙÚøê™‡éºăˆŸ;kÏ̉ÏÔ¯¾ö€½Óº±»Ơ±»ËDZ»»Å“ñÏÅ‹¨ç̃ỞµaçZçm‘÷›¾ẳ±»ÓÅ›¾ăˆŸåÁÏÔƠ™Ô«Ôƒ°»½ÔÙÅë“ßÚùê‡Çº·‡‘×8ç—»ĂÙĂºÙÚר»ă½€Ë¿ÔƠÏÔ§ÓëÖ߈—»ËÉ9ĂÓ¾«‡“Íj™‰kß [ïŚØÏÅĂÙÛ«‚ ½9½™‰kß [ïSÖÔ†6¦jÖÓÑÓソÅăƠëöçơê¿ß©¼ëÚÚÀ¾ç·‡‘×8çƒvÍĂƒÿ¯¶ưÁ¡ÓÙ×Ôºl«‡“Íj™Œ̣ÂÏÔöỞíÁއæÚÄ̉߈½ƒÖÓ¼ÏÔØ¬¶ơÔù׃ˆ±»°»ñƇ׳ºóÙÚơÔö¹ÚùׂØÙŒë*«ù×§ÔÁĂÅÓؽù×ÑӢDZ¿Ú×9¥‡×Ơä̃™‰kß [ïSæ'9¥‡ơêºÏÔÿ¯¶êơêƒÖĂ™‰kß [ïS₫Đ—߈ÛÆ­Äøơÿ¯¶ơêƠ»߈ÓØ©Ç‰¿I›¶é“È…ƠÑÓÁ̉™Û±óÇÎÄÏÔÍË)éÛ9¥ʾÛ«‚ ½9ÓÆ¹Úíê•΃vƒvÛ~±»ƠµØÑUÿ&¹ÚöÁ«‡“ÍjÏ̉ƒ[¡È©‡¥2ßëMÏÔ›¾ăˆŸ;ÏÄ¡Á¯¼ûÓÑñ¿éêɇ9¥‡×½±ØÛ«‚ ½9÷ˆ©¼%ù×ă¶ö® â´0„Áă¹Ú›¾ÂÙ½«ßñÓ±»‡ĂƯÚçÚëö½ɹ¥Û¡Ơ°»Ûºù×¾ăà®Gøù×¥Ó¡ÔÅÓ×Ó±»µ£˜‰j̃ZîS‹Óɇẳ‰¿I›vß»û‰¿I¹Ú«·3uUÓÂăˆŸ;kÔXû(£Øùש¼ͼÿÚÛ«‚ ½9ưÜ9¥‡Ÿèêöáêááß„·ÔÂÙ߈ÏÔ¾¡%‹Üô‡‚vêö߈÷‡ÏÅăơ»½ơ»÷Á‘ëï»óÔçÏÛ«‚ ½9å̉ ÑÅ±ëØ—¶ëÔ¿ÊåĂ¹̃Ù½߈ÏÔ“½ơØÓÛ«‚ ½9¹Ú¥ˆ]1£äÏÔƠÁ½§ÔÇÑÓÙŒë*«ăƠ™º›ç߈¥â£¨ûÓ‹Ü߈ÇÆ˜ÔÙ½ÍÇ™‰kß [ïS§́ƒˆơØ˾ùêƒv‡ŒưÀơêĂÙÍÄÙÅ뫇“Íj‡“³×§Ø÷ê°»“Ơ‘ƳØĂĂăˆŸ;k‚½ ƠÍƠíÖŸ©‡¥2ßëM›¾¶$$Ú¹ƒÖÛ«‚ ½9ÅØûƠ¾GÛ«‚ ½9ưÀ÷‡ùêÙ-¡ÔËÉ9ơê½ëööªÔ߈§·Ó ¥0¥‰ÍL…ÑĂÛ«‚ ½9£ £»ăˆŸ±»ăˆŸ;ºÛ«‚ ½9ôêÙ½¹ ™Á›¶éͼƠ½ôỞǽƒÖăà±»ÑÄëÏÅǼä̉»ô·Øà ½€ŸÅÎ ́ăˆŸ;ÎŰÔÛ«‚ ½9߈Ù½©ÓÙ½ùê¹Úߌ߈¡È›Ú߈˜àÙŒë*«ƠäÆÏÅ™‰kß [ïSËǽ­Öü Û×Ơﻨº%‡™‰kƠơêÉ€ƠñÆ«·3uUÅÄỔ“ÆÏÅ9¥‡ĂíêÛÀιÿÚ±»‡Œ»Ă¿ÙŒë*«ׯưÀùꡘêèäƠX™‰kß [ïS¨ŒͼÛ«‚ ½9×ÜÑØ߈ÜÑÓº³Æ±»½Œ¾‡߈³Èª»ÍĂá Û«‚ ½9߈­¾Çɱ»—¾ƒˆ“Ơ¡È·Ô߈¡Á¸àϼŽùש½ơØÅØG½¹±»÷ÁµƠ÷‡%ß»ûÛ«‚ ½9ÍÓÇÖßÄÙ›¾ƒv™ơ©Ç—Œç"ĂƠñÓƒơÑĂéêƒÖÇȃƯô®GøÛÀͼàêëö™‰kß [ïS¯ùë߈®ÓúƠ½ơ»«³…à‚™‰kß [ïSß»ûĂƠ“¼Á̉¿ß¬ÖơÄáêå̉ ۈܷØ×ܹڋÜëÔ‡xëö«Ô½€ĂÙ£Ô™‰kß [ïS±»ôñÓƠáÛ—¶½§Óܾ›ÈăÁÛ«‚ ½9ƒˆÚ×ÿ¯¶ù×ùëêö؇Î9„½ÔƠÀĂù¾ÅÔŸÈùæí—G¹ÚÁĂÛ«‚ ½9°½ï‰Ơ¡«§ºÅØÅ­ÖÁƯçôù×áêÏÔÓԵءƠ¡»ÂĂñÚ±¿ÏÔŽ¶¥Æ÷ÁưÀ÷Ááê‡ÇódzƎơÅºÖÆ´È'¾ë׃v½ôĂÙ•Œ™‰kß [ïS«dŽĐĂÇÖÇÛ·‡‘×8çË¿·ÔẲ›ÛăÂÛ×ù×·Ô߈ƒÔ—Ó±»—¾Ë̉™‰kß [ïSµÈù׳ºóđàéÓƒÖ½ÚÓØ“¹ƯNăĂ3§ÛÄÓÓÅûÓÏÅùôăÁǺ«â‡’̀j½Èç̃›Hç½ư“Û«‚ ½9Ú +ª +‚ + + + +¼9 +ƒv÷ˆ‹ÜåôơçÇăˆŸ;‡Œ‹ø•ÜÏÅ81¤‡1Ñ©-Û«‚ ½9ăˆŸ;öù×ăà•½¿Ø³”ß„ƒvÄ–öµØÏ̉ÍuñÙÛ«‚ ½9ï»ñÚ«‡“Íj™‰kß [ïSơêÛ«‚ ½9©Ç¹ÁµÛºÿ¯¶¶èܺ «‡“ÍjÚª‚ +¼9˜‡óÇĂÙéê—»™Á¥ÖÏÔ߈ƠùºßƯÿÚø×‚Ô™ơù×Û«‚ ½9Û«‚ ½9ƒÖúê–Ó‘Á«dƒÔÎ̉‚؃—‡½‰¿IŸ«‡“ÍjÅÔƠơƒv¿ ©ØŸ\Û׋ÇưÀ©Óù׫ÔăˆŸÿ.³”êö߈Àñ!Û«‚ ½9¿Óù×ĐÁ÷Á¿Ÿ­Å÷ÙĐÄêÏ·ÙÅëÍÄăˆŸăˆŸ™ëéåßÄÙÁô«‡“Íj¿à÷ÁÊÖÙƠ‡ŒÅԥ³ƠÙ×Û߈ˆƠ¡Ư“Û¹Ú»ØăˆŸ®Ơï½½—¶Ô]ăö¡ÔñÔăˆŸ;¯ÈÛ«‚ ½9ơµØƒÄ±»ª‡’̀j¡Ô‹Çơïƒ,ÅÔëöÑÓ¿¹ÑĂơÔ«ºÂÙÇÖỞĂÙÙÜ¨Ø ÎÔ÷Áëö™‰kß [ïSÛ«‚ ½9¹Ú«döµÜïăˆŸÏÅ«Úç'ƒ½·Å߈ù׉¿Iá­åĂëöÁĂ¥º˹™‰kß [ïS™ơ¡Ô³z›Ú¡Ô߈щ§ÓŽ³Ø·ÔôÉó©ÓÙÓù×™‰kß [ïS¾µaƒ½̃ŒÚ,½ôÍÓơꘉj̃ZîS—Óëö«‡“ÍjÅÄåÁ“Ơ±)÷Ù÷Á±»9¥‡×¡™‰kß [ïSÚª‚ +¼9±“ÆđÓƒv¹ÚÛ«‚ ½9Û«‚ ½9ù×ÙÚù×ăˆŸ;ÏԷض‡Ö8æׯÁÀĂ×¾µÁƒv9¥‡ơê…ÖÛ׃½‚ơÔëöÙÚ“½Ï·È‡÷Á‡ŒăˆŸ;Ă¹à©‡¥2ßëM×ƠÚª‚ +¼9ÂÙÏÔ‰½Ùܽ¯Ô©Çö¶ïƠ±¿ù×ÅÓ¶ÜÏÅ̀ơÔÿ¯¶߈ơêÿÚ¼€߈½Ă·‡‘×8ç½Ă¡ƯăàܺÏ̉ăˆŸ;›·Ô·‹÷‡—˜½Ă¡%‹Ü±»ôê9¥‡Ù½ƒˆ¯¼ƠX«‡“Íjƒv•ÇÅØ«‡“ÍjóÇ“ÆÛ«‚ ½9ù×ĐÄê±»Á‡é/×:ƒv ́ơê©´¯ô«·3uUăƠ‘Óư§‡™‡·‡‘×8çû‰±ÁçÚŸ}¥ÇưÀ›ÚưĂÊ߈¥º¿‰ÁƠXÙ×½¹°¹¥È«‡“ÍjÙ"ñÓÛ«‚ ½9±»ÏÅô¥Û­v¨Ó¥ØôùדØĂÙù×ù׫»ÑÅơèŹڃv—áÇÅ߈çô½ËÇÙ½©‡¥2ßëMơꙉkß [ïS÷ÚçÚ“ÆÛ×±»÷Á¯*…»ÍÄ™Á¢äăˆŸ;kÁËÏ̉ëÔ›¯ÈÇÖÓ̉‚×­¾±»ÏẠ̊ÏÅ«‡“ÍjºÁ¼öÁÅ…»Ï̉³Â«‡“Íj߈Ă٣䓽ù×߈ßÄÙ£Ư™‰kß [ïSëÓÏÔ¡Ç›vµØ©‡¥2ßëMëöÓØÁ'ùæËÇÙÏÔ×ƠăÁ×̉…ö%£ä»üß™¡ƠÛ«‚ ½9ñ»«‡“ÍjôĉÁÙÜçÚ±ëØÅÓ¾áêºÛ«‚ ½9·Û±»±½‡ºÙÚ«Ô™ÔÏÅëơăˆŸ;«‡“Íj½˜êèäăˆŸ©ËÇ߈ÙÚàê½¹̃ÿÚºù×ÏŸȡÁơêƒvÚëØØĂßÄÙᘇǽ¸Ú…Ô¶èĐˆăˆŸ›‡±»µØ©¼²º̣ÍƠưÀ½™Óƒˆ«‡“Íjш³ ôÍÓ«»ÎÔ½½߈©ÓëöÙÚỞÙ½êÚ±»ƒˆíéÏʼn¿I±»8 ¤‡ Öƒv¯×ÛÑÓÿ¯¶œÁ߈É̉ºëØÛ«‚ ½9˜ÁÓ¹Ú÷‡ÙÅë÷ẦÓ̃ˆ«Ôæº-ÏÅĐĂɪÚ9¥‡ư¼€“¹ƯN±»ÁĂ™‡¿Å½Ô‚v³ˆÅØÙ€ÙÚưÀ¼Ÿ}«‡“Íjù×Ơ„LJÇƠ¡ÁêØö™‰kß [ïSƠºmÙ½߈™‰kß [ïSÅ»¿Ø߈Å£̀×ÓÜܱ»¶ăˆŸ;¶Å¡Û…ô›¡ó“רÅÓÅØùêÓØÁöÁóª¶2tTơê9¥‡ÏÔóÇáÛ›¾ÁƯ­ÄăˆŸ;Ï̉«â»Å¡»₫¡ÈÛêö ×¼ù×Ù×ǺăˆŸívïi©%¾³ºóßÚ̉̉¯×ÿÂ÷‡߈—Œ߈˜êèäËÉ9ù׃ÿ¯¶ù×íºó×ÜÍÓÍƠ®ßÚ‡ºëöƒv½Èù×§Ô‰º¾¥‰ÍL…ç̉ơÔï³2«‡“Íj«‡“Íj‡Ç›ĂûÀÂÙ +ëöÏÅ9¥‡ăˆŸ;ëöéồº·Ø˜ôï½—¶£Ô÷‡߈«Óù×§Óÿ¯¶Üß»û÷›ƒñÛ«‚ ½9éܱ»àö9¥‡ï»åEÅ߈±»Û«‚ ½9ƒv‰Ûÿ¯¶ÛÄÓË/·Ô±»ÖÔ†6¦j—»ÿ®Ơ·–ÑóêöÿÛ“Æ»ƯÙßÛ«‚ ½9Ơ­ÄÛ«‚ ½9ĂĂ ›­±àéM©Ø’¹ +ÜN áÍÓ×¹¸£ĂêµØ®Gø½9¥‡ÿÚăˆŸ;«‡“ÍjÙÅ뻈ùơù¿™ÔăˆŸ;k½ͪùדƠÀƯÛ«‚ ½9ëöĐĂ“ƠÙ×8¤‡ÖĐØÑæÙ½¥3ưÀÚª‚ +¼9ë́Ă¼éôÖØ¥Âù׳ꯉ¯0±»ù¿ÊÓ…ÍË)éÛ9¥ÛËỞêöÁëö˜‰j̃ZîSéê“ȶ‡Ö8æưÀ«·3uUŸÅåĂ­ÖÛÆ‹Çª¼ ƒÚÛºœ·̉ ¤0ơÔëÔ›Ă¯Ô½€ă»ÿ§߈%«Ô™‰kß [ïSÿÚ4óׯØÂÛ«‚ ½9×$ﻡԡ¿Å™‰kß [ïSµ†‡ŒÓØ™‰kß [ïS±ƯçÚËÖ¶º`©ÓÛ«‚ ½9Ê¿ơÔáêßÅ©ÇØÚù×ívư“÷ÚÖĂ‹ÇÙÚ¿ßµØ߈±»¹Úƒˆƒv߈ăˆŸ;ơê°½ ‹Ü¥ÓƒvºëöÇÀ«Ô£Ôó#Rƒ¾‘÷Á»ÓÙÚï‡Ă±»ו­)êöÿ¼·Ô«Ó‡Œ×ÜïÅ¥áÛ«‚ ½9ƠƯÿÚ¥ºÇÖ¯‡éêù×ĂºÛ«‚ ½9óÂÛ́Ù°À±»¡™ëéå˹›Û¿»ơĂù×ĂÙÁÏÅƠ¹ÚÂù×½ÂèÁ‡é/×:«Ú߈ăˆŸ;ăˆŸ;»ØÂƒÓعÚÙÚµØëö±»°»ÅØ«‡“Íj÷„ù×´ô÷Áă‘·¿‰Óض‹ëçÚ±»Ù½9¥‡$“Æéܱ»¥ˆ]1™ÓׯÓ̉ơÔ¿º±»çÉ̀Ă«‡“Íj‡Üù×߈ù×ͺ¯¾ƒˆÉ̉ăˆŸ;¥«‡“Íjï¶¿àÏÔ©À™‰kß [ïS½€Ù½ø×Û«‚ ½9©À™ÛƠž¹Ưù×±ëØù×™‰kß [ïSÛ«‚ ½9ß%à$µØÿ×Ï̉©¼ƒˆ±ëØêöÏ¿ÛÀ½ËlŽâàÁ̉íÓơê·ˆÏÔ¥ˆ]1ßÖµ†ÙÚ«‡“Íjàꃈš۳¹ÚÅÓ½çÚǽÁ*ׇ½7匿N«‡“ÍjÆâÿÂêöùדÈẲ™‰kß [ïS¹Ú©ØÏÔͺ™‰kß [ïSÁƯù×½ÍË)éÛ9¥ƒˆÙ½¥ÖÁƯ‡Ú¹Ú¨¼›¸ÚÛ«‚ ½9¡Á߈˜êèäׯƠăˆŸÛ«‚ ½9±¿Á„µa—˜ÿÂôꩼơÔ߈±»×ƠƠĽÔÁ½Ù½º™ÓăˆŸ;€Ơź³¶°È:Ù½‰ˆ߈íÁÆĂƒv­ÄÀÂÀ³ ‹ÈÛ×ívÁƯר‹Ü™‰kß [ïS퇥Á‘ơ¯Û¶èÙ½£ƯơÔÏÅÅØ½Éó›ưÅ¡ÈÙäÀĂœÜï é‰ñ5ñ·Ôơψùꥺëö¬ ăÁĂÙ™ô×ƠÁ̉ׯ—»ù×ù×å‡ëöØÅpêp¡ÔÛ«‚ ½9¿Å̉ØÚדƗ»öÁœĂÙ«‡“Íj÷ˆ¡È‡9µØôêÏ|ùêÀ¹߈ùêƠ °»‰¼ëö‡ºá ăˆŸ;ù×ăàÙ½¡¼Û«‚ ½9Ơù¼ÙŒë*«ψ£ä¶è¢ÇÖ ¯¾™×ƒvĂÙÅÓÚÇçÇÏŧôäơ°¿÷ä5̉ñíÈ›¾ƠX¾·Å±»ÇÖ¾ÿü—¶ÍË)éÛ9¥ñÓå̉ ß»ûÓÅÛ×°»±¿£Ç‰Ư½€¹ÚÏÔÚÄ̉ơÔƠ›‡¡È8¤‡×¯Ơ¹Úƒö¹ÚÙY³”ª» ƒvù×±ëØ§ÔÓű»¿×Ù½½ûÓƠµ̀ ¬H ‡±»ÿ¯¶ÑÄë߈ư“©Ü6½ĂÙ5”%™ÓéºßÄÙåôÔ§ÓÏÅ·˜‰Á¹Ú8 +¤‡ +ÖÏÅ…±»™‰kß…˹ăˆŸ;Ñ·óǶèßÁéºÛ«‚ ½9—¶µØêöÛÄÓƠ’±»Ç¹Ú¹Úù×ûÓ™‰kß [ïSÍÓÍÓ¦º©Ü‹Ç½ù×ùן̃ÏÅƠî÷Ùóù×—¼ÛöÁ÷ÚÁ½ƒˆ‡º·Å­Äùê¾ĂăˆŸ;k߈́v¹àöÀ*Á˺ëö™ëé姺ăƠ«‡“Íjר±¿Û«‚ ½9™‰kß [ïSÙ½™ëéåçºß»û™‰kß [ïSăˆŸ;‘ÖׯăàÁ‹Çÿ&Ù»»‹·v¹íÚ¹ÚÏÔ±»߈»Øá ưÀ¸Á +« ©ƒ»5ßƯÀƯăÁ±»™‰kß [ïSÙ½ùןħÔÚª‚ +¼9Û«‚ ½9̀¬H½€«Ûׯñ×ϼ¹½—»ï‡߈£Øéê‘ÓÍƠÙŒë*«ÏÅÅØü½ØÛÄÓăै]1™‰kß [ïS¶…Ú›¾Û«‚ ½9ñÆơèÅ©¼«ÔÖ¾ÏÔÛÄÓ«»½ÏÔùש‡¥2ßëM¥ÓÏÅô«‡“Íjø×¿‰×Ó‡“âà ơÔĂĂ ›­±àéM‰¿I߈ÏÔíÆˆ½»ˆßÄÙ˹Ù½é‡߈‹ÇƒvđÓÁ•ŒºÛÚ±»³îËÖµØÏ̉å̉ ù×ù×ß»û›¶éỂÛ«‚ ½9·‡‘×8ç“&ç̉½߈ƒÖ‡Ç³Ø«ÔơèÅÏÔィ¼¾û½€ÚÀơêÙ½µØù×ÛסÁ¹ÁưÀ±»ÏÔÔ Ë̉™‰kß [ïS“ƠỬ‹Ç¹ÁíÆ§ôăˆŸ;÷Á“ǰ»©ÀĂôÇĂù×™‰kß [ïSǻ•º±»߈ưÀ‹Ûÿ¯¶ÑÓ߈Ñlß„Óï³29¥‡ÓÈÛÄÓÙ̉¡ÁơÔÑÓ™‰kß [ïSª»Û«‚ ½9çM¯¾Ẳ¯×«·3uUèç¿ô¾ßưˆ»»»ÏÔ—»–¶Å¤Ûù×í‚êöëơóÇÄÂåĂøê›¾ưôÙڃ׵Üá=“ƽ۫‚ ½9‡ºØÚáÛăˆŸ±ó™¶ĂÙĂÙơÔ‹É0«‡“Íj½öÏÔ˜‰j̃ZîSéÓñƠ¶££XŸèÿÚưÀ Ôù×çôÏÔá Ϻƒ¼§Ôƒv½Å˜êèä™ôÙÚ±»·§D »‡ÿÚåÂ¶ÓØÏÅỂψ©º«‡“Íj×ÓăˆŸ;ÿÚ‹Ç·‹ÔXă¼ÏԽث»ÏÔ§Óù×½ăˆŸ;k¾ºóÂăˆŸß„™‰kß [ïS¦ôăơ×½ÍăvƒvÍæÛºăÁƒ¾‘›¡ƠXù×狱»Wơ؉j̃ZîSÓØŸÖÁË”Œ +¡»ψÁל‰¾I«%ĂÙ¿ô™‰kß [ïSù×ÄÓ·Å«·3uU¬¾•Èû››¹Ó؃Ưï%›ÛơÔ—ÓÛ«‚ ½9ơÔ«¥ñÓµÀÙ½ƒˆÛ«‚ ½9Û«‚ ½9›¾µØÙƠ₫Ù½ÙÚ©Ü—ÖÛº߈߈¿ÅÛº™‰kß [ïSù×½›¾§ö°»ÜÓ ëÔđÓ¾¹]›ÚåĂ•Èû›ÏÜåÁÂÏ̉½Û«‚ ½9˜‰j̃ZîSØŒê*ªµØ߈µØî½›¾9¥‡…»ơÂúƠëÚ„ØÓ̉Ï̉áêĂÙ©‡¥2ßëM­Ö™‰kß [ïS$Û«‚ ½9ÅÓ¸!éœù×à×9¥‡×ưÀ«»Úª‚ +¼9˜êèä½ôăˆŸ;ơ¡ÈăêÛ«‚ ½9ÁÉÖÛ«‚ ½9Û«‚ ½9¥ÓÛ«‚ ½9í¶÷4åô9¥‡ÍÓ±»±»‘¾­Ä“ƠµØà¬“ƠăˆŸ;ÁƯÿ¯¶ÁƯ‡Ç¶Å©‡¥2ßëM›¶é·‡‘×8ççí̃ˆƒÖ¶ï½™‰kß [ïS«‡“ÍjׯÏ̉«‡“ÍjÇĂ߈ÑÓ߈¶ÊÈ9«Ôß„ßÄÙ£ä¾Ùë‚v±»Û«‚ ½9Áñăàƒˆ̣Ç̀Ó߈‡ó¹ÏÔ­€ƠÄÛ«‚ ½9ÿÚ¡ÛÙÚÛ«‚ ½9¥Ö߈¡»ơĂg̉ÅŸÅؽưÄÙá«ÔÛ×ÁƯ“¹ƯN¡Ûơé—¶Û«‚ ½9ơµ±»ƠÑöăˆŸ;›¾ÅØ¿ÅÁ½¡Ô›¾½‚ˆ±»¹·ôËƠ™ÔóÇù×¾ÍÄÛ×ƒàƒˆåÁ·‡‘×8竇“Íj«‡“ÍjÇÖé(³°»á €ºëöÛÄÓ™‰kß [ïSï ÏÅ«‡“Íjùׯ¾­RÏÔùº·‡‘×8çẩăˆŸ;§ÆÁƯ—¾…ÔăˆŸĂ 9¥‡×¼ØúĂÙÚẳ¡Á™‰kß [ïSÙÚŽ÷Á‡Ç™‰kß [ïS߈ù×ÇÛ߈ÿ§±¿±»×$éÓñÓ™Áø×ñ߈¾ßï½¹Úëö»—ßÚô—¶ẮƘôÁ¼·‡‘×8ç¶·ÅăˆŸ;ËÛ‘Ó§ÔÙÚ¾“»Úù×ßÖùêíêÅÓ™‰kß [ïSé‡ÏÓù×½°»Å™Óêö‹Ü½€ưÁå̉ ¼§Ô•Èû›Û×߈®È™Óå̉ ÏźơÔ• •³±»ëö¸.”ÈúÏćŒ×ƠƒƯûصØѶ£ Ểơê¥È¿Øׯ“¹ƯN߈±»ÁÚºăˆŸ;éºêöË©ÇÇĂ«‡“Íjưˆ»ô­Ơăǿºº¾ºå̉ —»×ƠưĂ¾߈߈ơêŽĂÙ½½€µø±»ƒööêÓÁƯÇÖ©ØÙÅëçƠŽï»½‡•+ù×±»߈éÚÓưÀ‘®›Óƒv™‰kß [ïSƯÓ ­ÄóÔÙƠ˜‰j̃ZîS‡ŒµØ™‡›»·Ô·Å¿ÀñÚæê¬߈›ÚĂƠ±»ÅÛ«‚ ½9±»ÙÓ…ôÏĹÚÏ̉ĂȰ¿ưÁ÷‡™‰kß [ïSÙÂѶ™‰kß [ïS¾ßíê¯ÈÛ«‚ ½9¹Ú…¾Ç̉ª‡’̀jëöÏÔ߈©ÓưÀÿ¯¶Û«‚ ½9 È§ÔÍѯ¼ĂƠå»߈ơ„ÿ§щ̀Ó)§₫ôăˆŸ߈½“¹ƯN¡ö‰ÄÛ×—¾íÚ¥ˆ]1ƒvăÁÎơéÓú¡(ÁËø·º¶ñÛ«‚ ½9ߌÛ,çÚƠXƒˆß»ûƠºmçÚσµ—Wù×±»đƒÔÏÔƒÍÀ߈«‡“Íjψá çôéê¹Úêö¡Ôù×™‰kß [ïS­Ô“ºˆƠ›¾¾ºùןȎٽßÄÙƒÛÚøê…Û“8¤‡×¹ÏÔÿÛåºÛ«‚ ½9“Æơꇌ¿‰›¾¹Úׯ̃ˆë˜HáêÉÖµØÙڿŪÓêöñªÙ°»ơèŵ؂˹Á™ëé图‹ÓÂăÁ‡é߈±»¶ÙÚăˆŸ;߈¶\\ỞÏÔóƒvÿ×Û×÷Ôơêăº“ºÏÅå̉ ¿‰Ö ¥ˆ]1¹Ú±¿âˆ:߈½ »ÁƠƠXĂÙ»y°»•Èû›½€Å–̉Á 9¥‡Çđ¹à±»óÔ½Û9¥‡ϰ±»÷Ù­¶ÛÄÓăˆŸ·‡‘×8ç×$ÿ¯¶ø×ëöï»ÅÓÑÓÛ«‚ ½9Úª‚ +¼9ÿ¯¶ăˆŸ;kăàù×߈Û«‚ ½9ŒÉ½ĂÔ ù×ăˆŸ;kÁ¼‡º°»ăˆŸ;kרÙÚYëöß»ûđÆ­)œÜƠ«Ôÿ¯¶¨¼ÁÛå×ơÔ‰ǻÄï»ĂÙ¹Ú¶Ôù×™‰kß [ïSÙŒë*«™Ă߈¨-ưص†ÂÙá=ĂÈ󫇓Íjơê8¤‡×ïÜ€»°»©ØÙÅëׯçÚÏ̉ï½Ǽ±”óÂưÀùơ¾ƒÖăˆŸ;Û«‚ ½9óǽ™‡ïƠçÚÍĽ€߈ÛºăÚÏÔÛº‡ºêÚóÇÿÚÿÚĂÙ«Ô»ØéÚÿ×ưÀ‹ÜíơăÇí°»ÍÛԷÔ߈à çÚ¹Úƒˆ÷‡ï½»Øëö“Ơ³àŒƠ°»,Û«‚ ½9Ù½ôÄû(́Áñ»©ÇóÄÓª¼ÓĐ­R8¤‡×ïi8 ¤‡ Ïí§Ó¾¹xăˆŸ‡º™‰kß [ïSüÆtÓ¾‹v½ÔÄÁ£Ø™‡œÜăơµaƯ󫇓ÍjĂÈÁÙ«‡“ÍjöÛ«‚ ½9©ÇÏÅ­ˆÛ«‚ ½9ÿÚóÇ›¶éăˆŸ;k°)á(û(±»…»Ă°»½–»©‡¥2ßëMÏÔăêƒvºý¶éêî½°»«‡“Íj·Ó ¥0ưÀœ·̉ ¤0߈½ÿ¯¶Û«‚ ½9âˆ:Á¹ŽÖÔ†6¦jö4ñÚáê¹̃¾™Ûß»û߈³¡ÈƠ±»ù×·̃öÁ܈½«‡“Íjº߈éñÚ›¶é9¥‡×麙Đöö›‡½ÍË)éÛ9¥ëư›¶éÅ»ÜÚ·Ó ¥0²Â ÎÔ…Œ±¤Ăÿ¯¶¯¼ÍË)éÛ9¥·Ô¡Ô÷Á¹ÚÍijØÏÅ×ƠĂÚÏÅÜá ÙÚؽ·§D ëÚÏÄéºÄÓỞăơư‡±ù1ÏÅ–ÓR¿Å™‰kß [ïS§ÔÅÏÔÏÔăˆŸ;kÊÈ9dÏ̉¿‰ÇØáÛÚ×Ï̉˜‰j̃ZîS›Úù×Û«‚ ½9í'ï³2ï½áÓ¼‡›¹—Œôù×ÙÚÇ»ëÓ÷Ú­¾µØăˆŸ;kçDZ½ĂÙù멇¥2ßëMŸ¿¾ßëÚÇèÛ«‚ ½9ª ¶ 2 t T «Ô™Á¹Ú±¿û㫇“Íjïô÷Á•Öù°ÉíöÁ÷¶Ù½ăˆŸ;ĂôÛÄÓ½øê6•!ùơÛ«‚ ½9¿Ø̃Á±»Å¹ÚÍƠñÁ¼¾¹Ú÷Ùµ‰ëö£Øø¿géêƠëöĐÄêŸ}Û«‚ ½9ùסԯÈơÔÿÚ½€ºßæ¡Á߈¹Ú÷Áÿ¯¶½Ú× Ïæ̉¿Øửù׿º³ÈÆ–»½ă»¹Ú½߈Û«‚ ½9ăˆŸ;ÏŇǷ‡‘×8ç±»¥ˆ]1©º¸£ÑÄë¿Ø±½ăˆŸ™‰kß [ïS½·Ó ¥0Ê% ø×%©ÓÑ麓¹ƯNÛ«‚ ½9ÙܶܽÏÔƒˆ÷Ú·¦D ·‡‘×8çÏÅ÷Á9¥‡¾Ú×±»„Úå»Ù½ëö“ÆñÚ߈ÏÄơ껋Á́Æ›¶éßÚ£»‡Çù5™‰kß [ïS«‡“ÍjƠXٽٽ›¹é‡é꫇“ÍjÑÓ‡¿¾¹Ú %Ë̉ÇĂ߈çÚù¿±6ĂÙ«‡“ÍjŸÖµØơµ†ÜĂªÚCÛ«‚ ½9çÚÍË)éÛ9¥Æù×›¾›¾üØù×ÍĹÚÁƯ±»ñÖƠX©‡¥2ßëMÚœÂ½Ă“½ù× ÊûÍË)éÛ9¥™‡«·3uUăàÛ«‚ ½9©‡¥2ßëMñÓé‡Ûº́ÆÛ«‚ ½9Ïű»߈«ÓáÏÅÆÊÈ9ơêÑÄë·Å°»¶Û«‚ ½9™ØÁ¹±½Á³íÛ«‚ ½9ÙŒë*«‚Û׿ôÇÇÖ£ÇÅÙ½±»•Èû›ăˆŸ™ôơ÷ÁÛ×½€¹Ú°»Ÿ}Ǽăï»ç'íÖÁ¹ưÀ™ÓäÁ¡ƠăˆŸ;kơÔ÷ˆăˆŸ·‹߈Û«‚ ½9ăàÛºơơ±»߈¥Ó߈ùêÇÖרăˆŸ߈ÓºÛ«‚ ½9Ë¿ƠÁĂöä5̉ó^áêÿÂâÁ¥ºëöÑÓ›¾‹Ù²›ƯåĂ9¥‡Ơëö™‰kß [ïS˜‡ñÚÛºÛ«‚ ½9™ÓÓÓ™‡‡ŒĂ¼™‡Á¹ûß„đ™‰kß [ïS·ÅơÔ¹ µØ½߈߈…Û—Œ‡Œ±»«·3uUÛ«‚ ½9ù×±»†Ç¡»º¯Ûï½™‡ï³2́v Û×ÑÄëùêä̉çÚ‰ø¹öÏűëØăˆŸ¹Ú£ƯñÓÛ«‚ ½9ƒ¤Ạ̊âˆ:jíˆçÔ¡ÿø߈‡ƒvïiÏÔù×™‰kß [ïS½ăÁÍË)éÛ9¥ä̉ßÄÙå̉ ‡Ç͋ǹÚÛ«‚ ½9߈Ï•˜‰j̃ZîS‰±6ív›¾˜êèäơ꽃ˆƠÁă»º¹Úùת¶2tT½ÿ¶™ëéåŸÖ«‡“Íj¡Ô©¼ÛÚ­ÖáØù×ö½¹ ÛÏÔ•ÓơÄï²2­§âăˆŸ™‰kß [ïSëÓưÀ½€™‰kß [ïS°»â»—¿½€Û«‚ ½9£Ư“¹ƯNƠ…¾ëö¶ơèż9¥‡ÏÔ™I÷Ú÷Áé¼ÏÔ‹Ó§ÔÏÅúŒûŽăàơÔ÷Áå‡Û«‚ ½9ù×̣¶íêͼœÔÍË)éÛ9¥Ž“ȥؽ߈‡“™‡ăˆŸ;±»÷Á«Ô߈ß½߈½È₫íß Ëû½³ÇưÀÛ«‚ ½9ø×­½¼÷‡₫Ú™‰kß [ïSùׯÈñÚ°¿Û«‚ ½9öï½߈Û×íÖÙ½ƒĂơêËÉ9³«»¯ëö∠  :k½ôØưÀ§ô™‰kß [ïSÙ×µÜÍË)éÛ9¥æ'¦Æơê¹¶…%‹ÇµØ±»Û«‚ ½9ÓºµØĽä̉ƒˆéôÂÙ÷¼å̉ ¥Ûø×#°»ưÀËƠœØ±»˜êè䫇“ÍjªĐ«‡“Íjá«Ôù×Ç̉“½·‡‘×8癉kß [ïS¼“k¦Ôëöù×§ô¡Ôÿ§«·3uU½ÛÀùêû(›¾ư‡±ù1ƯÖ´À‰ÛĂÙ£»Û«‚ ½9åĂÏÔª ¨ƒº5±»߈½‹ÇçÚĂÖù×ĂÙăˆŸ;÷Úå̉ ëÄăàƒˆ¥ôº«â«‡“ÍjÙ½¿(àÅUÁ½×ĂƠç…Ôù׃¾‘¤ˆ\0¡Á°»ƒˆªÔÅÔß»ûçôÙ#ɇơêơ…€º߈ÏÔùׯ׾ٽ¹Úºù×ÙÚáêù×₫¾ +¸Ú_Ϻ™‰kß [ïSöÛ«‚ ½9÷Á˜‰j̃ZîSÏÔƯÓ Û«‚ ½9Û«‚ ½9±»ÙŒë*«êöƯ‹ÇĂ™í߈ëöµÜÇ£ÔơêÙŒë*«±»Ѷ”‹œHơê߈½Å‰Á›¾‰¿I¹ÚÎ̉êöóÔܺƒˆµØ©‡¥2ßëM߈½ĐÓ©ØĂÙ…ÚÙƠñÚ›¾¡ÛƠØï»±»ĂمɃ¾‘ơļ߈ăêáꙉkß [ïS“Ơ«Ô±»Á̉ùׇŒ÷Ù™‰kß [ïS¿‰ÑÓ²ÆÁƯỞóÇáêƒØÍË)éÛ9¥®È™‰kß [ïS©Ç±‡¯±»ơêÿÚ³n߈§ÔÇÖͪ»™Ø̀Ê)èÛ8¤ßµƠ«‡“Íj¨À߈åת»ÑÓ©ØÙ̉ơêÑÓ¼ôÏ̉“Æ߈»È«¨Ơ¥ˆ]1±»̣ÅÁµØêö +½ô±»ÿÚׯĂÙêö ưÜÂهǡÈÏÔÛ«‚ ½9ÏÅ÷Áù×ö¹Ú¬¾߈Íùêëöù¿áƠ½™‰kß [ïS‡ºÿ¯¶9¥‡Ñәט‰j̃ZîSăˆŸ;¯×‚văˆŸ÷‡Û«‚ ½9ͽ¤ˆ\0ëö¥r½‡Ï̉Å߈«‡“Íj´Øö´aëöù׿»ơÔÅÄ‚vÙÚƯÓ 9¥‡½€±»ơ—»±»½ƯÚ›¾ă«‡“ÍjßÖ¹Ú§ØëöóÇ›Ûÿ¯¶Áåêöá Ăù×íÆívÁƯăàÏÔèô„É¥ÄËÓÓØéï¡Ø¿‰ÿÚ₫߈™‰kß [ïS÷ÁŸÖ™‰kß [ïS±»«‡“Íj÷Ô¡»Ù½¶Å·Ô›¶é©ÇËÉ9ÈÙÚǧԇ›¾—¶ÏÔëöơêÙŒë*«…¹Ú¹Ú©Ü±»ºÏÔơꙉkß [ïS¹ÚÁĂÀ¾º‡ºÍË)éÛ9¥ưØÊÇͼ©ØÑÄëñÖ‘ơíê¡»ƒØÍË)éÛ9¥ï½ר·Ü¯Èª¼™‰kß [ïSµ½½Ăÿ¯¶µØÙà߈¤È¢X ߈ÑØ«‡“Íj«‡“ÍjÙ×á ƯœѶÇ¥ÎÔĂè±»©¼¡ÛƠ…Ø•î½êöåĂ¥ÁŽÀ¼‡Ç«ÔÏÅ…Ơ›¾߈¾ßƠÄôꩼ‰yÛ«‚ ½9°»¿Ă±»̀ÄÿÚ߈›¾ÅØß»û˹ÂùבٵêÁƯ߈ăˆŸñÄûƒvơêÇÖ™ØÏÔĂÙ»Åù×ăˆŸ;Û«‚ ½9¡Ơ₫Çù×£Øß»û±ëØ™‡ÏÔ¼Øù׃ˆù×ăêÑưÀ˜ÁÏÔß»û߈ỞÏÅ·‡‘×8çñÁ™‰kß [ïS¡íÖ´ù×ç̉á̉щ¹½”ִ؃½ŸÈÛ·¼Í7¡ù׫‡“ÍjóÔÔ¹Ú·Å‘ÅÔáÓóÇÑÓíØưn«Ô„n ÷Áöíṽˆĺ·‡‘×8ç‹Üùץ؛¾ăˆŸ;k±»ÏÔÁ‡é/×:èçƯơå̉ ĂĂëöǺ›¶éÓº¾ËÇËǶ豻ù×ÓÆÁåŸÈÅ—ă£Ç™‰kß [ïS£ä·ÔÛ«‚ ½9·ÅáÛù·Ï̉׿8°»ëöÛ«‚ ½9ߌÛ,ψ߈¿‰ư“Ù½ Ëû“¹ƯN¯àµØÙ×ö»Ăø×©½¹Ú±¿ẳÛ«‚ ½9ăà­R›¾çÚ¡“…ÏëöåßƠ߈Óˆ•=‘ÓØ¯ƒßÍ>ùן}ø×ÛºïÚ†Çíp™‰kß [ïSÄÓ±»©Ø­ÄÏÔÏÔĐÄêÅÓăˆŸçôå×±»öä5̉‡ÇÂĂ7¶ö¥ºϺºåôí—G©‡¥2ßëMå̉ ™‰kß [ïS¥Æùê¡Èª»ÅØĂÙÏÔÏÅ™‰kß [ïSÎÄùêŽó‹“¹ƯNôÓŰ»߈ÑÄëơÔ«Ôâ½Á¹åĂ½̉ºív§Ô±»‡Œùê9¥‡×ùןÙ×ÁƯ¥ÛưÀÿ¯¶á=Û×—ÚŸưÀ£XÛ«‚ ½9•¡ƒvíêßÖ8¤‡áêƠíJÇÜùê¯ÑÓù×ÿ¯¶»‡ó#¡Áù×»¼‘Ù½Ă߈ù×ăˆŸ;9¥‡¾ß ÑÓƒv“đÖ̃Áöå̉ °Èívͪèơ“Èÿ¯¶å̉ ߈ăÇíÿÚ߈ÍÄ8¤‡¡©‡¥2ßëM§ÛëÔ›·Ô«‡“Íj÷ÁïƠ«‡“ÍjơêǼ9¥‡×ƒ¾‘Ă ÏÔçÚ¹Á‡ÛרÁ¹‡Œ¶å‡߈ï‰ù×™Û“ƠăˆŸ½¯à³(œÔ©vëö×¼ËÖëÔ“ºăˆŸ;ổÁ‡¿á¼·Ô߈ñÖ—Ú¡Ô«‡“Íjřӳ„ØÑÄëóÇ‹Üç'ËÉ9ÍÄưÀ™ô¯G‹ø¾™‡óÇÅØ߈ƠŸ\âˆ;k¡ÔÑÓÁ½¥ÇÏÔ¡ÁÚÀ¡È±»º¹Ú•½»Á­Ä߈Û×¶ô¼ ăˆŸ;ͽß»û›¾Á8ÓØ¾µØÏÔ±ô¡ÛÚÆ‡ŒÁùæñ¦Ó±»‹Ç8¤‡ÖơêÏÔ±»½•́ßƯ§Øâ௢ŽăÔ9¥‡ñÖ¿ô·‡‘×8çơê߈ưÀ߈Ï̉—¶ƒˆ©È¡Ô¥â›¾ĐÓ©‡¥2ßëMǵ†³ ™‰kß [ïSçÚƠ]ºéêëö§ÖÂƠ¯„ø9¥‡®×ÇĂŸÜ߈€Ó¯›¶éÛ«‚ ½9éêĂÖó|ï³2·ÜÁƯå»ؽ¥ÆƯÓ  Çùꥋ۫‚ ½9±»±»—¶­€¥Æ¡Á߈ÏÔ“ÆÁŸ\9¥‡×«»öÁßÚÛÚ߈Çá=Ẳå̉ ËÉ9ùêÏí·‡‘×8çâơéÓÎÚ·‡‘×8çgƯÏÅù×ö9¥‡¾ñ·Å‹ÜæÚ«·3uU™‰kß [ïS»Å̀Ă«»“ïÑØר¾êöß»û«‡“Íj¨¼ÍË)éÛ9¥áê߈™‰kß [ïS÷Ôăà¥ÈÏÅí—G§Ó©¼±»§ÓăˆŸ;³”« ©ƒ»5¥‰ÍL…Ù×½áß3SÛ«‚ ½9¿ÅĂ™ôù×ùêåĂçôª» öåÁ·‹̉ÆÅ»ăˆŸËǘ‰j̃ZîSËÉ9Ó¾³·ÅÑÓ«‡“Íjù×Û«‚ ½9ͼéÓÏÔÇèÏåñÖÁ嫇“ÍjĂ¼ù×Ù©ºƯ‰ÏÄ™‰kß [ïS½¹Ú±»ÿ¯¶¯Èáêơễξù×í¹ù×8#¤‡#Ö Ăø¼ ưÁÿ¯¶¡È÷ÁüØ…ô߈³ÆĂÙ«&ÙÚ¶«‡“Íj•™‰kß [ïSׯå̉ º±ëØ߈âÄù¿ùæ©&“½¾Û«‚ ½9÷Èß–ÅØ‡Œ•Œ£X̉ũܣ»ÇĂ·‡‘×8çƯÓ ±»«‡“ÍjÛÄÓñÇăˆŸ;kø×±»ív™‰kß [ïS“Àß»ûź¶ÅÍđ Áêö—¶ôê§Ó°¿•{®È‡º߈ÿ¯¶ŸÅëöƒv߈ͼñÖ½ă»±»¤ˆ\0—ØÏÅ‚·‡‘×8ç÷ˆׯ»‡ÁƠîÏÔ¡ÁÛêÇÖÛ«‚ ½9ÎÔ±»™‰kß [ïS±»ĂáÛ«‡“Íjö߈Ó̃¥ˆ]1ñÓ±»¡Ôëöăà×¼Ǽ³ºó߈‡ÚÛƒvĂà½Ù ±»Ù½µÛ¡Áï½Åà›Û“ƠÇ̉½ƯÓ Û«‚ ½9ùÁđ߈‹ÙÇ̉½ôÿÚ¡Á±»ù‡‡Œ»Ă½Ǽ­½¼«‡“Íj’½ơÔù×Úª‚ +¼9¨‡ +¤2 +€ +̃ +ê +L + +½¯.ëöù׋Ç̉Å·Ô«‡“ÍjÄ÷ÁŸè±¿ÏÅëö×Ơ­Ä«‡“Íj™Ô›Ú½ä̉ÁƯá ¼ëö½€ÍĂ-µØ߈Û«‚ ½9²ƠưÀ½“ƫԇˆëöɸׇ9¥‡ÏÔ±»ûöÁëöÍ­R¶ÏÔ‰¿IŸÉï»ÁƯív̉ÅăˆŸ;£Øå̉ I÷ÁÙŒë*«ÚÀÛ«‚ ½9Ñ`éºëÚ½ÿÜå̉ ÅØǼ™‰kß [ïS«‡“ÍjÛǫѣ佣äî½ùêưÀµØÑÓƠ½€ù×›ÛÏÔÏżÿ¯¶Ở…Û¥ˆ]1¾ÅÑÓϺëö»ÅÁƯÀ̉ÛºÍË)éÛ9¥½€±»ÁƯ«»߈ÙÚÓÆ8¤‡Ö©‡¥2ßëMÿ¯¶ï³2½‰¿I¾Ơ™‰kß [ïS±»ăˆŸ;¥ØÏÔŸÈ™‰kß [ïSÍƠ±»ÙÔÉÖù×ß»û÷ÁûååĂ·‹ÙÚ½€™‰kß [ïS‰Ƽƒˆ¡Èٽy‰kß [ïSéºăˆŸ¥Ö«‡“ÍjÛ«‚ ½9¹ÛÀĂƠÏÔ¡Ô߈ͼñÖơêÀ¹ÿÛ«‚ ½9ëöÁƯ—Ö™Û¡Ô—¶ÓÅ—¾ƒØñÆÔÄù×… ÀĂơÔđÖߌÛ,ÏÔÁƯ¿‰Û«‚ ½9ĂÙöÿ¯¶¿àƯ‰Ë̉À̉©‡¥2ßëM½€ƠX“ƠÁƯƯïƒvÿÛ»‹ƒæ߈›¾9¥‡—ˆ¹Ú¥ØăÑđƒÏÔơàÖỔϼÚÇÍË)éÛ9¥¸ÚăˆŸß»ûÓ×ÓÖÆÑ+ù¿ù×ͼÏÄ㋵‰øÚư“Óº•Ö¿Øï»ñÓùê§ô¼ëö9¥‡ăˆŸ;k±»Ơ¯Èàö9¥‡×ڿާÓÁĂó¹«ÔÅįG‹øé·ƒvÙ½Û«‚ ½9ƠÅŽĂƒvơ±»¿Å‰Û±»Ó̉ĂÙỞí—GÉʺù×߈±¿ăˆŸ;ר÷Áƒ½½‹ÇỞ±Á߈íÖûØ9¥‡·ÔÁ̉±»¥ˆ]1Ç%Á˃½ö±»ÀÛ×±»ç'½çÚä̉›¾—¶á…bŒEµØï½«‡“ÍjéÔÛ«‚ ½9Ñæđ»ÅØÏ̉¹ÚơÔÛ×Ù#¾Ë̉›¾§Óƒˆ¼€ÿÚ₫& ź߈…à›ê«·3uUØ×øÜƒÖ—øûصۓϺÏÔ©‡¥2ßëMƒ×ƯÂ×Ó÷ˆơèż€߈ăˆŸ;k±¿Û×߈¯È™‰kß [ïS߈¯©ÑÅ´ Î  ù×Ơ—Ó™ëéåÙÅ뿉§Ó‹Ç¶ª¶2tTØ̉Â÷ÚƒvăÁÏ̉Å–ƒvÛׇŒÅÏ̉¡ÈÛ«‚ ½9ßÚăơ«Ô߈±»¾ßËÇøêëÅù׉»¿ôÁ̉̀ĂƒvƠÑÓö™Á¡Á·Ó ¥0»¥¸ËÓưÀ“¹ƯNﻓֵ۟†߈ÏÅÅØå̉ ¡Ơö¶·‡‘×8烈²߈ÜÓ ׯ™‹Á½°¿ỡ¼—¾Û«‚ ½9™‡º Ö†‡ü2ͺŸÅù×ơÔ«ÔäÁ½Á×ÚÆÁƯ°»óǺÁÛ×¥ˆ]1·Ó ¥0ưÀ±ëØé¼öÁâˆ:kå̉ ù×±»ŸÖ½€¾‰¿Iщ¿(™Áéêù×ù×gä̉Úª‚ +¼9‚Ø ߈Ñ·Ó½çíÆßÅăˆŸ;k™‰kß [ïSÁĂ›¶éÜ߈ơÔ˜ôƒ¾‘Ûº½ËÉ9ÍêÚƒk£Ø°»߈“Ơ‘ơÁÛ‘%ĂÏÅÙ½®Gø©ØÉĂçÚ·‡‘×8ç×Ü‘ÖÁƯ´ê £Ô—¶¥ˆ]1ö÷Ù¹ÚƯÓ ϼï³±»éÚ©Èù×µa¯×ÿ¯¶ÊÈ9±»ë₫Û«‚ ½9ÏÔ«ÖÁĂù×£Ư$±»éÚ÷ˆ›¾ɶçÚöĂÙÙ½Å9¥‡ׯƒvơÔÛ«‚ ½9«‡“ÍjĂíƒ9¥‡œÔËÉ9ơê’ÆëöÏÄù×Ó̉Y÷Áư“¨½—¶™wăˆŸ;½€ñÁ9¥‡­HăˆŸç€ù×éê¡ÓÛ«‚ ½9†“…Ö쫇“Íjó¹±»ÖÆëöôĂ߈·‡‘×8çíƠ›¶é˵ØĂÙ±ëØù׫‡“ÍjÛºù×ɇßÁYĂÓØ9¥‡ÏŃ뙉kß [ïSÚª‚ +¼9Ù-ĐÄêÁ̉£äéºÏÔ‹§½€«ÔϹÏÔơăëö•ÜÛ«‚ ½9ÏñÙ½́ÆºĂ™‰kß [ïSǧӋdzÿ¯¶÷‘ăˆŸ;߈ú(ö€ÇáƠѯ¾ó!Ö¾8™‰kß [ïṢÇĂÙèӳƷÅÙ½åĂ߈ÏÔ÷ä5̉ÿ¯¶¨Ç¡ÔƠÚ¥ØÛ½›¾‰ËÓöû“å¼ çáóÄ™v߈¦ÓưÀË¿÷‡ÛסÈ×̉À¼ÏÔ±»Ởçô½Û×ÁĂ¡½ƒväơ/¹Úÿ¯¶Û«‚ ½9±»ÏÔ±»å̉ ‡kĂƠá ½€ƒˆÙ½¿èçÚÇÖº$ßÛ±»ỚßÖ·‡‘×8çđÓá  ÈâàơêÙ×ÅÓĂ¡Áéꙉkß [ïS—¶ŽáêăˆŸÙ»©¼ÑÓÅÏÔËÔ±»µaÛºØƠ¼ôöÔ“Ơƒv‹Ç™ơÍƠ…äưÀ‚vàê…ÇĂỞ¿́çÚ‹ÙóסÈÁ̉›vëÚ÷Ù±ëØûÙÇÖÁíêëö߈›¾àíÁ߈±ëØÊ ›·Ô¢ä ÇØ¡ÁáßëöÛ«‚ ½9¾ÎÔ¹½߈‡xùôÇ"»¿ØĂÁ¼¤ÓѲ˜‰j̃ZîSăˆŸ‡Çèù×ăÁ¬Äº©¼½‡Œ»½‚v™‡߈½Ø÷ÁăÔå¼ áêăíëöö±»™‰kß [ïS9¥‡ù×á×̃ˆÿÚ̃ˆ‡¹£߈åôÙY½í—G‹ÈßÄÙ9¥‡±»ăơ¿ß¶È¨‡¤2€̃êLùêÓ5áĂÓº»Ă—¶ŸăˆŸÀ½ÏÅÑÓÏôôêÓºÎÔ¯ƒßͯ¥'=U#QK¯Â¿ß†Ú™Ó·‡‘×8çơêʹÿÂÑÅív±»‰Û“¥ˆ]1óÇù×Ă9¥‡†Ú­ÖÚª‚ +¼9ƒvÍӯȼ€ù×ÏÔüÀ¶̣©Ó¦Ûñ²¹Úơê¹ÚÏÔ÷ÁÿÇù×÷Áß„‹ÇêÔÍ÷Áô—ÚÛÀµØ±»¡Ôú™‰kß [ïSÛº߈öáĂ¼ÙÚ½Ù½ÑÓÅÓƒv—»؇Î9„ï½ψʾ×Ó±»Å¡ÈƯÓ ±»÷‡Ïūѭ¿ơÔÛÆÑÄëÍƠ₫®¶߈çÚ¡ÁưÀÅØ™‰kß [ïSÀ½¾×¾ï‰£Ưٽ罛¾ơê’ÆÙYƒvÿÚ™‰kß [ïS«»ơÔ·‡‘×8çÛÄÓåˆå9¥‡×£»ÅØ™‰kß [ïS«‡“Íj߈æ'íơơêÇÖÙ±»½£ØËÖ߈ùê»Óé‰ñ5ñ·ÏÅ̃øר”÷ÙÚÁËÏÅ߈—ˆ½Ù̉ÏÄ߈ăˆŸ‘½­ÖÏÔăơ±»«‡“Íj±»“Æù×»ÛµØ5̣Ă­½¼Û«‚ ½9±»Ù½¹ÁŸƠËÉ9ëöù×ëÚơê°»Ž•Œ¹ÚǦ«đ™‰kß [ïSăö«‡“Íj¢äÿ&ëŘêèäĂÙ±»ĂÙ™́¡Ô›¾¥ˆ]1«Ôƒv½€¶ÅĂٹڃƵÏ̉™ÓŒöæØ­Ö­î©‡¥2ßëMĂÙ÷ˆµ†±»Ï̉ÏÔ™‰kß [ïS·Ôö™‰kß [ïS¼ÛÀ‡°»«‡“Íj“ƠÅÄù×ëö·‹á+½¡Áù×߈ĂèơêÏÔÑÓÇÖăˆŸ;kéºù׃י‰kß [ïSÆăˆŸ;±»¡È¦Óù×Û«‚ ½9ĂÙ“Æù¿×ƠÏÔăˆŸÓÓƒv™Ô•‹Hù×·Üù‰©Ó߈ơêµØ©‡¥2ßëM•¾ÇĂª»ù×ÿ¯¶ÁåÓº¤ˆ\0ÆÛ«‚ ½9™ÁçÚḯ«‡“Íj­¿µaăˆŸ;±»ơèÅÑØå̉ ³ºó¡Á©º›¾ÁƯ‹ÇϼÏÅăˆŸ;ăˆŸ;éºÁƯ­ˆ±»ëÔÛ«‚ ½9ŒÁ¬Ä©‡¥2ßëM±»ë˜HÙÚÙÚ÷ø©‡¥2ßëMµØ9¥‡×»Ø­ÄÛƯÓ Ă¼±»ưÀÈùËăˆŸ;«ÚĂÙƒvàØÇÖÏÅáêëö±»ÏÅщƠÉóÂ¥Œ›¾߈àƠ ³Â–ˆ™‡ëöơÄăˆŸ½¿ØÿÚ°» ¿*ÓØ±»ơĂ¼»ßÚŸ}¬¿é‡›̃‡Œ‹¿ƒØƒv«‡“Íjá ăˆŸ±¿¿Ø9¥‡×ơ­¿§ÓÏŃv™‰kß [ïSÿ¼ïÚ£ä¶ÈëöŸØ±¿…éÚ£ä½à¿ñ£äƒ™Ó«qºØßÏÏÔ¡Ôß½ŸÈï?„Ù½ù×Ù½ù×ñª±½ù¾ăƠ·‡‘×8çĂ¼™‡©Øëö­Ûù×¥ˆ]1ÑÓñÚ±»éÚÏÄA¥Đö¡‘˜‰j̃ZîSÙÜù׋Q™‰kß [ïS¡È߈ÓºïÚÑÄëÂơ»«‡“ÍjÛº«Ú™‰kß [ïS₫»Å«¿ăÙ½½̀Ó߈ÔX¶›ÔÛºÅªĂ±»¹È™‰kß [ïS±̃ƒvĂÙăơµÛÁäëöޱ»öƯÓ ƯŽ¿ôÙÚ±»±»Áœôê +¹¶¡Û¶Ë%ÑÄë¼Å»½Ă«‡“Íj±ëØÁƯ·‡‘×8çÏÅ™‡ơ»’ÆרÛÄÓ‡Œá=ÍÓÓîÚÛÄÓ÷Ú‡Û«‡“Íj¸ÅăàÛ«‚ ½9Ù̉øÍÓ‡Œ‹È¶ƒ×ƒvÛÄÓ½àûÙ×ӄ›¶éÙY½“Æ¡răˆŸÙ½™Óä©ÇĂƠù×ÿÆÙŒë*«ÏÄ«ÔñíȵØßÚ­ÈéêÏÔ¡Û܈ÚÆ¾ÚÇ̉ù׋ÇëöăˆŸ;Û×Á—¶ÆØóĂñ'¿ß€Óźß‚vơêÙ½ÿ¯¶ăˆŸ;Ç̉µ߈ÏÔ™‰kß [ïS‘ơ±»¼­¼ôµa°»¥ˆ]1¾Åß„ƼÉ6¿Å²Æ¼ßÁ¾—ôé±»£ä©Ó߈„ÚơÔµƠ·Ôơº¶ôưÀÙÚå̉ å—ù×½ùêóÔ½›¾¾«‡“Íj›¶é÷ÁÍƠ§ß»ØơĂù×ưÀØY +ÎÅù×ăˆŸ;¾ÏşŘȧÓăˆŸ½èëö­Ä˜‰j̃ZîSöÁÛÀơèÅçÚëö†ŒÑĂ›¾¸Ú·răˆŸ;±öưÀăˆŸ²¹ÙŒë*«ÑØ«‡“ÍjÛ«‚ ½9¥Ø߈߈•°×ùשӫÔù׺yƒ½‹ÇàƠÑĂá çÚưÀÙŒë*«ÍÓÓÆ9¥‡¡¿ß߈üÀ߈«‡“Íjá —»«‡“Íj‹Ç™ô÷Á₫®¶Û×ăˆŸ;k•ÇƠăêÙÚ½ô¾¿íå̉ ÂĂÙëö“Ơÿ¯¶Ÿ1ơ´÷Á«Ô×¾“ ¿ơĂ›¾9¥‡ívô꼣ذ¿ +ÑÓó‡¸àÏÄÑÓ±»$›¾ˆ™‰kß [ïS§Ô‡Çá꿉ëö‡Œ£‡¡ÁÇ̉ơêáƠ€ºÅÔƒvÏ̉©ØÍË)éÛ9¥ÏŹÚ̃ƒvÛº̣ԋǽù×÷‡Úª‚ +¼9˜‰j̃ZîSĂüëöÇ̉ÁĂĂĂ¯G‹ø±»¿‰¿º»ˆ¾¡»óɇưÀÓÊY&ÅÓ¥ÛóÔ½€™Ô™‰kß [ïS܈Ơ¤Æ±»«Ó÷Ôº̉‚Ç⫇“ÍjóÔÁÛƒvׯ™ÛÙÚăˆŸ³Æ¸Å½ăˆŸ;Û«‚ ½9ù×¹à•¹ư‡±ù1߈ëÔÛ׫ạ̈Ä öŸ±¿ÁÓÛ«‚ ½9߈ƒÖ™‰kß [ïSù×Û™ûỞĂÙăˆŸ;™‡ù׃¾‘‹Ç¯ÈÏÅ߈Û×å¶Ô Úª‚ +¼9¥Ó›¡—¾Ï̉ßÄÙÏ̉±»ÏÅù×åÖ™ëéå±»¿ßºù‡¹ÛŸÙ#ËăàñÓ +÷ÁÍÇ‘Öáêƒv™Ø™‡ï‰éÓ9¥‡ÅÔ·ØƯ‰ÏÔ«‡“ÍjíơƠX½½߈™‰kß [ïSỞ÷ÁÑĂăˆŸ½€«‡“ÍjöÏÔ™Ô¡ÔÑĂÛ«‚ ½9±»ÉĂüÀ́v߈³Â“ƠÏÔå̉ ÷ˆº½ưÀ»È©‡¥2ßëM¥ˆ]1Ï ÏÔ©¼ÑÓ¹Ú¹ÚăˆŸ;kµØÏŹ༠ëöÖ¼ñÖíê¡ÛưÀÿÚ½ưÁÛ«‚ ½9ëÓ«ÔƒvÙ½ÑĐÛ«‚ ½9߈רó±»Û«‚ ½9ÏÔÊÖ‹ÈÁƯ‚mÜÅØ¹ÚŸ¾¿à›¶é§ô£äÏ|›¾ÍË)éÛ9¥ªdµØÿÚăˆŸ;É̃߈÷ÁóÇ£äÅÄÑÄë±»ÁƯỞ́vÁ¾±»ĂèơÛÇ™‰kß [ïSĂà™‰kß [ïSÑÓÏÄÛ«‚ ½9¨¼å¼ ¾ßªÓăˆŸ³¡Û™‰kß [ïSù×¹ÚƠơ©¼º©ƠÔX ơèŰ +êØ +ƒv‘«‡“Íj—¾“Æ—ŒøêÅÓ9¥‡Üå̉ ﻸÚßÄÙ«·3uU™‰kß [ïSÅØƒ¹ÚÍÄ߈«‡“ÍjÅØé‡à¾ÎÔÛ«‚ ½9ơÔëö–ˆ—¶ƒÖ׿8™Ô‘÷ư§‡¿‰Ûî—ˆ£ÇûÙÖÆ›¾Ï̉™‰kß [ïSù×ù×ñÓ߈ĂÛרñÓ¿ƯĂÙ‰ó¶ÓÔ‡“ËƠùqÆÏԽȋÈÓÔơÔÊÅ廽߈·‡‘×8çĂëöß½¡ÁÔXœéÓù×—Ó±»¿‰é¼₫ÍÓ8¤‡×̃ÚăˆŸ;‹ÇÀ߈ơê¡Ô«‡“ÍjªÚĐÓÿÚ—»ăˆŸơÔ¿½°»ÿ¯¶ÿÚ£Ư›¾ÇâÍÇŒÓƠéÚ½­ÖÛ«‚ ½9÷ˆÅ0ÙÚÁ¹Åؽ¾‡™‡½àƒv·ô‡«»Óر»Üơ£»óÂ₫!×Ở‚Ö÷Áéºç«™ïƠĂ¼ùÛ‡“º™‰kß [ïS™‰kß [ïSù×±»ëöÏÔ¾ơêÿ¯¶÷ÁÁÓØÏÚûƠăˆŸ;k«»ù×ÙŒë*«§Ô“ƠÙ½ùדÈÅÓß»ûÅ»ááº̀Ê)èÛ8¤ƒˆÏÅÈŨ鼇º—¶ơԯȧºßÄÙÿ×Á¼Ï̉¹ÚÏ̉›¾Á¤ó‡ÏÔù×Û«‚ ½9ÛÇÁä­ÄơÔÛ«‚ ½9«»ºóÔ­ÔçÇ£Ø߈›¾øô©Óß½¹Ú¢»ºÛºÍÓíØŸÓç'Û«‚ ½9ëöÏÔ¿ßÛ×ÏÔƒv±»9¥‡ĂÈ»‡—ˆ¬ÓÛ«‚ ½9ù×ơèÅɇ•×ó¶߈±»ÁÓ÷ÚÍË)éÛ9¥ϼ…\󋙉kß [ïS¿‰߈éÓ“ºÓ%³ôëö¿ë‡ëö™ÔÇÖ®GøÚª‚ +¼9ォ»ª»ĐÓ«‡“ÍjƠº×ƠÛÀ‘Û—Ó÷Á³Ơ¼̀ÓH¹ÚÙ×¼•…‹ÓƯÓ ¾l¿àñÁí½¿à̉ØÁ|Ùׯ«‡“ÍjÛ«‚ ½9µØ›¾½Ø‹ÈưÀËÇĂºåôëÓ"щ«‡“Íj§ÓÙ׸ګ·3uUÖ Ăº½ÏÔˆ»n¯È÷Ùí£Ø$™‰kß [ïS¯Ơ߈ÍƠÛßÏÅ»‡ÆÇܥȩ‡¥2ßëMؾ—¶Ëσv±»³ºóóÁĂ¢ä¥ØưÀ‹ÇƒÍÇ¿æ82¤‡2Ö±»ù×ÅÓ·Ø¿Á‡é/×:‘ø½Û×ÍÄăºĂºƒv–¶™‰kß [ïSY—ÓÅөǃ½ƒvëö™‰kß [ïS±½ñÖÿÚƯ Û«‚ ½9ơèÅĂÙ9¥‡ÿ&ÑØ–ÓÁ ëö¿‰ưÀ™¸½Â×Ó¾ÏÔÿ¶đÖƒv±»ŸƯ‹ÜÏŵØ߈½ÙÚŸ̃óÂù×¥ˆ]1ơÛƒv§æÔq öÁ›¾¹Ú₫¼-ï³2רñÖĂºùê¶¾÷Á™ÓăˆŸ™‰kß [ïSíÆÁ¼ûÓÆè·‡‘×8ç×ñÿ¯¶ÙÚµØåÁ½€Ù½ơêơÔø×ùׇŒ§Ó­ÄưÀ߈硃vëöÿÚ߈·Ó ¥0‡ơêÛ«‚ ½9߈ăˆŸ‡d«‡“Íj•ơêăˆŸ×ÚÛ«‚ ½9…»ăˆŸ;k¿—¶ø×½€ƯÓ ƒ½ŸÖ™‰kß [ïSˆÂÙ¾º›¾Äô™ÁôÁ̃›v×Ơ†7§jívá™ëéå†ÇÛêƒƠ³î›Ơ•ÖÏÔ÷Ù«‡“Íj½ÈăˆŸ;ä̉ǼÏÔăˆŸ§ô«Å»ÅÓ«·3uUëöÿ¼ưÜơĂ™Ó§ÆµØ̃ˆ·‡‘×8ç™Á¡ÈÛº‹Ç¼È÷ÁÛº™‡Û«‚ ½9éÓ­)ív´†ßÖưÀù×½°»å̉ ăˆŸ°»ư—¶ïQ±»£Øœ«Ô™‰kß [ïSÿ¯¶ƒvăˆŸ›¾·ÔŸ»—¾ƒvÇܯțvÛ«‚ ½9éÙƯÓ¼Û«‚ ½9öÏ«ÔÏĂÙ÷Úµ†ÚÀ½È±»±»Ÿäư»ù×ù××ù¾§Øå̉ §ÔÛ«‚ ½9Û«‡“ÍjÏåĂáêÑÓ߈“¹ƯNÿ¯¶ĐÄêµÜăˆŸ;kµØÏÄÓű¿·ÔÿÚÏÅÏÔĂôÙÓ«‡“Íj‘!ÛºỮÔO¾©ỜÄ(ëöưÀơà§Ôù×釾¿ô©‡¥2ßëMå̉ » ™‰kß [ïSœ²çÚÍÓÛ«‚ ½9©¼©‡¥2ßëM™‰kß [ïSᕽçǼ)ÏÔôêÇ"±»ÿ×½Ô»ÈÁ|YáÓºØщ“ºË‚ÓÔ׿8߈‡Ú—بڡƠ‹É0ơ·ÔùñàâÖÅÄŸ·‡‘×8çù×½Û«‚ ½9öƒv§ô߈ï|‡Úù×ÅÄẪˆÍÛíÆơê5£Ç¥ÛóÔ§Óå̉ µaÏÄĂºĂỞº½ÁÙÅëĂÿÚ·Ó ¥0ÅÔÙÚ¹¶Ù½ßÁçđƒˆ±ÈÙÚ½™”ñÚƒ¾‘½ƒvăˆŸ‹ÜăˆŸÚ×Ở™‰kß [ïSĂ½€Á̉£ØăˆŸ;˹™‡½¡ÈĂàÛÄÓăˆŸñÚ™»÷ˆăˆŸ;ƽô¥Ó‡Œ8¤‡9¥‡·Ô×¾Ÿ»‡ỔóÂÛ«‚ ½9éÔß»û½Åÿ×ÏÅĂÈÍÓ¹Ú¹ÚăˆŸ;Ù׫‡“Íj½­Ä™‰kß [ïSƯƒƯÑØËÈ9ëöÛ€µØÎÔåÖǼ£ƯÏŃv¿ÔÓÅÅÔƒvÇÖ“¹ƯN‡ÍÓÙƒÅÇÖ½™‰kß [ïSÿ×Ù½¹Ú«ÔÑÄë9¥‡ëöëöăˆŸ›¾ÛÄÓăˆŸ;ù×Û«‚ ½9đÓưÀÔơ¹ÚÛº±»߈ëöù×߈«Ô™‰kß [ïS÷ÚéÚ«‡“Íj½¿‰ĂƠ§Ó¨ÇưÏ߈éºù×§ÓíÆËÓƒvëö©Óèù¿ˆ߈é‰ñ5ñ·»Ó߈†ŒỞ¬¼Ï̉ÏÔÛ«‚ ½9­ÖỞƒvéÓ¤ÆƯ‰íêóÂψ߈—¶ÊÇĂÙƒˆƒÚ«Ơ¹ô˜‰j̃ZîS»ÓÇĂÙƒ½ëö·&Úª‚ +¼9ׯ™‰kß [ïSêö¹Ú‰ù×ưÚ±»ŸÈù׋É0íÂÏÅ߈ÉÁù×ơê߈‹Ó‘‚‡ºăˆŸ;Û«‚ ½9¹ÚñăˆŸăˆŸăˆŸ;kׯđ«Ô߈ù×ăˆŸ;ÁƯ²ÑÓöؽăºÛ«‚ ½9̀ÓưØß»ûĂïôÏÔÇ̉ÿÚÛ«‚ ½9‹Ç‡ºƒv™‰kß [ïS‡Ç¿àù×ÏÅôĂ»ÓơêÑĂëö‰¿IơÄŽÚ‡ưÀăˆŸ;™‰kß [ïS9¥‡±»Ù½ĂÙÅÔ«·3uU¿ô±»•Œ‹ÓÏÔ›¾³È£»Ù½«ăˆŸ;¯Û›¾ÚÀĂƠƒvÁ¹ăˆŸ;ă­ßÄÙéß₫Úß™ëö›Ú…»¹ÜíÖù×ưÀß„£Xöä5 +̉ +ÑÓƒv«‡“Íj½‡Œ£»½‰Úëöƒ•åÖ½̃Ö½±»±»¹Á™Áß»û«ÔκÑÅ£Øơê³¾ơĂ•Èû›µØÛ×ÙÚ˜‰j̃ZîSÏĽñÚ¿•×§ù»n±»߈½«‡“ÍjµØ±»Ổ«‡“Íj‹Èöß»û¿‰éêÛ«‚ ½9ù×ËÉ9ù׺ۺ…ƠÙ»½ăˆŸ;ºøêư‡±ù1©Ô߈½§Ó9¥‡×ñÓ×ܛӃvĂïçÎ̉ƒvà¤<üR¥ưÀơê‹Ü¬Ö€Û¡»ù×ơĂëÔëöÏÅÜŸÖĂ¼́ê×ƠÛ«‚ ½9™‰kß [ïSÅÓăê±»º±»§Ó˜‰j̃ZîS³Û×°êØ“Ơ›Ú¡Û߈›v«‡“ÍjÛ«‚ ½9±»®¾™‰kß [ïS“º¡Á߈߈ÍĩǂÖơê߈±¿½Ô‹ÇÅàÛ«‚ ½9¿¹߈·̣ÑÓëöÁăù×ÛÀù×í¥Á¹§Ô È¾߈‡§ƠÎ ưڱŸÖÑÓÁ×8¤‡Û«‚ ½9í‡߈™‰kß [ïS±»éºơÔØ×™‰kß [ïSÜ—¶¡1‘ÛëÓ»™‰kß [ïSà»făˆŸ;’¹ ÜN åĂƒvÙ½™‰kß [ïSù×óÂÿ¯¶È̉ …DZ»ÍBơÔÙÚ߈ÙÚ¹Á¼Û«‚ ½9ÖÆâˆ:jÅÔ³ÂÛ«‚ ½9ÿÛößÚ±»³Èíº—»ù×ËÓ×$º̉ĐÅkß [ïSùêíÛ«‚ ½9°» ™‰kß [ïSµ«Ñÿ¯¶­8³Øû(ÏÅÙYùô¼™‰kß [ïSÓ5¼€¯¼%ĂÙƒv­Äº«‡“Íj¼È½€·§D ăˆŸ¤ˆ\0ÿ¯¶ưÚÛ«‚ ½9ỞͼÇØ·Å£äù×ÏÔ߈½ØÙŒë*«ù×ƯÚ—»¾»™‰kß [ïSŸÏ¨ÇËÉ9ơÄĂÙÙÜ󶽃­Úù×µaâÁûÙßÁÙ½×ƠƒÚ°»̉%÷Á¬ô¸àÁ¹ÉăˆŸ;Ăº£ä™‡µØ½щµØơÔ…ôϹù׺ơº‹Çêöå̉ ±È¶èƒ¾‘ăˆŸßÚ•Èû›ưÈï½Óꙉkß [ïS±¿ăˆŸù×ºăˆŸ;këơÙưÀăêÛ«‚ ½9ƒÖ«‡“ÍjßÄÙÿ¯¶«‡“Íj©ăˆŸ­Ö¹Ú«¼ù×™q°»߈±»Ϲ̣Ă“Ơ¶å̉ ¡Ôù׹ڽܩÓÚ×¼€™‰kß [ïS„Ø™‰kß [ïS߈³ôƒỌ̈¶«Úçë¿àơèÅ—ÿÛºá ƒÖÓØ¯…»̉¼•Œ9¥‡±»«Ô½5ăˆŸ;kå'£ ©‡¥2ßëM¹ÚÖ¾ùêëö±»öƒˆÙ×÷ÚËÖÇØßÁĐÅ%ͼé`Û«‚ ½9µØÚÀÙ½êö9¥‡×ơÄ́Ó +áêăÇíÛ«‚ ½99¥‡Ù½¶‰߈ƒvĂ‘°ß»ûô¿Åѯ©Ç›¡êÓŸƠ…Ñ+ĂÙÙƠ›¾ù‰µØ·‡‘×8矾½å̉ Ûôï³2®Gøá̉ẳÏÔÙÚ¹ÚÿÚÿ¯¶»Ø“Ơ‡Œ•́Ï̉¡ÁåĂϺ»‹™‰kß [ïSÑæÏÔÓª¶2tT°»­Ø·Å™»ñÓÁ½ª»ù×›Ơ÷‡ƒvɽç½߈¹Úµ†÷‡À̉¡Ë%œ‰¾IăˆŸ;éÓÚÆ÷ăˆŸÁÅØù×߈߈‰¿Iù×χͪÁ ÁÛ×߈öÁ§ƠÙ½óǺÍÓÙÚÔơ ³Â«·3uUƠëöăˆŸ;ß½ÏÔÅàç̃ơºÆØç½Ù½ƒvÏ̉«‡“ÍjĂƒv£Xß»û߈§±Åù×ơÄÛÀÍË)éÛ9¥÷‡¡ÔÆ̉ÙÁăƒ´ÏÔ÷ˆÓºÙ½›¶éâà±»߈Ø×Ç»óÇ÷Á%¹˜‰j̃ZîSª‡’̀j€ƠÑÄëơÇơ»ÑØψÈẰʈ¾û½ï½³²ñÓĂÙÙ½åÛ«‚ ½9ñ÷‡—¶øơ —²Ư‰Û«‚ ½9¿‰&ÛÄÓ°»‡߈›¾ăơÛ«‚ ½9ñÚÍ’½±»ÆôíÖ«‡“Íj½Û«‚ ½9‡Ú©ÓÅÄ›¾½€½ù×›¾•‹HÇÖÍåçÚÿ¯¶ù×Ơ°»ƒÖÓŃØÅØ·‡‘×8çÏÅÁ”ÔưÀ‘Æ’Æ °»ßÄÙƠÛ«‚ ½9ăˆŸ;kÎ̉åĂÆÖî¶äÁ×ÓĂÈ™‹Û×Û‡ÚÙ̉ÙŒë*«ÏÔÇÖ̃½ «‡“ÍjùꙇÙÜé‡ö‡×ù×ßÁÍ߈±»øêщ뼡Ưù¼¥ˆ]1Û«‚ ½9ƒv©¼§Ơ‰ÔÛÆÛ½Ç̉«‡“Íj¶¹$›¾ăˆŸăàÙ½ù×ôĐæ ăˆŸ—Ú±»µØÏÔå̉ “Ⱦ§¹ÏÄå̉ ­Åó|«»“ƠµØ¯æäô‹ÜÙÚ—Ó߈±»ùë±»ăơ9¥‡ưˆ›¾§ô×ĂñÙ̃ˆùüÏÅÛ«‚ ½9ùê‹ÛYÑĂÀĂº½±»›¹¿‰©‡¥2ßëM—Ư‡xÏÔ‰w£Ø߈âˆ:™‰kß [ïS÷ÙùôëÚ«‡“Íj߈§Îå̉ ₫®¶å̉ ·Ôߌ‘Ö½øê×¾߈“ƳÁ‡é/×:á ™‰kß [ïSÓØ±»ÚÓÛ«‚ ½9ưÚĂ¼º½—¶™‰kß [ïSß»ûô“½ƒÚÅĵ†£äëö³Æ‘6›¾ó#­Ă…ÔÑÄëå̃ÇĂ™ÉùëÜ8¤‡ÙÚñÆëö°» +‡Ç­ÖËÖóô™‡³ß»û©‡¥2ßëM̃ˆ·‡‘×8ç¿Å™‡“ÆƯ¾«»£Øùê½€Ơ°»ĂÙ¹̃¯Èû(ÙÚ±»€Ó…ƯÿÛ—Ö›¾ăÁäñ«‡“Íj‹Üä̉ơÔ¨¾·ÔÍÄÏÔĂÙ·ÅÓψ߈߈ÖÆ¿‰…·Ô‹ÇỬ¨¼ùêơê·‡‘×8çÏÅ™‰kß [ïS±½™ƒˆ«‡“Íj•ŒơÔ¡È \¹Ú¥ˆ]1ëqăˆŸ;ÍƠ½€¬ÖÚÀ¬Ö¬€ơêÏÅù׵طº—»Ó¹ßƯׇtÓ~!∃vʹù¾Ó¼›ûƒØ™‰kß [ïS»ØÑÔÓ5“gesÁÅƠ¿ºå¨Û×·Ô¡ÈÛ«‚ ½9ñÚÛ«‚ ½9ơê“Û±»ŸÅ½¥Û“‚Ø“¼“烈å̉ ǽÍÄ“̉±»¡Ơ÷Ú—¶ï³2‡ºϼëöÏÅçÚëÓíê÷ÁơÍË)éÛ9¥¯¼ûê‹Ü½ÍÄ«‡“Íj߈‡Œ̀Ă®È¡Á—¾™ÁÍįÈÓ«Ô¡ÇôÚ׫·3uUƠñ%¹Ú›øêéô‡¥2ßëM½ïÚ“™‰kß [ïS©º‡“¹ƯNƠ³ØăˆŸù×κăˆŸ;ưÀ›¶éăˆŸ;›¶é·Ô¿ô‹Û½Û«‚ ½9߈ù×íø¿-ëÓÖƠ½ĂÛƯÓ ù·Û«‚ ½9ç)«»§½ëơ‹Çơêívƒv«»ÍÓ…Ô«‡“ÍjĂÙ¼Ô߈§ôƒvޱ»ív߈¶Ôѱ»ÏÔ°½ íÖưÀÛ«‚ ½9Û«‚ ½9߈±»Ă£ÔĂ¼ĂÈÿ.¤ÓưÀù׺ơƠÁĂÓỞ¾×½çÚ›¾ƠXù×ơĂ½çÇóÂÙƠ§ôƒvÇŽº™‰kß [ïS—¶™‰kß [ïSÛÀĂÙß»û«»ÿ¯¶ÛƠª‡’̀já߈ƒ×ÿÚ£ ­Öéê«Ôç̉ù×Ù½ôÛ«‚ ½9Û«‚ ½9Ăâôä×îÅ «Úÿ¯¶ÅØ÷Á߈ưÁ¹¾ëöóÔóƒÖ¥Ó™‰kß [ïS߈Ơä×ßÁÑÚÑ¿ô½€£‡¨Ç©,ÎÚÙ½™‰kß [ïS•Èû›·Ô¯ƠLăơưÀÑÓ¡È¿ßñÓ±/ψÙÓѶ“Ơù×Ơ±»ùê×ܵØɇ°” ç̃ׯăˆŸ×Ç»ŽÛד¼›Ú™‰kß [ïS²Ơ˹ùôѯ׿8»ÈÅÓ߈½ăÂô“ï¹ÚĂÙµ†ƠöÁ߈¹ÚåÁÛ«‚ ½9ǼÏ̉»ăơÚª‚ +¼9ÍË)éÛ9¥©¼›¶éÁ̉ëöÊÇưˆ™Ó‡ºö¼™‰kß [ïSÓØ§à°»­Ä½ôù×¹Ú¿º«Ô·Ô‚äôÎÔæơëö©‡¥2ßëM¼ ƒ¾‘…ÇÏÔ­çùǺ§ôÑÓĂÙ² ·‡‘×8ç߈ó¶™ÁÙ½ăˆŸ;ŸØăˆŸ;»‡ÖĂ߈ĂÙ¡Ô­Äô½ÏÔ‰¦Æ߈ï³2›Ûû(ưÀÛ«‚ ½9ù×ùêû¼“Çưˆ™‰kß [ïSîºûƠ•½ƒˆÏÔƠ×—Ó“‹¯ÈËÉ9ơ꫇“Íj½€™‰kß [ïSÏÔ»ØÇÖ™‰kß [ïS9¥‡Àñ»ï½8¤‡×…ö±»Ûº8¤‡Áñ©Ü§Ó¶ƠưÀăà½ÙÚưÀ½Ô½™‰kß [ïSÓØĂ¼ƒˆY9¥‡Úª‚ +¼9¿ØÍå“ƠÓ¾‰ĂÙ9¥‡߈Çè¡»ƒvµÛ»Á½±»—»Ổ÷‡́ÅƯ܇ÇÛºº±»å̉ ø¿ăˆŸ;§Ô‹ÛûÓ·Å—¾ßÚ£X™‰kß [ïSÁ‡é/×:¹Úëö±»—»—»ËÉ9Ñ8ăˆŸ±Ô¾×YăˆŸéº«‡“Íj¬¼9¥‡µØ߈̃ˆÚ×éºÁ̉‡º›¡™‰kß [ïS̃ÁƽÇç¡Ô«‡“Íj³‡xăˆŸ‘¾±”¯ÈÚ×ûƠ¡È¶¬Ö߈·Ø™‰kß [ïS¶‡Ö8æáØÛ«‚ ½9±»«»æÇ±̉ÏÔ¥ØơÔ™‰kß [ïS¾ß¯±»€ºÙÚî½³Úª‚ +¼9Û«‚ ½9å̉ —»ÓÆăˆŸ;˜‰!j!̃!!!!Z!îS!»ÜĂĂ ›­±àéMô鱿ºØ«‡“Íj˜‰j̃ZîS÷ß•«‡“ÍjÛ«‚ ½9ÄÓëöƒˆÛÀø×¥Ø–¶Ù½ï»ª‡’̀j̃»ú«÷ï»ăˆŸăˆŸ;™‡äù׃á¬ơ꿉́ơà¬ч†x«»ÛÀщ¥ˆ]1߈Û«‚ ½9±»öơƒv£Ó׵؀¼¯¼‡xƒÚÁ½ñÓ“Æ«Ó9¥‡¯Ö±»©¼ù×½•×ƯºóŒñÚÑÓËÖ³ÏëöơÉÚª‚ +¼9ÑÅâà¥Öÿ‡ä‰ỞªÚ½€ÑÓ£»ÓÆöÁƒĂ«Ô˹ßÄÙ$́∥Ÿ£Ư·‡‘×8çÛ×Û«‚ ½9Ơ£ä·Ôͦùëơê¨Ơÿ¼ơ»ô±»Øåð»±̃ûÓăơëö¹ÚµØÙ½̃ˆƒÚ­½¼íÖ‡«·3uU÷Á™‰kß [ïSÛ«‚ ½9ăà›¾߈ÍË)éÛ9¥³ÚÄ̉Ÿ ï½åÁÙÜï»ÁƯ‡ÚÅØÛ«‚ ½9öÙ½¹³ÈÏ̉ƒˆ«ÛµØ™‰kß [ïSÿÚăỔc߈Ú×¼ÔÍÙÚ™ÓÏÄß»û›ơ½€ˆƠœÁ‹«-‘߈˜‰j̃ZîSûƯϼÓ¾Û«‚ ½9ÓØÚº +«»ä̉™‰kß [ïSëöׯĐÄê¹àù×™‡߈±Á¹ÚÛÄÓ¸Úï½¹¡Û›¶éçÚ̃»úñÚÚçºăˆŸ߈Ï̉Û«‚ ½9ù×ĂÙÏÔ½̀Ơ×¾¯ƠÅÔ›¾°»³ÂăˆŸ;ưÀÅ»‡…ƠƒvơÔƯđëÀåÙưˆ¯¾«‡“Íj»‹Üŵá ¸ÚăÇí«‡“Íj«)ƒv߈«‡“Íj‡߈‹Ù³³½§ÔỞáêëö߈ăˆŸƠXÏÔÑæ›¡Ÿ}º‡Û©‡¥2ßëMđÓ¨¼·Ô܈–Œ›¾ĐÓ¥Ưô Ñ·ÏÔ‡ÇỂ†đ5ƒÖËÖ£Xö«ÔÏÔ•’ĂÖÍË)éÛ9¥áƠ°»ÏÅ‹Ùå-­Ô¡ÔíçÙÚöĂÓ¾‹Çƒv™Ôÿ§ăˆŸ;k±ëØŸ}ƒvÓØ¯G‹øÛº«‡“ÍjƓƷԙ„߈©ØĽ«‡“Íjù×ñƃv«ÔăÁÁƯ‡ÇƠå‡Ù½ƒˆ•Œøàù×χ÷å5Ó ½߈ºÛº™‰kß [ïSÛÄÓÏÅ”ŒĂÙăˆŸÿÚÇÖù×­Ô©‡¥2ßëMÓØÓÔ—¶Û«‚ ½9ÏÔíê±»Á‡é/×:ÄÓœĂ³ÆưÀ·¼Í7ÅØÙÚÅØ±¿µØÏÔ½߈ƒvôÙ̉ĂÙ­ăëö‰Ô§χ“Ơ¶ËÜÈù×ÿ¯¶ÙÓ¥Ø×¼ơÔăˆŸ;˜‰j̃ZîSçÚ™Á‡äゥÀ‡ÇöÁívåô­€¾ÜÓ »ÅñÚî²2€ÎÔÑÓ÷ëö™‰kß [ïSö³àÓ±»óÔ‡Œÿ¯¶ăÇ훹ĂÙ·ÔÏ̉μïôăˆŸ;ëöÛ×™‰kß [ïSÏÔù׳àßÄÙËÉ9ƒˆ°» ¡Á¥ˆ]1ÏÅ‹ÇüÀï»êö•Œ߈´‰‘ÙÅ…¾ĂÏÔ¡Ô™‰kß [ïS‚ ǺƠ釣»ï½Í­H¥Øû̉ƒÖ¼ÏÔ“•ÏÔÛÀ߈½€ăˆŸăˆŸ;â»ôù×ÍÓơê«â¡Ư±́ÙÚ÷ÙÆ"ÏÔ‰Ôó×Úª‚ +¼9±¿œÜ Ùڣȭ½¼ĐÓ©À·§D ÏÔđÓÍÓŸ\çÚ¾íØmăˆŸ;¦Ø3ƯÓ Ï̉‹Ç‹Ó½€ƒ½ÔXĂȳ§Ó¹Ú½Ù½ѶưÀ­Ö߈†Œ—¶ù׫ÔÍƠƒà›¶éÚêơêô½±½¯XËÉ9½Áöƒˆ̉ÓưÀî½çÚ¡ÈÏÔñÖ¸ÈÙ-ëö¿́Á̉ù×ëöáêÅØ¡€½ÏÅؽÚª‚ +¼9Ù½˜êè侇Œê¼°¿ß›ÚÇÖƯÛº§ÓÏԛԳȽàê¹Ú©ÓĂÖ•Ö»ÅÏÅ}©‡¥2ßëM³ÈßÖÏÔ½ÁƯ›¾åàÙ½ùæ¹ÚÓØåÅĂ“È¯ƒßͯ¥'=U#QK¯Âÿ‡¾»¿“½åĂửù×ÅÏÔ…¾ÑÓ“º«·3uUÑÄëĐØµØ³ºóÅÓ–ˆÔ½ƒvÉt¹Úù׫‡“ÍjÙÚÙ½µƠƒ½‡ŒÉß»ûÍÓÇáïÀ‚ƒØ°»ÏÔ§Ô£äß»ûå»ưÀ¥ˆ]1¾×¿8ψµëËÉ9¡Û«‚ ½9óÔÙ×ăàéÓÍÄ©¼ñÁôêÿ¯¶¡ÈăˆŸË¿ơêăÁĂñÓàÛ™ëéå÷ÛöÁù×ïºÑÄëéêßÚ¡Áùê߈…­Ä°»¿ƒ×ÈĂÁĂ¡»©Ç¶‰Ó¾ÑØ™‰kß [ïṢÔƒvÍBëö߈¶Å€ëÙ½â½߈‡Œ™‰kß [ïSñ×¹ÁéÔ‡º‘éù×­ÄÅêöç̃¥Û±»™ÓźÙÚĂ¼ÓØ™‰kß [ïS¯ÈíêÑÓÙ¼™‰kß [ïS߈­Ö½ĂÚ×ÎŧÔÁåÁÿ€ăˆŸ;Ó̉ Èÿ¯¶Û«‚ ½9ă‚ÑÅÎÅ ØĂÙÛ«‚ ½9ù×™‡̉ºù×ưÀ߈Ù½ĂÈíÆÏÄÛ«‚ ½9ơĂ‘‡º̃ˆùê‡×óÂ߈‡ù×ù×߈µØ‹Û•Œ§ÓÛ«‚ ½9ơÔ©)½µØÁ̉«»Á¼“ÈÙ½½ùê±»³©º«‡“ÍjÿÚ–ÓëöÙ½½Ô×¾±»ưÀ™‰kß [ïSÛ«‚ ½9±È»¼‘‚Ö ×Ă½Ô«âù×¼ăà¥×Ù½‡xï½ÏÔĐ®¼ÅÓ‘Æ“ÈÓÆ×̉ƠƯÚ±»·‡‘×8çËÉ9›¾ßÄÙÍÓÛ«‚ ½9ÏÅÑÄ뫇“Íjщ·ÔÛ«‚ ½9¿‰ƒˆ£»ÑÄëư“ÁĂÍÓ9¥‡™‰kß [ïSăˆŸ;«‡“Íj®Ó®Gøǽ×̉µØ¹ÚơéÑÅ“ƠơêÙÚ¾Ïű¿ăˆŸ;ƠÖ̉ù×½óLJډăơÿÛ¡Áÿ×ù×ÏÔÄ̃ˆµØß»û«Ô°»Ù׫‡“Íj™‡ù×ÍĂÏÔÿÚÁÙù¾ăˆŸ;áÅÓơèÅñ́ƒØñÛÑ·»çù×ĂÙ¸ÚÁñI¿ØØ÷Á½ĂÏÔº¨¼‘Æ߈±»‡ÇûŸ]ƠXϼÙ‡Ï9…ÜψÓº±»ƒvßÁÇÛä‰Ù½§Ô«‡“ÍjÁƯ®ĂÙ¯Ô™ôåpÍÁ¥à±ÔÙ½¥ØơĂƒ߈µØùëÛÀÙÅë§Ô°¿±»×Ơ¡ø߈¿Lùט‰ j ̃    Z îS á Û«‚ ½9é‡ÏÔÛ«‚ ½9¤È ơèʼn¿Iô߈ëÖ߈ÏÔ«»ÅÓßÚ¹Ú›¾—»ßÖшº½“¹ƯNƯÚ½Ơ±»‡¿¹Ú±»êöơèŋܱ»©ØâˆƠăˆŸ;ù×Ù½öÁƒÖ±»ăơ½Óˆ•=‘½Ï¥ĂŽÁƯ™‰kß [ïS¥Ü†ŒÍÇ·‡‘×8çà éÚÛ«‚ ½9ëö‹Ç‹ÈÑÓÙÚÏÄĂºù×ưÀ§Ô±»½ĂÑ`£Ô«ÔÏÔûш·‡‘×8çáƠ•‹HÇÖÙ½ÏÅÔX‰Û‹ÇƒØ•ŒôÏ̉ÍË)éÛ9¥—»¥ØÛ«‚ ½9Û«‚ ½9ÇÖÙŒë*«ï³2߈±¿ûÓ™‰kß [ïSù×Ÿá ™‡Ă™‰kß [ïS¦Æ¡Á¾»™‰kß [ïSÍÓåĂ¿¹¥ÜÙ×ñÖ³ÂÏÅÅØĂÙ·Ô8¤‡Ọ̈ĂÛºû(ÑÄëÏÔÛ«‚ ½9¹Úè‡ÏºĂ¿ßÏÔËǵƠ÷ơÏÔÀƯŽϼ¹Ú߈߈ƠƯÓ ÔÏÔé‡É̉íÖͼ₫¼¶ÅÏÔ›¾í9¥‡ßÁưÀµØù×ø×—ˆ›¾ƠÄ‹ÓưÀùדƠ»‡Î·Åùê±»öå̉ ëö›¶éăˆŸ;kƒv½™‡ù×öÇñ™ÔÏÔ¡ÈÙ×½±»½'ßÄÙ™ÛÇ%Ù½ăˆŸ;Ån·Åù׫‡“Íj™‰kß [ïSÎæ®Gø˜‰j̃ZîSä̉›¹źĂÈçÚ±»¡Á·ØĂëöỂ€ƠơêËÇ߈¸ÚÏÅăˆŸÛ%»Ø¡Ư¿Å¹Ú¥‰ÍL…½¶îô&9¥‡ùêÉvƒvÙÚÍęԧô³ÏÔ™‰kß [ïS½áÓ²ØĂ©‡¥2ßëM­Øô±»³‡“Ù½£Çá¬ĂßÛ«‚ ½9Û«‚ ½9½€®öơ½Á|óÏÔÛ«‚ ½9ÏÅ›¾ëÔ“½ÏÅÁ‡é/×:µØÇÖăˆŸơêÂÙăˆŸ±»ăˆŸ;ÙƠ—»ƒÍÓëö#¹ùăàÛ«‚ ½9›¾÷ÙÑÓơú‡Œ9¥‡Å»—–±½́ºËÇçÇù¿Û«‚ ½9ƒÔûÚ™‰kß [ïSÏÍÓÇÖ«‡“ÍjƯ‰¦ô%¢äăˆŸ;·‡‘×8爃ˆ¹Ú¸Á8¤‡×«&—ˆưÀ½Ôëöƒ¾‘‹È匿NÇØÛ«‚ ½9½­µØ½½ÏÔù×ïđµÛ³××öÙ̉±»³¹Ú™‰kß [ïSùת ¶ 2 t T öÁÏ̉™‰kß [ïSñÓÚª‚ +¼9½°êØ·¼Í7ÅÓƒ±¼ưÀÏźù×ÈѦÅØ÷ÁÁÛÑØ¥,Û«‚ ½9’ÇƯÓ Äôö Ëûç®Á½ëöùëù×ỞăˆŸơ ˜êèäưÀ›¾‘àÙŒë*««‡“ÍjëÔ·ÅƠŽÊÓ·§D ¡Ô}·Ô±»·º»Ø©Ø¯¾«‡“ÍjÏÄơԃصث‡“ÍjÆÿÚơêÙÅëÈéJé‰Ó5“gesÁÅä̉  ®ÈíڇǛv‡ŒIÅ¥Ỵ̈½ŒÀƯË”¤½ÙÚߌÛ,›¶éÑÄë¡ÁÛ«‚ ½9¡Ûó^©Ç·Æ‡Ç×Ơ₫®¶ƒˆív9¥‡½µa½₫®¶ăˆŸĂ—ŒÆ°¿«‡“Íj—¶™‰kß [ïSÍÓ¾ºÿ×Û«‚ ½9¯÷ăˆŸ;k™‡¯}ÅØáÀ߈›¶éÙ·Ûµa¥Ø»Ø½«·3uUăˆŸ;̃ŒÚ,ñûö¶ª‡’̀j£ ê$ëö­¶½ăàëö“¼ó“ĂÙ±»±»“½©‡¥2ßëMù×߈˜ÔëöÙÚÿׇ(ÏÔƒv«â‹ÇëöĂ£÷Ô¹¾½â'Â3(©‡¥2ßëM©Ü“ÇóĂ‚v«¼ăˆŸ;k÷àƒÚ™‡߈á߈»Ø¿ôÛ9¥‡¿ÏÔ±»ÂÈÂÈщ¾Å÷Ô±»đÓăˆŸ;kÿÚÿ¯¶ûƠ±ØỞßïƒÚ«‡“Íj÷̃ù׫ԫԥØÎÔÛ«‚ ½9ưÀñÓùê…èô›¾¿́÷§±»ă» ƠÑĂÿÚ»¿́ĂÙœĂóǨصØÅ‹´¥ ±»ƒvÆù‡¡Á¥<9¥‡·ÔĂÛ™‰kß [ïSÙĂûÓñÖá ƒ‡º8¤‡ùêÙÚ˜êèäƒvÓÔÙ½ĂȨº¡Ô«‡“ÍjŽơêÏÔÙÜïƠ¶CC»ÁëöƯÓ ؽ¥Ø—¶‚v¹Ú”ŒÇ̉¡Ôö¾¹,ñ£ØơúƒˆÛÄÓ—˜ưÀơÔüê³”·‹‡ºÏÄA±»Û«‚ ½9–¶Å¾Ø£ä›¾жù×߈ÍÄùơ‡Ç¾ăˆŸ;ÍƠ9¥‡Á(ơÄ·&¼€ăˆŸ;µaûƠÿ¯¶÷ˆÓº˜ô™ºôêµØÅÓ·¦D ¢q‹Ü™‡÷‡½€å̉ ±Ø‰í™‰kß [ïS±»ëöº½ ÿÚµ̣éÓÚª‚ +¼9™‡©Ó›¾ơêÛ€Ơù׫‡“ÍjçÚÙä‰ñÆщØk÷Áß»û½¨¾¿‰ÑÓ›¡“Æ¢»‡Û›¡ñÓ•î‡ËÓ±»×¿8©¼©‡¥2ßëM«Óù׿‰çc½Å»“È‹'—¿ñ»ÓÅÏÅ«‡“Íj9¥‡ăà§åŒ¿NÏÔáÛăà‚vÉ"Úª‚ +¼9«Ôù×ÛÚ°»¶ĂÙ∩ӹÚÓØ§ÔÏÔ˜‰j̃ZîS«‡“ÍjßÄÙưÀơê²”°»ăˆŸ¾Û׋٫dÑÄëÙùסȃփÔä×ëöüÀÙÅëơêµØ“ƠáêơįÛÙ×Çù×ï‡Å–³ßƯ‡øµØ˜ôù×Å™‰kß [ïSåÁô×Ơ†7§jă¶ñÆ×¾á=ù×ÇÖɵ‚v Ûº·Ô¿ô¼ÚæÇÏÅ›¹öÑÓ½ŒÓĂٓȣDz ©¼ơÄ«»ËÉ9«Ô¾ÅÓÏÔ‡ñچDZ»ÅÔÏÔưˆµØëÔồĂ©‡¥2ßëM±»Ù½…£­÷ÙѶ Á ¿Đ½Ø¯¼¥ÆÅ؉y×Ơ߈‡‡º°ù×¹ÚÉ ƠÓÑÓ¡Ôƒ¾‘ăˆŸÿ¯¶߈Ởá êƒvù×½Ô¿©ˆ‡ÚÑÄëÛ«‚ ½9ĂÙ±»×Ơ†7§jñÓëƯÓ —ÓƒØϼÎ̉ ËÇÛ«‚ ½9«º¡Èß„©ÇÙ½ó#ÏÔơÔ¹Ú—¶±»¿»´a Û‹ÇµØƒˆ‰×«‡“ÍjªƠ9¥‡íÖ«‡“Íj©¼ăˆŸ­ÖưÀ‰¿IíÆóÇóǯÓÓӵșÁ»‡ÁĂ·Ô›¾ù×½íÖß»û½Ž߈ÁĂÏŘêèä·¼Í7–¾±»9¥‡ăˆŸ;«µƒ¾‘ϼñ,‡ñ5˹ù׫Կū‡“Íjă»ƯÓ ̀ Ê) èÛ 8 ¤   ű¿Û«‚ ½9߈˹ƠڣǽỖ»ú¯Ơóçô½ÇĂ•Û߈§đ™Óơ$îƠ¾¥º£ÔóÄÑÓ…Ơ“Ó½ù×ơ»ª»ÿÚ¿‰…Û«‚ ½9ù×ÁƯ‡߈çÚÖ¾Û×щ³ĂÈÙÚ³¹ÏÔ«Ô¡»ªÚ߈ÉƯÇØ«‡“ÍjÏÅăà•Œ¡ÑÄëĂÈëö±»Á‡é/×:öÁƒv߈ŒÁëöù×ù×Ă΅ֵصØ߈« ©ƒ»5•ŒÑÓÚÄ̉߈°»±»ëöËƠ߈áÛÏÔ“ÆơêÏÄĂàÍË)éÛ9¥™‰kß [ïSáØ¼ôå»ăˆŸ;k¾÷Ú—¶‹Ó8¤‡×ÑÓÚưÚÁÚÏÔưÀ«»“ÆÑ؇Œ½Ûº™ëéå«âÇÖèûËs»ØÑĂ½éÓ˜‰j̃ZîSÙÚ©À­€öÁÛ×ǺÙN§ù׫ԫ‡“Íj߈ù×·‡‘×8ç©-ëöÅÁ™%öÀĂå̉ ÏÔçØíºɵ›¹ËÉ9߈߈ÙÑÄë¹Ú™‡ù×±»Û«‚ ½98¤‡ơê…Ö©Ó˹‡ŒÿÚÓ.‹ÇYµÛÏÔ±»ăÇí¨ÇÓº™ÓÅÔóÔÇ»ÏăˆŸ;›¾º߈°»ùÜׯñÖ½ï½Ü»„纘êèä¹Ú¼çÚƒvëö±»Ï̉¹ÚëöÛºâˆ:÷ˆï»½«Ú›¾á=ÍÓÚª‚ +¼9ÑÓ©ˆ™‰kß [ïS“Ǧ¹ £ŒĂÙ°»ºăˆŸ;̃ˆÂÓØ߈ù×½ï½çÚĂôÛ«‚ ½9×*Ô]Ÿ«¼å̉ ¹½ƒc§Ô₫ ®¶ ½à߈ơĂ¿‰“Ơßô·€ÏÔ‰™Ó߈îű»ç̉ØÅêƒÖ“Æù×ù×êÖÄÓØÅ!ê!ưÀ¶è‹Ù·§D Óº₫Óº«‡“ÍjÄ£äĂ4¢Ó³Æ¿́׿8ëöơéÛ«‚ ½9ăˆŸ;¯È˹«Ô™‰kß [ïSưÀ—»™Ó9¥‡÷Áëö©y¬Äơêß„ËƯăêÇăƯÛºñÓ°»œÜăˆŸñăˆÿڃשܗˆ‚ˆç£¡ÈăÁ¡±½«‡“Íj‹ÛƒvĐ¹2–¶ưÀăˆŸ;ù¾™‰kß [ïSù××ƠǺ…Ùu¿‰₫Ô*“ÛƒvÚÆ•Èû›çº¿©ÇêöíÚ™‰kß [ïS8¤‡‹Çƒé…öÙ½Ú­ÄăÓ—=ŰÇÅÏÄư“¿±»é‡…£­³È÷Ôµ†ăÇíÛÀă꧇ÏÄáºăàưÀÅØÍÓ¦ÈóĂ©ù›v™ô¿—“ÆëöǼưÀçÚ™‰kß [ïS™‰kß [ïSï½ù×ơëÅÓťܽĂ×Ơ»½³ƯưÀ¾öñÖ™‰kß [ïS±»щÿ¯¶©‡¥2ßëMÛ«‚ ½9À½4Û«‚ ½9£ØƯºÓØ­vŽ‹Ü9¥‡â½¹Ú¢»FÛ¹Ú—¶ï½ÑÓ¾ßíØĂ߈ƠX™‰kß [ïSËÖƯÓ ívù×ä̉Á‹¿±”£ä匿N₫®¶ƒvƠ‹Èù×Û«‚ ½9™àăˆŸ;á̉¾ÅÓ«‡“Íjÿ$™Áëö±»Ù×í—G» ûµ§·Ø߈G½¹©‡¥2ßëM½ăˆŸơêăˆŸĺÈ›¾¡ÔÏ̉ßÏ™‰kß [ïSóÆÏÅßÄÙăˆŸ;Û½‡¯×Û«‚ ½9Ă$±ëتƺÁƒvöÁĂ ¬”·Á“Ơá꫇“ÍjÙ½›‰©ÓĂÓívưÀ߈ß»ûăˆŸ;—¶Û«‚ ½9á ë×ÛÀ“ÆÓ¾Ù»™‰kß [ïS­Ê³…ß»ûăˆŸ9¥‡ï½ÏÚÛ«‚ ½9Ž›Ú±»ÅØ¿º˱«ÔƯÓ à ³Ø߈ç̃°»ëÓ·ÔÙÚù׿₫ơÔ߈ÅØưÀÓØù×ßÅÇ ÑÄëÇĂ߈⻃ˆĂÙơÔ™ëéå¡rµØíØ›¾ù×Ä– 8¤‡Ñóù×ÏŹÚÏ̉˹ù×™‰kß [ïS»•ÿ.«d‰¿IóÂá íêñÆív§ôíÁ§ôçêöÙñÚá ưÚïÑÓßá9¥‡ëö¾ÿ$߈ó”¾ïƠ₫!«‡“ÍjƠÚÀƯ½Û«‚ ½9ùÚ‹Ûųl§Ôù×ÿƒv߈“ƠÛ«‚ ½9ÏÔáê¾ÅµØÙ½ºËÉ9ÏŽƯù׃v½Á©-µk»ÑӜܷԛ¾Ù€ù×ù×ÏÅ Ëû‚ÅÛ¿(ĐÄê‡ÇÏÔơéÍÓûÍàÓ ƒÔƒ×ÓÙYœÜÁÙ½¾ô©Ø¡È«Ô«‡“ÍjÇÖ·‡‘×8çÍIJ¹߈ùדÆÛ×ù×·¼Í7ÙÖ°ÙÅë㋱»çô¯¼ỔêØ£ƯïÅá Á÷Á“Ơ›¾ÇưƯ!½›¾Ûº½Û«‚ ½9™‡ăˆŸ;ơ$ÈÅ–źù×ưÀ½ôß»ûï³2í߈ç¹Ú±»ÿƒv›¶é…ØÏ؉j̃ZîSé·ÙŒë*«ñÆ¿½½§ÔÇçÛÄÓ«‡“ÍjÏÔ½ăˆŸ;±¢­Ç±»«»Ở°»ơèÅúÙ +щ·ÿ¯¶ăˆŸ;kµØ8¤‡Öº«‡“Íj©¼ĐÓå̉ ăˆŸ¿º£äÉÜÁ‡é/×:‡Çă‘·ƠŇǧƯ·ÜơèÅÛ«‚ ½9ß»ûóĂ©‡¥2ßëM%ÍÂáß»ûÓØÏÔ°»©ØăˆŸ;™‰kß [ïS÷‡¥ˆ]1߈ù×̀ÓƒƯ™‰kß [ïS³Ø¼ëö‡“Ç%·È°ÈÚª‚ +¼9Åëö½ăˆŸ;k¹½™‰kß [ïS±Å‘ñÖ‘Ö̃ˆâÁÓÆ‰àÏ̉Ç̉ÑĂ«‡“ÍjĂÙ—¾œÁ ĂĂ ›­±àéM¯ƠÛ«‚ ½9£ÁƒÖ߈ăˆŸÏÔ‰¿I÷‡‰¿IËÇƠó±»Ïăº̣ÄŸ»ù×µØëö·‹”ŒÅÙ¿‰Ơ÷Á˜ÁŸ}ÏÔñcÏÅùê±»½ÛºÁź¾ÚàƠÑÄë»(ĂÙ¡ÛÅÔÅØƒˆ­Ö́ơù×ăà—¶ÆñÚ•ÂÍÓÁgëöăˆŸƒĂßÄÙûÓưˆóÇ‘ èn§Ó«ÚñÓăÔ™‰kß [ïS̃ŒÚ,ö÷Á½€Í™‰kß [ïS½߈›¾Æ9¥‡÷ÁƯ߈éÚ×Û«‚ ½9ù×ø×!æºĐÄê9¥‡ëöÙăà¾çôóÔÇÅï³2©‡¥2ßëM¡Ô¹Ú™‰kß [ïSèÓï½ĂÙùן}ë߈ĂĂƒÛ«‚ ½9Ăƒ¾‘ÿ×Ă£»¿ß±»ù׫»‡ŒĂÙ³–ïiăˆŸ;¹Ú‰ÏÔöívƒà›‡ù×±«ÔÙ‡Ï9…›Úà ÑóđÔĂ¼£°ÿÚ½ÏÔ¦Ó̀Óëö•ŒÂàÛ«‚ ½9₫&›Ú½’LJº§ÔÛÄÓ©ÓèÚăơÉ̉³ ­½¼•ó¹ÚËÉ9—ˆ§Ø¹Úơ꫇“Íj©+¯¾ƒvÑÓ›̃ƠăˆŸ;…¨Ç ©Ó±»µÉ̉ÑĂÑÓ“Ơ˹ÏÅ߈å̉ Ù½—¾‡x­ˆ¹Ơ™‰kß [ïS߈߈Û«‚ ½9ơêÎőֻÅĂÙÚ¾™‰kß [ïSÑÁ±½×¾ù×ÏÔµØíÓƒÖ¥ÆĂºÖĂ«‡“Íj½‹Ç—»¼¡¼«ÚµØâàÍÓ±»¼«»óǽ€½ơÔëöǺ¡ÈƠÄÔX’€Û×íÆÁ¼Á¹9¥‡ß»ûׯ½ÏÅ‹Ü̃Á‡ÛͼĂ—»•Ö¡ÈׯºÔÄĂÙ–»‹ÜƯÓ ƒˆöÑÓëÚ‚vщ߈ïÅá Û׺™‰kß [ïSêö£ä׺çÚóß«‡“Íj›¾¡ÔăˆŸ;ơê¿Ø½ƒß»ûÔXưÀÏÔ×¾ŸÅƒv÷Á©Ø¹ÚĂĂ ›­±àéM‡ÇùÜ÷‡ºÑÓÛÀœÓ£Ø¼Ù½Ù½¥ÂíÖ­¾¯¼«‡“ÍjâơĂĂ ›­±àéM±Ü±»ívëöû؃v₫ỞÙÚ§Ó³¤ˆ\0ÙÅë¶ÁÓ±»Óº¾‚Øö‹ÇơÔ߈ùºª¶2tT¡ÁµØăˆŸ;»9¥‡ƠăˆŸëªµØÂçôíÖĂÙơèÅÙÚ«‡“Íj«·3uU©«ÿẦÓù×ù×»yÛ×ăˆŸ;k«‡“ÍjÛºŸ}ÑĂÏŇøï™á Ûùׯ×óÂÑÓ°»ơÔ¼Ù½æ̉óĂÀ¹£ Ở‡Ç¿Å·ØÓÆÍË)éÛ9¥ăˆŸ;çô‚³ºóÏÔ߈›¾Û«‚ ½9ÄÔâàÛ׋Üëöôâ»Ï̉¾º›¾ÏÔÁ½ëö…¾ù×ù×™‰kß [ïSíÙ™‰kß [ïSˆÁăˆŸ;•Œơ…‡ŒŸ}×¾ù×ÏÔºÄÓ̃ˆ•Œ©¼‹ÇÅÔ³Èï¶…½ÉáöéÓăˆŸ©Øº•ºÛÜøê›¾¿‰½ĂÙ§ÆíÆ½ĂŽ¥ºÄÔ‡º™‰kß [ïS߈…Û™Û¡Øë×éºÏ̉¾|àØƒơêßç߈…ßÅuù×ÑØ8¤‡Ö‹ÙÙ½Æëö¶µØù×óÓÙ×é‡Ó¾íÚÏÄÓ¼ͼ©…£ØÅÙöư§‡9¥‡˜ÁÄÓÿÛéê§ÔáƠ½Ï̉9¥‡ï¤ÓÆÛ«‚ ½9í½ÏÔ—¶8¤‡ƒµØ§ôÁ̉÷Áù×å̉ ½å̉ ¶qÍƠ ÁBÑÄë9¥‡±»ŒÓÛ×ơêñÓƒˆÅØYŸÖ9¥‡ïƠŸÅŸù×÷ÁÁƯ³ÙסƯ€ÙÏÔ«Ô×—ˆåĂ¿‰ÏÅ™‡ÙŒë*«ơê߈¯ÈöÁÏ̉¡ÏÔå‡ăàÏÔù×ùדƠ™‰kß [ïS™ØöÇÖ‡ä£Ç·Åÿ¼¶‘gÀ¼Ă˜Á3ù×¶‰¼ăˆŸ;߈ƠÛ«‚ ½9ƒ±»°”¡•áƠÙÅë¡%½áƠùê­Ä÷»“Ơ€¾ÏÄƠå̉ ëơ‰̃ÏĸڢäG½¹ïÁê×íºù×ÿÚÛº›¶é»½Û×ÊÁù×ÿ¾«Ú¶Ô‹ôăˆŸ‘Æ¡ÔÍƠÚª‚ +¼9±»èºĂơꥈ]1Žïï»߈Ù½ñÖáƠÛÚĂƠ¾›¡¶ôéÙÚ«·3uUù멼Ó̉Û«‚ ½9¼ë½€³×Ûº£ØơèÅ÷Á¬ÖÚÀ©‡¥2ßëM³½ß»û±s—ÓßÄÙ±»¼Ô‹Ç‡ºéÚÛ«‚ ½9êÔĂÙĂĂ ›­±àéMéÓ±»Ë̉Úª‚ +¼9ơê°»Ơ÷‡ÛºƠºmƒ¾‘ÏēȽڪ‚ +¼9ùêÇÖÙ×ǺÅÓ±½™‰kß [ïS÷‡å̉ ëöÛ«‚ ½9°»߈ù×ÑÁăÁ8¤‡€º›¹á؇¥Óµ·ä™‰kß [ïS×$ÓºÅØ…ڃԵؙ‡ŸóeÇ"ÖY׿8™ÓơÔ˜‰ j ̃    Z îS ÏÅ“ƠƠXå̉ ›½À́™‰kß [ïSƒˆµÅơ꫺ĂÙăˆŸ;£ôƒˆ›¶é‡Û̉ÆçÚÛ«‚ ½9›ÛĂôñ¨ĐÄêÛ«‚ ½9—¶íê”î麅ÛƠ½Ù½Ù½˜‰j̃ZîSá ùןÛÚ¹ÚăˆŸ;k­ÖÛ«‚ ½9Rï²2ÍÎÓ¼ëöÏ|ƒv̉ŵØÇ»¶‡Ö8楺µa«·3uUĂÙÏÔ™‰kß [ïSîƠÚ×¹ÚöóöÁ«Ñ«‡“ÍjíØù×9¥‡Ç™‡Û«‚ ½9¡ëöĂÖưÀóÚﻩâÁ§ôù¾¡Û™rÚª‚ +¼9×Û½ôÙ«‡“ÍjÍÇÑÄëǽ»ËÉ9‡Œ»ØôĂỞ9¥‡×ɇơÄưÀÛ«­›Û‡Ç±è·¹Ú½ÿ¯¶Û«‚ ½9³ºóÅ–’‰2Ô,øƯơ«‡“Íj™‰kß [ïSíÀÚ߈‡ùêÛÄÓ™‰kß [ïS¾ÎÔå̉ «‡“ÍjÛÛ×ñ‡ĂÙÁƯöÁÛ«‚ ½9ƒˆđÙí¥Æ±»ؽ₫®¶¡Á«‡“ÍjôêÎ̉ß%ù×Ù½ºẠ̊Ç Ûơêå̉ Û«‚ ½9ÚׯĂä̉ŸÁĂ½Åô߈߈‰ÔÓØ߈™‰kß [ïS¹Ú¡ÔĂÖ“ÛÚê©Çºù×ÏÔÂƠ™‰kß [ïS߈©‡Ç·Ó ¥0ÍÓ·‡‘×8çüÆ Ï̉§ơçÚ‹Ü›¾ÿÚăˆŸ;–»£äÙÚ·Ô·Ô…ÖÙÚ«»ßÁÿ¼¿ßôpûĂ¾Åëö•½øß‚‡¿¥º½±»½Á̉ßÁ©‡¥2ßëMÁƯƒv£Ç™ëéåËÉ9ƠÅà‰‡ÚÁ‡é/×:匿NÙÚü%ƒˆéêÏÔù×Û«‚ ½9µØÛ«‚ ½9©›߈•ÜÁnÛº¿‰×ÏÔ‹Ü߈÷‡ñÔ—¶Çت‡’̀jƒ¾ƒv¹Úùơ«Ñ˜‰j̃ZîSó½êö¿ô®Èù×ÿÚƯ©‡¥2ßëMÏÔñÓÎÅÅØ‹Ç½±»¬ÄÑÄ뛹̃ŒÚ,âˆ:këÔ³ØÍăˆçÚăàµàĂ¼‡ŒÏÔĂº°¿ÏÅôê›ÚÛ«‚ ½9›ÛíÆǼÛ«‚ ½9†ÇƒvÅàăˆŸ;åר½ÙƠ½¿»Ù½ÁĂç“Æ÷Ù©Óƒ™ÔăˆŸ;k™‰kß [ïS÷ä5̉«‡“ÍjÙƠ—»Ơ9¥‡Ùڷغù׫øXß„ƠºmơêÍÓ«‡“ÍjÍÓù×߈9¥‡¤ˆ\0ƒcâ»Ù×ï½߈±»ơê·‡‘×8ç—¶·‹÷Ú‡ÇñÖŸ߈©Ó—»߈ÛÅ‘µØßÅÔ¡»çÚÏű¿ÏÔÏņŒÛ«‚ ½9³Âëö»È«‡“ÍjơÔá=ĂĂưÀ±»½«‡“ÍjÅ–¡Á£ÙדƠ³ô™‡ÍƠ”%£XăˆŸ;ÚƠ߈̃„­Äëö·ÜÙ×å¡ÁÙÚ«‡“ÍjăˆŸá ÎÅ₫¡Ôù×9¥‡«Ô«‡“Íjͼׯù×ÇÖÎÅÍË)éÛ9¥§ÓöÁ™‰kß [ïS˜‰j̃ZîSöŸóeÛ«‚ ½9Ơô¡Û̀Ä÷‡µü£ ±¿ùëÙܵØÛ«‚ ½9›¾‹ÇÎø×ưÀÙ×´‰ÍƠˆöùæơÔ±¿ŽŸ%ËÉ9ÑØ©‡¥2ßëMϺ„+ƒÚÏÔñµ߈Ü Íä°»ăơ“ÆóÂÅØ½¶ÜƒÖÛ«‡“ÍjăˆŸ;ÛÄÓ¿́ÏÅ¡ƯĂÈív…Ơ Óí¿ÛקسƯÇ­ÄÙ½Óˆ•=‘®GøÏÔר½¡ÛÛÚµØăˆŸÛ«‚ ½9źËƠöĂkß [ïSÙÚÏÅ߈‡Ç½ơê‚v÷‡ö‹Çß„Ï̉«‡“Íj‘«‡“ÍjŸ}̃ˆ®é¹‹“Ơ§Æƒv¹Úáç߈¡ƠÔÅ ‹ÇÇÖëÔÛ«‚ ½9Ù½߈ûaÓ™ëé嬿¸ÚÓºï³2«‡“ÍjëÓÆÖƒÖÖ¾êÚï‡ÿ¯¶ùêßÚëö̀ơê‡ÓÓăˆŸ;¯ÈÓ«‡“ÍjÁƯ߈Û«‚ ½9ÔXÛ«‚ ½9©‡¥2ßëMÛÔéê÷ÁÁ¹™‰kß [ïS½±»́½€­ÄæØ«ÚĂÈæ°ơê’ÈﻹÈÈÅn±»߈«‡“ÍjÏÔÙ÷Ù§ô™ô÷‡ÓÔ¡Ôá «ÚÈ»ƒˆÏÔ‰¿I»É¹ÚăơëöǺëÊêöÛ«‚ ½9¶ØÏÅèê«uÇÖƒvå׋ÇÛ«‚ ½9±»¥ÓívÄ©¼Û«‚ ½9§Ó“ÈçÚ½¹Ú•Èû›™‹÷Á» áÙ?¡M-ËơÛ‹ù×!#¹ Ơ ×Éùư • +‡¹'ư¥í¥Ü£ÓăˆŸ;ÓØçôÅÓ¾ÛÀ Ëû›½å¿ƒvÇÖƒˆ«‡“Íjº™‰kß [ïSÁƯµm§Ó߈ăˆŸỞ÷‡ÁÜÛ«‚ ½9É̉‡º߈Ù½Ç̉Øù׫‡“ÍjÙŒë*«߈ÓÅÙ½˜‰j̃ZîSÇ̉—¶Î̉ƒv±»ăˆŸ;›Ú«‡“Íj³¾߈ÅÓöÍBßÖ™‰kß [ïS߈±»ÏÅưÀÍÓ½ë«ÚûÓØ‹ÈÁ̉ÿ§ÏÅơê£äµØñÇ9¥‡ù×ø¿½€éà‹Ç¥ÇĂƠﺓᱻù×ÏÔÍåáÛÓØχÛ«‚ ½9߈̣Âù‡™ÓÅƯăˆŸ;ÏÄÛ×ÿÂëö­Ä™‰kß [ïSđÛ°»›¡ùơăˆŸ;ưØÿ¯¶öËÉ9›¶éûÓ¡Ô°¿‡9¡ÈéÚÏÔÙ½ù×ơÔÙ½ø¾·‡‘×8癉kß [ïSº¿‰‚vöëö­¿¹ÏÔµØÛºÉMù×±»¹ÚëÚóí÷Ú´ÀM½éÓ¹Úđ±»ÏÔñÚÁ̉Ï؉j̃ZîSá ÿ¯¶ơ\ñÖ«‡“ÍjÀĂùêøê½̉°»å ‡Ç–ŒơÎ÷ˆë×ù¿ù×·‡‘×8çɹƠڋܛԟóá=ĂÙù×₫®¶ă™Û×§º©Óív™‰kß [ïS“°ơèÅ­Äå̉ ư“ÔÅ—¶“Ơ…à…ØºÁÍÓÅÁ废ÅĂ«‡“ÍjßÄÙ›¾ăà±»·Ô˜êèäơÏ̉ĂÙ°»½÷Á÷Á·‡‘×8篼•ƒ¾‘­ÄñÓÅÿZÂÙˆ›¹ù×—¶ÙY±»ñÓƠXÏÅĂº±»™‰kß [ïSùד±»¬Ö«‡“ÍjÇ̉­Ä¥ˆ]1—»˜×óÇ™‰kß [ïS™‰kß [ïSËƠ߈ÿÚùê›çó¡ÔÅÔÙÚ•Œ§Ô Êûרö™àôĂĂ¹Úû߈ÍÇ™‡™‰kß [ïSßÖ˜‹ÜÿÚá¬ßÚ£äÿÚß„“¹ƯNù×÷Ú©¼9¥‡Ó ‹›æ8¤‡ÇÖ߈ăˆŸù׿ºơÔ¨¾ù×¥ÈÛ×߈µaăˆŸ;éºûƠŸ}ÏÔ«·3uU™‰kß [ïS»‹ïƠ±»Ù½ÓØŸÄăཀÙ×Û×ĂÙ–™‰kß [ïS±»—¶”Èú—»©‡¥2ßëMơêù×çÚå̃ƒvÙ½°»¡Á«Ô±»ĂÈ߈™‰kß [ïSăˆŸ;‡Æï²2‡éüÀ»Áí‡Ö÷ˆÚº˜ +ê +è +ä +ÎÅù×sÇØñ¶ù×鼫‡“Íj±»±»Ó*ÛºÁƯϼÇ»Ó9¥‡Û«‚ ½9½×*ÓÚÓÓéÓÎÔ±»߈Û«‚ ½9ù×ÿÚ©¼ù×Úª‚ +¼9¾ƒ¾‘ÿÚÉĂßÖ³‡×ưôÛ«‚ ½9®íÆÇؾ÷ÁƯÓ ÏÔ‡xùăÿµØñÓ™à³%·ØÂÿ¯¶Å‹ÉÙö߈ÙÅëϹ Ơ߈ÏÔ·ÅÿÚ«»ö9¥‡ĂÛ«‚ ½9À¹å̉ ÜÂÙ§ôăˆŸ;ÙÑ̃ˆâཀ‡Üµ‰æ̃¡»ơ…ÛÁĂ½ôĂƠù×₫®¶°»Û«‚ ½9ª»ÀĂÚ×½™ÁщÿÛϺ Ơ߈ơĂ÷Á³àêö¥êÏÅơèÅÅØ«‡“Íj®ÈÁ¶Û«‚ ½9ù×¹£©&¾™‰kß [ïSËÀ™‡½Ă÷‡ËÇÍá „ØăˆŸ;Ë̉½Ô±»ĂÙ™Ó¥µơĂƯºƒv9¥‡9¥‡¹ÚÙÚ߈߈Á×Ø×©ØÆèÜùêăˆŸ±»ăº±»ÏÅ¿cé‡ăÁ¿‰ƠƒvªºëÔÏÔ¡»«Ôéꙉkß [ïS™‰kß [ïSæÚÅɃֳ֭_‰Ûæº +°ÈµÍË)éÛ9¥µ†ơư“̀½‡«‡“Íj«Ó¡hơÔ™‰kß [ïSæ$½÷Ÿ÷Á÷‡™ÔœÂ£Ô™‰kß [ïSÛÏ¡Ơă»ĐÄê¹Ú™ô߈߈ƒ¾‘ÅØµÁ‡ÇíÖưẠ̀ÄӺƣ»ă¬ŸÖ¼ëö¯¼÷ÁíØµØºn齡ƠÏÅï»á ơê«ÔơêÛºÁƯăˆŸÿ$È̉«‡“ÍjçØơêïÅĂ¡ÁơűϯÈ"(±»«d±»ăˆŸ#ăˆŸ;Ù½ÿ“ȷԷÅÑØÙÅëƠXù¼ËÇÅÄ™‰kß [ïS½Û«‚ ½9ù×ɇ½ëö£Ë±¿«Ô­ÄûØÏÅơɾÀ‡€è/Ö:ƒv9¥‡Ö¾çIÛ«‚ ½9ç̉ôê߈½ØÁ¹³Âׯ̉Æ·‹à¬›‡ר£‡Úª‚ +¼9„°¿ëöíêă†ăVï½ù׃ÖéôÛ˜ÁÏÅ„¢­ÏÔ߈«‡“ÍjŽ›vÇĂ«%˜‰j̃ZîSÛ«‚ ½99¥‡×ßç̉ÁƯǽ¿Å‘ÓÓºÚ‡ ˜‰j̃ZîS·Ôжƒvù׃v†Œå̉ ù×áØщÓÅ·‡‘×8ç­«ÔÍÓ™̉‡ºôå÷Á£Ó›¾ÙÚ̉Å…%äZ½ƯÓ ¯Èß»û™Á÷‡ÄàÓ»²¡ÁÉ̉ÅăˆŸ;ưÀ¿ß‡9Ưr߈˜‡ÿ$ºỌ́×߈ׯ̃ˆƯÓ ­Ö½ú˜ç'—¶‡¢•ó¸!§ôç‚v±»»Ư–¶óÏÅÙÚ©‡¥2ßëMö°½ +©‡¥2ßëMµØ9¥‡™Ô±»³Âˆđ8¤‡×߈«‡“Íj»Ø¡ÈơêÓÅ“ÇÛ׫ÔÁ½óǿ߽€ëöÏÔ匿N«Èó¯ù×ù꫇“Íj±½ív­¾÷٠ȡ߽€Ù™‰kß [ïS½ơêăˆŸ;«‡“Íj«‡“Íj9¥‡ÁĂ³ºóù×ăˆŸ;±»źª»§+çô«‡“Íj©‡¥2ßëM±»ªz¡È߈ÛºψË%ăˆŸ;‹̉…Φô«‡“Íj‘ÛËÉ9"¹ó߈¯×™‰kß [ïS±»ưÀºă®åŒ¿Nù×ëöÇ¡đÍĂ¬ÄºÏÔ…Ơ™Ó¯à¸£ÅØɶµa½±»ơêôưêƯ‰·Å§ØĂÈđÓÏÅï½ÅÔÓÅ«·3uUÚט‰j̃ZîS·Å¥ÓơêÛ«‚ ½9Ï̉ùơ½€ÿ¯¶̣ǣןñÓ±»Æăơ°¿JÛ«‚ ½9«‡“Íj߈‘ÚưÀ›¹½ù×­ÄÓÂÓïÚÛºóÑĂ«‡“ÍjửÛ«‚ ½9º‹Ç—¾ÏÄù×ÑÓ¦ôÑÄëưˆ÷ÁÙ½…ù×—±¿½€»Ø°»Û«‚ ½9–¾ÎÅ ơÀ•Èû›ä÷ÚưÀ©¼ñÓéºƒàµØôê¹ĂÙßÚ‰Ôs¹ƯNÛÄÓă*‰ÛăˆŸăˆŸ;ñÙ,ÏÔíÆßƯÛ«‚ ½9É€ÍÎŹ¶·‡‘×8çµØ߈›¾Ù½ç'·º…öµ†ơ»ĂĂ»íiÏÅ߈Û«‚ ½9ăº±»Ơ9¥‡Ľë¼íêƒ×¡̃±»̀ÇçÚ½±»·‡‘×8çÊÖÇß¶­Ôù׺ٽơÔĂÙö߈߈ù×ÍƠµØ¡ơê«»ªÚ߈ä̉  ĂÈ™‰kß [ïSåĂ¾ïiÏÄöÍć“ƒvëÚ™ØÍË)éÛ9¥‹Ü·ô™‰kß [ïS™Áơêμ°ăˆŸÛ«‚ ½9ù×ÑØ©‡¥2ßëMﶶȺÏÔƠ½¹÷‡Ù×ưTÑÁ÷ÁÛ«‚ ½9Û«‚ ½9…Ơ½€ù¾ßơ¹Ú9¥‡µaÑÓƯÓ Ü¡Û±»ươ‹Ü‹Ç§Ø9¥‡×é¾߈µa±»‹Üßڵؙëéå߈ăˆŸơÔ˜êèäù׫‡“Íj›¾‡xí±»™‡ÑĂ¡ÔöăˆŸ¹Ú߈ưÀÙÅëáçñÓ«·3uUŸ̃êöåô°»ïÚÅØ™Ô“Ù×§Ô߈±»­«»±»¼¡Ô₫Ž¿‰9¥‡«»ÿÚ‘ơ¦Ơù×·‡‘×8çÚ× ËûăˆŸÓÆç'µÜ³ºó™‰kß [ïSŸĂ°»ºâˆ¡È“Ơ±»‹Çå̉ Y›¶é½€5ºÈ›¹·‡‘×8ç %¶çÍ¡ÇƠºm„û¼˜‡9¥‡©‡¥2ßëMá=™Û«‚ ½9¸Ú±»Û«‚ ½9³È›¶éä¼ƠÚª‚ +¼9ÿÇá Û«‚ ½9±»Ë¿½€¹ÚĂÙ¸Ú«‡“ÍjçÚ‡ÏÅ÷‡Ï̉9¥‡Ö¹ Á°ÈĂÙÁÚÛ«‚ ½9ÂÙôê³”̃ˆºníÆÿ¯¶º‡Çơ꽪¼«‡“Íj„(ăˆŸ;ưÀÁƯˆƒˆƒv·™é‡»q8V¤‡VÖ «»íÜ匿NƒÖܸڱ»¦ô½ÓÆá¼Æ—ŸĂ½€ׯ€º—»ĂƠ庅حÖÛÄÓ½€ăˆŸ;k€º ÁÊÓ›¾±ëØ÷$ÀĂÁ½Ô¾«»¶èÓØÙŒë*«ׯÀ½§ô«‡“Íj—ŒÁé‰ñ5ñ·ĂÖºy‹ÈÿÇ«ÔÅԋǜܙ‰kß [ïS¹«‡“Íj—¾é®«‡“ÍjÁ̉µØºy±»ÿ×™‡¥ˆ]1¼ĂÎÔÛ«‚ ½9½€±»¾Å™‰kß [ïS9¥‡—»±»‰â«ÔϺ±»ÙŒë*«9¥‡߈ăˆŸ;k‹Ç×ɽºñÓº̃ˆÛ½ƒvỞ9¥‡§ô‘ơÊÓÙ½ÂÙ£ØơêÛÚ¿“È÷ÚÙ½«»±”˜ ê è ä £Ô×Û›¶ẹ́ÅÓµăºÏÔ§ÓơèÅ›¾£Ç…¾Ñó©Àÿ½åĂ½¹‹ÇăˆŸ;ÏÅÀ‡€è/Ö:Ÿ\ß½™‰kß [ïSÿ¼™‰kß [ïS³¹ÛÚ߈ĂÙ“ƠÍƠÍÄÀ'ª»Ù½ÏÔ»†9¥‡×ÛׯÈ÷êàØ† «Ôƒv©¼ăˆŸŽ“ƠăˆŸ;̃ŒÚ,ÛºÛÄÓï³2ñÖá «ÔñÓØ₫ƠÅÁăˆŸ;¡ÁÑÓ¾™‰kß [ïS»ÁͽÿÚ÷Ô³ÂÁËù×߈ϼ«Ô›¾ăˆŸ;ñÓÛ«‚ ½9éÏÔËƠÊÇ ËûăˆŸ;kơÔ½ˆåÁĂƠ½‡Œ©Ç–ˆÅØ¡ÔÑÄëó«¸ỔăˆŸÜ¿Ú¥Æ߈߈ψ³à£Ô›¾™‰kß [ïSëïÅØ©&…ƠÇØ“ƸÁÓ¼•Ó‘®›vÙ½»äĂÈ‹ôƠ«‡“Íj±»ĂÈ÷Á©vÑÓĂÙÍÓ³›µƠ™‰kß [ïSºØ¹Úéêơꗌ۫‚ ½9ÂÙ‰¿I›¶é¥È™‰kß [ïSÛ«‚ ½9«ÔµØ¿Ø©¼íÖĂâ¾Ø±Á—¶çÚĂÙ¯¾ù×·Åä̉ÑӧԟȘ½”ÇÏÔåƠ²ÇÍË)éÛ9¥çÚ5÷ÁđÆ±»âÁ³¾ï»ÏÔ©¼²ØơèÅĂȱßëöÙ߈ÁÙ¶ñÚ™‰kß [ïSùë÷ÁÅ¥ĂÙö ߈±»Ù̉™‡º“½áêÏ&Ưºă½ù×ëä½̀Ó ¡Û«‡“Íj±»©Ó߈ƠºmóÇ™‰kß [ïSÆ_Ǻ£‡•ŒùæûƠ÷¼—¶Ïŵ.¥Ù«‡“Íj̣ÇÁ¸’º¥ˆ]1ñÓßÄÙ†ÇĐÓÛºÙÚÛǬÔ߈›¶éÁƯŒ¾̃çÚǺy"¿ôơF±»Á̉¹à€Ơ³ăˆŸ«Ô–½GéÚÓˆ•=‘Ó«‡“Íj¾·Ô°» +•̃±»¤Øù¿©Ó󃫇“ÍjçDZ»¿ôƒv߈ø×Û«‚ ½9½̃ÄØ…ؓȥˆ]1µØ‰¿I÷ˆ±½³Èÿ§ëö͉ñÆƠ˜‰j̃ZîSÙÚщÅù×Û«‚ ½9™‰kß [ïSÛ«‚ ½9™‰kß [ïSơêă»¡ÛáđëöơÔ™‰kß [ïS»ÇÖ‡Œ±»í‡öÛ«‚ ½9½ëƒvïÚ±»Æ¾¹x½öÏÅ”½9¥‡¯È›v—¾«‡“ÍjÛ«‚ ½9ÅØôĂ“Èÿ.χÛ«‚ ½9÷Ú»ƯÖÚϼÿÚ±»³zơÅå̉ ›ÈÙ×—ˆ£XûƠ§Ó«‡“ÍjÔ¾ëö·̣ªº Ǽ߈¡ÈµØ·Ü›¾­ÖÙÚ€ºŸĂ£XÖĂ¹ßÍÇó¡Ԗˆ«¼«‡“Íj£@ơêĂÙÏÔ“½å̉ Úª‚ +¼9§ÍË)éÛ9¥·‡‘×8癉kß [ïSơê‰ÛûÙ׃vù×9¥‡±»ÙÚ¹®—¾ơèÅơĂÿ¯¶›¾ÏÔ½ô߈ûؓǃط‡‘×8ç…öàĂ“¹ƯN¾éÓûÓÛ«‚ ½9ëö9¥‡×«ÔÙÚă»çÚëö±»ßá½ÏÔ³Ô×¾­Ø½™‰kß [ïS×ƠăàÏÔçíùêÛ«‚ ½9ûÓªÚ·Ó ¥0µØï»Ï'½̉™‰kß [ïSÅØÏÄÂÈçÚÏÅÙÓăˆŸ;k«‡“ÍjƒvÛ«‚ ½9‡Œ̣¶ñÚ«ÔÏÔÙ½‹ÜÁƯ”½ăˆŸªÚ •×µØÙÚÏš۩‡¥2ßëM—˜²Ø +ÿڻ؛¶é—¶ù×ăàơÔ¹ÚÙÚĂĂ ›­±àéḾÆÏÔ‡~ÍË)éÛ9¥™‰kß [ïSÚª‚ +¼9¹~ÏÄ­Ä8¤‡á=Û«‚ ½9ÏÅỞ¾₫Û«‚ ½9ÇÓçÚ₫®¶ôê­ÄïÅÿ¯¶˜‰j̃ZîSǼƒv±»Å¥±»¬Èù¿ăˆŸ;ơêÛ«‚ ½9»™‰kß [ïS›àÑÄë“ÈÓØå̉ ‰¿I¿ËÇ« ©ƒ»5ÓÁ‰¿IÁƯÛ×8 +¤‡ +ñÛ«‚ ½9ĂÈÏÅăˆŸ§Æ‚ù×—º«Ú9¥‡»Ø9¥‡°»߈Û×ưˆÂĂÆ·‡‘×8çƯÓ ¿Ùù×åĂ½±ë؃v·Ô½ôçÁ™‰kß [ïS™‡߈§ôå̉ ©Ó™‰kß [ïS•Ü¡ÁÙ½Û×½Ôƒv§ûá=‡‡ºÙ½ŸÅ·ÔƒÖ¦ôÿ¯¶ß»ûó¹‹ÇŽ™‰kß [ïS›£ ư|“È©ØÏÔ³Ăƒv·ÔỞá ø×ÅÓóÄÿÚ×Ẵ„9¥‡ù׿ÇÄÓĐÓ¯×÷·³¯¼¾ÅµƯÛÄÓ©‡¥2ßëMù×—¶ϺËÉ9ËÇçá·‹±»ÿ¯¶‡ºĂÙÏÅÿ¯¶£ƯơÔÔXæẲ߈—ÊËÉ9§ô”>ăˆŸ;ơêƒvˆçÚëö­Äº÷ÁߌÛ,ơ꣄÷èóª»íÆơêÿÂí́ÁăÏÔ“Ơ¸Ú¡Ûù×ͺ±»ÅÔɇϺÛÄÓô½­ÄÍăv ƒv¹ÁŸ}Ơ±»ñăv¹Ú×Ó°¿߈—á±)÷¼ßÄÙưÚưÀ±»—ÓˆŸù×øê‡¯ÜóḈºØĂßÖµÀƒØÍË)éÛ9¥¿Åơ½©¼íÖ×ƠɹµØ±»±»©ÀÚ×÷Á퇡ÈâḈ“ºƒˆÍÓͼÏÔÿẪÄ Ø î²2 «ÑăêƒĂĂ ›­±àéMå̉ ÏÔ•Œ«‡“Íj¶Øí¹Ơ’7ƠíØÚª‚ +¼9ϼéÚơÔÀ¼ÿÚÏÔ½›¾Ç•½߈¾‰̃¡­•ׯ«‡“ÍjÏÔº̉ÅÔ´‰µØÏ̉Ø×áƠ—ÛăˆŸÏÔŽ•¾»ØỞ˜‰j̃ZîS¿‰ÿÚ±»¹ÚÇÓơÔͽº«‡“ÍjµØÏÔÿÚ·ÔưÀ¯ÈÍÄźëö«·3uU¶Ü÷Ù±»«‡“ÍjƠ¾GăˆŸ“ơĂưµµơĂ߈»ôù×¹Úû©Ó½ÑÓÙÚö±»±»·Ôƒˆá ï»ÍË)éÛ9¥£ƯÑÓù×±.Ó̉³·‡‘×8çׯƒ½Ă¾ăơ±»±»÷‡ñÆ–Œ»Ø¡¹Úé‰ñ5ñ·ă»ÏÔ¡©ÇëöăàºĂÙƒÔ9¥‡ƒv»Øå̉ ƒÏԵؙ‰kß [ïSË¿Ùרǫ‡“Íj½ÿ§Á¹ƒÚÁ|«‡“Íj»̉ù×—ˆ§Ó£!¹ÚĂÓÏÅ̀UﻟÅÛ«‚ ½9ăˆŸ;›¾›¶éêö±¿°Á «‡“ÍjÀ½Á÷Á—¶ơÚ9¥‡¬ÛïÚ£´†£ĂỗÄØÙÚÏÅß%°»«ÑÛ«‚ ½9ĐĂöÁ½¾‡ÏÔ±»÷ÁùêÑÄëï»™‰kß [ïS™‰kß [ïSñÚÛ«‚ ½9匿N±»ĂÙŽ½û(ƒà«äÚÄ̉ƒv¥ØơÔƒÚ°ÔÛ«‚ ½9²Ơ›Û›¹uÇÖûÓ¤Çơê»ÅÁĂăˆŸ«‡“ÍjÛ«‚ ½9ĂĂ ›­±àéM±»±ÁĐÓ +Ë%©ƠæZ‡Ƽ߈³zÛ«‚ ½9ÿÚÎÚ×ƠơèÅ԰»ë¿¡ÛÓ¾“¹ÜNŸÈ¿×Ë̉›¶éÅÓđÔĂÓ¼é‰ñ5ñ·ÍÓëÚ«Ú½Ă½±»Ù“Íj¾©º߈ăˆŸµß ÛĂÙÅôå×ÄÓ¾ĐÓ›¾ăƠǼƒ”ăà˜êèä÷ÁăˆŸ;ÏÔ‡º»Ó•ÇщÛ«‚ ½9÷èæ$ûÓ›„ßÖá=߈¹ôêÆ«‡“Íjùê–ÔÓ8¤‡ÏÅäƠ½Ó¡ăù×ÍÄ™‰kß [ïSÿ×çÚǼƠ„ÇÏ̉ö›¾«ÑÛ«‚ ½9߈«Ô¡¦³ØÑĂ—ÓÀ ‰y‡ô¬¡ÁÛ™¿uăˆŸ;—¶×̉ÑÓ€º¶‡Ö8æĐ¹ưÀg³‰ƯÿÂï½éêÍӡؘ‚âÁơêÛ«‚ ½9±»³ºó®Ơ˜‡§Ôù×˹±»»ÅÍƠ›¾ÛºáÿÚ«ÚÁ̉çÚïž߸óĂÛ×ùtéê¾ä̉ppÙ½щÅÓå̉ ÿ¯¶ëö߈8¤‡Ö‘ÆÏÔ‹Ù“½£Ô‡yȰív9¥‡íê¡ù×ùêó¶ô ăˆŸ;áÛÇâºùףر»Éê—»‹ÜÚª‚ +¼9ăˆŸÈĂÖĂñÖ¿ÅËÉ9‡™Ă½±»ơº«‡“Íj½ÿ›¾ẳơêÙ½ª»™º÷ÁëÚù×Ö¾ÎÅăˆŸ;¹Ú­‹ÇÁĂơê»ÅÛ«‚ ½9щ·‡‘×8绽ùêÿÔÓÅ·ÔÿÛ·‡‘×8çù×—¶ß*‡Ú×̣̉Ă÷Áư‡±ù1ôêÙ½ûÓ÷ÁÑĂ‚ÙÚá=ƒÚơèÅóÇ™‹ÏřӧôÏÔÿ&ù¾Ë̉úĂöóÂÛÇƠX±»ç$8¤‡Ö™‰kß [ïSäĂ›¾ĂÙÏÔÏÅå»ÑæơèÅ¡Ô÷ÁÉĂëö¯Ơ±»ш¾›¾ù×ÿÚ²¾NÓº°»ÿÚ¶©‡¥2ßëM†Ç‡“Û«‚ ½9ؽéºÓºÛêËÉ9Ç»ÓØ•Èû›—®³ÂñÆăˆŸ;ù¾»Å­ơå̉ ĂÈÁ½÷‡¿ôå¼ ˆơÔ«‡“Íjœ‡ƒˆÙ½ƒvö÷Á¹ÚÇÖg½€—Ó½ĂỞ±»ơÔߨ²ÆÛÚ³Ô˜‰j̃ZîSóÇ™‰kß [ïSúÙŸȫ߼©Ó¹×û¡ÔƠơ«‡“Íj“ÈÑÅ›¶é©‡¥2ßëM9¥‡×Ă߈«d·ÔÛ«‚ ½9Û«‚ ½9³ØÂ…nå‡×Ơ¬ ưÀ¯G‹øöå̉ §À÷ÚïÚ½‡¿ÿ$Á½ÿÚŸ}₫&ưÀï½¾Á©Ç…ô™‰kß [ïSɇù×á öÁ±»ƒ«»ăˆŸ;±‡ơêÏÅÛ•¡ƒ»ëöăˆŸí–G…ÖÁĂ³Â‡jĂÙÙÚ›¾¼Ă™‰kß [ïS÷ÀŸÜ±»ÏÅ™ëéåĂº±”Ä–Æ÷ÊÚăˆŸÿ¯¶ÿ¯¶·ÅơèÅ©¼×ÓÛ×߈ºnçÚ—»¶·ÅÑÅăˆŸ;ƒvÏÔª‡’̀j÷Á±ô9¥‡đÁ—¶ÿ¯¶·Ô¡Ûͼß»û£äáƠÛ«‚ ½9™ëéåÙ½vù×ÏÔăˆŸ;ÆĂ ÓÅжÏÔƒv¬¶³ºó‹œ§Ôµ̀ÜÂù×±)꤯ù×ƯÔ…»Ï̉ËÓ‹Ü«Ñù×Û«‚ ½9ĂÙÛ«‚ ½9ù׸Ú߈Û«‚ ½9™‰kß [ïSơêé‡ËÉ9Ûö›¾ăˆŸÇÖ¹Úó¶Û«‚ ½9‰¿Iå̉ ÛÔÛ«‚ ½9Û«‚ ½9Ă×¾¥ˆ]1˜‰j̃ZîSÏ̉ö™‰kß [ïS©Ơ«ÔżÓĂĂï³2μ·‡‘×8ç¹Ú‰ÛËÉ9ăˆŸÛ«‚ ½9û„ÿ¯¶ƒvăˆŸ‡ŒñÓ·‡‘×8çÿ§±»Á‡é/×:ù¿±»å‡ƒv߈™×ѻ۫‚ ½9߈«ÔǺ’öù×߈ù×Ûº™‰kß [ïS•Ž˹ùë臙‰kß [ïSù×i۰»±»Ù ™‰kß [ïSùêçÚ¥Ó¡ÔÏÅ—Ó°»˱ăˆŸ‰Ô¿‰³È×Â∵ؿ‰ÓËù×Ù½áêóÔ‡ƒˆƒ½…ôƯÂǼƠÅó˜‰j̃ZîS³ÈƯÓ Ëû¿‰ÙŒë*«ñÓ±»ăˆŸ;ívÿ¯¶ÏÔÁ¹½€±¿ƠÄﻡÛêö‡Œ½Ơ×ÑÄëƒú›¾ƒv½çôëö£Øá(Ûº…÷Ú—§Í»¡Ûÿ¯¶¿‰÷Áëö¿ßÍƠ¯G‹øëö߈ÑæóÂù¿Ûº¹ÚÇÖïA¯×難“ÍjëÔ“Ç½ÓÆóƯù×·ÔÙ½÷ÚíÆéêáꇻƠ¾Göø´¼ƒv÷ˆî½¹­ÄûÿƒvñÖ£»—¶ö‡păˆŸá «‡“ÍjûØ“½½™Áù×ÄÔÛÀóÇÛ«‚ ½9áêô±»‡ÛÁƯÿÚå×±»Ơ½¡Áゥº¨Ç¡Á߈³ŒñÁ9¥‡öÛ«‚ ½9ß»û²×á̉»Å߈ñÓ«Ôù׸Ú߈å̉ ØÛ«‚ ½9߈ÂÙù×÷ˆºψ©ØרÇ"Ù½“ƠÏ̉‘ÆéºưÀÏăˆŸ;ăˆŸ;íÖ­vÛÆÁ̉Ă»Ø™‰kß [ïSĽËÇùץƷ‡‘×8ç߈ч¿»±»߈¿ØÖÆËq•½ÓÅ—»߈߈ÇåÁơêÙ½߈¼ØåĂơêÆ«‡“Íj™‰kß [ïSñ̉˜‰j̃ZîSÏÔÏÓĂÙ±ëØ–Ø߈å¼ ‹¿ú(¾|ÙŒë*«‰Çźô»ĂºµØơêưÀÛ«‚ ½9½̣ÏÔáêëöå»ơĂ£X™‰kß [ïS°»ĂÙÓăˆŸ;ÿÂÇ"ưÀ߈ßÖ¹ÚưÀƒÓ¾ÁĂ÷ó‰kß [ïS¡Û‚Ô³—»¡È™‰kß [ïS›¾½çª‡’̀j߈¯¡ÔÁ̃£Çº™‡ĂĂهڱȓ¹ƯN™‰kß [ïS«»¤ÆăÁĂºăÚƒvÿÚåôù×÷ˆŒƯí̀ÇƠ«‡“ÍjÛ«‚ ½9¡ÁÑØåĂ›¡ÏÄ»â ;Êû;Ư€OëöưÀÅÓ«‡“Íj°»‡BåÁÙÙ¾»½ÙÚí(ŸØ¥á›ÚăˆŸ;» ̃ŒÚ,îƠ,ơêÏÅٽٽÑỌ́µ†«ÔƒˆÍË)éÛ9¥ÑëöµØ«‡“Íj•ơˆ†9ÜơêÓ̉Ù×Ể身‡“Íj“Ơ¥ˆ]1ù×ö¥ØÇ̉Ï̉ƒÜÓØáÏÅ‹½™‡ƒĂ“Ơ™‰kß [ïS·ØÙ½ăˆŸ½üÁó®È×ơ÷¼ù×ëÚ·̣§‡Åر¿…&ĂÙ™‰kß [ïSñÓù×ơÔ™‰kß [ïSơƠËÇ«·3uU£Ç¶Åøù×¥ˆ]1©ƠÁĂ߈ăˆŸ;ưÀ‹È¡ÁŒºµaÏŽ€ÑĂƠÛ³˹Ûº¿Ùé¾ù×ù×ɇóÄáÏԵȋDzכ¹ÍƠÂ’×…ôËÇ̉óÔÑÓ™‰kß [ïS³ùeơêÍÄÿÚà=±»Ó¾±¿ÏÔÿÚ½¢Çß„ƒ¾‘ùׇÚư“¸Ú†““ǵØÑŹڿç‹É«Û¹ÚơÔ₫®¶ÙÚáÛ—»¶¶Å‹Çïô°¿¯¼›¶éÛ«‚ ½9™‡ù¿ăˆŸÅ›¹ơĂ³̃‘ƃvöÁÏÔ™‰kß [ïSÛ«‚ ½9ÿÚăÇí÷ê­Ø߈±ë¯çÛ×ơ«ÚơèÅÛơèơđÁÓçÚù×­€ä̉©ÓÎԃ׫‡“ÍjÙ×ÿ×Ûº9¥‡½ù×ăˆŸ;Ÿơ¥ÆÍƠ•Œ–¾Sº™‹¯Û§ç¡«¡ÈùêÛ«‚ ½9ËÈ9ÍƠÙ½™‰kß [ïS›¾µØÑĂơÔ«Ô·†™Óä̉ÿÚ³•Œ˹ưº¡ÁÈÍÓ«‡“ÍjƠ÷¼®Èù׃vñÖÊǿءÈù׬ô¼ôÍË)éÛ9¥ăˆŸ;‡°»ÏŵØñ׽ືº”ÖÏÔß»û₫®¶æZ€߈ƒvµvÙÚ­ÖׯÛ×ù¿±»çmùêçỗÄØ±»Ï|½ɹÅn÷å5Ó™Ô°¿Ăâù×·‡‘×8çÅơưÀ±»¿»ÏÔÇĂưÀ™‰kß [ïSù¿±»“Ơ‚½₫&8¤‡ñÓăˆŸ;¯‰¯0ß½9¥‡ơêÀ̉9¥‡ƒv…ԋٷԋǘ‰j̃ZîS°»‘ÆÀÛ«‚ ½9™ÁÏÅ߈›@ƒv¿Å‡Ç÷Á÷Ù߈»ØÿÚÇ̉‹ÜÙƠ½ÔÁ«»óÂÓũӺ½‡̃­ÖÏÔñ¨Û×›¾ÍÄ÷ÚăˆŸ;Ï̉“È߆éơĂٺۺٽ」Džڪ‡’̀j«‡“ÍjÇØ¯r—»ÏÔáá›îŽëÚéÚÙ½¡ÔùêÙ×›¾·ÔËÉ9±ôÙ½¾¡Èÿ¯¶ÅnÅØª¶2tT©ÎÔ ÏÔçôÛ«‚ ½9±»ï¶ÊÓßÄÙăŸ}ßÄÙĂÙ·Å߈©ÓÛ«‚ ½9ÚÇÖ¿|½‚đÁ(Ü߈‡Ùׄn™‰kß [ïSÙ½«Ôëöº±»å̉ Û«‚ ½9晉kß [ïS™‰kß [ïS‡³Á½ăˆŸ;kш¹Ú÷Á•Èû›ëöù×Ï”“È«‡“ÍjÁ¼½€Ôơçôë˜óí“Æ«‡“Íj÷ˆÏ̉óÔ±ÁÓ̉߈™‰kß [ïS·–ƒvжï½ÍƠ›¹ívÛ«‚ ½9¥ˆ]1Ưÿx‡ºÿNÑÓÅÀ€Ç]×Ơ。ԋ¿µØÅÂÖĂùוܶƒvÿ¯¶ôå©…Ơ9¥‡߈ƒ«Ô©Ø—»­Ä‡ºƒvÓÔñÓ…»¥Ø‹Çƒàö„ÖñÆùןÄăˆŸ›‰÷Áà́Û¹©‡¥2ßëMö«‡“Íjö™‰kß [ïS£‡ö9¥‡«‡“Íj ËûÙ×ăˆŸ½ơ¾ºÅÛ×ËÓ…öĂÈ‹ÇăÔúĂƒvµØÖ$ÁƯăˆŸ;œ¿©¼‡öÁ¹Ú‚v«Ô£ØóħôÛÚ±»ù×íê³½³¹ÚÛ«‚ ½9ÛƠ÷Áëö±»üÅ™‰kß [ïSºƒvµØª]«ăˆŸ¡Ó£ÇÛǟŽô߈ƃvåÁ÷ÚÑӵ图ڪ‚ +¼9¹·‡‘×8çѶ髇“ÍjßÄÙ«‡“ÍjíâµØ¹ÚÛ«‚ ½9¡Èß½ÑÓËÉ9߈³½±¿ưÀ₫Ù½³ÂƯ‰½¾‡Ï̉à̉ËƠôêëöĐØỞµ‰‚¾ɇ÷‡åÖù‹É0«âƒv‹Ó¡È‰¿I«·3uU”ÖơèůȡÛÏÔƠ¼Û«‚ ½9ßƯµ†óÔ߈¹Ø̀Ó.ëöÏŹڱ»Ă£ëöáÛ™ÔÛÀ‡Œ—¶í±»óÂÛ«‚ ½9ÏÔëöÍB±»ƒ ߈›¶éå̉ ¡ÁÏÄỞÿ§ß„á=©‡¥2ßëMù×±»·Å‹Ü«ÔÉ̉íØÏ̉Ø×Ѷ¹Ú9¥‡•Àÿ$Û«‚ ½9‰ßƯƠöơăˆŸ‹Ç…Œ±»±»ăˆŸ;ăˆŸ³Â™‡ĂÈívßnưº‘ÚßÖ™‡ÊÔË̉Ç"—¶™‰kß [ïSó"«‡“ÍjÉƯú¶ƒˆŸÛ߈Ù½ù×Ûº½‚ÔÏÅùë³(çÚÍĂø×í½Ñ%©¾ß™ëéååºÛ«‚ ½9Û×ÑÄëÁ‡é/×:«ÔÛ«‚ ½9­Øó|Ư¯¹ÚÏŪ»ó¸ڥºáêñØó›¶éơê•%߈¯¼±̉̃ˆÂåƠ²Æ¥ÛÑÓ–Óéºμ麾÷Áơêëöù×ăˆŸ;ÅÔ¦ÔƯÓ ƒvñà¯éăˆŸÏÔưÀ÷ÁÓ̉«Ôùש‡¥2ßëMÿ¯¶ÍÓÛ«‚ ½9ƒv¶ÅǺÓØ­Ä«»ù׃vËƠư§‡á ™Ó·‡‘×8çÁĂ¹Úµê—»É̉¿Ù»çù×™Ó«‡“Íjå̉ ưÀ¿»·—̀Ă¥½íÆư ‡ÚơêÙ½’½¯ÈÇÜù×ëÓщ«Ôéôíꃈ8¤‡×¥ÈÁ‡é/×:‰Ûùê½øơ¡ÔµØ‡º́–GÖÍÓïߺ™‰kß [ïSÑÓ߈£ä­¾ơ‡±»âÁÁ†¤ˆ\0ÑÓÛ«‚ ½9±»‚v£ÇŸÖÙ½«‡“Íj“ÆÅØưÀß»ûí‡Ăº¹Ú¿º“ƥƃ¡Áù×ÏÅÀ½߈¡Ô¤Ø‡ÇçÔ¡×¼ºÏÅ«Ô÷ÁóÂăˆŸÅĂˆ߈đÓ­ÔÉöù×ßÁƠX·Åï½âˆ ›¾½9¥‡×¿‰ù×ÇÖ߈»½9¥‡×ÑÄë÷ÙơêÛ«‚ ½9½€¦Èÿ§û“ƠñÓƼ¤Ç>‡ŒÛ«‚ ½9±»·‡‘×8çĂÙ÷ˆ̃ˆµÁĂÙ‹‹½³ôÙ½̃»ú÷Á³ÈÏĆº}¦Ó¬¾ £äßÄÙ¿‰Í½øê ÏÄÿÚ‡º߈ëöơêù×Û×÷‡ƠÍÓăˆŸ£Ư±»«‡“Íj“0ưù×ăˆŸ·Å¯¾ù×Û×á £‡°»¡Ô±»‹Çơê߈ÅØÑØºÅ +ƒv¿ºù×ÏÔ¡ÔƯ܃v±»Á»Ø‡Ûêù×Û«‚ ½9±»ßÚ̀ÓơY‘£߈Óÿ¯¶ÇÖëöéê¹Úÿ×›¾¯¼µĂøúÓ±ÔåÖăˆŸ‹Çƒvÿ¯¶жĂÙº³ºóÓØ²(߈Á̉ßÁăˆŸçÚĐÄêëöÀ½°¾ÛܦÈF½Ơă¹*·ØÍË)éÛ9¥«Ôđ»ĂÙÛ«‚ ½9â¼ÛÔ‡ẵˆƒvƯÓ “ÛÏ̉ûƠÍƠÙ×°»ÏÅÍĂÿ¯¶›¾í꫇“Íjív³«Ñù׫‡“ÍjÑÄëáûØÛ«‚ ½9ÅÙĂô÷‡ơÔÿÚÏ̉Û«‚ ½9ñÓ¥ˆ]1çǹڼԋ8ëö±»Á½½‡âà‰¿IƒàĂÙ©¼£X›¶é߈ÏÅÛ«‚ ½9ÇØ™‰kß [ïSö›ĂéÚ™‰kß [ïSàêù‡‰¿I­¾ƒ¾‘ăˆŸ;‡Ûǽ$±»ëÔ«»µØûÇÓÇÖ¡Ûç'°»ơÔÇØ©À½Ä¹ÚŽĂÙáó|‹Ù»Áëö™‰kß [ïS±»™‹·‡‘×8çÛ«‚ ½9§½½€Ïԛ᫇“ÍjÙÚÚª‚ +¼9ưÀ¤ÆÙ½£»ÖÆ®făˆŸ×Û­¾ÀR­ØûăÖÆÿ¯¶ÏÔ½›Ú³ÈϹ¯Ơƒvùׂ֋Çß„÷‡»ØÅÔ£äëöºÓ +ơê±»«»çùơÄ9¥‡©Ø‡ºơê߈ÔơçØ‰ĂG½¹©Á©Ó§ÓœÜÀÁó#±»ĂÙÛ«‚ ½9ĐØĂºψÏÓ¡Á±»ËÉ9ăơ·‡‘×8ç½Û«‚ ½9³ ù×™‰kß [ïSÙ½ø×ăˆŸ Èù‡¡ÔÓÔÅÓ}ăˆŸ;À‹Üư°»Ûơ»©‚Á«‡“Íj÷̃Û«‚ ½9Ç÷ó˨¼™Á¼È›¶é9¥‡³Üă‘·ƒvÜƯ‰¢»¥ùửó#öơÔ§Ôơê÷Áù×Ù½óçÚ°» +—¶ô™‰kß [ïS¡ÛÁ¸ÍĂÛ«‚ ½9ĂÙ«‡“Íj½Ơ±Úëö¼öÁ™‰kß [ïSëö߈ơĂÙùêǽƠXöÁù×߈µØơĂñÓ±»Ñ÷ƒˆÏÔƒÙÚ™‰kß [ïS9¥‡™‰kß [ïSùסÁăˆŸñÖͼ«‡“Íj½°»ôØù׆ºÙŒë*«ñƱŒ£ä±»ƒv«‡“ÍjÚª‚ +¼9íÖ¡ô¡Û߈ù×™ëé噉kß [ïS«‡“ÍjûÓÙùן\¥µ—ÓưÀÏ̉˜ÓÂĂ“½¡ÁÏÔƒÔ…ØóÂö°»±»ºËà­)ÅÔ‚ˆé‡íÖù×™‰kß [ïSÛ«‚ ½9Ưº±¿®× ùê¸ÚÍË)éÛ9¥ª‡’̀j‹ÜùסÔÙÚƒvרĐÿÇ߈íêï»׺ûçÚƒơß»û¨¼¼Ô±»›‡ĂÙ½ÊÇ̃ÄØßÄÙ«́Ư‰‡º˜‰j̃ZîS»Ø»Å¥Đ©‡¥2ßëMÑØ©ÚĂÙ­Ä÷Áûƒ«Ô߈ÏÔÙ½‡½®×1‹…³ÂÛ××̉ưÀĂ¼ÍÄ“Ờ½ÏÔăˆŸ;ơĂ›¾¶º½ĂÈ‚/¡ÈÆá¹ÚÁă߈ù×ÍÄĂÙÀÙùñÀƯ»Ăơê½×ƠĐÓÏ̉ÑØ×Ơå̉ ô‡º½ÄĂÙÑ̀·Ó ¥0µØ­¹Û«‚ ½9&çÚ¡ÔåôÁƯ˳ ¬°àèMƠXăˆŸơ»̉ØÙ̉ăˆŸ;k߈­†ÏÔưÀ˜‰j̃ZîS£XµØÅÓßÖÙ½ÏÅ™‰kß [ïS™Ô•Çœ¿±»ó#‚vëö–Ñ·‡‘×8çµÜ¡å÷‡½YƯÓ Ù…ÔéJé‰Ó5“gesÁÅ¥ÅăˆŸ;k­ÅÏ™ôưÀ¯×Û«‚ ½9ơ»½Û«‚ ½9½ï‡ăˆŸĂÙívñÓ™‰kß [ïSÖ¾$¯×å̉ ÿÚË̉˜‰j̃ZîSÙ °êØÙÚƒv˜êèäåĂÎ̃Ơ³Øï‡½ºº™‰kß [ïSù×߈ù׉Ôëö±»™‰kß [ïS߈ÿÛÿÚµØÁ×ÏPçÚ߈çÚ§ô߈ăˆŸ;™‰kß [ïS™‰kß [ïSưÀ£äÓ'ëö߈ü‡°ø1߈‹Ç°½öÁ“È…açÚƒ×Û«‚ ½9ơê±»߈©ÓñÁ«ƯĂĂ ›­±àéMƒÔåÛ«‚ ½9¥ˆ]1ăÁϼ°»ü̉‰Ô…»—¶́½¤øƒˆăà·Üï½å̉ ù×߈÷‡×8 ¤‡ Ö º½߈߈™‰kß [ïS™‰kß [ïS£»ÿ¯¶êÓÏŃvÍBƯjµØÅØ×¿8ư“íÍÅ¡ùêÏÅщϺÚÀÀĂ!¥ÈÏ̉Ï̉™ÔéÓÿÚ“¼ÙĂÙ³–¶‚¾¹Úº‹Ç¿́É€ÅÓù׃v›Ó9¥‡ÙÚƒvÏ̉Û«‚ ½9©¥ÓĂÈơê­±áê±»½€Ơ¾GôĐĂăˆŸ;°»߈¾¿ßÔơ ăˆŸ;°»«‡“Íj˜‡™‰kß [ïSȵ†ºyđ·Å˜×函âƯ½«‡“Íj̉ŇÚĂºëöơêƠ½߈˜‡Éăƒv«‡“Íj™‰kß [ïSăˆŸ;¿‰ÔX ŸĂ÷‡™Áù×­Èù×ù×ơ$ív߈…àÁ¹©¼±»©Ç¾„àµa£ ÍÄ©‡¥2ßëMÿÚßÄÙ«‡“Íj›¾­ÄơÔ“Ơ‹ÜơêăÇ훾߻ûívĂÙªöëÀù×½Óº²º̣î½ï³2Ûê·§D ÍÄ«‡“Íj÷Ú‹ÇßÚé‰ñ5ñ·ëöÏÔ‘ÈăˆŸ;kï»Çֵد×ÿ¯¶¡Á£Øó+߈ÏÔɇÜÓ Å»½ß»ûƯÓ ¶ơêÏŇ¿½ôơÔºƒà‹Ó§Ô­ÖÇØçÚÏÔÆè­½¼9¥‡ƠºmùêæƠù×óÇßơ¶“Ơß»ûùêư“±»ù×ÏÔ™‰kß [ïS±»±»ó¹ơ»ơÔ‘ÔóÄĂÏÔ½€˜‰j̃ZîSÙ½8¤‡Åø·ỘÓé„­ÖÑÄë¿¡ÖË%ëºÏÔă½¿‰÷ˆ«‡“ÍjÑ©¼Ù½̃Œ Ú, Ë¿ưÀ°»ßñÚÏÄïº½ÓØĂӸڇǩ¼„¢­áÓ‡9±»ôê Ù̉öĂĂÛÀ̀Ă«‡“Íj›¾ù×Û«‚ ½9«ÔÙÜ₫…Œ°»‰àöÏÔù×™Áμé–ù×ơꓺØÓÏÔ­ÛñÓ˜‰ +j +̃ + + + +Z +îS +¿ÅÏÔÿ­ÖÛ«‚ ½9¿‰ĂRûê©Ø’ ù×ÙÚß´“ÛƒƒvåÁăˆŸ±»߈†Çëö½¦ÓóºÓÆÙ½ÅÓ™‰kß [ïS˜êèäù×߈̃%¦ô»ßŸ}ÑØ½™‰kß [ïSÙƠ¼€Ù½ûÓ½­€ÓưÀưÀÛ×óÂơɳç4ÑÄëÛ«‚ ½9ù×Ù×±»ç°̃ˆ¥ˆ]1ߌÛ,½•×™‰kß [ïSÿÚÇØÑæ¿ÅúØÛ«‚ ½9»½µØ»»Ûºû(ÏÔĂÙŸĂÏÅ÷‡·‡‘×8ç±»§Ø—¾ªÔ°½ç½ƒ¾‘±»×$ߌÛ,¡È³ºó̀ǹÚÎ ÏÄ÷Ú±»½ׯ¶ơĂ¼–øÙÚß»û½Å߈¡ÁçÅØµaáߩ܋ǸÚY±»È̉6‡“°»ͪÛº™‰kß [ïS­ÄơúƒØÅÓÙÅëɹ¡ÛèêÑÓÙYÁ¾çÚÏ̉ÏÔăƒóÇÔ¾F˜‰j̃ZîSÙÚ÷Ù߈£‡…ôă©Óû‚ăˆŸ;±»ívÔÏԻǽÍÓϹ¾¥ˆ]1€ºëßƠXÏÔ¹ÚÁ±8¤‡àÖÚª‚ +¼9½£äăˆŸª‡’̀jăˆŸôçÚơ꫇“Íj‡ÚË̉•Èû›߈“ÅưÀư“Ë̉­€À¹Ơ«‡“Íj³•ÍÓ‹Æß„åô·‡‘×8烈ăơ‡½ëöÇÖ·Å¿‰߈ÿÚ߈³Ø«ÔÂÙÛ×9¥‡ËÉ9ơèÅíơ¿‰¡Ôù׫‡“ÍjăƠÉ̉ƒÛɯ×÷‡•Ö«»áểÙ¸ÚƠá ÿ¯¶³ºó¡ă½®Gø­Ö¶₫«»‘ÏÔăˆŸăˆŸ;k±»ùêܽ±½8¤‡Ö ăˆŸ;ôÔËÓÏÔ±»Û«‚ ½9Ô›¶éƠ­ÊÁĂẵعÁóÇ̃ŒÚ,‰ÁĐÓ¿‰»Ó³mÿÛù×íÖÏÅÛ«‚ ½9Üơ›¾̃ˆù×Û«‚ ½9¢ “ÙÚ™‰kß [ïS̉ÁÏÔăˆŸ;Ù×åÁßÁôê߈«‡“Íjçđ߈ĂÙŰá9¥‡×©È€ºêÚƒÚÅ·Ô߈Íij ’ÆÏ₫®¶¾¿‰¥Ø߈˜‰j̃ZîS¼‡µØçô߈¡Ư§ôÏÄ»ÜÊƠ¿ôÏÅÙ½ưÀÇØ»ÅçÚƒ¾‘¾ºÿÂÅ–÷‡—¶ăêÿÔÍÓëöơĂÀ̉ùº—¾öÁ¼‹Ç¿‰çºÍÓ׃±»Åء۽ÔÎÔµa8¤‡·‡‘×8çï»…àG½¹Ă߈ÏÄĂƠË¿ôꩼ¡È¹âÖÂ^±»¿¹çº¶‰ź½ûØåô«ÔÑØ«ÓŸ}ë íÆâº¶±»™‰kß [ïSÜù×ÙÅë¢È%‡ŒŸ}ºñÚ̀Ó›¾ăˆŸư§‡‹Ó˜‰j̃ZîSÑÄëÙ×ù꫇“ÍjÙÜù×ÿ¯¶Ù½éÔùêƒv«‡“Íj±»ÁƯŸ}ÏÔ¾¹xù×°»µØ9¥‡ÙYƒÀ›¾Û«‚ ½9Ѿ¼ƒv9¥‡ùê¸Ú­ÄăˆŸ;ăˆŸ;íê…ÚÛ«‚ ½9ù׃v¿ßƠĽ½ô›Úăà˜êèä9¥‡×ÇÖăˆŸưÀ•½öÁƒÖ– ñÆÏÅÅ»Û×ßÄÙĂƠÿ!ù×™ơ×¾½‹Óă½ƒ«Ô߈á·‡‘×8çù××Ơ¦Æ‡§Ø«Ô½Ô…ø×ßƯÔªºÙ½©ÇưÀø×•ÇëöĐÄêÉ̉Ăȼ€ºù׃v›¾™‰kß [ïSª‡’̀j÷Ú½ÁÛº™‰kß [ïS¿»ŒăÔ“¹ƯN߈ç̃á=ăˆŸ;«‡“Íj¹ÚỂ ©‡¥2ßëM߈ÿ¯¶ƒÖ­¾ĂÙ߈ÏÔÏăˆŸ;˹ăĂ3Œ₫±»±¿–·¬Ä»éÚûÙ“Ơ´†›¶éËÇưÀ™‰kß [ïSĂÖƯÓ ­ØÑÓ±»Á·Å8¤‡ù×—ÓăˆŸăˆŸ¦ô+÷ÁÛ׃¾‘«‡“ÍjÛ«‚ ½9¿»¼±‡¾ÅKÅÔĂÙơÄ‹ÇñÓŽ·¼Í7Ơ»ØóôÙÚ—»«»½ÏÅ߈߈Ù½ÏÔï½·‡‘×8çóÇŸ}ăÚ½ëÜϺ±»ëö×ù©Ç“ÛÛ«‚ ½99¥‡¡Á˜ôö—»÷Á̉ºø×ÅÔË¿ÏÅ¡¸ăˆŸ;÷ÁÊ#È9IÅâÁ·ÔÅtÿÚÁËÅíÏÅóÇ˹«‡“ÍjÛÄÓº8¤‡ÖĐ²߈·ÔÛ«‚ ½9ƒÖù¿¹Ú½Ü§ô„ØÀƯĂûÓ߈·Å©Ø¿ôùסÈ÷Áç¡Á™Ó߈ƒv‡ÑĂ³ɇÓÅ» Ơ§è÷ÁÛá£Ø×¾Û«‚ ½9÷Á߈•ÿ¿ßÏÔ8¤‡›±çÚéÓ½"“ƠÅÔ߈ñÓ³¿ô™‰kß [ïS%¿ôÏÅ™‰kß [ïSíÖ¹Úù¿«‡“ÍjÑÄ럧ÉĂ™‡Û«‚ ½9 ËûÏÔ߈›»9¥‡ï»âÂ3ù×Ơƒˆêö÷Á½ï³2Ù½—»ô¿‰Ïı»щ«·3uU·̃™‰kß [ïS«ÔÛ«‚ ½9Œ +ß»û‰y#›¡»ˆ¡»¹Ú߈ºÛ«‚ ½9߈©&™‡©ÓçÁ±»ÛÔº-ÿ¼»Ù×ăơ¬ÈϺñÇֹશ2tTÚĐû(¿³È8¤‡°¿—°»ü7ŸÈư§‡ÅÓẳÁĂ…»½±»8¤‡«‡“Íj…उ̀L„Ươ÷Á¿‰«·3uUÙ½ơÔû̉ăˆŸ;ơÄ“ƠÜÛ«‚ ½9ăàßç½Ϻ×Ơ߈…ôÍÑÓܪ¶2tT§ØÙÚß½¾ßù×߈ăˆŸ;kƒÚ¡»›¾±»̃ÙßæÙ×ÁƯ­ÖÏÅù×¾ßÂưÓ±ëØ¹ÚĂÙß»ûÏÄ™‰kß [ïSÏÔä̉©Ó«‡“Íj߈ÑÓï»é ¹Úó¸³ÇÁ×¹ÚÁ‡é/×:̀Ó…ƠÍĂƒv¥Æ›ƠÙŒë*«ĂĂÿ¯¶€ƠưÚƒˆå‡ù×ÿº¡ÁĂÙ“ÆÓ́ßƯƒvµ˜‡áêơꙇ˜‡ÁÙÚ‚ÛºÂßÄÙÛ«‚ ½9ßÚñÖÛ«‚ ½9ßç™Ø¥½€‡ñ5Ù½à¬ëÔù×ó¹Ú÷ÁÓÅË̉÷ˆ¹Úëö«‡“Íjñͼï»ÇâáƠɹڎå̉ •½§½ÑøŽ±»ÍăÖ߈¨ơê½ó¸ơêƠÁ‡é/×:Ž™‰kß [ïSÛºçÚ½Ôëöù×ÿ×Û×ơêíêĐÓ éÏÜ«)­Ø̉ŹÚ́vÚª‚ +¼9ù×±»ÚÀÙ½ùׇǭØëÚƠơÁ̉ßÄÙ½µØ‡µẠ̊™‰kß [ïS߈¡Ô߈›‰Å°»%€ºÎÔù׃ÖÇÖ…Ơ¡·‡‘×8ç¡ƠăˆŸ;©¼·Ô¡ÛÛ«‚ ½9±»Åà∗¶¢ä ßÁêöëö¾—ÓÛ«‚ ½9̃„¥Ö§ơÚ»\ö\êÖ߈¹ ÑÓ²†“¡Ûá߈ÓÓƠ½ë¥ØÏÄêöÛÚ™‰kß [ïS¿‰ûĂÙëöÎ̉™‡ăˆŸ;™‰kß [ïSÅØù×÷ˆ÷Ú½€ăˆŸ«‡“Íj™‰kß [ïS‘:½Ù½«»ö™Áá ơÙ»ÅơèÅăàº+Ù½ơÈù~«‡“Íjîô½€ª»·‹Û«‚ ½9ÁƯƠ´¿àËÖƒv¡†Ú ÑÓ™‰kß [ïS¯Èø¾ëöÙܯ׭vùׯ™‰kß [ïSÁĂíØùÜéÓ“ơÄ8¤‡Ö™‡ÆÍƯ±»©ÇgëöÇØÁƯ—ˆơê¹€§ØơºËÉ9™‰kß [ïSáê‹Çỡˆ¾™8'¤‡'Ö”‹#œH#½ăÔïöÛ«‚ ½9ùê©ÓĂĂ½Û«‚ ½9ÇÖÔëù×±‡‹Ç÷Áëö‡ØÛ×ëöăˆŸŸỤ̀Äư“ơê•Ó÷ÁÙ½Ÿ\±»™‰kß [ïSÅÓëöï½ÏÅÙÚ©ĂÙöµØ߈Ç̉÷ˆÙöÅØĐÄ ê ̃ˆ߈ëö±»ßÄÙ‰¼Å·ºËDZ»Ở½ï»éê•Ó‰̉ĂßÁù×™‰kß [ïS™‰kß [ïSƒv¼ÏÅăˆŸ;kù׸ڼټßÄÙ‰ÆăàÏÔưÀơÄăˆŸ;ŸŒ™‰kß [ïS…ŒÛ«‚ ½9÷Á߈Ù½±»£äỞÓØÆƒvï½ăˆŸ߈xÓºˆ½™‰kß [ïS·Ó ¥0χ§ÓƒĂÛ«‚ ½9́vï½Ûº÷ÁçÚöµ•ó|³¹©Óÿ¯¶®ăơ•Èû›–Œ¥ˆ]1­Ó÷‡¡ÛÓº‹ÇỞÛÄÓß È› ëÚ³ºó₫®¶¡ÈϺßÖÏÔ£ÓÔ™Óÿ¯¶™‰kß [ïS ÈÏŇ$—›ăˆŸơÔ§ôăÁgñÓ߈­ÄÅØ£ Û«‚ ½9±»÷å5ÓăˆŸÙÓ™‡£Øëö²¹®µ4«‡“Íj¡ÛĂÓ±»«Ô»nר™‰kß [ïSéêÇáêÇØĂÙµØßÁå̉ ͽĂÙ™‰kß [ïSçôщÍÓ¡ơĂù×ÙÚÛ«‚ ½9ï½±»ơñ»½ÔÏÅÁƯ±»‰»™Ó¡Á¹ÚñưÀ«ºÊÙ ÷‡¡ÁÁ̀ù×½€‹Ù›Äùׂv¡ƠûÓçmơ»¡ñÙ¦Èt™‰kß [ïSă‘€ßÄÙáƠÍÄ÷‡±»ÙÅëïŹÚ÷‡ƯÓ ±»«‡“ÍjÛ«‚ ½99¥‡á̃¡ÁG½¹Ù½ôêÅáËDZ»ØƠ­ù×™‰kß [ïSÛ«‚ ½9«‡“Íj«ÔׯÍÄÁçå̉ —Óùêù×µØơÔö«ÔÅÔ±vÏÔÏÅ·#çÚ‚v¿»½˜Áôú³ºó§ÓưöăˆŸ;ŸƠëö߈ÊñĂª‡’̀jàÓoơêÍÓÛÄÓÇ̉ ÛóÛ«‚ ½9©‡¥2ßëMÛ«‚ ½9ÿ‹ß:߈öÔ°¿™‰kß [ïS‘±ơêÿ¯¶›ƠׯéJé‰Ó5“gesÁÅÇÖơèŗƽ¸ÚÛÄÓÿ¯¶ä̉ù¾¯G‹ø½ôùêƒv¹Ú›¾ÑÄ뙉kß [ïSàể̉·Ø—Ø9¥‡ƒÔÏŃˆÚ׿ŃØơêăˆŸÇ"½³Ç’ȳƠ©ÜºÖÆ ÷هǥÊû؉ÛçÚă‘·‹ÇµØÅÄ›¾9¥‡ử½ÔÏÔÿ¯¶«‡“Íj›¾éÓ÷߈ÁØ×·ØŸ}ù×Á×-Ï̉½ĂÛ×àÀ·Ô™‰kß [ïSĂÙ¸Ú«‡“Íj9¥‡¬Ö£»¡ÈµØưÀăˆŸÚÄ̉ÇÖ¡ÈÙŒë*«·‡‘×8çÍÇëöƒØÅÔăˆŸ;k›¾•ÇÏÄŽ½ÿÚǽ뱽ŻßƯĂÓÚ¡«ÚơêÍƠâˆ:j™‰kß [ïSĂÙăàÙ‡Ï9…¡ÈÏÅ•Œ½€öƒv¸Ú߈₫É»’ºµöÏÔëöëÔ຃v«‡“Íj±»¯È‰ùÁéºéÓĂºYÏÔ­Ô½€ơĂÖØëö8¤‡«‡“Íjù¿Ïİ»öŽăˆŸÏÅƠ匿Nëö¹Ú£X¡ÛƒväÁ +߈Ñӽإˆ]1å¿æÚùׯÈÏÔ“ +ƒˆÁĂù¿“¦ô +¯ß™‰kß [ïSơêÔ¼Ô½Ù½ÍƠ©¼ƒv߈“Ơ›¾¼“Ơ˜ơ߈Ơù×ËÇÿÁ§Ô©Ç›¾₫®¶™Á™‰kß [ïS÷ˆ¿´¼€±»¹ô‡ÛÁƯỞ‚ƯƒÚ–ÓÏĽ™‡ÿ&à—ÿ¯¶ÏÄ­߈Ûº­½¼¿ÅưÀ±»ÏÔ¡ÁÿÚ¡Û«‡“Íj«Ôß±µØÈç̉ăˆŸ;kß»û…»ơêå̉ ßÏăˆŸ™‰kß [ïS›¹›‰î½ ±»¿‰™‡ç'¥ÛÍÄɇÏÔ«º÷ˆë¼ơÁ̉ăˆŸ›¾·Åß»ụ̂ǃÖÙ½ăˆŸ«äƠXÇØ߈ăˆŸ;ưÀ₫®¶¿‰È‡Ûù‡ÓØÛ«‚ ½9‹ÜŸüùêăˆŸ;kùêÏÅ¥ˆ]1“º¿ô½€ăˆŸ;ùêÙÚ¯È߈å̉ «·3uUù×ß»û/ÑĂÔX¤ˆ\0ª»߈9¥‡×ƒÙÅëéê±ßÍåù×÷ÙƯÚ°»Ù½µØ‚vÅÅõa…ÔÓ¾­RÑÄë«Ú§Ô¾ƒvơÔ©¼ơê½Ï̉…ÂƯÚÁƯĂºÏÔ§ÔÙÚÙÚó±»ׯ߈ƒ“˜‰j̃ZîSúÙ›¹¸¼•ÖăˆŸ;ÓÆÏÅ߈ùêĂÙ§-¦ÓÏẠ̊Ôư‡±ù1™ëéå¿»‡x9¥‡×ù×Ù°ÇĂÛ‡ăˆŸ;k×¼ù×₫Ù×9¥‡½€ăˆŸ;³ÂÏÅÏ̉ÅØ߈äôÛ«‚ ½9©ë×ÎÔ½ÔêöϺ½ÔŸ\óÇÿÛ°»ï½¼ăê½Ïű»âà±Á»yÇÓÅĵañÚ›¾Íé´Çܘ‰j̃ZîSƒv½­Äêö›¾—ŒÄ†jáù×Ù½¨¼ÅØâˆ:ḱơçÔ¡ùêüÀÓ̃¹̃̃ÄØÇÖ±»±»½ôĂƯöÏÔƠ¯G‹ø­Öñ×ÏÔÙ½º©ØơÔËÉ9ơêÅØ‡“³ăĐÓ9¥‡Ơù×§Ô±»±»êö½ô߈Ó̉8¤‡Ù½™‰kß [ïS‰ÜÛ«‚ ½9¾×¾ă»˹ºÛ«‚ ½9½×Ơщ89¤‡9«‡“Íj·‡‘×8çÏÔÿ¯¶Ù½ôØÛ«‚ ½9ùôÏÔÂÙ÷‡ÚÇ¿À±»XăˆŸ;ĂÇĂÙ†º³V9¥‡×ËÉ9µØăơûØ߈¢»ùëÏÔăà—¶±íø×“È̃Áƒˆ÷Áư½߈êö‰ơ‡ºÙ-‰ÔéºĂÓ™̣߈›¶éơꩼù×ÑØ¦Ø©ÓûƠùסĐĐÓ¢ÇĐÅĂ¼ăે“Íjƒ©ÓµĐÄê®ö#çÚ¿ÚăˆŸÎÔÓ¾‡©ơêƯÓ ÙŒë*«˜ôßÄÙ›¶éŸ}щå̉ á=«»±»¿Å·Ó ¥0¹Ú¡¿½ÏÅר߈ÁƯö¥ˆ]1‹Ç¥‰ÍL…9¥‡×¹Á÷ܵØ߈ƯÓ ½€±ïù¿°»½ƒvéӣ俉ƒÖ¡È÷Á‘Ú˱ù׸ڃˆĂك֯ȠÈ+ëöö˹ˆ;¥ˆ]1ĂƠˆăˆŸ;köÁе†רĂÈ¡Á¡Ó±»9¥‡›îƒÔ«‡“ÍjöÁÙÚÉÖ˜‰j̃ZîSă‡ºÁÓËNjNjdzºóÛ«‚ ½9ùêÑӃ։Եظ9¥‡¿‡Ú«Ô¹Ú¡Ô¼ØÏÔ«ºƠ‰Ô釙‰kß [ïSÉ»©ÓÛº—¶Úº™ô¿‰óÔ¡µÆöÿ¯¶íÖ¡ÈÛù×™‡½ăˆŸÇÖ½Ôß»û¥Ûăàéê8¤‡éêÏæ›”áëö±»ơĂĂ«ˆÙÅëùדț¾߈·‡‘×8çÓº¿Ó÷ÁăˆŸ;©Ơ‰àƠ…Ơ…öÙÚÍÄÏÔ™ëéåÛ«‚ ½99¥‡×Û«‚ ½9ÏůȓƒØ™‰kß [ïSÈ₫ +®¶ +™‰kß [ïS-ưÀéÓƒv¹Úƒ½³È¯‰¯0·Ôµa麟}½ĂÈÏÄ߈¾¡߈¯¾ψÛ«‚ ½9¼‹ÇËÉ9›¶é9¥‡á=8 ¤‡ ׋øöàê±»߈ơĂÿÚ¥ˆ]1ưÀ«Ó€ƠăˆŸ­Äơ‡Û×±»§Óÿ¯¶ù×¥Û±»“ÈߌÛ,Û«‚ ½9¹ÚÛêØïÜơX©Óß»ûàºÈÆ“̀Ê)èÛ8¤ÓØ̉ÁH¥˜÷‡·‡‘×8çƠÅûÖ·‡‘×8çñÆ–øâḈ߈ÿÚ›¾‡Ç«‡“Íj±»ß»ûш‰ßÿ™ —¾£Ó»óăÇí¹ö©—»—Á½€¹Ú™Ø•«‡“ÍjÓÅ½Ă°êØƯ9¥‡±»´À÷Áù×ÅØëö߈¡Û™‰kß [ïSèêíÆÙÚôêëöÛ«‚ ½9ƒvÏ̉›¾—–ăˆŸ;ÙÅë²(ô›Úúºç‡xö§ôÿƒˆù¾øêÛº9¥‡Û«‚ ½9ù×¹ÁÏÄA«dºÚª‚ +¼9­Ä©ÓщÛ«‚ ½9ÈĂ«‡“Íj“ƠÙÚẲϼèơ¥Ø·Å߈±»½™‰kß [ïSͬÖ̃Á +«»Ù-«‡“ÍjÏñ~áƯ9¥‡³ÈƠX߈ơêăˆŸƠׯ÷Á₫ÚƒÖÑæ½€ù×Ẳ­ÔûƠëöÅÓÙ½½Ô¡ÛßÅ“¹ƯNÏÔ½¾‡¾¹ơö¿ô±»·‡‘×8çÔµ™‰kß [ïSºƒv‰¹óÇø@µaÁƯ§ÔíêơÔƯÓ «»çÚÂĂÛ«‚ ½9ÅØÅö·#8¤‡Ö•ÛíØºÇß‘ơù×›·Ôÿ¯¶áÛ½©ƠÅÔÓºÿÚ₫çÚÔX§·Ô‹Ç¯¼ÏÅÙ½9¥‡߈Ÿ\ÉÛÀÏÅÑø‹ëăˆŸ;ăˆŸ;ăˆŸ;ĂٓȃסÔçưÀá ù·ÏĵØù×À̉«‡“ÍjŸ}™‰kß [ïSÏÔÓØëö߈ÑÓçÔ¡±»̣ÇÑÓ̉ÆĂ¼ÑÓ“È«ÔÏÅ«‡“Íj·‡‘×8ç¡»¥Üù×™‰kß [ïSÍË)éÛ9¥©ĂÙẨ±»ÙÚ™‰kß [ïSÍƠù×Å߈ÁŸ}ö»Ă¼ûƠÀĂ +±»ă»ø×#ùëå̉ …»™ëéå¦ÈדƫÔ߈Ù½ÙÜö÷çÚóÇƠÓ©‡¥2ßëM™ơÙ½ä̉éØÿ§Û«‚ ½9ºéÚï³2§º߈ Ơÿ¯¶ÑØÛ«‚ ½9Ơư™‰kß [ïS±»ëö±ÔăˆŸ;ù×ܺ ëö߈̀­Æ÷Û«‚ ½9±»Û«‚ ½9áºÁ·̣ù¿ñÔÛ«‚ ½9çôÁí¿́¡½›Ú¿́Û«‚ ½9ưÀÓ¤ˆ\0ÁÓƯÓ ÀĂÁƯóÇ廵aĂÙăˆŸƒv…ÇẳÙ!ÑæÙ½èºơê«Ôçô½€ÿÇ߈Û«‚ ½9‹ÇÏÅÙ¡Á±»ÓØßÁă½«‡“Íj·º¹Ú÷Á½³ëö‘Ú¶è•ßÛ«‚ ½9‡ñ5Û«‚ ½9뿉¯–­¶µØ‚½ơ™‡Çëö̃ˆî²2ÓÓÛ×Ơù×ÏŽ溭½¼߈ÅØà=™‰kß [ïSï»ÿ¯¶ăˆŸù×Û«‚ ½9ăˆŸ¸àD˜§Ø«·3uUÛ«‚ ½99¥‡«»¸Ú¿ªŽ¢Xß»û߈ơÏ̉‡ÚÈ»ƒv›¶é‰Á½±»ç̉ù×áØ¹Ú‡xÏű»ử£Øƒv±»Û«‚ ½9Ă$™¾éêÿ¯¶ÿÚ¨‡¤2€̃êLµØåĂËÇèôæÚ9¥‡ÑÓÛ«‚ ½9½›¾ƠÚÁÛ«‚ ½9ÖÙÚï½±»ÑÄë›¶é“ƠÏÔ¡Ô½9¥‡§ÔÏŽ«ÔÏÔ­ÖËÈ9ăˆŸ™‰kß [ïSù×ñÚÛ«‚ ½9ăˆŸ;±»Ù½ưÀ‰¿I°»ơé¤ĂÓƼ˜ôÁƯ‡×™‰kß [ïS»»ßű»“ÆÏÔܽÏÄ–¶ĂÈÍĂ›¾ÇÖÿÛĂÙỞù¿ưÀœÜ¹ÚÙׂçÚËÉ9¡Ô÷Ú›Û•Ç£ä̃ÄØå»¢Ç‡ñ5Û×á꺙‹Ϲ¿‰‡“¡º³Èù×Û«‚ ½9ÛÄÓù×…ØÏÅ›¶é›¾ÍDZ»ƒvœÜíÁù×ù×ÏÅÿ.—ˆÅÓ›¾·ÅÛ«‚ ½9Ă™ºŸ ñ×÷Áé꛾ĂÈùꡱ»ăˆŸ;°»µØ±»ƒÔ÷Áù×Å»™‰kß [ïSµaÛ«‚ ½9ÙÚăˆŸ;±ëØ™Áù×ĂÙ½€Ç֣؃ÖǼóÇ·ÔÅÓ÷Áµ÷ÏÔ©±ô«Ô½›¾ơꩇ¥2ßëMăˆŸ;¡ƠáƠÓÆư­µØ½Û«‚ ½9ëÅĂÈÛ«‚ ½9™‡ ÛË%ÅØ›ÛñÚơÔ•îØÙ½ƒvÑ\ỂÓ¼å̉ ÙŒë*«ƒvƠçÚ¶ï̃ÄØăˆŸ;k«Óï³2©‡¥2ßëM×ܰ»ø×߈½ăˆŸ;«‡“Íjÿ¯¶ÍÓ˜êèä¯Ơív‰¿IÅØ±»åÆ¿º߈ÙÚ½щ¯ƠñÖÂèœÁщ¿ñÓâÁă¡ÁÙÚ¸ÚèêÏÅÅ—¶ăÁëÚÛ×ƠµØù×ăˆŸÏÄå̉ ƠXªÚ¨¾Û«‚ ½9Óà͓ș‰kß [ïSµØÿ¯¶¯¼߈ÙŒë*«±»Áÿ»½¾»ƒ½ÅỞéÚÙ½½«%«·3uUô꫇“ÍjÑĂ÷ÚÚ×ëößÁÂÈÛ«‚ ½9©Ç‚ÏċȃvÁ¹Ú©‡¥2ßëMÛÄÓÁîºĂÙ±»³Ž«ÑÛ«‚ ½9Ï̉€ƠÏÔăˆŸƒ×ç̉çÚưÀÏÔÏÄ«‡“ÍjÜÚù¿ÇáÏÔăˆŸ;ăˆŸƒv†Ư¥ÆéKÇ?Éܺ™‰kß [ïSÙ½‹ÈơêÏÔ¡Ó±»ĂÙù×ÿÚÿ‡ßܧȥº°»ŽûØ©‡¥2ßëM‡ÛŸÖÑÓ©ÓçÚ߈đÁûÓ¡Ô¹ÚË̉ÁĂÜĂÓ­7ÿ¯¶9¥‡Á‡é/×:Âù×9¥‡“Èá­ñÙÑÄë½ôù×£ÇǼѶÔ¿‰·ÅÑÓÚ»öăˆŸ;™‰kß [ïS߈ëj«»—¶¾ö»}9¥‡×̉ñÚ«‡“Íj·̣½Ă½¹¼ß»ûÍ­“ÆÙ×ôêöª ¨ƒº5ĐÓ£äÁƯùצÔÍơÊ«‡“Íj«‡“Íj·Ỗ»ú˜ôÛ«‚ ½9›¾ÂÅÂù×ëöχÁƯ£Ö¿Å¿™‰kß [ïS°¿ØƠ2©‡¥2ßëM¾ßá=ϺưÀɯƪ»ù×ßÚÛ×óÂÙÚ‡ñ5ƒv‡ùơ8 +¤‡ +Ö“ÆưÀíÔ“½›̃±»̉Å·Å™‡¿‰¡ÔG½¹ơêÛº‡ÙÚ߈̉ūћ¡‡ºô•ŒÓÅĂưÀ—»ôÛÚ×¼µ«‡“Íj‡̃ù×›¾¡È¥ˆ]1Ǽơ»±̉ñz‡9¹Ú±»›¶é›¶éëö÷êщơêÙƠ߈»“È»‡óÇÏŕ۫‡“Íj߈ăˆŸ;ÁËđÓéê‡Ç‡ÛƠöø×ƒÄÄØăÇÛƒ½½€ÏÚĂĂºÍÄÛLJàăơăˆŸ;×ùÛÄÓ¿‰›¾ÓÅăˆŸ;ă»¾ñÇ™‰kß [ïSíØ Á¡ÛÛº…“¥Û±»á¤½½‡©‡¥2ßëM¥ÛñÖ©Ø›‡ÑĂ™‰kß [ïS›¾íê©Ó±»¿Ø¥‰ÍL…ưÀYÛ«‚ ½9å×ßÄÙưÀ¡È8¤‡Öåö©Ø½©Ó¯™ĂÛ«‚ ½9ăˆŸ©ÓßϽÁ«Ècàơêëö¥ÚŽ¯È‡ר¨¼Ù׫Æ̉Ï̀‡º›¾Ù½ÙÚŸ‡Ûǽ·‡‘×8çûÓ×ܙӜ·̉ ¤0Ù½›¾—¶ÎÅ ‰đÙ½ƒv…»ŸÖû(ƠXÙ½ƠÅ­vßϼÔăˆŸ;¡Ô«‡“ÍjÏÔñ!ŽÙסÁơº™‰kß [ïS§ÓưÀϼááĂÙ£ä¡ÈÍÄÁ™ÁöƒØ¹ÚÏÔÛÔëö»½Úª‚ +¼9öËÉ9±»¿‰«‡“Íj±»ĂÈ˹Ÿ}¥ˆ]1½ÅÓÛ«‚ ½9 Ëû½£È™‰kß [ïSÛ«‚ ½9™ơç̉χ«·3uU߈±»̃ˆ§ÓËÇËÇ¡ÁÏÔÏÔÙ½­Ö“ƠăˆŸÁ£ä߈±»±»ăÛĂÈăˆŸ;́™‹ÏÔ«‡“Íj€Ơù׫·3uUÙ½Û«‚ ½9æÚ«‡“Íj£Ç‡Œ‹ÓÿơơÚ«‡“Íj™ÁËqÙ½ù×ÇÖÙ‰Ûù׵ءÈÛº™‰kß [ïS½¿ôµØÙ½ăˆŸöÎÁ½Óű»›Ú×¾çôß»û½­½¼߈ÏÔ¿ăˆŸ;kÍË)éÛ9¥±»ơÏÔ¡Ûù×°»¿ÅÑÔÓ5“gesÁÅ·,ÚǃÏÄ‹ÈÁÏÔ«»Û×êöéºÀĂ“³ƒvÏÔˆívƒvç'óÂù×¨Ç Úª‚ +¼9ܹÚơÄÏÅÓ÷‡™‡¡¬¾8¤‡ƒvêï›Ô¿Ø›¾¥Ø¡ơèÅÛ«‚ ½9«ÓĂ­ÄĂ*©‡¥2ßëMù×ÓÅŸĂù×ÇØ£Ø›¾ưÀª‡’̀j¥‰ÍL…ÿ$½ú̀ƯÆÖˆƠÏÔù×ƯÂƠÁĂçÚ«Ô8¤‡½€ÑÓɇÇÖÛׇÚưÀ›Û™‰kß [ïSùêØ×˜‡›ÚƒØ¹ÚáêñÆÛÄÓ»Á˜êèä¶ÅÍË)éÛ9¥ăˆŸ;Ï¿ÍË)éÛ9¥‹Ơ³Èׯ‹Çƒvàç ½Ă÷ÔÛº߈´Å›¾‘ëỬÍË)éÛ9¥¦Ù â»í™÷‘Æëơ÷Á÷‡§Ôå̉ ·ØÁƯø×½â½ÓØ·Ü¿»ØÜù×ÔµëÏÅƯ^ăˆŸ;“ÛßÚ߈½€ƒv—»Ơ¿º$±»ÑĂ陓Ɠö‡Û½“ĂÍÇăˆŸ߈âơ½Ëܱ»êöÛ«‚ ½9…ƒÑÓ¡hùêùׇ½Ä~ăˆŸ¡È¤¾sÏÔâàÁáùט‰j̃ZîS’¹ÜN·ÅËƠ¾Æú«‡“ÍjëößÄÙ›¶éôêÛÂö©ºŽº›¾Ë¿ºØù×ưÀ·§D ±»ÿ¯¶ëö«·3uUëÔâ'âàĂƠËÉ9«‡“Íjá‘ÇÖÇ»«‡“ÍjơêÚª‚ +¼9‹ÇÁĂ©Óƒv̀Ê)èÛ8¤Ă¡©ß†× +ƯÚ˯ù×¶Øé‡¿¹¨ĂÛºƒv¥ˆ]1ñ»­ÄơÔ¥vëöÏÄÇØ§Óáê½ĂÇÖ±»¶‡“·Å÷Ú™ÛÑ́ƒÖ«»×ÚHƒ½£äăˆŸà¬9¥‡Ó™‰kß [ïS«‡“Íj—Ó•Œ«‡“Íj̣«»§Ó›¾Û«‚ ½9ºÚÀµØ“¹ƯNëöéÓ±»™̃«»̃îïƠ¹̃³Ơ÷Áº¬Ä߈Û«‚ ½9Û«‚ ½9ÿ‡Óº«»ÿÚŸ}çÁÑÓçZ§ÆïƠ½ÑÓÁèơ¥º«ÑŒÓëöä×̣ÇÏÅù׃v«dµØù×ùôˆƠçôÀ‡€è/Ö:©„ĂÙ›¾˜‡ƒÚÙ½‡ÛÛ‰¢Èóåׯ9¥‡™ÁÛ«‚ ½9ơÔ˜Á°» ÏÔÖÙ½ăˆŸöù¼ÊƠÍË)éÛ9¥ÑÄë³zøàñÖöăˆŸ;ƒ¾‘©ư§‡ĂÙ˜‰j̃ZîS¢XߙӨ×ÁƯ£äĂÙ×¾ÇÖÏԣؙ‰kß [ïS±»‹Ç¥ØÑÓ8¤‡×å̉ ÑÓ¾ûÓæ'ås±¿³ºóÛ«‚ ½9ËÉ9£Ơ÷Áº‡ĂÈ®°»µôÇÜÏÔßƯăˆŸÅ…ÔéÓƒvÁÛÜÅÔ¼ÔƠï&μ÷ÚÁƯÛ«‚ ½9ÙŒë*«ưÀ‹Ç߈ưÀ“¼Û«‚ ½9ưÀ—Œ¿Áª»Û«‚ ½9߈·ÔÁ™ÏÔ÷‡¹ÚÙ½·Ó ¥0ëÚăˆŸơê÷Ù匿N›¶é߈ÏÔ³ÈĂâ8¤‡ëöƒv©Óơԭij¹߈9¥‡å̉ ÑÄë̃ˆ½ƒˆÙ­ä߈‘ơëö½€©Óø¿̀Ê)èÛ8¤Áåâˆ:kº£äóÇË¿ËÇÜÍñ»ÛêÓ̃–¶ÓØöÅÓÛ«‚ ½9˜êèäß»ûăˆŸù×±»Ơ™‰kß [ïSƒv›¾±»™‰kß [ïSçÚơĂ˜‰ j ̃    Z îS €¼‰ÁƯƒv™‰kß [ïS÷Áù×ưÓÓű»ëöØŒê*ªÇÜÛ«‚ ½9™Á±»™‰kß [ïS¾ñÆ•¾«»Úª‚ +¼9áê™ôɇÇÖ8¤‡ÿÚ°»ùדÓÅØ߈…Ú°¿…¾­Ô±»ƒÖ¹ÚŸ\ˆ÷ˆ¤ßÍÄWçÇ·‡‘×8çÖÆùêêöư‡±ù1©Çƒv¿º߈ÄÓq£äù×ëƠUä˜Ü·Åޱ»ÏÅÍÄ©́¾º“ö«‡“Íj¡Ôù×™‰kß [ïS«»›¶é—ˆâºÓºѶ¶ËÓçmɇåÁÛ«‚ ½9êöÿÚÆ̃•Œ«‡“Íjù¿ƯÁ³Øù×áÛØ×™Ô‹ÇÔâà›¾çÇăˆŸÙÚº¿́8¤‡×¶¶₫ÚͺÈ¸Ú Å™Áë×Û«‚ ½9áºÛ«‚ ½9±»½ÓÆ̀¼™‰kß [ïS•Èû›ăˆŸ¶¶™‡ëÓ̀ÓóĂËÙÙ½ĐÓ ù‡ƒvçÚƒvăˆŸ;k™ëéåëöÁÓ™‰kß [ïS߈§Ôö߈ϼÓ̉ßÖׯøê÷ÁÁ&°»ƒÄ“ºÅ»¿́—»Ïı»©Øù×ÇÅ†Ú +ùêѶĂÙÛ«‚ ½9¿‰ÓÆ™Áëöö±»ùæëöï³2›¾ăˆŸ—°¢ÈîñĐØ¶ÈßÚʼnߋܷÔù×ؽÑÓŽçÚ±‡½‰ÛϫԑÆƠéÄÓ™‰kß [ïS×ĂÙ™‹ÜﶇÇß™·Ô/Æè©Ó™‰kß [ïSÎÅÏ¡Óß„—ùׇǹÚYóï½߈»‡ƒÖÛ«‚ ½9½ôƯÇ߈«Ôèô¿‰µØù×¼ù×¶Ü™ëéåơÔÚ×ÙÚëöƒăê±ëØ¿ç9¥‡×™‰kß [ïSƒØ½ë¶èÏÔÛ«‚ ½9ŸÖ±½÷‡ó—ñÓÛ«‚ ½9™‰kß [ïSóÄÇèăàg«‡“Íj÷Ú‚Ù£ạ̈ǯ×Û«‚ ½9ÅÄù×éºâˆ;ÇØÅ­¾‡ºĂÏÔÙÚ¿‰§Ôưë¡Ø™ÁÙÚ̉º±»éÓë¼ưÀ¾åÚÛÍĂ©Ç™ÓØ±»ÙÚƒ¶ÔßÄÙÍÄÛ«‚ ½9™‰kß [ïSƒˆ—¶Û«‚ ½9ø¾¥à»Ø¹Ú«Ú‹Ç˜‡߈«»—ó˜‰j̃ZîSƒvĂÇÖÚª‚ +¼9ơÄăˆŸùט‰j̃ZîSÏÔׯơꃈ巳حÖđÙ½«ÔÅØá ÔXăᾡÁ½Ø¡È«‡“ÍjÛ«‚ ½9‰Û˜‡«‡“Íjív‡Û«‡“Íj°»ï½ĂÈăˆŸ™‰kß [ïSơԲȋÇÏÔ›¶é‡Ú߈ÏÔ÷‡½ô™‰kß [ïSéÓơê¨ƠöÁщëöù×ùåÇØ±»߈ßÄÙÇÖö—¶ÀĂăˆŸ;k¥ˆ]1ø× ³˹ăˆŸͼÚ×ÍË)éÛ9¥™‡•½á ÍË)éÛ9¥ï»ͼÙÚë<ÅÔùê±»¾¹x߈‹ÇÇç÷ÁÏÄÁÛï»߈‚vÙ×ăˆŸ;ÙÚ² ëÖ©‡¥2ßëMø¿»½ÅÄÛ«‚ ½9©‡¥2ßëM¡»ù×ưÀ؇½€¡ÛëöóÇ̃ÄØªĐ9¥‡‡ŒñÚÁ̃ˆå̃í‡ƠŸ¹}öÁ¡Á¦º߈ßÄÙçm¾±½ÏĽ߈߈¯àÛº¤ˆ\0ăˆŸ;ÄÓ §Ô¹Úª»ÏÄÏű»¾„bú(“׃v¹=ǽĐÄêÛ«‚ ½9›¶éÏ|µØ™ÁÎŧôơêơÔÅ‘«Û«‚ ½9åƠÓÔÅÓ³”Ơ­ÖÀù×߈¡ÛÅô߄۫‚ ½9ăà·‡‘×8çƼ•ÓëÓƒÖĂÈ«Ñé°¿ «‡“ÍjëöÛÄÓăˆŸ;½ăˆŸ;­Ö­Ä±»ö±»·ÔăˆŸ½¶ÅƠX­vư“ر»±‡ù×çô…ö­?©ÜoùדƠÂĂ›¶é‹ÜÙ‡Ï9…±»ù×9¥‡—¶¶•²ñӵؽɇËÛ÷ÁăˆŸ;Û×ô߈‰¿Iƒvù¿×¾¹Úâˆ:k·Åù×½ƒvå̉ ăÁĂĂïÚ“ºÿ¯¶ƒˆívâÁÏÔß¡ÂÆ«‡“Íj›¾߈™‰kß [ïSÚª‚ +¼9χÛ¹ÑØ—¶Ơ¾G½Ú×™Û«‚ ½9×$½ô«‡“Íj¹Úƒv“ºÅÓ¹Ú¹!ÅØë¼ÏÅâơ÷ÚÄÓ†a‡»߈ñÙ…Ô·ÚơÔ¡ÔßÄÙÅØîºáêµØœ‰¾IÚ×ƠXÁ̉·Å½•%ăˆŸ;Ù×뼟Åéơ«‡“ÍjơêÚª‚ +¼9ĂÈÇÖ÷Áó¸ĐÄ걇ËƠÛ«‚ ½9ù×Ï̉÷ +­ºÚÄ̉ù×ăˆŸƠÿ¯¶¢XÍÓ×¾ăˆŸ;±½€½˜êèäÅàÇÇÖóÏÅ܉«dÿÚ¿º¹£ƒÖG½¹ÏÔ¾ôÅØ«·3uUÛ«‚ ½9߈½ÙÚñÓ€Ç3ƒv÷BỞŽơĂ‹Üëö§È•ÔœÔÿÚ±»Ù½ƯÓ ³àÛ«‚ ½9ĐÓ‡ŒÓÔÑÓ™‰kß [ïSÇØ¿ÈÏÅÓÆûØ‹ÇÚª‚ +¼9Ϻ÷Ú›¾«ÔñÖăˆŸ;8P¤‡PÖF¾÷ÚĂƠ±»߈ŽÅÁÏÅçÚ²Úù×§½—Ó¯G‹øëö½ô¯¾Ư Ï̉Û×̉Ƌǿô»ˆ™‰kß [ïSÅØ‡Œ«‡“Íj“ƠϺƠX¥Ưÿ¯¶ëöÑĂɆ½(Ǽ‚v߈Ô½€Ø× ´ÈƯº…àÂĂÙÚ±»í‡Û«‚ ½9àƠíÙÚ߈ö÷‡°¿’Æ¿‰ÿÛ…ŒáƠ˜‡ĂĂ ›­±àéM߈âơơĂ›–÷Á™àÁ!ëöµåçÚơÔÛ«‚ ½9À¼ä̉©Ó­Ö¡ÁĂÙ³Û×ÑÄë—¶Ç"8¤‡ÏÔ£äÇÖ®Ó Ëû¿Ø•ö¡%áê¹Ú™ÓƯÛ•Œçô·Ó ¥0ƠăˆŸ;™‚ù×ÜÅíÆÛ«‚ ½9ÍÓ“È—¶ͼ¾ôơåĂÏÅ«‡“Íj‚Ø™‰kß [ïSùêëöÁ½í‡ÛÄÓï³2¡»Ϻƒ½÷Áß»ûºø×½¾°»¦º§ÔÙ½Û«‚ ½9±»—¶‡ÍB—¶ßÄÙñÚêöĂÙœ·̉ ¤0­•·ç̉™‡Û«‚ ½9º”ÚÓØ³ÆÙÚÛ«‚ ½9Ă™‡Ÿ}ÙY™‰kß [ïS·Ô½ÏÔ°»åÖăÇí߈ªĂá=×Ó±óÀ¹µØ߈ó×ửñÚË%Û«‚ ½9©Ø߈·‹‡ŒÙ̉Ù½‰º߈›¾½ûÓÑØÏÄ»½à ïÚׯ«‡“ÍjăˆŸÔXŒƠ₫ÚרÙÚ»‡éÓ™‰kß [ïS¿ăˆŸ;k»ÅÏ̉½€íêçÚ·ÔăˆŸ;çô«Ñÿ¯¶å¸«·3uU…Ơø×Ù½ËÉ9Ë¿ëơëöªÔÙ½«‡“ÍjỞñÚ½™‡Ïų(ăˆŸ;öøô°½ù×ƠơèÅ‹Çÿ¯¶ÏÅăˆŸªÚqµØå̉ ăˆŸívÛ«‚ ½9ÍćºÙÚÛ«‚ ½9½¿¹ƒˆáê±Ư«‡“Íjëö±¿÷ÚơÄÛÄÓ¾ÓØÙ½©ÓÑÓ´Û÷Á÷ÚÏÔÿ¯¶ɇÛ×ÇÖ¿̉ñÓÁù?%™"ÏơèÅÚª‚ +¼9…Œ˜‰j̃ZîS‡Œï½ăˆŸ‰¿IỞ‘ơÏű»½ôÛ¡ÔăˆŸ;—»”‡aƒÇ}ÛºëçÇÖß„Áơêø×ăÁóÂá ¿çÇØưÀƒˆ±Üó# Èëö“¹ÜNÛ«‚ ½9Ùçψ߈ñÓ߈ăˆŸÑӳܫ‡“Íj½¾±»ù×¾ÎŹڹڱ¿«‡“ÍjÍË)éÛ9¥¹Ú«‡“Íj±»ó̃ÇÜăàôé́ÿ¯¶ăêƯº‡“ù×°»ƒăˆŸ;k™‰kß [ïSà×íÖ‹ÇéÓÍăˆŸÀÈÛ«‚ ½9ÙÚê֤ƹ¼Ñسºó¿Ù·Åƒv‰¿IÁĂƠâˆûعÚÏÔûƠ‚v™ëéåÙƠËÇçÁÂĂ ‡ƒv‡Ç÷Ù‰Ơ£“ÿÚ“ÈëûÔăˆŸ;çÔ¡ăˆŸ;Ûºçđƒ×ÏÔÛ«‚ ½9·‡‘×8燃ˆIÛ«‚ ½9ÓØÇÖ§ôɶöÁëöÍÓăˆŸÿ¯¶ªĂñ~ƠăˆŸ;µØÏÅ—¶±¿‡×«‡“Íj·Ø߈áÛóÏÔĂô‰¾߈Û«‚ ½9ñÚ±½©½ëÓƒ¾™‰kß [ïS†ºç'—ˆûØÙ½ÏÔ°»ÏÔ›¾ƯºơÛ«‚ ½9½±»Ï̉Ûº™ÁÀ˱¿‹v“Ơ™‰kß [ïSÿ·Å÷ÚăˆŸ‡î»›Ô‘¾½£ä•%£Ø°»å̉ 麩À¶Ô˜êèäÙŒë*«¥Û’½ÿ¯¶™‰kß [ïSºó“ĂÆóéȺyơêçºÙÚÜÏŽăêëäËÇÙÚÛ«‚ ½9ÍÄăˆŸ;³¹ÏÔÖµØêö™‰kß [ïSªÓăˆŸ;±»8¤‡ÖëÚÏÔ×Üâ»ëØÙÚ«́ƒ½å̉ ×̉ÁƯ¦áƯåôÜơ·¼Í7·Ԭ߈ăˆŸ‡xưÀ“ÑĂÙÿÚ߈™‡µ9¥‡­ÖÏźơÔŸç“ÆÍĂÆăˆŸ;¡Ç¥Ó™‰kß [ïS‹Óœ‡ƯåñÖó#¿»«Ô¿Åù¿íºô·‡‘×8çăˆŸ;‚¾߈½Ù½èꙉkß [ïSôÔÁ×ÏÔ«‡“Íj‰¿IÓÅ­ÄÛº¶ëö÷Á“¹ƯN‡ºßÅÓóÔˆƠ¿»«‡“ÍjơƠùơ›Û«ÔÚª‚ +¼9¾ ¡h˜‰j̃ZîS“¹ƯNßÄÙôƒv›¡‡ñ5®Û›¶é¼…ÚºÛ«‚ ½9ëö‰¿I°»ËÉ9̃Á'«‡“Íj©¾ñڽ⻂v•Ö¥ÇùêơÔ¡ÔñÙ—¶‹ÜÙÚó¹ˆ‘ÛæØÀºéÚÅԣ䫻۫‚ ½9çÚÛ«‚ ½9Ù½‡ÛÄÓ™‡9¥‡›·Ô򼁯רëÓÙŒë*«ÏØÈ̉íÖ„nÏı%íÖ±¿ö«‡“Íjơêùף䡹Úùן}å̉ ùê±»ŸÈ“ö«ÔÑÅŽ¡Û´aÇÖŒƠ ¿߈±»³éêà Û«‚ ½9÷Ú˜‰j̃ZîSñ%ÏÔ«Óåí‡Çùחサ؋ܽÜĂÖ™‰kß [ïSÙܳÚù׻ſºùêÛ«‚ ½9רơĂăˆŸ;ÎÅ«·3uUÍÄÙ½½Ô‘∛¶éå̉ ĂÈ«ÔùסȕŒ¡ÈÓÙÏÔ™‰kß [ïS¹ÚˆÛƠăơ±»ÏÅÙÚ°½ Ùñ֣DžڽÈù×÷Á¼À¹ù×Úª‚ +¼9×ÓÏ̉ó¶Ù½ĂÙơêû¢ÓÔ›‡¯×µÀ¯G‹øĐÄê9¥‡«‡“ÍjÇĂ½Åá×™ÛÛ†ÇÏ̉ Ëûơ꺶Üͺ±»́Á¹ÚëöêöëÓ߈±½Ïūڙ‰kß [ïS±»¹ÚĂĂsưÀ™‰kß [ïS7ù×·Ó ¥0™Ơ߈„ÇÛ«‚ ½9›¶éÏÔ₫¼é—¶ÑÓĐÄê¡ÈăÇí×¾¯ÈÛ«‚ ½9ăˆŸ;kóÂăˆŸ;³ÇæØ‡¼™‰kß [ïS‡ÛÛ×µØôĐÄê§Ôăàå̉ ¹Ú‡ŒÍBÿÂëöƠÑÄë™Ø“¼ÏÅăˆŸ™‰kß [ïS×¾°»±»±»ëöÓÆ‚vÏåơÔ÷ÙÛ«‚ ½9‡äÏÔñÓÙÜù×½€±»«Ôà2̣;:ü%'¤#§!÷Á±…Ö‡xÁ̉±»߈ÏÅƠ₫Ñ`µØ9¥‡¡ÈăˆŸ;k¶ÅéÓĐÄê‡È«‡“ÍjĂàÅÄÏ̉ǺÊÓưÀ™‡‰Ư釃Öëöƒ½«Ó÷Úņ­Ä©£«‡“ÍjñÚí—G× §Æ©ÓÅØ“ƠăˆŸÏ̉ĐÄê§Æ̣ÇóơÔ¹à™‡ÏÔ›h™‰kß [ïS«ÔÏÅ­ÄÑĂÈëöïô©¾ÏÅ•Œ́v×Ü¡¿ß°ÁÀĂ£Ç‹È߈ư­źưÀ¡Ô“Ơ½ăˆŸ;kù×°»ƒv×¾å̉ óÂó¶9¥‡±ÜÓ±ƠÎͽÿ¯¶ƒ¾‘¡Ô°»ÿ&9¥‡Û׃vÿ¯¶ÑÄë•ܩӾ×ƠëÚÚôׯÇù×íØ“Û‡đ”ÈúưÀÙÑsÿ§ĂƠÅÓ×ƠƒvµØ©‡¥2ßëMăˆŸ«‡“Íj±»§ÓÅơê“Ơ9¥‡߈½€ñÁÅÔ®ÈÄÓ¸Á¡Û±»›¾ûƠ—ˆͼ‰¿I»Íù×Û«‚ ½9ﻺÏÅÏÅù꿉¥y›¾ëÓÑÓÿÚ…ÏÔïÅÍĂ߈ơêÏ̉Âù׃v§ÓôưÀÍÓÏßÛ«‚ ½9×¾«‡“Íj›ÚÅôÚª‚ +¼9¡%ñváê¹ÚÙ½´.¤ÙôöÛÚĂÈ߈áê‡×Ơ¾ ăˆŸ±»“ƠÏ +™‰kß [ïSóÂùꩇ¥2ßëMßĂÙôé‰Û¨¼÷ÚñÄÿ¯¶ÑÓưÀ±»åôÛÄÓé‰ñ5ñ·ù׫ԫ‡“Íj麃vªÔ×¾ÉÙ¿Ă9¥‡×ѶÀ‡€è/Ö:øÜ«‡“ÍjïÚÿ¯¶Žíº™‰kß [ïSĂẳÑĂôêï½’ĂÙ«‡“Íj°» È“ºƠ9¥‡÷‡߈߈ËDZ»ăơëöùơÆ¡ÜÇØ•ó߈ÚÀÏÔƒvß»ûŽăˆŸ;kéơỞƒˆ§ôăˆŸù×öơêĂ—¶°»Û«‚ ½9á¬ëöºÙƠøêÛÀ9¥‡¹½¡È—Øù×ÅÓ—Œƒ½™‡ëö¬Ô åĂ¿+«ÔǼ™‰kß [ïS£XơÔ¶Û«‚ ½9ÙÚ½€Á´äôà—ƯỜ½ưÁ±¿Û«‚ ½9ÀĂ­ÖÁĂ¥ ½ô«…n«‡“Íjޱ»ñ‡«&±»—÷Áá¡Ưù׫Ú߈Á½ÁөؽßÚר߈ƒùêơèÅö‡Œø¿çÚ…»±»«âăˆŸ;kºóÇưÀ™‰kß [ïS™‰kß [ïSº¿ÅÎÅÏÔù×ù×›¡߈ưÀíÁ•߈ù×ùףǫ·3uU›¾Úª‚ +¼9ÙŒë*«æÚơê߈·Å߈ăˆŸăˆŸ;߈ăˆŸ;« ¹ÚíÆëö±»Ï̉ö߈—»ùơ˜ ê è ä ñÙ÷ÁÙÜ™‰kß [ïS«ÔÏÔï½̉ØÚª‚ +¼9©Øù×û‘·‡‘×8ç—ˆn½ôåÁ׿8Ñûëö¯¾‘-ÿ¯¶·̣ÏÔĂÈ¿ôÙ½­Äá_ĐˆÛש&ëöÛ«‚ ½9Ù½ơĂÑæÿÚĂٵ؃v½óDZ»ù×½«‡“Íj‹Ÿ˜ÓÛ«‚ ½9ÙÜ™‰kß [ïS£ØăÁÏÄǼñÖñÖö‡ÇáØ¢»*ÏÔ£»©Ó­ÄæºǼÎÅ—¶ÁĂÙÚ¹à˜ó9¥‡Ͼ¥O³ÆƒvĂ¼åŒ¿N±»Ởëö±»ÊֽߓƠÑĂÏÔ¡ÁÅÓ¯ÈÿÛ»Áû¡°»ñÓù׵؂©Ó½ÿ¯¶ưÀº¸Ú—áÛ«‚ ½9¢»›ÚÑíÛ«‚ ½9ø+§Æ¹ÚÛ«‚ ½9ó˜‰j̃ZîS™‰kß [ïSëÓùêïóÂÍƠ·ôå̉ ³èꃾ‘Û«‚ ½9˜‰j̃ZîS«ŸăˆŸ;ëöϺßÁ⻽¿Í¯éăˆŸ½·ôÛ«‚ ½9ưÀ›¾ơê¡Û»Ü«‡“ÍjăˆŸ;щ߈÷ٵث‡“ÍjíÆåĂ¥ˆ]1ăˆŸ;9¥‡ÁÚå—ÓÿÚÿÚÏÔÛ«‚ ½9ßÄÙψ‡¹Ú·̣¼™‰kß [ïSÖÆÚª‚ +¼9Á·ÔºĂ™‡Æ»»ôÙƠ˜‡†Œ°»ÏÔÂÓ›¶éö¹ÚÛ«‚ ½9ºçÚ˜àÛ×äôó±ËÉ9÷ˆûÀĂÙ¡Ô߈·ÅƒvĂÙ¡Ç¡Èáêß»ûƯÓ ̃»úÛ«‚ ½9ƯÓ å̉ ½€˜‰j̃ZîSû«‡“Íj«‡“ÍjăˆŸ¡Á»́߈Ăư“߈ÏÅÉ9¥‡ ƠÀưºÏ̉Ă§Ô™Ô³‡ÙŒë*«›¾­à½9¥‡ƒÖ·̃«‡“Íj̃Åb‡ĂÚ …Ư“ƠÁ̉ưÀơÔ™Ôơຫ‡“Íj¸ÚûƠÛ«‚ ½9ËÇ÷ÂÅ–±½™‡ÓÅÅÓ˜êèäÛ„ôĂÑæăˆŸÛ«‚ ½9ƒ½´Ø¡Èù×…ƠÁ‡é/×:Ù½Á½ÿÚïäüÁë×°»Ë%ĂÙ¼Ô‚ÖµØÍ1𫇓Íj“¹ÜN±»‰y߈ÂçÚ•ÖĐĂ³Â«»ưÀû‹Ç¹Ú‹ÇïÅçôûØÀĂ©‡ÚƠ‘øÅÂÿ¶Á廫‡“ÍjăˆŸù¾«ÔĂƺÍĂëöƒvó–ăơåĂ󹿉áç´‰©‡¥2ßëMơĹØçô9¥‡ï×ñÙ¯G‹øƒvơ'«‡“Íj³+“Û¼߈ÏÅ“ƠÛ«‚ ½9‡º₫®¶¡ÈåôÓ̉ỔÍÄíơ¿‰~߈‘Æù×ëöÛ«‚ ½9ÇÖ¡Ơ«‡“Íj€Ç•Èû›Íö̀¼̉̉±9ƒÖ߈Á¼ó˜‰j̃ZîS¡ỐÆǽưÀÚ׃v×¾ׯ±»…øùêÏÔª¶2tT¹à½ׯå̉ —ŒÑØ»ØÙÅë·ÔéêÛ«‚ ½9µ.¥Ùø×çôÿÚívơœ…×Ú߈‡ŒÅ–±»±»ưÀ߈§‡ÙÚ¡ÔËdzÂÎÅơê§Ô߈¡ÔÇ»¹ÚƒvàƠ«ÔưÀ½ÿ¯¶₫ĂÙ߈ÇÖ±»ÅÓ·‡‘×8ç÷‡ƠâÁ9¥‡¬Å±»ÑÓßÚ·ôËÇ«‡“Íj™‰kß [ïSÎÔơ꫇“Íj›¾·‡‘×8çÁ‡x¿‰ÅÔµa›¾ăˆŸ;Ă³߈ÑÓÿ¯¶÷Á߈8¤‡×½\óÄ÷Úù×±»öÁƒư“§Ô9¥‡×³Øï½«Ô±» ÏÅĂĂ›Úç̃ÍÓ‡Çϼëö—¶£äÁƯؽñÚéÚ½ÔƒÖơĂăˆŸ;Û«‚ ½9¹Ö›¾ƒˆù‡ù¼רËÇÏԷءԂÁ̉ù××¼¿ôµØß„ÙÚö©‡¥2ßëMơÄÿ¯¶ÑÄëèơ¹ÚăˆŸ;·Åùëëö‡ăˆŸ;߈Û«‚ ½9£äưˆăˆŸ;£äÛ«‚ ½9¥ºÁ‡é/×:ÇÖö—¶‚ØÛÄÓ«‡“Íj™º¹ÚÏÅ߈“ƠỂ›¾‹ÙׯƒÚ È°»ëöù×å¹߈ñ×Óśڛ꿉±»ÿ§ª»ß„ù×Ûº›‡§Ø£Ưÿ¯¶ß©‡¥2ßëMƯ·‹ÍÓÙô»Á£ÇăˆŸƒvăꩼÑÓ›¡8¤‡×›ÚÑӜ܋ÈÏÅóÏÅ«‡“Íj›¶é·¼Í7ùê±»ƠÄÄßç«·3uUêÚ…ëŽ̃„ƒ½Ù×ùÖëö—¶¹Á߈Ùڃ؜ÁÙ½›¹çÚËÉ9Ó¾ëÚëö9¥‡ĂĂơ9¥‡£ØµØÇ̉‘«ă»‹Ç·Ô¹Ú«»Û«‚ ½9ŽÿÚ«ÔÛÀßÁóÇÛ«‚ ½9ƠÀ ±kï½ÓƵëÙ½ø×Ϲ°»çĂéÓ«Ô‡¿Û«‚ ½9Ë¿R‡º½Ô½€›¾ÿ…ơÔ±»ăÏê¿́÷Áé‹Ü«‡“ÍjçÚĂÙÏԋ܇“Û«‚ ½9ÙÚ½¤½!§ÔùסȽ÷‡ƒv«·3uU¹Ú߈Û«‚ ½9ù×ëö¼²Â±»SƒÖăà—¾ Ø‹ÈÙ̉ï³2ƒvƒ›¾ưÀÛÄÓù×’ôï³2Ó¾û¹ÑÄë£äÙ½ăˆŸ;ơÔüÀŒƠµØưÀÁƯÔƯÓ ÑØŽ߈Ơ×ùê×”‹pœHp«‡“Íj÷‡Ù½˜‰j̃ZîSăˆŸ;Éî“ơê¡Û©ÜÅnÑÄë—»߈±»ưÀÓØä̉Çơêíívù×ñô°¿ëö‡Œ÷‡Ù½«‡“ÍjûïøêÏÔÁƯÑĂÈívëöÁĂËÉ9÷ó˜‰j̃ZîSóăˆŸ;kºnơê™ôƠŒE™ô£ÓÁƯÀ‡€è/Ö:°» +Ơ’«‡“Íj«»ÍÄ©¼ÙŒë*«ÍÓëÔóÇ…ê…ƠđÁÿÚÑÓ±»9¥‡³ÔÚ½ψư“±»Ï̉éJé‰Ó5“gesÁŹڱ»™‰kß [ïS“ÈơÔÙŒë*«Ç̉ÑÅäÁºÙ½ƒvưÀͼ¦¹ÿ¯¶«‡“ÍjÙ̉…x߈ùוÈû›̉ºù×ưÀ9¥‡›¶é÷$éêëö“ŸÏÄÛ«‚ ½9ÏÔ±»™‰kß [ïS™‰kß [ïS•Çü¦†öëö÷Ú§ă¼ôÍË)éÛ9¥ÅÔ㙉kß [ïS–¶Ç"Ơ¿‰ÙÚ°Á9¥‡Åư!ƒv¹Ú¿‰µ.¥Ùù×½çÚ‡×Û«‚ ½9¼Ô·‡‘×8çٽ麙‰kß [ïSß»û·¼Í7Ó¹ßƯׇtÓ~!«»‡Ú¯¼½Ă•Èû›©Ó¡»ĂÛ«‚ ½9߈»Ø™‰kß [ïS™‰kß [ïS•%°¿Ç»Ó؃։Û÷ˆẩ¯Èơê9¥‡×Ïż Û׫‡“ÍjÍÓ·Ô¾µØ߈™‰kß [ïS‚™‰kß [ïS©Ç‘Ö̃¹©Üù×ù×±»ó¦«»߈¹‡²¹ïÎßù×°¿ª¼ăˆŸ;k™3‰Á´Ø ùêơÔ‰¿IăˆŸ;ôđƠ—Ó™ôÛ«‚ ½9¡ßßÖÉ¡%‹Ùó̉½ÙÚ•÷•Èû›ÙàºÆÜơê퇶èù׉¿I÷Ù‰¿IåĂÛ«‚ ½9Ở›±ƒÖÛº +±»߈™ÁçØ§Ø¹ÚÎÅÁ̉¢ ›¶éçÚáêù×Ù½—»›¾÷Ô™‰kß [ïSÓÆÙ-9¥‡×¹ÚÛ«‚ ½9›¾¿º°»ÙÅëÙ½ù×ëöÁ×Û«‚ ½9—¶ƒÚµ†ׯ°‡±»Ï̉«ÓÛ«‚ ½9›YÍéꇙ‰kß [ïS™ëéå̉ºƒ·÷ÓѶÙ̉Åăà‰y›¶é«‡“ÍjÏÅѶ™‰kß [ïS™ÉơĂÛÛ«‚ ½9ñ"ï¥5«â—¶ÁÉÏÅ£Ư½Û™£¨ÓѾ‘ơÔ°»èơÙ̉ÑÓ˜Á¡ÔÓ­Ö™ơđÓÅ´źÏÅÿÆß»û£Ç̀¬H×ÜĂº¿ŸÅ»…Öö÷Ø·Ó ¥0÷‡ÏÄăàĂº…˜‰j̃ZîS½©Ç±”±”¶Åƒ߈“Ơôê…Öƒˆ•“ƠíƒĂÁÛíäºÏ̉Û¹ÖÁËĂºÏÔ׳ÂǺ½¹ù×½ÔË¿¡Á퇫‡“ÍjÙ¾”îù×áÛƒÚ—¶ök‚›¹ôßƯáÛëöÏÔ³¯Ûß»ûä̉ÅØÙ×ÿ§߈›¹¡ÇÖ™"·¼Í7”Èú¡È8¤‡™‰kß [ïS³Â¿º¬ÖëöÇ»ƠXïÚưÀƒZŽ›¶éÿÚñÓû±»‚Øùă˜‰j̃ZîS£äíÁ½€å̉ ˜‰j̃ZîSèÜÛ«‚ ½9ÑÓÏ̉§ô÷Ù½ÍÓñÖ½¹ØÙÚùץܫ»ˆÇ µaå̉ ăˆŸÁƯ™‰kß [ïSçÚÛ«‚ ½9×¼›¾˜‰j̃ZîS¡È›¾´a¡Ô±½•½ïi©ÇßÁ«‡“ÍjÓ̉߈ăˆŸ;å×9¥‡«ÔÛ«‚ ½9ôĂ…Ö߈ÏĹö±»ËÉ9Ưå™ÓĂÙÚ«ơÁ*ăˆŸ;ăàÛ«‚ ½9ñÓÂÙĂȃµèꇷÈûØ߈å̉ ÅØÆØă»đÅÔŸ}Ă\ùơ¹ÚĂÓ¿»ùê§¹·‡‘×8ç¯ÈĂĂ ›­±àéM퇙‰kß [ïS™‰kß [ïS¿è¿ôö™‰kß [ïS8,¤‡,±½µa½ơÔ«Ñ­Ä»ÏÔăˆŸ;ö­Ä­Ä­½¼ù¿“Æ®×DºÁ̉óÇ«‡“Íj«ÔçÚ9¥‡×ˆ¾³ºó§†ĂÙ°»ăˆŸ÷Á©ÓÙ½™ÔƒÖÏÅ¿ßÁƯ‹’ÏÔÛ«‚ ½9ׯ„ÅØ‚vƒ½çÚÀƯÛÀ²½߈ÏÔ¡ÈÏÄAÛ«‚ ½9ưÀ•œª'¹ÚơÔÏ̉ÅÑÓ¿ßöÁƯ’½Ïŵؾáê¹Ú±½û̉ÍY“½ÁÜ‹€±»¡ÛμÅÔ ÛŸ¹£=óÇ•½ Ơx‹€ÙŒë*«ơèű»Â÷Áù׿çûà×Ơù×ëö‚ØăºĂï9¥‡Û«‚ ½9ÅÓÏŶ‡,,Ö8,æ,›Û¹ÚÏ̉˹™‡߈ûƯøÿ9¿‰߈±»Ë̉ÏÅ©&‹Ü«»Ư‰ăˆŸ;k«·3uU‡6©À¶¼̀7›¾÷ÚơÔÅ»ÁƯíê¾ßíêŸ}ƒ½ăˆŸ;±»Çư“Ưº‰Û§ÓăˆŸÙƠ›¶é¦Ô Ë%á­ÄÛÄÓå̉ ÁƯé‰ñ5ñ·ÿÂívµ†½ù×­Ö¹ÚĂº‹ÜÙ½÷ˆǺöö¹Ú߈éé¾ƯÚ¯‰¯0½ëö›¾º˹«Ơ¨Œå̉ Ø«‡“ÍjËÉ99¥‡ɇñ~¶¶ü‘±©ÓûƠ«‡“Íj«·3uU‰ß»Åù׫‡“Íj‡ÇöÁºÁ½ûÙ’½Û×Ư°»£Ø·Å¡߈»Ă™‰kß [ïSÖ$‡Ç±|—¶†ºëö°»ÙÚ™‡¶¶™‰kß [ïS™‰kß [ïSóDZ»Æ³(ăÄÛ«‚ ½9Û«‚ ½9Ơêö½ƒˆƒà™Ôáê½èíÅ‚ùßµØ÷‡çØù×ƠÅ»ÍĂ©‡¥2ßëMƒÿ¯¶«ÔưÀÏÔº¥Ø¹Ú«‡“ÍjµØ½ù×﻽ĐÄêëÚëöÏőƽ+ÙÚỞ¯‰¯0ưÀϺƯÓ ÍË)éÛ9¥¡ÈùסÈá ÛÑ«ÔÓ̉á¬é‰ñ5ñ·‚¡Ơ›Ûª»ùêỞ½€®È£Ø§ôƒˆù×±%‡Œ×Ơ†7§j÷‡¡Ç›¾Ë̉±»¹£­߈Á½±»̉º¥ˆ]1Ľ¾¿·Ó ¥0Ë߈¼ĂÅÙ½«‡“Íj¯ÈÏÔÅàÙÚÍË)éÛ9¥úêù×4›¾«ÔđÓ“Æ…»Û«‚ ½9ÚÇÖ™‰kß [ïS§ÔñÖ±»·Øç™‰kß [ïSƒvù×›¹¬È¡Á̀Ê)èÛ8¤”çÚăˆŸï½êöĂȉ¿I½€Ưڵ؛¶é­Ä¯Ó¶Å÷Á™‡½ĂÙëØ±»ưÀ“¹ƯN™‰kß [ïS÷Ú•½ƒˆ©ƠñÚ»yÁÙéJé‰Ó5“gesÁų(¹Úùש-™‰kß [ïSÙ½÷µëÖñÖăᙉkß [ïSÁĂăˆŸƒv˜‰j̃ZîSÛ«‚ ½9ƒv¾º‡Ç©ÜÄÔÛ«‚ ½9·ÅĂÙ‰¿I°»ÓÁ»È«‡“Íj«ÔƒĂÓØĂăÔ™‰kß [ïS¡»ÇÖå̉ ÏŽ‡™Ó«ÚĂÙ…»Ï̉âÁ ߈ÏÔç4®×ÅÓ«Ô¨ØÏÔ¡ÔÛÀëöô‹ÈµØÓ¾‚Ú +¾º߈½³¾·¦D ›¾‹‹ơÔË¿¹à½è%ºøêÛ«‚ ½9ô™Á¼Û«‚ ½9«ÔưÀÉÜđÓ±¿È̉ ù×¹ÚñûÓøæúÓÛ«‚ ½9Ăô¡ÛœÜơêÙÓÏÅ߈ºăÇí„Ø‡³¾°»жÛăˆŸ;ơÛ«‚ ½9¹ÚưÀù×ĂÙƒˆщ´ÅψíÁªÚ çÚƒÖ¼éđ߈ÛÀ‰¿I¡Á“Ơ«‡“ÍjÏÅÇY¿‰É̉¿º ËûơÔŸ}ăˆŸ;Ññ»÷Ôăœçôùêö÷Úûơ»Ă™ÏÅå˜µĂº«‡“Íj“ÇÏÔơêÄưÚÏŽÈÏÅơ‡ơêñ¨£äж*ÑĂÙ½ Ëûëöëơ¯ƒßͯ¥'=U#QK¯Âï½ơÔ߈«dÇÖ¸Áăà±½ùê뺯¾ä̉))߈¯ÈÅÓ¿‰߈Å̃ŒÚ,†ŒĂÙăơ©¼ơêëöÿ±½©©Ó«Ôơ‡ỞÏÔ™‰kß [ïS§ÆëÚµØư‚Û«‚ ½9ÙÚƠ·‡‘×8ç½€ƯÚö˜‰j̃ZîS™ëéåƒåÛ«‚ ½99¥‡ÓÅ߈ø×á ƒ¾‘×ÓçZ›¾ñΩ½ÅÓƒvăˆŸëöăˆŸ;«‡“Íj߈—»ƒv·Å«·3uU›¾ă‰ºÅÓ±»±»̣¶ûÖ¾á™Ø¾ÏÅ¿¶Ø·Ô±½ưÀ–¶  ºÛ«‚ ½9Ăºư§‡ÿÚÁƯË¿ÿÚơèÅ߈Åà̉ˆ”=•{™‰kß [ïSƒˆĂô߈·Ó ¥0ơÔăê©ØÚ× Û«‚ ½9Ăº›‰±»·Ô¡ÔËÉ9·ÔÜ©Øù×ÍĂỞ¿º¥‰ÍL…Ï̉߈ÿÚ߈¿Å™Ô߈á êØÿ§“ÆûÀĂº½€Ǽ¡Ơá ÙŒë*«ëöÏŽĂÑÓÏÔÙÚ“ƠÅØÿÂ߈÷‡í—GĂÙÏÚƒ“«‡“Íj§Ó©‡¥2ßëM½ÑÄë·Ô…»¹½¶¼̀7†íÖñÚ™‰kß [ïSƒvăˆŸ¿‰¬ÄÏÔÏįÈßÏԟŇ“ßÚ™‰kß [ïSăêø×±½ù׻ؕŒ¹Ú›Û™ƯÙÚÑÓĂèÏÔ—¶¶·Å÷ÁÛ«‚ ½9ëÔĂÙµØĂÙŸÅ߈߈€ß»ûª‡’̀jñ¨«·3uUơê¥ÈëÓ½«‡“Íj9¥‡íÆ5ùôÁ½ĂÙßÄÙ¸Ú ñ&·ÔÁ½”Ç©ÇëÚ9¥‡‹ÓûƠÛº˜‰j̃ZîS™ëéåÍôÛ«‚ ½9ÙÚăÇí©Ó±ƒ½ÊÖ ¯ÜöơÙÚ±»2Ï̉ÔơïÅù×ß»û˜‡ÓZ›»ë×­Ö8¤‡̀Ä¡ÁÖ §ºăàË%ÑÄëÿÂï‡ív©‡¥2ßëMÛ«‚ ½9ù×™‡§ÔñÖ‡ºÅôĂѶË¿ưÀØƠÛ«‚ ½9§ôÛ«‚ ½9ßڬĩ‡¥2ßëM¯¼‡Œ«ÍđÁ͇×÷Ú‡º«âñÚđÉĂÙ×ëöÙ½ÖÆ¦ÔÅÇ÷ù×—~ăˆŸăˆŸ—Ó³qÙׇŒĂºÛºÏÔÚÆ¹ÚÅØ̉Æù׃½Å§Óÿ¯¶÷ÚªÔûÓ¿‰éºĂȼÛ×ĂĂ ›­±àéM¬¼¼߈¯È½÷ˆ³ϹÛ«‚ ½9÷‡ª¶2tTÖ¹IóÂÙÚÁ¼ăˆŸù×…ÛëÚßÑơÄĂÙíÆ«‡“Íjш¾ß&øº«‡“ÍjỞ«‡“Íj”½ÇØñÆÎŽ߻ûÏÔívÙÚÛ«‚ ½9™‰kß [ïSÏÔ™‰kß [ïSͼĂÙ—¼ăˆŸ;Ï̉Ö1ƒv¸ÚƕǷԛ¾¥Ø½áêÏÅăˆŸ;°» á¾ơê¿»ÏÅϹí¼ÏÔ·‹ó#ăˆŸ;kƒ×‹Óén¡Û÷ÚÏÔ¡Çܺ«‡“ÍjỞ°»½¹Ú‡ºÏÅѶ„™‡äÁ¾ß‚ÖʹĂĂ ›­±àéMÁƯ¡ÁăˆŸ;këÔ‡Çæº£ØóÇ¡Ûÿ¯¶ëö•ŒưÀ·Ó ¥0™‰kß [ïSĂơê­Ô•̃ó¶ÿ×øô‡ÙÜû‰÷‡¹Ă×Ó‰Ôù‡ÛÇăˆŸ;Åñ,‚vù×ăˆŸ;k«‡“ÍjßÄÙỞªÔ߈ù×ñÓ½ôĂ‹ÜöÏ̉Ù½­•·ñÓÿÚơéÿ¯¶·‡‘×8çruרù×Ö‡¼7߈‚v¹à¼äôéƒv©Ó9¥‡×Ăâ¶È…öÏÄAÁ¹¹Ú«‡“Íj¥ÓÀËǂÖñ»ô߈́ø£Ë‚ö߈¡Ó½€±ëصØÏÔµ‰ưÀ•{¸ÚŸ}›Ú˜‰j̃ZîSå̉ Ù½¹Úí—G‘Œ߈“áç½™‰kß [ïSͽơêăˆŸ¬Ô­Äºå̉ ù×áé—Øës¹Á±»éĐºù×·‡‘×8ç¡Û·ºăˆŸ;ÎÔÄÓù׃vÁ±»ƒÖöͼ½€ûƯÁĂ©ØăˆŸ;ơ؇ºö­Öå̃ÿ×ÏÔ½€ƒˆ¿Å̀Ăù×±»ËƠ›¡™‰kß [ïSĂÙ…oÛ«‚ ½9ÅØëöËÇ™‰kß [ïS¡Û½Íįת‡’̀jª¶2tTÇÖ¯ÈëöÑÄ뽋ÈÏÔ¡Ø·Ô·‡‘×8çº÷ÚƒÖ·‡‘×8çÇÖÂÛ×§ÓÅÓÛ½« ©ƒ»5ƠÙ½8¤‡Î̉ÏÄAơêÍ´ßƯÙ×Ù×Ç%ÁŸø×ÛÀù×¹Ú“Ơë̉ÆèÏÅ·§D á­µØÿ¯¶ùêơ™‰kß [ïS¹¼ăˆŸ³ÈÂèÅôỞưÀÏÔŸÅ™×ĂÈËÉ9ơԟŵܺî¹Ú°»ŽÏÅߌÛ,øêưÁƒvĂÙ÷¨ÏÄëÓ¹ÚéêÛ«‚ ½9Û«‚ ½9‘¾ш›¾ñÖׯ«‡“ÍjÎÄAƒv÷Ù‡÷ˆÑƯ9¥‡“ºµ†ôÇ%ăˆŸưÀ™‰kß [ïS÷‡ÿÛÇ÷¼•ܺóÛ™‰kß [ïSÿ¯¶‰Û‰yÏÔÓ¼½€ªbÿ¯¶êöôÔÏÔÉ̉Û«‚ ½9ù×›¶éĂÙ¾ßÏÍӤ؃v³á=ÏÅŸ}Ž«ÔѶđÚ½ÏÄÙ½‹Ü¡Á«‡“ÍjăˆŸ;ŸÄ߈Û«‚ ½9ªÓØŒê*ªºÁ̉Ă½›¾‘öôĂû(߈¶¶Ô ߈́–G¡ÔƒˆẲƒ·‡‘×8çĂè÷ê˜êè仃vÛ×ù×å̉ ¿ôĂÙéê÷Á÷€߈£Ư»‡›v§ÔÏÔ9¥‡¡%Á½ơêăˆŸ«Ôùë™Áơê»»Á‡é/×:Ă ùêơèÅ» «‡“ÍjíÆ¼ôƠ´ĂÙíêÏÔÂÙ±»¹Úö«‡“ÍjµØôÏÔ»(›¶éÛ«‚ ½9Ăô™‡ơÔÙ½°»ăàïd¥Æâà'ËÓÏÅ£ ơÔ₫Æ÷Á£ƯƠ¿º£»ßÄÙˆ½ÅØ߈ù×Ù×½€¼Û«‚ ½9­Ä»ö±»«»ÈÏÄ™‰kß [ïSÚª‚ +¼9ÅÅù¿ƒ¾‘ÁË߈¶Åƒv½ÎÔöÆ»‹ÇÛÇ™‰kß [ïSÅÓÿÚƒv߈›¶éÙÚ߈Û×Ơ½±»ù꛾ëöÏ̉ưÀűëØÙÜĂٻ‡ÇËÉ9ªÚ¹¼™‡ƒ±»÷ŸàƠív™‰kß [ïS·Åï³2è¼÷ˆ—Œº³ƒ¾‘ƒv±»™‰kß [ïSËíÖ©‡¥2ßëMY«ÓÙ½“¹ƯNï½ä×÷Ù±»çÁăˆŸÿ¯¶×¾±ÁóĂÙ½ôѰÏÔè·äŒ¾NÓÆ9¥‡¯È©‡¥2ßëM³ØÏÔÓ¾ăÁå̉ ÍŸªÔăÁù׋܌۫‡“Íj«ÔÙ½©Üÿ½·̣Û«‚ ½9±»ø×±»ù׸ڣ»Úª‚ +¼9†×ÿÚ™‰kß [ïSáƠá°&Å–¡Èéê’¹ÜNÙŸ}ĂÈÏÔ‡»¡ÁÏÄ“ơÔÍÄ™‰kß [ïSÍÓщƒvψô¿±»‹Ç±»—¶‡½€§Ô™‰kß [ïSÀƯÙ½Á§ÔăàƒÖ™‡éê÷ˆă ƒ8¤‡ÆµØ©Ơ™‹ơ-·Å9¥‡ǼÿÚơê߈߈™ØÙ諼߈߈«‡“Íj¤ÙĂÈ߈ĂÈ߈óDZƠ½Û«‚ ½9¯¿‰ăˆŸ;½™‡Ưºß„߈ÙêÉĂÛ«‚ ½9ăˆŸñÚ‰Ûι¸̃áêåôƒˆ¹ÚËØ˜ÓÅÓíØ‘ÚÛºùÂÓ©¼öÏỖˆ¡ÛƒÖäºÿ¯¶¿Œ­ÄXÅÛ +‡ÚÅØêö߈Ó¾¸ÚÇÖÛÚÏÄ™‰kß [ïSºØ-ؽ½ù(©‡¥2ßëM£ô©Àù×ÇÛ±¿»ÅÚĂâœÔ±»ơꩢ䫷3uUêÚĐÓÓØơÔ©Ó¯ë©Ơµa Ç߈ăÁÙ×Ơ€º›‡ÚŸÅăˆŸƠºmÔXÁ̉Ë̉ƒ½Œ¾Ăٷųô­ÄïÚÅØ§ÔưÜÛ«‚ ½9ăˆŸÑĂÅ–âགྷÅÔ±»©ÜßÁëÓùꥈ]1ƒÔÛÀ§¹Ú±»íÁ߈ÅăˆŸ;ÿÚ…ÚßÖÔX֧̃Ƶ؃ÖßÚơԼ؃֡ԋÈϺẳ°‡ÀƯ«ôôÄßÁíêßڇǘ‰j̃ZîS™Ó×Ơà±»“Ûôêơ«‡“ÍjơÔÇŽȩØéº¾ßÁÏÔë¼´œ·Å˜‰j̃ZîS߈•Û߈Û«‚ ½9…ô»Áï½—ă™‰kß [ïSÎÔÛ«‚ ½9ÁĂ₫®¶ÁËÍË)éÛ9¥ÏŧơêĐæ¹«‡“Íj™‰kß [ïS÷¶ÑĂÉÙ½±»Ù½÷‡·‡‘×8ç¹Á†ºÚסÔÔĽå̉ ÙÅëù×ϹÙ½»Á°¿rúÖ Ëûù×Ù½ßk¹ÁµØ¸£ÅÓ‹Ü–¾§Ô½Á¼ëÚª‚ +¼9ơê²×ÑŇºĂ“ȽÏÅó×ÓºÙÚ·uÏÔ¹ƠϹơêÛÀ™‰kß [ïS·Ó ¥0›¾߈™Á§ÔΙ¶ăˆŸ;ù×¹¾«‡“Íj߈ÙYé1ÿÚßƯ—¶¼€øæ©Ó™‰kß [ïS×¾ÁƯ߈ư­íÛË̉³z›¾ăˆŸ;½ÿÇÁùê°»¦Ơï½ăï»ƠXé“È™‡×Ơ¾ôéá=ÁÛÓ“‹ÇÁƯÇÖù×ßÁéÓ÷‡ƠĂÈ™‰kß [ïSưÀ¥Øƒ×±»—¿—̃Ù½ÿÚëöÅÓ9¥‡™‰kß [ïSù×ÔX•¡ÈÊÁÑÓç̃đ¹˜ ÙÚ½ÀĂÙ½™‰kß [ïS™‡½Û«‚ ½9ÅÓéØ©Ø°¿́v¯È­ÄéÓéêÓØ߈ÏÔÛÀÁ̉ÁƯ÷ÁŒ¾¹Ú½›¾¿£½€ß»û½ăˆŸ;À½‡Ç½½ù×êö™‰kß [ïSÁ‡é/×:·‡‘×8ç±»©¼¢Ç™‡Á̉Ï̉÷Ù÷Á¦ÓÏßË%¿½Ô±»¡ÛßÖŸÖ­Ä£ØÛÀÛÀ¿‰¶ÔÂÙÛ«‚ ½9ĐÄê½öÁ¹߈ßÁ¿ÅĽÏťءƯËÇ«Ô9¥‡ÓÁ·Ó ¥0•˜‰j̃ZîSÏ̉•ÜÁ½àÅôË̉½Û«‚ ½9¡ăˆŸ;˜êèäÏÔ·Ü«‡“Íj¯ÈỞø×½ÿ§¥Ö§¹›¾ơÔèêÏÔƠψ“ƠÙ½¶è·Åöëö–¾óÇ«·3uUº“Æ“¹ƯN‡Œ¹Ö¥Ưù×ø×™‰kß [ïŚÅ›½½€Û«‚ ½9›Úµ¡Ô‘±‡ÇăˆŸ;k9¥‡­Ö߈¹Ú±»¡Á‚v«‡“Íj§÷å5Ó›½‚vñ»¿‰¥%™Ô³ƠÏÔûíÆÚª‚ +¼9Ơ½רª‡’̀jù¿ëöíÅüg¶v¹Ú«dµØÍË)éÛ9¥ª‡’̀j‹ëưñ±»¡Á´Ă—ˆƒv±»£ØÁ¹ăàµaËDZ»ï»§ÓăˆŸÜ£9™Ó½€íÆóÇ™‰kß [ïSñÓ±»ĂÈ߈§¹²È•Ơ‡ºÛ«‚ ½9ñÓơĂ¾́«âơê¶ô£¨­Ä£ä¡Ô“Ơá ÏħԫÔưÁÛ«‚ ½9ÎÔ «‡“Íj¿‰χ߈ăˆŸ;ÙÚïÚ›¾ï³2ű̀æÚÏÔơÔƒvÛ«‚ ½9ùêµơê߈ÏÔÉ̉̃ÁíÖÛÀ±»íµØá›¾½ÔéºßÄÙºĂ É™‰kß [ïSëö ÛáÛÍ­Hèê÷Á¹Ú«·3uU¿‰å̉ ½ô‚ÖÚª‚ +¼9Û«‚ ½9ß»û¡Û÷å5Óă¶±»¥ºñÚ½ô×¾·Ø¶˜‰j̃ZîS«ÔÛ«‚ ½9ăˆŸ;›ÚÙ½ô£ØăˆŸ«»°»߈ÍË)éÛ9¥Û«‚ ½9½“ûƠ8¤‡«dÇĂơÔ½ăơ‹Å‹È0©&ăˆŸ;ßÄÙùêưÀ«‡“ÍjñÓÁ½¡ØÁ¼·ÔéÚ³ÇÖ·ÔøêçÚÿ‡ۋÇßÁ±»«·3uUđ9¥‡̃ˆ™‰kß [ïSëöߌÛ,©Ø¢äÛ«‚ ½9ÿ§ÿÛ߈ÏÔÑĂ¥ˆ]1£äưÀ·Ô«‡“Íjáêù×8¤‡×ëö˜‰ j ̃    Z îS œÁ ÓÆ©‡¥2ßëMÑÓ߈½ÛÔáÄưÀöÏÔĂÈñ»íÚ—ˆÁËÙŒë*«ØŸÅƒ«‡“ÍjÁƯåĂûØ¿‰É̉‰ÔơÔ¹´ÓÅË¿ĂÙƒv«‡“Íj¿‰߈Ă(³»ÿÚăˆŸß„¸Å‰Á‡é/×:ă½ÏÅù×ÍÓëöôĂưÀÛ«‚ ½9«·3uU÷Ú¿ºÍǨ¼ÏÅûƠ¶ÔÙ½ù׫%‹Ç½—ˆ¿ƒvÇÜùêÛ«‚ ½9éÖ«ÓƒvëöñÚÎÔù×ó#·Ô™‰kß [ïSÙÜ߈“ºÔÛ«‚ ½9¶߈Û«‚ ½9Û«‚ ½9ÅÁ±»ºÏÔ9¥‡¥Óßơ…àåôö©¼%™Ó˜êèä«Û´Èé™߈Ö¾8¯È±ëö×™ơÔăˆŸËÇ«äÙÚ¿¹ơĂÁƯöÁ¦Æ9¥‡ăËåׄnçô퇪¶2tTëö™ôƒˆ©‡¥2ßëMâḈ·Øív³ßá×Úß¡ÈëÓ›Á÷ÔẠ̊¶öÔߌÛ,ô±»߈°½™‡å̉ —»‘Æ̣Ô Ëû«ÔÆÛ±»ù¿¡ÁơÔơÔï˜êè䛉ÑÓ×¾£äƒ¨·‡‘×8竇“ÍjôêưÁå̉ ±»ÅÔÏÅưÚ½ù×ÏÅÇâûØ“¹ƯN­¾÷ÁÏÔ÷Ú¹Úù×›¾½ôƒÖ¹Ú©‡¥2ßëMù×·‡‘×8çù׿‰μ“ƠÎÅäÁăĂ3߈©ÇÛ×Ï̉9¥‡×¡ÔׯÛ«‚ ½9Ûû…߈çÚ˜êè䙉kß [ïSÛ«‚ ½9‰¼“ƠÿÚ¶·‡‘×8ç¹Ú¾µØÛùקƺ“ƇÇÎ̉½ç®…ÇŸÅÖ¾¥ˆ]1‹ÇÙÚ‡½÷ÙÏÔ¹Ơ”» ¿»óǽԫ‡“ÍjÏŧ¹½±»ÉĂͼ·ÔăÇíëö©ơ©‡¥2ßëMÇ"¯¼›¾щñÓơèÅ™ÔßÚ¥ˆ]1û +çÂéºư‡±ù1¨À¡Ô­ÖÏÔư³ŸÖŸÅׯø¾ºÅØívù×éºÛ«‚ ½9ăˆŸ;›¾«Ô˜‡÷ÁÏ̉ŸÖ₫ÂÍƠĂĂƒ½™‰kß [ïSùׇ“¼ơêº¤Ă±‚µaÙ½û«‡“Íj¤ˆ\0µØèô߈íÖë±×Ơ†7§jº½ɇê}ÛÜ߈Ë¿¹ÚưÜéÚù¿ÙÜƠ'9¥‡ÛÏÅ߈±»™‡«ÛרÏÔ§ô¡Çơê«»£Xë‰ï»çˇÛç̉’ăˆŸ;©¼‚ +ÓØ¹Ú›¾÷ÙçÚÍË)éÛ9¥™®—ÓƠôơêï³2­ÄƠÁ±»…Ø·ÅÛ«‚ ½9̃ˆׯ¿‰©‡¥2ßëM±ëØÍÄÏÅôê߈Û«‚ ½9ù×ù×¹ÈàÀ ‘Æ9¥‡ƒvăˆŸÏÅñÓÖ¾¼%°¿±»÷å5Ó‹ÇíØ±»¿ÓÍÓăơÓ°£Çí¨‚vÅ«‡“Íjö™ëé嘉j̃ZîS“ÈơềÊ)èÛ8¤ëöÙÚª‡’̀jË¿µØđÁ¿‰±¿Û«‚ ½9ÿ¯¶ƒ½ÏÔ‰Ûéê¡»™Ó¹Úѹï»™‰kß [ïS½—»ÑÔÓ5“gesÁÅÍÂăˆŸ;Û«‚ ½9Ñó§ÆÙÚ™‡©ºñÚ½¾©Ø­vơºç̉ưÀ«‡“Íj¥ÓĂÈñÆá¼Ơ߈«‡“Íj™ơ߈ă»´ÅđƇ,à ¥Øâˆ›¾̃Ư₫œĐßÖ›¾£»¿‰âˆ߈ÍƠ³(§ÆƠ‡ŒÛ«‚ ½9ßÄك˪‡’̀jÙ«‡“Íj‰À÷‡÷‡“ß—¶©ÇÑÅ÷ÁÛ«‚ ½9å̉ •îËÜưÁÅÜÛ«‚ ½9Û«‚ ½9Ž©º±»ơĂósƒÚ¾ăˆŸ™‰kß [ïS±»›¾ơ˹½·È½« ©ƒ»5Ë£ăơß»ûŸ}ôøàÂÈÛˆ߈óÇÑÓ¯ÈĂ˜êèäÑÓ‰Ôçß„éÚÏű»ĂĂ ›­±àéMËƠ÷Ú°»ï¶ï‡ÏÔÙ×çÚŽˆ;³z̀ĂÿÚ·§D ¨Èï»×̉ù×ûÙÏÔ™÷™‡‹Çؽ ùêóÂñÙù×„Ö €Ä±»ר¡Ûù׫щÁÛ«‚ ½9‰¿IéÓµ½—¶¡Á£Ç›¹‡xÏÔßÄÙ—ˆ‹Ó°»9¥‡Û«‚ ½9ñÚ€ºüµ™‰kß [ïS༢LJ›éÅäÁ‰Ô‡ØÏÔù×…»·Ô©¼‚vûµaçÚÅÔÏÅ›¾ăàË̉“¹ƯNù×±»½°¿†­ÄëöÛ«‚ ½9…ÿ¯¶̀­‚ѶƒàÑÓăºª¼€ºĂÙ°»߈ă½½ñ·‡‘×8çÑӃϙ́ÙÚÙ½™‰kß [ïS«‡“ÍjÏÔß»ûÑÓáệ"3±»¡Á߈·Ô±»›¶éÏÄ߈ª»ÍÄ»™Ô½̉ƒv»‡¯È¾èê÷ áê›¾ăˆŸ9¥‡%—øĂâˆ:µØÈĂ»Ø‚«ÔƠ±»ăˆŸ;ÏÔÿ³äﻇ߈½ÏÔ₫®¶…ŒÛÀÛÄÓºƒˆăà»|°ÁÏÅÑÄë¸Ú“0щ…Å»­­…̀½Û«‚ ½99¥‡±‡Û«‚ ½9˜‰j̃ZîSăˆŸ;Û«‚ ½9¥ˆ]1ßëÓ½ÍĂƠ÷ˆ̣Ä…Ơ߈ÓhËÉ9ơĂ™‹Ç"ƒØ̃ˆƠÁ£ä“ÆœÛ ›v©Ç«‡“Íjµv× £Ô½Ü™‡½€Û«‚ ½9—Ó¨¼ï³2ÅÓÿ¯¶±»éê9¥‡Í£ó.…Ơ»ˆ8¤‡×ËƠü‡°ø1­Ä±»™Øëöß»û¡ÁÁ̉™ÓµØ߈9¥‡±»Ù-™‰kß [ïS₫®¶¨¼áƯíÖ߈íê¿‰ăˆŸ£ÇÏ¿ö¡Èù×ß»û½Ô¡‡¿‰›¶é¨À¹ÚÁĂù?ù×߈ÏÁ̃ßσØç̃«‡“Íj¹Úù×ẳºÔé‰ñ5ñ·ó»‘Û±»™‰kß [ïS9¥‡›vƯÚ·ÔºÎÅ‹ÙĐÄê—὇ŒúÚ—¶ơĂÅı»¹Ú¸Ơù¾®GøÛ«‚ ½9öÁáêÙÅëăˆŸ;¼»Á߈·‡‘×8ç…»ËÖơÔ¥ˆ]1ÏÔÅØ¯×ÙÚ¸Ú±»₫®¶¿­€ù×ëöÇØíưÀùºëöß»û߈ÿ¯¶ơÔÁăÁÍ­ƒvÛ«‚ ½9ﻣ»¿́çÀ½µØ§ô™‰kß [ïS³Âƒ¾‘ÅÔ߈½ñÓù¾¯¼ív—¶ù×9¥‡½¿ƠËÜ€^ÿÂß»û§ÓöÍÄÇÖơêßÚ½Ôơ꽃vëöŽ%›·Ô½Ôº½™‡½߈½Á·û™Ăù×™‰kß [ïS°»₫§–ˆÚÇù×çÚö˜‰j̃ZîS¹̃³ÜÓ£Æù‰ÀƯƠÔơĂ׾ɿº™‡Ù½ÏÅÂ9¥‡ăˆŸÏ̉‹Ç§ÓÏÄ™ôơ»±»¹ÁóÔéêÿ»ÁîD˹™ÔÏÔĂÙëö¹ÚÛº߈¡Øר›¾߈ù׳ºóơÔÀĂ¡ÇÏÅ›¾¡ÁưÀ©Ó¦Ó­ÄÑ·½€ĂÙ™ëéåÅÛ«‚ ½9ºưÀÁ̉‡º™‰kß [ïSÖ +Ô† +6 +¦j +µØµÛ½Ô–¶©Ơç̉‹Ó–åå¦å̀»åå¿ß¡ơêăớvƒv÷ˆç½·Åß»û±»Û«‚ ½9÷ÚÛ«‚ ½9¿ÅÇÖăÁ©¼÷‡Û«‚ ½9ù×ö·‡‘×8çöƯ»”‹œHÛêñăˆŸ;íơ÷å5ÓăˆŸÛ«‚ ½9ÑØ«‡“Íjß»ûÏű»ăˆŸăơÛ«‚ ½95ăˆŸ;«‡“Íj•×ĂÈÛ«‚ ½9ÙÚ±»ö±»›¾ƒvƠÛ«‚ ½9°»ÙϼơØĐÓÅØ‡́Åáÿ×ó|ˆƠá «ỘÄá ăˆŸÅ×ڃƵù×ôêׯ›¶éÜÓ ƒÖ—¶Û«‚ ½9“ȸ£óÓÀ̉‡xÛ̀½±»©ØĂĂ¡Á«Ûó¶ÅØéÓ©¼Ù×±»îÚ¥ˆ]1å̉ ­Ä»¥éÅÁÇ ăà‹Ç™‡«‡“Íj«‡“Íjäôù×ăˆŸ‡º߈ù׉¿I᛾ÏÅ­ÄëöºôÔ‰¾±»ưÀÙ½Ç%ăˆŸ߈â¼ÁĂŽ¢!™‰kß [ïSÚÆù×ĂĂ ›­±àéMÍƠ°)»éÓ‹Á߈²Èƒ›‡߈…ȃv¢ÇïÚÅ–±»¿‰Úª‚ +¼9ÏÔÅ»̀Ê)èÛ8¤±¿̀ÓÏŵ.¥ÙåĂƠÄ·‡‘×8盾«Ô¸Ú釨¼ôïº÷ÁëöÁ½½¡ÈÚª‚ +¼9»±»ù×ÅôŸßéºÁĂƒv›¾éÚ™‰kß [ïS«×«‡“Íjë„·‡‘×8瘉j̃ZîS¡Á‘ÖÓ´å̉ “ÆơêÛ«‚ ½9¥ÆăàÙ½÷ˆ±»¯ÔäôñÓ§ôÏÅ™Óùו·Ü·‡‘×8ç·ÔË¿™‰kß [ïSù¾ø× ÄÄ÷ÁÓÆ}±̉‹Çư¾ͽÀ¼±»ÁâˆÅÓëöÛÚơ$8¤‡…ƠŸ}ù߃v¼ôªÚù¿ƒv×ÛÙ½§Ô—¶¡ÛÙ×ׯ¿‰‘ƺ߈·ÅƒvåµÛÀ÷ÁÛ«‚ ½9Ú×±»çÚº‹ÜƒvĂÙ™‹ÅÔ‚v›¾ƯÓ ÏÔ‚Ñ…¿Åƒ×§ÓÿÚßÁôêÙŒë*«¥ØÛ«‚ ½9™×‹Ü«ÔÏßÏÔ±¾ưÀ«·3uUƒÔ9¥‡ơ$ĂÈ©ˆñÚÏÔËÉ9™‰kß [ïSĂÑÓ‰yµ†ÙŒë*«ñÖăˆŸ;±»ϼ¿‰™‰kß [ïS¡Ûß»ûăˆŸÉÖ¿¹ï»Åà÷ +Å–ƒï½½ù×Ă¿ÅÏÔ›¡§ÏÅÏÅ™‡“È©Ơ·Å«‡“ÍjϺƒˆ«‡“Íj«²¹ơØáóÏÔ¥ˆ]1÷ÁïÚÛ«‚ ½9ÿÚù׉¡—¾Û«‚ ½9ơ‹Û›¶éëö¸Úº©Óíêß»û«‡“Íj™‰kß [ïSö½ÿ¯¶Ù½̣ÄúĂí‡ăˆŸ;±»Ïź½ƒvÅÔưÀ߈ùק雾ñÆÙ½¾ºɹßÄÙ©Ó­Ä«‡“Íj¯‰¯0ÏP¦ôG½¹ëö¹ÚÿÔÅÓ™´™Á«â»Ø“DZ»‡Œ™‡ÑÓ›¾̣ÂöÛ«‚ ½9ËÈ9룉߈8¤‡Å×"Ž…ôóÔơ꫇“ÍjẅƠ…öÛ«‚ ½9Ù½›¹Ë%ÅØ‹ÇñƬô€ºº­Ä£Ç—ÖîƯ½ơê…Ơﻘ‰j̃ZîSá Ổ³ö›¶ééÓ×¾¶Ô³ºó³à‹È·ÔÏÔÁù×ÅÙÁÓĂ¾ÙÚëöµØ˜‡ù×ëöÑĂáƠ”½÷Ú°»¹µØ³íêÛºÏÔÏÅöÍĂ“º§Ó³‹ß„ÏÅÛÄÓÛ«‚ ½9™‰kß [ïS­ôµê¡Èăɹ¹Ø½̀Ó·‡‘×8ç̃ˆù×½±»«Œå̉ ™‰kß [ïS«‡“ÍjĂ9¥‡ÓØ¥ÆÏ̉©-ĂđÉ̉±»³‡ñ5ï»ÿÚ÷Áëö«‡“Íj±»ơê÷4ÁÓ‡Úăà§Ơ±»¹ÚÙ½Úº +ƯÓ ûÓä̉…Ơ©¼¯×ÛçÚÿ¯¶Û×÷Áùê…Ö™‰kß [ïSé€à=½©ÇăˆŸ;ƒˆë´½èº—»¶ëöív»ØÁơêï½ÏÅơꙉkß [ïS“È8¤‡ÖÏ̉—¶¹Úå‡·Ó ¥0ƠºmÁ«‡“ÍjÎÔK«»ÍĂÑøÛ«‚ ½9›‰Ûư»™Á±½ÍË)éÛ9¥ßÄÙÛ«‚ ½9Ơºm¿ôƒØ±»½ß–±»÷‡§ô£äÛ«‚ ½9áê½Ë̉ÑÓ›¾ùׯÛăˆŸ;™‰kß [ïSĂÙăˆŸ;kơê™Ó×¾¨ĂÏ̉–Á +ù×߃½ÏẠ̊.ÏÅ«»ïù×ÿÚϺơê߈ÅÔ³ÇßÄÙăˆŸ;kßÚ̃ˆÙ½ñÖÑ+§Ơ¯ÈÏÅÛ«‚ ½9ÁƯƒˆÍ±ëعÚëö°¿ù×Úª‚ +¼9Û«‚ ½9…֓ȃ¾‘öàÅØĂÈëößÁơêưÀ›¶é‹ÓÙ½íÚƒvơÔÛ«‚ ½9ăˆŸù×Ñӻū‡“ÍjÛˆ÷ÁăˆŸ;ËÇä¼ôêÛǯ×߈Ể‡¿’ÆŸ̉ĂÙÛ«‚ ½9Û«‚ ½9çÚù×ï½ăˆŸăÁµa8¤‡‹ÜưºÏÅá¾đÓá‘5ÿ¯¶ĂÙ­Öª» ø× ƠºmÏ̉±»ÿÚó¶ù׫ºë`߈ÅÓå̉ ívăˆŸÛ«‚ ½9¿¹Á½ÜÀ!ÎÚ½߈‡ù©Ø™‰kß [ïSÓÅÓÛÀ–Á±¿¹¶ƒv¯G‹ø±¿åŒ¿N«äó¹“ƠÑ¥ÍƠÏ̉ºy©›¾ưÀ·Öù¿«Ó퇽Ü߈Ơ¡Èÿ¯¶ÍƠÛ«‚ ½9¥‰ÍL…ï½±»߈«‡“ÍjËÇóÇÙ×Û«‚ ½9Îů’›¾‰Û¿ÅăˆŸ‚vµØÛÚ›Ụ́ƒå×Ơ«‡“Íj‚v©ºçô¯¼µØ×$Æ̉û¹µÛơêøê÷ˆ¿‰«‡“ÍjŸ¿í—GĂÙ߈¹̣dzØϺÛ«‚ ½9˜×ß»ûñÓ‡›¹‘ÈëöÙÅë«Ô‡¿®‰®0êö³–‚Øñı»º‚vÛ«‚ ½9çÚÏÔÁĂưÀĂĂưÀ«‡“Íjù×êö…ÛÛ«‚ ½9Å–µØÙÅëIºü¦†êÔ°»•Œ½¯¼Û×™‰kß [ïSÉÏÛ«‚ ½9ßơÛ«‚ ½9±»ÏÔÙŒë*«ô“ÆÙÚÿ¯¶߈ñÓƠºmßÚ…½º³Ơ³Ơ™‰kß [ïS½ÁíÿÚÛ×ÓÜ‘ÖßÖ騭ÄHïiñÓ›ÛöÛ×ñÚ©¼Ü”î ܽ™‰kß [ïSÏÔÙŒë*«‹É0«‡“Íj«‡“ÍjµÁ‡xơê»ÓăˆŸ;kæÚï»çÚóÔ½Ơħș‰kß [ïS¼Ô߈©¼ơê߈—¾·‡‘×8ç߈½©¼ÏÔ9¥‡×Ư°ÏÔ½ÑÓá ¡Á™ÓÛ«‚ ½9óÂǼ©ÓÍåÙ½éºé°»÷ơ½€ÙÚ«‡“Íjƒˆ¹Ú½˜Á°½ăˆŸ;k™‰kß [ïSëöçôˆÁÙùêơêÓÔơê×ƠĐÓÙ½Ú†ŒƯÓ ĂÙ·Ô›‰·Å÷ÁùôóÇ££ï½‚ù×ß»ûºƒÖăˆŸ;ñÙÁƯ±»¿ß›¾ù×¶Ö¸ÚơĂ‹Ç—Ó¿ß½½›¶é߈˜‰j̃ZîS¿‰›¾°»˜‡ù×·‡‘×8çÏÔ«äö³Ơ©Ó·Ó ¥0ÓØ߈ù×Ưº‹Èƒv¹ÚË̉ơÔ™‰kß [ïS›¾¾ù×¶èÛ«‚ ½9Ăºù×ùƯ—Óù×±»™‰kß [ïS߈•{ÍÄù×ÏÔ«‡“Íj߈ù×¹Ú½¹)ƒÖ߈ƒvù׬Ä.º9¥‡¾¿“‡äÙ½—Œ߈ơêóÂÆØ¦ôƘÔﻡ»«·3uU­Ø»ôăˆŸù×Û«‚ ½9›¾éÓƠºm߈ŸĂÙÅØ™‡—»¶èÙƠù×¼ÖÔ†6¦jöĂÙóÂרË̉µØ‰Ï™‰kß [ïSơÔ¡È߈±»±»½Üëö9¥‡ùê³Â×Ơ±»›¾ơÔ¥ˆ]1·ÅñÓĂÖÓºÂƠ÷Ô—¶·¼Í7ÔăÇíͼơêÿ÷¾Ïß߈›¾߈ÑÄ멾ăơ„n͹ڃv—ÓÀĂĐÄêÛ«‚ ½9߈ÙÚƒÖ½óÇÁ̉ÏÔĂĂ ›­±àéMÓØ¬¾ăÚëöÎÅ +ÅÄ™‡»ØËÇ™ôưÀ‰Û¹̃Ăù×¹ÚÏꇺ™‡ßÚ߈…~ÏÔ³Ơ›¾ưs½₫ÚĂÎøæ …»›¶éÙÚ½‰Üè˜êèäơÔ÷Á½¨Ø +ÔX™»ëö…öÜ¥ÈÏÔôêÜƠX‰¿I÷ÁỞ¼€©‡¥2ßëMÅÏÅ…Ú¿́Ñ@9¥‡¿ ±½¥ÙĂºÖ¾8¶èÏÅ”Èú‹ñÎ̉%Û«‚ ½9‰ßªÚơêùשđÙÚÿÚ߈¼ô˜‰j̃ZîS—¾9¥‡×ù×ăơ߈íÚ¬Ù°»ÁĂ™‰kß [ïSÍ­H”»«‡“ÍjÛד¡Ûÿ¯¶Á¹Ûºơ…µØ³ÆÑÄëÏԣǗˆ₫®¶«‡“ÍjŸÁ½¾ÿÚÏÔ½€ï½™‰kß [ïS”»êăˆŸ;ăˆŸ‰ÛËƠ™‰kß [ïS» ÅÔç¯éăˆŸ;™‰kß [ïSÛ«‚ ½9¿ß„'‡“Íj™Óéӵؗ¾µÏù×ù×Ơ±»ÎÄ×ÜÅÔµôÑĂƒå™ëéåïäĐÄêÓØ½Û«‚ ½9½ƒÔñÄÙÚÏÔÍƠϹơÔ…bóÇßÄÙ±¿Ñ+µÜï³2ψ퇤ØÏ̉‡‰½̉ÁÛ×ÇáÄ™‡Ë¿êÓăˆŸ;å̉ µa«‡“ÍjÏÔåáÇÖëöă»߈ÁăơÔù×ëö°»¨¼̃Œ Ú,÷ÙơĂâ·ú¾‚v¹Ú¯HÜ +¡»ăˆŸ±»Óº°¿ă0«‡“Íj¿ßù×±¿ë̉±¿ăêÏÔëöí—G¼¶³Â±»÷Áëö‡“躉ÛÅĂ›¹éß™àóǽ۫‚ ½9³ØœÁ߈ÿÛ¾›¾ƒvûØ̃ˆ™‡çôăˆŸ;«Ôƒv—»ËÉ9߈ăơ× ĐĂپ߹Ú̉ÅшçÚ¼%ăˆŸǼϼçôÿ§ӓȽ€Ê¿§Ø§ºƒÖăˆŸ™‡߈ëö̃ˆËƠßå̉ ÑÓ³ÆÏÅ¥ˆ]1ó¶Û«‚ ½9Ú×§¤Û8¤‡ÖÛ«‚ ½9¡ÔƒÔ½ë9¥‡˜‰j̃ZîSÄô¸óÏÔ8¤‡˜‰j̃ZîSÉôóǹÚÁĂ­Ö™‰kß [ïSÿÇëŽǻƯ‰ưÀÎÅï³2ÏÅ«‡“ÍjÜÓ ù×Û×éêƒÚ‡ïăˆŸ;ÎỖˆ±»âàßÄÙ‚Ö̀º ÿ¯¶̉Ƥ‰̀L„å̉  ƠÍË)éÛ9¥×Ơ±)­Ö—¾ưÀ³z»ôǘ«È«‡“ÍjĂº·ô©Ø±ëØưÀơÔƒvŸ°Ó̉›¡„à½àƒvù×ïÚ́Å·‹«‡“Íj³÷ÁÙ̉ù×ÿ¯¶ÏÅå̉ ¡È“Æ߈¡ÔƠÓÙĂ×Ú™ëéå×¾ È9¥‡ˆŽç—¶¤Æƒv‹Óïô¿çñ¹™ ßÚ«‡“Íj‰¿IÚª‚ +¼9±¿ö¢»‹Ù·#‹ÓĂÈ™‰kß [ïSÏÔ½ăˆŸĂÙÁ¹ó‡Njۙ‡­ÖÙÚÏÔºô´†×ăơă­Úëö9¥‡ÙÚ߈9¥‡×›¶éæ¶v ÏřحԓƠ™‰kß [ïSăˆŸ½Û«‚ ½9ù¿¡Û±»ï½ËDZ»ƒvÙÚ8¤‡Žö“Ñù뙇ßÖ³ú=öÁî½Úª‚ +¼9Ơ€½†ÇßÚÁƯÅĂăˆỴ̈ÇŸÅ™‰kß [ïSÏ̉ÑĂñÓăˆŸ¤ˆ\0ÙÚ¿ôơÔº«‡“Íj½øê9øê·‡‘×8çÛÔ–¶ÍĂ›ŒưṂʇíK߈̃ˆ‹È߈€ÓăˆŸ;k¯ƒßͯ¥'=U#QK¯ÂµØÙÚêÚ˜êèäëö±‡ÎŽÔù°µØ“½“ȳĩ‡¥2ßëM½¡Á½îרăˆŸ;k¬Å«‡“Íjëöù×½€ùꙇá=™ĂÛ«‚ ½9ÜßÁ˜ÇÛÿ¯¶Ù×µØßÁăˆŸ«·3uU‡ŒơêóỖăˆŸÏŰêØÛ«‚ ½9ơê₫®¶ÏÅÁĂÓØÿÚ纩¼Û«‚ ½9Úª‚ +¼9¿‰«‡“Íj‡¡ÔË̉³×±¿½€߈‡ŒÛ«‚ ½9§Ø߈ƒvÙÚ™‡¥È‹½ăˆŸ©¼·‡‘×8çèêëöÙëö«·3uU‡ÛÏÄA·‹Üơİ¿× ăˆŸ;ßÖñÚơê±»ăˆŸ;«Ôå̉ ±́ơû…ÛÛ«‚ ½9ơăàíÆà¬øÍÑñ»™ÔؽßÛÙŒë*«ÎÔÎ̉̀Ó Ë=Á½¹Áª»ÿ¯¶ÏăˆŸ;¤Ç†Œ¾ù¾Yøê±»ÇØ©ÇƠëöcưÁ±¿ÖÔ†6¦jÿÔÙÚÛÄÓívßÛ×ă¶™‰kß [ïSÙ½ƒÔÏÔ½ÍÀÙÍ©ƠÎÔăà±»«Ô…ƠƠçÀơêÑĂơĂÁƯ‡˜êèäÛ×£ơƒvåĂƠ³ÇÁĂ©º9¥‡±»ăê®ÈĂÍË)éÛ9¥Ž—¾ëö…»‹ÜỞÛ«‚ ½9á ˜‰j̃ZîSáêëö½Å»ù×ËÉ9Ïʉj̃ZîS‡x™‡á¬ùăˆŸ;ÛÄÓ¡ÔøêÅ»×¾ÇÖÛ«‚ ½9±‡«‡“ÍjÙ½½ù×™‰kß [ïSÇÖá ăˆŸ;›¾ÑÄëéÜļ*º߈«‡“ÍjĂºÏ̉ÛˆµØ9¥‡—¶ñÚÆ̉ׯ×Ó™‰kß [ïS™ª» Úª‚ +¼9󸾛·Ôëöo­7ù׺ÓăˆŸ;¿‰߈óÂÏăå™ÔgăˆŸ;‚Ô¨‡¤2€̃êL߈ÓƯÓ ̉ºåĂ”ÿÁ¾¨¼†s¥ˆ]1§ÓÅ–©¼ĂÙÏÔ¶èÚÆ«d«‡“Íjăà±»ơºåÁÜÂƠÅ߈·‡‘×8癉kß [ïSƒ­ÖĂ¡©¼ͽÙY¥âÁ‡é/×:ŸĂ™‰kß [ïSÑ·«‡“ÍjÛ«‚ ½9½ÑÄëùêÍÓÂÙƒà»ÁÏų½ǽ«ÓơêÍөܵØ\«‡“Íj­Ö߈ƒ¾‘¼™‰kß [ïS°»—»çô·Åƒvù×ÑØÙÚÙÚóÔÁX»½«‡“Íj«ÚÈÛ«‚ ½9óƒvÑÓĂ¼¾º½€óÂÍBăˆŸÂĂ™‰kß [ïSù×±»Ïăà³ï½ϼÏÅƯÂÿ×Óă‘·÷ÂăˆŸ;áêÅ Í́ùÏÅÔX»½ÛºÓøÇÖ¯¼§ÔÅØƒà…äÿ‘ơ¹ÚÁĂ9¥‡×ăˆŸ»Óëöª‡ ’ ̀j ÉĂëö¹ÚÑá£Ư©ØÎ̉ª»ÑÓÛ€îD× ¡È•™‰kß [ïSׯÂè‹ÇÍË)éÛ9¥¶Üóg½ĂÑÓ™àÅØ‚«Ô™‰kß [ïS·‡‘×8ç¹ÁÁ¾ÊÖƠؘ‰j̃ZîS±ëØ÷Ú¾ƠÅÏÔÏÄ«‡“Íj¤‹ÇơăvơŲÂÛ«‚ ½9ÏÔâˆ:£‡ÛºăˆŸ;kÁĂ߈ÅÓăơ³×‹Û߈±»µØ߈ÏÅÏÔëöăˆŸ;ăˆŸ;߈«‡“Íj‰¿IÏ¿¯È—¶ßÏ“ƠÅØÅÓ̉º°»¾ñÚ«ÚöÁ© ø×÷¼¹̃£‡•×™ëé噉kß [ïS«‡“Íjƒ×ˆÙ×߈ï'Û«‚ ½9ßÖÏÔûØ«‡“Íj±»Û«‚ ½9ÏÄưÀëö߈±¿ăˆŸ;ûç…ÖÿÂù¿óÔ߈߈Ûˆ›¾ĂĂ ›­±àéMËÓÜù×ÅÓ™‰kß [ïSÏÅ™Áß»ûóÂÛ«‚ ½9›¾«Ó·Ôµ†ăˆŸª¶2tT™‰kß [ïSÿ¯¶ù××Ơ‡x«Ôø(Û«‚ ½9à=ơêÙÜưÀ§ØÖâˆ:ơÔÛתd¾™ÔÅ¡Áï»Ñ؉¿I™‡´‰ă½ƠÂĂ¹ó³È±»ÛÍƠ9¥‡´¡9¥‡±»לëö¾ƒˆ¿ßÛ«‚ ½9Û×Ù½¬Äéễ„«Ñ³å›¾ơÄăơ½‚¾ùå×ßă»½ɪ²ÜÙ̉›¾¹Úå̉ Ï̉±¿ß»ûëÚËÉ9ØÓÓ‡Ûơ꤈\0ÿ¯¶Û×÷ÔÜïØ€ƠáÓ™‰kß [ïS›¾çôûÙù×™‰kß [ïS™‰kß [ïS•é ó3¾£ÇÍÓÿ‡°ºơêźͼ¸Úơê§ØâºƠׇﱻ½¼÷Ú‘ü«‡“Íjµ†‚ơê9¥‡ó±»ưÀăÁ‘ơå̉ ±»¶ÅÛÇ™‰kß [ïSă­§Ô›¶é“Ơ©Ó߈ÓØ“¼ĂÙ×¾Ó¨¡È™‰kß [ïS™‰kß [ïS¬ô‡xå̉ ¾º›îÙÚg̃ÄØÛ«‚ ½9­¿«‡“Íjô‡Ç߈íÆ¨¼çáÂ# +ÿÂÓˆ•=‘áëïÏ̉‡¶ÈÚª‚ +¼9¹¼©́Ú(ëöøêëö³Èëă»ưÇÖ•'£íóÂÓ̉ËƠ™‰kß [ïS«‡“ÍjùêÁ̉Ưº±»߈˜‰j̃ZîS·‡‘×8çóǾºÛ«‚ ½9¥Ư“ƠëöçÚŸå9¥‡×ư¯£»Û«‚ ½9ăº÷ä5̉ßÄÙ»Á‹Ç¡Ô‰Ô߈½¿Å£ØÛ«‚ ½9øêóÔ½ж¿º˜êèäôÛºèוŒăˆŸ;₫ÅôăˆŸ;‡“߈¥‰ÍL…ÇÖĂÙÓØÖ¾É Ă¶æê¨¿àÛÏÔ«ÔÑÓ¢»óÇÛ«‚ ½9ñ¹Úø¿Ççº÷‡±»¯È©‡¥2ßëM½¾‡·‡‘×8çÖĂĂ߈°Á3êö«‡“ÍjؽÚÂÖ¾ Ơ‰Ûá Úé±»Åா g̣ÔÑĂÜÓ ½Á™‰kß [ïSé½ñÚ™ÁĂÈ‘é‰ñ5ñ·gëöù×±»—»%ÓØ›wŸê”µØÛ«‚ ½9̃ÁÊÅô—¶ëö¯¾™‰kß [ïS™ồĂ‚ 9¥‡×ĂÙÇ"«‡“Íj™ØÛĂÙ±¿g½«‡“ÍjÅÓÛ׋ÇëöĂưÀÏÔÓ뼇ºêö™‰kß [ïSïÅ•}ÏÔ¸Ú +¹Ú°»χÁ¾é؃֪ڱ»µ‰ÎÔéÓ¸Ö½Ô°»ử±»ÏÔ™Á¡Ơơê°»߈ăơ³¨÷‡ˆ§Æ°½µ†ív߈ƒˆ׿ù×ù×ù×ÈưÀÁÑÓöƒ=Ûº±»ÏѾ‘÷Úº×Ú©‡¥2ßëMªĐÇÖ½€ÍÓ̃ˆ›¾ÂĂÙáêöÎÔÁÛƒv Ơº§ÓÑDù×Û׉Ôù+«·3uUăˆŸ¢ÁĂº»²߈á=ùưÀÅÔíÆ´ÜưÀ‹ÇñÄåơĂĂ«»Ư‰½Ô±½ĂÙ釓ƠÛ«‚ ½9ËÇçÚëö©ÓÏÅÑÓ™‰kß [ïS×Ơ₫ÑÅ£ØơÔÁƯù× Á¼½Ûº±»ñÚôﻛڵءƯ§Óó^óùëß„ÏÔ÷Áø× «‡“ÍjÁƯơê­½¼Æ´°Ô¿ôË¿Ÿ±¦ôÙÚ‹‘™Á%™‰kß [ïSÙÅëÑ·‘̃çØÓØ̀Ă÷‡Ơ«Ô麛ôùôù×ψϹÏÔûƠ»ç߈©&ÍĂŇŒ›¾ê×÷‡½ô³ºó›¾Û«‚ ½9å̉ Ù×G½¹ƒv¡Ơö“¹ƯN×ĂÙưÀ« ©ƒ»5Ù½º°êØÚª‚ +¼99¥‡ÍÓ÷Á±»ûƠÇ¡Á¹Ú·Ó ¥0Û÷Áƒˆ½›ṿÔÁ¹“ÛăơÍÄưÀù‰±¿¡Ûð½¦ÓÏÔÏ̉ÙÅëăàëöµØµÈµ†ăơăˆŸé‰ñ5ñ·ºÛˆ¶–œ‰¾I×¾g—ØƯÓ ø×ơèÅÍƠ±»ÓÅƠX̉ÅßÚÛ«‚ ½9ÙƠÑÄëÆÑÅù×™ëéåöÇè‚vר§ÓÍ­H9¥‡×ù嫇“ÍjÛ׋Ç‡8¤‡½Û«‚ ½9ÏÅׯ£Ç¡»ßÚáÓû¼áÛ¸ÚÓÆ¡ƠÛ«‚ ½9ÙŒë*«—»°»‘±«‡“Íj9¥‡Û«‚ ½9‰ÏÔăˆŸ;œÜ߈Û«‚ ½9çÚÏÅ•Ç׿8©Ó£äÛº¹Ú½µ†ưº¹Ú™‰kß [ïS¹Ú÷ˆ©½ăƠ¤‰̀L„Žö¨ÓêöÛ«‚ ½9ÓØÙâñíÈÇ%·Ó ¥0ưÓívùêƯÂơćŒ¶ɇëö“ƠƠ‡çÚÅçÚ·Ô‡ŒÂƠ–Ø“ƠßÖçôưÀë¼߈ÿ×ơćŒăˆŸ³’…Ơ­¾Ơºm߈ÏÔï»íêáêÓÚÀ½ÔĂÈăÁ§Öǽµ߈߈ä̉©‡¥2ßëMí̃Û«‚ ½9ơèÅ߈ß»û%ù×ơèÅ„ôóÂĂ «»¤½ëöéê׼ĨŨ©‡¥2ßëM₫®¶°»ÅÜù×ăˆŸ;kĂÙÛÍÏÔùê“ÆÛˆ©Ó™‰kß [ïS—ă½ù×ÏÔŽ†Œ'''ψÀ½³öÁß»ûÑÓ›¹×¾ƠXŽáêË̉ÙÚÔ‹Ü߈‰ơ½9¥‡«»±¿•å̉ ÛºƠ‚vÓØ«‡“ÍjÛ«‚ ½9‡ÇÙ½­¾ù×Û«‚ ½9øê‹Ü¯G‹øÅØ£ÈÇÖëÚÛ¾›¹¼ÑÀψÑÓ™‡ŒÓ ÑÓ§ÓÂà ưÆ•{íÖËƠ±»ñÚóÔ™©º‘©ßÚÅÓºßÙÛÀ9¥‡ÏÔö Á«»ôÏÔƠͶܽơÄÑÄëƠçÚÚ×ăˆŸ;Û«‚ ½9ăˆŸÏÅå̉ ÉÏË4­¼̃ˆÏ̉ùׇµØÅ»¹Ù½ĂÏħôñÓÚ½é̀Ó­ØæØÅØ›—ׯ߈Û«‚ ½9ñƽ廓È÷Á¢äƠX߈ñÖ•Èû›‡Œ­Äí&µÈåÁ³ôÅÔŸ±»·‡‘×8çÁĂ½ÁƯ¸Ú¹ÚÙ½ù׿‰Ä‘ŵaæÚØŒê*ªï»™‰kß [ïSù¿ïƠÚª‚ +¼9’¡È‡Œ±¿ëöÁ¹çÀù×Á\£Ø‘Ú·¼Í7£‡Û×ëÔäÖŽ×Ơ†7§j…̃ƒØÛ«‚ ½9¿àºăÁ¬ÖÏÅßÄÙ߈ưˆ’½¸àÚª‚ +¼9Ù̉ÈÿÚºÁ̉ɼ×¾ÙÚĽ»ÏÔ«‡“ÍjƯÓ Û«‚ ½9§—±¹ ›¡ÎơJƒĂ¥ĂưÀăˆŸ;k£ØơêÍƠö¶œèœ‡àêá¬ÓØщÁƯ·¬áéê«ÔûƠ±»¹ÚͼÛ«‚ ½9÷ˆÍƠăˆŸï»ăˆŸù׫Ôâˆ:¿ƒvëöñÓ©%߈™‰kß [ïS©¼…»ÿ¯¶“¹ƯN½Óˆ•=‘ÓƠëÓªÚ¿»ïÅăˆŸ;Ù×ºăˆŸ½ăˆŸ;ñÓ9¥‡±¿·Ôéêÿ¯¶«‡“Íjë…ÑÄëưÀỞ£Ø½øê½Ởß»ûeß–Û×áÓ·§D ÿÚ‡Ú™‰kß [ïS§‡9¥‡×Üëף䓹ƯNå‡ßÖÂ×ӿŶ˜‰j̃ZîSÊÖù×ÏÄ™‰kß [ïSǼ߈¾ÙÛ̉ºăˆŸ;¾(̉̉ùê߈˜‰j̃ZîSÛÀ·‡‘×8çû«‡“Íjƒv½ÍƠÇÖóÇ™‰kß [ïS¾ëƠUå̉ ÿÚ™‰kß [ïSù×¥Ûù¿­¾ŸÈËǵ†¬Ö«‡“ÍjÙ½ÅÔ£ØÙׇÛÖÆÏÅË%ăˆŸ½«‡“Íj™‡Á·Å¡ÔǽŸèªÚ ăˆŸ;·Ó ¥0¿çø×›·ÔµØơı»ÏÔ€ºÄ–·ÔÙÜÅÔëö³÷ÚÚª‚ +¼9…Û±»ËƠ÷Áơê°»™Ó¥ÆăˆŸá=×$›Ă™‰kß [ïSÑóÓØ̉Åù׃v¡»ôѶ«ÑƒvåĂÙÚ«‡“ÍjưÀƒˆ¹ÚăˆŸëö“Ơ§ÀÙܱ¡ßëöăˆŸ;ÿÂù–“È8¤‡×‰¿I™‡»ÁñÚ™Áëöñđ÷à³ÜßÖç'ÅnÙ½¥Æ«‡“Íjù×ơê߈Ú˜‰j̃ZîSÛ«‚ ½9ëöƒˆºÏÔ«‡“ÍjØ×߈‡º€º™Óư­½¨¼©ØÅØÑæÏÅÛÀÏÔăÇíĂÆù×ßÁó˜‡"«‡“ÍjßÚĂâ«ÔÛ«‚ ½9ƒv‹ÈăˆŸ;Ù½ñăˆŸëö™‰kß [ïS¹Ú™‰kß [ïS©¼ÓÓØÚ×úÙ÷$á=ï½Ơ¿º›¹Û«‚ ½9ÍƠÁ׃vÏÅ«»ăˆŸ•½ÏÅ›¾“Ơ÷‡Ù̉ÏūԫԙëéåºưÀËƠÓ¼½ÔăˆŸ«»œ‡—¥†ù×™‰kß [ïS±»™‰kß [ïS™‰kß [ïSöï½ƠúÙ÷Ô­ÖÿâåÍăà—¶ôç‹v¯¾ÙÚƒv½€êö£ØÏ̉Û«‚ ½9íÆỡ°»ưÀå̉ ½ô¥ÆÀ¼­å½™ÔẳÓÅ!ƯºÓù׎Åă´‡Œñ~ÏԵ؀º¡%«»öÁưÀ«‡“Íjß»û˜‰j̃ZîS“ÈༀÁƯÚù×ø×µÈ¾Å«‡“Íjăơ—¶ËÓÎÔÙÅ땽‡ÇÁ½Ë¿ƠŽ«ÓơỒÊ)èÛ8¤½Á½ ÔùæÅà½Ù̉«‡“Íj›¾™‰kß [ïS©Ó¹Ú°»×Ă—»¶‡Ö8æ‹Ç½€߈­)9¥‡¹ÁƒvÏÅÛ«‚ ½9¹ÚÁ‡é/×:ù×ÁÏÅêÔCÁƯôÏÔ½ÛÀö½ô¾«ñïƠÍƠÇÖơĂăˆŸóưÀù×ơèÅËÖÑÅÑÙ߈”ÖÆĂơèÅÁƯ߈í—GívưÀÏÅÏÄïÚ¹Úơ$¼ÔçÚY×¾™‹ÏÔ¹Ú†º–ˆ½߈ÏÔ…Ơ÷ÚǼ«‡“Íj­Öù×ÏÔÇ"¸Úº™ëéå¿Å«‡“ÍjËÇ™ÓỞƒvƠØ‹Á—¶Ç%߈₫®¶ËÇ©¼‡Œăơ‹Å9¥‡¿çƠX×Ơù×ăˆŸ¸Ú•Œ›¡©ÜÙÚ߈åI›¡Ó9¥‡ÖÁÜ©¾½Û×±ƯÏÔ­½¼£µÆưÀ©߈¿ôù‡™‡×¿8ũǦôîÚ¾ƒvÅ–‘Û«‡“ÍjÍÓ̉؃أț¾™‰kß [ïS½ù×ĂÙçô—¶‹Ç›ÛăˆŸ;ÛÀÍĐÏÅÛ«‚ ½9îº߈ø×«‡“ÍjèỤ́ăÁÊĂÚëÓ—»̀¼ÏÔ—¶½±Èă½«»ßÄÙÄÓÿ¯¶ăˆŸ;k»Óé꫇“ÍjăˆŸ;k«‡“ÍjëöÙÚƒ½«‡“Íj™‰kß [ïSăˆŸ;ß»ûëöÙÚ¿¹ƒ¾‘½‡ï³2±»ù×±»ơê·̣ÓØư“ÙÚó£ÇƠùæш½ÓƒÔơêƯÓ ÀĂÏÚÿÚëöËÓ»ºØÛ«‚ ½9ÙÜÄÓÓÆöáê¨Øû̉ϼÛ«‚ ½9×Ơ†7§jû¹Ơ߈ËÉ9¹Ú½«Ô½¿º±½Óº߈¬¿éÚ߈ÿ$ăˆŸ;àç±»á”Ù-߈¥ơêö¼€øê߈ăà˜‰j̃ZîS©Ó™ÉơÔöÁ«‡“ÍjÛÆ™ëéå­vƒvÓöäÁá ±¿±»Ÿ}ûÙ‰üôÙÁĂƒÖ±Á¡ÈÏÔÙÅ뤉̀L„¡Ô½‹ÙĂ¯àÎÔ™‰kß [ïSëöăˆŸÙ½Å–’È +»Øđ9¥‡Ùơº÷Úÿ×»Ó÷Á¡»™‰kß [ïS­¾‚ܽë—y—ÖơêµØÅÔÁĂ¼ĂÏŃv·Å™ÁßöÙ½Ơ¼±»ŸÈăê½ÔÙ½ÅƯáëöÓ­¾߈éJé‰Ó5“gesÁÅÿ¯¶Û«‚ ½9­ÂÛÀëöœÜ‹ÇóÔù×ñÖ­ÖóĂÍƠÁ½ưÀƒv8¤‡ Û•½ÏÅ߈ĂÙµØÍĂ߈µ¼ăàĂÙ½ù×éÔ­È̉ºơêơê…ôÛ«‚ ½9̀Ç߈ăˆŸ;†ä£Øơê±»‡ºĂ™‰kß [ïS8¤‡ỞÙ½±»±»±»¶ + +½€ôêÔñå̉ ¡ƠÛ«‚ ½9¡ÛéÍ—¶Ù½·ƯơÄÛ«‚ ½9Ž‹ÙƒˆÏ̉«»±»́ÁÙÚ€^ÅÓ‡ăËÉ9¿‰«‡“Íj™‰kß [ïS³‘º™‰kß [ïSçÚ·Üßf¸ÚëÚôÔ±»ÏÔ¾¹xÇ¿’«»‹ÜÛ«‚ ½9åôÅØ¥ÛưÀÏÅÑæ‘±ỠÁăˆŸÑĂå̉ ¯à9¥‡Ă9¥‡»Á÷‡½"Û׃óÇÏÔ÷ÁÔñÖ±½Û«‚ ½9ÏỖˆ±»߈“ÑØÏ̉ù냾‘¿ßö¼ûØ«‡“Íj¿‰¯È©‡¥2ßëMëö÷‡¼¸)»Âàív¯ƒßͯ¥'=U#QK¯Â’Æ™‰kß [ïSăˆŸ;ÜÓ ¢ÈÓØ߈¥åơê×¥ºÅÀ‡€è/Ö:ÄÔóǺ½ ₫Û­ơÍÓÏ̉Û×½û(÷Á‹Èù×ÅÏÔ˜‰j̃ZîSª‡’̀jÅ%‘Æ÷Úø×ù×½ƠÚÛ«‚ ½9«‡“Íj÷‡›¾ÓØÁ̉”È +ú + +ËÉ9•ÇÓÅ¿Øù¾Ûºá=ÁưÀƒˆá ư“çöív£Ô߈ëö¾‹Ü©‡¥2ßëM±»ËÇíÖƒvØÚÿÚù×Û«‚ ½9‘Æÿ¯¶‡ƒvÙÚƒÚ¾—»«‡“Íj±»Û«‚ ½9ÇÖ§Ơ–ˆÓÓ‹Èà°»™‰kß [ïSăÁ߈å̉ ߈½¿ôµØ‡Ç—»»Øùꙉkß [ïSϺ̣Ç«‡“Íj›·Ô¹àº5ĂÈưÀχ“µÛơêëö÷‡±»ºûÅåÁ¾ï½¥Û·Ó ¥0¥àơØÛÄÓÏÔÁÓĂÙ°»¾ëö‹~߈÷Ô˜‰ +j +̃ + + + +Z +îS +ơêëöïäÏÔÏÔ¿¹©‡¥2ßëMù׋̃ˆº¯ÛÀơèÅ«‡“Íjëöåô·ôÙףؽíÙ£äăˆŸƒvƒvƒHù×ÑӧбÔù×ưÀ߈±»¿‰ôêÿ§ÏÅ“È9¥‡öăˆŸ;™‰kß [ïS÷ˆô ăˆŸ;¡È¥È«ÈƠ∃×9¥‡ÏÚùêƒÚ±»ï½¼«»ùê₫ÚÇØïiùÚ‹Çù×äÁµÜÍÓÙ½ÿ¯¶À‡€è/Ö:9¥‡Ơ™ơïÄËÓ©'Ă¼ƒ÷ÁỞÁƯÁƯä̉£Çëö½¿‰™‹—¶©¼©ÇÆÑæ·̣›¾›¾³Âéêô‡ºÍÓÏʼn¼Ö¯ÚºÁƯ¾¹xÏÄ™‰kß [ïS«‡“Íj…Xß¿ƒvùê߈¤ˆ +\ +0 +ÏÔµ‰ÏÔëơµaƒrơÔ§Ô¿ô³zÜÓ ÁüϺĂÙ×¾âÁº³Èí—Gơê߈ϧԃ¾‘ïÅçØ߯©‡¥2ßëMÿÂÛÄÓô±ó™ÁÑĂÉÏÔ‹ÓÛˆ›¶éâḈÛÄÓƒv÷ˆÅÓ©ÓÅ»ÙÅëÛ«‚ ½9éÓùêµØÖÜĂÛºÏÔ›¾ăˆŸ;èÈÏÔ›¾ºÁƯă½ơêêöÅÓǼ€ºÿÛ«ÔỞĂœŽ̉ÆÂßÄÙÁ½ơY8¤‡×ÀĂÛ×±»¾ïçö¼Ï̉ơ$áÛ¿ÚưÀÖɇªd +©Üˆíơêù×Û«‚ ½9°»ù×­¾“9¥‡‰Éù×ÍăŸƠ‚Úß»ûñÙá=߈ß»ûß»ûĐÓ‡º“¹ƯNº»Å™‰kß [ïSÛ«‚ ½9¯‰¯0±»ù¾ÍË)éÛ9¥ĂÙăˆŸ;k¶÷ˆÍÇƠ½¡ÁÏÔµØ9¥‡ÿ¯¶ÙÚƠºm—¾“³ÈëöưÁ·Ü©ÓµØăˆŸ;ÏÄÅØâÖ±»’ÆÏÔƒ½¡Ûï»û§ÂÙÙÚ«‡“Íj߈ÇĂ߈›¶é‹È«»ÿ!œ‡Û×ÿÚÏÔ™‰kß [ïS™‰kß [ïS…³ÈÁƯÍå ËûƯµ•Èû›ëö™ÁÛ«‚ ½9™‰kß [ïSºÏÔỞˆơ”ÈúăˆŸóÄå×öÚª‚ +¼9™Á¯×«‡“Íj±»Ï̉™‰kß [ïSù×…ÔăĂ3÷Á©çÚœÜ߈ơïÑÄëơ¢%óÇѶ¿Ô°»̉ŵ؟¿«Ñ±¿êÔ‹ÜăˆŸ;÷ÙíÂĂ÷Ú›ÚưÚáÛ·̃ĂÈ¡Èg Ëûó÷Áï‡ơèÅó"©Ø½±»…ÛÛ×ÍË)éÛ9¥ºó™‰kß [ïSéºÂÙY˜êèäÛÄÓ߈’¹ÜN—Ó…Ó߈±»¥ˆ]1»ÓȽăêƒvŽÙ½ÅÓºÙ½À¼™‰kß [ïSÙÚñÓɇ©‡¥2ßëMçÚëöơԳ«»±»³àô›¶éß»ûÛ«‚ ½9á=ù×ïº߈ŸŒÁÚëöרÛ«‚ ½9ïÁéÍ₫ÇÏÅưĂéºí—GÁƯ‡ÇÇÖå̉ ÁĂ½ô™‰kß [ïS9¥‡ÂÙóÇ­¾ÛÄÓưÀÙÅë£äÄÔÏÔרăº°êØÏÄуÔÁSí—GÛ×ñÚù×ƯÅñ»·‹«Ôôê맋LJŒëö¹Œï»Ó¾ÏÔÙÚƯÚ–¶ƒ±¿›»Ừ›¾‡x±»á=߈ùêÏ̉Ù½ăˆŸ;ơÅ£ØơêÙ̉É6Ç™‰kß [ïS®Ó½ÿ¯¶߈ëø±»¡Ø9¥‡ù×ÿÇ©¼—Ö’ÈíÁ́v½ù׃ØÓܪԃˆ9¥‡óÇƠưÀª»Ñӣǣ‡±»ÏÄÛ«‚ ½9©àóÄåĂ÷ˆ‰¿I«»ÆØÿ¯¶ä¼́º±»ϼ£XÉá„©¼‡™‰kß [ïSÙÚ‡êöíềÊ)èÛ8¤±»₫&ß»ûºËÓÙ½߈‡xà ½ô¿‰ùêåĂëÚÅô›¾©‡¥2ßëMĂÈÉ»º“Èù×±»ơê¼°»«Ôùơù×ï³2©‡¥2ßëMĂÖß»ûÑÅ­Ä“Ơù×½ô±»ív•ÖûÓù×߈çÚôØÅô›Úíêív¡ÈÔÓÙÅëÇÖ¼ÁĂŸ}ơ»á ÓƒvÛ«‚ ½9öëöµaöË”¡Ô… ‰₫á=ºÆ̉éêö½€ƒ×³ÂYÛ«‚ ½9™‰kß [ïS›Ú§Ó›¹ÏÔÑ·ÅÔƯëÓ߈×ĂơÇëö·‡‘×8ç…àÅÊÇ«‡“Íj¡ÔÑØ½™Ôăàö…Ơª»ßÖó¡ÁÑ«£Ç‡Œ×¿88¤‡†ÇưÀ§È߈¸Úøô‹ÇÂÖª‡’̀j±½ù×ÎÅÁ‡é/×:‡Œ¡Û΃‚Ö­ÖñÖ¹Ú‰ÿ£ÓÅà›·ÔûÓ᥈]1…à™‰kß [ïSÛ«‚ ½9»ÓÅ!ÇÖëöé‰ñ5ñ·•áûÛÄÓƒvÅÛÇÏ̉µÅ̀ÇñÓÏÅĂÈ™‰kß [ïS§Ó‡Û•¹Ú‡ºµØÅÁĂÛ«‚ ½9Ûº©½¸Ú÷ÁÅØåÁªÄöÑØ߈ëöù×9¥‡χ—¶ăˆŸ;™‰kß [ïS‘Ö±Ôæ̉±»ñÓåƠéÚưÀ´aùׇº™ơÆƠ²¿‰uµØ±»·Ô߈«‡“Íjå̉ ÉĂº߈£ä¹Úß»û€ë¡Á«‡“ÍjµØơêëöÖ$­Ä³«ÔïÚ¹ÁƒØÛ«‚ ½9áê߈Ùß„ăàó|ÇÙ½’ÆăˆŸ;ù×åÁŽôꙉkß [ïSÛ«‚ ½9ï½ĂÙ߈ä̉  8¤‡ÖÄ–ëöÏÔëöơêûØÿ¯¶ÙŒë*«ÇÜ›¶éăˆŸ;9¥‡±»Î̉Û×ÊƠưÀÑñçÔ¡ĂÏ̉ùơ«‡“ÍjơÔшơÔ÷ˆÁƯ÷Ôº“€߈ºƯÓ ¥ÚÛÄÓñÓ¿Ú̃ˆ߈¬ÔÅØÏÅëöµØÅ؉ÛÿÚăˆŸ;k¡Èëö«Ô½߈¡›Ú•ŒĂÙ«‡“Íj§ÔÏôĂË¿ÿ$Û׫·3uU‰¿I÷êăơÏÔăˆŸ;k¡È¡Ơ«dă­½¼Û«‚ ½9߈ù×ù×±»£ ‹Ü°¿³ÈÍÄƯƠ£ØñÚíÓ÷Ù™ÁÏÔÏÔơơÄ­Ö߈°»ö—Œ™ÓÙטÁÏÔÙÚëöĂÙ¥Æß·ÅƯÓ §Ó‹Ü¹ÚÁ¹¡Ô8¤‡ÖŰ»ׯÏÔ™‰kß [ïS®ƠX±¿Á±»·Ó ¥0©¼Ñ·ÿÚ—ˆ®×ÁƯ±½Ûº9¥‡ƒˆ€öÏ̉Û«‚ ½9ƒÚëöÑØÁƯÛ«‚ ½9Û«‚ ½9ăˆŸç̃ÙÚµ†é‡¹ÚÛ«‚ ½9¡ÔÛ«‚ ½9Ó¾Ưڋǹ¶½ù×–¶“ºg߈ăˆŸ†ŒĂÙÛÄÓ˜Ạ́™‡Û«‚ ½9¥€‹Ç«‡“Íjñ×±»Åƒv±»ÑÅ›¾ÙÚÇÖ™‰kß [ïS½€ÛÀùê™ơß»ûù‡ûYív“ÆĂè…øơêù×Ë̉ÿ¯¶—¶«‡“Íj¾ßăˆŸ;¹¼©¼ăˆŸ;߈ß»û™ÁË̉ÖơéëöÏÅăˆŸÅÓÏÔ‡ºƠ½Û«‚ ½9ÁËŽËÇ™ÓÛ«‚ ½9ÇÖƒvöù×ïÚÇÜ‹‹ÍË)éÛ9¥Û«‚ ½9å̉ »Å½“¹ƯNÄÔ¾ÿ§Ñӕ׸Úͪíäƒvƒˆ¡ÈƠ—¶¡Èù×›¾‡ÇáÛѶ¥Ûư‡±ù1û’“Ⱥ‡Œëöù׃×щ³ôÛÔÛÀó‹ñÚó¹Ơ¥ˆ]1ÏÅùßÁÓ̉•Èû›ƒÔá=±»³ ñÖáºĂºÙ×ß»û±»«»±»Á‡é/×:ƒv†Ø¡ª»Ù½—¶ơÔÛÚÀGº·Å«‡“Íj“̃™dơê±Á±»ơÔá=₫®¶à ÁÚùêôƒÖ×¹Ÿ}°»ÇÖçÈÅnåĂ«ÔưÀÁĂ¹̃ù׆đ5™‰kß [ïSëăˆŸñÓÁ̉ÏÅù×ƠX™‰kß [ïSỞ•ш¼ öÛ«‚ ½9ƒ×ƯÚÎP½ù×ÙÚÁѶÏű»Û«‚ ½9¢»âḈ¹ÚƯÓ ¿ºÿÂÁ¼±»©ÓÓù×ÏÔÛ«‚ ½9±»ÏÅÙ¸Á‡ŒËÉ9Ó©¼«‡“Íjû(ÙÓ·‡‘×8ç9¥‡×“Æ¡Ûëö¹ÚÓØºéÓ™‰kß [ïSµØ«d₫ÛÏ̉¹ÚóÔ±»ÏÔă»ƒv–¿ă‘·ÙÅëû¡»À̉Ơ±»í(½åĂưÀ߈—»Íć²Èç½øêùê±”­¾ù×ÑÓ9¥‡¬¼¼ăÇí߈¾щ«‡“Íj·¦D ºº¼ơÔͽ߈ÙàăˆŸ™‰kß [ïS÷‡—»Á̉ä̉­Ø‹½øê ­Ø¢Çéê—¶‘Ö±»´açÚå̉ ³Â$ÍÄ›¶éª„¡ÔµØ»ØÅؘ‰j̃ZîS÷‡±»߈Á¹Î|¥ÓÏž·§D ߈Úª‚ +¼9ăˆŸ;k¡ÈÑrëöÇÖ‡ºÁƯÛ«‚ ½9߈½û©¼ÏÔ‹ÇÓÅœÔ߈ĐØùêÍă߈“Æ×̉“Èăˆ±»ăˆŸ;×ÇÛñ•öÁ‡×Ơí—G±»˜‰j̃ZîSËÇÅÔÏ̉߈ÙÚÑÄë‰Û߈³ °»‡º‹Ü©ÇÛăˆŸ;¾ĂĂÄ«‡“Íj¹Û«‚ ½9âˆ:Ù½±»9¥‡«Ô߈ÛÅĂÙô髇“Íj߈©‡¥2ßëM±»ñÓÚª‚ +¼9ׯ…çÚÏÔ±ơĂÇ̉ûƠëØ߈ÔXè­ÔÓØ¾ÅßÁÑәӵءÈñÚµØăˆŸ;ơÄßϸÚ÷ÁÏß߈ưÀÛº¼Ơ½߈‡¾9¥‡ôê»Óù×ëö±»ûĂ‡Ç¥™‰kß [ïSñ»¡ÇĂíăˆŸưÀ«‡“ÍjƯÓ ÷Á‰ưÀщå̃Í­HÙÓÿ¯¶ô™‰kß [ïSϹÏœȃ½©Óôψ±»³Û„ÙỤ́Ç“Ơ€Ơ¤ˆ\0ÙÚƠ¿‰ÇØùצô÷Úé꫇“ÍjíÁ߈麼רưÀëöщ¯ÈË¿ŸÖ‡Œ¿‰‹̀Û«‚ ½9ùơêö +½œÜÑÓ·‡‘×8ç·Ü£Ư÷Á™ëé啽ګԃ·Ø»—ÓùêÙ½“¹ƯNÍÓ‚Öâù×Ù½˜êèäÅ»‡³¹߈›¹²×ÙŒë*«½€¡Û±ƒ¾‘ÏÜù¿Ñÿå̉ ½‹Ç›¹ß»û™‰kß [ïSù×­Äù×₫Ç9¥‡ÁƯ™ÁŸçƯÜñÚÏÔç﵆ûï½Û«‚ ½9ĂÙؽô™‰kß [ïS§ôëö˜‰j̃ZîS±»߈ïđ™Ó™Á¡ÔăˆŸ«‡“ÍjơÔ˜êèäÛ«‚ ½9öÁå̉ Û«‚ ½9¶ưÀ«‡“ÍjÛ«‚ ½99¥‡—»ñÓ½¤·Üºª‡’̀jÓàÁßÄÙƯºơêµ.¥Ùå̉ ĂƠăˆŸ;•:߈“ȓƓۭç÷ˆù×ÏÅÁËí‡ÁF‡èѶŸ»»nø¿ó|‹Ç°»×ܯÈƯ‰ïDí‡Ơ¶çô¹Ú“Ơ§ØÑÓ›¾µØù׿Ï…±»¿»ÅӷܧۻØƯ‰çơÏ̉ĂèÑÓ‡ºĂ߈±»±¿ç¾£ ±»ưÀË̉é¾Óصس˹¿ºÅØ£äÚ×ăˆŸù×ÿ¼9¥‡âˆ:jçÚù׉§†ºÙ½˜‰ j ̃    Z îS ưÀăˆŸ™‰kß [ïSù×ơêĂǽ߈‹Üé‡ă°©‡¥2ßëM麡ǃˆÏÔ¡ÔѶ™‡Á¼ëö¸Ú¡ÈY±»ËÚưÀÓÆщ€¾ßÄÙƒÖí—G¹»£‡‹Ü™‡û(ăˆŸ;œÜ‹Ü¿Å½‡º¡±èƒˆăàó¹¹Ú©‡¥2ßëM‡Ç÷Á‹ÙƯÓ Ÿ\ÎÔ¶è9¥‡ăˆŸ;̣üñÓơêÑÓÇèưˆù×½€߈±»·Ô9¥‡́ÆÊÁëöæ̉ívÏÅøêW­ÄÇÖ‡xƠÚ‡ŒưÀÀĂ†Û±»ơÔ™ÁÛסÈÛ«‚ ½9½ÿÂÁĂ©¼ăˆŸ“Û™‰kß [ïS¦¹£Ç±»ăˆŸå̉ 9¥‡ÍƠăơÏÅ¿ßÙŒë*«Ľ9¥‡¼Ç»߈ùëËƠï½óÂÓÅăˆŸ;¹ÁăˆŸ;©¼ßÁÅÓÿÂÅÁ©¼ăˆŸ;kñÓơêÏÅçÚ¡ÔÏ̉éÚ™‰kß [ïSÚ×ñÖ«‡“Íj¾ß‰y¥Ç™Á¾›¡ÙÚ­Äù×ÙÅë¥ÓÆØÏÔ÷ͼơêºÁĂ£Ô•ÛĂáۑƽßÄÙï‰ÛÄÓË¿£Çăơ¿(ơêʹ‡ºµØÏԣآXÁƯŒºÿÚÂÙôê½Ù×ơÔ¡Ô«Ô¹ùשÓÛ«‚ ½9Óˆ•=‘ơơô™ÿƒv«‡“ÍjăˆŸëÓźáƠăˆŸ;£ä“ÈñÓÇkÏÄĂï»á Ưº½߈ÂÙëö퇹ڡ“öߌÛ,¼»ÅơĂéê䌾Nùן\ùדƠ÷rƒv¿ô™½Úª‚ +¼9…»‹Ç¸È˜™‰kß [ïS«»å̉ ËÇ߈ÙÚƯÓ ™‰kß [ïSí&ﻵ†ï³2§Ô÷ÁĂÙµØÅÁÉ̉́ví—G“Ơ™‰kß [ïS‡9ĂÈơ꫇“ÍjưÀÀĂÁĂúÓ­Öív©øÅàÙ½ỞÀĂÔơơĂ9¥‡ÄÔÏÔù6«‡“Íjùê£Ơù×ô²ÈÑÓ«»°¿wµØÛÄÓ¦ÆÙ½ĐÅÓÅêö +ù×÷4ư‡±ù1ñÖưÀ½£äÿ¯¶4‘‹ƒv·‡‘×8çË¿½ô—¿±»ŸáºÍ­H÷Úª‡’̀j±ëØÛÀ¹Ú´ËÉ9ơê§Ơáê߈ׯÍË)éÛ9¥ÁÓÙ½Ă½€å̉ ›¾ôñÚרÑÄëٽػ€º¼ÔÏÔª‡’̀jøêÿ§öơÔ·ÔÙ¬‚«»ơÄϼÚª‚ +¼9®×Ï̉ï½ơĂ´ÊÎÊʱ»½ưÀëö°»Å¥ÙĂÈùêß»ûÏÙ̉¡Û™ô¡°¿ØÀ̉ÜÓ ±»“¹ƯN˜‰j̃ZîS½ÍË)éÛ9¥±½ù×Ơºm¶Ü߈×Á«·3uUù×ÓÆ©Ó§ÆƒvưÀù×´†³ĂºÛ«‚ ½9q̃α½ù×ÇÖÏÔ±ÁÎÔ°»äƠÛÅØ½ÎẠ̊ÂíÁÈÙ±»Ç»ؽ‰¿IÈ̉ˆ›¡éêÛ«‚ ½9½Ăµa«Ô߈ÏÔÁÙỞÑØăˆŸ;ÖÔ†6¦j…»߈ĂȾ» ÏŹڙ‡³Âô¿‰ºÙ½‹Ç̉Å«‡“Íjß»û‘Ù×̃ÄØ߈ïƠ‹Ç½§ÆúĂºĂÛפÇÄn¶Üƒ½¶Ü ù×ÅÔå̉ ívåĂ¹ÚÁÆÏÖ—¶©¼™‰kß [ïSÑ`ÛÁÛ«‚ ½9½€¿éỞÛ«‚ ½9–Àç‰ĂÙͼóǽƒØÚé‰ñ5ñ·Ññ–ÀÛÙŒë*«åĂÚª‚ +¼9ÏÅÛט‰j̃ZîS׿³¼½߈ưÀăˆŸ¼ö¾Ă»Øù×ƠµØ͘»ĂívÿNŸ}ăˆŸ;½ç̉öÁƒvăˆŸ;÷Ú°»±»ëöɇăƠ½߈™ëéåơê‹,×Ơ¡Û¿Å½ăơ÷ˆ¶UUñÄ«‡“ÍjñÆ›ÚÇÖƒÿÚ½ÿÛ½ûØ—»ăˆŸÍË)éÛ9¥ß»ûăˆŸ;·Ó ¥0Á̃óô“Æ—₫½ÔËǩǑÆưÀÏÔ±»æºÅ؋ǹÚÁƯÙÚÛ«‚ ½9ăˆŸ;áºÏÔ¯‡¤ˆ\0χÁÑĐØ¯WăˆŸ;kÎÅÏÅ¢»®³È߈Ûºá¡Ù½«‡“Íj¡Ôª‡’̀jĂôóÁ̉R›¾Û«‚ ½9±»¿‰‹ÇĐű»‰¿IßÄÙö¶½ô½ÔüÀßÚ·Ôùô›¾¿ßÁƯ‡ÚơêưÀ·‡‘×8ç߈•%߈©Ó™ëéåƒÚơêëöéÜ£*߈›¾߈Ơö§ÔׯÛ«‚ ½9ëöÓØµØ™ÛÛÀ9¥‡íÖ¦Ô¡ÈèêñÚÊíÁ³È—ˆûÓçôíÆù×¼ơĂ«‡“ÍjñÖĂÙÛ«‚ ½9ÅØåÁÛÙÅëÏÔÛ«‚ ½9¶Ü«‡“Íj¼ÈÏÔưØÙÚÚ»ö×¾ùׯÈËÉ9±»ëöơÔĂô™‰kß [ïS™‰kß [ïSú̉« ©ƒ»5ï½ïöÛ«‚ ½9߈ëö™‰kß [ïSÅØ“×ÏÚ½ƒvăˆŸ£»¹ÚßÁ½‹Üù׷ŘôÚª‚ +¼9ç$­ÄĂÙ«‡“ÍjÛ«‚ ½9³Óù׃ˆŸÈ«ÚÓÆö“·Åù꺷ºçê9¥‡‡á¥Ưé¼§ô©¼¡Ô‹ÓÛ«‚ ½9÷ÁưÀá=“¿ÏÅ·Ôé·Óºöøê‹ÇïƠÿ¯¶­Öùט‰ j ̃    Z îS À‡€è/Ö:߈°»«·3uU…Ûß»û¡ÁñÚđÇï³2­ÄăˆŸ¾‡ăˆŸ;ĂĂ­ÔÔ¹Ú©Ó«Ô¥ˆ]1ÿ¼ƒÇ_ª» ÍÓåĂÁí±»Û‰ÛĂÙ‡Û×¾½¹)˜Óƒv̀Óù꛾ù×Û«‚ ½9ëöÚª‚ +¼9ëöä̉  ëöœÜÛùêÛ«‚ ½9Å–¯¾¡Ơ߈ÇÖÛ«‚ ½9—ˆÏÔëö©ÇÏÔÀ‡Ú‡Ç·¸ÏÔÚÀ¡ÔƠßÚưÀ¡È©‡¥2ßëMăơ“¹ƯNù¾§ôâëÔêö™ơéê‹ÇÏÔûØ›+íưù×9¥‡8¤‡ù×±»Úª‚ +¼9ÍÓèÓ«»¡ƠÁÛ‡—ˆÿ¯¶ĂÙÁÛÏÔưÀ¿ß“Ȭ¾³Â¡Á«·3uUĂÈÛ«‚ ½9ؽÑÓ¿¡È¹ÚׯƒÁ‚ĂÙ¿ÅÚª‚ +¼9½€Ơ˜‡ăˆŸ;ÓØ½Íư³ÂÍӽǘ‰j̃ZîS·Ô™‡›øæ¡ÔÄôßÚëöăˆŸ;ÅØù×ËÇù××ƠÛ×§ÓÍĂ—»ív¡Ô±»ÁƯÀƯÇÖ¡Ư¿‡ù×§ÔgﻫÛÛ«‚ ½9¾(ÎÔÙ½ºÀ¹ñÚñ™‰kß [ïS™‡Ï±»ÍÓùơ‡ºêö›¶éçÚ“Ç—Ó÷Á†“½¡ÔµÙƠ×Ûщ½ơċǛ¶éƒ«ÔÁç»Ø†Çï³2óÂăˆŸ÷ÁöóŸ}ơԩȹ֥♉kß [ïSÛ«‚ ½9ÈĂ ½ïùØׯÛÔçڋǃvÛ«‚ ½9±»Ơܽ€Óº¢ÇÁĂưÀ™‰kß [ïSÑÓÛ«‚ ĂºùסÈÛ«‚ ½9“ºéÓÍ·ĂÙ½ËÉ9Ó¹ÚëöÓđ׿8«»·Ø¡ưÀçÚĂȱ½¿ô¨vƒvñÚ±»ßçÚ›¹ßÄÙ߈ÑæñÆÍÓÛÄÓ¯G‹øÿÚÏ̉±»¶«‡“Íjù×¾Å.«‡“Íj¯È‚߈æ'Á¼Ï̉•ŒϹăˆŸ;«‡“ÍjÏÔÙăˆŸß\¾¹x§Ó±»™‰kß [ïSăˆŸ;k±»߈Û«‚ ½9ß»ûƒvÏÄù×ûØù×ÿڭĶÔßÁƒ×Ó̉߈߈ùê¹Ú÷ÚÁ¦ØÙ½—¶ÀĂ×Ó¶ºơê§ÓÙÚÙ½®¾ÍË)éÛ9¥ÙŒë*«ùêơĂ“Ơ‡ÚÑÅÛ«‚ ½9¶è«‡“ÍjïÄơÔùׇ“߈±»ïäÛ«‚ ½9ăí±ÁĂôéºêöÿ¯¶ÑÄë¹ÚÓºáØ«‡“ÍjƒvëööÓØÏ̉öÁ÷‡ªÚ̃ˆơêí—GÄà›¹ÏÔ¾ù×µaÛ«‚ ½9ëöívÛ«‚ ½9ĂĂ£äâĪÛ߈á=Ù½¹ÚĂ¼±»Á¹±»«Á̉¿ÅµØñÚÏÔă»ÏÔ«‡“Íj±»«‡“Íj°¾ °»­Öù×ﻕ̃•½¾Ù½±»¾« ©ƒ»5‚Ø-”Èú“Èï½ÅֽؕĐÄê±»©¼ăÁăˆŸ;k«»º½¡ÁÅÓ¶Ăƒv‹ÇÛ«‚ ½9¹Ú߈½ưÀ÷Ú‰ÛÏÔׯ°»»‹ơêùêÅØå̉ ûƠô°½“ÈÙ½ËƠX₫Úñ£ơÔưÀƯ‰±»ºĂÙ½æÇµØ§ÔóÂ÷ÁëÔ¶Ü߈ù׫‡“ÍjñÓ½ÏÔăˆŸµØχ·Åÿ¯¶æÚ½¢¹ÚñƽƱ»%ƒvÅӹ󼣨ơÔù×ܽĂÿÚº߈ÁăÛ«‚ ½98ɤ‡ÉÖ4Á̉·‡‘×8çg8¤‡×ÂƠÄ…ö‘ÆçÚáµĂÏÔí—G¡Û«‚ ½9ĂÙ™Ôó“Æ³ăˆŸ;׿8çÚ£Ø̃ˆÑĂ—ÓÁ¾½óÂÁ‡é/×:Åô´½ăˆŸ÷Ô» ׇ‡ư2Û«‚ ½9ëö½߈‰¿IôĂ³È¿‰©¼ß»ûÛ«‚ ½9°»ù×Óù×€ö÷ˆßÁ8¤‡‚v™¹àëöưÁå»§ôâÁÙÚ™‰kß [ïSßùׇxăˆŸô꫇“ÍjÀ¨‰·Å¤½ñÁ±Ô¾ëöỞ̀Ó9¥‡½±»åת¶2tTÁ‡é/×:Ǽ‡»«‡“Íj™‰kß [ïS‡uëÔµ±ëØ÷ˆơêå̉ ¶ÔÑÖ£ ­Ö½ùêñÓ߈‚v“Ơ߈ÄÔç̉›¶éư‡±ù1í‹›¶é¿–ƒ×±»¹̃¾ßÛ«‚ ½9ÅÀ‚v»½¡Û¡È̃ΪÚÛ×ĂƠ™‰kß [ïSϼ‘Æ’Ç«‡“Íj¤ÈơÔÖØ̣Çës³È¹ÁÚ×±»ëö÷ê«%‚Ú›v»Øá ŸÈ™‰kß [ïSĂÙÿڑȱő£»ăˆŸ;߈µØ¹ÚÔX™‰kß [ïS±»½ôш¹Öă¼ùêÛ«‚ ½9–¶™Á©‡߈ưÀËƠă´À™‰kß [ïSơºÛºÓºỞçÚÑÓ·¼Í7ơêÑÊăˆŸ¼çô§Ô÷‡ÅÓÛÔ‹Ç–Ø…»Û«‚ ½9߈ÅØƒÚ¡»¾ÍÄƯº™‰kß [ïSÅíÆâḈ«ÔỞ™‰kß [ïSăˆŸ;k߈ܹÚÛºăơó£ÓØƼÅÔ™‡ª‡’̀jׯ»Ó±»ï³2ÑĂ¡ÔµÈĂßÄÙó£X«ÔñÓ©¼¿ºù×ơÔµù×ơº̣¶ăˆŸ;©ußƯĂÙâêÛº¹ÚßÁáêß»ûœ‡³z½¹ßÛÙƠ»ĂÈ™‰kß [ïS—ˆ˜‡ÙŒë*«¡È¾Ú§ÓÁ‡é/×:߈¡»ö—Œ±»½ôûÀƒvù×Û«‚ ½9™‡߈©¼ÅnÁƯ‡ñ5«Ú˜‰j̃ZîS›¾·ÔÏÔ¾«ÚƒvĂ㫇“Íj凹Úùׯ×ăàßÚÙÚëö—¾ñÖƒ›¡“¯¼§Ôù׎ñÚëö«Ô¸Ú»Ươèŧԣ»Ăºê¼“µÜùºyÚª‚ +¼9£ØăˆŸ;kăơ²%ĐŨº÷Á¡Ô±»÷Ô¿ßÙ÷ˆ¡ÛñÚơêÛԋdzƒÏÄ•…$Á¼—»Û«‚ ½9™Áƒv¥âÙÚưÁí¹¥ÇÁƯ½ÍÓº›¾ơèÅ̃æÏ̉ƯÓ ºyúÛˆ́véÓß„ÅăˆŸµØ̣í™ØăˆŸ;™‰kß [ïSùô Ëûµ‰¥Æ«ÚÏᆵ 9¥‡±»ÍÄ¢ 9¥‡éê­ơ§ÔƠ·¸¥ØÅØëö³ ¥ÇŸ}ÙÚÙÚ©ÿÇÿÚÅÓ¼€™ëéå§Óù×ß„ëö¿‰9¥‡߈½úÙ ăÍÓ©¼¾¯È§·ÔÛ«‚ ½9Ù½éÁ½ÅØÓ¹Ú Ëû·‡‘×8ç½߈9¥‡×9¥‡ĂßÁ±»œ¿…ô™‰kß [ïSƠXÿÚ¥Œ£»»‰Ù½˜‰j̃ZîS‹ÇÛ«‚ ½9Ë¿ÏÔ㙇çÚËÉ9YơêÛ«‚ ½9ÏÔửêÓ±Æù×Ơï½Ú߈éêíÙ­Öÿ$·Ô¯×ŸÈªÚ·‡‘×8ç“€ÓÇÖ£‡HßÓ÷ÁûØÑĂăˆŸÛÀ¡±¹Ú¿ºµØß»û‚v·̣Û«‚ ½9™ÓăÚ÷Ú“Ơù×¶èÙ×Ù½9¥‡ôêưÀ¿‰˜êèäºÚª‚ +¼9߈­½¼®Gø¹ÚÓÚ߈óǃ¾‘ö˿ھù×›¾ψĂºàÔçØƒˆ¡ÁÙÚÙ½߈µƠú¹çÚÉ₫ʹÑæ€º˜‡íÖĐ +ëöưˆÛ«‚ ½9ÍÓËÉ9߈ÿ¯¶£»«ÔÓÂÏÔùꦺƯÓ ª¶2tTóÔƒˆ…Ơœ‡·‡‘×8çÇÓ­Ä8¤‡îšۙ‰kß [ïSĐÄêĂº¹¾‚vÄơº‹ÜŽؽôѶ߈“¼ñ¿±»ç½¿‰°»}™‰kß [ïS¹Ú˜êè䩇¥2ßëMÅÄ÷ÁăˆŸ™‡½€äĂ§ÔæÚ®¼ü¦†å̉ ÷‡ÅÔ“½öÁ-ÿ¯¶«‡“Íj½Ù½³à“ÆÿÂăˆŸ;™‹©ØƒàíÚÏ̉½ÇÖ«‡“ÍjơÔ8¤‡±»ÿÚ—¶ÑÓÛ«‚ ½9³àÜ™‰kß [ïSÓ韙‰kß [ïS̃Á7¯ÛµƯ߈›’­ÍÓ·ÔÏÔû÷Ô™‰kß [ïSåôÇĂù׫‡“Íj×Ơ†7§jµØăˆŸ;‚½ôê›ÁÛ«‚ ½9ÑÓ¶åô‰¿I₫®¶½Ï̉ÉÛ×¹Ú¼­vĂà±»ÛÄÓăˆŸ–¶  ăˆŸ;™‡£ÁĂ½ÿÚ›¾­Øëö¶»Ù½«‡“Íjù×™ÁÂĂ™ÁÏÔè‡ Û½‹ÜáÚÎÔÙÚ«‡“ÍjµaÙÚïƠ­½¼·̀ƒ×ÚÀÛ«‚ ½9áØÅô·‡‘×8ç÷ÁÓÅÛ«‚ ½9°»ø× ëßÁÿÚ߈÷ÁÏÔׯ«‡“Íj‡Œ¥ˆ]1ºăˆŸƒvÁ̉‘Û£ä½Á¼˜‰j̃ZîS˜‡•Öƒv¡ƠÏÔ™‰kß [ïS÷ÁñÚÍӵء۱»ùêÏ̉ÏÔ™ôêÚµØƠ»…ÛÁ̉™‰kß [ïSÂÓÅ–¹ÚăˆŸ;éWưÁÁ½™‰kß [ïSñ§Úª‚ +¼9½‡Ë̉ăˆŸ;“Ñ9¥‡ƠÄ›¾ØỲÇñÚƒ½­¾•Ư«»ă»·‡‘×8ç»Ó±»ØđâÖÆÁ̉ÿÚ§ÓËÇÍË)éÛ9¥½›½̉ƃ‡º¨Ú¹ÚÛÀơêùê—¶ù×̣¶ù×ôăĐƒÖÛÄÓ«ÛëööăˆŸ«‡“ÍjÁ̉›¶é¹ÚơèÅ¥“ȋDZ»̃ˆ™ÔŸ}Ùå̉ ívÏÅᬱ»̃ˆ«‡“Íjå̉ ÅĐáêœ}·ÅÖ¼%ÏÅ·§D ׯ³(ßq«‡“Íj‰Ư›Û¡ÔÇ·©‡¥2ßëM‹Üß»ûöÚª‚ +¼9›¾ÏÄç4ƠêÚù׿àëöÙ½ôê°»á ̃ˆF¡ÁÍÓăˆŸ;ÂƠù×ơÔ¿ØïƠçÚÅÓăˆŸ;9¥‡½ÔÍË)éÛ9¥ëÚÈ̉Û×›¾—Ó—ˆéÓ·‡‘×8çăÁăˆŸáêÂ₫ơ꫇“Íj÷Ú¡Ư·ÅÏÄÓÅÓÙ™‰kß [ïSŸ\̉Ø×¾Ë̉»ø×ăˆŸ«‡“Íjƒµà¾ûºÇÖ°»±»ăै]1½€ù×ăˆŸ;đÚ©‡¥2ßëM¬Äûß“¼©¼ÏÅ¿ô«Ô˜‡ä̉•ŒÙ×™‰kß [ïS·‡‘×8çÛ«‚ ½9‚ ›¾À‡Û«‚ ½9Û×…Œ£ä˜‡±¿¸Ú•óÔ˜‰ j ̃    Z îS ăơºăˆŸ߈ÁƯ³¬ÄºùéÁĂÑÓ·ÔÛ«‚ ½9¥âXăº½åŒ¿NÙ½¥ØÂ”ÖôÏÅǼμê˜H„ăˆŸ;ÇÖÂÙâˆ:kƠÚºơÛ½ưÀ‡Ÿ·‡‘×8ç×¾­RË%¹µƒ½«‡“Íjÿ¯¶ÙÚ…Öù×™‰kß [ïS‡,ÙÚϹ½÷å5ÓÛÄÓ߈à½óÂÚ×!«́‰¾Ÿè‹æ9¥‡ùêû—¼ÔÿÚçmơêèÓơêɇ߈¢»µØëöÉ—½›¾Ù½ù×±»ưÀöù×¹Ú¹Û‰Æ߈щ߈½¹ÚùŸ}Ă¼Úª‚ +¼9ù×™‰kß [ïSóÔv±¿˜‰j̃ZîS“Ơ‘ơôÔ‹›„ôÙÅ믂ÑÄ뽃v˜‰j̃ZîSÁĂ—¶ÏÔÛ«‚ ½9ƒüÀăơ±»ÏÔÛÄÓÍÓÙ½¿Ư«‡“Íj›¹%™‡ªÔ¡ÔăˆŸ;kÖÆÓØ߈¹ÚÏű»Ù׫‡“Íjÿ¯¶ăˆŸï»¿ßá¬ÏÔ‹Ç÷‡Ç̉ÓØ­ÄÛ«‚ ½9µÈù×ÍÏÔ°»«‡“Íj¨Øׯ›¡9¥‡¿ØÍÓÙÚù׫·3uUöÁ”{ÏÅßūԧÔÁ̉ëÚ¶̉̉è¼ Úˆôí—G·‡‘×8çÏÔơêùê½™‰kß [ïSÍË)éÛ9¥߈ăˆŸŸ}ĂŸÄ±»ăà˜‹³º™‰kß [ïSÙ½߈¯ïÛ«‚ ½9‡ŒäŒ¾N‘á©Üô…,·€ƯÓ ­€ù×̃ÄØöùêĐĂÈ̉™Ôư—§ôª‡’̀j̃»ú£Ư“Ïĉ¿I¾›Û½ĂƠ©‡¥2ßëM¯Û¥ØŽßÚ°»óԫ♉kß [ïS×ƠƯĂçÚñÓ¹Úø×÷Á³Œơêÿ§‡xø×°ÀT§ÔƠX¾ßׯÅôéºóÔ¬ÖÏÅÏÄA«‡“Íj8¤‡×¿8­ơê‚ù×™‰kß [ïS³Çù×ÏÔºĂß»ûÁÓ™ÔÏÔµØù×Ù½ăˆŸ;“¼9¥‡äÁƒ×½‚ÚơÆÑÄëÛº¾Åι±÷)½€̃ˆ¥Û½Ă­Äù׃vÿ¯¶‚Ôû’ô›¡¨Ø½™‰kß [ïS×Ü¥Öµ†Ë%™Û½¯×ËƠ½©Ø«‡“ÍjèêÛÀëöÏÔưÁËÇ«‡“ÍjôëöĂè‹ÇÛº—Ó„›¾™‰kß [ïSÏű»ùê÷Á¯´ÿ¯¶‡ăˆŸ;ăˆŸÛ«‚ ½9ö°»™‰kß [ïSÂcvÿ¯¶µØñ›§’öµaÏÅ«·3uUÏÔ…Û§ÔÛ«‚ ½9ù‡™‰kß [ïSÏÄß»û8¤‡Ö¾8½đÅØù×ß»ûöé‰ñ5ñ·Ô¾FùêñÚ‡º›¡ƠƯÏÔÂ軇ǻcváêù$ù¿߈âˆöƒ¾‘ơ꽃ˆĂÙ«»ÏÔ¿‰₫Ú±»ÂÆf°»ùơÁĂÚª‚ +¼9…»ÁĂçÚ«Ú«‡“Íjñ~%8¤‡××Ó’‰2Ô,ø¿à߈‰¿I‘Û“Ơª‡’̀j‡·̣߈«‡“ÍjñÖÏŋDžÓîÅáêÙÅëöÁ·Ê¼ÿ¯¶—ڃסԙ‰kß [ïS¶‰ÄØâˆ;Ë%…Ïù×—¾¹Á߈µ†§ÔñÓÿÚ‹ÓöÁ(µ†ÿ¯¶±»ß»ûµØ½€8¤‡ÖヲôĂÙÙ×Û«‚ ½9ÅYƠơÍË)éÛ9¥±ô Á»‹™‰kß [ïSßÖ9¥‡¸à“¹ƯN‡ŒË¿±»ơÄçÚéÔ”%ƒvé꛾ÆưØăˆŸ;9¥‡ÑÄëƒvöÁ±»ÙÚµØ9¥‡³ÈăˆŸ×ù×çÚ½Ü9¥‡×µØÂƠÍƠăî°»é꼡Á½­đå̉ ß½«Ô«Ô¡Ø«‡“ÍjßÄÙ‡ŒÁ‡é/×:€º³ÏÅ«dÑÄëăˆŸ;óÔ±¿›¾ÓÅăˆŸ;kƒ¯ùßơèÅ¿éơÑØ‚½ă»£Ø©‡¥2ßëM½çÔ¡›¾ÍÓă»ơÔÚª‚ +¼9ơúỞƒkӃØéêÎơ¤́v¯È˜‰j̃ZîS×Ú‘ƒ½ÿ¯¶ÔŽü׫‡“Íj¥Ưù×ƠívËÇ߈ÏŤ‹Û«‚ ½9ơ»ÙÚ̃ŒÚ,ß»û…Û¥ĂÛ«‚ ½9Ù½ăˆŸ‡Çâ½·‡‘×8çÛ׫‡“Íjöá=™ơ…»ù×ăº×Ơ”÷Ÿ}ÏÅáÛñÚÑÁ½½©½ưÀͺ·‡‘×8çÙ½…öơèÅ߈ÓÑÑ×å‡÷ˆăˆŸ;Ç̉½Ôƒˆ›‡ôê߈×$Á¡È×åÍÇ™‰kß [ïSÙÓ́v¼‰¿IØ×öÁ›¾­¾ë‡ÏÅÉĂívơê½€¿»ưĂíÚ×¾ùæÛÄÓ£Øù×øê±»ívÂù¾߈ºÔÛ×›¡Ù½R·‡‘×8籿ƒv¯Û•˃ÖĂæƠù×Ù×ơê§Ó÷Áø×ù×ÍË)éÛ9¥ÛÄÓ½—‘³(ơÔơÔ—»û÷»ø×ï»åÁù×ñ‘ÆĂƒ—¾Á̉±ëØ­¾ơÔ«‡“Íj©Ó›¶éÛ«‚ ½9Á‡é/×:Ư‰ë™Hµö›¾¿Å¿ÁƯ¿‰ơêẨ™‰kß [ïS«»¡»™‰kß [ïSÏ̉¸Ú›¡Û«‚ ½9ºÛöÛÀÛ«‚ ½9ª +¶ +2 +t +T +ÔÚ¿‰ñÁ÷‡óÇĂÈù×½×çÉỔ°»ÔX 麽¤Øɇ‡Ç«Ñ§Ôơâô‹Ü̉ÆǼ“½9¥‡©Ø¹Ú‘ÀÙÚÚê‹ÇöÁÛˆ÷Ú†“™”ưÀºÙÚÑÄëƒØçÿÚíêÁ¹á̉ù×°»ÈĂ·ÔÏı½ÏÅ·‡‘×8çË1¯©Ó•Èû›Ù½ưÀá‰ơèŹÚÁÚ×¾æƠư“ÖÚăˆŸ;ÍßưÀ¯×•îưÀăà߈ơÄƠ·Ó ¥0«ƠñÚá —Óù¿“Úƒv±»¹ÚƒvºöëöôÏÔÇøê½½ÛÄÓéÎ́vшá Ç̉«‡“ÍjéÆƒÿ¯¶½Ô¸Ú‡Ú±ÜÛׯ¾₫éÓ%ĂĂÁÙ™‰kß [ïS‹ÇËÇí$ÿ¯¶ơêÖÆöçÚ™Á—¾¯ ơÔ³ÈÛ«‚ ½9ÑàÚÀ߈©‡¥2ßëM¹ÁщëöÅăˆŸ̃„Ơơê¯G‹ø…Øùæ…κ—Ó«‡“ÍjËLJǽ÷ˆÙ½«»ÍB¹Ú™ÔÙÚ—Á‰èÙÜùׇŒÛ«‚ ½9áƠñÚׯƒ½ăà”ǽ»ØªÈ‹­Ö°»Å—»÷Ú”öùêù×ËƠ߈…Œ¹»‹Èëȯ‰¯0½ôë×çÚÑÄëÏÔ»ƯÏÅ«‡“ÍjÛ»÷ϽĂƯó^§ÓĂÈưÀ˜‰ j ̃    Z îS ©Ø§ÔÓÉùêͱ»¹ÁĽăˆŸ;k¿àéØщ…Á½·‡‘×8çù×óÇØ¡ÁÁܧ¹±½ăˆŸ;k‡Œ™‰kß [ïS€ºÈ‘Ó̃ˆ¼Ǽ9¥‡Ï̉ªÓ¡ƯÛ«‚ ½9£ÔëÚÙơĂƒvùס»‚vß»û½Å˿ۈïÂùăëöÀĂ «ÔøÅÔ«ÔưÀå̉ ̣ëö±»§Æ£‡ù×麫Գºó ËûăˆŸÙ½ÁÜÛÇá ÷ÔăíŸÖăˆŸ;ơèÅÅŸ •Èû›é‰ñ5ñ·á=½ÔñÚûÖéÚ½ăˆŸĂÙÙ½¡½Áùê­Ö‹ÓçơƠăàªÚ·ÔÑÅß»ûóǵa¹Úùêñ¾g­Öơê«d÷Á9¥‡ù×ÏÔ½Ôưp¿ß‡ÏÔÁÿ¯¶¶Ô߈ü™«‡“ÍjƯƒØù×ñº™‡£Çéê¾ß +êö±»¨¼¡ÛÙÚưÁùꇌăº9¥‡½´•ŒÓÅăˆŸ™‰kß [ïSăˆŸăˆŸ;ÛÀÛºßÄÙ÷‡ÓÓÑÄëÍƠ±»ô•CƠÚö½€ù×ÙÚ™‰kß [ïSÁÚ×¾߈Á½çZ²ÂưÜ߈ă½ÙÅë·Ó ¥0ǾîÅZ˜ÓÛ«‚ ½9›¾Ö¹±»µ÷»Å£»™‰kß [ïS‰Û™‰kß [ïS‡xÑÄëÛ×ñڙ뇓Íj©Ü—¶“‹ÑÄ뎃¥"íơ¬Ö°»߈Ï̉ăˆŸ½™‰kß [ïS¼Óؽ€©ÚÓ'ÙƠÑñ»¹ÚăˆŸ;k¶·Ôß»ûù×ÅÓÊƠóÇÚÆÏĵ†çÚͼ ª¶2tT¹öù׺߈¶Ô¶ô ÿÜèºĂº’Ơö߈Á‡é/×:Ö¾ư§‡ăˆŸÁƯư“ûƠăˆŸŽ߈«çôù×ÖÆ¹ÚƯÇÖÔX°»ÁĂׯëƠU½ôÁĂ¿ÅÑ+ưÀửëöͽùׯ÷ÁÙ̉—؉…›çÅØ߈ëö£äưÀñÚÇÖóg÷Á÷Á‹Ü釽ۺ¡È©í©·Å÷¶ù”ƒvÅàƒˆö´¼©‡¥2ßëMÿÚ¤ÂĐ··Å™‰kß [ïSÀƯÇÅỞÏÔµØÓÅÂÙË̉‹Üëö«‡“Íj˹÷Á«ÔÓÅ¡Á²º̣ĂÈ߈ÙÚ©¼ÈÙù×Ó̃ơÔÙÜÏŻسȷÜƠơÁƯ·Ó ¥0×Üù¿Å¹Úùơù¿ÑĂÂÙ¡ÔÏÔ›Ú“Ûß³»Û«‚ ½9ËØ÷ˆÛ«‚ ½9ùô×ÜÍçÚö¨¼½°»ăàÙ½™‰kß [ïS±»ÿ¯¶ù×¼€ăˆŸ;ÏÚ÷Á ÁƠÅØÏÄŸÈÉ̉‰»˜"ơêƠÅÓº«‡“Íj‡ŒÙ¬¿†Œ£ä¡ÔăˆŸÛ¹ơèÅ­ˆ¶ơꘉj̃ZîS™‰kß [ïS˜‰j̃ZîSßÁ±»©Ó߈ưÀÁÓă‘·÷ÁßÚ™‰kß [ïS§Øù×ăˆŸ;«Ôù×Ûº‡­Ä™Óơêùê‡ÇÅÏÔÍË)éÛ9¥ƒvƠÑÓ«‡“Íj›¾µØµØ+ÏÔ½€³çÚ™‰kß [ïSĂÙ™‰kß [ïS…ƠÈĂÁ ×ƠÍƠç̉Á½Ï̉±»¹Ú¿¿ëö˜‰j̃ZîSåĂ¿‰™‰kß [ïSöÈ—Ó½Û«‚ ½9µØ“Æ›‡ßÚ©ØÏÔµØỞăĂ3ƒØ³(ÇÅóğȋǹÚơê9¥‡‡x÷ÁƒvĂ¼µØ½£²߈Ơô¤Ó™‰kß [ïSĂ¼ƯÓ ”½½‡ÚđÖÛ«‚ ½9ÿ¼ßÄÙÁ¼£Ư©‡¥2ßëMëöƒçÔ¡߈ù×÷Á­Öëö£äÍÓ‡߈åÁ®Gøщ¼çµ²«Ô×ƠÏÔ™‰kß [ïSù×ÀƯùט‰j̃ZîSĂÙË¿çÎ߈ưÀƠ´˜‰j̃ZîS̉ºÏ̉ĂöÁ“ÆÛ«‚ ½9¾߈ר½é‰ñ5ñ·…ÛÅÀ½ơĂ©Óô‹ÇÛˆ§À—¶å̉ “¹ƯNƒ±»˜êèäíÖñÖ¡Èù׺ûÖÏÔ¿Ưù×ËÇÛ«‚ ½9™‰kß [ïS™–ƒˆÄô­€÷‡¥̉°»™¸ÚÙ-Áµ³ÏÔ©ØX«‡“Íj¹Ú¡»ÏÔÑÓ Ơ‘ÆÓºíơ›Áÿ×ăˆŸ›¶éívÏÅœ‡Óê׿8«¼™‰kß [ïSƒv¹£±»ùê¹Á£ä™ơ›¶é©Ơív›¾«‡“Íjƒv‹ÜµØƠXí—GµØÏ̉™ÁއÑó9¥‡ÛÇ߈߈Û«‚ ½9ù׫ÔÚº‹Ç߈›¾½ÓÆœ‰¾Iù׽ǻ¹½©ÜÏÅÏ̉°»±»¡ÔߌÛ,µ†ĐÓ×$×¾·Ó ¥0›¾ùê×çÚÏŽª‡’̀jÏźyÄÏÄƒĂ¬ÖÙ½Û«‚ ½9ºÙŒë*«©‡¥2ßëM—¶̣±»ưÀëöëöµØ₫ÚפØl£»§¹öÁƯåÁÍӳț¾¹¾Óºá¬œÔ‡ƒ›˜êèä§Ơ«ÚßÁù×ùׯ«‡“ÍjÙâăˆŸƒÖ߈ÅƯ«‡“Íj™Û«‚ ½9¼ íêɇƒv¥̃ù×™‰kß [ïSũةØăˆŸ;µØ¡Ơ¥Æ9¥‡ù×Ư½¾ÙăˆŸÉ¨¼ÍË)éÛ9¥÷Á‘Ó«‡“Íj‡Ú́v߈™‰kß [ïSÁñψ9¥‡ëö±»ǼăàÿÚÖÆ™‰kß [ïS‡µØ¡ÈÙë·‹¶‡Ö8æäÁ‹ÛÛ«‚ ½9ųǗăƒÚólj¿Iù¿Ѷ Ơ"²ØÅôÿ­¾áêíÆơºÛ«‚ ½9›¶é…ؽ¡Ô‚ØƠׯÓùׂvëöÛ«‚ ½9ù×ß»û«‡“Íj»ç¹Ú·‡‘×8çÛ«‚ ½9Á—ß»û™G½̉߈ˆÅ»›¾߈ï ÛÄÓơÔ¼|ù8 ¤‡ Ö™‰kß [ïSƯÓ §Ó߈½ö¶½“ǽ߈ăÛ«‚ ½9Ô­ÅơĂö¥ØùêéÔÅÓƒvï³2Ó‰»ÇÖ±»ÅÓ«‡“Íj±»×·ÔăˆŸ“¹ƯN«‡“Íj·ô¹ÚÙRƠơÔ›¾›¶éÅ–Ï̉ƒˆ½ùד¹ƯNщƠX«»߈…ŒăˆŸ;kœ}¯Èá¬Û«‚ ½9ơê½ÂÙ÷Úù갻׿8ĐÓ߈êö«ÔÅÓçÚ…̣ĐæơÄœ‡×Ó¤ˆ\0çô±»Ä Ù߈ö“ÈÅÄ¾Ă¼´ØăˆŸ;ẳÏÔÏÔ±̉ÑÓÍÓŸ¾ÁÏÔ¶ÅÛº…Œ±»Ụ̀…öϵ†8 ¤‡ Ö›!Ăï»Å9¥‡×߈Ç ưÀ±¿Ø̉î½½°»ơê˱½ưÀùשÇđÓ̃ˆùæăˆŸưÀĂÙÅ™ơ¿́å‡ă»8¤‡Ö ÍÄèêíêÙÚÛ«‚ ½9Á̉ăˆŸ;k¹Ú¹Ú±Øö½·Ô¡öÁ”Û«‚ ½9Ÿ¾Û«‚ ½9ù×ù×9¥‡ª—ăˆŸÿ¯¶Ѷø¼™‰kß [ïSÎÅăˆŸ;£äÛ«‚ ½9¡ÁĂºăˆŸ;k¹Ú¨ÓÍăˆ›¡•½ͪÁăù×’½Á¼Û«‚ ½9ăˆŸ•Œÿ¯¶©Ó›v—Ó‚ÖÛ«‚ ½9ívÛ«‚ ½9™‰kß [ïSµ.¥ÙÛ«‚ ½9ш½ØƒvÁÓ½±»ç'ר‡ÛÙ½à†ºø×ÁÍƠ‡Úçỗˆ»¼‘ñÓ­Ä®GøăˆŸù×ơÔÏ™‡Á‡é/×:ƒÚ¡È™é™‡†× ÏÔƠß»ûäÁAÏÄ·Ô‡ºĂƠ­½œÅôöÁ¦Ó§Ó£Ø±»ÓØö½€™ô«Úëö½Ûºâˆ:ÍƠ·Å“½§Ó·‡‘×8ç¡Ôɇµ.¥ÙÉĂ™Îâ¼9¥‡ñÓ›¶éÙÏÅÏÅßÁÛ«‚ ½9±»ù꫇“Íj׿8Ë¿ù×ÁÚÚÀ›¾£Ø©¡ÔívơÔù׫‡“ÍjµØÛ«‚ ½9•½’ÇË̉ƒv™‡Û«‚ ½9ºÏÅÆô›¶éˆØÏÔÇ™×߈Á¾ëöëö«‡“Íj™‰kß [ïSÚ×ÑÓù×½…½™‰kß [ïS£Ø­½¼µØÁƯ—¶È +9¥‡×߈ĂÙëöÜÓ Ï̉߈›¹ëö߈ÿÚÏŽԻYÍßưÀƒvăˆŸ;k›¶é߈Û«‚ ½9½ÅûăˆŸéÓ›¾ĂÈÛÄÓÏÅÏ̉Ù½ƒvµ×Áăùׇñ5‡Œå̉ ƒÚø×ơœÛ«‚ ½9öå×̣ƒvù׿‰•Èû›ÛÄÓÏřӕÈû›ÏÄ›¾­˜‡ÂƠÛ×߈»ÅùסƠÍÓéºăˆŸ;—–™ÁÇÖÁƯѶ÷Á“½÷nÛÄÓ£ä8¤‡åÖ›¶éº½ù×§ÀÜ©¾¡ÛïÚ‘÷÷ˆ¿®éăêĂÙ«‡“ÍjĂº߈±¿ª‡’̀jáêƒv‚ÖÏÔÇØ÷Áë×ëÔ߈ƒĂưÀûÓ°»¹Ú£ÔóÂѶ™‰kß [ïSđ‹Ü÷ÁǺ¡ÈÏÅ×ƠÁƯăÁƯº»ÓƒÚ£È™ëéåÏÔ¯Ơơê߈ƠºmñíÈƯå̉ °»Ó¾₫®¶8¤‡™Á9¥‡˹Ó¼£Ư¿»†ŒË¿ëöơÔ±»÷Ô‰¿I…Ç÷Á¬ÅJåÁßÁöË̉ÏÔ©‡¥2ßëMÅÔ߈¿»Û«‚ ½9ëöĂĂ ›­±àéMÏÓÏÔÛ«‚ ½9ĂÙöívă»¯¾‡xÊÈ99¥‡ơØÛ«‚ ½9³öăཀŸƠív½§Øôµ†íÚ™‡ÿvßÁÿ¯¶±ơèÅ£ÜĂ»ØëöÏ̉ăˆŸ;å̉ ÷ÁÇØ…ÖÙÅë¯ÈƒØ¡Û±»å¹ùêêöø×¡óÂơĂÿÚÖ¼ÍÓ€ë§Óù×Ù½«Ô©ÓÅëö¡‡ŒùꂽíÖ¶«‡“ÍjϺ›¾×¿߽¡Èÿ×ơÔ›¶éï³2«‡“ÍjơºĂÙ«Ô€ºÇÓƠÛ«‚ ½9߈¹ÑĂÛ«‚ ½9©Ó±»á¬߈÷‡çÛ«‚ ½9߈°»±»Û«‚ ½9½ßÖø¾ù׿‰¡Á…ô×Ơ†7§j˜‰j̃ZîS±¿Ï̉Ơ±»“È®Gø߈ëöµØ›¾}å̉ ÏÔÏÅ™‰kß [ïS™‰kß [ïS½ç8½±»…ôïÅüÓ±»™‰kß [ïS—¶ؽâÂ3‡ŒÏÔỞá ½́£ÇÏ̉ơÔÿÛå̉ ÏÔ©&à 3̣;.Τ¦ÿÆ¡ÙÜ߈öüɇ™ÔÂÙ¡́·‡‘×8ç¾ß½ơî¡Á™‰kß [ïSÿ¯¶9¥‡åôƯjÇÖ¥3«÷ù×§â§Æ¡Û©‡¥2ßëMĂȃêÑÀƒv¶ƒ½¼ ûØô»›¾´ÀϹÍīԱ½±»ôÇÇăˆŸ›¾ù×»¼‘«‡“ÍjÙŒë*«ƒv߈ûÙËǹګԺÏÔÚ×â»¶‰¿IÁ̉±½™ôäù×ơêăˆŸ;ù×÷ÁÙŒë*«­ˆ—¶¼ôù×ưÀù×Áí8¤‡¹º…Ô—¶ßƯ«‡“Íjø×üÁ™‰kß [ïS™‰kß [ïS™‡³­ÄÖÆăr—»ăỡˆ¯×î*ơê£Ơ÷‡ÏÄ«d¡Ô›¾ơêÑÓ·Åù×µmƯÓ Á‡é/×:ÁÛÑĂô·ºù×½¯È­ôù×Á!ăÇí±¿å—»ÎÔë¼½¹ÚÓˆ•=‘Ưå̉ ³¾đÚÛ«‚ ½9‹Ù9¥‡ËÉ9™‰kß [ïS¬È#ÏÔÙŒë*«ưÀÑÓ×̉ù×±»ßÄÙ´ÈơêÅ»Åô½ÔçÚ‚v ߈åÁÑ·–¦̀»ÇuÁá “Æù×ỞưÀ½«‡“Íj©‡¥2ßëM«‡“Íjä̉  ̉ÅÍÄù×ú̉ñÓƠÛ«‚ ½9¥ÓÅ–ăˆŸăꙉkß [ïS‡xù×·–ởơèÅ߈ßÁÎÔ#ÄÀÇÖăˆŸ;kơÍÄÏf“ƃv…¾èn™‡ÛÆåĂź¨½ßÄÙ«‡“Íjƒ½ưÀ’뫇“Íj÷Ú‡ŒßÄÙĂÙ™‰kß [ïSÓºé‰ñ5ñ·¥ÄÅăˆŸ;¥ØÁÀáê¸Úå̉ ÅØ±»ëöéºăˆŸ;ø×íÆׯÓ¹Ú³ºó%ÿ¯¶ÏÔÍË)éÛ9¥½Ø#ǺÛ׫‡“Íjå߈ÙÚá=½˜Ô ûÙ½©¼ÜùêĂÙÛÀ³z%óÇ߈çÚưÀĂÙ÷Áơêáß±»ºÂ×¾°»ÏÔÛº…»¥‹Û«‚ ½9¬Öô꫇“Íjÿ¯¶‚v¥ºđÓÏÅŒĂ +êöƒ₫®¶ÏÔ¿ÅщÙ½£Ë%Áƒ‡éê±»·‡‘×8çưˆßÚÁÙ «ù×™‰kß [ïS«‡“ÍjƠÿÚ§ÔñÆËDZ»¾çôóÔϼåĂĂƠùơ¡Ç½©ÓăˆŸ;kº«Ô½ôöÏԆǫ’€Ơ¿àăˆŸ·‡‘×8çµÈÎÅ÷Á›¾߈ĂÙÍË)éÛ9¥¼ï»ÏÔĂ¼í—G‘ÚĂƠ«ÔÚÀ™‰kß [ïSÁĂ«‡“Íjª»¸Úéæ̃ˆĂÙ¡Ô×ܯÆăˆŸ³Âù×ËÇ«ÔÛ«‚ ½9±»±Áß»û»½ß»ûщÁËÑÓ“øÛ«‚ ½9ú̉ ĂĂúÓºăˆŸ;k»Åׯí$¯ÈÎÅÛÀù×áÅßÖ«‡“Íj›¶é¶Ô±»óÇíØÿÚÔXÙ½ÛÀƒ˜‚±»Áñ÷ÁăˆŸ8¤‡ÛÇ«³·‡‘×8çϺ½˜‰j̃ZîS«â߈í‡ÍÄÙÚÛº±»ĂÙÅØÇÖ¯¼÷ÁçÇÖ½¾‡«‡“Íj‘®…‹߈ăˆŸ¾¹ ÷‡ÓÅ…»« ©ƒ»5ƒví̀¿́‰Ô¾߈¹¼ù×Ï܇¡%å̉ ½ßÁĂȱ̉ŽßÄÙ½«‡“ÍjÏÔñÖÛ«‚ ½9Û«‚ ½9ÍÉ̉½ù×ÙÅëù×¾́§Ó½ÏÔÏÔôạ́áƠï³2÷ÁÏÄĂ¼ßÄÙÔºl•îơĂÛ«‚ ½9±»Æ™‰kß [ïS±»æØ ¹Ú§ÔÉĂŸØ±ëØ±»ăˆŸëö¥‰ÍL…ù¿óÔĂé¾ơêÇĂÙ̉¶  ºßÁí~¹ÚÏÔ¼Áçß_ĂÙÙuĂèɵØƠ½‡“ÔơơĂ¿́Ă¼·ÅßÄÙ§ÔóÇ߈½ÏÔ¿‰º™‰kß [ïSùסÁ©ÁĂăˆŸ¡ÈéÓóëöŸ™‰kß [ïS˹ŸØĂ˜‰j̃ZîSÚÄ̉ƽ9¥‡¡»ÎÔïÅÓÿÛ‡ºë×ÓºǼÍË)éÛ9¥öÁ÷‡½ÔÿڡȵØX£»ÿº“ºÛ«‚ ½9ù×µù×çÚÑÓÅÓëöÅŒ₫ÏÔ­¾5™‰kß [ïSÛ«‚ ½9÷‡¹ÚÿLJº‡Ú™‡ơêǺăˆŸù×ăˆŸ«‡“Íjó^ɱ8¤‡öÿÚ™Ă¥̀·Ôÿ¯¶±»‰à±»“Æ™‡ÊӫȯÈׯßÚ™‰kß [ïS‡ºÛꘉj̃ZîSÅØ¿‰½«‡“ÍjÉ€­ÄÏÔŸ\Ăº—ˆëö¯̃Ơ¨ºăàٽ麱»Ù½ÙÅëÏÅ߈÷ˆµØ¹̃«‡“Íj‹ÇùåËƠ±¿¶¡Á·Èùט‡ưÀơèÅ÷‡Ÿ}êöÙÚêö›¾™‡¡Ûù×ÙƠá=Ç»¶ÏÔĂÈéÓ‰ÁơèسדÈܺ›¾߈“Æ₫®¶÷Áƒ½«Ôûر»¢ä§ô÷ˆ«‡“Íj¹»ëö‹Ç™‰kß [ïSι ÏÅ÷‡«»µØ©‡¥2ßëMÅÔÙëöíÅ­Ä©¼ï½¬ÓSáêÔå»ï½³ÇíÆÛ«‚ ½9ÿ§áˆÁ0qăཛڰ¿ù׿‰›¾Ù×éêź9¥‡ÉĂ™‰kß [ïSƒv¥Æ½€ÙÚỞ÷Á¾Ø÷ÁçÚăˆŸ›¶é÷ÚÅØÍÓ“ƠĂÙÇÖĂÙù×±»¡È9¥‡Ù½ƒˆÏÔù×ÄÓéêë˜ưÀơÔËƠ¿º±»ĐÓÛºư~ÍÉ¿IѶ÷Á‡Ûª»ÏÖ«‡“ÍjÛ«‚ ½9¡Á‡Ç„ÏÔáèêÖ¹÷ÚÙ½±»9¥‡çÀÿ¯¶ëö̃ˆ‰4ÙÈ̉̃ÄØ9¥‡—¿ïD™‰kß [ïSĂĂƒáÛ°» ±”ơê›v™‰kß [ïS±Á߈‘ŸĂÙ߈íơËÇù׺ø×¿ôÙ½Á¿ßƒvÂÓÛ×àêù׳¹Ú߈ƒ/©Ç‰ÛÏÔ“¹ƯNù¿ø×ù×ă­ÓºöÁ¹Ú9¥‡‚v¡ơèÅ»Üá 8¤‡Ö±»ëöƯÓ ¹Ú‹´“ÇÙñÓ˜êèäù×ÿÁĂƒ¾‘ƒvÎ̉ø×ơ$ûƠëơÄ« ©ƒ»5™‡Û×ÿÚͼ¿º÷ÁåׂváƠÿ­́v˜‰j̃ZîS³Æëöơ»ÛÅö™‰kß [ïSÛ¹˜‰j̃ZîS󓫇“Íj9¥‡·Ôăơöøê«‡“Íjù×Û«‚ ½9ñÖÑ`ăÇíÁ̃– ͼÓ…ăˆŸÙÚ½Ô½§ôêöëöƒv×Ü•½«Ô₫®¶ëÚÏÔăàưÁÀĂ‚ˆâ»ív§ÔỞ¬¾жÏ|­Ä–ø ̉Ø›vœÁó ẳ“¼«‡“Íj°»±»‘Öÿ¯¶½ơÔ¼°êØóƒvÍË)éÛ9¥³—¶í‡ăºÙڵرóơê¢ä§Ó„Øëö̃ˆêöÿÜË̉9¥‡Ü÷Ù›¡ëöÿÂë³¹ñÚÿÚ¹Ú©¥ˆ]1ơèÅâÁ«‡“Íj›¾¥ËƠ½ù×ÏÔéÓ«‡“Íj× ä̉¨ØÏ̉ăˆŸÜ¿‰‰³ÂñÓáê½ÁÛ«‚ ½9߈ÓØñÆåŒ¿N¡ÛưÚÅÓÚª‚ +¼9ÔŽơÅÔÛÄÓĂ˜‡ÓÅÍÓÅØÍÇׯ·#½ÚןƠ™‰kß [ïSø×™Á¢äăº÷Y™Ó¹Ú߈®×î½Ù½¶ưÀÁăˆŸ;kÙ»yëÓù×™‰kß [ïSÛ«‚ ½9½ôƒŸ™‰kß [ïSÅ·°»ËîÓØÏÔÙÚ½±»ù¾Û«‚ ½9ơꙉkß [ïSܳjĂƠưÀ˜‰j̃ZîSåơÛ¸¿‰ơĂÏÔ³¥ÛŨ߈Û«‚ ½9™© ÏÄƠÓ•{¿ñçÚ«‡“ÍjÛ«‚ ½9«ÚÅÑÁ¼ưÀÅÓĂÙ«‡“ÍjÅĂß̃Ž×ùƒvËƠ™‰kß [ïS·ÅëÔăˆŸñíÈ÷ÙÍÓáØÙÚÍË)éÛ9¥ÑÓÂÙ·Ô³óÇŸº߈ăˆŸ»ÁÍÓÑ´†™‰kß [ïSóĂÙǼßÄÙĂºƠ½µÜ•Œ±»Û«‚ ½9Ù½™‰kß [ïS޳™Ô÷ÁÅô“ƠăˆŸ;ó#Û«‚ ½9‡ºñÚ±»å¼ ÁƯƯÓ Ÿ}óÂñx½€ûÓÇÖñÆÅƯÚÂÙ±»á¼½€£ä¿‰›¶é÷ˆ«‡“Íj«‡“Íj™‰kß [ïS±­ÄÏÔ‹ÜÁƯ˜‰j̃ZîS«âÛ«‚ ½9ÏÔܵ.¥ÙÑæóǘ‰j̃ZîS÷Á¹Ú™‰kß [ïSơꕌ¡Ô9¥‡«‡“ÍjƠׯÇÓ«‡“Íjßç©ÓƒÙÚÛÓ·‘ËÇßÖ×Ơ†7§jÿ¯¶ôŒƠ +¼߈™‰kß [ïS±»›¶é¦ô¡¥Èùë÷$‹Áå¼ ÓÔơê×hù×¾ù¾™‰kß [ïS¿‰°»éÓëö‹¾±»ëö«‡“Íjç̃“¹ƯN߈Éר߈ù×™‰kß [ïS­ÖÙ̉½¢ÇăˆŸ½À¼ù×›¾ºÏÔùê§MÛº›¹רù×щ•¾ƒvä̉ƠXÅØÙ½©Ó±»™‰kß [ïS¹Ú¶ + +ÇĂ™Ă½¡Èƒv÷Á›¾í—G«Ô…=ù×͇ñ5Ù×Ï̉ÏÔ±»¡‘ăơĂæÚçëöÍēƢØĂÈÍ­HƠơÔƒÖ÷‡óǾߕŸ}›ÚÑĂÏÔ ÍƠ¹Ú™‰kß [ïSï½ù×µa«ÔăˆŸ;kÙ×ëöŽƠ»Å°»Ù½«‡“Íj½ª‡’̀jÏÄ÷¼Ÿè­Ä›¾¶ôÛ«‚ ½9¹Ú‡Çđ¡ÁăˆŸ;™ÜÅÓ¡Û߈—¶ÁƒÚËÉ9‰ÇƒƯ³û%×·ÅÏÔ—»ù×ôê8ñ¤‡ñÖ°¥‰ÍL…ó|ù×ơꛡ»Å¡ÔƒÖ¯ÈăˆŸºï»™ëéåÑÓơÄÛ«‚ ½9‡Œú̉ëö‘Æ“Æá ǽưئÂî»÷‡…£­ÎÔ•ù«%™‡‡×Û«‚ ½9ĂÈg¹ÁĂ¢ä«dÏÅÔơêö ™‰kß [ïSŸ¾çơØÏÔ¶Ô󶡇ٽƠX»ñµØ–Ó÷ˆÿ¯¶·Ô¶Ô½ëöÍ­H‡ÔÛ«‚ ½9—¶ø×ƒˆ³ƠÓÔăˆŸ;Ÿs™‰kß [ïS™‰kß [ïSÏÅÔ£ËÏÔÏÔ·‡‘×8çăˆŸ̉̉™‰kß [ïS8 +¤‡ +×Ûơêàêƒ×ÿ¯¶áº«¼ăˆŸơÔ±»­‡ÓºµØ˜Á·‡‘×8çÁ¹±»ăˆŸ±»£»¡\À²È·‡‘×8çÙÚ½½ÅàÏ̉ÏÔÛÇ®G ø “Ơ—ˆßÖ©ÓöÁăˆŸ¾˜‰j̃ZîS©¼ëöáê—ÓÛ×á=·ØÖƃֵ¿§˜‡í—G߈Û«‚ ½9©vƠơ׿8ùëŽï‰ăˆŸ;Û×ÏÔÙ½·‡‘×8籿«ÜÅÔ·¼Í7¹Ú©ØĽÓăˆŸưÀƠÜàê±»³à«Ô«‡“Íj—ˆ­R‚vÈÁă½€߈ÑÓ™‡ÆØóÇ×¾…ÔÏ̉ÄÓăˆŸ;ăˆŸù×Û«‚ ½9½€½Ǻ™ÓăˆŸÁƯÚÛ«‚ ½9º÷‡ùơ©Óé‡ûÍÓ£đĂÙÿÚ²º̣ù꫇“ÍjÑÓ‘¾€ô·Ô߈ö«»ÁĂÖ)Ô†)6)¦j)ôơèÅÄÓZÏÔϱ»¡»ŽçÚñÚÏ̉ù×áÀÇ̉ÑÄëúÛ«‚ ½9©‡¥2ßëM™‰kß [ïSÇØ¡™‰kß [ïSùơ«‡“Íj÷Á™‰kß [ïSÍË)éÛ9¥ÅÄƒÖø¿Å»ƯÓ ă»ëÚ߈·í÷ÚÙY­Ä¡»Áđ¾Ù̉ÙŒë*«ƒ«‡“ÍjÑŦԃ֫ºö‡ï‰ÏÔ߈ưÀ÷¼±»âÁóÇ×Ü¿́÷¼Úª‚ +¼9‘¾¡È¥¾Ùñ‡ÏÄ•Œù׃vÿ&Ở…Ø߈¹Ú½ĂưÀ̃ˆ±»ËƠƒv©ÇÁƒÁÿ¼ÂĂÁƯß»û½“Û“Æ·‡‘×8çăˆŸ;—¶ÅÄù×ưÀ‡ÚÍÄ¥àƒvëöIåô߈ƠÏÔÏÔăˆŸ;߈ƠÚñÓÛ«‚ ½9ÏÔÙŒë*«“Èù×ÛÄÓùêÙ½ù×Ëå»À¡Ô±»ăˆŸ™‰kß [ïS¥Øçm«‡“Íj₫Ç›¶é×¾Û«‚ ½9›ƯñÚæ‚¿‰ĐÓÛ×ñÁ«»›ÑÄëëö£ØÁƯƒv›¾ß»û߈ù¿å̉ «Ü¹Ú·‡‘×8癉kß [ïS›¶é‰ÔĂϼç½ÛÄÓÎÄ߈÷ÚÛÇ—¶ív«‡“ÍjöÁ‡Ç”°»ÿ¯¶¾\ƠÅÜÚÄ̉«Ñ÷Á¡ß9¥‡ÅÔ«‡“Íjù×߈ù×›¾™‰kß [ïSçÇó×ÍÄ™‰kß [ïSßÏíê9¥‡ñÖéê£Øí–GĂà½ƠÂÙ—Zǽëö‘Æ̃ˆ©Óơ골¾™‰kß [ïSÁ̉¥Óƒ¾‘ăàùש؃vơÔù×—ˆ½™‡—¶ùê¸Ú”ÖăºÎÔ×̉Û×₫%ƠÓ̉À9¥‡ö¹Ú½ïÚ¡Ô‡Œ¹Ú±»ƯÚëö™‰kß [ïSù×®GøĂĐ×iÍƠ“ÈÙ½ä̉ơĂ·Åù×±»ăˆŸ;ŒüM‡9ùô«ÔĂÙùׇñ5¿‰Û«‚ ½9ƒÖÇÓëöù×ù×—¶ÿÇĂÙ­½¼ÅÄÀ×Í„½“È•’߈ƯÚÑÓ߈ẩå̉ ±»ï³2ăˆŸö™ëéåÁăåô“Ơƒ¶çÚÛ«‚ ½9«‡“Íj¶½ôºÁóÇ÷Á· éÚ±»âˆ:½€¬Ö1ÜÓ ¡ëÁ¶‡Ö8æÏÅÅÓ¡Û¡Ư™‰kß [ïSç½­ØÍƠơÔăˆŸ;«Ôù×ƠÚª‚ +¼9Éåñƺÿÿ¦Ó)âˆ:‹ÇăˆŸưÀÛ«‚ ½9ÚÀ½™‡ưÀ¡ƯÓ ר™‰kß [ïS«‡“ÍjûÓóÔÓº½ăˆŸ;Á|ÏÄ Ëûơê߈™‰kß [ïS¸ÚƯÄÇÖ×܇¹×ĂÛ«‚ ½9¡±¿˜‡ ¾÷Á÷‡߈ăơă»­ÄÙÅë·Å«‡“Íj™‰kß [ïṢÇÁƯ•Ó:Û«‚ ½9ÍÄÅÓ±»ÅôÎÔßÚÇÖ‡­Ä»ËÇ©‡¥2ßëMó^ƒvóϺ÷‡ÎÅÄ‹å‡ÏÔ½ăˆŸ;ߌÛ,²ÂÿÂÇĂϺ½§Ơ߈øơñÓªÅa¹Ö©¼«‡“Íj·‡‘×8çư§‡¾—ØÜ«ÔÛ$¶Ø£Ôµ‰ơٽٽéJé‰Ó5“gesÁű»Ç¡%ÿ$ËÉ9ƠÅx±©‰çÁíßÁƒ(™‰kß [ïS®Gø‚¾£Ø™‰kß [ïSêöϺơêß„ñÁÛ«‚ ½9¡Ó½ûØ¡Ù×Û׎¡Û­ó™‡§½÷̣÷Ơ÷Úƒv¿‰Ó´Û×çqÛº߈ăơÁ«‡“Íjª» º‡Œưˆ”Ü¥Ï̀Ê)èÛ8¤×¾“‡«Ô½́¯ÆœÜéßͽÑæùדǽàÛÄ¿¹ÁƯ¥ˆ]1ÏÔ¾ÑÄë߈›¾ÿÚÊÇ'‡Œ§&³àỞ½Ù½ÑÓö¾ơèÅÑÓ‹ÓÙ½ơêÉÖÛÚÙÚóDZ»Ï̉·ÔÅÓÛ«‚ ½9¥Ä­Ä“ƠÉí½Øùׇº¶‡Ö8æ̉¥½ä̉™‡ÏÔÁä‚ÿ¯¶«ÔËœ¨̉§ÛËÉ9Ë%ɇƒÖÏÅÑĂ«çú(ÏÔ9¥‡ăˆŸ;‰Á™ØíÆ»Ø8¤‡Ö±»ÑÅøê +ÏÚ£ôÇâχ•Œ·ÈăêÉó"¦ôå̉ ù׃ˆ߈ö̉̉ ÛăăˆŸĂº˜‡ÿÚ̃»úÙŒë*«à ơÔ匿N—§«Ñ±»é“̉™‰kß [ïS߈Å»߈ÎÅŸ ä̉ơÔÛ«‚ ½9âơ9¥‡±¿™Áùרô½ùש¼Ú׿ƒ¡ÔѦ¹àơêéJé‰Ó5“gesÁÅÙÚÂơêáƠµØÑÓ߈ÅÄñÓçÚ™‰kß [ïSÅØ«»߈áS™ëéå̃ˆÁỪĂé׸ÚëöăˆŸË̉ëö߈°»ÍÓ›‡ÍË)éÛ9¥«ÔÏÔµØÓº«ÈÛ«‚ ½9¡È•Èû›˜‹­v‡º÷‡Ûº«‡“Íj›¾©‡¥2ßëMØÚØƠ˜‡¡Ô³‹ÈÑÄë±»àƠ©‡¥2ßëMăˆŸ¡́œ‡±»ù·x™‰kß [ïSđÖ‡xñ×åĂá ×ÓÑ·¯Ûº½ÑĂù×釫‡“ÍjÏ̉ÏÔ½€‹ÜÉ…Ă ©‡¥2ßëMèêÓỌ́½ÿ¯¶›Úêö›¾ÏÔ¢»B‡“%ÏÔ«äÓÓ±»©ÓÛéJé‰Ó5“gesÁÅù×ă¼·Ó ¥0³ôÓ¼ÙÚÏÔ¹Ú‡ëÚÏÔ°»¼ô«ÔÁƯÑÓøê9¥‡“Ơ«‡“ÍjívÙ½™Ó—»‹Üº›¶éơºÏÔ›¾•×ơº£ÓßÚ¼ËÇç̉ưÀ‡ƯăơµÏÅƠăˆŸ;ÿÚ±¿߈¹Ú½€ÿ¯¶߈›¹¹ê匿NÜĂÙ߈£²Ë̉߈±»å̉ ÏÔÙÚ‡ºŒº‚v½9¥‡±»ÍÄ߈ù×±»ÅÛÀ¤ÈăˆŸ;k×Ơ±»Ï̉™‰kß [ïS‡¹Ú½€«‡“ÍjĂô«»Ù×ëöÓÓÙ½ù×÷Úº“ƠÛÀ¯È©Ó·Ô‹È™ÓׯµaϹ߈åÚ÷Ú“½“Ơ™‰kß [ïSÚ×½Ÿ\¼éêÛ«‚ ½9Ž«»ù×ÍÁÙ¶Å•{÷Ú™‰kß [ïS‹ÓͽĂô¹ÚÛÄÓø×̉ÅÍÄ™‰kß [ïSÿ +ÏỒĂ½ëöŸ\¹ó™ÔÙÚĂÈ¡Á±»ù׫‡“Íj­Ô³ØÇÖ«‡“Íj·ô‡Ç‘đÿÚÛ«‚ ½9ưÀÓѶÛ«‚ ½9ù×ÏÔÓųÚùâÇÖ«»µØƒv¶ô·¼Í7°»ĂÙ½Èμ¡Óù׸ÚçڋǧôÑÓ߈÷Ô§ôÏÔïÅóDZ»ÍƠÑĂ«‡“Íj¡È½ÏÔƠ£Ç°¾­½¼Ï Å«·3uU߈¿‰‡Ơ'Û«‚ ½9ÇÓÓ¾³×ă»Ïű»×¾ƒvÅÓ‡Çëö̉̉ÿÚĂÙ·Ó ¥0Áă“áĂƠô½Ñơê÷$¸ÚăˆŸ“ÆÏÅ‹Ç߈ǼщÏÔ¥ˆ]1«ÔáØăpI߈™‰kß [ïSù¾̣ǧÆửˆÇôăˆŸ;k©Ơù×™‰kß [ïSÙÚÿ¯¶ ƠÏÅ—Ë߈÷Ú›ÚÙ½ëö¢» +§ôªdƒvÍÓ¹ÚĂȪ‡’̀j߈߈ß»ûׯơèÅ•Œ¼ÛÔXƒ½ÏÔ¥µ›‡ăˆŸ;“ƃˆơÔç½ÔÑĂ­Ô©÷¯×ûÓ÷Ÿ¿ÙÎÄÏŪ¶2tTä׫î9¥‡×߈ƒv¿‰ëö¹Úư÷ÁËÇÏÔ±»É̉™‰kß [ïSÏÔùêÁÓ„ψ½ÓÅÏů¾‡ù~ơ莀ơ°óÇ–»‡¿ăˆŸ;ÿÂ߈¡Ô¼Ø߈ĂôŸ}ù×¶˜‰j̃ZîS§ÔçÚ•ÇÛº±»ơêΓ¯¾ƒvÂɇï½ĂÙ±¿«‡“ÍjÙÚªÚÛÄÓö™ÓÏÅÙ½߈ÏÔ¶¯±»‘ñ³½éº¢»©Ø«Ôù¿«‡“Íj…ôá Û×Û×ăˆŸ;‚óË“ +™‰kß [ïS߈ù×Ç™‰kß [ïS™‰kß [ïSÆ߈¿‰Ÿ}Áă·¼Í7•{%ưÀª¶2tTñÛé߈™‰kß [ïSĂôÑÍï½Çô›¾“Ʊ»ï»ÏÔ½‚¾çô³ÇÛ«‚ ½9§ØÑÓ‰ÁѶåô±»µØ‹Ô±ÈøêÛ«‚ ½9ÛºưÀ¹ÚÙט‰j̃ZîSψÛÙÚëöÏÅ‘ơ…ØăˆŸ;Ç%ëö«‡“Íj›¶é›¾« ù×ù×Ă߈½§ÖŽÏÔÙŒë*«—¶ëöăˆŸÛ«‚ ½9öÙÏÔ‡ºÙ×›¾ß»û«ÓÓØÅùדƠăˆŸ8¤‡§ôơÔÏÅÙ½ƒˆơèÅíJ™‰kß [ïS›¾¹Ú¹Ú½±ëثԪ¶2tTóǽ«Ó·̃Û«‚ ½9ºßÄÙï½™‡¶ÜÏÅ«dõ‡ÿ¯¶ívͺçÚÿÚÛ«‚ ½9ĂÙóבÖñÖ˜êèäí¥ăˆŸ;kÏ̉™‰kß [ïSơĂ¹à·Ôù˜ß»ûÇĂ¿ßÛ«‚ ½9ăˆŸ;ï»ù×¾Á|—»Ϲăà™‰kß [ïS9¥‡³¹ÚÏÔ“Ü߈•ù×ăˆŸù×—ˆÍÓÑÄëçÚó«Óç'º߈±”ĂÖăˆŸ;̀ĂÛ«‚ ½9Û׳ȺٽçÚÎÙ½¾ͼÁ ‰¿I—¶©¼³ÈƒvÛÄÓ÷ÁÏÔ¹ÚÁƯ±»ÙëºØ÷ø…Ơå̉ ÏÅ߈ÿ.È™×Ù׃v—ˆ¿ßö§Ô›Ú߈Ù½ù××ÓÙÅë·‹ÇÖăˆŸ;‹ÙĂƠß»ûÎÅíÆÍƠ߈ÿ¯¶—¶ï³2Ø ùê£ä»½›ƒvÔ™‰kß [ïSïiƒØ·Ǿ܇ù×™‰kß [ïSơÔä̉û +½t™‰kß [ïSưÀĂÙË¿™ÉăËÏÔ×Ăï³2˜Ï‹Ü9¥‡›¹´Ù»÷ÁùêưˆƒvÛ¾¾ºßÖäÁ·‡‘×8çỞˆÏ̉Ľ̃ˆø¿÷å5Ó°»½™—¶×Ơ÷ơ±»íÖÛ׉øÇǼ­ÄºÿÚ½Ơ©ÓÏÔóǹÚß»ûÁăˆŸ;k™ÔÇ%Ù½ƯÓ ¹ÜÛ×ÙÚëÚ•%Đˆƒvù׃vÏťƵطŶçÚå̉ –¾߈9¥‡ñÓ¸Á ׯ»ăàÏÅ«·3uUÏÔËÉ9±½£–ñÓëöĂÙµÜÿÚÚ«Ô±ÏÔúÙÚ¶ºíÖ›¾ËÇëöưÚïºá ßÁ9¥‡×Ïű»Ѷ±»Ù½ï½‡9ëö‡×Ó—¶³Â‡º¨¼úØÆ̉Ù½›Ú—º·‡‘×8çÏÄ­Ä£Ç߈µÈ×»½ÈœÓ½Ú×Ϲ¿½ù×ö±»º¼“È߈ÇÖ­Ö™‰kß [ïSƒÖ‰¿Iƒ˜ÿÚØÚù×™‰kß [ïSƒvƯG‹ÙáôÏÄ¥ÇçÀƒÖÏÅĂÙ¿ß«âÆ»½âÄù×߈‹Ü½Ǻù×z÷Á˜‰j̃ZîSº§Ô½ôÙ½߈‹Ç—§Í»Ï̉¥º°»©ºØÙÚ·‡‘×8çßÄÙỞź…Ûù×Û×ÇÖ±́ÁƯ¹ÚăˆŸ;kµØÍñƒvÑÄëÙÚÙ½ÅÔûƠƒvöµØ‰¿IăàâÁÏÔ—Œ¡hÎă“ÆăˆŸ;k±»ÏÔơÔ÷Á‡é/×:ù׫‡“Íj»ØÛ«‚ ½9ȩǫ‡“Íj“Æ߈ÂÑÓåÁ±»Ï̉‰£ØÏÅŸ}ơêÏÔÓº߈µ†­½¼ÅسØÏÔ°»̀ÂĂÙăˆŸăê•Óùêåñ»½ëö“÷Û«‚ ½9Ûכ±»•ŒÛ«‚ ½9©ÓÇâ«Ô¥Ç¯Í±»ÑÓ«‡“ÍjáêăˆŸ;9¥‡­Ä£Ư9¥‡×±»ơèž±»ÂÀơê³±»Œ&ơêù׃ØăˆŸ;ÅÔÔX,ñÓIăˆŸ»½…ƠÛº߈Í»½™‰kß [ïSï½Û×ÏÔ›Ú«dĂĂ ›­±àéMÎÔ¡ÈûÇ߈·Å¤‰̀L„»ÅéÓ߈ÁÿÚß»ûÓű»ÓX·‡‘×8çÎ̉ÏıêĂăˆŸëöÛÄÓ÷ˆ‹Ü¿‰Ê%ù×›¾÷ˆ‚vçڳǙ’ĂÙ½Ûº«‡“Íjëö¢›ÚÎÅùסÔٽٽ¥Ú˹«ÔÛ«‚ ½9ù×°”«·3uU³Ï̉Ù ĂÙ£ä«â™‰kß [ïSÙ½ÏÅưẠ̀Ä߈Ù½ÿÛ˜‡÷áØ¥ØÑæÛ«‚ ½9öƒvô™ëéåùº±»Û×ÔÿÚ¯èO¹ÚíÖ·‡‘×8çŽùט‰ j ̃    Z îS ‡ŒÇֳȃˆÏÄăˆŸ;ĂºƒÖÏ̉ͽëö‘Ó8¤‡á ·¼Í7ĂÈË̉߈ÓÅÇ»íÆÖÛ÷˜ÁÛ±»ëö÷Á‰Ûƒëö“÷"½ƒơĂ¾߈ùê»ØÇ֋ܽ±»¿̀ù׋Üëöơ걇ÏÔ½çÚù×çÚÏÅëö߈ỂÏÅâÂ3«·3uUƯÍË)éÛ9¥¼¬ÄµÛÛ«‚ ½9·ÈĂĂ˜‰j̃ZîSÛ«‚ ½9ÏÔ×¾ÏŪ÷ÅÓ‡;Í̉£äº‹Ü߈ùỡˆëöîDĂƠ÷‡»½™Ô“²ơèÅÁ̉ôÔÙ½ơêăˆŸ;ƒ±»Áۈ˿߻û§Æïô•Èû›ƒv‡Ú™‡ͼ±»ù×ÍƠ›¾Û«‚ ½9߈½ưÀËÉ9ÙŒë*«Ç־ߺ¼Đñ“í—G¼Ÿ}°»ëö²Ú¹̃·§D ±»«‡“ÍjøàÔá=Ù½̀B¶¦D$ $Û«‚ ½9‹ÜøêâơßÁ±»߈߈‘¡ÔÈÙ“Üù×ÚƠ߈ÿÚ¹Úŵ†߈íêÆ©‡¥2ßëMŸ}Û«‚ ½9º¡«»™×½™Û÷ÚÙÚ½Û«‚ ½9Û×ÏÅơĂÏ̉ëĐưÀÅÙ̉¯Üëö¡È∵ثƠŸ\÷ÚÛ«‚ ½9ö¯È«ÛÁĂÁßÁ©‡¥2ßëM¥‰ÍL…é×±»ùדÀ°»Ô]èêñÚÛ«‚ ½9Û«‚ ½9ăˆŸ™ôÑÓ§Ôé¾9¥‡›·Ô¥%œ‰¾I•Œ˜‡±»ưÀÛºçÚĂÓÁÛ‘¾ÙÚ›¾­Ä·ØÿÇÓÓµØĂÙ…°½«‡“ÍjÇÖ«‡“Íj¯¾œÁĂÈ¥ˆ]1·Ô«‡“Íj½ơÔ¹Úù×Ûº¿º߈ùê‚ù×ó#ŸÈ9¥‡ÑÓ̀ĂăˆŸ;”½ëö¨íÖ»ÅĂƠgéÓÏÔñÆшĂºß–’Û»ùq™Ô8¤‡щ9¥‡«Û«‚ ½9%›ƠơÄ›Dáêß»û×ÓÏ̉¡ÈµØçÔ¡ÙÚÉ̉ăˆŸ‡Ú™ÁóǃÔÍÓ߈ǻ۷ôóÂù×9¥‡×ù×áö­ưÁ™ôăˆŸ;ÙÅëăˆŸÿÚÁƯ߈»¿‰µÜ©Ü¾÷ÚÏ̉§ÓÜŸ}©ˆÓ×óÇÛºƠX§º¾©·Ó ¥0óÂÚÚ÷‡¾¹x½©‡¥2ßëMÏÔ±¿ÙÚưÀƒÚ™ëéåÓºưÀëö߈«Ñ·ÔÛ«‚ ½9‡xÙ½ÇÓ‹ÇĂºåƠÏÅù×ƠÓ©‡¥2ßëMÍBùæÎÅÏÔ…»¡ÛÙ½ºÛ±»ï‡ÏÄçµÅÓÛ×Å–Ûº߈àƠÍƠ…ƒAüضƒˆ±»ôú«»©¼²Ø‡ăˆŸ³«‡“Íj‹ÇÏÔĂº÷Á—ˆÏÔÅô¹ÚÓØÁƯ£Ç÷ˆ•¾”ÇăˆŸÇÖ°»•ǶÂçÚ™‰kß [ïS±»¹£½±¿¾ÓØÓºÑÄë±ëحĹÁ«‡“ÍjÏÔܶœ·̉ ¤0ÏÅÓØö¹Ú™‡–¾Á̉ÿÙ¹ÚăˆŸ;k“ÇÙÜ¿ÙăˆŸ;kĂٕܾŸÖÙ½éºÂÙÿ¼ĂÙÛÂå×™‰kß [ïSĂÙ›¾ï²2©Ó¹Ú½Ï™ơÿ‡ù×Ôơ Û«‚ ½9¡Ûû·Ó ¥0™‡ưÀÇĂ¿™‰kß [ïS±½ơ‡ư“߈ÔXŒ½ëö¥Øƒ¢ƠĂø×ÁÙÚëö©ÓöăˆŸ;ä̉ÙÚ±»ñÓëöơÔÎÅÇÅ̉º«‡“ÍjÙÅë©Đ¡ÈóÂ߈±ưÁ±»›¾çÚñÖôê—¶¡ƯàêëöÓÓßÄÙ˜ÁưÀù×ß»û™ÓƠêöö¿Øª‡’̀jù×⻫·3uU«‡“ÍjÄÓ ¹È¶ è ÿ¯¶ù×ï#ëÓÆÛ×±ëØ…»Ơ½ôăàăে¡Èèå̉ ñÓÙÚ̃„³Âÿ¯¶ÓÓ›¶é‡Ç¾Ûº¸Ú%÷‡—¶™Óÿ¯¶÷Ô«‡“ÍjÙ½ăˆŸƒvëÁơê­¾™Ă·Ó ¥0ÏÔº•%ÿ¯¶Ă—Û—»g¹ÚĂÙûÓÛÄÓµßËÉ9é¥Ûù×…à­½¼‡£ä˜‰j̃ZîSÅØù×ơúß»ûÛ×¥‘½ĂÙϺƒvµ.¥ÙÏÔĂÈôêăÁュ؋ٓƠ¸àëö»ØÁ+Û×ÏÔ¡Ô™‰kß [ïSÙƠÓµO¹œ³Ô©‡¥2ßëM‡“Èù×Û«‚ ½9©Ç̃ˆŸ}á ĂÙéJé‰Ó5“gesÁÅÛºÙ«»ơèÅ‹ÜÅ›¾§Ó™®ÓÁ$ÏÔ¶èÛº÷ÔƯÓ ăˆŸ;ÿÂăơᬺ¼·‡‘×8ç°êØ’ëç߈ƠÛÂăˆŸ;ỞÅÍĂ¾Ù½½€›Ú߈ơÔß»ûĂÈƯơÏåß»ûëö›ûEÿÂ߈±”ăˆŸÍ¡ÇØăˆŸ;³ÈÊƠ±»ơóÓÛ«‚ ½9‚Ô™ÓăˆŸ;8¤‡½ϼ¡È߈ƒ¾‘µañÚ‚vù׃v÷ˆÅÄùê¾ß¿ÑÜÙÚÁ(Á¹ï» ËûƠĂÙæÇñƠ‡“ĂÙív˹Ù½÷ˆëöư“ÑÄ뫇“ÍjÁỨÁ±»ăˆŸ;ƒv̀Ê)èÛ8¤¾ßªÔׯ·Ôù×¹Úçô¹Ú“Æ›ÏÅËÇïÀ“¹ƯNƒvÅÓͼËÜĂºñ½™‰kß [ïSÆØỬ×$™‰kß [ïS¹Ú™ôáêóÇÛÀù¿Á“ƒÖïôơèʼnԶtt±»߈ỔĂô‡Ç\—ˆăˆŸ;Ù½ù×™‡ù×ù뉿IÙ½°êØư¬«Ô“ƠÏÔ½Ù½ĂË̉—ÅÙ‡­9ùrå̉ Ø×«‡“Íj·Ô˜‰j̃ZîSŸ Ăô«‡“Íj±»ăàµØŸ Ö¾‡ŒëĂßÚ­½¼ÙÚéÓăơ¡ÈỞ°»ÿ×™‰kß [ïS÷Ú¨¼ÑÓăˆŸ;ÅØĂ¼щ“ÈăˆŸ;ö$ Å¥—»ù×÷‡âÁ ç½é¼ƒvóÖÛÀ›s½ô™‰kß [ïSÛ«‚ ½9ÑÓç$ßÄÙö̀Ç«‡“Íj°» «Ñ“ÈÛ«‚ ½9ĺ³È¼‚ˆƒÖïÁù×ù×÷å5Ó¨‡¤2€̃êL‹Çù×%¿»º«‡“ÍjÚ׉߽Կ‰¤Åク½…öËÓ9¥‡ƯÓ ÿÚ±̉×¾·¸³ôáƠéÂùëÓÅñ‡ª‡’̀j¼ÈÍÓ™‰kß [ïSµØ¼Ù½ÏÔăˆŸ;kï½Ù½Óű»Å©Ç«‡“Íjˆ½FÁÚĂô¡È¬¿$ûÚóÇÙ½…»±»Íà–ˆï½Ữ÷Áß»ûăˆŸÅÄ™‡Á¼¡ß™‰kß [ïS·¼Í7§Ô™¸«dÛ«‚ ½9ĂôÅØơê¿ôÑÓ‹ÜÿÚæÇÙÚÙÚ˜‰j̃ZîSϺYË̉Û«‚ ½9‡Úßçà= ÄÙ½Úª‚ +¼9±»߈×ÓñÚëö†đ5ù×ù×Û«‚ ½9÷Á߈»ØÙ×∾ĐĂ ÉÁƯ˜Á§Ôù×Ù½ƒÔ‚v­ÄË¿ƒ×´†å¼ ·‡‘×8çÜÏ̉½©Û«‚ ½9éºÍÓƒÖׯËƯµØßå÷Á÷ÚŸâ8'¤‡'Öív±»ơêœÔ­Ñ¹.«‡“ÍjÇÖǺå̉ ̃ˆ›¾ÏÔưÀ—¾ÇßÏÚÙå̉ ±»˜‰j̃ZîSƒˆË̉›¾½€ù×·Ü·Ó ¥0Û×ÅÄơÔö¿Ô±»ÏťǙ‰kß [ïSÑÄëÀ½™‡¡ÁÿÚ™‰kß [ïS×¼±»ñÚưÀ’¹~ÜN›ƠÜ«·3uUÎæÙ½öù×é‘Úù×9¥‡×éÚ½Ú“Ü™‰kß [ïSÅá߈ù×ĂÓͽùêđÔơêËǃ½ÏÔùê÷ÁÅÔù×´ÎÏ̉¨¿Ú“¹ƯN½÷Á¯G‹øÇÖ…&Ôơ$±»Á̃麛¶éỞ±Œ³zœ· +̉ +¤0 +̃ˆ»Å™ôñÚÀ½ óǹÚåÁĐÓö—Óùù¿‰Û×°»ÓØ‚½—»±¿­½¼‹Ç ÈщĂ%íÆ‡ÿ¯¶±»™‰kß [ïS€Ơư“³”Û«‚ ½9Âø×רơâˆó¶óÔôĂŸÖÓØƠÅ™ôÛ׫‡“ÍjôĂ«Ôëöƒvÿ¯¶Ÿ}ÍƠæºÓÔ½ÜƠX¼€·ô±)§Øă»ÍįÛ׾߻û¶º™ëéåƠăˆŸ¥Øï³2É̉ù×ù׃×ÍÓÛ«‚ ½9ù׫ÔÙ×¹Ú™Ó“ƠĂĂ½‡‰¿I«Ô +ơê—¶ÏÔ›Ú‘ï±»ÛÚ߈­ÄĂÙö«ÑưÀ™ÓÇØÄnôÔ£ØÉÖÛ×ăÁ™‰kß [ïSÛ߯óĂÈ­̃«â½Ü×¾Íạ̊Ç–¾ăˆŸăÁ¸ÚÛ«‚ ½9™‰kß [ïS߈”…Œ9¥‡…Û˜‰j̃ZîSµØ•%ù×ơê¹Úß„Ü9¥‡ÙÚ Ơ¾Ó̉¿(ç½Ơơ¨ÇÏÔ¡È߈¡ÁÍÁù¿ëö½ĐØÏÔàêÿھű»Û«‚ ½9ûàÀ̉ÛśڡÈưÀG½¹ù×ơÔ9¥‡ö¯¾±½Ǽ‡×ÛÇÁĂ«»¾±»©%©ØçÚó¼̃ˆß»ûïÍ—¶«‡“ÍjÉ»Žº¯ƒ« +>«‡“Íjùׇ“«÷« ©ƒ»5ÅØ½ĂñÖ¡Ôù×ăˆŸ;Ù×ĐĂùׯG‹øçØëöר¯sß»ûơèÅûºÛ«‚ ½9ùæÙ½¹Ú¥Ó½á¹̃ûƠëö÷Á߈‹Ü£ØöûƠ“Ơ™Ó÷ˆÁƯ—»ƒØ»ÓÔáêƒvÏÔÆ «‡“Íjçô¹¼—¶Ä£»Ï«‡“Íj¹Ú—¾µa߈›¶éÛÇëÔñ‡ÅÓƯÓ ˹ÔX—»÷$ñӯȹڗӟÅßÄÙÓØív°»¨Úó¶ù׃Ø÷Á™‰kß [ïS™‰kß [ïSăˆŸăˆŸ;ºÁ°½ ÇÖÅ©½µØỞñÖ«ÔăˆŸ;üêûƠÏ̉±»±»“È‹ÛÅØ‹ơ»đ«îÿÚưÀ¬ÖźœÁ«‡“Íjơꘉj̃ZîS₫™‰kß [ïSËÉ9•{ăºöƠ‡íê±»ш¡%¡Ô«‡“Íj¡Á¯ƠÏÔ·‡‘×8çé¼Ù×ÑÓĂÙâà₫ƒvÛ«‚ ½9‹ÇÁ½ÍƠ£ä±»ù×÷Åɯ„n—»ÛסۙÁ…Úï‡9¥‡©&›¾ĂÈ«ÔƠîµØùê¦ôÙ·Ô¹Ú©‡¥2ßëM¡‰Óº¾ºù×Û«‚ ½9߈ƒvÅôÏľ‡á Û×›¾ÎŃÖơèÅ©ĂëöñÖ›¶éÁ̃8¤‡ÏÙ½å‡9¥‡Á“÷ëö™ÁϺ߈ưÀ߈‡Œºí—Gå̉ ÑÅù×9¥‡Ă»ׯéĂÙÅ«»½€«‡“Íj߈¡ƠÁƯÙ½•'ñÓ±»ÅÓó¶°»“¹ƯNŸÄÅÓÅÓ¹Ú9¥‡‚vÍƠù¿½€ר߈ù×ĂÙÁӣ䫇“Íjơºëö¡Çù׃ؿ́ÑĂÉëÔÀ̉Î +˜êèä™ëéåÛ×8¤‡×Ñ·ºy Žă½ö™ĂÏÅçôÙÅ뙉kß [ïSăˆŸ;ëÚ™‰kß [ïS±‡í¯¡±»ĂÈ«Ôàê÷å5ÓÙ½£Øëö‘®ÅÓÏÅÍÓÏÔˆŸÈ±»ăˆŸ§̃ïÊ¥̃¿ºă‹È±ëØÏÔÁ̉ÁƯŸ»ăˆŸ;kÓºÔùêËÇ»ôôÅ߈ûáî¹ÎÅØ­äưÀêÚ±»‚v÷Á½ØÙ½ÓØœÅ̉̃ˆå̉ @ùëƒvÑÓÍ¢˜‰ j ̃    Z îS Á¹«‡“Íj÷‡³(ó—»™‰kß [ïSñÄñÚăˆŸ;·ÈØ×±½ù×é¼£äÆÅ!¿‰ĂÿÂñÓ…¯ÑÓ߈«‡“Íj™ôÛ«‚ ½9Ơ¾G¶Å§ÆÎÅLºÁ™‰kß [ïS½¡ƠƠÛ«‚ ½9çm‘-´†™‰kß [ïSÿ°»ׯÛÀÛ×ăˆŸ;ößÚ›¾µØ÷ÁÁƯ×ƠëÚÀ¹›¾ï‡߈9¥‡ăˆŸ‹Ç»Ă½“Ơ¯ÈÏÔÂĂ*Û×»Ô9¥‡ë̉Ÿ»ßÖÙ»¿Ôº¯¼ÏÔ»y”Ö¡́߈µẸ̀Ä«‡“ÍjăˆŸ©ÿÂƠ§Ô³Â·Ó ¥0ÍË)éÛ9¥±»£ ‡ŒñÆ߈ÏÔªÚËà•·ÏđӭغÅÏÔÿ¯¶9¥‡ïÚÏ̉₫Ïïù꣫âơêëöƯÓ ƒv˜ôºí—G±»‰ÛƯÏÔ߈ÂÓ±»ÁƯƠÅÔÛÆ·Ôç Ù½°»ĂÈÚ×ùê߈½‘óóÔơê·Ø™ôëÔ›ĂéºÙ½ÏÅ·Ø¥ˆ]1Û«‚ ½9ưÀ¼€ƒ‚ØÙ½«‡“Íj›Ú߈¾óÇëÓÆ·Åù×­€ÏÄ@¹à±»ÑĂù×öéÅÍË)éÛ9¥§Ó±»Ñ+µØÿ§í—G¶Å‡Û±»÷ÚơÄ߈«‡“Íj±»‡Û«‚ ½9Ưº‚v¡Û‡±” È×Ơá ±»å™¿ô¬Ö¥©Ó½ÈăˆŸ;«Ôͼø$ơèÅÙƠ«‡“Íj·´¨¼›…ÛÑÓơê½Ô·‡‘×8ç³Èù‡Ú×½Áׯ™‰kß [ïSÙÚ«‡“Íj•ŒƯº“Æ÷Á•Œ±Ô$ÈíÖ“ÈơêµØÙÚ±½·ëÙÚ™‰kß [ïS‡x×™ô‡ Áˆơ¡ºăˆŸ—‚ÿ¯¶Û«‚ ½9Ï̉ôá±»ÅØÙÚº­Ø¾ºË̉¡Ô¶ôÄÓÁĂ¿ăˆŸ;µØÙ×„Ø æùÁƯăˆŸ;óÂôÍBăˆŸ;«d¡Á‹È³ºó¿ÅËÙܟŵê³È߈ÏÔÿ¯¶‹Ü‡º«‡“Íj½ăˆŸơèÅ߈ùêʾ£ä—¶Ù½ÏÔÍÓÙÓơÄẠ́̉ÔÄÓÜ…»éºÀ½•½߈»ĂщôĂ «‡“Íj£äÛ«‚ ½9ơÔ§Ù̉½ ’LJŒ½ ÈÛÅÓ¥ÆâêƒÔáê›¶éÓº£߈Ơá=å̉ Ï’—¶÷ˆ™‡¼ÆØº·Øá꛹¯ÈÑ×ñÖ߈·ỖˆÇÖ“Ơׯ«‡“ÍjáêĂÙ¥ÜÏÅ¿‰ƒàÙ½½»ô¾ Ơ ½ơê§ô“Æëö¹ÚƯº±»Ûù×£ôÏÅơê‰ÔÁƯ™‰kß [ïSëöÅØ™‰kß [ïS釽€ĂÈ«‡“Íj•lj¿I½ơÅƠơăà¡Á‰Á‹Ü©ÓÙÜ9¥‡ºÿ¯¶ÑӋܪ‡’̀jÙ½éºÑơÔÁ˼ç'Ăمֵؽ€÷‡߈ăˆŸ•Èû›‡ŒÂèÛ«‚ ½9¥Ø›¹ívÏÔƒˆƒ¹Á‡xăˆŸ;±»÷Á™ÊÑĂ߈“Ƴﱻèô¤ˆ\0¨¾·Ô«ÔẲ¹Ú¥ơÍƠ‹Èï½™‰kß [ïSưÀ™‰kß [ïSÁ 溩‡¥2ßëMù×ÏÔÍÓÑŋǢX±»ƒv¼€—¶·¼Í7ăˆŸ;¡$9¥‡ñөؾ‰÷‡¿Ïû¤…»Ă×Ǻ«‡“ÍjÙ½ÿ¯¶çôơê™‹ÖÆ ×¾¡Ͳ¾çöŸ}ƒv™‹ôëö‹Û¡Ûùơ°»¶ûØ¡Á«ÑẨ•ŒßÄÙ±»Ïı»«ÔËÇÓ̉Û«‚ ½9ëöăˆŸ¾ưÀÜĂ ˜-ĂÙÑóÎï󵨙‰kß [ïSçÚÚª‚ +¼9ø×½ÿ¯¶½n›¾Ë4ơꃈù×ÇĂùêëĂƠß»ûëö±»ưÀóöƯ‰èÓÓrƒÖ«‡“Íj±»ÄÀƠ¾ׯ߈ơº›¹äÁ›¾Ó½öÁívóÇ«‡“Íj¯¼½ÔÅÓ§ÓµƯ9¥‡ëöÙ½¹ÛçÚ«‡“Íj©Óï³2ÅÓăêăˆŸ;‹~ëØ¥ˆ]1‹Ü»±»ÛÄÓù×Ï̉ëÚ‚¥àÙ½߈¯̣ƯÓ ±»“ƠƒÍÄؽëÚ Ç«‡“Íj³ÇÙÚĂÙ¶ƒˆ̃ŒÚ,ÿ¯¶ơ»‡ºĽÏÔ•Œ‘Ó¿»“Ơ«·3uU›¾›‰ư¡Á·Ô§̀‡¡ÔÖÆ¾ăơºØƯºçØƠ‡·Å·‡‘×8çôƒv¿Å·Åù×­ˆÙ½ĂΰêØå̉ ½ÏÔ¡ÛÓÅĂô¥‰ÍL…ómĐÄêÁ̉½€µØÇÖ£äÛÀ±ÔƒˆÖ¹ÏÔ8¤‡ÖơAØ×‚vÙ½ÏÅï½ß»û³Âщ±»ÙY₫$ĂÏÔÁ̉ÏÅÄØÛ«‚ ½9ÁĂ»½øêĂÈ“Ç;ôĂưÀđØƒˆÁƯÑƯÿÚ½­ÄơéïÁó¶ËÇ×Ơÿ¯¶ùê”Ö…ƠóåÛ«‚ ½9½ù×Û×½Ù½ËÇ“Æíơ‹ÜçÚöÏÔÑÓ» ׇ‡ư2½€¬Ô‡x±»‡ÏÔỞ­Öƒˆ«ÔÍÄÛƠëöù׃ˆÙ½˜‰j̃ZîSÛ«‚ ½9ÍË)éÛ9¥Ù½ÿÚ¿ØÚª‚ +¼9¡óÔÑÓéꙉkß [ïSŸ}åµÉ­‡ƠXóÓ¢Ư©º÷‡‚Ú˹ÿ¯¶½»Ÿù×¹ÚăˆŸ;ƒˆ8¤‡×ר€ºÿگౠ+ù×̃ÎçÚÛ×¶ôǺă¡Á߈ƒv™‰kß [ïS¨º›¾™ëéå·Ô»Ø¯Ôó¹óǧÛëö‡Å©½à߈ŸÖôê‡ä£»Ñӫӟֵؿ‰ÙÚÙµ›Úﻫ‡“ÍjÍÛ«‚ ½9ŸÈ¬ºé·ß›Ú¬Ö·Å¸È¶±»‘q·Å½ơħôº­°£àéơׯ̃ˆ¹Á9¥‡×ù×ñÓ™‰kß [ïSù×ñÙ½ëö‡Œ‡ŒÜëöÁƯ‰ÔÍÇçØĂ·Ôëö‘¶BBéÓ́ÚÙ×üÆÍÇ­€¥ÇƠóÇÑØ‚ØÅêƒvƠ£ä¿¹ÛÄÓ€ºƠÏ̉¹Áù׿»§Æ­ÄÿÚ¹ÁǺăˆŸ;¹ăˆŸ;µØßÚÚ ª ‚  + ¼9 ߙԉ۫‡“ÍjóÔö«·3uU½ÅÔ߈Å߈­¿çÚ±»¤Ç•Èû›ùסÈÛÔưÚ«»»‹‰yù‡ؽêÔ +̀ÇÙÚÁĂ¡È›Ú˜‡™Óµa¥Û°Ô±»ŽËÖß»û±»÷Ú™‰kß [ïSà¾nưÀËÖ߈ăàׯ«b˜‰j̃ZîSÙ½½€ñÁÙŒë*«å̉ ÙÜÁ‡é/×:߈«Ô¹»å̉ ‡Œ™‰kß [ïS¹½©ØëÓ­ôçÚ™»ÂÙ߈ƒÔÓ̉±»߈ĂÙ¿‰‚v ºæØÙ½Û«‚ ½9ù×ûصσvÓÆ‹‚±»ƠÄ–ỞûÓĐñ»¹Ú™‰kß [ïS¹Ú´È ÷ÙÏÅ­ÄÿÛƒÖ¥Øđ»Ó¡.ËÓ¯¼ó¿‰ù×ùסÁ…öÓÆ¹ÚÛ«‚ ½9»ˆÿÛ±»°êØù뾺ÔX÷ˆÑ\̃ˆÓ߈ăˆŸ½Ăú̉ƒà“ȇ۪¶2tTơê÷Ù½­Äí—G‹ÇïÁ匿N©‡¥2ßëMƒÖ½½¹ÚƠÁ•×ÁăˆŸ;kưÀù×±½Ï̉“ᙇÿ¯¶ß»ûăˆŸ;ÿÚ÷ÁôµØÿÚé‡ù×å̉ ơÔ›Óôƒv±»‰Û±ëع Á“¼Â“Ơ±½çÔ¡˜êè佇º‹ÇăˆŸÛÄÓĂâÂ3º¤ˆ\0ÿ‡¢ä·Øè‡Ï̃#ĂÈ™‰kß [ïSÙÚ©‡¥2ßëMﻇñ5¥ ±»ívöùê˜Ó“ÈỞ¾ß+™‰kß [ïS§Ô©L+Ö¾8µ†©‡¥2ßëM±»Úª‚ +¼9¹È¥â³¼ø×£äϼĂ¼¢Ơ‹Ó«‡“Íj™‰kß [ïSéº߈Ÿ}ƠÇ̉ŸÏ̉“۽ȇăà­Ö‰ơ«‡“Íj÷Ỗˆ ö•Çù×íÖ¡ÔăàˆƠÚ±»±½©Ơ÷Á½¾‡ù×½ö÷Ô…·§D ï؉j̃ZîS›¶é™Ô÷ˆ«Ôëö÷ÁÛÇßÔÏÔ‹ơ‹ëÏÅçô¹̃Çù×Û«‚ ½9ÂÓR‡a߈êơ­Ö«‡“ÍjơêÙ½ûÙăˆŸ§Ó™Ơ¯ƒßͯ¥'=U#QK¯ÂÁ‡é/×:“È“ÈĂÙĂøæ˜‰j̃ZîSëöψ½ÿÚú(º¡Ûë眷 ̉ ¤0 «‡“ÍjϼÓ±»9¥‡ß»ûÁƯÑÓ•Èû›áØ—ÖÀáØÁÚÆ»ëö߈¡Û÷‡ ËûĂÙûăÇíù×ÙÚá ‡ŒçÚ§Æ÷ÁÛ«‚ ½9Û«‚ ½9ăà‚ĂÏÔëö±̉ÏÄ›·Ôñ™‰kß [ïS“Æÿ•¨ëöăàƒƒÍăvĂÙ“½Ž·Ô¯¾üÁÜÜÓ ù×ÂÙ»»©‡¥2ßëMɹ±YưÀ§ÔÓÁù×óƯÛ«‚ ½9¿º™‡ÂÔƒˆÇÓ™‰kß [ïSÿÆ»¡™Á»Ø°»¶  ш¯ÓƯÓ Úª‚ +¼9†Œ   ¶Ö$ϼÑĂ½Ñ™‡­¾ÏÔÏÅ€ºåôù×üÀÉ̉ÁÛ‚vÿÚóÇ×Ă¡Ô¾Á½ɹơÇÁ|©¦ë$“º±́ƒÖÏÔƒvܳºóñíȰÁÇëöơ÷Á³ÁÛ÷ÚÅ»gô‹Ç8¤‡×­Ö߈µØƒvÑÓź‡¿¾ßôÛ«‚ ½9Ù½¦«½ăˆŸ;߈›¾¥Ö«·3uUĂÛƠ'—¶¼™‰kß [ïS«Ô¿‰¡Ô“¹ƯN߈ăˆŸ;Ơ¿à ØÑØ߈‰±6ơê忟Ö̃ˆ¶¯ƒv«‡“ÍjôÔáƠáß›¶éÙ½ù×ù×ÿÚ¹ÚÙ½¼±»Ù×ù׃Û×çôù¿±»÷Ô“Ơÿ&ÑÄ뺱»ÛˆÿÚ÷‡«»í¥åŒ¿N£ëáÛ·‡‘×8çƠÊ£ÓÙÚ‡³Ú¼Øë¼µÈ­?ơ߈Ù̉íØưÀ±»ç̉¢"1ÏÔ—¶Ù½ÓººÁ4í‡߈Ë¿ÿÚºÑÄë©Ó‹Ü—»ư“™‡Û«‚ ½9ĂÈ›øËÖ¹ÚƒĂÏÅÔ‚½ơèŲ(çô÷$Á¼±»ƒÔ³È±‡¸ÚÙ½™‰kß [ïS·‡‘×8ç½ĂơĂ¹Ú…Åôß„›¡ăˆŸ;ËÇ»‹ªĐ嫇“ÍjÛá ï³2ÓØơê¯ÈÛ«‚ ½9‹¿¾ăˆŸ;́vỞ÷ÁóÇÍÓÿ¯¶íÆÉ÷Á¹àá=߈Ž©Ư«ƒ×ëÓÏÔ•Óà̀ĂÛ«‚ ½9™Ó‹ÇˆåÁÅÙÚ©È¿½›‡›¾ùט‡ÓÅ8¤‡ƒ¾‘¡Û×Ă›¾ăÇí›·ÔÅÓ9¥‡ăે“Íj™‡À¹‚åËƠƒÖÚª‚ +¼9÷ÚͼÅ»Û×—»ù×¼0ÑÄë½€«‡“Íj«)ÀĂµÈ«‡“Íj™‰kß [ïSê$»‡—»·ïÁ9¥‡ÛÀÅÓù×ÅÄăˆŸ;kÅàÛ«‚ ½9ơèÅμÛ«‚ ½9ùשÓëö¹Á‡ÚçÚăˆŸ;—§Í»›ÓôêǼ™‰kß [ïS9¥‡“‰3Ơ,ù™ØÛ×˜Ă¼Ă¼ÔÓÄ߈×¾ͼ¸à—Œ«‡“Íj¾ơèÅưÀÿ¯¶ÏÔ—{}çǽëØăàÁƯƠÛ«‚ ½9ÅĹÚ8i¤‡iÖ«ÔíØ߈§Ôăơô¨º… ûØ›¾½$¯ƒÅ»ù×½€ŸÄăˆŸ;k£ØÓ‡óÿªÚơÔÛ«‚ ½9˜êèäóÄ߈ñÖ¶Åôê¡È“ư»éÚ½ôñÚ߈™Ă“¹ƯNöÔ“È¡Ổˆ”=ç̉óÇÓØơꙉkß [ïSÛÄÓçÚÁ«»‹Û±»Ïżԥ‰ÍL…ö›¾ù×ÑÄëÑÄë“ +©¼˜êèäÙYÛê°»Ž—ˆ«‡“ÍjÁƯ·Å‰yµØ«»…»ơ‡ŸÅëöƒ¾‘̃ˆ“È¿‰‡ÂĂáêÓÆÑÓƒvêÔÍƠ—¾‡ÿ.öỞ«d«‡“Íj‹ÇÓ̉ĂÈËÇÛ«‚ ½9ÄÔÏÄƠ™ëéåÅÓˆÍƠ₫ÏÔ÷4½ô°»ëö¾™ÓàƠÑÓĂíÁ‚vÁƯùô›¶é½÷‡ÄÓĂÈ¡̉ØÑ+ù×߈߈éÓĂÓŸ}û¼±)ÓŃˆÂ¿‰º̉ ÑוˆËÇơèÅÇ‘Æÿ•§¤Ï̉ơêö«‡“Íjđ»í'ÓØÍÄǽ¨‡¤2€̃êLÂÙ ½ÔÅØ“ŸöÔ«Ô\Ÿ}ÇƯºÁÂƠ£ÇÙ™ëé忹Áç̉¯¾ϺÁܙӡÛôÔº¹ÁĂ“Èœ·̉ ¤0ëöñÚëö­¾ù×¼|—»ƠXív°¿º÷껣ñÚÑÓưÀƒv‹Ç“ÜÙÚ«ÓÏÔ«»£Ô™ơÁ̉±»đij ̃ÖøơÿÚË̉½ßÖØ×á Ù½ÉgÛ«‚ ½9߈—ø™‰kß [ïS«Ỗˆ™‰kß [ïS«‡“ÍjºĂÈáŸ\ÑÄë³¾åĂÂÿ æ̉ëÓ­½¼ÏÅï½ñÖºÛ«‚ ½9·Å‰ÔØÚߘÙרǫ‡“Íj½ë±»¥+ƒv£Ô°ÈĂ9¥‡›‡ºù¿­½¼Û«‚ ½9Ïű»ăˆŸôĂ³× ÙŒë*«ÿÂÏÔÛ«‚ ½9ù¿½Äôíê•™±»ùơ±»™ÔĂÈĂ߈ơêÇÖÛ«‚ ½9µØø×ưÀ9¥‡€Ơ›¾¥Ö°»§ô”î®é ăÁÓÅĂ™‡¡“ƠÓ›¾шËæï½Ë¿ר«‡“Íj‚Ö÷ˆƯ «º«‡“Íjëö¿µù×ù×ßÖå̉щ½Ă£Ø§ôÑÓ·‡‘×8çùê“Ơ¥ˆ]1ù×ÑÓ‚™‰kß [ïSº‹Ç¸Ú·Å•Œ½ïµ·Ô¾Ù×ù×·‡‘×8ç›Ú…»›¶éâ½³ÂÅÓơêÛ«‚ ½9­¶ă½ö±%ßÄÙ߈˜êèä¶·Åî +±»©ÜصءÔĂȽôû™‰kß [ïSËǡǒƠ¶ˆÛ«‚ ½9Ó̉¡Ÿ½Èù×Ù½ôÜÂÚÀù×™‰kß [ïSạ́½ƠÔÛ«‚ ½9ŒEñÆ«ÔƯÓ ß»ûĂº»ˆ¹Ú³Â°»±»‡ºăà߈ÜÑØø×Ù×ŽÅØŸóe¡Á·Ú¡Áù×È̉ùêß»ûÏÅ«‡“Íj‡ßÁăˆŸ°¿ +߄コ¿ôëö«‡“ÍjÑ'ß»ûÿ›vĂÙ·‡‘×8ç§Ó¼Ăù׳ȯ‡³±»¿à8¤‡ëö›¶éáÈ·ºơ»ăˆŸ¹ÚñÚºÔơ€¡Ưù×ÛץƼÁ홉kß [ïSëöå̉ ù×ÏÔ퇟ÛÄÓ½ĂóḈv9¥‡öŸƠ£Ç™ëéå»âḈüê±½ưÀå̃Ù½ÿÚêö½ƒvÖ¼‰yöÁ…Û߈ÓºµØăˆŸ;ËÉ9¸Ô‰ÔĐÓ™‰kß [ïSͳÈÿÜëöíÖºơÔÀן֡Á¶Ö +“½©‡¥2ßëMáêơêùëø×¡ÔÏÅĂÙ¿»¥ÇÏÔ½¹óŸ†ëö߈óǩӃˆù×ù×ñƶÏ"ÑĂ›º₫ÛưÀÚוºù‡÷ÁơêưÀăˆŸƠöçÚÏÔ»̉Æâ ëö™‰kß [ïS“ƽÂÙăˆŸ;½ÁÓ¯ÈöÁ“ƽë¹9¥‡ûÙÁƯÓ¾î²2ëÚ±Ô™‰kß [ïS´½ƒˆ¢XÛ«‚ ½9¥ÂíÖ±»ỞÿÚµØÙ½̀Óçô۽y‰kß [ïS›Ú̃Œ Ú, ¶èºŸ\¹½›¶éƒ́ƒÖ§Ô“º¡Èëöë ¾µàÏÔăơƒv¾ôÍË)éÛ9¥ù×¾ºĂÙëöΟڡÛÓØơ¯ÈăˆŸ;ù×ÙÚ9¥‡—»—»…ÛÛ«‚ ½9üÀ +“‹Ù½±»9¥‡™‡ù×ưÀ±¿µa™Óƒvăơă‘Æó¸±¿°»ñÓº¼Ñ™‰kß [ïS­Ä߈×¾€ƠơêÓ¾ÏÅè$ÏÔ±»“Ơ·ó™ØüÁÍË)éÛ9¥ưÀ÷Ú«‡“Íj±Á̉ßí‡±Üø¾ Ûºù׉¿I¥ˆ]1áê½™‰kß [ïSôl½ÏÔ§Û¾ÇÖö½¾‡߈ÙŒë*««»ÇÖ¥ÛÛ«‚ ½9¼€ÈÙ‡º•Èû›ñÖ½ÙÚ±»ív½±»¡Á߈ơêƒơµ†˜‰j̃ZîS›ÔØÿ¯¶ ÿÚ½ăƠív«ÚỞßÅăˆŸÍƠר߈ƒ½£Ư«ÓµØù×9¥‡ÙÚ‹Û›¾™‰kß [ïSĂƠ½0Ï̉é‡߈ăˆŸ±»ר˜‰j̃ZîSëÓ9¥‡ÿ&ẳ«‡“ÍjöÔÍÓ°»¶ÑÓâˆ:kăà°»Ă¼ÊÙăˆŸ;k©&—¶±»±́ÑØ‡$ªâÍƠÏÅöï½°ÈƠ¸Û«‚ ½9®ÈÏÅëö™‰kß [ïS‚ˆơÄ«»¨À½¡¶ôÜ“µ̃ˆÁĂƒ½ă‹Ơ«‡“ÍjÛ«‚ ½9øê +ăˆŸ;›¾Ó̉ơèÅ“Ơé‰ñ5ñ·ª‡’̀j‰¿I§“ă²ÏŹÁ홉kß [ïSơÄ™‰kß [ïSăˆŸ;kÛ«‚ ½9¿»÷ˆù׾Ĩµ†Ơ×Ô•½ÉĂ¼ô¿́«‡“ÍjÿÚψ¥ˆ]1ửƒvÎÅÛ«‚ ½9æôä̉ăˆŸ;©‡¥2ßëM%£ä±»Û«‚ ½99¥‡É̉퇱»éꪻŽöä5̉ÑÓ«°ÿ¯¶Æ̉ç̃· +áꙉkß [ïSívăˆŸÉĂ½ÈÙ׃v«‡“Íj9¥‡³Ç€Ç ¸ÈÛºÏÅ÷ÁÛ«‚ ½9±»ÅÄ—¶çôÚ(óÇưÀÏÄ£Óø×9¥‡È» +™ÓĂĂôívÁƯ°»·‡‘×8ç̀ë³Àð»Ơư‡±ù1Û×đÓ½Ươù¿ÅªÛ߈/ăˆŸ;÷Ùö¶ ™Á»‡—¾¸Ú“ȱ½ºÅ9¥‡›¾Ôºlæ̉¡Û›¶é³’ưÀơêÏʼnÛç®ơÄ«‡“ÍjĂ7™‡É&‰ÔûàĂÙƒvĂƠÏVÓØÏ̉ív±¿Ëö‰ÜúÙ₫‡Û«‚ ½9Û«‚ ½9߈óÂö›Ú“ÛÁÚ¹Ú«‡“ÍjËù×߈ỞƯÓ ÎÅëÔ±»Á‡é/×:ăˆŸ߈ÏÅ¥ˆ]19¥‡×ăÚÛ«‚ ½9ÙÅë¼§¤·ÔÿÚÏÅ›¾Ù½ëö‡¡ÇĂÙöëÍgƒÖëö߈ëö¡Ôí—GÓºº•ϼÅØ©Ơœ·̉ ¤0µaăˆŸ‰¿IÙÚñÑñƘ‰j̃ZîSù×Úª‚ +¼9…ÂåÁ™ơ±¿Ú׫ԟ}Ï̉ÿÚ߈Ù׳ƒvä̉ñÚ¹Ú«ÓËÉ99¥‡©¼ª‡’̀jÑĂÙ§ôéê Èëö¹Ú«‡“ÍjÙÁ›¶éæÙ×ÙÚëöÿÚ9¥‡›àÆô™‰kß [ïSö«Ô߈Ù½ÅÔÅÁ±»™‰kß [ïSÔơ”× öÁ±»Ǻé‰ñ5ñ·­¾Ăº±»ÅØ­vñÖûØ›¹ĂÙ›̃…¾Û«‚ ½9­ØÏ̉óÇË÷­Ö±¿éÓ‚¾±½÷Á–»ßÏÁ½º“¼ÅØëöëöª‡’̀jö¡%ùê±»™Ă÷±Ü™‰kß [ïSôØ›¾«‡“Íj±»ÙÚ9¥‡ËÉ9¿‰¯È¡È©¼‡Œ“ÈÙĂÏÔï»ÊÈ9߈¶è¶çØ»½«‡“Íj÷Á™‰kß [ïSơêÑ+«‡“Íjɨëöï»ưÀщÙ½±»¡\·‡‘×8çÛ«‚ ½9Úª‚ +¼9߈’Ơ“ÆăˆŸá ¡ÁöÍÄáÛßÔ­¾ăˆ߈ơêöÁĂÙù×Ë%™Ô߈ï»›Úÿ ×ÜƠÏÅăˆŸ­v±»­º“ÆĂÙ¬¾™‰kß [ïS‹Ü±»«ÔÚª‚ +¼9ê›¡ăˆŸ;߈¿Ø¡%ÛÀÙ½¹ÚÅØóÇá ´‰#ăˆŸ;‹Ù¦ô ÷ÁÔơ á ǽ­ơÙ½ßÀÿ¯¶ïº¯È™ÁóĂëö³ùêÍßÛº«‡“Íj÷¼߈ÏÔ§¹Úª‚ +¼9ÏÄ—µØƒÔÅÓ«ô¿Ø±»9¥‡º̉÷Á¶߈«·3uUº›¾ƒvÙ½£‰Û«‚ ½9ăˆŸ²Ø§È‡x¾˜‰j̃ZîS°»ÛÚ«·3uUĂÙÍË)éÛ9¥ˆëö“ÈåĂÑÓ—¶ºé‰ñ5ñ·Û«‚ ½9Ï̉¡¡Ưó¹ÚÓº©ÓáĂÙѶ±»‡¿§½ăˆŸùê±Üå»ĂÙׯ·‡‘×8çûÎùê¿ÅÏÔơê¹úù×ăơùד²Û«‚ ½9—¶¡ÛƒvĂăàñ̉Û«‚ ½9ß»ûĐæ‘đ™‰kß [ïS«ä±»Ù½Úª‚ +¼9ôƒvĐÓ³›¾‡¥Û·‡‘×8ç‹ÙöăˆŸ‹Û8¤‡ÖÛ‡ÏÔöÅôơԟŇŒ‡Ç™Óé·ăêäÁĂ¹—à߈Û«‚ ½9ù×…́Û«‚ ½9ŽÙè³ÇưÀ™‡¶áÓ©Óơ…¡Û‹ÛÙ½°êØ£ÇëÚ¡Á×¾ưÀø×ưễˆăˆŸ;Ù½߈»Ô9¥‡ú¡ÔƠĂàÙ½½í‡áƠ½ẹ́Ôù׆xß»ûÏÔ‰¿IñÓª»Ü°È«‡“Íj¨‡¤2€̃êLÙ̉‰»³ÇÍĶ™ơ®Ợ ó®%™ëéåæº +º³µa×ÜƠ·‡‘×8ç¼€™‰kß [ïS·ÅÍÓ¡ÁëöµØÛ«‚ ½9ÙÚ±»±»µ§Ô›¾‡Œ°»ùº߈íê›¶éŒƯ˜‰j̃ZîSëÓÏÔêÓÙÚ·ÔÓÓ‡ñ5ÏŶÛÏÄăˆŸ;kö™‰kß [ïSÓ̃ÛÇơꀺÏÄ@ƒvóÇɹ凣‡ÛÄÓ°»™‰kß [ïS÷‡§ô¡Á³ưÀÓ©¼“¹ƯN«dĂẰĂí«‡“Íj›øù×ăˆŸ;k“ÈăˆŸµØ¼ï½º˜ÔËÓ㻇Úù×çÚù×ïƠÍÓ—¶¾ÔơèÅØÅêƠáƠơêÇØơÔëÔÿ¯¶ÿ¼ÿÚ±»™Ó±¿…øơú¾Ϻ½ÔÁƯË̉»ô·‡‘×8çù×ÁĂÏÅ÷Á™‰kß [ïSÓ…ÅÙ™‰kß [ïSÚ×· ¹½íÏÔ¡È«́½·#Á‡é/×:‰Ôå̉ ߈ưÀ›ĐƒvÓŒ™‰kß [ïSµßÄô‡ÇÏ̉ÏÔ§Ôºùº­v—óỞƒØ¹Ú“£ƯÓºͼ©Ø«‡“Íj›¹8¤‡Ö‹½ÿ$«‡“ÍjơÉßÄÙÑĂÉó́¿àÀƯäơ¿‰èºƒÖơêïÚóÇơÔÓ×I‹Ç¶̣¯Èÿ¯¶ØÓ˜‡‹ÇÛ”ÎÔ9¥‡“ƠÛ«‚ ½9µØ¹Ú‹ÇßÄÙ½ØÅ¡Ú½ÚÆ›¶é߈·Ó ¥0­Öñ?ñÔßÄÙ±»µØù×ÑËù×ăˆŸ;íÙ™‰kß [ïS©Ó½Û«‚ ½9å̉ çÚĂÙ߈Û«‚ ½9đ·Ô ËûßÁ¼ĂÀ¼«‡“Íj׿8ÂÈóÂÙÚÏÔăˆŸóÔ—¶߈›¾ăˆŸ;º½ÍƠ­Äí†ÏÔù¼œÜø×߈߈ÅØơÔ—¶ç÷‡Û«‚ ½9ăˆŸ×¼ºÔXù׃ֽà Ïű»ëöר—¶ÇÖºÙ׋Çù×™‰kß [ïSëÚÏÅßÄÙ±”‡ºÏÔëö¡ÛÄ,Ù½ăˆŸ;k·‡‘×8çöÁÏŵ؃ˆù×ăàăÔÁƯ©‡¥2ßëM¬Ö +ÓÆ±»¿‰ùêÿ +™ëéåëöâˆÛשƠÛ«‚ ½9ƒ×ăÁ%ÁƯỞª‡’̀j8¤‡±»Û«‚ ½9µa߈©‡¥2ßëMơĂçôÙø±‡ÛÄÓÏÔ­ÄơÔ«»«‡“Íj‡aÍË)éÛ9¥ƒÖ¶Å“ÈÅŒE³ºóÓÔÁ̉±»¯¼Ÿ\IœÁöÏ9¥‡ưÀ̉Å«‡“ÍjùêơĂôêÍćºψßÚÙ×°Ô·ÔÇ̉½€ÛºÙÚÏű»ÙŒë*«Î̉ÍÄ÷‡ƒå̉ Ú×/½™ÓÏÔ߈ăˆŸ;›¶éù¿ƠÔĂ¼ö̉ăˆŸÏÅÏÔ¹ºyƯÑÓɇá ½†ºÏÔĂĂ­Ø÷ÁóÔÑÓñÄăˆŸ;kÁ‡é/×:ϼ‰»ËÓ9¥‡×߈‹ÓöÑá©£XͼÛºù׿ÙÏÔß%ÂÖùê¡È÷ˆơÔ“ÈÛ«‚ ½9Û«‚ ½9éơöŸÓÙÚƒvôĂ›¾ÈÇщÚ×Ù½«»¹̃öÓº“½÷ÁÛÄÓăˆŸÙÜÖ̉¼¿‰ĐÄê¡Ô½ơê£Øăºª»ß»û€@·‡‘×8ç߈߈9¥‡±»£Ç½ƯÛ«‚ ½9¥Û«‡“ÍjçÔ¡öËÉ9ׯöÁ¹Ú–¾ëö±¿—¶ÅÓăˆŸ;kưÀÀƯ«Ñ¯È±»ỜÅÏÅù׿‰§Ô߈ƒvÓØ½¾‡øô·‡‘×8çºÆăˆŸ;ó‹Ç˾óÇ£XË¿»‡ưÀ™ÓàØÜŒßÄÙßÚƠÄÂßÁ›¡·‡‘×8çÛ×¶¶߈ăˆŸ;kѶ®ÈÏŽ߈ùןƠư“ÏÔ«‡“ÍjơÄơÔóÂÓÙ½ëö¼ ÅÔƒÚ±½Ǻ½Ô߈¡ƯÛ«‚ ½9ꙉkß [ïSưÀƠô߈«»ù×…Û˜‰j̃ZîSÛ«‚ ½9ß„ßƯ£ Ù½ó˾ù×ÍÓ¹Ú¿‰ÓÛÔºá ÇÜĂÈŽËÇơèÅø×n‚v‡‡Ç©Ơù×ívëö¥¾ƒvÑĂưƒv¿́‰¾ôĂ…»€ÓÊ>ËÇÛ«‚ ½9ØŒê*ª«‡“Íj»‡¹ÚµØù×µêÙ‡Ï9…ÓÆï»› ăˆŸ;éÔƠºmÑĂÅØñƠûÓ™‰kß [ïSëöăˆŸ;µØ™‰kß [ïSÁƯ‹íùºï½ßÚÙ½µØ¾ÇÖù×£XÅÓÓØÏÔ‘¾½ơºÀñ»²È¤½ô‹Ç™‰kß [ïSÅœ߈ơê©ÇƒÖïĽºy‚vÛ«‚ ½9×Ơ߈ Ëûƒùë§ô©å̉ ›ëöÍÓÏœȷÔÅØ‹ÈóDZ¿Ï̉‚¾ëö̃„ơÔƒ¶·‡‘×8ç‹Ü…ö¥ˆ]1ñÚ·ÅívëöÛ×ļëö£Çù×»ØÙŒë*«½›YÛ«‚ ½9¥ÈƠÚ˜‰j̃ZîSÓÅ»«§¿ùꙉkß [ïSé‰ñ5ñ·‹Çª»óćÚ×¾•Çư%ưÜ•½“ƠÓº¿́áƯù×ï»™‰kß [ïSÿǹڭĻÁ½ÓÅ…Á רÛº±ëØ©Ø̉ŧº¾Ú™‹Ù×±»µØˆÇÚÉ ¹ÚĂÇ%»‡ª·ÅñÖ•{κ·ØÏÔ¤½ăÇí±¿­ÄăˆŸ;÷ä5̉…ÔƯ‰ù׫‡“ÍjăˆŸ;kµØ¿‰ͼÂÙ›¾µÁÁ‡é/×:ÁƯăƠ½Ă߈ƯÓ ƒÎ̉ÙÜöÁ½ù×Û«‚ ½9ñÚ—¶Ûºº„Á½ƒÚ· +°»Ù½±»÷å5Óù×̣¹ÚÁÙ‹Óƒv§Ó«·3uU±»ơêÚª‚ +¼9ĂÏÔĂºù׋ǘ‰j̃ZîSưŒÓØÿ×áê ßơÔëöù×»qßÄÙ™ô¹Úß»û™‰kß [ïSÿ¯¶°»ºô˜‰j̃ZîSªdÛ×Ơ‹½“ÈåÁơÔÿÇÛ/Û«‚ ½9Ú×ù¿ö5‘’¯ÛÀ½¾Û«‚ ½9‡߈ÿöÁØơể¼çÚ˜‰j̃ZîSÏÔ¹Ở½×¼ÛºĂÙ߈₫ÇĂÏÅ9¥‡ĂÀË̉•ÔÛ×™‰kß [ïSù‡µa§ô§à߈³ ëößÄÙ‚v¿ßíÖÙ×ÏÔ¾¹xăˆŸ;ëö«‡“Íj«‡“ÍjÅØ™ôÛ«‚ ½9™‰kß [ïSÚª‚ +¼9ß»û¯ÈÛ&âˆûØÂ±‡•×ívơÉÅ©ØăˆŸ©¼ôơ‰Ûƒv—Âß»û³ơêëöƒvÅÓ¹Úùê­¾¯G‹øµ!±»Ù½«‡“ÍjƒvÓµØù׃ØĂÏÅÁ‡é/×:ç'™‰kß [ïSƒÇĂÙÚÔX «Ô߈߈ñÚß»û›¾ÔơăˆŸ;µa¥ØæI¼˜‰j̃ZîS߈¡ͼ™‰kß [ïSçä•Û«‚ ½9ÅÏÔÓÆ±»§½™ÔƒvùׇºÓØåô‹ÈëØíº‡xăà±»ï½ƒ×Ø-ăˆŸ;¿‰ƒv¹Ú¯àÁ¿‰á ›¾ï»ÑÓÙ½߈—ÓưÀù‰¿­¾çÚù×çÚÛׇº›¶é̃ˆµÚ½Ø»ßÚÿ¯¶×Ơ÷‰÷Ú«‡“ÍjË¿× ëö«·3uUÏÅñÚïÚĂÙ‡Œù×ù×ù×Ùîÿ¼ÙÓ¥Óëö“Ç­ÖÁÈ‹½¯×œÁ¯È‡x…ôå̉ ĂĂ¡»ï³2ưÀµ®×Å¥™‰kß [ïSØŒê*ª¼÷ÚµØ߈Ù½ôêĂæß„™‰kß [ïSƒv½™‰kß [ïS¨ëö«‡“Íj©s±»ÂÅÓĂÙƒvïiÛÄÓëöµØºƒÖ¹ÚÙ½ÑÓ™‰kß [ïS¥âëÓÓæ™‰kß [ïS™‰kß [ïSơç‚ÖÛ×»‡»̉߈éØưöÿÚùêƯº˜êèäĂË̉Ă"ÅØ½ơÀ‡Œ߈Á̉ù׋ö‹ÇĂèßÄÙăˆŸ;ÁÏÔËÇ–Á đÓ¹Ú÷Áå̉ ô߈úƠ‰Û¿ºµÀ³ƠÏ•ÇĂÙ½ñÖ¹ÚÙÚơÔ›¾¨ÇÏÄùôŸéºÅ«‡“Íj÷Á±¿½ñÆÁƯÏÅù×߈óÇùê—¶Á‡é/×:퇱»™‰kß [ïSÛ«‚ ½9ß»û÷Úƒ›¾Ï̉äÁ—Ó́ṽˆ´aĂĂ ›­±àéMëöù¿ù×è·—¶±»ƒĂ«‡“Íj½€±¿±»éêÁÇ̉ÿ¯¶ăơÛ«‚ ½9Û«‚ ½9—˜߈¶çÚơÔ÷ÁÛ×öù×߾Żíî߈°Á÷Á‰ỳºƠÚ߈Ù½¯àÁĂ߈Ù½ñÓûÓ9¥‡ù×±¿ÏÔ﻽ïƠ÷ÚÆÅÏÔ˜êè䳯¡È‹Ùă½ƠŇڋܙ‰kß [ïSÏÅ­™ëéåÛ«‚ ½9ËÜ©ƠµÜ«‡“Íj×¾½±»̉Ø›¾½¹‰Ô—»³ÍíÜŒƠ çôø×åô¹à§ÔÛÄÓÏÅÚª‚ +¼9߈”Çù×ÓØºƯÓ ß»ûÛ«‚ ½9÷‡œ‰¾I‡ºÛ‡ÍÄăÁÑÅÆôøê÷Úù¾øêË̉“Ơ„n·Â°»¸Åº©ÔXÈó®ÈÖ¹ù×÷‡̃ÄØÛ«‚ ½9©‡¥2ßëM§Ôív¥ÖăˆŸ;÷ÁáÛ«‚ ½9¥çư§ØÁ‡é/×:ÑÓ½Á½Ù½¾áÓÁĂ»ØÓØÓƽù×ñÓ¨¼ˆƠ ¡ÛáƠï½³ºóËê±»­ă´€±»±»±»ψ߈ï½à˜‰j̃ZîSù×öăˆŸ;ÿ‚±»ºçô›¾‡wûÙ‚«‡“Íj‡Œ½Ơ¾G­’ăˆŸ;ưÀ߈éÓÇÖù+߈êöÙÓÛ«‚ ½9™ÁƒÖºœ¿ÏÅ×Ơ†7§jÑÓÓ½“§/½̉’¹ÜNÍÓơûÁƯ°» ûÓĐÄOêOñÚ´ØçÚƒÖÙ½ëöÅÔ™ÁͽÍĩӷ‡‘×8çÙ½Û«‚ ½9Ë̉߈뇼Խ̣ǥƇÛÈù¿ÛºăˆŸÅÁÙƠ߈щÂÙơèÅ©±»ùׇƠ«%ăˆŸ;шƒvÚ×ÙÚÙ̉±»ƯÚÀÓ +ƒÖơ»‘Æăơ³å̉ ëÂ߈›¡…ô·L›¶é̉*½ƒv•Èû›“¹ÜNûØÓØ¿öƯ›¶éÓØƯÓ ̃ˆχëöŽÛ«‚ ½9£Çîá“ÆÙ½ù×½ăˆŸ¿»âˆ;¼̉ +ÍĹàéÓ·Ó ¥0ÙÅëÏÔ›¶éÙ÷Ù“º…àͼ߈´†Á|Đ`–Œăº¼€ëöÙÚÛ«‚ ½9ëöÁ‡é/×:·‡‘×8çØÇÛ©¼±»±»Ÿ}ۆDZ»çÚÙŒë*«°¿Ïųر»—¶ш©&ÔX®GøÑÄë߈ù×ÙÓ΃vơêù¿߈„µØƒ¹ÁĂ÷‡ªĐ†¾™ôÛ«‚ ½9©Ó™‡•ŒƯÓ ÿ™ÁƠ±»ËÇỞö›¾ơÔ9¥‡€º +¹ÚưÀ½€Ù½Ù½§ôËÖívôûØ9¥‡×›¡€Ơ¬Ä ¯ ù×ù×Î̉ï»çăà…¼ù×™‰kß [ïS­¾•Œ‘±Ă¼“ƠÛ×½¾‡ÆÓÑóûƯơÔ·‡‘×8ç¤%ơê‹Óâˆ;›¾ÁĂ¿ßºÛ«‚ ½9·ØËÉ9ÓÁùÚ¿‡Œ÷‡™Óù×ÄÓŸÖùêÄӣǙëéåöÁÅƯăˆŸ¹ÁĂÈăˆŸ;k›¶éÙÚƠÄóÂ騷‡‘×8çöƒvÎ؉j̃ZîS£Xèç­¾Ÿ\ƠÁÑ·÷ÁµaÅ–½ßåêí‡óÛ×¾Ù÷ˆщϹш߈ƯÚؽÑÄëÏÔ•½˜Á߈ƠÛ÷Ù9¥‡ùêƯ‰ǽÅÄù×ù×™‰kß [ïSßÁ½€™Ó̉ºÏű»ĐÓº߈úƠ¹Ú³ÈÓ¯ƠÚ… ›¾¡È±»$•׿̉ +­KÛ«‚ ½9±»¡Ôå̉ Ù̉°»ƒ“©ùºü¡ϼ8¤‡ăˆŸ;Ăº™‰kß [ïSï½ùëƒÔÏ̉‹Ù‘½Ùâ%çÚшù¾Û«‚ ½9Û«‚ ½9ù꾺ÏÔË%ăˆŸ;¿́ÏÔơÔÀĂ £ä“Ơ±»߈™‰kß [ïSÑó‡ñ5¡£ä±»ÿ§…ùêöÁ£ä¿çá=³¹ÑÓ—ÓơÔ±¿ÑĂщ˜‰j̃ZîSÅ»̃ˆ¹Úëö—¶ƒvù×ÑÄë‚v«‡“ÍjË¿—¶Û׸ڗ¶»Áß»û¹Á›¡†º›Ơå̉ ¹óÛ«‚ ½9±Èٽٽ۫‚ ½9ñÓƒvº©‡¥2ßëM¥‰ÍL…µØơê¸ÚÛº›¾9¥‡“¹ƯN÷Áÿ¯¶³ÿÂă»ʼµØ‰¿I«‡“Íjß»û«Ô¡º¡Ô™øê¿»©Ç…»—ˆ­Øù×ăˆŸ¯ÜÙÚỔ©‡¥2ßëM³½ñÓß»ûùèׯ§ÔƒvÉĂÛº—»ï»ØĂíêƯ±µ±½9¥‡ăơ߈¡Ù-íÆ‡ÚÛ«‚ ½9ÛÄÓ²%¼Á́‰¿Iï³2‡»óßÂÙ̉ÏÅÍË)éÛ9¥÷‹Åӵؙ‰kß [ïSƒv«‡“ÍjŸ}ÑÓ“ƠóñÑÓâàﺵ¤ÏÔ/™‰kß [ïSÙ½ù×±»ăˆŸ;›¡̉²×Ơö߈Ư߈¡ÁñÚ‹Ùơñ½£ŒñÙ»ÚÙă³(ơê¿ÔÏÔר¡º߈êöƒˆñƨØÇĂĂÈ̉Á Ñæ™‰kß [ïSö™‰kß [ïS߈ÙỮ¿»­)ÛºϹơ꫇“Íj÷‡ÏÔÿƒˆ«‡“ÍjƯÓ Ù佟ù×Ù½Ûש—¶µØưÀ½±»ƒv›Ú‰¿I°»ÚÀµØñíÈăˆŸ;¾ÙÚÑØùׯÜ߈·Ó ¥0ơĂ¯¾ Á±»µØ½¹ÚÜ¿¹Û«‚ ½9“È/™‰kß [ïSéÓ»ØÏÅá Ÿ}ºơêùưÀªÓ§âÏÔù×ăˆŸ;kùêßÄٯ׷ºׯ¶½€ĂÙÛ«‚ ½9¹»ñÓáÁƯ÷Á¯Ư—¶³ºóë׉»›¾½›ÁóñÚ‰¿I÷¼ëö½ù×ăˆŸ‡xëö×ܬăvµÅÅØß½÷ÁÅ–»½½Ù×9¥‡ă»ŸÙ઼׼ª»í$ÀƯ‚váƠ«‡“ÍjÙ-ÇÖ¡ÓWơØ›¾“ȉÛÛÚ©¼ö§ÔơÔÁ‡é/×:ăˆŸ;§ôơÄ…Ơ¿ô‹¦ÿ+¡½“›¶éù×Å™¿®£ÜĂÙ…«ÔåĂÛÄÓĂ«‡“Íj‡ơƠ±±ºÅ™ôÚª‚ +¼9¿‰Ú×ÏÅÙî̀ĂơÄ—ˆùê½€±»ÚÀï»±¾ö Ơ·Ü¿è‰¿IăˆŸôêÑÓø×ÑÅ¥ˆ]1ûÇÖ«‡“Íj¿à9¥‡ÿ¯¶—¶«d±»³Ă«ÔÅàÛ«‚ ½9ă‘ƠÁ·‹ĂèơÄ›¶é¯ƠưÀ³߈¿»½ÏP¥ˆ]1䌾NăˆŸ£ƯóÄ»‡Ởá º±»ă»ó¶G½¹Û«‚ ½9«·3uUÏÔ•ï…ÇơêµØÏÔçÚ9¥‡9¥‡·ÈÅØŒÓ9¥‡߈ƯºăˆŸ;¡Ô‹°áƠæ­vëöÏÔ¹Ú³Ø×÷Ù½ăˆŸ;k¿“ƧívƠ¼ÔÛ«‚ ½9ÅÓ́ºÓº«‡“ÍjÇØ«·3uUù×ëÓœ‡ºÛ©-﻽öÖ$¸»8¤‡ëöƒÚ9¥‡×¾±Ô°¿ñÚºĂË̉§Ô©‡¥2ßëMçô›¾˜êèäÏÔáÀ߈Ă¹¿Ô‘ÛÙ½‡¨‡¤2€̃êL½“½ÇÖ¾‹1«»÷Ú…Ûº£Ç¨Çå̉ «‡“Íj™ÛĐÓ˜‰j̃ZîSǼµĂăˆŸÛ«‚ ½9çÚívÏÅÛÀ«·3uU›½³ôÛ«‚ ½9½Ôƒ½ª»•×÷ÙûÎÔ“Ơµơl£Çù¿ăˆŸ;©Ơ±»ÛÀÅØ₫ׯÏ̉§ô§ÔưÀÇÅ…ƠûÀß»ûù×å»·ÔỡÏÅŽÛ«‚ ½9߈ßÁ›ºÛ«‚ ½9߈˜êèäëö×ĂÙøơ‹ÓÛ«‚ ½9¡ÛÇÓ±»åŒ¿Nø×‡“½ÑÓæÍÓ«‡“Íj™ˆ±»ĂÙ¦ÔÛ«‚ ½9Û«‚ ½9߈ÏÔ‡ăö¶™‡߈—ˆÙÚóÇ“Ơ›¾Ă¼‹Ç¿‰ăàcˆ…ÖÙÚîº̃ŒÚ,ív—»ÓŇۻ½™ëéå¯ ±»óùêá=¹ÚÇÏỒº—Œëöă½™Ó«·3uUăˆŸ;±»™‰kß [ïSÅØá¬9¥‡·‡‘×8ç©ÓÑ«‡“Íj§‡©ÓÔÚªÚÇÖăˆŸ;këÓÛ«‚ ½9߈¿ºă»…Ûù×­ˆ™‰kß [ïSɇĂÙ³ «‡“ÍjÛÚ™ô¹ôóÇ©Øû؇xÛ«‚ ½9ÏÔù×Ă¼«‡“Íjø×ËÇ·‡‘×8煻ӱЋăÛÇÖÅÓçÇÓÆÏÅÄÖ¬º}›¾ͼÛ¹ÏÔÓÆÅàÛ«‚ ½9‘àÁƯƠuÀ÷ÚơđçÚëöׯׯ™‰kß [ïS§Û«‡“ÍjÛº‡¿ÏÔÛ«‚ ½9çïÅØ™‡ÛÀÓ̉ÛÄÓ¿»ĂÙ½¾‡ñÖщ‡,ơê…b߈±½ăˆŸ;ëö§ØăˆŸ;÷ÁÛ«‚ ½9—¶öăˆŸ;ˆÁƒvµØÛ«‚ ½9Û«‚ ½9#ưÀĂÎÑĂ÷$íºÏ̉Ÿà Ëû†º¡Ô‹Ç™‰kß [ïSÏÔÁ¼ŸØ­½¼“Èÿ¯¶¢ ²º̣뇩¼™ơívÛ×ĂÙÛ«‚ ½9•Œéê°¿ ç̉ÙÚŸƯù×ÿÛ™‰kß [ïSÇèÀÿÚåĂI˜ÁßÄÙƒv«‡“Íj›¾߈åÁÛÀö½€ëö߈Ü„»¹cĐæźÙÚÛº¥È±ëØ«ÔưÀÑØ½Ăé‡óù×ưÀ̃ˆÙ½ăˆŸ;kăˆŸƒv±»±ëØ›ßÄÙñÚ©‡¥2ßëMóê·‡‘×8çÖÆö“ÇÚÆº½èÓ¾̀Óï»ÍË)éÛ9¥ÏÔƒ9¥‡å̉ ƒvĽ«ÔÍË)éÛ9¥Û«‚ ½9܃v“ÈÛ«‚ ½9ùש‡¥2ßëM›Ú°”ÅńÆ·ØĂÙ¥Ø߈—»Ă±»ä̉ăˆŸ;±»×Ë×àíêưÀÚª‚ +¼9ù×ÁÛ§ÏÔ…&­Ö刱±»ù×ÑÓ£ÇÅƯ½€ÑÓ½ÜăˆŸ°»û÷ˆƯº§ÓÙ½éêĂÙÏÔ±»«‡“ÍjÁ¹‡º·ÅÁÑ`ă»ª»ù×ơÔ½Å#ÁÜ­:·ÅöóÇ߈Ÿ§Ó—ˆÿÛ߈ÙÚÚª‚ +¼9Ù×ßÄÙ9¥‡×·‡‘×8ç±»ëÓ­ØÎ™Û“Ü™ÁƠ•Œ‡ºđÖÙ½­¬ÓÅƠăˆŸ¹Ú™‰kß [ïSÙ™ëéå«dÏÅßÄÙÏũة‡¥2ßëM¿–‡Óˆ•=‘ĂÙÙ½ơê¡ØÉ©‡¥2ßëM‡ÜµØçÚ¿́ù‡߈ù×—Ó±»ÍË)éÛ9¥Ä؇۹څÛƠXɇƒ½µØ±»ăˆŸ;¼€ÆĂ´ÇÚ±»«‡“Íj«‡“Íj³Ñóר«‡“Íj‹ÇÍӵ؆ǃƒØ³ºó«‡“ÍjĂܵa‡á …ôß۟⫇“Íj˜‡ĂºÅ¶º™‰kßăÇí±À±»ßG$ăઌ۫‚ ½9µØ¬€µÚÛ«‚ ½9ơÔ«»ăê‰5ëÚ¯ÈăˆŸ;k±»«‡“ÍjçÚĂĂ ›­±àéMưÀÛ׫‡“Íj÷ˆÛº‹Ü̃Ńv«‡“ÍjÅnÿ¯¶9¥‡ƒÖ‹Ó߈âà!ñÓ¹Úÿ¯¶߈£Çôß„ƒvÁĂÖ$íØƒvƒ‹æ™‡åơ˜‰j̃ZîS·‡‘×8ç“Ơ‹ÓŸ}¥ˆ]1í—G»ô½ÁĂ«‡“Íj“Ơß„Á&9¥‡™‡ăˆŸ;Œ̃­Ø¯ëöĐă­¾™ôÓºÙÚƠ³½óÂ߈ù×Óº™‡ÛºƯ‰¡¶ô߈å̉ ăˆŸ;™Ó÷Á©Øù×ÖÓĂÙàˆÀ0p›¶éå¼ ‘±ù×ưÀ™‡ù×ÏÔÍË)éÛ9¥¿Ă µØáƠ±»•đÏÄ·ÅăˆŸ;¡KÿÚÑỔÙÚ‡ñ5#Ó‹ÜưÀ¶ºׯ­ôÓ¾«‡“Íjé‡Ó̉™‰kß [ïSéÓ÷‡º§ÔçÚ«‡“Íjׯ½߈±¿ÿ&¹Ú›¾ẳÍÓ¡ÈÍÇDZ»ù×·‡‘×8癇ǽÁ¯ÈƒvïƠ±ÁÁƯ›Úëö½ï»ÏÔ™Ô‹ÈñíÈÏÄÇÜßÚ†Çö¥Ä·‡‘×8ç‡x9¥‡§Øăơ£Ôëö‡àå˜ÅàăˆŸ;kâˆơÔ¡Ô¯ÈßÚ‚v¯È»ˆăˆŸûđÓ¸ÚơÔ™‡ÑÄëÅÓ±»óÇÛÄÓ…Ö›¹ù×½½ĂßÄÙƒvƒˆ¿ôÑÓ©‡¥2ßëMœÓ‰¿‰Û«‚ ½9¾¹xÂÏ¿ŸÈ߈™Ø¯ÈÀ¹ŸÖáêŸÖ‹Ç…ô£äƠ9¥‡ù×̃»ú™ổ½ËÉ9ù橼³Ô߈Û«‚ ½9å̉ —»±Ô©‡¥2ßëM¹Á“‹¯¾ăˆŸ;ß›×ƠÙŒë*«‡xßß»û’©Ó±»ÙYù‡™‰kß [ïSÁ̉½€̣±»Å؇ÛăˆŸ;¥ˆ]1‡x×Ơ†7§jµ†ÍÓ¥ˆ]1ÏÔơ驼‡Û·Å«‡“Íj‡ßÖ”‹œHÓØ®×ûÙ’‡ŒóÓ9¥‡™‰kß [ïSÙÚăˆŸ‰‡Ú¯Èù×™‰kß [ïSëö‡¿±¿«ÔÙÚ¼€ƒ9¥‡ÁƯåĂ½€Ï Û«‚ ½9™‰kß [ïS½«»á=퇉¿I× …Ûº½ÅÔ߈̃ˆÓÅ¨È ›¹±ÍóÂÇևگȫԽå(ăê¹߈ËÇÅt¥Ö¶ è Á½ï»±»ív¿‰ÏÔÏÔ“₫$ĂÙœ×Û«‚ ½9çÚ½ÑÓÛº±»¯ÈÓ½­ß©"«‡“Íj±»çÚ›¾ïÅÙ½ơèÅ¡ÔẩË̉߈ÓçÚ°»ơê«ÔÛ«‚ ½9ÏÅëö¦Ơ‡Û³±»ªÚºĂÙù×åº̀êÛ«‚ ½9́ØưÀ§À߈Û°½ÇÖĂ²ÈăˆŸ;ùפơó±»ÓØÑĂÁĂÏÅÙÁ߈ñÓ߈ĐØ¿ÔÁÙ½—ˆ÷$¡ÛÁĂ×,¹½“ÆăˆŸ;‚Ö§ÔưÀ“¹ƯNºô¹ăˆŸ̀Óÿ¯¶±¿щ·ÔÍÄñÚ‡ºôêÇ̉åíñíÈßÄÙ¾±»Ù¾£ÇÅÓ­½Ăׯ±»´.¤Ù·Ô9¥‡±ÔăˆŸ;́À™‰kß [ïSÏÔăˆŸ;ÏÅÛ«‚ ½9‡9™‰kß [ïS±»±½ù×»ØóçØgǪ‡’̀j«»»Øà¡¨ơêăˆŸ;½ÿ×ăˆŸ;áØ½–¶¦º—¶ưˆÙ½¡ù×Äÿéê­Äƒ8¤‡°»†Ơ‰kß [ïSăˆŸ;ÅÁ•Œơ÷Á…Ø™ëéåÁÓăˆŸ;9¥‡™Ô‚Öùê߈»ØºÿÚ…Ơ£Ôଫ‡“Íj÷ÁÍĂŸÂù×Û«‚ ½9©¼ß“g·‡‘×8çÏÔ¿‰¿ëÛÄÓ₫®¶åűȽ±»ưÀщ¹àׯëöÏÄA Ëû†º—»÷‡5ù×ﻹÚö§Ơר§Æ™‡ƒ×ơĂ9¥‡×9¥‡©öù×Óº½´­‚¿Ø€Ơ›¾÷Áă‚‹ÇÅ«Ô9¥‡—¶¶“ÆÍƠ™ô¾›¾Û«‚ ½9ƒvׯÙÚñÓ“Ơ÷Ô™‰kß [ïS¾ÊÈ9ßÖæÚ˜‰j̃ZîSó™‡çâûºêö›¾ÁÏÔ÷ڳ±½– + +¦ +̀» + +«‡“ÍjưÀϹ¯ÈÙÜù×Û«‚ ½9å¼ öÛÄÓ߈Ă¼ÏÔǼÂàùדÛË̉ÏÅơê…Ô™‰kß [ïSơÅ‚À̃ˆÁ½€µØ™‰kß [ïS±»ÑŸ}¿ß™‡ûƠôëöĂĂ ›­±àéMÿ!߈G½¹—»ÑÓ«‡“ÍjÏááê߈Û«‚ ½9ÇÖŸ}½Ø߈ù×̀BÙ½ó|Ú§ƠÁñÓñÓ–Ø̃ˆÿ¸›Ă¿ôµØ“ºÛ«‚ ½9™‰kß [ïSưÀ¨¼ÑÄëÅ»«ºÛ«‚ ½9÷·‡‘×8çơÔÁÛû­Ä¿ôéêÙ½ùS†ºÿç$ÅØăˆŸÀ¹$ÅÓÁƯïáïÁ¿‰±»̃ÄØ™Ó¥̀¶ÑÆŸÈåÜëÔ¡Èô«Ó̀‡߈ë½ Èÿ¯¶ÿ¯¶ùô‚vô»‘«âˆ;…Úƒv߈ƠÓ©‡¥2ßëMëöưgö½‡ñ5ッƠù×ăˆŸ“Ơ¤Ø†Ç™‰kß [ïS«‡“Íj¤Û“¹ƯN¹ÚÏ̉ñÓ¼ç÷ÁơèŪڛÚÛ«‚ ½9«‡“ÍjÔơ©°)›¾Û«‚ ½9­ØïÚ$ívµØ§Ôƒv½€ÍÅăˆŸ;‡±»ù‡çÚù×ô‰Û›Úá꿉­‡½€¥‰ÍL…‡Û9¥‡‰ß÷Ù¡\«‡“Íj9¥‡©£äÓÙ½ĂÙ™ơëöù×ÉÍË)éÛ9¥ƯÓ Ù½ƒv‘ÓùëÍÄÍÄ߈Ϲœ‰¾I÷ˆỞÿÚÔÑĂƠ¡ÁƒØ¥‰ÍL…ۻŇ¼™ô¹ÚƠ¾¡ÈàƠºØ  ĂËƠ༠éêÇÓ“ÆĂ¾Û«‚ ½9¿…Œׯ·Â¶5è5ΈƠ¹.Óº£äׇ½7÷Á±»ơê±»ÿ¯¶‹ÜƒvÑÓñÓÚª‚ +¼9±ëØÍÓµÁ™à—¶…9¥‡«ÔÏÅÏÅ߈©‡¥2ßëM‡«‡“Íj™ëéå›ÜºÏÔ«‡“Íj«‡“Íj¸ÏÔ¿ôÙÚ₫®¶ñÓĂ¼шÛ׬Ưï½° êØ ÙÚ¾ĂÙ«‡“Íj«Ô˜‰j̃ZîSÍ'éØÏÅ­vÇĂƒĂù×å̉ Ó¡ÈÍË)éÛ9¥ù꽃v́v +«‡“ÍjÏ߃½²¹Ÿ}ù×µ‡«ÔÏÅ÷Ú¾Û«‚ ½9ơÔó¶9¥‡¬Ä +º©Ü»Á©‡¥2ßëM›¶éÛˆÁ¹˜‰j̃ZîS«Ú›vÁĂ絕Ó₫§Û«‚ ½9Ï̉¹ÚÎÅ™ËƠ“ƠÓØăˆŸ;—¶ÛÀÇâÏÔ“ÛÍÓëöÓØ¼“åĂ¼ÔÛ«‚ ½9ĂÙå̉ ÁĂÛ«‚ ½9†“ƒàÉ̉ñÓ«»ÏÑÄë£%ẳÉíßÄÙ½ņ߈ÏÔÙ½³ÈÎÔ³àˆéÓùꙋ±̉ö¸Ú¦ô½ĂÙ“Ỡ½Ơăàæº ăĹÚ˱›¾¡\°»ÏÅÛ«‚ ½9ÀẴ„¯È˜êèäÛºÄÀ߈ù×ñÓƠ´ëöµØ±»À ëö±»¿‰™‡·Ô±»‹¿ÅÏʼnę‰kß [ïSÛº©‡¥2ßëM£Øă»“ÈÅØó¶É̉å̉ ́v™‰kß [ïS¼ßÖÛê“Ơ£äñíȃ¾‘«‡“ÍjÏÔ·¸ù×߈½ô«‡“Íj9¥‡ơêơ걿“º½Ñ,«Ñ8¤‡×¤ĂíÆÓØ»ÁÛ«‚ ½9߈º©ƠÖÔ†6¦jÏ̉¶ăÚíÚ™‰kß [ïSĂÙÅØÙÚ±¿§ºׯëơÇϯƒ« +>Ó±»Û«‚ ½9¿‰ÂÙâàíÖ÷‡¬¿•Èû›ơ¤ÅÄĂÙ܇ڡÁ¥È½€›é¡«çÚăˆŸÛ«‚ ½9ö«‡“ÍjơêĂôûÓùׇáêƒÖ£ä½È‡Œ›¾ÿ§ˆ¼ù¿öp˜‰j̃ZîS¹»Ú׺߈ÏÔø×ÍÄËÇù×Û«‚ ½9¥%™‰kß [ïS߈™‰kß [ïS©‡¥2ßëMÇÖÇđ½Û«‚ ½9º«Ôß»ûù×ăˆŸÑØ›¾ŸÈƒv¡Ç½Û«‚ ½9½Û«‚ ½9“¹ƯN£äÁ6½Ă·‡‘×8çÙâ˹¯¼í궼ؙ‰kß [ïSͼùןřӫ‡“Íj¢XÓÆ§ÆƠX¶€‹‚µ½ù×…ÖóÚÛ«‚ ½9›¾½ô¿Å±¿êö‚vçôçÚăˆŸöÑÓèÓ߈ô¥Ø8¤‡ÏÅơĂ»¼ÍË)éÛ9¥ׯÅáÿ&ÙÚ™‰kß [ïS Áç½½ô™‰kß [ïSÿ¯¶ÄÙ⻃v“ù« ©ƒ»5ü̉ ¯È‡½í‡ÄÔÿÛăˆŸ;k"öùש¼ÍÓù×ù×—˜ỞÛ«‚ ½9å!̀Ê)èÛ8¤™‰kß [ïS±»×*ŸÍÑÓ«‡“Íjơi™Ó·Ô₫™ï¶Á‡é/×:º̣Ăô÷ÁèêÿÚ Á¶Ô߈±Œƒvûء۷‡‘×8çÛ«‚ ½9߈ÏÔ«‡“Íj„ø¯ÈÛׯÓÇÖÿ¯¶9¥‡½Ô«‡“Íj“ÈÁƯ¡ïáêÉÙëö«‡“Íjăê£Çƒv˜‰j̃ZîS‰¿IñÖÎPƠ₫߈¬Ö×¹ÙÚÿ§ƒv·‰ùơ»Ăźщ߈½·ÅµaÛ«‚ ½9©¼Ơ «“ưÀÄăÛ«‚ ½9ÿ›¾©ØÑÓ¡È9¥‡×§À«»ÏÅÅôø‡x·Ó ¥0ùê󷇑×8çé‡9¥‡ù×ñÖÁƠB́vĂÙĂÈâ»ù¿µÈ¬Äöÿ¯¶Ç»ăˆŸƒØĂÈ™‰kß [ïSË̉œ‰¾I«‡“ÍjˆÏÅÏÅ«‡“Íj›¾£!ÁÇÖ«ºỤ̀ûÓé‡ó‡Œ¹ØÙÓËÉ9ë×±»ƒv«ÔôêÏԣؘ‰j̃ZîSĂÙÏÄßÚ“Ûù×±»ßÄÙª́Óí¥Æ½á ­Ä«‡“ÍjưÀ»Ø±»9¥‡×רơÔñÚŸ\߈ÏÅÏ̉ëö…7°êØÛ«‚ ½9Ùáͽ™‰kß [ïS몗Öáê±WE¼ÿÚ•Èû›éÓóÂÅÓÏŃvÏÔ¡È¡öǺ÷å5Ó›¾ëé—Ö߈Ăôê麗¶ă»ÛÄÓ¸ÙÚº“ȇŒÍƠÙ½‡±»ù×®¾ƠÄöñÏÔ™Ô½€µöËÇ¥‰ÍL…ù×°» ¡ÁưÀă¶Û«‚ ½9ÇÖ£ “÷¦¹§ÔæÚ¹Ú™‰kß [ïSÏÔÑÓ§ÔÍÄÿ¼ăê¥ÓĂâà‹ÜăˆŸ;™‰kß [ïS…»ÿÚøôÓº߈ÍÓñíÈĂȇÍÓ§Óö›¾9¥‡½£ä…ôö›¡±ëØù×µØ‚à—¶¸Ú›!Á½߈ÇÓƒvíơ¥ˆ]1ơê9¥‡öÁ£»½™‰kß [ïS½±»±»«‡“ÍjçÚ©‡¥2ßëM¡Ôß·¼Í7ơÔ÷ÁµØơĂ¯È›¾Âê¡Èÿ™íڣLJ¿ă»ÿܩعÚívƠĂÙÄô߈ơꘇçđ°»Ñæưˆ«‡“Íjơ‡æôưÁÅÓÁ̉íÖ£Ư§Ô×¾8û(ëö釡™‰kß [ïS‹Çù×߈ɱ̣ ¯¼ÿÚĂ[½óÔ·‡‘×8ç»Ø¤ˆ\0ĐÓ™‰kß [ïSÏÚĂô˜‰j̃ZîSă½щ ÈƒvΈÅÓûÓĂºḯÛ«‚ ½9›đ‹Ù%ù×›¾Å©˜½øê匿Níñ§ÓăˆŸơ₫•½Ù½߈ÍË)éÛ9¥ÎÅ̃øÍË)éÛ9¥ơêÇØƒµ‚vñƃ¾‘…£‡ŸóeëöÉ›½ÿڃܙ‹±»ÂÙß»û°»߈»yº¯¾¿½ØÓµăˆŸ;‚ˆ˜ ê è ä ÷‡ù×Úº ÎÔ¼µƠù×ÏÔ•—߈¾ưăˆŸ…²ÄªÚ ƯÓ ™‰kß [ïSÁƯ匿N—ÓÛ«‚ ½9ÏÔÛ×ÅÔß½ñÔ‡‰Û™ºÏÔÚª‚ +¼9ăˆŸ;k›¡™‰kß [ïSĐÓ™Ô°»ùêÿ¯¶ª‡’̀j÷ÁƒvŸÅ»ç½ô§ô÷‡ïöÿ§¿»«‡“ÍjÏÔƒÔăˆŸÑ™‰kß [ïSß»û¾ç™‰kß [ïS½«‡“ÍjÿÚ—»ø¿½’€ÿ׻ث‡“ÍjÛ©Óùׇ½‹Üß»ûă௾™ÓÏÅÏÄË̉«‡“Íj÷Á÷ˆÿÂÍ­HÁƯºy#×Ơ†7§j—Ó“½ËÉ9µØ‡Çë¼™ëéåá̉ỞƯ^«‡“Íj¿‰ÙŒë*«½¡ÙÛ«‚ ½9߈ÅÓóÇÀÙå̉ ·Ô}Ï̉ăˆŸ;kêÓϺ¿9¥‡›¶éÏÔ«·3uUƒv*ñÜô™ÛÛ«‚ ½9¢äÚôÏÔ·ØĂÙŸ}ù×ÓØĂĂ ›­±àéM½߈·‡‘×8çÇÖƒvƯœºÛ«‚ ½9ß„÷Á¤ˆ\0³”—¶¿‰›v½€ÓºÇð»ø×ơÔæ̉Œ¾ÁƯ·‡‘×8癉kß [ïS·̃°»±»¿àÁ‡é/×:Úä½ơꙉkß [ïS‰¿IĂç$9¥‡×¤ˆT\T0TׯÎÅ‹ÇÏÔ9¥‡÷Á³ÆÛ×9¥‡ĂÖ̃ˆ Á½ß»ûÛ«‚ ½9±»œ‡™ëé婇¥2ßëM߈œÂÖ¾9¥‡îº ‡“½É ó¸ºñĂ—¶ËÉ99¥‡öäô³•ơÙÛ«‚ ½9ÑÓ™‰kß [ïSơêÏŹÚ×$ÏÔù×Á‡é/×:߈Ö¹-ç'›¾µÈî‡Û«‚ ½9Ÿ\«ÔûÓ°¿Û«‚ ½99¥‡8¤‡ÖơêÙ½½™‰kß [ïSܬÖùêăà采ÚơèÅ›¶éÛ¹Ú߈†½Ǽ™‰kß [ïS÷ˆ“ÈÛ«‚ ½9·ÅƠ±»½Ă‡ŒƒÖôÄÛ«‚ ½9ñǾö³ÈÅı» ɇƒv̉Ʊ¿ÓØé‚£½÷ÚëöËÉ9ƒv©‡¥2ßëM›¶é©Ó»Øv­Öøê½½çÚ™ĂÛ«‚ ½9щøêăˆŸÓ~ƒv÷ ÁÓ÷¼å»¹½9¥‡ß»û‹Ü±ÁÙÜù×₫¹¢ÿ¯¶ù‡°½öñÆù×ĂÙœˆù×Û«‚ ½9щ·‡‘×8çÿ¯¶ÙÚùן}ÙÚÏŇƯº…'ÑØưˆ™‰kß [ïS«·3uUÇ辉ûؿ׃ˆ߈½ÏÔ¯µö»ØÏŨصؤ‹€ƠçÚϹׯÏÔ9¥‡ëö‡ÛơêăˆŸ߈ó¶×$¹ÚÚÄ̉ơÔÅØ“èå¿Ç̉©¼©Çùê™Á™Á·Ô¬Ä¡ÈµØ—Óµa™‰kß [ïSÙÚơÔß½çºơèÅÏÄ½ë­ØùơŸÛɇ§ÖÏÅç4ÑÓ§ÓơÄëö Á¾„öăˆŸ›¾ơê߈·Ô•Úö©ØÅØ߈߈ÿ¼§ÛÑÓăˆŸ¿º¬¾˜‰j̃ZîSºëöµ†£ÔưÁÿÚÖ¥ˆ]19¥‡˜‰j̃ZîS«‡“Íj©¼“Æ·Ó ¥0íÖø×™‰kß [ïSÓ­Ǿv½£¹Ú̃»úщăˆŸ;«‡“ÍjÛ«‚ ½9íØ߈©‡¥2ßëM™‰kß [ïSÛ«‚ ½9™‰kß [ïSùבƓ…ưÀ™‰kß [ïS÷¼›¾µ†·ĂơéÛÔ•½›Ú½‰»¡¿‰µaù×ñ×¾¯ÈçÚ‚v€Ç¯ÈơÔŽׯ9¥‡×ơÿ‹¿å¿¾ÅƒvÏԣ䙉kß [ïSËÉ9¡Óœ‰¾IƠ™‰kß [ïS½ƒÖíê—Óđ±»™‰kß [ïSÇ Á׋«-‘™Ơ¦Óù׺ùסۥˆ]1¡Èƒ×½ÈÛ«‚ ½9÷Á߈Ù-Ñ¥“ƠÛíĂ£Ôù×ĂÈơêÏÔ¡ÛÏÄÙÚ¿ÂѶÏÔăÁ­Äùת»…Ơ³g˜‰j̃ZîSÛ«»Û«‚ ½9ÏÅ߈µØ¾å̉ Å–ù¿‡×ơꩇ¥2ßëM‹Çù׫»Û«‚ ½9‹ÜÔÓDÅÔ÷Á̀Ê)èÛ8¤¥Öƒ‰Ô™‰kß [ïSçÚƒˆÙÚ«»ÍË)éÛ9¥ĂăˆŸ³¸Ú»¼‘߈™Ăå̉ ²ÆàêÖùסԋv›¶é÷ÁƯơêĂĂ ›­±àéMøê›¡½€ÛêơÔá̀ƒvÿÚ¡Û™‰kß [ïSÛ«‚ ½9«‡“Íj9¥‡×ÊÇè£Ç­qÛ«‚ ½9ù׫·3uUø××,±»ö§Ôª¶2tTÿ׫‡“ÍjÙ×ăˆŸ“Èăơ‰yû(¥Ú9¥‡÷ÁăơĂƠçƠß̃ÅÔñÓÜ» +‚v‰¿IÅàÛ«‚ ½9‚ÖÇÖ™‰kß [ïSĂĂ ›­±àéM«‡“ÍjÛÄÓ‹Ü“½ăÁ±»öèêÍÓÅÔâ»ĂÙùê߈±»ư¥ˆ]1Û«‚ ½9†»ĂƠù×¹Úù×½±»ÿ¯¶ăˆŸ;·êÿÚÁÜ´Èỗ½½›đº÷‡ù꽇½̀Ê)èÛ8¤߈ØƠçô¥å¾ĂÔÅëö™‰kß [ïS™Á£tщưÀ«»å̉ ±»¡Û­Øƒv«‡“Íj¦Æ«‡“ÍjëÓëơ˜êèä³Â­½¼«‡“Íj÷ÀÙ×÷ÁÅØ™É‹½Ù½«‡“ÍjƯÓ ͽ˜ÁÁ̉ùô¹ÈµØ¾º«»߈ÓÔÏÔîÅ™‰kß [ïS½ÁÅÔÛ«‚ ½9ÍÓ™‰kß [ïS9¥‡×߈÷Á½Ü∠  ±»Ûº©¼ƯÓ í‡ïiưÀ°»½€¸Úù×Û«‚ ½9óÁƯ›¾ªÓ ĂĂ ›­±àéM°»ÏÔÏÔ·Åù×ăˆŸÏÅă»±»ƒØÓé³¹̀Ó ‡Ú؆ÇÚª‚ +¼9™‡Ÿç¹ÁÛ«‚ ½9·‡‘×8çÅÓ¯¾ëöÅÙ½˜êèäXÛ«‚ ½9߈°» ƒÚƒˆÙ½³(ö߈óÂ×ù9¥‡“ÚëöƠ±ÁÚª‚ +¼9ÏÅÚ×Åöù׉ƠïܧôËƠ¹ƠµØÓµơê­vù×ɇ÷r©¼©‡¥2ßëM·̣Ô¿ŒÙ½ư“«‡“Íj±»߈æ—¶±»Ï̉¯¼ơꩇ¥2ßëM§Æ™‰kß [ïS½ÜÙÚûéÙÓ°»ßÄÙ½ơĂgøê¿ÔÙ×ÁƯù×ËÇѶ·‡‘×8ççÚëö±»µØ«Ô½ç˜‰j̃ZîS·ÅơÄź¹Ú´.¤Ù¡ÁÅÔ­ÄƠXÄăˆŸ;¾¿‰Î±%¹ÚïƠÏÔùễˆ«ÔơÔ¡Ô˜Ô˜êèäñÆêơ›¹±» Ëûù×·‡‘×8ç½Ă–¦̀»óÂñÓ‡Ç߈·‡‘×8ç«ÔÛôơèņ×ö‡ơĂ£ä·÷Á麇üÀ£Ø¬ÄµØ³Â›¹½½´Ă-·‡‘×8ç¹̃£‡ÍÓ߈ÄØđÖ…Öó1ß»û™‰kß [ïS¶è«·3uU±»8¤‡ÿ¯¶µØ±»‘®¡ÔÛÚ…ô‹Ùù×ùåºØ¹Ú½¯‰¯0̃ˆ™ô«Ô߈øê·§D ߈ÍƠ½€Ôùꙉkß [ïS¶Å˜ÔË̉ÏÔª»«ÔÍË)éÛ9¥ù×½‘ Ăù×ᬱ»‘ÆôáƠăà¹ÚưÀù×±»ñ×躰¾½ÛשأØĂódz(½àẳ÷‡ôĂÅ–©Çơê³ÈÛ«‚ ½9åµÛºÏÔăˆŸ;kƒØùº9¥‡ƯÓ ¯¼ ËûÛ×½ôë̃Á¹̃¹ÅÄÄÔ‚vëö¿‰³ÈÉÙÓºµØ߈»½›¶é8¤‡×¦È,Ở¿»ÏÔ¾¾áê£XåĂÑÄëÙÚơÔ¹Ú•Öơê±»Ăȱ¿å‡ñÓ™‰kß [ïSâÄåÁƠXĂÙ߈ûÓ©‡¥2ßëMƒv߈ªøéÓIµØÏÔÏÔ«ÚơÔ$ă¼ßÄÙưÀ…Ơ߈³È°»öăˆŸ¼ôµØ„‘ơÙÚ’Ç™ëé噇½€“¼â½2¹ù׋ܱ»߈ăˆŸÅ»ăˆŸ;kăˆŸ;k•ŒĂôÙÅëÔ¡Á“Æåç9¥‡ÂƒvƒvÔX +9¥‡ƒv³Ơʹ̀Ó£äÛ«‚ ½9°»½·‡‘×8çù×߈±»™‰kß [ïS•¼Ơơœ‰¾I‘ÓgÏÔä̉ÙܓȈ“¼öÁ™‰kß [ïSá=Ù½/•îë¹ÚÑÄë²”ÏÔË¿™‡Ó߈ιàß'8¤‡Ö9¥‡Û«‚ ½9À̉9¥‡×¡Û‡ƠÏÔø×ơễÄØ™‰kß [ïS±»ÑÓÏÔăˆŸ·‡‘×8牢ăà“Ơ½€°»è‡ÙÚ±¿÷Á““Ơí‡Üơêƒ×«·3uUÙ×¥àÁ¸³ºó—¶ÿ¼Ï̉¶&³(9¥‡çăˆŸ;ơêÁ̉ɇ“È߈å̃ƒÖ‹Ç₫Ø×£ä߈» áÙ?¡M-ËơÛ‹ù×!#¹ Ơ ×Éùư • +‡¹'ư¥í…ß»ûéßÛ«‚ ½9ưÀÏÔ‹æ¼ƠμéÓ—ÓÙ×߈‘¾‹Ç™ëéå¥ÄÂÙÓØƒ×gßÁ߈ăˆŸÓ‡À¹ưÀ÷ÁçÚÛ«‚ ½9«Ô§Ó«è‡‹º‚v™‡çô«Úψ³ºóׯ·Ô«‡“ÍjÁƯµàĂÙ÷Á×ƠÛ«‚ ½9™‡™Á±»—¶÷Úú̉¹ÚÿÚÙ½ăˆŸ;ƒ¿‰™ëéåù×ù×̃ˆöÚª‚ +¼9÷å5Ó±»Á¹êØ çº¦ôù×Ë̉ºÑÓ·‡‘×8纱»ÏÔăˆŸ;ÏÔ±»‹Ü±»·‡‘×8çưÀ©Ó°»Ûàà¤< ̣# ר½Ï̉ơÔ»ö¹ÚµÀÜóÇ©¾÷ÁÅÓô¯çÚô™‡™‰kß [ïS½Ăá­¯½¥ÄƒØÛ«‚ ½9¡ØỞ™‰kß [ïSÄÓÚăˆŸÀ¼çÚ÷Ù·‡‘×8çóÂÅ—¶±»…Œëö¹ÚƒÅß"߈ƠÅô‘¾ăˆŸ¾́ç¤Ü9¥‡ñÚ¹Ú§ÓﻦôüÀͼ·ô¸Ú‘à‹Ü§ôăàË̉ÍƠĐ ù×óÇÏÔëöÛ«‚ ½9ƒ¡Ó¤Ø“׺ƒà±»¸Ú߈‹Ç¾̀Ê)èÛ8¤öăˆŸ8¤‡ϼ—»ÛÀáêµaÍÛ«‚ ½9ñÓÀƯŸĺéÓ•î³¹ăàƒv³Â½̉™‰kß [ïSÇá̀Óử9¥‡ưÀ߈Ÿ}ñÄ9¥‡¯«‡“ÍjƒÖÔÛÄÓ·Ôר±»9¥‡Û×ëö÷Á™ëéåñÖׯǯùëưÀưØÛ«‚ ½9€ÓÀ‡€è/Ö:ÅÔơèű»ëö‹Û«‚ ½9›Ûרív߈™ơƒvµ†§Ó¥Â²Âá«Ô½Ûăơ›¶éÿ¯¶ÏÔÏÔơê߈ăˆŸ;±»³Ï̉ưÀñÚ—¶Ó%¾ÑÜăÇíÓ™‰kß [ïS©º›½Ơ•¡Û¿߈ÓÛÄÓ«ÎĂÖ˜‰j̃ZîSß»ûñº Êû©±»ÙÑ߈߈¡Ô©½ÎÅŸÈâˆÛ«‚ ½9ÂÙ•½‚v«ñÓÆĂ щéÚ‡Ç̉̉Ù½ÑÓ‡Ú«‡“ÍjÁ½ÿ¯¶ÍÓßƯŸ}ơ‡ÅÓóÇĂƠ¼Ô±»÷Á—ÓñÓÑ Ơ¶‡Ö8æ߈Û¨º߈¡Ç˹˜‰j̃ZîS‹ÜÅÔ߈éºщ˜êèä¡Ư·‡‘×8çËÉ9™ơÛËƠăˆŸ;÷Úï½ÏÅ«‡“ÍjÙÚ©&¦ÔƒÚ÷‡Ù̉ö«‡“Íj– ÙŒë*«ùäƒÚëöƠá=Ở‡ÚÀ½±¿ơêôêÏÅ«‡“ÍjÏÔÑÓăˆŸ;kËÇñÓ‡ƒˆ±¿ψ%ººƒvÉ¡˜‰j̃ZîSͼăˆŸ;kÁ̉÷Úƒ·‡‘×8çñÓùê‹Èö̉ø×Ởå̉ ߈ùq¯«ÔµØùת»ăˆŸ;ÁĂíÖ¥Á›¾‘đ«¼ÙÚ¼ëËÓ™ô·#ÛÄÓ°¿ó!ÓÅÛ«‚ ½9‰6ßơêóå‡ÎÅå̉ ˹ëö§Ôơı»–ÓǺóÇăˆŸͼóÇàƒˆ—ÓÛ«‚ ½9 Ơ¹¶©Óï»ø×«‡“ÍjƒÚÇáƠèºÍƠĂ™‡ùê™ÔéÓÏÅíêûó“ÇÔơơĂ·Ó ¥0£ä‡ÛïÄ£XăˆŸ;ÜÀ™‰kß [ïS߈³Âù¾ê$ăÁƒv‘Ô¹Ú…ÛíÆ¹ËÇñÚ“Æ£ØƠî÷ˆÏÚ÷$·ë̃Áëö‡ÿ¯¶ÏÔ¥ˆ]1ÍÙԇ“ÛĂÙ‡x±»‹&áƠå̉ ¹à¹ÚH«‡“Íj‹ÇØ×§ÓÏÔ½óÖÍYÛ×°»Ϻ߈߈½ô8¤‡ù×é§Ơ›ÚĂÆÑÓưÀơêưˆ°»߈ï»ó“½Ï̉©Ü½Û«‚ ½9Ơ‘¼½€ÑØÙ½߈«Ô¡È·̣ÅØ§ÔÏÔÑâ‹Ü‰øÚª‚ +¼9“ȃàù׃vö‹È™‰kß [ïS9¥‡×Û«‚ ½9·ØưÀèơơÄ¥ˆ]1íº©‡¥2ßëMµØÏÔ§ÔÛ×áêçÚĂàÛ×·‡‘×8çÿ‡™‰kß [ïS©Øø×Ï̉çÚµ†™×­æ˱ăơÛ«‚ ½9ÅØÁ½ù×±»±»«ÔßÁƠ߈óÂñÓÛº¥Æµ×ÓÆ¹ÚƒvÑĂ¹̃ƒÖ±»߈áÁ³–½íÿZñÓÚÉÓƒvÁ㫇“Íj‡ÇăˆŸ¹Ú¸Ú§Æ˜‰j̃ZîSÏÔ™‰kß [ïS¡ÈǺ¢äº½ öûƠÿÚỞ¡̉ÂÙŸ¾Û«‚ ½9ù×é‰ñ5ñ·ŸÅÿ¯¶—Ö‹¿±»ù×±»ĂÙưÁµØ©¼å̉  ÈăˆŸ;Ç̉«»߈ù×½̃ˆ¡h›¾€Ùッƒßͯ¥'=U#QK¯Â™‰kß [ïSƒˆÀ¹È‰¿I¡ÁÛÄÓ߈ÓÅĂĂ ›­±àéMÙÓ™‡Öùê¹ÚÛ×Ơ˜‰j̃ZîSÁƯ«·3uUåưù×ÄÓ +ß»ûơu¡Á‹Ôøêû“ÈÎżԹںqÑӵر»ùê‡Û×ÓØG½¹•Œê¾—¶¹Ú¿‰Û«‚ ½9μ¡ÁïÅÙ½ø×ëöùơÏÔ÷Á©¼ÿÚµ‰ÙÚÓº‰ÔÍÓÁ‘ÍƠÍ¥¸ÚăàÏÅöå̉ ˜˜׺™‰kß [ïS߈™‰kß [ïSñÚÙ½½ôÂÙÛÀµØ—ÓŽ“ƠÅ–±»ËàăˆŸëöù׌ºÇ…¼³¹º®¹Ö±ó“Û½«‡“Íj©ØÏÔé‰ñ5ñ·ÙڋDZ»÷Á‡Ç±»ØÓï»±»½ôù×êÚƯî߈ÅÄơÔ³ ÏÄ«‡“Íj麵ØÖ̉ 8¤‡ÖöƒvÛÚ½"ëö¹½÷Á»—»›¾ÏÔǼÉS·̣ăˆŸ;߈“½÷ˆ»Ø€ä‰߈™‰kß [ïS©Óù×Ù½½ƒÖ‘Ó©¼½€¹Ú¿¾å̉ ơèű» ÁDĂ¼å­ß»û˽±»½§ƠÙ½ëö˜ ê è ä Û«‚ ½9í$߈«Ôÿ½ỞÅÁĂ9¥‡•Œ¡ÔĂ¼ƒØ¿»˽Á¬¾Ñæ£Ç“†“ÏÅ Ô¥â¡%Ë̉µØù×߈ưˆ™‰kß [ïSÍÇóÖ÷‡Œ߈Û«‚ ½9ÛÆÑÓÎÔ +‘±¥‹ơÔ³ÇÅÔ߈¨¼Ú׫‡“Íj·ÅÛ«‚ ½9éÚ¬Ö߈¹ÚÉƠơÔÀ½ù×ơƠXÛơ½ưºÍÄùꩇ¥2ßëM¿ºÙ½›¹Ç߈đÁçØÏÅÚ×…ØñÁ“Çÿ¹™‰kß [ïSœö:ùדÈơ齋DZ»¡È…ÿף؃v¶ww¯ÈƠœÁÙívƯο‰‹Ü™‰kß [ïSû©ØƒvèÓÀ̉tËÖ¡ÛÏԻű»ơê¹Úÿ¯¶ăˆŸ;ëÓç̉±»¡%ÏÅÏÔ‰y“ÆăˆŸÛ×…»ÏÔËÉ9˜Á +ÏÔ­ÄûÓéÚß»ûÏŇº«‡“Íj߈ßÁ·ÜÛ«‚ ½9ăˆŸ;ù×±MÖĂº¡ÔËǧô«ÚñÓ™Ó‡ºÛÙÚƒ¾‘¿ßç½·ÔºÜ̃ˆÏÔË̉ơèŰÁ™‰kß [ïS—Ø‘gñíȃĩí«ñIϾ¥OÍß‹Çêö¶ăˆŸ§Ó‡Çª»ÁƯÓÓ·Åå̉ •Èû›ßÁ±»‹Çï»±»é‰ñ5ñ·ù¿çÚ±»ëö‹ÇçÚ¡ÔÙ½©‡¥2ßëMå̉ ¯Èù×›¾ÁƯăˆŸ;×$ù×±¿ׯµØ­Ä¯ÈăˆŸ‡ÙÚÙ½ƯÓ ƒØ¨Ơ¡ÊÓº»ß÷Ùͽƒˆù×¶::ƒvÙñÍùס»߈û±§ÔÑÄëÙ½ÏP‡ºÓºÅÓ‡¿ăˆŸ;ơĂÏÔăà®ÔËÖÑÄ뙉kß [ïSÇ̉¬Ô× ÿ±Œ÷¶ù×ëö™‡±Ư½ù×ù×ëö®Ơ·‡‘×8çƒvĂÙ›¾̉Åëö·‡‘×8çËÇgçÚÿÂï½ÉÏ̉•Œ¼€ÏÔ½ÑÄë‹Ç×¾éÚϼ½€¶‹ÜÁĂ²Ø“Ç«‡“ÍjƠÅØv±»ưÀ̃ô§Ô±»ç̉÷ڡȰ»÷Á«‡“Íj—»¥Æ™‰kß [ïSÛ«‚ ½9·Ô߈•ד۱»ù×́v Ÿß¡ÓׯơÔ°êØ«‡“ÍjÏÔïi¿Å­Ö°»ưÀ‘Ö±»«·3uU9¥‡×Ó¨¼Á½±»ÍÄÿÛûă¾‘çô§’¯È—¶ù×ù×́v߈9¥‡ơê™ÔívµØѦ9¥‡ÍÄ™‰kß [ïSù×ÏÔÔơ9ù׃ו½߈亶9¥‡˜êè䇌çÇŸĐáƠ—¶ßîË̉ĂÙÏ¿µØà¼¡È¿|ô«Ô匿N°»ÓÆ…ôß„ÙÚ“È«‡“Íj¥½ªº£Ô‘Ú¡Ó·Åù$ùê·‡‘×8çÁ̉ƠÑØăˆŸ;ívÛ«‚ ½9Ù½º́ƒˆÏăv“Ç™‰kß [ïSçÚñ󃾑°êتĐ÷ÁĐÓ÷‡χÏÔÛÄÓ§Ô‰¿IÇÖ߈¹ÚáÛˆøêµØ©ºƒØ‰ÜĂ¯¼}¥Øăơ·̣üØÙÜ‘™ôÓµ½«‡“ÍjơÄ߈ĂÙ߈«ÛÅØ±»‘ơđï»…ô±”Û«‚ ½9‰à°ÛÁƯùףǫ‡“Íj˜êè䵆…Û߈°»ƒ½«Ú¿»ÏÅ«»âˆ:jƒv©‡¥2ßëMÍÄÓ¼ưÀï”™‰kß [ïSûƠÏ̉°êØí—GÛ×™ôáêñÚÜË̉±»³ºóóÄÛ«‚ ½9Ù½½߈¹Ú“Æùט‰j̃ZîS©ºÙÚ߈‹ÇûËûºù×ĂÈñÖ‘¾¾¹‹ÙÛ«‚ ½9»Á£ØíêªÚ ¹Ú¥Ú¾ÇØÁ©Ç¿ô°»‡xçºƯÚ‡ăˆŸ;˜‰j̃ZîS›¶éͼ…%Ù½óĂ¡Ááê±»ç½₫®¶Ù½©ÓÍƠá=øê ĂÙ߈³™‰kß [ïSÚª‚ +¼9·ô¡Óù×½ƒv±»ăˆŸ;­¾ĂĂÅÔŸ —¶É̉ËÉ9½Ô¨¼ƒvÑÓ9¥‡„½ËƠ•¾ù×9¥‡‰¿Iå̉ ±»߈ỡèÚáêƯÜ«‡“Íj«‡“ÍjóÛ«‚ ½9ù×sȥͽר½«‡“Íj«»¹Ú‚±ëؾ۫‚ ½9«ÙỞ»Ø÷Á·Ø±»Óº“Ơ‹Üöÿ^±»çº³ơê߈›¾ưÁ¿»ÏỐ¥ÁĂĂơÔ§Ó™‡¡È½™‰kß [ïS¿ÅÑÓÛ«‚ ½9ù¿›¾ÙÅëï½ÍË)éÛ9¥ĂÙïͽ·Å“ƠÑÙ½Yëö¯¾›¹4ơꙉkß [ïSå̉ À¿Å‡Œë˜‡Ѷ9¥‡×·Ø¡ÙÚψÚ×½³ƒv¥‰ÍL…›¶é߈ÏÔ›ÏÄÿƒÖÏÔÛ«‚ ½9µa“ƹ~ăˆŸÛº½ÔÛ«‚ ½9Àá=óĐ«·3uUù×¾ưÀôËƠªÔƯº©Ø©¼›¹ÙÚơêéÚĂ·ÚăˆŸÛ׫‡“Íjäô ߈¡Û‚Ô߈ƯÚÎÔûÙƯöëö9¥‡‡ÛĂÙµ†߈ËÉ9´½­v™ơÛº¾ ®ôưÀ²º̣éÓëö™ÁăˆŸ;k÷Ú³ºó÷Ù÷å5Óé‡ÏåơÔ‰ÛơêÑæÍË)éÛ9¥ÏÅ÷Á¾©ÓñÓ™Óíq¨ÇƠív›¾à™ØÛ«‚ ½9ù×ùê‹Ç›¾ÿÚÏԹ఻ڪ‚ +¼9ù×¹ÚôơÔóÂÚ́íÖ™‡‰Ûëö›¹ß»û“äë™HŸÈ»nåôÛ«‚ ½9öưÀëö“ÈÅÔÖÆ Û«‚ ½9ăÁăˆŸÍÄ«‡“Íj³È»±»¼Ç‡½€ÛÚåĂ߈ÓÆ¯G‹ø‡—¶™‰kß [ïS±»߈ö߈÷‡©‡¥2ßëM›¾×±»Û«‚ ½9ÑæÚꔣ‡Û«‚ ½9Á×Ù½ưˆ¡»éê…ÇÙÚ8¤‡ÖÇ™‰kß [ïSÎÔ½¡Áß½™Ó߈ÅÅăÁ«‡“Íj¡ÈûӉƷÔ9¥‡×Ø×ôêÇÖ¡‹Ç¦ô©Ç—~ù¿ăàơê÷‡µ†•¾™‡Û×½€ÙŒë*«Á½·̃ü‡°ø1߈ƒvå±»µØ¾ßÁÛ«‚ ½9­ÖỔ†ëöÚÀ½€9¥‡« ©ƒ»5߈·‡‘×8çƒØÍBù×·̣ù×́Æó#ăˆŸ;kµØÙ½ÅåĂÏԣذ» ºù×½Ø%ÏÔÓřɡӂvỞƠ¢Ç½ƒ¾‘·ÔÙ½Úׇà̀¼ͼ‹Ü™‰kß [ïS¹Ø“ȃÖÁ×ßƯ™ôÙ×κ߯è¾µØéº™‰kß [ïS˜‰j̃ZîSÊÓ¼ĂÂĂăˆŸ;kµØºŽ‡Œ¦ÔÖ¾Çñë¼ÅÛ«‚ ½9Ù½±½Ž‹ÈÑÄë³à›¶é₫ÛºÙ×éÓôÿÚßÅÛ«‚ ½9ùêÙ÷ƒˆÏ̉÷ÁƠ”‹œH˜‡™‰kß [ïSù׳ºó©ºăˆŸ;íÆ½¸ÚăˆŸ;­vÿ¯¶߈ÿ¯¶›¶éÿÚG½¹ÏÅùơ½Á«‡“Íjÿ¯¶ÑÓß»û·ÈËÈ9߈©¼ăˆŸ™‰kß [ïS‹ÜÅÓÏ̉×¾Ù¢ÿÔívơ»ƒvƼÉtñÚÏÔȇ¹Ú‡¦ÙÚñÓñÓơê’Æ™‰kß [ïSÓßôƒv›¾ÙکǧÔËƠ±»Ä¹̃›ÍÙ×Û̃ˆ—ǽ³˲ÍË)éÛ9¥ưÀß»ûùê»ÁŸ}öÁƯº£X̣ÓÍÓÁĂÂèåĂïÀ« ©ƒ»5öù׺¼ëù׺¹ă¼ó›¾‘±‹Ç匿NĂÈ¬Ö¡Ûø¾ûø߈­ÄµaưÀƒˆƒv߈ß»ûÙ½çÚ…à©Ç‡Û™‡ͼÿÚ‹ÇĐÓùׇ÷ëö¼“Ơ¯́»ØÓØ­ˆÁ€®ÈƒvÛÄÓÏÅ…ôµÆơ߈ÂỤ̀¶߈%ºä̉))»ØÙÓµØØ‹Û±»•ŒÓÆÍÓ«ÔÛ«‚ ½9Å–Á̉›̣ÓºµØù×߈™ÁÀ¼ĂÙÙÅ뇺›¶é§ôăÇíăĂ3߃¿àÛ«‚ ½9ơÔƒv§Øñڃ܃våƠÁƯå̉ «‡“ÍjߌÛ,›¶éƒ¶ăˆŸ;kµaâˆĂÙĂÈùש¼×¿8×Ơ†7§jÿ¯¶™‰kß [ïS´‰ÑÓưÀµØü´׼›ÆÇ⓽ºôăˆŸ;éÓǶƒv߈«‡“Íj§Ô›¾ĂĂƒv8¤‡Ö™Á›¾ù׫»ëöÙ½™‡«‡“Íj«»€º¹Úëöíê½­ØÀ½ ™‡˜‰j̃ZîSƯÔ±¿“Û»ẰÓù¿ͼ÷Ú¡̃ăˆŸ;ëÚ§ÔÏÅ‘±ŸÖñÓ«‡“ÍjùÏÅôê ‹ÇƒÚ½°»“ƠñĐù×Û«‚ ½9êÔ߈³e¾¹ ÷‡ׯÙ׳ºóív…Ơ·‡‘×8çÙ½©ÇÑÓÛ«‚ ½9Å–9¥‡­ÄÁƯíÖâôƒÚ÷Ú±ëØơỖˆøê½«‡“ÍjÁĂăˆŸ;ÛÍÓÛº¸Ú€ù×ÿ¯¶ÑæÂÁƯÇØ±ëسz—»çôÜÓ £ÇƒÖ™‰kß [ïSŽÏƯÍ̀ºy€ÙÚŸÖµØÏÔÍı»ăÍƠƒv«¦߈½ù×™‰kß [ïSÇ̉öúƠñÖÇÖ™‡ººƠ™ÓñÚÅÔÑ·ÏÔỊ̈̉ÇƯ¨™‰kß [ïSăˆŸƒ¾‘æÚ·Ü³đĂ¼ƒÖÛÄÓ‡ÛÏÛÄÓÚª‚ +¼9¹ñÅÿ¯¶¥‰ÍL…ù×±»ɹźívº¬¿₫éÔ…ÔƒˆÁ½ÍÓö·‡‘×8ç߈ÇÖÑÄëéê³”ĂÙ‹ÜÍ××ÓÑÅ·Åÿ¯¶…ǃˆ×ÓăˆŸÛ«‚ ½9ôÔ÷ÁÁ ùץȹډ¿IĂÙ¾ô€º“ÈÏÅÓºÿ¯¶£X½öø×Û«‚ ½9ù×רÊÙ±»å̉ ׿8µØÛ«‚ ½9ÿÇÏ̉±»߈—HÇÖéÓ›¾‰¿I™‡¡Ôºͽ½ƒ¾‘ƒv²½ +ºØ%ăˆŸ¾Ï̉±ßµaëöăˆŸ;kÙŒë*«È̉á=ăˆŸ;kׯ¹Á°»ñÚ½¯:ăÚÏÔÁƯƒv™–÷ÁŸ}Ó¾¹Úéê—ˆ߈º»Å¼ôÿ$»Á®È‚v«‡“Íjµß«‡“ÍjÏ|₫¼ăˆŸ÷‡ăơëöưˆử™‰kß [ïSëöÁ̉“Ơ…Ơ‚v‹Ü÷ÚñƠ¶£%§Ơƒ¾‘»‡ŸÖƯ‰½™Á«‡“Íj±¿Û«‚ ½9ùꙉkß [ïSÙ#ßƯרƒÖÙ½ƒơ»Ăº·Ô±¿́ơ«Û«‚ ½9ưÀ›¶é¹Ú½íơ¿¹Å°»½¾‡‰èù׸Á§ÆÛ«‚ ½9‡«Ú̉ºÀË¡ÁßÚ‡ñ¡»ÏÅĂÙÛ«‚ ½9•qỞêơă‘·ÅØ߈ź̀ÓĂºµ¹Ú¥‰ÍL…ăˆŸ›ç›¡ù×áê°»9¥‡«‡“Íj¿ôÆ·Ó ¥0™ơ±»¹Ú‹Ü¡ÉÙ»ñÍ¡ÔÛ«‚ ½9“íâḈ•Û«‚ ½9ׯщăơ½ÏŧÓơêöÁơèẠ̊ÅØ©ÓÅÓ±»‡Œ߈ö¡ƯÇĂ·‡‘×8çÍËÏÅ›vêö ËûÁƯ~ááÉƠù×™‰kß [ïS߈÷Áù×µÑóñ×ÓÅơê½€™‰kß [ïSñÓÙÜÁƯÙ½Ïű»ÏÅ«‡“ÍjÁ̉ăê«»Á½ÓÆÙ½±»ÙÚ߈ăˆŸ;âˆ:߈™‰kß [ïS›¹›vÓØ½Ï̉ƒvăˆŸÛ«‚ ½9›ÚÅØÁĂº»Û¥âëö—»‡Œ߈Åôª»¼Ô¥Ûµ̃£¦å̉ ™‡»ó¶«Ÿ̉‹ÜÏ̉î²2 ‹Çôç9¥‡ƒvƒ½߈÷Á×Ơ9¥‡ÿ¯¶ÙÚơêĂÙ½ă™‡˜‰j̃ZîS±»©Ø›¾ơÄÅăˆŸĂÙëöíÖưÀ©‡¥2ßëM›¾ÿ¼ Ëû¦ØµaÆÏÅ›¾ÑÓå̉ ÏŽ€«‡“ÍjĂÙÏÔëö™‡ÑÄëµØÇÖÁ½ơÄ«Ô¢äµØÏÅÏ̉‰y߈§Óï»âjùסÁëÔă»ẲϺ½Á°»¤ˆ\0ÙYÁƯ™ÓăˆŸ;¡È™‹₫ ®¶ “ÛÙ½÷Á߈¶éÑóÁ¹¹Ú™‰kß [ïSÛדȱ»8¤‡×̉ƃv«·3uUù׳£ ÏÅå(‡ºỔĂÈÙ×߈ÙÚ»ĐÓ̉‰Ûív÷$ƒˆ«Ô´a·Ô«‡“ÍjÍË)éÛ9¥ÙܼØù×9¥‡§ Û‡§±»ÅÓăˆŸ;‡ŒªÚĂÙºôëԱ»Û™„đ»‡á…ă»çÏ̉µĂß»ûÅ»ÁƯƒv•ǽ½ƒvÇÖăˆŸ;ĂÙß„¢XÑÄë߈ÏÅ5óÄÑÓơÔ£»±½ăˆŸ;±»’Æù×ö«»—¤‰¾Ûצԡԙ‡₫ÿ¯¶ƒ×ÁƯ¡Û³z‡×›¾Ë ø×êöĂº©ÜƒvÙÅëÛº™‰kß [ïS«ÔË̉¡ÛÄĂÈͼơÔ¥‰ÍL…“¼ºœ‰¾I¡ÁÛ«‚ ½9ÓÆ³1Û«‚ ½9Û׉¿IχÓ¿eñÚù׫Ա»ºç̉ß»û…ö·‡‘×8çƠÓ±»ÅÓưÀúƠ©‡¥2ßëM©ÓµØ’¹ ÜN'9¥‡ºçŹá‚ÏÔôÑÓ̉Æ °»…Û™‡߈Û×Û«‚ ½9ăˆŸ˜‡ ̀Ê)èÛ8¤øê—»’Èùד½ïÚ廘‰j̃ZîSơÔ÷‡ÅÓÁ½Û«‚ ½9öÁ³×ăêïÅ¡È̃ÁĐÄê¡%±»ˆƒØ©Ó½߈ù×µØÛ×ܭı»©b«ÔµØŒ¾9¥‡‡Û̀Ê)èÛ8¤ùë“ùׯ¼±»¯G‹ø½ µØùÈƯÚ±¿¹Ú×ÓÛº«ÔÙŒë*«Ï̉́vï³2λ¯°»ă†¹àƒv߈›ëÄÖ +‰Û©ˆÙ׉Ũ߈ơÔÏÅ–¶€Ä’Ơ¥öÑÓµ†ç§ÛÚ½ôÿ§“ƠÙàÛÆ±¿߈«‡“ÍjÇֳȓƠÑ€Ơ§ÆßÁÛ«‚ ½9ÏÄÙ×̣ÔÅÄ·ÍçÚ÷ÁßÚơá¶ưÀ½Ăï½ÍË)éÛ9¥ÅØù‡߈÷‡Ï̉«‡“Íjëö¾ß +Å»™‰kß [ïS䌾N«‡“ÍjÁƯĂÙºÁÁ½ùש›éׯ̃ˆÿÚ­¾¼€ÏÅÛ«‚ ½9ăˆŸ;ăà8¤‡×ÙÚñÁéº߈¡Úª‚ +¼9Ï̉߈ëö㻫‡“Íjâˆ:kﻯ¾ù׃v•¨÷‡ƠºñÚ·§D ¢ØÜÓ µaăˆŸ;ÇÅù×§Ô¹ÚÇÖưî´Ơ9¥‡¿Ø›¾ÿÚ½Ûº¹—¾ÅÔ«Ôù׃v…öÏÔùש܃ÖÙÅëáêăˆŸ¥Ú©¼ƒˆÙÚçÚù×ÑÓ«Ô©ØœƠÛ«‚ ½9Û«‚ ½9ó½ÏÔ߈™Á™‰kß [ïSĐÓÛ«‚ ½9‡£ä¿‰½ăˆŸ;™‡Ϲ¹ÚơÔĂÙëÓà¤<᥃àö¯¾߈ăà¶Åáêù×ùןֱ»ƠXÏÔ߈ă»ºÙ×±»é‰ñ5ñ·Ù½¬Ö¨ׯÏÔ¡ÈÛ׵ؽ½é‡ù×ßÖ“Æ™Á߈™‰kß [ïSá=¢Ç³z÷ÁöƒˆưÀăˆŸ‹ÜơÔźÛÛ«‚ ½9±»ÏÔù×ñÓăˆŸ«‡“ÍjÿÚƯĂº‡ƒvÔ£ ñcÏÅăơÛÆß„ËÓß»û¾߈å̉ ÏÔ±»¿º›¡ù×½…€­:«·3uUªĂ+ù×∓Ơ»ĂÙáƠ‰Û»Å›Ú›¡ø¿±»ăˆŸ;kÓÆ±»ăˆŸ;k™ÔÛÀÅÓ¿‰ív›¶é̀Ó£Ø߈—ÓÛ«‚ ½9§½Ù׺á×ăà­Ä«‡“ÍjŸÖëö¶rÚª‚ +¼9Ž§Æ«»ù×ó¶½ăˆŸá=˜‰j̃ZîSăêù×ù¾Ü¾˜ĂđÚ«‡“Íjù×›¹ÚÏÔ·ÔưÁơê“È¥íù×ó#íêÛ«‚ ½9‹Ü©¼¡Á‡ºƒÖ§Ô½ĂׯƒÖ«‡“ÍjÛ«‚ ½9ơ»߈éÚ‚!•Èû›ÿÛ˜‡¡ÈŸ}ù×ÅÓϼ³ĂÙ‘«ÍB™Á¥ÇËÇ¡«Ù½߈ù×±»ăˆŸ;é‰ñ5ñ·ÏÔ—ˆÁ|½£ä÷Áű»¡Èƒvëö½ß»û߈¬º™‡™‰kß [ïSƯº÷ÁŸÅ…àÙÅëϼÂÙÏÅăˆŸ;‰¿IÛ«‚ ½9ÜÀÏÅéÓ̃Áå̃Ç·‡‘×8ç Ă ÿ…‡Œëö©¼ƠX«‡“ÍjçØĂÙ±»Ă˹Ăÿ‰Å–«‡“ÍjÙ½ÁăˆŸ¡»Ûë°¹ÚÛ«‚ ½9«Ñ™‰kß [ïSơº³È¹Ú›¾¿́“Èï™ăˆŸ;k‹Ü½ÈÙ½±»ÿ§ëÖëöø×›ív™‡÷Á½ÚÀ“ÆÁ¹ù×ù×›¾©Ó™ăë™H¡ÁÏÄ÷ÁŸÖÇÖ™‰kß [ïS×¼½ƒˆ¹ÚÅàÅØù×½Ï̉ͼ½ôÛ«‚ ½9¿£•󃾑ưÀ©v‰Ø™‡¼÷àêñÚù׫ѽ£äêÖñÓÏÔăˆŸƯÏÔỞ·§D ÍB½ÙÚûƠÍÄ‹Üùץ“½±»Ñ·‡º¿Ô·ÔóÇÛ«‚ ½9½˹±”Œ¾ +‚¾‡Œ“Æ‹Üÿ¯¶èÓçÚ™‡ëö÷ÁÚº߈«‡“Íj©ƠáêỞódz×ÁĐå̃¯ÇÓ¡˜¶è©‡¥2ßëM߈»ØùêÚÍƠ™ÓÙŒë*«ỞÙ½³Æ¡ÈăàƒvÇÓóÇçÀ/ר­½¼ơĂ£»£+‹È߈ƒÖÅØ‹ÇñÖ߈½ưÀâàíÆơèÅĂÈÛƯ‰߈©Ç½½ÔÏÔÏÔŸ}ù×·Ó ¥0Ûº́v +›¹ùׇƒơ‡xÀĂöăàŽÏÔ±½‡Œă‘·“Û×ëö«»™‰kß [ïSƒˆ·Ø½ƒvÍË)éÛ9¥§µ“ÛÙÚ™‰kß [ïSÏÅÇôơĂ½ôÛ«‚ ½9½èÄÖ ̃½ш÷ÚŸ¿ưÀùê¾±»¾™‰kß [ïSÏ¿™‰kß [ïS½€¹¶·¼Í7½ÿ¯¶¯¾°¿ Ǻ½ÇÖơº‡¿«‡“Íjÿ××Ơ³ºó9¥‡Ơö¸ÚËÖ Ûͼÿ¯¶2 ÛÀ—ÓÛ«‚ ½9–¾ưÀ¹Ú±»Ï̉đÔ߈á åÙ-±ÔÏÔ™‰kß [ïS«Ô™‡½›¶éơ×ÓƠ΀ƠÏÔÛÄÓóÄ̃ˆ-ÏÅ߈ºyéÛ«‚ ½9±»ù×ù×áê™Ó™‰kß [ïSăˆŸ;ḱ½˜‹ỔÛ«‚ ½9Ჺ̣Û«‚ ½9·ÔÁ‡é/×:ÿ™Žưˆûؾμë×¥Ư«‡“Íjẳ«‡“Íj‹°ƠXƠ%ưÀÑØÛ×ñÓ’¹ÜNÛÚÙ祺ÑÄëƒvƒ×—¾ÿÚÛ«‚ ½9´ŸÈơÔå̉ ̃ÁÏÄÍƠáö—˜ù×Åơêƒví꿺©‡¥2ßëMĐŽ¡Ô¡½€göÁåĂƒˆív­ÓÙÚ—Óÿ¯¶Ơ¶Ă¸ÙÏÚÎÔ¿ßÓÏÅÙÚÛ«‚ ½9瘉j̃ZîS¸Ú·Åù×£Çù×߈½ƒˆđÁÏŽµØ™‰kß [ïSĂÈ÷Áư“Û«‚ ½9›¶éºÁ‚vÛ«‚ ½9öÙƠ›¾½ÔóÂÛ«‚ ½9ưÀ£»̣Ô‹ÛÿÂÏǺÙó÷™‰kß [ïSó½ȿôׯơê±»ÎÅÓỸÁưÀ9¥‡Ï̉ÇÖ²% û(ưÀ·ôƠ’ăˆŸ;k×Üù×Ơơ߈óÂ³ăˆŸëöÏÅçÚ¶ºăˆŸ;߈̣Ô³zÅ–™‰kß [ïSÿÛå̉ ÙƠ߈ÅØù×庯ȣƯ‰¿Iëöù×öÁôêçØ½ƒ÷Úù×Ó¼÷»ƠÁỮˆ÷$ÅÔ©¼ËÉ9³È‚v±½§ƠÁ±ívù×®ô¹Ú‡đơêí—Gß»ûÓØ½‚·Å•Èû›·‹™ëéåÔơñÆ÷ơ9¥‡›¾Ù½ñÚщ·Å…»©Ø§Ơ¡ÛÁ̉·‡‘×8ç«Ô£ÔóÇ™‰kß [ïSÙÚǰ»Ù½ÙYÜÎ̉á=Ó‹ÑÏÔäñĂÈÁ́Å»ƒóÔ­RÅÁƯƠ¥å‰ưÀ¿Å¯¾ßÁƒØ‡“Û«‚ ½9å̉ œ‡Ù½íÖăˆŸÁƯ«‡“ÍjÙŒë*«÷ÁăˆŸ;£ —¶ÅÓ÷¼ăˆŸ½ÿ¯¶ƠXщ̃„̃ˆÑÓá=Ở“Ç©‡¥2ßëM…Ơ›¾è*íêÇܵ‹ÂÙÏÔˆƠëö«d»|ù×߈߈·Ó ¥0™Ó‡ñ5¡ë˜‰)j)̃))))Z)îS)߈¶Ü¶ è ¿ß²ÈÅÅØÿ¯¶¿ÅƠЇx¿‰Å±»©ÓƒÖơÔù×ßÄÙ‡¹Ú¶‡ + +Ö8 +æ +߈߈íêÏÔƒơÁ½ù×Û«‚ ½9ăˆŸĂٯȡÿÚ“Æ¬Ä º ù×Ù½Ù½ă‘·“ƠÙ½“¹ƯÑÄØ™‰kß [ïS•Œ’‰#2##Ô,#ø#ÁƯŵ½±»ăˆŸ™‰kß [ïSĂÙ…ôƒÖóÔ‡ÇÁƯ¨º¾ÏÅÄÔ¼€‰Û±éöǼ™Áù°Ở%ÅÓÍË)éÛ9¥ùש‡¥2ßëM¶óßÁƠ¾Öƃ֟}¡ÈăˆŸ;ÍÓ³àé߈ƒØY«‡“Íj×Ơ» ï»ù×ÑÓ±»½ÍÇͼ«Ñùê­¾ÎÄ@Á½³ơê߈Ù½é¥߈ÑăˆŸµaëö­½¼ÏÔÉ̉¥ˆ]1ùןȵغ«»É̉±»ÙY¹ØƠͽ€©à߈¾Ûº±ơ߈¥ÓÊÏ̉±»½ºÁ ߈“¹ƯN³éºÅÓơꃾ‘ă®߈‹Ç»:¿ºŽ©‡¥2ßëM£äù×çZ®ÇÈĂå̉ Û«‚ ½9ƒÙŒë*«é‰ñ5ñ·Ó̃ŒÚ,ăơưÀà¯È¥ÓĂÏÔ‡Œ¼½ë߈߈™Ó½ÜçÚ&±»ÓØ…ØØ×áØ²Æ:¯ÈϺÏ̉ưÀƒvă‘·9¥‡×9¥‡ÔƒvƯÖÓÅ—¶¯ÿ¯¶ØŒê*ª«‡“ÍjÏÔù¾¼Ă¹Ú«‡“ÍjƠکNjـÏÔ‹ÜÇØº³ ¯¼‡Œ½ÁƯ›Ûǃv$ËÇôÔ»ØùôÆ»ƒÖ­‡¡ÁưÀÂȰ»ƒˆ̃„ öÂÈ߈ö½€±»Ï%ƒ§EưÀ¿½ØÅê—¶Û«‚ ½9«‡“Íj†“ĂÖ¿ß¾ÓºăˆŸ¾«‡“Íjß„‡ơˆÙÜùêªÚăˆŸ;k̃»ú™‰kß [ïS×*Ă•ÑÓ¥ˆ]1÷ˆ‡º¿èơ°»ÿ¦Ù½¡ÈÑÄëŸÅăˆŸ;¹ƠĂÙÏÔ™Ôêö߈ÍÄÀ¾¹ÈƠÛ×Ϩ™‰kß [ïSƒv½€«‡“Íjƒ¾‘›¾ưÀæƠĂÙưÀÈ̉§Ô³ÇßÁÏ̉±»½߈ÿÚ‘ơ¿àÀÉÛÛ¹ùêëöêöñÖƒÖéÓű»³ºó“ƠÏÔÑÄë¯ÈÓÅƯ›°™‰kß [ïS•½¥Û̉̉ Û±”ë£ưˆ̉ÆÛ«‚ ½9àƠªX¼Û«‚ ½9ÛÔ·ÅçæêÑ·₫Ú‡ÚÑ,ŸÖµ›¶é¯×¹Ú«‡“ÍjĂƠ—¶Ñ ÓëÉƠéêëö›¾¡ÈG½¹Û«‚ ½9ŸÖ½ôÙÜ™ơù×đÆöÓÔÓÁ̉Å뇺۫‚ ½9±»óÔƒÑÓåô¦Ơ§ô¿ô³ŒÊƠ›¶éÛ«‚ ½9ª¶2tTû(ÅôÏ̉²ØëöæÚñ̉»‡ƒµØƒv½ëöÛ«‚ ½9Ù½ù×áÛá=ÍÓ¿́™‡×Ơƒv·Úï½ϺăˆŸ;kË̉ơÔƒÚ—~ɹ«·3uUÖ·ºé¾ÅÏÔăºơê“Ơí—Gƒv™Ă™ôóÂÏÅ×ĂĂÈ‚¹Ú©Ø†Œ×«‡“ÍjăˆŸ;…Ú›¾¹ÚËÉ9çÚçÚ½ôÛ«‚ ½9·ÔăˆŸ;‘€«‡“Íj­Ä½ơèŽ9¥‡ù×íØơèÅ߈¹ÚăˆŸ;ñÚ‘Úëö½Ô…ÔÀƯçÚϹƒv½€‚¾  ·ÅÛ«‚ ½9·Å·‡‘×8çĂÙƠºmŸÈ¡Ô¡Èá ù×ß»ûö­¾ăˆŸ;ƠϾ‚ØäÁö«Ôù×́ÚơÄïÚå̉ ÅÁ×Ü×Ó÷Á˜êèä‡ñ5ׯ­Ô»½°»™‰kß [ïS÷ˆ½€߈ăơˆÀĂËÉ9«‡“Íj×ÑÇĂ߈±»™Œ˜‰j̃ZîS‘Ä™‰kß [ïSƠ¥ØÛ«d¡Á“Æ߈áÛôÄßÚơêưÀ½Ă‡º›¾£ä¤È'ä̉¯Èơêơê›È•Ö½ØÛ«‚ ½9ĂÙ½ơêăˆŸ;Û«‚ ½9Í­Hµ†ĂƠơÔùתȱ»ù×ÔX‡Œ½ô˜êèäÖÆø×߈Ï̉÷ˆÅÄÍƠ½€À¼«‡“Íj»‹­̃ÏÅỞ8¤‡×½½•Í¡­¾ç½߈©¼«Ô›ÚÙÇđùêŸÄ̃ơ©¼÷Á÷ïưÀüƒv̀±»¿ßăơơèÅăơ°»8 ¤‡ ĂÙ£äă­»ôª»™‰kß [ïSË¿ƒˆơØ›¾­Ô§‹Èô«&°»°»ÙÅë‡úÁĂ¹ÚÙŒë*«̀í Á£ÔóÔÚÀº߈­Ä¿‰ÇÍÄ¿Œ÷‡ßÚƒÚûƯøÿ9ƒØơÔ­ÔÑÓù×¢X™‰kß [ïSóǧÔƠX±»›¶éáêÍÄưÀÇØơêûéùסۗ¶÷Û«‚ ½9ăˆŸ«»½€ÑÓ¥º߈† à=·ÔỞµÀù×¾ƠÔ±»ĂẴˆ·‡‘×8çÎÔù׎ßÚ߈«‡“ÍjÛ«‚ ½9áêôĂ³Ü›¶é™‰kß [ïSĐÄêÛ«‚ ½9å̉ ¯ÈÙ´È«‡“ÍjºÁ°»ÛºÛî¯×©Ó§ØùשǓƩ¼ØYÓÅëöÏ̉«‡“Íj™º±»§çm\ÛÄÓé‰ñ5ñ·רÍܱ»Û«‚ ½9ẩ+ÑÓôăơ©¼÷Ú­½¼ưÀ߈ÅĠǽ›ÛËƠ¡È¡Û́vù¾«Ô™ø»ê™‰kß [ïS×Ơ™‰kß [ïS“Ȱ»÷ˆçô¾‹²›qöÂçô˜êèä¾¹ÏÔ¹ÚµÅùêĂ¼ÎÑÓÿ×Ë1©¼߈÷Ú«‡“Íj™‹8¤‡ؽ»Û»Å¿ô±»±»©ˆç̉“uóÔÏÅëöùׇŒ߈¶ºÛ ›v»½¯ÈáÂׯơÔ«»é‡ƒÀ±»›ÚÅù×öö߈“¼ÏÅơ꺩‡¥2ßëM«‡“Íjô¯ÈÏŶ談“ÍjĂ½È匿Nơê±»­Ä·‡‘×8çơèÅÙ½¡Á½€«Ôù׫ԿÅÙ½Á¼ñ×ÛƠ½•Œ™‰kß [ïSéºר½Ñ·¯ÈÖ̉±»ívù¿íêÏÅưÀÛº‡Ûß»ûÙ½ÀÙ³ØđÖơlư‡±ù1–ˆ°»×¾ÏÅÛ«‚ ½9Ûר¼å̉ ÜÓ 8¤‡×íêÍƠưÀ¹ù×ÏÔÏÄăÇíơèŇxÍÓט­îçÚ—¶êöéGƒØ¡Á¥ˆ]1ƒÏÄØÚ½‰Æ©¼“½ÙÅëùêơĂÏÔăˆŸ;ÏÔóÇÙ½ÓØÛÅÛ«‚ ½9÷ÚÙŒë*«ĂĂ•%µØæÚ°»™‰kß [ïSĂ֓ƕ׭Ö߈©Ó«‡“ÍjÑZß½¡ÔăˆŸ;Ăô´aɇ±”ĂÙƠÚéđ» ÁÛÅÁ«‡“Íj™‡±‡«Ú›¾È™‰kß [ïSơêå¿ăơÁÚ±»àöăˆŸ;÷ÙƠºm±¡Ç¦ô™ơ—§Í»Ù×´a»ÓßÚù×±¿á ưÀÿ¯¶Û«‚ ½9—¶µØưÀĂÙ9¥‡ù꿺ɾơÅ¡ÁgÍÄÙÚỔ±»ăˆŸëÔ¡Á̉̉Ơß»ûơÔÛ«‚ ½9¸½ơêß„ơÔăê¥Æÿ§ƠX›¾¬Ö(ßK«»ĺ9¥‡×½ôÍ­™‰kß [ïSÄ–ùׇŒ߈…öŸÖçÚ½€ϺÓ¼ÂÙÏÔ™ÓÁÓ½ĂÑØؽ̉Óà ¯ºïÅÏÅÛÄÓßÄÙƯÓ †“ïºÏŃv­Ä™àâ»íÖß»ûñ¿ăˆŸƒ¾‘ơê±»ÅÔ½߈ñÄ·ÔƠÓ̃™‰kß [ïSÖ̉·Ô¹Ú§ÔëöÏŵ†™ß«‡“Íj™Óƒv±»‹vù×™‰kß [ïS¥ˆ]1›¹›¡‚¾ơĂưÀ“ƠƯù×±ÀœÂ™ëéå¿ÅƒvÏÔ½™ÓÁĂÎÅó™‰kß [ïS¾ÅëÔÓØÍÓרñÓ$™‰kß [ïS§Ô×ƠùôÍƠË̉”»ÏW·Å‚"éơëöÅóÇÏÔ«‡“ÍjµÏơêăˆŸëö¿º½€Û™Á È —Œñ~Ù-å̉ ›¶é«‡“Íj«Úû€Äôơèű»ßÄÙŽ‹Ü…ÛËǰ»ĂÙù×û’©¼Û«‚ ½9Û׃vĂ‡Çƒưˆ£ÆđÙÓÔ»ơèÅ“ƠỞ—ˆËÇ¿Å߈ÙƠ±»Ë̉²º̣YĂô߈ºÙ½­ØïÜ“Ơ™Û›¶éïƠ·Ø€ƠÓÅÿÛ‚íêǼ·‹ĂÙơêχ§ÓăˆŸ;kÜÛ«‚ ½9½Ù½Ù½½¥Ø™‡ßÄÙ§ÔÇܪÔ߈¼ëùלÁăˆŸ;§Ôщ¡È«‡“ÍjÁºÁƯ‚v—ÄÏÅôëööĂÙ̀Óëöù׳àíêÏÔ¾ù¿ăˆŸ±»ÜƯÓ ƒv½Ăø×ÏŶ¼̀7‹Û¡Á§‡ƒv³½óǺÑÄëéÓßÚÛ«‚ ½9ăàÿ¯¶ăÇíÛ«‚ ½9áêÛ×Ù½•ŒÅ½«‡“ÍjÙÚ·Ô¿‰ÑÓƠ¾Gÿ ÏÔÍË)éÛ9¥³ºó÷ÁÛÄÓ«ôă߇ŒĂ›èôôÛ—Bׯ§ôă»±»ñӡȺï½ư§‡ƠăˆŸ;¬¾ƒàưÀĂÛÄÓßÚỞ«‡“Íj®¼ׯ¿Ô°»ÙÓ„ÙÚÀ¼±ÏÔÛ×ă»¹ÁívŒ₫Ûº™‰kß [ïSö§Æ«ÔĂÙ¡ÈăàÁƒˆµØù׷ܡۻ•½9¥‡á ¡ÆĂ÷$ÙÚ½ÔÏÔßÄٶ½Ⱥ̉ÆĂôÇÜÛ«‚ ½9¹ÚÁƯƒv¯ÈÙÓÂĐ`vÆØWµØÅؤÓé’žÙÓ«»‰¿I™Œëö¾ÅÛ×¤ÓºÓØ8(¤‡(Öù×Ơª»ñíÈÿ$ÅÁøê±¿ùêÇÏÔ«dÔºl‡Ú9¥‡¯È‹Ă½ƯÀÿ¯¶±”™‰kß [ïS÷ÁôúăˆŸ;ÁĂĂº¯ÓÿÚÏ̉¥Çéº̃Úƒv÷ÚƯơ¿ß›̃ÏÅÛº±» ËûăˆŸ;ƒ½váêù×ÑÅ™‰kß [ïS±¿ù×É̉ă»¥ˆ]1§Æù×߈¦ôáö‡ŒơÔù¿ßÄÙ™‰kß [ïSùוӳÜơ•½£È» ׇ‡ư2¿ô¡È˜‰j̃ZîSͽ‹Ç£Øëö—»˜‰j̃ZîS9¥‡Ù×àê©Ø«ÓâÁ·‡‘×8çß»û½Û«‚ ½9Ăºóµ×¿8©Ç…½ùתöǺíÆµØ±»˜‰j̃ZîS‰¿I÷Áóß»ûÁ–̣íñÓ±»¹ÚËÉ߈Ç̉̉ ‹nàÅưÀëƠU«‡“ÍjÏÅ9¥‡ï³2߈¥%ëö˜ơóÇÿƒơº߈߈ưÀ›¶éµØ³±½«‡“Íj9¥‡ׯưÀ߈ÛÚÑÓ±»ÙÚ¶¶--ÓºßÖƒvÅÓªÔáêÿÚ©Ø¿»¿ăˆŸ;÷ÚïÂăˆŸ;ø×Û­Ù½Ëǃ¾‘ƯÓ °¿¥ÄéW™‰kß [ïSщñÓ¦ô“Û«‡“ÍjÏ̉©ˆׯϺ¼€¥ƯÏÅ™‰kß [ïS²Ø°½¿»§ô¹Ú½ăˆŸ“-å̉ ߈½ËÉ9ŸÖ©Ø™‰kß [ïSÛ«‚ ½9½¶ÈăˆŸ߈׼Ĩ°»Ç%Ë¿ĂÛ«‚ ½9Ù™§¹µØëöö«́Ù×›¾ơèÅ«‡“Íj±Ư±)°¿áƠ߈ÏÔöˆĂÙ—¶û¶è…óĂÙẲ³ºóÛ«‚ ½9ù×±»ăˆŸ;ơêăêƯÂ߈îô“ÆÏÄç̉ơÔÑÓ¿ºîÅDĐØó#шŸÖÍÄƠù×ƠXĂÙơ髇“Íj·ÔƒµØ÷‡ÏỒÄÅØ¯éá ºăˆŸ;k߈‰¿Iử₫ǯȡÓéËơêư“Ù½ÙÚÛ«‚ ½9Ûº÷‡÷ÁÙÚíÅ«»—¶™‰kß [ïSï̉¾ơØơê“Æ³–¶ è œ‡߈«‡“ÍjƒÚïƠ¿å̃ÄØ¹̃«Ôéêó›¾£ØăˆŸ߈ÄôX÷å5ÓƒÈ߈éê匿N«‡“Íj÷»ơèÅơÔª¶2tT­Öª‡’̀jÿ¯¶µØ¡ÔäôĂÙƠåĂù×Ơºm¢Ç…ÚÅÔ¹Ú÷‡ä̉‰‰±½ùׯÓÏŇºăˆŸù×¹Ú¿ºß»û‹Ç¿ºÑÄë¹Ú£Ç‡º­¾̀Ç¡ÈíÖ±»Û«‚ ½9ûÓÛÀÍƠ∰»‘Ó±½߈ÅÔăˆŸ;ĐÄêÏ̉—¶ơèŽÍƠ߈Û«‚ ½9™‰kß [ïSƒñÚ…àÅñ¿“Èâˆ:÷ÁÚ‡ Ö‡¼7Ă¹Ú«ôÅ–À׋ÇĂâÿÜŸIÁ̉9¥‡9¥‡×ĂÙ¡ÔÑØƠ¼ÇØóÇÅàÂí³zĂĂ ›­±àéM‡»ôù×ûø§ôÑ·ëöºÛ«‚ ½9½Á½÷‡̃γºó£̃ăˆŸ–Óù×ÅØ¸Á¥ˆ]1Ï̉ƒˆ·‡‘×8çÓØ8¤‡ÖÑÓñƱ»›Úơ꿌˜ÓÛ«‚ ½9÷ÁưÀÿÚăˆŸ;§Ó©¼ÛÇƠÚŽçÚùêÙÚÿÇôXÿÚưÀơÔ%½ÅØå̉ ɇ›¶éå̉ ¹ÔXêö¹ÚƒˆóÔ9¥‡ăˆŸ;kÏ̉«·3uUù׫ԟ÷ÁÄØ‰º±”ÏŹڗ¾—»Ë̉™Ó¥‹Ăô·Ø¶‡Ö8æ̉ÅôơÔÛ«‚ ½9¥ØĂÙ¼ÜÑÓåËӋë©(­€ùצ۫»Û«‚ ½9ơêÙÓå̉ ëöÏÔ©Ó¹ÁơÔ¹Ú“Ơù×9¥‡ËÉ9÷Ù§ôƒØ€ë›¶éơKï!À¼Åƒ½º½ϺÅÔÖÔ†6¦jöä5̉¾ºöǼˆëö³¹ÏÅçíỞơĂ˜à»‡߈µÓŨÈëö߈±»Ă÷Úó¶ØÚ½߈ϺăˆŸ·ÅơĂñÓÛ×9¥‡ù×½±»ÅÄÙÅëéăĽȧôăˆŸ¡ÔÏÔ‘Ôô—ˆÇÓØ±”÷ÁÍÄåß¾Ï̉ƒƯÛ«‚ ½9½ĐÓđÇ çºÇփؙ‡ĐÓ÷Á·µØÏÔ’÷§n±»ßÄÙƒvŒ¾ívëöûرÁ“º›v®ÓÏÔơêœÜăˆŸăˆŸ;®¼ü¡È¿ºăˆŸ;Ë̉£ƯÁơÔÛ«‚ ½9™‰kß [ïSÓ¾ш·ÔâººÅØă›Ùױő­Ö³Ø¿‰ö¿ËÉ9‡‘³ÙÚËÓ›¾¼Ü§ÓÙ½Á°Y±»Û«‚ ½9ó²ÈÂٵث‡“Íj¼ƒvóÇăơƒ½ÍÓƠܳȃv߈å̉ ÓºưÀñ™ơÛ«‚ ½9Ÿ}Ù½Î̉ßÚ¡ÛóÔ€º­Ø߈¹àĂÙ«‡“ÍjßÄÙÎŽ9¥‡ׯÍË)éÛ9¥ơÔÏÅỞ«d©À¼ ÷Á½€Ï̉íØƒÚÁ̉‡ÿ¯¶ÍË)éÛ9¥÷Áï³2ÿ§ù¿›¾±» Áµ†߈ƒc¡Û̀ÓÙ½óăˆŸÍ­H̃ˆù×8¤‡ù×ÁÛ¬ÖϺ½€™‰kß [ïS·‡‘×8çÏÔ§P½±́ñÚÛÀÿÚËÉ9ÿÚçÚ߈Á½±»%œ‰¾IÏÔÏ̉ơĂö¯ÈÙ½߈Ú׃v·Ü߈Û«‚ ½9ù×™‰kß [ïS©‡¥2ßëM¡Èù×ßÄÙ½°¿Û¦¹4‡ÇÚ¹¹í˜‡ß»û°” ¨Øèơ£ä»‹ÜÏỐ‡ù×ïƠ©çÚăˆŸÏÔ­Ö•ÂÿÚ«‡“ÍjÙ¿ôëöå̉ ù×ơÔ“ÛÙÚ´aÑÄ뉿Iẩ«ª›¾ÄÓưÀƒv‘ơóׇ×çÇÑÓăˆŸ;±»ùêéĂÉö̃ÁÛ«‚ ½9߈ăˆŸ;̀Äß%¡»»‡ÆÓ¾åIÅÔ½«‡“ÍjóÙ§ôÛ«‚ ½9߈±»áºơÔÚª‚ +¼9«‡“Íj¥ÓµØ•ÇỔÁñ¯¼Û«‚ ½9†Œö½ù×¾À½Ă8¤‡Ö±Ü±»ÓÛ«‚ ½9‹Ü±»­7¨ºÛ«‚ ½9„Ç4ó™ÁăˆŸ;™‰kß [ïSÅØ»ÅÀ¹.±»µØÇÖù×Î̉¶‡Ö8æ—»ÙÚÏÔÏÔרÏÔơĂ™‰kß [ïSö߈߈°»ÏÔÅ–ă½·̣ùÚŽ÷ô™‰kß [ïSàÛªd¸Ú¤ˆ \ 0 ăàÏÅÅÁư„›¾Ù½ÏÔÂÙơÔÍÓùẹ̈Ç™‰kß [ïSöÙ×Ù½ƒˆÚª‚ +¼9ƒŒ¶ÅÙ½ĂËÉ9Ø÷‡ùû܈9ш‡ºåôÓº¬ÄºµØ½ß„Ϻ‹È0ñÓ߈³È«dƯÓ é‡שº·‡‘×8ç̣ÂëöăˆŸ¹àׯÁ̉ç°»±sÁËÇÖ·ÔöߌÛ,ø×щÛºµØ«‡“Íj•ÖÛ«‚ ½9éÚ“Ơ½Å™‰kß [ïS±»çÚ£‡™‰kß [ïSơ»ửá=ç̉£‡Û«‚ ½9ÏÄÙYÛ×û!©ÜăˆŸ;·Ø ÁÉ̉ÑÅỞ½ÔÁ¡h½Ô‘ÓÛºæ̉‡ÛÂèù×Û«‡“ÍjÛ«‚ ½9 %‚v¸Ú©ÇǼ©ÇÛ«‚ ½9½Á9¥‡˜‰j̃ZîSĐØª÷¿‰ßÚñíÈù׋ǃvÛ×ùëÛ¾ÓØûÙ׺¿ô±»ƒÖ«‡“Íjï²2“â­ÄÍÓ©ƠĂÙù×·Ô©‡¥2ßëMß»ûÙ½£Ư±»‹Ç‚vÛ«‚ ½9ÇÖÙ½ÿ¯¶Ïű»öÁăÚô…ÇÅ›¾9¥‡×ù×ăêœÜ«•·‡‘×8ç÷Á Ëûôë‡ÀĂå‡ÉåϹ§ÔÍÄ™‰kß [ïS¥È‰Ϻ­vÚ׃vª‡’̀jêöÛ«‚ ½9·‡‘×8ç÷Á±»¹ó½₫Û«‚ ½9º·Å¯å›ÛÓÔÏÔYßÄÙºº€¾™‰kß [ïSéÓ…£­ÛªÚùסǫÔÛ©ˆª¶2tTœØùׄn·ÜÅÔ‹ÜÁ̉̃ÄØÁ½ÅÓ¿‰¿ØŽ»ØÑÄë±đ¥ÛñÖÓ§º¥‰ÍL…½½ƒv³ô…ØÁĂ9¥‡½¾Ưƒ½ù׫»ÏÔ™‰kß [ïS×Ă«ÔåÁÏÔ¯È×çÚͼàö +ó×߈ÜͽѶÁ“Û«‚ ½9ù׉¿I¯ß²Ø×ĂÚª‚ +¼9Û«‚ ½9߈÷ˆ¥ºÚ؉j̃ZîSç߈”Œ»Û×ßÖÏūу¾‘ï½›¾ç̉½ø×¹Ú«»—¶ÙÚ²ÈÑØÁ‡é/×:ææê$ »ØÁĂ“È€º¯¼ßÖåÁéôƒvÔXâḈ‡ÇÀÑ́Å9¥‡ù׌Á¿Å·}“¼™‰kß [ïS“ƠáêÖ™‰kß [ïSáƠü¦†ưÀ³Èù×ơêƠXTÿ¯¶Ă߈ûØ¡Á߈µa¶&ưÀ¿ñù×™‰kß [ïSÍË)éÛ9¥ëÓ›ºщŽ÷å©¡çÿ¯¶ÍË)éÛ9¥߈‡ƒv¹Öơêß»ûăÔÁ̉Û«‚ ½9̃ô˜êèäå̉ ±×µ̃Á×°»Û«‚ ½9ö ËûÛ«‚ ½9ùêÏç¡ÔƯơùê‰Ơ€ºíÖ·ˆưÀôéív÷Á§ÆÀĂ˳¾»Á̉ÁÙûÓ‹ÑÄ뙉kß [ïS߈¿ßÙ嘉j̃ZîSɇ‘àƯÓ ŸÖ«‡“Íj½¥¾¡Á­¾íØ«ÓôíÖư“䌾N£ä¡ÛÅÔ߈߈ä̉ÏÔùëâÁ›Û߈™ô±¿á=ĐÓÆϼ߈µØơÄÓºÑÓƒÖ•Ö›¾½™‰kß [ïSÍÄÅôđÓ¡ÈÓÆ³ºóÙÚíºÛº™º›¾˜‰j̃ZîSÙ½™­ÄƒÖרÓÅ÷ÁÏÅ¡Ô׌ñƯûƠƠăˆŸöÁ +Ù½¸ÚóÉñڽ߻ûúÖ‘ÔÛ«‚ ½9«d«·3uUºù×·‹߈ŒƠùæ߈áêËÓÑÅÁĂ߈Û«‚ ½9ºíêăÔưÁ•ˆ›¹ÚÀËÉ9ÍÓƒv麗¶½ÜÛ«‚ ½9«·3uU™‰kß [ïSá=ưÀùÚÁĂăÁívÁƯË܇ŒưÀ©‡¥2ßëM³(¸ÏÔëÓ“Ơ£²Á̉«‡“ÍjÅÔ±»Úª‚ +¼9™‡·Øù×çÚù×ăˆŸăˆŸ߈ÍƠ¹Úå¡ÏÅ÷ÁÅØô8¤‡×ö´ĂÑŻؙÁ³ỞÏÔ8 ¤‡ ׳½ƯÓ ÙŒë*«8¤‡¡ÛĂºív߈°»ăà߈¦ÓÑĂÑÄëшù¿Û×ÍÓù¿›¾ñíÈÄÖ¤ˆ\0­¾½ƯÓ ÑØ½ÅÔûëöÇÖöÏÔ߈¿ß«Ôơ$©¿ßÏÄ‘ÔỔëöÛ«‚ ½9½è«Ô’Ơíêư“—kß [ïSóÂí½î½“ÆÛ×Û«‚ ½9щôºöö«½°¿‰¿IÇÖË̉ÇÓøêư˜ưÀăˆŸëöƠôê£Ø‘Ö‚v…ù×ăˆŸ9¥‡·̃ívËƠ«ÔëöñÓå̉ ½Ô/ÅØ«Ô¯G‹ø“ƠÛ«‚ ½99¥‡×ù×ï½›ÚăÁå¿¡ÔÖÆơêÓØÏÔÏũӧôëöÑØÙ½ÍÓù×÷‡‹Ç™ôÙ½¯ĐưÀËÇơê³àÇ‚ ƒÚç'½«‡“Íj«‡“Íjû¼¯‰¯0µØÚ·Ô$ăˆŸËƠ¹Å³ôÏÔI­vƠÛ«‚ ½9µØ«»æºƒˆívÍÓ³æôëÔÛÄÓùê÷ÁăˆŸ·Ô¢Ç¯×Äô¶èŒuÏÅÁƯëöÛÀ—ˆ·Ó ¥0•…ˆ;«‡“ÍjéÓ©‡¥2ßëMÍÓÙ½9¥‡×önÖ¾ÿ•½›Ú¿»½ƒv߈Ÿ}ñÖëñéÛº™ëéåÎ̉±»«»ÏÔ×¾ëö©Ó߈÷ÏẶÁ½ĂỂÙYĂœÁ ³Èçº߈¥Éíº€ ¡¦Ó«‡“Íj…Ơ­Åº‹Ç¤ÛÙÚ„çđ³Ơ…à∓Ơ½߈¯È«‡“Íj÷¼±»ƠăvÁ¤ù×Ï̉ơĂÍóÑÓ—Ó̀Ä£»çóÿÚ™‡Û«‚ ½9«Ó¹Ú‘Û¿‰ÁƯêöÍË)éÛ9¥ƠæéêÿÚÅ–ăˆŸ;k‘³Û«‚ ½9‡ºÛ«‚ ½9ưÀăˆŸ;™Ô°»*³º«Ô¡Á»áơêá×ëö§Ó‡ׯ₫ Ç™ŒÜÛ«‚ ½9ÿÜ߈ß»û©ù×™‰kß [ïSïƠƒ¾‘É̉ÓµO߈ë‡ÿÛ́–G0߈ƠĂăàå̉ ÓÉÁĂ₫ÚăˆŸ;Û«‚ ½9ơԣ؃v¾̃‡Á¡Ơƒƒvº§Ôù×ôĂÂÆ©‡¥2ßëMÛ«‚ ½9œÔ©¼©—ˆáê½±»¿Å³Ă¼ƠXÏÅÛ•©Óô áۇǿ‰ÏÔÇĂơèÅÛ«‚ ½9–ˆ¡È«Ô±½Ơ—¶Á¥‰ÍL…œ(ÍÄ¾Ø éê°¿ƒv£XÉ̉Ë̉ÏÔåô½ÇÖăˆŸ‘®·èË̉›¾ƒv߈ª‡’̀j½™‰kß [ïS“¹ƯNÑÓÏÅ߈¿Å¿­Ø¿‰½ÈÛ«‚ ½9ÚÀ ïdù×ơÄ•Œ߈óö½æơÍË)éÛ9¥“¹ƯNÓÅÙÚăˆŸ;k•Öơê®È·¿Ø±»óǃØÇôÿ¯¶½Û׋ÇöÛ«‚ ½9ùêÏÅ‹Ü÷ÁßƯ߈Û«‚ ½9Ởá¬ÑÓÑåôñÁÆ»Ë4™‰kß [ïSÏÚƒˆ™‰kß [ïS÷ÚÏÄ»nɇËĂÙù¿ªÛÙ½ÏÔÛ«‚ ½9©¼ử–¾ÎÅ9¥‡Ú×ƯÓ ÙÚ…ÖÛ«‚ ½9‡x߈‡Œñ~ÍÓƠÓÅáƠŸ Å–ùשӗ¶̀Ă«‡“Íj߈½€߈—¶Ư•Œùơ»Úæ'½߈߈ÍË)éÛ9¥½È¹Ú“ºÿ¯¶‡ŒÙ½±»µØŽù潃ÚƯ‰ÑØÛ«‚ ½9°»ưÀöơÅÁ±»­ÄËƠ°»ưÀ¥º4¥ØÙ×ăˆŸ;ăˆŸ;kÇ»ÿ¯¶™‰kß [ïSùסÁÁĂ߈Ù½ëö8¤‡Öùס½ÁĂñÚöœÁ×¾ĐØø•ÜÇØù×·‡‘×8çù¿ÏÔƒvÙÚ›¡ö—ÛñÚÛ«‚ ½9‰¿Iøêàê釽­Ö·ÔơÔ±¿½€µØœÜ­ÄñÚËÓ±»©‡¥2ßëMĂ¹ºÏÄ×܃ˆ‡Œ‹Çù‰ø×¿‰ư¨ĂßÚÓºéÛï²2ơê¿»Ù×ĂÙóÄ·‡‘×8çö·ÔÛ«‚ ½9óÔ™‡ù¿8¤‡߈·‡‘×8çÈĂửÓ™‰kß [ïS™‰kß [ïSỡ¥º‡“™ÓăˆŸ;×¾ÍÄ߈ëö½›¶éăˆŸ;³ºóÿÚè               ̃»úƒv‡¿½ù׋Çđ»9¥‡³½ŸƠ¾½’ߌÛ,}́v¯ß‹ÇÏÅÍË)éÛ9¥ƒ½ăˆŸ;kÜö¹ĂÙß»ûÏÔÏÔ½ú̉ÿÂáç½±»¡È™‰kß [ïS©‡¥2ßëM߈ƒÄ¥Óù×Ç̉ÛÆÿ¯¶Ăº¯ƒßͯ¥'=U#QK¯Â±»ÛÄÓƠ¾GÏÄù×Û«‚ ½9«Ú»•…n•̉ÿ¯¶¿öívăˆŸ;™‰kß [ïSñÓ§ÓµØÿ&«‡“Íj±»›¶éÍË)éÛ9¥ăºƠ´Ăº«‡“Íj¹Ú‡ºÛ«‚ ½9ïŵØÛ«‚ ½9¡«)Û«‚ ½9ï½·‡‘×8ç½€»y÷Ú߈ăơ•%ÏŽƒˆ‹ÇÑØ×¿8½³Ù½Ó©‡¥2ßëM™ô±»™‰kß [ïS‹æŸ̃ÿסÛÛ«‚ ½9¥‹ÓØé±»̀Ó–»ä̉߈©Ø¯È¡Ûö“½ăˆŸ;ÍÓÏ̉ÛÀ¯ëöƒvçÚ¦¹ÖĂƒv½¡Ôù¿™‰kß [ïS±»çÚÿÚ‹Ü߈ƒÖ‹•ÿÚø×߈ä×Ơ©À¸Ú±ÁÏÅ™ôăˆŸ;ÏÔÛÀ«‡“Íj½ûÓ›¾ÅÔ¯×óÓçô¯È™‰kß [ïSϹ©ÓâˆËÇßÄÙ«‡“Íj™‰kß [ïSø°»±»›¾Û«‚ ½9›¾Ó ‹›æÉĂ™‰kß [ïSï³2ï‡ív“½ñÓÏÔøê•Ö±»µØÓ̉›œ߈ÑÓ½×¾߈±«‡“ÍjëÓăë×¾±»÷Áï»ÇÖ»ÁƠÁ½Åàø×±»ëöëö‹ÇăˆŸ;±»±»ÅÓ–««¦«̀»««™Ó¡Ç߈úá̃½ñÚù‘Á½‡“È­Ö±¿ÛÅ‹ÈÏÔỞÛøëÓ…öÏÅíº¹ÚöÁ±»ü̉Óº¿Û—…ÏÔ™ôăˆŸ;°¿Û«‚ ½9Ǽ˜êèäÁĂă³«‡“ÍjÙ½“ƠăˆŸ™‡ív·Å¯ÛºÙ×ÍË)éÛ9¥éÓ½ù×ÏÅ÷Úẳ±½•%‚vÏ̉à̉ƒ½½ĂÙׄùê¯ÈÏÄ߈ÿ¯¶™ÓÀĂÏԓƵØù×·ÔăˆŸ;Ü•Èû›ưƒvÓ¾Ç̉å‰÷‡Û«‚ ½99¥‡×˜êèäËÇ÷‡©Ø°»ùêăî‹ÇÛ«‚ ½9íÖÚª‚ +¼9ÍÄÑÓ©È́Á¡Ô¡Ơ›¾ơèÅ߈8¤‡ï»ÿÚ¾ßÇÖƒv·Ô©&ÏÔá ÷Áíêщ±¿ëö™ØăˆŸơÄ™‰kß [ïSÑÓñÚ9¥‡Ó¿Å˜ô»yíÅ™‡™‰kß [ïSÑÄëÛÄÓ³ Ç»¾«‡“ÍjÛ«‚ ½9Û××Ó™‰kß [ïSöÑÓ«ÚÍË)éÛ9¥ƯÀ™ôñÖ™ØĂô÷¼ÙÚ9¥‡̉ÆóÇå̉ Û«‚ ½9Á½˹ÏÅ›¾Ưº˹¼߈̀Ê)èÛ8¤§Ôá ¡Áö‹Çÿ¯¶ÎÔÿ§…ôÆØ±»ÑÓٽهÏ9…ëö€ºƠ·‡‘×8ç³éºßÄÙù×™‰kß [ïSø×ºơÔáÓ§à‡²ÂºÅØ¡ÔÅØûևǫ‡“Íj™‰kß [ïSÅØôê·ÅëöƒÖƒv¾çm«‡“ÍjÁÅÁ³ÁƯ«‡“ÍjÍË)éÛ9¥ß»ûÇØù×ÙÚ—ÍöÇ̉ößÚƒvÙÚ߈àƠ9¾º‰¿IơÔó¬ô +ƒvÅÄ߈ù×÷‡ÙÚ±» ÊûûÓûƠ½€ïÚÀĂæ ç´߈ÙÚǺÿó߈ÿ¯¶#ù×ǽưÀŽÛ«‚ ½9±»ö¼ÍÇ­̃»Ø¿¿™‰kß [ïSÙÚáê߈÷ÔÓÔáƠƯºÁ‡é/×:óơĂÅÔ‡ŒưÀÛ«‚ ½9Ž߈ëöåô‚ ăˆŸ;«Ñ«‡“Íjé‰ñ5ñ·¡ÈÏұÔăˆŸ;Û«‚ ½9¿́…Ø߈°êØ¿‰åŒ¿N­ØÏÔùêø×ƒ¿ôŽ”°»ÅØưÀ߈±»×ÙÚ߈›¾…Öçổ̉¶å×ƠÁ­€ÅÔ¯¾çÚñÚÇ̃q —¶ÏÅÓÆƯÓ §Ô׿gÙÚ‡×ơÔ¡ÔỞÙ½½±ëØơÔËƠ°»ÁÛëö‹Ü˹âû—¶ÅØ•ÜÏÅå̉ ƒØçÚĐĂ©Ó÷Áù‡ÿ§ăˆŸưÀÓØ©À₫®¶ï½½ô£ØÅÓ¹ÈÁƯăˆŸ;—¿źĽ§́̃»úÿ§•½Û—¿±È¾ßźÛ«‚ ½9߈«‡“ÍjÏÔ›¡½ß½‰ßù¿ăˆŸ;çÚß°„ô¡Kù׃vÍÓÛ«‚ ½9™‰kß [ïSỞÏćx–¾áر»½÷Ù̃ + ‹Ç™‰kß [ïS÷Á؃փ½æôÛ«‚ ½9Ơ§ùêÜÓ ‰¿I£Ø9¥‡ǺËÓ“Ơ«äå»á “ÆóéÓÆû(÷Á™‰kß [ïS߈¹Ø±»ƒ¯Ơ«‡“Íj™ëéåËá€ÍÄà»Ø̃ôÙÚ©‡¥2ßëM¿»¤ˆ\0«‡“Íj©-×Ë߈óÇÑÅëöơê߈ø×ỞŒ½ÂÙ÷ÁÛ×ÏÅå̉ Û«‚ ½9œÁ̃ƯñÓÏÔ“öÅÓÓØ̃„ËÖ£ä߈‡Œ™‡´½€‚ˆÙÅëÍÓơć¹ß»ûƒèơÿ¤ß»û™‡ÀĂ å̉ ñíÈ÷Úø¿ª»Ûºå¼ ³ºóµØó‡ƒØÏÔăˆŸưÚ÷•ÏÅÓºÛ«‚ ½9‹Ç‚·Å‡Çß„߈ß»û›¾ËÖÎ̀ĂÛº«‡“Íj¡Û¿ß°» ¡Á½Ÿkù×¥ÇÏÔ«ÔÀõ†•¾½°»ä¿ƯÚ™‰kß [ïSÅØăꙇº…ÛƠÄǺ8¤‡âÄ ÍƠƒˆ“ƠùêëöϺ“×­Ä̀Ê)èÛ8¤å¿ªÚÀÙ ù¿à·Ó ¥0ăˆŸ;ÁƯƒvÓØÊÙéêÏ̉ñÓ9¥‡§’¹àÍăvăˆŸ;ë֓Ƈx麷‡‘×8ç̀Ó½€ÛéÓ™‡±»ä̉…Ö·Ôù×°¿ ½€ß„ÆÛ«‚ ½9¾ß‚vùׇŒ÷Áăơ»÷Áăơ†»œ‡€ºöĂÙï½³íºÁ“çƠóÂÍÄÛ«‚ ½9Ù麽€ÁÅÓ¸Å߈™Á™‰kß [ïSÁsÆư¶±½½Á‡é/×:¹Ú߈ùơ©‡¥2ßëMÊǃÖ˹ÏÅá ߈ ¬°àèM¿‰߈›¶éĂÈ»‡¸È¹Áͼçô±»ÙÅt˜êè䜇«‡“Íjù×­Äëö™Ó§æù×ÇÖ§Æ߈³È‹Ç±»ÖµÈÿ¯¶¤ˆ\0Ç™‰kß [ïS‡êÚ«‡“Íj±¿‡¥Æ·¼Í7ĂÙ¶™ôơl½é–¶ + +Ï̉÷‡çÔ¡߈ñÓưÀµØ̣ÇèÚơŽÓÍ¥ˆ]1¼ëöñÚï»ăˆŸÿÚ£ÓÑÓ…Ö“ƠĂÙ›¶éù×ù×Ù½Û«‚ ½9öăˆŸ–ˆÂÙ ñÓÙ½ºØ•½÷Ú™‰kß [ïS­ºëâ×ÚĂƠ›¾éêùë·Åăà™‰kß [ïSÜVÁƯå̉ Á›·Ôëö÷Á±ê½çÁÁƯÍË)éÛ9¥½«‡“Íj̣Çá×ß»û½Ù½­Ö5™‰kß [ïS™‰kß [ïS½ÏÅ™‰kß [ïSóÇăà¹Ú÷¼à¬ÍƠµØơÔÛ«‚ ½9›¾÷Ú¯»ơÄÓØ³Â¡Ø˜‰j̃ZîS¾ßZöÁóÇÛט‰j̃ZîSơéư»‡źăˆŸóÇׯ­vÛ×ăˆŸ;ÅŽÛ«‚ ½9£Çå»íê«ÔÏÔÁ©Àêö¯×ç½™Ó—ôê®ÈÛ«‚ ½9ÑÓ™‰kß [ïSßÚö߈ù׉Ưù×éÓÓØ±¿ù×µØ̣Â÷Á9¥‡›Û¡ÈéÓ¬ÖëÚ™‡ÏŲ1×Ó±»“ºå̉ ±»ăˆŸ;ĂÙơÄăˆŸ;ù×ÛÄÓŸĂÿ¯¶÷ÁºÅ‰ơ»½îơê³È¹Ú‘³¿߈ÁĂ¿‰…ؽïÚϼĂƠăˆŸ£ØÜ߈¯ƒßͯ¥'=U#QK¯ÂÿÚù×±»ùêÏÄÿ§Ù̉ü¦†Å»߈•ŒÛ«‚ ½99¥‡«ÔŸƠ‰¿IăˆŸ;較v¿ßù׵ؗ¶“±¿ÿ¯¶ƒ¾‘Ëdz׷Ńˆ«‡“Íj›ëöϺá‹Ơ9¥‡Á×™ëéå‹Ó‰¿IƒÛºƠçÚÏ̉éºË—¹Ú£ØêöívöÔ߈­ÄñÓï»ß»û€«ÔóÇÛÅïÚƯÓ ‡º½Ÿ±™‰kß [ïSƒv‹Ç¶«‡“Íj™‰kß [ïS¢Ç̀Ó₫÷ÚíÚ‡Œ¹ Û×ö‡x«Ô©¼ǺƯÓ ­ÄûÓØ+Ü‹“ótÏ̉¼€…ÓñÚÛ«‚ ½9“ŒÛ×™‰kß [ïSŸè—¶Ểï‡́çÆ…ÛÏÅÑĂ«‡“ÍjưÀ߈Ăí½Ø±»ƒv£ä§‚ñÔ£ ¹Úơꖾ嫇“ÍjÍË)éÛ9¥¿‰×¾ÏÔ™‰kß [ïSơê±»Û«‚ ½9ÙŒë*«ƒˆÓÅ¡Û9¥‡×ƒv̉Ù«‡“Íjëö½Ôƒ±»‡xîº߈—¶“¹ƯNI9¥‡÷‡¡ƯăˆŸóĂÇ…öË̉©‡¥2ßëMƒ‡́êƯÚ߈›ù×àˆÀ0p‹Ç¡ÈáƠ9¥‡ù×ƠÁµ†߈­…Ö³1ñÄÛÀÛ«‚ ½9çƒvÏÔ£ ·ºµØ§Ô•‹H±»ƒ½énÛ«‚ ½9›¾›‡±»µØ̃ˆÑÄëêÔ ›ÓØÁĂ½ÿÚÛÚËÙçôäôyéÓß»û–ˆâÔ“Û½©Ú™‰kß [ïSƒv˜‡xÓÙ½å×½±ºÅ¥±»ÇÓÜÔ¹Úö$ơê…Œ«‡“Íj¹Úœ‡£9¯ÈÉ̉ëöÿ¯¶ñÆ™ôﺹ¹½¥ˆ]1¤¾±»ƒvëö¿¹¨ÜS½€·ï›¾ÁƯ‰ƒÖÔçÚ™ëéå߈µØơêÏÔá Æ̉ÙÚÙ×âˆ߈ÁĂ¯×÷¨”Œ¡Ô÷‡±ëØÙÚ÷å5Óß~9¥‡ÑÄë̃Á™ºƒv“Ơƒˆ±»½€Ϲ©‡¥2ßëMçm¾ƒvº«Ô“Ơ¥ÁƯ öÁ ĂĂç̉ôêÛÀµØ™×¡ÁßÁÁƯ‹ÓÑĂ¡Ô™ÉƒÔ×é·ɇùׯÈëö™ÔÛ«‚ ½9¥ØÔơ­R×Óà±»ׯËÇ…à¿»éÓđa‡x©Ó“Ơ‹Èﺫ‡“ÍjÙŒë*«ç½™ô匿NǺǺщù×ĂZ½Ă«‡“ÍjăơßÄÙ§½Ç̉©¼ưˆ£ÔưÀ¢ä©Ç€Ä™ÁăˆŸ;û(º¥Û×èăˆŸ;kÏÔÿÂëöèơ­ÄÿÂÛ×™‰kß [ïS½¹ÚÂÓÍëö²ØăˆŸưÀ©Ó½Ô½‡ºÿ¯¶¥âù×™Ó†½̀º(¼̣ÇÅØƒv˜êèäù׺½÷Ô©Ơù×½Ü߈âÂ3™Ô±»±»™‡DZÑÓ•¾ăˆŸÁ‡é/×:Ñó½…ÔïƠçÚ‡ºÇÖ‚v¢äƒˆÅÄ•ŒÛ̃óÔ™‰kß [ïSºØ÷Á¿ºÙÚù×ÍË)éÛ9¥™‰kß [ïS˜‰j̃ZîSĂÈß»ûùơÅÓăˆŸ;׿8ÇØ¡ÛóÂÛ«‚ ½9Ç¡Ô÷‡÷ÁëÛ¿ºăƠĂº£Çƒv™‡Ûó±»ÁʼnăÂÁË—»ÍË)éÛ9¥ĂèÙ½¬ÖơĂƒÚ¥‰ÍL…ÅØ°»Œ₫öä5̉Û«‚ ½9¹ÚéÓ«‡“Íj¹Ú9¥‡Ï̉퇺ÙÚơèÅÛ«‚ ½9¿‰µØ‡ºẲ¬ÿÚÏÔ™‰kß [ïSºØñÖÁĂñ‡̃Úª‚ +¼9™‰kß [ïSƯÚêÓŸÈơĂüÁ‹Ûï½óÄ̉ºóÓ±Ôÿ¯¶Ö ™ÓƒÚ¡Á‰¿IœÂÅØ¿ơ߈ÍÓ¸Ú•ö‡Û«‡“ÍjÇ´™ëéå¹È¡Áù×ùêé–ơêä̉»Áùꘉj̃ZîSơ…ƠŸÜó¶Ûº«‡“ÍjÖ‡¼7©Ç•½»¼‘Ϲ¶Û·‡‘×8çÓµO©ÓÏœۙ‰kß [ïS¹à́Æ“Ơ®˜‰j̃ZîS¹Á‡Üÿ¯¶ï½¡Áƒà¹ÚåÁÏ ï³2ơĂѫڗ»£³™‰kß [ïSĂºϹ™̣ÿ¯¶÷ÁÖ¾‚ÖăˆŸÓº™‰kß [ïSÏÅĂÙ¡Û™ơÁƯĂưÀ¸Úƒv½—ˆÑ؃v÷ÁĐÄêÏÅﳩù¿©‡¥2ßëM«‡“ÍjÑ`›¾Û«‚ ½9Å–ÇÖƒvÛ×ĺÏ₫ÏÔÏÔËÉ9µØ“B…ö½€‹ïư9ơơÛ«‚ ½9¡Ç³ºÅċǙ‰kß [ïS«‡“ÍjùêÛ׺Û×å̉ ơêµaé·ăˆŸ;µØ‚v«‡“Íj© öơèÅ™ëéåÛ«‚ ½9ƒØ“ÈÛ«‚ ½9ëöáêù×ÑÆ‹ÇăÇíÅ&ơêÔù×Ù܃Ú߈½¥Øƒ­ẳµØĐÄêù×›v±»‹ÈÁ×­Öщ½®×₫®¶çmÛ«‚ ½9Ûºă»ăˆŸöö¹»ëÔ“±ÏćÇÈfñÖ÷ÁÅÔ·̣ÿÚ½½ù¿ù×߈ô÷ÁŸÖ«‡“Íj‚v¶™Á§Æ“ȹړ¼‚v±»Ï̉™‰kß [ïSơĂăˆŸ;êö÷¶Óü̉Ÿ—Ó¹ÚÑεàûÓ߈ÏÅùê8¤‡±ëØÂ«Ó±»£ÇăˆŸ¼“ +¨Â÷ä5̉±»ëöơĂÿÚÛº™ÓÇÁƯ¶“á=9¥‡×$á ¯¾«d¯ëơÔ‡Û¸ÚÍɻڪ‚ +¼9ơèÅÅÓÂ…ĂƠá÷‡½Ôá ·‡‘×8çù×£Áơ꛾÷Ú›¾ª¶2tTÍñÓ…n‡ø߈ƒvçù×µǾv¶߈½­¾Û×±ëØ±Ăº£ôŸÈÍÄ¡È߈̀­ÍƠÙ×Ïf±»ÇöúÓ̃„½±»«·3uUͺ©Ü•½ăˆŸù×›¶éùà›¡¹Ú±»Û«‚ ½9±½‹Ü±»æ½߈—¾ăÇíö‡º%ؽ©ÓÙÚ±»Û×ÍË)éÛ9¥àÄ́ÅÿÛ·§D ĐÅù×ûÖÙŒë*«ºy‡ÇĂÙïÁ‚v±»ĂÈíÆưÀ¡ßçÚÑÓø× ̃åÁ½Ù½ÏÔϺù×ϼÁZùê™ëéåµĂñÖơÔ«‡“ÍjÏ̉†º߈ËÉ9º­Ö«‡“ÍjÉ«‡“ÍjƒˆÛƪ‡’̀jù×ƠùôüÙ«ÔÜÍĂñÖŽÏÔç¿ëöÏÔ₫ÇĂù×ùêG½¹ăˆŸ;•ÇăˆŸ¼ë“Ơ«‡“Íj¹'ß»ûÎÅS½»̉÷‡¹ÚÙ½™‰kß [ïS›¾߈ßÁ™ÁßçéÚƒvù׫‡“ÍjͺÑÓµØ×Ù½ßÚÛ«‚ ½9½·¼Í7Û«‚ ½9ÁƯé~ëç9¥‡ăˆŸ;ÙÚăˆŸ;k²# ‹Ç÷Ú™Ó½€·à·‡‘×8ç¡È©Ó¾ơèÅơăÖƠ÷¿‰ÚÀÙדƠ™ëé婼₫®¶í—G§Ôƒ×Ơ¹ÚÏÔÁƯóÂăÄ«‡“ÍjׯÛ«‚ ½9¡Û«‡“Íjù×ÏÔíÁÏÔ¢äưÀ÷ơ«ÔàçáÛ£äÛ«‚ ½9đùׅ‰½€½ØñÓïƠ×¾³ÂàĂÙ½ñÖ¡ÈíÖ/×Îăà‚văˆŸ±»ªÔ‰Ô÷å5Ó“Ơ½©½ÑẠ̊Ç©ÈæơÔµ†­Ö±»ëöĂÿ¯¶߈•á÷Ùºơ³ù×óDZ»ĂÙ“ÈéÓĂ÷ˆĐÓ9¥‡߈ĂƠ¯¼ÓØ™‰kß [ïSá ¼Ô ™‰kß [ïSǼœØ÷̣ºÚ×ö¤%̀Ó3ûعÚôêËqÁ§Ô·‡‘×8ç¹Ú™‰kß [ïS߈ßÁùÏÅÅØÏÔưÀç̃•{›¾±»Û«‚ ½9¡ÈñÓ«‡“ÍjêÚÅÓ•ƠóÂñÓ±»§ßîº +ëö¹Ú9¥‡é‡ÏÔÓ ‹›æáêôÔ›¾Á̉¾ÿ¯¶‡ÚƠ¡ÛăˆŸ;½“‹Ù™ôơÔÖó÷ÁµØ¹ÚÁăÍÄÛ«‚ ½9÷Áª¶2tTóĂ#9¥‡ƠÅïƠÑÅÏÅá̉±ÁÛ«‚ ½9ăˆŸ;íºûØÁƯùשØÏÄ—Œÿ¯¶ר‹Ü¸Ú‹ÇËÉ9±½Ù½ßÚ¹Úï½åñ½ׯµƠµÍÚ×ƠX­Ó” +«·3uUăˆŸÓÆÇÖ¬¿á™‡™ÓµØÅ“ÆËƠÙÚÓºÑÄëéêÙÅ믾ٽÛÀăàÙ½ù×·‡‘×8çÑÓ·ÔÑÄëºÅÇÖ÷ˆ÷êï½¹ÚƒÏ̉›¶éöÙÚÏÔăˆŸ;kưÓÅƯ³¡ÈíêÿÂÁÓ̉̉½å̉ ƠÜ麫ÔÁƯ©ØéºŽ‡º8¤‡Ö ¿‰ƒØ“ËÈ9 +ëöœ·̉ ¤0ÇÊăơׯăµؑÁăˆŸ;ÿÚßÁ™‰kß [ïSù¿Û«‚ ½9̉º«‡“ÍjÏÔƒÚ³+ûÓ±»Ÿbư“ÿ¼ăˆŸ¹Úù×ׇ“ÏÄƠı»ĂĂ ›­±àéMËƠùơƒÚăˆŸ;kר™‰kß [ïSÅ»®‰®0ö˜‰j̃ZîS¡È€°»˜ôđ«»ÛºÓºÁĂƒv«‡“Íj‰¿Ißæ¥Û₫®¶„à̉±́¡ÛߌÛ,ëö½Û«‚ ½9­Äơê󽙉kß [ïS™Ø£ôơêăˆŸ;ÏÔå̉ X§ơ¡È¤ˆ\0ĂÙ½́vÏÔ‚à±»ù×÷ÔĂº‡Œ§Ô߈ÓØ«‡“Íj߈“d½€ÿÔ§ÔŽ‡½«‡“ÍjÉ™‰kß [ïSÏÅẲôê‰(×ñíÈ›‡ëöïÂƠÓÿ‡Ở›¾ôœÜÁ̉˜‰j̃ZîSÚÀ™‡Û«‚ ½9×ÓÅß·‡‘×8çŸÖÿ¯¶χé-ƺƒv¹ÚÓ߈ÁÙƒv¾Å“øêĂÙă»ÏÄ…™‰kß [ïS߈ăˆŸ;kÙÚ«»±½Ù×§ÓƒÚÓ̉Ù×ù×ñÖÿ«íÖﺷԑøÅ–߈çô¹ÚÍǶ±»¢äë8¤‡™‰kß [ïS§ÔĂÙ™‡±»‘ơÏŰ¿ É·¦D ·¼Í7ïÚׯÛ̀ạ̊^ëö©-åÁ¡ÛÛ«‚ ½9¡Ô…ôƒ­vªÚưÀªÓăê¶²zÿ¼±»Û×§ÈØív߈±»°»ù×›ÚÛ«‚ ½9¥ƒÖÛ«‚ ½9‹Ç9¥‡ƯÏÙŒë*«±»÷$ơúÓº÷Ùëö™µØ£óÏÅƠù×Ù½߈‡Çϳ¾½ ù¾å̉ ÏÔgƒ¾‘ôưÀ‹È˜‰j̃ZîSÏÅ߈ïÅÓº½ÍƠºÚ×9¥‡áˆÁ0q¯‰¯0¨¼ô‡ººÁmưÀºĂÏÔ™‰kß [ïSăˆŸ;›áêµØóÂëö¡Ô˜êè䥺ÄÿßÛĂÙ™ôƠÅÏ̉‚éÔÛ×Ë¿‡³›¾ûăˆŸ;˜‡‹°µØôĵơÔưÀù×Í™ëé宼±¿«Ó¿–¸Ú±»™‰kß [ïSÓöÁăˆŸØ¤ØÑÓ“º«Ô£äơ꫘S̃ˆñÚ¿‰߈Öå‡öù×∽€ïÅëö•åÁÙ½øêÛ«‚ ½99¥‡×±»©¼Ö̉‡‡ºá³éêÑĂß»ûÛÅùêƒvÛ«‚ ½9ëÓÙƠăˆŸ½˜‰j̃ZîS߈«‡“Íj߈©¼âÛ£äáê­Ö߈ơêơÔ°ÔîÀơÔ‰ÛׯÛ«‚ ½9«‡“Íj™ÓĐØ¿»Ó²Œ½Û«‚ ½9øêơÔÛ«‚ ½9€ºß»ûÙÚùêăªÚù×Û«‚ ½9» ׇ‡ư2³·‡‘×8çĂô·Ô‡Û÷Á“ÈưÀ¼|—¶ä×ôÅIÏÔƒ9¥‡ĂÙÏÅËƠ»ØµØ©ÓÛºƒvăˆŸÛº¾—¶µØ‹É0߈Û«‚ ½9¶¾·ÈÏÔƒv˾ĂÙ˜‡°»±»Ó¤Æñ‡ù×ßÄپߥؽ“½¿ºù×±”½·‡‘×8ç«ÔăˆŸ;ƠỞ¨¼ÏÔ±¿ûq¹ÁߌÛ,™‰kß [ïSƯÓ ™‰kß [ïS™‰kß [ïSÛ«‚ ½9ú(ƯÚøêDÛ«‚ ½9±»Û«‚ ½9…»™ơÏŵß߈9¥‡ưÀƒËÇâT£ä…¼çÚ±»ƠâàÿÚ“¼‡×«‡“Íj›ÚÇăà™‰kß [ïS‡ÚÅ„ív‹ëÅôëö±»Ó¼‡Û«‚ ½9“¼ª‡’̀j§Ơƒv½߈½½·̣«Ô¥¾ŸÍBºöˆÛ׆“ß„ׯ½Ôº½«·3uU›¶é›¾ËÇ¿¹ˆơê×Ơ©‡¥2ßëM…ØĂƒvöù×Ă¢Ơö9¥‡ÍƒđÛ«‚ ½9«‡“Íj£äÄöơêôêTíÖ‰Ûơù׫ÔùêÑÓ«‡“ÍjùêÏÔ½Èù×󳕭ԧồ&ă½ϼơê«·3uU“º« ©ƒ»5籘‰j̃ZîSÛ¹º±»‹ÓǼÛÄÓÚª‚ +¼9™Û«‚ ½9·ÅØÓÊñå̉ ÓÅÇĂ߈߈ơêÛÀª»ËÓéê½Áử¶ùÛÛ«‚ ½9ÁƯăˆŸ;kÏ̉«‡“Íj̉Å™ØûƯ߈…aåÁsї»ívơê¡Ơ“Ơ·Ó ¥0Û«‚ ½9öö™‚±»̀ÓƒƯÛ«‚ ½9á=ǽÏÅßw¹ÚƠ½ëö9¥‡×¥ƯëöÏÔÅỔÓÓÜÏÔÿÚ9¥‡Ó‡ù×ÙŒë*«åסԟƠñÓù׿ÅăˆŸ;±ëØ™‰kß [ïSăˆŸ;µƠÙÚ½רóÇÁSÁĂ߈ăˆŸ;Û«‚ ½9ÿ§£X¹ÚÑÓ÷ÁĂÙ߈ÏÔÁ̉µùŸ°̉Å™‰kß [ïS±»¹Ø«»ỔÅلؤÓù×߈©‡¥2ßëMÑÓÛ«‚ ½9ù×Ư™¾ºÏÔÛ«‚ ½9¹Ú½ôâà‡óÇ·Ó ¥0ëö߈ÏÔ麺y÷¿à8¤‡̉*߈÷Ú½™߈÷Á©ÓÓÆ9¥‡‹Ü«»̣ÇŸ ÙÚ߈ÏÅ«»¶½ĂÙßÁ«́»¼«‡“Íjµ°»›¾—˜¯Ơé‡Å»Ï¿߈¿à÷Á—ˆ½€ơÔơèÅơꣻóÄ÷ÁÑÓ÷ +Œ₫¸à ¡ÛÚª‚ +¼9÷Áˆº×¾÷Ù¥ºߌÛ,æÇơİ»™‰kß [ïS±Á˜êèäđÆù×÷Ú—»ưڣȹÚßÄÙ߈ɇÍÁÁ̉ׯôÁƯ™‰kß [ïS÷Ï̉ÿÛ÷‡ßÁ±»˜‰j̃ZîSÙÅëăˆŸ;k‡‚ëöé‡9¥‡ÿ¯¶øơ¹Ú›¾™‰kß [ïSâˆ:ĂĂÈơêñÖ߈›îÑÓ™ÓÜÙ̉·‡‘×8ç”ÖuĂƠ«Œí‘ơ°»±»˽ăˆŸÍË)éÛ9¥ÿ¯¶§âñÖ·Ó ¥0Óº…ÖÏ̉ÓÆ›¾÷‡¡Á߈ù¾°¿«‡“Íj߈´Ø¯×»ÅÓÓ™‰kß [ïS¤ˆ\0ÆÄØÍË)éÛ9¥›¡ÂÙ½…ÜÛ×å¼ ­ÄƠX˜‡çÚ™‰kß [ïS߈±»߈¡º±»Û«‚ ½9ÙŒë*«߈ÍB«ÔÁƯ³ÈÀ¹½áƒ¢ä×¾¹Ú…Ơ©ØË̉ÅØ«‡“Íj­’Ûº—¶ơê¹ÁñÓƠºm·ô·‡‘×8çÎ̉ĂÈ·Ô†’©Ø©&ÑÓ¶‡Ö8æ‡ÇÀĂ ̀ÓÛÄÓí—G­Ö©¾ÅÔä̉߈µØ®GøƠ‡ăˆŸ;k»‹ï‡™‰kß [ïSå̉ åôÔX“ƃÚ߈™‰kß [ïSí—G›¶é®Ó溂½Ù܃v­ÅÓº­ÖëöÅÓ¥Ûェ»Û«‚ ½9ÏÜơÔ¡Ô­€¡ÛÏÔív×Ơ†7§jëöÇÖƒ¾‘™‡È̉›¾߈å̉ ½ÿ¼ăˆŸ;ÿ§ƠX±¿ô߈™ôÏÔï£ÇƯÚÛ«‚ ½9Û«‚ ½9ơêù×™‰kß [ïS̃»úáꙇ€Ó½~¹ÏÅÁăÛ¢XÓ߈ĂÙ©ÇỊ̈ø×ƒ×û«Ư¡ÛÙ½ẩ¿ÅéăˆŸ™‰kß [ïS—ăÅÓÏÔ±»›¾ÂÙÏÔÿÚ9¥‡×щăƠưÀ±½ƒv±»¹ÚôÛ™›¾Á‡¹ăˆŸ;ăˆŸđÖ9¥‡Ü«‡“Íj™‰kß [ïSËÇùêÙשǣ»»ĂƯÀßб»Ï̉ñÓñÖ™‰kß [ïSÛ«‚ ½9Ù×÷Ú“ÈÏԲƙ‡Ó̉º$ÿ¯¶߈¡Á8¤‡Ö±»»ØÛÄÓî²2‡“ÏÔ­ÔÁ̃ëÓ«d¹Úă»áƠåĂù×ăˆŸ»½¿‰«‡“ÍjñÆùׇñ5ÁĂÇùë³ÜŸÖ÷Á•Œ¡IƒƯ‰ÅÔ9¥‡›‡›Úƒv‡xơÔ™ÁÅÓăˆŸÁ̉ËÖ߈™‰kß [ïS߈“ȧÆÛÚÑØù×›¾‡Œ̃ˆ½€ù×ï½ÅÄëÔ9¥‡‡ÇçôÄ»ÁƯÛ«‚ ½9ơêơÔÖØëö̀Ó߈öÁ“ƾÙ̉ÅÔÿ¯¶âḈăÁǼ«‡“Íj…Ôßvá}÷Ú£äÏ̉Á¸ÚçỤ́Çç‹Á¡Ơ¯ÛĐÇăˆŸ«·3uUµØ™ôưÀƒv“Æù×ÙÚëöÇÖ°»¡ÛÿÚ»½ßÄÙăˆŸÛÄÓƒvëÓ׿8˜‰j̃ZîS›¶é€ëŸ–Ó½«‡“ÍjăˆŸëöϼµØ·Øƒ½Ă׿8™‰kß [ïS¡ÅÔ»Áí—G˜‰j̃ZîSÙ½¤ˆ\0™‰kß [ïS˜‰j̃ZîS¹ÚÏåÙ½ù׬¼¼ûăˆŸ;÷$ù×ñÓ“ºùןÖÙ½©¼©Ç½ư4…Ơ‹Ç÷Ú™‰kß [ïS±»™‰kß [ïSúÚшù‡áƯ°»ăˆŸĂÙˆ½‘ÚÏÔºÑÄë± ÙÚñÖ¹ÚÑŇ…q…ŒÛºÍÓƒˆơâàù×½߈«‡“ÍjÅԙؽ€Ươíê—¶¡ÁĂĂ ›­±àéMçñ¹ÏỞƒçëÔ±»ŸÖñÁÅÔùêơÔ߈›vÅÔöÏÔ߈µØ‡Û‘Û±¿ă¼›¾Û«‚ ½9«‡“Íj½±½ăˆŸ»ĂÛ«‚ ½9…Ơ©Ø ÈØÚÏÔ©‡¥2ßëM¹ÁƒàÏÔ£Çí–G©ÚëØ—¿Û«‚ ½9¹ÚÛ«‚ ½9½óƯŽÉƠ±)…¼…ôÛ«‚ ½9ÍÓöÛ×ñ¨™Á±»™‰kß [ïSÏÔûØ“ỞÅÛ«‚ ½9Ï̉«âÅÿ›¹9¥‡ƒÛ«‚ ½9ăˆŸ¼ƒêöÁÑÄë ‡÷"Ăù×ù×±ÔÙ½«ÔñÛ™ëéåưÀỞ½ ËûÛăˆŸ;áº߈ôÿ¯¶µ†©ÇëÚƯºă»χ¿‰å̉ ‡Çé‰ñ5ñ·Ù½÷Á“¹ƯN±»Ởµêņº½߈ù×È̉˜̉ÅöÁ£ƯưÀÚÅ•Œ9¥‡ÏÔ¿ô½€½ר¶Å“ÈÁĂđ±»£Ôö›Ó™‡»̣™ëéåñÖ›¾œ‰¾Iß»ûÛ×ùê§à©ÓÎŃÖùו™‡ÁƯ±»‚v‡º½ÎÅ ˜ÓăˆŸ;k·ÅÇÖö‡;Í̉ëö•׃v₫÷Áå©‰ăˆŸ;½ÑØÑÓ©Ó߈ăˆŸ;™‰kß [ïSµØ“Ơ§ă¯×Ö ăˆŸơèž½›¾ÏÅöÁăà™×‰¿I±»Ú́ôµØăˆŸ;á ë…Ö°»ß„ưÀÏÔËƠ‹ÜÛ«‚ ½9ĐæÛ«‚ ½9µØ°»é‡ù×ơ}•׫‡“Íj߈…ŒĐÚY«‡“ÍjÅØ9¥‡9¥‡éº–ÓôöÁ±”›·Ô¦Èvñ‡wß»ûăàívŰ¿Û×ÀĂăˆŸĐØïß™‰kß [ïS™‡±¿߈¥ˆ]1ẳ󗾓ǣ»¨Çö±¿§ÔÇ̉Å8“‰¼½¹ÚñÚ“Û¯²½ׯÙ½ÅÀÙÅëÏÔÅı»—Ö¹.µ‰•{߈¢»-¸ÚÚ×ù×±»ÓƒvĂñ»߈çÚÔăˆŸ;kóÓ³Ø߈ÖÆçÚ°»ăˆŸº±»ÿÂÛ—µ‰¿Iá+Á½ƒˆ¯¾Â‰ÁÙ½ø¿ +¹ÚăˆŸ‘÷ËÉ9«ÈơÔ™‰kß [ïSóÔ÷ˆ›¹çÚÏÅăˆŸ¿̣ÏÄÿÛûÔ±»ßÄÙÙÚŒ₫×¾›¶éëöµ†ÎÔ߈ùׇx™‡ăơ߈Û«‚ ½9ÛÄÓ¯Èôê½ßÁĂÙƠÙ½Áñ»€ºÛöñ“™ØÄÓ ï»ØŒê*ª¾Å«Ô½èíếÛÄÓÏÔ«Ôùײ(ăÇí«‡“ÍjщÏţ؋ÇÙ½Û×ăˆŸ;™ëéåëöÿ¼¶‹ăˆŸ³ÆÛ«‚ ½9ăˆŸ;ùº°»¹Ú×ƠÛ«‚ ½9Ơ±»ăơ8"¤‡"Ö½›¾¡Ơ9¥‡•¾¤ˆ\0·‡‘×8ç¿Å߈Ä–ÛÀ¹ÚÙ½߈Ơ±»ƒ÷ÁăÁ‹É0ö“¹ƯNïÚĂÙǼăơáêÛºƒvéº߈ñ¹Úëé¿âăˆŸ;kơêÙ½‰¿I¿ºơê½€ÁĂ—ÍÇĂºĂĂï»ưÀĐÓ 9¥‡9¥‡Ơ½óÔ™‰kß [ïSÙÚ/¾íṽˆ«‡“ÍjÛºơé³ÁƯ‰àơĂưÀ±»ù׿½ß»ûƒˆơÔ9¥‡ăˆŸ;ƒÖÑÓïÓ ÷äăˆŸ;Ăô›¾™ĂØ×ÏÔ±»©ÓÛ×½Ô·‡‘×8ç™ëéå±Å‘·‡‘×8ç‹Üƒvá¤ăˆŸ;™‰kß [ïS‡9Ù½±»³¥Û“Æ9¥‡ù×µØ߈½ôØ£ ÏÔ«ÔÖØƒˆɶµ†Ï̉“Ơ±»‚vÛ«‚ ½9ÙÚĂ—¿Ơ×܉¿I«ÚÅÓ—¾Û«‚ ½9íơÿÚÛ«‚ ½9ăˆŸư“·Åƒ¾‘ñÙÑÅƠ Ëûá—¶‹ÈÅ·ÅưÀƒÖáê…Âû¼©¼ª»χÙ’Ï̉ܽ«ÔôÛ«‚ ½9«»ëößÄÙÏÅ•ößÄÙ™‰kß [ïS™‡¼•Èû›ÔXư·‡‘×8ç§ôÿ§ÏÄ«‡“Íj߈ó<Ư,ÏÔç·]½÷ÁÍË)éÛ9¥÷ÁăˆŸ;Ù@ĂÙç̉÷ÁơÄ» €Ä ‡ÛÍÓÅØ‚ÇÖí$ù×›¶éóĂÓÆÓ†Œ¡È™í‹Ü“íóǟױ½±»·‡‘×8ç­Ô¿Å¡Áơê¹Ç̉“¹ƯNåÁ¹ÚăˆŸ;›¹ËÉ9ƒ×øêÿăñÁ8¤‡Ö™‰kß [ïS9¥‡ï½¡È™‰kß [ïSóÂÛ¹Åô›¾ÿÚ§ØûÓÛ«‚ ½9Û«‚ ½9ÏÄív£Øă—̉ÅÿÚ±».¥ˆ]1G½¹§Ôö™‰kß [ïSߌ…Œë£éºăˆŸ·ØÑĂÿ¯¶߈³ ¯¾߈ăˆŸăˆŸ;—ơívÛ́°»ÿ¯¶—¾›́ÁăˆŸ;»ˆ‘§Ô“ÆϹĂƠÓ̉ø×+íÙÑƠù×ÔXñq‡×¾™Ôƒà›¶éƒ×¡ÈÛÀÁĂù×ăˆŸ;ø×ö߈«Ô™ÔµÜ¯¾ëö߈™ÓĂÙăàăơ‡ù׿ÅÑÓ™‰kß [ïSÑæÏ̉©Ø’ÇÛ׃vÇÖÛ×ñÚÄØ‡Ưå¡\ăˆŸ;ëö×̉×å̉ ¶Ô¿ôĂ¼·‡‘×8ç¶ׯûƠƠÓÔÅàß»ûûƠ˹Ͼ¥Où×ëö¿‰á=óÇÊÇ:߈ù×ưÀ±»̃ÄØ·¸¡»¼¹Û«‚ ½9™‰kß [ïSá¾ơÔÁ½ÅÔĂ¼ƒùêÿÂëöß–¹ÚÔX¦ùׯ ½Ï̉©ØÿÚ±»‡Úù×ÇÓÍÄùêÂ#—³ƒLƒØ¿»•½ù¾©Ç¾ÿ§¶º«»ŸÈ±»Ù½ƒÚ÷ÙƠ×ó¹Ú›¾åÁçô™ØÍÄ™‡‘̀ϺæºÍÄëöÏÅçº̀Ă›Ú%«»‡Ç‡x¡ÈƒåƠÛÀ™‰kß [ïSÛ«‚ ½9çØƒv¥Ö™‡Á̉íÆ­ÄĂÙƒˆ‹Ü¥ÛǺÁëöå̉ ä̉Ù½“ÈרÏÔ¹Úü̉à ùêïÁñÖö‡ïƠÿ¯¶™×«‡“Íj½±»ר∩‡¥2ßëM˜‡‰¿IưÀơêÔ¾F‚vƒvßÖĂ ßˆ“ƠÏÔ¿Åó^ƒ³Ó™‡†Úƒvív€Ơ ³ØåŒ¿N˜ô¤ˆ\0™‡³¡ÇßÄÙ±»µßă₫Û«‚ ½9›¾Ÿ\ÖÔ†6¦jÏÔ«‡“ÍjăàÙ½§Ô߈ÙÅë8¤‡߈ï½½ö§Ô„ØÉĂÈ̉ñÓƒvÀĂ·ÔăÑ«‡“Íjù׿àáØÿ¯¶Ÿ0ƒ ؇Î9„…Ö«ÔÏ̉éá¹—¸Ú«»°»›¶éóÇÑÓÙŒë*«»ˆ§±»¾å×£»§ÔÛ«‚ ½9ñÓ9¥‡ÑÓÏô߈ùÇÙ×™‰kß [ïS÷ÁƒÚ߈³×ÙƠÏÅ™‰kß [ïSÇÓƒ×½Ă½Û×ơêÅù×ăˆŸ;ÏáØψƒv‹Ó¿º—ˆèôÏŋȣÔƠáƠ“ÈØŒê*ªËÖ±»’ƠçÚÚºÿ£؅ôăÁ»ØÏÔ¡ÁØÓÓÁ9¥‡¡Á¼ÿÚ±Ưÿ¯¶‹Ü™‰kß [ïS¯¾̃ˆ‡ªd«·3uU¥ÆƠÅßơăˆŸƯÚÛºÁ̉ƒÖăàĂƠ¹/‹ÜµØù×±»¡Ô9¥‡ûÓëö¾çå̉ ¼íL²Ơ‚ôƒÖ߈­¾™‘ߌÛ,µØùׇº¡Ơ¾ƯÓ “Æ¡GÍļÔù×¹Ú™ÁÏÅ£ÔñÓ£ÔµØ₫¶±»àê±»ƒvù×ÏÔôûƠÓ¿́º½µØƠ¹Úôê±»‰Û‘ăˆŸÑÄë©ÓÙ½©ÇÛ«‚ ½9ĂÈÇ“ºôÄÀ¹ƒ½ɇÅÔửưÀå̉ Û«‚ ½9´‰ ưŒ8¤‡̃ˆÖ¾ƯçÛ«‚ ½9±»߈ܱ»˜‰j̃ZîS“ÈË̉ÚÚƠ¥í›¾ÑÓÁ̉øê(ù×†ăˆŸáê߈ĂÙ“ÆɹçÚ«‡“ÍjÑÓÛ«‚ ½9Û«‚ ½9Ïԃ׃ˆ‹àÙ½’¹ÜN(ĂÙëö’¹ÜN¡Ơ±»µØívÍË)éÛ9¥÷ˆÙÚ™‰kß [ïS«‡“Íj“»ÅáÖÆÇÅÇÖ½߈Áe“Ơö¯Èèê»yÓ¾£Øá»ÙÚûӵر»Øö…ƠßÄÙ•î­Ä»ø×¶Ù½§Ô±»½ĂĂÙ¶èËӸȩӕŒÛÄÓø½ÏÔÚ×̀ ³¼ÈÙÚ߈ééÿ¯¶‡Œù×ăˆŸ;±»›Ûùת‡’̀j™‡˜ÁÂÙçÚË¿³ÈÏÔ›¾©Óźùת‡’̀jÙ½ÇØŸ‘ÙÚ†ÇÛÄÓ¾º™‡éº½ơÔÁ½çÚÙ½¹Ú‚vÅíÆ±»Ù¿ÅĂĂ ›­±àéM‚ƒv$߈Ù×öÚ×çU·Ó ¥0߈ƠºmÛ׸ÚÙ½ƠơÔóÂ}¹ÚƠ’ËÇרÏ̉«‡“ÍjÇÖăˆŸ°»߈•½ÏÅÏÔ¾Ú¾߈çÚé·å̉ ±aÁ̉¿‰­½¼©Ó§ÔÙÜ›¾ƠX÷‡ÏÔ‡Ú­½¼¹ÚÏÔĂº¡Û±»߈çºívÍǵؾ½„öƒˆ¾ÈÛÄÓëöÅ“Ÿ}Û×ÏÄ÷ˆ¡ÈÏÅñçÚ˜Áă¼ïº¹ÚàÛ«‚ ½9˜ ê è ä ±»ï½±»½€¡»«ÔÅÔ°»7«•­Ø÷Á߈³¥ˆ]1ù×çÿáê‘Ö­Ö§Ø%‰Äÿ$«‡“ÍjÿÚÏÅÙ½ï½ź¿Ø›¾ưĂ…Û™‡±»™äăˆŸ«‡“Íj÷‡¥ˆ]1¹Ú›Ú߈¥Æ™ÓÏÅÍÄÛ«‚ ½9ÙÚÁ̉Ă¼á ߈ͼÍÓ±»“NăˆŸçôÂơԧӣǡÔÿ¯¶ĂÏ̉ßÁºëöôĽ€ëÚÏÔ˜ÁÇÓ«‡“Íjï½9¥‡×Íù׺—Ó›vƯÚÎÔ®Ó‹ë÷ÁǼ±¿רéØ˱×̉ï½Ù½ËÉ9߈í½ÿÚ©Çù×ï½ßσvÇØµØơûØ߈“Èöÿ×ù××hĂº›·ÔÚ×ÏÔù×™‰kß [ïSÙÚ‡x°Á ÿÚùêöùט‡Ñ̃¡Ô¿(ơèÅíºƒw…¾ăˆŸîđµØÏĶô¹Úχ°»µÈ½ÑÓßÄÙº‚àëöçÅ–£Ø·‡‘×8癉kß [ïSÛ«‚ ½9ñÖăˆŸ;ƠX¶™‰kß [ïS¡¢…»±»ß»û©½Ï̉߈³ÇÖƒvå̉ ơèÅÙÅ뵆íר£ä«Ô½™‰kß [ïS ÁǾÙ½ù×ù×½›¾«‡“Íj߈ ÛÏŭĕܺä̉Ơ¾G9¥‡×´ÀçÇ«·3uU™‰kß [ïSÛ«‚ ½9³·‡‘×8çëö߈ÙÚƒÖ™‰kß [ïSÿÚ™‡±Œ£Ç›ªÚÏÅ·Ô½«Ôù×ßÖÍÄÙÚÔµØÿ¯¶ш©Ø¤Æ«·3uU½¡ÛưÀĐÓ“«Óơ‹Ç«‡“ÍjÏ +ªÚ…à¼ÔíØ§Ôщ—Ó½›Û«‚ ½9µØ›ÚÍB¡È‚¾“¹ƯNëöĐøéºĐÓö¶iÁƯÙÚÓºŒ₫ù×ëöÍÓ“ÈßÄÙăˆŸß»û±»˜¿¹ÚưÚ¶„q™Ô‹Ç“Ơ©-÷Á«‡“Íj¢X₫Û‘ÆÛ«‚ ½9ÂĂרùוÙ-Ä–¼û(›¾߈«‡“Íj¶è¡Û­Ä©&ÍË)éÛ9¥å¿ùÜ£Ôó¯øÛ«‚ ½9ë󃾑²Âă¼ÿ¯¶—¶ÍÓ‡ÛÙ½‡xÁ‡é/×:§ÖăˆŸ;ƒÖ•Œ×Ơ߈5›¹ÑÓ¿ß·ÅéÚÏÅ›™‡‚×ÅŒ¶Ϻ•½ù×¾¶Á¹½Ï̉ÁËÅÔÀñƯ¿ºÿÛ‡ù×˹߈é×âÁ ÏÔåºÍùơ™‡™‡½¾‡°»×ô»ÅưÀÛÔëö·̃±̉¨v«Ô­vëö·Ôëö¡Ẹ̀Âăꙉkß [ïSÙ½ƒÚ½ñÇåÖ½œĂ—¶ÆéÓ“Ơψï½Á‡é/×:÷‡ơêù×ñÓăˆŸ;¼¦ºÏÔùת»ÁÚ³bº—ƒÍB©‡¥2ßëM‘€¹Ú“½Ù׌ÛË̉߈·Æ9¥‡×ø¿ÏÅĐĂ½¹‡œ߈¿Øºî»ñÓÙÜ„öºó׃ԹڧÔó£û؇۫‚ ½9‡ÙÚÀ‡€è/Ö:µaÄÀÆ̉¥±»«‡“ÍjñÚ¾ÏÔÏÅÙÚ™‰kß [ïSÙ½¹‚áºáêÑÄëăˆŸ;¿»©Ø˜êèäÁƯÔö‡Û›¾ÖÛ«‚ ½9Ăº›¶é߈ë#Â9¥‡ëö߈ÙÜ÷Áù×}ÁÓÿ¯¶é‡á 9¥‡Ï̉ŸÛºá¬ÅØíÆ™‰kß [ïSƯÓ ±»óÂơÔ‰Ô™‰kß [ïSíväÁ±½ăˆŸùÙŒë*«Ü߈±»É(¿́ÍU³ƠÙ½Û«‚ ½9­Ø¯¾Û«‚ ½9³Â™Ô™‡ĐØ á©¼±»ÚׇxƯÚƒ½ÏÅÛºëöôê©ÓŽÍB—¼¿»§ÓƯº«»×¿8“º·‡‘×8ç¹ÚÑÓ¯¼…Ø™‰kß [ïSơº¼—½‡a©Øí̉¡Îź„®Ơ߈·_÷œ»æĂáƠÓØ“Ơ©Óƒùºµ†÷Á«‡“Íj̀Óï²2™Ó—˜¯ƒßͯ¥'=U#QK¯Â³ÂÏÅ9¥‡ׯëĐ£È§Â«‡“ÍjÏÔ«‡“ÍjÏÅ/æÚÿ¯¶ù×¹ÚĂëö™‰kß [ïS¡Ưרß„åÁ«‡“ÍjǺÑÅ…ô»½ÍÓÿÂÿÚ¹̃ĂÙ™ÁÿÚÛ«‚ ½9Í6÷ÁØƠÚ+CшÁă±½߈Ơ ́»ăˆŸ;öÿڢ؉ÔĂÙ¹Ú•ˆù× ËûĂĂ ›­±àéMˆÛ«‚ ½9ưÀÏÅÛ«‚ ½9™‰kß [ïSǼáÁ«äÂÙ›¾©Ç₫®¶•ù×đÓ¬Ö £Ư³½Á̉µÈơÅÁ½²ØǺÑÓ•¾¡Û»Å¹Úív¡»³ŒÛ«‚ ½9›¾ăˆŸ;„½ơÔéêÖĂ»ëöÅØ“ÆÆ»ª‡’̀jÅØ•Èû›™‡ëöÛ¹™‰kß [ïSÿÚƯÓ ơèÅ̃ˆƯ‰›¾½ơêåâ߈ơÔôÄù׃vñ9¥‡ÄÓµØÂ»Á̃ÄØ½©‡¥2ßëMÑÓ™ÓÅ©ÓϹ%©ÓưÚơéå̉ ÅôĂÙÙ̀«·3uU™‰kß [ïSă»¾°»·Ó ¥0ăàù×Á±»ÛêÛ«‚ ½9¹à‘Æ›¾«‡“Íj‹Û÷ÙĂ¼ùêĂ¼¼€«‡“Íjؽ¡ƠôêÍË)éÛ9¥Çֹ؇é·ÏûƠ¡»éº¡Ô½źívăà߈Îơă0ÏÔÙÅëÂó"ÛÄÓÛ«‚ ½9“âăˆŸ Û߈ÿ¯¶«Ô₫‡9ÛÄÓ±»Û«‚ ½9ûعڼÿ¯¶ăˆŸ;ëÓ¾Œ₫½öÁÑÓù×ăÇí‰̀å̉ ÏÄÀ½å¥ÏÅiÔÓ¾ùט¶€ÿ¯¶Å„ù×ÏÔăà©Ó‘«›à¯G‹øưÀ¼ØɹÏÄ“ÛÙŒë*«ëÓ∟}߈©Üå̉ ™‰kß [ïSĂÈ9¥‡ÚÆÙ×§Ô—ŒÛ«‚ ½9ºyƒø×¡ÈÏÔǺ—ÛïÁ±»¼ÍéêºÁ(Ơ™Á«‡“ÍjÏÅ‘•ÁƯ€º»”ƒ­Ä½½½ÈÏ̉Ư$°»Ëdzeöƒ¾‘½€ÿ¾¹Úç̉ùæÙ½ñÆƠƒÊÏÔ߈ñÚ™‰kß [ïS±½ĂĂ«‡“Íj±»¬ÄºöÁø×†ºÇĂ™‡«·3uU“º±»Ö¾ưÀưÀÛ«‚ ½9Úª‚ +¼9ëö»ˆ¬¶½«‡“Íjçô±¿“Èđ»‹Å×Üﻺyúù×¾ßñÓ߈ÔÓØщƠ9¥‡×ÿ½ÔÏÅă»˜‡ù׵ؽԇڋÇĂº¶—¶ù̃ñÓ›¾¡ÔçÚñÓ“ºÎÄÏÔ™Á™‡ëöĂº£äơê¥â³Ïź½±»ơꙉkß [ïS¹߈Ù×Ă1½Ă«‡“Íj•Ç©ÓÛ«‚ ½9ÏÅ›ÁÇ%ø×ăˆŸ;å̉ ±»ưÀ§¨¼߈¡ÛÛ«‚ ½9óԳƒˆÛ«‚ ½9ăˆŸ;½¯ƒ« +>«ÔôĂó¶ø×±»Å–Û«‚ ½9ƒvÓѵ×ưÀüÀ ¹ÚêöƒÂÙ™ëéåÙÚ÷Á„Ö°½ÆÅñ¹™ ›¶éÛ×Ơ³ØƠ±»ëö“ÇÛ«‚ ½9ăˆŸ;ÏÔå̉ ÷ˆÏÔ÷å5Ó߈«d‹Ü§ôÑØ÷ˆºyåơÑÓ×¾º™‡½™‰kß [ïSöÏÔɾ¿ºÓÁäơ“¹ƯNƯơơÔºëöÿ§‡ÇµÆ§Ơ›Ú›¶éÍÄăˆŸ;±»«Ô™‡8¤‡ÄÀ¿‰ÇÖö°»ŒÛ¯¼9¥‡ƒvß»û̀Ê)èÛ8¤ëöå»Ù½½߈̀X·¼Í7ù×ßÚ̃ơJÛ«‚ ½9̣ÂæçÚ߈©£ùæË¿Ư”¾¢»ó|ơêăרÚª‚ +¼9ß»ûÅ߈ÏÔ‡ŒÛº±»ŸÈÿÚ†×ÏÔăઇ’̀j¿‰›¡ùæ̃ˆ‘È˹½›¾™Óß%߈ÄĂ«‡“Íjï»§Ó´a¡ƯǼ8¤‡öñÓ‡ÑÓëö‰™Óá ÑÓơÔôêĂÙ²ÄÏÔ±ëØ™‰kß [ïSĂ×™ÔûĂĂÙYóÂÎű»ÿ¯¶“¹ƯNÑĂÅâˆ;û¼£‡öÁñÚĂÙáÓ‘ëăˆŸ;÷ÔÓ̉™Ô8¤‡Ö™ëéåËƠ€º‹n®ÆÅ–«‡“Íj®Ôí—GÏÅ™‰kß [ïS‡ºùרØÛ«‚ ½9ÍÓÁƯ· ÂÿÚǃփvï»’ÛÙ½˜‰j̃ZîS¡Á‡Ú¥ˆ]1Á §Ô߈á ߈ù×›¶é™‰kß [ïS»‰Ẳ¿‰ËÙô¹gŸ}ưÀ“¹ƯNÁƯÏÅ‚ÖăàÛÄÓ×Óív±»©ÓƠXœÚŸ}ëÓ«·3uU©‡¥2ßëMßÄÙ½߈߈×"‹Ç‰ËµØ±¿¹’óÇÇÖ‡Ú·Ô±¿gÏ¿¯È©Ø¥Ø߈¾ƒÏ̉á=ƒƠíÚ±»“ÆăˆŸ;ƒàơÄ™‰kß [ïS‹ÇçÚÉÛăˆŸÓÅ9¥‡8¤‡µÀñÓ¹Ú“Ơù×±»߈¸®ÛÄÓ‡Œ×̉¼ĂƒàÁ¹“Æ…ŒͼÛÔ®Ợ ™ÓµÏÛ«‚ ½9ù×á꛶龬¼¼—»ăˆŸ;ù×öÂÿ×ùơ™‡Æ9¥‡Ơơ½ù×ÛÄÓ¿ơèÅÙ׋Üö‡“«Ô°» ¯¾ÙÚÙ½ ËûƠ¾G÷Á°»Áó«·3uUÙú£äăˆŸ;ëöÛº­Øß»û¥È£äív­Ú™‰kß [ïSÏÔăˆŸèºÿ¯¶ÙÚ߈«‡“Íjôê‘®Ởù×ưÀÅÔ›¾ëöïÚÏÔăâå̉ «‡“Íjƒv±»ÏÅ×Ơ‹Üº§Ôß»ûŸ\‡9ÏÔÏԓȶ„ô£ÇưÀơÄđØ™ëéåÑÓÁ¹àöª‡’̀j¿‰µØÏÅ©«‡“Íj9¥‡…Øͽƒv¾™Ó…Ơ­Öù×™‰kß [ïSÙ×ôÄñÁ°»ÛןèăˆŸ™‡ƒvé‡ù×9¥‡Ù½Û«‚ ½9¿º±»¡Á̀¼Ôô™‰kß [ïS¿‰­Øơê½ù×áêƯÓ ÙÚÛ«‚ ½9² ºÑŸëöĂó“ưÀ÷‡›¾ÁÏÅ›ÛË̉‚½ëöÿÚăˆŸ;k£äÔXú›ÚưÀÍöå̉ ö¡ÛßÄÙÚÛ×Ë´ø¿ÔX«Ñ̃ˆÛÆ}­Ö‚vÅnăˆŸ«‡“ÍjƒvÑĂơêÛ«‚ ½9%¥ÄÓÆôꩇ¥2ßëMÏåù×ù×ù×ùê¡Èö™‰kß [ïS…½½ Ơí‘‘ÏÔå»Ë(£ÇÓ¾˜êèäöº¿ôé‰ñ5ñ·ŒÛÄÛ«‚ ½9´†«‡“ÍjăˆŸ;ƒvƒ×Ơ¡ÁßÁ‚vºƒ®Û«‚ ½9ăˆŸÛלÜéºÀĂ“ÛĂÙG½¹™‰kß [ïS̀Ê)èÛ8¤Û«‚ ½9™‰kß [ïS©¼¿‰ù¿Úª‚ +¼9¹Ú™‰kß [ïS½…€­:ÁĂÛ«‚ ½9ÏÄâˆ:kĂÖïÅÙ½ƒv±»å‡±»×¾«Ô¢ÇÂÙuơêÛêù×½ÈÁÙ™‰kß [ïSù×Ă¿×™‰kß [ïS¿‰·Á—Œ±»¡ÁåÁ÷Ú‘ÆÏÔƠXÚÛ«‚ ½9ÏÅ£»Ú7ª7‚77 +7¼97ÏÅÁ̉¯ƒ« +>º߈«‡“Íj­½¼›¾ÏÔïô߈½¡È£Çï»±»­‹ÏÔùדöơÔÏóÔ™‰kß [ïS™‰kß [ïSÏ«‡“Íj±åÛ«‚ ½9±»ăˆŸ±½–¶‰§™‰kß [ïS…øƺÛ«‚ ½9ଥ‰ÍL…±¿ăˆŸ;¿º߈‰¿IÓŹÚù×߈ƒĂ°»ƠÚª‚ +¼9߈ưÀ¹Ú˹«‡“Íj„ÅÓщÛ«‚ ½99¥‡™ëéå߈¥‰ÍL…”ÇË¿á £äăˆŸơÔóDZ¿ăˆŸ;±»ơÔêö¶ Ëûϱ¿ÛÀ«·3uUÿ+·Ôù׃¾‘Á×₫ǃà×\«Ô÷‡ñÓÏÅù×Û«‚ ½9ÁƯ­¿¸àÙ×»ˆưÀáê¥ÓÿÚÏÅÄÓáƠ‚ÔĂÈÀ£Ç‹ÇăˆŸ;ˆ8¤‡ÖÛ«‚ ½9ÿ×ÏÄ—ø¿Ù‡xăˆŸ;›¶éñÓ»‡ÏÔÅØÙÚưÀ¿‰ñÄ™‰kß [ïS·Ô߈µØÛ«‚ ½9ñÄ–Œ߈¶‡Ö8æ× ™‹å‡û(ĐÓ™‡öơߌÛ,%™‡©ØëöµØñÓ–¶ëöăˆŸ÷ÔØƠµĂçƒvâḈ™‰kß [ïSù(ù×™‰kß [ïSóÏÔ©‡¥2ßëMûƠëöỞ„ ߈ˆÛ9¥‡₫ÇÛ«‚ ½9»ØÀ¹Û×àˆÀ0p‡ºé꛾ÏÔ¹Ú½©‡¥2ßëM©ÍưÀ½ØÑÄëĂÙŒÓ9¥‡ăˆŸ;¿»ăˆŸơêˆÛ½߈ăˆŸ;ëöưÀ‰¾9¥‡ø 3«dĂè×Ơ†7§jßÏå¿«ÑôèêP«‡“ÍjưˆƒvĂ ûÓ§59¥‡á=ßƯ±»ÿÚ߈«Ô½ù×¥ Ë̉ÛÄÓăÁµØÓŵØÅØ‚ˆ¼£ÈûƠצÛ«‚ ½9åĂÏÅ̃ˆûóÔëö›¡«Ú߈ăˆŸ™ÔÅÔ÷ˆ³ ¿Ô­Äÿ¼éêçÚ²ƠÑØ߈«&¡È±»‚Ö¯rĂà«»ăˆŸ;½€çÛº̣Ç©¼Đø™Û•詇¥2ßëMÏÅ߈ñÊÏÔ“ƠÿÛÑÄëÿ¯¶ÛÄÓÿÚ©À©ïĂÓ¾­½¼ñÚÍÓ¬ÛưÀÁ|Û«‚ ½9¡Ôëöï»ÙÅëƠûÓºyùÓ›Ľÿ¯¶çô‡ï»Áׯ¼£”§Ó™‰kß [ïS‹Ç°»÷Á½Ù½ÏÔ¿½›¾éÙ—ŒÓ°»ù×ÅĽ…€­:«´£ÇơêÛ«‚ ½9»‡8¤‡í—GÓÆÿ¼©‡¥2ßëM™‰kß [ïSơêù×…»×¿8÷¼‘¿‰—¶«‡“Íj•‹H¼›¾ù×”È4ú44Û‹Ç™‡ƒˆñÁùט‰ j ̃    Z îS ĂÍÓÙ×ûÓƒv‹ÇÓØÙ½«‡“Íjó̃Û«‚ ½9öщ­ÄƒØÓºƠÅÏÅ‹Ó÷Á™‰kß [ïS‡º¹ÚăơµØ—¶±¿ăÁÿ¯¶©‡¥2ßëM½ô×ƠưÀ±½ëöÆé‰ñ5ñ·ĂÙʳŸ}”»ăˆŸׯÛ«‚ ½9†ÇăˆŸÿ§·ÔÚê…Ơôê†ÚרÓëö½·‡‘×8çß„¿́öÁµÅÚª‚ +¼9“Ăè»ĂăˆŸ;Ù×߈³Ơ߈ÔXưÀ¹Ú߈ûÓ«‡“Íjå̉ ½ºá œÜª‡’̀j¡Ûó×ưÀÍÓǽ»½ÁƯï»…×·ÔqÆó¸½«‡“ÍjưÀ«Ôƒv°¿ +µê«‡“Íj¾‰‹¾₫®¶߈™̃ˆ«‡“Íj»Ø¿‰ôÔÑ»™‰kß [ïS‚v½üéê½€ívù×›¾½Æ™‰kß [ïS—¾ĂÆ9¥‡óǶ‡Ö8æÅØù„©Ó̉±»º±ÈÓØù×ÿ¯¶¾ÑÄ뛾±»ù×ùê±»ÅØ³ƠÅÓ߈ÏŇº߈™‰kß [ïSßÖ«»¤Æ¹Ú‹Á™‰kß [ïS™ÓÉÓØ¿Åç°êØÿ¯¶öÁơêÁƯᬇ¿½ºyª»ƯÓ ¡˜‰j̃ZîSöº߈³ 麹Ú̀·,÷‡ÿ¯¶ËǣDZ»ăˆŸåÁÙ½™‰kß [ïSÛ«‚ ½9¾·̣÷ÁüÀƯ,ĂÙ忹Ú߈ù×ă‘·“½߈߈©Çûد¾¥ÇÅÛ«‚ ½9©&¥ˆ]1™ÓɨÉ Á½ÁƯùê÷Á§Ø½«·3uU¡»ÅÓÿ¯¶ù×ÓÆÿ¯¶‹Ü™‰kß [ïS‡³ %‚v³߈Ûºå̉ ÙÚù×ăà¤Ø£Ó±»›¡ùë·‡‘×8缿دµØÂĂ…øêăˆŸ;£ä‰¿I߈Û«‚ ½9óǽ€›¾Ăôÿ¯¶ăˆŸ;ó×ëö•×9¥‡½€¡È«»Î̉™‡Ù½‡Ç¿¿‰ùשÇ÷‡Ï؇‡ơêĂô›¾©‡¥2ßëMñÚÛÄÓ½€ëöá¯È’ƣǹƠ©ÓËÖ…ËÉ9ƒ?Ù½ăˆŸ%ÏÔ™Óö¿ôƒ½߈µa›Ú—¶Ă›ÄÛ«‚ ½99¥‡×ƯÂÑÅ߈¸à¡ÈưÁ©ÇÏÔ­vѶùêä¸ĂºÇû̉‹v°»Ë̉‹Çáê¹#çÚ³×Ù×êö8¤‡½€ơÔ߈—¿™‰kß [ïS…äÍæôÏÔƒ¾‘ó#ÙW›¶é¿ßĂ™‰kß [ïSï½ơèÅßÚ›¾µØĂÓÚ¯àÛ×Ă£ «»çÚ³Èå̉ èơăˆŸ;ƒv™‰kß [ïSïÊÿ¯¶ÜÚ½«‡“Íj½æØ£Øăơ•ÜÙ½Úª‚ +¼9Ú½¿Ù½‡º¥‹ÿ§™‰kß [ïS¶‹ÛïµØ«ÈºĂÙ™‰kß [ïS¿ôŒ¾ªÔ߈‡ºỞ°»—Ó÷Á¨¼ô½€Ù½¶‡Ö8æăŸÿÚÏųƇºăˆŸ;œø‡Ç‡×³ôôê¾ß§·ÿƯ·̃ëöă‹ëÔÏ̉¿ºYÏÅ‘ùÑÄëÓÅ£Ơ­Ä«‡“ÍjÓ´•Ç—ÓÛÀ8¤‡Û«‚ ½99¥‡ƒØ¢XïÅ¥ˆ]1å×›¾¹Ú9¥‡º­Ö¥ÇÅÁå̉ 9¥‡ÁƯăº­ØÙÚªÚçđíơÆÛ«‚ ½9±Á±»߈±»ơĂßÁ°»á R±¿ÁÏ̉íÚ™‡¹Ú›¾‰¿Iơlêö«Ô†Œ—¶ív«d©¼°»9¥‡•Œù×ÅŽÔăˆŸ;kY«ÓƒvÓØív÷ÚÚÁƯÿ׫»ŒÛÁĂÙ½¸Åơꃈ¹ÚÓ̉ơÔËÇơĂÛǺ̃ˆ˜Á­Â£»Û±½ƒv©&›¾Ù×±»ÏÔª‡’̀j‹Ç¯Ơ¡Û½Ă©‡¥2ßëM¯ÜâÁíØơ꼓ÈÁƯÙ½¡½ÜûƠ«‡“Íj±»¿Øơꘉj̃ZîS—äô)ù××$Úª‚ +¼9ù×Üùể´ ¡ÔºưÀĂƠź‹ëï»çÚÙ½ÑĂù×ÏÔ‚» ¬ÖƒvÛÄÓíÖÂȱ»߈³ÆèơöåÁ›ÚÛ×®¼ßåƒ₫ù×ăˆŸ;‡îơƠ“ºá=§ƠÑÄëôưÀ’ ÏÔÉS·ô¥‹±»ăơ߈ô“çưÁ›;éÓß»ûđÓù×ñÖưÀëöơÔăˆŸÍƠ·Ôœ‡ăˆŸ;ÉS«‡“ÍjÙ×߈щ‡º¡Ôƒv∸Á×́ơÂÏԜ«‡“Íj匿Nôê¡ÇôÔ¾ÅǽăàƒàÙÅëólj¹Úä̉Û«‚ ½9ÍӰܺׯ߈±¿®È߈ÏÅ©‚ƒ¾߈ù×ó³ÈƯÓ ³È¶‡Œ©‡¥2ßëM…ÂËÇ«äă½±»°»Ÿ}Û«‚ ½9—¶Ư‰½Ă»ÁöÜ¡ÈçÔ¡ÛÀƒvß»ûӾŻ۫‚ ½9˹­ØĐÄê½Ù×™ơ‹Çâˆ:½Å»ơÅÓ½ÔăˆŸ;ơÔÏÔº½‹Ç±»߈…¾·Ü±»ÏÔ¶¶•ñíȽƒˆ±½ï½íÓñÚ•ÿ±»ƠÂÙÙÚ©‡¥2ßëMϾ¥O‹î‡xÁ̉ëö½ôׯÓÔÏÔ½ßÚ«Ô•.‰¿IăˆŸ;¿™‰kß [ïSÀ»Ă›ÍË)éÛ9¥­Ä»½ÁÎľÑÓ߈™‰kß [ïSĂ¼߈åĂ¾Ơù×›Ú«déê±”߈«à±»ĂÙÇÖ§Ô‰̉î²2—¶½Ô±»‡ƠÛ«‚ ½9̉ºÛ«‚ ½9ÏÄß„߈ơèÅÏÅÏÔêÓùꙉkß [ïS³Â…ÂÁÆ̉߈ ÇEăˆŸÓ›¹ÍË)éÛ9¥ÍĂé‰ñ5ñ·íÚ×ÓµØóÇ™‰kß [ïS±»¶ÅÛÀ­Ä߈ÇÖ›¾×÷ÁÓÆ–¶•Ûù×­i±»‡Ç£Øăàë½§ÔöÁỏ´O‹ÅƠ¨‡¤2€̃êL½ô“Æ«‡“Íj¥́·‡‘×8ç÷¼ÁƯƒvÇÅØóǺñµØ«Ô÷#«»ëÔ¯ÈăĂ3»Ø™Á´.¤ÙÙ×üÀ¥‰ÍL…龃ÖñÚ߈›¹Ö̉ùט‰j̃ZîSÛ«‚ ½9±»Û«‚ ½9ÏƠăà£XÏÔơêĂƠ§È߈ñÁÍÄ›¾ÑÓ“Ơ±»ƒwÊÇăˆŸ;™=Û«‚ ½9ëÛ«‚ ½9º¡ÔÙYƒv¯ÈÎʼnÛÁăñÛ«‚ ½9ù××Ü Á«Ô±»ø×•Œ½ŒỡÙŒë*«ƒ¾‘«‡“ÍjÂÙÅÓ§­¾ŽÑÓ˜àÄÂĂÏÔ߈ËÉ9¯ÁÛ«‚ ½9÷ؿ߳8¤‡×ÁçÚ±¿½£ÇöÁרóÔăˆŸ;¾ÑÓ©Ó™‡™‰kß [ïSùæ÷¼µØ߈½ÂÍÄ«‡“ÍjăˆŸ;Û«‚ ½9×Ó§¹ưÀöSñÓ­Ôå̉ º«ÔíêÅØÔ“ +¡ԓ¹ƯN›¾9¥‡½™‰kß [ïSÁ½ÓØ‹Ç÷Úëö›¾IÙ½ñÖ½đÍÓ«‡“Íjø|Óº«‡“ÍjªÚ¡ÔÇ»À½.ÏÔƠXÄ™¶á 9¥‡óÇŸ›¡³Øͼ³ºó¹Úï»§ÓEÎ̉ăàÏÔÓºèơŸ}߈¡ÁÄØñ̃ßÄÙ±¿î½߈·‡‘×8ç ËûÙÚ¥ÛÏÅׯ‹Ó½ÿÚÏÔ€ăˆŸ;¥ˆ]1߈ׯÂÙù×éÓ̉›¾ƒv«Ú¶ơêóÔº‹Ç›¾½ó“ơÛĂÙí‡ù×ÎÔ߈çÚưÀÓsµ‰Ù̉§ÔƯ‰÷å5ÓưÀ¿‰ƠëöăˆŸ¡ÔÛ«‚ ½9₫®¶—»©Ø©¼¥ÅƯÓ —¾ ‰¢«Ó¿́éù¾ÇÓÏ̉߈£ÈĂÆô¹Ú­Ö§Ó߈ăˆŸ;kùסÜưÀ±»·‡‘×8çưÀƠXƠ¾GϾ¥OϺ́ÚÙ½±»…Œù×›¡ä̉8¤‡×ÜƠúÖÛ×ÍÓôå×™ÔêơDQ‹Ûív¯ÈÀ‡€è/Ö:·Ôº$ăˆŸ;¡%ºÅ¶Å‹Ç™‡ëöËÁ¼ƒÖ‡ñ5Ù×ͼ¸ÚÏÔÿ«‡“Íj©ÓçÇÛ«‚ ½9ôëö÷Ô›¡Ưµø¿™ëéå©ß³z߈ÑÓ¾ÎÚÓ™‰kß [ïSáꃌ™‰kß [ïS›¶éÆĂ‚văˆŸù¿¡È½ÿ¯¶áÙÜ9¥‡×³³ºóăàä̉‹ÇÖ¾’Æ™‰kß [ïS™Ư߈ÈÏԽܷ̃¹Ú™‰kß [ïS°êضưÀ±»ùי׋ǣ¨‹»Åǽ¹Úív߈©ØắÅØƠ¼ÖÔ†6¦j®¼™‰kß [ïSưÀùêÛ«‚ ½9éÓöÁ +߈ÏÔ…ỞÆœˆƒvƠÁ½§ôÏÔëö9¥‡Û«‚ ½9•ŒóǸÚăơ×Ơ†7§j·‡‘×8ç»y—Œ€º̃ˆ‰ÔƠX·ÔŸÈ½€‡ºÛ«‚ ½9çä¾çƒv…»߈ßÁ•ê†Ú·‡‘×8çá¸ÚƠÁĂÅØỞ‹Óâơ†“åơÛדÛÛ«‚ ½9«‡“Íj‘±¿¹Úƒˆ±»߈ÏĆǙ‡öƒ¾‘©‡¥2ßëM›¹ßÄÙ¼·Ô×¾óÄĂ¼ơ|Ûºög«‡“Íj¹ưÀ“ÖËÈ’ơ鿉ƒvÛ«‚ ½9ÅÓøơ›¾ÑØù×ĐĂÛ«‚ ½9ív±»×ƠÛÀ½ù¿«ÔëÓÙÅ롱»9¥‡¦ô«Ô¨Ú£Ç$¹Úù×·̃ËÉ9ªÚ ëö—»ă­ÏÔÛ«‚ ×ÂƯ™ÔƠXç̉Á|¡Û½ăˆŸ;¥–ÁÜÚª‚ +¼9êØ߈ăˆŸߌÛ,½¡Ôß»ûăÁ«‡“ÍjÛ«‚ ½9߈¡Áù×ÖÆŸ}£ÓÅ™ù׃å›ïÅơꃈÑÓ¾¥ßÉÙƒv÷¼½ñÓÇ߈½€¿ºÓºæƠ ¡ôù×™‰kß [ïS—ŒÑÓ÷Á”½ăˆŸ;ƒÚ«‡“ÍjñÓ–Ó¥ºÏ)µØăˆŸ;9¥‡ơêăˆŸ©¼«‡“ÍjÍÛ¹ÚÏÔùêß»ûívÑĂ™‰kß [ïSăˆŸƯÚêö ˜‰j̃ZîSƒ ÈæÚăˆŸ;óÇơêÜÏÔùט‰j̃ZîSôơÔÁƯ­Ä¦ô +•ܥǃ֓Ơ»ÅÑñ»ÑÓÙ½·Ô£äöñÚå̉ ß»ûùëù×¥ˆ]1Ø×Û«‚ ½9óăÖÿÂÚêíÖ—¯Û½€™Ô…ÖïƠ‰¿I Ç³ºóG½¹ùæÜ­Öù™‰kß [ïSóƠ™Éơ$™‡¿‰ëö…‡º¸ÚăˆŸ;·Å½¡ÔæÚ¶¦D£ £ƒˆĂ¿‰ß„̀Ó±»›¾߈‡ÛºÔ½¶ÁÛøêÿÚơê߈ƯơÁÓ̃Ä Ø ™‡ùש‡¥2ßëMÛ«‚ ½99¥‡™ÁơÔ§çÚƠÚáËÅØăÁăˆŸ;ù¾á¬¯È“¹ƯNƠÓÓ™‰kß [ïS×¾ç8¤‡€ÇÿÚÛ ưÀÁƯöÀ¼ƠÚ9¥‡¹ÁÏ̉éê·Ü·ÂåvÙ×¹ÚχÅ“Èß•ưÀñÆÛº™‰kß [ïS­ÖÇÖÏ̉ưˆ÷Úƒv½€á™‡¡ÈƒvǺ߈ÇĂÿÚ“½ă»ơêǦùטêèäĐØ¹Úµ†÷ÁÙדȟĐÙÚ×Ûÿ¯¶¾ù׽ؓÈùê÷Áø×ǺöÁ;ú̉)½™‰kß [ïSÛ™‰kß [ïSø×ÑÓ£»߈¹ăƒv®ô ẳ«äêÓíØÇÖÙÚư%‘Æùרº9¥‡Å»½Ô†Œ + + +£ÇÛ«‚ ½9ÓÅĂô™‰kß [ïS—ó¿çăˆŸöø±»¡Ôϼ¡Ç‹Ó¾ÏÅÁ›¶é«»‹Çó›¾Á‹Ü̉ØưÀ®éÙ׃vé꫇“Íj•Èû›“ƠÇ»¿Œăơ¢ÇƒÖ¼߈›¶é‹ÜưÀư‡±ù1«‡“Íjƒv·̣ÅÔơĽ€¡ÈŒƠ©‡¥2ßëMÛ·‡‘×8ç±»߈é½¹¶‹Çëö«‡“Íj“ƠÅ»¯È¯×“ÈßÚ½™ëéåÛ«‚ ½9·ÛÙÚÆ ˜‰j̃ZîSƒv½‡ºăơù×ñÈù×·‡‘×8çァܻű»½™‰kß [ïSö±»±»ÛׂÏÔưÀ—ˆ™ëéåóÇ›¡Ó뙉kß [ïS¯Ûó°»·‡‘×8çĂÈ™‰kß [ïS¥Èÿ¯¶¡ÔưÚ±»åô³ă»·ÔÛÀƒvÙƠ½êöêö§›ö9¥‡“°«‡“ÍjÑÄëÅÀ„»‹ÜĂٷاô›¾ñÚƠXƒ÷Ǽ¡Ôưç½éÓĂÈ˾¹xƠÏÔ©ÜƯÁµØ«‡“Íj9¥‡×ÑÓ×¾÷ÁăàÛ«‚ ½9ÛÓ̉̀Ä ߈éơç'£Ç߈ٽﻰ¿öăˆŸ;¾ưº•Œ÷ˆ9¥‡µØ÷‡«ÔăˆŸßÄÙ—`¤ˆ\0©ƠgÉÛôöÏ̉–Œÿ¯¶©Ç•º£»ÑÓ™Á•ŒÛ«‚ ½9‘ÛÛ«‚ ½9Ñ£ÇÍË)éÛ9¥©‡¥2ßëMù‡«‡“Íj‹Ü§Ó÷Á»ÅÁ̉÷ÁƠXë£ø×©ÓBÏÅ«øï½Ë߈½€ùëë™HưÀÎÅẲŽëö½ñÓáƠùê½̉ÂÂ₫«‡“Íj¡Ô¿ô“Üơéƒv€ôĉ¿I±”½™‡Ă³¹±»‹ÇÇ÷÷Á¤ÇÅôĂ¼ï½ëö±»ÿÛ¹Ú½‡x­v™‰kß [ïSµØ”Èú¼È—¶‚¾9¥‡‘‹Ûº«Ô±»ƠÅÛ«‚ ½9±»ÑÓ—ˆÛ«‚ ½9ŸÈ¦Ô­ÄÏÄÛǽ°»®G ø ƠÔXăÙÚÏÔưÀ­v™‰kß [ïS³È‡Œß»ûÑÓăˆŸ÷‡ÅôÑÄ뿱»¡È³ÈĂÙÓø±¿ù×ôä¼Ï̉ívû’ü¦†§ô˜‰j̃ZîSăˆŸ“Ơ±¿Û«‚ ½9ÍË)éÛ9¥ù×ù×Û×¹Èă»ƒ¾‘áÛ™Ó³(›¡ưÀ¡È½€£ÈÍõØÏÅ‚v›Y‹Ü¡Ô½±»›ÛĂÙ߈ÏÔÈ5∅́Ơ饨¹Ú¾ñàëö´0̣±»›vÚÄ̉áØÓº™‰kß [ïS«‡“ÍjÏÅï«×ĂéÓËDZ»߈ăˆŸ9¥‡×÷ÚÇØ8c¤‡cÖ +ưÀĂ蛡Ÿ}ó1™‰kß [ïSÙÚ™‰kß [ïS¾ƒv”¯ÿ«‡“Íj½Á£¿רÍƠ­ÖơÔƒv¤ÇéºÑÓ±»ÙÚµÀÙ½¡Ûșԟ}º Ö†‡ü2ăˆŸ;k·‡‘×8çßÚƒv›¶é“Ü­¾ĂÙ«‡“Íjëö«‰„ö‡º÷Á°»ÑÓ½Ôçđø×»Ø§á¬¿¯¾˜‡·Å˜‰j̃ZîSß%߈ÛןÅ9¥‡ùט‡øê™‰kß [ïS·Ø±»ƒv⃈߈¼߈ºù×ׯ½©ÓÏÔïƠ€º…Ûêö«Ôơêí—GóÇÎÔÏÄêö‡ª÷奈]1±»9¥‡½€¡ÔϺ¤Áƒ¾‘÷Á÷ÙÇØÓ̉™‰kß [ïSù®ù×™‰kß [ïSáêÁ‡é/×:“Æ©‡¥2ßëM›Ư±»«‡“ÍjÆ̉ ߈ßưÀƒég¹Ú§ỐÅ ù×áêÏÔå̉ ÇÜ‘÷›¾·ØăˆŸ;¶ơɵØÁí×àô‡ÍÓµØơêăˆŸ¡Á‚Ú¿́½ôѶ±»ù×ĂÙưÚăˆŸ‹È°»¹¶»Ø÷¼©—ÓÛ«‚ ½9·‡‘×8çñÓÖØù¿ÀÀ¹±»³Âí—GÛ«‚ ½9±»ÂÈö̃ˆç̃ËÉ9ùד¹ƯNă½Û«‚ ½9ëö÷Ú¥Çź‰̉›ÚÛüƯG‹ø«‡“Íj«‡“ÍjÓØ±»µØĂÙϹĂÙó“ËàçÅô‡¨Ø߈̣Ă$ªô£Ó¡ÔÆĂ«Ôƒˆù×âàßÚS±»³ºóµÜÁ̉… ëöó¶á ÁƯÛ×¥ˆ]1½€߈­ÅÛ«‚ ½9Ù½ÏÔÛ«‚ ½9ËӦ›¶éï³2Û×éÓÍÓÁĂ¹Ú›¾ĂÙÙ½Û«‚ ½9á+߈©ÜÁÛơı»‹ÜïºÑÓ&»ØË¿߈₫®¶ó¹å̉ 9¥‡§ÔÁ½é‰ñ5ñ·߈§Àù×ÁƯ±»¢Ô±ß‡Œù×ăÇíÑÓ…Ơ¹Èå̉ ƒàÏÔĂÙÛ«‚ ½9ăˆŸ;kéº9¥‡ưÀ™‰kß [ïS±»ƒ×‡ŒưÀ—»ñÓÀĂƒvăêĂÏÔ›¹Û«‚ ½9›¾‹ÜÁ¹ßÚÏԯȃv•Ö™‰kß [ïS÷¼½´†‡Û«‚ ½9×¾«ÚíÙëö½«‡“Íj¥6ïDÙÚÛ«‚ ½9ù×ÑÄëăà›¡ø‰Ở¾»ûÓ™‰kß [ïSá×ß»ûö÷·‚vË̉« ©ƒ»5Å9¥‡™Áͪ‡ŒÏ߈¸ÚăˆŸÛ«‚ ½9›ÚôƠXí9¥‡‹ÇơÔ¡ƠŸÖƒÔ™‰kß [ïS©¼Ù­Í±́ă½‡Û™‰kß [ïS«ÑăˆŸ;º÷ ´á ơÄăơ߈ç§Ø©‡¥2ßëMß»ûö¼ÄÏÔÏ̉±»å̉ ƒ½̀Ó›Ú³ ¡ÔßÄÙưv߈9¥‡ÛºÙ-“Ç»ÁÏÔ–½óÇßôÁ¹›¾éưÀµØÍBåÁ‹ÈÅχƯƯ÷Áù¿›¾«ÔÇ%«‡“Íj™‹˹ßÖÛÄÓ›¹ưÀÿ¨¤ˆ\0›¾ơÔñÆÛ«‚ ½9ÙÚ«ÔÙƒv¡Ư±»¦Ô߈å̉ ÑĂß½“Ơù×ëö©Ó·ÔµØÓ؃փ·§D ©ºơºáêÛ×₫®¶ùסÔÇ"ĂȈº·v¹àưÀÅØ߈ưÀÁƯÇØĂà×Ơ™‰kß [ïSƠ•×­Äÿ¯¶óÂ߈õ÷Û«‚ ½9ç'ăˆŸ±ëØû(߈ƠÅáŒE»ÂÙ̉‘«ù¿ơèŽßÄٓȾơêÏÄ߈ŸßÙŒë*«Óº¥ˆ]1ƠÛ«‚ ½9Á̉‰¿I‹ÈơêĂÙ›ÛϺ‹vă‘·Iˆâˆ:½€ö9¥‡±»£Çù×߈…»ÚÀÛ«‚ ½9çØß̃»úµØ©ÓÛ«‚ ½9‡Œ™‰kß [ïS‚Ø¹ÚÆ³ºó§¹™Á躸 ¯¾ñÖźÏ̉¿Ú£¨°»ƒv§Ô©‡¥2ßëMßÄÙăˆŸ;½­ÄÛ«‚ ½9ûÓ±»½€Í·ÇÖ’¹ÜN¿»¯G‹ø“¿ÓĐÄêÿ¯¶óÇ…äﻟ“ÇßÄÙ«‡“Íjµ†µØÛ«‚ ½9̃ÄØñÆ(éê°»·‡‘×8çù×Å»ÙÚăˆŸ;Ï̉ù×߈Ù½¦ô¡ÔăˆŸ™Á…ƠϺïôÉ¥“ƠÁ·ÅÓëÓª́̃ˆƒvĂÈơÔÁ¹ô׺ơé¯G‹øå̉ ĂÙ·ÔáêƠơÇØ…ƠëöăˆŸ;¯˜«‡“Íjù×ÿÚ¡Á«Ô¨ºïdÏÄù×ÙÚ™‰kß [ïS±»ׯʼn¿IÛ«‚ ½9ívº›¶é†x¥¨«d¡Û«Ô›ƯÓ Û«‚ ½9å̉ ÿÚñăˆŸ;«‡“Íj¶Uå̉ ˜–ï½·Ó ¥0¿‰ª¶2tTµÑÅ̉Å퇙Ôÿ$߈Ù½™‰kß [ïSëöÏÅçÚ­×*åĂÛ«‚ ½9ÛÀẨăÚÑÓ߈˜êèäăˆŸ;·‰ÏųµÀăˆŸ;›ÚùÆă£ÑÄë±»ù×߈ƒˆëöưÀ£Ø—Øù×9¥‡á §ÔơèÅÏÔ›¹ĂÙÏÅßψª‡’̀j‡Ç߈Ë̉ºơĐÛÇ»˜ùêùêÁ̉“Ơñ̉á »‡ăˆŸ;ñÓƠXƒˆ9¥‡«‡“ÍjÛ«‚ ½9›¶é÷‡“«»ăˆŸ;©Ø¿»ÙÅëÛºÛ×·ÔË[“Ơ™‰kß [ïSñ»ë×8 ¤‡ Öđ¹˜ ÙÚăˆŸù׺ÛÀ±%™‰kß [ïS¹àÛ«‚ ½9ß»û߈—ˆĂÙ÷Á̀ÓƯºăˆŸ;kgÛ«‚ ½9©¼÷ÁĂù×Û«‚ ½9₫®¶ù×ä̉ÏÔù×ÁµØ‹ÜŒ₫®GøëÚÁ½ëö½’Ç­Ö™‰kß [ïS߈½ăˆŸÁï½»y«‡“ÍjËÉ9ív˜êèä§ƠÿÚÂÙíÖĂȃÚ÷ÙÁÓơº™ëéåẳ¯‰¯0Û«‚ ½9ĂÖ©‡¥2ßëM•Œ™Ø½¡Ơ§Ó˜‰j̃ZîS߈½ëöǺíơă‘·ªÚÅ߈±¿×‰y¿‰çÚå̉ ˜‰j̃ZîSùàÛưöƒv߈9¥‡×÷$ÙÇ“ƠÔ烥ºĂ¼ÿ¯¶›¾ñÄÜØ™ÁºÛ«‚ ½9ùꙇ»‡Ù½·‡‘×8竇“ÍjÛ«‚ ½9‰¿IÁƯù×ƠÄ̉̉æ‹Üù×ÁƯÛ«‚ ½9źÑÓÿ¯¶ÁĂ KÓ̃¿ºĐÓ±»±»‰¿I§‡“Æơê«»ÑÄëưÀ«ÔûØƯÜÖÆï»ƒv¨Ø˜‰j̃ZîSù×™ÁööÁóÔ‡x†“ ߈«â߈÷ÔíÆù×ÏŰêØÏÔ›·ÔÆÅºÈ̉Ÿ}‚ˆº½ËÇåÆÅÔÅÓ߈ơÔ£ÇÙÚ¼È÷Ù9¥‡ÄôñÚψƒàÇs¤ˆ\0ÍÄ÷Á›¾ßÄÙ8¤‡Â9¥‡×±»‹Ù—¶ÏÅƯºâˆ§ÔÚ³³¿ß‡Œ›¾ƒvÙ½ƒvÚºƒØ߈³ºó­Ä½¹Ú§ÓăˆŸ;™Ó¹Ú߈½¹Ø›¶éÓŃÖÛ«‚ ½9ñÖáƠ°»¡ÈỞ±»±»Û«‚ ½9÷‡ÙÇ÷‡Ơ½ÔƯÓ 9¥‡̃ÁêÔ¡ÛÛ/Û׫»øê±»“È€ô±»ŸÅéêÙÚñÓ¾ô«‡“Íj¸ÚÆØÛ«‚ ½9±»Ù½ÛÄÓ߈±»éơ½—ŒÁ½ÿNÍÓ°»°»µ°»«‡“ÍjöüÁ¥üƠơꙉkß [ïS̃ȶ›¾µ†ßƯ©ÇÛ׋ȾÿơÅØ½Ă±»­ÄÙÚÙÚù×ß³(ÛÀí¥¢ä™‰kß [ïS¦Ô¹Ú±»½«ưܽ‡ăˆŸ±»½Ø±»±»©Óƒv±»ÎÅàÆ¶ª‡’̀jƠ¾G³(ÏÔÚ®×ÏÔĂȃöÍĂÇùß»ûƒvÿ¯¶©ÓóÀ«‡“ÍjÛ«‚ ½9ưÀđÁÏÔ»ÓÛºôͽÀÚͼ¡»ĂÙ«·3uUŸÖ¾ß“Ơù×ÇÖÅØ̀Óív÷¶₫®¶ĂȽô­ÄívăàăˆŸ;kăˆŸ½¼˹ÙÜö⛾¿Å߈Û«‚ ½9ÏŘơđóƽơ$ÅÄ©¼›Yù×°»«‡“ÍjÔٽپ±ëØív́vß»ûöÿÂăˆŸ9¥‡ù׿ô«ôû¹ÚưØă¥Ùív›¶éƒˆë̉½ǽăˆŸù×Å»½¡Ûëö9¥‡₫¼êç +ÖÖ¼ÅÛ«‚ ½9«Ú­ÄÛ«‚ ½9Ž̃ˆñ«‡“ÍjϼöÁÁƯĂ­ÖÿÛ±»ƒ½ä̉ÛÚ«È߈‡Œƒv±»Í«‡“Íj߈ÏÔ÷Áƒ½ÜψÛ«‚ ½9߈ª»‹Ơ₫&Ó™Ù»‰Ûíê…Ö—»éôË̉¬!¿àÔ±ëØ£äÀĂ™ëé庯à§ÓÙ½™‰kß [ïSϺºÁ·‡‘×8竇“Íj±»Žù×ơÔ¹Á‰¿IáêơÔ›Û9¥‡¾ç®ĂÖ…ăˆŸ;kăˆŸźăˆŸçÚ—`±»ÑÓöÁ +‡k™‰kß [ïS±»Ù½¾º½¸È ¹ÚÅØæº ƒvăˆŸÇÖ¿‰³ÈĂÙжĂ•/ơꙉkß [ïSß»ûáêùê‹ÈÏÄăˆŸÙ½ăˆŸ;߈“ÆßÚûÓ¢äÍ#À¹¡Ô‡ÏÅ¿‰÷ˆ߈‡Œ°»9¥‡×ưÀ9¥‡óÇ€Ơ³ºó½óÇù×щ±»ï»ƒvùׯ‡¾‹Ü÷Á˜‰j̃ZîS¿'´aÏÄ“Èëö™‰kß [ïS÷ÔÁ|å̉ ±”›¾÷‡ơèÅÛº«Ú‡ºÛ«‚ ½9«%ïÅ¡Á̃„ÙưÚÙŒë*«ˆú‚ˆïº‘³ó¾…ÚßÄÙ“Ơ•ŒĐÅ’È›‡9¥‡ăÁ¿»đÓ«‡“Íj×¾ăÁôưÀÛ«‚ ½9χDžÖửÿ¯¶§ôÔơË̉Ă¼°»ǺÏÔ¯×ö¨Ç₫ÑÄë¤ÓÈ̉ÁĂ‚£ÔŸÅÇÖó#¹¶çÀ…ËƠ™‰kß [ïSçô«‡“Íj₫®¶çÚ³ƯÓ ¿ô±¹Ú߈…ÇÏÔơê߈щëƠU«‡“Íj½ÛÀêö¿¹÷ÁíÁó½Á̉₫Çăơ«‡“ÍjăáËÖ±¿éÓĂĂ ›­±àéMơÔå̉ ™Ô߈ù×Ù×ñ€º8¤‡Ö߈µØ“ÈÍĂר߈—Ó‡ñ5“Ç߈çØ·ÅưÀß»ûϽ€ñÓ½ë߈ٽ罹ڱôÏ̉°ÁÛ½½™‰kß [ïSĂÙ°»±»©Ơ½ơĂÛ«‚ ½9ÿÚÀĂù¿Ù½‡Ç‰ßăơ½ßÛ«‚ ½9›v›¾Ăß»ûÛº‘Öé×¥âÿœÜó·ôß½é‰ñ5ñ·…ö‹Ç«‡“Íjă»»Ø˜‰j̃ZîSÙ½‘‚ÔÙÚù×™‰kß [ïSù×Ï̉èÙ½¡Û¶Ơ×™ëéå¡¡Ó“ƠÉ»¿‰—»éÚ™‰kß [ïSÏÅ‹ÜÛ«‚ ½9µØóÔͽ÷ÚÓÓÙ½£ä˜‰ j ̃    Z îS ¾ºçÚÅ™‡û™‡³ºóÛ«‚ ½9¾ÚÆ;ôщµØ…Ơùê½ Èï¶©&¥ÄÅÔ£Ôô«Åı¿‡ºưÀø×đÔ½ôƒvç'—¶¿ôÛå‡ưÀ™‰kß [ïSù₫©ƠÇÓÚª‚ +¼9ªÓ ñÚéÚßÁ¿º…ô߈©àç̀ºÛ±»ëơψôù×߈åĂùơ¥Ûù×ăˆŸ«‡“ÍjÂƠǧ)Û«‚ ½9ăˆŸ§½™‰kß [ïSª»"«‡“ÍjØYöóÏÔ×ƠÛ«‚ ½9߈ä̉ÑÓ™‰kß [ïSív—ˆ³ÈÙ¹Úå̉ «‡“ÍjÁ‡é/×:ăˆŸׯá «âëö¡Á»ŸôØ ơÔÅ–Ù½¡ÔÁ|·‡‘×8ç§ô™‰kß [ïS™ëéåöÁ§ÓïÁó|çÚµØÍÄéê³à±»›Ơ¾*ÍÄưÀ߈±»«‡“ÍjÎÅù×Ù½°¿ÿÚÏÔ±»ƒØÿ+«Ô‡9ƒv½ÿ±¿¹Úăàëö à¹½ÙÚ½ÔÊÚ•Œׯ±»±È™‡Ê!ëØơÔ»ôá Ăô»‡€ºÓÅ‹Áù×¾ưÀƒvÛ«‚ ½9ƠÅ÷ÁÑÓĂĂ¿º˜ÁÁƒv«‡“Íjå̉ á Ó¾ªÓ«‡“Íj§Æß»ûÏ̉ơÔ«‡“Íjÿ¯¶߈·Ôùû&áö«‡“ÍjщÛ׃¾‘اÓÁƯ½™‡›¾ÅØÁ¼ï½ƒÖù×å̉ ©‡¥2ßëMƒ½»ăˆŸÁ™‰kß [ïSºª»9¥‡é×ÄnÏÔ÷aÛ×ÄÂÁ̉ƒ—Ó¡ÔÀĂÅ›¾ë³áê“â“ƠÍË)éÛ9¥™‰kß [ïS½¶èºƒÖ¯‹ÜÿÚÿÇɇù‡‘ßÄÙ±»ôÄÙ½ívëöí—G±̉ßÚï½}•Ö¶Å³Ă‡Ï̉¯×Ù½«»ä̉áê±»ù×÷‡Ù̉“‹ĂÖ9¥‡°¿>½™‰kß [ïS¿ß‡Ú¢»¶ç'³Â½ăơƯÂëơ›¾˜ÔÑԺصثÓËÇÛ«‚ ½980¤‡0Ö +™ÓơĂÁѶĂÛÚ±»ơ½Û«‚ ½9º»Ø‰Û­¾ù×ëÚÛ«‚ ½9™‰kß [ïSÛÄÓñÚ߈íÖ·Ô™‰kß [ïSµƯÿÚ·‡‘×8çƒÔù×ỞÂí—G©‡¥2ßëM™‰kß [ïS…Ö™‰kß [ïS½̀Ê)èÛ8¤߈ͼÛÄÓÙ¹ÚÙÚÿÚùæơÔùÇï»Ó‡Ç̉Ù×â*êöÅØçØ™ÉÛ«‚ ½9¾ß ‡x÷Á߈ÏÔ¿îï»ơêßÄÙ™‰kß [ïSỞ“ȇŒăˆŸ;ĂƠ±»Å»µØơê®GøÛ«‚ ½9Ç»ăàÀ‡€è/Ö:ÁƯăˆŸ;‹ÇăˆŸ;Û«‚ ½9ÿד¹ƯNëÔáêÛÚÅØ¹Ú¯ÅØ÷ˆù×áÅÇÖ«‡“Íj߈ù×ĂÙñÓÑÓÛ«‚ ½9ñÁ¿́»çÚÇÖï»Ă»yÓŅે“Íjª¶2tTŸ}©ÓÙÚưÀơêƒ×™‰kß [ïS̃ÄØăˆŸ;忱»Ă«‡“Íj¹ó“‹·ÔÍÓ庡Ôî»ëö½™‰kß [ïSÛ«‚ ½9ơúÅÓăˆŸ;ÛÄÓ«ÑơêÙÚ¯×Ǻ‚v½º“ȱ»ëÔ“Û߈Ź‹ª-‡Ç­v•+›¾«Ô8¤‡¡ƒ„ÛÈ狹ÚÚª‚ +¼9ôêø¿$áêê ±½Ï̉ƒÏÔÙ½ÑÓûÓµØÔơ™‰kß [ïSÿ¯¶±»Áù×₫ çË̉¯×ưÀơé9¥‡ÚÀ‹%¼€ÿÂÛ׃ƯÓ ³ơÔă¼é¾÷¼߈ĂÖßϳȹڙ‰kß [ïSçÚ¥ÆÇøÇ±»“¹ƯN«Ô½ŸóµÛwăˆŸƒvƒv¢Ô—ˆÁë–™‡ÙŒë*«¡ù×ƠÁÏ̉ùÚëÙƠ»Å“©ÓôÄÀ¾±»¿Å™‰kß [ïSÂå×ÿÂñÖ«‡“Íj±»ăˆŸ‹È½ØÏÅŻ۫‚ ½9Û«‚ ½9±»Ë̉å¼ éºïƠưÀÍË)éÛ9¥Û«‚ ½9¡Ơ‡ÇÇÓ9¥‡öÛ«‚ ½9·Ă©‡¥2ßëMÙ½†đ5߈ÇÖ“Ơå‡ñÚå×áêú(¥ºÿ¯¶ôø²߈¬Ä ºơƒvœÔ±»ÇĂÛ«‚ ½9Ó̉ÅÀ½ăˆŸ;ßÁă½¥Æ±»…Â½ăˆŸÄíváƠ«‡“ÍjƒvăµØͺ’ÆÎų(™ĂÛÚ½€±»ơê—»—ت»ù׃¾‘Ơăľ߈Û«‚ ½9ÍÇĂƠ•Œ¹£÷Ôö€OŸ}Û«‚ ½9¸Ú™‰kß [ïSóǃˆ­ÄÜëö™Á™‰kß [ïS£Øă™‰kß [ïSÛ«‚ ½9½9¥‡çÚÓÅ÷ÁÏÔóÇă½ÆưÁ‡9ׯ¦ôÅØÛ×ÏÔ»yïiñ¹™ ƒ¾‘ăˆŸí—G‹½ƒvÿÚÁƯăơ«‡“Íj™‡á ù嘉j̃ZîSÏÅͼ÷Á†´ù×ăˆŸ;ÿÛĂº©›ơÔËÖöÏ£ÇĂÙ‰ÁËÉ9›¾°»ăˆŸκ߈ƒvá¬ߌÛ,í‡Ù½±ÁÛ«‚ ½9ăàëöƠƒÖơêæÚ³í»ØÆ±»²ƠÛ«‚ ½9÷‡½€ßÏËÉ9ơêăˆŸ•×›ÚáêÛÇ«‡“ÍjđÁÇÖ‡º©Ø«Ô¹Ú̀·¸ôƒvù×ù×ÍÄĂÙ—»ͺéÓû¡ÁéÓăˆŸñÄÁƯ¥ØßÄÙ©¼«·3uU½‡Ù½«‡“ÍjÙ½ưÀǼŸ}̀Ó +ƒà·ß»ûÏÔ£äö¼Ă±»—»µaßÄÙÛ«‚ ½9«ÔÛ«‚ ½9‘ƹÁ³ÁĂψÛ«‚ ½9÷#ß„ËÇø¿æZ© â»ÈfÏ߈ÿÚ»ØĂÙÙ½ÏÅëö¿Ỡˆÿ¯¶ºù ©)¡%ôê±»¹ÚĂ—¶¹ÚéӥǛ¾ÅÛ«‚ ½9ë׋DZ»ăˆŸƒÖƒv±»‰đø×¾Ï̉…$ÁƯÙÅë½Zø¾·Å½‹Ü¥â¹Ú߈±«»å̉ »y«Ñ£Xß»û‚v¯¨ÿ¯¶ƒÖ­ÄÀƯ·‡‘×8çÙ½±»à=èơ¡Ơ¥‰ÍL…̣¶¾£Øß„Ù½ùơĂºƠù¿ƠµØRôÍÓù×á·ÍÓưÀä¼™Ó™‰kß [ïS™‰kß [ïSư“©.«ÔËÇù¿¾»Á÷Á³ƠßÁÿÛ½›¾ăˆŸơ*ÑĂíڭı»ÏÔ߈£̀ÙÚù×̣ÅØ߈ÅÔÏÅ“Ơä÷”"IŸÈÛ«‚ ½9Ù½¿ô×Íåôë¡ÁÍ÷ͼ«‡“ÍjưÀơêñÆ߈«‡µØá§Ôù×ÏÔ÷Ú¼ô§ÆùצƠ™‰kß [ïSŒ&߈ñÚí«‡“Íjù$–¶‰ÛÁƯƠăˆŸ;k«‡“Íjù×ÿÂ… ‰₫ëö™‰kß [ïSÇÖ”ÇÍƠ­ÄÇÖ™‰kß [ïSùêăÇíơÄ™‡ßËáÛ¶ƠÅ÷Ú¹Úµ.¥ÙỞƯÓ ϹçÚ8 ¤‡ Ö +±»ö±»½ƒˆÜÚ‹Ç›¾ÁĂăˆŸĂĂ ›­±àéM9¥‡©‡¥2ßëM±»Ÿ}Á›¾ù××Ú½Ï|·Å¹ÅIÁ׃éÔ÷å5ÓÁ̉Ï̉ÅØ‡ŒéØÁ̉ơêñÓ÷ÁÛ×÷‡î#ó׉Üơê¼ØÚÄ̉±»±»ƠÏÔÓÅ߈ïÀÓơêû(©Ó™‰kß [ïSĐÄêÏÔơÔ½ç4¿́ƒÚƯÓ ™ÔµÁĂÖ«‡“Íj퇣ÇĂ¼±»©ØÔºl£‡ù׃ˆÛ«‚ ½9…Ö¼Ơø»…ÙÚ½Û«‚ ½9©ÓÁ½íÖÏÔÛÄÓÁ¼ÿÂơêÓºƒØƠÏÅ÷Á¶‡Ö8æͼ©Ü—¶ÙÚ…½Û«‚ ½9°» ÁƯ߈ßÁ«·3uU±ÈƠÓ܃vÛÄÓÛ«‚ ½9ÇÖ•ØơÔ×Û€öؽ§ôéøκåĂ߈ƒÖ«Óƒvă‹™‰kß [ïS£ƠéÓÿÚéôψ¡Ơ±»ưÀ°»ÙÚ›¹9¥‡ù×ûéÓí€ÜưT釧֙‰kß [ïSçÚ±»µÏ£äÎÔªÓ«ÔóÇÛ«‚ ½9ÙÜ߈™ÓỞ©¼³ôÿÚÙ½±»ƒv±Ư¨¼ưÚâˆ;߈›Â±»½»nÊÓ­ÄỔ‘Æ°Ô ׯ̉Æ“ÈÛºơêËÙÚ«‡“ÍjĐÓ‡x߈¹ÚµØ¹½€ºÙÚ«Ô¡ÛÅôÙ½‡á½±¿·‡‘×8çưÁ›·Ôÿ$ƠÅ«Ôïä—»9¥‡™‰kß [ïS߈ù×ÏÔ«‡“Íj±¿‹Üă»ăˆŸ;˜‰j̃ZîSǼù×ív̉½ €¼­ØëöàƠÁ›¾ăˆŸ;ÏÔñÖ/½³ăˆŸ;÷ÁƠXơèÅ߈Ơó‹ÑÓ÷ˆ¥ˆ]1¯È½̀¬H›¾ÚÀÑ öÁ̃ˆÅԫԳ…ØÏÔñÚ¶è†×ăàù×ÅÙÚĂÙĂÙ™‰kß [ïS»yéê±ëØ‹Ụ̈Ç™‰kß [ïSº½©àÓØö­¾ưÀÄØöÚù×ù×ĂƠăˆŸ;kĂÙ©ÀÅô£ä±¿ù×½·̣Î̉­¾©ÓêöÛ×—¶ͼàÓăˆŸ;k«‡“Íj9¥‡ùñÙÚăà½ÏÄÇô÷Á×Ơ9¥‡Á½ƒˆ÷ˆÏŵ†Ó´±ëع̃”Œ£ÔôơÄïÚƒv¯È₫ÚÑÓù¿•Èû›ă½߈¯«‡“Íj߈ăˆŸ±¿߈£Ç߈ÑÄëù×çÚ›¾߈ơÔÛ«‚ ½9åôÍBÛÔ›ç…ö«»âˆ:ƒˆ½°»߈»Û«‚ ½9¦ÔÁ‡é/×:ëöæÚƼ›Ú±»Ǻ‡ÇóĂíº£‡ëö߈™ÓÏÔ›¾8¤‡§dëöơê߈ç¨ϺÇ%Œºëö߈ËÇÙ׫$ĂƠ¯×߈‡ÇáƠŽ¿Ø¥Û÷Á«ô߈¾ï½‘Æ—ÖÛ«‚ ½9ăˆŸ;ƒv߈÷ÁÛ××ÜÍƠÈöÁ +ĂÙ¡º©‡¥2ßëM·‡‘×8çñÓ±»ù×ÏÔÏÅ—¶µØ¬ÙÿÔÛơĂỞÅÅǾơŸÏỐơßÙߌÛ,ù×™‰kß [ïSó¡ƠÚª‚ +¼9¹ÚăˆŸ;k‡Úß½°»ÏÔ_÷Áó«»ëöưÀ–¶È™‰kß [ïS±»ª»Û×Ơåï‰óÚª‚ +¼9¡Ûá ƒv‹ÓĂ¼˜êèä߈ă½ÙÜYơê߈Áôôù×§ÔÏÂçÚྒྷ¹ƯNÍË)éÛ9¥ùוÈû›Á¹‹ÛëöºØ±»âĉۃvÅăà†Œµ†Í¦Èׯ›Ú‘ơÏÔ¸Úù×₫Ú½«‡“Íj߈±»Û«‚ ½9÷¼çRåĂíÁ£»ªÚØ×›¾ĂºưÀëö߈Óº…ôÏÅù×ù×ñÚ©¼߈ưÀ׿8ưÀ¡ËÜ¿‰ëö›Ú¯ÆăˆŸƒv¼Ø·Ø«·3uUû ™‰kß [ïS÷ÁưÀ“½èÓ‡xÛ«‚ ½9ëöÿÂù×ÛÀ—¶Î̉™‡½›vÁÜÿ¯¶ÓaÓ̉؃½Û«‚ ½9ÏÔöÁîÅÑÓ¡ÙÚ±»¾Ô9¥‡ÉÛ«‚ ½9ÿ¯¶ÏŇx‡Œ߈±»›¡ÿ¯¶ÁƯÑÓÅÄÛ«‚ ½9£Ø¾Ö²«Ô½ÁËơ꨼™‰kß [ïSóǽµØÛºéºù×—ºƠù¿ù×™‰kß [ïSßÄÙă»¹½ơÔẲÅØâơËùê‡Ă¹ÚßÚÙ½áºÛ«‚ ½9ƠíÖ±»ßïÅ‚v\½€ñÚÍÓ‹ÇÎ|ÏôăơŸèƠù×ÅÁñÚ­¾˜‰j̃ZîSơêºå̉ ÿ¯¶ăı‡ªÚưÀ‘ÖĂèá=Ăº‡ù×Ă$œåơÁÙŒë*«°»²(¡»ÏÔר‘¼ÂÙ««‡“Íjÿ¯¶ÁĂù×ßÔ9¥‡«Ô§½½«‡“Íj³ºó¡Çôơê߈ÜÓ Ù½߈Ăٓ̓v˜‡£ÔÆ÷ÁËƠïöǺƒv¨º‹Üù×Ü™‡“ÈŸÖ½±»…áù¿ÓºÍ­HÏŘôăˆŸùà×¾©‡¥2ßëMăÁưÀ½ôÁĂÙÙ×ăˆŸ;Àô¼³Â¦È™‰kß [ïSÙ½·‡‘×8瑱…»­Ä½Ơăƒ¹§ÔÿÂÓÅ‘½Ô·‡‘×8çÏÔ™‰kß [ïS9¥‡ù×ËƠñ×›½£Ư9¥‡ÁƯĂƠưÀ¿º̀ÓñÚ³¹­ÄÛ×9¥‡çÚÏÅĂÙ™ôăơÂ虉kß [ïSÛ«‚ ½9߈éêÏÅ·ÔÙן»«·3uUå¿Ùڟ؇œ‰¾IëöÜ«ÔщçÚ­Ö·ÔºyëÓ¯¼±»ù×ß»û«‡“ÍjÛÆ«Ô§lù׋ٶ¨ºóÔÛ«‚ ½9¯Æû(ôĂÛÚÿ¯¶ÛºÙÚ‚vá˜Û óÇ¥Øơê·‡‘×8çË6QĂÓ•Èû›Ÿ\çÚ™ëéåăˆŸñÆ·‡‘×8çÍÓåĂ¹ÚñÚ߈ĂèÆÅ +Å؇Ơ¥ˆ]1Û«‚ ½9¡Ô¸Úëö¯È•ó‹ÜưÚÇç¿ØƠîĂà®GøÛÀ¾ßƯÚùæ¹€Û¡¡¾ÙÅë«»ĂÙ™‰kß [ïS™‰kß [ïSź¡ÔƠù׫‡“ÍjÛÄÓËÉ9ùêíÖ¡ÔÏÔƒˆ«ÔÓØ€Ó·È¢ơÄơĮȃvÛ«‚ ½9“ƧÆÿÚƒ»Ưº›çñ×ø×º¹Á±¿×¾™ëéåơèÅù׆ ƒvÓºµó×ÇÇÉ̉߈Ï̉•(™‰kß [ïS©Ø©Çå»»‹«ôÓáễÖ•ø·ˆ‡¡Û¯ÈÚÀ­Ä—»Đәԩر»™Œ½ÙÜ™ëéåá×ëöùë¹ÚϹ–»Û¨¼8¤‡Ú(ÛºûÍË)éÛ9¥ÅÓƠXä̉÷‡µØóhùשǺñÓÏÅÄÓơÔË%·Ô‘«ÁõØÿÂơèÅĂÙÅà›¾ơèʼnÛ×ܪdÑÓ×̉­¾÷Á“Ƙ‰j̃ZîSׯœØ¡ÛÙỌ́ÇÇÓƒˆ—¶ô½ô»ƯÙڣǫ»Ơ±ë›¡Ăô›¾·§D £ä纜‡—ÓôĂ߈™Û¡̃ˆËÉ9™‰kß [ïSÙÚ«‡“Íjù×±¿ỞöưÀÙ‘©‡¥2ßëM·ÔÔXÈđ»ø¿µØ×¿8ù׿̉µØÉơÔ÷Á®Øª‡’̀jׯ÷Ư‰çØï»߈ÿ¯¶¼›¹Ûº9¥‡ó¶8¤‡ñÆ€ƠµØăˆŸ;ăˆŸ«»ƒvëöÅØăˆŸ;k›ÚÏÅ߈å̉ Í/ËÇăˆŸ;º©Ø™ÁÅÓ¯ÈăˆŸ;Ơ¾ßÓÅëö­Ö8¤‡™‰kß [ïS™‰kß [ïSá¼Û«‚ ½9߈êԩܡԓÆåĂÔ©‡¥2ßëMÛ«‚ ½9‡ÚëÔ§ØöÉ̉óÄ·‡‘×8牿I¥ØăˆŸăˆŸ;˜‚‡“ăˆŸÿÚ™Ôÿ$ÏVØÚù‡ƯZ„ôógËƠ•Èû›ëö·Ü±»“ÛÔÎÔù×ơÄơÄÍ&›¹ù§íÖ¢Á™‰kß [ïSÙ½߈¼ƒ°÷̃÷Ú¯à˜êèä½ëö›¶éñÓ±½߈¯‰¯09¥‡óÂùׯG‹øëö÷ÚƒvùדÜ÷å5Ó½Èù×½™Ó߈¶èçÚơêÏÔ9¥‡ĂñÚÓà·Ó ¥09¥‡ăêƒÖïDăˆŸ;Û«‚ ½9ö׿8ÛºÍË)éÛ9¥ÏŬ¾·Å߈ăˆŸƒÖûÚÔÿ§ÏÔª‡’̀j߈™Áư¥́‚vÛ«‚ ½9µÅ¡Û¡¼ÁƠ«‡“Íjù×—¶¡Ô«‡“Íj³£X±»öÚª‚ +¼9ñíÈÁ̉ÑÓƠơÓØ¯¾àê©-ÏÅÏÅÙÅëØ×›¶éĂÛ«‚ ½9匿NÙ½™‰kß [ïSÿ$œ‡Íć¥%Ơ·¼Í7߈Û«‚ ½9κưÀëöëöåâ±̣ÂÁÛ¿ÅÇ"½áꓺùת‡’̀jº£»«‡“Íj³ỞÅêơ¥ÆíÙÅà·‡‘×8ç„n©ÓǺ‡¡Ư±»ÏÔË̉µØ¹ÚơĘêèäăˆŸ;µØÛÓÔ߈ƯÓ §àµØ®GøĂÙÁĂ¹ÚỔ‡Ç±ă¹Ú9¥‡×íêÙÚ€­ÖưÀ„à«ÔÅăˆŸ;ùÚ÷Ÿř‰kß [ïSßÄÙáÅƯq›ívÍÓ·‡‘×8ç¹ÚăàÅÓ匿N®GøăˆŸ;ÅÄ9¥‡ÓØÑÄë×¾ÏÅ›ÚÑÓ¡Ç­ÄœÁÏÅÙŒë*«ơê‹Á¥ÛưÀÛ«‚ ½9Û«‚ ½9™‰kß [ïS‘Ƴ(¾¹xƒv%ŽßÁרï³29¥‡× ¿ŧӡۃÖăˆŸ;Ó̉ºË¿÷ÁéÚêÚû$™‰kß [ïSơê±ëØó±»›¾¹Ú‰¿Iêç̀Óù¿Å»ŸÈóâÿײ«ÑÛ×ƠÁ9¥‡ù×Á‹ÇÙÚáX•ÿ¯¶ÑÄëÙ»߈ƠưÁÿÚẨ±Á›¾ëöëÔ©¼¸Ú匿N…¸ÚƯÓ ÏÔÑĂƒ•Œø×9¥‡§ô³zéÚĐÄê©Ó±»ÿÚñÚ™‡•Œ´¶†‡ÙŒë*«˜‡ÏÅ“½ÏÅÅÓù×ív°»ÿ¯¶ĂÙ‡ñ5Û«‚ ½9¶Å—»·‰ù×ö« ©ƒ»5ƒÚ”Ç‰¾I«‡“Íj߈…¡½éôÑÓ­Ä8¤‡“ƠÍÓ½¾‡Ù×ƯÓ åŒ¿NêÚù×™ÓÍĵ.¥ÙÏÔ“ÆÏÔ¼“¥Ø¿ÙƒvĂÙÓØ³ºó£ØÛ«‚ ½9¤¾¡Ơ߈Ÿ}ăˆŸÅ‹ÇÑĂÿÇ›¹«‡“Íj«Ô%Û«‚ ½9—¶çÚ‡Œ¹Ú×Ă÷Áù÷Á‡ÚĂÙÿÚơêù×ñÓÛ«‚ ½9±»‚±»ƯÓ ·‡‘×8çỞỞÛ«‚ ½9Ù½“ȯ×߈½ÁĂ·‹ÅØÛÀù×·ÜÅà¹ÚÁĂç´™ơ߈±»ôê±»«‡“Íj÷Áƒv™‰kß [ïS¶̉à̀Ó“ÈñÓƒ¾‘æÚ³ Û«‚ ½9ÇÖŸÈäÁ½÷Á¡êö½€˜êèạ̈ĵ‰áÛ£»µØËÇÊÖ‡Û±»Á½ưÀ‡áîÿ¯¶«‡“Íjù×¶ÔơԻ±»·‡‘×8çăˆŸ;ƠXăˆŸ;—»ö߈%‰Äà¾ßÅàçÚ¾Ú½ă‘·«‡“Íj£ ăˆŸñÚÏÄ“‰3Ơ,ù™‰kß [ïSÛÀ±»ÂÏŋܣäéÓ¥ÛÁ¹£Øív±»µØôĂ¾çÏŹÚƠñÓùט‰j̃ZîSĂºơÅ©À§Ø©ˆµêÙ×±»½•áßÖƒˆ­ØƒÚçô³zå̉ £»™‰kß [ïSơèÅÙ½߈ƠùơóÂÑÄë¥Èå̉ ¥Ë½µØŸÅ‰y¹é8¤‡×‘Æ…£­±»‰¿I›¾ÁăÅÙơçă½ëö÷Á¡ ÄÓ›¶éÓØ‚ÁƠX¥Û̉*b™‰kß [ïS·ˆÙ½íÖƒ¿Å½›çÿÚÙÚ±»Ç̉ôéKÛ«‚ ½9ëö¡ÇơèǺ–Gƒv±»±»çơ‰yëÔëöäĂÎÅËÇăº߈Ù×¾…Û•½Û«‚ ½9¾Çÿ¯¶Ù½‡ŒƒvăˆŸμáÛù×߈™ÁơÄ™‡ÇĂͲ₫®¶“Ơ›ÏÅéçñÖÅØ9¥‡á ÏÔ‹ÇÑæµØÅÔ™‡©%±»Ç»Ûº±ëØç̉ù×´ØáÛ»½øê½ĂƠơĂª»ç̃ÿƒÖñÓëöµaçÚÿ¾À&Û«‚ ½9«‡“ÍjÏÔî½ÓÅàºêçí#­ÄÎ̉½€ÅÓ¹Ç̉ƒvüØ“רï‡ơèÅÁ¹ؽơèÅơêŸ}øê‡ËÉ9™ÔívơéˆăˆŸ;ùê¡Ô‹Ù·Å‡ÛÀÛ«‚ ½9¯×ù׃ګ‡“Íj÷Á9¥‡ªĐ—ˆ†ÚÙ½₫Û ‡ñ5̣Âơꙉkß [ïS¡Û±¿“¼ÏÅ¿»‡Ç¯¾®Gø9¥‡ÙÚ³ºóƒ±»¯¼Á̉ăˆŸ;kÍÄ¡ƯᬇƯÛ«‚ ½9ù×µ†½ Áëö·Å¿àµØ±»±»ïÅ߈ùÚÏťث‡“ÍjÇ¡±ëذ¿Û«‚ ½9ÛÄÓº߈î½ÂçÚå!ăˆŸßÁ°»¹Ú¯¼¡Ç›Ú°»±»™‰kß [ïSöÁùêµa¡ÁÏÔơ½ăˆŸ߈匿N¬Èg—»Û«‚ ½9›ÛÍË)éÛ9¥ívăˆŸ;këÚă½³Øùº±»ƒ÷Û×̣Ä×¼ô±»·ØÛ«‚ ½9ÛÄÓ¼Û«‚ ½9%óÇôê¿uë×ÁƯß»ûÅÄ·Ô¼ÅØ߈“¹ƯNÇßƯÍƠ«‡“ÍjçºÿÚñÚƒ¾‘öù¿Ï̉µØẳ¹Ú“Ơ¥Æ—›¶éóÂÏÅŸlƒ¹ÚăˆŸ‰Æë̉‡ºÇتâåÖƒÖ‚½½‰y½߈Ë̉ÖÁ«·3uUçô×¾¹ÚçÚ†½ªÔ™‰kß [ïSÏÅăˆŸ;á=÷Á™ëé庭I«ªÔå̉ ÁĂ¿»›v·Ô9¥‡“ÛĂÙư“›Ô­Äí—»é%ƠÁµÜÓ¾éÚªÚăˆŸ;‰Ư«‡“ÍjÍÓ«ÛỂ +×¼°¿­vÓµíÖªĂºßÚ«‡“ÍjơèÅé꫇“ÍjÑÄë߈ɹڡӹíÿ¯¶Ï̉ÙY›Úô±»·Ü·Å߈¡»«Óß»ûå¼ ăˆŸÁƯ—¶ªÔíØ¿ÙÏÔÏ̉ÏÅ­ÖĂô…Œ9¥‡Ó¾¿ôû(«‡“ÍjÛ«‚ ½9ĂĂ Ëû¶ÔÙÓóÚª‚ +¼9¡¥ëö߈ăˆŸ;kùסƯåÁ¹ăZ«ÔÁƯâơ¿‰ß»û˜‰j̃ZîSñø8¤‡ëöà=Û«‚ ½9“Ƴ(“º³Èƒvëö²Ú ơÔ£ Ù½ùêéºÔƒÖ«‡“Íj˜êèäƒéêß»ûĂÙĂÈëöÅËÇ“sø¿âÁ÷Áö˜‰j̃ZîSö“ÈÁñÁ¹…Ø©¼Ï|ŸÜÍÓ…£­ƠXÛ«‚ ½9Û㫇“Íj…½Ø©‡¥2ßëMÏÅïé›Ú«·3uUùêơÔĂôơê£Øëö°»«‡“Íj¾»ù׃ØƯÓ ±»Ù½·ÔÂÙ­‡9¥‡â»Ûºϼ¯Èùë÷‡ưÀăˆŸĂÙ¹Á«Ô½Ă…Ø›¾ôÛפ‰̀L„ƒˆ¸£ù×­Ôă»ƯÓ ±Ǽ±»¬ØăˆŸ;½ƒˆ«‡“ÍjؽÛÓ¼˜‰j̃ZîSÿ¯¶H¼Ă ăˆŸ9¥‡×ăˆŸ;ưÜ«‡“Íj©ĂĂÙËÉ9œØ‡Ç™ÓÏ|ëÔùס»g½±¿óÇ›¾æØ«»µØóDzƠ©çÚ¾÷Ù߈¡ƒ½ẳ߈Ó ‹›æ“ÈơêăˆŸ™‰kß [ïS߈߈ĂȇêùוŒăˆŸ¡Á«‡“Íj«é¼Èö‰¿I™‰kß [ïSٽŅö§Ô©Çóǯۙ‰kß [ïSÙöÙÚÿÚ…Ô­ăÎÔóÂË“ƠcăơÑ·±»¹ÁåĂñ»ơꙇÏÔרÙÚÁ­vëö—¶ÏÔÄӼ́÷Áó¿µ́–Gƒ¿‰óÇù걿Ơ•Œù×¾‹Üƒ “§Ư²—¶ù×íê߈í‡ƯăˆŸ;ËÓÁƯơÄơèÅô½ư“‘ÈƠ¼÷Á³ô¿»¿½щăˆŸ§Óç¹Í́—»ư‡±ù1—»ϺÛÛ«‚ ½9§ôÛ«‚ ½9û*éÓƒvƒ×·‡‘×8绽ơúá=¹àơê¡ÁÏÔ߈ÿ§Û×ÏÔ¾ Á³ÜñÖǼµØÿÚŸÈ…Ơư­Ô½³Ø÷ÁァԵؽؗˆ™‰kß [ïSÅÔ“Ơ«»ưÀٽ˿ؽ±½±»ÛºỂ÷Ú¶  ï»ÅÔ™‡߈ä̉¾¾ƒÄá̉ƒÖºùêÑÓ߈ËDZ»˜Û¥ØÍĂ…Ơ½Ù½¿‰£»£»ƒÔ¹Ú†Çëö™ÓµØÓºñÓ³Œ¡ÁỬÓ̉öÏÅ›¾Óص†ŸÖ·‡‘×8礈\0¿ëÙÚ·×¼ÿÇñÆÅÓÏ̉Åó|ÑÓëö“Ơ°êØ«‡“ÍjăˆŸµ‰±»Ë̉߈°»ăˆŸ;ßÄÙù×̃ˆ÷Á÷ÁÜ‹Üщ¨¼å¼ ăˆŸ;kíêó–µØÛ«‚ ½9̃ˆ¡Á«‡“ÍjÙڸڣ䗶‰[öăơÏÅ·‡‘×8çÂÙ¾«‡“ÍjרׯÿÚñÓ¡ÅưÀ·‡‘×8ç½µƠ­v²Æ +×ÓñíȃˆÙ½ÿ¯¶ĂT9¥‡×ñÓÛ×ÅÓ‡Œí—G9¥‡ñÚøê™Ó«ÚĂÖ‹Ü…Ơ™‰kß [ïS©Ó±½ߌÛ,ƒv¹ÚÏ̉ƒ×¿à¡ÁƯ¯̣ĂĂùӢǓ¹ƯNÿ¯¶ù×Ôºl¹ÚŸđù×߈Ù½›·ÔÁ½Øº÷$ẳÜ·ĂÙ«‡“Íjñ»«‡“Íj‡ÇªÚùׯăà÷ˆ©ÇÙÚÁ½ׯ¡ÁÓ€½Ôºëö₫®¶Èƒ×Üáê“ù×8¤‡˜‡ƒv¾8¤‡×ÑÄëÑØËÇ¡ÇƠÏÅå̉ ơèÅÙÚ„ÇơÔ½ÏÄ̉Å +Ñ»·ÔïÚëöùæïçñÄä̉¿ÿǪ¼ä̉Ù½ÏÅÁĂǽñÖƒvÙ½¯ÈëÚÍƠ¿‰ƒvù×£äÑÄëÙơ›¾€ÇøÖƒv§Ó­ÄăˆŸ;k“½ù×­v«âÅ›Úï½½€ÏÔ•îŸÅ§Ôÿ’½«‡“ÍjĐæ›¾ă‰ưÀ‚v©ơê×¾ó™‰kß [ïSûØÈÙgÉ̉çÚ›·Ô¯ÈÎÅ´ÅgÛǯÈáçÛÄÓéê·Ô…¿‰̀Ă™ÁÖ‡¼7µØÑĂÛÄÓÛ«‚ ½9½Ô±»«‡“Íj»‡Žëöä̉‰¿IÛ«‚ ½9áØÅƒvŸÖ£X³ØÏÅ«Óçô«»á ÿ¯¶¶ÛÚñß̀¬H«‡“Íjù׺§à…àÙÚÿ¯¶“¹ƯN»Ư¥ÆƯÓ ©‡¥2ßëMÚ¾±»ó|‹Ç­Ô߈ÚÁ¼‡9ÔXï³2¹ÚÍË)éÛ9¥µ†±»ÏÔ˜‰j̃ZîSƒvÏÔ‰¿I–¶›vçô÷ÁµØÑÓ‘Ûμ +ăˆŸ;Û«‚ ½9™‰kß [ïSƒ×ÙÚÁĂ¼¸)›¾×܇ñ5á ÍƠƒÇ»ÏÔ«‡“Íj™‰kß [ïSºñÚ×¾£Ç߈‘—ăˆŸ;kù×߈ÍƠ×¾ÛÚ”¥Ç­Ráê—ÓñÖöƒ¾‘Ù½«dÿ9¥‡±»¢ä™‰kß [ïSÛ׺ø×Ù½¶Ỗˆá ½ø¼—»¿ºóÅIÑUµØ¹Ú–»ؽ÷‡™‰kß [ïSăà½áêøêÍÇ₫Ú™‰kß [ïSÅÔ“ÆÙڨ؃½ÏÅƠ‹ÇƒvÛ«‚ ½9ÁĂµÜ©È«Ó‡Œ¡È©ƠÍË)éÛ9¥ĂÙ«‡“ÍjÁƯ£X×Ú©¼ơÔ§Ø‹ÓÛ«‚ ½9Ï|½Ø‹È½ăˆŸ·‡‘×8ç«dử­Ô߈ÏÅóÂăˆŸÇÖ½€ëöù×¼ÉÙŸĂÿ¢°»Ûô³zñ×ëöơê߈¾ÅăàÙÊÛ«‚ ½9ƒv¹•ÚÇé·ëöñÓ§ô£»íêôê×Ơƒvÿ¯¶å»̣Çø×íÆÑÓ߈ßÁùêÛ«‚ ½9ă»ăˆŸ;ÅØ߈›¾ƒvÏÅ‹Çùê÷đ±»ëöùôËÓÈÛ«‚ ½9½î»ª¼߈½—»¹Úùô‡ºù×Û«‚ ½9á ±¿Ưº—³(«ôöǹÚÏĶÔëöăơ‡ÏÔñÖ¢ƠÁĂÆÁÉÀ¹ßqƺ +Ç‘Ü߈Ù½áêÙÚ½«‡“Íjơ!£äÿÚÓ÷Ú“º߈ÜÔơÔù׫¢G½¹›¾—×ïƯ¯×¹ÇオءÔÁĂå̉ ăˆŸ¢ôƠÚ¤ˆ\0޵Û麶ÈÅØÍB®öăˆŸ;ƠÚ›́ ËûÏÔåÖëƠUßÄÙµ‹ŸØï»·È߈öá ±ëØÑÄëÓº¼9¥‡½ëöưˆñàÓˆ•=‘ÅØóPª»ĂƠöÿ§…Ơ߈9¥‡£Ư‚Û«‚ ½9ăˆŸ÷‡ƠÿÇ­—¡ƯôçÚ±»ăˆŸ«‡“Íj•ŒÿÚµØÅØ߈ÿÚÙÅë™ôﻇ9™‰kß [ïSɽ€ÍÄ©Øơ…ßхԳ›ƠơÅÛ«‚ ½9áêÑæ±˜‰j̃ZîSÚª‚ +¼9Û×À½̃%áö±)·Ó ¥0«ÓÛ«‚ ½9ăˆŸ;ÛÀöÙ½Á×™‰kß [ïS¶Å¿‰ơêÿÇ—ˆ›¾±»ƒ¾‘çàêưÀ©Øä̉߈áºăˆŸ;kÛ«‚ ½9“¦Ùפˆ\0}߈¹ÚÛ«‚ ½9Á̉Ç̉§ÔƠÄØ±»©Óщ¸ÚëÓ§ÓÛÀÁÙËljØÜް¿ªÔÍÓ£ÇƠĵر»™‰kß [ïSáÛăơŽûèÈ8Ưºáêôê³½€ÅØ™‰kß [ïSÁÅØÍÓ»Ó˜‰j̃ZîSơê«dÆÁƯ¹Á½ÛƯ“¹ƯN£äóӹءÔăˆŸ;ÙÚµØñÄ®×́%ÄØŒê*ª›¹ÎÅ߈ß»û£Ç…ÔŸÈ«‡“Íj­îÙŒë*«Ó'÷Á¶…»—ˆ¹æÛܘ‰j̃ZîSÅØ©ÈµÛ¹ÚăˆŸÏÅ}Û«‚ ½9ÏÄï»߈퇱½·̣߈×Ă·‡‘×8ç∳ÈñÚ°¿‰’ÏÅÙŒë*«í·½ưÀË̉½æÔ ½ÙÅë±»÷Á›Ú‡º‹ÇÏű»½Û׫ÔËƠ9¥‡™‹Èƒ9¥‡±»¸½ù×ÅÖăˆŸăˆŸ;ù×ÿÚ½̉Å™‡íơ½̉•“Ơ‚×—¶ù×™‰kß [ïSµÏ«‡“ÍjÏ̉¤ˆ\0ÙÚ»ˆĂºăˆŸÚÀ±»÷ˆ¡ÔåÁ³ºó…ÛëöăˆŸ;ÍÇÙ̉’—¶ÔXßÁÙ½ñơ»¥‰ÍL…±»ÙÚƠºm×ÜÁ¡º£äÙ½½»Áƒù™‰kß [ïSùÚñŸ}ÙÚ¿Üå̉ êç +éºÍÓÀ½Ù׳àơÔ½±»µ!ÁƯͽÔXùê‘ȽĂÙ«Ú½÷Á‡5«‡“ÍjĂ߈™‰kß [ïSÛ«‚ ½9‘àÙŒë*«½™‰kß [ïS¹Å÷Á8 ¤‡ ×ù×äÏÔÿ¼ÑĂ׿8·‡‘×8çñÓÁ½Ÿ}ÉÀÎÅÙ½›·Ô™‰kß [ïS₫™‰kß [ïS·Ôï³2Ûá=Ù½‘—ŸéÓƒvÑÄë߈ÑçÍƠơÔå̉ ÁĂĂö«‡“ÍjÏÔÁ½ŽÚºÛ«‚ ½9™‡µa›¾¶##ơÛơ9±Û«‚ ½9¹ÚóÑѦ·§D Á̉÷‡ù¾ƒvÍË)éÛ9¥öÁÔχ̀ÓăˆŸ;ÏÅÏÔ™‰kß [ïSû(Ϻ©Ó¾ƯºÏű»í—Gù× Û¡ÛÚª‚ +¼9…n³×ØŒê*ªÑÓÇÖ…ƠÏÔËǃˆÛ«‚ ½9È÷«ÔóÔ¶Ôª‡*’*̀j*ÑÄë¥ÂÙŒë*«“ºµØß»ûƒ¾‘ëÚôسÈ߈Ѷ¾™́Ư ¹Ú±½ưÁ³ÆĂĂÏÔŸÅ“ÈÏÔ¡Ô—¾ßÄÙÑÓÿÚÏ̉ƒàëöµ‰½€©¾ÖÓß»ûŃ‹Ç÷ÁÑÓÛ«‚ ½9ʹ ½‡ºăˆŸÏÔåàÙÚï™±»ÎÅïƠµØ«‡“Íj8¤‡½€›Ú™‡§ôÇÖ¬́ƒ×Å»ƠàØăˆŸơê¶ơÔƒ‡Ư₫‡À‡€è/Ö:ëö±»ÿÚÅù×ëö•Ó­ÖÁƯ¸£Úª‚ +¼9ơĂåÓÓÅËÉ9­vÙÚíê¾Ø°»Ó·Ô›¾÷¼%÷Áö½ ¾ßÇĂ™‰kß [ïSƒơ½đ¹˜ ÖÔ†6¦jŽùê¶Å›v™Ô™Ø™Ô±»ăˆŸ;ÓÔßÄÙù×ÁƯ€¾½È¾«‡“ÍjÏÅơêÙÚéÓó§Ô߈ó±»¹»߈ù×ÁĂ¥Û©ØơÔ…Ç¼Ă©ù×ƠưÀ½ÊÈ9«·3uUï»’àÿ›¾“º«‡“ÍjºñÚưÀ¡̃ÖÓÍ_ù×ơêăưăù×Û«‚ ½9Ư‰ù$«‡“ÍjưĂ¿À™†¥âÏÅ›Ûí᛾ëöÛ«‚ ½9ăˆŸûÖ̉Å™‰kß [ïSÛ«‚ ½9Ù½½ÔåÇÇĂÙ«ºï»ÅØ«¼÷‡å̉ ½ô‘àáØ‹ÇÅ“ƠÏÔÏÔ¾¶ÅÂÖ«‡“Íj¡È›¾ôïù×ƠĂº¿àŽÓ؉ӿ́ÏÔÅÓǺăˆŸ;Ù½‡ºù×™‰kß [ïS̀Ê)èÛ8¤ÙÚă)Ư ÿ$ß»ûÜú§Ô»ÎÅƠ¡ÔÁĂ³ưÀÏÅ™ø¡Ôƒ»ÀƯÔX߈߈«·3uUđÁƠ“߈Ưºëöë°»Ûח؇Ǘ¶ñÓ©‡¥2ßëMƒƠXÛºÏÅ¥‹Á̉߈‡ÚÓµ§Ô‰y£Ô±»©‡¥2ßëM‹Û̀¬HơÔßÄÙ¹ÚàÑÄëù×®ØñÚăˆŸ;ß»û·Ó ¥0¶ÅôăˆŸ;¯¾³¾×ƠºØÔ™‰kß [ïS˜ÁăơÏ̉Ă³ÈăÁ¹Ú»yĂĂ ›­±àéMÍÇăˆŸàêÏ̉ƒÔÇÓÏÄψ™‡œÁơÔ”÷ÁíÆ›¾½½º߈Ñ·%Ï̉¡·’Å£ØÑØ—¦߈ÙăˆŸ;‘ÓÛÆơÄéÚáÚ߈ăˆŸ;ƒv飋ǵ‰ÛÀ«³ÑÄ‹Çêö½½ăˆŸÏı°ù×8¤‡×ơèň½¼£Ç̣×¾©ÇưÀâˆÑÓÈù×ÁƯ Ơç¯È¥‰ÍL…“Ơ߈µĂ±»ưÀ÷Áëö”(‡…Û«‚ ½9Ö¾đÖf½ ĂÓ߈ƠÅÓˆ•=‘ñÓ“¹ƯN“ÈơêơĂ‚½«ÔÏÔÏš۫ڵء؇ù×߈±»±»ÿ¯¶‡Ç³z¥‰ÍL…›¶éÇÉÛƠÿ×…ÇŽ¯Û©&çôÏÔơÔÍË)éÛ9¥©‡¥2ßëM₫©Ó†º§à¥ÓñÚùê·‡‘×8ç¡Ô‚vÁƯ߈÷÷‡ñ5ûØé1«»8¤‡Ö©‡¥2ßëM±»í—GÛ«‚ ½9Í·ÆßÖÁJ«Úëö±»ÅØ™‰kß [ïSơꇫ»ÙÚÑÄëçÆ߈߈ƒvăˆŸ;¹ÚñÖÇßù×½Ô«Ñù×Û«‚ ½9ÑØ‰¿IƒṽˆY¿‰ÍÄßÚÍÄå̉ ÛöÛ™×ûØỞ§ØơêªÚÿÚóơêŸèÅÔ½ô«»Äôăê9¥‡×±»§ÔƠï³2ÙÚÿN°»…ôÍƠß»ûµØØÅ꽫‡“ÍjÛÄÓϼÛ«‚ ½9¯¾Û«‚ ½9µ†ÿ¯¶áíÚ©¼ÑÄëưÀ±»£öçÚÏ̉ù×ÓÔ›¾âà­Ö¡ÔÅÓ¿‰ÍU½ƒ±»̣Ç­ÅÅØ߈½ôÑÓÄÔ³Óº‘ơßÄÙŽÁ¯±”ﺡÈ߈Û«‚ ½9«ÈŒ¾ÓØïư‡±ù1Ë¿ă¡È¿ôïÚ釃ֽĂ×ܽôßÁÇØ‡ăƠܧԉ¿I߈Óˆ•=‘ëö¯Óù×Û«‚ ½9ăêÛ¬˜‰j̃ZîSÍË)éÛ9¥©Ó±»»½Ûº…Ơă*ưÀăŸ¯´ăˆŸ›¾ÙÚ/߈ÉĂÛÀƒv«%½€×¾ÙÚÛ«‚ ½9¥‰ÍL…Û«‚ ½9¯ÆÏÔ˜‰j̃ZîSơÛÙÚ·‹÷Áô“Èχ߈÷Á óÂëöÿÛưßÑÓÛÄÓº¥ÖÙ½ùêƒvưÚ̀Ó¿‰å»Ù€˜‡ùAù×Ư$ëÀáὕŒỞăˆŸ;×Ăû–ºÛ«‚ ½9Û«‚ ½9ÏÔëö½«»§ÔÛºÙÚăóçô‡çÚÛ«‚ ½9«Ô‘àçºÏÍӹڀ뱻º¾½‚“ÈÅÔÏÔ™‡ª‡’̀j߈ÏÔؽù×ñcéê߈μ¬Ôùו值¼ëöÁ̃ƒ×߈¡ÔÁ©‡¥2ßëMƒv߈ÅÓ«&¼ơ½ƒv½ÔĹڙ‰kß [ïSĂÙđÖßÏ©¼óôѦ¥º‹Ç«‡“Íj±»°¿ÁÙóÇÏÔƒv¿ØÑĂÈ ơûùןÄ9¥‡ÏÔÆùד¹ƯNÅÓÏÄ•Œ§Ø˜êè䫇“ÍjËÓ¡Ó«Ôë×ñÚÅÄĂ9¥‡ÁĂ«‡“Íj§ÓœÁ +Û«‚ ½9ùêÅ´#¢»«‡“Íj¿ôÇ»Áï‡Áơ§â½Ă«ºưÀµ†¡°±»«‡“Íj₫$àÄ ùדƠ›¾©À§Ô߈³Ơº×$Û«‚ ½9Á̃±»«‡“Íjö¡ÛéÓÙ×›¾Ư³¼éơĐĂÉơÔÏ̉8¤‡™‰kß [ïS½£ÔëöÄ–¿‰Ÿ}̉ƽ•Èû›Á剿I9¥‡×ăˆŸ;k¦ÈĂ‹½±ëØÏÔµañÆçôÎÅăˆŸ”ưÀÅÓĂyÙô×Ơ™Ô×ƠÛ×ÏÔá ÙÚÙ××¾ăË—¶߈ơèÅ“Ơù×™‰kß [ïSÛºרÛ׽ث‡“Íj«‡“Íj÷ß÷ÁŸ}³ºó×ĂÁÚĂĂđ¤ˆ\0åĂψÏÔÉqÛÄÓ†Œº½ĂºƒÖ™‰kß [ïS…»ù׉ÁµĂ¸ÚôêóÂÏÔñÓÙŒë*«á꿉™‰kß [ïS“Ơơê£@ëÓÍË)éÛ9¥×$ß»û«‡“Íj™×å̉ ߈ç½ưÀ«‡“ÍjÛ«‚ ½9ơÔ%麙‡½ñ¥Æ‡щăˆŸͼưÀÓºÏÅù×éÜá$º÷å5Ó‘Æ߈ÁĂÙ½ÆÜ‹Ü¹ưÀƒØĂÈ—¾ƒ¾‘º±»•Âù×÷‡ƒv«»É̉å̉ ƒv±ÔéêĂºñÚ˱ƒÁ̉8¤‡×߈ˆ½‰¿I“ƠƯ×Ù½‡Ú߈ÍÓ¥Ó¡Û¥ÛµØôëöÛ«‚ ½9ÈĂ •ŒđØ™‰kß [ïS•Œщá ߈Ü̉ÅÓ¿‰Ï̉ëƠU—¶ÏÔ¡Ô釺ؕŒù¿ùשƠƯÓ éÓùê…ÛÙÚ×¾ؼ<ÑØëÖ́–G߈­¾Ù̉߈纫‡“Íj¹Ù²¡ÛƯÓ «‡“Íj‚¾́Æß“½³È‡Ú×¾³b”Â!ÍƠùêÏÔ·¼Í7º½‹Ü¸à¹Ú÷Úƒˆ™‰kß [ïSÏÔđ½£ ¨¥ƯăˆŸ;“Ơ¼Á ÏÔÏÄù×Ù-Úª‚ +¼9›Úö°»§ỖŒÚ,§Û«‚ ½9¥º—‡̃ºµØ“ñÔÍ߈™‰kß [ïS«&Ó̉ß»û³àƒ×ÖÉ6ñÓƒÔÛÛ«‚ ½9¯ÈÛ«‚ ½9ÿÚ­ù«â±Ù»g—»âˆ:ÙÚ™‰kß [ïS±»‡#߈ÛÀ™‰kß [ïS«ÔÔƒØÙÚ™‰kß [ïSÛ«‚ ½9¶¡È‰ØƒÖ¦Ó§ôÅØ¡»£Ç«‡“Íj›vÿÛ‡«·3uUÔXºâˆ;ïƠ½øê‚vù×ă¶¥‹»yëöÙŒë*«ÛÚ«Ñëö±½½Ôùêù×éÓù×Åô™Ôíꙉkß [ïSô«‡“Íj©Èơ‡µØ£»¡È±»Ï̉ᇽ°»ÙÚÅĂ9¥‡ñÖ÷‡•Œ¹Ú³Ü¿‰ïiăˆŸ×Ơ߈‹̉ơÔÙ½«»óÄÑÓÏ}«âÛ«‚ ½9™‰kß [ïS°» ¡ÈßÄÙŃ—»ÅØÛºó±»¼ù×ÅÁÅØƒˆÖƒÔÏ”…àÇØưÀ™‰kß [ïSèÓÿ¯¶ÆÓƒv»̉¸ÚîÅÛÀ·¼Í7×ỢÔíØÙ½.»ô±»Û«‚ ½9ؽÅăˆŸ;ù×Ù½ÁĂ¿‰»ºăˆŸçºϼûÓ߈™‡߈ưÀíÆĂº¯ÈÎÅ›¾́ؽZ»Ăá Ơ9¥‡½Íï½€ƒˆ±»ñ¾ÏÄ«‡“ÍjË¿—¶íÖăˆŸ½ÏÔϺ™‡Ă‘®ÑÓỞÛ«‚ ½9ƒˆå̉ ±»ÏÔơÔÿÛ̃ˆÛ«‚ ½9éÓÿÚ¯Ô߈ơÄ„áù̃“Ʊ»ưÀơû„øµØÏÔù×ñÚóÇĐÓöŸá±»ñÓ±»«‡“Íj9¥‡‹Ç‹ÇĂÙƒvë ™‡±‡¬ÖÏÅúォ‡“Íj¯¼çô¿ô¡ÁÏ̉¼«‡“Íj½ĂĂ©̃ Ă9¥‡ÁƯüÆ™Óÿ§±»·Ô±”ơê·‡‘×8ç8¤‡ơº‰ÔÏÔ‹ÈÏÔÀ¹®Gø³¹ơèÅăˆŸ;™ô½ô³b«‡“Íjဇº¾ôÎÅ߈ÙÚ™‰kß [ïSå̉ ăÁ’ÛĂÙ½·Ô߈Çô‡Ó‹ÈóÂöÍÄĂȃv€º·Û™‰kß [ïSÏÅï³2ÏÔ¹ÚÛ±¿ÁĂÁÙ×Ù½ÙÚ߈߈¿‰ÏÔ©Çă½ÑÓ™‡ÑÄëĂÙÛ«‚ ½9™‡·§D á ·Ô׿8ÿ¼©Ç™‰kß [ïSơêÛ«‚ ½9±»±»¡Ô™‰kß [ïS9¥‡„½ +çÚ߈™ëéå­ô8¤‡Ç»ơêăˆŸ;kÀ¹§Ó½ñÖÙÚ½ÔŸÅ›¡™Ó—‡Ç∿Øàç»ÔơêÁÛŸÅÅØ߈ÁÓăơïÚỞ¦Ô«äơĂÁ¹ÏÄêÚÖ ¥Á›·Ô¯.Ÿµăà˹ËÉ9ÍÓăˆŸÍ«»ÛÄÓ™ëéå°»߈Ûº±»›Ú߈ơ؇ŒÇ"߈ƒv«‡“ÍjĂ뢡ԥ¼ăÁưÀ½àĂçÚĂÊ™ô«‡“Íj¡Á·ÜËÛٽ­ľœ‡‚v±»™‰kß [ïSáÛ¢XÅÔƒˆ̃ÄØëö±́ÙÓơêÙŒë*«éº/9¥‡ÛÄÓăơ©Ü·‡‘×8çÅØºyôؽë|ëÓ«‡“Íj©‡¥2ßëM9¥‡½͘³ØÂÙ±%ưÀ»Øæ'³ ‹ÇơèÅ—™ẳËÇơêÿÚ¿½µ†µÛ«‚ ½9¥ÛËƠù×—¶ÙÚºù×û̉ÙŒë*«ơê¤÷Áù晇¹ƒÿÚơ$ÏÔؽÙ½ÏÄÿ¯¶¤ÆÛÚ½Ǹ©Ü—بÈ÷ˆéµß›¾ÙÅë½€ÙÚ™‰kß [ïS™ëéåƒv¾±»ÏÔÓº«ÔÍË)éÛ9¥Ÿ\ŸĂăˆŸĂõØÏ̉₫ÔA•Çg«»¡ÔÏÅ¿:ơÉÁ«Ô匿NÎÔáöĂÙ·‡‘×8ç¥Â÷ÁÏÅÁÓ›¾©ÓÓÅëöƠƒóÓù×ëö±”«‡“ÍjñÓÇᓺôÔüÀÔ)ס˜êèäù×Ñó˜‡đÆơÔ«‡“Íj«‡“ÍjêöÊÇÛº°»ÓÅµØø×—¶ƒvív£ØÇÖóדƠĂÙƒÖÚª‚ +¼9ÿÚ߈ù×£Ó¡ÁĂ£Ø‡ºÁ̉×ÜăˆŸ;Ž‚ØÁ¼ÁƯù×±)‘ƺ؃¾‘$ù×߈Ù½©‡¥2ßëM¥Ø›¾ù×°»ăˆŸƒvù×Û×ÿ¯¶½Ü™‰kß [ïSÚ½½±»çôùê«ëöªÚëö‡ŒçôÍË)éÛ9¥ăêó¹ù×ơê·ÅƒvăˆŸ;÷Úª‡’̀j„ÚĂº¼›¾ăˆŸ«·3uUç̉·‡‘×8çͼ—¶‹Üù×ÿÛYÁ¹ƒvÚÀé¾ÑØ«‡“Íj÷$予™‰kß [ïS±»™Ó¾Ä₫¹¶‹ÇÉ̉¹£©ØƠơê¹ÈưÀưÀÖÆï½åƒv©Ç½­ˆÏÔµ°ÆØÅô…¢íJÚ«‡“Íj³ç½—ŒívŸÖéºÛ«‚ ½9¥ˆ]1%í‡ộùºÁ‡é/×:·‡‘×8ççÚÿÚ̃ˆ€ºÁ½ù×µø™µà°»ƠçøÏÔºù×ù×ăˆŸùץƂvËÉ9™Áñ¾ù×·¼Í7áêù×Û¾ר–Ó˜Á “Ơ™‰kß [ïS£Ø¹ÚÁ̉Û«‚ ½9߈³ºó¬ÄÛ«‚ ½9¥ˆ]1¯ÛÏŹåĂ¡ëö¿‰¿́ó+ăà‡º™‡óÂÍË)éÛ9¥‡ÜÀÏ!퀺›‡›«‡“Íj™‰kß [ïSĂÙ›¾™‰kß [ïSö¦ô ‡•ºÿ¯¶¨¼ơÄÍƠ±»ÊÓ²ÂăˆŸ;k̃ˆơêëöçÚ•Öƒà¶ºăˆŸ;ÑÓăÇíÑÓ«‡“ÍjÙÚ•—ÏÅÅÔ˜‰j̃ZîSÔĂ¼·‹ͺËƠù׫‡“Íj«Ô«‡“ÍjǽƒvăˆŸñÓͪÆÙ½ø×±Ă«‡“Íj€ƠéềÓĂĂ©‡¥2ßëM¤Æ¼Ü½ÏÔçÚ™‰kß [ïSÛ«‚ ½9×ƠæÚÙ½«‡“Íj̀Ó Û׿8ÍÜ߈߈Ơ±¿ËÓ†Œ²—»²Â9¥‡ơêưÀ£»ß»ûÀÁ ËƠăà߈ưÀưˆüÀĂÙù×öœ‰¾IïºÏÅ¿½—¶8¤‡½€©Ü“ÈÍÏ߈߈‚vÏÅ̉ÅÏƯ­¾á=«‡“ÍjÛÇ«‡“ÍjÍË)éÛ9¥Û«‚ ½9ÍÓăˆŸ;ºÛ×Û×™‰kß [ïS˜êèäô©Ø±»ẩ Ëû—»ĂÙÙ½Íăvø¾åÁéôÏÔÉï³2¡ơê¨Ç«÷›¶é­ÄÅÓ©‡¥2ßëM‡xÑÓŒ&åÁ›¾Ǻ«‡“Íj´a˜‰j̃ZîS«‡“ÍjÙ×Ñæö«âỞ·‡‘×8罀󷇑×8ç±»…ÏÄÙ½ª‡’̀jÇ¡ƠÁƯ‰¿IÏÅơÔƠ¾G¹Á·¼Í7ϼ‚vƠ¾G›ÛôÏ̉¼¡ƠÛ«‚ ½9«‡“Íjß»û߈±»ï½÷ٵؓƠ߈ƯĂÙ©ß™‡¥̃º½ôÑÄëÛÀúÖ +·‡‘×8çø×·‡‘×8çð¿ĂƠ}À̉§ßä̉ÁÅÏ—»±»éºÅÔăà¿Øͼ‡ñ5¼›¾‹Ü—ˆÏÔ·‡‘×8窇’̀jăơÏáÅà™‰kß [ïS󰻢ǎ·‡‘×8ç‹È¿»­ÄïÁ´†¢ä×$Ăٽٽ‹Çăà9¥‡×¯G‹øµaŸ}ăˆŸ;™Á߈₫ö‰¿Ívƒv̉ÍÄèêµÈç*Ăôëöñ×ÓÁÓÅ÷Ô÷ÁÛ«‚ ½9ăꆌºÿ¯¶Ö$µØơꥈ]1“ÆÏÔ¡ÈÓ̉«‡“Íjï½µÛÛÄÓ°»çĂ߈ƒÿÛ¿ëưˆçº«‡“ÍjăˆŸ;ÚǹÚçôµẴƯù‡»Å÷Ù“ƠĂáƠáêù¿¹àº½Û«‚ ½9óÔ嘧Ơù×ÏÄÙÚ‰¿IÛ«‚ ½9Á̉Ï̉©‡¥2ßëMÀĂ-çÚ­¾×$%ÍË)éÛ9¥×Ăѹ Úª‚ +¼9©Øµ‰ăÁ$éêׯÙÚáÓ½‹Ç™Á»Á¬Ä›¾“߈9¥‡ÍË)éÛ9¥#«ÔĂŸÈ¥ˆ]1±»ǼѶºÅÔÙ½8¤‡¡Áă½‰Û“¹ƯN™‰kß [ïS½Ôơé½çˆº µØ«‡“Íj™‰kß [ïSÛ«‚ ½9ñ׿º™‰kß [ïS½ÅÔù¿½€Ăëö¯à«‡“ÍjƯÓ ÿ¯¶Ž“¹ÜN‹Èö߈§Ô߈±»‹Ü9¥‡±»½Û«‚ ½9ÇÓ·‡‘×8çđ£ä癉kß [ïS÷ÚÏÅçÚƒˆËÉ9¹ÚÿÂĂÛưÀĐ߈߈Á‡é/×:­ͼù××Ă™‰kß [ïS½ôµ̀¿ô›¾ÉĂ˜‰j̃ZîSÅÓ‘{’È›¾Û«‚ ½9¬ÄÀ +½ÑÓ߈“Æá¤́ơ·ÅÓØåˆ¹ÚÛ×ÓšȥµЉƒv‡xí–Gåº́Á§Óƒv”ÇĂ¿Åơèž¿́±»ß»ûư“ØÚÏ̉ù×ÎÓÅÿÚù×—ÓƒvÏÚª‚ +¼9‡ÇăˆŸ;±»Å–Ù½§Ôá Ù½ñÓÙÚÅØÎÔ™‡å̉ ±»ă´‹ÇÏÔÛ«‚ ½9·Ü§Ó™‰kß [ïSÑØÙ½Û×ơĸڱ»±ëØ÷ÁăˆŸÅôù× ¬°àèMÂÙĂĂâˆ:ƒvù×ÏÄơ꫇“Íj½/ÍơèÅ˹äÁ·‡‘×8燙׃¾‘ˆ±»±»«‡“ÍjÙڵص†ÙÚ˜ +ê +è +ä +¿ŸßƯÅÔ÷Ô©Ó•щÇÜơØÓÔĂô#ÓØĐÓÏÅƠºmç¹Ú麩º•ŒÏÔåÁƒvö߈áăˆŸ®‚$ívÛÀ—Ö™Á…ŒöñÓáöƯÓ ÷ÁỞóƒv«Úº«‡“Íjϼ‡j÷ˆăơ±»đÖźíÆ›¡Ù™‰kß [ïS‹ÇĽ…ô߈¹à…±éÓñ×ăÇíëö߈±»ËÉ9ç9¥‡½ăˆŸ9¥‡×ÓÆăˆŸ±Á‚vÍÓÙÚñÓ·̀ÄÛ«‚ ½9ÿ¯¶ÿ¯¶ÓØ£0÷ÁÏÔ÷ˆƒÖΙ‡߈µØ¹ÚÑÓơÔÙ½¹Ú‘§¿ß½éÚ­½¼£߈Û«‚ ½9¯uŽ©°«Ôå̉ ƒv›¶éÙ½·Ô™‡±»«Ñï»í‡£Ø™Ó߈…»»ç«‡“Íj™ëéåÖ¾8ŸÅûÓĂÙỔĂèĂÙ”Œ«»ÏÔÏŇÚ̃ˆù×™‡߈©‡¥2ßëMï½±»™‰kß [ïSƒ¾‘«‡“Íj¾B¡Èăà¡ÔëöÛ«‚ ½9Åä£äƒ³›¾«‡“ÍjÓÆơúëöÛ«‚ ½9Á¹Û«‚ ½9߈¬¾ €¾¥Ü™‡¹ƯÀ÷‡ưÀù×ƠXƠ¼™‰kß [ïSψåƠù×ÎÔª¶2tTƠć×퇅‡Ù½âºÛ€™‰kß [ïSẨÛ«‚ ½9™‰kß [ïSùêăÁ™‰kß [ïSƒv“ƠµØ¡ÓÛ׫‡“ÍjÙ̀«‡“Íj±»¹à¯¼ÑÓœĂͼë§y™‰kß [ïS”ÿÉ Û«‚ ½9¼ĂƠù׋ÇĂÙÏÔÅØ´À«·3uUơê÷ơÁƒˆ³ù׃ÖÑÓ₫º½ ÎŨÇíºÛ«‚ ½9¥Ü‹ÇÏÔ‡Ư«Ôåô“Ơ÷¥¹Úµa½ĂÙ‰Û¿Å¿½«Ññù×Ë¿ù×ÿÂù×ÅØ߈Ï̉µØ«»øê«‡“Íj…Ôçô߈ƒˆÂÙñĂ“€ÙÚâà傣䵉ưÀưÀö× ­ØÉ̉«·3uUß»û©Ø«»ơê×Ăû̉ƒÖ—¶ϺÚª‚ +¼9»ÈµÈÖ¶è±ôßâßÖéºñÙϼđƯÓ ÙŒë*«·ó›¾«ÔÁƯăêĂè9¥‡—»‡ºÙ½ăˆŸß»ûûÖͼ·‡‘×8ç­€Ú×éê—¶½àÂëöáê“Ơ“ƠÅôͽèêưjëöù×ù×ϹßÚ±¿ăˆŸ;ăˆŸ;k÷‡©‡¥2ßëM“È»ØÚª‚ +¼9©±¿ÛÄӯ׷Ô߈¢ÆưÀÏÔ™‰kß [ïS©‡¥2ßëMĂÏÔ—¶ĂÙéºÏÅăˆŸăˆŸ±»‹ÜëÂáêû‡ÇµØ˜Á߈ÁæÔX»Đ«ÚưÀ«Û­Ä™‰kß [ïS¥Æ†Ç™‰kß [ïSÛ«‚ ½9ɹÛ«‚ ½9ăˆŸ—ô÷à÷‡”Ö¥ØÙÚÑÄ멇¥2ßëM©ÇÁ̉™‡‘½ó̉¼ívÏ̉«‡“ÍjÛ«‚ ½9±»ñÓÙÅëµØ«‡“Íj»½óÇĂ™‰kß [ïSưÀ½ĐĂÈßÖ¡Ô÷ˆ½ù×›Û«‚ ½9ß„߈ĂÙÅØ«»ăˆŸ;k™ÁĂĂÇôµØÏÅùëÁ̉Û«‚ ½9«‡“Íj±»™×‹Ç±Ư߈ñ~ƠXÛ«‚ ½9Á¼Û«‚ ½9á ËÉ9ƒ×ª¶2tTóǃvÅ·‡‘×8çÛ«‚ ½9±»ÏÔăˆŸÍË)éÛ9¥ù××ÜÙ̉Û«‚ ½9ÓÓë¼›¾̉Å ©ÓăáǼÓë9¥‡Û«‚ ½9ăƠ™ơÏÅÏÅ…Ơ¯È·‡‘×8çă»ÏÅăơ£Ø™‰kß [ïSăơñÚ“ÆöÁÅØ߈À‡€è/Ö:½ÈÑÓÓÓ™ơƒv ÛºéçƒÔ˜êèäơêÄ–ÇÖívÇĂÙƠ߈ĂÙ°»ù×щÊÇé‡Ù½åƇºíêµaơê×¾Ù½˜‰j̃ZîS«‡“ÍjƒˆÑÄë… ÁÏÅÁóÔ›‰˜‰j̃ZîSƒØÏ̉µaÉ̉ùêø¿«‡“Íj‡Û¶§ÆÓ¾á ›¾ï‡ơÿ¯¶μ©‡¥2ßëMù×¶ËÖ ËûËÉ9ÅÄ«‡“Íj½µØ“Û©‡¥2ßëM±»ÑÓƒvŸ»ÙƠĂƠ×À£‡ÑÓG½¹ÔX±»ÁÁ½¹à‘Ó¹Ú¥ÁĽ›¾½ÏÅËÇ׿8ùׯǙôµØ½øô½̃ˆơê½ĂÙÍÇ߈ƠÂÙ߈ÁĂ߈ÿ¯¶®Ö Ë¿ÇÖ©¼Úª‚ +¼9Û×đă×× —ӡȱ»ÈĂ߈ù×é‰ñ5ñ·âÁ +ù‡·ôăº³(ÍÇàêơê¡Ô¹ÁÅÄË̉Û«‚ ½9»áÛׯăˆŸ;k·Å9¥‡×°»ØƠ†“ºÏÄ“Ûăà©Ó×ƠƠÇÖ¹Ú¶  ƒàÏÅ÷Úü‡°ø1Ơ¾GÛºܯ¡Á½‘‹Ù÷Áƒ¾‘ÓØ¼€ ÏÅÁ…ØÏÅ•½ǽëÚÍäùêăơ‹Çư“ƒ¾‘È9¥‡³ºóơĂù׫ԯ¼ö”÷‡ưÀƒvµØÜÍ±ëØ³×«â¶™‡ͼóÇ™‡Ă߈öÓÆéºÏÅ»ØÁƯÛº9¥‡…ÖÙ¾ª-Û«‚ ½9ÁƯ«‡“Íjù×ūԩØÛ«‚ ½9›Ú¿ØăơáêƠ߈ưÀ¢äÏÔ›¾ơÔ߈ªÚơ!Ù×™ÁÁ¹ÖÆăêăˆŸ™‡µØ¡ÁĂÏÔ“È¡Ûɇ̀¼çÚ̃ˆéê߈£äÙÚ§ÔÁÓ³eÁƯƒvÍÓơĂ»ØÏÅÉ·‡‘×8ç‹Ç»‹£ä÷ÁÖÆ ăàËÓÊ +¯q†ŒªÚƒvù׃vÈĂß»û‹ÇöÁçÚ™ÓÛÀ±»ƒv±»™‰kß [ïSëöÁ¼ưÀׯÙ½¤ˆ\0µØñïĂ¼“ƠW™‰kß [ïS½ô×ܻ؆ǵØá ’¹ÜNĂº‹ÜÏ̉ËÖĂÙ•%ÁÚơêÏÅÁ½ŒĂá «‡“Íj«Ñ›ç±»¿«‡“ÍjÙÚùꙉkß [ïS¯¾9¥‡ ƠÏ̉ă“Ơù×ưÀÏÔÓØ̉Å9¥‡å̉ ½Ô×Ơ†7§jáëöĂô×Ûß»ûÛ¹€ºøơ³ºóƠ¿‰ÏÅ9¥‡º§ÔơèÅù×ϺïÜÏÅù×ù×ƠÏű»É̉×Ơß»ûĂ¼©‡¥2ßëMḯÏķ܇[ơèÅ⻋ĂÙ™‰kß [ïS©‡¥2ßëMù×ß„ÍÓËÇù×—¶‹¶ù×Ù½ˆăø|ăˆŸ;ưÀ«‡“Íj®È£Ç¡Û½ô“È«‡“Íj߈ËƠŸ\­¿ùê‹Ù™‰kß [ïSĂØ‹ÁÛ×™‰kß [ïSଧÓĂ¹ÓØ‡Œ™ëéåƒÖ×¾Ƽ9¥‡ÿ¯¶íÅÛ«‚ ½9àƠÛÔăˆŸå̉ ·ô½ëöºå̉ —»ôĂơº™Ó³(ƠưÀ½†ºëö¢ÇÙÚÙ½߈Ù½öŸÖï‡ÅÓñÓù×çÚå̉ ¡ÁưÀƒêö•ŒÏÅ•Œ«‡“ÍjÙÜ¿¹Û«‚ ½9£Ø›¾ùÚǼ™‰kß [ïS¹Ú÷¼©ÇÏÅíº¿Å߈³ÖóÔ‡èḯ˜êè䕌§Ôơêív½Ă­ÄÍƯ™‡ÓÅßf™‰kß [ïS«»9¥‡߈ÜßÚƯÓ ç'Á½ƒv󹵨 Ù +ÿÂÅÁÑÓ߈¡ÔÇÖ“Æ…Œ¥ˆ]1¹̃Ó̉±½°»‘œ—¶éº–ŒÙ½Åà§Ơù×ùæ°»I¹ÚÁĂƒv₫®¶Ư‰¿ô˜Ơ*ĂºÀ«»ơê±ó¯ ÿ‡x«‡“ÍjöÁ­ÖÏŰ¿ñ‡óÇÙ½¯‰¯0¹̃ÙÚøôÿÚíi”ŒÑӻؾ—¦¥¼ù꫇“Íj…»ÑÄë©ÏÔ±”ưÀÁ½Ó¼8 +¤‡ +Ö¡Ôư“‹¦³ÂµØ×ƠÿÚÓº½¹ơêѶË¿ÙÚăˆŸ;áÎ¡Èƒ×¶ÓØù×ÁăHÛ«‚ ½9Ưw×¾8·Å™‰kß [ïS…Ø™‰kß [ïSăˆŸ;•ŒËÉ9̃ÁĂÙåˆëÔ÷ˆ±»߈±»å­¹ÚƒƠ‚˜–ˆº™‹ƒ½9¥‡÷Á—¾߈Û×í—G¾·Ô•Œ߈¡ÔÍÓ×£»½ëöÿÚăˆŸ₫Ç» ơèÅÑ·å×ăˆŸÛ¹…Ô±»¶vưÀ¹Ú´™Ó™ëé噉kß [ïSïô¹Úơ…¡Á±»ÀĂ߈ן¹©Ø÷ÙªºƠÛ«‚ ½9ÿ¯¶•Œëö·ô¿½ĂȅعڹÁ†»ĂÙÂÙÏÔÁĂưÀÑľ™‰kß [ïS“º¹gÛ«‚ ½9“Æá$ÏÔß½߈‡—»ö÷‡ƒÍÄëöà °½ơÄ•Èû›¯È¹ÁÓÅÁÓÓ²Ѷ«÷ÅÓëöăˆŸ‹Ç£äÏÓöÁëö™‰kß [ïS¼€“¹ƯN¥Æăº«ÑăˆŸ;këö×ƠóÂĂÙ»½Î̉¹Ú“ö•½·‡‘×8çÛ×ÙÚ¼‰yăˆŸ;ÖÆ‰;Ù½·Ø¦ÈÔí—G­ÄƒÖµØ‹Ü₫¼½€¯ÛÑ!½ëöăˆŸ;¦Ó«‡“ÍjơêÙÚ Êû«ÚƒvÏÅ›vù¿ô߈·Ô¹Ú«Ô9¥‡×‡¢Ç™‰kß [ïS¥ÂßɾÅÔ˜‰j̃ZîSÛÀƠ©ÓÙ½ƒvÿ$Û«‚ ½9À‡€è/Ö:«‡“ÍjÏԌ֣ԣ–·Ôù¿·ÔÅØăêù×·‡‘×8çëÓûØ×Ơ—¶«‡“Íj«‡“Íj©Ó“…ŒE ÑÓŸ}™‰kß [ïSøô߈“Èơêö›¾›¾±)Ù̉›¾ÅØ÷‡ª‡’̀jÿ¯¶ÁƯÛ«‚ ½9ù×ñÖù×ËƠĂèỞ´ØËǾ ÷ÁÛ«‚ ½9«‡“Íjù×óÔÅØ°½ñלÁ¾±¿ƒvßÄÙÙ×ÅØƠ¾GƠęӷÂỞơèŻŷÔ×ÀÛºĂÙÍćº¢÷ ߈®¾߈›Û°êØëöÙ½™‰kß [ïSăˆŸ;kíÆĂ½€̃ˆơÔ“Ơ9¥‡÷Á·Å£äË¿ª»Óºöéê·Å®Æ«‡“ÍjÇûĂ¼ù×·‡‘×8çơêÓ̉æ½Ù½ß™߈êÔØÓÉ̉óÂàÀ©Çëö—¿ưÀå̉ ¾ÅÄ®ưˆ‚ØßÄÙ™‰kß [ïS¶Ôë₫Óƒv—¾ëö߈Ơ´ƒÖÏÅÅØöÙŒë*«çÚ§ÍăˆŸé‰ñ5ñ·ëö½»ÊỞƠ¼™‡±Ô«Ø®¾ר½ĂßÄÙ¤Û›¡ƒ³à÷Á±»×ĂÏÔÙ½ù¿‘Æ™ÔÙ܇º¥ˆ]1Û¹âơéÓâˆ:kóǰ¿¡îƒv™ëéåÍË)éÛ9¥ËƠ¡Ôôêá ßÖÚ½ƒˆùêĂÈǼ₫Úùæ±»ù×±»ÏÔÿÚÅÔ·‹Ó¾Ûº™ĂÙׯ´Ü±»±»ѶÛ«‚ ½9«‡“Íj™‰kß [ïS·Ô¦Æ‘Û‰Ûׯ“÷Ü9¥‡8¤‡±»ƒv‹ÇÿÚù×Ù×ù×Û«‚ ½9ëöëöÿ¯¶©ÓƠÄçỔ͇Ï̉ÅÓö³ù¿‹©ƒvÓÆÓ¢Ûù×Ûˆï³2¹ÚôØ߈Û«‚ ½9ߌÛ,́J̣¯§ôĂƠơêí$›ÚƠù×µØóÔ¯ÛÛ×û¼€ÙÚ—¾ưÀÁ̉ûÙ“¹ƯN±»Óă“ÛÁ̉™‰kß [ïS½ZÏůÈÍĹڳ½ΠçÚÑæ£ØăÇíºÁ̉8¤‡×ƯºËǃԼ‡ưÀ߈ĂÙ‘±öÁÑÄëÙשÓÍăv•×™‰kß [ïSÅÓ£ØăˆŸ;º̉ ¥ØĂÙͺĂÙƒv¥Ç¡Ô½£ÓµØñ֒Ȱ»÷‡«·3uU»‹ëö̃ˆ̀½½¼€ăˆŸ;™‡߈ƒù×Û«‚ ½9ùêÇ»á ù×ăˆŸíJ™‰kß [ïS™‹ÙŒë*«±»ĂÙØƠ­‰ă»ÅØ“ÇñÚ±»ó€ŒÔWñÓ­ïÙÚ™‰kß [ïSÿÄưÀÏÔ×¾™×‡“ăÛ‰™ộ"ỞĐÓßÖÓÅÂÙ›¾» ÿ§Û«‚ ½9«Óª¼5ËÇ÷ÁƒvùןùßÄÙµaÿÚÙŒë*«½ØÁ½ÿÛ©‡¥2ßëM‹Üƒˆ™ôñÚÙơ±»™'¡ÔÏ̉½€ÎÔ•̃ôËÖ‡ºëÖ«‡“ÍjÛÚ釵ԙ‰kß [ïSîôăà“Ơ¡Ô¸Úơ$å̉ ÁĂçÚéÓÏÔvß»û±»ëöÅØ߈áƠ·ÔÑÓ¡ÁÛ«‚ ½9ß»û˜‰j̃ZîSß»ûÙŒë*«¯bĂÙ«ÔÓÔ¯Ó¸ÁçÚ̉ŧÉĂ÷‡ù×̉ÅƠăˆŸ;À¹[Û«‚ ½9ÁÚ—¶½ÓÅù×ăˆŸÿÚƯÓ %Ư‰ÅعÚûƯÏ̉™‰kß [ïS퇻³‚vÀ½ưˆ¾Û«‚ ½9íÖÇï²2ù׆Œ°»ó¶¢ÈµØô¶è·Å߈ƒvßÖĂºÛăù×™‰kß [ïS©Ó‹”•Èû›§Ô¡ØéÓ—Óƒv’Æî½¾ÅƯÓ ­Ä«‡“Íj߈‡¥ˆ]1™ØÀ½›¾·ÔöÔ›§ÔßÄÙÙ½—Ó½¯Åè•ÚÛ«‚ ½9¡Á›¶é˜êèä߈ù×ר´†Û«‚ ½9É߈·Ó ¥0ăˆŸ;óº¹ÚÂÖ«‡“ÍjÓỖˆ÷ˆù×§ÔÏÔ؇Î9„ï»ÇÖëï»˱©‡¥2ßëM¡%ÿÚ½߈ù×­¿³í߈ƒvÛÄÓË8­Ä³ÈñÖö‡ÇÁÔºlù×±»ï½£»ÿÛƯ‰§Ô…ôç'±»Ơ·Ô‹ÇĂÙ߈ÆüÓÓºÛ«‚ ½9º«‡“ÍjÑÄëỞƠÉ̉°ê؃vÛÄÓ±»¹Ú߈½µ‰ïºơê÷Á“½€²ÂÇšԫ‡“Íj±»í‡κ|щçº߈ÏÅ­¾†×ÛÄÓÏỒÓ™‰kß [ïSÏÔñÚáêó°ívù×߈óǽëöϹăàđÇÍË)éÛ9¥ƠXơ꽎ÙÚÍæÁ׳ºóµØƠXëö•'í‡ĂÙÏÔÏÔƒvơêÛ«‚ ½9ÿÚÙŸ\ûÓƯÓ Œ¾ÀÛµØÙ½ׯÙ̉·‡‘×8ç¯È˜ơø×£Ô…Û̉ˆ”=©ÓỔ…Â÷$Û«‚ ½9…úŸô±»¿»íغßÚÚª‚ +¼9åĂ¹ ß%¡ÈÏ̉æº ÷êă¹±»â½́vëöû(ƒ»»Øß»û™‰kß [ïSíÚéÓø× +ơº¡âχ«‡“ÍjéÓƒv•Èû›˜ ê è ä ÑÓ¹"Íï߈±¿ƒˆ“‘Û«‚ ½9ƠºmăˆŸ«»ÅØ«ÑÛ«‚ ½9™Ó£Ø±Æ×Ü™ëéåû(¿»Ù½ù׆ŒưÀëö¹àÅáÛº´•ơèÅĂÓ÷ÅØíØơĂ™ÓáÂï½ăˆŸ;ù׃vÙ߈±ëØµăˆŸù×ĂÙ›‰«‡“ÍjĂ“ƠÙ½ÿ¯¶ĂÈ̀Ê)èÛ8¤—ˆùׯßóÂÛ¾ƒvÛ«‚ ½9…Ơ©ÓơêÛê…ø™‰kß [ïS©‡¥2ßëMÇÖĂăˆŸ;k—Óù×›¶éù×ÎÄ̃ˆïÁ‹Ùùê§Ø‡ßÂÙ±»ùÜÛׇº½9¥‡½Ăùëù׋ÈĂ٢䩼¶­Ø¸»«»±»“ÛëöµÎ­R‡Œ«Ô‹ÇûƠÏÔØƠ™‰kß [ïS¨º ÁĂ¾Å‚v™‰kß [ïS™ÔÇÖÁ̉­RÙ½Û«‚ ½9ƒvùש’ÅÀ£»™‰kß [ïS«·3uUÙŒë*«î½ƒÏÅÙÚ¿ºå̉ 9¥‡­Ä¯¼߈«‡“ÍjçڷšԾμ™ëé塨¡ÈÛ«‚ ½9ƯÓ ÍÓÓËщ߈Ù½³ºó±ÈơÔ™‰kß [ïSíÆ•Çµ†ù×ƠÚ™‰kß [ïS“Ơ«‡“Íj×Ó›¹Ơܑư»±¿©ÇÙ½щ©±»ûÙÜ™ÁÏ̉“Ơ˜êèäÆçÚжÅØôÏÅ£»öÛ×щéÓ߈ÍÓ߈Ù½©Àù×™ºơê¹Ú߈¶ÅĐÄê²ÆÊŸùêëö‰¿I«ÔëöŸ½×¾ÉÏÄ̃ˆÓÅëö™Û˜‡öµØ™ÁÈ̉ ĂèƯ߈¥™Ø½Ø™ù׃ÖÁĂ÷‡·Å–ÓÙ׽؉ÛăˆŸ;ăˆŸ;¿1Û«‚ ½9¿‰Ù-›¾âơ¾Û«‚ ½9¹ÚÑØ¥‰ÍL…çÚö† ’½¾÷Á¹ÖÆÅÔÆ߈³„ÿ¯¶™‰kß [ïSÛ×9¥‡¯¾ËLJ櫇“Íjµ†µØÅÓ¼ÜÛ«‚ ½9Ǽă»½«Ôù×±»Óº“ƠÖÆ›¾ŽëÚ‡Ç%¿‰Ổ÷ÁæÚÛ™ƒØ¡È­ÄçÚ€—¶ËÇ€ºóÇù×Ù½Ưßï»ù׆ºÙ#Ç©‡¥2ßëM¾ÏÔ‰¿I±»è×—»ëö‡Ç¡Èù¿àꇺ¹Ú©‡¥2ßëM‡Ç߈ÏÔÛº±»º’ÿN•%9¥‡Ăº÷Á̀½¯È½ÔỞÿ×¼Ï̉ƒØôê÷ÏÔå̉ êöÏÔ¾ÏÔàĂ ·‡‘×8çÇ"Æ«‡“Íj™‡ø×÷¶₫®¶¿Å“ƠËƠµØ„'çỤ́à¯Ơíº§ÔÚ±»™‰kß [ïS¾ÅØׯ߈à=•Èû›ăº­ÄơéăˆŸ;k™‰kß [ïS«‡“Íj˜Á¿ßù×óÇ߈̣Ư߈™‰kß [ïSö߈ï³2ׯÁƯÅô·Ø³È²Ø߈Ù½óÇͼơæÁ£ù×á ƯÓ ³Èíâƒvß»û‰øù×ĂÙçڷũǙÁ»ô˜Á½€éº©º‡¹»€ºăºÛ«‚ ½9Û«‚ ½9ª‡’̀j˜‰j̃ZîSÛ«‚ ½9·¼Í7ßÁÑÓ–ˆĂºßÄÙ¥Û§Ôùơ¼ +ÿ¯¶›ÚÛ«‚ ½9߈ùêÁĂ™‡ûØׯ“Ơ¿¹9¥‡ưÀÁơ÷ÙÏŵØăˆŸ;ÙÚÓºù¿Éæ½ô±»ϼ¿‰±¿¶èÖÆ©‡¥2ßëMçÚ•Ñđ߈û£ä¦ÓơêÔÅâˆÙÚóœܳºóÛÄÓ¸Úø›¶éó|©‡¥2ßëMºÈÿ¯¶%£ØÓÂ߈ưÀñÁ¶ù×ß»û–Ó±»ïi߈ߌÛ,Ë%ù×™‘ÙÅëưÀùꙉkß [ïS̀ɦôẳÅÄ·‡‘×8ç¿ô°»±»ÂÙÙ̉á ‡ŒºăˆŸÎÅûÇÖéÓÛ«‚ ½9›¾ç̉×¾·‡‘×8ç·Ü·Ó ¥0·‡‘×8çË¿ÚÄ̉ÿÇÁ¹œÜƒÖă½€ßÚ«‡“Íj«‡“Íj»Å¡Á—¶«‡“Íj…ÖíÖ˜‰j̃ZîSÿ¯¶ûÓÛ«‚ ½9ÛöƠª¶2tTÎÅ߈»ˆ¯Ü÷îÎÔ“ÆÛ«‚ ½9´'ơÔ±¿¢Ø ÈÛ±»Ơuÿڛ±»½߈Ç̉£ä ÈÙÓăà£ÓùêăˆŸ;ÏÔ™Áâ»ÙÚï½½Ô‰½ăˆŸ;ưˆ‚u½|›Ú»̉ÏÔ$ÏÔƒ¾‘•{ÏÔ©ĂỞ«ÔÁĂ—»àêóÇéJé‰Ó5“gesÁſٽ̣×匿NÓ߈gׯÏ̉¡ÓñăˆŸ«»™‰kß [ïS8¤‡ÏŋǃvĂĂ›¡¡Ô±Ô·‹öĂÙ°»ºëÓÏÔ™à·Å»ÁëöñÓƒv™‰kß [ïSÓÓß»ûív߈ÅØ™‰kß [ïS߈̀Ê)èÛ8¤ÿ¯¶Û«‚ ½9ƠŸÅưÀ9¥‡§ô“ƠßÁ¯È–¶µØë$—¶·ºóå̉ ¿ß·‡‘×8ç¶Û›¾Æ±”ëö£ÈÉÙ»ÁÏÛǼ±»ËƠƒv½Øùëƒ×ù×ÔκĐÄêƠ½ÑÅ«»Đ°»ñֵظÚưÀơèźØÍÄ‹ÇÏÅ…Ö‡© Ơ»ˆ·Ô‹Ü½™‰kß [ïSÓ¼ö·Ô«‡“Íjù×ù×ăˆŸ;­ÄĂÙµØ9¥‡«‡“ÍjÏÅ÷ÁïÂ߈߈¡ß÷¨ƠÛ«‚ ½9ƒˆøê߈ÍË)éÛ9¥«‡“Íj«‡“Íj…»ÿۻؽ€«‡“ÍjƯÓ µØơÔׯ…âơêÿÂǵÏ̉ëöÇÖ­¾‹Ç¤ˆ\0ÁƯ‹Ç¿ß¡ÁÛ«‚ ½9ÅÄß»ûÍË)éÛ9¥ƠXƒ½ÍÇá=̀Ó™‰kß [ïS5¡Ư߈ÿÚĐĂăˆŸ;kù¿ù׉嶉‡߈¨bß»ûÁ̉̃¹߈G½¹ƠXÎ̉«‡“ÍjßÚĂĂÙ½»ÅŸÈ™‰kß [ïSöÁưÀƒvưÀưÀǼùêÏÔ©Ó·ÔµØÎÔÛ«‚ ½9Á¼»ÅÛ«‚ ½9÷Ú£ÇéÚơÔ߈‹Ơ©Ó%¾Ï̉ƒÔÏÔù׫·3uU™‰kß [ïS»̃ˆ÷ÁµØ¼Ïí£ÇíÖ¯÷Á¼€µØ›ÚßÚíºÁÏÔÏÅ—»ĂÙ›·Ô…ô™‰kß [ïSˆ½€Åد˜‰j̃ZîSñÚ§Ô½€¼€¥ºœÁ¿»ÏÔ¡Á¯€¿óͲ•¡È¢äÅ»éÚÏÅ«‡“ÍjרÏÅ÷ÁÙÚ«ÔµØáÛË%ƒñ±»¬ØíÂ߈ÅÓ·ÔØÅêñÓ9¥‡Ở‹È©‡¥2ßëM·ÅĂ“Æ9¥‡ÏÔËƠ«dỞÏÔ±»¯¼ëÚï»—¶߈¹ÁÏ̉ëÚµßϹÅ–ˆô« ©ƒ»5²¹ÑĂŸÅ…¾Ơ‰ù׺“Ơ©ƠÍÇËÇ÷Á¬¾ψăˆŸ;ù×\߈ÓØÿ¯¶å̉ ăˆŸ;Û«‚ ½9·ÔÅØ­v߈Û«‚ ½9¿»Û™ÏԵس›¶é©ÜáêÅØ×Ü™Áÿ¯¶±»ï½9¥‡¹Ú·‡‘×8ç§Ó°½ÛºçÚÏÅ߈ûºĂôù׃—»щ±»§ôË̉£@ÑÄëÛ«‚ ½9¯öƠƒÖÛ«‚ ½9ơêí—G±‘™ÁÛ«‚ ½9êơ Ă·ºÎÅ ™‰kß [ïSÙ·Ø™ÔËÛƠß»ûá=³È³Øÿ¯¶ƒvÍßÚª‚ +¼9¿ºÙ½ÙÚóÂù×½ÏÅù×ù׸Úá­Ö¶‡Ö8櫇“ÍjëöđÏÔÛ«‚ ½9›¾á Ù×…ØÓØºăˆŸËÉ9ˆƠ­Ä§ô¯ §ÀëöưÀ‹Ç‘·Ă(Û×ưÁ¹Ú…»µØï»ëÔ›¾¿ô½€©‡¥2ßëM©‡¥2ßëMƒØƒvŸ}¬Ô·¼Í7ùׇŒÁƯ÷Á¿*™»ĂºÛ×·Ô«ÔÙ½ÏÔÛ«‚ ½9½Ă±»¿ëÑ“߈¦ô¿ßÑçÚÑÓ©Óóº‹Ç¾±»Å±‡ơÔáƒv¡»°»ơêñÖ·Å·Ø«‡“Íjë «‡“Íj›¾›ÛơêôµØ’ÈăˆŸ;÷Áö½«ÚƯº“×Úª‚ +¼9©€“Æ©‡¥2ßëMµ­¹Ú¹Úø×±»ÅÉMµ̃—»Ù½ÙÓăơ›¾óÔôêêöǽÏÔ±»Û«‚ ½9ßÄÙƠøê«‡“Íj«‡“Íjƒˆ9¥‡8¤‡%‰¿I½Ăơê¹Ú™‰kß [ïSµ†©ºͼÙ×½±»…Çùë½È½Ù½—¶™‰kß [ïSÛđ£‡₫$Ù½÷‡™ÔưÀ×Á§{ơèÅÙŒë*«‰ÛñÓơÔ«‡“ÍjÏÔ«‡“ÍjăˆŸª ¨ƒº5Ï̉ßÄÙÛÀ«‡“Íj߈ôù׬¿½€ù×Ű»ơÔÏÏÅơèÅ™‰kß [ïSÍÓØ×ÂÙÏÔ¥Á¥ÆăˆŸƒˆ¡ÛÍÄ™‰kß [ïSí—G½•Èû››·Ô™‰kß [ïSɱ»߈›ÛùëÍË)éÛ9¥µØñÚ9¥‡Ѷº½ĂÙª»ôØá¬¹à™‡°»Û«‚ ½9«bå×ÔXơêÍBÇØÁ¹©ÓÛ«‚ ½9™‡ƒv9¥‡Û«‚ ½9Ó¿‰Û×®Gø•ÜŸ}•Œ߈/½ƯÓ ¥ˆ]1™‰kß [ïSïÅ÷Á¿ß¥ˆ]1¿‰ÍÓ¡»¯ÈÎÚÛ«‚ ½9«Ñш©Ơ׿8́–G‡™‰kß [ïSÍĂ߈ĂÈ©¼™‰kß [ïSăˆŸ×¾8Ù½±»Ă÷Á¼Ø™Ø«âëöăˆŸÿ§߈щÈ™‡̃%±¿¯ÓÏÔù×߈ÿÛùêöƠÏŵØÍË)éÛ9¥áêÂé*ơèÅ›¶éá †(‘ȲØù×ù×ơÔÏÔ±»±¿ƒ¾‘ÿ¯¶ª÷ñçÚăˆŸ;ăˆŸ¾ĂÙ߈9¥‡Ăپؙ‰kß [ïSĐà ɀÄßÖ¿Ô«‡“Íj¿‰èÓ ÈÉ̉ơĽ£Ç÷ÁÓˆ™‰kß [ïS¹Ư‡Çß»ûƠĂ 9¥‡±»§„ßÄÙ“Ơ›¾÷ơÏŭŹÔȉ¿I©Ó…ÇÙÚÑÓö߈Ăè¹ÚÙ½߈ù×ưÀÎơù×å̉ ߈ÄÀ™‰kß [ïSñÚăˆŸù׫ÔíÆ₫Ç®¶Ç‚×›ÚÁ×¾ư‡±ù1ñÚÛ᫇“ÍjÑĂÁŸĂ¯G‹øù×½›ÚăˆŸ¹…öÿ·‡‘×8ç«Ô±»₫¥ØăàùæÿÚÏÔœ‰¾I߈đÓ®ÏŃÔùêÛ«‚ ½9ƒv’¹ÜNëö±»߈¡Û‡™‰kß [ïS°»ơ$ާôëö±Ôë½ë³ÆơèÅŸ¿Í÷ÿÚ9¥‡¾ÓÆÍƠơêñÚëöËÉ9à í꫇“Íj·Ô°»¿‰÷ˆÚº +ÖÆ±»±»ĐÄê¾—»±œƒv߈ï³2Û«‚ ½9ÑÄëׯÏŃ´³ºó™‰kß [ïS¹Ú8 ¤‡ Öù×ä̉¥Øíê±»½Å#ÁÜ­:ÏÔ¹Ú«»ÓÙ›¾̃ÄØ±»ÏÔÅtÔX +›đ߈«Ô8¤‡ÙÚƠu9¥‡×…Ø«ÔăˆŸ™‰kß [ïS½ƯØăˆŸ­È¹Úù×î²2å̉ ÿ¯¶·ÜÓØµØ‡×ѶÓÔ³¹Ă¾øêÛ×9¥‡é‡³ 9¥‡áÛ»Åÿ¯¶¨È½ƠáƠ¿‰ÙÚû¬¡Ư»é©¼°¿ +©‡¥2ßëMĂŸ\Ï̉߈ÓØëÓ¨ØçÚ¹̃ëöëöÁƯ½ÜÏÔ¼È߈ÆăƯăˆŸ߈ăˆŸ;±»ÿ§ÍƠéÚ匿N÷Á¹âÛ«‚ ½9…Ô÷ÁĂ¹Ú³1³“ÆÛ«‚ ½9Ù½ÏÔç/¯¼à ÚÀ˜êèä₫8®¶8½ÙµØ½€”Èú™‡³ô¨‡¤2€̃êL³ÈƠƒˆ½¿Å× Ù׫Óëö²Æ–‡ÚßÄÙÙÓÿÚêöçñ“÷Ú÷ÁƒØ©‡¥2ßëMƒˆÏÔ¯¾©¼«ƒvÇփ؇ÜûÓ‰Ú‡«·3uU›¶é̃çưÀêă½¨ƠóÇăˆŸÙÚßÄÙ—Ó³ÇơÔ­½¼ù×䌾N)»ÔíÖ“¹ƯN»½€³£ØÏÔÛÀ9¥‡Ö¹ñÓºy÷Ă¼«·3uUÛ«‚ ½9ơêù×ù×™‰kß [ïS¡Ç÷ÁđÖÍÓ¡ơÑÓëö›¶éĂƠÏæÅôG½¹½›¾Î“ƠȽưÀ¿¡ÅØÏÔå̉ ÷Á¹Úå̉ §ÔÑÓÙ½ßÄÙÂÎÛ«‚ ½9Ù½ăˆŸ;k«d³¾Ơļ÷ˆ…Â߈ñÚÄ‘ơ߈ÏÅ›ÛûÓÛ«‚ ½9ñ×Á‡àª‡’̀j™‰kß [ïS©‡¥2ßëM«‡“Íjƒvù×ÑרÓÅË̉×¾ă»½‡áê±»ÁñÚ†Œº¶ÙÚçÚ£»Ó½Ù½ëÏÔ­ØÇô£äù×™‰kß [ïS8¤‡©¼½̃«‡“Íj¶ÿ¯¶±»³¼¸)ÅØ½ƒû̉óׇñ5™‰kß [ïS»ØßÚ½êÂÏÔר±»óÄïƠƠ±½±¿ơÔĂº°»9¥‡ơêÏÅ£äÙ½ÑÅ¿‰Úª‚ +¼9ÑÓͼŸÖĂĂ‹ÜëöÛ«‚ ½9‰¾±”ÏŰ½߈₫&§ÓºĂÙùס«±»ßÄÙØÚôúăàiÔÅ‹ÙÁÖÏÄÏÄíÖŒ¾­‚vă÷—¾±»·ô—¶ˆơºÙÚÏ´ÁĂƯơÅôöÆ­ó¾ƯÓ ¥Ÿ“¹ƯNÛ»÷«‡“ÍjÙÅëÏÚë¾߈ù×éÚƠ›¾ù×ËÖׯßÁáñ™‰kß [ïSÛ«‚ ½9å̉ ÷Á₫®¶ÙÚ܇ǘ‡‡º±ëØëÔívÏÔ›Áå̉ ‡ÚáꙇóÇÁ½߈ÍË)éÛ9¥߈ÍÓôĂă»̃» +ú +ù×ÁƯß»û9¥‡ÓÔ™‰kß [ïSÏÅ™‰kß [ïSù–ËÉ9ĂÙƒv¾߈»Ó«ÔÛ«‚ ½9‡ß»û™‰kß [ïS·‡‘×8çăˆŸ€ºɇ¯‰¯0ºËÑÓ“Æÿ¯¶߈.ÇÖ«‡“ÍjƒvưÀ°»ƠÂÙ¾«ÔÀĂÑÄë³Â©ºñÓÿÚ9¥‡§Ôưˆ¼ Ç%•ŒƒˆßÚƯÓ ƒvåĂ„ö•×ÅÓÏԣܱ¿ưÀ¡È±ÈăˆŸçôÿ[ßÚñÚ߈ÿ§¾¥"ăˆŸ×ÜÛ«‚ ½9ÏÅĂëÚ‹Ù×Ơ¦Æß»û™‰kß [ïSƒÖ¹ÚÎÔ›¾ÁÙ‰¿I‡Ûª»¯ÈăˆŸ¹ÚºŸ}ÏÅÚª‚ +¼9ÍÄßÄÙØµÛơ»ÅӃر»£d¹Áû¼™‰kß [ïS»Ø™‰kß [ïS¿½߈­ÄÛ«‚ ½9麽ÏÄö±»‹ÙÇÖå̉ ߈ăˆŸ;æô«d­v«¼Êù¿ưÀǼ©ƠÙŒë*«ưẠ̀ԧƽÙÚÛ×±»ï‡$ƒvψÑDö·½÷Ù§°»ÑĂëöŽ9¥‡—¶¯ƒßͯ¥'=U#QK¯Â“¼÷Á›¾ëö§ÓëÊç'±»8¤‡×™‰kß [ïS÷Áµaï½¥ˆ]1ƒv®‰®0ÏP«»ù×¹àéÚ©‡¥2ßëMí‡ÏÔ×ĐÓ£Â鼿‰߈çÚß»ûăơ·‡‘×8çÏÅÚª‚ +¼9¼Ù̉ÀĂ›¾°»›ÚÙ½ÍÓÿÚ±»öûÓÿÚ½ö·Ó ¥0±»§ÓĂÈø×›¾ơÔ§ÔÏ̉±»Ù×ó­ū‡“Íj÷‡±»¼Øé×Ë̉ß»û±ÔƠX÷ÁĂȽÑÄëÛ«‚ ½9±»÷¼›¶éăà˜‰j̃ZîSù׃‡ºƠƠîÙÚËƠ·̃߈—»«‡“Íjù×ö˹ƯºüÀ®×ơÔÙ½ăˆŸ“½…ÖƒÖ¥ÓßÖ‚(Åëöûù׿Úơ»Ûơԙ‰kß [ïS߈›ÔÜ™Ø߈½ƠX½™Ï˜Ô‰¿IĂÙ½€߈›¾×¿8ëÓëÂíêψéơƠùê³ØÍÓăˆŸ;k—ÓÙÚôêåĂ·Å¿º·‡‘×8çå̉ ƒv›¾9¥‡Ó̉¡Á½¾ƒv₫Ú¯G‹ø¿ß¦ºu¡È±»ÉƬ¾ù×ÿ¯¶¡È½Ă¥Ø̀¤߈½‡ÙÚ÷Á›Ú±¿‡Úêö ëʇ’½œÂ±»êöù×åĂ¹àÿ¯¶éÓ“Ơщ›¾́v…ÖÇ»‹Ü¡Ô¹Ú‡ÛÍË)éÛ9¥ËÉ9÷ÁÏÔ›¹߈œ‡«‡“Íjö™‰kß [ïSÜÓ ß»û»Øùê×Ơ†7§j³÷Áù¿±»ÏÔÙÚÓº¼ÿ‡›¾‰Ô™‰kß [ïS—¾Û«‚ ½9µ‰ÏÔ§Ôơ»߈ÏÔ™‰kß [ïS9¥‡×9¥‡ï̉å¼ ¡Ô÷ÚưÀ§È½€™Øó¿ØÖÆăê“È¿‰8¤‡Ç©ÇÑÓ‡(ơêöÁ ¿‰¾•%«‡“ÍjÑÄëÇÅÓÅĐæ߈¤ÛăÜÙ½ßÖÛ×÷Á̉÷ ¾ử¿ÅåƠí„̃!Î!ÍB×Ơ†7§jµØơºÁ¹Û×±»£Ü¡ÙÚÙÓÑÅÿÚÛ«‚ ½9ăˆŸ;—Ó˜‰j̃ZîS«‡“ÍjëöûÓ̃ÄØù×å̉ Žù××ÛÑĂơêù×½Ăù×߈¹Ú߈­ÖƠ½°»•Èû›ơê¡ÈÏŨØÍÓßÄÙ…äÁ‡é/×:߈Œu‡Úñùêÿ¯¶çôåÁº¿‰¡ÈĂÙ¯ƠÜøæăˆŸÏ̉ÜăˆŸè‰đ5đ¶ç½ÏÔơÄơêÛ½€ÙÅäצÿ­ÇﻼؠƠưÀ©Øăơ™‰kß [ïSóä̉™‰kß [ïS·§D ­ÄưÀÛ«‚ ½9¼Û«‚ ½9©¼§Ô»óÇ™‰kß [ïS«‡“ÍjµØív¿Å¦Ó¥ˆ]1ôê «‡“ÍjƯ÷‡ív߈ÏÔÛ«‚ ½9Û«‚ ½9«‡“ÍjÍƠ“Æ¥ˆ]1ĐĂƒÖÅàÛ«‚ ½9̀Ê)èÛ8¤ơÄỞÛסÛï³2±»ĂÙ§ÓËÖ—»ù×cׇºµ†ĂÙ¹Ú‡·ÔûÓƒv™Á•Œ×¼÷ÁÛôÏÚçÚÓíB½8¤‡ưÀ‡Ûøê½€߈¾ºÑæ߈¢È·‡‘×8ç·‡‘×8çº߈ÙŒë*«‡ø›¾߈½ÁĂ·Å£Ç»ßÛ«‚ ½9¨º °»Ă¼ß»ûăˆŸ;ÏÔ«Äà½$«‡“Íj¯ÈăˆŸ;÷$£XÓºÅØ Ơ¹ƒëơÔ÷Úƒˆ«½ÅĂăÔÚª‚ +¼9ǽχ¡ÁËÇ¡ăˆŸ;k߈±ÔăˆŸù×ÏÔËƠ™‰kß [ïSÅÓ¾„ø›¾ù×ÍÓù×áÅÏÔñÓƠÜ߈‚v‹ăª÷Á̉» ׇ‡ư2ñÖÍÄÚץ½Ôö±½‘gÅÓ•%߈Æ•×÷‡ƒvăà󫇓ÍjÔXªĂÁƯăˆŸ;k½€ùצôËÇÉs¯×«‡“Íj÷ÁƒvĂÙƒÀ߈¿àÏÅù×9¥‡×ù¾÷Ù¹Á÷‡ÛÍßÿÚ©Ơ‹Ù©Ü߈ºÏÅÙÚéêĂÙ«¼¡Ô¥º“ÇăˆŸ«‡“Íjß„­ÄÛÚưÀéJé‰Ó5“gesÁ؉j̃ZîSĂÚ™‡ßÚׯ߈¡Û±»©ÜÅÿ×ÙŒë*«Y­½¼±»ơÛƒØ߈ÏÅøêï½±»“Æ£ÈƯ¸£ưÀÅ»ßÄÙµØÙ½áꣻ·Å̃ˆ÷ÁöÁµØôê™Á¿z×$ÏÔÏÅÁ!·Ó ¥0ßƯ»ô‚Öƒˆ£äëÓÿ¯¶±ó„ڳ·ÔÇÓͰ»¡Èñ“¼™‰kß [ïSưÀÂÙÅØÿÚ§Ô½߈¯ÔÚª‚ +¼9ƒv«âùê„»›ÛĐÄêÙ½߈›ÔÛ«‚ ½9É̉ívÍÄ­ÖóÂƯ«Ôù×ÿÚăˆŸ;½̉ÛÄÓ™‡8¤‡ƠX·Ü‹Ü«Ñ‰ơĐø¡Ûù×ÏÔüÀ½È¹Ú±ëØѶÎ̉ùëăÁ‡Œ¹Úé×±”¾¹Ú‡Œ§ôáêÓÅļ€-ØßÁ˜‰ +j +̃ + + + +Z +îS +¡È™‡ù×ßÚùׯÈĂỔÎÅ«‡“Íj±»½Ø¡Ô¹Ú±»ôă½ÅÄѦ°»ăà߈«·3uU±)Û«‚ ½9ͼ˜‰j̃ZîS¹găàåñƯÏÔăˆŸ;köăˆŸ;kĂá å̉ ƯÓ ơĂÆŸĂ·Ó ¥0¿‰›¾ß»û™º½ƒÀ…¡ÔØ×ƒvű)¢ƯÏÔµÛ³ óÔÍăvœÂªÔ«ºËÇÛ«‚ ½9ư‡±ù1µ!—˜—¶ưÀÁÇ»½«‡“Íj«‡“Íj·‡‘×8çƒvçÚ¹Úă»Á³ºó«‡“ÍjÏŃv¦ÓÊñ±»ׯ߈Åœ·̉ ¤0»€߈ׯÏ(±»Å»Ù½ÀĂívÅnơÁ‡é/×:«‡“ÍjưÀĂ«‡“ÍjÄÄù×±»ƒvÙÚÏÅßÛôñÓ‹Ü·‡‘×8ççÚĂƠơ꿉ÙÚǽ·¼Í7×ƠËÉ9•Œ»¼‘€ö£ä«Ô·‡‘×8çåô¹ÚË¿™ÓëÅØƠ%ëöÙÚ¡Ûâà å̉ Û«‚ ½9©‡¥2ßëM™‰kß [ïSÅÓÄÓ ‚Û«‚ ½9…́vƠX² ĂÙùơËÉ9ưÀ¿‰ÓơÔèÓ߈ËÉ9ÁĂºÜ̉ɇëö§º°½™‰kß [ïS«Ô›¾ÏÔ߈ƒvˆƒvéê§ÓßÄÙ—¾«»óÔô›¾…Û±½½€½éÓóêÚÛ%Û«‚ ½9ù×¾ÁƯ·‡‘×8çû€ÙÚÇÖơèÅÑÓÑÓä̉ö÷Ùơê£ ù¿¥ˆ]1ÓÅæ̉¥ù׉¿I³Âºéê“Æ¡Ô¿‰å̃À½ƒˆíÆ¡¹Úđ÷½¹Ú™‰kß [ïS·Å߈9¥‡½€÷ÔÛÜÛ›¾ß»û±»Á̉çÚù×ó€*ñ½©‡¥2ßëMÛׇÇëöµØ±»êö·ÅÔơĂ«â¹ÚïƠ÷ÚăˆŸ;±»ù¿ªôÑÓÁßÄÙ›ÓăˆŸ®Ơ óơ‡é‡ù¿ÇùêÛÄÓ«‡“Íj÷Áơê߈ÿ–¾é‡œÜù×̃Á«‡“Íj½öÁívÅÓµÏÑÓ—¶ß„½ô¿Å½Ôù×±ÔÙ½ƒüÀ±Á¢ØÙ½‹É0â—»¾ÿÇ·§D ¬Ö©ÜµØ»½·ôƠ«‡“Íj±ÄÏÔÍăvµØùù×Á‡é/×:ú¶§ôưÀ°» +¾ß ¡Èé³̃ˆŸÄ•×ív¿à‚v߈ëö¿‰ơêù¿8¤‡×ëöçÚăˆŸ;ö«‡“Íj½ƒú(ÇרÄôƠX°¿…¸ĂÄ–çÚ‹Ó±»߈™‡ÅÓ“ÆßÄÙóÂ¸Ú ±»£Ç‡ŒóÔ™‰kß [ïSƯơ»ÈñÓÑÓå̉ ív¡…ÇĂÙÇÖơ…™‰kß [ïS—Óë¼ăˆŸ;ù꺫‡“ÍjµØÏÔÛ×̀Ê)èÛ8¤ÛÄÓ±»ít·‡‘×8çǺÛºßÄÙÏÔß»û™ÁơỞ‰Û̉º½ù׃ֱ»ŽÛ«‚ ½9Úª‚ +¼9Ơ·ÅÍB§ôƒˆëºß»ûưÀ¹ÚËÇ·‡‘×8ç½ÙÚỞÿÚï½ưÀ‡¡»öƒvǼÁ±»ƒv÷‡¦Ôù×Û«‚ ½9ÆĂ«‡“Íj«‡“ÍjÁÛ»ôÛÄÓăˆŸ9¥‡§ô¯×£äÛ«‚ ½9ÏŽËÇö˜È½‹©₫öëöÏŵÚơúÏÔƒÉÍĂ©‡¥2ßëM̉Á½Ư±ºÁÚÛ«‚ ½9³”ÏÅÏÔơ꫇“Íjß„º·äׯ™‡±»µØ±»ͽɇĂĂ/H™‡ù×ÿ¯¶—ˆ§Ô…ô‘́öăˆŸ;§ºơùå‹ÇY«‡“Íjù¿Ở«‡“ÍjµØÙ½߈”'ª»Û«‚ ½9äôÓØƒvÁƯÑÓÄÓú +—ÓÁôÜÓ ÙÚÛ«‚ ½9ÏÔ³×ĂºªÚÛÚăˆŸ;Ÿ}½èÓôÔ«Û«âƒv«‡“ÍjñÓ–¿ ăˆŸ;ơéëö³‡ÛµØÜ‡Œ¿¹Ú÷Á¡ÈăˆŸ;›Ơ½“ºÙ½÷‡“ƣǣԯ̣öëöƒvÏÅơêÉ̉Û«‚ ½9́$¿ØùץعÚË̉íÖÅăº‡߈Ù¾ÄÓ¡Û‡ñ5ëöÇÖù濉ÑÓ‡¾߈ÁƯ§º™‰kß [ïSµØÙÚ‡x—Û‡ŒăˆŸÍÓ÷ˆƯ‰öăˆŸ;Ư •&±»Á¼øê¹Úµa×ܩǔÈúáØ©‡¥2ßëM8¤‡×½½ÈÙ½ßÄÙ«ÔÛ«‚ ½9·¼Í7ù́«‡“Íj»Ù×ôpÿÚ•Ô˜‡µôÏÔË¿Ÿ\¡Ơ߈ư‡±ù1µØ™‰kß [ïSÆ«»Áëö‡Ú“Ơ±đ·#«‡“Íj›vÁƯéáƒvÄÔ±»±»ơê¹»›¾«‡“Íj¹Úù×ơèŃˆ™‡‡ÁƯ½Ç"½óÇ£ØÛ¶èƒú±»¡ÈÏ̉±ù×ĂăˆŸ;¡Ô«‡“ÍjÙ½–»ơêưÀ‘ÖºỞ©&×Ơ†7§j·ßöÏÅ߈½Û«‚ ½9«»áꇌëö«Ô±»Ë¿®GøÚÀÏÔ™‡åĂĂºÿ§Œ¿çÇÙ½Ïé½ëöƒv‹ª-ﻬֿ“ƒvÿ¯¶Ú×Û«‚ ½9ÏÅ«<×¾ùעǫÔÏÔ™‰kß [ïSñÁÛ«‚ ½9 Ç µØÿª¶2tT¥Ó¥Æƒ¾‘ÑÄë÷‡·Åëö«Ô±»ƠXÊÇÅÓØUöù×úØßÁ÷Á§ÆĽ±»½ù×ËÏ£Ø8¤‡…Ơù×—¶Åëö™‡ƠÄ“½$ÅÔ«Ô—ØÍƯ¿ßÁ§Æƒv߈ÊÖ°»ÉíƯÓ ÅÓ±»Ë·‡‘×8ç¡Ơ‹Ç‡Çó#Ư‰Ơı»ßÚÿ§¶Ù½½Ù×ÙÚÂÈ›Úù׋Üêöö‡Œÿ¯¶µØ›̃ŸÅ›‰ùê¯È·‡‘×8çµØăˆŸ;¥ÜÙŒë*«±»û̉߈ĂÓØ±»߈›¾Ù½‡Ç¸Ú…èíÅ›¾©Ç›Ă“â» ÛßăˆŸÓ̉™Ôư“ºØ«‡“Íj«‡“Íj‚½ +8¤‡Öáê‡ư÷Ïßáê›Û…ƠêößÄÙ߈™ëéåû'ö߈½÷Ú‘ ÿ§ÍÓĂºÛÀçÇŒĂÙƠ÷°»½á.ƒÔƠơÔŸ}í«ÔƠÙ€œÜÈé-߈ăˆŸ;ÀĂÛºơÔÏÔ‡ŒÅӣȋÈÛÄÓ‡º¹Ú¿øéÚëöƠX߈ƒ½߈“Ù½Û«‚ ½9׿8ÙÚÎë¼åÁÙ½ÅÚª‚ +¼9ơ$«‡“Íjµ.¥Ù‡–Œ©¾¼©Óÿ¯¶9¥‡§ôƒvÛ«‚ ½9÷ÁƒØ‡Éřԃ¾‘ßÄÙ…Ơȹƒv™‰kß [ïSêØƒÖơê¹Ú«·3uUû߈™Û›¾ä̉¼»k½߈±»₫$ñÓÏÅßÔͼëö”÷ív•ÜÙ½éêư‡±ù1¿‰øê±»­Ä˜‡“½ŸÅ·Ô¾ơºăê«d¹Úÿ×÷‡ëösêöÚª‚ +¼9ÿÛù××™‰kß [ïSåĂÿ.¡Èø¿Ä¸ó«dµØ߈ËÉ9ëöơêÏÄÓÆèơưÀù×½Ï̉ñƠ÷¨«ÔƒÔ߈µa˜êèạ̈×ơÔ“Ơ·‡‘×8ç˜êèä¡ƠÔĂÙù׸ÖĂĂÏÅ÷Á½€߈ơêƒv­ÖÓ¼ửûƠÀĂÛ«‚ ½9áĂÙ½ơèŶèöơÔ Ơͽ¿Ø³ƠçÀƒˆû̉¿‰º°»âº‡ºÿ¯¶¯¾ửµØ¾ƒÖù×ơÙÑÓƯˆ«‡“ÍjרósûØ×¾™‰kß [ïS¿‰…Ơ9¥‡ÑÓûƠÿ¯¶Ù³ñל·̉ ¤0߈ăÛ9¥‡×Ẳ¹ÚÙ½ù×ÁƯ™‰kß [ïS8¤‡íÆ»ØÏÅËÉ9ĂÙ±»ÓÆÏÔ·Ô·Ó ¥0·Å›¾±ƯăêËÉ9«Ñáê‰Û߈«!¿‰Û×½€ÿÚçÚ9¥‡ºØÚª‚ +¼9×Ơ†7§jĂù¾«Ô­ÖûØƯ‰¾ÇÖëö±»üÀĂÙ匿N±»µØçÚÅ–ÅÜÁëÓĂÖ9¥‡¼Ô¼ă»ƒÙ×°»«Ñç‚}ƒØƒvÎÔỞ¡Ô§Æ‹ÙÛ×¼€™ÛßÁ Ç щ•Œ¹ÚíêÙ½ăˆŸ;¿ôÛ«‚ ½9ơêĂÖÆ=ÛÀ£äÍƠ£äáêÅÓǺ÷Áܺ´a°»±»Û«‚ ½9ö£Ø¨¼ÙÚ‰Û¡ÈË¿ơÔ9¥‡£Ø©¡½½ù×̣¶±¿™‰kß [ïSˆ³ºóÏÔơÔ´öÁ÷Á÷Á˜êèäùׯÈçÚÍË)éÛ9¥ÏỖÎñÚ•Œ¿‰ơÔøêªÚ›ÏÅøê‹»¿ºÁ½½µ‰ù×ăˆŸö¸Ú¤ˆ\0¯ÏÔ©‡¥2ßëMÑÓ£äÆôÁ¹ÍË)éÛ9¥¥‰ÍL…ÏÅ•Èû›߈ơèÅ߈°»öÁ̉ĂÙëöÍÓÛ«‚ ½9Ù×ëö°»߈Ûºÿ£ӗß9¥‡¿Å­Ô—¶¡Ư9¥‡¥Ưï×8¤‡×ÿ¯¶…Ơ™‰kß [ïS£ÇÛ«‚ ½99¥‡½ôº“åĂùê‚ϼÛ«‚ ½9©Ó™ëéåßÁ¡Ô½€ƒv“Èéͺ‹ÇÁܽĂÙÏÔ¿Ùû¼¹Áî²2—¶ù×ëö“Ûôú­ÖÏÅ«»ï™§‡‹Üª»å̉ §²ƒvù×ơñ»—¶¸Úª÷«·3uU¯BƠđ¹˜ 9¥‡×ăˆŸ;ă௾‰äơµØđÆ­v¡ÛçØ™‰kß [ïSƒÖ›ÚơÔçfÁ̉«‡“ÍjĂÈöÁĂ¼ˆÚÀóñÓ“Ơ½³Í‹Ççô«‡“Íj˜‰j̃ZîS޹ ûºÙ½£äË›½°»±»Ăó.Ï̉‘ÖƒÔăˆŸ;˜‰j̃ZîS₫‡ŒÜƒv™ô§Ó˜êèäÅØªÚ‚v÷Á¹Úẩ£X—ˆ©‡¥2ßëMº—ˆ­ÄŽç̉©Û›¾źÿ§¼È ûØ•½«‡“ÍjÛ«‚ ½9öøÓºù×íÍË)éÛ9¥Ù½™Ó߈°¿«‡“ÍjơÔ±»±»±»¡ÁÏÅ™/µØ¡ÔÚ×ñÖ›¾ÿ¯¶Û«‚ ½9ƒƠ8¤‡Û«‚ ½9Ơơêÿ ÙÚ½Û÷ÁưÀÑĂÛÄÓÑÅó߈ÍÇ›¡ß»û½ôç½ăê±»ưÀëö™‡Ơ¡È«‡“Íj¹̃Ë¿™‰kß [ïS¯„å°» ÉÙÙÚĂ ÏÅ“Ơ¿́ëö«‡“ÍjÏÅÅ´÷$ºÀÙÏÔ«dËÉ9÷Ù©ƠÅÓµØù¿½‡°êØר¹ÚùׯrÑÓ­ĂăˆŸ;k«·3uU·Ô‰¿I¡Û½ƒv±¿9¥‡ĂÓ«Ô½˜‰j̃ZîSöÁñÚĂÙÁ÷Á›¶éψôêíÁïÚăˆŸ;¾ ¿‰̉¼ö‡ä½Û«‚ ½9ëöçÚ‘Óù×±»̉Å ½ăˆŸ×̉‹Ç¶íÚ8¤‡ÖÿÚÔơèÅÚÀ–¶  ¾‚vóÄăˆŸ;îÔỞ Ơ÷Ú¾‰Ûÿ$±ÜûƯ¨º™‰kß [ïS‡Çí—GĂàơêƠ߈öÁƒÖÏ ËǃvÛ«‚ ½9íÆĂٵذ‡ÁƯÑÄëÚª‚ +¼9›¡÷ÚÛÄÓ·ÔơêÇ»đ~“‹ëö©Ó³½€÷ˆ™‡Óұ»™ô½ Û×›¶éƒvÏÔÓÆƯÓ “Ȱ»¸àù×»ôϼ©Ç©ÓËǾøê·‡‘×8ç÷ÚÛ«‚ ½9½߈gƯÓ ½ô§ÔÏÔơèŻؽÙÚ™ ơÔ¿»Â¡Á“̃½€å̉ ¢Çû̉ˆ˜ÁƒvÏÅY¿‰¯G‹ø¯Ô§Ô«±̉ºÙÚñƬė»ăˆŸ;éÓù×óÇ«ä„Ú—¶öơ ¯Èƒí—GÈĂ­¡ÔËÇ̀­%ªÓ…„+ïÚÁƯưÀÏÔÛ«‚ ½9±¿˜êèäù×ÅÔ™‰kß [ïS˜‰j̃ZîSÿ +ÙÚơĂ™‰kß [ïSÛÄÓƠ«‡“Íj·Ø³öÔǼÏÄ©‡¥2ßëMÙq·‡‘×8ç¹Ú¦º½Ú×í½£ÇÆÓñÁỔñÁ§ôưÀƠ +«äỞ¡È÷‡•“Íj߈ËÉ9¬Ö°»óÔÛº“¹ƯNĂȱëØëö÷ÁñíÈÄô›ÛÛ×ÛÀƒvöïÅăˆŸ;kÁƯ£ƯÏÄĂ¹âà§à·ÜÏÔÑÓÁ½×Ơ•Œëö±»́v§ ÄØÏÔÿÚ÷Á»ç·‰«‡“Íj­ÄѶ‹Ûơê‹Ü¡Ô·‡‘×8竇“ÍjÏÔ…ôƓƃԱ»g™‡½ô8 ¤‡ Ö«»ñ¹™ é‰ñ5ñ·ĂÙÏÔù×ÏÔÏÔƒàÍÄ%ÓƯƠơê«Ó“ºơê¹óâˆ:kÏơê¡Ôƒvâˆ9¥‡߈ÏÅ™ÁӸסÈ÷‡™‰kß [ïSÁƯÛÔŽ÷ÁĂç½×¼ÓÆ«·3uU¹¨Å؉¯ÈÇÖ”̃»úåơ«‡“ÍjăˆŸш½ëö•Èû›ÇÖ¿‰Óº“Æ£Ư½å̉ ÜÓ ™‰kß [ïS…Ö½ôó¶°»“¼»½ÅàëöÏÅ«»«‡“ÍjóĂºăˆŸ;Á½ơếÆáê‡×‹ˆŸÈ̉Ƨô±Ô¿Åù×ï½ÔXÁËŽµa›¾̀Ê)èÛ8¤µØƒˆ¹̃ĂÙÏÔ߈ƒÖ‡ºG½¹߈×¾Á̉¶ưر½¡»±»¶º ÍÓñÚºÁ˜—˜¼½Â ¬°àèM»ÅËÇå̉ ½€ù×Å ƒÖơêÿ¡Ç߈›¹ăˆŸ;µaóͼ‚ˆ¿‰ù×°»߈₫®¶ÿ¯¶™ëéå«ÔÑ̃“ºƠéêµßù×±»ß»ûƠëö¦È—¾£äù×éÓ½‡ºÏÅƯjË̉ô•Ü«»ÿÚëö•ǹÚÇÖñ•¿ôß»ûơèű¿ơéǼ…Û—Œéº®Đ­¿ùצô £Øëö÷êÆ߈³È½ăˆŸ¯Û߈±»×ĂÑÓơêÛ«‚ ½9Ơˆ́ÅFÓ:Û«‚ ½9ÍÇăˆŸ;«‡“Íj¬Ä»™Á9¥‡ÿÚ‰¿I©Ç¹ÚÛ«‚ ½9áØöÖÆá=«‡“Íjùׇ›¾©ù×Ù½…đưÀï³2Àơ ûÙåÁöÀĂ4ÅÍË)éÛ9¥¼È#₫®¶·Å·‡‘×8ç߈­ØôÁ!™‡Ă¶ÏÅ–Œç̣•Ôù×®GøÊÓå̉ íJă»¿èÅÔÏÔÏÅ·ÔÛƠ¾GÏÔÓ=üØ ¡ÈÛ«‚ ½9éä…ÔñÖ¿ºù×±»¹ÚµØí‡ÁƯ›…™‰kß [ïS¯È©ÇíÖïƠ¸Ú¯Èù×ùêÙ½ÏÚ8*¤‡*Ö߈ÇÅÓØÙ½ôê‚Ö©&‹Ç̣¶ 9¥‡×ûÙöÏÔÇ%•½ߌÛ,ơĂÁÿÚ‰ù¿»¡ÔǺø× ÏÔç°¡Áщ¡»Ï̉ÁƯïÚÓÁïÁÁƯ§™‡™‰kß [ïS߈ªÔơԓƽÔöœÇÖ§Ôí—G©¹Û«‚ ½9ÿÚ×öÎ̉˜‰ j ̃    Z îS ñùº­v9¥‡Ø×¥ƯƒvÔXỞ‹Ç±»8¤‡ÖÏ̉«‡“ÍjÂĂäù×É6›9¥‡×¯E«‡“ÍjÅÔ™‰kß [ïS›¹™‰kß [ïSû’9¥‡§ÆëöÍÇÍË)éÛ9¥¯È“ƠÿÚÇôŽ˜êèäÁÀÙº·‡‘×8ç₫§ø×ÙÜÚ×éÓíêàƠ­Äù×±»ÏÔ¹Œ8¤‡÷Á½€´ÎÓ „µOßÏÍÓŸ}8¤‡ÿÚÿ¯¶Ơư“ƒÚ·‡‘×8çĂºëÖÅôå̉ ±»›¶éù×ăˆŸ;ëö·ÔëöºÅÄö½óÇÁƯ·Ô«dâˆ:jùׇDžƠùפˆ\0ÇÜß»ûèơ§ôÁƯ°»ă»ûذ»ÏÅ«‡“Íjß»ûºưÀ×Ơ†7§j¬Ä º—»›ƠăˆŸ;±¿£äƒä̉´†—¶¨Æª¶2tṬÇÛÀ¡Ô‡Ú™ÁÚª‚ +¼9Æâ߈¶̉ºưÀ¿ºÙÚœ‰¾I×ƠÇÖù×9¥‡‡Œº™‰kß [ïS«‡“ÍjÓŧ‡̣ÇÏ|Ÿ›ÙŒë*«·ÅÙŒë*««‡“ÍjÏÅ9¥‡ɇùÜ8¤‡Ö¢Ô‚v·̣ơÔ߈߈Ù½›¾åĂñ̃˜‰j̃ZîS©¼ôÏÔÓÔß»û¡ÔÅÓ«ÚöÇ ÏÔ¹ÚÑ·éÓׯÏÄÏÔ«Û̃ˆǼ›¾ÏÅ™‰kß [ïS߈Å¡ÑÄë…Ø߈™‰kß [ïS¹Úù×ỔÏÅ¡»“‹ÏԽܙ‰kß [ïS™‰kß [ïSçÚÙßÙ½Û«‚ ½9ĂÙŽÏÅÅØÂĂ¯àßá ˜‰j̃ZîSÓ̉˜‰j̃ZîSƒÖÁƯ߈½ÜéÓ9¥‡—»°»™‡Ơ”ÑÓµa„ÁĂ¹Ú¬¾ù×ăˆŸôé «â­ ÙÚÛסÁºăˆŸ;kÏŇŒ›¾‡ºưÀ«‡“ÍjÛ׫»«‡“Íj¥ÆÁ½ơÔĂƯÓ ±»Ϲ¡ÁÜƯÓ ÛỒd¬Hdëööà‹ÇùשÓÛ«‚ ½9Û«‚ ½9ëö©àă‹Ü߈ÅØÁ̉‹ÛÛ£äÏÔƒv¿‰ß»ûßÖôúϼ°»éÓ«‡“Íj¹ÚĂÙÛ«‚ ½9½€ç4ÍË)éÛ9¥߈íÚÍB«‡“Íjÿ¯¶¿¹—¾«‡“Íj·Ó ¥0å̉ ‘¾Û«‚ ½9¼á=éÓ¥ˆ]1ÏÔÛê‡e«‡“ÍjơêÛ«‚ ½9±ù÷Úï½™ÓÙÚŸƠÚÄ̉ĂÙêöơÅ»Á˜×»‡ƒÖ÷‡Ù½±»²¾©‡¥2ßëM߈™Ô‚ëö±Áëö߈ÙÚ±»ß¡߈ëö³µØÏæáê÷‡ÁÛû(̀ƒvÔXÛ«‚ ½9óÔÙÅ닾ưÀíÓÍÄ©¼ă÷ÁưÀăˆŸ;ٽ釷‡‘×8ç˜êèäù×G½¹…ø“º¹ÚËƠơêơçµØ¶ø×߈·‡‘×8ç¾ßƠ Û×ÁĂ߈«‡“Íj§-«·3uU›¶éßôµØá Ç °» +Ă™‰kß [ïS¬¼¼‹nˆ©Ü»yÏ̉9¥‡ÏÅØÑÅí—Gß»û‡x–ÓÏÔ—¶‡¼»ø×ßÚ±»°»ùׇÚÛ×ÇÖ·‡‘×8çêÔ½á׵ؕ{ơêơ¯́•ưÛ‡Ú…Ú Ëû³(—ˆ·Åÿ¯¶Û«‚ ½9ñ°½ơÔù×ơèÅưÀó½»ù×™ÔÛƠ§ôÉñÓßÁ½ƒ´ÿÚ—¶±¿ơê…€ÙׇŒ»½éêÅÓơÔƒvÙY·̃Ư§Ô©¿µØĂû±»߈߈½ÓºïƠ߈½«‡“ÍjƠ½‰ß÷‡߈ÍË)éÛ9¥™‰kß [ïSæº +“ÈÛÀ¹ÚË̉º»Ơ™‡öĂÎ̉ÏÔ½ßÁ߈ơêăˆŸ;ëöáÅÏĉÛô«‡“Íj‡ŒˆÅÓïÚº¬Ö÷‡·Ø¹öïÂÛÄÓƒˆ†Ç·Å±»ÙÚµØÁ̉ươê±»Û±«‡“Íj™ôéêăˆŸ;ÏÔăˆŸ;¾¶«ÈºĂĂ ›­±àéM—ÓóÇĂÈÏhôëöáêä̉Û«‚ ½9—¶ăê8¤‡›¾™‡³”™‡¿ßå̉ ¹"ƠXÙ×ơê«Ô°»ăˆŸ;˜‰j̃ZîSĂÙËÉ9¥ÓÎÔË ¿ºá ±»˜‰j̃ZîS«‡“ÍjÁÓï½ÿ¯¶ÙÚºéñ½« ©ƒ»5₫®¶ëÓχ½ª»Úª‚ +¼9ĂÙ®àßÄÙ±»¡Áơê Èơê÷‡Óº½€©ÓÅÄçÚ߈ª‡’̀j½Üàöơºù×ơêƒÖƯº߈¿‰‘ơôỖ»ú¶‡Ö8æÏÄ«‡“Íj“Ơí½ù×ϼăڣǙ‰kß [ïSăˆŸưÀƒvÿƒˆ±¿Û×ÅÓ… “Ⱦ8¤‡‡±‹Üï»ĐÓơÔøêâà—»¿‰ù×ÇĂë™HƒvÏÅÙ½¾™‰kß [ïS’ö‘©øêÙÖ̉—»ƯÓ ±߈ù꫇“ÍjÁñϺ½ÑÓĂÙÓ¸߈çÚܯܩ%³ÂÏÅ߈߈­€ăÚ‰¿IÀÙºÓØƠ9¥‡ÏÄëö¹}½‹¿—ˆ¡̃¡Áù׿º¹ÚÁSóƒ×¡Û™‰kß [ïS±»—¶·‹ñÓ™ëéå³Ϲ·Åƒ×̉Æ¡ÈÿÛ9¥‡ăˆŸ;kỂÇÖºÛ«‚ ½9¡Á™‰kß [ïSͼ«‡“Íj“º™‰kß [ïS߈©Ç™Ô½‚¡ÈÉ»ÍÄ8¤‡¿Û«‚ ½9ォÔáê²Â™‰kß [ïS™‰kß [ïS߈ùơ™‰kß [ïS½¸Ó´ÑÓ̀Ê)èÛ8¤±Áű–—Ó“½ÂĂ÷ÁÅÔ“Ơ‰y™‰kß [ïS¹ÚH¨"‡ŒñÚ¡ÁιËÉ9÷å5Óëö‹ÇÛÁĂÛ«‚ ½9™‰kß [ïSÿÚ´Î߈öÁĂÙăˆŸÿ$÷Ú«‡“Íjû=ñíȱ»ƠÁ·ÔĂ™´ÏÅä̉•±́ÂÙ±»‡Ú÷‡˜‰j̃ZîS—ºëö‡ºÛº¡Ó“ºÏÔËÓûƠÙÓ‚½߈ËÇÍÄŵØÑÓ‡9‰øÇÖÓÅăÁ…Œ»ØƯºû«‡“ÍjÛ×ÏÅ“ƠÍÄ£ÔëößÄÙ¡ùơ±”Á̉ơèÅ«‡“ÍjÛ«‚ ½9«‡“Íj‘̃ÖÔ†6¦j¡ÈƠŨ½éßÙÚÏ̉Á‡é/×:›à§ôÙÓ™‰kß [ïS°»́ơÓº•Ü™‰kß [ïSƒÉÛ«‚ ½9±»߈Ơ—»ÓºñÚÅÔ‰ÛŸ¿º…ỒÓ­½¼߈£ä³ûÿ¯¶ùê´È©¼å̉ ‰¿I‰ơ“¹ƯNçô9¥‡×Û×ø× öơÔ“½¹ëöăˆŸ;߈ëöËÉ9©ƠÎŇdœ‰¾IÓØ¤ªôöÑÅ«‡“ÍjÏ̉ù×¾ ù×¾™‰kß [ïS¿ôÓŹø™‰kß [ïSçô»ˆœÜÚ×ơĂº˜‡›¾™‰kß [ïSÏÅçÚÏÔÏ̉ÙÓ‡»ưÀëöö«‡“Íj¯ÈĂÙå̉ ëöÛ«‚ ½9³Û«‚ ½9׿8ïƠơÔ¡ß»û™‰kß [ïS«Ô÷‡·‡‘×8ç…¾̉Å¡à̃“±¿9¥‡·‡‘×8ç³Èæ̉ăˆŸíÖÍÓ«»·ÅÑØƯÁÙÁ|¥ˆ]1‡ÛïšԓƱ»·ÔÛ«‚ ½9çڵȩ̣ëöÍÛ™‰kß [ïS«ÔÙ½·Ô q£Ç¾§ÓÁ½±»߈«â«‡“Íj›¾ÑÄë‘ÖÓ¼‡Ú‡º›½ăˆŸ;k»ùê±»¡Á׾߻û˹·‡‘×8çƠ»ôï‡ß™Û×Íħđ…»ÓÅ«·3uU…Ô¾˜‰j̃ZîS¥ˆ]1ÑÅù×ÿ‡ùê™Ô߈Ù½9¥‡½€¹ÚíJ9¥‡×å̉ …£­߈ă»±»“¹ƯNëÖëöøæ½ëöǺ±»ûÅÓ•Œ߈ºùêÅ‹ÇÛ₫®¶ĂÖđƠÓƒv½ôƒ¾‘±»ׯ½¾ÅéÓå‡àçñÆóÔÏÔ™‰kß [ïS߈±»ÆưÀ©‡¥2ßëMăˆŸ;›Úù×§Ôá «‡“ÍjơêÓÁ8¤‡ĂÙ™‰kß [ïS•Œçѵaêöù×ù¿½ĂñÚ±)ñÚ™‰“Æû(™‰kß [ïSÏÔÏÄÅ»öÏÔÍË)éÛ9¥©¾ơÔ¹Úñ­ÄÓØÙ½Ó̉­ô »½ƒv߈³u™ỗˆ›¾·ÔĂôÁƯ­Û«‚ ½9ăàÇÖívÁ‡Ú߈…“Û«‚ ½9ù×É6ÑÄ냈›¾ù×¹£›¾êö¹à‘öƒv™‰kß [ïS§û(ĂĂ˜‰j̃ZîS«ÛÙÜù׿º÷ Áÿ»–¶¢Ç«‡“Íj߈ÿ¯¶ÑÓ™‡öÁ·ÅÙ±»öÁ±»¡Ô¹Á̃ÁÖ¼ «»¿́¿‰ÇÖ†ÚÏÔ½ÔăˆŸ;߈ƠºmµØ™‰kß [ïS‹ÇñƱ»»~°¿°»—Óƒ¾‘×Ỡˆ¡Ó™Á߈«ÔĂÙĂĂ ›­±àéM‡Œ—¶°»¹Ú—»…Íı»¹ÚÍÓƒvÁơơê±»ƒ½“ÈßÚµØ×¾°»ăÇí÷‡Æ»Û×µÈưÀîÅöÁ ·Ôùר¼ôÔ§˜‰j̃ZîSƯÓ ù±»÷ÔμĂôäƠăơÏÔ8¤‡8¤‡×ñÚ«÷ùŸñÏ̉ÂÙ÷Áå̉ ͼÓ¾߈ĂÙÿ×¹£ÙÚÁĂ×¾¤È³™Á·ÜªÚ‘ïG½¹»»ù¿˜ơ ÑÄë­vÏÄAíº›vĂÙÏÔăˆŸ;­½¼ä̉™Ô·‡‘×8ç†ø½ÔÓºÿ¯¶ù¿ŸvÁ߈Íӣؽ§à™¼ÛÀ±»߈±»ÙÚĂ¼©ÓøêăˆŸ;kÏÔ±¿¯¾ùêạ̊“7¹ñƒÔûØưÀ±»ËÉ9¿ØщơÔăˆŸ;óî߈ưÀ̃ˆáê9¥‡•ÛºñÆñÚå̉ ‰Û§ôྙ‰kß [ïS÷Á‚½øêÛ«‚ ½9·‡‘×8羺 ©‡¥2ßëMµØµ‰ÏÄ¡Á“Ƴ«÷ù×ơêߌÙĂ‚v»ØçÚăêÎÅ¡ƯåÀ±»¤ˆ +\ +0 +±»Ở§ôËÉ9«‡“Íjª‡’̀jÇ%‘±«»đÄưÀÑĂ¿º߈ŸÏÔƠå̉ —»£äŽË%Ơ‘áꙉkß [ïSÉ»ù×ù×áê½ƠXñÖÏ̉“ƠÅÓ߈¨À½Û«‚ ½9˹ívÅÔÓÆĂĂ߈ÙÚ߈ǺơÔà¬óĵaù×›¾÷¼ÏÔ½™ÂÙ߈ÏÔ·‡‘×8ç²ØĂ™ôÛÇ֦ןȃv÷ÙÏ̉›¾ÓăˆŸ;k׾ƫ ©ƒ»5ï½™‰kß [ïSơê߈ÓÅ·‹‹Üщ„Ø·‡‘×8çƠ8¤‡ă»™‰kß [ïS½€Ö‡¼7 Á™¥·‡‘×8ç«ÔÙÅë×¾‚v‡Œ±»³ÈÛÅ©¼•ïív²ÈưÀÍBàƠ߈ưÁÔ¹à̀Ă9¥‡ߌÛ,ß»ûăºơê²ÚNÁƯ‡¾º † +đ5 +÷ˆÙÚÛ«‚ ½9ºơ»‘ơ©¼·‡‘×8瀪Û߈÷ÁơÔØYŸ}çmĂßÛƠăĂ3ƠöÁÁ̉ù×ÏÔ©ˆÿÚÜÁ̉ÅØŸÖ‡ÇÓºËÇäƠ +ßơ©‡¥2ßëMÛÄÓÛ¡hívƒØ©Ó‡Œù׳ˆÛ߈±»Ù½»uöÁơèÅßÄÙ˜‡ÎÔơêá$ÎÅóÇăˆŸ;kͽ¾ÓºưÀ¾½Ùש‡¥2ßëMă­½€Óº™‡ÅÔÿÚ±½ß»û½€9¥‡…º±ÁƒÖù×ÏÅ߈­Ä©ÇÙ×å̉ ÅÔñÚáÛÁƯ‡‘×8ç±ÁúÙ£ØÂÙ»¼Ô›¶é«·3uU™‰kß [ïS₫®¶›¾½±»Û«‚ ½9ĂÙ½åăˆŸơØ«‡“ÍjÛ«‚ ½9ÙÚƒàĂ¯È‚vÏÔơÔưÀô±Ô­µƒvÿÚĂÙÙ½—¶“ÈƠÏÔỞ¿ÅÛ×»½öçÚƒv‡™‡ÙÅë©Ó‡é«‡“ÍjĂôÛ«‚ ½9Ùב +—Ó½€áêù×¹ÿ§á=¾ÏÔ‡Œ±»¯ƒ« +>¯ƒßͯ¥'=U#QK¯Âáê½—¶÷ơÏ̉×àçÚ߈¬!ƒÖ±»ÏÔüÀÏÔÏÔëöăˆŸÔXÿ§²ơÔù×̃ÄØ°»¸Ú߈÷‡˜‰j̃ZîS½ºÅ9¥‡ÏÔăˆŸ¬Ö³ÓŸó·̣²Ü«‡“Íj™Ô罓Ơ›¾‹Ù™‰kß [ïS߈÷Áƒ‡Œ½Ù½á™ÏÔÁƯƒˆÁ×™Ó¹ÚÂÿ¯¶ëöưÀ‚Ô½Ú×¹ÚÛ«‚ ½9«‡“ÍjϹ«‡“Íj´†Ú×ÙŒë*«ëÖ÷‡Û«‚ ½9—دỞ›¾“È«ÈôêÛ«‚ ½9Ù½Y½Ù½ă꜉¾I¸ÚÏ̉½€Ó™‰kß [ïSËÉ9©‡¥2ßëMµØÛ×±¿Ǻ‰Ôö‚vÁƯËÇóÂψÛ«‚ ½9ëö­ÄÅÔÅöá=è¼đÆö»Ø–ˆ ‡ÙÓăÁ·‡‘×8çصÈëöÔX±½Û«‚ ½9ÆöÁ¹ưÀ‡kßÁ«Ó‡ºăˆŸ;¯‰¯0߈óÔÅÔÛÄÓéÓưÀȳºóñÚ™‡ψÏÔÑׇÇÁƯí–GûÓ Ëûß»ûƒv±»¡•½ƒ½½ôßÖñÓ±»âà¼ÛÀ‘ÆñÖÛÄÓÛ«‚ ½9ĂÙ‡Œ™‡éê…Û}öçmá¬ùôÍēƯåßÁó—¶ÏÔËÓÑÓÓµ“ÈÇÖḯÁ¾ÏŃv·¸ÓÅĐÅ¿ơëÔưÀăˆŸ;êÁ«·3uUÛ«‚ ½9Û«‚ ½9ÙÚ—Øg±¿Û«‚ ½9ÏÄƠç̃߈ñăà·ÅĂ߈ÁÏÄỂ›¶éëö÷¼™ÁÎÔ߈ơÔ©¼Ơóå̉ ƒ£ÈÍƠµØ”­Ø9¥‡¦¹ăơø×÷ÁÛÄÓóÖô«‡“ÍjäÁÛÆ—¶™‡‡™‰kß [ïSưÀ™‰kß [ïSóÇ«ÔƠµØÓƒvơèŵ.¥Ùơ»£Ô©Ç™‰kß [ïSÛºù׎¢äívÍÓàƠ»»åĂÈưÀµƠÏÅŸ»ÅÓñÚÑÓ߈·‡‘×8ç߈ÅØÏÔ„ô‹Ç©Çơ»¿‰ÏÅÇïƠŒÛ½ƒvÑÓëöÏÅÎ̉«Ôåôß»û–¶Æ¯Ơ™‰kß [ïSÏÔ₫®¶ß„—»½Ôé‰ñ5ñ·§ÔÙ½߈ư¿›¹‹ÙÏÔÀ‡€è/Ö:ºyùט‰j̃ZîSÅØ‡xŸ+ƒ›÷Ú—¿ÑʯÛË̉ù×§ô½ë½øêÛ«‚ ½9½Û«‚ ½9̃ˆ÷¼̃Æ¡È÷ñÉĂÑØ±Ñ­Öɇù×Ï̉Û«‚ ½9ùêĐÄê¡ÔµØ´ÜĂÙÅØ×Ơ±»ơƯôêưÓ›¹ÑóÂźï»ù×ß»û·ÅĂÙ±»Ăºçô·ºëöéê¶HèHµØưÁÁ׳ÓăˆŸ;k‡ŒƒÔ±»–÷‡à÷Ú©ºíÁÙ̉ÇĂÁ½›¾ư§‡ä̉­văˆŸơºëöưÀÎÔáê¡Û·̣—¾¾ôăêÏÔÇÜÚ½ăĂĂĂ£ØíÆ—¶̃ÄØ™×ÎÔ©ÜĂÙœÁưÀơêÙÚëö½«‡“Íj£äÙÜ»‡ëÓ½ÓÆ°»£äÏŻ܌₫·ÜÛÄÓÛ«‚ ½9ÙÓ«‡“ÍjÎ̉¹ÚÏÅÚª‚ +¼9±»¾ß9¥‡×Úª‚ +¼9ƒˆơÔăˆŸ;å̉ ÈĂ¡Ôù×ǹÚÙ½©À¶Ôÿ¯¶ăˆŸ;ăˆŸßÁ麱»™‹½€ÿÊÿ¯¶î¥ʓ½ñÓô¹Ú×Ơ™ÁÛ«‚ ½9µØÛ«‚ ½9çÙ½ëöË̉ưŒĐÄꙉkß [ïSïÅÛ«‚ ½9ù×ù×ÍÓÆ»Ï̉ÿ&ÏÄăˆŸ;ơÄׇ½7Û«‚ ½9߈çô‡Ú÷Áï»ăơưvăˆŸ;¼ĂÓáÛ÷Á˜‰j̃ZîSßÖÍË)éÛ9¥źív€¾«Ô߈‰±«ä›¶é“ÿÁ™‡­Ä¯G‹øçÚöÅÁù×ÍÄ¥Ó›·ÔÅØÛ«‚ ½9±»±»ù×½¶¼ ̀7 ô߈—ˆ©ƠÙŒë*«µæƒv¡Û±»ÿ¼ƯÓ ˜Ôù×߈9¥‡×­Ø¿‰géê¹ÚŸ}÷ÚÙڽଠٽëö£äăˆŸ;áÛ÷ÁÙÍщÚª‚ +¼9ăÇíëö§Óơꙉkß [ïS½€Âá Ù½æ̉öÏÔßÄÙăà̃„£ÜƒvĂƠ9¥‡›¶é…ö߈ĂĂ¯ƒÖ±»©¼íÖÁ½Û×ƯÜß»û©ØÁ£»ñÚ÷Áí—Gù×Û«‚ ½9»Ø§Ô¾™‰kß [ïS™‰kß [ïSëö•½å̉ ù׋ȋÜÙ»±»ĂÙó¶‚¾ùê—¶½Á̉‹Ó¯¼ê™ÍÄ™ëéå¬ÈÏÁƯÑÓáê·ÅăˆŸ–ÓƒvÛ«‚ ½9™‰kß [ïS…ñíÈéơ“½¾º€ëÓÁÇÖŽ÷ÁÙ½ö™‰kß [ïS÷Ú±¿ñÚÿړܙӃ։¿Iù‰§Ó“ƠơÔÁ ñ¨ăˆŸ߈á$‘¹ÁÓ“Ơù×÷ˆ­Ö·‡‘×8ç½ù×匿Nøëùê±»íqÿ¯¶«‡“Íj›¹æ̉߈âˆ;k½ô­ÄøôµØŸ}ÿÚ·ÔÛ«‚ ½9™‰kß [ïS…ÖñÓ±»ëö¹ù×˹ºÛ ÍË)éÛ9¥ù×™‰kß [ïSÛ«‚ ½9ù׌Îù×û[ëö§Æ¯ö£ä¥ ÅôéÚÿÚåÁăˆŸƒˆÈĂ +ÉßÄÙ‹Ü›¾ç½£Ôô·º·‡‘×8çêöƠ'«ÔÛ«‚ ½9³ºóÿ­­¾ƒˆÓÔ÷‡ưÀ…ô߈Á ¥â‰ÔƒÖ›¾9¥‡¡Ôö˜‰j̃ZîS£ô·‡‘×8穇¥2ßëMĂƠÙ½ÅÁ©‡¥2ßëMÿÚµØÛ«‚ ½9¯¾ĂÙÏÔƒ½™‰kß [ïS⻦ș‰kß [ïSĂÙÛ«‚ ½9ù×߈ƒÅÔï‰߈÷ƠXÏÔù׉±«‡“Íj¦¹ÅÓ¼ØÅ¯G‹øƺщöÁ«·3uUÑøÏÔăˆŸ«‡“Íj…ÖỔªÔÛ«‚ ½9±»ÓÆĂ¼›¾·‡‘×8竇“ÍjơèÅ—ÓÛ«‚ ½9öÀß³ÈÏÔ·Ü¿àăˆŸÆÑÅÛ«‚ ½9ă½ÿÚ­½¼ñÓ†Œ½Ă¿‰³zô±»Û«‚ ½9¶Èå×°»óǃv§àĂº°»Ë4ƒˆÅÏÅ¡ÔĂÙÙÜăˆŸ;Ă«‡“Íj‚ơĂ¿Å»9¥‡×½ñÓÏÅ—ˆ¡Ø™‰kß [ïS•«ÔˆÁ×ưÀ¶¡Ơ½È‡Ûù×߈ñÖÙÚÓÁĐö‚‚½’½Éð»ÿڇǣÇ9¥‡9¥‡Ø™‰kß [ïSï½Ơ·º߈Ï̉£ƯÛ«‚ ½9¡ƠͺĂ«‡“ÍjĂÙơÔ½·Øÿ$Û«‚ ½9ºá ϺăˆŸÛ«‚ ½9“Ơ°»Ă˜‹ ·Ü¨ÇÑæơؽ©‡¥2ßëMă»ÑÓ½ÇØ©½¡Ô¼ÄÔ’‰2Ô,øÙ½·‡‘×8ç…ƠÙ½­vƒvógăˆŸ°”™‰kß [ïSñغ»Ï̉éÓ±»¹¶ÍÓ“Ơ¡Ô¢X‘Ǻëö™‰kß [ïSϼ™‰kß [ïS½÷Á¡ÁÛ×ÿ¯¶ƠÛ«‚ ½9ÏÔ9¥‡Á½™‰kß [ïSéÙ½·ăÚ¡»ívÏÔ(ëö¸ÚÏԧƧÔơÅù×÷Ù¹Úß»û«·3uUÅØ±¿¾ºªÚÙ½±»÷Á¿ß«‡“Íj Ôßq™ÁÙÚÛ«‚ ½9ưÀ‹ÇåÁ›¾ÙÚ­Ö«Ûó×ÙÚ߈£äơê§ô©Ó±»±»¿́·Å ½¶èĂÙ˜ßÄÙÈ­vµØÚª‚ +¼9ö·Ô¥â¡Û‚v¾¹ÚÛÄÓÏÔ߈ÇÖÏ̉ÿ¯¶…“ËƠÏÅÛ«‚ ½9óßÁÚ×߈ưÜă*ơºÍÓóÙÚIóä̉ôƒ—ăˆŸ;⻇“ăˆŸ;­ÄßÚ‹ÜÙŒë*«‡º±»¢Ç†ŒăˆŸ;ÏÔÁ¼´́§È…µØƒv“È“¼¿ô—¶ù¿ơèÅå̉ É̉í·µØ¿‰9¥‡¼Žù¿ăˆŸ«»÷Áù×°»—¶ÔX®Æ ưˆụ̂‘̃ˆăˆŸ$ÇÛºÏѽ¥Ó·ÅÏ̉íÖ½ÏÅ™‰kß [ïSĂ£ÑØëöù×ׯµØ…%“ȧÔăˆŸ±»ăˆŸ;ơéÖÆC߈ÏỖÄØ߈˱µØ½÷Á±»Ó¼±»Óµ‡Œ×$¹ÁăˆŸ;‚¾¹Ú̃ˆëöăMï½£äÜ«‡“Íj÷¼Ă¹±»ơÔ¹̃ơ»Ÿ̃ĂÙ̃»ú¯È9¥‡‡ÁƯ°êر»½Ă£ƯùßívÛ«‚ ½9×ÚÅØ™Áëö™‡‘Ó³ăÇíúØ­½¼éö…¹¾ơèÅÏÄÏÔÛ×ăù×¹Ú”¿‰‡x½€©ÓµØÇèÇÁ™ÓĂȃåĂá¬ù×߈cטÁĐÄê±»ëö½Ăô¥ØƒÖù×Û«‚ ½9»Ø߈ư§‡¡»̉£äÿÚ߈±»ƯÓ «‡“Íj‰ƠăˆŸ;†Ç­ÄĂÙ¾9¥‡—¶ñÖßÊơèÅôăÇí½ô¸Ú§ỐvÛº¿ë°¿ñÓרÄ–å̉ ×Ă“ÆÏÔ¥ˆ]1ưÀ8¤‡×­Â–Ø¡ÈáÛ©‡¥2ßëMÍÇ©Œî‡•)•Ïű»«‡“Íj½€öơÁtƒÔØá ăˆŸ;™‰kß [ïSß»û²ẨÆ™‡±»9¥‡Ë̉ƒv9¥‡Û×Û«‚ ½9¶ĂÙ/߈ˆĂÖưÀ™‰kß [ïSùש«‡“Íj9¥‡Û«‚ ½9ÙÚ·‡‘×8ç£ä⻫‡“Íj߈£‡ßÚá «‡“ÍjçºÍË)éÛ9¥ÏÔĂĂ ›­±àéMăˆŸ;kŻ؋Çù׋ÇÁÓÙ½ÅØ¡ÁÛºăˆŸ;¶‡Ö8æëöÓ̉›¶éĂ ŸÈăơÛ«‚ ½9ߌÛ,ËÜ÷Á±»¼Ø÷ÁÔ½ÿ¹ÚÏĐ߈ơԼث‡“ÍjÏ̉ưÀƒˆÓØĂÙíźÑÄëÿ¯¶­Äăે“Íj·‡‘×8çÛ«‚ ½9ƯÚïDÏÅæÚ‚vÿÚăàơ»›¾Ϲ¿‰ưÀ˜Á«ÛĂÙ÷‡«‡“Íj§ÔÍÓ™‰kß [ïS¸ÚÙ½½Ơ¾GÂÛÇ¡°»ĂÙŽ“ÇÖƠ…ô¡ÔơÔăˆŸ;öÁ¼§ØỞ™‰kß [ïSÄí̃„ëö₫Û«‚ ½9™‰kß [ïSă»Û«‚ ½9É“ôï½…ôÏÔÓ´½̃ƯY¾ºƯÚí—G߈ÍË)éÛ9¥ËÇÁËư±¹Ú¦Ó߈ù¿«‡“Íj¨ØÁƯô¹Ú—ăëöÛ«‚ ½9˜‰j̃ZîSŽÍÓơĂ¯¤ƒˆñÓÀ‡€è/Ö:£ÓÛ«‚ ½9îôñÓ§ÔǺÿ¼ï½ñÚÏԓƳºóùê«ôÑÓ…ØÿÚƒvưÀí—GÔơ¿Å·Ô¶ߌÛ,‰¿I©ˆÛ×ÓÁ”Èú¹ÚưÀ9¥‡×ÑŽÁĂăˆŸ;ÙÚ›¾ÏŵêÏ̉ׯÛ«‚ ½9רÚª‚ +¼9àêöơ ó¸ÚÑĂ߈™‡ßÖ߈å̉ ơꮼ¡̉Ù½½ôÔơêƒvƒv9¥‡ñèÏÔÉ᫇“ÍjÙÚÓ¼¹Úï½»nº“ƠÅÓô¹ÚơÔóÔ÷‹ؽ•ŒYƒvÙ½«dƠ‡›·ÔéÓ‰¿I·‡‘×8ç¯àå̉ ÑĂăˆŸ¶ư“Ö¾8½ôÔ™Óù×ÄÔÏÅÅĐØ «‡“ÍjăˆŸ;¹àÿÇ÷ÁåĂ½Ă¡ÛĂÙ›¶éơꙉkß [ïSéĂ ˜ơ•ó Á½€ëö±¿ơê£ä«Ñù×Û«‚ ½99¥‡ÿ¯¶å̉ ·‡‘×8çË¿“Ơ«‡“ÍjÙÚ«‡“ÍjÛÄÓÇÖÏ߃½ÔáÚÛ«‚ ½9ñÖ¿‰·Å¨vøơ«‡“ÍjËÖÜ—¶¯TÁƯ°»«‡“ÍjñÚƒvñÚßÄÙÅôß»û›¾ơêшÙÚÙÚ™ô»‹»ÅĂÈ«‡“Íj¬Ôö­½¼Æ­ºŸÖÛÀÏÔï̉©Üù×Ûºº©ÓăˆŸ;Ưºù×¥ˆ]1ëö°»÷Á½ĂΫ‡“ÍjËÉ9ѶÏÔù×ç̉̀¼ív½Ø”·“º÷ÙË«‡“Íj³¹éÓ¾¹xêöùדƠ˜‡ÇØù×Ï̉çôÜÓ¾ù×ÏÄù×ÏÔ¾ßăˆŸ;“Æ߈±»ÏÄÿÚ÷Á«‡“Íj̃ÁÓ‡çºÿ¯¶Ú½­)óÔ»ØÛÅÏÄƠĂȃvƒơ¹ÚäÁăˆŸă½Ç̉ƯÓ Ç"øæ«‡“Íj³ÈÜơ¿ôÍË)éÛ9¥›¾ÅÔù‡‘̣ó½Åô«‡“Íj³È«‡“ÍjçËåÁơêÛ«‚ ½9̉ųôăˆŸ÷Á–¶½€™ÁÛ«‚ ½9åÁù¾˜‡±̃½˜êèäÛ«‚ ½9Ù½ÍË)éÛ9¥ă†ͼù×ăˆŸ¸ÚăˆŸÑÓ·Ó ¥0™‰kß [ïS«Ô߈°» "9¥‡×nÏÔÓØ½Ăºnß»ûÁmƠ‚vëöÓØĂ9¥‡½€Œ߈·Ô×Ơ§ÓơÔ9¥‡Ö$«âóƠ9¥‡߈™‰kß [ïS£ưˆÄÔÑÓå̉ ù×»¼‘É̉çÚăˆŸ;k‹ÇëÓ¡ÔÏŃv̉ºï³2߈Á½ÍƠ‰¿IËÉ9ù×ÏÄëÔ­Ô­ÄĂÙ½Ÿ»ôÅùê‡Ç₫Ϲÿ&ŸƯ÷ÁëöÏ̉ƒăˆŸÑÓ°»»Á¡„ëö́$Û«‚ ½9ù¾ÙÚ™‰kß [ïS™ô‚¾ + +ëö™‡¥Û£ä¾¹x÷‡ÏÔÏÅÿ¯¶±È±)ăˆŸ;kéïŹڸ·Ü9¥‡ÿ9‹RßÁø×ù׿‰ƒv«ÚßÄÙëö·ÔÑ"Û«‚ ½9ăˆŸ;ÏÔ©‡¥2ßëM¹ơÔùëö¹—ëö•×ÏÔĐÓëö¥ÈÏ̉£ á ĂÈ¡ÁÛÄÓ±»Đ˜ôÛ«‚ ½9‰Áº—ˆ÷ÁĂºµaóÔëöÍÓ¹Ú¹¶רö‘đͺùêôĂăˆŸ;ăˆŸ;́Ú×¾Ơ™‰kß [ïSƯÚ™‡ívÏÔƠù×ù׃½ßÄÙûñöÂĂÍÓ«Ñé¼Ïű»߈ưÀâÄÅӬĽ€Ù½ÏÅ›¡«‡“ÍjÓºăˆŸ;ÖØù×ôÔ«‡“Íj̉Ó·‡‘×8瀷Ԫ‡’̀j߈ÙÚ©‡¥2ßëM̉̉ƒØÛ«‚ ½9ÍË)éÛ9¥¥Æ…ÖÏÔ¶è,È߈∃½Åáßø8›¾ƒvô$ă»—ˆƒÖö™‰kß [ïSŸ\±»Ǻ™‡ù¿«‡“Íj†ŒÙ×ĐÄêϼ±»‡Œñ‰ÍË)éÛ9¥ưÀÁ™ÓÛ«‚ ½9ôêûÓ÷‡™ëéåùê½߈ơèÅơêÏ-ăˆŸ®ôµÈù×ÇÖ½ÏÄ›¾©‡¥2ßëM¡Ô±»›¾·§D —äåÁ¹Úå̉ Ï̉›Ă›¡ÏÅù×Î̉ăîÂÙ§ÔªÔĂÙ‡ăơĂÙÿ¯¶Û×¡×¾ăˆŸ;+ĂÙùר×Ç%ËØåĂ«Ôù×¼éÓÀ¼÷Á«‡“ÍjÍè¼±»ƒvÏ̉å ½€³¹ÚưÀ¾ç½•ÇƠºmË̉ơêơêÙÚ±»“½߈9¥‡½ÏÔơ莺ĂÙù×̀Ă½•Ç½Ô Ëû÷‡±°»9¥‡ư«ÔăˆŸ;ưÀ—ˆ‡ÎÈưÀ¿»÷ÁÇĂăˆŸ÷ÚïßơêµØ©À¹Ú£Ô³à»½íÖ½¢äêöƯÓ Å£µaĂÛºù×Ó©ØÏÄĂÈ÷Á±»©¼¡Èív¿ív±»ùׇ×ùבåÁ†“Áív÷Á¿ßăºÛ«‚ ½9“ÆƠưÀưˆ«‡“Íj«ÔôêÇÖ̃Ó÷Áщ¡Ó߈‡Ç̃ˆ9¥‡×«‹ÙŸ}‘Æ™‰kß [ïSíØª‡’̀jăˆŸñ×™‰kß [ïSÓ̉YơêÚª‚ +¼9™‡ăˆŸ¼€ÍÓǼÁĂêö&£Øëö¯¼ÙסԽÔËÖ—ˆ†½ăˆŸ;·äÙ½ÏÅƯÓ ¶Ù½œ‰!¾I!«‡“Íj›¶é߈ƒvׯͼ.ñíșԱ»ù×ÛŸ}ĂÙê×£ä³à¥ˆ]1ÜÓ µ†߈ĂÎÛ׿ô™Ă‡Çä̉ÏÔơèÅË̉ăˆŸ;±»«Úχ›¶ééơ˜‡çäÅ»̉Øùêăù×ÿ×ÏÔ™‰kß [ïS»ÅÍÓû°¿ ‡ŒÅ«Ñ™‰kß [ïS€ºÏÔ˜‡å̉ ÏÔô¿Ôºß¡±»í–˜‰j̃ZîSăˆŸĂÙ˜‰j̃ZîSăˆŸ;ơêăˆŸ²Øä̉ß»û߈ÅÔƒ½ĐÄê±À™Ø©-íêĂÙư“‡ÛϹ‡“퇧Բº̣߈߈ÖĂÂĂÙÅëùׇº9¥‡ª¶2tT½«‡“Íj¹Ú߈Ä–ù×Ñ·›¾₫ ®¶ ï*å̉ ߈•½«‡“Íj·‡‘×8çăˆŸ±‡Ó󼁯ëöÿÚăˆŸ;ƒÔÁ̉ăˆŸ¥Ăª÷«‡“ÍjÏņºÅؘ‰j̃ZîSÛºͽĂ ±¿ÏÔ9¥‡ô ÛăàǽŒ¾ôÄôÛ«‚ ½9¿º¥ˆ]1™ÁÏÔ™‰kß [ïS߈«»«‡“Íjưµ«âÙ½ÿư±»ÑÓÛ«‚ ½9ÁœÿÚ±»áƯù×́½GăˆŸ;Ó̉Á€ªĐ‘Æ8¤‡Öù׫·3uUוƒv“Ơá ơêÏÔ²Èù×Á̉ÏÅâḈ°»ÇÖâïëö«‡“Íj±»›½ÙŒë*«°»đÚƒvưˆ‰¿IÛ«‚ ½9×¾™‡ÑÓÿÚó×щ™‰kß [ïSĂÓå̉ ¥Ó—¶‡ÏÔëöÏÔ¹àÏ̃“Ơ“„ ˆ₫¾©Ø’‰2Ô,ø›ÚâÂ3 úÑÄëơê÷Á»½¡Ô¿Ù«ºµ†¥ÛÙƠëöĂÙ÷Áº½Ăƒ¾‘µØ}›·ÔÏÔ«ªưÀĂÙº‹Ç¦ÓñÁÀÛá ív“Èô ĂÙ‚³ßÄÙ±ÁÿÜÏÔ™‡ÂĂ½€߈«‡“Íjâ ôĂöÀ̉ +ơèÅí—GÏK©Ó‰Û¡%ăơ‡x™‰kß [ïS÷Á¥ºéºäô¿ßơèŸÚÁƯ‡ŒàĂéê©·‡‘×8çÛ×ï½½˜êè䪼ÎÔ.Û“ƠÏÔ±»£X±»ÁƯóÔäô«·3uUÛ«‚ ½9¡÷‡ù¿«‡“Íj“Ȱ»ù׃‡Ú»ÜӨ׾ÏÄÑÓç|ÍÓù×—}Ể µ߈¡Ô£»ơÔ«‡“Íj“ÈÉ̉å̉ ăˆŸ߈ºÅ½€ÓÓƒÖ£»3÷Áµ×ơèÅ¡Ô匿N«‡“ÍjÍ·ôû»ËÉ9ø¿ù×ÿÛÙƠ¡©ơ߈9¥‡×Íİ¿ĂÙ¥ ½«»—¶ÅÓĂăˆŸÛ«‚ ½9­R¥ˆ]1߈ƒ¾‘ÏÅ‘±óÇßÁÑÓ±̉­Ä9¥‡ù×ù×ÛºơÔ›¾Û«‚ ½9ơÄ×ÓàÛ‹Ù°¦ÎÅéß›¾ËÇËĐ%ö÷‡ûӄؽ0ïö™‡÷ˆ߈ Û¥ºÿ¯¶Û«‚ ½9÷ÚăˆŸ»Á·‡‘×8ç½Ăå×±»­ØäôÛ«‚ ½9»ºƒˆ›¾±ëØ̉ºÑÓƯÚ… ưÁđÆí½Ú×+÷‡±»±»Û«‚ ½9«ÔÙÚ¼ÈÙÚ„ÇÏÔÁ½ơÔÏ̉߈ă"…»ưÁù×åÁÅn›¾½ÛÀ«÷¡¼Ơßăàå̉ ù×ÙŒë*«ÙŒë*«‡ŒóĥƇăñÓ±»ß»û躹ÚĂ½€£ÜÂàÚº“Ơå̉ ‹Çù×öÔå̉ ÙÚ£ÔÉÛ«‚ ½9ơÉ̉µØ9¥‡ÏÔÁåöÈăˆŸ;«‡“ÍjƯÓ ‹Çå̉ ñÚ¾߈™‡÷Á¥‰ÍL…Ï̉çÚÅØÅÔÅÓ¿ÔÉ™‰kß [ïSơÔÙ½ÅØ£Çâˆ:j¯Û½Ù½™‰kß [ïSÁÛƒv½ăˆŸ߈߈Ù½ăˆŸ;ăˆŸ;áêÅØñÚØ× Û«‚ ½9“Ù‡“ÍƠ±¿ëöëÔÓ̉©Ø—HÇŸƯÓ ƒ₫Ơׯ°»±»™ÓĂ«‡“Íj½Û«‚ ½9«‡“ÍjÛÀ·Ó ¥0ƒvËÉ9… íܯ×ÛÇÍƠ˜‰j̃ZîSĂºÙ×ÏÅăˆŸƠÙÚÏÅ·Ó ¥0™‰kß [ïSĂâù×ơêÛ«‚ ½9÷‡ÙÜơԯȬÄơÔ‹Ù…Œ9¥‡÷æư%¿ß¯ÈăˆŸëÓµØù׵ؽù×¾ăˆŸ;kÿÔ¿ßµØưĐëö¨ ·Ø™Óɹ«‡“Íj›¾ÿ¯¶µ†ÚÀ·‡‘×8çóÇ·‡‘×8ç¶  Ơë“ơÄ›¾¿ºÏÔ÷ÚÏÅÑÓăˆŸăˆŸ;k̃ˆÚª‚ +¼9ÓØ©&„ơêơèÅÿÚ†Œ¡©&“Ơ¡Ô¬¾߈ËǛ¾ñÓ°»™Ó»‡ÄÔ«‡“Íj«‡“Íj߈߉ÓѶ°»ÏÚ±Y…=¾¹ö«‡“Íj—¾÷Áß½—»ÙŒë*«ËǓƙӿÅÙÚ™‰kß [ïSÛ«‚ ½9«Ô߈™‰kß [ïS9¥‡×ĂÙ¾ưÁăˆŸçÇÈĂ½–¶×¼ÑÓ¡Û«‚ ½9½ƒ¡Ơß»û¾ƯÓ Ù½ÄÓáØµØƒÈ‚v±»ÏÔÿÇͪ°»›ô¿‰ëÿÏÔçÚ·‡‘×8ç½Ăù×½߈Û«‚ ½9ÛÄÓÓØçÔ¡ß»û»Ă÷Ô±»Đˆ™»ÿ¯¶ÆØçơ™‰kß [ïSƯÓ ơÅÿ¯¶ÆëÔ»ÏÄçÚ¾ÅÙÚù×÷‡ơ»ÁñÖăˆŸ;‹Ü“Èé·ưˆá܃‰Æ›¾™Ó½€ÎÅùשǽơÄưÀ™‰kß [ïSÛ«‚ ½9‹ÜŸ‹Ç̉¿́½«ÚáƠ¡¢ÙƠùבgß÷Ú±¿·‡‘×8çÙÚĂÙ—¶±»ăˆŸ;kµÚƠhÁ°»½Ă߈Ï̉ÛˆÛשÏÄÔXB£Øî»¹Ú¥É÷ÁªĂ ›Ú9¥‡ºшØ×›¶éƯ×ù×§Óù×Û«‚ ½9ÏÄÛ«‚ ½9ƠÚÛ±»ö™‰kß [ïSùêÛ×ăÁË¿¿ƒv½‹ÙöÛ×¹Úù×åĂ׾řËÉ9ĂÙ»̉„ÇÖư“•סۛ¾¾ÅØ›ÛÏÅ·Ôˆ¿ÅơÔ¹Úá ¼€ͺ¯È©‡¥2ßëMáê±»™‰kß [ïS«ÔÅëöÛ«‚ ½9ÇĂÏÅ£ ™‰kß [ïSÛÅ–î»ëö·‡‘×8çù‡ÍÓơĂ“Ơ¨ÈçÚÙÚöÁÛ«‚ ½9‚v™ô9¥‡÷ˆù×ÍĂæØùùÜûÓÊƠơê‹ÙǼ›¾‡ŒËÇ߈ëÚăˆŸ;kÏÔ¡Ô§®ĂÙ½Ïű»¥Ø÷Á¾›̣ûÓÛ«‚ ½9‡ŒăˆŸ;kÀĂ +ăˆŸ;ÅØß»ûËÉ9ăˆŸơê߈ÅÓù×ăˆŸ;Å»¨Ó±»É«‡“Íj˜‡ƒˆƒv—¶™Ó“ÆùבÚÁƯ™‰kß [ïS¼ĂÛ«‚ ½9Ă¼¡Û®$ÑØªÚ߈ÁƯ÷ÁÎÔ½ÅÓﶃÚÿ¯¶ù×ÏÔÓÙͳüÁù×Ù×ơêăˆŸĂÙóÔá ³±½„Û«·3uUù×—¶ù¿ÙàéÓßÏÁ̉˹ăˆŸñÚ™̣‡ŒÅӣ䫇“Íjçڹڡȃv•Óù°ñÙ©ÓéÓ¯ÈÇØÙ½Û«‚ ½9ËH¯G‹ø«‡“ÍjÏŹÚăˆŸ;8¤‡óÇׯÛ«‚ ½9êØ™‡§µØ™ÔĐæ¶Åù¿ù×½ºƒÔƠÛ«‚ ½9ÅÓëö–¾«÷Î̉ˆºùׯ!½µa¸ÚăˆŸ;ưÈÛ×ÏÔ߈—¿ƒv¤Ûå¿÷ˆ’Çêö‹Üư‡±ù1›vÛÀ­Ä÷‡÷‡¡Çư‡±ù1±Ü8¤‡×Û«‚ ½9©‡¥2ßëMµ!ưÀăˆŸ;ÇÖ™‰kß [ïS½¡ÁĐø±»«»ăˆŸ;·ÆÑẰÓÙÜËÉ9™‰kß [ïSơê廃¾‘ơÄÙ÷Ú½€­½¼‡x…Ö…›Û¯ÈœÂƒv·ÅăˆŸ;öå̉ ÍƠÑÓ·ÔƯº‚v´aÁĂù×°”ƠÚÛ«‚ ½9ơÔøêɇăˆŸ;ª¶2tTư¤ÈÇŽËÉ9Û«‚ ½9ȶÏÔËÓ¡ÈĂëöƯ¾ÏÄÔñÆÏÔ—Öͼ±»ÿ¯¶ÅÁ‡ºÅÓơê¹Ú9¥‡߈Úª‚ +¼9†xÓ½ëöµØÁƯ‘÷ÀÛÏ̉Óº·ÔÿÚÍÓßÖăˆŸ;™‡÷Áù×™‰kß [ïS«ÔăˆŸ«‡“Íj½̉Æ“Æù×ƯÓ ëöƠ±»¡»ÍË)éÛ9¥9¥‡÷Á™‰kß [ïS«‡“Íj«Ô™»Ü™ĂƒÖ™ºăˆŸ;×Úù×¢ÇÏÅ‘£÷ソ‰ͺÛ«‚ ½9ù×ưÀÁ¹Ú«‡“ÍjçÚ¹ÚÑÓ±»áê­Ô¿Û«‚ ½9̃ˆ¾ßH½̃ÿ¯¶Ë%×ÂÛ«‚ ½9߈߈¿ÏŽ£Ô±»Å–íºßÄÙÙu÷Ùôív9¥‡›¾ÙÅëÚª‚ +¼9©‡¥2ßëM—ˆ©-ù×½Óá=ô»ĂƠX£‡߈Û«‚ ½9âˆ:™‰kß [ïSÏÔÍÇߌÛ,å̉ ëöĂÙÙ½‹øÓù×ï»å×ĂÙź«‡“Íjù¼¹Ú›¸÷ÁÛ«‚ ½9äƠÛ«‚ ½9߈½öÁÍÄĂÙ§Ö¹ù™‰kß [ïSùׯØχ‡ŒéÚĂƠƒvƒÖÅô°» ́v߈ñÚÅØ·Ó ¥0…ÖØºØ½ĂßÄÙ²%™Ă߈ĂÙù×·¾ëöù×íêÓÅ‚§ô“Ơø±»ϺÛ«‚ ½9é‰ñ5ñ·߈µØçÚøêÛº±»ĂÙáê²ÆÛ«‚ ½9Å£ǽ€ÿ¼ÙƯÚª‚ +¼9ƯºáăˆŸ;߈߈Û«‚ ½9̀Ó^“ƠăˆŸ;ơÔñ~ßÄÙ£éù×Á½ưÀ™ºÏÔºÁ³È³ù×ùê«ÔÛ×­½¼·Åƒ¾‘çÚ¥ˆ]1¼€ÍBƒv™‰kß [ïS¼ƯÓ ÙÅë«â±»¬ÄÍ—¶Óº߈Û«‚ ½9é‰ñ5ñ·êç߈â«ÔÙÚ̃ˆ°»ÖƘ‰j̃ZîS«Ô¯ÛˆƠăˆŸ;±»ÍË)éÛ9¥‹ÛƯơÿ¯¶ÈĂ₫®¶Ûº˜Ôëö߈ù×™Ôƒvå̉ °»߈¹̃Ă‘«%ỞëÖ߈±»Û×ă»èê “ƠÅÄăˆŸÿ¯¶¯Ơ™‰kß [ïS™ơÛ«‚ ½9×9¥‡˜‰j̃ZîSÛº£ƯïÁ¼ĂÓ¼ÚÀù×ûØÙ½ß„ĂÙ½ăˆŸ;®é¥ØÙÜÏ̉óÂåơÏÅÛ«‚ ½9Û«‚ ½9­¾̃„Ơó—§Í»«‡“Íj߈¹Ú©¼ÅÔăˆŸ;kßÖĐÓáçÚơê‹Ç⻫‡“ÍjÏÔ§ô™‰kß [ïSÑű»¼·Æ—ÓñíȨ‡¤2€̃êL߈áêƒØơê߈‹Ù÷‡öÁ ÏÔç̃óÇ‹«-‘Ë¿Á‡é/×:×ÜñÚÙÚ½€«»9¥‡ÂĂû¯ÈÁĂăˆŸÁëö×êăˆŸÛ«‚ ½9Éîùë·ôưÀ¹óª¶2tTµƠÙ½°»£ä—¾éӣܷ¼Í7±»÷Ú•¶ưv£Ô÷Áÿ¯¶±»ÅøÛ×ăàØYÏÄÚÀ߈ǺÏŽç9¥‡9¥‡Á¹³߈‡]™‰kß [ïSé(÷›ÙÚ½áđ±¿£ÇéºÁƯ×ÓëöÿÚ·ÔÙ½ÏÅ̀ÓÄÓÙ½ÏÄƠÄÛ«‚ ½9£ÇÏÔö̉߈Û«‚ ½9ÅÓ©‡¥2ßëM½Ë̉ñÓ™‰kß [ïS߈ëöÓ¾§ÔöĂăˆŸ;å Ù½ù×ù×ÍÓËǧå̀ÇƯ$µØÁƯÁ×ñÚÛ«‚ ½9¡Û‰ơơêÏÅĂĂÏÅëöÁƯ¯G‹ø‹ÇăÇíÓº°»ĂÈÔ¾FÛ«‚ ½9ĂٙԽܫ‡“ÍjƒÚٽ퇷Åĺ £Ç°»¹ƒØöô¶ + +¡ÁÉ÷‡ù׺Á½ßçÚß̃®×Ù½·Ó ¥0»ô‰»ï‰ïßµØÀ½ÓØ“Ơ’¹ÜN¡ÛÏÔ©¼±»ö·Æù×½˜‰j̃ZîSù×™‰kß [ïS‡ÇƠXÛ«‚ ½9±»Ăîº9¥‡‰̃¡ÔψÙÚÑØ‚Ø—»«‡“Íjß»ûÙ½™‰kß [ïS‡x‹Ç‡×‡ƯΈ‹Üù×­ÖËñăˆŸ;¾ÆùëÛºöÁ³·‡‘×8ç÷“ÆăˆŸ;¿́ó¶±»óÂëöG½¹µÁcסԷ؛¶é¹¹¼9¥‡߈º$ù×™à•ÖÏÅÙ×»c½ÏÅ›¶é́vÏÔ¡³ơêéăÏ̉¯È‹ÙưÀỰÁô!ÏŜܕÖèê¡ÔƯăˆŸ;k¡ÈµÛ«‚ ½9ß»û±»ÅÁ¼ĂÙËÉ9Åô®¾£Ç±»ÑÓ߈Ù½íÆÙ½ƯºôĂ٣ؙ‰kß [ïSÓÅ—ÖÔXÁ¹óǦ¹ ƯÓ öÇÖ•Ç“£Øçô±»¡ƠÛ«‚ ½9ö¡È߈ăˆŸ;k™Óƒ—Óºº—¶ÅÏÅÙÚÛ«‚ ½9¾ÅƯÿ¯¶¥ăˆŸ;ÖÙ½™‰kß [ïSÅÓÛ«‚ ½9ăˆŸ;›‡¹ÚăˆŸ;ÏÔ£ä¹ïÁĂÛ«‚ ½9™‰kß [ïSÛ±»ÊÓ‡x›¾߈£»߈ï₫ÏÔÛÄӃ׿‰û +ăˆŸ›vơ꫇“Íj‹Ç¾·ØÜ߈ÛúƠÛ×ăˆŸăˆŸ;ÙÚöÁ ˜‰j̃ZîSÛ×ëÓÍÓöáêÛ×ÿÚ߈纇«µ÷̉ÇÖ±Ư·ºËǽôÑÓÀĂ߈ÏÔß»ûú¶Ÿ¿Ïԇ׫‡“Íj½÷Áô™‰kß [ïS¯G‹ø ËûÏÅ9¥‡ÛÓ¹ÚçÚ‰¿I¡«™‰kß [ïSß»ûŒEơÔơÔ߈ơÔºÁÚŸ®Gøù꽩ƠË̉óÇÛשŒ“½ƒvĂ“Æ©ÇÛ߈«‡“ÍjÑÓªÚ³ÏÅ ƠÁ¾Û«‚ ½9ÏÅ×±»ÛÄÓµØñÓÀÙ•Œ¯ƒßͯ¥'=U#QK¯ÂưØù׫‡“Íj߈߈ăˆŸ;µØ™‰kß [ïSưÀ±½߈ÏÅີض  ×Ưá ¡öÁ½Ă›Ơ¥‹ëöá ÅØ›¶é›¾ëö±½µØÎ̉ÙÅëÛÔçÚ©&ÏÔÅ»ñÚưÀó±»ÛÔÏÔưÀùêưÀ¨ØÙÓ˜Ó‘g™‰kß [ïSù×ÿ¯¶±»™‡¿‰•ÜçôÛº«‡“Íjç߈©ØÜ÷ˆ‡ŒÙבƢôơꇫ‡“Íj½Ø™Ô›¹ívăˆŸä̉Óº̀º8¤‡ÅØ¡´ÙÚ­ÔϺ™‰kß [ïS±Á™ëéåù×9¥‡̉Å™‰kß [ïS÷ÁÇÖÛ«‚ ½9ù×Ơ¸Ë̉ó¶ö„µ†áÍ»‡©ÓÍË)éÛ9¥щ«‡“ÍjëöăˆŸ;ï»ÙÚˆ·ưÛ«‚ ½9Á߈ưÀÙÚñÓ8 ¤‡ Öù×¹Ú¡Á¥Æ•%剫ÔƠµêÁщ÷ˆÛ«‚ ½9‚vµ†½ׯÛ«‚ ½9™‡₫ï»Û«‚ ½9‹Ü™ÓÏ̉©‡¥2ßëMƒ“ºÙÚ™‰kß [ïSåĂƯÓ ¬ÖÙ̉Ă«Ô¾½Øö®ÈăˆŸ;¤È·Ô™Á½Ñæñ9¥‡µƯ“±ƒˆƒÚå×—Ó£äăˆŸ;™‰kß [ïSƒvÙÚï½ëö8,¤‡,Ö Ç̉Ơăơ㻓ɓƠÂÙ߈߈Û«‚ ½9ăˆŸ;»Øáö·ÔƒØ߈›ĂƒvÛ×ù×躃v¿ô÷¶ƒv¿×¸Ú¿»™Á߈ÄÓ™‡Ă½¹Ú½‹Çƒˆ÷Úù×₫­Öªd +™Ô߈£ÔÉ̉¼Áƒvù×™‰kß [ïS¯È¡È·‡‘×8ç™Ó·¼Í7ÁĂÑØÍÓĂÈ£»8¤‡±»ù×ËÓͪ»ˆ‘Ú™Áù×ÓëÑÄëÏ̉½€‡Œºô»ÈÏÅéÓË̉«‡“ÍjÇÖ½Ơ‘ÆăˆŸ;Åô£ä9¥‡íÁÏÔ±»«‡“ÍjơĂâˆͼÀĂ™‰kß [ïS™‰kß [ïS”ÙסÛ׃vĂÙ‚vÑÓ¹ÚŸ»ÏÔĂÖ±ëØ‡§Ô™‰kß [ïSĐĂẲơê±»©‚÷ÁÑó¦ô—»‡ñ5ëö±»߈Ù½ù×ÙÅë·‡‘×8ç¡%̃ŒÚ,ÙÚ¼€9¥‡¯È™‰kß [ïSÅÓ«‡“Íjéơív¯×³9¥‡×›Ú¸Úô÷Ûù×ëö߈½ØơêÏű½ÿ¯¶ß»ûÑÄë›¶é Á߈ĂÙµÁÙ½éÓ³Á½ư‡±ù1¿‰ĂÙƒvăàÏÔ±»ÍË)éÛ9¥™‰kß [ïSƯÂåÁÍÄÓØÛº߈·‡‘×8çÁ…p¿Ó¸Ú +Ïß«ÔÅăº›¶é“ƠÿÂçÚ«Ñÿ­ÚÚƯÂöƒv“ÆƠ«Ô—Ú“Ï̉¯È›vĂÈơêºàê‰ÛçÚăˆŸ·Ó ¥0ÂƠ¹ÚƒÖâá ÿÂĂÙ±̉ƃv«‡“Íj×ƠÙ½ăÇíF¼¹¥Ø¯È™ơ«‡“ÍjùæĂ ©‡¥2ßëM‹ÇƒvœÜË%½ơÀĂ9¥‡×¡ÔÅӵؙ‰kß [ïS™ÔŒˆûƠ»yµØÙ½©‡¥2ßëM̀ǹÁ—Ó™ëéåơêßƯ‚·‡‘×8çäôÈẶƒ8¤‡×Û«‚ ½9Í|ĂèùêÛ“ƠÓØ½ĂµaåƯ©‡¥2ßëM›¾Á½©ÏÄƠºmÛ«‚ ½9Ǽ̉Æ ÓÓÏÅ“ºóµØơĂÓÔĂ©ñÓÛºĂÈÏŇŒµØϼ™‰kß [ïSéJé‰Ó5“gesÁÅí֮ƵØơĂÑó—¶óÇăˆŸ;±åÁ8¤‡×§(“ƘÓư§‡Ï«Ó½ëö—Ó‹ÇÿÚƠËÉ9™ơÁ‡é/×:Û«‚ ½9ÛºÿÂßÄÙ%±»©¾ׯ‡¼ÔÑÅĂ ÙqÛÿ¯¶ưÀ½©Ç™‰kß [ïSăà›¾ÏÔĂ'ª‡’̀jƒv°»÷‡ÅÓÛÀÏơ©Ó±»ơăˆŸ;ÏůG‹øˆÛß±»Ă$½¹£ƯơêÏ̉Ç̉ÖĂ!‚vñÓêö®ƠÅÓ©‡¥2ßëM‚vÏԩǼԃvÛ×ăˆŸ—¶ùêƒÖ±»é꽇“‹‡Œ´aÅÔƒˆ“Ơ½«‡“Íj™ơÑÓÙ½߈Ï̉­ô™ĂÙŒë*«ñÁ¨»ôóÇщ°»„ÙÅëË%óÂỬ™‰kß [ïSăˆŸ;ÏÔ±»‚½‘Æÿ.ûÅØ±»úÖ“Ơ±»¯È©ÓϺ¹Ú©‡¥2ßëM¶9¥‡ù¿ÛÄÓº«‡“ÍjÍ̀ÂÏŵØÛ×­ÖÏÅÛ­v߈°½½ô™‰kß [ïSÏÅÙÚ‹ÈÙ½ׯ°È€¡ƠµØÛ«‚ ½9шרå×Û«‚ ½9߈ÑÓ9¥‡̉ÔưÀËֵؽ³’߈éÚ™‰kß [ïS±»™‰kß [ïSÇØÅÓóÇÄ–8¤‡ÖÏ̉Åâơ™‡ÓØù×Ù½́©böÔù×£Ư›¡ÂÆ6ƒ½«‡“ÍjÙYçôÛ«‚ ½9êöÛ×µØƠ™‰kß [ïS«‡“ÍjơèÅù×ºŹ»Å‰ø½“Ơ™‰kß [ïS¢»F§ƠX×ܘ‰j̃ZîS±»ƒêƼ—¾›¾‹ÇƠµaáÛ±»ÁבÆçÚƒvºØ߈ÏÅÙÛ÷Á÷Á­µÛÇù×ù×±:ß»ûơÄ™‡½ÊÖ›¹…ôƒ¾‘ͽÙ·ŒưÀÛÙÚ½€ׯÁƯµa߈ÿ¯¶̀Ó«»­å߈Û«‚ ½9ưÀ«‡“ÍjªĐß»û£–°»‘ÍÓơñ—¶èº½³ưÀ›¶é½€Á×Ëk«Ô‹Ç‹Ç§äƠ‡ÛÄÓ“ÛçÚ¯Û£äơÔÆŸä×€ëö±»ŸÖá ÷Á±»¿ĂĂ ›­±àéM÷)óÇÙ×½ù‰‚±»·ÅÙÚÏÅ„¹½©‡¥2ßëM…ö߈ív˜‡±»éêơêăơñÖ·Ó ¥0¯¼ÏÔ›¾ÏÅÜÛÙÅëÿ¯¶™‡ăˆŸ;ƒ¾‘í‡ơê…Ôă½á —¿¥ˆ]1ă#¹ÚÏÊ·Ôív°¿É̉™Ó›¾ÿ +ûØÛ«‚ ½9ßÚăˆŸ;ÙÏÔ³§Ó¡Á¤ˆ\0µØÛ«‚ ½9߈ëöÁ½ëöÍÓ™Ô³Âö‹Çù׺‡×¥ˆ]1±»ƒĂ‹È®¾ỞÁ̃ÍÄ¿‰̃ˆăˆŸ°»ơÄ«‡“Íj•Èû›ËÇå̉ «‡“Íj£Áëö‚vöơĉ¿I¾±»Ơºmá¾ëö™‰kß [ïSÿÚåÁăˆŸ;‡ºÿ¯¶̣‰ơ‹Ó±»}±»ăˆŸ́v·‡‘×8çÿÛÿ¯¶çÏÔăÇí›Ú‡ŒØɇäô¹Ú剅۫‚ ½9çÚ㻫‡“Íj±»ÅÔ«‡“ÍjÏỖˆŸÖŸÅÁƯ½ƠËØÛ«‚ ½9‘àÛº«Ô½ÍË)éÛ9¥Û«‚ ½9߈ß„¾Û«‚ ½9µØÉ#°È˜‰j̃ZîSƒư½í‡ÁƯÁ‡é/×:ƒv́ÚÙ×Û«‚ ½9½߈ׯùשÓó½ûƠ÷å5Ó·‡‘×8竇“Íj›¾ƠÏÅÛט‰j̃ZîSëö—ᙉkß [ïS±»ƠXưÀ¹ÚöƠ±»µa·‡‘×8竜̃ˆ߈ëö™‡ĂÙ߈ĂÈÙ×Áù׫۪‡’̀jóÔçÚëöơ ÏÔùê±»×Üù×¥ºùêÏÔ©¼™‰kß [ïSẳ߈ÛºÖÔ†6¦j”%ÏÅÿÚ™Á¥ØñÆÏ̉éêăˆŸ;߈û¶Ơ©Óí¥÷ÁÛÄÓ¿‰ Á +½íؿףXÙ½¹àçÚ±Á׆ºÏ̉±»ơ꛹ç'±¿ĂĂ ›­±àéMƠ»q9¥‡§›ưÀ¿ºùê—ÏÓ¾ÅnăÁ߈©¼ơê±»à¹ÏÔ†×÷À­Ä™‡¥ ¶èçôÿ§Åwà¬óĂ«‡“Íj›‡»›»ÛºÙ‡Ï9…߈ÅÔ†aÁ|ßÄÙ¡Ơ”ÏÔËƠéơ錡۳ÂÍÓ›¾½€ĂÙƠ»Øơ‡¹Úù×÷‡ÄØívëö™‰kß [ïS©%«Å“Ûû̉Ù½ăˆŸ¡È¾ß߈ëö­»È±»¥̃߈œ‰¾IùÛù×—¶ù×ăˆŸưÀƒvŸÈăˆŸ;·Ô;™ÓñÓÚÀª»Ù½Ùqºëö±åơê×¾Ï̉ĂÙÑÓ¹Úۯܙëéå¹Úáê«»…»ôÁÙ½÷ÁÁ‹ÛăˆŸ;kÁĂ«·3uUÇØ·ÔŸ}‘đ°”ëö†÷“ÇùêĂÙ8¤‡ÖŽË̉Û«‚ ½99¥‡ù×ÙÚËÓÛ«‚ ½9«ßÏ̉¾—¶¡ÔÁ߈™ơ«‡“Íj¹©‡¥2ßëMƠăˆŸ;‡Œµa±”™UŸĂô·Å÷Ô—¿ÛºɇÙÚóÇרŒê*ªÏÔ¡Á»½»Ø߈Ó¢ÑÓÓ¾‡³Èƒ¾‘¡Ô߈ÂÙ™‰kß [ïSÛºăˆŸ;Ă¼­ôù×ĂÙ•Èû›Û«‚ ½9ÏÔÍÓ›Ú«‡“Íj°½9¥‡ÿÛÑÓ»ˆÏԡȬÖÙ½°»½Ă™‰kß [ïS±»±»Û«‚ ½9ÏÔ½¡ÈÛ«‚ ½9ƠÚöĂß½ôĂỞŸçÓØÔó›¾ëÚÅÔÓgû ÇÖ©ØÏÔ©%‡ŒưĂôê¹Úù×ô…ëöº«ÔưÀº9¥‡¹ÚŸ}ר°»±»߈±Ưº9¥‡×«‡“Íj•ĂÙ°»Ñر¿߈ÏÅÍÄù×́ù×ó¶9¥‡ëöÏŹÚßÚïÁª‡’̀jÜÏ̉£‡Ăº9¥‡àØƯÓ –ˆÙگױ½Û«‚ ½9²ÆÙÚ«‡“ÍjưÀ˜‹‹ÓÙƠ³ôǺ߈…»¹È´a¿×ÚÛ«‚ ½9—¶¾Å9¥‡×Û¾ƠàƠÛÄÓ±»¡Û™‡ăˆŸï½™‰kß [ïS¶¸ëö³ÂÏÅ©Øÿ +ó¶ù×·‡‘×8ç̣ ›Ă©È™Ă‹Ç¼Ă½©¾¦ÈƠƯ˜‰j̃ZîS¿º¹¼™‡«‡“ÍjÙÚÇÖù×ÎÅăˆŸƯëڟű˱÷Ú‘‰«<á ŸƠáÛ½G½¹†ºvù¿ÍÓ‹Ç×Ơëö÷‡Ăº¹Ú߈›¶é·‡‘×8ç9¥‡½Ôû؃v½€£ä›vÛ«‚ ½9ëö½äƠ)ư“Œ₫£»¡Ơß»û‡ºóǧÔăˆŸ;ké‡Ơ‹Ù—¶ÁĂăˆŸ;ƒ¹Ú™‡‘€¸ÚÅÔ߈·ÔÙÅë Á™ỘÇ߈—Óùꈛ¾Û«‚ ½9߈‰¿IŸ}ÏÔ½€ö«ÑÓØƒvÓ ‹›æ¿ĂÙµô‚v™‰kß [ïS¹Ú¯Èùꃷ ¸ÚÛסØÁĂ»Ø•ŒµØóͰƠÚçÚ¥ØăˆŸ½ĂÅÄŒ¾ÑÓöÔéÚ…»ÅØŒê*ªÑ·ïƠ¨¼Û×Ô½ñÓ÷Á“ºÁĂñÓ›¾9¥‡Ổçô÷‡©‡¥2ßëM˾Ởûعàôê÷‡9¥‡Ù½·Ó ¥0«â¾ù×ôÑÛù×÷Á¡Ô·Åäñ½щ—»±»çô¡Áå‡9¥‡Ởô½€¹ØÏÔíÆ£äÑÓÿÚÙÚ¹Úµ‰¥Û%ÏÅ«‡“Íjñ̉ƯÓ öÁÍÓÏÔ™‰kß [ïSÏųûØ£äÛº‚ÖƒvëöåĂăˆŸ;ـ䵷«»ơꙉkß [ïS‘Æá Á±»«ƒơèÅăˆŸ;ïÅÁ¶¿‰߈9¥‡×ÛºăˆŸÛ«‚ ½9ơêׯ“ÆĂĂ™Ôͺ»`±½¦Æ÷å5Ó±»áØƠÁĂß»û‰Û¯ÈÑÓÛDûÙù×èӵث‡“Íjï»ÏÅ̉ƽÇ^߈±ÁăˆŸµaëöơêÏÔëö÷̉¶èåÁ§Óƒv »8§¤‡§Ö'¿‰Ù½½Ă¼½ïÅßÚÁÛ÷ÁßÖ«‡“ÍjÁƯáÜơêÛºƒˆɱʹ‡Çá ÈĂ™ô‘ÛÙÚÓØYùꩇ¥2ßëMÏÔÛ«‚ ½9ºƯÔËÔóÜ™‡ùæ½à…ÎÔƒv߈ÄÓÓÅ߈›¾±»·ÊăàöÏÔ…ô9¥‡×ưÀÁĂ÷£ÓØ»n±»ÏÅĂÙ‡aø×́ÆÅ؇ǡÁ™‡»ÔÏÔÛ«‚ ½9ơê·‹ăˆŸ;ÏÔƒÚÿÚơ‡Ä9¥‡Ă¼±»ĂÙÙ-‹ÇëÚÛ«‚ ½9êƠTµØ—¶óÇẲ›¾·Ø©ÓỨ÷Ù¾±»ăˆŸ™‰kß [ïSÏÔÿÚÏÔơ₫Û™ơÿÚщéÜăàÿ¯¶ƒvÛ×™‰kß [ïS«‡“Íj¼¹ÚרÍå™ÔÛˆ©Çơúç̃ÙƠƒÔ¾¹xƠXăˆŸ%‹Üÿ­ÄÿÚÛº…ŒÙŒë*«Å£»ÎÔËÖíví瘉j̃ZîS™‰kß [ïSøôĂÙÁƯÇÖ«¼ô}ŸÖ·ÅóQƯÓ çÚÅÛ«‚ ½9ÏÔÑÓ›¾9¥‡×›¾ÅØơê›ĂưÜư‡±ù1ø×ă»ô¿çĐŧÆéêå ½€ï½çÚÿ¯¶™‰kß [ïSͼ›¶éÏÔ½€ù×ăˆŸ÷Áß»û‚vưÀ±́êö%›Û¦È#§¹Ÿ•ăpëö½©ÇÓ¼ÑØü¦†ÂµỢÇ̃ÁÍË)éÛ9¥§Ó»$‹Ç‡Œ·ÅÄÁ©å̉ ̃„Ù½‹Ç­ÄöÏêăˆŸ;é‰ñ5ñ·ŸÈăˆŸ9¥‡«ƯÙŒë*«ĂÙ•ŒÔÅï»ĂƠÄ…Ö¡Ô£äø×,¾߈ßÁù×ËÉ9ƒvÙÛ«‚ ½9«ÔÅÓºó“ƠƠé꫇“ÍjƒvºĂ¼ƒv«Ó«‡“ÍjƯßÙ½ÅØƒÖç½߈±»éºƒv°¿ĂÙ×ưÀªÚơêÿ¯¶£é߈ÏÔß»ûÁĂ³ºó­¶ĐÅ «Ôơ÷ÏÔÿ$½Üđ»ÁÂßÖ°»¿ôùê·ˆÛ«‚ ½9™ëéåÑÓÛ«‚ ½9Íœ‰¾IÎ̉¯È¿‰­Öù×Û«‚ ½9ö̉ÁÛ«‚ ½9ù¿Ç¾×₫®¶ơÔôŘêèäǼăˆŸ;†Ú ºÏÅù׉»±»ĂÛ«‚ ½9߈í—G¹Ú™‰kß [ïSÓ¿‰ŤăˆŸ»åËÓù×éÚ­ÄÆăˆŸÙÚ½êöÛ׫‡“Íj£ƯăˆŸ;½ƒ™ô‰¿I¥Û×$ƒ«‡“Íjơê­_÷ˆ›¾¾ƠÏ̉÷ÁăˆŸÑÄ듘ÁĂ÷Ùí—ǴvÏÔ߈—»ùêÔï»÷‡÷Á™‰kß [ïS½߈÷ˆ›¾ÅØá ±»ăˆŸ‡Û«‚ ½9ûƠáêÅô«‡“Íj”½ +ËÉ9êö™Ó±́ƒv«‡“Íj‡¿ŸŒöêöë×™‰kß [ïSùêÙÚăˆŸ;k‚•́±»íºôœÁñc¸•¿‰™‰kß [ïS¯Ăâˆ:³Üæù¢ÇÏÄùê±»ë¼íÖÿ¯¶ƠÚíåƒØ¡Ô÷øăˆŸ;kÅ»å‡ơ‡Û¥ºĂƠ¶è‚véûƠ·‡‘×8ç¯È߈ÙÚÏÔÛ«‚ ½9ÔÅÓ½­¾½‡ƒÄͽ»ØÆ»ñÖ«»ºØ®Ü÷4ÑØר›ÚăˆŸ×2ÅÁƒë‡Œ·‡‘×8çơÄ™ëéåÛ«‚ ½9µØ“ÈơêÇÖƒvµØù×Íı»߈ÿ¯¶Ù½ËÖ‡ŒÇÖå̉ ½ơÔẶÇ™‡ÛºÚ׃vÙ½ï½Ñ™ëé噉kß [ïS» Û½·̣¶å̉ ¡Ô߈›¾ơû5Ÿíù×ăˆŸ±%ëö˜‰j̃ZîS‡Ç­ÄÀÙƯÓ ăˆŸ;™ơ›Á¹©ÀÏÔØ×Û«‚ ½9ÏÅÁ½³Ú̉³ÂåªÆßÖÈĂ¡Û©‡¥2ßëM¾ĂÙ纵Ø̣Çÿ¯¶§ÆăˆŸ;Û«‚ ½9߈Ö¾“÷ÁÙ½ÁĂÀ¹œÜÓÛºûÓœ̀ĂÓ߈Û«‚ ½9«‡“ÍjÇ»§ổÅÙ½«dñÓÁÑĂö‡ºßÁ‹¡È¡Û¥Ä±»ÎÅà öàꪺÏÔƠ¾GÛ«‚ ½9‰ÁÙ½ÓÆËlÛ×¹ÚËÇÍË)éÛ9¥Ël‡ºÆô߈ÅØÅù×·Ôö«‡“Íjëöñ˜Á©-í¹Í£XßÖöĂ«‡“Íjؽ¬ÄÛ«‚ ½9ÏĪ́ƒv¥‰ÍL…¡È߈™‰kß [ïS¾âÂ3 +·Ô©ˆïÚÏÔ…öñÚƒ½ƒˆ¸Úăê–ŒY™‰kß [ïSÍÄÙ½ßôéÍÙĂ½±º»Ø×Ó™‰kß [ïSÛ«‚ ½9Û«‚ ½9Ï”¡È郾‘«‡“Íj«‡“Íj»ØëöÙ½ÙÅë¥Ó߈íếØ̃»úɇĂÙĂ Ï¹Úƒ½ƒÚăˆŸ§Ó±»«‡“ÍjÑÄëÛÄÓ™‚¬ÖăÚăˆŸ;ăˆŸƒ½á ĂÙáÛ÷ăˆŸ;ơêÛ«‚ ½9±»“ƠÅnØÚ­Ö¹ ¹ÚÙăˆŸ;…ùëöƒv߈«»ù×₫۶œȜ·̉ ¤0»„ÇßÚ» áÙ?¡M-ËơÛ‹ù×!#¹ Ơ ×Éùư • +‡¹'ư¥í«‡“Íjơê°¿Míơ“È›¾¿‰ĂÈ™‰kß [ïS¹Ú¿‰߈ưÁ·‡‘×8ç…»ơ꣇™‰kß [ïSÏÔÑÓ߈çÚ߳ǻ²È‡Œ­º™ÓÏÔ¾߈—ˆóÂÅàåƠçØ½â»§ÓöÛ«‚ ½9¡Ôăà“Æ¡»¾ùל‰¾IƒˆÙßÄÙ£Ôíê˜Ô“Æ9¥‡×éꔽǼù×¼ƒ×›¾Û«‚ ½9߈§Ôă‘·ÁưÀ½Ô¯ÈûƠËÇô ơâÍÄÛ«‚ ½9ơĂô›¾ă¢ưÁù×ăˆŸ§ÆĂ©‡¥2ßëM߈·‡‘×8çăˆŸăˆŸ½€̃ï³2µØ›¾ĂÙÏÔÙ׫d·‹ƒvŸí…ƠßÁßÚÛ«‚ ½98¤‡Ö·ØĂÙ©Ç©¼°»‰¿I±»ÑÓÍÄăˆŸшëöÔXơê“Ơ™Áÿ!—¶±½á=»Ø³ô½€«‡“Íj Û­Ö¥ˆ]1ÑÓÛ«‚ ½9ĂÙÍË)éÛ9¥±¿ÏÅơêÙ½£qٽٽưˆÏÅưÀèơ“¼̣ù×úuƒvォ·3uUË̉ƒÚ½ö‹ÇÙÓ±¦¹ +ơÔ±»·Å²îº…å̉ ½€¾½±¡¥ƠÓ%«]áê8¤‡Ö™‹£ä“Ƿű»¾‹ÇôŒÉ ù¿÷Á÷Áù׫Ô˹9¥‡ïƒàå¿á ¹Ú™‰kß [ïSÅØÙ½”˜‰j̃ZîSÏÅ«‡“Íj¿‰ÙÚ‡Œ§â߈óÂù×µØÁ̉Åô°»°»¾¹ —ˆ±»‹Ù‰Û©ÓĂ«»ÏÅưÀ¶ÜƠ—»ư§‡‡ŒÏÔ¸Ú÷ˆ߈ÿÇĂÙÅÓÁƯù¾ơԧƃvƒÏÔƒvÛ«‚ ½9™‰kß [ïSÖĂ,9¥‡±ÜĂ߈ơÔºăˆŸ;3ưÀ¿ßÎÔ™‰kß [ïSÀƯăj¡Û÷‡âàơÄ•%±»¡Û‡ÜÍÄù×­ÄÑÄëƒØ›¾‹ÇÁ¹ô÷‡™‰kß [ïSöÁƯµaÊÈ9ëö•¾ψ“ÈáƠùס߫‡“Íj©-«)…÷ˆÿÚÅϱƯ·‡‘×8çùê°»©Óƈ +¿º¼ù×ưÀü Ûº¾߈Û«‚ ½9—¾±»÷ÚÉĂψå¡©‡¥2ßëMƒvÍÓ«Óèꙉkß [ïS¾‹ÜѶăˆŸ;kï»ơ»Á÷Áøêׯ™‰kß [ïSĂÙñÖÙ½щ™‹£»í‡€ÄÛÄÓƒÖ…¥ÛÏÔÿ…Œ߈¹Ú®¾±¿‚ă½YăàĂôÓÅù×âˆç®ßÄٓȱ»ùדº»Ø÷Áù׫‡“Íjù×à=ĂÙóß»ûÏÔ9¥‡ơݻۺÏÅËƯå¿…Ùƒ½¾߈ޱ»«‡“Íj³Æ—¶‰Û†¾ÏÅÏÔ«Ôơꇌ9¥‡Û«‚ ½9‹Çƒˆơê₫®¶å̉ ¹̃ª»ơèšȱ»«Ô÷Á¶ÜÏÅƠ§ÓåƠ½Ñͼ±»ñÖ߈ĂÙá¹Ú½—»æ±»½‡º×ƠĂôÓØ¡ß߈ÁƯÛ×ÑÓÏÔщƠ]½ëöÇÖÙăˆŸ;kÏ̉ƒÔ÷‡µaíÖăˆŸ;߈ñÓ9¥‡âÂ3÷Áºù×9¥‡Ăº—Ö!ÏÍç•‹ÛË¿9¥‡×™‡±́ÏÔªdơԵȭÄ߈ơê·ÅăˆŸ½°»ͽ¯Èơ¶ívÛºÛ«‚ ½9/«‡“ÍjơêǽívơêÛ«‚ ½9àêƒàóÄôêơê÷å5ÓÁñÄÙĂù×›¶éÛ«‚ ½9¡ÈĂÙÛ«‚ ½9óu߈ÍÓưÀ9¥‡ó#íêùê©óÔ«Ô£‡ñÖÖÔ†6¦jëö±»•Œ·‡‘×8çºgŸä·ÔĐÄê¹ÁưÚĽ†Œ£ä÷‡áÛ¸Ú§‹Üùë§ôëöỞóÂÇÖ9¥‡×ù×ɹưÀ÷ˆóÇÙÚñÚ½€—»ÏÅñwù×·ÔƯ¯¡ăˆŸ߈ăˆŸ;°È¶ØÍÓ8k¤‡kÖ ‘ÓƠºmĂÙ“2§ƠÖ¼îƠÛ«‚ ½9™‰kß [ïSÙƠÛÅÓßÁá đÓ÷Áÿ¯¶±»—¶©ÓÙÚ·‹ßÄÙơÔưÀƒvÿÚƒvƯÓ ŒÓ™‡§ÓÁË“Ơ刽˜Ô±»¶×¾½¨¼ÏÅƠÅÔ™‰kß [ïSÚª‚ +¼9ÏÅÓÔ퇙‡Ẳ‡ŒÁO½­Öß»û‘±Û«‚ ½9Ï̉ĐÓׯ÷¼µ†߈á=ñÛǙéÓÅ…ÑØ¹¶Âàë™HÙ×ù×§Ô½óǡȇk‡Œ½±»¯ÈñÓÑÓ±½¼Ô¹§ÿóĂÍÄ߈ËÖäÁƒ½ÁƯ™ÔëöăˆŸ¡Á,¾ª¶2tT„»ƒvÛ«‚ ½9³½«‡“Íj«‡“Íjâˆ;ö™‰kß [ïSÜÀá=“Ơ‚ñÚÅØăˆŸ;»ỗ“Ñ÷Ơù×ăˆŸÁ×…Ú½ôẲçÚëö¿ÙÍŃˆÏÔ›¡³(¼Ô™‰kß [ïSÇ"ßÁ̃ŒÚ, åôá=߈÷Á™‡™‰kß [ïS±»£äµØ¥ˆ]1Ăȧԩ‡¥2ßëMù×ï»ùæ«»ăˆŸ¾ûà ăˆŸ;¾™ôÏů§ô™ëéåá ‹Ç¥ºơê±»»ˆ¹Ú¹ÚÙ½µ!Ÿ}éÓ¶ăˆŸ;˜‰j̃ZîS“ƠÅ–ƒvö½—»±»÷4‚vç½ÏÔñÓ™‰kß [ïS‚v…ëö»ĂÁ½ơÄÙÚ9¥‡§ºéÚ«·3uUÙ̉ÛÀóÂÁ½₫Û«‚ ½9çÀÙ½ăˆŸ;éÓƒˆ‹ÇăºçôÛÇÏÔº›¾ÏÔ÷ÁÙ½ơ꨺ +ĂÙÑØÎÅ«·3uUÏ|ĂÙø×ù×߈‹ªºÖƇŒÅÄ™‡ÑÄë±»á ñíÈרǼÑÄëơÄñªăơù×û¨¼ĂÙÁÆôƯÓ ÿÚßÄÙÇÖơê½ÂßÚù×èê÷ÁÏÔ½¬Ö»‡Úª‚ +¼9›¾ß„ǼŸÖó‡ŒÙ̉ÀÛñÓĂȳ¾„Ö±»³ñÖăÚ™‰kß [ïS…̃ÓÆÛ«‚ ½9ù×ׯôĂĂÙÅ­Ö‡Û«‡“Íjƒ»ÜĂø¿ăàùן “âÿÇƯÓ ëöŸ‡x Ơº¯ÈÛđÓ‡Ú…ëöÔXQÿ§˜‡¥‰ÍL…™‰kß [ïS™‰kß [ïS½«‡“Íj¾ƒÖÏÔ™‡å¼ §ÆÍƠ©Ü±»Û×ÏÅ̃ˆÑÓöơơÔƒˆ€º›Úù×Ö߈¡ÔßÚ’ÆĂºÑĂ£+«·3uUÛ«‚ ½9ª‡’̀jâÁÍÄơĂÍı»ƒv›¾ Ëû­ÄÓ¹Úォ‡“ÍjéÓ³°á ±±‚ˆÂĂäôĂÙŸÅ­ÈÑÓ½øçº‹ÜíÚ»ØÇf9¥‡×ÑÄëר˜‰j̃ZîSÏÔă»ÿ$“Èâˆ:Ӻߥӛ‡Û×Û«‚ ½9߈íÆÏÄ™ÔÁù×߈™‰kß [ïS¿»ê׵؇¸₫®¶¹ÚóÂÁ±»—¶Ø×©ÓgÏŵط‡‘×8ç·àçĂ·Å9¥‡çÚ‡Ú›¾÷‡é‰ñ5ñ·Û«‚ ½9¶±»ÿÚ›¾á ư§‡ØµÍÅØ·‡‘×8çáêÏÔ9¥‡Û«‚ ½9ăr½à=Žå̉ åö߈đ¯È›¾Ç»½ÔÏÅÿ$±»μ₫ÔơêÍíçưÀÅÓơêĂóÇ9¥‡“Ơöí|Ïʼní‹Ü³ºóĂ×œÜ +‡ŸÅÁĂáƯÙ½¡Û…ֳƒˆ…ÔÇ»Á½÷‡ƒ½ăˆŸ;ûÓ¥ˆ]1¡ÇñÓóǃ֕ÇăÁƒÜÑÄ뙉kß [ïS±»ÜÙÚ¿ô¯ÈÑïïG±»ƒêơï׭ăؾÓ̉›¶é˜‰j̃ZîSÑÓ9¥‡Ï̉éöÍƯŸ\¨-•kß [ïSñƤ¾QÅ™‰kß [ïSÁƯ”ÈúÙ½·ÅĂĂ ›­±àéM÷‡Û«‚ ½9×¾ñÓÙ׫ÔçÚÏ̉›¹ÏÔ§Ó¡µÈ»ʾ™‰kß [ïS·Å£(‡k“ÈÏÔ¯×âÂ3†Œ¹Úß»ûư­ÍÄ™‰kß [ïS·ôĂÈëöÅô½ÏÅŽ¼€Ơ‚ˆ·Åăè‹ÇÙÓ·‡‘×8çµØÛÀëö³–à=ï½—±ÛºûƠƠºm€ƠĂ¼ß»û8¤‡×Û«‚ ½9Ù×ăˆŸ;kƒˆöñÚÇÖµØ9¥‡¼µ‰ÿÚ߈«ÑÑÓƒÔ€º¡µØƒv9¥‡ÿÚß„‹Ü½È•ăˆŸ;ƒˆ‰º½ÑÓƒ̃«‡“Íj«Ư÷Á•Ó«Ô–¾´ØÉ ‹Ç‡ÛåÖÄØÚÚ‡Œùê¾È¯¾åĂ«‡“Íj©ºâàù×™ơ¹ÚƯÚ›¾ù×½ÈüêóÓÙ½±»ËỜĂÏÔ™ô¦º +Ở±»ù×ưÀÅÔÛ«‚ ½9ÙÓ÷Úôª¶2tT¦ÔÚ× ÁƯƒvăˆŸăˆŸ;ÑÓ÷ÁÀÚñÆñÇׯưÀ©‡¥2ßëM§ôÏÔăˆŸ;“Ï_˜‰j̃ZîS¡È²×Ôơ}‡̃„ÏÔå̉ ߈íêƠ«ä½Ô¯ÈÛ«‚ ½9™‚àÀ™‰kß [ïSµÅáƯ߈ĂÙöó¶ÿÚ«‡“ÍjÅÏÅÇƯѶ߈÷ÁàêơÔív¡Û«‡“Íj¥ˆ]1éêÑ·ưˆƠXë߈»Ă¯Û±»Ư½ÔÅÓ¶ưÀ“Û¯¼“Æëö8¤‡¹®ׯ™‰kß [ïSăˆŸ;ÑÅ·Ôå̉ Ù½ăà‡9‹ËŽ™‰kß [ïSôØ ¦â₫̣¶ƒv±»ÿÛùÛ¶ơÚÑÓ9¥‡¼ÔËÇßÄÙơâù‡—»¡Áïí߈Ǻí—Gù×G½¹›¾ëöù×Ù×̀¬HÛ«‚ ½9åô»Å¥Æ°»é‰ñ5ñ·‘ƵƠÏÅÙÚÅÀơê—»ù×µØ߈“ÈÓÅ©Ơɇ‡Á ÏÔ¡ÔăˆŸ;²ÓÚª‚ +¼9äÁÛ«‚ ½9Ù½ÓºơêÇÖ¸Ú…»¦ôéê•ÜÛÄÓưÀ߈Ûׯةdz(âà³Ù½ÏÅÅààöWÁ©Ü’È—»½£ÔƠ´ËÖëÔ½ÏÔéÚƒvÁ|óÇù¾ƒåù×Û«‚ ½9ô“ƠŸÅ½°»đ»GÁù×߈©ÓÛ«‚ ½9íÆçÚø×ÍÓ‚vƒv‡ăˆŸ;‚vơèÅívëö¾ĂßÁĂâˆ:ËÓí—Gö—»ñÓÛåªdÙ̉ƯƯëöÙ½§ôïi¡Ô°»È»ÜÓ ¯»ÿ§°»öëö½ơèÛê8¤‡ÁĂ₫ +®¶ +Úª‚ +¼9‹ÇƠXĐÄ +ê +‡Œ«‡“Íj‡Ú߈¿‰€ºÓ ‹›æÓ¾…ÚŸŒ±»™ÔÛ«‚ ½9°êØëö¹̃‚v™‰kß [ïSë×ẾÏÔ߈™ÔËÁ¹Úóǰ¿̀Ê)èÛ8¤ÇÛ«‚ ½9º¹ÚƒÚ·¦D ¡Ûƒv½ÔÙ×ÇĂăơûÿdz« ©ƒ»5ÂÍË)éÛ9¥¿‰¿º×ƠăơÁψàêÍÓùêä̉  ±”¾ơê½̃ĂÙ­ôÑÓÎ̉Ǽ›¾ơÔɇÅÓ«dÿÚ«‡“Íj…Ö½»ÙµØ™‰kß [ïS²Â ¼ª÷Ơ›¶éª‡’̀jÏÔ¾£ÇƠÚßÄÙ­ÔÙ½ĂÈ™ëé噉kß [ïS½ÏŹړƓÛ×Úöû—¶ÍÛ“Ơ߈“ÆÅØÅÁỞ¶ + +¡ÛƒÙ×¹̃°»çđŸ}ÏÔÓº³ÈÛº߈Ÿ¼ô¾ÿ¯¶ÙשÄå̉ ³Ø³ØÏ̉ÛרŒ ê* ª ½¹ÚÙ×®¾™‰kß [ïSÂĂ£ØùשØƯÓ í‡°»ŒEÙÚ½›¡í–GƠ½ô—»₫®¶¥ÆÛÄÓºù×Ă߈¿‰Ä–ÍÓ‡Œ§ÔËÇ½ÅØơÔêö™‡²Â«ÓăˆŸç½¿½ñÓ›Ú™‰kß [ïS߈Ă$©¼ÑÓ£‡™‰kß [ïSù׋Çù׋Á¾‹Ç˜‰ +j +̃ + + + +Z +îS +Û«‚ ½9‡ÚăöÍͺ¡Á¯Ơùׯ¼°»óÂù×™Œ“ƠơêØƠ©¼ăקȵ†™ëéå«ÔÑÄëù×ÙÚø×‡½ăˆŸ;«&Å»ø×ÆÅ/¯×ñÚñÄơêǼ™ëéåŸ}ø×ÍƠ÷ÁÿǷŘÔíÖ̀Ă¹ÚµÊñÓÛ=öóÂÙ̉ÓÔ«‡“Íjï½Á½Ǽûºù×Đ¯ăˆŸ;÷Ô›éçÚ¿‰̀ÓÄÄ±Ă›Û™‰kß [ïSµØÿÚăàƒÔù×ÉĂ™‰kß [ïS³«‡“Íj«‡“Íj°”áêåˆá¤<₫ëÔß»û©°ëöñÚ«‡“Íj̣Áù×ñÓƠ¾G¥ˆ]1—¶ƠX«dƯđôĂ·ÅμÏÔƒˆÏÔÏÔ½àÇ%ƒ߈ËƠ¿±»ưÀå̉ ́êÁ½÷ÚçÇ߈Á̉Û×ï»ăˆŸôê«ÚùêÙơĂÇè«â«‡“Íj™‰kß [ïSÛ«‚ ½9H§÷«·3uUÓØù¿ÛÄÓÿ »Áˆ™ôÑÓëöëÓĂÙ®Û‰Ó™‰kß [ïS·¼Í7¥ØéÍቝ0»ƯóÇù×£Ç߈íØˆÔ±ÔăàµÅ³ăˆŸ;‹ÜÙ‡Ï9…æ*³Œ‚àׯöÂưܳmÏỒӾų«ÔÍÄ»Øù×ÇçĂÓ±ëØëöºƒˆù×…¹ÙÚ§à‘¬ÖăÚơ“…ö³(‰ơö‹ÜÅÓƒ½߈«%ƒˆÏÔ«‡“Íj¥ˆ]1ÍƠïƠÛ×ù×߈ÈĂ ÙŒë*«¤Ç™‰kß [ïSăˆŸ½€½™ôÿÂå̉ ăà¹àå×¹ÚéêÛ«‚ ½9»$ÁÊ€ºÅÔÙ×ÅØùê∳Ẳƒvùê½€ûÍÓ¡Û™”•½ưÀÇÖÍƠơêø×ƒvơÄÇ÷Á‘ï‡߈“Ơ›¾«‡“ÍjÏÔ߈߈ÇØỞƒ×Ü©‡¥2ßëMÔ½›¾µaßÚƠ×çÚ§Ô›¶é̀Ç +ÑÓ9¥‡"›¾ÍË)éÛ9¥å×’½¯¾ÓôóÇÙ½Ö Ô† 6 ¦j ÙăˆŸ;ÛÚƒ¾‘«dơêÏÔ˜‰j̃ZîS±»Á‡é/×:ǹÚ₫¹̣ù×ÏÅ´8™‰kß [ïSÙ½ăÛÛß›¶é±»¹Ú¡Ç«Ñ™ô½Ø‹Ù½€×¼ÙÚÏ̉“¹ƯNĂĂ ›­±àéMÁ̉›«Ô߈ä̉ù×¹Ú­Ô½ëö½ÿ$… ŸĂÍƠ«Èå̉ ‡Çƒv•Èû›Ưº½0½ºăˆŸ;ܱ»“¹ƯN«‹߈₫¾Û«‚ ½9áê¹ÚÏÄ¡Û߈¡%«‡“ÍjđÖÙÚ¡ÔÛ×Ü›ÛăˆŸñÙ—Óƒˆ¿‰ơÄ뙉kß [ïS©Ó±đÛ«‚ ½9çÚöÏÔ±»œÜ«Ô¾Ù¬Ä»ºơÔ·ØÙŒë*«±»ßÁ—§Í»Û«‚ ½9ÙÚ¿Å«ÔăÇí›˹™‰kß [ïS™Ô±»̣±½•£ƒvÛ«‚ ½9ÏÄш«»¶‡Ö8æÑÄëχÏÅëöÁ̉ĂÙ¼«‡“Íj§¹¼³ÂƯÚ¡ÛÄÓœ‡ăˆŸ‰;ëöưÀ‹ÇÅ«‡“Íj¹Ú­Øº̉áÛ¹»ÇÖ‹øĂÿ¼‹Ü™‰kß [ïSרăˆŸ߈ÅÙÙ½ëö²Æ“ăˆŸ;œàÅ¥¿÷ÁÙÅ뫇“ÍjơêËÖăˆŸ;­ØÏÔƒvƯÓ ăº™×·Ú«‡“ÍjŸÈÿ¯¶ÂÙ!ˆ¡ÔÍÓÏÅ÷‡ƠØÛ«‚ ½9ẮÆù×½âÁ¡ÛÙ½¡ƯăˆŸ;ä̉Ë¿§Æ•îëö“ºÏ™ô™‰kß [ïS¦¹ĐÄêëöÏÅ‰ăˆŸ;ï»ÿ׳¹Û«‚ ½9ŸÁÍÄÔX±»‡ÛÀÂơĂßÄÙÑÓù¿‹Çùêºy§Æ½€Á©Óå̉ ÅÔÀ½º9¥‡÷Áé‰ñ5ñ·Û«‚ ½9¡ÈÅÓ™‰kß [ïSï³2Û«‚ ½9ôÛ«‚ ½9ÛÇÙÚøêßÄÙÛ«‚ ½9éêăˆŸ™‰kß [ïSëơƒv¢X«»™‰kß [ïS߈Îű»™ëéå† «ỒÇÔơ÷Á߈Ûº•Èû›ơú³ôĂÙ‘g¥ØG½¹™Ô¶ñÍ߈€ø×»Ø8¤‡ÓØ«‡“Íj©‡¥2ßëMÛ«‚ ½9ơÔăêÈ̉ÏÔ«Ôƒv™‰kß [ïSíµØ½$í—GªÓ½ù×½ăÁâ½êö­ˆ£äƒv÷¶ÏÅÓºƠưÀóÂÏÚù×ơ…ßÄÙ9¥‡«‡“Íj÷ˆ£ÇëÖËÈ9¯¾©Ç½àÛ«‚ ½9íêшăˆŸ;ßÁ߈KƒØÁ¹ú(µØëöù×ËÉ9Û«‚ ½9Ïų۫‚ ½9ÊơÄÙ½ơêâˆ:kĂëöÿ¯¶¹Ú¸ÚëÚ¦ô»ÑĂ™‰kß [ïSȺyÿ麩ßÏÔŽµØâÁÏÅÖ¹/ù×±¿‹Ç¹Úޱ»ăˆŸ÷ÁÍÓ©Ó₫Û¨ØÁƯ´a¦ÓâÄ₫ùê Û9¥‡߈ù×¶½߈íØƒÖÏň½Ơ³ÈŸƠ߈ÙÚ߈Ù½ëöÓØăˆŸùë“ÈßÖ÷±»₫®¶Û&ưÀ—¶˜‰j̃ZîS‘Öçß½™‰kß [ïS¡Û߈©‡¥2ßëM…ƠưÀ˜ôö«»Û×¥âÄØ±»ĐÓÓÓ“º9¥‡ÍË)éÛ9¥™‰kß [ïSÙ½߈ï²2ÁĂÛ«‚ ½9¡Ô¡È‡¹›¹Ÿ\Ù½ÇÖ³º«»ưÀ–øêơèŃˆ—ˆâơĂáƠËƠ™‰kß [ïSÅëöÑ·ëÔÏŘơƯº¡Ơ‰ÛÏÚ£Ó9¥‡‰¿Iº·§D í‡ăˆŸỂÍÛ¥ØÅ»Û«‚ ½9…ôƒÖ™‰kß [ïS߈÷Á߈§ØÛ«‚ ½9ÏÄ@Û»÷úÛ«‚ ½9½€ÛÀ‹̣³È£Ó±»ÅØÏÔ«‡“ÍjçØ™ÁăêăˆŸÚª‚ +¼9ç½ÿ¼¹Ú̉ÆÙÚÅÔÏÔǼïÁăˆŸ;—ÓÙÚÙŒë*«Ñœô8¤‡×¡ÁÓß»ûºÖÆĂÙÛ«‚ ½9߈ö½ẰBơÔơĂ9¥‡éÓ×Ơ£q½ÔĂÙ˜‰j̃ZîSÏP›¾ÏÅÛ«‚ ½9±»߈˜‰j̃ZîSçÚăˆŸ;å̉ ¹Ơ߈ÛÄÓ½€Á׃vëö•{ưÀׯÎÔ™Ô“…\‹Ü±»ÅØߌÛ,ÏÅ™‰kß [ïSωÑÄëăˆŸÏÅÙÚøê ăˆŸ;k—¾›¶éëƠU×Üù×Ơ¹ÚÇÏÛˆ…ÖµØä‘®½éJé‰Ó5“gesÁÅăˆŸ߈₫Ô÷Á¥Ç«‡“ÍjĂÙíÆÇ̉Ù½™‰kß [ïS¥Öª́Û«‚ ½9‹È«·3uUóĂ߈‹ÜÏ̉ØÓÜÂƠ“ÆÁĂ Û¾ù×™‰kß [ïS匿NŒÔ˵اԂv—ˆ¯È̉ˆ”=‡ĂèêöͼĂ¼™‰kß [ïS¡ÈÇô×¼Ă)›¾çØY¡ƠëöÁ̉áØÙÚß»û¥Ç¡ÔÛ«‚ ½9™‰kß [ïSµØ‹¿¡ƯÓ œÓÿÚ±¿ƒ¾™‰kß [ïSá ¤Â‡x¹̃³àù×ÎÔ“¹ƯN½ÔÁƯƒv8¤‡÷‡—»«‡“Íj‹Ưƒv§ô½“¹ƯNĂèËÉ9ÊÇưÀŸ\©‡¥2ßëM©‡¥2ßëMÅưŸ ƒ™‰kß [ïS9¥‡»Ú«‡“Íj‡¿ÿ$ÿÚǼ½8¤‡×ăˆŸ;ăˆŸ©Èù×ÏÔ9¥‡×­Öí(™‰kß [ïSÿ&«»£ØÙÚ¡Á»Ư8¤‡™‰kß [ïSǼ9¥‡ÏÅÓº±»«‡“ÍjϹ߈Ù̉‡±»ÑÓ—"çÚùîƒÚ«Ô©‡¥2ßëM™‰kß [ïS£Ç™‡9¥‡×‡̣ÆĂĂÙ·̃߈ëöæØÛ«‚ ½9«díÆ¹óÍÓ¡Ơô™‰kß [ïS±»›¾ºƠăơÑÓ߈íê«ÔºĂÙÁ Û«‚ ½9ĂÙ½9¥‡«‡“Íjóº÷Á߈—¶‡xï»»ưÀă»÷Á¯‡¨¼ËÓƒvÓØùê­ÄơúĂÅ–ÏÔÜơO®GøµØÛÄÓ·Ô™‡ƠÅ߈̀Ê)èÛ8¤§ÔÏԯȱ¿½Û×ñƘêè俉¶ÔÁ㫇“Íj¡Á‹ÜÓÅÚª‚ +¼9¯È·ÔËÓÓ̉÷Ù§ÓăˆŸ;§·ù×ÅØÁ׫ÔÁËÛ«‚ ½9™Ôívù×ËÉ9ƯÓ ßÖơÔ·‡‘×8çăÇí©ØÅß»ûÅÓ•ŒƠù×ù×ăˆŸ;Á­RÑÓĂÈù×Å–™‰kß [ïS«‡“ÍjÏÅÿÚï½»ÅëöÁĂơê—¶ö¶Qù×£äà á=ù×ÏÅ÷Á¡ÂÛ«‚ ½9“«‡“Íj«‡“ÍjÿÜô†Œ‘ÚÙ½߈߈«‡“ÍjׯçÚÿÛÛ«‚ ½9ÚÆưĂÍÄ—Óº—qéÔÚª‚ +¼9ÿ¯¶Á¹‚v·ÅÛ×™‡çÔ¡×¢Úª‚ +¼9÷ÁưÀÁ0߈ÓºĽ¹ÁơÔưÀÑrĂÙ‰¿I…ôĂô±¿™‰kß [ïSÏÔđÓ“¼™‰kß [ïS¯×©Ó·äơâ߈ơêø×ëöÿÚµ¶‡ñÚß½ĂÙÏű»¡È±»ÑÓƒù×Û«‚ ½9Û«‚ ½9½›Ú“¼©‡¥2ßëMÍëöÿ¼»ˆ£ä½™‰kß [ïSÛ«‚ ½9µØÑÓđÆ£ÓÏÔ«·3uU×¾ùפˆ\0ªĐƒvéêÁ̉Ă™‰kß [ïSÙÚËÜ•ëƒvƯÓ ƒv«‡“Íj߈ƠXѫƒvù×ăˆŸ‰í™‰kß [ïSĂÙÿ×ĐĂÉ߈ăˆŸ;øêùת¶2tT½™‰kß [ïSƒvơÔ÷ÙÁƯ¥ºƠÅÔÍÓ÷ä5̉ăˆŸ;߈ͽóǯ‰¯0½ÏÅ÷Ô«Ô‡xÑÔÓ5“gesÁÅÂáÄöƒ½Û«‚ ½9ÍÓ½Û«‚ ½9ù×ƠÄơêéêÖÜƠÍË)éÛ9¥Å™‡¾ØÎÄÏěۙ‰kß [ïSö±”¹àëöǺÔ™‰kß [ïSßÚ¡Á…Û™Á8¤‡ÖÛ«‚ ½9Ü%ưÀ‹È±»ƒ½©)»n§Ó«‡“Íj½±»‰Á—Œùׇø×ưÀăˆŸù×°»™ơ÷Á߈ÍË)éÛ9¥ưØÁó‰ơêƒv“ÈẲưˆÎŃv¼ø×¿Å÷å5Ó¸Ú‘Æ¡ÔË̉ƒÔơÅij˜‡«Úóơêø×¾ºôêáÏÔµØù×ƠưÚ™‰kß [ïS÷Á—¶¹ÚÏÔéºöÁ—¶¼ÁÖÆËÀÏÄ­€Û«‚ ½9ÏÔÛ×ĂÙ­vóÇơÔ÷Áëö…Ö¥‰ÍL…£ ½£™Á­ÖÿÇù¿ñÆÛע俺«‡“ÍjÙÚ³ÅÓÁ̉Ăô¯È÷ÁËƠ9¥‡«‡“Íjÿ¼™ô¾ß5›¾ñÓ‹Ü›¾Û«‚ ½9ôÙ½°»«‡“ÍjÅàơ\ƒ‚‹Ç˜È«Ô¨Ú—¶«Ô°»™‰kß [ïS ÛưÀĂÙ«‡“ÍjôĂÙïƠ»ÙÅëù×ͼñÚûƯÛ«‚ ½9ÙÚÛÚµa£Ç©Ü¬ÖéÚÙÚ•îÁƯăàù×±»ƒ¾‘©‡¥2ßëMµØ©Óù׋۱»ß»ûà=¹àóÇï»™Áµ‰­ó™Ô÷ÛóÔÙÚ܃vÖ¾8Ï̉çÚÏÅÛ«‚ ½9«Ô£ØßÖ߈½€ƯÚ₫®¶4çÚå̉ ߈·ÔÜắƒvĂ›¹ÚĂÙå̉ “ÆƼÓ´…Û«¼ăƠ¯È½ÙÚŸÅËÜ™‰kß [ïS«‡“Íj¹Ú—¶ổÁ›Ơú†ÚŽƒv…Ôử¡Ç—ˆ¿9¥‡ĐÓĂĂ¼“Ʊ»°» +á=­Øù¿̉Æ8¤‡Ö¹•«»ưÀ÷Ôƒ„9¥‡×ưÀÛ™Û×׺±¿¶‡ñüƃăÇíù×麅Œ£äù×Á¹½Û«‚ ½9û̉ÏÅÛ«‚ ½9½‡£X‹Ç¡ÛŸÅӺ߻û½›¾ß»ûëöÙÚ©Ø“Ơå̉ ù×ÁƯ±¿߈‰àÀ‹Ü½»Û«‚ ½9¯Ô«âׯ™ôëö“măˆŸ;kÆĂ ©‡¥2ßëM9¥‡ÑÓ§ÀÍÓ«»ä̉›¶éçôưÀéÓỞÁ©Ø¡Á߈ăà­Ö‘홉kß [ïS¿ØƒÖÎÅ߈©&·¼Í7…Ơëöå9¥‡ª‡’̀já…—¿±»çô߈ÇØ8¤‡‡±»ăˆŸ₫&ívß½ÓºùêæÚ˜ơ‡Ç ËûưÀŽÅö±»ùׄđ»Ô›¾óÔÙŒë*«á ͪ߈†(Í|8¤‡ăˆŸ;ƒàº«‡“ÍjĂù×ñÖ¡ƠçỤ́ǃփv¹ÚÚÀơê«b“Æ߈™‰kß [ïS–Ó Û«‚ ½9ÁƯơÔëöĂ9îƠ ƠXăÇ홉kß [ïS9¥‡æ%ƒvø &—¶çô£Ø¿½€ĂÙ匿NÁĂºÏÔ9¥‡‡Ú½›¹Åر»߈ÍĂö‹Ü9¥‡¹Úψ¹ÚƠÔÅØ—¾ùט‡¿‰•â߈ Ûơê‡Ç¾º™‡ÏÔ•½Û×¾—ºçô¹Ø†º߈ºÂÄôÛ×éÓ߈ƒv˜‰j̃ZîSưÚ—¶ß»û9¥‡ϼÿ&÷Á’½ë½—ÓívÏ̉ĂĂ ›­±àéMăˆŸ¨º§ÛÅÔơêĐÓÛ«‚ ½9¹Úëöơêñé‹Üµa…»«»º߈ÓºÙ‡Ï9…ÿ ƒÖ±»‡ÇĐÓƠÛ«‚ ½9Á½ºăˆŸ;¿ÇỌ̈™‰kß [ïSÏÅÅçºëöơةǂöơê°½áƠ¡ÔĂ«»ψưÀ­ƒvéºÚª‚ +¼9ÖÆöÚ9¥‡¡ÔÙ×µa‡Çù×ÏÔ±ëØÏÔ¼Èͽﻲ؅ ôĂ;©Ø8 +¤‡ +Ö˜êèä¿ôׯÏÚ™‰kß [ïSƒÔÿ¯¶߈9¥‡¿ÔÙÅ뺇¡Ư§Ô–¾ ߈߈·‡‘×8çơèÅÛܺëöÈÓÁ‰ÛÅØ±»‘È”½ºưÀ±»íÖ«‡“Íj¿Å›Úª‚ +¼9±»ëö™‡ÚÀÏÅ«‡“Íj9¥‡‹ª-  8¤‡ÖªÓßÄÙÛ»÷ƠX³¾½ÏÔ•%ÿÚׯÛ«‚ ½9ç̃±»Û–¶å̉ Ï̉‹Ç·‹½×Ơß»ûÿ¯¶¯G‹ø·Å«‡“Íj ËûÚª‚ +¼9¹ÚŸÈÑÓÑŸƒØơć9¥‡ÍÓ‚vŒ9¥‡º±»ù×ÿ×ărĂÙËÉ9ñÖÆØ߈‚عÚçÚív›¡Ö“Ơ›¾߈9¥‡½ÔăˆŸ;°»É±½Ởá¬ÅØ÷‡˜‰j̃ZîSÊÓÿ×°ȳÂÛ«‚ ½9¾ÏÔßÏ߈Ơî߈³Ø¡ØưÀ‰ÆÓƽ€ÿ¯¶÷ˆå̉ ƒv½€™‰kß [ïSçÚ½îêÔ±»₫Ú™‰kß [ïSœ‰¾IŸÅƒÖÏԃ׽ÎÄé‡Ô­RĂÙ˜‰ j ̃    Z îS ƒ½ßÄÙ“¹ƯN‡ŒƒÖ«‡“ÍjÁs¶Ûº߈Ë¿™‡ăˆŸ±»߈ëÔÿÚƠX›¾ÏÔïD¹ÚÏÅ›̃œ‰¾IÉ̉­v9¥‡ĂÍù×±»ƒàÅÄÁƯÏž£ÈÆÖ½€÷Á·‡‘×8ç߈¢Ç“ÆË̉﻽ԧǟÖù×™‰kß [ïS©ØñÚ̉Å߈Ö¾8Í̃ Ơ#ÏÔ¹ÉÑ·Ï̉—ÓÏÔ«·3uUƠ“ȃڿ»ß́º½ÔÁ¾Û«‚ ½9‡“ÅØÏÔ—¶ă΂ơÔÁƯƒv©Çæđ˱½ñÖÁƯ©¼˜êè䙉kß [ïS‡Œ€G½¹¬Äù×¶½ÿ§÷å5ÓÛ«‚ ½9ăˆŸăˆŸ½߈÷ˆ‰¿I‡º­¾‹ÜơĂ“‡Ơ´ƒvÏÔ‘́Ïßß»û߈ĂÍƠÛ«‚ ½9÷Ú°» Áù×™ÁĂ‚ăÇí‡Á­Ä©Ơơ»‹ÜÁ‡é/×:OơêëöûéºóÂăˆŸ;kµØÅàƒ½8¤‡×ĂÓÛ«‚ ½9¶‡Ö8æ«Ôöø×ÁƯ×Ơ°½˜‰j̃ZîSŸ«‡“Íjª‡’̀j³ÈÙÚï»Û«‚ ½9ÛÀ©‡¥2ßëMù×§ôùêÿ¯¶Ăȓƫ‡“ÍjÿÚ麃փˆ¶ +è +–ˆÁƯ½ƒÁíƯơµØ½“ÇÏÔÛ«‚ ½9ơ$ÿÛñÚ¡ÁÛ×ñ›ÑÅ9¥‡×¡Á“¹ƯN‹¾ßÛÁ/½‹Ç¼±»û̉Û׫́™‰kß [ïS¹Ô匿N©Ç÷Á­ÖơÔ÷Á­Öï½ÏÄ÷¼÷ÁÙÚ§ÆÙ½ívĂÙóÄĂô×¾¡ÔỂÿÚÙÚ¿́™‡ư•ϼü‡°ø1ÀĂÖô*F¼¹¶ÍUáÔơ‡ï²2ù×±»«Ôß̃±»ăˆŸ;¡ß™‰kß [ïS¿ôéӡȃv‹Èƒ×ƠµØëöÿ×Û¹¹ÚÙ½Ơ9¥‡¿ÙÛ«‚ ½9ăˆŸ¡ÈưÀ¾øê߈Ù½±»ëöä̉Ù׳ÆÛ«‚ ½9°¿ Û̀ĂÎÔ½ô«â·‡‘×8çÛÍË)éÛ9¥ơÄửöïºÏ̉úÓă»Û«‚ ½9Û«‚ ½9‚vëöï)›¾߈±ëØáÛñÖơ»›»‰¿Iúê߈•Èû›Û‚« ©ƒ»5î¶ ¾ßÎÔǗv­ÄÏÔÙÜó̉¡Û§ôƯH‘đ¾Ư×Ơ߈“È9¥‡“Ơ߈µa¡Û߈ÏÅÏÔå̉ íêĂèÛ«‚ ½9Û«‚ ½9—Ó߈Ơćº̃ˆƒv±»ÑÓÛ«‚ ½9ôÀĂƠ™ëéåÅôÁ×ÏÔơÔĐÄêĂĂ ›­±àéMö̀Ê)èÛ8¤ƒvñ^ăˆŸ;£XéêÙÚëöƯ‰ÑÄëĂ¡Á·ÜÛ«‚ ½9ơÔϺÛ«‚ ½9Ï̉˜‰j̃ZîS߈÷Ú¿Øơể´™‰kß [ïS±»»Ø‡ÇÅÓ߈¸£Ï̉…ƠĂÙưÀưÀ¯©ÓăˆŸ;kß–«·3uUĂÈưÀáÚgÏÅÛÀ«‡“ÍjºÍÓ„³Ó·ÔüÁßÏÏÔ«‡“ÍjYùơÅÛ×™‰kß [ïSăˆŸ‘«ÿ¯¶ßÄÙ§ôÅÄ¿‰ù×éºÙ×½ÓÅëöéêÙ×Û«‚ ½9Ơ¡Ûư–ÙÓ«»×Ơ†7§j«‡“ÍjÁÚß»û™ëéåØŒê*ªªĐ¡È‡º•Èû›—»ăˆŸ;½¥íÑÅ«‡“Íj©¼©‡¥2ßëM±ÓÅ«‡“ÍjÛ«‚ ½9߈áê¼÷ơÛÀƠÅƯº©Ü”&ËÇ߈߈™Ô߈߈ƒØ¡ÔÛ×Û«‚ ½9ÏÔƠÁöăˆŸ;ÁÏ̉™‰kß [ïSĂÙÛ«‚ ½9«Û˜ô³È¹Ú½›¾ä̉ù×ăˆŸÙÚµ†Û«‚ ½9ù‡¼ôÏÅ÷Û°»Ë̉ëö™ÓíễˆÅÓ•%«‡“Íjơ™‰kß [ïS«‡“Íj߈ÿ¼ÏÄĂÙçǵØß„·ÔÏ̉ưÀÿ±»Ÿ}¡ÁŽĂºÙŒë*«›¶é‡ŒăˆŸ;߈™ÁăˆŸ;çØỞù¿›½€°¿ÏÛºù×ÙÚ߈—¶¸Ú£‡ŽÄÔ¡Ô¼€}ƒvĂÙ߈ùÚƒv­Ä™Óå̉ ߈­ºî»±»ÛÄÓÓÅĂÓÏÔ9¥‡½ưÀ¡ÔÏÅ”îÏÅ¿‰©‡¥2ßëMù¾ÏÔĩӨÁă»Ù½™Ô ¬°àèM­ÖÏŰ» «äƒvÏ̉‚v£äÑ·ăˆŸ;ö¼‡ù׫‡“ÍjÏ|¡Èé‰ñ5ñ·íê¿¡¿‰‘²Û«‚ ½9‹øÔ]ùºÁ|Û«‚ ½9Û«‚ ½9º´“È ËûĐÓƠç' »ÅØÜÛºˆ©à™‰kß [ïS£Ç—Ó»ØÛ«‚ ½9©‡¥2ßëMçÚăˆŸéº¡Ô¾­½¼Û«‚ ½9Û«‚ ½9áêóÇÑÄëŸÜ§Æö˜‰j̃ZîS³ơÔ¿‰Û«‚ ½9Ơơ“¹ƯN­É É̉ÚÀ½ÁÜÛ«‚ ½9¡ÔÁƯÿÜĐØ­Ö߈Ù×›¡™‡ºØ·Ô߈½Óؘ‹¿ºÁ̉±»G½¹ưÀơêù×Û«‚ ½9ívÿÚÔơơê½½€ö¡Ûؽ±»9¥‡«Û™‰kß [ïSĂщ×Ơ¿»÷Áïχeéº߈½ÍÓ£äµÜñÚ·‡‘×8çÑÓÏ̉“½ö§ÓµØº9¥‡ºô›¾±»߈£‡±½ÏÔÙ½ĂÙ½«‡“ÍjĂá=Ơ ëöÄÔå̉ ™‰kß [ïSÿ„ Èß»ûà9¥‡×£Ó¹ÁÛ«‚ ½9Úª‚ +¼9e¾‰ơê¡Û½—¾±»™‰kß [ïS¿ºù׃Ó̉ˆ!§ÔµØƒ‚v«‡“ÍjŸß˱£»£»½˜‰j̃ZîS…öĂ­Öă₫µØÅØăˆŸÅÔàºÛ'ÍÄÅÔ™ëéåëöăˆŸ;kêöûØÂÙÏÔÙÚ¿‰ß»û™‰kß [ïSƠùêƠX—Û‡ºù×ÍÓ™‰kß [ïSƒv˜‰j̃ZîS8¤‡Ö÷ˆéÚƠ±»ÓÛÚÑÓñÖçÚ½Ÿ}߈«Ô™‰kß [ïSỞ÷ˆÑÄëÅà—¶¼€ëöăˆŸÿ×ívÑÓÎÅöƒ½ù×°ÅËǶÔƠƠXƒvàĂv¹Ú”·‡‘×8çÖÆ“¡—“Û«‚ ½9ŸÀ™‹ăˆŸ¢Çóǃ¬Ö•Œ•÷Áå‡ÏÀ‡ÛĂÙç̉Áü¶½€³Úå¼ «×ưÀËÉ9£äרÇĂóÂăˆŸ™‰kß [ïSưÀĂÙ‡ù×½¹Ú¹à±»ù×ĂèưÀù׃ØÉ̉ƒ¾‘ƯÀ¡ÁëöÏÚö¶Ô߈©‡¥2ßëM‡-ÍË)éÛ9¥Ở±»Û«‚ ½9߈߈Ơ•Ü߈ÿ¯¶ƒvẠ̊ÔĂ߈±»«‡“Íj˾ÁƯË㫇“ÍjöÙ×ù׿ßß»ûĐÅö§ÓăÁưÀÆ»ÿ¯¶8¤‡×‡xèôÛ«‚ ½9·Ô×¾Ûº½ï» Û¹Ú©ØÓØÙÚ‹ö×ƠÏÅ·Ó ¥0˜‰j̃ZîSù×®¼Ù½ÅÔ—Ó‰Û§Ô»±ó™‰kß [ïS­¾©ÀÙŒë*«èê ÁÏĸÁçôº±½™‰kß [ïSÏÔëöﻹڃv§ôÁƯÅà¡ÁĂÈÏžÎÅÅÓåÁ±½öôé™ÛÀ¹«‡“ÍjÛ«‚ ½9ÑÓăàëöµØà¬¡ÁăˆŸ;¡ØçÚÀĂÙÅëçÚĂ虉kß [ïSÏ̉»©‡¥2ßëMöï‡ƠXí—GÛ«‚ ½9ÙƠÍÄå̃êö¡È±»·§D ±»ÍĂߌÛ,±»ăˆŸá ëöÑ·™‰kß [ïSƯÓ ²àÙ½©Ü߈¨¼éêùêÛ«‚ ½9Ï̉«‡“ÍjÏÔÛ«‚ ½9ù×Û«‚ ½9›¾ăˆŸëöÙ×›ÔèÔ™‰kß [ïS¿ßÇ»ƯƠṽç—ˆ9¥‡ÏÔÏ——ÓËνôù×ơÔêöƒ„ƒv±»ù×çôù×ëØÙÚçô±» ƠµØÖ¾áÛµØ̣ÇåĂÙƠÁõa§Ô±»߈Ûºƒ»™‰kß [ïSË~₫®¶µöƒÁ̉ƒvƠ߈§ÔƯº »9¥‡µ́áÛ«‚ ½9ƒØơÔ±»˜‰j̃ZîS߈™‰kß [ïSîºÙŒë*«ƒ¾‘߈é×¶ÛºƠéê9¥‡×ĂĂÛƯ¹Ú½€‰¿I½ù׺ƯÓ ÷ˆå̉ ù׃vµØ¹Úƒăß„±»¬Ö߈©ÓøêÖÆ»•Èû›ÓÓÛéÓÛ«‚ ½9ù×ù½Á̉Û«‚ ½9Û×ơÔ‡Œ»Øƒ×ơÔûΟÚË̉߈×¼«ÔÛ«‚ ½9ËÉ9°Å + +Ă¼ÙÚg±»Û«‚ ½9߈ÿ׺ỔÏÔÇÜñÙ©‡¥2ßëMÙ½ÏÔ«·3uU‚¿‰­Ä¼…»³ÂâơĂÙçô—¶ù×ơĂªÔ¼­ÖñÆ“Ơë‡ÅØÈÙŒë*«ñÑƯÓ óÖ“‹ù‡ư‡±ù1ÑÓ°»½YÆô¯È«à‹Ç÷ÁËœ›vßڹˋ¿¼ÿ¯¶½º›¾ɇƠXÛÚƒÚëö₫®¶°»ĂÙ½ô‰ơ¦Ø‹ÇÈ̉ử“#¯G‹ǿºçÚŸƠׯívØ߈ûÓ¿ÅËÉ9ÏÅËÉ9¡Û™‰kß [ïSö£–ÑÓרÛ«‚ ½9#ÛºăˆŸ;·ÔñÓñ™‰kß [ïSưÀÛ«‚ ½9¼ëÿ¯¶߈¹ÁÛ«‚ ½9ƒÖ™‡‡ÛóƯÏÔù×™‰kß [ïS¶ÚªÚĂÙ°¿ׯóÄđ̉ Û׫ÔáêçÚù×±¿ơêÓØÖĂÙ·Ó ¥0˜‰j̃ZîS±»ơȰ»Ẳµa‚v¥m§VÏÔÍË)éÛ9¥߈ÁƯßÄٗؓÈÁƯç'±½ï½ĂƠưÀÏÔ÷Áͪ›¶é¿‰¯¼×¾«‡“Íj“Èÿ¯¶çđ߈É™‰kß [ïS·‡‘×8çëöëƠU¿ÔXª‡’̀j±»‹Ç8¤‡èºêöÙ½çØÎÔ•½¶Ü¹ÚÍÄ߈Úª‚ +¼9ù×¶±»•Èû›ïôù×ÙÚơêÇÖµaơê߈·‡‘×8ç­™ăˆŸ;ÓØÏÔơÔ¼€ +ËƠXËdzÆÁ¹ƒv߈½Í₫÷ÁµØăĂ3̉º£ÓĂˆ•£Ø¡ÓÿÛ¯G‹øÛºÎÅÅä̉­Ûï»ÿ¼狫ĂĂ ›­±àéM·§D ƒˆ̃»ú„'‚vƒÖ̉Æ +ĂĂùê®ÁƯ¶ĂÈô½€ù×»ˆ­½¼§Ơ&½ĂóÇ9¥‡×ưÀ¦ôå̉ ƒvàˆÀ0p‡ÇÍÓù×ăˆŸÅ¹Á߈ùׇÛÿÂÆÑÓ¡¢åĂĂ·Åƒ½ǼƒĂٵؓÓËÉ99¥‡ÍÓ«‡“ÍjÅÁ™»¯ÈƼ¡Ç½§Ô©º©ÇÍÓÁƯµØôø¼ÄÄѶĂƠ©Ü¡Á½½ßÄÙ߈·̣ơÔ߈ɺäÁưÀÙÜÏÄƯº°»ûÖ÷ˆÏÀÛ«‚ ½9Ûê½€ƒÖ‰ÔßÚ§Ô¡Á½ÜÍÁƯ߈«Ô‡ăˆŸµØ©ÓĂĂ ›­±àéMăˆŸåô™‰kß [ïSéºÛ«‚ ½9«»™‰kß [ïS«&™‰kß [ïSƠÄăˆŸ;¿ßÛÄӻ߻ûߌ³Ø³1œĂ‡ŒăˆŸщµaĂϹµÛ·ØÅÁ»½É̉¾ù×ÑÄë©¼ăˆŸó#ỞĂôÛ«‚ ½9߈˜êèäéơº¡ÂÈơê©ÇËÉ9ưÀùêÅÓ½Á̉Úª‚ +¼9£äơêơÔ™‡¡ÛƠ—Ó™‡÷Úëö«d‹ˆ­Äùׯƒßͯ¥'=U#QK¯ÂĂ ÿÚĂÙäô©ˆ¥à¶«‡“ÍjưÀÑÄë£ä«»ỞÙ½Ă˜êèäÁ̉±»çÀéÓ¡Ô¶‡Ö8æÙ ™‰kß [ïSéJé‰Ó5“gesÁŅᓉ3Ơ,ù²Â¥Ç8¤‡«ÔÙ½™‡߈ÛÀÇØßÄÙ‰5áê‡×ù×”¾Ö$ăˆŸưÀăˆŸ;kÅ»ăˆŸ;«‡“Íj½€¼ÛºѶĂÙǽÍăvÍÄ)¹•Á“ƠÁ½¹ÚĂơê凃vÖÆª¶2tT—»ëөǫڣԥÆÇÖỬùêéÚÿÚ€ëÓ™ô™‰kß [ïSŸØơèŽĂ߈¥ÛưÀ÷Úëö÷ÁºÍð»›¾—¾ưÀÆ%Ï̉шÿ§èơµêÛ×ûÓ¹ÚÖ¾8Ơ‡Œ̃ˆí걿ÿ¯¶¯¾ÙŒë*««‡“Íj¡Ô±»¨Ç ߈Á“ƠÅ»߈©¼å̉ £ ºµØ“ȾœȭÑÓÿ¯¶Û«‚ ½9ËDZ»́Á©ÓÛ«‚ ½9ŸÖ×̉¯×çÚÅôù×Ó…ô«‡“ÍjÙ½‚vá ç$¾¾¸ÚÑÓáƠÙ½±»ơÔø×ù×ÓĂÙùê÷Áºyùׂv§ÄơêÏÔå̉ Ù×ß„“ƠíJÑĂ«‡“Íj߈ß»û½±»¹Ú¡Ôù×ψ©‡¥2ßëMÛ«‚ ½9ƒvív¯ÈƒÚÿ¯¶™‰kß [ïSơèÅÓØ½ªdÇÖÍÓ…Ớ½ Û«‚ ½9½¾‡“Ÿ±¿ơêÏÅш¥ÆÏÔúØшÑÄ뙉kß [ïSѦÛ­½¼ăˆŸ¹Ú‰~¡Èëö±»ăˆŸ;kѶÛº¿ØưÀ¹¾ƒvÙÚÁĂ«‡“Íjéơ™‰kß [ïSٺٽöÏÔêöø×ß»ûƒvͺ—¾›¾™‰kß [ïS†Œ   …Œù׋ÏÄÖƠؽ«‡“Íj›ĂÏĆÇÇ֧ؼԺ½Ûº™‰kß [ïS¾ó©‡¥2ßëM”»©Ó›¶éØÅêÅÔăà̀½ëĐĂĂ ›­±àéMù×½ÁÓÁ̉Åù×ơêơÔÛ«‚ ½9¿Û«‚ ½9߈•ˆŸ}—¶ĂÙ½™‹§Ó«‡“ÍjÍ·’̀j9¥‡“Ơ›¾ĂºƒÀ«»‡8¤‡×‡9ù×±̉ƒÖ÷‡“Ơ߈µ†›¾±»ƠÙÚÁ¹í‡©¼ƯÓ ߈ưÀ…ŒóÂÍӿŲ(ăÁ˜‡Û×›¹ăˆŸĂƠĂº°»¡ÛßÁâàóÇŸ „ùêƒØăơöˆơϼÜ +̃×¾ăˆŸ;÷ÁÓ¼ívôÅ­¾×s»ØÅ–±»ÏÔ©ØỮÓŇŒÁ½£‡·ÔͲvơê©Ç£Èù×¥•ëöù×½ØơĂ÷ÁÛ«‚ ½9»ØĂƠ¸Á̀B’’¹.ÜN0ù×8¤‡ëöÚÀÚ׃vÍĹÚëö™‰kß [ïSƒvͼöù¿±»Ôơ•½¾Ï̉¡Ôù׫‡“ÍjŒ‰°6ÉĂó§ԡÓ߈ÄØóÔ¹Úå̉ §ÔÙט‰j̃ZîSẳÙÚ§ÔÍÓ£ØüÀÈ µØ™Ó§âçÚ‰“§߈ªÂ›¾ơ»ăˆŸ±»¡ßºÂÏÔ˜‰j̃ZîS«dÅØăˆŸ;ĂÙù×Ở‡Œ÷ˆơØ«»ÂÙËå‹Ç™Æ¹·ÜăˆŸ±»¶‡Ö8æg߈©ëÆØôÙ½ó½ÑÄëÓ™‰kß [ïS÷å5ÓĂÙëöÙÙûƠ£¨©ÇƯÇĂ›¾“Ơëö߈á …×Ưº߈¹̃ŸÈ߈íڹڵإƷšÈƯÓ ăˆŸø‰é‰ñ5ñ·ăˆŸ;Ù½ùơëöăˆŸ½€™‰kß [ïSÛ«‚ ½9ϼ™‡™Ôé{¹¼±»ø×ÁƯÿÛÁËĂÙ9¥‡‡ÇÀ¹ÁƯÜ‘÷߈ă»ù‡߈“Ơ߈ÏÅ™ëéå¡ƯÛ«‚ ½9ÄÓ«‡“Íjè‰đ5đ¶ơêÍÓ†“×ĂÙÚëö±»—Œ¡»ÅØ©ÓăÇíÛ«‚ ½9ñÛ‚v™‰kß [ïS±»ÅÁù×Û«‚ ½9­ÔÏÔÛ«‚ ½9Û«‚ ½9«‡“Íj¡Ư½€·̣¹ëöÑÓ¶Ô§ôÛ«‚ ½9÷Ù±½¦ôçô±»ó×ĐÄê½È§·™ÛơÙƒˆ¡ÈáƠÛ× Ơ¡ÈÑe«‡“Íj§Æÿ¯¶«dÏ̉ăˆŸ;Ï̉¡Ô™‰kß [ïS«Ú9¥‡˜êèä‹Ùâˆ:±¾Û«‚ ½9‹Ç߈«Ô·ÅÏÔưÀØçÚ»øêŸ}ÀÙ ưÀ«Ỗˆ«Ó¹¾ơê½ôá=¹Ú•́»Ø†Ç«‡“ÍjåĂï»ùê߈ÅØùù×Ăº›¾¶ívÛ«‚ ½9÷Á·Ó ¥0³ÈïÚƒÚ«‡“Íj³ ŸÅéºívëÆƒ½¯Û×Ơ¶¶«»·ÈÏÅÇDž»µØÏÔ¥ˆ]1æØ߈ÍË)éÛ9¥ù×Û«‚ ½9Ï̉³È™‰kß [ïSí½Ă¹ÚÛ«‚ ½9©ÀÇáêÆ^߈°¿Âñ»щăˆŸÛ«‚ ½9ƒv¨À¿ºăˆŸ;á=ÁăơĂ¿¢Ç­Ô‡̃ÁƯ¥‰ÍL…±»¯¾½€ưÀ̉ÅÇÏŃ­váƯ¥ÆëöƒÚ߈½ä̉ù×Ú×ƠFíØù×±Ư×¼Ăà‰¾‡Û™‰kß [ïS»Ó¿ÑæØ ƒvÛ×ÿ¯¶çÚµØöùêÏÔÿ$±»ăˆŸ;9¥‡¿½Ó̉ù×ơÔô©ÓăàËÖ‰¿I·ÔÙ½¡Û¥ˆ]1ÛƠÛ×½̉ˆ”=ăˆŸƒ­Ä±»Ư†½·‡‘×8çđÁˆù¾ÅÓÛÚùĂÙÁÛ±”ëö߈ÏÅëöÙ½‡º߈£Ø߈ăơ󼱻ͅÙÅë±»ỞµØơèű» ËûÅÔƯÑ·‡‘×8çͪ±»‡º£ØĂ¼—¶ưÀăˆŸ;Ÿ}¾™‰kß [ïSÍÓùוÛÙ̉‘«…Ÿ™ëéå°»߈ÿ¯¶ƯÓ ơê Ơ¥Ç™ÁĂÙ¿ØăơÛ«‚ ½9ëö¡ÁÙ½»Ø¡ÇưÀ‹Ç™‡ñÓ«‡“Íj™‰kß [ïSưÁù׷ŧԋܗ¶çÚ·Èù׋nÅ™‰kß [ïSùëº9¥‡ăˆŸùê•×¹̃ĂÈŽµaÛ«‚ ½9ɇƒv­¶¿ß߈ăºơèÅ©ØÙסÁш‰Á÷Áƒv‡Û¹ÏÔñ“ÏÅÛ«‚ ½9˜‰ j ̃    Z îS ²ñÖ¾ÛÀùêỞđ̉ ó¯ Ă½ÔÔÁƯ߈ëöÏÔ¿ßÏÄù×ùê—»ÿ¯¾ƒÚëÓ›¾ÏÔèô©ÓéÚ—¶³™‰kß [ïS߈¿9¥‡»¼‘߈çƯơ­€«‡“Íj̣ÇÛ«‚ ½9ÏÔåĂÏÔưÀ³ôÛÀ߈Ó¼ªºù×ÏỖˆ‹ÜÿÚăˆŸ߈å̉ ­Ô#ùêƠÛ«‚ ½9©Ơ“½öëöăˆŸ;˜‡Û×ï‡Óºëö߈©Ç’È Ñ”¯Ž™Á¨Ø£ØëöăÇíåĂä̉߈öÁñÚ߈»Ă‹ÜƯÓ ÿ$‡ºù×íƯĂ¹ÚơĂÇÖăˆŸç¹¡ÁăˆŸ;«́÷ÁÊ È9—Ó9¥‡á ¢äÉĂ÷Ù¹Ú™ÓÓÓ÷ÚÇÖ«‡“Íj¯Èù×›·ÔöơÔÛ«‚ ½9º½«¼ï½÷‡ƯÀơÔñÖÍB‰¾å¼ ™‡©Ï̉Á±»ĂÙ˜‰j̃ZîS‚vÙÚóÇ©ÈºÚÆơêơÔ³ºó́ơ +ÎÔÏÔ¿ÅơÔ¹Úܱ»ơê퇇ŒÏÔÙ½©Ø½ÅÀ¼ơÔ«Ô£Çáê¤ÈÎ̉‡Œ™ÁѶĂÙÔ§Ô±»ăˆŸ;k¥‰ÍL…5Ÿ»ÑĂÆÙÚƠ9¥‡ÀỨÁù×ëöÁĂ«ÔÿÛ±¿ÏÅ•ÖÙ½…Ơ±¿¡È9¥‡§½±»éăê‰ÛỞñӧư»ăˆŸ;¹Úͪ߈ɇ½Ø¾ß¯Èö•‹HÁÚ›¾ɇ©Üø×‹©ÓÁ̉ÓØ¡Û ÈØÓÇ̉·Ôù×ÏÅßÖùׂv…(̃¡»®¾Ø̉ÙÚÁĂ‹ÇưÀÓºù×ăˆŸ;ٽŻ•óÿ¯¶µØáê—¶‡ä‡­Äñ˜‰j̃ZîS™‰kß [ïS®×(Ù½›¾§ô“ÆÁÏÅ«‡“Íj™‰kß [ïSöù뿉ăàơèŹÚÍÓ›·ỖˆăˆŸ;߈¡Á©Ç‹Èëö¹½9¥‡óǙԟֽ«‡“Íj̉×ƠñÆçỤ́¶÷ÁÍË)éÛ9¥çôщÀƯ±½«Ô±»ăˆŸ;߈‹Ç™‰kß [ïSψÏÔﻃןƠăˆŸ;ÇÅ¢ ù×9¥‡ưÀÆÓ(ăˆŸ߈¢ ăˆŸ«‡“Íj§Ô•Öùת‡’̀j‹Çó«Ú́ơéºÏÅÏÅ9¥‡ƒö‹ÇÏŇŒ@‹Çơ}±»½ņ•ïߟ}ăˆŸùׇǕëöƒv±ëØ‚v›¾ëö™‰kß [ïS»Óùêù×£äĂÙ¥ˆ]1ĐÄê—¶€ºøơ±»÷Ôïµ·µßÖ˜‰j̃ZîS—»µaƒêÏÔÛºÛ«‚ ½9Úº¨Àô»áêÑÓËÖ߈…n߈›¾ɇÓŃ֙‰kß [ïSº½£Çת‡’̀jÛ«‚ ½9ÍÓ½Ô·ôÓÆĐŸ}ßÄÙ›¾‡Ç§Ô«»ó|“ÈƯÓ Ở±»©Óûëö—ˆ™ô›vÛ«‚ ½9ßỰ¶Ñ̃ôꙉkß [ïSÛ«‚ ½9Û«‚ ½9™‰kß [ïSº˜‰j̃ZîSív—Ó±»»ÅÓº´%«Ô¡ÛëöÙŒë*«‹ÓÿÚ¸Áö¿‰³Ø»nßÁÏԣر»‹Ăå̉ £”Œ±»™‰kß [ïSYŸ}¡úÙ¹ÚÛ«‚ ½9±»ơêåĂ«%ăˆŸ;߈ƠÁĂÙÙŒë*«߈Û«‚ ½9Ù½ơÔỞơê…ŒéÓ±»ï½ºù׉¿IÛº‡ñ5»Øψ¾Åû³(%óÂ½ÓÆǼ¡Ư¥ ñăơ‰ÛưÀ߈ÿ‡¡Ôơê™ëéåÏÔÀ‡€è/Ö:̃ˆ«»ÏỒÇ¿‰™ëéå¸Ú—¶±¿¿‰†ÇƠóÇ·‡‘×8çñÚ÷Úă»ÍÓ¹Ú½€‹q¶†øËÉ9Û«‚ ½9¿º™‰kß [ïSù×ơê°»ƒ¾‘‹Ç̉w–½ưÀ¡ï‡9¥‡ÏÔµaÏ̉‹ÇƠµØÛ×Û«‚ ½9™‰kß [ïS“¹ƯNƠ«‡“ÍjĂèóÂÉĂăˆŸ;߈©öĂĂỞÅëöÉ̉ô¹Ú̀Ăñ×™‰kß [ïSƯÓ ö“ƠêöáƯ©Ç Û‡Ú±»óÔÛ(ù×߈Û½«â­º“¹ƯNË̉ÏÄå¼ ™‰kß [ïS·Ó ¥0±»Î½°»߈™‰kß [ïS±»ñÓñ×ƠXÑ(¯¾±»ÑÓĺçăˆŸ;¹ÚăˆŸÁƯ߈ñÓ™‰kß [ïS‡×÷Ú߈ËÉ9Ù½ơÚ‡xƒàÏ̉¹ÚÛ«‚ ½9£ÇÓÅÛ«‚ ½9£Ø³ÙŒë*«×ÜƯẪˆ//­¾‡ư÷•ǽöÁ­½¼µØ­¾±́¯È›¾½ô÷Á©v÷¼Ù×Ç̉§¹Îơ¡‚v¹Á«÷¨Ø±ôĂơÔÑÄëùêá ‰¿IƠöèÀ}±»ÂÙ•‹H·̃ăˆŸƒˆ€ÓëöÂÙăˆŸ;êç³Ç³µØ›¶é×ܹÚëö©Çùꘉj̃ZîSÙ½éÓ¸Ú4øôù×ù׋ÇÑĂƒ×ÑƯß»û©ˆÀĂƯîÙÚ›¾³ºóù×µØÏŪ¶2tTơèÅ¿±»ëö¼Ô»yµØÅةǤˆ +\ +0 +ͽ½½³ô¡Ô9¥‡™‡߈Ïß¡…nÛ«‚ ½9‡ºö™‰kß [ïSÛ×±ëØÓº‰¿IĂÙưÀªÚ5±ê«ÔúÖ»±¿½€•îÙ„ÛơĂ₫ öÏÔï¶Ѷ‹Üç½ơêă¦Á×ívÛ«‚ ½9í̃™‡źÏÔù×ù×·‡‘×8ç‹ÓÂƯ|Á̉ëöé´™‰kß [ïS¸à ÉĂ«‡“Íj½€›‰£ÇñÓù×—Œë½˜Ở’‹ơl߈·¦D ³ØÇÖÁŒ߈¯×©‡¥2ßëMG½¹ÓñÆÙ½9¥‡êÓÛ«‚ ½9Ù×Ôç'±»ƒÔóÔ‡ŒÿÛÉ̉å̉ ™ơ‘ƇŒ÷ơŒÛ§Ø™‰kß [ïS©‡¥2ßëMÍÓÄ€ºëöËÉ9ÏÔÑÓ—»£Ưí—Gáê߈ª÷ +«‡“ÍjÓÅÙÚûØƯÓ ¶‡Ö8汻߻ûçÚù×߈̉Å÷Á߈ơèÅ÷‡ô—¶÷ÁÓ´…ö΃vß»ûÖódz߈ÑÓù×éJé‰Ó5“gesÁÅ9¥‡×“¼·ºù×¶èÏ̉…Ø™‰kß [ïS¸£ׯùæß™ψ÷ÙăÁÂÙ!Û«‚ ½9†“£äăœ—ˆ߈ÁƯùë͵×öèơ£ƠăˆŸ;ÙÚùÚºØå̉ Ù½„¾¦Ø“Ơ—ØñíÈÉĂ«»½·Ó ¥0«Ô« ©ƒ»5íÚæØ ¹ÚÍË)éÛ9¥Û¹Úó–ù×›¶éă»›¹¹Ú߈«‡“Íjù×ÍÄÁƯËÓɇµØª‡’̀jù¿ëöăÇí߈±»§ºù·߈Û«‚ ½9­Ö½ˆơ)“ĂÙù¿°»½ØÑ·ưÀÔX«‡“ÍjÏÔ¦¹ƒäßÚíÖÏ$ëö©¾ăˆŸ;kơĂ„¹ÚƠÄÏÔóÂÙ½Ă˜‡ƒÄ‘ÓÛ«‚ ½9“ÆîƠËDZ»«Ô”Èúí̃߈«‡“ÍjÅØĂ¼éêÏÄÅÓÁƯƒvß·‡‘×8çíêơêăˆŸ;½±»Û«‚ ½9÷ÚĂÙ§ô‡ùÙÅëưÀÏŵ!ш×Ơ†7§jÍĂ¹ÚĂÏÔ›½ÑÓăˆŸË¿‡¥Â™Ó™‰kß [ïSÙÚïÁƯß„©‡¥2ßëMñÚщ™‰kß [ïSí˻ܽưÀÊÓçÚ߈§Ô›¾ÿÚ«‡“Íj¿́«‡“Íj÷ÙûƠø×ăˆŸϼù×áêׯ˜‰j̃ZîS÷å5Óù×Ơ×÷Á•ŒƠ½¯ «‡“ÍjÀ¹ÂÙ˜‰j̃ZîS¹Ú²KÚª‚ +¼9×ÛăˆŸ;kÑӟ˱»ó™¹Ú•ÇÛÄÓÿÚăˆŸ;·̃«‡“Íjó#ĂÈÿÚ™Ó§Æă½ºĂŒ‡ÚÙ½‡Ó´ù×ĐÄê½ÙÚ߈ï½ĂÙüÀ™ÓÿÚ£đô» ôºÏÔÀ½›¹ר“Ơ«»¾ĂÙ£äµĂœ‰¾IơêăˆŸƒvñÖáƠơƒµ›¹áù׺ÜÛ«‚ ½9Ă¼™‰kß [ïS§Ô°»£ØÛÄÓÏÅ߈«Ô¯¾רóÇëö¿ôăÇí±¿éÓÿÛ·ºߌÛ,ÍÓÏÁ̉ÁƯƒv×Ü›·Ô÷Á¯ƒ« +>œ·̉ ¤0“ö÷ÁùëËÉ9ÀĂ½ôĂĂ ›­±àéM©¼ëÓźרñÆẳưÀù×ßÛé‡Ư‰ÏÅö¾ôøê¼“È—ÓăÄù×¹£̃ˆưßËÔƯ‰ïƠ£ØƠÈĂ£Ø‡º™™‰kß [ïSƠX›ÏơÙ̉ÛÀéÔ™‡ÙÚ‡jÿ¯¶ºׯ©ØóÇ9¥‡×¿́™‰kß [ïS·Ô±»ÿ¯¶¿‰¡Á߈Û«‚ ½9½€÷ˆ•Œ«ºñÓÛñÔ¾ F í꫇“Íj‘±ÙÓß»ûăˆŸ½“Ơؽ½™‰kß [ïS²1µ‰ăˆŸ;›¾©Ç¹Ú™ëéå±»ƠÄ©߈ÏÅô·Å±»ĂôÏÅÙÚáÓ·‡‘×8çµØßÄÙá ¸Ú—Œ¹Ú9¥‡«‡“ÍjëößÁ™‰kß [ïS£‡çÚ¶º«‡“Íj9¥‡×ëÔöËŵa§ô·Å™‡÷Û™ô©¾ÄÓ9¥‡™‰kß [ïSù׋Èù×߈ĂÈÛ«‚ ½9–Á‘ щđØ$‚v¡ØÓ‰Ûμ ¾ưÚăˆŸ;ô™‰kß [ïSÏÔÅ–¥ˆ]1ÑÄ뙉kß [ïSùêơèœȩÓÏÔí‡·Ô¼Ô ăˆŸ;Úª‚ +¼9Ă¿ô¾Å÷Á߈ưÀùê߈ÍÄÚª‚ +¼9÷¼ÿÚăˆŸØÅêßÄÙ¹Ú¸Ú9¥‡×øê¾ßÁ¹âÁ±»ñÙÙ½ÿ§óÇÎ̉±»Y™Óç̉°»ÇÖä̉ăˆŸ;™‰kß [ïSÓä̉¡ÙÛÄÓ§ÆÁ×ơêêöG½¹Ûˆ«‡“ÍjơèÅÿ¯¶߈ăˆŸ;kơêÛ«‚ ½9ívÓÆ±»ăˆŸ;kĂÙ·‡‘×8çÅÓÜ‹ÙăˆŸ;­Ö’ÈửÿÚ¡Ôë™H±»ËÉ9å׫»—Ö½߈ơÔ·§D ±»ƯÓ ˜‡‡Œ߈™‰kß [ïS™Ó£äêö!…£­¹ÚÇÖƯ܇ÇßÄÙưÀ™‰kß [ïSÿ¯¶ö­¶¡ÔƒvĐÓúÓ±»·Ó ¥0רÙÅë̉Å߈ÏÅñljÛ₫®¶Á Ú×›ÛÛ«‚ ½9™Û§ô¹ÚáƠ÷Úé‰ñ5ñ·‹Û¯G‹øÅô߈ÏÔ¥ˆ]1ÏÔÖƠµØåŒ¿Nơê‚vĂÙûÖóÔưˆăˆŸ;ƒv©Ç’Å›¾ñÓĂ蛡½±»±»™‰kß [ïSù×ăˆŸ;‡Œ™‰kß [ïSăÔ₫®¶߈«Ú© ¾ƯÏÅơÍÄÓØ“Ÿ±»á=¹̃Ó±æ̉±»™ơß„µ†ËÉ9߈ÿÛƒv‹ÇŸ}Û±»Ù‡Ï9…ÅôíÅ•Èû›‡x·Ô¿́‹°áØăˆŸ;kª‡’̀jùƯ§ộÇÙŒë*«ĂƠßÁ߈ߌÛ,ëö«‡“Íjùæï‰™ôåí‘©ÇÅӼϞ¹xÚª‚ +¼9—¶ù×ĂñÓÏÔñ‡›¶é™‡ÙÚûÓ߈Ç̉߈ăàƒ¾‘ù×üÀ£Øù¾©Ó½ÓÅË̉÷ˆïÚĂè“Ơ±»½÷‡ưÀơêÔXăˆŸ;ÿÚĂÙ‹ÇѦ¡È÷Ááêøêëö«‡“Íjù×ù×ÏÅĐĂÁă£Ø©Ç̃ŒÚ,¯×íÆ™‰kß [ïS§Ó₫ĂȺ½Ù×ûÓщù×ù×Û«‚ ½9ËÖ́Ú“Ơª÷†Œ±»ÿ‡™‰kß [ïS½ƒv—¾çÚăơ™ëéå§ÓíÖ½·¼Í7­¾ưÀÛ«‚ ½9ƒØgâˆ:溺y·¸éÓÙÿ§™ôù×µaä̉ù×ăˆŸ;kÍË)éÛ9¥÷Á½§Ô½Ëӑܽ€µØÅÓûÓƠ‡ŒéêưÀ«ÔËÉ9ƒå̉ ƠêÓơèÅÛ«‚ ½9ăˆŸ›¶é«bĂôéÔ«‡“Íj•ÓѦñÓ½ù±½ƒº¿ßưÚ€º¡ƯĂÙ˜‰j̃ZîS¼߈¨»ƺ™‰kß [ïSôĂô—ˆÛ«‚ ½9߈ơ…߈º©‡¥2ßëMùêăˆŸ;kÍÄ)ñÆơêæô“ƓƫÔâḈíÅâêçÚÅÓÏƠXÄÑØ»ôÛ«‚ ½9ƒÇóÇÛ«‚ ½9ëö›¹ÊƠ¯Ô¾º·‡‘×8ç߈å̉ Ơ÷ˆ°»™‰kß [ïSá¬ÛÄÓăơ¢Ó˹¾ÅÁƯåĂù×9¥‡×•Œ÷‡ÙÚÙÚ½±ºßïÛ«‚ ½9ÇÖŸƠÅÓªÔơê—Ó¹½†“Ѷÿ¯¶×¾Úª‚ +¼9—¾ÿ¼¡Ơ¼€ƒˆÙ½9¥‡¿‰«‡“ÍjÁ̉™‡œÚơÔ‡º߈Û×ÏťƯțڹڃv—ƠưÀ±»Û«‚ ½9¿º—ăăˆŸ½ù׋ÜçÎ̉ǽ¥ŸÁ̉̃ÄØ߈¥ÜëÚ‹́§ƠđÔó₫®¶ôêÛדƻ½™‡ùô÷ÁŸÅ߈éê§ÈÚª‚ +¼9´ÎÓźÛ«‚ ½9ö±»­Ä߈©‡¥2ßëMƒÑÓ±»9¥‡ÑÓß»ûËÇĐÓçôđ»›ÚÓØàĂ ÏÔăˆŸĂôù×™‰kß [ïSÿÚå̉ ƒĂƠÑÓ™Á·‡‘×8çÏ̉£ä«‡“Íj‰Û½æơơꙉkß [ïSÏūԾÏ̉ÛןçËÇ•Èû›.Ăº¯‰¯0߈™‰kß [ïS߈§Ô¶  ĐĂÉơèÅÛÄÓ·Ó ¥0ö™Á½Á…½ù×÷Ó÷¼çÚÏÔÔX%ƒàăˆŸ¹ÚØ×öÁ‰yׯéÚ匿NÁƯĂôăºÁñ»ÅÔ߈‰oóֵŃؗӫ‡“Íj¶‡Ö8æ±»ÍË)éÛ9¥©Ơ«Ô·Å÷Á¦ôăœëöŸ%̉º«»­R™Á߈÷Ù«·3uUÚª‚ +¼9ù×Ñ·¸ÁŸ}½Ù×™ºׯÿ¯¶¡Ü‡‡ÇÏÔ‘¡Ž½ƒ£Ø’Æ ›¦ÙÅëÚŸ}™ëéåûÖµ†ÏÔ÷“߈Â虉kß [ïS‘ƵØÁ̉××±½«‡“ÍjËÇù×­Ä’È™Ă«bÇôÏê¡Óù×ÁĂ›¾ÁÇ₫ÇĂÙÆ§Ó“Û߈ÏÅ™ØăˆŸÚª‚ +¼9¥Ü«‡“Íj«&’ƒv“Ç»ÑÓÇÖ«‡“ÍjÑĂéÓ«‡“Íj¿ç‚›¾úÖソô¡ÈÅ»đØ×‰»¹̃«»«‡“ÍjÁ±ơÔ9¥‡ƯÓ ±»ׯµØ§ñ©‡¥2ßëMÇÖÏ™‰kß [ïSëö¯à¾Ơ»±»ÓØÙYÛÀÏ̉•ŒăˆŸ;kÑÓö½¾‡öÁÙuơèÅÏ|§ÔÏÅÑĂƒˆè‡¡Û¼ó|ƠÏÅÎ̉߈·Å«Ôéê¼€Ơáê£äߌÛ,÷Ÿ÷ˆ߈釃àÁƯïi«‡“Íjáê‚Ø·§D ơèÅ¿½»ôïƠÙ-ẳ÷‡÷Á©ÇѶăÁĂÙÏÔå̉ ºăˆŸ;¹Ú̃ÁŒ¾÷Á—Ö±»³”£Ø¿ºªÚ‹Ç“º«ºƒ§ôÁ¾ÏÅÿÚ–Ó ÅØ¿»³ÈâˆμÙÜív¯¼›¶éÑëö»ÜÚª‚ +¼9áÖ›̣¿ç«‡“Íj铃v¹£ÉÀáƯ­ÄÖÆ§ØÛ«‚ ½9ñÔ‰Áíº»ß́–GBïƠ™‰kß [ïSÏÔăˆŸ;¡ÄØ¡ù×Ù½÷ëô½Ă“ºç̃›¾ƒˆƯºă»ß»û̃„«ÔÍƠ±»Á̉ÿ¯¶ăÚÁôơÛ«‚ ½9ñÓ­½¼±»ëöëöù×ËÉ9éÔ߈™ơÅÔÁƯ¡Áƒv߈ưÀ™ëéåù×çÚăˆŸ;k½Åે“Íj½½€÷Ú»~«»ƒ°¿‡Œш8¤‡Ù½™Á«‡“Íjơ»߈Ô½€Ơ¾Gơê™ÔùêÏ¿ßñÓåĂ߈Á‡é/×:߈ƒư‡±ù1‚®à«‡“Íj©Ó™‰kß [ïS©Ó̃„‹Çß»û£Ô«‡“ÍjñÓÙ×µ†«‡“ÍjÿÚ±»£Ç£ÇŸÈăˆŸ;釛ù¿ëöÿ$ÍBñÖ±»¶èÀƯ™ĂăˆŸ‰¿Iù×ĐÄêêö¹ÚÛ«‚ ½9³«‡“Íj‚¾ÿƒˆ‚à›¶éù×Û×ëö­vÛ«‚ ½9ÅØ«Ă÷ꥈ]1¦ÔåĂÁ̉ћڰ»«‡“Íj©Đ¹§Æº¸£ù×à= 9¥‡¿ä‹ÓáêŸ}óÂëö™‰kß [ïSêÔĂÙͰ»ÍË)éÛ9¥™ëéå±»ưÀÿ¯¶±%‡ŒƠ…Û×ׇ½7µ†¶«‡“Íj©Ø©ØĂÈ¦È «»Ù½«»¿‰Ù×ÓŽºÑÓ₫Ûë“›¾ăˆŸ«‡“Íj×Ó½ôù궇Ö8懌ƠåƠ©Ü½ÅÔ£Ôº³ºóăˆŸß„ùæ§¹ÁÓÅ߈×™‡ĐÓơÅ¢XѶëöëöƒ¾‘¢äÓØ÷Ôßôơê‹Ù߈‡ñ5ƒàÑÓ±»­RÏÅÙ½÷î™å‹Ç¹Ù½ÏÔÙ½ÏÄóÇÿ¯¶ï»û©߈½ù×ööƒĂĂÙ¿‰¿́”½ÑÄëñÖ׿8Ă¼›¾ĂÍË)éÛ9¥ù×߈éÏÅ“ƠÍÄüÁÛºÓØ¹Úù×ù×Û«‚ ½99¥‡¢ yơÔöä5̉ÏÔ–¾óƯ±¿ưÀ̃YŸÜ‹Ü¹ÚHù×Ûº·̣¿‰›·Ô¡Á£ÇÙÜÁµØª¶2tTë °»§º«‡“Íjù×Ô½øê"¡ÔéôÁ̉°»ïíëöÛ«‚ ½9ưÀÜçôÛ«‚ ½9Û«‚ ½99¥‡ͪß›¶ééêưgçÚÙ½§ØÙÚׯÍƠºܺ±¿ñÓ¹ÚÛÀéºă»öÁÏ̉DZÛÁĂÛ×׿8½߈½ÑÓûºó¶ËÉ9¿̣åơ¹Ú¿Ø‡9ëöÁ¼›¿ß—»÷ÁÍÏÔ¼”½€¿‰·Åƒˆ×öñÚ÷ˆáÛÈ̉Ån«·3uU&ăˆŸ;öÁרÙàä̉£ àƒØ“Ơ9¥‡™ëéåщăˆŸ;œÂÿ¯¶ëö¿åÿÚ¹ÚÛ«‚ ½9œ‰¾Iö£Øå̉ â½ÀƯ½ô½—¶Ùăù×ÛÚÛ«‚ ½9ƯÂÏÚÍƠŽƒvĐÄê±»µŸ\âàµØĂœ‡›¾±»Û×Û«‚ ½9ÏŃÚƠ™‰kß [ïS¯G‹øÙ½ÖÔ†6¦jÏÔÙ½ö±¿½Ỡˆ ›¾ù×™ëéåăÁëö÷ÚÅÓg³ơꇺ±»½Î›¶éゥؖ¶—¾ÙƠ߈÷ÁáêÖ¼ñăăˆŸ;k˜‰j̃ZîS±»ª‡’̀jëöщù×™‰kß [ïS9¥‡×÷ˆ¾½ÆÉ̉߈áSÉœ¯çỞùcñÚăơƠ¼€¼ÄÄƠÙÅë匿NƠºmÁ×ßÚ‚àĂ9¥‡½ÔăˆŸ;kÑÄë«Ô×¾Ù½¡ƠóÂÛÄÓ9¥‡½½ĂÙ…Öé‰ñ5ñ·¡™‰kß [ïSơ»ù×áƯ«»́ŵØÍį)ÍË)éÛ9¥½ÔŽ¿±»G½¹‰ÁÁËß½đ¾ÿÚÿ· ö Ơív÷¼»º‰Ûù¿ÏÔĂÙ¡Ộ§ØÇÖ½€“¹ƯNĂè߈߈Û«‚ ½9ÁË8¤‡ÖßÄÙ÷ˆù×½€ÏÔ·ÔƒÔÛ«‚ ½9£»‹Ù‹Ç±ëØÁÓÛ«‚ ½9ùÅù×ù×½»ˆ×둋Ƚ¾¿‰çÚÛ¹·‡‘×8çÍĂï»ưÀ Ûëö‡Œ«‡“Íj·‡‘×8çï½ù׃vÏÅù×›Ú§ôúÖ±»ǼÑÓ±»‡ÚăˆŸív„ÚëÔßÚËÖÛ«‚ ½9×¾ùêÛ½ëöÑӳŨÿÚ˜êèäû¶ĂÙ«·3uU÷Á¹Úƒv«Ô™ëéåỔÙ½ĐÄêù×ó×9¥‡«·3uU±)åĂ߈ÍÄÖÆ߈‡ÇùæÑÓÚª‚ +¼9Ơ‹ÇơÔ°¿Úª‚ +¼9ùêăÁ‹ÈßÁ«Ô§Ó⺶-ÑÄë—Óÿ₫Ưê$JÁƯ§Ơƒéơ÷ÁÏÅÑĂɪګ‡“ÍjŸóƯÚù×ưÀ—¶ïä»ÁɇĂȱ¿»nĂÙÏÔ¿́«áø×ë§ó†ù¿́Á÷ÁµØ•Œ½™ëéåçÚº¹Ú±»½ƠÚå̉ À½%¨Ç—¶½߈Ơ9¥‡‡ÇßÄّƸÚëö߈³×߈™‰kß [ïSÛ«‚ ½9ƒÛáꙇÁ|ÛÚ÷ÁƠ¼éºÓØÇÿÇ"™ëéå“öơÔÁĂ™‰kß [ïS«‡“Íj…Ôƒv¿‰¯×·‡‘×8çÁñ†ºƯâÖÔ†6¦jăˆŸ›¾¹ÚưÁ½™ëéạ̊Âï³2Û„«ÔŸÖ­Äï»ÅÓ§ÔóïăˆŸ‰¾–»±»Û™ëö­ÔñuăˆŸ;ÖÆ¯È±¿߈ăˆŸ;ƒv§Ôª»–»×¾ơƠ•{ơÔ‡ÚÍÄƯÓ ³¹àŸÈÛ«‚ ½9Ó̉÷Á“¹ƯNº¶Ôăơ«‡“ÍjĂÙÙ½ô±ëر»©¯›°½©‡¥2ßëMÍÓÿ¯¶ÿpÁ¼ëöÿ×ĐÄêùêíÆºÇÖ®¾­?ø×‰ÛĂ‘Ö»Ø±¿ĂÈơÔÚ½ØÏÅ8¤‡×ÆÓå»…¾ª»³ô™ÓívĂÙ߈“ƠÙÚÙÚµ‰ºâàÛ«‚ ½9Y·Å̉Æ߈Û«‚ ½99¥‡«‡“ÍjưÀÏÅŽ›¾°»íç¹ÚçºĂÙ÷‡™‰kß [ïSñÓÛ«‚ ½9ÏĹÚÓ´äơ ‚Úøê%½³ºó‹Ç­¾è‡Ù½ùêăˆŸ;¹½Ư đÓñÓàêùו۱»ßÚ¥ˆ]1ù×ɇû(ñÓ±)»Øª»ßÄÙßÏ·Ó ¥0ç̃ƒ×›¹§Ô½ôûÓ™‰kß [ïSơê߈àêå̉ ¹Ú³ÎÔưÀù×®GøĂÙ߈ÎÅ£Ø߈çÇ›¾ĂÈ₫£Øëºô±»½€›¾ÂƠÛ«‚ ½9Ó̉âơ\߈ĂÚ±»̉Åù×ăˆŸª¶2tT“¹ƯNÙ½ëöÛÀ›¾çÚ¹Ú­Ø¥ˆ]1ëöº³Øéº­Øô§ô«»›Û«‡“Íjƒvÿ™˜‰j̃ZîS·§D Û«‚ ½9ăˆŸ;ká ›¾™‰kß [ïS߈±»ûÙ·§D ơêÀ¹å̉ ÁƯÿ$˜‰j̃ZîSăˆŸóǧôÂÁ̉°»!߈ÙܵÁª‡’̀j±»߈÷$‡ºưÀá(ưˆ¿ºƒˆ©‡¥2ßëMÅØ³Â·ºÑẴÁ¹Úö‡̣߈ƒ—÷ºéÓƒvà=”Öëö™ÔùוÈû›ß%Öô‹ÓÅÓ÷‡ÇÖÅÓÙ½«ÔƠù×щ½ÔßÁÁƯ¿‰ÏÅöỬÈð»Ă±”¹½ö߈÷‡̉ºÚª‚ +¼9ăàÆØëgκ™‡Û«‚ ½99¥‡ÿÚÂÓ™‰kß [ïS¾¤Æ·Ô®GøÍÓ”#¿ôåÁÙ½ơêĂÙă®ù×ăˆŸƠưÀ́…Ơ«Úù×ÖĂƠëӵؿ(ĂÈ߈ÏÔÙÚϼ•ÔX ­Äƒ×°È ¬Ö¦ÆÛ«‚ ½9‚vÑ¡¹Úëö¹ÚÛ×ÁÙ­Ö«Ôçô—ÓăˆŸéêÅ»ÑÓ¾ßÁÍË)éÛ9¥Î̉¾ÏÔÇçô÷ÁÑÓ²%ÁƯÛ«‚ ½9½ù×9¥‡×§‡ÙÚêöéê°»¡ÁÑæôêÏÔ¹ÈÍƠ9¥‡›¾ăƒˆ¹ÚỜÓ¡™Óƒˆ£Øµ†·ÔÅØÙÚÍË)éÛ9¥§Ôƒˆß„‡ŒÜÁƯĂÙ̀éǛ«Ó›œ™ÁÏ̉ăˆŸª¶2tTŸ}êöG½¹ׯÏ̉›vëöêö›¶éÛ¹ׯ߈˜‰j̃ZîS½€ÛºĂÙ›¡߈á Ù¹Ú¥ˆ]1©‡¥2ßëMï»˧ôÇ»ăˆŸù×߈Ï̉ăˆŸ;·‡‘×8çó|ăˆŸ§Ô¿Ø‘øµØĂÈ߈«ÚóǪ»½́–GÏÅÁ¼Û«‚ ½9ÏÔ¹Ú½¹ÁçÚ9¥‡×±»ô«‡“Íj‡ÇơêùסđÑØ߈¤ÓéÓÛ°±Á«ÓÍỞŰ»ÏÔƒv‡“·Ô¶‡Ö8æ¡Áȹ½ƒÖŸƠÏÔÁ‡é/×:·‡‘×8çÑÓ«ô“¹ƯN÷Ú³·Å£•£Ø­¾ù×ÏŃ׭v±»µ†ÉĂăˆŸ;kÂÍ?ăˆŸ€ºÛÿÛö°ÅÙ×™‰kß [ïSË¿ù×ÏŶ¦D ăˆŸ;k™‰kß [ïS˜Áăº«‡“Íj™Ó÷ˆùêù×ơêŸÅö9¥‡×Å÷åĂ9¥‡¹Ú¿‰ÑøÁÜ»³™‰kß [ïS›¾¾¾ßœï½û†ª‡’̀j£‡›¶é³Ç—¶½Ô¹»Û«‚ ½9ø×Û«‚ ½9ƒ½¿£ØéÓ©Ó—¶›¾ƠX€¼éơÍË)éÛ9¥›¾ÏԡȺÏ̉«‡“Íj¢XúƠ‡Œ™‡±Á÷Á…ÚÅư¹ù××ÜÏÍÜÙÚ©ˆŽªÚ©ØăˆŸ;߈‚¾³ÈÅĂøƯÛ«‚ ½9Û«‚ ½9üê¥ÆÖÇÇăˆŸ;k›¡ù×í;ƠXéê§Ó·¼Í7ŸÈ¹ÚÙÚăˆŸù×Û×ăºÛ«‚ ½9ÆèÿÚ«‡“ÍjÅ߈™Ó›‰áØÓØĂÙƒvăˆŸ±ëØåÁ½Ă™ÓûÙëöÛÚ́Æß»û±»™‰kß [ïS₫ăơÂèëö€ºÁƯÛ«‚ ½9‡߈Û«‚ ½9ăˆŸ;Û«‚ ½9±»í—GµØ«‡“Íjëö»øêŒÎçÚÏÔĐæ ëö¡ÈĂº₫®¶ĂÈơê—»¹ÚµaÑ‘áưĂăˆŸ;kÛדÈÛ«‚ ½9߈±»ăr¯ÈĂÙ°½ù×£äÄïăˆŸ;k™ÔÛ«‚ ½9ÁĂ™‰kß [ïS±ëؽƒv­¾°»‡ºŸè¹Ï̉»‡—¶…ÁƯ¦Ûó‹Ï̉匿N½߈ÏÅ«‡“Íj«Ôív‡ëößÁĂ˜‰j̃ZîS£É‚ưÀ—ˆ¸Úư˜™”“ƠĂÙ—¶½ù×›¾ß»ûƠYå̉ ±£ÓºÏÅ¿́«Ôºï½ï«Ôß¿¹Ú½€ëö¯Ç¾·ºƠ¼ÍƠÛ«‚ ½9ƒ×Û«‚ ½9‡Ú“Æß»ûñÆ«‡“Íj₫®¶ßÁ“Ơ™‰kß [ïSíßóÇ­¾¢XÛ«‚ ½9ÙÚÙÚˆ½€ăà߈Úª‚ +¼9Ö™‰kß [ïSï³2ͪÛ«‚ ½9ñÓË%ØƠ#÷‡ÏƠ†øơêÙګѫԭ½¼ĐÓù×°»ơê—¶ăˆŸ;ë™HóẪˆăƠ¡Á¯ÈÙÚ»½èêÓÆ‘Æ›¶éƒ×™‰kß [ïS“ÇÅÔ—»ׯ™Áºµa°»©‡¥2ßëMùׇ¹Ú±»›Û¼ÔÏÔ½߈Ă¹Ú±ÈĂÑÓÓ‡ƯÓ ¹Ú¥ÓëÓö›¾«ÔÏÅ«·3uU›Úº‚±»ËØÁĂÁ¼Ž‡ºëöÅØƒvÅ™‰kß [ïS©ÇÏÅ‹ÜƠơÔ±»ÿ¯¶ơÔ©öÁÙ±»Á½÷‡“Ü÷$Û«‚ ½9çÔ¡ÔXG½¹—đù×™‰kß [ïSÏÔˆơ"ÏÔ‡ăˆŸ;k£ØؽÛ«‚ ½9ăˆŸ;Ợ̉—éêë¼Ù½ƒà¹ÚĂÙăˆŸ}³¹íÆ™‰kß [ïSơÔ‡äÁËĂƒ¾‘Ù½ëöÏ̉·̣°»›¾ ÁÔ]±¾¾º¿ÅÏŧÔ÷‡ï$߈µa™‹¹Ú·‡‘×8ç¤Æ ¶Å›¡åƠÛºщÛ«‚ ½9󙇩ÓÁƯù×è¾ÙÚÿÂÅÔ©‡¥2ßëM“­ØăˆŸ;k­“ÈÙÚăˆŸ;±»±»Ă¼—¶™ÁĂº‡âà™ÔÛ׿ñÓ¶™‰kß [ïSßÄÙö¹Ú¯‡ÇÁÛ«‡“Íj÷Á·ÛÏÅϼÙÉ÷Ú·‡‘×8çÍÓͼÛ×Û«‚ ½9“ºơÔ߈¶rrÑÓù×߈ơêÁ×§ôÿÚ¹~ơêơÔ©ÛºÓàªÔ‡ׯ¹ÚÇÚ†º +ÅÓÏÔÛ«‚ ½9²½°»Á¹ÑÄëăÁÛ×öÁỪÇ´ÈưÀÅà©À¡ƠỞÔM£Ç±»ºÙ½ׯ™‰kß [ïSëöï—߈‡ÚÇëöº±¿­€ù×ÑÓà꨼½̉đÖöÄ–$ăà°êØÛÇÙ½ÑÄëëöµØ«»åơ—ˆ˜‰j̃ZîS±¿È̉¨₫®¶½Ç̉ÏÔÏÅù×–±»°»ÑĂ¼Ô•Èû››¾å̉ Ù½™Á½ơÔëö ¬°àèMƒvÏÔ߈ëö—Ø™‰kß [ïS匿N¯¾ưÀùëÏ̉ÇÓ¢äÅÔ÷ˆ¹¾¿ÓÛ«‚ ½9µØ©Øÿ¯¶¥ˆ]1½€߈óÇ߈Çù× ¬°àèM‹ÇûÓ§ôͼ±ơăˆŸ;«dưÀơêåôóÂ÷‡¿ §ôóÔù×¡Ûøê­½¼•ÂÑÓơĂ«‡“ÍjÏÄƯº9¥‡«‡“Íj%…đ½Ü9¥‡³«‡“Íj½Ø€¾ŸÅêÚ½8¤‡ôĂÛÀóǽ™‡ăàÁÿ¼8¤‡ŸÈ•Œ¢È̃ˆ½Ô¹ÚÛÍË)éÛ9¥³ ·‡‘×8ç‹Ç•DZ»’¹ÜNíÆ½±”—ӓƃ׭ÄăˆŸ;°êØÜùתbĂºƒˆïÚ߈„ºÇÓ™‰kß [ïS³¿‰«ÔˆÙ½‰¿IưÁĂÙív™ô˜ÁƠ¿Åÿ…±»¡»ùê߈̉Å¥‰ÍL…̃ŒÚ,âˆ:kщưÀ߈óÂÛ×£äûصØùש¼…ص.¥ÙÏÅĂÙϼºǼ÷ˆ÷Á—»ơèÅƯ˱»ŽÛ«‚ ½9·Åơêÿ¯¶Ï̉Ăº—¾߈Ü•‹Hù×®Gø·‡‘×8çÿ¯¶ơê½››¾Ó̉Ùºé‰ñ5ñ·Ø×ÏÄÁƯ·Ó ¥0ƠXëöï»ÏÔÏß©¼ưÀưÀƒˆÅÓ£äÛºÆĂºîÅ«‡“Íjă—™ëéåù×ôº÷¼¤ˆ\0ůȃv§ôÔ¥ØÙÚăÇíƒv髇“Íjɻź§Ó›ÚơÔó|ăˆŸŸ»«»±»ƠÓÅ«Ơ÷ÁÛ×Åԯȩ߈å̉ ƺÛ«‚ ½9ÙÓß»û™‰kß [ïSºƠ«‡“Íj¼̃ +Î +ơêœÁƯæØÛº×ÛÛ«‚ ½9̀Ó¼€÷êÂĂÆ—¶ÏÔÙÚ¹ÚÙÚ߈ÿÚ¡Û×ĂÈÅÄƒĂ¹̃ØŒê*ªöÎ̉˹ÏÅërçÚ¥ˆ]1÷ä5̉óDZ”½©‡¥2ßëM©»ÓưÀ÷ÁÛ«‚ ½9«‡“ÍjçÚ˜‰ +j +̃ + + + +Z +îS +‰¿I§ÛӨ龇߈߈·‡‘×8çg©Ó—¶“ƠÁ̉©ƠáÛëöºûØøê‚½×¾¯ÿ¯¶ÍÓö«‡“Íjôéö½ÂȵرƯóÛ«‚ ½9™‰kß [ïSÛסÔí—Gƒ¾‘ÏÅÿỞ±±»ÛÄÓăˆŸ;k—¾רëö‡Úù¾ù×Û«‚ ½9 Ơ¨Çñן¹Úáꥈ]1­¾åƠëöù×§ôI™Óó)Ù½“ºµØ£ÇÙŒë*«Ç̉å̉ ¡%匿Nîô€ºï³2»Áåôغ9¥‡æØ߈£ÇẳñÚ¡ÛẳưÀ…»ÁÆöØ×Ʊ»º·Ó ¥0¯ׯàˆÀ0p«‡“Íj“Ơï½…Œ§Ô­Ä‡çØüöÀ½LÛ«‚ ½9©Øå̉ ß»ûñÆÁ̉›¡ŸÄ߈ơêǰÿדñÖÍÓùשåơèÜăˆŸ;Û«‚ ½9÷Áô¥…߈ÓØ»ÈÛ«‚ ½9Ï̉™Ó°&µØ¾ÙÚ×Ü¢X«‡“Íjª‡’̀jª¶2tTÏÔÙÆëöêö›¶éăàăˆŸºÅăˆŸ;kù×¢ÇÏŹڽôơêÙÚÑźÏÅëöïÿáêëö߈™ëéåÛ×¹Ú±»ĂÙ°À χƠ¾G¨Ç›¹ÑÄ뙇ËÓ³(«‡“Íjă­›¾Ó—§Óù׋ÇÎñÆ™‰kß [ïSÙ½¡ÈÙ½±»³̃«ÔíÖ«ÔÛ«‚ ½9½¢Ç˜‰j̃ZîSù×߈åĂûÓơêùơÓµ©ÇÍË)éÛ9¥9¥‡ Ơ#öÔµaÁ½ôéàùêăˆŸ;­Ä£»íº߈¹Ú»ˆëöG½¹9¥‡”&ÅôµØ­¾¡»Á½¥ˆ]1»Øź‘É“ƠĂô—¶‰ÔÅÓ˜‰j̃ZîSÁƯàÅÔ±»YÂÙÁ½ßÚí—Gר›¹³ôùº’¹ÜN¿ºá°í—GÛ«‚ ½9ívơÄ·‘÷ĂÈ߈Û«‚ ½9˜Û׿8ƒÖ…»ßÄÙÁ½çÚÏÔ¹Ú¡Û‹Ü»Ø߈ÿ¯¶ív½ØÛ2§Ôù×ôÇØăˆŸ;ưˆ½Á¾ŸưÀíê¶£»à¬˜‰j̃ZîS«‡“Íj€Ơ«‡“ÍjñÓù¿¶ÔăˆŸ;•ƠÆØơ-‚ˆÿÛăˆŸ;¿ºÎÔÁƯ™‰kß [ïSûÓ­×¾˜ÓŸƠ‡ë‚v½“ƈ£X™‰kß [ïS̃„ Î̉áÛ™‰kß [ïSœÂ +ß»ûăˆŸÖĂ¹ÚëöºÅŸĂå̃ïÚù×›Û½—»÷Á‚vÙ½¡ÛÙÚËÇá=§Ơ³Ø÷ÚÿÛ§Ô₫˜‰j̃ZîS߈·Ôÿ†º+ăˆŸ;k¿öÙ½Ó ÇĂ˜‰j̃ZîS‹ÇƠăàÛº»ÅÛÇÏįÆÙ×­¾Íӣǻű›ÉÛăˆŸ‡̃ǼÙÚ›¡Å÷ÁăˆŸ;ÏÔ©ØăˆŸ;ö‡Ç¯ÈçôÍĽ‹Çëö8¤‡‰¿I Ơù×ÀƯÔƒvùæơê£Çˆ½ϼéÚ×ÓøêËÉ9ǾÀĂªÚ+±»½ÔÓư­ÔÎÚưÀ¼€߈ù×áêơÿ¯¶·¼Í7ÁƯÿÚ™‰kß [ïSỞµØÁƯ‡ÇĂ߈áªÇÖï³2¥Ó½½ô׿8ù×ë¼ÏÔÍÓƒˆ³Â9¥‡¹Ú½ô³z±¿ÛÄÓé‰ñ5ñ·ï½Û«‚ ½9麃¾‘§ÔƒˆƒĂ³ÂïÚ»ù×´†ª»ßÁí…Ơ߈é߈ߟ}±½½ƒ•ÜĂÈẲ±»©Ç¡Ô±ÁÛ«‚ ½9ƒv߈ÍƠÓºöñÓ™Óù×ÏÅÄÓ +ÏÅ™‰kß [ïSÏÔá ñÖóÔ¹ÚøêÛ×ù×ôµ†₫®¶8¤‡Ö£0¹Á¹Úу¾‘ëö·ÅưÀµØ9¥‡…Ö¹ÚÏ̉«ƒ×ívëöƠ·Ô›¶é†Ç߈ÏÔăàĂ¼˜‰j̃ZîS½ØĂù×ĂÙ°»ËÇ߈Ơ¾G±‡™×Á͆Œ·Èª¶2tTÅô9¥‡߈“¹ƯNØÓ͇ù×¶¥¼÷ÁÇ»ï‰ëöưÀƒvï½ß»û߈–ÓÙÚ½Íөر»Ưº§ÔƯÀ„ØơỐꔌƒvÁƯƯ‰«‡“ÍjÛÑཱ»ăˆŸ·Ó ¥0Ù½ñíÈÅÿ×ăơÛ«‚ ½9ơăˆ‡ŒăˆŸ†Ç¿́­Ä—œ™ÔLJºöùןְ¿±Áơ$«‡“Íj•Œ‡ŒÄÀ›ÚĂôăˆŸ;kù×÷¼é‡Ø×¡È·‡‘×8çæÚÿ¯¶‰¼ưÀÿ¯¶ùêߺ9¥‡ŸÖëöÿº‚½ÔX*›¶éÚª‚ +¼9ËÓÄÑÓÙڵا¹óÄ¡́¡Èû÷ăơÁÚ¿„ÀƯ¸ÚÛÀ¾©ØÙ½ƒv«·3uUù×ï³2ơê—¶º±¿™ëéå±»›¾›¾Û×¹Úơ»—ÁĂ •ŒÛ«‚ ½9Ï̉™‰kß [ïSÙ½µØöơÔÛ«‚ ½9ﻉ½ÍƠ«‡“ÍjçôÅ¥‹ÿ׷ŪڥØÁĂÛÀ¿üĂÙÚ±»Ơº¤ˆ\0®Æ©¼Û«‚ ½9ͼ‡ º½ÏÅÚª‚ +¼9ÖØß»û·ÅïÜÓØù×ƠĂíăˆŸ;kÛ«‚ ½9™‡Ÿ\ËÇ·Ó ¥0÷Á—ØÏ|́Å£ϺÍÓ…Û»—»ƒˆß¡öÚÇØëöù×ÑóùæÏŽ™‰kß [ïSö«·3uUÛ«‚ ½9«äăˆŸ;™‰kß [ïSÙ½¹Úù׃à߈ơº™‰kß [ïS“ƽ½€ÁÛÓº‚v›¾³Ă§¹—ï™ôÙ½ÓÆñ­ÄºàêÅÛ×½ĂÙÚÏÔψ«‡“Íj¿‰§ƠÙÓö½©Ç9¥‡×߈ïëö‚Ú“̃«%¼ô³ÂÅ–½ö߈Û«‚ ½9ĂĂ ›­±àéMÊÈ9^ª»¥ˆ]1ÙÚƠËÖóÄÛÄÓ§Í›v«‡“ÍjŋǯG‹øù×Û«‚ ½9º“Ñ«‡“ÍjÓ«·3uUƯ‰“È€^¯ÈỞÛÀëöơê½ñÖơ꛾“á¾ß₫Û«‚ ½9§È߈™‰kß [ïS™‰kß [ïS߈µØ߈—Œ™‰kß [ïSö±¿¿àËÇơêùă›¶éÖÆ˜‰j̃ZîSĂÈÙ½¹Ú½€ø×¬Èëö­ØàöÁ½¡Ô™‰kß [ïS½€»½Á¾ï½ºôĂºư“ Ëû­Ö™”щ¹ÚÛ«‚ ½9ëö‹ÜñÚ™‰kß [ïSăÁ0ª‡’̀jçÚ‹¿›¹߈ƠµßG½¹Å¥ÁĂ÷ÁÿÚøà»ˆ’ºï½ÁÁ¼Ûº©ÓöÀ¹ÏÔĂÙïDÙ½Û½Ù½̀Ởù×çÚ‹ÇÙÅ멇¥2ßëMăˆŸ;k¡ÈÀ̉ÙƠÁ×íơ»̉‘¯×Æ_ăˆŸ©ÜÏ̉©Ơ߈»Åù×™‰kß [ïSỗˆÏÔ£ô9¥‡Ë̉Û ƠÅÓËÇÙ½±ÔÓ̉߈‡Ûëö¤Ü›Ăº«‡“Íj«Ó«b½€ûÓɇÖÆ̃ˆÙ8¤‡½ÁƯÛ«‚ ½9êöÙÚưÊ¡Çﻫ‡“Íjăơù×áÛƯ‰Ù½‘ÖËǤ‰̀L„ăˆŸûÓ«Ñưˆ³½«Ñ߈߈×ÜÇÖ™‰kß [ïS9¥‡êöÏÔ騉¿IĂƠùÚëÚÛ«‚ ½9ÇÖ9¥‡§ÔáºÏÔƒv²ÈÙÚÓÓửëÖ¥ÓăˆŸ;åĂđÙ‰¿I÷Á±»ăˆŸ;ÓÆñ©Ü©‡¥2ßëMܳ½£ä£»«d™‰kß [ïSª‡’̀j±»ñ¿ÁöÁĂ£ÓơèÅÛ«‚ ½9ÊÈ9ºƯÓ Ơơ‰¿Iù×ưÀïƠâḈÏÔÁZ«â±ƒvơễÁ™‰kß [ïSËƠ×±»ÔXăˆŸ9¥‡Ûê뜕Œ9¥‡‡ŒÛ±»§Ø™‰kß [ïS«âơÔ…‚ÂĐV¤ +́ù¿±¿ơèÅăˆŸ“ÆåƠưÀă½íÅÙŒë*«ß„½ô¨ ù×öëö×Ơ±»«Ñ«‡“ÍjÏÔơº›Úù×½Ăƒv›Ô™‡̣ÄÛÄÓßÄÙÇĐ‹ÇƠ‡ÇíÓ±¿Úª‚ +¼9ÁƯµ‡ÏÅÛ«‚ ½9˜‰j̃ZîSƠôêù×̣¤ˆ\0µØ£ä“©Ø×Ơ†7§jù×ÑÓ­¾ÑÓÙ¡Ơ«Ôμ…ôäÆtăàăˆŸ;kÆuǼ·‡‘×8燺ơèÅ‚văੇ¥2ßëM̃ˆ½ÛÄÓË̉ƠX™ôÚª‚ +¼9©ØûÁø×ÏÅ©ëö‹Ç†“™‰kß [ïSăơóg߈º¥ÆåôÏÔ±»ËÇÿÚß„åô«‡“ÍjúÙ£Ø߈Û«‚ ½9߈ÏÔØïiĂ–¶øê ™ÔöÙÜ­Ôù×äÁÛ«‚ ½9ׯ÷ÁăºϼÖŒƒˆׯ™‡«ÔẩëÖĂ¿‰Ú×ÍÓ¯×ß»ûô½ù׌₫Ù½­¨Û«‚ ½9ưÛ%Û«‚ ½9µßÍÄ÷ù×ûØăˆŸĂº8¤‡·ÜÇÖŸÓYè%Ù½é(Ư‰ÙÚÀ̉ÁôơêƠ¼߈¶ù×½ăˆŸÛ«‚ ½9‘ÆĂÈÙ½™‰kß [ïS¬Ä»·Å¹ÚÙÚăˆŸ;Ù™ô¥Ø‰đ¼»߈¹Ú™Óơ…‡Œ“¼ÓØÆ«&©”Ï̉ê,ƒˆÙ½Áëöëö±»…«‡“ÍjĂÙé¾µØÑÓëö¾ĂĂƠ†Œå̉ ‘g±½ưÀ9¥‡ÙÚŸÛï½çƠöǼ¹Ú½‹Ç²¾³Ưºù×ÏÔƒĂÁ×ÅÓ¾¤ÆÙ½ǼăˆŸ;§ô×Ü9¥‡ºè‡ƒ×ơê߈«Ú¡ÁºÍB¹ÚơêcÑÓĂÙ½Î̉«‡“ÍjÀĂƠ«ÔívÛ«‚ ½9…Ó±½™‰kß [ïSµ‰ÀƯÚ× ÄÓ߈߈±»£ ÙÚÚ ª ‚  + ¼9 ½ÔƒÖµØ‚vå̉ ÿ¯¶‹Çù×±»Æ½«‡“Íj©¼ÁĂ¡Û£äÁƯÍÇä̉×¾Øívº½ÈĂèÏÔ¹ÚăˆŸ;Ïű»ùד½ÓºŒ₫™Ó¾¹x±»±»«ÔÁĂÓ½ÁÓ¹ÚÙ½íê±»ăˆŸëöăˆŸ;9¥‡öÏŽ†“¬Å÷‚Á÷å5Óµ†©Ø‡Œ¡Á¦¹ƒvÙ½½ô¬sÖ‡¼7½ëö™ÔÓØµØëöÀƯ™‰kß [ïS·‹¿ôÛÔÿÚº9¥‡×•øí—GÿÚïÚŃvï½ÖƒÀô·ÔỞÍÄăˆŸû±ÅӋȆçÚĂº©‡¥2ßëMºß½ăˆŸ;ä̉ï»ăˆŸ;kăˆŸ;û§â«â£Ø߈Û«‚ ½9½¯¾ÏÔŸ«‡“Íj麿߹Áå̉ ±»ƒ©º°»á ăˆŸ;–¶Û×ù×ƯŸÈ¿×³ÈăˆŸ;÷ÙóǾÀ¹9¥‡ÙÚÏÅ÷ÁÇ̉߈·ÅËÉ9ĂƠÂÙÇ̉±ôÁƯ‘Öívçôù×£Ç÷ÚăˆŸÔXª‡’̀j„“ć“£‡Ơ¯Û«‚ ½9©Ǿ½ØÛÄÓ£À¢» μÑÓǼù×ăàñÁÛ«‚ ½9™‰kß [ïS·‡‘×8ççŒíÖ±»ˆÛˆăơ†Œùꙇÿ¯¶ÇÖÅ·‡‘×8çƠg·Ó ¥0º̉µpƠ‰¿IÁĂ½¥ˆ]1êö¿ôù×ÑſڻØߌÛ,™‰kß [ïSăù×߈áÛưÀÙ½½ÔăˆŸï×Ơ¼9¥‡¡Ó›Ú߈¿‰Û«‚ ½9ŸÈđ™‰kß [ïSæÚ߈Úª‚ +¼9߈ëöé‡Ó¾ĂĂ ›­±àéMưÀƒv9¥‡í—G%ÙÚ¯àß½ăˆŸ;åôù×ËÖ¡œô©ù¾·₫îíÄà߈­Äµ!匿N߈¿́ùתƯçÚĐØ™‰kß [ïSÛ«‚ ½99¥‡Ž9¥‡¿‰ư“ñÓÿ¯¶ÙÚÛ«‚ ½9×ÜƠöÁéêçÚ8 ¤‡ Ö­è³½Û«‚ ½9ÑØåĂÚ*ª*‚** +*¼9*¡Ư·‡‘×8ç—Œ߈¹#÷ÁË̉Úª‚ +¼9¥Á¬ôö +×¾¢ä§ÀÛÅù×¶øê“Ʊ»Óº/ºû(Ù-«Ỗ»úÓ³¨º­Äơê×¼½©‡¥2ßëM¸Ú רµ†Ž÷Ú•4ÏÔ«‡“Íjëê¡ÛĂĂˆơ“Æ—Ó™‰kß [ïSÁ¹Úºçض¿çÉ ưÀÏÔ™‡óĵ†·‡‘×8ç°¿ +¿»µØñÓϼñÚ3±»IöÅô±»×¾Éa¡Ô˜‰!j!̃!!!!Z!îS!·‹·Å¯Èù×Åר°Á™‰kß [ïS™ơ±»±»ÏÔªâá=™‰kß [ïSë¹½ù×ù×9¥‡ívƒv9¥‡×ß»ûÛ«‚ ½9ơêÏÅŸIÚ½ÏÔñÄÛÚ£ÇÏí‘®™‰kß [ïSơÔăơÏ̉ù×™‰kß [ïSÙ½߈·ÅƠÊÓ½Đˆù×ăˆŸ;ơ$å̉ ëö±»©ÀÍÓ³ÂÁƯ¹½ơê¡ÛªÜÛB·ÅÁÛăơƒv•Èû›±»Úƒvô‡³È¡Û̀Ó8/¤‡/đ¹˜ ù×¶ÍƠ±»ÿ¯¶›ṽΘ‰j̃ZîS÷Ú«·3uUơÔƒvÉ̉ĂÈÇØÿ¯¶í‡•Œv>¥Á±»ç½Žø×̣Ô ¯̣¿ô”‹ œH ï½å̉ ™Á÷‡ÏÔăˆŸ;§Ô§ô9¥‡Ľ̉ºå̉ ùêÓ/Ë¿ÙÅëơº·¼Í7Íñ»“ơÍƠơêÿ§ơÔ‹Ç±ăˆŸÁƯÂñíÈÍă֯G‹ø»Øö×Ú‹Ü×Ă¯¾Û«‚ ½9Úª‚ +¼9Ú½ËÉ9Ëӳȫ‡“ÍjơêñÆ÷Á«·3uU©‡¥2ßëMó|íÆÙÚù×ơÔÍÓùê¶Çð»¡È߈±»ƒˆ•Œ“È߈‡x½±ºª‡’̀jµØÂÓÑÓ»Øá íJ©‡¥2ßëMÏÅÈ̉œÔ«‡“ÍjÇưÀăˆŸ;˜‚Ù½Úׯ¼­¾Ûǰ½ơÄÖ¾8¹¼›£Ưư“ª‡’̀j…Ø©‡¥2ßëMÙ½«̉ăˆŸÛ£ÇÓÔö󶯼ºÛ×ÁËçÚÁ ÑĂµØ™‰kß [ïSåºÚ×£»Ü߈ŸăÛé¼¹Ú«‡“Íj±»ơêé‡ù×ƯÓ ‡ÇªÚÔơêŸÅºĂ°»áê¡Ø«‡“ÍjÎÔÛ«‚ ½9°À—Ûà类Žԙ‰kß [ïS˜‰j̃ZîS¥‰ÍL…ơêÿÂëö§à¹»ˆíqÁƯ‹Ü¾½ÿ¼ívÇ«‡“Íj¿º¹ÚåÁ߈ø×ëöăˆŸ;µØ©Ç¬ÄëöỞ‡ăºĂÙÖÄ Á õ†÷‡§Ó³ÈÚÀ©‡¥2ßëMƯÓ ¹Ú™ÁºÅÄ­Ä匿NÑĂ·‡‘×8烽§Óù×¹Ú߈̣Âׯ“Æø×¡ưÓÛ«‚ ½9»Ă߈ÓØƠXƯÓ °»³—¶±%ăˆŸëöĐÓưÀ¸È °»ÓÅÛ×"™‡ĂĂ ›­±àéM‘)Ïż¡ÛÅÓ$ĂÙÎ̀¬H‹ÜưÀăˆŸÅĂ×$Úª‚ +¼9‹Ç߈ÑÓÆØÙ×Ù×ù×Ù½ßÄÙ‹ÓôçÚé׿8ëöù×ù¿½Ç»«·3uUÏŇïÁƯ†Ç‘Û¿‰«»½€ï½¥ˆ]1ѸÖ¹ñÓö©ÓׯƠăˆŸ;߈ÏÅÅÓÙ½̃ˆ«‡“ÍjÛ×ÙÚ³ă€ëS·‡‘×8çÁ½ÏÅ·‡‘×8罃ˆƒ×µØíÖé³ç4ƒ+©‡¥2ßëM™‰kß [ïSǺÏÔù×ơÔ™‰kß [ïSçÚ·º¡ƠơlÁ׿ܱ%‰ºñÓ¡Á›Û•ÇăÚÛ«‚ ½9œÂÙÚéêÏÔ¯Üù׿ó+¾—˜¶¸ĐÓ›¾Î̉Ù×§Ô£„щ߈Â9¥‡·ÔÛ«‚ ½9æØơĂÍÄcvëö×Ơăà°»ỔâÄăà±»ËÇñÓ†“÷ÁưÜ™ô¯×ÿ&‹Üö·‡‘×8ç­½¼™‰kß [ïSĂ߈™‰kß [ïSÅçÛ«‚ ½9ÁÚ¿à—»ăˆŸ¹›¾Ïԃؙ‡›Û³»̉«‡“Íj˜Ó‡“±½ù×Ï̉ù×ĂÀ¼åÜÀ‰¿IÏÔµØÛ&öå»™ô¥Ç¡ÛˆÛ«‚ ½9›¾¯ÈÙÚưÀÛµ…ÖÏžƒvÑÄë€Ơù×û(¹Ú¬ÔµÏ9¥‡©ƠÅØ÷ÁºăˆŸĂÙ—»±»ñÓù×±»ûÓĂÙ¹̃ăˆŸôØ™ØÄÓ†ÚÎÔÑÄë°¿ÿv†¸îÅ«‡“Íj£Ø±»¯ÈËÉ9‚اַԷ‡‘×8穱»¹ª‡’̀jÛ«‚ ½9²º̣©đÍÓÏÔÙŒë*«á øêÅØëÚéӵؿ‡»ÏÔÿ¯¶ƒù×Àñ»±»³ÜơĂçÚÛê½Ă‚vÏđÏ̉’Ơ‹Ù޳àơÔôêưÀơÔ©¼ôê%ÓØÙÚ̉Æ$—¶•Ó:­v5±»ƠĂÈǼvùêơêƒĂ£»ï½ƒµÛ«‚ ½9ÙÚíê¼ëĂƠăˆŸ;·ÔăˆŸ;½ôƯÓ Ñà9¥‡ÏßÅØù×™‰kß [ïSÁ½½µ›Û©ÓщÿÚăˆŸª‡’̀jÛ×½Ăùê«Ú†Œ™‰kß [ïSÓØöÁ¿‰Û«‚ ½99¥‡§ÔßÁ·Ô«Ô‡a߈ñÆơÔ½ä̉ÂăˆŸǼçôăˆŸ™‰kß [ïSç̉ưÀơê™Ô½ƒvưÀ¹Ú‰ÛÛ«‚ ½9¦ÆÏż­Ï̉ö߈ÑÓơêÛ«‚ ½9ăˆŸ£X›¾ßÁ—»ăˆŸ½€å̉ ơ»·‡‘×8çơÔëö%̃ˆº±»‡Ç¿‰·vÓØ°êØô¹Úùê­½¼߈°»µa9¥‡ÿ.ÙÚƒvơêµ½ÖăˆŸ›Úóǵ†º«‡“ÍjƯº±»Ù½‡ºÑĂÅÓÛ«‚ ½9øê¨¾ ½íêơèÅ߈ƒÖ¿‰Û×Ởâ¼ÇÖÔï½ÍÄ·Å߈¼ỘÂư%›¶éÿ¯¶“î®×çÚÅԿ߈ø¦Æá €˜‡¡ÈĂÙ·ôº«Óºôê½ƠXµØ‚྘‰j̃ZîSÙÜơꙇ¡Û¹àưÀ̉Æ̉̉ÁÓÉ̉êö÷ˆÏœƎM¡ÔÚóÇá ëÓÙÚ«Óù–ßÁØÚßÁ˜È Ëûƒƒvë}¸Á•Èû›ÙŒë*«ÑÓàê‡Ă9¥‡×ÏÔËÖ̀Ó©»‡ñÆÑ§Óù×9¥‡ÙÅëƯÓ áºÏÓ¾«‡“Íjù×ăˆŸ;k߈›¾Ơ߈ù׫·3uU…¦ăơÁƯ¹Ú…nù×åôÏÅ߈«Ñ¦¹ Úª‚ +¼9‘Ʊ»›¾½ù×ÇÖÓƒˆ©Ó߈퇩b÷Áä×­‹ÇôÔ‹Û½ÁÅÓµÀăàóĂ™ëéåù×·#ׇ½7ôƒvÏÔƠđں½߈/ØŒê*ª¡™ôÏÅívÏÔ‹È߈™ơƒv÷‡·Ó ¥0‹Ü­ØÊÓ“¹ƯNôêÏÄ«»ƒv‡“­Ä½™‰kß [ïS’È™ö±»áêÛ«‚ ½9ñÓåĂơèÅ‹ÇơèÅ›¡çÀăơË̉¥Å‰½¸ÚĐÄê¿àÂÙ©ˆßÁêÚù¿¥ơ×Ơ¡Ô“Èëö×Ơ™‰kß [ïS˜ÈùêÙÚÏÄ÷Á«‡“ÍjơêưíƒÚº½ ó+¡Ô¡ÁĂȩӱ»×$¯‰¯0½±¿Á‡é/×:ñÓƒˆ©‡¥2ßëM°»›¡ÉăˆŸ»»‘«ëö½ù×™‰kß [ïS³È™‰kß [ïS߈9¥‡Å8¤‡çØ™‰kß [ïS½…Ôơl½ÏĈÛ×Ë̉·Ôóǃv¾ưÀÏÔëö£ä¡ÛÚáÛó¢ơÔ½÷Á°»“½̃ˆÍË)éÛ9¥ï‡éÓ¿́ÿ¯¶Ù½«»Ç÷Ơ«Ô›¾ỡÍÓÚª‚ +¼9ĂƠăˆŸ«Ô‹ÙüÁ«ÔŽÙ-Íĕǫ‡“Íj«‡“ÍjÎÅ•ŒϾ¥O¹Ú«‡“Íjù×Û«‚ ½9™‰kß [ïS±»ÑÀǺ­¿©&™‰kß [ïS¡î©ÓÙ½±&ïôÑÁăˆŸ;kËÖ÷‡ù×÷$Ï¿«‡“Íj§ô·Å‘³ü¦†ơêÅÁ«‡“ÍjÏÔÏ̉Áùê߈÷¼á ÿ§•½ÏÔ‡ÇÛ×ÿÚ˜‹É̉̀Ä(Û«‚ ½9À¹ ߈ÍÓÁ±»­Ä߈ÂÙ«‡“Íj™ëéåÇØ™Ô‹ÇëÚ®Ơ¯ÈÑÄ믾߈Œ½ÿ¯¶Ù½ÏÔăÇí₫®¶ô¹»Ơ¾GƯÓ ·ÅÔXé‡ù有¾IƒˆÅöÁÿ¯¶×¼½ØÍÄÑÓơÔ—¾ÛˆÅÓù×—»›‡ëc‡x¿Øº›¡ƒˆ½™´ƯÓ ÷ÁûÓ½³ÊǵØÉĂÅ÷‡µØ…Øù×»ºÏÅ—¶ÀƯ¶¢¢ĂÙ«‡“Íj½щơê±»äÁÈ̉ÁË™‰kß [ïSÖ$Ѷ‘Ôƒvå̉ ­ØôÛ«‚ ½9ó^ơ»ÍĂ›¾ƒvôßÚÀÚª‚ +¼9¼¿́½¯́ÅØÊÇù×ÏÅÚª‚ +¼9ăˆŸ;©Ç«Ư±)±½Ûڛ걻¥–ăêƠÅÀÙ÷¼ăơĂÙÎÄÏÔÂÙÛ«‚ ½9™‰kß [ïS›ç‰¿IïÅơÔׯ߈Û«‚ ½9ƒvÍĂ›¡ăÇíψµaå̉ öĂÙºûa›½½ôÍÓ±»£¿Ù‡­9µØÅô“Ûƒvéê©Óù×ơꕽăÇí߈€Á4›ÚÛ«‚ ½9Ö½“ǃvǼÛ«‚ ½9‡ÇăˆŸ;ƯÓ ¯ÈÛ«‚ ½9çÚ¸®­–±»éÓÈ̉BăˆŸ;u×̉½Ç»ÍË)éÛ9¥“È…(輘‰j̃ZîSÏÔ±»¸¾µØÆÖơÄÙÚ™‡óÇ߈ƒÖÓØƒơÔ÷ÁÁ‡é/×:ûƠưÀ©ÓƯ óÔ·ÔÍƠỔ£ô‹Ü™ëéå·‡‘×8ç¹ÚÛ«‚ ½9¾±»ÑÓù¿½“È£äưÁ—Ó±»·‡‘×8çƠ‚v9¥‡ƒ»‚¿‰߈Ởó#åÁêö™‰kß [ïSͼ ÇÊƠµØÿÚ½íÖ—¶Ùâ·§D ö×¾ÏÔ«ÔôÅ…aÛ×ó¶ßÁơÔ…ô½ØµØ«‡“Íjÿ¯¶ëöăà±ëØëöÏÄAÿÚù×Û«‚ ½9Ï̉³È¹à—˜Û«‚ ½9ÖÆÅÓ·ôƒÖÙÚưÀóÿÂëöÆĂ麫»ß»û«£Ô¹¨ÓÿÚƒˆÜ½€Á*ÁƯ÷ÁƠXçZ£Ç×Ơ®¼ÀƯ߈¡ÔÿÚÏÔáꣻ÷ÁY­ÄưÀ¡—»½‰Æ©‡¥2ßëMÑæ½Á×ÛÀâÁ ÉƯ÷ï…ä匿Nù¾•KăˆŸ;óÔÿ÷›¶éºÚ×˜ĐØ‘đ©‡¥2ßëM±»ßÚ߈à¤<™%—¶æºÆÚª‚ +¼98¤‡×麩‡ÚƒÚ«‡“ÍjóÔ »ôꙉkß [ïS߈—Ó߈êÚÑÄëÏřعÚưÀơº“¹ƯNÏÔÖÆÛº½±»«ÚÙ½áăˆŸ›¾ßÚ©¼¡Èô±»ƒˆÙÁ«·3uU¸Èív߈çDZĂÍƠ½ÛÄÓ›ÚƠù×ÁĂÓÅܺ̀Ê)èÛ8¤Ù×ÑĂÈ +†“×¾ÅÔ™Û¡È¡Ç߈ËÉ9­ÄƒvÁ¹¡ÔưÀí­Ä³ôĽï»×±ñÚ£äĂ«‡“ÍjÛ«‡“Íj©‡¥2ßëM“¹ƯNƒÖƠÙŒë*««‡“ÍjơăvƒvñÓÇ»¾ëÔù×èêÇÖÅϬ€¡±»Ø×Û«‚ ½9Ë%ăˆŸ;éÉźùט‰j̃ZîS³ ½ÔÅ%陉kß [ïSËÉ9ƒ¾‘ÏÔ˜à!Ăèƒ×°»µa匿N߈¸àŸÅ‹ëóÂßÚùêÙ½₫‡·‡‘×8çÎÅ©¼8¤‡¿ºơÔÛÄÓ‚v¡Èï³2½‡º¾óÇ©ÓßÄÙ™‰kß [ïSƒv‹Ü½€ÔXó³ÛỂÏÅ£ØøêÁ½³ôÛ«‚ ½9ßÏ‹ÇăˆŸ‰Á³é›Û/ÅÓ«Ô…»™‡äôƒ½ŽƒÖăˆŸăˆŸ;±½™‰kß [ïS¾“Æéơ÷$«¼9¥‡íÆ÷Úƒv©ÓăŽÉùêơ»µØå‡æƠ ÂƯÑÅû(å̉ ¶ưÀơÔçÚù×…»ëö÷Á¯ÈǺ½÷Ú©ØÿÚ¯ Í̉ÅηÅôăˆŸ“ƠơÔº™‰kß [ïS…Ơ÷Á“¹ƯN‡ÚĂâ×Üá ש¡Ô¡ÈÎÔ½ÓÅÓ÷„Ï̉öù׋ÇÏ̉Û«‚ ½9ëöÓº©Ơ¯ÈăˆŸ½ëöè‰đ5đ¶­ÖŽ›·ÔçÚÏÅ‹Ç߈ơêăàùơ·Ô™‰kß [ïSËÉ9÷¶׺̣ĂÓ̉Û«‚ ½9§½ÏǺÁÎŧ½ù×™ÁưÀïƠÑÓ½ØÑÓ™‰kß [ïS¡Ø¾ÍÄÀ¹™‰kß [ïSăˆŸ³”íêíÖù×ăêÉƠX°»‘øçơêá=æ̉™‰kß [ïS¿ßÙÚ×ÓĂ߈ëö‹ÇÛ«‚ ½9Û«‚ ½9ÙÏÔÁ̉íêÓ‡½ƒ¿ß½Ơ¹Úƒà°»¡È¡Û̉Å Ù½¬Ä µaơÄ¿èáö›óÇǺ߈ÁăăÁÂÆ—¶ôêç¼9¥‡ŸØǼŸ}ùêăˆŸ;k½»ÏÔÙ½¹ÚÅÔ«»Ù½ƒv”·߈9¥‡µØ‰à£‡½¹Ú9¥‡“Æ߈å»×»nÛÄÓăà›¾º¼¾¯¼ËÉ9±»ɇÏ̉ÅØ‡ºăˆŸ;k«Ô‹Ç«»ƒׯï±ó[Ç £+ÓÛ«‚ ½9³ºó±¿ưÀ¿ÅÛ«‚ ½9¹Á£ÓÅÓív÷ø©ÓƠÙƒÔíÖ¡Á߈Á¹̃Ω‡¥2ßëM׿8ψ¿#߈麂v‡ºó"£?•ÚĂ ›Ú÷پ߽ƠXơêӹŨëößÄÙÀĂù×ßÚà̉ëÔùסبÇĂÙ¶ÜÙɇß»ûÅØ߈Ç»§ô±¿ÅÓ•ÿÚçÚ¼êÓơêñÖÛ«‚ ½9›ß»û¼…ôíºă»•ÇÛÀùסۃ׿‰Ûº½©‡¥2ßëMÿ×¥ÛÚÀ¹¾ơêÛ«‚ ½9ßÏëö™ëéåƒØ£ƯëöăˆŸÿ¯¶—¶®Gø©Üµ‰ưÀ±»½ĂääĂÙ½©‡¥2ßëM«â«ƠƠ?Žÿ¯¶÷‡Û«‚ ½9½€¡ÔơúÜ¥ˆ]1¤‰̀L„ÏÔÓ'…ÖϺ÷‡ëö«Ô§ô›¹§ô¿‰ƒv½€›·Ô±»Ûºơԓȧؗˆù¾‰ÏÅ›¾±»µØơÛÛ×™‰kß [ïSù×›·ÔßƯå̉ £»«‡“Íj¿‰¿Åº½™Ó¹ÁÉÁÏÔ¿ÔÉĂ·‡‘×8çñÓ¡«ơÔéÏÔ£îÇ%÷ÁÙ½¿‰„aƒv«‡“ÍjĂ¼»Øÿ¯¶¡Ô£Xùê”Ö«dÙƠôêĂº·¼Í7ĂƠ“¹ƯNÏÔׯóÄÏÔ«‡“Íj¡ÈµØ±»Û«‚ ½9™‰kß [ïS«ÔƒÖÅÁÏÔY«‡“ÍjÁ×êöù×¥ÈßƯ9¥‡áÛáº́ÍĵØÜơnĂÙÁ¯Ó¬ÄºÏÔÏÔ½ù×ÓÅéôñÖƯåÛÀëöôÔ·Åí‡ăˆŸ;¿Åùêç±»º¨&·Ø›væ' ߈‹Ù9¥‡ƒÔ·‡‘×8çăˆŸơêÁ ËÖơÔíÆÏÔö»ˆÛºơêχ›·Ô‡Ç“È»Åù×߈™ôÄӦر»¼ö₫®¶ÏÔå̉ á¬Ö“ƠÿÚ¥Ă£ä·‡‘×8çùê±»—ăù×¹ĂÈ«Ó߈™Ư™‰kß [ïS«‡“ÍjóЉơ‹ÇÍÓù×›œé‡óẲØç̃«‡“Íjù×™‡¡ÔɇÑÓ“Úăꆺ—¶ƒÚ£ØµØÓØׯ«‡“Íj½µØ̀ÓÛ«‚ ½9ívÅÔÙÚơêÅψËÉ9àö­RëöƒÖµØÛº™‰kß [ïS±»Û«‚ ½9™‰kß [ïS8¤‡×‰–½‡À£Øº™‰kß [ïSÏÔɇù×™‡˜‰!j!̃!!!!Z!îS!½€ívщÙÚ¥ˆ]1«‡“ÍjÑÓÖØñ×Ởơ$¹Ú„Ç·‡‘×8ç°»“ÆÇØ‹ÛÎÅơêÛ«‚ ½9Û«‚ ½9—¾«‡“Íj¬Ö©ÇƯ³µß÷຋ÜÙ½£ÇĂăÁ߈£»¬Ö;ăାª‡’̀j³”óǹڡ»¡ÔĂ·Ó ¥0¹ÚµØñÖ¿ô«‡“Íj߈±»ăơù×™‰kß [ïS£ Ù½£XóÔÁߌÛ,Û«‚ ½9‰¿I…ôéÚÑÅ¿½·Åó|·‡‘×8ç©Ç‡ºùË«·3uUưgå»9¥‡íơÙ߈Ù«‡“Íj“º°»ñÁ¯¾™‰kß [ïSƒ×ívÁÜÏỐv¹®ƒˆ“Èÿ+¡8¤‡»ÁÓ±»±»£Çº½­ï•×¼ăÁ«ÔĂÙ°»gùê¾ ăàùו%̣Âôê%ñÚÏÔ¡Á¿ôÉĂë¼ø×“È%£Ç«‡“Íj‹Ç«‡“ÍjĂèǺ¯Ü÷Ô߈Û«‚ ½9«‡“ÍjÓ¼ñÓÑï½›¶éûØÍ «‡“Íj•Ç‹ÁÿÚ…»ÛÇö«·3uU¿»ƯÓ Ù̉•Ö®“º ÛÁ̉°¿©¾‡Œ‡Ç›‡ÍĂ­Ô½ÔÏÄ«‡“Íj›ÔÖÆ±»­Ä߈Û«‚ ½9£Ô·ÔÿÛ½‡xÅàñÓßÚÏÔ›¾Û«‚ ½9±Ô–¿R©Ø8¤‡Öå̉ ö߈߈ƠÂÙí—G°»Û«‚ ½9ăˆŸ÷Ú™‰kß [ïSÛ«‚ ½9éêˆÉÿ¯¶™Ó«‡“Íj­ØñÓƒ¾‘ĂȺÏű́ͯƒ« +>öµØËÉ9‡ºϾ¥OßÖ‹Ç“Ơ·‡‘×8ççÚ™‰kß [ïSƒˆ«‡“Íj×Ó§àơĂå¿›¾±»÷ÚƠX¯Èùë°Áˆ±»ôpÂ߈¿Å±»“È߈ßÄÙ“¹ƯN«‡“Íjó‹°»ưÀÏÑÄëăˆŸ;Ù½áƠỞÍÄÁƯƒvơ꫇“ÍjăˆŸ;Û«‚ ½9ׯ©ˆëöÙ½ÇÖ§ÓÙ½ù×¾–ÁËÇ₫«‡“Íj§ƠĂÙÔ/í~ñÆƠX—Œ«‡“ÍjĂÁĂ·Å‡º…ÑÅÔăˆŸרơ%£ØăˆŸđÆ¼Ă¼“Ơ÷ÔÇÖơËØûÓ́vñƠ¶£ª¶2tT¿º£ÜÛ«‚ ½9µ¸à¸ÚÅÔ­ÖÚ×ưÀÛ«‚ ½9˜ÁÀĂÿ§ù×́½ Ï̉çơ±ÛÁ¼ÏÔù׫ÔÏÔÏÔ÷$ÓØ½Û×·Ó ¥0Û«‚ ½9ª»ÙÅëñÓ³«‡“ÍjívÛ«‚ ½9À¹ —¶“ƠÛăˆŸ;™‡§ôºĂèœĂª¶2tT—»8¤‡×÷Áé‡ÿ¯¶™‰kß [ïSÁƯø¾­ÄÄÔÙŒë*«•ŒĂÙ¥Ö‡Óŵ߃«‡“ÍjơÔ¹Á¼˹÷Á³‡Œơê߈ÅØƯºñÆ¡ß™Ă¶ï6ÑØÁåùơ¾«Ô©¼Û«ÔăƠŸ\£ä¡Øÿ§ÏŽÔÁñËÖ¨ÿÂ߈ƒvíçÚ½Đ©›ÁƯơŸ­vÁµ†·‡‘×8穼ÏÔÙ½™‡×ĂơêÑÓç̀Ó÷$±»Áăÿ׫ڵ؛¾߈̉ÅăˆŸ;k«Ô₫Ú÷ˆÛ×ưÀÄ_߈щ¼»ưÀăˆŸÁ˱»ù×›¾Ä‰̃ơ꛶鯼¹̃ùêïÅơÔ‡Ơơ«‡“Íj…ƠĂȼ‹Óæôù×… ˆÉ‚vñÁ³z‰»ï‡ƒÖñÚ£̀›¾ÀƯƒˆ×¿8̀½ơÔëÔ°»›¾Úª‚ +¼9½™‰kß [ïSŽÏÄÏ ÏÔù×ÏÅ߈Ở“ØçÚï‰ơèÅáêÏÅăˆŸ;k¡Ụ̂ÄÙÚ«ÔŸÖöÁơèŽ₫®¶ÿ¯¶±»‹ÙçÔ¡£Ô¡Ô8¤‡©¼çÚÁƯ‹Ü˜ơỞ‰Û»ˆÍÇ Ëû°»¡Ù¹ÚÏÅ«Ô߈ñĕֿ»™Ó¸Úêö“¹ƯNóÂÙŒë*«ÑóëÔ¾רá×ǻٌë*«ÍĂ÷»Ù½ŸÈÜ ‡Œ߈—¶±»Û«‚ ½9÷Á©Üơááê±»±ëØÛ«‚ ½9˜‰j̃ZîS¤ˆ\0ù¿̀Ê)èÛ8¤£ÇÇÖçÚÛ«‚ ½9ÏÔù×ăˆŸÏÔùêø×щăˆŸ§ÔÏÔß»û•̉ù×ߌÛ,“¹ƯN‰Ûµ†Ç\¨¼ùןƯ$»Ẹ̀ÄáÁ•Œ’ƒÔ߈ø×ăˆŸ¡ÈăˆŸ…׫‡“ÍjÚª‚ +¼9øêÛ«‚ ½9³Èƒv¿º¼Á×ÿÚÓùדÈ÷Á¡Á¯¼±»ƒÚöÁ½Œ¾£Ư£ÇÙ½Û«‚ ½9ɇ­Ö¾º ËûÓÆăÔéêöç®Î̉ơưÀø×«‡“Íj«ÑÆ›¾ëöÑĂ¿ÅĂå̉ ÛÀ‰¿IơêÓµéÚº~9¥‡ÏԉԼر»÷ÁIëƠUƒv߈©‡¥2ßëMù×—ˆÛº×ÓçÚÄ"óÄëöźÀ¹ï½±»ù×ëöÛÀËÉ9ÁĂÛ«‚ ½9ơ»“¡›¾ăˆŸáÖÔ†6¦j½Ô¢Ç«‡“Íjù×ëöÅó¶ụ̂Á¹¾ưˆÅóʽ¾‡ÏÔ‡¹Ăè³È߈¿Uº½ăˆŸ;óÔ„Œ÷Á£ƠËÇÑÓ˜‡‹Ù­÷罋ÈÍBÛ«‚ ½9ơ–™ÓÍÄ9¥‡×‡ºëöëöéÓ÷¼½Ø×ù×°¿ù¿ưÜ™‰kß [ïSÿ×å¿ĂÙơçô©Üû(ɇÛ«‚ ½9°»ívÙ̉ơêÏÄÏÔ¥¾¾è§Ó¹Ú«‡“Íj߈ÏÔÍÇ…Ơ´†ÙÚéÓ™Ó÷‡µaÇ»áꩇ¥2ßëM˜‰j̃ZîSăˆŸ;Úª‚ +¼9ÙÚËƠù×¹ÚϺ۾Žÿ§ÛÀëö†ŒÑÓ«»É̉çÚщßâÁ½ÏÔÙڇͭ£Ư«»Ïà ¥‰ÍL…ùטêèä³ëö™‰kß [ïSüÀ×¾×ø™‰kß [ïS½±»ơĺù×߈ƒ¼ׯƒöóÇĂÙ×¾ï»éÓ™ÔÛºƠÙ½«Ô¼€™Áƒv†Œ—¶̀Ê)èÛ8¤¥ˆ]1ÍUŖ϶ưÀÙ½ÏÅ­Ä£ØÛ~ôù×÷Á«‡“ÍjăˆŸ;ƒù׃߈ï¿߈ơêù׌ÿÖÔ†6¦j…ö™ëéå×ĂÙÅ뙉kß [ïSơêëMûÓÛ×ï½ \½ÑÓ¼ÔƠs÷Á߈óㄨ›v߈ăˆŸ™‰kß [ïSù×­Ø߈ùê©Ó‡ñ5­ˆÁỬº½™‰kß [ïS9¥‡¾©Ơ¦ôר«Ôà¬ù×”ÇÖĂÙ«‡“Íjû)›¾Ÿ#ºƯÓ ÷Ùù×è‡ëăƠƯˆy߈ƒvËÉ9ôÄÿ¯¶Û«‚ ½9ƒvÛ«‚ ½9Û«‚ ½9ưÀŸÅñÓÛº¡ÔÓ¹ßƯ×½ñƒ¿§Æ‹ñÖÑÓơêù׌Ơ‹Ü߀}÷ˆó«âơ$ĂÙï½åô›¶éÅ»ϺµØơÅ­Ä9¥‡×¢X©Ó¡¾µØ›¾Øíăà«Ó½4“ÈÇÖÛ«‚ ½9ï³2ÏÔ±»½€‡Ú‘–£ạ̈ÂƠÁù׃։»ÑĂ©ƠïŒÛ«‚ ½9¶߈߈ɇù×åù׵ر»óƒ±»±»í—Gû‡Œù¾½Œ&Áă½ơêÅ»‡“«»Û§Ó8¤‡öÁÛÀ¹Ú¡ÁÙÜÛöùê…ÂÍÄ¥\½$ăˆŸ;ơêÏÔÏű»ưÀźĂÈ÷‡8¤‡Ö½¢v±»åÖµÏù×È̉ù×Úª‚ +¼9ơꙉkß [ïSÏỘ׃vÎÔ˜‰j̃ZîS߈·‹ơêŸÛ«‚ ½9óƒԡ©‡¥2ßëMÙ×ëöÁ Á÷Á߈ƒv߈ăÂøơÚÆ Û©‡¥2ßëMƯö·ÔºÁù‡±»Ñ·ƒvÛڶʼnÛÑÓ«‡“ÍjƠÝv©ØÙÚ±»±¿Û«‚ ½9±»Ù½ëöÛ××Ơ¾‡ÇƯơù×9¥‡߈ÏÅÁ̉±»Ù½́½g‡x»n±»áêµÈƠµ†È̀½¸ÚÀ¿ß£ä’ȱ»·È³¹ËÔ—¶ù×ÍÓơê߈9¥‡àêô߈ÇèÛ«‚ ½9ÿ¯¶˜‡©&ƠXǺÁ¹߈ơèÅ“ƠơŶ‡Ö8æßƯƠÉóÂÛסȽ‹Ü9¥‡Ïáê¿ô±»ÿÚỂÛáܺƒÔÛ«‚ ½99¥‡ơ»œ·̉ ¤0…ØơêơĂ’ÈÏ¿¹ÚÏÔºÓÆÏ̉ƠX±¿±¿éô—»ăˆŸ;kĐÄêăÇíó¶áßÚª‚ +¼9Á̉¡ĂĂ“ÇϺß»û¹½º×÷ç̣Ԯ׫ɽƒˆ‡ñ5­Ưå̉ ÔXÔÄÛÀˆ’߈÷ÙïiéÚÂÙ½–»©¼¡Ôƒv„ô™‡Á̉ơÔơ굆›Úר÷Á߈ÓŬևÛÀáØÅô³¾߈÷ˆÏԨdzå̉ ăˆŸ;«Ñ» +ĂÈ—¿ÁĂ÷ÁË̉øàÚ×Ï̉9¥‡¹Ú»ÓµØÏÅÛ«‚ ½9Û«‚ ½9—¾óLJù×ĂÙơÔÏ̉µØưÀ¿̉߈Ù½߈ù׫‡“ÍjÁ¹ÚăˆŸ;k¢ ñÖ«Ú«‡“ÍjáêµØª»×ùÀ½ă½ƒvŒĂù׆“­ÄÙ½ăˆŸ;±́¡Èµ.¥Ùåô·ôăˆŸ;ÙÓ½£Ø’àŸèÑñ»…µØÁƯÏÔÛ«‚ ½9±»¿½߈ºŒ¾Å±»±»€ƠăêăˆŸ;¹Úá ùד¹ƯN]ëÚÆ±»àăˆŸ¾¯ôóÇ©¼‚v +ùæªdÍƠ‰Á«Ô¹ÚĂ¼µØ÷ÁÁƯßÚăˆŸ;k«‡“ÍjđÓÿ¼·ÔüÀËǹÚÀĂ +«·3uU‹Ç±MÂ١ԃׅƠ¹Ú©‡¥2ßëM¡„'ăˆŸ¸ÚƠƒˆ¡½ôÛ×ËÇívûØĂÙăˆŸ;߈«‡“ÍjÑÅ™‰kß [ïSºëöÏÔ„Ú«‡“Íj½€½ăˆŸ;¿ß›¶éͽơêÙÓ“ƠÏÔ»ƒv£äÇÖáŸóeƒvöÁ›¾±»±»Û׫‡“Íj÷‡½Úª‚ +¼9 щ½ëöĂÙ»ˆ¥ÛíÖåĂŸ\®fÅ»‹ÇÛÄӸׂv˜‰j̃ZîSñƉÍÙ½̀ Ê) èÛ 8 ¤   ¤ˆ\0¡È›¡±»ïÚÙÚ¿‰·ÜÄØù×ÙÚẨ ÎÔÂĂăˆŸ±»ôö¾ĂÙ™Ô¿‰ÏÔñÁÙ½éÚ÷™9¥‡®ÈƠX™™óÇăˆŸ;½Ă­ÄµØß„×̉ùבƱ»ơê÷Ôăà£Xƒv9¥‡¯ÚăˆŸ±»œØù×±»шêöÁ©Ú¹Ú¡Ô­¾ÓÁYùê¨Ø¿¹ËƠÛ«‚ ½9¥ˆ]1½›ÓñÖ¤¾¥Ó™‰kß [ïSÇ%åĂÚª‚ +¼9ưˆ÷ˆ›¾ăˆŸ;‡¿‹ÇÛ«‚ ½9«ÓÍB¥Ó×±ñÚ£ØÛ·‡‘×8ç出½¯È÷Úø×µØ¥ˆ]1–¦̀»÷Á“ÈÑÄëÛ«‚ ½9çÚĂºÉÖÁ«¼¥Ø½·Â߈ơÔ‰¿I†ÙÚÅà±»ĂÙä̉  È̉ÿ¯¶‹ÜăˆŸ;ÏÔù×߈ٽ廒ÛÏÔ©ˆ߈ơꛡ¿‰ĂºƠº±¿›¾ï»¡ÔØÅê߈Ü щ‡úÏÅ™‰kß [ïS½ôµØÅn¡»ÙÚ±»«‡“Íj»‡‡Œƒˆơ$ø¿©‡¥2ßëM±¿™Ø9¥‡Ă°¿‚vëÓöÁÁ½—ˆ½ÙסÛá ¹Á…Û̃ÄØ߈«ÔÏÅ»רáô›¾ÍË)éÛ9¥ù×—Ó˜‰j̃ZîS—»ó¶½ÔưˆÙÅëîÏĕֿ­âḈ½¾‡¡È˜‰j̃ZîS™ëéåơèÅơê¸à ™‰kß [ïSƠ•ÿ¡Û…Ơ™‰kß [ïS´ÀÇĂĂÏÔéÓé‰ñ5ñ·ƯÓ ù×áÓ“Ơ߈•Ó:ÓØ¹ØûØ߈ËÉ9Úª‚ +¼9‰¿I±»§Ó©¼½Û«‚ ½9‰¿I™‡½€Úª‚ +¼9§¹Û«‚ ½9öđÙÍÓëöÙƠƒvȇ™´Ï̉ëöưÀÙÚ—ˆ—¾‹€éô›‡ăàăˆŸ;k½ù×ÑúăˆŸ;ËgăÛ¹Ú¹Úẳ·‡‘×8ç±ëØÙ̀ƒˆơ$Ơ‡Œƒ¸Úùê߈ëÑ­vÛ×çÚ•½±»å»ßÖăˆŸ;kÿ¯¶°»óÇß»ûơêÏÄßÁÍƠ›¾‚׫ڱ»ëßưÀ«‡“ÍjăˆŸ;߈óÔƯº±»ƠX›¡±»óÂü̉ ߈¡ÛÛº‹Ç«‡“Íj₫üÀëö™‰kß [ïS¹Ú˜‰j̃ZîSÁƯơêÍ™‰kß [ïS¹Áíä¾Ǽ³È« ©ƒ»5ưÀ’ȥȲÂÏÔ­ôŸÈívÎÔ£ÚÙÚ‹ÇÛ«‚ ½9±ëعڧөܯțÚùë¹ÚÄØĂ$ºÛáưÀăˆŸÛ«‚ ½99¥‡ëö™‰kß [ïSÚºíÓÏÅ÷‡“È•Œù×· ­ÖñÁƯÿÚ¡ÈƯÓ ù×ªÚ +ợ«‡“Íjÿ¼ë̉ËÉ9¯×ĂÈùÛﻷž‰Û˜‰j̃ZîS9¥‡ÇÖÏÔ©‡¥2ßëM÷HÏÔÀĂ8¤‡×î*‡xÑÓÛ«‚ ½9“שÇû(çÚ›Ôô£ä“ƋǙơó˜‰j̃ZîSăˆŸ;ơú½ëö‹vÁ×½á ÷Á¡ÔơềÇß»û¡È±»ÁÓ¹ ©¼º™‡ö˜êèä«Ô÷ØăˆŸ»Óƹ̃‡k̃ˆщ¾ßơ»åÁµØ“Û̀Ê)èÛ8¤߈§Ø«öívÙƠÙ×ăˆŸñÚëööÁù×ÏÔé¾°¿ ‚¡ÛÏ̉ÍÓ™‰kß [ïSưÀÎ̉щ¯G‹øº½€ƒˆ°Á™‡•1‰à‚ÚóljéăˆŸ;Ø̉ƒÔ½Ô¿‰ÏÅÓŽ۫‚ ½9é‰ñ5ñ·Ž˜‰"j"̃""""Z"îS"Û«‚ ½9£Ô±»·‡‘×8ç׿8íÖÏÔï½™‰kß [ïSƒØ̃ù×öÁ¼ĂÙ›Ú忱»°¿£ä–ˆëö!¾½ÔĂÙ¿°µØÎ©ƠµØ«ÑÿÛ̉Åؽ Ø×Áö‹ÇÛÄÓ­vѶ¿ô»ØóÔăˆŸÎÔ·Ôí—GĂƠ§J̀õØỂ•Œ±»ûœ·Å¿‰½Á½ăˆŸ߈Ɍ۫‚ ½9÷‡ÏÔ·‡‘×8ç—¶±»ŽÁƯßÚ‡x·Å¸È߈¡Û©¾ívô¶Ü³Ÿ¹ÆG½¹ÙÚûùê½Ù½ÄôËÓ×¾±»Û«‚ ½9µ†ÿ$ÄÔÂÙĂæÏŵØÏÔ‡„ÇÅÓ©«·3uUóÇơềº×Ơăơå¿¶±»Ổư“ÏÅÅØëơăÚ—¶ª»ÍÄÁ|ªdƯº‹È±»˜‰j̃ZîSơÓ̉½߈üÁëÚ×Ơ÷Ú‡ñ5•Ó÷‡˜‰j̃ZîSëö߈«‡“Íj½Ăă»ë¼ĂŸÄ©‡¥2ßëM̃„Á̉±»ăơϺ÷Á¾ăˆŸ;k…±Û°߈ÏÔ¼öÚÄ̉ĐÓÍBö÷$щăí¨º·ÔƠÁÅœÁÚª‚ +¼9Ó‰¿I°È>÷ÙÍË)éÛ9¥ñÓ¯ÅÓ±»Ă¹±»©Ó ËûôêÅÓ‹ÇơÔ½ƒˆ»Ø«‡“Íj±¿Ô߈ëù×ÑÄë’º§Ô½…€­:«»—Ó‡߈ƒàÛ«‚ ½9±»—Ó«‡“ÍjñÚîd²º̣ÓÁÙÚÓº‡Ú“È—ˆùë‡̃—»‹Ù9¥‡×Ă٣些ڕ½±»÷Ú₫µØĂÂÙ¾Û«‚ ½9ÁÖ ƒvÂÙ—¿ăơ…Ô߈¡ÔĐÓƒv™Ô™‰kß [ïSÛ«‚ ½9ù×÷ÚÁ‡é/×:¾Ó¾é¼é•å˜ÁÏŠȑȽ—¶«‡“Íj«‡“ÍjĂÙƒˆµ†¹Úêöù×çm”ơÔ¥ˆ]1߈»ÂÅ¡­Ä…Ơ­Ø©º߈çÚá ù×ö›¶é‡‘×8çƯưÚ¹g‡º™‰kß [ïS¡»¹ÚÑÄë‹È™ëéåß́êëö®ĂÚ×ăˆŸ;߈·‡‘×8穇¥2ßëMù×Ù½éº߈³Ơ£äÏÔưÀëÔÙÚÏÔÍË)éÛ9¥âàăàơêƒv߈ɹö«‡“Íjëö¯ÈƠ•‹Û«‚ ½9Ù½„Ç*³ƠívưÀÛ«‚ ½9‰ä›Ăù×·‡‘×8ç½€ñÚïô‡ŒÏÅƯˆƠÈơêù×™‰kß [ïS÷Áç̃í½ÑÓ™‰kß [ïSï³2Ó̉ĐĂÁ¾ăˆŸ§Æ‡ºƒăļĂÖÆ6·ÔÙÅëăˆŸ;k™‰kß [ïSî½Ä–ñÓ¹Úëö«‡“Íj†¾ÇŒ³ÂÔ½¥ïÏÏơêăˆŸ½ô™‡Ï̉ă»ù×ÏÔĂ×Ü¡ÿÂÛ«‚ ½9™‰kß [ïSÏÔ߈ëö°½“ÆÿÚÁỬÆÅØ€ºƒv߈ô´êå̉ †ŒÁă‹öëÔơÔ÷ˆ±¿ÛÇöéơÿ¯¶ƒv·‡‘×8çÍĂÁ̉çÚö±»«·3uU™‰kß [ïSÙ‡­9ÙÚ¯ÈÏÔ½€¶Ô«Ô¹Ú‡(ĂÙĂºëöÛÀÅԻثâÁÙ½÷‡ÙÚívÿ××¾8¤‡ëöơ» %¥Û›ÛÖØêÚù¿ÁÁǺĂöÁ9¥‡ƒ¾‘ÇÖ±»§ºÑØÅ»ƒv¿‰ÏÔ±»±»ú¹±ÏԵاØơÛï½µ‹ưŒÙ½߈ñ䇣LJǛ¾– Äê¼ƠëöÔ µ‰±»¶‡Ö8æ§¹‰¿I÷ÁçÚÿ&Úª‚ +¼9ÇâÇèÙÚù×ööÏÔù×÷ÙƯ¾¯àô»ÑÇÇăˆŸ•Œ»Ø—¶ÄÔÁ½¯Ơ©ÓÇÖĐÓÜÀ)éùוºÉÖƒÖăˆŸ;ßۇǫ仇Ở¹ÚŒÓÇ·÷‡« ©ƒ»5ÏÔÙÜÛºéêÏÅưÀÏưÓÁÓÛ«‚ ½9™Á8¤‡ÏÅׯ¶±»·‡‘×8çÛ«‚ ½9ơ‡Å–ÏÅ—ÓÖ¾ÿ¯¶¿½«d¾©ÆÓ̉ÏÔ9¥‡ïiÛ«‚ ½9™Á½ÍÓ±»±»Ú׃vƒÉ(‚vÏÔĂÙ«‡“Íj™‰kß [ïS‰¿I¡\½€é‡x©ƠÁƯ›¡߈ÓºÏíØ³ÏÔå̉ ½ÓÏÔï³2©‡¥2ßëMĂº™‰kß [ïSơèŹÁçµ½ƒ×ׯÅÛ«‚ ½9ÏÔĂÙע߻ûͼ´†ÅÔ÷Á»»µÏüØăà™ÓÛ¹·‡‘×8çăÇ탾‘½±»ĐæÇĂẳăˆŸăщ›¾³±»Ă² «Ô±¿í‡÷ˆ̀Ê)èÛ8¤­¾™‰kß [ïS±ó×ư߈¡ºÛ«‚ ½9Û«‚ ½9‡“9¥‡¿Ø½€ùÚÛ«‚ ½9±»ÿ'ƒÚƯÓ ëÓ„»“ºƒ½ÎÔ­ÄÏԃ׫ÔÔƯÓ ‘ÆăˆŸ;kăˆŸÛ«‚ ½9߈ª»óÂöƒv嵨ù×½€’¹ÜNÏÔÛ«‚ ½9±Á¹Ú韫·3uUÁƯ¿¹±»ĂÈă‘·ÙÚù×™ơ­ÄïƠ™É—»Đ`±»ؽÓÅ$…½µÈÛ×ĂÙµỮˆơêăˆŸΈ߈ÏÔ‚ùב³¹Ú·Ó ¥0‰íáêù×¥ƯƒvĂÙÓ̉«Ô9¥‡×ŸÿÚå̉ ¹È¤ØÛ«‚ ½9Û«‚ ½9̃„úĂÀ½ÏԆ׹–«‡“ÍjÏ̉ù׃v“ƠïÅ“¹ƯNÖÆ µØƠ„öÓ‡ºÏÔ½€€Ç *ÿ¯¶ĂƠÁĂ×ÜéÓåĂăàÛ«‚ ½9¾±»ß»ûûƠï‡ăˆŸ;ÙÜϺ߈ĂȯàƯº™‰kß [ïS˹¿ÅơÔƒvÍӣӓȶ  ·ôöéÓψ­½¼ơĂĂóÔ™‰kß [ïS¿Å¥ÛºÙ½Ñ±»ÏŹڿøê¹Úëö™‰kß [ïSƒvÓÓƒvÿ¯¶¦½Ṇ̃ëöÖÚ«‡“Íjª‡’̀j·ÔăˆŸ;ÈǺÖƯӃvưÀƒvÏÅÙÚźÓØ₫®¶³­Äó‹ˆÅÓŻӨ“¹ƯN›¾ó|ùê›¶éœÁ¢Ç¹ÚÏÔĂÖÛÄÓáÛºô£ÇÅÓ˜Ô·Ó ¥0ĂÙéơ¡Ôƒv±ëØÓäăˆŸ;·Ô©Ó›¾ƠÏ̉¿ØÙŒë*«ù×ø¿ñӨיÁư‡±ù1ºóÂ…ÙÁƯôơ»9¥‡×¹ÚƠ»±»Ë̉öˆ÷ÁùêÏÔ¾ºƠ]̃ˆ‹ÇívÙÅ륈]1ˆÇØŽù×Á‡é/×:·‡‘×8çƠX9¥‡ăˆŸ;í‡ÏÔ¡Ô™Ô¡È¿ôÿÚ‡º¡Ô߈¿ºÁƯ¿Ù°êØăˆŸµÜÏÔơ±»߈îº́½ï»™‰kß [ïSÉ̉µÏ½×¿8µØ×Ăé9¥‡›¾ñÓÿ×—»ư»9¥‡ÛÚ÷ÁĂÙшáºưÏÔµÛ³Ͼ¥O›Ú©‡¥2ßëMçÚƠơóÂÙÚËÉ9ï¯ÅÄơêÅēƙëéåÇÖ™‰kß [ïSÅï‘Ú«‡“Íjëöߟ}¾ôù×øêƒvŸÈÑ·ÁĂáîåơŽ·Åß»ûÅÔ’‰2Ô,øŸƠ•%·åÛăˆŸÍÓï½®¼—¶§Ô€ºÉ̉ûØÏÔñÚÂó›·Ô¹Úăù³ÚgÅnăà±»ùוŒưÀÎÔ±»ùêéÚ‡ºÏÔ½ẩ¾ưÀ¼ÜÇ̉ï½½€ÎÅăˆŸ—ˆâÁ±»½ĂÙ«Ô•ŒÏÔ”ÿ¯¶ Û«»³ºóÇÖ½ăˆŸ;«‡“Íj³˜‰j̃ZîSùסÁÏ̉ÏÅ߈ÏŇ9Ơºm´½ÎÅÓÏŧøÉ²ØºØ‡Œ¹Ú‡ƒvgÿ¯¶½¯ƒßͯ¥'=U#QK¯ÂÏԵ؆7«ÚĂ×Íù߈Á¾øơ ËÓ¿¹—»·Å‰¿I©ĂĂÈÙ½Óˆ•=‘ỞÿÚûØ̃ˆ +ù¿Ïăˆèêù×ưÀ™ô߈Û«‚ ½9Íæù×»ÛÄÓ ’È™Âáá‰ØăàÅÓÇĂ«‡“ÍjÁƯÛÄÓ–ŒĂĂ ›­±àéMœ‰¾Iơê8¤‡Ö¹Ú¡ÈăàÍĂ8¤‡ÖæÚÙ̉ä̉åƠׯƒ߈ăˆŸăàźû½æº…Ơ±»×ƠÙŒë*«߈µÀÏ̉ăà†Œáê±ó³Øvù×÷Á€Ä«·3uU£äÅ‹ÜƠ«»ăˆŸ;Ơ²Œ¡Ô÷‡Ô9¥‡×øºψÏÔƒơ·‡‘×8çĂÙ±»öÅÓçÚ«Ô˹ĂĂăˆŸ;ĂÖϼ·Ô‰…¹Úùר—¶°»¼ ¹Úÿ§ù×ơêÏ|Ñæ߈«‡“Íj÷ÁƠơèÅăˆŸ;ăˆŸ;²ÂíÆ‘Úơº·‡‘×8çø×†a»ÙÅÓăˆŸ•¥ØÁ|Û×®Ơù×ë˜HÏÔ…»†º©Ó˜Á™‰kß [ïSƒv©Œ¾Ï̉‹ÓÅÙÑÓ—¶Íӵ؛vÑÄë¡ÛăˆŸ·Ô“ǵ­È—¶˜‡3ƒÿơÔ¿‰ƒvĂºíÆÁ×ï½Ï%ø×߈Ưºn½Ü³ÈăÊÏÔ«‡“ÍjÆÅnăơ·#èÓœÜÿÇëöçôåê£äö´aéơׯ¡Ô“ÇщÙ½ÏÄgŒăÁ…ÚÏÔÚ…»ñ%Úª‚ +¼9÷Á³Èơêù×ׯ¹£ÅÄÏÔˆv×ƠË̉™‰kß [ïSëöï$ÅØ‹ÜƯÓ ăˆŸ;Íӣ܃vÔX¥ØÏÔÏÔ¿‰ÏÔÁ±Ơë ·Å£ä¾ỞÇÖ¡ÈóǡǗ…íÁÿ×ÅÄöƒvºĂ±»ÍÓÂÙÁƯÙ½ÇÖ³߈9¥‡ŸÖƠăˆŸÚÀ•ÜÊÖºÿ×™‰kß [ïS¸àÍĂËÀÛº‰Ơù×ăÁÏÅ¡ÁÓÅ¿©Ó©)­½¼ƒÖ·‡‘×8çÏÔÿÚđÚ߈Ÿ}Ù‡Ï9…ó¸Ü÷¦ÆĂÙăˆŸ;¿ºëÔßÔ¯¼‰ë³Ô¹ÚƯÚ߈˜êèäÏÅ¢» ù×·Ü»Á³…ôŸ}°»µØ“LJŒ»yƒˆ’ù×µØ̃ÄØ·‡‘×8ç“ÈÅÓĂÙ«‡“Íj߈ƯÓ §ÓÄÓ«ÔǾÛ«‚ ½9Û«‚ ½9áÓø×ĂÙÓ¼ù×ơèÅơ‡´Ü₫®¶¹®ï½ƒvƯ‰™Ô¹Ö½ÏÔáêÛ«‚ ½9ơèÅ ÁÙӆǾ«‡“ÍjÂĂơêñץȻǺ÷å5ÓßÄÙ¡ÛÍı½³Ư#eÛ×£X°¿ ăˆŸ;º±¿ź¸Ø—»œ‰¾I±»öù×¹Á‰¿IÑĂăˆŸ«Ô®×»̉íÖÓ̉Ă“¹ƯN¥ØæÚÏÔ÷‡ơêĂơÔÑÄ뫇“Íj·Ô߈ơêÇtơêÁĂÛ«‚ ½9½€ưÀ…ù‡«‡“ÍjÛ«‚ ½9µØùº³Â9¥‡×±³Ư‹Çå̉ ăˆŸ;·Å“Ⱦ¡Ô…Ù߈ÓÔÛ«‚ ½9±»ù×ÿÚѾưÀ‡ŒăơÛÇá×ÏÄ«Ôψƒˆ³™±»·̣ÏÔÛ«‚ ½9¡»÷Ù·‡‘×8çÍƠëÓø×Û»÷ר¨ÓÏÅÓºô«‡“Íj‹ÇÑ·Ö¾ăˆŸĂȃvƠá$ƒvƠ˜êè䘉j̃ZîS™‰kß [ïSµ†«ÔĂ)½©‡¥2ßëMĂ³¥âƒˆƯºÿ¯¶́vûÓÿø‹ÓµØăˆŸ;¬¾‡ÑÆÖó™‰kß [ïS½ç¹Úêö­ØÑÅ›¾­v¥Ư9¥‡×ívù×àƠ'ÙÅëƒÖÙ½ăˆŸ;kó½̣Ä—Û½½ô±»щ›¾…»߈«‡“Íj߈‚véÙÓ‹ïư9ơơ»yÍåÏÅ9¥‡×ËǰÈí—GăƠ™Ó¼Ôª»ưÀƒˆ÷ˆÛ߈›¾ƒv‡x«‡“ÍjÏÔưŒ™‰kß [ïSß»û¯±¿¤‹Èß•Ăȱ»ÉĂ›º÷¼“Ơ¡߈Ûº­€½¹)±»ÏÅÙ×ÑÓ…Ùܩث‡“Íj©¼ÏÄéÔÑĂÏźy ăˆŸ;©ˆ›½ÓÓ™‰kß [ïS¡Á«‡“Íj¸Úÿ¯¶ĂÙÍB©Ü£ØÇÖçôÑÄë߈·ØỞĂñ»˜êèäñÆŸ}ÙëöëƠỦÅ ăˆŸ¾ơ®́“¹ƯN«ÚƒvĂô™‰kß [ïS‹Ç½ϼÛ«‚ ½9®¼ǾͪíÉơÔ9¥‡½ơê×¾Á‡é/×:êöơꩇ¥2ßëMù×ËÓ°»߈ƒØ‹ÓưˆÿÚÄØ›¹Ù×÷‡ñÚ߈±̉Ï̉ƒˆÙ×Ûró×±»ø×ơĂq8¤‡Ö®×™ÁçÇ™ëéå׿8÷ˆ̃»úÏԽܼù×¾™‰kß [ïSĂȱ»ÍÓº±»ÏÔ±»›ßĂêöÙ½ï³2ÅØÍÓ9¥‡×éÓëưÀ·‡‘×8çÑæƒÅØ«‡“ÍjÏÔß»û«•©Ç¥ÓщôÖÙÚ™‰kß [ïS«Ô­ƠƯŸ}ưÀŸ¹ƒˆÛ«‚ ½9ăÇí߈åĂ•Œív‰ÛëÚ‚vï»Ûºç̃âˆ:j¾—ˆ»Å«‡“Íjù×¢èê§çÚßÚ‹Ùù×ÏÅ¥‰ÍL…ÙÜßÚù×ÜÍË)éÛ9¥‘²ñµÀöÁ±ëØ9¥‡—Œ—»Û«‚ ½9ÏęӘÁ̀Ó¶ÏÄù×›¶éëö¯vÁ¾ƒĐ«‡“Íj̣ÛÄÓñӀı»Ž߈óÔƯÁê$µe¶ÅÔªÚ ¡Ô—úÉĂÿÚ›¹˜Óù¿¼ôͪ¹íĂÙµúÓß»ûå̉ •½ăà³Ç´a߈÷‡˜‰j̃ZîSă½§Ô€_¡È¾ăˆŸ;k½¾‡Û«‚ ½9ÂĂ߈°»‡ŒÛ«‚ ½9Æ»™‰kß [ïS8¤‡êÚ×Ơ­ÄÛ«‚ ½9éÚ™ÓÏÔƒ½Ï̉§ôÏÔĂÙá ±»›Ú¿è¶èŒºöâˆ:µØ«ÔÏÔß„₫®¶çÇă½ĺßȃơêËÓ—¶¡ÔÏ2¹ÁƠ¸ÅÛ«‚ ½9‹€ÙÅë©Ø¡ÛØçZăˆŸ;Ɇx±Ư˜‰j̃ZîSÁ̉Ó¼½Œº¼€¡Ô•ν̉ÆËƠơÔá9ăˆŸ;kʹ—¶₫ ®¶ «Ú±»Û«‚ ½9‹Ü™‰kß [ïS³ÁĂÛ«‚ ½9߈áêñÓźä̃«ÚÛ«‚ ½9±»¡Á“öû̉µØ—Œẳ™‰kß [ïS½€₫®¶±»«‡“Íj¯¾¶‡Ö8æ÷¼Ù½ù×ß»û«ÔÓÆâˆ™ÓÏÔ‚Ø©¼ï»ù×Đ+¶²”Ù½ù×¥ˆ]1ơêÛ«‚ ½9û߈ÅçÇÛ«‚ ½9Öº—¶™‡ÚêµØÏ̉ưÀÚª‚ +¼9ƒv™‰kß [ïSù×¾_ß»ûöÔ½›ÛËÓ¡ÁưˆÁ²Æ9¥‡×¼ƠÁƯ˜ôù׫‡“Íj›¶éƯÓ ºyóƒàÁ̉¿́ͼƠXÅÔƒÚٽٽÏÅÙô±Á›¾ëö̃»úŽÛ«‚ ½9‚÷ÁÆú(ÛÄÓÙÚ¶—¶Û«‚ ½9÷‡Á½€Û«‚ ½9̣íê Ëû8¤‡ŸÅ₫®¶ÓƒvÛ«‚ ½9ẩƠƒÏ¿ÏÅ¡Ôëöơ$“È߈“ƠĂ¼ë ¥ˆ]1‚ĂÙµ†¨¼ÖÅÔ‡ŒơÔ½€±»úÆ«‡“Íj’ù×”º)ï½9¥‡¹ÚÛ«‚ ½9Ă„ÛÄÓËƠ•ºéÓ̃ÄØÍƠƒvÖ¼Á̉ËÉ9¥!ƒvÏ̉ª‡’̀jíÜ¢äơÔ¯ÛÓ¾÷Á£Ø·vëöëö‹Ç½çÚơèÅù×¹à›¹ר‰’ƒvÙ½ÑÓÁƯÛ«‚ ½9ºÿ µØơ€÷‡©ÓíÁź°»ưÀƒÚ§Ôͺר½¿Å®GøçÚÿƒvÑÓÛ«‚ ½9Á‡é/×:«d›‰9¥‡›¾ÿ¯¶±»«ÔéÓ©Ó́vù×ù¿ÏĽÇ%ỞÙ½¿́߈™ÓÀĂÙÚÑÄëöĂÙßÄÙœ‰¾I·Ô‚v¡È¶×‹Ç±»ßÖ±»ơêƒÚ̃ˆƒvÛ«‚ ½9›¾ù×ĂÙÏÅï³2Ù×üï凾½¥ˆ]1Á̃µØù״عڛ¾ùê±»ÏÔ‚ØÅ¯‡Ó½ƒ̀Ê)èÛ8¤ăˆŸ;“Ơ¹Ú‚vj¿º߈ÑèêèÔ¬ÖÙÄÛ«‚ ½9§ôϺ‡xÁ¾Û«‚ ½9Ù½ïpÿ¯¶×Âû½½›¶éÙñÓ9¥‡ơÔ‰ƠÛ«‚ ½9ăơëö™‰kß [ïSâÁơꙉkß [ïS9¥‡×ÛÇ9¥‡°¿©ÓÁƯ‰¿I˹­Öăà£XơÔ‚v•)ăˆŸÍË)éÛ9¥­Ö9¥‡›¶é߈ƒÖׯÛÆ·‡‘×8ç}›¾™ëéå˜ờÓ߈÷Á¹ÚµØùêÿ¯¶™‡Û×ïiø×½ÁƯµaÏÅ躕%ßqÇØơØ‚vºĂù×Ù×ĂÙ­Ä·Å×¼ù×ͪ́vă½ï»ŸÈưÀ¡Á£äĂÙ½€áê÷ÁÙ½ù(«Ô¾º©ÀĂ¼±¿ÙÅëưÀÚê߈¡»ăà™‰kß [ïS¥ˆ]1‘‡¿áêÛ«‚ ½9Óœګ‡“Íj¿ôù×ú(•½ëö™‰kß [ïSÙ½ÛÀÏÛ«‚ ½9Û׃¾‘·‡‘×8çŸÅÛÅØÅêëöÂûØÊÖƯÓ £ä§ô¯‰¯0¡ÔñÖÚÚíơ»‡óÇ³à™‡Ù½¼è÷Á‡x§Ô½ôơöÁ3ëöëÚG½¹9¥‡ëö½ÔïđÀ¹ơºÁÇơê9¥‡—¾ĂÙÏ̉÷Ù«»ºĂÙ¯à÷ˆÏÔɹ߈©¼ÇĐÄ’ê’™‰kß [ïS©ÓơèÅÍË)éÛ9¥±ëØÏÔƠ½€Úª‚ +¼9ëöí‡ĂÖ«‡“ÍjơĂ½ºÙ×áêÏÔ±»¡¹»ăơĐÓÑ´±»ÁÙªÚ̃ĂÑĂ߈ÿ‡‚vÛ«‚ ½9ª‡’̀j¡ÛÓº›¶éÅÖ§Ó±Á¼½øÜ¡âñÚ‡Óª»™‡ăơÚÀ÷Á˱›¾­Äƒv×Ăç̉¹È£äï³29¥‡“È86¤‡6ÖŸÅ̀˜‰j̃ZîSà=∩Çù×¥‰ÍL…Û«‚ ½9óÇôÔ“Æ·Ø·‡‘×8癉kß [ïSâÂ3¹ÚëöªÚ‹Ù±ëØÿ§“ƠˆÅØ«‡“Íj·Ôå̉ ơèÅÛ«‚ ½9ÉĂ߈߈ưˆ™Ó9¥‡ÓØíÆÏÔĂȸڵaóÂùêø×ơê‹Ù«Œö°¿½‰¿Iù×ăˆŸ½±ºÏhƒv–»̀ÓơêùסÛÚ×ăˆŸ×ƠóÖÙÚëÚ½Ÿ¿ëöظÚƯ¿ÏÔ±¿™‰kß [ïS›ĂơÔ½­¶½€¶Å›Ú߈ŸÅÛÆÁ̉ÅÓÓ̉éÔÔăˆŸ;ö±¿߈ƒˆÁ̉̃ˆ™ëéåæ™‡R¹Úëö«‡“Íj“Ơéêû9¥‡Ä²ăÁ‡xíÁ±»ÁĂ½ơº¸Ú—ØưÀ¼Èóºٽ¨¼ƒvù×íê€ÙµØÛøÙ×±»½ô—¶¹ÚϺ¡ŒỌ́Ç£»§ÔÎ̉ù×›¾Ñ·‘€߈ö›¶é¡Ôéêƒvÿ¯¶Û«‚ ½9Ùû̉Û«‚ ½9¯ƠĐÄê­½¼±ëØÉÜ›¶éÁ½¥ØĐĂ˜êè䩇¥2ßëM̃ŒÚ,߈«‡“ÍjăˆŸùש¼ø× óẨÅ­½¼§ôÏŧԡ釻‹ïÁ‰¿Iƒ‡½ÑÓÍƠÙ×׿8ưÀ¿ôÏĹڹ͓ÈË%½ù×™‡ÙÚá ›¾½€ĂÙëöûÀ¯×ï³2“Èơ‡™‰kß [ïSó£ ™‰kß [ïS­¾Û«‚ ½9÷àö«»ƠÓÅ©ˆ½ÍÓÔ3ñư»ÏÅ›vÛ«‚ ½9ù×”Œ9¥‡Ù×éºĂª¶2tT™‡ơ‹Üº…Œ½öÏ̉ív“Ơ‰¿I°»§đ©‡¥2ßëM÷ÁßÄÙ“Ơ·Å߈íºéÚ½€öˆ²º̣±»ÇÖ±»±»±»ÁÓ‡ºÓºßq‡̃ÿÚäĂù×ù×ÿÇÓµרơèżÛ×Ù½÷ÁĂƠÏÔÛ«‚ ½9‘ñíJ¡ÔÛÄÓ‘¼—Óƒđ·‡‘×8ç̉ºƒ¾‘ăˆŸÍÄÅØ½ÍÓÛ«‚ ½9÷Ù²Æ ½Ă‹Ç•Œ߈Ù½ø×߈½€Ö̉ÂÙÛÀ‹Ç°»…ÛéêăˆŸ;ëöÀ½ÍË)éÛ9¥“Ơ§-ƒ¾‘©ÓÛ×½±»«ÔüÀÙÚÁĂƒ¾‘ưÀá ߈«‡“ÍjÁ“ư»ăˆŸ;߈ÏÔ“Ơ§â÷ˆ¿‰›¶éÏÔö—¶«Ô˱™‰kß [ïSưÀ¸½»̉ưÀÚףǗˆù#•Œ£ä±»¿åÍÓÏ̉¿ØỞ›Ú̀¬HÍ_̣Ǜۉ²“Ơ«‡“Íj£‡ëöΙ‡±ëØ߈ù×™»«‡“ÍjÛ×ÏÔ·ÔÁÓºù×̀Ó¡Ôù¾ÁÛ»ÇÖŸÄ«‡“ÍjăˆŸ;ăˆŸ¸ÚÏ̃ˆ®Ợ߈ÿÚ‡ÿÿ½•½×¿8ù××Ơêö¹ÚăˆŸ°»ÍÓÙqY‹Ç¢Xëö¶Ç»ÍÄóơÔ߈ÏŷŘơ ¡Ơ¬Ö¢äµØ̉Ʊ»»¦ăˆŸ;ÑÄë“Æ£»ơĽàív¡̣ëö¹§Ø«‡“Íj£»¹ÁÙ×§Ô£Ø¿ßø×#‡9߈Ûª¶2tTôÙ½ƯÚ±»¿‰ %‡«ÔăÁçÚ«»±»¶‡Ö8æ߈߈ªÔô ¬°àèM‰¼±»ÛíÖƒˆơ†¿ßÛÀ߈±»«‡“Íj»ÅÛÄÓ°½ơ—¿ºÙ×ÅëöÏÔ‰¿IăˆŸ·¸Æ»™ÁóÇéÓù¿ñÖ½€¼¹Ú£äùêÛ«‚ ½9́º›¡­Ä­Ö¶aaÓ·‹ƯÓ ©ˆ›¾ÅØËÓ̀ÓăˆŸ©‡¥2ßëMù×ß»û«&ù×ÙÚÁ½€ÏÅ•î½Ô“ƠµØÙ̉›Y߈¾éÚ±»‹ÓÏÔĂ/ưÀYëöÍ­éºĂƠÙÚ‡ÚÙƠ«Ú¹Ú‰Ô“ÍÉ߈߈Ÿè£»áƒvëö«ÔÑ+®å×ÂĂƠÄ¡ÈăˆŸ;Ö¾8ñëöǼÏÅéº₫®¶ÏšȓƠñÔăˆŸ9¥‡×Ó̉ÙÜëö«‡“ÍjÏÅרׯø¼«·3uUÍÓªÔ «́™‰kß [ïSËLJä߈Û«‚ ½9½äÁ±»°»ÍÓ¹Úß̃óÂÆĂÙ­Ä©ƒĂͼ›¾ËÓëöª¶2tTÇĂ˜‰j̃ZîS‰¾‡º«Ô»qÙ½Û«‚ ½9ûÑÓ¹̃°»×Ơ†7§jăˆŸß½§¹˜ơ«ô·‡‘×8穇¥2ßëMÿ§ôê½ÔÅQß»û€ƠçÚív™‰kß [ïS«‡“ÍjÔµ‡Ç£ƯÅÔ©ơ³Øå̉ Û«‚ ½9ƒv¶‡Ö8æ…Ûê¼Í›¾½Ø‰¿Iå̉ ×¾Ñ·ăˆŸ§ỒơễÎ߈«»ëöÛ«‚ ½9ơêªÓ§ÔŸÖûÓÆØéêñÚ›¾¹ÚÇ̉ÏỒÊ)èÛ8¤Î̉ÙÚđÓ—¶åĂÿ¯¶“ƠÀ¹öÔ°½ÄÿĂÙ±»Ó…×§ÔÛºÍı»Ăï—¶—ˆâˆ;ăˆŸ;ăóâ§Æ¶::¹Ú ËûéÓ‹Çùש-•Èû›•¯¼Ù½»̣·ÔÏÔ™‰kß [ïSÓØ³ºóù×™‰kß [ïSÙÚù×¥Ö«·3uUăơßâ¸ÚÅÍƠöÁ±»’Ưß½Ó¹ßƯׇtÓ~!£Ô½€«‡“Íj³ƠÍƠÑÓßÓûإȱ»¾ƒvÁ׫»÷ÁívÛÚ›¡º¿Ø›Ô“ȇxÖĂù×÷Á£Ø™‰kß [ïS×ƠăÄÄ–ж©Ó§ÔÏÄ­åºơê¯G‹ø̃ˆŒ₫¿ºÛ«‚ ½9߈Û¾Úª‚ +¼9™‡Ó̉߈ù×Nù×ÇƠÛèçăˆŸ‚vÛ«‚ ½9ÎÅÁÓëßñÓ÷ˆăˆŸ;™‰kß [ïS÷Ù¹ÚÏÅ…ÖƒvÓØ²Â»Ø©¼™Ôº¬Ö-»Åª‡’̀j©Ó›·Ô¼ôëöăˆŸ;k“Ơù×ơê·§D ß»ûù×ËÉ9‹ÇÓØÁ̉©ƠµØăˆŸ;רÇÖ°»ϼ‹ÇưÀÏÔÇÖƠÑÓÑÅÙŒë*«µØÍÓ8¤‡›¶é™‡¼Ô߈‘Ó¯‰¯0¿ßëöÖĂ߈‡—ñÓùêÅÔ¨À߈Ơ™ĂêêöèêñÓ«Ñ­ÄÑæÙ½«‡“Íj¹ÚåçÓÇ÷ŒƠĂÙÛ«‚ ½9ù×ăˆŸ;k±»ĂĂ™‰kß [ïS¡Û¾ØÅê¹Ú™‰kß [ïS‡̃®ÆÛ«‚ ½9ÓØơèÅ»ØÛ«‚ ½9ưÀÛ«‚ ½9ÅÔ×Ơºà=çôÙ×̃ˆ±»ƠÚ°»±»äĂ›¾ƒv¬ÖëöƒơèÅÛÇ¿ô¼€ ™ÓíÖÛ«‚ ½9ÏÔº¹Ú‡º‘"ôá ù×âÁ«Ô›ÚăˆŸ;÷ÔÑ+¹Úë×̉ŵaơꉿIøê«Æ†ä ³Û̉́ëöÔX°»›¾«‡“ÍjÏÔùæ±»±»ÙŒë*«Ñ»ÍÓ·ï¶Ü-Ơ¼ ùôö¼€߈˜Á@Ơ¡ÔÇ̉¿Ù§Ô™‰kß [ïSöÁ̉ظÚÇÅăơÁ̉Ȧôơù¿¡ÔÛ«‚ ½9Ơ9¥‡˜‰j̃ZîSÿ¯¶Á½ÆÖ󸛶齹Úù×É̉Û«‚ ½9ëöƠÏÔ°»ªÓ ™‡9¥‡½Á‡é/×:¿ßñÚơÄ‚vרĂÈƠÏÔ‚v±»Å–́щë̉½›¹ưÜơļØÙ½ăˆŸÏÔ©ˆưÀơèÅơÑÛ«‚ ½99¥‡ÏÔ“ƠåĂÏÔ«‡“Íj߈©ÓÏÅ¡ƠÛ«‚ ½9ù׃’Óÿ¯¶ƒvù×׿8çÚ™‰kß [ïS‹Ç÷ƯĂĂ ›­±àéMÛº̀ĂơÔ¯½Øơêơê߈ñӥƻ‡¡Û±»˜ ê è ä ĂƠ‹ÇÅn÷$±»ß»ûÀĂñÓáêùסÔ߈­Ä“™‰kß [ïSÿ¯¶±»¡ÏÅ«»߈ÇÖù×Ưº™×Ûê·Ô«‡“Íj¶ô­Å¹Á«‡“Íj¾¹?˜Ó¾»˜‰j̃ZîSÑĂÛ«‚ ½9›¶é±»Ó¾¨ ·‡‘×8燌9¥‡ô«‡“Íj9¥‡߈«‡“Íjµa½­ÖÎ÷Á·Å«â¸Ú…ß»û¡»ͪÏ̉ù×±»±Â©‡¥2ßëM½ơꩈÙ̉ĂĂ ›­±àéMÙ×ÁĂ÷ÁÛ«‚ ½9‚ˆ™‰kß [ïSרưưǼƠ•׳ºóï̉³×ÑÄëù×ëö«‡“ÍjƯÓ ÛÄÓ…ŒÛ«‚ ½9÷Á‰ø´aăˆŸ—Ø™ÔëöỞÛ«‚ ½99¥‡ăˆŸ;§ÔíêÉ̉‡Ú­ØÙƠ£ØÛ«‚ ½9Ă9¥‡×ŸïñÆ·Ô™‰kß [ïSĂ&ßÚÛ«‚ ½9ÙÚœÚÿ¯¶¾ºƒˆû(ƒƠň9¥‡ÿ&«Ó«Ñ•º•Œ©Ç‹Ç§Ó©¾ơÄ—˜¯È±»ù×ÄÂÛ×ÿ¯¶߈ĂÉ6‡“̀́ăˆŸ;këÚÏԋȰ” É€ơÄ¡Á™Á¥ÆµØ‘®“½¿ºÏÅ8¤‡™ÓƯÚĂÓ±‡¹ÚĂàÏÔÍË)éÛ9¥ËƯͼ±ëØï³2±»ñ×™‰kß [ïS•ŒÏÅÓ́¹êñ+ăˆŸ;kƠđ¢ÇçºøôÙÚå̉ ëöà 2̣;Fü ö ¦Ê£XÏÅưÜÍË)éÛ9¥ơÔ¶ÅØÅỞ½±¿Û«‚ ½9ÁÜơÄ߈ÙÚ«‡“ÍjăˆŸ—»ϺY«‡“Íjù×½ç̃¹Ú«Ô—ˆ©9¥‡™‰kß [ïSơ™‰kß [ïSµØÊÇÎPÁƯÁÛ«‚ ½9ÏţljÁ³ ÁÜơÔ¼€ÇÖ±»Ó̉Úª‚ +¼9‰ÛëöóÔ‡ŒƠÇôưÀ₫®¶çÚ«·3uU¤ˆ\0½ë›¾¥Ü—¾öÁçÚ߈ÍĂùë×̉ÿÚƒv¶ÑĂñÚͽ±º±»ø×ƒ¾‘˜ô‹ÇáÛ™ÔÏÄ$±»ÆÖ˜‰j̃ZîS—Óé‰ñ5ñ·™‰kß [ïSå̉ Úª‚ +¼9…ô©åûºĂÛÄÓ˜‰j̃ZîS­Ä»ó«ÔôÔù꫇“Íj½óÔùêùô£ ÍÓ±¿íÙẳÙ×ăºïƠ°»ơÔăˆŸ;kßÚöµØ™‰kß [ïSßÄÙº—¾œˆù×çÚ™‰kß [ïS«d¯Ư½ÅÔáêôâÜơꙇëö·ÖÏÔơÔÏÄÏÅ‹Ç÷Á×ÏëâèêA÷µØư‡±ù1ĂƠ¹ÚöɶưÀưÀƯå•%ưˆ§ÔÀ¹ôơèţǹÚÇÓ§Ôù×™‡“ÓæÚºëÓÙ½¥ˆ]1Ñ×öÁ÷Á•‡רÍÓ£Ç₫ÚĂÖ’ÈƠ‚¾†Ú¿‰ѶéơÍË)éÛ9¥“ƠÏśک‡¥2ßëMßÖÙ½ĂÙÎ̉¼Ă½€ûñÚµ†Ùׯ±»Û«‚ ½9³̉ÁÏÅáØ¾Ổ™‰kß [ïSƠׯÙÚ„n ăê₫‹߈½€ǺăˆŸ;góÔëö«‡“ÍjËr™‡ĂÙÓùס<óÂưˆ¿‰¨‡¤2€̃êL߈ơê±»áêó·ù×Ú×ơ…·ÛÙÚÙu‹ÙơØ›¾ñÆ«‡“Íj½‡x™ëéåÑÓ«Ôǯơê™Á—ˆ§¹ÇÖá ·Ô‡“§ôíÆĂÙ¡È·‡‘×8çÛ×Û«‚ ½9ăˆŸùשÓâˆ×$‹ÛđÓK—»­v«dËÇ™ëéå̃ˆÛ«‚ ½9ÏÔ±»¿ôÏÔ™‡ù×ٽŽ۫‚ ½9¥ˆ]1¼ăˆŸ;°Àµa匿NÜÏűƯ·ÔºnÏ̉¯×gٽ则ÁÿÜùש¼ÛºÛ«‚ ½9÷‡ÍË)éÛ9¥ôù×ÓØ­Å«‡“ÍjƒÖơêù×ù×°»6‹Çéê½€Ûצ¿×ƒ߈ù×·Ôưæä̉ù×ÁƯ‡ÇºĂÙ½§©½ëö­ÖÅÓ™‰kß [ïSùÚ°»›¶éăˆŸÛÄÓ­¾‡ŒẲ¯¾ëöÙ½ĂÙ½µaù×ÚÀ™‰kß [ïSï½½«‡“ÍjöÇ×¾ËÉ9ù×ơèůÛÛ×È̉߈¼È©‡¥2ßëMƒ×߈˜‰j̃ZîS½ÈÛן‰°»™‰kß [ïS«÷˜ ê è ä ÷ñÓ±ëØ߈¡«ªÚ³ØĐ¹A¬¼¼±”Ơ½Ÿ\óÇ«dÚ×Û«‚ ½9ù׈;<¥º¡Ơ›¾߈ăˆŸ;çÚăˆŸ«ºöưÀÏŃ؇Œ™‰kß [ïS™‰kß [ïSç̃½Ü™‡ĂÇ»¯˜ÿ ơ걿±»íƇº¼È­ÈóÇÁËĂÙôĂëöí—G߈ÏÔ9¥‡³ô‡ÇƯºÁ¬ÈµØ÷‡›½Ôᘉj̃ZîSöă»ĂÁ½߈ív¡ÔñÓå̉ ñÖÁĂ“Æº¹Ú·Ô™‰kß [ïS™ëéå›·ÔÈÙ½¹Ñ¢»í‡ăˆŸ;ÏÔ©‡¥2ßëM©Ø—¾Á½§Ó‡ºˆ½ëö߈߈ﺛ¾äôóÇßæÇÖׯ«Ôä̉ơêÙYá ùëÛñÆï½–»%ÏÔÏ̉ëö„Ơ©¾ùףر»¹Úơê«ÈÅØ­¾éº›Ú½†“ăơ«‡“ÍjÛÜù×½ñ́¶èĂ߈°ÀÏ̉•Ͱ»êö¼ë ƣر»ÏÔăˆŸœÜ«‡“Íjù×Á¹ܺÀÛ­Ä÷ÁëößÖ½¥Û«‡“ÍjÏÔơÔåôùëï³ơÔÅÓëö½™ÁÓ¼å̉ –رŒăˆŸ;釱»Ü8 +¤‡ +¤Ø©Ø²ÆÿÚ¶ôÁ¼¶è½€¥ˆ]1·ÔơꇓéºϼßÁëö½·#8¤‡×ơ꫇“Íjܲ™‡¯È—¶÷ÁƒvÙ½«»Ž›¾Û“ȃvŸ»¡Óض  ĂÙ½£ÇëöçÚï½ñÚïÚ¡¬¼¼¡Ûơê»Ó—¶ñÁ«‡“ÍjŽỔ߈³ÅÁ¿ù׳Գ¹™‰kß [ïS©Ø£Ç½©‡¥2ßëM·‡‘×8糺óóǪڙº¡Ó›·Ô°»ƠÁ¹¡È…Çö£ä±»ù×ÑÓÏÅ“¹ƯN°¿öß»û½ÅͧƠ½Ü¾½âÁ™‰kß [ïS·ÅÑÄëëÓͼÁ¹“ƠùêÏÔÁË߈¤½¶§Ô‹Ü½߈ŸĂ9¥‡±»ăÇíëöÁ¹«‡“ÍjăˆŸöóÓ¼‡€™‰kß [ïS«‡“ÍjÚª‚ +¼9ĂÙµØç̉¥ºÏÔ½¡Ôíå¯ÈñÓ¿‰™‰kß [ïS÷ÁÀ¹ÏÅù׋ȳÓÙ½ÓÆ™ĂÏÅß»ûăˆŸ;ƒÖÙÚ›ÚƒÖ«‡“Íj߈ÚÀ§ô…¼Å·ÅĂ™‰kß [ïSÛ«‚ ½9ƒ×å̉ ù×ăˆŸưÀ½ÁĂÙ‹ÇáˆÁ0qÏÅ…Ô±»¹ƒ×©ƠÛ«‚ ½9‹Üù×±½₫¼½‡ÚÛ×ÍË)éÛ9¥»»Ă8¤‡ÖưÆù×óÜǼß»ûđÙùêƠĂÙ߈°¿‹Û¹Ú©ºÄBŒEL±»½ôÛ«‚ ½9ÑÄë±½¡Ô›¾™‰kß [ïSëÓ‹ÓëÓÛÀµØ¡ÔY…ô¯¾÷‡›¾½ǽ·‡‘×8ç¸Úá=«‡“Íj߈éÓψ±»«dâÁ>ëÓÙÚ«Ô“ƠÅçÚù×½êö ©‡¥2ßëMéÓ¶«Ñ˜"÷¼«‡“ÍjßÖÙÜÛ«‚ ½9›‰ÔXÚª‚ +¼9„ ·v«Ñ†Ç•Œëö‘́ߌÛ,±»Û«‚ ½9ĂºÏ̉Û«‚ ½9ÿ§¿ÚÛßµØơê†ÇÏ̉щ÷Á›ºƒv½÷ÚÏŃ™‰kß [ïSŽ£ØÏÅ”f…Ơ™ÁYưÀƒ¾‘ĂØ½”Û«‚ ½9¼ÏÔÓÔ÷ÁÉ̉߈ăˆŸ;Û«‚ ½9ËÓ‚v¼¸)öơê—¶¿ôûƠ¦Ô•×›¾íÏŭ͏ÍÓ±»™‡—¶µaí—GÜív÷ơö¼†§Ô¡ÁưÀ—ß8¤‡ÖÙ½“ȹÚĂÙ©ĂÙ½ϼ£ØÏÔø×›¾•!ỞëöĂĂ߈Û«‚ ½9§ƠÑÓù׫Խٽ›¾ûƠ¹ÚÛ«‚ ½9¿ôÏÅĂÈù×±”Ă—œøê‰ÁÛº½öñÓϺ½ÛºÛ«‚ ½9­ÄÛ«‚ ½9³«Â¢ØưÀñ̉ăàÏ̃ƒÎ¡Á§Öö›¾ç.ƒvïDăˆŸ‘âï½™‰kß [ïS—ŒÓñÖ¥ÄóԱ䛾¥ˆ]1¾ßψ½€¾ư§‡Ăº©‡¥2ßëMË̉ơĂ«Ỗ%ÛÀ½€ëöøê¾·Åºy½‡ºµÀÏžÏ̉ßÑÄëÑÓÙÚ±»«Ôù×±»óÂăˆŸ³å̉ êơĂƠ±»ívÿÚăà߈ưÀÙ-‘ÛéÓ“Ơ߈ÿ¢±»áăˆŸ;∱»óÇ߈ÏÔỞăˆŸÂÙ›ÜáÛƠXê¼ÏÔûƠæ̉·Øª‡’̀j£»÷ÁÍÏÔÙµùê‡Ûơ‡µØ®ÈăˆŸ™‰kß [ïSưÀíÖÁ¾£äªÔÛ׃ˆ™ÁÓØñ×߈¹Úẳăº¹Ú†“«‡“Íj‹ÓĐÅ0»ˆéظ£Á̉×̉ù×ï»×¿8ăÚ˜‰j̃ZîSÛ«‚ ½9°» ·ÅƒÔ©Ó›ÚÂÙƒv³à3߈Ñ+™ëéå«â½™Áëöÿ§âÁŸÖÅÓăàÇÖĂÙ…»·ÅƒvñÍƯ¾¿º߈óÇŒ‚×ÍĂë$ÑæœÚäÁ©Æ©Ç ÛëÓ™‰kß [ïS₫½Û«‚ ½9¡Ô‡ŒöÁÇ«‡“ÍjÙ-ăˆŸ;ùêß(°»™‰kß [ïSÙ-Ă™‰kß [ïS×ơ¼ôûØ߈Û«‚ ½9߄۫‚ ½9©¼‡“Ă¼ÿ¯¶ÿÚÑæ­R›¾ơêá ‚vù×Ù½ơ»ô½€°È9¥‡çM©‡¥2ßëM¼‡Ë̉̉àâˆ:×¥–Ó₫®¶ÓÆƠ™‰kß [ïS©¨ăˆŸ߈åôù×ëö¡Øé‡¡ƠµØ—¶öÛº‰ƒ߈ßÁơêÏÔÁ̉ÏÔ¾•Èû›í•»—¶öáÚ·²רùÚâ$,®/,³º÷å5ÓĐÓù×í/·‹‰Û™‰kß [ïS¡Û­½¼¶¡Á“åê±»›¹ëö¿¡ÔĂÙáêơêﻠȥˆ]1½ªÈ9¥‡«â¹ïƠ¯¼¾ß™‰kß [ïS«‡“Íjß»û™‰kß [ïSÖYÅn±™‰kß [ïS¥%øôưˆƒvÁơĂëö́ơÍƠêÔ¤ÏăvÏÔ—Ó½íÆ½çÏÔÛÄÓÍÄ»ÚÓˆ•=‘Ơ›·ÔÙÚÏÄơêöÁĂÍơÔáØ°»±¿ÏÅ·Ô›¾ăˆŸăˆŸ;ơĂƒv¹Úºyù×ëö̃„ưÀ™‰kß [ïS߈ƒv«ÁéÓ¥â³Ú²ÈÏÔùêÛ«‚ ½9ŸÅ•Œ¾‡™ôÏÔß»ûơèÅù×ơêå̉ ³Â«»ÏÔÏÔ©Ó“ÈÛ׃ˆ«‡“Íj¹ÚóÇ˹߈óÇ“±»å˜µØóÂÂÙ¹Ú×Ó©‡¥2ßëM÷Áù×Åó‡ǵa±»Û«‚ ½9ăˆŸÏÅăˆŸû(ÑÓÏŃvéÓ›¾Úª‚ +¼9·Ơƒ×½ÅĂ­ÖÏŪ»¹ÚơÔÇÅÍÓơèÅÎÅ +´† +‹Ẹ́·ÅÛ×±¿µØëö¼€¹ÚÙ½—¶­Ä›¥ÙŒë*««»‹ÇƒvÙ½ø×°”߈½ÂÙà¤<¨&¤ ¦±»߈ăˆŸ;k›¹óÔăˆŸ;kưÀÛÄÓ½Úª‚ +¼9ĂÙ½ôÏÅ̃ÄØ9¥‡ÚÔå̉ ÿ¯¶ư“«‡“ÍjÏÔ±»ƒvÍǪ»Ù€̃ˆáÍÛ×à ­ÄăˆŸgĂÙ¥Æ9¥‡©Ø˜Ô麘‰j̃ZîS¡È‹ËؾŠƒ¾‘ù×óÂ߈ĂưÀÛ«‚ ½9ĂÈ×¾߈µ†ÏÔÏ̉–¾Û«‚ ½9±»́‡Û«‚ ½9ûÖ*ÍË)éÛ9¥ëö—¶ÇóÇù×ÛÄÓÏÔÚª‚ +¼9Û«‚ ½9‹Ç9¥‡ơê‘÷±»¡ÈÛ«‚ ½9¾‹Ù%öÁĂº«‡“Íj‹Ü½—¶³È¹Ú«Ô¼.«‡“Íj“Ç£ÇöÔơĂ›zÅÓù׉¿I½¯ÓÙÚăˆŸ—¾¢äÅÀ™Óù×ùןȿ́ÍÓƠº—¶½œ‡ÛïƠơØ©¼Đ¹ùôóÔ©¥…à¹Úß„ăˆŸ;ăˆŸ(ƠăˆŸÔºl†Çƒ×±»äô Û«‚ ½9ˆÔµØƒÖ߈ÍÄ̃ÄØ™‰kß [ïS±»½ÁƯ½»ØÏŶèô¶³Ă¿‰Ăœ‰¾Ió˜‹ÇùơƠƠ­ÄûƠÎŧÆï½±»ùׂv…Œƒˆÿ.Ăô¬Ä»çÚ³à׆Á۹ȡÔÛ«‚ ½9ÏÔ‰yç‹Ù­Ạ̈"™‰kß [ïS±»Û«‚ ½9¹Ø§¹½›¶ééºÅØôûÓ©Ç¾Ă¼±»Ù½÷Áù×ĐÄê­¾ÏÔÂÙ½½×Ơÿ¯¶ƒvçØÓͽÎÅ3̃ˆù×Ũ‡¤2€̃êL‘±÷ºöÁ‰½ñÚƒvƠĂ¼§ºăˆŸÅ©Ơ¼•Œ—¶¬Ä÷‡äÁ¡øÿÚíăˆŸ;»ÔưÀªÔçØ«‡“ÍjöơùêËÇ£ØÑÓå̉ ÿ¯¶µØ™‰kß [ïS‡ºơº±»¸£߈߈ưÀÿÚ‰¿IÉÛ«‚ ½9™‰kß [ïS™‰kß [ïS̃ˆÛ«‚ ½9ĂÙà ÇÛ±»ÛÊùçÛ«‚ ½9‰Ûç*ăˆŸ;½„µØåÁù×ÁñĂƒµóƒvª‡’̀j±»8¤‡÷ÚƠơ«Ú›¾ăˆŸ¶ÈÙÚƒˆ‡ơÄ‚vÛ«‚ ½9µØñÓơê±»¨¼±»•“Íjï»ÏÅ5‡ÇñÓ‹ëưÀ£ä±»¡Á§ô¾™‰kß [ïSëöÏԇ׵ؽº³œÇÖăˆŸ;ä̉Ǽ³Û›ĂơệÇÛÄÓ•Œż₫™‰kß [ïSơ™‰kß [ïS·ôéºͪÛ«‚ ½9ÍƠóÔÅØ₫®¶ơêÀ̉±»·ÔÛ%9¥‡Ó¾߈ÂÓ ưÀ–¶Ï€̀ª»ÁÖ$ +½£Øù׃v›Ú‘®³óƒéô›¡©¼ÏÔ©‚½w™‡߈›¶éăˆŸ;½߈ûÓăˆŸ;«äÏÔëöƒˆ÷Áéº9¥‡¶¹ÁÇÖëöÆØÅ•ׯ›¾ß„ϼ·ÅÉƯÙĐÏćÇù¿ÖØù‰±»ù×9¥‡™‰kß [ïSÏÔù–ưÀûƠÍƠ¡î±»ûÓ©‡¥2ßëM¿‰9¥‡ơÔ™‰kß [ïS³ÈÛ«‚ ½9× ù×ÁƯ™Û8¤‡«‡“ÍjăˆŸ;±»¿ô·ÅáÛ†Œùë́vÏ̉éơđÁKÛ«‚ ½9º¿(ÍĂƒÚơƽ“ƠÈùô›¾ͼăˆŸ±»§ôñ«·3uUÁ¹ƒv±‡øê¾øöĂô±åÿÚÅԵة¼ƒvï½ñÓ°»Ï̉ŸơÂá¬÷‡ă‘·Ù½ƒˆÏÔ£äÛׇŒØŒê*ª«‡“Íj߈¼ñÔ›¾ßÖóÔÁƯ®Èƒv§ô½“ƠëöƒÖƒvđÖÙ×—ØƠ9¥‡ùרÇÙ½«‡“Íjå̉ ¡Ø¡ÁÏẠ̊ËÖƠºm·Ä·‡‘×8çáó¶ưÀ©‡¥2ßëM¡óëöºñÓ—»Ù½ăˆŸ;³ÂǼĂÙ½‰¿I£ä™Ô±»©‡¥2ßëMÚÚÀĂăˆŸ;ëöùê­‡™‰kß [ïSëö‹ÜËÇëö¤Æ‡º•ǽôù×Ăß‘ÍÇÓÆ±»Û%†º«‡“Íj«ÛàÛ°»ÏÔèêÑÄëù꿉±»Ÿ»˜‰j̃ZîSôê·È«ÑáêÛ«‚ ½9å“•çÉ›%ÄÓºĂ«·3uUºÏÄ…רÛ«‚ ½9gÙ½±»ͼơ±»ù×ưÀù×ívơêơê¡Áôê›ù×ÏÔͺ·ôå̉ Óµ.¥Ùù×ÛÚ9¥‡º½߈±»˜êè䯙‰kß [ïS‘Ú9¥‡9¥‡“Èơê¥Ä÷ơ™‡ưÀª‡’̀jñÙÅÓ÷ÁăˆŸ̉ÅơêÑÄë“Ơăºùט‹ƒˆ¡ÛÙÚ퇫ÔÛ«‚ ½9±»©¼¡Ô«‡“ÍjƠX¹̃8¤‡×½ÁĂùׯÈÑÄë¼ÈẮ‰Œï‡Ù½¹Ú¬Äº”çÚ¹Ú—¶ăơщϰ™‰kß [ïSóǃv½“ÑĂ½ûÀô +÷å5Ó•ÿÙ‡­9ÏÄ߈¨Ú‡Ç©àÑÓăˆŸ;¿ËÉ9éÚăˆŸăˆŸ;ƒvÙåסÁĂăˆŸ;ëöÏſߡÈñÙ÷‡·ÅÏÅ¡ÛÉĂß»ûÖÆ±»ÍëĂôƯç«ÔçÚ›¾ƠX’ƃˆÏ̉ÁƯ¨Ç¨,ëöÓÁ©Ç™ÔÍßÑÓăˆŸÙư½ôÏÔ‡ơÔĂºéº‡ºÆĂÙùׯÛÏÅÓÅØÛÄÓÓơêëںȂv±̉Ϻ°»Ññ»™‰kß [ïSơÔ›¶éÀ¹ ™‰kß [ïSÙÚëöÏ!íŸÓÛºơù¿¤ÈǼ̉ˆ”=‡º£ä Ơ‡ÇÍÛǼ¥Æµa߈½ĂơÔƒv‰¿IÛÄÓÛ«‚ ½9v߈ÅØăơ¿‰«ÚÁËï½ù×寅Œ£Ô‹Çƒˆ›v®ºyƯÏÄÏÅÛÄỌ́‡Úª‚ +¼9±»ÏÚÿÂÙ½¯Èª‡ ’ ̀j …ë‡Û«‚ ½9çǽ»Ø«»µØù×Ññ¿Ù½9¥‡×ùוÈû›ƯÓ ‡Ûư‡±ù19¥‡ù¾·‡‘×8çéÓù׫·3uUœÔù×ï½±»ÿ¯¶ª»ăÁ«‡“Íjù×á=Ă¼ÇØï³2½Ë«ÔéÓâÁ߈ăˆŸ;ÅÓÏÔÙÚĂû“‹‰Áí—G±»Ù½«‡“Íj¿ôÇĂăˆŸ;™Ó¿Å¡ûÓÓºçÚƯÓ ±»ÛÄÓ·‡‘×8çéêø¼ï½ÑÓ™̃Ó̉±»‰¿I±»…ô8 ¤‡ Ö ù¾‡ŒƠX³ÜÿÚ“ƠÉ̉ó¶‹Ç¹Ú½å̉ ăêăˆŸÁ0²+`èºÜÓ ÁĂË̉å¡߈ăˆŸÁïÚÛëö©ÇÛ«‚ ½9¥Ø¬Å«‡“Íj›¡ÓîƠÑñ»ÏÔ÷‡‚¾äôûƠßÄÙ߈µêÙYăàñÚ9¥‡߈½Ă™‡¾ØŒê*ª©Ç̣Ä ơÔù×⻫‡“Íj­€ơīԽÁăˆŸ€Ç ăˆŸ;ÑÓĐ`ÍË)éÛ9¥ÓØÙ·Ó ¥0·ÔµØºÏÔăˆŸö™Óå̉ ù×ëöôēȇº‘Ö÷Á÷ÁùêùשǣÇÛÀ¼߈á ˜‡Û«‚ ½9ËÖ—¶½Ø†½«»©ÓƠÅ̀ÇôéÚÚª‚ +¼9%·¼Í7ÁÚơԣﱻ™‡ăˆŸ;ƒˆ߈ßÄÙ…ŒƒÖáÅăÇíÓ‡©¼ÏÔ¨Æùש»“ºŸ‘«»÷Úٽス€ÏÅéơ¾‘®ÿ¯¶¿çÛ«‚ ½9ùœŸ»½¹)ëöµØƒvÿÛÛ«‚ ½99¥‡µØ°»°»‘±ơÔ±»ÓÁ¹Ú5ư؃v™‰kß [ïSơèŃˆ÷Á·ô©ØµĂÁƯïÚ™‰kß [ïSỔÓ¾±»åôỞç9¥‡™‰kß [ïSÑÓùê¯È°½ÇÓº¥ˆ]1ßÁ߈ù×ưÀÛ«‚ ½9¡ƠăĂ3Ø×ÏÔ™‰kß [ïSù×”.±»¥ˆ]1ûƠưˆ«‡“ÍjØ×ÍÓíJëö«Û•÷«äÇ߈9¥‡ù×Úª‚ +¼9Ϻ›Ú™–›Úï½÷Áؽăö³ ÙÚ™‡»Ø‡ŒˆÇåéºù×Ù½‰Ûù×Úª‚ +¼9Ù×›¾×¾Î9¥‡Ï̉©ƠƠ››¶é“ÆÛ́ÁÓºŸƠƠXëÔÅØ¸ïóÂăĐ߈́v«‡“ÍjÏŽ€½ÎųàÚª‚ +¼9¤Ç ÁÁ×¼™‰kß [ïS‘ơÛ«‚ ½9¡Ô¥Û£X̉ØØÀ‡€è/Ö:«¼¼±»»Å§ñÆëöÙ½å̉ £›̃ăˆŸ;¡Ăèôƒv‡Œ9¥‡¡Ô˜×ù×ĂÙÎͼµaµ’‰2Ô,øñÖ9¥‡•Û¹Úø¾ׯù×ø×ÅÓÁ̉¹ÁÀ½«Ôï»ÛÀ™‰kß [ïS³ííÆ½ɱ§Æ‰º¡Ô­Œ¾ß³‹¶Å™‰kß [ïSÏŦÈƠưÀ»Øëö†Œ¿ôÏÔÈăˆŸ;߈÷ÙÿÚ™‰kß [ïS‡xöïơ›¹ñÚ߈ù×9¥‡×ºí‡ù×̀Ó«‡“Íjù¿º½Ånùê—¶ÔXăˆŸ;Ë̉¡ÔưÀÏԼȽ۫‚ ½9ÿ¯¶ƒv¹à¾(ơâù×ÇÖºÛÙ½Úª‚ +¼9ÿ¯¶ïÚÅÊÿ×Û‡߈©ØÅƒ½ÏÔ•Èû›щùêăàÏÔéêÙ½ë¥ưÀ±»¯EÁƯ©ÓÛ«‚ ½9ù×ÿÚƒ½™‰kß [ïSÛ«‚ ½9ÎÅ̃ˆ“ÆÂĂƠ܃v¡Û°¿êÔÁ‡é/×:ß„̃ˆíö®Ơ‚vƒÖ©Ó¿́ơÔÁÅô߈ív¤Ü¾ÓÁ¼“½÷‡Ÿ}ăˆŸ;ËÉ9½ÿ¯¶éƒvÏÔ«ÓéÚù×Ç"ƒÔ·‡‘×8ç™Ó°êØÛ«‚ ½9öÑÓ¹ÚÁ|«‡“Íjî»ùשÇä̉µ߈¡Á÷å5ÓñÚ½±½­¾ѹ‡ÇµØ¹ÁơÔ½™ëé嫇“ÍjÏÔơ÷¼çÚ½ÍÓ•ßôëö›·ÔÚÑ¡Ơ§ÆưÀ°¿m‚—¾½½€̃ˆ»Ø¥ˆ]1ơĂ߈è· §âµ•Œ±»óÇÆÍË)éÛ9¥óÔ»Á›¾ƒÖ‡x»ÖÆÙ½óÔ߈½÷Ù³ºó°»ù×ósχçÚÏÔĂƯ‰‡Ú±»Ï|Æ̉Û«‚ ½9·ÜÇÖŸ¾±céÓûØëö÷¼Ă±»ù×ŸÈæÚ“Úï‡ÿÚñÆå—¾±¿½ăˆŸ;ÏÔ¹Úå̉ ÑÓ›¾±»Û«‚ ½9ƠX½9¥‡µØ̉̉åˆù×›ĂûÙÏÅùëß»ûÚª‚ +¼9ư§‡¿º°»ÏԥǃڋÇñÚÚÄ̉Ñóăơ½™‰kß [ïS›¶é˜êèäŸø߈ơêÁƯ߈ŸÅß»ûöÁÓÓéÓ½€ƒ× ¬°àèMƠÓØÿ¯¶—¶·‹›¾«‡“ÍjÛ_™‰kß [ïS¥¼æuăˆŸ;k­ÙơÔÛºÛ«‚ ½9¬ÅÏÔÿÚÍ™‰kß [ïS‰ºñÓ•%ÍÓ€’Û«‚ ½9ăˆŸƒv½ù×ù׿ÿ¯¶ƒvăˆŸ;k¹ó©ÜƠĆyéê·ÔæƠ«‡“Íj°»ϺÛ«‚ ½9Û«‚ ½9ܺëöÏÅ«‡“Íj™‰kß [ïSËÓ×ÜăˆŸ;­Åív9¥‡9¥‡·‡‘×8çÏ̉ÙÚ—»Ù½Ïŵؿ‰™‰kß [ïSƠ%¬Äº÷‡ƒĂ½È«ÔØÙÓ°»çđ«»µØ̉ºè,ưᙉkß [ïSÅÛ«‚ ½9·ØëöưÀëöƒˆÿ¯¶ăÚÏÔĂÈ©‡¥2ßëMÙÚív¶èÏÔŸÅÅÓƠ­Øƒ½¯Û±»Ÿ}­ÈÿÚÀ.ßÚ¹Úă½Û«‚ ½9öÁöƠX߈ø×Á̉ψ±»ÏÅÅÁÉÏԵ؛¾ƒvÑĂÙ½¡È‡ºăˆŸ›Û¿ÙĂŃv“È™ăˆŸ;k½±ºá Ă½µa߈¿ù׋ÈăÁ÷ơñÆ©ØïŸœÂÏÔ™‡©ÇÙÚ½«Ô˜‰j̃ZîS§Ô¿Å½ë·¼Í7ñÖÀ‡€è/Ö:›Ô•ÓăˆŸÅùô°Áû¼½ôơÏù×íÖü Óºù×ùô½È—Œç½÷Á™‡™‰kß [ïSÿÚ½½Ø¼ô§Ø‡Œ°»‹Ç¿‰«·3uUÁĂï½™‰kß [ïSÅØ±¿‡ÇưÜù×±»—¶ù×»Á‡ÛöÅØÂÙívμÛºʾÈĂƒØƠÓ·ÆÑÄë߈°¿/Û%ÑÙ½™‰kß [ïSÔơ¦ÓÛ«‚ ½9‰¿I›̣à×ÓØéêµØäÁƯÓ ÷$9¥‡×ψÍߦºƒvÛ«‚ ½9ÏÔ®Gøª¶2tTÏÔ¿»¹Ú±ëر»±Á—¶£ÇÛº™‡¶––óÇ¼Ô¯ÆØ‡Ç§Ôµửщ›Úź±»ÏÔÇWù×ÓØæÚÅØ¾·Ô¥‹‡ÇÅÔĐÄễ¹ù×ơ½ùסÁĂÏŧô«·3uUƒˆĂ߈—ˆÛ«‚ ½9ˆÛ«‚ ½9ƒv¡Øë×ÍË)éÛ9¥ăˆŸ;ψ¹Ú®G ø ÚÄ̉߈á=…àíêÛívƒˆÇӈ߰½Ù½íÖ¶ÅÔ­¾å̉ ª‡’̀jíØ©ˆÀËă¿ØàבÚå̉ ï½áêăˆŸ;Û«‚ ½9ëöÅàﺿ ¥º±̉—¾ÏÔ­ÔưÀ߈™‰kß [ïS©‡¥2ßëM«ÔÛÄÓ™‰kß [ïS¸Å +¡ÔêöÑä±Ô©Øá ÍƠ߈Ă“½«Ú»œÂ‰¿Iù×½ÏÔÏÔ°»¯Û“ƠÛ«‚ ½9Ù½©ˆ‹ÜÏÔ³¾²qÏÔ¯¾/™‰kß [ïSçùÚù׃vÈ̉Æ¢Ô‡Ù½¼ÍƠ¡ÁƠÙ½ÑĂÛ«‚ ½9·ÔÑU߈ùêơÄ߈߈öÁƠX³zÁƯù×ív9¥‡ÆÜ™‡«‡“ÍjáƠ±»©‡¥2ßëMÛ×ÎŹåĂ©¼Á¼Úª‚ +¼9ÇÖ¶¸ÍË)éÛ9¥Ô8«.™‰kß [ïSá¼»ØÍË)éÛ9¥߈ÅÓ·ÅÛ«‚ ½9±¿ƠÅ÷Á÷Áö™Ó¹Ú·‡‘×8ç·Å›¹µØ¹ÚøêăƯÙÚ«‡“Íj™‰kß [ïS9¥‡ÈĂƠ™‡•桱ăăˆŸ«Ô›¾ù×—¶©¼ëöª‡’̀jëö±¿ª»9¥‡¦Ơ »Ü×$߈ƒ½—»߈ÏÔÛ«‚ ½9ÔưÀ±»ƒˆƠƒØ„ذ»ĂĂÓÿÇø×µ.¥Ù«‡“Íj·Ó ¥0ëöÅÄ“ÈưÀͼ߈‡Œí·ÏÅ™ÓǺ«‡“ÍjăˆŸ;Ù½ĂÙ߈™‡Ï̉ù׃v‡Œ­Ä«‡“Íj¹Úô¡ÇÂĂÖù׎«‡“ÍjÇÑŽÓëöîÙ½‰yɆ߈ÏÔ±»Ù±©̃™ÔƯơ­¶ƒˆÁ̉¡»‘ƉÇƠûØ»Ă‡߈ù×ÑÄëíÆ©‡¥2ßëM‡ŒÛºểÛ«‚ ½9›¾Ă™ëéåØÅê¡Áˆ‡ÇÏŰ» +ºÑ éêå̉ ÍÓׯù׭Ľ€߈ĂÙ™‰kß [ïSÿ¯¶‡ºƠÅÛĐÄê·Å§‡É™‰kß [ïS«»±»«Ú¾¾‹Ùß”¦›ôÿ¯¶Å¥ËƠ“ÈÉƯ«‡“ÍjÇÖæô¼ØÁßÁº8¤‡íö½ë›Û…́«‡“ÍjÓÛƠÀƯù׸ÚÏÔ›vó|ëöƯÓ ‘Óƒˆ™‰kß [ïS«»ơÔ±»Û«‚ ½9‰Æ½™ÁÙŒë*«ơÔ…ơ„ØƯơÛ«‚ ½9±»Ë±»߈ Èùê߈߈Û«‚ ½9›¾ơê«ÚÅԋŹÚÍB‡ÇéÓŽ¿Ø›¾å×·̣®Gø±»³Èùׇôé½€ăˆŸ«‡“Íjë›™‰kß [ïS‡ƒv§Ôô·ØåĂÏÔ߈ñ›¶éƒØÛ«‚ ½9ù¿÷Ú¹èÚơÔÏ̉÷ÙăˆŸ;ƒÑÄëÛ×½ƒˆgóÇóÂù×Ƽ±»½¼… “ÛÍĂô«·3uU«äơê±»·̣÷Á¹Úù×Á¼̣Äëí™Ó“º…Ûö麛¾ÏÔ§º˜ ê è ä Ÿ}™‰kß [ïSéăÿÂï‰ëö«»ƠµØ¹ÚÙY™‰kß [ïSÅÑÓ±»9¥‡«‡“ÍjƒØçÚó½ƒvÙŒë*«½¡È½ô÷‡ĐÓ å̉ Ơ«‡“ÍjÔ¾FƒvïiÛ«‚ ½9áØ˹íêǼ×n¹€ϹƠXù×ùêƠëöÇÖéºË%ÁĂµØ·‡‘×8礉̀L„—»½º›¶éÙŒë*«Û«‡“Íj¹Úå̉ —Ó‘ÚºĂÿÚ̃ˆÓ‡¯×™ÁëöµØ©Ç9¥‡Óƽ±»Ù‹ÇñŒ‰ÛñÚ©‡¥2ßëMïƠïiÛ«‚ ½9÷ˆÇ´ͽ©‡¥2ßëMưˆ¸ÁÛ«‚ ½9÷‡§îÓÅ­Ô¾ßÄÙ÷ÁËÖ’Æ™ëéåÏÔơÔöΗؿ»¯¾ß»û9¥‡˜‰j̃ZîS·Ô·Å™‰kß [ïSĂÙăˆŸ;Ă ÑÄë½éß›ÚÑØăàơêÏű» È™é÷Ú̃»úăˆŸ;ơꇌ½Å߈ăˆŸôû(Ư‰ù×ăˆŸ½ăˆŸ;ÇÖëöÓÆµØ·ÔƒvÓÆ‰ÛƠX¿ÎÅ ÏÔôă½%«Û« ©ƒ»5™‰kß [ïSŽ™‰kß [ïS·}ø×¹Ú…™‰kß [ïS›¶éÎÅƠª‡’̀jù§ưÁ߈µØÍñӤdz½ôê¾ÇÖÜóÇÛ«‚ ½9ÿÚ÷Á‚×ÚăơĽâÄ™‰kß [ïS“ÈĂÙ…»ívƒÖù¾éºçÚëöÿÚă½µa©Ü9¥‡†½í‡«‡“Íj«‡“ÍjĐÄê½›Ơ߈ÓØ™‰kß [ïSơÄñÁỂ½Û«‡“ÍjǺ̃»ú¶è«‡“ÍjÏı»áê©Ó›Ô«‡“Íjă‘·¡È§Óó‹‡Û¯È¿‰ÏÄÛ«‚ ½9äÑÓ½ơÔÏÔí—GÑØÇÖ›¶é×Ô Û«‚ ½9‰ÛÑóϹ¹Ú³±»É̉ß»ûºÇÖÛ«‚ ½9ă½ÏÔR*̉Æï½÷‡«dÛ«‚ ½9ơÔơê¾˹®¾ÛÚ“Ơ±»µØÙ½ư“Ë̉ĂÙö· ½µØ߈™‡…ÇăˆŸ;ơĂÿÚơêưÀƠîơÔçç«ÔÙ½Á¾ÙÚêÚßÁÙ½ÏÄîíÙ×ưÀÏÅ„߈¯Èù×½¡Ô•×½£Çµa‘®½ô»Ø½«‡“Íj˹¡ÈÏÔƒàùë¼Ø¿ºƠXƠÏ̉ƒÍ«‡“Íj¿ß́v¡%ƒvù×™‰kß [ïSº̉ ±ëØ߈ơĂ¢ ô“ư»Ù½°»ñÙăˆŸÑƯ9¥‡¹ÚÎÔ¹Ú‡“ª‡’̀jù×£ÇơÔ«Ô¹ÚĂÅÈÛ«‚ ½9ÙÚàÓăˆŸ;ÏÅ—¶ơÔăÇí5ƒˆÿ§ôăˆŸ;9¥‡ÅóÏÄÙ½¡ßźăˆŸ;ÄÁÜá ÇÖÑÓ©‡¥2ßëMëö»ăÁÁ¹¶Å»y­Ä³ÂăˆŸ;߈éß™Óå̉ ÎÔƒv±»ÍÇÎÔé‡û +‘8¤‡§Ôív…Ö°»º‚ù׃vơèŽóÂÏÅơÔÁƯ±»÷‡÷ÁƠƒÚ«Ñ˜‰j̃ZîS§ô˜‰j̃ZîS‹Ü½ëöƒvÁƯ™‡ä̉ôØ÷Ạ́ÄÙ½ëù×Ñæ‚v±‡μϼïÚ‹Ç퇅»™‰kß [ïSÍßÇêöñÓˆ•=‘ÿ§ëöôé ƠJå̉ Ù½å̉ ƒØóÙ$ɹ™ÓµØÑÅ¡vùë™ĂÇéÙóÂÿ¯¶÷ˆÚ×Ñ́ÅÁƯÏÅơêÏÄ£ƠçÚù×®×ç×ùÏšۻ áÙ?¡M-ËơÛ‹ù×!#¹ Ơ ×Éùư • +‡¹'ư¥íĂù×ÅØ½ú­ÄÛ¼ë×Ơơê߈ơç£Ç¡È½߈ñÓơÔưÀÛ«‚ ½9¯×ƒÚå̉ ܺëöµØ߈§—ñÚg¡Ó¾÷‡ÁƯ‡ÚƯÓ •¶ù×¹½ÑÓɇ»Z¾À¹&ƒÚÿ¯¶Y߈‹Ç÷‡È»ëöƒvù×ăôè¼¶ÜŽÿ¯¶ƒvǼ Ơ“º÷ÁÍ©‡¥2ßëMÊ¿¡Èƒv§ôÁÓôê¹Ú‚öÏỖÖïôɳØè‹̉º×¾÷ĂñÚ«Ñ́½Ï̉ÏỖγÉçĂÈ \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/remote-history/_1.nrm b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/remote-history/_1.nrm new file mode 100644 index 0000000..04ffa59 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/remote-history/_1.nrm @@ -0,0 +1 @@ +NRMÿi|lqq||p|||||x|w|lg||||j|mk|]x|||||kl||yuhrqi||w||s||||vx||||||||dm|q|t|||ytmi|or|||uhr|tim||h|x|||h||||xy|x|x||w^|o||vtq|xsx|j||evt|||||xh|i|||xvy|||un||||yw|||yu|lu|i|||dyj||w|qlpox||l|||u|x|t|e|||evw|``|h||v||y|r|||v|||rix||tq||jtx||v||q|my|||||||wt|x||k||||t||x|w||v||x||||q|n|y|||sy`ff|qrieqx||vw_|tv|||yx|q||oqphu|xv|tn||wrjf|q|n|h||||ti|v|||||hvn|vx||x|putoxo|x|||||i|||m||||x|||_|||y|uy||y|p|||||u|u|xqh|se|||v|||y||p||||||it|||x|||||x||x|a|xh||||||||||||n|w||||n|y|ow|t`|xp||||||||x||||||||n|s||t||||x|||qr||q||yw||v|uw||||||i|||o||ynuyu|p|||mnp||oq||oy||||px|qv|w|||x|yn|||||||||||r|||||l||||||vxy||v|||||||v|x|||||w||||y||||wx|qq|hh|||tsupw||||||u||x||y|||wo||u|||||||p||x|||kti||y|||vu||w|u|t||||x||||x|||||yx|yxw||||k||ytxsnv||||y|upx||||xf|x|||x|||||yx|g|yr||||hr||||w|||fqy||vqx||p|w||p||xps|p|x|j||n||y||xr|u|u|wq|||x||v||||tuxe|ty|wou|o|||t||srq|u|r|s|t|xx|rts||x||yv||v||||||n||xs||sv||vv|x|x||||t|u|||||qy||vtry|q|x||s|||xy|||||yu|s|mo|xxv||v|||||||tyyyy|txqx||||rtgwytt|v|||||||x|||||xxx|txwsn||||||||w||pvvvy||||xqs|r|u|y||v|vxxx||||t|ywy|||tu||y||y||u||s|||||||yv|yuvpxyu||qyx||||||||xr|x||r|||y|rs||xyx|myx||||py|||yyx|x|t|xrwyp||xv|r|||p|vx||v|wyx|||u|rl|x|||x|ytw|y||||xl|t||xs||pxy|xty|x|y|y||sy||y||||||||vy|||||ruyx|v|xyi||u||nxyo|||ry|x|||||y||||t||||x|q||tx||y|y|o|xw|qxju|t|vtx|xlyqy|xq|||||w|p||t|x|||xq|mxgplv||||wp|n||||||||r|xj||oe|wwx|||q|s|ex|yxw|nte||yyly|||qyxx|o|||hqx|qoy|||||x|vb|n|||||||ttj|su||||||m|ppopywwuvy|ye||||v||u||y|x|||v|rxq|n|e|||||||x|w|vxu|||jqvn|x|uv|uv|w||u|yq|x|ts|vx|||vusy||xb|e|wy|u||||rvy||yx||xvr||xry|yt||yvw|y|tu||e||yuyx|pxxuxxvyxx||y|twyu|xx|||yw|||x||||x||o||u|rr|xww|||||w||||w|yn|xt||xux||uu|v|n||tt|x|y||||xvy|y||y|p|||x||t||y||||ytt|||y|y|t||v||yy|xx|||||||s||||wyww|iyt|||||x|||y|xy||y||t||uxw||ux||||y||||||wxx|yyx|s|yxyvvwy||xtqxy|||x|x||ym||wwvxtuv||||x|||||v|x||||yx|||||t|x|||xx|||||l|ttxmy||w|yy|||y|up||y|||x|||ts|t||||v|||||rs|upu|||v||v|q|u|uux|||w|||yy||x|ywt|x||lyy|||yy|y||||||||||||||||q|v|t||x|x||n|u|x||||y||||t||x|wyx||y|xs|x|x|u||yut||||||||vy|ww||yx||||||qvv|||||yy||xxxt|yvv|y||||y|u||xvmy||ywv|x||x|xwmt|||v|yw||||w||||e|rvr|y|v||s|t|suy|yux|vp|r|xvu|||xx||t|||||y|yyt|||twu|v||uyrx|||xy|wx|oys|x|wyv|p|||||||x|t|x|vm|v||u||wvw|xrvxxt|xyul||wx|xx||y|||y||v||u|v||xy|||||t|owx|x|n||uxx|||y|r||||x|||xut|m|y|||t|xvq|y|o||||s|pe|||||w|u|yxyxotvyqt||||||y|ku|rypnxnuhnq||mkq||lp|qx|t|vn|l|tvynjwpyqo||ppq||||vwxvm|k|vuts|ysrn|ytyqypttrw|xup|||s|vsqxuwqy||t||xv|lo|xq|yq|t||twx|||vx|w||rnpvs|xx||uy|||xx|yl|xnxx|||||s|uy|||ytx|ty|y|t|utywu||xx|yy|sr||u|t|||k|btux|x||xurvtqp||tw||x|||t|yy|t|||||l|u|v|lxwyyvy|x|xx|xt|xw|wxu|t|x|||si|x|||ux||ty|v|x|y||||wpoqtm|t||wxstvx|s|yr||x|||w||y|xy|xy|uxuxr|xt|||||xx|x||||||w|x||||xyu||uywttt||v|||ymxqy||x|txqv|xt|tu||x||uwu||w|||xx||||yxwvwx||v|hy||xx|s||||exxn|||potuv||xy|wx|u||ry|tvxyr|y|u||t|||||t|v|||||x||x|||x||||w|xbx||x||v|xxxusxxxq||y|||xuvn|x||rtt|yvx||x||uoy||||vv|s||||x||||w|y||l|x|||y|x|||||xty|||||w|y|y|y|vey|y|yyyx|y|uw|l|s|||vtx||||||r||||x||w|yx||||tvyx||n||||||||||y||w||t|vwy|||xxx|||ttu|y||yy|wx|||x|||||x||xy|||||||yy|y|||y||y|||||x|r||||||||x|||s|v|x|||x||||xx||||y||||wy||||||||y|x||v|||||||x|xy||v|||y|rx||||xxxv||rx||||||||||||xx||y|u|||||||||||||||x||y||||y|||||y|||||x|||||||||||x|v||||y|||||||||||||||||||||||y|||||||||x||||||||t||||||y||||||||||||||y||vw||||||||||||||y|||||y|||w||u|x||||||x||||||||||s||||||||y||||p|||||||o||||yx||x|x||||||||||||x|||||||x|w|||||||||||u|y||||||||||||||||y||||||x|||ux||||||x||y|||||||||||||||y|qvw|||||||||||||||||||||w|x||xyx|||x|u||||||||||||t||xx||||||x||||||||||||||||x||||||||y||v|w||||||x|||||||||||||xy||uv|||||y|||||x||||||||||||wy||||||||||||v|ny|xx|||||||||x|||y||||||||||y||xw|||t|||||||x||||y|||||||||y||||||||y|||||||||||x||yyy|||y|x|||||||||x|||x|||||||||||||||t|||||xl||||||||t|y||x|x|||||||y|y|||y||||||||||||||||||xy|y|||xx||||||x|||||||||||x|s||s|||||||||w||||||x||||||||||||||||||||||||||wx|||||||||x|||||||||v|||||t||||||||x|yy|||||||h|y|||vy||||st||||||||||||xy||||y|y||||||||||||y|||u|||||||||x|||||||||||||||||||x|x||||||||||y|||||||w||t|x||||w||y||x|||y|||||||||||y|yyxyv|u|tp|||||||||||y|xwrxt|||||||||||y||||||||||||x|s|||||||r|||||y||||y||||||||||||||||||w|||||||||||||||||||||||y||||||||||xxxxxx||||||x||||wy|||||||||||||||yy|||||||||||l||||y|y|||||||xy||||y|y||||||||||||w|||||||||||||||o||||||v||||||||||||||||||y|||||||||||||y||||||||||w||y||||||||y||||||||||||||s||y|x|||||y|||k||||||||||||||i||||||y|||||||||vy||||||||y||||||||||||||||y||||||||||||||||||||||y|||||||||||v||||||||y|||||||||||||||||||||||||||y|||||||||||||||||||||x||||||g||||||||||||||y|||||||yx||y|w||||||||||||x|||||||||x|yy||y|||||x||||||y|u||||y||||||||u||y|||||||||w|||||||||||||||yx||v||||||y|||||||||||xtx|y||||||y||||v|x||||||y||y|||x||x|||||||||||||t|||||||||||||w||||||||||||vy||||o|p|||||||||y|y|||||||x|||||u|||||y||yw||||||||||||||||||||y||y|y|||||y|||||xx|||yy|||||||v|||||x||||||||||x|||||y||w||||||||||||yy|x|||||||y|||||||||||||x|||yy||||x||x||||y|||x||||||||||||||x|y||||||||y||||||||||||||y|||||||x||||||||||||||||||||||u||xy||||||||||||||tt|||||||||||||||||||||||||||||||||||||||||||||||||||y|||||y|||||||||x||||||||||||||y|y|||||||x||||||v||p|||||x|||||||||x|||||||||||||x||||x||||||||||||||||||x|||||||||||||||||||||||||y|x|x||||v||y||||||||||||||||||o||||||||||x|||||y||||r|||||||||||||||||||||||||||||||||||||||||||||||||||||||xx||||||x|||w|||||||||||||||||||||||n||xxx|||||||||y||||v||||x||y|||||y|||||||y|||||||||||w|||||||||||||x||||||||||||||x||||||||||s|x||||||||||x||y||||||||||||||||||||||||||||||||||y|||v|||||||||v||||||t||w||||x|||||||||||||yy|y||y||||y|||||||xyx|y|||||||y||||||||||||||||y||||||||yy|||y||||||||||||||e|||x|u||||||x|||||||||||[|||||v||||yy|||||y|||||||||x||||||n||y|||||||tu|||xty|v||||u||yxrj|||||||||||||u||y||||||||y||||y|||||||||||||||x|yq|ux||||t|yy|||x|x||vky|||||||y|yt|v||y||xx||||v|||||||||||||||||||x|wyxxy|x|||||||||y|||||||y|yyxxxxxx|||||||||xln|x||||||||||||xxv||||||u||yx||v||||||||y|t||y|yxu||||||x|||||||p||vvyy||||||||||yx|||||||m|||||||||x|||||||||||nx||y||||x||||||||||||||||||||uv||xuyy|y||||||x|||x|||||xoy||||xy||||||||||||x||||||||x||yy|y||||xqn||txw|x||xy|y|||||||x||y||||||||||||||yxx|x|yxx|x|||||||||||||||y|y|q|x|||||||yu|xy||||||||||omn||sy|y|||||y||||||||||g|||||||s|w||||x||||||||||||||w||y|y||||owy|||xy||x|yxy|x|tp|||q|y||||x||||||||||||||||||||||||||||x|yyuuo||v||||||y|||||||t||||txxvyy|||||||||||||||||ux||x|xv|x|||||yy|v||||||||x||y|||t|i||||||||||||||||||||||||||y||||||t||||||||y|yx|||s|||||y||||||x|||yw|y|||yx|||||||x|||||||||||||||||||y||||||||||||||||||||||||||u||||||||||||v||x|||||||u|||x||||||||||||||||yy|jp||||||||||x||||||y|x|wx||||y|xy|||||||||||yxxx||r|||xt||||||y|||||||x||o|||x||||||x||||||y||||w|yys|||||||||y|||y|||||||||y||||||||||y||||||p||||y|||y||x||y||||||y||||||||||um|||q|||||||q||||||yy|||||||y||||||||||||||||||||||x|||v||p|||yx||||||||x|vys|||||y|||||||||x|y|xt|x||||||x|||||||||||||y|||||||||||||||||||||||||||||||y||x||x|txy||y|x||||||qxxxw|||||||||||||u|yo||||||u||||w||||||||||||||||||pw|||y|||y|||||||yx|||||||n|||||x|||||||xj||p|||||||||||yy||||||t|txkxyx|l|||y|||yy|w||y|yxp|x||||v||x|y||||||||||||y|||||||||||||||||||||||||||||y||||||||||||||||||||||||||w||||||||||x|||||y|||||||||||||||||||||||||ry|x|xw||hxx|w|yyt|yw|y|yxysx||rsutyyvxyrxqvp|xxy|yvr|x||t|s|yq||y|y|uytwyyxxxxxx|||v|||vy|w|ywx|xy|||txw|t|xxy||||yxx|t||||xyy|t|u|y|y|||vx||||||x|xs||x|yy||x|x|vw|vyw|w|||||x|yyy|y|y|yx|||||yy||v|y|t||||||||||x||||||||||||y||||xy|w|||||yy|t|x||||||||y|||||||xyxvy|yyyx|xxxy||ry||x|||||xv|u|y|||x|yx||v|y|t|xy|y|uwr|y|y||t||||uyy|wvwvx`|xwhwml|yxxi|||uxyqxkuy|tm|||||p|xw|x|p||||||t||x|||d|v|s|||xx|r|tx||yy|||uu|y||uy|||||||y|||xv|x||t||ssy|||x||||x||y|y||||||||||h|||x||||||||||||||||||||y|||||||||||||||||||||||||y|x|||v||||||ul|u||||||y||x|||x||||ytu|^y||x||||||||||||||||||||||||||||||||||y|yx|y|||vx||||||s||yl|v|||||||||||||x||||||||||||||x|||||||||||||||y|m|||||||xw|||||||||||||||||||||||||||||||||y|||||||||||||||||||||||||y||||||w|y|v|yvrsm|||||umy|xy||xyy||yy|t||nu|qux||||||||v||x|yynh||x||t|x||xwtw||yy|uy||x|y|yy|yxyxtyyv||||uy||||w|xtxt|yvy|t|x||||txy|y|||y|sp||||qr|y|y|v|||s|xyxyy|yxyp|||y|y|xwx|||ury|||yy|y|x|y||yy|||||u||wwyyy||v|yuxyx|r|x|xy||ux||syy||x|ys|tx||t|||w||y||y|xly|vty||cxy||xr|||||uxqtxxv|||v|x||||||xyyyw|||||xuw|ry|y|||||uuyj|xyyxxyy||y|v||||ys||x|yvv|x||x|tox||||y||y|xs||txy|o|x|y||yv||xu|||||||y||||||||x|||||||||v|vx||||||||||||y||||||||||||||||||||||||||||||xy||||||x||||xx||y|x||xnty|||||w|||||s||||||||ww|||y||||||||||||v||||||||w|t|f|y||yx||y|||yw||ywxxwv|||t|y|||||||y||||||||||||||||||||w|||x||||y||||||||||||||||||||||||y|||||||||||||||||||||||s|||||||||||y|||||||||||||||||||||||xx||||y|||w|y|y|yx|||yymoyy|||t|q|tp|x|yx||y||||||||||||||y||||||||||||y|x||||yx|||||||||||||||||||||||||yy|||||||y|||||||||||||||xr||y||uxyyyu||y|v|||xxy||y|ywx|yyu||xvyy|lx|u|yu||vyy|xlxxyxxk||yyyxy|y|x|vyxxxyw||||yx|||xvs|xutyy||y|x|y|x|||xyv|r|yy|wv||w||yxqxy||x|ups|t|yx|tt||||||xy|x|||xy|||||yt||xu|xyv|y|r|xvus|y|y|vx|yq|vy|yvyjr|||p||xyyyw||yy|y||||t||||wx|ytx|uwvxy|yy|ywx|x||||wyvyy|y|vv||rv|y||wy|yy||y||x|v|tu|t||y|y||||||yxvy|||y|vxty|||||y|u|||y|||uw|yy|y|ywyy|yyy||x||||xx|y|xxx|ty||||||y|yyxyy|||||w|xy|||y||||||||w|xx||||vy|y|xy||wlx|||||x|xy||||yyyxy||||xyy||y|yn|xy|xx|t||v|y|||||y|||x||||||y|y||||u||yy||||m|y||ytyw||yxy|||||xy|xw|v||||wwy|wu||y||||||y|||uuy|y|||vy|yy|||y||yyxxxx|yr|y|||||y|||y|xy|y|||||||y|x||xyyu||||v|||||||y|||||y||yyt|wx||h||||||||y|||yyx|||||||||y|||v|yyx||y||v||||p|y||||||urxx|yu|y|y||||||||||y|||yx|y|y|im||wxx|xyj||||vy|w|||uxy|xy|y||u||wy||y|v|xx|y|yxyx|y|x|||||vy||yp|pw|y|||||x|vy|x||wyy||||y||xx||xw|||||||||||y|yrtty|||yyyx|x|t|xx||||||x|||||x||x||qy||||||||||||w|||yx||y|vx|yy|yy||y|xyw||y|||t||y|y|yy||||vwx||||qw||y||x|vx|w|||tu|||||||y|px|y|||y|||x|||xy|x||||||||vuy|||||yxy||||y|x|y|||y|xy||v|yy||y|||uy||r|||y||y||||||w||x||||yx|x||p|r|y||x||syu||y|ywx||y|y||xv|v|ty|||u|y||||t|y||y|||||y||||w||||wy||||||xyx|uw|x||yy||||||y|||xw|y||||q||v|||yy|x||txyy||y|||x||||y|||yys|||||y|||||y|yu||x||y||||||x|||x|y|xx||x|||xy|xx||||wwxy|y|||yx||||||yu|x|||y|||||yxx|x||w||yvvtx||||||y||||||||vy||yxxx||||y||y|yv|||y|yy|||y|y||y|x||||q||||x|w|wx||||||yxy|xyx|yxy|||ywv|yu||||||||y|xw|ytyyx||uy|w|||y|uy||||y|y|xv|x||||y||uy|||yxy||y|||||x|||yy||||||w||y||||ytywuxxyw|y|yy|||||yxyuy||y||x|||yyyyyxxy|||||y||xy|vuyx|||||||||yy|yy|y|vy|yxyvu|y|xyyyx||xyx|xy||||y|sy|||x|xyy||yy||y||xx|yy|y|yx|v|||y|||x|xxx|y||||y||||xxy||||||y|x||y|y|yyyy|x|x||y|y|||x|||||x|xvt|y||yxy|t|yxtu|||yyx||yx|||||||tt||x||w||y||xx|w||||y||w||||y|y||||||x||||yx|||||xy||||yy||yy|yv|||||x||w|||||||||yxyyxyu|||y||y||||||yyyy|yyqx||v|yxx|xx|||y||yy|||yy|||||y|yx|||||yy||uw||||xyy|xy|||yx||x|yuy|||qyy||t|v||||||||||||||vy|vxyy|x|y|yyu|y||||||y|y||||y|||||||||||y|y||y||y||||||||y||||||||||||||x|y||y|||||y||||||y|||x|yyu|v||||y|x|w|xxxxy||x|qxu||yv|||y||x|yv|||||py||yx||||y||||y||||||y||||||||y||||vx||||||||||||||||||||||||||||||||||||||||||||||||||l||||||||||||||y|||||||||||||||y|||||||||||||yx||y|||||||||yx|||||||||||||||||||||||||||||||||||||y||||||||||||||||||y||||||||||x||||||||||x||||||||||||||||y||||||||||||y|||||||||||||||||x|||||||||||||||q|||||||||y|||||w|||||||||y|||||||u||||||||o||y|||||u||||||||||||||||||||||||||||x|||||||||||||||||||||||||||||||||||||||||||x|||||||||yvx|||||y||||||||u||||||y||||||x||||||||||||||||||||||||s|||||||||y||||||||y|||||||||||v|||||||||||||||||||||||||||||||||||||x|||y|||||||||||||||||||||||||||||||||||y||||||||u||w|w|y|||||||||||||||||y|||||||||||x|||yyx|||y|||||||||||||||||||||||||||||||||||||||||x|u||||||||||||||||||||u||||||||||||v||||||||||||||||||||||||||||||||x|||||||||||||||||y|y|||||||||||||||||||x||||||u|||||||||||||||||y||||||||||||||||||||||||||x||y||||||||||y||||||||||||||y||||||y||||y|||||||||||||||||||||||||||||y|y||||||||u||||||||x|||||||t||y||||||||||||||||||||||||||||||||||||||||||x|||||||||||||y|||||||||fy|||x||||u||x|yy||||x|||||y||||||yyxy|||xx||||||||||xxx||||xy||yv|ts||y|||yxvv|yxyx||y|||y||x|||x|yu||y|x|yw|y|tv||y|||xyy||y|||x||wy||||yx||u|x||y|x||||xx|||||||y|||yy|x||y|||x|yyy||x|||||y|||x|x||p||xu|||yxyywx|||yx||xqxx||||wy|yx||||||yy||u||||ytv|x|y|||yy||u||||py|s||x||x|||||||||yxx|||||||y|t|xyx|y||w|||n|y||||x|u||vxvx||||||yxy||xy||vx||||y||||yyx|||||x|y||||||v|||||||||||||yyy||||||x|w||xx||xy|xx||y|||x||||w|y||||||y|xy|x||||||w||y|x|w|||||xyy||||||||||p||yw|||||vvww||y|yy|x||xyy|wx||x||y|y|y|y|x||||||vtyyw||||||||||y||||||yy|wx||xy||xy||vv||||yy|yy||w|||yy|yyxyxo||||||y||||s|||y|xx||t|x||yyy|yyyx||||xxyy||||yy|y|xy||y||yx||yyy|yyx||||yx|y|xry|y||x|v|||y||||y|yxy||y||||y|||||||y||||||xy|xy|xy|t||yx|||x|vv|||u|yx||||||u||uxx|xw||yy||tyxy||x||||||yy|x|y||||||yyvyyxxy||yy||x|||||||xyv||||x||y||||y||||||||||||||oxy|yx||y||||vyx|||||x|||x|y|y|y|||||vxux|x|x||v||||yy|||||y|||||||x||||wyy|xvy||||yy|y|r||yxy|||||||||u|yy||||h||||v||xw||v|||||x|||yy||y||||y|y|yy|||||vx|||||||y|||y|||||yx|yx|yyvwx|||x||y|||yy|y||||y|||yu|||y|||x||||||||||ys||xyxx|y|xyyx||w|yxy||xx||||yx|||y|y|utu|||||||xy||xx|||yy|||y|xy||x||y||||y||w||wt|||y|||r||||||y||y||yt|t||||||x|||x|||ix|||||y||||y|y|xux|y|uy|||yyt|y|||v|x||x|xx||vyy|x||||y||||||yy||ywxx||w|y|u|||||yy|y||||||||w||||y|y|||tvy|||y||||||||||y|y||x|||||yv|||xxx|x|||y|xv|y||||xu|y|||y|||y||||y|||||||||||||||||y|y|||||||||xy|y|||yy||y||x|||||w||||||yy|||xxvxy|||q||||||||yy||y|v|tsy|||||||yy||y|||y||||x||y|y||||x||x||||||xyyyv|||yy||||xu||w|||||w||w||y||||x|y|||||ww||y||||y||xx||uyyxy||yy||||||||||||x|||x||||||yy|sr|u|||||||||||y||||y||vxv|||xv|x||uy||y|||wx|||||||x||||y|y||x|y||yv||rx||||vv||||||x|x||||y||x|||y|y|x|x||||yy|y||yy||||||||||||||y|||||y|uxyx|x|x||y||||y||||||||||||y|y||||||y|||||x||x|u|||||||xy||y|y|||||u||||y||y||||||w|||||y|yux||y|||||||||||||||||yy|y|||y|yy|||xy||yy||||||y|||||||yy|yx|||||||x||yy|xyyv||s|||y|||||yxlxn||ky||v|x|||||y||x|||||||v|xy||y|y||||||x|||xn|w||||||tyx||||xx|||||v||||xxx|y|r|w|||||y||yy|x||y|||||w||xy||yv|y||y|y||||||||yyw||||||v||y|yty|||y||w|y|||y||||y||||||y||||xx|||w|||yy|yy||yyy|||y||||t|||w||||y|yx||y|xyxx|||x|||s||||v|y|||uxx|x||xy||xyt|x||||||||y|||y||y||r||yxy|xxx|t||||||||y|||||||||xx||||y|||||||||||y|xy|xy||yx|yyyx|||x||p||||v|w|xx||||w|yxxwywo||xx|wy|x|y||||x|y|||tu|||||||||y||y|p|v|t|t|yyoy||vt||ywyy|||tr|x||xy|||||||||||y|||y||||y||||||x|x|y|||||y||u|w|||xx|yy|||y||y|||y|x||||||||yy||||wxy|y|||xy||||w|||wyyyy|ywx|||yy|||||xy|||y||xy|||r||x|xyxx||||y||||x||yyx|v|yt|y||v||w||||||x|y||||y||f||y|t|||||||w||x|||||y|||||y||tpr|x|y|||x|||x||y|y||||y|y|x|y||||y|||s||xyx||y|y|||u||t|y||y||yy|||||v|xy|||w||y||t|||y||x|xy||v||||||||||y|yy|y|||||||y|xy||xx|y|||||w|y|||||||||y||||y|||y||||w|||yy||||x|x|||w|||||||xy|y|||w|||||ql||||y|||||yw||||||y||||x|||y|||x|||||||||||y|||xy|||y|y||y||xxyxx||||x|yyy|y|||xyyy|x|||x|||y|||yyoo|||xvyr||||||||||||||||u||y|y|yxy||||x|x||||||||||x||y||||||||x||x|y|||q|||y||y||yxy||x|yx|||x||y|y||||||||||y||x||||||x|||||||y|||||wy||||||x|y||y|vy||||||||x|||y|||xrxxx||||yy||x||y|||yx||y|y|||y|||y|||y|||||gy|yyxsx||yy||yt|||t|w||ys||yxyyyy||y|||y|x||y||y|||v|y|||vu|||||yxx||x||||||x||yx|syy|y|y|||||y|yxyw||||y|xy||||||||||||yvy|y|||xy||||||||y||||||||yox||||yyyx|y||||tv|||||y|||||xy|||||yy|||||||||y||||y||||x||||y||uvtyy|||y|||||||y|||||yx|||y|y||||||||||wy|||||w||||wy|||||||||x||||x|x|||y|vx|x|y||x|syxy|y|||||tyvy||||x|y||y|||||yxx|||ywyv|||y||x|||yty||||||||yy||||||||||utr|||y|||||u|y|y||||xy||||yt||xy|||||||||uy|yx|||||||||x|||||y||y|||||||y|r|x||||||x|y|||yy|y||xw||xy|y||y|||||xtty||u|||y||y||yry|||t||y||||y|||||||||||||y||x||||x|wy||||y|y||u|||x||||x|y|||||||x||||||y||y|||||ty|y||y||||y||w|||y||||v||yu|||||yyuuxy|yx|yy||yx||y||||xy|y|||x|y|y||||||||q|y||||ty|||wyyy||||y|||||x|y||||w||x||x|x||vw|||||||yy||||||||||||yx|u|||x|||x|y||x||||rx||||y|v||||y|||yyxy|y||||||xyy||||y|||||||y|||||yx|||w||||||||y|yy||v|||||||y||||y||||||||||x||v|||||||||||yr||x||vy|yx||y||yxyx|||y|y|xw||||||||vy|||||||y|||xyp||||y|y||y|u|||||yy|||y|y||xu||||||y||||||||||y|||||||||||||yy||||||||||yxyy||||||||||||wxyyyyyy|y|y|y|||yy|y|||||w|||w|xuw|v|y||||||||||||y||v||||||||||yyxy|xy|q|||||||t|y|x||y|y||||x|x|||x||xx||||||||||y|||x|||||||||||||yy||y||x|||sx|||x|e|y||||y||||||y|||||||x|yy|y||||||||||yy|w||||||||||||||y||xy||xr|yx|y||y|y||xxy|x||wx|x|||x||y||||wx||yy||y||||||yuy||||||||||vy|||||||||||||||||||r|||||||||x||s||yy||x||w|||xyyy||||yy|||x|y|||y|||||||||ix|||||||||||x|||||y|||||y|xy||yx|y|ttu||||y|||x||y||||||y||y|y|v|||p|||||||yx|||x||||xx||x|oyy|||||||y|yx|||xy||||yy||||x|y|y|||yu||y|y|y||y||y||||y|t|||sx||uy|||y|y||||||xy||||||y|y||||y||y|yx||yqy|ywy|||||y||w|||y|||y|||||||xw|||||||||||t|w|y||||x|||||y||||y|||||||||||||||y||||xxy||y|||||yx|||||w|xy||yy|||||||yyy||||||||||yx||y|||||y|yy|||||||y||y|||||||||||||||||||||yy|y||y|y||y|y|||||y||||||||y|y||||||||||||t||||||y||||||yy|||||sy|yww|||||y||||y|||y||xy|||||yv|y|||||x|||y||||||||||||ywy||||yy|||u||||||||||||||||||||||y||yy||||y|||xvx|||||w|||v|x||||v|||||yy||||||y|urly|vcif||l|pd`mrmytdxl||g|||i||l|||ggn]|||l|ipienqmfl|llpe||vu|o|_vg||j|||d|m|p_|w|r_lh|q||||||ijm|||mk^g`r|||||||vhx|l|d|||||p||e||_ne|mtjj|dlldtjl||`egee|||||h|||||kedu||h|un||||px|e|_|ktyr|||s||p|s|h|m|||||hpe||||uh||y|kl|xmq||pmghx|iriiiiiiiiiiiiii|y|k|ni|j|||y||||ut||u|lln||x||||||||||||||||sy|||x||t|xue|e||ldyddyp|gj|ppr|p|y||||n||n||rt||||w||||l||geeh_|j__|en_||p||rx||hl|tyxyyty||x||||x|y|xxx||x||jr||dm_djtx|vgu|ktwy|ywy|k||||x|s``l|l|l||jm||mmnwu|||yxsu|u|viaxsyya|fy|rapikk|uoi|p|jhhmknjyxvontxyymmmm|xxyx||||xeeyrr|bxjrxs||xt|||||||yu|||||y|||||||jt||||||x|x|||||||||||||||||||||||||w||||i|||y|yt|||||||||||x||||||||||||||xv|xx|||||||||||||||||||||||||y||w||y||x|||y|||y|y|||yyx|||||||x|v||x|w|wyxrw|||yxx||v|||||||x||||x||xy|||y||||vy||||||||x|y|vu|||y||||||yx|xx|||||||||x||p|yyvxyx||||||||y||||||r||||||||k||y||yw|y||||u|||||||||||||||||||||||yr||x||y||||||||||x|x||||v||||y|||x|||||||||||||x|||||||||||||||||w|w|xv||||||v|||||y||||ww|||v|||||||y|u||||tw|||y|x||x|||xxyh|||||||||||||n|||u|||yqn|t||uvw||||||t|w||y|||y|x||t||y|||||||y|yu|||x||||||y||x|||||yy|||||||y|x|||||v||||w||||||||y||||||||y||||||||||y|||y||t||x|||||||||||||x|||||y|y|||||||||||||x||w|x|x||y|||||||||t|||y|yx|xt||y|y||r|||y||||||yy|yy|y||||||||||x|x|||u|||y|vxw|y|ywy||||||ty|y|||||||||||yx|y||x|y|y||yq|u|xyy|x|||||||yx||y|||x|||uy|y||||yuyy|||x|||x||x||||x|yt|yy|||||||y||||||||||||||xy|||x||||x|x||x||x|||y||||||||||v|v|||yxy|x|||x||x||||y||xy|w||xy||||y||y|y||||||tyxy|||y||y||x||xy|||x||||wx||||||y||||||t||yvy|ywy||||||upy||x|x|||xy||xx||y|y|qy|||yyx||||||yy||||||||y||||||y|||||x||x||y|||||xn|x||||q||x|x||||||||||y||||xy|||||||||||||||||yy|||||yy|||yy|u|||||||||||||yxy|||h||y||y||w||||||||w|||||||||||y|||x|||||||||||y|xy||||yx||xx|||||||y||x||||||||||y||||||||||||v|||||||||||||||||||||||||||||||||||||x|yw||||||xgx||vy||x|||||||||||||||||||y|||x|||||y|||||||||||||||||||||||||||||||||||||||||||y|q|||||||||||||w|||||||||||||||||||||||||||||||||||||||||||||||||||||||r||||||||||||||||||||x||||||||y||||||||x|||w|||||||y|w|||||||||x|||y||||||||||||||||||||||||||||||||||||||||||||||||||||||x|||lo||||||v||ixy|||yxv|x||||||xr||w||vxx||w|x|x||||||||||||||||||||||||||u||||||||||||x||||y|||||||||||||||||||||||||||||wx||||||||||||||||||||||||||||||||||||||||t|y|y||||||y||||u|x||||||yy|||||x||v|||||||||||||||o|||||||q||||||||||||y||||||||||v|||||y||||v|||t|||||||||||||||||||||||||||||||||||u||||||||||||||||xw||hy||||||y|||||s||||||y||||||||||||||yt||||x|||rv||||||m||||y||||rtux||||x|||||qr|y||x|||o|||w||||||||||||||||||||||||||||x|||||||r|pv||||x||v|||||||||||||||||x|||||||||t||s|||||||||vx|s|||y||||||||||u||||x|x|xu|yxrxwtwvwxx|xyyxxsvxvxywxyyyy|ysvwyxyyyxyvxyxvvyqyxy|yvxytyyxyxxuuyypmxyw|xyypyxy|||xxy|wxxyytv|xro|v|wtxxwxy||wxxy|xyy|v|x|tyy||vyvwxxyx||rx|t|x|yyy||yy|u|x||pw|yyttvywxppxyxwx|||y|wyyy||uypxx||y|tyy|xyxt|v|||vxyyy|||x|px|y||sy|||||||y|x||yxy|t||xy|wyyxxyyyxxxxpyyswxxy||yy||tyypxy|wvuyyuytxv|opyvx|xyxyxuyxyxxxyywyxuqpxxyxyvwywxyy|xxtyyxxyxyytuvyxyytyvwypynq|yysxyytvy|xyyywx|ytyo|||y|yy||udra||||||||k||er`l||||__|p|||h||||||||q|||ntn|hvg|qtr|||||||vv|otr|gxy||r|xy||v|||r||xgrt||t|l|||||x|t|||m|r||||xr||||x|xyuxyyx||tu||yxx|y||||wyk|y|xvyy||y|||vv|xyxtx|x|u|u||q|||||v||yr|||qy||||g|jg||hg||||k||h||hdisumhdje|wh|jln|||||xr|hol|yfvtckwenxhhghlnpx||p|ljhio|wi|g|q|frfih||ggyghmmei|ijpeg|ijymk|mpq|prinow|t||hgph|hiel|ic|t^|||nlghhxjimydgq|ikmhqd|hlt|xgfgujpi|||l|ptq|skhm|t||u|||tveinh|uqjnh||ihigwuidqgghi|yxnlmwikm|y||kko|hifnilllf|iih|h|h||jo|da|fmh|jf|kdifllvjxhin|bi|kihrltthftijh|||qhgnpnje|p|ng|b|qp|h|iuhgjiyoo|mrnytpqi|qqkifpql|m||smu||i|wwfw|is||m|oon|gdjuilo|uix||i|`|||g|pgq||||i|o|y|vh||ud|mt|||hxqdkfxtt|o|||``w|g|fy|||w||pj|||i|i||w|qq|k||s||tu|pddj|ny|o|yvo|||m|pb|nqrympnvy|tmdqfydrml||||hxoyhfhyhml|tpsvognuq|terferitinfp_`||htu|mys|lo|v|||ohv|tgtqutttgvp|rxyq|nw||iy|tyhvphurot|xqnpxf|px|thtn|suvi||||hlkkgi|p|plxtp|ht|ggqcfohghh|g||hr|i|itht|||gshfi|jm|iq||s||u||y|||ii||p|vqe||ry|||||||ix||fec|l||eyehe||xtutijhx||wxs|t|xtpf|i||||rh|yi||hivdwifihxfp|rhuqxabeixdn|kiw|m|gfh||lxxus|yu||hxrhhf|y|xdkyohhkp|iretq||yvsj|||||||e|c|e|uw|hsvthrhrw||xerh|gfid|x|hgx|x||ifhnflv||l|uwcu|d||ymfg|w|vkpj|||i|ttv||oexx|||h|d|ywf|toch||w|feeichhgffghiigigiex|x|y|||||||||||y|||||||y||y||||||||ox|||y||||xy||||||||||||||y|||||y|||||||||||||||||||w|||||||y||y||||||||yyx|||||||y|||||xy||y|x|||yw||y|||y|||||||x|v|||||y|||x|||||||||||||x|y||||||||y|||y||||||w||u|||||||||y|||xx|||||||||||x|||||||y||x||||x||||y||||||||y|||y|||v|||u||y|x|y||y||||||||||xy|y||x|||||||x|||xx||y||||||||y|y|||||||||y|||wv|yt|||xwyx|yy||yr|||||uyw|||y||x|y||||yx|||oy|y|||x||||yyy|v||||||y||x|||||||||y||||||||||yx|||y|vx|||yy||x|t|xy|v|x||y|||||||||||||||||x|yy||||||||||xxxyy|u|xx|uv||||||x|||||||||yyx|vyy|y|||u|yx||yyx||||y|||||y|y||||||||y|vw|qp||v|r|u|y||||||||||tvx||||yuyy|||y||||r|||xy|||||||xwwyy||x|||m||||hptej|fdg|d|fdhdenmmj_h|q_rn||m|ijshat|nhi|imlfgihqlliffimkiqoejl|mkhbj|iaoakmjirdnipp|ghn|dm|rmimvril|jvhmqmpwgmi|eide|diojpxdqkfjx|fytp|_nlq||mpqmohmlg|rlgdf||njd|islsgk|espkmmbek|jiq|h|jnyo|ps|i||qihyi|yhhothfnij|n|irjsmdj||xdhmj|pkk|gnu|uj|nmp|ecr|||pn||ntjmeni|x|||nvxxi|wu|tsi|grsmtl|||dqh|xjvuql|kvn||y|u|r|e|mss|x|nmt|q||x|qvp|dbw|k|i|pm|tml||_|pjnghsq||pvr|llvmmkghigrisrhcilfhifkeh|q|igftf||t|_||hmkjxhvituim|llvu|iw|||u|s|x|n|mt|tn||||xuuthlan|ii|nxny|y|mtnxver|pylwtiuhr||hjgt|y|nwpqpdj||xs|nb|x|gro`swgjvnt|n|h|ullcjkgqnvdifjjfyqgmpldjrkiikktnkooijoqfjiowlnlsrpothp|krvptrq|xu|pv|tpjq|||xx|ryprtvvh|ttrtfypuqmyvwdqtqpxkneopnlguqlttysnspttnspjjrpytxvvqdtxvu||psmnqpupqtlt|wyx|qxtlknu|tutoqrxxp|rdnqussuytyvvwuxlor|y|yuxxruxvpyuvxqqr|||tutxtq|usutuwxtvvvuml|txpdxy|w|tsruyyturrupm|xtytupsx||txn|tptptxx|yuxqrpxrrttwssupyyst`qtwuyvpp|yyvwsryrstxptvqy||utyy||jm|qr|qtrxumtotutpopx|m|lqwq|ol|nlnwtyxto|sqvx|xdt|u|yxtttry||vv|xvx|||hhts|xxvuxtv|||xw|||_x||y|wruuvxv|yysxyttt||tu|u|x||xy|||xx|||||st|||||uu|mp|k|||x||u|xv|qro|||||y||rvsw|uxx|xx||xp|||wurxyr|u|||||qx|||u|uu||xxuu|y||x|m|||||v|||w|||y|||y||||yxtx|vty|vtutv|x||||vw|q||e|||nw||||s|||xwvuv||r||||||||||x|x|vvr|||yyy||xr||w|v|||x|||yv||v|||txuuu||y|rp|||xy|||y|||||x|||||x||yw||p||||v|wxs|||y|||yv|||xx||||||v||xxyvu||vu|qiv||||||||||||x||x|xiyx||||y|||hxu||yo|r|||v|ts||||||lomq|xq||||||||y|uol|xxomsrx|p||||vv|yvwx|||xx||g|p|u|||||yyxy|||po|j|mw||x||uyy||xyxy|||||x|x|yx|x|||v|||ypyv|y||||s|xhxykx||||xyxy|y||w|y|vu||t|||wyxxy|r||gyy||||uyxx||||xxxx|||||||||||v|mx|||xyp||wxyt|||yyh|yeiqfenh||nakbon|iux|yp|ymv||||||vx|||||xwxut||ip|w|||v|||w|||||||yy|||||||t|i|||wut||v|yr|trtvnwqwuqwlxupyr||uyjt|||||oxxswv|t|xtstx|u|r|x||||||||||ruvoxv||y||||usw|||||t|||ytusts|q||tuot|ty||xv|qu|vu|tx|ywv|||xt|v|x||lxy||yx|||xwtyyx|||wty|||xy||||yp|tvyyy|vxv|x||uvy|||yyvxv||yuuxwyy|||v|||||uyj||lx|vy|trw||vyw||uutuw|ttwtt|||xvxyxtxywtxpv||quxy|tn||u|xx|w|pwyxxtsy|u|vxy|ty|y|uxu|y||nrx|r||l||x||||xvx||uw|y|y|x|y|x|x||||xyvux|ok||||r|||yx||xt|qy|y|x|||||vu|txuxyw|||ux|||qsx|v||||||u|rrk|||t||u||v|yu|yyt|||||y|||y|yvvy|u|||||||xxy|yppp|yyxxw|||||q|x|nt||||||t|||my|vyyxx|t|u||xy|y|y|||ghjhd`rperghsgx|||m|dtpihpmsfwlfhpjff|xyx|u|mvq|o|tehgwyh|uv|hvx|qpxug|||dw|ugvxu|wtxvuh|xx|||uxvj|x||||hyxcw||hj|ginghe||yrjh||tknkkxlqtyoot||swvtv|yywbx|xyfuxyvys|v|||y||tqs||eqyyv`wtuy|w||tyyx|xw|y|n|hs||||xr|||m||y|ryy|y||||p|uy|sux|||u||xw|y|yy||||yvy||yilljowswwo|pp|t|ux|nx||rvyymuq|xt||||vo||y|vsqt|yysutvy|edvvwuvv|||v||yv \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/remote-history/_1.prx b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/remote-history/_1.prx new file mode 100644 index 0000000..92c42a9 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/remote-history/_1.prx differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/remote-history/_1.tii b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/remote-history/_1.tii new file mode 100644 index 0000000..482d98c Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/remote-history/_1.tii differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/remote-history/_1.tis b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/remote-history/_1.tis new file mode 100644 index 0000000..eea3ba2 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/remote-history/_1.tis differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/remote-history/segments.gen b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/remote-history/segments.gen new file mode 100644 index 0000000..225a55b Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/remote-history/segments.gen differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/remote-history/segments_2 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/remote-history/segments_2 new file mode 100644 index 0000000..5ddef99 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/remote-history/segments_2 differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/server-config.json b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/server-config.json new file mode 100644 index 0000000..bf6544e --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.epp.logging.aeri.ide/org.eclipse.epp.logging.aeri.ide.server/server-config.json @@ -0,0 +1,72 @@ +{ + "version": "v1", + "title": "Eclipse", + "timestamp": 1504874902405, + "ttl": 10080, + "helpUrl": "https://dev.eclipse.org/recommenders/community/aeri/v2/help/", + "feedbackUrl": "http://ctrlflow.com/automated-error-reporting", + "aboutUrl": "https://wiki.eclipse.org/EPP/Logging", + "submitUrl": "https://dev.eclipse.org/recommenders/community/confess/0.6/reports/", + "maxReportSize": 262144, + "problemsUrl": "https://www.eclipse.org/downloads/download.php?r\u003d1\u0026file\u003d/technology/epp/logging/problems.zip", + "problemsTtl": 20160, + "interestUrl": "https://dev.eclipse.org/recommenders/community/confess/v2/interest", + "connectTimeout": 10, + "socketTimeout": 10, + "acceptedProducts": [ + "org.eclipse.*", + "org.fordiac.*" + ], + "acceptedPlugins": [ + "org.apache.log4j.*", + "org.eclipse.*", + "org.fordiac.*" + ], + "acceptedPackages": [ + "ch.qos.*", + "com.cforcoding.*", + "com.google.*", + "com.gradleware.tooling.*", + "com.mountainminds.eclemma.*", + "com.naef.*", + "com.sun.*", + "java.*", + "javafx.*", + "javax.*", + "org.apache.*", + "org.eclipse.*", + "org.fordiac.*", + "org.gradle.*", + "org.jacoco.*", + "org.osgi.*", + "org.slf4j.*", + "sun.*" + ], + "requiredPackages": [ + "com.cforcoding.*", + "com.gradleware.tooling.*", + "com.mountainminds.eclemma.*", + "com.naef.*", + "org.eclipse.*", + "org.fordiac.*", + "org.gradle.*", + "org.jacoco.*" + ], + "acceptOtherPackages": false, + "acceptUiFreezes": true, + "ignoredStatuses": [ + ":java.io.IOException:There is not enough space on the disk", + ":java.net.*:", + "org.eclipse.core.filesystem::Could not delete*", + "org.eclipse.core.filesystem::Could not move*", + "org.eclipse.core.resources:org.eclipse.core.internal.resources.ResourceException:Resource is out of sync with the file system*", + "org.eclipse.core.runtime::Invalid input url*", + "org.eclipse.epp.mpc.ui:java.io.IOException:", + "org.eclipse.equinox.p2.*::", + "org.eclipse.jface:java.io.IOException:Unable to resolve plug-in*", + "org.eclipse.oomph.setup.core:$org.apache.http.ConnectionClosedException:", + "org.eclipse.pde.core::The current target platform contains errors*", + "org.eclipse.ui::Conflicting handlers for*" + ], + "problemsZipLastDownloadTimestamp": 1504874933883 +} \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.equinox.p2.ui/dialog_settings.xml b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.equinox.p2.ui/dialog_settings.xml new file mode 100644 index 0000000..d90afd7 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.equinox.p2.ui/dialog_settings.xml @@ -0,0 +1,24 @@ + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.linuxtools.cdt.libhover/C/devhelp.libhover b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.linuxtools.cdt.libhover/C/devhelp.libhover new file mode 100644 index 0000000..4586e41 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.linuxtools.cdt.libhover/C/devhelp.libhover differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.linuxtools.cdt.libhover/C/glibc_library.libhover b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.linuxtools.cdt.libhover/C/glibc_library.libhover new file mode 100644 index 0000000..7ce9769 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.linuxtools.cdt.libhover/C/glibc_library.libhover differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2017/9/36/refactorings.history b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2017/9/36/refactorings.history new file mode 100644 index 0000000..dc57a49 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2017/9/36/refactorings.history @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2017/9/36/refactorings.index b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2017/9/36/refactorings.index new file mode 100644 index 0000000..27696b7 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2017/9/36/refactorings.index @@ -0,0 +1,9 @@ +1504875578396 Delete resource 'STM32F10x_StdPeriph_Lib_V3.5.0' +1504878348049 Delete resource 'hsb-mrts' +1504878493359 Delete resource 'STM32F10x_StdPeriph_Lib_V3.5.0/Project' +1504878503901 Delete resource 'STM32F10x_StdPeriph_Lib_V3.5.0/Utilities' +1504878512252 Delete resource 'STM32F10x_StdPeriph_Lib_V3.5.0/_htmresc' +1504878535678 Delete 2 resources +1504879885217 Delete 2 resources +1504879910440 Delete resource 'hsb-mrts/inc/a.h' +1504879914328 Delete resource 'hsb-mrts/src/main.c' diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2017/9/37/refactorings.history b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2017/9/37/refactorings.history new file mode 100644 index 0000000..a1d9829 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2017/9/37/refactorings.history @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2017/9/37/refactorings.index b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2017/9/37/refactorings.index new file mode 100644 index 0000000..e8bb86e --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2017/9/37/refactorings.index @@ -0,0 +1,2 @@ +1505117283219 Delete resource 'hsb-mrts/mrts.xml' +1505205225835 Delete resource 'hsb-mrts/src/system_stm32f10x.c' diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/hsb-mrts/2017/9/37/refactorings.history b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/hsb-mrts/2017/9/37/refactorings.history new file mode 100644 index 0000000..4fff74d --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/hsb-mrts/2017/9/37/refactorings.history @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/hsb-mrts/2017/9/37/refactorings.index b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/hsb-mrts/2017/9/37/refactorings.index new file mode 100644 index 0000000..4add03b --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/hsb-mrts/2017/9/37/refactorings.index @@ -0,0 +1,2 @@ +1505117269574 Rename resource 'makefile' +1505138780348 Move 'LinkerScript.ld' to 'linker' diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.ltk.ui.refactoring/dialog_settings.xml b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.ltk.ui.refactoring/dialog_settings.xml new file mode 100644 index 0000000..d1e5338 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.ltk.ui.refactoring/dialog_settings.xml @@ -0,0 +1,7 @@ + +
+
+ + +
+
diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.oomph.setup/workspace.setup b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.oomph.setup/workspace.setup new file mode 100644 index 0000000..a1ef8f5 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.oomph.setup/workspace.setup @@ -0,0 +1,6 @@ + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.rse.core/.log b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.rse.core/.log new file mode 100644 index 0000000..e69de29 diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.rse.core/initializerMarks/org.eclipse.rse.internal.core.RSELocalConnectionInitializer.mark b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.rse.core/initializerMarks/org.eclipse.rse.internal.core.RSELocalConnectionInitializer.mark new file mode 100644 index 0000000..e69de29 diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.rse.core/profiles/PRF.pc33_12/FP.local.files_0/node.properties b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.rse.core/profiles/PRF.pc33_12/FP.local.files_0/node.properties new file mode 100644 index 0000000..8ce5e15 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.rse.core/profiles/PRF.pc33_12/FP.local.files_0/node.properties @@ -0,0 +1,57 @@ +# RSE DOM Node +00-name=PC33\:local.files +01-type=FilterPool +03-attr.default=true +03-attr.deletable=true +03-attr.id=local.files +03-attr.nonRenamable=false +03-attr.owningParentName=null +03-attr.release=200 +03-attr.singleFilterStringOnly=false +03-attr.singleFilterStringOnlyESet=false +03-attr.stringsCaseSensitive=true +03-attr.supportsDuplicateFilterStrings=false +03-attr.supportsNestedFilters=true +03-attr.type=default +06-child.00000.00-name=My Home +06-child.00000.01-type=Filter +06-child.00000.03-attr.default=false +06-child.00000.03-attr.filterType=default +06-child.00000.03-attr.id=My Home +06-child.00000.03-attr.nonChangable=false +06-child.00000.03-attr.nonDeletable=false +06-child.00000.03-attr.nonRenamable=false +06-child.00000.03-attr.promptable=false +06-child.00000.03-attr.relativeOrder=0 +06-child.00000.03-attr.release=200 +06-child.00000.03-attr.singleFilterStringOnly=false +06-child.00000.03-attr.stringsCaseSensitive=false +06-child.00000.03-attr.stringsNonChangable=false +06-child.00000.03-attr.supportsDuplicateFilterStrings=false +06-child.00000.03-attr.supportsNestedFilters=true +06-child.00000.06-child.00000.00-name=C\:\\Users\\mmi\\* +06-child.00000.06-child.00000.01-type=FilterString +06-child.00000.06-child.00000.03-attr.default=false +06-child.00000.06-child.00000.03-attr.string=C\:\\Users\\mmi\\* +06-child.00000.06-child.00000.03-attr.type=default +06-child.00001.00-name=Drives +06-child.00001.01-type=Filter +06-child.00001.03-attr.default=false +06-child.00001.03-attr.filterType=default +06-child.00001.03-attr.id=Drives +06-child.00001.03-attr.nonChangable=false +06-child.00001.03-attr.nonDeletable=false +06-child.00001.03-attr.nonRenamable=false +06-child.00001.03-attr.promptable=false +06-child.00001.03-attr.relativeOrder=0 +06-child.00001.03-attr.release=200 +06-child.00001.03-attr.singleFilterStringOnly=false +06-child.00001.03-attr.stringsCaseSensitive=false +06-child.00001.03-attr.stringsNonChangable=false +06-child.00001.03-attr.supportsDuplicateFilterStrings=false +06-child.00001.03-attr.supportsNestedFilters=true +06-child.00001.06-child.00000.00-name=* +06-child.00001.06-child.00000.01-type=FilterString +06-child.00001.06-child.00000.03-attr.default=false +06-child.00001.06-child.00000.03-attr.string=* +06-child.00001.06-child.00000.03-attr.type=default diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.rse.core/profiles/PRF.pc33_12/H.local_16/node.properties b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.rse.core/profiles/PRF.pc33_12/H.local_16/node.properties new file mode 100644 index 0000000..92bf4f4 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.rse.core/profiles/PRF.pc33_12/H.local_16/node.properties @@ -0,0 +1,25 @@ +# RSE DOM Node +00-name=Local +01-type=Host +03-attr.description= +03-attr.hostname=LOCALHOST +03-attr.offline=false +03-attr.promptable=false +03-attr.systemType=org.eclipse.rse.systemtype.local +03-attr.type=Local +06-child.00000.00-name=Local Connector Service +06-child.00000.01-type=ConnectorService +06-child.00000.03-attr.group=Local Connector Service +06-child.00000.03-attr.port=0 +06-child.00000.03-attr.useSSL=false +06-child.00000.06-child.00000.00-name=Local Files +06-child.00000.06-child.00000.01-type=SubSystem +06-child.00000.06-child.00000.03-attr.hidden=false +06-child.00000.06-child.00000.03-attr.type=local.files +06-child.00000.06-child.00000.06-child.00000.00-name=PC33___PC33\:local.files +06-child.00000.06-child.00000.06-child.00000.01-type=FilterPoolReference +06-child.00000.06-child.00000.06-child.00000.03-attr.refID=local.files +06-child.00000.06-child.00001.00-name=Local Shells +06-child.00000.06-child.00001.01-type=SubSystem +06-child.00000.06-child.00001.03-attr.hidden=false +06-child.00000.06-child.00001.03-attr.type=local.shells diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.rse.core/profiles/PRF.pc33_12/node.properties b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.rse.core/profiles/PRF.pc33_12/node.properties new file mode 100644 index 0000000..9ca1b3b --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.rse.core/profiles/PRF.pc33_12/node.properties @@ -0,0 +1,7 @@ +# RSE DOM Node +00-name=PC33 +01-type=Profile +03-attr.defaultPrivate=true +03-attr.isActive=true +05-ref.00000=FP.local.files_0 +05-ref.00001=H.local_16 diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.rse.ui/.log b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.rse.ui/.log new file mode 100644 index 0000000..e69de29 diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.ui.editors/dialog_settings.xml b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.ui.editors/dialog_settings.xml new file mode 100644 index 0000000..e4f30a7 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.ui.editors/dialog_settings.xml @@ -0,0 +1,5 @@ + +
+
+
+
diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.ui.ide/dialog_settings.xml b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.ui.ide/dialog_settings.xml new file mode 100644 index 0000000..8911b27 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.ui.ide/dialog_settings.xml @@ -0,0 +1,19 @@ + +
+
+ + +
+
+ + + + +
+
+ + +
+
+
+
diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.ui.intro/dialog_settings.xml b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.ui.intro/dialog_settings.xml new file mode 100644 index 0000000..d3014f5 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.ui.intro/dialog_settings.xml @@ -0,0 +1,4 @@ + +
+ +
diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.ui.intro/introstate b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.ui.intro/introstate new file mode 100644 index 0000000..bc63a5b --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.ui.intro/introstate @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.ui.workbench.texteditor/dialog_settings.xml b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.ui.workbench.texteditor/dialog_settings.xml new file mode 100644 index 0000000..83e793e --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.ui.workbench.texteditor/dialog_settings.xml @@ -0,0 +1,24 @@ + +
+
+ + + + + + + + + + + + +
+
+ + + + + +
+
diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.ui.workbench/dialog_settings.xml b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.ui.workbench/dialog_settings.xml new file mode 100644 index 0000000..4e465ff --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.ui.workbench/dialog_settings.xml @@ -0,0 +1,19 @@ + +
+
+ + +
+
+ + + + + + + + + + +
+
diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml new file mode 100644 index 0000000..e841e9b --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.wst.sse.core/task-tags.properties b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.wst.sse.core/task-tags.properties new file mode 100644 index 0000000..895655e --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.wst.sse.core/task-tags.properties @@ -0,0 +1,3 @@ +# +#Mon Sep 11 08:30:30 CEST 2017 +task-tag-projects-already-scanned=FreeRTOS,hsb-mrts,RemoteSystemsTempFiles,STM32F10x_StdPeriph_Lib_V3.5.0 diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.wst.sse.ui/dialog_settings.xml b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.wst.sse.ui/dialog_settings.xml new file mode 100644 index 0000000..e153bf9 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.wst.sse.ui/dialog_settings.xml @@ -0,0 +1,5 @@ + +
+
+
+
diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.wst.xml.core/default_catalog.xml b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.wst.xml.core/default_catalog.xml new file mode 100644 index 0000000..ef0de5d --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.wst.xml.core/default_catalog.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.wst.xml.core/internalsubsets/549240720.dtd b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.wst.xml.core/internalsubsets/549240720.dtd new file mode 100644 index 0000000..2197e2e --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.wst.xml.core/internalsubsets/549240720.dtd @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.wst.xml.core/system_catalog.xml b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.wst.xml.core/system_catalog.xml new file mode 100644 index 0000000..d338fb4 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.eclipse.wst.xml.core/system_catalog.xml @@ -0,0 +1,2 @@ + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.review_board.ereviewboard.core/repositoryClientDataCache b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.review_board.ereviewboard.core/repositoryClientDataCache new file mode 100644 index 0000000..4170ef3 Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.review_board.ereviewboard.core/repositoryClientDataCache differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.tigris.subversion.subclipse.ui/dialog_settings.xml b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.tigris.subversion.subclipse.ui/dialog_settings.xml new file mode 100644 index 0000000..1ef2b05 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/.plugins/org.tigris.subversion.subclipse.ui/dialog_settings.xml @@ -0,0 +1,3 @@ + +
+
diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/version.ini b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/version.ini new file mode 100644 index 0000000..8de1c8f --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/.metadata/version.ini @@ -0,0 +1,3 @@ +#Tue Sep 12 12:27:58 CEST 2017 +org.eclipse.core.runtime=2 +org.eclipse.platform=4.6.3.v20170301-0400 diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/.autotools b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/.autotools new file mode 100644 index 0000000..e29d320 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/.autotools @@ -0,0 +1,83 @@ + + + + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/.cproject b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/.cproject new file mode 100644 index 0000000..48af26a --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/.cproject @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/.project b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/.project new file mode 100644 index 0000000..03bfcb9 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/.project @@ -0,0 +1,32 @@ + + + FreeRTOS + + + + + + org.eclipse.cdt.autotools.core.genmakebuilderV2 + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + org.eclipse.cdt.autotools.core.autotoolsNatureV2 + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/.settings/language.settings.xml b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/.settings/language.settings.xml new file mode 100644 index 0000000..299231b --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/.settings/language.settings.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/License/license.txt b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/License/license.txt new file mode 100644 index 0000000..9667958 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/License/license.txt @@ -0,0 +1,399 @@ +The FreeRTOS open source license covers the FreeRTOS source files, +which are located in the /FreeRTOS/Source directory of the official FreeRTOS +download. It also covers most of the source files in the demo application +projects, which are located in the /FreeRTOS/Demo directory of the official +FreeRTOS download. The demo projects may also include third party software that +is not part of FreeRTOS and is licensed separately to FreeRTOS. Examples of +third party software includes header files provided by chip or tools vendors, +linker scripts, peripheral drivers, etc. All the software in subdirectories of +the /FreeRTOS directory is either open source or distributed with permission, +and is free for use. For the avoidance of doubt, refer to the comments at the +top of each source file. + +---------------------------------------------------------------------------- + +NOTE: The modification to the GPL is included to allow you to distribute a +combined work that includes FreeRTOS without being obliged to provide the source +code for proprietary components. + +---------------------------------------------------------------------------- + +Applying to FreeRTOS V8.2.3 up to the latest version, the FreeRTOS GPL Exception +Text follows: + +Any FreeRTOS *source code*, whether modified or in it's original release form, +or whether in whole or in part, can only be distributed by you under the terms +of the GNU General Public License plus this exception. An independent module is +a module which is not derived from or based on FreeRTOS. + +Clause 1: + +Linking FreeRTOS with other modules is making a combined work based on FreeRTOS. +Thus, the terms and conditions of the GNU General Public License V2 cover the +whole combination. + +As a special exception, the copyright holders of FreeRTOS give you permission to +link FreeRTOS with independent modules to produce a statically linked +executable, regardless of the license terms of these independent modules, and to +copy and distribute the resulting executable under terms of your choice, +provided that you also meet, for each linked independent module, the terms and +conditions of the license of that module. An independent module is a module +which is not derived from or based on FreeRTOS. + +Clause 2: + +FreeRTOS may not be used for any competitive or comparative purpose, including +the publication of any form of run time or compile time metric, without the +express permission of Real Time Engineers Ltd. (this is the norm within the +industry and is intended to ensure information accuracy). + + + +-------------------------------------------------------------------- + + + +The standard GPL V2 text: + + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License** as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/croutine.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/croutine.c new file mode 100644 index 0000000..6d2cff6 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/croutine.c @@ -0,0 +1,395 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#include "FreeRTOS.h" +#include "task.h" +#include "croutine.h" + +/* Remove the whole file is co-routines are not being used. */ +#if( configUSE_CO_ROUTINES != 0 ) + +/* + * Some kernel aware debuggers require data to be viewed to be global, rather + * than file scope. + */ +#ifdef portREMOVE_STATIC_QUALIFIER + #define static +#endif + + +/* Lists for ready and blocked co-routines. --------------------*/ +static List_t pxReadyCoRoutineLists[ configMAX_CO_ROUTINE_PRIORITIES ]; /*< Prioritised ready co-routines. */ +static List_t xDelayedCoRoutineList1; /*< Delayed co-routines. */ +static List_t xDelayedCoRoutineList2; /*< Delayed co-routines (two lists are used - one for delays that have overflowed the current tick count. */ +static List_t * pxDelayedCoRoutineList; /*< Points to the delayed co-routine list currently being used. */ +static List_t * pxOverflowDelayedCoRoutineList; /*< Points to the delayed co-routine list currently being used to hold co-routines that have overflowed the current tick count. */ +static List_t xPendingReadyCoRoutineList; /*< Holds co-routines that have been readied by an external event. They cannot be added directly to the ready lists as the ready lists cannot be accessed by interrupts. */ + +/* Other file private variables. --------------------------------*/ +CRCB_t * pxCurrentCoRoutine = NULL; +static UBaseType_t uxTopCoRoutineReadyPriority = 0; +static TickType_t xCoRoutineTickCount = 0, xLastTickCount = 0, xPassedTicks = 0; + +/* The initial state of the co-routine when it is created. */ +#define corINITIAL_STATE ( 0 ) + +/* + * Place the co-routine represented by pxCRCB into the appropriate ready queue + * for the priority. It is inserted at the end of the list. + * + * This macro accesses the co-routine ready lists and therefore must not be + * used from within an ISR. + */ +#define prvAddCoRoutineToReadyQueue( pxCRCB ) \ +{ \ + if( pxCRCB->uxPriority > uxTopCoRoutineReadyPriority ) \ + { \ + uxTopCoRoutineReadyPriority = pxCRCB->uxPriority; \ + } \ + vListInsertEnd( ( List_t * ) &( pxReadyCoRoutineLists[ pxCRCB->uxPriority ] ), &( pxCRCB->xGenericListItem ) ); \ +} + +/* + * Utility to ready all the lists used by the scheduler. This is called + * automatically upon the creation of the first co-routine. + */ +static void prvInitialiseCoRoutineLists( void ); + +/* + * Co-routines that are readied by an interrupt cannot be placed directly into + * the ready lists (there is no mutual exclusion). Instead they are placed in + * in the pending ready list in order that they can later be moved to the ready + * list by the co-routine scheduler. + */ +static void prvCheckPendingReadyList( void ); + +/* + * Macro that looks at the list of co-routines that are currently delayed to + * see if any require waking. + * + * Co-routines are stored in the queue in the order of their wake time - + * meaning once one co-routine has been found whose timer has not expired + * we need not look any further down the list. + */ +static void prvCheckDelayedList( void ); + +/*-----------------------------------------------------------*/ + +BaseType_t xCoRoutineCreate( crCOROUTINE_CODE pxCoRoutineCode, UBaseType_t uxPriority, UBaseType_t uxIndex ) +{ +BaseType_t xReturn; +CRCB_t *pxCoRoutine; + + /* Allocate the memory that will store the co-routine control block. */ + pxCoRoutine = ( CRCB_t * ) pvPortMalloc( sizeof( CRCB_t ) ); + if( pxCoRoutine ) + { + /* If pxCurrentCoRoutine is NULL then this is the first co-routine to + be created and the co-routine data structures need initialising. */ + if( pxCurrentCoRoutine == NULL ) + { + pxCurrentCoRoutine = pxCoRoutine; + prvInitialiseCoRoutineLists(); + } + + /* Check the priority is within limits. */ + if( uxPriority >= configMAX_CO_ROUTINE_PRIORITIES ) + { + uxPriority = configMAX_CO_ROUTINE_PRIORITIES - 1; + } + + /* Fill out the co-routine control block from the function parameters. */ + pxCoRoutine->uxState = corINITIAL_STATE; + pxCoRoutine->uxPriority = uxPriority; + pxCoRoutine->uxIndex = uxIndex; + pxCoRoutine->pxCoRoutineFunction = pxCoRoutineCode; + + /* Initialise all the other co-routine control block parameters. */ + vListInitialiseItem( &( pxCoRoutine->xGenericListItem ) ); + vListInitialiseItem( &( pxCoRoutine->xEventListItem ) ); + + /* Set the co-routine control block as a link back from the ListItem_t. + This is so we can get back to the containing CRCB from a generic item + in a list. */ + listSET_LIST_ITEM_OWNER( &( pxCoRoutine->xGenericListItem ), pxCoRoutine ); + listSET_LIST_ITEM_OWNER( &( pxCoRoutine->xEventListItem ), pxCoRoutine ); + + /* Event lists are always in priority order. */ + listSET_LIST_ITEM_VALUE( &( pxCoRoutine->xEventListItem ), ( ( TickType_t ) configMAX_CO_ROUTINE_PRIORITIES - ( TickType_t ) uxPriority ) ); + + /* Now the co-routine has been initialised it can be added to the ready + list at the correct priority. */ + prvAddCoRoutineToReadyQueue( pxCoRoutine ); + + xReturn = pdPASS; + } + else + { + xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + +void vCoRoutineAddToDelayedList( TickType_t xTicksToDelay, List_t *pxEventList ) +{ +TickType_t xTimeToWake; + + /* Calculate the time to wake - this may overflow but this is + not a problem. */ + xTimeToWake = xCoRoutineTickCount + xTicksToDelay; + + /* We must remove ourselves from the ready list before adding + ourselves to the blocked list as the same list item is used for + both lists. */ + ( void ) uxListRemove( ( ListItem_t * ) &( pxCurrentCoRoutine->xGenericListItem ) ); + + /* The list item will be inserted in wake time order. */ + listSET_LIST_ITEM_VALUE( &( pxCurrentCoRoutine->xGenericListItem ), xTimeToWake ); + + if( xTimeToWake < xCoRoutineTickCount ) + { + /* Wake time has overflowed. Place this item in the + overflow list. */ + vListInsert( ( List_t * ) pxOverflowDelayedCoRoutineList, ( ListItem_t * ) &( pxCurrentCoRoutine->xGenericListItem ) ); + } + else + { + /* The wake time has not overflowed, so we can use the + current block list. */ + vListInsert( ( List_t * ) pxDelayedCoRoutineList, ( ListItem_t * ) &( pxCurrentCoRoutine->xGenericListItem ) ); + } + + if( pxEventList ) + { + /* Also add the co-routine to an event list. If this is done then the + function must be called with interrupts disabled. */ + vListInsert( pxEventList, &( pxCurrentCoRoutine->xEventListItem ) ); + } +} +/*-----------------------------------------------------------*/ + +static void prvCheckPendingReadyList( void ) +{ + /* Are there any co-routines waiting to get moved to the ready list? These + are co-routines that have been readied by an ISR. The ISR cannot access + the ready lists itself. */ + while( listLIST_IS_EMPTY( &xPendingReadyCoRoutineList ) == pdFALSE ) + { + CRCB_t *pxUnblockedCRCB; + + /* The pending ready list can be accessed by an ISR. */ + portDISABLE_INTERRUPTS(); + { + pxUnblockedCRCB = ( CRCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( (&xPendingReadyCoRoutineList) ); + ( void ) uxListRemove( &( pxUnblockedCRCB->xEventListItem ) ); + } + portENABLE_INTERRUPTS(); + + ( void ) uxListRemove( &( pxUnblockedCRCB->xGenericListItem ) ); + prvAddCoRoutineToReadyQueue( pxUnblockedCRCB ); + } +} +/*-----------------------------------------------------------*/ + +static void prvCheckDelayedList( void ) +{ +CRCB_t *pxCRCB; + + xPassedTicks = xTaskGetTickCount() - xLastTickCount; + while( xPassedTicks ) + { + xCoRoutineTickCount++; + xPassedTicks--; + + /* If the tick count has overflowed we need to swap the ready lists. */ + if( xCoRoutineTickCount == 0 ) + { + List_t * pxTemp; + + /* Tick count has overflowed so we need to swap the delay lists. If there are + any items in pxDelayedCoRoutineList here then there is an error! */ + pxTemp = pxDelayedCoRoutineList; + pxDelayedCoRoutineList = pxOverflowDelayedCoRoutineList; + pxOverflowDelayedCoRoutineList = pxTemp; + } + + /* See if this tick has made a timeout expire. */ + while( listLIST_IS_EMPTY( pxDelayedCoRoutineList ) == pdFALSE ) + { + pxCRCB = ( CRCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxDelayedCoRoutineList ); + + if( xCoRoutineTickCount < listGET_LIST_ITEM_VALUE( &( pxCRCB->xGenericListItem ) ) ) + { + /* Timeout not yet expired. */ + break; + } + + portDISABLE_INTERRUPTS(); + { + /* The event could have occurred just before this critical + section. If this is the case then the generic list item will + have been moved to the pending ready list and the following + line is still valid. Also the pvContainer parameter will have + been set to NULL so the following lines are also valid. */ + ( void ) uxListRemove( &( pxCRCB->xGenericListItem ) ); + + /* Is the co-routine waiting on an event also? */ + if( pxCRCB->xEventListItem.pvContainer ) + { + ( void ) uxListRemove( &( pxCRCB->xEventListItem ) ); + } + } + portENABLE_INTERRUPTS(); + + prvAddCoRoutineToReadyQueue( pxCRCB ); + } + } + + xLastTickCount = xCoRoutineTickCount; +} +/*-----------------------------------------------------------*/ + +void vCoRoutineSchedule( void ) +{ + /* See if any co-routines readied by events need moving to the ready lists. */ + prvCheckPendingReadyList(); + + /* See if any delayed co-routines have timed out. */ + prvCheckDelayedList(); + + /* Find the highest priority queue that contains ready co-routines. */ + while( listLIST_IS_EMPTY( &( pxReadyCoRoutineLists[ uxTopCoRoutineReadyPriority ] ) ) ) + { + if( uxTopCoRoutineReadyPriority == 0 ) + { + /* No more co-routines to check. */ + return; + } + --uxTopCoRoutineReadyPriority; + } + + /* listGET_OWNER_OF_NEXT_ENTRY walks through the list, so the co-routines + of the same priority get an equal share of the processor time. */ + listGET_OWNER_OF_NEXT_ENTRY( pxCurrentCoRoutine, &( pxReadyCoRoutineLists[ uxTopCoRoutineReadyPriority ] ) ); + + /* Call the co-routine. */ + ( pxCurrentCoRoutine->pxCoRoutineFunction )( pxCurrentCoRoutine, pxCurrentCoRoutine->uxIndex ); + + return; +} +/*-----------------------------------------------------------*/ + +static void prvInitialiseCoRoutineLists( void ) +{ +UBaseType_t uxPriority; + + for( uxPriority = 0; uxPriority < configMAX_CO_ROUTINE_PRIORITIES; uxPriority++ ) + { + vListInitialise( ( List_t * ) &( pxReadyCoRoutineLists[ uxPriority ] ) ); + } + + vListInitialise( ( List_t * ) &xDelayedCoRoutineList1 ); + vListInitialise( ( List_t * ) &xDelayedCoRoutineList2 ); + vListInitialise( ( List_t * ) &xPendingReadyCoRoutineList ); + + /* Start with pxDelayedCoRoutineList using list1 and the + pxOverflowDelayedCoRoutineList using list2. */ + pxDelayedCoRoutineList = &xDelayedCoRoutineList1; + pxOverflowDelayedCoRoutineList = &xDelayedCoRoutineList2; +} +/*-----------------------------------------------------------*/ + +BaseType_t xCoRoutineRemoveFromEventList( const List_t *pxEventList ) +{ +CRCB_t *pxUnblockedCRCB; +BaseType_t xReturn; + + /* This function is called from within an interrupt. It can only access + event lists and the pending ready list. This function assumes that a + check has already been made to ensure pxEventList is not empty. */ + pxUnblockedCRCB = ( CRCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxEventList ); + ( void ) uxListRemove( &( pxUnblockedCRCB->xEventListItem ) ); + vListInsertEnd( ( List_t * ) &( xPendingReadyCoRoutineList ), &( pxUnblockedCRCB->xEventListItem ) ); + + if( pxUnblockedCRCB->uxPriority >= pxCurrentCoRoutine->uxPriority ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + + return xReturn; +} + +#endif /* configUSE_CO_ROUTINES == 0 */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/event_groups.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/event_groups.c new file mode 100644 index 0000000..15ffd64 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/event_groups.c @@ -0,0 +1,752 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* Standard includes. */ +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining +all the API functions to use the MPU wrappers. That should only be done when +task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* FreeRTOS includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "timers.h" +#include "event_groups.h" + +/* Lint e961 and e750 are suppressed as a MISRA exception justified because the +MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined for the +header files above, but not in this file, in order to generate the correct +privileged Vs unprivileged linkage and placement. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750. */ + +/* The following bit fields convey control information in a task's event list +item value. It is important they don't clash with the +taskEVENT_LIST_ITEM_VALUE_IN_USE definition. */ +#if configUSE_16_BIT_TICKS == 1 + #define eventCLEAR_EVENTS_ON_EXIT_BIT 0x0100U + #define eventUNBLOCKED_DUE_TO_BIT_SET 0x0200U + #define eventWAIT_FOR_ALL_BITS 0x0400U + #define eventEVENT_BITS_CONTROL_BYTES 0xff00U +#else + #define eventCLEAR_EVENTS_ON_EXIT_BIT 0x01000000UL + #define eventUNBLOCKED_DUE_TO_BIT_SET 0x02000000UL + #define eventWAIT_FOR_ALL_BITS 0x04000000UL + #define eventEVENT_BITS_CONTROL_BYTES 0xff000000UL +#endif + +typedef struct xEventGroupDefinition +{ + EventBits_t uxEventBits; + List_t xTasksWaitingForBits; /*< List of tasks waiting for a bit to be set. */ + + #if( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxEventGroupNumber; + #endif + + #if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + uint8_t ucStaticallyAllocated; /*< Set to pdTRUE if the event group is statically allocated to ensure no attempt is made to free the memory. */ + #endif +} EventGroup_t; + +/*-----------------------------------------------------------*/ + +/* + * Test the bits set in uxCurrentEventBits to see if the wait condition is met. + * The wait condition is defined by xWaitForAllBits. If xWaitForAllBits is + * pdTRUE then the wait condition is met if all the bits set in uxBitsToWaitFor + * are also set in uxCurrentEventBits. If xWaitForAllBits is pdFALSE then the + * wait condition is met if any of the bits set in uxBitsToWait for are also set + * in uxCurrentEventBits. + */ +static BaseType_t prvTestWaitCondition( const EventBits_t uxCurrentEventBits, const EventBits_t uxBitsToWaitFor, const BaseType_t xWaitForAllBits ) PRIVILEGED_FUNCTION; + +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + + EventGroupHandle_t xEventGroupCreateStatic( StaticEventGroup_t *pxEventGroupBuffer ) + { + EventGroup_t *pxEventBits; + + /* A StaticEventGroup_t object must be provided. */ + configASSERT( pxEventGroupBuffer ); + + /* The user has provided a statically allocated event group - use it. */ + pxEventBits = ( EventGroup_t * ) pxEventGroupBuffer; /*lint !e740 EventGroup_t and StaticEventGroup_t are guaranteed to have the same size and alignment requirement - checked by configASSERT(). */ + + if( pxEventBits != NULL ) + { + pxEventBits->uxEventBits = 0; + vListInitialise( &( pxEventBits->xTasksWaitingForBits ) ); + + #if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + { + /* Both static and dynamic allocation can be used, so note that + this event group was created statically in case the event group + is later deleted. */ + pxEventBits->ucStaticallyAllocated = pdTRUE; + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ + + traceEVENT_GROUP_CREATE( pxEventBits ); + } + else + { + traceEVENT_GROUP_CREATE_FAILED(); + } + + return ( EventGroupHandle_t ) pxEventBits; + } + +#endif /* configSUPPORT_STATIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + + EventGroupHandle_t xEventGroupCreate( void ) + { + EventGroup_t *pxEventBits; + + /* Allocate the event group. */ + pxEventBits = ( EventGroup_t * ) pvPortMalloc( sizeof( EventGroup_t ) ); + + if( pxEventBits != NULL ) + { + pxEventBits->uxEventBits = 0; + vListInitialise( &( pxEventBits->xTasksWaitingForBits ) ); + + #if( configSUPPORT_STATIC_ALLOCATION == 1 ) + { + /* Both static and dynamic allocation can be used, so note this + event group was allocated statically in case the event group is + later deleted. */ + pxEventBits->ucStaticallyAllocated = pdFALSE; + } + #endif /* configSUPPORT_STATIC_ALLOCATION */ + + traceEVENT_GROUP_CREATE( pxEventBits ); + } + else + { + traceEVENT_GROUP_CREATE_FAILED(); + } + + return ( EventGroupHandle_t ) pxEventBits; + } + +#endif /* configSUPPORT_DYNAMIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, const EventBits_t uxBitsToWaitFor, TickType_t xTicksToWait ) +{ +EventBits_t uxOriginalBitValue, uxReturn; +EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup; +BaseType_t xAlreadyYielded; +BaseType_t xTimeoutOccurred = pdFALSE; + + configASSERT( ( uxBitsToWaitFor & eventEVENT_BITS_CONTROL_BYTES ) == 0 ); + configASSERT( uxBitsToWaitFor != 0 ); + #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + { + configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); + } + #endif + + vTaskSuspendAll(); + { + uxOriginalBitValue = pxEventBits->uxEventBits; + + ( void ) xEventGroupSetBits( xEventGroup, uxBitsToSet ); + + if( ( ( uxOriginalBitValue | uxBitsToSet ) & uxBitsToWaitFor ) == uxBitsToWaitFor ) + { + /* All the rendezvous bits are now set - no need to block. */ + uxReturn = ( uxOriginalBitValue | uxBitsToSet ); + + /* Rendezvous always clear the bits. They will have been cleared + already unless this is the only task in the rendezvous. */ + pxEventBits->uxEventBits &= ~uxBitsToWaitFor; + + xTicksToWait = 0; + } + else + { + if( xTicksToWait != ( TickType_t ) 0 ) + { + traceEVENT_GROUP_SYNC_BLOCK( xEventGroup, uxBitsToSet, uxBitsToWaitFor ); + + /* Store the bits that the calling task is waiting for in the + task's event list item so the kernel knows when a match is + found. Then enter the blocked state. */ + vTaskPlaceOnUnorderedEventList( &( pxEventBits->xTasksWaitingForBits ), ( uxBitsToWaitFor | eventCLEAR_EVENTS_ON_EXIT_BIT | eventWAIT_FOR_ALL_BITS ), xTicksToWait ); + + /* This assignment is obsolete as uxReturn will get set after + the task unblocks, but some compilers mistakenly generate a + warning about uxReturn being returned without being set if the + assignment is omitted. */ + uxReturn = 0; + } + else + { + /* The rendezvous bits were not set, but no block time was + specified - just return the current event bit value. */ + uxReturn = pxEventBits->uxEventBits; + } + } + } + xAlreadyYielded = xTaskResumeAll(); + + if( xTicksToWait != ( TickType_t ) 0 ) + { + if( xAlreadyYielded == pdFALSE ) + { + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* The task blocked to wait for its required bits to be set - at this + point either the required bits were set or the block time expired. If + the required bits were set they will have been stored in the task's + event list item, and they should now be retrieved then cleared. */ + uxReturn = uxTaskResetEventItemValue(); + + if( ( uxReturn & eventUNBLOCKED_DUE_TO_BIT_SET ) == ( EventBits_t ) 0 ) + { + /* The task timed out, just return the current event bit value. */ + taskENTER_CRITICAL(); + { + uxReturn = pxEventBits->uxEventBits; + + /* Although the task got here because it timed out before the + bits it was waiting for were set, it is possible that since it + unblocked another task has set the bits. If this is the case + then it needs to clear the bits before exiting. */ + if( ( uxReturn & uxBitsToWaitFor ) == uxBitsToWaitFor ) + { + pxEventBits->uxEventBits &= ~uxBitsToWaitFor; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + + xTimeoutOccurred = pdTRUE; + } + else + { + /* The task unblocked because the bits were set. */ + } + + /* Control bits might be set as the task had blocked should not be + returned. */ + uxReturn &= ~eventEVENT_BITS_CONTROL_BYTES; + } + + traceEVENT_GROUP_SYNC_END( xEventGroup, uxBitsToSet, uxBitsToWaitFor, xTimeoutOccurred ); + + return uxReturn; +} +/*-----------------------------------------------------------*/ + +EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToWaitFor, const BaseType_t xClearOnExit, const BaseType_t xWaitForAllBits, TickType_t xTicksToWait ) +{ +EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup; +EventBits_t uxReturn, uxControlBits = 0; +BaseType_t xWaitConditionMet, xAlreadyYielded; +BaseType_t xTimeoutOccurred = pdFALSE; + + /* Check the user is not attempting to wait on the bits used by the kernel + itself, and that at least one bit is being requested. */ + configASSERT( xEventGroup ); + configASSERT( ( uxBitsToWaitFor & eventEVENT_BITS_CONTROL_BYTES ) == 0 ); + configASSERT( uxBitsToWaitFor != 0 ); + #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + { + configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); + } + #endif + + vTaskSuspendAll(); + { + const EventBits_t uxCurrentEventBits = pxEventBits->uxEventBits; + + /* Check to see if the wait condition is already met or not. */ + xWaitConditionMet = prvTestWaitCondition( uxCurrentEventBits, uxBitsToWaitFor, xWaitForAllBits ); + + if( xWaitConditionMet != pdFALSE ) + { + /* The wait condition has already been met so there is no need to + block. */ + uxReturn = uxCurrentEventBits; + xTicksToWait = ( TickType_t ) 0; + + /* Clear the wait bits if requested to do so. */ + if( xClearOnExit != pdFALSE ) + { + pxEventBits->uxEventBits &= ~uxBitsToWaitFor; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else if( xTicksToWait == ( TickType_t ) 0 ) + { + /* The wait condition has not been met, but no block time was + specified, so just return the current value. */ + uxReturn = uxCurrentEventBits; + } + else + { + /* The task is going to block to wait for its required bits to be + set. uxControlBits are used to remember the specified behaviour of + this call to xEventGroupWaitBits() - for use when the event bits + unblock the task. */ + if( xClearOnExit != pdFALSE ) + { + uxControlBits |= eventCLEAR_EVENTS_ON_EXIT_BIT; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( xWaitForAllBits != pdFALSE ) + { + uxControlBits |= eventWAIT_FOR_ALL_BITS; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Store the bits that the calling task is waiting for in the + task's event list item so the kernel knows when a match is + found. Then enter the blocked state. */ + vTaskPlaceOnUnorderedEventList( &( pxEventBits->xTasksWaitingForBits ), ( uxBitsToWaitFor | uxControlBits ), xTicksToWait ); + + /* This is obsolete as it will get set after the task unblocks, but + some compilers mistakenly generate a warning about the variable + being returned without being set if it is not done. */ + uxReturn = 0; + + traceEVENT_GROUP_WAIT_BITS_BLOCK( xEventGroup, uxBitsToWaitFor ); + } + } + xAlreadyYielded = xTaskResumeAll(); + + if( xTicksToWait != ( TickType_t ) 0 ) + { + if( xAlreadyYielded == pdFALSE ) + { + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* The task blocked to wait for its required bits to be set - at this + point either the required bits were set or the block time expired. If + the required bits were set they will have been stored in the task's + event list item, and they should now be retrieved then cleared. */ + uxReturn = uxTaskResetEventItemValue(); + + if( ( uxReturn & eventUNBLOCKED_DUE_TO_BIT_SET ) == ( EventBits_t ) 0 ) + { + taskENTER_CRITICAL(); + { + /* The task timed out, just return the current event bit value. */ + uxReturn = pxEventBits->uxEventBits; + + /* It is possible that the event bits were updated between this + task leaving the Blocked state and running again. */ + if( prvTestWaitCondition( uxReturn, uxBitsToWaitFor, xWaitForAllBits ) != pdFALSE ) + { + if( xClearOnExit != pdFALSE ) + { + pxEventBits->uxEventBits &= ~uxBitsToWaitFor; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + + /* Prevent compiler warnings when trace macros are not used. */ + xTimeoutOccurred = pdFALSE; + } + else + { + /* The task unblocked because the bits were set. */ + } + + /* The task blocked so control bits may have been set. */ + uxReturn &= ~eventEVENT_BITS_CONTROL_BYTES; + } + traceEVENT_GROUP_WAIT_BITS_END( xEventGroup, uxBitsToWaitFor, xTimeoutOccurred ); + + return uxReturn; +} +/*-----------------------------------------------------------*/ + +EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear ) +{ +EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup; +EventBits_t uxReturn; + + /* Check the user is not attempting to clear the bits used by the kernel + itself. */ + configASSERT( xEventGroup ); + configASSERT( ( uxBitsToClear & eventEVENT_BITS_CONTROL_BYTES ) == 0 ); + + taskENTER_CRITICAL(); + { + traceEVENT_GROUP_CLEAR_BITS( xEventGroup, uxBitsToClear ); + + /* The value returned is the event group value prior to the bits being + cleared. */ + uxReturn = pxEventBits->uxEventBits; + + /* Clear the bits. */ + pxEventBits->uxEventBits &= ~uxBitsToClear; + } + taskEXIT_CRITICAL(); + + return uxReturn; +} +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 1 ) ) + + BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear ) + { + BaseType_t xReturn; + + traceEVENT_GROUP_CLEAR_BITS_FROM_ISR( xEventGroup, uxBitsToClear ); + xReturn = xTimerPendFunctionCallFromISR( vEventGroupClearBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToClear, NULL ); + + return xReturn; + } + +#endif +/*-----------------------------------------------------------*/ + +EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup ) +{ +UBaseType_t uxSavedInterruptStatus; +EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup; +EventBits_t uxReturn; + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + uxReturn = pxEventBits->uxEventBits; + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return uxReturn; +} +/*-----------------------------------------------------------*/ + +EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet ) +{ +ListItem_t *pxListItem, *pxNext; +ListItem_t const *pxListEnd; +List_t *pxList; +EventBits_t uxBitsToClear = 0, uxBitsWaitedFor, uxControlBits; +EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup; +BaseType_t xMatchFound = pdFALSE; + + /* Check the user is not attempting to set the bits used by the kernel + itself. */ + configASSERT( xEventGroup ); + configASSERT( ( uxBitsToSet & eventEVENT_BITS_CONTROL_BYTES ) == 0 ); + + pxList = &( pxEventBits->xTasksWaitingForBits ); + pxListEnd = listGET_END_MARKER( pxList ); /*lint !e826 !e740 The mini list structure is used as the list end to save RAM. This is checked and valid. */ + vTaskSuspendAll(); + { + traceEVENT_GROUP_SET_BITS( xEventGroup, uxBitsToSet ); + + pxListItem = listGET_HEAD_ENTRY( pxList ); + + /* Set the bits. */ + pxEventBits->uxEventBits |= uxBitsToSet; + + /* See if the new bit value should unblock any tasks. */ + while( pxListItem != pxListEnd ) + { + pxNext = listGET_NEXT( pxListItem ); + uxBitsWaitedFor = listGET_LIST_ITEM_VALUE( pxListItem ); + xMatchFound = pdFALSE; + + /* Split the bits waited for from the control bits. */ + uxControlBits = uxBitsWaitedFor & eventEVENT_BITS_CONTROL_BYTES; + uxBitsWaitedFor &= ~eventEVENT_BITS_CONTROL_BYTES; + + if( ( uxControlBits & eventWAIT_FOR_ALL_BITS ) == ( EventBits_t ) 0 ) + { + /* Just looking for single bit being set. */ + if( ( uxBitsWaitedFor & pxEventBits->uxEventBits ) != ( EventBits_t ) 0 ) + { + xMatchFound = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else if( ( uxBitsWaitedFor & pxEventBits->uxEventBits ) == uxBitsWaitedFor ) + { + /* All bits are set. */ + xMatchFound = pdTRUE; + } + else + { + /* Need all bits to be set, but not all the bits were set. */ + } + + if( xMatchFound != pdFALSE ) + { + /* The bits match. Should the bits be cleared on exit? */ + if( ( uxControlBits & eventCLEAR_EVENTS_ON_EXIT_BIT ) != ( EventBits_t ) 0 ) + { + uxBitsToClear |= uxBitsWaitedFor; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Store the actual event flag value in the task's event list + item before removing the task from the event list. The + eventUNBLOCKED_DUE_TO_BIT_SET bit is set so the task knows + that is was unblocked due to its required bits matching, rather + than because it timed out. */ + ( void ) xTaskRemoveFromUnorderedEventList( pxListItem, pxEventBits->uxEventBits | eventUNBLOCKED_DUE_TO_BIT_SET ); + } + + /* Move onto the next list item. Note pxListItem->pxNext is not + used here as the list item may have been removed from the event list + and inserted into the ready/pending reading list. */ + pxListItem = pxNext; + } + + /* Clear any bits that matched when the eventCLEAR_EVENTS_ON_EXIT_BIT + bit was set in the control word. */ + pxEventBits->uxEventBits &= ~uxBitsToClear; + } + ( void ) xTaskResumeAll(); + + return pxEventBits->uxEventBits; +} +/*-----------------------------------------------------------*/ + +void vEventGroupDelete( EventGroupHandle_t xEventGroup ) +{ +EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup; +const List_t *pxTasksWaitingForBits = &( pxEventBits->xTasksWaitingForBits ); + + vTaskSuspendAll(); + { + traceEVENT_GROUP_DELETE( xEventGroup ); + + while( listCURRENT_LIST_LENGTH( pxTasksWaitingForBits ) > ( UBaseType_t ) 0 ) + { + /* Unblock the task, returning 0 as the event list is being deleted + and cannot therefore have any bits set. */ + configASSERT( pxTasksWaitingForBits->xListEnd.pxNext != ( ListItem_t * ) &( pxTasksWaitingForBits->xListEnd ) ); + ( void ) xTaskRemoveFromUnorderedEventList( pxTasksWaitingForBits->xListEnd.pxNext, eventUNBLOCKED_DUE_TO_BIT_SET ); + } + + #if( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 0 ) ) + { + /* The event group can only have been allocated dynamically - free + it again. */ + vPortFree( pxEventBits ); + } + #elif( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + { + /* The event group could have been allocated statically or + dynamically, so check before attempting to free the memory. */ + if( pxEventBits->ucStaticallyAllocated == ( uint8_t ) pdFALSE ) + { + vPortFree( pxEventBits ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ + } + ( void ) xTaskResumeAll(); +} +/*-----------------------------------------------------------*/ + +/* For internal use only - execute a 'set bits' command that was pended from +an interrupt. */ +void vEventGroupSetBitsCallback( void *pvEventGroup, const uint32_t ulBitsToSet ) +{ + ( void ) xEventGroupSetBits( pvEventGroup, ( EventBits_t ) ulBitsToSet ); +} +/*-----------------------------------------------------------*/ + +/* For internal use only - execute a 'clear bits' command that was pended from +an interrupt. */ +void vEventGroupClearBitsCallback( void *pvEventGroup, const uint32_t ulBitsToClear ) +{ + ( void ) xEventGroupClearBits( pvEventGroup, ( EventBits_t ) ulBitsToClear ); +} +/*-----------------------------------------------------------*/ + +static BaseType_t prvTestWaitCondition( const EventBits_t uxCurrentEventBits, const EventBits_t uxBitsToWaitFor, const BaseType_t xWaitForAllBits ) +{ +BaseType_t xWaitConditionMet = pdFALSE; + + if( xWaitForAllBits == pdFALSE ) + { + /* Task only has to wait for one bit within uxBitsToWaitFor to be + set. Is one already set? */ + if( ( uxCurrentEventBits & uxBitsToWaitFor ) != ( EventBits_t ) 0 ) + { + xWaitConditionMet = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* Task has to wait for all the bits in uxBitsToWaitFor to be set. + Are they set already? */ + if( ( uxCurrentEventBits & uxBitsToWaitFor ) == uxBitsToWaitFor ) + { + xWaitConditionMet = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + return xWaitConditionMet; +} +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 1 ) ) + + BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, BaseType_t *pxHigherPriorityTaskWoken ) + { + BaseType_t xReturn; + + traceEVENT_GROUP_SET_BITS_FROM_ISR( xEventGroup, uxBitsToSet ); + xReturn = xTimerPendFunctionCallFromISR( vEventGroupSetBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToSet, pxHigherPriorityTaskWoken ); + + return xReturn; + } + +#endif +/*-----------------------------------------------------------*/ + +#if (configUSE_TRACE_FACILITY == 1) + + UBaseType_t uxEventGroupGetNumber( void* xEventGroup ) + { + UBaseType_t xReturn; + EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup; + + if( xEventGroup == NULL ) + { + xReturn = 0; + } + else + { + xReturn = pxEventBits->uxEventGroupNumber; + } + + return xReturn; + } + +#endif + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/include/FreeRTOS.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/include/FreeRTOS.h new file mode 100644 index 0000000..c26bbee --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/include/FreeRTOS.h @@ -0,0 +1,1063 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef INC_FREERTOS_H +#define INC_FREERTOS_H + +/* + * Include the generic headers required for the FreeRTOS port being used. + */ +#include + +/* + * If stdint.h cannot be located then: + * + If using GCC ensure the -nostdint options is *not* being used. + * + Ensure the project's include path includes the directory in which your + * compiler stores stdint.h. + * + Set any compiler options necessary for it to support C99, as technically + * stdint.h is only mandatory with C99 (FreeRTOS does not require C99 in any + * other way). + * + The FreeRTOS download includes a simple stdint.h definition that can be + * used in cases where none is provided by the compiler. The files only + * contains the typedefs required to build FreeRTOS. Read the instructions + * in FreeRTOS/source/stdint.readme for more information. + */ +#include /* READ COMMENT ABOVE. */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Application specific configuration options. */ +#include "FreeRTOSConfig.h" + +/* Basic FreeRTOS definitions. */ +#include "projdefs.h" + +/* Definitions specific to the port being used. */ +#include "portable.h" + +/* Must be defaulted before configUSE_NEWLIB_REENTRANT is used below. */ +#ifndef configUSE_NEWLIB_REENTRANT + #define configUSE_NEWLIB_REENTRANT 0 +#endif + +/* Required if struct _reent is used. */ +#if ( configUSE_NEWLIB_REENTRANT == 1 ) + #include +#endif +/* + * Check all the required application specific macros have been defined. + * These macros are application specific and (as downloaded) are defined + * within FreeRTOSConfig.h. + */ + +#ifndef configMINIMAL_STACK_SIZE + #error Missing definition: configMINIMAL_STACK_SIZE must be defined in FreeRTOSConfig.h. configMINIMAL_STACK_SIZE defines the size (in words) of the stack allocated to the idle task. Refer to the demo project provided for your port for a suitable value. +#endif + +#ifndef configMAX_PRIORITIES + #error Missing definition: configMAX_PRIORITIES must be defined in FreeRTOSConfig.h. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef configUSE_PREEMPTION + #error Missing definition: configUSE_PREEMPTION must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef configUSE_IDLE_HOOK + #error Missing definition: configUSE_IDLE_HOOK must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef configUSE_TICK_HOOK + #error Missing definition: configUSE_TICK_HOOK must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef configUSE_16_BIT_TICKS + #error Missing definition: configUSE_16_BIT_TICKS must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef configMAX_PRIORITIES + #error configMAX_PRIORITIES must be defined to be greater than or equal to 1. +#endif + +#ifndef configUSE_CO_ROUTINES + #define configUSE_CO_ROUTINES 0 +#endif + +#ifndef INCLUDE_vTaskPrioritySet + #define INCLUDE_vTaskPrioritySet 0 +#endif + +#ifndef INCLUDE_uxTaskPriorityGet + #define INCLUDE_uxTaskPriorityGet 0 +#endif + +#ifndef INCLUDE_vTaskDelete + #define INCLUDE_vTaskDelete 0 +#endif + +#ifndef INCLUDE_vTaskSuspend + #define INCLUDE_vTaskSuspend 0 +#endif + +#ifndef INCLUDE_vTaskDelayUntil + #define INCLUDE_vTaskDelayUntil 0 +#endif + +#ifndef INCLUDE_vTaskDelay + #define INCLUDE_vTaskDelay 0 +#endif + +#ifndef INCLUDE_xTaskGetIdleTaskHandle + #define INCLUDE_xTaskGetIdleTaskHandle 0 +#endif + +#ifndef INCLUDE_xTaskAbortDelay + #define INCLUDE_xTaskAbortDelay 0 +#endif + +#ifndef INCLUDE_xQueueGetMutexHolder + #define INCLUDE_xQueueGetMutexHolder 0 +#endif + +#ifndef INCLUDE_xSemaphoreGetMutexHolder + #define INCLUDE_xSemaphoreGetMutexHolder INCLUDE_xQueueGetMutexHolder +#endif + +#ifndef INCLUDE_xTaskGetHandle + #define INCLUDE_xTaskGetHandle 0 +#endif + +#ifndef INCLUDE_uxTaskGetStackHighWaterMark + #define INCLUDE_uxTaskGetStackHighWaterMark 1 +#endif + +#ifndef INCLUDE_eTaskGetState + #define INCLUDE_eTaskGetState 0 +#endif + +#ifndef INCLUDE_xTaskResumeFromISR + #define INCLUDE_xTaskResumeFromISR 1 +#endif + +#ifndef INCLUDE_xTimerPendFunctionCall + #define INCLUDE_xTimerPendFunctionCall 0 +#endif + +#ifndef INCLUDE_xTaskGetSchedulerState + #define INCLUDE_xTaskGetSchedulerState 0 +#endif + +#ifndef INCLUDE_xTaskGetCurrentTaskHandle + #define INCLUDE_xTaskGetCurrentTaskHandle 0 +#endif + +#if configUSE_CO_ROUTINES != 0 + #ifndef configMAX_CO_ROUTINE_PRIORITIES + #error configMAX_CO_ROUTINE_PRIORITIES must be greater than or equal to 1. + #endif +#endif + +#ifndef configUSE_DAEMON_TASK_STARTUP_HOOK + #define configUSE_DAEMON_TASK_STARTUP_HOOK 0 +#endif + +#ifndef configUSE_APPLICATION_TASK_TAG + #define configUSE_APPLICATION_TASK_TAG 0 +#endif + +#ifndef configNUM_THREAD_LOCAL_STORAGE_POINTERS + #define configNUM_THREAD_LOCAL_STORAGE_POINTERS 0 +#endif + +#ifndef configUSE_RECURSIVE_MUTEXES + #define configUSE_RECURSIVE_MUTEXES 0 +#endif + +#ifndef configUSE_MUTEXES + #define configUSE_MUTEXES 0 +#endif + +#ifndef configUSE_TIMERS + #define configUSE_TIMERS 0 +#endif + +#ifndef configUSE_COUNTING_SEMAPHORES + #define configUSE_COUNTING_SEMAPHORES 0 +#endif + +#ifndef configUSE_ALTERNATIVE_API + #define configUSE_ALTERNATIVE_API 0 +#endif + +#ifndef portCRITICAL_NESTING_IN_TCB + #define portCRITICAL_NESTING_IN_TCB 0 +#endif + +#ifndef configMAX_TASK_NAME_LEN + #define configMAX_TASK_NAME_LEN 16 +#endif + +#ifndef configIDLE_SHOULD_YIELD + #define configIDLE_SHOULD_YIELD 1 +#endif + +#if configMAX_TASK_NAME_LEN < 1 + #error configMAX_TASK_NAME_LEN must be set to a minimum of 1 in FreeRTOSConfig.h +#endif + +#ifndef configASSERT + #define configASSERT( x ) + #define configASSERT_DEFINED 0 +#else + #define configASSERT_DEFINED 1 +#endif + +/* The timers module relies on xTaskGetSchedulerState(). */ +#if configUSE_TIMERS == 1 + + #ifndef configTIMER_TASK_PRIORITY + #error If configUSE_TIMERS is set to 1 then configTIMER_TASK_PRIORITY must also be defined. + #endif /* configTIMER_TASK_PRIORITY */ + + #ifndef configTIMER_QUEUE_LENGTH + #error If configUSE_TIMERS is set to 1 then configTIMER_QUEUE_LENGTH must also be defined. + #endif /* configTIMER_QUEUE_LENGTH */ + + #ifndef configTIMER_TASK_STACK_DEPTH + #error If configUSE_TIMERS is set to 1 then configTIMER_TASK_STACK_DEPTH must also be defined. + #endif /* configTIMER_TASK_STACK_DEPTH */ + +#endif /* configUSE_TIMERS */ + +#ifndef portSET_INTERRUPT_MASK_FROM_ISR + #define portSET_INTERRUPT_MASK_FROM_ISR() 0 +#endif + +#ifndef portCLEAR_INTERRUPT_MASK_FROM_ISR + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedStatusValue ) ( void ) uxSavedStatusValue +#endif + +#ifndef portCLEAN_UP_TCB + #define portCLEAN_UP_TCB( pxTCB ) ( void ) pxTCB +#endif + +#ifndef portPRE_TASK_DELETE_HOOK + #define portPRE_TASK_DELETE_HOOK( pvTaskToDelete, pxYieldPending ) +#endif + +#ifndef portSETUP_TCB + #define portSETUP_TCB( pxTCB ) ( void ) pxTCB +#endif + +#ifndef configQUEUE_REGISTRY_SIZE + #define configQUEUE_REGISTRY_SIZE 0U +#endif + +#if ( configQUEUE_REGISTRY_SIZE < 1 ) + #define vQueueAddToRegistry( xQueue, pcName ) + #define vQueueUnregisterQueue( xQueue ) + #define pcQueueGetName( xQueue ) +#endif + +#ifndef portPOINTER_SIZE_TYPE + #define portPOINTER_SIZE_TYPE uint32_t +#endif + +/* Remove any unused trace macros. */ +#ifndef traceSTART + /* Used to perform any necessary initialisation - for example, open a file + into which trace is to be written. */ + #define traceSTART() +#endif + +#ifndef traceEND + /* Use to close a trace, for example close a file into which trace has been + written. */ + #define traceEND() +#endif + +#ifndef traceTASK_SWITCHED_IN + /* Called after a task has been selected to run. pxCurrentTCB holds a pointer + to the task control block of the selected task. */ + #define traceTASK_SWITCHED_IN() +#endif + +#ifndef traceINCREASE_TICK_COUNT + /* Called before stepping the tick count after waking from tickless idle + sleep. */ + #define traceINCREASE_TICK_COUNT( x ) +#endif + +#ifndef traceLOW_POWER_IDLE_BEGIN + /* Called immediately before entering tickless idle. */ + #define traceLOW_POWER_IDLE_BEGIN() +#endif + +#ifndef traceLOW_POWER_IDLE_END + /* Called when returning to the Idle task after a tickless idle. */ + #define traceLOW_POWER_IDLE_END() +#endif + +#ifndef traceTASK_SWITCHED_OUT + /* Called before a task has been selected to run. pxCurrentTCB holds a pointer + to the task control block of the task being switched out. */ + #define traceTASK_SWITCHED_OUT() +#endif + +#ifndef traceTASK_PRIORITY_INHERIT + /* Called when a task attempts to take a mutex that is already held by a + lower priority task. pxTCBOfMutexHolder is a pointer to the TCB of the task + that holds the mutex. uxInheritedPriority is the priority the mutex holder + will inherit (the priority of the task that is attempting to obtain the + muted. */ + #define traceTASK_PRIORITY_INHERIT( pxTCBOfMutexHolder, uxInheritedPriority ) +#endif + +#ifndef traceTASK_PRIORITY_DISINHERIT + /* Called when a task releases a mutex, the holding of which had resulted in + the task inheriting the priority of a higher priority task. + pxTCBOfMutexHolder is a pointer to the TCB of the task that is releasing the + mutex. uxOriginalPriority is the task's configured (base) priority. */ + #define traceTASK_PRIORITY_DISINHERIT( pxTCBOfMutexHolder, uxOriginalPriority ) +#endif + +#ifndef traceBLOCKING_ON_QUEUE_RECEIVE + /* Task is about to block because it cannot read from a + queue/mutex/semaphore. pxQueue is a pointer to the queue/mutex/semaphore + upon which the read was attempted. pxCurrentTCB points to the TCB of the + task that attempted the read. */ + #define traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue ) +#endif + +#ifndef traceBLOCKING_ON_QUEUE_SEND + /* Task is about to block because it cannot write to a + queue/mutex/semaphore. pxQueue is a pointer to the queue/mutex/semaphore + upon which the write was attempted. pxCurrentTCB points to the TCB of the + task that attempted the write. */ + #define traceBLOCKING_ON_QUEUE_SEND( pxQueue ) +#endif + +#ifndef configCHECK_FOR_STACK_OVERFLOW + #define configCHECK_FOR_STACK_OVERFLOW 0 +#endif + +/* The following event macros are embedded in the kernel API calls. */ + +#ifndef traceMOVED_TASK_TO_READY_STATE + #define traceMOVED_TASK_TO_READY_STATE( pxTCB ) +#endif + +#ifndef tracePOST_MOVED_TASK_TO_READY_STATE + #define tracePOST_MOVED_TASK_TO_READY_STATE( pxTCB ) +#endif + +#ifndef traceQUEUE_CREATE + #define traceQUEUE_CREATE( pxNewQueue ) +#endif + +#ifndef traceQUEUE_CREATE_FAILED + #define traceQUEUE_CREATE_FAILED( ucQueueType ) +#endif + +#ifndef traceCREATE_MUTEX + #define traceCREATE_MUTEX( pxNewQueue ) +#endif + +#ifndef traceCREATE_MUTEX_FAILED + #define traceCREATE_MUTEX_FAILED() +#endif + +#ifndef traceGIVE_MUTEX_RECURSIVE + #define traceGIVE_MUTEX_RECURSIVE( pxMutex ) +#endif + +#ifndef traceGIVE_MUTEX_RECURSIVE_FAILED + #define traceGIVE_MUTEX_RECURSIVE_FAILED( pxMutex ) +#endif + +#ifndef traceTAKE_MUTEX_RECURSIVE + #define traceTAKE_MUTEX_RECURSIVE( pxMutex ) +#endif + +#ifndef traceTAKE_MUTEX_RECURSIVE_FAILED + #define traceTAKE_MUTEX_RECURSIVE_FAILED( pxMutex ) +#endif + +#ifndef traceCREATE_COUNTING_SEMAPHORE + #define traceCREATE_COUNTING_SEMAPHORE() +#endif + +#ifndef traceCREATE_COUNTING_SEMAPHORE_FAILED + #define traceCREATE_COUNTING_SEMAPHORE_FAILED() +#endif + +#ifndef traceQUEUE_SEND + #define traceQUEUE_SEND( pxQueue ) +#endif + +#ifndef traceQUEUE_SEND_FAILED + #define traceQUEUE_SEND_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_RECEIVE + #define traceQUEUE_RECEIVE( pxQueue ) +#endif + +#ifndef traceQUEUE_PEEK + #define traceQUEUE_PEEK( pxQueue ) +#endif + +#ifndef traceQUEUE_PEEK_FROM_ISR + #define traceQUEUE_PEEK_FROM_ISR( pxQueue ) +#endif + +#ifndef traceQUEUE_RECEIVE_FAILED + #define traceQUEUE_RECEIVE_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_SEND_FROM_ISR + #define traceQUEUE_SEND_FROM_ISR( pxQueue ) +#endif + +#ifndef traceQUEUE_SEND_FROM_ISR_FAILED + #define traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_RECEIVE_FROM_ISR + #define traceQUEUE_RECEIVE_FROM_ISR( pxQueue ) +#endif + +#ifndef traceQUEUE_RECEIVE_FROM_ISR_FAILED + #define traceQUEUE_RECEIVE_FROM_ISR_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_PEEK_FROM_ISR_FAILED + #define traceQUEUE_PEEK_FROM_ISR_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_DELETE + #define traceQUEUE_DELETE( pxQueue ) +#endif + +#ifndef traceTASK_CREATE + #define traceTASK_CREATE( pxNewTCB ) +#endif + +#ifndef traceTASK_CREATE_FAILED + #define traceTASK_CREATE_FAILED() +#endif + +#ifndef traceTASK_DELETE + #define traceTASK_DELETE( pxTaskToDelete ) +#endif + +#ifndef traceTASK_DELAY_UNTIL + #define traceTASK_DELAY_UNTIL( x ) +#endif + +#ifndef traceTASK_DELAY + #define traceTASK_DELAY() +#endif + +#ifndef traceTASK_PRIORITY_SET + #define traceTASK_PRIORITY_SET( pxTask, uxNewPriority ) +#endif + +#ifndef traceTASK_SUSPEND + #define traceTASK_SUSPEND( pxTaskToSuspend ) +#endif + +#ifndef traceTASK_RESUME + #define traceTASK_RESUME( pxTaskToResume ) +#endif + +#ifndef traceTASK_RESUME_FROM_ISR + #define traceTASK_RESUME_FROM_ISR( pxTaskToResume ) +#endif + +#ifndef traceTASK_INCREMENT_TICK + #define traceTASK_INCREMENT_TICK( xTickCount ) +#endif + +#ifndef traceTIMER_CREATE + #define traceTIMER_CREATE( pxNewTimer ) +#endif + +#ifndef traceTIMER_CREATE_FAILED + #define traceTIMER_CREATE_FAILED() +#endif + +#ifndef traceTIMER_COMMAND_SEND + #define traceTIMER_COMMAND_SEND( xTimer, xMessageID, xMessageValueValue, xReturn ) +#endif + +#ifndef traceTIMER_EXPIRED + #define traceTIMER_EXPIRED( pxTimer ) +#endif + +#ifndef traceTIMER_COMMAND_RECEIVED + #define traceTIMER_COMMAND_RECEIVED( pxTimer, xMessageID, xMessageValue ) +#endif + +#ifndef traceMALLOC + #define traceMALLOC( pvAddress, uiSize ) +#endif + +#ifndef traceFREE + #define traceFREE( pvAddress, uiSize ) +#endif + +#ifndef traceEVENT_GROUP_CREATE + #define traceEVENT_GROUP_CREATE( xEventGroup ) +#endif + +#ifndef traceEVENT_GROUP_CREATE_FAILED + #define traceEVENT_GROUP_CREATE_FAILED() +#endif + +#ifndef traceEVENT_GROUP_SYNC_BLOCK + #define traceEVENT_GROUP_SYNC_BLOCK( xEventGroup, uxBitsToSet, uxBitsToWaitFor ) +#endif + +#ifndef traceEVENT_GROUP_SYNC_END + #define traceEVENT_GROUP_SYNC_END( xEventGroup, uxBitsToSet, uxBitsToWaitFor, xTimeoutOccurred ) ( void ) xTimeoutOccurred +#endif + +#ifndef traceEVENT_GROUP_WAIT_BITS_BLOCK + #define traceEVENT_GROUP_WAIT_BITS_BLOCK( xEventGroup, uxBitsToWaitFor ) +#endif + +#ifndef traceEVENT_GROUP_WAIT_BITS_END + #define traceEVENT_GROUP_WAIT_BITS_END( xEventGroup, uxBitsToWaitFor, xTimeoutOccurred ) ( void ) xTimeoutOccurred +#endif + +#ifndef traceEVENT_GROUP_CLEAR_BITS + #define traceEVENT_GROUP_CLEAR_BITS( xEventGroup, uxBitsToClear ) +#endif + +#ifndef traceEVENT_GROUP_CLEAR_BITS_FROM_ISR + #define traceEVENT_GROUP_CLEAR_BITS_FROM_ISR( xEventGroup, uxBitsToClear ) +#endif + +#ifndef traceEVENT_GROUP_SET_BITS + #define traceEVENT_GROUP_SET_BITS( xEventGroup, uxBitsToSet ) +#endif + +#ifndef traceEVENT_GROUP_SET_BITS_FROM_ISR + #define traceEVENT_GROUP_SET_BITS_FROM_ISR( xEventGroup, uxBitsToSet ) +#endif + +#ifndef traceEVENT_GROUP_DELETE + #define traceEVENT_GROUP_DELETE( xEventGroup ) +#endif + +#ifndef tracePEND_FUNC_CALL + #define tracePEND_FUNC_CALL(xFunctionToPend, pvParameter1, ulParameter2, ret) +#endif + +#ifndef tracePEND_FUNC_CALL_FROM_ISR + #define tracePEND_FUNC_CALL_FROM_ISR(xFunctionToPend, pvParameter1, ulParameter2, ret) +#endif + +#ifndef traceQUEUE_REGISTRY_ADD + #define traceQUEUE_REGISTRY_ADD(xQueue, pcQueueName) +#endif + +#ifndef traceTASK_NOTIFY_TAKE_BLOCK + #define traceTASK_NOTIFY_TAKE_BLOCK() +#endif + +#ifndef traceTASK_NOTIFY_TAKE + #define traceTASK_NOTIFY_TAKE() +#endif + +#ifndef traceTASK_NOTIFY_WAIT_BLOCK + #define traceTASK_NOTIFY_WAIT_BLOCK() +#endif + +#ifndef traceTASK_NOTIFY_WAIT + #define traceTASK_NOTIFY_WAIT() +#endif + +#ifndef traceTASK_NOTIFY + #define traceTASK_NOTIFY() +#endif + +#ifndef traceTASK_NOTIFY_FROM_ISR + #define traceTASK_NOTIFY_FROM_ISR() +#endif + +#ifndef traceTASK_NOTIFY_GIVE_FROM_ISR + #define traceTASK_NOTIFY_GIVE_FROM_ISR() +#endif + +#ifndef configGENERATE_RUN_TIME_STATS + #define configGENERATE_RUN_TIME_STATS 0 +#endif + +#if ( configGENERATE_RUN_TIME_STATS == 1 ) + + #ifndef portCONFIGURE_TIMER_FOR_RUN_TIME_STATS + #error If configGENERATE_RUN_TIME_STATS is defined then portCONFIGURE_TIMER_FOR_RUN_TIME_STATS must also be defined. portCONFIGURE_TIMER_FOR_RUN_TIME_STATS should call a port layer function to setup a peripheral timer/counter that can then be used as the run time counter time base. + #endif /* portCONFIGURE_TIMER_FOR_RUN_TIME_STATS */ + + #ifndef portGET_RUN_TIME_COUNTER_VALUE + #ifndef portALT_GET_RUN_TIME_COUNTER_VALUE + #error If configGENERATE_RUN_TIME_STATS is defined then either portGET_RUN_TIME_COUNTER_VALUE or portALT_GET_RUN_TIME_COUNTER_VALUE must also be defined. See the examples provided and the FreeRTOS web site for more information. + #endif /* portALT_GET_RUN_TIME_COUNTER_VALUE */ + #endif /* portGET_RUN_TIME_COUNTER_VALUE */ + +#endif /* configGENERATE_RUN_TIME_STATS */ + +#ifndef portCONFIGURE_TIMER_FOR_RUN_TIME_STATS + #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() +#endif + +#ifndef configUSE_MALLOC_FAILED_HOOK + #define configUSE_MALLOC_FAILED_HOOK 0 +#endif + +#ifndef portPRIVILEGE_BIT + #define portPRIVILEGE_BIT ( ( UBaseType_t ) 0x00 ) +#endif + +#ifndef portYIELD_WITHIN_API + #define portYIELD_WITHIN_API portYIELD +#endif + +#ifndef portSUPPRESS_TICKS_AND_SLEEP + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) +#endif + +#ifndef configEXPECTED_IDLE_TIME_BEFORE_SLEEP + #define configEXPECTED_IDLE_TIME_BEFORE_SLEEP 2 +#endif + +#if configEXPECTED_IDLE_TIME_BEFORE_SLEEP < 2 + #error configEXPECTED_IDLE_TIME_BEFORE_SLEEP must not be less than 2 +#endif + +#ifndef configUSE_TICKLESS_IDLE + #define configUSE_TICKLESS_IDLE 0 +#endif + +#ifndef configPRE_SLEEP_PROCESSING + #define configPRE_SLEEP_PROCESSING( x ) +#endif + +#ifndef configPOST_SLEEP_PROCESSING + #define configPOST_SLEEP_PROCESSING( x ) +#endif + +#ifndef configUSE_QUEUE_SETS + #define configUSE_QUEUE_SETS 0 +#endif + +#ifndef portTASK_USES_FLOATING_POINT + #define portTASK_USES_FLOATING_POINT() +#endif + +#ifndef configUSE_TIME_SLICING + #define configUSE_TIME_SLICING 1 +#endif + +#ifndef configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS + #define configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS 0 +#endif + +#ifndef configUSE_STATS_FORMATTING_FUNCTIONS + #define configUSE_STATS_FORMATTING_FUNCTIONS 0 +#endif + +#ifndef portASSERT_IF_INTERRUPT_PRIORITY_INVALID + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() +#endif + +#ifndef configUSE_TRACE_FACILITY + #define configUSE_TRACE_FACILITY 0 +#endif + +#ifndef mtCOVERAGE_TEST_MARKER + #define mtCOVERAGE_TEST_MARKER() +#endif + +#ifndef mtCOVERAGE_TEST_DELAY + #define mtCOVERAGE_TEST_DELAY() +#endif + +#ifndef portASSERT_IF_IN_ISR + #define portASSERT_IF_IN_ISR() +#endif + +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 0 +#endif + +#ifndef configAPPLICATION_ALLOCATED_HEAP + #define configAPPLICATION_ALLOCATED_HEAP 0 +#endif + +#ifndef configUSE_TASK_NOTIFICATIONS + #define configUSE_TASK_NOTIFICATIONS 1 +#endif + +#ifndef portTICK_TYPE_IS_ATOMIC + #define portTICK_TYPE_IS_ATOMIC 0 +#endif + +#ifndef configSUPPORT_STATIC_ALLOCATION + /* Defaults to 0 for backward compatibility. */ + #define configSUPPORT_STATIC_ALLOCATION 0 +#endif + +#ifndef configSUPPORT_DYNAMIC_ALLOCATION + /* Defaults to 1 for backward compatibility. */ + #define configSUPPORT_DYNAMIC_ALLOCATION 1 +#endif + +/* Sanity check the configuration. */ +#if( configUSE_TICKLESS_IDLE != 0 ) + #if( INCLUDE_vTaskSuspend != 1 ) + #error INCLUDE_vTaskSuspend must be set to 1 if configUSE_TICKLESS_IDLE is not set to 0 + #endif /* INCLUDE_vTaskSuspend */ +#endif /* configUSE_TICKLESS_IDLE */ + +#if( ( configSUPPORT_STATIC_ALLOCATION == 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 0 ) ) + #error configSUPPORT_STATIC_ALLOCATION and configSUPPORT_DYNAMIC_ALLOCATION cannot both be 0, but can both be 1. +#endif + +#if( ( configUSE_RECURSIVE_MUTEXES == 1 ) && ( configUSE_MUTEXES != 1 ) ) + #error configUSE_MUTEXES must be set to 1 to use recursive mutexes +#endif + +#if( portTICK_TYPE_IS_ATOMIC == 0 ) + /* Either variables of tick type cannot be read atomically, or + portTICK_TYPE_IS_ATOMIC was not set - map the critical sections used when + the tick count is returned to the standard critical section macros. */ + #define portTICK_TYPE_ENTER_CRITICAL() portENTER_CRITICAL() + #define portTICK_TYPE_EXIT_CRITICAL() portEXIT_CRITICAL() + #define portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR() portSET_INTERRUPT_MASK_FROM_ISR() + #define portTICK_TYPE_CLEAR_INTERRUPT_MASK_FROM_ISR( x ) portCLEAR_INTERRUPT_MASK_FROM_ISR( ( x ) ) +#else + /* The tick type can be read atomically, so critical sections used when the + tick count is returned can be defined away. */ + #define portTICK_TYPE_ENTER_CRITICAL() + #define portTICK_TYPE_EXIT_CRITICAL() + #define portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR() 0 + #define portTICK_TYPE_CLEAR_INTERRUPT_MASK_FROM_ISR( x ) ( void ) x +#endif + +/* Definitions to allow backward compatibility with FreeRTOS versions prior to +V8 if desired. */ +#ifndef configENABLE_BACKWARD_COMPATIBILITY + #define configENABLE_BACKWARD_COMPATIBILITY 1 +#endif + +#if configENABLE_BACKWARD_COMPATIBILITY == 1 + #define eTaskStateGet eTaskGetState + #define portTickType TickType_t + #define xTaskHandle TaskHandle_t + #define xQueueHandle QueueHandle_t + #define xSemaphoreHandle SemaphoreHandle_t + #define xQueueSetHandle QueueSetHandle_t + #define xQueueSetMemberHandle QueueSetMemberHandle_t + #define xTimeOutType TimeOut_t + #define xMemoryRegion MemoryRegion_t + #define xTaskParameters TaskParameters_t + #define xTaskStatusType TaskStatus_t + #define xTimerHandle TimerHandle_t + #define xCoRoutineHandle CoRoutineHandle_t + #define pdTASK_HOOK_CODE TaskHookFunction_t + #define portTICK_RATE_MS portTICK_PERIOD_MS + #define pcTaskGetTaskName pcTaskGetName + #define pcTimerGetTimerName pcTimerGetName + #define pcQueueGetQueueName pcQueueGetName + #define vTaskGetTaskInfo vTaskGetInfo + + /* Backward compatibility within the scheduler code only - these definitions + are not really required but are included for completeness. */ + #define tmrTIMER_CALLBACK TimerCallbackFunction_t + #define pdTASK_CODE TaskFunction_t + #define xListItem ListItem_t + #define xList List_t +#endif /* configENABLE_BACKWARD_COMPATIBILITY */ + +#if( configUSE_ALTERNATIVE_API != 0 ) + #error The alternative API was deprecated some time ago, and was removed in FreeRTOS V9.0 0 +#endif + +/* Set configUSE_TASK_FPU_SUPPORT to 0 to omit floating point support even +if floating point hardware is otherwise supported by the FreeRTOS port in use. +This constant is not supported by all FreeRTOS ports that include floating +point support. */ +#ifndef configUSE_TASK_FPU_SUPPORT + #define configUSE_TASK_FPU_SUPPORT 1 +#endif + +/* + * In line with software engineering best practice, FreeRTOS implements a strict + * data hiding policy, so the real structures used by FreeRTOS to maintain the + * state of tasks, queues, semaphores, etc. are not accessible to the application + * code. However, if the application writer wants to statically allocate such + * an object then the size of the object needs to be know. Dummy structures + * that are guaranteed to have the same size and alignment requirements of the + * real objects are used for this purpose. The dummy list and list item + * structures below are used for inclusion in such a dummy structure. + */ +struct xSTATIC_LIST_ITEM +{ + TickType_t xDummy1; + void *pvDummy2[ 4 ]; +}; +typedef struct xSTATIC_LIST_ITEM StaticListItem_t; + +/* See the comments above the struct xSTATIC_LIST_ITEM definition. */ +struct xSTATIC_MINI_LIST_ITEM +{ + TickType_t xDummy1; + void *pvDummy2[ 2 ]; +}; +typedef struct xSTATIC_MINI_LIST_ITEM StaticMiniListItem_t; + +/* See the comments above the struct xSTATIC_LIST_ITEM definition. */ +typedef struct xSTATIC_LIST +{ + UBaseType_t uxDummy1; + void *pvDummy2; + StaticMiniListItem_t xDummy3; +} StaticList_t; + +/* + * In line with software engineering best practice, especially when supplying a + * library that is likely to change in future versions, FreeRTOS implements a + * strict data hiding policy. This means the Task structure used internally by + * FreeRTOS is not accessible to application code. However, if the application + * writer wants to statically allocate the memory required to create a task then + * the size of the task object needs to be know. The StaticTask_t structure + * below is provided for this purpose. Its sizes and alignment requirements are + * guaranteed to match those of the genuine structure, no matter which + * architecture is being used, and no matter how the values in FreeRTOSConfig.h + * are set. Its contents are somewhat obfuscated in the hope users will + * recognise that it would be unwise to make direct use of the structure members. + */ +typedef struct xSTATIC_TCB +{ + void *pxDummy1; + #if ( portUSING_MPU_WRAPPERS == 1 ) + xMPU_SETTINGS xDummy2; + #endif + StaticListItem_t xDummy3[ 2 ]; + UBaseType_t uxDummy5; + void *pxDummy6; + uint8_t ucDummy7[ configMAX_TASK_NAME_LEN ]; + #if ( portSTACK_GROWTH > 0 ) + void *pxDummy8; + #endif + #if ( portCRITICAL_NESTING_IN_TCB == 1 ) + UBaseType_t uxDummy9; + #endif + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxDummy10[ 2 ]; + #endif + #if ( configUSE_MUTEXES == 1 ) + UBaseType_t uxDummy12[ 2 ]; + #endif + #if ( configUSE_APPLICATION_TASK_TAG == 1 ) + void *pxDummy14; + #endif + #if( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 ) + void *pvDummy15[ configNUM_THREAD_LOCAL_STORAGE_POINTERS ]; + #endif + #if ( configGENERATE_RUN_TIME_STATS == 1 ) + uint32_t ulDummy16; + #endif + #if ( configUSE_NEWLIB_REENTRANT == 1 ) + struct _reent xDummy17; + #endif + #if ( configUSE_TASK_NOTIFICATIONS == 1 ) + uint32_t ulDummy18; + uint8_t ucDummy19; + #endif + #if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + uint8_t uxDummy20; + #endif + +} StaticTask_t; + +/* + * In line with software engineering best practice, especially when supplying a + * library that is likely to change in future versions, FreeRTOS implements a + * strict data hiding policy. This means the Queue structure used internally by + * FreeRTOS is not accessible to application code. However, if the application + * writer wants to statically allocate the memory required to create a queue + * then the size of the queue object needs to be know. The StaticQueue_t + * structure below is provided for this purpose. Its sizes and alignment + * requirements are guaranteed to match those of the genuine structure, no + * matter which architecture is being used, and no matter how the values in + * FreeRTOSConfig.h are set. Its contents are somewhat obfuscated in the hope + * users will recognise that it would be unwise to make direct use of the + * structure members. + */ +typedef struct xSTATIC_QUEUE +{ + void *pvDummy1[ 3 ]; + + union + { + void *pvDummy2; + UBaseType_t uxDummy2; + } u; + + StaticList_t xDummy3[ 2 ]; + UBaseType_t uxDummy4[ 3 ]; + uint8_t ucDummy5[ 2 ]; + + #if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + uint8_t ucDummy6; + #endif + + #if ( configUSE_QUEUE_SETS == 1 ) + void *pvDummy7; + #endif + + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxDummy8; + uint8_t ucDummy9; + #endif + +} StaticQueue_t; +typedef StaticQueue_t StaticSemaphore_t; + +/* + * In line with software engineering best practice, especially when supplying a + * library that is likely to change in future versions, FreeRTOS implements a + * strict data hiding policy. This means the event group structure used + * internally by FreeRTOS is not accessible to application code. However, if + * the application writer wants to statically allocate the memory required to + * create an event group then the size of the event group object needs to be + * know. The StaticEventGroup_t structure below is provided for this purpose. + * Its sizes and alignment requirements are guaranteed to match those of the + * genuine structure, no matter which architecture is being used, and no matter + * how the values in FreeRTOSConfig.h are set. Its contents are somewhat + * obfuscated in the hope users will recognise that it would be unwise to make + * direct use of the structure members. + */ +typedef struct xSTATIC_EVENT_GROUP +{ + TickType_t xDummy1; + StaticList_t xDummy2; + + #if( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxDummy3; + #endif + + #if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + uint8_t ucDummy4; + #endif + +} StaticEventGroup_t; + +/* + * In line with software engineering best practice, especially when supplying a + * library that is likely to change in future versions, FreeRTOS implements a + * strict data hiding policy. This means the software timer structure used + * internally by FreeRTOS is not accessible to application code. However, if + * the application writer wants to statically allocate the memory required to + * create a software timer then the size of the queue object needs to be know. + * The StaticTimer_t structure below is provided for this purpose. Its sizes + * and alignment requirements are guaranteed to match those of the genuine + * structure, no matter which architecture is being used, and no matter how the + * values in FreeRTOSConfig.h are set. Its contents are somewhat obfuscated in + * the hope users will recognise that it would be unwise to make direct use of + * the structure members. + */ +typedef struct xSTATIC_TIMER +{ + void *pvDummy1; + StaticListItem_t xDummy2; + TickType_t xDummy3; + UBaseType_t uxDummy4; + void *pvDummy5[ 2 ]; + #if( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxDummy6; + #endif + + #if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + uint8_t ucDummy7; + #endif + +} StaticTimer_t; + +#ifdef __cplusplus +} +#endif + +#endif /* INC_FREERTOS_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/include/StackMacros.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/include/StackMacros.h new file mode 100644 index 0000000..914c48f --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/include/StackMacros.h @@ -0,0 +1,171 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef STACK_MACROS_H +#define STACK_MACROS_H + +/* + * Call the stack overflow hook function if the stack of the task being swapped + * out is currently overflowed, or looks like it might have overflowed in the + * past. + * + * Setting configCHECK_FOR_STACK_OVERFLOW to 1 will cause the macro to check + * the current stack state only - comparing the current top of stack value to + * the stack limit. Setting configCHECK_FOR_STACK_OVERFLOW to greater than 1 + * will also cause the last few stack bytes to be checked to ensure the value + * to which the bytes were set when the task was created have not been + * overwritten. Note this second test does not guarantee that an overflowed + * stack will always be recognised. + */ + +/*-----------------------------------------------------------*/ + +#if( ( configCHECK_FOR_STACK_OVERFLOW == 1 ) && ( portSTACK_GROWTH < 0 ) ) + + /* Only the current stack state is to be checked. */ + #define taskCHECK_FOR_STACK_OVERFLOW() \ + { \ + /* Is the currently saved stack pointer within the stack limit? */ \ + if( pxCurrentTCB->pxTopOfStack <= pxCurrentTCB->pxStack ) \ + { \ + vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ + } \ + } + +#endif /* configCHECK_FOR_STACK_OVERFLOW == 1 */ +/*-----------------------------------------------------------*/ + +#if( ( configCHECK_FOR_STACK_OVERFLOW == 1 ) && ( portSTACK_GROWTH > 0 ) ) + + /* Only the current stack state is to be checked. */ + #define taskCHECK_FOR_STACK_OVERFLOW() \ + { \ + \ + /* Is the currently saved stack pointer within the stack limit? */ \ + if( pxCurrentTCB->pxTopOfStack >= pxCurrentTCB->pxEndOfStack ) \ + { \ + vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ + } \ + } + +#endif /* configCHECK_FOR_STACK_OVERFLOW == 1 */ +/*-----------------------------------------------------------*/ + +#if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH < 0 ) ) + + #define taskCHECK_FOR_STACK_OVERFLOW() \ + { \ + const uint32_t * const pulStack = ( uint32_t * ) pxCurrentTCB->pxStack; \ + const uint32_t ulCheckValue = ( uint32_t ) 0xa5a5a5a5; \ + \ + if( ( pulStack[ 0 ] != ulCheckValue ) || \ + ( pulStack[ 1 ] != ulCheckValue ) || \ + ( pulStack[ 2 ] != ulCheckValue ) || \ + ( pulStack[ 3 ] != ulCheckValue ) ) \ + { \ + vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ + } \ + } + +#endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */ +/*-----------------------------------------------------------*/ + +#if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH > 0 ) ) + + #define taskCHECK_FOR_STACK_OVERFLOW() \ + { \ + int8_t *pcEndOfStack = ( int8_t * ) pxCurrentTCB->pxEndOfStack; \ + static const uint8_t ucExpectedStackBytes[] = { tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE }; \ + \ + \ + pcEndOfStack -= sizeof( ucExpectedStackBytes ); \ + \ + /* Has the extremity of the task stack ever been written over? */ \ + if( memcmp( ( void * ) pcEndOfStack, ( void * ) ucExpectedStackBytes, sizeof( ucExpectedStackBytes ) ) != 0 ) \ + { \ + vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ + } \ + } + +#endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */ +/*-----------------------------------------------------------*/ + +/* Remove stack overflow macro if not being used. */ +#ifndef taskCHECK_FOR_STACK_OVERFLOW + #define taskCHECK_FOR_STACK_OVERFLOW() +#endif + + + +#endif /* STACK_MACROS_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/include/croutine.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/include/croutine.h new file mode 100644 index 0000000..de66545 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/include/croutine.h @@ -0,0 +1,762 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef CO_ROUTINE_H +#define CO_ROUTINE_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h must appear in source files before include croutine.h" +#endif + +#include "list.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Used to hide the implementation of the co-routine control block. The +control block structure however has to be included in the header due to +the macro implementation of the co-routine functionality. */ +typedef void * CoRoutineHandle_t; + +/* Defines the prototype to which co-routine functions must conform. */ +typedef void (*crCOROUTINE_CODE)( CoRoutineHandle_t, UBaseType_t ); + +typedef struct corCoRoutineControlBlock +{ + crCOROUTINE_CODE pxCoRoutineFunction; + ListItem_t xGenericListItem; /*< List item used to place the CRCB in ready and blocked queues. */ + ListItem_t xEventListItem; /*< List item used to place the CRCB in event lists. */ + UBaseType_t uxPriority; /*< The priority of the co-routine in relation to other co-routines. */ + UBaseType_t uxIndex; /*< Used to distinguish between co-routines when multiple co-routines use the same co-routine function. */ + uint16_t uxState; /*< Used internally by the co-routine implementation. */ +} CRCB_t; /* Co-routine control block. Note must be identical in size down to uxPriority with TCB_t. */ + +/** + * croutine. h + *
+ BaseType_t xCoRoutineCreate(
+                                 crCOROUTINE_CODE pxCoRoutineCode,
+                                 UBaseType_t uxPriority,
+                                 UBaseType_t uxIndex
+                               );
+ * + * Create a new co-routine and add it to the list of co-routines that are + * ready to run. + * + * @param pxCoRoutineCode Pointer to the co-routine function. Co-routine + * functions require special syntax - see the co-routine section of the WEB + * documentation for more information. + * + * @param uxPriority The priority with respect to other co-routines at which + * the co-routine will run. + * + * @param uxIndex Used to distinguish between different co-routines that + * execute the same function. See the example below and the co-routine section + * of the WEB documentation for further information. + * + * @return pdPASS if the co-routine was successfully created and added to a ready + * list, otherwise an error code defined with ProjDefs.h. + * + * Example usage: +
+ // Co-routine to be created.
+ void vFlashCoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
+ {
+ // Variables in co-routines must be declared static if they must maintain value across a blocking call.
+ // This may not be necessary for const variables.
+ static const char cLedToFlash[ 2 ] = { 5, 6 };
+ static const TickType_t uxFlashRates[ 2 ] = { 200, 400 };
+
+     // Must start every co-routine with a call to crSTART();
+     crSTART( xHandle );
+
+     for( ;; )
+     {
+         // This co-routine just delays for a fixed period, then toggles
+         // an LED.  Two co-routines are created using this function, so
+         // the uxIndex parameter is used to tell the co-routine which
+         // LED to flash and how int32_t to delay.  This assumes xQueue has
+         // already been created.
+         vParTestToggleLED( cLedToFlash[ uxIndex ] );
+         crDELAY( xHandle, uxFlashRates[ uxIndex ] );
+     }
+
+     // Must end every co-routine with a call to crEND();
+     crEND();
+ }
+
+ // Function that creates two co-routines.
+ void vOtherFunction( void )
+ {
+ uint8_t ucParameterToPass;
+ TaskHandle_t xHandle;
+
+     // Create two co-routines at priority 0.  The first is given index 0
+     // so (from the code above) toggles LED 5 every 200 ticks.  The second
+     // is given index 1 so toggles LED 6 every 400 ticks.
+     for( uxIndex = 0; uxIndex < 2; uxIndex++ )
+     {
+         xCoRoutineCreate( vFlashCoRoutine, 0, uxIndex );
+     }
+ }
+   
+ * \defgroup xCoRoutineCreate xCoRoutineCreate + * \ingroup Tasks + */ +BaseType_t xCoRoutineCreate( crCOROUTINE_CODE pxCoRoutineCode, UBaseType_t uxPriority, UBaseType_t uxIndex ); + + +/** + * croutine. h + *
+ void vCoRoutineSchedule( void );
+ * + * Run a co-routine. + * + * vCoRoutineSchedule() executes the highest priority co-routine that is able + * to run. The co-routine will execute until it either blocks, yields or is + * preempted by a task. Co-routines execute cooperatively so one + * co-routine cannot be preempted by another, but can be preempted by a task. + * + * If an application comprises of both tasks and co-routines then + * vCoRoutineSchedule should be called from the idle task (in an idle task + * hook). + * + * Example usage: +
+ // This idle task hook will schedule a co-routine each time it is called.
+ // The rest of the idle task will execute between co-routine calls.
+ void vApplicationIdleHook( void )
+ {
+	vCoRoutineSchedule();
+ }
+
+ // Alternatively, if you do not require any other part of the idle task to
+ // execute, the idle task hook can call vCoRoutineScheduler() within an
+ // infinite loop.
+ void vApplicationIdleHook( void )
+ {
+    for( ;; )
+    {
+        vCoRoutineSchedule();
+    }
+ }
+ 
+ * \defgroup vCoRoutineSchedule vCoRoutineSchedule + * \ingroup Tasks + */ +void vCoRoutineSchedule( void ); + +/** + * croutine. h + *
+ crSTART( CoRoutineHandle_t xHandle );
+ * + * This macro MUST always be called at the start of a co-routine function. + * + * Example usage: +
+ // Co-routine to be created.
+ void vACoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
+ {
+ // Variables in co-routines must be declared static if they must maintain value across a blocking call.
+ static int32_t ulAVariable;
+
+     // Must start every co-routine with a call to crSTART();
+     crSTART( xHandle );
+
+     for( ;; )
+     {
+          // Co-routine functionality goes here.
+     }
+
+     // Must end every co-routine with a call to crEND();
+     crEND();
+ }
+ * \defgroup crSTART crSTART + * \ingroup Tasks + */ +#define crSTART( pxCRCB ) switch( ( ( CRCB_t * )( pxCRCB ) )->uxState ) { case 0: + +/** + * croutine. h + *
+ crEND();
+ * + * This macro MUST always be called at the end of a co-routine function. + * + * Example usage: +
+ // Co-routine to be created.
+ void vACoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
+ {
+ // Variables in co-routines must be declared static if they must maintain value across a blocking call.
+ static int32_t ulAVariable;
+
+     // Must start every co-routine with a call to crSTART();
+     crSTART( xHandle );
+
+     for( ;; )
+     {
+          // Co-routine functionality goes here.
+     }
+
+     // Must end every co-routine with a call to crEND();
+     crEND();
+ }
+ * \defgroup crSTART crSTART + * \ingroup Tasks + */ +#define crEND() } + +/* + * These macros are intended for internal use by the co-routine implementation + * only. The macros should not be used directly by application writers. + */ +#define crSET_STATE0( xHandle ) ( ( CRCB_t * )( xHandle ) )->uxState = (__LINE__ * 2); return; case (__LINE__ * 2): +#define crSET_STATE1( xHandle ) ( ( CRCB_t * )( xHandle ) )->uxState = ((__LINE__ * 2)+1); return; case ((__LINE__ * 2)+1): + +/** + * croutine. h + *
+ crDELAY( CoRoutineHandle_t xHandle, TickType_t xTicksToDelay );
+ * + * Delay a co-routine for a fixed period of time. + * + * crDELAY can only be called from the co-routine function itself - not + * from within a function called by the co-routine function. This is because + * co-routines do not maintain their own stack. + * + * @param xHandle The handle of the co-routine to delay. This is the xHandle + * parameter of the co-routine function. + * + * @param xTickToDelay The number of ticks that the co-routine should delay + * for. The actual amount of time this equates to is defined by + * configTICK_RATE_HZ (set in FreeRTOSConfig.h). The constant portTICK_PERIOD_MS + * can be used to convert ticks to milliseconds. + * + * Example usage: +
+ // Co-routine to be created.
+ void vACoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
+ {
+ // Variables in co-routines must be declared static if they must maintain value across a blocking call.
+ // This may not be necessary for const variables.
+ // We are to delay for 200ms.
+ static const xTickType xDelayTime = 200 / portTICK_PERIOD_MS;
+
+     // Must start every co-routine with a call to crSTART();
+     crSTART( xHandle );
+
+     for( ;; )
+     {
+        // Delay for 200ms.
+        crDELAY( xHandle, xDelayTime );
+
+        // Do something here.
+     }
+
+     // Must end every co-routine with a call to crEND();
+     crEND();
+ }
+ * \defgroup crDELAY crDELAY + * \ingroup Tasks + */ +#define crDELAY( xHandle, xTicksToDelay ) \ + if( ( xTicksToDelay ) > 0 ) \ + { \ + vCoRoutineAddToDelayedList( ( xTicksToDelay ), NULL ); \ + } \ + crSET_STATE0( ( xHandle ) ); + +/** + *
+ crQUEUE_SEND(
+                  CoRoutineHandle_t xHandle,
+                  QueueHandle_t pxQueue,
+                  void *pvItemToQueue,
+                  TickType_t xTicksToWait,
+                  BaseType_t *pxResult
+             )
+ * + * The macro's crQUEUE_SEND() and crQUEUE_RECEIVE() are the co-routine + * equivalent to the xQueueSend() and xQueueReceive() functions used by tasks. + * + * crQUEUE_SEND and crQUEUE_RECEIVE can only be used from a co-routine whereas + * xQueueSend() and xQueueReceive() can only be used from tasks. + * + * crQUEUE_SEND can only be called from the co-routine function itself - not + * from within a function called by the co-routine function. This is because + * co-routines do not maintain their own stack. + * + * See the co-routine section of the WEB documentation for information on + * passing data between tasks and co-routines and between ISR's and + * co-routines. + * + * @param xHandle The handle of the calling co-routine. This is the xHandle + * parameter of the co-routine function. + * + * @param pxQueue The handle of the queue on which the data will be posted. + * The handle is obtained as the return value when the queue is created using + * the xQueueCreate() API function. + * + * @param pvItemToQueue A pointer to the data being posted onto the queue. + * The number of bytes of each queued item is specified when the queue is + * created. This number of bytes is copied from pvItemToQueue into the queue + * itself. + * + * @param xTickToDelay The number of ticks that the co-routine should block + * to wait for space to become available on the queue, should space not be + * available immediately. The actual amount of time this equates to is defined + * by configTICK_RATE_HZ (set in FreeRTOSConfig.h). The constant + * portTICK_PERIOD_MS can be used to convert ticks to milliseconds (see example + * below). + * + * @param pxResult The variable pointed to by pxResult will be set to pdPASS if + * data was successfully posted onto the queue, otherwise it will be set to an + * error defined within ProjDefs.h. + * + * Example usage: +
+ // Co-routine function that blocks for a fixed period then posts a number onto
+ // a queue.
+ static void prvCoRoutineFlashTask( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
+ {
+ // Variables in co-routines must be declared static if they must maintain value across a blocking call.
+ static BaseType_t xNumberToPost = 0;
+ static BaseType_t xResult;
+
+    // Co-routines must begin with a call to crSTART().
+    crSTART( xHandle );
+
+    for( ;; )
+    {
+        // This assumes the queue has already been created.
+        crQUEUE_SEND( xHandle, xCoRoutineQueue, &xNumberToPost, NO_DELAY, &xResult );
+
+        if( xResult != pdPASS )
+        {
+            // The message was not posted!
+        }
+
+        // Increment the number to be posted onto the queue.
+        xNumberToPost++;
+
+        // Delay for 100 ticks.
+        crDELAY( xHandle, 100 );
+    }
+
+    // Co-routines must end with a call to crEND().
+    crEND();
+ }
+ * \defgroup crQUEUE_SEND crQUEUE_SEND + * \ingroup Tasks + */ +#define crQUEUE_SEND( xHandle, pxQueue, pvItemToQueue, xTicksToWait, pxResult ) \ +{ \ + *( pxResult ) = xQueueCRSend( ( pxQueue) , ( pvItemToQueue) , ( xTicksToWait ) ); \ + if( *( pxResult ) == errQUEUE_BLOCKED ) \ + { \ + crSET_STATE0( ( xHandle ) ); \ + *pxResult = xQueueCRSend( ( pxQueue ), ( pvItemToQueue ), 0 ); \ + } \ + if( *pxResult == errQUEUE_YIELD ) \ + { \ + crSET_STATE1( ( xHandle ) ); \ + *pxResult = pdPASS; \ + } \ +} + +/** + * croutine. h + *
+  crQUEUE_RECEIVE(
+                     CoRoutineHandle_t xHandle,
+                     QueueHandle_t pxQueue,
+                     void *pvBuffer,
+                     TickType_t xTicksToWait,
+                     BaseType_t *pxResult
+                 )
+ * + * The macro's crQUEUE_SEND() and crQUEUE_RECEIVE() are the co-routine + * equivalent to the xQueueSend() and xQueueReceive() functions used by tasks. + * + * crQUEUE_SEND and crQUEUE_RECEIVE can only be used from a co-routine whereas + * xQueueSend() and xQueueReceive() can only be used from tasks. + * + * crQUEUE_RECEIVE can only be called from the co-routine function itself - not + * from within a function called by the co-routine function. This is because + * co-routines do not maintain their own stack. + * + * See the co-routine section of the WEB documentation for information on + * passing data between tasks and co-routines and between ISR's and + * co-routines. + * + * @param xHandle The handle of the calling co-routine. This is the xHandle + * parameter of the co-routine function. + * + * @param pxQueue The handle of the queue from which the data will be received. + * The handle is obtained as the return value when the queue is created using + * the xQueueCreate() API function. + * + * @param pvBuffer The buffer into which the received item is to be copied. + * The number of bytes of each queued item is specified when the queue is + * created. This number of bytes is copied into pvBuffer. + * + * @param xTickToDelay The number of ticks that the co-routine should block + * to wait for data to become available from the queue, should data not be + * available immediately. The actual amount of time this equates to is defined + * by configTICK_RATE_HZ (set in FreeRTOSConfig.h). The constant + * portTICK_PERIOD_MS can be used to convert ticks to milliseconds (see the + * crQUEUE_SEND example). + * + * @param pxResult The variable pointed to by pxResult will be set to pdPASS if + * data was successfully retrieved from the queue, otherwise it will be set to + * an error code as defined within ProjDefs.h. + * + * Example usage: +
+ // A co-routine receives the number of an LED to flash from a queue.  It
+ // blocks on the queue until the number is received.
+ static void prvCoRoutineFlashWorkTask( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
+ {
+ // Variables in co-routines must be declared static if they must maintain value across a blocking call.
+ static BaseType_t xResult;
+ static UBaseType_t uxLEDToFlash;
+
+    // All co-routines must start with a call to crSTART().
+    crSTART( xHandle );
+
+    for( ;; )
+    {
+        // Wait for data to become available on the queue.
+        crQUEUE_RECEIVE( xHandle, xCoRoutineQueue, &uxLEDToFlash, portMAX_DELAY, &xResult );
+
+        if( xResult == pdPASS )
+        {
+            // We received the LED to flash - flash it!
+            vParTestToggleLED( uxLEDToFlash );
+        }
+    }
+
+    crEND();
+ }
+ * \defgroup crQUEUE_RECEIVE crQUEUE_RECEIVE + * \ingroup Tasks + */ +#define crQUEUE_RECEIVE( xHandle, pxQueue, pvBuffer, xTicksToWait, pxResult ) \ +{ \ + *( pxResult ) = xQueueCRReceive( ( pxQueue) , ( pvBuffer ), ( xTicksToWait ) ); \ + if( *( pxResult ) == errQUEUE_BLOCKED ) \ + { \ + crSET_STATE0( ( xHandle ) ); \ + *( pxResult ) = xQueueCRReceive( ( pxQueue) , ( pvBuffer ), 0 ); \ + } \ + if( *( pxResult ) == errQUEUE_YIELD ) \ + { \ + crSET_STATE1( ( xHandle ) ); \ + *( pxResult ) = pdPASS; \ + } \ +} + +/** + * croutine. h + *
+  crQUEUE_SEND_FROM_ISR(
+                            QueueHandle_t pxQueue,
+                            void *pvItemToQueue,
+                            BaseType_t xCoRoutinePreviouslyWoken
+                       )
+ * + * The macro's crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() are the + * co-routine equivalent to the xQueueSendFromISR() and xQueueReceiveFromISR() + * functions used by tasks. + * + * crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() can only be used to + * pass data between a co-routine and and ISR, whereas xQueueSendFromISR() and + * xQueueReceiveFromISR() can only be used to pass data between a task and and + * ISR. + * + * crQUEUE_SEND_FROM_ISR can only be called from an ISR to send data to a queue + * that is being used from within a co-routine. + * + * See the co-routine section of the WEB documentation for information on + * passing data between tasks and co-routines and between ISR's and + * co-routines. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param xCoRoutinePreviouslyWoken This is included so an ISR can post onto + * the same queue multiple times from a single interrupt. The first call + * should always pass in pdFALSE. Subsequent calls should pass in + * the value returned from the previous call. + * + * @return pdTRUE if a co-routine was woken by posting onto the queue. This is + * used by the ISR to determine if a context switch may be required following + * the ISR. + * + * Example usage: +
+ // A co-routine that blocks on a queue waiting for characters to be received.
+ static void vReceivingCoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
+ {
+ char cRxedChar;
+ BaseType_t xResult;
+
+     // All co-routines must start with a call to crSTART().
+     crSTART( xHandle );
+
+     for( ;; )
+     {
+         // Wait for data to become available on the queue.  This assumes the
+         // queue xCommsRxQueue has already been created!
+         crQUEUE_RECEIVE( xHandle, xCommsRxQueue, &uxLEDToFlash, portMAX_DELAY, &xResult );
+
+         // Was a character received?
+         if( xResult == pdPASS )
+         {
+             // Process the character here.
+         }
+     }
+
+     // All co-routines must end with a call to crEND().
+     crEND();
+ }
+
+ // An ISR that uses a queue to send characters received on a serial port to
+ // a co-routine.
+ void vUART_ISR( void )
+ {
+ char cRxedChar;
+ BaseType_t xCRWokenByPost = pdFALSE;
+
+     // We loop around reading characters until there are none left in the UART.
+     while( UART_RX_REG_NOT_EMPTY() )
+     {
+         // Obtain the character from the UART.
+         cRxedChar = UART_RX_REG;
+
+         // Post the character onto a queue.  xCRWokenByPost will be pdFALSE
+         // the first time around the loop.  If the post causes a co-routine
+         // to be woken (unblocked) then xCRWokenByPost will be set to pdTRUE.
+         // In this manner we can ensure that if more than one co-routine is
+         // blocked on the queue only one is woken by this ISR no matter how
+         // many characters are posted to the queue.
+         xCRWokenByPost = crQUEUE_SEND_FROM_ISR( xCommsRxQueue, &cRxedChar, xCRWokenByPost );
+     }
+ }
+ * \defgroup crQUEUE_SEND_FROM_ISR crQUEUE_SEND_FROM_ISR + * \ingroup Tasks + */ +#define crQUEUE_SEND_FROM_ISR( pxQueue, pvItemToQueue, xCoRoutinePreviouslyWoken ) xQueueCRSendFromISR( ( pxQueue ), ( pvItemToQueue ), ( xCoRoutinePreviouslyWoken ) ) + + +/** + * croutine. h + *
+  crQUEUE_SEND_FROM_ISR(
+                            QueueHandle_t pxQueue,
+                            void *pvBuffer,
+                            BaseType_t * pxCoRoutineWoken
+                       )
+ * + * The macro's crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() are the + * co-routine equivalent to the xQueueSendFromISR() and xQueueReceiveFromISR() + * functions used by tasks. + * + * crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() can only be used to + * pass data between a co-routine and and ISR, whereas xQueueSendFromISR() and + * xQueueReceiveFromISR() can only be used to pass data between a task and and + * ISR. + * + * crQUEUE_RECEIVE_FROM_ISR can only be called from an ISR to receive data + * from a queue that is being used from within a co-routine (a co-routine + * posted to the queue). + * + * See the co-routine section of the WEB documentation for information on + * passing data between tasks and co-routines and between ISR's and + * co-routines. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvBuffer A pointer to a buffer into which the received item will be + * placed. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from the queue into + * pvBuffer. + * + * @param pxCoRoutineWoken A co-routine may be blocked waiting for space to become + * available on the queue. If crQUEUE_RECEIVE_FROM_ISR causes such a + * co-routine to unblock *pxCoRoutineWoken will get set to pdTRUE, otherwise + * *pxCoRoutineWoken will remain unchanged. + * + * @return pdTRUE an item was successfully received from the queue, otherwise + * pdFALSE. + * + * Example usage: +
+ // A co-routine that posts a character to a queue then blocks for a fixed
+ // period.  The character is incremented each time.
+ static void vSendingCoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
+ {
+ // cChar holds its value while this co-routine is blocked and must therefore
+ // be declared static.
+ static char cCharToTx = 'a';
+ BaseType_t xResult;
+
+     // All co-routines must start with a call to crSTART().
+     crSTART( xHandle );
+
+     for( ;; )
+     {
+         // Send the next character to the queue.
+         crQUEUE_SEND( xHandle, xCoRoutineQueue, &cCharToTx, NO_DELAY, &xResult );
+
+         if( xResult == pdPASS )
+         {
+             // The character was successfully posted to the queue.
+         }
+		 else
+		 {
+			// Could not post the character to the queue.
+		 }
+
+         // Enable the UART Tx interrupt to cause an interrupt in this
+		 // hypothetical UART.  The interrupt will obtain the character
+		 // from the queue and send it.
+		 ENABLE_RX_INTERRUPT();
+
+		 // Increment to the next character then block for a fixed period.
+		 // cCharToTx will maintain its value across the delay as it is
+		 // declared static.
+		 cCharToTx++;
+		 if( cCharToTx > 'x' )
+		 {
+			cCharToTx = 'a';
+		 }
+		 crDELAY( 100 );
+     }
+
+     // All co-routines must end with a call to crEND().
+     crEND();
+ }
+
+ // An ISR that uses a queue to receive characters to send on a UART.
+ void vUART_ISR( void )
+ {
+ char cCharToTx;
+ BaseType_t xCRWokenByPost = pdFALSE;
+
+     while( UART_TX_REG_EMPTY() )
+     {
+         // Are there any characters in the queue waiting to be sent?
+		 // xCRWokenByPost will automatically be set to pdTRUE if a co-routine
+		 // is woken by the post - ensuring that only a single co-routine is
+		 // woken no matter how many times we go around this loop.
+         if( crQUEUE_RECEIVE_FROM_ISR( pxQueue, &cCharToTx, &xCRWokenByPost ) )
+		 {
+			 SEND_CHARACTER( cCharToTx );
+		 }
+     }
+ }
+ * \defgroup crQUEUE_RECEIVE_FROM_ISR crQUEUE_RECEIVE_FROM_ISR + * \ingroup Tasks + */ +#define crQUEUE_RECEIVE_FROM_ISR( pxQueue, pvBuffer, pxCoRoutineWoken ) xQueueCRReceiveFromISR( ( pxQueue ), ( pvBuffer ), ( pxCoRoutineWoken ) ) + +/* + * This function is intended for internal use by the co-routine macros only. + * The macro nature of the co-routine implementation requires that the + * prototype appears here. The function should not be used by application + * writers. + * + * Removes the current co-routine from its ready list and places it in the + * appropriate delayed list. + */ +void vCoRoutineAddToDelayedList( TickType_t xTicksToDelay, List_t *pxEventList ); + +/* + * This function is intended for internal use by the queue implementation only. + * The function should not be used by application writers. + * + * Removes the highest priority co-routine from the event list and places it in + * the pending ready list. + */ +BaseType_t xCoRoutineRemoveFromEventList( const List_t *pxEventList ); + +#ifdef __cplusplus +} +#endif + +#endif /* CO_ROUTINE_H */ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/include/deprecated_definitions.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/include/deprecated_definitions.h new file mode 100644 index 0000000..681998c --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/include/deprecated_definitions.h @@ -0,0 +1,321 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef DEPRECATED_DEFINITIONS_H +#define DEPRECATED_DEFINITIONS_H + + +/* Each FreeRTOS port has a unique portmacro.h header file. Originally a +pre-processor definition was used to ensure the pre-processor found the correct +portmacro.h file for the port being used. That scheme was deprecated in favour +of setting the compiler's include path such that it found the correct +portmacro.h file - removing the need for the constant and allowing the +portmacro.h file to be located anywhere in relation to the port being used. The +definitions below remain in the code for backward compatibility only. New +projects should not use them. */ + +#ifdef OPEN_WATCOM_INDUSTRIAL_PC_PORT + #include "..\..\Source\portable\owatcom\16bitdos\pc\portmacro.h" + typedef void ( __interrupt __far *pxISR )(); +#endif + +#ifdef OPEN_WATCOM_FLASH_LITE_186_PORT + #include "..\..\Source\portable\owatcom\16bitdos\flsh186\portmacro.h" + typedef void ( __interrupt __far *pxISR )(); +#endif + +#ifdef GCC_MEGA_AVR + #include "../portable/GCC/ATMega323/portmacro.h" +#endif + +#ifdef IAR_MEGA_AVR + #include "../portable/IAR/ATMega323/portmacro.h" +#endif + +#ifdef MPLAB_PIC24_PORT + #include "../../Source/portable/MPLAB/PIC24_dsPIC/portmacro.h" +#endif + +#ifdef MPLAB_DSPIC_PORT + #include "../../Source/portable/MPLAB/PIC24_dsPIC/portmacro.h" +#endif + +#ifdef MPLAB_PIC18F_PORT + #include "../../Source/portable/MPLAB/PIC18F/portmacro.h" +#endif + +#ifdef MPLAB_PIC32MX_PORT + #include "../../Source/portable/MPLAB/PIC32MX/portmacro.h" +#endif + +#ifdef _FEDPICC + #include "libFreeRTOS/Include/portmacro.h" +#endif + +#ifdef SDCC_CYGNAL + #include "../../Source/portable/SDCC/Cygnal/portmacro.h" +#endif + +#ifdef GCC_ARM7 + #include "../../Source/portable/GCC/ARM7_LPC2000/portmacro.h" +#endif + +#ifdef GCC_ARM7_ECLIPSE + #include "portmacro.h" +#endif + +#ifdef ROWLEY_LPC23xx + #include "../../Source/portable/GCC/ARM7_LPC23xx/portmacro.h" +#endif + +#ifdef IAR_MSP430 + #include "..\..\Source\portable\IAR\MSP430\portmacro.h" +#endif + +#ifdef GCC_MSP430 + #include "../../Source/portable/GCC/MSP430F449/portmacro.h" +#endif + +#ifdef ROWLEY_MSP430 + #include "../../Source/portable/Rowley/MSP430F449/portmacro.h" +#endif + +#ifdef ARM7_LPC21xx_KEIL_RVDS + #include "..\..\Source\portable\RVDS\ARM7_LPC21xx\portmacro.h" +#endif + +#ifdef SAM7_GCC + #include "../../Source/portable/GCC/ARM7_AT91SAM7S/portmacro.h" +#endif + +#ifdef SAM7_IAR + #include "..\..\Source\portable\IAR\AtmelSAM7S64\portmacro.h" +#endif + +#ifdef SAM9XE_IAR + #include "..\..\Source\portable\IAR\AtmelSAM9XE\portmacro.h" +#endif + +#ifdef LPC2000_IAR + #include "..\..\Source\portable\IAR\LPC2000\portmacro.h" +#endif + +#ifdef STR71X_IAR + #include "..\..\Source\portable\IAR\STR71x\portmacro.h" +#endif + +#ifdef STR75X_IAR + #include "..\..\Source\portable\IAR\STR75x\portmacro.h" +#endif + +#ifdef STR75X_GCC + #include "..\..\Source\portable\GCC\STR75x\portmacro.h" +#endif + +#ifdef STR91X_IAR + #include "..\..\Source\portable\IAR\STR91x\portmacro.h" +#endif + +#ifdef GCC_H8S + #include "../../Source/portable/GCC/H8S2329/portmacro.h" +#endif + +#ifdef GCC_AT91FR40008 + #include "../../Source/portable/GCC/ARM7_AT91FR40008/portmacro.h" +#endif + +#ifdef RVDS_ARMCM3_LM3S102 + #include "../../Source/portable/RVDS/ARM_CM3/portmacro.h" +#endif + +#ifdef GCC_ARMCM3_LM3S102 + #include "../../Source/portable/GCC/ARM_CM3/portmacro.h" +#endif + +#ifdef GCC_ARMCM3 + #include "../../Source/portable/GCC/ARM_CM3/portmacro.h" +#endif + +#ifdef IAR_ARM_CM3 + #include "../../Source/portable/IAR/ARM_CM3/portmacro.h" +#endif + +#ifdef IAR_ARMCM3_LM + #include "../../Source/portable/IAR/ARM_CM3/portmacro.h" +#endif + +#ifdef HCS12_CODE_WARRIOR + #include "../../Source/portable/CodeWarrior/HCS12/portmacro.h" +#endif + +#ifdef MICROBLAZE_GCC + #include "../../Source/portable/GCC/MicroBlaze/portmacro.h" +#endif + +#ifdef TERN_EE + #include "..\..\Source\portable\Paradigm\Tern_EE\small\portmacro.h" +#endif + +#ifdef GCC_HCS12 + #include "../../Source/portable/GCC/HCS12/portmacro.h" +#endif + +#ifdef GCC_MCF5235 + #include "../../Source/portable/GCC/MCF5235/portmacro.h" +#endif + +#ifdef COLDFIRE_V2_GCC + #include "../../../Source/portable/GCC/ColdFire_V2/portmacro.h" +#endif + +#ifdef COLDFIRE_V2_CODEWARRIOR + #include "../../Source/portable/CodeWarrior/ColdFire_V2/portmacro.h" +#endif + +#ifdef GCC_PPC405 + #include "../../Source/portable/GCC/PPC405_Xilinx/portmacro.h" +#endif + +#ifdef GCC_PPC440 + #include "../../Source/portable/GCC/PPC440_Xilinx/portmacro.h" +#endif + +#ifdef _16FX_SOFTUNE + #include "..\..\Source\portable\Softune\MB96340\portmacro.h" +#endif + +#ifdef BCC_INDUSTRIAL_PC_PORT + /* A short file name has to be used in place of the normal + FreeRTOSConfig.h when using the Borland compiler. */ + #include "frconfig.h" + #include "..\portable\BCC\16BitDOS\PC\prtmacro.h" + typedef void ( __interrupt __far *pxISR )(); +#endif + +#ifdef BCC_FLASH_LITE_186_PORT + /* A short file name has to be used in place of the normal + FreeRTOSConfig.h when using the Borland compiler. */ + #include "frconfig.h" + #include "..\portable\BCC\16BitDOS\flsh186\prtmacro.h" + typedef void ( __interrupt __far *pxISR )(); +#endif + +#ifdef __GNUC__ + #ifdef __AVR32_AVR32A__ + #include "portmacro.h" + #endif +#endif + +#ifdef __ICCAVR32__ + #ifdef __CORE__ + #if __CORE__ == __AVR32A__ + #include "portmacro.h" + #endif + #endif +#endif + +#ifdef __91467D + #include "portmacro.h" +#endif + +#ifdef __96340 + #include "portmacro.h" +#endif + + +#ifdef __IAR_V850ES_Fx3__ + #include "../../Source/portable/IAR/V850ES/portmacro.h" +#endif + +#ifdef __IAR_V850ES_Jx3__ + #include "../../Source/portable/IAR/V850ES/portmacro.h" +#endif + +#ifdef __IAR_V850ES_Jx3_L__ + #include "../../Source/portable/IAR/V850ES/portmacro.h" +#endif + +#ifdef __IAR_V850ES_Jx2__ + #include "../../Source/portable/IAR/V850ES/portmacro.h" +#endif + +#ifdef __IAR_V850ES_Hx2__ + #include "../../Source/portable/IAR/V850ES/portmacro.h" +#endif + +#ifdef __IAR_78K0R_Kx3__ + #include "../../Source/portable/IAR/78K0R/portmacro.h" +#endif + +#ifdef __IAR_78K0R_Kx3L__ + #include "../../Source/portable/IAR/78K0R/portmacro.h" +#endif + +#endif /* DEPRECATED_DEFINITIONS_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/include/event_groups.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/include/event_groups.h new file mode 100644 index 0000000..bcb3b23 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/include/event_groups.h @@ -0,0 +1,797 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef EVENT_GROUPS_H +#define EVENT_GROUPS_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h" must appear in source files before "include event_groups.h" +#endif + +/* FreeRTOS includes. */ +#include "timers.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * An event group is a collection of bits to which an application can assign a + * meaning. For example, an application may create an event group to convey + * the status of various CAN bus related events in which bit 0 might mean "A CAN + * message has been received and is ready for processing", bit 1 might mean "The + * application has queued a message that is ready for sending onto the CAN + * network", and bit 2 might mean "It is time to send a SYNC message onto the + * CAN network" etc. A task can then test the bit values to see which events + * are active, and optionally enter the Blocked state to wait for a specified + * bit or a group of specified bits to be active. To continue the CAN bus + * example, a CAN controlling task can enter the Blocked state (and therefore + * not consume any processing time) until either bit 0, bit 1 or bit 2 are + * active, at which time the bit that was actually active would inform the task + * which action it had to take (process a received message, send a message, or + * send a SYNC). + * + * The event groups implementation contains intelligence to avoid race + * conditions that would otherwise occur were an application to use a simple + * variable for the same purpose. This is particularly important with respect + * to when a bit within an event group is to be cleared, and when bits have to + * be set and then tested atomically - as is the case where event groups are + * used to create a synchronisation point between multiple tasks (a + * 'rendezvous'). + * + * \defgroup EventGroup + */ + + + +/** + * event_groups.h + * + * Type by which event groups are referenced. For example, a call to + * xEventGroupCreate() returns an EventGroupHandle_t variable that can then + * be used as a parameter to other event group functions. + * + * \defgroup EventGroupHandle_t EventGroupHandle_t + * \ingroup EventGroup + */ +typedef void * EventGroupHandle_t; + +/* + * The type that holds event bits always matches TickType_t - therefore the + * number of bits it holds is set by configUSE_16_BIT_TICKS (16 bits if set to 1, + * 32 bits if set to 0. + * + * \defgroup EventBits_t EventBits_t + * \ingroup EventGroup + */ +typedef TickType_t EventBits_t; + +/** + * event_groups.h + *
+ EventGroupHandle_t xEventGroupCreate( void );
+ 
+ * + * Create a new event group. + * + * Internally, within the FreeRTOS implementation, event groups use a [small] + * block of memory, in which the event group's structure is stored. If an event + * groups is created using xEventGropuCreate() then the required memory is + * automatically dynamically allocated inside the xEventGroupCreate() function. + * (see http://www.freertos.org/a00111.html). If an event group is created + * using xEventGropuCreateStatic() then the application writer must instead + * provide the memory that will get used by the event group. + * xEventGroupCreateStatic() therefore allows an event group to be created + * without using any dynamic memory allocation. + * + * Although event groups are not related to ticks, for internal implementation + * reasons the number of bits available for use in an event group is dependent + * on the configUSE_16_BIT_TICKS setting in FreeRTOSConfig.h. If + * configUSE_16_BIT_TICKS is 1 then each event group contains 8 usable bits (bit + * 0 to bit 7). If configUSE_16_BIT_TICKS is set to 0 then each event group has + * 24 usable bits (bit 0 to bit 23). The EventBits_t type is used to store + * event bits within an event group. + * + * @return If the event group was created then a handle to the event group is + * returned. If there was insufficient FreeRTOS heap available to create the + * event group then NULL is returned. See http://www.freertos.org/a00111.html + * + * Example usage: +
+	// Declare a variable to hold the created event group.
+	EventGroupHandle_t xCreatedEventGroup;
+
+	// Attempt to create the event group.
+	xCreatedEventGroup = xEventGroupCreate();
+
+	// Was the event group created successfully?
+	if( xCreatedEventGroup == NULL )
+	{
+		// The event group was not created because there was insufficient
+		// FreeRTOS heap available.
+	}
+	else
+	{
+		// The event group was created.
+	}
+   
+ * \defgroup xEventGroupCreate xEventGroupCreate + * \ingroup EventGroup + */ +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + EventGroupHandle_t xEventGroupCreate( void ) PRIVILEGED_FUNCTION; +#endif + +/** + * event_groups.h + *
+ EventGroupHandle_t xEventGroupCreateStatic( EventGroupHandle_t * pxEventGroupBuffer );
+ 
+ * + * Create a new event group. + * + * Internally, within the FreeRTOS implementation, event groups use a [small] + * block of memory, in which the event group's structure is stored. If an event + * groups is created using xEventGropuCreate() then the required memory is + * automatically dynamically allocated inside the xEventGroupCreate() function. + * (see http://www.freertos.org/a00111.html). If an event group is created + * using xEventGropuCreateStatic() then the application writer must instead + * provide the memory that will get used by the event group. + * xEventGroupCreateStatic() therefore allows an event group to be created + * without using any dynamic memory allocation. + * + * Although event groups are not related to ticks, for internal implementation + * reasons the number of bits available for use in an event group is dependent + * on the configUSE_16_BIT_TICKS setting in FreeRTOSConfig.h. If + * configUSE_16_BIT_TICKS is 1 then each event group contains 8 usable bits (bit + * 0 to bit 7). If configUSE_16_BIT_TICKS is set to 0 then each event group has + * 24 usable bits (bit 0 to bit 23). The EventBits_t type is used to store + * event bits within an event group. + * + * @param pxEventGroupBuffer pxEventGroupBuffer must point to a variable of type + * StaticEventGroup_t, which will be then be used to hold the event group's data + * structures, removing the need for the memory to be allocated dynamically. + * + * @return If the event group was created then a handle to the event group is + * returned. If pxEventGroupBuffer was NULL then NULL is returned. + * + * Example usage: +
+	// StaticEventGroup_t is a publicly accessible structure that has the same
+	// size and alignment requirements as the real event group structure.  It is
+	// provided as a mechanism for applications to know the size of the event
+	// group (which is dependent on the architecture and configuration file
+	// settings) without breaking the strict data hiding policy by exposing the
+	// real event group internals.  This StaticEventGroup_t variable is passed
+	// into the xSemaphoreCreateEventGroupStatic() function and is used to store
+	// the event group's data structures
+	StaticEventGroup_t xEventGroupBuffer;
+
+	// Create the event group without dynamically allocating any memory.
+	xEventGroup = xEventGroupCreateStatic( &xEventGroupBuffer );
+   
+ */ +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + EventGroupHandle_t xEventGroupCreateStatic( StaticEventGroup_t *pxEventGroupBuffer ) PRIVILEGED_FUNCTION; +#endif + +/** + * event_groups.h + *
+	EventBits_t xEventGroupWaitBits( 	EventGroupHandle_t xEventGroup,
+										const EventBits_t uxBitsToWaitFor,
+										const BaseType_t xClearOnExit,
+										const BaseType_t xWaitForAllBits,
+										const TickType_t xTicksToWait );
+ 
+ * + * [Potentially] block to wait for one or more bits to be set within a + * previously created event group. + * + * This function cannot be called from an interrupt. + * + * @param xEventGroup The event group in which the bits are being tested. The + * event group must have previously been created using a call to + * xEventGroupCreate(). + * + * @param uxBitsToWaitFor A bitwise value that indicates the bit or bits to test + * inside the event group. For example, to wait for bit 0 and/or bit 2 set + * uxBitsToWaitFor to 0x05. To wait for bits 0 and/or bit 1 and/or bit 2 set + * uxBitsToWaitFor to 0x07. Etc. + * + * @param xClearOnExit If xClearOnExit is set to pdTRUE then any bits within + * uxBitsToWaitFor that are set within the event group will be cleared before + * xEventGroupWaitBits() returns if the wait condition was met (if the function + * returns for a reason other than a timeout). If xClearOnExit is set to + * pdFALSE then the bits set in the event group are not altered when the call to + * xEventGroupWaitBits() returns. + * + * @param xWaitForAllBits If xWaitForAllBits is set to pdTRUE then + * xEventGroupWaitBits() will return when either all the bits in uxBitsToWaitFor + * are set or the specified block time expires. If xWaitForAllBits is set to + * pdFALSE then xEventGroupWaitBits() will return when any one of the bits set + * in uxBitsToWaitFor is set or the specified block time expires. The block + * time is specified by the xTicksToWait parameter. + * + * @param xTicksToWait The maximum amount of time (specified in 'ticks') to wait + * for one/all (depending on the xWaitForAllBits value) of the bits specified by + * uxBitsToWaitFor to become set. + * + * @return The value of the event group at the time either the bits being waited + * for became set, or the block time expired. Test the return value to know + * which bits were set. If xEventGroupWaitBits() returned because its timeout + * expired then not all the bits being waited for will be set. If + * xEventGroupWaitBits() returned because the bits it was waiting for were set + * then the returned value is the event group value before any bits were + * automatically cleared in the case that xClearOnExit parameter was set to + * pdTRUE. + * + * Example usage: +
+   #define BIT_0	( 1 << 0 )
+   #define BIT_4	( 1 << 4 )
+
+   void aFunction( EventGroupHandle_t xEventGroup )
+   {
+   EventBits_t uxBits;
+   const TickType_t xTicksToWait = 100 / portTICK_PERIOD_MS;
+
+		// Wait a maximum of 100ms for either bit 0 or bit 4 to be set within
+		// the event group.  Clear the bits before exiting.
+		uxBits = xEventGroupWaitBits(
+					xEventGroup,	// The event group being tested.
+					BIT_0 | BIT_4,	// The bits within the event group to wait for.
+					pdTRUE,			// BIT_0 and BIT_4 should be cleared before returning.
+					pdFALSE,		// Don't wait for both bits, either bit will do.
+					xTicksToWait );	// Wait a maximum of 100ms for either bit to be set.
+
+		if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) )
+		{
+			// xEventGroupWaitBits() returned because both bits were set.
+		}
+		else if( ( uxBits & BIT_0 ) != 0 )
+		{
+			// xEventGroupWaitBits() returned because just BIT_0 was set.
+		}
+		else if( ( uxBits & BIT_4 ) != 0 )
+		{
+			// xEventGroupWaitBits() returned because just BIT_4 was set.
+		}
+		else
+		{
+			// xEventGroupWaitBits() returned because xTicksToWait ticks passed
+			// without either BIT_0 or BIT_4 becoming set.
+		}
+   }
+   
+ * \defgroup xEventGroupWaitBits xEventGroupWaitBits + * \ingroup EventGroup + */ +EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToWaitFor, const BaseType_t xClearOnExit, const BaseType_t xWaitForAllBits, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +/** + * event_groups.h + *
+	EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear );
+ 
+ * + * Clear bits within an event group. This function cannot be called from an + * interrupt. + * + * @param xEventGroup The event group in which the bits are to be cleared. + * + * @param uxBitsToClear A bitwise value that indicates the bit or bits to clear + * in the event group. For example, to clear bit 3 only, set uxBitsToClear to + * 0x08. To clear bit 3 and bit 0 set uxBitsToClear to 0x09. + * + * @return The value of the event group before the specified bits were cleared. + * + * Example usage: +
+   #define BIT_0	( 1 << 0 )
+   #define BIT_4	( 1 << 4 )
+
+   void aFunction( EventGroupHandle_t xEventGroup )
+   {
+   EventBits_t uxBits;
+
+		// Clear bit 0 and bit 4 in xEventGroup.
+		uxBits = xEventGroupClearBits(
+								xEventGroup,	// The event group being updated.
+								BIT_0 | BIT_4 );// The bits being cleared.
+
+		if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) )
+		{
+			// Both bit 0 and bit 4 were set before xEventGroupClearBits() was
+			// called.  Both will now be clear (not set).
+		}
+		else if( ( uxBits & BIT_0 ) != 0 )
+		{
+			// Bit 0 was set before xEventGroupClearBits() was called.  It will
+			// now be clear.
+		}
+		else if( ( uxBits & BIT_4 ) != 0 )
+		{
+			// Bit 4 was set before xEventGroupClearBits() was called.  It will
+			// now be clear.
+		}
+		else
+		{
+			// Neither bit 0 nor bit 4 were set in the first place.
+		}
+   }
+   
+ * \defgroup xEventGroupClearBits xEventGroupClearBits + * \ingroup EventGroup + */ +EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear ) PRIVILEGED_FUNCTION; + +/** + * event_groups.h + *
+	BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet );
+ 
+ * + * A version of xEventGroupClearBits() that can be called from an interrupt. + * + * Setting bits in an event group is not a deterministic operation because there + * are an unknown number of tasks that may be waiting for the bit or bits being + * set. FreeRTOS does not allow nondeterministic operations to be performed + * while interrupts are disabled, so protects event groups that are accessed + * from tasks by suspending the scheduler rather than disabling interrupts. As + * a result event groups cannot be accessed directly from an interrupt service + * routine. Therefore xEventGroupClearBitsFromISR() sends a message to the + * timer task to have the clear operation performed in the context of the timer + * task. + * + * @param xEventGroup The event group in which the bits are to be cleared. + * + * @param uxBitsToClear A bitwise value that indicates the bit or bits to clear. + * For example, to clear bit 3 only, set uxBitsToClear to 0x08. To clear bit 3 + * and bit 0 set uxBitsToClear to 0x09. + * + * @return If the request to execute the function was posted successfully then + * pdPASS is returned, otherwise pdFALSE is returned. pdFALSE will be returned + * if the timer service queue was full. + * + * Example usage: +
+   #define BIT_0	( 1 << 0 )
+   #define BIT_4	( 1 << 4 )
+
+   // An event group which it is assumed has already been created by a call to
+   // xEventGroupCreate().
+   EventGroupHandle_t xEventGroup;
+
+   void anInterruptHandler( void )
+   {
+		// Clear bit 0 and bit 4 in xEventGroup.
+		xResult = xEventGroupClearBitsFromISR(
+							xEventGroup,	 // The event group being updated.
+							BIT_0 | BIT_4 ); // The bits being set.
+
+		if( xResult == pdPASS )
+		{
+			// The message was posted successfully.
+		}
+  }
+   
+ * \defgroup xEventGroupClearBitsFromISR xEventGroupClearBitsFromISR + * \ingroup EventGroup + */ +#if( configUSE_TRACE_FACILITY == 1 ) + BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet ) PRIVILEGED_FUNCTION; +#else + #define xEventGroupClearBitsFromISR( xEventGroup, uxBitsToClear ) xTimerPendFunctionCallFromISR( vEventGroupClearBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToClear, NULL ) +#endif + +/** + * event_groups.h + *
+	EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet );
+ 
+ * + * Set bits within an event group. + * This function cannot be called from an interrupt. xEventGroupSetBitsFromISR() + * is a version that can be called from an interrupt. + * + * Setting bits in an event group will automatically unblock tasks that are + * blocked waiting for the bits. + * + * @param xEventGroup The event group in which the bits are to be set. + * + * @param uxBitsToSet A bitwise value that indicates the bit or bits to set. + * For example, to set bit 3 only, set uxBitsToSet to 0x08. To set bit 3 + * and bit 0 set uxBitsToSet to 0x09. + * + * @return The value of the event group at the time the call to + * xEventGroupSetBits() returns. There are two reasons why the returned value + * might have the bits specified by the uxBitsToSet parameter cleared. First, + * if setting a bit results in a task that was waiting for the bit leaving the + * blocked state then it is possible the bit will be cleared automatically + * (see the xClearBitOnExit parameter of xEventGroupWaitBits()). Second, any + * unblocked (or otherwise Ready state) task that has a priority above that of + * the task that called xEventGroupSetBits() will execute and may change the + * event group value before the call to xEventGroupSetBits() returns. + * + * Example usage: +
+   #define BIT_0	( 1 << 0 )
+   #define BIT_4	( 1 << 4 )
+
+   void aFunction( EventGroupHandle_t xEventGroup )
+   {
+   EventBits_t uxBits;
+
+		// Set bit 0 and bit 4 in xEventGroup.
+		uxBits = xEventGroupSetBits(
+							xEventGroup,	// The event group being updated.
+							BIT_0 | BIT_4 );// The bits being set.
+
+		if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) )
+		{
+			// Both bit 0 and bit 4 remained set when the function returned.
+		}
+		else if( ( uxBits & BIT_0 ) != 0 )
+		{
+			// Bit 0 remained set when the function returned, but bit 4 was
+			// cleared.  It might be that bit 4 was cleared automatically as a
+			// task that was waiting for bit 4 was removed from the Blocked
+			// state.
+		}
+		else if( ( uxBits & BIT_4 ) != 0 )
+		{
+			// Bit 4 remained set when the function returned, but bit 0 was
+			// cleared.  It might be that bit 0 was cleared automatically as a
+			// task that was waiting for bit 0 was removed from the Blocked
+			// state.
+		}
+		else
+		{
+			// Neither bit 0 nor bit 4 remained set.  It might be that a task
+			// was waiting for both of the bits to be set, and the bits were
+			// cleared as the task left the Blocked state.
+		}
+   }
+   
+ * \defgroup xEventGroupSetBits xEventGroupSetBits + * \ingroup EventGroup + */ +EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet ) PRIVILEGED_FUNCTION; + +/** + * event_groups.h + *
+	BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, BaseType_t *pxHigherPriorityTaskWoken );
+ 
+ * + * A version of xEventGroupSetBits() that can be called from an interrupt. + * + * Setting bits in an event group is not a deterministic operation because there + * are an unknown number of tasks that may be waiting for the bit or bits being + * set. FreeRTOS does not allow nondeterministic operations to be performed in + * interrupts or from critical sections. Therefore xEventGroupSetBitsFromISR() + * sends a message to the timer task to have the set operation performed in the + * context of the timer task - where a scheduler lock is used in place of a + * critical section. + * + * @param xEventGroup The event group in which the bits are to be set. + * + * @param uxBitsToSet A bitwise value that indicates the bit or bits to set. + * For example, to set bit 3 only, set uxBitsToSet to 0x08. To set bit 3 + * and bit 0 set uxBitsToSet to 0x09. + * + * @param pxHigherPriorityTaskWoken As mentioned above, calling this function + * will result in a message being sent to the timer daemon task. If the + * priority of the timer daemon task is higher than the priority of the + * currently running task (the task the interrupt interrupted) then + * *pxHigherPriorityTaskWoken will be set to pdTRUE by + * xEventGroupSetBitsFromISR(), indicating that a context switch should be + * requested before the interrupt exits. For that reason + * *pxHigherPriorityTaskWoken must be initialised to pdFALSE. See the + * example code below. + * + * @return If the request to execute the function was posted successfully then + * pdPASS is returned, otherwise pdFALSE is returned. pdFALSE will be returned + * if the timer service queue was full. + * + * Example usage: +
+   #define BIT_0	( 1 << 0 )
+   #define BIT_4	( 1 << 4 )
+
+   // An event group which it is assumed has already been created by a call to
+   // xEventGroupCreate().
+   EventGroupHandle_t xEventGroup;
+
+   void anInterruptHandler( void )
+   {
+   BaseType_t xHigherPriorityTaskWoken, xResult;
+
+		// xHigherPriorityTaskWoken must be initialised to pdFALSE.
+		xHigherPriorityTaskWoken = pdFALSE;
+
+		// Set bit 0 and bit 4 in xEventGroup.
+		xResult = xEventGroupSetBitsFromISR(
+							xEventGroup,	// The event group being updated.
+							BIT_0 | BIT_4   // The bits being set.
+							&xHigherPriorityTaskWoken );
+
+		// Was the message posted successfully?
+		if( xResult == pdPASS )
+		{
+			// If xHigherPriorityTaskWoken is now set to pdTRUE then a context
+			// switch should be requested.  The macro used is port specific and
+			// will be either portYIELD_FROM_ISR() or portEND_SWITCHING_ISR() -
+			// refer to the documentation page for the port being used.
+			portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
+		}
+  }
+   
+ * \defgroup xEventGroupSetBitsFromISR xEventGroupSetBitsFromISR + * \ingroup EventGroup + */ +#if( configUSE_TRACE_FACILITY == 1 ) + BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, BaseType_t *pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; +#else + #define xEventGroupSetBitsFromISR( xEventGroup, uxBitsToSet, pxHigherPriorityTaskWoken ) xTimerPendFunctionCallFromISR( vEventGroupSetBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToSet, pxHigherPriorityTaskWoken ) +#endif + +/** + * event_groups.h + *
+	EventBits_t xEventGroupSync(	EventGroupHandle_t xEventGroup,
+									const EventBits_t uxBitsToSet,
+									const EventBits_t uxBitsToWaitFor,
+									TickType_t xTicksToWait );
+ 
+ * + * Atomically set bits within an event group, then wait for a combination of + * bits to be set within the same event group. This functionality is typically + * used to synchronise multiple tasks, where each task has to wait for the other + * tasks to reach a synchronisation point before proceeding. + * + * This function cannot be used from an interrupt. + * + * The function will return before its block time expires if the bits specified + * by the uxBitsToWait parameter are set, or become set within that time. In + * this case all the bits specified by uxBitsToWait will be automatically + * cleared before the function returns. + * + * @param xEventGroup The event group in which the bits are being tested. The + * event group must have previously been created using a call to + * xEventGroupCreate(). + * + * @param uxBitsToSet The bits to set in the event group before determining + * if, and possibly waiting for, all the bits specified by the uxBitsToWait + * parameter are set. + * + * @param uxBitsToWaitFor A bitwise value that indicates the bit or bits to test + * inside the event group. For example, to wait for bit 0 and bit 2 set + * uxBitsToWaitFor to 0x05. To wait for bits 0 and bit 1 and bit 2 set + * uxBitsToWaitFor to 0x07. Etc. + * + * @param xTicksToWait The maximum amount of time (specified in 'ticks') to wait + * for all of the bits specified by uxBitsToWaitFor to become set. + * + * @return The value of the event group at the time either the bits being waited + * for became set, or the block time expired. Test the return value to know + * which bits were set. If xEventGroupSync() returned because its timeout + * expired then not all the bits being waited for will be set. If + * xEventGroupSync() returned because all the bits it was waiting for were + * set then the returned value is the event group value before any bits were + * automatically cleared. + * + * Example usage: +
+ // Bits used by the three tasks.
+ #define TASK_0_BIT		( 1 << 0 )
+ #define TASK_1_BIT		( 1 << 1 )
+ #define TASK_2_BIT		( 1 << 2 )
+
+ #define ALL_SYNC_BITS ( TASK_0_BIT | TASK_1_BIT | TASK_2_BIT )
+
+ // Use an event group to synchronise three tasks.  It is assumed this event
+ // group has already been created elsewhere.
+ EventGroupHandle_t xEventBits;
+
+ void vTask0( void *pvParameters )
+ {
+ EventBits_t uxReturn;
+ TickType_t xTicksToWait = 100 / portTICK_PERIOD_MS;
+
+	 for( ;; )
+	 {
+		// Perform task functionality here.
+
+		// Set bit 0 in the event flag to note this task has reached the
+		// sync point.  The other two tasks will set the other two bits defined
+		// by ALL_SYNC_BITS.  All three tasks have reached the synchronisation
+		// point when all the ALL_SYNC_BITS are set.  Wait a maximum of 100ms
+		// for this to happen.
+		uxReturn = xEventGroupSync( xEventBits, TASK_0_BIT, ALL_SYNC_BITS, xTicksToWait );
+
+		if( ( uxReturn & ALL_SYNC_BITS ) == ALL_SYNC_BITS )
+		{
+			// All three tasks reached the synchronisation point before the call
+			// to xEventGroupSync() timed out.
+		}
+	}
+ }
+
+ void vTask1( void *pvParameters )
+ {
+	 for( ;; )
+	 {
+		// Perform task functionality here.
+
+		// Set bit 1 in the event flag to note this task has reached the
+		// synchronisation point.  The other two tasks will set the other two
+		// bits defined by ALL_SYNC_BITS.  All three tasks have reached the
+		// synchronisation point when all the ALL_SYNC_BITS are set.  Wait
+		// indefinitely for this to happen.
+		xEventGroupSync( xEventBits, TASK_1_BIT, ALL_SYNC_BITS, portMAX_DELAY );
+
+		// xEventGroupSync() was called with an indefinite block time, so
+		// this task will only reach here if the syncrhonisation was made by all
+		// three tasks, so there is no need to test the return value.
+	 }
+ }
+
+ void vTask2( void *pvParameters )
+ {
+	 for( ;; )
+	 {
+		// Perform task functionality here.
+
+		// Set bit 2 in the event flag to note this task has reached the
+		// synchronisation point.  The other two tasks will set the other two
+		// bits defined by ALL_SYNC_BITS.  All three tasks have reached the
+		// synchronisation point when all the ALL_SYNC_BITS are set.  Wait
+		// indefinitely for this to happen.
+		xEventGroupSync( xEventBits, TASK_2_BIT, ALL_SYNC_BITS, portMAX_DELAY );
+
+		// xEventGroupSync() was called with an indefinite block time, so
+		// this task will only reach here if the syncrhonisation was made by all
+		// three tasks, so there is no need to test the return value.
+	}
+ }
+
+ 
+ * \defgroup xEventGroupSync xEventGroupSync + * \ingroup EventGroup + */ +EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, const EventBits_t uxBitsToWaitFor, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + + +/** + * event_groups.h + *
+	EventBits_t xEventGroupGetBits( EventGroupHandle_t xEventGroup );
+ 
+ * + * Returns the current value of the bits in an event group. This function + * cannot be used from an interrupt. + * + * @param xEventGroup The event group being queried. + * + * @return The event group bits at the time xEventGroupGetBits() was called. + * + * \defgroup xEventGroupGetBits xEventGroupGetBits + * \ingroup EventGroup + */ +#define xEventGroupGetBits( xEventGroup ) xEventGroupClearBits( xEventGroup, 0 ) + +/** + * event_groups.h + *
+	EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup );
+ 
+ * + * A version of xEventGroupGetBits() that can be called from an ISR. + * + * @param xEventGroup The event group being queried. + * + * @return The event group bits at the time xEventGroupGetBitsFromISR() was called. + * + * \defgroup xEventGroupGetBitsFromISR xEventGroupGetBitsFromISR + * \ingroup EventGroup + */ +EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup ) PRIVILEGED_FUNCTION; + +/** + * event_groups.h + *
+	void xEventGroupDelete( EventGroupHandle_t xEventGroup );
+ 
+ * + * Delete an event group that was previously created by a call to + * xEventGroupCreate(). Tasks that are blocked on the event group will be + * unblocked and obtain 0 as the event group's value. + * + * @param xEventGroup The event group being deleted. + */ +void vEventGroupDelete( EventGroupHandle_t xEventGroup ) PRIVILEGED_FUNCTION; + +/* For internal use only. */ +void vEventGroupSetBitsCallback( void *pvEventGroup, const uint32_t ulBitsToSet ) PRIVILEGED_FUNCTION; +void vEventGroupClearBitsCallback( void *pvEventGroup, const uint32_t ulBitsToClear ) PRIVILEGED_FUNCTION; + + +#if (configUSE_TRACE_FACILITY == 1) + UBaseType_t uxEventGroupGetNumber( void* xEventGroup ) PRIVILEGED_FUNCTION; +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* EVENT_GROUPS_H */ + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/include/list.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/include/list.h new file mode 100644 index 0000000..cde5453 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/include/list.h @@ -0,0 +1,453 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* + * This is the list implementation used by the scheduler. While it is tailored + * heavily for the schedulers needs, it is also available for use by + * application code. + * + * list_ts can only store pointers to list_item_ts. Each ListItem_t contains a + * numeric value (xItemValue). Most of the time the lists are sorted in + * descending item value order. + * + * Lists are created already containing one list item. The value of this + * item is the maximum possible that can be stored, it is therefore always at + * the end of the list and acts as a marker. The list member pxHead always + * points to this marker - even though it is at the tail of the list. This + * is because the tail contains a wrap back pointer to the true head of + * the list. + * + * In addition to it's value, each list item contains a pointer to the next + * item in the list (pxNext), a pointer to the list it is in (pxContainer) + * and a pointer to back to the object that contains it. These later two + * pointers are included for efficiency of list manipulation. There is + * effectively a two way link between the object containing the list item and + * the list item itself. + * + * + * \page ListIntroduction List Implementation + * \ingroup FreeRTOSIntro + */ + +#ifndef INC_FREERTOS_H + #error FreeRTOS.h must be included before list.h +#endif + +#ifndef LIST_H +#define LIST_H + +/* + * The list structure members are modified from within interrupts, and therefore + * by rights should be declared volatile. However, they are only modified in a + * functionally atomic way (within critical sections of with the scheduler + * suspended) and are either passed by reference into a function or indexed via + * a volatile variable. Therefore, in all use cases tested so far, the volatile + * qualifier can be omitted in order to provide a moderate performance + * improvement without adversely affecting functional behaviour. The assembly + * instructions generated by the IAR, ARM and GCC compilers when the respective + * compiler's options were set for maximum optimisation has been inspected and + * deemed to be as intended. That said, as compiler technology advances, and + * especially if aggressive cross module optimisation is used (a use case that + * has not been exercised to any great extend) then it is feasible that the + * volatile qualifier will be needed for correct optimisation. It is expected + * that a compiler removing essential code because, without the volatile + * qualifier on the list structure members and with aggressive cross module + * optimisation, the compiler deemed the code unnecessary will result in + * complete and obvious failure of the scheduler. If this is ever experienced + * then the volatile qualifier can be inserted in the relevant places within the + * list structures by simply defining configLIST_VOLATILE to volatile in + * FreeRTOSConfig.h (as per the example at the bottom of this comment block). + * If configLIST_VOLATILE is not defined then the preprocessor directives below + * will simply #define configLIST_VOLATILE away completely. + * + * To use volatile list structure members then add the following line to + * FreeRTOSConfig.h (without the quotes): + * "#define configLIST_VOLATILE volatile" + */ +#ifndef configLIST_VOLATILE + #define configLIST_VOLATILE +#endif /* configSUPPORT_CROSS_MODULE_OPTIMISATION */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Macros that can be used to place known values within the list structures, +then check that the known values do not get corrupted during the execution of +the application. These may catch the list data structures being overwritten in +memory. They will not catch data errors caused by incorrect configuration or +use of FreeRTOS.*/ +#if( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 0 ) + /* Define the macros to do nothing. */ + #define listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE + #define listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE + #define listFIRST_LIST_INTEGRITY_CHECK_VALUE + #define listSECOND_LIST_INTEGRITY_CHECK_VALUE + #define listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ) + #define listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ) + #define listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList ) + #define listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList ) + #define listTEST_LIST_ITEM_INTEGRITY( pxItem ) + #define listTEST_LIST_INTEGRITY( pxList ) +#else + /* Define macros that add new members into the list structures. */ + #define listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE TickType_t xListItemIntegrityValue1; + #define listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE TickType_t xListItemIntegrityValue2; + #define listFIRST_LIST_INTEGRITY_CHECK_VALUE TickType_t xListIntegrityValue1; + #define listSECOND_LIST_INTEGRITY_CHECK_VALUE TickType_t xListIntegrityValue2; + + /* Define macros that set the new structure members to known values. */ + #define listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ) ( pxItem )->xListItemIntegrityValue1 = pdINTEGRITY_CHECK_VALUE + #define listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ) ( pxItem )->xListItemIntegrityValue2 = pdINTEGRITY_CHECK_VALUE + #define listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList ) ( pxList )->xListIntegrityValue1 = pdINTEGRITY_CHECK_VALUE + #define listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList ) ( pxList )->xListIntegrityValue2 = pdINTEGRITY_CHECK_VALUE + + /* Define macros that will assert if one of the structure members does not + contain its expected value. */ + #define listTEST_LIST_ITEM_INTEGRITY( pxItem ) configASSERT( ( ( pxItem )->xListItemIntegrityValue1 == pdINTEGRITY_CHECK_VALUE ) && ( ( pxItem )->xListItemIntegrityValue2 == pdINTEGRITY_CHECK_VALUE ) ) + #define listTEST_LIST_INTEGRITY( pxList ) configASSERT( ( ( pxList )->xListIntegrityValue1 == pdINTEGRITY_CHECK_VALUE ) && ( ( pxList )->xListIntegrityValue2 == pdINTEGRITY_CHECK_VALUE ) ) +#endif /* configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES */ + + +/* + * Definition of the only type of object that a list can contain. + */ +struct xLIST_ITEM +{ + listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ + configLIST_VOLATILE TickType_t xItemValue; /*< The value being listed. In most cases this is used to sort the list in descending order. */ + struct xLIST_ITEM * configLIST_VOLATILE pxNext; /*< Pointer to the next ListItem_t in the list. */ + struct xLIST_ITEM * configLIST_VOLATILE pxPrevious; /*< Pointer to the previous ListItem_t in the list. */ + void * pvOwner; /*< Pointer to the object (normally a TCB) that contains the list item. There is therefore a two way link between the object containing the list item and the list item itself. */ + void * configLIST_VOLATILE pvContainer; /*< Pointer to the list in which this list item is placed (if any). */ + listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ +}; +typedef struct xLIST_ITEM ListItem_t; /* For some reason lint wants this as two separate definitions. */ + +struct xMINI_LIST_ITEM +{ + listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ + configLIST_VOLATILE TickType_t xItemValue; + struct xLIST_ITEM * configLIST_VOLATILE pxNext; + struct xLIST_ITEM * configLIST_VOLATILE pxPrevious; +}; +typedef struct xMINI_LIST_ITEM MiniListItem_t; + +/* + * Definition of the type of queue used by the scheduler. + */ +typedef struct xLIST +{ + listFIRST_LIST_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ + configLIST_VOLATILE UBaseType_t uxNumberOfItems; + ListItem_t * configLIST_VOLATILE pxIndex; /*< Used to walk through the list. Points to the last item returned by a call to listGET_OWNER_OF_NEXT_ENTRY (). */ + MiniListItem_t xListEnd; /*< List item that contains the maximum possible item value meaning it is always at the end of the list and is therefore used as a marker. */ + listSECOND_LIST_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ +} List_t; + +/* + * Access macro to set the owner of a list item. The owner of a list item + * is the object (usually a TCB) that contains the list item. + * + * \page listSET_LIST_ITEM_OWNER listSET_LIST_ITEM_OWNER + * \ingroup LinkedList + */ +#define listSET_LIST_ITEM_OWNER( pxListItem, pxOwner ) ( ( pxListItem )->pvOwner = ( void * ) ( pxOwner ) ) + +/* + * Access macro to get the owner of a list item. The owner of a list item + * is the object (usually a TCB) that contains the list item. + * + * \page listSET_LIST_ITEM_OWNER listSET_LIST_ITEM_OWNER + * \ingroup LinkedList + */ +#define listGET_LIST_ITEM_OWNER( pxListItem ) ( ( pxListItem )->pvOwner ) + +/* + * Access macro to set the value of the list item. In most cases the value is + * used to sort the list in descending order. + * + * \page listSET_LIST_ITEM_VALUE listSET_LIST_ITEM_VALUE + * \ingroup LinkedList + */ +#define listSET_LIST_ITEM_VALUE( pxListItem, xValue ) ( ( pxListItem )->xItemValue = ( xValue ) ) + +/* + * Access macro to retrieve the value of the list item. The value can + * represent anything - for example the priority of a task, or the time at + * which a task should be unblocked. + * + * \page listGET_LIST_ITEM_VALUE listGET_LIST_ITEM_VALUE + * \ingroup LinkedList + */ +#define listGET_LIST_ITEM_VALUE( pxListItem ) ( ( pxListItem )->xItemValue ) + +/* + * Access macro to retrieve the value of the list item at the head of a given + * list. + * + * \page listGET_LIST_ITEM_VALUE listGET_LIST_ITEM_VALUE + * \ingroup LinkedList + */ +#define listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxList ) ( ( ( pxList )->xListEnd ).pxNext->xItemValue ) + +/* + * Return the list item at the head of the list. + * + * \page listGET_HEAD_ENTRY listGET_HEAD_ENTRY + * \ingroup LinkedList + */ +#define listGET_HEAD_ENTRY( pxList ) ( ( ( pxList )->xListEnd ).pxNext ) + +/* + * Return the list item at the head of the list. + * + * \page listGET_NEXT listGET_NEXT + * \ingroup LinkedList + */ +#define listGET_NEXT( pxListItem ) ( ( pxListItem )->pxNext ) + +/* + * Return the list item that marks the end of the list + * + * \page listGET_END_MARKER listGET_END_MARKER + * \ingroup LinkedList + */ +#define listGET_END_MARKER( pxList ) ( ( ListItem_t const * ) ( &( ( pxList )->xListEnd ) ) ) + +/* + * Access macro to determine if a list contains any items. The macro will + * only have the value true if the list is empty. + * + * \page listLIST_IS_EMPTY listLIST_IS_EMPTY + * \ingroup LinkedList + */ +#define listLIST_IS_EMPTY( pxList ) ( ( BaseType_t ) ( ( pxList )->uxNumberOfItems == ( UBaseType_t ) 0 ) ) + +/* + * Access macro to return the number of items in the list. + */ +#define listCURRENT_LIST_LENGTH( pxList ) ( ( pxList )->uxNumberOfItems ) + +/* + * Access function to obtain the owner of the next entry in a list. + * + * The list member pxIndex is used to walk through a list. Calling + * listGET_OWNER_OF_NEXT_ENTRY increments pxIndex to the next item in the list + * and returns that entry's pxOwner parameter. Using multiple calls to this + * function it is therefore possible to move through every item contained in + * a list. + * + * The pxOwner parameter of a list item is a pointer to the object that owns + * the list item. In the scheduler this is normally a task control block. + * The pxOwner parameter effectively creates a two way link between the list + * item and its owner. + * + * @param pxTCB pxTCB is set to the address of the owner of the next list item. + * @param pxList The list from which the next item owner is to be returned. + * + * \page listGET_OWNER_OF_NEXT_ENTRY listGET_OWNER_OF_NEXT_ENTRY + * \ingroup LinkedList + */ +#define listGET_OWNER_OF_NEXT_ENTRY( pxTCB, pxList ) \ +{ \ +List_t * const pxConstList = ( pxList ); \ + /* Increment the index to the next item and return the item, ensuring */ \ + /* we don't return the marker used at the end of the list. */ \ + ( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext; \ + if( ( void * ) ( pxConstList )->pxIndex == ( void * ) &( ( pxConstList )->xListEnd ) ) \ + { \ + ( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext; \ + } \ + ( pxTCB ) = ( pxConstList )->pxIndex->pvOwner; \ +} + + +/* + * Access function to obtain the owner of the first entry in a list. Lists + * are normally sorted in ascending item value order. + * + * This function returns the pxOwner member of the first item in the list. + * The pxOwner parameter of a list item is a pointer to the object that owns + * the list item. In the scheduler this is normally a task control block. + * The pxOwner parameter effectively creates a two way link between the list + * item and its owner. + * + * @param pxList The list from which the owner of the head item is to be + * returned. + * + * \page listGET_OWNER_OF_HEAD_ENTRY listGET_OWNER_OF_HEAD_ENTRY + * \ingroup LinkedList + */ +#define listGET_OWNER_OF_HEAD_ENTRY( pxList ) ( (&( ( pxList )->xListEnd ))->pxNext->pvOwner ) + +/* + * Check to see if a list item is within a list. The list item maintains a + * "container" pointer that points to the list it is in. All this macro does + * is check to see if the container and the list match. + * + * @param pxList The list we want to know if the list item is within. + * @param pxListItem The list item we want to know if is in the list. + * @return pdTRUE if the list item is in the list, otherwise pdFALSE. + */ +#define listIS_CONTAINED_WITHIN( pxList, pxListItem ) ( ( BaseType_t ) ( ( pxListItem )->pvContainer == ( void * ) ( pxList ) ) ) + +/* + * Return the list a list item is contained within (referenced from). + * + * @param pxListItem The list item being queried. + * @return A pointer to the List_t object that references the pxListItem + */ +#define listLIST_ITEM_CONTAINER( pxListItem ) ( ( pxListItem )->pvContainer ) + +/* + * This provides a crude means of knowing if a list has been initialised, as + * pxList->xListEnd.xItemValue is set to portMAX_DELAY by the vListInitialise() + * function. + */ +#define listLIST_IS_INITIALISED( pxList ) ( ( pxList )->xListEnd.xItemValue == portMAX_DELAY ) + +/* + * Must be called before a list is used! This initialises all the members + * of the list structure and inserts the xListEnd item into the list as a + * marker to the back of the list. + * + * @param pxList Pointer to the list being initialised. + * + * \page vListInitialise vListInitialise + * \ingroup LinkedList + */ +void vListInitialise( List_t * const pxList ) PRIVILEGED_FUNCTION; + +/* + * Must be called before a list item is used. This sets the list container to + * null so the item does not think that it is already contained in a list. + * + * @param pxItem Pointer to the list item being initialised. + * + * \page vListInitialiseItem vListInitialiseItem + * \ingroup LinkedList + */ +void vListInitialiseItem( ListItem_t * const pxItem ) PRIVILEGED_FUNCTION; + +/* + * Insert a list item into a list. The item will be inserted into the list in + * a position determined by its item value (descending item value order). + * + * @param pxList The list into which the item is to be inserted. + * + * @param pxNewListItem The item that is to be placed in the list. + * + * \page vListInsert vListInsert + * \ingroup LinkedList + */ +void vListInsert( List_t * const pxList, ListItem_t * const pxNewListItem ) PRIVILEGED_FUNCTION; + +/* + * Insert a list item into a list. The item will be inserted in a position + * such that it will be the last item within the list returned by multiple + * calls to listGET_OWNER_OF_NEXT_ENTRY. + * + * The list member pxIndex is used to walk through a list. Calling + * listGET_OWNER_OF_NEXT_ENTRY increments pxIndex to the next item in the list. + * Placing an item in a list using vListInsertEnd effectively places the item + * in the list position pointed to by pxIndex. This means that every other + * item within the list will be returned by listGET_OWNER_OF_NEXT_ENTRY before + * the pxIndex parameter again points to the item being inserted. + * + * @param pxList The list into which the item is to be inserted. + * + * @param pxNewListItem The list item to be inserted into the list. + * + * \page vListInsertEnd vListInsertEnd + * \ingroup LinkedList + */ +void vListInsertEnd( List_t * const pxList, ListItem_t * const pxNewListItem ) PRIVILEGED_FUNCTION; + +/* + * Remove an item from a list. The list item has a pointer to the list that + * it is in, so only the list item need be passed into the function. + * + * @param uxListRemove The item to be removed. The item will remove itself from + * the list pointed to by it's pxContainer parameter. + * + * @return The number of items that remain in the list after the list item has + * been removed. + * + * \page uxListRemove uxListRemove + * \ingroup LinkedList + */ +UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove ) PRIVILEGED_FUNCTION; + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/include/mpu_prototypes.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/include/mpu_prototypes.h new file mode 100644 index 0000000..b4a1d09 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/include/mpu_prototypes.h @@ -0,0 +1,177 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* + * When the MPU is used the standard (non MPU) API functions are mapped to + * equivalents that start "MPU_", the prototypes for which are defined in this + * header files. This will cause the application code to call the MPU_ version + * which wraps the non-MPU version with privilege promoting then demoting code, + * so the kernel code always runs will full privileges. + */ + + +#ifndef MPU_PROTOTYPES_H +#define MPU_PROTOTYPES_H + +/* MPU versions of tasks.h API function. */ +BaseType_t MPU_xTaskCreate( TaskFunction_t pxTaskCode, const char * const pcName, const uint16_t usStackDepth, void * const pvParameters, UBaseType_t uxPriority, TaskHandle_t * const pxCreatedTask ); +TaskHandle_t MPU_xTaskCreateStatic( TaskFunction_t pxTaskCode, const char * const pcName, const uint32_t ulStackDepth, void * const pvParameters, UBaseType_t uxPriority, StackType_t * const puxStackBuffer, StaticTask_t * const pxTaskBuffer ); +BaseType_t MPU_xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition, TaskHandle_t *pxCreatedTask ); +void MPU_vTaskAllocateMPURegions( TaskHandle_t xTask, const MemoryRegion_t * const pxRegions ); +void MPU_vTaskDelete( TaskHandle_t xTaskToDelete ); +void MPU_vTaskDelay( const TickType_t xTicksToDelay ); +void MPU_vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, const TickType_t xTimeIncrement ); +BaseType_t MPU_xTaskAbortDelay( TaskHandle_t xTask ); +UBaseType_t MPU_uxTaskPriorityGet( TaskHandle_t xTask ); +eTaskState MPU_eTaskGetState( TaskHandle_t xTask ); +void MPU_vTaskGetInfo( TaskHandle_t xTask, TaskStatus_t *pxTaskStatus, BaseType_t xGetFreeStackSpace, eTaskState eState ); +void MPU_vTaskPrioritySet( TaskHandle_t xTask, UBaseType_t uxNewPriority ); +void MPU_vTaskSuspend( TaskHandle_t xTaskToSuspend ); +void MPU_vTaskResume( TaskHandle_t xTaskToResume ); +void MPU_vTaskStartScheduler( void ); +void MPU_vTaskSuspendAll( void ); +BaseType_t MPU_xTaskResumeAll( void ); +TickType_t MPU_xTaskGetTickCount( void ); +UBaseType_t MPU_uxTaskGetNumberOfTasks( void ); +char * MPU_pcTaskGetName( TaskHandle_t xTaskToQuery ); +TaskHandle_t MPU_xTaskGetHandle( const char *pcNameToQuery ); +UBaseType_t MPU_uxTaskGetStackHighWaterMark( TaskHandle_t xTask ); +void MPU_vTaskSetApplicationTaskTag( TaskHandle_t xTask, TaskHookFunction_t pxHookFunction ); +TaskHookFunction_t MPU_xTaskGetApplicationTaskTag( TaskHandle_t xTask ); +void MPU_vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet, BaseType_t xIndex, void *pvValue ); +void * MPU_pvTaskGetThreadLocalStoragePointer( TaskHandle_t xTaskToQuery, BaseType_t xIndex ); +BaseType_t MPU_xTaskCallApplicationTaskHook( TaskHandle_t xTask, void *pvParameter ); +TaskHandle_t MPU_xTaskGetIdleTaskHandle( void ); +UBaseType_t MPU_uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray, const UBaseType_t uxArraySize, uint32_t * const pulTotalRunTime ); +void MPU_vTaskList( char * pcWriteBuffer ); +void MPU_vTaskGetRunTimeStats( char *pcWriteBuffer ); +BaseType_t MPU_xTaskGenericNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue ); +BaseType_t MPU_xTaskNotifyWait( uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, uint32_t *pulNotificationValue, TickType_t xTicksToWait ); +uint32_t MPU_ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait ); +BaseType_t MPU_xTaskNotifyStateClear( TaskHandle_t xTask ); +BaseType_t MPU_xTaskIncrementTick( void ); +TaskHandle_t MPU_xTaskGetCurrentTaskHandle( void ); +void MPU_vTaskSetTimeOutState( TimeOut_t * const pxTimeOut ); +BaseType_t MPU_xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, TickType_t * const pxTicksToWait ); +void MPU_vTaskMissedYield( void ); +BaseType_t MPU_xTaskGetSchedulerState( void ); + +/* MPU versions of queue.h API function. */ +BaseType_t MPU_xQueueGenericSend( QueueHandle_t xQueue, const void * const pvItemToQueue, TickType_t xTicksToWait, const BaseType_t xCopyPosition ); +BaseType_t MPU_xQueueGenericReceive( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait, const BaseType_t xJustPeek ); +UBaseType_t MPU_uxQueueMessagesWaiting( const QueueHandle_t xQueue ); +UBaseType_t MPU_uxQueueSpacesAvailable( const QueueHandle_t xQueue ); +void MPU_vQueueDelete( QueueHandle_t xQueue ); +QueueHandle_t MPU_xQueueCreateMutex( const uint8_t ucQueueType ); +QueueHandle_t MPU_xQueueCreateMutexStatic( const uint8_t ucQueueType, StaticQueue_t *pxStaticQueue ); +QueueHandle_t MPU_xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount ); +QueueHandle_t MPU_xQueueCreateCountingSemaphoreStatic( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount, StaticQueue_t *pxStaticQueue ); +void* MPU_xQueueGetMutexHolder( QueueHandle_t xSemaphore ); +BaseType_t MPU_xQueueTakeMutexRecursive( QueueHandle_t xMutex, TickType_t xTicksToWait ); +BaseType_t MPU_xQueueGiveMutexRecursive( QueueHandle_t pxMutex ); +void MPU_vQueueAddToRegistry( QueueHandle_t xQueue, const char *pcName ); +void MPU_vQueueUnregisterQueue( QueueHandle_t xQueue ); +const char * MPU_pcQueueGetName( QueueHandle_t xQueue ); +QueueHandle_t MPU_xQueueGenericCreate( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, const uint8_t ucQueueType ); +QueueHandle_t MPU_xQueueGenericCreateStatic( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, uint8_t *pucQueueStorage, StaticQueue_t *pxStaticQueue, const uint8_t ucQueueType ); +QueueSetHandle_t MPU_xQueueCreateSet( const UBaseType_t uxEventQueueLength ); +BaseType_t MPU_xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet ); +BaseType_t MPU_xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet ); +QueueSetMemberHandle_t MPU_xQueueSelectFromSet( QueueSetHandle_t xQueueSet, const TickType_t xTicksToWait ); +BaseType_t MPU_xQueueGenericReset( QueueHandle_t xQueue, BaseType_t xNewQueue ); +void MPU_vQueueSetQueueNumber( QueueHandle_t xQueue, UBaseType_t uxQueueNumber ); +UBaseType_t MPU_uxQueueGetQueueNumber( QueueHandle_t xQueue ); +uint8_t MPU_ucQueueGetQueueType( QueueHandle_t xQueue ); + +/* MPU versions of timers.h API function. */ +TimerHandle_t MPU_xTimerCreate( const char * const pcTimerName, const TickType_t xTimerPeriodInTicks, const UBaseType_t uxAutoReload, void * const pvTimerID, TimerCallbackFunction_t pxCallbackFunction ); +TimerHandle_t MPU_xTimerCreateStatic( const char * const pcTimerName, const TickType_t xTimerPeriodInTicks, const UBaseType_t uxAutoReload, void * const pvTimerID, TimerCallbackFunction_t pxCallbackFunction, StaticTimer_t *pxTimerBuffer ); +void * MPU_pvTimerGetTimerID( const TimerHandle_t xTimer ); +void MPU_vTimerSetTimerID( TimerHandle_t xTimer, void *pvNewID ); +BaseType_t MPU_xTimerIsTimerActive( TimerHandle_t xTimer ); +TaskHandle_t MPU_xTimerGetTimerDaemonTaskHandle( void ); +BaseType_t MPU_xTimerPendFunctionCall( PendedFunction_t xFunctionToPend, void *pvParameter1, uint32_t ulParameter2, TickType_t xTicksToWait ); +const char * MPU_pcTimerGetName( TimerHandle_t xTimer ); +TickType_t MPU_xTimerGetPeriod( TimerHandle_t xTimer ); +TickType_t MPU_xTimerGetExpiryTime( TimerHandle_t xTimer ); +BaseType_t MPU_xTimerCreateTimerTask( void ); +BaseType_t MPU_xTimerGenericCommand( TimerHandle_t xTimer, const BaseType_t xCommandID, const TickType_t xOptionalValue, BaseType_t * const pxHigherPriorityTaskWoken, const TickType_t xTicksToWait ); + +/* MPU versions of event_group.h API function. */ +EventGroupHandle_t MPU_xEventGroupCreate( void ); +EventGroupHandle_t MPU_xEventGroupCreateStatic( StaticEventGroup_t *pxEventGroupBuffer ); +EventBits_t MPU_xEventGroupWaitBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToWaitFor, const BaseType_t xClearOnExit, const BaseType_t xWaitForAllBits, TickType_t xTicksToWait ); +EventBits_t MPU_xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear ); +EventBits_t MPU_xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet ); +EventBits_t MPU_xEventGroupSync( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, const EventBits_t uxBitsToWaitFor, TickType_t xTicksToWait ); +void MPU_vEventGroupDelete( EventGroupHandle_t xEventGroup ); +UBaseType_t MPU_uxEventGroupGetNumber( void* xEventGroup ); + +#endif /* MPU_PROTOTYPES_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/include/mpu_wrappers.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/include/mpu_wrappers.h new file mode 100644 index 0000000..7d33342 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/include/mpu_wrappers.h @@ -0,0 +1,201 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef MPU_WRAPPERS_H +#define MPU_WRAPPERS_H + +/* This file redefines API functions to be called through a wrapper macro, but +only for ports that are using the MPU. */ +#ifdef portUSING_MPU_WRAPPERS + + /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE will be defined when this file is + included from queue.c or task.c to prevent it from having an effect within + those files. */ + #ifndef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + + /* + * Map standard (non MPU) API functions to equivalents that start + * "MPU_". This will cause the application code to call the MPU_ + * version, which wraps the non-MPU version with privilege promoting + * then demoting code, so the kernel code always runs will full + * privileges. + */ + + /* Map standard tasks.h API functions to the MPU equivalents. */ + #define xTaskCreate MPU_xTaskCreate + #define xTaskCreateStatic MPU_xTaskCreateStatic + #define xTaskCreateRestricted MPU_xTaskCreateRestricted + #define vTaskAllocateMPURegions MPU_vTaskAllocateMPURegions + #define vTaskDelete MPU_vTaskDelete + #define vTaskDelay MPU_vTaskDelay + #define vTaskDelayUntil MPU_vTaskDelayUntil + #define xTaskAbortDelay MPU_xTaskAbortDelay + #define uxTaskPriorityGet MPU_uxTaskPriorityGet + #define eTaskGetState MPU_eTaskGetState + #define vTaskGetInfo MPU_vTaskGetInfo + #define vTaskPrioritySet MPU_vTaskPrioritySet + #define vTaskSuspend MPU_vTaskSuspend + #define vTaskResume MPU_vTaskResume + #define vTaskSuspendAll MPU_vTaskSuspendAll + #define xTaskResumeAll MPU_xTaskResumeAll + #define xTaskGetTickCount MPU_xTaskGetTickCount + #define uxTaskGetNumberOfTasks MPU_uxTaskGetNumberOfTasks + #define pcTaskGetName MPU_pcTaskGetName + #define xTaskGetHandle MPU_xTaskGetHandle + #define uxTaskGetStackHighWaterMark MPU_uxTaskGetStackHighWaterMark + #define vTaskSetApplicationTaskTag MPU_vTaskSetApplicationTaskTag + #define xTaskGetApplicationTaskTag MPU_xTaskGetApplicationTaskTag + #define vTaskSetThreadLocalStoragePointer MPU_vTaskSetThreadLocalStoragePointer + #define pvTaskGetThreadLocalStoragePointer MPU_pvTaskGetThreadLocalStoragePointer + #define xTaskCallApplicationTaskHook MPU_xTaskCallApplicationTaskHook + #define xTaskGetIdleTaskHandle MPU_xTaskGetIdleTaskHandle + #define uxTaskGetSystemState MPU_uxTaskGetSystemState + #define vTaskList MPU_vTaskList + #define vTaskGetRunTimeStats MPU_vTaskGetRunTimeStats + #define xTaskGenericNotify MPU_xTaskGenericNotify + #define xTaskNotifyWait MPU_xTaskNotifyWait + #define ulTaskNotifyTake MPU_ulTaskNotifyTake + #define xTaskNotifyStateClear MPU_xTaskNotifyStateClear + + #define xTaskGetCurrentTaskHandle MPU_xTaskGetCurrentTaskHandle + #define vTaskSetTimeOutState MPU_vTaskSetTimeOutState + #define xTaskCheckForTimeOut MPU_xTaskCheckForTimeOut + #define xTaskGetSchedulerState MPU_xTaskGetSchedulerState + + /* Map standard queue.h API functions to the MPU equivalents. */ + #define xQueueGenericSend MPU_xQueueGenericSend + #define xQueueGenericReceive MPU_xQueueGenericReceive + #define uxQueueMessagesWaiting MPU_uxQueueMessagesWaiting + #define uxQueueSpacesAvailable MPU_uxQueueSpacesAvailable + #define vQueueDelete MPU_vQueueDelete + #define xQueueCreateMutex MPU_xQueueCreateMutex + #define xQueueCreateMutexStatic MPU_xQueueCreateMutexStatic + #define xQueueCreateCountingSemaphore MPU_xQueueCreateCountingSemaphore + #define xQueueCreateCountingSemaphoreStatic MPU_xQueueCreateCountingSemaphoreStatic + #define xQueueGetMutexHolder MPU_xQueueGetMutexHolder + #define xQueueTakeMutexRecursive MPU_xQueueTakeMutexRecursive + #define xQueueGiveMutexRecursive MPU_xQueueGiveMutexRecursive + #define xQueueGenericCreate MPU_xQueueGenericCreate + #define xQueueGenericCreateStatic MPU_xQueueGenericCreateStatic + #define xQueueCreateSet MPU_xQueueCreateSet + #define xQueueAddToSet MPU_xQueueAddToSet + #define xQueueRemoveFromSet MPU_xQueueRemoveFromSet + #define xQueueSelectFromSet MPU_xQueueSelectFromSet + #define xQueueGenericReset MPU_xQueueGenericReset + + #if( configQUEUE_REGISTRY_SIZE > 0 ) + #define vQueueAddToRegistry MPU_vQueueAddToRegistry + #define vQueueUnregisterQueue MPU_vQueueUnregisterQueue + #define pcQueueGetName MPU_pcQueueGetName + #endif + + /* Map standard timer.h API functions to the MPU equivalents. */ + #define xTimerCreate MPU_xTimerCreate + #define xTimerCreateStatic MPU_xTimerCreateStatic + #define pvTimerGetTimerID MPU_pvTimerGetTimerID + #define vTimerSetTimerID MPU_vTimerSetTimerID + #define xTimerIsTimerActive MPU_xTimerIsTimerActive + #define xTimerGetTimerDaemonTaskHandle MPU_xTimerGetTimerDaemonTaskHandle + #define xTimerPendFunctionCall MPU_xTimerPendFunctionCall + #define pcTimerGetName MPU_pcTimerGetName + #define xTimerGetPeriod MPU_xTimerGetPeriod + #define xTimerGetExpiryTime MPU_xTimerGetExpiryTime + #define xTimerGenericCommand MPU_xTimerGenericCommand + + /* Map standard event_group.h API functions to the MPU equivalents. */ + #define xEventGroupCreate MPU_xEventGroupCreate + #define xEventGroupCreateStatic MPU_xEventGroupCreateStatic + #define xEventGroupWaitBits MPU_xEventGroupWaitBits + #define xEventGroupClearBits MPU_xEventGroupClearBits + #define xEventGroupSetBits MPU_xEventGroupSetBits + #define xEventGroupSync MPU_xEventGroupSync + #define vEventGroupDelete MPU_vEventGroupDelete + + /* Remove the privileged function macro. */ + #define PRIVILEGED_FUNCTION + + #else /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE */ + + /* Ensure API functions go in the privileged execution section. */ + #define PRIVILEGED_FUNCTION __attribute__((section("privileged_functions"))) + #define PRIVILEGED_DATA __attribute__((section("privileged_data"))) + + #endif /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE */ + +#else /* portUSING_MPU_WRAPPERS */ + + #define PRIVILEGED_FUNCTION + #define PRIVILEGED_DATA + #define portUSING_MPU_WRAPPERS 0 + +#endif /* portUSING_MPU_WRAPPERS */ + + +#endif /* MPU_WRAPPERS_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/include/portable.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/include/portable.h new file mode 100644 index 0000000..177130c --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/include/portable.h @@ -0,0 +1,207 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Portable layer API. Each function must be defined for each port. + *----------------------------------------------------------*/ + +#ifndef PORTABLE_H +#define PORTABLE_H + +/* Each FreeRTOS port has a unique portmacro.h header file. Originally a +pre-processor definition was used to ensure the pre-processor found the correct +portmacro.h file for the port being used. That scheme was deprecated in favour +of setting the compiler's include path such that it found the correct +portmacro.h file - removing the need for the constant and allowing the +portmacro.h file to be located anywhere in relation to the port being used. +Purely for reasons of backward compatibility the old method is still valid, but +to make it clear that new projects should not use it, support for the port +specific constants has been moved into the deprecated_definitions.h header +file. */ +#include "deprecated_definitions.h" + +/* If portENTER_CRITICAL is not defined then including deprecated_definitions.h +did not result in a portmacro.h header file being included - and it should be +included here. In this case the path to the correct portmacro.h header file +must be set in the compiler's include path. */ +#ifndef portENTER_CRITICAL + #include "portmacro.h" +#endif + +#if portBYTE_ALIGNMENT == 32 + #define portBYTE_ALIGNMENT_MASK ( 0x001f ) +#endif + +#if portBYTE_ALIGNMENT == 16 + #define portBYTE_ALIGNMENT_MASK ( 0x000f ) +#endif + +#if portBYTE_ALIGNMENT == 8 + #define portBYTE_ALIGNMENT_MASK ( 0x0007 ) +#endif + +#if portBYTE_ALIGNMENT == 4 + #define portBYTE_ALIGNMENT_MASK ( 0x0003 ) +#endif + +#if portBYTE_ALIGNMENT == 2 + #define portBYTE_ALIGNMENT_MASK ( 0x0001 ) +#endif + +#if portBYTE_ALIGNMENT == 1 + #define portBYTE_ALIGNMENT_MASK ( 0x0000 ) +#endif + +#ifndef portBYTE_ALIGNMENT_MASK + #error "Invalid portBYTE_ALIGNMENT definition" +#endif + +#ifndef portNUM_CONFIGURABLE_REGIONS + #define portNUM_CONFIGURABLE_REGIONS 1 +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mpu_wrappers.h" + +/* + * Setup the stack of a new task so it is ready to be placed under the + * scheduler control. The registers have to be placed on the stack in + * the order that the port expects to find them. + * + */ +#if( portUSING_MPU_WRAPPERS == 1 ) + StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters, BaseType_t xRunPrivileged ) PRIVILEGED_FUNCTION; +#else + StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) PRIVILEGED_FUNCTION; +#endif + +/* Used by heap_5.c. */ +typedef struct HeapRegion +{ + uint8_t *pucStartAddress; + size_t xSizeInBytes; +} HeapRegion_t; + +/* + * Used to define multiple heap regions for use by heap_5.c. This function + * must be called before any calls to pvPortMalloc() - not creating a task, + * queue, semaphore, mutex, software timer, event group, etc. will result in + * pvPortMalloc being called. + * + * pxHeapRegions passes in an array of HeapRegion_t structures - each of which + * defines a region of memory that can be used as the heap. The array is + * terminated by a HeapRegions_t structure that has a size of 0. The region + * with the lowest start address must appear first in the array. + */ +void vPortDefineHeapRegions( const HeapRegion_t * const pxHeapRegions ) PRIVILEGED_FUNCTION; + + +/* + * Map to the memory management routines required for the port. + */ +void *pvPortMalloc( size_t xSize ) PRIVILEGED_FUNCTION; +void vPortFree( void *pv ) PRIVILEGED_FUNCTION; +void vPortInitialiseBlocks( void ) PRIVILEGED_FUNCTION; +size_t xPortGetFreeHeapSize( void ) PRIVILEGED_FUNCTION; +size_t xPortGetMinimumEverFreeHeapSize( void ) PRIVILEGED_FUNCTION; + +/* + * Setup the hardware ready for the scheduler to take control. This generally + * sets up a tick interrupt and sets timers for the correct tick frequency. + */ +BaseType_t xPortStartScheduler( void ) PRIVILEGED_FUNCTION; + +/* + * Undo any hardware/ISR setup that was performed by xPortStartScheduler() so + * the hardware is left in its original condition after the scheduler stops + * executing. + */ +void vPortEndScheduler( void ) PRIVILEGED_FUNCTION; + +/* + * The structures and methods of manipulating the MPU are contained within the + * port layer. + * + * Fills the xMPUSettings structure with the memory region information + * contained in xRegions. + */ +#if( portUSING_MPU_WRAPPERS == 1 ) + struct xMEMORY_REGION; + void vPortStoreTaskMPUSettings( xMPU_SETTINGS *xMPUSettings, const struct xMEMORY_REGION * const xRegions, StackType_t *pxBottomOfStack, uint32_t ulStackDepth ) PRIVILEGED_FUNCTION; +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* PORTABLE_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/include/projdefs.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/include/projdefs.h new file mode 100644 index 0000000..0da6f1b --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/include/projdefs.h @@ -0,0 +1,161 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PROJDEFS_H +#define PROJDEFS_H + +/* + * Defines the prototype to which task functions must conform. Defined in this + * file to ensure the type is known before portable.h is included. + */ +typedef void (*TaskFunction_t)( void * ); + +/* Converts a time in milliseconds to a time in ticks. This macro can be +overridden by a macro of the same name defined in FreeRTOSConfig.h in case the +definition here is not suitable for your application. */ +#ifndef pdMS_TO_TICKS + #define pdMS_TO_TICKS( xTimeInMs ) ( ( TickType_t ) ( ( ( TickType_t ) ( xTimeInMs ) * ( TickType_t ) configTICK_RATE_HZ ) / ( TickType_t ) 1000 ) ) +#endif + +#define pdFALSE ( ( BaseType_t ) 0 ) +#define pdTRUE ( ( BaseType_t ) 1 ) + +#define pdPASS ( pdTRUE ) +#define pdFAIL ( pdFALSE ) +#define errQUEUE_EMPTY ( ( BaseType_t ) 0 ) +#define errQUEUE_FULL ( ( BaseType_t ) 0 ) + +/* FreeRTOS error definitions. */ +#define errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY ( -1 ) +#define errQUEUE_BLOCKED ( -4 ) +#define errQUEUE_YIELD ( -5 ) + +/* Macros used for basic data corruption checks. */ +#ifndef configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES + #define configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES 0 +#endif + +#if( configUSE_16_BIT_TICKS == 1 ) + #define pdINTEGRITY_CHECK_VALUE 0x5a5a +#else + #define pdINTEGRITY_CHECK_VALUE 0x5a5a5a5aUL +#endif + +/* The following errno values are used by FreeRTOS+ components, not FreeRTOS +itself. */ +#define pdFREERTOS_ERRNO_NONE 0 /* No errors */ +#define pdFREERTOS_ERRNO_ENOENT 2 /* No such file or directory */ +#define pdFREERTOS_ERRNO_EINTR 4 /* Interrupted system call */ +#define pdFREERTOS_ERRNO_EIO 5 /* I/O error */ +#define pdFREERTOS_ERRNO_ENXIO 6 /* No such device or address */ +#define pdFREERTOS_ERRNO_EBADF 9 /* Bad file number */ +#define pdFREERTOS_ERRNO_EAGAIN 11 /* No more processes */ +#define pdFREERTOS_ERRNO_EWOULDBLOCK 11 /* Operation would block */ +#define pdFREERTOS_ERRNO_ENOMEM 12 /* Not enough memory */ +#define pdFREERTOS_ERRNO_EACCES 13 /* Permission denied */ +#define pdFREERTOS_ERRNO_EFAULT 14 /* Bad address */ +#define pdFREERTOS_ERRNO_EBUSY 16 /* Mount device busy */ +#define pdFREERTOS_ERRNO_EEXIST 17 /* File exists */ +#define pdFREERTOS_ERRNO_EXDEV 18 /* Cross-device link */ +#define pdFREERTOS_ERRNO_ENODEV 19 /* No such device */ +#define pdFREERTOS_ERRNO_ENOTDIR 20 /* Not a directory */ +#define pdFREERTOS_ERRNO_EISDIR 21 /* Is a directory */ +#define pdFREERTOS_ERRNO_EINVAL 22 /* Invalid argument */ +#define pdFREERTOS_ERRNO_ENOSPC 28 /* No space left on device */ +#define pdFREERTOS_ERRNO_ESPIPE 29 /* Illegal seek */ +#define pdFREERTOS_ERRNO_EROFS 30 /* Read only file system */ +#define pdFREERTOS_ERRNO_EUNATCH 42 /* Protocol driver not attached */ +#define pdFREERTOS_ERRNO_EBADE 50 /* Invalid exchange */ +#define pdFREERTOS_ERRNO_EFTYPE 79 /* Inappropriate file type or format */ +#define pdFREERTOS_ERRNO_ENMFILE 89 /* No more files */ +#define pdFREERTOS_ERRNO_ENOTEMPTY 90 /* Directory not empty */ +#define pdFREERTOS_ERRNO_ENAMETOOLONG 91 /* File or path name too long */ +#define pdFREERTOS_ERRNO_EOPNOTSUPP 95 /* Operation not supported on transport endpoint */ +#define pdFREERTOS_ERRNO_ENOBUFS 105 /* No buffer space available */ +#define pdFREERTOS_ERRNO_ENOPROTOOPT 109 /* Protocol not available */ +#define pdFREERTOS_ERRNO_EADDRINUSE 112 /* Address already in use */ +#define pdFREERTOS_ERRNO_ETIMEDOUT 116 /* Connection timed out */ +#define pdFREERTOS_ERRNO_EINPROGRESS 119 /* Connection already in progress */ +#define pdFREERTOS_ERRNO_EALREADY 120 /* Socket already connected */ +#define pdFREERTOS_ERRNO_EADDRNOTAVAIL 125 /* Address not available */ +#define pdFREERTOS_ERRNO_EISCONN 127 /* Socket is already connected */ +#define pdFREERTOS_ERRNO_ENOTCONN 128 /* Socket is not connected */ +#define pdFREERTOS_ERRNO_ENOMEDIUM 135 /* No medium inserted */ +#define pdFREERTOS_ERRNO_EILSEQ 138 /* An invalid UTF-16 sequence was encountered. */ +#define pdFREERTOS_ERRNO_ECANCELED 140 /* Operation canceled. */ + +/* The following endian values are used by FreeRTOS+ components, not FreeRTOS +itself. */ +#define pdFREERTOS_LITTLE_ENDIAN 0 +#define pdFREERTOS_BIG_ENDIAN 1 + +#endif /* PROJDEFS_H */ + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/include/queue.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/include/queue.h new file mode 100644 index 0000000..b96ed5b --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/include/queue.h @@ -0,0 +1,1798 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef QUEUE_H +#define QUEUE_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h" must appear in source files before "include queue.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + + +/** + * Type by which queues are referenced. For example, a call to xQueueCreate() + * returns an QueueHandle_t variable that can then be used as a parameter to + * xQueueSend(), xQueueReceive(), etc. + */ +typedef void * QueueHandle_t; + +/** + * Type by which queue sets are referenced. For example, a call to + * xQueueCreateSet() returns an xQueueSet variable that can then be used as a + * parameter to xQueueSelectFromSet(), xQueueAddToSet(), etc. + */ +typedef void * QueueSetHandle_t; + +/** + * Queue sets can contain both queues and semaphores, so the + * QueueSetMemberHandle_t is defined as a type to be used where a parameter or + * return value can be either an QueueHandle_t or an SemaphoreHandle_t. + */ +typedef void * QueueSetMemberHandle_t; + +/* For internal use only. */ +#define queueSEND_TO_BACK ( ( BaseType_t ) 0 ) +#define queueSEND_TO_FRONT ( ( BaseType_t ) 1 ) +#define queueOVERWRITE ( ( BaseType_t ) 2 ) + +/* For internal use only. These definitions *must* match those in queue.c. */ +#define queueQUEUE_TYPE_BASE ( ( uint8_t ) 0U ) +#define queueQUEUE_TYPE_SET ( ( uint8_t ) 0U ) +#define queueQUEUE_TYPE_MUTEX ( ( uint8_t ) 1U ) +#define queueQUEUE_TYPE_COUNTING_SEMAPHORE ( ( uint8_t ) 2U ) +#define queueQUEUE_TYPE_BINARY_SEMAPHORE ( ( uint8_t ) 3U ) +#define queueQUEUE_TYPE_RECURSIVE_MUTEX ( ( uint8_t ) 4U ) + +/** + * queue. h + *
+ QueueHandle_t xQueueCreate(
+							  UBaseType_t uxQueueLength,
+							  UBaseType_t uxItemSize
+						  );
+ * 
+ * + * Creates a new queue instance, and returns a handle by which the new queue + * can be referenced. + * + * Internally, within the FreeRTOS implementation, queues use two blocks of + * memory. The first block is used to hold the queue's data structures. The + * second block is used to hold items placed into the queue. If a queue is + * created using xQueueCreate() then both blocks of memory are automatically + * dynamically allocated inside the xQueueCreate() function. (see + * http://www.freertos.org/a00111.html). If a queue is created using + * xQueueCreateStatic() then the application writer must provide the memory that + * will get used by the queue. xQueueCreateStatic() therefore allows a queue to + * be created without using any dynamic memory allocation. + * + * http://www.FreeRTOS.org/Embedded-RTOS-Queues.html + * + * @param uxQueueLength The maximum number of items that the queue can contain. + * + * @param uxItemSize The number of bytes each item in the queue will require. + * Items are queued by copy, not by reference, so this is the number of bytes + * that will be copied for each posted item. Each item on the queue must be + * the same size. + * + * @return If the queue is successfully create then a handle to the newly + * created queue is returned. If the queue cannot be created then 0 is + * returned. + * + * Example usage: +
+ struct AMessage
+ {
+	char ucMessageID;
+	char ucData[ 20 ];
+ };
+
+ void vATask( void *pvParameters )
+ {
+ QueueHandle_t xQueue1, xQueue2;
+
+	// Create a queue capable of containing 10 uint32_t values.
+	xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) );
+	if( xQueue1 == 0 )
+	{
+		// Queue was not created and must not be used.
+	}
+
+	// Create a queue capable of containing 10 pointers to AMessage structures.
+	// These should be passed by pointer as they contain a lot of data.
+	xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );
+	if( xQueue2 == 0 )
+	{
+		// Queue was not created and must not be used.
+	}
+
+	// ... Rest of task code.
+ }
+ 
+ * \defgroup xQueueCreate xQueueCreate + * \ingroup QueueManagement + */ +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + #define xQueueCreate( uxQueueLength, uxItemSize ) xQueueGenericCreate( ( uxQueueLength ), ( uxItemSize ), ( queueQUEUE_TYPE_BASE ) ) +#endif + +/** + * queue. h + *
+ QueueHandle_t xQueueCreateStatic(
+							  UBaseType_t uxQueueLength,
+							  UBaseType_t uxItemSize,
+							  uint8_t *pucQueueStorageBuffer,
+							  StaticQueue_t *pxQueueBuffer
+						  );
+ * 
+ * + * Creates a new queue instance, and returns a handle by which the new queue + * can be referenced. + * + * Internally, within the FreeRTOS implementation, queues use two blocks of + * memory. The first block is used to hold the queue's data structures. The + * second block is used to hold items placed into the queue. If a queue is + * created using xQueueCreate() then both blocks of memory are automatically + * dynamically allocated inside the xQueueCreate() function. (see + * http://www.freertos.org/a00111.html). If a queue is created using + * xQueueCreateStatic() then the application writer must provide the memory that + * will get used by the queue. xQueueCreateStatic() therefore allows a queue to + * be created without using any dynamic memory allocation. + * + * http://www.FreeRTOS.org/Embedded-RTOS-Queues.html + * + * @param uxQueueLength The maximum number of items that the queue can contain. + * + * @param uxItemSize The number of bytes each item in the queue will require. + * Items are queued by copy, not by reference, so this is the number of bytes + * that will be copied for each posted item. Each item on the queue must be + * the same size. + * + * @param pucQueueStorageBuffer If uxItemSize is not zero then + * pucQueueStorageBuffer must point to a uint8_t array that is at least large + * enough to hold the maximum number of items that can be in the queue at any + * one time - which is ( uxQueueLength * uxItemsSize ) bytes. If uxItemSize is + * zero then pucQueueStorageBuffer can be NULL. + * + * @param pxQueueBuffer Must point to a variable of type StaticQueue_t, which + * will be used to hold the queue's data structure. + * + * @return If the queue is created then a handle to the created queue is + * returned. If pxQueueBuffer is NULL then NULL is returned. + * + * Example usage: +
+ struct AMessage
+ {
+	char ucMessageID;
+	char ucData[ 20 ];
+ };
+
+ #define QUEUE_LENGTH 10
+ #define ITEM_SIZE sizeof( uint32_t )
+
+ // xQueueBuffer will hold the queue structure.
+ StaticQueue_t xQueueBuffer;
+
+ // ucQueueStorage will hold the items posted to the queue.  Must be at least
+ // [(queue length) * ( queue item size)] bytes long.
+ uint8_t ucQueueStorage[ QUEUE_LENGTH * ITEM_SIZE ];
+
+ void vATask( void *pvParameters )
+ {
+ QueueHandle_t xQueue1;
+
+	// Create a queue capable of containing 10 uint32_t values.
+	xQueue1 = xQueueCreate( QUEUE_LENGTH, // The number of items the queue can hold.
+							ITEM_SIZE	  // The size of each item in the queue
+							&( ucQueueStorage[ 0 ] ), // The buffer that will hold the items in the queue.
+							&xQueueBuffer ); // The buffer that will hold the queue structure.
+
+	// The queue is guaranteed to be created successfully as no dynamic memory
+	// allocation is used.  Therefore xQueue1 is now a handle to a valid queue.
+
+	// ... Rest of task code.
+ }
+ 
+ * \defgroup xQueueCreateStatic xQueueCreateStatic + * \ingroup QueueManagement + */ +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + #define xQueueCreateStatic( uxQueueLength, uxItemSize, pucQueueStorage, pxQueueBuffer ) xQueueGenericCreateStatic( ( uxQueueLength ), ( uxItemSize ), ( pucQueueStorage ), ( pxQueueBuffer ), ( queueQUEUE_TYPE_BASE ) ) +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/** + * queue. h + *
+ BaseType_t xQueueSendToToFront(
+								   QueueHandle_t	xQueue,
+								   const void		*pvItemToQueue,
+								   TickType_t		xTicksToWait
+							   );
+ * 
+ * + * This is a macro that calls xQueueGenericSend(). + * + * Post an item to the front of a queue. The item is queued by copy, not by + * reference. This function must not be called from an interrupt service + * routine. See xQueueSendFromISR () for an alternative which may be used + * in an ISR. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for space to become available on the queue, should it already + * be full. The call will return immediately if this is set to 0 and the + * queue is full. The time is defined in tick periods so the constant + * portTICK_PERIOD_MS should be used to convert to real time if this is required. + * + * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. + * + * Example usage: +
+ struct AMessage
+ {
+	char ucMessageID;
+	char ucData[ 20 ];
+ } xMessage;
+
+ uint32_t ulVar = 10UL;
+
+ void vATask( void *pvParameters )
+ {
+ QueueHandle_t xQueue1, xQueue2;
+ struct AMessage *pxMessage;
+
+	// Create a queue capable of containing 10 uint32_t values.
+	xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) );
+
+	// Create a queue capable of containing 10 pointers to AMessage structures.
+	// These should be passed by pointer as they contain a lot of data.
+	xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );
+
+	// ...
+
+	if( xQueue1 != 0 )
+	{
+		// Send an uint32_t.  Wait for 10 ticks for space to become
+		// available if necessary.
+		if( xQueueSendToFront( xQueue1, ( void * ) &ulVar, ( TickType_t ) 10 ) != pdPASS )
+		{
+			// Failed to post the message, even after 10 ticks.
+		}
+	}
+
+	if( xQueue2 != 0 )
+	{
+		// Send a pointer to a struct AMessage object.  Don't block if the
+		// queue is already full.
+		pxMessage = & xMessage;
+		xQueueSendToFront( xQueue2, ( void * ) &pxMessage, ( TickType_t ) 0 );
+	}
+
+	// ... Rest of task code.
+ }
+ 
+ * \defgroup xQueueSend xQueueSend + * \ingroup QueueManagement + */ +#define xQueueSendToFront( xQueue, pvItemToQueue, xTicksToWait ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_FRONT ) + +/** + * queue. h + *
+ BaseType_t xQueueSendToBack(
+								   QueueHandle_t	xQueue,
+								   const void		*pvItemToQueue,
+								   TickType_t		xTicksToWait
+							   );
+ * 
+ * + * This is a macro that calls xQueueGenericSend(). + * + * Post an item to the back of a queue. The item is queued by copy, not by + * reference. This function must not be called from an interrupt service + * routine. See xQueueSendFromISR () for an alternative which may be used + * in an ISR. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for space to become available on the queue, should it already + * be full. The call will return immediately if this is set to 0 and the queue + * is full. The time is defined in tick periods so the constant + * portTICK_PERIOD_MS should be used to convert to real time if this is required. + * + * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. + * + * Example usage: +
+ struct AMessage
+ {
+	char ucMessageID;
+	char ucData[ 20 ];
+ } xMessage;
+
+ uint32_t ulVar = 10UL;
+
+ void vATask( void *pvParameters )
+ {
+ QueueHandle_t xQueue1, xQueue2;
+ struct AMessage *pxMessage;
+
+	// Create a queue capable of containing 10 uint32_t values.
+	xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) );
+
+	// Create a queue capable of containing 10 pointers to AMessage structures.
+	// These should be passed by pointer as they contain a lot of data.
+	xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );
+
+	// ...
+
+	if( xQueue1 != 0 )
+	{
+		// Send an uint32_t.  Wait for 10 ticks for space to become
+		// available if necessary.
+		if( xQueueSendToBack( xQueue1, ( void * ) &ulVar, ( TickType_t ) 10 ) != pdPASS )
+		{
+			// Failed to post the message, even after 10 ticks.
+		}
+	}
+
+	if( xQueue2 != 0 )
+	{
+		// Send a pointer to a struct AMessage object.  Don't block if the
+		// queue is already full.
+		pxMessage = & xMessage;
+		xQueueSendToBack( xQueue2, ( void * ) &pxMessage, ( TickType_t ) 0 );
+	}
+
+	// ... Rest of task code.
+ }
+ 
+ * \defgroup xQueueSend xQueueSend + * \ingroup QueueManagement + */ +#define xQueueSendToBack( xQueue, pvItemToQueue, xTicksToWait ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_BACK ) + +/** + * queue. h + *
+ BaseType_t xQueueSend(
+							  QueueHandle_t xQueue,
+							  const void * pvItemToQueue,
+							  TickType_t xTicksToWait
+						 );
+ * 
+ * + * This is a macro that calls xQueueGenericSend(). It is included for + * backward compatibility with versions of FreeRTOS.org that did not + * include the xQueueSendToFront() and xQueueSendToBack() macros. It is + * equivalent to xQueueSendToBack(). + * + * Post an item on a queue. The item is queued by copy, not by reference. + * This function must not be called from an interrupt service routine. + * See xQueueSendFromISR () for an alternative which may be used in an ISR. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for space to become available on the queue, should it already + * be full. The call will return immediately if this is set to 0 and the + * queue is full. The time is defined in tick periods so the constant + * portTICK_PERIOD_MS should be used to convert to real time if this is required. + * + * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. + * + * Example usage: +
+ struct AMessage
+ {
+	char ucMessageID;
+	char ucData[ 20 ];
+ } xMessage;
+
+ uint32_t ulVar = 10UL;
+
+ void vATask( void *pvParameters )
+ {
+ QueueHandle_t xQueue1, xQueue2;
+ struct AMessage *pxMessage;
+
+	// Create a queue capable of containing 10 uint32_t values.
+	xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) );
+
+	// Create a queue capable of containing 10 pointers to AMessage structures.
+	// These should be passed by pointer as they contain a lot of data.
+	xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );
+
+	// ...
+
+	if( xQueue1 != 0 )
+	{
+		// Send an uint32_t.  Wait for 10 ticks for space to become
+		// available if necessary.
+		if( xQueueSend( xQueue1, ( void * ) &ulVar, ( TickType_t ) 10 ) != pdPASS )
+		{
+			// Failed to post the message, even after 10 ticks.
+		}
+	}
+
+	if( xQueue2 != 0 )
+	{
+		// Send a pointer to a struct AMessage object.  Don't block if the
+		// queue is already full.
+		pxMessage = & xMessage;
+		xQueueSend( xQueue2, ( void * ) &pxMessage, ( TickType_t ) 0 );
+	}
+
+	// ... Rest of task code.
+ }
+ 
+ * \defgroup xQueueSend xQueueSend + * \ingroup QueueManagement + */ +#define xQueueSend( xQueue, pvItemToQueue, xTicksToWait ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_BACK ) + +/** + * queue. h + *
+ BaseType_t xQueueOverwrite(
+							  QueueHandle_t xQueue,
+							  const void * pvItemToQueue
+						 );
+ * 
+ * + * Only for use with queues that have a length of one - so the queue is either + * empty or full. + * + * Post an item on a queue. If the queue is already full then overwrite the + * value held in the queue. The item is queued by copy, not by reference. + * + * This function must not be called from an interrupt service routine. + * See xQueueOverwriteFromISR () for an alternative which may be used in an ISR. + * + * @param xQueue The handle of the queue to which the data is being sent. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @return xQueueOverwrite() is a macro that calls xQueueGenericSend(), and + * therefore has the same return values as xQueueSendToFront(). However, pdPASS + * is the only value that can be returned because xQueueOverwrite() will write + * to the queue even when the queue is already full. + * + * Example usage: +
+
+ void vFunction( void *pvParameters )
+ {
+ QueueHandle_t xQueue;
+ uint32_t ulVarToSend, ulValReceived;
+
+	// Create a queue to hold one uint32_t value.  It is strongly
+	// recommended *not* to use xQueueOverwrite() on queues that can
+	// contain more than one value, and doing so will trigger an assertion
+	// if configASSERT() is defined.
+	xQueue = xQueueCreate( 1, sizeof( uint32_t ) );
+
+	// Write the value 10 to the queue using xQueueOverwrite().
+	ulVarToSend = 10;
+	xQueueOverwrite( xQueue, &ulVarToSend );
+
+	// Peeking the queue should now return 10, but leave the value 10 in
+	// the queue.  A block time of zero is used as it is known that the
+	// queue holds a value.
+	ulValReceived = 0;
+	xQueuePeek( xQueue, &ulValReceived, 0 );
+
+	if( ulValReceived != 10 )
+	{
+		// Error unless the item was removed by a different task.
+	}
+
+	// The queue is still full.  Use xQueueOverwrite() to overwrite the
+	// value held in the queue with 100.
+	ulVarToSend = 100;
+	xQueueOverwrite( xQueue, &ulVarToSend );
+
+	// This time read from the queue, leaving the queue empty once more.
+	// A block time of 0 is used again.
+	xQueueReceive( xQueue, &ulValReceived, 0 );
+
+	// The value read should be the last value written, even though the
+	// queue was already full when the value was written.
+	if( ulValReceived != 100 )
+	{
+		// Error!
+	}
+
+	// ...
+}
+ 
+ * \defgroup xQueueOverwrite xQueueOverwrite + * \ingroup QueueManagement + */ +#define xQueueOverwrite( xQueue, pvItemToQueue ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), 0, queueOVERWRITE ) + + +/** + * queue. h + *
+ BaseType_t xQueueGenericSend(
+									QueueHandle_t xQueue,
+									const void * pvItemToQueue,
+									TickType_t xTicksToWait
+									BaseType_t xCopyPosition
+								);
+ * 
+ * + * It is preferred that the macros xQueueSend(), xQueueSendToFront() and + * xQueueSendToBack() are used in place of calling this function directly. + * + * Post an item on a queue. The item is queued by copy, not by reference. + * This function must not be called from an interrupt service routine. + * See xQueueSendFromISR () for an alternative which may be used in an ISR. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for space to become available on the queue, should it already + * be full. The call will return immediately if this is set to 0 and the + * queue is full. The time is defined in tick periods so the constant + * portTICK_PERIOD_MS should be used to convert to real time if this is required. + * + * @param xCopyPosition Can take the value queueSEND_TO_BACK to place the + * item at the back of the queue, or queueSEND_TO_FRONT to place the item + * at the front of the queue (for high priority messages). + * + * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. + * + * Example usage: +
+ struct AMessage
+ {
+	char ucMessageID;
+	char ucData[ 20 ];
+ } xMessage;
+
+ uint32_t ulVar = 10UL;
+
+ void vATask( void *pvParameters )
+ {
+ QueueHandle_t xQueue1, xQueue2;
+ struct AMessage *pxMessage;
+
+	// Create a queue capable of containing 10 uint32_t values.
+	xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) );
+
+	// Create a queue capable of containing 10 pointers to AMessage structures.
+	// These should be passed by pointer as they contain a lot of data.
+	xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );
+
+	// ...
+
+	if( xQueue1 != 0 )
+	{
+		// Send an uint32_t.  Wait for 10 ticks for space to become
+		// available if necessary.
+		if( xQueueGenericSend( xQueue1, ( void * ) &ulVar, ( TickType_t ) 10, queueSEND_TO_BACK ) != pdPASS )
+		{
+			// Failed to post the message, even after 10 ticks.
+		}
+	}
+
+	if( xQueue2 != 0 )
+	{
+		// Send a pointer to a struct AMessage object.  Don't block if the
+		// queue is already full.
+		pxMessage = & xMessage;
+		xQueueGenericSend( xQueue2, ( void * ) &pxMessage, ( TickType_t ) 0, queueSEND_TO_BACK );
+	}
+
+	// ... Rest of task code.
+ }
+ 
+ * \defgroup xQueueSend xQueueSend + * \ingroup QueueManagement + */ +BaseType_t xQueueGenericSend( QueueHandle_t xQueue, const void * const pvItemToQueue, TickType_t xTicksToWait, const BaseType_t xCopyPosition ) PRIVILEGED_FUNCTION; + +/** + * queue. h + *
+ BaseType_t xQueuePeek(
+							 QueueHandle_t xQueue,
+							 void *pvBuffer,
+							 TickType_t xTicksToWait
+						 );
+ * + * This is a macro that calls the xQueueGenericReceive() function. + * + * Receive an item from a queue without removing the item from the queue. + * The item is received by copy so a buffer of adequate size must be + * provided. The number of bytes copied into the buffer was defined when + * the queue was created. + * + * Successfully received items remain on the queue so will be returned again + * by the next call, or a call to xQueueReceive(). + * + * This macro must not be used in an interrupt service routine. See + * xQueuePeekFromISR() for an alternative that can be called from an interrupt + * service routine. + * + * @param xQueue The handle to the queue from which the item is to be + * received. + * + * @param pvBuffer Pointer to the buffer into which the received item will + * be copied. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for an item to receive should the queue be empty at the time + * of the call. The time is defined in tick periods so the constant + * portTICK_PERIOD_MS should be used to convert to real time if this is required. + * xQueuePeek() will return immediately if xTicksToWait is 0 and the queue + * is empty. + * + * @return pdTRUE if an item was successfully received from the queue, + * otherwise pdFALSE. + * + * Example usage: +
+ struct AMessage
+ {
+	char ucMessageID;
+	char ucData[ 20 ];
+ } xMessage;
+
+ QueueHandle_t xQueue;
+
+ // Task to create a queue and post a value.
+ void vATask( void *pvParameters )
+ {
+ struct AMessage *pxMessage;
+
+	// Create a queue capable of containing 10 pointers to AMessage structures.
+	// These should be passed by pointer as they contain a lot of data.
+	xQueue = xQueueCreate( 10, sizeof( struct AMessage * ) );
+	if( xQueue == 0 )
+	{
+		// Failed to create the queue.
+	}
+
+	// ...
+
+	// Send a pointer to a struct AMessage object.  Don't block if the
+	// queue is already full.
+	pxMessage = & xMessage;
+	xQueueSend( xQueue, ( void * ) &pxMessage, ( TickType_t ) 0 );
+
+	// ... Rest of task code.
+ }
+
+ // Task to peek the data from the queue.
+ void vADifferentTask( void *pvParameters )
+ {
+ struct AMessage *pxRxedMessage;
+
+	if( xQueue != 0 )
+	{
+		// Peek a message on the created queue.  Block for 10 ticks if a
+		// message is not immediately available.
+		if( xQueuePeek( xQueue, &( pxRxedMessage ), ( TickType_t ) 10 ) )
+		{
+			// pcRxedMessage now points to the struct AMessage variable posted
+			// by vATask, but the item still remains on the queue.
+		}
+	}
+
+	// ... Rest of task code.
+ }
+ 
+ * \defgroup xQueueReceive xQueueReceive + * \ingroup QueueManagement + */ +#define xQueuePeek( xQueue, pvBuffer, xTicksToWait ) xQueueGenericReceive( ( xQueue ), ( pvBuffer ), ( xTicksToWait ), pdTRUE ) + +/** + * queue. h + *
+ BaseType_t xQueuePeekFromISR(
+									QueueHandle_t xQueue,
+									void *pvBuffer,
+								);
+ * + * A version of xQueuePeek() that can be called from an interrupt service + * routine (ISR). + * + * Receive an item from a queue without removing the item from the queue. + * The item is received by copy so a buffer of adequate size must be + * provided. The number of bytes copied into the buffer was defined when + * the queue was created. + * + * Successfully received items remain on the queue so will be returned again + * by the next call, or a call to xQueueReceive(). + * + * @param xQueue The handle to the queue from which the item is to be + * received. + * + * @param pvBuffer Pointer to the buffer into which the received item will + * be copied. + * + * @return pdTRUE if an item was successfully received from the queue, + * otherwise pdFALSE. + * + * \defgroup xQueuePeekFromISR xQueuePeekFromISR + * \ingroup QueueManagement + */ +BaseType_t xQueuePeekFromISR( QueueHandle_t xQueue, void * const pvBuffer ) PRIVILEGED_FUNCTION; + +/** + * queue. h + *
+ BaseType_t xQueueReceive(
+								 QueueHandle_t xQueue,
+								 void *pvBuffer,
+								 TickType_t xTicksToWait
+							);
+ * + * This is a macro that calls the xQueueGenericReceive() function. + * + * Receive an item from a queue. The item is received by copy so a buffer of + * adequate size must be provided. The number of bytes copied into the buffer + * was defined when the queue was created. + * + * Successfully received items are removed from the queue. + * + * This function must not be used in an interrupt service routine. See + * xQueueReceiveFromISR for an alternative that can. + * + * @param xQueue The handle to the queue from which the item is to be + * received. + * + * @param pvBuffer Pointer to the buffer into which the received item will + * be copied. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for an item to receive should the queue be empty at the time + * of the call. xQueueReceive() will return immediately if xTicksToWait + * is zero and the queue is empty. The time is defined in tick periods so the + * constant portTICK_PERIOD_MS should be used to convert to real time if this is + * required. + * + * @return pdTRUE if an item was successfully received from the queue, + * otherwise pdFALSE. + * + * Example usage: +
+ struct AMessage
+ {
+	char ucMessageID;
+	char ucData[ 20 ];
+ } xMessage;
+
+ QueueHandle_t xQueue;
+
+ // Task to create a queue and post a value.
+ void vATask( void *pvParameters )
+ {
+ struct AMessage *pxMessage;
+
+	// Create a queue capable of containing 10 pointers to AMessage structures.
+	// These should be passed by pointer as they contain a lot of data.
+	xQueue = xQueueCreate( 10, sizeof( struct AMessage * ) );
+	if( xQueue == 0 )
+	{
+		// Failed to create the queue.
+	}
+
+	// ...
+
+	// Send a pointer to a struct AMessage object.  Don't block if the
+	// queue is already full.
+	pxMessage = & xMessage;
+	xQueueSend( xQueue, ( void * ) &pxMessage, ( TickType_t ) 0 );
+
+	// ... Rest of task code.
+ }
+
+ // Task to receive from the queue.
+ void vADifferentTask( void *pvParameters )
+ {
+ struct AMessage *pxRxedMessage;
+
+	if( xQueue != 0 )
+	{
+		// Receive a message on the created queue.  Block for 10 ticks if a
+		// message is not immediately available.
+		if( xQueueReceive( xQueue, &( pxRxedMessage ), ( TickType_t ) 10 ) )
+		{
+			// pcRxedMessage now points to the struct AMessage variable posted
+			// by vATask.
+		}
+	}
+
+	// ... Rest of task code.
+ }
+ 
+ * \defgroup xQueueReceive xQueueReceive + * \ingroup QueueManagement + */ +#define xQueueReceive( xQueue, pvBuffer, xTicksToWait ) xQueueGenericReceive( ( xQueue ), ( pvBuffer ), ( xTicksToWait ), pdFALSE ) + + +/** + * queue. h + *
+ BaseType_t xQueueGenericReceive(
+									   QueueHandle_t	xQueue,
+									   void	*pvBuffer,
+									   TickType_t	xTicksToWait
+									   BaseType_t	xJustPeek
+									);
+ * + * It is preferred that the macro xQueueReceive() be used rather than calling + * this function directly. + * + * Receive an item from a queue. The item is received by copy so a buffer of + * adequate size must be provided. The number of bytes copied into the buffer + * was defined when the queue was created. + * + * This function must not be used in an interrupt service routine. See + * xQueueReceiveFromISR for an alternative that can. + * + * @param xQueue The handle to the queue from which the item is to be + * received. + * + * @param pvBuffer Pointer to the buffer into which the received item will + * be copied. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for an item to receive should the queue be empty at the time + * of the call. The time is defined in tick periods so the constant + * portTICK_PERIOD_MS should be used to convert to real time if this is required. + * xQueueGenericReceive() will return immediately if the queue is empty and + * xTicksToWait is 0. + * + * @param xJustPeek When set to true, the item received from the queue is not + * actually removed from the queue - meaning a subsequent call to + * xQueueReceive() will return the same item. When set to false, the item + * being received from the queue is also removed from the queue. + * + * @return pdTRUE if an item was successfully received from the queue, + * otherwise pdFALSE. + * + * Example usage: +
+ struct AMessage
+ {
+	char ucMessageID;
+	char ucData[ 20 ];
+ } xMessage;
+
+ QueueHandle_t xQueue;
+
+ // Task to create a queue and post a value.
+ void vATask( void *pvParameters )
+ {
+ struct AMessage *pxMessage;
+
+	// Create a queue capable of containing 10 pointers to AMessage structures.
+	// These should be passed by pointer as they contain a lot of data.
+	xQueue = xQueueCreate( 10, sizeof( struct AMessage * ) );
+	if( xQueue == 0 )
+	{
+		// Failed to create the queue.
+	}
+
+	// ...
+
+	// Send a pointer to a struct AMessage object.  Don't block if the
+	// queue is already full.
+	pxMessage = & xMessage;
+	xQueueSend( xQueue, ( void * ) &pxMessage, ( TickType_t ) 0 );
+
+	// ... Rest of task code.
+ }
+
+ // Task to receive from the queue.
+ void vADifferentTask( void *pvParameters )
+ {
+ struct AMessage *pxRxedMessage;
+
+	if( xQueue != 0 )
+	{
+		// Receive a message on the created queue.  Block for 10 ticks if a
+		// message is not immediately available.
+		if( xQueueGenericReceive( xQueue, &( pxRxedMessage ), ( TickType_t ) 10 ) )
+		{
+			// pcRxedMessage now points to the struct AMessage variable posted
+			// by vATask.
+		}
+	}
+
+	// ... Rest of task code.
+ }
+ 
+ * \defgroup xQueueReceive xQueueReceive + * \ingroup QueueManagement + */ +BaseType_t xQueueGenericReceive( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait, const BaseType_t xJustPeek ) PRIVILEGED_FUNCTION; + +/** + * queue. h + *
UBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue );
+ * + * Return the number of messages stored in a queue. + * + * @param xQueue A handle to the queue being queried. + * + * @return The number of messages available in the queue. + * + * \defgroup uxQueueMessagesWaiting uxQueueMessagesWaiting + * \ingroup QueueManagement + */ +UBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; + +/** + * queue. h + *
UBaseType_t uxQueueSpacesAvailable( const QueueHandle_t xQueue );
+ * + * Return the number of free spaces available in a queue. This is equal to the + * number of items that can be sent to the queue before the queue becomes full + * if no items are removed. + * + * @param xQueue A handle to the queue being queried. + * + * @return The number of spaces available in the queue. + * + * \defgroup uxQueueMessagesWaiting uxQueueMessagesWaiting + * \ingroup QueueManagement + */ +UBaseType_t uxQueueSpacesAvailable( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; + +/** + * queue. h + *
void vQueueDelete( QueueHandle_t xQueue );
+ * + * Delete a queue - freeing all the memory allocated for storing of items + * placed on the queue. + * + * @param xQueue A handle to the queue to be deleted. + * + * \defgroup vQueueDelete vQueueDelete + * \ingroup QueueManagement + */ +void vQueueDelete( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; + +/** + * queue. h + *
+ BaseType_t xQueueSendToFrontFromISR(
+										 QueueHandle_t xQueue,
+										 const void *pvItemToQueue,
+										 BaseType_t *pxHigherPriorityTaskWoken
+									  );
+ 
+ * + * This is a macro that calls xQueueGenericSendFromISR(). + * + * Post an item to the front of a queue. It is safe to use this macro from + * within an interrupt service routine. + * + * Items are queued by copy not reference so it is preferable to only + * queue small items, especially when called from an ISR. In most cases + * it would be preferable to store a pointer to the item being queued. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param pxHigherPriorityTaskWoken xQueueSendToFrontFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xQueueSendToFromFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return pdTRUE if the data was successfully sent to the queue, otherwise + * errQUEUE_FULL. + * + * Example usage for buffered IO (where the ISR can obtain more than one value + * per call): +
+ void vBufferISR( void )
+ {
+ char cIn;
+ BaseType_t xHigherPrioritTaskWoken;
+
+	// We have not woken a task at the start of the ISR.
+	xHigherPriorityTaskWoken = pdFALSE;
+
+	// Loop until the buffer is empty.
+	do
+	{
+		// Obtain a byte from the buffer.
+		cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS );
+
+		// Post the byte.
+		xQueueSendToFrontFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken );
+
+	} while( portINPUT_BYTE( BUFFER_COUNT ) );
+
+	// Now the buffer is empty we can switch context if necessary.
+	if( xHigherPriorityTaskWoken )
+	{
+		taskYIELD ();
+	}
+ }
+ 
+ * + * \defgroup xQueueSendFromISR xQueueSendFromISR + * \ingroup QueueManagement + */ +#define xQueueSendToFrontFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_FRONT ) + + +/** + * queue. h + *
+ BaseType_t xQueueSendToBackFromISR(
+										 QueueHandle_t xQueue,
+										 const void *pvItemToQueue,
+										 BaseType_t *pxHigherPriorityTaskWoken
+									  );
+ 
+ * + * This is a macro that calls xQueueGenericSendFromISR(). + * + * Post an item to the back of a queue. It is safe to use this macro from + * within an interrupt service routine. + * + * Items are queued by copy not reference so it is preferable to only + * queue small items, especially when called from an ISR. In most cases + * it would be preferable to store a pointer to the item being queued. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param pxHigherPriorityTaskWoken xQueueSendToBackFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xQueueSendToBackFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return pdTRUE if the data was successfully sent to the queue, otherwise + * errQUEUE_FULL. + * + * Example usage for buffered IO (where the ISR can obtain more than one value + * per call): +
+ void vBufferISR( void )
+ {
+ char cIn;
+ BaseType_t xHigherPriorityTaskWoken;
+
+	// We have not woken a task at the start of the ISR.
+	xHigherPriorityTaskWoken = pdFALSE;
+
+	// Loop until the buffer is empty.
+	do
+	{
+		// Obtain a byte from the buffer.
+		cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS );
+
+		// Post the byte.
+		xQueueSendToBackFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken );
+
+	} while( portINPUT_BYTE( BUFFER_COUNT ) );
+
+	// Now the buffer is empty we can switch context if necessary.
+	if( xHigherPriorityTaskWoken )
+	{
+		taskYIELD ();
+	}
+ }
+ 
+ * + * \defgroup xQueueSendFromISR xQueueSendFromISR + * \ingroup QueueManagement + */ +#define xQueueSendToBackFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_BACK ) + +/** + * queue. h + *
+ BaseType_t xQueueOverwriteFromISR(
+							  QueueHandle_t xQueue,
+							  const void * pvItemToQueue,
+							  BaseType_t *pxHigherPriorityTaskWoken
+						 );
+ * 
+ * + * A version of xQueueOverwrite() that can be used in an interrupt service + * routine (ISR). + * + * Only for use with queues that can hold a single item - so the queue is either + * empty or full. + * + * Post an item on a queue. If the queue is already full then overwrite the + * value held in the queue. The item is queued by copy, not by reference. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param pxHigherPriorityTaskWoken xQueueOverwriteFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xQueueOverwriteFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return xQueueOverwriteFromISR() is a macro that calls + * xQueueGenericSendFromISR(), and therefore has the same return values as + * xQueueSendToFrontFromISR(). However, pdPASS is the only value that can be + * returned because xQueueOverwriteFromISR() will write to the queue even when + * the queue is already full. + * + * Example usage: +
+
+ QueueHandle_t xQueue;
+
+ void vFunction( void *pvParameters )
+ {
+ 	// Create a queue to hold one uint32_t value.  It is strongly
+	// recommended *not* to use xQueueOverwriteFromISR() on queues that can
+	// contain more than one value, and doing so will trigger an assertion
+	// if configASSERT() is defined.
+	xQueue = xQueueCreate( 1, sizeof( uint32_t ) );
+}
+
+void vAnInterruptHandler( void )
+{
+// xHigherPriorityTaskWoken must be set to pdFALSE before it is used.
+BaseType_t xHigherPriorityTaskWoken = pdFALSE;
+uint32_t ulVarToSend, ulValReceived;
+
+	// Write the value 10 to the queue using xQueueOverwriteFromISR().
+	ulVarToSend = 10;
+	xQueueOverwriteFromISR( xQueue, &ulVarToSend, &xHigherPriorityTaskWoken );
+
+	// The queue is full, but calling xQueueOverwriteFromISR() again will still
+	// pass because the value held in the queue will be overwritten with the
+	// new value.
+	ulVarToSend = 100;
+	xQueueOverwriteFromISR( xQueue, &ulVarToSend, &xHigherPriorityTaskWoken );
+
+	// Reading from the queue will now return 100.
+
+	// ...
+
+	if( xHigherPrioritytaskWoken == pdTRUE )
+	{
+		// Writing to the queue caused a task to unblock and the unblocked task
+		// has a priority higher than or equal to the priority of the currently
+		// executing task (the task this interrupt interrupted).  Perform a context
+		// switch so this interrupt returns directly to the unblocked task.
+		portYIELD_FROM_ISR(); // or portEND_SWITCHING_ISR() depending on the port.
+	}
+}
+ 
+ * \defgroup xQueueOverwriteFromISR xQueueOverwriteFromISR + * \ingroup QueueManagement + */ +#define xQueueOverwriteFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueOVERWRITE ) + +/** + * queue. h + *
+ BaseType_t xQueueSendFromISR(
+									 QueueHandle_t xQueue,
+									 const void *pvItemToQueue,
+									 BaseType_t *pxHigherPriorityTaskWoken
+								);
+ 
+ * + * This is a macro that calls xQueueGenericSendFromISR(). It is included + * for backward compatibility with versions of FreeRTOS.org that did not + * include the xQueueSendToBackFromISR() and xQueueSendToFrontFromISR() + * macros. + * + * Post an item to the back of a queue. It is safe to use this function from + * within an interrupt service routine. + * + * Items are queued by copy not reference so it is preferable to only + * queue small items, especially when called from an ISR. In most cases + * it would be preferable to store a pointer to the item being queued. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param pxHigherPriorityTaskWoken xQueueSendFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xQueueSendFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return pdTRUE if the data was successfully sent to the queue, otherwise + * errQUEUE_FULL. + * + * Example usage for buffered IO (where the ISR can obtain more than one value + * per call): +
+ void vBufferISR( void )
+ {
+ char cIn;
+ BaseType_t xHigherPriorityTaskWoken;
+
+	// We have not woken a task at the start of the ISR.
+	xHigherPriorityTaskWoken = pdFALSE;
+
+	// Loop until the buffer is empty.
+	do
+	{
+		// Obtain a byte from the buffer.
+		cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS );
+
+		// Post the byte.
+		xQueueSendFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken );
+
+	} while( portINPUT_BYTE( BUFFER_COUNT ) );
+
+	// Now the buffer is empty we can switch context if necessary.
+	if( xHigherPriorityTaskWoken )
+	{
+		// Actual macro used here is port specific.
+		portYIELD_FROM_ISR ();
+	}
+ }
+ 
+ * + * \defgroup xQueueSendFromISR xQueueSendFromISR + * \ingroup QueueManagement + */ +#define xQueueSendFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_BACK ) + +/** + * queue. h + *
+ BaseType_t xQueueGenericSendFromISR(
+										   QueueHandle_t		xQueue,
+										   const	void	*pvItemToQueue,
+										   BaseType_t	*pxHigherPriorityTaskWoken,
+										   BaseType_t	xCopyPosition
+									   );
+ 
+ * + * It is preferred that the macros xQueueSendFromISR(), + * xQueueSendToFrontFromISR() and xQueueSendToBackFromISR() be used in place + * of calling this function directly. xQueueGiveFromISR() is an + * equivalent for use by semaphores that don't actually copy any data. + * + * Post an item on a queue. It is safe to use this function from within an + * interrupt service routine. + * + * Items are queued by copy not reference so it is preferable to only + * queue small items, especially when called from an ISR. In most cases + * it would be preferable to store a pointer to the item being queued. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param pxHigherPriorityTaskWoken xQueueGenericSendFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xQueueGenericSendFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @param xCopyPosition Can take the value queueSEND_TO_BACK to place the + * item at the back of the queue, or queueSEND_TO_FRONT to place the item + * at the front of the queue (for high priority messages). + * + * @return pdTRUE if the data was successfully sent to the queue, otherwise + * errQUEUE_FULL. + * + * Example usage for buffered IO (where the ISR can obtain more than one value + * per call): +
+ void vBufferISR( void )
+ {
+ char cIn;
+ BaseType_t xHigherPriorityTaskWokenByPost;
+
+	// We have not woken a task at the start of the ISR.
+	xHigherPriorityTaskWokenByPost = pdFALSE;
+
+	// Loop until the buffer is empty.
+	do
+	{
+		// Obtain a byte from the buffer.
+		cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS );
+
+		// Post each byte.
+		xQueueGenericSendFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWokenByPost, queueSEND_TO_BACK );
+
+	} while( portINPUT_BYTE( BUFFER_COUNT ) );
+
+	// Now the buffer is empty we can switch context if necessary.  Note that the
+	// name of the yield function required is port specific.
+	if( xHigherPriorityTaskWokenByPost )
+	{
+		taskYIELD_YIELD_FROM_ISR();
+	}
+ }
+ 
+ * + * \defgroup xQueueSendFromISR xQueueSendFromISR + * \ingroup QueueManagement + */ +BaseType_t xQueueGenericSendFromISR( QueueHandle_t xQueue, const void * const pvItemToQueue, BaseType_t * const pxHigherPriorityTaskWoken, const BaseType_t xCopyPosition ) PRIVILEGED_FUNCTION; +BaseType_t xQueueGiveFromISR( QueueHandle_t xQueue, BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; + +/** + * queue. h + *
+ BaseType_t xQueueReceiveFromISR(
+									   QueueHandle_t	xQueue,
+									   void	*pvBuffer,
+									   BaseType_t *pxTaskWoken
+								   );
+ * 
+ * + * Receive an item from a queue. It is safe to use this function from within an + * interrupt service routine. + * + * @param xQueue The handle to the queue from which the item is to be + * received. + * + * @param pvBuffer Pointer to the buffer into which the received item will + * be copied. + * + * @param pxTaskWoken A task may be blocked waiting for space to become + * available on the queue. If xQueueReceiveFromISR causes such a task to + * unblock *pxTaskWoken will get set to pdTRUE, otherwise *pxTaskWoken will + * remain unchanged. + * + * @return pdTRUE if an item was successfully received from the queue, + * otherwise pdFALSE. + * + * Example usage: +
+
+ QueueHandle_t xQueue;
+
+ // Function to create a queue and post some values.
+ void vAFunction( void *pvParameters )
+ {
+ char cValueToPost;
+ const TickType_t xTicksToWait = ( TickType_t )0xff;
+
+	// Create a queue capable of containing 10 characters.
+	xQueue = xQueueCreate( 10, sizeof( char ) );
+	if( xQueue == 0 )
+	{
+		// Failed to create the queue.
+	}
+
+	// ...
+
+	// Post some characters that will be used within an ISR.  If the queue
+	// is full then this task will block for xTicksToWait ticks.
+	cValueToPost = 'a';
+	xQueueSend( xQueue, ( void * ) &cValueToPost, xTicksToWait );
+	cValueToPost = 'b';
+	xQueueSend( xQueue, ( void * ) &cValueToPost, xTicksToWait );
+
+	// ... keep posting characters ... this task may block when the queue
+	// becomes full.
+
+	cValueToPost = 'c';
+	xQueueSend( xQueue, ( void * ) &cValueToPost, xTicksToWait );
+ }
+
+ // ISR that outputs all the characters received on the queue.
+ void vISR_Routine( void )
+ {
+ BaseType_t xTaskWokenByReceive = pdFALSE;
+ char cRxedChar;
+
+	while( xQueueReceiveFromISR( xQueue, ( void * ) &cRxedChar, &xTaskWokenByReceive) )
+	{
+		// A character was received.  Output the character now.
+		vOutputCharacter( cRxedChar );
+
+		// If removing the character from the queue woke the task that was
+		// posting onto the queue cTaskWokenByReceive will have been set to
+		// pdTRUE.  No matter how many times this loop iterates only one
+		// task will be woken.
+	}
+
+	if( cTaskWokenByPost != ( char ) pdFALSE;
+	{
+		taskYIELD ();
+	}
+ }
+ 
+ * \defgroup xQueueReceiveFromISR xQueueReceiveFromISR + * \ingroup QueueManagement + */ +BaseType_t xQueueReceiveFromISR( QueueHandle_t xQueue, void * const pvBuffer, BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; + +/* + * Utilities to query queues that are safe to use from an ISR. These utilities + * should be used only from witin an ISR, or within a critical section. + */ +BaseType_t xQueueIsQueueEmptyFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; +BaseType_t xQueueIsQueueFullFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; +UBaseType_t uxQueueMessagesWaitingFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; + +/* + * The functions defined above are for passing data to and from tasks. The + * functions below are the equivalents for passing data to and from + * co-routines. + * + * These functions are called from the co-routine macro implementation and + * should not be called directly from application code. Instead use the macro + * wrappers defined within croutine.h. + */ +BaseType_t xQueueCRSendFromISR( QueueHandle_t xQueue, const void *pvItemToQueue, BaseType_t xCoRoutinePreviouslyWoken ); +BaseType_t xQueueCRReceiveFromISR( QueueHandle_t xQueue, void *pvBuffer, BaseType_t *pxTaskWoken ); +BaseType_t xQueueCRSend( QueueHandle_t xQueue, const void *pvItemToQueue, TickType_t xTicksToWait ); +BaseType_t xQueueCRReceive( QueueHandle_t xQueue, void *pvBuffer, TickType_t xTicksToWait ); + +/* + * For internal use only. Use xSemaphoreCreateMutex(), + * xSemaphoreCreateCounting() or xSemaphoreGetMutexHolder() instead of calling + * these functions directly. + */ +QueueHandle_t xQueueCreateMutex( const uint8_t ucQueueType ) PRIVILEGED_FUNCTION; +QueueHandle_t xQueueCreateMutexStatic( const uint8_t ucQueueType, StaticQueue_t *pxStaticQueue ) PRIVILEGED_FUNCTION; +QueueHandle_t xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount ) PRIVILEGED_FUNCTION; +QueueHandle_t xQueueCreateCountingSemaphoreStatic( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount, StaticQueue_t *pxStaticQueue ) PRIVILEGED_FUNCTION; +void* xQueueGetMutexHolder( QueueHandle_t xSemaphore ) PRIVILEGED_FUNCTION; + +/* + * For internal use only. Use xSemaphoreTakeMutexRecursive() or + * xSemaphoreGiveMutexRecursive() instead of calling these functions directly. + */ +BaseType_t xQueueTakeMutexRecursive( QueueHandle_t xMutex, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; +BaseType_t xQueueGiveMutexRecursive( QueueHandle_t pxMutex ) PRIVILEGED_FUNCTION; + +/* + * Reset a queue back to its original empty state. The return value is now + * obsolete and is always set to pdPASS. + */ +#define xQueueReset( xQueue ) xQueueGenericReset( xQueue, pdFALSE ) + +/* + * The registry is provided as a means for kernel aware debuggers to + * locate queues, semaphores and mutexes. Call vQueueAddToRegistry() add + * a queue, semaphore or mutex handle to the registry if you want the handle + * to be available to a kernel aware debugger. If you are not using a kernel + * aware debugger then this function can be ignored. + * + * configQUEUE_REGISTRY_SIZE defines the maximum number of handles the + * registry can hold. configQUEUE_REGISTRY_SIZE must be greater than 0 + * within FreeRTOSConfig.h for the registry to be available. Its value + * does not effect the number of queues, semaphores and mutexes that can be + * created - just the number that the registry can hold. + * + * @param xQueue The handle of the queue being added to the registry. This + * is the handle returned by a call to xQueueCreate(). Semaphore and mutex + * handles can also be passed in here. + * + * @param pcName The name to be associated with the handle. This is the + * name that the kernel aware debugger will display. The queue registry only + * stores a pointer to the string - so the string must be persistent (global or + * preferably in ROM/Flash), not on the stack. + */ +#if( configQUEUE_REGISTRY_SIZE > 0 ) + void vQueueAddToRegistry( QueueHandle_t xQueue, const char *pcName ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ +#endif + +/* + * The registry is provided as a means for kernel aware debuggers to + * locate queues, semaphores and mutexes. Call vQueueAddToRegistry() add + * a queue, semaphore or mutex handle to the registry if you want the handle + * to be available to a kernel aware debugger, and vQueueUnregisterQueue() to + * remove the queue, semaphore or mutex from the register. If you are not using + * a kernel aware debugger then this function can be ignored. + * + * @param xQueue The handle of the queue being removed from the registry. + */ +#if( configQUEUE_REGISTRY_SIZE > 0 ) + void vQueueUnregisterQueue( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; +#endif + +/* + * The queue registry is provided as a means for kernel aware debuggers to + * locate queues, semaphores and mutexes. Call pcQueueGetName() to look + * up and return the name of a queue in the queue registry from the queue's + * handle. + * + * @param xQueue The handle of the queue the name of which will be returned. + * @return If the queue is in the registry then a pointer to the name of the + * queue is returned. If the queue is not in the registry then NULL is + * returned. + */ +#if( configQUEUE_REGISTRY_SIZE > 0 ) + const char *pcQueueGetName( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ +#endif + +/* + * Generic version of the function used to creaet a queue using dynamic memory + * allocation. This is called by other functions and macros that create other + * RTOS objects that use the queue structure as their base. + */ +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + QueueHandle_t xQueueGenericCreate( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, const uint8_t ucQueueType ) PRIVILEGED_FUNCTION; +#endif + +/* + * Generic version of the function used to creaet a queue using dynamic memory + * allocation. This is called by other functions and macros that create other + * RTOS objects that use the queue structure as their base. + */ +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + QueueHandle_t xQueueGenericCreateStatic( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, uint8_t *pucQueueStorage, StaticQueue_t *pxStaticQueue, const uint8_t ucQueueType ) PRIVILEGED_FUNCTION; +#endif + +/* + * Queue sets provide a mechanism to allow a task to block (pend) on a read + * operation from multiple queues or semaphores simultaneously. + * + * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this + * function. + * + * A queue set must be explicitly created using a call to xQueueCreateSet() + * before it can be used. Once created, standard FreeRTOS queues and semaphores + * can be added to the set using calls to xQueueAddToSet(). + * xQueueSelectFromSet() is then used to determine which, if any, of the queues + * or semaphores contained in the set is in a state where a queue read or + * semaphore take operation would be successful. + * + * Note 1: See the documentation on http://wwwFreeRTOS.org/RTOS-queue-sets.html + * for reasons why queue sets are very rarely needed in practice as there are + * simpler methods of blocking on multiple objects. + * + * Note 2: Blocking on a queue set that contains a mutex will not cause the + * mutex holder to inherit the priority of the blocked task. + * + * Note 3: An additional 4 bytes of RAM is required for each space in a every + * queue added to a queue set. Therefore counting semaphores that have a high + * maximum count value should not be added to a queue set. + * + * Note 4: A receive (in the case of a queue) or take (in the case of a + * semaphore) operation must not be performed on a member of a queue set unless + * a call to xQueueSelectFromSet() has first returned a handle to that set member. + * + * @param uxEventQueueLength Queue sets store events that occur on + * the queues and semaphores contained in the set. uxEventQueueLength specifies + * the maximum number of events that can be queued at once. To be absolutely + * certain that events are not lost uxEventQueueLength should be set to the + * total sum of the length of the queues added to the set, where binary + * semaphores and mutexes have a length of 1, and counting semaphores have a + * length set by their maximum count value. Examples: + * + If a queue set is to hold a queue of length 5, another queue of length 12, + * and a binary semaphore, then uxEventQueueLength should be set to + * (5 + 12 + 1), or 18. + * + If a queue set is to hold three binary semaphores then uxEventQueueLength + * should be set to (1 + 1 + 1 ), or 3. + * + If a queue set is to hold a counting semaphore that has a maximum count of + * 5, and a counting semaphore that has a maximum count of 3, then + * uxEventQueueLength should be set to (5 + 3), or 8. + * + * @return If the queue set is created successfully then a handle to the created + * queue set is returned. Otherwise NULL is returned. + */ +QueueSetHandle_t xQueueCreateSet( const UBaseType_t uxEventQueueLength ) PRIVILEGED_FUNCTION; + +/* + * Adds a queue or semaphore to a queue set that was previously created by a + * call to xQueueCreateSet(). + * + * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this + * function. + * + * Note 1: A receive (in the case of a queue) or take (in the case of a + * semaphore) operation must not be performed on a member of a queue set unless + * a call to xQueueSelectFromSet() has first returned a handle to that set member. + * + * @param xQueueOrSemaphore The handle of the queue or semaphore being added to + * the queue set (cast to an QueueSetMemberHandle_t type). + * + * @param xQueueSet The handle of the queue set to which the queue or semaphore + * is being added. + * + * @return If the queue or semaphore was successfully added to the queue set + * then pdPASS is returned. If the queue could not be successfully added to the + * queue set because it is already a member of a different queue set then pdFAIL + * is returned. + */ +BaseType_t xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet ) PRIVILEGED_FUNCTION; + +/* + * Removes a queue or semaphore from a queue set. A queue or semaphore can only + * be removed from a set if the queue or semaphore is empty. + * + * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this + * function. + * + * @param xQueueOrSemaphore The handle of the queue or semaphore being removed + * from the queue set (cast to an QueueSetMemberHandle_t type). + * + * @param xQueueSet The handle of the queue set in which the queue or semaphore + * is included. + * + * @return If the queue or semaphore was successfully removed from the queue set + * then pdPASS is returned. If the queue was not in the queue set, or the + * queue (or semaphore) was not empty, then pdFAIL is returned. + */ +BaseType_t xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet ) PRIVILEGED_FUNCTION; + +/* + * xQueueSelectFromSet() selects from the members of a queue set a queue or + * semaphore that either contains data (in the case of a queue) or is available + * to take (in the case of a semaphore). xQueueSelectFromSet() effectively + * allows a task to block (pend) on a read operation on all the queues and + * semaphores in a queue set simultaneously. + * + * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this + * function. + * + * Note 1: See the documentation on http://wwwFreeRTOS.org/RTOS-queue-sets.html + * for reasons why queue sets are very rarely needed in practice as there are + * simpler methods of blocking on multiple objects. + * + * Note 2: Blocking on a queue set that contains a mutex will not cause the + * mutex holder to inherit the priority of the blocked task. + * + * Note 3: A receive (in the case of a queue) or take (in the case of a + * semaphore) operation must not be performed on a member of a queue set unless + * a call to xQueueSelectFromSet() has first returned a handle to that set member. + * + * @param xQueueSet The queue set on which the task will (potentially) block. + * + * @param xTicksToWait The maximum time, in ticks, that the calling task will + * remain in the Blocked state (with other tasks executing) to wait for a member + * of the queue set to be ready for a successful queue read or semaphore take + * operation. + * + * @return xQueueSelectFromSet() will return the handle of a queue (cast to + * a QueueSetMemberHandle_t type) contained in the queue set that contains data, + * or the handle of a semaphore (cast to a QueueSetMemberHandle_t type) contained + * in the queue set that is available, or NULL if no such queue or semaphore + * exists before before the specified block time expires. + */ +QueueSetMemberHandle_t xQueueSelectFromSet( QueueSetHandle_t xQueueSet, const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +/* + * A version of xQueueSelectFromSet() that can be used from an ISR. + */ +QueueSetMemberHandle_t xQueueSelectFromSetFromISR( QueueSetHandle_t xQueueSet ) PRIVILEGED_FUNCTION; + +/* Not public API functions. */ +void vQueueWaitForMessageRestricted( QueueHandle_t xQueue, TickType_t xTicksToWait, const BaseType_t xWaitIndefinitely ) PRIVILEGED_FUNCTION; +BaseType_t xQueueGenericReset( QueueHandle_t xQueue, BaseType_t xNewQueue ) PRIVILEGED_FUNCTION; +void vQueueSetQueueNumber( QueueHandle_t xQueue, UBaseType_t uxQueueNumber ) PRIVILEGED_FUNCTION; +UBaseType_t uxQueueGetQueueNumber( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; +uint8_t ucQueueGetQueueType( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; + + +#ifdef __cplusplus +} +#endif + +#endif /* QUEUE_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/include/semphr.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/include/semphr.h new file mode 100644 index 0000000..f9867ae --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/include/semphr.h @@ -0,0 +1,1171 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef SEMAPHORE_H +#define SEMAPHORE_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h" must appear in source files before "include semphr.h" +#endif + +#include "queue.h" + +typedef QueueHandle_t SemaphoreHandle_t; + +#define semBINARY_SEMAPHORE_QUEUE_LENGTH ( ( uint8_t ) 1U ) +#define semSEMAPHORE_QUEUE_ITEM_LENGTH ( ( uint8_t ) 0U ) +#define semGIVE_BLOCK_TIME ( ( TickType_t ) 0U ) + + +/** + * semphr. h + *
vSemaphoreCreateBinary( SemaphoreHandle_t xSemaphore )
+ * + * In many usage scenarios it is faster and more memory efficient to use a + * direct to task notification in place of a binary semaphore! + * http://www.freertos.org/RTOS-task-notifications.html + * + * This old vSemaphoreCreateBinary() macro is now deprecated in favour of the + * xSemaphoreCreateBinary() function. Note that binary semaphores created using + * the vSemaphoreCreateBinary() macro are created in a state such that the + * first call to 'take' the semaphore would pass, whereas binary semaphores + * created using xSemaphoreCreateBinary() are created in a state such that the + * the semaphore must first be 'given' before it can be 'taken'. + * + * Macro that implements a semaphore by using the existing queue mechanism. + * The queue length is 1 as this is a binary semaphore. The data size is 0 + * as we don't want to actually store any data - we just want to know if the + * queue is empty or full. + * + * This type of semaphore can be used for pure synchronisation between tasks or + * between an interrupt and a task. The semaphore need not be given back once + * obtained, so one task/interrupt can continuously 'give' the semaphore while + * another continuously 'takes' the semaphore. For this reason this type of + * semaphore does not use a priority inheritance mechanism. For an alternative + * that does use priority inheritance see xSemaphoreCreateMutex(). + * + * @param xSemaphore Handle to the created semaphore. Should be of type SemaphoreHandle_t. + * + * Example usage: +
+ SemaphoreHandle_t xSemaphore = NULL;
+
+ void vATask( void * pvParameters )
+ {
+    // Semaphore cannot be used before a call to vSemaphoreCreateBinary ().
+    // This is a macro so pass the variable in directly.
+    vSemaphoreCreateBinary( xSemaphore );
+
+    if( xSemaphore != NULL )
+    {
+        // The semaphore was created successfully.
+        // The semaphore can now be used.
+    }
+ }
+ 
+ * \defgroup vSemaphoreCreateBinary vSemaphoreCreateBinary + * \ingroup Semaphores + */ +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + #define vSemaphoreCreateBinary( xSemaphore ) \ + { \ + ( xSemaphore ) = xQueueGenericCreate( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_BINARY_SEMAPHORE ); \ + if( ( xSemaphore ) != NULL ) \ + { \ + ( void ) xSemaphoreGive( ( xSemaphore ) ); \ + } \ + } +#endif + +/** + * semphr. h + *
SemaphoreHandle_t xSemaphoreCreateBinary( void )
+ * + * Creates a new binary semaphore instance, and returns a handle by which the + * new semaphore can be referenced. + * + * In many usage scenarios it is faster and more memory efficient to use a + * direct to task notification in place of a binary semaphore! + * http://www.freertos.org/RTOS-task-notifications.html + * + * Internally, within the FreeRTOS implementation, binary semaphores use a block + * of memory, in which the semaphore structure is stored. If a binary semaphore + * is created using xSemaphoreCreateBinary() then the required memory is + * automatically dynamically allocated inside the xSemaphoreCreateBinary() + * function. (see http://www.freertos.org/a00111.html). If a binary semaphore + * is created using xSemaphoreCreateBinaryStatic() then the application writer + * must provide the memory. xSemaphoreCreateBinaryStatic() therefore allows a + * binary semaphore to be created without using any dynamic memory allocation. + * + * The old vSemaphoreCreateBinary() macro is now deprecated in favour of this + * xSemaphoreCreateBinary() function. Note that binary semaphores created using + * the vSemaphoreCreateBinary() macro are created in a state such that the + * first call to 'take' the semaphore would pass, whereas binary semaphores + * created using xSemaphoreCreateBinary() are created in a state such that the + * the semaphore must first be 'given' before it can be 'taken'. + * + * This type of semaphore can be used for pure synchronisation between tasks or + * between an interrupt and a task. The semaphore need not be given back once + * obtained, so one task/interrupt can continuously 'give' the semaphore while + * another continuously 'takes' the semaphore. For this reason this type of + * semaphore does not use a priority inheritance mechanism. For an alternative + * that does use priority inheritance see xSemaphoreCreateMutex(). + * + * @return Handle to the created semaphore, or NULL if the memory required to + * hold the semaphore's data structures could not be allocated. + * + * Example usage: +
+ SemaphoreHandle_t xSemaphore = NULL;
+
+ void vATask( void * pvParameters )
+ {
+    // Semaphore cannot be used before a call to xSemaphoreCreateBinary().
+    // This is a macro so pass the variable in directly.
+    xSemaphore = xSemaphoreCreateBinary();
+
+    if( xSemaphore != NULL )
+    {
+        // The semaphore was created successfully.
+        // The semaphore can now be used.
+    }
+ }
+ 
+ * \defgroup xSemaphoreCreateBinary xSemaphoreCreateBinary + * \ingroup Semaphores + */ +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + #define xSemaphoreCreateBinary() xQueueGenericCreate( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_BINARY_SEMAPHORE ) +#endif + +/** + * semphr. h + *
SemaphoreHandle_t xSemaphoreCreateBinaryStatic( StaticSemaphore_t *pxSemaphoreBuffer )
+ * + * Creates a new binary semaphore instance, and returns a handle by which the + * new semaphore can be referenced. + * + * NOTE: In many usage scenarios it is faster and more memory efficient to use a + * direct to task notification in place of a binary semaphore! + * http://www.freertos.org/RTOS-task-notifications.html + * + * Internally, within the FreeRTOS implementation, binary semaphores use a block + * of memory, in which the semaphore structure is stored. If a binary semaphore + * is created using xSemaphoreCreateBinary() then the required memory is + * automatically dynamically allocated inside the xSemaphoreCreateBinary() + * function. (see http://www.freertos.org/a00111.html). If a binary semaphore + * is created using xSemaphoreCreateBinaryStatic() then the application writer + * must provide the memory. xSemaphoreCreateBinaryStatic() therefore allows a + * binary semaphore to be created without using any dynamic memory allocation. + * + * This type of semaphore can be used for pure synchronisation between tasks or + * between an interrupt and a task. The semaphore need not be given back once + * obtained, so one task/interrupt can continuously 'give' the semaphore while + * another continuously 'takes' the semaphore. For this reason this type of + * semaphore does not use a priority inheritance mechanism. For an alternative + * that does use priority inheritance see xSemaphoreCreateMutex(). + * + * @param pxSemaphoreBuffer Must point to a variable of type StaticSemaphore_t, + * which will then be used to hold the semaphore's data structure, removing the + * need for the memory to be allocated dynamically. + * + * @return If the semaphore is created then a handle to the created semaphore is + * returned. If pxSemaphoreBuffer is NULL then NULL is returned. + * + * Example usage: +
+ SemaphoreHandle_t xSemaphore = NULL;
+ StaticSemaphore_t xSemaphoreBuffer;
+
+ void vATask( void * pvParameters )
+ {
+    // Semaphore cannot be used before a call to xSemaphoreCreateBinary().
+    // The semaphore's data structures will be placed in the xSemaphoreBuffer
+    // variable, the address of which is passed into the function.  The
+    // function's parameter is not NULL, so the function will not attempt any
+    // dynamic memory allocation, and therefore the function will not return
+    // return NULL.
+    xSemaphore = xSemaphoreCreateBinary( &xSemaphoreBuffer );
+
+    // Rest of task code goes here.
+ }
+ 
+ * \defgroup xSemaphoreCreateBinaryStatic xSemaphoreCreateBinaryStatic + * \ingroup Semaphores + */ +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + #define xSemaphoreCreateBinaryStatic( pxStaticSemaphore ) xQueueGenericCreateStatic( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, NULL, pxStaticSemaphore, queueQUEUE_TYPE_BINARY_SEMAPHORE ) +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/** + * semphr. h + *
xSemaphoreTake(
+ *                   SemaphoreHandle_t xSemaphore,
+ *                   TickType_t xBlockTime
+ *               )
+ * + * Macro to obtain a semaphore. The semaphore must have previously been + * created with a call to xSemaphoreCreateBinary(), xSemaphoreCreateMutex() or + * xSemaphoreCreateCounting(). + * + * @param xSemaphore A handle to the semaphore being taken - obtained when + * the semaphore was created. + * + * @param xBlockTime The time in ticks to wait for the semaphore to become + * available. The macro portTICK_PERIOD_MS can be used to convert this to a + * real time. A block time of zero can be used to poll the semaphore. A block + * time of portMAX_DELAY can be used to block indefinitely (provided + * INCLUDE_vTaskSuspend is set to 1 in FreeRTOSConfig.h). + * + * @return pdTRUE if the semaphore was obtained. pdFALSE + * if xBlockTime expired without the semaphore becoming available. + * + * Example usage: +
+ SemaphoreHandle_t xSemaphore = NULL;
+
+ // A task that creates a semaphore.
+ void vATask( void * pvParameters )
+ {
+    // Create the semaphore to guard a shared resource.
+    xSemaphore = xSemaphoreCreateBinary();
+ }
+
+ // A task that uses the semaphore.
+ void vAnotherTask( void * pvParameters )
+ {
+    // ... Do other things.
+
+    if( xSemaphore != NULL )
+    {
+        // See if we can obtain the semaphore.  If the semaphore is not available
+        // wait 10 ticks to see if it becomes free.
+        if( xSemaphoreTake( xSemaphore, ( TickType_t ) 10 ) == pdTRUE )
+        {
+            // We were able to obtain the semaphore and can now access the
+            // shared resource.
+
+            // ...
+
+            // We have finished accessing the shared resource.  Release the
+            // semaphore.
+            xSemaphoreGive( xSemaphore );
+        }
+        else
+        {
+            // We could not obtain the semaphore and can therefore not access
+            // the shared resource safely.
+        }
+    }
+ }
+ 
+ * \defgroup xSemaphoreTake xSemaphoreTake + * \ingroup Semaphores + */ +#define xSemaphoreTake( xSemaphore, xBlockTime ) xQueueGenericReceive( ( QueueHandle_t ) ( xSemaphore ), NULL, ( xBlockTime ), pdFALSE ) + +/** + * semphr. h + * xSemaphoreTakeRecursive( + * SemaphoreHandle_t xMutex, + * TickType_t xBlockTime + * ) + * + * Macro to recursively obtain, or 'take', a mutex type semaphore. + * The mutex must have previously been created using a call to + * xSemaphoreCreateRecursiveMutex(); + * + * configUSE_RECURSIVE_MUTEXES must be set to 1 in FreeRTOSConfig.h for this + * macro to be available. + * + * This macro must not be used on mutexes created using xSemaphoreCreateMutex(). + * + * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex + * doesn't become available again until the owner has called + * xSemaphoreGiveRecursive() for each successful 'take' request. For example, + * if a task successfully 'takes' the same mutex 5 times then the mutex will + * not be available to any other task until it has also 'given' the mutex back + * exactly five times. + * + * @param xMutex A handle to the mutex being obtained. This is the + * handle returned by xSemaphoreCreateRecursiveMutex(); + * + * @param xBlockTime The time in ticks to wait for the semaphore to become + * available. The macro portTICK_PERIOD_MS can be used to convert this to a + * real time. A block time of zero can be used to poll the semaphore. If + * the task already owns the semaphore then xSemaphoreTakeRecursive() will + * return immediately no matter what the value of xBlockTime. + * + * @return pdTRUE if the semaphore was obtained. pdFALSE if xBlockTime + * expired without the semaphore becoming available. + * + * Example usage: +
+ SemaphoreHandle_t xMutex = NULL;
+
+ // A task that creates a mutex.
+ void vATask( void * pvParameters )
+ {
+    // Create the mutex to guard a shared resource.
+    xMutex = xSemaphoreCreateRecursiveMutex();
+ }
+
+ // A task that uses the mutex.
+ void vAnotherTask( void * pvParameters )
+ {
+    // ... Do other things.
+
+    if( xMutex != NULL )
+    {
+        // See if we can obtain the mutex.  If the mutex is not available
+        // wait 10 ticks to see if it becomes free.
+        if( xSemaphoreTakeRecursive( xSemaphore, ( TickType_t ) 10 ) == pdTRUE )
+        {
+            // We were able to obtain the mutex and can now access the
+            // shared resource.
+
+            // ...
+            // For some reason due to the nature of the code further calls to
+			// xSemaphoreTakeRecursive() are made on the same mutex.  In real
+			// code these would not be just sequential calls as this would make
+			// no sense.  Instead the calls are likely to be buried inside
+			// a more complex call structure.
+            xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 );
+            xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 );
+
+            // The mutex has now been 'taken' three times, so will not be
+			// available to another task until it has also been given back
+			// three times.  Again it is unlikely that real code would have
+			// these calls sequentially, but instead buried in a more complex
+			// call structure.  This is just for illustrative purposes.
+            xSemaphoreGiveRecursive( xMutex );
+			xSemaphoreGiveRecursive( xMutex );
+			xSemaphoreGiveRecursive( xMutex );
+
+			// Now the mutex can be taken by other tasks.
+        }
+        else
+        {
+            // We could not obtain the mutex and can therefore not access
+            // the shared resource safely.
+        }
+    }
+ }
+ 
+ * \defgroup xSemaphoreTakeRecursive xSemaphoreTakeRecursive + * \ingroup Semaphores + */ +#if( configUSE_RECURSIVE_MUTEXES == 1 ) + #define xSemaphoreTakeRecursive( xMutex, xBlockTime ) xQueueTakeMutexRecursive( ( xMutex ), ( xBlockTime ) ) +#endif + +/** + * semphr. h + *
xSemaphoreGive( SemaphoreHandle_t xSemaphore )
+ * + * Macro to release a semaphore. The semaphore must have previously been + * created with a call to xSemaphoreCreateBinary(), xSemaphoreCreateMutex() or + * xSemaphoreCreateCounting(). and obtained using sSemaphoreTake(). + * + * This macro must not be used from an ISR. See xSemaphoreGiveFromISR () for + * an alternative which can be used from an ISR. + * + * This macro must also not be used on semaphores created using + * xSemaphoreCreateRecursiveMutex(). + * + * @param xSemaphore A handle to the semaphore being released. This is the + * handle returned when the semaphore was created. + * + * @return pdTRUE if the semaphore was released. pdFALSE if an error occurred. + * Semaphores are implemented using queues. An error can occur if there is + * no space on the queue to post a message - indicating that the + * semaphore was not first obtained correctly. + * + * Example usage: +
+ SemaphoreHandle_t xSemaphore = NULL;
+
+ void vATask( void * pvParameters )
+ {
+    // Create the semaphore to guard a shared resource.
+    xSemaphore = vSemaphoreCreateBinary();
+
+    if( xSemaphore != NULL )
+    {
+        if( xSemaphoreGive( xSemaphore ) != pdTRUE )
+        {
+            // We would expect this call to fail because we cannot give
+            // a semaphore without first "taking" it!
+        }
+
+        // Obtain the semaphore - don't block if the semaphore is not
+        // immediately available.
+        if( xSemaphoreTake( xSemaphore, ( TickType_t ) 0 ) )
+        {
+            // We now have the semaphore and can access the shared resource.
+
+            // ...
+
+            // We have finished accessing the shared resource so can free the
+            // semaphore.
+            if( xSemaphoreGive( xSemaphore ) != pdTRUE )
+            {
+                // We would not expect this call to fail because we must have
+                // obtained the semaphore to get here.
+            }
+        }
+    }
+ }
+ 
+ * \defgroup xSemaphoreGive xSemaphoreGive + * \ingroup Semaphores + */ +#define xSemaphoreGive( xSemaphore ) xQueueGenericSend( ( QueueHandle_t ) ( xSemaphore ), NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK ) + +/** + * semphr. h + *
xSemaphoreGiveRecursive( SemaphoreHandle_t xMutex )
+ * + * Macro to recursively release, or 'give', a mutex type semaphore. + * The mutex must have previously been created using a call to + * xSemaphoreCreateRecursiveMutex(); + * + * configUSE_RECURSIVE_MUTEXES must be set to 1 in FreeRTOSConfig.h for this + * macro to be available. + * + * This macro must not be used on mutexes created using xSemaphoreCreateMutex(). + * + * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex + * doesn't become available again until the owner has called + * xSemaphoreGiveRecursive() for each successful 'take' request. For example, + * if a task successfully 'takes' the same mutex 5 times then the mutex will + * not be available to any other task until it has also 'given' the mutex back + * exactly five times. + * + * @param xMutex A handle to the mutex being released, or 'given'. This is the + * handle returned by xSemaphoreCreateMutex(); + * + * @return pdTRUE if the semaphore was given. + * + * Example usage: +
+ SemaphoreHandle_t xMutex = NULL;
+
+ // A task that creates a mutex.
+ void vATask( void * pvParameters )
+ {
+    // Create the mutex to guard a shared resource.
+    xMutex = xSemaphoreCreateRecursiveMutex();
+ }
+
+ // A task that uses the mutex.
+ void vAnotherTask( void * pvParameters )
+ {
+    // ... Do other things.
+
+    if( xMutex != NULL )
+    {
+        // See if we can obtain the mutex.  If the mutex is not available
+        // wait 10 ticks to see if it becomes free.
+        if( xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 ) == pdTRUE )
+        {
+            // We were able to obtain the mutex and can now access the
+            // shared resource.
+
+            // ...
+            // For some reason due to the nature of the code further calls to
+			// xSemaphoreTakeRecursive() are made on the same mutex.  In real
+			// code these would not be just sequential calls as this would make
+			// no sense.  Instead the calls are likely to be buried inside
+			// a more complex call structure.
+            xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 );
+            xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 );
+
+            // The mutex has now been 'taken' three times, so will not be
+			// available to another task until it has also been given back
+			// three times.  Again it is unlikely that real code would have
+			// these calls sequentially, it would be more likely that the calls
+			// to xSemaphoreGiveRecursive() would be called as a call stack
+			// unwound.  This is just for demonstrative purposes.
+            xSemaphoreGiveRecursive( xMutex );
+			xSemaphoreGiveRecursive( xMutex );
+			xSemaphoreGiveRecursive( xMutex );
+
+			// Now the mutex can be taken by other tasks.
+        }
+        else
+        {
+            // We could not obtain the mutex and can therefore not access
+            // the shared resource safely.
+        }
+    }
+ }
+ 
+ * \defgroup xSemaphoreGiveRecursive xSemaphoreGiveRecursive + * \ingroup Semaphores + */ +#if( configUSE_RECURSIVE_MUTEXES == 1 ) + #define xSemaphoreGiveRecursive( xMutex ) xQueueGiveMutexRecursive( ( xMutex ) ) +#endif + +/** + * semphr. h + *
+ xSemaphoreGiveFromISR(
+                          SemaphoreHandle_t xSemaphore,
+                          BaseType_t *pxHigherPriorityTaskWoken
+                      )
+ * + * Macro to release a semaphore. The semaphore must have previously been + * created with a call to xSemaphoreCreateBinary() or xSemaphoreCreateCounting(). + * + * Mutex type semaphores (those created using a call to xSemaphoreCreateMutex()) + * must not be used with this macro. + * + * This macro can be used from an ISR. + * + * @param xSemaphore A handle to the semaphore being released. This is the + * handle returned when the semaphore was created. + * + * @param pxHigherPriorityTaskWoken xSemaphoreGiveFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if giving the semaphore caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xSemaphoreGiveFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return pdTRUE if the semaphore was successfully given, otherwise errQUEUE_FULL. + * + * Example usage: +
+ \#define LONG_TIME 0xffff
+ \#define TICKS_TO_WAIT	10
+ SemaphoreHandle_t xSemaphore = NULL;
+
+ // Repetitive task.
+ void vATask( void * pvParameters )
+ {
+    for( ;; )
+    {
+        // We want this task to run every 10 ticks of a timer.  The semaphore
+        // was created before this task was started.
+
+        // Block waiting for the semaphore to become available.
+        if( xSemaphoreTake( xSemaphore, LONG_TIME ) == pdTRUE )
+        {
+            // It is time to execute.
+
+            // ...
+
+            // We have finished our task.  Return to the top of the loop where
+            // we will block on the semaphore until it is time to execute
+            // again.  Note when using the semaphore for synchronisation with an
+			// ISR in this manner there is no need to 'give' the semaphore back.
+        }
+    }
+ }
+
+ // Timer ISR
+ void vTimerISR( void * pvParameters )
+ {
+ static uint8_t ucLocalTickCount = 0;
+ static BaseType_t xHigherPriorityTaskWoken;
+
+    // A timer tick has occurred.
+
+    // ... Do other time functions.
+
+    // Is it time for vATask () to run?
+	xHigherPriorityTaskWoken = pdFALSE;
+    ucLocalTickCount++;
+    if( ucLocalTickCount >= TICKS_TO_WAIT )
+    {
+        // Unblock the task by releasing the semaphore.
+        xSemaphoreGiveFromISR( xSemaphore, &xHigherPriorityTaskWoken );
+
+        // Reset the count so we release the semaphore again in 10 ticks time.
+        ucLocalTickCount = 0;
+    }
+
+    if( xHigherPriorityTaskWoken != pdFALSE )
+    {
+        // We can force a context switch here.  Context switching from an
+        // ISR uses port specific syntax.  Check the demo task for your port
+        // to find the syntax required.
+    }
+ }
+ 
+ * \defgroup xSemaphoreGiveFromISR xSemaphoreGiveFromISR + * \ingroup Semaphores + */ +#define xSemaphoreGiveFromISR( xSemaphore, pxHigherPriorityTaskWoken ) xQueueGiveFromISR( ( QueueHandle_t ) ( xSemaphore ), ( pxHigherPriorityTaskWoken ) ) + +/** + * semphr. h + *
+ xSemaphoreTakeFromISR(
+                          SemaphoreHandle_t xSemaphore,
+                          BaseType_t *pxHigherPriorityTaskWoken
+                      )
+ * + * Macro to take a semaphore from an ISR. The semaphore must have + * previously been created with a call to xSemaphoreCreateBinary() or + * xSemaphoreCreateCounting(). + * + * Mutex type semaphores (those created using a call to xSemaphoreCreateMutex()) + * must not be used with this macro. + * + * This macro can be used from an ISR, however taking a semaphore from an ISR + * is not a common operation. It is likely to only be useful when taking a + * counting semaphore when an interrupt is obtaining an object from a resource + * pool (when the semaphore count indicates the number of resources available). + * + * @param xSemaphore A handle to the semaphore being taken. This is the + * handle returned when the semaphore was created. + * + * @param pxHigherPriorityTaskWoken xSemaphoreTakeFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if taking the semaphore caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xSemaphoreTakeFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return pdTRUE if the semaphore was successfully taken, otherwise + * pdFALSE + */ +#define xSemaphoreTakeFromISR( xSemaphore, pxHigherPriorityTaskWoken ) xQueueReceiveFromISR( ( QueueHandle_t ) ( xSemaphore ), NULL, ( pxHigherPriorityTaskWoken ) ) + +/** + * semphr. h + *
SemaphoreHandle_t xSemaphoreCreateMutex( void )
+ * + * Creates a new mutex type semaphore instance, and returns a handle by which + * the new mutex can be referenced. + * + * Internally, within the FreeRTOS implementation, mutex semaphores use a block + * of memory, in which the mutex structure is stored. If a mutex is created + * using xSemaphoreCreateMutex() then the required memory is automatically + * dynamically allocated inside the xSemaphoreCreateMutex() function. (see + * http://www.freertos.org/a00111.html). If a mutex is created using + * xSemaphoreCreateMutexStatic() then the application writer must provided the + * memory. xSemaphoreCreateMutexStatic() therefore allows a mutex to be created + * without using any dynamic memory allocation. + * + * Mutexes created using this function can be accessed using the xSemaphoreTake() + * and xSemaphoreGive() macros. The xSemaphoreTakeRecursive() and + * xSemaphoreGiveRecursive() macros must not be used. + * + * This type of semaphore uses a priority inheritance mechanism so a task + * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the + * semaphore it is no longer required. + * + * Mutex type semaphores cannot be used from within interrupt service routines. + * + * See xSemaphoreCreateBinary() for an alternative implementation that can be + * used for pure synchronisation (where one task or interrupt always 'gives' the + * semaphore and another always 'takes' the semaphore) and from within interrupt + * service routines. + * + * @return If the mutex was successfully created then a handle to the created + * semaphore is returned. If there was not enough heap to allocate the mutex + * data structures then NULL is returned. + * + * Example usage: +
+ SemaphoreHandle_t xSemaphore;
+
+ void vATask( void * pvParameters )
+ {
+    // Semaphore cannot be used before a call to xSemaphoreCreateMutex().
+    // This is a macro so pass the variable in directly.
+    xSemaphore = xSemaphoreCreateMutex();
+
+    if( xSemaphore != NULL )
+    {
+        // The semaphore was created successfully.
+        // The semaphore can now be used.
+    }
+ }
+ 
+ * \defgroup xSemaphoreCreateMutex xSemaphoreCreateMutex + * \ingroup Semaphores + */ +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + #define xSemaphoreCreateMutex() xQueueCreateMutex( queueQUEUE_TYPE_MUTEX ) +#endif + +/** + * semphr. h + *
SemaphoreHandle_t xSemaphoreCreateMutexStatic( StaticSemaphore_t *pxMutexBuffer )
+ * + * Creates a new mutex type semaphore instance, and returns a handle by which + * the new mutex can be referenced. + * + * Internally, within the FreeRTOS implementation, mutex semaphores use a block + * of memory, in which the mutex structure is stored. If a mutex is created + * using xSemaphoreCreateMutex() then the required memory is automatically + * dynamically allocated inside the xSemaphoreCreateMutex() function. (see + * http://www.freertos.org/a00111.html). If a mutex is created using + * xSemaphoreCreateMutexStatic() then the application writer must provided the + * memory. xSemaphoreCreateMutexStatic() therefore allows a mutex to be created + * without using any dynamic memory allocation. + * + * Mutexes created using this function can be accessed using the xSemaphoreTake() + * and xSemaphoreGive() macros. The xSemaphoreTakeRecursive() and + * xSemaphoreGiveRecursive() macros must not be used. + * + * This type of semaphore uses a priority inheritance mechanism so a task + * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the + * semaphore it is no longer required. + * + * Mutex type semaphores cannot be used from within interrupt service routines. + * + * See xSemaphoreCreateBinary() for an alternative implementation that can be + * used for pure synchronisation (where one task or interrupt always 'gives' the + * semaphore and another always 'takes' the semaphore) and from within interrupt + * service routines. + * + * @param pxMutexBuffer Must point to a variable of type StaticSemaphore_t, + * which will be used to hold the mutex's data structure, removing the need for + * the memory to be allocated dynamically. + * + * @return If the mutex was successfully created then a handle to the created + * mutex is returned. If pxMutexBuffer was NULL then NULL is returned. + * + * Example usage: +
+ SemaphoreHandle_t xSemaphore;
+ StaticSemaphore_t xMutexBuffer;
+
+ void vATask( void * pvParameters )
+ {
+    // A mutex cannot be used before it has been created.  xMutexBuffer is
+    // into xSemaphoreCreateMutexStatic() so no dynamic memory allocation is
+    // attempted.
+    xSemaphore = xSemaphoreCreateMutexStatic( &xMutexBuffer );
+
+    // As no dynamic memory allocation was performed, xSemaphore cannot be NULL,
+    // so there is no need to check it.
+ }
+ 
+ * \defgroup xSemaphoreCreateMutexStatic xSemaphoreCreateMutexStatic + * \ingroup Semaphores + */ + #if( configSUPPORT_STATIC_ALLOCATION == 1 ) + #define xSemaphoreCreateMutexStatic( pxMutexBuffer ) xQueueCreateMutexStatic( queueQUEUE_TYPE_MUTEX, ( pxMutexBuffer ) ) +#endif /* configSUPPORT_STATIC_ALLOCATION */ + + +/** + * semphr. h + *
SemaphoreHandle_t xSemaphoreCreateRecursiveMutex( void )
+ * + * Creates a new recursive mutex type semaphore instance, and returns a handle + * by which the new recursive mutex can be referenced. + * + * Internally, within the FreeRTOS implementation, recursive mutexs use a block + * of memory, in which the mutex structure is stored. If a recursive mutex is + * created using xSemaphoreCreateRecursiveMutex() then the required memory is + * automatically dynamically allocated inside the + * xSemaphoreCreateRecursiveMutex() function. (see + * http://www.freertos.org/a00111.html). If a recursive mutex is created using + * xSemaphoreCreateRecursiveMutexStatic() then the application writer must + * provide the memory that will get used by the mutex. + * xSemaphoreCreateRecursiveMutexStatic() therefore allows a recursive mutex to + * be created without using any dynamic memory allocation. + * + * Mutexes created using this macro can be accessed using the + * xSemaphoreTakeRecursive() and xSemaphoreGiveRecursive() macros. The + * xSemaphoreTake() and xSemaphoreGive() macros must not be used. + * + * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex + * doesn't become available again until the owner has called + * xSemaphoreGiveRecursive() for each successful 'take' request. For example, + * if a task successfully 'takes' the same mutex 5 times then the mutex will + * not be available to any other task until it has also 'given' the mutex back + * exactly five times. + * + * This type of semaphore uses a priority inheritance mechanism so a task + * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the + * semaphore it is no longer required. + * + * Mutex type semaphores cannot be used from within interrupt service routines. + * + * See xSemaphoreCreateBinary() for an alternative implementation that can be + * used for pure synchronisation (where one task or interrupt always 'gives' the + * semaphore and another always 'takes' the semaphore) and from within interrupt + * service routines. + * + * @return xSemaphore Handle to the created mutex semaphore. Should be of type + * SemaphoreHandle_t. + * + * Example usage: +
+ SemaphoreHandle_t xSemaphore;
+
+ void vATask( void * pvParameters )
+ {
+    // Semaphore cannot be used before a call to xSemaphoreCreateMutex().
+    // This is a macro so pass the variable in directly.
+    xSemaphore = xSemaphoreCreateRecursiveMutex();
+
+    if( xSemaphore != NULL )
+    {
+        // The semaphore was created successfully.
+        // The semaphore can now be used.
+    }
+ }
+ 
+ * \defgroup xSemaphoreCreateRecursiveMutex xSemaphoreCreateRecursiveMutex + * \ingroup Semaphores + */ +#if( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configUSE_RECURSIVE_MUTEXES == 1 ) ) + #define xSemaphoreCreateRecursiveMutex() xQueueCreateMutex( queueQUEUE_TYPE_RECURSIVE_MUTEX ) +#endif + +/** + * semphr. h + *
SemaphoreHandle_t xSemaphoreCreateRecursiveMutexStatic( StaticSemaphore_t *pxMutexBuffer )
+ * + * Creates a new recursive mutex type semaphore instance, and returns a handle + * by which the new recursive mutex can be referenced. + * + * Internally, within the FreeRTOS implementation, recursive mutexs use a block + * of memory, in which the mutex structure is stored. If a recursive mutex is + * created using xSemaphoreCreateRecursiveMutex() then the required memory is + * automatically dynamically allocated inside the + * xSemaphoreCreateRecursiveMutex() function. (see + * http://www.freertos.org/a00111.html). If a recursive mutex is created using + * xSemaphoreCreateRecursiveMutexStatic() then the application writer must + * provide the memory that will get used by the mutex. + * xSemaphoreCreateRecursiveMutexStatic() therefore allows a recursive mutex to + * be created without using any dynamic memory allocation. + * + * Mutexes created using this macro can be accessed using the + * xSemaphoreTakeRecursive() and xSemaphoreGiveRecursive() macros. The + * xSemaphoreTake() and xSemaphoreGive() macros must not be used. + * + * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex + * doesn't become available again until the owner has called + * xSemaphoreGiveRecursive() for each successful 'take' request. For example, + * if a task successfully 'takes' the same mutex 5 times then the mutex will + * not be available to any other task until it has also 'given' the mutex back + * exactly five times. + * + * This type of semaphore uses a priority inheritance mechanism so a task + * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the + * semaphore it is no longer required. + * + * Mutex type semaphores cannot be used from within interrupt service routines. + * + * See xSemaphoreCreateBinary() for an alternative implementation that can be + * used for pure synchronisation (where one task or interrupt always 'gives' the + * semaphore and another always 'takes' the semaphore) and from within interrupt + * service routines. + * + * @param pxMutexBuffer Must point to a variable of type StaticSemaphore_t, + * which will then be used to hold the recursive mutex's data structure, + * removing the need for the memory to be allocated dynamically. + * + * @return If the recursive mutex was successfully created then a handle to the + * created recursive mutex is returned. If pxMutexBuffer was NULL then NULL is + * returned. + * + * Example usage: +
+ SemaphoreHandle_t xSemaphore;
+ StaticSemaphore_t xMutexBuffer;
+
+ void vATask( void * pvParameters )
+ {
+    // A recursive semaphore cannot be used before it is created.  Here a
+    // recursive mutex is created using xSemaphoreCreateRecursiveMutexStatic().
+    // The address of xMutexBuffer is passed into the function, and will hold
+    // the mutexes data structures - so no dynamic memory allocation will be
+    // attempted.
+    xSemaphore = xSemaphoreCreateRecursiveMutexStatic( &xMutexBuffer );
+
+    // As no dynamic memory allocation was performed, xSemaphore cannot be NULL,
+    // so there is no need to check it.
+ }
+ 
+ * \defgroup xSemaphoreCreateRecursiveMutexStatic xSemaphoreCreateRecursiveMutexStatic + * \ingroup Semaphores + */ +#if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configUSE_RECURSIVE_MUTEXES == 1 ) ) + #define xSemaphoreCreateRecursiveMutexStatic( pxStaticSemaphore ) xQueueCreateMutexStatic( queueQUEUE_TYPE_RECURSIVE_MUTEX, pxStaticSemaphore ) +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/** + * semphr. h + *
SemaphoreHandle_t xSemaphoreCreateCounting( UBaseType_t uxMaxCount, UBaseType_t uxInitialCount )
+ * + * Creates a new counting semaphore instance, and returns a handle by which the + * new counting semaphore can be referenced. + * + * In many usage scenarios it is faster and more memory efficient to use a + * direct to task notification in place of a counting semaphore! + * http://www.freertos.org/RTOS-task-notifications.html + * + * Internally, within the FreeRTOS implementation, counting semaphores use a + * block of memory, in which the counting semaphore structure is stored. If a + * counting semaphore is created using xSemaphoreCreateCounting() then the + * required memory is automatically dynamically allocated inside the + * xSemaphoreCreateCounting() function. (see + * http://www.freertos.org/a00111.html). If a counting semaphore is created + * using xSemaphoreCreateCountingStatic() then the application writer can + * instead optionally provide the memory that will get used by the counting + * semaphore. xSemaphoreCreateCountingStatic() therefore allows a counting + * semaphore to be created without using any dynamic memory allocation. + * + * Counting semaphores are typically used for two things: + * + * 1) Counting events. + * + * In this usage scenario an event handler will 'give' a semaphore each time + * an event occurs (incrementing the semaphore count value), and a handler + * task will 'take' a semaphore each time it processes an event + * (decrementing the semaphore count value). The count value is therefore + * the difference between the number of events that have occurred and the + * number that have been processed. In this case it is desirable for the + * initial count value to be zero. + * + * 2) Resource management. + * + * In this usage scenario the count value indicates the number of resources + * available. To obtain control of a resource a task must first obtain a + * semaphore - decrementing the semaphore count value. When the count value + * reaches zero there are no free resources. When a task finishes with the + * resource it 'gives' the semaphore back - incrementing the semaphore count + * value. In this case it is desirable for the initial count value to be + * equal to the maximum count value, indicating that all resources are free. + * + * @param uxMaxCount The maximum count value that can be reached. When the + * semaphore reaches this value it can no longer be 'given'. + * + * @param uxInitialCount The count value assigned to the semaphore when it is + * created. + * + * @return Handle to the created semaphore. Null if the semaphore could not be + * created. + * + * Example usage: +
+ SemaphoreHandle_t xSemaphore;
+
+ void vATask( void * pvParameters )
+ {
+ SemaphoreHandle_t xSemaphore = NULL;
+
+    // Semaphore cannot be used before a call to xSemaphoreCreateCounting().
+    // The max value to which the semaphore can count should be 10, and the
+    // initial value assigned to the count should be 0.
+    xSemaphore = xSemaphoreCreateCounting( 10, 0 );
+
+    if( xSemaphore != NULL )
+    {
+        // The semaphore was created successfully.
+        // The semaphore can now be used.
+    }
+ }
+ 
+ * \defgroup xSemaphoreCreateCounting xSemaphoreCreateCounting + * \ingroup Semaphores + */ +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + #define xSemaphoreCreateCounting( uxMaxCount, uxInitialCount ) xQueueCreateCountingSemaphore( ( uxMaxCount ), ( uxInitialCount ) ) +#endif + +/** + * semphr. h + *
SemaphoreHandle_t xSemaphoreCreateCountingStatic( UBaseType_t uxMaxCount, UBaseType_t uxInitialCount, StaticSemaphore_t *pxSemaphoreBuffer )
+ * + * Creates a new counting semaphore instance, and returns a handle by which the + * new counting semaphore can be referenced. + * + * In many usage scenarios it is faster and more memory efficient to use a + * direct to task notification in place of a counting semaphore! + * http://www.freertos.org/RTOS-task-notifications.html + * + * Internally, within the FreeRTOS implementation, counting semaphores use a + * block of memory, in which the counting semaphore structure is stored. If a + * counting semaphore is created using xSemaphoreCreateCounting() then the + * required memory is automatically dynamically allocated inside the + * xSemaphoreCreateCounting() function. (see + * http://www.freertos.org/a00111.html). If a counting semaphore is created + * using xSemaphoreCreateCountingStatic() then the application writer must + * provide the memory. xSemaphoreCreateCountingStatic() therefore allows a + * counting semaphore to be created without using any dynamic memory allocation. + * + * Counting semaphores are typically used for two things: + * + * 1) Counting events. + * + * In this usage scenario an event handler will 'give' a semaphore each time + * an event occurs (incrementing the semaphore count value), and a handler + * task will 'take' a semaphore each time it processes an event + * (decrementing the semaphore count value). The count value is therefore + * the difference between the number of events that have occurred and the + * number that have been processed. In this case it is desirable for the + * initial count value to be zero. + * + * 2) Resource management. + * + * In this usage scenario the count value indicates the number of resources + * available. To obtain control of a resource a task must first obtain a + * semaphore - decrementing the semaphore count value. When the count value + * reaches zero there are no free resources. When a task finishes with the + * resource it 'gives' the semaphore back - incrementing the semaphore count + * value. In this case it is desirable for the initial count value to be + * equal to the maximum count value, indicating that all resources are free. + * + * @param uxMaxCount The maximum count value that can be reached. When the + * semaphore reaches this value it can no longer be 'given'. + * + * @param uxInitialCount The count value assigned to the semaphore when it is + * created. + * + * @param pxSemaphoreBuffer Must point to a variable of type StaticSemaphore_t, + * which will then be used to hold the semaphore's data structure, removing the + * need for the memory to be allocated dynamically. + * + * @return If the counting semaphore was successfully created then a handle to + * the created counting semaphore is returned. If pxSemaphoreBuffer was NULL + * then NULL is returned. + * + * Example usage: +
+ SemaphoreHandle_t xSemaphore;
+ StaticSemaphore_t xSemaphoreBuffer;
+
+ void vATask( void * pvParameters )
+ {
+ SemaphoreHandle_t xSemaphore = NULL;
+
+    // Counting semaphore cannot be used before they have been created.  Create
+    // a counting semaphore using xSemaphoreCreateCountingStatic().  The max
+    // value to which the semaphore can count is 10, and the initial value
+    // assigned to the count will be 0.  The address of xSemaphoreBuffer is
+    // passed in and will be used to hold the semaphore structure, so no dynamic
+    // memory allocation will be used.
+    xSemaphore = xSemaphoreCreateCounting( 10, 0, &xSemaphoreBuffer );
+
+    // No memory allocation was attempted so xSemaphore cannot be NULL, so there
+    // is no need to check its value.
+ }
+ 
+ * \defgroup xSemaphoreCreateCountingStatic xSemaphoreCreateCountingStatic + * \ingroup Semaphores + */ +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + #define xSemaphoreCreateCountingStatic( uxMaxCount, uxInitialCount, pxSemaphoreBuffer ) xQueueCreateCountingSemaphoreStatic( ( uxMaxCount ), ( uxInitialCount ), ( pxSemaphoreBuffer ) ) +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/** + * semphr. h + *
void vSemaphoreDelete( SemaphoreHandle_t xSemaphore );
+ * + * Delete a semaphore. This function must be used with care. For example, + * do not delete a mutex type semaphore if the mutex is held by a task. + * + * @param xSemaphore A handle to the semaphore to be deleted. + * + * \defgroup vSemaphoreDelete vSemaphoreDelete + * \ingroup Semaphores + */ +#define vSemaphoreDelete( xSemaphore ) vQueueDelete( ( QueueHandle_t ) ( xSemaphore ) ) + +/** + * semphr.h + *
TaskHandle_t xSemaphoreGetMutexHolder( SemaphoreHandle_t xMutex );
+ * + * If xMutex is indeed a mutex type semaphore, return the current mutex holder. + * If xMutex is not a mutex type semaphore, or the mutex is available (not held + * by a task), return NULL. + * + * Note: This is a good way of determining if the calling task is the mutex + * holder, but not a good way of determining the identity of the mutex holder as + * the holder may change between the function exiting and the returned value + * being tested. + */ +#define xSemaphoreGetMutexHolder( xSemaphore ) xQueueGetMutexHolder( ( xSemaphore ) ) + +/** + * semphr.h + *
UBaseType_t uxSemaphoreGetCount( SemaphoreHandle_t xSemaphore );
+ * + * If the semaphore is a counting semaphore then uxSemaphoreGetCount() returns + * its current count value. If the semaphore is a binary semaphore then + * uxSemaphoreGetCount() returns 1 if the semaphore is available, and 0 if the + * semaphore is not available. + * + */ +#define uxSemaphoreGetCount( xSemaphore ) uxQueueMessagesWaiting( ( QueueHandle_t ) ( xSemaphore ) ) + +#endif /* SEMAPHORE_H */ + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/include/stdint.readme b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/include/stdint.readme new file mode 100644 index 0000000..6d86149 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/include/stdint.readme @@ -0,0 +1,27 @@ + +#ifndef FREERTOS_STDINT +#define FREERTOS_STDINT + +/******************************************************************************* + * THIS IS NOT A FULL stdint.h IMPLEMENTATION - It only contains the definitions + * necessary to build the FreeRTOS code. It is provided to allow FreeRTOS to be + * built using compilers that do not provide their own stdint.h definition. + * + * To use this file: + * + * 1) Copy this file into the directory that contains your FreeRTOSConfig.h + * header file, as that directory will already be in the compilers include + * path. + * + * 2) Rename the copied file stdint.h. + * + */ + +typedef signed char int8_t; +typedef unsigned char uint8_t; +typedef short int16_t; +typedef unsigned short uint16_t; +typedef long int32_t; +typedef unsigned long uint32_t; + +#endif /* FREERTOS_STDINT */ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/include/task.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/include/task.h new file mode 100644 index 0000000..5e409c8 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/include/task.h @@ -0,0 +1,2267 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef INC_TASK_H +#define INC_TASK_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h must appear in source files before include task.h" +#endif + +#include "list.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * MACROS AND DEFINITIONS + *----------------------------------------------------------*/ + +#define tskKERNEL_VERSION_NUMBER "V9.0.0" +#define tskKERNEL_VERSION_MAJOR 9 +#define tskKERNEL_VERSION_MINOR 0 +#define tskKERNEL_VERSION_BUILD 0 + +/** + * task. h + * + * Type by which tasks are referenced. For example, a call to xTaskCreate + * returns (via a pointer parameter) an TaskHandle_t variable that can then + * be used as a parameter to vTaskDelete to delete the task. + * + * \defgroup TaskHandle_t TaskHandle_t + * \ingroup Tasks + */ +typedef void * TaskHandle_t; + +/* + * Defines the prototype to which the application task hook function must + * conform. + */ +typedef BaseType_t (*TaskHookFunction_t)( void * ); + +/* Task states returned by eTaskGetState. */ +typedef enum +{ + eRunning = 0, /* A task is querying the state of itself, so must be running. */ + eReady, /* The task being queried is in a read or pending ready list. */ + eBlocked, /* The task being queried is in the Blocked state. */ + eSuspended, /* The task being queried is in the Suspended state, or is in the Blocked state with an infinite time out. */ + eDeleted, /* The task being queried has been deleted, but its TCB has not yet been freed. */ + eInvalid /* Used as an 'invalid state' value. */ +} eTaskState; + +/* Actions that can be performed when vTaskNotify() is called. */ +typedef enum +{ + eNoAction = 0, /* Notify the task without updating its notify value. */ + eSetBits, /* Set bits in the task's notification value. */ + eIncrement, /* Increment the task's notification value. */ + eSetValueWithOverwrite, /* Set the task's notification value to a specific value even if the previous value has not yet been read by the task. */ + eSetValueWithoutOverwrite /* Set the task's notification value if the previous value has been read by the task. */ +} eNotifyAction; + +/* + * Used internally only. + */ +typedef struct xTIME_OUT +{ + BaseType_t xOverflowCount; + TickType_t xTimeOnEntering; +} TimeOut_t; + +/* + * Defines the memory ranges allocated to the task when an MPU is used. + */ +typedef struct xMEMORY_REGION +{ + void *pvBaseAddress; + uint32_t ulLengthInBytes; + uint32_t ulParameters; +} MemoryRegion_t; + +/* + * Parameters required to create an MPU protected task. + */ +typedef struct xTASK_PARAMETERS +{ + TaskFunction_t pvTaskCode; + const char * const pcName; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + uint16_t usStackDepth; + void *pvParameters; + UBaseType_t uxPriority; + StackType_t *puxStackBuffer; + MemoryRegion_t xRegions[ portNUM_CONFIGURABLE_REGIONS ]; +} TaskParameters_t; + +/* Used with the uxTaskGetSystemState() function to return the state of each task +in the system. */ +typedef struct xTASK_STATUS +{ + TaskHandle_t xHandle; /* The handle of the task to which the rest of the information in the structure relates. */ + const char *pcTaskName; /* A pointer to the task's name. This value will be invalid if the task was deleted since the structure was populated! */ /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + UBaseType_t xTaskNumber; /* A number unique to the task. */ + eTaskState eCurrentState; /* The state in which the task existed when the structure was populated. */ + UBaseType_t uxCurrentPriority; /* The priority at which the task was running (may be inherited) when the structure was populated. */ + UBaseType_t uxBasePriority; /* The priority to which the task will return if the task's current priority has been inherited to avoid unbounded priority inversion when obtaining a mutex. Only valid if configUSE_MUTEXES is defined as 1 in FreeRTOSConfig.h. */ + uint32_t ulRunTimeCounter; /* The total run time allocated to the task so far, as defined by the run time stats clock. See http://www.freertos.org/rtos-run-time-stats.html. Only valid when configGENERATE_RUN_TIME_STATS is defined as 1 in FreeRTOSConfig.h. */ + StackType_t *pxStackBase; /* Points to the lowest address of the task's stack area. */ + uint16_t usStackHighWaterMark; /* The minimum amount of stack space that has remained for the task since the task was created. The closer this value is to zero the closer the task has come to overflowing its stack. */ +} TaskStatus_t; + +/* Possible return values for eTaskConfirmSleepModeStatus(). */ +typedef enum +{ + eAbortSleep = 0, /* A task has been made ready or a context switch pended since portSUPPORESS_TICKS_AND_SLEEP() was called - abort entering a sleep mode. */ + eStandardSleep, /* Enter a sleep mode that will not last any longer than the expected idle time. */ + eNoTasksWaitingTimeout /* No tasks are waiting for a timeout so it is safe to enter a sleep mode that can only be exited by an external interrupt. */ +} eSleepModeStatus; + +/** + * Defines the priority used by the idle task. This must not be modified. + * + * \ingroup TaskUtils + */ +#define tskIDLE_PRIORITY ( ( UBaseType_t ) 0U ) + +/** + * task. h + * + * Macro for forcing a context switch. + * + * \defgroup taskYIELD taskYIELD + * \ingroup SchedulerControl + */ +#define taskYIELD() portYIELD() + +/** + * task. h + * + * Macro to mark the start of a critical code region. Preemptive context + * switches cannot occur when in a critical region. + * + * NOTE: This may alter the stack (depending on the portable implementation) + * so must be used with care! + * + * \defgroup taskENTER_CRITICAL taskENTER_CRITICAL + * \ingroup SchedulerControl + */ +#define taskENTER_CRITICAL() portENTER_CRITICAL() +#define taskENTER_CRITICAL_FROM_ISR() portSET_INTERRUPT_MASK_FROM_ISR() + +/** + * task. h + * + * Macro to mark the end of a critical code region. Preemptive context + * switches cannot occur when in a critical region. + * + * NOTE: This may alter the stack (depending on the portable implementation) + * so must be used with care! + * + * \defgroup taskEXIT_CRITICAL taskEXIT_CRITICAL + * \ingroup SchedulerControl + */ +#define taskEXIT_CRITICAL() portEXIT_CRITICAL() +#define taskEXIT_CRITICAL_FROM_ISR( x ) portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) +/** + * task. h + * + * Macro to disable all maskable interrupts. + * + * \defgroup taskDISABLE_INTERRUPTS taskDISABLE_INTERRUPTS + * \ingroup SchedulerControl + */ +#define taskDISABLE_INTERRUPTS() portDISABLE_INTERRUPTS() + +/** + * task. h + * + * Macro to enable microcontroller interrupts. + * + * \defgroup taskENABLE_INTERRUPTS taskENABLE_INTERRUPTS + * \ingroup SchedulerControl + */ +#define taskENABLE_INTERRUPTS() portENABLE_INTERRUPTS() + +/* Definitions returned by xTaskGetSchedulerState(). taskSCHEDULER_SUSPENDED is +0 to generate more optimal code when configASSERT() is defined as the constant +is used in assert() statements. */ +#define taskSCHEDULER_SUSPENDED ( ( BaseType_t ) 0 ) +#define taskSCHEDULER_NOT_STARTED ( ( BaseType_t ) 1 ) +#define taskSCHEDULER_RUNNING ( ( BaseType_t ) 2 ) + + +/*----------------------------------------------------------- + * TASK CREATION API + *----------------------------------------------------------*/ + +/** + * task. h + *
+ BaseType_t xTaskCreate(
+							  TaskFunction_t pvTaskCode,
+							  const char * const pcName,
+							  uint16_t usStackDepth,
+							  void *pvParameters,
+							  UBaseType_t uxPriority,
+							  TaskHandle_t *pvCreatedTask
+						  );
+ * + * Create a new task and add it to the list of tasks that are ready to run. + * + * Internally, within the FreeRTOS implementation, tasks use two blocks of + * memory. The first block is used to hold the task's data structures. The + * second block is used by the task as its stack. If a task is created using + * xTaskCreate() then both blocks of memory are automatically dynamically + * allocated inside the xTaskCreate() function. (see + * http://www.freertos.org/a00111.html). If a task is created using + * xTaskCreateStatic() then the application writer must provide the required + * memory. xTaskCreateStatic() therefore allows a task to be created without + * using any dynamic memory allocation. + * + * See xTaskCreateStatic() for a version that does not use any dynamic memory + * allocation. + * + * xTaskCreate() can only be used to create a task that has unrestricted + * access to the entire microcontroller memory map. Systems that include MPU + * support can alternatively create an MPU constrained task using + * xTaskCreateRestricted(). + * + * @param pvTaskCode Pointer to the task entry function. Tasks + * must be implemented to never return (i.e. continuous loop). + * + * @param pcName A descriptive name for the task. This is mainly used to + * facilitate debugging. Max length defined by configMAX_TASK_NAME_LEN - default + * is 16. + * + * @param usStackDepth The size of the task stack specified as the number of + * variables the stack can hold - not the number of bytes. For example, if + * the stack is 16 bits wide and usStackDepth is defined as 100, 200 bytes + * will be allocated for stack storage. + * + * @param pvParameters Pointer that will be used as the parameter for the task + * being created. + * + * @param uxPriority The priority at which the task should run. Systems that + * include MPU support can optionally create tasks in a privileged (system) + * mode by setting bit portPRIVILEGE_BIT of the priority parameter. For + * example, to create a privileged task at priority 2 the uxPriority parameter + * should be set to ( 2 | portPRIVILEGE_BIT ). + * + * @param pvCreatedTask Used to pass back a handle by which the created task + * can be referenced. + * + * @return pdPASS if the task was successfully created and added to a ready + * list, otherwise an error code defined in the file projdefs.h + * + * Example usage: +
+ // Task to be created.
+ void vTaskCode( void * pvParameters )
+ {
+	 for( ;; )
+	 {
+		 // Task code goes here.
+	 }
+ }
+
+ // Function that creates a task.
+ void vOtherFunction( void )
+ {
+ static uint8_t ucParameterToPass;
+ TaskHandle_t xHandle = NULL;
+
+	 // Create the task, storing the handle.  Note that the passed parameter ucParameterToPass
+	 // must exist for the lifetime of the task, so in this case is declared static.  If it was just an
+	 // an automatic stack variable it might no longer exist, or at least have been corrupted, by the time
+	 // the new task attempts to access it.
+	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, &ucParameterToPass, tskIDLE_PRIORITY, &xHandle );
+     configASSERT( xHandle );
+
+	 // Use the handle to delete the task.
+     if( xHandle != NULL )
+     {
+	     vTaskDelete( xHandle );
+     }
+ }
+   
+ * \defgroup xTaskCreate xTaskCreate + * \ingroup Tasks + */ +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, + const char * const pcName, + const uint16_t usStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + TaskHandle_t * const pxCreatedTask ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ +#endif + +/** + * task. h + *
+ TaskHandle_t xTaskCreateStatic( TaskFunction_t pvTaskCode,
+								 const char * const pcName,
+								 uint32_t ulStackDepth,
+								 void *pvParameters,
+								 UBaseType_t uxPriority,
+								 StackType_t *pxStackBuffer,
+								 StaticTask_t *pxTaskBuffer );
+ * + * Create a new task and add it to the list of tasks that are ready to run. + * + * Internally, within the FreeRTOS implementation, tasks use two blocks of + * memory. The first block is used to hold the task's data structures. The + * second block is used by the task as its stack. If a task is created using + * xTaskCreate() then both blocks of memory are automatically dynamically + * allocated inside the xTaskCreate() function. (see + * http://www.freertos.org/a00111.html). If a task is created using + * xTaskCreateStatic() then the application writer must provide the required + * memory. xTaskCreateStatic() therefore allows a task to be created without + * using any dynamic memory allocation. + * + * @param pvTaskCode Pointer to the task entry function. Tasks + * must be implemented to never return (i.e. continuous loop). + * + * @param pcName A descriptive name for the task. This is mainly used to + * facilitate debugging. The maximum length of the string is defined by + * configMAX_TASK_NAME_LEN in FreeRTOSConfig.h. + * + * @param ulStackDepth The size of the task stack specified as the number of + * variables the stack can hold - not the number of bytes. For example, if + * the stack is 32-bits wide and ulStackDepth is defined as 100 then 400 bytes + * will be allocated for stack storage. + * + * @param pvParameters Pointer that will be used as the parameter for the task + * being created. + * + * @param uxPriority The priority at which the task will run. + * + * @param pxStackBuffer Must point to a StackType_t array that has at least + * ulStackDepth indexes - the array will then be used as the task's stack, + * removing the need for the stack to be allocated dynamically. + * + * @param pxTaskBuffer Must point to a variable of type StaticTask_t, which will + * then be used to hold the task's data structures, removing the need for the + * memory to be allocated dynamically. + * + * @return If neither pxStackBuffer or pxTaskBuffer are NULL, then the task will + * be created and pdPASS is returned. If either pxStackBuffer or pxTaskBuffer + * are NULL then the task will not be created and + * errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY is returned. + * + * Example usage: +
+
+    // Dimensions the buffer that the task being created will use as its stack.
+    // NOTE:  This is the number of words the stack will hold, not the number of
+    // bytes.  For example, if each stack item is 32-bits, and this is set to 100,
+    // then 400 bytes (100 * 32-bits) will be allocated.
+    #define STACK_SIZE 200
+
+    // Structure that will hold the TCB of the task being created.
+    StaticTask_t xTaskBuffer;
+
+    // Buffer that the task being created will use as its stack.  Note this is
+    // an array of StackType_t variables.  The size of StackType_t is dependent on
+    // the RTOS port.
+    StackType_t xStack[ STACK_SIZE ];
+
+    // Function that implements the task being created.
+    void vTaskCode( void * pvParameters )
+    {
+        // The parameter value is expected to be 1 as 1 is passed in the
+        // pvParameters value in the call to xTaskCreateStatic().
+        configASSERT( ( uint32_t ) pvParameters == 1UL );
+
+        for( ;; )
+        {
+            // Task code goes here.
+        }
+    }
+
+    // Function that creates a task.
+    void vOtherFunction( void )
+    {
+        TaskHandle_t xHandle = NULL;
+
+        // Create the task without using any dynamic memory allocation.
+        xHandle = xTaskCreateStatic(
+                      vTaskCode,       // Function that implements the task.
+                      "NAME",          // Text name for the task.
+                      STACK_SIZE,      // Stack size in words, not bytes.
+                      ( void * ) 1,    // Parameter passed into the task.
+                      tskIDLE_PRIORITY,// Priority at which the task is created.
+                      xStack,          // Array to use as the task's stack.
+                      &xTaskBuffer );  // Variable to hold the task's data structure.
+
+        // puxStackBuffer and pxTaskBuffer were not NULL, so the task will have
+        // been created, and xHandle will be the task's handle.  Use the handle
+        // to suspend the task.
+        vTaskSuspend( xHandle );
+    }
+   
+ * \defgroup xTaskCreateStatic xTaskCreateStatic + * \ingroup Tasks + */ +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode, + const char * const pcName, + const uint32_t ulStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + StackType_t * const puxStackBuffer, + StaticTask_t * const pxTaskBuffer ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/** + * task. h + *
+ BaseType_t xTaskCreateRestricted( TaskParameters_t *pxTaskDefinition, TaskHandle_t *pxCreatedTask );
+ * + * xTaskCreateRestricted() should only be used in systems that include an MPU + * implementation. + * + * Create a new task and add it to the list of tasks that are ready to run. + * The function parameters define the memory regions and associated access + * permissions allocated to the task. + * + * @param pxTaskDefinition Pointer to a structure that contains a member + * for each of the normal xTaskCreate() parameters (see the xTaskCreate() API + * documentation) plus an optional stack buffer and the memory region + * definitions. + * + * @param pxCreatedTask Used to pass back a handle by which the created task + * can be referenced. + * + * @return pdPASS if the task was successfully created and added to a ready + * list, otherwise an error code defined in the file projdefs.h + * + * Example usage: +
+// Create an TaskParameters_t structure that defines the task to be created.
+static const TaskParameters_t xCheckTaskParameters =
+{
+	vATask,		// pvTaskCode - the function that implements the task.
+	"ATask",	// pcName - just a text name for the task to assist debugging.
+	100,		// usStackDepth	- the stack size DEFINED IN WORDS.
+	NULL,		// pvParameters - passed into the task function as the function parameters.
+	( 1UL | portPRIVILEGE_BIT ),// uxPriority - task priority, set the portPRIVILEGE_BIT if the task should run in a privileged state.
+	cStackBuffer,// puxStackBuffer - the buffer to be used as the task stack.
+
+	// xRegions - Allocate up to three separate memory regions for access by
+	// the task, with appropriate access permissions.  Different processors have
+	// different memory alignment requirements - refer to the FreeRTOS documentation
+	// for full information.
+	{
+		// Base address					Length	Parameters
+        { cReadWriteArray,				32,		portMPU_REGION_READ_WRITE },
+        { cReadOnlyArray,				32,		portMPU_REGION_READ_ONLY },
+        { cPrivilegedOnlyAccessArray,	128,	portMPU_REGION_PRIVILEGED_READ_WRITE }
+	}
+};
+
+int main( void )
+{
+TaskHandle_t xHandle;
+
+	// Create a task from the const structure defined above.  The task handle
+	// is requested (the second parameter is not NULL) but in this case just for
+	// demonstration purposes as its not actually used.
+	xTaskCreateRestricted( &xRegTest1Parameters, &xHandle );
+
+	// Start the scheduler.
+	vTaskStartScheduler();
+
+	// Will only get here if there was insufficient memory to create the idle
+	// and/or timer task.
+	for( ;; );
+}
+   
+ * \defgroup xTaskCreateRestricted xTaskCreateRestricted + * \ingroup Tasks + */ +#if( portUSING_MPU_WRAPPERS == 1 ) + BaseType_t xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition, TaskHandle_t *pxCreatedTask ) PRIVILEGED_FUNCTION; +#endif + +/** + * task. h + *
+ void vTaskAllocateMPURegions( TaskHandle_t xTask, const MemoryRegion_t * const pxRegions );
+ * + * Memory regions are assigned to a restricted task when the task is created by + * a call to xTaskCreateRestricted(). These regions can be redefined using + * vTaskAllocateMPURegions(). + * + * @param xTask The handle of the task being updated. + * + * @param xRegions A pointer to an MemoryRegion_t structure that contains the + * new memory region definitions. + * + * Example usage: +
+// Define an array of MemoryRegion_t structures that configures an MPU region
+// allowing read/write access for 1024 bytes starting at the beginning of the
+// ucOneKByte array.  The other two of the maximum 3 definable regions are
+// unused so set to zero.
+static const MemoryRegion_t xAltRegions[ portNUM_CONFIGURABLE_REGIONS ] =
+{
+	// Base address		Length		Parameters
+	{ ucOneKByte,		1024,		portMPU_REGION_READ_WRITE },
+	{ 0,				0,			0 },
+	{ 0,				0,			0 }
+};
+
+void vATask( void *pvParameters )
+{
+	// This task was created such that it has access to certain regions of
+	// memory as defined by the MPU configuration.  At some point it is
+	// desired that these MPU regions are replaced with that defined in the
+	// xAltRegions const struct above.  Use a call to vTaskAllocateMPURegions()
+	// for this purpose.  NULL is used as the task handle to indicate that this
+	// function should modify the MPU regions of the calling task.
+	vTaskAllocateMPURegions( NULL, xAltRegions );
+
+	// Now the task can continue its function, but from this point on can only
+	// access its stack and the ucOneKByte array (unless any other statically
+	// defined or shared regions have been declared elsewhere).
+}
+   
+ * \defgroup xTaskCreateRestricted xTaskCreateRestricted + * \ingroup Tasks + */ +void vTaskAllocateMPURegions( TaskHandle_t xTask, const MemoryRegion_t * const pxRegions ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
void vTaskDelete( TaskHandle_t xTask );
+ * + * INCLUDE_vTaskDelete must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Remove a task from the RTOS real time kernel's management. The task being + * deleted will be removed from all ready, blocked, suspended and event lists. + * + * NOTE: The idle task is responsible for freeing the kernel allocated + * memory from tasks that have been deleted. It is therefore important that + * the idle task is not starved of microcontroller processing time if your + * application makes any calls to vTaskDelete (). Memory allocated by the + * task code is not automatically freed, and should be freed before the task + * is deleted. + * + * See the demo application file death.c for sample code that utilises + * vTaskDelete (). + * + * @param xTask The handle of the task to be deleted. Passing NULL will + * cause the calling task to be deleted. + * + * Example usage: +
+ void vOtherFunction( void )
+ {
+ TaskHandle_t xHandle;
+
+	 // Create the task, storing the handle.
+	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
+
+	 // Use the handle to delete the task.
+	 vTaskDelete( xHandle );
+ }
+   
+ * \defgroup vTaskDelete vTaskDelete + * \ingroup Tasks + */ +void vTaskDelete( TaskHandle_t xTaskToDelete ) PRIVILEGED_FUNCTION; + +/*----------------------------------------------------------- + * TASK CONTROL API + *----------------------------------------------------------*/ + +/** + * task. h + *
void vTaskDelay( const TickType_t xTicksToDelay );
+ * + * Delay a task for a given number of ticks. The actual time that the + * task remains blocked depends on the tick rate. The constant + * portTICK_PERIOD_MS can be used to calculate real time from the tick + * rate - with the resolution of one tick period. + * + * INCLUDE_vTaskDelay must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * + * vTaskDelay() specifies a time at which the task wishes to unblock relative to + * the time at which vTaskDelay() is called. For example, specifying a block + * period of 100 ticks will cause the task to unblock 100 ticks after + * vTaskDelay() is called. vTaskDelay() does not therefore provide a good method + * of controlling the frequency of a periodic task as the path taken through the + * code, as well as other task and interrupt activity, will effect the frequency + * at which vTaskDelay() gets called and therefore the time at which the task + * next executes. See vTaskDelayUntil() for an alternative API function designed + * to facilitate fixed frequency execution. It does this by specifying an + * absolute time (rather than a relative time) at which the calling task should + * unblock. + * + * @param xTicksToDelay The amount of time, in tick periods, that + * the calling task should block. + * + * Example usage: + + void vTaskFunction( void * pvParameters ) + { + // Block for 500ms. + const TickType_t xDelay = 500 / portTICK_PERIOD_MS; + + for( ;; ) + { + // Simply toggle the LED every 500ms, blocking between each toggle. + vToggleLED(); + vTaskDelay( xDelay ); + } + } + + * \defgroup vTaskDelay vTaskDelay + * \ingroup TaskCtrl + */ +void vTaskDelay( const TickType_t xTicksToDelay ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
void vTaskDelayUntil( TickType_t *pxPreviousWakeTime, const TickType_t xTimeIncrement );
+ * + * INCLUDE_vTaskDelayUntil must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Delay a task until a specified time. This function can be used by periodic + * tasks to ensure a constant execution frequency. + * + * This function differs from vTaskDelay () in one important aspect: vTaskDelay () will + * cause a task to block for the specified number of ticks from the time vTaskDelay () is + * called. It is therefore difficult to use vTaskDelay () by itself to generate a fixed + * execution frequency as the time between a task starting to execute and that task + * calling vTaskDelay () may not be fixed [the task may take a different path though the + * code between calls, or may get interrupted or preempted a different number of times + * each time it executes]. + * + * Whereas vTaskDelay () specifies a wake time relative to the time at which the function + * is called, vTaskDelayUntil () specifies the absolute (exact) time at which it wishes to + * unblock. + * + * The constant portTICK_PERIOD_MS can be used to calculate real time from the tick + * rate - with the resolution of one tick period. + * + * @param pxPreviousWakeTime Pointer to a variable that holds the time at which the + * task was last unblocked. The variable must be initialised with the current time + * prior to its first use (see the example below). Following this the variable is + * automatically updated within vTaskDelayUntil (). + * + * @param xTimeIncrement The cycle time period. The task will be unblocked at + * time *pxPreviousWakeTime + xTimeIncrement. Calling vTaskDelayUntil with the + * same xTimeIncrement parameter value will cause the task to execute with + * a fixed interface period. + * + * Example usage: +
+ // Perform an action every 10 ticks.
+ void vTaskFunction( void * pvParameters )
+ {
+ TickType_t xLastWakeTime;
+ const TickType_t xFrequency = 10;
+
+	 // Initialise the xLastWakeTime variable with the current time.
+	 xLastWakeTime = xTaskGetTickCount ();
+	 for( ;; )
+	 {
+		 // Wait for the next cycle.
+		 vTaskDelayUntil( &xLastWakeTime, xFrequency );
+
+		 // Perform action here.
+	 }
+ }
+   
+ * \defgroup vTaskDelayUntil vTaskDelayUntil + * \ingroup TaskCtrl + */ +void vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, const TickType_t xTimeIncrement ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
BaseType_t xTaskAbortDelay( TaskHandle_t xTask );
+ * + * INCLUDE_xTaskAbortDelay must be defined as 1 in FreeRTOSConfig.h for this + * function to be available. + * + * A task will enter the Blocked state when it is waiting for an event. The + * event it is waiting for can be a temporal event (waiting for a time), such + * as when vTaskDelay() is called, or an event on an object, such as when + * xQueueReceive() or ulTaskNotifyTake() is called. If the handle of a task + * that is in the Blocked state is used in a call to xTaskAbortDelay() then the + * task will leave the Blocked state, and return from whichever function call + * placed the task into the Blocked state. + * + * @param xTask The handle of the task to remove from the Blocked state. + * + * @return If the task referenced by xTask was not in the Blocked state then + * pdFAIL is returned. Otherwise pdPASS is returned. + * + * \defgroup xTaskAbortDelay xTaskAbortDelay + * \ingroup TaskCtrl + */ +BaseType_t xTaskAbortDelay( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
UBaseType_t uxTaskPriorityGet( TaskHandle_t xTask );
+ * + * INCLUDE_uxTaskPriorityGet must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Obtain the priority of any task. + * + * @param xTask Handle of the task to be queried. Passing a NULL + * handle results in the priority of the calling task being returned. + * + * @return The priority of xTask. + * + * Example usage: +
+ void vAFunction( void )
+ {
+ TaskHandle_t xHandle;
+
+	 // Create a task, storing the handle.
+	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
+
+	 // ...
+
+	 // Use the handle to obtain the priority of the created task.
+	 // It was created with tskIDLE_PRIORITY, but may have changed
+	 // it itself.
+	 if( uxTaskPriorityGet( xHandle ) != tskIDLE_PRIORITY )
+	 {
+		 // The task has changed it's priority.
+	 }
+
+	 // ...
+
+	 // Is our priority higher than the created task?
+	 if( uxTaskPriorityGet( xHandle ) < uxTaskPriorityGet( NULL ) )
+	 {
+		 // Our priority (obtained using NULL handle) is higher.
+	 }
+ }
+   
+ * \defgroup uxTaskPriorityGet uxTaskPriorityGet + * \ingroup TaskCtrl + */ +UBaseType_t uxTaskPriorityGet( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
UBaseType_t uxTaskPriorityGetFromISR( TaskHandle_t xTask );
+ * + * A version of uxTaskPriorityGet() that can be used from an ISR. + */ +UBaseType_t uxTaskPriorityGetFromISR( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
eTaskState eTaskGetState( TaskHandle_t xTask );
+ * + * INCLUDE_eTaskGetState must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Obtain the state of any task. States are encoded by the eTaskState + * enumerated type. + * + * @param xTask Handle of the task to be queried. + * + * @return The state of xTask at the time the function was called. Note the + * state of the task might change between the function being called, and the + * functions return value being tested by the calling task. + */ +eTaskState eTaskGetState( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
void vTaskGetInfo( TaskHandle_t xTask, TaskStatus_t *pxTaskStatus, BaseType_t xGetFreeStackSpace, eTaskState eState );
+ * + * configUSE_TRACE_FACILITY must be defined as 1 for this function to be + * available. See the configuration section for more information. + * + * Populates a TaskStatus_t structure with information about a task. + * + * @param xTask Handle of the task being queried. If xTask is NULL then + * information will be returned about the calling task. + * + * @param pxTaskStatus A pointer to the TaskStatus_t structure that will be + * filled with information about the task referenced by the handle passed using + * the xTask parameter. + * + * @xGetFreeStackSpace The TaskStatus_t structure contains a member to report + * the stack high water mark of the task being queried. Calculating the stack + * high water mark takes a relatively long time, and can make the system + * temporarily unresponsive - so the xGetFreeStackSpace parameter is provided to + * allow the high water mark checking to be skipped. The high watermark value + * will only be written to the TaskStatus_t structure if xGetFreeStackSpace is + * not set to pdFALSE; + * + * @param eState The TaskStatus_t structure contains a member to report the + * state of the task being queried. Obtaining the task state is not as fast as + * a simple assignment - so the eState parameter is provided to allow the state + * information to be omitted from the TaskStatus_t structure. To obtain state + * information then set eState to eInvalid - otherwise the value passed in + * eState will be reported as the task state in the TaskStatus_t structure. + * + * Example usage: +
+ void vAFunction( void )
+ {
+ TaskHandle_t xHandle;
+ TaskStatus_t xTaskDetails;
+
+    // Obtain the handle of a task from its name.
+    xHandle = xTaskGetHandle( "Task_Name" );
+
+    // Check the handle is not NULL.
+    configASSERT( xHandle );
+
+    // Use the handle to obtain further information about the task.
+    vTaskGetInfo( xHandle,
+                  &xTaskDetails,
+                  pdTRUE, // Include the high water mark in xTaskDetails.
+                  eInvalid ); // Include the task state in xTaskDetails.
+ }
+   
+ * \defgroup vTaskGetInfo vTaskGetInfo + * \ingroup TaskCtrl + */ +void vTaskGetInfo( TaskHandle_t xTask, TaskStatus_t *pxTaskStatus, BaseType_t xGetFreeStackSpace, eTaskState eState ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
void vTaskPrioritySet( TaskHandle_t xTask, UBaseType_t uxNewPriority );
+ * + * INCLUDE_vTaskPrioritySet must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Set the priority of any task. + * + * A context switch will occur before the function returns if the priority + * being set is higher than the currently executing task. + * + * @param xTask Handle to the task for which the priority is being set. + * Passing a NULL handle results in the priority of the calling task being set. + * + * @param uxNewPriority The priority to which the task will be set. + * + * Example usage: +
+ void vAFunction( void )
+ {
+ TaskHandle_t xHandle;
+
+	 // Create a task, storing the handle.
+	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
+
+	 // ...
+
+	 // Use the handle to raise the priority of the created task.
+	 vTaskPrioritySet( xHandle, tskIDLE_PRIORITY + 1 );
+
+	 // ...
+
+	 // Use a NULL handle to raise our priority to the same value.
+	 vTaskPrioritySet( NULL, tskIDLE_PRIORITY + 1 );
+ }
+   
+ * \defgroup vTaskPrioritySet vTaskPrioritySet + * \ingroup TaskCtrl + */ +void vTaskPrioritySet( TaskHandle_t xTask, UBaseType_t uxNewPriority ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
void vTaskSuspend( TaskHandle_t xTaskToSuspend );
+ * + * INCLUDE_vTaskSuspend must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Suspend any task. When suspended a task will never get any microcontroller + * processing time, no matter what its priority. + * + * Calls to vTaskSuspend are not accumulative - + * i.e. calling vTaskSuspend () twice on the same task still only requires one + * call to vTaskResume () to ready the suspended task. + * + * @param xTaskToSuspend Handle to the task being suspended. Passing a NULL + * handle will cause the calling task to be suspended. + * + * Example usage: +
+ void vAFunction( void )
+ {
+ TaskHandle_t xHandle;
+
+	 // Create a task, storing the handle.
+	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
+
+	 // ...
+
+	 // Use the handle to suspend the created task.
+	 vTaskSuspend( xHandle );
+
+	 // ...
+
+	 // The created task will not run during this period, unless
+	 // another task calls vTaskResume( xHandle ).
+
+	 //...
+
+
+	 // Suspend ourselves.
+	 vTaskSuspend( NULL );
+
+	 // We cannot get here unless another task calls vTaskResume
+	 // with our handle as the parameter.
+ }
+   
+ * \defgroup vTaskSuspend vTaskSuspend + * \ingroup TaskCtrl + */ +void vTaskSuspend( TaskHandle_t xTaskToSuspend ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
void vTaskResume( TaskHandle_t xTaskToResume );
+ * + * INCLUDE_vTaskSuspend must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Resumes a suspended task. + * + * A task that has been suspended by one or more calls to vTaskSuspend () + * will be made available for running again by a single call to + * vTaskResume (). + * + * @param xTaskToResume Handle to the task being readied. + * + * Example usage: +
+ void vAFunction( void )
+ {
+ TaskHandle_t xHandle;
+
+	 // Create a task, storing the handle.
+	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
+
+	 // ...
+
+	 // Use the handle to suspend the created task.
+	 vTaskSuspend( xHandle );
+
+	 // ...
+
+	 // The created task will not run during this period, unless
+	 // another task calls vTaskResume( xHandle ).
+
+	 //...
+
+
+	 // Resume the suspended task ourselves.
+	 vTaskResume( xHandle );
+
+	 // The created task will once again get microcontroller processing
+	 // time in accordance with its priority within the system.
+ }
+   
+ * \defgroup vTaskResume vTaskResume + * \ingroup TaskCtrl + */ +void vTaskResume( TaskHandle_t xTaskToResume ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
void xTaskResumeFromISR( TaskHandle_t xTaskToResume );
+ * + * INCLUDE_xTaskResumeFromISR must be defined as 1 for this function to be + * available. See the configuration section for more information. + * + * An implementation of vTaskResume() that can be called from within an ISR. + * + * A task that has been suspended by one or more calls to vTaskSuspend () + * will be made available for running again by a single call to + * xTaskResumeFromISR (). + * + * xTaskResumeFromISR() should not be used to synchronise a task with an + * interrupt if there is a chance that the interrupt could arrive prior to the + * task being suspended - as this can lead to interrupts being missed. Use of a + * semaphore as a synchronisation mechanism would avoid this eventuality. + * + * @param xTaskToResume Handle to the task being readied. + * + * @return pdTRUE if resuming the task should result in a context switch, + * otherwise pdFALSE. This is used by the ISR to determine if a context switch + * may be required following the ISR. + * + * \defgroup vTaskResumeFromISR vTaskResumeFromISR + * \ingroup TaskCtrl + */ +BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume ) PRIVILEGED_FUNCTION; + +/*----------------------------------------------------------- + * SCHEDULER CONTROL + *----------------------------------------------------------*/ + +/** + * task. h + *
void vTaskStartScheduler( void );
+ * + * Starts the real time kernel tick processing. After calling the kernel + * has control over which tasks are executed and when. + * + * See the demo application file main.c for an example of creating + * tasks and starting the kernel. + * + * Example usage: +
+ void vAFunction( void )
+ {
+	 // Create at least one task before starting the kernel.
+	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );
+
+	 // Start the real time kernel with preemption.
+	 vTaskStartScheduler ();
+
+	 // Will not get here unless a task calls vTaskEndScheduler ()
+ }
+   
+ * + * \defgroup vTaskStartScheduler vTaskStartScheduler + * \ingroup SchedulerControl + */ +void vTaskStartScheduler( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
void vTaskEndScheduler( void );
+ * + * NOTE: At the time of writing only the x86 real mode port, which runs on a PC + * in place of DOS, implements this function. + * + * Stops the real time kernel tick. All created tasks will be automatically + * deleted and multitasking (either preemptive or cooperative) will + * stop. Execution then resumes from the point where vTaskStartScheduler () + * was called, as if vTaskStartScheduler () had just returned. + * + * See the demo application file main. c in the demo/PC directory for an + * example that uses vTaskEndScheduler (). + * + * vTaskEndScheduler () requires an exit function to be defined within the + * portable layer (see vPortEndScheduler () in port. c for the PC port). This + * performs hardware specific operations such as stopping the kernel tick. + * + * vTaskEndScheduler () will cause all of the resources allocated by the + * kernel to be freed - but will not free resources allocated by application + * tasks. + * + * Example usage: +
+ void vTaskCode( void * pvParameters )
+ {
+	 for( ;; )
+	 {
+		 // Task code goes here.
+
+		 // At some point we want to end the real time kernel processing
+		 // so call ...
+		 vTaskEndScheduler ();
+	 }
+ }
+
+ void vAFunction( void )
+ {
+	 // Create at least one task before starting the kernel.
+	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );
+
+	 // Start the real time kernel with preemption.
+	 vTaskStartScheduler ();
+
+	 // Will only get here when the vTaskCode () task has called
+	 // vTaskEndScheduler ().  When we get here we are back to single task
+	 // execution.
+ }
+   
+ * + * \defgroup vTaskEndScheduler vTaskEndScheduler + * \ingroup SchedulerControl + */ +void vTaskEndScheduler( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
void vTaskSuspendAll( void );
+ * + * Suspends the scheduler without disabling interrupts. Context switches will + * not occur while the scheduler is suspended. + * + * After calling vTaskSuspendAll () the calling task will continue to execute + * without risk of being swapped out until a call to xTaskResumeAll () has been + * made. + * + * API functions that have the potential to cause a context switch (for example, + * vTaskDelayUntil(), xQueueSend(), etc.) must not be called while the scheduler + * is suspended. + * + * Example usage: +
+ void vTask1( void * pvParameters )
+ {
+	 for( ;; )
+	 {
+		 // Task code goes here.
+
+		 // ...
+
+		 // At some point the task wants to perform a long operation during
+		 // which it does not want to get swapped out.  It cannot use
+		 // taskENTER_CRITICAL ()/taskEXIT_CRITICAL () as the length of the
+		 // operation may cause interrupts to be missed - including the
+		 // ticks.
+
+		 // Prevent the real time kernel swapping out the task.
+		 vTaskSuspendAll ();
+
+		 // Perform the operation here.  There is no need to use critical
+		 // sections as we have all the microcontroller processing time.
+		 // During this time interrupts will still operate and the kernel
+		 // tick count will be maintained.
+
+		 // ...
+
+		 // The operation is complete.  Restart the kernel.
+		 xTaskResumeAll ();
+	 }
+ }
+   
+ * \defgroup vTaskSuspendAll vTaskSuspendAll + * \ingroup SchedulerControl + */ +void vTaskSuspendAll( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
BaseType_t xTaskResumeAll( void );
+ * + * Resumes scheduler activity after it was suspended by a call to + * vTaskSuspendAll(). + * + * xTaskResumeAll() only resumes the scheduler. It does not unsuspend tasks + * that were previously suspended by a call to vTaskSuspend(). + * + * @return If resuming the scheduler caused a context switch then pdTRUE is + * returned, otherwise pdFALSE is returned. + * + * Example usage: +
+ void vTask1( void * pvParameters )
+ {
+	 for( ;; )
+	 {
+		 // Task code goes here.
+
+		 // ...
+
+		 // At some point the task wants to perform a long operation during
+		 // which it does not want to get swapped out.  It cannot use
+		 // taskENTER_CRITICAL ()/taskEXIT_CRITICAL () as the length of the
+		 // operation may cause interrupts to be missed - including the
+		 // ticks.
+
+		 // Prevent the real time kernel swapping out the task.
+		 vTaskSuspendAll ();
+
+		 // Perform the operation here.  There is no need to use critical
+		 // sections as we have all the microcontroller processing time.
+		 // During this time interrupts will still operate and the real
+		 // time kernel tick count will be maintained.
+
+		 // ...
+
+		 // The operation is complete.  Restart the kernel.  We want to force
+		 // a context switch - but there is no point if resuming the scheduler
+		 // caused a context switch already.
+		 if( !xTaskResumeAll () )
+		 {
+			  taskYIELD ();
+		 }
+	 }
+ }
+   
+ * \defgroup xTaskResumeAll xTaskResumeAll + * \ingroup SchedulerControl + */ +BaseType_t xTaskResumeAll( void ) PRIVILEGED_FUNCTION; + +/*----------------------------------------------------------- + * TASK UTILITIES + *----------------------------------------------------------*/ + +/** + * task. h + *
TickType_t xTaskGetTickCount( void );
+ * + * @return The count of ticks since vTaskStartScheduler was called. + * + * \defgroup xTaskGetTickCount xTaskGetTickCount + * \ingroup TaskUtils + */ +TickType_t xTaskGetTickCount( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
TickType_t xTaskGetTickCountFromISR( void );
+ * + * @return The count of ticks since vTaskStartScheduler was called. + * + * This is a version of xTaskGetTickCount() that is safe to be called from an + * ISR - provided that TickType_t is the natural word size of the + * microcontroller being used or interrupt nesting is either not supported or + * not being used. + * + * \defgroup xTaskGetTickCountFromISR xTaskGetTickCountFromISR + * \ingroup TaskUtils + */ +TickType_t xTaskGetTickCountFromISR( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
uint16_t uxTaskGetNumberOfTasks( void );
+ * + * @return The number of tasks that the real time kernel is currently managing. + * This includes all ready, blocked and suspended tasks. A task that + * has been deleted but not yet freed by the idle task will also be + * included in the count. + * + * \defgroup uxTaskGetNumberOfTasks uxTaskGetNumberOfTasks + * \ingroup TaskUtils + */ +UBaseType_t uxTaskGetNumberOfTasks( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
char *pcTaskGetName( TaskHandle_t xTaskToQuery );
+ * + * @return The text (human readable) name of the task referenced by the handle + * xTaskToQuery. A task can query its own name by either passing in its own + * handle, or by setting xTaskToQuery to NULL. + * + * \defgroup pcTaskGetName pcTaskGetName + * \ingroup TaskUtils + */ +char *pcTaskGetName( TaskHandle_t xTaskToQuery ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + +/** + * task. h + *
TaskHandle_t xTaskGetHandle( const char *pcNameToQuery );
+ * + * NOTE: This function takes a relatively long time to complete and should be + * used sparingly. + * + * @return The handle of the task that has the human readable name pcNameToQuery. + * NULL is returned if no matching name is found. INCLUDE_xTaskGetHandle + * must be set to 1 in FreeRTOSConfig.h for pcTaskGetHandle() to be available. + * + * \defgroup pcTaskGetHandle pcTaskGetHandle + * \ingroup TaskUtils + */ +TaskHandle_t xTaskGetHandle( const char *pcNameToQuery ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + +/** + * task.h + *
UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask );
+ * + * INCLUDE_uxTaskGetStackHighWaterMark must be set to 1 in FreeRTOSConfig.h for + * this function to be available. + * + * Returns the high water mark of the stack associated with xTask. That is, + * the minimum free stack space there has been (in words, so on a 32 bit machine + * a value of 1 means 4 bytes) since the task started. The smaller the returned + * number the closer the task has come to overflowing its stack. + * + * @param xTask Handle of the task associated with the stack to be checked. + * Set xTask to NULL to check the stack of the calling task. + * + * @return The smallest amount of free stack space there has been (in words, so + * actual spaces on the stack rather than bytes) since the task referenced by + * xTask was created. + */ +UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +/* When using trace macros it is sometimes necessary to include task.h before +FreeRTOS.h. When this is done TaskHookFunction_t will not yet have been defined, +so the following two prototypes will cause a compilation error. This can be +fixed by simply guarding against the inclusion of these two prototypes unless +they are explicitly required by the configUSE_APPLICATION_TASK_TAG configuration +constant. */ +#ifdef configUSE_APPLICATION_TASK_TAG + #if configUSE_APPLICATION_TASK_TAG == 1 + /** + * task.h + *
void vTaskSetApplicationTaskTag( TaskHandle_t xTask, TaskHookFunction_t pxHookFunction );
+ * + * Sets pxHookFunction to be the task hook function used by the task xTask. + * Passing xTask as NULL has the effect of setting the calling tasks hook + * function. + */ + void vTaskSetApplicationTaskTag( TaskHandle_t xTask, TaskHookFunction_t pxHookFunction ) PRIVILEGED_FUNCTION; + + /** + * task.h + *
void xTaskGetApplicationTaskTag( TaskHandle_t xTask );
+ * + * Returns the pxHookFunction value assigned to the task xTask. + */ + TaskHookFunction_t xTaskGetApplicationTaskTag( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + #endif /* configUSE_APPLICATION_TASK_TAG ==1 */ +#endif /* ifdef configUSE_APPLICATION_TASK_TAG */ + +#if( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 ) + + /* Each task contains an array of pointers that is dimensioned by the + configNUM_THREAD_LOCAL_STORAGE_POINTERS setting in FreeRTOSConfig.h. The + kernel does not use the pointers itself, so the application writer can use + the pointers for any purpose they wish. The following two functions are + used to set and query a pointer respectively. */ + void vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet, BaseType_t xIndex, void *pvValue ) PRIVILEGED_FUNCTION; + void *pvTaskGetThreadLocalStoragePointer( TaskHandle_t xTaskToQuery, BaseType_t xIndex ) PRIVILEGED_FUNCTION; + +#endif + +/** + * task.h + *
BaseType_t xTaskCallApplicationTaskHook( TaskHandle_t xTask, void *pvParameter );
+ * + * Calls the hook function associated with xTask. Passing xTask as NULL has + * the effect of calling the Running tasks (the calling task) hook function. + * + * pvParameter is passed to the hook function for the task to interpret as it + * wants. The return value is the value returned by the task hook function + * registered by the user. + */ +BaseType_t xTaskCallApplicationTaskHook( TaskHandle_t xTask, void *pvParameter ) PRIVILEGED_FUNCTION; + +/** + * xTaskGetIdleTaskHandle() is only available if + * INCLUDE_xTaskGetIdleTaskHandle is set to 1 in FreeRTOSConfig.h. + * + * Simply returns the handle of the idle task. It is not valid to call + * xTaskGetIdleTaskHandle() before the scheduler has been started. + */ +TaskHandle_t xTaskGetIdleTaskHandle( void ) PRIVILEGED_FUNCTION; + +/** + * configUSE_TRACE_FACILITY must be defined as 1 in FreeRTOSConfig.h for + * uxTaskGetSystemState() to be available. + * + * uxTaskGetSystemState() populates an TaskStatus_t structure for each task in + * the system. TaskStatus_t structures contain, among other things, members + * for the task handle, task name, task priority, task state, and total amount + * of run time consumed by the task. See the TaskStatus_t structure + * definition in this file for the full member list. + * + * NOTE: This function is intended for debugging use only as its use results in + * the scheduler remaining suspended for an extended period. + * + * @param pxTaskStatusArray A pointer to an array of TaskStatus_t structures. + * The array must contain at least one TaskStatus_t structure for each task + * that is under the control of the RTOS. The number of tasks under the control + * of the RTOS can be determined using the uxTaskGetNumberOfTasks() API function. + * + * @param uxArraySize The size of the array pointed to by the pxTaskStatusArray + * parameter. The size is specified as the number of indexes in the array, or + * the number of TaskStatus_t structures contained in the array, not by the + * number of bytes in the array. + * + * @param pulTotalRunTime If configGENERATE_RUN_TIME_STATS is set to 1 in + * FreeRTOSConfig.h then *pulTotalRunTime is set by uxTaskGetSystemState() to the + * total run time (as defined by the run time stats clock, see + * http://www.freertos.org/rtos-run-time-stats.html) since the target booted. + * pulTotalRunTime can be set to NULL to omit the total run time information. + * + * @return The number of TaskStatus_t structures that were populated by + * uxTaskGetSystemState(). This should equal the number returned by the + * uxTaskGetNumberOfTasks() API function, but will be zero if the value passed + * in the uxArraySize parameter was too small. + * + * Example usage: +
+    // This example demonstrates how a human readable table of run time stats
+	// information is generated from raw data provided by uxTaskGetSystemState().
+	// The human readable table is written to pcWriteBuffer
+	void vTaskGetRunTimeStats( char *pcWriteBuffer )
+	{
+	TaskStatus_t *pxTaskStatusArray;
+	volatile UBaseType_t uxArraySize, x;
+	uint32_t ulTotalRunTime, ulStatsAsPercentage;
+
+		// Make sure the write buffer does not contain a string.
+		*pcWriteBuffer = 0x00;
+
+		// Take a snapshot of the number of tasks in case it changes while this
+		// function is executing.
+		uxArraySize = uxTaskGetNumberOfTasks();
+
+		// Allocate a TaskStatus_t structure for each task.  An array could be
+		// allocated statically at compile time.
+		pxTaskStatusArray = pvPortMalloc( uxArraySize * sizeof( TaskStatus_t ) );
+
+		if( pxTaskStatusArray != NULL )
+		{
+			// Generate raw status information about each task.
+			uxArraySize = uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, &ulTotalRunTime );
+
+			// For percentage calculations.
+			ulTotalRunTime /= 100UL;
+
+			// Avoid divide by zero errors.
+			if( ulTotalRunTime > 0 )
+			{
+				// For each populated position in the pxTaskStatusArray array,
+				// format the raw data as human readable ASCII data
+				for( x = 0; x < uxArraySize; x++ )
+				{
+					// What percentage of the total run time has the task used?
+					// This will always be rounded down to the nearest integer.
+					// ulTotalRunTimeDiv100 has already been divided by 100.
+					ulStatsAsPercentage = pxTaskStatusArray[ x ].ulRunTimeCounter / ulTotalRunTime;
+
+					if( ulStatsAsPercentage > 0UL )
+					{
+						sprintf( pcWriteBuffer, "%s\t\t%lu\t\t%lu%%\r\n", pxTaskStatusArray[ x ].pcTaskName, pxTaskStatusArray[ x ].ulRunTimeCounter, ulStatsAsPercentage );
+					}
+					else
+					{
+						// If the percentage is zero here then the task has
+						// consumed less than 1% of the total run time.
+						sprintf( pcWriteBuffer, "%s\t\t%lu\t\t<1%%\r\n", pxTaskStatusArray[ x ].pcTaskName, pxTaskStatusArray[ x ].ulRunTimeCounter );
+					}
+
+					pcWriteBuffer += strlen( ( char * ) pcWriteBuffer );
+				}
+			}
+
+			// The array is no longer needed, free the memory it consumes.
+			vPortFree( pxTaskStatusArray );
+		}
+	}
+	
+ */ +UBaseType_t uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray, const UBaseType_t uxArraySize, uint32_t * const pulTotalRunTime ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
void vTaskList( char *pcWriteBuffer );
+ * + * configUSE_TRACE_FACILITY and configUSE_STATS_FORMATTING_FUNCTIONS must + * both be defined as 1 for this function to be available. See the + * configuration section of the FreeRTOS.org website for more information. + * + * NOTE 1: This function will disable interrupts for its duration. It is + * not intended for normal application runtime use but as a debug aid. + * + * Lists all the current tasks, along with their current state and stack + * usage high water mark. + * + * Tasks are reported as blocked ('B'), ready ('R'), deleted ('D') or + * suspended ('S'). + * + * PLEASE NOTE: + * + * This function is provided for convenience only, and is used by many of the + * demo applications. Do not consider it to be part of the scheduler. + * + * vTaskList() calls uxTaskGetSystemState(), then formats part of the + * uxTaskGetSystemState() output into a human readable table that displays task + * names, states and stack usage. + * + * vTaskList() has a dependency on the sprintf() C library function that might + * bloat the code size, use a lot of stack, and provide different results on + * different platforms. An alternative, tiny, third party, and limited + * functionality implementation of sprintf() is provided in many of the + * FreeRTOS/Demo sub-directories in a file called printf-stdarg.c (note + * printf-stdarg.c does not provide a full snprintf() implementation!). + * + * It is recommended that production systems call uxTaskGetSystemState() + * directly to get access to raw stats data, rather than indirectly through a + * call to vTaskList(). + * + * @param pcWriteBuffer A buffer into which the above mentioned details + * will be written, in ASCII form. This buffer is assumed to be large + * enough to contain the generated report. Approximately 40 bytes per + * task should be sufficient. + * + * \defgroup vTaskList vTaskList + * \ingroup TaskUtils + */ +void vTaskList( char * pcWriteBuffer ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + +/** + * task. h + *
void vTaskGetRunTimeStats( char *pcWriteBuffer );
+ * + * configGENERATE_RUN_TIME_STATS and configUSE_STATS_FORMATTING_FUNCTIONS + * must both be defined as 1 for this function to be available. The application + * must also then provide definitions for + * portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() and portGET_RUN_TIME_COUNTER_VALUE() + * to configure a peripheral timer/counter and return the timers current count + * value respectively. The counter should be at least 10 times the frequency of + * the tick count. + * + * NOTE 1: This function will disable interrupts for its duration. It is + * not intended for normal application runtime use but as a debug aid. + * + * Setting configGENERATE_RUN_TIME_STATS to 1 will result in a total + * accumulated execution time being stored for each task. The resolution + * of the accumulated time value depends on the frequency of the timer + * configured by the portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() macro. + * Calling vTaskGetRunTimeStats() writes the total execution time of each + * task into a buffer, both as an absolute count value and as a percentage + * of the total system execution time. + * + * NOTE 2: + * + * This function is provided for convenience only, and is used by many of the + * demo applications. Do not consider it to be part of the scheduler. + * + * vTaskGetRunTimeStats() calls uxTaskGetSystemState(), then formats part of the + * uxTaskGetSystemState() output into a human readable table that displays the + * amount of time each task has spent in the Running state in both absolute and + * percentage terms. + * + * vTaskGetRunTimeStats() has a dependency on the sprintf() C library function + * that might bloat the code size, use a lot of stack, and provide different + * results on different platforms. An alternative, tiny, third party, and + * limited functionality implementation of sprintf() is provided in many of the + * FreeRTOS/Demo sub-directories in a file called printf-stdarg.c (note + * printf-stdarg.c does not provide a full snprintf() implementation!). + * + * It is recommended that production systems call uxTaskGetSystemState() directly + * to get access to raw stats data, rather than indirectly through a call to + * vTaskGetRunTimeStats(). + * + * @param pcWriteBuffer A buffer into which the execution times will be + * written, in ASCII form. This buffer is assumed to be large enough to + * contain the generated report. Approximately 40 bytes per task should + * be sufficient. + * + * \defgroup vTaskGetRunTimeStats vTaskGetRunTimeStats + * \ingroup TaskUtils + */ +void vTaskGetRunTimeStats( char *pcWriteBuffer ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + +/** + * task. h + *
BaseType_t xTaskNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction );
+ * + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this + * function to be available. + * + * When configUSE_TASK_NOTIFICATIONS is set to one each task has its own private + * "notification value", which is a 32-bit unsigned integer (uint32_t). + * + * Events can be sent to a task using an intermediary object. Examples of such + * objects are queues, semaphores, mutexes and event groups. Task notifications + * are a method of sending an event directly to a task without the need for such + * an intermediary object. + * + * A notification sent to a task can optionally perform an action, such as + * update, overwrite or increment the task's notification value. In that way + * task notifications can be used to send data to a task, or be used as light + * weight and fast binary or counting semaphores. + * + * A notification sent to a task will remain pending until it is cleared by the + * task calling xTaskNotifyWait() or ulTaskNotifyTake(). If the task was + * already in the Blocked state to wait for a notification when the notification + * arrives then the task will automatically be removed from the Blocked state + * (unblocked) and the notification cleared. + * + * A task can use xTaskNotifyWait() to [optionally] block to wait for a + * notification to be pending, or ulTaskNotifyTake() to [optionally] block + * to wait for its notification value to have a non-zero value. The task does + * not consume any CPU time while it is in the Blocked state. + * + * See http://www.FreeRTOS.org/RTOS-task-notifications.html for details. + * + * @param xTaskToNotify The handle of the task being notified. The handle to a + * task can be returned from the xTaskCreate() API function used to create the + * task, and the handle of the currently running task can be obtained by calling + * xTaskGetCurrentTaskHandle(). + * + * @param ulValue Data that can be sent with the notification. How the data is + * used depends on the value of the eAction parameter. + * + * @param eAction Specifies how the notification updates the task's notification + * value, if at all. Valid values for eAction are as follows: + * + * eSetBits - + * The task's notification value is bitwise ORed with ulValue. xTaskNofify() + * always returns pdPASS in this case. + * + * eIncrement - + * The task's notification value is incremented. ulValue is not used and + * xTaskNotify() always returns pdPASS in this case. + * + * eSetValueWithOverwrite - + * The task's notification value is set to the value of ulValue, even if the + * task being notified had not yet processed the previous notification (the + * task already had a notification pending). xTaskNotify() always returns + * pdPASS in this case. + * + * eSetValueWithoutOverwrite - + * If the task being notified did not already have a notification pending then + * the task's notification value is set to ulValue and xTaskNotify() will + * return pdPASS. If the task being notified already had a notification + * pending then no action is performed and pdFAIL is returned. + * + * eNoAction - + * The task receives a notification without its notification value being + * updated. ulValue is not used and xTaskNotify() always returns pdPASS in + * this case. + * + * pulPreviousNotificationValue - + * Can be used to pass out the subject task's notification value before any + * bits are modified by the notify function. + * + * @return Dependent on the value of eAction. See the description of the + * eAction parameter. + * + * \defgroup xTaskNotify xTaskNotify + * \ingroup TaskNotifications + */ +BaseType_t xTaskGenericNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue ) PRIVILEGED_FUNCTION; +#define xTaskNotify( xTaskToNotify, ulValue, eAction ) xTaskGenericNotify( ( xTaskToNotify ), ( ulValue ), ( eAction ), NULL ) +#define xTaskNotifyAndQuery( xTaskToNotify, ulValue, eAction, pulPreviousNotifyValue ) xTaskGenericNotify( ( xTaskToNotify ), ( ulValue ), ( eAction ), ( pulPreviousNotifyValue ) ) + +/** + * task. h + *
BaseType_t xTaskNotifyFromISR( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, BaseType_t *pxHigherPriorityTaskWoken );
+ * + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this + * function to be available. + * + * When configUSE_TASK_NOTIFICATIONS is set to one each task has its own private + * "notification value", which is a 32-bit unsigned integer (uint32_t). + * + * A version of xTaskNotify() that can be used from an interrupt service routine + * (ISR). + * + * Events can be sent to a task using an intermediary object. Examples of such + * objects are queues, semaphores, mutexes and event groups. Task notifications + * are a method of sending an event directly to a task without the need for such + * an intermediary object. + * + * A notification sent to a task can optionally perform an action, such as + * update, overwrite or increment the task's notification value. In that way + * task notifications can be used to send data to a task, or be used as light + * weight and fast binary or counting semaphores. + * + * A notification sent to a task will remain pending until it is cleared by the + * task calling xTaskNotifyWait() or ulTaskNotifyTake(). If the task was + * already in the Blocked state to wait for a notification when the notification + * arrives then the task will automatically be removed from the Blocked state + * (unblocked) and the notification cleared. + * + * A task can use xTaskNotifyWait() to [optionally] block to wait for a + * notification to be pending, or ulTaskNotifyTake() to [optionally] block + * to wait for its notification value to have a non-zero value. The task does + * not consume any CPU time while it is in the Blocked state. + * + * See http://www.FreeRTOS.org/RTOS-task-notifications.html for details. + * + * @param xTaskToNotify The handle of the task being notified. The handle to a + * task can be returned from the xTaskCreate() API function used to create the + * task, and the handle of the currently running task can be obtained by calling + * xTaskGetCurrentTaskHandle(). + * + * @param ulValue Data that can be sent with the notification. How the data is + * used depends on the value of the eAction parameter. + * + * @param eAction Specifies how the notification updates the task's notification + * value, if at all. Valid values for eAction are as follows: + * + * eSetBits - + * The task's notification value is bitwise ORed with ulValue. xTaskNofify() + * always returns pdPASS in this case. + * + * eIncrement - + * The task's notification value is incremented. ulValue is not used and + * xTaskNotify() always returns pdPASS in this case. + * + * eSetValueWithOverwrite - + * The task's notification value is set to the value of ulValue, even if the + * task being notified had not yet processed the previous notification (the + * task already had a notification pending). xTaskNotify() always returns + * pdPASS in this case. + * + * eSetValueWithoutOverwrite - + * If the task being notified did not already have a notification pending then + * the task's notification value is set to ulValue and xTaskNotify() will + * return pdPASS. If the task being notified already had a notification + * pending then no action is performed and pdFAIL is returned. + * + * eNoAction - + * The task receives a notification without its notification value being + * updated. ulValue is not used and xTaskNotify() always returns pdPASS in + * this case. + * + * @param pxHigherPriorityTaskWoken xTaskNotifyFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending the notification caused the + * task to which the notification was sent to leave the Blocked state, and the + * unblocked task has a priority higher than the currently running task. If + * xTaskNotifyFromISR() sets this value to pdTRUE then a context switch should + * be requested before the interrupt is exited. How a context switch is + * requested from an ISR is dependent on the port - see the documentation page + * for the port in use. + * + * @return Dependent on the value of eAction. See the description of the + * eAction parameter. + * + * \defgroup xTaskNotify xTaskNotify + * \ingroup TaskNotifications + */ +BaseType_t xTaskGenericNotifyFromISR( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue, BaseType_t *pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; +#define xTaskNotifyFromISR( xTaskToNotify, ulValue, eAction, pxHigherPriorityTaskWoken ) xTaskGenericNotifyFromISR( ( xTaskToNotify ), ( ulValue ), ( eAction ), NULL, ( pxHigherPriorityTaskWoken ) ) +#define xTaskNotifyAndQueryFromISR( xTaskToNotify, ulValue, eAction, pulPreviousNotificationValue, pxHigherPriorityTaskWoken ) xTaskGenericNotifyFromISR( ( xTaskToNotify ), ( ulValue ), ( eAction ), ( pulPreviousNotificationValue ), ( pxHigherPriorityTaskWoken ) ) + +/** + * task. h + *
BaseType_t xTaskNotifyWait( uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, uint32_t *pulNotificationValue, TickType_t xTicksToWait );
+ * + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this + * function to be available. + * + * When configUSE_TASK_NOTIFICATIONS is set to one each task has its own private + * "notification value", which is a 32-bit unsigned integer (uint32_t). + * + * Events can be sent to a task using an intermediary object. Examples of such + * objects are queues, semaphores, mutexes and event groups. Task notifications + * are a method of sending an event directly to a task without the need for such + * an intermediary object. + * + * A notification sent to a task can optionally perform an action, such as + * update, overwrite or increment the task's notification value. In that way + * task notifications can be used to send data to a task, or be used as light + * weight and fast binary or counting semaphores. + * + * A notification sent to a task will remain pending until it is cleared by the + * task calling xTaskNotifyWait() or ulTaskNotifyTake(). If the task was + * already in the Blocked state to wait for a notification when the notification + * arrives then the task will automatically be removed from the Blocked state + * (unblocked) and the notification cleared. + * + * A task can use xTaskNotifyWait() to [optionally] block to wait for a + * notification to be pending, or ulTaskNotifyTake() to [optionally] block + * to wait for its notification value to have a non-zero value. The task does + * not consume any CPU time while it is in the Blocked state. + * + * See http://www.FreeRTOS.org/RTOS-task-notifications.html for details. + * + * @param ulBitsToClearOnEntry Bits that are set in ulBitsToClearOnEntry value + * will be cleared in the calling task's notification value before the task + * checks to see if any notifications are pending, and optionally blocks if no + * notifications are pending. Setting ulBitsToClearOnEntry to ULONG_MAX (if + * limits.h is included) or 0xffffffffUL (if limits.h is not included) will have + * the effect of resetting the task's notification value to 0. Setting + * ulBitsToClearOnEntry to 0 will leave the task's notification value unchanged. + * + * @param ulBitsToClearOnExit If a notification is pending or received before + * the calling task exits the xTaskNotifyWait() function then the task's + * notification value (see the xTaskNotify() API function) is passed out using + * the pulNotificationValue parameter. Then any bits that are set in + * ulBitsToClearOnExit will be cleared in the task's notification value (note + * *pulNotificationValue is set before any bits are cleared). Setting + * ulBitsToClearOnExit to ULONG_MAX (if limits.h is included) or 0xffffffffUL + * (if limits.h is not included) will have the effect of resetting the task's + * notification value to 0 before the function exits. Setting + * ulBitsToClearOnExit to 0 will leave the task's notification value unchanged + * when the function exits (in which case the value passed out in + * pulNotificationValue will match the task's notification value). + * + * @param pulNotificationValue Used to pass the task's notification value out + * of the function. Note the value passed out will not be effected by the + * clearing of any bits caused by ulBitsToClearOnExit being non-zero. + * + * @param xTicksToWait The maximum amount of time that the task should wait in + * the Blocked state for a notification to be received, should a notification + * not already be pending when xTaskNotifyWait() was called. The task + * will not consume any processing time while it is in the Blocked state. This + * is specified in kernel ticks, the macro pdMS_TO_TICSK( value_in_ms ) can be + * used to convert a time specified in milliseconds to a time specified in + * ticks. + * + * @return If a notification was received (including notifications that were + * already pending when xTaskNotifyWait was called) then pdPASS is + * returned. Otherwise pdFAIL is returned. + * + * \defgroup xTaskNotifyWait xTaskNotifyWait + * \ingroup TaskNotifications + */ +BaseType_t xTaskNotifyWait( uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, uint32_t *pulNotificationValue, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
BaseType_t xTaskNotifyGive( TaskHandle_t xTaskToNotify );
+ * + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this macro + * to be available. + * + * When configUSE_TASK_NOTIFICATIONS is set to one each task has its own private + * "notification value", which is a 32-bit unsigned integer (uint32_t). + * + * Events can be sent to a task using an intermediary object. Examples of such + * objects are queues, semaphores, mutexes and event groups. Task notifications + * are a method of sending an event directly to a task without the need for such + * an intermediary object. + * + * A notification sent to a task can optionally perform an action, such as + * update, overwrite or increment the task's notification value. In that way + * task notifications can be used to send data to a task, or be used as light + * weight and fast binary or counting semaphores. + * + * xTaskNotifyGive() is a helper macro intended for use when task notifications + * are used as light weight and faster binary or counting semaphore equivalents. + * Actual FreeRTOS semaphores are given using the xSemaphoreGive() API function, + * the equivalent action that instead uses a task notification is + * xTaskNotifyGive(). + * + * When task notifications are being used as a binary or counting semaphore + * equivalent then the task being notified should wait for the notification + * using the ulTaskNotificationTake() API function rather than the + * xTaskNotifyWait() API function. + * + * See http://www.FreeRTOS.org/RTOS-task-notifications.html for more details. + * + * @param xTaskToNotify The handle of the task being notified. The handle to a + * task can be returned from the xTaskCreate() API function used to create the + * task, and the handle of the currently running task can be obtained by calling + * xTaskGetCurrentTaskHandle(). + * + * @return xTaskNotifyGive() is a macro that calls xTaskNotify() with the + * eAction parameter set to eIncrement - so pdPASS is always returned. + * + * \defgroup xTaskNotifyGive xTaskNotifyGive + * \ingroup TaskNotifications + */ +#define xTaskNotifyGive( xTaskToNotify ) xTaskGenericNotify( ( xTaskToNotify ), ( 0 ), eIncrement, NULL ) + +/** + * task. h + *
void vTaskNotifyGiveFromISR( TaskHandle_t xTaskHandle, BaseType_t *pxHigherPriorityTaskWoken );
+ *
+ * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this macro
+ * to be available.
+ *
+ * When configUSE_TASK_NOTIFICATIONS is set to one each task has its own private
+ * "notification value", which is a 32-bit unsigned integer (uint32_t).
+ *
+ * A version of xTaskNotifyGive() that can be called from an interrupt service
+ * routine (ISR).
+ *
+ * Events can be sent to a task using an intermediary object.  Examples of such
+ * objects are queues, semaphores, mutexes and event groups.  Task notifications
+ * are a method of sending an event directly to a task without the need for such
+ * an intermediary object.
+ *
+ * A notification sent to a task can optionally perform an action, such as
+ * update, overwrite or increment the task's notification value.  In that way
+ * task notifications can be used to send data to a task, or be used as light
+ * weight and fast binary or counting semaphores.
+ *
+ * vTaskNotifyGiveFromISR() is intended for use when task notifications are
+ * used as light weight and faster binary or counting semaphore equivalents.
+ * Actual FreeRTOS semaphores are given from an ISR using the
+ * xSemaphoreGiveFromISR() API function, the equivalent action that instead uses
+ * a task notification is vTaskNotifyGiveFromISR().
+ *
+ * When task notifications are being used as a binary or counting semaphore
+ * equivalent then the task being notified should wait for the notification
+ * using the ulTaskNotificationTake() API function rather than the
+ * xTaskNotifyWait() API function.
+ *
+ * See http://www.FreeRTOS.org/RTOS-task-notifications.html for more details.
+ *
+ * @param xTaskToNotify The handle of the task being notified.  The handle to a
+ * task can be returned from the xTaskCreate() API function used to create the
+ * task, and the handle of the currently running task can be obtained by calling
+ * xTaskGetCurrentTaskHandle().
+ *
+ * @param pxHigherPriorityTaskWoken  vTaskNotifyGiveFromISR() will set
+ * *pxHigherPriorityTaskWoken to pdTRUE if sending the notification caused the
+ * task to which the notification was sent to leave the Blocked state, and the
+ * unblocked task has a priority higher than the currently running task.  If
+ * vTaskNotifyGiveFromISR() sets this value to pdTRUE then a context switch
+ * should be requested before the interrupt is exited.  How a context switch is
+ * requested from an ISR is dependent on the port - see the documentation page
+ * for the port in use.
+ *
+ * \defgroup xTaskNotifyWait xTaskNotifyWait
+ * \ingroup TaskNotifications
+ */
+void vTaskNotifyGiveFromISR( TaskHandle_t xTaskToNotify, BaseType_t *pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION;
+
+/**
+ * task. h
+ * 
uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait );
+ * + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this + * function to be available. + * + * When configUSE_TASK_NOTIFICATIONS is set to one each task has its own private + * "notification value", which is a 32-bit unsigned integer (uint32_t). + * + * Events can be sent to a task using an intermediary object. Examples of such + * objects are queues, semaphores, mutexes and event groups. Task notifications + * are a method of sending an event directly to a task without the need for such + * an intermediary object. + * + * A notification sent to a task can optionally perform an action, such as + * update, overwrite or increment the task's notification value. In that way + * task notifications can be used to send data to a task, or be used as light + * weight and fast binary or counting semaphores. + * + * ulTaskNotifyTake() is intended for use when a task notification is used as a + * faster and lighter weight binary or counting semaphore alternative. Actual + * FreeRTOS semaphores are taken using the xSemaphoreTake() API function, the + * equivalent action that instead uses a task notification is + * ulTaskNotifyTake(). + * + * When a task is using its notification value as a binary or counting semaphore + * other tasks should send notifications to it using the xTaskNotifyGive() + * macro, or xTaskNotify() function with the eAction parameter set to + * eIncrement. + * + * ulTaskNotifyTake() can either clear the task's notification value to + * zero on exit, in which case the notification value acts like a binary + * semaphore, or decrement the task's notification value on exit, in which case + * the notification value acts like a counting semaphore. + * + * A task can use ulTaskNotifyTake() to [optionally] block to wait for a + * the task's notification value to be non-zero. The task does not consume any + * CPU time while it is in the Blocked state. + * + * Where as xTaskNotifyWait() will return when a notification is pending, + * ulTaskNotifyTake() will return when the task's notification value is + * not zero. + * + * See http://www.FreeRTOS.org/RTOS-task-notifications.html for details. + * + * @param xClearCountOnExit if xClearCountOnExit is pdFALSE then the task's + * notification value is decremented when the function exits. In this way the + * notification value acts like a counting semaphore. If xClearCountOnExit is + * not pdFALSE then the task's notification value is cleared to zero when the + * function exits. In this way the notification value acts like a binary + * semaphore. + * + * @param xTicksToWait The maximum amount of time that the task should wait in + * the Blocked state for the task's notification value to be greater than zero, + * should the count not already be greater than zero when + * ulTaskNotifyTake() was called. The task will not consume any processing + * time while it is in the Blocked state. This is specified in kernel ticks, + * the macro pdMS_TO_TICSK( value_in_ms ) can be used to convert a time + * specified in milliseconds to a time specified in ticks. + * + * @return The task's notification count before it is either cleared to zero or + * decremented (see the xClearCountOnExit parameter). + * + * \defgroup ulTaskNotifyTake ulTaskNotifyTake + * \ingroup TaskNotifications + */ +uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
BaseType_t xTaskNotifyStateClear( TaskHandle_t xTask );
+ * + * If the notification state of the task referenced by the handle xTask is + * eNotified, then set the task's notification state to eNotWaitingNotification. + * The task's notification value is not altered. Set xTask to NULL to clear the + * notification state of the calling task. + * + * @return pdTRUE if the task's notification state was set to + * eNotWaitingNotification, otherwise pdFALSE. + * \defgroup xTaskNotifyStateClear xTaskNotifyStateClear + * \ingroup TaskNotifications + */ +BaseType_t xTaskNotifyStateClear( TaskHandle_t xTask ); + +/*----------------------------------------------------------- + * SCHEDULER INTERNALS AVAILABLE FOR PORTING PURPOSES + *----------------------------------------------------------*/ + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS ONLY + * INTENDED FOR USE WHEN IMPLEMENTING A PORT OF THE SCHEDULER AND IS + * AN INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * Called from the real time kernel tick (either preemptive or cooperative), + * this increments the tick count and checks if any tasks that are blocked + * for a finite period required removing from a blocked list and placing on + * a ready list. If a non-zero value is returned then a context switch is + * required because either: + * + A task was removed from a blocked list because its timeout had expired, + * or + * + Time slicing is in use and there is a task of equal priority to the + * currently running task. + */ +BaseType_t xTaskIncrementTick( void ) PRIVILEGED_FUNCTION; + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS AN + * INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED. + * + * Removes the calling task from the ready list and places it both + * on the list of tasks waiting for a particular event, and the + * list of delayed tasks. The task will be removed from both lists + * and replaced on the ready list should either the event occur (and + * there be no higher priority tasks waiting on the same event) or + * the delay period expires. + * + * The 'unordered' version replaces the event list item value with the + * xItemValue value, and inserts the list item at the end of the list. + * + * The 'ordered' version uses the existing event list item value (which is the + * owning tasks priority) to insert the list item into the event list is task + * priority order. + * + * @param pxEventList The list containing tasks that are blocked waiting + * for the event to occur. + * + * @param xItemValue The item value to use for the event list item when the + * event list is not ordered by task priority. + * + * @param xTicksToWait The maximum amount of time that the task should wait + * for the event to occur. This is specified in kernel ticks,the constant + * portTICK_PERIOD_MS can be used to convert kernel ticks into a real time + * period. + */ +void vTaskPlaceOnEventList( List_t * const pxEventList, const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; +void vTaskPlaceOnUnorderedEventList( List_t * pxEventList, const TickType_t xItemValue, const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS AN + * INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED. + * + * This function performs nearly the same function as vTaskPlaceOnEventList(). + * The difference being that this function does not permit tasks to block + * indefinitely, whereas vTaskPlaceOnEventList() does. + * + */ +void vTaskPlaceOnEventListRestricted( List_t * const pxEventList, TickType_t xTicksToWait, const BaseType_t xWaitIndefinitely ) PRIVILEGED_FUNCTION; + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS AN + * INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED. + * + * Removes a task from both the specified event list and the list of blocked + * tasks, and places it on a ready queue. + * + * xTaskRemoveFromEventList()/xTaskRemoveFromUnorderedEventList() will be called + * if either an event occurs to unblock a task, or the block timeout period + * expires. + * + * xTaskRemoveFromEventList() is used when the event list is in task priority + * order. It removes the list item from the head of the event list as that will + * have the highest priority owning task of all the tasks on the event list. + * xTaskRemoveFromUnorderedEventList() is used when the event list is not + * ordered and the event list items hold something other than the owning tasks + * priority. In this case the event list item value is updated to the value + * passed in the xItemValue parameter. + * + * @return pdTRUE if the task being removed has a higher priority than the task + * making the call, otherwise pdFALSE. + */ +BaseType_t xTaskRemoveFromEventList( const List_t * const pxEventList ) PRIVILEGED_FUNCTION; +BaseType_t xTaskRemoveFromUnorderedEventList( ListItem_t * pxEventListItem, const TickType_t xItemValue ) PRIVILEGED_FUNCTION; + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS ONLY + * INTENDED FOR USE WHEN IMPLEMENTING A PORT OF THE SCHEDULER AND IS + * AN INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * Sets the pointer to the current TCB to the TCB of the highest priority task + * that is ready to run. + */ +void vTaskSwitchContext( void ) PRIVILEGED_FUNCTION; + +/* + * THESE FUNCTIONS MUST NOT BE USED FROM APPLICATION CODE. THEY ARE USED BY + * THE EVENT BITS MODULE. + */ +TickType_t uxTaskResetEventItemValue( void ) PRIVILEGED_FUNCTION; + +/* + * Return the handle of the calling task. + */ +TaskHandle_t xTaskGetCurrentTaskHandle( void ) PRIVILEGED_FUNCTION; + +/* + * Capture the current time status for future reference. + */ +void vTaskSetTimeOutState( TimeOut_t * const pxTimeOut ) PRIVILEGED_FUNCTION; + +/* + * Compare the time status now with that previously captured to see if the + * timeout has expired. + */ +BaseType_t xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, TickType_t * const pxTicksToWait ) PRIVILEGED_FUNCTION; + +/* + * Shortcut used by the queue implementation to prevent unnecessary call to + * taskYIELD(); + */ +void vTaskMissedYield( void ) PRIVILEGED_FUNCTION; + +/* + * Returns the scheduler state as taskSCHEDULER_RUNNING, + * taskSCHEDULER_NOT_STARTED or taskSCHEDULER_SUSPENDED. + */ +BaseType_t xTaskGetSchedulerState( void ) PRIVILEGED_FUNCTION; + +/* + * Raises the priority of the mutex holder to that of the calling task should + * the mutex holder have a priority less than the calling task. + */ +void vTaskPriorityInherit( TaskHandle_t const pxMutexHolder ) PRIVILEGED_FUNCTION; + +/* + * Set the priority of a task back to its proper priority in the case that it + * inherited a higher priority while it was holding a semaphore. + */ +BaseType_t xTaskPriorityDisinherit( TaskHandle_t const pxMutexHolder ) PRIVILEGED_FUNCTION; + +/* + * Get the uxTCBNumber assigned to the task referenced by the xTask parameter. + */ +UBaseType_t uxTaskGetTaskNumber( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +/* + * Set the uxTaskNumber of the task referenced by the xTask parameter to + * uxHandle. + */ +void vTaskSetTaskNumber( TaskHandle_t xTask, const UBaseType_t uxHandle ) PRIVILEGED_FUNCTION; + +/* + * Only available when configUSE_TICKLESS_IDLE is set to 1. + * If tickless mode is being used, or a low power mode is implemented, then + * the tick interrupt will not execute during idle periods. When this is the + * case, the tick count value maintained by the scheduler needs to be kept up + * to date with the actual execution time by being skipped forward by a time + * equal to the idle period. + */ +void vTaskStepTick( const TickType_t xTicksToJump ) PRIVILEGED_FUNCTION; + +/* + * Only avilable when configUSE_TICKLESS_IDLE is set to 1. + * Provided for use within portSUPPRESS_TICKS_AND_SLEEP() to allow the port + * specific sleep function to determine if it is ok to proceed with the sleep, + * and if it is ok to proceed, if it is ok to sleep indefinitely. + * + * This function is necessary because portSUPPRESS_TICKS_AND_SLEEP() is only + * called with the scheduler suspended, not from within a critical section. It + * is therefore possible for an interrupt to request a context switch between + * portSUPPRESS_TICKS_AND_SLEEP() and the low power mode actually being + * entered. eTaskConfirmSleepModeStatus() should be called from a short + * critical section between the timer being stopped and the sleep mode being + * entered to ensure it is ok to proceed into the sleep mode. + */ +eSleepModeStatus eTaskConfirmSleepModeStatus( void ) PRIVILEGED_FUNCTION; + +/* + * For internal use only. Increment the mutex held count when a mutex is + * taken and return the handle of the task that has taken the mutex. + */ +void *pvTaskIncrementMutexHeldCount( void ) PRIVILEGED_FUNCTION; + +#ifdef __cplusplus +} +#endif +#endif /* INC_TASK_H */ + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/include/timers.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/include/timers.h new file mode 100644 index 0000000..fda71ca --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/include/timers.h @@ -0,0 +1,1314 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef TIMERS_H +#define TIMERS_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h must appear in source files before include timers.h" +#endif + +/*lint -e537 This headers are only multiply included if the application code +happens to also be including task.h. */ +#include "task.h" +/*lint +e537 */ + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * MACROS AND DEFINITIONS + *----------------------------------------------------------*/ + +/* IDs for commands that can be sent/received on the timer queue. These are to +be used solely through the macros that make up the public software timer API, +as defined below. The commands that are sent from interrupts must use the +highest numbers as tmrFIRST_FROM_ISR_COMMAND is used to determine if the task +or interrupt version of the queue send function should be used. */ +#define tmrCOMMAND_EXECUTE_CALLBACK_FROM_ISR ( ( BaseType_t ) -2 ) +#define tmrCOMMAND_EXECUTE_CALLBACK ( ( BaseType_t ) -1 ) +#define tmrCOMMAND_START_DONT_TRACE ( ( BaseType_t ) 0 ) +#define tmrCOMMAND_START ( ( BaseType_t ) 1 ) +#define tmrCOMMAND_RESET ( ( BaseType_t ) 2 ) +#define tmrCOMMAND_STOP ( ( BaseType_t ) 3 ) +#define tmrCOMMAND_CHANGE_PERIOD ( ( BaseType_t ) 4 ) +#define tmrCOMMAND_DELETE ( ( BaseType_t ) 5 ) + +#define tmrFIRST_FROM_ISR_COMMAND ( ( BaseType_t ) 6 ) +#define tmrCOMMAND_START_FROM_ISR ( ( BaseType_t ) 6 ) +#define tmrCOMMAND_RESET_FROM_ISR ( ( BaseType_t ) 7 ) +#define tmrCOMMAND_STOP_FROM_ISR ( ( BaseType_t ) 8 ) +#define tmrCOMMAND_CHANGE_PERIOD_FROM_ISR ( ( BaseType_t ) 9 ) + + +/** + * Type by which software timers are referenced. For example, a call to + * xTimerCreate() returns an TimerHandle_t variable that can then be used to + * reference the subject timer in calls to other software timer API functions + * (for example, xTimerStart(), xTimerReset(), etc.). + */ +typedef void * TimerHandle_t; + +/* + * Defines the prototype to which timer callback functions must conform. + */ +typedef void (*TimerCallbackFunction_t)( TimerHandle_t xTimer ); + +/* + * Defines the prototype to which functions used with the + * xTimerPendFunctionCallFromISR() function must conform. + */ +typedef void (*PendedFunction_t)( void *, uint32_t ); + +/** + * TimerHandle_t xTimerCreate( const char * const pcTimerName, + * TickType_t xTimerPeriodInTicks, + * UBaseType_t uxAutoReload, + * void * pvTimerID, + * TimerCallbackFunction_t pxCallbackFunction ); + * + * Creates a new software timer instance, and returns a handle by which the + * created software timer can be referenced. + * + * Internally, within the FreeRTOS implementation, software timers use a block + * of memory, in which the timer data structure is stored. If a software timer + * is created using xTimerCreate() then the required memory is automatically + * dynamically allocated inside the xTimerCreate() function. (see + * http://www.freertos.org/a00111.html). If a software timer is created using + * xTimerCreateStatic() then the application writer must provide the memory that + * will get used by the software timer. xTimerCreateStatic() therefore allows a + * software timer to be created without using any dynamic memory allocation. + * + * Timers are created in the dormant state. The xTimerStart(), xTimerReset(), + * xTimerStartFromISR(), xTimerResetFromISR(), xTimerChangePeriod() and + * xTimerChangePeriodFromISR() API functions can all be used to transition a + * timer into the active state. + * + * @param pcTimerName A text name that is assigned to the timer. This is done + * purely to assist debugging. The kernel itself only ever references a timer + * by its handle, and never by its name. + * + * @param xTimerPeriodInTicks The timer period. The time is defined in tick + * periods so the constant portTICK_PERIOD_MS can be used to convert a time that + * has been specified in milliseconds. For example, if the timer must expire + * after 100 ticks, then xTimerPeriodInTicks should be set to 100. + * Alternatively, if the timer must expire after 500ms, then xPeriod can be set + * to ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than or + * equal to 1000. + * + * @param uxAutoReload If uxAutoReload is set to pdTRUE then the timer will + * expire repeatedly with a frequency set by the xTimerPeriodInTicks parameter. + * If uxAutoReload is set to pdFALSE then the timer will be a one-shot timer and + * enter the dormant state after it expires. + * + * @param pvTimerID An identifier that is assigned to the timer being created. + * Typically this would be used in the timer callback function to identify which + * timer expired when the same callback function is assigned to more than one + * timer. + * + * @param pxCallbackFunction The function to call when the timer expires. + * Callback functions must have the prototype defined by TimerCallbackFunction_t, + * which is "void vCallbackFunction( TimerHandle_t xTimer );". + * + * @return If the timer is successfully created then a handle to the newly + * created timer is returned. If the timer cannot be created (because either + * there is insufficient FreeRTOS heap remaining to allocate the timer + * structures, or the timer period was set to 0) then NULL is returned. + * + * Example usage: + * @verbatim + * #define NUM_TIMERS 5 + * + * // An array to hold handles to the created timers. + * TimerHandle_t xTimers[ NUM_TIMERS ]; + * + * // An array to hold a count of the number of times each timer expires. + * int32_t lExpireCounters[ NUM_TIMERS ] = { 0 }; + * + * // Define a callback function that will be used by multiple timer instances. + * // The callback function does nothing but count the number of times the + * // associated timer expires, and stop the timer once the timer has expired + * // 10 times. + * void vTimerCallback( TimerHandle_t pxTimer ) + * { + * int32_t lArrayIndex; + * const int32_t xMaxExpiryCountBeforeStopping = 10; + * + * // Optionally do something if the pxTimer parameter is NULL. + * configASSERT( pxTimer ); + * + * // Which timer expired? + * lArrayIndex = ( int32_t ) pvTimerGetTimerID( pxTimer ); + * + * // Increment the number of times that pxTimer has expired. + * lExpireCounters[ lArrayIndex ] += 1; + * + * // If the timer has expired 10 times then stop it from running. + * if( lExpireCounters[ lArrayIndex ] == xMaxExpiryCountBeforeStopping ) + * { + * // Do not use a block time if calling a timer API function from a + * // timer callback function, as doing so could cause a deadlock! + * xTimerStop( pxTimer, 0 ); + * } + * } + * + * void main( void ) + * { + * int32_t x; + * + * // Create then start some timers. Starting the timers before the scheduler + * // has been started means the timers will start running immediately that + * // the scheduler starts. + * for( x = 0; x < NUM_TIMERS; x++ ) + * { + * xTimers[ x ] = xTimerCreate( "Timer", // Just a text name, not used by the kernel. + * ( 100 * x ), // The timer period in ticks. + * pdTRUE, // The timers will auto-reload themselves when they expire. + * ( void * ) x, // Assign each timer a unique id equal to its array index. + * vTimerCallback // Each timer calls the same callback when it expires. + * ); + * + * if( xTimers[ x ] == NULL ) + * { + * // The timer was not created. + * } + * else + * { + * // Start the timer. No block time is specified, and even if one was + * // it would be ignored because the scheduler has not yet been + * // started. + * if( xTimerStart( xTimers[ x ], 0 ) != pdPASS ) + * { + * // The timer could not be set into the Active state. + * } + * } + * } + * + * // ... + * // Create tasks here. + * // ... + * + * // Starting the scheduler will start the timers running as they have already + * // been set into the active state. + * vTaskStartScheduler(); + * + * // Should not reach here. + * for( ;; ); + * } + * @endverbatim + */ +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + TimerHandle_t xTimerCreate( const char * const pcTimerName, + const TickType_t xTimerPeriodInTicks, + const UBaseType_t uxAutoReload, + void * const pvTimerID, + TimerCallbackFunction_t pxCallbackFunction ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ +#endif + +/** + * TimerHandle_t xTimerCreateStatic(const char * const pcTimerName, + * TickType_t xTimerPeriodInTicks, + * UBaseType_t uxAutoReload, + * void * pvTimerID, + * TimerCallbackFunction_t pxCallbackFunction, + * StaticTimer_t *pxTimerBuffer ); + * + * Creates a new software timer instance, and returns a handle by which the + * created software timer can be referenced. + * + * Internally, within the FreeRTOS implementation, software timers use a block + * of memory, in which the timer data structure is stored. If a software timer + * is created using xTimerCreate() then the required memory is automatically + * dynamically allocated inside the xTimerCreate() function. (see + * http://www.freertos.org/a00111.html). If a software timer is created using + * xTimerCreateStatic() then the application writer must provide the memory that + * will get used by the software timer. xTimerCreateStatic() therefore allows a + * software timer to be created without using any dynamic memory allocation. + * + * Timers are created in the dormant state. The xTimerStart(), xTimerReset(), + * xTimerStartFromISR(), xTimerResetFromISR(), xTimerChangePeriod() and + * xTimerChangePeriodFromISR() API functions can all be used to transition a + * timer into the active state. + * + * @param pcTimerName A text name that is assigned to the timer. This is done + * purely to assist debugging. The kernel itself only ever references a timer + * by its handle, and never by its name. + * + * @param xTimerPeriodInTicks The timer period. The time is defined in tick + * periods so the constant portTICK_PERIOD_MS can be used to convert a time that + * has been specified in milliseconds. For example, if the timer must expire + * after 100 ticks, then xTimerPeriodInTicks should be set to 100. + * Alternatively, if the timer must expire after 500ms, then xPeriod can be set + * to ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than or + * equal to 1000. + * + * @param uxAutoReload If uxAutoReload is set to pdTRUE then the timer will + * expire repeatedly with a frequency set by the xTimerPeriodInTicks parameter. + * If uxAutoReload is set to pdFALSE then the timer will be a one-shot timer and + * enter the dormant state after it expires. + * + * @param pvTimerID An identifier that is assigned to the timer being created. + * Typically this would be used in the timer callback function to identify which + * timer expired when the same callback function is assigned to more than one + * timer. + * + * @param pxCallbackFunction The function to call when the timer expires. + * Callback functions must have the prototype defined by TimerCallbackFunction_t, + * which is "void vCallbackFunction( TimerHandle_t xTimer );". + * + * @param pxTimerBuffer Must point to a variable of type StaticTimer_t, which + * will be then be used to hold the software timer's data structures, removing + * the need for the memory to be allocated dynamically. + * + * @return If the timer is created then a handle to the created timer is + * returned. If pxTimerBuffer was NULL then NULL is returned. + * + * Example usage: + * @verbatim + * + * // The buffer used to hold the software timer's data structure. + * static StaticTimer_t xTimerBuffer; + * + * // A variable that will be incremented by the software timer's callback + * // function. + * UBaseType_t uxVariableToIncrement = 0; + * + * // A software timer callback function that increments a variable passed to + * // it when the software timer was created. After the 5th increment the + * // callback function stops the software timer. + * static void prvTimerCallback( TimerHandle_t xExpiredTimer ) + * { + * UBaseType_t *puxVariableToIncrement; + * BaseType_t xReturned; + * + * // Obtain the address of the variable to increment from the timer ID. + * puxVariableToIncrement = ( UBaseType_t * ) pvTimerGetTimerID( xExpiredTimer ); + * + * // Increment the variable to show the timer callback has executed. + * ( *puxVariableToIncrement )++; + * + * // If this callback has executed the required number of times, stop the + * // timer. + * if( *puxVariableToIncrement == 5 ) + * { + * // This is called from a timer callback so must not block. + * xTimerStop( xExpiredTimer, staticDONT_BLOCK ); + * } + * } + * + * + * void main( void ) + * { + * // Create the software time. xTimerCreateStatic() has an extra parameter + * // than the normal xTimerCreate() API function. The parameter is a pointer + * // to the StaticTimer_t structure that will hold the software timer + * // structure. If the parameter is passed as NULL then the structure will be + * // allocated dynamically, just as if xTimerCreate() had been called. + * xTimer = xTimerCreateStatic( "T1", // Text name for the task. Helps debugging only. Not used by FreeRTOS. + * xTimerPeriod, // The period of the timer in ticks. + * pdTRUE, // This is an auto-reload timer. + * ( void * ) &uxVariableToIncrement, // A variable incremented by the software timer's callback function + * prvTimerCallback, // The function to execute when the timer expires. + * &xTimerBuffer ); // The buffer that will hold the software timer structure. + * + * // The scheduler has not started yet so a block time is not used. + * xReturned = xTimerStart( xTimer, 0 ); + * + * // ... + * // Create tasks here. + * // ... + * + * // Starting the scheduler will start the timers running as they have already + * // been set into the active state. + * vTaskStartScheduler(); + * + * // Should not reach here. + * for( ;; ); + * } + * @endverbatim + */ +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + TimerHandle_t xTimerCreateStatic( const char * const pcTimerName, + const TickType_t xTimerPeriodInTicks, + const UBaseType_t uxAutoReload, + void * const pvTimerID, + TimerCallbackFunction_t pxCallbackFunction, + StaticTimer_t *pxTimerBuffer ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/** + * void *pvTimerGetTimerID( TimerHandle_t xTimer ); + * + * Returns the ID assigned to the timer. + * + * IDs are assigned to timers using the pvTimerID parameter of the call to + * xTimerCreated() that was used to create the timer, and by calling the + * vTimerSetTimerID() API function. + * + * If the same callback function is assigned to multiple timers then the timer + * ID can be used as time specific (timer local) storage. + * + * @param xTimer The timer being queried. + * + * @return The ID assigned to the timer being queried. + * + * Example usage: + * + * See the xTimerCreate() API function example usage scenario. + */ +void *pvTimerGetTimerID( const TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; + +/** + * void vTimerSetTimerID( TimerHandle_t xTimer, void *pvNewID ); + * + * Sets the ID assigned to the timer. + * + * IDs are assigned to timers using the pvTimerID parameter of the call to + * xTimerCreated() that was used to create the timer. + * + * If the same callback function is assigned to multiple timers then the timer + * ID can be used as time specific (timer local) storage. + * + * @param xTimer The timer being updated. + * + * @param pvNewID The ID to assign to the timer. + * + * Example usage: + * + * See the xTimerCreate() API function example usage scenario. + */ +void vTimerSetTimerID( TimerHandle_t xTimer, void *pvNewID ) PRIVILEGED_FUNCTION; + +/** + * BaseType_t xTimerIsTimerActive( TimerHandle_t xTimer ); + * + * Queries a timer to see if it is active or dormant. + * + * A timer will be dormant if: + * 1) It has been created but not started, or + * 2) It is an expired one-shot timer that has not been restarted. + * + * Timers are created in the dormant state. The xTimerStart(), xTimerReset(), + * xTimerStartFromISR(), xTimerResetFromISR(), xTimerChangePeriod() and + * xTimerChangePeriodFromISR() API functions can all be used to transition a timer into the + * active state. + * + * @param xTimer The timer being queried. + * + * @return pdFALSE will be returned if the timer is dormant. A value other than + * pdFALSE will be returned if the timer is active. + * + * Example usage: + * @verbatim + * // This function assumes xTimer has already been created. + * void vAFunction( TimerHandle_t xTimer ) + * { + * if( xTimerIsTimerActive( xTimer ) != pdFALSE ) // or more simply and equivalently "if( xTimerIsTimerActive( xTimer ) )" + * { + * // xTimer is active, do something. + * } + * else + * { + * // xTimer is not active, do something else. + * } + * } + * @endverbatim + */ +BaseType_t xTimerIsTimerActive( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; + +/** + * TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ); + * + * Simply returns the handle of the timer service/daemon task. It it not valid + * to call xTimerGetTimerDaemonTaskHandle() before the scheduler has been started. + */ +TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ) PRIVILEGED_FUNCTION; + +/** + * BaseType_t xTimerStart( TimerHandle_t xTimer, TickType_t xTicksToWait ); + * + * Timer functionality is provided by a timer service/daemon task. Many of the + * public FreeRTOS timer API functions send commands to the timer service task + * through a queue called the timer command queue. The timer command queue is + * private to the kernel itself and is not directly accessible to application + * code. The length of the timer command queue is set by the + * configTIMER_QUEUE_LENGTH configuration constant. + * + * xTimerStart() starts a timer that was previously created using the + * xTimerCreate() API function. If the timer had already been started and was + * already in the active state, then xTimerStart() has equivalent functionality + * to the xTimerReset() API function. + * + * Starting a timer ensures the timer is in the active state. If the timer + * is not stopped, deleted, or reset in the mean time, the callback function + * associated with the timer will get called 'n' ticks after xTimerStart() was + * called, where 'n' is the timers defined period. + * + * It is valid to call xTimerStart() before the scheduler has been started, but + * when this is done the timer will not actually start until the scheduler is + * started, and the timers expiry time will be relative to when the scheduler is + * started, not relative to when xTimerStart() was called. + * + * The configUSE_TIMERS configuration constant must be set to 1 for xTimerStart() + * to be available. + * + * @param xTimer The handle of the timer being started/restarted. + * + * @param xTicksToWait Specifies the time, in ticks, that the calling task should + * be held in the Blocked state to wait for the start command to be successfully + * sent to the timer command queue, should the queue already be full when + * xTimerStart() was called. xTicksToWait is ignored if xTimerStart() is called + * before the scheduler is started. + * + * @return pdFAIL will be returned if the start command could not be sent to + * the timer command queue even after xTicksToWait ticks had passed. pdPASS will + * be returned if the command was successfully sent to the timer command queue. + * When the command is actually processed will depend on the priority of the + * timer service/daemon task relative to other tasks in the system, although the + * timers expiry time is relative to when xTimerStart() is actually called. The + * timer service/daemon task priority is set by the configTIMER_TASK_PRIORITY + * configuration constant. + * + * Example usage: + * + * See the xTimerCreate() API function example usage scenario. + * + */ +#define xTimerStart( xTimer, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START, ( xTaskGetTickCount() ), NULL, ( xTicksToWait ) ) + +/** + * BaseType_t xTimerStop( TimerHandle_t xTimer, TickType_t xTicksToWait ); + * + * Timer functionality is provided by a timer service/daemon task. Many of the + * public FreeRTOS timer API functions send commands to the timer service task + * through a queue called the timer command queue. The timer command queue is + * private to the kernel itself and is not directly accessible to application + * code. The length of the timer command queue is set by the + * configTIMER_QUEUE_LENGTH configuration constant. + * + * xTimerStop() stops a timer that was previously started using either of the + * The xTimerStart(), xTimerReset(), xTimerStartFromISR(), xTimerResetFromISR(), + * xTimerChangePeriod() or xTimerChangePeriodFromISR() API functions. + * + * Stopping a timer ensures the timer is not in the active state. + * + * The configUSE_TIMERS configuration constant must be set to 1 for xTimerStop() + * to be available. + * + * @param xTimer The handle of the timer being stopped. + * + * @param xTicksToWait Specifies the time, in ticks, that the calling task should + * be held in the Blocked state to wait for the stop command to be successfully + * sent to the timer command queue, should the queue already be full when + * xTimerStop() was called. xTicksToWait is ignored if xTimerStop() is called + * before the scheduler is started. + * + * @return pdFAIL will be returned if the stop command could not be sent to + * the timer command queue even after xTicksToWait ticks had passed. pdPASS will + * be returned if the command was successfully sent to the timer command queue. + * When the command is actually processed will depend on the priority of the + * timer service/daemon task relative to other tasks in the system. The timer + * service/daemon task priority is set by the configTIMER_TASK_PRIORITY + * configuration constant. + * + * Example usage: + * + * See the xTimerCreate() API function example usage scenario. + * + */ +#define xTimerStop( xTimer, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_STOP, 0U, NULL, ( xTicksToWait ) ) + +/** + * BaseType_t xTimerChangePeriod( TimerHandle_t xTimer, + * TickType_t xNewPeriod, + * TickType_t xTicksToWait ); + * + * Timer functionality is provided by a timer service/daemon task. Many of the + * public FreeRTOS timer API functions send commands to the timer service task + * through a queue called the timer command queue. The timer command queue is + * private to the kernel itself and is not directly accessible to application + * code. The length of the timer command queue is set by the + * configTIMER_QUEUE_LENGTH configuration constant. + * + * xTimerChangePeriod() changes the period of a timer that was previously + * created using the xTimerCreate() API function. + * + * xTimerChangePeriod() can be called to change the period of an active or + * dormant state timer. + * + * The configUSE_TIMERS configuration constant must be set to 1 for + * xTimerChangePeriod() to be available. + * + * @param xTimer The handle of the timer that is having its period changed. + * + * @param xNewPeriod The new period for xTimer. Timer periods are specified in + * tick periods, so the constant portTICK_PERIOD_MS can be used to convert a time + * that has been specified in milliseconds. For example, if the timer must + * expire after 100 ticks, then xNewPeriod should be set to 100. Alternatively, + * if the timer must expire after 500ms, then xNewPeriod can be set to + * ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than + * or equal to 1000. + * + * @param xTicksToWait Specifies the time, in ticks, that the calling task should + * be held in the Blocked state to wait for the change period command to be + * successfully sent to the timer command queue, should the queue already be + * full when xTimerChangePeriod() was called. xTicksToWait is ignored if + * xTimerChangePeriod() is called before the scheduler is started. + * + * @return pdFAIL will be returned if the change period command could not be + * sent to the timer command queue even after xTicksToWait ticks had passed. + * pdPASS will be returned if the command was successfully sent to the timer + * command queue. When the command is actually processed will depend on the + * priority of the timer service/daemon task relative to other tasks in the + * system. The timer service/daemon task priority is set by the + * configTIMER_TASK_PRIORITY configuration constant. + * + * Example usage: + * @verbatim + * // This function assumes xTimer has already been created. If the timer + * // referenced by xTimer is already active when it is called, then the timer + * // is deleted. If the timer referenced by xTimer is not active when it is + * // called, then the period of the timer is set to 500ms and the timer is + * // started. + * void vAFunction( TimerHandle_t xTimer ) + * { + * if( xTimerIsTimerActive( xTimer ) != pdFALSE ) // or more simply and equivalently "if( xTimerIsTimerActive( xTimer ) )" + * { + * // xTimer is already active - delete it. + * xTimerDelete( xTimer ); + * } + * else + * { + * // xTimer is not active, change its period to 500ms. This will also + * // cause the timer to start. Block for a maximum of 100 ticks if the + * // change period command cannot immediately be sent to the timer + * // command queue. + * if( xTimerChangePeriod( xTimer, 500 / portTICK_PERIOD_MS, 100 ) == pdPASS ) + * { + * // The command was successfully sent. + * } + * else + * { + * // The command could not be sent, even after waiting for 100 ticks + * // to pass. Take appropriate action here. + * } + * } + * } + * @endverbatim + */ + #define xTimerChangePeriod( xTimer, xNewPeriod, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_CHANGE_PERIOD, ( xNewPeriod ), NULL, ( xTicksToWait ) ) + +/** + * BaseType_t xTimerDelete( TimerHandle_t xTimer, TickType_t xTicksToWait ); + * + * Timer functionality is provided by a timer service/daemon task. Many of the + * public FreeRTOS timer API functions send commands to the timer service task + * through a queue called the timer command queue. The timer command queue is + * private to the kernel itself and is not directly accessible to application + * code. The length of the timer command queue is set by the + * configTIMER_QUEUE_LENGTH configuration constant. + * + * xTimerDelete() deletes a timer that was previously created using the + * xTimerCreate() API function. + * + * The configUSE_TIMERS configuration constant must be set to 1 for + * xTimerDelete() to be available. + * + * @param xTimer The handle of the timer being deleted. + * + * @param xTicksToWait Specifies the time, in ticks, that the calling task should + * be held in the Blocked state to wait for the delete command to be + * successfully sent to the timer command queue, should the queue already be + * full when xTimerDelete() was called. xTicksToWait is ignored if xTimerDelete() + * is called before the scheduler is started. + * + * @return pdFAIL will be returned if the delete command could not be sent to + * the timer command queue even after xTicksToWait ticks had passed. pdPASS will + * be returned if the command was successfully sent to the timer command queue. + * When the command is actually processed will depend on the priority of the + * timer service/daemon task relative to other tasks in the system. The timer + * service/daemon task priority is set by the configTIMER_TASK_PRIORITY + * configuration constant. + * + * Example usage: + * + * See the xTimerChangePeriod() API function example usage scenario. + */ +#define xTimerDelete( xTimer, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_DELETE, 0U, NULL, ( xTicksToWait ) ) + +/** + * BaseType_t xTimerReset( TimerHandle_t xTimer, TickType_t xTicksToWait ); + * + * Timer functionality is provided by a timer service/daemon task. Many of the + * public FreeRTOS timer API functions send commands to the timer service task + * through a queue called the timer command queue. The timer command queue is + * private to the kernel itself and is not directly accessible to application + * code. The length of the timer command queue is set by the + * configTIMER_QUEUE_LENGTH configuration constant. + * + * xTimerReset() re-starts a timer that was previously created using the + * xTimerCreate() API function. If the timer had already been started and was + * already in the active state, then xTimerReset() will cause the timer to + * re-evaluate its expiry time so that it is relative to when xTimerReset() was + * called. If the timer was in the dormant state then xTimerReset() has + * equivalent functionality to the xTimerStart() API function. + * + * Resetting a timer ensures the timer is in the active state. If the timer + * is not stopped, deleted, or reset in the mean time, the callback function + * associated with the timer will get called 'n' ticks after xTimerReset() was + * called, where 'n' is the timers defined period. + * + * It is valid to call xTimerReset() before the scheduler has been started, but + * when this is done the timer will not actually start until the scheduler is + * started, and the timers expiry time will be relative to when the scheduler is + * started, not relative to when xTimerReset() was called. + * + * The configUSE_TIMERS configuration constant must be set to 1 for xTimerReset() + * to be available. + * + * @param xTimer The handle of the timer being reset/started/restarted. + * + * @param xTicksToWait Specifies the time, in ticks, that the calling task should + * be held in the Blocked state to wait for the reset command to be successfully + * sent to the timer command queue, should the queue already be full when + * xTimerReset() was called. xTicksToWait is ignored if xTimerReset() is called + * before the scheduler is started. + * + * @return pdFAIL will be returned if the reset command could not be sent to + * the timer command queue even after xTicksToWait ticks had passed. pdPASS will + * be returned if the command was successfully sent to the timer command queue. + * When the command is actually processed will depend on the priority of the + * timer service/daemon task relative to other tasks in the system, although the + * timers expiry time is relative to when xTimerStart() is actually called. The + * timer service/daemon task priority is set by the configTIMER_TASK_PRIORITY + * configuration constant. + * + * Example usage: + * @verbatim + * // When a key is pressed, an LCD back-light is switched on. If 5 seconds pass + * // without a key being pressed, then the LCD back-light is switched off. In + * // this case, the timer is a one-shot timer. + * + * TimerHandle_t xBacklightTimer = NULL; + * + * // The callback function assigned to the one-shot timer. In this case the + * // parameter is not used. + * void vBacklightTimerCallback( TimerHandle_t pxTimer ) + * { + * // The timer expired, therefore 5 seconds must have passed since a key + * // was pressed. Switch off the LCD back-light. + * vSetBacklightState( BACKLIGHT_OFF ); + * } + * + * // The key press event handler. + * void vKeyPressEventHandler( char cKey ) + * { + * // Ensure the LCD back-light is on, then reset the timer that is + * // responsible for turning the back-light off after 5 seconds of + * // key inactivity. Wait 10 ticks for the command to be successfully sent + * // if it cannot be sent immediately. + * vSetBacklightState( BACKLIGHT_ON ); + * if( xTimerReset( xBacklightTimer, 100 ) != pdPASS ) + * { + * // The reset command was not executed successfully. Take appropriate + * // action here. + * } + * + * // Perform the rest of the key processing here. + * } + * + * void main( void ) + * { + * int32_t x; + * + * // Create then start the one-shot timer that is responsible for turning + * // the back-light off if no keys are pressed within a 5 second period. + * xBacklightTimer = xTimerCreate( "BacklightTimer", // Just a text name, not used by the kernel. + * ( 5000 / portTICK_PERIOD_MS), // The timer period in ticks. + * pdFALSE, // The timer is a one-shot timer. + * 0, // The id is not used by the callback so can take any value. + * vBacklightTimerCallback // The callback function that switches the LCD back-light off. + * ); + * + * if( xBacklightTimer == NULL ) + * { + * // The timer was not created. + * } + * else + * { + * // Start the timer. No block time is specified, and even if one was + * // it would be ignored because the scheduler has not yet been + * // started. + * if( xTimerStart( xBacklightTimer, 0 ) != pdPASS ) + * { + * // The timer could not be set into the Active state. + * } + * } + * + * // ... + * // Create tasks here. + * // ... + * + * // Starting the scheduler will start the timer running as it has already + * // been set into the active state. + * vTaskStartScheduler(); + * + * // Should not reach here. + * for( ;; ); + * } + * @endverbatim + */ +#define xTimerReset( xTimer, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_RESET, ( xTaskGetTickCount() ), NULL, ( xTicksToWait ) ) + +/** + * BaseType_t xTimerStartFromISR( TimerHandle_t xTimer, + * BaseType_t *pxHigherPriorityTaskWoken ); + * + * A version of xTimerStart() that can be called from an interrupt service + * routine. + * + * @param xTimer The handle of the timer being started/restarted. + * + * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most + * of its time in the Blocked state, waiting for messages to arrive on the timer + * command queue. Calling xTimerStartFromISR() writes a message to the timer + * command queue, so has the potential to transition the timer service/daemon + * task out of the Blocked state. If calling xTimerStartFromISR() causes the + * timer service/daemon task to leave the Blocked state, and the timer service/ + * daemon task has a priority equal to or greater than the currently executing + * task (the task that was interrupted), then *pxHigherPriorityTaskWoken will + * get set to pdTRUE internally within the xTimerStartFromISR() function. If + * xTimerStartFromISR() sets this value to pdTRUE then a context switch should + * be performed before the interrupt exits. + * + * @return pdFAIL will be returned if the start command could not be sent to + * the timer command queue. pdPASS will be returned if the command was + * successfully sent to the timer command queue. When the command is actually + * processed will depend on the priority of the timer service/daemon task + * relative to other tasks in the system, although the timers expiry time is + * relative to when xTimerStartFromISR() is actually called. The timer + * service/daemon task priority is set by the configTIMER_TASK_PRIORITY + * configuration constant. + * + * Example usage: + * @verbatim + * // This scenario assumes xBacklightTimer has already been created. When a + * // key is pressed, an LCD back-light is switched on. If 5 seconds pass + * // without a key being pressed, then the LCD back-light is switched off. In + * // this case, the timer is a one-shot timer, and unlike the example given for + * // the xTimerReset() function, the key press event handler is an interrupt + * // service routine. + * + * // The callback function assigned to the one-shot timer. In this case the + * // parameter is not used. + * void vBacklightTimerCallback( TimerHandle_t pxTimer ) + * { + * // The timer expired, therefore 5 seconds must have passed since a key + * // was pressed. Switch off the LCD back-light. + * vSetBacklightState( BACKLIGHT_OFF ); + * } + * + * // The key press interrupt service routine. + * void vKeyPressEventInterruptHandler( void ) + * { + * BaseType_t xHigherPriorityTaskWoken = pdFALSE; + * + * // Ensure the LCD back-light is on, then restart the timer that is + * // responsible for turning the back-light off after 5 seconds of + * // key inactivity. This is an interrupt service routine so can only + * // call FreeRTOS API functions that end in "FromISR". + * vSetBacklightState( BACKLIGHT_ON ); + * + * // xTimerStartFromISR() or xTimerResetFromISR() could be called here + * // as both cause the timer to re-calculate its expiry time. + * // xHigherPriorityTaskWoken was initialised to pdFALSE when it was + * // declared (in this function). + * if( xTimerStartFromISR( xBacklightTimer, &xHigherPriorityTaskWoken ) != pdPASS ) + * { + * // The start command was not executed successfully. Take appropriate + * // action here. + * } + * + * // Perform the rest of the key processing here. + * + * // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch + * // should be performed. The syntax required to perform a context switch + * // from inside an ISR varies from port to port, and from compiler to + * // compiler. Inspect the demos for the port you are using to find the + * // actual syntax required. + * if( xHigherPriorityTaskWoken != pdFALSE ) + * { + * // Call the interrupt safe yield function here (actual function + * // depends on the FreeRTOS port being used). + * } + * } + * @endverbatim + */ +#define xTimerStartFromISR( xTimer, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START_FROM_ISR, ( xTaskGetTickCountFromISR() ), ( pxHigherPriorityTaskWoken ), 0U ) + +/** + * BaseType_t xTimerStopFromISR( TimerHandle_t xTimer, + * BaseType_t *pxHigherPriorityTaskWoken ); + * + * A version of xTimerStop() that can be called from an interrupt service + * routine. + * + * @param xTimer The handle of the timer being stopped. + * + * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most + * of its time in the Blocked state, waiting for messages to arrive on the timer + * command queue. Calling xTimerStopFromISR() writes a message to the timer + * command queue, so has the potential to transition the timer service/daemon + * task out of the Blocked state. If calling xTimerStopFromISR() causes the + * timer service/daemon task to leave the Blocked state, and the timer service/ + * daemon task has a priority equal to or greater than the currently executing + * task (the task that was interrupted), then *pxHigherPriorityTaskWoken will + * get set to pdTRUE internally within the xTimerStopFromISR() function. If + * xTimerStopFromISR() sets this value to pdTRUE then a context switch should + * be performed before the interrupt exits. + * + * @return pdFAIL will be returned if the stop command could not be sent to + * the timer command queue. pdPASS will be returned if the command was + * successfully sent to the timer command queue. When the command is actually + * processed will depend on the priority of the timer service/daemon task + * relative to other tasks in the system. The timer service/daemon task + * priority is set by the configTIMER_TASK_PRIORITY configuration constant. + * + * Example usage: + * @verbatim + * // This scenario assumes xTimer has already been created and started. When + * // an interrupt occurs, the timer should be simply stopped. + * + * // The interrupt service routine that stops the timer. + * void vAnExampleInterruptServiceRoutine( void ) + * { + * BaseType_t xHigherPriorityTaskWoken = pdFALSE; + * + * // The interrupt has occurred - simply stop the timer. + * // xHigherPriorityTaskWoken was set to pdFALSE where it was defined + * // (within this function). As this is an interrupt service routine, only + * // FreeRTOS API functions that end in "FromISR" can be used. + * if( xTimerStopFromISR( xTimer, &xHigherPriorityTaskWoken ) != pdPASS ) + * { + * // The stop command was not executed successfully. Take appropriate + * // action here. + * } + * + * // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch + * // should be performed. The syntax required to perform a context switch + * // from inside an ISR varies from port to port, and from compiler to + * // compiler. Inspect the demos for the port you are using to find the + * // actual syntax required. + * if( xHigherPriorityTaskWoken != pdFALSE ) + * { + * // Call the interrupt safe yield function here (actual function + * // depends on the FreeRTOS port being used). + * } + * } + * @endverbatim + */ +#define xTimerStopFromISR( xTimer, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_STOP_FROM_ISR, 0, ( pxHigherPriorityTaskWoken ), 0U ) + +/** + * BaseType_t xTimerChangePeriodFromISR( TimerHandle_t xTimer, + * TickType_t xNewPeriod, + * BaseType_t *pxHigherPriorityTaskWoken ); + * + * A version of xTimerChangePeriod() that can be called from an interrupt + * service routine. + * + * @param xTimer The handle of the timer that is having its period changed. + * + * @param xNewPeriod The new period for xTimer. Timer periods are specified in + * tick periods, so the constant portTICK_PERIOD_MS can be used to convert a time + * that has been specified in milliseconds. For example, if the timer must + * expire after 100 ticks, then xNewPeriod should be set to 100. Alternatively, + * if the timer must expire after 500ms, then xNewPeriod can be set to + * ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than + * or equal to 1000. + * + * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most + * of its time in the Blocked state, waiting for messages to arrive on the timer + * command queue. Calling xTimerChangePeriodFromISR() writes a message to the + * timer command queue, so has the potential to transition the timer service/ + * daemon task out of the Blocked state. If calling xTimerChangePeriodFromISR() + * causes the timer service/daemon task to leave the Blocked state, and the + * timer service/daemon task has a priority equal to or greater than the + * currently executing task (the task that was interrupted), then + * *pxHigherPriorityTaskWoken will get set to pdTRUE internally within the + * xTimerChangePeriodFromISR() function. If xTimerChangePeriodFromISR() sets + * this value to pdTRUE then a context switch should be performed before the + * interrupt exits. + * + * @return pdFAIL will be returned if the command to change the timers period + * could not be sent to the timer command queue. pdPASS will be returned if the + * command was successfully sent to the timer command queue. When the command + * is actually processed will depend on the priority of the timer service/daemon + * task relative to other tasks in the system. The timer service/daemon task + * priority is set by the configTIMER_TASK_PRIORITY configuration constant. + * + * Example usage: + * @verbatim + * // This scenario assumes xTimer has already been created and started. When + * // an interrupt occurs, the period of xTimer should be changed to 500ms. + * + * // The interrupt service routine that changes the period of xTimer. + * void vAnExampleInterruptServiceRoutine( void ) + * { + * BaseType_t xHigherPriorityTaskWoken = pdFALSE; + * + * // The interrupt has occurred - change the period of xTimer to 500ms. + * // xHigherPriorityTaskWoken was set to pdFALSE where it was defined + * // (within this function). As this is an interrupt service routine, only + * // FreeRTOS API functions that end in "FromISR" can be used. + * if( xTimerChangePeriodFromISR( xTimer, &xHigherPriorityTaskWoken ) != pdPASS ) + * { + * // The command to change the timers period was not executed + * // successfully. Take appropriate action here. + * } + * + * // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch + * // should be performed. The syntax required to perform a context switch + * // from inside an ISR varies from port to port, and from compiler to + * // compiler. Inspect the demos for the port you are using to find the + * // actual syntax required. + * if( xHigherPriorityTaskWoken != pdFALSE ) + * { + * // Call the interrupt safe yield function here (actual function + * // depends on the FreeRTOS port being used). + * } + * } + * @endverbatim + */ +#define xTimerChangePeriodFromISR( xTimer, xNewPeriod, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_CHANGE_PERIOD_FROM_ISR, ( xNewPeriod ), ( pxHigherPriorityTaskWoken ), 0U ) + +/** + * BaseType_t xTimerResetFromISR( TimerHandle_t xTimer, + * BaseType_t *pxHigherPriorityTaskWoken ); + * + * A version of xTimerReset() that can be called from an interrupt service + * routine. + * + * @param xTimer The handle of the timer that is to be started, reset, or + * restarted. + * + * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most + * of its time in the Blocked state, waiting for messages to arrive on the timer + * command queue. Calling xTimerResetFromISR() writes a message to the timer + * command queue, so has the potential to transition the timer service/daemon + * task out of the Blocked state. If calling xTimerResetFromISR() causes the + * timer service/daemon task to leave the Blocked state, and the timer service/ + * daemon task has a priority equal to or greater than the currently executing + * task (the task that was interrupted), then *pxHigherPriorityTaskWoken will + * get set to pdTRUE internally within the xTimerResetFromISR() function. If + * xTimerResetFromISR() sets this value to pdTRUE then a context switch should + * be performed before the interrupt exits. + * + * @return pdFAIL will be returned if the reset command could not be sent to + * the timer command queue. pdPASS will be returned if the command was + * successfully sent to the timer command queue. When the command is actually + * processed will depend on the priority of the timer service/daemon task + * relative to other tasks in the system, although the timers expiry time is + * relative to when xTimerResetFromISR() is actually called. The timer service/daemon + * task priority is set by the configTIMER_TASK_PRIORITY configuration constant. + * + * Example usage: + * @verbatim + * // This scenario assumes xBacklightTimer has already been created. When a + * // key is pressed, an LCD back-light is switched on. If 5 seconds pass + * // without a key being pressed, then the LCD back-light is switched off. In + * // this case, the timer is a one-shot timer, and unlike the example given for + * // the xTimerReset() function, the key press event handler is an interrupt + * // service routine. + * + * // The callback function assigned to the one-shot timer. In this case the + * // parameter is not used. + * void vBacklightTimerCallback( TimerHandle_t pxTimer ) + * { + * // The timer expired, therefore 5 seconds must have passed since a key + * // was pressed. Switch off the LCD back-light. + * vSetBacklightState( BACKLIGHT_OFF ); + * } + * + * // The key press interrupt service routine. + * void vKeyPressEventInterruptHandler( void ) + * { + * BaseType_t xHigherPriorityTaskWoken = pdFALSE; + * + * // Ensure the LCD back-light is on, then reset the timer that is + * // responsible for turning the back-light off after 5 seconds of + * // key inactivity. This is an interrupt service routine so can only + * // call FreeRTOS API functions that end in "FromISR". + * vSetBacklightState( BACKLIGHT_ON ); + * + * // xTimerStartFromISR() or xTimerResetFromISR() could be called here + * // as both cause the timer to re-calculate its expiry time. + * // xHigherPriorityTaskWoken was initialised to pdFALSE when it was + * // declared (in this function). + * if( xTimerResetFromISR( xBacklightTimer, &xHigherPriorityTaskWoken ) != pdPASS ) + * { + * // The reset command was not executed successfully. Take appropriate + * // action here. + * } + * + * // Perform the rest of the key processing here. + * + * // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch + * // should be performed. The syntax required to perform a context switch + * // from inside an ISR varies from port to port, and from compiler to + * // compiler. Inspect the demos for the port you are using to find the + * // actual syntax required. + * if( xHigherPriorityTaskWoken != pdFALSE ) + * { + * // Call the interrupt safe yield function here (actual function + * // depends on the FreeRTOS port being used). + * } + * } + * @endverbatim + */ +#define xTimerResetFromISR( xTimer, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_RESET_FROM_ISR, ( xTaskGetTickCountFromISR() ), ( pxHigherPriorityTaskWoken ), 0U ) + + +/** + * BaseType_t xTimerPendFunctionCallFromISR( PendedFunction_t xFunctionToPend, + * void *pvParameter1, + * uint32_t ulParameter2, + * BaseType_t *pxHigherPriorityTaskWoken ); + * + * + * Used from application interrupt service routines to defer the execution of a + * function to the RTOS daemon task (the timer service task, hence this function + * is implemented in timers.c and is prefixed with 'Timer'). + * + * Ideally an interrupt service routine (ISR) is kept as short as possible, but + * sometimes an ISR either has a lot of processing to do, or needs to perform + * processing that is not deterministic. In these cases + * xTimerPendFunctionCallFromISR() can be used to defer processing of a function + * to the RTOS daemon task. + * + * A mechanism is provided that allows the interrupt to return directly to the + * task that will subsequently execute the pended callback function. This + * allows the callback function to execute contiguously in time with the + * interrupt - just as if the callback had executed in the interrupt itself. + * + * @param xFunctionToPend The function to execute from the timer service/ + * daemon task. The function must conform to the PendedFunction_t + * prototype. + * + * @param pvParameter1 The value of the callback function's first parameter. + * The parameter has a void * type to allow it to be used to pass any type. + * For example, unsigned longs can be cast to a void *, or the void * can be + * used to point to a structure. + * + * @param ulParameter2 The value of the callback function's second parameter. + * + * @param pxHigherPriorityTaskWoken As mentioned above, calling this function + * will result in a message being sent to the timer daemon task. If the + * priority of the timer daemon task (which is set using + * configTIMER_TASK_PRIORITY in FreeRTOSConfig.h) is higher than the priority of + * the currently running task (the task the interrupt interrupted) then + * *pxHigherPriorityTaskWoken will be set to pdTRUE within + * xTimerPendFunctionCallFromISR(), indicating that a context switch should be + * requested before the interrupt exits. For that reason + * *pxHigherPriorityTaskWoken must be initialised to pdFALSE. See the + * example code below. + * + * @return pdPASS is returned if the message was successfully sent to the + * timer daemon task, otherwise pdFALSE is returned. + * + * Example usage: + * @verbatim + * + * // The callback function that will execute in the context of the daemon task. + * // Note callback functions must all use this same prototype. + * void vProcessInterface( void *pvParameter1, uint32_t ulParameter2 ) + * { + * BaseType_t xInterfaceToService; + * + * // The interface that requires servicing is passed in the second + * // parameter. The first parameter is not used in this case. + * xInterfaceToService = ( BaseType_t ) ulParameter2; + * + * // ...Perform the processing here... + * } + * + * // An ISR that receives data packets from multiple interfaces + * void vAnISR( void ) + * { + * BaseType_t xInterfaceToService, xHigherPriorityTaskWoken; + * + * // Query the hardware to determine which interface needs processing. + * xInterfaceToService = prvCheckInterfaces(); + * + * // The actual processing is to be deferred to a task. Request the + * // vProcessInterface() callback function is executed, passing in the + * // number of the interface that needs processing. The interface to + * // service is passed in the second parameter. The first parameter is + * // not used in this case. + * xHigherPriorityTaskWoken = pdFALSE; + * xTimerPendFunctionCallFromISR( vProcessInterface, NULL, ( uint32_t ) xInterfaceToService, &xHigherPriorityTaskWoken ); + * + * // If xHigherPriorityTaskWoken is now set to pdTRUE then a context + * // switch should be requested. The macro used is port specific and will + * // be either portYIELD_FROM_ISR() or portEND_SWITCHING_ISR() - refer to + * // the documentation page for the port being used. + * portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); + * + * } + * @endverbatim + */ +BaseType_t xTimerPendFunctionCallFromISR( PendedFunction_t xFunctionToPend, void *pvParameter1, uint32_t ulParameter2, BaseType_t *pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; + + /** + * BaseType_t xTimerPendFunctionCall( PendedFunction_t xFunctionToPend, + * void *pvParameter1, + * uint32_t ulParameter2, + * TickType_t xTicksToWait ); + * + * + * Used to defer the execution of a function to the RTOS daemon task (the timer + * service task, hence this function is implemented in timers.c and is prefixed + * with 'Timer'). + * + * @param xFunctionToPend The function to execute from the timer service/ + * daemon task. The function must conform to the PendedFunction_t + * prototype. + * + * @param pvParameter1 The value of the callback function's first parameter. + * The parameter has a void * type to allow it to be used to pass any type. + * For example, unsigned longs can be cast to a void *, or the void * can be + * used to point to a structure. + * + * @param ulParameter2 The value of the callback function's second parameter. + * + * @param xTicksToWait Calling this function will result in a message being + * sent to the timer daemon task on a queue. xTicksToWait is the amount of + * time the calling task should remain in the Blocked state (so not using any + * processing time) for space to become available on the timer queue if the + * queue is found to be full. + * + * @return pdPASS is returned if the message was successfully sent to the + * timer daemon task, otherwise pdFALSE is returned. + * + */ +BaseType_t xTimerPendFunctionCall( PendedFunction_t xFunctionToPend, void *pvParameter1, uint32_t ulParameter2, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +/** + * const char * const pcTimerGetName( TimerHandle_t xTimer ); + * + * Returns the name that was assigned to a timer when the timer was created. + * + * @param xTimer The handle of the timer being queried. + * + * @return The name assigned to the timer specified by the xTimer parameter. + */ +const char * pcTimerGetName( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + +/** + * TickType_t xTimerGetPeriod( TimerHandle_t xTimer ); + * + * Returns the period of a timer. + * + * @param xTimer The handle of the timer being queried. + * + * @return The period of the timer in ticks. + */ +TickType_t xTimerGetPeriod( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; + +/** +* TickType_t xTimerGetExpiryTime( TimerHandle_t xTimer ); +* +* Returns the time in ticks at which the timer will expire. If this is less +* than the current tick count then the expiry time has overflowed from the +* current time. +* +* @param xTimer The handle of the timer being queried. +* +* @return If the timer is running then the time in ticks at which the timer +* will next expire is returned. If the timer is not running then the return +* value is undefined. +*/ +TickType_t xTimerGetExpiryTime( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; + +/* + * Functions beyond this part are not part of the public API and are intended + * for use by the kernel only. + */ +BaseType_t xTimerCreateTimerTask( void ) PRIVILEGED_FUNCTION; +BaseType_t xTimerGenericCommand( TimerHandle_t xTimer, const BaseType_t xCommandID, const TickType_t xOptionalValue, BaseType_t * const pxHigherPriorityTaskWoken, const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +#ifdef __cplusplus +} +#endif +#endif /* TIMERS_H */ + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/list.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/list.c new file mode 100644 index 0000000..0c00474 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/list.c @@ -0,0 +1,240 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#include +#include "FreeRTOS.h" +#include "list.h" + +/*----------------------------------------------------------- + * PUBLIC LIST API documented in list.h + *----------------------------------------------------------*/ + +void vListInitialise( List_t * const pxList ) +{ + /* The list structure contains a list item which is used to mark the + end of the list. To initialise the list the list end is inserted + as the only list entry. */ + pxList->pxIndex = ( ListItem_t * ) &( pxList->xListEnd ); /*lint !e826 !e740 The mini list structure is used as the list end to save RAM. This is checked and valid. */ + + /* The list end value is the highest possible value in the list to + ensure it remains at the end of the list. */ + pxList->xListEnd.xItemValue = portMAX_DELAY; + + /* The list end next and previous pointers point to itself so we know + when the list is empty. */ + pxList->xListEnd.pxNext = ( ListItem_t * ) &( pxList->xListEnd ); /*lint !e826 !e740 The mini list structure is used as the list end to save RAM. This is checked and valid. */ + pxList->xListEnd.pxPrevious = ( ListItem_t * ) &( pxList->xListEnd );/*lint !e826 !e740 The mini list structure is used as the list end to save RAM. This is checked and valid. */ + + pxList->uxNumberOfItems = ( UBaseType_t ) 0U; + + /* Write known values into the list if + configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ + listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList ); + listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList ); +} +/*-----------------------------------------------------------*/ + +void vListInitialiseItem( ListItem_t * const pxItem ) +{ + /* Make sure the list item is not recorded as being on a list. */ + pxItem->pvContainer = NULL; + + /* Write known values into the list item if + configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ + listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ); + listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ); +} +/*-----------------------------------------------------------*/ + +void vListInsertEnd( List_t * const pxList, ListItem_t * const pxNewListItem ) +{ +ListItem_t * const pxIndex = pxList->pxIndex; + + /* Only effective when configASSERT() is also defined, these tests may catch + the list data structures being overwritten in memory. They will not catch + data errors caused by incorrect configuration or use of FreeRTOS. */ + listTEST_LIST_INTEGRITY( pxList ); + listTEST_LIST_ITEM_INTEGRITY( pxNewListItem ); + + /* Insert a new list item into pxList, but rather than sort the list, + makes the new list item the last item to be removed by a call to + listGET_OWNER_OF_NEXT_ENTRY(). */ + pxNewListItem->pxNext = pxIndex; + pxNewListItem->pxPrevious = pxIndex->pxPrevious; + + /* Only used during decision coverage testing. */ + mtCOVERAGE_TEST_DELAY(); + + pxIndex->pxPrevious->pxNext = pxNewListItem; + pxIndex->pxPrevious = pxNewListItem; + + /* Remember which list the item is in. */ + pxNewListItem->pvContainer = ( void * ) pxList; + + ( pxList->uxNumberOfItems )++; +} +/*-----------------------------------------------------------*/ + +void vListInsert( List_t * const pxList, ListItem_t * const pxNewListItem ) +{ +ListItem_t *pxIterator; +const TickType_t xValueOfInsertion = pxNewListItem->xItemValue; + + /* Only effective when configASSERT() is also defined, these tests may catch + the list data structures being overwritten in memory. They will not catch + data errors caused by incorrect configuration or use of FreeRTOS. */ + listTEST_LIST_INTEGRITY( pxList ); + listTEST_LIST_ITEM_INTEGRITY( pxNewListItem ); + + /* Insert the new list item into the list, sorted in xItemValue order. + + If the list already contains a list item with the same item value then the + new list item should be placed after it. This ensures that TCB's which are + stored in ready lists (all of which have the same xItemValue value) get a + share of the CPU. However, if the xItemValue is the same as the back marker + the iteration loop below will not end. Therefore the value is checked + first, and the algorithm slightly modified if necessary. */ + if( xValueOfInsertion == portMAX_DELAY ) + { + pxIterator = pxList->xListEnd.pxPrevious; + } + else + { + /* *** NOTE *********************************************************** + If you find your application is crashing here then likely causes are + listed below. In addition see http://www.freertos.org/FAQHelp.html for + more tips, and ensure configASSERT() is defined! + http://www.freertos.org/a00110.html#configASSERT + + 1) Stack overflow - + see http://www.freertos.org/Stacks-and-stack-overflow-checking.html + 2) Incorrect interrupt priority assignment, especially on Cortex-M + parts where numerically high priority values denote low actual + interrupt priorities, which can seem counter intuitive. See + http://www.freertos.org/RTOS-Cortex-M3-M4.html and the definition + of configMAX_SYSCALL_INTERRUPT_PRIORITY on + http://www.freertos.org/a00110.html + 3) Calling an API function from within a critical section or when + the scheduler is suspended, or calling an API function that does + not end in "FromISR" from an interrupt. + 4) Using a queue or semaphore before it has been initialised or + before the scheduler has been started (are interrupts firing + before vTaskStartScheduler() has been called?). + **********************************************************************/ + + for( pxIterator = ( ListItem_t * ) &( pxList->xListEnd ); pxIterator->pxNext->xItemValue <= xValueOfInsertion; pxIterator = pxIterator->pxNext ) /*lint !e826 !e740 The mini list structure is used as the list end to save RAM. This is checked and valid. */ + { + /* There is nothing to do here, just iterating to the wanted + insertion position. */ + } + } + + pxNewListItem->pxNext = pxIterator->pxNext; + pxNewListItem->pxNext->pxPrevious = pxNewListItem; + pxNewListItem->pxPrevious = pxIterator; + pxIterator->pxNext = pxNewListItem; + + /* Remember which list the item is in. This allows fast removal of the + item later. */ + pxNewListItem->pvContainer = ( void * ) pxList; + + ( pxList->uxNumberOfItems )++; +} +/*-----------------------------------------------------------*/ + +UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove ) +{ +/* The list item knows which list it is in. Obtain the list from the list +item. */ +List_t * const pxList = ( List_t * ) pxItemToRemove->pvContainer; + + pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious; + pxItemToRemove->pxPrevious->pxNext = pxItemToRemove->pxNext; + + /* Only used during decision coverage testing. */ + mtCOVERAGE_TEST_DELAY(); + + /* Make sure the index is left pointing to a valid item. */ + if( pxList->pxIndex == pxItemToRemove ) + { + pxList->pxIndex = pxItemToRemove->pxPrevious; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + pxItemToRemove->pvContainer = NULL; + ( pxList->uxNumberOfItems )--; + + return pxList->uxNumberOfItems; +} +/*-----------------------------------------------------------*/ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/BCC/16BitDOS/Flsh186/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/BCC/16BitDOS/Flsh186/port.c new file mode 100644 index 0000000..7a75209 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/BCC/16BitDOS/Flsh186/port.c @@ -0,0 +1,286 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* +Changes from V1.00: + + + Call to taskYIELD() from within tick ISR has been replaced by the more + efficient portSWITCH_CONTEXT(). + + ISR function definitions renamed to include the prv prefix. + +Changes from V2.6.1 + + + Replaced the sUsingPreemption variable with the configUSE_PREEMPTION + macro to be consistent with the later ports. +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the Flashlite 186 + * port. + *----------------------------------------------------------*/ + +#include +#include +#include + +#include "FreeRTOS.h" +#include "task.h" +#include "portasm.h" + +/*lint -e950 Non ANSI reserved words okay in this file only. */ + +#define portTIMER_EOI_TYPE ( 8 ) +#define portRESET_PIC() portOUTPUT_WORD( ( uint16_t ) 0xff22, portTIMER_EOI_TYPE ) +#define portTIMER_INT_NUMBER 0x12 + +#define portTIMER_1_CONTROL_REGISTER ( ( uint16_t ) 0xff5e ) +#define portTIMER_0_CONTROL_REGISTER ( ( uint16_t ) 0xff56 ) +#define portTIMER_INTERRUPT_ENABLE ( ( uint16_t ) 0x2000 ) + +/* Setup the hardware to generate the required tick frequency. */ +static void prvSetTickFrequency( uint32_t ulTickRateHz ); + +/* Set the hardware back to the state as per before the scheduler started. */ +static void prvExitFunction( void ); + +/* The ISR used depends on whether the preemptive or cooperative scheduler +is being used. */ +#if( configUSE_PREEMPTION == 1 ) + /* Tick service routine used by the scheduler when preemptive scheduling is + being used. */ + static void __interrupt __far prvPreemptiveTick( void ); +#else + /* Tick service routine used by the scheduler when cooperative scheduling is + being used. */ + static void __interrupt __far prvNonPreemptiveTick( void ); +#endif + +/* Trap routine used by taskYIELD() to manually cause a context switch. */ +static void __interrupt __far prvYieldProcessor( void ); + +/*lint -e956 File scopes necessary here. */ + +/* Set true when the vectors are set so the scheduler will service the tick. */ +static BaseType_t xSchedulerRunning = pdFALSE; + +/* Points to the original routine installed on the vector we use for manual +context switches. This is then used to restore the original routine during +prvExitFunction(). */ +static void ( __interrupt __far *pxOldSwitchISR )(); + +/* Used to restore the original DOS context when the scheduler is ended. */ +static jmp_buf xJumpBuf; + +/*lint +e956 */ + +/*-----------------------------------------------------------*/ +BaseType_t xPortStartScheduler( void ) +{ + /* This is called with interrupts already disabled. */ + + /* Remember what was on the interrupts we are going to use + so we can put them back later if required. */ + pxOldSwitchISR = _dos_getvect( portSWITCH_INT_NUMBER ); + + /* Put our manual switch (yield) function on a known + vector. */ + _dos_setvect( portSWITCH_INT_NUMBER, prvYieldProcessor ); + + #if( configUSE_PREEMPTION == 1 ) + { + /* Put our tick switch function on the timer interrupt. */ + _dos_setvect( portTIMER_INT_NUMBER, prvPreemptiveTick ); + } + #else + { + /* We want the timer interrupt to just increment the tick count. */ + _dos_setvect( portTIMER_INT_NUMBER, prvNonPreemptiveTick ); + } + #endif + + prvSetTickFrequency( configTICK_RATE_HZ ); + + /* Clean up function if we want to return to DOS. */ + if( setjmp( xJumpBuf ) != 0 ) + { + prvExitFunction(); + xSchedulerRunning = pdFALSE; + } + else + { + xSchedulerRunning = pdTRUE; + + /* Kick off the scheduler by setting up the context of the first task. */ + portFIRST_CONTEXT(); + } + + return xSchedulerRunning; +} +/*-----------------------------------------------------------*/ + +/* The ISR used depends on whether the preemptive or cooperative scheduler +is being used. */ +#if( configUSE_PREEMPTION == 1 ) + static void __interrupt __far prvPreemptiveTick( void ) + { + /* Get the scheduler to update the task states following the tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Switch in the context of the next task to be run. */ + portSWITCH_CONTEXT(); + } + + /* Reset the PIC ready for the next time. */ + portRESET_PIC(); + } +#else + static void __interrupt __far prvNonPreemptiveTick( void ) + { + /* Same as preemptive tick, but the cooperative scheduler is being used + so we don't have to switch in the context of the next task. */ + xTaskIncrementTick(); + portRESET_PIC(); + } +#endif +/*-----------------------------------------------------------*/ + +static void __interrupt __far prvYieldProcessor( void ) +{ + /* Switch in the context of the next task to be run. */ + portSWITCH_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Jump back to the processor state prior to starting the + scheduler. This means we are not going to be using a + task stack frame so the task can be deleted. */ + longjmp( xJumpBuf, 1 ); +} +/*-----------------------------------------------------------*/ + +static void prvExitFunction( void ) +{ +const uint16_t usTimerDisable = 0x0000; +uint16_t usTimer0Control; + + /* Interrupts should be disabled here anyway - but no + harm in making sure. */ + portDISABLE_INTERRUPTS(); + if( xSchedulerRunning == pdTRUE ) + { + /* Put back the switch interrupt routines that was in place + before the scheduler started. */ + _dos_setvect( portSWITCH_INT_NUMBER, pxOldSwitchISR ); + } + + /* Disable the timer used for the tick to ensure the scheduler is + not called before restoring interrupts. There was previously nothing + on this timer so there is no old ISR to restore. */ + portOUTPUT_WORD( portTIMER_1_CONTROL_REGISTER, usTimerDisable ); + + /* Restart the DOS tick. */ + usTimer0Control = portINPUT_WORD( portTIMER_0_CONTROL_REGISTER ); + usTimer0Control |= portTIMER_INTERRUPT_ENABLE; + portOUTPUT_WORD( portTIMER_0_CONTROL_REGISTER, usTimer0Control ); + + + portENABLE_INTERRUPTS(); +} +/*-----------------------------------------------------------*/ + +static void prvSetTickFrequency( uint32_t ulTickRateHz ) +{ +const uint16_t usMaxCountRegister = 0xff5a; +const uint16_t usTimerPriorityRegister = 0xff32; +const uint16_t usTimerEnable = 0xC000; +const uint16_t usRetrigger = 0x0001; +const uint16_t usTimerHighPriority = 0x0000; +uint16_t usTimer0Control; + +/* ( CPU frequency / 4 ) / clock 2 max count [inpw( 0xff62 ) = 7] */ + +const uint32_t ulClockFrequency = ( uint32_t ) 0x7f31a0UL; + +uint32_t ulTimerCount = ulClockFrequency / ulTickRateHz; + + portOUTPUT_WORD( portTIMER_1_CONTROL_REGISTER, usTimerEnable | portTIMER_INTERRUPT_ENABLE | usRetrigger ); + portOUTPUT_WORD( usMaxCountRegister, ( uint16_t ) ulTimerCount ); + portOUTPUT_WORD( usTimerPriorityRegister, usTimerHighPriority ); + + /* Stop the DOS tick - don't do this if you want to maintain a TOD clock. */ + usTimer0Control = portINPUT_WORD( portTIMER_0_CONTROL_REGISTER ); + usTimer0Control &= ~portTIMER_INTERRUPT_ENABLE; + portOUTPUT_WORD( portTIMER_0_CONTROL_REGISTER, usTimer0Control ); +} + + +/*lint +e950 */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/BCC/16BitDOS/Flsh186/prtmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/BCC/16BitDOS/Flsh186/prtmacro.h new file mode 100644 index 0000000..5779f5e --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/BCC/16BitDOS/Flsh186/prtmacro.h @@ -0,0 +1,139 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE long +#define portLONG long +#define portSHORT int +#define portSTACK_TYPE uint16_t +#define portBASE_TYPE portSHORT + +typedef portSTACK_TYPE StackType_t; +typedef short BaseType_t; +typedef unsigned short UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Critical section handling. */ +#define portENTER_CRITICAL() __asm{ pushf } \ + __asm{ cli } \ + +#define portEXIT_CRITICAL() __asm{ popf } + +#define portDISABLE_INTERRUPTS() __asm{ cli } + +#define portENABLE_INTERRUPTS() __asm{ sti } +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portNOP() __asm{ nop } +#define portSTACK_GROWTH ( -1 ) +#define portSWITCH_INT_NUMBER 0x80 +#define portYIELD() __asm{ int portSWITCH_INT_NUMBER } +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 2 +#define portINITIAL_SW ( ( portSTACK_TYPE ) 0x0202 ) /* Start the tasks with interrupts enabled. */ +/*-----------------------------------------------------------*/ + +/* Compiler specifics. */ +#define portINPUT_BYTE( xAddr ) inp( xAddr ) +#define portOUTPUT_BYTE( xAddr, ucValue ) outp( xAddr, ucValue ) +#define portINPUT_WORD( xAddr ) inpw( xAddr ) +#define portOUTPUT_WORD( xAddr, usValue ) outpw( xAddr, usValue ) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vTaskFunction, vParameters ) void vTaskFunction( void *pvParameters ) +#define portTASK_FUNCTION( vTaskFunction, vParameters ) void vTaskFunction( void *pvParameters ) + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/BCC/16BitDOS/PC/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/BCC/16BitDOS/PC/port.c new file mode 100644 index 0000000..c7cbdf0 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/BCC/16BitDOS/PC/port.c @@ -0,0 +1,330 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* +Changes from V2.6.1 + + + Replaced the sUsingPreemption variable with the configUSE_PREEMPTION + macro to be consistent with the later ports. + +Changes from V4.0.1 + + + Add function prvSetTickFrequencyDefault() to set the DOS tick back to + its proper value when the scheduler exits. +*/ + +#include +#include +#include + +#include "FreeRTOS.h" +#include "task.h" +#include "portasm.h" + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the industrial + * PC port. + *----------------------------------------------------------*/ + +/*lint -e950 Non ANSI reserved words okay in this file only. */ + +#define portTIMER_INT_NUMBER 0x08 + +/* Setup hardware for required tick interrupt rate. */ +static void prvSetTickFrequency( uint32_t ulTickRateHz ); + +/* Restore hardware to as it was prior to starting the scheduler. */ +static void prvExitFunction( void ); + +/* Either chain to the DOS tick (which itself clears the PIC) or clear the PIC +directly. We chain to the DOS tick as close as possible to the standard DOS +tick rate. */ +static void prvPortResetPIC( void ); + +/* The ISR used depends on whether the preemptive or cooperative +scheduler is being used. */ +#if( configUSE_PREEMPTION == 1 ) + /* Tick service routine used by the scheduler when preemptive scheduling is + being used. */ + static void __interrupt __far prvPreemptiveTick( void ); +#else + /* Tick service routine used by the scheduler when cooperative scheduling is + being used. */ + static void __interrupt __far prvNonPreemptiveTick( void ); +#endif + +/* Trap routine used by taskYIELD() to manually cause a context switch. */ +static void __interrupt __far prvYieldProcessor( void ); + +/* Set the tick frequency back so the floppy drive works correctly when the +scheduler exits. */ +static void prvSetTickFrequencyDefault( void ); + +/*lint -e956 File scopes necessary here. */ + +/* Used to signal when to chain to the DOS tick, and when to just clear the PIC ourselves. */ +static int16_t sDOSTickCounter; + +/* Set true when the vectors are set so the scheduler will service the tick. */ +static BaseType_t xSchedulerRunning = pdFALSE; + +/* Points to the original routine installed on the vector we use for manual context switches. This is then used to restore the original routine during prvExitFunction(). */ +static void ( __interrupt __far *pxOldSwitchISR )(); + +/* Points to the original routine installed on the vector we use to chain to the DOS tick. This is then used to restore the original routine during prvExitFunction(). */ +static void ( __interrupt __far *pxOldSwitchISRPlus1 )(); + +/* Used to restore the original DOS context when the scheduler is ended. */ +static jmp_buf xJumpBuf; + +/*lint +e956 */ + +/*-----------------------------------------------------------*/ +BaseType_t xPortStartScheduler( void ) +{ +pxISR pxOriginalTickISR; + + /* This is called with interrupts already disabled. */ + + /* Remember what was on the interrupts we are going to use + so we can put them back later if required. */ + pxOldSwitchISR = _dos_getvect( portSWITCH_INT_NUMBER ); + pxOriginalTickISR = _dos_getvect( portTIMER_INT_NUMBER ); + pxOldSwitchISRPlus1 = _dos_getvect( portSWITCH_INT_NUMBER + 1 ); + + prvSetTickFrequency( configTICK_RATE_HZ ); + + /* Put our manual switch (yield) function on a known + vector. */ + _dos_setvect( portSWITCH_INT_NUMBER, prvYieldProcessor ); + + /* Put the old tick on a different interrupt number so we can + call it when we want. */ + _dos_setvect( portSWITCH_INT_NUMBER + 1, pxOriginalTickISR ); + + /* The ISR used depends on whether the preemptive or cooperative + scheduler is being used. */ + #if( configUSE_PREEMPTION == 1 ) + { + /* Put our tick switch function on the timer interrupt. */ + _dos_setvect( portTIMER_INT_NUMBER, prvPreemptiveTick ); + } + #else + { + /* We want the timer interrupt to just increment the tick count. */ + _dos_setvect( portTIMER_INT_NUMBER, prvNonPreemptiveTick ); + } + #endif + + /* Setup a counter that is used to call the DOS interrupt as close + to it's original frequency as can be achieved given our chosen tick + frequency. */ + sDOSTickCounter = portTICKS_PER_DOS_TICK; + + /* Clean up function if we want to return to DOS. */ + if( setjmp( xJumpBuf ) != 0 ) + { + prvExitFunction(); + xSchedulerRunning = pdFALSE; + } + else + { + xSchedulerRunning = pdTRUE; + + /* Kick off the scheduler by setting up the context of the first task. */ + portFIRST_CONTEXT(); + } + + return xSchedulerRunning; +} +/*-----------------------------------------------------------*/ + +/* The ISR used depends on whether the preemptive or cooperative +scheduler is being used. */ +#if( configUSE_PREEMPTION == 1 ) + static void __interrupt __far prvPreemptiveTick( void ) + { + /* Get the scheduler to update the task states following the tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Switch in the context of the next task to be run. */ + portSWITCH_CONTEXT(); + } + + /* Reset the PIC ready for the next time. */ + prvPortResetPIC(); + } +#else + static void __interrupt __far prvNonPreemptiveTick( void ) + { + /* Same as preemptive tick, but the cooperative scheduler is being used + so we don't have to switch in the context of the next task. */ + xTaskIncrementTick(); + prvPortResetPIC(); + } +#endif +/*-----------------------------------------------------------*/ + +static void __interrupt __far prvYieldProcessor( void ) +{ + /* Switch in the context of the next task to be run. */ + portSWITCH_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +static void prvPortResetPIC( void ) +{ + /* We are going to call the DOS tick interrupt at as close a + frequency to the normal DOS tick as possible. */ + + /* WE SHOULD NOT DO THIS IF YIELD WAS CALLED. */ + --sDOSTickCounter; + if( sDOSTickCounter <= 0 ) + { + sDOSTickCounter = ( int16_t ) portTICKS_PER_DOS_TICK; + __asm{ int portSWITCH_INT_NUMBER + 1 }; + } + else + { + /* Reset the PIC as the DOS tick is not being called to + do it. */ + __asm + { + mov al, 20H + out 20H, al + }; + } +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Jump back to the processor state prior to starting the + scheduler. This means we are not going to be using a + task stack frame so the task can be deleted. */ + longjmp( xJumpBuf, 1 ); +} +/*-----------------------------------------------------------*/ + +static void prvExitFunction( void ) +{ +void ( __interrupt __far *pxOriginalTickISR )(); + + /* Interrupts should be disabled here anyway - but no + harm in making sure. */ + portDISABLE_INTERRUPTS(); + if( xSchedulerRunning == pdTRUE ) + { + /* Set the DOS tick back onto the timer ticker. */ + pxOriginalTickISR = _dos_getvect( portSWITCH_INT_NUMBER + 1 ); + _dos_setvect( portTIMER_INT_NUMBER, pxOriginalTickISR ); + prvSetTickFrequencyDefault(); + + /* Put back the switch interrupt routines that was in place + before the scheduler started. */ + _dos_setvect( portSWITCH_INT_NUMBER, pxOldSwitchISR ); + _dos_setvect( portSWITCH_INT_NUMBER + 1, pxOldSwitchISRPlus1 ); + } + /* The tick timer is back how DOS wants it. We can re-enable + interrupts without the scheduler being called. */ + portENABLE_INTERRUPTS(); +} +/*-----------------------------------------------------------*/ + +static void prvSetTickFrequency( uint32_t ulTickRateHz ) +{ +const uint16_t usPIT_MODE = ( uint16_t ) 0x43; +const uint16_t usPIT0 = ( uint16_t ) 0x40; +const uint32_t ulPIT_CONST = ( uint32_t ) 1193180UL; +const uint16_t us8254_CTR0_MODE3 = ( uint16_t ) 0x36; +uint32_t ulOutput; + + /* Setup the 8245 to tick at the wanted frequency. */ + portOUTPUT_BYTE( usPIT_MODE, us8254_CTR0_MODE3 ); + ulOutput = ulPIT_CONST / ulTickRateHz; + portOUTPUT_BYTE( usPIT0, ( uint16_t )( ulOutput & ( uint32_t ) 0xff ) ); + ulOutput >>= 8; + portOUTPUT_BYTE( usPIT0, ( uint16_t ) ( ulOutput & ( uint32_t ) 0xff ) ); +} +/*-----------------------------------------------------------*/ + +static void prvSetTickFrequencyDefault( void ) +{ +const uint16_t usPIT_MODE = ( uint16_t ) 0x43; +const uint16_t usPIT0 = ( uint16_t ) 0x40; +const uint16_t us8254_CTR0_MODE3 = ( uint16_t ) 0x36; + + portOUTPUT_BYTE( usPIT_MODE, us8254_CTR0_MODE3 ); + portOUTPUT_BYTE( usPIT0,0 ); + portOUTPUT_BYTE( usPIT0,0 ); +} + + +/*lint +e950 */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/BCC/16BitDOS/PC/prtmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/BCC/16BitDOS/PC/prtmacro.h new file mode 100644 index 0000000..309d221 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/BCC/16BitDOS/PC/prtmacro.h @@ -0,0 +1,139 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT long +#define portDOUBLE long +#define portLONG long +#define portSHORT int +#define portSTACK_TYPE uint16_t +#define portBASE_TYPE portSHORT + +typedef portSTACK_TYPE StackType_t; +typedef short BaseType_t; +typedef unsigned short UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +#define portENTER_CRITICAL() __asm{ pushf } \ + __asm{ cli } \ + +#define portEXIT_CRITICAL() __asm{ popf } + +#define portDISABLE_INTERRUPTS() __asm{ cli } + +#define portENABLE_INTERRUPTS() __asm{ sti } +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portNOP() __asm{ nop } +#define portSTACK_GROWTH ( -1 ) +#define portSWITCH_INT_NUMBER 0x80 +#define portYIELD() __asm{ int portSWITCH_INT_NUMBER } +#define portDOS_TICK_RATE ( 18.20648 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portTICKS_PER_DOS_TICK ( ( uint16_t ) ( ( ( portDOUBLE ) configTICK_RATE_HZ / portDOS_TICK_RATE ) + 0.5 ) ) +#define portINITIAL_SW ( ( portSTACK_TYPE ) 0x0202 ) /* Start the tasks with interrupts enabled. */ +#define portBYTE_ALIGNMENT ( 2 ) +/*-----------------------------------------------------------*/ + +/* Compiler specifics. */ +#define portINPUT_BYTE( xAddr ) inp( xAddr ) +#define portOUTPUT_BYTE( xAddr, ucValue ) outp( xAddr, ucValue ) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vTaskFunction, pvParameters ) void vTaskFunction( void *pvParameters ) +#define portTASK_FUNCTION( vTaskFunction, pvParameters ) void vTaskFunction( void *pvParameters ) + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/BCC/16BitDOS/common/portasm.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/BCC/16BitDOS/common/portasm.h new file mode 100644 index 0000000..9036858 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/BCC/16BitDOS/common/portasm.h @@ -0,0 +1,129 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORT_ASM_H +#define PORT_ASM_H + +typedef void TCB_t; +extern volatile TCB_t * volatile pxCurrentTCB; +extern void vTaskSwitchContext( void ); + +/* + * Saves the stack pointer for one task into its TCB, calls + * vTaskSwitchContext() to update the TCB being used, then restores the stack + * from the new TCB read to run the task. + */ +void portSWITCH_CONTEXT( void ); + +/* + * Load the stack pointer from the TCB of the task which is going to be first + * to execute. Then force an IRET so the registers and IP are popped off the + * stack. + */ +void portFIRST_CONTEXT( void ); + +/* There are slightly different versions depending on whether you are building +to include debugger information. If debugger information is used then there +are a couple of extra bytes left of the ISR stack (presumably for use by the +debugger). The true stack pointer is then stored in the bp register. We add +2 to the stack pointer to remove the extra bytes before we restore our context. */ + +#define portSWITCH_CONTEXT() \ + asm { mov ax, seg pxCurrentTCB } \ + asm { mov ds, ax } \ + asm { les bx, pxCurrentTCB } /* Save the stack pointer into the TCB. */ \ + asm { mov es:0x2[ bx ], ss } \ + asm { mov es:[ bx ], sp } \ + asm { call far ptr vTaskSwitchContext } /* Perform the switch. */ \ + asm { mov ax, seg pxCurrentTCB } /* Restore the stack pointer from the TCB. */ \ + asm { mov ds, ax } \ + asm { les bx, dword ptr pxCurrentTCB } \ + asm { mov ss, es:[ bx + 2 ] } \ + asm { mov sp, es:[ bx ] } + +#define portFIRST_CONTEXT() \ + __asm { mov ax, seg pxCurrentTCB } \ + __asm { mov ds, ax } \ + __asm { les bx, dword ptr pxCurrentTCB } \ + __asm { mov ss, es:[ bx + 2 ] } \ + __asm { mov sp, es:[ bx ] } \ + __asm { pop bp } \ + __asm { pop di } \ + __asm { pop si } \ + __asm { pop ds } \ + __asm { pop es } \ + __asm { pop dx } \ + __asm { pop cx } \ + __asm { pop bx } \ + __asm { pop ax } \ + __asm { iret } + + +#endif + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/BCC/16BitDOS/common/portcomn.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/BCC/16BitDOS/common/portcomn.c new file mode 100644 index 0000000..ea1b9e2 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/BCC/16BitDOS/common/portcomn.c @@ -0,0 +1,162 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* +Changes from V1.00: + + + pxPortInitialiseStack() now initialises the stack of new tasks to the + same format used by the compiler. This allows the compiler generated + interrupt mechanism to be used for context switches. + +Changes from V2.6.1 + + + Move usPortCheckFreeStackSpace() to tasks.c. +*/ + + +#include +#include +#include "FreeRTOS.h" + +/*-----------------------------------------------------------*/ + +/* See header file for description. */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +StackType_t DS_Reg = 0; + + /* Place a few bytes of known values on the bottom of the stack. + This is just useful for debugging. */ + + *pxTopOfStack = 0x1111; + pxTopOfStack--; + *pxTopOfStack = 0x2222; + pxTopOfStack--; + *pxTopOfStack = 0x3333; + pxTopOfStack--; + *pxTopOfStack = 0x4444; + pxTopOfStack--; + *pxTopOfStack = 0x5555; + pxTopOfStack--; + + + /*lint -e950 -e611 -e923 Lint doesn't like this much - but nothing I can do about it. */ + + /* We are going to start the scheduler using a return from interrupt + instruction to load the program counter, so first there would be the + function call with parameters preamble. */ + + *pxTopOfStack = FP_SEG( pvParameters ); + pxTopOfStack--; + *pxTopOfStack = FP_OFF( pvParameters ); + pxTopOfStack--; + *pxTopOfStack = FP_SEG( pxCode ); + pxTopOfStack--; + *pxTopOfStack = FP_OFF( pxCode ); + pxTopOfStack--; + + /* Next the status register and interrupt return address. */ + *pxTopOfStack = portINITIAL_SW; + pxTopOfStack--; + *pxTopOfStack = FP_SEG( pxCode ); + pxTopOfStack--; + *pxTopOfStack = FP_OFF( pxCode ); + pxTopOfStack--; + + /* The remaining registers would be pushed on the stack by our context + switch function. These are loaded with values simply to make debugging + easier. */ + *pxTopOfStack = ( StackType_t ) 0xAAAA; /* AX */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xBBBB; /* BX */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xCCCC; /* CX */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xDDDD; /* DX */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xEEEE; /* ES */ + pxTopOfStack--; + + /* We need the true data segment. */ + __asm{ MOV DS_Reg, DS }; + + *pxTopOfStack = DS_Reg; /* DS */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x0123; /* SI */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xDDDD; /* DI */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xBBBB; /* BP */ + + /*lint +e950 +e611 +e923 */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CCS/ARM_CM4F/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CCS/ARM_CM4F/port.c new file mode 100644 index 0000000..631d68e --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CCS/ARM_CM4F/port.c @@ -0,0 +1,651 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the ARM CM4F port. + *----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#ifndef __TI_VFP_SUPPORT__ + #error This port can only be used when the project options are configured to enable hardware floating point support. +#endif + +#if configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 + #error configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html +#endif + +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#else + /* The way the SysTick is clocked is not modified in case it is not the same + as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 0 ) +#endif + +/* Constants required to manipulate the core. Registers first... */ +#define portNVIC_SYSTICK_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( * ( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( * ( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SYSPRI2_REG ( * ( ( volatile uint32_t * ) 0xe000ed20 ) ) +/* ...then bits in the registers. */ +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) + +#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( * ( ( volatile uint32_t * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */ +#define portVECTACTIVE_MASK ( 0xFFUL ) + +/* Constants required to manipulate the VFP. */ +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating point context control register. */ +#define portASPEN_AND_LSPEN_BITS ( 0x3UL << 30UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) +#define portINITIAL_EXEC_RETURN ( 0xfffffffd ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have +occurred while the SysTick counter is stopped during tickless idle +calculations. */ +#define portMISSED_COUNTS_FACTOR ( 45UL ) + +/* For strict compliance with the Cortex-M spec the task start address should +have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ +#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) + +/* Required to allow portasm.asm access the configMAX_SYSCALL_INTERRUPT_PRIORITY +setting. */ +const uint32_t ulMaxSyscallInterruptPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY; + +/* Each task maintains its own interrupt status in the critical nesting +variable. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortSysTickHandler( void ); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +extern void vPortStartFirstTask( void ); + +/* + * Turn the VFP on. + */ +extern void vPortEnableVFP( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* + * The number of SysTick increments that make up one tick period. + */ +#if configUSE_TICKLESS_IDLE == 1 + static uint32_t ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * The maximum number of tick periods that can be suppressed is limited by the + * 24 bit resolution of the SysTick timer. + */ +#if configUSE_TICKLESS_IDLE == 1 + static uint32_t xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Compensate for the CPU cycles that pass while the SysTick is stopped (low + * power functionality only. + */ +#if configUSE_TICKLESS_IDLE == 1 + static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static uint8_t ucMaxSysCallPriority = 0; + static uint32_t ulMaxPRIGROUPValue = 0; + static const volatile uint8_t * const pcInterruptPriorityRegisters = ( uint8_t * ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + interrupt. */ + + /* Offset added to account for the way the MCU uses the stack on entry/exit + of interrupts, and to ensure alignment. */ + pxTopOfStack--; + + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) prvTaskExitError; /* LR */ + + /* Save code space by skipping register initialisation. */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + + /* A save method is being used that requires each task to maintain its + own exec return value. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXEC_RETURN; + + pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + for( ;; ); +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + #if( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( uint8_t * ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + functions can be called. ISR safe functions are those that end in + "FromISR". FreeRTOS maintains separate thread and ISR API functions to + ensure interrupt entry is as fast and simple as possible. + + Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( uint8_t ) 0x01; + } + + /* Shift the priority group value back to its position within the AIRCR + register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* conifgASSERT_DEFINED */ + + /* Make PendSV and SysTick the lowest priority interrupts. */ + portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI; + portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Ensure the VFP is enabled - it should be anyway. */ + vPortEnableVFP(); + + /* Lazy save always. */ + *( portFPCCR ) |= portASPEN_AND_LSPEN_BITS; + + /* Start the first task. */ + vPortStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + assert() if it is being called from an interrupt context. Only API + functions that end in "FromISR" can be used in an interrupt. Only assert if + the critical nesting count is 1 to protect against recursive calls if the + assert function also uses a critical section. */ + if( uxCriticalNesting == 1 ) + { + configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + /* The SysTick runs at the lowest interrupt priority, so when this interrupt + executes all interrupts must be unmasked. There is therefore no need to + save and then restore the interrupt mask value as its value is already + known. */ + ( void ) portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* A context switch is required. Context switching is performed in + the PendSV interrupt. Pend the PendSV interrupt. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( 0 ); +} +/*-----------------------------------------------------------*/ + +#if configUSE_TICKLESS_IDLE == 1 + + #pragma WEAK( vPortSuppressTicksAndSleep ) + void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickCTRL; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Stop the SysTick momentarily. The time the SysTick is stopped for + is accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG &= ~portNVIC_SYSTICK_ENABLE_BIT; + + /* Calculate the reload value required to wait xExpectedIdleTime + tick periods. -1 is used because this code will execute part way + through one of the tick periods. */ + ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + method as that will mask interrupts that should exit sleep mode. */ + __asm( " cpsid i" ); + __asm( " dsb" ); + __asm( " isb" ); + + + /* If a context switch is pending or a task is waiting for the scheduler + to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Restart from whatever is left in the count register to complete + this tick period. */ + portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Reset the reload register to the value required for normal tick + periods. */ + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + + /* Re-enable interrupts - see comments above __disable_interrupt() + call above. */ + __asm( " cpsie i" ); + } + else + { + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + set its parameter to 0 to indicate that its implementation contains + its own wait for interrupt or wait for event instruction, and so wfi + should not be executed again. However, the original expected idle + time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + if( xModifiableIdleTime > 0 ) + { + __asm( " dsb" ); + __asm( " wfi" ); + __asm( " isb" ); + } + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Stop SysTick. Again, the time the SysTick is stopped for is + accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + ulSysTickCTRL = portNVIC_SYSTICK_CTRL_REG; + portNVIC_SYSTICK_CTRL_REG = ( ulSysTickCTRL & ~portNVIC_SYSTICK_ENABLE_BIT ); + + /* Re-enable interrupts - see comments above __disable_interrupt() + call above. */ + __asm( " cpsie i" ); + + if( ( ulSysTickCTRL & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt has already executed, and the SysTick + count reloaded with ulReloadValue. Reset the + portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick + period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + underflowed because the post sleep hook did something + that took too long. */ + if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* The tick interrupt handler will already have pended the tick + processing in the kernel. As the pending tick will be + processed as soon as this function exits, the tick value + maintained by the tick is stepped forward by one less than the + time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. + Work out how long the sleep lasted rounded to complete tick + periods (not the ulReload value which accounted for part + ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* How many complete tick periods passed while the processor + was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG + again, then set portNVIC_SYSTICK_LOAD_REG back to its standard + value. The critical section is used to ensure the tick interrupt + can only execute once in the case that the reload register is near + zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portENTER_CRITICAL(); + { + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + vTaskStepTick( ulCompleteTickPeriods ); + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + portEXIT_CRITICAL(); + } + } + +#endif /* #if configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +#pragma WEAK( vPortSetupTimerInterrupt ) +void vPortSetupTimerInterrupt( void ) +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if configUSE_TICKLESS_IDLE == 1 + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); +} +/*-----------------------------------------------------------*/ + +#if( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + extern uint32_t ulPortGetIPSR( void ); + uint32_t ulCurrentInterrupt; + uint8_t ucCurrentPriority; + + ulCurrentInterrupt = ulPortGetIPSR(); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + an interrupt that has been assigned a priority above + configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + function. ISR safe FreeRTOS API functions must *only* be called + from interrupts that have been assigned a priority at or below + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Numerically low interrupt priority numbers represent logically high + interrupt priorities, therefore the priority of the interrupt must + be set to a value equal to or numerically *higher* than + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Interrupts that use the FreeRTOS API must not be left at their + default priority of zero as that is the highest possible priority, + which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + and therefore also guaranteed to be invalid. + + FreeRTOS maintains separate thread and ISR API functions to ensure + interrupt entry is as fast and simple as possible. + + The following links provide detailed information: + http://www.freertos.org/RTOS-Cortex-M3-M4.html + http://www.freertos.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + that define each interrupt's priority to be split between bits that + define the interrupt's pre-emption priority bits and bits that define + the interrupt's sub-priority. For simplicity all bits must be defined + to be pre-emption priority bits. The following assertion will fail if + this is not the case (if some bits represent a sub-priority). + + If the application only uses CMSIS libraries for interrupt + configuration then the correct setting can be achieved on all Cortex-M + devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + scheduler. Note however that some vendor specific peripheral libraries + assume a non-zero priority group setting, in which cases using a value + of zero will result in unpredicable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ + + + + + + + + + + + + + + + + + + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CCS/ARM_CM4F/portasm.asm b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CCS/ARM_CM4F/portasm.asm new file mode 100644 index 0000000..a392583 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CCS/ARM_CM4F/portasm.asm @@ -0,0 +1,207 @@ +;/* +; FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. +; All rights reserved +; +; VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. +; +; This file is part of the FreeRTOS distribution. +; +; FreeRTOS is free software; you can redistribute it and/or modify it under +; the terms of the GNU General Public License (version 2) as published by the +; Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. +; +; *************************************************************************** +; >>! NOTE: The modification to the GPL is included to allow you to !<< +; >>! distribute a combined work that includes FreeRTOS without being !<< +; >>! obliged to provide the source code for proprietary components !<< +; >>! outside of the FreeRTOS kernel. !<< +; *************************************************************************** +; +; FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY +; WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +; FOR A PARTICULAR PURPOSE. Full license text is available on the following +; link: http://www.freertos.org/a00114.html +; +; *************************************************************************** +; * * +; * FreeRTOS provides completely free yet professionally developed, * +; * robust, strictly quality controlled, supported, and cross * +; * platform software that is more than just the market leader, it * +; * is the industry's de facto standard. * +; * * +; * Help yourself get started quickly while simultaneously helping * +; * to support the FreeRTOS project by purchasing a FreeRTOS * +; * tutorial book, reference manual, or both: * +; * http://www.FreeRTOS.org/Documentation * +; * * +; *************************************************************************** +; +; http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading +; the FAQ page "My application does not run, what could be wrong?". Have you +; defined configASSERT()? +; +; http://www.FreeRTOS.org/support - In return for receiving this top quality +; embedded software for free we request you assist our global community by +; participating in the support forum. +; +; http://www.FreeRTOS.org/training - Investing in training allows your team to +; be as productive as possible as early as possible. Now you can receive +; FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers +; Ltd, and the world's leading authority on the world's leading RTOS. +; +; http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, +; including FreeRTOS+Trace - an indispensable productivity tool, a DOS +; compatible FAT file system, and our tiny thread aware UDP/IP stack. +; +; http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. +; Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. +; +; http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High +; Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS +; licenses offer ticketed support, indemnification and commercial middleware. +; +; http://www.SafeRTOS.com - High Integrity Systems also provide a safety +; engineered and independently SIL3 certified version for use in safety and +; mission critical applications that require provable dependability. +; +; 1 tab == 4 spaces! +;*/ + + .thumb + + .ref pxCurrentTCB + .ref vTaskSwitchContext + .ref ulMaxSyscallInterruptPriority + + .def xPortPendSVHandler + .def ulPortGetIPSR + .def vPortSVCHandler + .def vPortStartFirstTask + .def vPortEnableVFP + +NVICOffsetConst: .word 0xE000ED08 +CPACRConst: .word 0xE000ED88 +pxCurrentTCBConst: .word pxCurrentTCB +ulMaxSyscallInterruptPriorityConst: .word ulMaxSyscallInterruptPriority + +; ----------------------------------------------------------- + + .align 4 +ulPortGetIPSR: .asmfunc + mrs r0, ipsr + bx r14 + .endasmfunc + ; ----------------------------------------------------------- + + .align 4 +vPortSetInterruptMask: .asmfunc + push {r0} + ldr r0, ulMaxSyscallInterruptPriorityConst + msr basepri, r0 + pop {r0} + bx r14 + .endasmfunc +; ----------------------------------------------------------- + + .align 4 +xPortPendSVHandler: .asmfunc + mrs r0, psp + isb + + ;/* Get the location of the current TCB. */ + ldr r3, pxCurrentTCBConst + ldr r2, [r3] + + ;/* Is the task using the FPU context? If so, push high vfp registers. */ + tst r14, #0x10 + it eq + vstmdbeq r0!, {s16-s31} + + ;/* Save the core registers. */ + stmdb r0!, {r4-r11, r14} + + ;/* Save the new top of stack into the first member of the TCB. */ + str r0, [r2] + + stmdb sp!, {r3} + ldr r0, ulMaxSyscallInterruptPriorityConst + ldr r1, [r0] + msr basepri, r1 + dsb + isb + bl vTaskSwitchContext + mov r0, #0 + msr basepri, r0 + ldmia sp!, {r3} + + ;/* The first item in pxCurrentTCB is the task top of stack. */ + ldr r1, [r3] + ldr r0, [r1] + + ;/* Pop the core registers. */ + ldmia r0!, {r4-r11, r14} + + ;/* Is the task using the FPU context? If so, pop the high vfp registers + ;too. */ + tst r14, #0x10 + it eq + vldmiaeq r0!, {s16-s31} + + msr psp, r0 + isb + bx r14 + .endasmfunc + +; ----------------------------------------------------------- + + .align 4 +vPortSVCHandler: .asmfunc + ;/* Get the location of the current TCB. */ + ldr r3, pxCurrentTCBConst + ldr r1, [r3] + ldr r0, [r1] + ;/* Pop the core registers. */ + ldmia r0!, {r4-r11, r14} + msr psp, r0 + isb + mov r0, #0 + msr basepri, r0 + bx r14 + .endasmfunc + +; ----------------------------------------------------------- + + .align 4 +vPortStartFirstTask: .asmfunc + ;/* Use the NVIC offset register to locate the stack. */ + ldr r0, NVICOffsetConst + ldr r0, [r0] + ldr r0, [r0] + ;/* Set the msp back to the start of the stack. */ + msr msp, r0 + ;/* Call SVC to start the first task. */ + cpsie i + cpsie f + dsb + isb + svc #0 + .endasmfunc + +; ----------------------------------------------------------- + + .align 4 +vPortEnableVFP: .asmfunc + ;/* The FPU enable bits are in the CPACR. */ + ldr.w r0, CPACRConst + ldr r1, [r0] + + ;/* Enable CP10 and CP11 coprocessors, then save back. */ + orr r1, r1, #( 0xf << 20 ) + str r1, [r0] + bx r14 + .endasmfunc + + .end + +; ----------------------------------------------------------- + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CCS/ARM_CM4F/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CCS/ARM_CM4F/portmacro.h new file mode 100644 index 0000000..47302ca --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CCS/ARM_CM4F/portmacro.h @@ -0,0 +1,207 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +/*-----------------------------------------------------------*/ + +/* Scheduler utilities. */ +#define portYIELD() \ +{ \ + /* Set a PendSV to request a context switch. */ \ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ + __asm( " dsb" ); \ + __asm( " isb" ); \ +} + +#define portNVIC_INT_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed04 ) ) +#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) +#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired != pdFALSE ) portYIELD() +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) + +/*-----------------------------------------------------------*/ + +/* Architecture specific optimisations. */ +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31 - __clz( ( uxReadyPriorities ) ) ) + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); + +#define portDISABLE_INTERRUPTS() \ +{ \ + _set_interrupt_priority( configMAX_SYSCALL_INTERRUPT_PRIORITY ); \ + __asm( " dsb" ); \ + __asm( " isb" ); \ +} + +#define portENABLE_INTERRUPTS() _set_interrupt_priority( 0 ) +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() +#define portSET_INTERRUPT_MASK_FROM_ISR() _set_interrupt_priority( configMAX_SYSCALL_INTERRUPT_PRIORITY ); __asm( " dsb" ); __asm( " isb" ) +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) _set_interrupt_priority( x ) +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ +#ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) +#endif + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are +not necessary for to use this port. They are defined so the common demo files +(which build with all the ports) will build. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*-----------------------------------------------------------*/ + +#ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() +#endif + +/* portNOP() is not required by this port. */ +#define portNOP() + +/*-----------------------------------------------------------*/ + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CCS/ARM_Cortex-R4/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CCS/ARM_Cortex-R4/port.c new file mode 100644 index 0000000..e031797 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CCS/ARM_Cortex-R4/port.c @@ -0,0 +1,354 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* FreeRTOS includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/*-----------------------------------------------------------*/ + +/* Count of the critical section nesting depth. */ +uint32_t ulCriticalNesting = 9999; + +/*-----------------------------------------------------------*/ + +/* Registers required to configure the RTI. */ +#define portRTI_GCTRL_REG ( * ( ( volatile uint32_t * ) 0xFFFFFC00 ) ) +#define portRTI_TBCTRL_REG ( * ( ( volatile uint32_t * ) 0xFFFFFC04 ) ) +#define portRTI_COMPCTRL_REG ( * ( ( volatile uint32_t * ) 0xFFFFFC0C ) ) +#define portRTI_CNT0_FRC0_REG ( * ( ( volatile uint32_t * ) 0xFFFFFC10 ) ) +#define portRTI_CNT0_UC0_REG ( * ( ( volatile uint32_t * ) 0xFFFFFC14 ) ) +#define portRTI_CNT0_CPUC0_REG ( * ( ( volatile uint32_t * ) 0xFFFFFC18 ) ) +#define portRTI_CNT0_COMP0_REG ( * ( ( volatile uint32_t * ) 0xFFFFFC50 ) ) +#define portRTI_CNT0_UDCP0_REG ( * ( ( volatile uint32_t * ) 0xFFFFFC54 ) ) +#define portRTI_SETINTENA_REG ( * ( ( volatile uint32_t * ) 0xFFFFFC80 ) ) +#define portRTI_CLEARINTENA_REG ( * ( ( volatile uint32_t * ) 0xFFFFFC84 ) ) +#define portRTI_INTFLAG_REG ( * ( ( volatile uint32_t * ) 0xFFFFFC88 ) ) + + +/* Constants required to set up the initial stack of each task. */ +#define portINITIAL_SPSR ( ( StackType_t ) 0x1F ) +#define portINITIAL_FPSCR ( ( StackType_t ) 0x00 ) +#define portINSTRUCTION_SIZE ( ( StackType_t ) 0x04 ) +#define portTHUMB_MODE_BIT ( ( StackType_t ) 0x20 ) + +/* The number of words on the stack frame between the saved Top Of Stack and +R0 (in which the parameters are passed. */ +#define portSPACE_BETWEEN_TOS_AND_PARAMETERS ( 12 ) + +/*-----------------------------------------------------------*/ + +/* vPortStartFirstSTask() is defined in portASM.asm */ +extern void vPortStartFirstTask( void ); + +/*-----------------------------------------------------------*/ + +/* Saved as part of the task context. Set to pdFALSE if the task does not +require an FPU context. */ +uint32_t ulTaskHasFPUContext = 0; + +/*-----------------------------------------------------------*/ + + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +StackType_t *pxOriginalTOS; + + pxOriginalTOS = pxTopOfStack; + + #if __TI_VFP_SUPPORT__ + { + /* Ensure the stack is correctly aligned on exit. */ + pxTopOfStack--; + } + #endif + + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. */ + + /* First on the stack is the return address - which is the start of the as + the task has not executed yet. The offset is added to make the return + address appear as it would within an IRQ ISR. */ + *pxTopOfStack = ( StackType_t ) pxCode + portINSTRUCTION_SIZE; + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) 0x00000000; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxOriginalTOS; /* Stack used when task starts goes in R13. */ + pxTopOfStack--; + + #ifdef portPRELOAD_TASK_REGISTERS + { + *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */ + pxTopOfStack--; + } + #else + { + pxTopOfStack -= portSPACE_BETWEEN_TOS_AND_PARAMETERS; + } + #endif + + /* Function parameters are passed in R0. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + + /* Set the status register for system mode, with interrupts enabled. */ + *pxTopOfStack = ( StackType_t ) ( ( _get_CPSR() & ~0xFF ) | portINITIAL_SPSR ); + + if( ( ( uint32_t ) pxCode & 0x01UL ) != 0x00 ) + { + /* The task will start in thumb mode. */ + *pxTopOfStack |= portTHUMB_MODE_BIT; + } + + #ifdef __TI_VFP_SUPPORT__ + { + pxTopOfStack--; + + /* The last thing on the stack is the tasks ulUsingFPU value, which by + default is set to indicate that the stack frame does not include FPU + registers. */ + *pxTopOfStack = pdFALSE; + } + #endif + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt(void) +{ + /* Disable timer 0. */ + portRTI_GCTRL_REG &= 0xFFFFFFFEUL; + + /* Use the internal counter. */ + portRTI_TBCTRL_REG = 0x00000000U; + + /* COMPSEL0 will use the RTIFRC0 counter. */ + portRTI_COMPCTRL_REG = 0x00000000U; + + /* Initialise the counter and the prescale counter registers. */ + portRTI_CNT0_UC0_REG = 0x00000000U; + portRTI_CNT0_FRC0_REG = 0x00000000U; + + /* Set Prescalar for RTI clock. */ + portRTI_CNT0_CPUC0_REG = 0x00000001U; + portRTI_CNT0_COMP0_REG = ( configCPU_CLOCK_HZ / 2 ) / configTICK_RATE_HZ; + portRTI_CNT0_UDCP0_REG = ( configCPU_CLOCK_HZ / 2 ) / configTICK_RATE_HZ; + + /* Clear interrupts. */ + portRTI_INTFLAG_REG = 0x0007000FU; + portRTI_CLEARINTENA_REG = 0x00070F0FU; + + /* Enable the compare 0 interrupt. */ + portRTI_SETINTENA_REG = 0x00000001U; + portRTI_GCTRL_REG |= 0x00000001U; +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler(void) +{ + /* Start the timer that generates the tick ISR. */ + prvSetupTimerInterrupt(); + + /* Reset the critical section nesting count read to execute the first task. */ + ulCriticalNesting = 0; + + /* Start the first task. This is done from portASM.asm as ARM mode must be + used. */ + vPortStartFirstTask(); + + /* Should not get here! */ + return pdFAIL; +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +void vPortEndScheduler(void) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( ulCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +#if configUSE_PREEMPTION == 0 + + /* The cooperative scheduler requires a normal IRQ service routine to + * simply increment the system tick. */ + __interrupt void vPortNonPreemptiveTick( void ) + { + /* clear clock interrupt flag */ + portRTI_INTFLAG_REG = 0x00000001; + + /* Increment the tick count - this may make a delaying task ready + to run - but a context switch is not performed. */ + xTaskIncrementTick(); + } + + #else + + /* + ************************************************************************** + * The preemptive scheduler ISR is written in assembler and can be found + * in the portASM.asm file. This will only get used if portUSE_PREEMPTION + * is set to 1 in portmacro.h + ************************************************************************** + */ + void vPortPreemptiveTick( void ); + +#endif +/*-----------------------------------------------------------*/ + + +/* + * Disable interrupts, and keep a count of the nesting depth. + */ +void vPortEnterCritical( void ) +{ + /* Disable interrupts as per portDISABLE_INTERRUPTS(); */ + portDISABLE_INTERRUPTS(); + + /* Now interrupts are disabled ulCriticalNesting can be accessed + directly. Increment ulCriticalNesting to keep a count of how many times + portENTER_CRITICAL() has been called. */ + ulCriticalNesting++; +} +/*-----------------------------------------------------------*/ + +/* + * Decrement the critical nesting count, and if it has reached zero, re-enable + * interrupts. + */ +void vPortExitCritical( void ) +{ + if( ulCriticalNesting > 0 ) + { + /* Decrement the nesting count as we are leaving a critical section. */ + ulCriticalNesting--; + + /* If the nesting level has reached zero then interrupts should be + re-enabled. */ + if( ulCriticalNesting == 0 ) + { + /* Enable interrupts as per portENABLE_INTERRUPTS(). */ + portENABLE_INTERRUPTS(); + } + } +} +/*-----------------------------------------------------------*/ + +#if __TI_VFP_SUPPORT__ + + void vPortTaskUsesFPU( void ) + { + extern void vPortInitialiseFPSCR( void ); + + /* A task is registering the fact that it needs an FPU context. Set the + FPU flag (saved as part of the task context. */ + ulTaskHasFPUContext = pdTRUE; + + /* Initialise the floating point status register. */ + vPortInitialiseFPSCR(); + } + +#endif /* __TI_VFP_SUPPORT__ */ + +/*-----------------------------------------------------------*/ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CCS/ARM_Cortex-R4/portASM.asm b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CCS/ARM_Cortex-R4/portASM.asm new file mode 100644 index 0000000..ffa91ff --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CCS/ARM_Cortex-R4/portASM.asm @@ -0,0 +1,256 @@ +;/* +; FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. +; All rights reserved +; +; +; *************************************************************************** +; * * +; * FreeRTOS tutorial books are available in pdf and paperback. * +; * Complete, revised, and edited pdf reference manuals are also * +; * available. * +; * * +; * Purchasing FreeRTOS documentation will not only help you, by * +; * ensuring you get running as quickly as possible and with an * +; * in-depth knowledge of how to use FreeRTOS, it will also help * +; * the FreeRTOS project to continue with its mission of providing * +; * professional grade, cross platform, de facto standard solutions * +; * for microcontrollers - completely free of charge! * +; * * +; * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * +; * * +; * Thank you for using FreeRTOS, and thank you for your support! * +; * * +; *************************************************************************** +; +; +; This file is part of the FreeRTOS distribution. +; +; FreeRTOS is free software; you can redistribute it and/or modify it under +; the terms of the GNU General Public License (version 2) as published by the +; Free Software Foundation AND MODIFIED BY the FreeRTOS exception. +; >>>NOTE<<< The modification to the GPL is included to allow you to +; distribute a combined work that includes FreeRTOS without being obliged to +; provide the source code for proprietary components outside of the FreeRTOS +; kernel. FreeRTOS is distributed in the hope that it will be useful, but +; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +; more details. You should have received a copy of the GNU General Public +; License and the FreeRTOS license exception along with FreeRTOS; if not it +; can be viewed here: http://www.freertos.org/a00114.html and also obtained +; by writing to Richard Barry, contact details for whom are available on the +; FreeRTOS WEB site. +; +; 1 tab == 4 spaces! +; +; http://www.FreeRTOS.org - Documentation, latest information, license and +; contact details. +; +; http://www.SafeRTOS.com - A version that is certified for use in safety +; critical systems. +; +; http://www.OpenRTOS.com - Commercial support, development, porting, +; licensing and training services. +;*/ + + .text + .arm + .ref vTaskSwitchContext + .ref xTaskIncrementTick + .ref ulTaskHasFPUContext + .ref pxCurrentTCB + +;/*-----------------------------------------------------------*/ +; +; Save Task Context +; +portSAVE_CONTEXT .macro + DSB + + ; Push R0 as we are going to use it + STMDB SP!, {R0} + + ; Set R0 to point to the task stack pointer. + STMDB SP,{SP}^ + SUB SP, SP, #4 + LDMIA SP!,{R0} + + ; Push the return address onto the stack. + STMDB R0!, {LR} + + ; Now LR has been saved, it can be used instead of R0. + MOV LR, R0 + + ; Pop R0 so it can be saved onto the task stack. + LDMIA SP!, {R0} + + ; Push all the system mode registers onto the task stack. + STMDB LR,{R0-LR}^ + SUB LR, LR, #60 + + ; Push the SPSR onto the task stack. + MRS R0, SPSR + STMDB LR!, {R0} + + .if (__TI_VFP_SUPPORT__) + ;Determine if the task maintains an FPU context. + LDR R0, ulFPUContextConst + LDR R0, [R0] + + ; Test the flag + CMP R0, #0 + + ; If the task is not using a floating point context then skip the + ; saving of the FPU registers. + BEQ $+16 + FSTMDBD LR!, {D0-D15} + FMRX R1, FPSCR + STMFD LR!, {R1} + + ; Save the flag + STMDB LR!, {R0} + .endif + + ; Store the new top of stack for the task. + LDR R0, pxCurrentTCBConst + LDR R0, [R0] + STR LR, [R0] + + .endm + +;/*-----------------------------------------------------------*/ +; +; Restore Task Context +; +portRESTORE_CONTEXT .macro + LDR R0, pxCurrentTCBConst + LDR R0, [R0] + LDR LR, [R0] + + .if (__TI_VFP_SUPPORT__) + ; The floating point context flag is the first thing on the stack. + LDR R0, ulFPUContextConst + LDMFD LR!, {R1} + STR R1, [R0] + + ; Test the flag + CMP R1, #0 + + ; If the task is not using a floating point context then skip the + ; VFP register loads. + BEQ $+16 + + ; Restore the floating point context. + LDMFD LR!, {R0} + FLDMIAD LR!, {D0-D15} + FMXR FPSCR, R0 + .endif + + ; Get the SPSR from the stack. + LDMFD LR!, {R0} + MSR SPSR_CSXF, R0 + + ; Restore all system mode registers for the task. + LDMFD LR, {R0-R14}^ + + ; Restore the return address. + LDR LR, [LR, #+60] + + ; And return - correcting the offset in the LR to obtain the + ; correct address. + SUBS PC, LR, #4 + .endm + +;/*-----------------------------------------------------------*/ +; Start the first task by restoring its context. + + .def vPortStartFirstTask + +vPortStartFirstTask: + portRESTORE_CONTEXT + +;/*-----------------------------------------------------------*/ +; Yield to another task. + + .def vPortYieldProcessor + +vPortYieldProcessor: + ; Within an IRQ ISR the link register has an offset from the true return + ; address. SWI doesn't do this. Add the offset manually so the ISR + ; return code can be used. + ADD LR, LR, #4 + + ; First save the context of the current task. + portSAVE_CONTEXT + + ; Select the next task to execute. */ + BL vTaskSwitchContext + + ; Restore the context of the task selected to execute. + portRESTORE_CONTEXT + +;/*-----------------------------------------------------------*/ +; Yield to another task from within the FreeRTOS API + + .def vPortYeildWithinAPI + +vPortYeildWithinAPI: + ; Save the context of the current task. + + portSAVE_CONTEXT + ; Clear SSI flag. + MOVW R0, #0xFFF4 + MOVT R0, #0xFFFF + LDR R0, [R0] + + ; Select the next task to execute. */ + BL vTaskSwitchContext + + ; Restore the context of the task selected to execute. + portRESTORE_CONTEXT + +;/*-----------------------------------------------------------*/ +; Preemptive Tick + + .def vPortPreemptiveTick + +vPortPreemptiveTick: + + ; Save the context of the current task. + portSAVE_CONTEXT + + ; Clear interrupt flag + MOVW R0, #0xFC88 + MOVT R0, #0xFFFF + MOV R1, #1 + STR R1, [R0] + + ; Increment the tick count, making any adjustments to the blocked lists + ; that may be necessary. + BL xTaskIncrementTick + + ; Select the next task to execute. + CMP R0, #0 + BLNE vTaskSwitchContext + + ; Restore the context of the task selected to execute. + portRESTORE_CONTEXT + +;------------------------------------------------------------------------------- + + .if (__TI_VFP_SUPPORT__) + + .def vPortInitialiseFPSCR + +vPortInitialiseFPSCR: + + MOV R0, #0 + FMXR FPSCR, R0 + BX LR + + .endif ;__TI_VFP_SUPPORT__ + + +pxCurrentTCBConst .word pxCurrentTCB +ulFPUContextConst .word ulTaskHasFPUContext +;------------------------------------------------------------------------------- + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CCS/ARM_Cortex-R4/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CCS/ARM_Cortex-R4/portmacro.h new file mode 100644 index 0000000..11013b8 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CCS/ARM_Cortex-R4/portmacro.h @@ -0,0 +1,159 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef __PORTMACRO_H__ +#define __PORTMACRO_H__ + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if (configUSE_16_BIT_TICKS == 1) + typedef uint16_t TickType_t; + #define portMAX_DELAY (TickType_t) 0xFFFF +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY (TickType_t) 0xFFFFFFFFF + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif + + +/* Architecture specifics. */ +#define portSTACK_GROWTH (-1) +#define portTICK_PERIOD_MS ((TickType_t) 1000 / configTICK_RATE_HZ) +#define portBYTE_ALIGNMENT 8 + +/* Critical section handling. */ +extern void vPortEnterCritical(void); +extern void vPortExitCritical(void); +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() +#define portDISABLE_INTERRUPTS() asm( " CPSID I" ) +#define portENABLE_INTERRUPTS() asm( " CPSIE I" ) + +/* Scheduler utilities. */ +#pragma SWI_ALIAS( vPortYield, 0 ) +extern void vPortYield( void ); +#define portYIELD() vPortYield() +#define portSYS_SSIR1_REG ( * ( ( volatile uint32_t * ) 0xFFFFFFB0 ) ) +#define portSYS_SSIR1_SSKEY ( 0x7500UL ) +#define portYIELD_WITHIN_API() { portSYS_SSIR1_REG = portSYS_SSIR1_SSKEY; asm( " DSB " ); asm( " ISB " ); } +#define portYIELD_FROM_ISR( x ) if( x != pdFALSE ){ portSYS_SSIR1_REG = portSYS_SSIR1_SSKEY; ( void ) portSYS_SSIR1_REG; } + +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +/* Architecture specific optimisations. */ +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31 - __clz( ( uxReadyPriorities ) ) ) + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION(vFunction, pvParameters) void vFunction(void *pvParameters) +#define portTASK_FUNCTION_PROTO(vFunction, pvParameters) void vFunction(void *pvParameters) + +#endif /* __PORTMACRO_H__ */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CCS/MSP430X/data_model.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CCS/MSP430X/data_model.h new file mode 100644 index 0000000..b6081e9 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CCS/MSP430X/data_model.h @@ -0,0 +1,80 @@ +;/* +; FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. +; All rights reserved +; +; +; *************************************************************************** +; * * +; * FreeRTOS tutorial books are available in pdf and paperback. * +; * Complete, revised, and edited pdf reference manuals are also * +; * available. * +; * * +; * Purchasing FreeRTOS documentation will not only help you, by * +; * ensuring you get running as quickly as possible and with an * +; * in-depth knowledge of how to use FreeRTOS, it will also help * +; * the FreeRTOS project to continue with its mission of providing * +; * professional grade, cross platform, de facto standard solutions * +; * for microcontrollers - completely free of charge! * +; * * +; * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * +; * * +; * Thank you for using FreeRTOS, and thank you for your support! * +; * * +; *************************************************************************** +; +; +; This file is part of the FreeRTOS distribution. +; +; FreeRTOS is free software; you can redistribute it and/or modify it under +; the terms of the GNU General Public License (version 2) as published by the +; Free Software Foundation AND MODIFIED BY the FreeRTOS exception. +; >>>NOTE<<< The modification to the GPL is included to allow you to +; distribute a combined work that includes FreeRTOS without being obliged to +; provide the source code for proprietary components outside of the FreeRTOS +; kernel. FreeRTOS is distributed in the hope that it will be useful, but +; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +; more details. You should have received a copy of the GNU General Public +; License and the FreeRTOS license exception along with FreeRTOS; if not it +; can be viewed here: http://www.freertos.org/a00114.html and also obtained +; by writing to Richard Barry, contact details for whom are available on the +; FreeRTOS WEB site. +; +; 1 tab == 4 spaces! +; +; http://www.FreeRTOS.org - Documentation, latest information, license and +; contact details. +; +; http://www.SafeRTOS.com - A version that is certified for use in safety +; critical systems. +; +; http://www.OpenRTOS.com - Commercial support, development, porting, +; licensing and training services. +;*/ + + .if $DEFINED( __LARGE_DATA_MODEL__ ) + .define "pushm.a", pushm_x + .define "popm.a", popm_x + .define "push.a", push_x + .define "pop.a", pop_x + .define "mov.a", mov_x + .else + .define "pushm.w", pushm_x + .define "popm.w", popm_x + .define "push.w", push_x + .define "pop.w", pop_x + .define "mov.w", mov_x + .endif + + .if $DEFINED( __LARGE_CODE_MODEL__ ) + .define "calla", call_x + .define "reta", ret_x + .else + .define "call", call_x + .define "ret", ret_x + .endif + + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CCS/MSP430X/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CCS/MSP430X/port.c new file mode 100644 index 0000000..4b25c69 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CCS/MSP430X/port.c @@ -0,0 +1,229 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the MSP430X port. + *----------------------------------------------------------*/ + +/* Constants required for hardware setup. The tick ISR runs off the ACLK, +not the MCLK. */ +#define portACLK_FREQUENCY_HZ ( ( TickType_t ) 32768 ) +#define portINITIAL_CRITICAL_NESTING ( ( uint16_t ) 10 ) +#define portFLAGS_INT_ENABLED ( ( StackType_t ) 0x08 ) + +/* We require the address of the pxCurrentTCB variable, but don't want to know +any details of its type. */ +typedef void TCB_t; +extern volatile TCB_t * volatile pxCurrentTCB; + +/* Each task maintains a count of the critical section nesting depth. Each +time a critical section is entered the count is incremented. Each time a +critical section is exited the count is decremented - with interrupts only +being re-enabled if the count is zero. + +usCriticalNesting will get set to zero when the scheduler starts, but must +not be initialised to zero as this will cause problems during the startup +sequence. */ +volatile uint16_t usCriticalNesting = portINITIAL_CRITICAL_NESTING; +/*-----------------------------------------------------------*/ + + +/* + * Sets up the periodic ISR used for the RTOS tick. This uses timer 0, but + * could have alternatively used the watchdog timer or timer 1. + */ +void vPortSetupTimerInterrupt( void ); +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been called. + * + * See the header file portable.h. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +uint16_t *pusTopOfStack; +uint32_t *pulTopOfStack, ulTemp; + + /* + Place a few bytes of known values on the bottom of the stack. + This is just useful for debugging and can be included if required. + + *pxTopOfStack = ( StackType_t ) 0x1111; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x2222; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x3333; + pxTopOfStack--; + */ + + /* Data types are need either 16 bits or 32 bits depending on the data + and code model used. */ + if( sizeof( pxCode ) == sizeof( uint16_t ) ) + { + pusTopOfStack = ( uint16_t * ) pxTopOfStack; + ulTemp = ( uint32_t ) pxCode; + *pusTopOfStack = ( uint16_t ) ulTemp; + } + else + { + /* Make room for a 20 bit value stored as a 32 bit value. */ + pusTopOfStack = ( uint16_t * ) pxTopOfStack; + pusTopOfStack--; + pulTopOfStack = ( uint32_t * ) pusTopOfStack; + *pulTopOfStack = ( uint32_t ) pxCode; + } + + pusTopOfStack--; + *pusTopOfStack = portFLAGS_INT_ENABLED; + pusTopOfStack -= ( sizeof( StackType_t ) / 2 ); + + /* From here on the size of stacked items depends on the memory model. */ + pxTopOfStack = ( StackType_t * ) pusTopOfStack; + + /* Next the general purpose registers. */ + #ifdef PRELOAD_REGISTER_VALUES + *pxTopOfStack = ( StackType_t ) 0xffff; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xeeee; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xdddd; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xbbbb; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xaaaa; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x9999; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x8888; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x5555; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x6666; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x5555; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x4444; + pxTopOfStack--; + #else + pxTopOfStack -= 3; + *pxTopOfStack = ( StackType_t ) pvParameters; + pxTopOfStack -= 9; + #endif + + /* A variable is used to keep track of the critical section nesting. + This variable has to be stored as part of the task context and is + initially set to zero. */ + *pxTopOfStack = ( StackType_t ) portNO_CRITICAL_SECTION_NESTING; + + /* Return a pointer to the top of the stack we have generated so this can + be stored in the task control block for the task. */ + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the MSP430 port will get stopped. If required simply + disable the tick interrupt here. */ +} +/*-----------------------------------------------------------*/ + +/* + * Hardware initialisation to generate the RTOS tick. + */ +void vPortSetupTimerInterrupt( void ) +{ + vApplicationSetupTimerInterrupt(); +} +/*-----------------------------------------------------------*/ + +#pragma vector=configTICK_VECTOR +interrupt void vTickISREntry( void ) +{ +extern void vPortTickISR( void ); + + __bic_SR_register_on_exit( SCG1 + SCG0 + OSCOFF + CPUOFF ); + #if configUSE_PREEMPTION == 1 + extern void vPortPreemptiveTickISR( void ); + vPortPreemptiveTickISR(); + #else + extern void vPortCooperativeTickISR( void ); + vPortCooperativeTickISR(); + #endif +} + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CCS/MSP430X/portext.asm b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CCS/MSP430X/portext.asm new file mode 100644 index 0000000..432069b --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CCS/MSP430X/portext.asm @@ -0,0 +1,187 @@ +; +;/* +; FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. +; All rights reserved +; +; +; *************************************************************************** +; * * +; * FreeRTOS tutorial books are available in pdf and paperback. * +; * Complete, revised, and edited pdf reference manuals are also * +; * available. * +; * * +; * Purchasing FreeRTOS documentation will not only help you, by * +; * ensuring you get running as quickly as possible and with an * +; * in-depth knowledge of how to use FreeRTOS, it will also help * +; * the FreeRTOS project to continue with its mission of providing * +; * professional grade, cross platform, de facto standard solutions * +; * for microcontrollers - completely free of charge! * +; * * +; * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * +; * * +; * Thank you for using FreeRTOS, and thank you for your support! * +; * * +; *************************************************************************** +; +; +; This file is part of the FreeRTOS distribution. +; +; FreeRTOS is free software; you can redistribute it and/or modify it under +; the terms of the GNU General Public License (version 2) as published by the +; Free Software Foundation AND MODIFIED BY the FreeRTOS exception. +; >>>NOTE<<< The modification to the GPL is included to allow you to +; distribute a combined work that includes FreeRTOS without being obliged to +; provide the source code for proprietary components outside of the FreeRTOS +; kernel. FreeRTOS is distributed in the hope that it will be useful, but +; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +; more details. You should have received a copy of the GNU General Public +; License and the FreeRTOS license exception along with FreeRTOS; if not it +; can be viewed here: http://www.freertos.org/a00114.html and also obtained +; by writing to Richard Barry, contact details for whom are available on the +; FreeRTOS WEB site. +; +; 1 tab == 4 spaces! +; +; http://www.FreeRTOS.org - Documentation, latest information, license and +; contact details. +; +; http://www.SafeRTOS.com - A version that is certified for use in safety +; critical systems. +; +; http://www.OpenRTOS.com - Commercial support, development, porting, +; licensing and training services. +;*/ + +; * The definition of the "register test" tasks, as described at the top of +; * main.c + + .include data_model.h + + .global xTaskIncrementTick + .global vTaskSwitchContext + .global vPortSetupTimerInterrupt + .global pxCurrentTCB + .global usCriticalNesting + + .def vPortPreemptiveTickISR + .def vPortCooperativeTickISR + .def vPortYield + .def xPortStartScheduler + +;----------------------------------------------------------- + +portSAVE_CONTEXT .macro + + ;Save the remaining registers. + pushm_x #12, r15 + mov.w &usCriticalNesting, r14 + push_x r14 + mov_x &pxCurrentTCB, r12 + mov_x sp, 0( r12 ) + .endm +;----------------------------------------------------------- + +portRESTORE_CONTEXT .macro + + mov_x &pxCurrentTCB, r12 + mov_x @r12, sp + pop_x r15 + mov.w r15, &usCriticalNesting + popm_x #12, r15 + nop + pop.w sr + nop + ret_x + .endm +;----------------------------------------------------------- + +;* +;* The RTOS tick ISR. +;* +;* If the cooperative scheduler is in use this simply increments the tick +;* count. +;* +;* If the preemptive scheduler is in use a context switch can also occur. +;*/ + + .text + .align 2 + +vPortPreemptiveTickISR: .asmfunc + + ; The sr is not saved in portSAVE_CONTEXT() because vPortYield() needs + ;to save it manually before it gets modified (interrupts get disabled). + push.w sr + portSAVE_CONTEXT + + call_x #xTaskIncrementTick + call_x #vTaskSwitchContext + + portRESTORE_CONTEXT + .endasmfunc +;----------------------------------------------------------- + + .align 2 + +vPortCooperativeTickISR: .asmfunc + + ; The sr is not saved in portSAVE_CONTEXT() because vPortYield() needs + ;to save it manually before it gets modified (interrupts get disabled). + push.w sr + portSAVE_CONTEXT + + call_x #xTaskIncrementTick + + portRESTORE_CONTEXT + + .endasmfunc +;----------------------------------------------------------- + +; +; Manual context switch called by the portYIELD() macro. +; + + .align 2 + +vPortYield: .asmfunc + + ; The sr needs saving before it is modified. + push.w sr + + ; Now the SR is stacked we can disable interrupts. + dint + nop + + ; Save the context of the current task. + portSAVE_CONTEXT + + ; Select the next task to run. + call_x #vTaskSwitchContext + + ; Restore the context of the new task. + portRESTORE_CONTEXT + .endasmfunc +;----------------------------------------------------------- + + +; +; Start off the scheduler by initialising the RTOS tick timer, then restoring +; the context of the first task. +; + + .align 2 + +xPortStartScheduler: .asmfunc + + ; Setup the hardware to generate the tick. Interrupts are disabled + ; when this function is called. + call_x #vPortSetupTimerInterrupt + + ; Restore the context of the first task that is going to run. + portRESTORE_CONTEXT + .endasmfunc +;----------------------------------------------------------- + + .end + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CCS/MSP430X/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CCS/MSP430X/portmacro.h new file mode 100644 index 0000000..543205f --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CCS/MSP430X/portmacro.h @@ -0,0 +1,185 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Hardware includes. */ +#include "msp430.h" + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT int +#define portBASE_TYPE portSHORT + +/* The stack type changes depending on the data model. */ +#ifdef __LARGE_DATA_MODEL__ + #define portSTACK_TYPE uint32_t +#else + #define portSTACK_TYPE uint16_t + #define portPOINTER_SIZE_TYPE uint16_t +#endif + +typedef portSTACK_TYPE StackType_t; +typedef short BaseType_t; +typedef unsigned short UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif + +/*-----------------------------------------------------------*/ + +/* Interrupt control macros. */ +#define portDISABLE_INTERRUPTS() _disable_interrupt(); _nop() +#define portENABLE_INTERRUPTS() _enable_interrupt(); _nop() +/*-----------------------------------------------------------*/ + +/* Critical section control macros. */ +#define portNO_CRITICAL_SECTION_NESTING ( ( uint16_t ) 0 ) + +#define portENTER_CRITICAL() \ +{ \ +extern volatile uint16_t usCriticalNesting; \ + \ + portDISABLE_INTERRUPTS(); \ + \ + /* Now interrupts are disabled usCriticalNesting can be accessed */ \ + /* directly. Increment ulCriticalNesting to keep a count of how many */ \ + /* times portENTER_CRITICAL() has been called. */ \ + usCriticalNesting++; \ +} + +#define portEXIT_CRITICAL() \ +{ \ +extern volatile uint16_t usCriticalNesting; \ + \ + if( usCriticalNesting > portNO_CRITICAL_SECTION_NESTING ) \ + { \ + /* Decrement the nesting count as we are leaving a critical section. */ \ + usCriticalNesting--; \ + \ + /* If the nesting level has reached zero then interrupts should be */ \ + /* re-enabled. */ \ + if( usCriticalNesting == portNO_CRITICAL_SECTION_NESTING ) \ + { \ + portENABLE_INTERRUPTS(); \ + } \ + } \ +} +/*-----------------------------------------------------------*/ + +/* Task utilities. */ + +/* + * Manual context switch called by portYIELD or taskYIELD. + */ +extern void vPortYield( void ); +#define portYIELD() vPortYield() +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 2 +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portNOP() __no_operation() +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +extern void vTaskSwitchContext( void ); +#define portYIELD_FROM_ISR( x ) if( x ) vPortYield() + +void vApplicationSetupTimerInterrupt( void ); + +/* sizeof( int ) != sizeof( long ) so a full printf() library is required if +run time stats information is to be displayed. */ +#define portLU_PRINTF_SPECIFIER_REQUIRED + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CodeWarrior/ColdFire_V1/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CodeWarrior/ColdFire_V1/port.c new file mode 100644 index 0000000..54e19d5 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CodeWarrior/ColdFire_V1/port.c @@ -0,0 +1,225 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* Kernel includes. */ +#include "FreeRTOS.h" +#include "task.h" + + +#define portINITIAL_FORMAT_VECTOR ( ( StackType_t ) 0x4000 ) + +/* Supervisor mode set. */ +#define portINITIAL_STATUS_REGISTER ( ( StackType_t ) 0x2000) + +/* The clock prescale into the timer peripheral. */ +#define portPRESCALE_VALUE ( ( uint8_t ) 10 ) + +/* The clock frequency into the RTC. */ +#define portRTC_CLOCK_HZ ( ( uint32_t ) 1000 ) + +asm void interrupt VectorNumber_VL1swi vPortYieldISR( void ); +static void prvSetupTimerInterrupt( void ); + +/* Used to keep track of the number of nested calls to taskENTER_CRITICAL(). This +will be set to 0 prior to the first task being started. */ +static uint32_t ulCriticalNesting = 0x9999UL; + +/*-----------------------------------------------------------*/ + +StackType_t *pxPortInitialiseStack( StackType_t * pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + +uint32_t ulOriginalA5; + + __asm{ MOVE.L A5, ulOriginalA5 }; + + + *pxTopOfStack = (StackType_t) 0xDEADBEEF; + pxTopOfStack--; + + /* Exception stack frame starts with the return address. */ + *pxTopOfStack = ( StackType_t ) pxCode; + pxTopOfStack--; + + *pxTopOfStack = ( portINITIAL_FORMAT_VECTOR << 16UL ) | ( portINITIAL_STATUS_REGISTER ); + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) 0x0; /*FP*/ + pxTopOfStack -= 14; /* A5 to D0. */ + + /* Parameter in A0. */ + *( pxTopOfStack + 8 ) = ( StackType_t ) pvParameters; + + /* A5 must be maintained as it is resurved by the compiler. */ + *( pxTopOfStack + 13 ) = ulOriginalA5; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void vPortStartFirstTask( void ); + + ulCriticalNesting = 0UL; + + /* Configure a timer to generate the tick interrupt. */ + prvSetupTimerInterrupt(); + + /* Start the first task executing. */ + vPortStartFirstTask(); + + return pdFALSE; +} +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt( void ) +{ + /* Prescale by 1 - ie no prescale. */ + RTCSC |= 8; + + /* Compare match value. */ + RTCMOD = portRTC_CLOCK_HZ / configTICK_RATE_HZ; + + /* Enable the RTC to generate interrupts - interrupts are already disabled + when this code executes. */ + RTCSC_RTIE = 1; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented as there is nothing to return to. */ +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + if( ulCriticalNesting == 0UL ) + { + /* Guard against context switches being pended simultaneously with a + critical section being entered. */ + do + { + portDISABLE_INTERRUPTS(); + if( INTC_FRC == 0UL ) + { + break; + } + + portENABLE_INTERRUPTS(); + + } while( 1 ); + } + ulCriticalNesting++; +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + ulCriticalNesting--; + if( ulCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void vPortYieldHandler( void ) +{ +uint32_t ulSavedInterruptMask; + + ulSavedInterruptMask = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Note this will clear all forced interrupts - this is done for speed. */ + INTC_CFRC = 0x3E; + vTaskSwitchContext(); + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulSavedInterruptMask ); +} +/*-----------------------------------------------------------*/ + +void interrupt VectorNumber_Vrtc vPortTickISR( void ) +{ +uint32_t ulSavedInterruptMask; + + /* Clear the interrupt. */ + RTCSC |= RTCSC_RTIF_MASK; + + /* Increment the RTOS tick. */ + ulSavedInterruptMask = portSET_INTERRUPT_MASK_FROM_ISR(); + { + if( xTaskIncrementTick() != pdFALSE ) + { + taskYIELD(); + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulSavedInterruptMask ); +} + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CodeWarrior/ColdFire_V1/portasm.S b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CodeWarrior/ColdFire_V1/portasm.S new file mode 100644 index 0000000..3ee5e7f --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CodeWarrior/ColdFire_V1/portasm.S @@ -0,0 +1,172 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* + * Purpose: Lowest level routines for all ColdFire processors. + * + * Notes: + * + * ulPortSetIPL() and mcf5xxx_wr_cacr() copied with permission from FreeScale + * supplied source files. + */ + + .global ulPortSetIPL + .global _ulPortSetIPL + .global mcf5xxx_wr_cacrx + .global _mcf5xxx_wr_cacrx + .global vPortYieldISR + .global _vPortYieldISR + .global vPortStartFirstTask + .global _vPortStartFirstTask + .extern _pxCurrentTCB + .extern _vPortYieldHandler + + .text + +.macro portSAVE_CONTEXT + + lea.l (-60, sp), sp + movem.l d0-a6, (sp) + move.l _pxCurrentTCB, a0 + move.l sp, (a0) + + .endm + +.macro portRESTORE_CONTEXT + + move.l _pxCurrentTCB, a0 + move.l (a0), sp + movem.l (sp), d0-a6 + lea.l (60, sp), sp + rte + + .endm + +/********************************************************************/ +/* + * This routines changes the IPL to the value passed into the routine. + * It also returns the old IPL value back. + * Calling convention from C: + * old_ipl = asm_set_ipl(new_ipl); + * For the Diab Data C compiler, it passes return value thru D0. + * Note that only the least significant three bits of the passed + * value are used. + */ + +ulPortSetIPL: +_ulPortSetIPL: + link A6,#-8 + movem.l D6-D7,(SP) + + move.w SR,D7 /* current sr */ + + move.l D7,D6 /* prepare return value */ + andi.l #0x0700,D6 /* mask out IPL */ + lsr.l #8,D6 /* IPL */ + + andi.l #0x07,D0 /* least significant three bits */ + lsl.l #8,D0 /* move over to make mask */ + + andi.l #0x0000F8FF,D7 /* zero out current IPL */ + or.l D0,D7 /* place new IPL in sr */ + move.w D7,SR + + move.l D6, D0 /* Return value in D0. */ + movem.l (SP),D6-D7 + lea 8(SP),SP + unlk A6 + rts +/********************************************************************/ + +mcf5xxx_wr_cacrx: +_mcf5xxx_wr_cacrx: + move.l 4(sp),d0 + .long 0x4e7b0002 /* movec d0,cacr */ + nop + rts + +/********************************************************************/ + +/* Yield interrupt. */ +_vPortYieldISR: +vPortYieldISR: + portSAVE_CONTEXT + jsr _vPortYieldHandler + portRESTORE_CONTEXT + +/********************************************************************/ + + +vPortStartFirstTask: +_vPortStartFirstTask: + portRESTORE_CONTEXT + + .end + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CodeWarrior/ColdFire_V1/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CodeWarrior/ColdFire_V1/portmacro.h new file mode 100644 index 0000000..b634724 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CodeWarrior/ColdFire_V1/portmacro.h @@ -0,0 +1,157 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 4 +#define portSTACK_GROWTH -1 +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +/*-----------------------------------------------------------*/ + +uint32_t ulPortSetIPL( uint32_t ); +#define portDISABLE_INTERRUPTS() ulPortSetIPL( configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#define portENABLE_INTERRUPTS() ulPortSetIPL( 0 ) + + +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() + +extern UBaseType_t uxPortSetInterruptMaskFromISR( void ); +extern void vPortClearInterruptMaskFromISR( UBaseType_t ); +#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortSetIPL( configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedStatusRegister ) ulPortSetIPL( uxSavedStatusRegister ) + +/*-----------------------------------------------------------*/ + +/* Task utilities. */ +#define portNOP() asm volatile ( "nop" ) + +/* Context switches are requested using the force register. */ +#define portYIELD() INTC_SFRC = 0x3E; portNOP(); portNOP(); portNOP(); portNOP(); portNOP() + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) __attribute__((noreturn)) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*-----------------------------------------------------------*/ + +#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired != pdFALSE ) \ + { \ + portYIELD(); \ + } + + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CodeWarrior/ColdFire_V2/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CodeWarrior/ColdFire_V2/port.c new file mode 100644 index 0000000..cf06848 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CodeWarrior/ColdFire_V2/port.c @@ -0,0 +1,189 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* Kernel includes. */ +#include "FreeRTOS.h" +#include "task.h" + + +#define portINITIAL_FORMAT_VECTOR ( ( StackType_t ) 0x4000 ) + +/* Supervisor mode set. */ +#define portINITIAL_STATUS_REGISTER ( ( StackType_t ) 0x2000) + +/* Used to keep track of the number of nested calls to taskENTER_CRITICAL(). This +will be set to 0 prior to the first task being started. */ +static uint32_t ulCriticalNesting = 0x9999UL; + + +#define portSAVE_CONTEXT() \ + lea.l (-60, %sp), %sp; \ + movem.l %d0-%fp, (%sp); \ + move.l pxCurrentTCB, %a0; \ + move.l %sp, (%a0); + +#define portRESTORE_CONTEXT() \ + move.l pxCurrentTCB, %a0; \ + move.l (%a0), %sp; \ + movem.l (%sp), %d0-%fp; \ + lea.l %sp@(60), %sp; \ + rte + + + +/*-----------------------------------------------------------*/ + +StackType_t *pxPortInitialiseStack( StackType_t * pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + *pxTopOfStack = ( StackType_t ) pvParameters; + pxTopOfStack--; + + *pxTopOfStack = (StackType_t) 0xDEADBEEF; + pxTopOfStack--; + + /* Exception stack frame starts with the return address. */ + *pxTopOfStack = ( StackType_t ) pxCode; + pxTopOfStack--; + + *pxTopOfStack = ( portINITIAL_FORMAT_VECTOR << 16UL ) | ( portINITIAL_STATUS_REGISTER ); + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) 0x0; /*FP*/ + pxTopOfStack -= 14; /* A5 to D0. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void vPortStartFirstTask( void ); + + ulCriticalNesting = 0UL; + + /* Configure the interrupts used by this port. */ + vApplicationSetupInterrupts(); + + /* Start the first task executing. */ + vPortStartFirstTask(); + + return pdFALSE; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented as there is nothing to return to. */ +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + if( ulCriticalNesting == 0UL ) + { + /* Guard against context switches being pended simultaneously with a + critical section being entered. */ + do + { + portDISABLE_INTERRUPTS(); + if( MCF_INTC0_INTFRCH == 0UL ) + { + break; + } + + portENABLE_INTERRUPTS(); + + } while( 1 ); + } + ulCriticalNesting++; +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + ulCriticalNesting--; + if( ulCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void vPortYieldHandler( void ) +{ +uint32_t ulSavedInterruptMask; + + ulSavedInterruptMask = portSET_INTERRUPT_MASK_FROM_ISR(); + /* Note this will clear all forced interrupts - this is done for speed. */ + MCF_INTC0_INTFRCL = 0; + vTaskSwitchContext(); + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulSavedInterruptMask ); +} +/*-----------------------------------------------------------*/ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CodeWarrior/ColdFire_V2/portasm.S b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CodeWarrior/ColdFire_V2/portasm.S new file mode 100644 index 0000000..3b8399a --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CodeWarrior/ColdFire_V2/portasm.S @@ -0,0 +1,172 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* + * Purpose: Lowest level routines for all ColdFire processors. + * + * Notes: + * + * ulPortSetIPL() and mcf5xxx_wr_cacr() copied with permission from FreeScale + * supplied source files. + */ + + .global ulPortSetIPL + .global _ulPortSetIPL + .global mcf5xxx_wr_cacrx + .global _mcf5xxx_wr_cacrx + .global vPortYieldISR + .global _vPortYieldISR + .global vPortStartFirstTask + .global _vPortStartFirstTask + .extern _pxCurrentTCB + .extern _vPortYieldHandler + + .text + +.macro portSAVE_CONTEXT + + lea.l (-60, sp), sp + movem.l d0-a6, (sp) + move.l _pxCurrentTCB, a0 + move.l sp, (a0) + + .endm + +.macro portRESTORE_CONTEXT + + move.l _pxCurrentTCB, a0 + move.l (a0), sp + movem.l (sp), d0-a6 + lea.l (60, sp), sp + rte + + .endm + +/********************************************************************/ +/* + * This routines changes the IPL to the value passed into the routine. + * It also returns the old IPL value back. + * Calling convention from C: + * old_ipl = asm_set_ipl(new_ipl); + * For the Diab Data C compiler, it passes return value thru D0. + * Note that only the least significant three bits of the passed + * value are used. + */ + +ulPortSetIPL: +_ulPortSetIPL: + link A6,#-8 + movem.l D6-D7,(SP) + + move.w SR,D7 /* current sr */ + + move.l D7,D0 /* prepare return value */ + andi.l #0x0700,D0 /* mask out IPL */ + lsr.l #8,D0 /* IPL */ + + move.l 8(A6),D6 /* get argument */ + andi.l #0x07,D6 /* least significant three bits */ + lsl.l #8,D6 /* move over to make mask */ + + andi.l #0x0000F8FF,D7 /* zero out current IPL */ + or.l D6,D7 /* place new IPL in sr */ + move.w D7,SR + + movem.l (SP),D6-D7 + lea 8(SP),SP + unlk A6 + rts +/********************************************************************/ + +mcf5xxx_wr_cacrx: +_mcf5xxx_wr_cacrx: + move.l 4(sp),d0 + .long 0x4e7b0002 /* movec d0,cacr */ + nop + rts + +/********************************************************************/ + +/* Yield interrupt. */ +_vPortYieldISR: +vPortYieldISR: + portSAVE_CONTEXT + jsr _vPortYieldHandler + portRESTORE_CONTEXT + +/********************************************************************/ + + +vPortStartFirstTask: +_vPortStartFirstTask: + portRESTORE_CONTEXT + + .end + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CodeWarrior/ColdFire_V2/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CodeWarrior/ColdFire_V2/portmacro.h new file mode 100644 index 0000000..3aabb77 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CodeWarrior/ColdFire_V2/portmacro.h @@ -0,0 +1,156 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 4 +#define portSTACK_GROWTH -1 +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +/*-----------------------------------------------------------*/ +uint32_t ulPortSetIPL( uint32_t ); +#define portDISABLE_INTERRUPTS() ulPortSetIPL( configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#define portENABLE_INTERRUPTS() ulPortSetIPL( 0 ) + + +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() + +extern UBaseType_t uxPortSetInterruptMaskFromISR( void ); +extern void vPortClearInterruptMaskFromISR( UBaseType_t ); +#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortSetIPL( configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedStatusRegister ) ulPortSetIPL( uxSavedStatusRegister ) + +/*-----------------------------------------------------------*/ + +/* Task utilities. */ + +#define portNOP() asm volatile ( "nop" ) + +/* Note this will overwrite all other bits in the force register, it is done this way for speed. */ +#define portYIELD() MCF_INTC0_INTFRCL = ( 1UL << configYIELD_INTERRUPT_VECTOR ); portNOP(); portNOP() /* -32 as we are using the high word of the 64bit mask. */ + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) __attribute__((noreturn)) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*-----------------------------------------------------------*/ + +#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired != pdFALSE ) \ + { \ + portYIELD(); \ + } + + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CodeWarrior/HCS12/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CodeWarrior/HCS12/port.c new file mode 100644 index 0000000..51530b6 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CodeWarrior/HCS12/port.c @@ -0,0 +1,279 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the HCS12 port. + *----------------------------------------------------------*/ + + +/* + * Configure a timer to generate the RTOS tick at the frequency specified + * within FreeRTOSConfig.h. + */ +static void prvSetupTimerInterrupt( void ); + +/* Interrupt service routines have to be in non-banked memory - as does the +scheduler startup function. */ +#pragma CODE_SEG __NEAR_SEG NON_BANKED + + /* Manual context switch function. This is the SWI ISR. */ + void interrupt vPortYield( void ); + + /* Tick context switch function. This is the timer ISR. */ + void interrupt vPortTickInterrupt( void ); + + /* Simply called by xPortStartScheduler(). xPortStartScheduler() does not + start the scheduler directly because the header file containing the + xPortStartScheduler() prototype is part of the common kernel code, and + therefore cannot use the CODE_SEG pragma. */ + static BaseType_t xBankedStartScheduler( void ); + +#pragma CODE_SEG DEFAULT + +/* Calls to portENTER_CRITICAL() can be nested. When they are nested the +critical section should not be left (i.e. interrupts should not be re-enabled) +until the nesting depth reaches 0. This variable simply tracks the nesting +depth. Each task maintains it's own critical nesting depth variable so +uxCriticalNesting is saved and restored from the task stack during a context +switch. */ +volatile UBaseType_t uxCriticalNesting = 0xff; + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* + Place a few bytes of known values on the bottom of the stack. + This can be uncommented to provide useful stack markers when debugging. + + *pxTopOfStack = ( StackType_t ) 0x11; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x22; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x33; + pxTopOfStack--; + */ + + + + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. In this case the stack as + expected by the HCS12 RTI instruction. */ + + + /* The address of the task function is placed in the stack byte at a time. */ + *pxTopOfStack = ( StackType_t ) *( ((StackType_t *) (&pxCode) ) + 1 ); + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) *( ((StackType_t *) (&pxCode) ) + 0 ); + pxTopOfStack--; + + /* Next are all the registers that form part of the task context. */ + + /* Y register */ + *pxTopOfStack = ( StackType_t ) 0xff; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xee; + pxTopOfStack--; + + /* X register */ + *pxTopOfStack = ( StackType_t ) 0xdd; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xcc; + pxTopOfStack--; + + /* A register contains parameter high byte. */ + *pxTopOfStack = ( StackType_t ) *( ((StackType_t *) (&pvParameters) ) + 0 ); + pxTopOfStack--; + + /* B register contains parameter low byte. */ + *pxTopOfStack = ( StackType_t ) *( ((StackType_t *) (&pvParameters) ) + 1 ); + pxTopOfStack--; + + /* CCR: Note that when the task starts interrupts will be enabled since + "I" bit of CCR is cleared */ + *pxTopOfStack = ( StackType_t ) 0x00; + pxTopOfStack--; + + #ifdef BANKED_MODEL + /* The page of the task. */ + *pxTopOfStack = ( StackType_t ) ( ( int ) pxCode ); + pxTopOfStack--; + #endif + + /* Finally the critical nesting depth is initialised with 0 (not within + a critical section). */ + *pxTopOfStack = ( StackType_t ) 0x00; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the HCS12 port will get stopped. */ +} +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt( void ) +{ + TickTimer_SetFreqHz( configTICK_RATE_HZ ); + TickTimer_Enable(); +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* xPortStartScheduler() does not start the scheduler directly because + the header file containing the xPortStartScheduler() prototype is part + of the common kernel code, and therefore cannot use the CODE_SEG pragma. + Instead it simply calls the locally defined xBankedStartScheduler() - + which does use the CODE_SEG pragma. */ + + return xBankedStartScheduler(); +} +/*-----------------------------------------------------------*/ + +#pragma CODE_SEG __NEAR_SEG NON_BANKED + +static BaseType_t xBankedStartScheduler( void ) +{ + /* Configure the timer that will generate the RTOS tick. Interrupts are + disabled when this function is called. */ + prvSetupTimerInterrupt(); + + /* Restore the context of the first task. */ + portRESTORE_CONTEXT(); + + /* Simulate the end of an interrupt to start the scheduler off. */ + __asm( "rti" ); + + /* Should not get here! */ + return pdFALSE; +} +/*-----------------------------------------------------------*/ + +/* + * Context switch functions. These are both interrupt service routines. + */ + +/* + * Manual context switch forced by calling portYIELD(). This is the SWI + * handler. + */ +void interrupt vPortYield( void ) +{ + portSAVE_CONTEXT(); + vTaskSwitchContext(); + portRESTORE_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +/* + * RTOS tick interrupt service routine. If the cooperative scheduler is + * being used then this simply increments the tick count. If the + * preemptive scheduler is being used a context switch can occur. + */ +void interrupt vPortTickInterrupt( void ) +{ + #if configUSE_PREEMPTION == 1 + { + /* A context switch might happen so save the context. */ + portSAVE_CONTEXT(); + + /* Increment the tick ... */ + if( xTaskIncrementTick() != pdFALSE ) + { + vTaskSwitchContext(); + } + + TFLG1 = 1; + + /* Restore the context of a task - which may be a different task + to that interrupted. */ + portRESTORE_CONTEXT(); + } + #else + { + xTaskIncrementTick(); + TFLG1 = 1; + } + #endif +} + +#pragma CODE_SEG DEFAULT + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CodeWarrior/HCS12/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CodeWarrior/HCS12/portmacro.h new file mode 100644 index 0000000..b424e46 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/CodeWarrior/HCS12/portmacro.h @@ -0,0 +1,244 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint8_t +#define portBASE_TYPE char + +typedef portSTACK_TYPE StackType_t; +typedef signed char BaseType_t; +typedef unsigned char UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 1 +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portYIELD() __asm( "swi" ); +#define portNOP() __asm( "nop" ); +/*-----------------------------------------------------------*/ + +/* Critical section handling. */ +#define portENABLE_INTERRUPTS() __asm( "cli" ) +#define portDISABLE_INTERRUPTS() __asm( "sei" ) + +/* + * Disable interrupts before incrementing the count of critical section nesting. + * The nesting count is maintained so we know when interrupts should be + * re-enabled. Once interrupts are disabled the nesting count can be accessed + * directly. Each task maintains its own nesting count. + */ +#define portENTER_CRITICAL() \ +{ \ + extern volatile UBaseType_t uxCriticalNesting; \ + \ + portDISABLE_INTERRUPTS(); \ + uxCriticalNesting++; \ +} + +/* + * Interrupts are disabled so we can access the nesting count directly. If the + * nesting is found to be 0 (no nesting) then we are leaving the critical + * section and interrupts can be re-enabled. + */ +#define portEXIT_CRITICAL() \ +{ \ + extern volatile UBaseType_t uxCriticalNesting; \ + \ + uxCriticalNesting--; \ + if( uxCriticalNesting == 0 ) \ + { \ + portENABLE_INTERRUPTS(); \ + } \ +} +/*-----------------------------------------------------------*/ + +/* Task utilities. */ + +/* + * These macros are very simple as the processor automatically saves and + * restores its registers as interrupts are entered and exited. In + * addition to the (automatically stacked) registers we also stack the + * critical nesting count. Each task maintains its own critical nesting + * count as it is legitimate for a task to yield from within a critical + * section. If the banked memory model is being used then the PPAGE + * register is also stored as part of the tasks context. + */ + +#ifdef BANKED_MODEL + /* + * Load the stack pointer for the task, then pull the critical nesting + * count and PPAGE register from the stack. The remains of the + * context are restored by the RTI instruction. + */ + #define portRESTORE_CONTEXT() \ + { \ + extern volatile void * pxCurrentTCB; \ + extern volatile UBaseType_t uxCriticalNesting; \ + \ + __asm( "ldx pxCurrentTCB" ); \ + __asm( "lds 0, x" ); \ + __asm( "pula" ); \ + __asm( "staa uxCriticalNesting" ); \ + __asm( "pula" ); \ + __asm( "staa 0x30" ); /* 0x30 = PPAGE */ \ + } + + /* + * By the time this macro is called the processor has already stacked the + * registers. Simply stack the nesting count and PPAGE value, then save + * the task stack pointer. + */ + #define portSAVE_CONTEXT() \ + { \ + extern volatile void * pxCurrentTCB; \ + extern volatile UBaseType_t uxCriticalNesting; \ + \ + __asm( "ldaa 0x30" ); /* 0x30 = PPAGE */ \ + __asm( "psha" ); \ + __asm( "ldaa uxCriticalNesting" ); \ + __asm( "psha" ); \ + __asm( "ldx pxCurrentTCB" ); \ + __asm( "sts 0, x" ); \ + } +#else + + /* + * These macros are as per the BANKED versions above, but without saving + * and restoring the PPAGE register. + */ + + #define portRESTORE_CONTEXT() \ + { \ + extern volatile void * pxCurrentTCB; \ + extern volatile UBaseType_t uxCriticalNesting; \ + \ + __asm( "ldx pxCurrentTCB" ); \ + __asm( "lds 0, x" ); \ + __asm( "pula" ); \ + __asm( "staa uxCriticalNesting" ); \ + } + + #define portSAVE_CONTEXT() \ + { \ + extern volatile void * pxCurrentTCB; \ + extern volatile UBaseType_t uxCriticalNesting; \ + \ + __asm( "ldaa uxCriticalNesting" ); \ + __asm( "psha" ); \ + __asm( "ldx pxCurrentTCB" ); \ + __asm( "sts 0, x" ); \ + } +#endif + +/* + * Utility macro to call macros above in correct order in order to perform a + * task switch from within a standard ISR. This macro can only be used if + * the ISR does not use any local (stack) variables. If the ISR uses stack + * variables portYIELD() should be used in it's place. + */ +#define portTASK_SWITCH_FROM_ISR() \ + portSAVE_CONTEXT(); \ + vTaskSwitchContext(); \ + portRESTORE_CONTEXT(); + + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Common/mpu_wrappers.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Common/mpu_wrappers.c new file mode 100644 index 0000000..8a5115b --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Common/mpu_wrappers.c @@ -0,0 +1,1140 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* + * Implementation of the wrapper functions used to raise the processor privilege + * before calling a standard FreeRTOS API function. + */ + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining +all the API functions to use the MPU wrappers. That should only be done when +task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "timers.h" +#include "event_groups.h" +#include "mpu_prototypes.h" + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* + * Checks to see if being called from the context of an unprivileged task, and + * if so raises the privilege level and returns false - otherwise does nothing + * other than return true. + */ +extern BaseType_t xPortRaisePrivilege( void ); + +/*-----------------------------------------------------------*/ + +BaseType_t MPU_xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition, TaskHandle_t *pxCreatedTask ) +{ +BaseType_t xReturn; +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xTaskCreateRestricted( pxTaskDefinition, pxCreatedTask ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; +} +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + BaseType_t MPU_xTaskCreate( TaskFunction_t pvTaskCode, const char * const pcName, uint16_t usStackDepth, void *pvParameters, UBaseType_t uxPriority, TaskHandle_t *pxCreatedTask ) + { + BaseType_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xTaskCreate( pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pxCreatedTask ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; + } +#endif /* configSUPPORT_DYNAMIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + TaskHandle_t MPU_xTaskCreateStatic( TaskFunction_t pxTaskCode, const char * const pcName, const uint32_t ulStackDepth, void * const pvParameters, UBaseType_t uxPriority, StackType_t * const puxStackBuffer, StaticTask_t * const pxTaskBuffer ) + { + TaskHandle_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xTaskCreateStatic( pxTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, puxStackBuffer, pxTaskBuffer ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; + } +#endif /* configSUPPORT_STATIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +void MPU_vTaskAllocateMPURegions( TaskHandle_t xTask, const MemoryRegion_t * const xRegions ) +{ +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + vTaskAllocateMPURegions( xTask, xRegions ); + vPortResetPrivilege( xRunningPrivileged ); +} +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskDelete == 1 ) + void MPU_vTaskDelete( TaskHandle_t pxTaskToDelete ) + { + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + vTaskDelete( pxTaskToDelete ); + vPortResetPrivilege( xRunningPrivileged ); + } +#endif +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskDelayUntil == 1 ) + void MPU_vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, TickType_t xTimeIncrement ) + { + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + vTaskDelayUntil( pxPreviousWakeTime, xTimeIncrement ); + vPortResetPrivilege( xRunningPrivileged ); + } +#endif +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_xTaskAbortDelay == 1 ) + BaseType_t MPU_xTaskAbortDelay( TaskHandle_t xTask ) + { + BaseType_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xTaskAbortDelay( xTask ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskDelay == 1 ) + void MPU_vTaskDelay( TickType_t xTicksToDelay ) + { + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + vTaskDelay( xTicksToDelay ); + vPortResetPrivilege( xRunningPrivileged ); + } +#endif +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_uxTaskPriorityGet == 1 ) + UBaseType_t MPU_uxTaskPriorityGet( TaskHandle_t pxTask ) + { + UBaseType_t uxReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + uxReturn = uxTaskPriorityGet( pxTask ); + vPortResetPrivilege( xRunningPrivileged ); + return uxReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskPrioritySet == 1 ) + void MPU_vTaskPrioritySet( TaskHandle_t pxTask, UBaseType_t uxNewPriority ) + { + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + vTaskPrioritySet( pxTask, uxNewPriority ); + vPortResetPrivilege( xRunningPrivileged ); + } +#endif +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_eTaskGetState == 1 ) + eTaskState MPU_eTaskGetState( TaskHandle_t pxTask ) + { + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + eTaskState eReturn; + + eReturn = eTaskGetState( pxTask ); + vPortResetPrivilege( xRunningPrivileged ); + return eReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if( configUSE_TRACE_FACILITY == 1 ) + void MPU_vTaskGetInfo( TaskHandle_t xTask, TaskStatus_t *pxTaskStatus, BaseType_t xGetFreeStackSpace, eTaskState eState ) + { + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + vTaskGetInfo( xTask, pxTaskStatus, xGetFreeStackSpace, eState ); + vPortResetPrivilege( xRunningPrivileged ); + } +#endif +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) + TaskHandle_t MPU_xTaskGetIdleTaskHandle( void ) + { + TaskHandle_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xTaskGetIdleTaskHandle(); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskSuspend == 1 ) + void MPU_vTaskSuspend( TaskHandle_t pxTaskToSuspend ) + { + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + vTaskSuspend( pxTaskToSuspend ); + vPortResetPrivilege( xRunningPrivileged ); + } +#endif +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskSuspend == 1 ) + void MPU_vTaskResume( TaskHandle_t pxTaskToResume ) + { + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + vTaskResume( pxTaskToResume ); + vPortResetPrivilege( xRunningPrivileged ); + } +#endif +/*-----------------------------------------------------------*/ + +void MPU_vTaskSuspendAll( void ) +{ +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + vTaskSuspendAll(); + vPortResetPrivilege( xRunningPrivileged ); +} +/*-----------------------------------------------------------*/ + +BaseType_t MPU_xTaskResumeAll( void ) +{ +BaseType_t xReturn; +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xTaskResumeAll(); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; +} +/*-----------------------------------------------------------*/ + +TickType_t MPU_xTaskGetTickCount( void ) +{ +TickType_t xReturn; +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xTaskGetTickCount(); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; +} +/*-----------------------------------------------------------*/ + +UBaseType_t MPU_uxTaskGetNumberOfTasks( void ) +{ +UBaseType_t uxReturn; +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + uxReturn = uxTaskGetNumberOfTasks(); + vPortResetPrivilege( xRunningPrivileged ); + return uxReturn; +} +/*-----------------------------------------------------------*/ + +char * MPU_pcTaskGetName( TaskHandle_t xTaskToQuery ) +{ +char *pcReturn; +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + pcReturn = pcTaskGetName( xTaskToQuery ); + vPortResetPrivilege( xRunningPrivileged ); + return pcReturn; +} +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_xTaskGetHandle == 1 ) + TaskHandle_t MPU_xTaskGetHandle( const char *pcNameToQuery ) + { + TaskHandle_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xTaskGetHandle( pcNameToQuery ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) + void MPU_vTaskList( char *pcWriteBuffer ) + { + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + vTaskList( pcWriteBuffer ); + vPortResetPrivilege( xRunningPrivileged ); + } +#endif +/*-----------------------------------------------------------*/ + +#if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) + void MPU_vTaskGetRunTimeStats( char *pcWriteBuffer ) + { + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + vTaskGetRunTimeStats( pcWriteBuffer ); + vPortResetPrivilege( xRunningPrivileged ); + } +#endif +/*-----------------------------------------------------------*/ + +#if ( configUSE_APPLICATION_TASK_TAG == 1 ) + void MPU_vTaskSetApplicationTaskTag( TaskHandle_t xTask, TaskHookFunction_t pxTagValue ) + { + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + vTaskSetApplicationTaskTag( xTask, pxTagValue ); + vPortResetPrivilege( xRunningPrivileged ); + } +#endif +/*-----------------------------------------------------------*/ + +#if ( configUSE_APPLICATION_TASK_TAG == 1 ) + TaskHookFunction_t MPU_xTaskGetApplicationTaskTag( TaskHandle_t xTask ) + { + TaskHookFunction_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xTaskGetApplicationTaskTag( xTask ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 ) + void MPU_vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet, BaseType_t xIndex, void *pvValue ) + { + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + vTaskSetThreadLocalStoragePointer( xTaskToSet, xIndex, pvValue ); + vPortResetPrivilege( xRunningPrivileged ); + } +#endif +/*-----------------------------------------------------------*/ + +#if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 ) + void *MPU_pvTaskGetThreadLocalStoragePointer( TaskHandle_t xTaskToQuery, BaseType_t xIndex ) + { + void *pvReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + pvReturn = pvTaskGetThreadLocalStoragePointer( xTaskToQuery, xIndex ); + vPortResetPrivilege( xRunningPrivileged ); + return pvReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if ( configUSE_APPLICATION_TASK_TAG == 1 ) + BaseType_t MPU_xTaskCallApplicationTaskHook( TaskHandle_t xTask, void *pvParameter ) + { + BaseType_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xTaskCallApplicationTaskHook( xTask, pvParameter ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t MPU_uxTaskGetSystemState( TaskStatus_t *pxTaskStatusArray, UBaseType_t uxArraySize, uint32_t *pulTotalRunTime ) + { + UBaseType_t uxReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + uxReturn = uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, pulTotalRunTime ); + vPortResetPrivilege( xRunningPrivileged ); + return uxReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) + UBaseType_t MPU_uxTaskGetStackHighWaterMark( TaskHandle_t xTask ) + { + UBaseType_t uxReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + uxReturn = uxTaskGetStackHighWaterMark( xTask ); + vPortResetPrivilege( xRunningPrivileged ); + return uxReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_xTaskGetCurrentTaskHandle == 1 ) + TaskHandle_t MPU_xTaskGetCurrentTaskHandle( void ) + { + TaskHandle_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xTaskGetCurrentTaskHandle(); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_xTaskGetSchedulerState == 1 ) + BaseType_t MPU_xTaskGetSchedulerState( void ) + { + BaseType_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xTaskGetSchedulerState(); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +void MPU_vTaskSetTimeOutState( TimeOut_t * const pxTimeOut ) +{ +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + vTaskSetTimeOutState( pxTimeOut ); + vPortResetPrivilege( xRunningPrivileged ); +} +/*-----------------------------------------------------------*/ + +BaseType_t MPU_xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, TickType_t * const pxTicksToWait ) +{ +BaseType_t xReturn; +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xTaskCheckForTimeOut( pxTimeOut, pxTicksToWait ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; +} +/*-----------------------------------------------------------*/ + +#if( configUSE_TASK_NOTIFICATIONS == 1 ) + BaseType_t MPU_xTaskGenericNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue ) + { + BaseType_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xTaskGenericNotify( xTaskToNotify, ulValue, eAction, pulPreviousNotificationValue ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if( configUSE_TASK_NOTIFICATIONS == 1 ) + BaseType_t MPU_xTaskNotifyWait( uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, uint32_t *pulNotificationValue, TickType_t xTicksToWait ) + { + BaseType_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xTaskNotifyWait( ulBitsToClearOnEntry, ulBitsToClearOnExit, pulNotificationValue, xTicksToWait ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if( configUSE_TASK_NOTIFICATIONS == 1 ) + uint32_t MPU_ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait ) + { + uint32_t ulReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + ulReturn = ulTaskNotifyTake( xClearCountOnExit, xTicksToWait ); + vPortResetPrivilege( xRunningPrivileged ); + return ulReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if( configUSE_TASK_NOTIFICATIONS == 1 ) + BaseType_t MPU_xTaskNotifyStateClear( TaskHandle_t xTask ) + { + BaseType_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xTaskNotifyStateClear( xTask ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + QueueHandle_t MPU_xQueueGenericCreate( UBaseType_t uxQueueLength, UBaseType_t uxItemSize, uint8_t ucQueueType ) + { + QueueHandle_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xQueueGenericCreate( uxQueueLength, uxItemSize, ucQueueType ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + QueueHandle_t MPU_xQueueGenericCreateStatic( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, uint8_t *pucQueueStorage, StaticQueue_t *pxStaticQueue, const uint8_t ucQueueType ) + { + QueueHandle_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xQueueGenericCreateStatic( uxQueueLength, uxItemSize, pucQueueStorage, pxStaticQueue, ucQueueType ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +BaseType_t MPU_xQueueGenericReset( QueueHandle_t pxQueue, BaseType_t xNewQueue ) +{ +BaseType_t xReturn; +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xQueueGenericReset( pxQueue, xNewQueue ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t MPU_xQueueGenericSend( QueueHandle_t xQueue, const void * const pvItemToQueue, TickType_t xTicksToWait, BaseType_t xCopyPosition ) +{ +BaseType_t xReturn; +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xQueueGenericSend( xQueue, pvItemToQueue, xTicksToWait, xCopyPosition ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; +} +/*-----------------------------------------------------------*/ + +UBaseType_t MPU_uxQueueMessagesWaiting( const QueueHandle_t pxQueue ) +{ +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); +UBaseType_t uxReturn; + + uxReturn = uxQueueMessagesWaiting( pxQueue ); + vPortResetPrivilege( xRunningPrivileged ); + return uxReturn; +} +/*-----------------------------------------------------------*/ + +UBaseType_t MPU_uxQueueSpacesAvailable( const QueueHandle_t xQueue ) +{ +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); +UBaseType_t uxReturn; + + uxReturn = uxQueueSpacesAvailable( xQueue ); + vPortResetPrivilege( xRunningPrivileged ); + return uxReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t MPU_xQueueGenericReceive( QueueHandle_t pxQueue, void * const pvBuffer, TickType_t xTicksToWait, BaseType_t xJustPeeking ) +{ +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); +BaseType_t xReturn; + + xReturn = xQueueGenericReceive( pxQueue, pvBuffer, xTicksToWait, xJustPeeking ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t MPU_xQueuePeekFromISR( QueueHandle_t pxQueue, void * const pvBuffer ) +{ +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); +BaseType_t xReturn; + + xReturn = xQueuePeekFromISR( pxQueue, pvBuffer ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; +} +/*-----------------------------------------------------------*/ + +void* MPU_xQueueGetMutexHolder( QueueHandle_t xSemaphore ) +{ +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); +void * xReturn; + + xReturn = ( void * ) xQueueGetMutexHolder( xSemaphore ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; +} +/*-----------------------------------------------------------*/ + +#if( ( configUSE_MUTEXES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + QueueHandle_t MPU_xQueueCreateMutex( const uint8_t ucQueueType ) + { + QueueHandle_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xQueueCreateMutex( ucQueueType ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if( ( configUSE_MUTEXES == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + QueueHandle_t MPU_xQueueCreateMutexStatic( const uint8_t ucQueueType, StaticQueue_t *pxStaticQueue ) + { + QueueHandle_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xQueueCreateMutexStatic( ucQueueType, pxStaticQueue ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + QueueHandle_t MPU_xQueueCreateCountingSemaphore( UBaseType_t uxCountValue, UBaseType_t uxInitialCount ) + { + QueueHandle_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xQueueCreateCountingSemaphore( uxCountValue, uxInitialCount ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + + QueueHandle_t MPU_xQueueCreateCountingSemaphoreStatic( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount, StaticQueue_t *pxStaticQueue ) + { + QueueHandle_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xQueueCreateCountingSemaphoreStatic( uxMaxCount, uxInitialCount, pxStaticQueue ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if ( configUSE_MUTEXES == 1 ) + BaseType_t MPU_xQueueTakeMutexRecursive( QueueHandle_t xMutex, TickType_t xBlockTime ) + { + BaseType_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xQueueTakeMutexRecursive( xMutex, xBlockTime ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if ( configUSE_MUTEXES == 1 ) + BaseType_t MPU_xQueueGiveMutexRecursive( QueueHandle_t xMutex ) + { + BaseType_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xQueueGiveMutexRecursive( xMutex ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if ( configUSE_QUEUE_SETS == 1 ) + QueueSetHandle_t MPU_xQueueCreateSet( UBaseType_t uxEventQueueLength ) + { + QueueSetHandle_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xQueueCreateSet( uxEventQueueLength ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if ( configUSE_QUEUE_SETS == 1 ) + QueueSetMemberHandle_t MPU_xQueueSelectFromSet( QueueSetHandle_t xQueueSet, TickType_t xBlockTimeTicks ) + { + QueueSetMemberHandle_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xQueueSelectFromSet( xQueueSet, xBlockTimeTicks ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if ( configUSE_QUEUE_SETS == 1 ) + BaseType_t MPU_xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet ) + { + BaseType_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xQueueAddToSet( xQueueOrSemaphore, xQueueSet ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if ( configUSE_QUEUE_SETS == 1 ) + BaseType_t MPU_xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet ) + { + BaseType_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xQueueRemoveFromSet( xQueueOrSemaphore, xQueueSet ); + vPortResetPrivilege( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if configQUEUE_REGISTRY_SIZE > 0 + void MPU_vQueueAddToRegistry( QueueHandle_t xQueue, const char *pcName ) + { + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + vQueueAddToRegistry( xQueue, pcName ); + + vPortResetPrivilege( xRunningPrivileged ); + } +#endif +/*-----------------------------------------------------------*/ + +#if configQUEUE_REGISTRY_SIZE > 0 + void MPU_vQueueUnregisterQueue( QueueHandle_t xQueue ) + { + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + vQueueUnregisterQueue( xQueue ); + + vPortResetPrivilege( xRunningPrivileged ); + } +#endif +/*-----------------------------------------------------------*/ + +#if configQUEUE_REGISTRY_SIZE > 0 + const char *MPU_pcQueueGetName( QueueHandle_t xQueue ) + { + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + const char *pcReturn; + + pcReturn = pcQueueGetName( xQueue ); + + vPortResetPrivilege( xRunningPrivileged ); + return pcReturn; + } +#endif +/*-----------------------------------------------------------*/ + +void MPU_vQueueDelete( QueueHandle_t xQueue ) +{ +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + vQueueDelete( xQueue ); + + vPortResetPrivilege( xRunningPrivileged ); +} +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + + void *MPU_pvPortMalloc( size_t xSize ) + { + void *pvReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + pvReturn = pvPortMalloc( xSize ); + + vPortResetPrivilege( xRunningPrivileged ); + + return pvReturn; + } + +#endif /* configSUPPORT_DYNAMIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + + void MPU_vPortFree( void *pv ) + { + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + vPortFree( pv ); + + vPortResetPrivilege( xRunningPrivileged ); + } + +#endif /* configSUPPORT_DYNAMIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +void MPU_vPortInitialiseBlocks( void ) +{ +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + vPortInitialiseBlocks(); + + vPortResetPrivilege( xRunningPrivileged ); +} +/*-----------------------------------------------------------*/ + +size_t MPU_xPortGetFreeHeapSize( void ) +{ +size_t xReturn; +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xPortGetFreeHeapSize(); + + vPortResetPrivilege( xRunningPrivileged ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +#if( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configUSE_TIMERS == 1 ) ) + TimerHandle_t MPU_xTimerCreate( const char * const pcTimerName, const TickType_t xTimerPeriodInTicks, const UBaseType_t uxAutoReload, void * const pvTimerID, TimerCallbackFunction_t pxCallbackFunction ) + { + TimerHandle_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xTimerCreate( pcTimerName, xTimerPeriodInTicks, uxAutoReload, pvTimerID, pxCallbackFunction ); + vPortResetPrivilege( xRunningPrivileged ); + + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configUSE_TIMERS == 1 ) ) + TimerHandle_t MPU_xTimerCreateStatic( const char * const pcTimerName, const TickType_t xTimerPeriodInTicks, const UBaseType_t uxAutoReload, void * const pvTimerID, TimerCallbackFunction_t pxCallbackFunction, StaticTimer_t *pxTimerBuffer ) + { + TimerHandle_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xTimerCreateStatic( pcTimerName, xTimerPeriodInTicks, uxAutoReload, pvTimerID, pxCallbackFunction, pxTimerBuffer ); + vPortResetPrivilege( xRunningPrivileged ); + + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if( configUSE_TIMERS == 1 ) + void *MPU_pvTimerGetTimerID( const TimerHandle_t xTimer ) + { + void * pvReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + pvReturn = pvTimerGetTimerID( xTimer ); + vPortResetPrivilege( xRunningPrivileged ); + + return pvReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if( configUSE_TIMERS == 1 ) + void MPU_vTimerSetTimerID( TimerHandle_t xTimer, void *pvNewID ) + { + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + vTimerSetTimerID( xTimer, pvNewID ); + vPortResetPrivilege( xRunningPrivileged ); + } +#endif +/*-----------------------------------------------------------*/ + +#if( configUSE_TIMERS == 1 ) + BaseType_t MPU_xTimerIsTimerActive( TimerHandle_t xTimer ) + { + BaseType_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xTimerIsTimerActive( xTimer ); + vPortResetPrivilege( xRunningPrivileged ); + + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if( configUSE_TIMERS == 1 ) + TaskHandle_t MPU_xTimerGetTimerDaemonTaskHandle( void ) + { + TaskHandle_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xTimerGetTimerDaemonTaskHandle(); + vPortResetPrivilege( xRunningPrivileged ); + + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if( ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 1 ) ) + BaseType_t MPU_xTimerPendFunctionCall( PendedFunction_t xFunctionToPend, void *pvParameter1, uint32_t ulParameter2, TickType_t xTicksToWait ) + { + BaseType_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xTimerPendFunctionCall( xFunctionToPend, pvParameter1, ulParameter2, xTicksToWait ); + vPortResetPrivilege( xRunningPrivileged ); + + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if( configUSE_TIMERS == 1 ) + const char * MPU_pcTimerGetName( TimerHandle_t xTimer ) + { + const char * pcReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + pcReturn = pcTimerGetName( xTimer ); + vPortResetPrivilege( xRunningPrivileged ); + + return pcReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if( configUSE_TIMERS == 1 ) + TickType_t MPU_xTimerGetPeriod( TimerHandle_t xTimer ) + { + TickType_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xTimerGetPeriod( xTimer ); + vPortResetPrivilege( xRunningPrivileged ); + + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if( configUSE_TIMERS == 1 ) + TickType_t MPU_xTimerGetExpiryTime( TimerHandle_t xTimer ) + { + TickType_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xTimerGetExpiryTime( xTimer ); + vPortResetPrivilege( xRunningPrivileged ); + + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if( configUSE_TIMERS == 1 ) + BaseType_t MPU_xTimerGenericCommand( TimerHandle_t xTimer, const BaseType_t xCommandID, const TickType_t xOptionalValue, BaseType_t * const pxHigherPriorityTaskWoken, const TickType_t xTicksToWait ) + { + BaseType_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xTimerGenericCommand( xTimer, xCommandID, xOptionalValue, pxHigherPriorityTaskWoken, xTicksToWait ); + vPortResetPrivilege( xRunningPrivileged ); + + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + EventGroupHandle_t MPU_xEventGroupCreate( void ) + { + EventGroupHandle_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xEventGroupCreate(); + vPortResetPrivilege( xRunningPrivileged ); + + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + EventGroupHandle_t MPU_xEventGroupCreateStatic( StaticEventGroup_t *pxEventGroupBuffer ) + { + EventGroupHandle_t xReturn; + BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xEventGroupCreateStatic( pxEventGroupBuffer ); + vPortResetPrivilege( xRunningPrivileged ); + + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +EventBits_t MPU_xEventGroupWaitBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToWaitFor, const BaseType_t xClearOnExit, const BaseType_t xWaitForAllBits, TickType_t xTicksToWait ) +{ +EventBits_t xReturn; +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xEventGroupWaitBits( xEventGroup, uxBitsToWaitFor, xClearOnExit, xWaitForAllBits, xTicksToWait ); + vPortResetPrivilege( xRunningPrivileged ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +EventBits_t MPU_xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear ) +{ +EventBits_t xReturn; +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xEventGroupClearBits( xEventGroup, uxBitsToClear ); + vPortResetPrivilege( xRunningPrivileged ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +EventBits_t MPU_xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet ) +{ +EventBits_t xReturn; +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xEventGroupSetBits( xEventGroup, uxBitsToSet ); + vPortResetPrivilege( xRunningPrivileged ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +EventBits_t MPU_xEventGroupSync( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, const EventBits_t uxBitsToWaitFor, TickType_t xTicksToWait ) +{ +EventBits_t xReturn; +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + xReturn = xEventGroupSync( xEventGroup, uxBitsToSet, uxBitsToWaitFor, xTicksToWait ); + vPortResetPrivilege( xRunningPrivileged ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +void MPU_vEventGroupDelete( EventGroupHandle_t xEventGroup ) +{ +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + vEventGroupDelete( xEventGroup ); + vPortResetPrivilege( xRunningPrivileged ); +} +/*-----------------------------------------------------------*/ + + + + + +/* Functions that the application writer wants to execute in privileged mode +can be defined in application_defined_privileged_functions.h. The functions +must take the same format as those above whereby the privilege state on exit +equals the privilege state on entry. For example: + +void MPU_FunctionName( [parameters ] ) +{ +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + FunctionName( [parameters ] ); + + vPortResetPrivilege( xRunningPrivileged ); +} +*/ + +#if configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS == 1 + #include "application_defined_privileged_functions.h" +#endif diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM7_AT91FR40008/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM7_AT91FR40008/port.c new file mode 100644 index 0000000..29710c0 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM7_AT91FR40008/port.c @@ -0,0 +1,280 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the Atmel AT91R40008 + * port. + * + * Components that can be compiled to either ARM or THUMB mode are + * contained in this file. The ISR routines, which can only be compiled + * to ARM mode are contained in portISR.c. + *----------------------------------------------------------*/ + +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Hardware specific definitions. */ +#include "AT91R40008.h" +#include "pio.h" +#include "aic.h" +#include "tc.h" + +/* Constants required to setup the task context. */ +#define portINITIAL_SPSR ( ( StackType_t ) 0x1f ) /* System mode, ARM mode, interrupts enabled. */ +#define portTHUMB_MODE_BIT ( ( StackType_t ) 0x20 ) +#define portINSTRUCTION_SIZE ( ( StackType_t ) 4 ) +#define portNO_CRITICAL_SECTION_NESTING ( ( StackType_t ) 0 ) +#define portTICK_PRIORITY_6 ( 6 ) +/*-----------------------------------------------------------*/ + +/* Setup the timer to generate the tick interrupts. */ +static void prvSetupTimerInterrupt( void ); + +/* + * The scheduler can only be started from ARM mode, so + * vPortISRStartFirstSTask() is defined in portISR.c. + */ +extern void vPortISRStartFirstTask( void ); + +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been called. + * + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +StackType_t *pxOriginalTOS; + + pxOriginalTOS = pxTopOfStack; + + /* To ensure asserts in tasks.c don't fail, although in this case the assert + is not really required. */ + pxTopOfStack--; + + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. */ + + /* First on the stack is the return address - which in this case is the + start of the task. The offset is added to make the return address appear + as it would within an IRQ ISR. */ + *pxTopOfStack = ( StackType_t ) pxCode + portINSTRUCTION_SIZE; + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) 0xaaaaaaaa; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxOriginalTOS; /* Stack used when task starts goes in R13. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */ + pxTopOfStack--; + + /* When the task starts is will expect to find the function parameter in + R0. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + + /* The last thing onto the stack is the status register, which is set for + system mode, with interrupts enabled. */ + *pxTopOfStack = ( StackType_t ) portINITIAL_SPSR; + + #ifdef THUMB_INTERWORK + { + /* We want the task to start in thumb mode. */ + *pxTopOfStack |= portTHUMB_MODE_BIT; + } + #endif + + pxTopOfStack--; + + /* Some optimisation levels use the stack differently to others. This + means the interrupt flags cannot always be stored on the stack and will + instead be stored in a variable, which is then saved as part of the + tasks context. */ + *pxTopOfStack = portNO_CRITICAL_SECTION_NESTING; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + prvSetupTimerInterrupt(); + + /* Start the first task. */ + vPortISRStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the ARM port will require this function as there + is nothing to return to. */ +} +/*-----------------------------------------------------------*/ + +/* + * Setup the tick timer to generate the tick interrupts at the required frequency. + */ +static void prvSetupTimerInterrupt( void ) +{ +volatile uint32_t ulDummy; + + /* Enable clock to the tick timer... */ + AT91C_BASE_PS->PS_PCER = portTIMER_CLK_ENABLE_BIT; + + /* Stop the tick timer... */ + portTIMER_REG_BASE_PTR->TC_CCR = TC_CLKDIS; + + /* Start with tick timer interrupts disabled... */ + portTIMER_REG_BASE_PTR->TC_IDR = 0xFFFFFFFF; + + /* Clear any pending tick timer interrupts... */ + ulDummy = portTIMER_REG_BASE_PTR->TC_SR; + + /* Store interrupt handler function address in tick timer vector register... + The ISR installed depends on whether the preemptive or cooperative + scheduler is being used. */ + #if configUSE_PREEMPTION == 1 + { + extern void ( vPreemptiveTick )( void ); + AT91C_BASE_AIC->AIC_SVR[portTIMER_AIC_CHANNEL] = ( uint32_t ) vPreemptiveTick; + } + #else // else use cooperative scheduler + { + extern void ( vNonPreemptiveTick )( void ); + AT91C_BASE_AIC->AIC_SVR[portTIMER_AIC_CHANNEL] = ( uint32_t ) vNonPreemptiveTick; + } + #endif + + /* Tick timer interrupt level-sensitive, priority 6... */ + AT91C_BASE_AIC->AIC_SMR[ portTIMER_AIC_CHANNEL ] = AIC_SRCTYPE_INT_LEVEL_SENSITIVE | portTICK_PRIORITY_6; + + /* Enable the tick timer interrupt... + + First at timer level */ + portTIMER_REG_BASE_PTR->TC_IER = TC_CPCS; + + /* Then at the AIC level. */ + AT91C_BASE_AIC->AIC_IECR = (1 << portTIMER_AIC_CHANNEL); + + /* Calculate timer compare value to achieve the desired tick rate... */ + if( (configCPU_CLOCK_HZ / (configTICK_RATE_HZ * 2) ) <= 0xFFFF ) + { + /* The tick rate is fast enough for us to use the faster timer input + clock (main clock / 2). */ + portTIMER_REG_BASE_PTR->TC_CMR = TC_WAVE | TC_CLKS_MCK2 | TC_BURST_NONE | TC_CPCTRG; + portTIMER_REG_BASE_PTR->TC_RC = configCPU_CLOCK_HZ / (configTICK_RATE_HZ * 2); + } + else + { + /* We must use a slower timer input clock (main clock / 8) because the + tick rate is too slow for the faster input clock. */ + portTIMER_REG_BASE_PTR->TC_CMR = TC_WAVE | TC_CLKS_MCK8 | TC_BURST_NONE | TC_CPCTRG; + portTIMER_REG_BASE_PTR->TC_RC = configCPU_CLOCK_HZ / (configTICK_RATE_HZ * 8); + } + + /* Start tick timer... */ + portTIMER_REG_BASE_PTR->TC_CCR = TC_SWTRG | TC_CLKEN; +} +/*-----------------------------------------------------------*/ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM7_AT91FR40008/portISR.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM7_AT91FR40008/portISR.c new file mode 100644 index 0000000..73e9b28 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM7_AT91FR40008/portISR.c @@ -0,0 +1,275 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +/*----------------------------------------------------------- + * Components that can be compiled to either ARM or THUMB mode are + * contained in port.c The ISR routines, which can only be compiled + * to ARM mode, are contained in this file. + *----------------------------------------------------------*/ + +/* + Changes from V3.2.4 + + + The assembler statements are now included in a single asm block rather + than each line having its own asm block. +*/ + + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Constants required to handle interrupts. */ +#define portCLEAR_AIC_INTERRUPT ( ( uint32_t ) 0 ) + +/* Constants required to handle critical sections. */ +#define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) +volatile uint32_t ulCriticalNesting = 9999UL; + +/*-----------------------------------------------------------*/ + +/* ISR to handle manual context switches (from a call to taskYIELD()). */ +void vPortYieldProcessor( void ) __attribute__((interrupt("SWI"), naked)); + +/* + * The scheduler can only be started from ARM mode, hence the inclusion of this + * function here. + */ +void vPortISRStartFirstTask( void ); +/*-----------------------------------------------------------*/ + +void vPortISRStartFirstTask( void ) +{ + /* Simply start the scheduler. This is included here as it can only be + called from ARM mode. */ + portRESTORE_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +/* + * Called by portYIELD() or taskYIELD() to manually force a context switch. + * + * When a context switch is performed from the task level the saved task + * context is made to look as if it occurred from within the tick ISR. This + * way the same restore context function can be used when restoring the context + * saved from the ISR or that saved from a call to vPortYieldProcessor. + */ +void vPortYieldProcessor( void ) +{ + /* Within an IRQ ISR the link register has an offset from the true return + address, but an SWI ISR does not. Add the offset manually so the same + ISR return code can be used in both cases. */ + asm volatile ( "ADD LR, LR, #4" ); + + /* Perform the context switch. First save the context of the current task. */ + portSAVE_CONTEXT(); + + /* Find the highest priority task that is ready to run. */ + vTaskSwitchContext(); + + /* Restore the context of the new task. */ + portRESTORE_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +/* + * The ISR used for the scheduler tick depends on whether the cooperative or + * the preemptive scheduler is being used. + */ + +#if configUSE_PREEMPTION == 0 + + /* The cooperative scheduler requires a normal IRQ service routine to + simply increment the system tick. */ + void vNonPreemptiveTick( void ) __attribute__ ((interrupt ("IRQ"))); + void vNonPreemptiveTick( void ) + { + static volatile uint32_t ulDummy; + + /* Clear tick timer interrupt indication. */ + ulDummy = portTIMER_REG_BASE_PTR->TC_SR; + + xTaskIncrementTick(); + + /* Acknowledge the interrupt at AIC level... */ + AT91C_BASE_AIC->AIC_EOICR = portCLEAR_AIC_INTERRUPT; + } + +#else /* else preemption is turned on */ + + /* The preemptive scheduler is defined as "naked" as the full context is + saved on entry as part of the context switch. */ + void vPreemptiveTick( void ) __attribute__((naked)); + void vPreemptiveTick( void ) + { + /* Save the context of the interrupted task. */ + portSAVE_CONTEXT(); + + /* WARNING - Do not use local (stack) variables here. Use globals + if you must! */ + static volatile uint32_t ulDummy; + + /* Clear tick timer interrupt indication. */ + ulDummy = portTIMER_REG_BASE_PTR->TC_SR; + + /* Increment the RTOS tick count, then look for the highest priority + task that is ready to run. */ + if( xTaskIncrementTick() != pdFALSE ) + { + vTaskSwitchContext(); + } + + /* Acknowledge the interrupt at AIC level... */ + AT91C_BASE_AIC->AIC_EOICR = portCLEAR_AIC_INTERRUPT; + + /* Restore the context of the new task. */ + portRESTORE_CONTEXT(); + } + +#endif +/*-----------------------------------------------------------*/ + +/* + * The interrupt management utilities can only be called from ARM mode. When + * THUMB_INTERWORK is defined the utilities are defined as functions here to + * ensure a switch to ARM mode. When THUMB_INTERWORK is not defined then + * the utilities are defined as macros in portmacro.h - as per other ports. + */ +#ifdef THUMB_INTERWORK + + void vPortDisableInterruptsFromThumb( void ) __attribute__ ((naked)); + void vPortEnableInterruptsFromThumb( void ) __attribute__ ((naked)); + + void vPortDisableInterruptsFromThumb( void ) + { + asm volatile ( + "STMDB SP!, {R0} \n\t" /* Push R0. */ + "MRS R0, CPSR \n\t" /* Get CPSR. */ + "ORR R0, R0, #0xC0 \n\t" /* Disable IRQ, FIQ. */ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ + "LDMIA SP!, {R0} \n\t" /* Pop R0. */ + "BX R14" ); /* Return back to thumb. */ + } + + void vPortEnableInterruptsFromThumb( void ) + { + asm volatile ( + "STMDB SP!, {R0} \n\t" /* Push R0. */ + "MRS R0, CPSR \n\t" /* Get CPSR. */ + "BIC R0, R0, #0xC0 \n\t" /* Enable IRQ, FIQ. */ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ + "LDMIA SP!, {R0} \n\t" /* Pop R0. */ + "BX R14" ); /* Return back to thumb. */ + } + +#endif /* THUMB_INTERWORK */ + +/* The code generated by the GCC compiler uses the stack in different ways at +different optimisation levels. The interrupt flags can therefore not always +be saved to the stack. Instead the critical section nesting level is stored +in a variable, which is then saved as part of the stack context. */ +void vPortEnterCritical( void ) +{ + /* Disable interrupts as per portDISABLE_INTERRUPTS(); */ + asm volatile ( + "STMDB SP!, {R0} \n\t" /* Push R0. */ + "MRS R0, CPSR \n\t" /* Get CPSR. */ + "ORR R0, R0, #0xC0 \n\t" /* Disable IRQ, FIQ. */ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ + "LDMIA SP!, {R0}" ); /* Pop R0. */ + + /* Now interrupts are disabled ulCriticalNesting can be accessed + directly. Increment ulCriticalNesting to keep a count of how many times + portENTER_CRITICAL() has been called. */ + ulCriticalNesting++; +} + +void vPortExitCritical( void ) +{ + if( ulCriticalNesting > portNO_CRITICAL_NESTING ) + { + /* Decrement the nesting count as we are leaving a critical section. */ + ulCriticalNesting--; + + /* If the nesting level has reached zero then interrupts should be + re-enabled. */ + if( ulCriticalNesting == portNO_CRITICAL_NESTING ) + { + /* Enable interrupts as per portEXIT_CRITICAL(). */ + asm volatile ( + "STMDB SP!, {R0} \n\t" /* Push R0. */ + "MRS R0, CPSR \n\t" /* Get CPSR. */ + "BIC R0, R0, #0xC0 \n\t" /* Enable IRQ, FIQ. */ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ + "LDMIA SP!, {R0}" ); /* Pop R0. */ + } + } +} + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM7_AT91FR40008/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM7_AT91FR40008/portmacro.h new file mode 100644 index 0000000..a4819b0 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM7_AT91FR40008/portmacro.h @@ -0,0 +1,297 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* + Changes from V3.2.3 + + + Modified portENTER_SWITCHING_ISR() to allow use with GCC V4.0.1. + + Changes from V3.2.4 + + + Removed the use of the %0 parameter within the assembler macros and + replaced them with hard coded registers. This will ensure the + assembler does not select the link register as the temp register as + was occasionally happening previously. + + + The assembler statements are now included in a single asm block rather + than each line having its own asm block. + + Changes from V4.5.0 + + + Removed the portENTER_SWITCHING_ISR() and portEXIT_SWITCHING_ISR() macros + and replaced them with portYIELD_FROM_ISR() macro. Application code + should now make use of the portSAVE_CONTEXT() and portRESTORE_CONTEXT() + macros as per the V4.5.1 demo code. +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +#define portYIELD() asm volatile ( "SWI 0" ) +#define portNOP() asm volatile ( "NOP" ) + +/* + * These define the timer to use for generating the tick interrupt. + * They are put in this file so they can be shared between "port.c" + * and "portisr.c". + */ +#define portTIMER_REG_BASE_PTR AT91C_BASE_TC0 +#define portTIMER_CLK_ENABLE_BIT AT91C_PS_TC0 +#define portTIMER_AIC_CHANNEL ( ( uint32_t ) 4 ) +/*-----------------------------------------------------------*/ + +/* Task utilities. */ + +/* + * portRESTORE_CONTEXT, portRESTORE_CONTEXT, portENTER_SWITCHING_ISR + * and portEXIT_SWITCHING_ISR can only be called from ARM mode, but + * are included here for efficiency. An attempt to call one from + * THUMB mode code will result in a compile time error. + */ + +#define portRESTORE_CONTEXT() \ +{ \ +extern volatile void * volatile pxCurrentTCB; \ +extern volatile uint32_t ulCriticalNesting; \ + \ + /* Set the LR to the task stack. */ \ + asm volatile ( \ + "LDR R0, =pxCurrentTCB \n\t" \ + "LDR R0, [R0] \n\t" \ + "LDR LR, [R0] \n\t" \ + \ + /* The critical nesting depth is the first item on the stack. */ \ + /* Load it into the ulCriticalNesting variable. */ \ + "LDR R0, =ulCriticalNesting \n\t" \ + "LDMFD LR!, {R1} \n\t" \ + "STR R1, [R0] \n\t" \ + \ + /* Get the SPSR from the stack. */ \ + "LDMFD LR!, {R0} \n\t" \ + "MSR SPSR, R0 \n\t" \ + \ + /* Restore all system mode registers for the task. */ \ + "LDMFD LR, {R0-R14}^ \n\t" \ + "NOP \n\t" \ + \ + /* Restore the return address. */ \ + "LDR LR, [LR, #+60] \n\t" \ + \ + /* And return - correcting the offset in the LR to obtain the */ \ + /* correct address. */ \ + "SUBS PC, LR, #4 \n\t" \ + ); \ + ( void ) ulCriticalNesting; \ + ( void ) pxCurrentTCB; \ +} +/*-----------------------------------------------------------*/ + +#define portSAVE_CONTEXT() \ +{ \ +extern volatile void * volatile pxCurrentTCB; \ +extern volatile uint32_t ulCriticalNesting; \ + \ + /* Push R0 as we are going to use the register. */ \ + asm volatile ( \ + "STMDB SP!, {R0} \n\t" \ + \ + /* Set R0 to point to the task stack pointer. */ \ + "STMDB SP,{SP}^ \n\t" \ + "NOP \n\t" \ + "SUB SP, SP, #4 \n\t" \ + "LDMIA SP!,{R0} \n\t" \ + \ + /* Push the return address onto the stack. */ \ + "STMDB R0!, {LR} \n\t" \ + \ + /* Now we have saved LR we can use it instead of R0. */ \ + "MOV LR, R0 \n\t" \ + \ + /* Pop R0 so we can save it onto the system mode stack. */ \ + "LDMIA SP!, {R0} \n\t" \ + \ + /* Push all the system mode registers onto the task stack. */ \ + "STMDB LR,{R0-LR}^ \n\t" \ + "NOP \n\t" \ + "SUB LR, LR, #60 \n\t" \ + \ + /* Push the SPSR onto the task stack. */ \ + "MRS R0, SPSR \n\t" \ + "STMDB LR!, {R0} \n\t" \ + \ + "LDR R0, =ulCriticalNesting \n\t" \ + "LDR R0, [R0] \n\t" \ + "STMDB LR!, {R0} \n\t" \ + \ + /* Store the new top of stack for the task. */ \ + "LDR R0, =pxCurrentTCB \n\t" \ + "LDR R0, [R0] \n\t" \ + "STR LR, [R0] \n\t" \ + ); \ + ( void ) ulCriticalNesting; \ + ( void ) pxCurrentTCB; \ +} + +#define portYIELD_FROM_ISR() vTaskSwitchContext() + +/* Critical section handling. */ + +/* + * The interrupt management utilities can only be called from ARM mode. When + * THUMB_INTERWORK is defined the utilities are defined as functions in + * portISR.c to ensure a switch to ARM mode. When THUMB_INTERWORK is not + * defined then the utilities are defined as macros here - as per other ports. + */ + +#ifdef THUMB_INTERWORK + + extern void vPortDisableInterruptsFromThumb( void ) __attribute__ ((naked)); + extern void vPortEnableInterruptsFromThumb( void ) __attribute__ ((naked)); + + #define portDISABLE_INTERRUPTS() vPortDisableInterruptsFromThumb() + #define portENABLE_INTERRUPTS() vPortEnableInterruptsFromThumb() + +#else + + #define portDISABLE_INTERRUPTS() \ + asm volatile ( \ + "STMDB SP!, {R0} \n\t" /* Push R0. */ \ + "MRS R0, CPSR \n\t" /* Get CPSR. */ \ + "ORR R0, R0, #0xC0 \n\t" /* Disable IRQ, FIQ. */ \ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ \ + "LDMIA SP!, {R0} " ) /* Pop R0. */ + + #define portENABLE_INTERRUPTS() \ + asm volatile ( \ + "STMDB SP!, {R0} \n\t" /* Push R0. */ \ + "MRS R0, CPSR \n\t" /* Get CPSR. */ \ + "BIC R0, R0, #0xC0 \n\t" /* Enable IRQ, FIQ. */ \ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ \ + "LDMIA SP!, {R0} " ) /* Pop R0. */ + +#endif /* THUMB_INTERWORK */ + +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); + +#define portENTER_CRITICAL() vPortEnterCritical(); +#define portEXIT_CRITICAL() vPortExitCritical(); + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM7_AT91SAM7S/AT91SAM7X256.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM7_AT91SAM7S/AT91SAM7X256.h new file mode 100644 index 0000000..a14279e --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM7_AT91SAM7S/AT91SAM7X256.h @@ -0,0 +1,2731 @@ +// ---------------------------------------------------------------------------- +// ATMEL Microcontroller Software Support - ROUSSET - +// ---------------------------------------------------------------------------- +// DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR +// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE +// DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT, +// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- +// File Name : AT91SAM7X256.h +// Object : AT91SAM7X256 definitions +// Generated : AT91 SW Application Group 05/20/2005 (16:22:29) +// +// CVS Reference : /AT91SAM7X256.pl/1.11/Tue May 10 12:15:32 2005// +// CVS Reference : /SYS_SAM7X.pl/1.3/Tue Feb 1 17:01:43 2005// +// CVS Reference : /MC_SAM7X.pl/1.2/Fri May 20 14:13:04 2005// +// CVS Reference : /PMC_SAM7X.pl/1.4/Tue Feb 8 13:58:10 2005// +// CVS Reference : /RSTC_SAM7X.pl/1.1/Tue Feb 1 16:16:26 2005// +// CVS Reference : /UDP_SAM7X.pl/1.1/Tue May 10 11:35:35 2005// +// CVS Reference : /PWM_SAM7X.pl/1.1/Tue May 10 11:53:07 2005// +// CVS Reference : /AIC_6075B.pl/1.3/Fri May 20 14:01:30 2005// +// CVS Reference : /PIO_6057A.pl/1.2/Thu Feb 3 10:18:28 2005// +// CVS Reference : /RTTC_6081A.pl/1.2/Tue Nov 9 14:43:58 2004// +// CVS Reference : /PITC_6079A.pl/1.2/Tue Nov 9 14:43:56 2004// +// CVS Reference : /WDTC_6080A.pl/1.3/Tue Nov 9 14:44:00 2004// +// CVS Reference : /VREG_6085B.pl/1.1/Tue Feb 1 16:05:48 2005// +// CVS Reference : /PDC_6074C.pl/1.2/Thu Feb 3 08:48:54 2005// +// CVS Reference : /DBGU_6059D.pl/1.1/Mon Jan 31 13:15:32 2005// +// CVS Reference : /SPI_6088D.pl/1.3/Fri May 20 14:08:59 2005// +// CVS Reference : /US_6089C.pl/1.1/Mon Jul 12 18:23:26 2004// +// CVS Reference : /SSC_6078A.pl/1.1/Tue Jul 13 07:45:40 2004// +// CVS Reference : /TWI_6061A.pl/1.1/Tue Jul 13 07:38:06 2004// +// CVS Reference : /TC_6082A.pl/1.7/Fri Mar 11 12:52:17 2005// +// CVS Reference : /CAN_6019B.pl/1.1/Tue Mar 8 12:42:22 2005// +// CVS Reference : /EMACB_6119A.pl/1.5/Thu Feb 3 15:52:04 2005// +// CVS Reference : /ADC_6051C.pl/1.1/Fri Oct 17 09:12:38 2003// +// CVS Reference : /AES_6149A.pl/1.10/Mon Feb 7 09:44:25 2005// +// CVS Reference : /DES3_6150A.pl/1.1/Mon Jan 17 08:34:31 2005// +// ---------------------------------------------------------------------------- + +#ifndef AT91SAM7X256_H +#define AT91SAM7X256_H + +typedef volatile unsigned int AT91_REG;// Hardware register definition + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR System Peripherals +// ***************************************************************************** +typedef struct _AT91S_SYS { + AT91_REG AIC_SMR[32]; // Source Mode Register + AT91_REG AIC_SVR[32]; // Source Vector Register + AT91_REG AIC_IVR; // IRQ Vector Register + AT91_REG AIC_FVR; // FIQ Vector Register + AT91_REG AIC_ISR; // Interrupt Status Register + AT91_REG AIC_IPR; // Interrupt Pending Register + AT91_REG AIC_IMR; // Interrupt Mask Register + AT91_REG AIC_CISR; // Core Interrupt Status Register + AT91_REG Reserved0[2]; // + AT91_REG AIC_IECR; // Interrupt Enable Command Register + AT91_REG AIC_IDCR; // Interrupt Disable Command Register + AT91_REG AIC_ICCR; // Interrupt Clear Command Register + AT91_REG AIC_ISCR; // Interrupt Set Command Register + AT91_REG AIC_EOICR; // End of Interrupt Command Register + AT91_REG AIC_SPU; // Spurious Vector Register + AT91_REG AIC_DCR; // Debug Control Register (Protect) + AT91_REG Reserved1[1]; // + AT91_REG AIC_FFER; // Fast Forcing Enable Register + AT91_REG AIC_FFDR; // Fast Forcing Disable Register + AT91_REG AIC_FFSR; // Fast Forcing Status Register + AT91_REG Reserved2[45]; // + AT91_REG DBGU_CR; // Control Register + AT91_REG DBGU_MR; // Mode Register + AT91_REG DBGU_IER; // Interrupt Enable Register + AT91_REG DBGU_IDR; // Interrupt Disable Register + AT91_REG DBGU_IMR; // Interrupt Mask Register + AT91_REG DBGU_CSR; // Channel Status Register + AT91_REG DBGU_RHR; // Receiver Holding Register + AT91_REG DBGU_THR; // Transmitter Holding Register + AT91_REG DBGU_BRGR; // Baud Rate Generator Register + AT91_REG Reserved3[7]; // + AT91_REG DBGU_CIDR; // Chip ID Register + AT91_REG DBGU_EXID; // Chip ID Extension Register + AT91_REG DBGU_FNTR; // Force NTRST Register + AT91_REG Reserved4[45]; // + AT91_REG DBGU_RPR; // Receive Pointer Register + AT91_REG DBGU_RCR; // Receive Counter Register + AT91_REG DBGU_TPR; // Transmit Pointer Register + AT91_REG DBGU_TCR; // Transmit Counter Register + AT91_REG DBGU_RNPR; // Receive Next Pointer Register + AT91_REG DBGU_RNCR; // Receive Next Counter Register + AT91_REG DBGU_TNPR; // Transmit Next Pointer Register + AT91_REG DBGU_TNCR; // Transmit Next Counter Register + AT91_REG DBGU_PTCR; // PDC Transfer Control Register + AT91_REG DBGU_PTSR; // PDC Transfer Status Register + AT91_REG Reserved5[54]; // + AT91_REG PIOA_PER; // PIO Enable Register + AT91_REG PIOA_PDR; // PIO Disable Register + AT91_REG PIOA_PSR; // PIO Status Register + AT91_REG Reserved6[1]; // + AT91_REG PIOA_OER; // Output Enable Register + AT91_REG PIOA_ODR; // Output Disable Registerr + AT91_REG PIOA_OSR; // Output Status Register + AT91_REG Reserved7[1]; // + AT91_REG PIOA_IFER; // Input Filter Enable Register + AT91_REG PIOA_IFDR; // Input Filter Disable Register + AT91_REG PIOA_IFSR; // Input Filter Status Register + AT91_REG Reserved8[1]; // + AT91_REG PIOA_SODR; // Set Output Data Register + AT91_REG PIOA_CODR; // Clear Output Data Register + AT91_REG PIOA_ODSR; // Output Data Status Register + AT91_REG PIOA_PDSR; // Pin Data Status Register + AT91_REG PIOA_IER; // Interrupt Enable Register + AT91_REG PIOA_IDR; // Interrupt Disable Register + AT91_REG PIOA_IMR; // Interrupt Mask Register + AT91_REG PIOA_ISR; // Interrupt Status Register + AT91_REG PIOA_MDER; // Multi-driver Enable Register + AT91_REG PIOA_MDDR; // Multi-driver Disable Register + AT91_REG PIOA_MDSR; // Multi-driver Status Register + AT91_REG Reserved9[1]; // + AT91_REG PIOA_PPUDR; // Pull-up Disable Register + AT91_REG PIOA_PPUER; // Pull-up Enable Register + AT91_REG PIOA_PPUSR; // Pull-up Status Register + AT91_REG Reserved10[1]; // + AT91_REG PIOA_ASR; // Select A Register + AT91_REG PIOA_BSR; // Select B Register + AT91_REG PIOA_ABSR; // AB Select Status Register + AT91_REG Reserved11[9]; // + AT91_REG PIOA_OWER; // Output Write Enable Register + AT91_REG PIOA_OWDR; // Output Write Disable Register + AT91_REG PIOA_OWSR; // Output Write Status Register + AT91_REG Reserved12[85]; // + AT91_REG PIOB_PER; // PIO Enable Register + AT91_REG PIOB_PDR; // PIO Disable Register + AT91_REG PIOB_PSR; // PIO Status Register + AT91_REG Reserved13[1]; // + AT91_REG PIOB_OER; // Output Enable Register + AT91_REG PIOB_ODR; // Output Disable Registerr + AT91_REG PIOB_OSR; // Output Status Register + AT91_REG Reserved14[1]; // + AT91_REG PIOB_IFER; // Input Filter Enable Register + AT91_REG PIOB_IFDR; // Input Filter Disable Register + AT91_REG PIOB_IFSR; // Input Filter Status Register + AT91_REG Reserved15[1]; // + AT91_REG PIOB_SODR; // Set Output Data Register + AT91_REG PIOB_CODR; // Clear Output Data Register + AT91_REG PIOB_ODSR; // Output Data Status Register + AT91_REG PIOB_PDSR; // Pin Data Status Register + AT91_REG PIOB_IER; // Interrupt Enable Register + AT91_REG PIOB_IDR; // Interrupt Disable Register + AT91_REG PIOB_IMR; // Interrupt Mask Register + AT91_REG PIOB_ISR; // Interrupt Status Register + AT91_REG PIOB_MDER; // Multi-driver Enable Register + AT91_REG PIOB_MDDR; // Multi-driver Disable Register + AT91_REG PIOB_MDSR; // Multi-driver Status Register + AT91_REG Reserved16[1]; // + AT91_REG PIOB_PPUDR; // Pull-up Disable Register + AT91_REG PIOB_PPUER; // Pull-up Enable Register + AT91_REG PIOB_PPUSR; // Pull-up Status Register + AT91_REG Reserved17[1]; // + AT91_REG PIOB_ASR; // Select A Register + AT91_REG PIOB_BSR; // Select B Register + AT91_REG PIOB_ABSR; // AB Select Status Register + AT91_REG Reserved18[9]; // + AT91_REG PIOB_OWER; // Output Write Enable Register + AT91_REG PIOB_OWDR; // Output Write Disable Register + AT91_REG PIOB_OWSR; // Output Write Status Register + AT91_REG Reserved19[341]; // + AT91_REG PMC_SCER; // System Clock Enable Register + AT91_REG PMC_SCDR; // System Clock Disable Register + AT91_REG PMC_SCSR; // System Clock Status Register + AT91_REG Reserved20[1]; // + AT91_REG PMC_PCER; // Peripheral Clock Enable Register + AT91_REG PMC_PCDR; // Peripheral Clock Disable Register + AT91_REG PMC_PCSR; // Peripheral Clock Status Register + AT91_REG Reserved21[1]; // + AT91_REG PMC_MOR; // Main Oscillator Register + AT91_REG PMC_MCFR; // Main Clock Frequency Register + AT91_REG Reserved22[1]; // + AT91_REG PMC_PLLR; // PLL Register + AT91_REG PMC_MCKR; // Master Clock Register + AT91_REG Reserved23[3]; // + AT91_REG PMC_PCKR[4]; // Programmable Clock Register + AT91_REG Reserved24[4]; // + AT91_REG PMC_IER; // Interrupt Enable Register + AT91_REG PMC_IDR; // Interrupt Disable Register + AT91_REG PMC_SR; // Status Register + AT91_REG PMC_IMR; // Interrupt Mask Register + AT91_REG Reserved25[36]; // + AT91_REG RSTC_RCR; // Reset Control Register + AT91_REG RSTC_RSR; // Reset Status Register + AT91_REG RSTC_RMR; // Reset Mode Register + AT91_REG Reserved26[5]; // + AT91_REG RTTC_RTMR; // Real-time Mode Register + AT91_REG RTTC_RTAR; // Real-time Alarm Register + AT91_REG RTTC_RTVR; // Real-time Value Register + AT91_REG RTTC_RTSR; // Real-time Status Register + AT91_REG PITC_PIMR; // Period Interval Mode Register + AT91_REG PITC_PISR; // Period Interval Status Register + AT91_REG PITC_PIVR; // Period Interval Value Register + AT91_REG PITC_PIIR; // Period Interval Image Register + AT91_REG WDTC_WDCR; // Watchdog Control Register + AT91_REG WDTC_WDMR; // Watchdog Mode Register + AT91_REG WDTC_WDSR; // Watchdog Status Register + AT91_REG Reserved27[5]; // + AT91_REG VREG_MR; // Voltage Regulator Mode Register +} AT91S_SYS, *AT91PS_SYS; + + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Advanced Interrupt Controller +// ***************************************************************************** +typedef struct _AT91S_AIC { + AT91_REG AIC_SMR[32]; // Source Mode Register + AT91_REG AIC_SVR[32]; // Source Vector Register + AT91_REG AIC_IVR; // IRQ Vector Register + AT91_REG AIC_FVR; // FIQ Vector Register + AT91_REG AIC_ISR; // Interrupt Status Register + AT91_REG AIC_IPR; // Interrupt Pending Register + AT91_REG AIC_IMR; // Interrupt Mask Register + AT91_REG AIC_CISR; // Core Interrupt Status Register + AT91_REG Reserved0[2]; // + AT91_REG AIC_IECR; // Interrupt Enable Command Register + AT91_REG AIC_IDCR; // Interrupt Disable Command Register + AT91_REG AIC_ICCR; // Interrupt Clear Command Register + AT91_REG AIC_ISCR; // Interrupt Set Command Register + AT91_REG AIC_EOICR; // End of Interrupt Command Register + AT91_REG AIC_SPU; // Spurious Vector Register + AT91_REG AIC_DCR; // Debug Control Register (Protect) + AT91_REG Reserved1[1]; // + AT91_REG AIC_FFER; // Fast Forcing Enable Register + AT91_REG AIC_FFDR; // Fast Forcing Disable Register + AT91_REG AIC_FFSR; // Fast Forcing Status Register +} AT91S_AIC, *AT91PS_AIC; + +// -------- AIC_SMR : (AIC Offset: 0x0) Control Register -------- +#define AT91C_AIC_PRIOR ((unsigned int) 0x7 << 0) // (AIC) Priority Level +#define AT91C_AIC_PRIOR_LOWEST ((unsigned int) 0x0) // (AIC) Lowest priority level +#define AT91C_AIC_PRIOR_HIGHEST ((unsigned int) 0x7) // (AIC) Highest priority level +#define AT91C_AIC_SRCTYPE ((unsigned int) 0x3 << 5) // (AIC) Interrupt Source Type +#define AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL ((unsigned int) 0x0 << 5) // (AIC) Internal Sources Code Label High-level Sensitive +#define AT91C_AIC_SRCTYPE_EXT_LOW_LEVEL ((unsigned int) 0x0 << 5) // (AIC) External Sources Code Label Low-level Sensitive +#define AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE ((unsigned int) 0x1 << 5) // (AIC) Internal Sources Code Label Positive Edge triggered +#define AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE ((unsigned int) 0x1 << 5) // (AIC) External Sources Code Label Negative Edge triggered +#define AT91C_AIC_SRCTYPE_HIGH_LEVEL ((unsigned int) 0x2 << 5) // (AIC) Internal Or External Sources Code Label High-level Sensitive +#define AT91C_AIC_SRCTYPE_POSITIVE_EDGE ((unsigned int) 0x3 << 5) // (AIC) Internal Or External Sources Code Label Positive Edge triggered +// -------- AIC_CISR : (AIC Offset: 0x114) AIC Core Interrupt Status Register -------- +#define AT91C_AIC_NFIQ ((unsigned int) 0x1 << 0) // (AIC) NFIQ Status +#define AT91C_AIC_NIRQ ((unsigned int) 0x1 << 1) // (AIC) NIRQ Status +// -------- AIC_DCR : (AIC Offset: 0x138) AIC Debug Control Register (Protect) -------- +#define AT91C_AIC_DCR_PROT ((unsigned int) 0x1 << 0) // (AIC) Protection Mode +#define AT91C_AIC_DCR_GMSK ((unsigned int) 0x1 << 1) // (AIC) General Mask + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Peripheral DMA Controller +// ***************************************************************************** +typedef struct _AT91S_PDC { + AT91_REG PDC_RPR; // Receive Pointer Register + AT91_REG PDC_RCR; // Receive Counter Register + AT91_REG PDC_TPR; // Transmit Pointer Register + AT91_REG PDC_TCR; // Transmit Counter Register + AT91_REG PDC_RNPR; // Receive Next Pointer Register + AT91_REG PDC_RNCR; // Receive Next Counter Register + AT91_REG PDC_TNPR; // Transmit Next Pointer Register + AT91_REG PDC_TNCR; // Transmit Next Counter Register + AT91_REG PDC_PTCR; // PDC Transfer Control Register + AT91_REG PDC_PTSR; // PDC Transfer Status Register +} AT91S_PDC, *AT91PS_PDC; + +// -------- PDC_PTCR : (PDC Offset: 0x20) PDC Transfer Control Register -------- +#define AT91C_PDC_RXTEN ((unsigned int) 0x1 << 0) // (PDC) Receiver Transfer Enable +#define AT91C_PDC_RXTDIS ((unsigned int) 0x1 << 1) // (PDC) Receiver Transfer Disable +#define AT91C_PDC_TXTEN ((unsigned int) 0x1 << 8) // (PDC) Transmitter Transfer Enable +#define AT91C_PDC_TXTDIS ((unsigned int) 0x1 << 9) // (PDC) Transmitter Transfer Disable +// -------- PDC_PTSR : (PDC Offset: 0x24) PDC Transfer Status Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Debug Unit +// ***************************************************************************** +typedef struct _AT91S_DBGU { + AT91_REG DBGU_CR; // Control Register + AT91_REG DBGU_MR; // Mode Register + AT91_REG DBGU_IER; // Interrupt Enable Register + AT91_REG DBGU_IDR; // Interrupt Disable Register + AT91_REG DBGU_IMR; // Interrupt Mask Register + AT91_REG DBGU_CSR; // Channel Status Register + AT91_REG DBGU_RHR; // Receiver Holding Register + AT91_REG DBGU_THR; // Transmitter Holding Register + AT91_REG DBGU_BRGR; // Baud Rate Generator Register + AT91_REG Reserved0[7]; // + AT91_REG DBGU_CIDR; // Chip ID Register + AT91_REG DBGU_EXID; // Chip ID Extension Register + AT91_REG DBGU_FNTR; // Force NTRST Register + AT91_REG Reserved1[45]; // + AT91_REG DBGU_RPR; // Receive Pointer Register + AT91_REG DBGU_RCR; // Receive Counter Register + AT91_REG DBGU_TPR; // Transmit Pointer Register + AT91_REG DBGU_TCR; // Transmit Counter Register + AT91_REG DBGU_RNPR; // Receive Next Pointer Register + AT91_REG DBGU_RNCR; // Receive Next Counter Register + AT91_REG DBGU_TNPR; // Transmit Next Pointer Register + AT91_REG DBGU_TNCR; // Transmit Next Counter Register + AT91_REG DBGU_PTCR; // PDC Transfer Control Register + AT91_REG DBGU_PTSR; // PDC Transfer Status Register +} AT91S_DBGU, *AT91PS_DBGU; + +// -------- DBGU_CR : (DBGU Offset: 0x0) Debug Unit Control Register -------- +#define AT91C_US_RSTRX ((unsigned int) 0x1 << 2) // (DBGU) Reset Receiver +#define AT91C_US_RSTTX ((unsigned int) 0x1 << 3) // (DBGU) Reset Transmitter +#define AT91C_US_RXEN ((unsigned int) 0x1 << 4) // (DBGU) Receiver Enable +#define AT91C_US_RXDIS ((unsigned int) 0x1 << 5) // (DBGU) Receiver Disable +#define AT91C_US_TXEN ((unsigned int) 0x1 << 6) // (DBGU) Transmitter Enable +#define AT91C_US_TXDIS ((unsigned int) 0x1 << 7) // (DBGU) Transmitter Disable +#define AT91C_US_RSTSTA ((unsigned int) 0x1 << 8) // (DBGU) Reset Status Bits +// -------- DBGU_MR : (DBGU Offset: 0x4) Debug Unit Mode Register -------- +#define AT91C_US_PAR ((unsigned int) 0x7 << 9) // (DBGU) Parity type +#define AT91C_US_PAR_EVEN ((unsigned int) 0x0 << 9) // (DBGU) Even Parity +#define AT91C_US_PAR_ODD ((unsigned int) 0x1 << 9) // (DBGU) Odd Parity +#define AT91C_US_PAR_SPACE ((unsigned int) 0x2 << 9) // (DBGU) Parity forced to 0 (Space) +#define AT91C_US_PAR_MARK ((unsigned int) 0x3 << 9) // (DBGU) Parity forced to 1 (Mark) +#define AT91C_US_PAR_NONE ((unsigned int) 0x4 << 9) // (DBGU) No Parity +#define AT91C_US_PAR_MULTI_DROP ((unsigned int) 0x6 << 9) // (DBGU) Multi-drop mode +#define AT91C_US_CHMODE ((unsigned int) 0x3 << 14) // (DBGU) Channel Mode +#define AT91C_US_CHMODE_NORMAL ((unsigned int) 0x0 << 14) // (DBGU) Normal Mode: The USART channel operates as an RX/TX USART. +#define AT91C_US_CHMODE_AUTO ((unsigned int) 0x1 << 14) // (DBGU) Automatic Echo: Receiver Data Input is connected to the TXD pin. +#define AT91C_US_CHMODE_LOCAL ((unsigned int) 0x2 << 14) // (DBGU) Local Loopback: Transmitter Output Signal is connected to Receiver Input Signal. +#define AT91C_US_CHMODE_REMOTE ((unsigned int) 0x3 << 14) // (DBGU) Remote Loopback: RXD pin is internally connected to TXD pin. +// -------- DBGU_IER : (DBGU Offset: 0x8) Debug Unit Interrupt Enable Register -------- +#define AT91C_US_RXRDY ((unsigned int) 0x1 << 0) // (DBGU) RXRDY Interrupt +#define AT91C_US_TXRDY ((unsigned int) 0x1 << 1) // (DBGU) TXRDY Interrupt +#define AT91C_US_ENDRX ((unsigned int) 0x1 << 3) // (DBGU) End of Receive Transfer Interrupt +#define AT91C_US_ENDTX ((unsigned int) 0x1 << 4) // (DBGU) End of Transmit Interrupt +#define AT91C_US_OVRE ((unsigned int) 0x1 << 5) // (DBGU) Overrun Interrupt +#define AT91C_US_FRAME ((unsigned int) 0x1 << 6) // (DBGU) Framing Error Interrupt +#define AT91C_US_PARE ((unsigned int) 0x1 << 7) // (DBGU) Parity Error Interrupt +#define AT91C_US_TXEMPTY ((unsigned int) 0x1 << 9) // (DBGU) TXEMPTY Interrupt +#define AT91C_US_TXBUFE ((unsigned int) 0x1 << 11) // (DBGU) TXBUFE Interrupt +#define AT91C_US_RXBUFF ((unsigned int) 0x1 << 12) // (DBGU) RXBUFF Interrupt +#define AT91C_US_COMM_TX ((unsigned int) 0x1 << 30) // (DBGU) COMM_TX Interrupt +#define AT91C_US_COMM_RX ((unsigned int) 0x1 << 31) // (DBGU) COMM_RX Interrupt +// -------- DBGU_IDR : (DBGU Offset: 0xc) Debug Unit Interrupt Disable Register -------- +// -------- DBGU_IMR : (DBGU Offset: 0x10) Debug Unit Interrupt Mask Register -------- +// -------- DBGU_CSR : (DBGU Offset: 0x14) Debug Unit Channel Status Register -------- +// -------- DBGU_FNTR : (DBGU Offset: 0x48) Debug Unit FORCE_NTRST Register -------- +#define AT91C_US_FORCE_NTRST ((unsigned int) 0x1 << 0) // (DBGU) Force NTRST in JTAG + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Parallel Input Output Controler +// ***************************************************************************** +typedef struct _AT91S_PIO { + AT91_REG PIO_PER; // PIO Enable Register + AT91_REG PIO_PDR; // PIO Disable Register + AT91_REG PIO_PSR; // PIO Status Register + AT91_REG Reserved0[1]; // + AT91_REG PIO_OER; // Output Enable Register + AT91_REG PIO_ODR; // Output Disable Registerr + AT91_REG PIO_OSR; // Output Status Register + AT91_REG Reserved1[1]; // + AT91_REG PIO_IFER; // Input Filter Enable Register + AT91_REG PIO_IFDR; // Input Filter Disable Register + AT91_REG PIO_IFSR; // Input Filter Status Register + AT91_REG Reserved2[1]; // + AT91_REG PIO_SODR; // Set Output Data Register + AT91_REG PIO_CODR; // Clear Output Data Register + AT91_REG PIO_ODSR; // Output Data Status Register + AT91_REG PIO_PDSR; // Pin Data Status Register + AT91_REG PIO_IER; // Interrupt Enable Register + AT91_REG PIO_IDR; // Interrupt Disable Register + AT91_REG PIO_IMR; // Interrupt Mask Register + AT91_REG PIO_ISR; // Interrupt Status Register + AT91_REG PIO_MDER; // Multi-driver Enable Register + AT91_REG PIO_MDDR; // Multi-driver Disable Register + AT91_REG PIO_MDSR; // Multi-driver Status Register + AT91_REG Reserved3[1]; // + AT91_REG PIO_PPUDR; // Pull-up Disable Register + AT91_REG PIO_PPUER; // Pull-up Enable Register + AT91_REG PIO_PPUSR; // Pull-up Status Register + AT91_REG Reserved4[1]; // + AT91_REG PIO_ASR; // Select A Register + AT91_REG PIO_BSR; // Select B Register + AT91_REG PIO_ABSR; // AB Select Status Register + AT91_REG Reserved5[9]; // + AT91_REG PIO_OWER; // Output Write Enable Register + AT91_REG PIO_OWDR; // Output Write Disable Register + AT91_REG PIO_OWSR; // Output Write Status Register +} AT91S_PIO, *AT91PS_PIO; + + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Clock Generator Controler +// ***************************************************************************** +typedef struct _AT91S_CKGR { + AT91_REG CKGR_MOR; // Main Oscillator Register + AT91_REG CKGR_MCFR; // Main Clock Frequency Register + AT91_REG Reserved0[1]; // + AT91_REG CKGR_PLLR; // PLL Register +} AT91S_CKGR, *AT91PS_CKGR; + +// -------- CKGR_MOR : (CKGR Offset: 0x0) Main Oscillator Register -------- +#define AT91C_CKGR_MOSCEN ((unsigned int) 0x1 << 0) // (CKGR) Main Oscillator Enable +#define AT91C_CKGR_OSCBYPASS ((unsigned int) 0x1 << 1) // (CKGR) Main Oscillator Bypass +#define AT91C_CKGR_OSCOUNT ((unsigned int) 0xFF << 8) // (CKGR) Main Oscillator Start-up Time +// -------- CKGR_MCFR : (CKGR Offset: 0x4) Main Clock Frequency Register -------- +#define AT91C_CKGR_MAINF ((unsigned int) 0xFFFF << 0) // (CKGR) Main Clock Frequency +#define AT91C_CKGR_MAINRDY ((unsigned int) 0x1 << 16) // (CKGR) Main Clock Ready +// -------- CKGR_PLLR : (CKGR Offset: 0xc) PLL B Register -------- +#define AT91C_CKGR_DIV ((unsigned int) 0xFF << 0) // (CKGR) Divider Selected +#define AT91C_CKGR_DIV_0 ((unsigned int) 0x0) // (CKGR) Divider output is 0 +#define AT91C_CKGR_DIV_BYPASS ((unsigned int) 0x1) // (CKGR) Divider is bypassed +#define AT91C_CKGR_PLLCOUNT ((unsigned int) 0x3F << 8) // (CKGR) PLL Counter +#define AT91C_CKGR_OUT ((unsigned int) 0x3 << 14) // (CKGR) PLL Output Frequency Range +#define AT91C_CKGR_OUT_0 ((unsigned int) 0x0 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_OUT_1 ((unsigned int) 0x1 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_OUT_2 ((unsigned int) 0x2 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_OUT_3 ((unsigned int) 0x3 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_MUL ((unsigned int) 0x7FF << 16) // (CKGR) PLL Multiplier +#define AT91C_CKGR_USBDIV ((unsigned int) 0x3 << 28) // (CKGR) Divider for USB Clocks +#define AT91C_CKGR_USBDIV_0 ((unsigned int) 0x0 << 28) // (CKGR) Divider output is PLL clock output +#define AT91C_CKGR_USBDIV_1 ((unsigned int) 0x1 << 28) // (CKGR) Divider output is PLL clock output divided by 2 +#define AT91C_CKGR_USBDIV_2 ((unsigned int) 0x2 << 28) // (CKGR) Divider output is PLL clock output divided by 4 + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Power Management Controler +// ***************************************************************************** +typedef struct _AT91S_PMC { + AT91_REG PMC_SCER; // System Clock Enable Register + AT91_REG PMC_SCDR; // System Clock Disable Register + AT91_REG PMC_SCSR; // System Clock Status Register + AT91_REG Reserved0[1]; // + AT91_REG PMC_PCER; // Peripheral Clock Enable Register + AT91_REG PMC_PCDR; // Peripheral Clock Disable Register + AT91_REG PMC_PCSR; // Peripheral Clock Status Register + AT91_REG Reserved1[1]; // + AT91_REG PMC_MOR; // Main Oscillator Register + AT91_REG PMC_MCFR; // Main Clock Frequency Register + AT91_REG Reserved2[1]; // + AT91_REG PMC_PLLR; // PLL Register + AT91_REG PMC_MCKR; // Master Clock Register + AT91_REG Reserved3[3]; // + AT91_REG PMC_PCKR[4]; // Programmable Clock Register + AT91_REG Reserved4[4]; // + AT91_REG PMC_IER; // Interrupt Enable Register + AT91_REG PMC_IDR; // Interrupt Disable Register + AT91_REG PMC_SR; // Status Register + AT91_REG PMC_IMR; // Interrupt Mask Register +} AT91S_PMC, *AT91PS_PMC; + +// -------- PMC_SCER : (PMC Offset: 0x0) System Clock Enable Register -------- +#define AT91C_PMC_PCK ((unsigned int) 0x1 << 0) // (PMC) Processor Clock +#define AT91C_PMC_UDP ((unsigned int) 0x1 << 7) // (PMC) USB Device Port Clock +#define AT91C_PMC_PCK0 ((unsigned int) 0x1 << 8) // (PMC) Programmable Clock Output +#define AT91C_PMC_PCK1 ((unsigned int) 0x1 << 9) // (PMC) Programmable Clock Output +#define AT91C_PMC_PCK2 ((unsigned int) 0x1 << 10) // (PMC) Programmable Clock Output +#define AT91C_PMC_PCK3 ((unsigned int) 0x1 << 11) // (PMC) Programmable Clock Output +// -------- PMC_SCDR : (PMC Offset: 0x4) System Clock Disable Register -------- +// -------- PMC_SCSR : (PMC Offset: 0x8) System Clock Status Register -------- +// -------- CKGR_MOR : (PMC Offset: 0x20) Main Oscillator Register -------- +// -------- CKGR_MCFR : (PMC Offset: 0x24) Main Clock Frequency Register -------- +// -------- CKGR_PLLR : (PMC Offset: 0x2c) PLL B Register -------- +// -------- PMC_MCKR : (PMC Offset: 0x30) Master Clock Register -------- +#define AT91C_PMC_CSS ((unsigned int) 0x3 << 0) // (PMC) Programmable Clock Selection +#define AT91C_PMC_CSS_SLOW_CLK ((unsigned int) 0x0) // (PMC) Slow Clock is selected +#define AT91C_PMC_CSS_MAIN_CLK ((unsigned int) 0x1) // (PMC) Main Clock is selected +#define AT91C_PMC_CSS_PLL_CLK ((unsigned int) 0x3) // (PMC) Clock from PLL is selected +#define AT91C_PMC_PRES ((unsigned int) 0x7 << 2) // (PMC) Programmable Clock Prescaler +#define AT91C_PMC_PRES_CLK ((unsigned int) 0x0 << 2) // (PMC) Selected clock +#define AT91C_PMC_PRES_CLK_2 ((unsigned int) 0x1 << 2) // (PMC) Selected clock divided by 2 +#define AT91C_PMC_PRES_CLK_4 ((unsigned int) 0x2 << 2) // (PMC) Selected clock divided by 4 +#define AT91C_PMC_PRES_CLK_8 ((unsigned int) 0x3 << 2) // (PMC) Selected clock divided by 8 +#define AT91C_PMC_PRES_CLK_16 ((unsigned int) 0x4 << 2) // (PMC) Selected clock divided by 16 +#define AT91C_PMC_PRES_CLK_32 ((unsigned int) 0x5 << 2) // (PMC) Selected clock divided by 32 +#define AT91C_PMC_PRES_CLK_64 ((unsigned int) 0x6 << 2) // (PMC) Selected clock divided by 64 +// -------- PMC_PCKR : (PMC Offset: 0x40) Programmable Clock Register -------- +// -------- PMC_IER : (PMC Offset: 0x60) PMC Interrupt Enable Register -------- +#define AT91C_PMC_MOSCS ((unsigned int) 0x1 << 0) // (PMC) MOSC Status/Enable/Disable/Mask +#define AT91C_PMC_LOCK ((unsigned int) 0x1 << 2) // (PMC) PLL Status/Enable/Disable/Mask +#define AT91C_PMC_MCKRDY ((unsigned int) 0x1 << 3) // (PMC) MCK_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK0RDY ((unsigned int) 0x1 << 8) // (PMC) PCK0_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK1RDY ((unsigned int) 0x1 << 9) // (PMC) PCK1_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK2RDY ((unsigned int) 0x1 << 10) // (PMC) PCK2_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK3RDY ((unsigned int) 0x1 << 11) // (PMC) PCK3_RDY Status/Enable/Disable/Mask +// -------- PMC_IDR : (PMC Offset: 0x64) PMC Interrupt Disable Register -------- +// -------- PMC_SR : (PMC Offset: 0x68) PMC Status Register -------- +// -------- PMC_IMR : (PMC Offset: 0x6c) PMC Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Reset Controller Interface +// ***************************************************************************** +typedef struct _AT91S_RSTC { + AT91_REG RSTC_RCR; // Reset Control Register + AT91_REG RSTC_RSR; // Reset Status Register + AT91_REG RSTC_RMR; // Reset Mode Register +} AT91S_RSTC, *AT91PS_RSTC; + +// -------- RSTC_RCR : (RSTC Offset: 0x0) Reset Control Register -------- +#define AT91C_RSTC_PROCRST ((unsigned int) 0x1 << 0) // (RSTC) Processor Reset +#define AT91C_RSTC_PERRST ((unsigned int) 0x1 << 2) // (RSTC) Peripheral Reset +#define AT91C_RSTC_EXTRST ((unsigned int) 0x1 << 3) // (RSTC) External Reset +#define AT91C_RSTC_KEY ((unsigned int) 0xFF << 24) // (RSTC) Password +// -------- RSTC_RSR : (RSTC Offset: 0x4) Reset Status Register -------- +#define AT91C_RSTC_URSTS ((unsigned int) 0x1 << 0) // (RSTC) User Reset Status +#define AT91C_RSTC_BODSTS ((unsigned int) 0x1 << 1) // (RSTC) Brownout Detection Status +#define AT91C_RSTC_RSTTYP ((unsigned int) 0x7 << 8) // (RSTC) Reset Type +#define AT91C_RSTC_RSTTYP_POWERUP ((unsigned int) 0x0 << 8) // (RSTC) Power-up Reset. VDDCORE rising. +#define AT91C_RSTC_RSTTYP_WAKEUP ((unsigned int) 0x1 << 8) // (RSTC) WakeUp Reset. VDDCORE rising. +#define AT91C_RSTC_RSTTYP_WATCHDOG ((unsigned int) 0x2 << 8) // (RSTC) Watchdog Reset. Watchdog overflow occured. +#define AT91C_RSTC_RSTTYP_SOFTWARE ((unsigned int) 0x3 << 8) // (RSTC) Software Reset. Processor reset required by the software. +#define AT91C_RSTC_RSTTYP_USER ((unsigned int) 0x4 << 8) // (RSTC) User Reset. NRST pin detected low. +#define AT91C_RSTC_RSTTYP_BROWNOUT ((unsigned int) 0x5 << 8) // (RSTC) Brownout Reset occured. +#define AT91C_RSTC_NRSTL ((unsigned int) 0x1 << 16) // (RSTC) NRST pin level +#define AT91C_RSTC_SRCMP ((unsigned int) 0x1 << 17) // (RSTC) Software Reset Command in Progress. +// -------- RSTC_RMR : (RSTC Offset: 0x8) Reset Mode Register -------- +#define AT91C_RSTC_URSTEN ((unsigned int) 0x1 << 0) // (RSTC) User Reset Enable +#define AT91C_RSTC_URSTIEN ((unsigned int) 0x1 << 4) // (RSTC) User Reset Interrupt Enable +#define AT91C_RSTC_ERSTL ((unsigned int) 0xF << 8) // (RSTC) User Reset Enable +#define AT91C_RSTC_BODIEN ((unsigned int) 0x1 << 16) // (RSTC) Brownout Detection Interrupt Enable + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Real Time Timer Controller Interface +// ***************************************************************************** +typedef struct _AT91S_RTTC { + AT91_REG RTTC_RTMR; // Real-time Mode Register + AT91_REG RTTC_RTAR; // Real-time Alarm Register + AT91_REG RTTC_RTVR; // Real-time Value Register + AT91_REG RTTC_RTSR; // Real-time Status Register +} AT91S_RTTC, *AT91PS_RTTC; + +// -------- RTTC_RTMR : (RTTC Offset: 0x0) Real-time Mode Register -------- +#define AT91C_RTTC_RTPRES ((unsigned int) 0xFFFF << 0) // (RTTC) Real-time Timer Prescaler Value +#define AT91C_RTTC_ALMIEN ((unsigned int) 0x1 << 16) // (RTTC) Alarm Interrupt Enable +#define AT91C_RTTC_RTTINCIEN ((unsigned int) 0x1 << 17) // (RTTC) Real Time Timer Increment Interrupt Enable +#define AT91C_RTTC_RTTRST ((unsigned int) 0x1 << 18) // (RTTC) Real Time Timer Restart +// -------- RTTC_RTAR : (RTTC Offset: 0x4) Real-time Alarm Register -------- +#define AT91C_RTTC_ALMV ((unsigned int) 0x0 << 0) // (RTTC) Alarm Value +// -------- RTTC_RTVR : (RTTC Offset: 0x8) Current Real-time Value Register -------- +#define AT91C_RTTC_CRTV ((unsigned int) 0x0 << 0) // (RTTC) Current Real-time Value +// -------- RTTC_RTSR : (RTTC Offset: 0xc) Real-time Status Register -------- +#define AT91C_RTTC_ALMS ((unsigned int) 0x1 << 0) // (RTTC) Real-time Alarm Status +#define AT91C_RTTC_RTTINC ((unsigned int) 0x1 << 1) // (RTTC) Real-time Timer Increment + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Periodic Interval Timer Controller Interface +// ***************************************************************************** +typedef struct _AT91S_PITC { + AT91_REG PITC_PIMR; // Period Interval Mode Register + AT91_REG PITC_PISR; // Period Interval Status Register + AT91_REG PITC_PIVR; // Period Interval Value Register + AT91_REG PITC_PIIR; // Period Interval Image Register +} AT91S_PITC, *AT91PS_PITC; + +// -------- PITC_PIMR : (PITC Offset: 0x0) Periodic Interval Mode Register -------- +#define AT91C_PITC_PIV ((unsigned int) 0xFFFFF << 0) // (PITC) Periodic Interval Value +#define AT91C_PITC_PITEN ((unsigned int) 0x1 << 24) // (PITC) Periodic Interval Timer Enabled +#define AT91C_PITC_PITIEN ((unsigned int) 0x1 << 25) // (PITC) Periodic Interval Timer Interrupt Enable +// -------- PITC_PISR : (PITC Offset: 0x4) Periodic Interval Status Register -------- +#define AT91C_PITC_PITS ((unsigned int) 0x1 << 0) // (PITC) Periodic Interval Timer Status +// -------- PITC_PIVR : (PITC Offset: 0x8) Periodic Interval Value Register -------- +#define AT91C_PITC_CPIV ((unsigned int) 0xFFFFF << 0) // (PITC) Current Periodic Interval Value +#define AT91C_PITC_PICNT ((unsigned int) 0xFFF << 20) // (PITC) Periodic Interval Counter +// -------- PITC_PIIR : (PITC Offset: 0xc) Periodic Interval Image Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Watchdog Timer Controller Interface +// ***************************************************************************** +typedef struct _AT91S_WDTC { + AT91_REG WDTC_WDCR; // Watchdog Control Register + AT91_REG WDTC_WDMR; // Watchdog Mode Register + AT91_REG WDTC_WDSR; // Watchdog Status Register +} AT91S_WDTC, *AT91PS_WDTC; + +// -------- WDTC_WDCR : (WDTC Offset: 0x0) Periodic Interval Image Register -------- +#define AT91C_WDTC_WDRSTT ((unsigned int) 0x1 << 0) // (WDTC) Watchdog Restart +#define AT91C_WDTC_KEY ((unsigned int) 0xFF << 24) // (WDTC) Watchdog KEY Password +// -------- WDTC_WDMR : (WDTC Offset: 0x4) Watchdog Mode Register -------- +#define AT91C_WDTC_WDV ((unsigned int) 0xFFF << 0) // (WDTC) Watchdog Timer Restart +#define AT91C_WDTC_WDFIEN ((unsigned int) 0x1 << 12) // (WDTC) Watchdog Fault Interrupt Enable +#define AT91C_WDTC_WDRSTEN ((unsigned int) 0x1 << 13) // (WDTC) Watchdog Reset Enable +#define AT91C_WDTC_WDRPROC ((unsigned int) 0x1 << 14) // (WDTC) Watchdog Timer Restart +#define AT91C_WDTC_WDDIS ((unsigned int) 0x1 << 15) // (WDTC) Watchdog Disable +#define AT91C_WDTC_WDD ((unsigned int) 0xFFF << 16) // (WDTC) Watchdog Delta Value +#define AT91C_WDTC_WDDBGHLT ((unsigned int) 0x1 << 28) // (WDTC) Watchdog Debug Halt +#define AT91C_WDTC_WDIDLEHLT ((unsigned int) 0x1 << 29) // (WDTC) Watchdog Idle Halt +// -------- WDTC_WDSR : (WDTC Offset: 0x8) Watchdog Status Register -------- +#define AT91C_WDTC_WDUNF ((unsigned int) 0x1 << 0) // (WDTC) Watchdog Underflow +#define AT91C_WDTC_WDERR ((unsigned int) 0x1 << 1) // (WDTC) Watchdog Error + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Voltage Regulator Mode Controller Interface +// ***************************************************************************** +typedef struct _AT91S_VREG { + AT91_REG VREG_MR; // Voltage Regulator Mode Register +} AT91S_VREG, *AT91PS_VREG; + +// -------- VREG_MR : (VREG Offset: 0x0) Voltage Regulator Mode Register -------- +#define AT91C_VREG_PSTDBY ((unsigned int) 0x1 << 0) // (VREG) Voltage Regulator Power Standby Mode + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Memory Controller Interface +// ***************************************************************************** +typedef struct _AT91S_MC { + AT91_REG MC_RCR; // MC Remap Control Register + AT91_REG MC_ASR; // MC Abort Status Register + AT91_REG MC_AASR; // MC Abort Address Status Register + AT91_REG Reserved0[21]; // + AT91_REG MC_FMR; // MC Flash Mode Register + AT91_REG MC_FCR; // MC Flash Command Register + AT91_REG MC_FSR; // MC Flash Status Register +} AT91S_MC, *AT91PS_MC; + +// -------- MC_RCR : (MC Offset: 0x0) MC Remap Control Register -------- +#define AT91C_MC_RCB ((unsigned int) 0x1 << 0) // (MC) Remap Command Bit +// -------- MC_ASR : (MC Offset: 0x4) MC Abort Status Register -------- +#define AT91C_MC_UNDADD ((unsigned int) 0x1 << 0) // (MC) Undefined Addess Abort Status +#define AT91C_MC_MISADD ((unsigned int) 0x1 << 1) // (MC) Misaligned Addess Abort Status +#define AT91C_MC_ABTSZ ((unsigned int) 0x3 << 8) // (MC) Abort Size Status +#define AT91C_MC_ABTSZ_BYTE ((unsigned int) 0x0 << 8) // (MC) Byte +#define AT91C_MC_ABTSZ_HWORD ((unsigned int) 0x1 << 8) // (MC) Half-word +#define AT91C_MC_ABTSZ_WORD ((unsigned int) 0x2 << 8) // (MC) Word +#define AT91C_MC_ABTTYP ((unsigned int) 0x3 << 10) // (MC) Abort Type Status +#define AT91C_MC_ABTTYP_DATAR ((unsigned int) 0x0 << 10) // (MC) Data Read +#define AT91C_MC_ABTTYP_DATAW ((unsigned int) 0x1 << 10) // (MC) Data Write +#define AT91C_MC_ABTTYP_FETCH ((unsigned int) 0x2 << 10) // (MC) Code Fetch +#define AT91C_MC_MST0 ((unsigned int) 0x1 << 16) // (MC) Master 0 Abort Source +#define AT91C_MC_MST1 ((unsigned int) 0x1 << 17) // (MC) Master 1 Abort Source +#define AT91C_MC_SVMST0 ((unsigned int) 0x1 << 24) // (MC) Saved Master 0 Abort Source +#define AT91C_MC_SVMST1 ((unsigned int) 0x1 << 25) // (MC) Saved Master 1 Abort Source +// -------- MC_FMR : (MC Offset: 0x60) MC Flash Mode Register -------- +#define AT91C_MC_FRDY ((unsigned int) 0x1 << 0) // (MC) Flash Ready +#define AT91C_MC_LOCKE ((unsigned int) 0x1 << 2) // (MC) Lock Error +#define AT91C_MC_PROGE ((unsigned int) 0x1 << 3) // (MC) Programming Error +#define AT91C_MC_NEBP ((unsigned int) 0x1 << 7) // (MC) No Erase Before Programming +#define AT91C_MC_FWS ((unsigned int) 0x3 << 8) // (MC) Flash Wait State +#define AT91C_MC_FWS_0FWS ((unsigned int) 0x0 << 8) // (MC) 1 cycle for Read, 2 for Write operations +#define AT91C_MC_FWS_1FWS ((unsigned int) 0x1 << 8) // (MC) 2 cycles for Read, 3 for Write operations +#define AT91C_MC_FWS_2FWS ((unsigned int) 0x2 << 8) // (MC) 3 cycles for Read, 4 for Write operations +#define AT91C_MC_FWS_3FWS ((unsigned int) 0x3 << 8) // (MC) 4 cycles for Read, 4 for Write operations +#define AT91C_MC_FMCN ((unsigned int) 0xFF << 16) // (MC) Flash Microsecond Cycle Number +// -------- MC_FCR : (MC Offset: 0x64) MC Flash Command Register -------- +#define AT91C_MC_FCMD ((unsigned int) 0xF << 0) // (MC) Flash Command +#define AT91C_MC_FCMD_START_PROG ((unsigned int) 0x1) // (MC) Starts the programming of th epage specified by PAGEN. +#define AT91C_MC_FCMD_LOCK ((unsigned int) 0x2) // (MC) Starts a lock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. +#define AT91C_MC_FCMD_PROG_AND_LOCK ((unsigned int) 0x3) // (MC) The lock sequence automatically happens after the programming sequence is completed. +#define AT91C_MC_FCMD_UNLOCK ((unsigned int) 0x4) // (MC) Starts an unlock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. +#define AT91C_MC_FCMD_ERASE_ALL ((unsigned int) 0x8) // (MC) Starts the erase of the entire flash.If at least a page is locked, the command is cancelled. +#define AT91C_MC_FCMD_SET_GP_NVM ((unsigned int) 0xB) // (MC) Set General Purpose NVM bits. +#define AT91C_MC_FCMD_CLR_GP_NVM ((unsigned int) 0xD) // (MC) Clear General Purpose NVM bits. +#define AT91C_MC_FCMD_SET_SECURITY ((unsigned int) 0xF) // (MC) Set Security Bit. +#define AT91C_MC_PAGEN ((unsigned int) 0x3FF << 8) // (MC) Page Number +#define AT91C_MC_KEY ((unsigned int) 0xFF << 24) // (MC) Writing Protect Key +// -------- MC_FSR : (MC Offset: 0x68) MC Flash Command Register -------- +#define AT91C_MC_SECURITY ((unsigned int) 0x1 << 4) // (MC) Security Bit Status +#define AT91C_MC_GPNVM0 ((unsigned int) 0x1 << 8) // (MC) Sector 0 Lock Status +#define AT91C_MC_GPNVM1 ((unsigned int) 0x1 << 9) // (MC) Sector 1 Lock Status +#define AT91C_MC_GPNVM2 ((unsigned int) 0x1 << 10) // (MC) Sector 2 Lock Status +#define AT91C_MC_GPNVM3 ((unsigned int) 0x1 << 11) // (MC) Sector 3 Lock Status +#define AT91C_MC_GPNVM4 ((unsigned int) 0x1 << 12) // (MC) Sector 4 Lock Status +#define AT91C_MC_GPNVM5 ((unsigned int) 0x1 << 13) // (MC) Sector 5 Lock Status +#define AT91C_MC_GPNVM6 ((unsigned int) 0x1 << 14) // (MC) Sector 6 Lock Status +#define AT91C_MC_GPNVM7 ((unsigned int) 0x1 << 15) // (MC) Sector 7 Lock Status +#define AT91C_MC_LOCKS0 ((unsigned int) 0x1 << 16) // (MC) Sector 0 Lock Status +#define AT91C_MC_LOCKS1 ((unsigned int) 0x1 << 17) // (MC) Sector 1 Lock Status +#define AT91C_MC_LOCKS2 ((unsigned int) 0x1 << 18) // (MC) Sector 2 Lock Status +#define AT91C_MC_LOCKS3 ((unsigned int) 0x1 << 19) // (MC) Sector 3 Lock Status +#define AT91C_MC_LOCKS4 ((unsigned int) 0x1 << 20) // (MC) Sector 4 Lock Status +#define AT91C_MC_LOCKS5 ((unsigned int) 0x1 << 21) // (MC) Sector 5 Lock Status +#define AT91C_MC_LOCKS6 ((unsigned int) 0x1 << 22) // (MC) Sector 6 Lock Status +#define AT91C_MC_LOCKS7 ((unsigned int) 0x1 << 23) // (MC) Sector 7 Lock Status +#define AT91C_MC_LOCKS8 ((unsigned int) 0x1 << 24) // (MC) Sector 8 Lock Status +#define AT91C_MC_LOCKS9 ((unsigned int) 0x1 << 25) // (MC) Sector 9 Lock Status +#define AT91C_MC_LOCKS10 ((unsigned int) 0x1 << 26) // (MC) Sector 10 Lock Status +#define AT91C_MC_LOCKS11 ((unsigned int) 0x1 << 27) // (MC) Sector 11 Lock Status +#define AT91C_MC_LOCKS12 ((unsigned int) 0x1 << 28) // (MC) Sector 12 Lock Status +#define AT91C_MC_LOCKS13 ((unsigned int) 0x1 << 29) // (MC) Sector 13 Lock Status +#define AT91C_MC_LOCKS14 ((unsigned int) 0x1 << 30) // (MC) Sector 14 Lock Status +#define AT91C_MC_LOCKS15 ((unsigned int) 0x1 << 31) // (MC) Sector 15 Lock Status + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Serial Parallel Interface +// ***************************************************************************** +typedef struct _AT91S_SPI { + AT91_REG SPI_CR; // Control Register + AT91_REG SPI_MR; // Mode Register + AT91_REG SPI_RDR; // Receive Data Register + AT91_REG SPI_TDR; // Transmit Data Register + AT91_REG SPI_SR; // Status Register + AT91_REG SPI_IER; // Interrupt Enable Register + AT91_REG SPI_IDR; // Interrupt Disable Register + AT91_REG SPI_IMR; // Interrupt Mask Register + AT91_REG Reserved0[4]; // + AT91_REG SPI_CSR[4]; // Chip Select Register + AT91_REG Reserved1[48]; // + AT91_REG SPI_RPR; // Receive Pointer Register + AT91_REG SPI_RCR; // Receive Counter Register + AT91_REG SPI_TPR; // Transmit Pointer Register + AT91_REG SPI_TCR; // Transmit Counter Register + AT91_REG SPI_RNPR; // Receive Next Pointer Register + AT91_REG SPI_RNCR; // Receive Next Counter Register + AT91_REG SPI_TNPR; // Transmit Next Pointer Register + AT91_REG SPI_TNCR; // Transmit Next Counter Register + AT91_REG SPI_PTCR; // PDC Transfer Control Register + AT91_REG SPI_PTSR; // PDC Transfer Status Register +} AT91S_SPI, *AT91PS_SPI; + +// -------- SPI_CR : (SPI Offset: 0x0) SPI Control Register -------- +#define AT91C_SPI_SPIEN ((unsigned int) 0x1 << 0) // (SPI) SPI Enable +#define AT91C_SPI_SPIDIS ((unsigned int) 0x1 << 1) // (SPI) SPI Disable +#define AT91C_SPI_SWRST ((unsigned int) 0x1 << 7) // (SPI) SPI Software reset +#define AT91C_SPI_LASTXFER ((unsigned int) 0x1 << 24) // (SPI) SPI Last Transfer +// -------- SPI_MR : (SPI Offset: 0x4) SPI Mode Register -------- +#define AT91C_SPI_MSTR ((unsigned int) 0x1 << 0) // (SPI) Master/Slave Mode +#define AT91C_SPI_PS ((unsigned int) 0x1 << 1) // (SPI) Peripheral Select +#define AT91C_SPI_PS_FIXED ((unsigned int) 0x0 << 1) // (SPI) Fixed Peripheral Select +#define AT91C_SPI_PS_VARIABLE ((unsigned int) 0x1 << 1) // (SPI) Variable Peripheral Select +#define AT91C_SPI_PCSDEC ((unsigned int) 0x1 << 2) // (SPI) Chip Select Decode +#define AT91C_SPI_FDIV ((unsigned int) 0x1 << 3) // (SPI) Clock Selection +#define AT91C_SPI_MODFDIS ((unsigned int) 0x1 << 4) // (SPI) Mode Fault Detection +#define AT91C_SPI_LLB ((unsigned int) 0x1 << 7) // (SPI) Clock Selection +#define AT91C_SPI_PCS ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select +#define AT91C_SPI_DLYBCS ((unsigned int) 0xFF << 24) // (SPI) Delay Between Chip Selects +// -------- SPI_RDR : (SPI Offset: 0x8) Receive Data Register -------- +#define AT91C_SPI_RD ((unsigned int) 0xFFFF << 0) // (SPI) Receive Data +#define AT91C_SPI_RPCS ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select Status +// -------- SPI_TDR : (SPI Offset: 0xc) Transmit Data Register -------- +#define AT91C_SPI_TD ((unsigned int) 0xFFFF << 0) // (SPI) Transmit Data +#define AT91C_SPI_TPCS ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select Status +// -------- SPI_SR : (SPI Offset: 0x10) Status Register -------- +#define AT91C_SPI_RDRF ((unsigned int) 0x1 << 0) // (SPI) Receive Data Register Full +#define AT91C_SPI_TDRE ((unsigned int) 0x1 << 1) // (SPI) Transmit Data Register Empty +#define AT91C_SPI_MODF ((unsigned int) 0x1 << 2) // (SPI) Mode Fault Error +#define AT91C_SPI_OVRES ((unsigned int) 0x1 << 3) // (SPI) Overrun Error Status +#define AT91C_SPI_ENDRX ((unsigned int) 0x1 << 4) // (SPI) End of Receiver Transfer +#define AT91C_SPI_ENDTX ((unsigned int) 0x1 << 5) // (SPI) End of Receiver Transfer +#define AT91C_SPI_RXBUFF ((unsigned int) 0x1 << 6) // (SPI) RXBUFF Interrupt +#define AT91C_SPI_TXBUFE ((unsigned int) 0x1 << 7) // (SPI) TXBUFE Interrupt +#define AT91C_SPI_NSSR ((unsigned int) 0x1 << 8) // (SPI) NSSR Interrupt +#define AT91C_SPI_TXEMPTY ((unsigned int) 0x1 << 9) // (SPI) TXEMPTY Interrupt +#define AT91C_SPI_SPIENS ((unsigned int) 0x1 << 16) // (SPI) Enable Status +// -------- SPI_IER : (SPI Offset: 0x14) Interrupt Enable Register -------- +// -------- SPI_IDR : (SPI Offset: 0x18) Interrupt Disable Register -------- +// -------- SPI_IMR : (SPI Offset: 0x1c) Interrupt Mask Register -------- +// -------- SPI_CSR : (SPI Offset: 0x30) Chip Select Register -------- +#define AT91C_SPI_CPOL ((unsigned int) 0x1 << 0) // (SPI) Clock Polarity +#define AT91C_SPI_NCPHA ((unsigned int) 0x1 << 1) // (SPI) Clock Phase +#define AT91C_SPI_CSAAT ((unsigned int) 0x1 << 3) // (SPI) Chip Select Active After Transfer +#define AT91C_SPI_BITS ((unsigned int) 0xF << 4) // (SPI) Bits Per Transfer +#define AT91C_SPI_BITS_8 ((unsigned int) 0x0 << 4) // (SPI) 8 Bits Per transfer +#define AT91C_SPI_BITS_9 ((unsigned int) 0x1 << 4) // (SPI) 9 Bits Per transfer +#define AT91C_SPI_BITS_10 ((unsigned int) 0x2 << 4) // (SPI) 10 Bits Per transfer +#define AT91C_SPI_BITS_11 ((unsigned int) 0x3 << 4) // (SPI) 11 Bits Per transfer +#define AT91C_SPI_BITS_12 ((unsigned int) 0x4 << 4) // (SPI) 12 Bits Per transfer +#define AT91C_SPI_BITS_13 ((unsigned int) 0x5 << 4) // (SPI) 13 Bits Per transfer +#define AT91C_SPI_BITS_14 ((unsigned int) 0x6 << 4) // (SPI) 14 Bits Per transfer +#define AT91C_SPI_BITS_15 ((unsigned int) 0x7 << 4) // (SPI) 15 Bits Per transfer +#define AT91C_SPI_BITS_16 ((unsigned int) 0x8 << 4) // (SPI) 16 Bits Per transfer +#define AT91C_SPI_SCBR ((unsigned int) 0xFF << 8) // (SPI) Serial Clock Baud Rate +#define AT91C_SPI_DLYBS ((unsigned int) 0xFF << 16) // (SPI) Delay Before SPCK +#define AT91C_SPI_DLYBCT ((unsigned int) 0xFF << 24) // (SPI) Delay Between Consecutive Transfers + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Usart +// ***************************************************************************** +typedef struct _AT91S_USART { + AT91_REG US_CR; // Control Register + AT91_REG US_MR; // Mode Register + AT91_REG US_IER; // Interrupt Enable Register + AT91_REG US_IDR; // Interrupt Disable Register + AT91_REG US_IMR; // Interrupt Mask Register + AT91_REG US_CSR; // Channel Status Register + AT91_REG US_RHR; // Receiver Holding Register + AT91_REG US_THR; // Transmitter Holding Register + AT91_REG US_BRGR; // Baud Rate Generator Register + AT91_REG US_RTOR; // Receiver Time-out Register + AT91_REG US_TTGR; // Transmitter Time-guard Register + AT91_REG Reserved0[5]; // + AT91_REG US_FIDI; // FI_DI_Ratio Register + AT91_REG US_NER; // Nb Errors Register + AT91_REG Reserved1[1]; // + AT91_REG US_IF; // IRDA_FILTER Register + AT91_REG Reserved2[44]; // + AT91_REG US_RPR; // Receive Pointer Register + AT91_REG US_RCR; // Receive Counter Register + AT91_REG US_TPR; // Transmit Pointer Register + AT91_REG US_TCR; // Transmit Counter Register + AT91_REG US_RNPR; // Receive Next Pointer Register + AT91_REG US_RNCR; // Receive Next Counter Register + AT91_REG US_TNPR; // Transmit Next Pointer Register + AT91_REG US_TNCR; // Transmit Next Counter Register + AT91_REG US_PTCR; // PDC Transfer Control Register + AT91_REG US_PTSR; // PDC Transfer Status Register +} AT91S_USART, *AT91PS_USART; + +// -------- US_CR : (USART Offset: 0x0) Debug Unit Control Register -------- +#define AT91C_US_STTBRK ((unsigned int) 0x1 << 9) // (USART) Start Break +#define AT91C_US_STPBRK ((unsigned int) 0x1 << 10) // (USART) Stop Break +#define AT91C_US_STTTO ((unsigned int) 0x1 << 11) // (USART) Start Time-out +#define AT91C_US_SENDA ((unsigned int) 0x1 << 12) // (USART) Send Address +#define AT91C_US_RSTIT ((unsigned int) 0x1 << 13) // (USART) Reset Iterations +#define AT91C_US_RSTNACK ((unsigned int) 0x1 << 14) // (USART) Reset Non Acknowledge +#define AT91C_US_RETTO ((unsigned int) 0x1 << 15) // (USART) Rearm Time-out +#define AT91C_US_DTREN ((unsigned int) 0x1 << 16) // (USART) Data Terminal ready Enable +#define AT91C_US_DTRDIS ((unsigned int) 0x1 << 17) // (USART) Data Terminal ready Disable +#define AT91C_US_RTSEN ((unsigned int) 0x1 << 18) // (USART) Request to Send enable +#define AT91C_US_RTSDIS ((unsigned int) 0x1 << 19) // (USART) Request to Send Disable +// -------- US_MR : (USART Offset: 0x4) Debug Unit Mode Register -------- +#define AT91C_US_USMODE ((unsigned int) 0xF << 0) // (USART) Usart mode +#define AT91C_US_USMODE_NORMAL ((unsigned int) 0x0) // (USART) Normal +#define AT91C_US_USMODE_RS485 ((unsigned int) 0x1) // (USART) RS485 +#define AT91C_US_USMODE_HWHSH ((unsigned int) 0x2) // (USART) Hardware Handshaking +#define AT91C_US_USMODE_MODEM ((unsigned int) 0x3) // (USART) Modem +#define AT91C_US_USMODE_ISO7816_0 ((unsigned int) 0x4) // (USART) ISO7816 protocol: T = 0 +#define AT91C_US_USMODE_ISO7816_1 ((unsigned int) 0x6) // (USART) ISO7816 protocol: T = 1 +#define AT91C_US_USMODE_IRDA ((unsigned int) 0x8) // (USART) IrDA +#define AT91C_US_USMODE_SWHSH ((unsigned int) 0xC) // (USART) Software Handshaking +#define AT91C_US_CLKS ((unsigned int) 0x3 << 4) // (USART) Clock Selection (Baud Rate generator Input Clock +#define AT91C_US_CLKS_CLOCK ((unsigned int) 0x0 << 4) // (USART) Clock +#define AT91C_US_CLKS_FDIV1 ((unsigned int) 0x1 << 4) // (USART) fdiv1 +#define AT91C_US_CLKS_SLOW ((unsigned int) 0x2 << 4) // (USART) slow_clock (ARM) +#define AT91C_US_CLKS_EXT ((unsigned int) 0x3 << 4) // (USART) External (SCK) +#define AT91C_US_CHRL ((unsigned int) 0x3 << 6) // (USART) Clock Selection (Baud Rate generator Input Clock +#define AT91C_US_CHRL_5_BITS ((unsigned int) 0x0 << 6) // (USART) Character Length: 5 bits +#define AT91C_US_CHRL_6_BITS ((unsigned int) 0x1 << 6) // (USART) Character Length: 6 bits +#define AT91C_US_CHRL_7_BITS ((unsigned int) 0x2 << 6) // (USART) Character Length: 7 bits +#define AT91C_US_CHRL_8_BITS ((unsigned int) 0x3 << 6) // (USART) Character Length: 8 bits +#define AT91C_US_SYNC ((unsigned int) 0x1 << 8) // (USART) Synchronous Mode Select +#define AT91C_US_NBSTOP ((unsigned int) 0x3 << 12) // (USART) Number of Stop bits +#define AT91C_US_NBSTOP_1_BIT ((unsigned int) 0x0 << 12) // (USART) 1 stop bit +#define AT91C_US_NBSTOP_15_BIT ((unsigned int) 0x1 << 12) // (USART) Asynchronous (SYNC=0) 2 stop bits Synchronous (SYNC=1) 2 stop bits +#define AT91C_US_NBSTOP_2_BIT ((unsigned int) 0x2 << 12) // (USART) 2 stop bits +#define AT91C_US_MSBF ((unsigned int) 0x1 << 16) // (USART) Bit Order +#define AT91C_US_MODE9 ((unsigned int) 0x1 << 17) // (USART) 9-bit Character length +#define AT91C_US_CKLO ((unsigned int) 0x1 << 18) // (USART) Clock Output Select +#define AT91C_US_OVER ((unsigned int) 0x1 << 19) // (USART) Over Sampling Mode +#define AT91C_US_INACK ((unsigned int) 0x1 << 20) // (USART) Inhibit Non Acknowledge +#define AT91C_US_DSNACK ((unsigned int) 0x1 << 21) // (USART) Disable Successive NACK +#define AT91C_US_MAX_ITER ((unsigned int) 0x1 << 24) // (USART) Number of Repetitions +#define AT91C_US_FILTER ((unsigned int) 0x1 << 28) // (USART) Receive Line Filter +// -------- US_IER : (USART Offset: 0x8) Debug Unit Interrupt Enable Register -------- +#define AT91C_US_RXBRK ((unsigned int) 0x1 << 2) // (USART) Break Received/End of Break +#define AT91C_US_TIMEOUT ((unsigned int) 0x1 << 8) // (USART) Receiver Time-out +#define AT91C_US_ITERATION ((unsigned int) 0x1 << 10) // (USART) Max number of Repetitions Reached +#define AT91C_US_NACK ((unsigned int) 0x1 << 13) // (USART) Non Acknowledge +#define AT91C_US_RIIC ((unsigned int) 0x1 << 16) // (USART) Ring INdicator Input Change Flag +#define AT91C_US_DSRIC ((unsigned int) 0x1 << 17) // (USART) Data Set Ready Input Change Flag +#define AT91C_US_DCDIC ((unsigned int) 0x1 << 18) // (USART) Data Carrier Flag +#define AT91C_US_CTSIC ((unsigned int) 0x1 << 19) // (USART) Clear To Send Input Change Flag +// -------- US_IDR : (USART Offset: 0xc) Debug Unit Interrupt Disable Register -------- +// -------- US_IMR : (USART Offset: 0x10) Debug Unit Interrupt Mask Register -------- +// -------- US_CSR : (USART Offset: 0x14) Debug Unit Channel Status Register -------- +#define AT91C_US_RI ((unsigned int) 0x1 << 20) // (USART) Image of RI Input +#define AT91C_US_DSR ((unsigned int) 0x1 << 21) // (USART) Image of DSR Input +#define AT91C_US_DCD ((unsigned int) 0x1 << 22) // (USART) Image of DCD Input +#define AT91C_US_CTS ((unsigned int) 0x1 << 23) // (USART) Image of CTS Input + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Synchronous Serial Controller Interface +// ***************************************************************************** +typedef struct _AT91S_SSC { + AT91_REG SSC_CR; // Control Register + AT91_REG SSC_CMR; // Clock Mode Register + AT91_REG Reserved0[2]; // + AT91_REG SSC_RCMR; // Receive Clock ModeRegister + AT91_REG SSC_RFMR; // Receive Frame Mode Register + AT91_REG SSC_TCMR; // Transmit Clock Mode Register + AT91_REG SSC_TFMR; // Transmit Frame Mode Register + AT91_REG SSC_RHR; // Receive Holding Register + AT91_REG SSC_THR; // Transmit Holding Register + AT91_REG Reserved1[2]; // + AT91_REG SSC_RSHR; // Receive Sync Holding Register + AT91_REG SSC_TSHR; // Transmit Sync Holding Register + AT91_REG Reserved2[2]; // + AT91_REG SSC_SR; // Status Register + AT91_REG SSC_IER; // Interrupt Enable Register + AT91_REG SSC_IDR; // Interrupt Disable Register + AT91_REG SSC_IMR; // Interrupt Mask Register + AT91_REG Reserved3[44]; // + AT91_REG SSC_RPR; // Receive Pointer Register + AT91_REG SSC_RCR; // Receive Counter Register + AT91_REG SSC_TPR; // Transmit Pointer Register + AT91_REG SSC_TCR; // Transmit Counter Register + AT91_REG SSC_RNPR; // Receive Next Pointer Register + AT91_REG SSC_RNCR; // Receive Next Counter Register + AT91_REG SSC_TNPR; // Transmit Next Pointer Register + AT91_REG SSC_TNCR; // Transmit Next Counter Register + AT91_REG SSC_PTCR; // PDC Transfer Control Register + AT91_REG SSC_PTSR; // PDC Transfer Status Register +} AT91S_SSC, *AT91PS_SSC; + +// -------- SSC_CR : (SSC Offset: 0x0) SSC Control Register -------- +#define AT91C_SSC_RXEN ((unsigned int) 0x1 << 0) // (SSC) Receive Enable +#define AT91C_SSC_RXDIS ((unsigned int) 0x1 << 1) // (SSC) Receive Disable +#define AT91C_SSC_TXEN ((unsigned int) 0x1 << 8) // (SSC) Transmit Enable +#define AT91C_SSC_TXDIS ((unsigned int) 0x1 << 9) // (SSC) Transmit Disable +#define AT91C_SSC_SWRST ((unsigned int) 0x1 << 15) // (SSC) Software Reset +// -------- SSC_RCMR : (SSC Offset: 0x10) SSC Receive Clock Mode Register -------- +#define AT91C_SSC_CKS ((unsigned int) 0x3 << 0) // (SSC) Receive/Transmit Clock Selection +#define AT91C_SSC_CKS_DIV ((unsigned int) 0x0) // (SSC) Divided Clock +#define AT91C_SSC_CKS_TK ((unsigned int) 0x1) // (SSC) TK Clock signal +#define AT91C_SSC_CKS_RK ((unsigned int) 0x2) // (SSC) RK pin +#define AT91C_SSC_CKO ((unsigned int) 0x7 << 2) // (SSC) Receive/Transmit Clock Output Mode Selection +#define AT91C_SSC_CKO_NONE ((unsigned int) 0x0 << 2) // (SSC) Receive/Transmit Clock Output Mode: None RK pin: Input-only +#define AT91C_SSC_CKO_CONTINOUS ((unsigned int) 0x1 << 2) // (SSC) Continuous Receive/Transmit Clock RK pin: Output +#define AT91C_SSC_CKO_DATA_TX ((unsigned int) 0x2 << 2) // (SSC) Receive/Transmit Clock only during data transfers RK pin: Output +#define AT91C_SSC_CKI ((unsigned int) 0x1 << 5) // (SSC) Receive/Transmit Clock Inversion +#define AT91C_SSC_START ((unsigned int) 0xF << 8) // (SSC) Receive/Transmit Start Selection +#define AT91C_SSC_START_CONTINOUS ((unsigned int) 0x0 << 8) // (SSC) Continuous, as soon as the receiver is enabled, and immediately after the end of transfer of the previous data. +#define AT91C_SSC_START_TX ((unsigned int) 0x1 << 8) // (SSC) Transmit/Receive start +#define AT91C_SSC_START_LOW_RF ((unsigned int) 0x2 << 8) // (SSC) Detection of a low level on RF input +#define AT91C_SSC_START_HIGH_RF ((unsigned int) 0x3 << 8) // (SSC) Detection of a high level on RF input +#define AT91C_SSC_START_FALL_RF ((unsigned int) 0x4 << 8) // (SSC) Detection of a falling edge on RF input +#define AT91C_SSC_START_RISE_RF ((unsigned int) 0x5 << 8) // (SSC) Detection of a rising edge on RF input +#define AT91C_SSC_START_LEVEL_RF ((unsigned int) 0x6 << 8) // (SSC) Detection of any level change on RF input +#define AT91C_SSC_START_EDGE_RF ((unsigned int) 0x7 << 8) // (SSC) Detection of any edge on RF input +#define AT91C_SSC_START_0 ((unsigned int) 0x8 << 8) // (SSC) Compare 0 +#define AT91C_SSC_STTDLY ((unsigned int) 0xFF << 16) // (SSC) Receive/Transmit Start Delay +#define AT91C_SSC_PERIOD ((unsigned int) 0xFF << 24) // (SSC) Receive/Transmit Period Divider Selection +// -------- SSC_RFMR : (SSC Offset: 0x14) SSC Receive Frame Mode Register -------- +#define AT91C_SSC_DATLEN ((unsigned int) 0x1F << 0) // (SSC) Data Length +#define AT91C_SSC_LOOP ((unsigned int) 0x1 << 5) // (SSC) Loop Mode +#define AT91C_SSC_MSBF ((unsigned int) 0x1 << 7) // (SSC) Most Significant Bit First +#define AT91C_SSC_DATNB ((unsigned int) 0xF << 8) // (SSC) Data Number per Frame +#define AT91C_SSC_FSLEN ((unsigned int) 0xF << 16) // (SSC) Receive/Transmit Frame Sync length +#define AT91C_SSC_FSOS ((unsigned int) 0x7 << 20) // (SSC) Receive/Transmit Frame Sync Output Selection +#define AT91C_SSC_FSOS_NONE ((unsigned int) 0x0 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: None RK pin Input-only +#define AT91C_SSC_FSOS_NEGATIVE ((unsigned int) 0x1 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Negative Pulse +#define AT91C_SSC_FSOS_POSITIVE ((unsigned int) 0x2 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Positive Pulse +#define AT91C_SSC_FSOS_LOW ((unsigned int) 0x3 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver Low during data transfer +#define AT91C_SSC_FSOS_HIGH ((unsigned int) 0x4 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver High during data transfer +#define AT91C_SSC_FSOS_TOGGLE ((unsigned int) 0x5 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Toggling at each start of data transfer +#define AT91C_SSC_FSEDGE ((unsigned int) 0x1 << 24) // (SSC) Frame Sync Edge Detection +// -------- SSC_TCMR : (SSC Offset: 0x18) SSC Transmit Clock Mode Register -------- +// -------- SSC_TFMR : (SSC Offset: 0x1c) SSC Transmit Frame Mode Register -------- +#define AT91C_SSC_DATDEF ((unsigned int) 0x1 << 5) // (SSC) Data Default Value +#define AT91C_SSC_FSDEN ((unsigned int) 0x1 << 23) // (SSC) Frame Sync Data Enable +// -------- SSC_SR : (SSC Offset: 0x40) SSC Status Register -------- +#define AT91C_SSC_TXRDY ((unsigned int) 0x1 << 0) // (SSC) Transmit Ready +#define AT91C_SSC_TXEMPTY ((unsigned int) 0x1 << 1) // (SSC) Transmit Empty +#define AT91C_SSC_ENDTX ((unsigned int) 0x1 << 2) // (SSC) End Of Transmission +#define AT91C_SSC_TXBUFE ((unsigned int) 0x1 << 3) // (SSC) Transmit Buffer Empty +#define AT91C_SSC_RXRDY ((unsigned int) 0x1 << 4) // (SSC) Receive Ready +#define AT91C_SSC_OVRUN ((unsigned int) 0x1 << 5) // (SSC) Receive Overrun +#define AT91C_SSC_ENDRX ((unsigned int) 0x1 << 6) // (SSC) End of Reception +#define AT91C_SSC_RXBUFF ((unsigned int) 0x1 << 7) // (SSC) Receive Buffer Full +#define AT91C_SSC_TXSYN ((unsigned int) 0x1 << 10) // (SSC) Transmit Sync +#define AT91C_SSC_RXSYN ((unsigned int) 0x1 << 11) // (SSC) Receive Sync +#define AT91C_SSC_TXENA ((unsigned int) 0x1 << 16) // (SSC) Transmit Enable +#define AT91C_SSC_RXENA ((unsigned int) 0x1 << 17) // (SSC) Receive Enable +// -------- SSC_IER : (SSC Offset: 0x44) SSC Interrupt Enable Register -------- +// -------- SSC_IDR : (SSC Offset: 0x48) SSC Interrupt Disable Register -------- +// -------- SSC_IMR : (SSC Offset: 0x4c) SSC Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Two-wire Interface +// ***************************************************************************** +typedef struct _AT91S_TWI { + AT91_REG TWI_CR; // Control Register + AT91_REG TWI_MMR; // Master Mode Register + AT91_REG Reserved0[1]; // + AT91_REG TWI_IADR; // Internal Address Register + AT91_REG TWI_CWGR; // Clock Waveform Generator Register + AT91_REG Reserved1[3]; // + AT91_REG TWI_SR; // Status Register + AT91_REG TWI_IER; // Interrupt Enable Register + AT91_REG TWI_IDR; // Interrupt Disable Register + AT91_REG TWI_IMR; // Interrupt Mask Register + AT91_REG TWI_RHR; // Receive Holding Register + AT91_REG TWI_THR; // Transmit Holding Register +} AT91S_TWI, *AT91PS_TWI; + +// -------- TWI_CR : (TWI Offset: 0x0) TWI Control Register -------- +#define AT91C_TWI_START ((unsigned int) 0x1 << 0) // (TWI) Send a START Condition +#define AT91C_TWI_STOP ((unsigned int) 0x1 << 1) // (TWI) Send a STOP Condition +#define AT91C_TWI_MSEN ((unsigned int) 0x1 << 2) // (TWI) TWI Master Transfer Enabled +#define AT91C_TWI_MSDIS ((unsigned int) 0x1 << 3) // (TWI) TWI Master Transfer Disabled +#define AT91C_TWI_SWRST ((unsigned int) 0x1 << 7) // (TWI) Software Reset +// -------- TWI_MMR : (TWI Offset: 0x4) TWI Master Mode Register -------- +#define AT91C_TWI_IADRSZ ((unsigned int) 0x3 << 8) // (TWI) Internal Device Address Size +#define AT91C_TWI_IADRSZ_NO ((unsigned int) 0x0 << 8) // (TWI) No internal device address +#define AT91C_TWI_IADRSZ_1_BYTE ((unsigned int) 0x1 << 8) // (TWI) One-byte internal device address +#define AT91C_TWI_IADRSZ_2_BYTE ((unsigned int) 0x2 << 8) // (TWI) Two-byte internal device address +#define AT91C_TWI_IADRSZ_3_BYTE ((unsigned int) 0x3 << 8) // (TWI) Three-byte internal device address +#define AT91C_TWI_MREAD ((unsigned int) 0x1 << 12) // (TWI) Master Read Direction +#define AT91C_TWI_DADR ((unsigned int) 0x7F << 16) // (TWI) Device Address +// -------- TWI_CWGR : (TWI Offset: 0x10) TWI Clock Waveform Generator Register -------- +#define AT91C_TWI_CLDIV ((unsigned int) 0xFF << 0) // (TWI) Clock Low Divider +#define AT91C_TWI_CHDIV ((unsigned int) 0xFF << 8) // (TWI) Clock High Divider +#define AT91C_TWI_CKDIV ((unsigned int) 0x7 << 16) // (TWI) Clock Divider +// -------- TWI_SR : (TWI Offset: 0x20) TWI Status Register -------- +#define AT91C_TWI_TXCOMP ((unsigned int) 0x1 << 0) // (TWI) Transmission Completed +#define AT91C_TWI_RXRDY ((unsigned int) 0x1 << 1) // (TWI) Receive holding register ReaDY +#define AT91C_TWI_TXRDY ((unsigned int) 0x1 << 2) // (TWI) Transmit holding register ReaDY +#define AT91C_TWI_OVRE ((unsigned int) 0x1 << 6) // (TWI) Overrun Error +#define AT91C_TWI_UNRE ((unsigned int) 0x1 << 7) // (TWI) Underrun Error +#define AT91C_TWI_NACK ((unsigned int) 0x1 << 8) // (TWI) Not Acknowledged +// -------- TWI_IER : (TWI Offset: 0x24) TWI Interrupt Enable Register -------- +// -------- TWI_IDR : (TWI Offset: 0x28) TWI Interrupt Disable Register -------- +// -------- TWI_IMR : (TWI Offset: 0x2c) TWI Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR PWMC Channel Interface +// ***************************************************************************** +typedef struct _AT91S_PWMC_CH { + AT91_REG PWMC_CMR; // Channel Mode Register + AT91_REG PWMC_CDTYR; // Channel Duty Cycle Register + AT91_REG PWMC_CPRDR; // Channel Period Register + AT91_REG PWMC_CCNTR; // Channel Counter Register + AT91_REG PWMC_CUPDR; // Channel Update Register + AT91_REG PWMC_Reserved[3]; // Reserved +} AT91S_PWMC_CH, *AT91PS_PWMC_CH; + +// -------- PWMC_CMR : (PWMC_CH Offset: 0x0) PWMC Channel Mode Register -------- +#define AT91C_PWMC_CPRE ((unsigned int) 0xF << 0) // (PWMC_CH) Channel Pre-scaler : PWMC_CLKx +#define AT91C_PWMC_CPRE_MCK ((unsigned int) 0x0) // (PWMC_CH) +#define AT91C_PWMC_CPRE_MCKA ((unsigned int) 0xB) // (PWMC_CH) +#define AT91C_PWMC_CPRE_MCKB ((unsigned int) 0xC) // (PWMC_CH) +#define AT91C_PWMC_CALG ((unsigned int) 0x1 << 8) // (PWMC_CH) Channel Alignment +#define AT91C_PWMC_CPOL ((unsigned int) 0x1 << 9) // (PWMC_CH) Channel Polarity +#define AT91C_PWMC_CPD ((unsigned int) 0x1 << 10) // (PWMC_CH) Channel Update Period +// -------- PWMC_CDTYR : (PWMC_CH Offset: 0x4) PWMC Channel Duty Cycle Register -------- +#define AT91C_PWMC_CDTY ((unsigned int) 0x0 << 0) // (PWMC_CH) Channel Duty Cycle +// -------- PWMC_CPRDR : (PWMC_CH Offset: 0x8) PWMC Channel Period Register -------- +#define AT91C_PWMC_CPRD ((unsigned int) 0x0 << 0) // (PWMC_CH) Channel Period +// -------- PWMC_CCNTR : (PWMC_CH Offset: 0xc) PWMC Channel Counter Register -------- +#define AT91C_PWMC_CCNT ((unsigned int) 0x0 << 0) // (PWMC_CH) Channel Counter +// -------- PWMC_CUPDR : (PWMC_CH Offset: 0x10) PWMC Channel Update Register -------- +#define AT91C_PWMC_CUPD ((unsigned int) 0x0 << 0) // (PWMC_CH) Channel Update + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Pulse Width Modulation Controller Interface +// ***************************************************************************** +typedef struct _AT91S_PWMC { + AT91_REG PWMC_MR; // PWMC Mode Register + AT91_REG PWMC_ENA; // PWMC Enable Register + AT91_REG PWMC_DIS; // PWMC Disable Register + AT91_REG PWMC_SR; // PWMC Status Register + AT91_REG PWMC_IER; // PWMC Interrupt Enable Register + AT91_REG PWMC_IDR; // PWMC Interrupt Disable Register + AT91_REG PWMC_IMR; // PWMC Interrupt Mask Register + AT91_REG PWMC_ISR; // PWMC Interrupt Status Register + AT91_REG Reserved0[55]; // + AT91_REG PWMC_VR; // PWMC Version Register + AT91_REG Reserved1[64]; // + AT91S_PWMC_CH PWMC_CH[4]; // PWMC Channel +} AT91S_PWMC, *AT91PS_PWMC; + +// -------- PWMC_MR : (PWMC Offset: 0x0) PWMC Mode Register -------- +#define AT91C_PWMC_DIVA ((unsigned int) 0xFF << 0) // (PWMC) CLKA divide factor. +#define AT91C_PWMC_PREA ((unsigned int) 0xF << 8) // (PWMC) Divider Input Clock Prescaler A +#define AT91C_PWMC_PREA_MCK ((unsigned int) 0x0 << 8) // (PWMC) +#define AT91C_PWMC_DIVB ((unsigned int) 0xFF << 16) // (PWMC) CLKB divide factor. +#define AT91C_PWMC_PREB ((unsigned int) 0xF << 24) // (PWMC) Divider Input Clock Prescaler B +#define AT91C_PWMC_PREB_MCK ((unsigned int) 0x0 << 24) // (PWMC) +// -------- PWMC_ENA : (PWMC Offset: 0x4) PWMC Enable Register -------- +#define AT91C_PWMC_CHID0 ((unsigned int) 0x1 << 0) // (PWMC) Channel ID 0 +#define AT91C_PWMC_CHID1 ((unsigned int) 0x1 << 1) // (PWMC) Channel ID 1 +#define AT91C_PWMC_CHID2 ((unsigned int) 0x1 << 2) // (PWMC) Channel ID 2 +#define AT91C_PWMC_CHID3 ((unsigned int) 0x1 << 3) // (PWMC) Channel ID 3 +// -------- PWMC_DIS : (PWMC Offset: 0x8) PWMC Disable Register -------- +// -------- PWMC_SR : (PWMC Offset: 0xc) PWMC Status Register -------- +// -------- PWMC_IER : (PWMC Offset: 0x10) PWMC Interrupt Enable Register -------- +// -------- PWMC_IDR : (PWMC Offset: 0x14) PWMC Interrupt Disable Register -------- +// -------- PWMC_IMR : (PWMC Offset: 0x18) PWMC Interrupt Mask Register -------- +// -------- PWMC_ISR : (PWMC Offset: 0x1c) PWMC Interrupt Status Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR USB Device Interface +// ***************************************************************************** +typedef struct _AT91S_UDP { + AT91_REG UDP_NUM; // Frame Number Register + AT91_REG UDP_GLBSTATE; // Global State Register + AT91_REG UDP_FADDR; // Function Address Register + AT91_REG Reserved0[1]; // + AT91_REG UDP_IER; // Interrupt Enable Register + AT91_REG UDP_IDR; // Interrupt Disable Register + AT91_REG UDP_IMR; // Interrupt Mask Register + AT91_REG UDP_ISR; // Interrupt Status Register + AT91_REG UDP_ICR; // Interrupt Clear Register + AT91_REG Reserved1[1]; // + AT91_REG UDP_RSTEP; // Reset Endpoint Register + AT91_REG Reserved2[1]; // + AT91_REG UDP_CSR[6]; // Endpoint Control and Status Register + AT91_REG Reserved3[2]; // + AT91_REG UDP_FDR[6]; // Endpoint FIFO Data Register + AT91_REG Reserved4[3]; // + AT91_REG UDP_TXVC; // Transceiver Control Register +} AT91S_UDP, *AT91PS_UDP; + +// -------- UDP_FRM_NUM : (UDP Offset: 0x0) USB Frame Number Register -------- +#define AT91C_UDP_FRM_NUM ((unsigned int) 0x7FF << 0) // (UDP) Frame Number as Defined in the Packet Field Formats +#define AT91C_UDP_FRM_ERR ((unsigned int) 0x1 << 16) // (UDP) Frame Error +#define AT91C_UDP_FRM_OK ((unsigned int) 0x1 << 17) // (UDP) Frame OK +// -------- UDP_GLB_STATE : (UDP Offset: 0x4) USB Global State Register -------- +#define AT91C_UDP_FADDEN ((unsigned int) 0x1 << 0) // (UDP) Function Address Enable +#define AT91C_UDP_CONFG ((unsigned int) 0x1 << 1) // (UDP) Configured +#define AT91C_UDP_ESR ((unsigned int) 0x1 << 2) // (UDP) Enable Send Resume +#define AT91C_UDP_RSMINPR ((unsigned int) 0x1 << 3) // (UDP) A Resume Has Been Sent to the Host +#define AT91C_UDP_RMWUPE ((unsigned int) 0x1 << 4) // (UDP) Remote Wake Up Enable +// -------- UDP_FADDR : (UDP Offset: 0x8) USB Function Address Register -------- +#define AT91C_UDP_FADD ((unsigned int) 0xFF << 0) // (UDP) Function Address Value +#define AT91C_UDP_FEN ((unsigned int) 0x1 << 8) // (UDP) Function Enable +// -------- UDP_IER : (UDP Offset: 0x10) USB Interrupt Enable Register -------- +#define AT91C_UDP_EPINT0 ((unsigned int) 0x1 << 0) // (UDP) Endpoint 0 Interrupt +#define AT91C_UDP_EPINT1 ((unsigned int) 0x1 << 1) // (UDP) Endpoint 0 Interrupt +#define AT91C_UDP_EPINT2 ((unsigned int) 0x1 << 2) // (UDP) Endpoint 2 Interrupt +#define AT91C_UDP_EPINT3 ((unsigned int) 0x1 << 3) // (UDP) Endpoint 3 Interrupt +#define AT91C_UDP_EPINT4 ((unsigned int) 0x1 << 4) // (UDP) Endpoint 4 Interrupt +#define AT91C_UDP_EPINT5 ((unsigned int) 0x1 << 5) // (UDP) Endpoint 5 Interrupt +#define AT91C_UDP_RXSUSP ((unsigned int) 0x1 << 8) // (UDP) USB Suspend Interrupt +#define AT91C_UDP_RXRSM ((unsigned int) 0x1 << 9) // (UDP) USB Resume Interrupt +#define AT91C_UDP_EXTRSM ((unsigned int) 0x1 << 10) // (UDP) USB External Resume Interrupt +#define AT91C_UDP_SOFINT ((unsigned int) 0x1 << 11) // (UDP) USB Start Of frame Interrupt +#define AT91C_UDP_WAKEUP ((unsigned int) 0x1 << 13) // (UDP) USB Resume Interrupt +// -------- UDP_IDR : (UDP Offset: 0x14) USB Interrupt Disable Register -------- +// -------- UDP_IMR : (UDP Offset: 0x18) USB Interrupt Mask Register -------- +// -------- UDP_ISR : (UDP Offset: 0x1c) USB Interrupt Status Register -------- +#define AT91C_UDP_ENDBUSRES ((unsigned int) 0x1 << 12) // (UDP) USB End Of Bus Reset Interrupt +// -------- UDP_ICR : (UDP Offset: 0x20) USB Interrupt Clear Register -------- +// -------- UDP_RST_EP : (UDP Offset: 0x28) USB Reset Endpoint Register -------- +#define AT91C_UDP_EP0 ((unsigned int) 0x1 << 0) // (UDP) Reset Endpoint 0 +#define AT91C_UDP_EP1 ((unsigned int) 0x1 << 1) // (UDP) Reset Endpoint 1 +#define AT91C_UDP_EP2 ((unsigned int) 0x1 << 2) // (UDP) Reset Endpoint 2 +#define AT91C_UDP_EP3 ((unsigned int) 0x1 << 3) // (UDP) Reset Endpoint 3 +#define AT91C_UDP_EP4 ((unsigned int) 0x1 << 4) // (UDP) Reset Endpoint 4 +#define AT91C_UDP_EP5 ((unsigned int) 0x1 << 5) // (UDP) Reset Endpoint 5 +// -------- UDP_CSR : (UDP Offset: 0x30) USB Endpoint Control and Status Register -------- +#define AT91C_UDP_TXCOMP ((unsigned int) 0x1 << 0) // (UDP) Generates an IN packet with data previously written in the DPR +#define AT91C_UDP_RX_DATA_BK0 ((unsigned int) 0x1 << 1) // (UDP) Receive Data Bank 0 +#define AT91C_UDP_RXSETUP ((unsigned int) 0x1 << 2) // (UDP) Sends STALL to the Host (Control endpoints) +#define AT91C_UDP_ISOERROR ((unsigned int) 0x1 << 3) // (UDP) Isochronous error (Isochronous endpoints) +#define AT91C_UDP_TXPKTRDY ((unsigned int) 0x1 << 4) // (UDP) Transmit Packet Ready +#define AT91C_UDP_FORCESTALL ((unsigned int) 0x1 << 5) // (UDP) Force Stall (used by Control, Bulk and Isochronous endpoints). +#define AT91C_UDP_RX_DATA_BK1 ((unsigned int) 0x1 << 6) // (UDP) Receive Data Bank 1 (only used by endpoints with ping-pong attributes). +#define AT91C_UDP_DIR ((unsigned int) 0x1 << 7) // (UDP) Transfer Direction +#define AT91C_UDP_EPTYPE ((unsigned int) 0x7 << 8) // (UDP) Endpoint type +#define AT91C_UDP_EPTYPE_CTRL ((unsigned int) 0x0 << 8) // (UDP) Control +#define AT91C_UDP_EPTYPE_ISO_OUT ((unsigned int) 0x1 << 8) // (UDP) Isochronous OUT +#define AT91C_UDP_EPTYPE_BULK_OUT ((unsigned int) 0x2 << 8) // (UDP) Bulk OUT +#define AT91C_UDP_EPTYPE_INT_OUT ((unsigned int) 0x3 << 8) // (UDP) Interrupt OUT +#define AT91C_UDP_EPTYPE_ISO_IN ((unsigned int) 0x5 << 8) // (UDP) Isochronous IN +#define AT91C_UDP_EPTYPE_BULK_IN ((unsigned int) 0x6 << 8) // (UDP) Bulk IN +#define AT91C_UDP_EPTYPE_INT_IN ((unsigned int) 0x7 << 8) // (UDP) Interrupt IN +#define AT91C_UDP_DTGLE ((unsigned int) 0x1 << 11) // (UDP) Data Toggle +#define AT91C_UDP_EPEDS ((unsigned int) 0x1 << 15) // (UDP) Endpoint Enable Disable +#define AT91C_UDP_RXBYTECNT ((unsigned int) 0x7FF << 16) // (UDP) Number Of Bytes Available in the FIFO +// -------- UDP_TXVC : (UDP Offset: 0x74) Transceiver Control Register -------- +#define AT91C_UDP_TXVDIS ((unsigned int) 0x1 << 8) // (UDP) +#define AT91C_UDP_PUON ((unsigned int) 0x1 << 9) // (UDP) Pull-up ON + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Timer Counter Channel Interface +// ***************************************************************************** +typedef struct _AT91S_TC { + AT91_REG TC_CCR; // Channel Control Register + AT91_REG TC_CMR; // Channel Mode Register (Capture Mode / Waveform Mode) + AT91_REG Reserved0[2]; // + AT91_REG TC_CV; // Counter Value + AT91_REG TC_RA; // Register A + AT91_REG TC_RB; // Register B + AT91_REG TC_RC; // Register C + AT91_REG TC_SR; // Status Register + AT91_REG TC_IER; // Interrupt Enable Register + AT91_REG TC_IDR; // Interrupt Disable Register + AT91_REG TC_IMR; // Interrupt Mask Register +} AT91S_TC, *AT91PS_TC; + +// -------- TC_CCR : (TC Offset: 0x0) TC Channel Control Register -------- +#define AT91C_TC_CLKEN ((unsigned int) 0x1 << 0) // (TC) Counter Clock Enable Command +#define AT91C_TC_CLKDIS ((unsigned int) 0x1 << 1) // (TC) Counter Clock Disable Command +#define AT91C_TC_SWTRG ((unsigned int) 0x1 << 2) // (TC) Software Trigger Command +// -------- TC_CMR : (TC Offset: 0x4) TC Channel Mode Register: Capture Mode / Waveform Mode -------- +#define AT91C_TC_CLKS ((unsigned int) 0x7 << 0) // (TC) Clock Selection +#define AT91C_TC_CLKS_TIMER_DIV1_CLOCK ((unsigned int) 0x0) // (TC) Clock selected: TIMER_DIV1_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV2_CLOCK ((unsigned int) 0x1) // (TC) Clock selected: TIMER_DIV2_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV3_CLOCK ((unsigned int) 0x2) // (TC) Clock selected: TIMER_DIV3_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV4_CLOCK ((unsigned int) 0x3) // (TC) Clock selected: TIMER_DIV4_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV5_CLOCK ((unsigned int) 0x4) // (TC) Clock selected: TIMER_DIV5_CLOCK +#define AT91C_TC_CLKS_XC0 ((unsigned int) 0x5) // (TC) Clock selected: XC0 +#define AT91C_TC_CLKS_XC1 ((unsigned int) 0x6) // (TC) Clock selected: XC1 +#define AT91C_TC_CLKS_XC2 ((unsigned int) 0x7) // (TC) Clock selected: XC2 +#define AT91C_TC_CLKI ((unsigned int) 0x1 << 3) // (TC) Clock Invert +#define AT91C_TC_BURST ((unsigned int) 0x3 << 4) // (TC) Burst Signal Selection +#define AT91C_TC_BURST_NONE ((unsigned int) 0x0 << 4) // (TC) The clock is not gated by an external signal +#define AT91C_TC_BURST_XC0 ((unsigned int) 0x1 << 4) // (TC) XC0 is ANDed with the selected clock +#define AT91C_TC_BURST_XC1 ((unsigned int) 0x2 << 4) // (TC) XC1 is ANDed with the selected clock +#define AT91C_TC_BURST_XC2 ((unsigned int) 0x3 << 4) // (TC) XC2 is ANDed with the selected clock +#define AT91C_TC_CPCSTOP ((unsigned int) 0x1 << 6) // (TC) Counter Clock Stopped with RC Compare +#define AT91C_TC_LDBSTOP ((unsigned int) 0x1 << 6) // (TC) Counter Clock Stopped with RB Loading +#define AT91C_TC_CPCDIS ((unsigned int) 0x1 << 7) // (TC) Counter Clock Disable with RC Compare +#define AT91C_TC_LDBDIS ((unsigned int) 0x1 << 7) // (TC) Counter Clock Disabled with RB Loading +#define AT91C_TC_ETRGEDG ((unsigned int) 0x3 << 8) // (TC) External Trigger Edge Selection +#define AT91C_TC_ETRGEDG_NONE ((unsigned int) 0x0 << 8) // (TC) Edge: None +#define AT91C_TC_ETRGEDG_RISING ((unsigned int) 0x1 << 8) // (TC) Edge: rising edge +#define AT91C_TC_ETRGEDG_FALLING ((unsigned int) 0x2 << 8) // (TC) Edge: falling edge +#define AT91C_TC_ETRGEDG_BOTH ((unsigned int) 0x3 << 8) // (TC) Edge: each edge +#define AT91C_TC_EEVTEDG ((unsigned int) 0x3 << 8) // (TC) External Event Edge Selection +#define AT91C_TC_EEVTEDG_NONE ((unsigned int) 0x0 << 8) // (TC) Edge: None +#define AT91C_TC_EEVTEDG_RISING ((unsigned int) 0x1 << 8) // (TC) Edge: rising edge +#define AT91C_TC_EEVTEDG_FALLING ((unsigned int) 0x2 << 8) // (TC) Edge: falling edge +#define AT91C_TC_EEVTEDG_BOTH ((unsigned int) 0x3 << 8) // (TC) Edge: each edge +#define AT91C_TC_EEVT ((unsigned int) 0x3 << 10) // (TC) External Event Selection +#define AT91C_TC_EEVT_TIOB ((unsigned int) 0x0 << 10) // (TC) Signal selected as external event: TIOB TIOB direction: input +#define AT91C_TC_EEVT_XC0 ((unsigned int) 0x1 << 10) // (TC) Signal selected as external event: XC0 TIOB direction: output +#define AT91C_TC_EEVT_XC1 ((unsigned int) 0x2 << 10) // (TC) Signal selected as external event: XC1 TIOB direction: output +#define AT91C_TC_EEVT_XC2 ((unsigned int) 0x3 << 10) // (TC) Signal selected as external event: XC2 TIOB direction: output +#define AT91C_TC_ABETRG ((unsigned int) 0x1 << 10) // (TC) TIOA or TIOB External Trigger Selection +#define AT91C_TC_ENETRG ((unsigned int) 0x1 << 12) // (TC) External Event Trigger enable +#define AT91C_TC_WAVESEL ((unsigned int) 0x3 << 13) // (TC) Waveform Selection +#define AT91C_TC_WAVESEL_UP ((unsigned int) 0x0 << 13) // (TC) UP mode without atomatic trigger on RC Compare +#define AT91C_TC_WAVESEL_UPDOWN ((unsigned int) 0x1 << 13) // (TC) UPDOWN mode without automatic trigger on RC Compare +#define AT91C_TC_WAVESEL_UP_AUTO ((unsigned int) 0x2 << 13) // (TC) UP mode with automatic trigger on RC Compare +#define AT91C_TC_WAVESEL_UPDOWN_AUTO ((unsigned int) 0x3 << 13) // (TC) UPDOWN mode with automatic trigger on RC Compare +#define AT91C_TC_CPCTRG ((unsigned int) 0x1 << 14) // (TC) RC Compare Trigger Enable +#define AT91C_TC_WAVE ((unsigned int) 0x1 << 15) // (TC) +#define AT91C_TC_ACPA ((unsigned int) 0x3 << 16) // (TC) RA Compare Effect on TIOA +#define AT91C_TC_ACPA_NONE ((unsigned int) 0x0 << 16) // (TC) Effect: none +#define AT91C_TC_ACPA_SET ((unsigned int) 0x1 << 16) // (TC) Effect: set +#define AT91C_TC_ACPA_CLEAR ((unsigned int) 0x2 << 16) // (TC) Effect: clear +#define AT91C_TC_ACPA_TOGGLE ((unsigned int) 0x3 << 16) // (TC) Effect: toggle +#define AT91C_TC_LDRA ((unsigned int) 0x3 << 16) // (TC) RA Loading Selection +#define AT91C_TC_LDRA_NONE ((unsigned int) 0x0 << 16) // (TC) Edge: None +#define AT91C_TC_LDRA_RISING ((unsigned int) 0x1 << 16) // (TC) Edge: rising edge of TIOA +#define AT91C_TC_LDRA_FALLING ((unsigned int) 0x2 << 16) // (TC) Edge: falling edge of TIOA +#define AT91C_TC_LDRA_BOTH ((unsigned int) 0x3 << 16) // (TC) Edge: each edge of TIOA +#define AT91C_TC_ACPC ((unsigned int) 0x3 << 18) // (TC) RC Compare Effect on TIOA +#define AT91C_TC_ACPC_NONE ((unsigned int) 0x0 << 18) // (TC) Effect: none +#define AT91C_TC_ACPC_SET ((unsigned int) 0x1 << 18) // (TC) Effect: set +#define AT91C_TC_ACPC_CLEAR ((unsigned int) 0x2 << 18) // (TC) Effect: clear +#define AT91C_TC_ACPC_TOGGLE ((unsigned int) 0x3 << 18) // (TC) Effect: toggle +#define AT91C_TC_LDRB ((unsigned int) 0x3 << 18) // (TC) RB Loading Selection +#define AT91C_TC_LDRB_NONE ((unsigned int) 0x0 << 18) // (TC) Edge: None +#define AT91C_TC_LDRB_RISING ((unsigned int) 0x1 << 18) // (TC) Edge: rising edge of TIOA +#define AT91C_TC_LDRB_FALLING ((unsigned int) 0x2 << 18) // (TC) Edge: falling edge of TIOA +#define AT91C_TC_LDRB_BOTH ((unsigned int) 0x3 << 18) // (TC) Edge: each edge of TIOA +#define AT91C_TC_AEEVT ((unsigned int) 0x3 << 20) // (TC) External Event Effect on TIOA +#define AT91C_TC_AEEVT_NONE ((unsigned int) 0x0 << 20) // (TC) Effect: none +#define AT91C_TC_AEEVT_SET ((unsigned int) 0x1 << 20) // (TC) Effect: set +#define AT91C_TC_AEEVT_CLEAR ((unsigned int) 0x2 << 20) // (TC) Effect: clear +#define AT91C_TC_AEEVT_TOGGLE ((unsigned int) 0x3 << 20) // (TC) Effect: toggle +#define AT91C_TC_ASWTRG ((unsigned int) 0x3 << 22) // (TC) Software Trigger Effect on TIOA +#define AT91C_TC_ASWTRG_NONE ((unsigned int) 0x0 << 22) // (TC) Effect: none +#define AT91C_TC_ASWTRG_SET ((unsigned int) 0x1 << 22) // (TC) Effect: set +#define AT91C_TC_ASWTRG_CLEAR ((unsigned int) 0x2 << 22) // (TC) Effect: clear +#define AT91C_TC_ASWTRG_TOGGLE ((unsigned int) 0x3 << 22) // (TC) Effect: toggle +#define AT91C_TC_BCPB ((unsigned int) 0x3 << 24) // (TC) RB Compare Effect on TIOB +#define AT91C_TC_BCPB_NONE ((unsigned int) 0x0 << 24) // (TC) Effect: none +#define AT91C_TC_BCPB_SET ((unsigned int) 0x1 << 24) // (TC) Effect: set +#define AT91C_TC_BCPB_CLEAR ((unsigned int) 0x2 << 24) // (TC) Effect: clear +#define AT91C_TC_BCPB_TOGGLE ((unsigned int) 0x3 << 24) // (TC) Effect: toggle +#define AT91C_TC_BCPC ((unsigned int) 0x3 << 26) // (TC) RC Compare Effect on TIOB +#define AT91C_TC_BCPC_NONE ((unsigned int) 0x0 << 26) // (TC) Effect: none +#define AT91C_TC_BCPC_SET ((unsigned int) 0x1 << 26) // (TC) Effect: set +#define AT91C_TC_BCPC_CLEAR ((unsigned int) 0x2 << 26) // (TC) Effect: clear +#define AT91C_TC_BCPC_TOGGLE ((unsigned int) 0x3 << 26) // (TC) Effect: toggle +#define AT91C_TC_BEEVT ((unsigned int) 0x3 << 28) // (TC) External Event Effect on TIOB +#define AT91C_TC_BEEVT_NONE ((unsigned int) 0x0 << 28) // (TC) Effect: none +#define AT91C_TC_BEEVT_SET ((unsigned int) 0x1 << 28) // (TC) Effect: set +#define AT91C_TC_BEEVT_CLEAR ((unsigned int) 0x2 << 28) // (TC) Effect: clear +#define AT91C_TC_BEEVT_TOGGLE ((unsigned int) 0x3 << 28) // (TC) Effect: toggle +#define AT91C_TC_BSWTRG ((unsigned int) 0x3 << 30) // (TC) Software Trigger Effect on TIOB +#define AT91C_TC_BSWTRG_NONE ((unsigned int) 0x0 << 30) // (TC) Effect: none +#define AT91C_TC_BSWTRG_SET ((unsigned int) 0x1 << 30) // (TC) Effect: set +#define AT91C_TC_BSWTRG_CLEAR ((unsigned int) 0x2 << 30) // (TC) Effect: clear +#define AT91C_TC_BSWTRG_TOGGLE ((unsigned int) 0x3 << 30) // (TC) Effect: toggle +// -------- TC_SR : (TC Offset: 0x20) TC Channel Status Register -------- +#define AT91C_TC_COVFS ((unsigned int) 0x1 << 0) // (TC) Counter Overflow +#define AT91C_TC_LOVRS ((unsigned int) 0x1 << 1) // (TC) Load Overrun +#define AT91C_TC_CPAS ((unsigned int) 0x1 << 2) // (TC) RA Compare +#define AT91C_TC_CPBS ((unsigned int) 0x1 << 3) // (TC) RB Compare +#define AT91C_TC_CPCS ((unsigned int) 0x1 << 4) // (TC) RC Compare +#define AT91C_TC_LDRAS ((unsigned int) 0x1 << 5) // (TC) RA Loading +#define AT91C_TC_LDRBS ((unsigned int) 0x1 << 6) // (TC) RB Loading +#define AT91C_TC_ETRGS ((unsigned int) 0x1 << 7) // (TC) External Trigger +#define AT91C_TC_CLKSTA ((unsigned int) 0x1 << 16) // (TC) Clock Enabling +#define AT91C_TC_MTIOA ((unsigned int) 0x1 << 17) // (TC) TIOA Mirror +#define AT91C_TC_MTIOB ((unsigned int) 0x1 << 18) // (TC) TIOA Mirror +// -------- TC_IER : (TC Offset: 0x24) TC Channel Interrupt Enable Register -------- +// -------- TC_IDR : (TC Offset: 0x28) TC Channel Interrupt Disable Register -------- +// -------- TC_IMR : (TC Offset: 0x2c) TC Channel Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Timer Counter Interface +// ***************************************************************************** +typedef struct _AT91S_TCB { + AT91S_TC TCB_TC0; // TC Channel 0 + AT91_REG Reserved0[4]; // + AT91S_TC TCB_TC1; // TC Channel 1 + AT91_REG Reserved1[4]; // + AT91S_TC TCB_TC2; // TC Channel 2 + AT91_REG Reserved2[4]; // + AT91_REG TCB_BCR; // TC Block Control Register + AT91_REG TCB_BMR; // TC Block Mode Register +} AT91S_TCB, *AT91PS_TCB; + +// -------- TCB_BCR : (TCB Offset: 0xc0) TC Block Control Register -------- +#define AT91C_TCB_SYNC ((unsigned int) 0x1 << 0) // (TCB) Synchro Command +// -------- TCB_BMR : (TCB Offset: 0xc4) TC Block Mode Register -------- +#define AT91C_TCB_TC0XC0S ((unsigned int) 0x3 << 0) // (TCB) External Clock Signal 0 Selection +#define AT91C_TCB_TC0XC0S_TCLK0 ((unsigned int) 0x0) // (TCB) TCLK0 connected to XC0 +#define AT91C_TCB_TC0XC0S_NONE ((unsigned int) 0x1) // (TCB) None signal connected to XC0 +#define AT91C_TCB_TC0XC0S_TIOA1 ((unsigned int) 0x2) // (TCB) TIOA1 connected to XC0 +#define AT91C_TCB_TC0XC0S_TIOA2 ((unsigned int) 0x3) // (TCB) TIOA2 connected to XC0 +#define AT91C_TCB_TC1XC1S ((unsigned int) 0x3 << 2) // (TCB) External Clock Signal 1 Selection +#define AT91C_TCB_TC1XC1S_TCLK1 ((unsigned int) 0x0 << 2) // (TCB) TCLK1 connected to XC1 +#define AT91C_TCB_TC1XC1S_NONE ((unsigned int) 0x1 << 2) // (TCB) None signal connected to XC1 +#define AT91C_TCB_TC1XC1S_TIOA0 ((unsigned int) 0x2 << 2) // (TCB) TIOA0 connected to XC1 +#define AT91C_TCB_TC1XC1S_TIOA2 ((unsigned int) 0x3 << 2) // (TCB) TIOA2 connected to XC1 +#define AT91C_TCB_TC2XC2S ((unsigned int) 0x3 << 4) // (TCB) External Clock Signal 2 Selection +#define AT91C_TCB_TC2XC2S_TCLK2 ((unsigned int) 0x0 << 4) // (TCB) TCLK2 connected to XC2 +#define AT91C_TCB_TC2XC2S_NONE ((unsigned int) 0x1 << 4) // (TCB) None signal connected to XC2 +#define AT91C_TCB_TC2XC2S_TIOA0 ((unsigned int) 0x2 << 4) // (TCB) TIOA0 connected to XC2 +#define AT91C_TCB_TC2XC2S_TIOA1 ((unsigned int) 0x3 << 4) // (TCB) TIOA2 connected to XC2 + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Control Area Network MailBox Interface +// ***************************************************************************** +typedef struct _AT91S_CAN_MB { + AT91_REG CAN_MB_MMR; // MailBox Mode Register + AT91_REG CAN_MB_MAM; // MailBox Acceptance Mask Register + AT91_REG CAN_MB_MID; // MailBox ID Register + AT91_REG CAN_MB_MFID; // MailBox Family ID Register + AT91_REG CAN_MB_MSR; // MailBox Status Register + AT91_REG CAN_MB_MDL; // MailBox Data Low Register + AT91_REG CAN_MB_MDH; // MailBox Data High Register + AT91_REG CAN_MB_MCR; // MailBox Control Register +} AT91S_CAN_MB, *AT91PS_CAN_MB; + +// -------- CAN_MMR : (CAN_MB Offset: 0x0) CAN Message Mode Register -------- +#define AT91C_CAN_MTIMEMARK ((unsigned int) 0xFFFF << 0) // (CAN_MB) Mailbox Timemark +#define AT91C_CAN_PRIOR ((unsigned int) 0xF << 16) // (CAN_MB) Mailbox Priority +#define AT91C_CAN_MOT ((unsigned int) 0x7 << 24) // (CAN_MB) Mailbox Object Type +#define AT91C_CAN_MOT_DIS ((unsigned int) 0x0 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_RX ((unsigned int) 0x1 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_RXOVERWRITE ((unsigned int) 0x2 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_TX ((unsigned int) 0x3 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_CONSUMER ((unsigned int) 0x4 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_PRODUCER ((unsigned int) 0x5 << 24) // (CAN_MB) +// -------- CAN_MAM : (CAN_MB Offset: 0x4) CAN Message Acceptance Mask Register -------- +#define AT91C_CAN_MIDvB ((unsigned int) 0x3FFFF << 0) // (CAN_MB) Complementary bits for identifier in extended mode +#define AT91C_CAN_MIDvA ((unsigned int) 0x7FF << 18) // (CAN_MB) Identifier for standard frame mode +#define AT91C_CAN_MIDE ((unsigned int) 0x1 << 29) // (CAN_MB) Identifier Version +// -------- CAN_MID : (CAN_MB Offset: 0x8) CAN Message ID Register -------- +// -------- CAN_MFID : (CAN_MB Offset: 0xc) CAN Message Family ID Register -------- +// -------- CAN_MSR : (CAN_MB Offset: 0x10) CAN Message Status Register -------- +#define AT91C_CAN_MTIMESTAMP ((unsigned int) 0xFFFF << 0) // (CAN_MB) Timer Value +#define AT91C_CAN_MDLC ((unsigned int) 0xF << 16) // (CAN_MB) Mailbox Data Length Code +#define AT91C_CAN_MRTR ((unsigned int) 0x1 << 20) // (CAN_MB) Mailbox Remote Transmission Request +#define AT91C_CAN_MABT ((unsigned int) 0x1 << 22) // (CAN_MB) Mailbox Message Abort +#define AT91C_CAN_MRDY ((unsigned int) 0x1 << 23) // (CAN_MB) Mailbox Ready +#define AT91C_CAN_MMI ((unsigned int) 0x1 << 24) // (CAN_MB) Mailbox Message Ignored +// -------- CAN_MDL : (CAN_MB Offset: 0x14) CAN Message Data Low Register -------- +// -------- CAN_MDH : (CAN_MB Offset: 0x18) CAN Message Data High Register -------- +// -------- CAN_MCR : (CAN_MB Offset: 0x1c) CAN Message Control Register -------- +#define AT91C_CAN_MACR ((unsigned int) 0x1 << 22) // (CAN_MB) Abort Request for Mailbox +#define AT91C_CAN_MTCR ((unsigned int) 0x1 << 23) // (CAN_MB) Mailbox Transfer Command + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Control Area Network Interface +// ***************************************************************************** +typedef struct _AT91S_CAN { + AT91_REG CAN_MR; // Mode Register + AT91_REG CAN_IER; // Interrupt Enable Register + AT91_REG CAN_IDR; // Interrupt Disable Register + AT91_REG CAN_IMR; // Interrupt Mask Register + AT91_REG CAN_SR; // Status Register + AT91_REG CAN_BR; // Baudrate Register + AT91_REG CAN_TIM; // Timer Register + AT91_REG CAN_TIMESTP; // Time Stamp Register + AT91_REG CAN_ECR; // Error Counter Register + AT91_REG CAN_TCR; // Transfer Command Register + AT91_REG CAN_ACR; // Abort Command Register + AT91_REG Reserved0[52]; // + AT91_REG CAN_VR; // Version Register + AT91_REG Reserved1[64]; // + AT91S_CAN_MB CAN_MB0; // CAN Mailbox 0 + AT91S_CAN_MB CAN_MB1; // CAN Mailbox 1 + AT91S_CAN_MB CAN_MB2; // CAN Mailbox 2 + AT91S_CAN_MB CAN_MB3; // CAN Mailbox 3 + AT91S_CAN_MB CAN_MB4; // CAN Mailbox 4 + AT91S_CAN_MB CAN_MB5; // CAN Mailbox 5 + AT91S_CAN_MB CAN_MB6; // CAN Mailbox 6 + AT91S_CAN_MB CAN_MB7; // CAN Mailbox 7 + AT91S_CAN_MB CAN_MB8; // CAN Mailbox 8 + AT91S_CAN_MB CAN_MB9; // CAN Mailbox 9 + AT91S_CAN_MB CAN_MB10; // CAN Mailbox 10 + AT91S_CAN_MB CAN_MB11; // CAN Mailbox 11 + AT91S_CAN_MB CAN_MB12; // CAN Mailbox 12 + AT91S_CAN_MB CAN_MB13; // CAN Mailbox 13 + AT91S_CAN_MB CAN_MB14; // CAN Mailbox 14 + AT91S_CAN_MB CAN_MB15; // CAN Mailbox 15 +} AT91S_CAN, *AT91PS_CAN; + +// -------- CAN_MR : (CAN Offset: 0x0) CAN Mode Register -------- +#define AT91C_CAN_CANEN ((unsigned int) 0x1 << 0) // (CAN) CAN Controller Enable +#define AT91C_CAN_LPM ((unsigned int) 0x1 << 1) // (CAN) Disable/Enable Low Power Mode +#define AT91C_CAN_ABM ((unsigned int) 0x1 << 2) // (CAN) Disable/Enable Autobaud/Listen Mode +#define AT91C_CAN_OVL ((unsigned int) 0x1 << 3) // (CAN) Disable/Enable Overload Frame +#define AT91C_CAN_TEOF ((unsigned int) 0x1 << 4) // (CAN) Time Stamp messages at each end of Frame +#define AT91C_CAN_TTM ((unsigned int) 0x1 << 5) // (CAN) Disable/Enable Time Trigger Mode +#define AT91C_CAN_TIMFRZ ((unsigned int) 0x1 << 6) // (CAN) Enable Timer Freeze +#define AT91C_CAN_DRPT ((unsigned int) 0x1 << 7) // (CAN) Disable Repeat +// -------- CAN_IER : (CAN Offset: 0x4) CAN Interrupt Enable Register -------- +#define AT91C_CAN_MB0 ((unsigned int) 0x1 << 0) // (CAN) Mailbox 0 Flag +#define AT91C_CAN_MB1 ((unsigned int) 0x1 << 1) // (CAN) Mailbox 1 Flag +#define AT91C_CAN_MB2 ((unsigned int) 0x1 << 2) // (CAN) Mailbox 2 Flag +#define AT91C_CAN_MB3 ((unsigned int) 0x1 << 3) // (CAN) Mailbox 3 Flag +#define AT91C_CAN_MB4 ((unsigned int) 0x1 << 4) // (CAN) Mailbox 4 Flag +#define AT91C_CAN_MB5 ((unsigned int) 0x1 << 5) // (CAN) Mailbox 5 Flag +#define AT91C_CAN_MB6 ((unsigned int) 0x1 << 6) // (CAN) Mailbox 6 Flag +#define AT91C_CAN_MB7 ((unsigned int) 0x1 << 7) // (CAN) Mailbox 7 Flag +#define AT91C_CAN_MB8 ((unsigned int) 0x1 << 8) // (CAN) Mailbox 8 Flag +#define AT91C_CAN_MB9 ((unsigned int) 0x1 << 9) // (CAN) Mailbox 9 Flag +#define AT91C_CAN_MB10 ((unsigned int) 0x1 << 10) // (CAN) Mailbox 10 Flag +#define AT91C_CAN_MB11 ((unsigned int) 0x1 << 11) // (CAN) Mailbox 11 Flag +#define AT91C_CAN_MB12 ((unsigned int) 0x1 << 12) // (CAN) Mailbox 12 Flag +#define AT91C_CAN_MB13 ((unsigned int) 0x1 << 13) // (CAN) Mailbox 13 Flag +#define AT91C_CAN_MB14 ((unsigned int) 0x1 << 14) // (CAN) Mailbox 14 Flag +#define AT91C_CAN_MB15 ((unsigned int) 0x1 << 15) // (CAN) Mailbox 15 Flag +#define AT91C_CAN_ERRA ((unsigned int) 0x1 << 16) // (CAN) Error Active Mode Flag +#define AT91C_CAN_WARN ((unsigned int) 0x1 << 17) // (CAN) Warning Limit Flag +#define AT91C_CAN_ERRP ((unsigned int) 0x1 << 18) // (CAN) Error Passive Mode Flag +#define AT91C_CAN_BOFF ((unsigned int) 0x1 << 19) // (CAN) Bus Off Mode Flag +#define AT91C_CAN_SLEEP ((unsigned int) 0x1 << 20) // (CAN) Sleep Flag +#define AT91C_CAN_WAKEUP ((unsigned int) 0x1 << 21) // (CAN) Wakeup Flag +#define AT91C_CAN_TOVF ((unsigned int) 0x1 << 22) // (CAN) Timer Overflow Flag +#define AT91C_CAN_TSTP ((unsigned int) 0x1 << 23) // (CAN) Timestamp Flag +#define AT91C_CAN_CERR ((unsigned int) 0x1 << 24) // (CAN) CRC Error +#define AT91C_CAN_SERR ((unsigned int) 0x1 << 25) // (CAN) Stuffing Error +#define AT91C_CAN_AERR ((unsigned int) 0x1 << 26) // (CAN) Acknowledgment Error +#define AT91C_CAN_FERR ((unsigned int) 0x1 << 27) // (CAN) Form Error +#define AT91C_CAN_BERR ((unsigned int) 0x1 << 28) // (CAN) Bit Error +// -------- CAN_IDR : (CAN Offset: 0x8) CAN Interrupt Disable Register -------- +// -------- CAN_IMR : (CAN Offset: 0xc) CAN Interrupt Mask Register -------- +// -------- CAN_SR : (CAN Offset: 0x10) CAN Status Register -------- +#define AT91C_CAN_RBSY ((unsigned int) 0x1 << 29) // (CAN) Receiver Busy +#define AT91C_CAN_TBSY ((unsigned int) 0x1 << 30) // (CAN) Transmitter Busy +#define AT91C_CAN_OVLY ((unsigned int) 0x1 << 31) // (CAN) Overload Busy +// -------- CAN_BR : (CAN Offset: 0x14) CAN Baudrate Register -------- +#define AT91C_CAN_PHASE2 ((unsigned int) 0x7 << 0) // (CAN) Phase 2 segment +#define AT91C_CAN_PHASE1 ((unsigned int) 0x7 << 4) // (CAN) Phase 1 segment +#define AT91C_CAN_PROPAG ((unsigned int) 0x7 << 8) // (CAN) Programmation time segment +#define AT91C_CAN_SYNC ((unsigned int) 0x3 << 12) // (CAN) Re-synchronization jump width segment +#define AT91C_CAN_BRP ((unsigned int) 0x7F << 16) // (CAN) Baudrate Prescaler +#define AT91C_CAN_SMP ((unsigned int) 0x1 << 24) // (CAN) Sampling mode +// -------- CAN_TIM : (CAN Offset: 0x18) CAN Timer Register -------- +#define AT91C_CAN_TIMER ((unsigned int) 0xFFFF << 0) // (CAN) Timer field +// -------- CAN_TIMESTP : (CAN Offset: 0x1c) CAN Timestamp Register -------- +// -------- CAN_ECR : (CAN Offset: 0x20) CAN Error Counter Register -------- +#define AT91C_CAN_REC ((unsigned int) 0xFF << 0) // (CAN) Receive Error Counter +#define AT91C_CAN_TEC ((unsigned int) 0xFF << 16) // (CAN) Transmit Error Counter +// -------- CAN_TCR : (CAN Offset: 0x24) CAN Transfer Command Register -------- +#define AT91C_CAN_TIMRST ((unsigned int) 0x1 << 31) // (CAN) Timer Reset Field +// -------- CAN_ACR : (CAN Offset: 0x28) CAN Abort Command Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Ethernet MAC 10/100 +// ***************************************************************************** +typedef struct _AT91S_EMAC { + AT91_REG EMAC_NCR; // Network Control Register + AT91_REG EMAC_NCFGR; // Network Configuration Register + AT91_REG EMAC_NSR; // Network Status Register + AT91_REG Reserved0[2]; // + AT91_REG EMAC_TSR; // Transmit Status Register + AT91_REG EMAC_RBQP; // Receive Buffer Queue Pointer + AT91_REG EMAC_TBQP; // Transmit Buffer Queue Pointer + AT91_REG EMAC_RSR; // Receive Status Register + AT91_REG EMAC_ISR; // Interrupt Status Register + AT91_REG EMAC_IER; // Interrupt Enable Register + AT91_REG EMAC_IDR; // Interrupt Disable Register + AT91_REG EMAC_IMR; // Interrupt Mask Register + AT91_REG EMAC_MAN; // PHY Maintenance Register + AT91_REG EMAC_PTR; // Pause Time Register + AT91_REG EMAC_PFR; // Pause Frames received Register + AT91_REG EMAC_FTO; // Frames Transmitted OK Register + AT91_REG EMAC_SCF; // Single Collision Frame Register + AT91_REG EMAC_MCF; // Multiple Collision Frame Register + AT91_REG EMAC_FRO; // Frames Received OK Register + AT91_REG EMAC_FCSE; // Frame Check Sequence Error Register + AT91_REG EMAC_ALE; // Alignment Error Register + AT91_REG EMAC_DTF; // Deferred Transmission Frame Register + AT91_REG EMAC_LCOL; // Late Collision Register + AT91_REG EMAC_ECOL; // Excessive Collision Register + AT91_REG EMAC_TUND; // Transmit Underrun Error Register + AT91_REG EMAC_CSE; // Carrier Sense Error Register + AT91_REG EMAC_RRE; // Receive Ressource Error Register + AT91_REG EMAC_ROV; // Receive Overrun Errors Register + AT91_REG EMAC_RSE; // Receive Symbol Errors Register + AT91_REG EMAC_ELE; // Excessive Length Errors Register + AT91_REG EMAC_RJA; // Receive Jabbers Register + AT91_REG EMAC_USF; // Undersize Frames Register + AT91_REG EMAC_STE; // SQE Test Error Register + AT91_REG EMAC_RLE; // Receive Length Field Mismatch Register + AT91_REG EMAC_TPF; // Transmitted Pause Frames Register + AT91_REG EMAC_HRB; // Hash Address Bottom[31:0] + AT91_REG EMAC_HRT; // Hash Address Top[63:32] + AT91_REG EMAC_SA1L; // Specific Address 1 Bottom, First 4 bytes + AT91_REG EMAC_SA1H; // Specific Address 1 Top, Last 2 bytes + AT91_REG EMAC_SA2L; // Specific Address 2 Bottom, First 4 bytes + AT91_REG EMAC_SA2H; // Specific Address 2 Top, Last 2 bytes + AT91_REG EMAC_SA3L; // Specific Address 3 Bottom, First 4 bytes + AT91_REG EMAC_SA3H; // Specific Address 3 Top, Last 2 bytes + AT91_REG EMAC_SA4L; // Specific Address 4 Bottom, First 4 bytes + AT91_REG EMAC_SA4H; // Specific Address 4 Top, Last 2 bytes + AT91_REG EMAC_TID; // Type ID Checking Register + AT91_REG EMAC_TPQ; // Transmit Pause Quantum Register + AT91_REG EMAC_USRIO; // USER Input/Output Register + AT91_REG EMAC_WOL; // Wake On LAN Register + AT91_REG Reserved1[13]; // + AT91_REG EMAC_REV; // Revision Register +} AT91S_EMAC, *AT91PS_EMAC; + +// -------- EMAC_NCR : (EMAC Offset: 0x0) -------- +#define AT91C_EMAC_LB ((unsigned int) 0x1 << 0) // (EMAC) Loopback. Optional. When set, loopback signal is at high level. +#define AT91C_EMAC_LLB ((unsigned int) 0x1 << 1) // (EMAC) Loopback local. +#define AT91C_EMAC_RE ((unsigned int) 0x1 << 2) // (EMAC) Receive enable. +#define AT91C_EMAC_TE ((unsigned int) 0x1 << 3) // (EMAC) Transmit enable. +#define AT91C_EMAC_MPE ((unsigned int) 0x1 << 4) // (EMAC) Management port enable. +#define AT91C_EMAC_CLRSTAT ((unsigned int) 0x1 << 5) // (EMAC) Clear statistics registers. +#define AT91C_EMAC_INCSTAT ((unsigned int) 0x1 << 6) // (EMAC) Increment statistics registers. +#define AT91C_EMAC_WESTAT ((unsigned int) 0x1 << 7) // (EMAC) Write enable for statistics registers. +#define AT91C_EMAC_BP ((unsigned int) 0x1 << 8) // (EMAC) Back pressure. +#define AT91C_EMAC_TSTART ((unsigned int) 0x1 << 9) // (EMAC) Start Transmission. +#define AT91C_EMAC_THALT ((unsigned int) 0x1 << 10) // (EMAC) Transmission Halt. +#define AT91C_EMAC_TPFR ((unsigned int) 0x1 << 11) // (EMAC) Transmit pause frame +#define AT91C_EMAC_TZQ ((unsigned int) 0x1 << 12) // (EMAC) Transmit zero quantum pause frame +// -------- EMAC_NCFGR : (EMAC Offset: 0x4) Network Configuration Register -------- +#define AT91C_EMAC_SPD ((unsigned int) 0x1 << 0) // (EMAC) Speed. +#define AT91C_EMAC_FD ((unsigned int) 0x1 << 1) // (EMAC) Full duplex. +#define AT91C_EMAC_JFRAME ((unsigned int) 0x1 << 3) // (EMAC) Jumbo Frames. +#define AT91C_EMAC_CAF ((unsigned int) 0x1 << 4) // (EMAC) Copy all frames. +#define AT91C_EMAC_NBC ((unsigned int) 0x1 << 5) // (EMAC) No broadcast. +#define AT91C_EMAC_MTI ((unsigned int) 0x1 << 6) // (EMAC) Multicast hash event enable +#define AT91C_EMAC_UNI ((unsigned int) 0x1 << 7) // (EMAC) Unicast hash enable. +#define AT91C_EMAC_BIG ((unsigned int) 0x1 << 8) // (EMAC) Receive 1522 bytes. +#define AT91C_EMAC_EAE ((unsigned int) 0x1 << 9) // (EMAC) External address match enable. +#define AT91C_EMAC_CLK ((unsigned int) 0x3 << 10) // (EMAC) +#define AT91C_EMAC_CLK_HCLK_8 ((unsigned int) 0x0 << 10) // (EMAC) HCLK divided by 8 +#define AT91C_EMAC_CLK_HCLK_16 ((unsigned int) 0x1 << 10) // (EMAC) HCLK divided by 16 +#define AT91C_EMAC_CLK_HCLK_32 ((unsigned int) 0x2 << 10) // (EMAC) HCLK divided by 32 +#define AT91C_EMAC_CLK_HCLK_64 ((unsigned int) 0x3 << 10) // (EMAC) HCLK divided by 64 +#define AT91C_EMAC_RTY ((unsigned int) 0x1 << 12) // (EMAC) +#define AT91C_EMAC_PAE ((unsigned int) 0x1 << 13) // (EMAC) +#define AT91C_EMAC_RBOF ((unsigned int) 0x3 << 14) // (EMAC) +#define AT91C_EMAC_RBOF_OFFSET_0 ((unsigned int) 0x0 << 14) // (EMAC) no offset from start of receive buffer +#define AT91C_EMAC_RBOF_OFFSET_1 ((unsigned int) 0x1 << 14) // (EMAC) one byte offset from start of receive buffer +#define AT91C_EMAC_RBOF_OFFSET_2 ((unsigned int) 0x2 << 14) // (EMAC) two bytes offset from start of receive buffer +#define AT91C_EMAC_RBOF_OFFSET_3 ((unsigned int) 0x3 << 14) // (EMAC) three bytes offset from start of receive buffer +#define AT91C_EMAC_RLCE ((unsigned int) 0x1 << 16) // (EMAC) Receive Length field Checking Enable +#define AT91C_EMAC_DRFCS ((unsigned int) 0x1 << 17) // (EMAC) Discard Receive FCS +#define AT91C_EMAC_EFRHD ((unsigned int) 0x1 << 18) // (EMAC) +#define AT91C_EMAC_IRXFCS ((unsigned int) 0x1 << 19) // (EMAC) Ignore RX FCS +// -------- EMAC_NSR : (EMAC Offset: 0x8) Network Status Register -------- +#define AT91C_EMAC_LINKR ((unsigned int) 0x1 << 0) // (EMAC) +#define AT91C_EMAC_MDIO ((unsigned int) 0x1 << 1) // (EMAC) +#define AT91C_EMAC_IDLE ((unsigned int) 0x1 << 2) // (EMAC) +// -------- EMAC_TSR : (EMAC Offset: 0x14) Transmit Status Register -------- +#define AT91C_EMAC_UBR ((unsigned int) 0x1 << 0) // (EMAC) +#define AT91C_EMAC_COL ((unsigned int) 0x1 << 1) // (EMAC) +#define AT91C_EMAC_RLES ((unsigned int) 0x1 << 2) // (EMAC) +#define AT91C_EMAC_TGO ((unsigned int) 0x1 << 3) // (EMAC) Transmit Go +#define AT91C_EMAC_BEX ((unsigned int) 0x1 << 4) // (EMAC) Buffers exhausted mid frame +#define AT91C_EMAC_COMP ((unsigned int) 0x1 << 5) // (EMAC) +#define AT91C_EMAC_UND ((unsigned int) 0x1 << 6) // (EMAC) +// -------- EMAC_RSR : (EMAC Offset: 0x20) Receive Status Register -------- +#define AT91C_EMAC_BNA ((unsigned int) 0x1 << 0) // (EMAC) +#define AT91C_EMAC_REC ((unsigned int) 0x1 << 1) // (EMAC) +#define AT91C_EMAC_OVR ((unsigned int) 0x1 << 2) // (EMAC) +// -------- EMAC_ISR : (EMAC Offset: 0x24) Interrupt Status Register -------- +#define AT91C_EMAC_MFD ((unsigned int) 0x1 << 0) // (EMAC) +#define AT91C_EMAC_RCOMP ((unsigned int) 0x1 << 1) // (EMAC) +#define AT91C_EMAC_RXUBR ((unsigned int) 0x1 << 2) // (EMAC) +#define AT91C_EMAC_TXUBR ((unsigned int) 0x1 << 3) // (EMAC) +#define AT91C_EMAC_TUNDR ((unsigned int) 0x1 << 4) // (EMAC) +#define AT91C_EMAC_RLEX ((unsigned int) 0x1 << 5) // (EMAC) +#define AT91C_EMAC_TXERR ((unsigned int) 0x1 << 6) // (EMAC) +#define AT91C_EMAC_TCOMP ((unsigned int) 0x1 << 7) // (EMAC) +#define AT91C_EMAC_LINK ((unsigned int) 0x1 << 9) // (EMAC) +#define AT91C_EMAC_ROVR ((unsigned int) 0x1 << 10) // (EMAC) +#define AT91C_EMAC_HRESP ((unsigned int) 0x1 << 11) // (EMAC) +#define AT91C_EMAC_PFRE ((unsigned int) 0x1 << 12) // (EMAC) +#define AT91C_EMAC_PTZ ((unsigned int) 0x1 << 13) // (EMAC) +// -------- EMAC_IER : (EMAC Offset: 0x28) Interrupt Enable Register -------- +// -------- EMAC_IDR : (EMAC Offset: 0x2c) Interrupt Disable Register -------- +// -------- EMAC_IMR : (EMAC Offset: 0x30) Interrupt Mask Register -------- +// -------- EMAC_MAN : (EMAC Offset: 0x34) PHY Maintenance Register -------- +#define AT91C_EMAC_DATA ((unsigned int) 0xFFFF << 0) // (EMAC) +#define AT91C_EMAC_CODE ((unsigned int) 0x3 << 16) // (EMAC) +#define AT91C_EMAC_REGA ((unsigned int) 0x1F << 18) // (EMAC) +#define AT91C_EMAC_PHYA ((unsigned int) 0x1F << 23) // (EMAC) +#define AT91C_EMAC_RW ((unsigned int) 0x3 << 28) // (EMAC) +#define AT91C_EMAC_SOF ((unsigned int) 0x3 << 30) // (EMAC) +// -------- EMAC_USRIO : (EMAC Offset: 0xc0) USER Input Output Register -------- +#define AT91C_EMAC_RMII ((unsigned int) 0x1 << 0) // (EMAC) Reduce MII +// -------- EMAC_WOL : (EMAC Offset: 0xc4) Wake On LAN Register -------- +#define AT91C_EMAC_IP ((unsigned int) 0xFFFF << 0) // (EMAC) ARP request IP address +#define AT91C_EMAC_MAG ((unsigned int) 0x1 << 16) // (EMAC) Magic packet event enable +#define AT91C_EMAC_ARP ((unsigned int) 0x1 << 17) // (EMAC) ARP request event enable +#define AT91C_EMAC_SA1 ((unsigned int) 0x1 << 18) // (EMAC) Specific address register 1 event enable +// -------- EMAC_REV : (EMAC Offset: 0xfc) Revision Register -------- +#define AT91C_EMAC_REVREF ((unsigned int) 0xFFFF << 0) // (EMAC) +#define AT91C_EMAC_PARTREF ((unsigned int) 0xFFFF << 16) // (EMAC) + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Analog to Digital Convertor +// ***************************************************************************** +typedef struct _AT91S_ADC { + AT91_REG ADC_CR; // ADC Control Register + AT91_REG ADC_MR; // ADC Mode Register + AT91_REG Reserved0[2]; // + AT91_REG ADC_CHER; // ADC Channel Enable Register + AT91_REG ADC_CHDR; // ADC Channel Disable Register + AT91_REG ADC_CHSR; // ADC Channel Status Register + AT91_REG ADC_SR; // ADC Status Register + AT91_REG ADC_LCDR; // ADC Last Converted Data Register + AT91_REG ADC_IER; // ADC Interrupt Enable Register + AT91_REG ADC_IDR; // ADC Interrupt Disable Register + AT91_REG ADC_IMR; // ADC Interrupt Mask Register + AT91_REG ADC_CDR0; // ADC Channel Data Register 0 + AT91_REG ADC_CDR1; // ADC Channel Data Register 1 + AT91_REG ADC_CDR2; // ADC Channel Data Register 2 + AT91_REG ADC_CDR3; // ADC Channel Data Register 3 + AT91_REG ADC_CDR4; // ADC Channel Data Register 4 + AT91_REG ADC_CDR5; // ADC Channel Data Register 5 + AT91_REG ADC_CDR6; // ADC Channel Data Register 6 + AT91_REG ADC_CDR7; // ADC Channel Data Register 7 + AT91_REG Reserved1[44]; // + AT91_REG ADC_RPR; // Receive Pointer Register + AT91_REG ADC_RCR; // Receive Counter Register + AT91_REG ADC_TPR; // Transmit Pointer Register + AT91_REG ADC_TCR; // Transmit Counter Register + AT91_REG ADC_RNPR; // Receive Next Pointer Register + AT91_REG ADC_RNCR; // Receive Next Counter Register + AT91_REG ADC_TNPR; // Transmit Next Pointer Register + AT91_REG ADC_TNCR; // Transmit Next Counter Register + AT91_REG ADC_PTCR; // PDC Transfer Control Register + AT91_REG ADC_PTSR; // PDC Transfer Status Register +} AT91S_ADC, *AT91PS_ADC; + +// -------- ADC_CR : (ADC Offset: 0x0) ADC Control Register -------- +#define AT91C_ADC_SWRST ((unsigned int) 0x1 << 0) // (ADC) Software Reset +#define AT91C_ADC_START ((unsigned int) 0x1 << 1) // (ADC) Start Conversion +// -------- ADC_MR : (ADC Offset: 0x4) ADC Mode Register -------- +#define AT91C_ADC_TRGEN ((unsigned int) 0x1 << 0) // (ADC) Trigger Enable +#define AT91C_ADC_TRGEN_DIS ((unsigned int) 0x0) // (ADC) Hradware triggers are disabled. Starting a conversion is only possible by software +#define AT91C_ADC_TRGEN_EN ((unsigned int) 0x1) // (ADC) Hardware trigger selected by TRGSEL field is enabled. +#define AT91C_ADC_TRGSEL ((unsigned int) 0x7 << 1) // (ADC) Trigger Selection +#define AT91C_ADC_TRGSEL_TIOA0 ((unsigned int) 0x0 << 1) // (ADC) Selected TRGSEL = TIAO0 +#define AT91C_ADC_TRGSEL_TIOA1 ((unsigned int) 0x1 << 1) // (ADC) Selected TRGSEL = TIAO1 +#define AT91C_ADC_TRGSEL_TIOA2 ((unsigned int) 0x2 << 1) // (ADC) Selected TRGSEL = TIAO2 +#define AT91C_ADC_TRGSEL_TIOA3 ((unsigned int) 0x3 << 1) // (ADC) Selected TRGSEL = TIAO3 +#define AT91C_ADC_TRGSEL_TIOA4 ((unsigned int) 0x4 << 1) // (ADC) Selected TRGSEL = TIAO4 +#define AT91C_ADC_TRGSEL_TIOA5 ((unsigned int) 0x5 << 1) // (ADC) Selected TRGSEL = TIAO5 +#define AT91C_ADC_TRGSEL_EXT ((unsigned int) 0x6 << 1) // (ADC) Selected TRGSEL = External Trigger +#define AT91C_ADC_LOWRES ((unsigned int) 0x1 << 4) // (ADC) Resolution. +#define AT91C_ADC_LOWRES_10_BIT ((unsigned int) 0x0 << 4) // (ADC) 10-bit resolution +#define AT91C_ADC_LOWRES_8_BIT ((unsigned int) 0x1 << 4) // (ADC) 8-bit resolution +#define AT91C_ADC_SLEEP ((unsigned int) 0x1 << 5) // (ADC) Sleep Mode +#define AT91C_ADC_SLEEP_NORMAL_MODE ((unsigned int) 0x0 << 5) // (ADC) Normal Mode +#define AT91C_ADC_SLEEP_MODE ((unsigned int) 0x1 << 5) // (ADC) Sleep Mode +#define AT91C_ADC_PRESCAL ((unsigned int) 0x3F << 8) // (ADC) Prescaler rate selection +#define AT91C_ADC_STARTUP ((unsigned int) 0x1F << 16) // (ADC) Startup Time +#define AT91C_ADC_SHTIM ((unsigned int) 0xF << 24) // (ADC) Sample & Hold Time +// -------- ADC_CHER : (ADC Offset: 0x10) ADC Channel Enable Register -------- +#define AT91C_ADC_CH0 ((unsigned int) 0x1 << 0) // (ADC) Channel 0 +#define AT91C_ADC_CH1 ((unsigned int) 0x1 << 1) // (ADC) Channel 1 +#define AT91C_ADC_CH2 ((unsigned int) 0x1 << 2) // (ADC) Channel 2 +#define AT91C_ADC_CH3 ((unsigned int) 0x1 << 3) // (ADC) Channel 3 +#define AT91C_ADC_CH4 ((unsigned int) 0x1 << 4) // (ADC) Channel 4 +#define AT91C_ADC_CH5 ((unsigned int) 0x1 << 5) // (ADC) Channel 5 +#define AT91C_ADC_CH6 ((unsigned int) 0x1 << 6) // (ADC) Channel 6 +#define AT91C_ADC_CH7 ((unsigned int) 0x1 << 7) // (ADC) Channel 7 +// -------- ADC_CHDR : (ADC Offset: 0x14) ADC Channel Disable Register -------- +// -------- ADC_CHSR : (ADC Offset: 0x18) ADC Channel Status Register -------- +// -------- ADC_SR : (ADC Offset: 0x1c) ADC Status Register -------- +#define AT91C_ADC_EOC0 ((unsigned int) 0x1 << 0) // (ADC) End of Conversion +#define AT91C_ADC_EOC1 ((unsigned int) 0x1 << 1) // (ADC) End of Conversion +#define AT91C_ADC_EOC2 ((unsigned int) 0x1 << 2) // (ADC) End of Conversion +#define AT91C_ADC_EOC3 ((unsigned int) 0x1 << 3) // (ADC) End of Conversion +#define AT91C_ADC_EOC4 ((unsigned int) 0x1 << 4) // (ADC) End of Conversion +#define AT91C_ADC_EOC5 ((unsigned int) 0x1 << 5) // (ADC) End of Conversion +#define AT91C_ADC_EOC6 ((unsigned int) 0x1 << 6) // (ADC) End of Conversion +#define AT91C_ADC_EOC7 ((unsigned int) 0x1 << 7) // (ADC) End of Conversion +#define AT91C_ADC_OVRE0 ((unsigned int) 0x1 << 8) // (ADC) Overrun Error +#define AT91C_ADC_OVRE1 ((unsigned int) 0x1 << 9) // (ADC) Overrun Error +#define AT91C_ADC_OVRE2 ((unsigned int) 0x1 << 10) // (ADC) Overrun Error +#define AT91C_ADC_OVRE3 ((unsigned int) 0x1 << 11) // (ADC) Overrun Error +#define AT91C_ADC_OVRE4 ((unsigned int) 0x1 << 12) // (ADC) Overrun Error +#define AT91C_ADC_OVRE5 ((unsigned int) 0x1 << 13) // (ADC) Overrun Error +#define AT91C_ADC_OVRE6 ((unsigned int) 0x1 << 14) // (ADC) Overrun Error +#define AT91C_ADC_OVRE7 ((unsigned int) 0x1 << 15) // (ADC) Overrun Error +#define AT91C_ADC_DRDY ((unsigned int) 0x1 << 16) // (ADC) Data Ready +#define AT91C_ADC_GOVRE ((unsigned int) 0x1 << 17) // (ADC) General Overrun +#define AT91C_ADC_ENDRX ((unsigned int) 0x1 << 18) // (ADC) End of Receiver Transfer +#define AT91C_ADC_RXBUFF ((unsigned int) 0x1 << 19) // (ADC) RXBUFF Interrupt +// -------- ADC_LCDR : (ADC Offset: 0x20) ADC Last Converted Data Register -------- +#define AT91C_ADC_LDATA ((unsigned int) 0x3FF << 0) // (ADC) Last Data Converted +// -------- ADC_IER : (ADC Offset: 0x24) ADC Interrupt Enable Register -------- +// -------- ADC_IDR : (ADC Offset: 0x28) ADC Interrupt Disable Register -------- +// -------- ADC_IMR : (ADC Offset: 0x2c) ADC Interrupt Mask Register -------- +// -------- ADC_CDR0 : (ADC Offset: 0x30) ADC Channel Data Register 0 -------- +#define AT91C_ADC_DATA ((unsigned int) 0x3FF << 0) // (ADC) Converted Data +// -------- ADC_CDR1 : (ADC Offset: 0x34) ADC Channel Data Register 1 -------- +// -------- ADC_CDR2 : (ADC Offset: 0x38) ADC Channel Data Register 2 -------- +// -------- ADC_CDR3 : (ADC Offset: 0x3c) ADC Channel Data Register 3 -------- +// -------- ADC_CDR4 : (ADC Offset: 0x40) ADC Channel Data Register 4 -------- +// -------- ADC_CDR5 : (ADC Offset: 0x44) ADC Channel Data Register 5 -------- +// -------- ADC_CDR6 : (ADC Offset: 0x48) ADC Channel Data Register 6 -------- +// -------- ADC_CDR7 : (ADC Offset: 0x4c) ADC Channel Data Register 7 -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Advanced Encryption Standard +// ***************************************************************************** +typedef struct _AT91S_AES { + AT91_REG AES_CR; // Control Register + AT91_REG AES_MR; // Mode Register + AT91_REG Reserved0[2]; // + AT91_REG AES_IER; // Interrupt Enable Register + AT91_REG AES_IDR; // Interrupt Disable Register + AT91_REG AES_IMR; // Interrupt Mask Register + AT91_REG AES_ISR; // Interrupt Status Register + AT91_REG AES_KEYWxR[4]; // Key Word x Register + AT91_REG Reserved1[4]; // + AT91_REG AES_IDATAxR[4]; // Input Data x Register + AT91_REG AES_ODATAxR[4]; // Output Data x Register + AT91_REG AES_IVxR[4]; // Initialization Vector x Register + AT91_REG Reserved2[35]; // + AT91_REG AES_VR; // AES Version Register + AT91_REG AES_RPR; // Receive Pointer Register + AT91_REG AES_RCR; // Receive Counter Register + AT91_REG AES_TPR; // Transmit Pointer Register + AT91_REG AES_TCR; // Transmit Counter Register + AT91_REG AES_RNPR; // Receive Next Pointer Register + AT91_REG AES_RNCR; // Receive Next Counter Register + AT91_REG AES_TNPR; // Transmit Next Pointer Register + AT91_REG AES_TNCR; // Transmit Next Counter Register + AT91_REG AES_PTCR; // PDC Transfer Control Register + AT91_REG AES_PTSR; // PDC Transfer Status Register +} AT91S_AES, *AT91PS_AES; + +// -------- AES_CR : (AES Offset: 0x0) Control Register -------- +#define AT91C_AES_START ((unsigned int) 0x1 << 0) // (AES) Starts Processing +#define AT91C_AES_SWRST ((unsigned int) 0x1 << 8) // (AES) Software Reset +#define AT91C_AES_LOADSEED ((unsigned int) 0x1 << 16) // (AES) Random Number Generator Seed Loading +// -------- AES_MR : (AES Offset: 0x4) Mode Register -------- +#define AT91C_AES_CIPHER ((unsigned int) 0x1 << 0) // (AES) Processing Mode +#define AT91C_AES_PROCDLY ((unsigned int) 0xF << 4) // (AES) Processing Delay +#define AT91C_AES_SMOD ((unsigned int) 0x3 << 8) // (AES) Start Mode +#define AT91C_AES_SMOD_MANUAL ((unsigned int) 0x0 << 8) // (AES) Manual Mode: The START bit in register AES_CR must be set to begin encryption or decryption. +#define AT91C_AES_SMOD_AUTO ((unsigned int) 0x1 << 8) // (AES) Auto Mode: no action in AES_CR is necessary (cf datasheet). +#define AT91C_AES_SMOD_PDC ((unsigned int) 0x2 << 8) // (AES) PDC Mode (cf datasheet). +#define AT91C_AES_OPMOD ((unsigned int) 0x7 << 12) // (AES) Operation Mode +#define AT91C_AES_OPMOD_ECB ((unsigned int) 0x0 << 12) // (AES) ECB Electronic CodeBook mode. +#define AT91C_AES_OPMOD_CBC ((unsigned int) 0x1 << 12) // (AES) CBC Cipher Block Chaining mode. +#define AT91C_AES_OPMOD_OFB ((unsigned int) 0x2 << 12) // (AES) OFB Output Feedback mode. +#define AT91C_AES_OPMOD_CFB ((unsigned int) 0x3 << 12) // (AES) CFB Cipher Feedback mode. +#define AT91C_AES_OPMOD_CTR ((unsigned int) 0x4 << 12) // (AES) CTR Counter mode. +#define AT91C_AES_LOD ((unsigned int) 0x1 << 15) // (AES) Last Output Data Mode +#define AT91C_AES_CFBS ((unsigned int) 0x7 << 16) // (AES) Cipher Feedback Data Size +#define AT91C_AES_CFBS_128_BIT ((unsigned int) 0x0 << 16) // (AES) 128-bit. +#define AT91C_AES_CFBS_64_BIT ((unsigned int) 0x1 << 16) // (AES) 64-bit. +#define AT91C_AES_CFBS_32_BIT ((unsigned int) 0x2 << 16) // (AES) 32-bit. +#define AT91C_AES_CFBS_16_BIT ((unsigned int) 0x3 << 16) // (AES) 16-bit. +#define AT91C_AES_CFBS_8_BIT ((unsigned int) 0x4 << 16) // (AES) 8-bit. +#define AT91C_AES_CKEY ((unsigned int) 0xF << 20) // (AES) Countermeasure Key +#define AT91C_AES_CTYPE ((unsigned int) 0x1F << 24) // (AES) Countermeasure Type +#define AT91C_AES_CTYPE_TYPE1_EN ((unsigned int) 0x1 << 24) // (AES) Countermeasure type 1 is enabled. +#define AT91C_AES_CTYPE_TYPE2_EN ((unsigned int) 0x2 << 24) // (AES) Countermeasure type 2 is enabled. +#define AT91C_AES_CTYPE_TYPE3_EN ((unsigned int) 0x4 << 24) // (AES) Countermeasure type 3 is enabled. +#define AT91C_AES_CTYPE_TYPE4_EN ((unsigned int) 0x8 << 24) // (AES) Countermeasure type 4 is enabled. +#define AT91C_AES_CTYPE_TYPE5_EN ((unsigned int) 0x10 << 24) // (AES) Countermeasure type 5 is enabled. +// -------- AES_IER : (AES Offset: 0x10) Interrupt Enable Register -------- +#define AT91C_AES_DATRDY ((unsigned int) 0x1 << 0) // (AES) DATRDY +#define AT91C_AES_ENDRX ((unsigned int) 0x1 << 1) // (AES) PDC Read Buffer End +#define AT91C_AES_ENDTX ((unsigned int) 0x1 << 2) // (AES) PDC Write Buffer End +#define AT91C_AES_RXBUFF ((unsigned int) 0x1 << 3) // (AES) PDC Read Buffer Full +#define AT91C_AES_TXBUFE ((unsigned int) 0x1 << 4) // (AES) PDC Write Buffer Empty +#define AT91C_AES_URAD ((unsigned int) 0x1 << 8) // (AES) Unspecified Register Access Detection +// -------- AES_IDR : (AES Offset: 0x14) Interrupt Disable Register -------- +// -------- AES_IMR : (AES Offset: 0x18) Interrupt Mask Register -------- +// -------- AES_ISR : (AES Offset: 0x1c) Interrupt Status Register -------- +#define AT91C_AES_URAT ((unsigned int) 0x7 << 12) // (AES) Unspecified Register Access Type Status +#define AT91C_AES_URAT_IN_DAT_WRITE_DATPROC ((unsigned int) 0x0 << 12) // (AES) Input data register written during the data processing in PDC mode. +#define AT91C_AES_URAT_OUT_DAT_READ_DATPROC ((unsigned int) 0x1 << 12) // (AES) Output data register read during the data processing. +#define AT91C_AES_URAT_MODEREG_WRITE_DATPROC ((unsigned int) 0x2 << 12) // (AES) Mode register written during the data processing. +#define AT91C_AES_URAT_OUT_DAT_READ_SUBKEY ((unsigned int) 0x3 << 12) // (AES) Output data register read during the sub-keys generation. +#define AT91C_AES_URAT_MODEREG_WRITE_SUBKEY ((unsigned int) 0x4 << 12) // (AES) Mode register written during the sub-keys generation. +#define AT91C_AES_URAT_WO_REG_READ ((unsigned int) 0x5 << 12) // (AES) Write-only register read access. + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Triple Data Encryption Standard +// ***************************************************************************** +typedef struct _AT91S_TDES { + AT91_REG TDES_CR; // Control Register + AT91_REG TDES_MR; // Mode Register + AT91_REG Reserved0[2]; // + AT91_REG TDES_IER; // Interrupt Enable Register + AT91_REG TDES_IDR; // Interrupt Disable Register + AT91_REG TDES_IMR; // Interrupt Mask Register + AT91_REG TDES_ISR; // Interrupt Status Register + AT91_REG TDES_KEY1WxR[2]; // Key 1 Word x Register + AT91_REG TDES_KEY2WxR[2]; // Key 2 Word x Register + AT91_REG TDES_KEY3WxR[2]; // Key 3 Word x Register + AT91_REG Reserved1[2]; // + AT91_REG TDES_IDATAxR[2]; // Input Data x Register + AT91_REG Reserved2[2]; // + AT91_REG TDES_ODATAxR[2]; // Output Data x Register + AT91_REG Reserved3[2]; // + AT91_REG TDES_IVxR[2]; // Initialization Vector x Register + AT91_REG Reserved4[37]; // + AT91_REG TDES_VR; // TDES Version Register + AT91_REG TDES_RPR; // Receive Pointer Register + AT91_REG TDES_RCR; // Receive Counter Register + AT91_REG TDES_TPR; // Transmit Pointer Register + AT91_REG TDES_TCR; // Transmit Counter Register + AT91_REG TDES_RNPR; // Receive Next Pointer Register + AT91_REG TDES_RNCR; // Receive Next Counter Register + AT91_REG TDES_TNPR; // Transmit Next Pointer Register + AT91_REG TDES_TNCR; // Transmit Next Counter Register + AT91_REG TDES_PTCR; // PDC Transfer Control Register + AT91_REG TDES_PTSR; // PDC Transfer Status Register +} AT91S_TDES, *AT91PS_TDES; + +// -------- TDES_CR : (TDES Offset: 0x0) Control Register -------- +#define AT91C_TDES_START ((unsigned int) 0x1 << 0) // (TDES) Starts Processing +#define AT91C_TDES_SWRST ((unsigned int) 0x1 << 8) // (TDES) Software Reset +// -------- TDES_MR : (TDES Offset: 0x4) Mode Register -------- +#define AT91C_TDES_CIPHER ((unsigned int) 0x1 << 0) // (TDES) Processing Mode +#define AT91C_TDES_TDESMOD ((unsigned int) 0x1 << 1) // (TDES) Single or Triple DES Mode +#define AT91C_TDES_KEYMOD ((unsigned int) 0x1 << 4) // (TDES) Key Mode +#define AT91C_TDES_SMOD ((unsigned int) 0x3 << 8) // (TDES) Start Mode +#define AT91C_TDES_SMOD_MANUAL ((unsigned int) 0x0 << 8) // (TDES) Manual Mode: The START bit in register TDES_CR must be set to begin encryption or decryption. +#define AT91C_TDES_SMOD_AUTO ((unsigned int) 0x1 << 8) // (TDES) Auto Mode: no action in TDES_CR is necessary (cf datasheet). +#define AT91C_TDES_SMOD_PDC ((unsigned int) 0x2 << 8) // (TDES) PDC Mode (cf datasheet). +#define AT91C_TDES_OPMOD ((unsigned int) 0x3 << 12) // (TDES) Operation Mode +#define AT91C_TDES_OPMOD_ECB ((unsigned int) 0x0 << 12) // (TDES) ECB Electronic CodeBook mode. +#define AT91C_TDES_OPMOD_CBC ((unsigned int) 0x1 << 12) // (TDES) CBC Cipher Block Chaining mode. +#define AT91C_TDES_OPMOD_OFB ((unsigned int) 0x2 << 12) // (TDES) OFB Output Feedback mode. +#define AT91C_TDES_OPMOD_CFB ((unsigned int) 0x3 << 12) // (TDES) CFB Cipher Feedback mode. +#define AT91C_TDES_LOD ((unsigned int) 0x1 << 15) // (TDES) Last Output Data Mode +#define AT91C_TDES_CFBS ((unsigned int) 0x3 << 16) // (TDES) Cipher Feedback Data Size +#define AT91C_TDES_CFBS_64_BIT ((unsigned int) 0x0 << 16) // (TDES) 64-bit. +#define AT91C_TDES_CFBS_32_BIT ((unsigned int) 0x1 << 16) // (TDES) 32-bit. +#define AT91C_TDES_CFBS_16_BIT ((unsigned int) 0x2 << 16) // (TDES) 16-bit. +#define AT91C_TDES_CFBS_8_BIT ((unsigned int) 0x3 << 16) // (TDES) 8-bit. +// -------- TDES_IER : (TDES Offset: 0x10) Interrupt Enable Register -------- +#define AT91C_TDES_DATRDY ((unsigned int) 0x1 << 0) // (TDES) DATRDY +#define AT91C_TDES_ENDRX ((unsigned int) 0x1 << 1) // (TDES) PDC Read Buffer End +#define AT91C_TDES_ENDTX ((unsigned int) 0x1 << 2) // (TDES) PDC Write Buffer End +#define AT91C_TDES_RXBUFF ((unsigned int) 0x1 << 3) // (TDES) PDC Read Buffer Full +#define AT91C_TDES_TXBUFE ((unsigned int) 0x1 << 4) // (TDES) PDC Write Buffer Empty +#define AT91C_TDES_URAD ((unsigned int) 0x1 << 8) // (TDES) Unspecified Register Access Detection +// -------- TDES_IDR : (TDES Offset: 0x14) Interrupt Disable Register -------- +// -------- TDES_IMR : (TDES Offset: 0x18) Interrupt Mask Register -------- +// -------- TDES_ISR : (TDES Offset: 0x1c) Interrupt Status Register -------- +#define AT91C_TDES_URAT ((unsigned int) 0x3 << 12) // (TDES) Unspecified Register Access Type Status +#define AT91C_TDES_URAT_IN_DAT_WRITE_DATPROC ((unsigned int) 0x0 << 12) // (TDES) Input data register written during the data processing in PDC mode. +#define AT91C_TDES_URAT_OUT_DAT_READ_DATPROC ((unsigned int) 0x1 << 12) // (TDES) Output data register read during the data processing. +#define AT91C_TDES_URAT_MODEREG_WRITE_DATPROC ((unsigned int) 0x2 << 12) // (TDES) Mode register written during the data processing. +#define AT91C_TDES_URAT_WO_REG_READ ((unsigned int) 0x3 << 12) // (TDES) Write-only register read access. + +// ***************************************************************************** +// REGISTER ADDRESS DEFINITION FOR AT91SAM7X256 +// ***************************************************************************** +// ========== Register definition for SYS peripheral ========== +// ========== Register definition for AIC peripheral ========== +#define AT91C_AIC_IVR ((AT91_REG *) 0xFFFFF100) // (AIC) IRQ Vector Register +#define AT91C_AIC_SMR ((AT91_REG *) 0xFFFFF000) // (AIC) Source Mode Register +#define AT91C_AIC_FVR ((AT91_REG *) 0xFFFFF104) // (AIC) FIQ Vector Register +#define AT91C_AIC_DCR ((AT91_REG *) 0xFFFFF138) // (AIC) Debug Control Register (Protect) +#define AT91C_AIC_EOICR ((AT91_REG *) 0xFFFFF130) // (AIC) End of Interrupt Command Register +#define AT91C_AIC_SVR ((AT91_REG *) 0xFFFFF080) // (AIC) Source Vector Register +#define AT91C_AIC_FFSR ((AT91_REG *) 0xFFFFF148) // (AIC) Fast Forcing Status Register +#define AT91C_AIC_ICCR ((AT91_REG *) 0xFFFFF128) // (AIC) Interrupt Clear Command Register +#define AT91C_AIC_ISR ((AT91_REG *) 0xFFFFF108) // (AIC) Interrupt Status Register +#define AT91C_AIC_IMR ((AT91_REG *) 0xFFFFF110) // (AIC) Interrupt Mask Register +#define AT91C_AIC_IPR ((AT91_REG *) 0xFFFFF10C) // (AIC) Interrupt Pending Register +#define AT91C_AIC_FFER ((AT91_REG *) 0xFFFFF140) // (AIC) Fast Forcing Enable Register +#define AT91C_AIC_IECR ((AT91_REG *) 0xFFFFF120) // (AIC) Interrupt Enable Command Register +#define AT91C_AIC_ISCR ((AT91_REG *) 0xFFFFF12C) // (AIC) Interrupt Set Command Register +#define AT91C_AIC_FFDR ((AT91_REG *) 0xFFFFF144) // (AIC) Fast Forcing Disable Register +#define AT91C_AIC_CISR ((AT91_REG *) 0xFFFFF114) // (AIC) Core Interrupt Status Register +#define AT91C_AIC_IDCR ((AT91_REG *) 0xFFFFF124) // (AIC) Interrupt Disable Command Register +#define AT91C_AIC_SPU ((AT91_REG *) 0xFFFFF134) // (AIC) Spurious Vector Register +// ========== Register definition for PDC_DBGU peripheral ========== +#define AT91C_DBGU_TCR ((AT91_REG *) 0xFFFFF30C) // (PDC_DBGU) Transmit Counter Register +#define AT91C_DBGU_RNPR ((AT91_REG *) 0xFFFFF310) // (PDC_DBGU) Receive Next Pointer Register +#define AT91C_DBGU_TNPR ((AT91_REG *) 0xFFFFF318) // (PDC_DBGU) Transmit Next Pointer Register +#define AT91C_DBGU_TPR ((AT91_REG *) 0xFFFFF308) // (PDC_DBGU) Transmit Pointer Register +#define AT91C_DBGU_RPR ((AT91_REG *) 0xFFFFF300) // (PDC_DBGU) Receive Pointer Register +#define AT91C_DBGU_RCR ((AT91_REG *) 0xFFFFF304) // (PDC_DBGU) Receive Counter Register +#define AT91C_DBGU_RNCR ((AT91_REG *) 0xFFFFF314) // (PDC_DBGU) Receive Next Counter Register +#define AT91C_DBGU_PTCR ((AT91_REG *) 0xFFFFF320) // (PDC_DBGU) PDC Transfer Control Register +#define AT91C_DBGU_PTSR ((AT91_REG *) 0xFFFFF324) // (PDC_DBGU) PDC Transfer Status Register +#define AT91C_DBGU_TNCR ((AT91_REG *) 0xFFFFF31C) // (PDC_DBGU) Transmit Next Counter Register +// ========== Register definition for DBGU peripheral ========== +#define AT91C_DBGU_EXID ((AT91_REG *) 0xFFFFF244) // (DBGU) Chip ID Extension Register +#define AT91C_DBGU_BRGR ((AT91_REG *) 0xFFFFF220) // (DBGU) Baud Rate Generator Register +#define AT91C_DBGU_IDR ((AT91_REG *) 0xFFFFF20C) // (DBGU) Interrupt Disable Register +#define AT91C_DBGU_CSR ((AT91_REG *) 0xFFFFF214) // (DBGU) Channel Status Register +#define AT91C_DBGU_CIDR ((AT91_REG *) 0xFFFFF240) // (DBGU) Chip ID Register +#define AT91C_DBGU_MR ((AT91_REG *) 0xFFFFF204) // (DBGU) Mode Register +#define AT91C_DBGU_IMR ((AT91_REG *) 0xFFFFF210) // (DBGU) Interrupt Mask Register +#define AT91C_DBGU_CR ((AT91_REG *) 0xFFFFF200) // (DBGU) Control Register +#define AT91C_DBGU_FNTR ((AT91_REG *) 0xFFFFF248) // (DBGU) Force NTRST Register +#define AT91C_DBGU_THR ((AT91_REG *) 0xFFFFF21C) // (DBGU) Transmitter Holding Register +#define AT91C_DBGU_RHR ((AT91_REG *) 0xFFFFF218) // (DBGU) Receiver Holding Register +#define AT91C_DBGU_IER ((AT91_REG *) 0xFFFFF208) // (DBGU) Interrupt Enable Register +// ========== Register definition for PIOA peripheral ========== +#define AT91C_PIOA_ODR ((AT91_REG *) 0xFFFFF414) // (PIOA) Output Disable Registerr +#define AT91C_PIOA_SODR ((AT91_REG *) 0xFFFFF430) // (PIOA) Set Output Data Register +#define AT91C_PIOA_ISR ((AT91_REG *) 0xFFFFF44C) // (PIOA) Interrupt Status Register +#define AT91C_PIOA_ABSR ((AT91_REG *) 0xFFFFF478) // (PIOA) AB Select Status Register +#define AT91C_PIOA_IER ((AT91_REG *) 0xFFFFF440) // (PIOA) Interrupt Enable Register +#define AT91C_PIOA_PPUDR ((AT91_REG *) 0xFFFFF460) // (PIOA) Pull-up Disable Register +#define AT91C_PIOA_IMR ((AT91_REG *) 0xFFFFF448) // (PIOA) Interrupt Mask Register +#define AT91C_PIOA_PER ((AT91_REG *) 0xFFFFF400) // (PIOA) PIO Enable Register +#define AT91C_PIOA_IFDR ((AT91_REG *) 0xFFFFF424) // (PIOA) Input Filter Disable Register +#define AT91C_PIOA_OWDR ((AT91_REG *) 0xFFFFF4A4) // (PIOA) Output Write Disable Register +#define AT91C_PIOA_MDSR ((AT91_REG *) 0xFFFFF458) // (PIOA) Multi-driver Status Register +#define AT91C_PIOA_IDR ((AT91_REG *) 0xFFFFF444) // (PIOA) Interrupt Disable Register +#define AT91C_PIOA_ODSR ((AT91_REG *) 0xFFFFF438) // (PIOA) Output Data Status Register +#define AT91C_PIOA_PPUSR ((AT91_REG *) 0xFFFFF468) // (PIOA) Pull-up Status Register +#define AT91C_PIOA_OWSR ((AT91_REG *) 0xFFFFF4A8) // (PIOA) Output Write Status Register +#define AT91C_PIOA_BSR ((AT91_REG *) 0xFFFFF474) // (PIOA) Select B Register +#define AT91C_PIOA_OWER ((AT91_REG *) 0xFFFFF4A0) // (PIOA) Output Write Enable Register +#define AT91C_PIOA_IFER ((AT91_REG *) 0xFFFFF420) // (PIOA) Input Filter Enable Register +#define AT91C_PIOA_PDSR ((AT91_REG *) 0xFFFFF43C) // (PIOA) Pin Data Status Register +#define AT91C_PIOA_PPUER ((AT91_REG *) 0xFFFFF464) // (PIOA) Pull-up Enable Register +#define AT91C_PIOA_OSR ((AT91_REG *) 0xFFFFF418) // (PIOA) Output Status Register +#define AT91C_PIOA_ASR ((AT91_REG *) 0xFFFFF470) // (PIOA) Select A Register +#define AT91C_PIOA_MDDR ((AT91_REG *) 0xFFFFF454) // (PIOA) Multi-driver Disable Register +#define AT91C_PIOA_CODR ((AT91_REG *) 0xFFFFF434) // (PIOA) Clear Output Data Register +#define AT91C_PIOA_MDER ((AT91_REG *) 0xFFFFF450) // (PIOA) Multi-driver Enable Register +#define AT91C_PIOA_PDR ((AT91_REG *) 0xFFFFF404) // (PIOA) PIO Disable Register +#define AT91C_PIOA_IFSR ((AT91_REG *) 0xFFFFF428) // (PIOA) Input Filter Status Register +#define AT91C_PIOA_OER ((AT91_REG *) 0xFFFFF410) // (PIOA) Output Enable Register +#define AT91C_PIOA_PSR ((AT91_REG *) 0xFFFFF408) // (PIOA) PIO Status Register +// ========== Register definition for PIOB peripheral ========== +#define AT91C_PIOB_OWDR ((AT91_REG *) 0xFFFFF6A4) // (PIOB) Output Write Disable Register +#define AT91C_PIOB_MDER ((AT91_REG *) 0xFFFFF650) // (PIOB) Multi-driver Enable Register +#define AT91C_PIOB_PPUSR ((AT91_REG *) 0xFFFFF668) // (PIOB) Pull-up Status Register +#define AT91C_PIOB_IMR ((AT91_REG *) 0xFFFFF648) // (PIOB) Interrupt Mask Register +#define AT91C_PIOB_ASR ((AT91_REG *) 0xFFFFF670) // (PIOB) Select A Register +#define AT91C_PIOB_PPUDR ((AT91_REG *) 0xFFFFF660) // (PIOB) Pull-up Disable Register +#define AT91C_PIOB_PSR ((AT91_REG *) 0xFFFFF608) // (PIOB) PIO Status Register +#define AT91C_PIOB_IER ((AT91_REG *) 0xFFFFF640) // (PIOB) Interrupt Enable Register +#define AT91C_PIOB_CODR ((AT91_REG *) 0xFFFFF634) // (PIOB) Clear Output Data Register +#define AT91C_PIOB_OWER ((AT91_REG *) 0xFFFFF6A0) // (PIOB) Output Write Enable Register +#define AT91C_PIOB_ABSR ((AT91_REG *) 0xFFFFF678) // (PIOB) AB Select Status Register +#define AT91C_PIOB_IFDR ((AT91_REG *) 0xFFFFF624) // (PIOB) Input Filter Disable Register +#define AT91C_PIOB_PDSR ((AT91_REG *) 0xFFFFF63C) // (PIOB) Pin Data Status Register +#define AT91C_PIOB_IDR ((AT91_REG *) 0xFFFFF644) // (PIOB) Interrupt Disable Register +#define AT91C_PIOB_OWSR ((AT91_REG *) 0xFFFFF6A8) // (PIOB) Output Write Status Register +#define AT91C_PIOB_PDR ((AT91_REG *) 0xFFFFF604) // (PIOB) PIO Disable Register +#define AT91C_PIOB_ODR ((AT91_REG *) 0xFFFFF614) // (PIOB) Output Disable Registerr +#define AT91C_PIOB_IFSR ((AT91_REG *) 0xFFFFF628) // (PIOB) Input Filter Status Register +#define AT91C_PIOB_PPUER ((AT91_REG *) 0xFFFFF664) // (PIOB) Pull-up Enable Register +#define AT91C_PIOB_SODR ((AT91_REG *) 0xFFFFF630) // (PIOB) Set Output Data Register +#define AT91C_PIOB_ISR ((AT91_REG *) 0xFFFFF64C) // (PIOB) Interrupt Status Register +#define AT91C_PIOB_ODSR ((AT91_REG *) 0xFFFFF638) // (PIOB) Output Data Status Register +#define AT91C_PIOB_OSR ((AT91_REG *) 0xFFFFF618) // (PIOB) Output Status Register +#define AT91C_PIOB_MDSR ((AT91_REG *) 0xFFFFF658) // (PIOB) Multi-driver Status Register +#define AT91C_PIOB_IFER ((AT91_REG *) 0xFFFFF620) // (PIOB) Input Filter Enable Register +#define AT91C_PIOB_BSR ((AT91_REG *) 0xFFFFF674) // (PIOB) Select B Register +#define AT91C_PIOB_MDDR ((AT91_REG *) 0xFFFFF654) // (PIOB) Multi-driver Disable Register +#define AT91C_PIOB_OER ((AT91_REG *) 0xFFFFF610) // (PIOB) Output Enable Register +#define AT91C_PIOB_PER ((AT91_REG *) 0xFFFFF600) // (PIOB) PIO Enable Register +// ========== Register definition for CKGR peripheral ========== +#define AT91C_CKGR_MOR ((AT91_REG *) 0xFFFFFC20) // (CKGR) Main Oscillator Register +#define AT91C_CKGR_PLLR ((AT91_REG *) 0xFFFFFC2C) // (CKGR) PLL Register +#define AT91C_CKGR_MCFR ((AT91_REG *) 0xFFFFFC24) // (CKGR) Main Clock Frequency Register +// ========== Register definition for PMC peripheral ========== +#define AT91C_PMC_IDR ((AT91_REG *) 0xFFFFFC64) // (PMC) Interrupt Disable Register +#define AT91C_PMC_MOR ((AT91_REG *) 0xFFFFFC20) // (PMC) Main Oscillator Register +#define AT91C_PMC_PLLR ((AT91_REG *) 0xFFFFFC2C) // (PMC) PLL Register +#define AT91C_PMC_PCER ((AT91_REG *) 0xFFFFFC10) // (PMC) Peripheral Clock Enable Register +#define AT91C_PMC_PCKR ((AT91_REG *) 0xFFFFFC40) // (PMC) Programmable Clock Register +#define AT91C_PMC_MCKR ((AT91_REG *) 0xFFFFFC30) // (PMC) Master Clock Register +#define AT91C_PMC_SCDR ((AT91_REG *) 0xFFFFFC04) // (PMC) System Clock Disable Register +#define AT91C_PMC_PCDR ((AT91_REG *) 0xFFFFFC14) // (PMC) Peripheral Clock Disable Register +#define AT91C_PMC_SCSR ((AT91_REG *) 0xFFFFFC08) // (PMC) System Clock Status Register +#define AT91C_PMC_PCSR ((AT91_REG *) 0xFFFFFC18) // (PMC) Peripheral Clock Status Register +#define AT91C_PMC_MCFR ((AT91_REG *) 0xFFFFFC24) // (PMC) Main Clock Frequency Register +#define AT91C_PMC_SCER ((AT91_REG *) 0xFFFFFC00) // (PMC) System Clock Enable Register +#define AT91C_PMC_IMR ((AT91_REG *) 0xFFFFFC6C) // (PMC) Interrupt Mask Register +#define AT91C_PMC_IER ((AT91_REG *) 0xFFFFFC60) // (PMC) Interrupt Enable Register +#define AT91C_PMC_SR ((AT91_REG *) 0xFFFFFC68) // (PMC) Status Register +// ========== Register definition for RSTC peripheral ========== +#define AT91C_RSTC_RCR ((AT91_REG *) 0xFFFFFD00) // (RSTC) Reset Control Register +#define AT91C_RSTC_RMR ((AT91_REG *) 0xFFFFFD08) // (RSTC) Reset Mode Register +#define AT91C_RSTC_RSR ((AT91_REG *) 0xFFFFFD04) // (RSTC) Reset Status Register +// ========== Register definition for RTTC peripheral ========== +#define AT91C_RTTC_RTSR ((AT91_REG *) 0xFFFFFD2C) // (RTTC) Real-time Status Register +#define AT91C_RTTC_RTMR ((AT91_REG *) 0xFFFFFD20) // (RTTC) Real-time Mode Register +#define AT91C_RTTC_RTVR ((AT91_REG *) 0xFFFFFD28) // (RTTC) Real-time Value Register +#define AT91C_RTTC_RTAR ((AT91_REG *) 0xFFFFFD24) // (RTTC) Real-time Alarm Register +// ========== Register definition for PITC peripheral ========== +#define AT91C_PITC_PIVR ((AT91_REG *) 0xFFFFFD38) // (PITC) Period Interval Value Register +#define AT91C_PITC_PISR ((AT91_REG *) 0xFFFFFD34) // (PITC) Period Interval Status Register +#define AT91C_PITC_PIIR ((AT91_REG *) 0xFFFFFD3C) // (PITC) Period Interval Image Register +#define AT91C_PITC_PIMR ((AT91_REG *) 0xFFFFFD30) // (PITC) Period Interval Mode Register +// ========== Register definition for WDTC peripheral ========== +#define AT91C_WDTC_WDCR ((AT91_REG *) 0xFFFFFD40) // (WDTC) Watchdog Control Register +#define AT91C_WDTC_WDSR ((AT91_REG *) 0xFFFFFD48) // (WDTC) Watchdog Status Register +#define AT91C_WDTC_WDMR ((AT91_REG *) 0xFFFFFD44) // (WDTC) Watchdog Mode Register +// ========== Register definition for VREG peripheral ========== +#define AT91C_VREG_MR ((AT91_REG *) 0xFFFFFD60) // (VREG) Voltage Regulator Mode Register +// ========== Register definition for MC peripheral ========== +#define AT91C_MC_ASR ((AT91_REG *) 0xFFFFFF04) // (MC) MC Abort Status Register +#define AT91C_MC_RCR ((AT91_REG *) 0xFFFFFF00) // (MC) MC Remap Control Register +#define AT91C_MC_FCR ((AT91_REG *) 0xFFFFFF64) // (MC) MC Flash Command Register +#define AT91C_MC_AASR ((AT91_REG *) 0xFFFFFF08) // (MC) MC Abort Address Status Register +#define AT91C_MC_FSR ((AT91_REG *) 0xFFFFFF68) // (MC) MC Flash Status Register +#define AT91C_MC_FMR ((AT91_REG *) 0xFFFFFF60) // (MC) MC Flash Mode Register +// ========== Register definition for PDC_SPI1 peripheral ========== +#define AT91C_SPI1_PTCR ((AT91_REG *) 0xFFFE4120) // (PDC_SPI1) PDC Transfer Control Register +#define AT91C_SPI1_RPR ((AT91_REG *) 0xFFFE4100) // (PDC_SPI1) Receive Pointer Register +#define AT91C_SPI1_TNCR ((AT91_REG *) 0xFFFE411C) // (PDC_SPI1) Transmit Next Counter Register +#define AT91C_SPI1_TPR ((AT91_REG *) 0xFFFE4108) // (PDC_SPI1) Transmit Pointer Register +#define AT91C_SPI1_TNPR ((AT91_REG *) 0xFFFE4118) // (PDC_SPI1) Transmit Next Pointer Register +#define AT91C_SPI1_TCR ((AT91_REG *) 0xFFFE410C) // (PDC_SPI1) Transmit Counter Register +#define AT91C_SPI1_RCR ((AT91_REG *) 0xFFFE4104) // (PDC_SPI1) Receive Counter Register +#define AT91C_SPI1_RNPR ((AT91_REG *) 0xFFFE4110) // (PDC_SPI1) Receive Next Pointer Register +#define AT91C_SPI1_RNCR ((AT91_REG *) 0xFFFE4114) // (PDC_SPI1) Receive Next Counter Register +#define AT91C_SPI1_PTSR ((AT91_REG *) 0xFFFE4124) // (PDC_SPI1) PDC Transfer Status Register +// ========== Register definition for SPI1 peripheral ========== +#define AT91C_SPI1_IMR ((AT91_REG *) 0xFFFE401C) // (SPI1) Interrupt Mask Register +#define AT91C_SPI1_IER ((AT91_REG *) 0xFFFE4014) // (SPI1) Interrupt Enable Register +#define AT91C_SPI1_MR ((AT91_REG *) 0xFFFE4004) // (SPI1) Mode Register +#define AT91C_SPI1_RDR ((AT91_REG *) 0xFFFE4008) // (SPI1) Receive Data Register +#define AT91C_SPI1_IDR ((AT91_REG *) 0xFFFE4018) // (SPI1) Interrupt Disable Register +#define AT91C_SPI1_SR ((AT91_REG *) 0xFFFE4010) // (SPI1) Status Register +#define AT91C_SPI1_TDR ((AT91_REG *) 0xFFFE400C) // (SPI1) Transmit Data Register +#define AT91C_SPI1_CR ((AT91_REG *) 0xFFFE4000) // (SPI1) Control Register +#define AT91C_SPI1_CSR ((AT91_REG *) 0xFFFE4030) // (SPI1) Chip Select Register +// ========== Register definition for PDC_SPI0 peripheral ========== +#define AT91C_SPI0_PTCR ((AT91_REG *) 0xFFFE0120) // (PDC_SPI0) PDC Transfer Control Register +#define AT91C_SPI0_TPR ((AT91_REG *) 0xFFFE0108) // (PDC_SPI0) Transmit Pointer Register +#define AT91C_SPI0_TCR ((AT91_REG *) 0xFFFE010C) // (PDC_SPI0) Transmit Counter Register +#define AT91C_SPI0_RCR ((AT91_REG *) 0xFFFE0104) // (PDC_SPI0) Receive Counter Register +#define AT91C_SPI0_PTSR ((AT91_REG *) 0xFFFE0124) // (PDC_SPI0) PDC Transfer Status Register +#define AT91C_SPI0_RNPR ((AT91_REG *) 0xFFFE0110) // (PDC_SPI0) Receive Next Pointer Register +#define AT91C_SPI0_RPR ((AT91_REG *) 0xFFFE0100) // (PDC_SPI0) Receive Pointer Register +#define AT91C_SPI0_TNCR ((AT91_REG *) 0xFFFE011C) // (PDC_SPI0) Transmit Next Counter Register +#define AT91C_SPI0_RNCR ((AT91_REG *) 0xFFFE0114) // (PDC_SPI0) Receive Next Counter Register +#define AT91C_SPI0_TNPR ((AT91_REG *) 0xFFFE0118) // (PDC_SPI0) Transmit Next Pointer Register +// ========== Register definition for SPI0 peripheral ========== +#define AT91C_SPI0_IER ((AT91_REG *) 0xFFFE0014) // (SPI0) Interrupt Enable Register +#define AT91C_SPI0_SR ((AT91_REG *) 0xFFFE0010) // (SPI0) Status Register +#define AT91C_SPI0_IDR ((AT91_REG *) 0xFFFE0018) // (SPI0) Interrupt Disable Register +#define AT91C_SPI0_CR ((AT91_REG *) 0xFFFE0000) // (SPI0) Control Register +#define AT91C_SPI0_MR ((AT91_REG *) 0xFFFE0004) // (SPI0) Mode Register +#define AT91C_SPI0_IMR ((AT91_REG *) 0xFFFE001C) // (SPI0) Interrupt Mask Register +#define AT91C_SPI0_TDR ((AT91_REG *) 0xFFFE000C) // (SPI0) Transmit Data Register +#define AT91C_SPI0_RDR ((AT91_REG *) 0xFFFE0008) // (SPI0) Receive Data Register +#define AT91C_SPI0_CSR ((AT91_REG *) 0xFFFE0030) // (SPI0) Chip Select Register +// ========== Register definition for PDC_US1 peripheral ========== +#define AT91C_US1_RNCR ((AT91_REG *) 0xFFFC4114) // (PDC_US1) Receive Next Counter Register +#define AT91C_US1_PTCR ((AT91_REG *) 0xFFFC4120) // (PDC_US1) PDC Transfer Control Register +#define AT91C_US1_TCR ((AT91_REG *) 0xFFFC410C) // (PDC_US1) Transmit Counter Register +#define AT91C_US1_PTSR ((AT91_REG *) 0xFFFC4124) // (PDC_US1) PDC Transfer Status Register +#define AT91C_US1_TNPR ((AT91_REG *) 0xFFFC4118) // (PDC_US1) Transmit Next Pointer Register +#define AT91C_US1_RCR ((AT91_REG *) 0xFFFC4104) // (PDC_US1) Receive Counter Register +#define AT91C_US1_RNPR ((AT91_REG *) 0xFFFC4110) // (PDC_US1) Receive Next Pointer Register +#define AT91C_US1_RPR ((AT91_REG *) 0xFFFC4100) // (PDC_US1) Receive Pointer Register +#define AT91C_US1_TNCR ((AT91_REG *) 0xFFFC411C) // (PDC_US1) Transmit Next Counter Register +#define AT91C_US1_TPR ((AT91_REG *) 0xFFFC4108) // (PDC_US1) Transmit Pointer Register +// ========== Register definition for US1 peripheral ========== +#define AT91C_US1_IF ((AT91_REG *) 0xFFFC404C) // (US1) IRDA_FILTER Register +#define AT91C_US1_NER ((AT91_REG *) 0xFFFC4044) // (US1) Nb Errors Register +#define AT91C_US1_RTOR ((AT91_REG *) 0xFFFC4024) // (US1) Receiver Time-out Register +#define AT91C_US1_CSR ((AT91_REG *) 0xFFFC4014) // (US1) Channel Status Register +#define AT91C_US1_IDR ((AT91_REG *) 0xFFFC400C) // (US1) Interrupt Disable Register +#define AT91C_US1_IER ((AT91_REG *) 0xFFFC4008) // (US1) Interrupt Enable Register +#define AT91C_US1_THR ((AT91_REG *) 0xFFFC401C) // (US1) Transmitter Holding Register +#define AT91C_US1_TTGR ((AT91_REG *) 0xFFFC4028) // (US1) Transmitter Time-guard Register +#define AT91C_US1_RHR ((AT91_REG *) 0xFFFC4018) // (US1) Receiver Holding Register +#define AT91C_US1_BRGR ((AT91_REG *) 0xFFFC4020) // (US1) Baud Rate Generator Register +#define AT91C_US1_IMR ((AT91_REG *) 0xFFFC4010) // (US1) Interrupt Mask Register +#define AT91C_US1_FIDI ((AT91_REG *) 0xFFFC4040) // (US1) FI_DI_Ratio Register +#define AT91C_US1_CR ((AT91_REG *) 0xFFFC4000) // (US1) Control Register +#define AT91C_US1_MR ((AT91_REG *) 0xFFFC4004) // (US1) Mode Register +// ========== Register definition for PDC_US0 peripheral ========== +#define AT91C_US0_TNPR ((AT91_REG *) 0xFFFC0118) // (PDC_US0) Transmit Next Pointer Register +#define AT91C_US0_RNPR ((AT91_REG *) 0xFFFC0110) // (PDC_US0) Receive Next Pointer Register +#define AT91C_US0_TCR ((AT91_REG *) 0xFFFC010C) // (PDC_US0) Transmit Counter Register +#define AT91C_US0_PTCR ((AT91_REG *) 0xFFFC0120) // (PDC_US0) PDC Transfer Control Register +#define AT91C_US0_PTSR ((AT91_REG *) 0xFFFC0124) // (PDC_US0) PDC Transfer Status Register +#define AT91C_US0_TNCR ((AT91_REG *) 0xFFFC011C) // (PDC_US0) Transmit Next Counter Register +#define AT91C_US0_TPR ((AT91_REG *) 0xFFFC0108) // (PDC_US0) Transmit Pointer Register +#define AT91C_US0_RCR ((AT91_REG *) 0xFFFC0104) // (PDC_US0) Receive Counter Register +#define AT91C_US0_RPR ((AT91_REG *) 0xFFFC0100) // (PDC_US0) Receive Pointer Register +#define AT91C_US0_RNCR ((AT91_REG *) 0xFFFC0114) // (PDC_US0) Receive Next Counter Register +// ========== Register definition for US0 peripheral ========== +#define AT91C_US0_BRGR ((AT91_REG *) 0xFFFC0020) // (US0) Baud Rate Generator Register +#define AT91C_US0_NER ((AT91_REG *) 0xFFFC0044) // (US0) Nb Errors Register +#define AT91C_US0_CR ((AT91_REG *) 0xFFFC0000) // (US0) Control Register +#define AT91C_US0_IMR ((AT91_REG *) 0xFFFC0010) // (US0) Interrupt Mask Register +#define AT91C_US0_FIDI ((AT91_REG *) 0xFFFC0040) // (US0) FI_DI_Ratio Register +#define AT91C_US0_TTGR ((AT91_REG *) 0xFFFC0028) // (US0) Transmitter Time-guard Register +#define AT91C_US0_MR ((AT91_REG *) 0xFFFC0004) // (US0) Mode Register +#define AT91C_US0_RTOR ((AT91_REG *) 0xFFFC0024) // (US0) Receiver Time-out Register +#define AT91C_US0_CSR ((AT91_REG *) 0xFFFC0014) // (US0) Channel Status Register +#define AT91C_US0_RHR ((AT91_REG *) 0xFFFC0018) // (US0) Receiver Holding Register +#define AT91C_US0_IDR ((AT91_REG *) 0xFFFC000C) // (US0) Interrupt Disable Register +#define AT91C_US0_THR ((AT91_REG *) 0xFFFC001C) // (US0) Transmitter Holding Register +#define AT91C_US0_IF ((AT91_REG *) 0xFFFC004C) // (US0) IRDA_FILTER Register +#define AT91C_US0_IER ((AT91_REG *) 0xFFFC0008) // (US0) Interrupt Enable Register +// ========== Register definition for PDC_SSC peripheral ========== +#define AT91C_SSC_TNCR ((AT91_REG *) 0xFFFD411C) // (PDC_SSC) Transmit Next Counter Register +#define AT91C_SSC_RPR ((AT91_REG *) 0xFFFD4100) // (PDC_SSC) Receive Pointer Register +#define AT91C_SSC_RNCR ((AT91_REG *) 0xFFFD4114) // (PDC_SSC) Receive Next Counter Register +#define AT91C_SSC_TPR ((AT91_REG *) 0xFFFD4108) // (PDC_SSC) Transmit Pointer Register +#define AT91C_SSC_PTCR ((AT91_REG *) 0xFFFD4120) // (PDC_SSC) PDC Transfer Control Register +#define AT91C_SSC_TCR ((AT91_REG *) 0xFFFD410C) // (PDC_SSC) Transmit Counter Register +#define AT91C_SSC_RCR ((AT91_REG *) 0xFFFD4104) // (PDC_SSC) Receive Counter Register +#define AT91C_SSC_RNPR ((AT91_REG *) 0xFFFD4110) // (PDC_SSC) Receive Next Pointer Register +#define AT91C_SSC_TNPR ((AT91_REG *) 0xFFFD4118) // (PDC_SSC) Transmit Next Pointer Register +#define AT91C_SSC_PTSR ((AT91_REG *) 0xFFFD4124) // (PDC_SSC) PDC Transfer Status Register +// ========== Register definition for SSC peripheral ========== +#define AT91C_SSC_RHR ((AT91_REG *) 0xFFFD4020) // (SSC) Receive Holding Register +#define AT91C_SSC_RSHR ((AT91_REG *) 0xFFFD4030) // (SSC) Receive Sync Holding Register +#define AT91C_SSC_TFMR ((AT91_REG *) 0xFFFD401C) // (SSC) Transmit Frame Mode Register +#define AT91C_SSC_IDR ((AT91_REG *) 0xFFFD4048) // (SSC) Interrupt Disable Register +#define AT91C_SSC_THR ((AT91_REG *) 0xFFFD4024) // (SSC) Transmit Holding Register +#define AT91C_SSC_RCMR ((AT91_REG *) 0xFFFD4010) // (SSC) Receive Clock ModeRegister +#define AT91C_SSC_IER ((AT91_REG *) 0xFFFD4044) // (SSC) Interrupt Enable Register +#define AT91C_SSC_TSHR ((AT91_REG *) 0xFFFD4034) // (SSC) Transmit Sync Holding Register +#define AT91C_SSC_SR ((AT91_REG *) 0xFFFD4040) // (SSC) Status Register +#define AT91C_SSC_CMR ((AT91_REG *) 0xFFFD4004) // (SSC) Clock Mode Register +#define AT91C_SSC_TCMR ((AT91_REG *) 0xFFFD4018) // (SSC) Transmit Clock Mode Register +#define AT91C_SSC_CR ((AT91_REG *) 0xFFFD4000) // (SSC) Control Register +#define AT91C_SSC_IMR ((AT91_REG *) 0xFFFD404C) // (SSC) Interrupt Mask Register +#define AT91C_SSC_RFMR ((AT91_REG *) 0xFFFD4014) // (SSC) Receive Frame Mode Register +// ========== Register definition for TWI peripheral ========== +#define AT91C_TWI_IER ((AT91_REG *) 0xFFFB8024) // (TWI) Interrupt Enable Register +#define AT91C_TWI_CR ((AT91_REG *) 0xFFFB8000) // (TWI) Control Register +#define AT91C_TWI_SR ((AT91_REG *) 0xFFFB8020) // (TWI) Status Register +#define AT91C_TWI_IMR ((AT91_REG *) 0xFFFB802C) // (TWI) Interrupt Mask Register +#define AT91C_TWI_THR ((AT91_REG *) 0xFFFB8034) // (TWI) Transmit Holding Register +#define AT91C_TWI_IDR ((AT91_REG *) 0xFFFB8028) // (TWI) Interrupt Disable Register +#define AT91C_TWI_IADR ((AT91_REG *) 0xFFFB800C) // (TWI) Internal Address Register +#define AT91C_TWI_MMR ((AT91_REG *) 0xFFFB8004) // (TWI) Master Mode Register +#define AT91C_TWI_CWGR ((AT91_REG *) 0xFFFB8010) // (TWI) Clock Waveform Generator Register +#define AT91C_TWI_RHR ((AT91_REG *) 0xFFFB8030) // (TWI) Receive Holding Register +// ========== Register definition for PWMC_CH3 peripheral ========== +#define AT91C_PWMC_CH3_CUPDR ((AT91_REG *) 0xFFFCC270) // (PWMC_CH3) Channel Update Register +#define AT91C_PWMC_CH3_Reserved ((AT91_REG *) 0xFFFCC274) // (PWMC_CH3) Reserved +#define AT91C_PWMC_CH3_CPRDR ((AT91_REG *) 0xFFFCC268) // (PWMC_CH3) Channel Period Register +#define AT91C_PWMC_CH3_CDTYR ((AT91_REG *) 0xFFFCC264) // (PWMC_CH3) Channel Duty Cycle Register +#define AT91C_PWMC_CH3_CCNTR ((AT91_REG *) 0xFFFCC26C) // (PWMC_CH3) Channel Counter Register +#define AT91C_PWMC_CH3_CMR ((AT91_REG *) 0xFFFCC260) // (PWMC_CH3) Channel Mode Register +// ========== Register definition for PWMC_CH2 peripheral ========== +#define AT91C_PWMC_CH2_Reserved ((AT91_REG *) 0xFFFCC254) // (PWMC_CH2) Reserved +#define AT91C_PWMC_CH2_CMR ((AT91_REG *) 0xFFFCC240) // (PWMC_CH2) Channel Mode Register +#define AT91C_PWMC_CH2_CCNTR ((AT91_REG *) 0xFFFCC24C) // (PWMC_CH2) Channel Counter Register +#define AT91C_PWMC_CH2_CPRDR ((AT91_REG *) 0xFFFCC248) // (PWMC_CH2) Channel Period Register +#define AT91C_PWMC_CH2_CUPDR ((AT91_REG *) 0xFFFCC250) // (PWMC_CH2) Channel Update Register +#define AT91C_PWMC_CH2_CDTYR ((AT91_REG *) 0xFFFCC244) // (PWMC_CH2) Channel Duty Cycle Register +// ========== Register definition for PWMC_CH1 peripheral ========== +#define AT91C_PWMC_CH1_Reserved ((AT91_REG *) 0xFFFCC234) // (PWMC_CH1) Reserved +#define AT91C_PWMC_CH1_CUPDR ((AT91_REG *) 0xFFFCC230) // (PWMC_CH1) Channel Update Register +#define AT91C_PWMC_CH1_CPRDR ((AT91_REG *) 0xFFFCC228) // (PWMC_CH1) Channel Period Register +#define AT91C_PWMC_CH1_CCNTR ((AT91_REG *) 0xFFFCC22C) // (PWMC_CH1) Channel Counter Register +#define AT91C_PWMC_CH1_CDTYR ((AT91_REG *) 0xFFFCC224) // (PWMC_CH1) Channel Duty Cycle Register +#define AT91C_PWMC_CH1_CMR ((AT91_REG *) 0xFFFCC220) // (PWMC_CH1) Channel Mode Register +// ========== Register definition for PWMC_CH0 peripheral ========== +#define AT91C_PWMC_CH0_Reserved ((AT91_REG *) 0xFFFCC214) // (PWMC_CH0) Reserved +#define AT91C_PWMC_CH0_CPRDR ((AT91_REG *) 0xFFFCC208) // (PWMC_CH0) Channel Period Register +#define AT91C_PWMC_CH0_CDTYR ((AT91_REG *) 0xFFFCC204) // (PWMC_CH0) Channel Duty Cycle Register +#define AT91C_PWMC_CH0_CMR ((AT91_REG *) 0xFFFCC200) // (PWMC_CH0) Channel Mode Register +#define AT91C_PWMC_CH0_CUPDR ((AT91_REG *) 0xFFFCC210) // (PWMC_CH0) Channel Update Register +#define AT91C_PWMC_CH0_CCNTR ((AT91_REG *) 0xFFFCC20C) // (PWMC_CH0) Channel Counter Register +// ========== Register definition for PWMC peripheral ========== +#define AT91C_PWMC_IDR ((AT91_REG *) 0xFFFCC014) // (PWMC) PWMC Interrupt Disable Register +#define AT91C_PWMC_DIS ((AT91_REG *) 0xFFFCC008) // (PWMC) PWMC Disable Register +#define AT91C_PWMC_IER ((AT91_REG *) 0xFFFCC010) // (PWMC) PWMC Interrupt Enable Register +#define AT91C_PWMC_VR ((AT91_REG *) 0xFFFCC0FC) // (PWMC) PWMC Version Register +#define AT91C_PWMC_ISR ((AT91_REG *) 0xFFFCC01C) // (PWMC) PWMC Interrupt Status Register +#define AT91C_PWMC_SR ((AT91_REG *) 0xFFFCC00C) // (PWMC) PWMC Status Register +#define AT91C_PWMC_IMR ((AT91_REG *) 0xFFFCC018) // (PWMC) PWMC Interrupt Mask Register +#define AT91C_PWMC_MR ((AT91_REG *) 0xFFFCC000) // (PWMC) PWMC Mode Register +#define AT91C_PWMC_ENA ((AT91_REG *) 0xFFFCC004) // (PWMC) PWMC Enable Register +// ========== Register definition for UDP peripheral ========== +#define AT91C_UDP_IMR ((AT91_REG *) 0xFFFB0018) // (UDP) Interrupt Mask Register +#define AT91C_UDP_FADDR ((AT91_REG *) 0xFFFB0008) // (UDP) Function Address Register +#define AT91C_UDP_NUM ((AT91_REG *) 0xFFFB0000) // (UDP) Frame Number Register +#define AT91C_UDP_FDR ((AT91_REG *) 0xFFFB0050) // (UDP) Endpoint FIFO Data Register +#define AT91C_UDP_ISR ((AT91_REG *) 0xFFFB001C) // (UDP) Interrupt Status Register +#define AT91C_UDP_CSR ((AT91_REG *) 0xFFFB0030) // (UDP) Endpoint Control and Status Register +#define AT91C_UDP_IDR ((AT91_REG *) 0xFFFB0014) // (UDP) Interrupt Disable Register +#define AT91C_UDP_ICR ((AT91_REG *) 0xFFFB0020) // (UDP) Interrupt Clear Register +#define AT91C_UDP_RSTEP ((AT91_REG *) 0xFFFB0028) // (UDP) Reset Endpoint Register +#define AT91C_UDP_TXVC ((AT91_REG *) 0xFFFB0074) // (UDP) Transceiver Control Register +#define AT91C_UDP_GLBSTATE ((AT91_REG *) 0xFFFB0004) // (UDP) Global State Register +#define AT91C_UDP_IER ((AT91_REG *) 0xFFFB0010) // (UDP) Interrupt Enable Register +// ========== Register definition for TC0 peripheral ========== +#define AT91C_TC0_SR ((AT91_REG *) 0xFFFA0020) // (TC0) Status Register +#define AT91C_TC0_RC ((AT91_REG *) 0xFFFA001C) // (TC0) Register C +#define AT91C_TC0_RB ((AT91_REG *) 0xFFFA0018) // (TC0) Register B +#define AT91C_TC0_CCR ((AT91_REG *) 0xFFFA0000) // (TC0) Channel Control Register +#define AT91C_TC0_CMR ((AT91_REG *) 0xFFFA0004) // (TC0) Channel Mode Register (Capture Mode / Waveform Mode) +#define AT91C_TC0_IER ((AT91_REG *) 0xFFFA0024) // (TC0) Interrupt Enable Register +#define AT91C_TC0_RA ((AT91_REG *) 0xFFFA0014) // (TC0) Register A +#define AT91C_TC0_IDR ((AT91_REG *) 0xFFFA0028) // (TC0) Interrupt Disable Register +#define AT91C_TC0_CV ((AT91_REG *) 0xFFFA0010) // (TC0) Counter Value +#define AT91C_TC0_IMR ((AT91_REG *) 0xFFFA002C) // (TC0) Interrupt Mask Register +// ========== Register definition for TC1 peripheral ========== +#define AT91C_TC1_RB ((AT91_REG *) 0xFFFA0058) // (TC1) Register B +#define AT91C_TC1_CCR ((AT91_REG *) 0xFFFA0040) // (TC1) Channel Control Register +#define AT91C_TC1_IER ((AT91_REG *) 0xFFFA0064) // (TC1) Interrupt Enable Register +#define AT91C_TC1_IDR ((AT91_REG *) 0xFFFA0068) // (TC1) Interrupt Disable Register +#define AT91C_TC1_SR ((AT91_REG *) 0xFFFA0060) // (TC1) Status Register +#define AT91C_TC1_CMR ((AT91_REG *) 0xFFFA0044) // (TC1) Channel Mode Register (Capture Mode / Waveform Mode) +#define AT91C_TC1_RA ((AT91_REG *) 0xFFFA0054) // (TC1) Register A +#define AT91C_TC1_RC ((AT91_REG *) 0xFFFA005C) // (TC1) Register C +#define AT91C_TC1_IMR ((AT91_REG *) 0xFFFA006C) // (TC1) Interrupt Mask Register +#define AT91C_TC1_CV ((AT91_REG *) 0xFFFA0050) // (TC1) Counter Value +// ========== Register definition for TC2 peripheral ========== +#define AT91C_TC2_CMR ((AT91_REG *) 0xFFFA0084) // (TC2) Channel Mode Register (Capture Mode / Waveform Mode) +#define AT91C_TC2_CCR ((AT91_REG *) 0xFFFA0080) // (TC2) Channel Control Register +#define AT91C_TC2_CV ((AT91_REG *) 0xFFFA0090) // (TC2) Counter Value +#define AT91C_TC2_RA ((AT91_REG *) 0xFFFA0094) // (TC2) Register A +#define AT91C_TC2_RB ((AT91_REG *) 0xFFFA0098) // (TC2) Register B +#define AT91C_TC2_IDR ((AT91_REG *) 0xFFFA00A8) // (TC2) Interrupt Disable Register +#define AT91C_TC2_IMR ((AT91_REG *) 0xFFFA00AC) // (TC2) Interrupt Mask Register +#define AT91C_TC2_RC ((AT91_REG *) 0xFFFA009C) // (TC2) Register C +#define AT91C_TC2_IER ((AT91_REG *) 0xFFFA00A4) // (TC2) Interrupt Enable Register +#define AT91C_TC2_SR ((AT91_REG *) 0xFFFA00A0) // (TC2) Status Register +// ========== Register definition for TCB peripheral ========== +#define AT91C_TCB_BMR ((AT91_REG *) 0xFFFA00C4) // (TCB) TC Block Mode Register +#define AT91C_TCB_BCR ((AT91_REG *) 0xFFFA00C0) // (TCB) TC Block Control Register +// ========== Register definition for CAN_MB0 peripheral ========== +#define AT91C_CAN_MB0_MDL ((AT91_REG *) 0xFFFD0214) // (CAN_MB0) MailBox Data Low Register +#define AT91C_CAN_MB0_MAM ((AT91_REG *) 0xFFFD0204) // (CAN_MB0) MailBox Acceptance Mask Register +#define AT91C_CAN_MB0_MCR ((AT91_REG *) 0xFFFD021C) // (CAN_MB0) MailBox Control Register +#define AT91C_CAN_MB0_MID ((AT91_REG *) 0xFFFD0208) // (CAN_MB0) MailBox ID Register +#define AT91C_CAN_MB0_MSR ((AT91_REG *) 0xFFFD0210) // (CAN_MB0) MailBox Status Register +#define AT91C_CAN_MB0_MFID ((AT91_REG *) 0xFFFD020C) // (CAN_MB0) MailBox Family ID Register +#define AT91C_CAN_MB0_MDH ((AT91_REG *) 0xFFFD0218) // (CAN_MB0) MailBox Data High Register +#define AT91C_CAN_MB0_MMR ((AT91_REG *) 0xFFFD0200) // (CAN_MB0) MailBox Mode Register +// ========== Register definition for CAN_MB1 peripheral ========== +#define AT91C_CAN_MB1_MDL ((AT91_REG *) 0xFFFD0234) // (CAN_MB1) MailBox Data Low Register +#define AT91C_CAN_MB1_MID ((AT91_REG *) 0xFFFD0228) // (CAN_MB1) MailBox ID Register +#define AT91C_CAN_MB1_MMR ((AT91_REG *) 0xFFFD0220) // (CAN_MB1) MailBox Mode Register +#define AT91C_CAN_MB1_MSR ((AT91_REG *) 0xFFFD0230) // (CAN_MB1) MailBox Status Register +#define AT91C_CAN_MB1_MAM ((AT91_REG *) 0xFFFD0224) // (CAN_MB1) MailBox Acceptance Mask Register +#define AT91C_CAN_MB1_MDH ((AT91_REG *) 0xFFFD0238) // (CAN_MB1) MailBox Data High Register +#define AT91C_CAN_MB1_MCR ((AT91_REG *) 0xFFFD023C) // (CAN_MB1) MailBox Control Register +#define AT91C_CAN_MB1_MFID ((AT91_REG *) 0xFFFD022C) // (CAN_MB1) MailBox Family ID Register +// ========== Register definition for CAN_MB2 peripheral ========== +#define AT91C_CAN_MB2_MCR ((AT91_REG *) 0xFFFD025C) // (CAN_MB2) MailBox Control Register +#define AT91C_CAN_MB2_MDH ((AT91_REG *) 0xFFFD0258) // (CAN_MB2) MailBox Data High Register +#define AT91C_CAN_MB2_MID ((AT91_REG *) 0xFFFD0248) // (CAN_MB2) MailBox ID Register +#define AT91C_CAN_MB2_MDL ((AT91_REG *) 0xFFFD0254) // (CAN_MB2) MailBox Data Low Register +#define AT91C_CAN_MB2_MMR ((AT91_REG *) 0xFFFD0240) // (CAN_MB2) MailBox Mode Register +#define AT91C_CAN_MB2_MAM ((AT91_REG *) 0xFFFD0244) // (CAN_MB2) MailBox Acceptance Mask Register +#define AT91C_CAN_MB2_MFID ((AT91_REG *) 0xFFFD024C) // (CAN_MB2) MailBox Family ID Register +#define AT91C_CAN_MB2_MSR ((AT91_REG *) 0xFFFD0250) // (CAN_MB2) MailBox Status Register +// ========== Register definition for CAN_MB3 peripheral ========== +#define AT91C_CAN_MB3_MFID ((AT91_REG *) 0xFFFD026C) // (CAN_MB3) MailBox Family ID Register +#define AT91C_CAN_MB3_MAM ((AT91_REG *) 0xFFFD0264) // (CAN_MB3) MailBox Acceptance Mask Register +#define AT91C_CAN_MB3_MID ((AT91_REG *) 0xFFFD0268) // (CAN_MB3) MailBox ID Register +#define AT91C_CAN_MB3_MCR ((AT91_REG *) 0xFFFD027C) // (CAN_MB3) MailBox Control Register +#define AT91C_CAN_MB3_MMR ((AT91_REG *) 0xFFFD0260) // (CAN_MB3) MailBox Mode Register +#define AT91C_CAN_MB3_MSR ((AT91_REG *) 0xFFFD0270) // (CAN_MB3) MailBox Status Register +#define AT91C_CAN_MB3_MDL ((AT91_REG *) 0xFFFD0274) // (CAN_MB3) MailBox Data Low Register +#define AT91C_CAN_MB3_MDH ((AT91_REG *) 0xFFFD0278) // (CAN_MB3) MailBox Data High Register +// ========== Register definition for CAN_MB4 peripheral ========== +#define AT91C_CAN_MB4_MID ((AT91_REG *) 0xFFFD0288) // (CAN_MB4) MailBox ID Register +#define AT91C_CAN_MB4_MMR ((AT91_REG *) 0xFFFD0280) // (CAN_MB4) MailBox Mode Register +#define AT91C_CAN_MB4_MDH ((AT91_REG *) 0xFFFD0298) // (CAN_MB4) MailBox Data High Register +#define AT91C_CAN_MB4_MFID ((AT91_REG *) 0xFFFD028C) // (CAN_MB4) MailBox Family ID Register +#define AT91C_CAN_MB4_MSR ((AT91_REG *) 0xFFFD0290) // (CAN_MB4) MailBox Status Register +#define AT91C_CAN_MB4_MCR ((AT91_REG *) 0xFFFD029C) // (CAN_MB4) MailBox Control Register +#define AT91C_CAN_MB4_MDL ((AT91_REG *) 0xFFFD0294) // (CAN_MB4) MailBox Data Low Register +#define AT91C_CAN_MB4_MAM ((AT91_REG *) 0xFFFD0284) // (CAN_MB4) MailBox Acceptance Mask Register +// ========== Register definition for CAN_MB5 peripheral ========== +#define AT91C_CAN_MB5_MSR ((AT91_REG *) 0xFFFD02B0) // (CAN_MB5) MailBox Status Register +#define AT91C_CAN_MB5_MCR ((AT91_REG *) 0xFFFD02BC) // (CAN_MB5) MailBox Control Register +#define AT91C_CAN_MB5_MFID ((AT91_REG *) 0xFFFD02AC) // (CAN_MB5) MailBox Family ID Register +#define AT91C_CAN_MB5_MDH ((AT91_REG *) 0xFFFD02B8) // (CAN_MB5) MailBox Data High Register +#define AT91C_CAN_MB5_MID ((AT91_REG *) 0xFFFD02A8) // (CAN_MB5) MailBox ID Register +#define AT91C_CAN_MB5_MMR ((AT91_REG *) 0xFFFD02A0) // (CAN_MB5) MailBox Mode Register +#define AT91C_CAN_MB5_MDL ((AT91_REG *) 0xFFFD02B4) // (CAN_MB5) MailBox Data Low Register +#define AT91C_CAN_MB5_MAM ((AT91_REG *) 0xFFFD02A4) // (CAN_MB5) MailBox Acceptance Mask Register +// ========== Register definition for CAN_MB6 peripheral ========== +#define AT91C_CAN_MB6_MFID ((AT91_REG *) 0xFFFD02CC) // (CAN_MB6) MailBox Family ID Register +#define AT91C_CAN_MB6_MID ((AT91_REG *) 0xFFFD02C8) // (CAN_MB6) MailBox ID Register +#define AT91C_CAN_MB6_MAM ((AT91_REG *) 0xFFFD02C4) // (CAN_MB6) MailBox Acceptance Mask Register +#define AT91C_CAN_MB6_MSR ((AT91_REG *) 0xFFFD02D0) // (CAN_MB6) MailBox Status Register +#define AT91C_CAN_MB6_MDL ((AT91_REG *) 0xFFFD02D4) // (CAN_MB6) MailBox Data Low Register +#define AT91C_CAN_MB6_MCR ((AT91_REG *) 0xFFFD02DC) // (CAN_MB6) MailBox Control Register +#define AT91C_CAN_MB6_MDH ((AT91_REG *) 0xFFFD02D8) // (CAN_MB6) MailBox Data High Register +#define AT91C_CAN_MB6_MMR ((AT91_REG *) 0xFFFD02C0) // (CAN_MB6) MailBox Mode Register +// ========== Register definition for CAN_MB7 peripheral ========== +#define AT91C_CAN_MB7_MCR ((AT91_REG *) 0xFFFD02FC) // (CAN_MB7) MailBox Control Register +#define AT91C_CAN_MB7_MDH ((AT91_REG *) 0xFFFD02F8) // (CAN_MB7) MailBox Data High Register +#define AT91C_CAN_MB7_MFID ((AT91_REG *) 0xFFFD02EC) // (CAN_MB7) MailBox Family ID Register +#define AT91C_CAN_MB7_MDL ((AT91_REG *) 0xFFFD02F4) // (CAN_MB7) MailBox Data Low Register +#define AT91C_CAN_MB7_MID ((AT91_REG *) 0xFFFD02E8) // (CAN_MB7) MailBox ID Register +#define AT91C_CAN_MB7_MMR ((AT91_REG *) 0xFFFD02E0) // (CAN_MB7) MailBox Mode Register +#define AT91C_CAN_MB7_MAM ((AT91_REG *) 0xFFFD02E4) // (CAN_MB7) MailBox Acceptance Mask Register +#define AT91C_CAN_MB7_MSR ((AT91_REG *) 0xFFFD02F0) // (CAN_MB7) MailBox Status Register +// ========== Register definition for CAN peripheral ========== +#define AT91C_CAN_TCR ((AT91_REG *) 0xFFFD0024) // (CAN) Transfer Command Register +#define AT91C_CAN_IMR ((AT91_REG *) 0xFFFD000C) // (CAN) Interrupt Mask Register +#define AT91C_CAN_IER ((AT91_REG *) 0xFFFD0004) // (CAN) Interrupt Enable Register +#define AT91C_CAN_ECR ((AT91_REG *) 0xFFFD0020) // (CAN) Error Counter Register +#define AT91C_CAN_TIMESTP ((AT91_REG *) 0xFFFD001C) // (CAN) Time Stamp Register +#define AT91C_CAN_MR ((AT91_REG *) 0xFFFD0000) // (CAN) Mode Register +#define AT91C_CAN_IDR ((AT91_REG *) 0xFFFD0008) // (CAN) Interrupt Disable Register +#define AT91C_CAN_ACR ((AT91_REG *) 0xFFFD0028) // (CAN) Abort Command Register +#define AT91C_CAN_TIM ((AT91_REG *) 0xFFFD0018) // (CAN) Timer Register +#define AT91C_CAN_SR ((AT91_REG *) 0xFFFD0010) // (CAN) Status Register +#define AT91C_CAN_BR ((AT91_REG *) 0xFFFD0014) // (CAN) Baudrate Register +#define AT91C_CAN_VR ((AT91_REG *) 0xFFFD00FC) // (CAN) Version Register +// ========== Register definition for EMAC peripheral ========== +#define AT91C_EMAC_ISR ((AT91_REG *) 0xFFFDC024) // (EMAC) Interrupt Status Register +#define AT91C_EMAC_SA4H ((AT91_REG *) 0xFFFDC0B4) // (EMAC) Specific Address 4 Top, Last 2 bytes +#define AT91C_EMAC_SA1L ((AT91_REG *) 0xFFFDC098) // (EMAC) Specific Address 1 Bottom, First 4 bytes +#define AT91C_EMAC_ELE ((AT91_REG *) 0xFFFDC078) // (EMAC) Excessive Length Errors Register +#define AT91C_EMAC_LCOL ((AT91_REG *) 0xFFFDC05C) // (EMAC) Late Collision Register +#define AT91C_EMAC_RLE ((AT91_REG *) 0xFFFDC088) // (EMAC) Receive Length Field Mismatch Register +#define AT91C_EMAC_WOL ((AT91_REG *) 0xFFFDC0C4) // (EMAC) Wake On LAN Register +#define AT91C_EMAC_DTF ((AT91_REG *) 0xFFFDC058) // (EMAC) Deferred Transmission Frame Register +#define AT91C_EMAC_TUND ((AT91_REG *) 0xFFFDC064) // (EMAC) Transmit Underrun Error Register +#define AT91C_EMAC_NCR ((AT91_REG *) 0xFFFDC000) // (EMAC) Network Control Register +#define AT91C_EMAC_SA4L ((AT91_REG *) 0xFFFDC0B0) // (EMAC) Specific Address 4 Bottom, First 4 bytes +#define AT91C_EMAC_RSR ((AT91_REG *) 0xFFFDC020) // (EMAC) Receive Status Register +#define AT91C_EMAC_SA3L ((AT91_REG *) 0xFFFDC0A8) // (EMAC) Specific Address 3 Bottom, First 4 bytes +#define AT91C_EMAC_TSR ((AT91_REG *) 0xFFFDC014) // (EMAC) Transmit Status Register +#define AT91C_EMAC_IDR ((AT91_REG *) 0xFFFDC02C) // (EMAC) Interrupt Disable Register +#define AT91C_EMAC_RSE ((AT91_REG *) 0xFFFDC074) // (EMAC) Receive Symbol Errors Register +#define AT91C_EMAC_ECOL ((AT91_REG *) 0xFFFDC060) // (EMAC) Excessive Collision Register +#define AT91C_EMAC_TID ((AT91_REG *) 0xFFFDC0B8) // (EMAC) Type ID Checking Register +#define AT91C_EMAC_HRB ((AT91_REG *) 0xFFFDC090) // (EMAC) Hash Address Bottom[31:0] +#define AT91C_EMAC_TBQP ((AT91_REG *) 0xFFFDC01C) // (EMAC) Transmit Buffer Queue Pointer +#define AT91C_EMAC_USRIO ((AT91_REG *) 0xFFFDC0C0) // (EMAC) USER Input/Output Register +#define AT91C_EMAC_PTR ((AT91_REG *) 0xFFFDC038) // (EMAC) Pause Time Register +#define AT91C_EMAC_SA2H ((AT91_REG *) 0xFFFDC0A4) // (EMAC) Specific Address 2 Top, Last 2 bytes +#define AT91C_EMAC_ROV ((AT91_REG *) 0xFFFDC070) // (EMAC) Receive Overrun Errors Register +#define AT91C_EMAC_ALE ((AT91_REG *) 0xFFFDC054) // (EMAC) Alignment Error Register +#define AT91C_EMAC_RJA ((AT91_REG *) 0xFFFDC07C) // (EMAC) Receive Jabbers Register +#define AT91C_EMAC_RBQP ((AT91_REG *) 0xFFFDC018) // (EMAC) Receive Buffer Queue Pointer +#define AT91C_EMAC_TPF ((AT91_REG *) 0xFFFDC08C) // (EMAC) Transmitted Pause Frames Register +#define AT91C_EMAC_NCFGR ((AT91_REG *) 0xFFFDC004) // (EMAC) Network Configuration Register +#define AT91C_EMAC_HRT ((AT91_REG *) 0xFFFDC094) // (EMAC) Hash Address Top[63:32] +#define AT91C_EMAC_USF ((AT91_REG *) 0xFFFDC080) // (EMAC) Undersize Frames Register +#define AT91C_EMAC_FCSE ((AT91_REG *) 0xFFFDC050) // (EMAC) Frame Check Sequence Error Register +#define AT91C_EMAC_TPQ ((AT91_REG *) 0xFFFDC0BC) // (EMAC) Transmit Pause Quantum Register +#define AT91C_EMAC_MAN ((AT91_REG *) 0xFFFDC034) // (EMAC) PHY Maintenance Register +#define AT91C_EMAC_FTO ((AT91_REG *) 0xFFFDC040) // (EMAC) Frames Transmitted OK Register +#define AT91C_EMAC_REV ((AT91_REG *) 0xFFFDC0FC) // (EMAC) Revision Register +#define AT91C_EMAC_IMR ((AT91_REG *) 0xFFFDC030) // (EMAC) Interrupt Mask Register +#define AT91C_EMAC_SCF ((AT91_REG *) 0xFFFDC044) // (EMAC) Single Collision Frame Register +#define AT91C_EMAC_PFR ((AT91_REG *) 0xFFFDC03C) // (EMAC) Pause Frames received Register +#define AT91C_EMAC_MCF ((AT91_REG *) 0xFFFDC048) // (EMAC) Multiple Collision Frame Register +#define AT91C_EMAC_NSR ((AT91_REG *) 0xFFFDC008) // (EMAC) Network Status Register +#define AT91C_EMAC_SA2L ((AT91_REG *) 0xFFFDC0A0) // (EMAC) Specific Address 2 Bottom, First 4 bytes +#define AT91C_EMAC_FRO ((AT91_REG *) 0xFFFDC04C) // (EMAC) Frames Received OK Register +#define AT91C_EMAC_IER ((AT91_REG *) 0xFFFDC028) // (EMAC) Interrupt Enable Register +#define AT91C_EMAC_SA1H ((AT91_REG *) 0xFFFDC09C) // (EMAC) Specific Address 1 Top, Last 2 bytes +#define AT91C_EMAC_CSE ((AT91_REG *) 0xFFFDC068) // (EMAC) Carrier Sense Error Register +#define AT91C_EMAC_SA3H ((AT91_REG *) 0xFFFDC0AC) // (EMAC) Specific Address 3 Top, Last 2 bytes +#define AT91C_EMAC_RRE ((AT91_REG *) 0xFFFDC06C) // (EMAC) Receive Ressource Error Register +#define AT91C_EMAC_STE ((AT91_REG *) 0xFFFDC084) // (EMAC) SQE Test Error Register +// ========== Register definition for PDC_ADC peripheral ========== +#define AT91C_ADC_PTSR ((AT91_REG *) 0xFFFD8124) // (PDC_ADC) PDC Transfer Status Register +#define AT91C_ADC_PTCR ((AT91_REG *) 0xFFFD8120) // (PDC_ADC) PDC Transfer Control Register +#define AT91C_ADC_TNPR ((AT91_REG *) 0xFFFD8118) // (PDC_ADC) Transmit Next Pointer Register +#define AT91C_ADC_TNCR ((AT91_REG *) 0xFFFD811C) // (PDC_ADC) Transmit Next Counter Register +#define AT91C_ADC_RNPR ((AT91_REG *) 0xFFFD8110) // (PDC_ADC) Receive Next Pointer Register +#define AT91C_ADC_RNCR ((AT91_REG *) 0xFFFD8114) // (PDC_ADC) Receive Next Counter Register +#define AT91C_ADC_RPR ((AT91_REG *) 0xFFFD8100) // (PDC_ADC) Receive Pointer Register +#define AT91C_ADC_TCR ((AT91_REG *) 0xFFFD810C) // (PDC_ADC) Transmit Counter Register +#define AT91C_ADC_TPR ((AT91_REG *) 0xFFFD8108) // (PDC_ADC) Transmit Pointer Register +#define AT91C_ADC_RCR ((AT91_REG *) 0xFFFD8104) // (PDC_ADC) Receive Counter Register +// ========== Register definition for ADC peripheral ========== +#define AT91C_ADC_CDR2 ((AT91_REG *) 0xFFFD8038) // (ADC) ADC Channel Data Register 2 +#define AT91C_ADC_CDR3 ((AT91_REG *) 0xFFFD803C) // (ADC) ADC Channel Data Register 3 +#define AT91C_ADC_CDR0 ((AT91_REG *) 0xFFFD8030) // (ADC) ADC Channel Data Register 0 +#define AT91C_ADC_CDR5 ((AT91_REG *) 0xFFFD8044) // (ADC) ADC Channel Data Register 5 +#define AT91C_ADC_CHDR ((AT91_REG *) 0xFFFD8014) // (ADC) ADC Channel Disable Register +#define AT91C_ADC_SR ((AT91_REG *) 0xFFFD801C) // (ADC) ADC Status Register +#define AT91C_ADC_CDR4 ((AT91_REG *) 0xFFFD8040) // (ADC) ADC Channel Data Register 4 +#define AT91C_ADC_CDR1 ((AT91_REG *) 0xFFFD8034) // (ADC) ADC Channel Data Register 1 +#define AT91C_ADC_LCDR ((AT91_REG *) 0xFFFD8020) // (ADC) ADC Last Converted Data Register +#define AT91C_ADC_IDR ((AT91_REG *) 0xFFFD8028) // (ADC) ADC Interrupt Disable Register +#define AT91C_ADC_CR ((AT91_REG *) 0xFFFD8000) // (ADC) ADC Control Register +#define AT91C_ADC_CDR7 ((AT91_REG *) 0xFFFD804C) // (ADC) ADC Channel Data Register 7 +#define AT91C_ADC_CDR6 ((AT91_REG *) 0xFFFD8048) // (ADC) ADC Channel Data Register 6 +#define AT91C_ADC_IER ((AT91_REG *) 0xFFFD8024) // (ADC) ADC Interrupt Enable Register +#define AT91C_ADC_CHER ((AT91_REG *) 0xFFFD8010) // (ADC) ADC Channel Enable Register +#define AT91C_ADC_CHSR ((AT91_REG *) 0xFFFD8018) // (ADC) ADC Channel Status Register +#define AT91C_ADC_MR ((AT91_REG *) 0xFFFD8004) // (ADC) ADC Mode Register +#define AT91C_ADC_IMR ((AT91_REG *) 0xFFFD802C) // (ADC) ADC Interrupt Mask Register +// ========== Register definition for PDC_AES peripheral ========== +#define AT91C_AES_TPR ((AT91_REG *) 0xFFFA4108) // (PDC_AES) Transmit Pointer Register +#define AT91C_AES_PTCR ((AT91_REG *) 0xFFFA4120) // (PDC_AES) PDC Transfer Control Register +#define AT91C_AES_RNPR ((AT91_REG *) 0xFFFA4110) // (PDC_AES) Receive Next Pointer Register +#define AT91C_AES_TNCR ((AT91_REG *) 0xFFFA411C) // (PDC_AES) Transmit Next Counter Register +#define AT91C_AES_TCR ((AT91_REG *) 0xFFFA410C) // (PDC_AES) Transmit Counter Register +#define AT91C_AES_RCR ((AT91_REG *) 0xFFFA4104) // (PDC_AES) Receive Counter Register +#define AT91C_AES_RNCR ((AT91_REG *) 0xFFFA4114) // (PDC_AES) Receive Next Counter Register +#define AT91C_AES_TNPR ((AT91_REG *) 0xFFFA4118) // (PDC_AES) Transmit Next Pointer Register +#define AT91C_AES_RPR ((AT91_REG *) 0xFFFA4100) // (PDC_AES) Receive Pointer Register +#define AT91C_AES_PTSR ((AT91_REG *) 0xFFFA4124) // (PDC_AES) PDC Transfer Status Register +// ========== Register definition for AES peripheral ========== +#define AT91C_AES_IVxR ((AT91_REG *) 0xFFFA4060) // (AES) Initialization Vector x Register +#define AT91C_AES_MR ((AT91_REG *) 0xFFFA4004) // (AES) Mode Register +#define AT91C_AES_VR ((AT91_REG *) 0xFFFA40FC) // (AES) AES Version Register +#define AT91C_AES_ODATAxR ((AT91_REG *) 0xFFFA4050) // (AES) Output Data x Register +#define AT91C_AES_IDATAxR ((AT91_REG *) 0xFFFA4040) // (AES) Input Data x Register +#define AT91C_AES_CR ((AT91_REG *) 0xFFFA4000) // (AES) Control Register +#define AT91C_AES_IDR ((AT91_REG *) 0xFFFA4014) // (AES) Interrupt Disable Register +#define AT91C_AES_IMR ((AT91_REG *) 0xFFFA4018) // (AES) Interrupt Mask Register +#define AT91C_AES_IER ((AT91_REG *) 0xFFFA4010) // (AES) Interrupt Enable Register +#define AT91C_AES_KEYWxR ((AT91_REG *) 0xFFFA4020) // (AES) Key Word x Register +#define AT91C_AES_ISR ((AT91_REG *) 0xFFFA401C) // (AES) Interrupt Status Register +// ========== Register definition for PDC_TDES peripheral ========== +#define AT91C_TDES_RNCR ((AT91_REG *) 0xFFFA8114) // (PDC_TDES) Receive Next Counter Register +#define AT91C_TDES_TCR ((AT91_REG *) 0xFFFA810C) // (PDC_TDES) Transmit Counter Register +#define AT91C_TDES_RCR ((AT91_REG *) 0xFFFA8104) // (PDC_TDES) Receive Counter Register +#define AT91C_TDES_TNPR ((AT91_REG *) 0xFFFA8118) // (PDC_TDES) Transmit Next Pointer Register +#define AT91C_TDES_RNPR ((AT91_REG *) 0xFFFA8110) // (PDC_TDES) Receive Next Pointer Register +#define AT91C_TDES_RPR ((AT91_REG *) 0xFFFA8100) // (PDC_TDES) Receive Pointer Register +#define AT91C_TDES_TNCR ((AT91_REG *) 0xFFFA811C) // (PDC_TDES) Transmit Next Counter Register +#define AT91C_TDES_TPR ((AT91_REG *) 0xFFFA8108) // (PDC_TDES) Transmit Pointer Register +#define AT91C_TDES_PTSR ((AT91_REG *) 0xFFFA8124) // (PDC_TDES) PDC Transfer Status Register +#define AT91C_TDES_PTCR ((AT91_REG *) 0xFFFA8120) // (PDC_TDES) PDC Transfer Control Register +// ========== Register definition for TDES peripheral ========== +#define AT91C_TDES_KEY2WxR ((AT91_REG *) 0xFFFA8028) // (TDES) Key 2 Word x Register +#define AT91C_TDES_KEY3WxR ((AT91_REG *) 0xFFFA8030) // (TDES) Key 3 Word x Register +#define AT91C_TDES_IDR ((AT91_REG *) 0xFFFA8014) // (TDES) Interrupt Disable Register +#define AT91C_TDES_VR ((AT91_REG *) 0xFFFA80FC) // (TDES) TDES Version Register +#define AT91C_TDES_IVxR ((AT91_REG *) 0xFFFA8060) // (TDES) Initialization Vector x Register +#define AT91C_TDES_ODATAxR ((AT91_REG *) 0xFFFA8050) // (TDES) Output Data x Register +#define AT91C_TDES_IMR ((AT91_REG *) 0xFFFA8018) // (TDES) Interrupt Mask Register +#define AT91C_TDES_MR ((AT91_REG *) 0xFFFA8004) // (TDES) Mode Register +#define AT91C_TDES_CR ((AT91_REG *) 0xFFFA8000) // (TDES) Control Register +#define AT91C_TDES_IER ((AT91_REG *) 0xFFFA8010) // (TDES) Interrupt Enable Register +#define AT91C_TDES_ISR ((AT91_REG *) 0xFFFA801C) // (TDES) Interrupt Status Register +#define AT91C_TDES_IDATAxR ((AT91_REG *) 0xFFFA8040) // (TDES) Input Data x Register +#define AT91C_TDES_KEY1WxR ((AT91_REG *) 0xFFFA8020) // (TDES) Key 1 Word x Register + +// ***************************************************************************** +// PIO DEFINITIONS FOR AT91SAM7X256 +// ***************************************************************************** +#define AT91C_PIO_PA0 ((unsigned int) 1 << 0) // Pin Controlled by PA0 +#define AT91C_PA0_RXD0 ((unsigned int) AT91C_PIO_PA0) // USART 0 Receive Data +#define AT91C_PIO_PA1 ((unsigned int) 1 << 1) // Pin Controlled by PA1 +#define AT91C_PA1_TXD0 ((unsigned int) AT91C_PIO_PA1) // USART 0 Transmit Data +#define AT91C_PIO_PA10 ((unsigned int) 1 << 10) // Pin Controlled by PA10 +#define AT91C_PA10_TWD ((unsigned int) AT91C_PIO_PA10) // TWI Two-wire Serial Data +#define AT91C_PIO_PA11 ((unsigned int) 1 << 11) // Pin Controlled by PA11 +#define AT91C_PA11_TWCK ((unsigned int) AT91C_PIO_PA11) // TWI Two-wire Serial Clock +#define AT91C_PIO_PA12 ((unsigned int) 1 << 12) // Pin Controlled by PA12 +#define AT91C_PA12_NPCS00 ((unsigned int) AT91C_PIO_PA12) // SPI 0 Peripheral Chip Select 0 +#define AT91C_PIO_PA13 ((unsigned int) 1 << 13) // Pin Controlled by PA13 +#define AT91C_PA13_NPCS01 ((unsigned int) AT91C_PIO_PA13) // SPI 0 Peripheral Chip Select 1 +#define AT91C_PA13_PCK1 ((unsigned int) AT91C_PIO_PA13) // PMC Programmable Clock Output 1 +#define AT91C_PIO_PA14 ((unsigned int) 1 << 14) // Pin Controlled by PA14 +#define AT91C_PA14_NPCS02 ((unsigned int) AT91C_PIO_PA14) // SPI 0 Peripheral Chip Select 2 +#define AT91C_PA14_IRQ1 ((unsigned int) AT91C_PIO_PA14) // External Interrupt 1 +#define AT91C_PIO_PA15 ((unsigned int) 1 << 15) // Pin Controlled by PA15 +#define AT91C_PA15_NPCS03 ((unsigned int) AT91C_PIO_PA15) // SPI 0 Peripheral Chip Select 3 +#define AT91C_PA15_TCLK2 ((unsigned int) AT91C_PIO_PA15) // Timer Counter 2 external clock input +#define AT91C_PIO_PA16 ((unsigned int) 1 << 16) // Pin Controlled by PA16 +#define AT91C_PA16_MISO0 ((unsigned int) AT91C_PIO_PA16) // SPI 0 Master In Slave +#define AT91C_PIO_PA17 ((unsigned int) 1 << 17) // Pin Controlled by PA17 +#define AT91C_PA17_MOSI0 ((unsigned int) AT91C_PIO_PA17) // SPI 0 Master Out Slave +#define AT91C_PIO_PA18 ((unsigned int) 1 << 18) // Pin Controlled by PA18 +#define AT91C_PA18_SPCK0 ((unsigned int) AT91C_PIO_PA18) // SPI 0 Serial Clock +#define AT91C_PIO_PA19 ((unsigned int) 1 << 19) // Pin Controlled by PA19 +#define AT91C_PA19_CANRX ((unsigned int) AT91C_PIO_PA19) // CAN Receive +#define AT91C_PIO_PA2 ((unsigned int) 1 << 2) // Pin Controlled by PA2 +#define AT91C_PA2_SCK0 ((unsigned int) AT91C_PIO_PA2) // USART 0 Serial Clock +#define AT91C_PA2_NPCS11 ((unsigned int) AT91C_PIO_PA2) // SPI 1 Peripheral Chip Select 1 +#define AT91C_PIO_PA20 ((unsigned int) 1 << 20) // Pin Controlled by PA20 +#define AT91C_PA20_CANTX ((unsigned int) AT91C_PIO_PA20) // CAN Transmit +#define AT91C_PIO_PA21 ((unsigned int) 1 << 21) // Pin Controlled by PA21 +#define AT91C_PA21_TF ((unsigned int) AT91C_PIO_PA21) // SSC Transmit Frame Sync +#define AT91C_PA21_NPCS10 ((unsigned int) AT91C_PIO_PA21) // SPI 1 Peripheral Chip Select 0 +#define AT91C_PIO_PA22 ((unsigned int) 1 << 22) // Pin Controlled by PA22 +#define AT91C_PA22_TK ((unsigned int) AT91C_PIO_PA22) // SSC Transmit Clock +#define AT91C_PA22_SPCK1 ((unsigned int) AT91C_PIO_PA22) // SPI 1 Serial Clock +#define AT91C_PIO_PA23 ((unsigned int) 1 << 23) // Pin Controlled by PA23 +#define AT91C_PA23_TD ((unsigned int) AT91C_PIO_PA23) // SSC Transmit data +#define AT91C_PA23_MOSI1 ((unsigned int) AT91C_PIO_PA23) // SPI 1 Master Out Slave +#define AT91C_PIO_PA24 ((unsigned int) 1 << 24) // Pin Controlled by PA24 +#define AT91C_PA24_RD ((unsigned int) AT91C_PIO_PA24) // SSC Receive Data +#define AT91C_PA24_MISO1 ((unsigned int) AT91C_PIO_PA24) // SPI 1 Master In Slave +#define AT91C_PIO_PA25 ((unsigned int) 1 << 25) // Pin Controlled by PA25 +#define AT91C_PA25_RK ((unsigned int) AT91C_PIO_PA25) // SSC Receive Clock +#define AT91C_PA25_NPCS11 ((unsigned int) AT91C_PIO_PA25) // SPI 1 Peripheral Chip Select 1 +#define AT91C_PIO_PA26 ((unsigned int) 1 << 26) // Pin Controlled by PA26 +#define AT91C_PA26_RF ((unsigned int) AT91C_PIO_PA26) // SSC Receive Frame Sync +#define AT91C_PA26_NPCS12 ((unsigned int) AT91C_PIO_PA26) // SPI 1 Peripheral Chip Select 2 +#define AT91C_PIO_PA27 ((unsigned int) 1 << 27) // Pin Controlled by PA27 +#define AT91C_PA27_DRXD ((unsigned int) AT91C_PIO_PA27) // DBGU Debug Receive Data +#define AT91C_PA27_PCK3 ((unsigned int) AT91C_PIO_PA27) // PMC Programmable Clock Output 3 +#define AT91C_PIO_PA28 ((unsigned int) 1 << 28) // Pin Controlled by PA28 +#define AT91C_PA28_DTXD ((unsigned int) AT91C_PIO_PA28) // DBGU Debug Transmit Data +#define AT91C_PIO_PA29 ((unsigned int) 1 << 29) // Pin Controlled by PA29 +#define AT91C_PA29_FIQ ((unsigned int) AT91C_PIO_PA29) // AIC Fast Interrupt Input +#define AT91C_PA29_NPCS13 ((unsigned int) AT91C_PIO_PA29) // SPI 1 Peripheral Chip Select 3 +#define AT91C_PIO_PA3 ((unsigned int) 1 << 3) // Pin Controlled by PA3 +#define AT91C_PA3_RTS0 ((unsigned int) AT91C_PIO_PA3) // USART 0 Ready To Send +#define AT91C_PA3_NPCS12 ((unsigned int) AT91C_PIO_PA3) // SPI 1 Peripheral Chip Select 2 +#define AT91C_PIO_PA30 ((unsigned int) 1 << 30) // Pin Controlled by PA30 +#define AT91C_PA30_IRQ0 ((unsigned int) AT91C_PIO_PA30) // External Interrupt 0 +#define AT91C_PA30_PCK2 ((unsigned int) AT91C_PIO_PA30) // PMC Programmable Clock Output 2 +#define AT91C_PIO_PA4 ((unsigned int) 1 << 4) // Pin Controlled by PA4 +#define AT91C_PA4_CTS0 ((unsigned int) AT91C_PIO_PA4) // USART 0 Clear To Send +#define AT91C_PA4_NPCS13 ((unsigned int) AT91C_PIO_PA4) // SPI 1 Peripheral Chip Select 3 +#define AT91C_PIO_PA5 ((unsigned int) 1 << 5) // Pin Controlled by PA5 +#define AT91C_PA5_RXD1 ((unsigned int) AT91C_PIO_PA5) // USART 1 Receive Data +#define AT91C_PIO_PA6 ((unsigned int) 1 << 6) // Pin Controlled by PA6 +#define AT91C_PA6_TXD1 ((unsigned int) AT91C_PIO_PA6) // USART 1 Transmit Data +#define AT91C_PIO_PA7 ((unsigned int) 1 << 7) // Pin Controlled by PA7 +#define AT91C_PA7_SCK1 ((unsigned int) AT91C_PIO_PA7) // USART 1 Serial Clock +#define AT91C_PA7_NPCS01 ((unsigned int) AT91C_PIO_PA7) // SPI 0 Peripheral Chip Select 1 +#define AT91C_PIO_PA8 ((unsigned int) 1 << 8) // Pin Controlled by PA8 +#define AT91C_PA8_RTS1 ((unsigned int) AT91C_PIO_PA8) // USART 1 Ready To Send +#define AT91C_PA8_NPCS02 ((unsigned int) AT91C_PIO_PA8) // SPI 0 Peripheral Chip Select 2 +#define AT91C_PIO_PA9 ((unsigned int) 1 << 9) // Pin Controlled by PA9 +#define AT91C_PA9_CTS1 ((unsigned int) AT91C_PIO_PA9) // USART 1 Clear To Send +#define AT91C_PA9_NPCS03 ((unsigned int) AT91C_PIO_PA9) // SPI 0 Peripheral Chip Select 3 +#define AT91C_PIO_PB0 ((unsigned int) 1 << 0) // Pin Controlled by PB0 +#define AT91C_PB0_ETXCK_EREFCK ((unsigned int) AT91C_PIO_PB0) // Ethernet MAC Transmit Clock/Reference Clock +#define AT91C_PB0_PCK0 ((unsigned int) AT91C_PIO_PB0) // PMC Programmable Clock Output 0 +#define AT91C_PIO_PB1 ((unsigned int) 1 << 1) // Pin Controlled by PB1 +#define AT91C_PB1_ETXEN ((unsigned int) AT91C_PIO_PB1) // Ethernet MAC Transmit Enable +#define AT91C_PIO_PB10 ((unsigned int) 1 << 10) // Pin Controlled by PB10 +#define AT91C_PB10_ETX2 ((unsigned int) AT91C_PIO_PB10) // Ethernet MAC Transmit Data 2 +#define AT91C_PB10_NPCS11 ((unsigned int) AT91C_PIO_PB10) // SPI 1 Peripheral Chip Select 1 +#define AT91C_PIO_PB11 ((unsigned int) 1 << 11) // Pin Controlled by PB11 +#define AT91C_PB11_ETX3 ((unsigned int) AT91C_PIO_PB11) // Ethernet MAC Transmit Data 3 +#define AT91C_PB11_NPCS12 ((unsigned int) AT91C_PIO_PB11) // SPI 1 Peripheral Chip Select 2 +#define AT91C_PIO_PB12 ((unsigned int) 1 << 12) // Pin Controlled by PB12 +#define AT91C_PB12_ETXER ((unsigned int) AT91C_PIO_PB12) // Ethernet MAC Transmikt Coding Error +#define AT91C_PB12_TCLK0 ((unsigned int) AT91C_PIO_PB12) // Timer Counter 0 external clock input +#define AT91C_PIO_PB13 ((unsigned int) 1 << 13) // Pin Controlled by PB13 +#define AT91C_PB13_ERX2 ((unsigned int) AT91C_PIO_PB13) // Ethernet MAC Receive Data 2 +#define AT91C_PB13_NPCS01 ((unsigned int) AT91C_PIO_PB13) // SPI 0 Peripheral Chip Select 1 +#define AT91C_PIO_PB14 ((unsigned int) 1 << 14) // Pin Controlled by PB14 +#define AT91C_PB14_ERX3 ((unsigned int) AT91C_PIO_PB14) // Ethernet MAC Receive Data 3 +#define AT91C_PB14_NPCS02 ((unsigned int) AT91C_PIO_PB14) // SPI 0 Peripheral Chip Select 2 +#define AT91C_PIO_PB15 ((unsigned int) 1 << 15) // Pin Controlled by PB15 +#define AT91C_PB15_ERXDV ((unsigned int) AT91C_PIO_PB15) // Ethernet MAC Receive Data Valid +#define AT91C_PIO_PB16 ((unsigned int) 1 << 16) // Pin Controlled by PB16 +#define AT91C_PB16_ECOL ((unsigned int) AT91C_PIO_PB16) // Ethernet MAC Collision Detected +#define AT91C_PB16_NPCS13 ((unsigned int) AT91C_PIO_PB16) // SPI 1 Peripheral Chip Select 3 +#define AT91C_PIO_PB17 ((unsigned int) 1 << 17) // Pin Controlled by PB17 +#define AT91C_PB17_ERXCK ((unsigned int) AT91C_PIO_PB17) // Ethernet MAC Receive Clock +#define AT91C_PB17_NPCS03 ((unsigned int) AT91C_PIO_PB17) // SPI 0 Peripheral Chip Select 3 +#define AT91C_PIO_PB18 ((unsigned int) 1 << 18) // Pin Controlled by PB18 +#define AT91C_PB18_EF100 ((unsigned int) AT91C_PIO_PB18) // Ethernet MAC Force 100 Mbits/sec +#define AT91C_PB18_ADTRG ((unsigned int) AT91C_PIO_PB18) // ADC External Trigger +#define AT91C_PIO_PB19 ((unsigned int) 1 << 19) // Pin Controlled by PB19 +#define AT91C_PB19_PWM0 ((unsigned int) AT91C_PIO_PB19) // PWM Channel 0 +#define AT91C_PB19_TCLK1 ((unsigned int) AT91C_PIO_PB19) // Timer Counter 1 external clock input +#define AT91C_PIO_PB2 ((unsigned int) 1 << 2) // Pin Controlled by PB2 +#define AT91C_PB2_ETX0 ((unsigned int) AT91C_PIO_PB2) // Ethernet MAC Transmit Data 0 +#define AT91C_PIO_PB20 ((unsigned int) 1 << 20) // Pin Controlled by PB20 +#define AT91C_PB20_PWM1 ((unsigned int) AT91C_PIO_PB20) // PWM Channel 1 +#define AT91C_PB20_PCK0 ((unsigned int) AT91C_PIO_PB20) // PMC Programmable Clock Output 0 +#define AT91C_PIO_PB21 ((unsigned int) 1 << 21) // Pin Controlled by PB21 +#define AT91C_PB21_PWM2 ((unsigned int) AT91C_PIO_PB21) // PWM Channel 2 +#define AT91C_PB21_PCK1 ((unsigned int) AT91C_PIO_PB21) // PMC Programmable Clock Output 1 +#define AT91C_PIO_PB22 ((unsigned int) 1 << 22) // Pin Controlled by PB22 +#define AT91C_PB22_PWM3 ((unsigned int) AT91C_PIO_PB22) // PWM Channel 3 +#define AT91C_PB22_PCK2 ((unsigned int) AT91C_PIO_PB22) // PMC Programmable Clock Output 2 +#define AT91C_PIO_PB23 ((unsigned int) 1 << 23) // Pin Controlled by PB23 +#define AT91C_PB23_TIOA0 ((unsigned int) AT91C_PIO_PB23) // Timer Counter 0 Multipurpose Timer I/O Pin A +#define AT91C_PB23_DCD1 ((unsigned int) AT91C_PIO_PB23) // USART 1 Data Carrier Detect +#define AT91C_PIO_PB24 ((unsigned int) 1 << 24) // Pin Controlled by PB24 +#define AT91C_PB24_TIOB0 ((unsigned int) AT91C_PIO_PB24) // Timer Counter 0 Multipurpose Timer I/O Pin B +#define AT91C_PB24_DSR1 ((unsigned int) AT91C_PIO_PB24) // USART 1 Data Set ready +#define AT91C_PIO_PB25 ((unsigned int) 1 << 25) // Pin Controlled by PB25 +#define AT91C_PB25_TIOA1 ((unsigned int) AT91C_PIO_PB25) // Timer Counter 1 Multipurpose Timer I/O Pin A +#define AT91C_PB25_DTR1 ((unsigned int) AT91C_PIO_PB25) // USART 1 Data Terminal ready +#define AT91C_PIO_PB26 ((unsigned int) 1 << 26) // Pin Controlled by PB26 +#define AT91C_PB26_TIOB1 ((unsigned int) AT91C_PIO_PB26) // Timer Counter 1 Multipurpose Timer I/O Pin B +#define AT91C_PB26_RI1 ((unsigned int) AT91C_PIO_PB26) // USART 1 Ring Indicator +#define AT91C_PIO_PB27 ((unsigned int) 1 << 27) // Pin Controlled by PB27 +#define AT91C_PB27_TIOA2 ((unsigned int) AT91C_PIO_PB27) // Timer Counter 2 Multipurpose Timer I/O Pin A +#define AT91C_PB27_PWM0 ((unsigned int) AT91C_PIO_PB27) // PWM Channel 0 +#define AT91C_PIO_PB28 ((unsigned int) 1 << 28) // Pin Controlled by PB28 +#define AT91C_PB28_TIOB2 ((unsigned int) AT91C_PIO_PB28) // Timer Counter 2 Multipurpose Timer I/O Pin B +#define AT91C_PB28_PWM1 ((unsigned int) AT91C_PIO_PB28) // PWM Channel 1 +#define AT91C_PIO_PB29 ((unsigned int) 1 << 29) // Pin Controlled by PB29 +#define AT91C_PB29_PCK1 ((unsigned int) AT91C_PIO_PB29) // PMC Programmable Clock Output 1 +#define AT91C_PB29_PWM2 ((unsigned int) AT91C_PIO_PB29) // PWM Channel 2 +#define AT91C_PIO_PB3 ((unsigned int) 1 << 3) // Pin Controlled by PB3 +#define AT91C_PB3_ETX1 ((unsigned int) AT91C_PIO_PB3) // Ethernet MAC Transmit Data 1 +#define AT91C_PIO_PB30 ((unsigned int) 1 << 30) // Pin Controlled by PB30 +#define AT91C_PB30_PCK2 ((unsigned int) AT91C_PIO_PB30) // PMC Programmable Clock Output 2 +#define AT91C_PB30_PWM3 ((unsigned int) AT91C_PIO_PB30) // PWM Channel 3 +#define AT91C_PIO_PB4 ((unsigned int) 1 << 4) // Pin Controlled by PB4 +#define AT91C_PB4_ECRS_ECRSDV ((unsigned int) AT91C_PIO_PB4) // Ethernet MAC Carrier Sense/Carrier Sense and Data Valid +#define AT91C_PIO_PB5 ((unsigned int) 1 << 5) // Pin Controlled by PB5 +#define AT91C_PB5_ERX0 ((unsigned int) AT91C_PIO_PB5) // Ethernet MAC Receive Data 0 +#define AT91C_PIO_PB6 ((unsigned int) 1 << 6) // Pin Controlled by PB6 +#define AT91C_PB6_ERX1 ((unsigned int) AT91C_PIO_PB6) // Ethernet MAC Receive Data 1 +#define AT91C_PIO_PB7 ((unsigned int) 1 << 7) // Pin Controlled by PB7 +#define AT91C_PB7_ERXER ((unsigned int) AT91C_PIO_PB7) // Ethernet MAC Receive Error +#define AT91C_PIO_PB8 ((unsigned int) 1 << 8) // Pin Controlled by PB8 +#define AT91C_PB8_EMDC ((unsigned int) AT91C_PIO_PB8) // Ethernet MAC Management Data Clock +#define AT91C_PIO_PB9 ((unsigned int) 1 << 9) // Pin Controlled by PB9 +#define AT91C_PB9_EMDIO ((unsigned int) AT91C_PIO_PB9) // Ethernet MAC Management Data Input/Output + +// ***************************************************************************** +// PERIPHERAL ID DEFINITIONS FOR AT91SAM7X256 +// ***************************************************************************** +#define AT91C_ID_FIQ ((unsigned int) 0) // Advanced Interrupt Controller (FIQ) +#define AT91C_ID_SYS ((unsigned int) 1) // System Peripheral +#define AT91C_ID_PIOA ((unsigned int) 2) // Parallel IO Controller A +#define AT91C_ID_PIOB ((unsigned int) 3) // Parallel IO Controller B +#define AT91C_ID_SPI0 ((unsigned int) 4) // Serial Peripheral Interface 0 +#define AT91C_ID_SPI1 ((unsigned int) 5) // Serial Peripheral Interface 1 +#define AT91C_ID_US0 ((unsigned int) 6) // USART 0 +#define AT91C_ID_US1 ((unsigned int) 7) // USART 1 +#define AT91C_ID_SSC ((unsigned int) 8) // Serial Synchronous Controller +#define AT91C_ID_TWI ((unsigned int) 9) // Two-Wire Interface +#define AT91C_ID_PWMC ((unsigned int) 10) // PWM Controller +#define AT91C_ID_UDP ((unsigned int) 11) // USB Device Port +#define AT91C_ID_TC0 ((unsigned int) 12) // Timer Counter 0 +#define AT91C_ID_TC1 ((unsigned int) 13) // Timer Counter 1 +#define AT91C_ID_TC2 ((unsigned int) 14) // Timer Counter 2 +#define AT91C_ID_CAN ((unsigned int) 15) // Control Area Network Controller +#define AT91C_ID_EMAC ((unsigned int) 16) // Ethernet MAC +#define AT91C_ID_ADC ((unsigned int) 17) // Analog-to-Digital Converter +#define AT91C_ID_AES ((unsigned int) 18) // Advanced Encryption Standard 128-bit +#define AT91C_ID_TDES ((unsigned int) 19) // Triple Data Encryption Standard +#define AT91C_ID_20_Reserved ((unsigned int) 20) // Reserved +#define AT91C_ID_21_Reserved ((unsigned int) 21) // Reserved +#define AT91C_ID_22_Reserved ((unsigned int) 22) // Reserved +#define AT91C_ID_23_Reserved ((unsigned int) 23) // Reserved +#define AT91C_ID_24_Reserved ((unsigned int) 24) // Reserved +#define AT91C_ID_25_Reserved ((unsigned int) 25) // Reserved +#define AT91C_ID_26_Reserved ((unsigned int) 26) // Reserved +#define AT91C_ID_27_Reserved ((unsigned int) 27) // Reserved +#define AT91C_ID_28_Reserved ((unsigned int) 28) // Reserved +#define AT91C_ID_29_Reserved ((unsigned int) 29) // Reserved +#define AT91C_ID_IRQ0 ((unsigned int) 30) // Advanced Interrupt Controller (IRQ0) +#define AT91C_ID_IRQ1 ((unsigned int) 31) // Advanced Interrupt Controller (IRQ1) + +// ***************************************************************************** +// BASE ADDRESS DEFINITIONS FOR AT91SAM7X256 +// ***************************************************************************** +#define AT91C_BASE_SYS ((AT91PS_SYS) 0xFFFFF000) // (SYS) Base Address +#define AT91C_BASE_AIC ((AT91PS_AIC) 0xFFFFF000) // (AIC) Base Address +#define AT91C_BASE_PDC_DBGU ((AT91PS_PDC) 0xFFFFF300) // (PDC_DBGU) Base Address +#define AT91C_BASE_DBGU ((AT91PS_DBGU) 0xFFFFF200) // (DBGU) Base Address +#define AT91C_BASE_PIOA ((AT91PS_PIO) 0xFFFFF400) // (PIOA) Base Address +#define AT91C_BASE_PIOB ((AT91PS_PIO) 0xFFFFF600) // (PIOB) Base Address +#define AT91C_BASE_CKGR ((AT91PS_CKGR) 0xFFFFFC20) // (CKGR) Base Address +#define AT91C_BASE_PMC ((AT91PS_PMC) 0xFFFFFC00) // (PMC) Base Address +#define AT91C_BASE_RSTC ((AT91PS_RSTC) 0xFFFFFD00) // (RSTC) Base Address +#define AT91C_BASE_RTTC ((AT91PS_RTTC) 0xFFFFFD20) // (RTTC) Base Address +#define AT91C_BASE_PITC ((AT91PS_PITC) 0xFFFFFD30) // (PITC) Base Address +#define AT91C_BASE_WDTC ((AT91PS_WDTC) 0xFFFFFD40) // (WDTC) Base Address +#define AT91C_BASE_VREG ((AT91PS_VREG) 0xFFFFFD60) // (VREG) Base Address +#define AT91C_BASE_MC ((AT91PS_MC) 0xFFFFFF00) // (MC) Base Address +#define AT91C_BASE_PDC_SPI1 ((AT91PS_PDC) 0xFFFE4100) // (PDC_SPI1) Base Address +#define AT91C_BASE_SPI1 ((AT91PS_SPI) 0xFFFE4000) // (SPI1) Base Address +#define AT91C_BASE_PDC_SPI0 ((AT91PS_PDC) 0xFFFE0100) // (PDC_SPI0) Base Address +#define AT91C_BASE_SPI0 ((AT91PS_SPI) 0xFFFE0000) // (SPI0) Base Address +#define AT91C_BASE_PDC_US1 ((AT91PS_PDC) 0xFFFC4100) // (PDC_US1) Base Address +#define AT91C_BASE_US1 ((AT91PS_USART) 0xFFFC4000) // (US1) Base Address +#define AT91C_BASE_PDC_US0 ((AT91PS_PDC) 0xFFFC0100) // (PDC_US0) Base Address +#define AT91C_BASE_US0 ((AT91PS_USART) 0xFFFC0000) // (US0) Base Address +#define AT91C_BASE_PDC_SSC ((AT91PS_PDC) 0xFFFD4100) // (PDC_SSC) Base Address +#define AT91C_BASE_SSC ((AT91PS_SSC) 0xFFFD4000) // (SSC) Base Address +#define AT91C_BASE_TWI ((AT91PS_TWI) 0xFFFB8000) // (TWI) Base Address +#define AT91C_BASE_PWMC_CH3 ((AT91PS_PWMC_CH) 0xFFFCC260) // (PWMC_CH3) Base Address +#define AT91C_BASE_PWMC_CH2 ((AT91PS_PWMC_CH) 0xFFFCC240) // (PWMC_CH2) Base Address +#define AT91C_BASE_PWMC_CH1 ((AT91PS_PWMC_CH) 0xFFFCC220) // (PWMC_CH1) Base Address +#define AT91C_BASE_PWMC_CH0 ((AT91PS_PWMC_CH) 0xFFFCC200) // (PWMC_CH0) Base Address +#define AT91C_BASE_PWMC ((AT91PS_PWMC) 0xFFFCC000) // (PWMC) Base Address +#define AT91C_BASE_UDP ((AT91PS_UDP) 0xFFFB0000) // (UDP) Base Address +#define AT91C_BASE_TC0 ((AT91PS_TC) 0xFFFA0000) // (TC0) Base Address +#define AT91C_BASE_TC1 ((AT91PS_TC) 0xFFFA0040) // (TC1) Base Address +#define AT91C_BASE_TC2 ((AT91PS_TC) 0xFFFA0080) // (TC2) Base Address +#define AT91C_BASE_TCB ((AT91PS_TCB) 0xFFFA0000) // (TCB) Base Address +#define AT91C_BASE_CAN_MB0 ((AT91PS_CAN_MB) 0xFFFD0200) // (CAN_MB0) Base Address +#define AT91C_BASE_CAN_MB1 ((AT91PS_CAN_MB) 0xFFFD0220) // (CAN_MB1) Base Address +#define AT91C_BASE_CAN_MB2 ((AT91PS_CAN_MB) 0xFFFD0240) // (CAN_MB2) Base Address +#define AT91C_BASE_CAN_MB3 ((AT91PS_CAN_MB) 0xFFFD0260) // (CAN_MB3) Base Address +#define AT91C_BASE_CAN_MB4 ((AT91PS_CAN_MB) 0xFFFD0280) // (CAN_MB4) Base Address +#define AT91C_BASE_CAN_MB5 ((AT91PS_CAN_MB) 0xFFFD02A0) // (CAN_MB5) Base Address +#define AT91C_BASE_CAN_MB6 ((AT91PS_CAN_MB) 0xFFFD02C0) // (CAN_MB6) Base Address +#define AT91C_BASE_CAN_MB7 ((AT91PS_CAN_MB) 0xFFFD02E0) // (CAN_MB7) Base Address +#define AT91C_BASE_CAN ((AT91PS_CAN) 0xFFFD0000) // (CAN) Base Address +#define AT91C_BASE_EMAC ((AT91PS_EMAC) 0xFFFDC000) // (EMAC) Base Address +#define AT91C_BASE_PDC_ADC ((AT91PS_PDC) 0xFFFD8100) // (PDC_ADC) Base Address +#define AT91C_BASE_ADC ((AT91PS_ADC) 0xFFFD8000) // (ADC) Base Address +#define AT91C_BASE_PDC_AES ((AT91PS_PDC) 0xFFFA4100) // (PDC_AES) Base Address +#define AT91C_BASE_AES ((AT91PS_AES) 0xFFFA4000) // (AES) Base Address +#define AT91C_BASE_PDC_TDES ((AT91PS_PDC) 0xFFFA8100) // (PDC_TDES) Base Address +#define AT91C_BASE_TDES ((AT91PS_TDES) 0xFFFA8000) // (TDES) Base Address + +// ***************************************************************************** +// MEMORY MAPPING DEFINITIONS FOR AT91SAM7X256 +// ***************************************************************************** +#define AT91C_ISRAM ((char *) 0x00200000) // Internal SRAM base address +#define AT91C_ISRAM_SIZE ((unsigned int) 0x00010000) // Internal SRAM size in byte (64 Kbyte) +#define AT91C_IFLASH ((char *) 0x00100000) // Internal ROM base address +#define AT91C_IFLASH_SIZE ((unsigned int) 0x00040000) // Internal ROM size in byte (256 Kbyte) + +#define AT91F_AIC_ConfigureIt( irq_id, priority, src_type, newHandler ) \ +{ \ + unsigned int mask ; \ + \ + mask = 0x1 << irq_id; \ + /* Disable the interrupt on the interrupt controller */ \ + AT91C_BASE_AIC->AIC_IDCR = mask ; \ + /* Save the interrupt handler routine pointer and the interrupt priority */ \ + AT91C_BASE_AIC->AIC_SVR[irq_id] = (unsigned int) newHandler ; \ + /* Store the Source Mode Register */ \ + AT91C_BASE_AIC->AIC_SMR[irq_id] = src_type | priority ; \ + /* Clear the interrupt on the interrupt controller */ \ + AT91C_BASE_AIC->AIC_ICCR = mask ; \ +} + + +#endif diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM7_AT91SAM7S/ioat91sam7x256.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM7_AT91SAM7S/ioat91sam7x256.h new file mode 100644 index 0000000..8ea721e --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM7_AT91SAM7S/ioat91sam7x256.h @@ -0,0 +1,4698 @@ +// - ---------------------------------------------------------------------------- +// - ATMEL Microcontroller Software Support - ROUSSET - +// - ---------------------------------------------------------------------------- +// - DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR +// - IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE +// - DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT, +// - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +// - OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +// - EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// - ---------------------------------------------------------------------------- +// - File Name : AT91SAM7X256.h +// - Object : AT91SAM7X256 definitions +// - Generated : AT91 SW Application Group 05/20/2005 (16:22:29) +// - +// - CVS Reference : /AT91SAM7X256.pl/1.11/Tue May 10 12:15:32 2005// +// - CVS Reference : /SYS_SAM7X.pl/1.3/Tue Feb 1 17:01:43 2005// +// - CVS Reference : /MC_SAM7X.pl/1.2/Fri May 20 14:13:04 2005// +// - CVS Reference : /PMC_SAM7X.pl/1.4/Tue Feb 8 13:58:10 2005// +// - CVS Reference : /RSTC_SAM7X.pl/1.1/Tue Feb 1 16:16:26 2005// +// - CVS Reference : /UDP_SAM7X.pl/1.1/Tue May 10 11:35:35 2005// +// - CVS Reference : /PWM_SAM7X.pl/1.1/Tue May 10 11:53:07 2005// +// - CVS Reference : /AIC_6075B.pl/1.3/Fri May 20 14:01:30 2005// +// - CVS Reference : /PIO_6057A.pl/1.2/Thu Feb 3 10:18:28 2005// +// - CVS Reference : /RTTC_6081A.pl/1.2/Tue Nov 9 14:43:58 2004// +// - CVS Reference : /PITC_6079A.pl/1.2/Tue Nov 9 14:43:56 2004// +// - CVS Reference : /WDTC_6080A.pl/1.3/Tue Nov 9 14:44:00 2004// +// - CVS Reference : /VREG_6085B.pl/1.1/Tue Feb 1 16:05:48 2005// +// - CVS Reference : /PDC_6074C.pl/1.2/Thu Feb 3 08:48:54 2005// +// - CVS Reference : /DBGU_6059D.pl/1.1/Mon Jan 31 13:15:32 2005// +// - CVS Reference : /SPI_6088D.pl/1.3/Fri May 20 14:08:59 2005// +// - CVS Reference : /US_6089C.pl/1.1/Mon Jul 12 18:23:26 2004// +// - CVS Reference : /SSC_6078A.pl/1.1/Tue Jul 13 07:45:40 2004// +// - CVS Reference : /TWI_6061A.pl/1.1/Tue Jul 13 07:38:06 2004// +// - CVS Reference : /TC_6082A.pl/1.7/Fri Mar 11 12:52:17 2005// +// - CVS Reference : /CAN_6019B.pl/1.1/Tue Mar 8 12:42:22 2005// +// - CVS Reference : /EMACB_6119A.pl/1.5/Thu Feb 3 15:52:04 2005// +// - CVS Reference : /ADC_6051C.pl/1.1/Fri Oct 17 09:12:38 2003// +// - CVS Reference : /AES_6149A.pl/1.10/Mon Feb 7 09:44:25 2005// +// - CVS Reference : /DES3_6150A.pl/1.1/Mon Jan 17 08:34:31 2005// +// - ---------------------------------------------------------------------------- + +#ifndef AT91SAM7X256_H +#define AT91SAM7X256_H + +typedef volatile unsigned int AT91_REG;// Hardware register definition + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR System Peripherals +// ***************************************************************************** +typedef struct _AT91S_SYS { + AT91_REG AIC_SMR[32]; // Source Mode Register + AT91_REG AIC_SVR[32]; // Source Vector Register + AT91_REG AIC_IVR; // IRQ Vector Register + AT91_REG AIC_FVR; // FIQ Vector Register + AT91_REG AIC_ISR; // Interrupt Status Register + AT91_REG AIC_IPR; // Interrupt Pending Register + AT91_REG AIC_IMR; // Interrupt Mask Register + AT91_REG AIC_CISR; // Core Interrupt Status Register + AT91_REG Reserved0[2]; // + AT91_REG AIC_IECR; // Interrupt Enable Command Register + AT91_REG AIC_IDCR; // Interrupt Disable Command Register + AT91_REG AIC_ICCR; // Interrupt Clear Command Register + AT91_REG AIC_ISCR; // Interrupt Set Command Register + AT91_REG AIC_EOICR; // End of Interrupt Command Register + AT91_REG AIC_SPU; // Spurious Vector Register + AT91_REG AIC_DCR; // Debug Control Register (Protect) + AT91_REG Reserved1[1]; // + AT91_REG AIC_FFER; // Fast Forcing Enable Register + AT91_REG AIC_FFDR; // Fast Forcing Disable Register + AT91_REG AIC_FFSR; // Fast Forcing Status Register + AT91_REG Reserved2[45]; // + AT91_REG DBGU_CR; // Control Register + AT91_REG DBGU_MR; // Mode Register + AT91_REG DBGU_IER; // Interrupt Enable Register + AT91_REG DBGU_IDR; // Interrupt Disable Register + AT91_REG DBGU_IMR; // Interrupt Mask Register + AT91_REG DBGU_CSR; // Channel Status Register + AT91_REG DBGU_RHR; // Receiver Holding Register + AT91_REG DBGU_THR; // Transmitter Holding Register + AT91_REG DBGU_BRGR; // Baud Rate Generator Register + AT91_REG Reserved3[7]; // + AT91_REG DBGU_CIDR; // Chip ID Register + AT91_REG DBGU_EXID; // Chip ID Extension Register + AT91_REG DBGU_FNTR; // Force NTRST Register + AT91_REG Reserved4[45]; // + AT91_REG DBGU_RPR; // Receive Pointer Register + AT91_REG DBGU_RCR; // Receive Counter Register + AT91_REG DBGU_TPR; // Transmit Pointer Register + AT91_REG DBGU_TCR; // Transmit Counter Register + AT91_REG DBGU_RNPR; // Receive Next Pointer Register + AT91_REG DBGU_RNCR; // Receive Next Counter Register + AT91_REG DBGU_TNPR; // Transmit Next Pointer Register + AT91_REG DBGU_TNCR; // Transmit Next Counter Register + AT91_REG DBGU_PTCR; // PDC Transfer Control Register + AT91_REG DBGU_PTSR; // PDC Transfer Status Register + AT91_REG Reserved5[54]; // + AT91_REG PIOA_PER; // PIO Enable Register + AT91_REG PIOA_PDR; // PIO Disable Register + AT91_REG PIOA_PSR; // PIO Status Register + AT91_REG Reserved6[1]; // + AT91_REG PIOA_OER; // Output Enable Register + AT91_REG PIOA_ODR; // Output Disable Registerr + AT91_REG PIOA_OSR; // Output Status Register + AT91_REG Reserved7[1]; // + AT91_REG PIOA_IFER; // Input Filter Enable Register + AT91_REG PIOA_IFDR; // Input Filter Disable Register + AT91_REG PIOA_IFSR; // Input Filter Status Register + AT91_REG Reserved8[1]; // + AT91_REG PIOA_SODR; // Set Output Data Register + AT91_REG PIOA_CODR; // Clear Output Data Register + AT91_REG PIOA_ODSR; // Output Data Status Register + AT91_REG PIOA_PDSR; // Pin Data Status Register + AT91_REG PIOA_IER; // Interrupt Enable Register + AT91_REG PIOA_IDR; // Interrupt Disable Register + AT91_REG PIOA_IMR; // Interrupt Mask Register + AT91_REG PIOA_ISR; // Interrupt Status Register + AT91_REG PIOA_MDER; // Multi-driver Enable Register + AT91_REG PIOA_MDDR; // Multi-driver Disable Register + AT91_REG PIOA_MDSR; // Multi-driver Status Register + AT91_REG Reserved9[1]; // + AT91_REG PIOA_PPUDR; // Pull-up Disable Register + AT91_REG PIOA_PPUER; // Pull-up Enable Register + AT91_REG PIOA_PPUSR; // Pull-up Status Register + AT91_REG Reserved10[1]; // + AT91_REG PIOA_ASR; // Select A Register + AT91_REG PIOA_BSR; // Select B Register + AT91_REG PIOA_ABSR; // AB Select Status Register + AT91_REG Reserved11[9]; // + AT91_REG PIOA_OWER; // Output Write Enable Register + AT91_REG PIOA_OWDR; // Output Write Disable Register + AT91_REG PIOA_OWSR; // Output Write Status Register + AT91_REG Reserved12[85]; // + AT91_REG PIOB_PER; // PIO Enable Register + AT91_REG PIOB_PDR; // PIO Disable Register + AT91_REG PIOB_PSR; // PIO Status Register + AT91_REG Reserved13[1]; // + AT91_REG PIOB_OER; // Output Enable Register + AT91_REG PIOB_ODR; // Output Disable Registerr + AT91_REG PIOB_OSR; // Output Status Register + AT91_REG Reserved14[1]; // + AT91_REG PIOB_IFER; // Input Filter Enable Register + AT91_REG PIOB_IFDR; // Input Filter Disable Register + AT91_REG PIOB_IFSR; // Input Filter Status Register + AT91_REG Reserved15[1]; // + AT91_REG PIOB_SODR; // Set Output Data Register + AT91_REG PIOB_CODR; // Clear Output Data Register + AT91_REG PIOB_ODSR; // Output Data Status Register + AT91_REG PIOB_PDSR; // Pin Data Status Register + AT91_REG PIOB_IER; // Interrupt Enable Register + AT91_REG PIOB_IDR; // Interrupt Disable Register + AT91_REG PIOB_IMR; // Interrupt Mask Register + AT91_REG PIOB_ISR; // Interrupt Status Register + AT91_REG PIOB_MDER; // Multi-driver Enable Register + AT91_REG PIOB_MDDR; // Multi-driver Disable Register + AT91_REG PIOB_MDSR; // Multi-driver Status Register + AT91_REG Reserved16[1]; // + AT91_REG PIOB_PPUDR; // Pull-up Disable Register + AT91_REG PIOB_PPUER; // Pull-up Enable Register + AT91_REG PIOB_PPUSR; // Pull-up Status Register + AT91_REG Reserved17[1]; // + AT91_REG PIOB_ASR; // Select A Register + AT91_REG PIOB_BSR; // Select B Register + AT91_REG PIOB_ABSR; // AB Select Status Register + AT91_REG Reserved18[9]; // + AT91_REG PIOB_OWER; // Output Write Enable Register + AT91_REG PIOB_OWDR; // Output Write Disable Register + AT91_REG PIOB_OWSR; // Output Write Status Register + AT91_REG Reserved19[341]; // + AT91_REG PMC_SCER; // System Clock Enable Register + AT91_REG PMC_SCDR; // System Clock Disable Register + AT91_REG PMC_SCSR; // System Clock Status Register + AT91_REG Reserved20[1]; // + AT91_REG PMC_PCER; // Peripheral Clock Enable Register + AT91_REG PMC_PCDR; // Peripheral Clock Disable Register + AT91_REG PMC_PCSR; // Peripheral Clock Status Register + AT91_REG Reserved21[1]; // + AT91_REG PMC_MOR; // Main Oscillator Register + AT91_REG PMC_MCFR; // Main Clock Frequency Register + AT91_REG Reserved22[1]; // + AT91_REG PMC_PLLR; // PLL Register + AT91_REG PMC_MCKR; // Master Clock Register + AT91_REG Reserved23[3]; // + AT91_REG PMC_PCKR[4]; // Programmable Clock Register + AT91_REG Reserved24[4]; // + AT91_REG PMC_IER; // Interrupt Enable Register + AT91_REG PMC_IDR; // Interrupt Disable Register + AT91_REG PMC_SR; // Status Register + AT91_REG PMC_IMR; // Interrupt Mask Register + AT91_REG Reserved25[36]; // + AT91_REG RSTC_RCR; // Reset Control Register + AT91_REG RSTC_RSR; // Reset Status Register + AT91_REG RSTC_RMR; // Reset Mode Register + AT91_REG Reserved26[5]; // + AT91_REG RTTC_RTMR; // Real-time Mode Register + AT91_REG RTTC_RTAR; // Real-time Alarm Register + AT91_REG RTTC_RTVR; // Real-time Value Register + AT91_REG RTTC_RTSR; // Real-time Status Register + AT91_REG PITC_PIMR; // Period Interval Mode Register + AT91_REG PITC_PISR; // Period Interval Status Register + AT91_REG PITC_PIVR; // Period Interval Value Register + AT91_REG PITC_PIIR; // Period Interval Image Register + AT91_REG WDTC_WDCR; // Watchdog Control Register + AT91_REG WDTC_WDMR; // Watchdog Mode Register + AT91_REG WDTC_WDSR; // Watchdog Status Register + AT91_REG Reserved27[5]; // + AT91_REG VREG_MR; // Voltage Regulator Mode Register +} AT91S_SYS, *AT91PS_SYS; + + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Advanced Interrupt Controller +// ***************************************************************************** +typedef struct _AT91S_AIC { + AT91_REG AIC_SMR[32]; // Source Mode Register + AT91_REG AIC_SVR[32]; // Source Vector Register + AT91_REG AIC_IVR; // IRQ Vector Register + AT91_REG AIC_FVR; // FIQ Vector Register + AT91_REG AIC_ISR; // Interrupt Status Register + AT91_REG AIC_IPR; // Interrupt Pending Register + AT91_REG AIC_IMR; // Interrupt Mask Register + AT91_REG AIC_CISR; // Core Interrupt Status Register + AT91_REG Reserved0[2]; // + AT91_REG AIC_IECR; // Interrupt Enable Command Register + AT91_REG AIC_IDCR; // Interrupt Disable Command Register + AT91_REG AIC_ICCR; // Interrupt Clear Command Register + AT91_REG AIC_ISCR; // Interrupt Set Command Register + AT91_REG AIC_EOICR; // End of Interrupt Command Register + AT91_REG AIC_SPU; // Spurious Vector Register + AT91_REG AIC_DCR; // Debug Control Register (Protect) + AT91_REG Reserved1[1]; // + AT91_REG AIC_FFER; // Fast Forcing Enable Register + AT91_REG AIC_FFDR; // Fast Forcing Disable Register + AT91_REG AIC_FFSR; // Fast Forcing Status Register +} AT91S_AIC, *AT91PS_AIC; + +// -------- AIC_SMR : (AIC Offset: 0x0) Control Register -------- +#define AT91C_AIC_PRIOR ((unsigned int) 0x7 << 0) // (AIC) Priority Level +#define AT91C_AIC_PRIOR_LOWEST ((unsigned int) 0x0) // (AIC) Lowest priority level +#define AT91C_AIC_PRIOR_HIGHEST ((unsigned int) 0x7) // (AIC) Highest priority level +#define AT91C_AIC_SRCTYPE ((unsigned int) 0x3 << 5) // (AIC) Interrupt Source Type +#define AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL ((unsigned int) 0x0 << 5) // (AIC) Internal Sources Code Label High-level Sensitive +#define AT91C_AIC_SRCTYPE_EXT_LOW_LEVEL ((unsigned int) 0x0 << 5) // (AIC) External Sources Code Label Low-level Sensitive +#define AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE ((unsigned int) 0x1 << 5) // (AIC) Internal Sources Code Label Positive Edge triggered +#define AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE ((unsigned int) 0x1 << 5) // (AIC) External Sources Code Label Negative Edge triggered +#define AT91C_AIC_SRCTYPE_HIGH_LEVEL ((unsigned int) 0x2 << 5) // (AIC) Internal Or External Sources Code Label High-level Sensitive +#define AT91C_AIC_SRCTYPE_POSITIVE_EDGE ((unsigned int) 0x3 << 5) // (AIC) Internal Or External Sources Code Label Positive Edge triggered +// -------- AIC_CISR : (AIC Offset: 0x114) AIC Core Interrupt Status Register -------- +#define AT91C_AIC_NFIQ ((unsigned int) 0x1 << 0) // (AIC) NFIQ Status +#define AT91C_AIC_NIRQ ((unsigned int) 0x1 << 1) // (AIC) NIRQ Status +// -------- AIC_DCR : (AIC Offset: 0x138) AIC Debug Control Register (Protect) -------- +#define AT91C_AIC_DCR_PROT ((unsigned int) 0x1 << 0) // (AIC) Protection Mode +#define AT91C_AIC_DCR_GMSK ((unsigned int) 0x1 << 1) // (AIC) General Mask + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Peripheral DMA Controller +// ***************************************************************************** +typedef struct _AT91S_PDC { + AT91_REG PDC_RPR; // Receive Pointer Register + AT91_REG PDC_RCR; // Receive Counter Register + AT91_REG PDC_TPR; // Transmit Pointer Register + AT91_REG PDC_TCR; // Transmit Counter Register + AT91_REG PDC_RNPR; // Receive Next Pointer Register + AT91_REG PDC_RNCR; // Receive Next Counter Register + AT91_REG PDC_TNPR; // Transmit Next Pointer Register + AT91_REG PDC_TNCR; // Transmit Next Counter Register + AT91_REG PDC_PTCR; // PDC Transfer Control Register + AT91_REG PDC_PTSR; // PDC Transfer Status Register +} AT91S_PDC, *AT91PS_PDC; + +// -------- PDC_PTCR : (PDC Offset: 0x20) PDC Transfer Control Register -------- +#define AT91C_PDC_RXTEN ((unsigned int) 0x1 << 0) // (PDC) Receiver Transfer Enable +#define AT91C_PDC_RXTDIS ((unsigned int) 0x1 << 1) // (PDC) Receiver Transfer Disable +#define AT91C_PDC_TXTEN ((unsigned int) 0x1 << 8) // (PDC) Transmitter Transfer Enable +#define AT91C_PDC_TXTDIS ((unsigned int) 0x1 << 9) // (PDC) Transmitter Transfer Disable +// -------- PDC_PTSR : (PDC Offset: 0x24) PDC Transfer Status Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Debug Unit +// ***************************************************************************** +typedef struct _AT91S_DBGU { + AT91_REG DBGU_CR; // Control Register + AT91_REG DBGU_MR; // Mode Register + AT91_REG DBGU_IER; // Interrupt Enable Register + AT91_REG DBGU_IDR; // Interrupt Disable Register + AT91_REG DBGU_IMR; // Interrupt Mask Register + AT91_REG DBGU_CSR; // Channel Status Register + AT91_REG DBGU_RHR; // Receiver Holding Register + AT91_REG DBGU_THR; // Transmitter Holding Register + AT91_REG DBGU_BRGR; // Baud Rate Generator Register + AT91_REG Reserved0[7]; // + AT91_REG DBGU_CIDR; // Chip ID Register + AT91_REG DBGU_EXID; // Chip ID Extension Register + AT91_REG DBGU_FNTR; // Force NTRST Register + AT91_REG Reserved1[45]; // + AT91_REG DBGU_RPR; // Receive Pointer Register + AT91_REG DBGU_RCR; // Receive Counter Register + AT91_REG DBGU_TPR; // Transmit Pointer Register + AT91_REG DBGU_TCR; // Transmit Counter Register + AT91_REG DBGU_RNPR; // Receive Next Pointer Register + AT91_REG DBGU_RNCR; // Receive Next Counter Register + AT91_REG DBGU_TNPR; // Transmit Next Pointer Register + AT91_REG DBGU_TNCR; // Transmit Next Counter Register + AT91_REG DBGU_PTCR; // PDC Transfer Control Register + AT91_REG DBGU_PTSR; // PDC Transfer Status Register +} AT91S_DBGU, *AT91PS_DBGU; + +// -------- DBGU_CR : (DBGU Offset: 0x0) Debug Unit Control Register -------- +#define AT91C_US_RSTRX ((unsigned int) 0x1 << 2) // (DBGU) Reset Receiver +#define AT91C_US_RSTTX ((unsigned int) 0x1 << 3) // (DBGU) Reset Transmitter +#define AT91C_US_RXEN ((unsigned int) 0x1 << 4) // (DBGU) Receiver Enable +#define AT91C_US_RXDIS ((unsigned int) 0x1 << 5) // (DBGU) Receiver Disable +#define AT91C_US_TXEN ((unsigned int) 0x1 << 6) // (DBGU) Transmitter Enable +#define AT91C_US_TXDIS ((unsigned int) 0x1 << 7) // (DBGU) Transmitter Disable +#define AT91C_US_RSTSTA ((unsigned int) 0x1 << 8) // (DBGU) Reset Status Bits +// -------- DBGU_MR : (DBGU Offset: 0x4) Debug Unit Mode Register -------- +#define AT91C_US_PAR ((unsigned int) 0x7 << 9) // (DBGU) Parity type +#define AT91C_US_PAR_EVEN ((unsigned int) 0x0 << 9) // (DBGU) Even Parity +#define AT91C_US_PAR_ODD ((unsigned int) 0x1 << 9) // (DBGU) Odd Parity +#define AT91C_US_PAR_SPACE ((unsigned int) 0x2 << 9) // (DBGU) Parity forced to 0 (Space) +#define AT91C_US_PAR_MARK ((unsigned int) 0x3 << 9) // (DBGU) Parity forced to 1 (Mark) +#define AT91C_US_PAR_NONE ((unsigned int) 0x4 << 9) // (DBGU) No Parity +#define AT91C_US_PAR_MULTI_DROP ((unsigned int) 0x6 << 9) // (DBGU) Multi-drop mode +#define AT91C_US_CHMODE ((unsigned int) 0x3 << 14) // (DBGU) Channel Mode +#define AT91C_US_CHMODE_NORMAL ((unsigned int) 0x0 << 14) // (DBGU) Normal Mode: The USART channel operates as an RX/TX USART. +#define AT91C_US_CHMODE_AUTO ((unsigned int) 0x1 << 14) // (DBGU) Automatic Echo: Receiver Data Input is connected to the TXD pin. +#define AT91C_US_CHMODE_LOCAL ((unsigned int) 0x2 << 14) // (DBGU) Local Loopback: Transmitter Output Signal is connected to Receiver Input Signal. +#define AT91C_US_CHMODE_REMOTE ((unsigned int) 0x3 << 14) // (DBGU) Remote Loopback: RXD pin is internally connected to TXD pin. +// -------- DBGU_IER : (DBGU Offset: 0x8) Debug Unit Interrupt Enable Register -------- +#define AT91C_US_RXRDY ((unsigned int) 0x1 << 0) // (DBGU) RXRDY Interrupt +#define AT91C_US_TXRDY ((unsigned int) 0x1 << 1) // (DBGU) TXRDY Interrupt +#define AT91C_US_ENDRX ((unsigned int) 0x1 << 3) // (DBGU) End of Receive Transfer Interrupt +#define AT91C_US_ENDTX ((unsigned int) 0x1 << 4) // (DBGU) End of Transmit Interrupt +#define AT91C_US_OVRE ((unsigned int) 0x1 << 5) // (DBGU) Overrun Interrupt +#define AT91C_US_FRAME ((unsigned int) 0x1 << 6) // (DBGU) Framing Error Interrupt +#define AT91C_US_PARE ((unsigned int) 0x1 << 7) // (DBGU) Parity Error Interrupt +#define AT91C_US_TXEMPTY ((unsigned int) 0x1 << 9) // (DBGU) TXEMPTY Interrupt +#define AT91C_US_TXBUFE ((unsigned int) 0x1 << 11) // (DBGU) TXBUFE Interrupt +#define AT91C_US_RXBUFF ((unsigned int) 0x1 << 12) // (DBGU) RXBUFF Interrupt +#define AT91C_US_COMM_TX ((unsigned int) 0x1 << 30) // (DBGU) COMM_TX Interrupt +#define AT91C_US_COMM_RX ((unsigned int) 0x1 << 31) // (DBGU) COMM_RX Interrupt +// -------- DBGU_IDR : (DBGU Offset: 0xc) Debug Unit Interrupt Disable Register -------- +// -------- DBGU_IMR : (DBGU Offset: 0x10) Debug Unit Interrupt Mask Register -------- +// -------- DBGU_CSR : (DBGU Offset: 0x14) Debug Unit Channel Status Register -------- +// -------- DBGU_FNTR : (DBGU Offset: 0x48) Debug Unit FORCE_NTRST Register -------- +#define AT91C_US_FORCE_NTRST ((unsigned int) 0x1 << 0) // (DBGU) Force NTRST in JTAG + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Parallel Input Output Controler +// ***************************************************************************** +typedef struct _AT91S_PIO { + AT91_REG PIO_PER; // PIO Enable Register + AT91_REG PIO_PDR; // PIO Disable Register + AT91_REG PIO_PSR; // PIO Status Register + AT91_REG Reserved0[1]; // + AT91_REG PIO_OER; // Output Enable Register + AT91_REG PIO_ODR; // Output Disable Registerr + AT91_REG PIO_OSR; // Output Status Register + AT91_REG Reserved1[1]; // + AT91_REG PIO_IFER; // Input Filter Enable Register + AT91_REG PIO_IFDR; // Input Filter Disable Register + AT91_REG PIO_IFSR; // Input Filter Status Register + AT91_REG Reserved2[1]; // + AT91_REG PIO_SODR; // Set Output Data Register + AT91_REG PIO_CODR; // Clear Output Data Register + AT91_REG PIO_ODSR; // Output Data Status Register + AT91_REG PIO_PDSR; // Pin Data Status Register + AT91_REG PIO_IER; // Interrupt Enable Register + AT91_REG PIO_IDR; // Interrupt Disable Register + AT91_REG PIO_IMR; // Interrupt Mask Register + AT91_REG PIO_ISR; // Interrupt Status Register + AT91_REG PIO_MDER; // Multi-driver Enable Register + AT91_REG PIO_MDDR; // Multi-driver Disable Register + AT91_REG PIO_MDSR; // Multi-driver Status Register + AT91_REG Reserved3[1]; // + AT91_REG PIO_PPUDR; // Pull-up Disable Register + AT91_REG PIO_PPUER; // Pull-up Enable Register + AT91_REG PIO_PPUSR; // Pull-up Status Register + AT91_REG Reserved4[1]; // + AT91_REG PIO_ASR; // Select A Register + AT91_REG PIO_BSR; // Select B Register + AT91_REG PIO_ABSR; // AB Select Status Register + AT91_REG Reserved5[9]; // + AT91_REG PIO_OWER; // Output Write Enable Register + AT91_REG PIO_OWDR; // Output Write Disable Register + AT91_REG PIO_OWSR; // Output Write Status Register +} AT91S_PIO, *AT91PS_PIO; + + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Clock Generator Controler +// ***************************************************************************** +typedef struct _AT91S_CKGR { + AT91_REG CKGR_MOR; // Main Oscillator Register + AT91_REG CKGR_MCFR; // Main Clock Frequency Register + AT91_REG Reserved0[1]; // + AT91_REG CKGR_PLLR; // PLL Register +} AT91S_CKGR, *AT91PS_CKGR; + +// -------- CKGR_MOR : (CKGR Offset: 0x0) Main Oscillator Register -------- +#define AT91C_CKGR_MOSCEN ((unsigned int) 0x1 << 0) // (CKGR) Main Oscillator Enable +#define AT91C_CKGR_OSCBYPASS ((unsigned int) 0x1 << 1) // (CKGR) Main Oscillator Bypass +#define AT91C_CKGR_OSCOUNT ((unsigned int) 0xFF << 8) // (CKGR) Main Oscillator Start-up Time +// -------- CKGR_MCFR : (CKGR Offset: 0x4) Main Clock Frequency Register -------- +#define AT91C_CKGR_MAINF ((unsigned int) 0xFFFF << 0) // (CKGR) Main Clock Frequency +#define AT91C_CKGR_MAINRDY ((unsigned int) 0x1 << 16) // (CKGR) Main Clock Ready +// -------- CKGR_PLLR : (CKGR Offset: 0xc) PLL B Register -------- +#define AT91C_CKGR_DIV ((unsigned int) 0xFF << 0) // (CKGR) Divider Selected +#define AT91C_CKGR_DIV_0 ((unsigned int) 0x0) // (CKGR) Divider output is 0 +#define AT91C_CKGR_DIV_BYPASS ((unsigned int) 0x1) // (CKGR) Divider is bypassed +#define AT91C_CKGR_PLLCOUNT ((unsigned int) 0x3F << 8) // (CKGR) PLL Counter +#define AT91C_CKGR_OUT ((unsigned int) 0x3 << 14) // (CKGR) PLL Output Frequency Range +#define AT91C_CKGR_OUT_0 ((unsigned int) 0x0 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_OUT_1 ((unsigned int) 0x1 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_OUT_2 ((unsigned int) 0x2 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_OUT_3 ((unsigned int) 0x3 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_MUL ((unsigned int) 0x7FF << 16) // (CKGR) PLL Multiplier +#define AT91C_CKGR_USBDIV ((unsigned int) 0x3 << 28) // (CKGR) Divider for USB Clocks +#define AT91C_CKGR_USBDIV_0 ((unsigned int) 0x0 << 28) // (CKGR) Divider output is PLL clock output +#define AT91C_CKGR_USBDIV_1 ((unsigned int) 0x1 << 28) // (CKGR) Divider output is PLL clock output divided by 2 +#define AT91C_CKGR_USBDIV_2 ((unsigned int) 0x2 << 28) // (CKGR) Divider output is PLL clock output divided by 4 + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Power Management Controler +// ***************************************************************************** +typedef struct _AT91S_PMC { + AT91_REG PMC_SCER; // System Clock Enable Register + AT91_REG PMC_SCDR; // System Clock Disable Register + AT91_REG PMC_SCSR; // System Clock Status Register + AT91_REG Reserved0[1]; // + AT91_REG PMC_PCER; // Peripheral Clock Enable Register + AT91_REG PMC_PCDR; // Peripheral Clock Disable Register + AT91_REG PMC_PCSR; // Peripheral Clock Status Register + AT91_REG Reserved1[1]; // + AT91_REG PMC_MOR; // Main Oscillator Register + AT91_REG PMC_MCFR; // Main Clock Frequency Register + AT91_REG Reserved2[1]; // + AT91_REG PMC_PLLR; // PLL Register + AT91_REG PMC_MCKR; // Master Clock Register + AT91_REG Reserved3[3]; // + AT91_REG PMC_PCKR[4]; // Programmable Clock Register + AT91_REG Reserved4[4]; // + AT91_REG PMC_IER; // Interrupt Enable Register + AT91_REG PMC_IDR; // Interrupt Disable Register + AT91_REG PMC_SR; // Status Register + AT91_REG PMC_IMR; // Interrupt Mask Register +} AT91S_PMC, *AT91PS_PMC; + +// -------- PMC_SCER : (PMC Offset: 0x0) System Clock Enable Register -------- +#define AT91C_PMC_PCK ((unsigned int) 0x1 << 0) // (PMC) Processor Clock +#define AT91C_PMC_UDP ((unsigned int) 0x1 << 7) // (PMC) USB Device Port Clock +#define AT91C_PMC_PCK0 ((unsigned int) 0x1 << 8) // (PMC) Programmable Clock Output +#define AT91C_PMC_PCK1 ((unsigned int) 0x1 << 9) // (PMC) Programmable Clock Output +#define AT91C_PMC_PCK2 ((unsigned int) 0x1 << 10) // (PMC) Programmable Clock Output +#define AT91C_PMC_PCK3 ((unsigned int) 0x1 << 11) // (PMC) Programmable Clock Output +// -------- PMC_SCDR : (PMC Offset: 0x4) System Clock Disable Register -------- +// -------- PMC_SCSR : (PMC Offset: 0x8) System Clock Status Register -------- +// -------- CKGR_MOR : (PMC Offset: 0x20) Main Oscillator Register -------- +// -------- CKGR_MCFR : (PMC Offset: 0x24) Main Clock Frequency Register -------- +// -------- CKGR_PLLR : (PMC Offset: 0x2c) PLL B Register -------- +// -------- PMC_MCKR : (PMC Offset: 0x30) Master Clock Register -------- +#define AT91C_PMC_CSS ((unsigned int) 0x3 << 0) // (PMC) Programmable Clock Selection +#define AT91C_PMC_CSS_SLOW_CLK ((unsigned int) 0x0) // (PMC) Slow Clock is selected +#define AT91C_PMC_CSS_MAIN_CLK ((unsigned int) 0x1) // (PMC) Main Clock is selected +#define AT91C_PMC_CSS_PLL_CLK ((unsigned int) 0x3) // (PMC) Clock from PLL is selected +#define AT91C_PMC_PRES ((unsigned int) 0x7 << 2) // (PMC) Programmable Clock Prescaler +#define AT91C_PMC_PRES_CLK ((unsigned int) 0x0 << 2) // (PMC) Selected clock +#define AT91C_PMC_PRES_CLK_2 ((unsigned int) 0x1 << 2) // (PMC) Selected clock divided by 2 +#define AT91C_PMC_PRES_CLK_4 ((unsigned int) 0x2 << 2) // (PMC) Selected clock divided by 4 +#define AT91C_PMC_PRES_CLK_8 ((unsigned int) 0x3 << 2) // (PMC) Selected clock divided by 8 +#define AT91C_PMC_PRES_CLK_16 ((unsigned int) 0x4 << 2) // (PMC) Selected clock divided by 16 +#define AT91C_PMC_PRES_CLK_32 ((unsigned int) 0x5 << 2) // (PMC) Selected clock divided by 32 +#define AT91C_PMC_PRES_CLK_64 ((unsigned int) 0x6 << 2) // (PMC) Selected clock divided by 64 +// -------- PMC_PCKR : (PMC Offset: 0x40) Programmable Clock Register -------- +// -------- PMC_IER : (PMC Offset: 0x60) PMC Interrupt Enable Register -------- +#define AT91C_PMC_MOSCS ((unsigned int) 0x1 << 0) // (PMC) MOSC Status/Enable/Disable/Mask +#define AT91C_PMC_LOCK ((unsigned int) 0x1 << 2) // (PMC) PLL Status/Enable/Disable/Mask +#define AT91C_PMC_MCKRDY ((unsigned int) 0x1 << 3) // (PMC) MCK_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK0RDY ((unsigned int) 0x1 << 8) // (PMC) PCK0_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK1RDY ((unsigned int) 0x1 << 9) // (PMC) PCK1_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK2RDY ((unsigned int) 0x1 << 10) // (PMC) PCK2_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK3RDY ((unsigned int) 0x1 << 11) // (PMC) PCK3_RDY Status/Enable/Disable/Mask +// -------- PMC_IDR : (PMC Offset: 0x64) PMC Interrupt Disable Register -------- +// -------- PMC_SR : (PMC Offset: 0x68) PMC Status Register -------- +// -------- PMC_IMR : (PMC Offset: 0x6c) PMC Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Reset Controller Interface +// ***************************************************************************** +typedef struct _AT91S_RSTC { + AT91_REG RSTC_RCR; // Reset Control Register + AT91_REG RSTC_RSR; // Reset Status Register + AT91_REG RSTC_RMR; // Reset Mode Register +} AT91S_RSTC, *AT91PS_RSTC; + +// -------- RSTC_RCR : (RSTC Offset: 0x0) Reset Control Register -------- +#define AT91C_RSTC_PROCRST ((unsigned int) 0x1 << 0) // (RSTC) Processor Reset +#define AT91C_RSTC_PERRST ((unsigned int) 0x1 << 2) // (RSTC) Peripheral Reset +#define AT91C_RSTC_EXTRST ((unsigned int) 0x1 << 3) // (RSTC) External Reset +#define AT91C_RSTC_KEY ((unsigned int) 0xFF << 24) // (RSTC) Password +// -------- RSTC_RSR : (RSTC Offset: 0x4) Reset Status Register -------- +#define AT91C_RSTC_URSTS ((unsigned int) 0x1 << 0) // (RSTC) User Reset Status +#define AT91C_RSTC_BODSTS ((unsigned int) 0x1 << 1) // (RSTC) Brownout Detection Status +#define AT91C_RSTC_RSTTYP ((unsigned int) 0x7 << 8) // (RSTC) Reset Type +#define AT91C_RSTC_RSTTYP_POWERUP ((unsigned int) 0x0 << 8) // (RSTC) Power-up Reset. VDDCORE rising. +#define AT91C_RSTC_RSTTYP_WAKEUP ((unsigned int) 0x1 << 8) // (RSTC) WakeUp Reset. VDDCORE rising. +#define AT91C_RSTC_RSTTYP_WATCHDOG ((unsigned int) 0x2 << 8) // (RSTC) Watchdog Reset. Watchdog overflow occured. +#define AT91C_RSTC_RSTTYP_SOFTWARE ((unsigned int) 0x3 << 8) // (RSTC) Software Reset. Processor reset required by the software. +#define AT91C_RSTC_RSTTYP_USER ((unsigned int) 0x4 << 8) // (RSTC) User Reset. NRST pin detected low. +#define AT91C_RSTC_RSTTYP_BROWNOUT ((unsigned int) 0x5 << 8) // (RSTC) Brownout Reset occured. +#define AT91C_RSTC_NRSTL ((unsigned int) 0x1 << 16) // (RSTC) NRST pin level +#define AT91C_RSTC_SRCMP ((unsigned int) 0x1 << 17) // (RSTC) Software Reset Command in Progress. +// -------- RSTC_RMR : (RSTC Offset: 0x8) Reset Mode Register -------- +#define AT91C_RSTC_URSTEN ((unsigned int) 0x1 << 0) // (RSTC) User Reset Enable +#define AT91C_RSTC_URSTIEN ((unsigned int) 0x1 << 4) // (RSTC) User Reset Interrupt Enable +#define AT91C_RSTC_ERSTL ((unsigned int) 0xF << 8) // (RSTC) User Reset Enable +#define AT91C_RSTC_BODIEN ((unsigned int) 0x1 << 16) // (RSTC) Brownout Detection Interrupt Enable + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Real Time Timer Controller Interface +// ***************************************************************************** +typedef struct _AT91S_RTTC { + AT91_REG RTTC_RTMR; // Real-time Mode Register + AT91_REG RTTC_RTAR; // Real-time Alarm Register + AT91_REG RTTC_RTVR; // Real-time Value Register + AT91_REG RTTC_RTSR; // Real-time Status Register +} AT91S_RTTC, *AT91PS_RTTC; + +// -------- RTTC_RTMR : (RTTC Offset: 0x0) Real-time Mode Register -------- +#define AT91C_RTTC_RTPRES ((unsigned int) 0xFFFF << 0) // (RTTC) Real-time Timer Prescaler Value +#define AT91C_RTTC_ALMIEN ((unsigned int) 0x1 << 16) // (RTTC) Alarm Interrupt Enable +#define AT91C_RTTC_RTTINCIEN ((unsigned int) 0x1 << 17) // (RTTC) Real Time Timer Increment Interrupt Enable +#define AT91C_RTTC_RTTRST ((unsigned int) 0x1 << 18) // (RTTC) Real Time Timer Restart +// -------- RTTC_RTAR : (RTTC Offset: 0x4) Real-time Alarm Register -------- +#define AT91C_RTTC_ALMV ((unsigned int) 0x0 << 0) // (RTTC) Alarm Value +// -------- RTTC_RTVR : (RTTC Offset: 0x8) Current Real-time Value Register -------- +#define AT91C_RTTC_CRTV ((unsigned int) 0x0 << 0) // (RTTC) Current Real-time Value +// -------- RTTC_RTSR : (RTTC Offset: 0xc) Real-time Status Register -------- +#define AT91C_RTTC_ALMS ((unsigned int) 0x1 << 0) // (RTTC) Real-time Alarm Status +#define AT91C_RTTC_RTTINC ((unsigned int) 0x1 << 1) // (RTTC) Real-time Timer Increment + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Periodic Interval Timer Controller Interface +// ***************************************************************************** +typedef struct _AT91S_PITC { + AT91_REG PITC_PIMR; // Period Interval Mode Register + AT91_REG PITC_PISR; // Period Interval Status Register + AT91_REG PITC_PIVR; // Period Interval Value Register + AT91_REG PITC_PIIR; // Period Interval Image Register +} AT91S_PITC, *AT91PS_PITC; + +// -------- PITC_PIMR : (PITC Offset: 0x0) Periodic Interval Mode Register -------- +#define AT91C_PITC_PIV ((unsigned int) 0xFFFFF << 0) // (PITC) Periodic Interval Value +#define AT91C_PITC_PITEN ((unsigned int) 0x1 << 24) // (PITC) Periodic Interval Timer Enabled +#define AT91C_PITC_PITIEN ((unsigned int) 0x1 << 25) // (PITC) Periodic Interval Timer Interrupt Enable +// -------- PITC_PISR : (PITC Offset: 0x4) Periodic Interval Status Register -------- +#define AT91C_PITC_PITS ((unsigned int) 0x1 << 0) // (PITC) Periodic Interval Timer Status +// -------- PITC_PIVR : (PITC Offset: 0x8) Periodic Interval Value Register -------- +#define AT91C_PITC_CPIV ((unsigned int) 0xFFFFF << 0) // (PITC) Current Periodic Interval Value +#define AT91C_PITC_PICNT ((unsigned int) 0xFFF << 20) // (PITC) Periodic Interval Counter +// -------- PITC_PIIR : (PITC Offset: 0xc) Periodic Interval Image Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Watchdog Timer Controller Interface +// ***************************************************************************** +typedef struct _AT91S_WDTC { + AT91_REG WDTC_WDCR; // Watchdog Control Register + AT91_REG WDTC_WDMR; // Watchdog Mode Register + AT91_REG WDTC_WDSR; // Watchdog Status Register +} AT91S_WDTC, *AT91PS_WDTC; + +// -------- WDTC_WDCR : (WDTC Offset: 0x0) Periodic Interval Image Register -------- +#define AT91C_WDTC_WDRSTT ((unsigned int) 0x1 << 0) // (WDTC) Watchdog Restart +#define AT91C_WDTC_KEY ((unsigned int) 0xFF << 24) // (WDTC) Watchdog KEY Password +// -------- WDTC_WDMR : (WDTC Offset: 0x4) Watchdog Mode Register -------- +#define AT91C_WDTC_WDV ((unsigned int) 0xFFF << 0) // (WDTC) Watchdog Timer Restart +#define AT91C_WDTC_WDFIEN ((unsigned int) 0x1 << 12) // (WDTC) Watchdog Fault Interrupt Enable +#define AT91C_WDTC_WDRSTEN ((unsigned int) 0x1 << 13) // (WDTC) Watchdog Reset Enable +#define AT91C_WDTC_WDRPROC ((unsigned int) 0x1 << 14) // (WDTC) Watchdog Timer Restart +#define AT91C_WDTC_WDDIS ((unsigned int) 0x1 << 15) // (WDTC) Watchdog Disable +#define AT91C_WDTC_WDD ((unsigned int) 0xFFF << 16) // (WDTC) Watchdog Delta Value +#define AT91C_WDTC_WDDBGHLT ((unsigned int) 0x1 << 28) // (WDTC) Watchdog Debug Halt +#define AT91C_WDTC_WDIDLEHLT ((unsigned int) 0x1 << 29) // (WDTC) Watchdog Idle Halt +// -------- WDTC_WDSR : (WDTC Offset: 0x8) Watchdog Status Register -------- +#define AT91C_WDTC_WDUNF ((unsigned int) 0x1 << 0) // (WDTC) Watchdog Underflow +#define AT91C_WDTC_WDERR ((unsigned int) 0x1 << 1) // (WDTC) Watchdog Error + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Voltage Regulator Mode Controller Interface +// ***************************************************************************** +typedef struct _AT91S_VREG { + AT91_REG VREG_MR; // Voltage Regulator Mode Register +} AT91S_VREG, *AT91PS_VREG; + +// -------- VREG_MR : (VREG Offset: 0x0) Voltage Regulator Mode Register -------- +#define AT91C_VREG_PSTDBY ((unsigned int) 0x1 << 0) // (VREG) Voltage Regulator Power Standby Mode + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Memory Controller Interface +// ***************************************************************************** +typedef struct _AT91S_MC { + AT91_REG MC_RCR; // MC Remap Control Register + AT91_REG MC_ASR; // MC Abort Status Register + AT91_REG MC_AASR; // MC Abort Address Status Register + AT91_REG Reserved0[21]; // + AT91_REG MC_FMR; // MC Flash Mode Register + AT91_REG MC_FCR; // MC Flash Command Register + AT91_REG MC_FSR; // MC Flash Status Register +} AT91S_MC, *AT91PS_MC; + +// -------- MC_RCR : (MC Offset: 0x0) MC Remap Control Register -------- +#define AT91C_MC_RCB ((unsigned int) 0x1 << 0) // (MC) Remap Command Bit +// -------- MC_ASR : (MC Offset: 0x4) MC Abort Status Register -------- +#define AT91C_MC_UNDADD ((unsigned int) 0x1 << 0) // (MC) Undefined Addess Abort Status +#define AT91C_MC_MISADD ((unsigned int) 0x1 << 1) // (MC) Misaligned Addess Abort Status +#define AT91C_MC_ABTSZ ((unsigned int) 0x3 << 8) // (MC) Abort Size Status +#define AT91C_MC_ABTSZ_BYTE ((unsigned int) 0x0 << 8) // (MC) Byte +#define AT91C_MC_ABTSZ_HWORD ((unsigned int) 0x1 << 8) // (MC) Half-word +#define AT91C_MC_ABTSZ_WORD ((unsigned int) 0x2 << 8) // (MC) Word +#define AT91C_MC_ABTTYP ((unsigned int) 0x3 << 10) // (MC) Abort Type Status +#define AT91C_MC_ABTTYP_DATAR ((unsigned int) 0x0 << 10) // (MC) Data Read +#define AT91C_MC_ABTTYP_DATAW ((unsigned int) 0x1 << 10) // (MC) Data Write +#define AT91C_MC_ABTTYP_FETCH ((unsigned int) 0x2 << 10) // (MC) Code Fetch +#define AT91C_MC_MST0 ((unsigned int) 0x1 << 16) // (MC) Master 0 Abort Source +#define AT91C_MC_MST1 ((unsigned int) 0x1 << 17) // (MC) Master 1 Abort Source +#define AT91C_MC_SVMST0 ((unsigned int) 0x1 << 24) // (MC) Saved Master 0 Abort Source +#define AT91C_MC_SVMST1 ((unsigned int) 0x1 << 25) // (MC) Saved Master 1 Abort Source +// -------- MC_FMR : (MC Offset: 0x60) MC Flash Mode Register -------- +#define AT91C_MC_FRDY ((unsigned int) 0x1 << 0) // (MC) Flash Ready +#define AT91C_MC_LOCKE ((unsigned int) 0x1 << 2) // (MC) Lock Error +#define AT91C_MC_PROGE ((unsigned int) 0x1 << 3) // (MC) Programming Error +#define AT91C_MC_NEBP ((unsigned int) 0x1 << 7) // (MC) No Erase Before Programming +#define AT91C_MC_FWS ((unsigned int) 0x3 << 8) // (MC) Flash Wait State +#define AT91C_MC_FWS_0FWS ((unsigned int) 0x0 << 8) // (MC) 1 cycle for Read, 2 for Write operations +#define AT91C_MC_FWS_1FWS ((unsigned int) 0x1 << 8) // (MC) 2 cycles for Read, 3 for Write operations +#define AT91C_MC_FWS_2FWS ((unsigned int) 0x2 << 8) // (MC) 3 cycles for Read, 4 for Write operations +#define AT91C_MC_FWS_3FWS ((unsigned int) 0x3 << 8) // (MC) 4 cycles for Read, 4 for Write operations +#define AT91C_MC_FMCN ((unsigned int) 0xFF << 16) // (MC) Flash Microsecond Cycle Number +// -------- MC_FCR : (MC Offset: 0x64) MC Flash Command Register -------- +#define AT91C_MC_FCMD ((unsigned int) 0xF << 0) // (MC) Flash Command +#define AT91C_MC_FCMD_START_PROG ((unsigned int) 0x1) // (MC) Starts the programming of th epage specified by PAGEN. +#define AT91C_MC_FCMD_LOCK ((unsigned int) 0x2) // (MC) Starts a lock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. +#define AT91C_MC_FCMD_PROG_AND_LOCK ((unsigned int) 0x3) // (MC) The lock sequence automatically happens after the programming sequence is completed. +#define AT91C_MC_FCMD_UNLOCK ((unsigned int) 0x4) // (MC) Starts an unlock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. +#define AT91C_MC_FCMD_ERASE_ALL ((unsigned int) 0x8) // (MC) Starts the erase of the entire flash.If at least a page is locked, the command is cancelled. +#define AT91C_MC_FCMD_SET_GP_NVM ((unsigned int) 0xB) // (MC) Set General Purpose NVM bits. +#define AT91C_MC_FCMD_CLR_GP_NVM ((unsigned int) 0xD) // (MC) Clear General Purpose NVM bits. +#define AT91C_MC_FCMD_SET_SECURITY ((unsigned int) 0xF) // (MC) Set Security Bit. +#define AT91C_MC_PAGEN ((unsigned int) 0x3FF << 8) // (MC) Page Number +#define AT91C_MC_KEY ((unsigned int) 0xFF << 24) // (MC) Writing Protect Key +// -------- MC_FSR : (MC Offset: 0x68) MC Flash Command Register -------- +#define AT91C_MC_SECURITY ((unsigned int) 0x1 << 4) // (MC) Security Bit Status +#define AT91C_MC_GPNVM0 ((unsigned int) 0x1 << 8) // (MC) Sector 0 Lock Status +#define AT91C_MC_GPNVM1 ((unsigned int) 0x1 << 9) // (MC) Sector 1 Lock Status +#define AT91C_MC_GPNVM2 ((unsigned int) 0x1 << 10) // (MC) Sector 2 Lock Status +#define AT91C_MC_GPNVM3 ((unsigned int) 0x1 << 11) // (MC) Sector 3 Lock Status +#define AT91C_MC_GPNVM4 ((unsigned int) 0x1 << 12) // (MC) Sector 4 Lock Status +#define AT91C_MC_GPNVM5 ((unsigned int) 0x1 << 13) // (MC) Sector 5 Lock Status +#define AT91C_MC_GPNVM6 ((unsigned int) 0x1 << 14) // (MC) Sector 6 Lock Status +#define AT91C_MC_GPNVM7 ((unsigned int) 0x1 << 15) // (MC) Sector 7 Lock Status +#define AT91C_MC_LOCKS0 ((unsigned int) 0x1 << 16) // (MC) Sector 0 Lock Status +#define AT91C_MC_LOCKS1 ((unsigned int) 0x1 << 17) // (MC) Sector 1 Lock Status +#define AT91C_MC_LOCKS2 ((unsigned int) 0x1 << 18) // (MC) Sector 2 Lock Status +#define AT91C_MC_LOCKS3 ((unsigned int) 0x1 << 19) // (MC) Sector 3 Lock Status +#define AT91C_MC_LOCKS4 ((unsigned int) 0x1 << 20) // (MC) Sector 4 Lock Status +#define AT91C_MC_LOCKS5 ((unsigned int) 0x1 << 21) // (MC) Sector 5 Lock Status +#define AT91C_MC_LOCKS6 ((unsigned int) 0x1 << 22) // (MC) Sector 6 Lock Status +#define AT91C_MC_LOCKS7 ((unsigned int) 0x1 << 23) // (MC) Sector 7 Lock Status +#define AT91C_MC_LOCKS8 ((unsigned int) 0x1 << 24) // (MC) Sector 8 Lock Status +#define AT91C_MC_LOCKS9 ((unsigned int) 0x1 << 25) // (MC) Sector 9 Lock Status +#define AT91C_MC_LOCKS10 ((unsigned int) 0x1 << 26) // (MC) Sector 10 Lock Status +#define AT91C_MC_LOCKS11 ((unsigned int) 0x1 << 27) // (MC) Sector 11 Lock Status +#define AT91C_MC_LOCKS12 ((unsigned int) 0x1 << 28) // (MC) Sector 12 Lock Status +#define AT91C_MC_LOCKS13 ((unsigned int) 0x1 << 29) // (MC) Sector 13 Lock Status +#define AT91C_MC_LOCKS14 ((unsigned int) 0x1 << 30) // (MC) Sector 14 Lock Status +#define AT91C_MC_LOCKS15 ((unsigned int) 0x1 << 31) // (MC) Sector 15 Lock Status + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Serial Parallel Interface +// ***************************************************************************** +typedef struct _AT91S_SPI { + AT91_REG SPI_CR; // Control Register + AT91_REG SPI_MR; // Mode Register + AT91_REG SPI_RDR; // Receive Data Register + AT91_REG SPI_TDR; // Transmit Data Register + AT91_REG SPI_SR; // Status Register + AT91_REG SPI_IER; // Interrupt Enable Register + AT91_REG SPI_IDR; // Interrupt Disable Register + AT91_REG SPI_IMR; // Interrupt Mask Register + AT91_REG Reserved0[4]; // + AT91_REG SPI_CSR[4]; // Chip Select Register + AT91_REG Reserved1[48]; // + AT91_REG SPI_RPR; // Receive Pointer Register + AT91_REG SPI_RCR; // Receive Counter Register + AT91_REG SPI_TPR; // Transmit Pointer Register + AT91_REG SPI_TCR; // Transmit Counter Register + AT91_REG SPI_RNPR; // Receive Next Pointer Register + AT91_REG SPI_RNCR; // Receive Next Counter Register + AT91_REG SPI_TNPR; // Transmit Next Pointer Register + AT91_REG SPI_TNCR; // Transmit Next Counter Register + AT91_REG SPI_PTCR; // PDC Transfer Control Register + AT91_REG SPI_PTSR; // PDC Transfer Status Register +} AT91S_SPI, *AT91PS_SPI; + +// -------- SPI_CR : (SPI Offset: 0x0) SPI Control Register -------- +#define AT91C_SPI_SPIEN ((unsigned int) 0x1 << 0) // (SPI) SPI Enable +#define AT91C_SPI_SPIDIS ((unsigned int) 0x1 << 1) // (SPI) SPI Disable +#define AT91C_SPI_SWRST ((unsigned int) 0x1 << 7) // (SPI) SPI Software reset +#define AT91C_SPI_LASTXFER ((unsigned int) 0x1 << 24) // (SPI) SPI Last Transfer +// -------- SPI_MR : (SPI Offset: 0x4) SPI Mode Register -------- +#define AT91C_SPI_MSTR ((unsigned int) 0x1 << 0) // (SPI) Master/Slave Mode +#define AT91C_SPI_PS ((unsigned int) 0x1 << 1) // (SPI) Peripheral Select +#define AT91C_SPI_PS_FIXED ((unsigned int) 0x0 << 1) // (SPI) Fixed Peripheral Select +#define AT91C_SPI_PS_VARIABLE ((unsigned int) 0x1 << 1) // (SPI) Variable Peripheral Select +#define AT91C_SPI_PCSDEC ((unsigned int) 0x1 << 2) // (SPI) Chip Select Decode +#define AT91C_SPI_FDIV ((unsigned int) 0x1 << 3) // (SPI) Clock Selection +#define AT91C_SPI_MODFDIS ((unsigned int) 0x1 << 4) // (SPI) Mode Fault Detection +#define AT91C_SPI_LLB ((unsigned int) 0x1 << 7) // (SPI) Clock Selection +#define AT91C_SPI_PCS ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select +#define AT91C_SPI_DLYBCS ((unsigned int) 0xFF << 24) // (SPI) Delay Between Chip Selects +// -------- SPI_RDR : (SPI Offset: 0x8) Receive Data Register -------- +#define AT91C_SPI_RD ((unsigned int) 0xFFFF << 0) // (SPI) Receive Data +#define AT91C_SPI_RPCS ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select Status +// -------- SPI_TDR : (SPI Offset: 0xc) Transmit Data Register -------- +#define AT91C_SPI_TD ((unsigned int) 0xFFFF << 0) // (SPI) Transmit Data +#define AT91C_SPI_TPCS ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select Status +// -------- SPI_SR : (SPI Offset: 0x10) Status Register -------- +#define AT91C_SPI_RDRF ((unsigned int) 0x1 << 0) // (SPI) Receive Data Register Full +#define AT91C_SPI_TDRE ((unsigned int) 0x1 << 1) // (SPI) Transmit Data Register Empty +#define AT91C_SPI_MODF ((unsigned int) 0x1 << 2) // (SPI) Mode Fault Error +#define AT91C_SPI_OVRES ((unsigned int) 0x1 << 3) // (SPI) Overrun Error Status +#define AT91C_SPI_ENDRX ((unsigned int) 0x1 << 4) // (SPI) End of Receiver Transfer +#define AT91C_SPI_ENDTX ((unsigned int) 0x1 << 5) // (SPI) End of Receiver Transfer +#define AT91C_SPI_RXBUFF ((unsigned int) 0x1 << 6) // (SPI) RXBUFF Interrupt +#define AT91C_SPI_TXBUFE ((unsigned int) 0x1 << 7) // (SPI) TXBUFE Interrupt +#define AT91C_SPI_NSSR ((unsigned int) 0x1 << 8) // (SPI) NSSR Interrupt +#define AT91C_SPI_TXEMPTY ((unsigned int) 0x1 << 9) // (SPI) TXEMPTY Interrupt +#define AT91C_SPI_SPIENS ((unsigned int) 0x1 << 16) // (SPI) Enable Status +// -------- SPI_IER : (SPI Offset: 0x14) Interrupt Enable Register -------- +// -------- SPI_IDR : (SPI Offset: 0x18) Interrupt Disable Register -------- +// -------- SPI_IMR : (SPI Offset: 0x1c) Interrupt Mask Register -------- +// -------- SPI_CSR : (SPI Offset: 0x30) Chip Select Register -------- +#define AT91C_SPI_CPOL ((unsigned int) 0x1 << 0) // (SPI) Clock Polarity +#define AT91C_SPI_NCPHA ((unsigned int) 0x1 << 1) // (SPI) Clock Phase +#define AT91C_SPI_CSAAT ((unsigned int) 0x1 << 3) // (SPI) Chip Select Active After Transfer +#define AT91C_SPI_BITS ((unsigned int) 0xF << 4) // (SPI) Bits Per Transfer +#define AT91C_SPI_BITS_8 ((unsigned int) 0x0 << 4) // (SPI) 8 Bits Per transfer +#define AT91C_SPI_BITS_9 ((unsigned int) 0x1 << 4) // (SPI) 9 Bits Per transfer +#define AT91C_SPI_BITS_10 ((unsigned int) 0x2 << 4) // (SPI) 10 Bits Per transfer +#define AT91C_SPI_BITS_11 ((unsigned int) 0x3 << 4) // (SPI) 11 Bits Per transfer +#define AT91C_SPI_BITS_12 ((unsigned int) 0x4 << 4) // (SPI) 12 Bits Per transfer +#define AT91C_SPI_BITS_13 ((unsigned int) 0x5 << 4) // (SPI) 13 Bits Per transfer +#define AT91C_SPI_BITS_14 ((unsigned int) 0x6 << 4) // (SPI) 14 Bits Per transfer +#define AT91C_SPI_BITS_15 ((unsigned int) 0x7 << 4) // (SPI) 15 Bits Per transfer +#define AT91C_SPI_BITS_16 ((unsigned int) 0x8 << 4) // (SPI) 16 Bits Per transfer +#define AT91C_SPI_SCBR ((unsigned int) 0xFF << 8) // (SPI) Serial Clock Baud Rate +#define AT91C_SPI_DLYBS ((unsigned int) 0xFF << 16) // (SPI) Delay Before SPCK +#define AT91C_SPI_DLYBCT ((unsigned int) 0xFF << 24) // (SPI) Delay Between Consecutive Transfers + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Usart +// ***************************************************************************** +typedef struct _AT91S_USART { + AT91_REG US_CR; // Control Register + AT91_REG US_MR; // Mode Register + AT91_REG US_IER; // Interrupt Enable Register + AT91_REG US_IDR; // Interrupt Disable Register + AT91_REG US_IMR; // Interrupt Mask Register + AT91_REG US_CSR; // Channel Status Register + AT91_REG US_RHR; // Receiver Holding Register + AT91_REG US_THR; // Transmitter Holding Register + AT91_REG US_BRGR; // Baud Rate Generator Register + AT91_REG US_RTOR; // Receiver Time-out Register + AT91_REG US_TTGR; // Transmitter Time-guard Register + AT91_REG Reserved0[5]; // + AT91_REG US_FIDI; // FI_DI_Ratio Register + AT91_REG US_NER; // Nb Errors Register + AT91_REG Reserved1[1]; // + AT91_REG US_IF; // IRDA_FILTER Register + AT91_REG Reserved2[44]; // + AT91_REG US_RPR; // Receive Pointer Register + AT91_REG US_RCR; // Receive Counter Register + AT91_REG US_TPR; // Transmit Pointer Register + AT91_REG US_TCR; // Transmit Counter Register + AT91_REG US_RNPR; // Receive Next Pointer Register + AT91_REG US_RNCR; // Receive Next Counter Register + AT91_REG US_TNPR; // Transmit Next Pointer Register + AT91_REG US_TNCR; // Transmit Next Counter Register + AT91_REG US_PTCR; // PDC Transfer Control Register + AT91_REG US_PTSR; // PDC Transfer Status Register +} AT91S_USART, *AT91PS_USART; + +// -------- US_CR : (USART Offset: 0x0) Debug Unit Control Register -------- +#define AT91C_US_STTBRK ((unsigned int) 0x1 << 9) // (USART) Start Break +#define AT91C_US_STPBRK ((unsigned int) 0x1 << 10) // (USART) Stop Break +#define AT91C_US_STTTO ((unsigned int) 0x1 << 11) // (USART) Start Time-out +#define AT91C_US_SENDA ((unsigned int) 0x1 << 12) // (USART) Send Address +#define AT91C_US_RSTIT ((unsigned int) 0x1 << 13) // (USART) Reset Iterations +#define AT91C_US_RSTNACK ((unsigned int) 0x1 << 14) // (USART) Reset Non Acknowledge +#define AT91C_US_RETTO ((unsigned int) 0x1 << 15) // (USART) Rearm Time-out +#define AT91C_US_DTREN ((unsigned int) 0x1 << 16) // (USART) Data Terminal ready Enable +#define AT91C_US_DTRDIS ((unsigned int) 0x1 << 17) // (USART) Data Terminal ready Disable +#define AT91C_US_RTSEN ((unsigned int) 0x1 << 18) // (USART) Request to Send enable +#define AT91C_US_RTSDIS ((unsigned int) 0x1 << 19) // (USART) Request to Send Disable +// -------- US_MR : (USART Offset: 0x4) Debug Unit Mode Register -------- +#define AT91C_US_USMODE ((unsigned int) 0xF << 0) // (USART) Usart mode +#define AT91C_US_USMODE_NORMAL ((unsigned int) 0x0) // (USART) Normal +#define AT91C_US_USMODE_RS485 ((unsigned int) 0x1) // (USART) RS485 +#define AT91C_US_USMODE_HWHSH ((unsigned int) 0x2) // (USART) Hardware Handshaking +#define AT91C_US_USMODE_MODEM ((unsigned int) 0x3) // (USART) Modem +#define AT91C_US_USMODE_ISO7816_0 ((unsigned int) 0x4) // (USART) ISO7816 protocol: T = 0 +#define AT91C_US_USMODE_ISO7816_1 ((unsigned int) 0x6) // (USART) ISO7816 protocol: T = 1 +#define AT91C_US_USMODE_IRDA ((unsigned int) 0x8) // (USART) IrDA +#define AT91C_US_USMODE_SWHSH ((unsigned int) 0xC) // (USART) Software Handshaking +#define AT91C_US_CLKS ((unsigned int) 0x3 << 4) // (USART) Clock Selection (Baud Rate generator Input Clock +#define AT91C_US_CLKS_CLOCK ((unsigned int) 0x0 << 4) // (USART) Clock +#define AT91C_US_CLKS_FDIV1 ((unsigned int) 0x1 << 4) // (USART) fdiv1 +#define AT91C_US_CLKS_SLOW ((unsigned int) 0x2 << 4) // (USART) slow_clock (ARM) +#define AT91C_US_CLKS_EXT ((unsigned int) 0x3 << 4) // (USART) External (SCK) +#define AT91C_US_CHRL ((unsigned int) 0x3 << 6) // (USART) Clock Selection (Baud Rate generator Input Clock +#define AT91C_US_CHRL_5_BITS ((unsigned int) 0x0 << 6) // (USART) Character Length: 5 bits +#define AT91C_US_CHRL_6_BITS ((unsigned int) 0x1 << 6) // (USART) Character Length: 6 bits +#define AT91C_US_CHRL_7_BITS ((unsigned int) 0x2 << 6) // (USART) Character Length: 7 bits +#define AT91C_US_CHRL_8_BITS ((unsigned int) 0x3 << 6) // (USART) Character Length: 8 bits +#define AT91C_US_SYNC ((unsigned int) 0x1 << 8) // (USART) Synchronous Mode Select +#define AT91C_US_NBSTOP ((unsigned int) 0x3 << 12) // (USART) Number of Stop bits +#define AT91C_US_NBSTOP_1_BIT ((unsigned int) 0x0 << 12) // (USART) 1 stop bit +#define AT91C_US_NBSTOP_15_BIT ((unsigned int) 0x1 << 12) // (USART) Asynchronous (SYNC=0) 2 stop bits Synchronous (SYNC=1) 2 stop bits +#define AT91C_US_NBSTOP_2_BIT ((unsigned int) 0x2 << 12) // (USART) 2 stop bits +#define AT91C_US_MSBF ((unsigned int) 0x1 << 16) // (USART) Bit Order +#define AT91C_US_MODE9 ((unsigned int) 0x1 << 17) // (USART) 9-bit Character length +#define AT91C_US_CKLO ((unsigned int) 0x1 << 18) // (USART) Clock Output Select +#define AT91C_US_OVER ((unsigned int) 0x1 << 19) // (USART) Over Sampling Mode +#define AT91C_US_INACK ((unsigned int) 0x1 << 20) // (USART) Inhibit Non Acknowledge +#define AT91C_US_DSNACK ((unsigned int) 0x1 << 21) // (USART) Disable Successive NACK +#define AT91C_US_MAX_ITER ((unsigned int) 0x1 << 24) // (USART) Number of Repetitions +#define AT91C_US_FILTER ((unsigned int) 0x1 << 28) // (USART) Receive Line Filter +// -------- US_IER : (USART Offset: 0x8) Debug Unit Interrupt Enable Register -------- +#define AT91C_US_RXBRK ((unsigned int) 0x1 << 2) // (USART) Break Received/End of Break +#define AT91C_US_TIMEOUT ((unsigned int) 0x1 << 8) // (USART) Receiver Time-out +#define AT91C_US_ITERATION ((unsigned int) 0x1 << 10) // (USART) Max number of Repetitions Reached +#define AT91C_US_NACK ((unsigned int) 0x1 << 13) // (USART) Non Acknowledge +#define AT91C_US_RIIC ((unsigned int) 0x1 << 16) // (USART) Ring INdicator Input Change Flag +#define AT91C_US_DSRIC ((unsigned int) 0x1 << 17) // (USART) Data Set Ready Input Change Flag +#define AT91C_US_DCDIC ((unsigned int) 0x1 << 18) // (USART) Data Carrier Flag +#define AT91C_US_CTSIC ((unsigned int) 0x1 << 19) // (USART) Clear To Send Input Change Flag +// -------- US_IDR : (USART Offset: 0xc) Debug Unit Interrupt Disable Register -------- +// -------- US_IMR : (USART Offset: 0x10) Debug Unit Interrupt Mask Register -------- +// -------- US_CSR : (USART Offset: 0x14) Debug Unit Channel Status Register -------- +#define AT91C_US_RI ((unsigned int) 0x1 << 20) // (USART) Image of RI Input +#define AT91C_US_DSR ((unsigned int) 0x1 << 21) // (USART) Image of DSR Input +#define AT91C_US_DCD ((unsigned int) 0x1 << 22) // (USART) Image of DCD Input +#define AT91C_US_CTS ((unsigned int) 0x1 << 23) // (USART) Image of CTS Input + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Synchronous Serial Controller Interface +// ***************************************************************************** +typedef struct _AT91S_SSC { + AT91_REG SSC_CR; // Control Register + AT91_REG SSC_CMR; // Clock Mode Register + AT91_REG Reserved0[2]; // + AT91_REG SSC_RCMR; // Receive Clock ModeRegister + AT91_REG SSC_RFMR; // Receive Frame Mode Register + AT91_REG SSC_TCMR; // Transmit Clock Mode Register + AT91_REG SSC_TFMR; // Transmit Frame Mode Register + AT91_REG SSC_RHR; // Receive Holding Register + AT91_REG SSC_THR; // Transmit Holding Register + AT91_REG Reserved1[2]; // + AT91_REG SSC_RSHR; // Receive Sync Holding Register + AT91_REG SSC_TSHR; // Transmit Sync Holding Register + AT91_REG Reserved2[2]; // + AT91_REG SSC_SR; // Status Register + AT91_REG SSC_IER; // Interrupt Enable Register + AT91_REG SSC_IDR; // Interrupt Disable Register + AT91_REG SSC_IMR; // Interrupt Mask Register + AT91_REG Reserved3[44]; // + AT91_REG SSC_RPR; // Receive Pointer Register + AT91_REG SSC_RCR; // Receive Counter Register + AT91_REG SSC_TPR; // Transmit Pointer Register + AT91_REG SSC_TCR; // Transmit Counter Register + AT91_REG SSC_RNPR; // Receive Next Pointer Register + AT91_REG SSC_RNCR; // Receive Next Counter Register + AT91_REG SSC_TNPR; // Transmit Next Pointer Register + AT91_REG SSC_TNCR; // Transmit Next Counter Register + AT91_REG SSC_PTCR; // PDC Transfer Control Register + AT91_REG SSC_PTSR; // PDC Transfer Status Register +} AT91S_SSC, *AT91PS_SSC; + +// -------- SSC_CR : (SSC Offset: 0x0) SSC Control Register -------- +#define AT91C_SSC_RXEN ((unsigned int) 0x1 << 0) // (SSC) Receive Enable +#define AT91C_SSC_RXDIS ((unsigned int) 0x1 << 1) // (SSC) Receive Disable +#define AT91C_SSC_TXEN ((unsigned int) 0x1 << 8) // (SSC) Transmit Enable +#define AT91C_SSC_TXDIS ((unsigned int) 0x1 << 9) // (SSC) Transmit Disable +#define AT91C_SSC_SWRST ((unsigned int) 0x1 << 15) // (SSC) Software Reset +// -------- SSC_RCMR : (SSC Offset: 0x10) SSC Receive Clock Mode Register -------- +#define AT91C_SSC_CKS ((unsigned int) 0x3 << 0) // (SSC) Receive/Transmit Clock Selection +#define AT91C_SSC_CKS_DIV ((unsigned int) 0x0) // (SSC) Divided Clock +#define AT91C_SSC_CKS_TK ((unsigned int) 0x1) // (SSC) TK Clock signal +#define AT91C_SSC_CKS_RK ((unsigned int) 0x2) // (SSC) RK pin +#define AT91C_SSC_CKO ((unsigned int) 0x7 << 2) // (SSC) Receive/Transmit Clock Output Mode Selection +#define AT91C_SSC_CKO_NONE ((unsigned int) 0x0 << 2) // (SSC) Receive/Transmit Clock Output Mode: None RK pin: Input-only +#define AT91C_SSC_CKO_CONTINOUS ((unsigned int) 0x1 << 2) // (SSC) Continuous Receive/Transmit Clock RK pin: Output +#define AT91C_SSC_CKO_DATA_TX ((unsigned int) 0x2 << 2) // (SSC) Receive/Transmit Clock only during data transfers RK pin: Output +#define AT91C_SSC_CKI ((unsigned int) 0x1 << 5) // (SSC) Receive/Transmit Clock Inversion +#define AT91C_SSC_START ((unsigned int) 0xF << 8) // (SSC) Receive/Transmit Start Selection +#define AT91C_SSC_START_CONTINOUS ((unsigned int) 0x0 << 8) // (SSC) Continuous, as soon as the receiver is enabled, and immediately after the end of transfer of the previous data. +#define AT91C_SSC_START_TX ((unsigned int) 0x1 << 8) // (SSC) Transmit/Receive start +#define AT91C_SSC_START_LOW_RF ((unsigned int) 0x2 << 8) // (SSC) Detection of a low level on RF input +#define AT91C_SSC_START_HIGH_RF ((unsigned int) 0x3 << 8) // (SSC) Detection of a high level on RF input +#define AT91C_SSC_START_FALL_RF ((unsigned int) 0x4 << 8) // (SSC) Detection of a falling edge on RF input +#define AT91C_SSC_START_RISE_RF ((unsigned int) 0x5 << 8) // (SSC) Detection of a rising edge on RF input +#define AT91C_SSC_START_LEVEL_RF ((unsigned int) 0x6 << 8) // (SSC) Detection of any level change on RF input +#define AT91C_SSC_START_EDGE_RF ((unsigned int) 0x7 << 8) // (SSC) Detection of any edge on RF input +#define AT91C_SSC_START_0 ((unsigned int) 0x8 << 8) // (SSC) Compare 0 +#define AT91C_SSC_STTDLY ((unsigned int) 0xFF << 16) // (SSC) Receive/Transmit Start Delay +#define AT91C_SSC_PERIOD ((unsigned int) 0xFF << 24) // (SSC) Receive/Transmit Period Divider Selection +// -------- SSC_RFMR : (SSC Offset: 0x14) SSC Receive Frame Mode Register -------- +#define AT91C_SSC_DATLEN ((unsigned int) 0x1F << 0) // (SSC) Data Length +#define AT91C_SSC_LOOP ((unsigned int) 0x1 << 5) // (SSC) Loop Mode +#define AT91C_SSC_MSBF ((unsigned int) 0x1 << 7) // (SSC) Most Significant Bit First +#define AT91C_SSC_DATNB ((unsigned int) 0xF << 8) // (SSC) Data Number per Frame +#define AT91C_SSC_FSLEN ((unsigned int) 0xF << 16) // (SSC) Receive/Transmit Frame Sync length +#define AT91C_SSC_FSOS ((unsigned int) 0x7 << 20) // (SSC) Receive/Transmit Frame Sync Output Selection +#define AT91C_SSC_FSOS_NONE ((unsigned int) 0x0 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: None RK pin Input-only +#define AT91C_SSC_FSOS_NEGATIVE ((unsigned int) 0x1 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Negative Pulse +#define AT91C_SSC_FSOS_POSITIVE ((unsigned int) 0x2 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Positive Pulse +#define AT91C_SSC_FSOS_LOW ((unsigned int) 0x3 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver Low during data transfer +#define AT91C_SSC_FSOS_HIGH ((unsigned int) 0x4 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver High during data transfer +#define AT91C_SSC_FSOS_TOGGLE ((unsigned int) 0x5 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Toggling at each start of data transfer +#define AT91C_SSC_FSEDGE ((unsigned int) 0x1 << 24) // (SSC) Frame Sync Edge Detection +// -------- SSC_TCMR : (SSC Offset: 0x18) SSC Transmit Clock Mode Register -------- +// -------- SSC_TFMR : (SSC Offset: 0x1c) SSC Transmit Frame Mode Register -------- +#define AT91C_SSC_DATDEF ((unsigned int) 0x1 << 5) // (SSC) Data Default Value +#define AT91C_SSC_FSDEN ((unsigned int) 0x1 << 23) // (SSC) Frame Sync Data Enable +// -------- SSC_SR : (SSC Offset: 0x40) SSC Status Register -------- +#define AT91C_SSC_TXRDY ((unsigned int) 0x1 << 0) // (SSC) Transmit Ready +#define AT91C_SSC_TXEMPTY ((unsigned int) 0x1 << 1) // (SSC) Transmit Empty +#define AT91C_SSC_ENDTX ((unsigned int) 0x1 << 2) // (SSC) End Of Transmission +#define AT91C_SSC_TXBUFE ((unsigned int) 0x1 << 3) // (SSC) Transmit Buffer Empty +#define AT91C_SSC_RXRDY ((unsigned int) 0x1 << 4) // (SSC) Receive Ready +#define AT91C_SSC_OVRUN ((unsigned int) 0x1 << 5) // (SSC) Receive Overrun +#define AT91C_SSC_ENDRX ((unsigned int) 0x1 << 6) // (SSC) End of Reception +#define AT91C_SSC_RXBUFF ((unsigned int) 0x1 << 7) // (SSC) Receive Buffer Full +#define AT91C_SSC_TXSYN ((unsigned int) 0x1 << 10) // (SSC) Transmit Sync +#define AT91C_SSC_RXSYN ((unsigned int) 0x1 << 11) // (SSC) Receive Sync +#define AT91C_SSC_TXENA ((unsigned int) 0x1 << 16) // (SSC) Transmit Enable +#define AT91C_SSC_RXENA ((unsigned int) 0x1 << 17) // (SSC) Receive Enable +// -------- SSC_IER : (SSC Offset: 0x44) SSC Interrupt Enable Register -------- +// -------- SSC_IDR : (SSC Offset: 0x48) SSC Interrupt Disable Register -------- +// -------- SSC_IMR : (SSC Offset: 0x4c) SSC Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Two-wire Interface +// ***************************************************************************** +typedef struct _AT91S_TWI { + AT91_REG TWI_CR; // Control Register + AT91_REG TWI_MMR; // Master Mode Register + AT91_REG Reserved0[1]; // + AT91_REG TWI_IADR; // Internal Address Register + AT91_REG TWI_CWGR; // Clock Waveform Generator Register + AT91_REG Reserved1[3]; // + AT91_REG TWI_SR; // Status Register + AT91_REG TWI_IER; // Interrupt Enable Register + AT91_REG TWI_IDR; // Interrupt Disable Register + AT91_REG TWI_IMR; // Interrupt Mask Register + AT91_REG TWI_RHR; // Receive Holding Register + AT91_REG TWI_THR; // Transmit Holding Register +} AT91S_TWI, *AT91PS_TWI; + +// -------- TWI_CR : (TWI Offset: 0x0) TWI Control Register -------- +#define AT91C_TWI_START ((unsigned int) 0x1 << 0) // (TWI) Send a START Condition +#define AT91C_TWI_STOP ((unsigned int) 0x1 << 1) // (TWI) Send a STOP Condition +#define AT91C_TWI_MSEN ((unsigned int) 0x1 << 2) // (TWI) TWI Master Transfer Enabled +#define AT91C_TWI_MSDIS ((unsigned int) 0x1 << 3) // (TWI) TWI Master Transfer Disabled +#define AT91C_TWI_SWRST ((unsigned int) 0x1 << 7) // (TWI) Software Reset +// -------- TWI_MMR : (TWI Offset: 0x4) TWI Master Mode Register -------- +#define AT91C_TWI_IADRSZ ((unsigned int) 0x3 << 8) // (TWI) Internal Device Address Size +#define AT91C_TWI_IADRSZ_NO ((unsigned int) 0x0 << 8) // (TWI) No internal device address +#define AT91C_TWI_IADRSZ_1_BYTE ((unsigned int) 0x1 << 8) // (TWI) One-byte internal device address +#define AT91C_TWI_IADRSZ_2_BYTE ((unsigned int) 0x2 << 8) // (TWI) Two-byte internal device address +#define AT91C_TWI_IADRSZ_3_BYTE ((unsigned int) 0x3 << 8) // (TWI) Three-byte internal device address +#define AT91C_TWI_MREAD ((unsigned int) 0x1 << 12) // (TWI) Master Read Direction +#define AT91C_TWI_DADR ((unsigned int) 0x7F << 16) // (TWI) Device Address +// -------- TWI_CWGR : (TWI Offset: 0x10) TWI Clock Waveform Generator Register -------- +#define AT91C_TWI_CLDIV ((unsigned int) 0xFF << 0) // (TWI) Clock Low Divider +#define AT91C_TWI_CHDIV ((unsigned int) 0xFF << 8) // (TWI) Clock High Divider +#define AT91C_TWI_CKDIV ((unsigned int) 0x7 << 16) // (TWI) Clock Divider +// -------- TWI_SR : (TWI Offset: 0x20) TWI Status Register -------- +#define AT91C_TWI_TXCOMP ((unsigned int) 0x1 << 0) // (TWI) Transmission Completed +#define AT91C_TWI_RXRDY ((unsigned int) 0x1 << 1) // (TWI) Receive holding register ReaDY +#define AT91C_TWI_TXRDY ((unsigned int) 0x1 << 2) // (TWI) Transmit holding register ReaDY +#define AT91C_TWI_OVRE ((unsigned int) 0x1 << 6) // (TWI) Overrun Error +#define AT91C_TWI_UNRE ((unsigned int) 0x1 << 7) // (TWI) Underrun Error +#define AT91C_TWI_NACK ((unsigned int) 0x1 << 8) // (TWI) Not Acknowledged +// -------- TWI_IER : (TWI Offset: 0x24) TWI Interrupt Enable Register -------- +// -------- TWI_IDR : (TWI Offset: 0x28) TWI Interrupt Disable Register -------- +// -------- TWI_IMR : (TWI Offset: 0x2c) TWI Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR PWMC Channel Interface +// ***************************************************************************** +typedef struct _AT91S_PWMC_CH { + AT91_REG PWMC_CMR; // Channel Mode Register + AT91_REG PWMC_CDTYR; // Channel Duty Cycle Register + AT91_REG PWMC_CPRDR; // Channel Period Register + AT91_REG PWMC_CCNTR; // Channel Counter Register + AT91_REG PWMC_CUPDR; // Channel Update Register + AT91_REG PWMC_Reserved[3]; // Reserved +} AT91S_PWMC_CH, *AT91PS_PWMC_CH; + +// -------- PWMC_CMR : (PWMC_CH Offset: 0x0) PWMC Channel Mode Register -------- +#define AT91C_PWMC_CPRE ((unsigned int) 0xF << 0) // (PWMC_CH) Channel Pre-scaler : PWMC_CLKx +#define AT91C_PWMC_CPRE_MCK ((unsigned int) 0x0) // (PWMC_CH) +#define AT91C_PWMC_CPRE_MCKA ((unsigned int) 0xB) // (PWMC_CH) +#define AT91C_PWMC_CPRE_MCKB ((unsigned int) 0xC) // (PWMC_CH) +#define AT91C_PWMC_CALG ((unsigned int) 0x1 << 8) // (PWMC_CH) Channel Alignment +#define AT91C_PWMC_CPOL ((unsigned int) 0x1 << 9) // (PWMC_CH) Channel Polarity +#define AT91C_PWMC_CPD ((unsigned int) 0x1 << 10) // (PWMC_CH) Channel Update Period +// -------- PWMC_CDTYR : (PWMC_CH Offset: 0x4) PWMC Channel Duty Cycle Register -------- +#define AT91C_PWMC_CDTY ((unsigned int) 0x0 << 0) // (PWMC_CH) Channel Duty Cycle +// -------- PWMC_CPRDR : (PWMC_CH Offset: 0x8) PWMC Channel Period Register -------- +#define AT91C_PWMC_CPRD ((unsigned int) 0x0 << 0) // (PWMC_CH) Channel Period +// -------- PWMC_CCNTR : (PWMC_CH Offset: 0xc) PWMC Channel Counter Register -------- +#define AT91C_PWMC_CCNT ((unsigned int) 0x0 << 0) // (PWMC_CH) Channel Counter +// -------- PWMC_CUPDR : (PWMC_CH Offset: 0x10) PWMC Channel Update Register -------- +#define AT91C_PWMC_CUPD ((unsigned int) 0x0 << 0) // (PWMC_CH) Channel Update + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Pulse Width Modulation Controller Interface +// ***************************************************************************** +typedef struct _AT91S_PWMC { + AT91_REG PWMC_MR; // PWMC Mode Register + AT91_REG PWMC_ENA; // PWMC Enable Register + AT91_REG PWMC_DIS; // PWMC Disable Register + AT91_REG PWMC_SR; // PWMC Status Register + AT91_REG PWMC_IER; // PWMC Interrupt Enable Register + AT91_REG PWMC_IDR; // PWMC Interrupt Disable Register + AT91_REG PWMC_IMR; // PWMC Interrupt Mask Register + AT91_REG PWMC_ISR; // PWMC Interrupt Status Register + AT91_REG Reserved0[55]; // + AT91_REG PWMC_VR; // PWMC Version Register + AT91_REG Reserved1[64]; // + AT91S_PWMC_CH PWMC_CH[4]; // PWMC Channel +} AT91S_PWMC, *AT91PS_PWMC; + +// -------- PWMC_MR : (PWMC Offset: 0x0) PWMC Mode Register -------- +#define AT91C_PWMC_DIVA ((unsigned int) 0xFF << 0) // (PWMC) CLKA divide factor. +#define AT91C_PWMC_PREA ((unsigned int) 0xF << 8) // (PWMC) Divider Input Clock Prescaler A +#define AT91C_PWMC_PREA_MCK ((unsigned int) 0x0 << 8) // (PWMC) +#define AT91C_PWMC_DIVB ((unsigned int) 0xFF << 16) // (PWMC) CLKB divide factor. +#define AT91C_PWMC_PREB ((unsigned int) 0xF << 24) // (PWMC) Divider Input Clock Prescaler B +#define AT91C_PWMC_PREB_MCK ((unsigned int) 0x0 << 24) // (PWMC) +// -------- PWMC_ENA : (PWMC Offset: 0x4) PWMC Enable Register -------- +#define AT91C_PWMC_CHID0 ((unsigned int) 0x1 << 0) // (PWMC) Channel ID 0 +#define AT91C_PWMC_CHID1 ((unsigned int) 0x1 << 1) // (PWMC) Channel ID 1 +#define AT91C_PWMC_CHID2 ((unsigned int) 0x1 << 2) // (PWMC) Channel ID 2 +#define AT91C_PWMC_CHID3 ((unsigned int) 0x1 << 3) // (PWMC) Channel ID 3 +// -------- PWMC_DIS : (PWMC Offset: 0x8) PWMC Disable Register -------- +// -------- PWMC_SR : (PWMC Offset: 0xc) PWMC Status Register -------- +// -------- PWMC_IER : (PWMC Offset: 0x10) PWMC Interrupt Enable Register -------- +// -------- PWMC_IDR : (PWMC Offset: 0x14) PWMC Interrupt Disable Register -------- +// -------- PWMC_IMR : (PWMC Offset: 0x18) PWMC Interrupt Mask Register -------- +// -------- PWMC_ISR : (PWMC Offset: 0x1c) PWMC Interrupt Status Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR USB Device Interface +// ***************************************************************************** +typedef struct _AT91S_UDP { + AT91_REG UDP_NUM; // Frame Number Register + AT91_REG UDP_GLBSTATE; // Global State Register + AT91_REG UDP_FADDR; // Function Address Register + AT91_REG Reserved0[1]; // + AT91_REG UDP_IER; // Interrupt Enable Register + AT91_REG UDP_IDR; // Interrupt Disable Register + AT91_REG UDP_IMR; // Interrupt Mask Register + AT91_REG UDP_ISR; // Interrupt Status Register + AT91_REG UDP_ICR; // Interrupt Clear Register + AT91_REG Reserved1[1]; // + AT91_REG UDP_RSTEP; // Reset Endpoint Register + AT91_REG Reserved2[1]; // + AT91_REG UDP_CSR[6]; // Endpoint Control and Status Register + AT91_REG Reserved3[2]; // + AT91_REG UDP_FDR[6]; // Endpoint FIFO Data Register + AT91_REG Reserved4[3]; // + AT91_REG UDP_TXVC; // Transceiver Control Register +} AT91S_UDP, *AT91PS_UDP; + +// -------- UDP_FRM_NUM : (UDP Offset: 0x0) USB Frame Number Register -------- +#define AT91C_UDP_FRM_NUM ((unsigned int) 0x7FF << 0) // (UDP) Frame Number as Defined in the Packet Field Formats +#define AT91C_UDP_FRM_ERR ((unsigned int) 0x1 << 16) // (UDP) Frame Error +#define AT91C_UDP_FRM_OK ((unsigned int) 0x1 << 17) // (UDP) Frame OK +// -------- UDP_GLB_STATE : (UDP Offset: 0x4) USB Global State Register -------- +#define AT91C_UDP_FADDEN ((unsigned int) 0x1 << 0) // (UDP) Function Address Enable +#define AT91C_UDP_CONFG ((unsigned int) 0x1 << 1) // (UDP) Configured +#define AT91C_UDP_ESR ((unsigned int) 0x1 << 2) // (UDP) Enable Send Resume +#define AT91C_UDP_RSMINPR ((unsigned int) 0x1 << 3) // (UDP) A Resume Has Been Sent to the Host +#define AT91C_UDP_RMWUPE ((unsigned int) 0x1 << 4) // (UDP) Remote Wake Up Enable +// -------- UDP_FADDR : (UDP Offset: 0x8) USB Function Address Register -------- +#define AT91C_UDP_FADD ((unsigned int) 0xFF << 0) // (UDP) Function Address Value +#define AT91C_UDP_FEN ((unsigned int) 0x1 << 8) // (UDP) Function Enable +// -------- UDP_IER : (UDP Offset: 0x10) USB Interrupt Enable Register -------- +#define AT91C_UDP_EPINT0 ((unsigned int) 0x1 << 0) // (UDP) Endpoint 0 Interrupt +#define AT91C_UDP_EPINT1 ((unsigned int) 0x1 << 1) // (UDP) Endpoint 0 Interrupt +#define AT91C_UDP_EPINT2 ((unsigned int) 0x1 << 2) // (UDP) Endpoint 2 Interrupt +#define AT91C_UDP_EPINT3 ((unsigned int) 0x1 << 3) // (UDP) Endpoint 3 Interrupt +#define AT91C_UDP_EPINT4 ((unsigned int) 0x1 << 4) // (UDP) Endpoint 4 Interrupt +#define AT91C_UDP_EPINT5 ((unsigned int) 0x1 << 5) // (UDP) Endpoint 5 Interrupt +#define AT91C_UDP_RXSUSP ((unsigned int) 0x1 << 8) // (UDP) USB Suspend Interrupt +#define AT91C_UDP_RXRSM ((unsigned int) 0x1 << 9) // (UDP) USB Resume Interrupt +#define AT91C_UDP_EXTRSM ((unsigned int) 0x1 << 10) // (UDP) USB External Resume Interrupt +#define AT91C_UDP_SOFINT ((unsigned int) 0x1 << 11) // (UDP) USB Start Of frame Interrupt +#define AT91C_UDP_WAKEUP ((unsigned int) 0x1 << 13) // (UDP) USB Resume Interrupt +// -------- UDP_IDR : (UDP Offset: 0x14) USB Interrupt Disable Register -------- +// -------- UDP_IMR : (UDP Offset: 0x18) USB Interrupt Mask Register -------- +// -------- UDP_ISR : (UDP Offset: 0x1c) USB Interrupt Status Register -------- +#define AT91C_UDP_ENDBUSRES ((unsigned int) 0x1 << 12) // (UDP) USB End Of Bus Reset Interrupt +// -------- UDP_ICR : (UDP Offset: 0x20) USB Interrupt Clear Register -------- +// -------- UDP_RST_EP : (UDP Offset: 0x28) USB Reset Endpoint Register -------- +#define AT91C_UDP_EP0 ((unsigned int) 0x1 << 0) // (UDP) Reset Endpoint 0 +#define AT91C_UDP_EP1 ((unsigned int) 0x1 << 1) // (UDP) Reset Endpoint 1 +#define AT91C_UDP_EP2 ((unsigned int) 0x1 << 2) // (UDP) Reset Endpoint 2 +#define AT91C_UDP_EP3 ((unsigned int) 0x1 << 3) // (UDP) Reset Endpoint 3 +#define AT91C_UDP_EP4 ((unsigned int) 0x1 << 4) // (UDP) Reset Endpoint 4 +#define AT91C_UDP_EP5 ((unsigned int) 0x1 << 5) // (UDP) Reset Endpoint 5 +// -------- UDP_CSR : (UDP Offset: 0x30) USB Endpoint Control and Status Register -------- +#define AT91C_UDP_TXCOMP ((unsigned int) 0x1 << 0) // (UDP) Generates an IN packet with data previously written in the DPR +#define AT91C_UDP_RX_DATA_BK0 ((unsigned int) 0x1 << 1) // (UDP) Receive Data Bank 0 +#define AT91C_UDP_RXSETUP ((unsigned int) 0x1 << 2) // (UDP) Sends STALL to the Host (Control endpoints) +#define AT91C_UDP_ISOERROR ((unsigned int) 0x1 << 3) // (UDP) Isochronous error (Isochronous endpoints) +#define AT91C_UDP_TXPKTRDY ((unsigned int) 0x1 << 4) // (UDP) Transmit Packet Ready +#define AT91C_UDP_FORCESTALL ((unsigned int) 0x1 << 5) // (UDP) Force Stall (used by Control, Bulk and Isochronous endpoints). +#define AT91C_UDP_RX_DATA_BK1 ((unsigned int) 0x1 << 6) // (UDP) Receive Data Bank 1 (only used by endpoints with ping-pong attributes). +#define AT91C_UDP_DIR ((unsigned int) 0x1 << 7) // (UDP) Transfer Direction +#define AT91C_UDP_EPTYPE ((unsigned int) 0x7 << 8) // (UDP) Endpoint type +#define AT91C_UDP_EPTYPE_CTRL ((unsigned int) 0x0 << 8) // (UDP) Control +#define AT91C_UDP_EPTYPE_ISO_OUT ((unsigned int) 0x1 << 8) // (UDP) Isochronous OUT +#define AT91C_UDP_EPTYPE_BULK_OUT ((unsigned int) 0x2 << 8) // (UDP) Bulk OUT +#define AT91C_UDP_EPTYPE_INT_OUT ((unsigned int) 0x3 << 8) // (UDP) Interrupt OUT +#define AT91C_UDP_EPTYPE_ISO_IN ((unsigned int) 0x5 << 8) // (UDP) Isochronous IN +#define AT91C_UDP_EPTYPE_BULK_IN ((unsigned int) 0x6 << 8) // (UDP) Bulk IN +#define AT91C_UDP_EPTYPE_INT_IN ((unsigned int) 0x7 << 8) // (UDP) Interrupt IN +#define AT91C_UDP_DTGLE ((unsigned int) 0x1 << 11) // (UDP) Data Toggle +#define AT91C_UDP_EPEDS ((unsigned int) 0x1 << 15) // (UDP) Endpoint Enable Disable +#define AT91C_UDP_RXBYTECNT ((unsigned int) 0x7FF << 16) // (UDP) Number Of Bytes Available in the FIFO +// -------- UDP_TXVC : (UDP Offset: 0x74) Transceiver Control Register -------- +#define AT91C_UDP_TXVDIS ((unsigned int) 0x1 << 8) // (UDP) +#define AT91C_UDP_PUON ((unsigned int) 0x1 << 9) // (UDP) Pull-up ON + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Timer Counter Channel Interface +// ***************************************************************************** +typedef struct _AT91S_TC { + AT91_REG TC_CCR; // Channel Control Register + AT91_REG TC_CMR; // Channel Mode Register (Capture Mode / Waveform Mode) + AT91_REG Reserved0[2]; // + AT91_REG TC_CV; // Counter Value + AT91_REG TC_RA; // Register A + AT91_REG TC_RB; // Register B + AT91_REG TC_RC; // Register C + AT91_REG TC_SR; // Status Register + AT91_REG TC_IER; // Interrupt Enable Register + AT91_REG TC_IDR; // Interrupt Disable Register + AT91_REG TC_IMR; // Interrupt Mask Register +} AT91S_TC, *AT91PS_TC; + +// -------- TC_CCR : (TC Offset: 0x0) TC Channel Control Register -------- +#define AT91C_TC_CLKEN ((unsigned int) 0x1 << 0) // (TC) Counter Clock Enable Command +#define AT91C_TC_CLKDIS ((unsigned int) 0x1 << 1) // (TC) Counter Clock Disable Command +#define AT91C_TC_SWTRG ((unsigned int) 0x1 << 2) // (TC) Software Trigger Command +// -------- TC_CMR : (TC Offset: 0x4) TC Channel Mode Register: Capture Mode / Waveform Mode -------- +#define AT91C_TC_CLKS ((unsigned int) 0x7 << 0) // (TC) Clock Selection +#define AT91C_TC_CLKS_TIMER_DIV1_CLOCK ((unsigned int) 0x0) // (TC) Clock selected: TIMER_DIV1_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV2_CLOCK ((unsigned int) 0x1) // (TC) Clock selected: TIMER_DIV2_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV3_CLOCK ((unsigned int) 0x2) // (TC) Clock selected: TIMER_DIV3_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV4_CLOCK ((unsigned int) 0x3) // (TC) Clock selected: TIMER_DIV4_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV5_CLOCK ((unsigned int) 0x4) // (TC) Clock selected: TIMER_DIV5_CLOCK +#define AT91C_TC_CLKS_XC0 ((unsigned int) 0x5) // (TC) Clock selected: XC0 +#define AT91C_TC_CLKS_XC1 ((unsigned int) 0x6) // (TC) Clock selected: XC1 +#define AT91C_TC_CLKS_XC2 ((unsigned int) 0x7) // (TC) Clock selected: XC2 +#define AT91C_TC_CLKI ((unsigned int) 0x1 << 3) // (TC) Clock Invert +#define AT91C_TC_BURST ((unsigned int) 0x3 << 4) // (TC) Burst Signal Selection +#define AT91C_TC_BURST_NONE ((unsigned int) 0x0 << 4) // (TC) The clock is not gated by an external signal +#define AT91C_TC_BURST_XC0 ((unsigned int) 0x1 << 4) // (TC) XC0 is ANDed with the selected clock +#define AT91C_TC_BURST_XC1 ((unsigned int) 0x2 << 4) // (TC) XC1 is ANDed with the selected clock +#define AT91C_TC_BURST_XC2 ((unsigned int) 0x3 << 4) // (TC) XC2 is ANDed with the selected clock +#define AT91C_TC_CPCSTOP ((unsigned int) 0x1 << 6) // (TC) Counter Clock Stopped with RC Compare +#define AT91C_TC_LDBSTOP ((unsigned int) 0x1 << 6) // (TC) Counter Clock Stopped with RB Loading +#define AT91C_TC_CPCDIS ((unsigned int) 0x1 << 7) // (TC) Counter Clock Disable with RC Compare +#define AT91C_TC_LDBDIS ((unsigned int) 0x1 << 7) // (TC) Counter Clock Disabled with RB Loading +#define AT91C_TC_ETRGEDG ((unsigned int) 0x3 << 8) // (TC) External Trigger Edge Selection +#define AT91C_TC_ETRGEDG_NONE ((unsigned int) 0x0 << 8) // (TC) Edge: None +#define AT91C_TC_ETRGEDG_RISING ((unsigned int) 0x1 << 8) // (TC) Edge: rising edge +#define AT91C_TC_ETRGEDG_FALLING ((unsigned int) 0x2 << 8) // (TC) Edge: falling edge +#define AT91C_TC_ETRGEDG_BOTH ((unsigned int) 0x3 << 8) // (TC) Edge: each edge +#define AT91C_TC_EEVTEDG ((unsigned int) 0x3 << 8) // (TC) External Event Edge Selection +#define AT91C_TC_EEVTEDG_NONE ((unsigned int) 0x0 << 8) // (TC) Edge: None +#define AT91C_TC_EEVTEDG_RISING ((unsigned int) 0x1 << 8) // (TC) Edge: rising edge +#define AT91C_TC_EEVTEDG_FALLING ((unsigned int) 0x2 << 8) // (TC) Edge: falling edge +#define AT91C_TC_EEVTEDG_BOTH ((unsigned int) 0x3 << 8) // (TC) Edge: each edge +#define AT91C_TC_EEVT ((unsigned int) 0x3 << 10) // (TC) External Event Selection +#define AT91C_TC_EEVT_TIOB ((unsigned int) 0x0 << 10) // (TC) Signal selected as external event: TIOB TIOB direction: input +#define AT91C_TC_EEVT_XC0 ((unsigned int) 0x1 << 10) // (TC) Signal selected as external event: XC0 TIOB direction: output +#define AT91C_TC_EEVT_XC1 ((unsigned int) 0x2 << 10) // (TC) Signal selected as external event: XC1 TIOB direction: output +#define AT91C_TC_EEVT_XC2 ((unsigned int) 0x3 << 10) // (TC) Signal selected as external event: XC2 TIOB direction: output +#define AT91C_TC_ABETRG ((unsigned int) 0x1 << 10) // (TC) TIOA or TIOB External Trigger Selection +#define AT91C_TC_ENETRG ((unsigned int) 0x1 << 12) // (TC) External Event Trigger enable +#define AT91C_TC_WAVESEL ((unsigned int) 0x3 << 13) // (TC) Waveform Selection +#define AT91C_TC_WAVESEL_UP ((unsigned int) 0x0 << 13) // (TC) UP mode without atomatic trigger on RC Compare +#define AT91C_TC_WAVESEL_UPDOWN ((unsigned int) 0x1 << 13) // (TC) UPDOWN mode without automatic trigger on RC Compare +#define AT91C_TC_WAVESEL_UP_AUTO ((unsigned int) 0x2 << 13) // (TC) UP mode with automatic trigger on RC Compare +#define AT91C_TC_WAVESEL_UPDOWN_AUTO ((unsigned int) 0x3 << 13) // (TC) UPDOWN mode with automatic trigger on RC Compare +#define AT91C_TC_CPCTRG ((unsigned int) 0x1 << 14) // (TC) RC Compare Trigger Enable +#define AT91C_TC_WAVE ((unsigned int) 0x1 << 15) // (TC) +#define AT91C_TC_ACPA ((unsigned int) 0x3 << 16) // (TC) RA Compare Effect on TIOA +#define AT91C_TC_ACPA_NONE ((unsigned int) 0x0 << 16) // (TC) Effect: none +#define AT91C_TC_ACPA_SET ((unsigned int) 0x1 << 16) // (TC) Effect: set +#define AT91C_TC_ACPA_CLEAR ((unsigned int) 0x2 << 16) // (TC) Effect: clear +#define AT91C_TC_ACPA_TOGGLE ((unsigned int) 0x3 << 16) // (TC) Effect: toggle +#define AT91C_TC_LDRA ((unsigned int) 0x3 << 16) // (TC) RA Loading Selection +#define AT91C_TC_LDRA_NONE ((unsigned int) 0x0 << 16) // (TC) Edge: None +#define AT91C_TC_LDRA_RISING ((unsigned int) 0x1 << 16) // (TC) Edge: rising edge of TIOA +#define AT91C_TC_LDRA_FALLING ((unsigned int) 0x2 << 16) // (TC) Edge: falling edge of TIOA +#define AT91C_TC_LDRA_BOTH ((unsigned int) 0x3 << 16) // (TC) Edge: each edge of TIOA +#define AT91C_TC_ACPC ((unsigned int) 0x3 << 18) // (TC) RC Compare Effect on TIOA +#define AT91C_TC_ACPC_NONE ((unsigned int) 0x0 << 18) // (TC) Effect: none +#define AT91C_TC_ACPC_SET ((unsigned int) 0x1 << 18) // (TC) Effect: set +#define AT91C_TC_ACPC_CLEAR ((unsigned int) 0x2 << 18) // (TC) Effect: clear +#define AT91C_TC_ACPC_TOGGLE ((unsigned int) 0x3 << 18) // (TC) Effect: toggle +#define AT91C_TC_LDRB ((unsigned int) 0x3 << 18) // (TC) RB Loading Selection +#define AT91C_TC_LDRB_NONE ((unsigned int) 0x0 << 18) // (TC) Edge: None +#define AT91C_TC_LDRB_RISING ((unsigned int) 0x1 << 18) // (TC) Edge: rising edge of TIOA +#define AT91C_TC_LDRB_FALLING ((unsigned int) 0x2 << 18) // (TC) Edge: falling edge of TIOA +#define AT91C_TC_LDRB_BOTH ((unsigned int) 0x3 << 18) // (TC) Edge: each edge of TIOA +#define AT91C_TC_AEEVT ((unsigned int) 0x3 << 20) // (TC) External Event Effect on TIOA +#define AT91C_TC_AEEVT_NONE ((unsigned int) 0x0 << 20) // (TC) Effect: none +#define AT91C_TC_AEEVT_SET ((unsigned int) 0x1 << 20) // (TC) Effect: set +#define AT91C_TC_AEEVT_CLEAR ((unsigned int) 0x2 << 20) // (TC) Effect: clear +#define AT91C_TC_AEEVT_TOGGLE ((unsigned int) 0x3 << 20) // (TC) Effect: toggle +#define AT91C_TC_ASWTRG ((unsigned int) 0x3 << 22) // (TC) Software Trigger Effect on TIOA +#define AT91C_TC_ASWTRG_NONE ((unsigned int) 0x0 << 22) // (TC) Effect: none +#define AT91C_TC_ASWTRG_SET ((unsigned int) 0x1 << 22) // (TC) Effect: set +#define AT91C_TC_ASWTRG_CLEAR ((unsigned int) 0x2 << 22) // (TC) Effect: clear +#define AT91C_TC_ASWTRG_TOGGLE ((unsigned int) 0x3 << 22) // (TC) Effect: toggle +#define AT91C_TC_BCPB ((unsigned int) 0x3 << 24) // (TC) RB Compare Effect on TIOB +#define AT91C_TC_BCPB_NONE ((unsigned int) 0x0 << 24) // (TC) Effect: none +#define AT91C_TC_BCPB_SET ((unsigned int) 0x1 << 24) // (TC) Effect: set +#define AT91C_TC_BCPB_CLEAR ((unsigned int) 0x2 << 24) // (TC) Effect: clear +#define AT91C_TC_BCPB_TOGGLE ((unsigned int) 0x3 << 24) // (TC) Effect: toggle +#define AT91C_TC_BCPC ((unsigned int) 0x3 << 26) // (TC) RC Compare Effect on TIOB +#define AT91C_TC_BCPC_NONE ((unsigned int) 0x0 << 26) // (TC) Effect: none +#define AT91C_TC_BCPC_SET ((unsigned int) 0x1 << 26) // (TC) Effect: set +#define AT91C_TC_BCPC_CLEAR ((unsigned int) 0x2 << 26) // (TC) Effect: clear +#define AT91C_TC_BCPC_TOGGLE ((unsigned int) 0x3 << 26) // (TC) Effect: toggle +#define AT91C_TC_BEEVT ((unsigned int) 0x3 << 28) // (TC) External Event Effect on TIOB +#define AT91C_TC_BEEVT_NONE ((unsigned int) 0x0 << 28) // (TC) Effect: none +#define AT91C_TC_BEEVT_SET ((unsigned int) 0x1 << 28) // (TC) Effect: set +#define AT91C_TC_BEEVT_CLEAR ((unsigned int) 0x2 << 28) // (TC) Effect: clear +#define AT91C_TC_BEEVT_TOGGLE ((unsigned int) 0x3 << 28) // (TC) Effect: toggle +#define AT91C_TC_BSWTRG ((unsigned int) 0x3 << 30) // (TC) Software Trigger Effect on TIOB +#define AT91C_TC_BSWTRG_NONE ((unsigned int) 0x0 << 30) // (TC) Effect: none +#define AT91C_TC_BSWTRG_SET ((unsigned int) 0x1 << 30) // (TC) Effect: set +#define AT91C_TC_BSWTRG_CLEAR ((unsigned int) 0x2 << 30) // (TC) Effect: clear +#define AT91C_TC_BSWTRG_TOGGLE ((unsigned int) 0x3 << 30) // (TC) Effect: toggle +// -------- TC_SR : (TC Offset: 0x20) TC Channel Status Register -------- +#define AT91C_TC_COVFS ((unsigned int) 0x1 << 0) // (TC) Counter Overflow +#define AT91C_TC_LOVRS ((unsigned int) 0x1 << 1) // (TC) Load Overrun +#define AT91C_TC_CPAS ((unsigned int) 0x1 << 2) // (TC) RA Compare +#define AT91C_TC_CPBS ((unsigned int) 0x1 << 3) // (TC) RB Compare +#define AT91C_TC_CPCS ((unsigned int) 0x1 << 4) // (TC) RC Compare +#define AT91C_TC_LDRAS ((unsigned int) 0x1 << 5) // (TC) RA Loading +#define AT91C_TC_LDRBS ((unsigned int) 0x1 << 6) // (TC) RB Loading +#define AT91C_TC_ETRGS ((unsigned int) 0x1 << 7) // (TC) External Trigger +#define AT91C_TC_CLKSTA ((unsigned int) 0x1 << 16) // (TC) Clock Enabling +#define AT91C_TC_MTIOA ((unsigned int) 0x1 << 17) // (TC) TIOA Mirror +#define AT91C_TC_MTIOB ((unsigned int) 0x1 << 18) // (TC) TIOA Mirror +// -------- TC_IER : (TC Offset: 0x24) TC Channel Interrupt Enable Register -------- +// -------- TC_IDR : (TC Offset: 0x28) TC Channel Interrupt Disable Register -------- +// -------- TC_IMR : (TC Offset: 0x2c) TC Channel Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Timer Counter Interface +// ***************************************************************************** +typedef struct _AT91S_TCB { + AT91S_TC TCB_TC0; // TC Channel 0 + AT91_REG Reserved0[4]; // + AT91S_TC TCB_TC1; // TC Channel 1 + AT91_REG Reserved1[4]; // + AT91S_TC TCB_TC2; // TC Channel 2 + AT91_REG Reserved2[4]; // + AT91_REG TCB_BCR; // TC Block Control Register + AT91_REG TCB_BMR; // TC Block Mode Register +} AT91S_TCB, *AT91PS_TCB; + +// -------- TCB_BCR : (TCB Offset: 0xc0) TC Block Control Register -------- +#define AT91C_TCB_SYNC ((unsigned int) 0x1 << 0) // (TCB) Synchro Command +// -------- TCB_BMR : (TCB Offset: 0xc4) TC Block Mode Register -------- +#define AT91C_TCB_TC0XC0S ((unsigned int) 0x3 << 0) // (TCB) External Clock Signal 0 Selection +#define AT91C_TCB_TC0XC0S_TCLK0 ((unsigned int) 0x0) // (TCB) TCLK0 connected to XC0 +#define AT91C_TCB_TC0XC0S_NONE ((unsigned int) 0x1) // (TCB) None signal connected to XC0 +#define AT91C_TCB_TC0XC0S_TIOA1 ((unsigned int) 0x2) // (TCB) TIOA1 connected to XC0 +#define AT91C_TCB_TC0XC0S_TIOA2 ((unsigned int) 0x3) // (TCB) TIOA2 connected to XC0 +#define AT91C_TCB_TC1XC1S ((unsigned int) 0x3 << 2) // (TCB) External Clock Signal 1 Selection +#define AT91C_TCB_TC1XC1S_TCLK1 ((unsigned int) 0x0 << 2) // (TCB) TCLK1 connected to XC1 +#define AT91C_TCB_TC1XC1S_NONE ((unsigned int) 0x1 << 2) // (TCB) None signal connected to XC1 +#define AT91C_TCB_TC1XC1S_TIOA0 ((unsigned int) 0x2 << 2) // (TCB) TIOA0 connected to XC1 +#define AT91C_TCB_TC1XC1S_TIOA2 ((unsigned int) 0x3 << 2) // (TCB) TIOA2 connected to XC1 +#define AT91C_TCB_TC2XC2S ((unsigned int) 0x3 << 4) // (TCB) External Clock Signal 2 Selection +#define AT91C_TCB_TC2XC2S_TCLK2 ((unsigned int) 0x0 << 4) // (TCB) TCLK2 connected to XC2 +#define AT91C_TCB_TC2XC2S_NONE ((unsigned int) 0x1 << 4) // (TCB) None signal connected to XC2 +#define AT91C_TCB_TC2XC2S_TIOA0 ((unsigned int) 0x2 << 4) // (TCB) TIOA0 connected to XC2 +#define AT91C_TCB_TC2XC2S_TIOA1 ((unsigned int) 0x3 << 4) // (TCB) TIOA2 connected to XC2 + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Control Area Network MailBox Interface +// ***************************************************************************** +typedef struct _AT91S_CAN_MB { + AT91_REG CAN_MB_MMR; // MailBox Mode Register + AT91_REG CAN_MB_MAM; // MailBox Acceptance Mask Register + AT91_REG CAN_MB_MID; // MailBox ID Register + AT91_REG CAN_MB_MFID; // MailBox Family ID Register + AT91_REG CAN_MB_MSR; // MailBox Status Register + AT91_REG CAN_MB_MDL; // MailBox Data Low Register + AT91_REG CAN_MB_MDH; // MailBox Data High Register + AT91_REG CAN_MB_MCR; // MailBox Control Register +} AT91S_CAN_MB, *AT91PS_CAN_MB; + +// -------- CAN_MMR : (CAN_MB Offset: 0x0) CAN Message Mode Register -------- +#define AT91C_CAN_MTIMEMARK ((unsigned int) 0xFFFF << 0) // (CAN_MB) Mailbox Timemark +#define AT91C_CAN_PRIOR ((unsigned int) 0xF << 16) // (CAN_MB) Mailbox Priority +#define AT91C_CAN_MOT ((unsigned int) 0x7 << 24) // (CAN_MB) Mailbox Object Type +#define AT91C_CAN_MOT_DIS ((unsigned int) 0x0 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_RX ((unsigned int) 0x1 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_RXOVERWRITE ((unsigned int) 0x2 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_TX ((unsigned int) 0x3 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_CONSUMER ((unsigned int) 0x4 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_PRODUCER ((unsigned int) 0x5 << 24) // (CAN_MB) +// -------- CAN_MAM : (CAN_MB Offset: 0x4) CAN Message Acceptance Mask Register -------- +#define AT91C_CAN_MIDvB ((unsigned int) 0x3FFFF << 0) // (CAN_MB) Complementary bits for identifier in extended mode +#define AT91C_CAN_MIDvA ((unsigned int) 0x7FF << 18) // (CAN_MB) Identifier for standard frame mode +#define AT91C_CAN_MIDE ((unsigned int) 0x1 << 29) // (CAN_MB) Identifier Version +// -------- CAN_MID : (CAN_MB Offset: 0x8) CAN Message ID Register -------- +// -------- CAN_MFID : (CAN_MB Offset: 0xc) CAN Message Family ID Register -------- +// -------- CAN_MSR : (CAN_MB Offset: 0x10) CAN Message Status Register -------- +#define AT91C_CAN_MTIMESTAMP ((unsigned int) 0xFFFF << 0) // (CAN_MB) Timer Value +#define AT91C_CAN_MDLC ((unsigned int) 0xF << 16) // (CAN_MB) Mailbox Data Length Code +#define AT91C_CAN_MRTR ((unsigned int) 0x1 << 20) // (CAN_MB) Mailbox Remote Transmission Request +#define AT91C_CAN_MABT ((unsigned int) 0x1 << 22) // (CAN_MB) Mailbox Message Abort +#define AT91C_CAN_MRDY ((unsigned int) 0x1 << 23) // (CAN_MB) Mailbox Ready +#define AT91C_CAN_MMI ((unsigned int) 0x1 << 24) // (CAN_MB) Mailbox Message Ignored +// -------- CAN_MDL : (CAN_MB Offset: 0x14) CAN Message Data Low Register -------- +// -------- CAN_MDH : (CAN_MB Offset: 0x18) CAN Message Data High Register -------- +// -------- CAN_MCR : (CAN_MB Offset: 0x1c) CAN Message Control Register -------- +#define AT91C_CAN_MACR ((unsigned int) 0x1 << 22) // (CAN_MB) Abort Request for Mailbox +#define AT91C_CAN_MTCR ((unsigned int) 0x1 << 23) // (CAN_MB) Mailbox Transfer Command + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Control Area Network Interface +// ***************************************************************************** +typedef struct _AT91S_CAN { + AT91_REG CAN_MR; // Mode Register + AT91_REG CAN_IER; // Interrupt Enable Register + AT91_REG CAN_IDR; // Interrupt Disable Register + AT91_REG CAN_IMR; // Interrupt Mask Register + AT91_REG CAN_SR; // Status Register + AT91_REG CAN_BR; // Baudrate Register + AT91_REG CAN_TIM; // Timer Register + AT91_REG CAN_TIMESTP; // Time Stamp Register + AT91_REG CAN_ECR; // Error Counter Register + AT91_REG CAN_TCR; // Transfer Command Register + AT91_REG CAN_ACR; // Abort Command Register + AT91_REG Reserved0[52]; // + AT91_REG CAN_VR; // Version Register + AT91_REG Reserved1[64]; // + AT91S_CAN_MB CAN_MB0; // CAN Mailbox 0 + AT91S_CAN_MB CAN_MB1; // CAN Mailbox 1 + AT91S_CAN_MB CAN_MB2; // CAN Mailbox 2 + AT91S_CAN_MB CAN_MB3; // CAN Mailbox 3 + AT91S_CAN_MB CAN_MB4; // CAN Mailbox 4 + AT91S_CAN_MB CAN_MB5; // CAN Mailbox 5 + AT91S_CAN_MB CAN_MB6; // CAN Mailbox 6 + AT91S_CAN_MB CAN_MB7; // CAN Mailbox 7 + AT91S_CAN_MB CAN_MB8; // CAN Mailbox 8 + AT91S_CAN_MB CAN_MB9; // CAN Mailbox 9 + AT91S_CAN_MB CAN_MB10; // CAN Mailbox 10 + AT91S_CAN_MB CAN_MB11; // CAN Mailbox 11 + AT91S_CAN_MB CAN_MB12; // CAN Mailbox 12 + AT91S_CAN_MB CAN_MB13; // CAN Mailbox 13 + AT91S_CAN_MB CAN_MB14; // CAN Mailbox 14 + AT91S_CAN_MB CAN_MB15; // CAN Mailbox 15 +} AT91S_CAN, *AT91PS_CAN; + +// -------- CAN_MR : (CAN Offset: 0x0) CAN Mode Register -------- +#define AT91C_CAN_CANEN ((unsigned int) 0x1 << 0) // (CAN) CAN Controller Enable +#define AT91C_CAN_LPM ((unsigned int) 0x1 << 1) // (CAN) Disable/Enable Low Power Mode +#define AT91C_CAN_ABM ((unsigned int) 0x1 << 2) // (CAN) Disable/Enable Autobaud/Listen Mode +#define AT91C_CAN_OVL ((unsigned int) 0x1 << 3) // (CAN) Disable/Enable Overload Frame +#define AT91C_CAN_TEOF ((unsigned int) 0x1 << 4) // (CAN) Time Stamp messages at each end of Frame +#define AT91C_CAN_TTM ((unsigned int) 0x1 << 5) // (CAN) Disable/Enable Time Trigger Mode +#define AT91C_CAN_TIMFRZ ((unsigned int) 0x1 << 6) // (CAN) Enable Timer Freeze +#define AT91C_CAN_DRPT ((unsigned int) 0x1 << 7) // (CAN) Disable Repeat +// -------- CAN_IER : (CAN Offset: 0x4) CAN Interrupt Enable Register -------- +#define AT91C_CAN_MB0 ((unsigned int) 0x1 << 0) // (CAN) Mailbox 0 Flag +#define AT91C_CAN_MB1 ((unsigned int) 0x1 << 1) // (CAN) Mailbox 1 Flag +#define AT91C_CAN_MB2 ((unsigned int) 0x1 << 2) // (CAN) Mailbox 2 Flag +#define AT91C_CAN_MB3 ((unsigned int) 0x1 << 3) // (CAN) Mailbox 3 Flag +#define AT91C_CAN_MB4 ((unsigned int) 0x1 << 4) // (CAN) Mailbox 4 Flag +#define AT91C_CAN_MB5 ((unsigned int) 0x1 << 5) // (CAN) Mailbox 5 Flag +#define AT91C_CAN_MB6 ((unsigned int) 0x1 << 6) // (CAN) Mailbox 6 Flag +#define AT91C_CAN_MB7 ((unsigned int) 0x1 << 7) // (CAN) Mailbox 7 Flag +#define AT91C_CAN_MB8 ((unsigned int) 0x1 << 8) // (CAN) Mailbox 8 Flag +#define AT91C_CAN_MB9 ((unsigned int) 0x1 << 9) // (CAN) Mailbox 9 Flag +#define AT91C_CAN_MB10 ((unsigned int) 0x1 << 10) // (CAN) Mailbox 10 Flag +#define AT91C_CAN_MB11 ((unsigned int) 0x1 << 11) // (CAN) Mailbox 11 Flag +#define AT91C_CAN_MB12 ((unsigned int) 0x1 << 12) // (CAN) Mailbox 12 Flag +#define AT91C_CAN_MB13 ((unsigned int) 0x1 << 13) // (CAN) Mailbox 13 Flag +#define AT91C_CAN_MB14 ((unsigned int) 0x1 << 14) // (CAN) Mailbox 14 Flag +#define AT91C_CAN_MB15 ((unsigned int) 0x1 << 15) // (CAN) Mailbox 15 Flag +#define AT91C_CAN_ERRA ((unsigned int) 0x1 << 16) // (CAN) Error Active Mode Flag +#define AT91C_CAN_WARN ((unsigned int) 0x1 << 17) // (CAN) Warning Limit Flag +#define AT91C_CAN_ERRP ((unsigned int) 0x1 << 18) // (CAN) Error Passive Mode Flag +#define AT91C_CAN_BOFF ((unsigned int) 0x1 << 19) // (CAN) Bus Off Mode Flag +#define AT91C_CAN_SLEEP ((unsigned int) 0x1 << 20) // (CAN) Sleep Flag +#define AT91C_CAN_WAKEUP ((unsigned int) 0x1 << 21) // (CAN) Wakeup Flag +#define AT91C_CAN_TOVF ((unsigned int) 0x1 << 22) // (CAN) Timer Overflow Flag +#define AT91C_CAN_TSTP ((unsigned int) 0x1 << 23) // (CAN) Timestamp Flag +#define AT91C_CAN_CERR ((unsigned int) 0x1 << 24) // (CAN) CRC Error +#define AT91C_CAN_SERR ((unsigned int) 0x1 << 25) // (CAN) Stuffing Error +#define AT91C_CAN_AERR ((unsigned int) 0x1 << 26) // (CAN) Acknowledgment Error +#define AT91C_CAN_FERR ((unsigned int) 0x1 << 27) // (CAN) Form Error +#define AT91C_CAN_BERR ((unsigned int) 0x1 << 28) // (CAN) Bit Error +// -------- CAN_IDR : (CAN Offset: 0x8) CAN Interrupt Disable Register -------- +// -------- CAN_IMR : (CAN Offset: 0xc) CAN Interrupt Mask Register -------- +// -------- CAN_SR : (CAN Offset: 0x10) CAN Status Register -------- +#define AT91C_CAN_RBSY ((unsigned int) 0x1 << 29) // (CAN) Receiver Busy +#define AT91C_CAN_TBSY ((unsigned int) 0x1 << 30) // (CAN) Transmitter Busy +#define AT91C_CAN_OVLY ((unsigned int) 0x1 << 31) // (CAN) Overload Busy +// -------- CAN_BR : (CAN Offset: 0x14) CAN Baudrate Register -------- +#define AT91C_CAN_PHASE2 ((unsigned int) 0x7 << 0) // (CAN) Phase 2 segment +#define AT91C_CAN_PHASE1 ((unsigned int) 0x7 << 4) // (CAN) Phase 1 segment +#define AT91C_CAN_PROPAG ((unsigned int) 0x7 << 8) // (CAN) Programmation time segment +#define AT91C_CAN_SYNC ((unsigned int) 0x3 << 12) // (CAN) Re-synchronization jump width segment +#define AT91C_CAN_BRP ((unsigned int) 0x7F << 16) // (CAN) Baudrate Prescaler +#define AT91C_CAN_SMP ((unsigned int) 0x1 << 24) // (CAN) Sampling mode +// -------- CAN_TIM : (CAN Offset: 0x18) CAN Timer Register -------- +#define AT91C_CAN_TIMER ((unsigned int) 0xFFFF << 0) // (CAN) Timer field +// -------- CAN_TIMESTP : (CAN Offset: 0x1c) CAN Timestamp Register -------- +// -------- CAN_ECR : (CAN Offset: 0x20) CAN Error Counter Register -------- +#define AT91C_CAN_REC ((unsigned int) 0xFF << 0) // (CAN) Receive Error Counter +#define AT91C_CAN_TEC ((unsigned int) 0xFF << 16) // (CAN) Transmit Error Counter +// -------- CAN_TCR : (CAN Offset: 0x24) CAN Transfer Command Register -------- +#define AT91C_CAN_TIMRST ((unsigned int) 0x1 << 31) // (CAN) Timer Reset Field +// -------- CAN_ACR : (CAN Offset: 0x28) CAN Abort Command Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Ethernet MAC 10/100 +// ***************************************************************************** +typedef struct _AT91S_EMAC { + AT91_REG EMAC_NCR; // Network Control Register + AT91_REG EMAC_NCFGR; // Network Configuration Register + AT91_REG EMAC_NSR; // Network Status Register + AT91_REG Reserved0[2]; // + AT91_REG EMAC_TSR; // Transmit Status Register + AT91_REG EMAC_RBQP; // Receive Buffer Queue Pointer + AT91_REG EMAC_TBQP; // Transmit Buffer Queue Pointer + AT91_REG EMAC_RSR; // Receive Status Register + AT91_REG EMAC_ISR; // Interrupt Status Register + AT91_REG EMAC_IER; // Interrupt Enable Register + AT91_REG EMAC_IDR; // Interrupt Disable Register + AT91_REG EMAC_IMR; // Interrupt Mask Register + AT91_REG EMAC_MAN; // PHY Maintenance Register + AT91_REG EMAC_PTR; // Pause Time Register + AT91_REG EMAC_PFR; // Pause Frames received Register + AT91_REG EMAC_FTO; // Frames Transmitted OK Register + AT91_REG EMAC_SCF; // Single Collision Frame Register + AT91_REG EMAC_MCF; // Multiple Collision Frame Register + AT91_REG EMAC_FRO; // Frames Received OK Register + AT91_REG EMAC_FCSE; // Frame Check Sequence Error Register + AT91_REG EMAC_ALE; // Alignment Error Register + AT91_REG EMAC_DTF; // Deferred Transmission Frame Register + AT91_REG EMAC_LCOL; // Late Collision Register + AT91_REG EMAC_ECOL; // Excessive Collision Register + AT91_REG EMAC_TUND; // Transmit Underrun Error Register + AT91_REG EMAC_CSE; // Carrier Sense Error Register + AT91_REG EMAC_RRE; // Receive Ressource Error Register + AT91_REG EMAC_ROV; // Receive Overrun Errors Register + AT91_REG EMAC_RSE; // Receive Symbol Errors Register + AT91_REG EMAC_ELE; // Excessive Length Errors Register + AT91_REG EMAC_RJA; // Receive Jabbers Register + AT91_REG EMAC_USF; // Undersize Frames Register + AT91_REG EMAC_STE; // SQE Test Error Register + AT91_REG EMAC_RLE; // Receive Length Field Mismatch Register + AT91_REG EMAC_TPF; // Transmitted Pause Frames Register + AT91_REG EMAC_HRB; // Hash Address Bottom[31:0] + AT91_REG EMAC_HRT; // Hash Address Top[63:32] + AT91_REG EMAC_SA1L; // Specific Address 1 Bottom, First 4 bytes + AT91_REG EMAC_SA1H; // Specific Address 1 Top, Last 2 bytes + AT91_REG EMAC_SA2L; // Specific Address 2 Bottom, First 4 bytes + AT91_REG EMAC_SA2H; // Specific Address 2 Top, Last 2 bytes + AT91_REG EMAC_SA3L; // Specific Address 3 Bottom, First 4 bytes + AT91_REG EMAC_SA3H; // Specific Address 3 Top, Last 2 bytes + AT91_REG EMAC_SA4L; // Specific Address 4 Bottom, First 4 bytes + AT91_REG EMAC_SA4H; // Specific Address 4 Top, Last 2 bytes + AT91_REG EMAC_TID; // Type ID Checking Register + AT91_REG EMAC_TPQ; // Transmit Pause Quantum Register + AT91_REG EMAC_USRIO; // USER Input/Output Register + AT91_REG EMAC_WOL; // Wake On LAN Register + AT91_REG Reserved1[13]; // + AT91_REG EMAC_REV; // Revision Register +} AT91S_EMAC, *AT91PS_EMAC; + +// -------- EMAC_NCR : (EMAC Offset: 0x0) -------- +#define AT91C_EMAC_LB ((unsigned int) 0x1 << 0) // (EMAC) Loopback. Optional. When set, loopback signal is at high level. +#define AT91C_EMAC_LLB ((unsigned int) 0x1 << 1) // (EMAC) Loopback local. +#define AT91C_EMAC_RE ((unsigned int) 0x1 << 2) // (EMAC) Receive enable. +#define AT91C_EMAC_TE ((unsigned int) 0x1 << 3) // (EMAC) Transmit enable. +#define AT91C_EMAC_MPE ((unsigned int) 0x1 << 4) // (EMAC) Management port enable. +#define AT91C_EMAC_CLRSTAT ((unsigned int) 0x1 << 5) // (EMAC) Clear statistics registers. +#define AT91C_EMAC_INCSTAT ((unsigned int) 0x1 << 6) // (EMAC) Increment statistics registers. +#define AT91C_EMAC_WESTAT ((unsigned int) 0x1 << 7) // (EMAC) Write enable for statistics registers. +#define AT91C_EMAC_BP ((unsigned int) 0x1 << 8) // (EMAC) Back pressure. +#define AT91C_EMAC_TSTART ((unsigned int) 0x1 << 9) // (EMAC) Start Transmission. +#define AT91C_EMAC_THALT ((unsigned int) 0x1 << 10) // (EMAC) Transmission Halt. +#define AT91C_EMAC_TPFR ((unsigned int) 0x1 << 11) // (EMAC) Transmit pause frame +#define AT91C_EMAC_TZQ ((unsigned int) 0x1 << 12) // (EMAC) Transmit zero quantum pause frame +// -------- EMAC_NCFGR : (EMAC Offset: 0x4) Network Configuration Register -------- +#define AT91C_EMAC_SPD ((unsigned int) 0x1 << 0) // (EMAC) Speed. +#define AT91C_EMAC_FD ((unsigned int) 0x1 << 1) // (EMAC) Full duplex. +#define AT91C_EMAC_JFRAME ((unsigned int) 0x1 << 3) // (EMAC) Jumbo Frames. +#define AT91C_EMAC_CAF ((unsigned int) 0x1 << 4) // (EMAC) Copy all frames. +#define AT91C_EMAC_NBC ((unsigned int) 0x1 << 5) // (EMAC) No broadcast. +#define AT91C_EMAC_MTI ((unsigned int) 0x1 << 6) // (EMAC) Multicast hash event enable +#define AT91C_EMAC_UNI ((unsigned int) 0x1 << 7) // (EMAC) Unicast hash enable. +#define AT91C_EMAC_BIG ((unsigned int) 0x1 << 8) // (EMAC) Receive 1522 bytes. +#define AT91C_EMAC_EAE ((unsigned int) 0x1 << 9) // (EMAC) External address match enable. +#define AT91C_EMAC_CLK ((unsigned int) 0x3 << 10) // (EMAC) +#define AT91C_EMAC_CLK_HCLK_8 ((unsigned int) 0x0 << 10) // (EMAC) HCLK divided by 8 +#define AT91C_EMAC_CLK_HCLK_16 ((unsigned int) 0x1 << 10) // (EMAC) HCLK divided by 16 +#define AT91C_EMAC_CLK_HCLK_32 ((unsigned int) 0x2 << 10) // (EMAC) HCLK divided by 32 +#define AT91C_EMAC_CLK_HCLK_64 ((unsigned int) 0x3 << 10) // (EMAC) HCLK divided by 64 +#define AT91C_EMAC_RTY ((unsigned int) 0x1 << 12) // (EMAC) +#define AT91C_EMAC_PAE ((unsigned int) 0x1 << 13) // (EMAC) +#define AT91C_EMAC_RBOF ((unsigned int) 0x3 << 14) // (EMAC) +#define AT91C_EMAC_RBOF_OFFSET_0 ((unsigned int) 0x0 << 14) // (EMAC) no offset from start of receive buffer +#define AT91C_EMAC_RBOF_OFFSET_1 ((unsigned int) 0x1 << 14) // (EMAC) one byte offset from start of receive buffer +#define AT91C_EMAC_RBOF_OFFSET_2 ((unsigned int) 0x2 << 14) // (EMAC) two bytes offset from start of receive buffer +#define AT91C_EMAC_RBOF_OFFSET_3 ((unsigned int) 0x3 << 14) // (EMAC) three bytes offset from start of receive buffer +#define AT91C_EMAC_RLCE ((unsigned int) 0x1 << 16) // (EMAC) Receive Length field Checking Enable +#define AT91C_EMAC_DRFCS ((unsigned int) 0x1 << 17) // (EMAC) Discard Receive FCS +#define AT91C_EMAC_EFRHD ((unsigned int) 0x1 << 18) // (EMAC) +#define AT91C_EMAC_IRXFCS ((unsigned int) 0x1 << 19) // (EMAC) Ignore RX FCS +// -------- EMAC_NSR : (EMAC Offset: 0x8) Network Status Register -------- +#define AT91C_EMAC_LINKR ((unsigned int) 0x1 << 0) // (EMAC) +#define AT91C_EMAC_MDIO ((unsigned int) 0x1 << 1) // (EMAC) +#define AT91C_EMAC_IDLE ((unsigned int) 0x1 << 2) // (EMAC) +// -------- EMAC_TSR : (EMAC Offset: 0x14) Transmit Status Register -------- +#define AT91C_EMAC_UBR ((unsigned int) 0x1 << 0) // (EMAC) +#define AT91C_EMAC_COL ((unsigned int) 0x1 << 1) // (EMAC) +#define AT91C_EMAC_RLES ((unsigned int) 0x1 << 2) // (EMAC) +#define AT91C_EMAC_TGO ((unsigned int) 0x1 << 3) // (EMAC) Transmit Go +#define AT91C_EMAC_BEX ((unsigned int) 0x1 << 4) // (EMAC) Buffers exhausted mid frame +#define AT91C_EMAC_COMP ((unsigned int) 0x1 << 5) // (EMAC) +#define AT91C_EMAC_UND ((unsigned int) 0x1 << 6) // (EMAC) +// -------- EMAC_RSR : (EMAC Offset: 0x20) Receive Status Register -------- +#define AT91C_EMAC_BNA ((unsigned int) 0x1 << 0) // (EMAC) +#define AT91C_EMAC_REC ((unsigned int) 0x1 << 1) // (EMAC) +#define AT91C_EMAC_OVR ((unsigned int) 0x1 << 2) // (EMAC) +// -------- EMAC_ISR : (EMAC Offset: 0x24) Interrupt Status Register -------- +#define AT91C_EMAC_MFD ((unsigned int) 0x1 << 0) // (EMAC) +#define AT91C_EMAC_RCOMP ((unsigned int) 0x1 << 1) // (EMAC) +#define AT91C_EMAC_RXUBR ((unsigned int) 0x1 << 2) // (EMAC) +#define AT91C_EMAC_TXUBR ((unsigned int) 0x1 << 3) // (EMAC) +#define AT91C_EMAC_TUNDR ((unsigned int) 0x1 << 4) // (EMAC) +#define AT91C_EMAC_RLEX ((unsigned int) 0x1 << 5) // (EMAC) +#define AT91C_EMAC_TXERR ((unsigned int) 0x1 << 6) // (EMAC) +#define AT91C_EMAC_TCOMP ((unsigned int) 0x1 << 7) // (EMAC) +#define AT91C_EMAC_LINK ((unsigned int) 0x1 << 9) // (EMAC) +#define AT91C_EMAC_ROVR ((unsigned int) 0x1 << 10) // (EMAC) +#define AT91C_EMAC_HRESP ((unsigned int) 0x1 << 11) // (EMAC) +#define AT91C_EMAC_PFRE ((unsigned int) 0x1 << 12) // (EMAC) +#define AT91C_EMAC_PTZ ((unsigned int) 0x1 << 13) // (EMAC) +// -------- EMAC_IER : (EMAC Offset: 0x28) Interrupt Enable Register -------- +// -------- EMAC_IDR : (EMAC Offset: 0x2c) Interrupt Disable Register -------- +// -------- EMAC_IMR : (EMAC Offset: 0x30) Interrupt Mask Register -------- +// -------- EMAC_MAN : (EMAC Offset: 0x34) PHY Maintenance Register -------- +#define AT91C_EMAC_DATA ((unsigned int) 0xFFFF << 0) // (EMAC) +#define AT91C_EMAC_CODE ((unsigned int) 0x3 << 16) // (EMAC) +#define AT91C_EMAC_REGA ((unsigned int) 0x1F << 18) // (EMAC) +#define AT91C_EMAC_PHYA ((unsigned int) 0x1F << 23) // (EMAC) +#define AT91C_EMAC_RW ((unsigned int) 0x3 << 28) // (EMAC) +#define AT91C_EMAC_SOF ((unsigned int) 0x3 << 30) // (EMAC) +// -------- EMAC_USRIO : (EMAC Offset: 0xc0) USER Input Output Register -------- +#define AT91C_EMAC_RMII ((unsigned int) 0x1 << 0) // (EMAC) Reduce MII +// -------- EMAC_WOL : (EMAC Offset: 0xc4) Wake On LAN Register -------- +#define AT91C_EMAC_IP ((unsigned int) 0xFFFF << 0) // (EMAC) ARP request IP address +#define AT91C_EMAC_MAG ((unsigned int) 0x1 << 16) // (EMAC) Magic packet event enable +#define AT91C_EMAC_ARP ((unsigned int) 0x1 << 17) // (EMAC) ARP request event enable +#define AT91C_EMAC_SA1 ((unsigned int) 0x1 << 18) // (EMAC) Specific address register 1 event enable +// -------- EMAC_REV : (EMAC Offset: 0xfc) Revision Register -------- +#define AT91C_EMAC_REVREF ((unsigned int) 0xFFFF << 0) // (EMAC) +#define AT91C_EMAC_PARTREF ((unsigned int) 0xFFFF << 16) // (EMAC) + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Analog to Digital Convertor +// ***************************************************************************** +typedef struct _AT91S_ADC { + AT91_REG ADC_CR; // ADC Control Register + AT91_REG ADC_MR; // ADC Mode Register + AT91_REG Reserved0[2]; // + AT91_REG ADC_CHER; // ADC Channel Enable Register + AT91_REG ADC_CHDR; // ADC Channel Disable Register + AT91_REG ADC_CHSR; // ADC Channel Status Register + AT91_REG ADC_SR; // ADC Status Register + AT91_REG ADC_LCDR; // ADC Last Converted Data Register + AT91_REG ADC_IER; // ADC Interrupt Enable Register + AT91_REG ADC_IDR; // ADC Interrupt Disable Register + AT91_REG ADC_IMR; // ADC Interrupt Mask Register + AT91_REG ADC_CDR0; // ADC Channel Data Register 0 + AT91_REG ADC_CDR1; // ADC Channel Data Register 1 + AT91_REG ADC_CDR2; // ADC Channel Data Register 2 + AT91_REG ADC_CDR3; // ADC Channel Data Register 3 + AT91_REG ADC_CDR4; // ADC Channel Data Register 4 + AT91_REG ADC_CDR5; // ADC Channel Data Register 5 + AT91_REG ADC_CDR6; // ADC Channel Data Register 6 + AT91_REG ADC_CDR7; // ADC Channel Data Register 7 + AT91_REG Reserved1[44]; // + AT91_REG ADC_RPR; // Receive Pointer Register + AT91_REG ADC_RCR; // Receive Counter Register + AT91_REG ADC_TPR; // Transmit Pointer Register + AT91_REG ADC_TCR; // Transmit Counter Register + AT91_REG ADC_RNPR; // Receive Next Pointer Register + AT91_REG ADC_RNCR; // Receive Next Counter Register + AT91_REG ADC_TNPR; // Transmit Next Pointer Register + AT91_REG ADC_TNCR; // Transmit Next Counter Register + AT91_REG ADC_PTCR; // PDC Transfer Control Register + AT91_REG ADC_PTSR; // PDC Transfer Status Register +} AT91S_ADC, *AT91PS_ADC; + +// -------- ADC_CR : (ADC Offset: 0x0) ADC Control Register -------- +#define AT91C_ADC_SWRST ((unsigned int) 0x1 << 0) // (ADC) Software Reset +#define AT91C_ADC_START ((unsigned int) 0x1 << 1) // (ADC) Start Conversion +// -------- ADC_MR : (ADC Offset: 0x4) ADC Mode Register -------- +#define AT91C_ADC_TRGEN ((unsigned int) 0x1 << 0) // (ADC) Trigger Enable +#define AT91C_ADC_TRGEN_DIS ((unsigned int) 0x0) // (ADC) Hradware triggers are disabled. Starting a conversion is only possible by software +#define AT91C_ADC_TRGEN_EN ((unsigned int) 0x1) // (ADC) Hardware trigger selected by TRGSEL field is enabled. +#define AT91C_ADC_TRGSEL ((unsigned int) 0x7 << 1) // (ADC) Trigger Selection +#define AT91C_ADC_TRGSEL_TIOA0 ((unsigned int) 0x0 << 1) // (ADC) Selected TRGSEL = TIAO0 +#define AT91C_ADC_TRGSEL_TIOA1 ((unsigned int) 0x1 << 1) // (ADC) Selected TRGSEL = TIAO1 +#define AT91C_ADC_TRGSEL_TIOA2 ((unsigned int) 0x2 << 1) // (ADC) Selected TRGSEL = TIAO2 +#define AT91C_ADC_TRGSEL_TIOA3 ((unsigned int) 0x3 << 1) // (ADC) Selected TRGSEL = TIAO3 +#define AT91C_ADC_TRGSEL_TIOA4 ((unsigned int) 0x4 << 1) // (ADC) Selected TRGSEL = TIAO4 +#define AT91C_ADC_TRGSEL_TIOA5 ((unsigned int) 0x5 << 1) // (ADC) Selected TRGSEL = TIAO5 +#define AT91C_ADC_TRGSEL_EXT ((unsigned int) 0x6 << 1) // (ADC) Selected TRGSEL = External Trigger +#define AT91C_ADC_LOWRES ((unsigned int) 0x1 << 4) // (ADC) Resolution. +#define AT91C_ADC_LOWRES_10_BIT ((unsigned int) 0x0 << 4) // (ADC) 10-bit resolution +#define AT91C_ADC_LOWRES_8_BIT ((unsigned int) 0x1 << 4) // (ADC) 8-bit resolution +#define AT91C_ADC_SLEEP ((unsigned int) 0x1 << 5) // (ADC) Sleep Mode +#define AT91C_ADC_SLEEP_NORMAL_MODE ((unsigned int) 0x0 << 5) // (ADC) Normal Mode +#define AT91C_ADC_SLEEP_MODE ((unsigned int) 0x1 << 5) // (ADC) Sleep Mode +#define AT91C_ADC_PRESCAL ((unsigned int) 0x3F << 8) // (ADC) Prescaler rate selection +#define AT91C_ADC_STARTUP ((unsigned int) 0x1F << 16) // (ADC) Startup Time +#define AT91C_ADC_SHTIM ((unsigned int) 0xF << 24) // (ADC) Sample & Hold Time +// -------- ADC_CHER : (ADC Offset: 0x10) ADC Channel Enable Register -------- +#define AT91C_ADC_CH0 ((unsigned int) 0x1 << 0) // (ADC) Channel 0 +#define AT91C_ADC_CH1 ((unsigned int) 0x1 << 1) // (ADC) Channel 1 +#define AT91C_ADC_CH2 ((unsigned int) 0x1 << 2) // (ADC) Channel 2 +#define AT91C_ADC_CH3 ((unsigned int) 0x1 << 3) // (ADC) Channel 3 +#define AT91C_ADC_CH4 ((unsigned int) 0x1 << 4) // (ADC) Channel 4 +#define AT91C_ADC_CH5 ((unsigned int) 0x1 << 5) // (ADC) Channel 5 +#define AT91C_ADC_CH6 ((unsigned int) 0x1 << 6) // (ADC) Channel 6 +#define AT91C_ADC_CH7 ((unsigned int) 0x1 << 7) // (ADC) Channel 7 +// -------- ADC_CHDR : (ADC Offset: 0x14) ADC Channel Disable Register -------- +// -------- ADC_CHSR : (ADC Offset: 0x18) ADC Channel Status Register -------- +// -------- ADC_SR : (ADC Offset: 0x1c) ADC Status Register -------- +#define AT91C_ADC_EOC0 ((unsigned int) 0x1 << 0) // (ADC) End of Conversion +#define AT91C_ADC_EOC1 ((unsigned int) 0x1 << 1) // (ADC) End of Conversion +#define AT91C_ADC_EOC2 ((unsigned int) 0x1 << 2) // (ADC) End of Conversion +#define AT91C_ADC_EOC3 ((unsigned int) 0x1 << 3) // (ADC) End of Conversion +#define AT91C_ADC_EOC4 ((unsigned int) 0x1 << 4) // (ADC) End of Conversion +#define AT91C_ADC_EOC5 ((unsigned int) 0x1 << 5) // (ADC) End of Conversion +#define AT91C_ADC_EOC6 ((unsigned int) 0x1 << 6) // (ADC) End of Conversion +#define AT91C_ADC_EOC7 ((unsigned int) 0x1 << 7) // (ADC) End of Conversion +#define AT91C_ADC_OVRE0 ((unsigned int) 0x1 << 8) // (ADC) Overrun Error +#define AT91C_ADC_OVRE1 ((unsigned int) 0x1 << 9) // (ADC) Overrun Error +#define AT91C_ADC_OVRE2 ((unsigned int) 0x1 << 10) // (ADC) Overrun Error +#define AT91C_ADC_OVRE3 ((unsigned int) 0x1 << 11) // (ADC) Overrun Error +#define AT91C_ADC_OVRE4 ((unsigned int) 0x1 << 12) // (ADC) Overrun Error +#define AT91C_ADC_OVRE5 ((unsigned int) 0x1 << 13) // (ADC) Overrun Error +#define AT91C_ADC_OVRE6 ((unsigned int) 0x1 << 14) // (ADC) Overrun Error +#define AT91C_ADC_OVRE7 ((unsigned int) 0x1 << 15) // (ADC) Overrun Error +#define AT91C_ADC_DRDY ((unsigned int) 0x1 << 16) // (ADC) Data Ready +#define AT91C_ADC_GOVRE ((unsigned int) 0x1 << 17) // (ADC) General Overrun +#define AT91C_ADC_ENDRX ((unsigned int) 0x1 << 18) // (ADC) End of Receiver Transfer +#define AT91C_ADC_RXBUFF ((unsigned int) 0x1 << 19) // (ADC) RXBUFF Interrupt +// -------- ADC_LCDR : (ADC Offset: 0x20) ADC Last Converted Data Register -------- +#define AT91C_ADC_LDATA ((unsigned int) 0x3FF << 0) // (ADC) Last Data Converted +// -------- ADC_IER : (ADC Offset: 0x24) ADC Interrupt Enable Register -------- +// -------- ADC_IDR : (ADC Offset: 0x28) ADC Interrupt Disable Register -------- +// -------- ADC_IMR : (ADC Offset: 0x2c) ADC Interrupt Mask Register -------- +// -------- ADC_CDR0 : (ADC Offset: 0x30) ADC Channel Data Register 0 -------- +#define AT91C_ADC_DATA ((unsigned int) 0x3FF << 0) // (ADC) Converted Data +// -------- ADC_CDR1 : (ADC Offset: 0x34) ADC Channel Data Register 1 -------- +// -------- ADC_CDR2 : (ADC Offset: 0x38) ADC Channel Data Register 2 -------- +// -------- ADC_CDR3 : (ADC Offset: 0x3c) ADC Channel Data Register 3 -------- +// -------- ADC_CDR4 : (ADC Offset: 0x40) ADC Channel Data Register 4 -------- +// -------- ADC_CDR5 : (ADC Offset: 0x44) ADC Channel Data Register 5 -------- +// -------- ADC_CDR6 : (ADC Offset: 0x48) ADC Channel Data Register 6 -------- +// -------- ADC_CDR7 : (ADC Offset: 0x4c) ADC Channel Data Register 7 -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Advanced Encryption Standard +// ***************************************************************************** +typedef struct _AT91S_AES { + AT91_REG AES_CR; // Control Register + AT91_REG AES_MR; // Mode Register + AT91_REG Reserved0[2]; // + AT91_REG AES_IER; // Interrupt Enable Register + AT91_REG AES_IDR; // Interrupt Disable Register + AT91_REG AES_IMR; // Interrupt Mask Register + AT91_REG AES_ISR; // Interrupt Status Register + AT91_REG AES_KEYWxR[4]; // Key Word x Register + AT91_REG Reserved1[4]; // + AT91_REG AES_IDATAxR[4]; // Input Data x Register + AT91_REG AES_ODATAxR[4]; // Output Data x Register + AT91_REG AES_IVxR[4]; // Initialization Vector x Register + AT91_REG Reserved2[35]; // + AT91_REG AES_VR; // AES Version Register + AT91_REG AES_RPR; // Receive Pointer Register + AT91_REG AES_RCR; // Receive Counter Register + AT91_REG AES_TPR; // Transmit Pointer Register + AT91_REG AES_TCR; // Transmit Counter Register + AT91_REG AES_RNPR; // Receive Next Pointer Register + AT91_REG AES_RNCR; // Receive Next Counter Register + AT91_REG AES_TNPR; // Transmit Next Pointer Register + AT91_REG AES_TNCR; // Transmit Next Counter Register + AT91_REG AES_PTCR; // PDC Transfer Control Register + AT91_REG AES_PTSR; // PDC Transfer Status Register +} AT91S_AES, *AT91PS_AES; + +// -------- AES_CR : (AES Offset: 0x0) Control Register -------- +#define AT91C_AES_START ((unsigned int) 0x1 << 0) // (AES) Starts Processing +#define AT91C_AES_SWRST ((unsigned int) 0x1 << 8) // (AES) Software Reset +#define AT91C_AES_LOADSEED ((unsigned int) 0x1 << 16) // (AES) Random Number Generator Seed Loading +// -------- AES_MR : (AES Offset: 0x4) Mode Register -------- +#define AT91C_AES_CIPHER ((unsigned int) 0x1 << 0) // (AES) Processing Mode +#define AT91C_AES_PROCDLY ((unsigned int) 0xF << 4) // (AES) Processing Delay +#define AT91C_AES_SMOD ((unsigned int) 0x3 << 8) // (AES) Start Mode +#define AT91C_AES_SMOD_MANUAL ((unsigned int) 0x0 << 8) // (AES) Manual Mode: The START bit in register AES_CR must be set to begin encryption or decryption. +#define AT91C_AES_SMOD_AUTO ((unsigned int) 0x1 << 8) // (AES) Auto Mode: no action in AES_CR is necessary (cf datasheet). +#define AT91C_AES_SMOD_PDC ((unsigned int) 0x2 << 8) // (AES) PDC Mode (cf datasheet). +#define AT91C_AES_OPMOD ((unsigned int) 0x7 << 12) // (AES) Operation Mode +#define AT91C_AES_OPMOD_ECB ((unsigned int) 0x0 << 12) // (AES) ECB Electronic CodeBook mode. +#define AT91C_AES_OPMOD_CBC ((unsigned int) 0x1 << 12) // (AES) CBC Cipher Block Chaining mode. +#define AT91C_AES_OPMOD_OFB ((unsigned int) 0x2 << 12) // (AES) OFB Output Feedback mode. +#define AT91C_AES_OPMOD_CFB ((unsigned int) 0x3 << 12) // (AES) CFB Cipher Feedback mode. +#define AT91C_AES_OPMOD_CTR ((unsigned int) 0x4 << 12) // (AES) CTR Counter mode. +#define AT91C_AES_LOD ((unsigned int) 0x1 << 15) // (AES) Last Output Data Mode +#define AT91C_AES_CFBS ((unsigned int) 0x7 << 16) // (AES) Cipher Feedback Data Size +#define AT91C_AES_CFBS_128_BIT ((unsigned int) 0x0 << 16) // (AES) 128-bit. +#define AT91C_AES_CFBS_64_BIT ((unsigned int) 0x1 << 16) // (AES) 64-bit. +#define AT91C_AES_CFBS_32_BIT ((unsigned int) 0x2 << 16) // (AES) 32-bit. +#define AT91C_AES_CFBS_16_BIT ((unsigned int) 0x3 << 16) // (AES) 16-bit. +#define AT91C_AES_CFBS_8_BIT ((unsigned int) 0x4 << 16) // (AES) 8-bit. +#define AT91C_AES_CKEY ((unsigned int) 0xF << 20) // (AES) Countermeasure Key +#define AT91C_AES_CTYPE ((unsigned int) 0x1F << 24) // (AES) Countermeasure Type +#define AT91C_AES_CTYPE_TYPE1_EN ((unsigned int) 0x1 << 24) // (AES) Countermeasure type 1 is enabled. +#define AT91C_AES_CTYPE_TYPE2_EN ((unsigned int) 0x2 << 24) // (AES) Countermeasure type 2 is enabled. +#define AT91C_AES_CTYPE_TYPE3_EN ((unsigned int) 0x4 << 24) // (AES) Countermeasure type 3 is enabled. +#define AT91C_AES_CTYPE_TYPE4_EN ((unsigned int) 0x8 << 24) // (AES) Countermeasure type 4 is enabled. +#define AT91C_AES_CTYPE_TYPE5_EN ((unsigned int) 0x10 << 24) // (AES) Countermeasure type 5 is enabled. +// -------- AES_IER : (AES Offset: 0x10) Interrupt Enable Register -------- +#define AT91C_AES_DATRDY ((unsigned int) 0x1 << 0) // (AES) DATRDY +#define AT91C_AES_ENDRX ((unsigned int) 0x1 << 1) // (AES) PDC Read Buffer End +#define AT91C_AES_ENDTX ((unsigned int) 0x1 << 2) // (AES) PDC Write Buffer End +#define AT91C_AES_RXBUFF ((unsigned int) 0x1 << 3) // (AES) PDC Read Buffer Full +#define AT91C_AES_TXBUFE ((unsigned int) 0x1 << 4) // (AES) PDC Write Buffer Empty +#define AT91C_AES_URAD ((unsigned int) 0x1 << 8) // (AES) Unspecified Register Access Detection +// -------- AES_IDR : (AES Offset: 0x14) Interrupt Disable Register -------- +// -------- AES_IMR : (AES Offset: 0x18) Interrupt Mask Register -------- +// -------- AES_ISR : (AES Offset: 0x1c) Interrupt Status Register -------- +#define AT91C_AES_URAT ((unsigned int) 0x7 << 12) // (AES) Unspecified Register Access Type Status +#define AT91C_AES_URAT_IN_DAT_WRITE_DATPROC ((unsigned int) 0x0 << 12) // (AES) Input data register written during the data processing in PDC mode. +#define AT91C_AES_URAT_OUT_DAT_READ_DATPROC ((unsigned int) 0x1 << 12) // (AES) Output data register read during the data processing. +#define AT91C_AES_URAT_MODEREG_WRITE_DATPROC ((unsigned int) 0x2 << 12) // (AES) Mode register written during the data processing. +#define AT91C_AES_URAT_OUT_DAT_READ_SUBKEY ((unsigned int) 0x3 << 12) // (AES) Output data register read during the sub-keys generation. +#define AT91C_AES_URAT_MODEREG_WRITE_SUBKEY ((unsigned int) 0x4 << 12) // (AES) Mode register written during the sub-keys generation. +#define AT91C_AES_URAT_WO_REG_READ ((unsigned int) 0x5 << 12) // (AES) Write-only register read access. + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Triple Data Encryption Standard +// ***************************************************************************** +typedef struct _AT91S_TDES { + AT91_REG TDES_CR; // Control Register + AT91_REG TDES_MR; // Mode Register + AT91_REG Reserved0[2]; // + AT91_REG TDES_IER; // Interrupt Enable Register + AT91_REG TDES_IDR; // Interrupt Disable Register + AT91_REG TDES_IMR; // Interrupt Mask Register + AT91_REG TDES_ISR; // Interrupt Status Register + AT91_REG TDES_KEY1WxR[2]; // Key 1 Word x Register + AT91_REG TDES_KEY2WxR[2]; // Key 2 Word x Register + AT91_REG TDES_KEY3WxR[2]; // Key 3 Word x Register + AT91_REG Reserved1[2]; // + AT91_REG TDES_IDATAxR[2]; // Input Data x Register + AT91_REG Reserved2[2]; // + AT91_REG TDES_ODATAxR[2]; // Output Data x Register + AT91_REG Reserved3[2]; // + AT91_REG TDES_IVxR[2]; // Initialization Vector x Register + AT91_REG Reserved4[37]; // + AT91_REG TDES_VR; // TDES Version Register + AT91_REG TDES_RPR; // Receive Pointer Register + AT91_REG TDES_RCR; // Receive Counter Register + AT91_REG TDES_TPR; // Transmit Pointer Register + AT91_REG TDES_TCR; // Transmit Counter Register + AT91_REG TDES_RNPR; // Receive Next Pointer Register + AT91_REG TDES_RNCR; // Receive Next Counter Register + AT91_REG TDES_TNPR; // Transmit Next Pointer Register + AT91_REG TDES_TNCR; // Transmit Next Counter Register + AT91_REG TDES_PTCR; // PDC Transfer Control Register + AT91_REG TDES_PTSR; // PDC Transfer Status Register +} AT91S_TDES, *AT91PS_TDES; + +// -------- TDES_CR : (TDES Offset: 0x0) Control Register -------- +#define AT91C_TDES_START ((unsigned int) 0x1 << 0) // (TDES) Starts Processing +#define AT91C_TDES_SWRST ((unsigned int) 0x1 << 8) // (TDES) Software Reset +// -------- TDES_MR : (TDES Offset: 0x4) Mode Register -------- +#define AT91C_TDES_CIPHER ((unsigned int) 0x1 << 0) // (TDES) Processing Mode +#define AT91C_TDES_TDESMOD ((unsigned int) 0x1 << 1) // (TDES) Single or Triple DES Mode +#define AT91C_TDES_KEYMOD ((unsigned int) 0x1 << 4) // (TDES) Key Mode +#define AT91C_TDES_SMOD ((unsigned int) 0x3 << 8) // (TDES) Start Mode +#define AT91C_TDES_SMOD_MANUAL ((unsigned int) 0x0 << 8) // (TDES) Manual Mode: The START bit in register TDES_CR must be set to begin encryption or decryption. +#define AT91C_TDES_SMOD_AUTO ((unsigned int) 0x1 << 8) // (TDES) Auto Mode: no action in TDES_CR is necessary (cf datasheet). +#define AT91C_TDES_SMOD_PDC ((unsigned int) 0x2 << 8) // (TDES) PDC Mode (cf datasheet). +#define AT91C_TDES_OPMOD ((unsigned int) 0x3 << 12) // (TDES) Operation Mode +#define AT91C_TDES_OPMOD_ECB ((unsigned int) 0x0 << 12) // (TDES) ECB Electronic CodeBook mode. +#define AT91C_TDES_OPMOD_CBC ((unsigned int) 0x1 << 12) // (TDES) CBC Cipher Block Chaining mode. +#define AT91C_TDES_OPMOD_OFB ((unsigned int) 0x2 << 12) // (TDES) OFB Output Feedback mode. +#define AT91C_TDES_OPMOD_CFB ((unsigned int) 0x3 << 12) // (TDES) CFB Cipher Feedback mode. +#define AT91C_TDES_LOD ((unsigned int) 0x1 << 15) // (TDES) Last Output Data Mode +#define AT91C_TDES_CFBS ((unsigned int) 0x3 << 16) // (TDES) Cipher Feedback Data Size +#define AT91C_TDES_CFBS_64_BIT ((unsigned int) 0x0 << 16) // (TDES) 64-bit. +#define AT91C_TDES_CFBS_32_BIT ((unsigned int) 0x1 << 16) // (TDES) 32-bit. +#define AT91C_TDES_CFBS_16_BIT ((unsigned int) 0x2 << 16) // (TDES) 16-bit. +#define AT91C_TDES_CFBS_8_BIT ((unsigned int) 0x3 << 16) // (TDES) 8-bit. +// -------- TDES_IER : (TDES Offset: 0x10) Interrupt Enable Register -------- +#define AT91C_TDES_DATRDY ((unsigned int) 0x1 << 0) // (TDES) DATRDY +#define AT91C_TDES_ENDRX ((unsigned int) 0x1 << 1) // (TDES) PDC Read Buffer End +#define AT91C_TDES_ENDTX ((unsigned int) 0x1 << 2) // (TDES) PDC Write Buffer End +#define AT91C_TDES_RXBUFF ((unsigned int) 0x1 << 3) // (TDES) PDC Read Buffer Full +#define AT91C_TDES_TXBUFE ((unsigned int) 0x1 << 4) // (TDES) PDC Write Buffer Empty +#define AT91C_TDES_URAD ((unsigned int) 0x1 << 8) // (TDES) Unspecified Register Access Detection +// -------- TDES_IDR : (TDES Offset: 0x14) Interrupt Disable Register -------- +// -------- TDES_IMR : (TDES Offset: 0x18) Interrupt Mask Register -------- +// -------- TDES_ISR : (TDES Offset: 0x1c) Interrupt Status Register -------- +#define AT91C_TDES_URAT ((unsigned int) 0x3 << 12) // (TDES) Unspecified Register Access Type Status +#define AT91C_TDES_URAT_IN_DAT_WRITE_DATPROC ((unsigned int) 0x0 << 12) // (TDES) Input data register written during the data processing in PDC mode. +#define AT91C_TDES_URAT_OUT_DAT_READ_DATPROC ((unsigned int) 0x1 << 12) // (TDES) Output data register read during the data processing. +#define AT91C_TDES_URAT_MODEREG_WRITE_DATPROC ((unsigned int) 0x2 << 12) // (TDES) Mode register written during the data processing. +#define AT91C_TDES_URAT_WO_REG_READ ((unsigned int) 0x3 << 12) // (TDES) Write-only register read access. + +// ***************************************************************************** +// REGISTER ADDRESS DEFINITION FOR AT91SAM7X256 +// ***************************************************************************** +// ========== Register definition for SYS peripheral ========== +// ========== Register definition for AIC peripheral ========== +#define AT91C_AIC_IVR ((AT91_REG *) 0xFFFFF100) // (AIC) IRQ Vector Register +#define AT91C_AIC_SMR ((AT91_REG *) 0xFFFFF000) // (AIC) Source Mode Register +#define AT91C_AIC_FVR ((AT91_REG *) 0xFFFFF104) // (AIC) FIQ Vector Register +#define AT91C_AIC_DCR ((AT91_REG *) 0xFFFFF138) // (AIC) Debug Control Register (Protect) +#define AT91C_AIC_EOICR ((AT91_REG *) 0xFFFFF130) // (AIC) End of Interrupt Command Register +#define AT91C_AIC_SVR ((AT91_REG *) 0xFFFFF080) // (AIC) Source Vector Register +#define AT91C_AIC_FFSR ((AT91_REG *) 0xFFFFF148) // (AIC) Fast Forcing Status Register +#define AT91C_AIC_ICCR ((AT91_REG *) 0xFFFFF128) // (AIC) Interrupt Clear Command Register +#define AT91C_AIC_ISR ((AT91_REG *) 0xFFFFF108) // (AIC) Interrupt Status Register +#define AT91C_AIC_IMR ((AT91_REG *) 0xFFFFF110) // (AIC) Interrupt Mask Register +#define AT91C_AIC_IPR ((AT91_REG *) 0xFFFFF10C) // (AIC) Interrupt Pending Register +#define AT91C_AIC_FFER ((AT91_REG *) 0xFFFFF140) // (AIC) Fast Forcing Enable Register +#define AT91C_AIC_IECR ((AT91_REG *) 0xFFFFF120) // (AIC) Interrupt Enable Command Register +#define AT91C_AIC_ISCR ((AT91_REG *) 0xFFFFF12C) // (AIC) Interrupt Set Command Register +#define AT91C_AIC_FFDR ((AT91_REG *) 0xFFFFF144) // (AIC) Fast Forcing Disable Register +#define AT91C_AIC_CISR ((AT91_REG *) 0xFFFFF114) // (AIC) Core Interrupt Status Register +#define AT91C_AIC_IDCR ((AT91_REG *) 0xFFFFF124) // (AIC) Interrupt Disable Command Register +#define AT91C_AIC_SPU ((AT91_REG *) 0xFFFFF134) // (AIC) Spurious Vector Register +// ========== Register definition for PDC_DBGU peripheral ========== +#define AT91C_DBGU_TCR ((AT91_REG *) 0xFFFFF30C) // (PDC_DBGU) Transmit Counter Register +#define AT91C_DBGU_RNPR ((AT91_REG *) 0xFFFFF310) // (PDC_DBGU) Receive Next Pointer Register +#define AT91C_DBGU_TNPR ((AT91_REG *) 0xFFFFF318) // (PDC_DBGU) Transmit Next Pointer Register +#define AT91C_DBGU_TPR ((AT91_REG *) 0xFFFFF308) // (PDC_DBGU) Transmit Pointer Register +#define AT91C_DBGU_RPR ((AT91_REG *) 0xFFFFF300) // (PDC_DBGU) Receive Pointer Register +#define AT91C_DBGU_RCR ((AT91_REG *) 0xFFFFF304) // (PDC_DBGU) Receive Counter Register +#define AT91C_DBGU_RNCR ((AT91_REG *) 0xFFFFF314) // (PDC_DBGU) Receive Next Counter Register +#define AT91C_DBGU_PTCR ((AT91_REG *) 0xFFFFF320) // (PDC_DBGU) PDC Transfer Control Register +#define AT91C_DBGU_PTSR ((AT91_REG *) 0xFFFFF324) // (PDC_DBGU) PDC Transfer Status Register +#define AT91C_DBGU_TNCR ((AT91_REG *) 0xFFFFF31C) // (PDC_DBGU) Transmit Next Counter Register +// ========== Register definition for DBGU peripheral ========== +#define AT91C_DBGU_EXID ((AT91_REG *) 0xFFFFF244) // (DBGU) Chip ID Extension Register +#define AT91C_DBGU_BRGR ((AT91_REG *) 0xFFFFF220) // (DBGU) Baud Rate Generator Register +#define AT91C_DBGU_IDR ((AT91_REG *) 0xFFFFF20C) // (DBGU) Interrupt Disable Register +#define AT91C_DBGU_CSR ((AT91_REG *) 0xFFFFF214) // (DBGU) Channel Status Register +#define AT91C_DBGU_CIDR ((AT91_REG *) 0xFFFFF240) // (DBGU) Chip ID Register +#define AT91C_DBGU_MR ((AT91_REG *) 0xFFFFF204) // (DBGU) Mode Register +#define AT91C_DBGU_IMR ((AT91_REG *) 0xFFFFF210) // (DBGU) Interrupt Mask Register +#define AT91C_DBGU_CR ((AT91_REG *) 0xFFFFF200) // (DBGU) Control Register +#define AT91C_DBGU_FNTR ((AT91_REG *) 0xFFFFF248) // (DBGU) Force NTRST Register +#define AT91C_DBGU_THR ((AT91_REG *) 0xFFFFF21C) // (DBGU) Transmitter Holding Register +#define AT91C_DBGU_RHR ((AT91_REG *) 0xFFFFF218) // (DBGU) Receiver Holding Register +#define AT91C_DBGU_IER ((AT91_REG *) 0xFFFFF208) // (DBGU) Interrupt Enable Register +// ========== Register definition for PIOA peripheral ========== +#define AT91C_PIOA_ODR ((AT91_REG *) 0xFFFFF414) // (PIOA) Output Disable Registerr +#define AT91C_PIOA_SODR ((AT91_REG *) 0xFFFFF430) // (PIOA) Set Output Data Register +#define AT91C_PIOA_ISR ((AT91_REG *) 0xFFFFF44C) // (PIOA) Interrupt Status Register +#define AT91C_PIOA_ABSR ((AT91_REG *) 0xFFFFF478) // (PIOA) AB Select Status Register +#define AT91C_PIOA_IER ((AT91_REG *) 0xFFFFF440) // (PIOA) Interrupt Enable Register +#define AT91C_PIOA_PPUDR ((AT91_REG *) 0xFFFFF460) // (PIOA) Pull-up Disable Register +#define AT91C_PIOA_IMR ((AT91_REG *) 0xFFFFF448) // (PIOA) Interrupt Mask Register +#define AT91C_PIOA_PER ((AT91_REG *) 0xFFFFF400) // (PIOA) PIO Enable Register +#define AT91C_PIOA_IFDR ((AT91_REG *) 0xFFFFF424) // (PIOA) Input Filter Disable Register +#define AT91C_PIOA_OWDR ((AT91_REG *) 0xFFFFF4A4) // (PIOA) Output Write Disable Register +#define AT91C_PIOA_MDSR ((AT91_REG *) 0xFFFFF458) // (PIOA) Multi-driver Status Register +#define AT91C_PIOA_IDR ((AT91_REG *) 0xFFFFF444) // (PIOA) Interrupt Disable Register +#define AT91C_PIOA_ODSR ((AT91_REG *) 0xFFFFF438) // (PIOA) Output Data Status Register +#define AT91C_PIOA_PPUSR ((AT91_REG *) 0xFFFFF468) // (PIOA) Pull-up Status Register +#define AT91C_PIOA_OWSR ((AT91_REG *) 0xFFFFF4A8) // (PIOA) Output Write Status Register +#define AT91C_PIOA_BSR ((AT91_REG *) 0xFFFFF474) // (PIOA) Select B Register +#define AT91C_PIOA_OWER ((AT91_REG *) 0xFFFFF4A0) // (PIOA) Output Write Enable Register +#define AT91C_PIOA_IFER ((AT91_REG *) 0xFFFFF420) // (PIOA) Input Filter Enable Register +#define AT91C_PIOA_PDSR ((AT91_REG *) 0xFFFFF43C) // (PIOA) Pin Data Status Register +#define AT91C_PIOA_PPUER ((AT91_REG *) 0xFFFFF464) // (PIOA) Pull-up Enable Register +#define AT91C_PIOA_OSR ((AT91_REG *) 0xFFFFF418) // (PIOA) Output Status Register +#define AT91C_PIOA_ASR ((AT91_REG *) 0xFFFFF470) // (PIOA) Select A Register +#define AT91C_PIOA_MDDR ((AT91_REG *) 0xFFFFF454) // (PIOA) Multi-driver Disable Register +#define AT91C_PIOA_CODR ((AT91_REG *) 0xFFFFF434) // (PIOA) Clear Output Data Register +#define AT91C_PIOA_MDER ((AT91_REG *) 0xFFFFF450) // (PIOA) Multi-driver Enable Register +#define AT91C_PIOA_PDR ((AT91_REG *) 0xFFFFF404) // (PIOA) PIO Disable Register +#define AT91C_PIOA_IFSR ((AT91_REG *) 0xFFFFF428) // (PIOA) Input Filter Status Register +#define AT91C_PIOA_OER ((AT91_REG *) 0xFFFFF410) // (PIOA) Output Enable Register +#define AT91C_PIOA_PSR ((AT91_REG *) 0xFFFFF408) // (PIOA) PIO Status Register +// ========== Register definition for PIOB peripheral ========== +#define AT91C_PIOB_OWDR ((AT91_REG *) 0xFFFFF6A4) // (PIOB) Output Write Disable Register +#define AT91C_PIOB_MDER ((AT91_REG *) 0xFFFFF650) // (PIOB) Multi-driver Enable Register +#define AT91C_PIOB_PPUSR ((AT91_REG *) 0xFFFFF668) // (PIOB) Pull-up Status Register +#define AT91C_PIOB_IMR ((AT91_REG *) 0xFFFFF648) // (PIOB) Interrupt Mask Register +#define AT91C_PIOB_ASR ((AT91_REG *) 0xFFFFF670) // (PIOB) Select A Register +#define AT91C_PIOB_PPUDR ((AT91_REG *) 0xFFFFF660) // (PIOB) Pull-up Disable Register +#define AT91C_PIOB_PSR ((AT91_REG *) 0xFFFFF608) // (PIOB) PIO Status Register +#define AT91C_PIOB_IER ((AT91_REG *) 0xFFFFF640) // (PIOB) Interrupt Enable Register +#define AT91C_PIOB_CODR ((AT91_REG *) 0xFFFFF634) // (PIOB) Clear Output Data Register +#define AT91C_PIOB_OWER ((AT91_REG *) 0xFFFFF6A0) // (PIOB) Output Write Enable Register +#define AT91C_PIOB_ABSR ((AT91_REG *) 0xFFFFF678) // (PIOB) AB Select Status Register +#define AT91C_PIOB_IFDR ((AT91_REG *) 0xFFFFF624) // (PIOB) Input Filter Disable Register +#define AT91C_PIOB_PDSR ((AT91_REG *) 0xFFFFF63C) // (PIOB) Pin Data Status Register +#define AT91C_PIOB_IDR ((AT91_REG *) 0xFFFFF644) // (PIOB) Interrupt Disable Register +#define AT91C_PIOB_OWSR ((AT91_REG *) 0xFFFFF6A8) // (PIOB) Output Write Status Register +#define AT91C_PIOB_PDR ((AT91_REG *) 0xFFFFF604) // (PIOB) PIO Disable Register +#define AT91C_PIOB_ODR ((AT91_REG *) 0xFFFFF614) // (PIOB) Output Disable Registerr +#define AT91C_PIOB_IFSR ((AT91_REG *) 0xFFFFF628) // (PIOB) Input Filter Status Register +#define AT91C_PIOB_PPUER ((AT91_REG *) 0xFFFFF664) // (PIOB) Pull-up Enable Register +#define AT91C_PIOB_SODR ((AT91_REG *) 0xFFFFF630) // (PIOB) Set Output Data Register +#define AT91C_PIOB_ISR ((AT91_REG *) 0xFFFFF64C) // (PIOB) Interrupt Status Register +#define AT91C_PIOB_ODSR ((AT91_REG *) 0xFFFFF638) // (PIOB) Output Data Status Register +#define AT91C_PIOB_OSR ((AT91_REG *) 0xFFFFF618) // (PIOB) Output Status Register +#define AT91C_PIOB_MDSR ((AT91_REG *) 0xFFFFF658) // (PIOB) Multi-driver Status Register +#define AT91C_PIOB_IFER ((AT91_REG *) 0xFFFFF620) // (PIOB) Input Filter Enable Register +#define AT91C_PIOB_BSR ((AT91_REG *) 0xFFFFF674) // (PIOB) Select B Register +#define AT91C_PIOB_MDDR ((AT91_REG *) 0xFFFFF654) // (PIOB) Multi-driver Disable Register +#define AT91C_PIOB_OER ((AT91_REG *) 0xFFFFF610) // (PIOB) Output Enable Register +#define AT91C_PIOB_PER ((AT91_REG *) 0xFFFFF600) // (PIOB) PIO Enable Register +// ========== Register definition for CKGR peripheral ========== +#define AT91C_CKGR_MOR ((AT91_REG *) 0xFFFFFC20) // (CKGR) Main Oscillator Register +#define AT91C_CKGR_PLLR ((AT91_REG *) 0xFFFFFC2C) // (CKGR) PLL Register +#define AT91C_CKGR_MCFR ((AT91_REG *) 0xFFFFFC24) // (CKGR) Main Clock Frequency Register +// ========== Register definition for PMC peripheral ========== +#define AT91C_PMC_IDR ((AT91_REG *) 0xFFFFFC64) // (PMC) Interrupt Disable Register +#define AT91C_PMC_MOR ((AT91_REG *) 0xFFFFFC20) // (PMC) Main Oscillator Register +#define AT91C_PMC_PLLR ((AT91_REG *) 0xFFFFFC2C) // (PMC) PLL Register +#define AT91C_PMC_PCER ((AT91_REG *) 0xFFFFFC10) // (PMC) Peripheral Clock Enable Register +#define AT91C_PMC_PCKR ((AT91_REG *) 0xFFFFFC40) // (PMC) Programmable Clock Register +#define AT91C_PMC_MCKR ((AT91_REG *) 0xFFFFFC30) // (PMC) Master Clock Register +#define AT91C_PMC_SCDR ((AT91_REG *) 0xFFFFFC04) // (PMC) System Clock Disable Register +#define AT91C_PMC_PCDR ((AT91_REG *) 0xFFFFFC14) // (PMC) Peripheral Clock Disable Register +#define AT91C_PMC_SCSR ((AT91_REG *) 0xFFFFFC08) // (PMC) System Clock Status Register +#define AT91C_PMC_PCSR ((AT91_REG *) 0xFFFFFC18) // (PMC) Peripheral Clock Status Register +#define AT91C_PMC_MCFR ((AT91_REG *) 0xFFFFFC24) // (PMC) Main Clock Frequency Register +#define AT91C_PMC_SCER ((AT91_REG *) 0xFFFFFC00) // (PMC) System Clock Enable Register +#define AT91C_PMC_IMR ((AT91_REG *) 0xFFFFFC6C) // (PMC) Interrupt Mask Register +#define AT91C_PMC_IER ((AT91_REG *) 0xFFFFFC60) // (PMC) Interrupt Enable Register +#define AT91C_PMC_SR ((AT91_REG *) 0xFFFFFC68) // (PMC) Status Register +// ========== Register definition for RSTC peripheral ========== +#define AT91C_RSTC_RCR ((AT91_REG *) 0xFFFFFD00) // (RSTC) Reset Control Register +#define AT91C_RSTC_RMR ((AT91_REG *) 0xFFFFFD08) // (RSTC) Reset Mode Register +#define AT91C_RSTC_RSR ((AT91_REG *) 0xFFFFFD04) // (RSTC) Reset Status Register +// ========== Register definition for RTTC peripheral ========== +#define AT91C_RTTC_RTSR ((AT91_REG *) 0xFFFFFD2C) // (RTTC) Real-time Status Register +#define AT91C_RTTC_RTMR ((AT91_REG *) 0xFFFFFD20) // (RTTC) Real-time Mode Register +#define AT91C_RTTC_RTVR ((AT91_REG *) 0xFFFFFD28) // (RTTC) Real-time Value Register +#define AT91C_RTTC_RTAR ((AT91_REG *) 0xFFFFFD24) // (RTTC) Real-time Alarm Register +// ========== Register definition for PITC peripheral ========== +#define AT91C_PITC_PIVR ((AT91_REG *) 0xFFFFFD38) // (PITC) Period Interval Value Register +#define AT91C_PITC_PISR ((AT91_REG *) 0xFFFFFD34) // (PITC) Period Interval Status Register +#define AT91C_PITC_PIIR ((AT91_REG *) 0xFFFFFD3C) // (PITC) Period Interval Image Register +#define AT91C_PITC_PIMR ((AT91_REG *) 0xFFFFFD30) // (PITC) Period Interval Mode Register +// ========== Register definition for WDTC peripheral ========== +#define AT91C_WDTC_WDCR ((AT91_REG *) 0xFFFFFD40) // (WDTC) Watchdog Control Register +#define AT91C_WDTC_WDSR ((AT91_REG *) 0xFFFFFD48) // (WDTC) Watchdog Status Register +#define AT91C_WDTC_WDMR ((AT91_REG *) 0xFFFFFD44) // (WDTC) Watchdog Mode Register +// ========== Register definition for VREG peripheral ========== +#define AT91C_VREG_MR ((AT91_REG *) 0xFFFFFD60) // (VREG) Voltage Regulator Mode Register +// ========== Register definition for MC peripheral ========== +#define AT91C_MC_ASR ((AT91_REG *) 0xFFFFFF04) // (MC) MC Abort Status Register +#define AT91C_MC_RCR ((AT91_REG *) 0xFFFFFF00) // (MC) MC Remap Control Register +#define AT91C_MC_FCR ((AT91_REG *) 0xFFFFFF64) // (MC) MC Flash Command Register +#define AT91C_MC_AASR ((AT91_REG *) 0xFFFFFF08) // (MC) MC Abort Address Status Register +#define AT91C_MC_FSR ((AT91_REG *) 0xFFFFFF68) // (MC) MC Flash Status Register +#define AT91C_MC_FMR ((AT91_REG *) 0xFFFFFF60) // (MC) MC Flash Mode Register +// ========== Register definition for PDC_SPI1 peripheral ========== +#define AT91C_SPI1_PTCR ((AT91_REG *) 0xFFFE4120) // (PDC_SPI1) PDC Transfer Control Register +#define AT91C_SPI1_RPR ((AT91_REG *) 0xFFFE4100) // (PDC_SPI1) Receive Pointer Register +#define AT91C_SPI1_TNCR ((AT91_REG *) 0xFFFE411C) // (PDC_SPI1) Transmit Next Counter Register +#define AT91C_SPI1_TPR ((AT91_REG *) 0xFFFE4108) // (PDC_SPI1) Transmit Pointer Register +#define AT91C_SPI1_TNPR ((AT91_REG *) 0xFFFE4118) // (PDC_SPI1) Transmit Next Pointer Register +#define AT91C_SPI1_TCR ((AT91_REG *) 0xFFFE410C) // (PDC_SPI1) Transmit Counter Register +#define AT91C_SPI1_RCR ((AT91_REG *) 0xFFFE4104) // (PDC_SPI1) Receive Counter Register +#define AT91C_SPI1_RNPR ((AT91_REG *) 0xFFFE4110) // (PDC_SPI1) Receive Next Pointer Register +#define AT91C_SPI1_RNCR ((AT91_REG *) 0xFFFE4114) // (PDC_SPI1) Receive Next Counter Register +#define AT91C_SPI1_PTSR ((AT91_REG *) 0xFFFE4124) // (PDC_SPI1) PDC Transfer Status Register +// ========== Register definition for SPI1 peripheral ========== +#define AT91C_SPI1_IMR ((AT91_REG *) 0xFFFE401C) // (SPI1) Interrupt Mask Register +#define AT91C_SPI1_IER ((AT91_REG *) 0xFFFE4014) // (SPI1) Interrupt Enable Register +#define AT91C_SPI1_MR ((AT91_REG *) 0xFFFE4004) // (SPI1) Mode Register +#define AT91C_SPI1_RDR ((AT91_REG *) 0xFFFE4008) // (SPI1) Receive Data Register +#define AT91C_SPI1_IDR ((AT91_REG *) 0xFFFE4018) // (SPI1) Interrupt Disable Register +#define AT91C_SPI1_SR ((AT91_REG *) 0xFFFE4010) // (SPI1) Status Register +#define AT91C_SPI1_TDR ((AT91_REG *) 0xFFFE400C) // (SPI1) Transmit Data Register +#define AT91C_SPI1_CR ((AT91_REG *) 0xFFFE4000) // (SPI1) Control Register +#define AT91C_SPI1_CSR ((AT91_REG *) 0xFFFE4030) // (SPI1) Chip Select Register +// ========== Register definition for PDC_SPI0 peripheral ========== +#define AT91C_SPI0_PTCR ((AT91_REG *) 0xFFFE0120) // (PDC_SPI0) PDC Transfer Control Register +#define AT91C_SPI0_TPR ((AT91_REG *) 0xFFFE0108) // (PDC_SPI0) Transmit Pointer Register +#define AT91C_SPI0_TCR ((AT91_REG *) 0xFFFE010C) // (PDC_SPI0) Transmit Counter Register +#define AT91C_SPI0_RCR ((AT91_REG *) 0xFFFE0104) // (PDC_SPI0) Receive Counter Register +#define AT91C_SPI0_PTSR ((AT91_REG *) 0xFFFE0124) // (PDC_SPI0) PDC Transfer Status Register +#define AT91C_SPI0_RNPR ((AT91_REG *) 0xFFFE0110) // (PDC_SPI0) Receive Next Pointer Register +#define AT91C_SPI0_RPR ((AT91_REG *) 0xFFFE0100) // (PDC_SPI0) Receive Pointer Register +#define AT91C_SPI0_TNCR ((AT91_REG *) 0xFFFE011C) // (PDC_SPI0) Transmit Next Counter Register +#define AT91C_SPI0_RNCR ((AT91_REG *) 0xFFFE0114) // (PDC_SPI0) Receive Next Counter Register +#define AT91C_SPI0_TNPR ((AT91_REG *) 0xFFFE0118) // (PDC_SPI0) Transmit Next Pointer Register +// ========== Register definition for SPI0 peripheral ========== +#define AT91C_SPI0_IER ((AT91_REG *) 0xFFFE0014) // (SPI0) Interrupt Enable Register +#define AT91C_SPI0_SR ((AT91_REG *) 0xFFFE0010) // (SPI0) Status Register +#define AT91C_SPI0_IDR ((AT91_REG *) 0xFFFE0018) // (SPI0) Interrupt Disable Register +#define AT91C_SPI0_CR ((AT91_REG *) 0xFFFE0000) // (SPI0) Control Register +#define AT91C_SPI0_MR ((AT91_REG *) 0xFFFE0004) // (SPI0) Mode Register +#define AT91C_SPI0_IMR ((AT91_REG *) 0xFFFE001C) // (SPI0) Interrupt Mask Register +#define AT91C_SPI0_TDR ((AT91_REG *) 0xFFFE000C) // (SPI0) Transmit Data Register +#define AT91C_SPI0_RDR ((AT91_REG *) 0xFFFE0008) // (SPI0) Receive Data Register +#define AT91C_SPI0_CSR ((AT91_REG *) 0xFFFE0030) // (SPI0) Chip Select Register +// ========== Register definition for PDC_US1 peripheral ========== +#define AT91C_US1_RNCR ((AT91_REG *) 0xFFFC4114) // (PDC_US1) Receive Next Counter Register +#define AT91C_US1_PTCR ((AT91_REG *) 0xFFFC4120) // (PDC_US1) PDC Transfer Control Register +#define AT91C_US1_TCR ((AT91_REG *) 0xFFFC410C) // (PDC_US1) Transmit Counter Register +#define AT91C_US1_PTSR ((AT91_REG *) 0xFFFC4124) // (PDC_US1) PDC Transfer Status Register +#define AT91C_US1_TNPR ((AT91_REG *) 0xFFFC4118) // (PDC_US1) Transmit Next Pointer Register +#define AT91C_US1_RCR ((AT91_REG *) 0xFFFC4104) // (PDC_US1) Receive Counter Register +#define AT91C_US1_RNPR ((AT91_REG *) 0xFFFC4110) // (PDC_US1) Receive Next Pointer Register +#define AT91C_US1_RPR ((AT91_REG *) 0xFFFC4100) // (PDC_US1) Receive Pointer Register +#define AT91C_US1_TNCR ((AT91_REG *) 0xFFFC411C) // (PDC_US1) Transmit Next Counter Register +#define AT91C_US1_TPR ((AT91_REG *) 0xFFFC4108) // (PDC_US1) Transmit Pointer Register +// ========== Register definition for US1 peripheral ========== +#define AT91C_US1_IF ((AT91_REG *) 0xFFFC404C) // (US1) IRDA_FILTER Register +#define AT91C_US1_NER ((AT91_REG *) 0xFFFC4044) // (US1) Nb Errors Register +#define AT91C_US1_RTOR ((AT91_REG *) 0xFFFC4024) // (US1) Receiver Time-out Register +#define AT91C_US1_CSR ((AT91_REG *) 0xFFFC4014) // (US1) Channel Status Register +#define AT91C_US1_IDR ((AT91_REG *) 0xFFFC400C) // (US1) Interrupt Disable Register +#define AT91C_US1_IER ((AT91_REG *) 0xFFFC4008) // (US1) Interrupt Enable Register +#define AT91C_US1_THR ((AT91_REG *) 0xFFFC401C) // (US1) Transmitter Holding Register +#define AT91C_US1_TTGR ((AT91_REG *) 0xFFFC4028) // (US1) Transmitter Time-guard Register +#define AT91C_US1_RHR ((AT91_REG *) 0xFFFC4018) // (US1) Receiver Holding Register +#define AT91C_US1_BRGR ((AT91_REG *) 0xFFFC4020) // (US1) Baud Rate Generator Register +#define AT91C_US1_IMR ((AT91_REG *) 0xFFFC4010) // (US1) Interrupt Mask Register +#define AT91C_US1_FIDI ((AT91_REG *) 0xFFFC4040) // (US1) FI_DI_Ratio Register +#define AT91C_US1_CR ((AT91_REG *) 0xFFFC4000) // (US1) Control Register +#define AT91C_US1_MR ((AT91_REG *) 0xFFFC4004) // (US1) Mode Register +// ========== Register definition for PDC_US0 peripheral ========== +#define AT91C_US0_TNPR ((AT91_REG *) 0xFFFC0118) // (PDC_US0) Transmit Next Pointer Register +#define AT91C_US0_RNPR ((AT91_REG *) 0xFFFC0110) // (PDC_US0) Receive Next Pointer Register +#define AT91C_US0_TCR ((AT91_REG *) 0xFFFC010C) // (PDC_US0) Transmit Counter Register +#define AT91C_US0_PTCR ((AT91_REG *) 0xFFFC0120) // (PDC_US0) PDC Transfer Control Register +#define AT91C_US0_PTSR ((AT91_REG *) 0xFFFC0124) // (PDC_US0) PDC Transfer Status Register +#define AT91C_US0_TNCR ((AT91_REG *) 0xFFFC011C) // (PDC_US0) Transmit Next Counter Register +#define AT91C_US0_TPR ((AT91_REG *) 0xFFFC0108) // (PDC_US0) Transmit Pointer Register +#define AT91C_US0_RCR ((AT91_REG *) 0xFFFC0104) // (PDC_US0) Receive Counter Register +#define AT91C_US0_RPR ((AT91_REG *) 0xFFFC0100) // (PDC_US0) Receive Pointer Register +#define AT91C_US0_RNCR ((AT91_REG *) 0xFFFC0114) // (PDC_US0) Receive Next Counter Register +// ========== Register definition for US0 peripheral ========== +#define AT91C_US0_BRGR ((AT91_REG *) 0xFFFC0020) // (US0) Baud Rate Generator Register +#define AT91C_US0_NER ((AT91_REG *) 0xFFFC0044) // (US0) Nb Errors Register +#define AT91C_US0_CR ((AT91_REG *) 0xFFFC0000) // (US0) Control Register +#define AT91C_US0_IMR ((AT91_REG *) 0xFFFC0010) // (US0) Interrupt Mask Register +#define AT91C_US0_FIDI ((AT91_REG *) 0xFFFC0040) // (US0) FI_DI_Ratio Register +#define AT91C_US0_TTGR ((AT91_REG *) 0xFFFC0028) // (US0) Transmitter Time-guard Register +#define AT91C_US0_MR ((AT91_REG *) 0xFFFC0004) // (US0) Mode Register +#define AT91C_US0_RTOR ((AT91_REG *) 0xFFFC0024) // (US0) Receiver Time-out Register +#define AT91C_US0_CSR ((AT91_REG *) 0xFFFC0014) // (US0) Channel Status Register +#define AT91C_US0_RHR ((AT91_REG *) 0xFFFC0018) // (US0) Receiver Holding Register +#define AT91C_US0_IDR ((AT91_REG *) 0xFFFC000C) // (US0) Interrupt Disable Register +#define AT91C_US0_THR ((AT91_REG *) 0xFFFC001C) // (US0) Transmitter Holding Register +#define AT91C_US0_IF ((AT91_REG *) 0xFFFC004C) // (US0) IRDA_FILTER Register +#define AT91C_US0_IER ((AT91_REG *) 0xFFFC0008) // (US0) Interrupt Enable Register +// ========== Register definition for PDC_SSC peripheral ========== +#define AT91C_SSC_TNCR ((AT91_REG *) 0xFFFD411C) // (PDC_SSC) Transmit Next Counter Register +#define AT91C_SSC_RPR ((AT91_REG *) 0xFFFD4100) // (PDC_SSC) Receive Pointer Register +#define AT91C_SSC_RNCR ((AT91_REG *) 0xFFFD4114) // (PDC_SSC) Receive Next Counter Register +#define AT91C_SSC_TPR ((AT91_REG *) 0xFFFD4108) // (PDC_SSC) Transmit Pointer Register +#define AT91C_SSC_PTCR ((AT91_REG *) 0xFFFD4120) // (PDC_SSC) PDC Transfer Control Register +#define AT91C_SSC_TCR ((AT91_REG *) 0xFFFD410C) // (PDC_SSC) Transmit Counter Register +#define AT91C_SSC_RCR ((AT91_REG *) 0xFFFD4104) // (PDC_SSC) Receive Counter Register +#define AT91C_SSC_RNPR ((AT91_REG *) 0xFFFD4110) // (PDC_SSC) Receive Next Pointer Register +#define AT91C_SSC_TNPR ((AT91_REG *) 0xFFFD4118) // (PDC_SSC) Transmit Next Pointer Register +#define AT91C_SSC_PTSR ((AT91_REG *) 0xFFFD4124) // (PDC_SSC) PDC Transfer Status Register +// ========== Register definition for SSC peripheral ========== +#define AT91C_SSC_RHR ((AT91_REG *) 0xFFFD4020) // (SSC) Receive Holding Register +#define AT91C_SSC_RSHR ((AT91_REG *) 0xFFFD4030) // (SSC) Receive Sync Holding Register +#define AT91C_SSC_TFMR ((AT91_REG *) 0xFFFD401C) // (SSC) Transmit Frame Mode Register +#define AT91C_SSC_IDR ((AT91_REG *) 0xFFFD4048) // (SSC) Interrupt Disable Register +#define AT91C_SSC_THR ((AT91_REG *) 0xFFFD4024) // (SSC) Transmit Holding Register +#define AT91C_SSC_RCMR ((AT91_REG *) 0xFFFD4010) // (SSC) Receive Clock ModeRegister +#define AT91C_SSC_IER ((AT91_REG *) 0xFFFD4044) // (SSC) Interrupt Enable Register +#define AT91C_SSC_TSHR ((AT91_REG *) 0xFFFD4034) // (SSC) Transmit Sync Holding Register +#define AT91C_SSC_SR ((AT91_REG *) 0xFFFD4040) // (SSC) Status Register +#define AT91C_SSC_CMR ((AT91_REG *) 0xFFFD4004) // (SSC) Clock Mode Register +#define AT91C_SSC_TCMR ((AT91_REG *) 0xFFFD4018) // (SSC) Transmit Clock Mode Register +#define AT91C_SSC_CR ((AT91_REG *) 0xFFFD4000) // (SSC) Control Register +#define AT91C_SSC_IMR ((AT91_REG *) 0xFFFD404C) // (SSC) Interrupt Mask Register +#define AT91C_SSC_RFMR ((AT91_REG *) 0xFFFD4014) // (SSC) Receive Frame Mode Register +// ========== Register definition for TWI peripheral ========== +#define AT91C_TWI_IER ((AT91_REG *) 0xFFFB8024) // (TWI) Interrupt Enable Register +#define AT91C_TWI_CR ((AT91_REG *) 0xFFFB8000) // (TWI) Control Register +#define AT91C_TWI_SR ((AT91_REG *) 0xFFFB8020) // (TWI) Status Register +#define AT91C_TWI_IMR ((AT91_REG *) 0xFFFB802C) // (TWI) Interrupt Mask Register +#define AT91C_TWI_THR ((AT91_REG *) 0xFFFB8034) // (TWI) Transmit Holding Register +#define AT91C_TWI_IDR ((AT91_REG *) 0xFFFB8028) // (TWI) Interrupt Disable Register +#define AT91C_TWI_IADR ((AT91_REG *) 0xFFFB800C) // (TWI) Internal Address Register +#define AT91C_TWI_MMR ((AT91_REG *) 0xFFFB8004) // (TWI) Master Mode Register +#define AT91C_TWI_CWGR ((AT91_REG *) 0xFFFB8010) // (TWI) Clock Waveform Generator Register +#define AT91C_TWI_RHR ((AT91_REG *) 0xFFFB8030) // (TWI) Receive Holding Register +// ========== Register definition for PWMC_CH3 peripheral ========== +#define AT91C_PWMC_CH3_CUPDR ((AT91_REG *) 0xFFFCC270) // (PWMC_CH3) Channel Update Register +#define AT91C_PWMC_CH3_Reserved ((AT91_REG *) 0xFFFCC274) // (PWMC_CH3) Reserved +#define AT91C_PWMC_CH3_CPRDR ((AT91_REG *) 0xFFFCC268) // (PWMC_CH3) Channel Period Register +#define AT91C_PWMC_CH3_CDTYR ((AT91_REG *) 0xFFFCC264) // (PWMC_CH3) Channel Duty Cycle Register +#define AT91C_PWMC_CH3_CCNTR ((AT91_REG *) 0xFFFCC26C) // (PWMC_CH3) Channel Counter Register +#define AT91C_PWMC_CH3_CMR ((AT91_REG *) 0xFFFCC260) // (PWMC_CH3) Channel Mode Register +// ========== Register definition for PWMC_CH2 peripheral ========== +#define AT91C_PWMC_CH2_Reserved ((AT91_REG *) 0xFFFCC254) // (PWMC_CH2) Reserved +#define AT91C_PWMC_CH2_CMR ((AT91_REG *) 0xFFFCC240) // (PWMC_CH2) Channel Mode Register +#define AT91C_PWMC_CH2_CCNTR ((AT91_REG *) 0xFFFCC24C) // (PWMC_CH2) Channel Counter Register +#define AT91C_PWMC_CH2_CPRDR ((AT91_REG *) 0xFFFCC248) // (PWMC_CH2) Channel Period Register +#define AT91C_PWMC_CH2_CUPDR ((AT91_REG *) 0xFFFCC250) // (PWMC_CH2) Channel Update Register +#define AT91C_PWMC_CH2_CDTYR ((AT91_REG *) 0xFFFCC244) // (PWMC_CH2) Channel Duty Cycle Register +// ========== Register definition for PWMC_CH1 peripheral ========== +#define AT91C_PWMC_CH1_Reserved ((AT91_REG *) 0xFFFCC234) // (PWMC_CH1) Reserved +#define AT91C_PWMC_CH1_CUPDR ((AT91_REG *) 0xFFFCC230) // (PWMC_CH1) Channel Update Register +#define AT91C_PWMC_CH1_CPRDR ((AT91_REG *) 0xFFFCC228) // (PWMC_CH1) Channel Period Register +#define AT91C_PWMC_CH1_CCNTR ((AT91_REG *) 0xFFFCC22C) // (PWMC_CH1) Channel Counter Register +#define AT91C_PWMC_CH1_CDTYR ((AT91_REG *) 0xFFFCC224) // (PWMC_CH1) Channel Duty Cycle Register +#define AT91C_PWMC_CH1_CMR ((AT91_REG *) 0xFFFCC220) // (PWMC_CH1) Channel Mode Register +// ========== Register definition for PWMC_CH0 peripheral ========== +#define AT91C_PWMC_CH0_Reserved ((AT91_REG *) 0xFFFCC214) // (PWMC_CH0) Reserved +#define AT91C_PWMC_CH0_CPRDR ((AT91_REG *) 0xFFFCC208) // (PWMC_CH0) Channel Period Register +#define AT91C_PWMC_CH0_CDTYR ((AT91_REG *) 0xFFFCC204) // (PWMC_CH0) Channel Duty Cycle Register +#define AT91C_PWMC_CH0_CMR ((AT91_REG *) 0xFFFCC200) // (PWMC_CH0) Channel Mode Register +#define AT91C_PWMC_CH0_CUPDR ((AT91_REG *) 0xFFFCC210) // (PWMC_CH0) Channel Update Register +#define AT91C_PWMC_CH0_CCNTR ((AT91_REG *) 0xFFFCC20C) // (PWMC_CH0) Channel Counter Register +// ========== Register definition for PWMC peripheral ========== +#define AT91C_PWMC_IDR ((AT91_REG *) 0xFFFCC014) // (PWMC) PWMC Interrupt Disable Register +#define AT91C_PWMC_DIS ((AT91_REG *) 0xFFFCC008) // (PWMC) PWMC Disable Register +#define AT91C_PWMC_IER ((AT91_REG *) 0xFFFCC010) // (PWMC) PWMC Interrupt Enable Register +#define AT91C_PWMC_VR ((AT91_REG *) 0xFFFCC0FC) // (PWMC) PWMC Version Register +#define AT91C_PWMC_ISR ((AT91_REG *) 0xFFFCC01C) // (PWMC) PWMC Interrupt Status Register +#define AT91C_PWMC_SR ((AT91_REG *) 0xFFFCC00C) // (PWMC) PWMC Status Register +#define AT91C_PWMC_IMR ((AT91_REG *) 0xFFFCC018) // (PWMC) PWMC Interrupt Mask Register +#define AT91C_PWMC_MR ((AT91_REG *) 0xFFFCC000) // (PWMC) PWMC Mode Register +#define AT91C_PWMC_ENA ((AT91_REG *) 0xFFFCC004) // (PWMC) PWMC Enable Register +// ========== Register definition for UDP peripheral ========== +#define AT91C_UDP_IMR ((AT91_REG *) 0xFFFB0018) // (UDP) Interrupt Mask Register +#define AT91C_UDP_FADDR ((AT91_REG *) 0xFFFB0008) // (UDP) Function Address Register +#define AT91C_UDP_NUM ((AT91_REG *) 0xFFFB0000) // (UDP) Frame Number Register +#define AT91C_UDP_FDR ((AT91_REG *) 0xFFFB0050) // (UDP) Endpoint FIFO Data Register +#define AT91C_UDP_ISR ((AT91_REG *) 0xFFFB001C) // (UDP) Interrupt Status Register +#define AT91C_UDP_CSR ((AT91_REG *) 0xFFFB0030) // (UDP) Endpoint Control and Status Register +#define AT91C_UDP_IDR ((AT91_REG *) 0xFFFB0014) // (UDP) Interrupt Disable Register +#define AT91C_UDP_ICR ((AT91_REG *) 0xFFFB0020) // (UDP) Interrupt Clear Register +#define AT91C_UDP_RSTEP ((AT91_REG *) 0xFFFB0028) // (UDP) Reset Endpoint Register +#define AT91C_UDP_TXVC ((AT91_REG *) 0xFFFB0074) // (UDP) Transceiver Control Register +#define AT91C_UDP_GLBSTATE ((AT91_REG *) 0xFFFB0004) // (UDP) Global State Register +#define AT91C_UDP_IER ((AT91_REG *) 0xFFFB0010) // (UDP) Interrupt Enable Register +// ========== Register definition for TC0 peripheral ========== +#define AT91C_TC0_SR ((AT91_REG *) 0xFFFA0020) // (TC0) Status Register +#define AT91C_TC0_RC ((AT91_REG *) 0xFFFA001C) // (TC0) Register C +#define AT91C_TC0_RB ((AT91_REG *) 0xFFFA0018) // (TC0) Register B +#define AT91C_TC0_CCR ((AT91_REG *) 0xFFFA0000) // (TC0) Channel Control Register +#define AT91C_TC0_CMR ((AT91_REG *) 0xFFFA0004) // (TC0) Channel Mode Register (Capture Mode / Waveform Mode) +#define AT91C_TC0_IER ((AT91_REG *) 0xFFFA0024) // (TC0) Interrupt Enable Register +#define AT91C_TC0_RA ((AT91_REG *) 0xFFFA0014) // (TC0) Register A +#define AT91C_TC0_IDR ((AT91_REG *) 0xFFFA0028) // (TC0) Interrupt Disable Register +#define AT91C_TC0_CV ((AT91_REG *) 0xFFFA0010) // (TC0) Counter Value +#define AT91C_TC0_IMR ((AT91_REG *) 0xFFFA002C) // (TC0) Interrupt Mask Register +// ========== Register definition for TC1 peripheral ========== +#define AT91C_TC1_RB ((AT91_REG *) 0xFFFA0058) // (TC1) Register B +#define AT91C_TC1_CCR ((AT91_REG *) 0xFFFA0040) // (TC1) Channel Control Register +#define AT91C_TC1_IER ((AT91_REG *) 0xFFFA0064) // (TC1) Interrupt Enable Register +#define AT91C_TC1_IDR ((AT91_REG *) 0xFFFA0068) // (TC1) Interrupt Disable Register +#define AT91C_TC1_SR ((AT91_REG *) 0xFFFA0060) // (TC1) Status Register +#define AT91C_TC1_CMR ((AT91_REG *) 0xFFFA0044) // (TC1) Channel Mode Register (Capture Mode / Waveform Mode) +#define AT91C_TC1_RA ((AT91_REG *) 0xFFFA0054) // (TC1) Register A +#define AT91C_TC1_RC ((AT91_REG *) 0xFFFA005C) // (TC1) Register C +#define AT91C_TC1_IMR ((AT91_REG *) 0xFFFA006C) // (TC1) Interrupt Mask Register +#define AT91C_TC1_CV ((AT91_REG *) 0xFFFA0050) // (TC1) Counter Value +// ========== Register definition for TC2 peripheral ========== +#define AT91C_TC2_CMR ((AT91_REG *) 0xFFFA0084) // (TC2) Channel Mode Register (Capture Mode / Waveform Mode) +#define AT91C_TC2_CCR ((AT91_REG *) 0xFFFA0080) // (TC2) Channel Control Register +#define AT91C_TC2_CV ((AT91_REG *) 0xFFFA0090) // (TC2) Counter Value +#define AT91C_TC2_RA ((AT91_REG *) 0xFFFA0094) // (TC2) Register A +#define AT91C_TC2_RB ((AT91_REG *) 0xFFFA0098) // (TC2) Register B +#define AT91C_TC2_IDR ((AT91_REG *) 0xFFFA00A8) // (TC2) Interrupt Disable Register +#define AT91C_TC2_IMR ((AT91_REG *) 0xFFFA00AC) // (TC2) Interrupt Mask Register +#define AT91C_TC2_RC ((AT91_REG *) 0xFFFA009C) // (TC2) Register C +#define AT91C_TC2_IER ((AT91_REG *) 0xFFFA00A4) // (TC2) Interrupt Enable Register +#define AT91C_TC2_SR ((AT91_REG *) 0xFFFA00A0) // (TC2) Status Register +// ========== Register definition for TCB peripheral ========== +#define AT91C_TCB_BMR ((AT91_REG *) 0xFFFA00C4) // (TCB) TC Block Mode Register +#define AT91C_TCB_BCR ((AT91_REG *) 0xFFFA00C0) // (TCB) TC Block Control Register +// ========== Register definition for CAN_MB0 peripheral ========== +#define AT91C_CAN_MB0_MDL ((AT91_REG *) 0xFFFD0214) // (CAN_MB0) MailBox Data Low Register +#define AT91C_CAN_MB0_MAM ((AT91_REG *) 0xFFFD0204) // (CAN_MB0) MailBox Acceptance Mask Register +#define AT91C_CAN_MB0_MCR ((AT91_REG *) 0xFFFD021C) // (CAN_MB0) MailBox Control Register +#define AT91C_CAN_MB0_MID ((AT91_REG *) 0xFFFD0208) // (CAN_MB0) MailBox ID Register +#define AT91C_CAN_MB0_MSR ((AT91_REG *) 0xFFFD0210) // (CAN_MB0) MailBox Status Register +#define AT91C_CAN_MB0_MFID ((AT91_REG *) 0xFFFD020C) // (CAN_MB0) MailBox Family ID Register +#define AT91C_CAN_MB0_MDH ((AT91_REG *) 0xFFFD0218) // (CAN_MB0) MailBox Data High Register +#define AT91C_CAN_MB0_MMR ((AT91_REG *) 0xFFFD0200) // (CAN_MB0) MailBox Mode Register +// ========== Register definition for CAN_MB1 peripheral ========== +#define AT91C_CAN_MB1_MDL ((AT91_REG *) 0xFFFD0234) // (CAN_MB1) MailBox Data Low Register +#define AT91C_CAN_MB1_MID ((AT91_REG *) 0xFFFD0228) // (CAN_MB1) MailBox ID Register +#define AT91C_CAN_MB1_MMR ((AT91_REG *) 0xFFFD0220) // (CAN_MB1) MailBox Mode Register +#define AT91C_CAN_MB1_MSR ((AT91_REG *) 0xFFFD0230) // (CAN_MB1) MailBox Status Register +#define AT91C_CAN_MB1_MAM ((AT91_REG *) 0xFFFD0224) // (CAN_MB1) MailBox Acceptance Mask Register +#define AT91C_CAN_MB1_MDH ((AT91_REG *) 0xFFFD0238) // (CAN_MB1) MailBox Data High Register +#define AT91C_CAN_MB1_MCR ((AT91_REG *) 0xFFFD023C) // (CAN_MB1) MailBox Control Register +#define AT91C_CAN_MB1_MFID ((AT91_REG *) 0xFFFD022C) // (CAN_MB1) MailBox Family ID Register +// ========== Register definition for CAN_MB2 peripheral ========== +#define AT91C_CAN_MB2_MCR ((AT91_REG *) 0xFFFD025C) // (CAN_MB2) MailBox Control Register +#define AT91C_CAN_MB2_MDH ((AT91_REG *) 0xFFFD0258) // (CAN_MB2) MailBox Data High Register +#define AT91C_CAN_MB2_MID ((AT91_REG *) 0xFFFD0248) // (CAN_MB2) MailBox ID Register +#define AT91C_CAN_MB2_MDL ((AT91_REG *) 0xFFFD0254) // (CAN_MB2) MailBox Data Low Register +#define AT91C_CAN_MB2_MMR ((AT91_REG *) 0xFFFD0240) // (CAN_MB2) MailBox Mode Register +#define AT91C_CAN_MB2_MAM ((AT91_REG *) 0xFFFD0244) // (CAN_MB2) MailBox Acceptance Mask Register +#define AT91C_CAN_MB2_MFID ((AT91_REG *) 0xFFFD024C) // (CAN_MB2) MailBox Family ID Register +#define AT91C_CAN_MB2_MSR ((AT91_REG *) 0xFFFD0250) // (CAN_MB2) MailBox Status Register +// ========== Register definition for CAN_MB3 peripheral ========== +#define AT91C_CAN_MB3_MFID ((AT91_REG *) 0xFFFD026C) // (CAN_MB3) MailBox Family ID Register +#define AT91C_CAN_MB3_MAM ((AT91_REG *) 0xFFFD0264) // (CAN_MB3) MailBox Acceptance Mask Register +#define AT91C_CAN_MB3_MID ((AT91_REG *) 0xFFFD0268) // (CAN_MB3) MailBox ID Register +#define AT91C_CAN_MB3_MCR ((AT91_REG *) 0xFFFD027C) // (CAN_MB3) MailBox Control Register +#define AT91C_CAN_MB3_MMR ((AT91_REG *) 0xFFFD0260) // (CAN_MB3) MailBox Mode Register +#define AT91C_CAN_MB3_MSR ((AT91_REG *) 0xFFFD0270) // (CAN_MB3) MailBox Status Register +#define AT91C_CAN_MB3_MDL ((AT91_REG *) 0xFFFD0274) // (CAN_MB3) MailBox Data Low Register +#define AT91C_CAN_MB3_MDH ((AT91_REG *) 0xFFFD0278) // (CAN_MB3) MailBox Data High Register +// ========== Register definition for CAN_MB4 peripheral ========== +#define AT91C_CAN_MB4_MID ((AT91_REG *) 0xFFFD0288) // (CAN_MB4) MailBox ID Register +#define AT91C_CAN_MB4_MMR ((AT91_REG *) 0xFFFD0280) // (CAN_MB4) MailBox Mode Register +#define AT91C_CAN_MB4_MDH ((AT91_REG *) 0xFFFD0298) // (CAN_MB4) MailBox Data High Register +#define AT91C_CAN_MB4_MFID ((AT91_REG *) 0xFFFD028C) // (CAN_MB4) MailBox Family ID Register +#define AT91C_CAN_MB4_MSR ((AT91_REG *) 0xFFFD0290) // (CAN_MB4) MailBox Status Register +#define AT91C_CAN_MB4_MCR ((AT91_REG *) 0xFFFD029C) // (CAN_MB4) MailBox Control Register +#define AT91C_CAN_MB4_MDL ((AT91_REG *) 0xFFFD0294) // (CAN_MB4) MailBox Data Low Register +#define AT91C_CAN_MB4_MAM ((AT91_REG *) 0xFFFD0284) // (CAN_MB4) MailBox Acceptance Mask Register +// ========== Register definition for CAN_MB5 peripheral ========== +#define AT91C_CAN_MB5_MSR ((AT91_REG *) 0xFFFD02B0) // (CAN_MB5) MailBox Status Register +#define AT91C_CAN_MB5_MCR ((AT91_REG *) 0xFFFD02BC) // (CAN_MB5) MailBox Control Register +#define AT91C_CAN_MB5_MFID ((AT91_REG *) 0xFFFD02AC) // (CAN_MB5) MailBox Family ID Register +#define AT91C_CAN_MB5_MDH ((AT91_REG *) 0xFFFD02B8) // (CAN_MB5) MailBox Data High Register +#define AT91C_CAN_MB5_MID ((AT91_REG *) 0xFFFD02A8) // (CAN_MB5) MailBox ID Register +#define AT91C_CAN_MB5_MMR ((AT91_REG *) 0xFFFD02A0) // (CAN_MB5) MailBox Mode Register +#define AT91C_CAN_MB5_MDL ((AT91_REG *) 0xFFFD02B4) // (CAN_MB5) MailBox Data Low Register +#define AT91C_CAN_MB5_MAM ((AT91_REG *) 0xFFFD02A4) // (CAN_MB5) MailBox Acceptance Mask Register +// ========== Register definition for CAN_MB6 peripheral ========== +#define AT91C_CAN_MB6_MFID ((AT91_REG *) 0xFFFD02CC) // (CAN_MB6) MailBox Family ID Register +#define AT91C_CAN_MB6_MID ((AT91_REG *) 0xFFFD02C8) // (CAN_MB6) MailBox ID Register +#define AT91C_CAN_MB6_MAM ((AT91_REG *) 0xFFFD02C4) // (CAN_MB6) MailBox Acceptance Mask Register +#define AT91C_CAN_MB6_MSR ((AT91_REG *) 0xFFFD02D0) // (CAN_MB6) MailBox Status Register +#define AT91C_CAN_MB6_MDL ((AT91_REG *) 0xFFFD02D4) // (CAN_MB6) MailBox Data Low Register +#define AT91C_CAN_MB6_MCR ((AT91_REG *) 0xFFFD02DC) // (CAN_MB6) MailBox Control Register +#define AT91C_CAN_MB6_MDH ((AT91_REG *) 0xFFFD02D8) // (CAN_MB6) MailBox Data High Register +#define AT91C_CAN_MB6_MMR ((AT91_REG *) 0xFFFD02C0) // (CAN_MB6) MailBox Mode Register +// ========== Register definition for CAN_MB7 peripheral ========== +#define AT91C_CAN_MB7_MCR ((AT91_REG *) 0xFFFD02FC) // (CAN_MB7) MailBox Control Register +#define AT91C_CAN_MB7_MDH ((AT91_REG *) 0xFFFD02F8) // (CAN_MB7) MailBox Data High Register +#define AT91C_CAN_MB7_MFID ((AT91_REG *) 0xFFFD02EC) // (CAN_MB7) MailBox Family ID Register +#define AT91C_CAN_MB7_MDL ((AT91_REG *) 0xFFFD02F4) // (CAN_MB7) MailBox Data Low Register +#define AT91C_CAN_MB7_MID ((AT91_REG *) 0xFFFD02E8) // (CAN_MB7) MailBox ID Register +#define AT91C_CAN_MB7_MMR ((AT91_REG *) 0xFFFD02E0) // (CAN_MB7) MailBox Mode Register +#define AT91C_CAN_MB7_MAM ((AT91_REG *) 0xFFFD02E4) // (CAN_MB7) MailBox Acceptance Mask Register +#define AT91C_CAN_MB7_MSR ((AT91_REG *) 0xFFFD02F0) // (CAN_MB7) MailBox Status Register +// ========== Register definition for CAN peripheral ========== +#define AT91C_CAN_TCR ((AT91_REG *) 0xFFFD0024) // (CAN) Transfer Command Register +#define AT91C_CAN_IMR ((AT91_REG *) 0xFFFD000C) // (CAN) Interrupt Mask Register +#define AT91C_CAN_IER ((AT91_REG *) 0xFFFD0004) // (CAN) Interrupt Enable Register +#define AT91C_CAN_ECR ((AT91_REG *) 0xFFFD0020) // (CAN) Error Counter Register +#define AT91C_CAN_TIMESTP ((AT91_REG *) 0xFFFD001C) // (CAN) Time Stamp Register +#define AT91C_CAN_MR ((AT91_REG *) 0xFFFD0000) // (CAN) Mode Register +#define AT91C_CAN_IDR ((AT91_REG *) 0xFFFD0008) // (CAN) Interrupt Disable Register +#define AT91C_CAN_ACR ((AT91_REG *) 0xFFFD0028) // (CAN) Abort Command Register +#define AT91C_CAN_TIM ((AT91_REG *) 0xFFFD0018) // (CAN) Timer Register +#define AT91C_CAN_SR ((AT91_REG *) 0xFFFD0010) // (CAN) Status Register +#define AT91C_CAN_BR ((AT91_REG *) 0xFFFD0014) // (CAN) Baudrate Register +#define AT91C_CAN_VR ((AT91_REG *) 0xFFFD00FC) // (CAN) Version Register +// ========== Register definition for EMAC peripheral ========== +#define AT91C_EMAC_ISR ((AT91_REG *) 0xFFFDC024) // (EMAC) Interrupt Status Register +#define AT91C_EMAC_SA4H ((AT91_REG *) 0xFFFDC0B4) // (EMAC) Specific Address 4 Top, Last 2 bytes +#define AT91C_EMAC_SA1L ((AT91_REG *) 0xFFFDC098) // (EMAC) Specific Address 1 Bottom, First 4 bytes +#define AT91C_EMAC_ELE ((AT91_REG *) 0xFFFDC078) // (EMAC) Excessive Length Errors Register +#define AT91C_EMAC_LCOL ((AT91_REG *) 0xFFFDC05C) // (EMAC) Late Collision Register +#define AT91C_EMAC_RLE ((AT91_REG *) 0xFFFDC088) // (EMAC) Receive Length Field Mismatch Register +#define AT91C_EMAC_WOL ((AT91_REG *) 0xFFFDC0C4) // (EMAC) Wake On LAN Register +#define AT91C_EMAC_DTF ((AT91_REG *) 0xFFFDC058) // (EMAC) Deferred Transmission Frame Register +#define AT91C_EMAC_TUND ((AT91_REG *) 0xFFFDC064) // (EMAC) Transmit Underrun Error Register +#define AT91C_EMAC_NCR ((AT91_REG *) 0xFFFDC000) // (EMAC) Network Control Register +#define AT91C_EMAC_SA4L ((AT91_REG *) 0xFFFDC0B0) // (EMAC) Specific Address 4 Bottom, First 4 bytes +#define AT91C_EMAC_RSR ((AT91_REG *) 0xFFFDC020) // (EMAC) Receive Status Register +#define AT91C_EMAC_SA3L ((AT91_REG *) 0xFFFDC0A8) // (EMAC) Specific Address 3 Bottom, First 4 bytes +#define AT91C_EMAC_TSR ((AT91_REG *) 0xFFFDC014) // (EMAC) Transmit Status Register +#define AT91C_EMAC_IDR ((AT91_REG *) 0xFFFDC02C) // (EMAC) Interrupt Disable Register +#define AT91C_EMAC_RSE ((AT91_REG *) 0xFFFDC074) // (EMAC) Receive Symbol Errors Register +#define AT91C_EMAC_ECOL ((AT91_REG *) 0xFFFDC060) // (EMAC) Excessive Collision Register +#define AT91C_EMAC_TID ((AT91_REG *) 0xFFFDC0B8) // (EMAC) Type ID Checking Register +#define AT91C_EMAC_HRB ((AT91_REG *) 0xFFFDC090) // (EMAC) Hash Address Bottom[31:0] +#define AT91C_EMAC_TBQP ((AT91_REG *) 0xFFFDC01C) // (EMAC) Transmit Buffer Queue Pointer +#define AT91C_EMAC_USRIO ((AT91_REG *) 0xFFFDC0C0) // (EMAC) USER Input/Output Register +#define AT91C_EMAC_PTR ((AT91_REG *) 0xFFFDC038) // (EMAC) Pause Time Register +#define AT91C_EMAC_SA2H ((AT91_REG *) 0xFFFDC0A4) // (EMAC) Specific Address 2 Top, Last 2 bytes +#define AT91C_EMAC_ROV ((AT91_REG *) 0xFFFDC070) // (EMAC) Receive Overrun Errors Register +#define AT91C_EMAC_ALE ((AT91_REG *) 0xFFFDC054) // (EMAC) Alignment Error Register +#define AT91C_EMAC_RJA ((AT91_REG *) 0xFFFDC07C) // (EMAC) Receive Jabbers Register +#define AT91C_EMAC_RBQP ((AT91_REG *) 0xFFFDC018) // (EMAC) Receive Buffer Queue Pointer +#define AT91C_EMAC_TPF ((AT91_REG *) 0xFFFDC08C) // (EMAC) Transmitted Pause Frames Register +#define AT91C_EMAC_NCFGR ((AT91_REG *) 0xFFFDC004) // (EMAC) Network Configuration Register +#define AT91C_EMAC_HRT ((AT91_REG *) 0xFFFDC094) // (EMAC) Hash Address Top[63:32] +#define AT91C_EMAC_USF ((AT91_REG *) 0xFFFDC080) // (EMAC) Undersize Frames Register +#define AT91C_EMAC_FCSE ((AT91_REG *) 0xFFFDC050) // (EMAC) Frame Check Sequence Error Register +#define AT91C_EMAC_TPQ ((AT91_REG *) 0xFFFDC0BC) // (EMAC) Transmit Pause Quantum Register +#define AT91C_EMAC_MAN ((AT91_REG *) 0xFFFDC034) // (EMAC) PHY Maintenance Register +#define AT91C_EMAC_FTO ((AT91_REG *) 0xFFFDC040) // (EMAC) Frames Transmitted OK Register +#define AT91C_EMAC_REV ((AT91_REG *) 0xFFFDC0FC) // (EMAC) Revision Register +#define AT91C_EMAC_IMR ((AT91_REG *) 0xFFFDC030) // (EMAC) Interrupt Mask Register +#define AT91C_EMAC_SCF ((AT91_REG *) 0xFFFDC044) // (EMAC) Single Collision Frame Register +#define AT91C_EMAC_PFR ((AT91_REG *) 0xFFFDC03C) // (EMAC) Pause Frames received Register +#define AT91C_EMAC_MCF ((AT91_REG *) 0xFFFDC048) // (EMAC) Multiple Collision Frame Register +#define AT91C_EMAC_NSR ((AT91_REG *) 0xFFFDC008) // (EMAC) Network Status Register +#define AT91C_EMAC_SA2L ((AT91_REG *) 0xFFFDC0A0) // (EMAC) Specific Address 2 Bottom, First 4 bytes +#define AT91C_EMAC_FRO ((AT91_REG *) 0xFFFDC04C) // (EMAC) Frames Received OK Register +#define AT91C_EMAC_IER ((AT91_REG *) 0xFFFDC028) // (EMAC) Interrupt Enable Register +#define AT91C_EMAC_SA1H ((AT91_REG *) 0xFFFDC09C) // (EMAC) Specific Address 1 Top, Last 2 bytes +#define AT91C_EMAC_CSE ((AT91_REG *) 0xFFFDC068) // (EMAC) Carrier Sense Error Register +#define AT91C_EMAC_SA3H ((AT91_REG *) 0xFFFDC0AC) // (EMAC) Specific Address 3 Top, Last 2 bytes +#define AT91C_EMAC_RRE ((AT91_REG *) 0xFFFDC06C) // (EMAC) Receive Ressource Error Register +#define AT91C_EMAC_STE ((AT91_REG *) 0xFFFDC084) // (EMAC) SQE Test Error Register +// ========== Register definition for PDC_ADC peripheral ========== +#define AT91C_ADC_PTSR ((AT91_REG *) 0xFFFD8124) // (PDC_ADC) PDC Transfer Status Register +#define AT91C_ADC_PTCR ((AT91_REG *) 0xFFFD8120) // (PDC_ADC) PDC Transfer Control Register +#define AT91C_ADC_TNPR ((AT91_REG *) 0xFFFD8118) // (PDC_ADC) Transmit Next Pointer Register +#define AT91C_ADC_TNCR ((AT91_REG *) 0xFFFD811C) // (PDC_ADC) Transmit Next Counter Register +#define AT91C_ADC_RNPR ((AT91_REG *) 0xFFFD8110) // (PDC_ADC) Receive Next Pointer Register +#define AT91C_ADC_RNCR ((AT91_REG *) 0xFFFD8114) // (PDC_ADC) Receive Next Counter Register +#define AT91C_ADC_RPR ((AT91_REG *) 0xFFFD8100) // (PDC_ADC) Receive Pointer Register +#define AT91C_ADC_TCR ((AT91_REG *) 0xFFFD810C) // (PDC_ADC) Transmit Counter Register +#define AT91C_ADC_TPR ((AT91_REG *) 0xFFFD8108) // (PDC_ADC) Transmit Pointer Register +#define AT91C_ADC_RCR ((AT91_REG *) 0xFFFD8104) // (PDC_ADC) Receive Counter Register +// ========== Register definition for ADC peripheral ========== +#define AT91C_ADC_CDR2 ((AT91_REG *) 0xFFFD8038) // (ADC) ADC Channel Data Register 2 +#define AT91C_ADC_CDR3 ((AT91_REG *) 0xFFFD803C) // (ADC) ADC Channel Data Register 3 +#define AT91C_ADC_CDR0 ((AT91_REG *) 0xFFFD8030) // (ADC) ADC Channel Data Register 0 +#define AT91C_ADC_CDR5 ((AT91_REG *) 0xFFFD8044) // (ADC) ADC Channel Data Register 5 +#define AT91C_ADC_CHDR ((AT91_REG *) 0xFFFD8014) // (ADC) ADC Channel Disable Register +#define AT91C_ADC_SR ((AT91_REG *) 0xFFFD801C) // (ADC) ADC Status Register +#define AT91C_ADC_CDR4 ((AT91_REG *) 0xFFFD8040) // (ADC) ADC Channel Data Register 4 +#define AT91C_ADC_CDR1 ((AT91_REG *) 0xFFFD8034) // (ADC) ADC Channel Data Register 1 +#define AT91C_ADC_LCDR ((AT91_REG *) 0xFFFD8020) // (ADC) ADC Last Converted Data Register +#define AT91C_ADC_IDR ((AT91_REG *) 0xFFFD8028) // (ADC) ADC Interrupt Disable Register +#define AT91C_ADC_CR ((AT91_REG *) 0xFFFD8000) // (ADC) ADC Control Register +#define AT91C_ADC_CDR7 ((AT91_REG *) 0xFFFD804C) // (ADC) ADC Channel Data Register 7 +#define AT91C_ADC_CDR6 ((AT91_REG *) 0xFFFD8048) // (ADC) ADC Channel Data Register 6 +#define AT91C_ADC_IER ((AT91_REG *) 0xFFFD8024) // (ADC) ADC Interrupt Enable Register +#define AT91C_ADC_CHER ((AT91_REG *) 0xFFFD8010) // (ADC) ADC Channel Enable Register +#define AT91C_ADC_CHSR ((AT91_REG *) 0xFFFD8018) // (ADC) ADC Channel Status Register +#define AT91C_ADC_MR ((AT91_REG *) 0xFFFD8004) // (ADC) ADC Mode Register +#define AT91C_ADC_IMR ((AT91_REG *) 0xFFFD802C) // (ADC) ADC Interrupt Mask Register +// ========== Register definition for PDC_AES peripheral ========== +#define AT91C_AES_TPR ((AT91_REG *) 0xFFFA4108) // (PDC_AES) Transmit Pointer Register +#define AT91C_AES_PTCR ((AT91_REG *) 0xFFFA4120) // (PDC_AES) PDC Transfer Control Register +#define AT91C_AES_RNPR ((AT91_REG *) 0xFFFA4110) // (PDC_AES) Receive Next Pointer Register +#define AT91C_AES_TNCR ((AT91_REG *) 0xFFFA411C) // (PDC_AES) Transmit Next Counter Register +#define AT91C_AES_TCR ((AT91_REG *) 0xFFFA410C) // (PDC_AES) Transmit Counter Register +#define AT91C_AES_RCR ((AT91_REG *) 0xFFFA4104) // (PDC_AES) Receive Counter Register +#define AT91C_AES_RNCR ((AT91_REG *) 0xFFFA4114) // (PDC_AES) Receive Next Counter Register +#define AT91C_AES_TNPR ((AT91_REG *) 0xFFFA4118) // (PDC_AES) Transmit Next Pointer Register +#define AT91C_AES_RPR ((AT91_REG *) 0xFFFA4100) // (PDC_AES) Receive Pointer Register +#define AT91C_AES_PTSR ((AT91_REG *) 0xFFFA4124) // (PDC_AES) PDC Transfer Status Register +// ========== Register definition for AES peripheral ========== +#define AT91C_AES_IVxR ((AT91_REG *) 0xFFFA4060) // (AES) Initialization Vector x Register +#define AT91C_AES_MR ((AT91_REG *) 0xFFFA4004) // (AES) Mode Register +#define AT91C_AES_VR ((AT91_REG *) 0xFFFA40FC) // (AES) AES Version Register +#define AT91C_AES_ODATAxR ((AT91_REG *) 0xFFFA4050) // (AES) Output Data x Register +#define AT91C_AES_IDATAxR ((AT91_REG *) 0xFFFA4040) // (AES) Input Data x Register +#define AT91C_AES_CR ((AT91_REG *) 0xFFFA4000) // (AES) Control Register +#define AT91C_AES_IDR ((AT91_REG *) 0xFFFA4014) // (AES) Interrupt Disable Register +#define AT91C_AES_IMR ((AT91_REG *) 0xFFFA4018) // (AES) Interrupt Mask Register +#define AT91C_AES_IER ((AT91_REG *) 0xFFFA4010) // (AES) Interrupt Enable Register +#define AT91C_AES_KEYWxR ((AT91_REG *) 0xFFFA4020) // (AES) Key Word x Register +#define AT91C_AES_ISR ((AT91_REG *) 0xFFFA401C) // (AES) Interrupt Status Register +// ========== Register definition for PDC_TDES peripheral ========== +#define AT91C_TDES_RNCR ((AT91_REG *) 0xFFFA8114) // (PDC_TDES) Receive Next Counter Register +#define AT91C_TDES_TCR ((AT91_REG *) 0xFFFA810C) // (PDC_TDES) Transmit Counter Register +#define AT91C_TDES_RCR ((AT91_REG *) 0xFFFA8104) // (PDC_TDES) Receive Counter Register +#define AT91C_TDES_TNPR ((AT91_REG *) 0xFFFA8118) // (PDC_TDES) Transmit Next Pointer Register +#define AT91C_TDES_RNPR ((AT91_REG *) 0xFFFA8110) // (PDC_TDES) Receive Next Pointer Register +#define AT91C_TDES_RPR ((AT91_REG *) 0xFFFA8100) // (PDC_TDES) Receive Pointer Register +#define AT91C_TDES_TNCR ((AT91_REG *) 0xFFFA811C) // (PDC_TDES) Transmit Next Counter Register +#define AT91C_TDES_TPR ((AT91_REG *) 0xFFFA8108) // (PDC_TDES) Transmit Pointer Register +#define AT91C_TDES_PTSR ((AT91_REG *) 0xFFFA8124) // (PDC_TDES) PDC Transfer Status Register +#define AT91C_TDES_PTCR ((AT91_REG *) 0xFFFA8120) // (PDC_TDES) PDC Transfer Control Register +// ========== Register definition for TDES peripheral ========== +#define AT91C_TDES_KEY2WxR ((AT91_REG *) 0xFFFA8028) // (TDES) Key 2 Word x Register +#define AT91C_TDES_KEY3WxR ((AT91_REG *) 0xFFFA8030) // (TDES) Key 3 Word x Register +#define AT91C_TDES_IDR ((AT91_REG *) 0xFFFA8014) // (TDES) Interrupt Disable Register +#define AT91C_TDES_VR ((AT91_REG *) 0xFFFA80FC) // (TDES) TDES Version Register +#define AT91C_TDES_IVxR ((AT91_REG *) 0xFFFA8060) // (TDES) Initialization Vector x Register +#define AT91C_TDES_ODATAxR ((AT91_REG *) 0xFFFA8050) // (TDES) Output Data x Register +#define AT91C_TDES_IMR ((AT91_REG *) 0xFFFA8018) // (TDES) Interrupt Mask Register +#define AT91C_TDES_MR ((AT91_REG *) 0xFFFA8004) // (TDES) Mode Register +#define AT91C_TDES_CR ((AT91_REG *) 0xFFFA8000) // (TDES) Control Register +#define AT91C_TDES_IER ((AT91_REG *) 0xFFFA8010) // (TDES) Interrupt Enable Register +#define AT91C_TDES_ISR ((AT91_REG *) 0xFFFA801C) // (TDES) Interrupt Status Register +#define AT91C_TDES_IDATAxR ((AT91_REG *) 0xFFFA8040) // (TDES) Input Data x Register +#define AT91C_TDES_KEY1WxR ((AT91_REG *) 0xFFFA8020) // (TDES) Key 1 Word x Register + +// ***************************************************************************** +// PIO DEFINITIONS FOR AT91SAM7X256 +// ***************************************************************************** +#define AT91C_PIO_PA0 ((unsigned int) 1 << 0) // Pin Controlled by PA0 +#define AT91C_PA0_RXD0 ((unsigned int) AT91C_PIO_PA0) // USART 0 Receive Data +#define AT91C_PIO_PA1 ((unsigned int) 1 << 1) // Pin Controlled by PA1 +#define AT91C_PA1_TXD0 ((unsigned int) AT91C_PIO_PA1) // USART 0 Transmit Data +#define AT91C_PIO_PA10 ((unsigned int) 1 << 10) // Pin Controlled by PA10 +#define AT91C_PA10_TWD ((unsigned int) AT91C_PIO_PA10) // TWI Two-wire Serial Data +#define AT91C_PIO_PA11 ((unsigned int) 1 << 11) // Pin Controlled by PA11 +#define AT91C_PA11_TWCK ((unsigned int) AT91C_PIO_PA11) // TWI Two-wire Serial Clock +#define AT91C_PIO_PA12 ((unsigned int) 1 << 12) // Pin Controlled by PA12 +#define AT91C_PA12_NPCS00 ((unsigned int) AT91C_PIO_PA12) // SPI 0 Peripheral Chip Select 0 +#define AT91C_PIO_PA13 ((unsigned int) 1 << 13) // Pin Controlled by PA13 +#define AT91C_PA13_NPCS01 ((unsigned int) AT91C_PIO_PA13) // SPI 0 Peripheral Chip Select 1 +#define AT91C_PA13_PCK1 ((unsigned int) AT91C_PIO_PA13) // PMC Programmable Clock Output 1 +#define AT91C_PIO_PA14 ((unsigned int) 1 << 14) // Pin Controlled by PA14 +#define AT91C_PA14_NPCS02 ((unsigned int) AT91C_PIO_PA14) // SPI 0 Peripheral Chip Select 2 +#define AT91C_PA14_IRQ1 ((unsigned int) AT91C_PIO_PA14) // External Interrupt 1 +#define AT91C_PIO_PA15 ((unsigned int) 1 << 15) // Pin Controlled by PA15 +#define AT91C_PA15_NPCS03 ((unsigned int) AT91C_PIO_PA15) // SPI 0 Peripheral Chip Select 3 +#define AT91C_PA15_TCLK2 ((unsigned int) AT91C_PIO_PA15) // Timer Counter 2 external clock input +#define AT91C_PIO_PA16 ((unsigned int) 1 << 16) // Pin Controlled by PA16 +#define AT91C_PA16_MISO0 ((unsigned int) AT91C_PIO_PA16) // SPI 0 Master In Slave +#define AT91C_PIO_PA17 ((unsigned int) 1 << 17) // Pin Controlled by PA17 +#define AT91C_PA17_MOSI0 ((unsigned int) AT91C_PIO_PA17) // SPI 0 Master Out Slave +#define AT91C_PIO_PA18 ((unsigned int) 1 << 18) // Pin Controlled by PA18 +#define AT91C_PA18_SPCK0 ((unsigned int) AT91C_PIO_PA18) // SPI 0 Serial Clock +#define AT91C_PIO_PA19 ((unsigned int) 1 << 19) // Pin Controlled by PA19 +#define AT91C_PA19_CANRX ((unsigned int) AT91C_PIO_PA19) // CAN Receive +#define AT91C_PIO_PA2 ((unsigned int) 1 << 2) // Pin Controlled by PA2 +#define AT91C_PA2_SCK0 ((unsigned int) AT91C_PIO_PA2) // USART 0 Serial Clock +#define AT91C_PA2_NPCS11 ((unsigned int) AT91C_PIO_PA2) // SPI 1 Peripheral Chip Select 1 +#define AT91C_PIO_PA20 ((unsigned int) 1 << 20) // Pin Controlled by PA20 +#define AT91C_PA20_CANTX ((unsigned int) AT91C_PIO_PA20) // CAN Transmit +#define AT91C_PIO_PA21 ((unsigned int) 1 << 21) // Pin Controlled by PA21 +#define AT91C_PA21_TF ((unsigned int) AT91C_PIO_PA21) // SSC Transmit Frame Sync +#define AT91C_PA21_NPCS10 ((unsigned int) AT91C_PIO_PA21) // SPI 1 Peripheral Chip Select 0 +#define AT91C_PIO_PA22 ((unsigned int) 1 << 22) // Pin Controlled by PA22 +#define AT91C_PA22_TK ((unsigned int) AT91C_PIO_PA22) // SSC Transmit Clock +#define AT91C_PA22_SPCK1 ((unsigned int) AT91C_PIO_PA22) // SPI 1 Serial Clock +#define AT91C_PIO_PA23 ((unsigned int) 1 << 23) // Pin Controlled by PA23 +#define AT91C_PA23_TD ((unsigned int) AT91C_PIO_PA23) // SSC Transmit data +#define AT91C_PA23_MOSI1 ((unsigned int) AT91C_PIO_PA23) // SPI 1 Master Out Slave +#define AT91C_PIO_PA24 ((unsigned int) 1 << 24) // Pin Controlled by PA24 +#define AT91C_PA24_RD ((unsigned int) AT91C_PIO_PA24) // SSC Receive Data +#define AT91C_PA24_MISO1 ((unsigned int) AT91C_PIO_PA24) // SPI 1 Master In Slave +#define AT91C_PIO_PA25 ((unsigned int) 1 << 25) // Pin Controlled by PA25 +#define AT91C_PA25_RK ((unsigned int) AT91C_PIO_PA25) // SSC Receive Clock +#define AT91C_PA25_NPCS11 ((unsigned int) AT91C_PIO_PA25) // SPI 1 Peripheral Chip Select 1 +#define AT91C_PIO_PA26 ((unsigned int) 1 << 26) // Pin Controlled by PA26 +#define AT91C_PA26_RF ((unsigned int) AT91C_PIO_PA26) // SSC Receive Frame Sync +#define AT91C_PA26_NPCS12 ((unsigned int) AT91C_PIO_PA26) // SPI 1 Peripheral Chip Select 2 +#define AT91C_PIO_PA27 ((unsigned int) 1 << 27) // Pin Controlled by PA27 +#define AT91C_PA27_DRXD ((unsigned int) AT91C_PIO_PA27) // DBGU Debug Receive Data +#define AT91C_PA27_PCK3 ((unsigned int) AT91C_PIO_PA27) // PMC Programmable Clock Output 3 +#define AT91C_PIO_PA28 ((unsigned int) 1 << 28) // Pin Controlled by PA28 +#define AT91C_PA28_DTXD ((unsigned int) AT91C_PIO_PA28) // DBGU Debug Transmit Data +#define AT91C_PIO_PA29 ((unsigned int) 1 << 29) // Pin Controlled by PA29 +#define AT91C_PA29_FIQ ((unsigned int) AT91C_PIO_PA29) // AIC Fast Interrupt Input +#define AT91C_PA29_NPCS13 ((unsigned int) AT91C_PIO_PA29) // SPI 1 Peripheral Chip Select 3 +#define AT91C_PIO_PA3 ((unsigned int) 1 << 3) // Pin Controlled by PA3 +#define AT91C_PA3_RTS0 ((unsigned int) AT91C_PIO_PA3) // USART 0 Ready To Send +#define AT91C_PA3_NPCS12 ((unsigned int) AT91C_PIO_PA3) // SPI 1 Peripheral Chip Select 2 +#define AT91C_PIO_PA30 ((unsigned int) 1 << 30) // Pin Controlled by PA30 +#define AT91C_PA30_IRQ0 ((unsigned int) AT91C_PIO_PA30) // External Interrupt 0 +#define AT91C_PA30_PCK2 ((unsigned int) AT91C_PIO_PA30) // PMC Programmable Clock Output 2 +#define AT91C_PIO_PA4 ((unsigned int) 1 << 4) // Pin Controlled by PA4 +#define AT91C_PA4_CTS0 ((unsigned int) AT91C_PIO_PA4) // USART 0 Clear To Send +#define AT91C_PA4_NPCS13 ((unsigned int) AT91C_PIO_PA4) // SPI 1 Peripheral Chip Select 3 +#define AT91C_PIO_PA5 ((unsigned int) 1 << 5) // Pin Controlled by PA5 +#define AT91C_PA5_RXD1 ((unsigned int) AT91C_PIO_PA5) // USART 1 Receive Data +#define AT91C_PIO_PA6 ((unsigned int) 1 << 6) // Pin Controlled by PA6 +#define AT91C_PA6_TXD1 ((unsigned int) AT91C_PIO_PA6) // USART 1 Transmit Data +#define AT91C_PIO_PA7 ((unsigned int) 1 << 7) // Pin Controlled by PA7 +#define AT91C_PA7_SCK1 ((unsigned int) AT91C_PIO_PA7) // USART 1 Serial Clock +#define AT91C_PA7_NPCS01 ((unsigned int) AT91C_PIO_PA7) // SPI 0 Peripheral Chip Select 1 +#define AT91C_PIO_PA8 ((unsigned int) 1 << 8) // Pin Controlled by PA8 +#define AT91C_PA8_RTS1 ((unsigned int) AT91C_PIO_PA8) // USART 1 Ready To Send +#define AT91C_PA8_NPCS02 ((unsigned int) AT91C_PIO_PA8) // SPI 0 Peripheral Chip Select 2 +#define AT91C_PIO_PA9 ((unsigned int) 1 << 9) // Pin Controlled by PA9 +#define AT91C_PA9_CTS1 ((unsigned int) AT91C_PIO_PA9) // USART 1 Clear To Send +#define AT91C_PA9_NPCS03 ((unsigned int) AT91C_PIO_PA9) // SPI 0 Peripheral Chip Select 3 +#define AT91C_PIO_PB0 ((unsigned int) 1 << 0) // Pin Controlled by PB0 +#define AT91C_PB0_ETXCK_EREFCK ((unsigned int) AT91C_PIO_PB0) // Ethernet MAC Transmit Clock/Reference Clock +#define AT91C_PB0_PCK0 ((unsigned int) AT91C_PIO_PB0) // PMC Programmable Clock Output 0 +#define AT91C_PIO_PB1 ((unsigned int) 1 << 1) // Pin Controlled by PB1 +#define AT91C_PB1_ETXEN ((unsigned int) AT91C_PIO_PB1) // Ethernet MAC Transmit Enable +#define AT91C_PIO_PB10 ((unsigned int) 1 << 10) // Pin Controlled by PB10 +#define AT91C_PB10_ETX2 ((unsigned int) AT91C_PIO_PB10) // Ethernet MAC Transmit Data 2 +#define AT91C_PB10_NPCS11 ((unsigned int) AT91C_PIO_PB10) // SPI 1 Peripheral Chip Select 1 +#define AT91C_PIO_PB11 ((unsigned int) 1 << 11) // Pin Controlled by PB11 +#define AT91C_PB11_ETX3 ((unsigned int) AT91C_PIO_PB11) // Ethernet MAC Transmit Data 3 +#define AT91C_PB11_NPCS12 ((unsigned int) AT91C_PIO_PB11) // SPI 1 Peripheral Chip Select 2 +#define AT91C_PIO_PB12 ((unsigned int) 1 << 12) // Pin Controlled by PB12 +#define AT91C_PB12_ETXER ((unsigned int) AT91C_PIO_PB12) // Ethernet MAC Transmikt Coding Error +#define AT91C_PB12_TCLK0 ((unsigned int) AT91C_PIO_PB12) // Timer Counter 0 external clock input +#define AT91C_PIO_PB13 ((unsigned int) 1 << 13) // Pin Controlled by PB13 +#define AT91C_PB13_ERX2 ((unsigned int) AT91C_PIO_PB13) // Ethernet MAC Receive Data 2 +#define AT91C_PB13_NPCS01 ((unsigned int) AT91C_PIO_PB13) // SPI 0 Peripheral Chip Select 1 +#define AT91C_PIO_PB14 ((unsigned int) 1 << 14) // Pin Controlled by PB14 +#define AT91C_PB14_ERX3 ((unsigned int) AT91C_PIO_PB14) // Ethernet MAC Receive Data 3 +#define AT91C_PB14_NPCS02 ((unsigned int) AT91C_PIO_PB14) // SPI 0 Peripheral Chip Select 2 +#define AT91C_PIO_PB15 ((unsigned int) 1 << 15) // Pin Controlled by PB15 +#define AT91C_PB15_ERXDV ((unsigned int) AT91C_PIO_PB15) // Ethernet MAC Receive Data Valid +#define AT91C_PIO_PB16 ((unsigned int) 1 << 16) // Pin Controlled by PB16 +#define AT91C_PB16_ECOL ((unsigned int) AT91C_PIO_PB16) // Ethernet MAC Collision Detected +#define AT91C_PB16_NPCS13 ((unsigned int) AT91C_PIO_PB16) // SPI 1 Peripheral Chip Select 3 +#define AT91C_PIO_PB17 ((unsigned int) 1 << 17) // Pin Controlled by PB17 +#define AT91C_PB17_ERXCK ((unsigned int) AT91C_PIO_PB17) // Ethernet MAC Receive Clock +#define AT91C_PB17_NPCS03 ((unsigned int) AT91C_PIO_PB17) // SPI 0 Peripheral Chip Select 3 +#define AT91C_PIO_PB18 ((unsigned int) 1 << 18) // Pin Controlled by PB18 +#define AT91C_PB18_EF100 ((unsigned int) AT91C_PIO_PB18) // Ethernet MAC Force 100 Mbits/sec +#define AT91C_PB18_ADTRG ((unsigned int) AT91C_PIO_PB18) // ADC External Trigger +#define AT91C_PIO_PB19 ((unsigned int) 1 << 19) // Pin Controlled by PB19 +#define AT91C_PB19_PWM0 ((unsigned int) AT91C_PIO_PB19) // PWM Channel 0 +#define AT91C_PB19_TCLK1 ((unsigned int) AT91C_PIO_PB19) // Timer Counter 1 external clock input +#define AT91C_PIO_PB2 ((unsigned int) 1 << 2) // Pin Controlled by PB2 +#define AT91C_PB2_ETX0 ((unsigned int) AT91C_PIO_PB2) // Ethernet MAC Transmit Data 0 +#define AT91C_PIO_PB20 ((unsigned int) 1 << 20) // Pin Controlled by PB20 +#define AT91C_PB20_PWM1 ((unsigned int) AT91C_PIO_PB20) // PWM Channel 1 +#define AT91C_PB20_PCK0 ((unsigned int) AT91C_PIO_PB20) // PMC Programmable Clock Output 0 +#define AT91C_PIO_PB21 ((unsigned int) 1 << 21) // Pin Controlled by PB21 +#define AT91C_PB21_PWM2 ((unsigned int) AT91C_PIO_PB21) // PWM Channel 2 +#define AT91C_PB21_PCK1 ((unsigned int) AT91C_PIO_PB21) // PMC Programmable Clock Output 1 +#define AT91C_PIO_PB22 ((unsigned int) 1 << 22) // Pin Controlled by PB22 +#define AT91C_PB22_PWM3 ((unsigned int) AT91C_PIO_PB22) // PWM Channel 3 +#define AT91C_PB22_PCK2 ((unsigned int) AT91C_PIO_PB22) // PMC Programmable Clock Output 2 +#define AT91C_PIO_PB23 ((unsigned int) 1 << 23) // Pin Controlled by PB23 +#define AT91C_PB23_TIOA0 ((unsigned int) AT91C_PIO_PB23) // Timer Counter 0 Multipurpose Timer I/O Pin A +#define AT91C_PB23_DCD1 ((unsigned int) AT91C_PIO_PB23) // USART 1 Data Carrier Detect +#define AT91C_PIO_PB24 ((unsigned int) 1 << 24) // Pin Controlled by PB24 +#define AT91C_PB24_TIOB0 ((unsigned int) AT91C_PIO_PB24) // Timer Counter 0 Multipurpose Timer I/O Pin B +#define AT91C_PB24_DSR1 ((unsigned int) AT91C_PIO_PB24) // USART 1 Data Set ready +#define AT91C_PIO_PB25 ((unsigned int) 1 << 25) // Pin Controlled by PB25 +#define AT91C_PB25_TIOA1 ((unsigned int) AT91C_PIO_PB25) // Timer Counter 1 Multipurpose Timer I/O Pin A +#define AT91C_PB25_DTR1 ((unsigned int) AT91C_PIO_PB25) // USART 1 Data Terminal ready +#define AT91C_PIO_PB26 ((unsigned int) 1 << 26) // Pin Controlled by PB26 +#define AT91C_PB26_TIOB1 ((unsigned int) AT91C_PIO_PB26) // Timer Counter 1 Multipurpose Timer I/O Pin B +#define AT91C_PB26_RI1 ((unsigned int) AT91C_PIO_PB26) // USART 1 Ring Indicator +#define AT91C_PIO_PB27 ((unsigned int) 1 << 27) // Pin Controlled by PB27 +#define AT91C_PB27_TIOA2 ((unsigned int) AT91C_PIO_PB27) // Timer Counter 2 Multipurpose Timer I/O Pin A +#define AT91C_PB27_PWM0 ((unsigned int) AT91C_PIO_PB27) // PWM Channel 0 +#define AT91C_PIO_PB28 ((unsigned int) 1 << 28) // Pin Controlled by PB28 +#define AT91C_PB28_TIOB2 ((unsigned int) AT91C_PIO_PB28) // Timer Counter 2 Multipurpose Timer I/O Pin B +#define AT91C_PB28_PWM1 ((unsigned int) AT91C_PIO_PB28) // PWM Channel 1 +#define AT91C_PIO_PB29 ((unsigned int) 1 << 29) // Pin Controlled by PB29 +#define AT91C_PB29_PCK1 ((unsigned int) AT91C_PIO_PB29) // PMC Programmable Clock Output 1 +#define AT91C_PB29_PWM2 ((unsigned int) AT91C_PIO_PB29) // PWM Channel 2 +#define AT91C_PIO_PB3 ((unsigned int) 1 << 3) // Pin Controlled by PB3 +#define AT91C_PB3_ETX1 ((unsigned int) AT91C_PIO_PB3) // Ethernet MAC Transmit Data 1 +#define AT91C_PIO_PB30 ((unsigned int) 1 << 30) // Pin Controlled by PB30 +#define AT91C_PB30_PCK2 ((unsigned int) AT91C_PIO_PB30) // PMC Programmable Clock Output 2 +#define AT91C_PB30_PWM3 ((unsigned int) AT91C_PIO_PB30) // PWM Channel 3 +#define AT91C_PIO_PB4 ((unsigned int) 1 << 4) // Pin Controlled by PB4 +#define AT91C_PB4_ECRS_ECRSDV ((unsigned int) AT91C_PIO_PB4) // Ethernet MAC Carrier Sense/Carrier Sense and Data Valid +#define AT91C_PIO_PB5 ((unsigned int) 1 << 5) // Pin Controlled by PB5 +#define AT91C_PB5_ERX0 ((unsigned int) AT91C_PIO_PB5) // Ethernet MAC Receive Data 0 +#define AT91C_PIO_PB6 ((unsigned int) 1 << 6) // Pin Controlled by PB6 +#define AT91C_PB6_ERX1 ((unsigned int) AT91C_PIO_PB6) // Ethernet MAC Receive Data 1 +#define AT91C_PIO_PB7 ((unsigned int) 1 << 7) // Pin Controlled by PB7 +#define AT91C_PB7_ERXER ((unsigned int) AT91C_PIO_PB7) // Ethernet MAC Receive Error +#define AT91C_PIO_PB8 ((unsigned int) 1 << 8) // Pin Controlled by PB8 +#define AT91C_PB8_EMDC ((unsigned int) AT91C_PIO_PB8) // Ethernet MAC Management Data Clock +#define AT91C_PIO_PB9 ((unsigned int) 1 << 9) // Pin Controlled by PB9 +#define AT91C_PB9_EMDIO ((unsigned int) AT91C_PIO_PB9) // Ethernet MAC Management Data Input/Output + +// ***************************************************************************** +// PERIPHERAL ID DEFINITIONS FOR AT91SAM7X256 +// ***************************************************************************** +#define AT91C_ID_FIQ ((unsigned int) 0) // Advanced Interrupt Controller (FIQ) +#define AT91C_ID_SYS ((unsigned int) 1) // System Peripheral +#define AT91C_ID_PIOA ((unsigned int) 2) // Parallel IO Controller A +#define AT91C_ID_PIOB ((unsigned int) 3) // Parallel IO Controller B +#define AT91C_ID_SPI0 ((unsigned int) 4) // Serial Peripheral Interface 0 +#define AT91C_ID_SPI1 ((unsigned int) 5) // Serial Peripheral Interface 1 +#define AT91C_ID_US0 ((unsigned int) 6) // USART 0 +#define AT91C_ID_US1 ((unsigned int) 7) // USART 1 +#define AT91C_ID_SSC ((unsigned int) 8) // Serial Synchronous Controller +#define AT91C_ID_TWI ((unsigned int) 9) // Two-Wire Interface +#define AT91C_ID_PWMC ((unsigned int) 10) // PWM Controller +#define AT91C_ID_UDP ((unsigned int) 11) // USB Device Port +#define AT91C_ID_TC0 ((unsigned int) 12) // Timer Counter 0 +#define AT91C_ID_TC1 ((unsigned int) 13) // Timer Counter 1 +#define AT91C_ID_TC2 ((unsigned int) 14) // Timer Counter 2 +#define AT91C_ID_CAN ((unsigned int) 15) // Control Area Network Controller +#define AT91C_ID_EMAC ((unsigned int) 16) // Ethernet MAC +#define AT91C_ID_ADC ((unsigned int) 17) // Analog-to-Digital Converter +#define AT91C_ID_AES ((unsigned int) 18) // Advanced Encryption Standard 128-bit +#define AT91C_ID_TDES ((unsigned int) 19) // Triple Data Encryption Standard +#define AT91C_ID_20_Reserved ((unsigned int) 20) // Reserved +#define AT91C_ID_21_Reserved ((unsigned int) 21) // Reserved +#define AT91C_ID_22_Reserved ((unsigned int) 22) // Reserved +#define AT91C_ID_23_Reserved ((unsigned int) 23) // Reserved +#define AT91C_ID_24_Reserved ((unsigned int) 24) // Reserved +#define AT91C_ID_25_Reserved ((unsigned int) 25) // Reserved +#define AT91C_ID_26_Reserved ((unsigned int) 26) // Reserved +#define AT91C_ID_27_Reserved ((unsigned int) 27) // Reserved +#define AT91C_ID_28_Reserved ((unsigned int) 28) // Reserved +#define AT91C_ID_29_Reserved ((unsigned int) 29) // Reserved +#define AT91C_ID_IRQ0 ((unsigned int) 30) // Advanced Interrupt Controller (IRQ0) +#define AT91C_ID_IRQ1 ((unsigned int) 31) // Advanced Interrupt Controller (IRQ1) + +// ***************************************************************************** +// BASE ADDRESS DEFINITIONS FOR AT91SAM7X256 +// ***************************************************************************** +#define AT91C_BASE_SYS ((AT91PS_SYS) 0xFFFFF000) // (SYS) Base Address +#define AT91C_BASE_AIC ((AT91PS_AIC) 0xFFFFF000) // (AIC) Base Address +#define AT91C_BASE_PDC_DBGU ((AT91PS_PDC) 0xFFFFF300) // (PDC_DBGU) Base Address +#define AT91C_BASE_DBGU ((AT91PS_DBGU) 0xFFFFF200) // (DBGU) Base Address +#define AT91C_BASE_PIOA ((AT91PS_PIO) 0xFFFFF400) // (PIOA) Base Address +#define AT91C_BASE_PIOB ((AT91PS_PIO) 0xFFFFF600) // (PIOB) Base Address +#define AT91C_BASE_CKGR ((AT91PS_CKGR) 0xFFFFFC20) // (CKGR) Base Address +#define AT91C_BASE_PMC ((AT91PS_PMC) 0xFFFFFC00) // (PMC) Base Address +#define AT91C_BASE_RSTC ((AT91PS_RSTC) 0xFFFFFD00) // (RSTC) Base Address +#define AT91C_BASE_RTTC ((AT91PS_RTTC) 0xFFFFFD20) // (RTTC) Base Address +#define AT91C_BASE_PITC ((AT91PS_PITC) 0xFFFFFD30) // (PITC) Base Address +#define AT91C_BASE_WDTC ((AT91PS_WDTC) 0xFFFFFD40) // (WDTC) Base Address +#define AT91C_BASE_VREG ((AT91PS_VREG) 0xFFFFFD60) // (VREG) Base Address +#define AT91C_BASE_MC ((AT91PS_MC) 0xFFFFFF00) // (MC) Base Address +#define AT91C_BASE_PDC_SPI1 ((AT91PS_PDC) 0xFFFE4100) // (PDC_SPI1) Base Address +#define AT91C_BASE_SPI1 ((AT91PS_SPI) 0xFFFE4000) // (SPI1) Base Address +#define AT91C_BASE_PDC_SPI0 ((AT91PS_PDC) 0xFFFE0100) // (PDC_SPI0) Base Address +#define AT91C_BASE_SPI0 ((AT91PS_SPI) 0xFFFE0000) // (SPI0) Base Address +#define AT91C_BASE_PDC_US1 ((AT91PS_PDC) 0xFFFC4100) // (PDC_US1) Base Address +#define AT91C_BASE_US1 ((AT91PS_USART) 0xFFFC4000) // (US1) Base Address +#define AT91C_BASE_PDC_US0 ((AT91PS_PDC) 0xFFFC0100) // (PDC_US0) Base Address +#define AT91C_BASE_US0 ((AT91PS_USART) 0xFFFC0000) // (US0) Base Address +#define AT91C_BASE_PDC_SSC ((AT91PS_PDC) 0xFFFD4100) // (PDC_SSC) Base Address +#define AT91C_BASE_SSC ((AT91PS_SSC) 0xFFFD4000) // (SSC) Base Address +#define AT91C_BASE_TWI ((AT91PS_TWI) 0xFFFB8000) // (TWI) Base Address +#define AT91C_BASE_PWMC_CH3 ((AT91PS_PWMC_CH) 0xFFFCC260) // (PWMC_CH3) Base Address +#define AT91C_BASE_PWMC_CH2 ((AT91PS_PWMC_CH) 0xFFFCC240) // (PWMC_CH2) Base Address +#define AT91C_BASE_PWMC_CH1 ((AT91PS_PWMC_CH) 0xFFFCC220) // (PWMC_CH1) Base Address +#define AT91C_BASE_PWMC_CH0 ((AT91PS_PWMC_CH) 0xFFFCC200) // (PWMC_CH0) Base Address +#define AT91C_BASE_PWMC ((AT91PS_PWMC) 0xFFFCC000) // (PWMC) Base Address +#define AT91C_BASE_UDP ((AT91PS_UDP) 0xFFFB0000) // (UDP) Base Address +#define AT91C_BASE_TC0 ((AT91PS_TC) 0xFFFA0000) // (TC0) Base Address +#define AT91C_BASE_TC1 ((AT91PS_TC) 0xFFFA0040) // (TC1) Base Address +#define AT91C_BASE_TC2 ((AT91PS_TC) 0xFFFA0080) // (TC2) Base Address +#define AT91C_BASE_TCB ((AT91PS_TCB) 0xFFFA0000) // (TCB) Base Address +#define AT91C_BASE_CAN_MB0 ((AT91PS_CAN_MB) 0xFFFD0200) // (CAN_MB0) Base Address +#define AT91C_BASE_CAN_MB1 ((AT91PS_CAN_MB) 0xFFFD0220) // (CAN_MB1) Base Address +#define AT91C_BASE_CAN_MB2 ((AT91PS_CAN_MB) 0xFFFD0240) // (CAN_MB2) Base Address +#define AT91C_BASE_CAN_MB3 ((AT91PS_CAN_MB) 0xFFFD0260) // (CAN_MB3) Base Address +#define AT91C_BASE_CAN_MB4 ((AT91PS_CAN_MB) 0xFFFD0280) // (CAN_MB4) Base Address +#define AT91C_BASE_CAN_MB5 ((AT91PS_CAN_MB) 0xFFFD02A0) // (CAN_MB5) Base Address +#define AT91C_BASE_CAN_MB6 ((AT91PS_CAN_MB) 0xFFFD02C0) // (CAN_MB6) Base Address +#define AT91C_BASE_CAN_MB7 ((AT91PS_CAN_MB) 0xFFFD02E0) // (CAN_MB7) Base Address +#define AT91C_BASE_CAN ((AT91PS_CAN) 0xFFFD0000) // (CAN) Base Address +#define AT91C_BASE_EMAC ((AT91PS_EMAC) 0xFFFDC000) // (EMAC) Base Address +#define AT91C_BASE_PDC_ADC ((AT91PS_PDC) 0xFFFD8100) // (PDC_ADC) Base Address +#define AT91C_BASE_ADC ((AT91PS_ADC) 0xFFFD8000) // (ADC) Base Address +#define AT91C_BASE_PDC_AES ((AT91PS_PDC) 0xFFFA4100) // (PDC_AES) Base Address +#define AT91C_BASE_AES ((AT91PS_AES) 0xFFFA4000) // (AES) Base Address +#define AT91C_BASE_PDC_TDES ((AT91PS_PDC) 0xFFFA8100) // (PDC_TDES) Base Address +#define AT91C_BASE_TDES ((AT91PS_TDES) 0xFFFA8000) // (TDES) Base Address + +// ***************************************************************************** +// MEMORY MAPPING DEFINITIONS FOR AT91SAM7X256 +// ***************************************************************************** +#define AT91C_ISRAM ((char *) 0x00200000) // Internal SRAM base address +#define AT91C_ISRAM_SIZE ((unsigned int) 0x00010000) // Internal SRAM size in byte (64 Kbyte) +#define AT91C_IFLASH ((char *) 0x00100000) // Internal ROM base address +#define AT91C_IFLASH_SIZE ((unsigned int) 0x00040000) // Internal ROM size in byte (256 Kbyte) + + + +// - Hardware register definition + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR System Peripherals +// - ***************************************************************************** + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR Advanced Interrupt Controller +// - ***************************************************************************** +// - -------- AIC_SMR : (AIC Offset: 0x0) Control Register -------- +#if 0 /*_RB_*/ +AT91C_AIC_PRIOR EQU (0x7 << 0) ;- (AIC) Priority Level +AT91C_AIC_PRIOR_LOWEST EQU (0x0) ;- (AIC) Lowest priority level +AT91C_AIC_PRIOR_HIGHEST EQU (0x7) ;- (AIC) Highest priority level +AT91C_AIC_SRCTYPE EQU (0x3 << 5) ;- (AIC) Interrupt Source Type +AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL EQU (0x0 << 5) ;- (AIC) Internal Sources Code Label High-level Sensitive +AT91C_AIC_SRCTYPE_EXT_LOW_LEVEL EQU (0x0 << 5) ;- (AIC) External Sources Code Label Low-level Sensitive +AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE EQU (0x1 << 5) ;- (AIC) Internal Sources Code Label Positive Edge triggered +AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE EQU (0x1 << 5) ;- (AIC) External Sources Code Label Negative Edge triggered +AT91C_AIC_SRCTYPE_HIGH_LEVEL EQU (0x2 << 5) ;- (AIC) Internal Or External Sources Code Label High-level Sensitive +AT91C_AIC_SRCTYPE_POSITIVE_EDGE EQU (0x3 << 5) ;- (AIC) Internal Or External Sources Code Label Positive Edge triggered +// - -------- AIC_CISR : (AIC Offset: 0x114) AIC Core Interrupt Status Register -------- +AT91C_AIC_NFIQ EQU (0x1 << 0) ;- (AIC) NFIQ Status +AT91C_AIC_NIRQ EQU (0x1 << 1) ;- (AIC) NIRQ Status +// - -------- AIC_DCR : (AIC Offset: 0x138) AIC Debug Control Register (Protect) -------- +AT91C_AIC_DCR_PROT EQU (0x1 << 0) ;- (AIC) Protection Mode +AT91C_AIC_DCR_GMSK EQU (0x1 << 1) ;- (AIC) General Mask +#endif +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR Peripheral DMA Controller +// - ***************************************************************************** +// - -------- PDC_PTCR : (PDC Offset: 0x20) PDC Transfer Control Register -------- +AT91C_PDC_RXTEN EQU (0x1 << 0) ;- (PDC) Receiver Transfer Enable +AT91C_PDC_RXTDIS EQU (0x1 << 1) ;- (PDC) Receiver Transfer Disable +AT91C_PDC_TXTEN EQU (0x1 << 8) ;- (PDC) Transmitter Transfer Enable +AT91C_PDC_TXTDIS EQU (0x1 << 9) ;- (PDC) Transmitter Transfer Disable +// - -------- PDC_PTSR : (PDC Offset: 0x24) PDC Transfer Status Register -------- + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR Debug Unit +// - ***************************************************************************** +// - -------- DBGU_CR : (DBGU Offset: 0x0) Debug Unit Control Register -------- +AT91C_US_RSTRX EQU (0x1 << 2) ;- (DBGU) Reset Receiver +AT91C_US_RSTTX EQU (0x1 << 3) ;- (DBGU) Reset Transmitter +AT91C_US_RXEN EQU (0x1 << 4) ;- (DBGU) Receiver Enable +AT91C_US_RXDIS EQU (0x1 << 5) ;- (DBGU) Receiver Disable +AT91C_US_TXEN EQU (0x1 << 6) ;- (DBGU) Transmitter Enable +AT91C_US_TXDIS EQU (0x1 << 7) ;- (DBGU) Transmitter Disable +AT91C_US_RSTSTA EQU (0x1 << 8) ;- (DBGU) Reset Status Bits +// - -------- DBGU_MR : (DBGU Offset: 0x4) Debug Unit Mode Register -------- +AT91C_US_PAR EQU (0x7 << 9) ;- (DBGU) Parity type +AT91C_US_PAR_EVEN EQU (0x0 << 9) ;- (DBGU) Even Parity +AT91C_US_PAR_ODD EQU (0x1 << 9) ;- (DBGU) Odd Parity +AT91C_US_PAR_SPACE EQU (0x2 << 9) ;- (DBGU) Parity forced to 0 (Space) +AT91C_US_PAR_MARK EQU (0x3 << 9) ;- (DBGU) Parity forced to 1 (Mark) +AT91C_US_PAR_NONE EQU (0x4 << 9) ;- (DBGU) No Parity +AT91C_US_PAR_MULTI_DROP EQU (0x6 << 9) ;- (DBGU) Multi-drop mode +AT91C_US_CHMODE EQU (0x3 << 14) ;- (DBGU) Channel Mode +AT91C_US_CHMODE_NORMAL EQU (0x0 << 14) ;- (DBGU) Normal Mode: The USART channel operates as an RX/TX USART. +AT91C_US_CHMODE_AUTO EQU (0x1 << 14) ;- (DBGU) Automatic Echo: Receiver Data Input is connected to the TXD pin. +AT91C_US_CHMODE_LOCAL EQU (0x2 << 14) ;- (DBGU) Local Loopback: Transmitter Output Signal is connected to Receiver Input Signal. +AT91C_US_CHMODE_REMOTE EQU (0x3 << 14) ;- (DBGU) Remote Loopback: RXD pin is internally connected to TXD pin. +// - -------- DBGU_IER : (DBGU Offset: 0x8) Debug Unit Interrupt Enable Register -------- +AT91C_US_RXRDY EQU (0x1 << 0) ;- (DBGU) RXRDY Interrupt +AT91C_US_TXRDY EQU (0x1 << 1) ;- (DBGU) TXRDY Interrupt +AT91C_US_ENDRX EQU (0x1 << 3) ;- (DBGU) End of Receive Transfer Interrupt +AT91C_US_ENDTX EQU (0x1 << 4) ;- (DBGU) End of Transmit Interrupt +AT91C_US_OVRE EQU (0x1 << 5) ;- (DBGU) Overrun Interrupt +AT91C_US_FRAME EQU (0x1 << 6) ;- (DBGU) Framing Error Interrupt +AT91C_US_PARE EQU (0x1 << 7) ;- (DBGU) Parity Error Interrupt +AT91C_US_TXEMPTY EQU (0x1 << 9) ;- (DBGU) TXEMPTY Interrupt +AT91C_US_TXBUFE EQU (0x1 << 11) ;- (DBGU) TXBUFE Interrupt +AT91C_US_RXBUFF EQU (0x1 << 12) ;- (DBGU) RXBUFF Interrupt +AT91C_US_COMM_TX EQU (0x1 << 30) ;- (DBGU) COMM_TX Interrupt +AT91C_US_COMM_RX EQU (0x1 << 31) ;- (DBGU) COMM_RX Interrupt +// - -------- DBGU_IDR : (DBGU Offset: 0xc) Debug Unit Interrupt Disable Register -------- +// - -------- DBGU_IMR : (DBGU Offset: 0x10) Debug Unit Interrupt Mask Register -------- +// - -------- DBGU_CSR : (DBGU Offset: 0x14) Debug Unit Channel Status Register -------- +// - -------- DBGU_FNTR : (DBGU Offset: 0x48) Debug Unit FORCE_NTRST Register -------- +AT91C_US_FORCE_NTRST EQU (0x1 << 0) ;- (DBGU) Force NTRST in JTAG + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR Parallel Input Output Controler +// - ***************************************************************************** + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR Clock Generator Controler +// - ***************************************************************************** +// - -------- CKGR_MOR : (CKGR Offset: 0x0) Main Oscillator Register -------- +AT91C_CKGR_MOSCEN EQU (0x1 << 0) ;- (CKGR) Main Oscillator Enable +AT91C_CKGR_OSCBYPASS EQU (0x1 << 1) ;- (CKGR) Main Oscillator Bypass +AT91C_CKGR_OSCOUNT EQU (0xFF << 8) ;- (CKGR) Main Oscillator Start-up Time +// - -------- CKGR_MCFR : (CKGR Offset: 0x4) Main Clock Frequency Register -------- +AT91C_CKGR_MAINF EQU (0xFFFF << 0) ;- (CKGR) Main Clock Frequency +AT91C_CKGR_MAINRDY EQU (0x1 << 16) ;- (CKGR) Main Clock Ready +// - -------- CKGR_PLLR : (CKGR Offset: 0xc) PLL B Register -------- +AT91C_CKGR_DIV EQU (0xFF << 0) ;- (CKGR) Divider Selected +AT91C_CKGR_DIV_0 EQU (0x0) ;- (CKGR) Divider output is 0 +AT91C_CKGR_DIV_BYPASS EQU (0x1) ;- (CKGR) Divider is bypassed +AT91C_CKGR_PLLCOUNT EQU (0x3F << 8) ;- (CKGR) PLL Counter +AT91C_CKGR_OUT EQU (0x3 << 14) ;- (CKGR) PLL Output Frequency Range +AT91C_CKGR_OUT_0 EQU (0x0 << 14) ;- (CKGR) Please refer to the PLL datasheet +AT91C_CKGR_OUT_1 EQU (0x1 << 14) ;- (CKGR) Please refer to the PLL datasheet +AT91C_CKGR_OUT_2 EQU (0x2 << 14) ;- (CKGR) Please refer to the PLL datasheet +AT91C_CKGR_OUT_3 EQU (0x3 << 14) ;- (CKGR) Please refer to the PLL datasheet +AT91C_CKGR_MUL EQU (0x7FF << 16) ;- (CKGR) PLL Multiplier +AT91C_CKGR_USBDIV EQU (0x3 << 28) ;- (CKGR) Divider for USB Clocks +AT91C_CKGR_USBDIV_0 EQU (0x0 << 28) ;- (CKGR) Divider output is PLL clock output +AT91C_CKGR_USBDIV_1 EQU (0x1 << 28) ;- (CKGR) Divider output is PLL clock output divided by 2 +AT91C_CKGR_USBDIV_2 EQU (0x2 << 28) ;- (CKGR) Divider output is PLL clock output divided by 4 + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR Power Management Controler +// - ***************************************************************************** +// - -------- PMC_SCER : (PMC Offset: 0x0) System Clock Enable Register -------- +AT91C_PMC_PCK EQU (0x1 << 0) ;- (PMC) Processor Clock +AT91C_PMC_UDP EQU (0x1 << 7) ;- (PMC) USB Device Port Clock +AT91C_PMC_PCK0 EQU (0x1 << 8) ;- (PMC) Programmable Clock Output +AT91C_PMC_PCK1 EQU (0x1 << 9) ;- (PMC) Programmable Clock Output +AT91C_PMC_PCK2 EQU (0x1 << 10) ;- (PMC) Programmable Clock Output +AT91C_PMC_PCK3 EQU (0x1 << 11) ;- (PMC) Programmable Clock Output +// - -------- PMC_SCDR : (PMC Offset: 0x4) System Clock Disable Register -------- +// - -------- PMC_SCSR : (PMC Offset: 0x8) System Clock Status Register -------- +// - -------- CKGR_MOR : (PMC Offset: 0x20) Main Oscillator Register -------- +// - -------- CKGR_MCFR : (PMC Offset: 0x24) Main Clock Frequency Register -------- +// - -------- CKGR_PLLR : (PMC Offset: 0x2c) PLL B Register -------- +// - -------- PMC_MCKR : (PMC Offset: 0x30) Master Clock Register -------- +AT91C_PMC_CSS EQU (0x3 << 0) ;- (PMC) Programmable Clock Selection +AT91C_PMC_CSS_SLOW_CLK EQU (0x0) ;- (PMC) Slow Clock is selected +AT91C_PMC_CSS_MAIN_CLK EQU (0x1) ;- (PMC) Main Clock is selected +AT91C_PMC_CSS_PLL_CLK EQU (0x3) ;- (PMC) Clock from PLL is selected +AT91C_PMC_PRES EQU (0x7 << 2) ;- (PMC) Programmable Clock Prescaler +AT91C_PMC_PRES_CLK EQU (0x0 << 2) ;- (PMC) Selected clock +AT91C_PMC_PRES_CLK_2 EQU (0x1 << 2) ;- (PMC) Selected clock divided by 2 +AT91C_PMC_PRES_CLK_4 EQU (0x2 << 2) ;- (PMC) Selected clock divided by 4 +AT91C_PMC_PRES_CLK_8 EQU (0x3 << 2) ;- (PMC) Selected clock divided by 8 +AT91C_PMC_PRES_CLK_16 EQU (0x4 << 2) ;- (PMC) Selected clock divided by 16 +AT91C_PMC_PRES_CLK_32 EQU (0x5 << 2) ;- (PMC) Selected clock divided by 32 +AT91C_PMC_PRES_CLK_64 EQU (0x6 << 2) ;- (PMC) Selected clock divided by 64 +// - -------- PMC_PCKR : (PMC Offset: 0x40) Programmable Clock Register -------- +// - -------- PMC_IER : (PMC Offset: 0x60) PMC Interrupt Enable Register -------- +AT91C_PMC_MOSCS EQU (0x1 << 0) ;- (PMC) MOSC Status/Enable/Disable/Mask +AT91C_PMC_LOCK EQU (0x1 << 2) ;- (PMC) PLL Status/Enable/Disable/Mask +AT91C_PMC_MCKRDY EQU (0x1 << 3) ;- (PMC) MCK_RDY Status/Enable/Disable/Mask +AT91C_PMC_PCK0RDY EQU (0x1 << 8) ;- (PMC) PCK0_RDY Status/Enable/Disable/Mask +AT91C_PMC_PCK1RDY EQU (0x1 << 9) ;- (PMC) PCK1_RDY Status/Enable/Disable/Mask +AT91C_PMC_PCK2RDY EQU (0x1 << 10) ;- (PMC) PCK2_RDY Status/Enable/Disable/Mask +AT91C_PMC_PCK3RDY EQU (0x1 << 11) ;- (PMC) PCK3_RDY Status/Enable/Disable/Mask +// - -------- PMC_IDR : (PMC Offset: 0x64) PMC Interrupt Disable Register -------- +// - -------- PMC_SR : (PMC Offset: 0x68) PMC Status Register -------- +// - -------- PMC_IMR : (PMC Offset: 0x6c) PMC Interrupt Mask Register -------- + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR Reset Controller Interface +// - ***************************************************************************** +// - -------- RSTC_RCR : (RSTC Offset: 0x0) Reset Control Register -------- +AT91C_RSTC_PROCRST EQU (0x1 << 0) ;- (RSTC) Processor Reset +AT91C_RSTC_PERRST EQU (0x1 << 2) ;- (RSTC) Peripheral Reset +AT91C_RSTC_EXTRST EQU (0x1 << 3) ;- (RSTC) External Reset +AT91C_RSTC_KEY EQU (0xFF << 24) ;- (RSTC) Password +// - -------- RSTC_RSR : (RSTC Offset: 0x4) Reset Status Register -------- +AT91C_RSTC_URSTS EQU (0x1 << 0) ;- (RSTC) User Reset Status +AT91C_RSTC_BODSTS EQU (0x1 << 1) ;- (RSTC) Brownout Detection Status +AT91C_RSTC_RSTTYP EQU (0x7 << 8) ;- (RSTC) Reset Type +AT91C_RSTC_RSTTYP_POWERUP EQU (0x0 << 8) ;- (RSTC) Power-up Reset. VDDCORE rising. +AT91C_RSTC_RSTTYP_WAKEUP EQU (0x1 << 8) ;- (RSTC) WakeUp Reset. VDDCORE rising. +AT91C_RSTC_RSTTYP_WATCHDOG EQU (0x2 << 8) ;- (RSTC) Watchdog Reset. Watchdog overflow occured. +AT91C_RSTC_RSTTYP_SOFTWARE EQU (0x3 << 8) ;- (RSTC) Software Reset. Processor reset required by the software. +AT91C_RSTC_RSTTYP_USER EQU (0x4 << 8) ;- (RSTC) User Reset. NRST pin detected low. +AT91C_RSTC_RSTTYP_BROWNOUT EQU (0x5 << 8) ;- (RSTC) Brownout Reset occured. +AT91C_RSTC_NRSTL EQU (0x1 << 16) ;- (RSTC) NRST pin level +AT91C_RSTC_SRCMP EQU (0x1 << 17) ;- (RSTC) Software Reset Command in Progress. +// - -------- RSTC_RMR : (RSTC Offset: 0x8) Reset Mode Register -------- +AT91C_RSTC_URSTEN EQU (0x1 << 0) ;- (RSTC) User Reset Enable +AT91C_RSTC_URSTIEN EQU (0x1 << 4) ;- (RSTC) User Reset Interrupt Enable +AT91C_RSTC_ERSTL EQU (0xF << 8) ;- (RSTC) User Reset Enable +AT91C_RSTC_BODIEN EQU (0x1 << 16) ;- (RSTC) Brownout Detection Interrupt Enable + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR Real Time Timer Controller Interface +// - ***************************************************************************** +// - -------- RTTC_RTMR : (RTTC Offset: 0x0) Real-time Mode Register -------- +AT91C_RTTC_RTPRES EQU (0xFFFF << 0) ;- (RTTC) Real-time Timer Prescaler Value +AT91C_RTTC_ALMIEN EQU (0x1 << 16) ;- (RTTC) Alarm Interrupt Enable +AT91C_RTTC_RTTINCIEN EQU (0x1 << 17) ;- (RTTC) Real Time Timer Increment Interrupt Enable +AT91C_RTTC_RTTRST EQU (0x1 << 18) ;- (RTTC) Real Time Timer Restart +// - -------- RTTC_RTAR : (RTTC Offset: 0x4) Real-time Alarm Register -------- +AT91C_RTTC_ALMV EQU (0x0 << 0) ;- (RTTC) Alarm Value +// - -------- RTTC_RTVR : (RTTC Offset: 0x8) Current Real-time Value Register -------- +AT91C_RTTC_CRTV EQU (0x0 << 0) ;- (RTTC) Current Real-time Value +// - -------- RTTC_RTSR : (RTTC Offset: 0xc) Real-time Status Register -------- +AT91C_RTTC_ALMS EQU (0x1 << 0) ;- (RTTC) Real-time Alarm Status +AT91C_RTTC_RTTINC EQU (0x1 << 1) ;- (RTTC) Real-time Timer Increment + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR Periodic Interval Timer Controller Interface +// - ***************************************************************************** +// - -------- PITC_PIMR : (PITC Offset: 0x0) Periodic Interval Mode Register -------- +AT91C_PITC_PIV EQU (0xFFFFF << 0) ;- (PITC) Periodic Interval Value +AT91C_PITC_PITEN EQU (0x1 << 24) ;- (PITC) Periodic Interval Timer Enabled +AT91C_PITC_PITIEN EQU (0x1 << 25) ;- (PITC) Periodic Interval Timer Interrupt Enable +// - -------- PITC_PISR : (PITC Offset: 0x4) Periodic Interval Status Register -------- +AT91C_PITC_PITS EQU (0x1 << 0) ;- (PITC) Periodic Interval Timer Status +// - -------- PITC_PIVR : (PITC Offset: 0x8) Periodic Interval Value Register -------- +AT91C_PITC_CPIV EQU (0xFFFFF << 0) ;- (PITC) Current Periodic Interval Value +AT91C_PITC_PICNT EQU (0xFFF << 20) ;- (PITC) Periodic Interval Counter +// - -------- PITC_PIIR : (PITC Offset: 0xc) Periodic Interval Image Register -------- + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR Watchdog Timer Controller Interface +// - ***************************************************************************** +// - -------- WDTC_WDCR : (WDTC Offset: 0x0) Periodic Interval Image Register -------- +AT91C_WDTC_WDRSTT EQU (0x1 << 0) ;- (WDTC) Watchdog Restart +AT91C_WDTC_KEY EQU (0xFF << 24) ;- (WDTC) Watchdog KEY Password +// - -------- WDTC_WDMR : (WDTC Offset: 0x4) Watchdog Mode Register -------- +AT91C_WDTC_WDV EQU (0xFFF << 0) ;- (WDTC) Watchdog Timer Restart +AT91C_WDTC_WDFIEN EQU (0x1 << 12) ;- (WDTC) Watchdog Fault Interrupt Enable +AT91C_WDTC_WDRSTEN EQU (0x1 << 13) ;- (WDTC) Watchdog Reset Enable +AT91C_WDTC_WDRPROC EQU (0x1 << 14) ;- (WDTC) Watchdog Timer Restart +AT91C_WDTC_WDDIS EQU (0x1 << 15) ;- (WDTC) Watchdog Disable +AT91C_WDTC_WDD EQU (0xFFF << 16) ;- (WDTC) Watchdog Delta Value +AT91C_WDTC_WDDBGHLT EQU (0x1 << 28) ;- (WDTC) Watchdog Debug Halt +AT91C_WDTC_WDIDLEHLT EQU (0x1 << 29) ;- (WDTC) Watchdog Idle Halt +// - -------- WDTC_WDSR : (WDTC Offset: 0x8) Watchdog Status Register -------- +AT91C_WDTC_WDUNF EQU (0x1 << 0) ;- (WDTC) Watchdog Underflow +AT91C_WDTC_WDERR EQU (0x1 << 1) ;- (WDTC) Watchdog Error + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR Voltage Regulator Mode Controller Interface +// - ***************************************************************************** +// - -------- VREG_MR : (VREG Offset: 0x0) Voltage Regulator Mode Register -------- +AT91C_VREG_PSTDBY EQU (0x1 << 0) ;- (VREG) Voltage Regulator Power Standby Mode + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR Memory Controller Interface +// - ***************************************************************************** +// - -------- MC_RCR : (MC Offset: 0x0) MC Remap Control Register -------- +AT91C_MC_RCB EQU (0x1 << 0) ;- (MC) Remap Command Bit +// - -------- MC_ASR : (MC Offset: 0x4) MC Abort Status Register -------- +AT91C_MC_UNDADD EQU (0x1 << 0) ;- (MC) Undefined Addess Abort Status +AT91C_MC_MISADD EQU (0x1 << 1) ;- (MC) Misaligned Addess Abort Status +AT91C_MC_ABTSZ EQU (0x3 << 8) ;- (MC) Abort Size Status +AT91C_MC_ABTSZ_BYTE EQU (0x0 << 8) ;- (MC) Byte +AT91C_MC_ABTSZ_HWORD EQU (0x1 << 8) ;- (MC) Half-word +AT91C_MC_ABTSZ_WORD EQU (0x2 << 8) ;- (MC) Word +AT91C_MC_ABTTYP EQU (0x3 << 10) ;- (MC) Abort Type Status +AT91C_MC_ABTTYP_DATAR EQU (0x0 << 10) ;- (MC) Data Read +AT91C_MC_ABTTYP_DATAW EQU (0x1 << 10) ;- (MC) Data Write +AT91C_MC_ABTTYP_FETCH EQU (0x2 << 10) ;- (MC) Code Fetch +AT91C_MC_MST0 EQU (0x1 << 16) ;- (MC) Master 0 Abort Source +AT91C_MC_MST1 EQU (0x1 << 17) ;- (MC) Master 1 Abort Source +AT91C_MC_SVMST0 EQU (0x1 << 24) ;- (MC) Saved Master 0 Abort Source +AT91C_MC_SVMST1 EQU (0x1 << 25) ;- (MC) Saved Master 1 Abort Source +// - -------- MC_FMR : (MC Offset: 0x60) MC Flash Mode Register -------- +AT91C_MC_FRDY EQU (0x1 << 0) ;- (MC) Flash Ready +AT91C_MC_LOCKE EQU (0x1 << 2) ;- (MC) Lock Error +AT91C_MC_PROGE EQU (0x1 << 3) ;- (MC) Programming Error +AT91C_MC_NEBP EQU (0x1 << 7) ;- (MC) No Erase Before Programming +AT91C_MC_FWS EQU (0x3 << 8) ;- (MC) Flash Wait State +AT91C_MC_FWS_0FWS EQU (0x0 << 8) ;- (MC) 1 cycle for Read, 2 for Write operations +AT91C_MC_FWS_1FWS EQU (0x1 << 8) ;- (MC) 2 cycles for Read, 3 for Write operations +AT91C_MC_FWS_2FWS EQU (0x2 << 8) ;- (MC) 3 cycles for Read, 4 for Write operations +AT91C_MC_FWS_3FWS EQU (0x3 << 8) ;- (MC) 4 cycles for Read, 4 for Write operations +AT91C_MC_FMCN EQU (0xFF << 16) ;- (MC) Flash Microsecond Cycle Number +// - -------- MC_FCR : (MC Offset: 0x64) MC Flash Command Register -------- +AT91C_MC_FCMD EQU (0xF << 0) ;- (MC) Flash Command +AT91C_MC_FCMD_START_PROG EQU (0x1) ;- (MC) Starts the programming of th epage specified by PAGEN. +AT91C_MC_FCMD_LOCK EQU (0x2) ;- (MC) Starts a lock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. +AT91C_MC_FCMD_PROG_AND_LOCK EQU (0x3) ;- (MC) The lock sequence automatically happens after the programming sequence is completed. +AT91C_MC_FCMD_UNLOCK EQU (0x4) ;- (MC) Starts an unlock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. +AT91C_MC_FCMD_ERASE_ALL EQU (0x8) ;- (MC) Starts the erase of the entire flash.If at least a page is locked, the command is cancelled. +AT91C_MC_FCMD_SET_GP_NVM EQU (0xB) ;- (MC) Set General Purpose NVM bits. +AT91C_MC_FCMD_CLR_GP_NVM EQU (0xD) ;- (MC) Clear General Purpose NVM bits. +AT91C_MC_FCMD_SET_SECURITY EQU (0xF) ;- (MC) Set Security Bit. +AT91C_MC_PAGEN EQU (0x3FF << 8) ;- (MC) Page Number +AT91C_MC_KEY EQU (0xFF << 24) ;- (MC) Writing Protect Key +// - -------- MC_FSR : (MC Offset: 0x68) MC Flash Command Register -------- +AT91C_MC_SECURITY EQU (0x1 << 4) ;- (MC) Security Bit Status +AT91C_MC_GPNVM0 EQU (0x1 << 8) ;- (MC) Sector 0 Lock Status +AT91C_MC_GPNVM1 EQU (0x1 << 9) ;- (MC) Sector 1 Lock Status +AT91C_MC_GPNVM2 EQU (0x1 << 10) ;- (MC) Sector 2 Lock Status +AT91C_MC_GPNVM3 EQU (0x1 << 11) ;- (MC) Sector 3 Lock Status +AT91C_MC_GPNVM4 EQU (0x1 << 12) ;- (MC) Sector 4 Lock Status +AT91C_MC_GPNVM5 EQU (0x1 << 13) ;- (MC) Sector 5 Lock Status +AT91C_MC_GPNVM6 EQU (0x1 << 14) ;- (MC) Sector 6 Lock Status +AT91C_MC_GPNVM7 EQU (0x1 << 15) ;- (MC) Sector 7 Lock Status +AT91C_MC_LOCKS0 EQU (0x1 << 16) ;- (MC) Sector 0 Lock Status +AT91C_MC_LOCKS1 EQU (0x1 << 17) ;- (MC) Sector 1 Lock Status +AT91C_MC_LOCKS2 EQU (0x1 << 18) ;- (MC) Sector 2 Lock Status +AT91C_MC_LOCKS3 EQU (0x1 << 19) ;- (MC) Sector 3 Lock Status +AT91C_MC_LOCKS4 EQU (0x1 << 20) ;- (MC) Sector 4 Lock Status +AT91C_MC_LOCKS5 EQU (0x1 << 21) ;- (MC) Sector 5 Lock Status +AT91C_MC_LOCKS6 EQU (0x1 << 22) ;- (MC) Sector 6 Lock Status +AT91C_MC_LOCKS7 EQU (0x1 << 23) ;- (MC) Sector 7 Lock Status +AT91C_MC_LOCKS8 EQU (0x1 << 24) ;- (MC) Sector 8 Lock Status +AT91C_MC_LOCKS9 EQU (0x1 << 25) ;- (MC) Sector 9 Lock Status +AT91C_MC_LOCKS10 EQU (0x1 << 26) ;- (MC) Sector 10 Lock Status +AT91C_MC_LOCKS11 EQU (0x1 << 27) ;- (MC) Sector 11 Lock Status +AT91C_MC_LOCKS12 EQU (0x1 << 28) ;- (MC) Sector 12 Lock Status +AT91C_MC_LOCKS13 EQU (0x1 << 29) ;- (MC) Sector 13 Lock Status +AT91C_MC_LOCKS14 EQU (0x1 << 30) ;- (MC) Sector 14 Lock Status +AT91C_MC_LOCKS15 EQU (0x1 << 31) ;- (MC) Sector 15 Lock Status + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR Serial Parallel Interface +// - ***************************************************************************** +// - -------- SPI_CR : (SPI Offset: 0x0) SPI Control Register -------- +AT91C_SPI_SPIEN EQU (0x1 << 0) ;- (SPI) SPI Enable +AT91C_SPI_SPIDIS EQU (0x1 << 1) ;- (SPI) SPI Disable +AT91C_SPI_SWRST EQU (0x1 << 7) ;- (SPI) SPI Software reset +AT91C_SPI_LASTXFER EQU (0x1 << 24) ;- (SPI) SPI Last Transfer +// - -------- SPI_MR : (SPI Offset: 0x4) SPI Mode Register -------- +AT91C_SPI_MSTR EQU (0x1 << 0) ;- (SPI) Master/Slave Mode +AT91C_SPI_PS EQU (0x1 << 1) ;- (SPI) Peripheral Select +AT91C_SPI_PS_FIXED EQU (0x0 << 1) ;- (SPI) Fixed Peripheral Select +AT91C_SPI_PS_VARIABLE EQU (0x1 << 1) ;- (SPI) Variable Peripheral Select +AT91C_SPI_PCSDEC EQU (0x1 << 2) ;- (SPI) Chip Select Decode +AT91C_SPI_FDIV EQU (0x1 << 3) ;- (SPI) Clock Selection +AT91C_SPI_MODFDIS EQU (0x1 << 4) ;- (SPI) Mode Fault Detection +AT91C_SPI_LLB EQU (0x1 << 7) ;- (SPI) Clock Selection +AT91C_SPI_PCS EQU (0xF << 16) ;- (SPI) Peripheral Chip Select +AT91C_SPI_DLYBCS EQU (0xFF << 24) ;- (SPI) Delay Between Chip Selects +// - -------- SPI_RDR : (SPI Offset: 0x8) Receive Data Register -------- +AT91C_SPI_RD EQU (0xFFFF << 0) ;- (SPI) Receive Data +AT91C_SPI_RPCS EQU (0xF << 16) ;- (SPI) Peripheral Chip Select Status +// - -------- SPI_TDR : (SPI Offset: 0xc) Transmit Data Register -------- +AT91C_SPI_TD EQU (0xFFFF << 0) ;- (SPI) Transmit Data +AT91C_SPI_TPCS EQU (0xF << 16) ;- (SPI) Peripheral Chip Select Status +// - -------- SPI_SR : (SPI Offset: 0x10) Status Register -------- +AT91C_SPI_RDRF EQU (0x1 << 0) ;- (SPI) Receive Data Register Full +AT91C_SPI_TDRE EQU (0x1 << 1) ;- (SPI) Transmit Data Register Empty +AT91C_SPI_MODF EQU (0x1 << 2) ;- (SPI) Mode Fault Error +AT91C_SPI_OVRES EQU (0x1 << 3) ;- (SPI) Overrun Error Status +AT91C_SPI_ENDRX EQU (0x1 << 4) ;- (SPI) End of Receiver Transfer +AT91C_SPI_ENDTX EQU (0x1 << 5) ;- (SPI) End of Receiver Transfer +AT91C_SPI_RXBUFF EQU (0x1 << 6) ;- (SPI) RXBUFF Interrupt +AT91C_SPI_TXBUFE EQU (0x1 << 7) ;- (SPI) TXBUFE Interrupt +AT91C_SPI_NSSR EQU (0x1 << 8) ;- (SPI) NSSR Interrupt +AT91C_SPI_TXEMPTY EQU (0x1 << 9) ;- (SPI) TXEMPTY Interrupt +AT91C_SPI_SPIENS EQU (0x1 << 16) ;- (SPI) Enable Status +// - -------- SPI_IER : (SPI Offset: 0x14) Interrupt Enable Register -------- +// - -------- SPI_IDR : (SPI Offset: 0x18) Interrupt Disable Register -------- +// - -------- SPI_IMR : (SPI Offset: 0x1c) Interrupt Mask Register -------- +// - -------- SPI_CSR : (SPI Offset: 0x30) Chip Select Register -------- +AT91C_SPI_CPOL EQU (0x1 << 0) ;- (SPI) Clock Polarity +AT91C_SPI_NCPHA EQU (0x1 << 1) ;- (SPI) Clock Phase +AT91C_SPI_CSAAT EQU (0x1 << 3) ;- (SPI) Chip Select Active After Transfer +AT91C_SPI_BITS EQU (0xF << 4) ;- (SPI) Bits Per Transfer +AT91C_SPI_BITS_8 EQU (0x0 << 4) ;- (SPI) 8 Bits Per transfer +AT91C_SPI_BITS_9 EQU (0x1 << 4) ;- (SPI) 9 Bits Per transfer +AT91C_SPI_BITS_10 EQU (0x2 << 4) ;- (SPI) 10 Bits Per transfer +AT91C_SPI_BITS_11 EQU (0x3 << 4) ;- (SPI) 11 Bits Per transfer +AT91C_SPI_BITS_12 EQU (0x4 << 4) ;- (SPI) 12 Bits Per transfer +AT91C_SPI_BITS_13 EQU (0x5 << 4) ;- (SPI) 13 Bits Per transfer +AT91C_SPI_BITS_14 EQU (0x6 << 4) ;- (SPI) 14 Bits Per transfer +AT91C_SPI_BITS_15 EQU (0x7 << 4) ;- (SPI) 15 Bits Per transfer +AT91C_SPI_BITS_16 EQU (0x8 << 4) ;- (SPI) 16 Bits Per transfer +AT91C_SPI_SCBR EQU (0xFF << 8) ;- (SPI) Serial Clock Baud Rate +AT91C_SPI_DLYBS EQU (0xFF << 16) ;- (SPI) Delay Before SPCK +AT91C_SPI_DLYBCT EQU (0xFF << 24) ;- (SPI) Delay Between Consecutive Transfers + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR Usart +// - ***************************************************************************** +// - -------- US_CR : (USART Offset: 0x0) Debug Unit Control Register -------- +AT91C_US_STTBRK EQU (0x1 << 9) ;- (USART) Start Break +AT91C_US_STPBRK EQU (0x1 << 10) ;- (USART) Stop Break +AT91C_US_STTTO EQU (0x1 << 11) ;- (USART) Start Time-out +AT91C_US_SENDA EQU (0x1 << 12) ;- (USART) Send Address +AT91C_US_RSTIT EQU (0x1 << 13) ;- (USART) Reset Iterations +AT91C_US_RSTNACK EQU (0x1 << 14) ;- (USART) Reset Non Acknowledge +AT91C_US_RETTO EQU (0x1 << 15) ;- (USART) Rearm Time-out +AT91C_US_DTREN EQU (0x1 << 16) ;- (USART) Data Terminal ready Enable +AT91C_US_DTRDIS EQU (0x1 << 17) ;- (USART) Data Terminal ready Disable +AT91C_US_RTSEN EQU (0x1 << 18) ;- (USART) Request to Send enable +AT91C_US_RTSDIS EQU (0x1 << 19) ;- (USART) Request to Send Disable +// - -------- US_MR : (USART Offset: 0x4) Debug Unit Mode Register -------- +AT91C_US_USMODE EQU (0xF << 0) ;- (USART) Usart mode +AT91C_US_USMODE_NORMAL EQU (0x0) ;- (USART) Normal +AT91C_US_USMODE_RS485 EQU (0x1) ;- (USART) RS485 +AT91C_US_USMODE_HWHSH EQU (0x2) ;- (USART) Hardware Handshaking +AT91C_US_USMODE_MODEM EQU (0x3) ;- (USART) Modem +AT91C_US_USMODE_ISO7816_0 EQU (0x4) ;- (USART) ISO7816 protocol: T = 0 +AT91C_US_USMODE_ISO7816_1 EQU (0x6) ;- (USART) ISO7816 protocol: T = 1 +AT91C_US_USMODE_IRDA EQU (0x8) ;- (USART) IrDA +AT91C_US_USMODE_SWHSH EQU (0xC) ;- (USART) Software Handshaking +AT91C_US_CLKS EQU (0x3 << 4) ;- (USART) Clock Selection (Baud Rate generator Input Clock +AT91C_US_CLKS_CLOCK EQU (0x0 << 4) ;- (USART) Clock +AT91C_US_CLKS_FDIV1 EQU (0x1 << 4) ;- (USART) fdiv1 +AT91C_US_CLKS_SLOW EQU (0x2 << 4) ;- (USART) slow_clock (ARM) +AT91C_US_CLKS_EXT EQU (0x3 << 4) ;- (USART) External (SCK) +AT91C_US_CHRL EQU (0x3 << 6) ;- (USART) Clock Selection (Baud Rate generator Input Clock +AT91C_US_CHRL_5_BITS EQU (0x0 << 6) ;- (USART) Character Length: 5 bits +AT91C_US_CHRL_6_BITS EQU (0x1 << 6) ;- (USART) Character Length: 6 bits +AT91C_US_CHRL_7_BITS EQU (0x2 << 6) ;- (USART) Character Length: 7 bits +AT91C_US_CHRL_8_BITS EQU (0x3 << 6) ;- (USART) Character Length: 8 bits +AT91C_US_SYNC EQU (0x1 << 8) ;- (USART) Synchronous Mode Select +AT91C_US_NBSTOP EQU (0x3 << 12) ;- (USART) Number of Stop bits +AT91C_US_NBSTOP_1_BIT EQU (0x0 << 12) ;- (USART) 1 stop bit +AT91C_US_NBSTOP_15_BIT EQU (0x1 << 12) ;- (USART) Asynchronous (SYNC=0) 2 stop bits Synchronous (SYNC=1) 2 stop bits +AT91C_US_NBSTOP_2_BIT EQU (0x2 << 12) ;- (USART) 2 stop bits +AT91C_US_MSBF EQU (0x1 << 16) ;- (USART) Bit Order +AT91C_US_MODE9 EQU (0x1 << 17) ;- (USART) 9-bit Character length +AT91C_US_CKLO EQU (0x1 << 18) ;- (USART) Clock Output Select +AT91C_US_OVER EQU (0x1 << 19) ;- (USART) Over Sampling Mode +AT91C_US_INACK EQU (0x1 << 20) ;- (USART) Inhibit Non Acknowledge +AT91C_US_DSNACK EQU (0x1 << 21) ;- (USART) Disable Successive NACK +AT91C_US_MAX_ITER EQU (0x1 << 24) ;- (USART) Number of Repetitions +AT91C_US_FILTER EQU (0x1 << 28) ;- (USART) Receive Line Filter +// - -------- US_IER : (USART Offset: 0x8) Debug Unit Interrupt Enable Register -------- +AT91C_US_RXBRK EQU (0x1 << 2) ;- (USART) Break Received/End of Break +AT91C_US_TIMEOUT EQU (0x1 << 8) ;- (USART) Receiver Time-out +AT91C_US_ITERATION EQU (0x1 << 10) ;- (USART) Max number of Repetitions Reached +AT91C_US_NACK EQU (0x1 << 13) ;- (USART) Non Acknowledge +AT91C_US_RIIC EQU (0x1 << 16) ;- (USART) Ring INdicator Input Change Flag +AT91C_US_DSRIC EQU (0x1 << 17) ;- (USART) Data Set Ready Input Change Flag +AT91C_US_DCDIC EQU (0x1 << 18) ;- (USART) Data Carrier Flag +AT91C_US_CTSIC EQU (0x1 << 19) ;- (USART) Clear To Send Input Change Flag +// - -------- US_IDR : (USART Offset: 0xc) Debug Unit Interrupt Disable Register -------- +// - -------- US_IMR : (USART Offset: 0x10) Debug Unit Interrupt Mask Register -------- +// - -------- US_CSR : (USART Offset: 0x14) Debug Unit Channel Status Register -------- +AT91C_US_RI EQU (0x1 << 20) ;- (USART) Image of RI Input +AT91C_US_DSR EQU (0x1 << 21) ;- (USART) Image of DSR Input +AT91C_US_DCD EQU (0x1 << 22) ;- (USART) Image of DCD Input +AT91C_US_CTS EQU (0x1 << 23) ;- (USART) Image of CTS Input + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR Synchronous Serial Controller Interface +// - ***************************************************************************** +// - -------- SSC_CR : (SSC Offset: 0x0) SSC Control Register -------- +AT91C_SSC_RXEN EQU (0x1 << 0) ;- (SSC) Receive Enable +AT91C_SSC_RXDIS EQU (0x1 << 1) ;- (SSC) Receive Disable +AT91C_SSC_TXEN EQU (0x1 << 8) ;- (SSC) Transmit Enable +AT91C_SSC_TXDIS EQU (0x1 << 9) ;- (SSC) Transmit Disable +AT91C_SSC_SWRST EQU (0x1 << 15) ;- (SSC) Software Reset +// - -------- SSC_RCMR : (SSC Offset: 0x10) SSC Receive Clock Mode Register -------- +AT91C_SSC_CKS EQU (0x3 << 0) ;- (SSC) Receive/Transmit Clock Selection +AT91C_SSC_CKS_DIV EQU (0x0) ;- (SSC) Divided Clock +AT91C_SSC_CKS_TK EQU (0x1) ;- (SSC) TK Clock signal +AT91C_SSC_CKS_RK EQU (0x2) ;- (SSC) RK pin +AT91C_SSC_CKO EQU (0x7 << 2) ;- (SSC) Receive/Transmit Clock Output Mode Selection +AT91C_SSC_CKO_NONE EQU (0x0 << 2) ;- (SSC) Receive/Transmit Clock Output Mode: None RK pin: Input-only +AT91C_SSC_CKO_CONTINOUS EQU (0x1 << 2) ;- (SSC) Continuous Receive/Transmit Clock RK pin: Output +AT91C_SSC_CKO_DATA_TX EQU (0x2 << 2) ;- (SSC) Receive/Transmit Clock only during data transfers RK pin: Output +AT91C_SSC_CKI EQU (0x1 << 5) ;- (SSC) Receive/Transmit Clock Inversion +AT91C_SSC_START EQU (0xF << 8) ;- (SSC) Receive/Transmit Start Selection +AT91C_SSC_START_CONTINOUS EQU (0x0 << 8) ;- (SSC) Continuous, as soon as the receiver is enabled, and immediately after the end of transfer of the previous data. +AT91C_SSC_START_TX EQU (0x1 << 8) ;- (SSC) Transmit/Receive start +AT91C_SSC_START_LOW_RF EQU (0x2 << 8) ;- (SSC) Detection of a low level on RF input +AT91C_SSC_START_HIGH_RF EQU (0x3 << 8) ;- (SSC) Detection of a high level on RF input +AT91C_SSC_START_FALL_RF EQU (0x4 << 8) ;- (SSC) Detection of a falling edge on RF input +AT91C_SSC_START_RISE_RF EQU (0x5 << 8) ;- (SSC) Detection of a rising edge on RF input +AT91C_SSC_START_LEVEL_RF EQU (0x6 << 8) ;- (SSC) Detection of any level change on RF input +AT91C_SSC_START_EDGE_RF EQU (0x7 << 8) ;- (SSC) Detection of any edge on RF input +AT91C_SSC_START_0 EQU (0x8 << 8) ;- (SSC) Compare 0 +AT91C_SSC_STTDLY EQU (0xFF << 16) ;- (SSC) Receive/Transmit Start Delay +AT91C_SSC_PERIOD EQU (0xFF << 24) ;- (SSC) Receive/Transmit Period Divider Selection +// - -------- SSC_RFMR : (SSC Offset: 0x14) SSC Receive Frame Mode Register -------- +AT91C_SSC_DATLEN EQU (0x1F << 0) ;- (SSC) Data Length +AT91C_SSC_LOOP EQU (0x1 << 5) ;- (SSC) Loop Mode +AT91C_SSC_MSBF EQU (0x1 << 7) ;- (SSC) Most Significant Bit First +AT91C_SSC_DATNB EQU (0xF << 8) ;- (SSC) Data Number per Frame +AT91C_SSC_FSLEN EQU (0xF << 16) ;- (SSC) Receive/Transmit Frame Sync length +AT91C_SSC_FSOS EQU (0x7 << 20) ;- (SSC) Receive/Transmit Frame Sync Output Selection +AT91C_SSC_FSOS_NONE EQU (0x0 << 20) ;- (SSC) Selected Receive/Transmit Frame Sync Signal: None RK pin Input-only +AT91C_SSC_FSOS_NEGATIVE EQU (0x1 << 20) ;- (SSC) Selected Receive/Transmit Frame Sync Signal: Negative Pulse +AT91C_SSC_FSOS_POSITIVE EQU (0x2 << 20) ;- (SSC) Selected Receive/Transmit Frame Sync Signal: Positive Pulse +AT91C_SSC_FSOS_LOW EQU (0x3 << 20) ;- (SSC) Selected Receive/Transmit Frame Sync Signal: Driver Low during data transfer +AT91C_SSC_FSOS_HIGH EQU (0x4 << 20) ;- (SSC) Selected Receive/Transmit Frame Sync Signal: Driver High during data transfer +AT91C_SSC_FSOS_TOGGLE EQU (0x5 << 20) ;- (SSC) Selected Receive/Transmit Frame Sync Signal: Toggling at each start of data transfer +AT91C_SSC_FSEDGE EQU (0x1 << 24) ;- (SSC) Frame Sync Edge Detection +// - -------- SSC_TCMR : (SSC Offset: 0x18) SSC Transmit Clock Mode Register -------- +// - -------- SSC_TFMR : (SSC Offset: 0x1c) SSC Transmit Frame Mode Register -------- +AT91C_SSC_DATDEF EQU (0x1 << 5) ;- (SSC) Data Default Value +AT91C_SSC_FSDEN EQU (0x1 << 23) ;- (SSC) Frame Sync Data Enable +// - -------- SSC_SR : (SSC Offset: 0x40) SSC Status Register -------- +AT91C_SSC_TXRDY EQU (0x1 << 0) ;- (SSC) Transmit Ready +AT91C_SSC_TXEMPTY EQU (0x1 << 1) ;- (SSC) Transmit Empty +AT91C_SSC_ENDTX EQU (0x1 << 2) ;- (SSC) End Of Transmission +AT91C_SSC_TXBUFE EQU (0x1 << 3) ;- (SSC) Transmit Buffer Empty +AT91C_SSC_RXRDY EQU (0x1 << 4) ;- (SSC) Receive Ready +AT91C_SSC_OVRUN EQU (0x1 << 5) ;- (SSC) Receive Overrun +AT91C_SSC_ENDRX EQU (0x1 << 6) ;- (SSC) End of Reception +AT91C_SSC_RXBUFF EQU (0x1 << 7) ;- (SSC) Receive Buffer Full +AT91C_SSC_TXSYN EQU (0x1 << 10) ;- (SSC) Transmit Sync +AT91C_SSC_RXSYN EQU (0x1 << 11) ;- (SSC) Receive Sync +AT91C_SSC_TXENA EQU (0x1 << 16) ;- (SSC) Transmit Enable +AT91C_SSC_RXENA EQU (0x1 << 17) ;- (SSC) Receive Enable +// - -------- SSC_IER : (SSC Offset: 0x44) SSC Interrupt Enable Register -------- +// - -------- SSC_IDR : (SSC Offset: 0x48) SSC Interrupt Disable Register -------- +// - -------- SSC_IMR : (SSC Offset: 0x4c) SSC Interrupt Mask Register -------- + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR Two-wire Interface +// - ***************************************************************************** +// - -------- TWI_CR : (TWI Offset: 0x0) TWI Control Register -------- +AT91C_TWI_START EQU (0x1 << 0) ;- (TWI) Send a START Condition +AT91C_TWI_STOP EQU (0x1 << 1) ;- (TWI) Send a STOP Condition +AT91C_TWI_MSEN EQU (0x1 << 2) ;- (TWI) TWI Master Transfer Enabled +AT91C_TWI_MSDIS EQU (0x1 << 3) ;- (TWI) TWI Master Transfer Disabled +AT91C_TWI_SWRST EQU (0x1 << 7) ;- (TWI) Software Reset +// - -------- TWI_MMR : (TWI Offset: 0x4) TWI Master Mode Register -------- +AT91C_TWI_IADRSZ EQU (0x3 << 8) ;- (TWI) Internal Device Address Size +AT91C_TWI_IADRSZ_NO EQU (0x0 << 8) ;- (TWI) No internal device address +AT91C_TWI_IADRSZ_1_BYTE EQU (0x1 << 8) ;- (TWI) One-byte internal device address +AT91C_TWI_IADRSZ_2_BYTE EQU (0x2 << 8) ;- (TWI) Two-byte internal device address +AT91C_TWI_IADRSZ_3_BYTE EQU (0x3 << 8) ;- (TWI) Three-byte internal device address +AT91C_TWI_MREAD EQU (0x1 << 12) ;- (TWI) Master Read Direction +AT91C_TWI_DADR EQU (0x7F << 16) ;- (TWI) Device Address +// - -------- TWI_CWGR : (TWI Offset: 0x10) TWI Clock Waveform Generator Register -------- +AT91C_TWI_CLDIV EQU (0xFF << 0) ;- (TWI) Clock Low Divider +AT91C_TWI_CHDIV EQU (0xFF << 8) ;- (TWI) Clock High Divider +AT91C_TWI_CKDIV EQU (0x7 << 16) ;- (TWI) Clock Divider +// - -------- TWI_SR : (TWI Offset: 0x20) TWI Status Register -------- +AT91C_TWI_TXCOMP EQU (0x1 << 0) ;- (TWI) Transmission Completed +AT91C_TWI_RXRDY EQU (0x1 << 1) ;- (TWI) Receive holding register ReaDY +AT91C_TWI_TXRDY EQU (0x1 << 2) ;- (TWI) Transmit holding register ReaDY +AT91C_TWI_OVRE EQU (0x1 << 6) ;- (TWI) Overrun Error +AT91C_TWI_UNRE EQU (0x1 << 7) ;- (TWI) Underrun Error +AT91C_TWI_NACK EQU (0x1 << 8) ;- (TWI) Not Acknowledged +// - -------- TWI_IER : (TWI Offset: 0x24) TWI Interrupt Enable Register -------- +// - -------- TWI_IDR : (TWI Offset: 0x28) TWI Interrupt Disable Register -------- +// - -------- TWI_IMR : (TWI Offset: 0x2c) TWI Interrupt Mask Register -------- + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR PWMC Channel Interface +// - ***************************************************************************** +// - -------- PWMC_CMR : (PWMC_CH Offset: 0x0) PWMC Channel Mode Register -------- +AT91C_PWMC_CPRE EQU (0xF << 0) ;- (PWMC_CH) Channel Pre-scaler : PWMC_CLKx +AT91C_PWMC_CPRE_MCK EQU (0x0) ;- (PWMC_CH) +AT91C_PWMC_CPRE_MCKA EQU (0xB) ;- (PWMC_CH) +AT91C_PWMC_CPRE_MCKB EQU (0xC) ;- (PWMC_CH) +AT91C_PWMC_CALG EQU (0x1 << 8) ;- (PWMC_CH) Channel Alignment +AT91C_PWMC_CPOL EQU (0x1 << 9) ;- (PWMC_CH) Channel Polarity +AT91C_PWMC_CPD EQU (0x1 << 10) ;- (PWMC_CH) Channel Update Period +// - -------- PWMC_CDTYR : (PWMC_CH Offset: 0x4) PWMC Channel Duty Cycle Register -------- +AT91C_PWMC_CDTY EQU (0x0 << 0) ;- (PWMC_CH) Channel Duty Cycle +// - -------- PWMC_CPRDR : (PWMC_CH Offset: 0x8) PWMC Channel Period Register -------- +AT91C_PWMC_CPRD EQU (0x0 << 0) ;- (PWMC_CH) Channel Period +// - -------- PWMC_CCNTR : (PWMC_CH Offset: 0xc) PWMC Channel Counter Register -------- +AT91C_PWMC_CCNT EQU (0x0 << 0) ;- (PWMC_CH) Channel Counter +// - -------- PWMC_CUPDR : (PWMC_CH Offset: 0x10) PWMC Channel Update Register -------- +AT91C_PWMC_CUPD EQU (0x0 << 0) ;- (PWMC_CH) Channel Update + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR Pulse Width Modulation Controller Interface +// - ***************************************************************************** +// - -------- PWMC_MR : (PWMC Offset: 0x0) PWMC Mode Register -------- +AT91C_PWMC_DIVA EQU (0xFF << 0) ;- (PWMC) CLKA divide factor. +AT91C_PWMC_PREA EQU (0xF << 8) ;- (PWMC) Divider Input Clock Prescaler A +AT91C_PWMC_PREA_MCK EQU (0x0 << 8) ;- (PWMC) +AT91C_PWMC_DIVB EQU (0xFF << 16) ;- (PWMC) CLKB divide factor. +AT91C_PWMC_PREB EQU (0xF << 24) ;- (PWMC) Divider Input Clock Prescaler B +AT91C_PWMC_PREB_MCK EQU (0x0 << 24) ;- (PWMC) +// - -------- PWMC_ENA : (PWMC Offset: 0x4) PWMC Enable Register -------- +AT91C_PWMC_CHID0 EQU (0x1 << 0) ;- (PWMC) Channel ID 0 +AT91C_PWMC_CHID1 EQU (0x1 << 1) ;- (PWMC) Channel ID 1 +AT91C_PWMC_CHID2 EQU (0x1 << 2) ;- (PWMC) Channel ID 2 +AT91C_PWMC_CHID3 EQU (0x1 << 3) ;- (PWMC) Channel ID 3 +// - -------- PWMC_DIS : (PWMC Offset: 0x8) PWMC Disable Register -------- +// - -------- PWMC_SR : (PWMC Offset: 0xc) PWMC Status Register -------- +// - -------- PWMC_IER : (PWMC Offset: 0x10) PWMC Interrupt Enable Register -------- +// - -------- PWMC_IDR : (PWMC Offset: 0x14) PWMC Interrupt Disable Register -------- +// - -------- PWMC_IMR : (PWMC Offset: 0x18) PWMC Interrupt Mask Register -------- +// - -------- PWMC_ISR : (PWMC Offset: 0x1c) PWMC Interrupt Status Register -------- + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR USB Device Interface +// - ***************************************************************************** +// - -------- UDP_FRM_NUM : (UDP Offset: 0x0) USB Frame Number Register -------- +AT91C_UDP_FRM_NUM EQU (0x7FF << 0) ;- (UDP) Frame Number as Defined in the Packet Field Formats +AT91C_UDP_FRM_ERR EQU (0x1 << 16) ;- (UDP) Frame Error +AT91C_UDP_FRM_OK EQU (0x1 << 17) ;- (UDP) Frame OK +// - -------- UDP_GLB_STATE : (UDP Offset: 0x4) USB Global State Register -------- +AT91C_UDP_FADDEN EQU (0x1 << 0) ;- (UDP) Function Address Enable +AT91C_UDP_CONFG EQU (0x1 << 1) ;- (UDP) Configured +AT91C_UDP_ESR EQU (0x1 << 2) ;- (UDP) Enable Send Resume +AT91C_UDP_RSMINPR EQU (0x1 << 3) ;- (UDP) A Resume Has Been Sent to the Host +AT91C_UDP_RMWUPE EQU (0x1 << 4) ;- (UDP) Remote Wake Up Enable +// - -------- UDP_FADDR : (UDP Offset: 0x8) USB Function Address Register -------- +AT91C_UDP_FADD EQU (0xFF << 0) ;- (UDP) Function Address Value +AT91C_UDP_FEN EQU (0x1 << 8) ;- (UDP) Function Enable +// - -------- UDP_IER : (UDP Offset: 0x10) USB Interrupt Enable Register -------- +AT91C_UDP_EPINT0 EQU (0x1 << 0) ;- (UDP) Endpoint 0 Interrupt +AT91C_UDP_EPINT1 EQU (0x1 << 1) ;- (UDP) Endpoint 0 Interrupt +AT91C_UDP_EPINT2 EQU (0x1 << 2) ;- (UDP) Endpoint 2 Interrupt +AT91C_UDP_EPINT3 EQU (0x1 << 3) ;- (UDP) Endpoint 3 Interrupt +AT91C_UDP_EPINT4 EQU (0x1 << 4) ;- (UDP) Endpoint 4 Interrupt +AT91C_UDP_EPINT5 EQU (0x1 << 5) ;- (UDP) Endpoint 5 Interrupt +AT91C_UDP_RXSUSP EQU (0x1 << 8) ;- (UDP) USB Suspend Interrupt +AT91C_UDP_RXRSM EQU (0x1 << 9) ;- (UDP) USB Resume Interrupt +AT91C_UDP_EXTRSM EQU (0x1 << 10) ;- (UDP) USB External Resume Interrupt +AT91C_UDP_SOFINT EQU (0x1 << 11) ;- (UDP) USB Start Of frame Interrupt +AT91C_UDP_WAKEUP EQU (0x1 << 13) ;- (UDP) USB Resume Interrupt +// - -------- UDP_IDR : (UDP Offset: 0x14) USB Interrupt Disable Register -------- +// - -------- UDP_IMR : (UDP Offset: 0x18) USB Interrupt Mask Register -------- +// - -------- UDP_ISR : (UDP Offset: 0x1c) USB Interrupt Status Register -------- +AT91C_UDP_ENDBUSRES EQU (0x1 << 12) ;- (UDP) USB End Of Bus Reset Interrupt +// - -------- UDP_ICR : (UDP Offset: 0x20) USB Interrupt Clear Register -------- +// - -------- UDP_RST_EP : (UDP Offset: 0x28) USB Reset Endpoint Register -------- +AT91C_UDP_EP0 EQU (0x1 << 0) ;- (UDP) Reset Endpoint 0 +AT91C_UDP_EP1 EQU (0x1 << 1) ;- (UDP) Reset Endpoint 1 +AT91C_UDP_EP2 EQU (0x1 << 2) ;- (UDP) Reset Endpoint 2 +AT91C_UDP_EP3 EQU (0x1 << 3) ;- (UDP) Reset Endpoint 3 +AT91C_UDP_EP4 EQU (0x1 << 4) ;- (UDP) Reset Endpoint 4 +AT91C_UDP_EP5 EQU (0x1 << 5) ;- (UDP) Reset Endpoint 5 +// - -------- UDP_CSR : (UDP Offset: 0x30) USB Endpoint Control and Status Register -------- +AT91C_UDP_TXCOMP EQU (0x1 << 0) ;- (UDP) Generates an IN packet with data previously written in the DPR +AT91C_UDP_RX_DATA_BK0 EQU (0x1 << 1) ;- (UDP) Receive Data Bank 0 +AT91C_UDP_RXSETUP EQU (0x1 << 2) ;- (UDP) Sends STALL to the Host (Control endpoints) +AT91C_UDP_ISOERROR EQU (0x1 << 3) ;- (UDP) Isochronous error (Isochronous endpoints) +AT91C_UDP_TXPKTRDY EQU (0x1 << 4) ;- (UDP) Transmit Packet Ready +AT91C_UDP_FORCESTALL EQU (0x1 << 5) ;- (UDP) Force Stall (used by Control, Bulk and Isochronous endpoints). +AT91C_UDP_RX_DATA_BK1 EQU (0x1 << 6) ;- (UDP) Receive Data Bank 1 (only used by endpoints with ping-pong attributes). +AT91C_UDP_DIR EQU (0x1 << 7) ;- (UDP) Transfer Direction +AT91C_UDP_EPTYPE EQU (0x7 << 8) ;- (UDP) Endpoint type +AT91C_UDP_EPTYPE_CTRL EQU (0x0 << 8) ;- (UDP) Control +AT91C_UDP_EPTYPE_ISO_OUT EQU (0x1 << 8) ;- (UDP) Isochronous OUT +AT91C_UDP_EPTYPE_BULK_OUT EQU (0x2 << 8) ;- (UDP) Bulk OUT +AT91C_UDP_EPTYPE_INT_OUT EQU (0x3 << 8) ;- (UDP) Interrupt OUT +AT91C_UDP_EPTYPE_ISO_IN EQU (0x5 << 8) ;- (UDP) Isochronous IN +AT91C_UDP_EPTYPE_BULK_IN EQU (0x6 << 8) ;- (UDP) Bulk IN +AT91C_UDP_EPTYPE_INT_IN EQU (0x7 << 8) ;- (UDP) Interrupt IN +AT91C_UDP_DTGLE EQU (0x1 << 11) ;- (UDP) Data Toggle +AT91C_UDP_EPEDS EQU (0x1 << 15) ;- (UDP) Endpoint Enable Disable +AT91C_UDP_RXBYTECNT EQU (0x7FF << 16) ;- (UDP) Number Of Bytes Available in the FIFO +// - -------- UDP_TXVC : (UDP Offset: 0x74) Transceiver Control Register -------- +AT91C_UDP_TXVDIS EQU (0x1 << 8) ;- (UDP) +AT91C_UDP_PUON EQU (0x1 << 9) ;- (UDP) Pull-up ON + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR Timer Counter Channel Interface +// - ***************************************************************************** +// - -------- TC_CCR : (TC Offset: 0x0) TC Channel Control Register -------- +AT91C_TC_CLKEN EQU (0x1 << 0) ;- (TC) Counter Clock Enable Command +AT91C_TC_CLKDIS EQU (0x1 << 1) ;- (TC) Counter Clock Disable Command +AT91C_TC_SWTRG EQU (0x1 << 2) ;- (TC) Software Trigger Command +// - -------- TC_CMR : (TC Offset: 0x4) TC Channel Mode Register: Capture Mode / Waveform Mode -------- +AT91C_TC_CLKS EQU (0x7 << 0) ;- (TC) Clock Selection +AT91C_TC_CLKS_TIMER_DIV1_CLOCK EQU (0x0) ;- (TC) Clock selected: TIMER_DIV1_CLOCK +AT91C_TC_CLKS_TIMER_DIV2_CLOCK EQU (0x1) ;- (TC) Clock selected: TIMER_DIV2_CLOCK +AT91C_TC_CLKS_TIMER_DIV3_CLOCK EQU (0x2) ;- (TC) Clock selected: TIMER_DIV3_CLOCK +AT91C_TC_CLKS_TIMER_DIV4_CLOCK EQU (0x3) ;- (TC) Clock selected: TIMER_DIV4_CLOCK +AT91C_TC_CLKS_TIMER_DIV5_CLOCK EQU (0x4) ;- (TC) Clock selected: TIMER_DIV5_CLOCK +AT91C_TC_CLKS_XC0 EQU (0x5) ;- (TC) Clock selected: XC0 +AT91C_TC_CLKS_XC1 EQU (0x6) ;- (TC) Clock selected: XC1 +AT91C_TC_CLKS_XC2 EQU (0x7) ;- (TC) Clock selected: XC2 +AT91C_TC_CLKI EQU (0x1 << 3) ;- (TC) Clock Invert +AT91C_TC_BURST EQU (0x3 << 4) ;- (TC) Burst Signal Selection +AT91C_TC_BURST_NONE EQU (0x0 << 4) ;- (TC) The clock is not gated by an external signal +AT91C_TC_BURST_XC0 EQU (0x1 << 4) ;- (TC) XC0 is ANDed with the selected clock +AT91C_TC_BURST_XC1 EQU (0x2 << 4) ;- (TC) XC1 is ANDed with the selected clock +AT91C_TC_BURST_XC2 EQU (0x3 << 4) ;- (TC) XC2 is ANDed with the selected clock +AT91C_TC_CPCSTOP EQU (0x1 << 6) ;- (TC) Counter Clock Stopped with RC Compare +AT91C_TC_LDBSTOP EQU (0x1 << 6) ;- (TC) Counter Clock Stopped with RB Loading +AT91C_TC_CPCDIS EQU (0x1 << 7) ;- (TC) Counter Clock Disable with RC Compare +AT91C_TC_LDBDIS EQU (0x1 << 7) ;- (TC) Counter Clock Disabled with RB Loading +AT91C_TC_ETRGEDG EQU (0x3 << 8) ;- (TC) External Trigger Edge Selection +AT91C_TC_ETRGEDG_NONE EQU (0x0 << 8) ;- (TC) Edge: None +AT91C_TC_ETRGEDG_RISING EQU (0x1 << 8) ;- (TC) Edge: rising edge +AT91C_TC_ETRGEDG_FALLING EQU (0x2 << 8) ;- (TC) Edge: falling edge +AT91C_TC_ETRGEDG_BOTH EQU (0x3 << 8) ;- (TC) Edge: each edge +AT91C_TC_EEVTEDG EQU (0x3 << 8) ;- (TC) External Event Edge Selection +AT91C_TC_EEVTEDG_NONE EQU (0x0 << 8) ;- (TC) Edge: None +AT91C_TC_EEVTEDG_RISING EQU (0x1 << 8) ;- (TC) Edge: rising edge +AT91C_TC_EEVTEDG_FALLING EQU (0x2 << 8) ;- (TC) Edge: falling edge +AT91C_TC_EEVTEDG_BOTH EQU (0x3 << 8) ;- (TC) Edge: each edge +AT91C_TC_EEVT EQU (0x3 << 10) ;- (TC) External Event Selection +AT91C_TC_EEVT_TIOB EQU (0x0 << 10) ;- (TC) Signal selected as external event: TIOB TIOB direction: input +AT91C_TC_EEVT_XC0 EQU (0x1 << 10) ;- (TC) Signal selected as external event: XC0 TIOB direction: output +AT91C_TC_EEVT_XC1 EQU (0x2 << 10) ;- (TC) Signal selected as external event: XC1 TIOB direction: output +AT91C_TC_EEVT_XC2 EQU (0x3 << 10) ;- (TC) Signal selected as external event: XC2 TIOB direction: output +AT91C_TC_ABETRG EQU (0x1 << 10) ;- (TC) TIOA or TIOB External Trigger Selection +AT91C_TC_ENETRG EQU (0x1 << 12) ;- (TC) External Event Trigger enable +AT91C_TC_WAVESEL EQU (0x3 << 13) ;- (TC) Waveform Selection +AT91C_TC_WAVESEL_UP EQU (0x0 << 13) ;- (TC) UP mode without atomatic trigger on RC Compare +AT91C_TC_WAVESEL_UPDOWN EQU (0x1 << 13) ;- (TC) UPDOWN mode without automatic trigger on RC Compare +AT91C_TC_WAVESEL_UP_AUTO EQU (0x2 << 13) ;- (TC) UP mode with automatic trigger on RC Compare +AT91C_TC_WAVESEL_UPDOWN_AUTO EQU (0x3 << 13) ;- (TC) UPDOWN mode with automatic trigger on RC Compare +AT91C_TC_CPCTRG EQU (0x1 << 14) ;- (TC) RC Compare Trigger Enable +AT91C_TC_WAVE EQU (0x1 << 15) ;- (TC) +AT91C_TC_ACPA EQU (0x3 << 16) ;- (TC) RA Compare Effect on TIOA +AT91C_TC_ACPA_NONE EQU (0x0 << 16) ;- (TC) Effect: none +AT91C_TC_ACPA_SET EQU (0x1 << 16) ;- (TC) Effect: set +AT91C_TC_ACPA_CLEAR EQU (0x2 << 16) ;- (TC) Effect: clear +AT91C_TC_ACPA_TOGGLE EQU (0x3 << 16) ;- (TC) Effect: toggle +AT91C_TC_LDRA EQU (0x3 << 16) ;- (TC) RA Loading Selection +AT91C_TC_LDRA_NONE EQU (0x0 << 16) ;- (TC) Edge: None +AT91C_TC_LDRA_RISING EQU (0x1 << 16) ;- (TC) Edge: rising edge of TIOA +AT91C_TC_LDRA_FALLING EQU (0x2 << 16) ;- (TC) Edge: falling edge of TIOA +AT91C_TC_LDRA_BOTH EQU (0x3 << 16) ;- (TC) Edge: each edge of TIOA +AT91C_TC_ACPC EQU (0x3 << 18) ;- (TC) RC Compare Effect on TIOA +AT91C_TC_ACPC_NONE EQU (0x0 << 18) ;- (TC) Effect: none +AT91C_TC_ACPC_SET EQU (0x1 << 18) ;- (TC) Effect: set +AT91C_TC_ACPC_CLEAR EQU (0x2 << 18) ;- (TC) Effect: clear +AT91C_TC_ACPC_TOGGLE EQU (0x3 << 18) ;- (TC) Effect: toggle +AT91C_TC_LDRB EQU (0x3 << 18) ;- (TC) RB Loading Selection +AT91C_TC_LDRB_NONE EQU (0x0 << 18) ;- (TC) Edge: None +AT91C_TC_LDRB_RISING EQU (0x1 << 18) ;- (TC) Edge: rising edge of TIOA +AT91C_TC_LDRB_FALLING EQU (0x2 << 18) ;- (TC) Edge: falling edge of TIOA +AT91C_TC_LDRB_BOTH EQU (0x3 << 18) ;- (TC) Edge: each edge of TIOA +AT91C_TC_AEEVT EQU (0x3 << 20) ;- (TC) External Event Effect on TIOA +AT91C_TC_AEEVT_NONE EQU (0x0 << 20) ;- (TC) Effect: none +AT91C_TC_AEEVT_SET EQU (0x1 << 20) ;- (TC) Effect: set +AT91C_TC_AEEVT_CLEAR EQU (0x2 << 20) ;- (TC) Effect: clear +AT91C_TC_AEEVT_TOGGLE EQU (0x3 << 20) ;- (TC) Effect: toggle +AT91C_TC_ASWTRG EQU (0x3 << 22) ;- (TC) Software Trigger Effect on TIOA +AT91C_TC_ASWTRG_NONE EQU (0x0 << 22) ;- (TC) Effect: none +AT91C_TC_ASWTRG_SET EQU (0x1 << 22) ;- (TC) Effect: set +AT91C_TC_ASWTRG_CLEAR EQU (0x2 << 22) ;- (TC) Effect: clear +AT91C_TC_ASWTRG_TOGGLE EQU (0x3 << 22) ;- (TC) Effect: toggle +AT91C_TC_BCPB EQU (0x3 << 24) ;- (TC) RB Compare Effect on TIOB +AT91C_TC_BCPB_NONE EQU (0x0 << 24) ;- (TC) Effect: none +AT91C_TC_BCPB_SET EQU (0x1 << 24) ;- (TC) Effect: set +AT91C_TC_BCPB_CLEAR EQU (0x2 << 24) ;- (TC) Effect: clear +AT91C_TC_BCPB_TOGGLE EQU (0x3 << 24) ;- (TC) Effect: toggle +AT91C_TC_BCPC EQU (0x3 << 26) ;- (TC) RC Compare Effect on TIOB +AT91C_TC_BCPC_NONE EQU (0x0 << 26) ;- (TC) Effect: none +AT91C_TC_BCPC_SET EQU (0x1 << 26) ;- (TC) Effect: set +AT91C_TC_BCPC_CLEAR EQU (0x2 << 26) ;- (TC) Effect: clear +AT91C_TC_BCPC_TOGGLE EQU (0x3 << 26) ;- (TC) Effect: toggle +AT91C_TC_BEEVT EQU (0x3 << 28) ;- (TC) External Event Effect on TIOB +AT91C_TC_BEEVT_NONE EQU (0x0 << 28) ;- (TC) Effect: none +AT91C_TC_BEEVT_SET EQU (0x1 << 28) ;- (TC) Effect: set +AT91C_TC_BEEVT_CLEAR EQU (0x2 << 28) ;- (TC) Effect: clear +AT91C_TC_BEEVT_TOGGLE EQU (0x3 << 28) ;- (TC) Effect: toggle +AT91C_TC_BSWTRG EQU (0x3 << 30) ;- (TC) Software Trigger Effect on TIOB +AT91C_TC_BSWTRG_NONE EQU (0x0 << 30) ;- (TC) Effect: none +AT91C_TC_BSWTRG_SET EQU (0x1 << 30) ;- (TC) Effect: set +AT91C_TC_BSWTRG_CLEAR EQU (0x2 << 30) ;- (TC) Effect: clear +AT91C_TC_BSWTRG_TOGGLE EQU (0x3 << 30) ;- (TC) Effect: toggle +// - -------- TC_SR : (TC Offset: 0x20) TC Channel Status Register -------- +AT91C_TC_COVFS EQU (0x1 << 0) ;- (TC) Counter Overflow +AT91C_TC_LOVRS EQU (0x1 << 1) ;- (TC) Load Overrun +AT91C_TC_CPAS EQU (0x1 << 2) ;- (TC) RA Compare +AT91C_TC_CPBS EQU (0x1 << 3) ;- (TC) RB Compare +AT91C_TC_CPCS EQU (0x1 << 4) ;- (TC) RC Compare +AT91C_TC_LDRAS EQU (0x1 << 5) ;- (TC) RA Loading +AT91C_TC_LDRBS EQU (0x1 << 6) ;- (TC) RB Loading +AT91C_TC_ETRGS EQU (0x1 << 7) ;- (TC) External Trigger +AT91C_TC_CLKSTA EQU (0x1 << 16) ;- (TC) Clock Enabling +AT91C_TC_MTIOA EQU (0x1 << 17) ;- (TC) TIOA Mirror +AT91C_TC_MTIOB EQU (0x1 << 18) ;- (TC) TIOA Mirror +// - -------- TC_IER : (TC Offset: 0x24) TC Channel Interrupt Enable Register -------- +// - -------- TC_IDR : (TC Offset: 0x28) TC Channel Interrupt Disable Register -------- +// - -------- TC_IMR : (TC Offset: 0x2c) TC Channel Interrupt Mask Register -------- + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR Timer Counter Interface +// - ***************************************************************************** +// - -------- TCB_BCR : (TCB Offset: 0xc0) TC Block Control Register -------- +AT91C_TCB_SYNC EQU (0x1 << 0) ;- (TCB) Synchro Command +// - -------- TCB_BMR : (TCB Offset: 0xc4) TC Block Mode Register -------- +AT91C_TCB_TC0XC0S EQU (0x3 << 0) ;- (TCB) External Clock Signal 0 Selection +AT91C_TCB_TC0XC0S_TCLK0 EQU (0x0) ;- (TCB) TCLK0 connected to XC0 +AT91C_TCB_TC0XC0S_NONE EQU (0x1) ;- (TCB) None signal connected to XC0 +AT91C_TCB_TC0XC0S_TIOA1 EQU (0x2) ;- (TCB) TIOA1 connected to XC0 +AT91C_TCB_TC0XC0S_TIOA2 EQU (0x3) ;- (TCB) TIOA2 connected to XC0 +AT91C_TCB_TC1XC1S EQU (0x3 << 2) ;- (TCB) External Clock Signal 1 Selection +AT91C_TCB_TC1XC1S_TCLK1 EQU (0x0 << 2) ;- (TCB) TCLK1 connected to XC1 +AT91C_TCB_TC1XC1S_NONE EQU (0x1 << 2) ;- (TCB) None signal connected to XC1 +AT91C_TCB_TC1XC1S_TIOA0 EQU (0x2 << 2) ;- (TCB) TIOA0 connected to XC1 +AT91C_TCB_TC1XC1S_TIOA2 EQU (0x3 << 2) ;- (TCB) TIOA2 connected to XC1 +AT91C_TCB_TC2XC2S EQU (0x3 << 4) ;- (TCB) External Clock Signal 2 Selection +AT91C_TCB_TC2XC2S_TCLK2 EQU (0x0 << 4) ;- (TCB) TCLK2 connected to XC2 +AT91C_TCB_TC2XC2S_NONE EQU (0x1 << 4) ;- (TCB) None signal connected to XC2 +AT91C_TCB_TC2XC2S_TIOA0 EQU (0x2 << 4) ;- (TCB) TIOA0 connected to XC2 +AT91C_TCB_TC2XC2S_TIOA1 EQU (0x3 << 4) ;- (TCB) TIOA2 connected to XC2 + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR Control Area Network MailBox Interface +// - ***************************************************************************** +// - -------- CAN_MMR : (CAN_MB Offset: 0x0) CAN Message Mode Register -------- +AT91C_CAN_MTIMEMARK EQU (0xFFFF << 0) ;- (CAN_MB) Mailbox Timemark +AT91C_CAN_PRIOR EQU (0xF << 16) ;- (CAN_MB) Mailbox Priority +AT91C_CAN_MOT EQU (0x7 << 24) ;- (CAN_MB) Mailbox Object Type +AT91C_CAN_MOT_DIS EQU (0x0 << 24) ;- (CAN_MB) +AT91C_CAN_MOT_RX EQU (0x1 << 24) ;- (CAN_MB) +AT91C_CAN_MOT_RXOVERWRITE EQU (0x2 << 24) ;- (CAN_MB) +AT91C_CAN_MOT_TX EQU (0x3 << 24) ;- (CAN_MB) +AT91C_CAN_MOT_CONSUMER EQU (0x4 << 24) ;- (CAN_MB) +AT91C_CAN_MOT_PRODUCER EQU (0x5 << 24) ;- (CAN_MB) +// - -------- CAN_MAM : (CAN_MB Offset: 0x4) CAN Message Acceptance Mask Register -------- +AT91C_CAN_MIDvB EQU (0x3FFFF << 0) ;- (CAN_MB) Complementary bits for identifier in extended mode +AT91C_CAN_MIDvA EQU (0x7FF << 18) ;- (CAN_MB) Identifier for standard frame mode +AT91C_CAN_MIDE EQU (0x1 << 29) ;- (CAN_MB) Identifier Version +// - -------- CAN_MID : (CAN_MB Offset: 0x8) CAN Message ID Register -------- +// - -------- CAN_MFID : (CAN_MB Offset: 0xc) CAN Message Family ID Register -------- +// - -------- CAN_MSR : (CAN_MB Offset: 0x10) CAN Message Status Register -------- +AT91C_CAN_MTIMESTAMP EQU (0xFFFF << 0) ;- (CAN_MB) Timer Value +AT91C_CAN_MDLC EQU (0xF << 16) ;- (CAN_MB) Mailbox Data Length Code +AT91C_CAN_MRTR EQU (0x1 << 20) ;- (CAN_MB) Mailbox Remote Transmission Request +AT91C_CAN_MABT EQU (0x1 << 22) ;- (CAN_MB) Mailbox Message Abort +AT91C_CAN_MRDY EQU (0x1 << 23) ;- (CAN_MB) Mailbox Ready +AT91C_CAN_MMI EQU (0x1 << 24) ;- (CAN_MB) Mailbox Message Ignored +// - -------- CAN_MDL : (CAN_MB Offset: 0x14) CAN Message Data Low Register -------- +// - -------- CAN_MDH : (CAN_MB Offset: 0x18) CAN Message Data High Register -------- +// - -------- CAN_MCR : (CAN_MB Offset: 0x1c) CAN Message Control Register -------- +AT91C_CAN_MACR EQU (0x1 << 22) ;- (CAN_MB) Abort Request for Mailbox +AT91C_CAN_MTCR EQU (0x1 << 23) ;- (CAN_MB) Mailbox Transfer Command + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR Control Area Network Interface +// - ***************************************************************************** +// - -------- CAN_MR : (CAN Offset: 0x0) CAN Mode Register -------- +AT91C_CAN_CANEN EQU (0x1 << 0) ;- (CAN) CAN Controller Enable +AT91C_CAN_LPM EQU (0x1 << 1) ;- (CAN) Disable/Enable Low Power Mode +AT91C_CAN_ABM EQU (0x1 << 2) ;- (CAN) Disable/Enable Autobaud/Listen Mode +AT91C_CAN_OVL EQU (0x1 << 3) ;- (CAN) Disable/Enable Overload Frame +AT91C_CAN_TEOF EQU (0x1 << 4) ;- (CAN) Time Stamp messages at each end of Frame +AT91C_CAN_TTM EQU (0x1 << 5) ;- (CAN) Disable/Enable Time Trigger Mode +AT91C_CAN_TIMFRZ EQU (0x1 << 6) ;- (CAN) Enable Timer Freeze +AT91C_CAN_DRPT EQU (0x1 << 7) ;- (CAN) Disable Repeat +// - -------- CAN_IER : (CAN Offset: 0x4) CAN Interrupt Enable Register -------- +AT91C_CAN_MB0 EQU (0x1 << 0) ;- (CAN) Mailbox 0 Flag +AT91C_CAN_MB1 EQU (0x1 << 1) ;- (CAN) Mailbox 1 Flag +AT91C_CAN_MB2 EQU (0x1 << 2) ;- (CAN) Mailbox 2 Flag +AT91C_CAN_MB3 EQU (0x1 << 3) ;- (CAN) Mailbox 3 Flag +AT91C_CAN_MB4 EQU (0x1 << 4) ;- (CAN) Mailbox 4 Flag +AT91C_CAN_MB5 EQU (0x1 << 5) ;- (CAN) Mailbox 5 Flag +AT91C_CAN_MB6 EQU (0x1 << 6) ;- (CAN) Mailbox 6 Flag +AT91C_CAN_MB7 EQU (0x1 << 7) ;- (CAN) Mailbox 7 Flag +AT91C_CAN_MB8 EQU (0x1 << 8) ;- (CAN) Mailbox 8 Flag +AT91C_CAN_MB9 EQU (0x1 << 9) ;- (CAN) Mailbox 9 Flag +AT91C_CAN_MB10 EQU (0x1 << 10) ;- (CAN) Mailbox 10 Flag +AT91C_CAN_MB11 EQU (0x1 << 11) ;- (CAN) Mailbox 11 Flag +AT91C_CAN_MB12 EQU (0x1 << 12) ;- (CAN) Mailbox 12 Flag +AT91C_CAN_MB13 EQU (0x1 << 13) ;- (CAN) Mailbox 13 Flag +AT91C_CAN_MB14 EQU (0x1 << 14) ;- (CAN) Mailbox 14 Flag +AT91C_CAN_MB15 EQU (0x1 << 15) ;- (CAN) Mailbox 15 Flag +AT91C_CAN_ERRA EQU (0x1 << 16) ;- (CAN) Error Active Mode Flag +AT91C_CAN_WARN EQU (0x1 << 17) ;- (CAN) Warning Limit Flag +AT91C_CAN_ERRP EQU (0x1 << 18) ;- (CAN) Error Passive Mode Flag +AT91C_CAN_BOFF EQU (0x1 << 19) ;- (CAN) Bus Off Mode Flag +AT91C_CAN_SLEEP EQU (0x1 << 20) ;- (CAN) Sleep Flag +AT91C_CAN_WAKEUP EQU (0x1 << 21) ;- (CAN) Wakeup Flag +AT91C_CAN_TOVF EQU (0x1 << 22) ;- (CAN) Timer Overflow Flag +AT91C_CAN_TSTP EQU (0x1 << 23) ;- (CAN) Timestamp Flag +AT91C_CAN_CERR EQU (0x1 << 24) ;- (CAN) CRC Error +AT91C_CAN_SERR EQU (0x1 << 25) ;- (CAN) Stuffing Error +AT91C_CAN_AERR EQU (0x1 << 26) ;- (CAN) Acknowledgment Error +AT91C_CAN_FERR EQU (0x1 << 27) ;- (CAN) Form Error +AT91C_CAN_BERR EQU (0x1 << 28) ;- (CAN) Bit Error +// - -------- CAN_IDR : (CAN Offset: 0x8) CAN Interrupt Disable Register -------- +// - -------- CAN_IMR : (CAN Offset: 0xc) CAN Interrupt Mask Register -------- +// - -------- CAN_SR : (CAN Offset: 0x10) CAN Status Register -------- +AT91C_CAN_RBSY EQU (0x1 << 29) ;- (CAN) Receiver Busy +AT91C_CAN_TBSY EQU (0x1 << 30) ;- (CAN) Transmitter Busy +AT91C_CAN_OVLY EQU (0x1 << 31) ;- (CAN) Overload Busy +// - -------- CAN_BR : (CAN Offset: 0x14) CAN Baudrate Register -------- +AT91C_CAN_PHASE2 EQU (0x7 << 0) ;- (CAN) Phase 2 segment +AT91C_CAN_PHASE1 EQU (0x7 << 4) ;- (CAN) Phase 1 segment +AT91C_CAN_PROPAG EQU (0x7 << 8) ;- (CAN) Programmation time segment +AT91C_CAN_SYNC EQU (0x3 << 12) ;- (CAN) Re-synchronization jump width segment +AT91C_CAN_BRP EQU (0x7F << 16) ;- (CAN) Baudrate Prescaler +AT91C_CAN_SMP EQU (0x1 << 24) ;- (CAN) Sampling mode +// - -------- CAN_TIM : (CAN Offset: 0x18) CAN Timer Register -------- +AT91C_CAN_TIMER EQU (0xFFFF << 0) ;- (CAN) Timer field +// - -------- CAN_TIMESTP : (CAN Offset: 0x1c) CAN Timestamp Register -------- +// - -------- CAN_ECR : (CAN Offset: 0x20) CAN Error Counter Register -------- +AT91C_CAN_REC EQU (0xFF << 0) ;- (CAN) Receive Error Counter +AT91C_CAN_TEC EQU (0xFF << 16) ;- (CAN) Transmit Error Counter +// - -------- CAN_TCR : (CAN Offset: 0x24) CAN Transfer Command Register -------- +AT91C_CAN_TIMRST EQU (0x1 << 31) ;- (CAN) Timer Reset Field +// - -------- CAN_ACR : (CAN Offset: 0x28) CAN Abort Command Register -------- + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR Ethernet MAC 10/100 +// - ***************************************************************************** +// - -------- EMAC_NCR : (EMAC Offset: 0x0) -------- +AT91C_EMAC_LB EQU (0x1 << 0) ;- (EMAC) Loopback. Optional. When set, loopback signal is at high level. +AT91C_EMAC_LLB EQU (0x1 << 1) ;- (EMAC) Loopback local. +AT91C_EMAC_RE EQU (0x1 << 2) ;- (EMAC) Receive enable. +AT91C_EMAC_TE EQU (0x1 << 3) ;- (EMAC) Transmit enable. +AT91C_EMAC_MPE EQU (0x1 << 4) ;- (EMAC) Management port enable. +AT91C_EMAC_CLRSTAT EQU (0x1 << 5) ;- (EMAC) Clear statistics registers. +AT91C_EMAC_INCSTAT EQU (0x1 << 6) ;- (EMAC) Increment statistics registers. +AT91C_EMAC_WESTAT EQU (0x1 << 7) ;- (EMAC) Write enable for statistics registers. +AT91C_EMAC_BP EQU (0x1 << 8) ;- (EMAC) Back pressure. +AT91C_EMAC_TSTART EQU (0x1 << 9) ;- (EMAC) Start Transmission. +AT91C_EMAC_THALT EQU (0x1 << 10) ;- (EMAC) Transmission Halt. +AT91C_EMAC_TPFR EQU (0x1 << 11) ;- (EMAC) Transmit pause frame +AT91C_EMAC_TZQ EQU (0x1 << 12) ;- (EMAC) Transmit zero quantum pause frame +// - -------- EMAC_NCFGR : (EMAC Offset: 0x4) Network Configuration Register -------- +AT91C_EMAC_SPD EQU (0x1 << 0) ;- (EMAC) Speed. +AT91C_EMAC_FD EQU (0x1 << 1) ;- (EMAC) Full duplex. +AT91C_EMAC_JFRAME EQU (0x1 << 3) ;- (EMAC) Jumbo Frames. +AT91C_EMAC_CAF EQU (0x1 << 4) ;- (EMAC) Copy all frames. +AT91C_EMAC_NBC EQU (0x1 << 5) ;- (EMAC) No broadcast. +AT91C_EMAC_MTI EQU (0x1 << 6) ;- (EMAC) Multicast hash event enable +AT91C_EMAC_UNI EQU (0x1 << 7) ;- (EMAC) Unicast hash enable. +AT91C_EMAC_BIG EQU (0x1 << 8) ;- (EMAC) Receive 1522 bytes. +AT91C_EMAC_EAE EQU (0x1 << 9) ;- (EMAC) External address match enable. +AT91C_EMAC_CLK EQU (0x3 << 10) ;- (EMAC) +AT91C_EMAC_CLK_HCLK_8 EQU (0x0 << 10) ;- (EMAC) HCLK divided by 8 +AT91C_EMAC_CLK_HCLK_16 EQU (0x1 << 10) ;- (EMAC) HCLK divided by 16 +AT91C_EMAC_CLK_HCLK_32 EQU (0x2 << 10) ;- (EMAC) HCLK divided by 32 +AT91C_EMAC_CLK_HCLK_64 EQU (0x3 << 10) ;- (EMAC) HCLK divided by 64 +AT91C_EMAC_RTY EQU (0x1 << 12) ;- (EMAC) +AT91C_EMAC_PAE EQU (0x1 << 13) ;- (EMAC) +AT91C_EMAC_RBOF EQU (0x3 << 14) ;- (EMAC) +AT91C_EMAC_RBOF_OFFSET_0 EQU (0x0 << 14) ;- (EMAC) no offset from start of receive buffer +AT91C_EMAC_RBOF_OFFSET_1 EQU (0x1 << 14) ;- (EMAC) one byte offset from start of receive buffer +AT91C_EMAC_RBOF_OFFSET_2 EQU (0x2 << 14) ;- (EMAC) two bytes offset from start of receive buffer +AT91C_EMAC_RBOF_OFFSET_3 EQU (0x3 << 14) ;- (EMAC) three bytes offset from start of receive buffer +AT91C_EMAC_RLCE EQU (0x1 << 16) ;- (EMAC) Receive Length field Checking Enable +AT91C_EMAC_DRFCS EQU (0x1 << 17) ;- (EMAC) Discard Receive FCS +AT91C_EMAC_EFRHD EQU (0x1 << 18) ;- (EMAC) +AT91C_EMAC_IRXFCS EQU (0x1 << 19) ;- (EMAC) Ignore RX FCS +// - -------- EMAC_NSR : (EMAC Offset: 0x8) Network Status Register -------- +AT91C_EMAC_LINKR EQU (0x1 << 0) ;- (EMAC) +AT91C_EMAC_MDIO EQU (0x1 << 1) ;- (EMAC) +AT91C_EMAC_IDLE EQU (0x1 << 2) ;- (EMAC) +// - -------- EMAC_TSR : (EMAC Offset: 0x14) Transmit Status Register -------- +AT91C_EMAC_UBR EQU (0x1 << 0) ;- (EMAC) +AT91C_EMAC_COL EQU (0x1 << 1) ;- (EMAC) +AT91C_EMAC_RLES EQU (0x1 << 2) ;- (EMAC) +AT91C_EMAC_TGO EQU (0x1 << 3) ;- (EMAC) Transmit Go +AT91C_EMAC_BEX EQU (0x1 << 4) ;- (EMAC) Buffers exhausted mid frame +AT91C_EMAC_COMP EQU (0x1 << 5) ;- (EMAC) +AT91C_EMAC_UND EQU (0x1 << 6) ;- (EMAC) +// - -------- EMAC_RSR : (EMAC Offset: 0x20) Receive Status Register -------- +AT91C_EMAC_BNA EQU (0x1 << 0) ;- (EMAC) +AT91C_EMAC_REC EQU (0x1 << 1) ;- (EMAC) +AT91C_EMAC_OVR EQU (0x1 << 2) ;- (EMAC) +// - -------- EMAC_ISR : (EMAC Offset: 0x24) Interrupt Status Register -------- +AT91C_EMAC_MFD EQU (0x1 << 0) ;- (EMAC) +AT91C_EMAC_RCOMP EQU (0x1 << 1) ;- (EMAC) +AT91C_EMAC_RXUBR EQU (0x1 << 2) ;- (EMAC) +AT91C_EMAC_TXUBR EQU (0x1 << 3) ;- (EMAC) +AT91C_EMAC_TUNDR EQU (0x1 << 4) ;- (EMAC) +AT91C_EMAC_RLEX EQU (0x1 << 5) ;- (EMAC) +AT91C_EMAC_TXERR EQU (0x1 << 6) ;- (EMAC) +AT91C_EMAC_TCOMP EQU (0x1 << 7) ;- (EMAC) +AT91C_EMAC_LINK EQU (0x1 << 9) ;- (EMAC) +AT91C_EMAC_ROVR EQU (0x1 << 10) ;- (EMAC) +AT91C_EMAC_HRESP EQU (0x1 << 11) ;- (EMAC) +AT91C_EMAC_PFRE EQU (0x1 << 12) ;- (EMAC) +AT91C_EMAC_PTZ EQU (0x1 << 13) ;- (EMAC) +// - -------- EMAC_IER : (EMAC Offset: 0x28) Interrupt Enable Register -------- +// - -------- EMAC_IDR : (EMAC Offset: 0x2c) Interrupt Disable Register -------- +// - -------- EMAC_IMR : (EMAC Offset: 0x30) Interrupt Mask Register -------- +// - -------- EMAC_MAN : (EMAC Offset: 0x34) PHY Maintenance Register -------- +AT91C_EMAC_DATA EQU (0xFFFF << 0) ;- (EMAC) +AT91C_EMAC_CODE EQU (0x3 << 16) ;- (EMAC) +AT91C_EMAC_REGA EQU (0x1F << 18) ;- (EMAC) +AT91C_EMAC_PHYA EQU (0x1F << 23) ;- (EMAC) +AT91C_EMAC_RW EQU (0x3 << 28) ;- (EMAC) +AT91C_EMAC_SOF EQU (0x3 << 30) ;- (EMAC) +// - -------- EMAC_USRIO : (EMAC Offset: 0xc0) USER Input Output Register -------- +AT91C_EMAC_RMII EQU (0x1 << 0) ;- (EMAC) Reduce MII +// - -------- EMAC_WOL : (EMAC Offset: 0xc4) Wake On LAN Register -------- +AT91C_EMAC_IP EQU (0xFFFF << 0) ;- (EMAC) ARP request IP address +AT91C_EMAC_MAG EQU (0x1 << 16) ;- (EMAC) Magic packet event enable +AT91C_EMAC_ARP EQU (0x1 << 17) ;- (EMAC) ARP request event enable +AT91C_EMAC_SA1 EQU (0x1 << 18) ;- (EMAC) Specific address register 1 event enable +// - -------- EMAC_REV : (EMAC Offset: 0xfc) Revision Register -------- +AT91C_EMAC_REVREF EQU (0xFFFF << 0) ;- (EMAC) +AT91C_EMAC_PARTREF EQU (0xFFFF << 16) ;- (EMAC) + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR Analog to Digital Convertor +// - ***************************************************************************** +// - -------- ADC_CR : (ADC Offset: 0x0) ADC Control Register -------- +AT91C_ADC_SWRST EQU (0x1 << 0) ;- (ADC) Software Reset +AT91C_ADC_START EQU (0x1 << 1) ;- (ADC) Start Conversion +// - -------- ADC_MR : (ADC Offset: 0x4) ADC Mode Register -------- +AT91C_ADC_TRGEN EQU (0x1 << 0) ;- (ADC) Trigger Enable +AT91C_ADC_TRGEN_DIS EQU (0x0) ;- (ADC) Hradware triggers are disabled. Starting a conversion is only possible by software +AT91C_ADC_TRGEN_EN EQU (0x1) ;- (ADC) Hardware trigger selected by TRGSEL field is enabled. +AT91C_ADC_TRGSEL EQU (0x7 << 1) ;- (ADC) Trigger Selection +AT91C_ADC_TRGSEL_TIOA0 EQU (0x0 << 1) ;- (ADC) Selected TRGSEL = TIAO0 +AT91C_ADC_TRGSEL_TIOA1 EQU (0x1 << 1) ;- (ADC) Selected TRGSEL = TIAO1 +AT91C_ADC_TRGSEL_TIOA2 EQU (0x2 << 1) ;- (ADC) Selected TRGSEL = TIAO2 +AT91C_ADC_TRGSEL_TIOA3 EQU (0x3 << 1) ;- (ADC) Selected TRGSEL = TIAO3 +AT91C_ADC_TRGSEL_TIOA4 EQU (0x4 << 1) ;- (ADC) Selected TRGSEL = TIAO4 +AT91C_ADC_TRGSEL_TIOA5 EQU (0x5 << 1) ;- (ADC) Selected TRGSEL = TIAO5 +AT91C_ADC_TRGSEL_EXT EQU (0x6 << 1) ;- (ADC) Selected TRGSEL = External Trigger +AT91C_ADC_LOWRES EQU (0x1 << 4) ;- (ADC) Resolution. +AT91C_ADC_LOWRES_10_BIT EQU (0x0 << 4) ;- (ADC) 10-bit resolution +AT91C_ADC_LOWRES_8_BIT EQU (0x1 << 4) ;- (ADC) 8-bit resolution +AT91C_ADC_SLEEP EQU (0x1 << 5) ;- (ADC) Sleep Mode +AT91C_ADC_SLEEP_NORMAL_MODE EQU (0x0 << 5) ;- (ADC) Normal Mode +AT91C_ADC_SLEEP_MODE EQU (0x1 << 5) ;- (ADC) Sleep Mode +AT91C_ADC_PRESCAL EQU (0x3F << 8) ;- (ADC) Prescaler rate selection +AT91C_ADC_STARTUP EQU (0x1F << 16) ;- (ADC) Startup Time +AT91C_ADC_SHTIM EQU (0xF << 24) ;- (ADC) Sample & Hold Time +// - -------- ADC_CHER : (ADC Offset: 0x10) ADC Channel Enable Register -------- +AT91C_ADC_CH0 EQU (0x1 << 0) ;- (ADC) Channel 0 +AT91C_ADC_CH1 EQU (0x1 << 1) ;- (ADC) Channel 1 +AT91C_ADC_CH2 EQU (0x1 << 2) ;- (ADC) Channel 2 +AT91C_ADC_CH3 EQU (0x1 << 3) ;- (ADC) Channel 3 +AT91C_ADC_CH4 EQU (0x1 << 4) ;- (ADC) Channel 4 +AT91C_ADC_CH5 EQU (0x1 << 5) ;- (ADC) Channel 5 +AT91C_ADC_CH6 EQU (0x1 << 6) ;- (ADC) Channel 6 +AT91C_ADC_CH7 EQU (0x1 << 7) ;- (ADC) Channel 7 +// - -------- ADC_CHDR : (ADC Offset: 0x14) ADC Channel Disable Register -------- +// - -------- ADC_CHSR : (ADC Offset: 0x18) ADC Channel Status Register -------- +// - -------- ADC_SR : (ADC Offset: 0x1c) ADC Status Register -------- +AT91C_ADC_EOC0 EQU (0x1 << 0) ;- (ADC) End of Conversion +AT91C_ADC_EOC1 EQU (0x1 << 1) ;- (ADC) End of Conversion +AT91C_ADC_EOC2 EQU (0x1 << 2) ;- (ADC) End of Conversion +AT91C_ADC_EOC3 EQU (0x1 << 3) ;- (ADC) End of Conversion +AT91C_ADC_EOC4 EQU (0x1 << 4) ;- (ADC) End of Conversion +AT91C_ADC_EOC5 EQU (0x1 << 5) ;- (ADC) End of Conversion +AT91C_ADC_EOC6 EQU (0x1 << 6) ;- (ADC) End of Conversion +AT91C_ADC_EOC7 EQU (0x1 << 7) ;- (ADC) End of Conversion +AT91C_ADC_OVRE0 EQU (0x1 << 8) ;- (ADC) Overrun Error +AT91C_ADC_OVRE1 EQU (0x1 << 9) ;- (ADC) Overrun Error +AT91C_ADC_OVRE2 EQU (0x1 << 10) ;- (ADC) Overrun Error +AT91C_ADC_OVRE3 EQU (0x1 << 11) ;- (ADC) Overrun Error +AT91C_ADC_OVRE4 EQU (0x1 << 12) ;- (ADC) Overrun Error +AT91C_ADC_OVRE5 EQU (0x1 << 13) ;- (ADC) Overrun Error +AT91C_ADC_OVRE6 EQU (0x1 << 14) ;- (ADC) Overrun Error +AT91C_ADC_OVRE7 EQU (0x1 << 15) ;- (ADC) Overrun Error +AT91C_ADC_DRDY EQU (0x1 << 16) ;- (ADC) Data Ready +AT91C_ADC_GOVRE EQU (0x1 << 17) ;- (ADC) General Overrun +AT91C_ADC_ENDRX EQU (0x1 << 18) ;- (ADC) End of Receiver Transfer +AT91C_ADC_RXBUFF EQU (0x1 << 19) ;- (ADC) RXBUFF Interrupt +// - -------- ADC_LCDR : (ADC Offset: 0x20) ADC Last Converted Data Register -------- +AT91C_ADC_LDATA EQU (0x3FF << 0) ;- (ADC) Last Data Converted +// - -------- ADC_IER : (ADC Offset: 0x24) ADC Interrupt Enable Register -------- +// - -------- ADC_IDR : (ADC Offset: 0x28) ADC Interrupt Disable Register -------- +// - -------- ADC_IMR : (ADC Offset: 0x2c) ADC Interrupt Mask Register -------- +// - -------- ADC_CDR0 : (ADC Offset: 0x30) ADC Channel Data Register 0 -------- +AT91C_ADC_DATA EQU (0x3FF << 0) ;- (ADC) Converted Data +// - -------- ADC_CDR1 : (ADC Offset: 0x34) ADC Channel Data Register 1 -------- +// - -------- ADC_CDR2 : (ADC Offset: 0x38) ADC Channel Data Register 2 -------- +// - -------- ADC_CDR3 : (ADC Offset: 0x3c) ADC Channel Data Register 3 -------- +// - -------- ADC_CDR4 : (ADC Offset: 0x40) ADC Channel Data Register 4 -------- +// - -------- ADC_CDR5 : (ADC Offset: 0x44) ADC Channel Data Register 5 -------- +// - -------- ADC_CDR6 : (ADC Offset: 0x48) ADC Channel Data Register 6 -------- +// - -------- ADC_CDR7 : (ADC Offset: 0x4c) ADC Channel Data Register 7 -------- + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR Advanced Encryption Standard +// - ***************************************************************************** +// - -------- AES_CR : (AES Offset: 0x0) Control Register -------- +AT91C_AES_START EQU (0x1 << 0) ;- (AES) Starts Processing +AT91C_AES_SWRST EQU (0x1 << 8) ;- (AES) Software Reset +AT91C_AES_LOADSEED EQU (0x1 << 16) ;- (AES) Random Number Generator Seed Loading +// - -------- AES_MR : (AES Offset: 0x4) Mode Register -------- +AT91C_AES_CIPHER EQU (0x1 << 0) ;- (AES) Processing Mode +AT91C_AES_PROCDLY EQU (0xF << 4) ;- (AES) Processing Delay +AT91C_AES_SMOD EQU (0x3 << 8) ;- (AES) Start Mode +AT91C_AES_SMOD_MANUAL EQU (0x0 << 8) ;- (AES) Manual Mode: The START bit in register AES_CR must be set to begin encryption or decryption. +AT91C_AES_SMOD_AUTO EQU (0x1 << 8) ;- (AES) Auto Mode: no action in AES_CR is necessary (cf datasheet). +AT91C_AES_SMOD_PDC EQU (0x2 << 8) ;- (AES) PDC Mode (cf datasheet). +AT91C_AES_OPMOD EQU (0x7 << 12) ;- (AES) Operation Mode +AT91C_AES_OPMOD_ECB EQU (0x0 << 12) ;- (AES) ECB Electronic CodeBook mode. +AT91C_AES_OPMOD_CBC EQU (0x1 << 12) ;- (AES) CBC Cipher Block Chaining mode. +AT91C_AES_OPMOD_OFB EQU (0x2 << 12) ;- (AES) OFB Output Feedback mode. +AT91C_AES_OPMOD_CFB EQU (0x3 << 12) ;- (AES) CFB Cipher Feedback mode. +AT91C_AES_OPMOD_CTR EQU (0x4 << 12) ;- (AES) CTR Counter mode. +AT91C_AES_LOD EQU (0x1 << 15) ;- (AES) Last Output Data Mode +AT91C_AES_CFBS EQU (0x7 << 16) ;- (AES) Cipher Feedback Data Size +AT91C_AES_CFBS_128_BIT EQU (0x0 << 16) ;- (AES) 128-bit. +AT91C_AES_CFBS_64_BIT EQU (0x1 << 16) ;- (AES) 64-bit. +AT91C_AES_CFBS_32_BIT EQU (0x2 << 16) ;- (AES) 32-bit. +AT91C_AES_CFBS_16_BIT EQU (0x3 << 16) ;- (AES) 16-bit. +AT91C_AES_CFBS_8_BIT EQU (0x4 << 16) ;- (AES) 8-bit. +AT91C_AES_CKEY EQU (0xF << 20) ;- (AES) Countermeasure Key +AT91C_AES_CTYPE EQU (0x1F << 24) ;- (AES) Countermeasure Type +AT91C_AES_CTYPE_TYPE1_EN EQU (0x1 << 24) ;- (AES) Countermeasure type 1 is enabled. +AT91C_AES_CTYPE_TYPE2_EN EQU (0x2 << 24) ;- (AES) Countermeasure type 2 is enabled. +AT91C_AES_CTYPE_TYPE3_EN EQU (0x4 << 24) ;- (AES) Countermeasure type 3 is enabled. +AT91C_AES_CTYPE_TYPE4_EN EQU (0x8 << 24) ;- (AES) Countermeasure type 4 is enabled. +AT91C_AES_CTYPE_TYPE5_EN EQU (0x10 << 24) ;- (AES) Countermeasure type 5 is enabled. +// - -------- AES_IER : (AES Offset: 0x10) Interrupt Enable Register -------- +AT91C_AES_DATRDY EQU (0x1 << 0) ;- (AES) DATRDY +AT91C_AES_ENDRX EQU (0x1 << 1) ;- (AES) PDC Read Buffer End +AT91C_AES_ENDTX EQU (0x1 << 2) ;- (AES) PDC Write Buffer End +AT91C_AES_RXBUFF EQU (0x1 << 3) ;- (AES) PDC Read Buffer Full +AT91C_AES_TXBUFE EQU (0x1 << 4) ;- (AES) PDC Write Buffer Empty +AT91C_AES_URAD EQU (0x1 << 8) ;- (AES) Unspecified Register Access Detection +// - -------- AES_IDR : (AES Offset: 0x14) Interrupt Disable Register -------- +// - -------- AES_IMR : (AES Offset: 0x18) Interrupt Mask Register -------- +// - -------- AES_ISR : (AES Offset: 0x1c) Interrupt Status Register -------- +AT91C_AES_URAT EQU (0x7 << 12) ;- (AES) Unspecified Register Access Type Status +AT91C_AES_URAT_IN_DAT_WRITE_DATPROC EQU (0x0 << 12) ;- (AES) Input data register written during the data processing in PDC mode. +AT91C_AES_URAT_OUT_DAT_READ_DATPROC EQU (0x1 << 12) ;- (AES) Output data register read during the data processing. +AT91C_AES_URAT_MODEREG_WRITE_DATPROC EQU (0x2 << 12) ;- (AES) Mode register written during the data processing. +AT91C_AES_URAT_OUT_DAT_READ_SUBKEY EQU (0x3 << 12) ;- (AES) Output data register read during the sub-keys generation. +AT91C_AES_URAT_MODEREG_WRITE_SUBKEY EQU (0x4 << 12) ;- (AES) Mode register written during the sub-keys generation. +AT91C_AES_URAT_WO_REG_READ EQU (0x5 << 12) ;- (AES) Write-only register read access. + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR Triple Data Encryption Standard +// - ***************************************************************************** +// - -------- TDES_CR : (TDES Offset: 0x0) Control Register -------- +AT91C_TDES_START EQU (0x1 << 0) ;- (TDES) Starts Processing +AT91C_TDES_SWRST EQU (0x1 << 8) ;- (TDES) Software Reset +// - -------- TDES_MR : (TDES Offset: 0x4) Mode Register -------- +AT91C_TDES_CIPHER EQU (0x1 << 0) ;- (TDES) Processing Mode +AT91C_TDES_TDESMOD EQU (0x1 << 1) ;- (TDES) Single or Triple DES Mode +AT91C_TDES_KEYMOD EQU (0x1 << 4) ;- (TDES) Key Mode +AT91C_TDES_SMOD EQU (0x3 << 8) ;- (TDES) Start Mode +AT91C_TDES_SMOD_MANUAL EQU (0x0 << 8) ;- (TDES) Manual Mode: The START bit in register TDES_CR must be set to begin encryption or decryption. +AT91C_TDES_SMOD_AUTO EQU (0x1 << 8) ;- (TDES) Auto Mode: no action in TDES_CR is necessary (cf datasheet). +AT91C_TDES_SMOD_PDC EQU (0x2 << 8) ;- (TDES) PDC Mode (cf datasheet). +AT91C_TDES_OPMOD EQU (0x3 << 12) ;- (TDES) Operation Mode +AT91C_TDES_OPMOD_ECB EQU (0x0 << 12) ;- (TDES) ECB Electronic CodeBook mode. +AT91C_TDES_OPMOD_CBC EQU (0x1 << 12) ;- (TDES) CBC Cipher Block Chaining mode. +AT91C_TDES_OPMOD_OFB EQU (0x2 << 12) ;- (TDES) OFB Output Feedback mode. +AT91C_TDES_OPMOD_CFB EQU (0x3 << 12) ;- (TDES) CFB Cipher Feedback mode. +AT91C_TDES_LOD EQU (0x1 << 15) ;- (TDES) Last Output Data Mode +AT91C_TDES_CFBS EQU (0x3 << 16) ;- (TDES) Cipher Feedback Data Size +AT91C_TDES_CFBS_64_BIT EQU (0x0 << 16) ;- (TDES) 64-bit. +AT91C_TDES_CFBS_32_BIT EQU (0x1 << 16) ;- (TDES) 32-bit. +AT91C_TDES_CFBS_16_BIT EQU (0x2 << 16) ;- (TDES) 16-bit. +AT91C_TDES_CFBS_8_BIT EQU (0x3 << 16) ;- (TDES) 8-bit. +// - -------- TDES_IER : (TDES Offset: 0x10) Interrupt Enable Register -------- +AT91C_TDES_DATRDY EQU (0x1 << 0) ;- (TDES) DATRDY +AT91C_TDES_ENDRX EQU (0x1 << 1) ;- (TDES) PDC Read Buffer End +AT91C_TDES_ENDTX EQU (0x1 << 2) ;- (TDES) PDC Write Buffer End +AT91C_TDES_RXBUFF EQU (0x1 << 3) ;- (TDES) PDC Read Buffer Full +AT91C_TDES_TXBUFE EQU (0x1 << 4) ;- (TDES) PDC Write Buffer Empty +AT91C_TDES_URAD EQU (0x1 << 8) ;- (TDES) Unspecified Register Access Detection +// - -------- TDES_IDR : (TDES Offset: 0x14) Interrupt Disable Register -------- +// - -------- TDES_IMR : (TDES Offset: 0x18) Interrupt Mask Register -------- +// - -------- TDES_ISR : (TDES Offset: 0x1c) Interrupt Status Register -------- +AT91C_TDES_URAT EQU (0x3 << 12) ;- (TDES) Unspecified Register Access Type Status +AT91C_TDES_URAT_IN_DAT_WRITE_DATPROC EQU (0x0 << 12) ;- (TDES) Input data register written during the data processing in PDC mode. +AT91C_TDES_URAT_OUT_DAT_READ_DATPROC EQU (0x1 << 12) ;- (TDES) Output data register read during the data processing. +AT91C_TDES_URAT_MODEREG_WRITE_DATPROC EQU (0x2 << 12) ;- (TDES) Mode register written during the data processing. +AT91C_TDES_URAT_WO_REG_READ EQU (0x3 << 12) ;- (TDES) Write-only register read access. + +// - ***************************************************************************** +// - REGISTER ADDRESS DEFINITION FOR AT91SAM7X256 +// - ***************************************************************************** +// - ========== Register definition for SYS peripheral ========== +// - ========== Register definition for AIC peripheral ========== +AT91C_AIC_IVR EQU (0xFFFFF100) ;- (AIC) IRQ Vector Register +AT91C_AIC_SMR EQU (0xFFFFF000) ;- (AIC) Source Mode Register +AT91C_AIC_FVR EQU (0xFFFFF104) ;- (AIC) FIQ Vector Register +AT91C_AIC_DCR EQU (0xFFFFF138) ;- (AIC) Debug Control Register (Protect) +AT91C_AIC_EOICR EQU (0xFFFFF130) ;- (AIC) End of Interrupt Command Register +AT91C_AIC_SVR EQU (0xFFFFF080) ;- (AIC) Source Vector Register +AT91C_AIC_FFSR EQU (0xFFFFF148) ;- (AIC) Fast Forcing Status Register +AT91C_AIC_ICCR EQU (0xFFFFF128) ;- (AIC) Interrupt Clear Command Register +AT91C_AIC_ISR EQU (0xFFFFF108) ;- (AIC) Interrupt Status Register +AT91C_AIC_IMR EQU (0xFFFFF110) ;- (AIC) Interrupt Mask Register +AT91C_AIC_IPR EQU (0xFFFFF10C) ;- (AIC) Interrupt Pending Register +AT91C_AIC_FFER EQU (0xFFFFF140) ;- (AIC) Fast Forcing Enable Register +AT91C_AIC_IECR EQU (0xFFFFF120) ;- (AIC) Interrupt Enable Command Register +AT91C_AIC_ISCR EQU (0xFFFFF12C) ;- (AIC) Interrupt Set Command Register +AT91C_AIC_FFDR EQU (0xFFFFF144) ;- (AIC) Fast Forcing Disable Register +AT91C_AIC_CISR EQU (0xFFFFF114) ;- (AIC) Core Interrupt Status Register +AT91C_AIC_IDCR EQU (0xFFFFF124) ;- (AIC) Interrupt Disable Command Register +AT91C_AIC_SPU EQU (0xFFFFF134) ;- (AIC) Spurious Vector Register +// - ========== Register definition for PDC_DBGU peripheral ========== +AT91C_DBGU_TCR EQU (0xFFFFF30C) ;- (PDC_DBGU) Transmit Counter Register +AT91C_DBGU_RNPR EQU (0xFFFFF310) ;- (PDC_DBGU) Receive Next Pointer Register +AT91C_DBGU_TNPR EQU (0xFFFFF318) ;- (PDC_DBGU) Transmit Next Pointer Register +AT91C_DBGU_TPR EQU (0xFFFFF308) ;- (PDC_DBGU) Transmit Pointer Register +AT91C_DBGU_RPR EQU (0xFFFFF300) ;- (PDC_DBGU) Receive Pointer Register +AT91C_DBGU_RCR EQU (0xFFFFF304) ;- (PDC_DBGU) Receive Counter Register +AT91C_DBGU_RNCR EQU (0xFFFFF314) ;- (PDC_DBGU) Receive Next Counter Register +AT91C_DBGU_PTCR EQU (0xFFFFF320) ;- (PDC_DBGU) PDC Transfer Control Register +AT91C_DBGU_PTSR EQU (0xFFFFF324) ;- (PDC_DBGU) PDC Transfer Status Register +AT91C_DBGU_TNCR EQU (0xFFFFF31C) ;- (PDC_DBGU) Transmit Next Counter Register +// - ========== Register definition for DBGU peripheral ========== +AT91C_DBGU_EXID EQU (0xFFFFF244) ;- (DBGU) Chip ID Extension Register +AT91C_DBGU_BRGR EQU (0xFFFFF220) ;- (DBGU) Baud Rate Generator Register +AT91C_DBGU_IDR EQU (0xFFFFF20C) ;- (DBGU) Interrupt Disable Register +AT91C_DBGU_CSR EQU (0xFFFFF214) ;- (DBGU) Channel Status Register +AT91C_DBGU_CIDR EQU (0xFFFFF240) ;- (DBGU) Chip ID Register +AT91C_DBGU_MR EQU (0xFFFFF204) ;- (DBGU) Mode Register +AT91C_DBGU_IMR EQU (0xFFFFF210) ;- (DBGU) Interrupt Mask Register +AT91C_DBGU_CR EQU (0xFFFFF200) ;- (DBGU) Control Register +AT91C_DBGU_FNTR EQU (0xFFFFF248) ;- (DBGU) Force NTRST Register +AT91C_DBGU_THR EQU (0xFFFFF21C) ;- (DBGU) Transmitter Holding Register +AT91C_DBGU_RHR EQU (0xFFFFF218) ;- (DBGU) Receiver Holding Register +AT91C_DBGU_IER EQU (0xFFFFF208) ;- (DBGU) Interrupt Enable Register +// - ========== Register definition for PIOA peripheral ========== +AT91C_PIOA_ODR EQU (0xFFFFF414) ;- (PIOA) Output Disable Registerr +AT91C_PIOA_SODR EQU (0xFFFFF430) ;- (PIOA) Set Output Data Register +AT91C_PIOA_ISR EQU (0xFFFFF44C) ;- (PIOA) Interrupt Status Register +AT91C_PIOA_ABSR EQU (0xFFFFF478) ;- (PIOA) AB Select Status Register +AT91C_PIOA_IER EQU (0xFFFFF440) ;- (PIOA) Interrupt Enable Register +AT91C_PIOA_PPUDR EQU (0xFFFFF460) ;- (PIOA) Pull-up Disable Register +AT91C_PIOA_IMR EQU (0xFFFFF448) ;- (PIOA) Interrupt Mask Register +AT91C_PIOA_PER EQU (0xFFFFF400) ;- (PIOA) PIO Enable Register +AT91C_PIOA_IFDR EQU (0xFFFFF424) ;- (PIOA) Input Filter Disable Register +AT91C_PIOA_OWDR EQU (0xFFFFF4A4) ;- (PIOA) Output Write Disable Register +AT91C_PIOA_MDSR EQU (0xFFFFF458) ;- (PIOA) Multi-driver Status Register +AT91C_PIOA_IDR EQU (0xFFFFF444) ;- (PIOA) Interrupt Disable Register +AT91C_PIOA_ODSR EQU (0xFFFFF438) ;- (PIOA) Output Data Status Register +AT91C_PIOA_PPUSR EQU (0xFFFFF468) ;- (PIOA) Pull-up Status Register +AT91C_PIOA_OWSR EQU (0xFFFFF4A8) ;- (PIOA) Output Write Status Register +AT91C_PIOA_BSR EQU (0xFFFFF474) ;- (PIOA) Select B Register +AT91C_PIOA_OWER EQU (0xFFFFF4A0) ;- (PIOA) Output Write Enable Register +AT91C_PIOA_IFER EQU (0xFFFFF420) ;- (PIOA) Input Filter Enable Register +AT91C_PIOA_PDSR EQU (0xFFFFF43C) ;- (PIOA) Pin Data Status Register +AT91C_PIOA_PPUER EQU (0xFFFFF464) ;- (PIOA) Pull-up Enable Register +AT91C_PIOA_OSR EQU (0xFFFFF418) ;- (PIOA) Output Status Register +AT91C_PIOA_ASR EQU (0xFFFFF470) ;- (PIOA) Select A Register +AT91C_PIOA_MDDR EQU (0xFFFFF454) ;- (PIOA) Multi-driver Disable Register +AT91C_PIOA_CODR EQU (0xFFFFF434) ;- (PIOA) Clear Output Data Register +AT91C_PIOA_MDER EQU (0xFFFFF450) ;- (PIOA) Multi-driver Enable Register +AT91C_PIOA_PDR EQU (0xFFFFF404) ;- (PIOA) PIO Disable Register +AT91C_PIOA_IFSR EQU (0xFFFFF428) ;- (PIOA) Input Filter Status Register +AT91C_PIOA_OER EQU (0xFFFFF410) ;- (PIOA) Output Enable Register +AT91C_PIOA_PSR EQU (0xFFFFF408) ;- (PIOA) PIO Status Register +// - ========== Register definition for PIOB peripheral ========== +AT91C_PIOB_OWDR EQU (0xFFFFF6A4) ;- (PIOB) Output Write Disable Register +AT91C_PIOB_MDER EQU (0xFFFFF650) ;- (PIOB) Multi-driver Enable Register +AT91C_PIOB_PPUSR EQU (0xFFFFF668) ;- (PIOB) Pull-up Status Register +AT91C_PIOB_IMR EQU (0xFFFFF648) ;- (PIOB) Interrupt Mask Register +AT91C_PIOB_ASR EQU (0xFFFFF670) ;- (PIOB) Select A Register +AT91C_PIOB_PPUDR EQU (0xFFFFF660) ;- (PIOB) Pull-up Disable Register +AT91C_PIOB_PSR EQU (0xFFFFF608) ;- (PIOB) PIO Status Register +AT91C_PIOB_IER EQU (0xFFFFF640) ;- (PIOB) Interrupt Enable Register +AT91C_PIOB_CODR EQU (0xFFFFF634) ;- (PIOB) Clear Output Data Register +AT91C_PIOB_OWER EQU (0xFFFFF6A0) ;- (PIOB) Output Write Enable Register +AT91C_PIOB_ABSR EQU (0xFFFFF678) ;- (PIOB) AB Select Status Register +AT91C_PIOB_IFDR EQU (0xFFFFF624) ;- (PIOB) Input Filter Disable Register +AT91C_PIOB_PDSR EQU (0xFFFFF63C) ;- (PIOB) Pin Data Status Register +AT91C_PIOB_IDR EQU (0xFFFFF644) ;- (PIOB) Interrupt Disable Register +AT91C_PIOB_OWSR EQU (0xFFFFF6A8) ;- (PIOB) Output Write Status Register +AT91C_PIOB_PDR EQU (0xFFFFF604) ;- (PIOB) PIO Disable Register +AT91C_PIOB_ODR EQU (0xFFFFF614) ;- (PIOB) Output Disable Registerr +AT91C_PIOB_IFSR EQU (0xFFFFF628) ;- (PIOB) Input Filter Status Register +AT91C_PIOB_PPUER EQU (0xFFFFF664) ;- (PIOB) Pull-up Enable Register +AT91C_PIOB_SODR EQU (0xFFFFF630) ;- (PIOB) Set Output Data Register +AT91C_PIOB_ISR EQU (0xFFFFF64C) ;- (PIOB) Interrupt Status Register +AT91C_PIOB_ODSR EQU (0xFFFFF638) ;- (PIOB) Output Data Status Register +AT91C_PIOB_OSR EQU (0xFFFFF618) ;- (PIOB) Output Status Register +AT91C_PIOB_MDSR EQU (0xFFFFF658) ;- (PIOB) Multi-driver Status Register +AT91C_PIOB_IFER EQU (0xFFFFF620) ;- (PIOB) Input Filter Enable Register +AT91C_PIOB_BSR EQU (0xFFFFF674) ;- (PIOB) Select B Register +AT91C_PIOB_MDDR EQU (0xFFFFF654) ;- (PIOB) Multi-driver Disable Register +AT91C_PIOB_OER EQU (0xFFFFF610) ;- (PIOB) Output Enable Register +AT91C_PIOB_PER EQU (0xFFFFF600) ;- (PIOB) PIO Enable Register +// - ========== Register definition for CKGR peripheral ========== +AT91C_CKGR_MOR EQU (0xFFFFFC20) ;- (CKGR) Main Oscillator Register +AT91C_CKGR_PLLR EQU (0xFFFFFC2C) ;- (CKGR) PLL Register +AT91C_CKGR_MCFR EQU (0xFFFFFC24) ;- (CKGR) Main Clock Frequency Register +// - ========== Register definition for PMC peripheral ========== +AT91C_PMC_IDR EQU (0xFFFFFC64) ;- (PMC) Interrupt Disable Register +AT91C_PMC_MOR EQU (0xFFFFFC20) ;- (PMC) Main Oscillator Register +AT91C_PMC_PLLR EQU (0xFFFFFC2C) ;- (PMC) PLL Register +AT91C_PMC_PCER EQU (0xFFFFFC10) ;- (PMC) Peripheral Clock Enable Register +AT91C_PMC_PCKR EQU (0xFFFFFC40) ;- (PMC) Programmable Clock Register +AT91C_PMC_MCKR EQU (0xFFFFFC30) ;- (PMC) Master Clock Register +AT91C_PMC_SCDR EQU (0xFFFFFC04) ;- (PMC) System Clock Disable Register +AT91C_PMC_PCDR EQU (0xFFFFFC14) ;- (PMC) Peripheral Clock Disable Register +AT91C_PMC_SCSR EQU (0xFFFFFC08) ;- (PMC) System Clock Status Register +AT91C_PMC_PCSR EQU (0xFFFFFC18) ;- (PMC) Peripheral Clock Status Register +AT91C_PMC_MCFR EQU (0xFFFFFC24) ;- (PMC) Main Clock Frequency Register +AT91C_PMC_SCER EQU (0xFFFFFC00) ;- (PMC) System Clock Enable Register +AT91C_PMC_IMR EQU (0xFFFFFC6C) ;- (PMC) Interrupt Mask Register +AT91C_PMC_IER EQU (0xFFFFFC60) ;- (PMC) Interrupt Enable Register +AT91C_PMC_SR EQU (0xFFFFFC68) ;- (PMC) Status Register +// - ========== Register definition for RSTC peripheral ========== +AT91C_RSTC_RCR EQU (0xFFFFFD00) ;- (RSTC) Reset Control Register +AT91C_RSTC_RMR EQU (0xFFFFFD08) ;- (RSTC) Reset Mode Register +AT91C_RSTC_RSR EQU (0xFFFFFD04) ;- (RSTC) Reset Status Register +// - ========== Register definition for RTTC peripheral ========== +AT91C_RTTC_RTSR EQU (0xFFFFFD2C) ;- (RTTC) Real-time Status Register +AT91C_RTTC_RTMR EQU (0xFFFFFD20) ;- (RTTC) Real-time Mode Register +AT91C_RTTC_RTVR EQU (0xFFFFFD28) ;- (RTTC) Real-time Value Register +AT91C_RTTC_RTAR EQU (0xFFFFFD24) ;- (RTTC) Real-time Alarm Register +// - ========== Register definition for PITC peripheral ========== +AT91C_PITC_PIVR EQU (0xFFFFFD38) ;- (PITC) Period Interval Value Register +AT91C_PITC_PISR EQU (0xFFFFFD34) ;- (PITC) Period Interval Status Register +AT91C_PITC_PIIR EQU (0xFFFFFD3C) ;- (PITC) Period Interval Image Register +AT91C_PITC_PIMR EQU (0xFFFFFD30) ;- (PITC) Period Interval Mode Register +// - ========== Register definition for WDTC peripheral ========== +AT91C_WDTC_WDCR EQU (0xFFFFFD40) ;- (WDTC) Watchdog Control Register +AT91C_WDTC_WDSR EQU (0xFFFFFD48) ;- (WDTC) Watchdog Status Register +AT91C_WDTC_WDMR EQU (0xFFFFFD44) ;- (WDTC) Watchdog Mode Register +// - ========== Register definition for VREG peripheral ========== +AT91C_VREG_MR EQU (0xFFFFFD60) ;- (VREG) Voltage Regulator Mode Register +// - ========== Register definition for MC peripheral ========== +AT91C_MC_ASR EQU (0xFFFFFF04) ;- (MC) MC Abort Status Register +AT91C_MC_RCR EQU (0xFFFFFF00) ;- (MC) MC Remap Control Register +AT91C_MC_FCR EQU (0xFFFFFF64) ;- (MC) MC Flash Command Register +AT91C_MC_AASR EQU (0xFFFFFF08) ;- (MC) MC Abort Address Status Register +AT91C_MC_FSR EQU (0xFFFFFF68) ;- (MC) MC Flash Status Register +AT91C_MC_FMR EQU (0xFFFFFF60) ;- (MC) MC Flash Mode Register +// - ========== Register definition for PDC_SPI1 peripheral ========== +AT91C_SPI1_PTCR EQU (0xFFFE4120) ;- (PDC_SPI1) PDC Transfer Control Register +AT91C_SPI1_RPR EQU (0xFFFE4100) ;- (PDC_SPI1) Receive Pointer Register +AT91C_SPI1_TNCR EQU (0xFFFE411C) ;- (PDC_SPI1) Transmit Next Counter Register +AT91C_SPI1_TPR EQU (0xFFFE4108) ;- (PDC_SPI1) Transmit Pointer Register +AT91C_SPI1_TNPR EQU (0xFFFE4118) ;- (PDC_SPI1) Transmit Next Pointer Register +AT91C_SPI1_TCR EQU (0xFFFE410C) ;- (PDC_SPI1) Transmit Counter Register +AT91C_SPI1_RCR EQU (0xFFFE4104) ;- (PDC_SPI1) Receive Counter Register +AT91C_SPI1_RNPR EQU (0xFFFE4110) ;- (PDC_SPI1) Receive Next Pointer Register +AT91C_SPI1_RNCR EQU (0xFFFE4114) ;- (PDC_SPI1) Receive Next Counter Register +AT91C_SPI1_PTSR EQU (0xFFFE4124) ;- (PDC_SPI1) PDC Transfer Status Register +// - ========== Register definition for SPI1 peripheral ========== +AT91C_SPI1_IMR EQU (0xFFFE401C) ;- (SPI1) Interrupt Mask Register +AT91C_SPI1_IER EQU (0xFFFE4014) ;- (SPI1) Interrupt Enable Register +AT91C_SPI1_MR EQU (0xFFFE4004) ;- (SPI1) Mode Register +AT91C_SPI1_RDR EQU (0xFFFE4008) ;- (SPI1) Receive Data Register +AT91C_SPI1_IDR EQU (0xFFFE4018) ;- (SPI1) Interrupt Disable Register +AT91C_SPI1_SR EQU (0xFFFE4010) ;- (SPI1) Status Register +AT91C_SPI1_TDR EQU (0xFFFE400C) ;- (SPI1) Transmit Data Register +AT91C_SPI1_CR EQU (0xFFFE4000) ;- (SPI1) Control Register +AT91C_SPI1_CSR EQU (0xFFFE4030) ;- (SPI1) Chip Select Register +// - ========== Register definition for PDC_SPI0 peripheral ========== +AT91C_SPI0_PTCR EQU (0xFFFE0120) ;- (PDC_SPI0) PDC Transfer Control Register +AT91C_SPI0_TPR EQU (0xFFFE0108) ;- (PDC_SPI0) Transmit Pointer Register +AT91C_SPI0_TCR EQU (0xFFFE010C) ;- (PDC_SPI0) Transmit Counter Register +AT91C_SPI0_RCR EQU (0xFFFE0104) ;- (PDC_SPI0) Receive Counter Register +AT91C_SPI0_PTSR EQU (0xFFFE0124) ;- (PDC_SPI0) PDC Transfer Status Register +AT91C_SPI0_RNPR EQU (0xFFFE0110) ;- (PDC_SPI0) Receive Next Pointer Register +AT91C_SPI0_RPR EQU (0xFFFE0100) ;- (PDC_SPI0) Receive Pointer Register +AT91C_SPI0_TNCR EQU (0xFFFE011C) ;- (PDC_SPI0) Transmit Next Counter Register +AT91C_SPI0_RNCR EQU (0xFFFE0114) ;- (PDC_SPI0) Receive Next Counter Register +AT91C_SPI0_TNPR EQU (0xFFFE0118) ;- (PDC_SPI0) Transmit Next Pointer Register +// - ========== Register definition for SPI0 peripheral ========== +AT91C_SPI0_IER EQU (0xFFFE0014) ;- (SPI0) Interrupt Enable Register +AT91C_SPI0_SR EQU (0xFFFE0010) ;- (SPI0) Status Register +AT91C_SPI0_IDR EQU (0xFFFE0018) ;- (SPI0) Interrupt Disable Register +AT91C_SPI0_CR EQU (0xFFFE0000) ;- (SPI0) Control Register +AT91C_SPI0_MR EQU (0xFFFE0004) ;- (SPI0) Mode Register +AT91C_SPI0_IMR EQU (0xFFFE001C) ;- (SPI0) Interrupt Mask Register +AT91C_SPI0_TDR EQU (0xFFFE000C) ;- (SPI0) Transmit Data Register +AT91C_SPI0_RDR EQU (0xFFFE0008) ;- (SPI0) Receive Data Register +AT91C_SPI0_CSR EQU (0xFFFE0030) ;- (SPI0) Chip Select Register +// - ========== Register definition for PDC_US1 peripheral ========== +AT91C_US1_RNCR EQU (0xFFFC4114) ;- (PDC_US1) Receive Next Counter Register +AT91C_US1_PTCR EQU (0xFFFC4120) ;- (PDC_US1) PDC Transfer Control Register +AT91C_US1_TCR EQU (0xFFFC410C) ;- (PDC_US1) Transmit Counter Register +AT91C_US1_PTSR EQU (0xFFFC4124) ;- (PDC_US1) PDC Transfer Status Register +AT91C_US1_TNPR EQU (0xFFFC4118) ;- (PDC_US1) Transmit Next Pointer Register +AT91C_US1_RCR EQU (0xFFFC4104) ;- (PDC_US1) Receive Counter Register +AT91C_US1_RNPR EQU (0xFFFC4110) ;- (PDC_US1) Receive Next Pointer Register +AT91C_US1_RPR EQU (0xFFFC4100) ;- (PDC_US1) Receive Pointer Register +AT91C_US1_TNCR EQU (0xFFFC411C) ;- (PDC_US1) Transmit Next Counter Register +AT91C_US1_TPR EQU (0xFFFC4108) ;- (PDC_US1) Transmit Pointer Register +// - ========== Register definition for US1 peripheral ========== +AT91C_US1_IF EQU (0xFFFC404C) ;- (US1) IRDA_FILTER Register +AT91C_US1_NER EQU (0xFFFC4044) ;- (US1) Nb Errors Register +AT91C_US1_RTOR EQU (0xFFFC4024) ;- (US1) Receiver Time-out Register +AT91C_US1_CSR EQU (0xFFFC4014) ;- (US1) Channel Status Register +AT91C_US1_IDR EQU (0xFFFC400C) ;- (US1) Interrupt Disable Register +AT91C_US1_IER EQU (0xFFFC4008) ;- (US1) Interrupt Enable Register +AT91C_US1_THR EQU (0xFFFC401C) ;- (US1) Transmitter Holding Register +AT91C_US1_TTGR EQU (0xFFFC4028) ;- (US1) Transmitter Time-guard Register +AT91C_US1_RHR EQU (0xFFFC4018) ;- (US1) Receiver Holding Register +AT91C_US1_BRGR EQU (0xFFFC4020) ;- (US1) Baud Rate Generator Register +AT91C_US1_IMR EQU (0xFFFC4010) ;- (US1) Interrupt Mask Register +AT91C_US1_FIDI EQU (0xFFFC4040) ;- (US1) FI_DI_Ratio Register +AT91C_US1_CR EQU (0xFFFC4000) ;- (US1) Control Register +AT91C_US1_MR EQU (0xFFFC4004) ;- (US1) Mode Register +// - ========== Register definition for PDC_US0 peripheral ========== +AT91C_US0_TNPR EQU (0xFFFC0118) ;- (PDC_US0) Transmit Next Pointer Register +AT91C_US0_RNPR EQU (0xFFFC0110) ;- (PDC_US0) Receive Next Pointer Register +AT91C_US0_TCR EQU (0xFFFC010C) ;- (PDC_US0) Transmit Counter Register +AT91C_US0_PTCR EQU (0xFFFC0120) ;- (PDC_US0) PDC Transfer Control Register +AT91C_US0_PTSR EQU (0xFFFC0124) ;- (PDC_US0) PDC Transfer Status Register +AT91C_US0_TNCR EQU (0xFFFC011C) ;- (PDC_US0) Transmit Next Counter Register +AT91C_US0_TPR EQU (0xFFFC0108) ;- (PDC_US0) Transmit Pointer Register +AT91C_US0_RCR EQU (0xFFFC0104) ;- (PDC_US0) Receive Counter Register +AT91C_US0_RPR EQU (0xFFFC0100) ;- (PDC_US0) Receive Pointer Register +AT91C_US0_RNCR EQU (0xFFFC0114) ;- (PDC_US0) Receive Next Counter Register +// - ========== Register definition for US0 peripheral ========== +AT91C_US0_BRGR EQU (0xFFFC0020) ;- (US0) Baud Rate Generator Register +AT91C_US0_NER EQU (0xFFFC0044) ;- (US0) Nb Errors Register +AT91C_US0_CR EQU (0xFFFC0000) ;- (US0) Control Register +AT91C_US0_IMR EQU (0xFFFC0010) ;- (US0) Interrupt Mask Register +AT91C_US0_FIDI EQU (0xFFFC0040) ;- (US0) FI_DI_Ratio Register +AT91C_US0_TTGR EQU (0xFFFC0028) ;- (US0) Transmitter Time-guard Register +AT91C_US0_MR EQU (0xFFFC0004) ;- (US0) Mode Register +AT91C_US0_RTOR EQU (0xFFFC0024) ;- (US0) Receiver Time-out Register +AT91C_US0_CSR EQU (0xFFFC0014) ;- (US0) Channel Status Register +AT91C_US0_RHR EQU (0xFFFC0018) ;- (US0) Receiver Holding Register +AT91C_US0_IDR EQU (0xFFFC000C) ;- (US0) Interrupt Disable Register +AT91C_US0_THR EQU (0xFFFC001C) ;- (US0) Transmitter Holding Register +AT91C_US0_IF EQU (0xFFFC004C) ;- (US0) IRDA_FILTER Register +AT91C_US0_IER EQU (0xFFFC0008) ;- (US0) Interrupt Enable Register +// - ========== Register definition for PDC_SSC peripheral ========== +AT91C_SSC_TNCR EQU (0xFFFD411C) ;- (PDC_SSC) Transmit Next Counter Register +AT91C_SSC_RPR EQU (0xFFFD4100) ;- (PDC_SSC) Receive Pointer Register +AT91C_SSC_RNCR EQU (0xFFFD4114) ;- (PDC_SSC) Receive Next Counter Register +AT91C_SSC_TPR EQU (0xFFFD4108) ;- (PDC_SSC) Transmit Pointer Register +AT91C_SSC_PTCR EQU (0xFFFD4120) ;- (PDC_SSC) PDC Transfer Control Register +AT91C_SSC_TCR EQU (0xFFFD410C) ;- (PDC_SSC) Transmit Counter Register +AT91C_SSC_RCR EQU (0xFFFD4104) ;- (PDC_SSC) Receive Counter Register +AT91C_SSC_RNPR EQU (0xFFFD4110) ;- (PDC_SSC) Receive Next Pointer Register +AT91C_SSC_TNPR EQU (0xFFFD4118) ;- (PDC_SSC) Transmit Next Pointer Register +AT91C_SSC_PTSR EQU (0xFFFD4124) ;- (PDC_SSC) PDC Transfer Status Register +// - ========== Register definition for SSC peripheral ========== +AT91C_SSC_RHR EQU (0xFFFD4020) ;- (SSC) Receive Holding Register +AT91C_SSC_RSHR EQU (0xFFFD4030) ;- (SSC) Receive Sync Holding Register +AT91C_SSC_TFMR EQU (0xFFFD401C) ;- (SSC) Transmit Frame Mode Register +AT91C_SSC_IDR EQU (0xFFFD4048) ;- (SSC) Interrupt Disable Register +AT91C_SSC_THR EQU (0xFFFD4024) ;- (SSC) Transmit Holding Register +AT91C_SSC_RCMR EQU (0xFFFD4010) ;- (SSC) Receive Clock ModeRegister +AT91C_SSC_IER EQU (0xFFFD4044) ;- (SSC) Interrupt Enable Register +AT91C_SSC_TSHR EQU (0xFFFD4034) ;- (SSC) Transmit Sync Holding Register +AT91C_SSC_SR EQU (0xFFFD4040) ;- (SSC) Status Register +AT91C_SSC_CMR EQU (0xFFFD4004) ;- (SSC) Clock Mode Register +AT91C_SSC_TCMR EQU (0xFFFD4018) ;- (SSC) Transmit Clock Mode Register +AT91C_SSC_CR EQU (0xFFFD4000) ;- (SSC) Control Register +AT91C_SSC_IMR EQU (0xFFFD404C) ;- (SSC) Interrupt Mask Register +AT91C_SSC_RFMR EQU (0xFFFD4014) ;- (SSC) Receive Frame Mode Register +// - ========== Register definition for TWI peripheral ========== +AT91C_TWI_IER EQU (0xFFFB8024) ;- (TWI) Interrupt Enable Register +AT91C_TWI_CR EQU (0xFFFB8000) ;- (TWI) Control Register +AT91C_TWI_SR EQU (0xFFFB8020) ;- (TWI) Status Register +AT91C_TWI_IMR EQU (0xFFFB802C) ;- (TWI) Interrupt Mask Register +AT91C_TWI_THR EQU (0xFFFB8034) ;- (TWI) Transmit Holding Register +AT91C_TWI_IDR EQU (0xFFFB8028) ;- (TWI) Interrupt Disable Register +AT91C_TWI_IADR EQU (0xFFFB800C) ;- (TWI) Internal Address Register +AT91C_TWI_MMR EQU (0xFFFB8004) ;- (TWI) Master Mode Register +AT91C_TWI_CWGR EQU (0xFFFB8010) ;- (TWI) Clock Waveform Generator Register +AT91C_TWI_RHR EQU (0xFFFB8030) ;- (TWI) Receive Holding Register +// - ========== Register definition for PWMC_CH3 peripheral ========== +AT91C_PWMC_CH3_CUPDR EQU (0xFFFCC270) ;- (PWMC_CH3) Channel Update Register +AT91C_PWMC_CH3_Reserved EQU (0xFFFCC274) ;- (PWMC_CH3) Reserved +AT91C_PWMC_CH3_CPRDR EQU (0xFFFCC268) ;- (PWMC_CH3) Channel Period Register +AT91C_PWMC_CH3_CDTYR EQU (0xFFFCC264) ;- (PWMC_CH3) Channel Duty Cycle Register +AT91C_PWMC_CH3_CCNTR EQU (0xFFFCC26C) ;- (PWMC_CH3) Channel Counter Register +AT91C_PWMC_CH3_CMR EQU (0xFFFCC260) ;- (PWMC_CH3) Channel Mode Register +// - ========== Register definition for PWMC_CH2 peripheral ========== +AT91C_PWMC_CH2_Reserved EQU (0xFFFCC254) ;- (PWMC_CH2) Reserved +AT91C_PWMC_CH2_CMR EQU (0xFFFCC240) ;- (PWMC_CH2) Channel Mode Register +AT91C_PWMC_CH2_CCNTR EQU (0xFFFCC24C) ;- (PWMC_CH2) Channel Counter Register +AT91C_PWMC_CH2_CPRDR EQU (0xFFFCC248) ;- (PWMC_CH2) Channel Period Register +AT91C_PWMC_CH2_CUPDR EQU (0xFFFCC250) ;- (PWMC_CH2) Channel Update Register +AT91C_PWMC_CH2_CDTYR EQU (0xFFFCC244) ;- (PWMC_CH2) Channel Duty Cycle Register +// - ========== Register definition for PWMC_CH1 peripheral ========== +AT91C_PWMC_CH1_Reserved EQU (0xFFFCC234) ;- (PWMC_CH1) Reserved +AT91C_PWMC_CH1_CUPDR EQU (0xFFFCC230) ;- (PWMC_CH1) Channel Update Register +AT91C_PWMC_CH1_CPRDR EQU (0xFFFCC228) ;- (PWMC_CH1) Channel Period Register +AT91C_PWMC_CH1_CCNTR EQU (0xFFFCC22C) ;- (PWMC_CH1) Channel Counter Register +AT91C_PWMC_CH1_CDTYR EQU (0xFFFCC224) ;- (PWMC_CH1) Channel Duty Cycle Register +AT91C_PWMC_CH1_CMR EQU (0xFFFCC220) ;- (PWMC_CH1) Channel Mode Register +// - ========== Register definition for PWMC_CH0 peripheral ========== +AT91C_PWMC_CH0_Reserved EQU (0xFFFCC214) ;- (PWMC_CH0) Reserved +AT91C_PWMC_CH0_CPRDR EQU (0xFFFCC208) ;- (PWMC_CH0) Channel Period Register +AT91C_PWMC_CH0_CDTYR EQU (0xFFFCC204) ;- (PWMC_CH0) Channel Duty Cycle Register +AT91C_PWMC_CH0_CMR EQU (0xFFFCC200) ;- (PWMC_CH0) Channel Mode Register +AT91C_PWMC_CH0_CUPDR EQU (0xFFFCC210) ;- (PWMC_CH0) Channel Update Register +AT91C_PWMC_CH0_CCNTR EQU (0xFFFCC20C) ;- (PWMC_CH0) Channel Counter Register +// - ========== Register definition for PWMC peripheral ========== +AT91C_PWMC_IDR EQU (0xFFFCC014) ;- (PWMC) PWMC Interrupt Disable Register +AT91C_PWMC_DIS EQU (0xFFFCC008) ;- (PWMC) PWMC Disable Register +AT91C_PWMC_IER EQU (0xFFFCC010) ;- (PWMC) PWMC Interrupt Enable Register +AT91C_PWMC_VR EQU (0xFFFCC0FC) ;- (PWMC) PWMC Version Register +AT91C_PWMC_ISR EQU (0xFFFCC01C) ;- (PWMC) PWMC Interrupt Status Register +AT91C_PWMC_SR EQU (0xFFFCC00C) ;- (PWMC) PWMC Status Register +AT91C_PWMC_IMR EQU (0xFFFCC018) ;- (PWMC) PWMC Interrupt Mask Register +AT91C_PWMC_MR EQU (0xFFFCC000) ;- (PWMC) PWMC Mode Register +AT91C_PWMC_ENA EQU (0xFFFCC004) ;- (PWMC) PWMC Enable Register +// - ========== Register definition for UDP peripheral ========== +AT91C_UDP_IMR EQU (0xFFFB0018) ;- (UDP) Interrupt Mask Register +AT91C_UDP_FADDR EQU (0xFFFB0008) ;- (UDP) Function Address Register +AT91C_UDP_NUM EQU (0xFFFB0000) ;- (UDP) Frame Number Register +AT91C_UDP_FDR EQU (0xFFFB0050) ;- (UDP) Endpoint FIFO Data Register +AT91C_UDP_ISR EQU (0xFFFB001C) ;- (UDP) Interrupt Status Register +AT91C_UDP_CSR EQU (0xFFFB0030) ;- (UDP) Endpoint Control and Status Register +AT91C_UDP_IDR EQU (0xFFFB0014) ;- (UDP) Interrupt Disable Register +AT91C_UDP_ICR EQU (0xFFFB0020) ;- (UDP) Interrupt Clear Register +AT91C_UDP_RSTEP EQU (0xFFFB0028) ;- (UDP) Reset Endpoint Register +AT91C_UDP_TXVC EQU (0xFFFB0074) ;- (UDP) Transceiver Control Register +AT91C_UDP_GLBSTATE EQU (0xFFFB0004) ;- (UDP) Global State Register +AT91C_UDP_IER EQU (0xFFFB0010) ;- (UDP) Interrupt Enable Register +// - ========== Register definition for TC0 peripheral ========== +AT91C_TC0_SR EQU (0xFFFA0020) ;- (TC0) Status Register +AT91C_TC0_RC EQU (0xFFFA001C) ;- (TC0) Register C +AT91C_TC0_RB EQU (0xFFFA0018) ;- (TC0) Register B +AT91C_TC0_CCR EQU (0xFFFA0000) ;- (TC0) Channel Control Register +AT91C_TC0_CMR EQU (0xFFFA0004) ;- (TC0) Channel Mode Register (Capture Mode / Waveform Mode) +AT91C_TC0_IER EQU (0xFFFA0024) ;- (TC0) Interrupt Enable Register +AT91C_TC0_RA EQU (0xFFFA0014) ;- (TC0) Register A +AT91C_TC0_IDR EQU (0xFFFA0028) ;- (TC0) Interrupt Disable Register +AT91C_TC0_CV EQU (0xFFFA0010) ;- (TC0) Counter Value +AT91C_TC0_IMR EQU (0xFFFA002C) ;- (TC0) Interrupt Mask Register +// - ========== Register definition for TC1 peripheral ========== +AT91C_TC1_RB EQU (0xFFFA0058) ;- (TC1) Register B +AT91C_TC1_CCR EQU (0xFFFA0040) ;- (TC1) Channel Control Register +AT91C_TC1_IER EQU (0xFFFA0064) ;- (TC1) Interrupt Enable Register +AT91C_TC1_IDR EQU (0xFFFA0068) ;- (TC1) Interrupt Disable Register +AT91C_TC1_SR EQU (0xFFFA0060) ;- (TC1) Status Register +AT91C_TC1_CMR EQU (0xFFFA0044) ;- (TC1) Channel Mode Register (Capture Mode / Waveform Mode) +AT91C_TC1_RA EQU (0xFFFA0054) ;- (TC1) Register A +AT91C_TC1_RC EQU (0xFFFA005C) ;- (TC1) Register C +AT91C_TC1_IMR EQU (0xFFFA006C) ;- (TC1) Interrupt Mask Register +AT91C_TC1_CV EQU (0xFFFA0050) ;- (TC1) Counter Value +// - ========== Register definition for TC2 peripheral ========== +AT91C_TC2_CMR EQU (0xFFFA0084) ;- (TC2) Channel Mode Register (Capture Mode / Waveform Mode) +AT91C_TC2_CCR EQU (0xFFFA0080) ;- (TC2) Channel Control Register +AT91C_TC2_CV EQU (0xFFFA0090) ;- (TC2) Counter Value +AT91C_TC2_RA EQU (0xFFFA0094) ;- (TC2) Register A +AT91C_TC2_RB EQU (0xFFFA0098) ;- (TC2) Register B +AT91C_TC2_IDR EQU (0xFFFA00A8) ;- (TC2) Interrupt Disable Register +AT91C_TC2_IMR EQU (0xFFFA00AC) ;- (TC2) Interrupt Mask Register +AT91C_TC2_RC EQU (0xFFFA009C) ;- (TC2) Register C +AT91C_TC2_IER EQU (0xFFFA00A4) ;- (TC2) Interrupt Enable Register +AT91C_TC2_SR EQU (0xFFFA00A0) ;- (TC2) Status Register +// - ========== Register definition for TCB peripheral ========== +AT91C_TCB_BMR EQU (0xFFFA00C4) ;- (TCB) TC Block Mode Register +AT91C_TCB_BCR EQU (0xFFFA00C0) ;- (TCB) TC Block Control Register +// - ========== Register definition for CAN_MB0 peripheral ========== +AT91C_CAN_MB0_MDL EQU (0xFFFD0214) ;- (CAN_MB0) MailBox Data Low Register +AT91C_CAN_MB0_MAM EQU (0xFFFD0204) ;- (CAN_MB0) MailBox Acceptance Mask Register +AT91C_CAN_MB0_MCR EQU (0xFFFD021C) ;- (CAN_MB0) MailBox Control Register +AT91C_CAN_MB0_MID EQU (0xFFFD0208) ;- (CAN_MB0) MailBox ID Register +AT91C_CAN_MB0_MSR EQU (0xFFFD0210) ;- (CAN_MB0) MailBox Status Register +AT91C_CAN_MB0_MFID EQU (0xFFFD020C) ;- (CAN_MB0) MailBox Family ID Register +AT91C_CAN_MB0_MDH EQU (0xFFFD0218) ;- (CAN_MB0) MailBox Data High Register +AT91C_CAN_MB0_MMR EQU (0xFFFD0200) ;- (CAN_MB0) MailBox Mode Register +// - ========== Register definition for CAN_MB1 peripheral ========== +AT91C_CAN_MB1_MDL EQU (0xFFFD0234) ;- (CAN_MB1) MailBox Data Low Register +AT91C_CAN_MB1_MID EQU (0xFFFD0228) ;- (CAN_MB1) MailBox ID Register +AT91C_CAN_MB1_MMR EQU (0xFFFD0220) ;- (CAN_MB1) MailBox Mode Register +AT91C_CAN_MB1_MSR EQU (0xFFFD0230) ;- (CAN_MB1) MailBox Status Register +AT91C_CAN_MB1_MAM EQU (0xFFFD0224) ;- (CAN_MB1) MailBox Acceptance Mask Register +AT91C_CAN_MB1_MDH EQU (0xFFFD0238) ;- (CAN_MB1) MailBox Data High Register +AT91C_CAN_MB1_MCR EQU (0xFFFD023C) ;- (CAN_MB1) MailBox Control Register +AT91C_CAN_MB1_MFID EQU (0xFFFD022C) ;- (CAN_MB1) MailBox Family ID Register +// - ========== Register definition for CAN_MB2 peripheral ========== +AT91C_CAN_MB2_MCR EQU (0xFFFD025C) ;- (CAN_MB2) MailBox Control Register +AT91C_CAN_MB2_MDH EQU (0xFFFD0258) ;- (CAN_MB2) MailBox Data High Register +AT91C_CAN_MB2_MID EQU (0xFFFD0248) ;- (CAN_MB2) MailBox ID Register +AT91C_CAN_MB2_MDL EQU (0xFFFD0254) ;- (CAN_MB2) MailBox Data Low Register +AT91C_CAN_MB2_MMR EQU (0xFFFD0240) ;- (CAN_MB2) MailBox Mode Register +AT91C_CAN_MB2_MAM EQU (0xFFFD0244) ;- (CAN_MB2) MailBox Acceptance Mask Register +AT91C_CAN_MB2_MFID EQU (0xFFFD024C) ;- (CAN_MB2) MailBox Family ID Register +AT91C_CAN_MB2_MSR EQU (0xFFFD0250) ;- (CAN_MB2) MailBox Status Register +// - ========== Register definition for CAN_MB3 peripheral ========== +AT91C_CAN_MB3_MFID EQU (0xFFFD026C) ;- (CAN_MB3) MailBox Family ID Register +AT91C_CAN_MB3_MAM EQU (0xFFFD0264) ;- (CAN_MB3) MailBox Acceptance Mask Register +AT91C_CAN_MB3_MID EQU (0xFFFD0268) ;- (CAN_MB3) MailBox ID Register +AT91C_CAN_MB3_MCR EQU (0xFFFD027C) ;- (CAN_MB3) MailBox Control Register +AT91C_CAN_MB3_MMR EQU (0xFFFD0260) ;- (CAN_MB3) MailBox Mode Register +AT91C_CAN_MB3_MSR EQU (0xFFFD0270) ;- (CAN_MB3) MailBox Status Register +AT91C_CAN_MB3_MDL EQU (0xFFFD0274) ;- (CAN_MB3) MailBox Data Low Register +AT91C_CAN_MB3_MDH EQU (0xFFFD0278) ;- (CAN_MB3) MailBox Data High Register +// - ========== Register definition for CAN_MB4 peripheral ========== +AT91C_CAN_MB4_MID EQU (0xFFFD0288) ;- (CAN_MB4) MailBox ID Register +AT91C_CAN_MB4_MMR EQU (0xFFFD0280) ;- (CAN_MB4) MailBox Mode Register +AT91C_CAN_MB4_MDH EQU (0xFFFD0298) ;- (CAN_MB4) MailBox Data High Register +AT91C_CAN_MB4_MFID EQU (0xFFFD028C) ;- (CAN_MB4) MailBox Family ID Register +AT91C_CAN_MB4_MSR EQU (0xFFFD0290) ;- (CAN_MB4) MailBox Status Register +AT91C_CAN_MB4_MCR EQU (0xFFFD029C) ;- (CAN_MB4) MailBox Control Register +AT91C_CAN_MB4_MDL EQU (0xFFFD0294) ;- (CAN_MB4) MailBox Data Low Register +AT91C_CAN_MB4_MAM EQU (0xFFFD0284) ;- (CAN_MB4) MailBox Acceptance Mask Register +// - ========== Register definition for CAN_MB5 peripheral ========== +AT91C_CAN_MB5_MSR EQU (0xFFFD02B0) ;- (CAN_MB5) MailBox Status Register +AT91C_CAN_MB5_MCR EQU (0xFFFD02BC) ;- (CAN_MB5) MailBox Control Register +AT91C_CAN_MB5_MFID EQU (0xFFFD02AC) ;- (CAN_MB5) MailBox Family ID Register +AT91C_CAN_MB5_MDH EQU (0xFFFD02B8) ;- (CAN_MB5) MailBox Data High Register +AT91C_CAN_MB5_MID EQU (0xFFFD02A8) ;- (CAN_MB5) MailBox ID Register +AT91C_CAN_MB5_MMR EQU (0xFFFD02A0) ;- (CAN_MB5) MailBox Mode Register +AT91C_CAN_MB5_MDL EQU (0xFFFD02B4) ;- (CAN_MB5) MailBox Data Low Register +AT91C_CAN_MB5_MAM EQU (0xFFFD02A4) ;- (CAN_MB5) MailBox Acceptance Mask Register +// - ========== Register definition for CAN_MB6 peripheral ========== +AT91C_CAN_MB6_MFID EQU (0xFFFD02CC) ;- (CAN_MB6) MailBox Family ID Register +AT91C_CAN_MB6_MID EQU (0xFFFD02C8) ;- (CAN_MB6) MailBox ID Register +AT91C_CAN_MB6_MAM EQU (0xFFFD02C4) ;- (CAN_MB6) MailBox Acceptance Mask Register +AT91C_CAN_MB6_MSR EQU (0xFFFD02D0) ;- (CAN_MB6) MailBox Status Register +AT91C_CAN_MB6_MDL EQU (0xFFFD02D4) ;- (CAN_MB6) MailBox Data Low Register +AT91C_CAN_MB6_MCR EQU (0xFFFD02DC) ;- (CAN_MB6) MailBox Control Register +AT91C_CAN_MB6_MDH EQU (0xFFFD02D8) ;- (CAN_MB6) MailBox Data High Register +AT91C_CAN_MB6_MMR EQU (0xFFFD02C0) ;- (CAN_MB6) MailBox Mode Register +// - ========== Register definition for CAN_MB7 peripheral ========== +AT91C_CAN_MB7_MCR EQU (0xFFFD02FC) ;- (CAN_MB7) MailBox Control Register +AT91C_CAN_MB7_MDH EQU (0xFFFD02F8) ;- (CAN_MB7) MailBox Data High Register +AT91C_CAN_MB7_MFID EQU (0xFFFD02EC) ;- (CAN_MB7) MailBox Family ID Register +AT91C_CAN_MB7_MDL EQU (0xFFFD02F4) ;- (CAN_MB7) MailBox Data Low Register +AT91C_CAN_MB7_MID EQU (0xFFFD02E8) ;- (CAN_MB7) MailBox ID Register +AT91C_CAN_MB7_MMR EQU (0xFFFD02E0) ;- (CAN_MB7) MailBox Mode Register +AT91C_CAN_MB7_MAM EQU (0xFFFD02E4) ;- (CAN_MB7) MailBox Acceptance Mask Register +AT91C_CAN_MB7_MSR EQU (0xFFFD02F0) ;- (CAN_MB7) MailBox Status Register +// - ========== Register definition for CAN peripheral ========== +AT91C_CAN_TCR EQU (0xFFFD0024) ;- (CAN) Transfer Command Register +AT91C_CAN_IMR EQU (0xFFFD000C) ;- (CAN) Interrupt Mask Register +AT91C_CAN_IER EQU (0xFFFD0004) ;- (CAN) Interrupt Enable Register +AT91C_CAN_ECR EQU (0xFFFD0020) ;- (CAN) Error Counter Register +AT91C_CAN_TIMESTP EQU (0xFFFD001C) ;- (CAN) Time Stamp Register +AT91C_CAN_MR EQU (0xFFFD0000) ;- (CAN) Mode Register +AT91C_CAN_IDR EQU (0xFFFD0008) ;- (CAN) Interrupt Disable Register +AT91C_CAN_ACR EQU (0xFFFD0028) ;- (CAN) Abort Command Register +AT91C_CAN_TIM EQU (0xFFFD0018) ;- (CAN) Timer Register +AT91C_CAN_SR EQU (0xFFFD0010) ;- (CAN) Status Register +AT91C_CAN_BR EQU (0xFFFD0014) ;- (CAN) Baudrate Register +AT91C_CAN_VR EQU (0xFFFD00FC) ;- (CAN) Version Register +// - ========== Register definition for EMAC peripheral ========== +AT91C_EMAC_ISR EQU (0xFFFDC024) ;- (EMAC) Interrupt Status Register +AT91C_EMAC_SA4H EQU (0xFFFDC0B4) ;- (EMAC) Specific Address 4 Top, Last 2 bytes +AT91C_EMAC_SA1L EQU (0xFFFDC098) ;- (EMAC) Specific Address 1 Bottom, First 4 bytes +AT91C_EMAC_ELE EQU (0xFFFDC078) ;- (EMAC) Excessive Length Errors Register +AT91C_EMAC_LCOL EQU (0xFFFDC05C) ;- (EMAC) Late Collision Register +AT91C_EMAC_RLE EQU (0xFFFDC088) ;- (EMAC) Receive Length Field Mismatch Register +AT91C_EMAC_WOL EQU (0xFFFDC0C4) ;- (EMAC) Wake On LAN Register +AT91C_EMAC_DTF EQU (0xFFFDC058) ;- (EMAC) Deferred Transmission Frame Register +AT91C_EMAC_TUND EQU (0xFFFDC064) ;- (EMAC) Transmit Underrun Error Register +AT91C_EMAC_NCR EQU (0xFFFDC000) ;- (EMAC) Network Control Register +AT91C_EMAC_SA4L EQU (0xFFFDC0B0) ;- (EMAC) Specific Address 4 Bottom, First 4 bytes +AT91C_EMAC_RSR EQU (0xFFFDC020) ;- (EMAC) Receive Status Register +AT91C_EMAC_SA3L EQU (0xFFFDC0A8) ;- (EMAC) Specific Address 3 Bottom, First 4 bytes +AT91C_EMAC_TSR EQU (0xFFFDC014) ;- (EMAC) Transmit Status Register +AT91C_EMAC_IDR EQU (0xFFFDC02C) ;- (EMAC) Interrupt Disable Register +AT91C_EMAC_RSE EQU (0xFFFDC074) ;- (EMAC) Receive Symbol Errors Register +AT91C_EMAC_ECOL EQU (0xFFFDC060) ;- (EMAC) Excessive Collision Register +AT91C_EMAC_TID EQU (0xFFFDC0B8) ;- (EMAC) Type ID Checking Register +AT91C_EMAC_HRB EQU (0xFFFDC090) ;- (EMAC) Hash Address Bottom[31:0] +AT91C_EMAC_TBQP EQU (0xFFFDC01C) ;- (EMAC) Transmit Buffer Queue Pointer +AT91C_EMAC_USRIO EQU (0xFFFDC0C0) ;- (EMAC) USER Input/Output Register +AT91C_EMAC_PTR EQU (0xFFFDC038) ;- (EMAC) Pause Time Register +AT91C_EMAC_SA2H EQU (0xFFFDC0A4) ;- (EMAC) Specific Address 2 Top, Last 2 bytes +AT91C_EMAC_ROV EQU (0xFFFDC070) ;- (EMAC) Receive Overrun Errors Register +AT91C_EMAC_ALE EQU (0xFFFDC054) ;- (EMAC) Alignment Error Register +AT91C_EMAC_RJA EQU (0xFFFDC07C) ;- (EMAC) Receive Jabbers Register +AT91C_EMAC_RBQP EQU (0xFFFDC018) ;- (EMAC) Receive Buffer Queue Pointer +AT91C_EMAC_TPF EQU (0xFFFDC08C) ;- (EMAC) Transmitted Pause Frames Register +AT91C_EMAC_NCFGR EQU (0xFFFDC004) ;- (EMAC) Network Configuration Register +AT91C_EMAC_HRT EQU (0xFFFDC094) ;- (EMAC) Hash Address Top[63:32] +AT91C_EMAC_USF EQU (0xFFFDC080) ;- (EMAC) Undersize Frames Register +AT91C_EMAC_FCSE EQU (0xFFFDC050) ;- (EMAC) Frame Check Sequence Error Register +AT91C_EMAC_TPQ EQU (0xFFFDC0BC) ;- (EMAC) Transmit Pause Quantum Register +AT91C_EMAC_MAN EQU (0xFFFDC034) ;- (EMAC) PHY Maintenance Register +AT91C_EMAC_FTO EQU (0xFFFDC040) ;- (EMAC) Frames Transmitted OK Register +AT91C_EMAC_REV EQU (0xFFFDC0FC) ;- (EMAC) Revision Register +AT91C_EMAC_IMR EQU (0xFFFDC030) ;- (EMAC) Interrupt Mask Register +AT91C_EMAC_SCF EQU (0xFFFDC044) ;- (EMAC) Single Collision Frame Register +AT91C_EMAC_PFR EQU (0xFFFDC03C) ;- (EMAC) Pause Frames received Register +AT91C_EMAC_MCF EQU (0xFFFDC048) ;- (EMAC) Multiple Collision Frame Register +AT91C_EMAC_NSR EQU (0xFFFDC008) ;- (EMAC) Network Status Register +AT91C_EMAC_SA2L EQU (0xFFFDC0A0) ;- (EMAC) Specific Address 2 Bottom, First 4 bytes +AT91C_EMAC_FRO EQU (0xFFFDC04C) ;- (EMAC) Frames Received OK Register +AT91C_EMAC_IER EQU (0xFFFDC028) ;- (EMAC) Interrupt Enable Register +AT91C_EMAC_SA1H EQU (0xFFFDC09C) ;- (EMAC) Specific Address 1 Top, Last 2 bytes +AT91C_EMAC_CSE EQU (0xFFFDC068) ;- (EMAC) Carrier Sense Error Register +AT91C_EMAC_SA3H EQU (0xFFFDC0AC) ;- (EMAC) Specific Address 3 Top, Last 2 bytes +AT91C_EMAC_RRE EQU (0xFFFDC06C) ;- (EMAC) Receive Ressource Error Register +AT91C_EMAC_STE EQU (0xFFFDC084) ;- (EMAC) SQE Test Error Register +// - ========== Register definition for PDC_ADC peripheral ========== +AT91C_ADC_PTSR EQU (0xFFFD8124) ;- (PDC_ADC) PDC Transfer Status Register +AT91C_ADC_PTCR EQU (0xFFFD8120) ;- (PDC_ADC) PDC Transfer Control Register +AT91C_ADC_TNPR EQU (0xFFFD8118) ;- (PDC_ADC) Transmit Next Pointer Register +AT91C_ADC_TNCR EQU (0xFFFD811C) ;- (PDC_ADC) Transmit Next Counter Register +AT91C_ADC_RNPR EQU (0xFFFD8110) ;- (PDC_ADC) Receive Next Pointer Register +AT91C_ADC_RNCR EQU (0xFFFD8114) ;- (PDC_ADC) Receive Next Counter Register +AT91C_ADC_RPR EQU (0xFFFD8100) ;- (PDC_ADC) Receive Pointer Register +AT91C_ADC_TCR EQU (0xFFFD810C) ;- (PDC_ADC) Transmit Counter Register +AT91C_ADC_TPR EQU (0xFFFD8108) ;- (PDC_ADC) Transmit Pointer Register +AT91C_ADC_RCR EQU (0xFFFD8104) ;- (PDC_ADC) Receive Counter Register +// - ========== Register definition for ADC peripheral ========== +AT91C_ADC_CDR2 EQU (0xFFFD8038) ;- (ADC) ADC Channel Data Register 2 +AT91C_ADC_CDR3 EQU (0xFFFD803C) ;- (ADC) ADC Channel Data Register 3 +AT91C_ADC_CDR0 EQU (0xFFFD8030) ;- (ADC) ADC Channel Data Register 0 +AT91C_ADC_CDR5 EQU (0xFFFD8044) ;- (ADC) ADC Channel Data Register 5 +AT91C_ADC_CHDR EQU (0xFFFD8014) ;- (ADC) ADC Channel Disable Register +AT91C_ADC_SR EQU (0xFFFD801C) ;- (ADC) ADC Status Register +AT91C_ADC_CDR4 EQU (0xFFFD8040) ;- (ADC) ADC Channel Data Register 4 +AT91C_ADC_CDR1 EQU (0xFFFD8034) ;- (ADC) ADC Channel Data Register 1 +AT91C_ADC_LCDR EQU (0xFFFD8020) ;- (ADC) ADC Last Converted Data Register +AT91C_ADC_IDR EQU (0xFFFD8028) ;- (ADC) ADC Interrupt Disable Register +AT91C_ADC_CR EQU (0xFFFD8000) ;- (ADC) ADC Control Register +AT91C_ADC_CDR7 EQU (0xFFFD804C) ;- (ADC) ADC Channel Data Register 7 +AT91C_ADC_CDR6 EQU (0xFFFD8048) ;- (ADC) ADC Channel Data Register 6 +AT91C_ADC_IER EQU (0xFFFD8024) ;- (ADC) ADC Interrupt Enable Register +AT91C_ADC_CHER EQU (0xFFFD8010) ;- (ADC) ADC Channel Enable Register +AT91C_ADC_CHSR EQU (0xFFFD8018) ;- (ADC) ADC Channel Status Register +AT91C_ADC_MR EQU (0xFFFD8004) ;- (ADC) ADC Mode Register +AT91C_ADC_IMR EQU (0xFFFD802C) ;- (ADC) ADC Interrupt Mask Register +// - ========== Register definition for PDC_AES peripheral ========== +AT91C_AES_TPR EQU (0xFFFA4108) ;- (PDC_AES) Transmit Pointer Register +AT91C_AES_PTCR EQU (0xFFFA4120) ;- (PDC_AES) PDC Transfer Control Register +AT91C_AES_RNPR EQU (0xFFFA4110) ;- (PDC_AES) Receive Next Pointer Register +AT91C_AES_TNCR EQU (0xFFFA411C) ;- (PDC_AES) Transmit Next Counter Register +AT91C_AES_TCR EQU (0xFFFA410C) ;- (PDC_AES) Transmit Counter Register +AT91C_AES_RCR EQU (0xFFFA4104) ;- (PDC_AES) Receive Counter Register +AT91C_AES_RNCR EQU (0xFFFA4114) ;- (PDC_AES) Receive Next Counter Register +AT91C_AES_TNPR EQU (0xFFFA4118) ;- (PDC_AES) Transmit Next Pointer Register +AT91C_AES_RPR EQU (0xFFFA4100) ;- (PDC_AES) Receive Pointer Register +AT91C_AES_PTSR EQU (0xFFFA4124) ;- (PDC_AES) PDC Transfer Status Register +// - ========== Register definition for AES peripheral ========== +AT91C_AES_IVxR EQU (0xFFFA4060) ;- (AES) Initialization Vector x Register +AT91C_AES_MR EQU (0xFFFA4004) ;- (AES) Mode Register +AT91C_AES_VR EQU (0xFFFA40FC) ;- (AES) AES Version Register +AT91C_AES_ODATAxR EQU (0xFFFA4050) ;- (AES) Output Data x Register +AT91C_AES_IDATAxR EQU (0xFFFA4040) ;- (AES) Input Data x Register +AT91C_AES_CR EQU (0xFFFA4000) ;- (AES) Control Register +AT91C_AES_IDR EQU (0xFFFA4014) ;- (AES) Interrupt Disable Register +AT91C_AES_IMR EQU (0xFFFA4018) ;- (AES) Interrupt Mask Register +AT91C_AES_IER EQU (0xFFFA4010) ;- (AES) Interrupt Enable Register +AT91C_AES_KEYWxR EQU (0xFFFA4020) ;- (AES) Key Word x Register +AT91C_AES_ISR EQU (0xFFFA401C) ;- (AES) Interrupt Status Register +// - ========== Register definition for PDC_TDES peripheral ========== +AT91C_TDES_RNCR EQU (0xFFFA8114) ;- (PDC_TDES) Receive Next Counter Register +AT91C_TDES_TCR EQU (0xFFFA810C) ;- (PDC_TDES) Transmit Counter Register +AT91C_TDES_RCR EQU (0xFFFA8104) ;- (PDC_TDES) Receive Counter Register +AT91C_TDES_TNPR EQU (0xFFFA8118) ;- (PDC_TDES) Transmit Next Pointer Register +AT91C_TDES_RNPR EQU (0xFFFA8110) ;- (PDC_TDES) Receive Next Pointer Register +AT91C_TDES_RPR EQU (0xFFFA8100) ;- (PDC_TDES) Receive Pointer Register +AT91C_TDES_TNCR EQU (0xFFFA811C) ;- (PDC_TDES) Transmit Next Counter Register +AT91C_TDES_TPR EQU (0xFFFA8108) ;- (PDC_TDES) Transmit Pointer Register +AT91C_TDES_PTSR EQU (0xFFFA8124) ;- (PDC_TDES) PDC Transfer Status Register +AT91C_TDES_PTCR EQU (0xFFFA8120) ;- (PDC_TDES) PDC Transfer Control Register +// - ========== Register definition for TDES peripheral ========== +AT91C_TDES_KEY2WxR EQU (0xFFFA8028) ;- (TDES) Key 2 Word x Register +AT91C_TDES_KEY3WxR EQU (0xFFFA8030) ;- (TDES) Key 3 Word x Register +AT91C_TDES_IDR EQU (0xFFFA8014) ;- (TDES) Interrupt Disable Register +AT91C_TDES_VR EQU (0xFFFA80FC) ;- (TDES) TDES Version Register +AT91C_TDES_IVxR EQU (0xFFFA8060) ;- (TDES) Initialization Vector x Register +AT91C_TDES_ODATAxR EQU (0xFFFA8050) ;- (TDES) Output Data x Register +AT91C_TDES_IMR EQU (0xFFFA8018) ;- (TDES) Interrupt Mask Register +AT91C_TDES_MR EQU (0xFFFA8004) ;- (TDES) Mode Register +AT91C_TDES_CR EQU (0xFFFA8000) ;- (TDES) Control Register +AT91C_TDES_IER EQU (0xFFFA8010) ;- (TDES) Interrupt Enable Register +AT91C_TDES_ISR EQU (0xFFFA801C) ;- (TDES) Interrupt Status Register +AT91C_TDES_IDATAxR EQU (0xFFFA8040) ;- (TDES) Input Data x Register +AT91C_TDES_KEY1WxR EQU (0xFFFA8020) ;- (TDES) Key 1 Word x Register + +// - ***************************************************************************** +// - PIO DEFINITIONS FOR AT91SAM7X256 +// - ***************************************************************************** +AT91C_PIO_PA0 EQU (1 << 0) ;- Pin Controlled by PA0 +AT91C_PA0_RXD0 EQU (AT91C_PIO_PA0) ;- USART 0 Receive Data +AT91C_PIO_PA1 EQU (1 << 1) ;- Pin Controlled by PA1 +AT91C_PA1_TXD0 EQU (AT91C_PIO_PA1) ;- USART 0 Transmit Data +AT91C_PIO_PA10 EQU (1 << 10) ;- Pin Controlled by PA10 +AT91C_PA10_TWD EQU (AT91C_PIO_PA10) ;- TWI Two-wire Serial Data +AT91C_PIO_PA11 EQU (1 << 11) ;- Pin Controlled by PA11 +AT91C_PA11_TWCK EQU (AT91C_PIO_PA11) ;- TWI Two-wire Serial Clock +AT91C_PIO_PA12 EQU (1 << 12) ;- Pin Controlled by PA12 +AT91C_PA12_NPCS00 EQU (AT91C_PIO_PA12) ;- SPI 0 Peripheral Chip Select 0 +AT91C_PIO_PA13 EQU (1 << 13) ;- Pin Controlled by PA13 +AT91C_PA13_NPCS01 EQU (AT91C_PIO_PA13) ;- SPI 0 Peripheral Chip Select 1 +AT91C_PA13_PCK1 EQU (AT91C_PIO_PA13) ;- PMC Programmable Clock Output 1 +AT91C_PIO_PA14 EQU (1 << 14) ;- Pin Controlled by PA14 +AT91C_PA14_NPCS02 EQU (AT91C_PIO_PA14) ;- SPI 0 Peripheral Chip Select 2 +AT91C_PA14_IRQ1 EQU (AT91C_PIO_PA14) ;- External Interrupt 1 +AT91C_PIO_PA15 EQU (1 << 15) ;- Pin Controlled by PA15 +AT91C_PA15_NPCS03 EQU (AT91C_PIO_PA15) ;- SPI 0 Peripheral Chip Select 3 +AT91C_PA15_TCLK2 EQU (AT91C_PIO_PA15) ;- Timer Counter 2 external clock input +AT91C_PIO_PA16 EQU (1 << 16) ;- Pin Controlled by PA16 +AT91C_PA16_MISO0 EQU (AT91C_PIO_PA16) ;- SPI 0 Master In Slave +AT91C_PIO_PA17 EQU (1 << 17) ;- Pin Controlled by PA17 +AT91C_PA17_MOSI0 EQU (AT91C_PIO_PA17) ;- SPI 0 Master Out Slave +AT91C_PIO_PA18 EQU (1 << 18) ;- Pin Controlled by PA18 +AT91C_PA18_SPCK0 EQU (AT91C_PIO_PA18) ;- SPI 0 Serial Clock +AT91C_PIO_PA19 EQU (1 << 19) ;- Pin Controlled by PA19 +AT91C_PA19_CANRX EQU (AT91C_PIO_PA19) ;- CAN Receive +AT91C_PIO_PA2 EQU (1 << 2) ;- Pin Controlled by PA2 +AT91C_PA2_SCK0 EQU (AT91C_PIO_PA2) ;- USART 0 Serial Clock +AT91C_PA2_NPCS11 EQU (AT91C_PIO_PA2) ;- SPI 1 Peripheral Chip Select 1 +AT91C_PIO_PA20 EQU (1 << 20) ;- Pin Controlled by PA20 +AT91C_PA20_CANTX EQU (AT91C_PIO_PA20) ;- CAN Transmit +AT91C_PIO_PA21 EQU (1 << 21) ;- Pin Controlled by PA21 +AT91C_PA21_TF EQU (AT91C_PIO_PA21) ;- SSC Transmit Frame Sync +AT91C_PA21_NPCS10 EQU (AT91C_PIO_PA21) ;- SPI 1 Peripheral Chip Select 0 +AT91C_PIO_PA22 EQU (1 << 22) ;- Pin Controlled by PA22 +AT91C_PA22_TK EQU (AT91C_PIO_PA22) ;- SSC Transmit Clock +AT91C_PA22_SPCK1 EQU (AT91C_PIO_PA22) ;- SPI 1 Serial Clock +AT91C_PIO_PA23 EQU (1 << 23) ;- Pin Controlled by PA23 +AT91C_PA23_TD EQU (AT91C_PIO_PA23) ;- SSC Transmit data +AT91C_PA23_MOSI1 EQU (AT91C_PIO_PA23) ;- SPI 1 Master Out Slave +AT91C_PIO_PA24 EQU (1 << 24) ;- Pin Controlled by PA24 +AT91C_PA24_RD EQU (AT91C_PIO_PA24) ;- SSC Receive Data +AT91C_PA24_MISO1 EQU (AT91C_PIO_PA24) ;- SPI 1 Master In Slave +AT91C_PIO_PA25 EQU (1 << 25) ;- Pin Controlled by PA25 +AT91C_PA25_RK EQU (AT91C_PIO_PA25) ;- SSC Receive Clock +AT91C_PA25_NPCS11 EQU (AT91C_PIO_PA25) ;- SPI 1 Peripheral Chip Select 1 +AT91C_PIO_PA26 EQU (1 << 26) ;- Pin Controlled by PA26 +AT91C_PA26_RF EQU (AT91C_PIO_PA26) ;- SSC Receive Frame Sync +AT91C_PA26_NPCS12 EQU (AT91C_PIO_PA26) ;- SPI 1 Peripheral Chip Select 2 +AT91C_PIO_PA27 EQU (1 << 27) ;- Pin Controlled by PA27 +AT91C_PA27_DRXD EQU (AT91C_PIO_PA27) ;- DBGU Debug Receive Data +AT91C_PA27_PCK3 EQU (AT91C_PIO_PA27) ;- PMC Programmable Clock Output 3 +AT91C_PIO_PA28 EQU (1 << 28) ;- Pin Controlled by PA28 +AT91C_PA28_DTXD EQU (AT91C_PIO_PA28) ;- DBGU Debug Transmit Data +AT91C_PIO_PA29 EQU (1 << 29) ;- Pin Controlled by PA29 +AT91C_PA29_FIQ EQU (AT91C_PIO_PA29) ;- AIC Fast Interrupt Input +AT91C_PA29_NPCS13 EQU (AT91C_PIO_PA29) ;- SPI 1 Peripheral Chip Select 3 +AT91C_PIO_PA3 EQU (1 << 3) ;- Pin Controlled by PA3 +AT91C_PA3_RTS0 EQU (AT91C_PIO_PA3) ;- USART 0 Ready To Send +AT91C_PA3_NPCS12 EQU (AT91C_PIO_PA3) ;- SPI 1 Peripheral Chip Select 2 +AT91C_PIO_PA30 EQU (1 << 30) ;- Pin Controlled by PA30 +AT91C_PA30_IRQ0 EQU (AT91C_PIO_PA30) ;- External Interrupt 0 +AT91C_PA30_PCK2 EQU (AT91C_PIO_PA30) ;- PMC Programmable Clock Output 2 +AT91C_PIO_PA4 EQU (1 << 4) ;- Pin Controlled by PA4 +AT91C_PA4_CTS0 EQU (AT91C_PIO_PA4) ;- USART 0 Clear To Send +AT91C_PA4_NPCS13 EQU (AT91C_PIO_PA4) ;- SPI 1 Peripheral Chip Select 3 +AT91C_PIO_PA5 EQU (1 << 5) ;- Pin Controlled by PA5 +AT91C_PA5_RXD1 EQU (AT91C_PIO_PA5) ;- USART 1 Receive Data +AT91C_PIO_PA6 EQU (1 << 6) ;- Pin Controlled by PA6 +AT91C_PA6_TXD1 EQU (AT91C_PIO_PA6) ;- USART 1 Transmit Data +AT91C_PIO_PA7 EQU (1 << 7) ;- Pin Controlled by PA7 +AT91C_PA7_SCK1 EQU (AT91C_PIO_PA7) ;- USART 1 Serial Clock +AT91C_PA7_NPCS01 EQU (AT91C_PIO_PA7) ;- SPI 0 Peripheral Chip Select 1 +AT91C_PIO_PA8 EQU (1 << 8) ;- Pin Controlled by PA8 +AT91C_PA8_RTS1 EQU (AT91C_PIO_PA8) ;- USART 1 Ready To Send +AT91C_PA8_NPCS02 EQU (AT91C_PIO_PA8) ;- SPI 0 Peripheral Chip Select 2 +AT91C_PIO_PA9 EQU (1 << 9) ;- Pin Controlled by PA9 +AT91C_PA9_CTS1 EQU (AT91C_PIO_PA9) ;- USART 1 Clear To Send +AT91C_PA9_NPCS03 EQU (AT91C_PIO_PA9) ;- SPI 0 Peripheral Chip Select 3 +AT91C_PIO_PB0 EQU (1 << 0) ;- Pin Controlled by PB0 +AT91C_PB0_ETXCK_EREFCK EQU (AT91C_PIO_PB0) ;- Ethernet MAC Transmit Clock/Reference Clock +AT91C_PB0_PCK0 EQU (AT91C_PIO_PB0) ;- PMC Programmable Clock Output 0 +AT91C_PIO_PB1 EQU (1 << 1) ;- Pin Controlled by PB1 +AT91C_PB1_ETXEN EQU (AT91C_PIO_PB1) ;- Ethernet MAC Transmit Enable +AT91C_PIO_PB10 EQU (1 << 10) ;- Pin Controlled by PB10 +AT91C_PB10_ETX2 EQU (AT91C_PIO_PB10) ;- Ethernet MAC Transmit Data 2 +AT91C_PB10_NPCS11 EQU (AT91C_PIO_PB10) ;- SPI 1 Peripheral Chip Select 1 +AT91C_PIO_PB11 EQU (1 << 11) ;- Pin Controlled by PB11 +AT91C_PB11_ETX3 EQU (AT91C_PIO_PB11) ;- Ethernet MAC Transmit Data 3 +AT91C_PB11_NPCS12 EQU (AT91C_PIO_PB11) ;- SPI 1 Peripheral Chip Select 2 +AT91C_PIO_PB12 EQU (1 << 12) ;- Pin Controlled by PB12 +AT91C_PB12_ETXER EQU (AT91C_PIO_PB12) ;- Ethernet MAC Transmikt Coding Error +AT91C_PB12_TCLK0 EQU (AT91C_PIO_PB12) ;- Timer Counter 0 external clock input +AT91C_PIO_PB13 EQU (1 << 13) ;- Pin Controlled by PB13 +AT91C_PB13_ERX2 EQU (AT91C_PIO_PB13) ;- Ethernet MAC Receive Data 2 +AT91C_PB13_NPCS01 EQU (AT91C_PIO_PB13) ;- SPI 0 Peripheral Chip Select 1 +AT91C_PIO_PB14 EQU (1 << 14) ;- Pin Controlled by PB14 +AT91C_PB14_ERX3 EQU (AT91C_PIO_PB14) ;- Ethernet MAC Receive Data 3 +AT91C_PB14_NPCS02 EQU (AT91C_PIO_PB14) ;- SPI 0 Peripheral Chip Select 2 +AT91C_PIO_PB15 EQU (1 << 15) ;- Pin Controlled by PB15 +AT91C_PB15_ERXDV EQU (AT91C_PIO_PB15) ;- Ethernet MAC Receive Data Valid +AT91C_PIO_PB16 EQU (1 << 16) ;- Pin Controlled by PB16 +AT91C_PB16_ECOL EQU (AT91C_PIO_PB16) ;- Ethernet MAC Collision Detected +AT91C_PB16_NPCS13 EQU (AT91C_PIO_PB16) ;- SPI 1 Peripheral Chip Select 3 +AT91C_PIO_PB17 EQU (1 << 17) ;- Pin Controlled by PB17 +AT91C_PB17_ERXCK EQU (AT91C_PIO_PB17) ;- Ethernet MAC Receive Clock +AT91C_PB17_NPCS03 EQU (AT91C_PIO_PB17) ;- SPI 0 Peripheral Chip Select 3 +AT91C_PIO_PB18 EQU (1 << 18) ;- Pin Controlled by PB18 +AT91C_PB18_EF100 EQU (AT91C_PIO_PB18) ;- Ethernet MAC Force 100 Mbits/sec +AT91C_PB18_ADTRG EQU (AT91C_PIO_PB18) ;- ADC External Trigger +AT91C_PIO_PB19 EQU (1 << 19) ;- Pin Controlled by PB19 +AT91C_PB19_PWM0 EQU (AT91C_PIO_PB19) ;- PWM Channel 0 +AT91C_PB19_TCLK1 EQU (AT91C_PIO_PB19) ;- Timer Counter 1 external clock input +AT91C_PIO_PB2 EQU (1 << 2) ;- Pin Controlled by PB2 +AT91C_PB2_ETX0 EQU (AT91C_PIO_PB2) ;- Ethernet MAC Transmit Data 0 +AT91C_PIO_PB20 EQU (1 << 20) ;- Pin Controlled by PB20 +AT91C_PB20_PWM1 EQU (AT91C_PIO_PB20) ;- PWM Channel 1 +AT91C_PB20_PCK0 EQU (AT91C_PIO_PB20) ;- PMC Programmable Clock Output 0 +AT91C_PIO_PB21 EQU (1 << 21) ;- Pin Controlled by PB21 +AT91C_PB21_PWM2 EQU (AT91C_PIO_PB21) ;- PWM Channel 2 +AT91C_PB21_PCK1 EQU (AT91C_PIO_PB21) ;- PMC Programmable Clock Output 1 +AT91C_PIO_PB22 EQU (1 << 22) ;- Pin Controlled by PB22 +AT91C_PB22_PWM3 EQU (AT91C_PIO_PB22) ;- PWM Channel 3 +AT91C_PB22_PCK2 EQU (AT91C_PIO_PB22) ;- PMC Programmable Clock Output 2 +AT91C_PIO_PB23 EQU (1 << 23) ;- Pin Controlled by PB23 +AT91C_PB23_TIOA0 EQU (AT91C_PIO_PB23) ;- Timer Counter 0 Multipurpose Timer I/O Pin A +AT91C_PB23_DCD1 EQU (AT91C_PIO_PB23) ;- USART 1 Data Carrier Detect +AT91C_PIO_PB24 EQU (1 << 24) ;- Pin Controlled by PB24 +AT91C_PB24_TIOB0 EQU (AT91C_PIO_PB24) ;- Timer Counter 0 Multipurpose Timer I/O Pin B +AT91C_PB24_DSR1 EQU (AT91C_PIO_PB24) ;- USART 1 Data Set ready +AT91C_PIO_PB25 EQU (1 << 25) ;- Pin Controlled by PB25 +AT91C_PB25_TIOA1 EQU (AT91C_PIO_PB25) ;- Timer Counter 1 Multipurpose Timer I/O Pin A +AT91C_PB25_DTR1 EQU (AT91C_PIO_PB25) ;- USART 1 Data Terminal ready +AT91C_PIO_PB26 EQU (1 << 26) ;- Pin Controlled by PB26 +AT91C_PB26_TIOB1 EQU (AT91C_PIO_PB26) ;- Timer Counter 1 Multipurpose Timer I/O Pin B +AT91C_PB26_RI1 EQU (AT91C_PIO_PB26) ;- USART 1 Ring Indicator +AT91C_PIO_PB27 EQU (1 << 27) ;- Pin Controlled by PB27 +AT91C_PB27_TIOA2 EQU (AT91C_PIO_PB27) ;- Timer Counter 2 Multipurpose Timer I/O Pin A +AT91C_PB27_PWM0 EQU (AT91C_PIO_PB27) ;- PWM Channel 0 +AT91C_PIO_PB28 EQU (1 << 28) ;- Pin Controlled by PB28 +AT91C_PB28_TIOB2 EQU (AT91C_PIO_PB28) ;- Timer Counter 2 Multipurpose Timer I/O Pin B +AT91C_PB28_PWM1 EQU (AT91C_PIO_PB28) ;- PWM Channel 1 +AT91C_PIO_PB29 EQU (1 << 29) ;- Pin Controlled by PB29 +AT91C_PB29_PCK1 EQU (AT91C_PIO_PB29) ;- PMC Programmable Clock Output 1 +AT91C_PB29_PWM2 EQU (AT91C_PIO_PB29) ;- PWM Channel 2 +AT91C_PIO_PB3 EQU (1 << 3) ;- Pin Controlled by PB3 +AT91C_PB3_ETX1 EQU (AT91C_PIO_PB3) ;- Ethernet MAC Transmit Data 1 +AT91C_PIO_PB30 EQU (1 << 30) ;- Pin Controlled by PB30 +AT91C_PB30_PCK2 EQU (AT91C_PIO_PB30) ;- PMC Programmable Clock Output 2 +AT91C_PB30_PWM3 EQU (AT91C_PIO_PB30) ;- PWM Channel 3 +AT91C_PIO_PB4 EQU (1 << 4) ;- Pin Controlled by PB4 +AT91C_PB4_ECRS_ECRSDV EQU (AT91C_PIO_PB4) ;- Ethernet MAC Carrier Sense/Carrier Sense and Data Valid +AT91C_PIO_PB5 EQU (1 << 5) ;- Pin Controlled by PB5 +AT91C_PB5_ERX0 EQU (AT91C_PIO_PB5) ;- Ethernet MAC Receive Data 0 +AT91C_PIO_PB6 EQU (1 << 6) ;- Pin Controlled by PB6 +AT91C_PB6_ERX1 EQU (AT91C_PIO_PB6) ;- Ethernet MAC Receive Data 1 +AT91C_PIO_PB7 EQU (1 << 7) ;- Pin Controlled by PB7 +AT91C_PB7_ERXER EQU (AT91C_PIO_PB7) ;- Ethernet MAC Receive Error +AT91C_PIO_PB8 EQU (1 << 8) ;- Pin Controlled by PB8 +AT91C_PB8_EMDC EQU (AT91C_PIO_PB8) ;- Ethernet MAC Management Data Clock +AT91C_PIO_PB9 EQU (1 << 9) ;- Pin Controlled by PB9 +AT91C_PB9_EMDIO EQU (AT91C_PIO_PB9) ;- Ethernet MAC Management Data Input/Output + +// - ***************************************************************************** +// - PERIPHERAL ID DEFINITIONS FOR AT91SAM7X256 +// - ***************************************************************************** +AT91C_ID_FIQ EQU ( 0) ;- Advanced Interrupt Controller (FIQ) +AT91C_ID_SYS EQU ( 1) ;- System Peripheral +AT91C_ID_PIOA EQU ( 2) ;- Parallel IO Controller A +AT91C_ID_PIOB EQU ( 3) ;- Parallel IO Controller B +AT91C_ID_SPI0 EQU ( 4) ;- Serial Peripheral Interface 0 +AT91C_ID_SPI1 EQU ( 5) ;- Serial Peripheral Interface 1 +AT91C_ID_US0 EQU ( 6) ;- USART 0 +AT91C_ID_US1 EQU ( 7) ;- USART 1 +AT91C_ID_SSC EQU ( 8) ;- Serial Synchronous Controller +AT91C_ID_TWI EQU ( 9) ;- Two-Wire Interface +AT91C_ID_PWMC EQU (10) ;- PWM Controller +AT91C_ID_UDP EQU (11) ;- USB Device Port +AT91C_ID_TC0 EQU (12) ;- Timer Counter 0 +AT91C_ID_TC1 EQU (13) ;- Timer Counter 1 +AT91C_ID_TC2 EQU (14) ;- Timer Counter 2 +AT91C_ID_CAN EQU (15) ;- Control Area Network Controller +AT91C_ID_EMAC EQU (16) ;- Ethernet MAC +AT91C_ID_ADC EQU (17) ;- Analog-to-Digital Converter +AT91C_ID_AES EQU (18) ;- Advanced Encryption Standard 128-bit +AT91C_ID_TDES EQU (19) ;- Triple Data Encryption Standard +AT91C_ID_20_Reserved EQU (20) ;- Reserved +AT91C_ID_21_Reserved EQU (21) ;- Reserved +AT91C_ID_22_Reserved EQU (22) ;- Reserved +AT91C_ID_23_Reserved EQU (23) ;- Reserved +AT91C_ID_24_Reserved EQU (24) ;- Reserved +AT91C_ID_25_Reserved EQU (25) ;- Reserved +AT91C_ID_26_Reserved EQU (26) ;- Reserved +AT91C_ID_27_Reserved EQU (27) ;- Reserved +AT91C_ID_28_Reserved EQU (28) ;- Reserved +AT91C_ID_29_Reserved EQU (29) ;- Reserved +AT91C_ID_IRQ0 EQU (30) ;- Advanced Interrupt Controller (IRQ0) +AT91C_ID_IRQ1 EQU (31) ;- Advanced Interrupt Controller (IRQ1) + +// - ***************************************************************************** +// - BASE ADDRESS DEFINITIONS FOR AT91SAM7X256 +// - ***************************************************************************** +AT91C_BASE_SYS EQU (0xFFFFF000) ;- (SYS) Base Address +AT91C_BASE_AIC EQU (0xFFFFF000) ;- (AIC) Base Address +AT91C_BASE_PDC_DBGU EQU (0xFFFFF300) ;- (PDC_DBGU) Base Address +AT91C_BASE_DBGU EQU (0xFFFFF200) ;- (DBGU) Base Address +AT91C_BASE_PIOA EQU (0xFFFFF400) ;- (PIOA) Base Address +AT91C_BASE_PIOB EQU (0xFFFFF600) ;- (PIOB) Base Address +AT91C_BASE_CKGR EQU (0xFFFFFC20) ;- (CKGR) Base Address +AT91C_BASE_PMC EQU (0xFFFFFC00) ;- (PMC) Base Address +AT91C_BASE_RSTC EQU (0xFFFFFD00) ;- (RSTC) Base Address +AT91C_BASE_RTTC EQU (0xFFFFFD20) ;- (RTTC) Base Address +AT91C_BASE_PITC EQU (0xFFFFFD30) ;- (PITC) Base Address +AT91C_BASE_WDTC EQU (0xFFFFFD40) ;- (WDTC) Base Address +AT91C_BASE_VREG EQU (0xFFFFFD60) ;- (VREG) Base Address +AT91C_BASE_MC EQU (0xFFFFFF00) ;- (MC) Base Address +AT91C_BASE_PDC_SPI1 EQU (0xFFFE4100) ;- (PDC_SPI1) Base Address +AT91C_BASE_SPI1 EQU (0xFFFE4000) ;- (SPI1) Base Address +AT91C_BASE_PDC_SPI0 EQU (0xFFFE0100) ;- (PDC_SPI0) Base Address +AT91C_BASE_SPI0 EQU (0xFFFE0000) ;- (SPI0) Base Address +AT91C_BASE_PDC_US1 EQU (0xFFFC4100) ;- (PDC_US1) Base Address +AT91C_BASE_US1 EQU (0xFFFC4000) ;- (US1) Base Address +AT91C_BASE_PDC_US0 EQU (0xFFFC0100) ;- (PDC_US0) Base Address +AT91C_BASE_US0 EQU (0xFFFC0000) ;- (US0) Base Address +AT91C_BASE_PDC_SSC EQU (0xFFFD4100) ;- (PDC_SSC) Base Address +AT91C_BASE_SSC EQU (0xFFFD4000) ;- (SSC) Base Address +AT91C_BASE_TWI EQU (0xFFFB8000) ;- (TWI) Base Address +AT91C_BASE_PWMC_CH3 EQU (0xFFFCC260) ;- (PWMC_CH3) Base Address +AT91C_BASE_PWMC_CH2 EQU (0xFFFCC240) ;- (PWMC_CH2) Base Address +AT91C_BASE_PWMC_CH1 EQU (0xFFFCC220) ;- (PWMC_CH1) Base Address +AT91C_BASE_PWMC_CH0 EQU (0xFFFCC200) ;- (PWMC_CH0) Base Address +AT91C_BASE_PWMC EQU (0xFFFCC000) ;- (PWMC) Base Address +AT91C_BASE_UDP EQU (0xFFFB0000) ;- (UDP) Base Address +AT91C_BASE_TC0 EQU (0xFFFA0000) ;- (TC0) Base Address +AT91C_BASE_TC1 EQU (0xFFFA0040) ;- (TC1) Base Address +AT91C_BASE_TC2 EQU (0xFFFA0080) ;- (TC2) Base Address +AT91C_BASE_TCB EQU (0xFFFA0000) ;- (TCB) Base Address +AT91C_BASE_CAN_MB0 EQU (0xFFFD0200) ;- (CAN_MB0) Base Address +AT91C_BASE_CAN_MB1 EQU (0xFFFD0220) ;- (CAN_MB1) Base Address +AT91C_BASE_CAN_MB2 EQU (0xFFFD0240) ;- (CAN_MB2) Base Address +AT91C_BASE_CAN_MB3 EQU (0xFFFD0260) ;- (CAN_MB3) Base Address +AT91C_BASE_CAN_MB4 EQU (0xFFFD0280) ;- (CAN_MB4) Base Address +AT91C_BASE_CAN_MB5 EQU (0xFFFD02A0) ;- (CAN_MB5) Base Address +AT91C_BASE_CAN_MB6 EQU (0xFFFD02C0) ;- (CAN_MB6) Base Address +AT91C_BASE_CAN_MB7 EQU (0xFFFD02E0) ;- (CAN_MB7) Base Address +AT91C_BASE_CAN EQU (0xFFFD0000) ;- (CAN) Base Address +AT91C_BASE_EMAC EQU (0xFFFDC000) ;- (EMAC) Base Address +AT91C_BASE_PDC_ADC EQU (0xFFFD8100) ;- (PDC_ADC) Base Address +AT91C_BASE_ADC EQU (0xFFFD8000) ;- (ADC) Base Address +AT91C_BASE_PDC_AES EQU (0xFFFA4100) ;- (PDC_AES) Base Address +AT91C_BASE_AES EQU (0xFFFA4000) ;- (AES) Base Address +AT91C_BASE_PDC_TDES EQU (0xFFFA8100) ;- (PDC_TDES) Base Address +AT91C_BASE_TDES EQU (0xFFFA8000) ;- (TDES) Base Address + +// - ***************************************************************************** +// - MEMORY MAPPING DEFINITIONS FOR AT91SAM7X256 +// - ***************************************************************************** +AT91C_ISRAM EQU (0x00200000) ;- Internal SRAM base address +AT91C_ISRAM_SIZE EQU (0x00010000) ;- Internal SRAM size in byte (64 Kbyte) +AT91C_IFLASH EQU (0x00100000) ;- Internal ROM base address +AT91C_IFLASH_SIZE EQU (0x00040000) ;- Internal ROM size in byte (256 Kbyte) + + + +#endif /* AT91SAM7X256_H */ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.c new file mode 100644 index 0000000..9cbd823 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.c @@ -0,0 +1,51 @@ +//* ---------------------------------------------------------------------------- +//* ATMEL Microcontroller Software Support - ROUSSET - +//* ---------------------------------------------------------------------------- +//* DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR +//* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +//* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE +//* DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT, +//* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +//* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +//* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +//* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +//* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +//* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//* ---------------------------------------------------------------------------- +//* File Name : lib_AT91SAM7X256.h +//* Object : AT91SAM7X256 inlined functions +//* Generated : AT91 SW Application Group 05/20/2005 (16:22:29) +//* +//* CVS Reference : /lib_dbgu.h/1.1/Fri Jan 31 12:18:40 2003// +//* CVS Reference : /lib_pmc_SAM7X.h/1.1/Tue Feb 1 08:32:10 2005// +//* CVS Reference : /lib_VREG_6085B.h/1.1/Tue Feb 1 16:20:47 2005// +//* CVS Reference : /lib_rstc_6098A.h/1.1/Wed Oct 6 10:39:20 2004// +//* CVS Reference : /lib_ssc.h/1.4/Fri Jan 31 12:19:20 2003// +//* CVS Reference : /lib_wdtc_6080A.h/1.1/Wed Oct 6 10:38:30 2004// +//* CVS Reference : /lib_usart.h/1.5/Thu Nov 21 16:01:54 2002// +//* CVS Reference : /lib_spi2.h/1.1/Mon Aug 25 14:23:52 2003// +//* CVS Reference : /lib_pitc_6079A.h/1.2/Tue Nov 9 14:43:56 2004// +//* CVS Reference : /lib_aic_6075b.h/1.1/Fri May 20 14:01:19 2005// +//* CVS Reference : /lib_aes_6149a.h/1.1/Mon Jan 17 07:43:09 2005// +//* CVS Reference : /lib_twi.h/1.3/Mon Jul 19 14:27:58 2004// +//* CVS Reference : /lib_adc.h/1.6/Fri Oct 17 09:12:38 2003// +//* CVS Reference : /lib_rttc_6081A.h/1.1/Wed Oct 6 10:39:38 2004// +//* CVS Reference : /lib_udp.h/1.4/Wed Feb 16 08:39:34 2005// +//* CVS Reference : /lib_des3_6150a.h/1.1/Mon Jan 17 09:19:19 2005// +//* CVS Reference : /lib_tc_1753b.h/1.1/Fri Jan 31 12:20:02 2003// +//* CVS Reference : /lib_MC_SAM7X.h/1.1/Thu Mar 25 15:19:14 2004// +//* CVS Reference : /lib_pio.h/1.3/Fri Jan 31 12:18:56 2003// +//* CVS Reference : /lib_can_AT91.h/1.4/Fri Oct 17 09:12:50 2003// +//* CVS Reference : /lib_PWM_SAM.h/1.3/Thu Jan 22 10:10:50 2004// +//* CVS Reference : /lib_pdc.h/1.2/Tue Jul 2 13:29:40 2002// +//* ---------------------------------------------------------------------------- + + +#include "AT91SAM7X256.h" + + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_ConfigureIt +//* \brief Interrupt Handler Initialization +//*---------------------------------------------------------------------------- + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.h new file mode 100644 index 0000000..e66b4e1 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.h @@ -0,0 +1,4558 @@ +//* ---------------------------------------------------------------------------- +//* ATMEL Microcontroller Software Support - ROUSSET - +//* ---------------------------------------------------------------------------- +//* DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR +//* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +//* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE +//* DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT, +//* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +//* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +//* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +//* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +//* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +//* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//* ---------------------------------------------------------------------------- +//* File Name : lib_AT91SAM7X256.h +//* Object : AT91SAM7X256 inlined functions +//* Generated : AT91 SW Application Group 05/20/2005 (16:22:29) +//* +//* CVS Reference : /lib_dbgu.h/1.1/Fri Jan 31 12:18:40 2003// +//* CVS Reference : /lib_pmc_SAM7X.h/1.1/Tue Feb 1 08:32:10 2005// +//* CVS Reference : /lib_VREG_6085B.h/1.1/Tue Feb 1 16:20:47 2005// +//* CVS Reference : /lib_rstc_6098A.h/1.1/Wed Oct 6 10:39:20 2004// +//* CVS Reference : /lib_ssc.h/1.4/Fri Jan 31 12:19:20 2003// +//* CVS Reference : /lib_wdtc_6080A.h/1.1/Wed Oct 6 10:38:30 2004// +//* CVS Reference : /lib_usart.h/1.5/Thu Nov 21 16:01:54 2002// +//* CVS Reference : /lib_spi2.h/1.1/Mon Aug 25 14:23:52 2003// +//* CVS Reference : /lib_pitc_6079A.h/1.2/Tue Nov 9 14:43:56 2004// +//* CVS Reference : /lib_aic_6075b.h/1.1/Fri May 20 14:01:19 2005// +//* CVS Reference : /lib_aes_6149a.h/1.1/Mon Jan 17 07:43:09 2005// +//* CVS Reference : /lib_twi.h/1.3/Mon Jul 19 14:27:58 2004// +//* CVS Reference : /lib_adc.h/1.6/Fri Oct 17 09:12:38 2003// +//* CVS Reference : /lib_rttc_6081A.h/1.1/Wed Oct 6 10:39:38 2004// +//* CVS Reference : /lib_udp.h/1.4/Wed Feb 16 08:39:34 2005// +//* CVS Reference : /lib_des3_6150a.h/1.1/Mon Jan 17 09:19:19 2005// +//* CVS Reference : /lib_tc_1753b.h/1.1/Fri Jan 31 12:20:02 2003// +//* CVS Reference : /lib_MC_SAM7X.h/1.1/Thu Mar 25 15:19:14 2004// +//* CVS Reference : /lib_pio.h/1.3/Fri Jan 31 12:18:56 2003// +//* CVS Reference : /lib_can_AT91.h/1.4/Fri Oct 17 09:12:50 2003// +//* CVS Reference : /lib_PWM_SAM.h/1.3/Thu Jan 22 10:10:50 2004// +//* CVS Reference : /lib_pdc.h/1.2/Tue Jul 2 13:29:40 2002// +//* ---------------------------------------------------------------------------- + +#ifndef lib_AT91SAM7X256_H +#define lib_AT91SAM7X256_H + +/* ***************************************************************************** + SOFTWARE API FOR AIC + ***************************************************************************** */ +#define AT91C_AIC_BRANCH_OPCODE ((void (*) ()) 0xE51FFF20) // ldr, pc, [pc, #-&F20] + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_ConfigureIt +//* \brief Interrupt Handler Initialization +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AIC_ConfigureIt ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id, // \arg interrupt number to initialize + unsigned int priority, // \arg priority to give to the interrupt + unsigned int src_type, // \arg activation and sense of activation + void (*newHandler) (void) ) // \arg address of the interrupt handler +{ + unsigned int oldHandler; + unsigned int mask ; + + oldHandler = pAic->AIC_SVR[irq_id]; + + mask = 0x1 << irq_id ; + //* Disable the interrupt on the interrupt controller + pAic->AIC_IDCR = mask ; + //* Save the interrupt handler routine pointer and the interrupt priority + pAic->AIC_SVR[irq_id] = (unsigned int) newHandler ; + //* Store the Source Mode Register + pAic->AIC_SMR[irq_id] = src_type | priority ; + //* Clear the interrupt on the interrupt controller + pAic->AIC_ICCR = mask ; + + return oldHandler; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_EnableIt +//* \brief Enable corresponding IT number +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_EnableIt ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id ) // \arg interrupt number to initialize +{ + //* Enable the interrupt on the interrupt controller + pAic->AIC_IECR = 0x1 << irq_id ; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_DisableIt +//* \brief Disable corresponding IT number +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_DisableIt ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id ) // \arg interrupt number to initialize +{ + unsigned int mask = 0x1 << irq_id; + //* Disable the interrupt on the interrupt controller + pAic->AIC_IDCR = mask ; + //* Clear the interrupt on the Interrupt Controller ( if one is pending ) + pAic->AIC_ICCR = mask ; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_ClearIt +//* \brief Clear corresponding IT number +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_ClearIt ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id) // \arg interrupt number to initialize +{ + //* Clear the interrupt on the Interrupt Controller ( if one is pending ) + pAic->AIC_ICCR = (0x1 << irq_id); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_AcknowledgeIt +//* \brief Acknowledge corresponding IT number +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_AcknowledgeIt ( + AT91PS_AIC pAic) // \arg pointer to the AIC registers +{ + pAic->AIC_EOICR = pAic->AIC_EOICR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_SetExceptionVector +//* \brief Configure vector handler +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AIC_SetExceptionVector ( + unsigned int *pVector, // \arg pointer to the AIC registers + void (*Handler) () ) // \arg Interrupt Handler +{ + unsigned int oldVector = *pVector; + + if ((unsigned int) Handler == (unsigned int) AT91C_AIC_BRANCH_OPCODE) + *pVector = (unsigned int) AT91C_AIC_BRANCH_OPCODE; + else + *pVector = (((((unsigned int) Handler) - ((unsigned int) pVector) - 0x8) >> 2) & 0x00FFFFFF) | 0xEA000000; + + return oldVector; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_Trig +//* \brief Trig an IT +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_Trig ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id) // \arg interrupt number +{ + pAic->AIC_ISCR = (0x1 << irq_id) ; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_IsActive +//* \brief Test if an IT is active +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AIC_IsActive ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id) // \arg Interrupt Number +{ + return (pAic->AIC_ISR & (0x1 << irq_id)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_IsPending +//* \brief Test if an IT is pending +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AIC_IsPending ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id) // \arg Interrupt Number +{ + return (pAic->AIC_IPR & (0x1 << irq_id)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_Open +//* \brief Set exception vectors and AIC registers to default values +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_Open( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + void (*IrqHandler) (), // \arg Default IRQ vector exception + void (*FiqHandler) (), // \arg Default FIQ vector exception + void (*DefaultHandler) (), // \arg Default Handler set in ISR + void (*SpuriousHandler) (), // \arg Default Spurious Handler + unsigned int protectMode) // \arg Debug Control Register +{ + int i; + + // Disable all interrupts and set IVR to the default handler + for (i = 0; i < 32; ++i) { + AT91F_AIC_DisableIt(pAic, i); + AT91F_AIC_ConfigureIt(pAic, i, AT91C_AIC_PRIOR_LOWEST, AT91C_AIC_SRCTYPE_HIGH_LEVEL, DefaultHandler); + } + + // Set the IRQ exception vector + AT91F_AIC_SetExceptionVector((unsigned int *) 0x18, IrqHandler); + // Set the Fast Interrupt exception vector + AT91F_AIC_SetExceptionVector((unsigned int *) 0x1C, FiqHandler); + + pAic->AIC_SPU = (unsigned int) SpuriousHandler; + pAic->AIC_DCR = protectMode; +} +/* ***************************************************************************** + SOFTWARE API FOR PDC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_SetNextRx +//* \brief Set the next receive transfer descriptor +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_SetNextRx ( + AT91PS_PDC pPDC, // \arg pointer to a PDC controller + char *address, // \arg address to the next bloc to be received + unsigned int bytes) // \arg number of bytes to be received +{ + pPDC->PDC_RNPR = (unsigned int) address; + pPDC->PDC_RNCR = bytes; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_SetNextTx +//* \brief Set the next transmit transfer descriptor +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_SetNextTx ( + AT91PS_PDC pPDC, // \arg pointer to a PDC controller + char *address, // \arg address to the next bloc to be transmitted + unsigned int bytes) // \arg number of bytes to be transmitted +{ + pPDC->PDC_TNPR = (unsigned int) address; + pPDC->PDC_TNCR = bytes; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_SetRx +//* \brief Set the receive transfer descriptor +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_SetRx ( + AT91PS_PDC pPDC, // \arg pointer to a PDC controller + char *address, // \arg address to the next bloc to be received + unsigned int bytes) // \arg number of bytes to be received +{ + pPDC->PDC_RPR = (unsigned int) address; + pPDC->PDC_RCR = bytes; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_SetTx +//* \brief Set the transmit transfer descriptor +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_SetTx ( + AT91PS_PDC pPDC, // \arg pointer to a PDC controller + char *address, // \arg address to the next bloc to be transmitted + unsigned int bytes) // \arg number of bytes to be transmitted +{ + pPDC->PDC_TPR = (unsigned int) address; + pPDC->PDC_TCR = bytes; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_EnableTx +//* \brief Enable transmit +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_EnableTx ( + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + pPDC->PDC_PTCR = AT91C_PDC_TXTEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_EnableRx +//* \brief Enable receive +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_EnableRx ( + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + pPDC->PDC_PTCR = AT91C_PDC_RXTEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_DisableTx +//* \brief Disable transmit +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_DisableTx ( + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + pPDC->PDC_PTCR = AT91C_PDC_TXTDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_DisableRx +//* \brief Disable receive +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_DisableRx ( + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + pPDC->PDC_PTCR = AT91C_PDC_RXTDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_IsTxEmpty +//* \brief Test if the current transfer descriptor has been sent +//*---------------------------------------------------------------------------- +__inline int AT91F_PDC_IsTxEmpty ( // \return return 1 if transfer is complete + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + return !(pPDC->PDC_TCR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_IsNextTxEmpty +//* \brief Test if the next transfer descriptor has been moved to the current td +//*---------------------------------------------------------------------------- +__inline int AT91F_PDC_IsNextTxEmpty ( // \return return 1 if transfer is complete + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + return !(pPDC->PDC_TNCR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_IsRxEmpty +//* \brief Test if the current transfer descriptor has been filled +//*---------------------------------------------------------------------------- +__inline int AT91F_PDC_IsRxEmpty ( // \return return 1 if transfer is complete + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + return !(pPDC->PDC_RCR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_IsNextRxEmpty +//* \brief Test if the next transfer descriptor has been moved to the current td +//*---------------------------------------------------------------------------- +__inline int AT91F_PDC_IsNextRxEmpty ( // \return return 1 if transfer is complete + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + return !(pPDC->PDC_RNCR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_Open +//* \brief Open PDC: disable TX and RX reset transfer descriptors, re-enable RX and TX +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_Open ( + AT91PS_PDC pPDC) // \arg pointer to a PDC controller +{ + //* Disable the RX and TX PDC transfer requests + AT91F_PDC_DisableRx(pPDC); + AT91F_PDC_DisableTx(pPDC); + + //* Reset all Counter register Next buffer first + AT91F_PDC_SetNextTx(pPDC, (char *) 0, 0); + AT91F_PDC_SetNextRx(pPDC, (char *) 0, 0); + AT91F_PDC_SetTx(pPDC, (char *) 0, 0); + AT91F_PDC_SetRx(pPDC, (char *) 0, 0); + + //* Enable the RX and TX PDC transfer requests + AT91F_PDC_EnableRx(pPDC); + AT91F_PDC_EnableTx(pPDC); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_Close +//* \brief Close PDC: disable TX and RX reset transfer descriptors +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_Close ( + AT91PS_PDC pPDC) // \arg pointer to a PDC controller +{ + //* Disable the RX and TX PDC transfer requests + AT91F_PDC_DisableRx(pPDC); + AT91F_PDC_DisableTx(pPDC); + + //* Reset all Counter register Next buffer first + AT91F_PDC_SetNextTx(pPDC, (char *) 0, 0); + AT91F_PDC_SetNextRx(pPDC, (char *) 0, 0); + AT91F_PDC_SetTx(pPDC, (char *) 0, 0); + AT91F_PDC_SetRx(pPDC, (char *) 0, 0); + +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_SendFrame +//* \brief Close PDC: disable TX and RX reset transfer descriptors +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PDC_SendFrame( + AT91PS_PDC pPDC, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + if (AT91F_PDC_IsTxEmpty(pPDC)) { + //* Buffer and next buffer can be initialized + AT91F_PDC_SetTx(pPDC, pBuffer, szBuffer); + AT91F_PDC_SetNextTx(pPDC, pNextBuffer, szNextBuffer); + return 2; + } + else if (AT91F_PDC_IsNextTxEmpty(pPDC)) { + //* Only one buffer can be initialized + AT91F_PDC_SetNextTx(pPDC, pBuffer, szBuffer); + return 1; + } + else { + //* All buffer are in use... + return 0; + } +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_ReceiveFrame +//* \brief Close PDC: disable TX and RX reset transfer descriptors +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PDC_ReceiveFrame ( + AT91PS_PDC pPDC, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + if (AT91F_PDC_IsRxEmpty(pPDC)) { + //* Buffer and next buffer can be initialized + AT91F_PDC_SetRx(pPDC, pBuffer, szBuffer); + AT91F_PDC_SetNextRx(pPDC, pNextBuffer, szNextBuffer); + return 2; + } + else if (AT91F_PDC_IsNextRxEmpty(pPDC)) { + //* Only one buffer can be initialized + AT91F_PDC_SetNextRx(pPDC, pBuffer, szBuffer); + return 1; + } + else { + //* All buffer are in use... + return 0; + } +} +/* ***************************************************************************** + SOFTWARE API FOR DBGU + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_DBGU_InterruptEnable +//* \brief Enable DBGU Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_DBGU_InterruptEnable( + AT91PS_DBGU pDbgu, // \arg pointer to a DBGU controller + unsigned int flag) // \arg dbgu interrupt to be enabled +{ + pDbgu->DBGU_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_DBGU_InterruptDisable +//* \brief Disable DBGU Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_DBGU_InterruptDisable( + AT91PS_DBGU pDbgu, // \arg pointer to a DBGU controller + unsigned int flag) // \arg dbgu interrupt to be disabled +{ + pDbgu->DBGU_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_DBGU_GetInterruptMaskStatus +//* \brief Return DBGU Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_DBGU_GetInterruptMaskStatus( // \return DBGU Interrupt Mask Status + AT91PS_DBGU pDbgu) // \arg pointer to a DBGU controller +{ + return pDbgu->DBGU_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_DBGU_IsInterruptMasked +//* \brief Test if DBGU Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_DBGU_IsInterruptMasked( + AT91PS_DBGU pDbgu, // \arg pointer to a DBGU controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_DBGU_GetInterruptMaskStatus(pDbgu) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR PIO + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgPeriph +//* \brief Enable pins to be drived by peripheral +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgPeriph( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int periphAEnable, // \arg PERIPH A to enable + unsigned int periphBEnable) // \arg PERIPH B to enable + +{ + pPio->PIO_ASR = periphAEnable; + pPio->PIO_BSR = periphBEnable; + pPio->PIO_PDR = (periphAEnable | periphBEnable); // Set in Periph mode +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgOutput +//* \brief Enable PIO in output mode +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgOutput( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int pioEnable) // \arg PIO to be enabled +{ + pPio->PIO_PER = pioEnable; // Set in PIO mode + pPio->PIO_OER = pioEnable; // Configure in Output +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgInput +//* \brief Enable PIO in input mode +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgInput( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int inputEnable) // \arg PIO to be enabled +{ + // Disable output + pPio->PIO_ODR = inputEnable; + pPio->PIO_PER = inputEnable; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgOpendrain +//* \brief Configure PIO in open drain +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgOpendrain( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int multiDrvEnable) // \arg pio to be configured in open drain +{ + // Configure the multi-drive option + pPio->PIO_MDDR = ~multiDrvEnable; + pPio->PIO_MDER = multiDrvEnable; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgPullup +//* \brief Enable pullup on PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgPullup( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int pullupEnable) // \arg enable pullup on PIO +{ + // Connect or not Pullup + pPio->PIO_PPUDR = ~pullupEnable; + pPio->PIO_PPUER = pullupEnable; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgDirectDrive +//* \brief Enable direct drive on PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgDirectDrive( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int directDrive) // \arg PIO to be configured with direct drive + +{ + // Configure the Direct Drive + pPio->PIO_OWDR = ~directDrive; + pPio->PIO_OWER = directDrive; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgInputFilter +//* \brief Enable input filter on input PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgInputFilter( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int inputFilter) // \arg PIO to be configured with input filter + +{ + // Configure the Direct Drive + pPio->PIO_IFDR = ~inputFilter; + pPio->PIO_IFER = inputFilter; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetInput +//* \brief Return PIO input value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetInput( // \return PIO input + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_PDSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsInputSet +//* \brief Test if PIO is input flag is active +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsInputSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetInput(pPio) & flag); +} + + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_SetOutput +//* \brief Set to 1 output PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_SetOutput( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg output to be set +{ + pPio->PIO_SODR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_ClearOutput +//* \brief Set to 0 output PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_ClearOutput( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg output to be cleared +{ + pPio->PIO_CODR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_ForceOutput +//* \brief Force output when Direct drive option is enabled +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_ForceOutput( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg output to be forced +{ + pPio->PIO_ODSR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_Enable +//* \brief Enable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_Enable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio to be enabled +{ + pPio->PIO_PER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_Disable +//* \brief Disable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_Disable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio to be disabled +{ + pPio->PIO_PDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetStatus +//* \brief Return PIO Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetStatus( // \return PIO Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_PSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsSet +//* \brief Test if PIO is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_OutputEnable +//* \brief Output Enable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_OutputEnable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio output to be enabled +{ + pPio->PIO_OER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_OutputDisable +//* \brief Output Enable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_OutputDisable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio output to be disabled +{ + pPio->PIO_ODR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetOutputStatus +//* \brief Return PIO Output Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetOutputStatus( // \return PIO Output Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_OSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsOuputSet +//* \brief Test if PIO Output is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsOutputSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetOutputStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_InputFilterEnable +//* \brief Input Filter Enable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_InputFilterEnable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio input filter to be enabled +{ + pPio->PIO_IFER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_InputFilterDisable +//* \brief Input Filter Disable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_InputFilterDisable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio input filter to be disabled +{ + pPio->PIO_IFDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetInputFilterStatus +//* \brief Return PIO Input Filter Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetInputFilterStatus( // \return PIO Input Filter Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_IFSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsInputFilterSet +//* \brief Test if PIO Input filter is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsInputFilterSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetInputFilterStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetOutputDataStatus +//* \brief Return PIO Output Data Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetOutputDataStatus( // \return PIO Output Data Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_ODSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_InterruptEnable +//* \brief Enable PIO Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_InterruptEnable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio interrupt to be enabled +{ + pPio->PIO_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_InterruptDisable +//* \brief Disable PIO Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_InterruptDisable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio interrupt to be disabled +{ + pPio->PIO_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetInterruptMaskStatus +//* \brief Return PIO Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetInterruptMaskStatus( // \return PIO Interrupt Mask Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetInterruptStatus +//* \brief Return PIO Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetInterruptStatus( // \return PIO Interrupt Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_ISR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsInterruptMasked +//* \brief Test if PIO Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsInterruptMasked( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetInterruptMaskStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsInterruptSet +//* \brief Test if PIO Interrupt is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsInterruptSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetInterruptStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_MultiDriverEnable +//* \brief Multi Driver Enable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_MultiDriverEnable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio to be enabled +{ + pPio->PIO_MDER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_MultiDriverDisable +//* \brief Multi Driver Disable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_MultiDriverDisable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio to be disabled +{ + pPio->PIO_MDDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetMultiDriverStatus +//* \brief Return PIO Multi Driver Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetMultiDriverStatus( // \return PIO Multi Driver Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_MDSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsMultiDriverSet +//* \brief Test if PIO MultiDriver is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsMultiDriverSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetMultiDriverStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_A_RegisterSelection +//* \brief PIO A Register Selection +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_A_RegisterSelection( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio A register selection +{ + pPio->PIO_ASR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_B_RegisterSelection +//* \brief PIO B Register Selection +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_B_RegisterSelection( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio B register selection +{ + pPio->PIO_BSR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_Get_AB_RegisterStatus +//* \brief Return PIO Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_Get_AB_RegisterStatus( // \return PIO AB Register Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_ABSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsAB_RegisterSet +//* \brief Test if PIO AB Register is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsAB_RegisterSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_Get_AB_RegisterStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_OutputWriteEnable +//* \brief Output Write Enable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_OutputWriteEnable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio output write to be enabled +{ + pPio->PIO_OWER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_OutputWriteDisable +//* \brief Output Write Disable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_OutputWriteDisable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio output write to be disabled +{ + pPio->PIO_OWDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetOutputWriteStatus +//* \brief Return PIO Output Write Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetOutputWriteStatus( // \return PIO Output Write Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_OWSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsOutputWriteSet +//* \brief Test if PIO OutputWrite is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsOutputWriteSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetOutputWriteStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetCfgPullup +//* \brief Return PIO Configuration Pullup +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetCfgPullup( // \return PIO Configuration Pullup + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_PPUSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsOutputDataStatusSet +//* \brief Test if PIO Output Data Status is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsOutputDataStatusSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetOutputDataStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsCfgPullupStatusSet +//* \brief Test if PIO Configuration Pullup Status is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsCfgPullupStatusSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (~AT91F_PIO_GetCfgPullup(pPio) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR PMC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_CfgSysClkEnableReg +//* \brief Configure the System Clock Enable Register of the PMC controller +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_CfgSysClkEnableReg ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int mode) +{ + //* Write to the SCER register + pPMC->PMC_SCER = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_CfgSysClkDisableReg +//* \brief Configure the System Clock Disable Register of the PMC controller +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_CfgSysClkDisableReg ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int mode) +{ + //* Write to the SCDR register + pPMC->PMC_SCDR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_GetSysClkStatusReg +//* \brief Return the System Clock Status Register of the PMC controller +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_GetSysClkStatusReg ( + AT91PS_PMC pPMC // pointer to a CAN controller + ) +{ + return pPMC->PMC_SCSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_EnablePeriphClock +//* \brief Enable peripheral clock +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_EnablePeriphClock ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int periphIds) // \arg IDs of peripherals to enable +{ + pPMC->PMC_PCER = periphIds; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_DisablePeriphClock +//* \brief Disable peripheral clock +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_DisablePeriphClock ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int periphIds) // \arg IDs of peripherals to enable +{ + pPMC->PMC_PCDR = periphIds; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_GetPeriphClock +//* \brief Get peripheral clock status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_GetPeriphClock ( + AT91PS_PMC pPMC) // \arg pointer to PMC controller +{ + return pPMC->PMC_PCSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_CfgMainOscillatorReg +//* \brief Cfg the main oscillator +//*---------------------------------------------------------------------------- +__inline void AT91F_CKGR_CfgMainOscillatorReg ( + AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller + unsigned int mode) +{ + pCKGR->CKGR_MOR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_GetMainOscillatorReg +//* \brief Cfg the main oscillator +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CKGR_GetMainOscillatorReg ( + AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller +{ + return pCKGR->CKGR_MOR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_EnableMainOscillator +//* \brief Enable the main oscillator +//*---------------------------------------------------------------------------- +__inline void AT91F_CKGR_EnableMainOscillator( + AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller +{ + pCKGR->CKGR_MOR |= AT91C_CKGR_MOSCEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_DisableMainOscillator +//* \brief Disable the main oscillator +//*---------------------------------------------------------------------------- +__inline void AT91F_CKGR_DisableMainOscillator ( + AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller +{ + pCKGR->CKGR_MOR &= ~AT91C_CKGR_MOSCEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_CfgMainOscStartUpTime +//* \brief Cfg MOR Register according to the main osc startup time +//*---------------------------------------------------------------------------- +__inline void AT91F_CKGR_CfgMainOscStartUpTime ( + AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller + unsigned int startup_time, // \arg main osc startup time in microsecond (us) + unsigned int slowClock) // \arg slowClock in Hz +{ + pCKGR->CKGR_MOR &= ~AT91C_CKGR_OSCOUNT; + pCKGR->CKGR_MOR |= ((slowClock * startup_time)/(8*1000000)) << 8; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_GetMainClockFreqReg +//* \brief Cfg the main oscillator +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CKGR_GetMainClockFreqReg ( + AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller +{ + return pCKGR->CKGR_MCFR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_GetMainClock +//* \brief Return Main clock in Hz +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CKGR_GetMainClock ( + AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller + unsigned int slowClock) // \arg slowClock in Hz +{ + return ((pCKGR->CKGR_MCFR & AT91C_CKGR_MAINF) * slowClock) >> 4; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_CfgMCKReg +//* \brief Cfg Master Clock Register +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_CfgMCKReg ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int mode) +{ + pPMC->PMC_MCKR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_GetMCKReg +//* \brief Return Master Clock Register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_GetMCKReg( + AT91PS_PMC pPMC) // \arg pointer to PMC controller +{ + return pPMC->PMC_MCKR; +} + +//*------------------------------------------------------------------------------ +//* \fn AT91F_PMC_GetMasterClock +//* \brief Return master clock in Hz which correponds to processor clock for ARM7 +//*------------------------------------------------------------------------------ +__inline unsigned int AT91F_PMC_GetMasterClock ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller + unsigned int slowClock) // \arg slowClock in Hz +{ + unsigned int reg = pPMC->PMC_MCKR; + unsigned int prescaler = (1 << ((reg & AT91C_PMC_PRES) >> 2)); + unsigned int pllDivider, pllMultiplier; + + switch (reg & AT91C_PMC_CSS) { + case AT91C_PMC_CSS_SLOW_CLK: // Slow clock selected + return slowClock / prescaler; + case AT91C_PMC_CSS_MAIN_CLK: // Main clock is selected + return AT91F_CKGR_GetMainClock(pCKGR, slowClock) / prescaler; + case AT91C_PMC_CSS_PLL_CLK: // PLLB clock is selected + reg = pCKGR->CKGR_PLLR; + pllDivider = (reg & AT91C_CKGR_DIV); + pllMultiplier = ((reg & AT91C_CKGR_MUL) >> 16) + 1; + return AT91F_CKGR_GetMainClock(pCKGR, slowClock) / pllDivider * pllMultiplier / prescaler; + } + return 0; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_EnablePCK +//* \brief Enable peripheral clock +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_EnablePCK ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int pck, // \arg Peripheral clock identifier 0 .. 7 + unsigned int mode) +{ + pPMC->PMC_PCKR[pck] = mode; + pPMC->PMC_SCER = (1 << pck) << 8; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_DisablePCK +//* \brief Enable peripheral clock +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_DisablePCK ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int pck) // \arg Peripheral clock identifier 0 .. 7 +{ + pPMC->PMC_SCDR = (1 << pck) << 8; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_EnableIt +//* \brief Enable PMC interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_EnableIt ( + AT91PS_PMC pPMC, // pointer to a PMC controller + unsigned int flag) // IT to be enabled +{ + //* Write to the IER register + pPMC->PMC_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_DisableIt +//* \brief Disable PMC interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_DisableIt ( + AT91PS_PMC pPMC, // pointer to a PMC controller + unsigned int flag) // IT to be disabled +{ + //* Write to the IDR register + pPMC->PMC_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_GetStatus +//* \brief Return PMC Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_GetStatus( // \return PMC Interrupt Status + AT91PS_PMC pPMC) // pointer to a PMC controller +{ + return pPMC->PMC_SR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_GetInterruptMaskStatus +//* \brief Return PMC Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_GetInterruptMaskStatus( // \return PMC Interrupt Mask Status + AT91PS_PMC pPMC) // pointer to a PMC controller +{ + return pPMC->PMC_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_IsInterruptMasked +//* \brief Test if PMC Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_IsInterruptMasked( + AT91PS_PMC pPMC, // \arg pointer to a PMC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PMC_GetInterruptMaskStatus(pPMC) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_IsStatusSet +//* \brief Test if PMC Status is Set +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_IsStatusSet( + AT91PS_PMC pPMC, // \arg pointer to a PMC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PMC_GetStatus(pPMC) & flag); +}/* ***************************************************************************** + SOFTWARE API FOR RSTC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_RSTSoftReset +//* \brief Start Software Reset +//*---------------------------------------------------------------------------- +__inline void AT91F_RSTSoftReset( + AT91PS_RSTC pRSTC, + unsigned int reset) +{ + pRSTC->RSTC_RCR = (0xA5000000 | reset); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_RSTSetMode +//* \brief Set Reset Mode +//*---------------------------------------------------------------------------- +__inline void AT91F_RSTSetMode( + AT91PS_RSTC pRSTC, + unsigned int mode) +{ + pRSTC->RSTC_RMR = (0xA5000000 | mode); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_RSTGetMode +//* \brief Get Reset Mode +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_RSTGetMode( + AT91PS_RSTC pRSTC) +{ + return (pRSTC->RSTC_RMR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_RSTGetStatus +//* \brief Get Reset Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_RSTGetStatus( + AT91PS_RSTC pRSTC) +{ + return (pRSTC->RSTC_RSR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_RSTIsSoftRstActive +//* \brief Return !=0 if software reset is still not completed +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_RSTIsSoftRstActive( + AT91PS_RSTC pRSTC) +{ + return ((pRSTC->RSTC_RSR) & AT91C_RSTC_SRCMP); +} +/* ***************************************************************************** + SOFTWARE API FOR RTTC + ***************************************************************************** */ +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_SetRTT_TimeBase() +//* \brief Set the RTT prescaler according to the TimeBase in ms +//*-------------------------------------------------------------------------------------- +__inline unsigned int AT91F_RTTSetTimeBase( + AT91PS_RTTC pRTTC, + unsigned int ms) +{ + if (ms > 2000) + return 1; // AT91C_TIME_OUT_OF_RANGE + pRTTC->RTTC_RTMR &= ~0xFFFF; + pRTTC->RTTC_RTMR |= (((ms << 15) /1000) & 0xFFFF); + return 0; +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTTSetPrescaler() +//* \brief Set the new prescaler value +//*-------------------------------------------------------------------------------------- +__inline unsigned int AT91F_RTTSetPrescaler( + AT91PS_RTTC pRTTC, + unsigned int rtpres) +{ + pRTTC->RTTC_RTMR &= ~0xFFFF; + pRTTC->RTTC_RTMR |= (rtpres & 0xFFFF); + return (pRTTC->RTTC_RTMR); +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTTRestart() +//* \brief Restart the RTT prescaler +//*-------------------------------------------------------------------------------------- +__inline void AT91F_RTTRestart( + AT91PS_RTTC pRTTC) +{ + pRTTC->RTTC_RTMR |= AT91C_RTTC_RTTRST; +} + + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTT_SetAlarmINT() +//* \brief Enable RTT Alarm Interrupt +//*-------------------------------------------------------------------------------------- +__inline void AT91F_RTTSetAlarmINT( + AT91PS_RTTC pRTTC) +{ + pRTTC->RTTC_RTMR |= AT91C_RTTC_ALMIEN; +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTT_ClearAlarmINT() +//* \brief Disable RTT Alarm Interrupt +//*-------------------------------------------------------------------------------------- +__inline void AT91F_RTTClearAlarmINT( + AT91PS_RTTC pRTTC) +{ + pRTTC->RTTC_RTMR &= ~AT91C_RTTC_ALMIEN; +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTT_SetRttIncINT() +//* \brief Enable RTT INC Interrupt +//*-------------------------------------------------------------------------------------- +__inline void AT91F_RTTSetRttIncINT( + AT91PS_RTTC pRTTC) +{ + pRTTC->RTTC_RTMR |= AT91C_RTTC_RTTINCIEN; +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTT_ClearRttIncINT() +//* \brief Disable RTT INC Interrupt +//*-------------------------------------------------------------------------------------- +__inline void AT91F_RTTClearRttIncINT( + AT91PS_RTTC pRTTC) +{ + pRTTC->RTTC_RTMR &= ~AT91C_RTTC_RTTINCIEN; +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTT_SetAlarmValue() +//* \brief Set RTT Alarm Value +//*-------------------------------------------------------------------------------------- +__inline void AT91F_RTTSetAlarmValue( + AT91PS_RTTC pRTTC, unsigned int alarm) +{ + pRTTC->RTTC_RTAR = alarm; +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTT_GetAlarmValue() +//* \brief Get RTT Alarm Value +//*-------------------------------------------------------------------------------------- +__inline unsigned int AT91F_RTTGetAlarmValue( + AT91PS_RTTC pRTTC) +{ + return(pRTTC->RTTC_RTAR); +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTTGetStatus() +//* \brief Read the RTT status +//*-------------------------------------------------------------------------------------- +__inline unsigned int AT91F_RTTGetStatus( + AT91PS_RTTC pRTTC) +{ + return(pRTTC->RTTC_RTSR); +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTT_ReadValue() +//* \brief Read the RTT value +//*-------------------------------------------------------------------------------------- +__inline unsigned int AT91F_RTTReadValue( + AT91PS_RTTC pRTTC) +{ + register volatile unsigned int val1,val2; + do + { + val1 = pRTTC->RTTC_RTVR; + val2 = pRTTC->RTTC_RTVR; + } + while(val1 != val2); + return(val1); +} +/* ***************************************************************************** + SOFTWARE API FOR PITC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITInit +//* \brief System timer init : period in µsecond, system clock freq in MHz +//*---------------------------------------------------------------------------- +__inline void AT91F_PITInit( + AT91PS_PITC pPITC, + unsigned int period, + unsigned int pit_frequency) +{ + pPITC->PITC_PIMR = period? (period * pit_frequency + 8) >> 4 : 0; // +8 to avoid %10 and /10 + pPITC->PITC_PIMR |= AT91C_PITC_PITEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITSetPIV +//* \brief Set the PIT Periodic Interval Value +//*---------------------------------------------------------------------------- +__inline void AT91F_PITSetPIV( + AT91PS_PITC pPITC, + unsigned int piv) +{ + pPITC->PITC_PIMR = piv | (pPITC->PITC_PIMR & (AT91C_PITC_PITEN | AT91C_PITC_PITIEN)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITEnableInt +//* \brief Enable PIT periodic interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PITEnableInt( + AT91PS_PITC pPITC) +{ + pPITC->PITC_PIMR |= AT91C_PITC_PITIEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITDisableInt +//* \brief Disable PIT periodic interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PITDisableInt( + AT91PS_PITC pPITC) +{ + pPITC->PITC_PIMR &= ~AT91C_PITC_PITIEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITGetMode +//* \brief Read PIT mode register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PITGetMode( + AT91PS_PITC pPITC) +{ + return(pPITC->PITC_PIMR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITGetStatus +//* \brief Read PIT status register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PITGetStatus( + AT91PS_PITC pPITC) +{ + return(pPITC->PITC_PISR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITGetPIIR +//* \brief Read PIT CPIV and PICNT without ressetting the counters +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PITGetPIIR( + AT91PS_PITC pPITC) +{ + return(pPITC->PITC_PIIR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITGetPIVR +//* \brief Read System timer CPIV and PICNT without ressetting the counters +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PITGetPIVR( + AT91PS_PITC pPITC) +{ + return(pPITC->PITC_PIVR); +} +/* ***************************************************************************** + SOFTWARE API FOR WDTC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_WDTSetMode +//* \brief Set Watchdog Mode Register +//*---------------------------------------------------------------------------- +__inline void AT91F_WDTSetMode( + AT91PS_WDTC pWDTC, + unsigned int Mode) +{ + pWDTC->WDTC_WDMR = Mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_WDTRestart +//* \brief Restart Watchdog +//*---------------------------------------------------------------------------- +__inline void AT91F_WDTRestart( + AT91PS_WDTC pWDTC) +{ + pWDTC->WDTC_WDCR = 0xA5000001; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_WDTSGettatus +//* \brief Get Watchdog Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_WDTSGettatus( + AT91PS_WDTC pWDTC) +{ + return(pWDTC->WDTC_WDSR & 0x3); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_WDTGetPeriod +//* \brief Translate ms into Watchdog Compatible value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_WDTGetPeriod(unsigned int ms) +{ + if ((ms < 4) || (ms > 16000)) + return 0; + return((ms << 8) / 1000); +} +/* ***************************************************************************** + SOFTWARE API FOR VREG + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_VREG_Enable_LowPowerMode +//* \brief Enable VREG Low Power Mode +//*---------------------------------------------------------------------------- +__inline void AT91F_VREG_Enable_LowPowerMode( + AT91PS_VREG pVREG) +{ + pVREG->VREG_MR |= AT91C_VREG_PSTDBY; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_VREG_Disable_LowPowerMode +//* \brief Disable VREG Low Power Mode +//*---------------------------------------------------------------------------- +__inline void AT91F_VREG_Disable_LowPowerMode( + AT91PS_VREG pVREG) +{ + pVREG->VREG_MR &= ~AT91C_VREG_PSTDBY; +}/* ***************************************************************************** + SOFTWARE API FOR MC + ***************************************************************************** */ + +#define AT91C_MC_CORRECT_KEY ((unsigned int) 0x5A << 24) // (MC) Correct Protect Key + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_Remap +//* \brief Make Remap +//*---------------------------------------------------------------------------- +__inline void AT91F_MC_Remap (void) // +{ + AT91PS_MC pMC = (AT91PS_MC) AT91C_BASE_MC; + + pMC->MC_RCR = AT91C_MC_RCB; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_CfgModeReg +//* \brief Configure the EFC Mode Register of the MC controller +//*---------------------------------------------------------------------------- +__inline void AT91F_MC_EFC_CfgModeReg ( + AT91PS_MC pMC, // pointer to a MC controller + unsigned int mode) // mode register +{ + // Write to the FMR register + pMC->MC_FMR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_GetModeReg +//* \brief Return MC EFC Mode Regsiter +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_MC_EFC_GetModeReg( + AT91PS_MC pMC) // pointer to a MC controller +{ + return pMC->MC_FMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_ComputeFMCN +//* \brief Return MC EFC Mode Regsiter +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_MC_EFC_ComputeFMCN( + int master_clock) // master clock in Hz +{ + return (master_clock/1000000 +2); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_PerformCmd +//* \brief Perform EFC Command +//*---------------------------------------------------------------------------- +__inline void AT91F_MC_EFC_PerformCmd ( + AT91PS_MC pMC, // pointer to a MC controller + unsigned int transfer_cmd) +{ + pMC->MC_FCR = transfer_cmd; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_GetStatus +//* \brief Return MC EFC Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_MC_EFC_GetStatus( + AT91PS_MC pMC) // pointer to a MC controller +{ + return pMC->MC_FSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_IsInterruptMasked +//* \brief Test if EFC MC Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_MC_EFC_IsInterruptMasked( + AT91PS_MC pMC, // \arg pointer to a MC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_MC_EFC_GetModeReg(pMC) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_IsInterruptSet +//* \brief Test if EFC MC Interrupt is Set +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_MC_EFC_IsInterruptSet( + AT91PS_MC pMC, // \arg pointer to a MC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_MC_EFC_GetStatus(pMC) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR SPI + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_Open +//* \brief Open a SPI Port +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SPI_Open ( + const unsigned int null) // \arg +{ + /* NOT DEFINED AT THIS MOMENT */ + return ( 0 ); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_CfgCs +//* \brief Configure SPI chip select register +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_CfgCs ( + AT91PS_SPI pSPI, // pointer to a SPI controller + int cs, // SPI cs number (0 to 3) + int val) // chip select register +{ + //* Write to the CSR register + *(pSPI->SPI_CSR + cs) = val; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_EnableIt +//* \brief Enable SPI interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_EnableIt ( + AT91PS_SPI pSPI, // pointer to a SPI controller + unsigned int flag) // IT to be enabled +{ + //* Write to the IER register + pSPI->SPI_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_DisableIt +//* \brief Disable SPI interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_DisableIt ( + AT91PS_SPI pSPI, // pointer to a SPI controller + unsigned int flag) // IT to be disabled +{ + //* Write to the IDR register + pSPI->SPI_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_Reset +//* \brief Reset the SPI controller +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_Reset ( + AT91PS_SPI pSPI // pointer to a SPI controller + ) +{ + //* Write to the CR register + pSPI->SPI_CR = AT91C_SPI_SWRST; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_Enable +//* \brief Enable the SPI controller +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_Enable ( + AT91PS_SPI pSPI // pointer to a SPI controller + ) +{ + //* Write to the CR register + pSPI->SPI_CR = AT91C_SPI_SPIEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_Disable +//* \brief Disable the SPI controller +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_Disable ( + AT91PS_SPI pSPI // pointer to a SPI controller + ) +{ + //* Write to the CR register + pSPI->SPI_CR = AT91C_SPI_SPIDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_CfgMode +//* \brief Enable the SPI controller +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_CfgMode ( + AT91PS_SPI pSPI, // pointer to a SPI controller + int mode) // mode register +{ + //* Write to the MR register + pSPI->SPI_MR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_CfgPCS +//* \brief Switch to the correct PCS of SPI Mode Register : Fixed Peripheral Selected +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_CfgPCS ( + AT91PS_SPI pSPI, // pointer to a SPI controller + char PCS_Device) // PCS of the Device +{ + //* Write to the MR register + pSPI->SPI_MR &= 0xFFF0FFFF; + pSPI->SPI_MR |= ( (PCS_Device<<16) & AT91C_SPI_PCS ); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_ReceiveFrame +//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is busy +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SPI_ReceiveFrame ( + AT91PS_SPI pSPI, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + return AT91F_PDC_ReceiveFrame( + (AT91PS_PDC) &(pSPI->SPI_RPR), + pBuffer, + szBuffer, + pNextBuffer, + szNextBuffer); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_SendFrame +//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is bSPIy +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SPI_SendFrame( + AT91PS_SPI pSPI, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + return AT91F_PDC_SendFrame( + (AT91PS_PDC) &(pSPI->SPI_RPR), + pBuffer, + szBuffer, + pNextBuffer, + szNextBuffer); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_Close +//* \brief Close SPI: disable IT disable transfert, close PDC +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_Close ( + AT91PS_SPI pSPI) // \arg pointer to a SPI controller +{ + //* Reset all the Chip Select register + pSPI->SPI_CSR[0] = 0 ; + pSPI->SPI_CSR[1] = 0 ; + pSPI->SPI_CSR[2] = 0 ; + pSPI->SPI_CSR[3] = 0 ; + + //* Reset the SPI mode + pSPI->SPI_MR = 0 ; + + //* Disable all interrupts + pSPI->SPI_IDR = 0xFFFFFFFF ; + + //* Abort the Peripheral Data Transfers + AT91F_PDC_Close((AT91PS_PDC) &(pSPI->SPI_RPR)); + + //* Disable receiver and transmitter and stop any activity immediately + pSPI->SPI_CR = AT91C_SPI_SPIDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_PutChar +//* \brief Send a character,does not check if ready to send +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_PutChar ( + AT91PS_SPI pSPI, + unsigned int character, + unsigned int cs_number ) +{ + unsigned int value_for_cs; + value_for_cs = (~(1 << cs_number)) & 0xF; //Place a zero among a 4 ONEs number + pSPI->SPI_TDR = (character & 0xFFFF) | (value_for_cs << 16); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_GetChar +//* \brief Receive a character,does not check if a character is available +//*---------------------------------------------------------------------------- +__inline int AT91F_SPI_GetChar ( + const AT91PS_SPI pSPI) +{ + return((pSPI->SPI_RDR) & 0xFFFF); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_GetInterruptMaskStatus +//* \brief Return SPI Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SPI_GetInterruptMaskStatus( // \return SPI Interrupt Mask Status + AT91PS_SPI pSpi) // \arg pointer to a SPI controller +{ + return pSpi->SPI_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_IsInterruptMasked +//* \brief Test if SPI Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_SPI_IsInterruptMasked( + AT91PS_SPI pSpi, // \arg pointer to a SPI controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_SPI_GetInterruptMaskStatus(pSpi) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR USART + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_Baudrate +//* \brief Calculate the baudrate +//* Standard Asynchronous Mode : 8 bits , 1 stop , no parity +#define AT91C_US_ASYNC_MODE ( AT91C_US_USMODE_NORMAL + \ + AT91C_US_NBSTOP_1_BIT + \ + AT91C_US_PAR_NONE + \ + AT91C_US_CHRL_8_BITS + \ + AT91C_US_CLKS_CLOCK ) + +//* Standard External Asynchronous Mode : 8 bits , 1 stop , no parity +#define AT91C_US_ASYNC_SCK_MODE ( AT91C_US_USMODE_NORMAL + \ + AT91C_US_NBSTOP_1_BIT + \ + AT91C_US_PAR_NONE + \ + AT91C_US_CHRL_8_BITS + \ + AT91C_US_CLKS_EXT ) + +//* Standard Synchronous Mode : 8 bits , 1 stop , no parity +#define AT91C_US_SYNC_MODE ( AT91C_US_SYNC + \ + AT91C_US_USMODE_NORMAL + \ + AT91C_US_NBSTOP_1_BIT + \ + AT91C_US_PAR_NONE + \ + AT91C_US_CHRL_8_BITS + \ + AT91C_US_CLKS_CLOCK ) + +//* SCK used Label +#define AT91C_US_SCK_USED (AT91C_US_CKLO | AT91C_US_CLKS_EXT) + +//* Standard ISO T=0 Mode : 8 bits , 1 stop , parity +#define AT91C_US_ISO_READER_MODE ( AT91C_US_USMODE_ISO7816_0 + \ + AT91C_US_CLKS_CLOCK +\ + AT91C_US_NBSTOP_1_BIT + \ + AT91C_US_PAR_EVEN + \ + AT91C_US_CHRL_8_BITS + \ + AT91C_US_CKLO +\ + AT91C_US_OVER) + +//* Standard IRDA mode +#define AT91C_US_ASYNC_IRDA_MODE ( AT91C_US_USMODE_IRDA + \ + AT91C_US_NBSTOP_1_BIT + \ + AT91C_US_PAR_NONE + \ + AT91C_US_CHRL_8_BITS + \ + AT91C_US_CLKS_CLOCK ) + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_Baudrate +//* \brief Caluculate baud_value according to the main clock and the baud rate +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_US_Baudrate ( + const unsigned int main_clock, // \arg peripheral clock + const unsigned int baud_rate) // \arg UART baudrate +{ + unsigned int baud_value = ((main_clock*10)/(baud_rate * 16)); + if ((baud_value % 10) >= 5) + baud_value = (baud_value / 10) + 1; + else + baud_value /= 10; + return baud_value; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_SetBaudrate +//* \brief Set the baudrate according to the CPU clock +//*---------------------------------------------------------------------------- +__inline void AT91F_US_SetBaudrate ( + AT91PS_USART pUSART, // \arg pointer to a USART controller + unsigned int mainClock, // \arg peripheral clock + unsigned int speed) // \arg UART baudrate +{ + //* Define the baud rate divisor register + pUSART->US_BRGR = AT91F_US_Baudrate(mainClock, speed); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_SetTimeguard +//* \brief Set USART timeguard +//*---------------------------------------------------------------------------- +__inline void AT91F_US_SetTimeguard ( + AT91PS_USART pUSART, // \arg pointer to a USART controller + unsigned int timeguard) // \arg timeguard value +{ + //* Write the Timeguard Register + pUSART->US_TTGR = timeguard ; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_EnableIt +//* \brief Enable USART IT +//*---------------------------------------------------------------------------- +__inline void AT91F_US_EnableIt ( + AT91PS_USART pUSART, // \arg pointer to a USART controller + unsigned int flag) // \arg IT to be enabled +{ + //* Write to the IER register + pUSART->US_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_DisableIt +//* \brief Disable USART IT +//*---------------------------------------------------------------------------- +__inline void AT91F_US_DisableIt ( + AT91PS_USART pUSART, // \arg pointer to a USART controller + unsigned int flag) // \arg IT to be disabled +{ + //* Write to the IER register + pUSART->US_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_Configure +//* \brief Configure USART +//*---------------------------------------------------------------------------- +__inline void AT91F_US_Configure ( + AT91PS_USART pUSART, // \arg pointer to a USART controller + unsigned int mainClock, // \arg peripheral clock + unsigned int mode , // \arg mode Register to be programmed + unsigned int baudRate , // \arg baudrate to be programmed + unsigned int timeguard ) // \arg timeguard to be programmed +{ + //* Disable interrupts + pUSART->US_IDR = (unsigned int) -1; + + //* Reset receiver and transmitter + pUSART->US_CR = AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RXDIS | AT91C_US_TXDIS ; + + //* Define the baud rate divisor register + AT91F_US_SetBaudrate(pUSART, mainClock, baudRate); + + //* Write the Timeguard Register + AT91F_US_SetTimeguard(pUSART, timeguard); + + //* Clear Transmit and Receive Counters + AT91F_PDC_Open((AT91PS_PDC) &(pUSART->US_RPR)); + + //* Define the USART mode + pUSART->US_MR = mode ; + +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_EnableRx +//* \brief Enable receiving characters +//*---------------------------------------------------------------------------- +__inline void AT91F_US_EnableRx ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Enable receiver + pUSART->US_CR = AT91C_US_RXEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_EnableTx +//* \brief Enable sending characters +//*---------------------------------------------------------------------------- +__inline void AT91F_US_EnableTx ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Enable transmitter + pUSART->US_CR = AT91C_US_TXEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_ResetRx +//* \brief Reset Receiver and re-enable it +//*---------------------------------------------------------------------------- +__inline void AT91F_US_ResetRx ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Reset receiver + pUSART->US_CR = AT91C_US_RSTRX; + //* Re-Enable receiver + pUSART->US_CR = AT91C_US_RXEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_ResetTx +//* \brief Reset Transmitter and re-enable it +//*---------------------------------------------------------------------------- +__inline void AT91F_US_ResetTx ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Reset transmitter + pUSART->US_CR = AT91C_US_RSTTX; + //* Enable transmitter + pUSART->US_CR = AT91C_US_TXEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_DisableRx +//* \brief Disable Receiver +//*---------------------------------------------------------------------------- +__inline void AT91F_US_DisableRx ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Disable receiver + pUSART->US_CR = AT91C_US_RXDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_DisableTx +//* \brief Disable Transmitter +//*---------------------------------------------------------------------------- +__inline void AT91F_US_DisableTx ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Disable transmitter + pUSART->US_CR = AT91C_US_TXDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_Close +//* \brief Close USART: disable IT disable receiver and transmitter, close PDC +//*---------------------------------------------------------------------------- +__inline void AT91F_US_Close ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Reset the baud rate divisor register + pUSART->US_BRGR = 0 ; + + //* Reset the USART mode + pUSART->US_MR = 0 ; + + //* Reset the Timeguard Register + pUSART->US_TTGR = 0; + + //* Disable all interrupts + pUSART->US_IDR = 0xFFFFFFFF ; + + //* Abort the Peripheral Data Transfers + AT91F_PDC_Close((AT91PS_PDC) &(pUSART->US_RPR)); + + //* Disable receiver and transmitter and stop any activity immediately + pUSART->US_CR = AT91C_US_TXDIS | AT91C_US_RXDIS | AT91C_US_RSTTX | AT91C_US_RSTRX ; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_TxReady +//* \brief Return 1 if a character can be written in US_THR +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_US_TxReady ( + AT91PS_USART pUSART ) // \arg pointer to a USART controller +{ + return (pUSART->US_CSR & AT91C_US_TXRDY); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_RxReady +//* \brief Return 1 if a character can be read in US_RHR +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_US_RxReady ( + AT91PS_USART pUSART ) // \arg pointer to a USART controller +{ + return (pUSART->US_CSR & AT91C_US_RXRDY); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_Error +//* \brief Return the error flag +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_US_Error ( + AT91PS_USART pUSART ) // \arg pointer to a USART controller +{ + return (pUSART->US_CSR & + (AT91C_US_OVRE | // Overrun error + AT91C_US_FRAME | // Framing error + AT91C_US_PARE)); // Parity error +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_PutChar +//* \brief Send a character,does not check if ready to send +//*---------------------------------------------------------------------------- +__inline void AT91F_US_PutChar ( + AT91PS_USART pUSART, + int character ) +{ + pUSART->US_THR = (character & 0x1FF); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_GetChar +//* \brief Receive a character,does not check if a character is available +//*---------------------------------------------------------------------------- +__inline int AT91F_US_GetChar ( + const AT91PS_USART pUSART) +{ + return((pUSART->US_RHR) & 0x1FF); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_SendFrame +//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is busy +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_US_SendFrame( + AT91PS_USART pUSART, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + return AT91F_PDC_SendFrame( + (AT91PS_PDC) &(pUSART->US_RPR), + pBuffer, + szBuffer, + pNextBuffer, + szNextBuffer); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_ReceiveFrame +//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is busy +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_US_ReceiveFrame ( + AT91PS_USART pUSART, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + return AT91F_PDC_ReceiveFrame( + (AT91PS_PDC) &(pUSART->US_RPR), + pBuffer, + szBuffer, + pNextBuffer, + szNextBuffer); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_SetIrdaFilter +//* \brief Set the value of IrDa filter tregister +//*---------------------------------------------------------------------------- +__inline void AT91F_US_SetIrdaFilter ( + AT91PS_USART pUSART, + unsigned char value +) +{ + pUSART->US_IF = value; +} + +/* ***************************************************************************** + SOFTWARE API FOR SSC + ***************************************************************************** */ +//* Define the standard I2S mode configuration + +//* Configuration to set in the SSC Transmit Clock Mode Register +//* Parameters : nb_bit_by_slot : 8, 16 or 32 bits +//* nb_slot_by_frame : number of channels +#define AT91C_I2S_ASY_MASTER_TX_SETTING(nb_bit_by_slot, nb_slot_by_frame)( +\ + AT91C_SSC_CKS_DIV +\ + AT91C_SSC_CKO_CONTINOUS +\ + AT91C_SSC_CKG_NONE +\ + AT91C_SSC_START_FALL_RF +\ + AT91C_SSC_STTOUT +\ + ((1<<16) & AT91C_SSC_STTDLY) +\ + ((((nb_bit_by_slot*nb_slot_by_frame)/2)-1) <<24)) + + +//* Configuration to set in the SSC Transmit Frame Mode Register +//* Parameters : nb_bit_by_slot : 8, 16 or 32 bits +//* nb_slot_by_frame : number of channels +#define AT91C_I2S_ASY_TX_FRAME_SETTING(nb_bit_by_slot, nb_slot_by_frame)( +\ + (nb_bit_by_slot-1) +\ + AT91C_SSC_MSBF +\ + (((nb_slot_by_frame-1)<<8) & AT91C_SSC_DATNB) +\ + (((nb_bit_by_slot-1)<<16) & AT91C_SSC_FSLEN) +\ + AT91C_SSC_FSOS_NEGATIVE) + + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_SetBaudrate +//* \brief Set the baudrate according to the CPU clock +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_SetBaudrate ( + AT91PS_SSC pSSC, // \arg pointer to a SSC controller + unsigned int mainClock, // \arg peripheral clock + unsigned int speed) // \arg SSC baudrate +{ + unsigned int baud_value; + //* Define the baud rate divisor register + if (speed == 0) + baud_value = 0; + else + { + baud_value = (unsigned int) (mainClock * 10)/(2*speed); + if ((baud_value % 10) >= 5) + baud_value = (baud_value / 10) + 1; + else + baud_value /= 10; + } + + pSSC->SSC_CMR = baud_value; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_Configure +//* \brief Configure SSC +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_Configure ( + AT91PS_SSC pSSC, // \arg pointer to a SSC controller + unsigned int syst_clock, // \arg System Clock Frequency + unsigned int baud_rate, // \arg Expected Baud Rate Frequency + unsigned int clock_rx, // \arg Receiver Clock Parameters + unsigned int mode_rx, // \arg mode Register to be programmed + unsigned int clock_tx, // \arg Transmitter Clock Parameters + unsigned int mode_tx) // \arg mode Register to be programmed +{ + //* Disable interrupts + pSSC->SSC_IDR = (unsigned int) -1; + + //* Reset receiver and transmitter + pSSC->SSC_CR = AT91C_SSC_SWRST | AT91C_SSC_RXDIS | AT91C_SSC_TXDIS ; + + //* Define the Clock Mode Register + AT91F_SSC_SetBaudrate(pSSC, syst_clock, baud_rate); + + //* Write the Receive Clock Mode Register + pSSC->SSC_RCMR = clock_rx; + + //* Write the Transmit Clock Mode Register + pSSC->SSC_TCMR = clock_tx; + + //* Write the Receive Frame Mode Register + pSSC->SSC_RFMR = mode_rx; + + //* Write the Transmit Frame Mode Register + pSSC->SSC_TFMR = mode_tx; + + //* Clear Transmit and Receive Counters + AT91F_PDC_Open((AT91PS_PDC) &(pSSC->SSC_RPR)); + + +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_EnableRx +//* \brief Enable receiving datas +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_EnableRx ( + AT91PS_SSC pSSC) // \arg pointer to a SSC controller +{ + //* Enable receiver + pSSC->SSC_CR = AT91C_SSC_RXEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_DisableRx +//* \brief Disable receiving datas +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_DisableRx ( + AT91PS_SSC pSSC) // \arg pointer to a SSC controller +{ + //* Disable receiver + pSSC->SSC_CR = AT91C_SSC_RXDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_EnableTx +//* \brief Enable sending datas +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_EnableTx ( + AT91PS_SSC pSSC) // \arg pointer to a SSC controller +{ + //* Enable transmitter + pSSC->SSC_CR = AT91C_SSC_TXEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_DisableTx +//* \brief Disable sending datas +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_DisableTx ( + AT91PS_SSC pSSC) // \arg pointer to a SSC controller +{ + //* Disable transmitter + pSSC->SSC_CR = AT91C_SSC_TXDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_EnableIt +//* \brief Enable SSC IT +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_EnableIt ( + AT91PS_SSC pSSC, // \arg pointer to a SSC controller + unsigned int flag) // \arg IT to be enabled +{ + //* Write to the IER register + pSSC->SSC_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_DisableIt +//* \brief Disable SSC IT +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_DisableIt ( + AT91PS_SSC pSSC, // \arg pointer to a SSC controller + unsigned int flag) // \arg IT to be disabled +{ + //* Write to the IDR register + pSSC->SSC_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_ReceiveFrame +//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initialized with Next Buffer, 0 if PDC is busy +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SSC_ReceiveFrame ( + AT91PS_SSC pSSC, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + return AT91F_PDC_ReceiveFrame( + (AT91PS_PDC) &(pSSC->SSC_RPR), + pBuffer, + szBuffer, + pNextBuffer, + szNextBuffer); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_SendFrame +//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initialized with Next Buffer, 0 if PDC is busy +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SSC_SendFrame( + AT91PS_SSC pSSC, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + return AT91F_PDC_SendFrame( + (AT91PS_PDC) &(pSSC->SSC_RPR), + pBuffer, + szBuffer, + pNextBuffer, + szNextBuffer); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_GetInterruptMaskStatus +//* \brief Return SSC Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SSC_GetInterruptMaskStatus( // \return SSC Interrupt Mask Status + AT91PS_SSC pSsc) // \arg pointer to a SSC controller +{ + return pSsc->SSC_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_IsInterruptMasked +//* \brief Test if SSC Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_SSC_IsInterruptMasked( + AT91PS_SSC pSsc, // \arg pointer to a SSC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_SSC_GetInterruptMaskStatus(pSsc) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR TWI + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_EnableIt +//* \brief Enable TWI IT +//*---------------------------------------------------------------------------- +__inline void AT91F_TWI_EnableIt ( + AT91PS_TWI pTWI, // \arg pointer to a TWI controller + unsigned int flag) // \arg IT to be enabled +{ + //* Write to the IER register + pTWI->TWI_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_DisableIt +//* \brief Disable TWI IT +//*---------------------------------------------------------------------------- +__inline void AT91F_TWI_DisableIt ( + AT91PS_TWI pTWI, // \arg pointer to a TWI controller + unsigned int flag) // \arg IT to be disabled +{ + //* Write to the IDR register + pTWI->TWI_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_Configure +//* \brief Configure TWI in master mode +//*---------------------------------------------------------------------------- +__inline void AT91F_TWI_Configure ( AT91PS_TWI pTWI ) // \arg pointer to a TWI controller +{ + //* Disable interrupts + pTWI->TWI_IDR = (unsigned int) -1; + + //* Reset peripheral + pTWI->TWI_CR = AT91C_TWI_SWRST; + + //* Set Master mode + pTWI->TWI_CR = AT91C_TWI_MSEN; + +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_GetInterruptMaskStatus +//* \brief Return TWI Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TWI_GetInterruptMaskStatus( // \return TWI Interrupt Mask Status + AT91PS_TWI pTwi) // \arg pointer to a TWI controller +{ + return pTwi->TWI_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_IsInterruptMasked +//* \brief Test if TWI Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_TWI_IsInterruptMasked( + AT91PS_TWI pTwi, // \arg pointer to a TWI controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_TWI_GetInterruptMaskStatus(pTwi) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR PWMC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_GetStatus +//* \brief Return PWM Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PWMC_GetStatus( // \return PWM Interrupt Status + AT91PS_PWMC pPWM) // pointer to a PWM controller +{ + return pPWM->PWMC_SR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_InterruptEnable +//* \brief Enable PWM Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_InterruptEnable( + AT91PS_PWMC pPwm, // \arg pointer to a PWM controller + unsigned int flag) // \arg PWM interrupt to be enabled +{ + pPwm->PWMC_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_InterruptDisable +//* \brief Disable PWM Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_InterruptDisable( + AT91PS_PWMC pPwm, // \arg pointer to a PWM controller + unsigned int flag) // \arg PWM interrupt to be disabled +{ + pPwm->PWMC_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_GetInterruptMaskStatus +//* \brief Return PWM Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PWMC_GetInterruptMaskStatus( // \return PWM Interrupt Mask Status + AT91PS_PWMC pPwm) // \arg pointer to a PWM controller +{ + return pPwm->PWMC_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_IsInterruptMasked +//* \brief Test if PWM Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PWMC_IsInterruptMasked( + AT91PS_PWMC pPWM, // \arg pointer to a PWM controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PWMC_GetInterruptMaskStatus(pPWM) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_IsStatusSet +//* \brief Test if PWM Interrupt is Set +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PWMC_IsStatusSet( + AT91PS_PWMC pPWM, // \arg pointer to a PWM controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PWMC_GetStatus(pPWM) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_CfgChannel +//* \brief Test if PWM Interrupt is Set +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_CfgChannel( + AT91PS_PWMC pPWM, // \arg pointer to a PWM controller + unsigned int channelId, // \arg PWM channel ID + unsigned int mode, // \arg PWM mode + unsigned int period, // \arg PWM period + unsigned int duty) // \arg PWM duty cycle +{ + pPWM->PWMC_CH[channelId].PWMC_CMR = mode; + pPWM->PWMC_CH[channelId].PWMC_CDTYR = duty; + pPWM->PWMC_CH[channelId].PWMC_CPRDR = period; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_StartChannel +//* \brief Enable channel +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_StartChannel( + AT91PS_PWMC pPWM, // \arg pointer to a PWM controller + unsigned int flag) // \arg Channels IDs to be enabled +{ + pPWM->PWMC_ENA = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_StopChannel +//* \brief Disable channel +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_StopChannel( + AT91PS_PWMC pPWM, // \arg pointer to a PWM controller + unsigned int flag) // \arg Channels IDs to be enabled +{ + pPWM->PWMC_DIS = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_UpdateChannel +//* \brief Update Period or Duty Cycle +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_UpdateChannel( + AT91PS_PWMC pPWM, // \arg pointer to a PWM controller + unsigned int channelId, // \arg PWM channel ID + unsigned int update) // \arg Channels IDs to be enabled +{ + pPWM->PWMC_CH[channelId].PWMC_CUPDR = update; +} + +/* ***************************************************************************** + SOFTWARE API FOR UDP + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EnableIt +//* \brief Enable UDP IT +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EnableIt ( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned int flag) // \arg IT to be enabled +{ + //* Write to the IER register + pUDP->UDP_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_DisableIt +//* \brief Disable UDP IT +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_DisableIt ( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned int flag) // \arg IT to be disabled +{ + //* Write to the IDR register + pUDP->UDP_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_SetAddress +//* \brief Set UDP functional address +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_SetAddress ( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char address) // \arg new UDP address +{ + pUDP->UDP_FADDR = (AT91C_UDP_FEN | address); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EnableEp +//* \brief Enable Endpoint +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EnableEp ( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint) // \arg endpoint number +{ + pUDP->UDP_CSR[endpoint] |= AT91C_UDP_EPEDS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_DisableEp +//* \brief Enable Endpoint +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_DisableEp ( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint) // \arg endpoint number +{ + pUDP->UDP_CSR[endpoint] &= ~AT91C_UDP_EPEDS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_SetState +//* \brief Set UDP Device state +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_SetState ( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned int flag) // \arg new UDP address +{ + pUDP->UDP_GLBSTATE &= ~(AT91C_UDP_FADDEN | AT91C_UDP_CONFG); + pUDP->UDP_GLBSTATE |= flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_GetState +//* \brief return UDP Device state +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_UDP_GetState ( // \return the UDP device state + AT91PS_UDP pUDP) // \arg pointer to a UDP controller +{ + return (pUDP->UDP_GLBSTATE & (AT91C_UDP_FADDEN | AT91C_UDP_CONFG)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_ResetEp +//* \brief Reset UDP endpoint +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_ResetEp ( // \return the UDP device state + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned int flag) // \arg Endpoints to be reset +{ + pUDP->UDP_RSTEP = flag; + pUDP->UDP_RSTEP = 0; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpStall +//* \brief Endpoint will STALL requests +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EpStall( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint) // \arg endpoint number +{ + pUDP->UDP_CSR[endpoint] |= AT91C_UDP_FORCESTALL; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpWrite +//* \brief Write value in the DPR +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EpWrite( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint, // \arg endpoint number + unsigned char value) // \arg value to be written in the DPR +{ + pUDP->UDP_FDR[endpoint] = value; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpRead +//* \brief Return value from the DPR +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_UDP_EpRead( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint) // \arg endpoint number +{ + return pUDP->UDP_FDR[endpoint]; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpEndOfWr +//* \brief Notify the UDP that values in DPR are ready to be sent +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EpEndOfWr( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint) // \arg endpoint number +{ + pUDP->UDP_CSR[endpoint] |= AT91C_UDP_TXPKTRDY; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpClear +//* \brief Clear flag in the endpoint CSR register +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EpClear( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint, // \arg endpoint number + unsigned int flag) // \arg flag to be cleared +{ + pUDP->UDP_CSR[endpoint] &= ~(flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpSet +//* \brief Set flag in the endpoint CSR register +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EpSet( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint, // \arg endpoint number + unsigned int flag) // \arg flag to be cleared +{ + pUDP->UDP_CSR[endpoint] |= flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpStatus +//* \brief Return the endpoint CSR register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_UDP_EpStatus( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint) // \arg endpoint number +{ + return pUDP->UDP_CSR[endpoint]; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_GetInterruptMaskStatus +//* \brief Return UDP Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_UDP_GetInterruptMaskStatus( // \return UDP Interrupt Mask Status + AT91PS_UDP pUdp) // \arg pointer to a UDP controller +{ + return pUdp->UDP_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_IsInterruptMasked +//* \brief Test if UDP Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_UDP_IsInterruptMasked( + AT91PS_UDP pUdp, // \arg pointer to a UDP controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_UDP_GetInterruptMaskStatus(pUdp) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR TC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC_InterruptEnable +//* \brief Enable TC Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_TC_InterruptEnable( + AT91PS_TC pTc, // \arg pointer to a TC controller + unsigned int flag) // \arg TC interrupt to be enabled +{ + pTc->TC_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC_InterruptDisable +//* \brief Disable TC Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_TC_InterruptDisable( + AT91PS_TC pTc, // \arg pointer to a TC controller + unsigned int flag) // \arg TC interrupt to be disabled +{ + pTc->TC_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC_GetInterruptMaskStatus +//* \brief Return TC Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TC_GetInterruptMaskStatus( // \return TC Interrupt Mask Status + AT91PS_TC pTc) // \arg pointer to a TC controller +{ + return pTc->TC_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC_IsInterruptMasked +//* \brief Test if TC Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_TC_IsInterruptMasked( + AT91PS_TC pTc, // \arg pointer to a TC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_TC_GetInterruptMaskStatus(pTc) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR CAN + ***************************************************************************** */ +#define STANDARD_FORMAT 0 +#define EXTENDED_FORMAT 1 + +//*---------------------------------------------------------------------------- +//* \fn AT91F_InitMailboxRegisters() +//* \brief Configure the corresponding mailbox +//*---------------------------------------------------------------------------- +__inline void AT91F_InitMailboxRegisters(AT91PS_CAN_MB CAN_Mailbox, + int mode_reg, + int acceptance_mask_reg, + int id_reg, + int data_low_reg, + int data_high_reg, + int control_reg) +{ + CAN_Mailbox->CAN_MB_MCR = 0x0; + CAN_Mailbox->CAN_MB_MMR = mode_reg; + CAN_Mailbox->CAN_MB_MAM = acceptance_mask_reg; + CAN_Mailbox->CAN_MB_MID = id_reg; + CAN_Mailbox->CAN_MB_MDL = data_low_reg; + CAN_Mailbox->CAN_MB_MDH = data_high_reg; + CAN_Mailbox->CAN_MB_MCR = control_reg; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_EnableCAN() +//* \brief +//*---------------------------------------------------------------------------- +__inline void AT91F_EnableCAN( + AT91PS_CAN pCAN) // pointer to a CAN controller +{ + pCAN->CAN_MR |= AT91C_CAN_CANEN; + + // Wait for WAKEUP flag raising <=> 11-recessive-bit were scanned by the transceiver + while( (pCAN->CAN_SR & AT91C_CAN_WAKEUP) != AT91C_CAN_WAKEUP ); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_DisableCAN() +//* \brief +//*---------------------------------------------------------------------------- +__inline void AT91F_DisableCAN( + AT91PS_CAN pCAN) // pointer to a CAN controller +{ + pCAN->CAN_MR &= ~AT91C_CAN_CANEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_EnableIt +//* \brief Enable CAN interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_EnableIt ( + AT91PS_CAN pCAN, // pointer to a CAN controller + unsigned int flag) // IT to be enabled +{ + //* Write to the IER register + pCAN->CAN_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_DisableIt +//* \brief Disable CAN interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_DisableIt ( + AT91PS_CAN pCAN, // pointer to a CAN controller + unsigned int flag) // IT to be disabled +{ + //* Write to the IDR register + pCAN->CAN_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetStatus +//* \brief Return CAN Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetStatus( // \return CAN Interrupt Status + AT91PS_CAN pCAN) // pointer to a CAN controller +{ + return pCAN->CAN_SR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetInterruptMaskStatus +//* \brief Return CAN Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetInterruptMaskStatus( // \return CAN Interrupt Mask Status + AT91PS_CAN pCAN) // pointer to a CAN controller +{ + return pCAN->CAN_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_IsInterruptMasked +//* \brief Test if CAN Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_IsInterruptMasked( + AT91PS_CAN pCAN, // \arg pointer to a CAN controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_CAN_GetInterruptMaskStatus(pCAN) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_IsStatusSet +//* \brief Test if CAN Interrupt is Set +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_IsStatusSet( + AT91PS_CAN pCAN, // \arg pointer to a CAN controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_CAN_GetStatus(pCAN) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgModeReg +//* \brief Configure the Mode Register of the CAN controller +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgModeReg ( + AT91PS_CAN pCAN, // pointer to a CAN controller + unsigned int mode) // mode register +{ + //* Write to the MR register + pCAN->CAN_MR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetModeReg +//* \brief Return the Mode Register of the CAN controller value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetModeReg ( + AT91PS_CAN pCAN // pointer to a CAN controller + ) +{ + return pCAN->CAN_MR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgBaudrateReg +//* \brief Configure the Baudrate of the CAN controller for the network +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgBaudrateReg ( + AT91PS_CAN pCAN, // pointer to a CAN controller + unsigned int baudrate_cfg) +{ + //* Write to the BR register + pCAN->CAN_BR = baudrate_cfg; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetBaudrate +//* \brief Return the Baudrate of the CAN controller for the network value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetBaudrate ( + AT91PS_CAN pCAN // pointer to a CAN controller + ) +{ + return pCAN->CAN_BR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetInternalCounter +//* \brief Return CAN Timer Regsiter Value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetInternalCounter ( + AT91PS_CAN pCAN // pointer to a CAN controller + ) +{ + return pCAN->CAN_TIM; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetTimestamp +//* \brief Return CAN Timestamp Register Value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetTimestamp ( + AT91PS_CAN pCAN // pointer to a CAN controller + ) +{ + return pCAN->CAN_TIMESTP; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetErrorCounter +//* \brief Return CAN Error Counter Register Value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetErrorCounter ( + AT91PS_CAN pCAN // pointer to a CAN controller + ) +{ + return pCAN->CAN_ECR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_InitTransferRequest +//* \brief Request for a transfer on the corresponding mailboxes +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_InitTransferRequest ( + AT91PS_CAN pCAN, // pointer to a CAN controller + unsigned int transfer_cmd) +{ + pCAN->CAN_TCR = transfer_cmd; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_InitAbortRequest +//* \brief Abort the corresponding mailboxes +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_InitAbortRequest ( + AT91PS_CAN pCAN, // pointer to a CAN controller + unsigned int abort_cmd) +{ + pCAN->CAN_ACR = abort_cmd; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgMessageModeReg +//* \brief Program the Message Mode Register +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgMessageModeReg ( + AT91PS_CAN_MB CAN_Mailbox, // pointer to a CAN Mailbox + unsigned int mode) +{ + CAN_Mailbox->CAN_MB_MMR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetMessageModeReg +//* \brief Return the Message Mode Register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetMessageModeReg ( + AT91PS_CAN_MB CAN_Mailbox) // pointer to a CAN Mailbox +{ + return CAN_Mailbox->CAN_MB_MMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgMessageIDReg +//* \brief Program the Message ID Register +//* \brief Version == 0 for Standard messsage, Version == 1 for Extended +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgMessageIDReg ( + AT91PS_CAN_MB CAN_Mailbox, // pointer to a CAN Mailbox + unsigned int id, + unsigned char version) +{ + if(version==0) // IDvA Standard Format + CAN_Mailbox->CAN_MB_MID = id<<18; + else // IDvB Extended Format + CAN_Mailbox->CAN_MB_MID = id | (1<<29); // set MIDE bit +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetMessageIDReg +//* \brief Return the Message ID Register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetMessageIDReg ( + AT91PS_CAN_MB CAN_Mailbox) // pointer to a CAN Mailbox +{ + return CAN_Mailbox->CAN_MB_MID; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgMessageAcceptanceMaskReg +//* \brief Program the Message Acceptance Mask Register +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgMessageAcceptanceMaskReg ( + AT91PS_CAN_MB CAN_Mailbox, // pointer to a CAN Mailbox + unsigned int mask) +{ + CAN_Mailbox->CAN_MB_MAM = mask; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetMessageAcceptanceMaskReg +//* \brief Return the Message Acceptance Mask Register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetMessageAcceptanceMaskReg ( + AT91PS_CAN_MB CAN_Mailbox) // pointer to a CAN Mailbox +{ + return CAN_Mailbox->CAN_MB_MAM; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetFamilyID +//* \brief Return the Message ID Register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetFamilyID ( + AT91PS_CAN_MB CAN_Mailbox) // pointer to a CAN Mailbox +{ + return CAN_Mailbox->CAN_MB_MFID; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgMessageCtrl +//* \brief Request and config for a transfer on the corresponding mailbox +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgMessageCtrlReg ( + AT91PS_CAN_MB CAN_Mailbox, // pointer to a CAN Mailbox + unsigned int message_ctrl_cmd) +{ + CAN_Mailbox->CAN_MB_MCR = message_ctrl_cmd; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetMessageStatus +//* \brief Return CAN Mailbox Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetMessageStatus ( + AT91PS_CAN_MB CAN_Mailbox) // pointer to a CAN Mailbox +{ + return CAN_Mailbox->CAN_MB_MSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgMessageDataLow +//* \brief Program data low value +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgMessageDataLow ( + AT91PS_CAN_MB CAN_Mailbox, // pointer to a CAN Mailbox + unsigned int data) +{ + CAN_Mailbox->CAN_MB_MDL = data; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetMessageDataLow +//* \brief Return data low value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetMessageDataLow ( + AT91PS_CAN_MB CAN_Mailbox) // pointer to a CAN Mailbox +{ + return CAN_Mailbox->CAN_MB_MDL; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgMessageDataHigh +//* \brief Program data high value +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgMessageDataHigh ( + AT91PS_CAN_MB CAN_Mailbox, // pointer to a CAN Mailbox + unsigned int data) +{ + CAN_Mailbox->CAN_MB_MDH = data; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetMessageDataHigh +//* \brief Return data high value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetMessageDataHigh ( + AT91PS_CAN_MB CAN_Mailbox) // pointer to a CAN Mailbox +{ + return CAN_Mailbox->CAN_MB_MDH; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_Open +//* \brief Open a CAN Port +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_Open ( + const unsigned int null) // \arg +{ + /* NOT DEFINED AT THIS MOMENT */ + return ( 0 ); +} +/* ***************************************************************************** + SOFTWARE API FOR ADC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_EnableIt +//* \brief Enable ADC interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_EnableIt ( + AT91PS_ADC pADC, // pointer to a ADC controller + unsigned int flag) // IT to be enabled +{ + //* Write to the IER register + pADC->ADC_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_DisableIt +//* \brief Disable ADC interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_DisableIt ( + AT91PS_ADC pADC, // pointer to a ADC controller + unsigned int flag) // IT to be disabled +{ + //* Write to the IDR register + pADC->ADC_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetStatus +//* \brief Return ADC Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetStatus( // \return ADC Interrupt Status + AT91PS_ADC pADC) // pointer to a ADC controller +{ + return pADC->ADC_SR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetInterruptMaskStatus +//* \brief Return ADC Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetInterruptMaskStatus( // \return ADC Interrupt Mask Status + AT91PS_ADC pADC) // pointer to a ADC controller +{ + return pADC->ADC_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_IsInterruptMasked +//* \brief Test if ADC Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_IsInterruptMasked( + AT91PS_ADC pADC, // \arg pointer to a ADC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_ADC_GetInterruptMaskStatus(pADC) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_IsStatusSet +//* \brief Test if ADC Status is Set +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_IsStatusSet( + AT91PS_ADC pADC, // \arg pointer to a ADC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_ADC_GetStatus(pADC) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_CfgModeReg +//* \brief Configure the Mode Register of the ADC controller +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_CfgModeReg ( + AT91PS_ADC pADC, // pointer to a ADC controller + unsigned int mode) // mode register +{ + //* Write to the MR register + pADC->ADC_MR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetModeReg +//* \brief Return the Mode Register of the ADC controller value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetModeReg ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_MR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_CfgTimings +//* \brief Configure the different necessary timings of the ADC controller +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_CfgTimings ( + AT91PS_ADC pADC, // pointer to a ADC controller + unsigned int mck_clock, // in MHz + unsigned int adc_clock, // in MHz + unsigned int startup_time, // in us + unsigned int sample_and_hold_time) // in ns +{ + unsigned int prescal,startup,shtim; + + prescal = mck_clock/(2*adc_clock) - 1; + startup = adc_clock*startup_time/8 - 1; + shtim = adc_clock*sample_and_hold_time/1000 - 1; + + //* Write to the MR register + pADC->ADC_MR = ( (prescal<<8) & AT91C_ADC_PRESCAL) | ( (startup<<16) & AT91C_ADC_STARTUP) | ( (shtim<<24) & AT91C_ADC_SHTIM); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_EnableChannel +//* \brief Return ADC Timer Register Value +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_EnableChannel ( + AT91PS_ADC pADC, // pointer to a ADC controller + unsigned int channel) // mode register +{ + //* Write to the CHER register + pADC->ADC_CHER = channel; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_DisableChannel +//* \brief Return ADC Timer Register Value +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_DisableChannel ( + AT91PS_ADC pADC, // pointer to a ADC controller + unsigned int channel) // mode register +{ + //* Write to the CHDR register + pADC->ADC_CHDR = channel; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetChannelStatus +//* \brief Return ADC Timer Register Value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetChannelStatus ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CHSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_StartConversion +//* \brief Software request for a analog to digital conversion +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_StartConversion ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + pADC->ADC_CR = AT91C_ADC_START; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_SoftReset +//* \brief Software reset +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_SoftReset ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + pADC->ADC_CR = AT91C_ADC_SWRST; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetLastConvertedData +//* \brief Return the Last Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetLastConvertedData ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_LCDR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH0 +//* \brief Return the Channel 0 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH0 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR0; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH1 +//* \brief Return the Channel 1 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH1 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR1; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH2 +//* \brief Return the Channel 2 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH2 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR2; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH3 +//* \brief Return the Channel 3 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH3 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR3; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH4 +//* \brief Return the Channel 4 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH4 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR4; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH5 +//* \brief Return the Channel 5 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH5 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR5; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH6 +//* \brief Return the Channel 6 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH6 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR6; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH7 +//* \brief Return the Channel 7 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH7 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR7; +} + +/* ***************************************************************************** + SOFTWARE API FOR AES + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_EnableIt +//* \brief Enable AES interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_EnableIt ( + AT91PS_AES pAES, // pointer to a AES controller + unsigned int flag) // IT to be enabled +{ + //* Write to the IER register + pAES->AES_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_DisableIt +//* \brief Disable AES interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_DisableIt ( + AT91PS_AES pAES, // pointer to a AES controller + unsigned int flag) // IT to be disabled +{ + //* Write to the IDR register + pAES->AES_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_GetStatus +//* \brief Return AES Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AES_GetStatus( // \return AES Interrupt Status + AT91PS_AES pAES) // pointer to a AES controller +{ + return pAES->AES_ISR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_GetInterruptMaskStatus +//* \brief Return AES Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AES_GetInterruptMaskStatus( // \return AES Interrupt Mask Status + AT91PS_AES pAES) // pointer to a AES controller +{ + return pAES->AES_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_IsInterruptMasked +//* \brief Test if AES Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AES_IsInterruptMasked( + AT91PS_AES pAES, // \arg pointer to a AES controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_AES_GetInterruptMaskStatus(pAES) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_IsStatusSet +//* \brief Test if AES Status is Set +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AES_IsStatusSet( + AT91PS_AES pAES, // \arg pointer to a AES controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_AES_GetStatus(pAES) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_CfgModeReg +//* \brief Configure the Mode Register of the AES controller +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_CfgModeReg ( + AT91PS_AES pAES, // pointer to a AES controller + unsigned int mode) // mode register +{ + //* Write to the MR register + pAES->AES_MR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_GetModeReg +//* \brief Return the Mode Register of the AES controller value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AES_GetModeReg ( + AT91PS_AES pAES // pointer to a AES controller + ) +{ + return pAES->AES_MR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_StartProcessing +//* \brief Start Encryption or Decryption +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_StartProcessing ( + AT91PS_AES pAES // pointer to a AES controller + ) +{ + pAES->AES_CR = AT91C_AES_START; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_SoftReset +//* \brief Reset AES +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_SoftReset ( + AT91PS_AES pAES // pointer to a AES controller + ) +{ + pAES->AES_CR = AT91C_AES_SWRST; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_LoadNewSeed +//* \brief Load New Seed in the random number generator +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_LoadNewSeed ( + AT91PS_AES pAES // pointer to a AES controller + ) +{ + pAES->AES_CR = AT91C_AES_LOADSEED; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_SetCryptoKey +//* \brief Set Cryptographic Key x +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_SetCryptoKey ( + AT91PS_AES pAES, // pointer to a AES controller + unsigned char index, + unsigned int keyword + ) +{ + pAES->AES_KEYWxR[index] = keyword; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_InputData +//* \brief Set Input Data x +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_InputData ( + AT91PS_AES pAES, // pointer to a AES controller + unsigned char index, + unsigned int indata + ) +{ + pAES->AES_IDATAxR[index] = indata; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_GetOutputData +//* \brief Get Output Data x +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AES_GetOutputData ( + AT91PS_AES pAES, // pointer to a AES controller + unsigned char index + ) +{ + return pAES->AES_ODATAxR[index]; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_SetInitializationVector +//* \brief Set Initialization Vector (or Counter) x +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_SetInitializationVector ( + AT91PS_AES pAES, // pointer to a AES controller + unsigned char index, + unsigned int initvector + ) +{ + pAES->AES_IVxR[index] = initvector; +} + +/* ***************************************************************************** + SOFTWARE API FOR TDES + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_EnableIt +//* \brief Enable TDES interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_EnableIt ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned int flag) // IT to be enabled +{ + //* Write to the IER register + pTDES->TDES_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_DisableIt +//* \brief Disable TDES interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_DisableIt ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned int flag) // IT to be disabled +{ + //* Write to the IDR register + pTDES->TDES_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_GetStatus +//* \brief Return TDES Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TDES_GetStatus( // \return TDES Interrupt Status + AT91PS_TDES pTDES) // pointer to a TDES controller +{ + return pTDES->TDES_ISR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_GetInterruptMaskStatus +//* \brief Return TDES Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TDES_GetInterruptMaskStatus( // \return TDES Interrupt Mask Status + AT91PS_TDES pTDES) // pointer to a TDES controller +{ + return pTDES->TDES_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_IsInterruptMasked +//* \brief Test if TDES Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TDES_IsInterruptMasked( + AT91PS_TDES pTDES, // \arg pointer to a TDES controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_TDES_GetInterruptMaskStatus(pTDES) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_IsStatusSet +//* \brief Test if TDES Status is Set +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TDES_IsStatusSet( + AT91PS_TDES pTDES, // \arg pointer to a TDES controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_TDES_GetStatus(pTDES) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_CfgModeReg +//* \brief Configure the Mode Register of the TDES controller +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_CfgModeReg ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned int mode) // mode register +{ + //* Write to the MR register + pTDES->TDES_MR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_GetModeReg +//* \brief Return the Mode Register of the TDES controller value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TDES_GetModeReg ( + AT91PS_TDES pTDES // pointer to a TDES controller + ) +{ + return pTDES->TDES_MR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_StartProcessing +//* \brief Start Encryption or Decryption +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_StartProcessing ( + AT91PS_TDES pTDES // pointer to a TDES controller + ) +{ + pTDES->TDES_CR = AT91C_TDES_START; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_SoftReset +//* \brief Reset TDES +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_SoftReset ( + AT91PS_TDES pTDES // pointer to a TDES controller + ) +{ + pTDES->TDES_CR = AT91C_TDES_SWRST; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_SetCryptoKey1 +//* \brief Set Cryptographic Key 1 Word x +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_SetCryptoKey1 ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned char index, + unsigned int keyword + ) +{ + pTDES->TDES_KEY1WxR[index] = keyword; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_SetCryptoKey2 +//* \brief Set Cryptographic Key 2 Word x +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_SetCryptoKey2 ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned char index, + unsigned int keyword + ) +{ + pTDES->TDES_KEY2WxR[index] = keyword; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_SetCryptoKey3 +//* \brief Set Cryptographic Key 3 Word x +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_SetCryptoKey3 ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned char index, + unsigned int keyword + ) +{ + pTDES->TDES_KEY3WxR[index] = keyword; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_InputData +//* \brief Set Input Data x +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_InputData ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned char index, + unsigned int indata + ) +{ + pTDES->TDES_IDATAxR[index] = indata; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_GetOutputData +//* \brief Get Output Data x +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TDES_GetOutputData ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned char index + ) +{ + return pTDES->TDES_ODATAxR[index]; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_SetInitializationVector +//* \brief Set Initialization Vector x +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_SetInitializationVector ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned char index, + unsigned int initvector + ) +{ + pTDES->TDES_IVxR[index] = initvector; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_DBGU_CfgPMC +//* \brief Enable Peripheral clock in PMC for DBGU +//*---------------------------------------------------------------------------- +__inline void AT91F_DBGU_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_DBGU_CfgPIO +//* \brief Configure PIO controllers to drive DBGU signals +//*---------------------------------------------------------------------------- +__inline void AT91F_DBGU_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA27_DRXD ) | + ((unsigned int) AT91C_PA28_DTXD ), // Peripheral A + 0); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_CfgPMC +//* \brief Enable Peripheral clock in PMC for PMC +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_CfgPIO +//* \brief Configure PIO controllers to drive PMC signals +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB30_PCK2 ) | + ((unsigned int) AT91C_PB29_PCK1 ), // Peripheral A + ((unsigned int) AT91C_PB20_PCK0 ) | + ((unsigned int) AT91C_PB0_PCK0 ) | + ((unsigned int) AT91C_PB22_PCK2 ) | + ((unsigned int) AT91C_PB21_PCK1 )); // Peripheral B + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PA30_PCK2 ) | + ((unsigned int) AT91C_PA13_PCK1 ) | + ((unsigned int) AT91C_PA27_PCK3 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_VREG_CfgPMC +//* \brief Enable Peripheral clock in PMC for VREG +//*---------------------------------------------------------------------------- +__inline void AT91F_VREG_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_RSTC_CfgPMC +//* \brief Enable Peripheral clock in PMC for RSTC +//*---------------------------------------------------------------------------- +__inline void AT91F_RSTC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_CfgPMC +//* \brief Enable Peripheral clock in PMC for SSC +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SSC)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_CfgPIO +//* \brief Configure PIO controllers to drive SSC signals +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA25_RK ) | + ((unsigned int) AT91C_PA22_TK ) | + ((unsigned int) AT91C_PA21_TF ) | + ((unsigned int) AT91C_PA24_RD ) | + ((unsigned int) AT91C_PA26_RF ) | + ((unsigned int) AT91C_PA23_TD ), // Peripheral A + 0); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_WDTC_CfgPMC +//* \brief Enable Peripheral clock in PMC for WDTC +//*---------------------------------------------------------------------------- +__inline void AT91F_WDTC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US1_CfgPMC +//* \brief Enable Peripheral clock in PMC for US1 +//*---------------------------------------------------------------------------- +__inline void AT91F_US1_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_US1)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US1_CfgPIO +//* \brief Configure PIO controllers to drive US1 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_US1_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PB26_RI1 ) | + ((unsigned int) AT91C_PB24_DSR1 ) | + ((unsigned int) AT91C_PB23_DCD1 ) | + ((unsigned int) AT91C_PB25_DTR1 )); // Peripheral B + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA7_SCK1 ) | + ((unsigned int) AT91C_PA8_RTS1 ) | + ((unsigned int) AT91C_PA6_TXD1 ) | + ((unsigned int) AT91C_PA5_RXD1 ) | + ((unsigned int) AT91C_PA9_CTS1 ), // Peripheral A + 0); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US0_CfgPMC +//* \brief Enable Peripheral clock in PMC for US0 +//*---------------------------------------------------------------------------- +__inline void AT91F_US0_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_US0)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US0_CfgPIO +//* \brief Configure PIO controllers to drive US0 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_US0_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA0_RXD0 ) | + ((unsigned int) AT91C_PA4_CTS0 ) | + ((unsigned int) AT91C_PA3_RTS0 ) | + ((unsigned int) AT91C_PA2_SCK0 ) | + ((unsigned int) AT91C_PA1_TXD0 ), // Peripheral A + 0); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI1_CfgPMC +//* \brief Enable Peripheral clock in PMC for SPI1 +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI1_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SPI1)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI1_CfgPIO +//* \brief Configure PIO controllers to drive SPI1 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI1_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PB16_NPCS13 ) | + ((unsigned int) AT91C_PB10_NPCS11 ) | + ((unsigned int) AT91C_PB11_NPCS12 )); // Peripheral B + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PA4_NPCS13 ) | + ((unsigned int) AT91C_PA29_NPCS13 ) | + ((unsigned int) AT91C_PA21_NPCS10 ) | + ((unsigned int) AT91C_PA22_SPCK1 ) | + ((unsigned int) AT91C_PA25_NPCS11 ) | + ((unsigned int) AT91C_PA2_NPCS11 ) | + ((unsigned int) AT91C_PA24_MISO1 ) | + ((unsigned int) AT91C_PA3_NPCS12 ) | + ((unsigned int) AT91C_PA26_NPCS12 ) | + ((unsigned int) AT91C_PA23_MOSI1 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI0_CfgPMC +//* \brief Enable Peripheral clock in PMC for SPI0 +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI0_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SPI0)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI0_CfgPIO +//* \brief Configure PIO controllers to drive SPI0 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI0_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PB13_NPCS01 ) | + ((unsigned int) AT91C_PB17_NPCS03 ) | + ((unsigned int) AT91C_PB14_NPCS02 )); // Peripheral B + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA16_MISO0 ) | + ((unsigned int) AT91C_PA13_NPCS01 ) | + ((unsigned int) AT91C_PA15_NPCS03 ) | + ((unsigned int) AT91C_PA17_MOSI0 ) | + ((unsigned int) AT91C_PA18_SPCK0 ) | + ((unsigned int) AT91C_PA14_NPCS02 ) | + ((unsigned int) AT91C_PA12_NPCS00 ), // Peripheral A + ((unsigned int) AT91C_PA7_NPCS01 ) | + ((unsigned int) AT91C_PA9_NPCS03 ) | + ((unsigned int) AT91C_PA8_NPCS02 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITC_CfgPMC +//* \brief Enable Peripheral clock in PMC for PITC +//*---------------------------------------------------------------------------- +__inline void AT91F_PITC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_CfgPMC +//* \brief Enable Peripheral clock in PMC for AIC +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_FIQ) | + ((unsigned int) 1 << AT91C_ID_IRQ0) | + ((unsigned int) 1 << AT91C_ID_IRQ1)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_CfgPIO +//* \brief Configure PIO controllers to drive AIC signals +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA30_IRQ0 ) | + ((unsigned int) AT91C_PA29_FIQ ), // Peripheral A + ((unsigned int) AT91C_PA14_IRQ1 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_CfgPMC +//* \brief Enable Peripheral clock in PMC for AES +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_AES)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_CfgPMC +//* \brief Enable Peripheral clock in PMC for TWI +//*---------------------------------------------------------------------------- +__inline void AT91F_TWI_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_TWI)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_CfgPIO +//* \brief Configure PIO controllers to drive TWI signals +//*---------------------------------------------------------------------------- +__inline void AT91F_TWI_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA11_TWCK ) | + ((unsigned int) AT91C_PA10_TWD ), // Peripheral A + 0); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_CfgPMC +//* \brief Enable Peripheral clock in PMC for ADC +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_ADC)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_CfgPIO +//* \brief Configure PIO controllers to drive ADC signals +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PB18_ADTRG )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWMC_CH3_CfgPIO +//* \brief Configure PIO controllers to drive PWMC_CH3 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_CH3_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB22_PWM3 ), // Peripheral A + ((unsigned int) AT91C_PB30_PWM3 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWMC_CH2_CfgPIO +//* \brief Configure PIO controllers to drive PWMC_CH2 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_CH2_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB21_PWM2 ), // Peripheral A + ((unsigned int) AT91C_PB29_PWM2 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWMC_CH1_CfgPIO +//* \brief Configure PIO controllers to drive PWMC_CH1 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_CH1_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB20_PWM1 ), // Peripheral A + ((unsigned int) AT91C_PB28_PWM1 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWMC_CH0_CfgPIO +//* \brief Configure PIO controllers to drive PWMC_CH0 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_CH0_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB19_PWM0 ), // Peripheral A + ((unsigned int) AT91C_PB27_PWM0 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_RTTC_CfgPMC +//* \brief Enable Peripheral clock in PMC for RTTC +//*---------------------------------------------------------------------------- +__inline void AT91F_RTTC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_CfgPMC +//* \brief Enable Peripheral clock in PMC for UDP +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_UDP)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_CfgPMC +//* \brief Enable Peripheral clock in PMC for TDES +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_TDES)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_EMAC_CfgPMC +//* \brief Enable Peripheral clock in PMC for EMAC +//*---------------------------------------------------------------------------- +__inline void AT91F_EMAC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_EMAC)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_EMAC_CfgPIO +//* \brief Configure PIO controllers to drive EMAC signals +//*---------------------------------------------------------------------------- +__inline void AT91F_EMAC_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB2_ETX0 ) | + ((unsigned int) AT91C_PB12_ETXER ) | + ((unsigned int) AT91C_PB16_ECOL ) | + ((unsigned int) AT91C_PB11_ETX3 ) | + ((unsigned int) AT91C_PB6_ERX1 ) | + ((unsigned int) AT91C_PB15_ERXDV ) | + ((unsigned int) AT91C_PB13_ERX2 ) | + ((unsigned int) AT91C_PB3_ETX1 ) | + ((unsigned int) AT91C_PB8_EMDC ) | + ((unsigned int) AT91C_PB5_ERX0 ) | + //((unsigned int) AT91C_PB18_EF100 ) | + ((unsigned int) AT91C_PB14_ERX3 ) | + ((unsigned int) AT91C_PB4_ECRS_ECRSDV) | + ((unsigned int) AT91C_PB1_ETXEN ) | + ((unsigned int) AT91C_PB10_ETX2 ) | + ((unsigned int) AT91C_PB0_ETXCK_EREFCK) | + ((unsigned int) AT91C_PB9_EMDIO ) | + ((unsigned int) AT91C_PB7_ERXER ) | + ((unsigned int) AT91C_PB17_ERXCK ), // Peripheral A + 0); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC0_CfgPMC +//* \brief Enable Peripheral clock in PMC for TC0 +//*---------------------------------------------------------------------------- +__inline void AT91F_TC0_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_TC0)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC0_CfgPIO +//* \brief Configure PIO controllers to drive TC0 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_TC0_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB23_TIOA0 ) | + ((unsigned int) AT91C_PB24_TIOB0 ), // Peripheral A + ((unsigned int) AT91C_PB12_TCLK0 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC1_CfgPMC +//* \brief Enable Peripheral clock in PMC for TC1 +//*---------------------------------------------------------------------------- +__inline void AT91F_TC1_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_TC1)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC1_CfgPIO +//* \brief Configure PIO controllers to drive TC1 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_TC1_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB25_TIOA1 ) | + ((unsigned int) AT91C_PB26_TIOB1 ), // Peripheral A + ((unsigned int) AT91C_PB19_TCLK1 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC2_CfgPMC +//* \brief Enable Peripheral clock in PMC for TC2 +//*---------------------------------------------------------------------------- +__inline void AT91F_TC2_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_TC2)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC2_CfgPIO +//* \brief Configure PIO controllers to drive TC2 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_TC2_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB28_TIOB2 ) | + ((unsigned int) AT91C_PB27_TIOA2 ), // Peripheral A + 0); // Peripheral B + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PA15_TCLK2 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_CfgPMC +//* \brief Enable Peripheral clock in PMC for MC +//*---------------------------------------------------------------------------- +__inline void AT91F_MC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIOA_CfgPMC +//* \brief Enable Peripheral clock in PMC for PIOA +//*---------------------------------------------------------------------------- +__inline void AT91F_PIOA_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_PIOA)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIOB_CfgPMC +//* \brief Enable Peripheral clock in PMC for PIOB +//*---------------------------------------------------------------------------- +__inline void AT91F_PIOB_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_PIOB)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgPMC +//* \brief Enable Peripheral clock in PMC for CAN +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_CAN)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgPIO +//* \brief Configure PIO controllers to drive CAN signals +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA20_CANTX ) | + ((unsigned int) AT91C_PA19_CANRX ), // Peripheral A + 0); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWMC_CfgPMC +//* \brief Enable Peripheral clock in PMC for PWMC +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_PWMC)); +} + +#endif // lib_AT91SAM7X256_H diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM7_AT91SAM7S/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM7_AT91SAM7S/port.c new file mode 100644 index 0000000..366795e --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM7_AT91SAM7S/port.c @@ -0,0 +1,255 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the ARM7 port. + * + * Components that can be compiled to either ARM or THUMB mode are + * contained in this file. The ISR routines, which can only be compiled + * to ARM mode are contained in portISR.c. + *----------------------------------------------------------*/ + +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Processor constants. */ +#include "AT91SAM7X256.h" + +/* Constants required to setup the task context. */ +#define portINITIAL_SPSR ( ( StackType_t ) 0x1f ) /* System mode, ARM mode, interrupts enabled. */ +#define portTHUMB_MODE_BIT ( ( StackType_t ) 0x20 ) +#define portINSTRUCTION_SIZE ( ( StackType_t ) 4 ) +#define portNO_CRITICAL_SECTION_NESTING ( ( StackType_t ) 0 ) + +/* Constants required to setup the tick ISR. */ +#define portENABLE_TIMER ( ( uint8_t ) 0x01 ) +#define portPRESCALE_VALUE 0x00 +#define portINTERRUPT_ON_MATCH ( ( uint32_t ) 0x01 ) +#define portRESET_COUNT_ON_MATCH ( ( uint32_t ) 0x02 ) + +/* Constants required to setup the PIT. */ +#define portPIT_CLOCK_DIVISOR ( ( uint32_t ) 16 ) +#define portPIT_COUNTER_VALUE ( ( ( configCPU_CLOCK_HZ / portPIT_CLOCK_DIVISOR ) / 1000UL ) * portTICK_PERIOD_MS ) + +#define portINT_LEVEL_SENSITIVE 0 +#define portPIT_ENABLE ( ( uint16_t ) 0x1 << 24 ) +#define portPIT_INT_ENABLE ( ( uint16_t ) 0x1 << 25 ) +/*-----------------------------------------------------------*/ + +/* Setup the timer to generate the tick interrupts. */ +static void prvSetupTimerInterrupt( void ); + +/* + * The scheduler can only be started from ARM mode, so + * vPortISRStartFirstSTask() is defined in portISR.c. + */ +extern void vPortISRStartFirstTask( void ); + +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been called. + * + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +StackType_t *pxOriginalTOS; + + pxOriginalTOS = pxTopOfStack; + + /* To ensure asserts in tasks.c don't fail, although in this case the assert + is not really required. */ + pxTopOfStack--; + + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. */ + + /* First on the stack is the return address - which in this case is the + start of the task. The offset is added to make the return address appear + as it would within an IRQ ISR. */ + *pxTopOfStack = ( StackType_t ) pxCode + portINSTRUCTION_SIZE; + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) 0x00000000; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxOriginalTOS; /* Stack used when task starts goes in R13. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */ + pxTopOfStack--; + + /* When the task starts is will expect to find the function parameter in + R0. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + + /* The last thing onto the stack is the status register, which is set for + system mode, with interrupts enabled. */ + *pxTopOfStack = ( StackType_t ) portINITIAL_SPSR; + + #ifdef THUMB_INTERWORK + { + /* We want the task to start in thumb mode. */ + *pxTopOfStack |= portTHUMB_MODE_BIT; + } + #endif + + pxTopOfStack--; + + /* Some optimisation levels use the stack differently to others. This + means the interrupt flags cannot always be stored on the stack and will + instead be stored in a variable, which is then saved as part of the + tasks context. */ + *pxTopOfStack = portNO_CRITICAL_SECTION_NESTING; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + prvSetupTimerInterrupt(); + + /* Start the first task. */ + vPortISRStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the ARM port will require this function as there + is nothing to return to. */ +} +/*-----------------------------------------------------------*/ + +/* + * Setup the timer 0 to generate the tick interrupts at the required frequency. + */ +static void prvSetupTimerInterrupt( void ) +{ +AT91PS_PITC pxPIT = AT91C_BASE_PITC; + + /* Setup the AIC for PIT interrupts. The interrupt routine chosen depends + on whether the preemptive or cooperative scheduler is being used. */ + #if configUSE_PREEMPTION == 0 + + extern void ( vNonPreemptiveTick ) ( void ); + AT91F_AIC_ConfigureIt( AT91C_ID_SYS, AT91C_AIC_PRIOR_HIGHEST, portINT_LEVEL_SENSITIVE, ( void (*)(void) ) vNonPreemptiveTick ); + + #else + + extern void ( vPreemptiveTick )( void ); + AT91F_AIC_ConfigureIt( AT91C_ID_SYS, AT91C_AIC_PRIOR_HIGHEST, portINT_LEVEL_SENSITIVE, ( void (*)(void) ) vPreemptiveTick ); + + #endif + + /* Configure the PIT period. */ + pxPIT->PITC_PIMR = portPIT_ENABLE | portPIT_INT_ENABLE | portPIT_COUNTER_VALUE; + + /* Enable the interrupt. Global interrupts are disables at this point so + this is safe. */ + AT91C_BASE_AIC->AIC_IECR = 0x1 << AT91C_ID_SYS; +} +/*-----------------------------------------------------------*/ + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM7_AT91SAM7S/portISR.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM7_AT91SAM7S/portISR.c new file mode 100644 index 0000000..1b96739 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM7_AT91SAM7S/portISR.c @@ -0,0 +1,269 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +/*----------------------------------------------------------- + * Components that can be compiled to either ARM or THUMB mode are + * contained in port.c The ISR routines, which can only be compiled + * to ARM mode, are contained in this file. + *----------------------------------------------------------*/ + +/* + Changes from V3.2.4 + + + The assembler statements are now included in a single asm block rather + than each line having its own asm block. +*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#include "AT91SAM7X256.h" + +/* Constants required to handle interrupts. */ +#define portTIMER_MATCH_ISR_BIT ( ( uint8_t ) 0x01 ) +#define portCLEAR_VIC_INTERRUPT ( ( uint32_t ) 0 ) + +/* Constants required to handle critical sections. */ +#define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) +volatile uint32_t ulCriticalNesting = 9999UL; + +/*-----------------------------------------------------------*/ + +/* ISR to handle manual context switches (from a call to taskYIELD()). */ +void vPortYieldProcessor( void ) __attribute__((interrupt("SWI"), naked)); + +/* + * The scheduler can only be started from ARM mode, hence the inclusion of this + * function here. + */ +void vPortISRStartFirstTask( void ); +/*-----------------------------------------------------------*/ + +void vPortISRStartFirstTask( void ) +{ + /* Simply start the scheduler. This is included here as it can only be + called from ARM mode. */ + portRESTORE_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +/* + * Called by portYIELD() or taskYIELD() to manually force a context switch. + * + * When a context switch is performed from the task level the saved task + * context is made to look as if it occurred from within the tick ISR. This + * way the same restore context function can be used when restoring the context + * saved from the ISR or that saved from a call to vPortYieldProcessor. + */ +void vPortYieldProcessor( void ) +{ + /* Within an IRQ ISR the link register has an offset from the true return + address, but an SWI ISR does not. Add the offset manually so the same + ISR return code can be used in both cases. */ + __asm volatile ( "ADD LR, LR, #4" ); + + /* Perform the context switch. First save the context of the current task. */ + portSAVE_CONTEXT(); + + /* Find the highest priority task that is ready to run. */ + vTaskSwitchContext(); + + /* Restore the context of the new task. */ + portRESTORE_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +/* + * The ISR used for the scheduler tick depends on whether the cooperative or + * the preemptive scheduler is being used. + */ + +#if configUSE_PREEMPTION == 0 + + /* The cooperative scheduler requires a normal IRQ service routine to + simply increment the system tick. */ + void vNonPreemptiveTick( void ) __attribute__ ((interrupt ("IRQ"))); + void vNonPreemptiveTick( void ) + { + uint32_t ulDummy; + + /* Increment the tick count - which may wake some tasks but as the + preemptive scheduler is not being used any woken task is not given + processor time no matter what its priority. */ + xTaskIncrementTick(); + + /* Clear the PIT interrupt. */ + ulDummy = AT91C_BASE_PITC->PITC_PIVR; + + /* End the interrupt in the AIC. */ + AT91C_BASE_AIC->AIC_EOICR = ulDummy; + } + +#else + + /* The preemptive scheduler is defined as "naked" as the full context is + saved on entry as part of the context switch. */ + void vPreemptiveTick( void ) __attribute__((naked)); + void vPreemptiveTick( void ) + { + /* Save the context of the current task. */ + portSAVE_CONTEXT(); + + /* Increment the tick count - this may wake a task. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Find the highest priority task that is ready to run. */ + vTaskSwitchContext(); + } + + /* End the interrupt in the AIC. */ + AT91C_BASE_AIC->AIC_EOICR = AT91C_BASE_PITC->PITC_PIVR; + + portRESTORE_CONTEXT(); + } + +#endif +/*-----------------------------------------------------------*/ + +/* + * The interrupt management utilities can only be called from ARM mode. When + * THUMB_INTERWORK is defined the utilities are defined as functions here to + * ensure a switch to ARM mode. When THUMB_INTERWORK is not defined then + * the utilities are defined as macros in portmacro.h - as per other ports. + */ +void vPortDisableInterruptsFromThumb( void ) __attribute__ ((naked)); +void vPortEnableInterruptsFromThumb( void ) __attribute__ ((naked)); + +void vPortDisableInterruptsFromThumb( void ) +{ + __asm volatile ( + "STMDB SP!, {R0} \n\t" /* Push R0. */ + "MRS R0, CPSR \n\t" /* Get CPSR. */ + "ORR R0, R0, #0xC0 \n\t" /* Disable IRQ, FIQ. */ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ + "LDMIA SP!, {R0} \n\t" /* Pop R0. */ + "BX R14" ); /* Return back to thumb. */ +} + +void vPortEnableInterruptsFromThumb( void ) +{ + __asm volatile ( + "STMDB SP!, {R0} \n\t" /* Push R0. */ + "MRS R0, CPSR \n\t" /* Get CPSR. */ + "BIC R0, R0, #0xC0 \n\t" /* Enable IRQ, FIQ. */ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ + "LDMIA SP!, {R0} \n\t" /* Pop R0. */ + "BX R14" ); /* Return back to thumb. */ +} + + +/* The code generated by the GCC compiler uses the stack in different ways at +different optimisation levels. The interrupt flags can therefore not always +be saved to the stack. Instead the critical section nesting level is stored +in a variable, which is then saved as part of the stack context. */ +void vPortEnterCritical( void ) +{ + /* Disable interrupts as per portDISABLE_INTERRUPTS(); */ + __asm volatile ( + "STMDB SP!, {R0} \n\t" /* Push R0. */ + "MRS R0, CPSR \n\t" /* Get CPSR. */ + "ORR R0, R0, #0xC0 \n\t" /* Disable IRQ, FIQ. */ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ + "LDMIA SP!, {R0}" ); /* Pop R0. */ + + /* Now interrupts are disabled ulCriticalNesting can be accessed + directly. Increment ulCriticalNesting to keep a count of how many times + portENTER_CRITICAL() has been called. */ + ulCriticalNesting++; +} + +void vPortExitCritical( void ) +{ + if( ulCriticalNesting > portNO_CRITICAL_NESTING ) + { + /* Decrement the nesting count as we are leaving a critical section. */ + ulCriticalNesting--; + + /* If the nesting level has reached zero then interrupts should be + re-enabled. */ + if( ulCriticalNesting == portNO_CRITICAL_NESTING ) + { + /* Enable interrupts as per portEXIT_CRITICAL(). */ + __asm volatile ( + "STMDB SP!, {R0} \n\t" /* Push R0. */ + "MRS R0, CPSR \n\t" /* Get CPSR. */ + "BIC R0, R0, #0xC0 \n\t" /* Enable IRQ, FIQ. */ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ + "LDMIA SP!, {R0}" ); /* Pop R0. */ + } + } +} + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM7_AT91SAM7S/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM7_AT91SAM7S/portmacro.h new file mode 100644 index 0000000..b2f6e17 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM7_AT91SAM7S/portmacro.h @@ -0,0 +1,291 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* + Changes from V3.2.3 + + + Modified portENTER_SWITCHING_ISR() to allow use with GCC V4.0.1. + + Changes from V3.2.4 + + + Removed the use of the %0 parameter within the assembler macros and + replaced them with hard coded registers. This will ensure the + assembler does not select the link register as the temp register as + was occasionally happening previously. + + + The assembler statements are now included in a single asm block rather + than each line having its own asm block. + + Changes from V4.5.0 + + + Removed the portENTER_SWITCHING_ISR() and portEXIT_SWITCHING_ISR() macros + and replaced them with portYIELD_FROM_ISR() macro. Application code + should now make use of the portSAVE_CONTEXT() and portRESTORE_CONTEXT() + macros as per the V4.5.1 demo code. +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE portLONG + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +#define portNOP() __asm volatile ( "NOP" ); +/*-----------------------------------------------------------*/ + + +/* Scheduler utilities. */ + +/* + * portRESTORE_CONTEXT, portRESTORE_CONTEXT, portENTER_SWITCHING_ISR + * and portEXIT_SWITCHING_ISR can only be called from ARM mode, but + * are included here for efficiency. An attempt to call one from + * THUMB mode code will result in a compile time error. + */ + +#define portRESTORE_CONTEXT() \ +{ \ +extern volatile void * volatile pxCurrentTCB; \ +extern volatile uint32_t ulCriticalNesting; \ + \ + /* Set the LR to the task stack. */ \ + __asm volatile ( \ + "LDR R0, =pxCurrentTCB \n\t" \ + "LDR R0, [R0] \n\t" \ + "LDR LR, [R0] \n\t" \ + \ + /* The critical nesting depth is the first item on the stack. */ \ + /* Load it into the ulCriticalNesting variable. */ \ + "LDR R0, =ulCriticalNesting \n\t" \ + "LDMFD LR!, {R1} \n\t" \ + "STR R1, [R0] \n\t" \ + \ + /* Get the SPSR from the stack. */ \ + "LDMFD LR!, {R0} \n\t" \ + "MSR SPSR, R0 \n\t" \ + \ + /* Restore all system mode registers for the task. */ \ + "LDMFD LR, {R0-R14}^ \n\t" \ + "NOP \n\t" \ + \ + /* Restore the return address. */ \ + "LDR LR, [LR, #+60] \n\t" \ + \ + /* And return - correcting the offset in the LR to obtain the */ \ + /* correct address. */ \ + "SUBS PC, LR, #4 \n\t" \ + ); \ + ( void ) ulCriticalNesting; \ + ( void ) pxCurrentTCB; \ +} +/*-----------------------------------------------------------*/ + +#define portSAVE_CONTEXT() \ +{ \ +extern volatile void * volatile pxCurrentTCB; \ +extern volatile uint32_t ulCriticalNesting; \ + \ + /* Push R0 as we are going to use the register. */ \ + __asm volatile ( \ + "STMDB SP!, {R0} \n\t" \ + \ + /* Set R0 to point to the task stack pointer. */ \ + "STMDB SP,{SP}^ \n\t" \ + "NOP \n\t" \ + "SUB SP, SP, #4 \n\t" \ + "LDMIA SP!,{R0} \n\t" \ + \ + /* Push the return address onto the stack. */ \ + "STMDB R0!, {LR} \n\t" \ + \ + /* Now we have saved LR we can use it instead of R0. */ \ + "MOV LR, R0 \n\t" \ + \ + /* Pop R0 so we can save it onto the system mode stack. */ \ + "LDMIA SP!, {R0} \n\t" \ + \ + /* Push all the system mode registers onto the task stack. */ \ + "STMDB LR,{R0-LR}^ \n\t" \ + "NOP \n\t" \ + "SUB LR, LR, #60 \n\t" \ + \ + /* Push the SPSR onto the task stack. */ \ + "MRS R0, SPSR \n\t" \ + "STMDB LR!, {R0} \n\t" \ + \ + "LDR R0, =ulCriticalNesting \n\t" \ + "LDR R0, [R0] \n\t" \ + "STMDB LR!, {R0} \n\t" \ + \ + /* Store the new top of stack for the task. */ \ + "LDR R0, =pxCurrentTCB \n\t" \ + "LDR R0, [R0] \n\t" \ + "STR LR, [R0] \n\t" \ + ); \ + ( void ) ulCriticalNesting; \ + ( void ) pxCurrentTCB; \ +} + + +#define portYIELD_FROM_ISR() vTaskSwitchContext() +#define portYIELD() __asm volatile ( "SWI 0" ) +/*-----------------------------------------------------------*/ + + +/* Critical section management. */ + +/* + * The interrupt management utilities can only be called from ARM mode. When + * THUMB_INTERWORK is defined the utilities are defined as functions in + * portISR.c to ensure a switch to ARM mode. When THUMB_INTERWORK is not + * defined then the utilities are defined as macros here - as per other ports. + */ + +#ifdef THUMB_INTERWORK + + extern void vPortDisableInterruptsFromThumb( void ) __attribute__ ((naked)); + extern void vPortEnableInterruptsFromThumb( void ) __attribute__ ((naked)); + + #define portDISABLE_INTERRUPTS() vPortDisableInterruptsFromThumb() + #define portENABLE_INTERRUPTS() vPortEnableInterruptsFromThumb() + +#else + + #define portDISABLE_INTERRUPTS() \ + __asm volatile ( \ + "STMDB SP!, {R0} \n\t" /* Push R0. */ \ + "MRS R0, CPSR \n\t" /* Get CPSR. */ \ + "ORR R0, R0, #0xC0 \n\t" /* Disable IRQ, FIQ. */ \ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ \ + "LDMIA SP!, {R0} " ) /* Pop R0. */ + + #define portENABLE_INTERRUPTS() \ + __asm volatile ( \ + "STMDB SP!, {R0} \n\t" /* Push R0. */ \ + "MRS R0, CPSR \n\t" /* Get CPSR. */ \ + "BIC R0, R0, #0xC0 \n\t" /* Enable IRQ, FIQ. */ \ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ \ + "LDMIA SP!, {R0} " ) /* Pop R0. */ + +#endif /* THUMB_INTERWORK */ + +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); + +#define portENTER_CRITICAL() vPortEnterCritical(); +#define portEXIT_CRITICAL() vPortExitCritical(); +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM7_LPC2000/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM7_LPC2000/port.c new file mode 100644 index 0000000..144b501 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM7_LPC2000/port.c @@ -0,0 +1,263 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the ARM7 port. + * + * Components that can be compiled to either ARM or THUMB mode are + * contained in this file. The ISR routines, which can only be compiled + * to ARM mode are contained in portISR.c. + *----------------------------------------------------------*/ + + +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Constants required to setup the task context. */ +#define portINITIAL_SPSR ( ( StackType_t ) 0x1f ) /* System mode, ARM mode, interrupts enabled. */ +#define portTHUMB_MODE_BIT ( ( StackType_t ) 0x20 ) +#define portINSTRUCTION_SIZE ( ( StackType_t ) 4 ) +#define portNO_CRITICAL_SECTION_NESTING ( ( StackType_t ) 0 ) + +/* Constants required to setup the tick ISR. */ +#define portENABLE_TIMER ( ( uint8_t ) 0x01 ) +#define portPRESCALE_VALUE 0x00 +#define portINTERRUPT_ON_MATCH ( ( uint32_t ) 0x01 ) +#define portRESET_COUNT_ON_MATCH ( ( uint32_t ) 0x02 ) + +/* Constants required to setup the VIC for the tick ISR. */ +#define portTIMER_VIC_CHANNEL ( ( uint32_t ) 0x0004 ) +#define portTIMER_VIC_CHANNEL_BIT ( ( uint32_t ) 0x0010 ) +#define portTIMER_VIC_ENABLE ( ( uint32_t ) 0x0020 ) + +/*-----------------------------------------------------------*/ + +/* Setup the timer to generate the tick interrupts. */ +static void prvSetupTimerInterrupt( void ); + +/* + * The scheduler can only be started from ARM mode, so + * vPortISRStartFirstSTask() is defined in portISR.c. + */ +extern void vPortISRStartFirstTask( void ); + +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been called. + * + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +StackType_t *pxOriginalTOS; + + pxOriginalTOS = pxTopOfStack; + + /* To ensure asserts in tasks.c don't fail, although in this case the assert + is not really required. */ + pxTopOfStack--; + + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. */ + + /* First on the stack is the return address - which in this case is the + start of the task. The offset is added to make the return address appear + as it would within an IRQ ISR. */ + *pxTopOfStack = ( StackType_t ) pxCode + portINSTRUCTION_SIZE; + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) 0xaaaaaaaa; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxOriginalTOS; /* Stack used when task starts goes in R13. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */ + pxTopOfStack--; + + /* When the task starts is will expect to find the function parameter in + R0. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + + /* The last thing onto the stack is the status register, which is set for + system mode, with interrupts enabled. */ + *pxTopOfStack = ( StackType_t ) portINITIAL_SPSR; + + if( ( ( uint32_t ) pxCode & 0x01UL ) != 0x00 ) + { + /* We want the task to start in thumb mode. */ + *pxTopOfStack |= portTHUMB_MODE_BIT; + } + + pxTopOfStack--; + + /* Some optimisation levels use the stack differently to others. This + means the interrupt flags cannot always be stored on the stack and will + instead be stored in a variable, which is then saved as part of the + tasks context. */ + *pxTopOfStack = portNO_CRITICAL_SECTION_NESTING; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + prvSetupTimerInterrupt(); + + /* Start the first task. */ + vPortISRStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the ARM port will require this function as there + is nothing to return to. */ +} +/*-----------------------------------------------------------*/ + +/* + * Setup the timer 0 to generate the tick interrupts at the required frequency. + */ +static void prvSetupTimerInterrupt( void ) +{ +uint32_t ulCompareMatch; +extern void ( vTickISR )( void ); + + /* A 1ms tick does not require the use of the timer prescale. This is + defaulted to zero but can be used if necessary. */ + T0_PR = portPRESCALE_VALUE; + + /* Calculate the match value required for our wanted tick rate. */ + ulCompareMatch = configCPU_CLOCK_HZ / configTICK_RATE_HZ; + + /* Protect against divide by zero. Using an if() statement still results + in a warning - hence the #if. */ + #if portPRESCALE_VALUE != 0 + { + ulCompareMatch /= ( portPRESCALE_VALUE + 1 ); + } + #endif + T0_MR0 = ulCompareMatch; + + /* Generate tick with timer 0 compare match. */ + T0_MCR = portRESET_COUNT_ON_MATCH | portINTERRUPT_ON_MATCH; + + /* Setup the VIC for the timer. */ + VICIntSelect &= ~( portTIMER_VIC_CHANNEL_BIT ); + VICIntEnable |= portTIMER_VIC_CHANNEL_BIT; + + /* The ISR installed depends on whether the preemptive or cooperative + scheduler is being used. */ + + VICVectAddr0 = ( int32_t ) vTickISR; + VICVectCntl0 = portTIMER_VIC_CHANNEL | portTIMER_VIC_ENABLE; + + /* Start the timer - interrupts are disabled when this function is called + so it is okay to do this here. */ + T0_TCR = portENABLE_TIMER; +} +/*-----------------------------------------------------------*/ + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM7_LPC2000/portISR.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM7_LPC2000/portISR.c new file mode 100644 index 0000000..36f5289 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM7_LPC2000/portISR.c @@ -0,0 +1,257 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +/*----------------------------------------------------------- + * Components that can be compiled to either ARM or THUMB mode are + * contained in port.c The ISR routines, which can only be compiled + * to ARM mode, are contained in this file. + *----------------------------------------------------------*/ + +/* + Changes from V2.5.2 + + + The critical section management functions have been changed. These no + longer modify the stack and are safe to use at all optimisation levels. + The functions are now also the same for both ARM and THUMB modes. + + Changes from V2.6.0 + + + Removed the 'static' from the definition of vNonPreemptiveTick() to + allow the demo to link when using the cooperative scheduler. + + Changes from V3.2.4 + + + The assembler statements are now included in a single asm block rather + than each line having its own asm block. +*/ + + +/* Scheduler includes. */ +#include "FreeRTOS.h" + +/* Constants required to handle interrupts. */ +#define portTIMER_MATCH_ISR_BIT ( ( uint8_t ) 0x01 ) +#define portCLEAR_VIC_INTERRUPT ( ( uint32_t ) 0 ) + +/* Constants required to handle critical sections. */ +#define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) +volatile uint32_t ulCriticalNesting = 9999UL; + +/*-----------------------------------------------------------*/ + +/* ISR to handle manual context switches (from a call to taskYIELD()). */ +void vPortYieldProcessor( void ) __attribute__((interrupt("SWI"), naked)); + +/* + * The scheduler can only be started from ARM mode, hence the inclusion of this + * function here. + */ +void vPortISRStartFirstTask( void ); +/*-----------------------------------------------------------*/ + +void vPortISRStartFirstTask( void ) +{ + /* Simply start the scheduler. This is included here as it can only be + called from ARM mode. */ + portRESTORE_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +/* + * Called by portYIELD() or taskYIELD() to manually force a context switch. + * + * When a context switch is performed from the task level the saved task + * context is made to look as if it occurred from within the tick ISR. This + * way the same restore context function can be used when restoring the context + * saved from the ISR or that saved from a call to vPortYieldProcessor. + */ +void vPortYieldProcessor( void ) +{ + /* Within an IRQ ISR the link register has an offset from the true return + address, but an SWI ISR does not. Add the offset manually so the same + ISR return code can be used in both cases. */ + __asm volatile ( "ADD LR, LR, #4" ); + + /* Perform the context switch. First save the context of the current task. */ + portSAVE_CONTEXT(); + + /* Find the highest priority task that is ready to run. */ + __asm volatile ( "bl vTaskSwitchContext" ); + + /* Restore the context of the new task. */ + portRESTORE_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +/* + * The ISR used for the scheduler tick. + */ +void vTickISR( void ) __attribute__((naked)); +void vTickISR( void ) +{ + /* Save the context of the interrupted task. */ + portSAVE_CONTEXT(); + + /* Increment the RTOS tick count, then look for the highest priority + task that is ready to run. */ + __asm volatile + ( + " bl xTaskIncrementTick \t\n" \ + " cmp r0, #0 \t\n" \ + " beq SkipContextSwitch \t\n" \ + " bl vTaskSwitchContext \t\n" \ + "SkipContextSwitch: \t\n" + ); + + /* Ready for the next interrupt. */ + T0_IR = portTIMER_MATCH_ISR_BIT; + VICVectAddr = portCLEAR_VIC_INTERRUPT; + + /* Restore the context of the new task. */ + portRESTORE_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +/* + * The interrupt management utilities can only be called from ARM mode. When + * THUMB_INTERWORK is defined the utilities are defined as functions here to + * ensure a switch to ARM mode. When THUMB_INTERWORK is not defined then + * the utilities are defined as macros in portmacro.h - as per other ports. + */ +#ifdef THUMB_INTERWORK + + void vPortDisableInterruptsFromThumb( void ) __attribute__ ((naked)); + void vPortEnableInterruptsFromThumb( void ) __attribute__ ((naked)); + + void vPortDisableInterruptsFromThumb( void ) + { + __asm volatile ( + "STMDB SP!, {R0} \n\t" /* Push R0. */ + "MRS R0, CPSR \n\t" /* Get CPSR. */ + "ORR R0, R0, #0xC0 \n\t" /* Disable IRQ, FIQ. */ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ + "LDMIA SP!, {R0} \n\t" /* Pop R0. */ + "BX R14" ); /* Return back to thumb. */ + } + + void vPortEnableInterruptsFromThumb( void ) + { + __asm volatile ( + "STMDB SP!, {R0} \n\t" /* Push R0. */ + "MRS R0, CPSR \n\t" /* Get CPSR. */ + "BIC R0, R0, #0xC0 \n\t" /* Enable IRQ, FIQ. */ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ + "LDMIA SP!, {R0} \n\t" /* Pop R0. */ + "BX R14" ); /* Return back to thumb. */ + } + +#endif /* THUMB_INTERWORK */ + +/* The code generated by the GCC compiler uses the stack in different ways at +different optimisation levels. The interrupt flags can therefore not always +be saved to the stack. Instead the critical section nesting level is stored +in a variable, which is then saved as part of the stack context. */ +void vPortEnterCritical( void ) +{ + /* Disable interrupts as per portDISABLE_INTERRUPTS(); */ + __asm volatile ( + "STMDB SP!, {R0} \n\t" /* Push R0. */ + "MRS R0, CPSR \n\t" /* Get CPSR. */ + "ORR R0, R0, #0xC0 \n\t" /* Disable IRQ, FIQ. */ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ + "LDMIA SP!, {R0}" ); /* Pop R0. */ + + /* Now interrupts are disabled ulCriticalNesting can be accessed + directly. Increment ulCriticalNesting to keep a count of how many times + portENTER_CRITICAL() has been called. */ + ulCriticalNesting++; +} + +void vPortExitCritical( void ) +{ + if( ulCriticalNesting > portNO_CRITICAL_NESTING ) + { + /* Decrement the nesting count as we are leaving a critical section. */ + ulCriticalNesting--; + + /* If the nesting level has reached zero then interrupts should be + re-enabled. */ + if( ulCriticalNesting == portNO_CRITICAL_NESTING ) + { + /* Enable interrupts as per portEXIT_CRITICAL(). */ + __asm volatile ( + "STMDB SP!, {R0} \n\t" /* Push R0. */ + "MRS R0, CPSR \n\t" /* Get CPSR. */ + "BIC R0, R0, #0xC0 \n\t" /* Enable IRQ, FIQ. */ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ + "LDMIA SP!, {R0}" ); /* Pop R0. */ + } + } +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM7_LPC2000/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM7_LPC2000/portmacro.h new file mode 100644 index 0000000..17fd21e --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM7_LPC2000/portmacro.h @@ -0,0 +1,268 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE portLONG + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +#define portNOP() __asm volatile ( "NOP" ); +/*-----------------------------------------------------------*/ + + +/* Scheduler utilities. */ + +/* + * portRESTORE_CONTEXT, portRESTORE_CONTEXT, portENTER_SWITCHING_ISR + * and portEXIT_SWITCHING_ISR can only be called from ARM mode, but + * are included here for efficiency. An attempt to call one from + * THUMB mode code will result in a compile time error. + */ + +#define portRESTORE_CONTEXT() \ +{ \ +extern volatile void * volatile pxCurrentTCB; \ +extern volatile uint32_t ulCriticalNesting; \ + \ + /* Set the LR to the task stack. */ \ + __asm volatile ( \ + "LDR R0, =pxCurrentTCB \n\t" \ + "LDR R0, [R0] \n\t" \ + "LDR LR, [R0] \n\t" \ + \ + /* The critical nesting depth is the first item on the stack. */ \ + /* Load it into the ulCriticalNesting variable. */ \ + "LDR R0, =ulCriticalNesting \n\t" \ + "LDMFD LR!, {R1} \n\t" \ + "STR R1, [R0] \n\t" \ + \ + /* Get the SPSR from the stack. */ \ + "LDMFD LR!, {R0} \n\t" \ + "MSR SPSR, R0 \n\t" \ + \ + /* Restore all system mode registers for the task. */ \ + "LDMFD LR, {R0-R14}^ \n\t" \ + "NOP \n\t" \ + \ + /* Restore the return address. */ \ + "LDR LR, [LR, #+60] \n\t" \ + \ + /* And return - correcting the offset in the LR to obtain the */ \ + /* correct address. */ \ + "SUBS PC, LR, #4 \n\t" \ + ); \ + ( void ) ulCriticalNesting; \ + ( void ) pxCurrentTCB; \ +} +/*-----------------------------------------------------------*/ + +#define portSAVE_CONTEXT() \ +{ \ +extern volatile void * volatile pxCurrentTCB; \ +extern volatile uint32_t ulCriticalNesting; \ + \ + /* Push R0 as we are going to use the register. */ \ + __asm volatile ( \ + "STMDB SP!, {R0} \n\t" \ + \ + /* Set R0 to point to the task stack pointer. */ \ + "STMDB SP,{SP}^ \n\t" \ + "NOP \n\t" \ + "SUB SP, SP, #4 \n\t" \ + "LDMIA SP!,{R0} \n\t" \ + \ + /* Push the return address onto the stack. */ \ + "STMDB R0!, {LR} \n\t" \ + \ + /* Now we have saved LR we can use it instead of R0. */ \ + "MOV LR, R0 \n\t" \ + \ + /* Pop R0 so we can save it onto the system mode stack. */ \ + "LDMIA SP!, {R0} \n\t" \ + \ + /* Push all the system mode registers onto the task stack. */ \ + "STMDB LR,{R0-LR}^ \n\t" \ + "NOP \n\t" \ + "SUB LR, LR, #60 \n\t" \ + \ + /* Push the SPSR onto the task stack. */ \ + "MRS R0, SPSR \n\t" \ + "STMDB LR!, {R0} \n\t" \ + \ + "LDR R0, =ulCriticalNesting \n\t" \ + "LDR R0, [R0] \n\t" \ + "STMDB LR!, {R0} \n\t" \ + \ + /* Store the new top of stack for the task. */ \ + "LDR R0, =pxCurrentTCB \n\t" \ + "LDR R0, [R0] \n\t" \ + "STR LR, [R0] \n\t" \ + ); \ + ( void ) ulCriticalNesting; \ + ( void ) pxCurrentTCB; \ +} + +extern void vTaskSwitchContext( void ); +#define portYIELD_FROM_ISR() vTaskSwitchContext() +#define portYIELD() __asm volatile ( "SWI 0" ) +/*-----------------------------------------------------------*/ + + +/* Critical section management. */ + +/* + * The interrupt management utilities can only be called from ARM mode. When + * THUMB_INTERWORK is defined the utilities are defined as functions in + * portISR.c to ensure a switch to ARM mode. When THUMB_INTERWORK is not + * defined then the utilities are defined as macros here - as per other ports. + */ + +#ifdef THUMB_INTERWORK + + extern void vPortDisableInterruptsFromThumb( void ) __attribute__ ((naked)); + extern void vPortEnableInterruptsFromThumb( void ) __attribute__ ((naked)); + + #define portDISABLE_INTERRUPTS() vPortDisableInterruptsFromThumb() + #define portENABLE_INTERRUPTS() vPortEnableInterruptsFromThumb() + +#else + + #define portDISABLE_INTERRUPTS() \ + __asm volatile ( \ + "STMDB SP!, {R0} \n\t" /* Push R0. */ \ + "MRS R0, CPSR \n\t" /* Get CPSR. */ \ + "ORR R0, R0, #0xC0 \n\t" /* Disable IRQ, FIQ. */ \ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ \ + "LDMIA SP!, {R0} " ) /* Pop R0. */ + + #define portENABLE_INTERRUPTS() \ + __asm volatile ( \ + "STMDB SP!, {R0} \n\t" /* Push R0. */ \ + "MRS R0, CPSR \n\t" /* Get CPSR. */ \ + "BIC R0, R0, #0xC0 \n\t" /* Enable IRQ, FIQ. */ \ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ \ + "LDMIA SP!, {R0} " ) /* Pop R0. */ + +#endif /* THUMB_INTERWORK */ + +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); + +#define portENTER_CRITICAL() vPortEnterCritical(); +#define portEXIT_CRITICAL() vPortExitCritical(); +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM7_LPC23xx/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM7_LPC23xx/port.c new file mode 100644 index 0000000..65e6979 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM7_LPC23xx/port.c @@ -0,0 +1,275 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the ARM7 port. + * + * Components that can be compiled to either ARM or THUMB mode are + * contained in this file. The ISR routines, which can only be compiled + * to ARM mode are contained in portISR.c. + *----------------------------------------------------------*/ + + +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Constants required to setup the task context. */ +#define portINITIAL_SPSR ( ( StackType_t ) 0x1f ) /* System mode, ARM mode, interrupts enabled. */ +#define portTHUMB_MODE_BIT ( ( StackType_t ) 0x20 ) +#define portINSTRUCTION_SIZE ( ( StackType_t ) 4 ) +#define portNO_CRITICAL_SECTION_NESTING ( ( StackType_t ) 0 ) + +/* Constants required to setup the tick ISR. */ +#define portENABLE_TIMER ( ( uint8_t ) 0x01 ) +#define portPRESCALE_VALUE 0x00 +#define portINTERRUPT_ON_MATCH ( ( uint32_t ) 0x01 ) +#define portRESET_COUNT_ON_MATCH ( ( uint32_t ) 0x02 ) + +/* Constants required to setup the VIC for the tick ISR. */ +#define portTIMER_VIC_CHANNEL ( ( uint32_t ) 0x0004 ) +#define portTIMER_VIC_CHANNEL_BIT ( ( uint32_t ) 0x0010 ) +#define portTIMER_VIC_ENABLE ( ( uint32_t ) 0x0020 ) + +/*-----------------------------------------------------------*/ + +/* Setup the timer to generate the tick interrupts. */ +static void prvSetupTimerInterrupt( void ); + +/* + * The scheduler can only be started from ARM mode, so + * vPortISRStartFirstSTask() is defined in portISR.c. + */ +extern void vPortISRStartFirstTask( void ); + +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been called. + * + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +StackType_t *pxOriginalTOS; + + pxOriginalTOS = pxTopOfStack; + + /* To ensure asserts in tasks.c don't fail, although in this case the assert + is not really required. */ + pxTopOfStack--; + + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. */ + + /* First on the stack is the return address - which in this case is the + start of the task. The offset is added to make the return address appear + as it would within an IRQ ISR. */ + *pxTopOfStack = ( StackType_t ) pxCode + portINSTRUCTION_SIZE; + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) 0x00000000; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxOriginalTOS; /* Stack used when task starts goes in R13. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */ + pxTopOfStack--; + + /* When the task starts is will expect to find the function parameter in + R0. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + + /* The last thing onto the stack is the status register, which is set for + system mode, with interrupts enabled. */ + *pxTopOfStack = ( StackType_t ) portINITIAL_SPSR; + + if( ( ( uint32_t ) pxCode & 0x01UL ) != 0x00 ) + { + /* We want the task to start in thumb mode. */ + *pxTopOfStack |= portTHUMB_MODE_BIT; + } + + pxTopOfStack--; + + /* Some optimisation levels use the stack differently to others. This + means the interrupt flags cannot always be stored on the stack and will + instead be stored in a variable, which is then saved as part of the + tasks context. */ + *pxTopOfStack = portNO_CRITICAL_SECTION_NESTING; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + prvSetupTimerInterrupt(); + + /* Start the first task. */ + vPortISRStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the ARM port will require this function as there + is nothing to return to. */ +} +/*-----------------------------------------------------------*/ + +/* + * Setup the timer 0 to generate the tick interrupts at the required frequency. + */ +static void prvSetupTimerInterrupt( void ) +{ +uint32_t ulCompareMatch; + + PCLKSEL0 = (PCLKSEL0 & (~(0x3<<2))) | (0x01 << 2); + T0TCR = 2; /* Stop and reset the timer */ + T0CTCR = 0; /* Timer mode */ + + /* A 1ms tick does not require the use of the timer prescale. This is + defaulted to zero but can be used if necessary. */ + T0PR = portPRESCALE_VALUE; + + /* Calculate the match value required for our wanted tick rate. */ + ulCompareMatch = configCPU_CLOCK_HZ / configTICK_RATE_HZ; + + /* Protect against divide by zero. Using an if() statement still results + in a warning - hence the #if. */ + #if portPRESCALE_VALUE != 0 + { + ulCompareMatch /= ( portPRESCALE_VALUE + 1 ); + } + #endif + T0MR1 = ulCompareMatch; + + /* Generate tick with timer 0 compare match. */ + T0MCR = (3 << 3); /* Reset timer on match and generate interrupt */ + + /* Setup the VIC for the timer. */ + VICIntEnable = 0x00000010; + + /* The ISR installed depends on whether the preemptive or cooperative + scheduler is being used. */ + #if configUSE_PREEMPTION == 1 + { + extern void ( vPreemptiveTick )( void ); + VICVectAddr4 = ( int32_t ) vPreemptiveTick; + } + #else + { + extern void ( vNonPreemptiveTick )( void ); + VICVectAddr4 = ( int32_t ) vNonPreemptiveTick; + } + #endif + + VICVectCntl4 = 1; + + /* Start the timer - interrupts are disabled when this function is called + so it is okay to do this here. */ + T0TCR = portENABLE_TIMER; +} +/*-----------------------------------------------------------*/ + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM7_LPC23xx/portISR.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM7_LPC23xx/portISR.c new file mode 100644 index 0000000..3954b32 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM7_LPC23xx/portISR.c @@ -0,0 +1,260 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +/*----------------------------------------------------------- + * Components that can be compiled to either ARM or THUMB mode are + * contained in port.c The ISR routines, which can only be compiled + * to ARM mode, are contained in this file. + *----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Constants required to handle interrupts. */ +#define portTIMER_MATCH_ISR_BIT ( ( uint8_t ) 0x01 ) +#define portCLEAR_VIC_INTERRUPT ( ( uint32_t ) 0 ) + +/* Constants required to handle critical sections. */ +#define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) +volatile uint32_t ulCriticalNesting = 9999UL; + +/*-----------------------------------------------------------*/ + +/* ISR to handle manual context switches (from a call to taskYIELD()). */ +void vPortYieldProcessor( void ) __attribute__((interrupt("SWI"), naked)); + +/* + * The scheduler can only be started from ARM mode, hence the inclusion of this + * function here. + */ +void vPortISRStartFirstTask( void ); +/*-----------------------------------------------------------*/ + +void vPortISRStartFirstTask( void ) +{ + /* Simply start the scheduler. This is included here as it can only be + called from ARM mode. */ + portRESTORE_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +/* + * Called by portYIELD() or taskYIELD() to manually force a context switch. + * + * When a context switch is performed from the task level the saved task + * context is made to look as if it occurred from within the tick ISR. This + * way the same restore context function can be used when restoring the context + * saved from the ISR or that saved from a call to vPortYieldProcessor. + */ +void vPortYieldProcessor( void ) +{ + /* Within an IRQ ISR the link register has an offset from the true return + address, but an SWI ISR does not. Add the offset manually so the same + ISR return code can be used in both cases. */ + __asm volatile ( "ADD LR, LR, #4" ); + + /* Perform the context switch. First save the context of the current task. */ + portSAVE_CONTEXT(); + + /* Find the highest priority task that is ready to run. */ + __asm volatile( "bl vTaskSwitchContext" ); + + /* Restore the context of the new task. */ + portRESTORE_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +/* + * The ISR used for the scheduler tick depends on whether the cooperative or + * the preemptive scheduler is being used. + */ + + +#if configUSE_PREEMPTION == 0 + + /* The cooperative scheduler requires a normal IRQ service routine to + simply increment the system tick. */ + void vNonPreemptiveTick( void ) __attribute__ ((interrupt ("IRQ"))); + void vNonPreemptiveTick( void ) + { + xTaskIncrementTick(); + T0IR = 2; + VICVectAddr = portCLEAR_VIC_INTERRUPT; + } + +#else + + /* The preemptive scheduler is defined as "naked" as the full context is + saved on entry as part of the context switch. */ + void vPreemptiveTick( void ) __attribute__((naked)); + void vPreemptiveTick( void ) + { + /* Save the context of the interrupted task. */ + portSAVE_CONTEXT(); + + /* Increment the RTOS tick count, then look for the highest priority + task that is ready to run. */ + __asm volatile + ( + " bl xTaskIncrementTick \t\n" \ + " cmp r0, #0 \t\n" \ + " beq SkipContextSwitch \t\n" \ + " bl vTaskSwitchContext \t\n" \ + "SkipContextSwitch: \t\n" + ); + + /* Ready for the next interrupt. */ + T0IR = 2; + VICVectAddr = portCLEAR_VIC_INTERRUPT; + + /* Restore the context of the new task. */ + portRESTORE_CONTEXT(); + } + +#endif +/*-----------------------------------------------------------*/ + +/* + * The interrupt management utilities can only be called from ARM mode. When + * THUMB_INTERWORK is defined the utilities are defined as functions here to + * ensure a switch to ARM mode. When THUMB_INTERWORK is not defined then + * the utilities are defined as macros in portmacro.h - as per other ports. + */ +#ifdef THUMB_INTERWORK + + void vPortDisableInterruptsFromThumb( void ) __attribute__ ((naked)); + void vPortEnableInterruptsFromThumb( void ) __attribute__ ((naked)); + + void vPortDisableInterruptsFromThumb( void ) + { + __asm volatile ( + "STMDB SP!, {R0} \n\t" /* Push R0. */ + "MRS R0, CPSR \n\t" /* Get CPSR. */ + "ORR R0, R0, #0xC0 \n\t" /* Disable IRQ, FIQ. */ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ + "LDMIA SP!, {R0} \n\t" /* Pop R0. */ + "BX R14" ); /* Return back to thumb. */ + } + + void vPortEnableInterruptsFromThumb( void ) + { + __asm volatile ( + "STMDB SP!, {R0} \n\t" /* Push R0. */ + "MRS R0, CPSR \n\t" /* Get CPSR. */ + "BIC R0, R0, #0xC0 \n\t" /* Enable IRQ, FIQ. */ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ + "LDMIA SP!, {R0} \n\t" /* Pop R0. */ + "BX R14" ); /* Return back to thumb. */ + } + +#endif /* THUMB_INTERWORK */ + +/* The code generated by the GCC compiler uses the stack in different ways at +different optimisation levels. The interrupt flags can therefore not always +be saved to the stack. Instead the critical section nesting level is stored +in a variable, which is then saved as part of the stack context. */ +void vPortEnterCritical( void ) +{ + /* Disable interrupts as per portDISABLE_INTERRUPTS(); */ + __asm volatile ( + "STMDB SP!, {R0} \n\t" /* Push R0. */ + "MRS R0, CPSR \n\t" /* Get CPSR. */ + "ORR R0, R0, #0xC0 \n\t" /* Disable IRQ, FIQ. */ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ + "LDMIA SP!, {R0}" ); /* Pop R0. */ + + /* Now interrupts are disabled ulCriticalNesting can be accessed + directly. Increment ulCriticalNesting to keep a count of how many times + portENTER_CRITICAL() has been called. */ + ulCriticalNesting++; +} + +void vPortExitCritical( void ) +{ + if( ulCriticalNesting > portNO_CRITICAL_NESTING ) + { + /* Decrement the nesting count as we are leaving a critical section. */ + ulCriticalNesting--; + + /* If the nesting level has reached zero then interrupts should be + re-enabled. */ + if( ulCriticalNesting == portNO_CRITICAL_NESTING ) + { + /* Enable interrupts as per portEXIT_CRITICAL(). */ + __asm volatile ( + "STMDB SP!, {R0} \n\t" /* Push R0. */ + "MRS R0, CPSR \n\t" /* Get CPSR. */ + "BIC R0, R0, #0xC0 \n\t" /* Enable IRQ, FIQ. */ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ + "LDMIA SP!, {R0}" ); /* Pop R0. */ + } + } +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM7_LPC23xx/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM7_LPC23xx/portmacro.h new file mode 100644 index 0000000..c6b00fd --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM7_LPC23xx/portmacro.h @@ -0,0 +1,291 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* + Changes from V3.2.3 + + + Modified portENTER_SWITCHING_ISR() to allow use with GCC V4.0.1. + + Changes from V3.2.4 + + + Removed the use of the %0 parameter within the assembler macros and + replaced them with hard coded registers. This will ensure the + assembler does not select the link register as the temp register as + was occasionally happening previously. + + + The assembler statements are now included in a single asm block rather + than each line having its own asm block. + + Changes from V4.5.0 + + + Removed the portENTER_SWITCHING_ISR() and portEXIT_SWITCHING_ISR() macros + and replaced them with portYIELD_FROM_ISR() macro. Application code + should now make use of the portSAVE_CONTEXT() and portRESTORE_CONTEXT() + macros as per the V4.5.1 demo code. +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE portLONG + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +#define portNOP() __asm volatile ( "NOP" ); +/*-----------------------------------------------------------*/ + + +/* Scheduler utilities. */ + +/* + * portRESTORE_CONTEXT, portRESTORE_CONTEXT, portENTER_SWITCHING_ISR + * and portEXIT_SWITCHING_ISR can only be called from ARM mode, but + * are included here for efficiency. An attempt to call one from + * THUMB mode code will result in a compile time error. + */ + +#define portRESTORE_CONTEXT() \ +{ \ +extern volatile void * volatile pxCurrentTCB; \ +extern volatile uint32_t ulCriticalNesting; \ + \ + /* Set the LR to the task stack. */ \ + __asm volatile ( \ + "LDR R0, =pxCurrentTCB \n\t" \ + "LDR R0, [R0] \n\t" \ + "LDR LR, [R0] \n\t" \ + \ + /* The critical nesting depth is the first item on the stack. */ \ + /* Load it into the ulCriticalNesting variable. */ \ + "LDR R0, =ulCriticalNesting \n\t" \ + "LDMFD LR!, {R1} \n\t" \ + "STR R1, [R0] \n\t" \ + \ + /* Get the SPSR from the stack. */ \ + "LDMFD LR!, {R0} \n\t" \ + "MSR SPSR, R0 \n\t" \ + \ + /* Restore all system mode registers for the task. */ \ + "LDMFD LR, {R0-R14}^ \n\t" \ + "NOP \n\t" \ + \ + /* Restore the return address. */ \ + "LDR LR, [LR, #+60] \n\t" \ + \ + /* And return - correcting the offset in the LR to obtain the */ \ + /* correct address. */ \ + "SUBS PC, LR, #4 \n\t" \ + ); \ + ( void ) ulCriticalNesting; \ + ( void ) pxCurrentTCB; \ +} +/*-----------------------------------------------------------*/ + +#define portSAVE_CONTEXT() \ +{ \ +extern volatile void * volatile pxCurrentTCB; \ +extern volatile uint32_t ulCriticalNesting; \ + \ + /* Push R0 as we are going to use the register. */ \ + __asm volatile ( \ + "STMDB SP!, {R0} \n\t" \ + \ + /* Set R0 to point to the task stack pointer. */ \ + "STMDB SP,{SP}^ \n\t" \ + "NOP \n\t" \ + "SUB SP, SP, #4 \n\t" \ + "LDMIA SP!,{R0} \n\t" \ + \ + /* Push the return address onto the stack. */ \ + "STMDB R0!, {LR} \n\t" \ + \ + /* Now we have saved LR we can use it instead of R0. */ \ + "MOV LR, R0 \n\t" \ + \ + /* Pop R0 so we can save it onto the system mode stack. */ \ + "LDMIA SP!, {R0} \n\t" \ + \ + /* Push all the system mode registers onto the task stack. */ \ + "STMDB LR,{R0-LR}^ \n\t" \ + "NOP \n\t" \ + "SUB LR, LR, #60 \n\t" \ + \ + /* Push the SPSR onto the task stack. */ \ + "MRS R0, SPSR \n\t" \ + "STMDB LR!, {R0} \n\t" \ + \ + "LDR R0, =ulCriticalNesting \n\t" \ + "LDR R0, [R0] \n\t" \ + "STMDB LR!, {R0} \n\t" \ + \ + /* Store the new top of stack for the task. */ \ + "LDR R0, =pxCurrentTCB \n\t" \ + "LDR R0, [R0] \n\t" \ + "STR LR, [R0] \n\t" \ + ); \ + ( void ) ulCriticalNesting; \ + ( void ) pxCurrentTCB; \ +} + + +#define portYIELD_FROM_ISR() vTaskSwitchContext() +#define portYIELD() __asm volatile ( "SWI 0" ) +/*-----------------------------------------------------------*/ + + +/* Critical section management. */ + +/* + * The interrupt management utilities can only be called from ARM mode. When + * THUMB_INTERWORK is defined the utilities are defined as functions in + * portISR.c to ensure a switch to ARM mode. When THUMB_INTERWORK is not + * defined then the utilities are defined as macros here - as per other ports. + */ + +#ifdef THUMB_INTERWORK + + extern void vPortDisableInterruptsFromThumb( void ) __attribute__ ((naked)); + extern void vPortEnableInterruptsFromThumb( void ) __attribute__ ((naked)); + + #define portDISABLE_INTERRUPTS() vPortDisableInterruptsFromThumb() + #define portENABLE_INTERRUPTS() vPortEnableInterruptsFromThumb() + +#else + + #define portDISABLE_INTERRUPTS() \ + __asm volatile ( \ + "STMDB SP!, {R0} \n\t" /* Push R0. */ \ + "MRS R0, CPSR \n\t" /* Get CPSR. */ \ + "ORR R0, R0, #0xC0 \n\t" /* Disable IRQ, FIQ. */ \ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ \ + "LDMIA SP!, {R0} " ) /* Pop R0. */ + + #define portENABLE_INTERRUPTS() \ + __asm volatile ( \ + "STMDB SP!, {R0} \n\t" /* Push R0. */ \ + "MRS R0, CPSR \n\t" /* Get CPSR. */ \ + "BIC R0, R0, #0xC0 \n\t" /* Enable IRQ, FIQ. */ \ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ \ + "LDMIA SP!, {R0} " ) /* Pop R0. */ + +#endif /* THUMB_INTERWORK */ + +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); + +#define portENTER_CRITICAL() vPortEnterCritical(); +#define portEXIT_CRITICAL() vPortExitCritical(); +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CA53_64_BIT/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CA53_64_BIT/port.c new file mode 100644 index 0000000..51c7508 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CA53_64_BIT/port.c @@ -0,0 +1,542 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#ifndef configINTERRUPT_CONTROLLER_BASE_ADDRESS + #error configINTERRUPT_CONTROLLER_BASE_ADDRESS must be defined. See http://www.freertos.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html +#endif + +#ifndef configINTERRUPT_CONTROLLER_CPU_INTERFACE_OFFSET + #error configINTERRUPT_CONTROLLER_CPU_INTERFACE_OFFSET must be defined. See http://www.freertos.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html +#endif + +#ifndef configUNIQUE_INTERRUPT_PRIORITIES + #error configUNIQUE_INTERRUPT_PRIORITIES must be defined. See http://www.freertos.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html +#endif + +#ifndef configSETUP_TICK_INTERRUPT + #error configSETUP_TICK_INTERRUPT() must be defined. See http://www.freertos.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html +#endif /* configSETUP_TICK_INTERRUPT */ + +#ifndef configMAX_API_CALL_INTERRUPT_PRIORITY + #error configMAX_API_CALL_INTERRUPT_PRIORITY must be defined. See http://www.freertos.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html +#endif + +#if configMAX_API_CALL_INTERRUPT_PRIORITY == 0 + #error configMAX_API_CALL_INTERRUPT_PRIORITY must not be set to 0 +#endif + +#if configMAX_API_CALL_INTERRUPT_PRIORITY > configUNIQUE_INTERRUPT_PRIORITIES + #error configMAX_API_CALL_INTERRUPT_PRIORITY must be less than or equal to configUNIQUE_INTERRUPT_PRIORITIES as the lower the numeric priority value the higher the logical interrupt priority +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +/* In case security extensions are implemented. */ +#if configMAX_API_CALL_INTERRUPT_PRIORITY <= ( configUNIQUE_INTERRUPT_PRIORITIES / 2 ) + #error configMAX_API_CALL_INTERRUPT_PRIORITY must be greater than ( configUNIQUE_INTERRUPT_PRIORITIES / 2 ) +#endif + +/* Some vendor specific files default configCLEAR_TICK_INTERRUPT() in +portmacro.h. */ +#ifndef configCLEAR_TICK_INTERRUPT + #define configCLEAR_TICK_INTERRUPT() +#endif + +/* A critical section is exited when the critical section nesting count reaches +this value. */ +#define portNO_CRITICAL_NESTING ( ( size_t ) 0 ) + +/* In all GICs 255 can be written to the priority mask register to unmask all +(but the lowest) interrupt priority. */ +#define portUNMASK_VALUE ( 0xFFUL ) + +/* Tasks are not created with a floating point context, but can be given a +floating point context after they have been created. A variable is stored as +part of the tasks context that holds portNO_FLOATING_POINT_CONTEXT if the task +does not have an FPU context, or any other value if the task does have an FPU +context. */ +#define portNO_FLOATING_POINT_CONTEXT ( ( StackType_t ) 0 ) + +/* Constants required to setup the initial task context. */ +#define portEL3 ( ( StackType_t ) 0x0c ) +#define portSP_ELx ( ( StackType_t ) 0x01 ) +#define portSP_EL0 ( ( StackType_t ) 0x00 ) + +/* At the time of writing, the BSP only supports EL3. */ +#define portINITIAL_PSTATE ( portEL3 | portSP_EL0 ) + +/* Used by portASSERT_IF_INTERRUPT_PRIORITY_INVALID() when ensuring the binary +point is zero. */ +#define portBINARY_POINT_BITS ( ( uint8_t ) 0x03 ) + +/* Masks all bits in the APSR other than the mode bits. */ +#define portAPSR_MODE_BITS_MASK ( 0x0C ) + +/* The I bit in the DAIF bits. */ +#define portDAIF_I ( 0x80 ) + +/* Macro to unmask all interrupt priorities. */ +#define portCLEAR_INTERRUPT_MASK() \ +{ \ + portDISABLE_INTERRUPTS(); \ + portICCPMR_PRIORITY_MASK_REGISTER = portUNMASK_VALUE; \ + __asm volatile ( "DSB SY \n" \ + "ISB SY \n" ); \ + portENABLE_INTERRUPTS(); \ +} + +/* Hardware specifics used when sanity checking the configuration. */ +#define portINTERRUPT_PRIORITY_REGISTER_OFFSET 0x400UL +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portBIT_0_SET ( ( uint8_t ) 0x01 ) + +/*-----------------------------------------------------------*/ + +/* + * Starts the first task executing. This function is necessarily written in + * assembly code so is implemented in portASM.s. + */ +extern void vPortRestoreTaskContext( void ); + +/*-----------------------------------------------------------*/ + +/* A variable is used to keep track of the critical section nesting. This +variable has to be stored as part of the task context and must be initialised to +a non zero value to ensure interrupts don't inadvertently become unmasked before +the scheduler starts. As it is stored as part of the task context it will +automatically be set to 0 when the first task is started. */ +volatile uint64_t ullCriticalNesting = 9999ULL; + +/* Saved as part of the task context. If ullPortTaskHasFPUContext is non-zero +then floating point context must be saved and restored for the task. */ +uint64_t ullPortTaskHasFPUContext = pdFALSE; + +/* Set to 1 to pend a context switch from an ISR. */ +uint64_t ullPortYieldRequired = pdFALSE; + +/* Counts the interrupt nesting depth. A context switch is only performed if +if the nesting depth is 0. */ +uint64_t ullPortInterruptNesting = 0; + +/* Used in the ASM code. */ +__attribute__(( used )) const uint64_t ullICCEOIR = portICCEOIR_END_OF_INTERRUPT_REGISTER_ADDRESS; +__attribute__(( used )) const uint64_t ullICCIAR = portICCIAR_INTERRUPT_ACKNOWLEDGE_REGISTER_ADDRESS; +__attribute__(( used )) const uint64_t ullICCPMR = portICCPMR_PRIORITY_MASK_REGISTER_ADDRESS; +__attribute__(( used )) const uint64_t ullMaxAPIPriorityMask = ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ); + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. */ + + /* First all the general purpose registers. */ + pxTopOfStack--; + *pxTopOfStack = 0x0101010101010101ULL; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + *pxTopOfStack = 0x0303030303030303ULL; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = 0x0202020202020202ULL; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = 0x0505050505050505ULL; /* R5 */ + pxTopOfStack--; + *pxTopOfStack = 0x0404040404040404ULL; /* R4 */ + pxTopOfStack--; + *pxTopOfStack = 0x0707070707070707ULL; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = 0x0606060606060606ULL; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = 0x0909090909090909ULL; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = 0x0808080808080808ULL; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = 0x1111111111111111ULL; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = 0x1010101010101010ULL; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = 0x1313131313131313ULL; /* R13 */ + pxTopOfStack--; + *pxTopOfStack = 0x1212121212121212ULL; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = 0x1515151515151515ULL; /* R15 */ + pxTopOfStack--; + *pxTopOfStack = 0x1414141414141414ULL; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = 0x1717171717171717ULL; /* R17 */ + pxTopOfStack--; + *pxTopOfStack = 0x1616161616161616ULL; /* R16 */ + pxTopOfStack--; + *pxTopOfStack = 0x1919191919191919ULL; /* R19 */ + pxTopOfStack--; + *pxTopOfStack = 0x1818181818181818ULL; /* R18 */ + pxTopOfStack--; + *pxTopOfStack = 0x2121212121212121ULL; /* R21 */ + pxTopOfStack--; + *pxTopOfStack = 0x2020202020202020ULL; /* R20 */ + pxTopOfStack--; + *pxTopOfStack = 0x2323232323232323ULL; /* R23 */ + pxTopOfStack--; + *pxTopOfStack = 0x2222222222222222ULL; /* R22 */ + pxTopOfStack--; + *pxTopOfStack = 0x2525252525252525ULL; /* R25 */ + pxTopOfStack--; + *pxTopOfStack = 0x2424242424242424ULL; /* R24 */ + pxTopOfStack--; + *pxTopOfStack = 0x2727272727272727ULL; /* R27 */ + pxTopOfStack--; + *pxTopOfStack = 0x2626262626262626ULL; /* R26 */ + pxTopOfStack--; + *pxTopOfStack = 0x2929292929292929ULL; /* R29 */ + pxTopOfStack--; + *pxTopOfStack = 0x2828282828282828ULL; /* R28 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x00; /* XZR - has no effect, used so there are an even number of registers. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x00; /* R30 - procedure call link register. */ + pxTopOfStack--; + + *pxTopOfStack = portINITIAL_PSTATE; + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) pxCode; /* Exception return address. */ + pxTopOfStack--; + + /* The task will start with a critical nesting count of 0 as interrupts are + enabled. */ + *pxTopOfStack = portNO_CRITICAL_NESTING; + pxTopOfStack--; + + /* The task will start without a floating point context. A task that uses + the floating point hardware must call vPortTaskUsesFPU() before executing + any floating point instructions. */ + *pxTopOfStack = portNO_FLOATING_POINT_CONTEXT; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +uint32_t ulAPSR; + + #if( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( configINTERRUPT_CONTROLLER_BASE_ADDRESS + portINTERRUPT_PRIORITY_REGISTER_OFFSET ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine how many priority bits are implemented in the GIC. + + Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to + all possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* Shift to the least significant bits. */ + while( ( ucMaxPriorityValue & portBIT_0_SET ) != portBIT_0_SET ) + { + ucMaxPriorityValue >>= ( uint8_t ) 0x01; + } + + /* Sanity check configUNIQUE_INTERRUPT_PRIORITIES matches the read + value. */ + configASSERT( ucMaxPriorityValue == portLOWEST_INTERRUPT_PRIORITY ); + + /* Restore the clobbered interrupt priority register to its original + value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* conifgASSERT_DEFINED */ + + + /* At the time of writing, the BSP only supports EL3. */ + __asm volatile ( "MRS %0, CurrentEL" : "=r" ( ulAPSR ) ); + ulAPSR &= portAPSR_MODE_BITS_MASK; + configASSERT( ulAPSR == portEL3 ); + + if( ulAPSR == portEL3 ) + { + /* Only continue if the binary point value is set to its lowest possible + setting. See the comments in vPortValidateInterruptPriority() below for + more information. */ + configASSERT( ( portICCBPR_BINARY_POINT_REGISTER & portBINARY_POINT_BITS ) <= portMAX_BINARY_POINT_VALUE ); + + if( ( portICCBPR_BINARY_POINT_REGISTER & portBINARY_POINT_BITS ) <= portMAX_BINARY_POINT_VALUE ) + { + /* Interrupts are turned off in the CPU itself to ensure a tick does + not execute while the scheduler is being started. Interrupts are + automatically turned back on in the CPU when the first task starts + executing. */ + portDISABLE_INTERRUPTS(); + + /* Start the timer that generates the tick ISR. */ + configSETUP_TICK_INTERRUPT(); + + /* Start the first task executing. */ + vPortRestoreTaskContext(); + } + } + + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( ullCriticalNesting == 1000ULL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + /* Mask interrupts up to the max syscall interrupt priority. */ + uxPortSetInterruptMask(); + + /* Now interrupts are disabled ullCriticalNesting can be accessed + directly. Increment ullCriticalNesting to keep a count of how many times + portENTER_CRITICAL() has been called. */ + ullCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + assert() if it is being called from an interrupt context. Only API + functions that end in "FromISR" can be used in an interrupt. Only assert if + the critical nesting count is 1 to protect against recursive calls if the + assert function also uses a critical section. */ + if( ullCriticalNesting == 1ULL ) + { + configASSERT( ullPortInterruptNesting == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + if( ullCriticalNesting > portNO_CRITICAL_NESTING ) + { + /* Decrement the nesting count as the critical section is being + exited. */ + ullCriticalNesting--; + + /* If the nesting level has reached zero then all interrupt + priorities must be re-enabled. */ + if( ullCriticalNesting == portNO_CRITICAL_NESTING ) + { + /* Critical nesting has reached zero so all interrupt priorities + should be unmasked. */ + portCLEAR_INTERRUPT_MASK(); + } + } +} +/*-----------------------------------------------------------*/ + +void FreeRTOS_Tick_Handler( void ) +{ + /* Must be the lowest possible priority. */ + configASSERT( portICCRPR_RUNNING_PRIORITY_REGISTER == ( uint32_t ) ( portLOWEST_USABLE_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ) ); + + /* Interrupts should not be enabled before this point. */ + #if( configASSERT_DEFINED == 1 ) + { + uint32_t ulMaskBits; + + __asm volatile( "mrs %0, daif" : "=r"( ulMaskBits ) ); + configASSERT( ( ulMaskBits & portDAIF_I ) != 0 ); + } + #endif /* configASSERT_DEFINED */ + + /* Set interrupt mask before altering scheduler structures. The tick + handler runs at the lowest priority, so interrupts cannot already be masked, + so there is no need to save and restore the current mask value. It is + necessary to turn off interrupts in the CPU itself while the ICCPMR is being + updated. */ + portICCPMR_PRIORITY_MASK_REGISTER = ( uint32_t ) ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ); + __asm volatile ( "dsb sy \n" + "isb sy \n" ); + + /* Ok to enable interrupts after the interrupt source has been cleared. */ + configCLEAR_TICK_INTERRUPT(); + portENABLE_INTERRUPTS(); + + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + ullPortYieldRequired = pdTRUE; + } + + /* Ensure all interrupt priorities are active again. */ + portCLEAR_INTERRUPT_MASK(); +} +/*-----------------------------------------------------------*/ + +void vPortTaskUsesFPU( void ) +{ + /* A task is registering the fact that it needs an FPU context. Set the + FPU flag (which is saved as part of the task context). */ + ullPortTaskHasFPUContext = pdTRUE; + + /* Consider initialising the FPSR here - but probably not necessary in + AArch64. */ +} +/*-----------------------------------------------------------*/ + +void vPortClearInterruptMask( UBaseType_t uxNewMaskValue ) +{ + if( uxNewMaskValue == pdFALSE ) + { + portCLEAR_INTERRUPT_MASK(); + } +} +/*-----------------------------------------------------------*/ + +UBaseType_t uxPortSetInterruptMask( void ) +{ +uint32_t ulReturn; + + /* Interrupt in the CPU must be turned off while the ICCPMR is being + updated. */ + portDISABLE_INTERRUPTS(); + if( portICCPMR_PRIORITY_MASK_REGISTER == ( uint32_t ) ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ) ) + { + /* Interrupts were already masked. */ + ulReturn = pdTRUE; + } + else + { + ulReturn = pdFALSE; + portICCPMR_PRIORITY_MASK_REGISTER = ( uint32_t ) ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ); + __asm volatile ( "dsb sy \n" + "isb sy \n" ); + } + portENABLE_INTERRUPTS(); + + return ulReturn; +} +/*-----------------------------------------------------------*/ + +#if( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + /* The following assertion will fail if a service routine (ISR) for + an interrupt that has been assigned a priority above + configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + function. ISR safe FreeRTOS API functions must *only* be called + from interrupts that have been assigned a priority at or below + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Numerically low interrupt priority numbers represent logically high + interrupt priorities, therefore the priority of the interrupt must + be set to a value equal to or numerically *higher* than + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + FreeRTOS maintains separate thread and ISR API functions to ensure + interrupt entry is as fast and simple as possible. */ + configASSERT( portICCRPR_RUNNING_PRIORITY_REGISTER >= ( uint32_t ) ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ) ); + + /* Priority grouping: The interrupt controller (GIC) allows the bits + that define each interrupt's priority to be split between bits that + define the interrupt's pre-emption priority bits and bits that define + the interrupt's sub-priority. For simplicity all bits must be defined + to be pre-emption priority bits. The following assertion will fail if + this is not the case (if some bits represent a sub-priority). + + The priority grouping is configured by the GIC's binary point register + (ICCBPR). Writting 0 to ICCBPR will ensure it is set to its lowest + possible value (which may be above 0). */ + configASSERT( ( portICCBPR_BINARY_POINT_REGISTER & portBINARY_POINT_BITS ) <= portMAX_BINARY_POINT_VALUE ); + } + +#endif /* configASSERT_DEFINED */ +/*-----------------------------------------------------------*/ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CA53_64_BIT/portASM.S b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CA53_64_BIT/portASM.S new file mode 100644 index 0000000..ad12a68 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CA53_64_BIT/portASM.S @@ -0,0 +1,435 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + .text + + /* Variables and functions. */ + .extern ullMaxAPIPriorityMask + .extern pxCurrentTCB + .extern vTaskSwitchContext + .extern vApplicationIRQHandler + .extern ullPortInterruptNesting + .extern ullPortTaskHasFPUContext + .extern ullCriticalNesting + .extern ullPortYieldRequired + .extern ullICCEOIR + .extern ullICCIAR + .extern _freertos_vector_table + + .global FreeRTOS_IRQ_Handler + .global FreeRTOS_SWI_Handler + .global vPortRestoreTaskContext + + +.macro portSAVE_CONTEXT + + /* Switch to use the EL0 stack pointer. */ + MSR SPSEL, #0 + + /* Save the entire context. */ + STP X0, X1, [SP, #-0x10]! + STP X2, X3, [SP, #-0x10]! + STP X4, X5, [SP, #-0x10]! + STP X6, X7, [SP, #-0x10]! + STP X8, X9, [SP, #-0x10]! + STP X10, X11, [SP, #-0x10]! + STP X12, X13, [SP, #-0x10]! + STP X14, X15, [SP, #-0x10]! + STP X16, X17, [SP, #-0x10]! + STP X18, X19, [SP, #-0x10]! + STP X20, X21, [SP, #-0x10]! + STP X22, X23, [SP, #-0x10]! + STP X24, X25, [SP, #-0x10]! + STP X26, X27, [SP, #-0x10]! + STP X28, X29, [SP, #-0x10]! + STP X30, XZR, [SP, #-0x10]! + + /* Save the SPSR. */ + MRS X3, SPSR_EL3 + + /* Save the ELR. */ + MRS X2, ELR_EL3 + + STP X2, X3, [SP, #-0x10]! + + /* Save the critical section nesting depth. */ + LDR X0, ullCriticalNestingConst + LDR X3, [X0] + + /* Save the FPU context indicator. */ + LDR X0, ullPortTaskHasFPUContextConst + LDR X2, [X0] + + /* Save the FPU context, if any (32 128-bit registers). */ + CMP X2, #0 + B.EQ 1f + STP Q0, Q1, [SP,#-0x20]! + STP Q2, Q3, [SP,#-0x20]! + STP Q4, Q5, [SP,#-0x20]! + STP Q6, Q7, [SP,#-0x20]! + STP Q8, Q9, [SP,#-0x20]! + STP Q10, Q11, [SP,#-0x20]! + STP Q12, Q13, [SP,#-0x20]! + STP Q14, Q15, [SP,#-0x20]! + STP Q16, Q17, [SP,#-0x20]! + STP Q18, Q19, [SP,#-0x20]! + STP Q20, Q21, [SP,#-0x20]! + STP Q22, Q23, [SP,#-0x20]! + STP Q24, Q25, [SP,#-0x20]! + STP Q26, Q27, [SP,#-0x20]! + STP Q28, Q29, [SP,#-0x20]! + STP Q30, Q31, [SP,#-0x20]! + +1: + /* Store the critical nesting count and FPU context indicator. */ + STP X2, X3, [SP, #-0x10]! + + LDR X0, pxCurrentTCBConst + LDR X1, [X0] + MOV X0, SP /* Move SP into X0 for saving. */ + STR X0, [X1] + + /* Switch to use the ELx stack pointer. */ + MSR SPSEL, #1 + + .endm + +; /**********************************************************************/ + +.macro portRESTORE_CONTEXT + + /* Switch to use the EL0 stack pointer. */ + MSR SPSEL, #0 + + /* Set the SP to point to the stack of the task being restored. */ + LDR X0, pxCurrentTCBConst + LDR X1, [X0] + LDR X0, [X1] + MOV SP, X0 + + LDP X2, X3, [SP], #0x10 /* Critical nesting and FPU context. */ + + /* Set the PMR register to be correct for the current critical nesting + depth. */ + LDR X0, ullCriticalNestingConst /* X0 holds the address of ullCriticalNesting. */ + MOV X1, #255 /* X1 holds the unmask value. */ + LDR X4, ullICCPMRConst /* X4 holds the address of the ICCPMR constant. */ + CMP X3, #0 + LDR X5, [X4] /* X5 holds the address of the ICCPMR register. */ + B.EQ 1f + LDR X6, ullMaxAPIPriorityMaskConst + LDR X1, [X6] /* X1 holds the mask value. */ +1: + STR W1, [X5] /* Write the mask value to ICCPMR. */ + DSB SY /* _RB_Barriers probably not required here. */ + ISB SY + STR X3, [X0] /* Restore the task's critical nesting count. */ + + /* Restore the FPU context indicator. */ + LDR X0, ullPortTaskHasFPUContextConst + STR X2, [X0] + + /* Restore the FPU context, if any. */ + CMP X2, #0 + B.EQ 1f + LDP Q30, Q31, [SP], #0x20 + LDP Q28, Q29, [SP], #0x20 + LDP Q26, Q27, [SP], #0x20 + LDP Q24, Q25, [SP], #0x20 + LDP Q22, Q23, [SP], #0x20 + LDP Q20, Q21, [SP], #0x20 + LDP Q18, Q19, [SP], #0x20 + LDP Q16, Q17, [SP], #0x20 + LDP Q14, Q15, [SP], #0x20 + LDP Q12, Q13, [SP], #0x20 + LDP Q10, Q11, [SP], #0x20 + LDP Q8, Q9, [SP], #0x20 + LDP Q6, Q7, [SP], #0x20 + LDP Q4, Q5, [SP], #0x20 + LDP Q2, Q3, [SP], #0x20 + LDP Q0, Q1, [SP], #0x20 +1: + LDP X2, X3, [SP], #0x10 /* SPSR and ELR. */ + + /* Restore the SPSR. */ + MSR SPSR_EL3, X3 /*_RB_ Assumes started in EL3. */ + + /* Restore the ELR. */ + MSR ELR_EL3, X2 + + LDP X30, XZR, [SP], #0x10 + LDP X28, X29, [SP], #0x10 + LDP X26, X27, [SP], #0x10 + LDP X24, X25, [SP], #0x10 + LDP X22, X23, [SP], #0x10 + LDP X20, X21, [SP], #0x10 + LDP X18, X19, [SP], #0x10 + LDP X16, X17, [SP], #0x10 + LDP X14, X15, [SP], #0x10 + LDP X12, X13, [SP], #0x10 + LDP X10, X11, [SP], #0x10 + LDP X8, X9, [SP], #0x10 + LDP X6, X7, [SP], #0x10 + LDP X4, X5, [SP], #0x10 + LDP X2, X3, [SP], #0x10 + LDP X0, X1, [SP], #0x10 + + /* Switch to use the ELx stack pointer. _RB_ Might not be required. */ + MSR SPSEL, #1 + + ERET + + .endm + + +/****************************************************************************** + * FreeRTOS_SWI_Handler handler is used to perform a context switch. + *****************************************************************************/ +.align 8 +.type FreeRTOS_SWI_Handler, %function +FreeRTOS_SWI_Handler: + /* Save the context of the current task and select a new task to run. */ + portSAVE_CONTEXT + + MRS X0, ESR_EL3 + LSR X1, X0, #26 + CMP X1, #0x17 /* 0x17 = SMC instruction. */ + B.NE FreeRTOS_Abort + BL vTaskSwitchContext + + portRESTORE_CONTEXT + +FreeRTOS_Abort: + /* Full ESR is in X0, exception class code is in X1. */ + B . + +/****************************************************************************** + * vPortRestoreTaskContext is used to start the scheduler. + *****************************************************************************/ +.align 8 +.type vPortRestoreTaskContext, %function +vPortRestoreTaskContext: +.set freertos_vector_base, _freertos_vector_table + + /* Install the FreeRTOS interrupt handlers. */ + LDR X1, =freertos_vector_base + MSR VBAR_EL3, X1 + DSB SY + ISB SY + + /* Start the first task. */ + portRESTORE_CONTEXT + + +/****************************************************************************** + * FreeRTOS_IRQ_Handler handles IRQ entry and exit. + *****************************************************************************/ +.align 8 +.type FreeRTOS_IRQ_Handler, %function +FreeRTOS_IRQ_Handler: + /* Save volatile registers. */ + STP X0, X1, [SP, #-0x10]! + STP X2, X3, [SP, #-0x10]! + STP X4, X5, [SP, #-0x10]! + STP X6, X7, [SP, #-0x10]! + STP X8, X9, [SP, #-0x10]! + STP X10, X11, [SP, #-0x10]! + STP X12, X13, [SP, #-0x10]! + STP X14, X15, [SP, #-0x10]! + STP X16, X17, [SP, #-0x10]! + STP X18, X19, [SP, #-0x10]! + STP X29, X30, [SP, #-0x10]! + + /* Save the SPSR and ELR. */ + MRS X3, SPSR_EL3 + MRS X2, ELR_EL3 + STP X2, X3, [SP, #-0x10]! + + /* Increment the interrupt nesting counter. */ + LDR X5, ullPortInterruptNestingConst + LDR X1, [X5] /* Old nesting count in X1. */ + ADD X6, X1, #1 + STR X6, [X5] /* Address of nesting count variable in X5. */ + + /* Maintain the interrupt nesting information across the function call. */ + STP X1, X5, [SP, #-0x10]! + + /* Read value from the interrupt acknowledge register, which is stored in W0 + for future parameter and interrupt clearing use. */ + LDR X2, ullICCIARConst + LDR X3, [X2] + LDR W0, [X3] /* ICCIAR in W0 as parameter. */ + + /* Maintain the ICCIAR value across the function call. */ + STP X0, X1, [SP, #-0x10]! + + /* Call the C handler. */ + BL vApplicationIRQHandler + + /* Disable interrupts. */ + MSR DAIFSET, #2 + DSB SY + ISB SY + + /* Restore the ICCIAR value. */ + LDP X0, X1, [SP], #0x10 + + /* End IRQ processing by writing ICCIAR to the EOI register. */ + LDR X4, ullICCEOIRConst + LDR X4, [X4] + STR W0, [X4] + + /* Restore the critical nesting count. */ + LDP X1, X5, [SP], #0x10 + STR X1, [X5] + + /* Has interrupt nesting unwound? */ + CMP X1, #0 + B.NE Exit_IRQ_No_Context_Switch + + /* Is a context switch required? */ + LDR X0, ullPortYieldRequiredConst + LDR X1, [X0] + CMP X1, #0 + B.EQ Exit_IRQ_No_Context_Switch + + /* Reset ullPortYieldRequired to 0. */ + MOV X2, #0 + STR X2, [X0] + + /* Restore volatile registers. */ + LDP X4, X5, [SP], #0x10 /* SPSR and ELR. */ + MSR SPSR_EL3, X5 /*_RB_ Assumes started in EL3. */ + MSR ELR_EL3, X4 + DSB SY + ISB SY + + LDP X29, X30, [SP], #0x10 + LDP X18, X19, [SP], #0x10 + LDP X16, X17, [SP], #0x10 + LDP X14, X15, [SP], #0x10 + LDP X12, X13, [SP], #0x10 + LDP X10, X11, [SP], #0x10 + LDP X8, X9, [SP], #0x10 + LDP X6, X7, [SP], #0x10 + LDP X4, X5, [SP], #0x10 + LDP X2, X3, [SP], #0x10 + LDP X0, X1, [SP], #0x10 + + /* Save the context of the current task and select a new task to run. */ + portSAVE_CONTEXT + BL vTaskSwitchContext + portRESTORE_CONTEXT + +Exit_IRQ_No_Context_Switch: + /* Restore volatile registers. */ + LDP X4, X5, [SP], #0x10 /* SPSR and ELR. */ + MSR SPSR_EL3, X5 /*_RB_ Assumes started in EL3. */ + MSR ELR_EL3, X4 + DSB SY + ISB SY + + LDP X29, X30, [SP], #0x10 + LDP X18, X19, [SP], #0x10 + LDP X16, X17, [SP], #0x10 + LDP X14, X15, [SP], #0x10 + LDP X12, X13, [SP], #0x10 + LDP X10, X11, [SP], #0x10 + LDP X8, X9, [SP], #0x10 + LDP X6, X7, [SP], #0x10 + LDP X4, X5, [SP], #0x10 + LDP X2, X3, [SP], #0x10 + LDP X0, X1, [SP], #0x10 + + ERET + + + + +.align 8 +pxCurrentTCBConst: .dword pxCurrentTCB +ullCriticalNestingConst: .dword ullCriticalNesting +ullPortTaskHasFPUContextConst: .dword ullPortTaskHasFPUContext + +ullICCPMRConst: .dword ullICCPMR +ullMaxAPIPriorityMaskConst: .dword ullMaxAPIPriorityMask +vApplicationIRQHandlerConst: .word vApplicationIRQHandler +ullPortInterruptNestingConst: .dword ullPortInterruptNesting +ullPortYieldRequiredConst: .dword ullPortYieldRequired +ullICCIARConst: .dword ullICCIAR +ullICCEOIRConst: .dword ullICCEOIR + + + +.end + + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CA53_64_BIT/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CA53_64_BIT/portmacro.h new file mode 100644 index 0000000..a617b82 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CA53_64_BIT/portmacro.h @@ -0,0 +1,248 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus + extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE size_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef portBASE_TYPE BaseType_t; +typedef uint64_t UBaseType_t; + +typedef uint64_t TickType_t; +#define portMAX_DELAY ( ( TickType_t ) 0xffffffffffffffff ) + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do +not need to be guarded with a critical section. */ +#define portTICK_TYPE_IS_ATOMIC 1 + +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 16 +#define portPOINTER_SIZE_TYPE uint64_t + +/*-----------------------------------------------------------*/ + +/* Task utilities. */ + +/* Called at the end of an ISR that can cause a context switch. */ +#define portEND_SWITCHING_ISR( xSwitchRequired )\ +{ \ +extern uint64_t ullPortYieldRequired; \ + \ + if( xSwitchRequired != pdFALSE ) \ + { \ + ullPortYieldRequired = pdTRUE; \ + } \ +} + +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +#define portYIELD() __asm volatile ( "SMC 0" ) + +/*----------------------------------------------------------- + * Critical section control + *----------------------------------------------------------*/ + +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); +extern UBaseType_t uxPortSetInterruptMask( void ); +extern void vPortClearInterruptMask( UBaseType_t uxNewMaskValue ); +extern void vPortInstallFreeRTOSVectorTable( void ); + +#define portDISABLE_INTERRUPTS() \ + __asm volatile ( "MSR DAIFSET, #2" ); \ + __asm volatile ( "DSB SY" ); \ + __asm volatile ( "ISB SY" ); + +#define portENABLE_INTERRUPTS() \ + __asm volatile ( "MSR DAIFCLR, #2" ); \ + __asm volatile ( "DSB SY" ); \ + __asm volatile ( "ISB SY" ); + + +/* These macros do not globally disable/enable interrupts. They do mask off +interrupts that have a priority below configMAX_API_CALL_INTERRUPT_PRIORITY. */ +#define portENTER_CRITICAL() vPortEnterCritical(); +#define portEXIT_CRITICAL() vPortExitCritical(); +#define portSET_INTERRUPT_MASK_FROM_ISR() uxPortSetInterruptMask() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vPortClearInterruptMask(x) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are +not required for this port but included in case common demo code that uses these +macros is used. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +/* Prototype of the FreeRTOS tick handler. This must be installed as the +handler for whichever peripheral is used to generate the RTOS tick. */ +void FreeRTOS_Tick_Handler( void ); + +/* Any task that uses the floating point unit MUST call vPortTaskUsesFPU() +before any floating point instructions are executed. */ +void vPortTaskUsesFPU( void ); +#define portTASK_USES_FLOATING_POINT() vPortTaskUsesFPU() + +#define portLOWEST_INTERRUPT_PRIORITY ( ( ( uint32_t ) configUNIQUE_INTERRUPT_PRIORITIES ) - 1UL ) +#define portLOWEST_USABLE_INTERRUPT_PRIORITY ( portLOWEST_INTERRUPT_PRIORITY - 1UL ) + +/* Architecture specific optimisations. */ +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31 - __builtin_clz( uxReadyPriorities ) ) + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +#ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() +#endif /* configASSERT */ + +#define portNOP() __asm volatile( "NOP" ) +#define portINLINE __inline + +#ifdef __cplusplus + } /* extern C */ +#endif + + +/* The number of bits to shift for an interrupt priority is dependent on the +number of bits implemented by the interrupt controller. */ +#if configUNIQUE_INTERRUPT_PRIORITIES == 16 + #define portPRIORITY_SHIFT 4 + #define portMAX_BINARY_POINT_VALUE 3 +#elif configUNIQUE_INTERRUPT_PRIORITIES == 32 + #define portPRIORITY_SHIFT 3 + #define portMAX_BINARY_POINT_VALUE 2 +#elif configUNIQUE_INTERRUPT_PRIORITIES == 64 + #define portPRIORITY_SHIFT 2 + #define portMAX_BINARY_POINT_VALUE 1 +#elif configUNIQUE_INTERRUPT_PRIORITIES == 128 + #define portPRIORITY_SHIFT 1 + #define portMAX_BINARY_POINT_VALUE 0 +#elif configUNIQUE_INTERRUPT_PRIORITIES == 256 + #define portPRIORITY_SHIFT 0 + #define portMAX_BINARY_POINT_VALUE 0 +#else + #error Invalid configUNIQUE_INTERRUPT_PRIORITIES setting. configUNIQUE_INTERRUPT_PRIORITIES must be set to the number of unique priorities implemented by the target hardware +#endif + +/* Interrupt controller access addresses. */ +#define portICCPMR_PRIORITY_MASK_OFFSET ( 0x04 ) +#define portICCIAR_INTERRUPT_ACKNOWLEDGE_OFFSET ( 0x0C ) +#define portICCEOIR_END_OF_INTERRUPT_OFFSET ( 0x10 ) +#define portICCBPR_BINARY_POINT_OFFSET ( 0x08 ) +#define portICCRPR_RUNNING_PRIORITY_OFFSET ( 0x14 ) + +#define portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS ( configINTERRUPT_CONTROLLER_BASE_ADDRESS + configINTERRUPT_CONTROLLER_CPU_INTERFACE_OFFSET ) +#define portICCPMR_PRIORITY_MASK_REGISTER ( *( ( volatile uint32_t * ) ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCPMR_PRIORITY_MASK_OFFSET ) ) ) +#define portICCIAR_INTERRUPT_ACKNOWLEDGE_REGISTER_ADDRESS ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCIAR_INTERRUPT_ACKNOWLEDGE_OFFSET ) +#define portICCEOIR_END_OF_INTERRUPT_REGISTER_ADDRESS ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCEOIR_END_OF_INTERRUPT_OFFSET ) +#define portICCPMR_PRIORITY_MASK_REGISTER_ADDRESS ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCPMR_PRIORITY_MASK_OFFSET ) +#define portICCBPR_BINARY_POINT_REGISTER ( *( ( const volatile uint32_t * ) ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCBPR_BINARY_POINT_OFFSET ) ) ) +#define portICCRPR_RUNNING_PRIORITY_REGISTER ( *( ( const volatile uint32_t * ) ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCRPR_RUNNING_PRIORITY_OFFSET ) ) ) + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CA9/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CA9/port.c new file mode 100644 index 0000000..5c84385 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CA9/port.c @@ -0,0 +1,610 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#ifndef configINTERRUPT_CONTROLLER_BASE_ADDRESS + #error configINTERRUPT_CONTROLLER_BASE_ADDRESS must be defined. See http://www.freertos.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html +#endif + +#ifndef configINTERRUPT_CONTROLLER_CPU_INTERFACE_OFFSET + #error configINTERRUPT_CONTROLLER_CPU_INTERFACE_OFFSET must be defined. See http://www.freertos.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html +#endif + +#ifndef configUNIQUE_INTERRUPT_PRIORITIES + #error configUNIQUE_INTERRUPT_PRIORITIES must be defined. See http://www.freertos.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html +#endif + +#ifndef configSETUP_TICK_INTERRUPT + #error configSETUP_TICK_INTERRUPT() must be defined. See http://www.freertos.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html +#endif /* configSETUP_TICK_INTERRUPT */ + +#ifndef configMAX_API_CALL_INTERRUPT_PRIORITY + #error configMAX_API_CALL_INTERRUPT_PRIORITY must be defined. See http://www.freertos.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html +#endif + +#if configMAX_API_CALL_INTERRUPT_PRIORITY == 0 + #error configMAX_API_CALL_INTERRUPT_PRIORITY must not be set to 0 +#endif + +#if configMAX_API_CALL_INTERRUPT_PRIORITY > configUNIQUE_INTERRUPT_PRIORITIES + #error configMAX_API_CALL_INTERRUPT_PRIORITY must be less than or equal to configUNIQUE_INTERRUPT_PRIORITIES as the lower the numeric priority value the higher the logical interrupt priority +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +/* In case security extensions are implemented. */ +#if configMAX_API_CALL_INTERRUPT_PRIORITY <= ( configUNIQUE_INTERRUPT_PRIORITIES / 2 ) + #error configMAX_API_CALL_INTERRUPT_PRIORITY must be greater than ( configUNIQUE_INTERRUPT_PRIORITIES / 2 ) +#endif + +/* Some vendor specific files default configCLEAR_TICK_INTERRUPT() in +portmacro.h. */ +#ifndef configCLEAR_TICK_INTERRUPT + #define configCLEAR_TICK_INTERRUPT() +#endif + +/* A critical section is exited when the critical section nesting count reaches +this value. */ +#define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) + +/* In all GICs 255 can be written to the priority mask register to unmask all +(but the lowest) interrupt priority. */ +#define portUNMASK_VALUE ( 0xFFUL ) + +/* Tasks are not created with a floating point context, but can be given a +floating point context after they have been created. A variable is stored as +part of the tasks context that holds portNO_FLOATING_POINT_CONTEXT if the task +does not have an FPU context, or any other value if the task does have an FPU +context. */ +#define portNO_FLOATING_POINT_CONTEXT ( ( StackType_t ) 0 ) + +/* Constants required to setup the initial task context. */ +#define portINITIAL_SPSR ( ( StackType_t ) 0x1f ) /* System mode, ARM mode, IRQ enabled FIQ enabled. */ +#define portTHUMB_MODE_BIT ( ( StackType_t ) 0x20 ) +#define portINTERRUPT_ENABLE_BIT ( 0x80UL ) +#define portTHUMB_MODE_ADDRESS ( 0x01UL ) + +/* Used by portASSERT_IF_INTERRUPT_PRIORITY_INVALID() when ensuring the binary +point is zero. */ +#define portBINARY_POINT_BITS ( ( uint8_t ) 0x03 ) + +/* Masks all bits in the APSR other than the mode bits. */ +#define portAPSR_MODE_BITS_MASK ( 0x1F ) + +/* The value of the mode bits in the APSR when the CPU is executing in user +mode. */ +#define portAPSR_USER_MODE ( 0x10 ) + +/* The critical section macros only mask interrupts up to an application +determined priority level. Sometimes it is necessary to turn interrupt off in +the CPU itself before modifying certain hardware registers. */ +#define portCPU_IRQ_DISABLE() \ + __asm volatile ( "CPSID i" ); \ + __asm volatile ( "DSB" ); \ + __asm volatile ( "ISB" ); + +#define portCPU_IRQ_ENABLE() \ + __asm volatile ( "CPSIE i" ); \ + __asm volatile ( "DSB" ); \ + __asm volatile ( "ISB" ); + + +/* Macro to unmask all interrupt priorities. */ +#define portCLEAR_INTERRUPT_MASK() \ +{ \ + portCPU_IRQ_DISABLE(); \ + portICCPMR_PRIORITY_MASK_REGISTER = portUNMASK_VALUE; \ + __asm volatile ( "DSB \n" \ + "ISB \n" ); \ + portCPU_IRQ_ENABLE(); \ +} + +#define portINTERRUPT_PRIORITY_REGISTER_OFFSET 0x400UL +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portBIT_0_SET ( ( uint8_t ) 0x01 ) + +/* Let the user override the pre-loading of the initial LR with the address of +prvTaskExitError() in case it messes up unwinding of the stack in the +debugger. */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/* The space on the stack required to hold the FPU registers. This is 32 64-bit +registers, plus a 32-bit status register. */ +#define portFPU_REGISTER_WORDS ( ( 32 * 2 ) + 1 ) + +/*-----------------------------------------------------------*/ + +/* + * Starts the first task executing. This function is necessarily written in + * assembly code so is implemented in portASM.s. + */ +extern void vPortRestoreTaskContext( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/* + * If the application provides an implementation of vApplicationIRQHandler(), + * then it will get called directly without saving the FPU registers on + * interrupt entry, and this weak implementation of + * vApplicationFPUSafeIRQHandler() is just provided to remove linkage errors - + * it should never actually get called so its implementation contains a + * call to configASSERT() that will always fail. + * + * If the application provides its own implementation of + * vApplicationFPUSafeIRQHandler() then the implementation of + * vApplicationIRQHandler() provided in portASM.S will save the FPU registers + * before calling it. + * + * Therefore, if the application writer wants FPU registers to be saved on + * interrupt entry their IRQ handler must be called + * vApplicationFPUSafeIRQHandler(), and if the application writer does not want + * FPU registers to be saved on interrupt entry their IRQ handler must be + * called vApplicationIRQHandler(). + */ +void vApplicationFPUSafeIRQHandler( uint32_t ulICCIAR ) __attribute__((weak) ); + +/*-----------------------------------------------------------*/ + +/* A variable is used to keep track of the critical section nesting. This +variable has to be stored as part of the task context and must be initialised to +a non zero value to ensure interrupts don't inadvertently become unmasked before +the scheduler starts. As it is stored as part of the task context it will +automatically be set to 0 when the first task is started. */ +volatile uint32_t ulCriticalNesting = 9999UL; + +/* Saved as part of the task context. If ulPortTaskHasFPUContext is non-zero then +a floating point context must be saved and restored for the task. */ +volatile uint32_t ulPortTaskHasFPUContext = pdFALSE; + +/* Set to 1 to pend a context switch from an ISR. */ +volatile uint32_t ulPortYieldRequired = pdFALSE; + +/* Counts the interrupt nesting depth. A context switch is only performed if +if the nesting depth is 0. */ +volatile uint32_t ulPortInterruptNesting = 0UL; + +/* Used in the asm file. */ +__attribute__(( used )) const uint32_t ulICCIAR = portICCIAR_INTERRUPT_ACKNOWLEDGE_REGISTER_ADDRESS; +__attribute__(( used )) const uint32_t ulICCEOIR = portICCEOIR_END_OF_INTERRUPT_REGISTER_ADDRESS; +__attribute__(( used )) const uint32_t ulICCPMR = portICCPMR_PRIORITY_MASK_REGISTER_ADDRESS; +__attribute__(( used )) const uint32_t ulMaxAPIPriorityMask = ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ); + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. + + The fist real value on the stack is the status register, which is set for + system mode, with interrupts enabled. A few NULLs are added first to ensure + GDB does not try decoding a non-existent return address. */ + *pxTopOfStack = ( StackType_t ) NULL; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) NULL; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) NULL; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portINITIAL_SPSR; + + if( ( ( uint32_t ) pxCode & portTHUMB_MODE_ADDRESS ) != 0x00UL ) + { + /* The task will start in THUMB mode. */ + *pxTopOfStack |= portTHUMB_MODE_BIT; + } + + pxTopOfStack--; + + /* Next the return address, which in this case is the start of the task. */ + *pxTopOfStack = ( StackType_t ) pxCode; + pxTopOfStack--; + + /* Next all the registers other than the stack pointer. */ + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + + /* The task will start with a critical nesting count of 0 as interrupts are + enabled. */ + *pxTopOfStack = portNO_CRITICAL_NESTING; + + #if( configUSE_TASK_FPU_SUPPORT == 1 ) + { + /* The task will start without a floating point context. A task that + uses the floating point hardware must call vPortTaskUsesFPU() before + executing any floating point instructions. */ + pxTopOfStack--; + *pxTopOfStack = portNO_FLOATING_POINT_CONTEXT; + } + #elif( configUSE_TASK_FPU_SUPPORT == 2 ) + { + /* The task will start with a floating point context. Leave enough + space for the registers - and ensure they are initialised to 0. */ + pxTopOfStack -= portFPU_REGISTER_WORDS; + memset( pxTopOfStack, 0x00, portFPU_REGISTER_WORDS * sizeof( StackType_t ) ); + + pxTopOfStack--; + *pxTopOfStack = pdTRUE; + ulPortTaskHasFPUContext = pdTRUE; + } + #else + { + #error Invalid configUSE_TASK_FPU_SUPPORT setting - configUSE_TASK_FPU_SUPPORT must be set to 1, 2, or left undefined. + } + #endif + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT( ulPortInterruptNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + for( ;; ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +uint32_t ulAPSR; + + #if( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( configINTERRUPT_CONTROLLER_BASE_ADDRESS + portINTERRUPT_PRIORITY_REGISTER_OFFSET ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine how many priority bits are implemented in the GIC. + + Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to + all possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* Shift to the least significant bits. */ + while( ( ucMaxPriorityValue & portBIT_0_SET ) != portBIT_0_SET ) + { + ucMaxPriorityValue >>= ( uint8_t ) 0x01; + } + + /* Sanity check configUNIQUE_INTERRUPT_PRIORITIES matches the read + value. */ + configASSERT( ucMaxPriorityValue == portLOWEST_INTERRUPT_PRIORITY ); + + /* Restore the clobbered interrupt priority register to its original + value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* conifgASSERT_DEFINED */ + + + /* Only continue if the CPU is not in User mode. The CPU must be in a + Privileged mode for the scheduler to start. */ + __asm volatile ( "MRS %0, APSR" : "=r" ( ulAPSR ) ); + ulAPSR &= portAPSR_MODE_BITS_MASK; + configASSERT( ulAPSR != portAPSR_USER_MODE ); + + if( ulAPSR != portAPSR_USER_MODE ) + { + /* Only continue if the binary point value is set to its lowest possible + setting. See the comments in vPortValidateInterruptPriority() below for + more information. */ + configASSERT( ( portICCBPR_BINARY_POINT_REGISTER & portBINARY_POINT_BITS ) <= portMAX_BINARY_POINT_VALUE ); + + if( ( portICCBPR_BINARY_POINT_REGISTER & portBINARY_POINT_BITS ) <= portMAX_BINARY_POINT_VALUE ) + { + /* Interrupts are turned off in the CPU itself to ensure tick does + not execute while the scheduler is being started. Interrupts are + automatically turned back on in the CPU when the first task starts + executing. */ + portCPU_IRQ_DISABLE(); + + /* Start the timer that generates the tick ISR. */ + configSETUP_TICK_INTERRUPT(); + + /* Start the first task executing. */ + vPortRestoreTaskContext(); + } + } + + /* Will only get here if vTaskStartScheduler() was called with the CPU in + a non-privileged mode or the binary point register was not set to its lowest + possible value. prvTaskExitError() is referenced to prevent a compiler + warning about it being defined but not referenced in the case that the user + defines their own exit address. */ + ( void ) prvTaskExitError; + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( ulCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + /* Mask interrupts up to the max syscall interrupt priority. */ + ulPortSetInterruptMask(); + + /* Now interrupts are disabled ulCriticalNesting can be accessed + directly. Increment ulCriticalNesting to keep a count of how many times + portENTER_CRITICAL() has been called. */ + ulCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + assert() if it is being called from an interrupt context. Only API + functions that end in "FromISR" can be used in an interrupt. Only assert if + the critical nesting count is 1 to protect against recursive calls if the + assert function also uses a critical section. */ + if( ulCriticalNesting == 1 ) + { + configASSERT( ulPortInterruptNesting == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + if( ulCriticalNesting > portNO_CRITICAL_NESTING ) + { + /* Decrement the nesting count as the critical section is being + exited. */ + ulCriticalNesting--; + + /* If the nesting level has reached zero then all interrupt + priorities must be re-enabled. */ + if( ulCriticalNesting == portNO_CRITICAL_NESTING ) + { + /* Critical nesting has reached zero so all interrupt priorities + should be unmasked. */ + portCLEAR_INTERRUPT_MASK(); + } + } +} +/*-----------------------------------------------------------*/ + +void FreeRTOS_Tick_Handler( void ) +{ + /* Set interrupt mask before altering scheduler structures. The tick + handler runs at the lowest priority, so interrupts cannot already be masked, + so there is no need to save and restore the current mask value. It is + necessary to turn off interrupts in the CPU itself while the ICCPMR is being + updated. */ + portCPU_IRQ_DISABLE(); + portICCPMR_PRIORITY_MASK_REGISTER = ( uint32_t ) ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ); + __asm volatile ( "dsb \n" + "isb \n" ); + portCPU_IRQ_ENABLE(); + + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + ulPortYieldRequired = pdTRUE; + } + + /* Ensure all interrupt priorities are active again. */ + portCLEAR_INTERRUPT_MASK(); + configCLEAR_TICK_INTERRUPT(); +} +/*-----------------------------------------------------------*/ + +#if( configUSE_TASK_FPU_SUPPORT != 2 ) + + void vPortTaskUsesFPU( void ) + { + uint32_t ulInitialFPSCR = 0; + + /* A task is registering the fact that it needs an FPU context. Set the + FPU flag (which is saved as part of the task context). */ + ulPortTaskHasFPUContext = pdTRUE; + + /* Initialise the floating point status register. */ + __asm volatile ( "FMXR FPSCR, %0" :: "r" (ulInitialFPSCR) ); + } + +#endif /* configUSE_TASK_FPU_SUPPORT */ +/*-----------------------------------------------------------*/ + +void vPortClearInterruptMask( uint32_t ulNewMaskValue ) +{ + if( ulNewMaskValue == pdFALSE ) + { + portCLEAR_INTERRUPT_MASK(); + } +} +/*-----------------------------------------------------------*/ + +uint32_t ulPortSetInterruptMask( void ) +{ +uint32_t ulReturn; + + /* Interrupt in the CPU must be turned off while the ICCPMR is being + updated. */ + portCPU_IRQ_DISABLE(); + if( portICCPMR_PRIORITY_MASK_REGISTER == ( uint32_t ) ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ) ) + { + /* Interrupts were already masked. */ + ulReturn = pdTRUE; + } + else + { + ulReturn = pdFALSE; + portICCPMR_PRIORITY_MASK_REGISTER = ( uint32_t ) ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ); + __asm volatile ( "dsb \n" + "isb \n" ); + } + portCPU_IRQ_ENABLE(); + + return ulReturn; +} +/*-----------------------------------------------------------*/ + +#if( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + /* The following assertion will fail if a service routine (ISR) for + an interrupt that has been assigned a priority above + configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + function. ISR safe FreeRTOS API functions must *only* be called + from interrupts that have been assigned a priority at or below + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Numerically low interrupt priority numbers represent logically high + interrupt priorities, therefore the priority of the interrupt must + be set to a value equal to or numerically *higher* than + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + FreeRTOS maintains separate thread and ISR API functions to ensure + interrupt entry is as fast and simple as possible. */ + configASSERT( portICCRPR_RUNNING_PRIORITY_REGISTER >= ( uint32_t ) ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ) ); + + /* Priority grouping: The interrupt controller (GIC) allows the bits + that define each interrupt's priority to be split between bits that + define the interrupt's pre-emption priority bits and bits that define + the interrupt's sub-priority. For simplicity all bits must be defined + to be pre-emption priority bits. The following assertion will fail if + this is not the case (if some bits represent a sub-priority). + + The priority grouping is configured by the GIC's binary point register + (ICCBPR). Writting 0 to ICCBPR will ensure it is set to its lowest + possible value (which may be above 0). */ + configASSERT( ( portICCBPR_BINARY_POINT_REGISTER & portBINARY_POINT_BITS ) <= portMAX_BINARY_POINT_VALUE ); + } + +#endif /* configASSERT_DEFINED */ +/*-----------------------------------------------------------*/ + +void vApplicationFPUSafeIRQHandler( uint32_t ulICCIAR ) +{ + ( void ) ulICCIAR; + configASSERT( ( volatile void * ) NULL ); +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CA9/portASM.S b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CA9/portASM.S new file mode 100644 index 0000000..46ff2cf --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CA9/portASM.S @@ -0,0 +1,349 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + + .text + .arm + + .set SYS_MODE, 0x1f + .set SVC_MODE, 0x13 + .set IRQ_MODE, 0x12 + + /* Hardware registers. */ + .extern ulICCIAR + .extern ulICCEOIR + .extern ulICCPMR + + /* Variables and functions. */ + .extern ulMaxAPIPriorityMask + .extern _freertos_vector_table + .extern pxCurrentTCB + .extern vTaskSwitchContext + .extern vApplicationIRQHandler + .extern ulPortInterruptNesting + .extern ulPortTaskHasFPUContext + + .global FreeRTOS_IRQ_Handler + .global FreeRTOS_SWI_Handler + .global vPortRestoreTaskContext + + + + +.macro portSAVE_CONTEXT + + /* Save the LR and SPSR onto the system mode stack before switching to + system mode to save the remaining system mode registers. */ + SRSDB sp!, #SYS_MODE + CPS #SYS_MODE + PUSH {R0-R12, R14} + + /* Push the critical nesting count. */ + LDR R2, ulCriticalNestingConst + LDR R1, [R2] + PUSH {R1} + + /* Does the task have a floating point context that needs saving? If + ulPortTaskHasFPUContext is 0 then no. */ + LDR R2, ulPortTaskHasFPUContextConst + LDR R3, [R2] + CMP R3, #0 + + /* Save the floating point context, if any. */ + FMRXNE R1, FPSCR + VPUSHNE {D0-D15} + VPUSHNE {D16-D31} + PUSHNE {R1} + + /* Save ulPortTaskHasFPUContext itself. */ + PUSH {R3} + + /* Save the stack pointer in the TCB. */ + LDR R0, pxCurrentTCBConst + LDR R1, [R0] + STR SP, [R1] + + .endm + +; /**********************************************************************/ + +.macro portRESTORE_CONTEXT + + /* Set the SP to point to the stack of the task being restored. */ + LDR R0, pxCurrentTCBConst + LDR R1, [R0] + LDR SP, [R1] + + /* Is there a floating point context to restore? If the restored + ulPortTaskHasFPUContext is zero then no. */ + LDR R0, ulPortTaskHasFPUContextConst + POP {R1} + STR R1, [R0] + CMP R1, #0 + + /* Restore the floating point context, if any. */ + POPNE {R0} + VPOPNE {D16-D31} + VPOPNE {D0-D15} + VMSRNE FPSCR, R0 + + /* Restore the critical section nesting depth. */ + LDR R0, ulCriticalNestingConst + POP {R1} + STR R1, [R0] + + /* Ensure the priority mask is correct for the critical nesting depth. */ + LDR R2, ulICCPMRConst + LDR R2, [R2] + CMP R1, #0 + MOVEQ R4, #255 + LDRNE R4, ulMaxAPIPriorityMaskConst + LDRNE R4, [R4] + STR R4, [R2] + + /* Restore all system mode registers other than the SP (which is already + being used). */ + POP {R0-R12, R14} + + /* Return to the task code, loading CPSR on the way. */ + RFEIA sp! + + .endm + + + + +/****************************************************************************** + * SVC handler is used to start the scheduler. + *****************************************************************************/ +.align 4 +.type FreeRTOS_SWI_Handler, %function +FreeRTOS_SWI_Handler: + /* Save the context of the current task and select a new task to run. */ + portSAVE_CONTEXT + LDR R0, vTaskSwitchContextConst + BLX R0 + portRESTORE_CONTEXT + + +/****************************************************************************** + * vPortRestoreTaskContext is used to start the scheduler. + *****************************************************************************/ +.type vPortRestoreTaskContext, %function +vPortRestoreTaskContext: + /* Switch to system mode. */ + CPS #SYS_MODE + portRESTORE_CONTEXT + +.align 4 +.type FreeRTOS_IRQ_Handler, %function +FreeRTOS_IRQ_Handler: + /* Return to the interrupted instruction. */ + SUB lr, lr, #4 + + /* Push the return address and SPSR. */ + PUSH {lr} + MRS lr, SPSR + PUSH {lr} + + /* Change to supervisor mode to allow reentry. */ + CPS #SVC_MODE + + /* Push used registers. */ + PUSH {r0-r4, r12} + + /* Increment nesting count. r3 holds the address of ulPortInterruptNesting + for future use. r1 holds the original ulPortInterruptNesting value for + future use. */ + LDR r3, ulPortInterruptNestingConst + LDR r1, [r3] + ADD r4, r1, #1 + STR r4, [r3] + + /* Read value from the interrupt acknowledge register, which is stored in r0 + for future parameter and interrupt clearing use. */ + LDR r2, ulICCIARConst + LDR r2, [r2] + LDR r0, [r2] + + /* Ensure bit 2 of the stack pointer is clear. r2 holds the bit 2 value for + future use. */ + MOV r2, sp + AND r2, r2, #4 + SUB sp, sp, r2 + + /* Call the interrupt handler. */ + PUSH {r0-r3, lr} + LDR r1, vApplicationIRQHandlerConst + BLX r1 + POP {r0-r3, lr} + ADD sp, sp, r2 + + CPSID i + DSB + ISB + + /* Write the value read from ICCIAR to ICCEOIR. */ + LDR r4, ulICCEOIRConst + LDR r4, [r4] + STR r0, [r4] + + /* Restore the old nesting count. */ + STR r1, [r3] + + /* A context switch is never performed if the nesting count is not 0. */ + CMP r1, #0 + BNE exit_without_switch + + /* Did the interrupt request a context switch? r1 holds the address of + ulPortYieldRequired and r0 the value of ulPortYieldRequired for future + use. */ + LDR r1, =ulPortYieldRequired + LDR r0, [r1] + CMP r0, #0 + BNE switch_before_exit + +exit_without_switch: + /* No context switch. Restore used registers, LR_irq and SPSR before + returning. */ + POP {r0-r4, r12} + CPS #IRQ_MODE + POP {LR} + MSR SPSR_cxsf, LR + POP {LR} + MOVS PC, LR + +switch_before_exit: + /* A context swtich is to be performed. Clear the context switch pending + flag. */ + MOV r0, #0 + STR r0, [r1] + + /* Restore used registers, LR-irq and SPSR before saving the context + to the task stack. */ + POP {r0-r4, r12} + CPS #IRQ_MODE + POP {LR} + MSR SPSR_cxsf, LR + POP {LR} + portSAVE_CONTEXT + + /* Call the function that selects the new task to execute. + vTaskSwitchContext() if vTaskSwitchContext() uses LDRD or STRD + instructions, or 8 byte aligned stack allocated data. LR does not need + saving as a new LR will be loaded by portRESTORE_CONTEXT anyway. */ + LDR R0, vTaskSwitchContextConst + BLX R0 + + /* Restore the context of, and branch to, the task selected to execute + next. */ + portRESTORE_CONTEXT + + +/****************************************************************************** + * If the application provides an implementation of vApplicationIRQHandler(), + * then it will get called directly without saving the FPU registers on + * interrupt entry, and this weak implementation of + * vApplicationIRQHandler() will not get called. + * + * If the application provides its own implementation of + * vApplicationFPUSafeIRQHandler() then this implementation of + * vApplicationIRQHandler() will be called, save the FPU registers, and then + * call vApplicationFPUSafeIRQHandler(). + * + * Therefore, if the application writer wants FPU registers to be saved on + * interrupt entry their IRQ handler must be called + * vApplicationFPUSafeIRQHandler(), and if the application writer does not want + * FPU registers to be saved on interrupt entry their IRQ handler must be + * called vApplicationIRQHandler(). + *****************************************************************************/ + +.align 4 +.weak vApplicationIRQHandler +.type vApplicationIRQHandler, %function +vApplicationIRQHandler: + PUSH {LR} + FMRX R1, FPSCR + VPUSH {D0-D15} + VPUSH {D16-D31} + PUSH {R1} + + LDR r1, vApplicationFPUSafeIRQHandlerConst + BLX r1 + + POP {R0} + VPOP {D16-D31} + VPOP {D0-D15} + VMSR FPSCR, R0 + + POP {PC} + + +ulICCIARConst: .word ulICCIAR +ulICCEOIRConst: .word ulICCEOIR +ulICCPMRConst: .word ulICCPMR +pxCurrentTCBConst: .word pxCurrentTCB +ulCriticalNestingConst: .word ulCriticalNesting +ulPortTaskHasFPUContextConst: .word ulPortTaskHasFPUContext +ulMaxAPIPriorityMaskConst: .word ulMaxAPIPriorityMask +vTaskSwitchContextConst: .word vTaskSwitchContext +vApplicationIRQHandlerConst: .word vApplicationIRQHandler +ulPortInterruptNestingConst: .word ulPortInterruptNesting +vApplicationFPUSafeIRQHandlerConst: .word vApplicationFPUSafeIRQHandler + +.end + + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CA9/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CA9/portmacro.h new file mode 100644 index 0000000..e2b3c25 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CA9/portmacro.h @@ -0,0 +1,248 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus + extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +typedef uint32_t TickType_t; +#define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do +not need to be guarded with a critical section. */ +#define portTICK_TYPE_IS_ATOMIC 1 + +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 + +/*-----------------------------------------------------------*/ + +/* Task utilities. */ + +/* Called at the end of an ISR that can cause a context switch. */ +#define portEND_SWITCHING_ISR( xSwitchRequired )\ +{ \ +extern uint32_t ulPortYieldRequired; \ + \ + if( xSwitchRequired != pdFALSE ) \ + { \ + ulPortYieldRequired = pdTRUE; \ + } \ +} + +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +#define portYIELD() __asm volatile ( "SWI 0" ); + + +/*----------------------------------------------------------- + * Critical section control + *----------------------------------------------------------*/ + +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); +extern uint32_t ulPortSetInterruptMask( void ); +extern void vPortClearInterruptMask( uint32_t ulNewMaskValue ); +extern void vPortInstallFreeRTOSVectorTable( void ); + +/* These macros do not globally disable/enable interrupts. They do mask off +interrupts that have a priority below configMAX_API_CALL_INTERRUPT_PRIORITY. */ +#define portENTER_CRITICAL() vPortEnterCritical(); +#define portEXIT_CRITICAL() vPortExitCritical(); +#define portDISABLE_INTERRUPTS() ulPortSetInterruptMask() +#define portENABLE_INTERRUPTS() vPortClearInterruptMask( 0 ) +#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortSetInterruptMask() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vPortClearInterruptMask(x) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are +not required for this port but included in case common demo code that uses these +macros is used. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +/* Prototype of the FreeRTOS tick handler. This must be installed as the +handler for whichever peripheral is used to generate the RTOS tick. */ +void FreeRTOS_Tick_Handler( void ); + +/* If configUSE_TASK_FPU_SUPPORT is set to 1 (or left undefined) then tasks are +created without an FPU context and must call vPortTaskUsesFPU() to give +themselves an FPU context before using any FPU instructions. If +configUSE_TASK_FPU_SUPPORT is set to 2 then all tasks will have an FPU context +by default. */ +#if( configUSE_TASK_FPU_SUPPORT != 2 ) + void vPortTaskUsesFPU( void ); +#else + /* Each task has an FPU context already, so define this function away to + nothing to prevent it being called accidentally. */ + #define vPortTaskUsesFPU() +#endif +#define portTASK_USES_FLOATING_POINT() vPortTaskUsesFPU() + +#define portLOWEST_INTERRUPT_PRIORITY ( ( ( uint32_t ) configUNIQUE_INTERRUPT_PRIORITIES ) - 1UL ) +#define portLOWEST_USABLE_INTERRUPT_PRIORITY ( portLOWEST_INTERRUPT_PRIORITY - 1UL ) + +/* Architecture specific optimisations. */ +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) __builtin_clz( uxReadyPriorities ) ) + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +#ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() +#endif /* configASSERT */ + +#define portNOP() __asm volatile( "NOP" ) +#define portINLINE __inline + +#ifdef __cplusplus + } /* extern C */ +#endif + + +/* The number of bits to shift for an interrupt priority is dependent on the +number of bits implemented by the interrupt controller. */ +#if configUNIQUE_INTERRUPT_PRIORITIES == 16 + #define portPRIORITY_SHIFT 4 + #define portMAX_BINARY_POINT_VALUE 3 +#elif configUNIQUE_INTERRUPT_PRIORITIES == 32 + #define portPRIORITY_SHIFT 3 + #define portMAX_BINARY_POINT_VALUE 2 +#elif configUNIQUE_INTERRUPT_PRIORITIES == 64 + #define portPRIORITY_SHIFT 2 + #define portMAX_BINARY_POINT_VALUE 1 +#elif configUNIQUE_INTERRUPT_PRIORITIES == 128 + #define portPRIORITY_SHIFT 1 + #define portMAX_BINARY_POINT_VALUE 0 +#elif configUNIQUE_INTERRUPT_PRIORITIES == 256 + #define portPRIORITY_SHIFT 0 + #define portMAX_BINARY_POINT_VALUE 0 +#else + #error Invalid configUNIQUE_INTERRUPT_PRIORITIES setting. configUNIQUE_INTERRUPT_PRIORITIES must be set to the number of unique priorities implemented by the target hardware +#endif + +/* Interrupt controller access addresses. */ +#define portICCPMR_PRIORITY_MASK_OFFSET ( 0x04 ) +#define portICCIAR_INTERRUPT_ACKNOWLEDGE_OFFSET ( 0x0C ) +#define portICCEOIR_END_OF_INTERRUPT_OFFSET ( 0x10 ) +#define portICCBPR_BINARY_POINT_OFFSET ( 0x08 ) +#define portICCRPR_RUNNING_PRIORITY_OFFSET ( 0x14 ) + +#define portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS ( configINTERRUPT_CONTROLLER_BASE_ADDRESS + configINTERRUPT_CONTROLLER_CPU_INTERFACE_OFFSET ) +#define portICCPMR_PRIORITY_MASK_REGISTER ( *( ( volatile uint32_t * ) ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCPMR_PRIORITY_MASK_OFFSET ) ) ) +#define portICCIAR_INTERRUPT_ACKNOWLEDGE_REGISTER_ADDRESS ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCIAR_INTERRUPT_ACKNOWLEDGE_OFFSET ) +#define portICCEOIR_END_OF_INTERRUPT_REGISTER_ADDRESS ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCEOIR_END_OF_INTERRUPT_OFFSET ) +#define portICCPMR_PRIORITY_MASK_REGISTER_ADDRESS ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCPMR_PRIORITY_MASK_OFFSET ) +#define portICCBPR_BINARY_POINT_REGISTER ( *( ( const volatile uint32_t * ) ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCBPR_BINARY_POINT_OFFSET ) ) ) +#define portICCRPR_RUNNING_PRIORITY_REGISTER ( *( ( const volatile uint32_t * ) ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCRPR_RUNNING_PRIORITY_OFFSET ) ) ) + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CM0/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CM0/port.c new file mode 100644 index 0000000..191d19c --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CM0/port.c @@ -0,0 +1,371 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the ARM CM0 port. + *----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Constants required to manipulate the NVIC. */ +#define portNVIC_SYSTICK_CTRL ( ( volatile uint32_t *) 0xe000e010 ) +#define portNVIC_SYSTICK_LOAD ( ( volatile uint32_t *) 0xe000e014 ) +#define portNVIC_INT_CTRL ( ( volatile uint32_t *) 0xe000ed04 ) +#define portNVIC_SYSPRI2 ( ( volatile uint32_t *) 0xe000ed20 ) +#define portNVIC_SYSTICK_CLK 0x00000004 +#define portNVIC_SYSTICK_INT 0x00000002 +#define portNVIC_SYSTICK_ENABLE 0x00000001 +#define portNVIC_PENDSVSET 0x10000000 +#define portMIN_INTERRUPT_PRIORITY ( 255UL ) +#define portNVIC_PENDSV_PRI ( portMIN_INTERRUPT_PRIORITY << 16UL ) +#define portNVIC_SYSTICK_PRI ( portMIN_INTERRUPT_PRIORITY << 24UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) + +/* Let the user override the pre-loading of the initial LR with the address of +prvTaskExitError() in case it messes up unwinding of the stack in the +debugger. */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/* Each task maintains its own interrupt status in the critical nesting +variable. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* + * Setup the timer to generate the tick interrupts. + */ +static void prvSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortPendSVHandler( void ) __attribute__ (( naked )); +void xPortSysTickHandler( void ); +void vPortSVCHandler( void ); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +static void vPortStartFirstTask( void ) __attribute__ (( naked )); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + interrupt. */ + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack -= 8; /* R11..R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + for( ;; ); +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler( void ) +{ + /* This function is no longer used, but retained for backward + compatibility. */ +} +/*-----------------------------------------------------------*/ + +void vPortStartFirstTask( void ) +{ + /* The MSP stack is not reset as, unlike on M3/4 parts, there is no vector + table offset register that can be used to locate the initial stack value. + Not all M0 parts have the application vector table at address 0. */ + __asm volatile( + " ldr r2, pxCurrentTCBConst2 \n" /* Obtain location of pxCurrentTCB. */ + " ldr r3, [r2] \n" + " ldr r0, [r3] \n" /* The first item in pxCurrentTCB is the task top of stack. */ + " add r0, #32 \n" /* Discard everything up to r0. */ + " msr psp, r0 \n" /* This is now the new top of stack to use in the task. */ + " movs r0, #2 \n" /* Switch to the psp stack. */ + " msr CONTROL, r0 \n" + " isb \n" + " pop {r0-r5} \n" /* Pop the registers that are saved automatically. */ + " mov lr, r5 \n" /* lr is now in r5. */ + " pop {r3} \n" /* Return address is now in r3. */ + " pop {r2} \n" /* Pop and discard XPSR. */ + " cpsie i \n" /* The first task has its context and interrupts can be enabled. */ + " bx r3 \n" /* Finally, jump to the user defined task code. */ + " \n" + " .align 4 \n" + "pxCurrentTCBConst2: .word pxCurrentTCB " + ); +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + /* Make PendSV, CallSV and SysTick the same priroity as the kernel. */ + *(portNVIC_SYSPRI2) |= portNVIC_PENDSV_PRI; + *(portNVIC_SYSPRI2) |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + prvSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Start the first task. */ + vPortStartFirstTask(); + + /* Should never get here as the tasks will now be executing! Call the task + exit error function to prevent compiler warnings about a static function + not being called in the case that the application writer overrides this + functionality by defining configTASK_RETURN_ADDRESS. */ + prvTaskExitError(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortYield( void ) +{ + /* Set a PendSV to request a context switch. */ + *( portNVIC_INT_CTRL ) = portNVIC_PENDSVSET; + + /* Barriers are normally not required but do ensure the code is completely + within the specified behaviour for the architecture. */ + __asm volatile( "dsb" ); + __asm volatile( "isb" ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + __asm volatile( "dsb" ); + __asm volatile( "isb" ); +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +uint32_t ulSetInterruptMaskFromISR( void ) +{ + __asm volatile( + " mrs r0, PRIMASK \n" + " cpsid i \n" + " bx lr " + ); + + /* To avoid compiler warnings. This line will never be reached. */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vClearInterruptMaskFromISR( uint32_t ulMask ) +{ + __asm volatile( + " msr PRIMASK, r0 \n" + " bx lr " + ); + + /* Just to avoid compiler warning. */ + ( void ) ulMask; +} +/*-----------------------------------------------------------*/ + +void xPortPendSVHandler( void ) +{ + /* This is a naked function. */ + + __asm volatile + ( + " mrs r0, psp \n" + " \n" + " ldr r3, pxCurrentTCBConst \n" /* Get the location of the current TCB. */ + " ldr r2, [r3] \n" + " \n" + " sub r0, r0, #32 \n" /* Make space for the remaining low registers. */ + " str r0, [r2] \n" /* Save the new top of stack. */ + " stmia r0!, {r4-r7} \n" /* Store the low registers that are not saved automatically. */ + " mov r4, r8 \n" /* Store the high registers. */ + " mov r5, r9 \n" + " mov r6, r10 \n" + " mov r7, r11 \n" + " stmia r0!, {r4-r7} \n" + " \n" + " push {r3, r14} \n" + " cpsid i \n" + " bl vTaskSwitchContext \n" + " cpsie i \n" + " pop {r2, r3} \n" /* lr goes in r3. r2 now holds tcb pointer. */ + " \n" + " ldr r1, [r2] \n" + " ldr r0, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. */ + " add r0, r0, #16 \n" /* Move to the high registers. */ + " ldmia r0!, {r4-r7} \n" /* Pop the high registers. */ + " mov r8, r4 \n" + " mov r9, r5 \n" + " mov r10, r6 \n" + " mov r11, r7 \n" + " \n" + " msr psp, r0 \n" /* Remember the new top of stack for the task. */ + " \n" + " sub r0, r0, #32 \n" /* Go back for the low registers that are not automatically restored. */ + " ldmia r0!, {r4-r7} \n" /* Pop low registers. */ + " \n" + " bx r3 \n" + " \n" + " .align 4 \n" + "pxCurrentTCBConst: .word pxCurrentTCB " + ); +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ +uint32_t ulPreviousMask; + + ulPreviousMask = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Pend a context switch. */ + *(portNVIC_INT_CTRL) = portNVIC_PENDSVSET; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulPreviousMask ); +} +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +void prvSetupTimerInterrupt( void ) +{ + /* Configure SysTick to interrupt at the requested rate. */ + *(portNVIC_SYSTICK_LOAD) = ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + *(portNVIC_SYSTICK_CTRL) = portNVIC_SYSTICK_CLK | portNVIC_SYSTICK_INT | portNVIC_SYSTICK_ENABLE; +} +/*-----------------------------------------------------------*/ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CM0/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CM0/portmacro.h new file mode 100644 index 0000000..c947595 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CM0/portmacro.h @@ -0,0 +1,157 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +/*-----------------------------------------------------------*/ + + +/* Scheduler utilities. */ +extern void vPortYield( void ); +#define portNVIC_INT_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed04 ) ) +#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) +#define portYIELD() vPortYield() +#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + + +/* Critical section management. */ +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); +extern uint32_t ulSetInterruptMaskFromISR( void ) __attribute__((naked)); +extern void vClearInterruptMaskFromISR( uint32_t ulMask ) __attribute__((naked)); + +#define portSET_INTERRUPT_MASK_FROM_ISR() ulSetInterruptMaskFromISR() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vClearInterruptMaskFromISR( x ) +#define portDISABLE_INTERRUPTS() __asm volatile ( " cpsid i " ) +#define portENABLE_INTERRUPTS() __asm volatile ( " cpsie i " ) +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#define portNOP() + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CM3/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CM3/port.c new file mode 100644 index 0000000..6f3611b --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CM3/port.c @@ -0,0 +1,710 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the ARM CM3 port. + *----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* For backward compatibility, ensure configKERNEL_INTERRUPT_PRIORITY is +defined. The value should also ensure backward compatibility. +FreeRTOS.org versions prior to V4.4.0 did not include this definition. */ +#ifndef configKERNEL_INTERRUPT_PRIORITY + #define configKERNEL_INTERRUPT_PRIORITY 255 +#endif + +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#else + /* The way the SysTick is clocked is not modified in case it is not the same + as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 0 ) +#endif + +/* Constants required to manipulate the core. Registers first... */ +#define portNVIC_SYSTICK_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( * ( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( * ( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SYSPRI2_REG ( * ( ( volatile uint32_t * ) 0xe000ed20 ) ) +/* ...then bits in the registers. */ +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) + +#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( * ( ( volatile uint32_t * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */ +#define portVECTACTIVE_MASK ( 0xFFUL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000UL ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have +occurred while the SysTick counter is stopped during tickless idle +calculations. */ +#define portMISSED_COUNTS_FACTOR ( 45UL ) + +/* For strict compliance with the Cortex-M spec the task start address should +have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ +#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) + +/* Let the user override the pre-loading of the initial LR with the address of +prvTaskExitError() in case it messes up unwinding of the stack in the +debugger. */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/* Each task maintains its own interrupt status in the critical nesting +variable. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortPendSVHandler( void ) __attribute__ (( naked )); +void xPortSysTickHandler( void ); +void vPortSVCHandler( void ) __attribute__ (( naked )); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +static void prvPortStartFirstTask( void ) __attribute__ (( naked )); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* + * The number of SysTick increments that make up one tick period. + */ +#if configUSE_TICKLESS_IDLE == 1 + static uint32_t ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * The maximum number of tick periods that can be suppressed is limited by the + * 24 bit resolution of the SysTick timer. + */ +#if configUSE_TICKLESS_IDLE == 1 + static uint32_t xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Compensate for the CPU cycles that pass while the SysTick is stopped (low + * power functionality only. + */ +#if configUSE_TICKLESS_IDLE == 1 + static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static uint8_t ucMaxSysCallPriority = 0; + static uint32_t ulMaxPRIGROUPValue = 0; + static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const volatile uint8_t * const ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + interrupt. */ + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + for( ;; ); +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler( void ) +{ + __asm volatile ( + " ldr r3, pxCurrentTCBConst2 \n" /* Restore the context. */ + " ldr r1, [r3] \n" /* Use pxCurrentTCBConst to get the pxCurrentTCB address. */ + " ldr r0, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. */ + " ldmia r0!, {r4-r11} \n" /* Pop the registers that are not automatically saved on exception entry and the critical nesting count. */ + " msr psp, r0 \n" /* Restore the task stack pointer. */ + " isb \n" + " mov r0, #0 \n" + " msr basepri, r0 \n" + " orr r14, #0xd \n" + " bx r14 \n" + " \n" + " .align 4 \n" + "pxCurrentTCBConst2: .word pxCurrentTCB \n" + ); +} +/*-----------------------------------------------------------*/ + +static void prvPortStartFirstTask( void ) +{ + __asm volatile( + " ldr r0, =0xE000ED08 \n" /* Use the NVIC offset register to locate the stack. */ + " ldr r0, [r0] \n" + " ldr r0, [r0] \n" + " msr msp, r0 \n" /* Set the msp back to the start of the stack. */ + " cpsie i \n" /* Globally enable interrupts. */ + " cpsie f \n" + " dsb \n" + " isb \n" + " svc 0 \n" /* System call to start first task. */ + " nop \n" + ); +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. + See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + + #if( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + functions can be called. ISR safe functions are those that end in + "FromISR". FreeRTOS maintains separate thread and ISR API functions to + ensure interrupt entry is as fast and simple as possible. + + Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( uint8_t ) 0x01; + } + + /* Shift the priority group value back to its position within the AIRCR + register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* conifgASSERT_DEFINED */ + + /* Make PendSV and SysTick the lowest priority interrupts. */ + portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI; + portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Start the first task. */ + prvPortStartFirstTask(); + + /* Should never get here as the tasks will now be executing! Call the task + exit error function to prevent compiler warnings about a static function + not being called in the case that the application writer overrides this + functionality by defining configTASK_RETURN_ADDRESS. */ + prvTaskExitError(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + assert() if it is being called from an interrupt context. Only API + functions that end in "FromISR" can be used in an interrupt. Only assert if + the critical nesting count is 1 to protect against recursive calls if the + assert function also uses a critical section. */ + if( uxCriticalNesting == 1 ) + { + configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void xPortPendSVHandler( void ) +{ + /* This is a naked function. */ + + __asm volatile + ( + " mrs r0, psp \n" + " isb \n" + " \n" + " ldr r3, pxCurrentTCBConst \n" /* Get the location of the current TCB. */ + " ldr r2, [r3] \n" + " \n" + " stmdb r0!, {r4-r11} \n" /* Save the remaining registers. */ + " str r0, [r2] \n" /* Save the new top of stack into the first member of the TCB. */ + " \n" + " stmdb sp!, {r3, r14} \n" + " mov r0, %0 \n" + " msr basepri, r0 \n" + " bl vTaskSwitchContext \n" + " mov r0, #0 \n" + " msr basepri, r0 \n" + " ldmia sp!, {r3, r14} \n" + " \n" /* Restore the context, including the critical nesting count. */ + " ldr r1, [r3] \n" + " ldr r0, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. */ + " ldmia r0!, {r4-r11} \n" /* Pop the registers. */ + " msr psp, r0 \n" + " isb \n" + " bx r14 \n" + " \n" + " .align 4 \n" + "pxCurrentTCBConst: .word pxCurrentTCB \n" + ::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY) + ); +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + /* The SysTick runs at the lowest interrupt priority, so when this interrupt + executes all interrupts must be unmasked. There is therefore no need to + save and then restore the interrupt mask value as its value is already + known. */ + portDISABLE_INTERRUPTS(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* A context switch is required. Context switching is performed in + the PendSV interrupt. Pend the PendSV interrupt. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portENABLE_INTERRUPTS(); +} +/*-----------------------------------------------------------*/ + +#if configUSE_TICKLESS_IDLE == 1 + + __attribute__((weak)) void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickCTRL; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Stop the SysTick momentarily. The time the SysTick is stopped for + is accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG &= ~portNVIC_SYSTICK_ENABLE_BIT; + + /* Calculate the reload value required to wait xExpectedIdleTime + tick periods. -1 is used because this code will execute part way + through one of the tick periods. */ + ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + method as that will mask interrupts that should exit sleep mode. */ + __asm volatile( "cpsid i" ); + __asm volatile( "dsb" ); + __asm volatile( "isb" ); + + /* If a context switch is pending or a task is waiting for the scheduler + to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Restart from whatever is left in the count register to complete + this tick period. */ + portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Reset the reload register to the value required for normal tick + periods. */ + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + + /* Re-enable interrupts - see comments above the cpsid instruction() + above. */ + __asm volatile( "cpsie i" ); + } + else + { + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + set its parameter to 0 to indicate that its implementation contains + its own wait for interrupt or wait for event instruction, and so wfi + should not be executed again. However, the original expected idle + time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + if( xModifiableIdleTime > 0 ) + { + __asm volatile( "dsb" ); + __asm volatile( "wfi" ); + __asm volatile( "isb" ); + } + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Stop SysTick. Again, the time the SysTick is stopped for is + accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + ulSysTickCTRL = portNVIC_SYSTICK_CTRL_REG; + portNVIC_SYSTICK_CTRL_REG = ( ulSysTickCTRL & ~portNVIC_SYSTICK_ENABLE_BIT ); + + /* Re-enable interrupts - see comments above the cpsid instruction() + above. */ + __asm volatile( "cpsie i" ); + + if( ( ulSysTickCTRL & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt has already executed, and the SysTick + count reloaded with ulReloadValue. Reset the + portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick + period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + underflowed because the post sleep hook did something + that took too long. */ + if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* The tick interrupt handler will already have pended the tick + processing in the kernel. As the pending tick will be + processed as soon as this function exits, the tick value + maintained by the tick is stepped forward by one less than the + time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. + Work out how long the sleep lasted rounded to complete tick + periods (not the ulReload value which accounted for part + ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* How many complete tick periods passed while the processor + was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG + again, then set portNVIC_SYSTICK_LOAD_REG back to its standard + value. The critical section is used to ensure the tick interrupt + can only execute once in the case that the reload register is near + zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portENTER_CRITICAL(); + { + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + vTaskStepTick( ulCompleteTickPeriods ); + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + portEXIT_CRITICAL(); + } + } + +#endif /* #if configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +__attribute__(( weak )) void vPortSetupTimerInterrupt( void ) +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if configUSE_TICKLESS_IDLE == 1 + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); +} +/*-----------------------------------------------------------*/ + +#if( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + uint32_t ulCurrentInterrupt; + uint8_t ucCurrentPriority; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile( "mrs %0, ipsr" : "=r"( ulCurrentInterrupt ) ); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + an interrupt that has been assigned a priority above + configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + function. ISR safe FreeRTOS API functions must *only* be called + from interrupts that have been assigned a priority at or below + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Numerically low interrupt priority numbers represent logically high + interrupt priorities, therefore the priority of the interrupt must + be set to a value equal to or numerically *higher* than + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Interrupts that use the FreeRTOS API must not be left at their + default priority of zero as that is the highest possible priority, + which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + and therefore also guaranteed to be invalid. + + FreeRTOS maintains separate thread and ISR API functions to ensure + interrupt entry is as fast and simple as possible. + + The following links provide detailed information: + http://www.freertos.org/RTOS-Cortex-M3-M4.html + http://www.freertos.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + that define each interrupt's priority to be split between bits that + define the interrupt's pre-emption priority bits and bits that define + the interrupt's sub-priority. For simplicity all bits must be defined + to be pre-emption priority bits. The following assertion will fail if + this is not the case (if some bits represent a sub-priority). + + If the application only uses CMSIS libraries for interrupt + configuration then the correct setting can be achieved on all Cortex-M + devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + scheduler. Note however that some vendor specific peripheral libraries + assume a non-zero priority group setting, in which cases using a value + of zero will result in unpredicable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ + + + + + + + + + + + + + + + + + + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CM3/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CM3/portmacro.h new file mode 100644 index 0000000..b72042d --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CM3/portmacro.h @@ -0,0 +1,284 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +/*-----------------------------------------------------------*/ + +/* Scheduler utilities. */ +#define portYIELD() \ +{ \ + /* Set a PendSV to request a context switch. */ \ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ + \ + /* Barriers are normally not required but do ensure the code is completely \ + within the specified behaviour for the architecture. */ \ + __asm volatile( "dsb" ); \ + __asm volatile( "isb" ); \ +} + +#define portNVIC_INT_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed04 ) ) +#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) +#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired != pdFALSE ) portYIELD() +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); +#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortRaiseBASEPRI() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vPortSetBASEPRI(x) +#define portDISABLE_INTERRUPTS() vPortRaiseBASEPRI() +#define portENABLE_INTERRUPTS() vPortSetBASEPRI(0) +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are +not necessary for to use this port. They are defined so the common demo files +(which build with all the ports) will build. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ +#ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specific optimisations. */ +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Generic helper function. */ + __attribute__( ( always_inline ) ) static inline uint8_t ucPortCountLeadingZeros( uint32_t ulBitmap ) + { + uint8_t ucReturn; + + __asm volatile ( "clz %0, %1" : "=r" ( ucReturn ) : "r" ( ulBitmap ) ); + return ucReturn; + } + + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) ucPortCountLeadingZeros( ( uxReadyPriorities ) ) ) + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +/*-----------------------------------------------------------*/ + +#ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() +#endif + +/* portNOP() is not required by this port. */ +#define portNOP() + +#define portINLINE __inline + +#ifndef portFORCE_INLINE + #define portFORCE_INLINE inline __attribute__(( always_inline)) +#endif + +portFORCE_INLINE static BaseType_t xPortIsInsideInterrupt( void ) +{ +uint32_t ulCurrentInterrupt; +BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile( "mrs %0, ipsr" : "=r"( ulCurrentInterrupt ) ); + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; +} + +/*-----------------------------------------------------------*/ + +portFORCE_INLINE static void vPortRaiseBASEPRI( void ) +{ +uint32_t ulNewBASEPRI; + + __asm volatile + ( + " mov %0, %1 \n" \ + " msr basepri, %0 \n" \ + " isb \n" \ + " dsb \n" \ + :"=r" (ulNewBASEPRI) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) + ); +} + +/*-----------------------------------------------------------*/ + +portFORCE_INLINE static uint32_t ulPortRaiseBASEPRI( void ) +{ +uint32_t ulOriginalBASEPRI, ulNewBASEPRI; + + __asm volatile + ( + " mrs %0, basepri \n" \ + " mov %1, %2 \n" \ + " msr basepri, %1 \n" \ + " isb \n" \ + " dsb \n" \ + :"=r" (ulOriginalBASEPRI), "=r" (ulNewBASEPRI) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) + ); + + /* This return will not be reached but is necessary to prevent compiler + warnings. */ + return ulOriginalBASEPRI; +} +/*-----------------------------------------------------------*/ + +portFORCE_INLINE static void vPortSetBASEPRI( uint32_t ulNewMaskValue ) +{ + __asm volatile + ( + " msr basepri, %0 " :: "r" ( ulNewMaskValue ) + ); +} +/*-----------------------------------------------------------*/ + + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CM3_MPU/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CM3_MPU/port.c new file mode 100644 index 0000000..0f30f01 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CM3_MPU/port.c @@ -0,0 +1,771 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the ARM CM3 port. + *----------------------------------------------------------*/ + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining +all the API functions to use the MPU wrappers. That should only be done when +task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "timers.h" +#include "event_groups.h" +#include "mpu_prototypes.h" + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Constants required to access and manipulate the NVIC. */ +#define portNVIC_SYSTICK_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( * ( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSPRI2_REG ( * ( ( volatile uint32_t * ) 0xe000ed20 ) ) +#define portNVIC_SYSPRI1_REG ( * ( ( volatile uint32_t * ) 0xe000ed1c ) ) +#define portNVIC_SYS_CTRL_STATE_REG ( * ( ( volatile uint32_t * ) 0xe000ed24 ) ) +#define portNVIC_MEM_FAULT_ENABLE ( 1UL << 16UL ) + +/* Constants required to access and manipulate the MPU. */ +#define portMPU_TYPE_REG ( * ( ( volatile uint32_t * ) 0xe000ed90 ) ) +#define portMPU_REGION_BASE_ADDRESS_REG ( * ( ( volatile uint32_t * ) 0xe000ed9C ) ) +#define portMPU_REGION_ATTRIBUTE_REG ( * ( ( volatile uint32_t * ) 0xe000edA0 ) ) +#define portMPU_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed94 ) ) +#define portEXPECTED_MPU_TYPE_VALUE ( 8UL << 8UL ) /* 8 regions, unified. */ +#define portMPU_ENABLE ( 0x01UL ) +#define portMPU_BACKGROUND_ENABLE ( 1UL << 2UL ) +#define portPRIVILEGED_EXECUTION_START_ADDRESS ( 0UL ) +#define portMPU_REGION_VALID ( 0x10UL ) +#define portMPU_REGION_ENABLE ( 0x01UL ) +#define portPERIPHERALS_START_ADDRESS 0x40000000UL +#define portPERIPHERALS_END_ADDRESS 0x5FFFFFFFUL + +/* Constants required to access and manipulate the SysTick. */ +#define portNVIC_SYSTICK_CLK ( 0x00000004UL ) +#define portNVIC_SYSTICK_INT ( 0x00000002UL ) +#define portNVIC_SYSTICK_ENABLE ( 0x00000001UL ) +#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) +#define portNVIC_SVC_PRI ( ( ( uint32_t ) configMAX_SYSCALL_INTERRUPT_PRIORITY - 1UL ) << 24UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) +#define portINITIAL_CONTROL_IF_UNPRIVILEGED ( 0x03 ) +#define portINITIAL_CONTROL_IF_PRIVILEGED ( 0x02 ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( * ( ( volatile uint32_t * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Offsets in the stack to the parameters when inside the SVC handler. */ +#define portOFFSET_TO_PC ( 6 ) + +/* For strict compliance with the Cortex-M spec the task start address should +have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ +#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) + +/* Each task maintains its own interrupt status in the critical nesting +variable. Note this is not saved as part of the task context as context +switches can only occur when uxCriticalNesting is zero. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* + * Setup the timer to generate the tick interrupts. + */ +static void prvSetupTimerInterrupt( void ) PRIVILEGED_FUNCTION; + +/* + * Configure a number of standard MPU regions that are used by all tasks. + */ +static void prvSetupMPU( void ) PRIVILEGED_FUNCTION; + +/* + * Return the smallest MPU region size that a given number of bytes will fit + * into. The region size is returned as the value that should be programmed + * into the region attribute register for that region. + */ +static uint32_t prvGetMPURegionSizeSetting( uint32_t ulActualSizeInBytes ) PRIVILEGED_FUNCTION; + +/* + * Checks to see if being called from the context of an unprivileged task, and + * if so raises the privilege level and returns false - otherwise does nothing + * other than return true. + */ +BaseType_t xPortRaisePrivilege( void ) __attribute__(( naked )); + +/* + * Standard FreeRTOS exception handlers. + */ +void xPortPendSVHandler( void ) __attribute__ (( naked )) PRIVILEGED_FUNCTION; +void xPortSysTickHandler( void ) __attribute__ ((optimize("3"))) PRIVILEGED_FUNCTION; +void vPortSVCHandler( void ) __attribute__ (( naked )) PRIVILEGED_FUNCTION; + +/* + * Starts the scheduler by restoring the context of the first task to run. + */ +static void prvRestoreContextOfFirstTask( void ) __attribute__(( naked )) PRIVILEGED_FUNCTION; + +/* + * C portion of the SVC handler. The SVC handler is split between an asm entry + * and a C wrapper for simplicity of coding and maintenance. + */ +static void prvSVCHandler( uint32_t *pulRegisters ) __attribute__(( noinline )) PRIVILEGED_FUNCTION; + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static uint8_t ucMaxSysCallPriority = 0; + static uint32_t ulMaxPRIGROUPValue = 0; + static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const volatile uint8_t * const ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters, BaseType_t xRunPrivileged ) +{ + /* Simulate the stack frame as it would be created by a context switch + interrupt. */ + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ + pxTopOfStack--; + *pxTopOfStack = 0; /* LR */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack -= 9; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + if( xRunPrivileged == pdTRUE ) + { + *pxTopOfStack = portINITIAL_CONTROL_IF_PRIVILEGED; + } + else + { + *pxTopOfStack = portINITIAL_CONTROL_IF_UNPRIVILEGED; + } + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler( void ) +{ + /* Assumes psp was in use. */ + __asm volatile + ( + #ifndef USE_PROCESS_STACK /* Code should not be required if a main() is using the process stack. */ + " tst lr, #4 \n" + " ite eq \n" + " mrseq r0, msp \n" + " mrsne r0, psp \n" + #else + " mrs r0, psp \n" + #endif + " b %0 \n" + ::"i"(prvSVCHandler):"r0" + ); +} +/*-----------------------------------------------------------*/ + +static void prvSVCHandler( uint32_t *pulParam ) +{ +uint8_t ucSVCNumber; + + /* The stack contains: r0, r1, r2, r3, r12, r14, the return address and + xPSR. The first argument (r0) is pulParam[ 0 ]. */ + ucSVCNumber = ( ( uint8_t * ) pulParam[ portOFFSET_TO_PC ] )[ -2 ]; + switch( ucSVCNumber ) + { + case portSVC_START_SCHEDULER : portNVIC_SYSPRI1_REG |= portNVIC_SVC_PRI; + prvRestoreContextOfFirstTask(); + break; + + case portSVC_YIELD : portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + /* Barriers are normally not required + but do ensure the code is completely + within the specified behaviour for the + architecture. */ + __asm volatile( "dsb" ); + __asm volatile( "isb" ); + + break; + + case portSVC_RAISE_PRIVILEGE : __asm volatile + ( + " mrs r1, control \n" /* Obtain current control value. */ + " bic r1, #1 \n" /* Set privilege bit. */ + " msr control, r1 \n" /* Write back new control value. */ + :::"r1" + ); + break; + + default : /* Unknown SVC call. */ + break; + } +} +/*-----------------------------------------------------------*/ + +static void prvRestoreContextOfFirstTask( void ) +{ + __asm volatile + ( + " ldr r0, =0xE000ED08 \n" /* Use the NVIC offset register to locate the stack. */ + " ldr r0, [r0] \n" + " ldr r0, [r0] \n" + " msr msp, r0 \n" /* Set the msp back to the start of the stack. */ + " ldr r3, pxCurrentTCBConst2 \n" /* Restore the context. */ + " ldr r1, [r3] \n" + " ldr r0, [r1] \n" /* The first item in the TCB is the task top of stack. */ + " add r1, r1, #4 \n" /* Move onto the second item in the TCB... */ + " ldr r2, =0xe000ed9c \n" /* Region Base Address register. */ + " ldmia r1!, {r4-r11} \n" /* Read 4 sets of MPU registers. */ + " stmia r2!, {r4-r11} \n" /* Write 4 sets of MPU registers. */ + " ldmia r0!, {r3, r4-r11} \n" /* Pop the registers that are not automatically saved on exception entry. */ + " msr control, r3 \n" + " msr psp, r0 \n" /* Restore the task stack pointer. */ + " mov r0, #0 \n" + " msr basepri, r0 \n" + " ldr r14, =0xfffffffd \n" /* Load exec return code. */ + " bx r14 \n" + " \n" + " .align 4 \n" + "pxCurrentTCBConst2: .word pxCurrentTCB \n" + ); +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. See + http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + configASSERT( ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) ); + + #if( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + functions can be called. ISR safe functions are those that end in + "FromISR". FreeRTOS maintains separate thread and ISR API functions to + ensure interrupt entry is as fast and simple as possible. + + Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( uint8_t ) 0x01; + } + + /* Shift the priority group value back to its position within the AIRCR + register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* conifgASSERT_DEFINED */ + + /* Make PendSV and SysTick the same priority as the kernel, and the SVC + handler higher priority so it can be used to exit a critical section (where + lower priorities are masked). */ + portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI; + portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI; + + /* Configure the regions in the MPU that are common to all tasks. */ + prvSetupMPU(); + + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + prvSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Start the first task. */ + __asm volatile( + " ldr r0, =0xE000ED08 \n" /* Use the NVIC offset register to locate the stack. */ + " ldr r0, [r0] \n" + " ldr r0, [r0] \n" + " msr msp, r0 \n" /* Set the msp back to the start of the stack. */ + " cpsie i \n" /* Globally enable interrupts. */ + " cpsie f \n" + " dsb \n" + " isb \n" + " svc %0 \n" /* System call to start first task. */ + " nop \n" + :: "i" (portSVC_START_SCHEDULER) ); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + + vPortResetPrivilege( xRunningPrivileged ); +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } + vPortResetPrivilege( xRunningPrivileged ); +} +/*-----------------------------------------------------------*/ + +void xPortPendSVHandler( void ) +{ + /* This is a naked function. */ + + __asm volatile + ( + " mrs r0, psp \n" + " \n" + " ldr r3, pxCurrentTCBConst \n" /* Get the location of the current TCB. */ + " ldr r2, [r3] \n" + " \n" + " mrs r1, control \n" + " stmdb r0!, {r1, r4-r11} \n" /* Save the remaining registers. */ + " str r0, [r2] \n" /* Save the new top of stack into the first member of the TCB. */ + " \n" + " stmdb sp!, {r3, r14} \n" + " mov r0, %0 \n" + " msr basepri, r0 \n" + " bl vTaskSwitchContext \n" + " mov r0, #0 \n" + " msr basepri, r0 \n" + " ldmia sp!, {r3, r14} \n" + " \n" /* Restore the context. */ + " ldr r1, [r3] \n" + " ldr r0, [r1] \n" /* The first item in the TCB is the task top of stack. */ + " add r1, r1, #4 \n" /* Move onto the second item in the TCB... */ + " ldr r2, =0xe000ed9c \n" /* Region Base Address register. */ + " ldmia r1!, {r4-r11} \n" /* Read 4 sets of MPU registers. */ + " stmia r2!, {r4-r11} \n" /* Write 4 sets of MPU registers. */ + " ldmia r0!, {r3, r4-r11} \n" /* Pop the registers that are not automatically saved on exception entry. */ + " msr control, r3 \n" + " \n" + " msr psp, r0 \n" + " bx r14 \n" + " \n" + " .align 4 \n" + "pxCurrentTCBConst: .word pxCurrentTCB \n" + ::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY) + ); +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ +uint32_t ulDummy; + + ulDummy = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Pend a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulDummy ); +} +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +static void prvSetupTimerInterrupt( void ) +{ + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK | portNVIC_SYSTICK_INT | portNVIC_SYSTICK_ENABLE; +} +/*-----------------------------------------------------------*/ + +static void prvSetupMPU( void ) +{ +extern uint32_t __privileged_functions_end__[]; +extern uint32_t __FLASH_segment_start__[]; +extern uint32_t __FLASH_segment_end__[]; +extern uint32_t __privileged_data_start__[]; +extern uint32_t __privileged_data_end__[]; + + /* Check the expected MPU is present. */ + if( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ) + { + /* First setup the entire flash for unprivileged read only access. */ + portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __FLASH_segment_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portUNPRIVILEGED_FLASH_REGION ); + + portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_READ_ONLY ) | + ( portMPU_REGION_CACHEABLE_BUFFERABLE ) | + ( prvGetMPURegionSizeSetting( ( uint32_t ) __FLASH_segment_end__ - ( uint32_t ) __FLASH_segment_start__ ) ) | + ( portMPU_REGION_ENABLE ); + + /* Setup the first 16K for privileged only access (even though less + than 10K is actually being used). This is where the kernel code is + placed. */ + portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __FLASH_segment_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portPRIVILEGED_FLASH_REGION ); + + portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_PRIVILEGED_READ_ONLY ) | + ( portMPU_REGION_CACHEABLE_BUFFERABLE ) | + ( prvGetMPURegionSizeSetting( ( uint32_t ) __privileged_functions_end__ - ( uint32_t ) __FLASH_segment_start__ ) ) | + ( portMPU_REGION_ENABLE ); + + /* Setup the privileged data RAM region. This is where the kernel data + is placed. */ + portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __privileged_data_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portPRIVILEGED_RAM_REGION ); + + portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_PRIVILEGED_READ_WRITE ) | + ( portMPU_REGION_CACHEABLE_BUFFERABLE ) | + prvGetMPURegionSizeSetting( ( uint32_t ) __privileged_data_end__ - ( uint32_t ) __privileged_data_start__ ) | + ( portMPU_REGION_ENABLE ); + + /* By default allow everything to access the general peripherals. The + system peripherals and registers are protected. */ + portMPU_REGION_BASE_ADDRESS_REG = ( portPERIPHERALS_START_ADDRESS ) | + ( portMPU_REGION_VALID ) | + ( portGENERAL_PERIPHERALS_REGION ); + + portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_READ_WRITE | portMPU_REGION_EXECUTE_NEVER ) | + ( prvGetMPURegionSizeSetting( portPERIPHERALS_END_ADDRESS - portPERIPHERALS_START_ADDRESS ) ) | + ( portMPU_REGION_ENABLE ); + + /* Enable the memory fault exception. */ + portNVIC_SYS_CTRL_STATE_REG |= portNVIC_MEM_FAULT_ENABLE; + + /* Enable the MPU with the background region configured. */ + portMPU_CTRL_REG |= ( portMPU_ENABLE | portMPU_BACKGROUND_ENABLE ); + } +} +/*-----------------------------------------------------------*/ + +static uint32_t prvGetMPURegionSizeSetting( uint32_t ulActualSizeInBytes ) +{ +uint32_t ulRegionSize, ulReturnValue = 4; + + /* 32 is the smallest region size, 31 is the largest valid value for + ulReturnValue. */ + for( ulRegionSize = 32UL; ulReturnValue < 31UL; ( ulRegionSize <<= 1UL ) ) + { + if( ulActualSizeInBytes <= ulRegionSize ) + { + break; + } + else + { + ulReturnValue++; + } + } + + /* Shift the code by one before returning so it can be written directly + into the the correct bit position of the attribute register. */ + return ( ulReturnValue << 1UL ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortRaisePrivilege( void ) +{ + __asm volatile + ( + " mrs r0, control \n" + " tst r0, #1 \n" /* Is the task running privileged? */ + " itte ne \n" + " movne r0, #0 \n" /* CONTROL[0]!=0, return false. */ + " svcne %0 \n" /* Switch to privileged. */ + " moveq r0, #1 \n" /* CONTROL[0]==0, return true. */ + " bx lr \n" + :: "i" (portSVC_RAISE_PRIVILEGE) : "r0" + ); + + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortStoreTaskMPUSettings( xMPU_SETTINGS *xMPUSettings, const struct xMEMORY_REGION * const xRegions, StackType_t *pxBottomOfStack, uint32_t ulStackDepth ) +{ +extern uint32_t __SRAM_segment_start__[]; +extern uint32_t __SRAM_segment_end__[]; +extern uint32_t __privileged_data_start__[]; +extern uint32_t __privileged_data_end__[]; +int32_t lIndex; +uint32_t ul; + + if( xRegions == NULL ) + { + /* No MPU regions are specified so allow access to all RAM. */ + xMPUSettings->xRegion[ 0 ].ulRegionBaseAddress = + ( ( uint32_t ) __SRAM_segment_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portSTACK_REGION ); + + xMPUSettings->xRegion[ 0 ].ulRegionAttribute = + ( portMPU_REGION_READ_WRITE ) | + ( portMPU_REGION_CACHEABLE_BUFFERABLE ) | + ( prvGetMPURegionSizeSetting( ( uint32_t ) __SRAM_segment_end__ - ( uint32_t ) __SRAM_segment_start__ ) ) | + ( portMPU_REGION_ENABLE ); + + /* Re-instate the privileged only RAM region as xRegion[ 0 ] will have + just removed the privileged only parameters. */ + xMPUSettings->xRegion[ 1 ].ulRegionBaseAddress = + ( ( uint32_t ) __privileged_data_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portSTACK_REGION + 1 ); + + xMPUSettings->xRegion[ 1 ].ulRegionAttribute = + ( portMPU_REGION_PRIVILEGED_READ_WRITE ) | + ( portMPU_REGION_CACHEABLE_BUFFERABLE ) | + prvGetMPURegionSizeSetting( ( uint32_t ) __privileged_data_end__ - ( uint32_t ) __privileged_data_start__ ) | + ( portMPU_REGION_ENABLE ); + + /* Invalidate all other regions. */ + for( ul = 2; ul <= portNUM_CONFIGURABLE_REGIONS; ul++ ) + { + xMPUSettings->xRegion[ ul ].ulRegionBaseAddress = ( portSTACK_REGION + ul ) | portMPU_REGION_VALID; + xMPUSettings->xRegion[ ul ].ulRegionAttribute = 0UL; + } + } + else + { + /* This function is called automatically when the task is created - in + which case the stack region parameters will be valid. At all other + times the stack parameters will not be valid and it is assumed that the + stack region has already been configured. */ + if( ulStackDepth > 0 ) + { + /* Define the region that allows access to the stack. */ + xMPUSettings->xRegion[ 0 ].ulRegionBaseAddress = + ( ( uint32_t ) pxBottomOfStack ) | + ( portMPU_REGION_VALID ) | + ( portSTACK_REGION ); /* Region number. */ + + xMPUSettings->xRegion[ 0 ].ulRegionAttribute = + ( portMPU_REGION_READ_WRITE ) | /* Read and write. */ + ( prvGetMPURegionSizeSetting( ulStackDepth * ( uint32_t ) sizeof( StackType_t ) ) ) | + ( portMPU_REGION_CACHEABLE_BUFFERABLE ) | + ( portMPU_REGION_ENABLE ); + } + + lIndex = 0; + + for( ul = 1; ul <= portNUM_CONFIGURABLE_REGIONS; ul++ ) + { + if( ( xRegions[ lIndex ] ).ulLengthInBytes > 0UL ) + { + /* Translate the generic region definition contained in + xRegions into the CM3 specific MPU settings that are then + stored in xMPUSettings. */ + xMPUSettings->xRegion[ ul ].ulRegionBaseAddress = + ( ( uint32_t ) xRegions[ lIndex ].pvBaseAddress ) | + ( portMPU_REGION_VALID ) | + ( portSTACK_REGION + ul ); /* Region number. */ + + xMPUSettings->xRegion[ ul ].ulRegionAttribute = + ( prvGetMPURegionSizeSetting( xRegions[ lIndex ].ulLengthInBytes ) ) | + ( xRegions[ lIndex ].ulParameters ) | + ( portMPU_REGION_ENABLE ); + } + else + { + /* Invalidate the region. */ + xMPUSettings->xRegion[ ul ].ulRegionBaseAddress = ( portSTACK_REGION + ul ) | portMPU_REGION_VALID; + xMPUSettings->xRegion[ ul ].ulRegionAttribute = 0UL; + } + + lIndex++; + } + } +} +/*-----------------------------------------------------------*/ + +#if( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + uint32_t ulCurrentInterrupt; + uint8_t ucCurrentPriority; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile( "mrs %0, ipsr" : "=r"( ulCurrentInterrupt ) ); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + an interrupt that has been assigned a priority above + configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + function. ISR safe FreeRTOS API functions must *only* be called + from interrupts that have been assigned a priority at or below + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Numerically low interrupt priority numbers represent logically high + interrupt priorities, therefore the priority of the interrupt must + be set to a value equal to or numerically *higher* than + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Interrupts that use the FreeRTOS API must not be left at their + default priority of zero as that is the highest possible priority, + which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + and therefore also guaranteed to be invalid. + + FreeRTOS maintains separate thread and ISR API functions to ensure + interrupt entry is as fast and simple as possible. + + The following links provide detailed information: + http://www.freertos.org/RTOS-Cortex-M3-M4.html + http://www.freertos.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + that define each interrupt's priority to be split between bits that + define the interrupt's pre-emption priority bits and bits that define + the interrupt's sub-priority. For simplicity all bits must be defined + to be pre-emption priority bits. The following assertion will fail if + this is not the case (if some bits represent a sub-priority). + + If the application only uses CMSIS libraries for interrupt + configuration then the correct setting can be achieved on all Cortex-M + devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + scheduler. Note however that some vendor specific peripheral libraries + assume a non-zero priority group setting, in which cases using a value + of zero will result in unpredicable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ +/*-----------------------------------------------------------*/ + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CM3_MPU/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CM3_MPU/portmacro.h new file mode 100644 index 0000000..7b89966 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CM3_MPU/portmacro.h @@ -0,0 +1,332 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* MPU specific constants. */ +#define portUSING_MPU_WRAPPERS 1 +#define portPRIVILEGE_BIT ( 0x80000000UL ) + +#define portMPU_REGION_READ_WRITE ( 0x03UL << 24UL ) +#define portMPU_REGION_PRIVILEGED_READ_ONLY ( 0x05UL << 24UL ) +#define portMPU_REGION_READ_ONLY ( 0x06UL << 24UL ) +#define portMPU_REGION_PRIVILEGED_READ_WRITE ( 0x01UL << 24UL ) +#define portMPU_REGION_CACHEABLE_BUFFERABLE ( 0x07UL << 16UL ) +#define portMPU_REGION_EXECUTE_NEVER ( 0x01UL << 28UL ) + +#define portUNPRIVILEGED_FLASH_REGION ( 0UL ) +#define portPRIVILEGED_FLASH_REGION ( 1UL ) +#define portPRIVILEGED_RAM_REGION ( 2UL ) +#define portGENERAL_PERIPHERALS_REGION ( 3UL ) +#define portSTACK_REGION ( 4UL ) +#define portFIRST_CONFIGURABLE_REGION ( 5UL ) +#define portLAST_CONFIGURABLE_REGION ( 7UL ) +#define portNUM_CONFIGURABLE_REGIONS ( ( portLAST_CONFIGURABLE_REGION - portFIRST_CONFIGURABLE_REGION ) + 1 ) +#define portTOTAL_NUM_REGIONS ( portNUM_CONFIGURABLE_REGIONS + 1 ) /* Plus one to make space for the stack region. */ + +#define portSWITCH_TO_USER_MODE() __asm volatile ( " mrs r0, control \n orr r0, #1 \n msr control, r0 " :::"r0" ) + +typedef struct MPU_REGION_REGISTERS +{ + uint32_t ulRegionBaseAddress; + uint32_t ulRegionAttribute; +} xMPU_REGION_REGISTERS; + +/* Plus 1 to create space for the stack region. */ +typedef struct MPU_SETTINGS +{ + xMPU_REGION_REGISTERS xRegion[ portTOTAL_NUM_REGIONS ]; +} xMPU_SETTINGS; + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +/*-----------------------------------------------------------*/ + +/* SVC numbers for various services. */ +#define portSVC_START_SCHEDULER 0 +#define portSVC_YIELD 1 +#define portSVC_RAISE_PRIVILEGE 2 + +/* Scheduler utilities. */ + +#define portYIELD() __asm volatile ( " SVC %0 \n" :: "i" (portSVC_YIELD) ) +#define portYIELD_WITHIN_API() \ +{ \ + /* Set a PendSV to request a context switch. */ \ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ + \ + /* Barriers are normally not required but do ensure the code is completely \ + within the specified behaviour for the architecture. */ \ + __asm volatile( "dsb" ); \ + __asm volatile( "isb" ); \ +} + +#define portNVIC_INT_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed04 ) ) +#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) +#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); +#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortRaiseBASEPRI() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vPortSetBASEPRI(x) +#define portDISABLE_INTERRUPTS() vPortRaiseBASEPRI() +#define portENABLE_INTERRUPTS() vPortSetBASEPRI(0) +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are +not necessary for to use this port. They are defined so the common demo files +(which build with all the ports) will build. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*-----------------------------------------------------------*/ + +/* Architecture specific optimisations. */ +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Generic helper function. */ + __attribute__( ( always_inline ) ) static inline uint8_t ucPortCountLeadingZeros( uint32_t ulBitmap ) + { + uint8_t ucReturn; + + __asm volatile ( "clz %0, %1" : "=r" ( ucReturn ) : "r" ( ulBitmap ) ); + return ucReturn; + } + + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) ucPortCountLeadingZeros( ( uxReadyPriorities ) ) ) + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +/*-----------------------------------------------------------*/ + +#ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() +#endif + +/* portNOP() is not required by this port. */ +#define portNOP() + +#define portINLINE __inline + +#ifndef portFORCE_INLINE + #define portFORCE_INLINE inline __attribute__(( always_inline)) +#endif + +/* Set the privilege level to user mode if xRunningPrivileged is false. */ +portFORCE_INLINE static void vPortResetPrivilege( BaseType_t xRunningPrivileged ) +{ + if( xRunningPrivileged != pdTRUE ) + { + __asm volatile ( " mrs r0, control \n" \ + " orr r0, #1 \n" \ + " msr control, r0 \n" \ + :::"r0" ); + } +} +/*-----------------------------------------------------------*/ + +portFORCE_INLINE static BaseType_t xPortIsInsideInterrupt( void ) +{ +uint32_t ulCurrentInterrupt; +BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile( "mrs %0, ipsr" : "=r"( ulCurrentInterrupt ) ); + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; +} + +/*-----------------------------------------------------------*/ + +portFORCE_INLINE static void vPortRaiseBASEPRI( void ) +{ +uint32_t ulNewBASEPRI; + + __asm volatile + ( + " mov %0, %1 \n" \ + " msr basepri, %0 \n" \ + " isb \n" \ + " dsb \n" \ + :"=r" (ulNewBASEPRI) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) + ); +} + +/*-----------------------------------------------------------*/ + +portFORCE_INLINE static uint32_t ulPortRaiseBASEPRI( void ) +{ +uint32_t ulOriginalBASEPRI, ulNewBASEPRI; + + __asm volatile + ( + " mrs %0, basepri \n" \ + " mov %1, %2 \n" \ + " msr basepri, %1 \n" \ + " isb \n" \ + " dsb \n" \ + :"=r" (ulOriginalBASEPRI), "=r" (ulNewBASEPRI) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) + ); + + /* This return will not be reached but is necessary to prevent compiler + warnings. */ + return ulOriginalBASEPRI; +} +/*-----------------------------------------------------------*/ + +portFORCE_INLINE static void vPortSetBASEPRI( uint32_t ulNewMaskValue ) +{ + __asm volatile + ( + " msr basepri, %0 " :: "r" ( ulNewMaskValue ) + ); +} +/*-----------------------------------------------------------*/ + + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c new file mode 100644 index 0000000..42f5b37 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c @@ -0,0 +1,763 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the ARM CM4F port. + *----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#ifndef __VFP_FP__ + #error This port can only be used when the project options are configured to enable hardware floating point support. +#endif + +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#else + /* The way the SysTick is clocked is not modified in case it is not the same + as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 0 ) +#endif + +/* Constants required to manipulate the core. Registers first... */ +#define portNVIC_SYSTICK_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( * ( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( * ( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SYSPRI2_REG ( * ( ( volatile uint32_t * ) 0xe000ed20 ) ) +/* ...then bits in the registers. */ +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) + +/* Constants used to detect a Cortex-M7 r0p1 core, which should use the ARM_CM7 +r0p1 port. */ +#define portCPUID ( * ( ( volatile uint32_t * ) 0xE000ed00 ) ) +#define portCORTEX_M7_r0p1_ID ( 0x410FC271UL ) +#define portCORTEX_M7_r0p0_ID ( 0x410FC270UL ) + +#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( * ( ( volatile uint32_t * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */ +#define portVECTACTIVE_MASK ( 0xFFUL ) + +/* Constants required to manipulate the VFP. */ +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating point context control register. */ +#define portASPEN_AND_LSPEN_BITS ( 0x3UL << 30UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) +#define portINITIAL_EXEC_RETURN ( 0xfffffffd ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* For strict compliance with the Cortex-M spec the task start address should +have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ +#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have +occurred while the SysTick counter is stopped during tickless idle +calculations. */ +#define portMISSED_COUNTS_FACTOR ( 45UL ) + +/* Let the user override the pre-loading of the initial LR with the address of +prvTaskExitError() in case it messes up unwinding of the stack in the +debugger. */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/* Each task maintains its own interrupt status in the critical nesting +variable. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortPendSVHandler( void ) __attribute__ (( naked )); +void xPortSysTickHandler( void ); +void vPortSVCHandler( void ) __attribute__ (( naked )); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +static void prvPortStartFirstTask( void ) __attribute__ (( naked )); + +/* + * Function to enable the VFP. + */ +static void vPortEnableVFP( void ) __attribute__ (( naked )); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* + * The number of SysTick increments that make up one tick period. + */ +#if configUSE_TICKLESS_IDLE == 1 + static uint32_t ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * The maximum number of tick periods that can be suppressed is limited by the + * 24 bit resolution of the SysTick timer. + */ +#if configUSE_TICKLESS_IDLE == 1 + static uint32_t xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Compensate for the CPU cycles that pass while the SysTick is stopped (low + * power functionality only. + */ +#if configUSE_TICKLESS_IDLE == 1 + static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static uint8_t ucMaxSysCallPriority = 0; + static uint32_t ulMaxPRIGROUPValue = 0; + static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const volatile uint8_t * const ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + interrupt. */ + + /* Offset added to account for the way the MCU uses the stack on entry/exit + of interrupts, and to ensure alignment. */ + pxTopOfStack--; + + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + + /* Save code space by skipping register initialisation. */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + + /* A save method is being used that requires each task to maintain its + own exec return value. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXEC_RETURN; + + pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + for( ;; ); +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler( void ) +{ + __asm volatile ( + " ldr r3, pxCurrentTCBConst2 \n" /* Restore the context. */ + " ldr r1, [r3] \n" /* Use pxCurrentTCBConst to get the pxCurrentTCB address. */ + " ldr r0, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. */ + " ldmia r0!, {r4-r11, r14} \n" /* Pop the registers that are not automatically saved on exception entry and the critical nesting count. */ + " msr psp, r0 \n" /* Restore the task stack pointer. */ + " isb \n" + " mov r0, #0 \n" + " msr basepri, r0 \n" + " bx r14 \n" + " \n" + " .align 4 \n" + "pxCurrentTCBConst2: .word pxCurrentTCB \n" + ); +} +/*-----------------------------------------------------------*/ + +static void prvPortStartFirstTask( void ) +{ + __asm volatile( + " ldr r0, =0xE000ED08 \n" /* Use the NVIC offset register to locate the stack. */ + " ldr r0, [r0] \n" + " ldr r0, [r0] \n" + " msr msp, r0 \n" /* Set the msp back to the start of the stack. */ + " cpsie i \n" /* Globally enable interrupts. */ + " cpsie f \n" + " dsb \n" + " isb \n" + " svc 0 \n" /* System call to start first task. */ + " nop \n" + ); +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. + See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + + /* This port can be used on all revisions of the Cortex-M7 core other than + the r0p1 parts. r0p1 parts should use the port from the + /source/portable/GCC/ARM_CM7/r0p1 directory. */ + configASSERT( portCPUID != portCORTEX_M7_r0p1_ID ); + configASSERT( portCPUID != portCORTEX_M7_r0p0_ID ); + + #if( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + functions can be called. ISR safe functions are those that end in + "FromISR". FreeRTOS maintains separate thread and ISR API functions to + ensure interrupt entry is as fast and simple as possible. + + Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( uint8_t ) 0x01; + } + + /* Shift the priority group value back to its position within the AIRCR + register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* conifgASSERT_DEFINED */ + + /* Make PendSV and SysTick the lowest priority interrupts. */ + portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI; + portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Ensure the VFP is enabled - it should be anyway. */ + vPortEnableVFP(); + + /* Lazy save always. */ + *( portFPCCR ) |= portASPEN_AND_LSPEN_BITS; + + /* Start the first task. */ + prvPortStartFirstTask(); + + /* Should never get here as the tasks will now be executing! Call the task + exit error function to prevent compiler warnings about a static function + not being called in the case that the application writer overrides this + functionality by defining configTASK_RETURN_ADDRESS. */ + prvTaskExitError(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + assert() if it is being called from an interrupt context. Only API + functions that end in "FromISR" can be used in an interrupt. Only assert if + the critical nesting count is 1 to protect against recursive calls if the + assert function also uses a critical section. */ + if( uxCriticalNesting == 1 ) + { + configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void xPortPendSVHandler( void ) +{ + /* This is a naked function. */ + + __asm volatile + ( + " mrs r0, psp \n" + " isb \n" + " \n" + " ldr r3, pxCurrentTCBConst \n" /* Get the location of the current TCB. */ + " ldr r2, [r3] \n" + " \n" + " tst r14, #0x10 \n" /* Is the task using the FPU context? If so, push high vfp registers. */ + " it eq \n" + " vstmdbeq r0!, {s16-s31} \n" + " \n" + " stmdb r0!, {r4-r11, r14} \n" /* Save the core registers. */ + " \n" + " str r0, [r2] \n" /* Save the new top of stack into the first member of the TCB. */ + " \n" + " stmdb sp!, {r3} \n" + " mov r0, %0 \n" + " msr basepri, r0 \n" + " dsb \n" + " isb \n" + " bl vTaskSwitchContext \n" + " mov r0, #0 \n" + " msr basepri, r0 \n" + " ldmia sp!, {r3} \n" + " \n" + " ldr r1, [r3] \n" /* The first item in pxCurrentTCB is the task top of stack. */ + " ldr r0, [r1] \n" + " \n" + " ldmia r0!, {r4-r11, r14} \n" /* Pop the core registers. */ + " \n" + " tst r14, #0x10 \n" /* Is the task using the FPU context? If so, pop the high vfp registers too. */ + " it eq \n" + " vldmiaeq r0!, {s16-s31} \n" + " \n" + " msr psp, r0 \n" + " isb \n" + " \n" + #ifdef WORKAROUND_PMU_CM001 /* XMC4000 specific errata workaround. */ + #if WORKAROUND_PMU_CM001 == 1 + " push { r14 } \n" + " pop { pc } \n" + #endif + #endif + " \n" + " bx r14 \n" + " \n" + " .align 4 \n" + "pxCurrentTCBConst: .word pxCurrentTCB \n" + ::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY) + ); +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + /* The SysTick runs at the lowest interrupt priority, so when this interrupt + executes all interrupts must be unmasked. There is therefore no need to + save and then restore the interrupt mask value as its value is already + known. */ + portDISABLE_INTERRUPTS(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* A context switch is required. Context switching is performed in + the PendSV interrupt. Pend the PendSV interrupt. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portENABLE_INTERRUPTS(); +} +/*-----------------------------------------------------------*/ + +#if configUSE_TICKLESS_IDLE == 1 + + __attribute__((weak)) void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickCTRL; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Stop the SysTick momentarily. The time the SysTick is stopped for + is accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG &= ~portNVIC_SYSTICK_ENABLE_BIT; + + /* Calculate the reload value required to wait xExpectedIdleTime + tick periods. -1 is used because this code will execute part way + through one of the tick periods. */ + ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + method as that will mask interrupts that should exit sleep mode. */ + __asm volatile( "cpsid i" ); + __asm volatile( "dsb" ); + __asm volatile( "isb" ); + + /* If a context switch is pending or a task is waiting for the scheduler + to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Restart from whatever is left in the count register to complete + this tick period. */ + portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Reset the reload register to the value required for normal tick + periods. */ + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + + /* Re-enable interrupts - see comments above the cpsid instruction() + above. */ + __asm volatile( "cpsie i" ); + } + else + { + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + set its parameter to 0 to indicate that its implementation contains + its own wait for interrupt or wait for event instruction, and so wfi + should not be executed again. However, the original expected idle + time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + if( xModifiableIdleTime > 0 ) + { + __asm volatile( "dsb" ); + __asm volatile( "wfi" ); + __asm volatile( "isb" ); + } + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Stop SysTick. Again, the time the SysTick is stopped for is + accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + ulSysTickCTRL = portNVIC_SYSTICK_CTRL_REG; + portNVIC_SYSTICK_CTRL_REG = ( ulSysTickCTRL & ~portNVIC_SYSTICK_ENABLE_BIT ); + + /* Re-enable interrupts - see comments above the cpsid instruction() + above. */ + __asm volatile( "cpsie i" ); + + if( ( ulSysTickCTRL & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt has already executed, and the SysTick + count reloaded with ulReloadValue. Reset the + portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick + period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + underflowed because the post sleep hook did something + that took too long. */ + if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* The tick interrupt handler will already have pended the tick + processing in the kernel. As the pending tick will be + processed as soon as this function exits, the tick value + maintained by the tick is stepped forward by one less than the + time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. + Work out how long the sleep lasted rounded to complete tick + periods (not the ulReload value which accounted for part + ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* How many complete tick periods passed while the processor + was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG + again, then set portNVIC_SYSTICK_LOAD_REG back to its standard + value. The critical section is used to ensure the tick interrupt + can only execute once in the case that the reload register is near + zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portENTER_CRITICAL(); + { + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + vTaskStepTick( ulCompleteTickPeriods ); + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + portEXIT_CRITICAL(); + } + } + +#endif /* #if configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +__attribute__(( weak )) void vPortSetupTimerInterrupt( void ) +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if configUSE_TICKLESS_IDLE == 1 + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); +} +/*-----------------------------------------------------------*/ + +/* This is a naked function. */ +static void vPortEnableVFP( void ) +{ + __asm volatile + ( + " ldr.w r0, =0xE000ED88 \n" /* The FPU enable bits are in the CPACR. */ + " ldr r1, [r0] \n" + " \n" + " orr r1, r1, #( 0xf << 20 ) \n" /* Enable CP10 and CP11 coprocessors, then save back. */ + " str r1, [r0] \n" + " bx r14 " + ); +} +/*-----------------------------------------------------------*/ + +#if( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + uint32_t ulCurrentInterrupt; + uint8_t ucCurrentPriority; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile( "mrs %0, ipsr" : "=r"( ulCurrentInterrupt ) ); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + an interrupt that has been assigned a priority above + configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + function. ISR safe FreeRTOS API functions must *only* be called + from interrupts that have been assigned a priority at or below + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Numerically low interrupt priority numbers represent logically high + interrupt priorities, therefore the priority of the interrupt must + be set to a value equal to or numerically *higher* than + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Interrupts that use the FreeRTOS API must not be left at their + default priority of zero as that is the highest possible priority, + which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + and therefore also guaranteed to be invalid. + + FreeRTOS maintains separate thread and ISR API functions to ensure + interrupt entry is as fast and simple as possible. + + The following links provide detailed information: + http://www.freertos.org/RTOS-Cortex-M3-M4.html + http://www.freertos.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + that define each interrupt's priority to be split between bits that + define the interrupt's pre-emption priority bits and bits that define + the interrupt's sub-priority. For simplicity all bits must be defined + to be pre-emption priority bits. The following assertion will fail if + this is not the case (if some bits represent a sub-priority). + + If the application only uses CMSIS libraries for interrupt + configuration then the correct setting can be achieved on all Cortex-M + devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + scheduler. Note however that some vendor specific peripheral libraries + assume a non-zero priority group setting, in which cases using a value + of zero will result in unpredicable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CM4F/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CM4F/portmacro.h new file mode 100644 index 0000000..b72042d --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CM4F/portmacro.h @@ -0,0 +1,284 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +/*-----------------------------------------------------------*/ + +/* Scheduler utilities. */ +#define portYIELD() \ +{ \ + /* Set a PendSV to request a context switch. */ \ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ + \ + /* Barriers are normally not required but do ensure the code is completely \ + within the specified behaviour for the architecture. */ \ + __asm volatile( "dsb" ); \ + __asm volatile( "isb" ); \ +} + +#define portNVIC_INT_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed04 ) ) +#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) +#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired != pdFALSE ) portYIELD() +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); +#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortRaiseBASEPRI() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vPortSetBASEPRI(x) +#define portDISABLE_INTERRUPTS() vPortRaiseBASEPRI() +#define portENABLE_INTERRUPTS() vPortSetBASEPRI(0) +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are +not necessary for to use this port. They are defined so the common demo files +(which build with all the ports) will build. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ +#ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specific optimisations. */ +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Generic helper function. */ + __attribute__( ( always_inline ) ) static inline uint8_t ucPortCountLeadingZeros( uint32_t ulBitmap ) + { + uint8_t ucReturn; + + __asm volatile ( "clz %0, %1" : "=r" ( ucReturn ) : "r" ( ulBitmap ) ); + return ucReturn; + } + + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) ucPortCountLeadingZeros( ( uxReadyPriorities ) ) ) + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +/*-----------------------------------------------------------*/ + +#ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() +#endif + +/* portNOP() is not required by this port. */ +#define portNOP() + +#define portINLINE __inline + +#ifndef portFORCE_INLINE + #define portFORCE_INLINE inline __attribute__(( always_inline)) +#endif + +portFORCE_INLINE static BaseType_t xPortIsInsideInterrupt( void ) +{ +uint32_t ulCurrentInterrupt; +BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile( "mrs %0, ipsr" : "=r"( ulCurrentInterrupt ) ); + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; +} + +/*-----------------------------------------------------------*/ + +portFORCE_INLINE static void vPortRaiseBASEPRI( void ) +{ +uint32_t ulNewBASEPRI; + + __asm volatile + ( + " mov %0, %1 \n" \ + " msr basepri, %0 \n" \ + " isb \n" \ + " dsb \n" \ + :"=r" (ulNewBASEPRI) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) + ); +} + +/*-----------------------------------------------------------*/ + +portFORCE_INLINE static uint32_t ulPortRaiseBASEPRI( void ) +{ +uint32_t ulOriginalBASEPRI, ulNewBASEPRI; + + __asm volatile + ( + " mrs %0, basepri \n" \ + " mov %1, %2 \n" \ + " msr basepri, %1 \n" \ + " isb \n" \ + " dsb \n" \ + :"=r" (ulOriginalBASEPRI), "=r" (ulNewBASEPRI) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) + ); + + /* This return will not be reached but is necessary to prevent compiler + warnings. */ + return ulOriginalBASEPRI; +} +/*-----------------------------------------------------------*/ + +portFORCE_INLINE static void vPortSetBASEPRI( uint32_t ulNewMaskValue ) +{ + __asm volatile + ( + " msr basepri, %0 " :: "r" ( ulNewMaskValue ) + ); +} +/*-----------------------------------------------------------*/ + + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CM4_MPU/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CM4_MPU/port.c new file mode 100644 index 0000000..83e1753 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CM4_MPU/port.c @@ -0,0 +1,819 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the ARM CM3 port. + *----------------------------------------------------------*/ + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining +all the API functions to use the MPU wrappers. That should only be done when +task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "queue.h" +#include "event_groups.h" +#include "mpu_prototypes.h" + +#ifndef __VFP_FP__ + #error This port can only be used when the project options are configured to enable hardware floating point support. +#endif + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Constants required to access and manipulate the NVIC. */ +#define portNVIC_SYSTICK_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( * ( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSPRI2_REG ( * ( ( volatile uint32_t * ) 0xe000ed20 ) ) +#define portNVIC_SYSPRI1_REG ( * ( ( volatile uint32_t * ) 0xe000ed1c ) ) +#define portNVIC_SYS_CTRL_STATE_REG ( * ( ( volatile uint32_t * ) 0xe000ed24 ) ) +#define portNVIC_MEM_FAULT_ENABLE ( 1UL << 16UL ) + +/* Constants required to access and manipulate the MPU. */ +#define portMPU_TYPE_REG ( * ( ( volatile uint32_t * ) 0xe000ed90 ) ) +#define portMPU_REGION_BASE_ADDRESS_REG ( * ( ( volatile uint32_t * ) 0xe000ed9C ) ) +#define portMPU_REGION_ATTRIBUTE_REG ( * ( ( volatile uint32_t * ) 0xe000edA0 ) ) +#define portMPU_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed94 ) ) +#define portEXPECTED_MPU_TYPE_VALUE ( 8UL << 8UL ) /* 8 regions, unified. */ +#define portMPU_ENABLE ( 0x01UL ) +#define portMPU_BACKGROUND_ENABLE ( 1UL << 2UL ) +#define portPRIVILEGED_EXECUTION_START_ADDRESS ( 0UL ) +#define portMPU_REGION_VALID ( 0x10UL ) +#define portMPU_REGION_ENABLE ( 0x01UL ) +#define portPERIPHERALS_START_ADDRESS 0x40000000UL +#define portPERIPHERALS_END_ADDRESS 0x5FFFFFFFUL + +/* Constants required to access and manipulate the SysTick. */ +#define portNVIC_SYSTICK_CLK ( 0x00000004UL ) +#define portNVIC_SYSTICK_INT ( 0x00000002UL ) +#define portNVIC_SYSTICK_ENABLE ( 0x00000001UL ) +#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) +#define portNVIC_SVC_PRI ( ( ( uint32_t ) configMAX_SYSCALL_INTERRUPT_PRIORITY - 1UL ) << 24UL ) + +/* Constants required to manipulate the VFP. */ +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34UL ) /* Floating point context control register. */ +#define portASPEN_AND_LSPEN_BITS ( 0x3UL << 30UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000UL ) +#define portINITIAL_EXEC_RETURN ( 0xfffffffdUL ) +#define portINITIAL_CONTROL_IF_UNPRIVILEGED ( 0x03 ) +#define portINITIAL_CONTROL_IF_PRIVILEGED ( 0x02 ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( * ( ( volatile uint32_t * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Offsets in the stack to the parameters when inside the SVC handler. */ +#define portOFFSET_TO_PC ( 6 ) + +/* For strict compliance with the Cortex-M spec the task start address should +have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ +#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) + +/* Each task maintains its own interrupt status in the critical nesting +variable. Note this is not saved as part of the task context as context +switches can only occur when uxCriticalNesting is zero. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* + * Setup the timer to generate the tick interrupts. + */ +static void prvSetupTimerInterrupt( void ) PRIVILEGED_FUNCTION; + +/* + * Configure a number of standard MPU regions that are used by all tasks. + */ +static void prvSetupMPU( void ) PRIVILEGED_FUNCTION; + +/* + * Return the smallest MPU region size that a given number of bytes will fit + * into. The region size is returned as the value that should be programmed + * into the region attribute register for that region. + */ +static uint32_t prvGetMPURegionSizeSetting( uint32_t ulActualSizeInBytes ) PRIVILEGED_FUNCTION; + +/* + * Checks to see if being called from the context of an unprivileged task, and + * if so raises the privilege level and returns false - otherwise does nothing + * other than return true. + */ +BaseType_t xPortRaisePrivilege( void ) __attribute__(( naked )); + +/* + * Standard FreeRTOS exception handlers. + */ +void xPortPendSVHandler( void ) __attribute__ (( naked )) PRIVILEGED_FUNCTION; +void xPortSysTickHandler( void ) __attribute__ ((optimize("3"))) PRIVILEGED_FUNCTION; +void vPortSVCHandler( void ) __attribute__ (( naked )) PRIVILEGED_FUNCTION; + +/* + * Starts the scheduler by restoring the context of the first task to run. + */ +static void prvRestoreContextOfFirstTask( void ) __attribute__(( naked )) PRIVILEGED_FUNCTION; + +/* + * C portion of the SVC handler. The SVC handler is split between an asm entry + * and a C wrapper for simplicity of coding and maintenance. + */ +static void prvSVCHandler( uint32_t *pulRegisters ) __attribute__(( noinline )) PRIVILEGED_FUNCTION; + +/* + * Function to enable the VFP. + */ + static void vPortEnableVFP( void ) __attribute__ (( naked )); + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static uint8_t ucMaxSysCallPriority = 0; + static uint32_t ulMaxPRIGROUPValue = 0; + static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const volatile uint8_t * const ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters, BaseType_t xRunPrivileged ) +{ + /* Simulate the stack frame as it would be created by a context switch + interrupt. */ + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ + pxTopOfStack--; + *pxTopOfStack = 0; /* LR */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + + /* A save method is being used that requires each task to maintain its + own exec return value. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXEC_RETURN; + + pxTopOfStack -= 9; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + if( xRunPrivileged == pdTRUE ) + { + *pxTopOfStack = portINITIAL_CONTROL_IF_PRIVILEGED; + } + else + { + *pxTopOfStack = portINITIAL_CONTROL_IF_UNPRIVILEGED; + } + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler( void ) +{ + /* Assumes psp was in use. */ + __asm volatile + ( + #ifndef USE_PROCESS_STACK /* Code should not be required if a main() is using the process stack. */ + " tst lr, #4 \n" + " ite eq \n" + " mrseq r0, msp \n" + " mrsne r0, psp \n" + #else + " mrs r0, psp \n" + #endif + " b %0 \n" + ::"i"(prvSVCHandler):"r0" + ); +} +/*-----------------------------------------------------------*/ + +static void prvSVCHandler( uint32_t *pulParam ) +{ +uint8_t ucSVCNumber; + + /* The stack contains: r0, r1, r2, r3, r12, r14, the return address and + xPSR. The first argument (r0) is pulParam[ 0 ]. */ + ucSVCNumber = ( ( uint8_t * ) pulParam[ portOFFSET_TO_PC ] )[ -2 ]; + switch( ucSVCNumber ) + { + case portSVC_START_SCHEDULER : portNVIC_SYSPRI1_REG |= portNVIC_SVC_PRI; + prvRestoreContextOfFirstTask(); + break; + + case portSVC_YIELD : portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + /* Barriers are normally not required + but do ensure the code is completely + within the specified behaviour for the + architecture. */ + __asm volatile( "dsb" ); + __asm volatile( "isb" ); + + break; + + case portSVC_RAISE_PRIVILEGE : __asm volatile + ( + " mrs r1, control \n" /* Obtain current control value. */ + " bic r1, #1 \n" /* Set privilege bit. */ + " msr control, r1 \n" /* Write back new control value. */ + :::"r1" + ); + break; + + default : /* Unknown SVC call. */ + break; + } +} +/*-----------------------------------------------------------*/ + +static void prvRestoreContextOfFirstTask( void ) +{ + __asm volatile + ( + " ldr r0, =0xE000ED08 \n" /* Use the NVIC offset register to locate the stack. */ + " ldr r0, [r0] \n" + " ldr r0, [r0] \n" + " msr msp, r0 \n" /* Set the msp back to the start of the stack. */ + " ldr r3, pxCurrentTCBConst2 \n" /* Restore the context. */ + " ldr r1, [r3] \n" + " ldr r0, [r1] \n" /* The first item in the TCB is the task top of stack. */ + " add r1, r1, #4 \n" /* Move onto the second item in the TCB... */ + " ldr r2, =0xe000ed9c \n" /* Region Base Address register. */ + " ldmia r1!, {r4-r11} \n" /* Read 4 sets of MPU registers. */ + " stmia r2!, {r4-r11} \n" /* Write 4 sets of MPU registers. */ + " ldmia r0!, {r3-r11, r14} \n" /* Pop the registers that are not automatically saved on exception entry. */ + " msr control, r3 \n" + " msr psp, r0 \n" /* Restore the task stack pointer. */ + " mov r0, #0 \n" + " msr basepri, r0 \n" + " bx r14 \n" + " \n" + " .align 4 \n" + "pxCurrentTCBConst2: .word pxCurrentTCB \n" + ); +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. See + http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + configASSERT( ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) ); + + #if( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + functions can be called. ISR safe functions are those that end in + "FromISR". FreeRTOS maintains separate thread and ISR API functions to + ensure interrupt entry is as fast and simple as possible. + + Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( uint8_t ) 0x01; + } + + /* Shift the priority group value back to its position within the AIRCR + register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* conifgASSERT_DEFINED */ + + /* Make PendSV and SysTick the same priority as the kernel, and the SVC + handler higher priority so it can be used to exit a critical section (where + lower priorities are masked). */ + portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI; + portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI; + + /* Configure the regions in the MPU that are common to all tasks. */ + prvSetupMPU(); + + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + prvSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Ensure the VFP is enabled - it should be anyway. */ + vPortEnableVFP(); + + /* Lazy save always. */ + *( portFPCCR ) |= portASPEN_AND_LSPEN_BITS; + + /* Start the first task. */ + __asm volatile( + " ldr r0, =0xE000ED08 \n" /* Use the NVIC offset register to locate the stack. */ + " ldr r0, [r0] \n" + " ldr r0, [r0] \n" + " msr msp, r0 \n" /* Set the msp back to the start of the stack. */ + " cpsie i \n" /* Globally enable interrupts. */ + " cpsie f \n" + " dsb \n" + " isb \n" + " svc %0 \n" /* System call to start first task. */ + " nop \n" + :: "i" (portSVC_START_SCHEDULER) ); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + + vPortResetPrivilege( xRunningPrivileged ); +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } + vPortResetPrivilege( xRunningPrivileged ); +} +/*-----------------------------------------------------------*/ + +void xPortPendSVHandler( void ) +{ + /* This is a naked function. */ + + __asm volatile + ( + " mrs r0, psp \n" + " \n" + " ldr r3, pxCurrentTCBConst \n" /* Get the location of the current TCB. */ + " ldr r2, [r3] \n" + " \n" + " tst r14, #0x10 \n" /* Is the task using the FPU context? If so, push high vfp registers. */ + " it eq \n" + " vstmdbeq r0!, {s16-s31} \n" + " \n" + " mrs r1, control \n" + " stmdb r0!, {r1, r4-r11, r14} \n" /* Save the remaining registers. */ + " str r0, [r2] \n" /* Save the new top of stack into the first member of the TCB. */ + " \n" + " stmdb sp!, {r3} \n" + " mov r0, %0 \n" + " msr basepri, r0 \n" + " dsb \n" + " isb \n" + " bl vTaskSwitchContext \n" + " mov r0, #0 \n" + " msr basepri, r0 \n" + " ldmia sp!, {r3} \n" + " \n" /* Restore the context. */ + " ldr r1, [r3] \n" + " ldr r0, [r1] \n" /* The first item in the TCB is the task top of stack. */ + " add r1, r1, #4 \n" /* Move onto the second item in the TCB... */ + " ldr r2, =0xe000ed9c \n" /* Region Base Address register. */ + " ldmia r1!, {r4-r11} \n" /* Read 4 sets of MPU registers. */ + " stmia r2!, {r4-r11} \n" /* Write 4 sets of MPU registers. */ + " ldmia r0!, {r3-r11, r14} \n" /* Pop the registers that are not automatically saved on exception entry. */ + " msr control, r3 \n" + " \n" + " tst r14, #0x10 \n" /* Is the task using the FPU context? If so, pop the high vfp registers too. */ + " it eq \n" + " vldmiaeq r0!, {s16-s31} \n" + " \n" + " msr psp, r0 \n" + " bx r14 \n" + " \n" + " .align 4 \n" + "pxCurrentTCBConst: .word pxCurrentTCB \n" + ::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY) + ); +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ +uint32_t ulDummy; + + ulDummy = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Pend a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulDummy ); +} +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +static void prvSetupTimerInterrupt( void ) +{ + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK | portNVIC_SYSTICK_INT | portNVIC_SYSTICK_ENABLE; +} +/*-----------------------------------------------------------*/ + +/* This is a naked function. */ +static void vPortEnableVFP( void ) +{ + __asm volatile + ( + " ldr.w r0, =0xE000ED88 \n" /* The FPU enable bits are in the CPACR. */ + " ldr r1, [r0] \n" + " \n" + " orr r1, r1, #( 0xf << 20 ) \n" /* Enable CP10 and CP11 coprocessors, then save back. */ + " str r1, [r0] \n" + " bx r14 " + ); +} +/*-----------------------------------------------------------*/ + +static void prvSetupMPU( void ) +{ +extern uint32_t __privileged_functions_end__[]; +extern uint32_t __FLASH_segment_start__[]; +extern uint32_t __FLASH_segment_end__[]; +extern uint32_t __privileged_data_start__[]; +extern uint32_t __privileged_data_end__[]; + + /* Check the expected MPU is present. */ + if( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ) + { + /* First setup the entire flash for unprivileged read only access. */ + portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __FLASH_segment_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portUNPRIVILEGED_FLASH_REGION ); + + portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_READ_ONLY ) | + ( portMPU_REGION_CACHEABLE_BUFFERABLE ) | + ( prvGetMPURegionSizeSetting( ( uint32_t ) __FLASH_segment_end__ - ( uint32_t ) __FLASH_segment_start__ ) ) | + ( portMPU_REGION_ENABLE ); + + /* Setup the first 16K for privileged only access (even though less + than 10K is actually being used). This is where the kernel code is + placed. */ + portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __FLASH_segment_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portPRIVILEGED_FLASH_REGION ); + + portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_PRIVILEGED_READ_ONLY ) | + ( portMPU_REGION_CACHEABLE_BUFFERABLE ) | + ( prvGetMPURegionSizeSetting( ( uint32_t ) __privileged_functions_end__ - ( uint32_t ) __FLASH_segment_start__ ) ) | + ( portMPU_REGION_ENABLE ); + + /* Setup the privileged data RAM region. This is where the kernel data + is placed. */ + portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __privileged_data_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portPRIVILEGED_RAM_REGION ); + + portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_PRIVILEGED_READ_WRITE ) | + ( portMPU_REGION_CACHEABLE_BUFFERABLE ) | + prvGetMPURegionSizeSetting( ( uint32_t ) __privileged_data_end__ - ( uint32_t ) __privileged_data_start__ ) | + ( portMPU_REGION_ENABLE ); + + /* By default allow everything to access the general peripherals. The + system peripherals and registers are protected. */ + portMPU_REGION_BASE_ADDRESS_REG = ( portPERIPHERALS_START_ADDRESS ) | + ( portMPU_REGION_VALID ) | + ( portGENERAL_PERIPHERALS_REGION ); + + portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_READ_WRITE | portMPU_REGION_EXECUTE_NEVER ) | + ( prvGetMPURegionSizeSetting( portPERIPHERALS_END_ADDRESS - portPERIPHERALS_START_ADDRESS ) ) | + ( portMPU_REGION_ENABLE ); + + /* Enable the memory fault exception. */ + portNVIC_SYS_CTRL_STATE_REG |= portNVIC_MEM_FAULT_ENABLE; + + /* Enable the MPU with the background region configured. */ + portMPU_CTRL_REG |= ( portMPU_ENABLE | portMPU_BACKGROUND_ENABLE ); + } +} +/*-----------------------------------------------------------*/ + +static uint32_t prvGetMPURegionSizeSetting( uint32_t ulActualSizeInBytes ) +{ +uint32_t ulRegionSize, ulReturnValue = 4; + + /* 32 is the smallest region size, 31 is the largest valid value for + ulReturnValue. */ + for( ulRegionSize = 32UL; ulReturnValue < 31UL; ( ulRegionSize <<= 1UL ) ) + { + if( ulActualSizeInBytes <= ulRegionSize ) + { + break; + } + else + { + ulReturnValue++; + } + } + + /* Shift the code by one before returning so it can be written directly + into the the correct bit position of the attribute register. */ + return ( ulReturnValue << 1UL ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortRaisePrivilege( void ) +{ + __asm volatile + ( + " mrs r0, control \n" + " tst r0, #1 \n" /* Is the task running privileged? */ + " itte ne \n" + " movne r0, #0 \n" /* CONTROL[0]!=0, return false. */ + " svcne %0 \n" /* Switch to privileged. */ + " moveq r0, #1 \n" /* CONTROL[0]==0, return true. */ + " bx lr \n" + :: "i" (portSVC_RAISE_PRIVILEGE) : "r0" + ); + + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortStoreTaskMPUSettings( xMPU_SETTINGS *xMPUSettings, const struct xMEMORY_REGION * const xRegions, StackType_t *pxBottomOfStack, uint32_t ulStackDepth ) +{ +extern uint32_t __SRAM_segment_start__[]; +extern uint32_t __SRAM_segment_end__[]; +extern uint32_t __privileged_data_start__[]; +extern uint32_t __privileged_data_end__[]; +int32_t lIndex; +uint32_t ul; + + if( xRegions == NULL ) + { + /* No MPU regions are specified so allow access to all RAM. */ + xMPUSettings->xRegion[ 0 ].ulRegionBaseAddress = + ( ( uint32_t ) __SRAM_segment_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portSTACK_REGION ); + + xMPUSettings->xRegion[ 0 ].ulRegionAttribute = + ( portMPU_REGION_READ_WRITE ) | + ( portMPU_REGION_CACHEABLE_BUFFERABLE ) | + ( prvGetMPURegionSizeSetting( ( uint32_t ) __SRAM_segment_end__ - ( uint32_t ) __SRAM_segment_start__ ) ) | + ( portMPU_REGION_ENABLE ); + + /* Re-instate the privileged only RAM region as xRegion[ 0 ] will have + just removed the privileged only parameters. */ + xMPUSettings->xRegion[ 1 ].ulRegionBaseAddress = + ( ( uint32_t ) __privileged_data_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portSTACK_REGION + 1 ); + + xMPUSettings->xRegion[ 1 ].ulRegionAttribute = + ( portMPU_REGION_PRIVILEGED_READ_WRITE ) | + ( portMPU_REGION_CACHEABLE_BUFFERABLE ) | + prvGetMPURegionSizeSetting( ( uint32_t ) __privileged_data_end__ - ( uint32_t ) __privileged_data_start__ ) | + ( portMPU_REGION_ENABLE ); + + /* Invalidate all other regions. */ + for( ul = 2; ul <= portNUM_CONFIGURABLE_REGIONS; ul++ ) + { + xMPUSettings->xRegion[ ul ].ulRegionBaseAddress = ( portSTACK_REGION + ul ) | portMPU_REGION_VALID; + xMPUSettings->xRegion[ ul ].ulRegionAttribute = 0UL; + } + } + else + { + /* This function is called automatically when the task is created - in + which case the stack region parameters will be valid. At all other + times the stack parameters will not be valid and it is assumed that the + stack region has already been configured. */ + if( ulStackDepth > 0 ) + { + /* Define the region that allows access to the stack. */ + xMPUSettings->xRegion[ 0 ].ulRegionBaseAddress = + ( ( uint32_t ) pxBottomOfStack ) | + ( portMPU_REGION_VALID ) | + ( portSTACK_REGION ); /* Region number. */ + + xMPUSettings->xRegion[ 0 ].ulRegionAttribute = + ( portMPU_REGION_READ_WRITE ) | /* Read and write. */ + ( prvGetMPURegionSizeSetting( ulStackDepth * ( uint32_t ) sizeof( StackType_t ) ) ) | + ( portMPU_REGION_CACHEABLE_BUFFERABLE ) | + ( portMPU_REGION_ENABLE ); + } + + lIndex = 0; + + for( ul = 1; ul <= portNUM_CONFIGURABLE_REGIONS; ul++ ) + { + if( ( xRegions[ lIndex ] ).ulLengthInBytes > 0UL ) + { + /* Translate the generic region definition contained in + xRegions into the CM3 specific MPU settings that are then + stored in xMPUSettings. */ + xMPUSettings->xRegion[ ul ].ulRegionBaseAddress = + ( ( uint32_t ) xRegions[ lIndex ].pvBaseAddress ) | + ( portMPU_REGION_VALID ) | + ( portSTACK_REGION + ul ); /* Region number. */ + + xMPUSettings->xRegion[ ul ].ulRegionAttribute = + ( prvGetMPURegionSizeSetting( xRegions[ lIndex ].ulLengthInBytes ) ) | + ( xRegions[ lIndex ].ulParameters ) | + ( portMPU_REGION_ENABLE ); + } + else + { + /* Invalidate the region. */ + xMPUSettings->xRegion[ ul ].ulRegionBaseAddress = ( portSTACK_REGION + ul ) | portMPU_REGION_VALID; + xMPUSettings->xRegion[ ul ].ulRegionAttribute = 0UL; + } + + lIndex++; + } + } +} +/*-----------------------------------------------------------*/ + +#if( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + uint32_t ulCurrentInterrupt; + uint8_t ucCurrentPriority; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile( "mrs %0, ipsr" : "=r"( ulCurrentInterrupt ) ); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + an interrupt that has been assigned a priority above + configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + function. ISR safe FreeRTOS API functions must *only* be called + from interrupts that have been assigned a priority at or below + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Numerically low interrupt priority numbers represent logically high + interrupt priorities, therefore the priority of the interrupt must + be set to a value equal to or numerically *higher* than + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Interrupts that use the FreeRTOS API must not be left at their + default priority of zero as that is the highest possible priority, + which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + and therefore also guaranteed to be invalid. + + FreeRTOS maintains separate thread and ISR API functions to ensure + interrupt entry is as fast and simple as possible. + + The following links provide detailed information: + http://www.freertos.org/RTOS-Cortex-M3-M4.html + http://www.freertos.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + that define each interrupt's priority to be split between bits that + define the interrupt's pre-emption priority bits and bits that define + the interrupt's sub-priority. For simplicity all bits must be defined + to be pre-emption priority bits. The following assertion will fail if + this is not the case (if some bits represent a sub-priority). + + If the application only uses CMSIS libraries for interrupt + configuration then the correct setting can be achieved on all Cortex-M + devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + scheduler. Note however that some vendor specific peripheral libraries + assume a non-zero priority group setting, in which cases using a value + of zero will result in unpredicable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ +/*-----------------------------------------------------------*/ + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CM4_MPU/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CM4_MPU/portmacro.h new file mode 100644 index 0000000..7b89966 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CM4_MPU/portmacro.h @@ -0,0 +1,332 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* MPU specific constants. */ +#define portUSING_MPU_WRAPPERS 1 +#define portPRIVILEGE_BIT ( 0x80000000UL ) + +#define portMPU_REGION_READ_WRITE ( 0x03UL << 24UL ) +#define portMPU_REGION_PRIVILEGED_READ_ONLY ( 0x05UL << 24UL ) +#define portMPU_REGION_READ_ONLY ( 0x06UL << 24UL ) +#define portMPU_REGION_PRIVILEGED_READ_WRITE ( 0x01UL << 24UL ) +#define portMPU_REGION_CACHEABLE_BUFFERABLE ( 0x07UL << 16UL ) +#define portMPU_REGION_EXECUTE_NEVER ( 0x01UL << 28UL ) + +#define portUNPRIVILEGED_FLASH_REGION ( 0UL ) +#define portPRIVILEGED_FLASH_REGION ( 1UL ) +#define portPRIVILEGED_RAM_REGION ( 2UL ) +#define portGENERAL_PERIPHERALS_REGION ( 3UL ) +#define portSTACK_REGION ( 4UL ) +#define portFIRST_CONFIGURABLE_REGION ( 5UL ) +#define portLAST_CONFIGURABLE_REGION ( 7UL ) +#define portNUM_CONFIGURABLE_REGIONS ( ( portLAST_CONFIGURABLE_REGION - portFIRST_CONFIGURABLE_REGION ) + 1 ) +#define portTOTAL_NUM_REGIONS ( portNUM_CONFIGURABLE_REGIONS + 1 ) /* Plus one to make space for the stack region. */ + +#define portSWITCH_TO_USER_MODE() __asm volatile ( " mrs r0, control \n orr r0, #1 \n msr control, r0 " :::"r0" ) + +typedef struct MPU_REGION_REGISTERS +{ + uint32_t ulRegionBaseAddress; + uint32_t ulRegionAttribute; +} xMPU_REGION_REGISTERS; + +/* Plus 1 to create space for the stack region. */ +typedef struct MPU_SETTINGS +{ + xMPU_REGION_REGISTERS xRegion[ portTOTAL_NUM_REGIONS ]; +} xMPU_SETTINGS; + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +/*-----------------------------------------------------------*/ + +/* SVC numbers for various services. */ +#define portSVC_START_SCHEDULER 0 +#define portSVC_YIELD 1 +#define portSVC_RAISE_PRIVILEGE 2 + +/* Scheduler utilities. */ + +#define portYIELD() __asm volatile ( " SVC %0 \n" :: "i" (portSVC_YIELD) ) +#define portYIELD_WITHIN_API() \ +{ \ + /* Set a PendSV to request a context switch. */ \ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ + \ + /* Barriers are normally not required but do ensure the code is completely \ + within the specified behaviour for the architecture. */ \ + __asm volatile( "dsb" ); \ + __asm volatile( "isb" ); \ +} + +#define portNVIC_INT_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed04 ) ) +#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) +#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); +#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortRaiseBASEPRI() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vPortSetBASEPRI(x) +#define portDISABLE_INTERRUPTS() vPortRaiseBASEPRI() +#define portENABLE_INTERRUPTS() vPortSetBASEPRI(0) +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are +not necessary for to use this port. They are defined so the common demo files +(which build with all the ports) will build. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*-----------------------------------------------------------*/ + +/* Architecture specific optimisations. */ +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Generic helper function. */ + __attribute__( ( always_inline ) ) static inline uint8_t ucPortCountLeadingZeros( uint32_t ulBitmap ) + { + uint8_t ucReturn; + + __asm volatile ( "clz %0, %1" : "=r" ( ucReturn ) : "r" ( ulBitmap ) ); + return ucReturn; + } + + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) ucPortCountLeadingZeros( ( uxReadyPriorities ) ) ) + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +/*-----------------------------------------------------------*/ + +#ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() +#endif + +/* portNOP() is not required by this port. */ +#define portNOP() + +#define portINLINE __inline + +#ifndef portFORCE_INLINE + #define portFORCE_INLINE inline __attribute__(( always_inline)) +#endif + +/* Set the privilege level to user mode if xRunningPrivileged is false. */ +portFORCE_INLINE static void vPortResetPrivilege( BaseType_t xRunningPrivileged ) +{ + if( xRunningPrivileged != pdTRUE ) + { + __asm volatile ( " mrs r0, control \n" \ + " orr r0, #1 \n" \ + " msr control, r0 \n" \ + :::"r0" ); + } +} +/*-----------------------------------------------------------*/ + +portFORCE_INLINE static BaseType_t xPortIsInsideInterrupt( void ) +{ +uint32_t ulCurrentInterrupt; +BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile( "mrs %0, ipsr" : "=r"( ulCurrentInterrupt ) ); + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; +} + +/*-----------------------------------------------------------*/ + +portFORCE_INLINE static void vPortRaiseBASEPRI( void ) +{ +uint32_t ulNewBASEPRI; + + __asm volatile + ( + " mov %0, %1 \n" \ + " msr basepri, %0 \n" \ + " isb \n" \ + " dsb \n" \ + :"=r" (ulNewBASEPRI) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) + ); +} + +/*-----------------------------------------------------------*/ + +portFORCE_INLINE static uint32_t ulPortRaiseBASEPRI( void ) +{ +uint32_t ulOriginalBASEPRI, ulNewBASEPRI; + + __asm volatile + ( + " mrs %0, basepri \n" \ + " mov %1, %2 \n" \ + " msr basepri, %1 \n" \ + " isb \n" \ + " dsb \n" \ + :"=r" (ulOriginalBASEPRI), "=r" (ulNewBASEPRI) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) + ); + + /* This return will not be reached but is necessary to prevent compiler + warnings. */ + return ulOriginalBASEPRI; +} +/*-----------------------------------------------------------*/ + +portFORCE_INLINE static void vPortSetBASEPRI( uint32_t ulNewMaskValue ) +{ + __asm volatile + ( + " msr basepri, %0 " :: "r" ( ulNewMaskValue ) + ); +} +/*-----------------------------------------------------------*/ + + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CM7/ReadMe.txt b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CM7/ReadMe.txt new file mode 100644 index 0000000..d661449 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CM7/ReadMe.txt @@ -0,0 +1,18 @@ +There are two options for running FreeRTOS on ARM Cortex-M7 microcontrollers. +The best option depends on the revision of the ARM Cortex-M7 core in use. The +revision is specified by an 'r' number, and a 'p' number, so will look something +like 'r0p1'. Check the documentation for the microcontroller in use to find the +revision of the Cortex-M7 core used in that microcontroller. If in doubt, use +the FreeRTOS port provided specifically for r0p1 revisions, as that can be used +with all core revisions. + +The first option is to use the ARM Cortex-M4F port, and the second option is to +use the Cortex-M7 r0p1 port - the latter containing a minor errata workaround. + +If the revision of the ARM Cortex-M7 core is not r0p1 then either option can be +used, but it is recommended to use the FreeRTOS ARM Cortex-M4F port located in +the /FreeRTOS/Source/portable/GCC/ARM_CM4F directory. + +If the revision of the ARM Cortex-M7 core is r0p1 then use the FreeRTOS ARM +Cortex-M7 r0p1 port located in the /FreeRTOS/Source/portable/GCC/ARM_CM7/r0p1 +directory. \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CM7/r0p1/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CM7/r0p1/port.c new file mode 100644 index 0000000..ce19d6a --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CM7/r0p1/port.c @@ -0,0 +1,753 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the ARM CM4F port. + *----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#ifndef __VFP_FP__ + #error This port can only be used when the project options are configured to enable hardware floating point support. +#endif + +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#else + /* The way the SysTick is clocked is not modified in case it is not the same + as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 0 ) +#endif + +/* Constants required to manipulate the core. Registers first... */ +#define portNVIC_SYSTICK_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( * ( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( * ( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SYSPRI2_REG ( * ( ( volatile uint32_t * ) 0xe000ed20 ) ) +/* ...then bits in the registers. */ +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) + +#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( * ( ( volatile uint32_t * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */ +#define portVECTACTIVE_MASK ( 0xFFUL ) + +/* Constants required to manipulate the VFP. */ +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating point context control register. */ +#define portASPEN_AND_LSPEN_BITS ( 0x3UL << 30UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) +#define portINITIAL_EXEC_RETURN ( 0xfffffffd ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have +occurred while the SysTick counter is stopped during tickless idle +calculations. */ +#define portMISSED_COUNTS_FACTOR ( 45UL ) + +/* For strict compliance with the Cortex-M spec the task start address should +have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ +#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) + +/* Let the user override the pre-loading of the initial LR with the address of +prvTaskExitError() in case it messes up unwinding of the stack in the +debugger. */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/* Each task maintains its own interrupt status in the critical nesting +variable. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortPendSVHandler( void ) __attribute__ (( naked )); +void xPortSysTickHandler( void ); +void vPortSVCHandler( void ) __attribute__ (( naked )); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +static void prvPortStartFirstTask( void ) __attribute__ (( naked )); + +/* + * Function to enable the VFP. + */ + static void vPortEnableVFP( void ) __attribute__ (( naked )); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* + * The number of SysTick increments that make up one tick period. + */ +#if configUSE_TICKLESS_IDLE == 1 + static uint32_t ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * The maximum number of tick periods that can be suppressed is limited by the + * 24 bit resolution of the SysTick timer. + */ +#if configUSE_TICKLESS_IDLE == 1 + static uint32_t xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Compensate for the CPU cycles that pass while the SysTick is stopped (low + * power functionality only. + */ +#if configUSE_TICKLESS_IDLE == 1 + static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static uint8_t ucMaxSysCallPriority = 0; + static uint32_t ulMaxPRIGROUPValue = 0; + static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const volatile uint8_t * const ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + interrupt. */ + + /* Offset added to account for the way the MCU uses the stack on entry/exit + of interrupts, and to ensure alignment. */ + pxTopOfStack--; + + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + + /* Save code space by skipping register initialisation. */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + + /* A save method is being used that requires each task to maintain its + own exec return value. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXEC_RETURN; + + pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + for( ;; ); +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler( void ) +{ + __asm volatile ( + " ldr r3, pxCurrentTCBConst2 \n" /* Restore the context. */ + " ldr r1, [r3] \n" /* Use pxCurrentTCBConst to get the pxCurrentTCB address. */ + " ldr r0, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. */ + " ldmia r0!, {r4-r11, r14} \n" /* Pop the registers that are not automatically saved on exception entry and the critical nesting count. */ + " msr psp, r0 \n" /* Restore the task stack pointer. */ + " isb \n" + " mov r0, #0 \n" + " msr basepri, r0 \n" + " bx r14 \n" + " \n" + " .align 4 \n" + "pxCurrentTCBConst2: .word pxCurrentTCB \n" + ); +} +/*-----------------------------------------------------------*/ + +static void prvPortStartFirstTask( void ) +{ + __asm volatile( + " ldr r0, =0xE000ED08 \n" /* Use the NVIC offset register to locate the stack. */ + " ldr r0, [r0] \n" + " ldr r0, [r0] \n" + " msr msp, r0 \n" /* Set the msp back to the start of the stack. */ + " cpsie i \n" /* Globally enable interrupts. */ + " cpsie f \n" + " dsb \n" + " isb \n" + " svc 0 \n" /* System call to start first task. */ + " nop \n" + ); +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. + See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + + #if( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + functions can be called. ISR safe functions are those that end in + "FromISR". FreeRTOS maintains separate thread and ISR API functions to + ensure interrupt entry is as fast and simple as possible. + + Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( uint8_t ) 0x01; + } + + /* Shift the priority group value back to its position within the AIRCR + register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* conifgASSERT_DEFINED */ + + /* Make PendSV and SysTick the lowest priority interrupts. */ + portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI; + portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Ensure the VFP is enabled - it should be anyway. */ + vPortEnableVFP(); + + /* Lazy save always. */ + *( portFPCCR ) |= portASPEN_AND_LSPEN_BITS; + + /* Start the first task. */ + prvPortStartFirstTask(); + + /* Should never get here as the tasks will now be executing! Call the task + exit error function to prevent compiler warnings about a static function + not being called in the case that the application writer overrides this + functionality by defining configTASK_RETURN_ADDRESS. */ + prvTaskExitError(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + assert() if it is being called from an interrupt context. Only API + functions that end in "FromISR" can be used in an interrupt. Only assert if + the critical nesting count is 1 to protect against recursive calls if the + assert function also uses a critical section. */ + if( uxCriticalNesting == 1 ) + { + configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void xPortPendSVHandler( void ) +{ + /* This is a naked function. */ + + __asm volatile + ( + " mrs r0, psp \n" + " isb \n" + " \n" + " ldr r3, pxCurrentTCBConst \n" /* Get the location of the current TCB. */ + " ldr r2, [r3] \n" + " \n" + " tst r14, #0x10 \n" /* Is the task using the FPU context? If so, push high vfp registers. */ + " it eq \n" + " vstmdbeq r0!, {s16-s31} \n" + " \n" + " stmdb r0!, {r4-r11, r14} \n" /* Save the core registers. */ + " \n" + " str r0, [r2] \n" /* Save the new top of stack into the first member of the TCB. */ + " \n" + " stmdb sp!, {r3} \n" + " mov r0, %0 \n" + " cpsid i \n" /* Errata workaround. */ + " msr basepri, r0 \n" + " dsb \n" + " isb \n" + " cpsie i \n" /* Errata workaround. */ + " bl vTaskSwitchContext \n" + " mov r0, #0 \n" + " msr basepri, r0 \n" + " ldmia sp!, {r3} \n" + " \n" + " ldr r1, [r3] \n" /* The first item in pxCurrentTCB is the task top of stack. */ + " ldr r0, [r1] \n" + " \n" + " ldmia r0!, {r4-r11, r14} \n" /* Pop the core registers. */ + " \n" + " tst r14, #0x10 \n" /* Is the task using the FPU context? If so, pop the high vfp registers too. */ + " it eq \n" + " vldmiaeq r0!, {s16-s31} \n" + " \n" + " msr psp, r0 \n" + " isb \n" + " \n" + #ifdef WORKAROUND_PMU_CM001 /* XMC4000 specific errata workaround. */ + #if WORKAROUND_PMU_CM001 == 1 + " push { r14 } \n" + " pop { pc } \n" + #endif + #endif + " \n" + " bx r14 \n" + " \n" + " .align 4 \n" + "pxCurrentTCBConst: .word pxCurrentTCB \n" + ::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY) + ); +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + /* The SysTick runs at the lowest interrupt priority, so when this interrupt + executes all interrupts must be unmasked. There is therefore no need to + save and then restore the interrupt mask value as its value is already + known. */ + portDISABLE_INTERRUPTS(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* A context switch is required. Context switching is performed in + the PendSV interrupt. Pend the PendSV interrupt. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portENABLE_INTERRUPTS(); +} +/*-----------------------------------------------------------*/ + +#if configUSE_TICKLESS_IDLE == 1 + + __attribute__((weak)) void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickCTRL; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Stop the SysTick momentarily. The time the SysTick is stopped for + is accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG &= ~portNVIC_SYSTICK_ENABLE_BIT; + + /* Calculate the reload value required to wait xExpectedIdleTime + tick periods. -1 is used because this code will execute part way + through one of the tick periods. */ + ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + method as that will mask interrupts that should exit sleep mode. */ + __asm volatile( "cpsid i" ); + __asm volatile( "dsb" ); + __asm volatile( "isb" ); + + /* If a context switch is pending or a task is waiting for the scheduler + to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Restart from whatever is left in the count register to complete + this tick period. */ + portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Reset the reload register to the value required for normal tick + periods. */ + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + + /* Re-enable interrupts - see comments above the cpsid instruction() + above. */ + __asm volatile( "cpsie i" ); + } + else + { + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + set its parameter to 0 to indicate that its implementation contains + its own wait for interrupt or wait for event instruction, and so wfi + should not be executed again. However, the original expected idle + time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + if( xModifiableIdleTime > 0 ) + { + __asm volatile( "dsb" ); + __asm volatile( "wfi" ); + __asm volatile( "isb" ); + } + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Stop SysTick. Again, the time the SysTick is stopped for is + accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + ulSysTickCTRL = portNVIC_SYSTICK_CTRL_REG; + portNVIC_SYSTICK_CTRL_REG = ( ulSysTickCTRL & ~portNVIC_SYSTICK_ENABLE_BIT ); + + /* Re-enable interrupts - see comments above the cpsid instruction() + above. */ + __asm volatile( "cpsie i" ); + + if( ( ulSysTickCTRL & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt has already executed, and the SysTick + count reloaded with ulReloadValue. Reset the + portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick + period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + underflowed because the post sleep hook did something + that took too long. */ + if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* The tick interrupt handler will already have pended the tick + processing in the kernel. As the pending tick will be + processed as soon as this function exits, the tick value + maintained by the tick is stepped forward by one less than the + time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. + Work out how long the sleep lasted rounded to complete tick + periods (not the ulReload value which accounted for part + ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* How many complete tick periods passed while the processor + was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG + again, then set portNVIC_SYSTICK_LOAD_REG back to its standard + value. The critical section is used to ensure the tick interrupt + can only execute once in the case that the reload register is near + zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portENTER_CRITICAL(); + { + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + vTaskStepTick( ulCompleteTickPeriods ); + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + portEXIT_CRITICAL(); + } + } + +#endif /* #if configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +__attribute__(( weak )) void vPortSetupTimerInterrupt( void ) +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if configUSE_TICKLESS_IDLE == 1 + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); +} +/*-----------------------------------------------------------*/ + +/* This is a naked function. */ +static void vPortEnableVFP( void ) +{ + __asm volatile + ( + " ldr.w r0, =0xE000ED88 \n" /* The FPU enable bits are in the CPACR. */ + " ldr r1, [r0] \n" + " \n" + " orr r1, r1, #( 0xf << 20 ) \n" /* Enable CP10 and CP11 coprocessors, then save back. */ + " str r1, [r0] \n" + " bx r14 " + ); +} +/*-----------------------------------------------------------*/ + +#if( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + uint32_t ulCurrentInterrupt; + uint8_t ucCurrentPriority; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile( "mrs %0, ipsr" : "=r"( ulCurrentInterrupt ) ); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + an interrupt that has been assigned a priority above + configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + function. ISR safe FreeRTOS API functions must *only* be called + from interrupts that have been assigned a priority at or below + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Numerically low interrupt priority numbers represent logically high + interrupt priorities, therefore the priority of the interrupt must + be set to a value equal to or numerically *higher* than + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Interrupts that use the FreeRTOS API must not be left at their + default priority of zero as that is the highest possible priority, + which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + and therefore also guaranteed to be invalid. + + FreeRTOS maintains separate thread and ISR API functions to ensure + interrupt entry is as fast and simple as possible. + + The following links provide detailed information: + http://www.freertos.org/RTOS-Cortex-M3-M4.html + http://www.freertos.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + that define each interrupt's priority to be split between bits that + define the interrupt's pre-emption priority bits and bits that define + the interrupt's sub-priority. For simplicity all bits must be defined + to be pre-emption priority bits. The following assertion will fail if + this is not the case (if some bits represent a sub-priority). + + If the application only uses CMSIS libraries for interrupt + configuration then the correct setting can be achieved on all Cortex-M + devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + scheduler. Note however that some vendor specific peripheral libraries + assume a non-zero priority group setting, in which cases using a value + of zero will result in unpredicable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CM7/r0p1/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CM7/r0p1/portmacro.h new file mode 100644 index 0000000..66cb4b6 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CM7/r0p1/portmacro.h @@ -0,0 +1,288 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +/*-----------------------------------------------------------*/ + +/* Scheduler utilities. */ +#define portYIELD() \ +{ \ + /* Set a PendSV to request a context switch. */ \ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ + \ + /* Barriers are normally not required but do ensure the code is completely \ + within the specified behaviour for the architecture. */ \ + __asm volatile( "dsb" ); \ + __asm volatile( "isb" ); \ +} + +#define portNVIC_INT_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed04 ) ) +#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) +#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired != pdFALSE ) portYIELD() +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); +#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortRaiseBASEPRI() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vPortSetBASEPRI(x) +#define portDISABLE_INTERRUPTS() vPortRaiseBASEPRI() +#define portENABLE_INTERRUPTS() vPortSetBASEPRI(0) +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are +not necessary for to use this port. They are defined so the common demo files +(which build with all the ports) will build. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ +#ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specific optimisations. */ +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Generic helper function. */ + __attribute__( ( always_inline ) ) static inline uint8_t ucPortCountLeadingZeros( uint32_t ulBitmap ) + { + uint8_t ucReturn; + + __asm volatile ( "clz %0, %1" : "=r" ( ucReturn ) : "r" ( ulBitmap ) ); + return ucReturn; + } + + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) ucPortCountLeadingZeros( ( uxReadyPriorities ) ) ) + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +/*-----------------------------------------------------------*/ + +#ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() +#endif + +/* portNOP() is not required by this port. */ +#define portNOP() + +#define portINLINE __inline + +#ifndef portFORCE_INLINE + #define portFORCE_INLINE inline __attribute__(( always_inline)) +#endif + +portFORCE_INLINE static BaseType_t xPortIsInsideInterrupt( void ) +{ +uint32_t ulCurrentInterrupt; +BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile( "mrs %0, ipsr" : "=r"( ulCurrentInterrupt ) ); + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; +} + +/*-----------------------------------------------------------*/ + +portFORCE_INLINE static void vPortRaiseBASEPRI( void ) +{ +uint32_t ulNewBASEPRI; + + __asm volatile + ( + " mov %0, %1 \n" \ + " cpsid i \n" \ + " msr basepri, %0 \n" \ + " isb \n" \ + " dsb \n" \ + " cpsie i \n" \ + :"=r" (ulNewBASEPRI) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) + ); +} + +/*-----------------------------------------------------------*/ + +portFORCE_INLINE static uint32_t ulPortRaiseBASEPRI( void ) +{ +uint32_t ulOriginalBASEPRI, ulNewBASEPRI; + + __asm volatile + ( + " mrs %0, basepri \n" \ + " mov %1, %2 \n" \ + " cpsid i \n" \ + " msr basepri, %1 \n" \ + " isb \n" \ + " dsb \n" \ + " cpsie i \n" \ + :"=r" (ulOriginalBASEPRI), "=r" (ulNewBASEPRI) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) + ); + + /* This return will not be reached but is necessary to prevent compiler + warnings. */ + return ulOriginalBASEPRI; +} +/*-----------------------------------------------------------*/ + +portFORCE_INLINE static void vPortSetBASEPRI( uint32_t ulNewMaskValue ) +{ + __asm volatile + ( + " msr basepri, %0 " :: "r" ( ulNewMaskValue ) + ); +} +/*-----------------------------------------------------------*/ + + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CR5/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CR5/port.c new file mode 100644 index 0000000..9748772 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CR5/port.c @@ -0,0 +1,567 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#ifndef configINTERRUPT_CONTROLLER_BASE_ADDRESS + #error configINTERRUPT_CONTROLLER_BASE_ADDRESS must be defined. Refer to Cortex-A equivalent: http://www.freertos.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html +#endif + +#ifndef configINTERRUPT_CONTROLLER_CPU_INTERFACE_OFFSET + #error configINTERRUPT_CONTROLLER_CPU_INTERFACE_OFFSET must be defined. Refer to Cortex-A equivalent: http://www.freertos.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html +#endif + +#ifndef configUNIQUE_INTERRUPT_PRIORITIES + #error configUNIQUE_INTERRUPT_PRIORITIES must be defined. Refer to Cortex-A equivalent: http://www.freertos.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html +#endif + +#ifndef configSETUP_TICK_INTERRUPT + #error configSETUP_TICK_INTERRUPT() must be defined. Refer to Cortex-A equivalent: http://www.freertos.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html +#endif /* configSETUP_TICK_INTERRUPT */ + +#ifndef configMAX_API_CALL_INTERRUPT_PRIORITY + #error configMAX_API_CALL_INTERRUPT_PRIORITY must be defined. Refer to Cortex-A equivalent: http://www.freertos.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html +#endif + +#if configMAX_API_CALL_INTERRUPT_PRIORITY == 0 + #error configMAX_API_CALL_INTERRUPT_PRIORITY must not be set to 0 +#endif + +#if configMAX_API_CALL_INTERRUPT_PRIORITY > configUNIQUE_INTERRUPT_PRIORITIES + #error configMAX_API_CALL_INTERRUPT_PRIORITY must be less than or equal to configUNIQUE_INTERRUPT_PRIORITIES as the lower the numeric priority value the higher the logical interrupt priority +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +/* In case security extensions are implemented. */ +#if configMAX_API_CALL_INTERRUPT_PRIORITY <= ( configUNIQUE_INTERRUPT_PRIORITIES / 2 ) + #error configMAX_API_CALL_INTERRUPT_PRIORITY must be greater than ( configUNIQUE_INTERRUPT_PRIORITIES / 2 ) +#endif + +/* Some vendor specific files default configCLEAR_TICK_INTERRUPT() in +portmacro.h. */ +#ifndef configCLEAR_TICK_INTERRUPT + #define configCLEAR_TICK_INTERRUPT() +#endif + +/* A critical section is exited when the critical section nesting count reaches +this value. */ +#define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) + +/* In all GICs 255 can be written to the priority mask register to unmask all +(but the lowest) interrupt priority. */ +#define portUNMASK_VALUE ( 0xFFUL ) + +/* Tasks are not created with a floating point context, but can be given a +floating point context after they have been created. A variable is stored as +part of the tasks context that holds portNO_FLOATING_POINT_CONTEXT if the task +does not have an FPU context, or any other value if the task does have an FPU +context. */ +#define portNO_FLOATING_POINT_CONTEXT ( ( StackType_t ) 0 ) + +/* Constants required to setup the initial task context. */ +#define portINITIAL_SPSR ( ( StackType_t ) 0x1f ) /* System mode, ARM mode, IRQ enabled FIQ enabled. */ +#define portTHUMB_MODE_BIT ( ( StackType_t ) 0x20 ) +#define portINTERRUPT_ENABLE_BIT ( 0x80UL ) +#define portTHUMB_MODE_ADDRESS ( 0x01UL ) + +/* Used by portASSERT_IF_INTERRUPT_PRIORITY_INVALID() when ensuring the binary +point is zero. */ +#define portBINARY_POINT_BITS ( ( uint8_t ) 0x03 ) + +/* Masks all bits in the APSR other than the mode bits. */ +#define portAPSR_MODE_BITS_MASK ( 0x1F ) + +/* The value of the mode bits in the APSR when the CPU is executing in user +mode. */ +#define portAPSR_USER_MODE ( 0x10 ) + +/* The critical section macros only mask interrupts up to an application +determined priority level. Sometimes it is necessary to turn interrupt off in +the CPU itself before modifying certain hardware registers. */ +#define portCPU_IRQ_DISABLE() \ + __asm volatile ( "CPSID i" ); \ + __asm volatile ( "DSB" ); \ + __asm volatile ( "ISB" ); + +#define portCPU_IRQ_ENABLE() \ + __asm volatile ( "CPSIE i" ); \ + __asm volatile ( "DSB" ); \ + __asm volatile ( "ISB" ); + + +/* Macro to unmask all interrupt priorities. */ +#define portCLEAR_INTERRUPT_MASK() \ +{ \ + portCPU_IRQ_DISABLE(); \ + portICCPMR_PRIORITY_MASK_REGISTER = portUNMASK_VALUE; \ + __asm( "DSB \n" \ + "ISB \n" ); \ + portCPU_IRQ_ENABLE(); \ +} + +#define portINTERRUPT_PRIORITY_REGISTER_OFFSET 0x400UL +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portBIT_0_SET ( ( uint8_t ) 0x01 ) + +/* Let the user override the pre-loading of the initial LR with the address of +prvTaskExitError() in case is messes up unwinding of the stack in the +debugger. */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/*-----------------------------------------------------------*/ + +/* + * Starts the first task executing. This function is necessarily written in + * assembly code so is implemented in portASM.s. + */ +extern void vPortRestoreTaskContext( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* A variable is used to keep track of the critical section nesting. This +variable has to be stored as part of the task context and must be initialised to +a non zero value to ensure interrupts don't inadvertently become unmasked before +the scheduler starts. As it is stored as part of the task context it will +automatically be set to 0 when the first task is started. */ +volatile uint32_t ulCriticalNesting = 9999UL; + +/* Saved as part of the task context. If ulPortTaskHasFPUContext is non-zero then +a floating point context must be saved and restored for the task. */ +uint32_t ulPortTaskHasFPUContext = pdFALSE; + +/* Set to 1 to pend a context switch from an ISR. */ +uint32_t ulPortYieldRequired = pdFALSE; + +/* Counts the interrupt nesting depth. A context switch is only performed if +if the nesting depth is 0. */ +uint32_t ulPortInterruptNesting = 0UL; + +/* Used in asm code. */ +__attribute__(( used )) const uint32_t ulICCIAR = portICCIAR_INTERRUPT_ACKNOWLEDGE_REGISTER_ADDRESS; +__attribute__(( used )) const uint32_t ulICCEOIR = portICCEOIR_END_OF_INTERRUPT_REGISTER_ADDRESS; +__attribute__(( used )) const uint32_t ulICCPMR = portICCPMR_PRIORITY_MASK_REGISTER_ADDRESS; +__attribute__(( used )) const uint32_t ulMaxAPIPriorityMask = ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ); + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. + + The fist real value on the stack is the status register, which is set for + system mode, with interrupts enabled. A few NULLs are added first to ensure + GDB does not try decoding a non-existent return address. */ + *pxTopOfStack = ( StackType_t ) NULL; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) NULL; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) NULL; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portINITIAL_SPSR; + + if( ( ( uint32_t ) pxCode & portTHUMB_MODE_ADDRESS ) != 0x00UL ) + { + /* The task will start in THUMB mode. */ + *pxTopOfStack |= portTHUMB_MODE_BIT; + } + + pxTopOfStack--; + + /* Next the return address, which in this case is the start of the task. */ + *pxTopOfStack = ( StackType_t ) pxCode; + pxTopOfStack--; + + /* Next all the registers other than the stack pointer. */ + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + + /* The task will start with a critical nesting count of 0 as interrupts are + enabled. */ + *pxTopOfStack = portNO_CRITICAL_NESTING; + pxTopOfStack--; + + /* The task will start without a floating point context. A task that uses + the floating point hardware must call vPortTaskUsesFPU() before executing + any floating point instructions. */ + *pxTopOfStack = portNO_FLOATING_POINT_CONTEXT; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT( ulPortInterruptNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + for( ;; ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +uint32_t ulAPSR, ulCycles = 8; /* 8 bits per byte. */ + + #if( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( configINTERRUPT_CONTROLLER_BASE_ADDRESS + portINTERRUPT_PRIORITY_REGISTER_OFFSET ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine how many priority bits are implemented in the GIC. + + Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to + all possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* Shift to the least significant bits. */ + while( ( ucMaxPriorityValue & portBIT_0_SET ) != portBIT_0_SET ) + { + ucMaxPriorityValue >>= ( uint8_t ) 0x01; + + /* If ulCycles reaches 0 then ucMaxPriorityValue must have been + read as 0, indicating a misconfiguration. */ + ulCycles--; + if( ulCycles == 0 ) + { + break; + } + } + + /* Sanity check configUNIQUE_INTERRUPT_PRIORITIES matches the read + value. */ + configASSERT( ucMaxPriorityValue == portLOWEST_INTERRUPT_PRIORITY ); + + /* Restore the clobbered interrupt priority register to its original + value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* conifgASSERT_DEFINED */ + + /* Only continue if the CPU is not in User mode. The CPU must be in a + Privileged mode for the scheduler to start. */ + __asm volatile ( "MRS %0, APSR" : "=r" ( ulAPSR ) ); + ulAPSR &= portAPSR_MODE_BITS_MASK; + configASSERT( ulAPSR != portAPSR_USER_MODE ); + + if( ulAPSR != portAPSR_USER_MODE ) + { + /* Only continue if the binary point value is set to its lowest possible + setting. See the comments in vPortValidateInterruptPriority() below for + more information. */ + configASSERT( ( portICCBPR_BINARY_POINT_REGISTER & portBINARY_POINT_BITS ) <= portMAX_BINARY_POINT_VALUE ); + + if( ( portICCBPR_BINARY_POINT_REGISTER & portBINARY_POINT_BITS ) <= portMAX_BINARY_POINT_VALUE ) + { + /* Interrupts are turned off in the CPU itself to ensure tick does + not execute while the scheduler is being started. Interrupts are + automatically turned back on in the CPU when the first task starts + executing. */ + portCPU_IRQ_DISABLE(); + + /* Start the timer that generates the tick ISR. */ + configSETUP_TICK_INTERRUPT(); + + /* Start the first task executing. */ + vPortRestoreTaskContext(); + } + } + + /* Will only get here if vTaskStartScheduler() was called with the CPU in + a non-privileged mode or the binary point register was not set to its lowest + possible value. prvTaskExitError() is referenced to prevent a compiler + warning about it being defined but not referenced in the case that the user + defines their own exit address. */ + ( void ) prvTaskExitError; + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( ulCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + /* Mask interrupts up to the max syscall interrupt priority. */ + ulPortSetInterruptMask(); + + /* Now interrupts are disabled ulCriticalNesting can be accessed + directly. Increment ulCriticalNesting to keep a count of how many times + portENTER_CRITICAL() has been called. */ + ulCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + assert() if it is being called from an interrupt context. Only API + functions that end in "FromISR" can be used in an interrupt. Only assert if + the critical nesting count is 1 to protect against recursive calls if the + assert function also uses a critical section. */ + if( ulCriticalNesting == 1 ) + { + configASSERT( ulPortInterruptNesting == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + if( ulCriticalNesting > portNO_CRITICAL_NESTING ) + { + /* Decrement the nesting count as the critical section is being + exited. */ + ulCriticalNesting--; + + /* If the nesting level has reached zero then all interrupt + priorities must be re-enabled. */ + if( ulCriticalNesting == portNO_CRITICAL_NESTING ) + { + /* Critical nesting has reached zero so all interrupt priorities + should be unmasked. */ + portCLEAR_INTERRUPT_MASK(); + } + } +} +/*-----------------------------------------------------------*/ + +void FreeRTOS_Tick_Handler( void ) +{ + /* Set interrupt mask before altering scheduler structures. The tick + handler runs at the lowest priority, so interrupts cannot already be masked, + so there is no need to save and restore the current mask value. It is + necessary to turn off interrupts in the CPU itself while the ICCPMR is being + updated. */ + portCPU_IRQ_DISABLE(); + portICCPMR_PRIORITY_MASK_REGISTER = ( uint32_t ) ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ); + __asm volatile ( "dsb \n" + "isb \n" ); + portCPU_IRQ_ENABLE(); + + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + ulPortYieldRequired = pdTRUE; + } + + /* Ensure all interrupt priorities are active again. */ + portCLEAR_INTERRUPT_MASK(); + configCLEAR_TICK_INTERRUPT(); +} +/*-----------------------------------------------------------*/ + +void vPortTaskUsesFPU( void ) +{ +uint32_t ulInitialFPSCR = 0; + + /* A task is registering the fact that it needs an FPU context. Set the + FPU flag (which is saved as part of the task context). */ + ulPortTaskHasFPUContext = pdTRUE; + + /* Initialise the floating point status register. */ + __asm volatile ( "FMXR FPSCR, %0" :: "r" (ulInitialFPSCR) ); +} +/*-----------------------------------------------------------*/ + +void vPortClearInterruptMask( uint32_t ulNewMaskValue ) +{ + if( ulNewMaskValue == pdFALSE ) + { + portCLEAR_INTERRUPT_MASK(); + } +} +/*-----------------------------------------------------------*/ + +uint32_t ulPortSetInterruptMask( void ) +{ +uint32_t ulReturn; + + /* Interrupt in the CPU must be turned off while the ICCPMR is being + updated. */ + portCPU_IRQ_DISABLE(); + if( portICCPMR_PRIORITY_MASK_REGISTER == ( uint32_t ) ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ) ) + { + /* Interrupts were already masked. */ + ulReturn = pdTRUE; + } + else + { + ulReturn = pdFALSE; + portICCPMR_PRIORITY_MASK_REGISTER = ( uint32_t ) ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ); + __asm volatile ( "dsb \n" + "isb \n" ); + } + portCPU_IRQ_ENABLE(); + + return ulReturn; +} +/*-----------------------------------------------------------*/ + +#if( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + /* The following assertion will fail if a service routine (ISR) for + an interrupt that has been assigned a priority above + configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + function. ISR safe FreeRTOS API functions must *only* be called + from interrupts that have been assigned a priority at or below + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Numerically low interrupt priority numbers represent logically high + interrupt priorities, therefore the priority of the interrupt must + be set to a value equal to or numerically *higher* than + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + FreeRTOS maintains separate thread and ISR API functions to ensure + interrupt entry is as fast and simple as possible. */ + + configASSERT( portICCRPR_RUNNING_PRIORITY_REGISTER >= ( uint32_t ) ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ) ); + + /* Priority grouping: The interrupt controller (GIC) allows the bits + that define each interrupt's priority to be split between bits that + define the interrupt's pre-emption priority bits and bits that define + the interrupt's sub-priority. For simplicity all bits must be defined + to be pre-emption priority bits. The following assertion will fail if + this is not the case (if some bits represent a sub-priority). + + The priority grouping is configured by the GIC's binary point register + (ICCBPR). Writing 0 to ICCBPR will ensure it is set to its lowest + possible value (which may be above 0). */ + configASSERT( ( portICCBPR_BINARY_POINT_REGISTER & portBINARY_POINT_BITS ) <= portMAX_BINARY_POINT_VALUE ); + } + +#endif /* configASSERT_DEFINED */ +/*-----------------------------------------------------------*/ + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CR5/portASM.S b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CR5/portASM.S new file mode 100644 index 0000000..13b9713 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CR5/portASM.S @@ -0,0 +1,321 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + .text + .arm + + .set SYS_MODE, 0x1f + .set SVC_MODE, 0x13 + .set IRQ_MODE, 0x12 + + /* Hardware registers. */ + .extern ulICCIAR + .extern ulICCEOIR + .extern ulICCPMR + + /* Variables and functions. */ + .extern ulMaxAPIPriorityMask + .extern _freertos_vector_table + .extern pxCurrentTCB + .extern vTaskSwitchContext + .extern vApplicationIRQHandler + .extern ulPortInterruptNesting + .extern ulPortTaskHasFPUContext + + .global FreeRTOS_IRQ_Handler + .global FreeRTOS_SWI_Handler + .global vPortRestoreTaskContext + +.macro portSAVE_CONTEXT + + /* Save the LR and SPSR onto the system mode stack before switching to + system mode to save the remaining system mode registers. */ + SRSDB sp!, #SYS_MODE + CPS #SYS_MODE + PUSH {R0-R12, R14} + + /* Push the critical nesting count. */ + LDR R2, ulCriticalNestingConst + LDR R1, [R2] + PUSH {R1} + + /* Does the task have a floating point context that needs saving? If + ulPortTaskHasFPUContext is 0 then no. */ + LDR R2, ulPortTaskHasFPUContextConst + LDR R3, [R2] + CMP R3, #0 + + /* Save the floating point context, if any. */ + FMRXNE R1, FPSCR + VPUSHNE {D0-D15} + /*VPUSHNE {D16-D31}*/ + PUSHNE {R1} + + /* Save ulPortTaskHasFPUContext itself. */ + PUSH {R3} + + /* Save the stack pointer in the TCB. */ + LDR R0, pxCurrentTCBConst + LDR R1, [R0] + STR SP, [R1] + + .endm + +; /**********************************************************************/ + +.macro portRESTORE_CONTEXT + + /* Set the SP to point to the stack of the task being restored. */ + LDR R0, pxCurrentTCBConst + LDR R1, [R0] + LDR SP, [R1] + + /* Is there a floating point context to restore? If the restored + ulPortTaskHasFPUContext is zero then no. */ + LDR R0, ulPortTaskHasFPUContextConst + POP {R1} + STR R1, [R0] + CMP R1, #0 + + /* Restore the floating point context, if any. */ + POPNE {R0} + /*VPOPNE {D16-D31}*/ + VPOPNE {D0-D15} + VMSRNE FPSCR, R0 + + /* Restore the critical section nesting depth. */ + LDR R0, ulCriticalNestingConst + POP {R1} + STR R1, [R0] + + /* Ensure the priority mask is correct for the critical nesting depth. */ + LDR R2, ulICCPMRConst + LDR R2, [R2] + CMP R1, #0 + MOVEQ R4, #255 + LDRNE R4, ulMaxAPIPriorityMaskConst + LDRNE R4, [R4] + STR R4, [R2] + + /* Restore all system mode registers other than the SP (which is already + being used). */ + POP {R0-R12, R14} + + /* Return to the task code, loading CPSR on the way. */ + RFEIA sp! + + .endm + + + + +/****************************************************************************** + * SVC handler is used to start the scheduler. + *****************************************************************************/ +.align 4 +.type FreeRTOS_SWI_Handler, %function +FreeRTOS_SWI_Handler: + /* Save the context of the current task and select a new task to run. */ + portSAVE_CONTEXT + LDR R0, vTaskSwitchContextConst + BLX R0 + portRESTORE_CONTEXT + + +/****************************************************************************** + * vPortRestoreTaskContext is used to start the scheduler. + *****************************************************************************/ +.type vPortRestoreTaskContext, %function +vPortRestoreTaskContext: + /* Switch to system mode. */ + CPS #SYS_MODE + portRESTORE_CONTEXT + +.align 4 +.type FreeRTOS_IRQ_Handler, %function +FreeRTOS_IRQ_Handler: + + /* Return to the interrupted instruction. */ + SUB lr, lr, #4 + + /* Push the return address and SPSR. */ + PUSH {lr} + MRS lr, SPSR + PUSH {lr} + + /* Change to supervisor mode to allow reentry. */ + CPS #SVC_MODE + + /* Push used registers. */ + PUSH {r0-r4, r12} + + /* Increment nesting count. r3 holds the address of ulPortInterruptNesting + for future use. r1 holds the original ulPortInterruptNesting value for + future use. */ + LDR r3, ulPortInterruptNestingConst + LDR r1, [r3] + ADD r4, r1, #1 + STR r4, [r3] + + /* Read value from the interrupt acknowledge register, which is stored in r0 + for future parameter and interrupt clearing use. */ + LDR r2, ulICCIARConst + LDR r2, [r2] + LDR r0, [r2] + + /* Ensure bit 2 of the stack pointer is clear. r2 holds the bit 2 value for + future use. */ + MOV r2, sp + AND r2, r2, #4 + SUB sp, sp, r2 + + /* Call the interrupt handler. */ + PUSH {r0-r3, lr} + LDR r1, vApplicationIRQHandlerConst + BLX r1 + POP {r0-r3, lr} + ADD sp, sp, r2 + + CPSID i + DSB + ISB + + /* Write the value read from ICCIAR to ICCEOIR. */ + LDR r4, ulICCEOIRConst + LDR r4, [r4] + STR r0, [r4] + + /* Restore the old nesting count. */ + STR r1, [r3] + + /* A context switch is never performed if the nesting count is not 0. */ + CMP r1, #0 + BNE exit_without_switch + + /* Did the interrupt request a context switch? r1 holds the address of + ulPortYieldRequired and r0 the value of ulPortYieldRequired for future + use. */ + LDR r1, =ulPortYieldRequired + LDR r0, [r1] + CMP r0, #0 + BNE switch_before_exit + +exit_without_switch: + /* No context switch. Restore used registers, LR_irq and SPSR before + returning. */ + POP {r0-r4, r12} + CPS #IRQ_MODE + POP {LR} + MSR SPSR_cxsf, LR + POP {LR} + MOVS PC, LR + +switch_before_exit: + /* A context swtich is to be performed. Clear the context switch pending + flag. */ + MOV r0, #0 + STR r0, [r1] + + /* Restore used registers, LR-irq and SPSR before saving the context + to the task stack. */ + POP {r0-r4, r12} + CPS #IRQ_MODE + POP {LR} + MSR SPSR_cxsf, LR + POP {LR} + portSAVE_CONTEXT + + /* Call the function that selects the new task to execute. + vTaskSwitchContext() if vTaskSwitchContext() uses LDRD or STRD + instructions, or 8 byte aligned stack allocated data. LR does not need + saving as a new LR will be loaded by portRESTORE_CONTEXT anyway. */ + LDR R0, vTaskSwitchContextConst + BLX R0 + + /* Restore the context of, and branch to, the task selected to execute + next. */ + portRESTORE_CONTEXT + +ulICCIARConst: .word ulICCIAR +ulICCEOIRConst: .word ulICCEOIR +ulICCPMRConst: .word ulICCPMR +pxCurrentTCBConst: .word pxCurrentTCB +ulCriticalNestingConst: .word ulCriticalNesting +ulPortTaskHasFPUContextConst: .word ulPortTaskHasFPUContext +ulMaxAPIPriorityMaskConst: .word ulMaxAPIPriorityMask +vTaskSwitchContextConst: .word vTaskSwitchContext +vApplicationIRQHandlerConst: .word vApplicationIRQHandler +ulPortInterruptNestingConst: .word ulPortInterruptNesting + +.end + + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CR5/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CR5/portmacro.h new file mode 100644 index 0000000..7163af8 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CR5/portmacro.h @@ -0,0 +1,235 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus + extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +typedef uint32_t TickType_t; +#define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 + +/*-----------------------------------------------------------*/ + +/* Task utilities. */ + +/* Called at the end of an ISR that can cause a context switch. */ +#define portEND_SWITCHING_ISR( xSwitchRequired )\ +{ \ +extern uint32_t ulPortYieldRequired; \ + \ + if( xSwitchRequired != pdFALSE ) \ + { \ + ulPortYieldRequired = pdTRUE; \ + } \ +} + +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +#define portYIELD() __asm volatile ( "SWI 0" ); + + +/*----------------------------------------------------------- + * Critical section control + *----------------------------------------------------------*/ + +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); +extern uint32_t ulPortSetInterruptMask( void ); +extern void vPortClearInterruptMask( uint32_t ulNewMaskValue ); +extern void vPortInstallFreeRTOSVectorTable( void ); + +/* These macros do not globally disable/enable interrupts. They do mask off +interrupts that have a priority below configMAX_API_CALL_INTERRUPT_PRIORITY. */ +#define portENTER_CRITICAL() vPortEnterCritical(); +#define portEXIT_CRITICAL() vPortExitCritical(); +#define portDISABLE_INTERRUPTS() ulPortSetInterruptMask() +#define portENABLE_INTERRUPTS() vPortClearInterruptMask( 0 ) +#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortSetInterruptMask() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vPortClearInterruptMask(x) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are +not required for this port but included in case common demo code that uses these +macros is used. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +/* Prototype of the FreeRTOS tick handler. This must be installed as the +handler for whichever peripheral is used to generate the RTOS tick. */ +void FreeRTOS_Tick_Handler( void ); + +/* Any task that uses the floating point unit MUST call vPortTaskUsesFPU() +before any floating point instructions are executed. */ +void vPortTaskUsesFPU( void ); +#define portTASK_USES_FLOATING_POINT() vPortTaskUsesFPU() + +#define portLOWEST_INTERRUPT_PRIORITY ( ( ( uint32_t ) configUNIQUE_INTERRUPT_PRIORITIES ) - 1UL ) +#define portLOWEST_USABLE_INTERRUPT_PRIORITY ( portLOWEST_INTERRUPT_PRIORITY - 1UL ) + +/* Architecture specific optimisations. */ +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31 - __builtin_clz( uxReadyPriorities ) ) + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +#ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() +#endif /* configASSERT */ + +#define portNOP() __asm volatile( "NOP" ) + + +#ifdef __cplusplus + } /* extern C */ +#endif + + +/* The number of bits to shift for an interrupt priority is dependent on the +number of bits implemented by the interrupt controller. */ +#if configUNIQUE_INTERRUPT_PRIORITIES == 16 + #define portPRIORITY_SHIFT 4 + #define portMAX_BINARY_POINT_VALUE 3 +#elif configUNIQUE_INTERRUPT_PRIORITIES == 32 + #define portPRIORITY_SHIFT 3 + #define portMAX_BINARY_POINT_VALUE 2 +#elif configUNIQUE_INTERRUPT_PRIORITIES == 64 + #define portPRIORITY_SHIFT 2 + #define portMAX_BINARY_POINT_VALUE 1 +#elif configUNIQUE_INTERRUPT_PRIORITIES == 128 + #define portPRIORITY_SHIFT 1 + #define portMAX_BINARY_POINT_VALUE 0 +#elif configUNIQUE_INTERRUPT_PRIORITIES == 256 + #define portPRIORITY_SHIFT 0 + #define portMAX_BINARY_POINT_VALUE 0 +#else + #error Invalid configUNIQUE_INTERRUPT_PRIORITIES setting. configUNIQUE_INTERRUPT_PRIORITIES must be set to the number of unique priorities implemented by the target hardware +#endif + +/* Interrupt controller access addresses. */ +#define portICCPMR_PRIORITY_MASK_OFFSET ( 0x04 ) +#define portICCIAR_INTERRUPT_ACKNOWLEDGE_OFFSET ( 0x0C ) +#define portICCEOIR_END_OF_INTERRUPT_OFFSET ( 0x10 ) +#define portICCBPR_BINARY_POINT_OFFSET ( 0x08 ) +#define portICCRPR_RUNNING_PRIORITY_OFFSET ( 0x14 ) + +#define portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS ( configINTERRUPT_CONTROLLER_BASE_ADDRESS + configINTERRUPT_CONTROLLER_CPU_INTERFACE_OFFSET ) +#define portICCPMR_PRIORITY_MASK_REGISTER ( *( ( volatile uint32_t * ) ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCPMR_PRIORITY_MASK_OFFSET ) ) ) +#define portICCIAR_INTERRUPT_ACKNOWLEDGE_REGISTER_ADDRESS ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCIAR_INTERRUPT_ACKNOWLEDGE_OFFSET ) +#define portICCEOIR_END_OF_INTERRUPT_REGISTER_ADDRESS ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCEOIR_END_OF_INTERRUPT_OFFSET ) +#define portICCPMR_PRIORITY_MASK_REGISTER_ADDRESS ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCPMR_PRIORITY_MASK_OFFSET ) +#define portICCBPR_BINARY_POINT_REGISTER ( *( ( const volatile uint32_t * ) ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCBPR_BINARY_POINT_OFFSET ) ) ) +#define portICCRPR_RUNNING_PRIORITY_REGISTER ( *( ( const volatile uint32_t * ) ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCRPR_RUNNING_PRIORITY_OFFSET ) ) ) + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CRx_No_GIC/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CRx_No_GIC/port.c new file mode 100644 index 0000000..173ec77 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CRx_No_GIC/port.c @@ -0,0 +1,361 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +#ifndef configSETUP_TICK_INTERRUPT + #error configSETUP_TICK_INTERRUPT() must be defined in FreeRTOSConfig.h to call the function that sets up the tick interrupt. +#endif + +#ifndef configCLEAR_TICK_INTERRUPT + #error configCLEAR_TICK_INTERRUPT must be defined in FreeRTOSConfig.h to clear which ever interrupt was used to generate the tick interrupt. +#endif + +/* A critical section is exited when the critical section nesting count reaches +this value. */ +#define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) + +/* Tasks are not created with a floating point context, but can be given a +floating point context after they have been created. A variable is stored as +part of the tasks context that holds portNO_FLOATING_POINT_CONTEXT if the task +does not have an FPU context, or any other value if the task does have an FPU +context. */ +#define portNO_FLOATING_POINT_CONTEXT ( ( StackType_t ) 0 ) + +/* Constants required to setup the initial task context. */ +#define portINITIAL_SPSR ( ( StackType_t ) 0x1f ) /* System mode, ARM mode, IRQ enabled FIQ enabled. */ +#define portTHUMB_MODE_BIT ( ( StackType_t ) 0x20 ) +#define portTHUMB_MODE_ADDRESS ( 0x01UL ) + +/* Masks all bits in the APSR other than the mode bits. */ +#define portAPSR_MODE_BITS_MASK ( 0x1F ) + +/* The value of the mode bits in the APSR when the CPU is executing in user +mode. */ +#define portAPSR_USER_MODE ( 0x10 ) + +/* Let the user override the pre-loading of the initial LR with the address of +prvTaskExitError() in case it messes up unwinding of the stack in the +debugger. */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/*-----------------------------------------------------------*/ + +/* + * Starts the first task executing. This function is necessarily written in + * assembly code so is implemented in portASM.s. + */ +extern void vPortRestoreTaskContext( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* A variable is used to keep track of the critical section nesting. This +variable has to be stored as part of the task context and must be initialised to +a non zero value to ensure interrupts don't inadvertently become unmasked before +the scheduler starts. As it is stored as part of the task context it will +automatically be set to 0 when the first task is started. */ +volatile uint32_t ulCriticalNesting = 9999UL; + +/* Saved as part of the task context. If ulPortTaskHasFPUContext is non-zero then +a floating point context must be saved and restored for the task. */ +volatile uint32_t ulPortTaskHasFPUContext = pdFALSE; + +/* Set to 1 to pend a context switch from an ISR. */ +volatile uint32_t ulPortYieldRequired = pdFALSE; + +/* Counts the interrupt nesting depth. A context switch is only performed if +if the nesting depth is 0. */ +volatile uint32_t ulPortInterruptNesting = 0UL; + +/* Used in the asm file to clear an interrupt. */ +__attribute__(( used )) const uint32_t ulICCEOIR = configEOI_ADDRESS; + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. + + The fist real value on the stack is the status register, which is set for + system mode, with interrupts enabled. A few NULLs are added first to ensure + GDB does not try decoding a non-existent return address. */ + *pxTopOfStack = ( StackType_t ) NULL; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) NULL; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) NULL; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portINITIAL_SPSR; + + if( ( ( uint32_t ) pxCode & portTHUMB_MODE_ADDRESS ) != 0x00UL ) + { + /* The task will start in THUMB mode. */ + *pxTopOfStack |= portTHUMB_MODE_BIT; + } + + pxTopOfStack--; + + /* Next the return address, which in this case is the start of the task. */ + *pxTopOfStack = ( StackType_t ) pxCode; + pxTopOfStack--; + + /* Next all the registers other than the stack pointer. */ + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + + /* The task will start with a critical nesting count of 0 as interrupts are + enabled. */ + *pxTopOfStack = portNO_CRITICAL_NESTING; + pxTopOfStack--; + + /* The task will start without a floating point context. A task that uses + the floating point hardware must call vPortTaskUsesFPU() before executing + any floating point instructions. */ + *pxTopOfStack = portNO_FLOATING_POINT_CONTEXT; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT( ulPortInterruptNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + for( ;; ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +uint32_t ulAPSR; + + /* Only continue if the CPU is not in User mode. The CPU must be in a + Privileged mode for the scheduler to start. */ + __asm volatile ( "MRS %0, APSR" : "=r" ( ulAPSR ) ); + ulAPSR &= portAPSR_MODE_BITS_MASK; + configASSERT( ulAPSR != portAPSR_USER_MODE ); + + if( ulAPSR != portAPSR_USER_MODE ) + { + /* Start the timer that generates the tick ISR. */ + portDISABLE_INTERRUPTS(); + configSETUP_TICK_INTERRUPT(); + + /* Start the first task executing. */ + vPortRestoreTaskContext(); + } + + /* Will only get here if vTaskStartScheduler() was called with the CPU in + a non-privileged mode or the binary point register was not set to its lowest + possible value. prvTaskExitError() is referenced to prevent a compiler + warning about it being defined but not referenced in the case that the user + defines their own exit address. */ + ( void ) prvTaskExitError; + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( ulCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + + /* Now interrupts are disabled ulCriticalNesting can be accessed + directly. Increment ulCriticalNesting to keep a count of how many times + portENTER_CRITICAL() has been called. */ + ulCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + assert() if it is being called from an interrupt context. Only API + functions that end in "FromISR" can be used in an interrupt. Only assert if + the critical nesting count is 1 to protect against recursive calls if the + assert function also uses a critical section. */ + if( ulCriticalNesting == 1 ) + { + configASSERT( ulPortInterruptNesting == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + if( ulCriticalNesting > portNO_CRITICAL_NESTING ) + { + /* Decrement the nesting count as the critical section is being + exited. */ + ulCriticalNesting--; + + /* If the nesting level has reached zero then all interrupt + priorities must be re-enabled. */ + if( ulCriticalNesting == portNO_CRITICAL_NESTING ) + { + /* Critical nesting has reached zero so all interrupt priorities + should be unmasked. */ + portENABLE_INTERRUPTS(); + } + } +} +/*-----------------------------------------------------------*/ + +void FreeRTOS_Tick_Handler( void ) +{ +uint32_t ulInterruptStatus; + + ulInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + ulPortYieldRequired = pdTRUE; + } + + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulInterruptStatus ); + + configCLEAR_TICK_INTERRUPT(); +} +/*-----------------------------------------------------------*/ + +void vPortTaskUsesFPU( void ) +{ +uint32_t ulInitialFPSCR = 0; + + /* A task is registering the fact that it needs an FPU context. Set the + FPU flag (which is saved as part of the task context). */ + ulPortTaskHasFPUContext = pdTRUE; + + /* Initialise the floating point status register. */ + __asm volatile ( "FMXR FPSCR, %0" :: "r" (ulInitialFPSCR) ); +} +/*-----------------------------------------------------------*/ + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CRx_No_GIC/portASM.S b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CRx_No_GIC/portASM.S new file mode 100644 index 0000000..67f88fb --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CRx_No_GIC/portASM.S @@ -0,0 +1,291 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + + .text + .arm + + .set SYS_MODE, 0x1f + .set SVC_MODE, 0x13 + .set IRQ_MODE, 0x12 + + /* Variables and functions. */ + .extern ulMaxAPIPriorityMask + .extern _freertos_vector_table + .extern pxCurrentTCB + .extern vTaskSwitchContext + .extern vApplicationIRQHandler + .extern ulPortInterruptNesting + .extern ulPortTaskHasFPUContext + .extern ulICCEOIR + .extern ulPortYieldRequired + + .global FreeRTOS_IRQ_Handler + .global FreeRTOS_SVC_Handler + .global vPortRestoreTaskContext + + +.macro portSAVE_CONTEXT + + /* Save the LR and SPSR onto the system mode stack before switching to + system mode to save the remaining system mode registers. */ + SRSDB sp!, #SYS_MODE + CPS #SYS_MODE + PUSH {R0-R12, R14} + + /* Push the critical nesting count. */ + LDR R2, ulCriticalNestingConst + LDR R1, [R2] + PUSH {R1} + + /* Does the task have a floating point context that needs saving? If + ulPortTaskHasFPUContext is 0 then no. */ + LDR R2, ulPortTaskHasFPUContextConst + LDR R3, [R2] + CMP R3, #0 + + /* Save the floating point context, if any. */ + FMRXNE R1, FPSCR + VPUSHNE {D0-D15} +#if configFPU_D32 == 1 + VPUSHNE {D16-D31} +#endif /* configFPU_D32 */ + PUSHNE {R1} + + /* Save ulPortTaskHasFPUContext itself. */ + PUSH {R3} + + /* Save the stack pointer in the TCB. */ + LDR R0, pxCurrentTCBConst + LDR R1, [R0] + STR SP, [R1] + + .endm + +; /**********************************************************************/ + +.macro portRESTORE_CONTEXT + + /* Set the SP to point to the stack of the task being restored. */ + LDR R0, pxCurrentTCBConst + LDR R1, [R0] + LDR SP, [R1] + + /* Is there a floating point context to restore? If the restored + ulPortTaskHasFPUContext is zero then no. */ + LDR R0, ulPortTaskHasFPUContextConst + POP {R1} + STR R1, [R0] + CMP R1, #0 + + /* Restore the floating point context, if any. */ + POPNE {R0} +#if configFPU_D32 == 1 + VPOPNE {D16-D31} +#endif /* configFPU_D32 */ + VPOPNE {D0-D15} + VMSRNE FPSCR, R0 + + /* Restore the critical section nesting depth. */ + LDR R0, ulCriticalNestingConst + POP {R1} + STR R1, [R0] + + /* Restore all system mode registers other than the SP (which is already + being used). */ + POP {R0-R12, R14} + + /* Return to the task code, loading CPSR on the way. */ + RFEIA sp! + + .endm + + + + +/****************************************************************************** + * SVC handler is used to yield. + *****************************************************************************/ +.align 4 +.type FreeRTOS_SVC_Handler, %function +FreeRTOS_SVC_Handler: + /* Save the context of the current task and select a new task to run. */ + portSAVE_CONTEXT + LDR R0, vTaskSwitchContextConst + BLX R0 + portRESTORE_CONTEXT + + +/****************************************************************************** + * vPortRestoreTaskContext is used to start the scheduler. + *****************************************************************************/ +.align 4 +.type vPortRestoreTaskContext, %function +vPortRestoreTaskContext: + /* Switch to system mode. */ + CPS #SYS_MODE + portRESTORE_CONTEXT + +.align 4 +.type FreeRTOS_IRQ_Handler, %function +FreeRTOS_IRQ_Handler: + /* Return to the interrupted instruction. */ + SUB lr, lr, #4 + + /* Push the return address and SPSR. */ + PUSH {lr} + MRS lr, SPSR + PUSH {lr} + + /* Change to supervisor mode to allow reentry. */ + CPS #0x13 + + /* Push used registers. */ + PUSH {r0-r3, r12} + + /* Increment nesting count. r3 holds the address of ulPortInterruptNesting + for future use. r1 holds the original ulPortInterruptNesting value for + future use. */ + LDR r3, ulPortInterruptNestingConst + LDR r1, [r3] + ADD r0, r1, #1 + STR r0, [r3] + + /* Ensure bit 2 of the stack pointer is clear. r2 holds the bit 2 value for + future use. */ + MOV r0, sp + AND r2, r0, #4 + SUB sp, sp, r2 + + /* Call the interrupt handler. */ + PUSH {r0-r3, lr} + LDR r1, vApplicationIRQHandlerConst + BLX r1 + POP {r0-r3, lr} + ADD sp, sp, r2 + + CPSID i + DSB + ISB + + /* Write to the EOI register. */ + LDR r0, ulICCEOIRConst + LDR r2, [r0] + STR r0, [r2] + + /* Restore the old nesting count. */ + STR r1, [r3] + + /* A context switch is never performed if the nesting count is not 0. */ + CMP r1, #0 + BNE exit_without_switch + + /* Did the interrupt request a context switch? r1 holds the address of + ulPortYieldRequired and r0 the value of ulPortYieldRequired for future + use. */ + LDR r1, ulPortYieldRequiredConst + LDR r0, [r1] + CMP r0, #0 + BNE switch_before_exit + +exit_without_switch: + /* No context switch. Restore used registers, LR_irq and SPSR before + returning. */ + POP {r0-r3, r12} + CPS #IRQ_MODE + POP {LR} + MSR SPSR_cxsf, LR + POP {LR} + MOVS PC, LR + +switch_before_exit: + /* A context swtich is to be performed. Clear the context switch pending + flag. */ + MOV r0, #0 + STR r0, [r1] + + /* Restore used registers, LR-irq and SPSR before saving the context + to the task stack. */ + POP {r0-r3, r12} + CPS #IRQ_MODE + POP {LR} + MSR SPSR_cxsf, LR + POP {LR} + portSAVE_CONTEXT + + /* Call the function that selects the new task to execute. + vTaskSwitchContext() if vTaskSwitchContext() uses LDRD or STRD + instructions, or 8 byte aligned stack allocated data. LR does not need + saving as a new LR will be loaded by portRESTORE_CONTEXT anyway. */ + LDR R0, vTaskSwitchContextConst + BLX R0 + + /* Restore the context of, and branch to, the task selected to execute + next. */ + portRESTORE_CONTEXT + +ulICCEOIRConst: .word ulICCEOIR +pxCurrentTCBConst: .word pxCurrentTCB +ulCriticalNestingConst: .word ulCriticalNesting +ulPortTaskHasFPUContextConst: .word ulPortTaskHasFPUContext +vTaskSwitchContextConst: .word vTaskSwitchContext +vApplicationIRQHandlerConst: .word vApplicationIRQHandler +ulPortInterruptNestingConst: .word ulPortInterruptNesting +ulPortYieldRequiredConst: .word ulPortYieldRequired + +.end + + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CRx_No_GIC/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CRx_No_GIC/portmacro.h new file mode 100644 index 0000000..a8bd1e8 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ARM_CRx_No_GIC/portmacro.h @@ -0,0 +1,215 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus + extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +typedef uint32_t TickType_t; +#define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do +not need to be guarded with a critical section. */ +#define portTICK_TYPE_IS_ATOMIC 1 + +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 + +/*-----------------------------------------------------------*/ + +/* Task utilities. */ + +/* Called at the end of an ISR that can cause a context switch. */ +#define portEND_SWITCHING_ISR( xSwitchRequired )\ +{ \ +extern volatile uint32_t ulPortYieldRequired; \ + \ + if( xSwitchRequired != pdFALSE ) \ + { \ + ulPortYieldRequired = pdTRUE; \ + } \ +} + +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +#define portYIELD() __asm volatile ( "SWI 0 \n" \ + "ISB " ); + + +/*----------------------------------------------------------- + * Critical section control + *----------------------------------------------------------*/ + +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); +extern uint32_t ulPortSetInterruptMask( void ); +extern void vPortClearInterruptMask( uint32_t ulNewMaskValue ); +extern void vPortInstallFreeRTOSVectorTable( void ); + +/* The I bit within the CPSR. */ +#define portINTERRUPT_ENABLE_BIT ( 1 << 7 ) + +/* In the absence of a priority mask register, these functions and macros +globally enable and disable interrupts. */ +#define portENTER_CRITICAL() vPortEnterCritical(); +#define portEXIT_CRITICAL() vPortExitCritical(); +#define portENABLE_INTERRUPTS() __asm volatile ( "CPSIE i \n" ); +#define portDISABLE_INTERRUPTS() __asm volatile ( "CPSID i \n" \ + "DSB \n" \ + "ISB " ); + +__attribute__( ( always_inline ) ) static __inline uint32_t portINLINE_SET_INTERRUPT_MASK_FROM_ISR( void ) +{ +volatile uint32_t ulCPSR; + + __asm volatile ( "MRS %0, CPSR" : "=r" (ulCPSR) ); + ulCPSR &= portINTERRUPT_ENABLE_BIT; + portDISABLE_INTERRUPTS(); + return ulCPSR; +} + +#define portSET_INTERRUPT_MASK_FROM_ISR() portINLINE_SET_INTERRUPT_MASK_FROM_ISR() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) if( x == 0 ) portENABLE_INTERRUPTS() + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are +not required for this port but included in case common demo code that uses these +macros is used. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +/* Prototype of the FreeRTOS tick handler. This must be installed as the +handler for whichever peripheral is used to generate the RTOS tick. */ +void FreeRTOS_Tick_Handler( void ); + +/* Any task that uses the floating point unit MUST call vPortTaskUsesFPU() +before any floating point instructions are executed. */ +void vPortTaskUsesFPU( void ); +#define portTASK_USES_FLOATING_POINT() vPortTaskUsesFPU() + +#define portLOWEST_INTERRUPT_PRIORITY ( ( ( uint32_t ) configUNIQUE_INTERRUPT_PRIORITIES ) - 1UL ) +#define portLOWEST_USABLE_INTERRUPT_PRIORITY ( portLOWEST_INTERRUPT_PRIORITY - 1UL ) + +/* Architecture specific optimisations. */ +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) __builtin_clz( uxReadyPriorities ) ) + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +#define portNOP() __asm volatile( "NOP" ) +#define portINLINE __inline + +#ifdef __cplusplus + } /* extern C */ +#endif + + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ATMega323/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ATMega323/port.c new file mode 100644 index 0000000..512d95b --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ATMega323/port.c @@ -0,0 +1,468 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* + +Changes from V2.6.0 + + + AVR port - Replaced the inb() and outb() functions with direct memory + access. This allows the port to be built with the 20050414 build of + WinAVR. +*/ + +#include +#include + +#include "FreeRTOS.h" +#include "task.h" + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the AVR port. + *----------------------------------------------------------*/ + +/* Start tasks with interrupts enables. */ +#define portFLAGS_INT_ENABLED ( ( StackType_t ) 0x80 ) + +/* Hardware constants for timer 1. */ +#define portCLEAR_COUNTER_ON_MATCH ( ( uint8_t ) 0x08 ) +#define portPRESCALE_64 ( ( uint8_t ) 0x03 ) +#define portCLOCK_PRESCALER ( ( uint32_t ) 64 ) +#define portCOMPARE_MATCH_A_INTERRUPT_ENABLE ( ( uint8_t ) 0x10 ) + +/*-----------------------------------------------------------*/ + +/* We require the address of the pxCurrentTCB variable, but don't want to know +any details of its type. */ +typedef void TCB_t; +extern volatile TCB_t * volatile pxCurrentTCB; + +/*-----------------------------------------------------------*/ + +/* + * Macro to save all the general purpose registers, the save the stack pointer + * into the TCB. + * + * The first thing we do is save the flags then disable interrupts. This is to + * guard our stack against having a context switch interrupt after we have already + * pushed the registers onto the stack - causing the 32 registers to be on the + * stack twice. + * + * r1 is set to zero as the compiler expects it to be thus, however some + * of the math routines make use of R1. + * + * The interrupts will have been disabled during the call to portSAVE_CONTEXT() + * so we need not worry about reading/writing to the stack pointer. + */ + +#define portSAVE_CONTEXT() \ + asm volatile ( "push r0 \n\t" \ + "in r0, __SREG__ \n\t" \ + "cli \n\t" \ + "push r0 \n\t" \ + "push r1 \n\t" \ + "clr r1 \n\t" \ + "push r2 \n\t" \ + "push r3 \n\t" \ + "push r4 \n\t" \ + "push r5 \n\t" \ + "push r6 \n\t" \ + "push r7 \n\t" \ + "push r8 \n\t" \ + "push r9 \n\t" \ + "push r10 \n\t" \ + "push r11 \n\t" \ + "push r12 \n\t" \ + "push r13 \n\t" \ + "push r14 \n\t" \ + "push r15 \n\t" \ + "push r16 \n\t" \ + "push r17 \n\t" \ + "push r18 \n\t" \ + "push r19 \n\t" \ + "push r20 \n\t" \ + "push r21 \n\t" \ + "push r22 \n\t" \ + "push r23 \n\t" \ + "push r24 \n\t" \ + "push r25 \n\t" \ + "push r26 \n\t" \ + "push r27 \n\t" \ + "push r28 \n\t" \ + "push r29 \n\t" \ + "push r30 \n\t" \ + "push r31 \n\t" \ + "lds r26, pxCurrentTCB \n\t" \ + "lds r27, pxCurrentTCB + 1 \n\t" \ + "in r0, 0x3d \n\t" \ + "st x+, r0 \n\t" \ + "in r0, 0x3e \n\t" \ + "st x+, r0 \n\t" \ + ); + +/* + * Opposite to portSAVE_CONTEXT(). Interrupts will have been disabled during + * the context save so we can write to the stack pointer. + */ + +#define portRESTORE_CONTEXT() \ + asm volatile ( "lds r26, pxCurrentTCB \n\t" \ + "lds r27, pxCurrentTCB + 1 \n\t" \ + "ld r28, x+ \n\t" \ + "out __SP_L__, r28 \n\t" \ + "ld r29, x+ \n\t" \ + "out __SP_H__, r29 \n\t" \ + "pop r31 \n\t" \ + "pop r30 \n\t" \ + "pop r29 \n\t" \ + "pop r28 \n\t" \ + "pop r27 \n\t" \ + "pop r26 \n\t" \ + "pop r25 \n\t" \ + "pop r24 \n\t" \ + "pop r23 \n\t" \ + "pop r22 \n\t" \ + "pop r21 \n\t" \ + "pop r20 \n\t" \ + "pop r19 \n\t" \ + "pop r18 \n\t" \ + "pop r17 \n\t" \ + "pop r16 \n\t" \ + "pop r15 \n\t" \ + "pop r14 \n\t" \ + "pop r13 \n\t" \ + "pop r12 \n\t" \ + "pop r11 \n\t" \ + "pop r10 \n\t" \ + "pop r9 \n\t" \ + "pop r8 \n\t" \ + "pop r7 \n\t" \ + "pop r6 \n\t" \ + "pop r5 \n\t" \ + "pop r4 \n\t" \ + "pop r3 \n\t" \ + "pop r2 \n\t" \ + "pop r1 \n\t" \ + "pop r0 \n\t" \ + "out __SREG__, r0 \n\t" \ + "pop r0 \n\t" \ + ); + +/*-----------------------------------------------------------*/ + +/* + * Perform hardware setup to enable ticks from timer 1, compare match A. + */ +static void prvSetupTimerInterrupt( void ); +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +uint16_t usAddress; + + /* Place a few bytes of known values on the bottom of the stack. + This is just useful for debugging. */ + + *pxTopOfStack = 0x11; + pxTopOfStack--; + *pxTopOfStack = 0x22; + pxTopOfStack--; + *pxTopOfStack = 0x33; + pxTopOfStack--; + + /* Simulate how the stack would look after a call to vPortYield() generated by + the compiler. */ + + /*lint -e950 -e611 -e923 Lint doesn't like this much - but nothing I can do about it. */ + + /* The start of the task code will be popped off the stack last, so place + it on first. */ + usAddress = ( uint16_t ) pxCode; + *pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff ); + pxTopOfStack--; + + usAddress >>= 8; + *pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff ); + pxTopOfStack--; + + /* Next simulate the stack as if after a call to portSAVE_CONTEXT(). + portSAVE_CONTEXT places the flags on the stack immediately after r0 + to ensure the interrupts get disabled as soon as possible, and so ensuring + the stack use is minimal should a context switch interrupt occur. */ + *pxTopOfStack = ( StackType_t ) 0x00; /* R0 */ + pxTopOfStack--; + *pxTopOfStack = portFLAGS_INT_ENABLED; + pxTopOfStack--; + + + /* Now the remaining registers. The compiler expects R1 to be 0. */ + *pxTopOfStack = ( StackType_t ) 0x00; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04; /* R4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05; /* R5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x13; /* R13 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x14; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x15; /* R15 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x16; /* R16 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x17; /* R17 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x18; /* R18 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x19; /* R19 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x20; /* R20 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x21; /* R21 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x22; /* R22 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x23; /* R23 */ + pxTopOfStack--; + + /* Place the parameter on the stack in the expected location. */ + usAddress = ( uint16_t ) pvParameters; + *pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff ); + pxTopOfStack--; + + usAddress >>= 8; + *pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff ); + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) 0x26; /* R26 X */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x27; /* R27 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x28; /* R28 Y */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x29; /* R29 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x30; /* R30 Z */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x031; /* R31 */ + pxTopOfStack--; + + /*lint +e950 +e611 +e923 */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* Setup the hardware to generate the tick. */ + prvSetupTimerInterrupt(); + + /* Restore the context of the first task that is going to run. */ + portRESTORE_CONTEXT(); + + /* Simulate a function call end as generated by the compiler. We will now + jump to the start of the task the context of which we have just restored. */ + asm volatile ( "ret" ); + + /* Should not get here. */ + return pdTRUE; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the AVR port will get stopped. If required simply + disable the tick interrupt here. */ +} +/*-----------------------------------------------------------*/ + +/* + * Manual context switch. The first thing we do is save the registers so we + * can use a naked attribute. + */ +void vPortYield( void ) __attribute__ ( ( naked ) ); +void vPortYield( void ) +{ + portSAVE_CONTEXT(); + vTaskSwitchContext(); + portRESTORE_CONTEXT(); + + asm volatile ( "ret" ); +} +/*-----------------------------------------------------------*/ + +/* + * Context switch function used by the tick. This must be identical to + * vPortYield() from the call to vTaskSwitchContext() onwards. The only + * difference from vPortYield() is the tick count is incremented as the + * call comes from the tick ISR. + */ +void vPortYieldFromTick( void ) __attribute__ ( ( naked ) ); +void vPortYieldFromTick( void ) +{ + portSAVE_CONTEXT(); + if( xTaskIncrementTick() != pdFALSE ) + { + vTaskSwitchContext(); + } + portRESTORE_CONTEXT(); + + asm volatile ( "ret" ); +} +/*-----------------------------------------------------------*/ + +/* + * Setup timer 1 compare match A to generate a tick interrupt. + */ +static void prvSetupTimerInterrupt( void ) +{ +uint32_t ulCompareMatch; +uint8_t ucHighByte, ucLowByte; + + /* Using 16bit timer 1 to generate the tick. Correct fuses must be + selected for the configCPU_CLOCK_HZ clock. */ + + ulCompareMatch = configCPU_CLOCK_HZ / configTICK_RATE_HZ; + + /* We only have 16 bits so have to scale to get our required tick rate. */ + ulCompareMatch /= portCLOCK_PRESCALER; + + /* Adjust for correct value. */ + ulCompareMatch -= ( uint32_t ) 1; + + /* Setup compare match value for compare match A. Interrupts are disabled + before this is called so we need not worry here. */ + ucLowByte = ( uint8_t ) ( ulCompareMatch & ( uint32_t ) 0xff ); + ulCompareMatch >>= 8; + ucHighByte = ( uint8_t ) ( ulCompareMatch & ( uint32_t ) 0xff ); + OCR1AH = ucHighByte; + OCR1AL = ucLowByte; + + /* Setup clock source and compare match behaviour. */ + ucLowByte = portCLEAR_COUNTER_ON_MATCH | portPRESCALE_64; + TCCR1B = ucLowByte; + + /* Enable the interrupt - this is okay as interrupt are currently globally + disabled. */ + ucLowByte = TIMSK; + ucLowByte |= portCOMPARE_MATCH_A_INTERRUPT_ENABLE; + TIMSK = ucLowByte; +} +/*-----------------------------------------------------------*/ + +#if configUSE_PREEMPTION == 1 + + /* + * Tick ISR for preemptive scheduler. We can use a naked attribute as + * the context is saved at the start of vPortYieldFromTick(). The tick + * count is incremented after the context is saved. + */ + void SIG_OUTPUT_COMPARE1A( void ) __attribute__ ( ( signal, naked ) ); + void SIG_OUTPUT_COMPARE1A( void ) + { + vPortYieldFromTick(); + asm volatile ( "reti" ); + } +#else + + /* + * Tick ISR for the cooperative scheduler. All this does is increment the + * tick count. We don't need to switch context, this can only be done by + * manual calls to taskYIELD(); + */ + void SIG_OUTPUT_COMPARE1A( void ) __attribute__ ( ( signal ) ); + void SIG_OUTPUT_COMPARE1A( void ) + { + xTaskIncrementTick(); + } +#endif + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ATMega323/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ATMega323/portmacro.h new file mode 100644 index 0000000..405d1e8 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ATMega323/portmacro.h @@ -0,0 +1,149 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* +Changes from V1.2.3 + + + portCPU_CLOSK_HZ definition changed to 8MHz base 10, previously it + base 16. +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT int +#define portSTACK_TYPE uint8_t +#define portBASE_TYPE char + +typedef portSTACK_TYPE StackType_t; +typedef signed char BaseType_t; +typedef unsigned char UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +#define portENTER_CRITICAL() asm volatile ( "in __tmp_reg__, __SREG__" :: ); \ + asm volatile ( "cli" :: ); \ + asm volatile ( "push __tmp_reg__" :: ) + +#define portEXIT_CRITICAL() asm volatile ( "pop __tmp_reg__" :: ); \ + asm volatile ( "out __SREG__, __tmp_reg__" :: ) + +#define portDISABLE_INTERRUPTS() asm volatile ( "cli" :: ); +#define portENABLE_INTERRUPTS() asm volatile ( "sei" :: ); +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 1 +#define portNOP() asm volatile ( "nop" ); +/*-----------------------------------------------------------*/ + +/* Kernel utilities. */ +extern void vPortYield( void ) __attribute__ ( ( naked ) ); +#define portYIELD() vPortYield() +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/AVR32_UC3/exception.S b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/AVR32_UC3/exception.S new file mode 100644 index 0000000..9a2833f --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/AVR32_UC3/exception.S @@ -0,0 +1,297 @@ +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief Exception and interrupt vectors. + * + * This file maps all events supported by an AVR32UC. + * + * - Compiler: GNU GCC for AVR32 + * - Supported devices: All AVR32UC devices with an INTC module can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2007, Atmel Corporation All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of ATMEL may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND + * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +#include +#include "intc.h" + + +//! @{ +//! \verbatim + + + .section .exception, "ax", @progbits + + +// Start of Exception Vector Table. + + // EVBA must be aligned with a power of two strictly greater than the EVBA- + // relative offset of the last vector. + .balign 0x200 + + // Export symbol. + .global _evba + .type _evba, @function +_evba: + + .org 0x000 + // Unrecoverable Exception. +_handle_Unrecoverable_Exception: + rjmp $ + + .org 0x004 + // TLB Multiple Hit: UNUSED IN AVR32UC. +_handle_TLB_Multiple_Hit: + rjmp $ + + .org 0x008 + // Bus Error Data Fetch. +_handle_Bus_Error_Data_Fetch: + rjmp $ + + .org 0x00C + // Bus Error Instruction Fetch. +_handle_Bus_Error_Instruction_Fetch: + rjmp $ + + .org 0x010 + // NMI. +_handle_NMI: + rjmp $ + + .org 0x014 + // Instruction Address. +_handle_Instruction_Address: + rjmp $ + + .org 0x018 + // ITLB Protection. +_handle_ITLB_Protection: + rjmp $ + + .org 0x01C + // Breakpoint. +_handle_Breakpoint: + rjmp $ + + .org 0x020 + // Illegal Opcode. +_handle_Illegal_Opcode: + rjmp $ + + .org 0x024 + // Unimplemented Instruction. +_handle_Unimplemented_Instruction: + rjmp $ + + .org 0x028 + // Privilege Violation. +_handle_Privilege_Violation: + rjmp $ + + .org 0x02C + // Floating-Point: UNUSED IN AVR32UC. +_handle_Floating_Point: + rjmp $ + + .org 0x030 + // Coprocessor Absent: UNUSED IN AVR32UC. +_handle_Coprocessor_Absent: + rjmp $ + + .org 0x034 + // Data Address (Read). +_handle_Data_Address_Read: + rjmp $ + + .org 0x038 + // Data Address (Write). +_handle_Data_Address_Write: + rjmp $ + + .org 0x03C + // DTLB Protection (Read). +_handle_DTLB_Protection_Read: + rjmp $ + + .org 0x040 + // DTLB Protection (Write). +_handle_DTLB_Protection_Write: + rjmp $ + + .org 0x044 + // DTLB Modified: UNUSED IN AVR32UC. +_handle_DTLB_Modified: + rjmp $ + + .org 0x050 + // ITLB Miss: UNUSED IN AVR32UC. +_handle_ITLB_Miss: + rjmp $ + + .org 0x060 + // DTLB Miss (Read): UNUSED IN AVR32UC. +_handle_DTLB_Miss_Read: + rjmp $ + + .org 0x070 + // DTLB Miss (Write): UNUSED IN AVR32UC. +_handle_DTLB_Miss_Write: + rjmp $ + + .org 0x100 + // Supervisor Call. +_handle_Supervisor_Call: + lda.w pc, SCALLYield + + +// Interrupt support. +// The interrupt controller must provide the offset address relative to EVBA. +// Important note: +// All interrupts call a C function named _get_interrupt_handler. +// This function will read group and interrupt line number to then return in +// R12 a pointer to a user-provided interrupt handler. + + .balign 4 + +_int0: + // R8-R12, LR, PC and SR are automatically pushed onto the system stack by the + // CPU upon interrupt entry. +#if 1 // B1832: interrupt stack changed to exception stack if exception is detected. + mfsr r12, AVR32_SR + bfextu r12, r12, AVR32_SR_M0_OFFSET, AVR32_SR_M0_SIZE + AVR32_SR_M1_SIZE + AVR32_SR_M2_SIZE + cp.w r12, 0b110 + brlo _int0_normal + lddsp r12, sp[0 * 4] + stdsp sp[6 * 4], r12 + lddsp r12, sp[1 * 4] + stdsp sp[7 * 4], r12 + lddsp r12, sp[3 * 4] + sub sp, -6 * 4 + rete +_int0_normal: +#endif + mov r12, 0 // Pass the int_lev parameter to the _get_interrupt_handler function. + call _get_interrupt_handler + cp.w r12, 0 // Get the pointer to the interrupt handler returned by the function. + movne pc, r12 // If this was not a spurious interrupt (R12 != NULL), jump to the handler. + rete // If this was a spurious interrupt (R12 == NULL), return from event handler. + +_int1: + // R8-R12, LR, PC and SR are automatically pushed onto the system stack by the + // CPU upon interrupt entry. +#if 1 // B1832: interrupt stack changed to exception stack if exception is detected. + mfsr r12, AVR32_SR + bfextu r12, r12, AVR32_SR_M0_OFFSET, AVR32_SR_M0_SIZE + AVR32_SR_M1_SIZE + AVR32_SR_M2_SIZE + cp.w r12, 0b110 + brlo _int1_normal + lddsp r12, sp[0 * 4] + stdsp sp[6 * 4], r12 + lddsp r12, sp[1 * 4] + stdsp sp[7 * 4], r12 + lddsp r12, sp[3 * 4] + sub sp, -6 * 4 + rete +_int1_normal: +#endif + mov r12, 1 // Pass the int_lev parameter to the _get_interrupt_handler function. + call _get_interrupt_handler + cp.w r12, 0 // Get the pointer to the interrupt handler returned by the function. + movne pc, r12 // If this was not a spurious interrupt (R12 != NULL), jump to the handler. + rete // If this was a spurious interrupt (R12 == NULL), return from event handler. + +_int2: + // R8-R12, LR, PC and SR are automatically pushed onto the system stack by the + // CPU upon interrupt entry. +#if 1 // B1832: interrupt stack changed to exception stack if exception is detected. + mfsr r12, AVR32_SR + bfextu r12, r12, AVR32_SR_M0_OFFSET, AVR32_SR_M0_SIZE + AVR32_SR_M1_SIZE + AVR32_SR_M2_SIZE + cp.w r12, 0b110 + brlo _int2_normal + lddsp r12, sp[0 * 4] + stdsp sp[6 * 4], r12 + lddsp r12, sp[1 * 4] + stdsp sp[7 * 4], r12 + lddsp r12, sp[3 * 4] + sub sp, -6 * 4 + rete +_int2_normal: +#endif + mov r12, 2 // Pass the int_lev parameter to the _get_interrupt_handler function. + call _get_interrupt_handler + cp.w r12, 0 // Get the pointer to the interrupt handler returned by the function. + movne pc, r12 // If this was not a spurious interrupt (R12 != NULL), jump to the handler. + rete // If this was a spurious interrupt (R12 == NULL), return from event handler. + +_int3: + // R8-R12, LR, PC and SR are automatically pushed onto the system stack by the + // CPU upon interrupt entry. +#if 1 // B1832: interrupt stack changed to exception stack if exception is detected. + mfsr r12, AVR32_SR + bfextu r12, r12, AVR32_SR_M0_OFFSET, AVR32_SR_M0_SIZE + AVR32_SR_M1_SIZE + AVR32_SR_M2_SIZE + cp.w r12, 0b110 + brlo _int3_normal + lddsp r12, sp[0 * 4] + stdsp sp[6 * 4], r12 + lddsp r12, sp[1 * 4] + stdsp sp[7 * 4], r12 + lddsp r12, sp[3 * 4] + sub sp, -6 * 4 + rete +_int3_normal: +#endif + mov r12, 3 // Pass the int_lev parameter to the _get_interrupt_handler function. + call _get_interrupt_handler + cp.w r12, 0 // Get the pointer to the interrupt handler returned by the function. + movne pc, r12 // If this was not a spurious interrupt (R12 != NULL), jump to the handler. + rete // If this was a spurious interrupt (R12 == NULL), return from event handler. + + +// Constant data area. + + .balign 4 + + // Values to store in the interrupt priority registers for the various interrupt priority levels. + // The interrupt priority registers contain the interrupt priority level and + // the EVBA-relative interrupt vector offset. + .global ipr_val + .type ipr_val, @object +ipr_val: + .word (INT0 << AVR32_INTC_IPR0_INTLEV_OFFSET) | (_int0 - _evba),\ + (INT1 << AVR32_INTC_IPR0_INTLEV_OFFSET) | (_int1 - _evba),\ + (INT2 << AVR32_INTC_IPR0_INTLEV_OFFSET) | (_int2 - _evba),\ + (INT3 << AVR32_INTC_IPR0_INTLEV_OFFSET) | (_int3 - _evba) + + +//! \endverbatim +//! @} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/AVR32_UC3/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/AVR32_UC3/port.c new file mode 100644 index 0000000..9efa3f1 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/AVR32_UC3/port.c @@ -0,0 +1,477 @@ +/*This file has been prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief FreeRTOS port source for AVR32 UC3. + * + * - Compiler: GNU GCC for AVR32 + * - Supported devices: All AVR32 devices can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + *****************************************************************************/ + +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +/* Standard includes. */ +#include +#include +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* AVR32 UC3 includes. */ +#include +#include "gpio.h" +#if( configTICK_USE_TC==1 ) + #include "tc.h" +#endif + + +/* Constants required to setup the task context. */ +#define portINITIAL_SR ( ( StackType_t ) 0x00400000 ) /* AVR32 : [M2:M0]=001 I1M=0 I0M=0, GM=0 */ +#define portINSTRUCTION_SIZE ( ( StackType_t ) 0 ) + +/* Each task maintains its own critical nesting variable. */ +#define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) +volatile uint32_t ulCriticalNesting = 9999UL; + +#if( configTICK_USE_TC==0 ) + static void prvScheduleNextTick( void ); +#else + static void prvClearTcInt( void ); +#endif + +/* Setup the timer to generate the tick interrupts. */ +static void prvSetupTimerInterrupt( void ); + +/*-----------------------------------------------------------*/ + +/* + * Low-level initialization routine called during startup, before the main + * function. + * This version comes in replacement to the default one provided by Newlib. + * Newlib's _init_startup only calls init_exceptions, but Newlib's exception + * vectors are not compatible with the SCALL management in the current FreeRTOS + * port. More low-level initializations are besides added here. + */ +void _init_startup(void) +{ + /* Import the Exception Vector Base Address. */ + extern void _evba; + + #if configHEAP_INIT + extern void __heap_start__; + extern void __heap_end__; + BaseType_t *pxMem; + #endif + + /* Load the Exception Vector Base Address in the corresponding system register. */ + Set_system_register( AVR32_EVBA, ( int ) &_evba ); + + /* Enable exceptions. */ + ENABLE_ALL_EXCEPTIONS(); + + /* Initialize interrupt handling. */ + INTC_init_interrupts(); + + #if configHEAP_INIT + + /* Initialize the heap used by malloc. */ + for( pxMem = &__heap_start__; pxMem < ( BaseType_t * )&__heap_end__; ) + { + *pxMem++ = 0xA5A5A5A5; + } + + #endif + + /* Give the used CPU clock frequency to Newlib, so it can work properly. */ + set_cpu_hz( configCPU_CLOCK_HZ ); + + /* Code section present if and only if the debug trace is activated. */ + #if configDBG + { + static const gpio_map_t DBG_USART_GPIO_MAP = + { + { configDBG_USART_RX_PIN, configDBG_USART_RX_FUNCTION }, + { configDBG_USART_TX_PIN, configDBG_USART_TX_FUNCTION } + }; + + /* Initialize the USART used for the debug trace with the configured parameters. */ + set_usart_base( ( void * ) configDBG_USART ); + gpio_enable_module( DBG_USART_GPIO_MAP, + sizeof( DBG_USART_GPIO_MAP ) / sizeof( DBG_USART_GPIO_MAP[0] ) ); + usart_init( configDBG_USART_BAUDRATE ); + } + #endif +} +/*-----------------------------------------------------------*/ + +/* + * malloc, realloc and free are meant to be called through respectively + * pvPortMalloc, pvPortRealloc and vPortFree. + * The latter functions call the former ones from within sections where tasks + * are suspended, so the latter functions are task-safe. __malloc_lock and + * __malloc_unlock use the same mechanism to also keep the former functions + * task-safe as they may be called directly from Newlib's functions. + * However, all these functions are interrupt-unsafe and SHALL THEREFORE NOT BE + * CALLED FROM WITHIN AN INTERRUPT, because __malloc_lock and __malloc_unlock do + * not call portENTER_CRITICAL and portEXIT_CRITICAL in order not to disable + * interrupts during memory allocation management as this may be a very time- + * consuming process. + */ + +/* + * Lock routine called by Newlib on malloc / realloc / free entry to guarantee a + * safe section as memory allocation management uses global data. + * See the aforementioned details. + */ +void __malloc_lock(struct _reent *ptr) +{ + vTaskSuspendAll(); +} + +/* + * Unlock routine called by Newlib on malloc / realloc / free exit to guarantee + * a safe section as memory allocation management uses global data. + * See the aforementioned details. + */ +void __malloc_unlock(struct _reent *ptr) +{ + xTaskResumeAll(); +} +/*-----------------------------------------------------------*/ + +/* Added as there is no such function in FreeRTOS. */ +void *pvPortRealloc( void *pv, size_t xWantedSize ) +{ +void *pvReturn; + + vTaskSuspendAll(); + { + pvReturn = realloc( pv, xWantedSize ); + } + xTaskResumeAll(); + + return pvReturn; +} +/*-----------------------------------------------------------*/ + +/* The cooperative scheduler requires a normal IRQ service routine to +simply increment the system tick. */ +/* The preemptive scheduler is defined as "naked" as the full context is saved +on entry as part of the context switch. */ +__attribute__((__naked__)) static void vTick( void ) +{ + /* Save the context of the interrupted task. */ + portSAVE_CONTEXT_OS_INT(); + + #if( configTICK_USE_TC==1 ) + /* Clear the interrupt flag. */ + prvClearTcInt(); + #else + /* Schedule the COUNT&COMPARE match interrupt in (configCPU_CLOCK_HZ/configTICK_RATE_HZ) + clock cycles from now. */ + prvScheduleNextTick(); + #endif + + /* Because FreeRTOS is not supposed to run with nested interrupts, put all OS + calls in a critical section . */ + portENTER_CRITICAL(); + xTaskIncrementTick(); + portEXIT_CRITICAL(); + + /* Restore the context of the "elected task". */ + portRESTORE_CONTEXT_OS_INT(); +} +/*-----------------------------------------------------------*/ + +__attribute__((__naked__)) void SCALLYield( void ) +{ + /* Save the context of the interrupted task. */ + portSAVE_CONTEXT_SCALL(); + vTaskSwitchContext(); + portRESTORE_CONTEXT_SCALL(); +} +/*-----------------------------------------------------------*/ + +/* The code generated by the GCC compiler uses the stack in different ways at +different optimisation levels. The interrupt flags can therefore not always +be saved to the stack. Instead the critical section nesting level is stored +in a variable, which is then saved as part of the stack context. */ +__attribute__((__noinline__)) void vPortEnterCritical( void ) +{ + /* Disable interrupts */ + portDISABLE_INTERRUPTS(); + + /* Now interrupts are disabled ulCriticalNesting can be accessed + directly. Increment ulCriticalNesting to keep a count of how many times + portENTER_CRITICAL() has been called. */ + ulCriticalNesting++; +} +/*-----------------------------------------------------------*/ + +__attribute__((__noinline__)) void vPortExitCritical( void ) +{ + if(ulCriticalNesting > portNO_CRITICAL_NESTING) + { + ulCriticalNesting--; + if( ulCriticalNesting == portNO_CRITICAL_NESTING ) + { + /* Enable all interrupt/exception. */ + portENABLE_INTERRUPTS(); + } + } +} +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been called. + * + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. */ + + /* When the task starts, it will expect to find the function parameter in R12. */ + pxTopOfStack--; + *pxTopOfStack-- = ( StackType_t ) 0x08080808; /* R8 */ + *pxTopOfStack-- = ( StackType_t ) 0x09090909; /* R9 */ + *pxTopOfStack-- = ( StackType_t ) 0x0A0A0A0A; /* R10 */ + *pxTopOfStack-- = ( StackType_t ) 0x0B0B0B0B; /* R11 */ + *pxTopOfStack-- = ( StackType_t ) pvParameters; /* R12 */ + *pxTopOfStack-- = ( StackType_t ) 0xDEADBEEF; /* R14/LR */ + *pxTopOfStack-- = ( StackType_t ) pxCode + portINSTRUCTION_SIZE; /* R15/PC */ + *pxTopOfStack-- = ( StackType_t ) portINITIAL_SR; /* SR */ + *pxTopOfStack-- = ( StackType_t ) 0xFF0000FF; /* R0 */ + *pxTopOfStack-- = ( StackType_t ) 0x01010101; /* R1 */ + *pxTopOfStack-- = ( StackType_t ) 0x02020202; /* R2 */ + *pxTopOfStack-- = ( StackType_t ) 0x03030303; /* R3 */ + *pxTopOfStack-- = ( StackType_t ) 0x04040404; /* R4 */ + *pxTopOfStack-- = ( StackType_t ) 0x05050505; /* R5 */ + *pxTopOfStack-- = ( StackType_t ) 0x06060606; /* R6 */ + *pxTopOfStack-- = ( StackType_t ) 0x07070707; /* R7 */ + *pxTopOfStack = ( StackType_t ) portNO_CRITICAL_NESTING; /* ulCriticalNesting */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + prvSetupTimerInterrupt(); + + /* Start the first task. */ + portRESTORE_CONTEXT(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the AVR32 port will require this function as there + is nothing to return to. */ +} +/*-----------------------------------------------------------*/ + +/* Schedule the COUNT&COMPARE match interrupt in (configCPU_CLOCK_HZ/configTICK_RATE_HZ) +clock cycles from now. */ +#if( configTICK_USE_TC==0 ) + static void prvScheduleFirstTick(void) + { + uint32_t lCycles; + + lCycles = Get_system_register(AVR32_COUNT); + lCycles += (configCPU_CLOCK_HZ/configTICK_RATE_HZ); + // If lCycles ends up to be 0, make it 1 so that the COMPARE and exception + // generation feature does not get disabled. + if(0 == lCycles) + { + lCycles++; + } + Set_system_register(AVR32_COMPARE, lCycles); + } + + __attribute__((__noinline__)) static void prvScheduleNextTick(void) + { + uint32_t lCycles, lCount; + + lCycles = Get_system_register(AVR32_COMPARE); + lCycles += (configCPU_CLOCK_HZ/configTICK_RATE_HZ); + // If lCycles ends up to be 0, make it 1 so that the COMPARE and exception + // generation feature does not get disabled. + if(0 == lCycles) + { + lCycles++; + } + lCount = Get_system_register(AVR32_COUNT); + if( lCycles < lCount ) + { // We missed a tick, recover for the next. + lCycles += (configCPU_CLOCK_HZ/configTICK_RATE_HZ); + } + Set_system_register(AVR32_COMPARE, lCycles); + } +#else + __attribute__((__noinline__)) static void prvClearTcInt(void) + { + AVR32_TC.channel[configTICK_TC_CHANNEL].sr; + } +#endif +/*-----------------------------------------------------------*/ + +/* Setup the timer to generate the tick interrupts. */ +static void prvSetupTimerInterrupt(void) +{ +#if( configTICK_USE_TC==1 ) + + volatile avr32_tc_t *tc = &AVR32_TC; + + // Options for waveform genration. + tc_waveform_opt_t waveform_opt = + { + .channel = configTICK_TC_CHANNEL, /* Channel selection. */ + + .bswtrg = TC_EVT_EFFECT_NOOP, /* Software trigger effect on TIOB. */ + .beevt = TC_EVT_EFFECT_NOOP, /* External event effect on TIOB. */ + .bcpc = TC_EVT_EFFECT_NOOP, /* RC compare effect on TIOB. */ + .bcpb = TC_EVT_EFFECT_NOOP, /* RB compare effect on TIOB. */ + + .aswtrg = TC_EVT_EFFECT_NOOP, /* Software trigger effect on TIOA. */ + .aeevt = TC_EVT_EFFECT_NOOP, /* External event effect on TIOA. */ + .acpc = TC_EVT_EFFECT_NOOP, /* RC compare effect on TIOA: toggle. */ + .acpa = TC_EVT_EFFECT_NOOP, /* RA compare effect on TIOA: toggle (other possibilities are none, set and clear). */ + + .wavsel = TC_WAVEFORM_SEL_UP_MODE_RC_TRIGGER,/* Waveform selection: Up mode without automatic trigger on RC compare. */ + .enetrg = FALSE, /* External event trigger enable. */ + .eevt = 0, /* External event selection. */ + .eevtedg = TC_SEL_NO_EDGE, /* External event edge selection. */ + .cpcdis = FALSE, /* Counter disable when RC compare. */ + .cpcstop = FALSE, /* Counter clock stopped with RC compare. */ + + .burst = FALSE, /* Burst signal selection. */ + .clki = FALSE, /* Clock inversion. */ + .tcclks = TC_CLOCK_SOURCE_TC2 /* Internal source clock 2. */ + }; + + tc_interrupt_t tc_interrupt = + { + .etrgs=0, + .ldrbs=0, + .ldras=0, + .cpcs =1, + .cpbs =0, + .cpas =0, + .lovrs=0, + .covfs=0, + }; + +#endif + + /* Disable all interrupt/exception. */ + portDISABLE_INTERRUPTS(); + + /* Register the compare interrupt handler to the interrupt controller and + enable the compare interrupt. */ + + #if( configTICK_USE_TC==1 ) + { + INTC_register_interrupt(&vTick, configTICK_TC_IRQ, INT0); + + /* Initialize the timer/counter. */ + tc_init_waveform(tc, &waveform_opt); + + /* Set the compare triggers. + Remember TC counter is 16-bits, so counting second is not possible! + That's why we configure it to count ms. */ + tc_write_rc( tc, configTICK_TC_CHANNEL, ( configPBA_CLOCK_HZ / 4) / configTICK_RATE_HZ ); + + tc_configure_interrupts( tc, configTICK_TC_CHANNEL, &tc_interrupt ); + + /* Start the timer/counter. */ + tc_start(tc, configTICK_TC_CHANNEL); + } + #else + { + INTC_register_interrupt(&vTick, AVR32_CORE_COMPARE_IRQ, INT0); + prvScheduleFirstTick(); + } + #endif +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/AVR32_UC3/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/AVR32_UC3/portmacro.h new file mode 100644 index 0000000..8072373 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/AVR32_UC3/portmacro.h @@ -0,0 +1,709 @@ +/*This file has been prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief FreeRTOS port source for AVR32 UC3. + * + * - Compiler: GNU GCC for AVR32 + * - Supported devices: All AVR32 devices can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + *****************************************************************************/ + +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ +#include +#include "intc.h" +#include "compiler.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#define TASK_DELAY_MS(x) ( (x) /portTICK_PERIOD_MS ) +#define TASK_DELAY_S(x) ( (x)*1000 /portTICK_PERIOD_MS ) +#define TASK_DELAY_MIN(x) ( (x)*60*1000/portTICK_PERIOD_MS ) + +#define configTICK_TC_IRQ ATPASTE2(AVR32_TC_IRQ, configTICK_TC_CHANNEL) + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 4 +#define portNOP() {__asm__ __volatile__ ("nop");} +/*-----------------------------------------------------------*/ + + +/*-----------------------------------------------------------*/ + +/* INTC-specific. */ +#define DISABLE_ALL_EXCEPTIONS() Disable_global_exception() +#define ENABLE_ALL_EXCEPTIONS() Enable_global_exception() + +#define DISABLE_ALL_INTERRUPTS() Disable_global_interrupt() +#define ENABLE_ALL_INTERRUPTS() Enable_global_interrupt() + +#define DISABLE_INT_LEVEL(int_lev) Disable_interrupt_level(int_lev) +#define ENABLE_INT_LEVEL(int_lev) Enable_interrupt_level(int_lev) + + +/* + * Debug trace. + * Activated if and only if configDBG is nonzero. + * Prints a formatted string to stdout. + * The current source file name and line number are output with a colon before + * the formatted string. + * A carriage return and a linefeed are appended to the output. + * stdout is redirected to the USART configured by configDBG_USART. + * The parameters are the same as for the standard printf function. + * There is no return value. + * SHALL NOT BE CALLED FROM WITHIN AN INTERRUPT as fputs and printf use malloc, + * which is interrupt-unsafe with the current __malloc_lock and __malloc_unlock. + */ +#if configDBG +#define portDBG_TRACE(...) \ +{\ + fputs(__FILE__ ":" ASTRINGZ(__LINE__) ": ", stdout);\ + printf(__VA_ARGS__);\ + fputs("\r\n", stdout);\ +} +#else +#define portDBG_TRACE(...) +#endif + + +/* Critical section management. */ +#define portDISABLE_INTERRUPTS() DISABLE_ALL_INTERRUPTS() +#define portENABLE_INTERRUPTS() ENABLE_ALL_INTERRUPTS() + + +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); + +#define portENTER_CRITICAL() vPortEnterCritical(); +#define portEXIT_CRITICAL() vPortExitCritical(); + + +/* Added as there is no such function in FreeRTOS. */ +extern void *pvPortRealloc( void *pv, size_t xSize ); +/*-----------------------------------------------------------*/ + + +/*=============================================================================================*/ + +/* + * Restore Context for cases other than INTi. + */ +#define portRESTORE_CONTEXT() \ +{ \ + extern volatile uint32_t ulCriticalNesting; \ + extern volatile void *volatile pxCurrentTCB; \ + \ + __asm__ __volatile__ ( \ + /* Set SP to point to new stack */ \ + "mov r8, LO(%[pxCurrentTCB]) \n\t"\ + "orh r8, HI(%[pxCurrentTCB]) \n\t"\ + "ld.w r0, r8[0] \n\t"\ + "ld.w sp, r0[0] \n\t"\ + \ + /* Restore ulCriticalNesting variable */ \ + "ld.w r0, sp++ \n\t"\ + "mov r8, LO(%[ulCriticalNesting]) \n\t"\ + "orh r8, HI(%[ulCriticalNesting]) \n\t"\ + "st.w r8[0], r0 \n\t"\ + \ + /* Restore R0..R7 */ \ + "ldm sp++, r0-r7 \n\t"\ + /* R0-R7 should not be used below this line */ \ + /* Skip PC and SR (will do it at the end) */ \ + "sub sp, -2*4 \n\t"\ + /* Restore R8..R12 and LR */ \ + "ldm sp++, r8-r12, lr \n\t"\ + /* Restore SR */ \ + "ld.w r0, sp[-8*4]\n\t" /* R0 is modified, is restored later. */ \ + "mtsr %[SR], r0 \n\t"\ + /* Restore r0 */ \ + "ld.w r0, sp[-9*4] \n\t"\ + /* Restore PC */ \ + "ld.w pc, sp[-7*4]" /* Get PC from stack - PC is the 7th register saved */ \ + : \ + : [ulCriticalNesting] "i" (&ulCriticalNesting), \ + [pxCurrentTCB] "i" (&pxCurrentTCB), \ + [SR] "i" (AVR32_SR) \ + ); \ +} + + +/* + * portSAVE_CONTEXT_INT() and portRESTORE_CONTEXT_INT(): for INT0..3 exceptions. + * portSAVE_CONTEXT_SCALL() and portRESTORE_CONTEXT_SCALL(): for the scall exception. + * + * Had to make different versions because registers saved on the system stack + * are not the same between INT0..3 exceptions and the scall exception. + */ + +// Task context stack layout: + // R8 (*) + // R9 (*) + // R10 (*) + // R11 (*) + // R12 (*) + // R14/LR (*) + // R15/PC (*) + // SR (*) + // R0 + // R1 + // R2 + // R3 + // R4 + // R5 + // R6 + // R7 + // ulCriticalNesting +// (*) automatically done for INT0..INT3, but not for SCALL + +/* + * The ISR used for the scheduler tick depends on whether the cooperative or + * the preemptive scheduler is being used. + */ +#if configUSE_PREEMPTION == 0 + +/* + * portSAVE_CONTEXT_OS_INT() for OS Tick exception. + */ +#define portSAVE_CONTEXT_OS_INT() \ +{ \ + /* Save R0..R7 */ \ + __asm__ __volatile__ ("stm --sp, r0-r7"); \ + \ + /* With the cooperative scheduler, as there is no context switch by interrupt, */ \ + /* there is also no context save. */ \ +} + +/* + * portRESTORE_CONTEXT_OS_INT() for Tick exception. + */ +#define portRESTORE_CONTEXT_OS_INT() \ +{ \ + __asm__ __volatile__ ( \ + /* Restore R0..R7 */ \ + "ldm sp++, r0-r7\n\t" \ + \ + /* With the cooperative scheduler, as there is no context switch by interrupt, */ \ + /* there is also no context restore. */ \ + "rete" \ + ); \ +} + +#else + +/* + * portSAVE_CONTEXT_OS_INT() for OS Tick exception. + */ +#define portSAVE_CONTEXT_OS_INT() \ +{ \ + extern volatile uint32_t ulCriticalNesting; \ + extern volatile void *volatile pxCurrentTCB; \ + \ + /* When we come here */ \ + /* Registers R8..R12, LR, PC and SR had already been pushed to system stack */ \ + \ + __asm__ __volatile__ ( \ + /* Save R0..R7 */ \ + "stm --sp, r0-r7 \n\t"\ + \ + /* Save ulCriticalNesting variable - R0 is overwritten */ \ + "mov r8, LO(%[ulCriticalNesting])\n\t" \ + "orh r8, HI(%[ulCriticalNesting])\n\t" \ + "ld.w r0, r8[0] \n\t"\ + "st.w --sp, r0 \n\t"\ + \ + /* Check if INT0 or higher were being handled (case where the OS tick interrupted another */ \ + /* interrupt handler (which was of a higher priority level but decided to lower its priority */ \ + /* level and allow other lower interrupt level to occur). */ \ + /* In this case we don't want to do a task switch because we don't know what the stack */ \ + /* currently looks like (we don't know what the interrupted interrupt handler was doing). */ \ + /* Saving SP in pxCurrentTCB and then later restoring it (thinking restoring the task) */ \ + /* will just be restoring the interrupt handler, no way!!! */ \ + /* So, since we won't do a vTaskSwitchContext(), it's of no use to save SP. */ \ + "ld.w r0, sp[9*4]\n\t" /* Read SR in stack */ \ + "bfextu r0, r0, 22, 3\n\t" /* Extract the mode bits to R0. */ \ + "cp.w r0, 1\n\t" /* Compare the mode bits with supervisor mode(b'001) */ \ + "brhi LABEL_INT_SKIP_SAVE_CONTEXT_%[LINE] \n\t"\ + \ + /* Store SP in the first member of the structure pointed to by pxCurrentTCB */ \ + /* NOTE: we don't enter a critical section here because all interrupt handlers */ \ + /* MUST perform a SAVE_CONTEXT/RESTORE_CONTEXT in the same way as */ \ + /* portSAVE_CONTEXT_OS_INT/port_RESTORE_CONTEXT_OS_INT if they call OS functions. */ \ + /* => all interrupt handlers must use portENTER_SWITCHING_ISR/portEXIT_SWITCHING_ISR. */ \ + "mov r8, LO(%[pxCurrentTCB])\n\t" \ + "orh r8, HI(%[pxCurrentTCB])\n\t" \ + "ld.w r0, r8[0]\n\t" \ + "st.w r0[0], sp\n" \ + \ + "LABEL_INT_SKIP_SAVE_CONTEXT_%[LINE]:" \ + : \ + : [ulCriticalNesting] "i" (&ulCriticalNesting), \ + [pxCurrentTCB] "i" (&pxCurrentTCB), \ + [LINE] "i" (__LINE__) \ + ); \ +} + +/* + * portRESTORE_CONTEXT_OS_INT() for Tick exception. + */ +#define portRESTORE_CONTEXT_OS_INT() \ +{ \ + extern volatile uint32_t ulCriticalNesting; \ + extern volatile void *volatile pxCurrentTCB; \ + \ + /* Check if INT0 or higher were being handled (case where the OS tick interrupted another */ \ + /* interrupt handler (which was of a higher priority level but decided to lower its priority */ \ + /* level and allow other lower interrupt level to occur). */ \ + /* In this case we don't want to do a task switch because we don't know what the stack */ \ + /* currently looks like (we don't know what the interrupted interrupt handler was doing). */ \ + /* Saving SP in pxCurrentTCB and then later restoring it (thinking restoring the task) */ \ + /* will just be restoring the interrupt handler, no way!!! */ \ + __asm__ __volatile__ ( \ + "ld.w r0, sp[9*4]\n\t" /* Read SR in stack */ \ + "bfextu r0, r0, 22, 3\n\t" /* Extract the mode bits to R0. */ \ + "cp.w r0, 1\n\t" /* Compare the mode bits with supervisor mode(b'001) */ \ + "brhi LABEL_INT_SKIP_RESTORE_CONTEXT_%[LINE]" \ + : \ + : [LINE] "i" (__LINE__) \ + ); \ + \ + /* Else */ \ + /* because it is here safe, always call vTaskSwitchContext() since an OS tick occurred. */ \ + /* A critical section has to be used here because vTaskSwitchContext handles FreeRTOS linked lists. */\ + portENTER_CRITICAL(); \ + vTaskSwitchContext(); \ + portEXIT_CRITICAL(); \ + \ + /* Restore all registers */ \ + \ + __asm__ __volatile__ ( \ + /* Set SP to point to new stack */ \ + "mov r8, LO(%[pxCurrentTCB]) \n\t"\ + "orh r8, HI(%[pxCurrentTCB]) \n\t"\ + "ld.w r0, r8[0] \n\t"\ + "ld.w sp, r0[0] \n"\ + \ + "LABEL_INT_SKIP_RESTORE_CONTEXT_%[LINE]: \n\t"\ + \ + /* Restore ulCriticalNesting variable */ \ + "ld.w r0, sp++ \n\t" \ + "mov r8, LO(%[ulCriticalNesting]) \n\t"\ + "orh r8, HI(%[ulCriticalNesting]) \n\t"\ + "st.w r8[0], r0 \n\t"\ + \ + /* Restore R0..R7 */ \ + "ldm sp++, r0-r7 \n\t"\ + \ + /* Now, the stack should be R8..R12, LR, PC and SR */ \ + "rete" \ + : \ + : [ulCriticalNesting] "i" (&ulCriticalNesting), \ + [pxCurrentTCB] "i" (&pxCurrentTCB), \ + [LINE] "i" (__LINE__) \ + ); \ +} + +#endif + + +/* + * portSAVE_CONTEXT_SCALL() for SupervisorCALL exception. + * + * NOTE: taskYIELD()(== SCALL) MUST NOT be called in a mode > supervisor mode. + * + */ +#define portSAVE_CONTEXT_SCALL() \ +{ \ + extern volatile uint32_t ulCriticalNesting; \ + extern volatile void *volatile pxCurrentTCB; \ + \ + /* Warning: the stack layout after SCALL doesn't match the one after an interrupt. */ \ + /* If SR[M2:M0] == 001 */ \ + /* PC and SR are on the stack. */ \ + /* Else (other modes) */ \ + /* Nothing on the stack. */ \ + \ + /* WARNING NOTE: the else case cannot happen as it is strictly forbidden to call */ \ + /* vTaskDelay() and vTaskDelayUntil() OS functions (that result in a taskYield()) */ \ + /* in an interrupt|exception handler. */ \ + \ + __asm__ __volatile__ ( \ + /* in order to save R0-R7 */ \ + "sub sp, 6*4 \n\t"\ + /* Save R0..R7 */ \ + "stm --sp, r0-r7 \n\t"\ + \ + /* in order to save R8-R12 and LR */ \ + /* do not use SP if interrupts occurs, SP must be left at bottom of stack */ \ + "sub r7, sp,-16*4 \n\t"\ + /* Copy PC and SR in other places in the stack. */ \ + "ld.w r0, r7[-2*4] \n\t" /* Read SR */\ + "st.w r7[-8*4], r0 \n\t" /* Copy SR */\ + "ld.w r0, r7[-1*4] \n\t" /* Read PC */\ + "st.w r7[-7*4], r0 \n\t" /* Copy PC */\ + \ + /* Save R8..R12 and LR on the stack. */ \ + "stm --r7, r8-r12, lr \n\t"\ + \ + /* Arriving here we have the following stack organizations: */ \ + /* R8..R12, LR, PC, SR, R0..R7. */ \ + \ + /* Now we can finalize the save. */ \ + \ + /* Save ulCriticalNesting variable - R0 is overwritten */ \ + "mov r8, LO(%[ulCriticalNesting]) \n\t"\ + "orh r8, HI(%[ulCriticalNesting]) \n\t"\ + "ld.w r0, r8[0] \n\t"\ + "st.w --sp, r0" \ + : \ + : [ulCriticalNesting] "i" (&ulCriticalNesting) \ + ); \ + \ + /* Disable the its which may cause a context switch (i.e. cause a change of */ \ + /* pxCurrentTCB). */ \ + /* Basically, all accesses to the pxCurrentTCB structure should be put in a */ \ + /* critical section because it is a global structure. */ \ + portENTER_CRITICAL(); \ + \ + /* Store SP in the first member of the structure pointed to by pxCurrentTCB */ \ + __asm__ __volatile__ ( \ + "mov r8, LO(%[pxCurrentTCB]) \n\t"\ + "orh r8, HI(%[pxCurrentTCB]) \n\t"\ + "ld.w r0, r8[0] \n\t"\ + "st.w r0[0], sp" \ + : \ + : [pxCurrentTCB] "i" (&pxCurrentTCB) \ + ); \ +} + +/* + * portRESTORE_CONTEXT() for SupervisorCALL exception. + */ +#define portRESTORE_CONTEXT_SCALL() \ +{ \ + extern volatile uint32_t ulCriticalNesting; \ + extern volatile void *volatile pxCurrentTCB; \ + \ + /* Restore all registers */ \ + \ + /* Set SP to point to new stack */ \ + __asm__ __volatile__ ( \ + "mov r8, LO(%[pxCurrentTCB]) \n\t"\ + "orh r8, HI(%[pxCurrentTCB]) \n\t"\ + "ld.w r0, r8[0] \n\t"\ + "ld.w sp, r0[0]" \ + : \ + : [pxCurrentTCB] "i" (&pxCurrentTCB) \ + ); \ + \ + /* Leave pxCurrentTCB variable access critical section */ \ + portEXIT_CRITICAL(); \ + \ + __asm__ __volatile__ ( \ + /* Restore ulCriticalNesting variable */ \ + "ld.w r0, sp++ \n\t"\ + "mov r8, LO(%[ulCriticalNesting]) \n\t"\ + "orh r8, HI(%[ulCriticalNesting]) \n\t"\ + "st.w r8[0], r0 \n\t"\ + \ + /* skip PC and SR */ \ + /* do not use SP if interrupts occurs, SP must be left at bottom of stack */ \ + "sub r7, sp, -10*4 \n\t"\ + /* Restore r8-r12 and LR */ \ + "ldm r7++, r8-r12, lr \n\t"\ + \ + /* RETS will take care of the extra PC and SR restore. */ \ + /* So, we have to prepare the stack for this. */ \ + "ld.w r0, r7[-8*4] \n\t" /* Read SR */\ + "st.w r7[-2*4], r0 \n\t" /* Copy SR */\ + "ld.w r0, r7[-7*4] \n\t" /* Read PC */\ + "st.w r7[-1*4], r0 \n\t" /* Copy PC */\ + \ + /* Restore R0..R7 */ \ + "ldm sp++, r0-r7 \n\t"\ + \ + "sub sp, -6*4 \n\t"\ + \ + "rets" \ + : \ + : [ulCriticalNesting] "i" (&ulCriticalNesting) \ + ); \ +} + + +/* + * The ISR used depends on whether the cooperative or + * the preemptive scheduler is being used. + */ +#if configUSE_PREEMPTION == 0 + +/* + * ISR entry and exit macros. These are only required if a task switch + * is required from the ISR. + */ +#define portENTER_SWITCHING_ISR() \ +{ \ + /* Save R0..R7 */ \ + __asm__ __volatile__ ("stm --sp, r0-r7"); \ + \ + /* With the cooperative scheduler, as there is no context switch by interrupt, */ \ + /* there is also no context save. */ \ +} + +/* + * Input parameter: in R12, boolean. Perform a vTaskSwitchContext() if 1 + */ +#define portEXIT_SWITCHING_ISR() \ +{ \ + __asm__ __volatile__ ( \ + /* Restore R0..R7 */ \ + "ldm sp++, r0-r7 \n\t"\ + \ + /* With the cooperative scheduler, as there is no context switch by interrupt, */ \ + /* there is also no context restore. */ \ + "rete" \ + ); \ +} + +#else + +/* + * ISR entry and exit macros. These are only required if a task switch + * is required from the ISR. + */ +#define portENTER_SWITCHING_ISR() \ +{ \ + extern volatile uint32_t ulCriticalNesting; \ + extern volatile void *volatile pxCurrentTCB; \ + \ + /* When we come here */ \ + /* Registers R8..R12, LR, PC and SR had already been pushed to system stack */ \ + \ + __asm__ __volatile__ ( \ + /* Save R0..R7 */ \ + "stm --sp, r0-r7 \n\t"\ + \ + /* Save ulCriticalNesting variable - R0 is overwritten */ \ + "mov r8, LO(%[ulCriticalNesting]) \n\t"\ + "orh r8, HI(%[ulCriticalNesting]) \n\t"\ + "ld.w r0, r8[0] \n\t"\ + "st.w --sp, r0 \n\t"\ + \ + /* Check if INT0 or higher were being handled (case where the OS tick interrupted another */ \ + /* interrupt handler (which was of a higher priority level but decided to lower its priority */ \ + /* level and allow other lower interrupt level to occur). */ \ + /* In this case we don't want to do a task switch because we don't know what the stack */ \ + /* currently looks like (we don't know what the interrupted interrupt handler was doing). */ \ + /* Saving SP in pxCurrentTCB and then later restoring it (thinking restoring the task) */ \ + /* will just be restoring the interrupt handler, no way!!! */ \ + /* So, since we won't do a vTaskSwitchContext(), it's of no use to save SP. */ \ + "ld.w r0, sp[9*4] \n\t" /* Read SR in stack */\ + "bfextu r0, r0, 22, 3 \n\t" /* Extract the mode bits to R0. */\ + "cp.w r0, 1 \n\t" /* Compare the mode bits with supervisor mode(b'001) */\ + "brhi LABEL_ISR_SKIP_SAVE_CONTEXT_%[LINE] \n\t"\ + \ + /* Store SP in the first member of the structure pointed to by pxCurrentTCB */ \ + "mov r8, LO(%[pxCurrentTCB]) \n\t"\ + "orh r8, HI(%[pxCurrentTCB]) \n\t"\ + "ld.w r0, r8[0] \n\t"\ + "st.w r0[0], sp \n"\ + \ + "LABEL_ISR_SKIP_SAVE_CONTEXT_%[LINE]:" \ + : \ + : [ulCriticalNesting] "i" (&ulCriticalNesting), \ + [pxCurrentTCB] "i" (&pxCurrentTCB), \ + [LINE] "i" (__LINE__) \ + ); \ +} + +/* + * Input parameter: in R12, boolean. Perform a vTaskSwitchContext() if 1 + */ +#define portEXIT_SWITCHING_ISR() \ +{ \ + extern volatile uint32_t ulCriticalNesting; \ + extern volatile void *volatile pxCurrentTCB; \ + \ + __asm__ __volatile__ ( \ + /* Check if INT0 or higher were being handled (case where the OS tick interrupted another */ \ + /* interrupt handler (which was of a higher priority level but decided to lower its priority */ \ + /* level and allow other lower interrupt level to occur). */ \ + /* In this case it's of no use to switch context and restore a new SP because we purposedly */ \ + /* did not previously save SP in its TCB. */ \ + "ld.w r0, sp[9*4] \n\t" /* Read SR in stack */\ + "bfextu r0, r0, 22, 3 \n\t" /* Extract the mode bits to R0. */\ + "cp.w r0, 1 \n\t" /* Compare the mode bits with supervisor mode(b'001) */\ + "brhi LABEL_ISR_SKIP_RESTORE_CONTEXT_%[LINE] \n\t"\ + \ + /* If a switch is required then we just need to call */ \ + /* vTaskSwitchContext() as the context has already been */ \ + /* saved. */ \ + "cp.w r12, 1 \n\t" /* Check if Switch context is required. */\ + "brne LABEL_ISR_RESTORE_CONTEXT_%[LINE]" \ + : \ + : [LINE] "i" (__LINE__) \ + ); \ + \ + /* A critical section has to be used here because vTaskSwitchContext handles FreeRTOS linked lists. */ \ + portENTER_CRITICAL(); \ + vTaskSwitchContext(); \ + portEXIT_CRITICAL(); \ + \ + __asm__ __volatile__ ( \ + "LABEL_ISR_RESTORE_CONTEXT_%[LINE]: \n\t"\ + /* Restore the context of which ever task is now the highest */ \ + /* priority that is ready to run. */ \ + \ + /* Restore all registers */ \ + \ + /* Set SP to point to new stack */ \ + "mov r8, LO(%[pxCurrentTCB]) \n\t"\ + "orh r8, HI(%[pxCurrentTCB]) \n\t"\ + "ld.w r0, r8[0] \n\t"\ + "ld.w sp, r0[0] \n"\ + \ + "LABEL_ISR_SKIP_RESTORE_CONTEXT_%[LINE]: \n\t"\ + \ + /* Restore ulCriticalNesting variable */ \ + "ld.w r0, sp++ \n\t"\ + "mov r8, LO(%[ulCriticalNesting]) \n\t"\ + "orh r8, HI(%[ulCriticalNesting]) \n\t"\ + "st.w r8[0], r0 \n\t"\ + \ + /* Restore R0..R7 */ \ + "ldm sp++, r0-r7 \n\t"\ + \ + /* Now, the stack should be R8..R12, LR, PC and SR */ \ + "rete" \ + : \ + : [ulCriticalNesting] "i" (&ulCriticalNesting), \ + [pxCurrentTCB] "i" (&pxCurrentTCB), \ + [LINE] "i" (__LINE__) \ + ); \ +} + +#endif + + +#define portYIELD() {__asm__ __volatile__ ("scall");} + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/CORTUS_APS3/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/CORTUS_APS3/port.c new file mode 100644 index 0000000..12cb3e8 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/CORTUS_APS3/port.c @@ -0,0 +1,187 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* Standard includes. */ +#include + +/* Kernel includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Machine includes */ +#include +#include +/*-----------------------------------------------------------*/ + +/* The initial PSR has the Previous Interrupt Enabled (PIEN) flag set. */ +#define portINITIAL_PSR ( 0x00020000 ) + +/*-----------------------------------------------------------*/ + +/* + * Perform any hardware configuration necessary to generate the tick interrupt. + */ +static void prvSetupTimerInterrupt( void ); +/*-----------------------------------------------------------*/ + +StackType_t *pxPortInitialiseStack( StackType_t * pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Make space on the stack for the context - this leaves a couple of spaces + empty. */ + pxTopOfStack -= 20; + + /* Fill the registers with known values to assist debugging. */ + pxTopOfStack[ 16 ] = 0; + pxTopOfStack[ 15 ] = portINITIAL_PSR; + pxTopOfStack[ 14 ] = ( uint32_t ) pxCode; + pxTopOfStack[ 13 ] = 0x00000000UL; /* R15. */ + pxTopOfStack[ 12 ] = 0x00000000UL; /* R14. */ + pxTopOfStack[ 11 ] = 0x0d0d0d0dUL; + pxTopOfStack[ 10 ] = 0x0c0c0c0cUL; + pxTopOfStack[ 9 ] = 0x0b0b0b0bUL; + pxTopOfStack[ 8 ] = 0x0a0a0a0aUL; + pxTopOfStack[ 7 ] = 0x09090909UL; + pxTopOfStack[ 6 ] = 0x08080808UL; + pxTopOfStack[ 5 ] = 0x07070707UL; + pxTopOfStack[ 4 ] = 0x06060606UL; + pxTopOfStack[ 3 ] = 0x05050505UL; + pxTopOfStack[ 2 ] = 0x04040404UL; + pxTopOfStack[ 1 ] = 0x03030303UL; + pxTopOfStack[ 0 ] = ( uint32_t ) pvParameters; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* Set-up the timer interrupt. */ + prvSetupTimerInterrupt(); + + /* Integrated Interrupt Controller: Enable all interrupts. */ + ic->ien = 1; + + /* Restore callee saved registers. */ + portRESTORE_CONTEXT(); + + /* Should not get here. */ + return 0; +} +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt( void ) +{ + /* Enable timer interrupts */ + counter1->reload = ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) - 1; + counter1->value = counter1->reload; + counter1->mask = 1; + + /* Set the IRQ Handler priority and enable it. */ + irq[ IRQ_COUNTER1 ].ien = 1; +} +/*-----------------------------------------------------------*/ + +/* Trap 31 handler. */ +void interrupt31_handler( void ) __attribute__((naked)); +void interrupt31_handler( void ) +{ + portSAVE_CONTEXT(); + __asm volatile ( "call vTaskSwitchContext" ); + portRESTORE_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +static void prvProcessTick( void ) __attribute__((noinline)); +static void prvProcessTick( void ) +{ + if( xTaskIncrementTick() != pdFALSE ) + { + vTaskSwitchContext(); + } + + /* Clear the Tick Interrupt. */ + counter1->expired = 0; +} +/*-----------------------------------------------------------*/ + +/* Timer 1 interrupt handler, used for tick interrupt. */ +void interrupt7_handler( void ) __attribute__((naked)); +void interrupt7_handler( void ) +{ + portSAVE_CONTEXT(); + prvProcessTick(); + portRESTORE_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Nothing to do. Unlikely to want to end. */ +} +/*-----------------------------------------------------------*/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/CORTUS_APS3/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/CORTUS_APS3/portmacro.h new file mode 100644 index 0000000..bcfcbbd --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/CORTUS_APS3/portmacro.h @@ -0,0 +1,194 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 4 +#define portNOP() __asm__ volatile ( "mov r0, r0" ) +#define portCRITICAL_NESTING_IN_TCB 1 +#define portIRQ_TRAP_YIELD 31 +/*-----------------------------------------------------------*/ + +/* Task utilities. */ + +extern void vPortYield( void ); + +/*---------------------------------------------------------------------------*/ + +#define portYIELD() asm __volatile__( " trap #%0 "::"i"(portIRQ_TRAP_YIELD):"memory") +/*---------------------------------------------------------------------------*/ + +extern void vTaskEnterCritical( void ); +extern void vTaskExitCritical( void ); +#define portENTER_CRITICAL() vTaskEnterCritical() +#define portEXIT_CRITICAL() vTaskExitCritical() +/*---------------------------------------------------------------------------*/ + +/* Critical section management. */ +#define portDISABLE_INTERRUPTS() cpu_int_disable() +#define portENABLE_INTERRUPTS() cpu_int_enable() + +/*---------------------------------------------------------------------------*/ + +#define portYIELD_FROM_ISR( xHigherPriorityTaskWoken ) if( xHigherPriorityTaskWoken != pdFALSE ) vTaskSwitchContext() + +/*---------------------------------------------------------------------------*/ + +#define portSAVE_CONTEXT() \ + asm __volatile__ \ + ( \ + "sub r1, #68 \n" /* Make space on the stack for the context. */ \ + "std r2, [r1] + 0 \n" \ + "stq r4, [r1] + 8 \n" \ + "stq r8, [r1] + 24 \n" \ + "stq r12, [r1] + 40 \n" \ + "mov r6, rtt \n" \ + "mov r7, psr \n" \ + "std r6, [r1] + 56 \n" \ + "movhi r2, #16384 \n" /* Set the pointer to the IC. */ \ + "ldub r3, [r2] + 2 \n" /* Load the current interrupt mask. */ \ + "st r3, [r1]+ 64 \n" /* Store the interrupt mask on the stack. */ \ + "ld r2, [r0]+short(pxCurrentTCB) \n" /* Load the pointer to the TCB. */ \ + "st r1, [r2] \n" /* Save the stack pointer into the TCB. */ \ + "mov r14, r1 \n" /* Compiler expects r14 to be set to the function stack. */ \ + ); +/*---------------------------------------------------------------------------*/ + +#define portRESTORE_CONTEXT() \ + asm __volatile__( \ + "ld r2, [r0]+short(pxCurrentTCB) \n" /* Load the TCB to find the stack pointer and context. */ \ + "ld r1, [r2] \n" \ + "movhi r2, #16384 \n" /* Set the pointer to the IC. */ \ + "ld r3, [r1] + 64 \n" /* Load the previous interrupt mask. */ \ + "stb r3, [r2] + 2 \n" /* Set the current interrupt mask to be the previous. */ \ + "ldd r6, [r1] + 56 \n" /* Restore context. */ \ + "mov rtt, r6 \n" \ + "mov psr, r7 \n" \ + "ldd r2, [r1] + 0 \n" \ + "ldq r4, [r1] + 8 \n" \ + "ldq r8, [r1] + 24 \n" \ + "ldq r12, [r1] + 40 \n" \ + "add r1, #68 \n" \ + "rti \n" \ + ); + +/*---------------------------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*---------------------------------------------------------------------------*/ + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ColdFire_V2/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ColdFire_V2/port.c new file mode 100644 index 0000000..feb5b9d --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ColdFire_V2/port.c @@ -0,0 +1,176 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* Kernel includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#define portINITIAL_FORMAT_VECTOR ( ( StackType_t ) 0x4000 ) + +/* Supervisor mode set. */ +#define portINITIAL_STATUS_REGISTER ( ( StackType_t ) 0x2000) + +/* Used to keep track of the number of nested calls to taskENTER_CRITICAL(). This +will be set to 0 prior to the first task being started. */ +static uint32_t ulCriticalNesting = 0x9999UL; + +/*-----------------------------------------------------------*/ + +StackType_t *pxPortInitialiseStack( StackType_t * pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + *pxTopOfStack = ( StackType_t ) pvParameters; + pxTopOfStack--; + + *pxTopOfStack = (StackType_t) 0xDEADBEEF; + pxTopOfStack--; + + /* Exception stack frame starts with the return address. */ + *pxTopOfStack = ( StackType_t ) pxCode; + pxTopOfStack--; + + *pxTopOfStack = ( portINITIAL_FORMAT_VECTOR << 16UL ) | ( portINITIAL_STATUS_REGISTER ); + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) 0x0; /*FP*/ + pxTopOfStack -= 14; /* A5 to D0. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void vPortStartFirstTask( void ); + + ulCriticalNesting = 0UL; + + /* Configure the interrupts used by this port. */ + vApplicationSetupInterrupts(); + + /* Start the first task executing. */ + vPortStartFirstTask(); + + return pdFALSE; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented as there is nothing to return to. */ +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + if( ulCriticalNesting == 0UL ) + { + /* Guard against context switches being pended simultaneously with a + critical section being entered. */ + do + { + portDISABLE_INTERRUPTS(); + if( MCF_INTC0_INTFRCL == 0UL ) + { + break; + } + + portENABLE_INTERRUPTS(); + + } while( 1 ); + } + ulCriticalNesting++; +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + ulCriticalNesting--; + if( ulCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void vPortYieldHandler( void ) +{ +uint32_t ulSavedInterruptMask; + + ulSavedInterruptMask = portSET_INTERRUPT_MASK_FROM_ISR(); + /* Note this will clear all forced interrupts - this is done for speed. */ + MCF_INTC0_INTFRCL = 0; + vTaskSwitchContext(); + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulSavedInterruptMask ); +} + + + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ColdFire_V2/portasm.S b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ColdFire_V2/portasm.S new file mode 100644 index 0000000..b01c183 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ColdFire_V2/portasm.S @@ -0,0 +1,162 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* + * Purpose: Lowest level routines for all ColdFire processors. + * + * Notes: + * + * ulPortSetIPL() and mcf5xxx_wr_cacr() copied with permission from FreeScale + * supplied source files. + */ + + .global ulPortSetIPL + .global mcf5xxx_wr_cacr + .global __cs3_isr_interrupt_80 + .global vPortStartFirstTask + + .text + +.macro portSAVE_CONTEXT + + lea.l (-60, %sp), %sp + movem.l %d0-%fp, (%sp) + move.l pxCurrentTCB, %a0 + move.l %sp, (%a0) + + .endm + +.macro portRESTORE_CONTEXT + + move.l pxCurrentTCB, %a0 + move.l (%a0), %sp + movem.l (%sp), %d0-%fp + lea.l %sp@(60), %sp + rte + + .endm + +/********************************************************************/ +/* + * This routines changes the IPL to the value passed into the routine. + * It also returns the old IPL value back. + * Calling convention from C: + * old_ipl = asm_set_ipl(new_ipl); + * For the Diab Data C compiler, it passes return value thru D0. + * Note that only the least significant three bits of the passed + * value are used. + */ + +ulPortSetIPL: + link A6,#-8 + movem.l D6-D7,(SP) + + move.w SR,D7 /* current sr */ + + move.l D7,D0 /* prepare return value */ + andi.l #0x0700,D0 /* mask out IPL */ + lsr.l #8,D0 /* IPL */ + + move.l 8(A6),D6 /* get argument */ + andi.l #0x07,D6 /* least significant three bits */ + lsl.l #8,D6 /* move over to make mask */ + + andi.l #0x0000F8FF,D7 /* zero out current IPL */ + or.l D6,D7 /* place new IPL in sr */ + move.w D7,SR + + movem.l (SP),D6-D7 + lea 8(SP),SP + unlk A6 + rts +/********************************************************************/ + +mcf5xxx_wr_cacr: + move.l 4(sp),d0 + .long 0x4e7b0002 /* movec d0,cacr */ + nop + rts + +/********************************************************************/ + +/* Yield interrupt. */ +__cs3_isr_interrupt_80: + portSAVE_CONTEXT + jsr vPortYieldHandler + portRESTORE_CONTEXT + +/********************************************************************/ + + +vPortStartFirstTask: + portRESTORE_CONTEXT + + .end + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ColdFire_V2/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ColdFire_V2/portmacro.h new file mode 100644 index 0000000..1e701b9 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/ColdFire_V2/portmacro.h @@ -0,0 +1,156 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 4 +#define portSTACK_GROWTH -1 +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +/*-----------------------------------------------------------*/ +uint32_t ulPortSetIPL( uint32_t ); +#define portDISABLE_INTERRUPTS() ulPortSetIPL( configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#define portENABLE_INTERRUPTS() ulPortSetIPL( 0 ) + + +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() + +extern UBaseType_t uxPortSetInterruptMaskFromISR( void ); +extern void vPortClearInterruptMaskFromISR( UBaseType_t ); +#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortSetIPL( configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedStatusRegister ) ulPortSetIPL( uxSavedStatusRegister ) + +/*-----------------------------------------------------------*/ + +/* Task utilities. */ + +#define portNOP() asm volatile ( "nop" ) + +/* Note this will overwrite all other bits in the force register, it is done this way for speed. */ +#define portYIELD() MCF_INTC0_INTFRCL = ( 1UL << configYIELD_INTERRUPT_VECTOR ); portNOP(); portNOP() + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) __attribute__((noreturn)) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*-----------------------------------------------------------*/ + +#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired != pdFALSE ) \ + { \ + portYIELD(); \ + } + + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/H8S2329/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/H8S2329/port.c new file mode 100644 index 0000000..4bce27d --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/H8S2329/port.c @@ -0,0 +1,345 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the H8S port. + *----------------------------------------------------------*/ + + +/*-----------------------------------------------------------*/ + +/* When the task starts interrupts should be enabled. */ +#define portINITIAL_CCR ( ( StackType_t ) 0x00 ) + +/* Hardware specific constants used to generate the RTOS tick from the TPU. */ +#define portCLEAR_ON_TGRA_COMPARE_MATCH ( ( uint8_t ) 0x20 ) +#define portCLOCK_DIV_64 ( ( uint8_t ) 0x03 ) +#define portCLOCK_DIV ( ( uint32_t ) 64 ) +#define portTGRA_INTERRUPT_ENABLE ( ( uint8_t ) 0x01 ) +#define portTIMER_CHANNEL ( ( uint8_t ) 0x02 ) +#define portMSTP13 ( ( uint16_t ) 0x2000 ) + +/* + * Setup TPU channel one for the RTOS tick at the requested frequency. + */ +static void prvSetupTimerInterrupt( void ); + +/* + * The ISR used by portYIELD(). This is installed as a trap handler. + */ +void vPortYield( void ) __attribute__ ( ( saveall, interrupt_handler ) ); + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +uint32_t ulValue; + + /* This requires an even address. */ + ulValue = ( uint32_t ) pxTopOfStack; + if( ulValue & 1UL ) + { + pxTopOfStack = pxTopOfStack - 1; + } + + /* Place a few bytes of known values on the bottom of the stack. + This is just useful for debugging. */ + pxTopOfStack--; + *pxTopOfStack = 0xaa; + pxTopOfStack--; + *pxTopOfStack = 0xbb; + pxTopOfStack--; + *pxTopOfStack = 0xcc; + pxTopOfStack--; + *pxTopOfStack = 0xdd; + + /* The initial stack mimics an interrupt stack. First there is the program + counter (24 bits). */ + ulValue = ( uint32_t ) pxCode; + + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) ( ulValue & 0xff ); + pxTopOfStack--; + ulValue >>= 8UL; + *pxTopOfStack = ( StackType_t ) ( ulValue & 0xff ); + pxTopOfStack--; + ulValue >>= 8UL; + *pxTopOfStack = ( StackType_t ) ( ulValue & 0xff ); + + /* Followed by the CCR. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_CCR; + + /* Next all the general purpose registers - with the parameters being passed + in ER0. The parameter order must match that used by the compiler when the + "saveall" function attribute is used. */ + + /* ER6 */ + pxTopOfStack--; + *pxTopOfStack = 0x66; + pxTopOfStack--; + *pxTopOfStack = 0x66; + pxTopOfStack--; + *pxTopOfStack = 0x66; + pxTopOfStack--; + *pxTopOfStack = 0x66; + + /* ER0 */ + ulValue = ( uint32_t ) pvParameters; + + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) ( ulValue & 0xff ); + pxTopOfStack--; + ulValue >>= 8UL; + *pxTopOfStack = ( StackType_t ) ( ulValue & 0xff ); + pxTopOfStack--; + ulValue >>= 8UL; + *pxTopOfStack = ( StackType_t ) ( ulValue & 0xff ); + pxTopOfStack--; + ulValue >>= 8UL; + *pxTopOfStack = ( StackType_t ) ( ulValue & 0xff ); + + /* ER1 */ + pxTopOfStack--; + *pxTopOfStack = 0x11; + pxTopOfStack--; + *pxTopOfStack = 0x11; + pxTopOfStack--; + *pxTopOfStack = 0x11; + pxTopOfStack--; + *pxTopOfStack = 0x11; + + /* ER2 */ + pxTopOfStack--; + *pxTopOfStack = 0x22; + pxTopOfStack--; + *pxTopOfStack = 0x22; + pxTopOfStack--; + *pxTopOfStack = 0x22; + pxTopOfStack--; + *pxTopOfStack = 0x22; + + /* ER3 */ + pxTopOfStack--; + *pxTopOfStack = 0x33; + pxTopOfStack--; + *pxTopOfStack = 0x33; + pxTopOfStack--; + *pxTopOfStack = 0x33; + pxTopOfStack--; + *pxTopOfStack = 0x33; + + /* ER4 */ + pxTopOfStack--; + *pxTopOfStack = 0x44; + pxTopOfStack--; + *pxTopOfStack = 0x44; + pxTopOfStack--; + *pxTopOfStack = 0x44; + pxTopOfStack--; + *pxTopOfStack = 0x44; + + /* ER5 */ + pxTopOfStack--; + *pxTopOfStack = 0x55; + pxTopOfStack--; + *pxTopOfStack = 0x55; + pxTopOfStack--; + *pxTopOfStack = 0x55; + pxTopOfStack--; + *pxTopOfStack = 0x55; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void * pxCurrentTCB; + + /* Setup the hardware to generate the tick. */ + prvSetupTimerInterrupt(); + + /* Restore the context of the first task that is going to run. This + mirrors the function epilogue code generated by the compiler when the + "saveall" function attribute is used. */ + asm volatile ( + "MOV.L @_pxCurrentTCB, ER6 \n\t" + "MOV.L @ER6, ER7 \n\t" + "LDM.L @SP+, (ER4-ER5) \n\t" + "LDM.L @SP+, (ER0-ER3) \n\t" + "MOV.L @ER7+, ER6 \n\t" + "RTE \n\t" + ); + + ( void ) pxCurrentTCB; + + /* Should not get here. */ + return pdTRUE; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the h8 port will get stopped. */ +} +/*-----------------------------------------------------------*/ + +/* + * Manual context switch. This is a trap handler. The "saveall" function + * attribute is used so the context is saved by the compiler prologue. All + * we have to do is save the stack pointer. + */ +void vPortYield( void ) +{ + portSAVE_STACK_POINTER(); + vTaskSwitchContext(); + portRESTORE_STACK_POINTER(); +} +/*-----------------------------------------------------------*/ + +/* + * The interrupt handler installed for the RTOS tick depends on whether the + * preemptive or cooperative scheduler is being used. + */ +#if( configUSE_PREEMPTION == 1 ) + + /* + * The preemptive scheduler is used so the ISR calls vTaskSwitchContext(). + * The function prologue saves the context so all we have to do is save + * the stack pointer. + */ + void vTickISR( void ) __attribute__ ( ( saveall, interrupt_handler ) ); + void vTickISR( void ) + { + portSAVE_STACK_POINTER(); + + if( xTaskIncrementTick() != pdFALSE ) + { + vTaskSwitchContext(); + } + + /* Clear the interrupt. */ + TSR1 &= ~0x01; + + portRESTORE_STACK_POINTER(); + } + +#else + + /* + * The cooperative scheduler is being used so all we have to do is + * periodically increment the tick. This can just be a normal ISR and + * the "saveall" attribute is not required. + */ + void vTickISR( void ) __attribute__ ( ( interrupt_handler ) ); + void vTickISR( void ) + { + xTaskIncrementTick(); + + /* Clear the interrupt. */ + TSR1 &= ~0x01; + } + +#endif +/*-----------------------------------------------------------*/ + +/* + * Setup timer 1 compare match to generate a tick interrupt. + */ +static void prvSetupTimerInterrupt( void ) +{ +const uint32_t ulCompareMatch = ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) / portCLOCK_DIV; + + /* Turn the module on. */ + MSTPCR &= ~portMSTP13; + + /* Configure timer 1. */ + TCR1 = portCLEAR_ON_TGRA_COMPARE_MATCH | portCLOCK_DIV_64; + + /* Configure the compare match value for a tick of configTICK_RATE_HZ. */ + TGR1A = ulCompareMatch; + + /* Start the timer and enable the interrupt - we can do this here as + interrupts are globally disabled when this function is called. */ + TIER1 |= portTGRA_INTERRUPT_ENABLE; + TSTR |= portTIMER_CHANNEL; +} +/*-----------------------------------------------------------*/ + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/H8S2329/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/H8S2329/portmacro.h new file mode 100644 index 0000000..3ab76a3 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/H8S2329/portmacro.h @@ -0,0 +1,180 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint8_t +#define portBASE_TYPE char + +typedef portSTACK_TYPE StackType_t; +typedef signed char BaseType_t; +typedef unsigned char UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 2 +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portYIELD() asm volatile( "TRAPA #0" ) +#define portNOP() asm volatile( "NOP" ) +/*-----------------------------------------------------------*/ + +/* Critical section handling. */ +#define portENABLE_INTERRUPTS() asm volatile( "ANDC #0x7F, CCR" ); +#define portDISABLE_INTERRUPTS() asm volatile( "ORC #0x80, CCR" ); + +/* Push the CCR then disable interrupts. */ +#define portENTER_CRITICAL() asm volatile( "STC CCR, @-ER7" ); \ + portDISABLE_INTERRUPTS(); + +/* Pop the CCR to set the interrupt masking back to its previous state. */ +#define portEXIT_CRITICAL() asm volatile( "LDC @ER7+, CCR" ); +/*-----------------------------------------------------------*/ + +/* Task utilities. */ + +/* Context switch macros. These macros are very simple as the context +is saved simply by selecting the saveall attribute of the context switch +interrupt service routines. These macros save and restore the stack +pointer to the TCB. */ + +#define portSAVE_STACK_POINTER() \ +extern void* pxCurrentTCB; \ + \ + asm volatile( \ + "MOV.L @_pxCurrentTCB, ER5 \n\t" \ + "MOV.L ER7, @ER5 \n\t" \ + ); \ + ( void ) pxCurrentTCB; + + +#define portRESTORE_STACK_POINTER() \ +extern void* pxCurrentTCB; \ + \ + asm volatile( \ + "MOV.L @_pxCurrentTCB, ER5 \n\t" \ + "MOV.L @ER5, ER7 \n\t" \ + ); \ + ( void ) pxCurrentTCB; + +/*-----------------------------------------------------------*/ + +/* Macros to allow a context switch from within an application ISR. */ + +#define portENTER_SWITCHING_ISR() portSAVE_STACK_POINTER(); { + +#define portEXIT_SWITCHING_ISR( x ) \ + if( x ) \ + { \ + extern void vTaskSwitchContext( void ); \ + vTaskSwitchContext(); \ + } \ + } portRESTORE_STACK_POINTER(); +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/HCS12/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/HCS12/port.c new file mode 100644 index 0000000..0fcac7f --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/HCS12/port.c @@ -0,0 +1,279 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* GCC/HCS12 port by Jefferson L Smith, 2005 */ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Port includes */ +#include + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the HCS12 port. + *----------------------------------------------------------*/ + + +/* + * Configure a timer to generate the RTOS tick at the frequency specified + * within FreeRTOSConfig.h. + */ +static void prvSetupTimerInterrupt( void ); + +/* NOTE: Interrupt service routines must be in non-banked memory - as does the +scheduler startup function. */ +#define ATTR_NEAR __attribute__((near)) + +/* Manual context switch function. This is the SWI ISR. */ +// __attribute__((interrupt)) +void ATTR_NEAR vPortYield( void ); + +/* Tick context switch function. This is the timer ISR. */ +// __attribute__((interrupt)) +void ATTR_NEAR vPortTickInterrupt( void ); + +/* Function in non-banked memory which actually switches to first task. */ +BaseType_t ATTR_NEAR xStartSchedulerNear( void ); + +/* Calls to portENTER_CRITICAL() can be nested. When they are nested the +critical section should not be left (i.e. interrupts should not be re-enabled) +until the nesting depth reaches 0. This variable simply tracks the nesting +depth. Each task maintains it's own critical nesting depth variable so +uxCriticalNesting is saved and restored from the task stack during a context +switch. */ +volatile UBaseType_t uxCriticalNesting = 0x80; // un-initialized + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + + + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. In this case the stack as + expected by the HCS12 RTI instruction. */ + + + /* The address of the task function is placed in the stack byte at a time. */ + *pxTopOfStack = ( StackType_t ) *( ((StackType_t *) (&pxCode) ) + 1 ); + *--pxTopOfStack = ( StackType_t ) *( ((StackType_t *) (&pxCode) ) + 0 ); + + /* Next are all the registers that form part of the task context. */ + + /* Y register */ + *--pxTopOfStack = ( StackType_t ) 0xff; + *--pxTopOfStack = ( StackType_t ) 0xee; + + /* X register */ + *--pxTopOfStack = ( StackType_t ) 0xdd; + *--pxTopOfStack = ( StackType_t ) 0xcc; + + /* A register contains parameter high byte. */ + *--pxTopOfStack = ( StackType_t ) *( ((StackType_t *) (&pvParameters) ) + 0 ); + + /* B register contains parameter low byte. */ + *--pxTopOfStack = ( StackType_t ) *( ((StackType_t *) (&pvParameters) ) + 1 ); + + /* CCR: Note that when the task starts interrupts will be enabled since + "I" bit of CCR is cleared */ + *--pxTopOfStack = ( StackType_t ) 0x80; // keeps Stop disabled (MCU default) + + /* tmp softregs used by GCC. Values right now don't matter. */ + __asm("\n\ + movw _.frame, 2,-%0 \n\ + movw _.tmp, 2,-%0 \n\ + movw _.z, 2,-%0 \n\ + movw _.xy, 2,-%0 \n\ + ;movw _.d2, 2,-%0 \n\ + ;movw _.d1, 2,-%0 \n\ + ": "=A"(pxTopOfStack) : "0"(pxTopOfStack) ); + + #ifdef BANKED_MODEL + /* The page of the task. */ + *--pxTopOfStack = 0x30; // can only directly start in PPAGE 0x30 + #endif + + /* The critical nesting depth is initialised with 0 (meaning not in + a critical section). */ + *--pxTopOfStack = ( StackType_t ) 0x00; + + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the HCS12 port will get stopped. */ +} +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt( void ) +{ + /* Enable hardware RTI timer */ + /* Ignores configTICK_RATE_HZ */ + RTICTL = 0x50; // 16 MHz xtal: 976.56 Hz, 1024mS + CRGINT |= 0x80; // RTIE +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* xPortStartScheduler() does not start the scheduler directly because + the header file containing the xPortStartScheduler() prototype is part + of the common kernel code, and therefore cannot use the CODE_SEG pragma. + Instead it simply calls the locally defined xNearStartScheduler() - + which does use the CODE_SEG pragma. */ + + int16_t register d; + __asm ("jmp xStartSchedulerNear ; will never return": "=d"(d)); + return d; +} +/*-----------------------------------------------------------*/ + +BaseType_t xStartSchedulerNear( void ) +{ + /* Configure the timer that will generate the RTOS tick. Interrupts are + disabled when this function is called. */ + prvSetupTimerInterrupt(); + + /* Restore the context of the first task. */ + portRESTORE_CONTEXT(); + + portISR_TAIL(); + + /* Should not get here! */ + return pdFALSE; +} +/*-----------------------------------------------------------*/ + +/* + * Context switch functions. These are interrupt service routines. + */ + +/* + * Manual context switch forced by calling portYIELD(). This is the SWI + * handler. + */ +void vPortYield( void ) +{ + portISR_HEAD(); + /* NOTE: This is the trap routine (swi) although not defined as a trap. + It will fill the stack the same way as an ISR in order to mix preemtion + and cooperative yield. */ + + portSAVE_CONTEXT(); + vTaskSwitchContext(); + portRESTORE_CONTEXT(); + + portISR_TAIL(); +} +/*-----------------------------------------------------------*/ + +/* + * RTOS tick interrupt service routine. If the cooperative scheduler is + * being used then this simply increments the tick count. If the + * preemptive scheduler is being used a context switch can occur. + */ +void vPortTickInterrupt( void ) +{ + portISR_HEAD(); + + /* Clear tick timer flag */ + CRGFLG = 0x80; + + #if configUSE_PREEMPTION == 1 + { + /* A context switch might happen so save the context. */ + portSAVE_CONTEXT(); + + /* Increment the tick ... */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* A context switch is necessary. */ + vTaskSwitchContext(); + } + + /* Restore the context of a task - which may be a different task + to that interrupted. */ + portRESTORE_CONTEXT(); + } + #else + { + xTaskIncrementTick(); + } + #endif + + portISR_TAIL(); +} + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/HCS12/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/HCS12/portmacro.h new file mode 100644 index 0000000..6607981 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/HCS12/portmacro.h @@ -0,0 +1,288 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint8_t +#define portBASE_TYPE char + +typedef portSTACK_TYPE StackType_t; +typedef signed char BaseType_t; +typedef unsigned char UBaseType_t; + + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 1 +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portYIELD() __asm( "swi" ); +/*-----------------------------------------------------------*/ + +/* Critical section handling. */ +#define portENABLE_INTERRUPTS() __asm( "cli" ) +#define portDISABLE_INTERRUPTS() __asm( "sei" ) + +/* + * Disable interrupts before incrementing the count of critical section nesting. + * The nesting count is maintained so we know when interrupts should be + * re-enabled. Once interrupts are disabled the nesting count can be accessed + * directly. Each task maintains its own nesting count. + */ +#define portENTER_CRITICAL() \ +{ \ + extern volatile UBaseType_t uxCriticalNesting; \ + \ + portDISABLE_INTERRUPTS(); \ + uxCriticalNesting++; \ +} + +/* + * Interrupts are disabled so we can access the nesting count directly. If the + * nesting is found to be 0 (no nesting) then we are leaving the critical + * section and interrupts can be re-enabled. + */ +#define portEXIT_CRITICAL() \ +{ \ + extern volatile UBaseType_t uxCriticalNesting; \ + \ + uxCriticalNesting--; \ + if( uxCriticalNesting == 0 ) \ + { \ + portENABLE_INTERRUPTS(); \ + } \ +} +/*-----------------------------------------------------------*/ + +/* Task utilities. */ + +/* + * These macros are very simple as the processor automatically saves and + * restores its registers as interrupts are entered and exited. In + * addition to the (automatically stacked) registers we also stack the + * critical nesting count. Each task maintains its own critical nesting + * count as it is legitimate for a task to yield from within a critical + * section. If the banked memory model is being used then the PPAGE + * register is also stored as part of the tasks context. + */ + +#ifdef BANKED_MODEL + /* + * Load the stack pointer for the task, then pull the critical nesting + * count and PPAGE register from the stack. The remains of the + * context are restored by the RTI instruction. + */ + #define portRESTORE_CONTEXT() \ + { \ + __asm( " \n\ + .globl pxCurrentTCB ; void * \n\ + .globl uxCriticalNesting ; char \n\ + \n\ + ldx pxCurrentTCB \n\ + lds 0,x ; Stack \n\ + \n\ + movb 1,sp+,uxCriticalNesting \n\ + movb 1,sp+,0x30 ; PPAGE \n\ + " ); \ + } + + /* + * By the time this macro is called the processor has already stacked the + * registers. Simply stack the nesting count and PPAGE value, then save + * the task stack pointer. + */ + #define portSAVE_CONTEXT() \ + { \ + __asm( " \n\ + .globl pxCurrentTCB ; void * \n\ + .globl uxCriticalNesting ; char \n\ + \n\ + movb 0x30, 1,-sp ; PPAGE \n\ + movb uxCriticalNesting, 1,-sp \n\ + \n\ + ldx pxCurrentTCB \n\ + sts 0,x ; Stack \n\ + " ); \ + } +#else + + /* + * These macros are as per the BANKED versions above, but without saving + * and restoring the PPAGE register. + */ + + #define portRESTORE_CONTEXT() \ + { \ + __asm( " \n\ + .globl pxCurrentTCB ; void * \n\ + .globl uxCriticalNesting ; char \n\ + \n\ + ldx pxCurrentTCB \n\ + lds 0,x ; Stack \n\ + \n\ + movb 1,sp+,uxCriticalNesting \n\ + " ); \ + } + + #define portSAVE_CONTEXT() \ + { \ + __asm( " \n\ + .globl pxCurrentTCB ; void * \n\ + .globl uxCriticalNesting ; char \n\ + \n\ + movb uxCriticalNesting, 1,-sp \n\ + \n\ + ldx pxCurrentTCB \n\ + sts 0,x ; Stack \n\ + " ); \ + } +#endif + +/* + * Utility macros to save/restore correct software registers for GCC. This is + * useful when GCC does not generate appropriate ISR head/tail code. + */ +#define portISR_HEAD() \ +{ \ + __asm(" \n\ + movw _.frame, 2,-sp \n\ + movw _.tmp, 2,-sp \n\ + movw _.z, 2,-sp \n\ + movw _.xy, 2,-sp \n\ + ;movw _.d2, 2,-sp \n\ + ;movw _.d1, 2,-sp \n\ + "); \ +} + +#define portISR_TAIL() \ +{ \ + __asm(" \n\ + movw 2,sp+, _.xy \n\ + movw 2,sp+, _.z \n\ + movw 2,sp+, _.tmp \n\ + movw 2,sp+, _.frame \n\ + ;movw 2,sp+, _.d1 \n\ + ;movw 2,sp+, _.d2 \n\ + rti \n\ + "); \ +} + +/* + * Utility macro to call macros above in correct order in order to perform a + * task switch from within a standard ISR. This macro can only be used if + * the ISR does not use any local (stack) variables. If the ISR uses stack + * variables portYIELD() should be used in it's place. + */ + +#define portTASK_SWITCH_FROM_ISR() \ + portSAVE_CONTEXT(); \ + vTaskSwitchContext(); \ + portRESTORE_CONTEXT(); + + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/IA32_flat/ISR_Support.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/IA32_flat/ISR_Support.h new file mode 100644 index 0000000..701b6c0 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/IA32_flat/ISR_Support.h @@ -0,0 +1,169 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + .extern ulTopOfSystemStack + .extern ulInterruptNesting + +/*-----------------------------------------------------------*/ + +.macro portFREERTOS_INTERRUPT_ENTRY + + /* Save general purpose registers. */ + pusha + + /* If ulInterruptNesting is zero the rest of the task context will need + saving and a stack switch might be required. */ + movl ulInterruptNesting, %eax + test %eax, %eax + jne 2f + + /* Interrupts are not nested, so save the rest of the task context. */ + .if configSUPPORT_FPU == 1 + + /* If the task has a buffer allocated to save the FPU context then + save the FPU context now. */ + movl pucPortTaskFPUContextBuffer, %eax + test %eax, %eax + je 1f + fnsave ( %eax ) /* Save FLOP context into ucTempFPUBuffer array. */ + fwait + + 1: + /* Save the address of the FPU context, if any. */ + push pucPortTaskFPUContextBuffer + + .endif /* configSUPPORT_FPU */ + + /* Find the TCB. */ + movl pxCurrentTCB, %eax + + /* Stack location is first item in the TCB. */ + movl %esp, (%eax) + + /* Switch stacks. */ + movl ulTopOfSystemStack, %esp + movl %esp, %ebp + + 2: + /* Increment nesting count. */ + add $1, ulInterruptNesting + +.endm +/*-----------------------------------------------------------*/ + +.macro portINTERRUPT_EPILOGUE + + cli + sub $1, ulInterruptNesting + + /* If the nesting has unwound to zero. */ + movl ulInterruptNesting, %eax + test %eax, %eax + jne 2f + + /* If a yield was requested then select a new TCB now. */ + movl ulPortYieldPending, %eax + test %eax, %eax + je 1f + movl $0, ulPortYieldPending + call vTaskSwitchContext + + 1: + /* Stack location is first item in the TCB. */ + movl pxCurrentTCB, %eax + movl (%eax), %esp + + .if configSUPPORT_FPU == 1 + + /* Restore address of task's FPU context buffer. */ + pop pucPortTaskFPUContextBuffer + + /* If the task has a buffer allocated in which its FPU context is saved, + then restore it now. */ + movl pucPortTaskFPUContextBuffer, %eax + test %eax, %eax + je 1f + frstor ( %eax ) + 1: + .endif + + 2: + popa + +.endm +/*-----------------------------------------------------------*/ + +.macro portFREERTOS_INTERRUPT_EXIT + + portINTERRUPT_EPILOGUE + /* EOI. */ + movl $0x00, (0xFEE000B0) + iret + +.endm diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/IA32_flat/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/IA32_flat/port.c new file mode 100644 index 0000000..f374625 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/IA32_flat/port.c @@ -0,0 +1,728 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#if ( configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 ) + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +#if( configISR_STACK_SIZE < ( configMINIMAL_STACK_SIZE * 2 ) ) + #warning configISR_STACK_SIZE is probably too small! +#endif /* ( configISR_STACK_SIZE < configMINIMAL_STACK_SIZE * 2 ) */ + +#if( ( configMAX_API_CALL_INTERRUPT_PRIORITY > portMAX_PRIORITY ) || ( configMAX_API_CALL_INTERRUPT_PRIORITY < 2 ) ) + #error configMAX_API_CALL_INTERRUPT_PRIORITY must be between 2 and 15 +#endif + +#if( ( configSUPPORT_FPU == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 0 ) ) + #error configSUPPORT_DYNAMIC_ALLOCATION must be set to 1 to use this port with an FPU +#endif + +/* A critical section is exited when the critical section nesting count reaches +this value. */ +#define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) + +/* Tasks are not created with a floating point context, but can be given a +floating point context after they have been created. A variable is stored as +part of the tasks context that holds portNO_FLOATING_POINT_CONTEXT if the task +does not have an FPU context, or any other value if the task does have an FPU +context. */ +#define portNO_FLOATING_POINT_CONTEXT ( ( StackType_t ) 0 ) + +/* Only the IF bit is set so tasks start with interrupts enabled. */ +#define portINITIAL_EFLAGS ( 0x200UL ) + +/* Error interrupts are at the highest priority vectors. */ +#define portAPIC_LVT_ERROR_VECTOR ( 0xfe ) +#define portAPIC_SPURIOUS_INT_VECTOR ( 0xff ) + +/* EFLAGS bits. */ +#define portEFLAGS_IF ( 0x200UL ) + +/* FPU context size if FSAVE is used. */ +#define portFPU_CONTEXT_SIZE_BYTES 108 + +/* The expected size of each entry in the IDT. Used to check structure packing + is set correctly. */ +#define portEXPECTED_IDT_ENTRY_SIZE 8 + +/* Default flags setting for entries in the IDT. */ +#define portIDT_FLAGS ( 0x8E ) + +/* This is the lowest possible ISR vector available to application code. */ +#define portAPIC_MIN_ALLOWABLE_VECTOR ( 0x20 ) + +/* If configASSERT() is defined then the system stack is filled with this value +to allow for a crude stack overflow check. */ +#define portSTACK_WORD ( 0xecececec ) +/*-----------------------------------------------------------*/ + +/* + * Starts the first task executing. + */ +extern void vPortStartFirstTask( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/* + * Complete one descriptor in the IDT. + */ +static void prvSetInterruptGate( uint8_t ucNumber, ISR_Handler_t pxHandlerFunction, uint8_t ucFlags ); + +/* + * The default handler installed in each IDT position. + */ +extern void vPortCentralInterruptWrapper( void ); + +/* + * Handler for portYIELD(). + */ +extern void vPortYieldCall( void ); + +/* + * Configure the APIC to generate the RTOS tick. + */ +static void prvSetupTimerInterrupt( void ); + +/* + * Tick interrupt handler. + */ +extern void vPortTimerHandler( void ); + +/* + * Check an interrupt vector is not too high, too low, in use by FreeRTOS, or + * already in use by the application. + */ +static BaseType_t prvCheckValidityOfVectorNumber( uint32_t ulVectorNumber ); + +/*-----------------------------------------------------------*/ + +/* A variable is used to keep track of the critical section nesting. This +variable must be initialised to a non zero value to ensure interrupts don't +inadvertently become unmasked before the scheduler starts. It is set to zero +before the first task starts executing. */ +volatile uint32_t ulCriticalNesting = 9999UL; + +/* A structure used to map the various fields of an IDT entry into separate +structure members. */ +struct IDTEntry +{ + uint16_t usISRLow; /* Low 16 bits of handler address. */ + uint16_t usSegmentSelector; /* Flat model means this is not changed. */ + uint8_t ucZero; /* Must be set to zero. */ + uint8_t ucFlags; /* Flags for this entry. */ + uint16_t usISRHigh; /* High 16 bits of handler address. */ +} __attribute__( ( packed ) ); +typedef struct IDTEntry IDTEntry_t; + + +/* Use to pass the location of the IDT to the CPU. */ +struct IDTPointer +{ + uint16_t usTableLimit; + uint32_t ulTableBase; /* The address of the first entry in xInterruptDescriptorTable. */ +} __attribute__( ( __packed__ ) ); +typedef struct IDTPointer IDTPointer_t; + +/* The IDT itself. */ +static __attribute__ ( ( aligned( 32 ) ) ) IDTEntry_t xInterruptDescriptorTable[ portNUM_VECTORS ]; + +#if ( configUSE_COMMON_INTERRUPT_ENTRY_POINT == 1 ) + + /* A table in which application defined interrupt handlers are stored. These + are called by the central interrupt handler if a common interrupt entry + point it used. */ + static ISR_Handler_t xInterruptHandlerTable[ portNUM_VECTORS ] = { NULL }; + +#endif /* configUSE_COMMON_INTERRUPT_ENTRY_POINT */ + +#if ( configSUPPORT_FPU == 1 ) + + /* Saved as part of the task context. If pucPortTaskFPUContextBuffer is NULL + then the task does not have an FPU context. If pucPortTaskFPUContextBuffer is + not NULL then it points to a buffer into which the FPU context can be saved. */ + uint8_t *pucPortTaskFPUContextBuffer __attribute__((used)) = pdFALSE; + +#endif /* configSUPPORT_FPU */ + +/* The stack used by interrupt handlers. */ +static uint32_t ulSystemStack[ configISR_STACK_SIZE ] __attribute__((used)) = { 0 }; + +/* Don't use the very top of the system stack so the return address +appears as 0 if the debugger tries to unwind the stack. */ +volatile uint32_t ulTopOfSystemStack __attribute__((used)) = ( uint32_t ) &( ulSystemStack[ configISR_STACK_SIZE - 5 ] ); + +/* If a yield is requested from an interrupt or from a critical section then +the yield is not performed immediately, and ulPortYieldPending is set to pdTRUE +instead to indicate the yield should be performed at the end of the interrupt +when the critical section is exited. */ +volatile uint32_t ulPortYieldPending __attribute__((used)) = pdFALSE; + +/* Counts the interrupt nesting depth. Used to know when to switch to the +interrupt/system stack and when to save/restore a complete context. */ +volatile uint32_t ulInterruptNesting __attribute__((used)) = 0; + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +uint32_t ulCodeSegment; + + /* Setup the initial stack as expected by the portFREERTOS_INTERRUPT_EXIT macro. */ + + *pxTopOfStack = 0x00; + pxTopOfStack--; + *pxTopOfStack = 0x00; + pxTopOfStack--; + + /* Parameters first. */ + *pxTopOfStack = ( StackType_t ) pvParameters; + pxTopOfStack--; + + /* There is nothing to return to so assert if attempting to use the return + address. */ + *pxTopOfStack = ( StackType_t ) prvTaskExitError; + pxTopOfStack--; + + /* iret used to start the task pops up to here. */ + *pxTopOfStack = portINITIAL_EFLAGS; + pxTopOfStack--; + + /* CS */ + __asm volatile( "movl %%cs, %0" : "=r" ( ulCodeSegment ) ); + *pxTopOfStack = ulCodeSegment; + pxTopOfStack--; + + /* First instruction in the task. */ + *pxTopOfStack = ( StackType_t ) pxCode; + pxTopOfStack--; + + /* General purpose registers as expected by a POPA instruction. */ + *pxTopOfStack = 0xEA; + pxTopOfStack--; + + *pxTopOfStack = 0xEC; + pxTopOfStack--; + + *pxTopOfStack = 0xED1; /* EDX */ + pxTopOfStack--; + + *pxTopOfStack = 0xEB1; /* EBX */ + pxTopOfStack--; + + /* Hole for ESP. */ + pxTopOfStack--; + + *pxTopOfStack = 0x00; /* EBP */ + pxTopOfStack--; + + *pxTopOfStack = 0xE5; /* ESI */ + pxTopOfStack--; + + *pxTopOfStack = 0xeeeeeeee; /* EDI */ + + #if ( configSUPPORT_FPU == 1 ) + { + pxTopOfStack--; + + /* Buffer for FPU context, which is initialised to NULL as tasks are not + created with an FPU context. */ + *pxTopOfStack = portNO_FLOATING_POINT_CONTEXT; + } + #endif /* configSUPPORT_FPU */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvSetInterruptGate( uint8_t ucNumber, ISR_Handler_t pxHandlerFunction, uint8_t ucFlags ) +{ +uint16_t usCodeSegment; +uint32_t ulBase = ( uint32_t ) pxHandlerFunction; + + xInterruptDescriptorTable[ ucNumber ].usISRLow = ( uint16_t ) ( ulBase & USHRT_MAX ); + xInterruptDescriptorTable[ ucNumber ].usISRHigh = ( uint16_t ) ( ( ulBase >> 16UL ) & USHRT_MAX ); + + /* When the flat model is used the CS will never change. */ + __asm volatile( "mov %%cs, %0" : "=r" ( usCodeSegment ) ); + xInterruptDescriptorTable[ ucNumber ].usSegmentSelector = usCodeSegment; + xInterruptDescriptorTable[ ucNumber ].ucZero = 0; + xInterruptDescriptorTable[ ucNumber ].ucFlags = ucFlags; +} +/*-----------------------------------------------------------*/ + +void vPortSetupIDT( void ) +{ +uint32_t ulNum; +IDTPointer_t xIDT; + + #if ( configUSE_COMMON_INTERRUPT_ENTRY_POINT == 1 ) + { + for( ulNum = 0; ulNum < portNUM_VECTORS; ulNum++ ) + { + /* If a handler has not already been installed on this vector. */ + if( ( xInterruptDescriptorTable[ ulNum ].usISRLow == 0x00 ) && ( xInterruptDescriptorTable[ ulNum ].usISRHigh == 0x00 ) ) + { + prvSetInterruptGate( ( uint8_t ) ulNum, vPortCentralInterruptWrapper, portIDT_FLAGS ); + } + } + } + #endif /* configUSE_COMMON_INTERRUPT_ENTRY_POINT */ + + /* Set IDT address. */ + xIDT.ulTableBase = ( uint32_t ) xInterruptDescriptorTable; + xIDT.usTableLimit = sizeof( xInterruptDescriptorTable ) - 1; + + /* Set IDT in CPU. */ + __asm volatile( "lidt %0" :: "m" (xIDT) ); +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT( ulCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + for( ;; ); +} +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt( void ) +{ +extern void vPortAPICErrorHandlerWrapper( void ); +extern void vPortAPICSpuriousHandler( void ); + + /* Initialise LAPIC to a well known state. */ + portAPIC_LDR = 0xFFFFFFFF; + portAPIC_LDR = ( ( portAPIC_LDR & 0x00FFFFFF ) | 0x00000001 ); + portAPIC_LVT_TIMER = portAPIC_DISABLE; + portAPIC_LVT_PERF = portAPIC_NMI; + portAPIC_LVT_LINT0 = portAPIC_DISABLE; + portAPIC_LVT_LINT1 = portAPIC_DISABLE; + portAPIC_TASK_PRIORITY = 0; + + /* Install APIC timer ISR vector. */ + prvSetInterruptGate( ( uint8_t ) portAPIC_TIMER_INT_VECTOR, vPortTimerHandler, portIDT_FLAGS ); + + /* Install API error handler. */ + prvSetInterruptGate( ( uint8_t ) portAPIC_LVT_ERROR_VECTOR, vPortAPICErrorHandlerWrapper, portIDT_FLAGS ); + + /* Install Yield handler. */ + prvSetInterruptGate( ( uint8_t ) portAPIC_YIELD_INT_VECTOR, vPortYieldCall, portIDT_FLAGS ); + + /* Install spurious interrupt vector. */ + prvSetInterruptGate( ( uint8_t ) portAPIC_SPURIOUS_INT_VECTOR, vPortAPICSpuriousHandler, portIDT_FLAGS ); + + /* Enable the APIC, mapping the spurious interrupt at the same time. */ + portAPIC_SPURIOUS_INT = portAPIC_SPURIOUS_INT_VECTOR | portAPIC_ENABLE_BIT; + + /* Set timer error vector. */ + portAPIC_LVT_ERROR = portAPIC_LVT_ERROR_VECTOR; + + /* Set the interrupt frequency. */ + portAPIC_TMRDIV = portAPIC_DIV_16; + portAPIC_TIMER_INITIAL_COUNT = ( ( configCPU_CLOCK_HZ >> 4UL ) / configTICK_RATE_HZ ) - 1UL; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +BaseType_t xWord; + + /* Some versions of GCC require the -mno-ms-bitfields command line option + for packing to work. */ + configASSERT( sizeof( struct IDTEntry ) == portEXPECTED_IDT_ENTRY_SIZE ); + + /* Fill part of the system stack with a known value to help detect stack + overflow. A few zeros are left so GDB doesn't get confused unwinding + the stack. */ + for( xWord = 0; xWord < configISR_STACK_SIZE - 20; xWord++ ) + { + ulSystemStack[ xWord ] = portSTACK_WORD; + } + + /* Initialise Interrupt Descriptor Table (IDT). */ + vPortSetupIDT(); + + /* Initialise LAPIC and install system handlers. */ + prvSetupTimerInterrupt(); + + /* Make sure the stack used by interrupts is aligned. */ + ulTopOfSystemStack &= ~portBYTE_ALIGNMENT_MASK; + + ulCriticalNesting = 0; + + /* Enable LAPIC Counter.*/ + portAPIC_LVT_TIMER = portAPIC_TIMER_PERIODIC | portAPIC_TIMER_INT_VECTOR; + + /* Sometimes needed. */ + portAPIC_TMRDIV = portAPIC_DIV_16; + + /* Should not return from the following function as the scheduler will then + be executing the tasks. */ + vPortStartFirstTask(); + + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( ulCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + if( ulCriticalNesting == 0 ) + { + #if( configMAX_API_CALL_INTERRUPT_PRIORITY == portMAX_PRIORITY ) + { + __asm volatile( "cli" ); + } + #else + { + portAPIC_TASK_PRIORITY = portMAX_API_CALL_PRIORITY; + configASSERT( portAPIC_TASK_PRIORITY == portMAX_API_CALL_PRIORITY ); + } + #endif + } + + /* Now interrupts are disabled ulCriticalNesting can be accessed + directly. Increment ulCriticalNesting to keep a count of how many times + portENTER_CRITICAL() has been called. */ + ulCriticalNesting++; +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + if( ulCriticalNesting > portNO_CRITICAL_NESTING ) + { + /* Decrement the nesting count as the critical section is being + exited. */ + ulCriticalNesting--; + + /* If the nesting level has reached zero then all interrupt + priorities must be re-enabled. */ + if( ulCriticalNesting == portNO_CRITICAL_NESTING ) + { + /* Critical nesting has reached zero so all interrupt priorities + should be unmasked. */ + #if( configMAX_API_CALL_INTERRUPT_PRIORITY == portMAX_PRIORITY ) + { + __asm volatile( "sti" ); + } + #else + { + portAPIC_TASK_PRIORITY = 0; + } + #endif + + /* If a yield was pended from within the critical section then + perform the yield now. */ + if( ulPortYieldPending != pdFALSE ) + { + ulPortYieldPending = pdFALSE; + __asm volatile( portYIELD_INTERRUPT ); + } + } + } +} +/*-----------------------------------------------------------*/ + +uint32_t ulPortSetInterruptMask( void ) +{ +volatile uint32_t ulOriginalMask; + + /* Set mask to max syscall priority. */ + #if( configMAX_API_CALL_INTERRUPT_PRIORITY == portMAX_PRIORITY ) + { + /* Return whether interrupts were already enabled or not. Pop adjusts + the stack first. */ + __asm volatile( "pushf \t\n" + "pop %0 \t\n" + "cli " + : "=rm" (ulOriginalMask) :: "memory" ); + + ulOriginalMask &= portEFLAGS_IF; + } + #else + { + /* Return original mask. */ + ulOriginalMask = portAPIC_TASK_PRIORITY; + portAPIC_TASK_PRIORITY = portMAX_API_CALL_PRIORITY; + configASSERT( portAPIC_TASK_PRIORITY == portMAX_API_CALL_PRIORITY ); + } + #endif + + return ulOriginalMask; +} +/*-----------------------------------------------------------*/ + +void vPortClearInterruptMask( uint32_t ulNewMaskValue ) +{ + #if( configMAX_API_CALL_INTERRUPT_PRIORITY == portMAX_PRIORITY ) + { + if( ulNewMaskValue != pdFALSE ) + { + __asm volatile( "sti" ); + } + } + #else + { + portAPIC_TASK_PRIORITY = ulNewMaskValue; + configASSERT( portAPIC_TASK_PRIORITY == ulNewMaskValue ); + } + #endif +} +/*-----------------------------------------------------------*/ + +#if ( configSUPPORT_FPU == 1 ) + + void vPortTaskUsesFPU( void ) + { + /* A task is registering the fact that it needs an FPU context. Allocate a + buffer into which the context can be saved. */ + pucPortTaskFPUContextBuffer = ( uint8_t * ) pvPortMalloc( portFPU_CONTEXT_SIZE_BYTES ); + configASSERT( pucPortTaskFPUContextBuffer ); + + /* Initialise the floating point registers. */ + __asm volatile( "fninit" ); + } + +#endif /* configSUPPORT_FPU */ +/*-----------------------------------------------------------*/ + +void vPortAPICErrorHandler( void ) +{ +/* Variable to hold the APIC error status for viewing in the debugger. */ +volatile uint32_t ulErrorStatus = 0; + + portAPIC_ERROR_STATUS = 0; + ulErrorStatus = portAPIC_ERROR_STATUS; + ( void ) ulErrorStatus; + + /* Force an assert. */ + configASSERT( ulCriticalNesting == ~0UL ); +} +/*-----------------------------------------------------------*/ + +#if( configUSE_COMMON_INTERRUPT_ENTRY_POINT == 1 ) + + void vPortCentralInterruptHandler( uint32_t ulVector ) + { + if( ulVector < portNUM_VECTORS ) + { + if( xInterruptHandlerTable[ ulVector ] != NULL ) + { + ( xInterruptHandlerTable[ ulVector ] )(); + } + } + + /* Check for a system stack overflow. */ + configASSERT( ulSystemStack[ 10 ] == portSTACK_WORD ); + configASSERT( ulSystemStack[ 12 ] == portSTACK_WORD ); + configASSERT( ulSystemStack[ 14 ] == portSTACK_WORD ); + } + +#endif /* configUSE_COMMON_INTERRUPT_ENTRY_POINT */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_COMMON_INTERRUPT_ENTRY_POINT == 1 ) + + BaseType_t xPortRegisterCInterruptHandler( ISR_Handler_t pxHandler, uint32_t ulVectorNumber ) + { + BaseType_t xReturn; + + xReturn = prvCheckValidityOfVectorNumber( ulVectorNumber ); + + if( xReturn != pdFAIL ) + { + /* Save the handler passed in by the application in the vector number + passed in. The addresses are then called from the central interrupt + handler. */ + xInterruptHandlerTable[ ulVectorNumber ] = pxHandler; + } + + return xReturn; + } + +#endif /* configUSE_COMMON_INTERRUPT_ENTRY_POINT */ +/*-----------------------------------------------------------*/ + +BaseType_t xPortInstallInterruptHandler( ISR_Handler_t pxHandler, uint32_t ulVectorNumber ) +{ +BaseType_t xReturn; + + xReturn = prvCheckValidityOfVectorNumber( ulVectorNumber ); + + if( xReturn != pdFAIL ) + { + taskENTER_CRITICAL(); + { + /* Update the IDT to include the application defined handler. */ + prvSetInterruptGate( ( uint8_t ) ulVectorNumber, ( ISR_Handler_t ) pxHandler, portIDT_FLAGS ); + } + taskEXIT_CRITICAL(); + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + +static BaseType_t prvCheckValidityOfVectorNumber( uint32_t ulVectorNumber ) +{ +BaseType_t xReturn; + + /* Check validity of vector number. */ + if( ulVectorNumber >= portNUM_VECTORS ) + { + /* Too high. */ + xReturn = pdFAIL; + } + else if( ulVectorNumber < portAPIC_MIN_ALLOWABLE_VECTOR ) + { + /* Too low. */ + xReturn = pdFAIL; + } + else if( ulVectorNumber == portAPIC_TIMER_INT_VECTOR ) + { + /* In use by FreeRTOS. */ + xReturn = pdFAIL; + } + else if( ulVectorNumber == portAPIC_YIELD_INT_VECTOR ) + { + /* In use by FreeRTOS. */ + xReturn = pdFAIL; + } + else if( ulVectorNumber == portAPIC_LVT_ERROR_VECTOR ) + { + /* In use by FreeRTOS. */ + xReturn = pdFAIL; + } + else if( ulVectorNumber == portAPIC_SPURIOUS_INT_VECTOR ) + { + /* In use by FreeRTOS. */ + xReturn = pdFAIL; + } + else if( xInterruptHandlerTable[ ulVectorNumber ] != NULL ) + { + /* Already in use by the application. */ + xReturn = pdFAIL; + } + else + { + xReturn = pdPASS; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + +void vGenerateYieldInterrupt( void ) +{ + __asm volatile( portYIELD_INTERRUPT ); +} + + + + + + + + + + + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/IA32_flat/portASM.S b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/IA32_flat/portASM.S new file mode 100644 index 0000000..d647a83 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/IA32_flat/portASM.S @@ -0,0 +1,316 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +.file "portASM.S" +#include "FreeRTOSConfig.h" +#include "ISR_Support.h" + + .extern pxCurrentTCB + .extern vTaskSwitchContext + .extern vPortCentralInterruptHandler + .extern xTaskIncrementTick + .extern vPortAPICErrorHandler + .extern pucPortTaskFPUContextBuffer + .extern ulPortYieldPending + + .global vPortStartFirstTask + .global vPortCentralInterruptWrapper + .global vPortAPICErrorHandlerWrapper + .global vPortTimerHandler + .global vPortYieldCall + .global vPortAPICSpuriousHandler + + .text + +/*-----------------------------------------------------------*/ + +.align 4 +.func vPortYieldCall +vPortYieldCall: + /* Save general purpose registers. */ + pusha + + .if configSUPPORT_FPU == 1 + + /* If the task has a buffer allocated to save the FPU context then save + the FPU context now. */ + movl pucPortTaskFPUContextBuffer, %eax + test %eax, %eax + je 1f + fnsave ( %eax ) + fwait + + 1: + + /* Save the address of the FPU context, if any. */ + push pucPortTaskFPUContextBuffer + + .endif /* configSUPPORT_FPU */ + + /* Find the TCB. */ + movl pxCurrentTCB, %eax + + /* Stack location is first item in the TCB. */ + movl %esp, (%eax) + + call vTaskSwitchContext + + /* Find the location of pxCurrentTCB again - a callee saved register could + be used in place of eax to prevent this second load, but that then relies + on the compiler and other asm code. */ + movl pxCurrentTCB, %eax + movl (%eax), %esp + + .if configSUPPORT_FPU == 1 + + /* Restore address of task's FPU context buffer. */ + pop pucPortTaskFPUContextBuffer + + /* If the task has a buffer allocated in which its FPU context is saved, + then restore it now. */ + movl pucPortTaskFPUContextBuffer, %eax + test %eax, %eax + je 1f + frstor ( %eax ) + 1: + .endif + + popa + iret + +.endfunc +/*-----------------------------------------------------------*/ + +.align 4 +.func vPortStartFirstTask +vPortStartFirstTask: + + /* Find the TCB. */ + movl pxCurrentTCB, %eax + + /* Stack location is first item in the TCB. */ + movl (%eax), %esp + + /* Restore FPU context flag. */ + .if configSUPPORT_FPU == 1 + + pop pucPortTaskFPUContextBuffer + + .endif /* configSUPPORT_FPU */ + + /* Restore general purpose registers. */ + popa + iret +.endfunc +/*-----------------------------------------------------------*/ + +.align 4 +.func vPortAPICErrorHandlerWrapper +vPortAPICErrorHandlerWrapper: + pusha + call vPortAPICErrorHandler + popa + /* EOI. */ + movl $0x00, (0xFEE000B0) + iret +.endfunc +/*-----------------------------------------------------------*/ + +.align 4 +.func vPortTimerHandler +vPortTimerHandler: + + /* Save general purpose registers. */ + pusha + + /* Interrupts are not nested, so save the rest of the task context. */ + .if configSUPPORT_FPU == 1 + + /* If the task has a buffer allocated to save the FPU context then save the + FPU context now. */ + movl pucPortTaskFPUContextBuffer, %eax + test %eax, %eax + je 1f + fnsave ( %eax ) /* Save FLOP context into ucTempFPUBuffer array. */ + fwait + + 1: + /* Save the address of the FPU context, if any. */ + push pucPortTaskFPUContextBuffer + + .endif /* configSUPPORT_FPU */ + + /* Find the TCB. */ + movl pxCurrentTCB, %eax + + /* Stack location is first item in the TCB. */ + movl %esp, (%eax) + + /* Switch stacks. */ + movl ulTopOfSystemStack, %esp + movl %esp, %ebp + + /* Increment nesting count. */ + add $1, ulInterruptNesting + + call xTaskIncrementTick + + sti + + /* Is a switch to another task required? */ + test %eax, %eax + je _skip_context_switch + cli + call vTaskSwitchContext + +_skip_context_switch: + cli + + /* Decrement the variable used to determine if a switch to a system + stack is necessary. */ + sub $1, ulInterruptNesting + + /* Stack location is first item in the TCB. */ + movl pxCurrentTCB, %eax + movl (%eax), %esp + + .if configSUPPORT_FPU == 1 + + /* Restore address of task's FPU context buffer. */ + pop pucPortTaskFPUContextBuffer + + /* If the task has a buffer allocated in which its FPU context is saved, + then restore it now. */ + movl pucPortTaskFPUContextBuffer, %eax + test %eax, %eax + je 1f + frstor ( %eax ) + 1: + .endif + + popa + + /* EOI. */ + movl $0x00, (0xFEE000B0) + iret + +.endfunc +/*-----------------------------------------------------------*/ + +.if configUSE_COMMON_INTERRUPT_ENTRY_POINT == 1 + + .align 4 + .func vPortCentralInterruptWrapper + vPortCentralInterruptWrapper: + + portFREERTOS_INTERRUPT_ENTRY + + movl $0xFEE00170, %eax /* Highest In Service Register (ISR) long word. */ + movl $8, %ecx /* Loop counter. */ + + next_isr_long_word: + test %ecx, %ecx /* Loop counter reached 0? */ + je wrapper_epilogue /* Looked at all ISR registers without finding a bit set. */ + sub $1, %ecx /* Sub 1 from loop counter. */ + movl (%eax), %ebx /* Load next ISR long word. */ + sub $0x10, %eax /* Point to next ISR long word in case no bits are set in the current long word. */ + test %ebx, %ebx /* Are there any bits set? */ + je next_isr_long_word /* Look at next ISR long word if no bits were set. */ + sti + bsr %ebx, %ebx /* A bit was set, which one? */ + movl $32, %eax /* Destination operand for following multiplication. */ + mul %ecx /* Calculate base vector for current register, 32 vectors per register. */ + add %ebx, %eax /* Add bit offset into register to get final vector number. */ + push %eax /* Vector number is function parameter. */ + call vPortCentralInterruptHandler + pop %eax /* Remove parameter. */ + + wrapper_epilogue: + portFREERTOS_INTERRUPT_EXIT + + .endfunc + +.endif /* configUSE_COMMON_INTERRUPT_ENTRY_POINT */ +/*-----------------------------------------------------------*/ + +.align 4 +.func vPortAPISpuriousHandler +vPortAPICSpuriousHandler: + iret + +.endfunc + +.end + + + + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/IA32_flat/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/IA32_flat/portmacro.h new file mode 100644 index 0000000..0f37065 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/IA32_flat/portmacro.h @@ -0,0 +1,333 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus + extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +typedef uint32_t TickType_t; +#define portMAX_DELAY ( ( TickType_t ) 0xffffffffUL ) + +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 32 + +/*-----------------------------------------------------------*/ + +/* Task utilities. */ + +/* The interrupt priority (for vectors 16 to 255) is determined using vector/16. +The quotient is rounded to the nearest integer with 1 being the lowest priority +and 15 is the highest. Therefore the following two interrupts are at the lowest +priority. *NOTE 1* If the yield vector is changed then it must also be changed +in the portYIELD_INTERRUPT definition immediately below. */ +#define portAPIC_TIMER_INT_VECTOR ( 0x21 ) +#define portAPIC_YIELD_INT_VECTOR ( 0x20 ) + +/* Build yield interrupt instruction. */ +#define portYIELD_INTERRUPT "int $0x20" + +/* APIC register addresses. */ +#define portAPIC_EOI ( *( ( volatile uint32_t * ) 0xFEE000B0UL ) ) + +/* APIC bit definitions. */ +#define portAPIC_ENABLE_BIT ( 1UL << 8UL ) +#define portAPIC_TIMER_PERIODIC ( 1UL << 17UL ) +#define portAPIC_DISABLE ( 1UL << 16UL ) +#define portAPIC_NMI ( 4 << 8) +#define portAPIC_DIV_16 ( 0x03 ) + +/* Define local API register addresses. */ +#define portAPIC_ID_REGISTER ( *( ( volatile uint32_t * ) ( configAPIC_BASE + 0x20UL ) ) ) +#define portAPIC_SPURIOUS_INT ( *( ( volatile uint32_t * ) ( configAPIC_BASE + 0xF0UL ) ) ) +#define portAPIC_LVT_TIMER ( *( ( volatile uint32_t * ) ( configAPIC_BASE + 0x320UL ) ) ) +#define portAPIC_TIMER_INITIAL_COUNT ( *( ( volatile uint32_t * ) ( configAPIC_BASE + 0x380UL ) ) ) +#define portAPIC_TIMER_CURRENT_COUNT ( *( ( volatile uint32_t * ) ( configAPIC_BASE + 0x390UL ) ) ) +#define portAPIC_TASK_PRIORITY ( *( ( volatile uint32_t * ) ( configAPIC_BASE + 0x80UL ) ) ) +#define portAPIC_LVT_ERROR ( *( ( volatile uint32_t * ) ( configAPIC_BASE + 0x370UL ) ) ) +#define portAPIC_ERROR_STATUS ( *( ( volatile uint32_t * ) ( configAPIC_BASE + 0x280UL ) ) ) +#define portAPIC_LDR ( *( ( volatile uint32_t * ) ( configAPIC_BASE + 0xD0UL ) ) ) +#define portAPIC_TMRDIV ( *( ( volatile uint32_t * ) ( configAPIC_BASE + 0x3E0UL ) ) ) +#define portAPIC_LVT_PERF ( *( ( volatile uint32_t * ) ( configAPIC_BASE + 0x340UL ) ) ) +#define portAPIC_LVT_LINT0 ( *( ( volatile uint32_t * ) ( configAPIC_BASE + 0x350UL ) ) ) +#define portAPIC_LVT_LINT1 ( *( ( volatile uint32_t * ) ( configAPIC_BASE + 0x360UL ) ) ) + +/* Don't yield if inside a critical section - instead hold the yield pending +so it is performed when the critical section is exited. */ +#define portYIELD() \ +{ \ +extern volatile uint32_t ulCriticalNesting; \ +extern volatile uint32_t ulPortYieldPending; \ + if( ulCriticalNesting != 0 ) \ + { \ + ulPortYieldPending = pdTRUE; \ + } \ + else \ + { \ + __asm volatile( portYIELD_INTERRUPT ); \ + } \ +} + +/* Called at the end of an ISR that can cause a context switch - pend a yield if +xSwithcRequired is not false. */ +#define portEND_SWITCHING_ISR( xSwitchRequired ) \ +{ \ +extern volatile uint32_t ulPortYieldPending; \ + if( xSwitchRequired != pdFALSE ) \ + { \ + ulPortYieldPending = 1; \ + } \ +} + +/* Same as portEND_SWITCHING_ISR() - take your pick which name to use. */ +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) + +/*----------------------------------------------------------- + * Critical section control + *----------------------------------------------------------*/ + +/* Critical sections for use in interrupts. */ +#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortSetInterruptMask() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vPortClearInterruptMask( x ) + +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); +extern uint32_t ulPortSetInterruptMask( void ); +extern void vPortClearInterruptMask( uint32_t ulNewMaskValue ); + +/* These macros do not globally disable/enable interrupts. They do mask off +interrupts that have a priority below configMAX_API_CALL_INTERRUPT_PRIORITY. */ +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() +#define portDISABLE_INTERRUPTS() __asm volatile( "cli" ) +#define portENABLE_INTERRUPTS() __asm volatile( "sti" ) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are +not required for this port but included in case common demo code that uses these +macros is used. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +/* Architecture specific optimisations. */ +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Store/clear the ready priorities in a bit map. */ + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) \ + __asm volatile( "bsr %1, %0\n\t" \ + :"=r"(uxTopPriority) : "rm"(uxReadyPriorities) : "cc" ) + + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +#define portNOP() __asm volatile( "NOP" ) + +/*----------------------------------------------------------- + * Misc + *----------------------------------------------------------*/ + +#define portNUM_VECTORS 256 +#define portMAX_PRIORITY 15 +typedef void ( *ISR_Handler_t ) ( void ); + +/* Any task that uses the floating point unit MUST call vPortTaskUsesFPU() +before any floating point instructions are executed. */ +#ifndef configSUPPORT_FPU + #define configSUPPORT_FPU 0 +#endif + +#if configSUPPORT_FPU == 1 + void vPortTaskUsesFPU( void ); + #define portTASK_USES_FLOATING_POINT() vPortTaskUsesFPU() +#endif + +/* See the comments under the configUSE_COMMON_INTERRUPT_ENTRY_POINT definition +below. */ +BaseType_t xPortRegisterCInterruptHandler( ISR_Handler_t pxHandler, uint32_t ulVectorNumber ); +BaseType_t xPortInstallInterruptHandler( ISR_Handler_t pxHandler, uint32_t ulVectorNumber ); + +#ifndef configAPIC_BASE + /* configAPIC_BASE_ADDRESS sets the base address of the local APIC. It can + be overridden in FreeRTOSConfig.h should it not be constant. */ + #define configAPIC_BASE 0xFEE00000UL +#endif + +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + /* The FreeRTOS scheduling algorithm selects the task that will enter the + Running state. configUSE_PORT_OPTIMISED_TASK_SELECTION is used to set how + that is done. + + If configUSE_PORT_OPTIMISED_TASK_SELECTION is set to 0 then the task to + enter the Running state is selected using a portable algorithm written in + C. This is the slowest method, but the algorithm does not restrict the + maximum number of unique RTOS task priorities that are available. + + If configUSE_PORT_OPTIMISED_TASK_SELECTION is set to 1 then the task to + enter the Running state is selected using a single assembly instruction. + This is the fastest method, but restricts the maximum number of unique RTOS + task priorities to 32 (the same task priority can be assigned to any number + of RTOS tasks). */ + #warning configUSE_PORT_OPTIMISED_TASK_SELECTION was not defined in FreeRTOSConfig.h and has been defaulted to 1 + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +#ifndef configUSE_COMMON_INTERRUPT_ENTRY_POINT + /* There are two ways of implementing interrupt handlers: + + 1) As standard C functions - + + This method can only be used if configUSE_COMMON_INTERRUPT_ENTRY_POINT + is set to 1. The C function is installed using + xPortRegisterCInterruptHandler(). + + This is the simplest of the two methods but incurs a slightly longer + interrupt entry time. + + 2) By using an assembly stub that wraps the handler in the FreeRTOS + portFREERTOS_INTERRUPT_ENTRY and portFREERTOS_INTERRUPT_EXIT macros. + + This method can always be used. It is slightly more complex than + method 1 but benefits from a faster interrupt entry time. */ + #warning config_USE_COMMON_INTERRUPT_ENTRY_POINT was not defined in FreeRTOSConfig.h and has been defaulted to 1. + #define configUSE_COMMON_INTERRUPT_ENTRY_POINT 1 +#endif + +#ifndef configISR_STACK_SIZE + /* Interrupt entry code will switch the stack in use to a dedicated system + stack. + + configISR_STACK_SIZE defines the number of 32-bit values that can be stored + on the system stack, and must be large enough to hold a potentially nested + interrupt stack frame. */ + + #error configISE_STACK_SIZE was not defined in FreeRTOSConfig.h. +#endif + +#ifndef configMAX_API_CALL_INTERRUPT_PRIORITY + /* Interrupt safe FreeRTOS functions (those that end in "FromISR" must not + be called from an interrupt that has a priority above that set by + configMAX_API_CALL_INTERRUPT_PRIORITY. */ + #warning configMAX_API_CALL_INTERRUPT_PRIORITY was not defined in FreeRTOSConfig.h and has been defaulted to 10 + #define configMAX_API_CALL_INTERRUPT_PRIORITY 10 +#endif + +#ifndef configSUPPORT_FPU + #warning configSUPPORT_FPU was not defined in FreeRTOSConfig.h and has been defaulted to 0 + #define configSUPPORT_FPU 0 +#endif + +/* The value written to the task priority register to raise the interrupt mask +to the maximum from which FreeRTOS API calls can be made. */ +#define portAPIC_PRIORITY_SHIFT ( 4UL ) +#define portAPIC_MAX_SUB_PRIORITY ( 0x0fUL ) +#define portMAX_API_CALL_PRIORITY ( ( configMAX_API_CALL_INTERRUPT_PRIORITY << portAPIC_PRIORITY_SHIFT ) | portAPIC_MAX_SUB_PRIORITY ) + +/* Asserts if interrupt safe FreeRTOS functions are called from a priority +above the max system call interrupt priority. */ +#define portAPIC_PROCESSOR_PRIORITY ( *( ( volatile uint32_t * ) ( configAPIC_BASE + 0xA0UL ) ) ) +#define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() configASSERT( ( portAPIC_PROCESSOR_PRIORITY ) <= ( portMAX_API_CALL_PRIORITY ) ) + +#ifdef __cplusplus + } /* extern C */ +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/MCF5235/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/MCF5235/port.c new file mode 100644 index 0000000..092ea51 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/MCF5235/port.c @@ -0,0 +1,285 @@ +/* + FreeRTOS V4.1.1 - Copyright (C) 2003-2006 Richard Barry. + MCF5235 Port - Copyright (C) 2006 Christian Walter. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License** as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + FreeRTOS is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with FreeRTOS; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + A special exception to the GPL can be applied should you wish to distribute + a combined work that includes FreeRTOS, without being obliged to provide + the source code for any proprietary components. See the licensing section + of http://www.FreeRTOS.org for full details of how and when the exception + can be applied. + + *************************************************************************** + *************************************************************************** + * * + * Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation * + * * + * This is a concise, step by step, 'hands on' guide that describes both * + * general multitasking concepts and FreeRTOS specifics. It presents and * + * explains numerous examples that are written using the FreeRTOS API. * + * Full source code for all the examples is provided in an accompanying * + * .zip file. * + * * + *************************************************************************** + *************************************************************************** + + Please ensure to read the configuration and relevant port sections of the + online documentation. + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +#include + +#include "FreeRTOS.h" +#include "FreeRTOSConfig.h" +#include "task.h" + +/* ------------------------ Types ----------------------------------------- */ +typedef volatile uint32_t vuint32; +typedef volatile uint16_t vuint16; +typedef volatile uint8_t vuint8; + +/* ------------------------ Defines --------------------------------------- */ +#define portVECTOR_TABLE __RAMVEC +#define portVECTOR_SYSCALL ( 32 + portTRAP_YIELD ) +#define portVECTOR_TIMER ( 64 + 36 ) + +#define MCF_PIT_PRESCALER 512UL +#define MCF_PIT_TIMER_TICKS ( FSYS_2 / MCF_PIT_PRESCALER ) +#define MCF_PIT_MODULUS_REGISTER(freq) ( MCF_PIT_TIMER_TICKS / ( freq ) - 1UL) + +#define MCF_PIT_PMR0 ( *( vuint16 * )( void * )( &__IPSBAR[ 0x150002 ] ) ) +#define MCF_PIT_PCSR0 ( *( vuint16 * )( void * )( &__IPSBAR[ 0x150000 ] ) ) +#define MCF_PIT_PCSR_PRE(x) ( ( ( x ) & 0x000F ) << 8 ) +#define MCF_PIT_PCSR_EN ( 0x0001 ) +#define MCF_PIT_PCSR_RLD ( 0x0002 ) +#define MCF_PIT_PCSR_PIF ( 0x0004 ) +#define MCF_PIT_PCSR_PIE ( 0x0008 ) +#define MCF_PIT_PCSR_OVW ( 0x0010 ) +#define MCF_INTC0_ICR36 ( *( vuint8 * )( void * )( &__IPSBAR[ 0x000C64 ] ) ) +#define MCF_INTC0_IMRH ( *( vuint32 * )( void * )( &__IPSBAR[ 0x000C08 ] ) ) +#define MCF_INTC0_IMRH_INT_MASK36 ( 0x00000010 ) +#define MCF_INTC0_IMRH_MASKALL ( 0x00000001 ) +#define MCF_INTC0_ICRn_IP(x) ( ( ( x ) & 0x07 ) << 0 ) +#define MCF_INTC0_ICRn_IL(x) ( ( ( x ) & 0x07 ) << 3 ) + +#define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) +#define portINITIAL_CRITICAL_NESTING ( ( uint32_t ) 10 ) + +/* ------------------------ Static variables ------------------------------ */ +volatile uint32_t ulCriticalNesting = portINITIAL_CRITICAL_NESTING; + +/* ------------------------ Static functions ------------------------------ */ +#if configUSE_PREEMPTION == 0 +static void prvPortPreemptiveTick ( void ) __attribute__ ((interrupt_handler)); +#else +static void prvPortPreemptiveTick ( void ); +#endif + +/* ------------------------ Start implementation -------------------------- */ + +StackType_t * +pxPortInitialiseStack( StackType_t * pxTopOfStack, TaskFunction_t pxCode, + void *pvParameters ) +{ + /* Place the parameter on the stack in the expected location. */ + *pxTopOfStack = ( StackType_t ) pvParameters; + pxTopOfStack--; + + /* Place dummy return address on stack. Tasks should never terminate so + * we can set this to anything. */ + *pxTopOfStack = ( StackType_t ) 0; + pxTopOfStack--; + + /* Create a Motorola Coldfire exception stack frame. First comes the return + * address. */ + *pxTopOfStack = ( StackType_t ) pxCode; + pxTopOfStack--; + + /* Format, fault-status, vector number for exception stack frame. Task + * run in supervisor mode. */ + *pxTopOfStack = 0x40002000UL | ( portVECTOR_SYSCALL + 32 ) << 18; + pxTopOfStack--; + + /* Set the initial critical section nesting counter to zero. This value + * is used to restore the value of ulCriticalNesting. */ + *pxTopOfStack = 0; + *pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) 0xA6; /* A6 / FP */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xA5; /* A5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xA4; /* A4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xA3; /* A3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xA2; /* A2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xA1; /* A1 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xA0; /* A0 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xD7; /* D7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xD6; /* D6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xD5; /* D5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xD4; /* D4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xD3; /* D3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xD2; /* D2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xD1; /* D1 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xD0; /* D0 */ + + return pxTopOfStack; +} + +/* + * Called by portYIELD() or taskYIELD() to manually force a context switch. + */ +static void +prvPortYield( void ) +{ + asm volatile ( "move.w #0x2700, %sr\n\t" ); +#if _GCC_USES_FP == 1 + asm volatile ( "unlk %fp\n\t" ); +#endif + /* Perform the context switch. First save the context of the current task. */ + portSAVE_CONTEXT( ); + + /* Find the highest priority task that is ready to run. */ + vTaskSwitchContext( ); + + /* Restore the context of the new task. */ + portRESTORE_CONTEXT( ); +} + +#if configUSE_PREEMPTION == 0 +/* + * The ISR used for the scheduler tick depends on whether the cooperative or + * the preemptive scheduler is being used. + */ +static void +prvPortPreemptiveTick ( void ) +{ + /* The cooperative scheduler requires a normal IRQ service routine to + * simply increment the system tick. + */ + + xTaskIncrementTick(); + MCF_PIT_PCSR0 |= MCF_PIT_PCSR_PIF; +} + +#else + +static void +prvPortPreemptiveTick( void ) +{ + asm volatile ( "move.w #0x2700, %sr\n\t" ); +#if _GCC_USES_FP == 1 + asm volatile ( "unlk %fp\n\t" ); +#endif + portSAVE_CONTEXT( ); + MCF_PIT_PCSR0 |= MCF_PIT_PCSR_PIF; + if( xTaskIncrementTick() != pdFALSE ) + { + vTaskSwitchContext( ); + } + portRESTORE_CONTEXT( ); +} +#endif + +void +vPortEnterCritical() +{ + /* FIXME: We should store the old IPL here - How are we supposed to do + * this. + */ + ( void )portSET_IPL( portIPL_MAX ); + + /* Now interrupts are disabled ulCriticalNesting can be accessed + * directly. Increment ulCriticalNesting to keep a count of how many times + * portENTER_CRITICAL() has been called. */ + ulCriticalNesting++; +} + +void +vPortExitCritical() +{ + if( ulCriticalNesting > portNO_CRITICAL_NESTING ) + { + /* Decrement the nesting count as we are leaving a critical section. */ + ulCriticalNesting--; + + /* If the nesting level has reached zero then interrupts should be + re-enabled. */ + if( ulCriticalNesting == portNO_CRITICAL_NESTING ) + { + ( void )portSET_IPL( 0 ); + } + } +} + +BaseType_t +xPortStartScheduler( void ) +{ + extern void ( *portVECTOR_TABLE[ ] ) ( ); + + /* Add entry in vector table for yield system call. */ + portVECTOR_TABLE[ portVECTOR_SYSCALL ] = prvPortYield; + /* Add entry in vector table for periodic timer. */ + portVECTOR_TABLE[ portVECTOR_TIMER ] = prvPortPreemptiveTick; + + /* Configure the timer for the system clock. */ + if ( configTICK_RATE_HZ > 0) + { + /* Configure prescaler */ + MCF_PIT_PCSR0 = MCF_PIT_PCSR_PRE( 0x9 ) | MCF_PIT_PCSR_RLD | MCF_PIT_PCSR_OVW; + /* Initialize the periodic timer interrupt. */ + MCF_PIT_PMR0 = MCF_PIT_MODULUS_REGISTER( configTICK_RATE_HZ ); + /* Configure interrupt priority and level and unmask interrupt. */ + MCF_INTC0_ICR36 = MCF_INTC0_ICRn_IL( 0x1 ) | MCF_INTC0_ICRn_IP( 0x1 ); + MCF_INTC0_IMRH &= ~( MCF_INTC0_IMRH_INT_MASK36 | MCF_INTC0_IMRH_MASKALL ); + /* Enable interrupts */ + MCF_PIT_PCSR0 |= MCF_PIT_PCSR_PIE | MCF_PIT_PCSR_EN | MCF_PIT_PCSR_PIF; + } + + /* Restore the context of the first task that is going to run. */ + portRESTORE_CONTEXT( ); + + /* Should not get here. */ + return pdTRUE; +} + +void +vPortEndScheduler( void ) +{ +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/MCF5235/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/MCF5235/portmacro.h new file mode 100644 index 0000000..ea2598b --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/MCF5235/portmacro.h @@ -0,0 +1,182 @@ +/* + FreeRTOS V4.1.1 - Copyright (C) 2003-2006 Richard Barry. + MCF5235 Port - Copyright (C) 2006 Christian Walter. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License** as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + FreeRTOS is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with FreeRTOS; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + A special exception to the GPL can be applied should you wish to distribute + a combined work that includes FreeRTOS, without being obliged to provide + the source code for any proprietary components. See the licensing section + of http://www.FreeRTOS.org for full details of how and when the exception + can be applied. + + *************************************************************************** + *************************************************************************** + * * + * Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation * + * * + * This is a concise, step by step, 'hands on' guide that describes both * + * general multitasking concepts and FreeRTOS specifics. It presents and * + * explains numerous examples that are written using the FreeRTOS API. * + * Full source code for all the examples is provided in an accompanying * + * .zip file. * + * * + *************************************************************************** + *************************************************************************** + + Please ensure to read the configuration and relevant port sections of the + online documentation. + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* ------------------------ Data types for Coldfire ----------------------- */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE unsigned int +#define portBASE_TYPE int + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif + +/* ------------------------ Architecture specifics ------------------------ */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 4 + +#define portTRAP_YIELD 0 /* Trap 0 */ +#define portIPL_MAX 7 /* Only NMI interrupt 7 allowed. */ + +/* ------------------------ FreeRTOS macros for port ---------------------- */ + +/* + * This function must be called when the current state of the active task + * should be stored. It must be called immediately after exception + * processing from the CPU, i.e. there exists a Coldfire exception frame at + * the current position in the stack. The function reserves space on + * the stack for the CPU registers and other task dependent values (e.g + * ulCriticalNesting) and updates the top of the stack in the TCB. + */ +#define portSAVE_CONTEXT() \ + asm volatile ( /* reserve space for task state. */ \ + "lea.l (-64, %sp), %sp\n\t" \ + /* push data register %d0-%d7/%a0-%a6 on stack. */ \ + "movem.l %d0-%d7/%a0-%a6, (%sp)\n\t" \ + /* push ulCriticalNesting counter on stack. */ \ + "lea.l (60, %sp), %a0\n\t" \ + "move.l ulCriticalNesting, (%a0)\n\t" \ + /* set the new top of the stack in the TCB. */ \ + "move.l pxCurrentTCB, %a0\n\t" \ + "move.l %sp, (%a0)"); + +/*. + * This function restores the current active and continues its execution. + * It loads the current TCB and restores the processor registers, the + * task dependent values (e.g ulCriticalNesting). Finally execution + * is continued by executing an rte instruction. + */ +#define portRESTORE_CONTEXT() \ + asm volatile ( "move.l pxCurrentTCB, %sp\n\t" \ + "move.l (%sp), %sp\n\t" \ + /* stack pointer now points to the saved registers. */ \ + "movem.l (%sp), %d0-%d7/%a0-%a6\n\t" \ + /* restore ulCriticalNesting counter from stack. */ \ + "lea.l (%sp, 60), %sp\n\t" \ + "move.l (%sp)+, ulCriticalNesting\n\t" \ + /* stack pointer now points to exception frame. */ \ + "rte\n\t" ); + +#define portENTER_CRITICAL() \ + vPortEnterCritical(); + +#define portEXIT_CRITICAL() \ + vPortExitCritical(); + +#define portSET_IPL( xIPL ) \ + asm_set_ipl( xIPL ) + +#define portDISABLE_INTERRUPTS() \ + do { ( void )portSET_IPL( portIPL_MAX ); } while( 0 ) +#define portENABLE_INTERRUPTS() \ + do { ( void )portSET_IPL( 0 ); } while( 0 ) + +#define portYIELD() \ + asm volatile ( " trap %0\n\t" : : "i"(portTRAP_YIELD) ) + +#define portNOP() \ + asm volatile ( "nop\n\t" ) + +#define portENTER_SWITCHING_ISR() \ + asm volatile ( "move.w #0x2700, %sr" ); \ + /* Save the context of the interrupted task. */ \ + portSAVE_CONTEXT( ); \ + { + +#define portEXIT_SWITCHING_ISR( SwitchRequired ) \ + /* If a switch is required we call vTaskSwitchContext(). */ \ + if( SwitchRequired ) \ + { \ + vTaskSwitchContext( ); \ + } \ + } \ + portRESTORE_CONTEXT( ); + +/* ------------------------ Function prototypes --------------------------- */ +void vPortEnterCritical( void ); +void vPortExitCritical( void ); +int asm_set_ipl( uint32_t int uiNewIPL ); + +/* ------------------------ Compiler specifics ---------------------------- */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) \ + void vFunction( void *pvParameters ) + +#define portTASK_FUNCTION( vFunction, pvParameters ) \ + void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/MSP430F449/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/MSP430F449/port.c new file mode 100644 index 0000000..7518de2 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/MSP430F449/port.c @@ -0,0 +1,370 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* + Changes from V2.5.2 + + + usCriticalNesting now has a volatile qualifier. +*/ + +/* Standard includes. */ +#include +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the MSP430 port. + *----------------------------------------------------------*/ + +/* Constants required for hardware setup. The tick ISR runs off the ACLK, +not the MCLK. */ +#define portACLK_FREQUENCY_HZ ( ( TickType_t ) 32768 ) +#define portINITIAL_CRITICAL_NESTING ( ( uint16_t ) 10 ) +#define portFLAGS_INT_ENABLED ( ( StackType_t ) 0x08 ) + +/* We require the address of the pxCurrentTCB variable, but don't want to know +any details of its type. */ +typedef void TCB_t; +extern volatile TCB_t * volatile pxCurrentTCB; + +/* Most ports implement critical sections by placing the interrupt flags on +the stack before disabling interrupts. Exiting the critical section is then +simply a case of popping the flags from the stack. As mspgcc does not use +a frame pointer this cannot be done as modifying the stack will clobber all +the stack variables. Instead each task maintains a count of the critical +section nesting depth. Each time a critical section is entered the count is +incremented. Each time a critical section is left the count is decremented - +with interrupts only being re-enabled if the count is zero. + +usCriticalNesting will get set to zero when the scheduler starts, but must +not be initialised to zero as this will cause problems during the startup +sequence. */ +volatile uint16_t usCriticalNesting = portINITIAL_CRITICAL_NESTING; +/*-----------------------------------------------------------*/ + +/* + * Macro to save a task context to the task stack. This simply pushes all the + * general purpose msp430 registers onto the stack, followed by the + * usCriticalNesting value used by the task. Finally the resultant stack + * pointer value is saved into the task control block so it can be retrieved + * the next time the task executes. + */ +#define portSAVE_CONTEXT() \ + asm volatile ( "push r4 \n\t" \ + "push r5 \n\t" \ + "push r6 \n\t" \ + "push r7 \n\t" \ + "push r8 \n\t" \ + "push r9 \n\t" \ + "push r10 \n\t" \ + "push r11 \n\t" \ + "push r12 \n\t" \ + "push r13 \n\t" \ + "push r14 \n\t" \ + "push r15 \n\t" \ + "mov.w usCriticalNesting, r14 \n\t" \ + "push r14 \n\t" \ + "mov.w pxCurrentTCB, r12 \n\t" \ + "mov.w r1, @r12 \n\t" \ + ); + +/* + * Macro to restore a task context from the task stack. This is effectively + * the reverse of portSAVE_CONTEXT(). First the stack pointer value is + * loaded from the task control block. Next the value for usCriticalNesting + * used by the task is retrieved from the stack - followed by the value of all + * the general purpose msp430 registers. + * + * The bic instruction ensures there are no low power bits set in the status + * register that is about to be popped from the stack. + */ +#define portRESTORE_CONTEXT() \ + asm volatile ( "mov.w pxCurrentTCB, r12 \n\t" \ + "mov.w @r12, r1 \n\t" \ + "pop r15 \n\t" \ + "mov.w r15, usCriticalNesting \n\t" \ + "pop r15 \n\t" \ + "pop r14 \n\t" \ + "pop r13 \n\t" \ + "pop r12 \n\t" \ + "pop r11 \n\t" \ + "pop r10 \n\t" \ + "pop r9 \n\t" \ + "pop r8 \n\t" \ + "pop r7 \n\t" \ + "pop r6 \n\t" \ + "pop r5 \n\t" \ + "pop r4 \n\t" \ + "bic #(0xf0),0(r1) \n\t" \ + "reti \n\t" \ + ); +/*-----------------------------------------------------------*/ + +/* + * Sets up the periodic ISR used for the RTOS tick. This uses timer 0, but + * could have alternatively used the watchdog timer or timer 1. + */ +static void prvSetupTimerInterrupt( void ); +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been called. + * + * See the header file portable.h. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* + Place a few bytes of known values on the bottom of the stack. + This is just useful for debugging and can be included if required. + + *pxTopOfStack = ( StackType_t ) 0x1111; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x2222; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x3333; + pxTopOfStack--; + */ + + /* The msp430 automatically pushes the PC then SR onto the stack before + executing an ISR. We want the stack to look just as if this has happened + so place a pointer to the start of the task on the stack first - followed + by the flags we want the task to use when it starts up. */ + *pxTopOfStack = ( StackType_t ) pxCode; + pxTopOfStack--; + *pxTopOfStack = portFLAGS_INT_ENABLED; + pxTopOfStack--; + + /* Next the general purpose registers. */ + *pxTopOfStack = ( StackType_t ) 0x4444; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x5555; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x6666; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x7777; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x8888; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x9999; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xaaaa; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xbbbb; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xcccc; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xdddd; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xeeee; + pxTopOfStack--; + + /* When the task starts is will expect to find the function parameter in + R15. */ + *pxTopOfStack = ( StackType_t ) pvParameters; + pxTopOfStack--; + + /* The code generated by the mspgcc compiler does not maintain separate + stack and frame pointers. The portENTER_CRITICAL macro cannot therefore + use the stack as per other ports. Instead a variable is used to keep + track of the critical section nesting. This variable has to be stored + as part of the task context and is initially set to zero. */ + *pxTopOfStack = ( StackType_t ) portNO_CRITICAL_SECTION_NESTING; + + /* Return a pointer to the top of the stack we have generated so this can + be stored in the task control block for the task. */ + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* Setup the hardware to generate the tick. Interrupts are disabled when + this function is called. */ + prvSetupTimerInterrupt(); + + /* Restore the context of the first task that is going to run. */ + portRESTORE_CONTEXT(); + + /* Should not get here as the tasks are now running! */ + return pdTRUE; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the MSP430 port will get stopped. If required simply + disable the tick interrupt here. */ +} +/*-----------------------------------------------------------*/ + +/* + * Manual context switch called by portYIELD or taskYIELD. + * + * The first thing we do is save the registers so we can use a naked attribute. + */ +void vPortYield( void ) __attribute__ ( ( naked ) ); +void vPortYield( void ) +{ + /* We want the stack of the task being saved to look exactly as if the task + was saved during a pre-emptive RTOS tick ISR. Before calling an ISR the + msp430 places the status register onto the stack. As this is a function + call and not an ISR we have to do this manually. */ + asm volatile ( "push r2" ); + _DINT(); + + /* Save the context of the current task. */ + portSAVE_CONTEXT(); + + /* Switch to the highest priority task that is ready to run. */ + vTaskSwitchContext(); + + /* Restore the context of the new task. */ + portRESTORE_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +/* + * Hardware initialisation to generate the RTOS tick. This uses timer 0 + * but could alternatively use the watchdog timer or timer 1. + */ +static void prvSetupTimerInterrupt( void ) +{ + /* Ensure the timer is stopped. */ + TACTL = 0; + + /* Run the timer of the ACLK. */ + TACTL = TASSEL_1; + + /* Clear everything to start with. */ + TACTL |= TACLR; + + /* Set the compare match value according to the tick rate we want. */ + TACCR0 = portACLK_FREQUENCY_HZ / configTICK_RATE_HZ; + + /* Enable the interrupts. */ + TACCTL0 = CCIE; + + /* Start up clean. */ + TACTL |= TACLR; + + /* Up mode. */ + TACTL |= MC_1; +} +/*-----------------------------------------------------------*/ + +/* + * The interrupt service routine used depends on whether the pre-emptive + * scheduler is being used or not. + */ + +#if configUSE_PREEMPTION == 1 + + /* + * Tick ISR for preemptive scheduler. We can use a naked attribute as + * the context is saved at the start of vPortYieldFromTick(). The tick + * count is incremented after the context is saved. + */ + interrupt (TIMERA0_VECTOR) prvTickISR( void ) __attribute__ ( ( naked ) ); + interrupt (TIMERA0_VECTOR) prvTickISR( void ) + { + /* Save the context of the interrupted task. */ + portSAVE_CONTEXT(); + + /* Increment the tick count then switch to the highest priority task + that is ready to run. */ + if( xTaskIncrementTick() != pdFALSE ) + { + vTaskSwitchContext(); + } + + /* Restore the context of the new task. */ + portRESTORE_CONTEXT(); + } + +#else + + /* + * Tick ISR for the cooperative scheduler. All this does is increment the + * tick count. We don't need to switch context, this can only be done by + * manual calls to taskYIELD(); + */ + interrupt (TIMERA0_VECTOR) prvTickISR( void ); + interrupt (TIMERA0_VECTOR) prvTickISR( void ) + { + xTaskIncrementTick(); + } +#endif + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/MSP430F449/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/MSP430F449/portmacro.h new file mode 100644 index 0000000..b9854d9 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/MSP430F449/portmacro.h @@ -0,0 +1,169 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT int +#define portSTACK_TYPE uint16_t +#define portBASE_TYPE short + +typedef portSTACK_TYPE StackType_t; +typedef short BaseType_t; +typedef unsigned short UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Interrupt control macros. */ +#define portDISABLE_INTERRUPTS() asm volatile ( "DINT" ); asm volatile ( "NOP" ) +#define portENABLE_INTERRUPTS() asm volatile ( "EINT" ); asm volatile ( "NOP" ) +/*-----------------------------------------------------------*/ + +/* Critical section control macros. */ +#define portNO_CRITICAL_SECTION_NESTING ( ( uint16_t ) 0 ) + +#define portENTER_CRITICAL() \ +{ \ +extern volatile uint16_t usCriticalNesting; \ + \ + portDISABLE_INTERRUPTS(); \ + \ + /* Now interrupts are disabled ulCriticalNesting can be accessed */ \ + /* directly. Increment ulCriticalNesting to keep a count of how many */ \ + /* times portENTER_CRITICAL() has been called. */ \ + usCriticalNesting++; \ +} + +#define portEXIT_CRITICAL() \ +{ \ +extern volatile uint16_t usCriticalNesting; \ + \ + if( usCriticalNesting > portNO_CRITICAL_SECTION_NESTING ) \ + { \ + /* Decrement the nesting count as we are leaving a critical section. */ \ + usCriticalNesting--; \ + \ + /* If the nesting level has reached zero then interrupts should be */ \ + /* re-enabled. */ \ + if( usCriticalNesting == portNO_CRITICAL_SECTION_NESTING ) \ + { \ + portENABLE_INTERRUPTS(); \ + } \ + } \ +} +/*-----------------------------------------------------------*/ + +/* Task utilities. */ +extern void vPortYield( void ) __attribute__ ( ( naked ) ); +#define portYIELD() vPortYield() +#define portNOP() asm volatile ( "NOP" ) +/*-----------------------------------------------------------*/ + +/* Hardwware specifics. */ +#define portBYTE_ALIGNMENT 2 +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/MicroBlaze/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/MicroBlaze/port.c new file mode 100644 index 0000000..16ed492 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/MicroBlaze/port.c @@ -0,0 +1,375 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the MicroBlaze port. + *----------------------------------------------------------*/ + + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Standard includes. */ +#include + +/* Hardware includes. */ +#include +#include +#include + +#if( configSUPPORT_DYNAMIC_ALLOCATION == 0 ) + #error configSUPPORT_DYNAMIC_ALLOCATION must be set to 1 to use this port. +#endif + +/* Tasks are started with interrupts enabled. */ +#define portINITIAL_MSR_STATE ( ( StackType_t ) 0x02 ) + +/* Tasks are started with a critical section nesting of 0 - however prior +to the scheduler being commenced we don't want the critical nesting level +to reach zero, so it is initialised to a high value. */ +#define portINITIAL_NESTING_VALUE ( 0xff ) + +/* Our hardware setup only uses one counter. */ +#define portCOUNTER_0 0 + +/* The stack used by the ISR is filled with a known value to assist in +debugging. */ +#define portISR_STACK_FILL_VALUE 0x55555555 + +/* Counts the nesting depth of calls to portENTER_CRITICAL(). Each task +maintains it's own count, so this variable is saved as part of the task +context. */ +volatile UBaseType_t uxCriticalNesting = portINITIAL_NESTING_VALUE; + +/* To limit the amount of stack required by each task, this port uses a +separate stack for interrupts. */ +uint32_t *pulISRStack; + +/*-----------------------------------------------------------*/ + +/* + * Sets up the periodic ISR used for the RTOS tick. This uses timer 0, but + * could have alternatively used the watchdog timer or timer 1. + */ +static void prvSetupTimerInterrupt( void ); +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been made. + * + * See the header file portable.h. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +extern void *_SDA2_BASE_, *_SDA_BASE_; +const uint32_t ulR2 = ( uint32_t ) &_SDA2_BASE_; +const uint32_t ulR13 = ( uint32_t ) &_SDA_BASE_; + + /* Place a few bytes of known values on the bottom of the stack. + This is essential for the Microblaze port and these lines must + not be omitted. The parameter value will overwrite the + 0x22222222 value during the function prologue. */ + *pxTopOfStack = ( StackType_t ) 0x11111111; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x22222222; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x33333333; + pxTopOfStack--; + + /* First stack an initial value for the critical section nesting. This + is initialised to zero as tasks are started with interrupts enabled. */ + *pxTopOfStack = ( StackType_t ) 0x00; /* R0. */ + + /* Place an initial value for all the general purpose registers. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) ulR2; /* R2 - small data area. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03; /* R3. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04; /* R4. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters;/* R5 contains the function call parameters. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06; /* R6. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07; /* R7. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08; /* R8. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09; /* R9. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x0a; /* R10. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x0b; /* R11. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x0c; /* R12. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) ulR13; /* R13 - small data read write area. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* R14. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x0f; /* R15. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10; /* R16. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11; /* R17. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12; /* R18. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x13; /* R19. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x14; /* R20. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x15; /* R21. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x16; /* R22. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x17; /* R23. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x18; /* R24. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x19; /* R25. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x1a; /* R26. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x1b; /* R27. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x1c; /* R28. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x1d; /* R29. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x1e; /* R30. */ + pxTopOfStack--; + + /* The MSR is stacked between R30 and R31. */ + *pxTopOfStack = portINITIAL_MSR_STATE; + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) 0x1f; /* R31. */ + pxTopOfStack--; + + /* Return a pointer to the top of the stack we have generated so this can + be stored in the task control block for the task. */ + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void ( __FreeRTOS_interrupt_Handler )( void ); +extern void ( vStartFirstTask )( void ); + + + /* Setup the FreeRTOS interrupt handler. Code copied from crt0.s. */ + asm volatile ( "la r6, r0, __FreeRTOS_interrupt_handler \n\t" \ + "sw r6, r1, r0 \n\t" \ + "lhu r7, r1, r0 \n\t" \ + "shi r7, r0, 0x12 \n\t" \ + "shi r6, r0, 0x16 " ); + + /* Setup the hardware to generate the tick. Interrupts are disabled when + this function is called. */ + prvSetupTimerInterrupt(); + + /* Allocate the stack to be used by the interrupt handler. */ + pulISRStack = ( uint32_t * ) pvPortMalloc( configMINIMAL_STACK_SIZE * sizeof( StackType_t ) ); + + /* Restore the context of the first task that is going to run. */ + if( pulISRStack != NULL ) + { + /* Fill the ISR stack with a known value to facilitate debugging. */ + memset( pulISRStack, portISR_STACK_FILL_VALUE, configMINIMAL_STACK_SIZE * sizeof( StackType_t ) ); + pulISRStack += ( configMINIMAL_STACK_SIZE - 1 ); + + /* Kick off the first task. */ + vStartFirstTask(); + } + + /* Should not get here as the tasks are now running! */ + return pdFALSE; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented. */ +} +/*-----------------------------------------------------------*/ + +/* + * Manual context switch called by portYIELD or taskYIELD. + */ +void vPortYield( void ) +{ +extern void VPortYieldASM( void ); + + /* Perform the context switch in a critical section to assure it is + not interrupted by the tick ISR. It is not a problem to do this as + each task maintains it's own interrupt status. */ + portENTER_CRITICAL(); + /* Jump directly to the yield function to ensure there is no + compiler generated prologue code. */ + asm volatile ( "bralid r14, VPortYieldASM \n\t" \ + "or r0, r0, r0 \n\t" ); + portEXIT_CRITICAL(); +} +/*-----------------------------------------------------------*/ + +/* + * Hardware initialisation to generate the RTOS tick. + */ +static void prvSetupTimerInterrupt( void ) +{ +XTmrCtr xTimer; +const uint32_t ulCounterValue = configCPU_CLOCK_HZ / configTICK_RATE_HZ; +UBaseType_t uxMask; + + /* The OPB timer1 is used to generate the tick. Use the provided library + functions to enable the timer and set the tick frequency. */ + XTmrCtr_mDisable( XPAR_OPB_TIMER_1_BASEADDR, XPAR_OPB_TIMER_1_DEVICE_ID ); + XTmrCtr_Initialize( &xTimer, XPAR_OPB_TIMER_1_DEVICE_ID ); + XTmrCtr_mSetLoadReg( XPAR_OPB_TIMER_1_BASEADDR, portCOUNTER_0, ulCounterValue ); + XTmrCtr_mSetControlStatusReg( XPAR_OPB_TIMER_1_BASEADDR, portCOUNTER_0, XTC_CSR_LOAD_MASK | XTC_CSR_INT_OCCURED_MASK ); + + /* Set the timer interrupt enable bit while maintaining the other bit + states. */ + uxMask = XIntc_In32( ( XPAR_OPB_INTC_0_BASEADDR + XIN_IER_OFFSET ) ); + uxMask |= XPAR_OPB_TIMER_1_INTERRUPT_MASK; + XIntc_Out32( ( XPAR_OPB_INTC_0_BASEADDR + XIN_IER_OFFSET ), ( uxMask ) ); + + XTmrCtr_Start( &xTimer, XPAR_OPB_TIMER_1_DEVICE_ID ); + XTmrCtr_mSetControlStatusReg(XPAR_OPB_TIMER_1_BASEADDR, portCOUNTER_0, XTC_CSR_ENABLE_TMR_MASK | XTC_CSR_ENABLE_INT_MASK | XTC_CSR_AUTO_RELOAD_MASK | XTC_CSR_DOWN_COUNT_MASK | XTC_CSR_INT_OCCURED_MASK ); + XIntc_mAckIntr( XPAR_INTC_SINGLE_BASEADDR, 1 ); +} +/*-----------------------------------------------------------*/ + +/* + * The interrupt handler placed in the interrupt vector when the scheduler is + * started. The task context has already been saved when this is called. + * This handler determines the interrupt source and calls the relevant + * peripheral handler. + */ +void vTaskISRHandler( void ) +{ +static uint32_t ulPending; + + /* Which interrupts are pending? */ + ulPending = XIntc_In32( ( XPAR_INTC_SINGLE_BASEADDR + XIN_IVR_OFFSET ) ); + + if( ulPending < XPAR_INTC_MAX_NUM_INTR_INPUTS ) + { + static XIntc_VectorTableEntry *pxTablePtr; + static XIntc_Config *pxConfig; + static uint32_t ulInterruptMask; + + ulInterruptMask = ( uint32_t ) 1 << ulPending; + + /* Get the configuration data using the device ID */ + pxConfig = &XIntc_ConfigTable[ ( uint32_t ) XPAR_INTC_SINGLE_DEVICE_ID ]; + + pxTablePtr = &( pxConfig->HandlerTable[ ulPending ] ); + if( pxConfig->AckBeforeService & ( ulInterruptMask ) ) + { + XIntc_mAckIntr( pxConfig->BaseAddress, ulInterruptMask ); + pxTablePtr->Handler( pxTablePtr->CallBackRef ); + } + else + { + pxTablePtr->Handler( pxTablePtr->CallBackRef ); + XIntc_mAckIntr( pxConfig->BaseAddress, ulInterruptMask ); + } + } +} +/*-----------------------------------------------------------*/ + +/* + * Handler for the timer interrupt. + */ +void vTickISR( void *pvBaseAddress ) +{ +uint32_t ulCSR; + + /* Increment the RTOS tick - this might cause a task to unblock. */ + if( xTaskIncrementTick() != pdFALSE ) + { + vTaskSwitchContext(); + } + + /* Clear the timer interrupt */ + ulCSR = XTmrCtr_mGetControlStatusReg(XPAR_OPB_TIMER_1_BASEADDR, 0); + XTmrCtr_mSetControlStatusReg( XPAR_OPB_TIMER_1_BASEADDR, portCOUNTER_0, ulCSR ); +} +/*-----------------------------------------------------------*/ + + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/MicroBlaze/portasm.s b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/MicroBlaze/portasm.s new file mode 100644 index 0000000..8ce3bf9 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/MicroBlaze/portasm.s @@ -0,0 +1,239 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + .extern pxCurrentTCB + .extern vTaskISRHandler + .extern vTaskSwitchContext + .extern uxCriticalNesting + .extern pulISRStack + + .global __FreeRTOS_interrupt_handler + .global VPortYieldASM + .global vStartFirstTask + + +.macro portSAVE_CONTEXT + /* Make room for the context on the stack. */ + addik r1, r1, -132 + /* Save r31 so it can then be used. */ + swi r31, r1, 4 + /* Copy the msr into r31 - this is stacked later. */ + mfs r31, rmsr + /* Stack general registers. */ + swi r30, r1, 12 + swi r29, r1, 16 + swi r28, r1, 20 + swi r27, r1, 24 + swi r26, r1, 28 + swi r25, r1, 32 + swi r24, r1, 36 + swi r23, r1, 40 + swi r22, r1, 44 + swi r21, r1, 48 + swi r20, r1, 52 + swi r19, r1, 56 + swi r18, r1, 60 + swi r17, r1, 64 + swi r16, r1, 68 + swi r15, r1, 72 + swi r13, r1, 80 + swi r12, r1, 84 + swi r11, r1, 88 + swi r10, r1, 92 + swi r9, r1, 96 + swi r8, r1, 100 + swi r7, r1, 104 + swi r6, r1, 108 + swi r5, r1, 112 + swi r4, r1, 116 + swi r3, r1, 120 + swi r2, r1, 124 + /* Stack the critical section nesting value. */ + lwi r3, r0, uxCriticalNesting + swi r3, r1, 128 + /* Save the top of stack value to the TCB. */ + lwi r3, r0, pxCurrentTCB + sw r1, r0, r3 + + .endm + +.macro portRESTORE_CONTEXT + /* Load the top of stack value from the TCB. */ + lwi r3, r0, pxCurrentTCB + lw r1, r0, r3 + /* Restore the general registers. */ + lwi r31, r1, 4 + lwi r30, r1, 12 + lwi r29, r1, 16 + lwi r28, r1, 20 + lwi r27, r1, 24 + lwi r26, r1, 28 + lwi r25, r1, 32 + lwi r24, r1, 36 + lwi r23, r1, 40 + lwi r22, r1, 44 + lwi r21, r1, 48 + lwi r20, r1, 52 + lwi r19, r1, 56 + lwi r18, r1, 60 + lwi r17, r1, 64 + lwi r16, r1, 68 + lwi r15, r1, 72 + lwi r14, r1, 76 + lwi r13, r1, 80 + lwi r12, r1, 84 + lwi r11, r1, 88 + lwi r10, r1, 92 + lwi r9, r1, 96 + lwi r8, r1, 100 + lwi r7, r1, 104 + lwi r6, r1, 108 + lwi r5, r1, 112 + lwi r4, r1, 116 + lwi r2, r1, 124 + + /* Load the critical nesting value. */ + lwi r3, r1, 128 + swi r3, r0, uxCriticalNesting + + /* Obtain the MSR value from the stack. */ + lwi r3, r1, 8 + + /* Are interrupts enabled in the MSR? If so return using an return from + interrupt instruction to ensure interrupts are enabled only once the task + is running again. */ + andi r3, r3, 2 + beqid r3, 36 + or r0, r0, r0 + + /* Reload the rmsr from the stack, clear the enable interrupt bit in the + value before saving back to rmsr register, then return enabling interrupts + as we return. */ + lwi r3, r1, 8 + andi r3, r3, ~2 + mts rmsr, r3 + lwi r3, r1, 120 + addik r1, r1, 132 + rtid r14, 0 + or r0, r0, r0 + + /* Reload the rmsr from the stack, place it in the rmsr register, and + return without enabling interrupts. */ + lwi r3, r1, 8 + mts rmsr, r3 + lwi r3, r1, 120 + addik r1, r1, 132 + rtsd r14, 0 + or r0, r0, r0 + + .endm + + .text + .align 2 + + +__FreeRTOS_interrupt_handler: + portSAVE_CONTEXT + /* Entered via an interrupt so interrupts must be enabled in msr. */ + ori r31, r31, 2 + /* Stack msr. */ + swi r31, r1, 8 + /* Stack the return address. As we entered via an interrupt we do + not need to modify the return address prior to stacking. */ + swi r14, r1, 76 + /* Now switch to use the ISR stack. */ + lwi r3, r0, pulISRStack + add r1, r3, r0 + bralid r15, vTaskISRHandler + or r0, r0, r0 + portRESTORE_CONTEXT + + +VPortYieldASM: + portSAVE_CONTEXT + /* Stack msr. */ + swi r31, r1, 8 + /* Modify the return address so we return to the instruction after the + exception. */ + addi r14, r14, 8 + swi r14, r1, 76 + /* Now switch to use the ISR stack. */ + lwi r3, r0, pulISRStack + add r1, r3, r0 + bralid r15, vTaskSwitchContext + or r0, r0, r0 + portRESTORE_CONTEXT + +vStartFirstTask: + portRESTORE_CONTEXT + + + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/MicroBlaze/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/MicroBlaze/portmacro.h new file mode 100644 index 0000000..817d31c --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/MicroBlaze/portmacro.h @@ -0,0 +1,168 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Interrupt control macros. */ +void microblaze_disable_interrupts( void ); +void microblaze_enable_interrupts( void ); +#define portDISABLE_INTERRUPTS() microblaze_disable_interrupts() +#define portENABLE_INTERRUPTS() microblaze_enable_interrupts() +/*-----------------------------------------------------------*/ + +/* Critical section macros. */ +void vPortEnterCritical( void ); +void vPortExitCritical( void ); +#define portENTER_CRITICAL() { \ + extern UBaseType_t uxCriticalNesting; \ + microblaze_disable_interrupts(); \ + uxCriticalNesting++; \ + } + +#define portEXIT_CRITICAL() { \ + extern UBaseType_t uxCriticalNesting; \ + /* Interrupts are disabled, so we can */ \ + /* access the variable directly. */ \ + uxCriticalNesting--; \ + if( uxCriticalNesting == 0 ) \ + { \ + /* The nesting has unwound and we \ + can enable interrupts again. */ \ + portENABLE_INTERRUPTS(); \ + } \ + } + +/*-----------------------------------------------------------*/ + +/* Task utilities. */ +void vPortYield( void ); +#define portYIELD() vPortYield() + +void vTaskSwitchContext(); +#define portYIELD_FROM_ISR() vTaskSwitchContext() +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 4 +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portNOP() asm volatile ( "NOP" ) +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/MicroBlazeV8/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/MicroBlazeV8/port.c new file mode 100644 index 0000000..6e5ac4d --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/MicroBlazeV8/port.c @@ -0,0 +1,494 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the MicroBlaze port. + *----------------------------------------------------------*/ + + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Standard includes. */ +#include + +/* Hardware includes. */ +#include +#include +#include + +/* Tasks are started with a critical section nesting of 0 - however, prior to +the scheduler being commenced interrupts should not be enabled, so the critical +nesting variable is initialised to a non-zero value. */ +#define portINITIAL_NESTING_VALUE ( 0xff ) + +/* The bit within the MSR register that enabled/disables interrupts and +exceptions respectively. */ +#define portMSR_IE ( 0x02U ) +#define portMSR_EE ( 0x100U ) + +/* If the floating point unit is included in the MicroBlaze build, then the +FSR register is saved as part of the task context. portINITIAL_FSR is the value +given to the FSR register when the initial context is set up for a task being +created. */ +#define portINITIAL_FSR ( 0U ) +/*-----------------------------------------------------------*/ + +/* + * Initialise the interrupt controller instance. + */ +static int32_t prvInitialiseInterruptController( void ); + +/* Ensure the interrupt controller instance variable is initialised before it is + * used, and that the initialisation only happens once. + */ +static int32_t prvEnsureInterruptControllerIsInitialised( void ); + +/*-----------------------------------------------------------*/ + +/* Counts the nesting depth of calls to portENTER_CRITICAL(). Each task +maintains its own count, so this variable is saved as part of the task +context. */ +volatile UBaseType_t uxCriticalNesting = portINITIAL_NESTING_VALUE; + +/* This port uses a separate stack for interrupts. This prevents the stack of +every task needing to be large enough to hold an entire interrupt stack on top +of the task stack. */ +uint32_t *pulISRStack; + +/* If an interrupt requests a context switch, then ulTaskSwitchRequested will +get set to 1. ulTaskSwitchRequested is inspected just before the main interrupt +handler exits. If, at that time, ulTaskSwitchRequested is set to 1, the kernel +will call vTaskSwitchContext() to ensure the task that runs immediately after +the interrupt exists is the highest priority task that is able to run. This is +an unusual mechanism, but is used for this port because a single interrupt can +cause the servicing of multiple peripherals - and it is inefficient to call +vTaskSwitchContext() multiple times as each peripheral is serviced. */ +volatile uint32_t ulTaskSwitchRequested = 0UL; + +/* The instance of the interrupt controller used by this port. This is required +by the Xilinx library API functions. */ +static XIntc xInterruptControllerInstance; + +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been made. + * + * See the portable.h header file. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +extern void *_SDA2_BASE_, *_SDA_BASE_; +const uint32_t ulR2 = ( uint32_t ) &_SDA2_BASE_; +const uint32_t ulR13 = ( uint32_t ) &_SDA_BASE_; + + /* Place a few bytes of known values on the bottom of the stack. + This is essential for the Microblaze port and these lines must + not be omitted. */ + *pxTopOfStack = ( StackType_t ) 0x00000000; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x00000000; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x00000000; + pxTopOfStack--; + + #if( XPAR_MICROBLAZE_USE_FPU != 0 ) + /* The FSR value placed in the initial task context is just 0. */ + *pxTopOfStack = portINITIAL_FSR; + pxTopOfStack--; + #endif + + /* The MSR value placed in the initial task context should have interrupts + disabled. Each task will enable interrupts automatically when it enters + the running state for the first time. */ + *pxTopOfStack = mfmsr() & ~portMSR_IE; + + #if( MICROBLAZE_EXCEPTIONS_ENABLED == 1 ) + { + /* Ensure exceptions are enabled for the task. */ + *pxTopOfStack |= portMSR_EE; + } + #endif + + pxTopOfStack--; + + /* First stack an initial value for the critical section nesting. This + is initialised to zero. */ + *pxTopOfStack = ( StackType_t ) 0x00; + + /* R0 is always zero. */ + /* R1 is the SP. */ + + /* Place an initial value for all the general purpose registers. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) ulR2; /* R2 - read only small data area. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03; /* R3 - return values and temporaries. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04; /* R4 - return values and temporaries. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters;/* R5 contains the function call parameters. */ + + #ifdef portPRE_LOAD_STACK_FOR_DEBUGGING + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06; /* R6 - other parameters and temporaries. Used as the return address from vPortTaskEntryPoint. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07; /* R7 - other parameters and temporaries. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08; /* R8 - other parameters and temporaries. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09; /* R9 - other parameters and temporaries. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x0a; /* R10 - other parameters and temporaries. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x0b; /* R11 - temporaries. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x0c; /* R12 - temporaries. */ + pxTopOfStack--; + #else + pxTopOfStack-= 8; + #endif + + *pxTopOfStack = ( StackType_t ) ulR13; /* R13 - read/write small data area. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* R14 - return address for interrupt. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) NULL; /* R15 - return address for subroutine. */ + + #ifdef portPRE_LOAD_STACK_FOR_DEBUGGING + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10; /* R16 - return address for trap (debugger). */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11; /* R17 - return address for exceptions, if configured. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12; /* R18 - reserved for assembler and compiler temporaries. */ + pxTopOfStack--; + #else + pxTopOfStack -= 4; + #endif + + *pxTopOfStack = ( StackType_t ) 0x00; /* R19 - must be saved across function calls. Callee-save. Seems to be interpreted as the frame pointer. */ + + #ifdef portPRE_LOAD_STACK_FOR_DEBUGGING + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x14; /* R20 - reserved for storing a pointer to the Global Offset Table (GOT) in Position Independent Code (PIC). Non-volatile in non-PIC code. Must be saved across function calls. Callee-save. Not used by FreeRTOS. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x15; /* R21 - must be saved across function calls. Callee-save. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x16; /* R22 - must be saved across function calls. Callee-save. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x17; /* R23 - must be saved across function calls. Callee-save. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x18; /* R24 - must be saved across function calls. Callee-save. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x19; /* R25 - must be saved across function calls. Callee-save. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x1a; /* R26 - must be saved across function calls. Callee-save. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x1b; /* R27 - must be saved across function calls. Callee-save. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x1c; /* R28 - must be saved across function calls. Callee-save. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x1d; /* R29 - must be saved across function calls. Callee-save. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x1e; /* R30 - must be saved across function calls. Callee-save. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x1f; /* R31 - must be saved across function calls. Callee-save. */ + pxTopOfStack--; + #else + pxTopOfStack -= 13; + #endif + + /* Return a pointer to the top of the stack that has been generated so this + can be stored in the task control block for the task. */ + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void ( vPortStartFirstTask )( void ); +extern uint32_t _stack[]; + + /* Setup the hardware to generate the tick. Interrupts are disabled when + this function is called. + + This port uses an application defined callback function to install the tick + interrupt handler because the kernel will run on lots of different + MicroBlaze and FPGA configurations - not all of which will have the same + timer peripherals defined or available. An example definition of + vApplicationSetupTimerInterrupt() is provided in the official demo + application that accompanies this port. */ + vApplicationSetupTimerInterrupt(); + + /* Reuse the stack from main() as the stack for the interrupts/exceptions. */ + pulISRStack = ( uint32_t * ) _stack; + + /* Ensure there is enough space for the functions called from the interrupt + service routines to write back into the stack frame of the caller. */ + pulISRStack -= 2; + + /* Restore the context of the first task that is going to run. From here + on, the created tasks will be executing. */ + vPortStartFirstTask(); + + /* Should not get here as the tasks are now running! */ + return pdFALSE; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +/* + * Manual context switch called by portYIELD or taskYIELD. + */ +void vPortYield( void ) +{ +extern void VPortYieldASM( void ); + + /* Perform the context switch in a critical section to assure it is + not interrupted by the tick ISR. It is not a problem to do this as + each task maintains its own interrupt status. */ + portENTER_CRITICAL(); + { + /* Jump directly to the yield function to ensure there is no + compiler generated prologue code. */ + asm volatile ( "bralid r14, VPortYieldASM \n\t" \ + "or r0, r0, r0 \n\t" ); + } + portEXIT_CRITICAL(); +} +/*-----------------------------------------------------------*/ + +void vPortEnableInterrupt( uint8_t ucInterruptID ) +{ +int32_t lReturn; + + /* An API function is provided to enable an interrupt in the interrupt + controller because the interrupt controller instance variable is private + to this file. */ + lReturn = prvEnsureInterruptControllerIsInitialised(); + if( lReturn == pdPASS ) + { + XIntc_Enable( &xInterruptControllerInstance, ucInterruptID ); + } + + configASSERT( lReturn ); +} +/*-----------------------------------------------------------*/ + +void vPortDisableInterrupt( uint8_t ucInterruptID ) +{ +int32_t lReturn; + + /* An API function is provided to disable an interrupt in the interrupt + controller because the interrupt controller instance variable is private + to this file. */ + lReturn = prvEnsureInterruptControllerIsInitialised(); + + if( lReturn == pdPASS ) + { + XIntc_Disable( &xInterruptControllerInstance, ucInterruptID ); + } + + configASSERT( lReturn ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortInstallInterruptHandler( uint8_t ucInterruptID, XInterruptHandler pxHandler, void *pvCallBackRef ) +{ +int32_t lReturn; + + /* An API function is provided to install an interrupt handler because the + interrupt controller instance variable is private to this file. */ + + lReturn = prvEnsureInterruptControllerIsInitialised(); + + if( lReturn == pdPASS ) + { + lReturn = XIntc_Connect( &xInterruptControllerInstance, ucInterruptID, pxHandler, pvCallBackRef ); + } + + if( lReturn == XST_SUCCESS ) + { + lReturn = pdPASS; + } + + configASSERT( lReturn == pdPASS ); + + return lReturn; +} +/*-----------------------------------------------------------*/ + +static int32_t prvEnsureInterruptControllerIsInitialised( void ) +{ +static int32_t lInterruptControllerInitialised = pdFALSE; +int32_t lReturn; + + /* Ensure the interrupt controller instance variable is initialised before + it is used, and that the initialisation only happens once. */ + if( lInterruptControllerInitialised != pdTRUE ) + { + lReturn = prvInitialiseInterruptController(); + + if( lReturn == pdPASS ) + { + lInterruptControllerInitialised = pdTRUE; + } + } + else + { + lReturn = pdPASS; + } + + return lReturn; +} +/*-----------------------------------------------------------*/ + +/* + * Handler for the timer interrupt. This is the handler that the application + * defined callback function vApplicationSetupTimerInterrupt() should install. + */ +void vPortTickISR( void *pvUnused ) +{ +extern void vApplicationClearTimerInterrupt( void ); + + /* Ensure the unused parameter does not generate a compiler warning. */ + ( void ) pvUnused; + + /* This port uses an application defined callback function to clear the tick + interrupt because the kernel will run on lots of different MicroBlaze and + FPGA configurations - not all of which will have the same timer peripherals + defined or available. An example definition of + vApplicationClearTimerInterrupt() is provided in the official demo + application that accompanies this port. */ + vApplicationClearTimerInterrupt(); + + /* Increment the RTOS tick - this might cause a task to unblock. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Force vTaskSwitchContext() to be called as the interrupt exits. */ + ulTaskSwitchRequested = 1; + } +} +/*-----------------------------------------------------------*/ + +static int32_t prvInitialiseInterruptController( void ) +{ +int32_t lStatus; + + lStatus = XIntc_Initialize( &xInterruptControllerInstance, configINTERRUPT_CONTROLLER_TO_USE ); + + if( lStatus == XST_SUCCESS ) + { + /* Initialise the exception table. */ + Xil_ExceptionInit(); + + /* Service all pending interrupts each time the handler is entered. */ + XIntc_SetIntrSvcOption( xInterruptControllerInstance.BaseAddress, XIN_SVC_ALL_ISRS_OPTION ); + + /* Install exception handlers if the MicroBlaze is configured to handle + exceptions, and the application defined constant + configINSTALL_EXCEPTION_HANDLERS is set to 1. */ + #if ( MICROBLAZE_EXCEPTIONS_ENABLED == 1 ) && ( configINSTALL_EXCEPTION_HANDLERS == 1 ) + { + vPortExceptionsInstallHandlers(); + } + #endif /* MICROBLAZE_EXCEPTIONS_ENABLED */ + + /* Start the interrupt controller. Interrupts are enabled when the + scheduler starts. */ + lStatus = XIntc_Start( &xInterruptControllerInstance, XIN_REAL_MODE ); + + if( lStatus == XST_SUCCESS ) + { + lStatus = pdPASS; + } + else + { + lStatus = pdFAIL; + } + } + + configASSERT( lStatus == pdPASS ); + + return lStatus; +} +/*-----------------------------------------------------------*/ + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/MicroBlazeV8/port_exceptions.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/MicroBlazeV8/port_exceptions.c new file mode 100644 index 0000000..a8b71d9 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/MicroBlazeV8/port_exceptions.c @@ -0,0 +1,324 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Hardware includes. */ +#include +#include + +/* The Xilinx library defined exception entry point stacks a number of +registers. These definitions are offsets from the stack pointer to the various +stacked register values. */ +#define portexR3_STACK_OFFSET 4 +#define portexR4_STACK_OFFSET 5 +#define portexR5_STACK_OFFSET 6 +#define portexR6_STACK_OFFSET 7 +#define portexR7_STACK_OFFSET 8 +#define portexR8_STACK_OFFSET 9 +#define portexR9_STACK_OFFSET 10 +#define portexR10_STACK_OFFSET 11 +#define portexR11_STACK_OFFSET 12 +#define portexR12_STACK_OFFSET 13 +#define portexR15_STACK_OFFSET 16 +#define portexR18_STACK_OFFSET 19 +#define portexMSR_STACK_OFFSET 20 +#define portexR19_STACK_OFFSET -1 + +/* This is defined to equal the size, in bytes, of the stack frame generated by +the Xilinx standard library exception entry point. It is required to determine +the stack pointer value prior to the exception being entered. */ +#define portexASM_HANDLER_STACK_FRAME_SIZE 84UL + +/* The number of bytes a MicroBlaze instruction consumes. */ +#define portexINSTRUCTION_SIZE 4 + +/* Exclude this entire file if the MicroBlaze is not configured to handle +exceptions, or the application defined configuration constant +configINSTALL_EXCEPTION_HANDLERS is not set to 1. */ +#if ( MICROBLAZE_EXCEPTIONS_ENABLED == 1 ) && ( configINSTALL_EXCEPTION_HANDLERS == 1 ) + +/* This variable is set in the exception entry code, before +vPortExceptionHandler is called. */ +uint32_t *pulStackPointerOnFunctionEntry = NULL; + +/* This is the structure that is filled with the MicroBlaze context as it +existed immediately prior to the exception occurrence. A pointer to this +structure is passed into the vApplicationExceptionRegisterDump() callback +function, if one is defined. */ +static xPortRegisterDump xRegisterDump; + +/* This is the FreeRTOS exception handler that is installed for all exception +types. It is called from vPortExceptionHanlderEntry() - which is itself defined +in portasm.S. */ +void vPortExceptionHandler( void *pvExceptionID ); +extern void vPortExceptionHandlerEntry( void *pvExceptionID ); + +/*-----------------------------------------------------------*/ + +/* vApplicationExceptionRegisterDump() is a callback function that the +application can optionally define to receive a populated xPortRegisterDump +structure. If the application chooses not to define a version of +vApplicationExceptionRegisterDump() then this weekly defined default +implementation will be called instead. */ +extern void vApplicationExceptionRegisterDump( xPortRegisterDump *xRegisterDump ) __attribute__((weak)); +void vApplicationExceptionRegisterDump( xPortRegisterDump *xRegisterDump ) +{ + ( void ) xRegisterDump; + + for( ;; ) + { + portNOP(); + } +} +/*-----------------------------------------------------------*/ + +void vPortExceptionHandler( void *pvExceptionID ) +{ +extern void *pxCurrentTCB; + + /* Fill an xPortRegisterDump structure with the MicroBlaze context as it + was immediately before the exception occurrence. */ + + /* First fill in the name and handle of the task that was in the Running + state when the exception occurred. */ + xRegisterDump.xCurrentTaskHandle = pxCurrentTCB; + xRegisterDump.pcCurrentTaskName = pcTaskGetName( NULL ); + + configASSERT( pulStackPointerOnFunctionEntry ); + + /* Obtain the values of registers that were stacked prior to this function + being called, and may have changed since they were stacked. */ + xRegisterDump.ulR3 = pulStackPointerOnFunctionEntry[ portexR3_STACK_OFFSET ]; + xRegisterDump.ulR4 = pulStackPointerOnFunctionEntry[ portexR4_STACK_OFFSET ]; + xRegisterDump.ulR5 = pulStackPointerOnFunctionEntry[ portexR5_STACK_OFFSET ]; + xRegisterDump.ulR6 = pulStackPointerOnFunctionEntry[ portexR6_STACK_OFFSET ]; + xRegisterDump.ulR7 = pulStackPointerOnFunctionEntry[ portexR7_STACK_OFFSET ]; + xRegisterDump.ulR8 = pulStackPointerOnFunctionEntry[ portexR8_STACK_OFFSET ]; + xRegisterDump.ulR9 = pulStackPointerOnFunctionEntry[ portexR9_STACK_OFFSET ]; + xRegisterDump.ulR10 = pulStackPointerOnFunctionEntry[ portexR10_STACK_OFFSET ]; + xRegisterDump.ulR11 = pulStackPointerOnFunctionEntry[ portexR11_STACK_OFFSET ]; + xRegisterDump.ulR12 = pulStackPointerOnFunctionEntry[ portexR12_STACK_OFFSET ]; + xRegisterDump.ulR15_return_address_from_subroutine = pulStackPointerOnFunctionEntry[ portexR15_STACK_OFFSET ]; + xRegisterDump.ulR18 = pulStackPointerOnFunctionEntry[ portexR18_STACK_OFFSET ]; + xRegisterDump.ulR19 = pulStackPointerOnFunctionEntry[ portexR19_STACK_OFFSET ]; + xRegisterDump.ulMSR = pulStackPointerOnFunctionEntry[ portexMSR_STACK_OFFSET ]; + + /* Obtain the value of all other registers. */ + xRegisterDump.ulR2_small_data_area = mfgpr( R2 ); + xRegisterDump.ulR13_read_write_small_data_area = mfgpr( R13 ); + xRegisterDump.ulR14_return_address_from_interrupt = mfgpr( R14 ); + xRegisterDump.ulR16_return_address_from_trap = mfgpr( R16 ); + xRegisterDump.ulR17_return_address_from_exceptions = mfgpr( R17 ); + xRegisterDump.ulR20 = mfgpr( R20 ); + xRegisterDump.ulR21 = mfgpr( R21 ); + xRegisterDump.ulR22 = mfgpr( R22 ); + xRegisterDump.ulR23 = mfgpr( R23 ); + xRegisterDump.ulR24 = mfgpr( R24 ); + xRegisterDump.ulR25 = mfgpr( R25 ); + xRegisterDump.ulR26 = mfgpr( R26 ); + xRegisterDump.ulR27 = mfgpr( R27 ); + xRegisterDump.ulR28 = mfgpr( R28 ); + xRegisterDump.ulR29 = mfgpr( R29 ); + xRegisterDump.ulR30 = mfgpr( R30 ); + xRegisterDump.ulR31 = mfgpr( R31 ); + xRegisterDump.ulR1_SP = ( ( uint32_t ) pulStackPointerOnFunctionEntry ) + portexASM_HANDLER_STACK_FRAME_SIZE; + xRegisterDump.ulEAR = mfear(); + xRegisterDump.ulESR = mfesr(); + xRegisterDump.ulEDR = mfedr(); + + /* Move the saved program counter back to the instruction that was executed + when the exception occurred. This is only valid for certain types of + exception. */ + xRegisterDump.ulPC = xRegisterDump.ulR17_return_address_from_exceptions - portexINSTRUCTION_SIZE; + + #if( XPAR_MICROBLAZE_USE_FPU != 0 ) + { + xRegisterDump.ulFSR = mffsr(); + } + #else + { + xRegisterDump.ulFSR = 0UL; + } + #endif + + /* Also fill in a string that describes what type of exception this is. + The string uses the same ID names as defined in the MicroBlaze standard + library exception header files. */ + switch( ( uint32_t ) pvExceptionID ) + { + case XEXC_ID_FSL : + xRegisterDump.pcExceptionCause = ( int8_t * const ) "XEXC_ID_FSL"; + break; + + case XEXC_ID_UNALIGNED_ACCESS : + xRegisterDump.pcExceptionCause = ( int8_t * const ) "XEXC_ID_UNALIGNED_ACCESS"; + break; + + case XEXC_ID_ILLEGAL_OPCODE : + xRegisterDump.pcExceptionCause = ( int8_t * const ) "XEXC_ID_ILLEGAL_OPCODE"; + break; + + case XEXC_ID_M_AXI_I_EXCEPTION : + xRegisterDump.pcExceptionCause = ( int8_t * const ) "XEXC_ID_M_AXI_I_EXCEPTION or XEXC_ID_IPLB_EXCEPTION"; + break; + + case XEXC_ID_M_AXI_D_EXCEPTION : + xRegisterDump.pcExceptionCause = ( int8_t * const ) "XEXC_ID_M_AXI_D_EXCEPTION or XEXC_ID_DPLB_EXCEPTION"; + break; + + case XEXC_ID_DIV_BY_ZERO : + xRegisterDump.pcExceptionCause = ( int8_t * const ) "XEXC_ID_DIV_BY_ZERO"; + break; + + case XEXC_ID_STACK_VIOLATION : + xRegisterDump.pcExceptionCause = ( int8_t * const ) "XEXC_ID_STACK_VIOLATION or XEXC_ID_MMU"; + break; + + #if( XPAR_MICROBLAZE_USE_FPU != 0 ) + + case XEXC_ID_FPU : + xRegisterDump.pcExceptionCause = ( int8_t * const ) "XEXC_ID_FPU see ulFSR value"; + break; + + #endif /* XPAR_MICROBLAZE_USE_FPU */ + } + + /* vApplicationExceptionRegisterDump() is a callback function that the + application can optionally define to receive the populated xPortRegisterDump + structure. If the application chooses not to define a version of + vApplicationExceptionRegisterDump() then the weekly defined default + implementation within this file will be called instead. */ + vApplicationExceptionRegisterDump( &xRegisterDump ); + + /* Must not attempt to leave this function! */ + for( ;; ) + { + portNOP(); + } +} +/*-----------------------------------------------------------*/ + +void vPortExceptionsInstallHandlers( void ) +{ +static uint32_t ulHandlersAlreadyInstalled = pdFALSE; + + if( ulHandlersAlreadyInstalled == pdFALSE ) + { + ulHandlersAlreadyInstalled = pdTRUE; + + #if XPAR_MICROBLAZE_UNALIGNED_EXCEPTIONS == 1 + microblaze_register_exception_handler( XEXC_ID_UNALIGNED_ACCESS, vPortExceptionHandlerEntry, ( void * ) XEXC_ID_UNALIGNED_ACCESS ); + #endif /* XPAR_MICROBLAZE_UNALIGNED_EXCEPTIONS*/ + + #if XPAR_MICROBLAZE_ILL_OPCODE_EXCEPTION == 1 + microblaze_register_exception_handler( XEXC_ID_ILLEGAL_OPCODE, vPortExceptionHandlerEntry, ( void * ) XEXC_ID_ILLEGAL_OPCODE ); + #endif /* XPAR_MICROBLAZE_ILL_OPCODE_EXCEPTION */ + + #if XPAR_MICROBLAZE_M_AXI_I_BUS_EXCEPTION == 1 + microblaze_register_exception_handler( XEXC_ID_M_AXI_I_EXCEPTION, vPortExceptionHandlerEntry, ( void * ) XEXC_ID_M_AXI_I_EXCEPTION ); + #endif /* XPAR_MICROBLAZE_M_AXI_I_BUS_EXCEPTION */ + + #if XPAR_MICROBLAZE_M_AXI_D_BUS_EXCEPTION == 1 + microblaze_register_exception_handler( XEXC_ID_M_AXI_D_EXCEPTION, vPortExceptionHandlerEntry, ( void * ) XEXC_ID_M_AXI_D_EXCEPTION ); + #endif /* XPAR_MICROBLAZE_M_AXI_D_BUS_EXCEPTION */ + + #if XPAR_MICROBLAZE_IPLB_BUS_EXCEPTION == 1 + microblaze_register_exception_handler( XEXC_ID_IPLB_EXCEPTION, vPortExceptionHandlerEntry, ( void * ) XEXC_ID_IPLB_EXCEPTION ); + #endif /* XPAR_MICROBLAZE_IPLB_BUS_EXCEPTION */ + + #if XPAR_MICROBLAZE_DPLB_BUS_EXCEPTION == 1 + microblaze_register_exception_handler( XEXC_ID_DPLB_EXCEPTION, vPortExceptionHandlerEntry, ( void * ) XEXC_ID_DPLB_EXCEPTION ); + #endif /* XPAR_MICROBLAZE_DPLB_BUS_EXCEPTION */ + + #if XPAR_MICROBLAZE_DIV_ZERO_EXCEPTION == 1 + microblaze_register_exception_handler( XEXC_ID_DIV_BY_ZERO, vPortExceptionHandlerEntry, ( void * ) XEXC_ID_DIV_BY_ZERO ); + #endif /* XPAR_MICROBLAZE_DIV_ZERO_EXCEPTION */ + + #if XPAR_MICROBLAZE_FPU_EXCEPTION == 1 + microblaze_register_exception_handler( XEXC_ID_FPU, vPortExceptionHandlerEntry, ( void * ) XEXC_ID_FPU ); + #endif /* XPAR_MICROBLAZE_FPU_EXCEPTION */ + + #if XPAR_MICROBLAZE_FSL_EXCEPTION == 1 + microblaze_register_exception_handler( XEXC_ID_FSL, vPortExceptionHandlerEntry, ( void * ) XEXC_ID_FSL ); + #endif /* XPAR_MICROBLAZE_FSL_EXCEPTION */ + + microblaze_enable_exceptions(); + } +} + +/* Exclude the entire file if the MicroBlaze is not configured to handle +exceptions, or the application defined configuration item +configINSTALL_EXCEPTION_HANDLERS is not set to 1. */ +#endif /* ( MICROBLAZE_EXCEPTIONS_ENABLED == 1 ) && ( configINSTALL_EXCEPTION_HANDLERS == 1 ) */ + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/MicroBlazeV8/portasm.S b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/MicroBlazeV8/portasm.S new file mode 100644 index 0000000..4084578 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/MicroBlazeV8/portasm.S @@ -0,0 +1,370 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* FreeRTOS includes. */ +#include "FreeRTOSConfig.h" + +/* Xilinx library includes. */ +#include "microblaze_exceptions_g.h" +#include "xparameters.h" + +/* The context is oversized to allow functions called from the ISR to write +back into the caller stack. */ +#if( XPAR_MICROBLAZE_USE_FPU != 0 ) + #define portCONTEXT_SIZE 136 + #define portMINUS_CONTEXT_SIZE -136 +#else + #define portCONTEXT_SIZE 132 + #define portMINUS_CONTEXT_SIZE -132 +#endif + +/* Offsets from the stack pointer at which saved registers are placed. */ +#define portR31_OFFSET 4 +#define portR30_OFFSET 8 +#define portR29_OFFSET 12 +#define portR28_OFFSET 16 +#define portR27_OFFSET 20 +#define portR26_OFFSET 24 +#define portR25_OFFSET 28 +#define portR24_OFFSET 32 +#define portR23_OFFSET 36 +#define portR22_OFFSET 40 +#define portR21_OFFSET 44 +#define portR20_OFFSET 48 +#define portR19_OFFSET 52 +#define portR18_OFFSET 56 +#define portR17_OFFSET 60 +#define portR16_OFFSET 64 +#define portR15_OFFSET 68 +#define portR14_OFFSET 72 +#define portR13_OFFSET 76 +#define portR12_OFFSET 80 +#define portR11_OFFSET 84 +#define portR10_OFFSET 88 +#define portR9_OFFSET 92 +#define portR8_OFFSET 96 +#define portR7_OFFSET 100 +#define portR6_OFFSET 104 +#define portR5_OFFSET 108 +#define portR4_OFFSET 112 +#define portR3_OFFSET 116 +#define portR2_OFFSET 120 +#define portCRITICAL_NESTING_OFFSET 124 +#define portMSR_OFFSET 128 +#define portFSR_OFFSET 132 + + .extern pxCurrentTCB + .extern XIntc_DeviceInterruptHandler + .extern vTaskSwitchContext + .extern uxCriticalNesting + .extern pulISRStack + .extern ulTaskSwitchRequested + .extern vPortExceptionHandler + .extern pulStackPointerOnFunctionEntry + + .global _interrupt_handler + .global VPortYieldASM + .global vPortStartFirstTask + .global vPortExceptionHandlerEntry + + +.macro portSAVE_CONTEXT + + /* Make room for the context on the stack. */ + addik r1, r1, portMINUS_CONTEXT_SIZE + + /* Stack general registers. */ + swi r31, r1, portR31_OFFSET + swi r30, r1, portR30_OFFSET + swi r29, r1, portR29_OFFSET + swi r28, r1, portR28_OFFSET + swi r27, r1, portR27_OFFSET + swi r26, r1, portR26_OFFSET + swi r25, r1, portR25_OFFSET + swi r24, r1, portR24_OFFSET + swi r23, r1, portR23_OFFSET + swi r22, r1, portR22_OFFSET + swi r21, r1, portR21_OFFSET + swi r20, r1, portR20_OFFSET + swi r19, r1, portR19_OFFSET + swi r18, r1, portR18_OFFSET + swi r17, r1, portR17_OFFSET + swi r16, r1, portR16_OFFSET + swi r15, r1, portR15_OFFSET + /* R14 is saved later as it needs adjustment if a yield is performed. */ + swi r13, r1, portR13_OFFSET + swi r12, r1, portR12_OFFSET + swi r11, r1, portR11_OFFSET + swi r10, r1, portR10_OFFSET + swi r9, r1, portR9_OFFSET + swi r8, r1, portR8_OFFSET + swi r7, r1, portR7_OFFSET + swi r6, r1, portR6_OFFSET + swi r5, r1, portR5_OFFSET + swi r4, r1, portR4_OFFSET + swi r3, r1, portR3_OFFSET + swi r2, r1, portR2_OFFSET + + /* Stack the critical section nesting value. */ + lwi r18, r0, uxCriticalNesting + swi r18, r1, portCRITICAL_NESTING_OFFSET + + /* Stack MSR. */ + mfs r18, rmsr + swi r18, r1, portMSR_OFFSET + + #if( XPAR_MICROBLAZE_USE_FPU != 0 ) + /* Stack FSR. */ + mfs r18, rfsr + swi r18, r1, portFSR_OFFSET + #endif + + /* Save the top of stack value to the TCB. */ + lwi r3, r0, pxCurrentTCB + sw r1, r0, r3 + + .endm + +.macro portRESTORE_CONTEXT + + /* Load the top of stack value from the TCB. */ + lwi r18, r0, pxCurrentTCB + lw r1, r0, r18 + + /* Restore the general registers. */ + lwi r31, r1, portR31_OFFSET + lwi r30, r1, portR30_OFFSET + lwi r29, r1, portR29_OFFSET + lwi r28, r1, portR28_OFFSET + lwi r27, r1, portR27_OFFSET + lwi r26, r1, portR26_OFFSET + lwi r25, r1, portR25_OFFSET + lwi r24, r1, portR24_OFFSET + lwi r23, r1, portR23_OFFSET + lwi r22, r1, portR22_OFFSET + lwi r21, r1, portR21_OFFSET + lwi r20, r1, portR20_OFFSET + lwi r19, r1, portR19_OFFSET + lwi r17, r1, portR17_OFFSET + lwi r16, r1, portR16_OFFSET + lwi r15, r1, portR15_OFFSET + lwi r14, r1, portR14_OFFSET + lwi r13, r1, portR13_OFFSET + lwi r12, r1, portR12_OFFSET + lwi r11, r1, portR11_OFFSET + lwi r10, r1, portR10_OFFSET + lwi r9, r1, portR9_OFFSET + lwi r8, r1, portR8_OFFSET + lwi r7, r1, portR7_OFFSET + lwi r6, r1, portR6_OFFSET + lwi r5, r1, portR5_OFFSET + lwi r4, r1, portR4_OFFSET + lwi r3, r1, portR3_OFFSET + lwi r2, r1, portR2_OFFSET + + /* Reload the rmsr from the stack. */ + lwi r18, r1, portMSR_OFFSET + mts rmsr, r18 + + #if( XPAR_MICROBLAZE_USE_FPU != 0 ) + /* Reload the FSR from the stack. */ + lwi r18, r1, portFSR_OFFSET + mts rfsr, r18 + #endif + + /* Load the critical nesting value. */ + lwi r18, r1, portCRITICAL_NESTING_OFFSET + swi r18, r0, uxCriticalNesting + + /* Test the critical nesting value. If it is non zero then the task last + exited the running state using a yield. If it is zero, then the task + last exited the running state through an interrupt. */ + xori r18, r18, 0 + bnei r18, exit_from_yield + + /* r18 was being used as a temporary. Now restore its true value from the + stack. */ + lwi r18, r1, portR18_OFFSET + + /* Remove the stack frame. */ + addik r1, r1, portCONTEXT_SIZE + + /* Return using rtid so interrupts are re-enabled as this function is + exited. */ + rtid r14, 0 + or r0, r0, r0 + + .endm + +/* This function is used to exit portRESTORE_CONTEXT() if the task being +returned to last left the Running state by calling taskYIELD() (rather than +being preempted by an interrupt). */ + .text + .align 4 +exit_from_yield: + + /* r18 was being used as a temporary. Now restore its true value from the + stack. */ + lwi r18, r1, portR18_OFFSET + + /* Remove the stack frame. */ + addik r1, r1, portCONTEXT_SIZE + + /* Return to the task. */ + rtsd r14, 0 + or r0, r0, r0 + + + .text + .align 4 +_interrupt_handler: + + portSAVE_CONTEXT + + /* Stack the return address. */ + swi r14, r1, portR14_OFFSET + + /* Switch to the ISR stack. */ + lwi r1, r0, pulISRStack + + /* The parameter to the interrupt handler. */ + ori r5, r0, configINTERRUPT_CONTROLLER_TO_USE + + /* Execute any pending interrupts. */ + bralid r15, XIntc_DeviceInterruptHandler + or r0, r0, r0 + + /* See if a new task should be selected to execute. */ + lwi r18, r0, ulTaskSwitchRequested + or r18, r18, r0 + + /* If ulTaskSwitchRequested is already zero, then jump straight to + restoring the task that is already in the Running state. */ + beqi r18, task_switch_not_requested + + /* Set ulTaskSwitchRequested back to zero as a task switch is about to be + performed. */ + swi r0, r0, ulTaskSwitchRequested + + /* ulTaskSwitchRequested was not 0 when tested. Select the next task to + execute. */ + bralid r15, vTaskSwitchContext + or r0, r0, r0 + +task_switch_not_requested: + + /* Restore the context of the next task scheduled to execute. */ + portRESTORE_CONTEXT + + + .text + .align 4 +VPortYieldASM: + + portSAVE_CONTEXT + + /* Modify the return address so a return is done to the instruction after + the call to VPortYieldASM. */ + addi r14, r14, 8 + swi r14, r1, portR14_OFFSET + + /* Switch to use the ISR stack. */ + lwi r1, r0, pulISRStack + + /* Select the next task to execute. */ + bralid r15, vTaskSwitchContext + or r0, r0, r0 + + /* Restore the context of the next task scheduled to execute. */ + portRESTORE_CONTEXT + + .text + .align 4 +vPortStartFirstTask: + + portRESTORE_CONTEXT + + + +#if ( MICROBLAZE_EXCEPTIONS_ENABLED == 1 ) && ( configINSTALL_EXCEPTION_HANDLERS == 1 ) + + .text + .align 4 +vPortExceptionHandlerEntry: + + /* Take a copy of the stack pointer before vPortExecptionHandler is called, + storing its value prior to the function stack frame being created. */ + swi r1, r0, pulStackPointerOnFunctionEntry + bralid r15, vPortExceptionHandler + or r0, r0, r0 + +#endif /* ( MICROBLAZE_EXCEPTIONS_ENABLED == 1 ) && ( configINSTALL_EXCEPTION_HANDLERS == 1 ) */ + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/MicroBlazeV8/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/MicroBlazeV8/portmacro.h new file mode 100644 index 0000000..15866d2 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/MicroBlazeV8/portmacro.h @@ -0,0 +1,411 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* BSP includes. */ +#include +#include + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Interrupt control macros and functions. */ +void microblaze_disable_interrupts( void ); +void microblaze_enable_interrupts( void ); +#define portDISABLE_INTERRUPTS() microblaze_disable_interrupts() +#define portENABLE_INTERRUPTS() microblaze_enable_interrupts() +/*-----------------------------------------------------------*/ + +/* Critical section macros. */ +void vPortEnterCritical( void ); +void vPortExitCritical( void ); +#define portENTER_CRITICAL() { \ + extern volatile UBaseType_t uxCriticalNesting; \ + microblaze_disable_interrupts(); \ + uxCriticalNesting++; \ + } + +#define portEXIT_CRITICAL() { \ + extern volatile UBaseType_t uxCriticalNesting; \ + /* Interrupts are disabled, so we can */ \ + /* access the variable directly. */ \ + uxCriticalNesting--; \ + if( uxCriticalNesting == 0 ) \ + { \ + /* The nesting has unwound and we \ + can enable interrupts again. */ \ + portENABLE_INTERRUPTS(); \ + } \ + } + +/*-----------------------------------------------------------*/ + +/* The yield macro maps directly to the vPortYield() function. */ +void vPortYield( void ); +#define portYIELD() vPortYield() + +/* portYIELD_FROM_ISR() does not directly call vTaskSwitchContext(), but instead +sets a flag to say that a yield has been requested. The interrupt exit code +then checks this flag, and calls vTaskSwitchContext() before restoring a task +context, if the flag is not false. This is done to prevent multiple calls to +vTaskSwitchContext() being made from a single interrupt, as a single interrupt +can result in multiple peripherals being serviced. */ +extern volatile uint32_t ulTaskSwitchRequested; +#define portYIELD_FROM_ISR( x ) if( ( x ) != pdFALSE ) ulTaskSwitchRequested = 1 + +#if( configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 ) + + /* Generic helper function. */ + __attribute__( ( always_inline ) ) static inline uint8_t ucPortCountLeadingZeros( uint32_t ulBitmap ) + { + uint8_t ucReturn; + + __asm volatile ( "clz %0, %1" : "=r" ( ucReturn ) : "r" ( ulBitmap ) ); + return ucReturn; + } + + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) ucPortCountLeadingZeros( ( uxReadyPriorities ) ) ) + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 4 +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portNOP() asm volatile ( "NOP" ) +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*-----------------------------------------------------------*/ + +/* The following structure is used by the FreeRTOS exception handler. It is +filled with the MicroBlaze context as it was at the time the exception occurred. +This is done as an aid to debugging exception occurrences. */ +typedef struct PORT_REGISTER_DUMP +{ + /* The following structure members hold the values of the MicroBlaze + registers at the time the exception was raised. */ + uint32_t ulR1_SP; + uint32_t ulR2_small_data_area; + uint32_t ulR3; + uint32_t ulR4; + uint32_t ulR5; + uint32_t ulR6; + uint32_t ulR7; + uint32_t ulR8; + uint32_t ulR9; + uint32_t ulR10; + uint32_t ulR11; + uint32_t ulR12; + uint32_t ulR13_read_write_small_data_area; + uint32_t ulR14_return_address_from_interrupt; + uint32_t ulR15_return_address_from_subroutine; + uint32_t ulR16_return_address_from_trap; + uint32_t ulR17_return_address_from_exceptions; /* The exception entry code will copy the BTR into R17 if the exception occurred in the delay slot of a branch instruction. */ + uint32_t ulR18; + uint32_t ulR19; + uint32_t ulR20; + uint32_t ulR21; + uint32_t ulR22; + uint32_t ulR23; + uint32_t ulR24; + uint32_t ulR25; + uint32_t ulR26; + uint32_t ulR27; + uint32_t ulR28; + uint32_t ulR29; + uint32_t ulR30; + uint32_t ulR31; + uint32_t ulPC; + uint32_t ulESR; + uint32_t ulMSR; + uint32_t ulEAR; + uint32_t ulFSR; + uint32_t ulEDR; + + /* A human readable description of the exception cause. The strings used + are the same as the #define constant names found in the + microblaze_exceptions_i.h header file */ + int8_t *pcExceptionCause; + + /* The human readable name of the task that was running at the time the + exception occurred. This is the name that was given to the task when the + task was created using the FreeRTOS xTaskCreate() API function. */ + char *pcCurrentTaskName; + + /* The handle of the task that was running a the time the exception + occurred. */ + void * xCurrentTaskHandle; + +} xPortRegisterDump; + + +/* + * Installs pxHandler as the interrupt handler for the peripheral specified by + * the ucInterruptID parameter. + * + * ucInterruptID: + * + * The ID of the peripheral that will have pxHandler assigned as its interrupt + * handler. Peripheral IDs are defined in the xparameters.h header file, which + * is itself part of the BSP project. For example, in the official demo + * application for this port, xparameters.h defines the following IDs for the + * four possible interrupt sources: + * + * XPAR_INTC_0_UARTLITE_1_VEC_ID - for the UARTlite peripheral. + * XPAR_INTC_0_TMRCTR_0_VEC_ID - for the AXI Timer 0 peripheral. + * XPAR_INTC_0_EMACLITE_0_VEC_ID - for the Ethernet lite peripheral. + * XPAR_INTC_0_GPIO_1_VEC_ID - for the button inputs. + * + * + * pxHandler: + * + * A pointer to the interrupt handler function itself. This must be a void + * function that takes a (void *) parameter. + * + * + * pvCallBackRef: + * + * The parameter passed into the handler function. In many cases this will not + * be used and can be NULL. Some times it is used to pass in a reference to + * the peripheral instance variable, so it can be accessed from inside the + * handler function. + * + * + * pdPASS is returned if the function executes successfully. Any other value + * being returned indicates that the function did not execute correctly. + */ +BaseType_t xPortInstallInterruptHandler( uint8_t ucInterruptID, XInterruptHandler pxHandler, void *pvCallBackRef ); + + +/* + * Enables the interrupt, within the interrupt controller, for the peripheral + * specified by the ucInterruptID parameter. + * + * ucInterruptID: + * + * The ID of the peripheral that will have its interrupt enabled in the + * interrupt controller. Peripheral IDs are defined in the xparameters.h header + * file, which is itself part of the BSP project. For example, in the official + * demo application for this port, xparameters.h defines the following IDs for + * the four possible interrupt sources: + * + * XPAR_INTC_0_UARTLITE_1_VEC_ID - for the UARTlite peripheral. + * XPAR_INTC_0_TMRCTR_0_VEC_ID - for the AXI Timer 0 peripheral. + * XPAR_INTC_0_EMACLITE_0_VEC_ID - for the Ethernet lite peripheral. + * XPAR_INTC_0_GPIO_1_VEC_ID - for the button inputs. + * + */ +void vPortEnableInterrupt( uint8_t ucInterruptID ); + +/* + * Disables the interrupt, within the interrupt controller, for the peripheral + * specified by the ucInterruptID parameter. + * + * ucInterruptID: + * + * The ID of the peripheral that will have its interrupt disabled in the + * interrupt controller. Peripheral IDs are defined in the xparameters.h header + * file, which is itself part of the BSP project. For example, in the official + * demo application for this port, xparameters.h defines the following IDs for + * the four possible interrupt sources: + * + * XPAR_INTC_0_UARTLITE_1_VEC_ID - for the UARTlite peripheral. + * XPAR_INTC_0_TMRCTR_0_VEC_ID - for the AXI Timer 0 peripheral. + * XPAR_INTC_0_EMACLITE_0_VEC_ID - for the Ethernet lite peripheral. + * XPAR_INTC_0_GPIO_1_VEC_ID - for the button inputs. + * + */ +void vPortDisableInterrupt( uint8_t ucInterruptID ); + +/* + * This is an application defined callback function used to install the tick + * interrupt handler. It is provided as an application callback because the + * kernel will run on lots of different MicroBlaze and FPGA configurations - not + * all of which will have the same timer peripherals defined or available. This + * example uses the AXI Timer 0. If that is available on your hardware platform + * then this example callback implementation should not require modification. + * The name of the interrupt handler that should be installed is vPortTickISR(), + * which the function below declares as an extern. + */ +void vApplicationSetupTimerInterrupt( void ); + +/* + * This is an application defined callback function used to clear whichever + * interrupt was installed by the the vApplicationSetupTimerInterrupt() callback + * function - in this case the interrupt generated by the AXI timer. It is + * provided as an application callback because the kernel will run on lots of + * different MicroBlaze and FPGA configurations - not all of which will have the + * same timer peripherals defined or available. This example uses the AXI Timer 0. + * If that is available on your hardware platform then this example callback + * implementation should not require modification provided the example definition + * of vApplicationSetupTimerInterrupt() is also not modified. + */ +void vApplicationClearTimerInterrupt( void ); + +/* + * vPortExceptionsInstallHandlers() is only available when the MicroBlaze + * is configured to include exception functionality, and + * configINSTALL_EXCEPTION_HANDLERS is set to 1 in FreeRTOSConfig.h. + * + * vPortExceptionsInstallHandlers() installs the FreeRTOS exception handler + * for every possible exception cause. + * + * vPortExceptionsInstallHandlers() can be called explicitly from application + * code. After that is done, the default FreeRTOS exception handler that will + * have been installed can be replaced for any specific exception cause by using + * the standard Xilinx library function microblaze_register_exception_handler(). + * + * If vPortExceptionsInstallHandlers() is not called explicitly by the + * application, it will be called automatically by the kernel the first time + * xPortInstallInterruptHandler() is called. At that time, any exception + * handlers that may have already been installed will be replaced. + * + * See the description of vApplicationExceptionRegisterDump() for information + * on the processing performed by the FreeRTOS exception handler. + */ +void vPortExceptionsInstallHandlers( void ); + +/* + * The FreeRTOS exception handler fills an xPortRegisterDump structure (defined + * in portmacro.h) with the MicroBlaze context, as it was at the time the + * exception occurred. The exception handler then calls + * vApplicationExceptionRegisterDump(), passing in the completed + * xPortRegisterDump structure as its parameter. + * + * The FreeRTOS kernel provides its own implementation of + * vApplicationExceptionRegisterDump(), but the kernel provided implementation + * is declared as being 'weak'. The weak definition allows the application + * writer to provide their own implementation, should they wish to use the + * register dump information. For example, an implementation could be provided + * that wrote the register dump data to a display, or a UART port. + */ +void vApplicationExceptionRegisterDump( xPortRegisterDump *xRegisterDump ); + + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/MicroBlazeV9/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/MicroBlazeV9/port.c new file mode 100644 index 0000000..f7b7f4e --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/MicroBlazeV9/port.c @@ -0,0 +1,496 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the MicroBlaze port. + *----------------------------------------------------------*/ + + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Standard includes. */ +#include + +/* Hardware includes. */ +#include +#include +#include + +/* Tasks are started with a critical section nesting of 0 - however, prior to +the scheduler being commenced interrupts should not be enabled, so the critical +nesting variable is initialised to a non-zero value. */ +#define portINITIAL_NESTING_VALUE ( 0xff ) + +/* The bit within the MSR register that enabled/disables interrupts and +exceptions respectively. */ +#define portMSR_IE ( 0x02U ) +#define portMSR_EE ( 0x100U ) + +/* If the floating point unit is included in the MicroBlaze build, then the +FSR register is saved as part of the task context. portINITIAL_FSR is the value +given to the FSR register when the initial context is set up for a task being +created. */ +#define portINITIAL_FSR ( 0U ) + +/*-----------------------------------------------------------*/ + +/* + * Initialise the interrupt controller instance. + */ +static int32_t prvInitialiseInterruptController( void ); + +/* Ensure the interrupt controller instance variable is initialised before it is + * used, and that the initialisation only happens once. + */ +static int32_t prvEnsureInterruptControllerIsInitialised( void ); + +/*-----------------------------------------------------------*/ + +/* Counts the nesting depth of calls to portENTER_CRITICAL(). Each task +maintains its own count, so this variable is saved as part of the task +context. */ +volatile UBaseType_t uxCriticalNesting = portINITIAL_NESTING_VALUE; + +/* This port uses a separate stack for interrupts. This prevents the stack of +every task needing to be large enough to hold an entire interrupt stack on top +of the task stack. */ +uint32_t *pulISRStack; + +/* If an interrupt requests a context switch, then ulTaskSwitchRequested will +get set to 1. ulTaskSwitchRequested is inspected just before the main interrupt +handler exits. If, at that time, ulTaskSwitchRequested is set to 1, the kernel +will call vTaskSwitchContext() to ensure the task that runs immediately after +the interrupt exists is the highest priority task that is able to run. This is +an unusual mechanism, but is used for this port because a single interrupt can +cause the servicing of multiple peripherals - and it is inefficient to call +vTaskSwitchContext() multiple times as each peripheral is serviced. */ +volatile uint32_t ulTaskSwitchRequested = 0UL; + +/* The instance of the interrupt controller used by this port. This is required +by the Xilinx library API functions. */ +static XIntc xInterruptControllerInstance; + +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been made. + * + * See the portable.h header file. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +extern void *_SDA2_BASE_, *_SDA_BASE_; +const uint32_t ulR2 = ( uint32_t ) &_SDA2_BASE_; +const uint32_t ulR13 = ( uint32_t ) &_SDA_BASE_; +extern void _start1( void ); + + /* Place a few bytes of known values on the bottom of the stack. + This is essential for the Microblaze port and these lines must + not be omitted. */ + *pxTopOfStack = ( StackType_t ) 0x00000000; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x00000000; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x00000000; + pxTopOfStack--; + + #if( XPAR_MICROBLAZE_USE_FPU != 0 ) + /* The FSR value placed in the initial task context is just 0. */ + *pxTopOfStack = portINITIAL_FSR; + pxTopOfStack--; + #endif + + /* The MSR value placed in the initial task context should have interrupts + disabled. Each task will enable interrupts automatically when it enters + the running state for the first time. */ + *pxTopOfStack = mfmsr() & ~portMSR_IE; + + #if( MICROBLAZE_EXCEPTIONS_ENABLED == 1 ) + { + /* Ensure exceptions are enabled for the task. */ + *pxTopOfStack |= portMSR_EE; + } + #endif + + pxTopOfStack--; + + /* First stack an initial value for the critical section nesting. This + is initialised to zero. */ + *pxTopOfStack = ( StackType_t ) 0x00; + + /* R0 is always zero. */ + /* R1 is the SP. */ + + /* Place an initial value for all the general purpose registers. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) ulR2; /* R2 - read only small data area. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03; /* R3 - return values and temporaries. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04; /* R4 - return values and temporaries. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters;/* R5 contains the function call parameters. */ + + #ifdef portPRE_LOAD_STACK_FOR_DEBUGGING + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06; /* R6 - other parameters and temporaries. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07; /* R7 - other parameters and temporaries. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) NULL; /* R8 - other parameters and temporaries. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09; /* R9 - other parameters and temporaries. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x0a; /* R10 - other parameters and temporaries. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x0b; /* R11 - temporaries. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x0c; /* R12 - temporaries. */ + pxTopOfStack--; + #else + pxTopOfStack-= 8; + #endif + + *pxTopOfStack = ( StackType_t ) ulR13; /* R13 - read/write small data area. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* R14 - return address for interrupt. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) _start1; /* R15 - return address for subroutine. */ + + #ifdef portPRE_LOAD_STACK_FOR_DEBUGGING + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10; /* R16 - return address for trap (debugger). */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11; /* R17 - return address for exceptions, if configured. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12; /* R18 - reserved for assembler and compiler temporaries. */ + pxTopOfStack--; + #else + pxTopOfStack -= 4; + #endif + + *pxTopOfStack = ( StackType_t ) 0x00; /* R19 - must be saved across function calls. Callee-save. Seems to be interpreted as the frame pointer. */ + + #ifdef portPRE_LOAD_STACK_FOR_DEBUGGING + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x14; /* R20 - reserved for storing a pointer to the Global Offset Table (GOT) in Position Independent Code (PIC). Non-volatile in non-PIC code. Must be saved across function calls. Callee-save. Not used by FreeRTOS. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x15; /* R21 - must be saved across function calls. Callee-save. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x16; /* R22 - must be saved across function calls. Callee-save. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x17; /* R23 - must be saved across function calls. Callee-save. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x18; /* R24 - must be saved across function calls. Callee-save. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x19; /* R25 - must be saved across function calls. Callee-save. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x1a; /* R26 - must be saved across function calls. Callee-save. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x1b; /* R27 - must be saved across function calls. Callee-save. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x1c; /* R28 - must be saved across function calls. Callee-save. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x1d; /* R29 - must be saved across function calls. Callee-save. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x1e; /* R30 - must be saved across function calls. Callee-save. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x1f; /* R31 - must be saved across function calls. Callee-save. */ + pxTopOfStack--; + #else + pxTopOfStack -= 13; + #endif + + /* Return a pointer to the top of the stack that has been generated so this + can be stored in the task control block for the task. */ + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void ( vPortStartFirstTask )( void ); +extern uint32_t _stack[]; + + /* Setup the hardware to generate the tick. Interrupts are disabled when + this function is called. + + This port uses an application defined callback function to install the tick + interrupt handler because the kernel will run on lots of different + MicroBlaze and FPGA configurations - not all of which will have the same + timer peripherals defined or available. An example definition of + vApplicationSetupTimerInterrupt() is provided in the official demo + application that accompanies this port. */ + vApplicationSetupTimerInterrupt(); + + /* Reuse the stack from main() as the stack for the interrupts/exceptions. */ + pulISRStack = ( uint32_t * ) _stack; + + /* Ensure there is enough space for the functions called from the interrupt + service routines to write back into the stack frame of the caller. */ + pulISRStack -= 2; + + /* Restore the context of the first task that is going to run. From here + on, the created tasks will be executing. */ + vPortStartFirstTask(); + + /* Should not get here as the tasks are now running! */ + return pdFALSE; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +/* + * Manual context switch called by portYIELD or taskYIELD. + */ +void vPortYield( void ) +{ +extern void VPortYieldASM( void ); + + /* Perform the context switch in a critical section to assure it is + not interrupted by the tick ISR. It is not a problem to do this as + each task maintains its own interrupt status. */ + portENTER_CRITICAL(); + { + /* Jump directly to the yield function to ensure there is no + compiler generated prologue code. */ + asm volatile ( "bralid r14, VPortYieldASM \n\t" \ + "or r0, r0, r0 \n\t" ); + } + portEXIT_CRITICAL(); +} +/*-----------------------------------------------------------*/ + +void vPortEnableInterrupt( uint8_t ucInterruptID ) +{ +int32_t lReturn; + + /* An API function is provided to enable an interrupt in the interrupt + controller because the interrupt controller instance variable is private + to this file. */ + lReturn = prvEnsureInterruptControllerIsInitialised(); + if( lReturn == pdPASS ) + { + XIntc_Enable( &xInterruptControllerInstance, ucInterruptID ); + } + + configASSERT( lReturn ); +} +/*-----------------------------------------------------------*/ + +void vPortDisableInterrupt( uint8_t ucInterruptID ) +{ +int32_t lReturn; + + /* An API function is provided to disable an interrupt in the interrupt + controller because the interrupt controller instance variable is private + to this file. */ + lReturn = prvEnsureInterruptControllerIsInitialised(); + + if( lReturn == pdPASS ) + { + XIntc_Disable( &xInterruptControllerInstance, ucInterruptID ); + } + + configASSERT( lReturn ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortInstallInterruptHandler( uint8_t ucInterruptID, XInterruptHandler pxHandler, void *pvCallBackRef ) +{ +int32_t lReturn; + + /* An API function is provided to install an interrupt handler because the + interrupt controller instance variable is private to this file. */ + + lReturn = prvEnsureInterruptControllerIsInitialised(); + + if( lReturn == pdPASS ) + { + lReturn = XIntc_Connect( &xInterruptControllerInstance, ucInterruptID, pxHandler, pvCallBackRef ); + } + + if( lReturn == XST_SUCCESS ) + { + lReturn = pdPASS; + } + + configASSERT( lReturn == pdPASS ); + + return lReturn; +} +/*-----------------------------------------------------------*/ + +static int32_t prvEnsureInterruptControllerIsInitialised( void ) +{ +static int32_t lInterruptControllerInitialised = pdFALSE; +int32_t lReturn; + + /* Ensure the interrupt controller instance variable is initialised before + it is used, and that the initialisation only happens once. */ + if( lInterruptControllerInitialised != pdTRUE ) + { + lReturn = prvInitialiseInterruptController(); + + if( lReturn == pdPASS ) + { + lInterruptControllerInitialised = pdTRUE; + } + } + else + { + lReturn = pdPASS; + } + + return lReturn; +} +/*-----------------------------------------------------------*/ + +/* + * Handler for the timer interrupt. This is the handler that the application + * defined callback function vApplicationSetupTimerInterrupt() should install. + */ +void vPortTickISR( void *pvUnused ) +{ +extern void vApplicationClearTimerInterrupt( void ); + + /* Ensure the unused parameter does not generate a compiler warning. */ + ( void ) pvUnused; + + /* This port uses an application defined callback function to clear the tick + interrupt because the kernel will run on lots of different MicroBlaze and + FPGA configurations - not all of which will have the same timer peripherals + defined or available. An example definition of + vApplicationClearTimerInterrupt() is provided in the official demo + application that accompanies this port. */ + vApplicationClearTimerInterrupt(); + + /* Increment the RTOS tick - this might cause a task to unblock. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Force vTaskSwitchContext() to be called as the interrupt exits. */ + ulTaskSwitchRequested = 1; + } +} +/*-----------------------------------------------------------*/ + +static int32_t prvInitialiseInterruptController( void ) +{ +int32_t lStatus; + + lStatus = XIntc_Initialize( &xInterruptControllerInstance, configINTERRUPT_CONTROLLER_TO_USE ); + + if( lStatus == XST_SUCCESS ) + { + /* Initialise the exception table. */ + Xil_ExceptionInit(); + + /* Service all pending interrupts each time the handler is entered. */ + XIntc_SetIntrSvcOption( xInterruptControllerInstance.BaseAddress, XIN_SVC_ALL_ISRS_OPTION ); + + /* Install exception handlers if the MicroBlaze is configured to handle + exceptions, and the application defined constant + configINSTALL_EXCEPTION_HANDLERS is set to 1. */ + #if ( MICROBLAZE_EXCEPTIONS_ENABLED == 1 ) && ( configINSTALL_EXCEPTION_HANDLERS == 1 ) + { + vPortExceptionsInstallHandlers(); + } + #endif /* MICROBLAZE_EXCEPTIONS_ENABLED */ + + /* Start the interrupt controller. Interrupts are enabled when the + scheduler starts. */ + lStatus = XIntc_Start( &xInterruptControllerInstance, XIN_REAL_MODE ); + + if( lStatus == XST_SUCCESS ) + { + lStatus = pdPASS; + } + else + { + lStatus = pdFAIL; + } + } + + configASSERT( lStatus == pdPASS ); + + return lStatus; +} +/*-----------------------------------------------------------*/ + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/MicroBlazeV9/port_exceptions.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/MicroBlazeV9/port_exceptions.c new file mode 100644 index 0000000..a8b71d9 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/MicroBlazeV9/port_exceptions.c @@ -0,0 +1,324 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Hardware includes. */ +#include +#include + +/* The Xilinx library defined exception entry point stacks a number of +registers. These definitions are offsets from the stack pointer to the various +stacked register values. */ +#define portexR3_STACK_OFFSET 4 +#define portexR4_STACK_OFFSET 5 +#define portexR5_STACK_OFFSET 6 +#define portexR6_STACK_OFFSET 7 +#define portexR7_STACK_OFFSET 8 +#define portexR8_STACK_OFFSET 9 +#define portexR9_STACK_OFFSET 10 +#define portexR10_STACK_OFFSET 11 +#define portexR11_STACK_OFFSET 12 +#define portexR12_STACK_OFFSET 13 +#define portexR15_STACK_OFFSET 16 +#define portexR18_STACK_OFFSET 19 +#define portexMSR_STACK_OFFSET 20 +#define portexR19_STACK_OFFSET -1 + +/* This is defined to equal the size, in bytes, of the stack frame generated by +the Xilinx standard library exception entry point. It is required to determine +the stack pointer value prior to the exception being entered. */ +#define portexASM_HANDLER_STACK_FRAME_SIZE 84UL + +/* The number of bytes a MicroBlaze instruction consumes. */ +#define portexINSTRUCTION_SIZE 4 + +/* Exclude this entire file if the MicroBlaze is not configured to handle +exceptions, or the application defined configuration constant +configINSTALL_EXCEPTION_HANDLERS is not set to 1. */ +#if ( MICROBLAZE_EXCEPTIONS_ENABLED == 1 ) && ( configINSTALL_EXCEPTION_HANDLERS == 1 ) + +/* This variable is set in the exception entry code, before +vPortExceptionHandler is called. */ +uint32_t *pulStackPointerOnFunctionEntry = NULL; + +/* This is the structure that is filled with the MicroBlaze context as it +existed immediately prior to the exception occurrence. A pointer to this +structure is passed into the vApplicationExceptionRegisterDump() callback +function, if one is defined. */ +static xPortRegisterDump xRegisterDump; + +/* This is the FreeRTOS exception handler that is installed for all exception +types. It is called from vPortExceptionHanlderEntry() - which is itself defined +in portasm.S. */ +void vPortExceptionHandler( void *pvExceptionID ); +extern void vPortExceptionHandlerEntry( void *pvExceptionID ); + +/*-----------------------------------------------------------*/ + +/* vApplicationExceptionRegisterDump() is a callback function that the +application can optionally define to receive a populated xPortRegisterDump +structure. If the application chooses not to define a version of +vApplicationExceptionRegisterDump() then this weekly defined default +implementation will be called instead. */ +extern void vApplicationExceptionRegisterDump( xPortRegisterDump *xRegisterDump ) __attribute__((weak)); +void vApplicationExceptionRegisterDump( xPortRegisterDump *xRegisterDump ) +{ + ( void ) xRegisterDump; + + for( ;; ) + { + portNOP(); + } +} +/*-----------------------------------------------------------*/ + +void vPortExceptionHandler( void *pvExceptionID ) +{ +extern void *pxCurrentTCB; + + /* Fill an xPortRegisterDump structure with the MicroBlaze context as it + was immediately before the exception occurrence. */ + + /* First fill in the name and handle of the task that was in the Running + state when the exception occurred. */ + xRegisterDump.xCurrentTaskHandle = pxCurrentTCB; + xRegisterDump.pcCurrentTaskName = pcTaskGetName( NULL ); + + configASSERT( pulStackPointerOnFunctionEntry ); + + /* Obtain the values of registers that were stacked prior to this function + being called, and may have changed since they were stacked. */ + xRegisterDump.ulR3 = pulStackPointerOnFunctionEntry[ portexR3_STACK_OFFSET ]; + xRegisterDump.ulR4 = pulStackPointerOnFunctionEntry[ portexR4_STACK_OFFSET ]; + xRegisterDump.ulR5 = pulStackPointerOnFunctionEntry[ portexR5_STACK_OFFSET ]; + xRegisterDump.ulR6 = pulStackPointerOnFunctionEntry[ portexR6_STACK_OFFSET ]; + xRegisterDump.ulR7 = pulStackPointerOnFunctionEntry[ portexR7_STACK_OFFSET ]; + xRegisterDump.ulR8 = pulStackPointerOnFunctionEntry[ portexR8_STACK_OFFSET ]; + xRegisterDump.ulR9 = pulStackPointerOnFunctionEntry[ portexR9_STACK_OFFSET ]; + xRegisterDump.ulR10 = pulStackPointerOnFunctionEntry[ portexR10_STACK_OFFSET ]; + xRegisterDump.ulR11 = pulStackPointerOnFunctionEntry[ portexR11_STACK_OFFSET ]; + xRegisterDump.ulR12 = pulStackPointerOnFunctionEntry[ portexR12_STACK_OFFSET ]; + xRegisterDump.ulR15_return_address_from_subroutine = pulStackPointerOnFunctionEntry[ portexR15_STACK_OFFSET ]; + xRegisterDump.ulR18 = pulStackPointerOnFunctionEntry[ portexR18_STACK_OFFSET ]; + xRegisterDump.ulR19 = pulStackPointerOnFunctionEntry[ portexR19_STACK_OFFSET ]; + xRegisterDump.ulMSR = pulStackPointerOnFunctionEntry[ portexMSR_STACK_OFFSET ]; + + /* Obtain the value of all other registers. */ + xRegisterDump.ulR2_small_data_area = mfgpr( R2 ); + xRegisterDump.ulR13_read_write_small_data_area = mfgpr( R13 ); + xRegisterDump.ulR14_return_address_from_interrupt = mfgpr( R14 ); + xRegisterDump.ulR16_return_address_from_trap = mfgpr( R16 ); + xRegisterDump.ulR17_return_address_from_exceptions = mfgpr( R17 ); + xRegisterDump.ulR20 = mfgpr( R20 ); + xRegisterDump.ulR21 = mfgpr( R21 ); + xRegisterDump.ulR22 = mfgpr( R22 ); + xRegisterDump.ulR23 = mfgpr( R23 ); + xRegisterDump.ulR24 = mfgpr( R24 ); + xRegisterDump.ulR25 = mfgpr( R25 ); + xRegisterDump.ulR26 = mfgpr( R26 ); + xRegisterDump.ulR27 = mfgpr( R27 ); + xRegisterDump.ulR28 = mfgpr( R28 ); + xRegisterDump.ulR29 = mfgpr( R29 ); + xRegisterDump.ulR30 = mfgpr( R30 ); + xRegisterDump.ulR31 = mfgpr( R31 ); + xRegisterDump.ulR1_SP = ( ( uint32_t ) pulStackPointerOnFunctionEntry ) + portexASM_HANDLER_STACK_FRAME_SIZE; + xRegisterDump.ulEAR = mfear(); + xRegisterDump.ulESR = mfesr(); + xRegisterDump.ulEDR = mfedr(); + + /* Move the saved program counter back to the instruction that was executed + when the exception occurred. This is only valid for certain types of + exception. */ + xRegisterDump.ulPC = xRegisterDump.ulR17_return_address_from_exceptions - portexINSTRUCTION_SIZE; + + #if( XPAR_MICROBLAZE_USE_FPU != 0 ) + { + xRegisterDump.ulFSR = mffsr(); + } + #else + { + xRegisterDump.ulFSR = 0UL; + } + #endif + + /* Also fill in a string that describes what type of exception this is. + The string uses the same ID names as defined in the MicroBlaze standard + library exception header files. */ + switch( ( uint32_t ) pvExceptionID ) + { + case XEXC_ID_FSL : + xRegisterDump.pcExceptionCause = ( int8_t * const ) "XEXC_ID_FSL"; + break; + + case XEXC_ID_UNALIGNED_ACCESS : + xRegisterDump.pcExceptionCause = ( int8_t * const ) "XEXC_ID_UNALIGNED_ACCESS"; + break; + + case XEXC_ID_ILLEGAL_OPCODE : + xRegisterDump.pcExceptionCause = ( int8_t * const ) "XEXC_ID_ILLEGAL_OPCODE"; + break; + + case XEXC_ID_M_AXI_I_EXCEPTION : + xRegisterDump.pcExceptionCause = ( int8_t * const ) "XEXC_ID_M_AXI_I_EXCEPTION or XEXC_ID_IPLB_EXCEPTION"; + break; + + case XEXC_ID_M_AXI_D_EXCEPTION : + xRegisterDump.pcExceptionCause = ( int8_t * const ) "XEXC_ID_M_AXI_D_EXCEPTION or XEXC_ID_DPLB_EXCEPTION"; + break; + + case XEXC_ID_DIV_BY_ZERO : + xRegisterDump.pcExceptionCause = ( int8_t * const ) "XEXC_ID_DIV_BY_ZERO"; + break; + + case XEXC_ID_STACK_VIOLATION : + xRegisterDump.pcExceptionCause = ( int8_t * const ) "XEXC_ID_STACK_VIOLATION or XEXC_ID_MMU"; + break; + + #if( XPAR_MICROBLAZE_USE_FPU != 0 ) + + case XEXC_ID_FPU : + xRegisterDump.pcExceptionCause = ( int8_t * const ) "XEXC_ID_FPU see ulFSR value"; + break; + + #endif /* XPAR_MICROBLAZE_USE_FPU */ + } + + /* vApplicationExceptionRegisterDump() is a callback function that the + application can optionally define to receive the populated xPortRegisterDump + structure. If the application chooses not to define a version of + vApplicationExceptionRegisterDump() then the weekly defined default + implementation within this file will be called instead. */ + vApplicationExceptionRegisterDump( &xRegisterDump ); + + /* Must not attempt to leave this function! */ + for( ;; ) + { + portNOP(); + } +} +/*-----------------------------------------------------------*/ + +void vPortExceptionsInstallHandlers( void ) +{ +static uint32_t ulHandlersAlreadyInstalled = pdFALSE; + + if( ulHandlersAlreadyInstalled == pdFALSE ) + { + ulHandlersAlreadyInstalled = pdTRUE; + + #if XPAR_MICROBLAZE_UNALIGNED_EXCEPTIONS == 1 + microblaze_register_exception_handler( XEXC_ID_UNALIGNED_ACCESS, vPortExceptionHandlerEntry, ( void * ) XEXC_ID_UNALIGNED_ACCESS ); + #endif /* XPAR_MICROBLAZE_UNALIGNED_EXCEPTIONS*/ + + #if XPAR_MICROBLAZE_ILL_OPCODE_EXCEPTION == 1 + microblaze_register_exception_handler( XEXC_ID_ILLEGAL_OPCODE, vPortExceptionHandlerEntry, ( void * ) XEXC_ID_ILLEGAL_OPCODE ); + #endif /* XPAR_MICROBLAZE_ILL_OPCODE_EXCEPTION */ + + #if XPAR_MICROBLAZE_M_AXI_I_BUS_EXCEPTION == 1 + microblaze_register_exception_handler( XEXC_ID_M_AXI_I_EXCEPTION, vPortExceptionHandlerEntry, ( void * ) XEXC_ID_M_AXI_I_EXCEPTION ); + #endif /* XPAR_MICROBLAZE_M_AXI_I_BUS_EXCEPTION */ + + #if XPAR_MICROBLAZE_M_AXI_D_BUS_EXCEPTION == 1 + microblaze_register_exception_handler( XEXC_ID_M_AXI_D_EXCEPTION, vPortExceptionHandlerEntry, ( void * ) XEXC_ID_M_AXI_D_EXCEPTION ); + #endif /* XPAR_MICROBLAZE_M_AXI_D_BUS_EXCEPTION */ + + #if XPAR_MICROBLAZE_IPLB_BUS_EXCEPTION == 1 + microblaze_register_exception_handler( XEXC_ID_IPLB_EXCEPTION, vPortExceptionHandlerEntry, ( void * ) XEXC_ID_IPLB_EXCEPTION ); + #endif /* XPAR_MICROBLAZE_IPLB_BUS_EXCEPTION */ + + #if XPAR_MICROBLAZE_DPLB_BUS_EXCEPTION == 1 + microblaze_register_exception_handler( XEXC_ID_DPLB_EXCEPTION, vPortExceptionHandlerEntry, ( void * ) XEXC_ID_DPLB_EXCEPTION ); + #endif /* XPAR_MICROBLAZE_DPLB_BUS_EXCEPTION */ + + #if XPAR_MICROBLAZE_DIV_ZERO_EXCEPTION == 1 + microblaze_register_exception_handler( XEXC_ID_DIV_BY_ZERO, vPortExceptionHandlerEntry, ( void * ) XEXC_ID_DIV_BY_ZERO ); + #endif /* XPAR_MICROBLAZE_DIV_ZERO_EXCEPTION */ + + #if XPAR_MICROBLAZE_FPU_EXCEPTION == 1 + microblaze_register_exception_handler( XEXC_ID_FPU, vPortExceptionHandlerEntry, ( void * ) XEXC_ID_FPU ); + #endif /* XPAR_MICROBLAZE_FPU_EXCEPTION */ + + #if XPAR_MICROBLAZE_FSL_EXCEPTION == 1 + microblaze_register_exception_handler( XEXC_ID_FSL, vPortExceptionHandlerEntry, ( void * ) XEXC_ID_FSL ); + #endif /* XPAR_MICROBLAZE_FSL_EXCEPTION */ + + microblaze_enable_exceptions(); + } +} + +/* Exclude the entire file if the MicroBlaze is not configured to handle +exceptions, or the application defined configuration item +configINSTALL_EXCEPTION_HANDLERS is not set to 1. */ +#endif /* ( MICROBLAZE_EXCEPTIONS_ENABLED == 1 ) && ( configINSTALL_EXCEPTION_HANDLERS == 1 ) */ + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/MicroBlazeV9/portasm.S b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/MicroBlazeV9/portasm.S new file mode 100644 index 0000000..4084578 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/MicroBlazeV9/portasm.S @@ -0,0 +1,370 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* FreeRTOS includes. */ +#include "FreeRTOSConfig.h" + +/* Xilinx library includes. */ +#include "microblaze_exceptions_g.h" +#include "xparameters.h" + +/* The context is oversized to allow functions called from the ISR to write +back into the caller stack. */ +#if( XPAR_MICROBLAZE_USE_FPU != 0 ) + #define portCONTEXT_SIZE 136 + #define portMINUS_CONTEXT_SIZE -136 +#else + #define portCONTEXT_SIZE 132 + #define portMINUS_CONTEXT_SIZE -132 +#endif + +/* Offsets from the stack pointer at which saved registers are placed. */ +#define portR31_OFFSET 4 +#define portR30_OFFSET 8 +#define portR29_OFFSET 12 +#define portR28_OFFSET 16 +#define portR27_OFFSET 20 +#define portR26_OFFSET 24 +#define portR25_OFFSET 28 +#define portR24_OFFSET 32 +#define portR23_OFFSET 36 +#define portR22_OFFSET 40 +#define portR21_OFFSET 44 +#define portR20_OFFSET 48 +#define portR19_OFFSET 52 +#define portR18_OFFSET 56 +#define portR17_OFFSET 60 +#define portR16_OFFSET 64 +#define portR15_OFFSET 68 +#define portR14_OFFSET 72 +#define portR13_OFFSET 76 +#define portR12_OFFSET 80 +#define portR11_OFFSET 84 +#define portR10_OFFSET 88 +#define portR9_OFFSET 92 +#define portR8_OFFSET 96 +#define portR7_OFFSET 100 +#define portR6_OFFSET 104 +#define portR5_OFFSET 108 +#define portR4_OFFSET 112 +#define portR3_OFFSET 116 +#define portR2_OFFSET 120 +#define portCRITICAL_NESTING_OFFSET 124 +#define portMSR_OFFSET 128 +#define portFSR_OFFSET 132 + + .extern pxCurrentTCB + .extern XIntc_DeviceInterruptHandler + .extern vTaskSwitchContext + .extern uxCriticalNesting + .extern pulISRStack + .extern ulTaskSwitchRequested + .extern vPortExceptionHandler + .extern pulStackPointerOnFunctionEntry + + .global _interrupt_handler + .global VPortYieldASM + .global vPortStartFirstTask + .global vPortExceptionHandlerEntry + + +.macro portSAVE_CONTEXT + + /* Make room for the context on the stack. */ + addik r1, r1, portMINUS_CONTEXT_SIZE + + /* Stack general registers. */ + swi r31, r1, portR31_OFFSET + swi r30, r1, portR30_OFFSET + swi r29, r1, portR29_OFFSET + swi r28, r1, portR28_OFFSET + swi r27, r1, portR27_OFFSET + swi r26, r1, portR26_OFFSET + swi r25, r1, portR25_OFFSET + swi r24, r1, portR24_OFFSET + swi r23, r1, portR23_OFFSET + swi r22, r1, portR22_OFFSET + swi r21, r1, portR21_OFFSET + swi r20, r1, portR20_OFFSET + swi r19, r1, portR19_OFFSET + swi r18, r1, portR18_OFFSET + swi r17, r1, portR17_OFFSET + swi r16, r1, portR16_OFFSET + swi r15, r1, portR15_OFFSET + /* R14 is saved later as it needs adjustment if a yield is performed. */ + swi r13, r1, portR13_OFFSET + swi r12, r1, portR12_OFFSET + swi r11, r1, portR11_OFFSET + swi r10, r1, portR10_OFFSET + swi r9, r1, portR9_OFFSET + swi r8, r1, portR8_OFFSET + swi r7, r1, portR7_OFFSET + swi r6, r1, portR6_OFFSET + swi r5, r1, portR5_OFFSET + swi r4, r1, portR4_OFFSET + swi r3, r1, portR3_OFFSET + swi r2, r1, portR2_OFFSET + + /* Stack the critical section nesting value. */ + lwi r18, r0, uxCriticalNesting + swi r18, r1, portCRITICAL_NESTING_OFFSET + + /* Stack MSR. */ + mfs r18, rmsr + swi r18, r1, portMSR_OFFSET + + #if( XPAR_MICROBLAZE_USE_FPU != 0 ) + /* Stack FSR. */ + mfs r18, rfsr + swi r18, r1, portFSR_OFFSET + #endif + + /* Save the top of stack value to the TCB. */ + lwi r3, r0, pxCurrentTCB + sw r1, r0, r3 + + .endm + +.macro portRESTORE_CONTEXT + + /* Load the top of stack value from the TCB. */ + lwi r18, r0, pxCurrentTCB + lw r1, r0, r18 + + /* Restore the general registers. */ + lwi r31, r1, portR31_OFFSET + lwi r30, r1, portR30_OFFSET + lwi r29, r1, portR29_OFFSET + lwi r28, r1, portR28_OFFSET + lwi r27, r1, portR27_OFFSET + lwi r26, r1, portR26_OFFSET + lwi r25, r1, portR25_OFFSET + lwi r24, r1, portR24_OFFSET + lwi r23, r1, portR23_OFFSET + lwi r22, r1, portR22_OFFSET + lwi r21, r1, portR21_OFFSET + lwi r20, r1, portR20_OFFSET + lwi r19, r1, portR19_OFFSET + lwi r17, r1, portR17_OFFSET + lwi r16, r1, portR16_OFFSET + lwi r15, r1, portR15_OFFSET + lwi r14, r1, portR14_OFFSET + lwi r13, r1, portR13_OFFSET + lwi r12, r1, portR12_OFFSET + lwi r11, r1, portR11_OFFSET + lwi r10, r1, portR10_OFFSET + lwi r9, r1, portR9_OFFSET + lwi r8, r1, portR8_OFFSET + lwi r7, r1, portR7_OFFSET + lwi r6, r1, portR6_OFFSET + lwi r5, r1, portR5_OFFSET + lwi r4, r1, portR4_OFFSET + lwi r3, r1, portR3_OFFSET + lwi r2, r1, portR2_OFFSET + + /* Reload the rmsr from the stack. */ + lwi r18, r1, portMSR_OFFSET + mts rmsr, r18 + + #if( XPAR_MICROBLAZE_USE_FPU != 0 ) + /* Reload the FSR from the stack. */ + lwi r18, r1, portFSR_OFFSET + mts rfsr, r18 + #endif + + /* Load the critical nesting value. */ + lwi r18, r1, portCRITICAL_NESTING_OFFSET + swi r18, r0, uxCriticalNesting + + /* Test the critical nesting value. If it is non zero then the task last + exited the running state using a yield. If it is zero, then the task + last exited the running state through an interrupt. */ + xori r18, r18, 0 + bnei r18, exit_from_yield + + /* r18 was being used as a temporary. Now restore its true value from the + stack. */ + lwi r18, r1, portR18_OFFSET + + /* Remove the stack frame. */ + addik r1, r1, portCONTEXT_SIZE + + /* Return using rtid so interrupts are re-enabled as this function is + exited. */ + rtid r14, 0 + or r0, r0, r0 + + .endm + +/* This function is used to exit portRESTORE_CONTEXT() if the task being +returned to last left the Running state by calling taskYIELD() (rather than +being preempted by an interrupt). */ + .text + .align 4 +exit_from_yield: + + /* r18 was being used as a temporary. Now restore its true value from the + stack. */ + lwi r18, r1, portR18_OFFSET + + /* Remove the stack frame. */ + addik r1, r1, portCONTEXT_SIZE + + /* Return to the task. */ + rtsd r14, 0 + or r0, r0, r0 + + + .text + .align 4 +_interrupt_handler: + + portSAVE_CONTEXT + + /* Stack the return address. */ + swi r14, r1, portR14_OFFSET + + /* Switch to the ISR stack. */ + lwi r1, r0, pulISRStack + + /* The parameter to the interrupt handler. */ + ori r5, r0, configINTERRUPT_CONTROLLER_TO_USE + + /* Execute any pending interrupts. */ + bralid r15, XIntc_DeviceInterruptHandler + or r0, r0, r0 + + /* See if a new task should be selected to execute. */ + lwi r18, r0, ulTaskSwitchRequested + or r18, r18, r0 + + /* If ulTaskSwitchRequested is already zero, then jump straight to + restoring the task that is already in the Running state. */ + beqi r18, task_switch_not_requested + + /* Set ulTaskSwitchRequested back to zero as a task switch is about to be + performed. */ + swi r0, r0, ulTaskSwitchRequested + + /* ulTaskSwitchRequested was not 0 when tested. Select the next task to + execute. */ + bralid r15, vTaskSwitchContext + or r0, r0, r0 + +task_switch_not_requested: + + /* Restore the context of the next task scheduled to execute. */ + portRESTORE_CONTEXT + + + .text + .align 4 +VPortYieldASM: + + portSAVE_CONTEXT + + /* Modify the return address so a return is done to the instruction after + the call to VPortYieldASM. */ + addi r14, r14, 8 + swi r14, r1, portR14_OFFSET + + /* Switch to use the ISR stack. */ + lwi r1, r0, pulISRStack + + /* Select the next task to execute. */ + bralid r15, vTaskSwitchContext + or r0, r0, r0 + + /* Restore the context of the next task scheduled to execute. */ + portRESTORE_CONTEXT + + .text + .align 4 +vPortStartFirstTask: + + portRESTORE_CONTEXT + + + +#if ( MICROBLAZE_EXCEPTIONS_ENABLED == 1 ) && ( configINSTALL_EXCEPTION_HANDLERS == 1 ) + + .text + .align 4 +vPortExceptionHandlerEntry: + + /* Take a copy of the stack pointer before vPortExecptionHandler is called, + storing its value prior to the function stack frame being created. */ + swi r1, r0, pulStackPointerOnFunctionEntry + bralid r15, vPortExceptionHandler + or r0, r0, r0 + +#endif /* ( MICROBLAZE_EXCEPTIONS_ENABLED == 1 ) && ( configINSTALL_EXCEPTION_HANDLERS == 1 ) */ + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/MicroBlazeV9/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/MicroBlazeV9/portmacro.h new file mode 100644 index 0000000..15866d2 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/MicroBlazeV9/portmacro.h @@ -0,0 +1,411 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* BSP includes. */ +#include +#include + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Interrupt control macros and functions. */ +void microblaze_disable_interrupts( void ); +void microblaze_enable_interrupts( void ); +#define portDISABLE_INTERRUPTS() microblaze_disable_interrupts() +#define portENABLE_INTERRUPTS() microblaze_enable_interrupts() +/*-----------------------------------------------------------*/ + +/* Critical section macros. */ +void vPortEnterCritical( void ); +void vPortExitCritical( void ); +#define portENTER_CRITICAL() { \ + extern volatile UBaseType_t uxCriticalNesting; \ + microblaze_disable_interrupts(); \ + uxCriticalNesting++; \ + } + +#define portEXIT_CRITICAL() { \ + extern volatile UBaseType_t uxCriticalNesting; \ + /* Interrupts are disabled, so we can */ \ + /* access the variable directly. */ \ + uxCriticalNesting--; \ + if( uxCriticalNesting == 0 ) \ + { \ + /* The nesting has unwound and we \ + can enable interrupts again. */ \ + portENABLE_INTERRUPTS(); \ + } \ + } + +/*-----------------------------------------------------------*/ + +/* The yield macro maps directly to the vPortYield() function. */ +void vPortYield( void ); +#define portYIELD() vPortYield() + +/* portYIELD_FROM_ISR() does not directly call vTaskSwitchContext(), but instead +sets a flag to say that a yield has been requested. The interrupt exit code +then checks this flag, and calls vTaskSwitchContext() before restoring a task +context, if the flag is not false. This is done to prevent multiple calls to +vTaskSwitchContext() being made from a single interrupt, as a single interrupt +can result in multiple peripherals being serviced. */ +extern volatile uint32_t ulTaskSwitchRequested; +#define portYIELD_FROM_ISR( x ) if( ( x ) != pdFALSE ) ulTaskSwitchRequested = 1 + +#if( configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 ) + + /* Generic helper function. */ + __attribute__( ( always_inline ) ) static inline uint8_t ucPortCountLeadingZeros( uint32_t ulBitmap ) + { + uint8_t ucReturn; + + __asm volatile ( "clz %0, %1" : "=r" ( ucReturn ) : "r" ( ulBitmap ) ); + return ucReturn; + } + + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) ucPortCountLeadingZeros( ( uxReadyPriorities ) ) ) + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 4 +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portNOP() asm volatile ( "NOP" ) +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*-----------------------------------------------------------*/ + +/* The following structure is used by the FreeRTOS exception handler. It is +filled with the MicroBlaze context as it was at the time the exception occurred. +This is done as an aid to debugging exception occurrences. */ +typedef struct PORT_REGISTER_DUMP +{ + /* The following structure members hold the values of the MicroBlaze + registers at the time the exception was raised. */ + uint32_t ulR1_SP; + uint32_t ulR2_small_data_area; + uint32_t ulR3; + uint32_t ulR4; + uint32_t ulR5; + uint32_t ulR6; + uint32_t ulR7; + uint32_t ulR8; + uint32_t ulR9; + uint32_t ulR10; + uint32_t ulR11; + uint32_t ulR12; + uint32_t ulR13_read_write_small_data_area; + uint32_t ulR14_return_address_from_interrupt; + uint32_t ulR15_return_address_from_subroutine; + uint32_t ulR16_return_address_from_trap; + uint32_t ulR17_return_address_from_exceptions; /* The exception entry code will copy the BTR into R17 if the exception occurred in the delay slot of a branch instruction. */ + uint32_t ulR18; + uint32_t ulR19; + uint32_t ulR20; + uint32_t ulR21; + uint32_t ulR22; + uint32_t ulR23; + uint32_t ulR24; + uint32_t ulR25; + uint32_t ulR26; + uint32_t ulR27; + uint32_t ulR28; + uint32_t ulR29; + uint32_t ulR30; + uint32_t ulR31; + uint32_t ulPC; + uint32_t ulESR; + uint32_t ulMSR; + uint32_t ulEAR; + uint32_t ulFSR; + uint32_t ulEDR; + + /* A human readable description of the exception cause. The strings used + are the same as the #define constant names found in the + microblaze_exceptions_i.h header file */ + int8_t *pcExceptionCause; + + /* The human readable name of the task that was running at the time the + exception occurred. This is the name that was given to the task when the + task was created using the FreeRTOS xTaskCreate() API function. */ + char *pcCurrentTaskName; + + /* The handle of the task that was running a the time the exception + occurred. */ + void * xCurrentTaskHandle; + +} xPortRegisterDump; + + +/* + * Installs pxHandler as the interrupt handler for the peripheral specified by + * the ucInterruptID parameter. + * + * ucInterruptID: + * + * The ID of the peripheral that will have pxHandler assigned as its interrupt + * handler. Peripheral IDs are defined in the xparameters.h header file, which + * is itself part of the BSP project. For example, in the official demo + * application for this port, xparameters.h defines the following IDs for the + * four possible interrupt sources: + * + * XPAR_INTC_0_UARTLITE_1_VEC_ID - for the UARTlite peripheral. + * XPAR_INTC_0_TMRCTR_0_VEC_ID - for the AXI Timer 0 peripheral. + * XPAR_INTC_0_EMACLITE_0_VEC_ID - for the Ethernet lite peripheral. + * XPAR_INTC_0_GPIO_1_VEC_ID - for the button inputs. + * + * + * pxHandler: + * + * A pointer to the interrupt handler function itself. This must be a void + * function that takes a (void *) parameter. + * + * + * pvCallBackRef: + * + * The parameter passed into the handler function. In many cases this will not + * be used and can be NULL. Some times it is used to pass in a reference to + * the peripheral instance variable, so it can be accessed from inside the + * handler function. + * + * + * pdPASS is returned if the function executes successfully. Any other value + * being returned indicates that the function did not execute correctly. + */ +BaseType_t xPortInstallInterruptHandler( uint8_t ucInterruptID, XInterruptHandler pxHandler, void *pvCallBackRef ); + + +/* + * Enables the interrupt, within the interrupt controller, for the peripheral + * specified by the ucInterruptID parameter. + * + * ucInterruptID: + * + * The ID of the peripheral that will have its interrupt enabled in the + * interrupt controller. Peripheral IDs are defined in the xparameters.h header + * file, which is itself part of the BSP project. For example, in the official + * demo application for this port, xparameters.h defines the following IDs for + * the four possible interrupt sources: + * + * XPAR_INTC_0_UARTLITE_1_VEC_ID - for the UARTlite peripheral. + * XPAR_INTC_0_TMRCTR_0_VEC_ID - for the AXI Timer 0 peripheral. + * XPAR_INTC_0_EMACLITE_0_VEC_ID - for the Ethernet lite peripheral. + * XPAR_INTC_0_GPIO_1_VEC_ID - for the button inputs. + * + */ +void vPortEnableInterrupt( uint8_t ucInterruptID ); + +/* + * Disables the interrupt, within the interrupt controller, for the peripheral + * specified by the ucInterruptID parameter. + * + * ucInterruptID: + * + * The ID of the peripheral that will have its interrupt disabled in the + * interrupt controller. Peripheral IDs are defined in the xparameters.h header + * file, which is itself part of the BSP project. For example, in the official + * demo application for this port, xparameters.h defines the following IDs for + * the four possible interrupt sources: + * + * XPAR_INTC_0_UARTLITE_1_VEC_ID - for the UARTlite peripheral. + * XPAR_INTC_0_TMRCTR_0_VEC_ID - for the AXI Timer 0 peripheral. + * XPAR_INTC_0_EMACLITE_0_VEC_ID - for the Ethernet lite peripheral. + * XPAR_INTC_0_GPIO_1_VEC_ID - for the button inputs. + * + */ +void vPortDisableInterrupt( uint8_t ucInterruptID ); + +/* + * This is an application defined callback function used to install the tick + * interrupt handler. It is provided as an application callback because the + * kernel will run on lots of different MicroBlaze and FPGA configurations - not + * all of which will have the same timer peripherals defined or available. This + * example uses the AXI Timer 0. If that is available on your hardware platform + * then this example callback implementation should not require modification. + * The name of the interrupt handler that should be installed is vPortTickISR(), + * which the function below declares as an extern. + */ +void vApplicationSetupTimerInterrupt( void ); + +/* + * This is an application defined callback function used to clear whichever + * interrupt was installed by the the vApplicationSetupTimerInterrupt() callback + * function - in this case the interrupt generated by the AXI timer. It is + * provided as an application callback because the kernel will run on lots of + * different MicroBlaze and FPGA configurations - not all of which will have the + * same timer peripherals defined or available. This example uses the AXI Timer 0. + * If that is available on your hardware platform then this example callback + * implementation should not require modification provided the example definition + * of vApplicationSetupTimerInterrupt() is also not modified. + */ +void vApplicationClearTimerInterrupt( void ); + +/* + * vPortExceptionsInstallHandlers() is only available when the MicroBlaze + * is configured to include exception functionality, and + * configINSTALL_EXCEPTION_HANDLERS is set to 1 in FreeRTOSConfig.h. + * + * vPortExceptionsInstallHandlers() installs the FreeRTOS exception handler + * for every possible exception cause. + * + * vPortExceptionsInstallHandlers() can be called explicitly from application + * code. After that is done, the default FreeRTOS exception handler that will + * have been installed can be replaced for any specific exception cause by using + * the standard Xilinx library function microblaze_register_exception_handler(). + * + * If vPortExceptionsInstallHandlers() is not called explicitly by the + * application, it will be called automatically by the kernel the first time + * xPortInstallInterruptHandler() is called. At that time, any exception + * handlers that may have already been installed will be replaced. + * + * See the description of vApplicationExceptionRegisterDump() for information + * on the processing performed by the FreeRTOS exception handler. + */ +void vPortExceptionsInstallHandlers( void ); + +/* + * The FreeRTOS exception handler fills an xPortRegisterDump structure (defined + * in portmacro.h) with the MicroBlaze context, as it was at the time the + * exception occurred. The exception handler then calls + * vApplicationExceptionRegisterDump(), passing in the completed + * xPortRegisterDump structure as its parameter. + * + * The FreeRTOS kernel provides its own implementation of + * vApplicationExceptionRegisterDump(), but the kernel provided implementation + * is declared as being 'weak'. The weak definition allows the application + * writer to provide their own implementation, should they wish to use the + * register dump information. For example, an implementation could be provided + * that wrote the register dump data to a display, or a UART port. + */ +void vApplicationExceptionRegisterDump( xPortRegisterDump *xRegisterDump ); + + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/NiosII/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/NiosII/port.c new file mode 100644 index 0000000..b288d84 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/NiosII/port.c @@ -0,0 +1,245 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the NIOS2 port. + *----------------------------------------------------------*/ + +/* Standard Includes. */ +#include +#include + +/* Altera includes. */ +#include "sys/alt_irq.h" +#include "altera_avalon_timer_regs.h" +#include "priv/alt_irq_table.h" + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Interrupts are enabled. */ +#define portINITIAL_ESTATUS ( StackType_t ) 0x01 + +/*-----------------------------------------------------------*/ + +/* + * Setup the timer to generate the tick interrupts. + */ +static void prvSetupTimerInterrupt( void ); + +/* + * Call back for the alarm function. + */ +void vPortSysTickHandler( void * context, alt_u32 id ); + +/*-----------------------------------------------------------*/ + +static void prvReadGp( uint32_t *ulValue ) +{ + asm( "stw gp, (%0)" :: "r"(ulValue) ); +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +StackType_t *pxFramePointer = pxTopOfStack - 1; +StackType_t xGlobalPointer; + + prvReadGp( &xGlobalPointer ); + + /* End of stack marker. */ + *pxTopOfStack = 0xdeadbeef; + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) pxFramePointer; + pxTopOfStack--; + + *pxTopOfStack = xGlobalPointer; + + /* Space for R23 to R16. */ + pxTopOfStack -= 9; + + *pxTopOfStack = ( StackType_t ) pxCode; + pxTopOfStack--; + + *pxTopOfStack = portINITIAL_ESTATUS; + + /* Space for R15 to R5. */ + pxTopOfStack -= 12; + + *pxTopOfStack = ( StackType_t ) pvParameters; + + /* Space for R3 to R1, muldiv and RA. */ + pxTopOfStack -= 5; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + prvSetupTimerInterrupt(); + + /* Start the first task. */ + asm volatile ( " movia r2, restore_sp_from_pxCurrentTCB \n" + " jmp r2 " ); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the NIOS2 port will require this function as there + is nothing to return to. */ +} +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +void prvSetupTimerInterrupt( void ) +{ + /* Try to register the interrupt handler. */ + if ( -EINVAL == alt_irq_register( SYS_CLK_IRQ, 0x0, vPortSysTickHandler ) ) + { + /* Failed to install the Interrupt Handler. */ + asm( "break" ); + } + else + { + /* Configure SysTick to interrupt at the requested rate. */ + IOWR_ALTERA_AVALON_TIMER_CONTROL( SYS_CLK_BASE, ALTERA_AVALON_TIMER_CONTROL_STOP_MSK ); + IOWR_ALTERA_AVALON_TIMER_PERIODL( SYS_CLK_BASE, ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) & 0xFFFF ); + IOWR_ALTERA_AVALON_TIMER_PERIODH( SYS_CLK_BASE, ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) >> 16 ); + IOWR_ALTERA_AVALON_TIMER_CONTROL( SYS_CLK_BASE, ALTERA_AVALON_TIMER_CONTROL_CONT_MSK | ALTERA_AVALON_TIMER_CONTROL_START_MSK | ALTERA_AVALON_TIMER_CONTROL_ITO_MSK ); + } + + /* Clear any already pending interrupts generated by the Timer. */ + IOWR_ALTERA_AVALON_TIMER_STATUS( SYS_CLK_BASE, ~ALTERA_AVALON_TIMER_STATUS_TO_MSK ); +} +/*-----------------------------------------------------------*/ + +void vPortSysTickHandler( void * context, alt_u32 id ) +{ + /* Increment the kernel tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + vTaskSwitchContext(); + } + + /* Clear the interrupt. */ + IOWR_ALTERA_AVALON_TIMER_STATUS( SYS_CLK_BASE, ~ALTERA_AVALON_TIMER_STATUS_TO_MSK ); +} +/*-----------------------------------------------------------*/ + +/** This function is a re-implementation of the Altera provided function. + * The function is re-implemented to prevent it from enabling an interrupt + * when it is registered. Interrupts should only be enabled after the FreeRTOS.org + * kernel has its scheduler started so that contexts are saved and switched + * correctly. + */ +int alt_irq_register( alt_u32 id, void* context, void (*handler)(void*, alt_u32) ) +{ + int rc = -EINVAL; + alt_irq_context status; + + if (id < ALT_NIRQ) + { + /* + * interrupts are disabled while the handler tables are updated to ensure + * that an interrupt doesn't occur while the tables are in an inconsistent + * state. + */ + + status = alt_irq_disable_all (); + + alt_irq[id].handler = handler; + alt_irq[id].context = context; + + rc = (handler) ? alt_irq_enable (id): alt_irq_disable (id); + + /* alt_irq_enable_all(status); This line is removed to prevent the interrupt from being immediately enabled. */ + } + + return rc; +} +/*-----------------------------------------------------------*/ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/NiosII/port_asm.S b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/NiosII/port_asm.S new file mode 100644 index 0000000..02d1f1d --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/NiosII/port_asm.S @@ -0,0 +1,191 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +.extern vTaskSwitchContext + +.set noat + +# Exported to start the first task. +.globl restore_sp_from_pxCurrentTCB + +# Entry point for exceptions. +.section .exceptions.entry, "xa" + +# Save the entire context of a task. +save_context: + addi ea, ea, -4 # Point to the next instruction. + addi sp, sp, -116 # Create space on the stack. + stw ra, 0(sp) + # Leave a gap for muldiv 0 + stw at, 8(sp) + stw r2, 12(sp) + stw r3, 16(sp) + stw r4, 20(sp) + stw r5, 24(sp) + stw r6, 28(sp) + stw r7, 32(sp) + stw r8, 36(sp) + stw r9, 40(sp) + stw r10, 44(sp) + stw r11, 48(sp) + stw r12, 52(sp) + stw r13, 56(sp) + stw r14, 60(sp) + stw r15, 64(sp) + rdctl r5, estatus # Save the eStatus + stw r5, 68(sp) + stw ea, 72(sp) # Save the PC + stw r16, 76(sp) # Save the remaining registers + stw r17, 80(sp) + stw r18, 84(sp) + stw r19, 88(sp) + stw r20, 92(sp) + stw r21, 96(sp) + stw r22, 100(sp) + stw r23, 104(sp) + stw gp, 108(sp) + stw fp, 112(sp) + +save_sp_to_pxCurrentTCB: + movia et, pxCurrentTCB # Load the address of the pxCurrentTCB pointer + ldw et, (et) # Load the value of the pxCurrentTCB pointer + stw sp, (et) # Store the stack pointer into the top of the TCB + + .section .exceptions.irqtest, "xa" +hw_irq_test: + /* + * Test to see if the exception was a software exception or caused + * by an external interrupt, and vector accordingly. + */ + rdctl r4, ipending # Load the Pending Interrupts indication + rdctl r5, estatus # Load the eStatus (enabled interrupts). + andi r2, r5, 1 # Are interrupts enabled globally. + beq r2, zero, soft_exceptions # Interrupts are not enabled. + beq r4, zero, soft_exceptions # There are no interrupts triggered. + + .section .exceptions.irqhandler, "xa" +hw_irq_handler: + call alt_irq_handler # Call the alt_irq_handler to deliver to the registered interrupt handler. + + .section .exceptions.irqreturn, "xa" +restore_sp_from_pxCurrentTCB: + movia et, pxCurrentTCB # Load the address of the pxCurrentTCB pointer + ldw et, (et) # Load the value of the pxCurrentTCB pointer + ldw sp, (et) # Load the stack pointer with the top value of the TCB + +restore_context: + ldw ra, 0(sp) # Restore the registers. + # Leave a gap for muldiv 0. + ldw at, 8(sp) + ldw r2, 12(sp) + ldw r3, 16(sp) + ldw r4, 20(sp) + ldw r5, 24(sp) + ldw r6, 28(sp) + ldw r7, 32(sp) + ldw r8, 36(sp) + ldw r9, 40(sp) + ldw r10, 44(sp) + ldw r11, 48(sp) + ldw r12, 52(sp) + ldw r13, 56(sp) + ldw r14, 60(sp) + ldw r15, 64(sp) + ldw et, 68(sp) # Load the eStatus + wrctl estatus, et # Write the eStatus + ldw ea, 72(sp) # Load the Program Counter + ldw r16, 76(sp) + ldw r17, 80(sp) + ldw r18, 84(sp) + ldw r19, 88(sp) + ldw r20, 92(sp) + ldw r21, 96(sp) + ldw r22, 100(sp) + ldw r23, 104(sp) + ldw gp, 108(sp) + ldw fp, 112(sp) + addi sp, sp, 116 # Release stack space + + eret # Return to address ea, loading eStatus into Status. + + .section .exceptions.soft, "xa" +soft_exceptions: + ldw et, 0(ea) # Load the instruction where the interrupt occured. + movhi at, %hi(0x003B683A) # Load the registers with the trap instruction code + ori at, at, %lo(0x003B683A) + cmpne et, et, at # Compare the trap instruction code to the last excuted instruction + beq et, r0, call_scheduler # its a trap so switchcontext + break # This is an un-implemented instruction or muldiv problem. + br restore_context # its something else + +call_scheduler: + addi ea, ea, 4 # A trap was called, increment the program counter so it is not called again. + stw ea, 72(sp) # Save the new program counter to the context. + call vTaskSwitchContext # Pick the next context. + br restore_sp_from_pxCurrentTCB # Switch in the task context and restore. diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/NiosII/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/NiosII/portmacro.h new file mode 100644 index 0000000..e9cca80 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/NiosII/portmacro.h @@ -0,0 +1,151 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "sys/alt_irq.h" + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 4 +#define portNOP() asm volatile ( "NOP" ) +#define portCRITICAL_NESTING_IN_TCB 1 +/*-----------------------------------------------------------*/ + +extern void vTaskSwitchContext( void ); +#define portYIELD() asm volatile ( "trap" ); +#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired ) vTaskSwitchContext() + + +/* Include the port_asm.S file where the Context saving/restoring is defined. */ +__asm__( "\n\t.globl save_context" ); + +/*-----------------------------------------------------------*/ + +extern void vTaskEnterCritical( void ); +extern void vTaskExitCritical( void ); + +#define portDISABLE_INTERRUPTS() alt_irq_disable_all() +#define portENABLE_INTERRUPTS() alt_irq_enable_all( 0x01 ); +#define portENTER_CRITICAL() vTaskEnterCritical() +#define portEXIT_CRITICAL() vTaskExitCritical() +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/PPC405_Xilinx/FPU_Macros.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/PPC405_Xilinx/FPU_Macros.h new file mode 100644 index 0000000..616c9dd --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/PPC405_Xilinx/FPU_Macros.h @@ -0,0 +1,87 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* When switching out a task, if the task tag contains a buffer address then +save the flop context into the buffer. */ +#define traceTASK_SWITCHED_OUT() \ + if( pxCurrentTCB->pxTaskTag != NULL ) \ + { \ + extern void vPortSaveFPURegisters( void * ); \ + vPortSaveFPURegisters( ( void * ) ( pxCurrentTCB->pxTaskTag ) ); \ + } + +/* When switching in a task, if the task tag contains a buffer address then +load the flop context from the buffer. */ +#define traceTASK_SWITCHED_IN() \ + if( pxCurrentTCB->pxTaskTag != NULL ) \ + { \ + extern void vPortRestoreFPURegisters( void * ); \ + vPortRestoreFPURegisters( ( void * ) ( pxCurrentTCB->pxTaskTag ) ); \ + } + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/PPC405_Xilinx/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/PPC405_Xilinx/port.c new file mode 100644 index 0000000..0358cbb --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/PPC405_Xilinx/port.c @@ -0,0 +1,302 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the PPC405 port. + *----------------------------------------------------------*/ + + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Library includes. */ +#include "xtime_l.h" +#include "xintc.h" +#include "xintc_i.h" + +/*-----------------------------------------------------------*/ + +/* Definitions to set the initial MSR of each task. */ +#define portCRITICAL_INTERRUPT_ENABLE ( 1UL << 17UL ) +#define portEXTERNAL_INTERRUPT_ENABLE ( 1UL << 15UL ) +#define portMACHINE_CHECK_ENABLE ( 1UL << 12UL ) + +#if configUSE_FPU == 1 + #define portAPU_PRESENT ( 1UL << 25UL ) + #define portFCM_FPU_PRESENT ( 1UL << 13UL ) +#else + #define portAPU_PRESENT ( 0UL ) + #define portFCM_FPU_PRESENT ( 0UL ) +#endif + +#define portINITIAL_MSR ( portCRITICAL_INTERRUPT_ENABLE | portEXTERNAL_INTERRUPT_ENABLE | portMACHINE_CHECK_ENABLE | portAPU_PRESENT | portFCM_FPU_PRESENT ) + + +extern const unsigned _SDA_BASE_; +extern const unsigned _SDA2_BASE_; + +/*-----------------------------------------------------------*/ + +/* + * Setup the system timer to generate the tick interrupt. + */ +static void prvSetupTimerInterrupt( void ); + +/* + * The handler for the tick interrupt - defined in portasm.s. + */ +extern void vPortTickISR( void ); + +/* + * The handler for the yield function - defined in portasm.s. + */ +extern void vPortYield( void ); + +/* + * Function to start the scheduler running by starting the highest + * priority task that has thus far been created. + */ +extern void vPortStartFirstTask( void ); + +/*-----------------------------------------------------------*/ + +/* Structure used to hold the state of the interrupt controller. */ +static XIntc xInterruptController; + +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if the task had been + * interrupted. + * + * See the header file portable.h. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Place a known value at the bottom of the stack for debugging. */ + *pxTopOfStack = 0xDEADBEEF; + pxTopOfStack--; + + /* EABI stack frame. */ + pxTopOfStack -= 20; /* Previous backchain and LR, R31 to R4 inclusive. */ + + /* Parameters in R13. */ + *pxTopOfStack = ( StackType_t ) &_SDA_BASE_; /* address of the first small data area */ + pxTopOfStack -= 10; + + /* Parameters in R3. */ + *pxTopOfStack = ( StackType_t ) pvParameters; + pxTopOfStack--; + + /* Parameters in R2. */ + *pxTopOfStack = ( StackType_t ) &_SDA2_BASE_; /* address of the second small data area */ + pxTopOfStack--; + + /* R1 is the stack pointer so is omitted. */ + + *pxTopOfStack = 0x10000001UL;; /* R0. */ + pxTopOfStack--; + *pxTopOfStack = 0x00000000UL; /* USPRG0. */ + pxTopOfStack--; + *pxTopOfStack = 0x00000000UL; /* CR. */ + pxTopOfStack--; + *pxTopOfStack = 0x00000000UL; /* XER. */ + pxTopOfStack--; + *pxTopOfStack = 0x00000000UL; /* CTR. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) vPortEndScheduler; /* LR. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* SRR0. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_MSR;/* SRR1. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) vPortEndScheduler;/* Next LR. */ + pxTopOfStack--; + *pxTopOfStack = 0x00000000UL;/* Backchain. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + prvSetupTimerInterrupt(); + XExc_RegisterHandler( XEXC_ID_SYSTEM_CALL, ( XExceptionHandler ) vPortYield, ( void * ) 0 ); + vPortStartFirstTask(); + + /* Should not get here as the tasks are now running! */ + return pdFALSE; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented. */ + for( ;; ); +} +/*-----------------------------------------------------------*/ + +/* + * Hardware initialisation to generate the RTOS tick. + */ +static void prvSetupTimerInterrupt( void ) +{ +const uint32_t ulInterval = ( ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL ); + + XTime_PITClearInterrupt(); + XTime_FITClearInterrupt(); + XTime_WDTClearInterrupt(); + XTime_WDTDisableInterrupt(); + XTime_FITDisableInterrupt(); + + XExc_RegisterHandler( XEXC_ID_PIT_INT, ( XExceptionHandler ) vPortTickISR, ( void * ) 0 ); + + XTime_PITEnableAutoReload(); + XTime_PITSetInterval( ulInterval ); + XTime_PITEnableInterrupt(); +} +/*-----------------------------------------------------------*/ + +void vPortISRHandler( void *pvNullDoNotUse ) +{ +uint32_t ulInterruptStatus, ulInterruptMask = 1UL; +BaseType_t xInterruptNumber; +XIntc_Config *pxInterruptController; +XIntc_VectorTableEntry *pxTable; + + /* Just to remove compiler warning. */ + ( void ) pvNullDoNotUse; + + /* Get the configuration by using the device ID - in this case it is + assumed that only one interrupt controller is being used. */ + pxInterruptController = &XIntc_ConfigTable[ XPAR_XPS_INTC_0_DEVICE_ID ]; + + /* Which interrupts are pending? */ + ulInterruptStatus = XIntc_mGetIntrStatus( pxInterruptController->BaseAddress ); + + for( xInterruptNumber = 0; xInterruptNumber < XPAR_INTC_MAX_NUM_INTR_INPUTS; xInterruptNumber++ ) + { + if( ulInterruptStatus & 0x01UL ) + { + /* Clear the pending interrupt. */ + XIntc_mAckIntr( pxInterruptController->BaseAddress, ulInterruptMask ); + + /* Call the registered handler. */ + pxTable = &( pxInterruptController->HandlerTable[ xInterruptNumber ] ); + pxTable->Handler( pxTable->CallBackRef ); + } + + /* Check the next interrupt. */ + ulInterruptMask <<= 0x01UL; + ulInterruptStatus >>= 0x01UL; + + /* Have we serviced all interrupts? */ + if( ulInterruptStatus == 0UL ) + { + break; + } + } +} +/*-----------------------------------------------------------*/ + +void vPortSetupInterruptController( void ) +{ +extern void vPortISRWrapper( void ); + + /* Perform all library calls necessary to initialise the exception table + and interrupt controller. This assumes only one interrupt controller is in + use. */ + XExc_mDisableExceptions( XEXC_NON_CRITICAL ); + XExc_Init(); + + /* The library functions save the context - we then jump to a wrapper to + save the stack into the TCB. The wrapper then calls the handler defined + above. */ + XExc_RegisterHandler( XEXC_ID_NON_CRITICAL_INT, ( XExceptionHandler ) vPortISRWrapper, NULL ); + XIntc_Initialize( &xInterruptController, XPAR_XPS_INTC_0_DEVICE_ID ); + XIntc_Start( &xInterruptController, XIN_REAL_MODE ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortInstallInterruptHandler( uint8_t ucInterruptID, XInterruptHandler pxHandler, void *pvCallBackRef ) +{ +BaseType_t xReturn = pdFAIL; + + /* This function is defined here so the scope of xInterruptController can + remain within this file. */ + + if( XST_SUCCESS == XIntc_Connect( &xInterruptController, ucInterruptID, pxHandler, pvCallBackRef ) ) + { + XIntc_Enable( &xInterruptController, ucInterruptID ); + xReturn = pdPASS; + } + + return xReturn; +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/PPC405_Xilinx/portasm.S b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/PPC405_Xilinx/portasm.S new file mode 100644 index 0000000..d999e1d --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/PPC405_Xilinx/portasm.S @@ -0,0 +1,424 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#include "FreeRTOSConfig.h" + + .extern pxCurrentTCB + .extern vTaskSwitchContext + .extern xTaskIncrementTick + .extern vPortISRHandler + + .global vPortStartFirstTask + .global vPortYield + .global vPortTickISR + .global vPortISRWrapper + .global vPortSaveFPURegisters + .global vPortRestoreFPURegisters + +.set BChainField, 0 +.set NextLRField, BChainField + 4 +.set MSRField, NextLRField + 4 +.set PCField, MSRField + 4 +.set LRField, PCField + 4 +.set CTRField, LRField + 4 +.set XERField, CTRField + 4 +.set CRField, XERField + 4 +.set USPRG0Field, CRField + 4 +.set r0Field, USPRG0Field + 4 +.set r2Field, r0Field + 4 +.set r3r31Field, r2Field + 4 +.set IFrameSize, r3r31Field + ( ( 31 - 3 ) + 1 ) * 4 + + +.macro portSAVE_STACK_POINTER_AND_LR + + /* Get the address of the TCB. */ + xor R0, R0, R0 + addis R2, R0, pxCurrentTCB@ha + lwz R2, pxCurrentTCB@l( R2 ) + + /* Store the stack pointer into the TCB */ + stw SP, 0( R2 ) + + /* Save the link register */ + stwu R1, -24( R1 ) + mflr R0 + stw R31, 20( R1 ) + stw R0, 28( R1 ) + mr R31, r1 + +.endm + +.macro portRESTORE_STACK_POINTER_AND_LR + + /* Restore the link register */ + lwz R11, 0( R1 ) + lwz R0, 4( R11 ) + mtlr R0 + lwz R31, -4( R11 ) + mr R1, R11 + + /* Get the address of the TCB. */ + xor R0, R0, R0 + addis SP, R0, pxCurrentTCB@ha + lwz SP, pxCurrentTCB@l( R1 ) + + /* Get the task stack pointer from the TCB. */ + lwz SP, 0( SP ) + +.endm + + +vPortStartFirstTask: + + /* Get the address of the TCB. */ + xor R0, R0, R0 + addis SP, R0, pxCurrentTCB@ha + lwz SP, pxCurrentTCB@l( SP ) + + /* Get the task stack pointer from the TCB. */ + lwz SP, 0( SP ) + + /* Restore MSR register to SRR1. */ + lwz R0, MSRField(R1) + mtsrr1 R0 + + /* Restore current PC location to SRR0. */ + lwz R0, PCField(R1) + mtsrr0 R0 + + /* Save USPRG0 register */ + lwz R0, USPRG0Field(R1) + mtspr 0x100,R0 + + /* Restore Condition register */ + lwz R0, CRField(R1) + mtcr R0 + + /* Restore Fixed Point Exception register */ + lwz R0, XERField(R1) + mtxer R0 + + /* Restore Counter register */ + lwz R0, CTRField(R1) + mtctr R0 + + /* Restore Link register */ + lwz R0, LRField(R1) + mtlr R0 + + /* Restore remaining GPR registers. */ + lmw R3,r3r31Field(R1) + + /* Restore r0 and r2. */ + lwz R0, r0Field(R1) + lwz R2, r2Field(R1) + + /* Remove frame from stack */ + addi R1,R1,IFrameSize + + /* Return into the first task */ + rfi + + + +vPortYield: + + portSAVE_STACK_POINTER_AND_LR + bl vTaskSwitchContext + portRESTORE_STACK_POINTER_AND_LR + blr + +vPortTickISR: + + portSAVE_STACK_POINTER_AND_LR + bl xTaskIncrementTick + + #if configUSE_PREEMPTION == 1 + bl vTaskSwitchContext + #endif + + /* Clear the interrupt */ + lis R0, 2048 + mttsr R0 + + portRESTORE_STACK_POINTER_AND_LR + blr + +vPortISRWrapper: + + portSAVE_STACK_POINTER_AND_LR + bl vPortISRHandler + portRESTORE_STACK_POINTER_AND_LR + blr + +#if configUSE_FPU == 1 + +vPortSaveFPURegisters: + + /* Enable APU and mark FPU as present. */ + mfmsr r0 + xor r30, r30, r30 + oris r30, r30, 512 + ori r30, r30, 8192 + or r0, r0, r30 + mtmsr r0 + +#ifdef USE_DP_FPU + + /* Buffer address is in r3. Save each flop register into an offset from + this buffer address. */ + stfd f0, 0(r3) + stfd f1, 8(r3) + stfd f2, 16(r3) + stfd f3, 24(r3) + stfd f4, 32(r3) + stfd f5, 40(r3) + stfd f6, 48(r3) + stfd f7, 56(r3) + stfd f8, 64(r3) + stfd f9, 72(r3) + stfd f10, 80(r3) + stfd f11, 88(r3) + stfd f12, 96(r3) + stfd f13, 104(r3) + stfd f14, 112(r3) + stfd f15, 120(r3) + stfd f16, 128(r3) + stfd f17, 136(r3) + stfd f18, 144(r3) + stfd f19, 152(r3) + stfd f20, 160(r3) + stfd f21, 168(r3) + stfd f22, 176(r3) + stfd f23, 184(r3) + stfd f24, 192(r3) + stfd f25, 200(r3) + stfd f26, 208(r3) + stfd f27, 216(r3) + stfd f28, 224(r3) + stfd f29, 232(r3) + stfd f30, 240(r3) + stfd f31, 248(r3) + + /* Also save the FPSCR. */ + mffs f31 + stfs f31, 256(r3) + +#else + + /* Buffer address is in r3. Save each flop register into an offset from + this buffer address. */ + stfs f0, 0(r3) + stfs f1, 4(r3) + stfs f2, 8(r3) + stfs f3, 12(r3) + stfs f4, 16(r3) + stfs f5, 20(r3) + stfs f6, 24(r3) + stfs f7, 28(r3) + stfs f8, 32(r3) + stfs f9, 36(r3) + stfs f10, 40(r3) + stfs f11, 44(r3) + stfs f12, 48(r3) + stfs f13, 52(r3) + stfs f14, 56(r3) + stfs f15, 60(r3) + stfs f16, 64(r3) + stfs f17, 68(r3) + stfs f18, 72(r3) + stfs f19, 76(r3) + stfs f20, 80(r3) + stfs f21, 84(r3) + stfs f22, 88(r3) + stfs f23, 92(r3) + stfs f24, 96(r3) + stfs f25, 100(r3) + stfs f26, 104(r3) + stfs f27, 108(r3) + stfs f28, 112(r3) + stfs f29, 116(r3) + stfs f30, 120(r3) + stfs f31, 124(r3) + + /* Also save the FPSCR. */ + mffs f31 + stfs f31, 128(r3) + +#endif + + blr + +#endif /* configUSE_FPU. */ + + +#if configUSE_FPU == 1 + +vPortRestoreFPURegisters: + + /* Enable APU and mark FPU as present. */ + mfmsr r0 + xor r30, r30, r30 + oris r30, r30, 512 + ori r30, r30, 8192 + or r0, r0, r30 + mtmsr r0 + +#ifdef USE_DP_FPU + + /* Buffer address is in r3. Restore each flop register from an offset + into this buffer. + + First the FPSCR. */ + lfs f31, 256(r3) + mtfsf f31, 7 + + lfd f0, 0(r3) + lfd f1, 8(r3) + lfd f2, 16(r3) + lfd f3, 24(r3) + lfd f4, 32(r3) + lfd f5, 40(r3) + lfd f6, 48(r3) + lfd f7, 56(r3) + lfd f8, 64(r3) + lfd f9, 72(r3) + lfd f10, 80(r3) + lfd f11, 88(r3) + lfd f12, 96(r3) + lfd f13, 104(r3) + lfd f14, 112(r3) + lfd f15, 120(r3) + lfd f16, 128(r3) + lfd f17, 136(r3) + lfd f18, 144(r3) + lfd f19, 152(r3) + lfd f20, 160(r3) + lfd f21, 168(r3) + lfd f22, 176(r3) + lfd f23, 184(r3) + lfd f24, 192(r3) + lfd f25, 200(r3) + lfd f26, 208(r3) + lfd f27, 216(r3) + lfd f28, 224(r3) + lfd f29, 232(r3) + lfd f30, 240(r3) + lfd f31, 248(r3) + +#else + + /* Buffer address is in r3. Restore each flop register from an offset + into this buffer. + + First the FPSCR. */ + lfs f31, 128(r3) + mtfsf f31, 7 + + lfs f0, 0(r3) + lfs f1, 4(r3) + lfs f2, 8(r3) + lfs f3, 12(r3) + lfs f4, 16(r3) + lfs f5, 20(r3) + lfs f6, 24(r3) + lfs f7, 28(r3) + lfs f8, 32(r3) + lfs f9, 36(r3) + lfs f10, 40(r3) + lfs f11, 44(r3) + lfs f12, 48(r3) + lfs f13, 52(r3) + lfs f14, 56(r3) + lfs f15, 60(r3) + lfs f16, 64(r3) + lfs f17, 68(r3) + lfs f18, 72(r3) + lfs f19, 76(r3) + lfs f20, 80(r3) + lfs f21, 84(r3) + lfs f22, 88(r3) + lfs f23, 92(r3) + lfs f24, 96(r3) + lfs f25, 100(r3) + lfs f26, 104(r3) + lfs f27, 108(r3) + lfs f28, 112(r3) + lfs f29, 116(r3) + lfs f30, 120(r3) + lfs f31, 124(r3) + +#endif + + blr + +#endif /* configUSE_FPU. */ + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/PPC405_Xilinx/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/PPC405_Xilinx/portmacro.h new file mode 100644 index 0000000..d24d6ba --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/PPC405_Xilinx/portmacro.h @@ -0,0 +1,160 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#include "xexception_l.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* This port uses the critical nesting count from the TCB rather than +maintaining a separate value and then saving this value in the task stack. */ +#define portCRITICAL_NESTING_IN_TCB 1 + +/* Interrupt control macros. */ +#define portDISABLE_INTERRUPTS() XExc_mDisableExceptions( XEXC_NON_CRITICAL ); +#define portENABLE_INTERRUPTS() XExc_mEnableExceptions( XEXC_NON_CRITICAL ); + +/*-----------------------------------------------------------*/ + +/* Critical section macros. */ +void vTaskEnterCritical( void ); +void vTaskExitCritical( void ); +#define portENTER_CRITICAL() vTaskEnterCritical() +#define portEXIT_CRITICAL() vTaskExitCritical() + +/*-----------------------------------------------------------*/ + +/* Task utilities. */ +void vPortYield( void ); +#define portYIELD() asm volatile ( "SC \n\t NOP" ) +#define portYIELD_FROM_ISR() vTaskSwitchContext() + +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 8 +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portNOP() asm volatile ( "NOP" ) + +/* There are 32 * 32bit floating point regieters, plus the FPSCR to save. */ +#define portNO_FLOP_REGISTERS_TO_SAVE ( 32 + 1 ) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +/* Port specific interrupt handling functions. */ +void vPortSetupInterruptController( void ); +BaseType_t xPortInstallInterruptHandler( uint8_t ucInterruptID, XInterruptHandler pxHandler, void *pvCallBackRef ); + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/PPC440_Xilinx/FPU_Macros.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/PPC440_Xilinx/FPU_Macros.h new file mode 100644 index 0000000..616c9dd --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/PPC440_Xilinx/FPU_Macros.h @@ -0,0 +1,87 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* When switching out a task, if the task tag contains a buffer address then +save the flop context into the buffer. */ +#define traceTASK_SWITCHED_OUT() \ + if( pxCurrentTCB->pxTaskTag != NULL ) \ + { \ + extern void vPortSaveFPURegisters( void * ); \ + vPortSaveFPURegisters( ( void * ) ( pxCurrentTCB->pxTaskTag ) ); \ + } + +/* When switching in a task, if the task tag contains a buffer address then +load the flop context from the buffer. */ +#define traceTASK_SWITCHED_IN() \ + if( pxCurrentTCB->pxTaskTag != NULL ) \ + { \ + extern void vPortRestoreFPURegisters( void * ); \ + vPortRestoreFPURegisters( ( void * ) ( pxCurrentTCB->pxTaskTag ) ); \ + } + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/PPC440_Xilinx/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/PPC440_Xilinx/port.c new file mode 100644 index 0000000..a2d63da --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/PPC440_Xilinx/port.c @@ -0,0 +1,302 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the PPC440 port. + *----------------------------------------------------------*/ + + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Library includes. */ +#include "xtime_l.h" +#include "xintc.h" +#include "xintc_i.h" + +/*-----------------------------------------------------------*/ + +/* Definitions to set the initial MSR of each task. */ +#define portCRITICAL_INTERRUPT_ENABLE ( 1UL << 17UL ) +#define portEXTERNAL_INTERRUPT_ENABLE ( 1UL << 15UL ) +#define portMACHINE_CHECK_ENABLE ( 1UL << 12UL ) + +#if configUSE_FPU == 1 + #define portAPU_PRESENT ( 1UL << 25UL ) + #define portFCM_FPU_PRESENT ( 1UL << 13UL ) +#else + #define portAPU_PRESENT ( 0UL ) + #define portFCM_FPU_PRESENT ( 0UL ) +#endif + +#define portINITIAL_MSR ( portCRITICAL_INTERRUPT_ENABLE | portEXTERNAL_INTERRUPT_ENABLE | portMACHINE_CHECK_ENABLE | portAPU_PRESENT | portFCM_FPU_PRESENT ) + + +extern const unsigned _SDA_BASE_; +extern const unsigned _SDA2_BASE_; + +/*-----------------------------------------------------------*/ + +/* + * Setup the system timer to generate the tick interrupt. + */ +static void prvSetupTimerInterrupt( void ); + +/* + * The handler for the tick interrupt - defined in portasm.s. + */ +extern void vPortTickISR( void ); + +/* + * The handler for the yield function - defined in portasm.s. + */ +extern void vPortYield( void ); + +/* + * Function to start the scheduler running by starting the highest + * priority task that has thus far been created. + */ +extern void vPortStartFirstTask( void ); + +/*-----------------------------------------------------------*/ + +/* Structure used to hold the state of the interrupt controller. */ +static XIntc xInterruptController; + +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if the task had been + * interrupted. + * + * See the header file portable.h. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Place a known value at the bottom of the stack for debugging. */ + *pxTopOfStack = 0xDEADBEEF; + pxTopOfStack--; + + /* EABI stack frame. */ + pxTopOfStack -= 20; /* Previous backchain and LR, R31 to R4 inclusive. */ + + /* Parameters in R13. */ + *pxTopOfStack = ( StackType_t ) &_SDA_BASE_; /* address of the first small data area */ + pxTopOfStack -= 10; + + /* Parameters in R3. */ + *pxTopOfStack = ( StackType_t ) pvParameters; + pxTopOfStack--; + + /* Parameters in R2. */ + *pxTopOfStack = ( StackType_t ) &_SDA2_BASE_; /* address of the second small data area */ + pxTopOfStack--; + + /* R1 is the stack pointer so is omitted. */ + + *pxTopOfStack = 0x10000001UL;; /* R0. */ + pxTopOfStack--; + *pxTopOfStack = 0x00000000UL; /* USPRG0. */ + pxTopOfStack--; + *pxTopOfStack = 0x00000000UL; /* CR. */ + pxTopOfStack--; + *pxTopOfStack = 0x00000000UL; /* XER. */ + pxTopOfStack--; + *pxTopOfStack = 0x00000000UL; /* CTR. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) vPortEndScheduler; /* LR. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* SRR0. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_MSR;/* SRR1. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) vPortEndScheduler;/* Next LR. */ + pxTopOfStack--; + *pxTopOfStack = 0x00000000UL;/* Backchain. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + prvSetupTimerInterrupt(); + XExc_RegisterHandler( XEXC_ID_SYSTEM_CALL, ( XExceptionHandler ) vPortYield, ( void * ) 0 ); + vPortStartFirstTask(); + + /* Should not get here as the tasks are now running! */ + return pdFALSE; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented. */ + for( ;; ); +} +/*-----------------------------------------------------------*/ + +/* + * Hardware initialisation to generate the RTOS tick. + */ +static void prvSetupTimerInterrupt( void ) +{ +const uint32_t ulInterval = ( ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL ); + + XTime_DECClearInterrupt(); + XTime_FITClearInterrupt(); + XTime_WDTClearInterrupt(); + XTime_WDTDisableInterrupt(); + XTime_FITDisableInterrupt(); + + XExc_RegisterHandler( XEXC_ID_DEC_INT, ( XExceptionHandler ) vPortTickISR, ( void * ) 0 ); + + XTime_DECEnableAutoReload(); + XTime_DECSetInterval( ulInterval ); + XTime_DECEnableInterrupt(); +} +/*-----------------------------------------------------------*/ + +void vPortISRHandler( void *pvNullDoNotUse ) +{ +uint32_t ulInterruptStatus, ulInterruptMask = 1UL; +BaseType_t xInterruptNumber; +XIntc_Config *pxInterruptController; +XIntc_VectorTableEntry *pxTable; + + /* Just to remove compiler warning. */ + ( void ) pvNullDoNotUse; + + /* Get the configuration by using the device ID - in this case it is + assumed that only one interrupt controller is being used. */ + pxInterruptController = &XIntc_ConfigTable[ XPAR_XPS_INTC_0_DEVICE_ID ]; + + /* Which interrupts are pending? */ + ulInterruptStatus = XIntc_mGetIntrStatus( pxInterruptController->BaseAddress ); + + for( xInterruptNumber = 0; xInterruptNumber < XPAR_INTC_MAX_NUM_INTR_INPUTS; xInterruptNumber++ ) + { + if( ulInterruptStatus & 0x01UL ) + { + /* Clear the pending interrupt. */ + XIntc_mAckIntr( pxInterruptController->BaseAddress, ulInterruptMask ); + + /* Call the registered handler. */ + pxTable = &( pxInterruptController->HandlerTable[ xInterruptNumber ] ); + pxTable->Handler( pxTable->CallBackRef ); + } + + /* Check the next interrupt. */ + ulInterruptMask <<= 0x01UL; + ulInterruptStatus >>= 0x01UL; + + /* Have we serviced all interrupts? */ + if( ulInterruptStatus == 0UL ) + { + break; + } + } +} +/*-----------------------------------------------------------*/ + +void vPortSetupInterruptController( void ) +{ +extern void vPortISRWrapper( void ); + + /* Perform all library calls necessary to initialise the exception table + and interrupt controller. This assumes only one interrupt controller is in + use. */ + XExc_mDisableExceptions( XEXC_NON_CRITICAL ); + XExc_Init(); + + /* The library functions save the context - we then jump to a wrapper to + save the stack into the TCB. The wrapper then calls the handler defined + above. */ + XExc_RegisterHandler( XEXC_ID_NON_CRITICAL_INT, ( XExceptionHandler ) vPortISRWrapper, NULL ); + XIntc_Initialize( &xInterruptController, XPAR_XPS_INTC_0_DEVICE_ID ); + XIntc_Start( &xInterruptController, XIN_REAL_MODE ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortInstallInterruptHandler( uint8_t ucInterruptID, XInterruptHandler pxHandler, void *pvCallBackRef ) +{ +BaseType_t xReturn = pdFAIL; + + /* This function is defined here so the scope of xInterruptController can + remain within this file. */ + + if( XST_SUCCESS == XIntc_Connect( &xInterruptController, ucInterruptID, pxHandler, pvCallBackRef ) ) + { + XIntc_Enable( &xInterruptController, ucInterruptID ); + xReturn = pdPASS; + } + + return xReturn; +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/PPC440_Xilinx/portasm.S b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/PPC440_Xilinx/portasm.S new file mode 100644 index 0000000..d999e1d --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/PPC440_Xilinx/portasm.S @@ -0,0 +1,424 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#include "FreeRTOSConfig.h" + + .extern pxCurrentTCB + .extern vTaskSwitchContext + .extern xTaskIncrementTick + .extern vPortISRHandler + + .global vPortStartFirstTask + .global vPortYield + .global vPortTickISR + .global vPortISRWrapper + .global vPortSaveFPURegisters + .global vPortRestoreFPURegisters + +.set BChainField, 0 +.set NextLRField, BChainField + 4 +.set MSRField, NextLRField + 4 +.set PCField, MSRField + 4 +.set LRField, PCField + 4 +.set CTRField, LRField + 4 +.set XERField, CTRField + 4 +.set CRField, XERField + 4 +.set USPRG0Field, CRField + 4 +.set r0Field, USPRG0Field + 4 +.set r2Field, r0Field + 4 +.set r3r31Field, r2Field + 4 +.set IFrameSize, r3r31Field + ( ( 31 - 3 ) + 1 ) * 4 + + +.macro portSAVE_STACK_POINTER_AND_LR + + /* Get the address of the TCB. */ + xor R0, R0, R0 + addis R2, R0, pxCurrentTCB@ha + lwz R2, pxCurrentTCB@l( R2 ) + + /* Store the stack pointer into the TCB */ + stw SP, 0( R2 ) + + /* Save the link register */ + stwu R1, -24( R1 ) + mflr R0 + stw R31, 20( R1 ) + stw R0, 28( R1 ) + mr R31, r1 + +.endm + +.macro portRESTORE_STACK_POINTER_AND_LR + + /* Restore the link register */ + lwz R11, 0( R1 ) + lwz R0, 4( R11 ) + mtlr R0 + lwz R31, -4( R11 ) + mr R1, R11 + + /* Get the address of the TCB. */ + xor R0, R0, R0 + addis SP, R0, pxCurrentTCB@ha + lwz SP, pxCurrentTCB@l( R1 ) + + /* Get the task stack pointer from the TCB. */ + lwz SP, 0( SP ) + +.endm + + +vPortStartFirstTask: + + /* Get the address of the TCB. */ + xor R0, R0, R0 + addis SP, R0, pxCurrentTCB@ha + lwz SP, pxCurrentTCB@l( SP ) + + /* Get the task stack pointer from the TCB. */ + lwz SP, 0( SP ) + + /* Restore MSR register to SRR1. */ + lwz R0, MSRField(R1) + mtsrr1 R0 + + /* Restore current PC location to SRR0. */ + lwz R0, PCField(R1) + mtsrr0 R0 + + /* Save USPRG0 register */ + lwz R0, USPRG0Field(R1) + mtspr 0x100,R0 + + /* Restore Condition register */ + lwz R0, CRField(R1) + mtcr R0 + + /* Restore Fixed Point Exception register */ + lwz R0, XERField(R1) + mtxer R0 + + /* Restore Counter register */ + lwz R0, CTRField(R1) + mtctr R0 + + /* Restore Link register */ + lwz R0, LRField(R1) + mtlr R0 + + /* Restore remaining GPR registers. */ + lmw R3,r3r31Field(R1) + + /* Restore r0 and r2. */ + lwz R0, r0Field(R1) + lwz R2, r2Field(R1) + + /* Remove frame from stack */ + addi R1,R1,IFrameSize + + /* Return into the first task */ + rfi + + + +vPortYield: + + portSAVE_STACK_POINTER_AND_LR + bl vTaskSwitchContext + portRESTORE_STACK_POINTER_AND_LR + blr + +vPortTickISR: + + portSAVE_STACK_POINTER_AND_LR + bl xTaskIncrementTick + + #if configUSE_PREEMPTION == 1 + bl vTaskSwitchContext + #endif + + /* Clear the interrupt */ + lis R0, 2048 + mttsr R0 + + portRESTORE_STACK_POINTER_AND_LR + blr + +vPortISRWrapper: + + portSAVE_STACK_POINTER_AND_LR + bl vPortISRHandler + portRESTORE_STACK_POINTER_AND_LR + blr + +#if configUSE_FPU == 1 + +vPortSaveFPURegisters: + + /* Enable APU and mark FPU as present. */ + mfmsr r0 + xor r30, r30, r30 + oris r30, r30, 512 + ori r30, r30, 8192 + or r0, r0, r30 + mtmsr r0 + +#ifdef USE_DP_FPU + + /* Buffer address is in r3. Save each flop register into an offset from + this buffer address. */ + stfd f0, 0(r3) + stfd f1, 8(r3) + stfd f2, 16(r3) + stfd f3, 24(r3) + stfd f4, 32(r3) + stfd f5, 40(r3) + stfd f6, 48(r3) + stfd f7, 56(r3) + stfd f8, 64(r3) + stfd f9, 72(r3) + stfd f10, 80(r3) + stfd f11, 88(r3) + stfd f12, 96(r3) + stfd f13, 104(r3) + stfd f14, 112(r3) + stfd f15, 120(r3) + stfd f16, 128(r3) + stfd f17, 136(r3) + stfd f18, 144(r3) + stfd f19, 152(r3) + stfd f20, 160(r3) + stfd f21, 168(r3) + stfd f22, 176(r3) + stfd f23, 184(r3) + stfd f24, 192(r3) + stfd f25, 200(r3) + stfd f26, 208(r3) + stfd f27, 216(r3) + stfd f28, 224(r3) + stfd f29, 232(r3) + stfd f30, 240(r3) + stfd f31, 248(r3) + + /* Also save the FPSCR. */ + mffs f31 + stfs f31, 256(r3) + +#else + + /* Buffer address is in r3. Save each flop register into an offset from + this buffer address. */ + stfs f0, 0(r3) + stfs f1, 4(r3) + stfs f2, 8(r3) + stfs f3, 12(r3) + stfs f4, 16(r3) + stfs f5, 20(r3) + stfs f6, 24(r3) + stfs f7, 28(r3) + stfs f8, 32(r3) + stfs f9, 36(r3) + stfs f10, 40(r3) + stfs f11, 44(r3) + stfs f12, 48(r3) + stfs f13, 52(r3) + stfs f14, 56(r3) + stfs f15, 60(r3) + stfs f16, 64(r3) + stfs f17, 68(r3) + stfs f18, 72(r3) + stfs f19, 76(r3) + stfs f20, 80(r3) + stfs f21, 84(r3) + stfs f22, 88(r3) + stfs f23, 92(r3) + stfs f24, 96(r3) + stfs f25, 100(r3) + stfs f26, 104(r3) + stfs f27, 108(r3) + stfs f28, 112(r3) + stfs f29, 116(r3) + stfs f30, 120(r3) + stfs f31, 124(r3) + + /* Also save the FPSCR. */ + mffs f31 + stfs f31, 128(r3) + +#endif + + blr + +#endif /* configUSE_FPU. */ + + +#if configUSE_FPU == 1 + +vPortRestoreFPURegisters: + + /* Enable APU and mark FPU as present. */ + mfmsr r0 + xor r30, r30, r30 + oris r30, r30, 512 + ori r30, r30, 8192 + or r0, r0, r30 + mtmsr r0 + +#ifdef USE_DP_FPU + + /* Buffer address is in r3. Restore each flop register from an offset + into this buffer. + + First the FPSCR. */ + lfs f31, 256(r3) + mtfsf f31, 7 + + lfd f0, 0(r3) + lfd f1, 8(r3) + lfd f2, 16(r3) + lfd f3, 24(r3) + lfd f4, 32(r3) + lfd f5, 40(r3) + lfd f6, 48(r3) + lfd f7, 56(r3) + lfd f8, 64(r3) + lfd f9, 72(r3) + lfd f10, 80(r3) + lfd f11, 88(r3) + lfd f12, 96(r3) + lfd f13, 104(r3) + lfd f14, 112(r3) + lfd f15, 120(r3) + lfd f16, 128(r3) + lfd f17, 136(r3) + lfd f18, 144(r3) + lfd f19, 152(r3) + lfd f20, 160(r3) + lfd f21, 168(r3) + lfd f22, 176(r3) + lfd f23, 184(r3) + lfd f24, 192(r3) + lfd f25, 200(r3) + lfd f26, 208(r3) + lfd f27, 216(r3) + lfd f28, 224(r3) + lfd f29, 232(r3) + lfd f30, 240(r3) + lfd f31, 248(r3) + +#else + + /* Buffer address is in r3. Restore each flop register from an offset + into this buffer. + + First the FPSCR. */ + lfs f31, 128(r3) + mtfsf f31, 7 + + lfs f0, 0(r3) + lfs f1, 4(r3) + lfs f2, 8(r3) + lfs f3, 12(r3) + lfs f4, 16(r3) + lfs f5, 20(r3) + lfs f6, 24(r3) + lfs f7, 28(r3) + lfs f8, 32(r3) + lfs f9, 36(r3) + lfs f10, 40(r3) + lfs f11, 44(r3) + lfs f12, 48(r3) + lfs f13, 52(r3) + lfs f14, 56(r3) + lfs f15, 60(r3) + lfs f16, 64(r3) + lfs f17, 68(r3) + lfs f18, 72(r3) + lfs f19, 76(r3) + lfs f20, 80(r3) + lfs f21, 84(r3) + lfs f22, 88(r3) + lfs f23, 92(r3) + lfs f24, 96(r3) + lfs f25, 100(r3) + lfs f26, 104(r3) + lfs f27, 108(r3) + lfs f28, 112(r3) + lfs f29, 116(r3) + lfs f30, 120(r3) + lfs f31, 124(r3) + +#endif + + blr + +#endif /* configUSE_FPU. */ + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/PPC440_Xilinx/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/PPC440_Xilinx/portmacro.h new file mode 100644 index 0000000..d24d6ba --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/PPC440_Xilinx/portmacro.h @@ -0,0 +1,160 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#include "xexception_l.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* This port uses the critical nesting count from the TCB rather than +maintaining a separate value and then saving this value in the task stack. */ +#define portCRITICAL_NESTING_IN_TCB 1 + +/* Interrupt control macros. */ +#define portDISABLE_INTERRUPTS() XExc_mDisableExceptions( XEXC_NON_CRITICAL ); +#define portENABLE_INTERRUPTS() XExc_mEnableExceptions( XEXC_NON_CRITICAL ); + +/*-----------------------------------------------------------*/ + +/* Critical section macros. */ +void vTaskEnterCritical( void ); +void vTaskExitCritical( void ); +#define portENTER_CRITICAL() vTaskEnterCritical() +#define portEXIT_CRITICAL() vTaskExitCritical() + +/*-----------------------------------------------------------*/ + +/* Task utilities. */ +void vPortYield( void ); +#define portYIELD() asm volatile ( "SC \n\t NOP" ) +#define portYIELD_FROM_ISR() vTaskSwitchContext() + +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 8 +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portNOP() asm volatile ( "NOP" ) + +/* There are 32 * 32bit floating point regieters, plus the FPSCR to save. */ +#define portNO_FLOP_REGISTERS_TO_SAVE ( 32 + 1 ) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +/* Port specific interrupt handling functions. */ +void vPortSetupInterruptController( void ); +BaseType_t xPortInstallInterruptHandler( uint8_t ucInterruptID, XInterruptHandler pxHandler, void *pvCallBackRef ); + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/RL78/isr_support.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/RL78/isr_support.h new file mode 100644 index 0000000..125bc5e --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/RL78/isr_support.h @@ -0,0 +1,168 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* Variables used by scheduler */ + .extern _pxCurrentTCB + .extern _usCriticalNesting + +/* + * portSAVE_CONTEXT MACRO + * Saves the context of the general purpose registers, CS and ES (only in far + * memory mode) registers the usCriticalNesting Value and the Stack Pointer + * of the active Task onto the task stack + */ + .macro portSAVE_CONTEXT + + SEL RB0 + + /* Save AX Register to stack. */ + PUSH AX + PUSH HL + /* Save CS register. */ + MOV A, CS + XCH A, X + /* Save ES register. */ + MOV A, ES + PUSH AX + /* Save the remaining general purpose registers from bank 0. */ + PUSH DE + PUSH BC + /* Save the other register banks - only necessary in the GCC port. */ + SEL RB1 + PUSH AX + PUSH BC + PUSH DE + PUSH HL + SEL RB2 + PUSH AX + PUSH BC + PUSH DE + PUSH HL + /* Registers in bank 3 are for ISR use only so don't need saving. */ + SEL RB0 + /* Save the usCriticalNesting value. */ + MOVW AX, !_usCriticalNesting + PUSH AX + /* Save the Stack pointer. */ + MOVW AX, !_pxCurrentTCB + MOVW HL, AX + MOVW AX, SP + MOVW [HL], AX + /* Switch stack pointers. */ + movw sp,#_stack /* Set stack pointer */ + + .endm + + +/* + * portRESTORE_CONTEXT MACRO + * Restores the task Stack Pointer then use this to restore usCriticalNesting, + * general purpose registers and the CS and ES (only in far memory mode) + * of the selected task from the task stack + */ +.macro portRESTORE_CONTEXT MACRO + SEL RB0 + /* Restore the Stack pointer. */ + MOVW AX, !_pxCurrentTCB + MOVW HL, AX + MOVW AX, [HL] + MOVW SP, AX + /* Restore usCriticalNesting value. */ + POP AX + MOVW !_usCriticalNesting, AX + /* Restore the alternative register banks - only necessary in the GCC + port. Register bank 3 is dedicated for interrupts use so is not saved or + restored. */ + SEL RB2 + POP HL + POP DE + POP BC + POP AX + SEL RB1 + POP HL + POP DE + POP BC + POP AX + SEL RB0 + /* Restore the necessary general purpose registers. */ + POP BC + POP DE + /* Restore the ES register. */ + POP AX + MOV ES, A + /* Restore the CS register. */ + XCH A, X + MOV CS, A + /* Restore general purpose register HL. */ + POP HL + /* Restore AX. */ + POP AX + + .endm + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/RL78/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/RL78/port.c new file mode 100644 index 0000000..c97bf78 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/RL78/port.c @@ -0,0 +1,253 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* The critical nesting value is initialised to a non zero value to ensure +interrupts don't accidentally become enabled before the scheduler is started. */ +#define portINITIAL_CRITICAL_NESTING ( ( uint16_t ) 10 ) + +/* Initial PSW value allocated to a newly created task. + * 11000110 + * ||||||||-------------- Fill byte + * |||||||--------------- Carry Flag cleared + * |||||----------------- In-service priority Flags set to low level + * ||||------------------ Register bank Select 0 Flag cleared + * |||------------------- Auxiliary Carry Flag cleared + * ||-------------------- Register bank Select 1 Flag cleared + * |--------------------- Zero Flag set + * ---------------------- Global Interrupt Flag set (enabled) + */ +#define portPSW ( 0xc6UL ) + +/* Each task maintains a count of the critical section nesting depth. Each time +a critical section is entered the count is incremented. Each time a critical +section is exited the count is decremented - with interrupts only being +re-enabled if the count is zero. + +usCriticalNesting will get set to zero when the scheduler starts, but must +not be initialised to zero as that could cause problems during the startup +sequence. */ +volatile uint16_t usCriticalNesting = portINITIAL_CRITICAL_NESTING; + +/*-----------------------------------------------------------*/ + +/* + * Sets up the periodic ISR used for the RTOS tick. + */ +__attribute__((weak)) void vApplicationSetupTimerInterrupt( void ); + +/* + * Starts the scheduler by loading the context of the first task to run. + * (defined in portasm.S). + */ +extern void vPortStartFirstTask( void ); + +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been called. + * + * See the header file portable.h. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +uint32_t *pulLocal; + + /* Stack type and pointers to the stack type are both 2 bytes. */ + + /* Parameters are passed in on the stack, and written using a 32bit value + hence a space is left for the second two bytes. */ + pxTopOfStack--; + + /* Write in the parameter value. */ + pulLocal = ( uint32_t * ) pxTopOfStack; + *pulLocal = ( StackType_t ) pvParameters; + pxTopOfStack--; + + /* The return address, leaving space for the first two bytes of the + 32-bit value. */ + pxTopOfStack--; + pulLocal = ( uint32_t * ) pxTopOfStack; + *pulLocal = ( uint32_t ) 0; + pxTopOfStack--; + + /* The start address / PSW value is also written in as a 32bit value, + so leave a space for the second two bytes. */ + pxTopOfStack--; + + /* Task function start address combined with the PSW. */ + pulLocal = ( uint32_t * ) pxTopOfStack; + *pulLocal = ( ( ( uint32_t ) pxCode ) | ( portPSW << 24UL ) ); + pxTopOfStack--; + + /* An initial value for the AX register. */ + *pxTopOfStack = ( StackType_t ) 0x1111; + pxTopOfStack--; + + /* An initial value for the HL register. */ + *pxTopOfStack = ( StackType_t ) 0x2222; + pxTopOfStack--; + + /* CS and ES registers. */ + *pxTopOfStack = ( StackType_t ) 0x0F00; + pxTopOfStack--; + + /* The remaining general purpose registers bank 0 (DE and BC) and the other + two register banks...register bank 3 is dedicated for use by interrupts so + is not saved as part of the task context. */ + pxTopOfStack -= 10; + + /* Finally the critical section nesting count is set to zero when the task + first starts. */ + *pxTopOfStack = ( StackType_t ) portNO_CRITICAL_SECTION_NESTING; + + /* Return a pointer to the top of the stack that has beene generated so it + can be stored in the task control block for the task. */ + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +portBASE_TYPE xPortStartScheduler( void ) +{ + /* Setup the hardware to generate the tick. Interrupts are disabled when + this function is called. */ + vApplicationSetupTimerInterrupt(); + + /* Restore the context of the first task that is going to run. */ + vPortStartFirstTask(); + + /* Execution should not reach here as the tasks are now running! */ + return pdTRUE; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the RL78 port will get stopped. */ +} +/*-----------------------------------------------------------*/ + +__attribute__((weak)) void vApplicationSetupTimerInterrupt( void ) +{ +const uint16_t usClockHz = 15000UL; /* Internal clock. */ +const uint16_t usCompareMatch = ( usClockHz / configTICK_RATE_HZ ) + 1UL; + + /* Use the internal 15K clock. */ + OSMC = ( unsigned char ) 0x16; + + #ifdef RTCEN + { + /* Supply the interval timer clock. */ + RTCEN = ( unsigned char ) 1U; + + /* Disable INTIT interrupt. */ + ITMK = ( unsigned char ) 1; + + /* Disable ITMC operation. */ + ITMC = ( unsigned char ) 0x0000; + + /* Clear INIT interrupt. */ + ITIF = ( unsigned char ) 0; + + /* Set interval and enable interrupt operation. */ + ITMC = usCompareMatch | 0x8000U; + + /* Enable INTIT interrupt. */ + ITMK = ( unsigned char ) 0; + } + #endif + + #ifdef TMKAEN + { + /* Supply the interval timer clock. */ + TMKAEN = ( unsigned char ) 1U; + + /* Disable INTIT interrupt. */ + TMKAMK = ( unsigned char ) 1; + + /* Disable ITMC operation. */ + ITMC = ( unsigned char ) 0x0000; + + /* Clear INIT interrupt. */ + TMKAIF = ( unsigned char ) 0; + + /* Set interval and enable interrupt operation. */ + ITMC = usCompareMatch | 0x8000U; + + /* Enable INTIT interrupt. */ + TMKAMK = ( unsigned char ) 0; + } + #endif +} +/*-----------------------------------------------------------*/ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/RL78/portasm.S b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/RL78/portasm.S new file mode 100644 index 0000000..9531504 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/RL78/portasm.S @@ -0,0 +1,122 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#include "FreeRTOSConfig.h" +#include "ISR_Support.h" + + .global _vPortYield + .global _vPortStartFirstTask + .global _vPortTickISR + + .extern _vTaskSwitchContext + .extern _xTaskIncrementTick + + .text + .align 2 + +/* FreeRTOS yield handler. This is installed as the BRK software interrupt +handler. */ +_vPortYield: + /* Save the context of the current task. */ + portSAVE_CONTEXT + /* Call the scheduler to select the next task. */ + call !!_vTaskSwitchContext + /* Restore the context of the next task to run. */ + portRESTORE_CONTEXT + retb + + +/* Starts the scheduler by restoring the context of the task that will execute +first. */ + .align 2 +_vPortStartFirstTask: + /* Restore the context of whichever task will execute first. */ + portRESTORE_CONTEXT + /* An interrupt stack frame is used so the task is started using RETI. */ + reti + +/* FreeRTOS tick handler. This is installed as the interval timer interrupt +handler. */ + .align 2 +_vPortTickISR: + + /* Save the context of the currently executing task. */ + portSAVE_CONTEXT + /* Call the RTOS tick function. */ + call !!_xTaskIncrementTick +#if configUSE_PREEMPTION == 1 + /* Select the next task to run. */ + call !!_vTaskSwitchContext +#endif + /* Retore the context of whichever task will run next. */ + portRESTORE_CONTEXT + reti + + .end + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/RL78/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/RL78/portmacro.h new file mode 100644 index 0000000..ba49988 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/RL78/portmacro.h @@ -0,0 +1,163 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ + +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint16_t +#define portBASE_TYPE short +#define portPOINTER_SIZE_TYPE uint16_t + +typedef portSTACK_TYPE StackType_t; +typedef short BaseType_t; +typedef unsigned short UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Interrupt control macros. */ +#define portDISABLE_INTERRUPTS() __asm volatile ( "DI" ) +#define portENABLE_INTERRUPTS() __asm volatile ( "EI" ) +/*-----------------------------------------------------------*/ + +/* Critical section control macros. */ +#define portNO_CRITICAL_SECTION_NESTING ( ( unsigned short ) 0 ) + +#define portENTER_CRITICAL() \ +{ \ +extern volatile uint16_t usCriticalNesting; \ + \ + portDISABLE_INTERRUPTS(); \ + \ + /* Now interrupts are disabled ulCriticalNesting can be accessed */ \ + /* directly. Increment ulCriticalNesting to keep a count of how many */ \ + /* times portENTER_CRITICAL() has been called. */ \ + usCriticalNesting++; \ +} + +#define portEXIT_CRITICAL() \ +{ \ +extern volatile uint16_t usCriticalNesting; \ + \ + if( usCriticalNesting > portNO_CRITICAL_SECTION_NESTING ) \ + { \ + /* Decrement the nesting count as we are leaving a critical section. */ \ + usCriticalNesting--; \ + \ + /* If the nesting level has reached zero then interrupts should be */ \ + /* re-enabled. */ \ + if( usCriticalNesting == portNO_CRITICAL_SECTION_NESTING ) \ + { \ + portENABLE_INTERRUPTS(); \ + } \ + } \ +} +/*-----------------------------------------------------------*/ + +/* Task utilities. */ +#define portYIELD() __asm volatile ( "BRK" ) +#define portYIELD_FROM_ISR( xHigherPriorityTaskWoken ) if( xHigherPriorityTaskWoken ) vTaskSwitchContext() +#define portNOP() __asm volatile ( "NOP" ) +/*-----------------------------------------------------------*/ + +/* Hardwware specifics. */ +#define portBYTE_ALIGNMENT 2 +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/RX100/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/RX100/port.c new file mode 100644 index 0000000..0e59aa3 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/RX100/port.c @@ -0,0 +1,716 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the SH2A port. + *----------------------------------------------------------*/ + +/* Standard C includes. */ +#include "limits.h" + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Library includes. */ +#include "string.h" + +/* Hardware specifics. */ +#include "iodefine.h" + +/*-----------------------------------------------------------*/ + +/* Tasks should start with interrupts enabled and in Supervisor mode, therefore +PSW is set with U and I set, and PM and IPL clear. */ +#define portINITIAL_PSW ( ( StackType_t ) 0x00030000 ) + +/* The peripheral clock is divided by this value before being supplying the +CMT. */ +#if ( configUSE_TICKLESS_IDLE == 0 ) + /* If tickless idle is not used then the divisor can be fixed. */ + #define portCLOCK_DIVISOR 8UL +#elif ( configPERIPHERAL_CLOCK_HZ >= 12000000 ) + #define portCLOCK_DIVISOR 512UL +#elif ( configPERIPHERAL_CLOCK_HZ >= 6000000 ) + #define portCLOCK_DIVISOR 128UL +#elif ( configPERIPHERAL_CLOCK_HZ >= 1000000 ) + #define portCLOCK_DIVISOR 32UL +#else + #define portCLOCK_DIVISOR 8UL +#endif + +/* These macros allow a critical section to be added around the call to +xTaskIncrementTick(), which is only ever called from interrupts at the kernel +priority - ie a known priority. Therefore these local macros are a slight +optimisation compared to calling the global SET/CLEAR_INTERRUPT_MASK macros, +which would require the old IPL to be read first and stored in a local variable. */ +#define portDISABLE_INTERRUPTS_FROM_KERNEL_ISR() __asm volatile ( "MVTIPL %0" ::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY) ) +#define portENABLE_INTERRUPTS_FROM_KERNEL_ISR() __asm volatile ( "MVTIPL %0" ::"i"(configKERNEL_INTERRUPT_PRIORITY) ) + +/* Keys required to lock and unlock access to certain system registers +respectively. */ +#define portUNLOCK_KEY 0xA50B +#define portLOCK_KEY 0xA500 + +/*-----------------------------------------------------------*/ + +/* + * Function to start the first task executing - written in asm code as direct + * access to registers is required. + */ +static void prvStartFirstTask( void ) __attribute__((naked)); + +/* + * Software interrupt handler. Performs the actual context switch (saving and + * restoring of registers). Written in asm code as direct register access is + * required. + */ +void vPortSoftwareInterruptISR( void ) __attribute__((naked)); + +/* + * The tick interrupt handler. + */ +void vPortTickISR( void ) __attribute__((interrupt)); + +/* + * Sets up the periodic ISR used for the RTOS tick using the CMT. + * The application writer can define configSETUP_TICK_INTERRUPT() (in + * FreeRTOSConfig.h) such that their own tick interrupt configuration is used + * in place of prvSetupTimerInterrupt(). + */ +static void prvSetupTimerInterrupt( void ); +#ifndef configSETUP_TICK_INTERRUPT + /* The user has not provided their own tick interrupt configuration so use + the definition in this file (which uses the interval timer). */ + #define configSETUP_TICK_INTERRUPT() prvSetupTimerInterrupt() +#endif /* configSETUP_TICK_INTERRUPT */ + +/* + * Called after the sleep mode registers have been configured, prvSleep() + * executes the pre and post sleep macros, and actually calls the wait + * instruction. + */ +#if configUSE_TICKLESS_IDLE == 1 + static void prvSleep( TickType_t xExpectedIdleTime ); +#endif /* configUSE_TICKLESS_IDLE */ + +/*-----------------------------------------------------------*/ + +/* Used in the context save and restore code. */ +extern void *pxCurrentTCB; + +/* Calculate how many clock increments make up a single tick period. */ +static const uint32_t ulMatchValueForOneTick = ( ( configPERIPHERAL_CLOCK_HZ / portCLOCK_DIVISOR ) / configTICK_RATE_HZ ); + +#if configUSE_TICKLESS_IDLE == 1 + + /* Holds the maximum number of ticks that can be suppressed - which is + basically how far into the future an interrupt can be generated. Set + during initialisation. This is the maximum possible value that the + compare match register can hold divided by ulMatchValueForOneTick. */ + static const TickType_t xMaximumPossibleSuppressedTicks = USHRT_MAX / ( ( configPERIPHERAL_CLOCK_HZ / portCLOCK_DIVISOR ) / configTICK_RATE_HZ ); + + /* Flag set from the tick interrupt to allow the sleep processing to know if + sleep mode was exited because of a tick interrupt, or an interrupt + generated by something else. */ + static volatile uint32_t ulTickFlag = pdFALSE; + + /* The CMT counter is stopped temporarily each time it is re-programmed. + The following constant offsets the CMT counter match value by the number of + CMT counts that would typically be missed while the counter was stopped to + compensate for the lost time. The large difference between the divided CMT + clock and the CPU clock means it is likely ulStoppedTimerCompensation will + equal zero - and be optimised away. */ + static const uint32_t ulStoppedTimerCompensation = 100UL / ( configCPU_CLOCK_HZ / ( configPERIPHERAL_CLOCK_HZ / portCLOCK_DIVISOR ) ); + +#endif + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Offset to end up on 8 byte boundary. */ + pxTopOfStack--; + + /* R0 is not included as it is the stack pointer. */ + *pxTopOfStack = 0x00; + pxTopOfStack--; + *pxTopOfStack = 0x00; + pxTopOfStack--; + *pxTopOfStack = portINITIAL_PSW; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; + + /* When debugging it can be useful if every register is set to a known + value. Otherwise code space can be saved by just setting the registers + that need to be set. */ + #ifdef USE_FULL_REGISTER_INITIALISATION + { + pxTopOfStack--; + *pxTopOfStack = 0x12345678; /* r15. */ + pxTopOfStack--; + *pxTopOfStack = 0xaaaabbbb; + pxTopOfStack--; + *pxTopOfStack = 0xdddddddd; + pxTopOfStack--; + *pxTopOfStack = 0xcccccccc; + pxTopOfStack--; + *pxTopOfStack = 0xbbbbbbbb; + pxTopOfStack--; + *pxTopOfStack = 0xaaaaaaaa; + pxTopOfStack--; + *pxTopOfStack = 0x99999999; + pxTopOfStack--; + *pxTopOfStack = 0x88888888; + pxTopOfStack--; + *pxTopOfStack = 0x77777777; + pxTopOfStack--; + *pxTopOfStack = 0x66666666; + pxTopOfStack--; + *pxTopOfStack = 0x55555555; + pxTopOfStack--; + *pxTopOfStack = 0x44444444; + pxTopOfStack--; + *pxTopOfStack = 0x33333333; + pxTopOfStack--; + *pxTopOfStack = 0x22222222; + pxTopOfStack--; + } + #else + { + /* Leave space for the registers that will get popped from the stack + when the task first starts executing. */ + pxTopOfStack -= 15; + } + #endif + + *pxTopOfStack = ( StackType_t ) pvParameters; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = 0x12345678; /* Accumulator. */ + pxTopOfStack--; + *pxTopOfStack = 0x87654321; /* Accumulator. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* Use pxCurrentTCB just so it does not get optimised away. */ + if( pxCurrentTCB != NULL ) + { + /* Call an application function to set up the timer that will generate + the tick interrupt. This way the application can decide which + peripheral to use. If tickless mode is used then the default + implementation defined in this file (which uses CMT0) should not be + overridden. */ + configSETUP_TICK_INTERRUPT(); + + /* Enable the software interrupt. */ + _IEN( _ICU_SWINT ) = 1; + + /* Ensure the software interrupt is clear. */ + _IR( _ICU_SWINT ) = 0; + + /* Ensure the software interrupt is set to the kernel priority. */ + _IPR( _ICU_SWINT ) = configKERNEL_INTERRUPT_PRIORITY; + + /* Start the first task. */ + prvStartFirstTask(); + } + + /* Execution should not reach here as the tasks are now running! + prvSetupTimerInterrupt() is called here to prevent the compiler outputting + a warning about a statically declared function not being referenced in the + case that the application writer has provided their own tick interrupt + configuration routine (and defined configSETUP_TICK_INTERRUPT() such that + their own routine will be called in place of prvSetupTimerInterrupt()). */ + prvSetupTimerInterrupt(); + + /* Should not get here. */ + return pdFAIL; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( pxCurrentTCB == NULL ); +} +/*-----------------------------------------------------------*/ + +static void prvStartFirstTask( void ) +{ + __asm volatile + ( + /* When starting the scheduler there is nothing that needs moving to the + interrupt stack because the function is not called from an interrupt. + Just ensure the current stack is the user stack. */ + "SETPSW U \n" \ + + /* Obtain the location of the stack associated with which ever task + pxCurrentTCB is currently pointing to. */ + "MOV.L #_pxCurrentTCB, R15 \n" \ + "MOV.L [R15], R15 \n" \ + "MOV.L [R15], R0 \n" \ + + /* Restore the registers from the stack of the task pointed to by + pxCurrentTCB. */ + "POP R15 \n" \ + + /* Accumulator low 32 bits. */ + "MVTACLO R15 \n" \ + "POP R15 \n" \ + + /* Accumulator high 32 bits. */ + "MVTACHI R15 \n" \ + + /* R1 to R15 - R0 is not included as it is the SP. */ + "POPM R1-R15 \n" \ + + /* This pops the remaining registers. */ + "RTE \n" \ + "NOP \n" \ + "NOP \n" + ); +} +/*-----------------------------------------------------------*/ + +void vPortSoftwareInterruptISR( void ) +{ + __asm volatile + ( + /* Re-enable interrupts. */ + "SETPSW I \n" \ + + /* Move the data that was automatically pushed onto the interrupt stack when + the interrupt occurred from the interrupt stack to the user stack. + + R15 is saved before it is clobbered. */ + "PUSH.L R15 \n" \ + + /* Read the user stack pointer. */ + "MVFC USP, R15 \n" \ + + /* Move the address down to the data being moved. */ + "SUB #12, R15 \n" \ + "MVTC R15, USP \n" \ + + /* Copy the data across, R15, then PC, then PSW. */ + "MOV.L [ R0 ], [ R15 ] \n" \ + "MOV.L 4[ R0 ], 4[ R15 ] \n" \ + "MOV.L 8[ R0 ], 8[ R15 ] \n" \ + + /* Move the interrupt stack pointer to its new correct position. */ + "ADD #12, R0 \n" \ + + /* All the rest of the registers are saved directly to the user stack. */ + "SETPSW U \n" \ + + /* Save the rest of the general registers (R15 has been saved already). */ + "PUSHM R1-R14 \n" \ + + /* Save the accumulator. */ + "MVFACHI R15 \n" \ + "PUSH.L R15 \n" \ + + /* Middle word. */ + "MVFACMI R15 \n" \ + + /* Shifted left as it is restored to the low order word. */ + "SHLL #16, R15 \n" \ + "PUSH.L R15 \n" \ + + /* Save the stack pointer to the TCB. */ + "MOV.L #_pxCurrentTCB, R15 \n" \ + "MOV.L [ R15 ], R15 \n" \ + "MOV.L R0, [ R15 ] \n" \ + + /* Ensure the interrupt mask is set to the syscall priority while the kernel + structures are being accessed. */ + "MVTIPL %0 \n" \ + + /* Select the next task to run. */ + "BSR.A _vTaskSwitchContext \n" \ + + /* Reset the interrupt mask as no more data structure access is required. */ + "MVTIPL %1 \n" \ + + /* Load the stack pointer of the task that is now selected as the Running + state task from its TCB. */ + "MOV.L #_pxCurrentTCB,R15 \n" \ + "MOV.L [ R15 ], R15 \n" \ + "MOV.L [ R15 ], R0 \n" \ + + /* Restore the context of the new task. The PSW (Program Status Word) and + PC will be popped by the RTE instruction. */ + "POP R15 \n" \ + "MVTACLO R15 \n" \ + "POP R15 \n" \ + "MVTACHI R15 \n" \ + "POPM R1-R15 \n" \ + "RTE \n" \ + "NOP \n" \ + "NOP " + :: "i"(configMAX_SYSCALL_INTERRUPT_PRIORITY), "i"(configKERNEL_INTERRUPT_PRIORITY) + ); +} +/*-----------------------------------------------------------*/ + +void vPortTickISR( void ) +{ + /* Re-enabled interrupts. */ + __asm volatile( "SETPSW I" ); + + /* Increment the tick, and perform any processing the new tick value + necessitates. Ensure IPL is at the max syscall value first. */ + portDISABLE_INTERRUPTS_FROM_KERNEL_ISR(); + { + if( xTaskIncrementTick() != pdFALSE ) + { + taskYIELD(); + } + } + portENABLE_INTERRUPTS_FROM_KERNEL_ISR(); + + #if configUSE_TICKLESS_IDLE == 1 + { + /* The CPU woke because of a tick. */ + ulTickFlag = pdTRUE; + + /* If this is the first tick since exiting tickless mode then the CMT + compare match value needs resetting. */ + CMT0.CMCOR = ( uint16_t ) ulMatchValueForOneTick; + } + #endif +} +/*-----------------------------------------------------------*/ + +uint32_t ulPortGetIPL( void ) +{ + __asm volatile + ( + "MVFC PSW, R1 \n" \ + "SHLR #24, R1 \n" \ + "RTS " + ); + + /* This will never get executed, but keeps the compiler from complaining. */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortSetIPL( uint32_t ulNewIPL ) +{ + __asm volatile + ( + "PUSH R5 \n" \ + "MVFC PSW, R5 \n" \ + "SHLL #24, R1 \n" \ + "AND #-0F000001H, R5 \n" \ + "OR R1, R5 \n" \ + "MVTC R5, PSW \n" \ + "POP R5 \n" \ + "RTS " + ); +} +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt( void ) +{ + /* Unlock. */ + SYSTEM.PRCR.WORD = portUNLOCK_KEY; + + /* Enable CMT0. */ + MSTP( CMT0 ) = 0; + + /* Lock again. */ + SYSTEM.PRCR.WORD = portLOCK_KEY; + + /* Interrupt on compare match. */ + CMT0.CMCR.BIT.CMIE = 1; + + /* Set the compare match value. */ + CMT0.CMCOR = ( uint16_t ) ulMatchValueForOneTick; + + /* Divide the PCLK. */ + #if portCLOCK_DIVISOR == 512 + { + CMT0.CMCR.BIT.CKS = 3; + } + #elif portCLOCK_DIVISOR == 128 + { + CMT0.CMCR.BIT.CKS = 2; + } + #elif portCLOCK_DIVISOR == 32 + { + CMT0.CMCR.BIT.CKS = 1; + } + #elif portCLOCK_DIVISOR == 8 + { + CMT0.CMCR.BIT.CKS = 0; + } + #else + { + #error Invalid portCLOCK_DIVISOR setting + } + #endif + + /* Enable the interrupt... */ + _IEN( _CMT0_CMI0 ) = 1; + + /* ...and set its priority to the application defined kernel priority. */ + _IPR( _CMT0_CMI0 ) = configKERNEL_INTERRUPT_PRIORITY; + + /* Start the timer. */ + CMT.CMSTR0.BIT.STR0 = 1; +} +/*-----------------------------------------------------------*/ + +#if configUSE_TICKLESS_IDLE == 1 + + static void prvSleep( TickType_t xExpectedIdleTime ) + { + /* Allow the application to define some pre-sleep processing. */ + configPRE_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* xExpectedIdleTime being set to 0 by configPRE_SLEEP_PROCESSING() + means the application defined code has already executed the WAIT + instruction. */ + if( xExpectedIdleTime > 0 ) + { + __asm volatile( "WAIT" ); + } + + /* Allow the application to define some post sleep processing. */ + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + } + +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +#if configUSE_TICKLESS_IDLE == 1 + + void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulMatchValue, ulCompleteTickPeriods, ulCurrentCount; + eSleepModeStatus eSleepAction; + + /* THIS FUNCTION IS CALLED WITH THE SCHEDULER SUSPENDED. */ + + /* Make sure the CMT reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Calculate the reload value required to wait xExpectedIdleTime tick + periods. */ + ulMatchValue = ulMatchValueForOneTick * xExpectedIdleTime; + if( ulMatchValue > ulStoppedTimerCompensation ) + { + /* Compensate for the fact that the CMT is going to be stopped + momentarily. */ + ulMatchValue -= ulStoppedTimerCompensation; + } + + /* Stop the CMT momentarily. The time the CMT is stopped for is + accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + CMT.CMSTR0.BIT.STR0 = 0; + while( CMT.CMSTR0.BIT.STR0 == 1 ) + { + /* Nothing to do here. */ + } + + /* Critical section using the global interrupt bit as the i bit is + automatically reset by the WAIT instruction. */ + __asm volatile( "CLRPSW i" ); + + /* The tick flag is set to false before sleeping. If it is true when + sleep mode is exited then sleep mode was probably exited because the + tick was suppressed for the entire xExpectedIdleTime period. */ + ulTickFlag = pdFALSE; + + /* If a context switch is pending then abandon the low power entry as + the context switch might have been pended by an external interrupt that + requires processing. */ + eSleepAction = eTaskConfirmSleepModeStatus(); + if( eSleepAction == eAbortSleep ) + { + /* Restart tick. */ + CMT.CMSTR0.BIT.STR0 = 1; + __asm volatile( "SETPSW i" ); + } + else if( eSleepAction == eNoTasksWaitingTimeout ) + { + /* Protection off. */ + SYSTEM.PRCR.WORD = portUNLOCK_KEY; + + /* Ready for software standby with all clocks stopped. */ + SYSTEM.SBYCR.BIT.SSBY = 1; + + /* Protection on. */ + SYSTEM.PRCR.WORD = portLOCK_KEY; + + /* Sleep until something happens. Calling prvSleep() will + automatically reset the i bit in the PSW. */ + prvSleep( xExpectedIdleTime ); + + /* Restart the CMT. */ + CMT.CMSTR0.BIT.STR0 = 1; + } + else + { + /* Protection off. */ + SYSTEM.PRCR.WORD = portUNLOCK_KEY; + + /* Ready for deep sleep mode. */ + SYSTEM.MSTPCRC.BIT.DSLPE = 1; + SYSTEM.MSTPCRA.BIT.MSTPA28 = 1; + SYSTEM.SBYCR.BIT.SSBY = 0; + + /* Protection on. */ + SYSTEM.PRCR.WORD = portLOCK_KEY; + + /* Adjust the match value to take into account that the current + time slice is already partially complete. */ + ulMatchValue -= ( uint32_t ) CMT0.CMCNT; + CMT0.CMCOR = ( uint16_t ) ulMatchValue; + + /* Restart the CMT to count up to the new match value. */ + CMT0.CMCNT = 0; + CMT.CMSTR0.BIT.STR0 = 1; + + /* Sleep until something happens. Calling prvSleep() will + automatically reset the i bit in the PSW. */ + prvSleep( xExpectedIdleTime ); + + /* Stop CMT. Again, the time the SysTick is stopped for is + accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + CMT.CMSTR0.BIT.STR0 = 0; + while( CMT.CMSTR0.BIT.STR0 == 1 ) + { + /* Nothing to do here. */ + } + + ulCurrentCount = ( uint32_t ) CMT0.CMCNT; + + if( ulTickFlag != pdFALSE ) + { + /* The tick interrupt has already executed, although because + this function is called with the scheduler suspended the actual + tick processing will not occur until after this function has + exited. Reset the match value with whatever remains of this + tick period. */ + ulMatchValue = ulMatchValueForOneTick - ulCurrentCount; + CMT0.CMCOR = ( uint16_t ) ulMatchValue; + + /* The tick interrupt handler will already have pended the tick + processing in the kernel. As the pending tick will be + processed as soon as this function exits, the tick value + maintained by the tick is stepped forward by one less than the + time spent sleeping. The actual stepping of the tick appears + later in this function. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. + How many complete tick periods passed while the processor was + sleeping? */ + ulCompleteTickPeriods = ulCurrentCount / ulMatchValueForOneTick; + + /* The match value is set to whatever fraction of a single tick + period remains. */ + ulMatchValue = ulCurrentCount - ( ulCompleteTickPeriods * ulMatchValueForOneTick ); + CMT0.CMCOR = ( uint16_t ) ulMatchValue; + } + + /* Restart the CMT so it runs up to the match value. The match value + will get set to the value required to generate exactly one tick period + the next time the CMT interrupt executes. */ + CMT0.CMCNT = 0; + CMT.CMSTR0.BIT.STR0 = 1; + + /* Wind the tick forward by the number of tick periods that the CPU + remained in a low power state. */ + vTaskStepTick( ulCompleteTickPeriods ); + } + } + +#endif /* configUSE_TICKLESS_IDLE */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/RX100/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/RX100/portmacro.h new file mode 100644 index 0000000..e1603dd --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/RX100/portmacro.h @@ -0,0 +1,186 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions - these are a bit legacy and not really used now, other than +portSTACK_TYPE and portBASE_TYPE. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 8 /* Could make four, according to manual. */ +#define portSTACK_GROWTH -1 +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portNOP() __asm volatile( "NOP" ) + +/* Save clobbered register, set ITU SWINR (at address 0x872E0), read the value +back to ensure it is set before continuing, then restore the clobbered +register. */ +#define portYIELD() \ + __asm volatile \ + ( \ + "MOV.L #0x872E0, r5 \n\t" \ + "MOV.B #1, [r5] \n\t" \ + "MOV.L [r5], r5 \n\t" \ + ::: "r5" \ + ) + +#define portYIELD_FROM_ISR( x ) if( x != pdFALSE ) { portYIELD(); } + +/* These macros should not be called directly, but through the +taskENTER_CRITICAL() and taskEXIT_CRITICAL() macros. An extra check is +performed if configASSERT() is defined to ensure an assertion handler does not +inadvertently attempt to lower the IPL when the call to assert was triggered +because the IPL value was found to be above configMAX_SYSCALL_INTERRUPT_PRIORITY +when an ISR safe FreeRTOS API function was executed. ISR safe FreeRTOS API +functions are those that end in FromISR. FreeRTOS maintains a separate +interrupt API to ensure API function and interrupt entry is as fast and as +simple as possible. */ +#define portENABLE_INTERRUPTS() __asm volatile ( "MVTIPL #0" ) +#ifdef configASSERT + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() configASSERT( ( ulPortGetIPL() <= configMAX_SYSCALL_INTERRUPT_PRIORITY ) ) + #define portDISABLE_INTERRUPTS() if( ulPortGetIPL() < configMAX_SYSCALL_INTERRUPT_PRIORITY ) __asm volatile ( "MVTIPL %0" ::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY) ) +#else + #define portDISABLE_INTERRUPTS() __asm volatile ( "MVTIPL %0" ::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY) ) +#endif + +/* Critical nesting counts are stored in the TCB. */ +#define portCRITICAL_NESTING_IN_TCB ( 1 ) + +/* The critical nesting functions defined within tasks.c. */ +extern void vTaskEnterCritical( void ); +extern void vTaskExitCritical( void ); +#define portENTER_CRITICAL() vTaskEnterCritical() +#define portEXIT_CRITICAL() vTaskExitCritical() + +/* As this port allows interrupt nesting... */ +uint32_t ulPortGetIPL( void ) __attribute__((naked)); +void vPortSetIPL( uint32_t ulNewIPL ) __attribute__((naked)); +#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortGetIPL(); portDISABLE_INTERRUPTS() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ) vPortSetIPL( uxSavedInterruptStatus ) + +/* Tickless idle/low power functionality. */ +#if configUSE_TICKLESS_IDLE == 1 + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif +#endif + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/RX600/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/RX600/port.c new file mode 100644 index 0000000..0217972 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/RX600/port.c @@ -0,0 +1,400 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the SH2A port. + *----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Library includes. */ +#include "string.h" + +/* Hardware specifics. */ +#include "iodefine.h" + +/*-----------------------------------------------------------*/ + +/* Tasks should start with interrupts enabled and in Supervisor mode, therefore +PSW is set with U and I set, and PM and IPL clear. */ +#define portINITIAL_PSW ( ( StackType_t ) 0x00030000 ) +#define portINITIAL_FPSW ( ( StackType_t ) 0x00000100 ) + +/* These macros allow a critical section to be added around the call to +xTaskIncrementTick(), which is only ever called from interrupts at the kernel +priority - ie a known priority. Therefore these local macros are a slight +optimisation compared to calling the global SET/CLEAR_INTERRUPT_MASK macros, +which would require the old IPL to be read first and stored in a local variable. */ +#define portDISABLE_INTERRUPTS_FROM_KERNEL_ISR() __asm volatile ( "MVTIPL %0" ::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY) ) +#define portENABLE_INTERRUPTS_FROM_KERNEL_ISR() __asm volatile ( "MVTIPL %0" ::"i"(configKERNEL_INTERRUPT_PRIORITY) ) + +/*-----------------------------------------------------------*/ + +/* + * Function to start the first task executing - written in asm code as direct + * access to registers is required. + */ +static void prvStartFirstTask( void ) __attribute__((naked)); + +/* + * Software interrupt handler. Performs the actual context switch (saving and + * restoring of registers). Written in asm code as direct register access is + * required. + */ +void vSoftwareInterruptISR( void ) __attribute__((naked)); + +/* + * The tick interrupt handler. + */ +void vTickISR( void ) __attribute__((interrupt)); + +/*-----------------------------------------------------------*/ + +extern void *pxCurrentTCB; + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* R0 is not included as it is the stack pointer. */ + + *pxTopOfStack = 0x00; + pxTopOfStack--; + *pxTopOfStack = portINITIAL_PSW; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; + + /* When debugging it can be useful if every register is set to a known + value. Otherwise code space can be saved by just setting the registers + that need to be set. */ + #ifdef USE_FULL_REGISTER_INITIALISATION + { + pxTopOfStack--; + *pxTopOfStack = 0xffffffff; /* r15. */ + pxTopOfStack--; + *pxTopOfStack = 0xeeeeeeee; + pxTopOfStack--; + *pxTopOfStack = 0xdddddddd; + pxTopOfStack--; + *pxTopOfStack = 0xcccccccc; + pxTopOfStack--; + *pxTopOfStack = 0xbbbbbbbb; + pxTopOfStack--; + *pxTopOfStack = 0xaaaaaaaa; + pxTopOfStack--; + *pxTopOfStack = 0x99999999; + pxTopOfStack--; + *pxTopOfStack = 0x88888888; + pxTopOfStack--; + *pxTopOfStack = 0x77777777; + pxTopOfStack--; + *pxTopOfStack = 0x66666666; + pxTopOfStack--; + *pxTopOfStack = 0x55555555; + pxTopOfStack--; + *pxTopOfStack = 0x44444444; + pxTopOfStack--; + *pxTopOfStack = 0x33333333; + pxTopOfStack--; + *pxTopOfStack = 0x22222222; + pxTopOfStack--; + } + #else + { + pxTopOfStack -= 15; + } + #endif + + *pxTopOfStack = ( StackType_t ) pvParameters; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_FPSW; + pxTopOfStack--; + *pxTopOfStack = 0x12345678; /* Accumulator. */ + pxTopOfStack--; + *pxTopOfStack = 0x87654321; /* Accumulator. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void vApplicationSetupTimerInterrupt( void ); + + /* Use pxCurrentTCB just so it does not get optimised away. */ + if( pxCurrentTCB != NULL ) + { + /* Call an application function to set up the timer that will generate the + tick interrupt. This way the application can decide which peripheral to + use. A demo application is provided to show a suitable example. */ + vApplicationSetupTimerInterrupt(); + + /* Enable the software interrupt. */ + _IEN( _ICU_SWINT ) = 1; + + /* Ensure the software interrupt is clear. */ + _IR( _ICU_SWINT ) = 0; + + /* Ensure the software interrupt is set to the kernel priority. */ + _IPR( _ICU_SWINT ) = configKERNEL_INTERRUPT_PRIORITY; + + /* Start the first task. */ + prvStartFirstTask(); + } + + /* Should not get here. */ + return pdFAIL; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( pxCurrentTCB == NULL ); +} +/*-----------------------------------------------------------*/ + +static void prvStartFirstTask( void ) +{ + __asm volatile + ( + /* When starting the scheduler there is nothing that needs moving to the + interrupt stack because the function is not called from an interrupt. + Just ensure the current stack is the user stack. */ + "SETPSW U \n" \ + + /* Obtain the location of the stack associated with which ever task + pxCurrentTCB is currently pointing to. */ + "MOV.L #_pxCurrentTCB, R15 \n" \ + "MOV.L [R15], R15 \n" \ + "MOV.L [R15], R0 \n" \ + + /* Restore the registers from the stack of the task pointed to by + pxCurrentTCB. */ + "POP R15 \n" \ + + /* Accumulator low 32 bits. */ + "MVTACLO R15 \n" \ + "POP R15 \n" \ + + /* Accumulator high 32 bits. */ + "MVTACHI R15 \n" \ + "POP R15 \n" \ + + /* Floating point status word. */ + "MVTC R15, FPSW \n" \ + + /* R1 to R15 - R0 is not included as it is the SP. */ + "POPM R1-R15 \n" \ + + /* This pops the remaining registers. */ + "RTE \n" \ + "NOP \n" \ + "NOP \n" + ); +} +/*-----------------------------------------------------------*/ + +void vSoftwareInterruptISR( void ) +{ + __asm volatile + ( + /* Re-enable interrupts. */ + "SETPSW I \n" \ + + /* Move the data that was automatically pushed onto the interrupt stack when + the interrupt occurred from the interrupt stack to the user stack. + + R15 is saved before it is clobbered. */ + "PUSH.L R15 \n" \ + + /* Read the user stack pointer. */ + "MVFC USP, R15 \n" \ + + /* Move the address down to the data being moved. */ + "SUB #12, R15 \n" \ + "MVTC R15, USP \n" \ + + /* Copy the data across, R15, then PC, then PSW. */ + "MOV.L [ R0 ], [ R15 ] \n" \ + "MOV.L 4[ R0 ], 4[ R15 ] \n" \ + "MOV.L 8[ R0 ], 8[ R15 ] \n" \ + + /* Move the interrupt stack pointer to its new correct position. */ + "ADD #12, R0 \n" \ + + /* All the rest of the registers are saved directly to the user stack. */ + "SETPSW U \n" \ + + /* Save the rest of the general registers (R15 has been saved already). */ + "PUSHM R1-R14 \n" \ + + /* Save the FPSW and accumulator. */ + "MVFC FPSW, R15 \n" \ + "PUSH.L R15 \n" \ + "MVFACHI R15 \n" \ + "PUSH.L R15 \n" \ + + /* Middle word. */ + "MVFACMI R15 \n" \ + + /* Shifted left as it is restored to the low order word. */ + "SHLL #16, R15 \n" \ + "PUSH.L R15 \n" \ + + /* Save the stack pointer to the TCB. */ + "MOV.L #_pxCurrentTCB, R15 \n" \ + "MOV.L [ R15 ], R15 \n" \ + "MOV.L R0, [ R15 ] \n" \ + + /* Ensure the interrupt mask is set to the syscall priority while the kernel + structures are being accessed. */ + "MVTIPL %0 \n" \ + + /* Select the next task to run. */ + "BSR.A _vTaskSwitchContext \n" \ + + /* Reset the interrupt mask as no more data structure access is required. */ + "MVTIPL %1 \n" \ + + /* Load the stack pointer of the task that is now selected as the Running + state task from its TCB. */ + "MOV.L #_pxCurrentTCB,R15 \n" \ + "MOV.L [ R15 ], R15 \n" \ + "MOV.L [ R15 ], R0 \n" \ + + /* Restore the context of the new task. The PSW (Program Status Word) and + PC will be popped by the RTE instruction. */ + "POP R15 \n" \ + "MVTACLO R15 \n" \ + "POP R15 \n" \ + "MVTACHI R15 \n" \ + "POP R15 \n" \ + "MVTC R15, FPSW \n" \ + "POPM R1-R15 \n" \ + "RTE \n" \ + "NOP \n" \ + "NOP " + :: "i"(configMAX_SYSCALL_INTERRUPT_PRIORITY), "i"(configKERNEL_INTERRUPT_PRIORITY) + ); +} +/*-----------------------------------------------------------*/ + +void vTickISR( void ) +{ + /* Re-enabled interrupts. */ + __asm volatile( "SETPSW I" ); + + /* Increment the tick, and perform any processing the new tick value + necessitates. Ensure IPL is at the max syscall value first. */ + portDISABLE_INTERRUPTS_FROM_KERNEL_ISR(); + { + if( xTaskIncrementTick() != pdFALSE ) + { + taskYIELD(); + } + } + portENABLE_INTERRUPTS_FROM_KERNEL_ISR(); +} +/*-----------------------------------------------------------*/ + +uint32_t ulPortGetIPL( void ) +{ + __asm volatile + ( + "MVFC PSW, R1 \n" \ + "SHLR #24, R1 \n" \ + "RTS " + ); + + /* This will never get executed, but keeps the compiler from complaining. */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortSetIPL( uint32_t ulNewIPL ) +{ + __asm volatile + ( + "PUSH R5 \n" \ + "MVFC PSW, R5 \n" \ + "SHLL #24, R1 \n" \ + "AND #-0F000001H, R5 \n" \ + "OR R1, R5 \n" \ + "MVTC R5, PSW \n" \ + "POP R5 \n" \ + "RTS " + ); +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/RX600/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/RX600/portmacro.h new file mode 100644 index 0000000..942d71b --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/RX600/portmacro.h @@ -0,0 +1,180 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions - these are a bit legacy and not really used now, other than +portSTACK_TYPE and portBASE_TYPE. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 8 /* Could make four, according to manual. */ +#define portSTACK_GROWTH -1 +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portNOP() __asm volatile( "NOP" ) + +/* Yield equivalent to "*portITU_SWINTR = 0x01; ( void ) *portITU_SWINTR;" +where portITU_SWINTR is the location of the software interrupt register +(0x000872E0). Don't rely on the assembler to select a register, so instead +save and restore clobbered registers manually. */ +#define portYIELD() \ + __asm volatile \ + ( \ + "PUSH.L R10 \n" \ + "MOV.L #0x872E0, R10 \n" \ + "MOV.B #0x1, [R10] \n" \ + "MOV.L [R10], R10 \n" \ + "POP R10 \n" \ + ) + +#define portYIELD_FROM_ISR( x ) if( x != pdFALSE ) portYIELD() + +/* These macros should not be called directly, but through the +taskENTER_CRITICAL() and taskEXIT_CRITICAL() macros. An extra check is +performed if configASSERT() is defined to ensure an assertion handler does not +inadvertently attempt to lower the IPL when the call to assert was triggered +because the IPL value was found to be above configMAX_SYSCALL_INTERRUPT_PRIORITY +when an ISR safe FreeRTOS API function was executed. ISR safe FreeRTOS API +functions are those that end in FromISR. FreeRTOS maintains a separate +interrupt API to ensure API function and interrupt entry is as fast and as +simple as possible. */ +#define portENABLE_INTERRUPTS() __asm volatile ( "MVTIPL #0" ) +#ifdef configASSERT + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() configASSERT( ( ulPortGetIPL() <= configMAX_SYSCALL_INTERRUPT_PRIORITY ) ) + #define portDISABLE_INTERRUPTS() if( ulPortGetIPL() < configMAX_SYSCALL_INTERRUPT_PRIORITY ) __asm volatile ( "MVTIPL %0" ::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY) ) +#else + #define portDISABLE_INTERRUPTS() __asm volatile ( "MVTIPL %0" ::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY) ) +#endif + +/* Critical nesting counts are stored in the TCB. */ +#define portCRITICAL_NESTING_IN_TCB ( 1 ) + +/* The critical nesting functions defined within tasks.c. */ +extern void vTaskEnterCritical( void ); +extern void vTaskExitCritical( void ); +#define portENTER_CRITICAL() vTaskEnterCritical() +#define portEXIT_CRITICAL() vTaskExitCritical() + +/* As this port allows interrupt nesting... */ +uint32_t ulPortGetIPL( void ) __attribute__((naked)); +void vPortSetIPL( uint32_t ulNewIPL ) __attribute__((naked)); +#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortGetIPL(); portDISABLE_INTERRUPTS() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ) vPortSetIPL( uxSavedInterruptStatus ) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/RX600v2/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/RX600v2/port.c new file mode 100644 index 0000000..be5a575 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/RX600v2/port.c @@ -0,0 +1,449 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the SH2A port. + *----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Library includes. */ +#include "string.h" + +/* Hardware specifics. */ +#include "iodefine.h" + +/*-----------------------------------------------------------*/ + +/* Tasks should start with interrupts enabled and in Supervisor mode, therefore +PSW is set with U and I set, and PM and IPL clear. */ +#define portINITIAL_PSW ( ( StackType_t ) 0x00030000 ) +#define portINITIAL_FPSW ( ( StackType_t ) 0x00000100 ) + +/* These macros allow a critical section to be added around the call to +xTaskIncrementTick(), which is only ever called from interrupts at the kernel +priority - ie a known priority. Therefore these local macros are a slight +optimisation compared to calling the global SET/CLEAR_INTERRUPT_MASK macros, +which would require the old IPL to be read first and stored in a local variable. */ +#define portMASK_INTERRUPTS_FROM_KERNEL_ISR() __asm volatile ( "MVTIPL %0" ::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY) ) +#define portUNMASK_INTERRUPTS_FROM_KERNEL_ISR() __asm volatile ( "MVTIPL %0" ::"i"(configKERNEL_INTERRUPT_PRIORITY) ) + +/*-----------------------------------------------------------*/ + +/* + * Function to start the first task executing - written in asm code as direct + * access to registers is required. + */ +static void prvStartFirstTask( void ) __attribute__((naked)); + +/* + * Software interrupt handler. Performs the actual context switch (saving and + * restoring of registers). Written in asm code as direct register access is + * required. + */ +void vSoftwareInterruptISR( void ) __attribute__((naked)); + +/* + * The tick interrupt handler. + */ +void vTickISR( void ) __attribute__((interrupt)); + +/*-----------------------------------------------------------*/ + +extern void *pxCurrentTCB; + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* R0 is not included as it is the stack pointer. */ + + *pxTopOfStack = 0x00; + pxTopOfStack--; + *pxTopOfStack = portINITIAL_PSW; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; + + /* When debugging it can be useful if every register is set to a known + value. Otherwise code space can be saved by just setting the registers + that need to be set. */ + #ifdef USE_FULL_REGISTER_INITIALISATION + { + pxTopOfStack--; + *pxTopOfStack = 0xffffffff; /* r15. */ + pxTopOfStack--; + *pxTopOfStack = 0xeeeeeeee; + pxTopOfStack--; + *pxTopOfStack = 0xdddddddd; + pxTopOfStack--; + *pxTopOfStack = 0xcccccccc; + pxTopOfStack--; + *pxTopOfStack = 0xbbbbbbbb; + pxTopOfStack--; + *pxTopOfStack = 0xaaaaaaaa; + pxTopOfStack--; + *pxTopOfStack = 0x99999999; + pxTopOfStack--; + *pxTopOfStack = 0x88888888; + pxTopOfStack--; + *pxTopOfStack = 0x77777777; + pxTopOfStack--; + *pxTopOfStack = 0x66666666; + pxTopOfStack--; + *pxTopOfStack = 0x55555555; + pxTopOfStack--; + *pxTopOfStack = 0x44444444; + pxTopOfStack--; + *pxTopOfStack = 0x33333333; + pxTopOfStack--; + *pxTopOfStack = 0x22222222; + pxTopOfStack--; + } + #else + { + pxTopOfStack -= 15; + } + #endif + + *pxTopOfStack = ( StackType_t ) pvParameters; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_FPSW; + pxTopOfStack--; + *pxTopOfStack = 0x11111111; /* Accumulator 0. */ + pxTopOfStack--; + *pxTopOfStack = 0x22222222; /* Accumulator 0. */ + pxTopOfStack--; + *pxTopOfStack = 0x33333333; /* Accumulator 0. */ + pxTopOfStack--; + *pxTopOfStack = 0x44444444; /* Accumulator 1. */ + pxTopOfStack--; + *pxTopOfStack = 0x55555555; /* Accumulator 1. */ + pxTopOfStack--; + *pxTopOfStack = 0x66666666; /* Accumulator 1. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void vApplicationSetupTimerInterrupt( void ); + + /* Use pxCurrentTCB just so it does not get optimised away. */ + if( pxCurrentTCB != NULL ) + { + /* Call an application function to set up the timer that will generate the + tick interrupt. This way the application can decide which peripheral to + use. A demo application is provided to show a suitable example. */ + vApplicationSetupTimerInterrupt(); + + /* Enable the software interrupt. */ + _IEN( _ICU_SWINT ) = 1; + + /* Ensure the software interrupt is clear. */ + _IR( _ICU_SWINT ) = 0; + + /* Ensure the software interrupt is set to the kernel priority. */ + _IPR( _ICU_SWINT ) = configKERNEL_INTERRUPT_PRIORITY; + + /* Start the first task. */ + prvStartFirstTask(); + } + + /* Should not get here. */ + return pdFAIL; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( pxCurrentTCB == NULL ); +} +/*-----------------------------------------------------------*/ + +static void prvStartFirstTask( void ) +{ + __asm volatile + ( + /* When starting the scheduler there is nothing that needs moving to the + interrupt stack because the function is not called from an interrupt. + Just ensure the current stack is the user stack. */ + "SETPSW U \n" \ + + /* Obtain the location of the stack associated with which ever task + pxCurrentTCB is currently pointing to. */ + "MOV.L #_pxCurrentTCB, R15 \n" \ + "MOV.L [R15], R15 \n" \ + "MOV.L [R15], R0 \n" \ + + /* Restore the registers from the stack of the task pointed to by + pxCurrentTCB. */ + "POP R15 \n" \ + + /* Accumulator low 32 bits. */ + "MVTACLO R15, A0 \n" \ + "POP R15 \n" \ + + /* Accumulator high 32 bits. */ + "MVTACHI R15, A0 \n" \ + "POP R15 \n" \ + + /* Accumulator guard. */ + "MVTACGU R15, A0 \n" \ + "POP R15 \n" \ + + /* Accumulator low 32 bits. */ + "MVTACLO R15, A1 \n" \ + "POP R15 \n" \ + + /* Accumulator high 32 bits. */ + "MVTACHI R15, A1 \n" \ + "POP R15 \n" \ + + /* Accumulator guard. */ + "MVTACGU R15, A1 \n" \ + "POP R15 \n" \ + + /* Floating point status word. */ + "MVTC R15, FPSW \n" \ + + /* R1 to R15 - R0 is not included as it is the SP. */ + "POPM R1-R15 \n" \ + + /* This pops the remaining registers. */ + "RTE \n" \ + "NOP \n" \ + "NOP \n" + ); +} +/*-----------------------------------------------------------*/ + +void vSoftwareInterruptISR( void ) +{ + __asm volatile + ( + /* Re-enable interrupts. */ + "SETPSW I \n" \ + + /* Move the data that was automatically pushed onto the interrupt stack when + the interrupt occurred from the interrupt stack to the user stack. + + R15 is saved before it is clobbered. */ + "PUSH.L R15 \n" \ + + /* Read the user stack pointer. */ + "MVFC USP, R15 \n" \ + + /* Move the address down to the data being moved. */ + "SUB #12, R15 \n" \ + "MVTC R15, USP \n" \ + + /* Copy the data across, R15, then PC, then PSW. */ + "MOV.L [ R0 ], [ R15 ] \n" \ + "MOV.L 4[ R0 ], 4[ R15 ] \n" \ + "MOV.L 8[ R0 ], 8[ R15 ] \n" \ + + /* Move the interrupt stack pointer to its new correct position. */ + "ADD #12, R0 \n" \ + + /* All the rest of the registers are saved directly to the user stack. */ + "SETPSW U \n" \ + + /* Save the rest of the general registers (R15 has been saved already). */ + "PUSHM R1-R14 \n" \ + + /* Save the FPSW and accumulator. */ + "MVFC FPSW, R15 \n" \ + "PUSH.L R15 \n" \ + "MVFACGU #0, A1, R15 \n" \ + "PUSH.L R15 \n" \ + "MVFACHI #0, A1, R15 \n" \ + "PUSH.L R15 \n" \ + /* Low order word. */ + "MVFACLO #0, A1, R15 \n" \ + "PUSH.L R15 \n" \ + "MVFACGU #0, A0, R15 \n" \ + "PUSH.L R15 \n" \ + "MVFACHI #0, A0, R15 \n" \ + "PUSH.L R15 \n" \ + /* Low order word. */ + "MVFACLO #0, A0, R15 \n" \ + "PUSH.L R15 \n" \ + + /* Save the stack pointer to the TCB. */ + "MOV.L #_pxCurrentTCB, R15 \n" \ + "MOV.L [ R15 ], R15 \n" \ + "MOV.L R0, [ R15 ] \n" \ + + /* Ensure the interrupt mask is set to the syscall priority while the kernel + structures are being accessed. */ + "MVTIPL %0 \n" \ + + /* Select the next task to run. */ + "BSR.A _vTaskSwitchContext \n" \ + + /* Reset the interrupt mask as no more data structure access is required. */ + "MVTIPL %1 \n" \ + + /* Load the stack pointer of the task that is now selected as the Running + state task from its TCB. */ + "MOV.L #_pxCurrentTCB,R15 \n" \ + "MOV.L [ R15 ], R15 \n" \ + "MOV.L [ R15 ], R0 \n" \ + + /* Restore the context of the new task. The PSW (Program Status Word) and + PC will be popped by the RTE instruction. */ + "POP R15 \n" \ + + /* Accumulator low 32 bits. */ + "MVTACLO R15, A0 \n" \ + "POP R15 \n" \ + + /* Accumulator high 32 bits. */ + "MVTACHI R15, A0 \n" \ + "POP R15 \n" \ + + /* Accumulator guard. */ + "MVTACGU R15, A0 \n" \ + "POP R15 \n" \ + + /* Accumulator low 32 bits. */ + "MVTACLO R15, A1 \n" \ + "POP R15 \n" \ + + /* Accumulator high 32 bits. */ + "MVTACHI R15, A1 \n" \ + "POP R15 \n" \ + + /* Accumulator guard. */ + "MVTACGU R15, A1 \n" \ + "POP R15 \n" \ + "MVTC R15, FPSW \n" \ + "POPM R1-R15 \n" \ + "RTE \n" \ + "NOP \n" \ + "NOP " + :: "i"(configMAX_SYSCALL_INTERRUPT_PRIORITY), "i"(configKERNEL_INTERRUPT_PRIORITY) + ); +} +/*-----------------------------------------------------------*/ + +void vTickISR( void ) +{ + /* Re-enabled interrupts. */ + __asm volatile( "SETPSW I" ); + + /* Increment the tick, and perform any processing the new tick value + necessitates. Ensure IPL is at the max syscall value first. */ + portMASK_INTERRUPTS_FROM_KERNEL_ISR(); + { + if( xTaskIncrementTick() != pdFALSE ) + { + taskYIELD(); + } + } + portUNMASK_INTERRUPTS_FROM_KERNEL_ISR(); +} +/*-----------------------------------------------------------*/ + +uint32_t ulPortGetIPL( void ) +{ + __asm volatile + ( + "MVFC PSW, R1 \n" \ + "SHLR #24, R1 \n" \ + "RTS " + ); + + /* This will never get executed, but keeps the compiler from complaining. */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortSetIPL( uint32_t ulNewIPL ) +{ + __asm volatile + ( + "PUSH R5 \n" \ + "MVFC PSW, R5 \n" \ + "SHLL #24, R1 \n" \ + "AND #-0F000001H, R5 \n" \ + "OR R1, R5 \n" \ + "MVTC R5, PSW \n" \ + "POP R5 \n" \ + "RTS " + ); +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/RX600v2/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/RX600v2/portmacro.h new file mode 100644 index 0000000..942d71b --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/RX600v2/portmacro.h @@ -0,0 +1,180 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions - these are a bit legacy and not really used now, other than +portSTACK_TYPE and portBASE_TYPE. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 8 /* Could make four, according to manual. */ +#define portSTACK_GROWTH -1 +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portNOP() __asm volatile( "NOP" ) + +/* Yield equivalent to "*portITU_SWINTR = 0x01; ( void ) *portITU_SWINTR;" +where portITU_SWINTR is the location of the software interrupt register +(0x000872E0). Don't rely on the assembler to select a register, so instead +save and restore clobbered registers manually. */ +#define portYIELD() \ + __asm volatile \ + ( \ + "PUSH.L R10 \n" \ + "MOV.L #0x872E0, R10 \n" \ + "MOV.B #0x1, [R10] \n" \ + "MOV.L [R10], R10 \n" \ + "POP R10 \n" \ + ) + +#define portYIELD_FROM_ISR( x ) if( x != pdFALSE ) portYIELD() + +/* These macros should not be called directly, but through the +taskENTER_CRITICAL() and taskEXIT_CRITICAL() macros. An extra check is +performed if configASSERT() is defined to ensure an assertion handler does not +inadvertently attempt to lower the IPL when the call to assert was triggered +because the IPL value was found to be above configMAX_SYSCALL_INTERRUPT_PRIORITY +when an ISR safe FreeRTOS API function was executed. ISR safe FreeRTOS API +functions are those that end in FromISR. FreeRTOS maintains a separate +interrupt API to ensure API function and interrupt entry is as fast and as +simple as possible. */ +#define portENABLE_INTERRUPTS() __asm volatile ( "MVTIPL #0" ) +#ifdef configASSERT + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() configASSERT( ( ulPortGetIPL() <= configMAX_SYSCALL_INTERRUPT_PRIORITY ) ) + #define portDISABLE_INTERRUPTS() if( ulPortGetIPL() < configMAX_SYSCALL_INTERRUPT_PRIORITY ) __asm volatile ( "MVTIPL %0" ::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY) ) +#else + #define portDISABLE_INTERRUPTS() __asm volatile ( "MVTIPL %0" ::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY) ) +#endif + +/* Critical nesting counts are stored in the TCB. */ +#define portCRITICAL_NESTING_IN_TCB ( 1 ) + +/* The critical nesting functions defined within tasks.c. */ +extern void vTaskEnterCritical( void ); +extern void vTaskExitCritical( void ); +#define portENTER_CRITICAL() vTaskEnterCritical() +#define portEXIT_CRITICAL() vTaskExitCritical() + +/* As this port allows interrupt nesting... */ +uint32_t ulPortGetIPL( void ) __attribute__((naked)); +void vPortSetIPL( uint32_t ulNewIPL ) __attribute__((naked)); +#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortGetIPL(); portDISABLE_INTERRUPTS() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ) vPortSetIPL( uxSavedInterruptStatus ) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/STR75x/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/STR75x/port.c new file mode 100644 index 0000000..d175b5c --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/STR75x/port.c @@ -0,0 +1,239 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the ST STR75x ARM7 + * port. + *----------------------------------------------------------*/ + +/* Library includes. */ +#include "75x_tb.h" +#include "75x_eic.h" + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Constants required to setup the initial stack. */ +#define portINITIAL_SPSR ( ( StackType_t ) 0x1f ) /* System mode, ARM mode, interrupts enabled. */ +#define portTHUMB_MODE_BIT ( ( StackType_t ) 0x20 ) +#define portINSTRUCTION_SIZE ( ( StackType_t ) 4 ) + +/* Constants required to handle critical sections. */ +#define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) + +/* Prescale used on the timer clock when calculating the tick period. */ +#define portPRESCALE 20 + + +/*-----------------------------------------------------------*/ + +/* Setup the TB to generate the tick interrupts. */ +static void prvSetupTimerInterrupt( void ); + +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been called. + * + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +StackType_t *pxOriginalTOS; + + pxOriginalTOS = pxTopOfStack; + + /* To ensure asserts in tasks.c don't fail, although in this case the assert + is not really required. */ + pxTopOfStack--; + + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. */ + + /* First on the stack is the return address - which in this case is the + start of the task. The offset is added to make the return address appear + as it would within an IRQ ISR. */ + *pxTopOfStack = ( StackType_t ) pxCode + portINSTRUCTION_SIZE; + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) 0xaaaaaaaa; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxOriginalTOS; /* Stack used when task starts goes in R13. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */ + pxTopOfStack--; + + /* When the task starts is will expect to find the function parameter in + R0. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + + /* The status register is set for system mode, with interrupts enabled. */ + *pxTopOfStack = ( StackType_t ) portINITIAL_SPSR; + + #ifdef THUMB_INTERWORK + { + /* We want the task to start in thumb mode. */ + *pxTopOfStack |= portTHUMB_MODE_BIT; + } + #endif + + pxTopOfStack--; + + /* Interrupt flags cannot always be stored on the stack and will + instead be stored in a variable, which is then saved as part of the + tasks context. */ + *pxTopOfStack = portNO_CRITICAL_NESTING; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void vPortISRStartFirstTask( void ); + + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + prvSetupTimerInterrupt(); + + /* Start the first task. */ + vPortISRStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the ARM port will require this function as there + is nothing to return to. */ +} +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt( void ) +{ +EIC_IRQInitTypeDef EIC_IRQInitStructure; +TB_InitTypeDef TB_InitStructure; + + /* Setup the EIC for the TB. */ + EIC_IRQInitStructure.EIC_IRQChannelCmd = ENABLE; + EIC_IRQInitStructure.EIC_IRQChannel = TB_IRQChannel; + EIC_IRQInitStructure.EIC_IRQChannelPriority = 1; + EIC_IRQInit(&EIC_IRQInitStructure); + + /* Setup the TB for the generation of the tick interrupt. */ + TB_InitStructure.TB_Mode = TB_Mode_Timing; + TB_InitStructure.TB_CounterMode = TB_CounterMode_Down; + TB_InitStructure.TB_Prescaler = portPRESCALE - 1; + TB_InitStructure.TB_AutoReload = ( ( configCPU_CLOCK_HZ / portPRESCALE ) / configTICK_RATE_HZ ); + TB_Init(&TB_InitStructure); + + /* Enable TB Update interrupt */ + TB_ITConfig(TB_IT_Update, ENABLE); + + /* Clear TB Update interrupt pending bit */ + TB_ClearITPendingBit(TB_IT_Update); + + /* Enable TB */ + TB_Cmd(ENABLE); +} +/*-----------------------------------------------------------*/ + + + + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/STR75x/portISR.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/STR75x/portISR.c new file mode 100644 index 0000000..2dc9a4e --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/STR75x/portISR.c @@ -0,0 +1,224 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +/*----------------------------------------------------------- + * Components that can be compiled to either ARM or THUMB mode are + * contained in port.c The ISR routines, which can only be compiled + * to ARM mode, are contained in this file. + *----------------------------------------------------------*/ + +/* +*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Constants required to handle critical sections. */ +#define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) + +volatile uint32_t ulCriticalNesting = 9999UL; + +/*-----------------------------------------------------------*/ + +/* + * The scheduler can only be started from ARM mode, hence the inclusion of this + * function here. + */ +void vPortISRStartFirstTask( void ); +/*-----------------------------------------------------------*/ + +void vPortISRStartFirstTask( void ) +{ + /* Simply start the scheduler. This is included here as it can only be + called from ARM mode. */ + asm volatile ( \ + "LDR R0, =pxCurrentTCB \n\t" \ + "LDR R0, [R0] \n\t" \ + "LDR LR, [R0] \n\t" \ + \ + /* The critical nesting depth is the first item on the stack. */ \ + /* Load it into the ulCriticalNesting variable. */ \ + "LDR R0, =ulCriticalNesting \n\t" \ + "LDMFD LR!, {R1} \n\t" \ + "STR R1, [R0] \n\t" \ + \ + /* Get the SPSR from the stack. */ \ + "LDMFD LR!, {R0} \n\t" \ + "MSR SPSR, R0 \n\t" \ + \ + /* Restore all system mode registers for the task. */ \ + "LDMFD LR, {R0-R14}^ \n\t" \ + "NOP \n\t" \ + \ + /* Restore the return address. */ \ + "LDR LR, [LR, #+60] \n\t" \ + \ + /* And return - correcting the offset in the LR to obtain the */ \ + /* correct address. */ \ + "SUBS PC, LR, #4 \n\t" \ + ); +} +/*-----------------------------------------------------------*/ + +void vPortTickISR( void ) +{ + /* Increment the RTOS tick count, then look for the highest priority + task that is ready to run. */ + if( xTaskIncrementTick() != pdFALSE ) + { + vTaskSwitchContext(); + } + + /* Ready for the next interrupt. */ + TB_ClearITPendingBit( TB_IT_Update ); +} + +/*-----------------------------------------------------------*/ + +/* + * The interrupt management utilities can only be called from ARM mode. When + * THUMB_INTERWORK is defined the utilities are defined as functions here to + * ensure a switch to ARM mode. When THUMB_INTERWORK is not defined then + * the utilities are defined as macros in portmacro.h - as per other ports. + */ +#ifdef THUMB_INTERWORK + + void vPortDisableInterruptsFromThumb( void ) __attribute__ ((naked)); + void vPortEnableInterruptsFromThumb( void ) __attribute__ ((naked)); + + void vPortDisableInterruptsFromThumb( void ) + { + asm volatile ( + "STMDB SP!, {R0} \n\t" /* Push R0. */ + "MRS R0, CPSR \n\t" /* Get CPSR. */ + "ORR R0, R0, #0xC0 \n\t" /* Disable IRQ, FIQ. */ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ + "LDMIA SP!, {R0} \n\t" /* Pop R0. */ + "BX R14" ); /* Return back to thumb. */ + } + + void vPortEnableInterruptsFromThumb( void ) + { + asm volatile ( + "STMDB SP!, {R0} \n\t" /* Push R0. */ + "MRS R0, CPSR \n\t" /* Get CPSR. */ + "BIC R0, R0, #0xC0 \n\t" /* Enable IRQ, FIQ. */ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ + "LDMIA SP!, {R0} \n\t" /* Pop R0. */ + "BX R14" ); /* Return back to thumb. */ + } + +#endif /* THUMB_INTERWORK */ +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + /* Disable interrupts as per portDISABLE_INTERRUPTS(); */ + asm volatile ( + "STMDB SP!, {R0} \n\t" /* Push R0. */ + "MRS R0, CPSR \n\t" /* Get CPSR. */ + "ORR R0, R0, #0xC0 \n\t" /* Disable IRQ, FIQ. */ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ + "LDMIA SP!, {R0}" ); /* Pop R0. */ + + /* Now interrupts are disabled ulCriticalNesting can be accessed + directly. Increment ulCriticalNesting to keep a count of how many times + portENTER_CRITICAL() has been called. */ + ulCriticalNesting++; +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + if( ulCriticalNesting > portNO_CRITICAL_NESTING ) + { + /* Decrement the nesting count as we are leaving a critical section. */ + ulCriticalNesting--; + + /* If the nesting level has reached zero then interrupts should be + re-enabled. */ + if( ulCriticalNesting == portNO_CRITICAL_NESTING ) + { + /* Enable interrupts as per portEXIT_CRITICAL(). */ + asm volatile ( + "STMDB SP!, {R0} \n\t" /* Push R0. */ + "MRS R0, CPSR \n\t" /* Get CPSR. */ + "BIC R0, R0, #0xC0 \n\t" /* Enable IRQ, FIQ. */ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ + "LDMIA SP!, {R0}" ); /* Pop R0. */ + } + } +} + + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/STR75x/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/STR75x/portmacro.h new file mode 100644 index 0000000..8d2e59e --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/STR75x/portmacro.h @@ -0,0 +1,183 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +#define portYIELD() asm volatile ( "SWI 0" ) +#define portNOP() asm volatile ( "NOP" ) +/*-----------------------------------------------------------*/ + +/* Critical section handling. */ +/* + * The interrupt management utilities can only be called from ARM mode. When + * THUMB_INTERWORK is defined the utilities are defined as functions in + * portISR.c to ensure a switch to ARM mode. When THUMB_INTERWORK is not + * defined then the utilities are defined as macros here - as per other ports. + */ + +#ifdef THUMB_INTERWORK + + extern void vPortDisableInterruptsFromThumb( void ) __attribute__ ((naked)); + extern void vPortEnableInterruptsFromThumb( void ) __attribute__ ((naked)); + + #define portDISABLE_INTERRUPTS() vPortDisableInterruptsFromThumb() + #define portENABLE_INTERRUPTS() vPortEnableInterruptsFromThumb() + +#else + + #define portDISABLE_INTERRUPTS() \ + asm volatile ( \ + "STMDB SP!, {R0} \n\t" /* Push R0. */ \ + "MRS R0, CPSR \n\t" /* Get CPSR. */ \ + "ORR R0, R0, #0xC0 \n\t" /* Disable IRQ, FIQ. */ \ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ \ + "LDMIA SP!, {R0} " ) /* Pop R0. */ + + #define portENABLE_INTERRUPTS() \ + asm volatile ( \ + "STMDB SP!, {R0} \n\t" /* Push R0. */ \ + "MRS R0, CPSR \n\t" /* Get CPSR. */ \ + "BIC R0, R0, #0xC0 \n\t" /* Enable IRQ, FIQ. */ \ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ \ + "LDMIA SP!, {R0} " ) /* Pop R0. */ + +#endif /* THUMB_INTERWORK */ + +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); + +#define portENTER_CRITICAL() vPortEnterCritical(); +#define portEXIT_CRITICAL() vPortExitCritical(); +/*-----------------------------------------------------------*/ + +/* Task utilities. */ +#define portEND_SWITCHING_ISR( xSwitchRequired ) \ +{ \ +extern void vTaskSwitchContext( void ); \ + \ + if( xSwitchRequired ) \ + { \ + vTaskSwitchContext(); \ + } \ +} +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/TriCore_1782/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/TriCore_1782/port.c new file mode 100644 index 0000000..aef809c --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/TriCore_1782/port.c @@ -0,0 +1,583 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* Standard includes. */ +#include +#include + +/* TriCore specific includes. */ +#include +#include +#include +#include + +/* Kernel includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "list.h" + +#if configCHECK_FOR_STACK_OVERFLOW > 0 + #error "Stack checking cannot be used with this port, as, unlike most ports, the pxTopOfStack member of the TCB is consumed CSA. CSA starvation, loosely equivalent to stack overflow, will result in a trap exception." + /* The stack pointer is accessible using portCSA_TO_ADDRESS( portCSA_TO_ADDRESS( pxCurrentTCB->pxTopOfStack )[ 0 ] )[ 2 ]; */ +#endif /* configCHECK_FOR_STACK_OVERFLOW */ + + +/*-----------------------------------------------------------*/ + +/* System register Definitions. */ +#define portSYSTEM_PROGRAM_STATUS_WORD ( 0x000008FFUL ) /* Supervisor Mode, MPU Register Set 0 and Call Depth Counting disabled. */ +#define portINITIAL_PRIVILEGED_PROGRAM_STATUS_WORD ( 0x000014FFUL ) /* IO Level 1, MPU Register Set 1 and Call Depth Counting disabled. */ +#define portINITIAL_UNPRIVILEGED_PROGRAM_STATUS_WORD ( 0x000010FFUL ) /* IO Level 0, MPU Register Set 1 and Call Depth Counting disabled. */ +#define portINITIAL_PCXI_UPPER_CONTEXT_WORD ( 0x00C00000UL ) /* The lower 20 bits identify the CSA address. */ +#define portINITIAL_SYSCON ( 0x00000000UL ) /* MPU Disable. */ + +/* CSA manipulation macros. */ +#define portCSA_FCX_MASK ( 0x000FFFFFUL ) + +/* OS Interrupt and Trap mechanisms. */ +#define portRESTORE_PSW_MASK ( ~( 0x000000FFUL ) ) +#define portSYSCALL_TRAP ( 6 ) + +/* Each CSA contains 16 words of data. */ +#define portNUM_WORDS_IN_CSA ( 16 ) + +/* The interrupt enable bit in the PCP_SRC register. */ +#define portENABLE_CPU_INTERRUPT ( 1U << 12U ) +/*-----------------------------------------------------------*/ + +/* + * Perform any hardware configuration necessary to generate the tick interrupt. + */ +static void prvSystemTickHandler( int ) __attribute__((longcall)); +static void prvSetupTimerInterrupt( void ); + +/* + * Trap handler for yields. + */ +static void prvTrapYield( int iTrapIdentification ); + +/* + * Priority 1 interrupt handler for yields pended from an interrupt. + */ +static void prvInterruptYield( int iTrapIdentification ); + +/*-----------------------------------------------------------*/ + +/* This reference is required by the save/restore context macros. */ +extern volatile uint32_t *pxCurrentTCB; + +/* Precalculate the compare match value at compile time. */ +static const uint32_t ulCompareMatchValue = ( configPERIPHERAL_CLOCK_HZ / configTICK_RATE_HZ ); + +/*-----------------------------------------------------------*/ + +StackType_t *pxPortInitialiseStack( StackType_t * pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +uint32_t *pulUpperCSA = NULL; +uint32_t *pulLowerCSA = NULL; + + /* 16 Address Registers (4 Address registers are global), 16 Data + Registers, and 3 System Registers. + + There are 3 registers that track the CSAs. + FCX points to the head of globally free set of CSAs. + PCX for the task needs to point to Lower->Upper->NULL arrangement. + LCX points to the last free CSA so that corrective action can be taken. + + Need two CSAs to store the context of a task. + The upper context contains D8-D15, A10-A15, PSW and PCXI->NULL. + The lower context contains D0-D7, A2-A7, A11 and PCXI->UpperContext. + The pxCurrentTCB->pxTopOfStack points to the Lower Context RSLCX matching the initial BISR. + The Lower Context points to the Upper Context ready for the return from the interrupt handler. + + The Real stack pointer for the task is stored in the A10 which is restored + with the upper context. */ + + /* Have to disable interrupts here because the CSAs are going to be + manipulated. */ + portENTER_CRITICAL(); + { + /* DSync to ensure that buffering is not a problem. */ + _dsync(); + + /* Consume two free CSAs. */ + pulLowerCSA = portCSA_TO_ADDRESS( _mfcr( $FCX ) ); + if( NULL != pulLowerCSA ) + { + /* The Lower Links to the Upper. */ + pulUpperCSA = portCSA_TO_ADDRESS( pulLowerCSA[ 0 ] ); + } + + /* Check that we have successfully reserved two CSAs. */ + if( ( NULL != pulLowerCSA ) && ( NULL != pulUpperCSA ) ) + { + /* Remove the two consumed CSAs from the free CSA list. */ + _disable(); + _dsync(); + _mtcr( $FCX, pulUpperCSA[ 0 ] ); + _isync(); + _enable(); + } + else + { + /* Simply trigger a context list depletion trap. */ + _svlcx(); + } + } + portEXIT_CRITICAL(); + + /* Clear the upper CSA. */ + memset( pulUpperCSA, 0, portNUM_WORDS_IN_CSA * sizeof( uint32_t ) ); + + /* Upper Context. */ + pulUpperCSA[ 2 ] = ( uint32_t )pxTopOfStack; /* A10; Stack Return aka Stack Pointer */ + pulUpperCSA[ 1 ] = portSYSTEM_PROGRAM_STATUS_WORD; /* PSW */ + + /* Clear the lower CSA. */ + memset( pulLowerCSA, 0, portNUM_WORDS_IN_CSA * sizeof( uint32_t ) ); + + /* Lower Context. */ + pulLowerCSA[ 8 ] = ( uint32_t ) pvParameters; /* A4; Address Type Parameter Register */ + pulLowerCSA[ 1 ] = ( uint32_t ) pxCode; /* A11; Return Address aka RA */ + + /* PCXI pointing to the Upper context. */ + pulLowerCSA[ 0 ] = ( portINITIAL_PCXI_UPPER_CONTEXT_WORD | ( uint32_t ) portADDRESS_TO_CSA( pulUpperCSA ) ); + + /* Save the link to the CSA in the top of stack. */ + pxTopOfStack = (uint32_t * ) portADDRESS_TO_CSA( pulLowerCSA ); + + /* DSync to ensure that buffering is not a problem. */ + _dsync(); + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +int32_t xPortStartScheduler( void ) +{ +extern void vTrapInstallHandlers( void ); +uint32_t ulMFCR = 0UL; +uint32_t *pulUpperCSA = NULL; +uint32_t *pulLowerCSA = NULL; + + /* Interrupts at or below configMAX_SYSCALL_INTERRUPT_PRIORITY are disable + when this function is called. */ + + /* Set-up the timer interrupt. */ + prvSetupTimerInterrupt(); + + /* Install the Trap Handlers. */ + vTrapInstallHandlers(); + + /* Install the Syscall Handler for yield calls. */ + if( 0 == _install_trap_handler( portSYSCALL_TRAP, prvTrapYield ) ) + { + /* Failed to install the yield handler, force an assert. */ + configASSERT( ( ( volatile void * ) NULL ) ); + } + + /* Enable then install the priority 1 interrupt for pending context + switches from an ISR. See mod_SRC in the TriCore manual. */ + CPU_SRC0.reg = ( portENABLE_CPU_INTERRUPT ) | ( configKERNEL_YIELD_PRIORITY ); + if( 0 == _install_int_handler( configKERNEL_YIELD_PRIORITY, prvInterruptYield, 0 ) ) + { + /* Failed to install the yield handler, force an assert. */ + configASSERT( ( ( volatile void * ) NULL ) ); + } + + _disable(); + + /* Load the initial SYSCON. */ + _mtcr( $SYSCON, portINITIAL_SYSCON ); + _isync(); + + /* ENDINIT has already been applied in the 'cstart.c' code. */ + + /* Clear the PSW.CDC to enable the use of an RFE without it generating an + exception because this code is not genuinely in an exception. */ + ulMFCR = _mfcr( $PSW ); + ulMFCR &= portRESTORE_PSW_MASK; + _dsync(); + _mtcr( $PSW, ulMFCR ); + _isync(); + + /* Finally, perform the equivalent of a portRESTORE_CONTEXT() */ + pulLowerCSA = portCSA_TO_ADDRESS( ( *pxCurrentTCB ) ); + pulUpperCSA = portCSA_TO_ADDRESS( pulLowerCSA[0] ); + _dsync(); + _mtcr( $PCXI, *pxCurrentTCB ); + _isync(); + _nop(); + _rslcx(); + _nop(); + + /* Return to the first task selected to execute. */ + __asm volatile( "rfe" ); + + /* Will not get here. */ + return 0; +} +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt( void ) +{ + /* Set-up the clock divider. */ + unlock_wdtcon(); + { + /* Wait until access to Endint protected register is enabled. */ + while( 0 != ( WDT_CON0.reg & 0x1UL ) ); + + /* RMC == 1 so STM Clock == FPI */ + STM_CLC.reg = ( 1UL << 8 ); + } + lock_wdtcon(); + + /* Determine how many bits are used without changing other bits in the CMCON register. */ + STM_CMCON.reg &= ~( 0x1fUL ); + STM_CMCON.reg |= ( 0x1fUL - __CLZ( configPERIPHERAL_CLOCK_HZ / configTICK_RATE_HZ ) ); + + /* Take into account the current time so a tick doesn't happen immediately. */ + STM_CMP0.reg = ulCompareMatchValue + STM_TIM0.reg; + + if( 0 != _install_int_handler( configKERNEL_INTERRUPT_PRIORITY, prvSystemTickHandler, 0 ) ) + { + /* Set-up the interrupt. */ + STM_SRC0.reg = ( configKERNEL_INTERRUPT_PRIORITY | 0x00005000UL ); + + /* Enable the Interrupt. */ + STM_ISRR.reg &= ~( 0x03UL ); + STM_ISRR.reg |= 0x1UL; + STM_ISRR.reg &= ~( 0x07UL ); + STM_ICR.reg |= 0x1UL; + } + else + { + /* Failed to install the Tick Interrupt. */ + configASSERT( ( ( volatile void * ) NULL ) ); + } +} +/*-----------------------------------------------------------*/ + +static void prvSystemTickHandler( int iArg ) +{ +uint32_t ulSavedInterruptMask; +uint32_t *pxUpperCSA = NULL; +uint32_t xUpperCSA = 0UL; +extern volatile uint32_t *pxCurrentTCB; +int32_t lYieldRequired; + + /* Just to avoid compiler warnings about unused parameters. */ + ( void ) iArg; + + /* Clear the interrupt source. */ + STM_ISRR.reg = 1UL; + + /* Reload the Compare Match register for X ticks into the future. + + If critical section or interrupt nesting budgets are exceeded, then + it is possible that the calculated next compare match value is in the + past. If this occurs (unlikely), it is possible that the resulting + time slippage will exceed a single tick period. Any adverse effect of + this is time bounded by the fact that only the first n bits of the 56 bit + STM timer are being used for a compare match, so another compare match + will occur after an overflow in just those n bits (not the entire 56 bits). + As an example, if the peripheral clock is 75MHz, and the tick rate is 1KHz, + a missed tick could result in the next tick interrupt occurring within a + time that is 1.7 times the desired period. The fact that this is greater + than a single tick period is an effect of using a timer that cannot be + automatically reset, in hardware, by the occurrence of a tick interrupt. + Changing the tick source to a timer that has an automatic reset on compare + match (such as a GPTA timer) will reduce the maximum possible additional + period to exactly 1 times the desired period. */ + STM_CMP0.reg += ulCompareMatchValue; + + /* Kernel API calls require Critical Sections. */ + ulSavedInterruptMask = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the Tick. */ + lYieldRequired = xTaskIncrementTick(); + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulSavedInterruptMask ); + + if( lYieldRequired != pdFALSE ) + { + /* Save the context of a task. + The upper context is automatically saved when entering a trap or interrupt. + Need to save the lower context as well and copy the PCXI CSA ID into + pxCurrentTCB->pxTopOfStack. Only Lower Context CSA IDs may be saved to the + TCB of a task. + + Call vTaskSwitchContext to select the next task, note that this changes the + value of pxCurrentTCB so that it needs to be reloaded. + + Call vPortSetMPURegisterSetOne to change the MPU mapping for the task + that has just been switched in. + + Load the context of the task. + Need to restore the lower context by loading the CSA from + pxCurrentTCB->pxTopOfStack into PCXI (effectively changing the call stack). + In the Interrupt handler post-amble, RSLCX will restore the lower context + of the task. RFE will restore the upper context of the task, jump to the + return address and restore the previous state of interrupts being + enabled/disabled. */ + _disable(); + _dsync(); + xUpperCSA = _mfcr( $PCXI ); + pxUpperCSA = portCSA_TO_ADDRESS( xUpperCSA ); + *pxCurrentTCB = pxUpperCSA[ 0 ]; + vTaskSwitchContext(); + pxUpperCSA[ 0 ] = *pxCurrentTCB; + CPU_SRC0.bits.SETR = 0; + _isync(); + } +} +/*-----------------------------------------------------------*/ + +/* + * When a task is deleted, it is yielded permanently until the IDLE task + * has an opportunity to reclaim the memory that that task was using. + * Typically, the memory used by a task is the TCB and Stack but in the + * TriCore this includes the CSAs that were consumed as part of the Call + * Stack. These CSAs can only be returned to the Globally Free Pool when + * they are not part of the current Call Stack, hence, delaying the + * reclamation until the IDLE task is freeing the task's other resources. + * This function uses the head of the linked list of CSAs (from when the + * task yielded for the last time) and finds the tail (the very bottom of + * the call stack) and inserts this list at the head of the Free list, + * attaching the existing Free List to the tail of the reclaimed call stack. + * + * NOTE: the IDLE task needs processing time to complete this function + * and in heavily loaded systems, the Free CSAs may be consumed faster + * than they can be freed assuming that tasks are being spawned and + * deleted frequently. + */ +void vPortReclaimCSA( uint32_t *pxTCB ) +{ +uint32_t pxHeadCSA, pxTailCSA, pxFreeCSA; +uint32_t *pulNextCSA; + + /* A pointer to the first CSA in the list of CSAs consumed by the task is + stored in the first element of the tasks TCB structure (where the stack + pointer would be on a traditional stack based architecture). */ + pxHeadCSA = ( *pxTCB ) & portCSA_FCX_MASK; + + /* Mask off everything in the CSA link field other than the address. If + the address is NULL, then the CSA is not linking anywhere and there is + nothing to do. */ + pxTailCSA = pxHeadCSA; + + /* Convert the link value to contain just a raw address and store this + in a local variable. */ + pulNextCSA = portCSA_TO_ADDRESS( pxTailCSA ); + + /* Iterate over the CSAs that were consumed as part of the task. The + first field in the CSA is the pointer to then next CSA. Mask off + everything in the pointer to the next CSA, other than the link address. + If this is NULL, then the CSA currently being pointed to is the last in + the chain. */ + while( 0UL != ( pulNextCSA[ 0 ] & portCSA_FCX_MASK ) ) + { + /* Clear all bits of the pointer to the next in the chain, other + than the address bits themselves. */ + pulNextCSA[ 0 ] = pulNextCSA[ 0 ] & portCSA_FCX_MASK; + + /* Move the pointer to point to the next CSA in the list. */ + pxTailCSA = pulNextCSA[ 0 ]; + + /* Update the local pointer to the CSA. */ + pulNextCSA = portCSA_TO_ADDRESS( pxTailCSA ); + } + + _disable(); + { + /* Look up the current free CSA head. */ + _dsync(); + pxFreeCSA = _mfcr( $FCX ); + + /* Join the current Free onto the Tail of what is being reclaimed. */ + portCSA_TO_ADDRESS( pxTailCSA )[ 0 ] = pxFreeCSA; + + /* Move the head of the reclaimed into the Free. */ + _dsync(); + _mtcr( $FCX, pxHeadCSA ); + _isync(); + } + _enable(); +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Nothing to do. Unlikely to want to end. */ +} +/*-----------------------------------------------------------*/ + +static void prvTrapYield( int iTrapIdentification ) +{ +uint32_t *pxUpperCSA = NULL; +uint32_t xUpperCSA = 0UL; +extern volatile uint32_t *pxCurrentTCB; + + switch( iTrapIdentification ) + { + case portSYSCALL_TASK_YIELD: + /* Save the context of a task. + The upper context is automatically saved when entering a trap or interrupt. + Need to save the lower context as well and copy the PCXI CSA ID into + pxCurrentTCB->pxTopOfStack. Only Lower Context CSA IDs may be saved to the + TCB of a task. + + Call vTaskSwitchContext to select the next task, note that this changes the + value of pxCurrentTCB so that it needs to be reloaded. + + Call vPortSetMPURegisterSetOne to change the MPU mapping for the task + that has just been switched in. + + Load the context of the task. + Need to restore the lower context by loading the CSA from + pxCurrentTCB->pxTopOfStack into PCXI (effectively changing the call stack). + In the Interrupt handler post-amble, RSLCX will restore the lower context + of the task. RFE will restore the upper context of the task, jump to the + return address and restore the previous state of interrupts being + enabled/disabled. */ + _disable(); + _dsync(); + xUpperCSA = _mfcr( $PCXI ); + pxUpperCSA = portCSA_TO_ADDRESS( xUpperCSA ); + *pxCurrentTCB = pxUpperCSA[ 0 ]; + vTaskSwitchContext(); + pxUpperCSA[ 0 ] = *pxCurrentTCB; + CPU_SRC0.bits.SETR = 0; + _isync(); + break; + + default: + /* Unimplemented trap called. */ + configASSERT( ( ( volatile void * ) NULL ) ); + break; + } +} +/*-----------------------------------------------------------*/ + +static void prvInterruptYield( int iId ) +{ +uint32_t *pxUpperCSA = NULL; +uint32_t xUpperCSA = 0UL; +extern volatile uint32_t *pxCurrentTCB; + + /* Just to remove compiler warnings. */ + ( void ) iId; + + /* Save the context of a task. + The upper context is automatically saved when entering a trap or interrupt. + Need to save the lower context as well and copy the PCXI CSA ID into + pxCurrentTCB->pxTopOfStack. Only Lower Context CSA IDs may be saved to the + TCB of a task. + + Call vTaskSwitchContext to select the next task, note that this changes the + value of pxCurrentTCB so that it needs to be reloaded. + + Call vPortSetMPURegisterSetOne to change the MPU mapping for the task + that has just been switched in. + + Load the context of the task. + Need to restore the lower context by loading the CSA from + pxCurrentTCB->pxTopOfStack into PCXI (effectively changing the call stack). + In the Interrupt handler post-amble, RSLCX will restore the lower context + of the task. RFE will restore the upper context of the task, jump to the + return address and restore the previous state of interrupts being + enabled/disabled. */ + _disable(); + _dsync(); + xUpperCSA = _mfcr( $PCXI ); + pxUpperCSA = portCSA_TO_ADDRESS( xUpperCSA ); + *pxCurrentTCB = pxUpperCSA[ 0 ]; + vTaskSwitchContext(); + pxUpperCSA[ 0 ] = *pxCurrentTCB; + CPU_SRC0.bits.SETR = 0; + _isync(); +} +/*-----------------------------------------------------------*/ + +uint32_t uxPortSetInterruptMaskFromISR( void ) +{ +uint32_t uxReturn = 0UL; + + _disable(); + uxReturn = _mfcr( $ICR ); + _mtcr( $ICR, ( ( uxReturn & ~portCCPN_MASK ) | configMAX_SYSCALL_INTERRUPT_PRIORITY ) ); + _isync(); + _enable(); + + /* Return just the interrupt mask bits. */ + return ( uxReturn & portCCPN_MASK ); +} +/*-----------------------------------------------------------*/ + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/TriCore_1782/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/TriCore_1782/portmacro.h new file mode 100644 index 0000000..109a318 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/TriCore_1782/portmacro.h @@ -0,0 +1,215 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* System Includes. */ +#include +#include + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*---------------------------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 4 +#define portNOP() __asm volatile( " nop " ) +#define portCRITICAL_NESTING_IN_TCB 1 +#define portRESTORE_FIRST_TASK_PRIORITY_LEVEL 1 + + +/*---------------------------------------------------------------------------*/ + +typedef struct MPU_SETTINGS { uint32_t ulNotUsed; } xMPU_SETTINGS; + +/* Define away the instruction from the Restore Context Macro. */ +#define portPRIVILEGE_BIT 0x0UL + +#define portCCPN_MASK ( 0x000000FFUL ) + +extern void vTaskEnterCritical( void ); +extern void vTaskExitCritical( void ); +#define portENTER_CRITICAL() vTaskEnterCritical() +#define portEXIT_CRITICAL() vTaskExitCritical() +/*---------------------------------------------------------------------------*/ + +/* CSA Manipulation. */ +#define portCSA_TO_ADDRESS( pCSA ) ( ( uint32_t * )( ( ( ( pCSA ) & 0x000F0000 ) << 12 ) | ( ( ( pCSA ) & 0x0000FFFF ) << 6 ) ) ) +#define portADDRESS_TO_CSA( pAddress ) ( ( uint32_t )( ( ( ( (uint32_t)( pAddress ) ) & 0xF0000000 ) >> 12 ) | ( ( ( uint32_t )( pAddress ) & 0x003FFFC0 ) >> 6 ) ) ) +/*---------------------------------------------------------------------------*/ + +#define portYIELD() _syscall( 0 ) +/* Port Restore is implicit in the platform when the function is returned from the original PSW is automatically replaced. */ +#define portSYSCALL_TASK_YIELD 0 +#define portSYSCALL_RAISE_PRIORITY 1 +/*---------------------------------------------------------------------------*/ + +/* Critical section management. */ + +/* Set ICR.CCPN to configMAX_SYSCALL_INTERRUPT_PRIORITY. */ +#define portDISABLE_INTERRUPTS() { \ + uint32_t ulICR; \ + _disable(); \ + ulICR = _mfcr( $ICR ); /* Get current ICR value. */ \ + ulICR &= ~portCCPN_MASK; /* Clear down mask bits. */ \ + ulICR |= configMAX_SYSCALL_INTERRUPT_PRIORITY; /* Set mask bits to required priority mask. */ \ + _mtcr( $ICR, ulICR ); /* Write back updated ICR. */ \ + _isync(); \ + _enable(); \ + } + +/* Clear ICR.CCPN to allow all interrupt priorities. */ +#define portENABLE_INTERRUPTS() { \ + uint32_t ulICR; \ + _disable(); \ + ulICR = _mfcr( $ICR ); /* Get current ICR value. */ \ + ulICR &= ~portCCPN_MASK; /* Clear down mask bits. */ \ + _mtcr( $ICR, ulICR ); /* Write back updated ICR. */ \ + _isync(); \ + _enable(); \ + } + +/* Set ICR.CCPN to uxSavedMaskValue. */ +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedMaskValue ) { \ + uint32_t ulICR; \ + _disable(); \ + ulICR = _mfcr( $ICR ); /* Get current ICR value. */ \ + ulICR &= ~portCCPN_MASK; /* Clear down mask bits. */ \ + ulICR |= uxSavedMaskValue; /* Set mask bits to previously saved mask value. */ \ + _mtcr( $ICR, ulICR ); /* Write back updated ICR. */ \ + _isync(); \ + _enable(); \ + } + + +/* Set ICR.CCPN to configMAX_SYSCALL_INTERRUPT_PRIORITY */ +extern uint32_t uxPortSetInterruptMaskFromISR( void ); +#define portSET_INTERRUPT_MASK_FROM_ISR() uxPortSetInterruptMaskFromISR() + +/* Pend a priority 1 interrupt, which will take care of the context switch. */ +#define portYIELD_FROM_ISR( xHigherPriorityTaskWoken ) if( xHigherPriorityTaskWoken != pdFALSE ) { CPU_SRC0.bits.SETR = 1; _isync(); } + +/*---------------------------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*---------------------------------------------------------------------------*/ + +/* + * Port specific clean up macro required to free the CSAs that were consumed by + * a task that has since been deleted. + */ +void vPortReclaimCSA( uint32_t *pxTCB ); +#define portCLEAN_UP_TCB( pxTCB ) vPortReclaimCSA( ( uint32_t * ) ( pxTCB ) ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/TriCore_1782/porttrap.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/TriCore_1782/porttrap.c new file mode 100644 index 0000000..f7b31ef --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/GCC/TriCore_1782/porttrap.c @@ -0,0 +1,323 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* Kernel includes. */ +#include "FreeRTOS.h" + +/* Machine includes */ +#include +#include +#include +/*---------------------------------------------------------------------------*/ + +/* + * This reference is required by the Save/Restore Context Macros. + */ +extern volatile uint32_t *pxCurrentTCB; +/*-----------------------------------------------------------*/ + +/* + * This file contains base definitions for all of the possible traps in the system. + * It is suggested to provide implementations for all of the traps but for + * the time being they simply trigger a DEBUG instruction so that it is easy + * to see what caused a particular trap. + * + * Trap Class 6, the SYSCALL, is used exclusively by the operating system. + */ + +/* The Trap Classes. */ +#define portMMU_TRAP 0 +#define portIPT_TRAP 1 +#define portIE_TRAP 2 +#define portCM_TRAP 3 +#define portSBP_TRAP 4 +#define portASSERT_TRAP 5 +#define portNMI_TRAP 7 + +/* MMU Trap Identifications. */ +#define portTIN_MMU_VIRTUAL_ADDRESS_FILL 0 +#define portTIN_MMU_VIRTUAL_ADDRESS_PROTECTION 1 + +/* Internal Protection Trap Identifications. */ +#define portTIN_IPT_PRIVILIGED_INSTRUCTION 1 +#define portTIN_IPT_MEMORY_PROTECTION_READ 2 +#define portTIN_IPT_MEMORY_PROTECTION_WRITE 3 +#define portTIN_IPT_MEMORY_PROTECTION_EXECUTION 4 +#define portTIN_IPT_MEMORY_PROTECTION_PERIPHERAL_ACCESS 5 +#define portTIN_IPT_MEMORY_PROTECTION_NULL_ADDRESS 6 +#define portTIN_IPT_MEMORY_PROTECTION_GLOBAL_REGISTER_WRITE_PROTECTION 7 + +/* Instruction Error Trap Identifications. */ +#define portTIN_IE_ILLEGAL_OPCODE 1 +#define portTIN_IE_UNIMPLEMENTED_OPCODE 2 +#define portTIN_IE_INVALID_OPERAND 3 +#define portTIN_IE_DATA_ADDRESS_ALIGNMENT 4 +#define portTIN_IE_INVALID_LOCAL_MEMORY_ADDRESS 5 + +/* Context Management Trap Identifications. */ +#define portTIN_CM_FREE_CONTEXT_LIST_DEPLETION 1 +#define portTIN_CM_CALL_DEPTH_OVERFLOW 2 +#define portTIN_CM_CALL_DEPTH_UNDEFLOW 3 +#define portTIN_CM_FREE_CONTEXT_LIST_UNDERFLOW 4 +#define portTIN_CM_CALL_STACK_UNDERFLOW 5 +#define portTIN_CM_CONTEXT_TYPE 6 +#define portTIN_CM_NESTING_ERROR 7 + +/* System Bus and Peripherals Trap Identifications. */ +#define portTIN_SBP_PROGRAM_FETCH_SYNCHRONOUS_ERROR 1 +#define portTIN_SBP_DATA_ACCESS_SYNCHRONOUS_ERROR 2 +#define portTIN_SBP_DATA_ACCESS_ASYNCHRONOUS_ERROR 3 +#define portTIN_SBP_COPROCESSOR_TRAP_ASYNCHRONOUS_ERROR 4 +#define portTIN_SBP_PROGRAM_MEMORY_INTEGRITY_ERROR 5 +#define portTIN_SBP_DATA_MEMORY_INTEGRITY_ERROR 6 + +/* Assertion Trap Identifications. */ +#define portTIN_ASSERT_ARITHMETIC_OVERFLOW 1 +#define portTIN_ASSERT_STICKY_ARITHMETIC_OVERFLOW 2 + +/* Non-maskable Interrupt Trap Identifications. */ +#define portTIN_NMI_NON_MASKABLE_INTERRUPT 0 +/*---------------------------------------------------------------------------*/ + +void vMMUTrap( int iTrapIdentification ) __attribute__( ( longcall, weak ) ); +void vInternalProtectionTrap( int iTrapIdentification ) __attribute__( ( longcall, weak ) ); +void vInstructionErrorTrap( int iTrapIdentification ) __attribute__( ( longcall, weak ) ); +void vContextManagementTrap( int iTrapIdentification ) __attribute__( ( longcall, weak ) ); +void vSystemBusAndPeripheralsTrap( int iTrapIdentification ) __attribute__( ( longcall, weak ) ); +void vAssertionTrap( int iTrapIdentification ) __attribute__( ( longcall, weak ) ); +void vNonMaskableInterruptTrap( int iTrapIdentification ) __attribute__( ( longcall, weak ) ); +/*---------------------------------------------------------------------------*/ + +void vTrapInstallHandlers( void ) +{ + if( 0 == _install_trap_handler ( portMMU_TRAP, vMMUTrap ) ) + { + _debug(); + } + + if( 0 == _install_trap_handler ( portIPT_TRAP, vInternalProtectionTrap ) ) + { + _debug(); + } + + if( 0 == _install_trap_handler ( portIE_TRAP, vInstructionErrorTrap ) ) + { + _debug(); + } + + if( 0 == _install_trap_handler ( portCM_TRAP, vContextManagementTrap ) ) + { + _debug(); + } + + if( 0 == _install_trap_handler ( portSBP_TRAP, vSystemBusAndPeripheralsTrap ) ) + { + _debug(); + } + + if( 0 == _install_trap_handler ( portASSERT_TRAP, vAssertionTrap ) ) + { + _debug(); + } + + if( 0 == _install_trap_handler ( portNMI_TRAP, vNonMaskableInterruptTrap ) ) + { + _debug(); + } +} +/*-----------------------------------------------------------*/ + +void vMMUTrap( int iTrapIdentification ) +{ + switch( iTrapIdentification ) + { + case portTIN_MMU_VIRTUAL_ADDRESS_FILL: + case portTIN_MMU_VIRTUAL_ADDRESS_PROTECTION: + default: + _debug(); + break; + } +} +/*---------------------------------------------------------------------------*/ + +void vInternalProtectionTrap( int iTrapIdentification ) +{ + /* Deliberate fall through to default. */ + switch( iTrapIdentification ) + { + case portTIN_IPT_PRIVILIGED_INSTRUCTION: + /* Instruction is not allowed at current execution level, eg DISABLE at User-0. */ + + case portTIN_IPT_MEMORY_PROTECTION_READ: + /* Load word using invalid address. */ + + case portTIN_IPT_MEMORY_PROTECTION_WRITE: + /* Store Word using invalid address. */ + + case portTIN_IPT_MEMORY_PROTECTION_EXECUTION: + /* PC jumped to an address outside of the valid range. */ + + case portTIN_IPT_MEMORY_PROTECTION_PERIPHERAL_ACCESS: + /* Access to a peripheral denied at current execution level. */ + + case portTIN_IPT_MEMORY_PROTECTION_NULL_ADDRESS: + /* NULL Pointer. */ + + case portTIN_IPT_MEMORY_PROTECTION_GLOBAL_REGISTER_WRITE_PROTECTION: + /* Tried to modify a global address pointer register. */ + + default: + + pxCurrentTCB[ 0 ] = _mfcr( $PCXI ); + _debug(); + break; + } +} +/*---------------------------------------------------------------------------*/ + +void vInstructionErrorTrap( int iTrapIdentification ) +{ + /* Deliberate fall through to default. */ + switch( iTrapIdentification ) + { + case portTIN_IE_ILLEGAL_OPCODE: + case portTIN_IE_UNIMPLEMENTED_OPCODE: + case portTIN_IE_INVALID_OPERAND: + case portTIN_IE_DATA_ADDRESS_ALIGNMENT: + case portTIN_IE_INVALID_LOCAL_MEMORY_ADDRESS: + default: + _debug(); + break; + } +} +/*---------------------------------------------------------------------------*/ + +void vContextManagementTrap( int iTrapIdentification ) +{ + /* Deliberate fall through to default. */ + switch( iTrapIdentification ) + { + case portTIN_CM_FREE_CONTEXT_LIST_DEPLETION: + case portTIN_CM_CALL_DEPTH_OVERFLOW: + case portTIN_CM_CALL_DEPTH_UNDEFLOW: + case portTIN_CM_FREE_CONTEXT_LIST_UNDERFLOW: + case portTIN_CM_CALL_STACK_UNDERFLOW: + case portTIN_CM_CONTEXT_TYPE: + case portTIN_CM_NESTING_ERROR: + default: + _debug(); + break; + } +} +/*---------------------------------------------------------------------------*/ + +void vSystemBusAndPeripheralsTrap( int iTrapIdentification ) +{ + /* Deliberate fall through to default. */ + switch( iTrapIdentification ) + { + case portTIN_SBP_PROGRAM_FETCH_SYNCHRONOUS_ERROR: + case portTIN_SBP_DATA_ACCESS_SYNCHRONOUS_ERROR: + case portTIN_SBP_DATA_ACCESS_ASYNCHRONOUS_ERROR: + case portTIN_SBP_COPROCESSOR_TRAP_ASYNCHRONOUS_ERROR: + case portTIN_SBP_PROGRAM_MEMORY_INTEGRITY_ERROR: + case portTIN_SBP_DATA_MEMORY_INTEGRITY_ERROR: + default: + _debug(); + break; + } +} +/*---------------------------------------------------------------------------*/ + +void vAssertionTrap( int iTrapIdentification ) +{ + /* Deliberate fall through to default. */ + switch( iTrapIdentification ) + { + case portTIN_ASSERT_ARITHMETIC_OVERFLOW: + case portTIN_ASSERT_STICKY_ARITHMETIC_OVERFLOW: + default: + _debug(); + break; + } +} +/*---------------------------------------------------------------------------*/ + +void vNonMaskableInterruptTrap( int iTrapIdentification ) +{ + /* Deliberate fall through to default. */ + switch( iTrapIdentification ) + { + case portTIN_NMI_NON_MASKABLE_INTERRUPT: + default: + _debug(); + break; + } +} +/*---------------------------------------------------------------------------*/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/78K0R/ISR_Support.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/78K0R/ISR_Support.h new file mode 100644 index 0000000..e03010c --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/78K0R/ISR_Support.h @@ -0,0 +1,109 @@ +;/* +; FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. +; All rights reserved +; +; +; *************************************************************************** +; * * +; * FreeRTOS tutorial books are available in pdf and paperback. * +; * Complete, revised, and edited pdf reference manuals are also * +; * available. * +; * * +; * Purchasing FreeRTOS documentation will not only help you, by * +; * ensuring you get running as quickly as possible and with an * +; * in-depth knowledge of how to use FreeRTOS, it will also help * +; * the FreeRTOS project to continue with its mission of providing * +; * professional grade, cross platform, de facto standard solutions * +; * for microcontrollers - completely free of charge! * +; * * +; * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * +; * * +; * Thank you for using FreeRTOS, and thank you for your support! * +; * * +; *************************************************************************** +; +; +; This file is part of the FreeRTOS distribution. +; +; FreeRTOS is free software; you can redistribute it and/or modify it under +; the terms of the GNU General Public License (version 2) as published by the +; Free Software Foundation AND MODIFIED BY the FreeRTOS exception. +; >>>NOTE<<< The modification to the GPL is included to allow you to +; distribute a combined work that includes FreeRTOS without being obliged to +; provide the source code for proprietary components outside of the FreeRTOS +; kernel. FreeRTOS is distributed in the hope that it will be useful, but +; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +; more details. You should have received a copy of the GNU General Public +; License and the FreeRTOS license exception along with FreeRTOS; if not it +; can be viewed here: http://www.freertos.org/a00114.html and also obtained +; by writing to Richard Barry, contact details for whom are available on the +; FreeRTOS WEB site. +; +; 1 tab == 4 spaces! +; +; http://www.FreeRTOS.org - Documentation, latest information, license and +; contact details. +; +; http://www.SafeRTOS.com - A version that is certified for use in safety +; critical systems. +; +; http://www.OpenRTOS.com - Commercial support, development, porting, +; licensing and training services. +;*/ + +#include "FreeRTOSConfig.h" + +; Variables used by scheduler +;------------------------------------------------------------------------------ + EXTERN pxCurrentTCB + EXTERN usCriticalNesting + +;------------------------------------------------------------------------------ +; portSAVE_CONTEXT MACRO +; Saves the context of the general purpose registers, CS and ES (only in far +; memory mode) registers the usCriticalNesting Value and the Stack Pointer +; of the active Task onto the task stack +;------------------------------------------------------------------------------ +portSAVE_CONTEXT MACRO + + PUSH AX ; Save AX Register to stack. + PUSH HL + MOV A, CS ; Save CS register. + XCH A, X + MOV A, ES ; Save ES register. + PUSH AX + PUSH DE ; Save the remaining general purpose registers. + PUSH BC + MOVW AX, usCriticalNesting ; Save the usCriticalNesting value. + PUSH AX + MOVW AX, pxCurrentTCB ; Save the Stack pointer. + MOVW HL, AX + MOVW AX, SP + MOVW [HL], AX + ENDM +;------------------------------------------------------------------------------ + +;------------------------------------------------------------------------------ +; portRESTORE_CONTEXT MACRO +; Restores the task Stack Pointer then use this to restore usCriticalNesting, +; general purpose registers and the CS and ES (only in far memory mode) +; of the selected task from the task stack +;------------------------------------------------------------------------------ +portRESTORE_CONTEXT MACRO + MOVW AX, pxCurrentTCB ; Restore the Stack pointer. + MOVW HL, AX + MOVW AX, [HL] + MOVW SP, AX + POP AX ; Restore usCriticalNesting value. + MOVW usCriticalNesting, AX + POP BC ; Restore the necessary general purpose registers. + POP DE + POP AX ; Restore the ES register. + MOV ES, A + XCH A, X ; Restore the CS register. + MOV CS, A + POP HL ; Restore general purpose register HL. + POP AX ; Restore AX. + ENDM +;------------------------------------------------------------------------------ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/78K0R/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/78K0R/port.c new file mode 100644 index 0000000..f859389 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/78K0R/port.c @@ -0,0 +1,267 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* The critical nesting value is initialised to a non zero value to ensure +interrupts don't accidentally become enabled before the scheduler is started. */ +#define portINITIAL_CRITICAL_NESTING (( uint16_t ) 10) + +/* Initial PSW value allocated to a newly created task. + * 1100011000000000 + * ||||||||-------------- Fill byte + * |||||||--------------- Carry Flag cleared + * |||||----------------- In-service priority Flags set to low level + * ||||------------------ Register bank Select 0 Flag cleared + * |||------------------- Auxiliary Carry Flag cleared + * ||-------------------- Register bank Select 1 Flag cleared + * |--------------------- Zero Flag set + * ---------------------- Global Interrupt Flag set (enabled) + */ +#define portPSW (0xc6UL) + +/* We require the address of the pxCurrentTCB variable, but don't want to know +any details of its type. */ +typedef void TCB_t; +extern volatile TCB_t * volatile pxCurrentTCB; + +/* Most ports implement critical sections by placing the interrupt flags on +the stack before disabling interrupts. Exiting the critical section is then +simply a case of popping the flags from the stack. As 78K0 IAR does not use +a frame pointer this cannot be done as modifying the stack will clobber all +the stack variables. Instead each task maintains a count of the critical +section nesting depth. Each time a critical section is entered the count is +incremented. Each time a critical section is left the count is decremented - +with interrupts only being re-enabled if the count is zero. + +usCriticalNesting will get set to zero when the scheduler starts, but must +not be initialised to zero as this will cause problems during the startup +sequence. */ +volatile uint16_t usCriticalNesting = portINITIAL_CRITICAL_NESTING; +/*-----------------------------------------------------------*/ + +/* + * Sets up the periodic ISR used for the RTOS tick. + */ +static void prvSetupTimerInterrupt( void ); +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been called. + * + * See the header file portable.h. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +uint32_t *pulLocal; + + #if configMEMORY_MODE == 1 + { + /* Parameters are passed in on the stack, and written using a 32bit value + hence a space is left for the second two bytes. */ + pxTopOfStack--; + + /* Write in the parameter value. */ + pulLocal = ( uint32_t * ) pxTopOfStack; + *pulLocal = ( uint32_t ) pvParameters; + pxTopOfStack--; + + /* These values are just spacers. The return address of the function + would normally be written here. */ + *pxTopOfStack = ( StackType_t ) 0xcdcd; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xcdcd; + pxTopOfStack--; + + /* The start address / PSW value is also written in as a 32bit value, + so leave a space for the second two bytes. */ + pxTopOfStack--; + + /* Task function start address combined with the PSW. */ + pulLocal = ( uint32_t * ) pxTopOfStack; + *pulLocal = ( ( ( uint32_t ) pxCode ) | ( portPSW << 24UL ) ); + pxTopOfStack--; + + /* An initial value for the AX register. */ + *pxTopOfStack = ( StackType_t ) 0x1111; + pxTopOfStack--; + } + #else + { + /* Task function address is written to the stack first. As it is + written as a 32bit value a space is left on the stack for the second + two bytes. */ + pxTopOfStack--; + + /* Task function start address combined with the PSW. */ + pulLocal = ( uint32_t * ) pxTopOfStack; + *pulLocal = ( ( ( uint32_t ) pxCode ) | ( portPSW << 24UL ) ); + pxTopOfStack--; + + /* The parameter is passed in AX. */ + *pxTopOfStack = ( StackType_t ) pvParameters; + pxTopOfStack--; + } + #endif + + /* An initial value for the HL register. */ + *pxTopOfStack = ( StackType_t ) 0x2222; + pxTopOfStack--; + + /* CS and ES registers. */ + *pxTopOfStack = ( StackType_t ) 0x0F00; + pxTopOfStack--; + + /* Finally the remaining general purpose registers DE and BC */ + *pxTopOfStack = ( StackType_t ) 0xDEDE; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xBCBC; + pxTopOfStack--; + + /* Finally the critical section nesting count is set to zero when the task + first starts. */ + *pxTopOfStack = ( StackType_t ) portNO_CRITICAL_SECTION_NESTING; + + /* Return a pointer to the top of the stack we have generated so this can + be stored in the task control block for the task. */ + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* Setup the hardware to generate the tick. Interrupts are disabled when + this function is called. */ + prvSetupTimerInterrupt(); + + /* Restore the context of the first task that is going to run. */ + vPortStart(); + + /* Should not get here as the tasks are now running! */ + return pdTRUE; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the 78K0R port will get stopped. If required simply + disable the tick interrupt here. */ +} +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt( void ) +{ + /* Setup channel 5 of the TAU to generate the tick interrupt. */ + + /* First the Timer Array Unit has to be enabled. */ + TAU0EN = 1; + + /* To configure the Timer Array Unit all Channels have to first be stopped. */ + TT0 = 0xff; + + /* Interrupt of Timer Array Unit Channel 5 is disabled to set the interrupt + priority. */ + TMMK05 = 1; + + /* Clear Timer Array Unit Channel 5 interrupt flag. */ + TMIF05 = 0; + + /* Set Timer Array Unit Channel 5 interrupt priority */ + TMPR005 = 0; + TMPR105 = 0; + + /* Set Timer Array Unit Channel 5 Mode as interval timer. */ + TMR05 = 0x0000; + + /* Set the compare match value according to the tick rate we want. */ + TDR05 = ( TickType_t ) ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ); + + /* Set Timer Array Unit Channel 5 output mode */ + TOM0 &= ~0x0020; + + /* Set Timer Array Unit Channel 5 output level */ + TOL0 &= ~0x0020; + + /* Set Timer Array Unit Channel 5 output enable */ + TOE0 &= ~0x0020; + + /* Interrupt of Timer Array Unit Channel 5 enabled */ + TMMK05 = 0; + + /* Start Timer Array Unit Channel 5.*/ + TS0 |= 0x0020; +} +/*-----------------------------------------------------------*/ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/78K0R/portasm.s26 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/78K0R/portasm.s26 new file mode 100644 index 0000000..f17f74d --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/78K0R/portasm.s26 @@ -0,0 +1,164 @@ +;/* +; FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. +; All rights reserved +; +; +; *************************************************************************** +; * * +; * FreeRTOS tutorial books are available in pdf and paperback. * +; * Complete, revised, and edited pdf reference manuals are also * +; * available. * +; * * +; * Purchasing FreeRTOS documentation will not only help you, by * +; * ensuring you get running as quickly as possible and with an * +; * in-depth knowledge of how to use FreeRTOS, it will also help * +; * the FreeRTOS project to continue with its mission of providing * +; * professional grade, cross platform, de facto standard solutions * +; * for microcontrollers - completely free of charge! * +; * * +; * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * +; * * +; * Thank you for using FreeRTOS, and thank you for your support! * +; * * +; *************************************************************************** +; +; +; This file is part of the FreeRTOS distribution. +; +; FreeRTOS is free software; you can redistribute it and/or modify it under +; the terms of the GNU General Public License (version 2) as published by the +; Free Software Foundation AND MODIFIED BY the FreeRTOS exception. +; >>>NOTE<<< The modification to the GPL is included to allow you to +; distribute a combined work that includes FreeRTOS without being obliged to +; provide the source code for proprietary components outside of the FreeRTOS +; kernel. FreeRTOS is distributed in the hope that it will be useful, but +; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +; more details. You should have received a copy of the GNU General Public +; License and the FreeRTOS license exception along with FreeRTOS; if not it +; can be viewed here: http://www.freertos.org/a00114.html and also obtained +; by writing to Richard Barry, contact details for whom are available on the +; FreeRTOS WEB site. +; +; 1 tab == 4 spaces! +; +; http://www.FreeRTOS.org - Documentation, latest information, license and +; contact details. +; +; http://www.SafeRTOS.com - A version that is certified for use in safety +; critical systems. +; +; http://www.OpenRTOS.com - Commercial support, development, porting, +; licensing and training services. +;*/ +#include "ISR_Support.h" +;------------------------------------------------------------------------------ + +#if __CORE__ != __78K0R__ + #error "This file is only for 78K0R Devices" +#endif + +#define CS 0xFFFFC +#define ES 0xFFFFD + +; Functions implemented in this file +;------------------------------------------------------------------------------ + PUBLIC vPortYield + PUBLIC vPortStart + +; Functions used by scheduler +;------------------------------------------------------------------------------ + EXTERN vTaskSwitchContext + EXTERN xTaskIncrementTick + +; Tick ISR Prototype +;------------------------------------------------------------------------------ +; EXTERN ?CL78K0R_V2_L00 + + PUBWEAK `??MD_INTTM05??INTVEC 68` + PUBLIC MD_INTTM05 + +MD_INTTM05 SYMBOL "MD_INTTM05" +`??MD_INTTM05??INTVEC 68` SYMBOL "??INTVEC 68", MD_INTTM05 + + + +;------------------------------------------------------------------------------ +; Yield to another task. Implemented as a software interrupt. The return +; address and PSW will have been saved to the stack automatically before +; this code runs. +; +; Input: NONE +; +; Call: CALL vPortYield +; +; Output: NONE +; +;------------------------------------------------------------------------------ + RSEG CODE:CODE +vPortYield: + portSAVE_CONTEXT ; Save the context of the current task. + call vTaskSwitchContext ; Call the scheduler to select the next task. + portRESTORE_CONTEXT ; Restore the context of the next task to run. + retb + + +;------------------------------------------------------------------------------ +; Restore the context of the first task that is going to run. +; +; Input: NONE +; +; Call: CALL vPortStart +; +; Output: NONE +; +;------------------------------------------------------------------------------ + RSEG CODE:CODE +vPortStart: + portRESTORE_CONTEXT ; Restore the context of whichever task the ... + reti ; An interrupt stack frame is used so the task + ; is started using a RETI instruction. + +;------------------------------------------------------------------------------ +; Perform the necessary steps of the Tick Count Increment and Task Switch +; depending on the chosen kernel configuration +; +; Input: NONE +; +; Call: ISR +; +; Output: NONE +; +;------------------------------------------------------------------------------ + +MD_INTTM05: + + portSAVE_CONTEXT ; Save the context of the current task. + call xTaskIncrementTick ; Call the timer tick function. +#if configUSE_PREEMPTION == 1 + call vTaskSwitchContext ; Call the scheduler to select the next task. +#endif + portRESTORE_CONTEXT ; Restore the context of the next task to run. + reti + + + +; REQUIRE ?CL78K0R_V2_L00 + COMMON INTVEC:CODE:ROOT(1) ; Set ISR location to the Interrupt vector table. + ORG 68 +`??MD_INTTM05??INTVEC 68`: + DW MD_INTTM05 + + COMMON INTVEC:CODE:ROOT(1) ; Set ISR location to the Interrupt vector table. + ORG 126 +`??vPortYield??INTVEC 126`: + DW vPortYield + + ; Set value for the usCriticalNesting. + RSEG NEAR_ID:CONST:SORT:NOROOT(1) +`?`: + DW 10 + +;#endif + + END \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/78K0R/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/78K0R/portmacro.h new file mode 100644 index 0000000..3193fa6 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/78K0R/portmacro.h @@ -0,0 +1,187 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ + +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint16_t +#define portBASE_TYPE short + +typedef portSTACK_TYPE StackType_t; +typedef short BaseType_t; +typedef unsigned short UBaseType_t; + +#if (configUSE_16_BIT_TICKS==1) + typedef unsigned int TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Interrupt control macros. */ +#define portDISABLE_INTERRUPTS() __asm ( "DI" ) +#define portENABLE_INTERRUPTS() __asm ( "EI" ) +/*-----------------------------------------------------------*/ + +/* Critical section control macros. */ +#define portNO_CRITICAL_SECTION_NESTING ( ( uint16_t ) 0 ) + +#define portENTER_CRITICAL() \ +{ \ +extern volatile uint16_t usCriticalNesting; \ + \ + portDISABLE_INTERRUPTS(); \ + \ + /* Now interrupts are disabled ulCriticalNesting can be accessed */ \ + /* directly. Increment ulCriticalNesting to keep a count of how many */ \ + /* times portENTER_CRITICAL() has been called. */ \ + usCriticalNesting++; \ +} + +#define portEXIT_CRITICAL() \ +{ \ +extern volatile uint16_t usCriticalNesting; \ + \ + if( usCriticalNesting > portNO_CRITICAL_SECTION_NESTING ) \ + { \ + /* Decrement the nesting count as we are leaving a critical section. */ \ + usCriticalNesting--; \ + \ + /* If the nesting level has reached zero then interrupts should be */ \ + /* re-enabled. */ \ + if( usCriticalNesting == portNO_CRITICAL_SECTION_NESTING ) \ + { \ + portENABLE_INTERRUPTS(); \ + } \ + } \ +} +/*-----------------------------------------------------------*/ + +/* Task utilities. */ +extern void vPortStart( void ); +#define portYIELD() __asm( "BRK" ) +#define portYIELD_FROM_ISR( xHigherPriorityTaskWoken ) if( xHigherPriorityTaskWoken ) vTaskSwitchContext() +#define portNOP() __asm( "NOP" ) +/*-----------------------------------------------------------*/ + +/* Hardwware specifics. */ +#define portBYTE_ALIGNMENT 2 +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + + +static __interrupt void P0_isr (void); + +/* --------------------------------------------------------------------------*/ +/* Option-bytes and security ID */ +/* --------------------------------------------------------------------------*/ +#define OPT_BYTES_SIZE 4 +#define SECU_ID_SIZE 10 +#define WATCHDOG_DISABLED 0x00 +#define LVI_ENABLED 0xFE +#define LVI_DISABLED 0xFF +#define RESERVED_FF 0xFF +#define OCD_DISABLED 0x04 +#define OCD_ENABLED 0x81 +#define OCD_ENABLED_ERASE 0x80 + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CA5_No_GIC/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CA5_No_GIC/port.c new file mode 100644 index 0000000..1a621fe --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CA5_No_GIC/port.c @@ -0,0 +1,342 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* IAR includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +#ifndef configSETUP_TICK_INTERRUPT + #error configSETUP_TICK_INTERRUPT() must be defined in FreeRTOSConfig.h to call the function that sets up the tick interrupt. A default that uses the PIT is provided in the official demo application. +#endif + +#ifndef configCLEAR_TICK_INTERRUPT + #error configCLEAR_TICK_INTERRUPT must be defined in FreeRTOSConfig.h to clear which ever interrupt was used to generate the tick interrupt. A default that uses the PIT is provided in the official demo application. +#endif + +/* A critical section is exited when the critical section nesting count reaches +this value. */ +#define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) + +/* Tasks are not created with a floating point context, but can be given a +floating point context after they have been created. A variable is stored as +part of the tasks context that holds portNO_FLOATING_POINT_CONTEXT if the task +does not have an FPU context, or any other value if the task does have an FPU +context. */ +#define portNO_FLOATING_POINT_CONTEXT ( ( StackType_t ) 0 ) + +/* Constants required to setup the initial task context. */ +#define portINITIAL_SPSR ( ( StackType_t ) 0x1f ) /* System mode, ARM mode, interrupts enabled. */ +#define portTHUMB_MODE_BIT ( ( StackType_t ) 0x20 ) +#define portTHUMB_MODE_ADDRESS ( 0x01UL ) + +/* Masks all bits in the APSR other than the mode bits. */ +#define portAPSR_MODE_BITS_MASK ( 0x1F ) + +/* The value of the mode bits in the APSR when the CPU is executing in user +mode. */ +#define portAPSR_USER_MODE ( 0x10 ) + +/*-----------------------------------------------------------*/ + +/* + * Starts the first task executing. This function is necessarily written in + * assembly code so is implemented in portASM.s. + */ +extern void vPortRestoreTaskContext( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* A variable is used to keep track of the critical section nesting. This +variable has to be stored as part of the task context and must be initialised to +a non zero value to ensure interrupts don't inadvertently become unmasked before +the scheduler starts. As it is stored as part of the task context it will +automatically be set to 0 when the first task is started. */ +volatile uint32_t ulCriticalNesting = 9999UL; + +/* Saved as part of the task context. If ulPortTaskHasFPUContext is non-zero +then a floating point context must be saved and restored for the task. */ +uint32_t ulPortTaskHasFPUContext = pdFALSE; + +/* Set to 1 to pend a context switch from an ISR. */ +uint32_t ulPortYieldRequired = pdFALSE; + +/* Counts the interrupt nesting depth. A context switch is only performed if +if the nesting depth is 0. */ +uint32_t ulPortInterruptNesting = 0UL; + + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. + + The fist real value on the stack is the status register, which is set for + system mode, with interrupts enabled. A few NULLs are added first to ensure + GDB does not try decoding a non-existent return address. */ + *pxTopOfStack = NULL; + pxTopOfStack--; + *pxTopOfStack = NULL; + pxTopOfStack--; + *pxTopOfStack = NULL; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portINITIAL_SPSR; + + if( ( ( uint32_t ) pxCode & portTHUMB_MODE_ADDRESS ) != 0x00UL ) + { + /* The task will start in THUMB mode. */ + *pxTopOfStack |= portTHUMB_MODE_BIT; + } + + pxTopOfStack--; + + /* Next the return address, which in this case is the start of the task. */ + *pxTopOfStack = ( StackType_t ) pxCode; + pxTopOfStack--; + + /* Next all the registers other than the stack pointer. */ + *pxTopOfStack = ( StackType_t ) prvTaskExitError; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + + /* The task will start with a critical nesting count of 0 as interrupts are + enabled. */ + *pxTopOfStack = portNO_CRITICAL_NESTING; + pxTopOfStack--; + + /* The task will start without a floating point context. A task that uses + the floating point hardware must call vPortTaskUsesFPU() before executing + any floating point instructions. */ + *pxTopOfStack = portNO_FLOATING_POINT_CONTEXT; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT( ulPortInterruptNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + for( ;; ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +uint32_t ulAPSR; + + /* Only continue if the CPU is not in User mode. The CPU must be in a + Privileged mode for the scheduler to start. */ + __asm volatile ( "MRS %0, APSR" : "=r" ( ulAPSR ) ); + ulAPSR &= portAPSR_MODE_BITS_MASK; + configASSERT( ulAPSR != portAPSR_USER_MODE ); + + if( ulAPSR != portAPSR_USER_MODE ) + { + /* Start the timer that generates the tick ISR. */ + configSETUP_TICK_INTERRUPT(); + vPortRestoreTaskContext(); + } + + /* Will only get here if vTaskStartScheduler() was called with the CPU in + a non-privileged mode or the binary point register was not set to its lowest + possible value. */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( ulCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + + /* Now interrupts are disabled ulCriticalNesting can be accessed + directly. Increment ulCriticalNesting to keep a count of how many times + portENTER_CRITICAL() has been called. */ + ulCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + assert() if it is being called from an interrupt context. Only API + functions that end in "FromISR" can be used in an interrupt. Only assert if + the critical nesting count is 1 to protect against recursive calls if the + assert function also uses a critical section. */ + if( ulCriticalNesting == 1 ) + { + configASSERT( ulPortInterruptNesting == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + if( ulCriticalNesting > portNO_CRITICAL_NESTING ) + { + /* Decrement the nesting count as the critical section is being + exited. */ + ulCriticalNesting--; + + /* If the nesting level has reached zero then all interrupt + priorities must be re-enabled. */ + if( ulCriticalNesting == portNO_CRITICAL_NESTING ) + { + /* Critical nesting has reached zero so all interrupt priorities + should be unmasked. */ + portENABLE_INTERRUPTS(); + } + } +} +/*-----------------------------------------------------------*/ + +void FreeRTOS_Tick_Handler( void ) +{ + portDISABLE_INTERRUPTS(); + + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + ulPortYieldRequired = pdTRUE; + } + + portENABLE_INTERRUPTS(); + configCLEAR_TICK_INTERRUPT(); +} +/*-----------------------------------------------------------*/ + +void vPortTaskUsesFPU( void ) +{ +uint32_t ulInitialFPSCR = 0; + + /* A task is registering the fact that it needs an FPU context. Set the + FPU flag (which is saved as part of the task context). */ + ulPortTaskHasFPUContext = pdTRUE; + + /* Initialise the floating point status register. */ + __asm( "FMXR FPSCR, %0" :: "r" (ulInitialFPSCR) ); +} +/*-----------------------------------------------------------*/ + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CA5_No_GIC/portASM.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CA5_No_GIC/portASM.h new file mode 100644 index 0000000..ccbbe4d --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CA5_No_GIC/portASM.h @@ -0,0 +1,140 @@ +;/* +; FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. +; All rights reserved +; +; +; *************************************************************************** +; * * +; * FreeRTOS tutorial books are available in pdf and paperback. * +; * Complete, revised, and edited pdf reference manuals are also * +; * available. * +; * * +; * Purchasing FreeRTOS documentation will not only help you, by * +; * ensuring you get running as quickly as possible and with an * +; * in-depth knowledge of how to use FreeRTOS, it will also help * +; * the FreeRTOS project to continue with its mission of providing * +; * professional grade, cross platform, de facto standard solutions * +; * for microcontrollers - completely free of charge! * +; * * +; * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * +; * * +; * Thank you for using FreeRTOS, and thank you for your support! * +; * * +; *************************************************************************** +; +; +; This file is part of the FreeRTOS distribution. +; +; FreeRTOS is free software; you can redistribute it and/or modify it under +; the terms of the GNU General Public License (version 2) as published by the +; Free Software Foundation AND MODIFIED BY the FreeRTOS exception. +; >>>NOTE<<< The modification to the GPL is included to allow you to +; distribute a combined work that includes FreeRTOS without being obliged to +; provide the source code for proprietary components outside of the FreeRTOS +; kernel. FreeRTOS is distributed in the hope that it will be useful, but +; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +; more details. You should have received a copy of the GNU General Public +; License and the FreeRTOS license exception along with FreeRTOS; if not it +; can be viewed here: http://www.freertos.org/a00114.html and also obtained +; by writing to Richard Barry, contact details for whom are available on the +; FreeRTOS WEB site. +; +; 1 tab == 4 spaces! +; +; http://www.FreeRTOS.org - Documentation, latest information, license and +; contact details. +; +; http://www.SafeRTOS.com - A version that is certified for use in safety +; critical systems. +; +; http://www.OpenRTOS.com - Commercial support, development, porting, +; licensing and training services. +;*/ + + EXTERN vTaskSwitchContext + EXTERN ulCriticalNesting + EXTERN pxCurrentTCB + EXTERN ulPortTaskHasFPUContext + EXTERN ulAsmAPIPriorityMask + +portSAVE_CONTEXT macro + + ; Save the LR and SPSR onto the system mode stack before switching to + ; system mode to save the remaining system mode registers + SRSDB sp!, #SYS_MODE + CPS #SYS_MODE + PUSH {R0-R12, R14} + + ; Push the critical nesting count + LDR R2, =ulCriticalNesting + LDR R1, [R2] + PUSH {R1} + + ; Does the task have a floating point context that needs saving? If + ; ulPortTaskHasFPUContext is 0 then no. + LDR R2, =ulPortTaskHasFPUContext + LDR R3, [R2] + CMP R3, #0 + + ; Save the floating point context, if any + FMRXNE R1, FPSCR + VPUSHNE {D0-D15} +#if configFPU_D32 == 1 + VPUSHNE {D16-D31} +#endif ; configFPU_D32 + PUSHNE {R1} + + ; Save ulPortTaskHasFPUContext itself + PUSH {R3} + + ; Save the stack pointer in the TCB + LDR R0, =pxCurrentTCB + LDR R1, [R0] + STR SP, [R1] + + endm + +; /**********************************************************************/ + +portRESTORE_CONTEXT macro + + ; Set the SP to point to the stack of the task being restored. + LDR R0, =pxCurrentTCB + LDR R1, [R0] + LDR SP, [R1] + + ; Is there a floating point context to restore? If the restored + ; ulPortTaskHasFPUContext is zero then no. + LDR R0, =ulPortTaskHasFPUContext + POP {R1} + STR R1, [R0] + CMP R1, #0 + + ; Restore the floating point context, if any + POPNE {R0} +#if configFPU_D32 == 1 + VPOPNE {D16-D31} +#endif ; configFPU_D32 + VPOPNE {D0-D15} + VMSRNE FPSCR, R0 + + ; Restore the critical section nesting depth + LDR R0, =ulCriticalNesting + POP {R1} + STR R1, [R0] + + ; Restore all system mode registers other than the SP (which is already + ; being used) + POP {R0-R12, R14} + + ; Return to the task code, loading CPSR on the way. CPSR has the interrupt + ; enable bit set appropriately for the task about to execute. + RFEIA sp! + + endm + + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CA5_No_GIC/portASM.s b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CA5_No_GIC/portASM.s new file mode 100644 index 0000000..7bc68de --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CA5_No_GIC/portASM.s @@ -0,0 +1,203 @@ +;/* +; FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. +; All rights reserved +; +; +; *************************************************************************** +; * * +; * FreeRTOS tutorial books are available in pdf and paperback. * +; * Complete, revised, and edited pdf reference manuals are also * +; * available. * +; * * +; * Purchasing FreeRTOS documentation will not only help you, by * +; * ensuring you get running as quickly as possible and with an * +; * in-depth knowledge of how to use FreeRTOS, it will also help * +; * the FreeRTOS project to continue with its mission of providing * +; * professional grade, cross platform, de facto standard solutions * +; * for microcontrollers - completely free of charge! * +; * * +; * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * +; * * +; * Thank you for using FreeRTOS, and thank you for your support! * +; * * +; *************************************************************************** +; +; +; This file is part of the FreeRTOS distribution. +; +; FreeRTOS is free software; you can redistribute it and/or modify it under +; the terms of the GNU General Public License (version 2) as published by the +; Free Software Foundation AND MODIFIED BY the FreeRTOS exception. +; >>>NOTE<<< The modification to the GPL is included to allow you to +; distribute a combined work that includes FreeRTOS without being obliged to +; provide the source code for proprietary components outside of the FreeRTOS +; kernel. FreeRTOS is distributed in the hope that it will be useful, but +; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +; more details. You should have received a copy of the GNU General Public +; License and the FreeRTOS license exception along with FreeRTOS; if not it +; can be viewed here: http://www.freertos.org/a00114.html and also obtained +; by writing to Richard Barry, contact details for whom are available on the +; FreeRTOS WEB site. +; +; 1 tab == 4 spaces! +; +; http://www.FreeRTOS.org - Documentation, latest information, license and +; contact details. +; +; http://www.SafeRTOS.com - A version that is certified for use in safety +; critical systems. +; +; http://www.OpenRTOS.com - Commercial support, development, porting, +; licensing and training services. +;*/ + + INCLUDE FreeRTOSConfig.h + INCLUDE portmacro.h + + EXTERN vTaskSwitchContext + EXTERN ulPortYieldRequired + EXTERN ulPortInterruptNesting + EXTERN vApplicationIRQHandler + + PUBLIC FreeRTOS_SWI_Handler + PUBLIC FreeRTOS_IRQ_Handler + PUBLIC vPortRestoreTaskContext + +SYS_MODE EQU 0x1f +SVC_MODE EQU 0x13 +IRQ_MODE EQU 0x12 + + SECTION .text:CODE:ROOT(2) + ARM + + INCLUDE portASM.h + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; SVC handler is used to yield a task. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +FreeRTOS_SWI_Handler + + PRESERVE8 + + ; Save the context of the current task and select a new task to run. + portSAVE_CONTEXT + LDR R0, =vTaskSwitchContext + BLX R0 + portRESTORE_CONTEXT + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; vPortRestoreTaskContext is used to start the scheduler. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +vPortRestoreTaskContext + + PRESERVE8 + + ; Switch to system mode + CPS #SYS_MODE + portRESTORE_CONTEXT + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; IRQ interrupt handler used when individual priorities cannot be masked +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +FreeRTOS_IRQ_Handler + + PRESERVE8 + + ; Return to the interrupted instruction. + SUB lr, lr, #4 + + ; Push the return address and SPSR + PUSH {lr} + MRS lr, SPSR + PUSH {lr} + + ; Change to supervisor mode to allow reentry. + CPS #SVC_MODE + + ; Push used registers. + PUSH {r0-r4, r12} + + ; Increment nesting count. r3 holds the address of ulPortInterruptNesting + ; for future use. r1 holds the original ulPortInterruptNesting value for + ; future use. + LDR r3, =ulPortInterruptNesting + LDR r1, [r3] + ADD r4, r1, #1 + STR r4, [r3] + + ; Ensure bit 2 of the stack pointer is clear. r2 holds the bit 2 value for + ; future use. + MOV r2, sp + AND r2, r2, #4 + SUB sp, sp, r2 + + PUSH {r0-r3, lr} + + ; Call the port part specific handler. + LDR r0, =vApplicationIRQHandler + BLX r0 + POP {r0-r3, lr} + ADD sp, sp, r2 + + CPSID i + + ; Write to the EOI register. + LDR r4, =configEOI_ADDRESS + STR r0, [r4] + + ; Restore the old nesting count + STR r1, [r3] + + ; A context switch is never performed if the nesting count is not 0. + CMP r1, #0 + BNE exit_without_switch + + ; Did the interrupt request a context switch? r1 holds the address of + ; ulPortYieldRequired and r0 the value of ulPortYieldRequired for future + ; use. + LDR r1, =ulPortYieldRequired + LDR r0, [r1] + CMP r0, #0 + BNE switch_before_exit + +exit_without_switch + ; No context switch. Restore used registers, LR_irq and SPSR before + ; returning. + POP {r0-r4, r12} + CPS #IRQ_MODE + POP {LR} + MSR SPSR_cxsf, LR + POP {LR} + MOVS PC, LR + +switch_before_exit + ; A context switch is to be performed. Clear the context switch pending + ; flag. + MOV r0, #0 + STR r0, [r1] + + ; Restore used registers, LR-irq and SPSR before saving the context + ; to the task stack. + POP {r0-r4, r12} + CPS #IRQ_MODE + POP {LR} + MSR SPSR_cxsf, LR + POP {LR} + portSAVE_CONTEXT + + ; Call the function that selects the new task to execute. + ; vTaskSwitchContext() if vTaskSwitchContext() uses LDRD or STRD + ; instructions, or 8 byte aligned stack allocated data. LR does not need + ; saving as a new LR will be loaded by portRESTORE_CONTEXT anyway. + LDR r0, =vTaskSwitchContext + BLX r0 + + ; Restore the context of, and branch to, the task selected to execute next. + portRESTORE_CONTEXT + + END + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CA5_No_GIC/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CA5_No_GIC/portmacro.h new file mode 100644 index 0000000..0f53334 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CA5_No_GIC/portmacro.h @@ -0,0 +1,204 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/* IAR includes. */ +#ifdef __ICCARM__ + + #include + + #ifdef __cplusplus + extern "C" { + #endif + + /*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + + /* Type definitions. */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + + /*-----------------------------------------------------------*/ + + /* Hardware specifics. */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 + + /*-----------------------------------------------------------*/ + + /* Task utilities. */ + + /* Called at the end of an ISR that can cause a context switch. */ + #define portEND_SWITCHING_ISR( xSwitchRequired )\ + { \ + extern uint32_t ulPortYieldRequired; \ + \ + if( xSwitchRequired != pdFALSE ) \ + { \ + ulPortYieldRequired = pdTRUE; \ + } \ + } + + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) + #define portYIELD() __asm( "SWI 0" ); __ISB() + + + /*----------------------------------------------------------- + * Critical section control + *----------------------------------------------------------*/ + + extern void vPortEnterCritical( void ); + extern void vPortExitCritical( void ); + extern uint32_t ulPortSetInterruptMask( void ); + extern void vPortClearInterruptMask( uint32_t ulNewMaskValue ); + + #define portENTER_CRITICAL() vPortEnterCritical(); + #define portEXIT_CRITICAL() vPortExitCritical(); + #define portDISABLE_INTERRUPTS() __disable_irq(); __DSB(); __ISB() /* No priority mask register so global disable is used. */ + #define portENABLE_INTERRUPTS() __enable_irq() + #define portSET_INTERRUPT_MASK_FROM_ISR() __get_interrupt_state(); __disable_irq() /* No priority mask register so global disable is used. */ + #define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) __set_interrupt_state(x) + + /*-----------------------------------------------------------*/ + + /* Task function macros as described on the FreeRTOS.org WEB site. These are + not required for this port but included in case common demo code that uses these + macros is used. */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + + /* Prototype of the FreeRTOS tick handler. This must be installed as the + handler for whichever peripheral is used to generate the RTOS tick. */ + void FreeRTOS_Tick_Handler( void ); + + /* Any task that uses the floating point unit MUST call vPortTaskUsesFPU() + before any floating point instructions are executed. */ + void vPortTaskUsesFPU( void ); + #define portTASK_USES_FLOATING_POINT() vPortTaskUsesFPU() + + /* Architecture specific optimisations. */ + #ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 + #endif + + #if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31 - __CLZ( uxReadyPriorities ) ) + + #endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + + #define portNOP() __asm volatile( "NOP" ) + + + #ifdef __cplusplus + } /* extern C */ + #endif + + /* Suppress warnings that are generated by the IAR tools, but cannot be + fixed in the source code because to do so would cause other compilers to + generate warnings. */ + #pragma diag_suppress=Pe191 + #pragma diag_suppress=Pa082 + +#endif /* __ICCARM__ */ + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CA9/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CA9/port.c new file mode 100644 index 0000000..758ca04 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CA9/port.c @@ -0,0 +1,481 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* Standard includes. */ +#include + +/* IAR includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#ifndef configINTERRUPT_CONTROLLER_BASE_ADDRESS + #error configINTERRUPT_CONTROLLER_BASE_ADDRESS must be defined. See http://www.freertos.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html +#endif + +#ifndef configINTERRUPT_CONTROLLER_CPU_INTERFACE_OFFSET + #error configINTERRUPT_CONTROLLER_CPU_INTERFACE_OFFSET must be defined. See http://www.freertos.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html +#endif + +#ifndef configUNIQUE_INTERRUPT_PRIORITIES + #error configUNIQUE_INTERRUPT_PRIORITIES must be defined. See http://www.freertos.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html +#endif + +#ifndef configSETUP_TICK_INTERRUPT + #error configSETUP_TICK_INTERRUPT() must be defined. See http://www.freertos.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html +#endif /* configSETUP_TICK_INTERRUPT */ + +#ifndef configMAX_API_CALL_INTERRUPT_PRIORITY + #error configMAX_API_CALL_INTERRUPT_PRIORITY must be defined. See http://www.freertos.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html +#endif + +#if configMAX_API_CALL_INTERRUPT_PRIORITY == 0 + #error configMAX_API_CALL_INTERRUPT_PRIORITY must not be set to 0 +#endif + +#if configMAX_API_CALL_INTERRUPT_PRIORITY > configUNIQUE_INTERRUPT_PRIORITIES + #error configMAX_API_CALL_INTERRUPT_PRIORITY must be less than or equal to configUNIQUE_INTERRUPT_PRIORITIES as the lower the numeric priority value the higher the logical interrupt priority +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +/* In case security extensions are implemented. */ +#if configMAX_API_CALL_INTERRUPT_PRIORITY <= ( configUNIQUE_INTERRUPT_PRIORITIES / 2 ) + #error configMAX_API_CALL_INTERRUPT_PRIORITY must be greater than ( configUNIQUE_INTERRUPT_PRIORITIES / 2 ) +#endif + +#ifndef configCLEAR_TICK_INTERRUPT + #define configCLEAR_TICK_INTERRUPT() +#endif + +/* A critical section is exited when the critical section nesting count reaches +this value. */ +#define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) + +/* In all GICs 255 can be written to the priority mask register to unmask all +(but the lowest) interrupt priority. */ +#define portUNMASK_VALUE ( 0xFFUL ) + +/* Tasks are not created with a floating point context, but can be given a +floating point context after they have been created. A variable is stored as +part of the tasks context that holds portNO_FLOATING_POINT_CONTEXT if the task +does not have an FPU context, or any other value if the task does have an FPU +context. */ +#define portNO_FLOATING_POINT_CONTEXT ( ( StackType_t ) 0 ) + +/* Constants required to setup the initial task context. */ +#define portINITIAL_SPSR ( ( StackType_t ) 0x1f ) /* System mode, ARM mode, interrupts enabled. */ +#define portTHUMB_MODE_BIT ( ( StackType_t ) 0x20 ) +#define portTHUMB_MODE_ADDRESS ( 0x01UL ) + +/* Used by portASSERT_IF_INTERRUPT_PRIORITY_INVALID() when ensuring the binary +point is zero. */ +#define portBINARY_POINT_BITS ( ( uint8_t ) 0x03 ) + +/* Masks all bits in the APSR other than the mode bits. */ +#define portAPSR_MODE_BITS_MASK ( 0x1F ) + +/* The value of the mode bits in the APSR when the CPU is executing in user +mode. */ +#define portAPSR_USER_MODE ( 0x10 ) + +/* Macro to unmask all interrupt priorities. */ +#define portCLEAR_INTERRUPT_MASK() \ +{ \ + __disable_irq(); \ + portICCPMR_PRIORITY_MASK_REGISTER = portUNMASK_VALUE; \ + __asm( "DSB \n" \ + "ISB \n" ); \ + __enable_irq(); \ +} + +/*-----------------------------------------------------------*/ + +/* + * Starts the first task executing. This function is necessarily written in + * assembly code so is implemented in portASM.s. + */ +extern void vPortRestoreTaskContext( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* A variable is used to keep track of the critical section nesting. This +variable has to be stored as part of the task context and must be initialised to +a non zero value to ensure interrupts don't inadvertently become unmasked before +the scheduler starts. As it is stored as part of the task context it will +automatically be set to 0 when the first task is started. */ +volatile uint32_t ulCriticalNesting = 9999UL; + +/* Saved as part of the task context. If ulPortTaskHasFPUContext is non-zero +then a floating point context must be saved and restored for the task. */ +uint32_t ulPortTaskHasFPUContext = pdFALSE; + +/* Set to 1 to pend a context switch from an ISR. */ +uint32_t ulPortYieldRequired = pdFALSE; + +/* Counts the interrupt nesting depth. A context switch is only performed if +if the nesting depth is 0. */ +uint32_t ulPortInterruptNesting = 0UL; + + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. + + The fist real value on the stack is the status register, which is set for + system mode, with interrupts enabled. A few NULLs are added first to ensure + GDB does not try decoding a non-existent return address. */ + *pxTopOfStack = NULL; + pxTopOfStack--; + *pxTopOfStack = NULL; + pxTopOfStack--; + *pxTopOfStack = NULL; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portINITIAL_SPSR; + + if( ( ( uint32_t ) pxCode & portTHUMB_MODE_ADDRESS ) != 0x00UL ) + { + /* The task will start in THUMB mode. */ + *pxTopOfStack |= portTHUMB_MODE_BIT; + } + + pxTopOfStack--; + + /* Next the return address, which in this case is the start of the task. */ + *pxTopOfStack = ( StackType_t ) pxCode; + pxTopOfStack--; + + /* Next all the registers other than the stack pointer. */ + *pxTopOfStack = ( StackType_t ) prvTaskExitError; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + + /* The task will start with a critical nesting count of 0 as interrupts are + enabled. */ + *pxTopOfStack = portNO_CRITICAL_NESTING; + pxTopOfStack--; + + /* The task will start without a floating point context. A task that uses + the floating point hardware must call vPortTaskUsesFPU() before executing + any floating point instructions. */ + *pxTopOfStack = portNO_FLOATING_POINT_CONTEXT; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT( ulPortInterruptNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + for( ;; ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +uint32_t ulAPSR; + + /* Only continue if the CPU is not in User mode. The CPU must be in a + Privileged mode for the scheduler to start. */ + __asm volatile ( "MRS %0, APSR" : "=r" ( ulAPSR ) ); + ulAPSR &= portAPSR_MODE_BITS_MASK; + configASSERT( ulAPSR != portAPSR_USER_MODE ); + + if( ulAPSR != portAPSR_USER_MODE ) + { + /* Only continue if the binary point value is set to its lowest possible + setting. See the comments in vPortValidateInterruptPriority() below for + more information. */ + configASSERT( ( portICCBPR_BINARY_POINT_REGISTER & portBINARY_POINT_BITS ) <= portMAX_BINARY_POINT_VALUE ); + + if( ( portICCBPR_BINARY_POINT_REGISTER & portBINARY_POINT_BITS ) <= portMAX_BINARY_POINT_VALUE ) + { + /* Start the timer that generates the tick ISR. */ + configSETUP_TICK_INTERRUPT(); + + __enable_irq(); + vPortRestoreTaskContext(); + } + } + + /* Will only get here if vTaskStartScheduler() was called with the CPU in + a non-privileged mode or the binary point register was not set to its lowest + possible value. */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( ulCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + /* Disable interrupts as per portDISABLE_INTERRUPTS(); */ + ulPortSetInterruptMask(); + + /* Now interrupts are disabled ulCriticalNesting can be accessed + directly. Increment ulCriticalNesting to keep a count of how many times + portENTER_CRITICAL() has been called. */ + ulCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + assert() if it is being called from an interrupt context. Only API + functions that end in "FromISR" can be used in an interrupt. Only assert if + the critical nesting count is 1 to protect against recursive calls if the + assert function also uses a critical section. */ + if( ulCriticalNesting == 1 ) + { + configASSERT( ulPortInterruptNesting == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + if( ulCriticalNesting > portNO_CRITICAL_NESTING ) + { + /* Decrement the nesting count as the critical section is being + exited. */ + ulCriticalNesting--; + + /* If the nesting level has reached zero then all interrupt + priorities must be re-enabled. */ + if( ulCriticalNesting == portNO_CRITICAL_NESTING ) + { + /* Critical nesting has reached zero so all interrupt priorities + should be unmasked. */ + portCLEAR_INTERRUPT_MASK(); + } + } +} +/*-----------------------------------------------------------*/ + +void FreeRTOS_Tick_Handler( void ) +{ + /* Set interrupt mask before altering scheduler structures. The tick + handler runs at the lowest priority, so interrupts cannot already be masked, + so there is no need to save and restore the current mask value. */ + __disable_irq(); + portICCPMR_PRIORITY_MASK_REGISTER = ( uint32_t ) ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ); + __asm( "DSB \n" + "ISB \n" ); + __enable_irq(); + + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + ulPortYieldRequired = pdTRUE; + } + + /* Ensure all interrupt priorities are active again. */ + portCLEAR_INTERRUPT_MASK(); + configCLEAR_TICK_INTERRUPT(); +} +/*-----------------------------------------------------------*/ + +void vPortTaskUsesFPU( void ) +{ +uint32_t ulInitialFPSCR = 0; + + /* A task is registering the fact that it needs an FPU context. Set the + FPU flag (which is saved as part of the task context). */ + ulPortTaskHasFPUContext = pdTRUE; + + /* Initialise the floating point status register. */ + __asm( "FMXR FPSCR, %0" :: "r" (ulInitialFPSCR) ); +} +/*-----------------------------------------------------------*/ + +void vPortClearInterruptMask( uint32_t ulNewMaskValue ) +{ + if( ulNewMaskValue == pdFALSE ) + { + portCLEAR_INTERRUPT_MASK(); + } +} +/*-----------------------------------------------------------*/ + +uint32_t ulPortSetInterruptMask( void ) +{ +uint32_t ulReturn; + + __disable_irq(); + if( portICCPMR_PRIORITY_MASK_REGISTER == ( uint32_t ) ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ) ) + { + /* Interrupts were already masked. */ + ulReturn = pdTRUE; + } + else + { + ulReturn = pdFALSE; + portICCPMR_PRIORITY_MASK_REGISTER = ( uint32_t ) ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ); + __asm( "DSB \n" + "ISB \n" ); + } + __enable_irq(); + + return ulReturn; +} +/*-----------------------------------------------------------*/ + +#if( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + /* The following assertion will fail if a service routine (ISR) for + an interrupt that has been assigned a priority above + configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + function. ISR safe FreeRTOS API functions must *only* be called + from interrupts that have been assigned a priority at or below + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Numerically low interrupt priority numbers represent logically high + interrupt priorities, therefore the priority of the interrupt must + be set to a value equal to or numerically *higher* than + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + FreeRTOS maintains separate thread and ISR API functions to ensure + interrupt entry is as fast and simple as possible. + + The following links provide detailed information: + http://www.freertos.org/RTOS-Cortex-M3-M4.html + http://www.freertos.org/FAQHelp.html */ + configASSERT( portICCRPR_RUNNING_PRIORITY_REGISTER >= ( uint32_t ) ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ) ); + + /* Priority grouping: The interrupt controller (GIC) allows the bits + that define each interrupt's priority to be split between bits that + define the interrupt's pre-emption priority bits and bits that define + the interrupt's sub-priority. For simplicity all bits must be defined + to be pre-emption priority bits. The following assertion will fail if + this is not the case (if some bits represent a sub-priority). + + The priority grouping is configured by the GIC's binary point register + (ICCBPR). Writting 0 to ICCBPR will ensure it is set to its lowest + possible value (which may be above 0). */ + configASSERT( ( portICCBPR_BINARY_POINT_REGISTER & portBINARY_POINT_BITS ) <= portMAX_BINARY_POINT_VALUE ); + } + +#endif /* configASSERT_DEFINED */ + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CA9/portASM.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CA9/portASM.h new file mode 100644 index 0000000..90aa77a --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CA9/portASM.h @@ -0,0 +1,142 @@ +;/* +; FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. +; All rights reserved +; +; +; *************************************************************************** +; * * +; * FreeRTOS tutorial books are available in pdf and paperback. * +; * Complete, revised, and edited pdf reference manuals are also * +; * available. * +; * * +; * Purchasing FreeRTOS documentation will not only help you, by * +; * ensuring you get running as quickly as possible and with an * +; * in-depth knowledge of how to use FreeRTOS, it will also help * +; * the FreeRTOS project to continue with its mission of providing * +; * professional grade, cross platform, de facto standard solutions * +; * for microcontrollers - completely free of charge! * +; * * +; * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * +; * * +; * Thank you for using FreeRTOS, and thank you for your support! * +; * * +; *************************************************************************** +; +; +; This file is part of the FreeRTOS distribution. +; +; FreeRTOS is free software; you can redistribute it and/or modify it under +; the terms of the GNU General Public License (version 2) as published by the +; Free Software Foundation AND MODIFIED BY the FreeRTOS exception. +; >>>NOTE<<< The modification to the GPL is included to allow you to +; distribute a combined work that includes FreeRTOS without being obliged to +; provide the source code for proprietary components outside of the FreeRTOS +; kernel. FreeRTOS is distributed in the hope that it will be useful, but +; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +; more details. You should have received a copy of the GNU General Public +; License and the FreeRTOS license exception along with FreeRTOS; if not it +; can be viewed here: http://www.freertos.org/a00114.html and also obtained +; by writing to Richard Barry, contact details for whom are available on the +; FreeRTOS WEB site. +; +; 1 tab == 4 spaces! +; +; http://www.FreeRTOS.org - Documentation, latest information, license and +; contact details. +; +; http://www.SafeRTOS.com - A version that is certified for use in safety +; critical systems. +; +; http://www.OpenRTOS.com - Commercial support, development, porting, +; licensing and training services. +;*/ + + EXTERN vTaskSwitchContext + EXTERN ulCriticalNesting + EXTERN pxCurrentTCB + EXTERN ulPortTaskHasFPUContext + EXTERN ulAsmAPIPriorityMask + +portSAVE_CONTEXT macro + + ; Save the LR and SPSR onto the system mode stack before switching to + ; system mode to save the remaining system mode registers + SRSDB sp!, #SYS_MODE + CPS #SYS_MODE + PUSH {R0-R12, R14} + + ; Push the critical nesting count + LDR R2, =ulCriticalNesting + LDR R1, [R2] + PUSH {R1} + + ; Does the task have a floating point context that needs saving? If + ; ulPortTaskHasFPUContext is 0 then no. + LDR R2, =ulPortTaskHasFPUContext + LDR R3, [R2] + CMP R3, #0 + + ; Save the floating point context, if any + FMRXNE R1, FPSCR + VPUSHNE {D0-D15} + VPUSHNE {D16-D31} + PUSHNE {R1} + + ; Save ulPortTaskHasFPUContext itself + PUSH {R3} + + ; Save the stack pointer in the TCB + LDR R0, =pxCurrentTCB + LDR R1, [R0] + STR SP, [R1] + + endm + +; /**********************************************************************/ + +portRESTORE_CONTEXT macro + + ; Set the SP to point to the stack of the task being restored. + LDR R0, =pxCurrentTCB + LDR R1, [R0] + LDR SP, [R1] + + ; Is there a floating point context to restore? If the restored + ; ulPortTaskHasFPUContext is zero then no. + LDR R0, =ulPortTaskHasFPUContext + POP {R1} + STR R1, [R0] + CMP R1, #0 + + ; Restore the floating point context, if any + POPNE {R0} + VPOPNE {D16-D31} + VPOPNE {D0-D15} + VMSRNE FPSCR, R0 + + ; Restore the critical section nesting depth + LDR R0, =ulCriticalNesting + POP {R1} + STR R1, [R0] + + ; Ensure the priority mask is correct for the critical nesting depth + LDR R2, =portICCPMR_PRIORITY_MASK_REGISTER_ADDRESS + CMP R1, #0 + MOVEQ R4, #255 + LDRNE R4, =( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ) + STR R4, [r2] + + ; Restore all system mode registers other than the SP (which is already + ; being used) + POP {R0-R12, R14} + + ; Return to the task code, loading CPSR on the way. + RFEIA sp! + + endm + + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CA9/portASM.s b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CA9/portASM.s new file mode 100644 index 0000000..cc9a2c7 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CA9/portASM.s @@ -0,0 +1,204 @@ +;/* +; FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. +; All rights reserved +; +; +; *************************************************************************** +; * * +; * FreeRTOS tutorial books are available in pdf and paperback. * +; * Complete, revised, and edited pdf reference manuals are also * +; * available. * +; * * +; * Purchasing FreeRTOS documentation will not only help you, by * +; * ensuring you get running as quickly as possible and with an * +; * in-depth knowledge of how to use FreeRTOS, it will also help * +; * the FreeRTOS project to continue with its mission of providing * +; * professional grade, cross platform, de facto standard solutions * +; * for microcontrollers - completely free of charge! * +; * * +; * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * +; * * +; * Thank you for using FreeRTOS, and thank you for your support! * +; * * +; *************************************************************************** +; +; +; This file is part of the FreeRTOS distribution. +; +; FreeRTOS is free software; you can redistribute it and/or modify it under +; the terms of the GNU General Public License (version 2) as published by the +; Free Software Foundation AND MODIFIED BY the FreeRTOS exception. +; >>>NOTE<<< The modification to the GPL is included to allow you to +; distribute a combined work that includes FreeRTOS without being obliged to +; provide the source code for proprietary components outside of the FreeRTOS +; kernel. FreeRTOS is distributed in the hope that it will be useful, but +; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +; more details. You should have received a copy of the GNU General Public +; License and the FreeRTOS license exception along with FreeRTOS; if not it +; can be viewed here: http://www.freertos.org/a00114.html and also obtained +; by writing to Richard Barry, contact details for whom are available on the +; FreeRTOS WEB site. +; +; 1 tab == 4 spaces! +; +; http://www.FreeRTOS.org - Documentation, latest information, license and +; contact details. +; +; http://www.SafeRTOS.com - A version that is certified for use in safety +; critical systems. +; +; http://www.OpenRTOS.com - Commercial support, development, porting, +; licensing and training services. +;*/ + + INCLUDE FreeRTOSConfig.h + INCLUDE portmacro.h + + EXTERN vApplicationIRQHandler + EXTERN vTaskSwitchContext + EXTERN ulPortYieldRequired + EXTERN ulPortInterruptNesting + + PUBLIC FreeRTOS_SWI_Handler + PUBLIC FreeRTOS_IRQ_Handler + PUBLIC vPortRestoreTaskContext + +SYS_MODE EQU 0x1f +SVC_MODE EQU 0x13 +IRQ_MODE EQU 0x12 + + + SECTION .text:CODE:ROOT(2) + ARM + + INCLUDE portASM.h + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; SVC handler is used to yield a task. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +FreeRTOS_SWI_Handler + + PRESERVE8 + + ; Save the context of the current task and select a new task to run. + portSAVE_CONTEXT + LDR R0, =vTaskSwitchContext + BLX R0 + portRESTORE_CONTEXT + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; vPortRestoreTaskContext is used to start the scheduler. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +vPortRestoreTaskContext + ; Switch to system mode + CPS #SYS_MODE + portRESTORE_CONTEXT + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; PL390 GIC interrupt handler +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +FreeRTOS_IRQ_Handler + + ; Return to the interrupted instruction. + SUB lr, lr, #4 + + ; Push the return address and SPSR + PUSH {lr} + MRS lr, SPSR + PUSH {lr} + + ; Change to supervisor mode to allow reentry. + CPS #SVC_MODE + + ; Push used registers. + PUSH {r0-r4, r12} + + ; Increment nesting count. r3 holds the address of ulPortInterruptNesting + ; for future use. r1 holds the original ulPortInterruptNesting value for + ; future use. + LDR r3, =ulPortInterruptNesting + LDR r1, [r3] + ADD r4, r1, #1 + STR r4, [r3] + + ; Read value from the interrupt acknowledge register, which is stored in r0 + ; for future parameter and interrupt clearing use. + LDR r2, =portICCIAR_INTERRUPT_ACKNOWLEDGE_REGISTER_ADDRESS + LDR r0, [r2] + + ; Ensure bit 2 of the stack pointer is clear. r2 holds the bit 2 value for + ; future use. + MOV r2, sp + AND r2, r2, #4 + SUB sp, sp, r2 + + ; Call the interrupt handler + PUSH {r0-r3, lr} + LDR r1, =vApplicationIRQHandler + BLX r1 + POP {r0-r3, lr} + ADD sp, sp, r2 + + CPSID i + + ; Write the value read from ICCIAR to ICCEOIR + LDR r4, =portICCEOIR_END_OF_INTERRUPT_REGISTER_ADDRESS + STR r0, [r4] + + ; Restore the old nesting count + STR r1, [r3] + + ; A context switch is never performed if the nesting count is not 0 + CMP r1, #0 + BNE exit_without_switch + + ; Did the interrupt request a context switch? r1 holds the address of + ; ulPortYieldRequired and r0 the value of ulPortYieldRequired for future + ; use. + LDR r1, =ulPortYieldRequired + LDR r0, [r1] + CMP r0, #0 + BNE switch_before_exit + +exit_without_switch + ; No context switch. Restore used registers, LR_irq and SPSR before + ; returning. + POP {r0-r4, r12} + CPS #IRQ_MODE + POP {LR} + MSR SPSR_cxsf, LR + POP {LR} + MOVS PC, LR + +switch_before_exit + ; A context switch is to be performed. Clear the context switch pending + ; flag. + MOV r0, #0 + STR r0, [r1] + + ; Restore used registers, LR-irq and SPSR before saving the context + ; to the task stack. + POP {r0-r4, r12} + CPS #IRQ_MODE + POP {LR} + MSR SPSR_cxsf, LR + POP {LR} + portSAVE_CONTEXT + + ; Call the function that selects the new task to execute. + ; vTaskSwitchContext() if vTaskSwitchContext() uses LDRD or STRD + ; instructions, or 8 byte aligned stack allocated data. LR does not need + ; saving as a new LR will be loaded by portRESTORE_CONTEXT anyway. + LDR r0, =vTaskSwitchContext + BLX r0 + + ; Restore the context of, and branch to, the task selected to execute next. + portRESTORE_CONTEXT + + + END + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CA9/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CA9/portmacro.h new file mode 100644 index 0000000..eaa701b --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CA9/portmacro.h @@ -0,0 +1,251 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/* IAR includes. */ +#ifdef __ICCARM__ + + #include + + #ifdef __cplusplus + extern "C" { + #endif + + /*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + + /* Type definitions. */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + + /*-----------------------------------------------------------*/ + + /* Hardware specifics. */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 + + /*-----------------------------------------------------------*/ + + /* Task utilities. */ + + /* Called at the end of an ISR that can cause a context switch. */ + #define portEND_SWITCHING_ISR( xSwitchRequired )\ + { \ + extern uint32_t ulPortYieldRequired; \ + \ + if( xSwitchRequired != pdFALSE ) \ + { \ + ulPortYieldRequired = pdTRUE; \ + } \ + } + + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) + #define portYIELD() __asm( "SWI 0" ); + + + /*----------------------------------------------------------- + * Critical section control + *----------------------------------------------------------*/ + + extern void vPortEnterCritical( void ); + extern void vPortExitCritical( void ); + extern uint32_t ulPortSetInterruptMask( void ); + extern void vPortClearInterruptMask( uint32_t ulNewMaskValue ); + + /* These macros do not globally disable/enable interrupts. They do mask off + interrupts that have a priority below configMAX_API_CALL_INTERRUPT_PRIORITY. */ + #define portENTER_CRITICAL() vPortEnterCritical(); + #define portEXIT_CRITICAL() vPortExitCritical(); + #define portDISABLE_INTERRUPTS() ulPortSetInterruptMask() + #define portENABLE_INTERRUPTS() vPortClearInterruptMask( 0 ) + #define portSET_INTERRUPT_MASK_FROM_ISR() ulPortSetInterruptMask() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vPortClearInterruptMask(x) + + /*-----------------------------------------------------------*/ + + /* Task function macros as described on the FreeRTOS.org WEB site. These are + not required for this port but included in case common demo code that uses these + macros is used. */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + + /* Prototype of the FreeRTOS tick handler. This must be installed as the + handler for whichever peripheral is used to generate the RTOS tick. */ + void FreeRTOS_Tick_Handler( void ); + + /* Any task that uses the floating point unit MUST call vPortTaskUsesFPU() + before any floating point instructions are executed. */ + void vPortTaskUsesFPU( void ); + #define portTASK_USES_FLOATING_POINT() vPortTaskUsesFPU() + + #define portLOWEST_INTERRUPT_PRIORITY ( ( ( uint32_t ) configUNIQUE_INTERRUPT_PRIORITIES ) - 1UL ) + #define portLOWEST_USABLE_INTERRUPT_PRIORITY ( portLOWEST_INTERRUPT_PRIORITY - 1UL ) + + /* Architecture specific optimisations. */ + #ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 + #endif + + #if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31 - __CLZ( uxReadyPriorities ) ) + + #endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + + #ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() + #endif /* configASSERT */ + + #define portNOP() __asm volatile( "NOP" ) + + + #ifdef __cplusplus + } /* extern C */ + #endif + + /* Suppress warnings that are generated by the IAR tools, but cannot be + fixed in the source code because to do so would cause other compilers to + generate warnings. */ + #pragma diag_suppress=Pe191 + #pragma diag_suppress=Pa082 + +#endif /* __ICCARM__ */ + + +/* The number of bits to shift for an interrupt priority is dependent on the +number of bits implemented by the interrupt controller. */ +#if configUNIQUE_INTERRUPT_PRIORITIES == 16 + #define portPRIORITY_SHIFT 4 + #define portMAX_BINARY_POINT_VALUE 3 +#elif configUNIQUE_INTERRUPT_PRIORITIES == 32 + #define portPRIORITY_SHIFT 3 + #define portMAX_BINARY_POINT_VALUE 2 +#elif configUNIQUE_INTERRUPT_PRIORITIES == 64 + #define portPRIORITY_SHIFT 2 + #define portMAX_BINARY_POINT_VALUE 1 +#elif configUNIQUE_INTERRUPT_PRIORITIES == 128 + #define portPRIORITY_SHIFT 1 + #define portMAX_BINARY_POINT_VALUE 0 +#elif configUNIQUE_INTERRUPT_PRIORITIES == 256 + #define portPRIORITY_SHIFT 0 + #define portMAX_BINARY_POINT_VALUE 0 +#else + #error Invalid configUNIQUE_INTERRUPT_PRIORITIES setting. configUNIQUE_INTERRUPT_PRIORITIES must be set to the number of unique priorities implemented by the target hardware +#endif + +/* Interrupt controller access addresses. */ +#define portICCPMR_PRIORITY_MASK_OFFSET ( 0x04 ) +#define portICCIAR_INTERRUPT_ACKNOWLEDGE_OFFSET ( 0x0C ) +#define portICCEOIR_END_OF_INTERRUPT_OFFSET ( 0x10 ) +#define portICCBPR_BINARY_POINT_OFFSET ( 0x08 ) +#define portICCRPR_RUNNING_PRIORITY_OFFSET ( 0x14 ) + +#define portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS ( configINTERRUPT_CONTROLLER_BASE_ADDRESS + configINTERRUPT_CONTROLLER_CPU_INTERFACE_OFFSET ) +#define portICCPMR_PRIORITY_MASK_REGISTER ( *( ( volatile uint32_t * ) ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCPMR_PRIORITY_MASK_OFFSET ) ) ) +#define portICCIAR_INTERRUPT_ACKNOWLEDGE_REGISTER_ADDRESS ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCIAR_INTERRUPT_ACKNOWLEDGE_OFFSET ) +#define portICCEOIR_END_OF_INTERRUPT_REGISTER_ADDRESS ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCEOIR_END_OF_INTERRUPT_OFFSET ) +#define portICCPMR_PRIORITY_MASK_REGISTER_ADDRESS ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCPMR_PRIORITY_MASK_OFFSET ) +#define portICCBPR_BINARY_POINT_REGISTER ( *( ( const volatile uint32_t * ) ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCBPR_BINARY_POINT_OFFSET ) ) ) +#define portICCRPR_RUNNING_PRIORITY_REGISTER ( *( ( const volatile uint32_t * ) ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCRPR_RUNNING_PRIORITY_OFFSET ) ) ) + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CM0/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CM0/port.c new file mode 100644 index 0000000..ed00f22 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CM0/port.c @@ -0,0 +1,255 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the ARM CM0 port. + *----------------------------------------------------------*/ + +/* IAR includes. */ +#include "intrinsics.h" + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Constants required to manipulate the NVIC. */ +#define portNVIC_SYSTICK_CTRL ( ( volatile uint32_t *) 0xe000e010 ) +#define portNVIC_SYSTICK_LOAD ( ( volatile uint32_t *) 0xe000e014 ) +#define portNVIC_SYSPRI2 ( ( volatile uint32_t *) 0xe000ed20 ) +#define portNVIC_SYSTICK_CLK 0x00000004 +#define portNVIC_SYSTICK_INT 0x00000002 +#define portNVIC_SYSTICK_ENABLE 0x00000001 +#define portMIN_INTERRUPT_PRIORITY ( 255UL ) +#define portNVIC_PENDSV_PRI ( portMIN_INTERRUPT_PRIORITY << 16UL ) +#define portNVIC_SYSTICK_PRI ( portMIN_INTERRUPT_PRIORITY << 24UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) + +/* For backward compatibility, ensure configKERNEL_INTERRUPT_PRIORITY is +defined. The value 255 should also ensure backward compatibility. +FreeRTOS.org versions prior to V4.3.0 did not include this definition. */ +#ifndef configKERNEL_INTERRUPT_PRIORITY + #define configKERNEL_INTERRUPT_PRIORITY 0 +#endif + +/* Each task maintains its own interrupt status in the critical nesting +variable. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* + * Setup the timer to generate the tick interrupts. + */ +static void prvSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortSysTickHandler( void ); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +extern void vPortStartFirstTask( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + interrupt. */ + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) prvTaskExitError; /* LR */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack -= 8; /* R11..R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + for( ;; ); +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + /* Make PendSV and SysTick the lowest priority interrupts. */ + *(portNVIC_SYSPRI2) |= portNVIC_PENDSV_PRI; + *(portNVIC_SYSPRI2) |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + prvSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Start the first task. */ + vPortStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortYield( void ) +{ + /* Set a PendSV to request a context switch. */ + *(portNVIC_INT_CTRL) = portNVIC_PENDSVSET; + + /* Barriers are normally not required but do ensure the code is completely + within the specified behaviour for the architecture. */ + __DSB(); + __ISB(); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + __DSB(); + __ISB(); +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ +uint32_t ulPreviousMask; + + ulPreviousMask = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Pend a context switch. */ + *(portNVIC_INT_CTRL) = portNVIC_PENDSVSET; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulPreviousMask ); +} +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +static void prvSetupTimerInterrupt( void ) +{ + /* Configure SysTick to interrupt at the requested rate. */ + *(portNVIC_SYSTICK_LOAD) = ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + *(portNVIC_SYSTICK_CTRL) = portNVIC_SYSTICK_CLK | portNVIC_SYSTICK_INT | portNVIC_SYSTICK_ENABLE; +} +/*-----------------------------------------------------------*/ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CM0/portasm.s b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CM0/portasm.s new file mode 100644 index 0000000..604b11f --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CM0/portasm.s @@ -0,0 +1,173 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#include + + RSEG CODE:CODE(2) + thumb + + EXTERN vPortYieldFromISR + EXTERN pxCurrentTCB + EXTERN vTaskSwitchContext + + PUBLIC vSetMSP + PUBLIC xPortPendSVHandler + PUBLIC vPortSVCHandler + PUBLIC vPortStartFirstTask + PUBLIC ulSetInterruptMaskFromISR + PUBLIC vClearInterruptMaskFromISR + +/*-----------------------------------------------------------*/ + +vSetMSP + msr msp, r0 + bx lr + +/*-----------------------------------------------------------*/ + +xPortPendSVHandler: + mrs r0, psp + + ldr r3, =pxCurrentTCB /* Get the location of the current TCB. */ + ldr r2, [r3] + + subs r0, r0, #32 /* Make space for the remaining low registers. */ + str r0, [r2] /* Save the new top of stack. */ + stmia r0!, {r4-r7} /* Store the low registers that are not saved automatically. */ + mov r4, r8 /* Store the high registers. */ + mov r5, r9 + mov r6, r10 + mov r7, r11 + stmia r0!, {r4-r7} + + push {r3, r14} + cpsid i + bl vTaskSwitchContext + cpsie i + pop {r2, r3} /* lr goes in r3. r2 now holds tcb pointer. */ + + ldr r1, [r2] + ldr r0, [r1] /* The first item in pxCurrentTCB is the task top of stack. */ + adds r0, r0, #16 /* Move to the high registers. */ + ldmia r0!, {r4-r7} /* Pop the high registers. */ + mov r8, r4 + mov r9, r5 + mov r10, r6 + mov r11, r7 + + msr psp, r0 /* Remember the new top of stack for the task. */ + + subs r0, r0, #32 /* Go back for the low registers that are not automatically restored. */ + ldmia r0!, {r4-r7} /* Pop low registers. */ + + bx r3 + +/*-----------------------------------------------------------*/ + +vPortSVCHandler; + /* This function is no longer used, but retained for backward + compatibility. */ + bx lr + +/*-----------------------------------------------------------*/ + +vPortStartFirstTask + /* The MSP stack is not reset as, unlike on M3/4 parts, there is no vector + table offset register that can be used to locate the initial stack value. + Not all M0 parts have the application vector table at address 0. */ + + ldr r3, =pxCurrentTCB /* Obtain location of pxCurrentTCB. */ + ldr r1, [r3] + ldr r0, [r1] /* The first item in pxCurrentTCB is the task top of stack. */ + adds r0, #32 /* Discard everything up to r0. */ + msr psp, r0 /* This is now the new top of stack to use in the task. */ + movs r0, #2 /* Switch to the psp stack. */ + msr CONTROL, r0 + isb + pop {r0-r5} /* Pop the registers that are saved automatically. */ + mov lr, r5 /* lr is now in r5. */ + pop {r3} /* The return address is now in r3. */ + pop {r2} /* Pop and discard the XPSR. */ + cpsie i /* The first task has its context and interrupts can be enabled. */ + bx r3 /* Jump to the user defined task code. */ + +/*-----------------------------------------------------------*/ + +ulSetInterruptMaskFromISR + mrs r0, PRIMASK + cpsid i + bx lr + +/*-----------------------------------------------------------*/ + +vClearInterruptMaskFromISR + msr PRIMASK, r0 + bx lr + + END diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CM0/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CM0/portmacro.h new file mode 100644 index 0000000..eb73e49 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CM0/portmacro.h @@ -0,0 +1,164 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +/*-----------------------------------------------------------*/ + + +/* Scheduler utilities. */ +extern void vPortYield( void ); +#define portNVIC_INT_CTRL ( ( volatile uint32_t *) 0xe000ed04 ) +#define portNVIC_PENDSVSET 0x10000000 +#define portYIELD() vPortYield() +#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired ) *(portNVIC_INT_CTRL) = portNVIC_PENDSVSET +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + + +/* Critical section management. */ + +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); +extern uint32_t ulSetInterruptMaskFromISR( void ); +extern void vClearInterruptMaskFromISR( uint32_t ulMask ); + +#define portDISABLE_INTERRUPTS() __asm volatile( "cpsid i" ) +#define portENABLE_INTERRUPTS() __asm volatile( "cpsie i" ) +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() +#define portSET_INTERRUPT_MASK_FROM_ISR() ulSetInterruptMaskFromISR() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vClearInterruptMaskFromISR( x ) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#define portNOP() + +/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in +the source code because to do so would cause other compilers to generate +warnings. */ +#pragma diag_suppress=Pa082 + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CM3/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CM3/port.c new file mode 100644 index 0000000..c6f4ac2 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CM3/port.c @@ -0,0 +1,623 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the ARM CM3 port. + *----------------------------------------------------------*/ + +/* IAR includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#if configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 + #error configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html +#endif + +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#else + /* The way the SysTick is clocked is not modified in case it is not the same + as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 0 ) +#endif + +/* Constants required to manipulate the core. Registers first... */ +#define portNVIC_SYSTICK_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( * ( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( * ( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SYSPRI2_REG ( * ( ( volatile uint32_t * ) 0xe000ed20 ) ) +/* ...then bits in the registers. */ +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) + +#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( * ( ( volatile uint32_t * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */ +#define portVECTACTIVE_MASK ( 0xFFUL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have +occurred while the SysTick counter is stopped during tickless idle +calculations. */ +#define portMISSED_COUNTS_FACTOR ( 45UL ) + +/* For strict compliance with the Cortex-M spec the task start address should +have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ +#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) + +/* For backward compatibility, ensure configKERNEL_INTERRUPT_PRIORITY is +defined. The value 255 should also ensure backward compatibility. +FreeRTOS.org versions prior to V4.3.0 did not include this definition. */ +#ifndef configKERNEL_INTERRUPT_PRIORITY + #define configKERNEL_INTERRUPT_PRIORITY 255 +#endif + +/* Each task maintains its own interrupt status in the critical nesting +variable. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortSysTickHandler( void ); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +extern void vPortStartFirstTask( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* + * The number of SysTick increments that make up one tick period. + */ +#if configUSE_TICKLESS_IDLE == 1 + static uint32_t ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * The maximum number of tick periods that can be suppressed is limited by the + * 24 bit resolution of the SysTick timer. + */ +#if configUSE_TICKLESS_IDLE == 1 + static uint32_t xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Compensate for the CPU cycles that pass while the SysTick is stopped (low + * power functionality only. + */ +#if configUSE_TICKLESS_IDLE == 1 + static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static uint8_t ucMaxSysCallPriority = 0; + static uint32_t ulMaxPRIGROUPValue = 0; + static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const volatile uint8_t * const ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + interrupt. */ + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) prvTaskExitError; /* LR */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + for( ;; ); +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + #if( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + functions can be called. ISR safe functions are those that end in + "FromISR". FreeRTOS maintains separate thread and ISR API functions to + ensure interrupt entry is as fast and simple as possible. + + Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( uint8_t ) 0x01; + } + + /* Shift the priority group value back to its position within the AIRCR + register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* conifgASSERT_DEFINED */ + + /* Make PendSV and SysTick the lowest priority interrupts. */ + portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI; + portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Start the first task. */ + vPortStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + assert() if it is being called from an interrupt context. Only API + functions that end in "FromISR" can be used in an interrupt. Only assert if + the critical nesting count is 1 to protect against recursive calls if the + assert function also uses a critical section. */ + if( uxCriticalNesting == 1 ) + { + configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + /* The SysTick runs at the lowest interrupt priority, so when this interrupt + executes all interrupts must be unmasked. There is therefore no need to + save and then restore the interrupt mask value as its value is already + known. */ + portDISABLE_INTERRUPTS(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* A context switch is required. Context switching is performed in + the PendSV interrupt. Pend the PendSV interrupt. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portENABLE_INTERRUPTS(); +} +/*-----------------------------------------------------------*/ + +#if configUSE_TICKLESS_IDLE == 1 + + __weak void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickCTRL; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Stop the SysTick momentarily. The time the SysTick is stopped for + is accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG &= ~portNVIC_SYSTICK_ENABLE_BIT; + + /* Calculate the reload value required to wait xExpectedIdleTime + tick periods. -1 is used because this code will execute part way + through one of the tick periods. */ + ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + method as that will mask interrupts that should exit sleep mode. */ + __disable_interrupt(); + __DSB(); + __ISB(); + + + /* If a context switch is pending or a task is waiting for the scheduler + to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Restart from whatever is left in the count register to complete + this tick period. */ + portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Reset the reload register to the value required for normal tick + periods. */ + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + + /* Re-enable interrupts - see comments above __disable_interrupt() + call above. */ + __enable_interrupt(); + } + else + { + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + set its parameter to 0 to indicate that its implementation contains + its own wait for interrupt or wait for event instruction, and so wfi + should not be executed again. However, the original expected idle + time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + if( xModifiableIdleTime > 0 ) + { + __DSB(); + __WFI(); + __ISB(); + } + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Stop SysTick. Again, the time the SysTick is stopped for is + accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + ulSysTickCTRL = portNVIC_SYSTICK_CTRL_REG; + portNVIC_SYSTICK_CTRL_REG = ( ulSysTickCTRL & ~portNVIC_SYSTICK_ENABLE_BIT ); + + /* Re-enable interrupts - see comments above __disable_interrupt() + call above. */ + __enable_interrupt(); + + if( ( ulSysTickCTRL & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt has already executed, and the SysTick + count reloaded with ulReloadValue. Reset the + portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick + period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + underflowed because the post sleep hook did something + that took too long. */ + if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* The tick interrupt handler will already have pended the tick + processing in the kernel. As the pending tick will be + processed as soon as this function exits, the tick value + maintained by the tick is stepped forward by one less than the + time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. + Work out how long the sleep lasted rounded to complete tick + periods (not the ulReload value which accounted for part + ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* How many complete tick periods passed while the processor + was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG + again, then set portNVIC_SYSTICK_LOAD_REG back to its standard + value. The critical section is used to ensure the tick interrupt + can only execute once in the case that the reload register is near + zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portENTER_CRITICAL(); + { + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + vTaskStepTick( ulCompleteTickPeriods ); + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + portEXIT_CRITICAL(); + } + } + +#endif /* #if configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +__weak void vPortSetupTimerInterrupt( void ) +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if( configUSE_TICKLESS_IDLE == 1 ) + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); +} +/*-----------------------------------------------------------*/ + +#if( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + uint32_t ulCurrentInterrupt; + uint8_t ucCurrentPriority; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile( "mrs %0, ipsr" : "=r"( ulCurrentInterrupt ) ); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + an interrupt that has been assigned a priority above + configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + function. ISR safe FreeRTOS API functions must *only* be called + from interrupts that have been assigned a priority at or below + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Numerically low interrupt priority numbers represent logically high + interrupt priorities, therefore the priority of the interrupt must + be set to a value equal to or numerically *higher* than + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Interrupts that use the FreeRTOS API must not be left at their + default priority of zero as that is the highest possible priority, + which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + and therefore also guaranteed to be invalid. + + FreeRTOS maintains separate thread and ISR API functions to ensure + interrupt entry is as fast and simple as possible. + + The following links provide detailed information: + http://www.freertos.org/RTOS-Cortex-M3-M4.html + http://www.freertos.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + that define each interrupt's priority to be split between bits that + define the interrupt's pre-emption priority bits and bits that define + the interrupt's sub-priority. For simplicity all bits must be defined + to be pre-emption priority bits. The following assertion will fail if + this is not the case (if some bits represent a sub-priority). + + If the application only uses CMSIS libraries for interrupt + configuration then the correct setting can be achieved on all Cortex-M + devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + scheduler. Note however that some vendor specific peripheral libraries + assume a non-zero priority group setting, in which cases using a value + of zero will result in unpredicable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ + + + + + + + + + + + + + + + + + + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CM3/portasm.s b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CM3/portasm.s new file mode 100644 index 0000000..cf7a6a3 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CM3/portasm.s @@ -0,0 +1,145 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#include + + RSEG CODE:CODE(2) + thumb + + EXTERN pxCurrentTCB + EXTERN vTaskSwitchContext + + PUBLIC xPortPendSVHandler + PUBLIC vPortSVCHandler + PUBLIC vPortStartFirstTask + + + +/*-----------------------------------------------------------*/ + +xPortPendSVHandler: + mrs r0, psp + isb + ldr r3, =pxCurrentTCB /* Get the location of the current TCB. */ + ldr r2, [r3] + + stmdb r0!, {r4-r11} /* Save the remaining registers. */ + str r0, [r2] /* Save the new top of stack into the first member of the TCB. */ + + stmdb sp!, {r3, r14} + mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY + msr basepri, r0 + dsb + isb + bl vTaskSwitchContext + mov r0, #0 + msr basepri, r0 + ldmia sp!, {r3, r14} + + ldr r1, [r3] + ldr r0, [r1] /* The first item in pxCurrentTCB is the task top of stack. */ + ldmia r0!, {r4-r11} /* Pop the registers. */ + msr psp, r0 + isb + bx r14 + + +/*-----------------------------------------------------------*/ + +vPortSVCHandler: + /* Get the location of the current TCB. */ + ldr r3, =pxCurrentTCB + ldr r1, [r3] + ldr r0, [r1] + /* Pop the core registers. */ + ldmia r0!, {r4-r11} + msr psp, r0 + isb + mov r0, #0 + msr basepri, r0 + orr r14, r14, #13 + bx r14 + +/*-----------------------------------------------------------*/ + +vPortStartFirstTask + /* Use the NVIC offset register to locate the stack. */ + ldr r0, =0xE000ED08 + ldr r0, [r0] + ldr r0, [r0] + /* Set the msp back to the start of the stack. */ + msr msp, r0 + /* Call SVC to start the first task, ensuring interrupts are enabled. */ + cpsie i + cpsie f + dsb + isb + svc 0 + + END diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CM3/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CM3/portmacro.h new file mode 100644 index 0000000..3c23e3b --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CM3/portmacro.h @@ -0,0 +1,214 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +/*-----------------------------------------------------------*/ + +/* Scheduler utilities. */ +#define portYIELD() \ +{ \ + /* Set a PendSV to request a context switch. */ \ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ + __DSB(); \ + __ISB(); \ +} + +#define portNVIC_INT_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed04 ) ) +#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) +#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired != pdFALSE ) portYIELD() +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) + +/*-----------------------------------------------------------*/ + +/* Architecture specific optimisations. */ +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #include + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( ( uint32_t ) __CLZ( ( uxReadyPriorities ) ) ) ) + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); + +#define portDISABLE_INTERRUPTS() \ +{ \ + __set_BASEPRI( configMAX_SYSCALL_INTERRUPT_PRIORITY ); \ + __DSB(); \ + __ISB(); \ +} + +#define portENABLE_INTERRUPTS() __set_BASEPRI( 0 ) +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() +#define portSET_INTERRUPT_MASK_FROM_ISR() __get_BASEPRI(); portDISABLE_INTERRUPTS() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) __set_BASEPRI( x ) +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ +#ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) +#endif + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are +not necessary for to use this port. They are defined so the common demo files +(which build with all the ports) will build. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*-----------------------------------------------------------*/ + +#ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() +#endif + +/* portNOP() is not required by this port. */ +#define portNOP() + +/*-----------------------------------------------------------*/ + +/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in +the source code because to do so would cause other compilers to generate +warnings. */ +#pragma diag_suppress=Pe191 +#pragma diag_suppress=Pa082 + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CM4F/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CM4F/port.c new file mode 100644 index 0000000..3d102b6 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CM4F/port.c @@ -0,0 +1,664 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the ARM CM4F port. + *----------------------------------------------------------*/ + +/* Compiler includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#ifndef __ARMVFP__ + #error This port can only be used when the project options are configured to enable hardware floating point support. +#endif + +#if configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 + #error configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html +#endif + +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#else + /* The way the SysTick is clocked is not modified in case it is not the same + as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 0 ) +#endif + +/* Constants required to manipulate the core. Registers first... */ +#define portNVIC_SYSTICK_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( * ( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( * ( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SYSPRI2_REG ( * ( ( volatile uint32_t * ) 0xe000ed20 ) ) +/* ...then bits in the registers. */ +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) + +/* Constants used to detect a Cortex-M7 r0p1 core, which should use the ARM_CM7 +r0p1 port. */ +#define portCPUID ( * ( ( volatile uint32_t * ) 0xE000ed00 ) ) +#define portCORTEX_M7_r0p1_ID ( 0x410FC271UL ) +#define portCORTEX_M7_r0p0_ID ( 0x410FC270UL ) + +#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( * ( ( volatile uint32_t * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */ +#define portVECTACTIVE_MASK ( 0xFFUL ) + +/* Constants required to manipulate the VFP. */ +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating point context control register. */ +#define portASPEN_AND_LSPEN_BITS ( 0x3UL << 30UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) +#define portINITIAL_EXEC_RETURN ( 0xfffffffd ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have +occurred while the SysTick counter is stopped during tickless idle +calculations. */ +#define portMISSED_COUNTS_FACTOR ( 45UL ) + +/* For strict compliance with the Cortex-M spec the task start address should +have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ +#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) + +/* Each task maintains its own interrupt status in the critical nesting +variable. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortSysTickHandler( void ); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +extern void vPortStartFirstTask( void ); + +/* + * Turn the VFP on. + */ +extern void vPortEnableVFP( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* + * The number of SysTick increments that make up one tick period. + */ +#if configUSE_TICKLESS_IDLE == 1 + static uint32_t ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * The maximum number of tick periods that can be suppressed is limited by the + * 24 bit resolution of the SysTick timer. + */ +#if configUSE_TICKLESS_IDLE == 1 + static uint32_t xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Compensate for the CPU cycles that pass while the SysTick is stopped (low + * power functionality only. + */ +#if configUSE_TICKLESS_IDLE == 1 + static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static uint8_t ucMaxSysCallPriority = 0; + static uint32_t ulMaxPRIGROUPValue = 0; + static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const volatile uint8_t * const ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + interrupt. */ + + /* Offset added to account for the way the MCU uses the stack on entry/exit + of interrupts, and to ensure alignment. */ + pxTopOfStack--; + + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) prvTaskExitError; /* LR */ + + /* Save code space by skipping register initialisation. */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + + /* A save method is being used that requires each task to maintain its + own exec return value. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXEC_RETURN; + + pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + for( ;; ); +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. + See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + + /* This port can be used on all revisions of the Cortex-M7 core other than + the r0p1 parts. r0p1 parts should use the port from the + /source/portable/GCC/ARM_CM7/r0p1 directory. */ + configASSERT( portCPUID != portCORTEX_M7_r0p1_ID ); + configASSERT( portCPUID != portCORTEX_M7_r0p0_ID ); + + #if( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + functions can be called. ISR safe functions are those that end in + "FromISR". FreeRTOS maintains separate thread and ISR API functions to + ensure interrupt entry is as fast and simple as possible. + + Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( uint8_t ) 0x01; + } + + /* Shift the priority group value back to its position within the AIRCR + register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* conifgASSERT_DEFINED */ + + /* Make PendSV and SysTick the lowest priority interrupts. */ + portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI; + portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Ensure the VFP is enabled - it should be anyway. */ + vPortEnableVFP(); + + /* Lazy save always. */ + *( portFPCCR ) |= portASPEN_AND_LSPEN_BITS; + + /* Start the first task. */ + vPortStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + assert() if it is being called from an interrupt context. Only API + functions that end in "FromISR" can be used in an interrupt. Only assert if + the critical nesting count is 1 to protect against recursive calls if the + assert function also uses a critical section. */ + if( uxCriticalNesting == 1 ) + { + configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + /* The SysTick runs at the lowest interrupt priority, so when this interrupt + executes all interrupts must be unmasked. There is therefore no need to + save and then restore the interrupt mask value as its value is already + known. */ + portDISABLE_INTERRUPTS(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* A context switch is required. Context switching is performed in + the PendSV interrupt. Pend the PendSV interrupt. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portENABLE_INTERRUPTS(); +} +/*-----------------------------------------------------------*/ + +#if configUSE_TICKLESS_IDLE == 1 + + __weak void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickCTRL; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Stop the SysTick momentarily. The time the SysTick is stopped for + is accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG &= ~portNVIC_SYSTICK_ENABLE_BIT; + + /* Calculate the reload value required to wait xExpectedIdleTime + tick periods. -1 is used because this code will execute part way + through one of the tick periods. */ + ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + method as that will mask interrupts that should exit sleep mode. */ + __disable_interrupt(); + __DSB(); + __ISB(); + + + /* If a context switch is pending or a task is waiting for the scheduler + to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Restart from whatever is left in the count register to complete + this tick period. */ + portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Reset the reload register to the value required for normal tick + periods. */ + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + + /* Re-enable interrupts - see comments above __disable_interrupt() + call above. */ + __enable_interrupt(); + } + else + { + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + set its parameter to 0 to indicate that its implementation contains + its own wait for interrupt or wait for event instruction, and so wfi + should not be executed again. However, the original expected idle + time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + if( xModifiableIdleTime > 0 ) + { + __DSB(); + __WFI(); + __ISB(); + } + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Stop SysTick. Again, the time the SysTick is stopped for is + accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + ulSysTickCTRL = portNVIC_SYSTICK_CTRL_REG; + portNVIC_SYSTICK_CTRL_REG = ( ulSysTickCTRL & ~portNVIC_SYSTICK_ENABLE_BIT ); + + /* Re-enable interrupts - see comments above __disable_interrupt() + call above. */ + __enable_interrupt(); + + if( ( ulSysTickCTRL & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt has already executed, and the SysTick + count reloaded with ulReloadValue. Reset the + portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick + period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + underflowed because the post sleep hook did something + that took too long. */ + if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* The tick interrupt handler will already have pended the tick + processing in the kernel. As the pending tick will be + processed as soon as this function exits, the tick value + maintained by the tick is stepped forward by one less than the + time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. + Work out how long the sleep lasted rounded to complete tick + periods (not the ulReload value which accounted for part + ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* How many complete tick periods passed while the processor + was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG + again, then set portNVIC_SYSTICK_LOAD_REG back to its standard + value. The critical section is used to ensure the tick interrupt + can only execute once in the case that the reload register is near + zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portENTER_CRITICAL(); + { + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + vTaskStepTick( ulCompleteTickPeriods ); + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + portEXIT_CRITICAL(); + } + } + +#endif /* #if configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +__weak void vPortSetupTimerInterrupt( void ) +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if( configUSE_TICKLESS_IDLE == 1 ) + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); +} +/*-----------------------------------------------------------*/ + +#if( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + uint32_t ulCurrentInterrupt; + uint8_t ucCurrentPriority; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile( "mrs %0, ipsr" : "=r"( ulCurrentInterrupt ) ); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + an interrupt that has been assigned a priority above + configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + function. ISR safe FreeRTOS API functions must *only* be called + from interrupts that have been assigned a priority at or below + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Numerically low interrupt priority numbers represent logically high + interrupt priorities, therefore the priority of the interrupt must + be set to a value equal to or numerically *higher* than + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Interrupts that use the FreeRTOS API must not be left at their + default priority of zero as that is the highest possible priority, + which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + and therefore also guaranteed to be invalid. + + FreeRTOS maintains separate thread and ISR API functions to ensure + interrupt entry is as fast and simple as possible. + + The following links provide detailed information: + http://www.freertos.org/RTOS-Cortex-M3-M4.html + http://www.freertos.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + that define each interrupt's priority to be split between bits that + define the interrupt's pre-emption priority bits and bits that define + the interrupt's sub-priority. For simplicity all bits must be defined + to be pre-emption priority bits. The following assertion will fail if + this is not the case (if some bits represent a sub-priority). + + If the application only uses CMSIS libraries for interrupt + configuration then the correct setting can be achieved on all Cortex-M + devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + scheduler. Note however that some vendor specific peripheral libraries + assume a non-zero priority group setting, in which cases using a value + of zero will result in unpredicable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ + + + + + + + + + + + + + + + + + + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CM4F/portasm.s b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CM4F/portasm.s new file mode 100644 index 0000000..758d6fa --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CM4F/portasm.s @@ -0,0 +1,185 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#include + + RSEG CODE:CODE(2) + thumb + + EXTERN pxCurrentTCB + EXTERN vTaskSwitchContext + + PUBLIC xPortPendSVHandler + PUBLIC vPortSVCHandler + PUBLIC vPortStartFirstTask + PUBLIC vPortEnableVFP + + +/*-----------------------------------------------------------*/ + +xPortPendSVHandler: + mrs r0, psp + isb + /* Get the location of the current TCB. */ + ldr r3, =pxCurrentTCB + ldr r2, [r3] + + /* Is the task using the FPU context? If so, push high vfp registers. */ + tst r14, #0x10 + it eq + vstmdbeq r0!, {s16-s31} + + /* Save the core registers. */ + stmdb r0!, {r4-r11, r14} + + /* Save the new top of stack into the first member of the TCB. */ + str r0, [r2] + + stmdb sp!, {r3} + mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY + msr basepri, r0 + dsb + isb + bl vTaskSwitchContext + mov r0, #0 + msr basepri, r0 + ldmia sp!, {r3} + + /* The first item in pxCurrentTCB is the task top of stack. */ + ldr r1, [r3] + ldr r0, [r1] + + /* Pop the core registers. */ + ldmia r0!, {r4-r11, r14} + + /* Is the task using the FPU context? If so, pop the high vfp registers + too. */ + tst r14, #0x10 + it eq + vldmiaeq r0!, {s16-s31} + + msr psp, r0 + isb + #ifdef WORKAROUND_PMU_CM001 /* XMC4000 specific errata */ + #if WORKAROUND_PMU_CM001 == 1 + push { r14 } + pop { pc } + #endif + #endif + + bx r14 + + +/*-----------------------------------------------------------*/ + +vPortSVCHandler: + /* Get the location of the current TCB. */ + ldr r3, =pxCurrentTCB + ldr r1, [r3] + ldr r0, [r1] + /* Pop the core registers. */ + ldmia r0!, {r4-r11, r14} + msr psp, r0 + isb + mov r0, #0 + msr basepri, r0 + bx r14 + +/*-----------------------------------------------------------*/ + +vPortStartFirstTask + /* Use the NVIC offset register to locate the stack. */ + ldr r0, =0xE000ED08 + ldr r0, [r0] + ldr r0, [r0] + /* Set the msp back to the start of the stack. */ + msr msp, r0 + /* Call SVC to start the first task. */ + cpsie i + cpsie f + dsb + isb + svc 0 + +/*-----------------------------------------------------------*/ + +vPortEnableVFP: + /* The FPU enable bits are in the CPACR. */ + ldr.w r0, =0xE000ED88 + ldr r1, [r0] + + /* Enable CP10 and CP11 coprocessors, then save back. */ + orr r1, r1, #( 0xf << 20 ) + str r1, [r0] + bx r14 + + + + END + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CM4F/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CM4F/portmacro.h new file mode 100644 index 0000000..1e98725 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CM4F/portmacro.h @@ -0,0 +1,213 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +/*-----------------------------------------------------------*/ + +/* Scheduler utilities. */ +#define portYIELD() \ +{ \ + /* Set a PendSV to request a context switch. */ \ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ + __DSB(); \ + __ISB(); \ +} + +#define portNVIC_INT_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed04 ) ) +#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) +#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired != pdFALSE ) portYIELD() +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) + +/*-----------------------------------------------------------*/ + +/* Architecture specific optimisations. */ +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #include + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( ( uint32_t ) __CLZ( ( uxReadyPriorities ) ) ) ) + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); + +#define portDISABLE_INTERRUPTS() \ +{ \ + __set_BASEPRI( configMAX_SYSCALL_INTERRUPT_PRIORITY ); \ + __DSB(); \ + __ISB(); \ +} + +#define portENABLE_INTERRUPTS() __set_BASEPRI( 0 ) +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() +#define portSET_INTERRUPT_MASK_FROM_ISR() __get_BASEPRI(); portDISABLE_INTERRUPTS() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) __set_BASEPRI( x ) +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ +#ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) +#endif + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are +not necessary for to use this port. They are defined so the common demo files +(which build with all the ports) will build. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*-----------------------------------------------------------*/ + +#ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() +#endif + +/* portNOP() is not required by this port. */ +#define portNOP() + +/*-----------------------------------------------------------*/ + +/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in +the source code because to do so would cause other compilers to generate +warnings. */ +#pragma diag_suppress=Pe191 +#pragma diag_suppress=Pa082 + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CM7/ReadMe.txt b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CM7/ReadMe.txt new file mode 100644 index 0000000..2116456 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CM7/ReadMe.txt @@ -0,0 +1,18 @@ +There are two options for running FreeRTOS on ARM Cortex-M7 microcontrollers. +The best option depends on the revision of the ARM Cortex-M7 core in use. The +revision is specified by an 'r' number, and a 'p' number, so will look something +like 'r0p1'. Check the documentation for the microcontroller in use to find the +revision of the Cortex-M7 core used in that microcontroller. If in doubt, use +the FreeRTOS port provided specifically for r0p1 revisions, as that can be used +with all core revisions. + +The first option is to use the ARM Cortex-M4F port, and the second option is to +use the Cortex-M7 r0p1 port - the latter containing a minor errata workaround. + +If the revision of the ARM Cortex-M7 core is not r0p1 then either option can be +used, but it is recommended to use the FreeRTOS ARM Cortex-M4F port located in +the /FreeRTOS/Source/portable/IAR/ARM_CM4F directory. + +If the revision of the ARM Cortex-M7 core is r0p1 then use the FreeRTOS ARM +Cortex-M7 r0p1 port located in the /FreeRTOS/Source/portable/IAR/ARM_CM7/r0p1 +directory. \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CM7/r0p1/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CM7/r0p1/port.c new file mode 100644 index 0000000..da08e49 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CM7/r0p1/port.c @@ -0,0 +1,647 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the ARM CM4F port. + *----------------------------------------------------------*/ + +/* Compiler includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#ifndef __ARMVFP__ + #error This port can only be used when the project options are configured to enable hardware floating point support. +#endif + +#if configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 + #error configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html +#endif + +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#else + /* The way the SysTick is clocked is not modified in case it is not the same + as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 0 ) +#endif + +/* Constants required to manipulate the core. Registers first... */ +#define portNVIC_SYSTICK_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( * ( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( * ( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SYSPRI2_REG ( * ( ( volatile uint32_t * ) 0xe000ed20 ) ) +/* ...then bits in the registers. */ +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) + +#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( * ( ( volatile uint32_t * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */ +#define portVECTACTIVE_MASK ( 0xFFUL ) + +/* Constants required to manipulate the VFP. */ +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating point context control register. */ +#define portASPEN_AND_LSPEN_BITS ( 0x3UL << 30UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) +#define portINITIAL_EXEC_RETURN ( 0xfffffffd ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have +occurred while the SysTick counter is stopped during tickless idle +calculations. */ +#define portMISSED_COUNTS_FACTOR ( 45UL ) + +/* For strict compliance with the Cortex-M spec the task start address should +have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ +#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) + +/* Each task maintains its own interrupt status in the critical nesting +variable. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortSysTickHandler( void ); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +extern void vPortStartFirstTask( void ); + +/* + * Turn the VFP on. + */ +extern void vPortEnableVFP( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* + * The number of SysTick increments that make up one tick period. + */ +#if configUSE_TICKLESS_IDLE == 1 + static uint32_t ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * The maximum number of tick periods that can be suppressed is limited by the + * 24 bit resolution of the SysTick timer. + */ +#if configUSE_TICKLESS_IDLE == 1 + static uint32_t xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Compensate for the CPU cycles that pass while the SysTick is stopped (low + * power functionality only. + */ +#if configUSE_TICKLESS_IDLE == 1 + static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static uint8_t ucMaxSysCallPriority = 0; + static uint32_t ulMaxPRIGROUPValue = 0; + static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const volatile uint8_t * const ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + interrupt. */ + + /* Offset added to account for the way the MCU uses the stack on entry/exit + of interrupts, and to ensure alignment. */ + pxTopOfStack--; + + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) prvTaskExitError; /* LR */ + + /* Save code space by skipping register initialisation. */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + + /* A save method is being used that requires each task to maintain its + own exec return value. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXEC_RETURN; + + pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + for( ;; ); +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + #if( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + functions can be called. ISR safe functions are those that end in + "FromISR". FreeRTOS maintains separate thread and ISR API functions to + ensure interrupt entry is as fast and simple as possible. + + Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( uint8_t ) 0x01; + } + + /* Shift the priority group value back to its position within the AIRCR + register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* conifgASSERT_DEFINED */ + + /* Make PendSV and SysTick the lowest priority interrupts. */ + portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI; + portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Ensure the VFP is enabled - it should be anyway. */ + vPortEnableVFP(); + + /* Lazy save always. */ + *( portFPCCR ) |= portASPEN_AND_LSPEN_BITS; + + /* Start the first task. */ + vPortStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + assert() if it is being called from an interrupt context. Only API + functions that end in "FromISR" can be used in an interrupt. Only assert if + the critical nesting count is 1 to protect against recursive calls if the + assert function also uses a critical section. */ + if( uxCriticalNesting == 1 ) + { + configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + /* The SysTick runs at the lowest interrupt priority, so when this interrupt + executes all interrupts must be unmasked. There is therefore no need to + save and then restore the interrupt mask value as its value is already + known. */ + portDISABLE_INTERRUPTS(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* A context switch is required. Context switching is performed in + the PendSV interrupt. Pend the PendSV interrupt. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portENABLE_INTERRUPTS(); +} +/*-----------------------------------------------------------*/ + +#if configUSE_TICKLESS_IDLE == 1 + + __weak void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickCTRL; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Stop the SysTick momentarily. The time the SysTick is stopped for + is accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG &= ~portNVIC_SYSTICK_ENABLE_BIT; + + /* Calculate the reload value required to wait xExpectedIdleTime + tick periods. -1 is used because this code will execute part way + through one of the tick periods. */ + ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + method as that will mask interrupts that should exit sleep mode. */ + __disable_interrupt(); + __DSB(); + __ISB(); + + /* If a context switch is pending or a task is waiting for the scheduler + to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Restart from whatever is left in the count register to complete + this tick period. */ + portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Reset the reload register to the value required for normal tick + periods. */ + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + + /* Re-enable interrupts - see comments above __disable_interrupt() + call above. */ + __enable_interrupt(); + } + else + { + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + set its parameter to 0 to indicate that its implementation contains + its own wait for interrupt or wait for event instruction, and so wfi + should not be executed again. However, the original expected idle + time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + if( xModifiableIdleTime > 0 ) + { + __DSB(); + __WFI(); + __ISB(); + } + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Stop SysTick. Again, the time the SysTick is stopped for is + accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + ulSysTickCTRL = portNVIC_SYSTICK_CTRL_REG; + portNVIC_SYSTICK_CTRL_REG = ( ulSysTickCTRL & ~portNVIC_SYSTICK_ENABLE_BIT ); + + /* Re-enable interrupts - see comments above __disable_interrupt() + call above. */ + __enable_interrupt(); + + if( ( ulSysTickCTRL & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt has already executed, and the SysTick + count reloaded with ulReloadValue. Reset the + portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick + period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + underflowed because the post sleep hook did something + that took too long. */ + if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* The tick interrupt handler will already have pended the tick + processing in the kernel. As the pending tick will be + processed as soon as this function exits, the tick value + maintained by the tick is stepped forward by one less than the + time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. + Work out how long the sleep lasted rounded to complete tick + periods (not the ulReload value which accounted for part + ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* How many complete tick periods passed while the processor + was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG + again, then set portNVIC_SYSTICK_LOAD_REG back to its standard + value. The critical section is used to ensure the tick interrupt + can only execute once in the case that the reload register is near + zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portENTER_CRITICAL(); + { + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + vTaskStepTick( ulCompleteTickPeriods ); + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + portEXIT_CRITICAL(); + } + } + +#endif /* #if configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +__weak void vPortSetupTimerInterrupt( void ) +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if( configUSE_TICKLESS_IDLE == 1 ) + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); +} +/*-----------------------------------------------------------*/ + +#if( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + uint32_t ulCurrentInterrupt; + uint8_t ucCurrentPriority; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile( "mrs %0, ipsr" : "=r"( ulCurrentInterrupt ) ); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + an interrupt that has been assigned a priority above + configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + function. ISR safe FreeRTOS API functions must *only* be called + from interrupts that have been assigned a priority at or below + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Numerically low interrupt priority numbers represent logically high + interrupt priorities, therefore the priority of the interrupt must + be set to a value equal to or numerically *higher* than + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Interrupts that use the FreeRTOS API must not be left at their + default priority of zero as that is the highest possible priority, + which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + and therefore also guaranteed to be invalid. + + FreeRTOS maintains separate thread and ISR API functions to ensure + interrupt entry is as fast and simple as possible. + + The following links provide detailed information: + http://www.freertos.org/RTOS-Cortex-M3-M4.html + http://www.freertos.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + that define each interrupt's priority to be split between bits that + define the interrupt's pre-emption priority bits and bits that define + the interrupt's sub-priority. For simplicity all bits must be defined + to be pre-emption priority bits. The following assertion will fail if + this is not the case (if some bits represent a sub-priority). + + If the application only uses CMSIS libraries for interrupt + configuration then the correct setting can be achieved on all Cortex-M + devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + scheduler. Note however that some vendor specific peripheral libraries + assume a non-zero priority group setting, in which cases using a value + of zero will result in unpredicable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ + + + + + + + + + + + + + + + + + + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CM7/r0p1/portasm.s b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CM7/r0p1/portasm.s new file mode 100644 index 0000000..2ab809a --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CM7/r0p1/portasm.s @@ -0,0 +1,187 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#include + + RSEG CODE:CODE(2) + thumb + + EXTERN pxCurrentTCB + EXTERN vTaskSwitchContext + + PUBLIC xPortPendSVHandler + PUBLIC vPortSVCHandler + PUBLIC vPortStartFirstTask + PUBLIC vPortEnableVFP + + +/*-----------------------------------------------------------*/ + +xPortPendSVHandler: + mrs r0, psp + isb + /* Get the location of the current TCB. */ + ldr r3, =pxCurrentTCB + ldr r2, [r3] + + /* Is the task using the FPU context? If so, push high vfp registers. */ + tst r14, #0x10 + it eq + vstmdbeq r0!, {s16-s31} + + /* Save the core registers. */ + stmdb r0!, {r4-r11, r14} + + /* Save the new top of stack into the first member of the TCB. */ + str r0, [r2] + + stmdb sp!, {r3} + mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY + cpsid i + msr basepri, r0 + dsb + isb + cpsie i + bl vTaskSwitchContext + mov r0, #0 + msr basepri, r0 + ldmia sp!, {r3} + + /* The first item in pxCurrentTCB is the task top of stack. */ + ldr r1, [r3] + ldr r0, [r1] + + /* Pop the core registers. */ + ldmia r0!, {r4-r11, r14} + + /* Is the task using the FPU context? If so, pop the high vfp registers + too. */ + tst r14, #0x10 + it eq + vldmiaeq r0!, {s16-s31} + + msr psp, r0 + isb + #ifdef WORKAROUND_PMU_CM001 /* XMC4000 specific errata */ + #if WORKAROUND_PMU_CM001 == 1 + push { r14 } + pop { pc } + #endif + #endif + + bx r14 + + +/*-----------------------------------------------------------*/ + +vPortSVCHandler: + /* Get the location of the current TCB. */ + ldr r3, =pxCurrentTCB + ldr r1, [r3] + ldr r0, [r1] + /* Pop the core registers. */ + ldmia r0!, {r4-r11, r14} + msr psp, r0 + isb + mov r0, #0 + msr basepri, r0 + bx r14 + +/*-----------------------------------------------------------*/ + +vPortStartFirstTask + /* Use the NVIC offset register to locate the stack. */ + ldr r0, =0xE000ED08 + ldr r0, [r0] + ldr r0, [r0] + /* Set the msp back to the start of the stack. */ + msr msp, r0 + /* Call SVC to start the first task. */ + cpsie i + cpsie f + dsb + isb + svc 0 + +/*-----------------------------------------------------------*/ + +vPortEnableVFP: + /* The FPU enable bits are in the CPACR. */ + ldr.w r0, =0xE000ED88 + ldr r1, [r0] + + /* Enable CP10 and CP11 coprocessors, then save back. */ + orr r1, r1, #( 0xf << 20 ) + str r1, [r0] + bx r14 + + + + END + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CM7/r0p1/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CM7/r0p1/portmacro.h new file mode 100644 index 0000000..9760ee3 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CM7/r0p1/portmacro.h @@ -0,0 +1,216 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +/*-----------------------------------------------------------*/ + +/* Scheduler utilities. */ +#define portYIELD() \ +{ \ + /* Set a PendSV to request a context switch. */ \ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ + __DSB(); \ + __ISB(); \ +} + +#define portNVIC_INT_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed04 ) ) +#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) +#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired != pdFALSE ) portYIELD() +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) + +/*-----------------------------------------------------------*/ + +/* Architecture specific optimisations. */ +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #include + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( ( uint32_t ) __CLZ( ( uxReadyPriorities ) ) ) ) + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); + +#define portDISABLE_INTERRUPTS() \ +{ \ + /* Errata work around. */ \ + __disable_interrupt(); \ + __set_BASEPRI( configMAX_SYSCALL_INTERRUPT_PRIORITY ); \ + __DSB(); \ + __ISB(); \ + __enable_interrupt(); \ +} + +#define portENABLE_INTERRUPTS() __set_BASEPRI( 0 ) +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() +#define portSET_INTERRUPT_MASK_FROM_ISR() __get_BASEPRI(); portDISABLE_INTERRUPTS() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) __set_BASEPRI( x ) +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ +#ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) +#endif + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are +not necessary for to use this port. They are defined so the common demo files +(which build with all the ports) will build. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*-----------------------------------------------------------*/ + +#ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() +#endif + +/* portNOP() is not required by this port. */ +#define portNOP() + +/*-----------------------------------------------------------*/ + +/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in +the source code because to do so would cause other compilers to generate +warnings. */ +#pragma diag_suppress=Pe191 +#pragma diag_suppress=Pa082 + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CRx_No_GIC/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CRx_No_GIC/port.c new file mode 100644 index 0000000..5cfdb11 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CRx_No_GIC/port.c @@ -0,0 +1,358 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +#ifndef configSETUP_TICK_INTERRUPT + #error configSETUP_TICK_INTERRUPT() must be defined in FreeRTOSConfig.h to call the function that sets up the tick interrupt. +#endif + +#ifndef configCLEAR_TICK_INTERRUPT + #error configCLEAR_TICK_INTERRUPT must be defined in FreeRTOSConfig.h to clear which ever interrupt was used to generate the tick interrupt. +#endif + +/* A critical section is exited when the critical section nesting count reaches +this value. */ +#define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) + +/* Tasks are not created with a floating point context, but can be given a +floating point context after they have been created. A variable is stored as +part of the tasks context that holds portNO_FLOATING_POINT_CONTEXT if the task +does not have an FPU context, or any other value if the task does have an FPU +context. */ +#define portNO_FLOATING_POINT_CONTEXT ( ( StackType_t ) 0 ) + +/* Constants required to setup the initial task context. */ +#define portINITIAL_SPSR ( ( StackType_t ) 0x1f ) /* System mode, ARM mode, IRQ enabled FIQ enabled. */ +#define portTHUMB_MODE_BIT ( ( StackType_t ) 0x20 ) +#define portTHUMB_MODE_ADDRESS ( 0x01UL ) + +/* Masks all bits in the APSR other than the mode bits. */ +#define portAPSR_MODE_BITS_MASK ( 0x1F ) + +/* The value of the mode bits in the APSR when the CPU is executing in user +mode. */ +#define portAPSR_USER_MODE ( 0x10 ) + +/* Let the user override the pre-loading of the initial LR with the address of +prvTaskExitError() in case it messes up unwinding of the stack in the +debugger. */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/*-----------------------------------------------------------*/ + +/* + * Starts the first task executing. This function is necessarily written in + * assembly code so is implemented in portASM.s. + */ +extern void vPortRestoreTaskContext( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* A variable is used to keep track of the critical section nesting. This +variable has to be stored as part of the task context and must be initialised to +a non zero value to ensure interrupts don't inadvertently become unmasked before +the scheduler starts. As it is stored as part of the task context it will +automatically be set to 0 when the first task is started. */ +volatile uint32_t ulCriticalNesting = 9999UL; + +/* Saved as part of the task context. If ulPortTaskHasFPUContext is non-zero then +a floating point context must be saved and restored for the task. */ +volatile uint32_t ulPortTaskHasFPUContext = pdFALSE; + +/* Set to 1 to pend a context switch from an ISR. */ +volatile uint32_t ulPortYieldRequired = pdFALSE; + +/* Counts the interrupt nesting depth. A context switch is only performed if +if the nesting depth is 0. */ +volatile uint32_t ulPortInterruptNesting = 0UL; + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. + + The fist real value on the stack is the status register, which is set for + system mode, with interrupts enabled. A few NULLs are added first to ensure + GDB does not try decoding a non-existent return address. */ + *pxTopOfStack = ( StackType_t ) NULL; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) NULL; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) NULL; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portINITIAL_SPSR; + + if( ( ( uint32_t ) pxCode & portTHUMB_MODE_ADDRESS ) != 0x00UL ) + { + /* The task will start in THUMB mode. */ + *pxTopOfStack |= portTHUMB_MODE_BIT; + } + + pxTopOfStack--; + + /* Next the return address, which in this case is the start of the task. */ + *pxTopOfStack = ( StackType_t ) pxCode; + pxTopOfStack--; + + /* Next all the registers other than the stack pointer. */ + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + + /* The task will start with a critical nesting count of 0 as interrupts are + enabled. */ + *pxTopOfStack = portNO_CRITICAL_NESTING; + pxTopOfStack--; + + /* The task will start without a floating point context. A task that uses + the floating point hardware must call vPortTaskUsesFPU() before executing + any floating point instructions. */ + *pxTopOfStack = portNO_FLOATING_POINT_CONTEXT; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT( ulPortInterruptNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + for( ;; ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +uint32_t ulAPSR; + + /* Only continue if the CPU is not in User mode. The CPU must be in a + Privileged mode for the scheduler to start. */ + __asm volatile ( "MRS %0, APSR" : "=r" ( ulAPSR ) ); + ulAPSR &= portAPSR_MODE_BITS_MASK; + configASSERT( ulAPSR != portAPSR_USER_MODE ); + + if( ulAPSR != portAPSR_USER_MODE ) + { + /* Start the timer that generates the tick ISR. */ + portDISABLE_INTERRUPTS(); + configSETUP_TICK_INTERRUPT(); + + /* Start the first task executing. */ + vPortRestoreTaskContext(); + } + + /* Will only get here if vTaskStartScheduler() was called with the CPU in + a non-privileged mode or the binary point register was not set to its lowest + possible value. prvTaskExitError() is referenced to prevent a compiler + warning about it being defined but not referenced in the case that the user + defines their own exit address. */ + ( void ) prvTaskExitError; + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( ulCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + + /* Now interrupts are disabled ulCriticalNesting can be accessed + directly. Increment ulCriticalNesting to keep a count of how many times + portENTER_CRITICAL() has been called. */ + ulCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + assert() if it is being called from an interrupt context. Only API + functions that end in "FromISR" can be used in an interrupt. Only assert if + the critical nesting count is 1 to protect against recursive calls if the + assert function also uses a critical section. */ + if( ulCriticalNesting == 1 ) + { + configASSERT( ulPortInterruptNesting == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + if( ulCriticalNesting > portNO_CRITICAL_NESTING ) + { + /* Decrement the nesting count as the critical section is being + exited. */ + ulCriticalNesting--; + + /* If the nesting level has reached zero then all interrupt + priorities must be re-enabled. */ + if( ulCriticalNesting == portNO_CRITICAL_NESTING ) + { + /* Critical nesting has reached zero so all interrupt priorities + should be unmasked. */ + portENABLE_INTERRUPTS(); + } + } +} +/*-----------------------------------------------------------*/ + +void FreeRTOS_Tick_Handler( void ) +{ +uint32_t ulInterruptStatus; + + ulInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + ulPortYieldRequired = pdTRUE; + } + + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulInterruptStatus ); + + configCLEAR_TICK_INTERRUPT(); +} +/*-----------------------------------------------------------*/ + +void vPortTaskUsesFPU( void ) +{ +uint32_t ulInitialFPSCR = 0; + + /* A task is registering the fact that it needs an FPU context. Set the + FPU flag (which is saved as part of the task context). */ + ulPortTaskHasFPUContext = pdTRUE; + + /* Initialise the floating point status register. */ + __asm volatile ( "FMXR FPSCR, %0" :: "r" (ulInitialFPSCR) ); +} +/*-----------------------------------------------------------*/ + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CRx_No_GIC/portASM.s b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CRx_No_GIC/portASM.s new file mode 100644 index 0000000..dc1d9be --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CRx_No_GIC/portASM.s @@ -0,0 +1,274 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +#include "FreeRTOSConfig.h" + + SECTION .text:CODE:ROOT(2) + arm + + /* Variables and functions. */ + EXTERN pxCurrentTCB + EXTERN vTaskSwitchContext + EXTERN vApplicationIRQHandler + EXTERN ulPortInterruptNesting + EXTERN ulPortTaskHasFPUContext + EXTERN ulPortYieldRequired + EXTERN ulCriticalNesting + + PUBLIC FreeRTOS_IRQ_Handler + PUBLIC FreeRTOS_SVC_Handler + PUBLIC vPortRestoreTaskContext + +SYS_MODE EQU 0x1f +SVC_MODE EQU 0x13 +IRQ_MODE EQU 0x12 + +portSAVE_CONTEXT MACRO + + /* Save the LR and SPSR onto the system mode stack before switching to + system mode to save the remaining system mode registers. */ + SRSDB sp!, #SYS_MODE + CPS #SYS_MODE + PUSH {R0-R12, R14} + + /* Push the critical nesting count. */ + LDR R2, =ulCriticalNesting + LDR R1, [R2] + PUSH {R1} + + /* Does the task have a floating point context that needs saving? If + ulPortTaskHasFPUContext is 0 then no. */ + LDR R2, =ulPortTaskHasFPUContext + LDR R3, [R2] + CMP R3, #0 + + /* Save the floating point context, if any. */ + FMRXNE R1, FPSCR + VPUSHNE {D0-D15} +#if configFPU_D32 == 1 + VPUSHNE {D16-D31} +#endif /* configFPU_D32 */ + PUSHNE {R1} + + /* Save ulPortTaskHasFPUContext itself. */ + PUSH {R3} + + /* Save the stack pointer in the TCB. */ + LDR R0, =pxCurrentTCB + LDR R1, [R0] + STR SP, [R1] + + ENDM + +; /**********************************************************************/ + +portRESTORE_CONTEXT MACRO + + /* Set the SP to point to the stack of the task being restored. */ + LDR R0, =pxCurrentTCB + LDR R1, [R0] + LDR SP, [R1] + + /* Is there a floating point context to restore? If the restored + ulPortTaskHasFPUContext is zero then no. */ + LDR R0, =ulPortTaskHasFPUContext + POP {R1} + STR R1, [R0] + CMP R1, #0 + + /* Restore the floating point context, if any. */ + POPNE {R0} +#if configFPU_D32 == 1 + VPOPNE {D16-D31} +#endif /* configFPU_D32 */ + VPOPNE {D0-D15} + VMSRNE FPSCR, R0 + + /* Restore the critical section nesting depth. */ + LDR R0, =ulCriticalNesting + POP {R1} + STR R1, [R0] + + /* Restore all system mode registers other than the SP (which is already + being used). */ + POP {R0-R12, R14} + + /* Return to the task code, loading CPSR on the way. */ + RFEIA sp! + + ENDM + + + + +/****************************************************************************** + * SVC handler is used to yield. + *****************************************************************************/ +FreeRTOS_SVC_Handler: + /* Save the context of the current task and select a new task to run. */ + portSAVE_CONTEXT + LDR R0, =vTaskSwitchContext + BLX R0 + portRESTORE_CONTEXT + + +/****************************************************************************** + * vPortRestoreTaskContext is used to start the scheduler. + *****************************************************************************/ +vPortRestoreTaskContext: + /* Switch to system mode. */ + CPS #SYS_MODE + portRESTORE_CONTEXT + +FreeRTOS_IRQ_Handler: + /* Return to the interrupted instruction. */ + SUB lr, lr, #4 + + /* Push the return address and SPSR. */ + PUSH {lr} + MRS lr, SPSR + PUSH {lr} + + /* Change to supervisor mode to allow reentry. */ + CPS #SVC_MODE + + /* Push used registers. */ + PUSH {r0-r3, r12} + + /* Increment nesting count. r3 holds the address of ulPortInterruptNesting + for future use. r1 holds the original ulPortInterruptNesting value for + future use. */ + LDR r3, =ulPortInterruptNesting + LDR r1, [r3] + ADD r0, r1, #1 + STR r0, [r3] + + /* Ensure bit 2 of the stack pointer is clear. r2 holds the bit 2 value for + future use. */ + MOV r0, sp + AND r2, r0, #4 + SUB sp, sp, r2 + + /* Call the interrupt handler. */ + PUSH {r0-r3, lr} + LDR r1, =vApplicationIRQHandler + BLX r1 + POP {r0-r3, lr} + ADD sp, sp, r2 + + CPSID i + DSB + ISB + + /* Write to the EOI register. */ + LDR r2, =configEOI_ADDRESS + STR r0, [r2] + + /* Restore the old nesting count. */ + STR r1, [r3] + + /* A context switch is never performed if the nesting count is not 0. */ + CMP r1, #0 + BNE exit_without_switch + + /* Did the interrupt request a context switch? r1 holds the address of + ulPortYieldRequired and r0 the value of ulPortYieldRequired for future + use. */ + LDR r1, =ulPortYieldRequired + LDR r0, [r1] + CMP r0, #0 + BNE switch_before_exit + +exit_without_switch: + /* No context switch. Restore used registers, LR_irq and SPSR before + returning. */ + POP {r0-r3, r12} + CPS #IRQ_MODE + POP {LR} + MSR SPSR_cxsf, LR + POP {LR} + MOVS PC, LR + +switch_before_exit: + /* A context swtich is to be performed. Clear the context switch pending + flag. */ + MOV r0, #0 + STR r0, [r1] + + /* Restore used registers, LR-irq and SPSR before saving the context + to the task stack. */ + POP {r0-r3, r12} + CPS #IRQ_MODE + POP {LR} + MSR SPSR_cxsf, LR + POP {LR} + portSAVE_CONTEXT + + /* Call the function that selects the new task to execute. + vTaskSwitchContext() if vTaskSwitchContext() uses LDRD or STRD + instructions, or 8 byte aligned stack allocated data. LR does not need + saving as a new LR will be loaded by portRESTORE_CONTEXT anyway. */ + LDR R0, =vTaskSwitchContext + BLX R0 + + /* Restore the context of, and branch to, the task selected to execute + next. */ + portRESTORE_CONTEXT + + END + + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CRx_No_GIC/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CRx_No_GIC/portmacro.h new file mode 100644 index 0000000..9022ee7 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ARM_CRx_No_GIC/portmacro.h @@ -0,0 +1,223 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +typedef uint32_t TickType_t; +#define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do +not need to be guarded with a critical section. */ +#define portTICK_TYPE_IS_ATOMIC 1 + +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 + +/*-----------------------------------------------------------*/ + +/* Task utilities. */ + +/* Called at the end of an ISR that can cause a context switch. */ +#define portEND_SWITCHING_ISR( xSwitchRequired )\ +{ \ +extern volatile uint32_t ulPortYieldRequired; \ + \ + if( xSwitchRequired != pdFALSE ) \ + { \ + ulPortYieldRequired = pdTRUE; \ + } \ +} + +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +#define portYIELD() __asm volatile ( "SWI 0 \n" \ + "ISB " ); + + +/*----------------------------------------------------------- + * Critical section control + *----------------------------------------------------------*/ + +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); +extern uint32_t ulPortSetInterruptMask( void ); +extern void vPortClearInterruptMask( uint32_t ulNewMaskValue ); +extern void vPortInstallFreeRTOSVectorTable( void ); + +/* The I bit within the CPSR. */ +#define portINTERRUPT_ENABLE_BIT ( 1 << 7 ) + +/* In the absence of a priority mask register, these functions and macros +globally enable and disable interrupts. */ +#define portENTER_CRITICAL() vPortEnterCritical(); +#define portEXIT_CRITICAL() vPortExitCritical(); +#define portENABLE_INTERRUPTS() __asm volatile ( "CPSIE i \n" ); +#define portDISABLE_INTERRUPTS() __asm volatile ( "CPSID i \n" \ + "DSB \n" \ + "ISB " ); +#pragma inline +static inline uint32_t portINLINE_SET_INTERRUPT_MASK_FROM_ISR( void ) +{ +volatile uint32_t ulCPSR; + + __asm volatile ( "MRS %0, CPSR" : "=r" (ulCPSR) ); + ulCPSR &= portINTERRUPT_ENABLE_BIT; + portDISABLE_INTERRUPTS(); + return ulCPSR; +} + +#define portSET_INTERRUPT_MASK_FROM_ISR() portINLINE_SET_INTERRUPT_MASK_FROM_ISR() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) if( x == 0 ) portENABLE_INTERRUPTS() + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are +not required for this port but included in case common demo code that uses these +macros is used. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +/* Prototype of the FreeRTOS tick handler. This must be installed as the +handler for whichever peripheral is used to generate the RTOS tick. */ +void FreeRTOS_Tick_Handler( void ); + +/* Any task that uses the floating point unit MUST call vPortTaskUsesFPU() +before any floating point instructions are executed. */ +void vPortTaskUsesFPU( void ); +#define portTASK_USES_FLOATING_POINT() vPortTaskUsesFPU() + +#define portLOWEST_INTERRUPT_PRIORITY ( ( ( uint32_t ) configUNIQUE_INTERRUPT_PRIORITIES ) - 1UL ) +#define portLOWEST_USABLE_INTERRUPT_PRIORITY ( portLOWEST_INTERRUPT_PRIORITY - 1UL ) + +/* Architecture specific optimisations. */ +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) __CLZ( uxReadyPriorities ) ) + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +#define portNOP() __asm volatile( "NOP" ) +#define portINLINE inline + +/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in +the source code because to do so would cause other compilers to generate +warnings. */ +#pragma diag_suppress=Pe191 +#pragma diag_suppress=Pa082 + +#ifdef __cplusplus + } /* extern C */ +#endif + + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ATMega323/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ATMega323/port.c new file mode 100644 index 0000000..37f0d52 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ATMega323/port.c @@ -0,0 +1,381 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#include + +#include "FreeRTOS.h" +#include "task.h" + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the AVR/IAR port. + *----------------------------------------------------------*/ + +/* Start tasks with interrupts enables. */ +#define portFLAGS_INT_ENABLED ( ( StackType_t ) 0x80 ) + +/* Hardware constants for timer 1. */ +#define portCLEAR_COUNTER_ON_MATCH ( ( uint8_t ) 0x08 ) +#define portPRESCALE_64 ( ( uint8_t ) 0x03 ) +#define portCLOCK_PRESCALER ( ( uint32_t ) 64 ) +#define portCOMPARE_MATCH_A_INTERRUPT_ENABLE ( ( uint8_t ) 0x10 ) + +/* The number of bytes used on the hardware stack by the task start address. */ +#define portBYTES_USED_BY_RETURN_ADDRESS ( 2 ) +/*-----------------------------------------------------------*/ + +/* Stores the critical section nesting. This must not be initialised to 0. +It will be initialised when a task starts. */ +#define portNO_CRITICAL_NESTING ( ( UBaseType_t ) 0 ) +UBaseType_t uxCriticalNesting = 0x50; + + +/* + * Perform hardware setup to enable ticks from timer 1, compare match A. + */ +static void prvSetupTimerInterrupt( void ); + +/* + * The IAR compiler does not have full support for inline assembler, so + * these are defined in the portmacro assembler file. + */ +extern void vPortYieldFromTick( void ); +extern void vPortStart( void ); + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +uint16_t usAddress; +StackType_t *pxTopOfHardwareStack; + + /* Place a few bytes of known values on the bottom of the stack. + This is just useful for debugging. */ + + *pxTopOfStack = 0x11; + pxTopOfStack--; + *pxTopOfStack = 0x22; + pxTopOfStack--; + *pxTopOfStack = 0x33; + pxTopOfStack--; + + /* Remember where the top of the hardware stack is - this is required + below. */ + pxTopOfHardwareStack = pxTopOfStack; + + + /* Simulate how the stack would look after a call to vPortYield(). */ + + /*lint -e950 -e611 -e923 Lint doesn't like this much - but nothing I can do about it. */ + + + + /* The IAR compiler requires two stacks per task. First there is the + hardware call stack which uses the AVR stack pointer. Second there is the + software stack (local variables, parameter passing, etc.) which uses the + AVR Y register. + + This function places both stacks within the memory block passed in as the + first parameter. The hardware stack is placed at the bottom of the memory + block. A gap is then left for the hardware stack to grow. Next the software + stack is placed. The amount of space between the software and hardware + stacks is defined by configCALL_STACK_SIZE. + + + + The first part of the stack is the hardware stack. Place the start + address of the task on the hardware stack. */ + usAddress = ( uint16_t ) pxCode; + *pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff ); + pxTopOfStack--; + + usAddress >>= 8; + *pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff ); + pxTopOfStack--; + + + /* Leave enough space for the hardware stack before starting the software + stack. The '- 2' is because we have already used two spaces for the + address of the start of the task. */ + pxTopOfStack -= ( configCALL_STACK_SIZE - 2 ); + + + + /* Next simulate the stack as if after a call to portSAVE_CONTEXT(). + portSAVE_CONTEXT places the flags on the stack immediately after r0 + to ensure the interrupts get disabled as soon as possible, and so ensuring + the stack use is minimal should a context switch interrupt occur. */ + *pxTopOfStack = ( StackType_t ) 0x00; /* R0 */ + pxTopOfStack--; + *pxTopOfStack = portFLAGS_INT_ENABLED; + pxTopOfStack--; + + /* Next place the address of the hardware stack. This is required so + the AVR stack pointer can be restored to point to the hardware stack. */ + pxTopOfHardwareStack -= portBYTES_USED_BY_RETURN_ADDRESS; + usAddress = ( uint16_t ) pxTopOfHardwareStack; + + /* SPL */ + *pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff ); + pxTopOfStack--; + + /* SPH */ + usAddress >>= 8; + *pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff ); + pxTopOfStack--; + + + + + /* Now the remaining registers. */ + *pxTopOfStack = ( StackType_t ) 0x01; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04; /* R4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05; /* R5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x13; /* R13 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x14; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x15; /* R15 */ + pxTopOfStack--; + + /* Place the parameter on the stack in the expected location. */ + usAddress = ( uint16_t ) pvParameters; + *pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff ); + pxTopOfStack--; + + usAddress >>= 8; + *pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff ); + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) 0x18; /* R18 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x19; /* R19 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x20; /* R20 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x21; /* R21 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x22; /* R22 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x23; /* R23 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x24; /* R24 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x25; /* R25 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x26; /* R26 X */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x27; /* R27 */ + pxTopOfStack--; + + /* The Y register is not stored as it is used as the software stack and + gets saved into the task control block. */ + + *pxTopOfStack = ( StackType_t ) 0x30; /* R30 Z */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x031; /* R31 */ + + pxTopOfStack--; + *pxTopOfStack = portNO_CRITICAL_NESTING; /* Critical nesting is zero when the task starts. */ + + /*lint +e950 +e611 +e923 */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* Setup the hardware to generate the tick. */ + prvSetupTimerInterrupt(); + + /* Restore the context of the first task that is going to run. + Normally we would just call portRESTORE_CONTEXT() here, but as the IAR + compiler does not fully support inline assembler we have to make a call.*/ + vPortStart(); + + /* Should not get here! */ + return pdTRUE; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the AVR port will get stopped. If required simply + disable the tick interrupt here. */ +} +/*-----------------------------------------------------------*/ + +/* + * Setup timer 1 compare match A to generate a tick interrupt. + */ +static void prvSetupTimerInterrupt( void ) +{ +uint32_t ulCompareMatch; +uint8_t ucHighByte, ucLowByte; + + /* Using 16bit timer 1 to generate the tick. Correct fuses must be + selected for the configCPU_CLOCK_HZ clock. */ + + ulCompareMatch = configCPU_CLOCK_HZ / configTICK_RATE_HZ; + + /* We only have 16 bits so have to scale to get our required tick rate. */ + ulCompareMatch /= portCLOCK_PRESCALER; + + /* Adjust for correct value. */ + ulCompareMatch -= ( uint32_t ) 1; + + /* Setup compare match value for compare match A. Interrupts are disabled + before this is called so we need not worry here. */ + ucLowByte = ( uint8_t ) ( ulCompareMatch & ( uint32_t ) 0xff ); + ulCompareMatch >>= 8; + ucHighByte = ( uint8_t ) ( ulCompareMatch & ( uint32_t ) 0xff ); + OCR1AH = ucHighByte; + OCR1AL = ucLowByte; + + /* Setup clock source and compare match behaviour. */ + ucLowByte = portCLEAR_COUNTER_ON_MATCH | portPRESCALE_64; + TCCR1B = ucLowByte; + + /* Enable the interrupt - this is okay as interrupt are currently globally + disabled. */ + TIMSK |= portCOMPARE_MATCH_A_INTERRUPT_ENABLE; +} +/*-----------------------------------------------------------*/ + +#if configUSE_PREEMPTION == 1 + + /* + * Tick ISR for preemptive scheduler. We can use a __task attribute as + * the context is saved at the start of vPortYieldFromTick(). The tick + * count is incremented after the context is saved. + */ + __task void SIG_OUTPUT_COMPARE1A( void ) + { + vPortYieldFromTick(); + asm( "reti" ); + } + +#else + + /* + * Tick ISR for the cooperative scheduler. All this does is increment the + * tick count. We don't need to switch context, this can only be done by + * manual calls to taskYIELD(); + * + * THE INTERRUPT VECTOR IS POPULATED IN portmacro.s90. DO NOT INSTALL + * IT HERE USING THE USUAL PRAGMA. + */ + __interrupt void SIG_OUTPUT_COMPARE1A( void ) + { + xTaskIncrementTick(); + } +#endif +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + uxCriticalNesting--; + if( uxCriticalNesting == portNO_CRITICAL_NESTING ) + { + portENABLE_INTERRUPTS(); + } +} + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ATMega323/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ATMega323/portmacro.h new file mode 100644 index 0000000..577b36f --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ATMega323/portmacro.h @@ -0,0 +1,154 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* +Changes from V1.2.3 + + + portCPU_CLOSK_HZ definition changed to 8MHz base 10, previously it + base 16. +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT int +#define portSTACK_TYPE uint8_t +#define portBASE_TYPE char +#define portPOINTER_SIZE_TYPE uint16_t + +typedef portSTACK_TYPE StackType_t; +typedef signed char BaseType_t; +typedef unsigned char UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif + +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() + +#define portDISABLE_INTERRUPTS() asm( "cli" ) +#define portENABLE_INTERRUPTS() asm( "sei" ) +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 1 +#define portNOP() asm( "nop" ) +/*-----------------------------------------------------------*/ + +/* Kernel utilities. */ +void vPortYield( void ); +#define portYIELD() vPortYield() + +#ifdef IAR_MEGA_AVR + #define outb( PORT, VALUE ) PORT = VALUE +#endif +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ATMega323/portmacro.s90 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ATMega323/portmacro.s90 new file mode 100644 index 0000000..53c2bf7 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/ATMega323/portmacro.s90 @@ -0,0 +1,272 @@ +;/* +; FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. +; All rights reserved +; +; +; *************************************************************************** +; * * +; * FreeRTOS tutorial books are available in pdf and paperback. * +; * Complete, revised, and edited pdf reference manuals are also * +; * available. * +; * * +; * Purchasing FreeRTOS documentation will not only help you, by * +; * ensuring you get running as quickly as possible and with an * +; * in-depth knowledge of how to use FreeRTOS, it will also help * +; * the FreeRTOS project to continue with its mission of providing * +; * professional grade, cross platform, de facto standard solutions * +; * for microcontrollers - completely free of charge! * +; * * +; * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * +; * * +; * Thank you for using FreeRTOS, and thank you for your support! * +; * * +; *************************************************************************** +; +; +; This file is part of the FreeRTOS distribution. +; +; FreeRTOS is free software; you can redistribute it and/or modify it under +; the terms of the GNU General Public License (version 2) as published by the +; Free Software Foundation AND MODIFIED BY the FreeRTOS exception. +; >>>NOTE<<< The modification to the GPL is included to allow you to +; distribute a combined work that includes FreeRTOS without being obliged to +; provide the source code for proprietary components outside of the FreeRTOS +; kernel. FreeRTOS is distributed in the hope that it will be useful, but +; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +; more details. You should have received a copy of the GNU General Public +; License and the FreeRTOS license exception along with FreeRTOS; if not it +; can be viewed here: http://www.freertos.org/a00114.html and also obtained +; by writing to Richard Barry, contact details for whom are available on the +; FreeRTOS WEB site. +; +; 1 tab == 4 spaces! +; +; http://www.FreeRTOS.org - Documentation, latest information, license and +; contact details. +; +; http://www.SafeRTOS.com - A version that is certified for use in safety +; critical systems. +; +; http://www.OpenRTOS.com - Commercial support, development, porting, +; licensing and training services. +;*/ + +#include + +; Declare all extern symbols here - including any ISRs that are referenced in +; the vector table. + +; ISR functions +; ------------- +EXTERN SIG_OUTPUT_COMPARE1A +EXTERN SIG_UART_RECV +EXTERN SIG_UART_DATA + + +; Functions used by scheduler +; --------------------------- +EXTERN vTaskSwitchContext +EXTERN pxCurrentTCB +EXTERN xTaskIncrementTick +EXTERN uxCriticalNesting + +; Functions implemented in this file +; ---------------------------------- +PUBLIC vPortYield +PUBLIC vPortYieldFromTick +PUBLIC vPortStart + + +; Interrupt vector table. +; ----------------------- +; +; For simplicity the RTOS tick interrupt routine uses the __task keyword. +; As the IAR compiler does not permit a function to be declared using both +; __task and __interrupt, the use of __task necessitates that the interrupt +; vector table be setup manually. +; +; To write an ISR, implement the ISR function using the __interrupt keyword +; but do not install the interrupt using the "#pragma vector=ABC" method. +; Instead manually place the name of the ISR in the vector table using an +; ORG and jmp instruction as demonstrated below. +; You will also have to add an EXTERN statement at the top of the file. + + ASEG + + + ORG TIMER1_COMPA_vect ; Vector address + jmp SIG_OUTPUT_COMPARE1A ; ISR + + ORG USART_RXC_vect ; Vector address + jmp SIG_UART_RECV ; ISR + + ORG USART_UDRE_vect ; Vector address + jmp SIG_UART_DATA ; ISR + + + RSEG CODE + + + +; Saving and Restoring a Task Context and Task Switching +; ------------------------------------------------------ +; +; The IAR compiler does not fully support inline assembler, so saving and +; restoring a task context has to be written in an asm file. +; +; vPortYield() and vPortYieldFromTick() are usually written in C. Doing +; so in this case would required calls to be made to portSAVE_CONTEXT() and +; portRESTORE_CONTEXT(). This is dis-advantageous as the context switch +; function would require two extra jump and return instructions over the +; WinAVR equivalent. +; +; To avoid this I have opted to implement both vPortYield() and +; vPortYieldFromTick() in this assembly file. For convenience +; portSAVE_CONTEXT and portRESTORE_CONTEXT are implemented as macros. + +portSAVE_CONTEXT MACRO + st -y, r0 ; First save the r0 register - we need to use this. + in r0, SREG ; Obtain the SREG value so we can disable interrupts... + cli ; ... as soon as possible. + st -y, r0 ; Store the SREG as it was before we disabled interrupts. + + in r0, SPL ; Next store the hardware stack pointer. The IAR... + st -y, r0 ; ... compiler uses the hardware stack as a call stack ... + in r0, SPH ; ... only. + st -y, r0 + + st -y, r1 ; Now store the rest of the registers. Dont store the ... + st -y, r2 ; ... the Y register here as it is used as the software + st -y, r3 ; stack pointer and will get saved into the TCB. + st -y, r4 + st -y, r5 + st -y, r6 + st -y, r7 + st -y, r8 + st -y, r9 + st -y, r10 + st -y, r11 + st -y, r12 + st -y, r13 + st -y, r14 + st -y, r15 + st -y, r16 + st -y, r17 + st -y, r18 + st -y, r19 + st -y, r20 + st -y, r21 + st -y, r22 + st -y, r23 + st -y, r24 + st -y, r25 + st -y, r26 + st -y, r27 + st -y, r30 + st -y, r31 + lds r0, uxCriticalNesting + st -y, r0 ; Store the critical nesting counter. + + lds r26, pxCurrentTCB ; Finally save the software stack pointer (Y ... + lds r27, pxCurrentTCB + 1 ; ... register) into the TCB. + st x+, r28 + st x+, r29 + + ENDM + + +portRESTORE_CONTEXT MACRO + lds r26, pxCurrentTCB + lds r27, pxCurrentTCB + 1 ; Restore the software stack pointer from ... + ld r28, x+ ; the TCB into the software stack pointer (... + ld r29, x+ ; ... the Y register). + + ld r0, y+ + sts uxCriticalNesting, r0 + ld r31, y+ ; Restore the registers down to R0. The Y + ld r30, y+ ; register is missing from this list as it + ld r27, y+ ; has already been restored. + ld r26, y+ + ld r25, y+ + ld r24, y+ + ld r23, y+ + ld r22, y+ + ld r21, y+ + ld r20, y+ + ld r19, y+ + ld r18, y+ + ld r17, y+ + ld r16, y+ + ld r15, y+ + ld r14, y+ + ld r13, y+ + ld r12, y+ + ld r11, y+ + ld r10, y+ + ld r9, y+ + ld r8, y+ + ld r7, y+ + ld r6, y+ + ld r5, y+ + ld r4, y+ + ld r3, y+ + ld r2, y+ + ld r1, y+ + + ld r0, y+ ; The next thing on the stack is the ... + out SPH, r0 ; ... hardware stack pointer. + ld r0, y+ + out SPL, r0 + + ld r0, y+ ; Next there is the SREG register. + out SREG, r0 + + ld r0, y+ ; Finally we have finished with r0, so restore r0. + + ENDM + + + +; vPortYield() and vPortYieldFromTick() +; ------------------------------------- +; +; Manual and preemptive context switch functions respectively. +; The IAR compiler does not fully support inline assembler, +; so these are implemented here rather than the more usually +; place of within port.c. + +vPortYield: + portSAVE_CONTEXT ; Save the context of the current task. + call vTaskSwitchContext ; Call the scheduler. + portRESTORE_CONTEXT ; Restore the context of whichever task the ... + ret ; ... scheduler decided should run. + +vPortYieldFromTick: + portSAVE_CONTEXT ; Save the context of the current task. + call xTaskIncrementTick ; Call the timer tick function. + tst r16 + breq SkipTaskSwitch + call vTaskSwitchContext ; Call the scheduler. +SkipTaskSwitch: + portRESTORE_CONTEXT ; Restore the context of whichever task the ... + ret ; ... scheduler decided should run. + +; vPortStart() +; ------------ +; +; Again due to the lack of inline assembler, this is required +; to get access to the portRESTORE_CONTEXT macro. + +vPortStart: + portRESTORE_CONTEXT + ret + + +; Just a filler for unused interrupt vectors. +vNoISR: + reti + + + END + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AVR32_UC3/exception.s82 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AVR32_UC3/exception.s82 new file mode 100644 index 0000000..2df712c --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AVR32_UC3/exception.s82 @@ -0,0 +1,310 @@ +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief Exception and interrupt vectors. + * + * This file maps all events supported by an AVR32UC. + * + * - Compiler: IAR EWAVR32 + * - Supported devices: All AVR32UC devices with an INTC module can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2007, Atmel Corporation All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of ATMEL may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND + * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +#include +#include "intc.h" + + +//! @{ +//! \verbatim + + +// Start of Exception Vector Table. + + // EVBA must be aligned with a power of two strictly greater than the EVBA- + // relative offset of the last vector. + COMMON EVTAB:CODE:ROOT(9) + + + // Force EVBA initialization. + EXTERN ??init_EVBA + REQUIRE ??init_EVBA + + // Export symbol. + PUBLIC ??EVBA + PUBLIC _evba +??EVBA: +_evba: + + ORG 0x000 + // Unrecoverable Exception. +_handle_Unrecoverable_Exception: + rjmp $ + + ORG 0x004 + // TLB Multiple Hit: UNUSED IN AVR32UC. +_handle_TLB_Multiple_Hit: + rjmp $ + + ORG 0x008 + // Bus Error Data Fetch. +_handle_Bus_Error_Data_Fetch: + rjmp $ + + ORG 0x00C + // Bus Error Instruction Fetch. +_handle_Bus_Error_Instruction_Fetch: + rjmp $ + + ORG 0x010 + // NMI. +_handle_NMI: + rjmp $ + + ORG 0x014 + // Instruction Address. +_handle_Instruction_Address: + rjmp $ + + ORG 0x018 + // ITLB Protection. +_handle_ITLB_Protection: + rjmp $ + + ORG 0x01C + // Breakpoint. +_handle_Breakpoint: + rjmp $ + + ORG 0x020 + // Illegal Opcode. +_handle_Illegal_Opcode: + rjmp $ + + ORG 0x024 + // Unimplemented Instruction. +_handle_Unimplemented_Instruction: + rjmp $ + + ORG 0x028 + // Privilege Violation. +_handle_Privilege_Violation: + rjmp $ + + ORG 0x02C + // Floating-Point: UNUSED IN AVR32UC. +_handle_Floating_Point: + rjmp $ + + ORG 0x030 + // Coprocessor Absent: UNUSED IN AVR32UC. +_handle_Coprocessor_Absent: + rjmp $ + + ORG 0x034 + // Data Address (Read). +_handle_Data_Address_Read: + rjmp $ + + ORG 0x038 + // Data Address (Write). +_handle_Data_Address_Write: + rjmp $ + + ORG 0x03C + // DTLB Protection (Read). +_handle_DTLB_Protection_Read: + rjmp $ + + ORG 0x040 + // DTLB Protection (Write). +_handle_DTLB_Protection_Write: + rjmp $ + + ORG 0x044 + // DTLB Modified: UNUSED IN AVR32UC. +_handle_DTLB_Modified: + rjmp $ + + ORG 0x050 + // ITLB Miss: UNUSED IN AVR32UC. +_handle_ITLB_Miss: + rjmp $ + + ORG 0x060 + // DTLB Miss (Read): UNUSED IN AVR32UC. +_handle_DTLB_Miss_Read: + rjmp $ + + ORG 0x070 + // DTLB Miss (Write): UNUSED IN AVR32UC. +_handle_DTLB_Miss_Write: + rjmp $ + + ORG 0x100 + // Supervisor Call. +_handle_Supervisor_Call: + lddpc pc, __SCALLYield + + +// Interrupt support. +// The interrupt controller must provide the offset address relative to EVBA. +// Important note: +// All interrupts call a C function named _get_interrupt_handler. +// This function will read group and interrupt line number to then return in +// R12 a pointer to a user-provided interrupt handler. + + ALIGN 2 + +_int0: + // R8-R12, LR, PC and SR are automatically pushed onto the system stack by the + // CPU upon interrupt entry. +#if 1 // B1832: interrupt stack changed to exception stack if exception is detected. + mfsr r12, AVR32_SR + bfextu r12, r12, AVR32_SR_M0_OFFSET, AVR32_SR_M0_SIZE + AVR32_SR_M1_SIZE + AVR32_SR_M2_SIZE + cp.w r12, 110b + brlo _int0_normal + lddsp r12, sp[0 * 4] + stdsp sp[6 * 4], r12 + lddsp r12, sp[1 * 4] + stdsp sp[7 * 4], r12 + lddsp r12, sp[3 * 4] + sub sp, -6 * 4 + rete +_int0_normal: +#endif + mov r12, 0 // Pass the int_lev parameter to the _get_interrupt_handler function. + mcall __get_interrupt_handler + cp.w r12, 0 // Get the pointer to the interrupt handler returned by the function. + movne pc, r12 // If this was not a spurious interrupt (R12 != NULL), jump to the handler. + rete // If this was a spurious interrupt (R12 == NULL), return from event handler. + +_int1: + // R8-R12, LR, PC and SR are automatically pushed onto the system stack by the + // CPU upon interrupt entry. +#if 1 // B1832: interrupt stack changed to exception stack if exception is detected. + mfsr r12, AVR32_SR + bfextu r12, r12, AVR32_SR_M0_OFFSET, AVR32_SR_M0_SIZE + AVR32_SR_M1_SIZE + AVR32_SR_M2_SIZE + cp.w r12, 110b + brlo _int1_normal + lddsp r12, sp[0 * 4] + stdsp sp[6 * 4], r12 + lddsp r12, sp[1 * 4] + stdsp sp[7 * 4], r12 + lddsp r12, sp[3 * 4] + sub sp, -6 * 4 + rete +_int1_normal: +#endif + mov r12, 1 // Pass the int_lev parameter to the _get_interrupt_handler function. + mcall __get_interrupt_handler + cp.w r12, 0 // Get the pointer to the interrupt handler returned by the function. + movne pc, r12 // If this was not a spurious interrupt (R12 != NULL), jump to the handler. + rete // If this was a spurious interrupt (R12 == NULL), return from event handler. + +_int2: + // R8-R12, LR, PC and SR are automatically pushed onto the system stack by the + // CPU upon interrupt entry. +#if 1 // B1832: interrupt stack changed to exception stack if exception is detected. + mfsr r12, AVR32_SR + bfextu r12, r12, AVR32_SR_M0_OFFSET, AVR32_SR_M0_SIZE + AVR32_SR_M1_SIZE + AVR32_SR_M2_SIZE + cp.w r12, 110b + brlo _int2_normal + lddsp r12, sp[0 * 4] + stdsp sp[6 * 4], r12 + lddsp r12, sp[1 * 4] + stdsp sp[7 * 4], r12 + lddsp r12, sp[3 * 4] + sub sp, -6 * 4 + rete +_int2_normal: +#endif + mov r12, 2 // Pass the int_lev parameter to the _get_interrupt_handler function. + mcall __get_interrupt_handler + cp.w r12, 0 // Get the pointer to the interrupt handler returned by the function. + movne pc, r12 // If this was not a spurious interrupt (R12 != NULL), jump to the handler. + rete // If this was a spurious interrupt (R12 == NULL), return from event handler. + +_int3: + // R8-R12, LR, PC and SR are automatically pushed onto the system stack by the + // CPU upon interrupt entry. +#if 1 // B1832: interrupt stack changed to exception stack if exception is detected. + mfsr r12, AVR32_SR + bfextu r12, r12, AVR32_SR_M0_OFFSET, AVR32_SR_M0_SIZE + AVR32_SR_M1_SIZE + AVR32_SR_M2_SIZE + cp.w r12, 110b + brlo _int3_normal + lddsp r12, sp[0 * 4] + stdsp sp[6 * 4], r12 + lddsp r12, sp[1 * 4] + stdsp sp[7 * 4], r12 + lddsp r12, sp[3 * 4] + sub sp, -6 * 4 + rete +_int3_normal: +#endif + mov r12, 3 // Pass the int_lev parameter to the _get_interrupt_handler function. + mcall __get_interrupt_handler + cp.w r12, 0 // Get the pointer to the interrupt handler returned by the function. + movne pc, r12 // If this was not a spurious interrupt (R12 != NULL), jump to the handler. + rete // If this was a spurious interrupt (R12 == NULL), return from event handler. + + +// Constant data area. + + ALIGN 2 + + // Import symbols. + EXTERN SCALLYield + EXTERN _get_interrupt_handler +__SCALLYield: + DC32 SCALLYield +__get_interrupt_handler: + DC32 _get_interrupt_handler + + // Values to store in the interrupt priority registers for the various interrupt priority levels. + // The interrupt priority registers contain the interrupt priority level and + // the EVBA-relative interrupt vector offset. + PUBLIC ipr_val +ipr_val: + DC32 (INT0 << AVR32_INTC_IPR0_INTLEV_OFFSET) | (_int0 - _evba),\ + (INT1 << AVR32_INTC_IPR0_INTLEV_OFFSET) | (_int1 - _evba),\ + (INT2 << AVR32_INTC_IPR0_INTLEV_OFFSET) | (_int2 - _evba),\ + (INT3 << AVR32_INTC_IPR0_INTLEV_OFFSET) | (_int3 - _evba) + + + END + + +//! \endverbatim +//! @} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AVR32_UC3/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AVR32_UC3/port.c new file mode 100644 index 0000000..8cf5c4c --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AVR32_UC3/port.c @@ -0,0 +1,448 @@ +/*This file has been prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief FreeRTOS port source for AVR32 UC3. + * + * - Compiler: IAR EWAVR32 + * - Supported devices: All AVR32 devices can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + *****************************************************************************/ + +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* AVR32 UC3 includes. */ +#include +#include +#include "gpio.h" + +#if configDBG + #include "usart.h" +#endif + +#if( configTICK_USE_TC==1 ) + #include "tc.h" +#endif + + +/* Constants required to setup the task context. */ +#define portINITIAL_SR ( ( StackType_t ) 0x00400000 ) /* AVR32 : [M2:M0]=001 I1M=0 I0M=0, GM=0 */ +#define portINSTRUCTION_SIZE ( ( StackType_t ) 0 ) + +/* Each task maintains its own critical nesting variable. */ +#define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) +volatile uint32_t ulCriticalNesting = 9999UL; + +#if( configTICK_USE_TC==0 ) + static void prvScheduleNextTick( void ); +#else + static void prvClearTcInt( void ); +#endif + +/* Setup the timer to generate the tick interrupts. */ +static void prvSetupTimerInterrupt( void ); + +/*-----------------------------------------------------------*/ + +/* + * Low-level initialization routine called during startup, before the main + * function. + */ +int __low_level_init(void) +{ + #if configHEAP_INIT + #pragma segment = "HEAP" + BaseType_t *pxMem; + #endif + + /* Enable exceptions. */ + ENABLE_ALL_EXCEPTIONS(); + + /* Initialize interrupt handling. */ + INTC_init_interrupts(); + + #if configHEAP_INIT + { + /* Initialize the heap used by malloc. */ + for( pxMem = __segment_begin( "HEAP" ); pxMem < ( BaseType_t * ) __segment_end( "HEAP" ); ) + { + *pxMem++ = 0xA5A5A5A5; + } + } + #endif + + /* Code section present if and only if the debug trace is activated. */ + #if configDBG + { + static const gpio_map_t DBG_USART_GPIO_MAP = + { + { configDBG_USART_RX_PIN, configDBG_USART_RX_FUNCTION }, + { configDBG_USART_TX_PIN, configDBG_USART_TX_FUNCTION } + }; + + static const usart_options_t DBG_USART_OPTIONS = + { + .baudrate = configDBG_USART_BAUDRATE, + .charlength = 8, + .paritytype = USART_NO_PARITY, + .stopbits = USART_1_STOPBIT, + .channelmode = USART_NORMAL_CHMODE + }; + + /* Initialize the USART used for the debug trace with the configured parameters. */ + extern volatile avr32_usart_t *volatile stdio_usart_base; + stdio_usart_base = configDBG_USART; + gpio_enable_module( DBG_USART_GPIO_MAP, + sizeof( DBG_USART_GPIO_MAP ) / sizeof( DBG_USART_GPIO_MAP[0] ) ); + usart_init_rs232(configDBG_USART, &DBG_USART_OPTIONS, configCPU_CLOCK_HZ); + } + #endif + + /* Request initialization of data segments. */ + return 1; +} +/*-----------------------------------------------------------*/ + +/* Added as there is no such function in FreeRTOS. */ +void *pvPortRealloc( void *pv, size_t xWantedSize ) +{ +void *pvReturn; + + vTaskSuspendAll(); + { + pvReturn = realloc( pv, xWantedSize ); + } + xTaskResumeAll(); + + return pvReturn; +} +/*-----------------------------------------------------------*/ + +/* The cooperative scheduler requires a normal IRQ service routine to +simply increment the system tick. */ +/* The preemptive scheduler is defined as "naked" as the full context is saved +on entry as part of the context switch. */ +#pragma shadow_registers = full // Naked. +static void vTick( void ) +{ + /* Save the context of the interrupted task. */ + portSAVE_CONTEXT_OS_INT(); + + #if( configTICK_USE_TC==1 ) + /* Clear the interrupt flag. */ + prvClearTcInt(); + #else + /* Schedule the COUNT&COMPARE match interrupt in (configCPU_CLOCK_HZ/configTICK_RATE_HZ) + clock cycles from now. */ + prvScheduleNextTick(); + #endif + + /* Because FreeRTOS is not supposed to run with nested interrupts, put all OS + calls in a critical section . */ + portENTER_CRITICAL(); + xTaskIncrementTick(); + portEXIT_CRITICAL(); + + /* Restore the context of the "elected task". */ + portRESTORE_CONTEXT_OS_INT(); +} +/*-----------------------------------------------------------*/ + +#pragma shadow_registers = full // Naked. +void SCALLYield( void ) +{ + /* Save the context of the interrupted task. */ + portSAVE_CONTEXT_SCALL(); + vTaskSwitchContext(); + portRESTORE_CONTEXT_SCALL(); +} +/*-----------------------------------------------------------*/ + +/* The code generated by the GCC compiler uses the stack in different ways at +different optimisation levels. The interrupt flags can therefore not always +be saved to the stack. Instead the critical section nesting level is stored +in a variable, which is then saved as part of the stack context. */ +#pragma optimize = no_inline +void vPortEnterCritical( void ) +{ + /* Disable interrupts */ + portDISABLE_INTERRUPTS(); + + /* Now interrupts are disabled ulCriticalNesting can be accessed + directly. Increment ulCriticalNesting to keep a count of how many times + portENTER_CRITICAL() has been called. */ + ulCriticalNesting++; +} +/*-----------------------------------------------------------*/ + +#pragma optimize = no_inline +void vPortExitCritical( void ) +{ + if(ulCriticalNesting > portNO_CRITICAL_NESTING) + { + ulCriticalNesting--; + if( ulCriticalNesting == portNO_CRITICAL_NESTING ) + { + /* Enable all interrupt/exception. */ + portENABLE_INTERRUPTS(); + } + } +} +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been called. + * + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. */ + + /* When the task starts, it will expect to find the function parameter in R12. */ + pxTopOfStack--; + *pxTopOfStack-- = ( StackType_t ) 0x08080808; /* R8 */ + *pxTopOfStack-- = ( StackType_t ) 0x09090909; /* R9 */ + *pxTopOfStack-- = ( StackType_t ) 0x0A0A0A0A; /* R10 */ + *pxTopOfStack-- = ( StackType_t ) 0x0B0B0B0B; /* R11 */ + *pxTopOfStack-- = ( StackType_t ) pvParameters; /* R12 */ + *pxTopOfStack-- = ( StackType_t ) 0xDEADBEEF; /* R14/LR */ + *pxTopOfStack-- = ( StackType_t ) pxCode + portINSTRUCTION_SIZE; /* R15/PC */ + *pxTopOfStack-- = ( StackType_t ) portINITIAL_SR; /* SR */ + *pxTopOfStack-- = ( StackType_t ) 0xFF0000FF; /* R0 */ + *pxTopOfStack-- = ( StackType_t ) 0x01010101; /* R1 */ + *pxTopOfStack-- = ( StackType_t ) 0x02020202; /* R2 */ + *pxTopOfStack-- = ( StackType_t ) 0x03030303; /* R3 */ + *pxTopOfStack-- = ( StackType_t ) 0x04040404; /* R4 */ + *pxTopOfStack-- = ( StackType_t ) 0x05050505; /* R5 */ + *pxTopOfStack-- = ( StackType_t ) 0x06060606; /* R6 */ + *pxTopOfStack-- = ( StackType_t ) 0x07070707; /* R7 */ + *pxTopOfStack = ( StackType_t ) portNO_CRITICAL_NESTING; /* ulCriticalNesting */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + prvSetupTimerInterrupt(); + + /* Start the first task. */ + portRESTORE_CONTEXT(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the AVR32 port will require this function as there + is nothing to return to. */ +} +/*-----------------------------------------------------------*/ + +/* Schedule the COUNT&COMPARE match interrupt in (configCPU_CLOCK_HZ/configTICK_RATE_HZ) +clock cycles from now. */ +#if( configTICK_USE_TC==0 ) + static void prvScheduleFirstTick(void) + { + uint32_t lCycles; + + lCycles = Get_system_register(AVR32_COUNT); + lCycles += (configCPU_CLOCK_HZ/configTICK_RATE_HZ); + // If lCycles ends up to be 0, make it 1 so that the COMPARE and exception + // generation feature does not get disabled. + if(0 == lCycles) + { + lCycles++; + } + Set_system_register(AVR32_COMPARE, lCycles); + } + + #pragma optimize = no_inline + static void prvScheduleNextTick(void) + { + uint32_t lCycles, lCount; + + lCycles = Get_system_register(AVR32_COMPARE); + lCycles += (configCPU_CLOCK_HZ/configTICK_RATE_HZ); + // If lCycles ends up to be 0, make it 1 so that the COMPARE and exception + // generation feature does not get disabled. + if(0 == lCycles) + { + lCycles++; + } + lCount = Get_system_register(AVR32_COUNT); + if( lCycles < lCount ) + { // We missed a tick, recover for the next. + lCycles += (configCPU_CLOCK_HZ/configTICK_RATE_HZ); + } + Set_system_register(AVR32_COMPARE, lCycles); + } +#else + #pragma optimize = no_inline + static void prvClearTcInt(void) + { + AVR32_TC.channel[configTICK_TC_CHANNEL].sr; + } +#endif +/*-----------------------------------------------------------*/ + +/* Setup the timer to generate the tick interrupts. */ +static void prvSetupTimerInterrupt(void) +{ + #if( configTICK_USE_TC==1 ) + + volatile avr32_tc_t *tc = &AVR32_TC; + + // Options for waveform genration. + tc_waveform_opt_t waveform_opt = + { + .channel = configTICK_TC_CHANNEL, /* Channel selection. */ + + .bswtrg = TC_EVT_EFFECT_NOOP, /* Software trigger effect on TIOB. */ + .beevt = TC_EVT_EFFECT_NOOP, /* External event effect on TIOB. */ + .bcpc = TC_EVT_EFFECT_NOOP, /* RC compare effect on TIOB. */ + .bcpb = TC_EVT_EFFECT_NOOP, /* RB compare effect on TIOB. */ + + .aswtrg = TC_EVT_EFFECT_NOOP, /* Software trigger effect on TIOA. */ + .aeevt = TC_EVT_EFFECT_NOOP, /* External event effect on TIOA. */ + .acpc = TC_EVT_EFFECT_NOOP, /* RC compare effect on TIOA: toggle. */ + .acpa = TC_EVT_EFFECT_NOOP, /* RA compare effect on TIOA: toggle (other possibilities are none, set and clear). */ + + .wavsel = TC_WAVEFORM_SEL_UP_MODE_RC_TRIGGER,/* Waveform selection: Up mode without automatic trigger on RC compare. */ + .enetrg = FALSE, /* External event trigger enable. */ + .eevt = 0, /* External event selection. */ + .eevtedg = TC_SEL_NO_EDGE, /* External event edge selection. */ + .cpcdis = FALSE, /* Counter disable when RC compare. */ + .cpcstop = FALSE, /* Counter clock stopped with RC compare. */ + + .burst = FALSE, /* Burst signal selection. */ + .clki = FALSE, /* Clock inversion. */ + .tcclks = TC_CLOCK_SOURCE_TC2 /* Internal source clock 2. */ + }; + + tc_interrupt_t tc_interrupt = + { + .etrgs=0, + .ldrbs=0, + .ldras=0, + .cpcs =1, + .cpbs =0, + .cpas =0, + .lovrs=0, + .covfs=0, + }; + + #endif + + /* Disable all interrupt/exception. */ + portDISABLE_INTERRUPTS(); + + /* Register the compare interrupt handler to the interrupt controller and + enable the compare interrupt. */ + + #if( configTICK_USE_TC==1 ) + { + INTC_register_interrupt((__int_handler)&vTick, configTICK_TC_IRQ, INT0); + + /* Initialize the timer/counter. */ + tc_init_waveform(tc, &waveform_opt); + + /* Set the compare triggers. + Remember TC counter is 16-bits, so counting second is not possible! + That's why we configure it to count ms. */ + tc_write_rc( tc, configTICK_TC_CHANNEL, ( configPBA_CLOCK_HZ / 4) / configTICK_RATE_HZ ); + + tc_configure_interrupts( tc, configTICK_TC_CHANNEL, &tc_interrupt ); + + /* Start the timer/counter. */ + tc_start(tc, configTICK_TC_CHANNEL); + } + #else + { + INTC_register_interrupt((__int_handler)&vTick, AVR32_CORE_COMPARE_IRQ, INT0); + prvScheduleFirstTick(); + } + #endif +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AVR32_UC3/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AVR32_UC3/portmacro.h new file mode 100644 index 0000000..1aaad55 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AVR32_UC3/portmacro.h @@ -0,0 +1,696 @@ +/*This file has been prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief FreeRTOS port header for AVR32 UC3. + * + * - Compiler: IAR EWAVR32 + * - Supported devices: All AVR32 devices can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + *****************************************************************************/ + +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ +#include +#include "intc.h" +#include "compiler.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + + +#define TASK_DELAY_MS(x) ( (x) /portTICK_PERIOD_MS ) +#define TASK_DELAY_S(x) ( (x)*1000 /portTICK_PERIOD_MS ) +#define TASK_DELAY_MIN(x) ( (x)*60*1000/portTICK_PERIOD_MS ) + +#define configTICK_TC_IRQ ATPASTE2(AVR32_TC_IRQ, configTICK_TC_CHANNEL) + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 4 +#define portNOP() {__asm__ __volatile__ ("nop");} +/*-----------------------------------------------------------*/ + + +/*-----------------------------------------------------------*/ + +/* INTC-specific. */ +#define DISABLE_ALL_EXCEPTIONS() Disable_global_exception() +#define ENABLE_ALL_EXCEPTIONS() Enable_global_exception() + +#define DISABLE_ALL_INTERRUPTS() Disable_global_interrupt() +#define ENABLE_ALL_INTERRUPTS() Enable_global_interrupt() + +#define DISABLE_INT_LEVEL(int_lev) Disable_interrupt_level(int_lev) +#define ENABLE_INT_LEVEL(int_lev) Enable_interrupt_level(int_lev) + + +/* + * Debug trace. + * Activated if and only if configDBG is nonzero. + * Prints a formatted string to stdout. + * The current source file name and line number are output with a colon before + * the formatted string. + * A carriage return and a linefeed are appended to the output. + * stdout is redirected to the USART configured by configDBG_USART. + * The parameters are the same as for the standard printf function. + * There is no return value. + * SHALL NOT BE CALLED FROM WITHIN AN INTERRUPT as fputs and printf use malloc, + * which is interrupt-unsafe with the current __malloc_lock and __malloc_unlock. + */ +#if configDBG + #define portDBG_TRACE(...) \ + { \ + fputs(__FILE__ ":" ASTRINGZ(__LINE__) ": ", stdout); \ + printf(__VA_ARGS__); \ + fputs("\r\n", stdout); \ + } +#else + #define portDBG_TRACE(...) +#endif + + +/* Critical section management. */ +#define portDISABLE_INTERRUPTS() DISABLE_ALL_INTERRUPTS() +#define portENABLE_INTERRUPTS() ENABLE_ALL_INTERRUPTS() + + +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); + +#define portENTER_CRITICAL() vPortEnterCritical(); +#define portEXIT_CRITICAL() vPortExitCritical(); + + +/* Added as there is no such function in FreeRTOS. */ +extern void *pvPortRealloc( void *pv, size_t xSize ); +/*-----------------------------------------------------------*/ + + +/*=============================================================================================*/ + +/* + * Restore Context for cases other than INTi. + */ +#define portRESTORE_CONTEXT() \ +{ \ + extern volatile uint32_t ulCriticalNesting; \ + extern volatile void *volatile pxCurrentTCB; \ + \ + __asm__ __volatile__ ( \ + /* Set SP to point to new stack */ \ + "mov r8, LWRD("ASTRINGZ(pxCurrentTCB)") \n\t"\ + "orh r8, HWRD("ASTRINGZ(pxCurrentTCB)") \n\t"\ + "ld.w r0, r8[0] \n\t"\ + "ld.w sp, r0[0] \n\t"\ + \ + /* Restore ulCriticalNesting variable */ \ + "ld.w r0, sp++ \n\t"\ + "mov r8, LWRD("ASTRINGZ(ulCriticalNesting)") \n\t"\ + "orh r8, HWRD("ASTRINGZ(ulCriticalNesting)") \n\t"\ + "st.w r8[0], r0 \n\t"\ + \ + /* Restore R0..R7 */ \ + "ldm sp++, r0-r7 \n\t"\ + /* R0-R7 should not be used below this line */ \ + /* Skip PC and SR (will do it at the end) */ \ + "sub sp, -2*4 \n\t"\ + /* Restore R8..R12 and LR */ \ + "ldm sp++, r8-r12, lr \n\t"\ + /* Restore SR */ \ + "ld.w r0, sp[-8*4] \n\t" /* R0 is modified, is restored later. */\ + "mtsr "ASTRINGZ(AVR32_SR)", r0 \n\t"\ + /* Restore r0 */ \ + "ld.w r0, sp[-9*4] \n\t"\ + /* Restore PC */ \ + "ld.w pc, sp[-7*4]" /* Get PC from stack - PC is the 7th register saved */ \ + ); \ + \ + /* Force import of global symbols from assembly */ \ + ulCriticalNesting; \ + pxCurrentTCB; \ +} + + +/* + * portSAVE_CONTEXT_INT() and portRESTORE_CONTEXT_INT(): for INT0..3 exceptions. + * portSAVE_CONTEXT_SCALL() and portRESTORE_CONTEXT_SCALL(): for the scall exception. + * + * Had to make different versions because registers saved on the system stack + * are not the same between INT0..3 exceptions and the scall exception. + */ + +// Task context stack layout: + // R8 (*) + // R9 (*) + // R10 (*) + // R11 (*) + // R12 (*) + // R14/LR (*) + // R15/PC (*) + // SR (*) + // R0 + // R1 + // R2 + // R3 + // R4 + // R5 + // R6 + // R7 + // ulCriticalNesting +// (*) automatically done for INT0..INT3, but not for SCALL + +/* + * The ISR used for the scheduler tick depends on whether the cooperative or + * the preemptive scheduler is being used. + */ +#if configUSE_PREEMPTION == 0 + +/* + * portSAVE_CONTEXT_OS_INT() for OS Tick exception. + */ +#define portSAVE_CONTEXT_OS_INT() \ +{ \ + /* Save R0..R7 */ \ + __asm__ __volatile__ ("stm --sp, r0-r7"); \ + \ + /* With the cooperative scheduler, as there is no context switch by interrupt, */ \ + /* there is also no context save. */ \ +} + +/* + * portRESTORE_CONTEXT_OS_INT() for Tick exception. + */ +#define portRESTORE_CONTEXT_OS_INT() \ +{ \ + __asm__ __volatile__ ( \ + /* Restore R0..R7 */ \ + "ldm sp++, r0-r7 \n\t"\ + \ + /* With the cooperative scheduler, as there is no context switch by interrupt, */ \ + /* there is also no context restore. */ \ + "rete" \ + ); \ +} + +#else + +/* + * portSAVE_CONTEXT_OS_INT() for OS Tick exception. + */ +#define portSAVE_CONTEXT_OS_INT() \ +{ \ + extern volatile uint32_t ulCriticalNesting; \ + extern volatile void *volatile pxCurrentTCB; \ + \ + /* When we come here */ \ + /* Registers R8..R12, LR, PC and SR had already been pushed to system stack */ \ + \ + __asm__ __volatile__ ( \ + /* Save R0..R7 */ \ + "stm --sp, r0-r7 \n\t"\ + \ + /* Save ulCriticalNesting variable - R0 is overwritten */ \ + "mov r8, LWRD("ASTRINGZ(ulCriticalNesting)") \n\t"\ + "orh r8, HWRD("ASTRINGZ(ulCriticalNesting)") \n\t"\ + "ld.w r0, r8[0] \n\t"\ + "st.w --sp, r0 \n\t"\ + \ + /* Check if INT0 or higher were being handled (case where the OS tick interrupted another */ \ + /* interrupt handler (which was of a higher priority level but decided to lower its priority */ \ + /* level and allow other lower interrupt level to occur). */ \ + /* In this case we don't want to do a task switch because we don't know what the stack */ \ + /* currently looks like (we don't know what the interrupted interrupt handler was doing). */ \ + /* Saving SP in pxCurrentTCB and then later restoring it (thinking restoring the task) */ \ + /* will just be restoring the interrupt handler, no way!!! */ \ + /* So, since we won't do a vTaskSwitchContext(), it's of no use to save SP. */ \ + "ld.w r0, sp[9*4] \n\t" /* Read SR in stack */\ + "bfextu r0, r0, 22, 3 \n\t" /* Extract the mode bits to R0. */\ + "cp.w r0, 1 \n\t" /* Compare the mode bits with supervisor mode(b'001) */\ + "brhi LABEL_INT_SKIP_SAVE_CONTEXT_"ASTRINGZ(__LINE__)" \n\t"\ + \ + /* Store SP in the first member of the structure pointed to by pxCurrentTCB */ \ + /* NOTE: we don't enter a critical section here because all interrupt handlers */ \ + /* MUST perform a SAVE_CONTEXT/RESTORE_CONTEXT in the same way as */ \ + /* portSAVE_CONTEXT_OS_INT/port_RESTORE_CONTEXT_OS_INT if they call OS functions. */ \ + /* => all interrupt handlers must use portENTER_SWITCHING_ISR/portEXIT_SWITCHING_ISR. */ \ + "mov r8, LWRD("ASTRINGZ(pxCurrentTCB)") \n\t"\ + "orh r8, HWRD("ASTRINGZ(pxCurrentTCB)") \n\t"\ + "ld.w r0, r8[0] \n\t"\ + "st.w r0[0], sp \n"\ + \ + "LABEL_INT_SKIP_SAVE_CONTEXT_"ASTRINGZ(__LINE__)":" \ + ); \ +} + +/* + * portRESTORE_CONTEXT_OS_INT() for Tick exception. + */ +#define portRESTORE_CONTEXT_OS_INT() \ +{ \ + extern volatile uint32_t ulCriticalNesting; \ + extern volatile void *volatile pxCurrentTCB; \ + \ + /* Check if INT0 or higher were being handled (case where the OS tick interrupted another */ \ + /* interrupt handler (which was of a higher priority level but decided to lower its priority */ \ + /* level and allow other lower interrupt level to occur). */ \ + /* In this case we don't want to do a task switch because we don't know what the stack */ \ + /* currently looks like (we don't know what the interrupted interrupt handler was doing). */ \ + /* Saving SP in pxCurrentTCB and then later restoring it (thinking restoring the task) */ \ + /* will just be restoring the interrupt handler, no way!!! */ \ + __asm__ __volatile__ ( \ + "ld.w r0, sp[9*4] \n\t" /* Read SR in stack */\ + "bfextu r0, r0, 22, 3 \n\t" /* Extract the mode bits to R0. */\ + "cp.w r0, 1 \n\t" /* Compare the mode bits with supervisor mode(b'001) */\ + "brhi LABEL_INT_SKIP_RESTORE_CONTEXT_"ASTRINGZ(__LINE__) \ + ); \ + \ + /* Else */ \ + /* because it is here safe, always call vTaskSwitchContext() since an OS tick occurred. */ \ + /* A critical section has to be used here because vTaskSwitchContext handles FreeRTOS linked lists. */\ + portENTER_CRITICAL(); \ + vTaskSwitchContext(); \ + portEXIT_CRITICAL(); \ + \ + /* Restore all registers */ \ + \ + __asm__ __volatile__ ( \ + /* Set SP to point to new stack */ \ + "mov r8, LWRD("ASTRINGZ(pxCurrentTCB)") \n\t"\ + "orh r8, HWRD("ASTRINGZ(pxCurrentTCB)") \n\t"\ + "ld.w r0, r8[0] \n\t"\ + "ld.w sp, r0[0] \n"\ + \ + "LABEL_INT_SKIP_RESTORE_CONTEXT_"ASTRINGZ(__LINE__)": \n\t"\ + \ + /* Restore ulCriticalNesting variable */ \ + "ld.w r0, sp++ \n\t"\ + "mov r8, LWRD("ASTRINGZ(ulCriticalNesting)") \n\t"\ + "orh r8, HWRD("ASTRINGZ(ulCriticalNesting)") \n\t"\ + "st.w r8[0], r0 \n\t"\ + \ + /* Restore R0..R7 */ \ + "ldm sp++, r0-r7 \n\t"\ + \ + /* Now, the stack should be R8..R12, LR, PC and SR */ \ + "rete" \ + ); \ + \ + /* Force import of global symbols from assembly */ \ + ulCriticalNesting; \ + pxCurrentTCB; \ +} + +#endif + + +/* + * portSAVE_CONTEXT_SCALL() for SupervisorCALL exception. + * + * NOTE: taskYIELD()(== SCALL) MUST NOT be called in a mode > supervisor mode. + * + */ +#define portSAVE_CONTEXT_SCALL() \ +{ \ + extern volatile uint32_t ulCriticalNesting; \ + extern volatile void *volatile pxCurrentTCB; \ + \ + /* Warning: the stack layout after SCALL doesn't match the one after an interrupt. */ \ + /* If SR[M2:M0] == 001 */ \ + /* PC and SR are on the stack. */ \ + /* Else (other modes) */ \ + /* Nothing on the stack. */ \ + \ + /* WARNING NOTE: the else case cannot happen as it is strictly forbidden to call */ \ + /* vTaskDelay() and vTaskDelayUntil() OS functions (that result in a taskYield()) */ \ + /* in an interrupt|exception handler. */ \ + \ + __asm__ __volatile__ ( \ + /* in order to save R0-R7 */ \ + "sub sp, 6*4 \n\t"\ + /* Save R0..R7 */ \ + "stm --sp, r0-r7 \n\t"\ + \ + /* in order to save R8-R12 and LR */ \ + /* do not use SP if interrupts occurs, SP must be left at bottom of stack */ \ + "sub r7, sp,-16*4 \n\t"\ + /* Copy PC and SR in other places in the stack. */ \ + "ld.w r0, r7[-2*4] \n\t" /* Read SR */\ + "st.w r7[-8*4], r0 \n\t" /* Copy SR */\ + "ld.w r0, r7[-1*4] \n\t" /* Read PC */\ + "st.w r7[-7*4], r0 \n\t" /* Copy PC */\ + \ + /* Save R8..R12 and LR on the stack. */ \ + "stm --r7, r8-r12, lr \n\t"\ + \ + /* Arriving here we have the following stack organizations: */ \ + /* R8..R12, LR, PC, SR, R0..R7. */ \ + \ + /* Now we can finalize the save. */ \ + \ + /* Save ulCriticalNesting variable - R0 is overwritten */ \ + "mov r8, LWRD("ASTRINGZ(ulCriticalNesting)") \n\t"\ + "orh r8, HWRD("ASTRINGZ(ulCriticalNesting)") \n\t"\ + "ld.w r0, r8[0] \n\t"\ + "st.w --sp, r0" \ + ); \ + \ + /* Disable the its which may cause a context switch (i.e. cause a change of */ \ + /* pxCurrentTCB). */ \ + /* Basically, all accesses to the pxCurrentTCB structure should be put in a */ \ + /* critical section because it is a global structure. */ \ + portENTER_CRITICAL(); \ + \ + /* Store SP in the first member of the structure pointed to by pxCurrentTCB */ \ + __asm__ __volatile__ ( \ + "mov r8, LWRD("ASTRINGZ(pxCurrentTCB)") \n\t"\ + "orh r8, HWRD("ASTRINGZ(pxCurrentTCB)") \n\t"\ + "ld.w r0, r8[0] \n\t"\ + "st.w r0[0], sp" \ + ); \ +} + +/* + * portRESTORE_CONTEXT() for SupervisorCALL exception. + */ +#define portRESTORE_CONTEXT_SCALL() \ +{ \ + extern volatile uint32_t ulCriticalNesting; \ + extern volatile void *volatile pxCurrentTCB; \ + \ + /* Restore all registers */ \ + \ + /* Set SP to point to new stack */ \ + __asm__ __volatile__ ( \ + "mov r8, LWRD("ASTRINGZ(pxCurrentTCB)") \n\t"\ + "orh r8, HWRD("ASTRINGZ(pxCurrentTCB)") \n\t"\ + "ld.w r0, r8[0] \n\t"\ + "ld.w sp, r0[0]" \ + ); \ + \ + /* Leave pxCurrentTCB variable access critical section */ \ + portEXIT_CRITICAL(); \ + \ + __asm__ __volatile__ ( \ + /* Restore ulCriticalNesting variable */ \ + "ld.w r0, sp++ \n\t"\ + "mov r8, LWRD("ASTRINGZ(ulCriticalNesting)") \n\t"\ + "orh r8, HWRD("ASTRINGZ(ulCriticalNesting)") \n\t"\ + "st.w r8[0], r0 \n\t"\ + \ + /* skip PC and SR */ \ + /* do not use SP if interrupts occurs, SP must be left at bottom of stack */ \ + "sub r7, sp, -10*4 \n\t"\ + /* Restore r8-r12 and LR */ \ + "ldm r7++, r8-r12, lr \n\t"\ + \ + /* RETS will take care of the extra PC and SR restore. */ \ + /* So, we have to prepare the stack for this. */ \ + "ld.w r0, r7[-8*4] \n\t" /* Read SR */\ + "st.w r7[-2*4], r0 \n\t" /* Copy SR */\ + "ld.w r0, r7[-7*4] \n\t" /* Read PC */\ + "st.w r7[-1*4], r0 \n\t" /* Copy PC */\ + \ + /* Restore R0..R7 */ \ + "ldm sp++, r0-r7 \n\t"\ + \ + "sub sp, -6*4 \n\t"\ + \ + "rets" \ + ); \ + \ + /* Force import of global symbols from assembly */ \ + ulCriticalNesting; \ + pxCurrentTCB; \ +} + + +/* + * The ISR used depends on whether the cooperative or + * the preemptive scheduler is being used. + */ +#if configUSE_PREEMPTION == 0 + +/* + * ISR entry and exit macros. These are only required if a task switch + * is required from the ISR. + */ +#define portENTER_SWITCHING_ISR() \ +{ \ + /* Save R0..R7 */ \ + __asm__ __volatile__ ("stm --sp, r0-r7"); \ + \ + /* With the cooperative scheduler, as there is no context switch by interrupt, */ \ + /* there is also no context save. */ \ +} + +/* + * Input parameter: in R12, boolean. Perform a vTaskSwitchContext() if 1 + */ +#define portEXIT_SWITCHING_ISR() \ +{ \ + __asm__ __volatile__ ( \ + /* Restore R0..R7 */ \ + "ldm sp++, r0-r7 \n\t"\ + \ + /* With the cooperative scheduler, as there is no context switch by interrupt, */ \ + /* there is also no context restore. */ \ + "rete" \ + ); \ +} + +#else + +/* + * ISR entry and exit macros. These are only required if a task switch + * is required from the ISR. + */ +#define portENTER_SWITCHING_ISR() \ +{ \ + extern volatile uint32_t ulCriticalNesting; \ + extern volatile void *volatile pxCurrentTCB; \ + \ + /* When we come here */ \ + /* Registers R8..R12, LR, PC and SR had already been pushed to system stack */ \ + \ + __asm__ __volatile__ ( \ + /* Save R0..R7 */ \ + "stm --sp, r0-r7 \n\t"\ + \ + /* Save ulCriticalNesting variable - R0 is overwritten */ \ + "mov r8, LWRD("ASTRINGZ(ulCriticalNesting)") \n\t"\ + "orh r8, HWRD("ASTRINGZ(ulCriticalNesting)") \n\t"\ + "ld.w r0, r8[0] \n\t"\ + "st.w --sp, r0 \n\t"\ + \ + /* Check if INT0 or higher were being handled (case where the OS tick interrupted another */ \ + /* interrupt handler (which was of a higher priority level but decided to lower its priority */ \ + /* level and allow other lower interrupt level to occur). */ \ + /* In this case we don't want to do a task switch because we don't know what the stack */ \ + /* currently looks like (we don't know what the interrupted interrupt handler was doing). */ \ + /* Saving SP in pxCurrentTCB and then later restoring it (thinking restoring the task) */ \ + /* will just be restoring the interrupt handler, no way!!! */ \ + /* So, since we won't do a vTaskSwitchContext(), it's of no use to save SP. */ \ + "ld.w r0, sp[9*4] \n\t" /* Read SR in stack */\ + "bfextu r0, r0, 22, 3 \n\t" /* Extract the mode bits to R0. */\ + "cp.w r0, 1 \n\t" /* Compare the mode bits with supervisor mode(b'001) */\ + "brhi LABEL_ISR_SKIP_SAVE_CONTEXT_"ASTRINGZ(__LINE__)" \n\t"\ + \ + /* Store SP in the first member of the structure pointed to by pxCurrentTCB */ \ + "mov r8, LWRD("ASTRINGZ(pxCurrentTCB)") \n\t"\ + "orh r8, HWRD("ASTRINGZ(pxCurrentTCB)") \n\t"\ + "ld.w r0, r8[0] \n\t"\ + "st.w r0[0], sp \n"\ + \ + "LABEL_ISR_SKIP_SAVE_CONTEXT_"ASTRINGZ(__LINE__)":" \ + ); \ +} + + +/* + * Input parameter: in R12, boolean. Perform a vTaskSwitchContext() if 1 + */ +#define portEXIT_SWITCHING_ISR() \ +{ \ + extern volatile uint32_t ulCriticalNesting; \ + extern volatile void *volatile pxCurrentTCB; \ + \ + __asm__ __volatile__ ( \ + /* Check if INT0 or higher were being handled (case where the OS tick interrupted another */ \ + /* interrupt handler (which was of a higher priority level but decided to lower its priority */ \ + /* level and allow other lower interrupt level to occur). */ \ + /* In this case it's of no use to switch context and restore a new SP because we purposedly */ \ + /* did not previously save SP in its TCB. */ \ + "ld.w r0, sp[9*4] \n\t" /* Read SR in stack */\ + "bfextu r0, r0, 22, 3 \n\t" /* Extract the mode bits to R0. */\ + "cp.w r0, 1 \n\t" /* Compare the mode bits with supervisor mode(b'001) */\ + "brhi LABEL_ISR_SKIP_RESTORE_CONTEXT_"ASTRINGZ(__LINE__)" \n\t"\ + \ + /* If a switch is required then we just need to call */ \ + /* vTaskSwitchContext() as the context has already been */ \ + /* saved. */ \ + "cp.w r12, 1 \n\t" /* Check if Switch context is required. */\ + "brne LABEL_ISR_RESTORE_CONTEXT_"ASTRINGZ(__LINE__)":C" \ + ); \ + \ + /* A critical section has to be used here because vTaskSwitchContext handles FreeRTOS linked lists. */\ + portENTER_CRITICAL(); \ + vTaskSwitchContext(); \ + portEXIT_CRITICAL(); \ + \ + __asm__ __volatile__ ( \ + "LABEL_ISR_RESTORE_CONTEXT_"ASTRINGZ(__LINE__)": \n\t"\ + /* Restore the context of which ever task is now the highest */ \ + /* priority that is ready to run. */ \ + \ + /* Restore all registers */ \ + \ + /* Set SP to point to new stack */ \ + "mov r8, LWRD("ASTRINGZ(pxCurrentTCB)") \n\t"\ + "orh r8, HWRD("ASTRINGZ(pxCurrentTCB)") \n\t"\ + "ld.w r0, r8[0] \n\t"\ + "ld.w sp, r0[0] \n"\ + \ + "LABEL_ISR_SKIP_RESTORE_CONTEXT_"ASTRINGZ(__LINE__)": \n\t"\ + \ + /* Restore ulCriticalNesting variable */ \ + "ld.w r0, sp++ \n\t"\ + "mov r8, LWRD("ASTRINGZ(ulCriticalNesting)") \n\t"\ + "orh r8, HWRD("ASTRINGZ(ulCriticalNesting)") \n\t"\ + "st.w r8[0], r0 \n\t"\ + \ + /* Restore R0..R7 */ \ + "ldm sp++, r0-r7 \n\t"\ + \ + /* Now, the stack should be R8..R12, LR, PC and SR */ \ + "rete" \ + ); \ + \ + /* Force import of global symbols from assembly */ \ + ulCriticalNesting; \ + pxCurrentTCB; \ +} + +#endif + + +#define portYIELD() {__asm__ __volatile__ ("scall");} + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AVR32_UC3/read.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AVR32_UC3/read.c new file mode 100644 index 0000000..30b5ee8 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AVR32_UC3/read.c @@ -0,0 +1,93 @@ +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief System-specific implementation of the \ref __read function used by + the standard library. + * + * - Compiler: IAR EWAVR32 + * - Supported devices: All AVR32 devices with a USART module can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2007, Atmel Corporation All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of ATMEL may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND + * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +#include +#include +#include "usart.h" + + +_STD_BEGIN + + +#pragma module_name = "?__read" + + +extern volatile avr32_usart_t *volatile stdio_usart_base; + + +/*! \brief Reads a number of bytes, at most \a size, into the memory area + * pointed to by \a buffer. + * + * \param handle File handle to read from. + * \param buffer Pointer to buffer to write read bytes to. + * \param size Number of bytes to read. + * + * \return The number of bytes read, \c 0 at the end of the file, or + * \c _LLIO_ERROR on failure. + */ +size_t __read(int handle, uint8_t *buffer, size_t size) +{ + int nChars = 0; + + // This implementation only reads from stdin. + // For all other file handles, it returns failure. + if (handle != _LLIO_STDIN) + { + return _LLIO_ERROR; + } + + for (; size > 0; --size) + { + int c = usart_getchar(stdio_usart_base); + if (c < 0) + break; + + *buffer++ = c; + ++nChars; + } + + return nChars; +} + + +_STD_END diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AVR32_UC3/write.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AVR32_UC3/write.c new file mode 100644 index 0000000..859487e --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AVR32_UC3/write.c @@ -0,0 +1,103 @@ +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief System-specific implementation of the \ref __write function used by + the standard library. + * + * - Compiler: IAR EWAVR32 + * - Supported devices: All AVR32 devices with a USART module can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2007, Atmel Corporation All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of ATMEL may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND + * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +#include +#include +#include "usart.h" + + +_STD_BEGIN + + +#pragma module_name = "?__write" + + +//! Pointer to the base of the USART module instance to use for stdio. +__no_init volatile avr32_usart_t *volatile stdio_usart_base; + + +/*! \brief Writes a number of bytes, at most \a size, from the memory area + * pointed to by \a buffer. + * + * If \a buffer is zero then \ref __write performs flushing of internal buffers, + * if any. In this case, \a handle can be \c -1 to indicate that all handles + * should be flushed. + * + * \param handle File handle to write to. + * \param buffer Pointer to buffer to read bytes to write from. + * \param size Number of bytes to write. + * + * \return The number of bytes written, or \c _LLIO_ERROR on failure. + */ +size_t __write(int handle, const uint8_t *buffer, size_t size) +{ + size_t nChars = 0; + + if (buffer == 0) + { + // This means that we should flush internal buffers. + return 0; + } + + // This implementation only writes to stdout and stderr. + // For all other file handles, it returns failure. + if (handle != _LLIO_STDOUT && handle != _LLIO_STDERR) + { + return _LLIO_ERROR; + } + + for (; size != 0; --size) + { + if (usart_putchar(stdio_usart_base, *buffer++) < 0) + { + return _LLIO_ERROR; + } + + ++nChars; + } + + return nChars; +} + + +_STD_END diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM7S64/AT91SAM7S64.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM7S64/AT91SAM7S64.h new file mode 100644 index 0000000..8f9ddb4 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM7S64/AT91SAM7S64.h @@ -0,0 +1,1914 @@ +// ---------------------------------------------------------------------------- +// ATMEL Microcontroller Software Support - ROUSSET - +// ---------------------------------------------------------------------------- +// The software is delivered "AS IS" without warranty or condition of any +// kind, either express, implied or statutory. This includes without +// limitation any warranty or condition with respect to merchantability or +// fitness for any particular purpose, or against the infringements of +// intellectual property rights of others. +// ---------------------------------------------------------------------------- +// File Name : AT91SAM7S64.h +// Object : AT91SAM7S64 definitions +// Generated : AT91 SW Application Group 07/16/2004 (07:43:08) +// +// CVS Reference : /AT91SAM7S64.pl/1.12/Mon Jul 12 13:02:30 2004// +// CVS Reference : /SYSC_SAM7Sxx.pl/1.5/Mon Jul 12 16:22:12 2004// +// CVS Reference : /MC_SAM02.pl/1.3/Wed Mar 10 08:37:04 2004// +// CVS Reference : /UDP_1765B.pl/1.3/Fri Aug 2 14:45:38 2002// +// CVS Reference : /AIC_1796B.pl/1.1.1.1/Fri Jun 28 09:36:48 2002// +// CVS Reference : /lib_pmc_SAM.h/1.6/Tue Apr 27 13:53:52 2004// +// CVS Reference : /PIO_1725D.pl/1.1.1.1/Fri Jun 28 09:36:48 2002// +// CVS Reference : /DBGU_1754A.pl/1.4/Fri Jan 31 12:18:24 2003// +// CVS Reference : /US_1739C.pl/1.2/Mon Jul 12 17:26:24 2004// +// CVS Reference : /SPI2.pl/1.2/Fri Oct 17 08:13:40 2003// +// CVS Reference : /SSC_1762A.pl/1.2/Fri Nov 8 13:26:40 2002// +// CVS Reference : /lib_tc_1753b.h/1.1/Fri Jan 31 12:20:02 2003// +// CVS Reference : /TWI_1761B.pl/1.4/Fri Feb 7 10:30:08 2003// +// CVS Reference : /PDC_1734B.pl/1.2/Thu Nov 21 16:38:24 2002// +// CVS Reference : /ADC_SAM.pl/1.7/Fri Oct 17 08:12:38 2003// +// CVS Reference : /lib_PWM_SAM.h/1.3/Thu Jan 22 10:10:50 2004// +// ---------------------------------------------------------------------------- + +#ifndef AT91SAM7S64_H +#define AT91SAM7S64_H + +typedef volatile unsigned int AT91_REG;// Hardware register definition + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR System Peripherals +// ***************************************************************************** +typedef struct _AT91S_SYSC { + AT91_REG SYSC_AIC_SMR[32]; // Source Mode Register + AT91_REG SYSC_AIC_SVR[32]; // Source Vector Register + AT91_REG SYSC_AIC_IVR; // IRQ Vector Register + AT91_REG SYSC_AIC_FVR; // FIQ Vector Register + AT91_REG SYSC_AIC_ISR; // Interrupt Status Register + AT91_REG SYSC_AIC_IPR; // Interrupt Pending Register + AT91_REG SYSC_AIC_IMR; // Interrupt Mask Register + AT91_REG SYSC_AIC_CISR; // Core Interrupt Status Register + AT91_REG Reserved0[2]; // + AT91_REG SYSC_AIC_IECR; // Interrupt Enable Command Register + AT91_REG SYSC_AIC_IDCR; // Interrupt Disable Command Register + AT91_REG SYSC_AIC_ICCR; // Interrupt Clear Command Register + AT91_REG SYSC_AIC_ISCR; // Interrupt Set Command Register + AT91_REG SYSC_AIC_EOICR; // End of Interrupt Command Register + AT91_REG SYSC_AIC_SPU; // Spurious Vector Register + AT91_REG SYSC_AIC_DCR; // Debug Control Register (Protect) + AT91_REG Reserved1[1]; // + AT91_REG SYSC_AIC_FFER; // Fast Forcing Enable Register + AT91_REG SYSC_AIC_FFDR; // Fast Forcing Disable Register + AT91_REG SYSC_AIC_FFSR; // Fast Forcing Status Register + AT91_REG Reserved2[45]; // + AT91_REG SYSC_DBGU_CR; // Control Register + AT91_REG SYSC_DBGU_MR; // Mode Register + AT91_REG SYSC_DBGU_IER; // Interrupt Enable Register + AT91_REG SYSC_DBGU_IDR; // Interrupt Disable Register + AT91_REG SYSC_DBGU_IMR; // Interrupt Mask Register + AT91_REG SYSC_DBGU_CSR; // Channel Status Register + AT91_REG SYSC_DBGU_RHR; // Receiver Holding Register + AT91_REG SYSC_DBGU_THR; // Transmitter Holding Register + AT91_REG SYSC_DBGU_BRGR; // Baud Rate Generator Register + AT91_REG Reserved3[7]; // + AT91_REG SYSC_DBGU_C1R; // Chip ID1 Register + AT91_REG SYSC_DBGU_C2R; // Chip ID2 Register + AT91_REG SYSC_DBGU_FNTR; // Force NTRST Register + AT91_REG Reserved4[45]; // + AT91_REG SYSC_DBGU_RPR; // Receive Pointer Register + AT91_REG SYSC_DBGU_RCR; // Receive Counter Register + AT91_REG SYSC_DBGU_TPR; // Transmit Pointer Register + AT91_REG SYSC_DBGU_TCR; // Transmit Counter Register + AT91_REG SYSC_DBGU_RNPR; // Receive Next Pointer Register + AT91_REG SYSC_DBGU_RNCR; // Receive Next Counter Register + AT91_REG SYSC_DBGU_TNPR; // Transmit Next Pointer Register + AT91_REG SYSC_DBGU_TNCR; // Transmit Next Counter Register + AT91_REG SYSC_DBGU_PTCR; // PDC Transfer Control Register + AT91_REG SYSC_DBGU_PTSR; // PDC Transfer Status Register + AT91_REG Reserved5[54]; // + AT91_REG SYSC_PIOA_PER; // PIO Enable Register + AT91_REG SYSC_PIOA_PDR; // PIO Disable Register + AT91_REG SYSC_PIOA_PSR; // PIO Status Register + AT91_REG Reserved6[1]; // + AT91_REG SYSC_PIOA_OER; // Output Enable Register + AT91_REG SYSC_PIOA_ODR; // Output Disable Registerr + AT91_REG SYSC_PIOA_OSR; // Output Status Register + AT91_REG Reserved7[1]; // + AT91_REG SYSC_PIOA_IFER; // Input Filter Enable Register + AT91_REG SYSC_PIOA_IFDR; // Input Filter Disable Register + AT91_REG SYSC_PIOA_IFSR; // Input Filter Status Register + AT91_REG Reserved8[1]; // + AT91_REG SYSC_PIOA_SODR; // Set Output Data Register + AT91_REG SYSC_PIOA_CODR; // Clear Output Data Register + AT91_REG SYSC_PIOA_ODSR; // Output Data Status Register + AT91_REG SYSC_PIOA_PDSR; // Pin Data Status Register + AT91_REG SYSC_PIOA_IER; // Interrupt Enable Register + AT91_REG SYSC_PIOA_IDR; // Interrupt Disable Register + AT91_REG SYSC_PIOA_IMR; // Interrupt Mask Register + AT91_REG SYSC_PIOA_ISR; // Interrupt Status Register + AT91_REG SYSC_PIOA_MDER; // Multi-driver Enable Register + AT91_REG SYSC_PIOA_MDDR; // Multi-driver Disable Register + AT91_REG SYSC_PIOA_MDSR; // Multi-driver Status Register + AT91_REG Reserved9[1]; // + AT91_REG SYSC_PIOA_PPUDR; // Pull-up Disable Register + AT91_REG SYSC_PIOA_PPUER; // Pull-up Enable Register + AT91_REG SYSC_PIOA_PPUSR; // Pad Pull-up Status Register + AT91_REG Reserved10[1]; // + AT91_REG SYSC_PIOA_ASR; // Select A Register + AT91_REG SYSC_PIOA_BSR; // Select B Register + AT91_REG SYSC_PIOA_ABSR; // AB Select Status Register + AT91_REG Reserved11[9]; // + AT91_REG SYSC_PIOA_OWER; // Output Write Enable Register + AT91_REG SYSC_PIOA_OWDR; // Output Write Disable Register + AT91_REG SYSC_PIOA_OWSR; // Output Write Status Register + AT91_REG Reserved12[469]; // + AT91_REG SYSC_PMC_SCER; // System Clock Enable Register + AT91_REG SYSC_PMC_SCDR; // System Clock Disable Register + AT91_REG SYSC_PMC_SCSR; // System Clock Status Register + AT91_REG Reserved13[1]; // + AT91_REG SYSC_PMC_PCER; // Peripheral Clock Enable Register + AT91_REG SYSC_PMC_PCDR; // Peripheral Clock Disable Register + AT91_REG SYSC_PMC_PCSR; // Peripheral Clock Status Register + AT91_REG Reserved14[1]; // + AT91_REG SYSC_PMC_MOR; // Main Oscillator Register + AT91_REG SYSC_PMC_MCFR; // Main Clock Frequency Register + AT91_REG Reserved15[1]; // + AT91_REG SYSC_PMC_PLLR; // PLL Register + AT91_REG SYSC_PMC_MCKR; // Master Clock Register + AT91_REG Reserved16[3]; // + AT91_REG SYSC_PMC_PCKR[8]; // Programmable Clock Register + AT91_REG SYSC_PMC_IER; // Interrupt Enable Register + AT91_REG SYSC_PMC_IDR; // Interrupt Disable Register + AT91_REG SYSC_PMC_SR; // Status Register + AT91_REG SYSC_PMC_IMR; // Interrupt Mask Register + AT91_REG Reserved17[36]; // + AT91_REG SYSC_RSTC_RCR; // Reset Control Register + AT91_REG SYSC_RSTC_RSR; // Reset Status Register + AT91_REG SYSC_RSTC_RMR; // Reset Mode Register + AT91_REG Reserved18[5]; // + AT91_REG SYSC_RTTC_RTMR; // Real-time Mode Register + AT91_REG SYSC_RTTC_RTAR; // Real-time Alarm Register + AT91_REG SYSC_RTTC_RTVR; // Real-time Value Register + AT91_REG SYSC_RTTC_RTSR; // Real-time Status Register + AT91_REG SYSC_PITC_PIMR; // Period Interval Mode Register + AT91_REG SYSC_PITC_PISR; // Period Interval Status Register + AT91_REG SYSC_PITC_PIVR; // Period Interval Value Register + AT91_REG SYSC_PITC_PIIR; // Period Interval Image Register + AT91_REG SYSC_WDTC_WDCR; // Watchdog Control Register + AT91_REG SYSC_WDTC_WDMR; // Watchdog Mode Register + AT91_REG SYSC_WDTC_WDSR; // Watchdog Status Register + AT91_REG Reserved19[5]; // + AT91_REG SYSC_SYSC_VRPM; // Voltage Regulator Power Mode Register +} AT91S_SYSC, *AT91PS_SYSC; + +// -------- VRPM : (SYSC Offset: 0xd60) Voltage Regulator Power Mode Register -------- +#define AT91C_SYSC_PSTDBY ((unsigned int) 0x1 << 0) // (SYSC) Voltage Regulator Power Mode + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Advanced Interrupt Controller +// ***************************************************************************** +typedef struct _AT91S_AIC { + AT91_REG AIC_SMR[32]; // Source Mode Register + AT91_REG AIC_SVR[32]; // Source Vector Register + AT91_REG AIC_IVR; // IRQ Vector Register + AT91_REG AIC_FVR; // FIQ Vector Register + AT91_REG AIC_ISR; // Interrupt Status Register + AT91_REG AIC_IPR; // Interrupt Pending Register + AT91_REG AIC_IMR; // Interrupt Mask Register + AT91_REG AIC_CISR; // Core Interrupt Status Register + AT91_REG Reserved0[2]; // + AT91_REG AIC_IECR; // Interrupt Enable Command Register + AT91_REG AIC_IDCR; // Interrupt Disable Command Register + AT91_REG AIC_ICCR; // Interrupt Clear Command Register + AT91_REG AIC_ISCR; // Interrupt Set Command Register + AT91_REG AIC_EOICR; // End of Interrupt Command Register + AT91_REG AIC_SPU; // Spurious Vector Register + AT91_REG AIC_DCR; // Debug Control Register (Protect) + AT91_REG Reserved1[1]; // + AT91_REG AIC_FFER; // Fast Forcing Enable Register + AT91_REG AIC_FFDR; // Fast Forcing Disable Register + AT91_REG AIC_FFSR; // Fast Forcing Status Register +} AT91S_AIC, *AT91PS_AIC; + +// -------- AIC_SMR : (AIC Offset: 0x0) Control Register -------- +#define AT91C_AIC_PRIOR ((unsigned int) 0x7 << 0) // (AIC) Priority Level +#define AT91C_AIC_PRIOR_LOWEST ((unsigned int) 0x0) // (AIC) Lowest priority level +#define AT91C_AIC_PRIOR_HIGHEST ((unsigned int) 0x7) // (AIC) Highest priority level +#define AT91C_AIC_SRCTYPE ((unsigned int) 0x3 << 5) // (AIC) Interrupt Source Type +#define AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE ((unsigned int) 0x0 << 5) // (AIC) Internal Sources Code Label Level Sensitive +#define AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED ((unsigned int) 0x1 << 5) // (AIC) Internal Sources Code Label Edge triggered +#define AT91C_AIC_SRCTYPE_EXT_HIGH_LEVEL ((unsigned int) 0x2 << 5) // (AIC) External Sources Code Label High-level Sensitive +#define AT91C_AIC_SRCTYPE_EXT_POSITIVE_EDGE ((unsigned int) 0x3 << 5) // (AIC) External Sources Code Label Positive Edge triggered +// -------- AIC_CISR : (AIC Offset: 0x114) AIC Core Interrupt Status Register -------- +#define AT91C_AIC_NFIQ ((unsigned int) 0x1 << 0) // (AIC) NFIQ Status +#define AT91C_AIC_NIRQ ((unsigned int) 0x1 << 1) // (AIC) NIRQ Status +// -------- AIC_DCR : (AIC Offset: 0x138) AIC Debug Control Register (Protect) -------- +#define AT91C_AIC_DCR_PROT ((unsigned int) 0x1 << 0) // (AIC) Protection Mode +#define AT91C_AIC_DCR_GMSK ((unsigned int) 0x1 << 1) // (AIC) General Mask + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Debug Unit +// ***************************************************************************** +typedef struct _AT91S_DBGU { + AT91_REG DBGU_CR; // Control Register + AT91_REG DBGU_MR; // Mode Register + AT91_REG DBGU_IER; // Interrupt Enable Register + AT91_REG DBGU_IDR; // Interrupt Disable Register + AT91_REG DBGU_IMR; // Interrupt Mask Register + AT91_REG DBGU_CSR; // Channel Status Register + AT91_REG DBGU_RHR; // Receiver Holding Register + AT91_REG DBGU_THR; // Transmitter Holding Register + AT91_REG DBGU_BRGR; // Baud Rate Generator Register + AT91_REG Reserved0[7]; // + AT91_REG DBGU_C1R; // Chip ID1 Register + AT91_REG DBGU_C2R; // Chip ID2 Register + AT91_REG DBGU_FNTR; // Force NTRST Register + AT91_REG Reserved1[45]; // + AT91_REG DBGU_RPR; // Receive Pointer Register + AT91_REG DBGU_RCR; // Receive Counter Register + AT91_REG DBGU_TPR; // Transmit Pointer Register + AT91_REG DBGU_TCR; // Transmit Counter Register + AT91_REG DBGU_RNPR; // Receive Next Pointer Register + AT91_REG DBGU_RNCR; // Receive Next Counter Register + AT91_REG DBGU_TNPR; // Transmit Next Pointer Register + AT91_REG DBGU_TNCR; // Transmit Next Counter Register + AT91_REG DBGU_PTCR; // PDC Transfer Control Register + AT91_REG DBGU_PTSR; // PDC Transfer Status Register +} AT91S_DBGU, *AT91PS_DBGU; + +// -------- DBGU_CR : (DBGU Offset: 0x0) Debug Unit Control Register -------- +#define AT91C_US_RSTRX ((unsigned int) 0x1 << 2) // (DBGU) Reset Receiver +#define AT91C_US_RSTTX ((unsigned int) 0x1 << 3) // (DBGU) Reset Transmitter +#define AT91C_US_RXEN ((unsigned int) 0x1 << 4) // (DBGU) Receiver Enable +#define AT91C_US_RXDIS ((unsigned int) 0x1 << 5) // (DBGU) Receiver Disable +#define AT91C_US_TXEN ((unsigned int) 0x1 << 6) // (DBGU) Transmitter Enable +#define AT91C_US_TXDIS ((unsigned int) 0x1 << 7) // (DBGU) Transmitter Disable +// -------- DBGU_MR : (DBGU Offset: 0x4) Debug Unit Mode Register -------- +#define AT91C_US_PAR ((unsigned int) 0x7 << 9) // (DBGU) Parity type +#define AT91C_US_PAR_EVEN ((unsigned int) 0x0 << 9) // (DBGU) Even Parity +#define AT91C_US_PAR_ODD ((unsigned int) 0x1 << 9) // (DBGU) Odd Parity +#define AT91C_US_PAR_SPACE ((unsigned int) 0x2 << 9) // (DBGU) Parity forced to 0 (Space) +#define AT91C_US_PAR_MARK ((unsigned int) 0x3 << 9) // (DBGU) Parity forced to 1 (Mark) +#define AT91C_US_PAR_NONE ((unsigned int) 0x4 << 9) // (DBGU) No Parity +#define AT91C_US_PAR_MULTI_DROP ((unsigned int) 0x6 << 9) // (DBGU) Multi-drop mode +#define AT91C_US_CHMODE ((unsigned int) 0x3 << 14) // (DBGU) Channel Mode +#define AT91C_US_CHMODE_NORMAL ((unsigned int) 0x0 << 14) // (DBGU) Normal Mode: The USART channel operates as an RX/TX USART. +#define AT91C_US_CHMODE_AUTO ((unsigned int) 0x1 << 14) // (DBGU) Automatic Echo: Receiver Data Input is connected to the TXD pin. +#define AT91C_US_CHMODE_LOCAL ((unsigned int) 0x2 << 14) // (DBGU) Local Loopback: Transmitter Output Signal is connected to Receiver Input Signal. +#define AT91C_US_CHMODE_REMOTE ((unsigned int) 0x3 << 14) // (DBGU) Remote Loopback: RXD pin is internally connected to TXD pin. +// -------- DBGU_IER : (DBGU Offset: 0x8) Debug Unit Interrupt Enable Register -------- +#define AT91C_US_RXRDY ((unsigned int) 0x1 << 0) // (DBGU) RXRDY Interrupt +#define AT91C_US_TXRDY ((unsigned int) 0x1 << 1) // (DBGU) TXRDY Interrupt +#define AT91C_US_ENDRX ((unsigned int) 0x1 << 3) // (DBGU) End of Receive Transfer Interrupt +#define AT91C_US_ENDTX ((unsigned int) 0x1 << 4) // (DBGU) End of Transmit Interrupt +#define AT91C_US_OVRE ((unsigned int) 0x1 << 5) // (DBGU) Overrun Interrupt +#define AT91C_US_FRAME ((unsigned int) 0x1 << 6) // (DBGU) Framing Error Interrupt +#define AT91C_US_PARE ((unsigned int) 0x1 << 7) // (DBGU) Parity Error Interrupt +#define AT91C_US_TXEMPTY ((unsigned int) 0x1 << 9) // (DBGU) TXEMPTY Interrupt +#define AT91C_US_TXBUFE ((unsigned int) 0x1 << 11) // (DBGU) TXBUFE Interrupt +#define AT91C_US_RXBUFF ((unsigned int) 0x1 << 12) // (DBGU) RXBUFF Interrupt +#define AT91C_US_COMM_TX ((unsigned int) 0x1 << 30) // (DBGU) COMM_TX Interrupt +#define AT91C_US_COMM_RX ((unsigned int) 0x1 << 31) // (DBGU) COMM_RX Interrupt +// -------- DBGU_IDR : (DBGU Offset: 0xc) Debug Unit Interrupt Disable Register -------- +// -------- DBGU_IMR : (DBGU Offset: 0x10) Debug Unit Interrupt Mask Register -------- +// -------- DBGU_CSR : (DBGU Offset: 0x14) Debug Unit Channel Status Register -------- +// -------- DBGU_FNTR : (DBGU Offset: 0x48) Debug Unit FORCE_NTRST Register -------- +#define AT91C_US_FORCE_NTRST ((unsigned int) 0x1 << 0) // (DBGU) Force NTRST in JTAG + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Peripheral Data Controller +// ***************************************************************************** +typedef struct _AT91S_PDC { + AT91_REG PDC_RPR; // Receive Pointer Register + AT91_REG PDC_RCR; // Receive Counter Register + AT91_REG PDC_TPR; // Transmit Pointer Register + AT91_REG PDC_TCR; // Transmit Counter Register + AT91_REG PDC_RNPR; // Receive Next Pointer Register + AT91_REG PDC_RNCR; // Receive Next Counter Register + AT91_REG PDC_TNPR; // Transmit Next Pointer Register + AT91_REG PDC_TNCR; // Transmit Next Counter Register + AT91_REG PDC_PTCR; // PDC Transfer Control Register + AT91_REG PDC_PTSR; // PDC Transfer Status Register +} AT91S_PDC, *AT91PS_PDC; + +// -------- PDC_PTCR : (PDC Offset: 0x20) PDC Transfer Control Register -------- +#define AT91C_PDC_RXTEN ((unsigned int) 0x1 << 0) // (PDC) Receiver Transfer Enable +#define AT91C_PDC_RXTDIS ((unsigned int) 0x1 << 1) // (PDC) Receiver Transfer Disable +#define AT91C_PDC_TXTEN ((unsigned int) 0x1 << 8) // (PDC) Transmitter Transfer Enable +#define AT91C_PDC_TXTDIS ((unsigned int) 0x1 << 9) // (PDC) Transmitter Transfer Disable +// -------- PDC_PTSR : (PDC Offset: 0x24) PDC Transfer Status Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Parallel Input Output Controler +// ***************************************************************************** +typedef struct _AT91S_PIO { + AT91_REG PIO_PER; // PIO Enable Register + AT91_REG PIO_PDR; // PIO Disable Register + AT91_REG PIO_PSR; // PIO Status Register + AT91_REG Reserved0[1]; // + AT91_REG PIO_OER; // Output Enable Register + AT91_REG PIO_ODR; // Output Disable Registerr + AT91_REG PIO_OSR; // Output Status Register + AT91_REG Reserved1[1]; // + AT91_REG PIO_IFER; // Input Filter Enable Register + AT91_REG PIO_IFDR; // Input Filter Disable Register + AT91_REG PIO_IFSR; // Input Filter Status Register + AT91_REG Reserved2[1]; // + AT91_REG PIO_SODR; // Set Output Data Register + AT91_REG PIO_CODR; // Clear Output Data Register + AT91_REG PIO_ODSR; // Output Data Status Register + AT91_REG PIO_PDSR; // Pin Data Status Register + AT91_REG PIO_IER; // Interrupt Enable Register + AT91_REG PIO_IDR; // Interrupt Disable Register + AT91_REG PIO_IMR; // Interrupt Mask Register + AT91_REG PIO_ISR; // Interrupt Status Register + AT91_REG PIO_MDER; // Multi-driver Enable Register + AT91_REG PIO_MDDR; // Multi-driver Disable Register + AT91_REG PIO_MDSR; // Multi-driver Status Register + AT91_REG Reserved3[1]; // + AT91_REG PIO_PPUDR; // Pull-up Disable Register + AT91_REG PIO_PPUER; // Pull-up Enable Register + AT91_REG PIO_PPUSR; // Pad Pull-up Status Register + AT91_REG Reserved4[1]; // + AT91_REG PIO_ASR; // Select A Register + AT91_REG PIO_BSR; // Select B Register + AT91_REG PIO_ABSR; // AB Select Status Register + AT91_REG Reserved5[9]; // + AT91_REG PIO_OWER; // Output Write Enable Register + AT91_REG PIO_OWDR; // Output Write Disable Register + AT91_REG PIO_OWSR; // Output Write Status Register +} AT91S_PIO, *AT91PS_PIO; + + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Clock Generator Controler +// ***************************************************************************** +typedef struct _AT91S_CKGR { + AT91_REG CKGR_MOR; // Main Oscillator Register + AT91_REG CKGR_MCFR; // Main Clock Frequency Register + AT91_REG Reserved0[1]; // + AT91_REG CKGR_PLLR; // PLL Register +} AT91S_CKGR, *AT91PS_CKGR; + +// -------- CKGR_MOR : (CKGR Offset: 0x0) Main Oscillator Register -------- +#define AT91C_CKGR_MOSCEN ((unsigned int) 0x1 << 0) // (CKGR) Main Oscillator Enable +#define AT91C_CKGR_OSCBYPASS ((unsigned int) 0x1 << 1) // (CKGR) Main Oscillator Bypass +#define AT91C_CKGR_OSCOUNT ((unsigned int) 0xFF << 8) // (CKGR) Main Oscillator Start-up Time +// -------- CKGR_MCFR : (CKGR Offset: 0x4) Main Clock Frequency Register -------- +#define AT91C_CKGR_MAINF ((unsigned int) 0xFFFF << 0) // (CKGR) Main Clock Frequency +#define AT91C_CKGR_MAINRDY ((unsigned int) 0x1 << 16) // (CKGR) Main Clock Ready +// -------- CKGR_PLLR : (CKGR Offset: 0xc) PLL B Register -------- +#define AT91C_CKGR_DIV ((unsigned int) 0xFF << 0) // (CKGR) Divider Selected +#define AT91C_CKGR_DIV_0 ((unsigned int) 0x0) // (CKGR) Divider output is 0 +#define AT91C_CKGR_DIV_BYPASS ((unsigned int) 0x1) // (CKGR) Divider is bypassed +#define AT91C_CKGR_PLLCOUNT ((unsigned int) 0x3F << 8) // (CKGR) PLL Counter +#define AT91C_CKGR_OUT ((unsigned int) 0x3 << 14) // (CKGR) PLL Output Frequency Range +#define AT91C_CKGR_OUT_0 ((unsigned int) 0x0 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_OUT_1 ((unsigned int) 0x1 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_OUT_2 ((unsigned int) 0x2 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_OUT_3 ((unsigned int) 0x3 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_MUL ((unsigned int) 0x7FF << 16) // (CKGR) PLL Multiplier +#define AT91C_CKGR_USBDIV ((unsigned int) 0x3 << 28) // (CKGR) Divider for USB Clocks +#define AT91C_CKGR_USBDIV_0 ((unsigned int) 0x0 << 28) // (CKGR) Divider output is PLL clock output +#define AT91C_CKGR_USBDIV_1 ((unsigned int) 0x1 << 28) // (CKGR) Divider output is PLL clock output divided by 2 +#define AT91C_CKGR_USBDIV_2 ((unsigned int) 0x2 << 28) // (CKGR) Divider output is PLL clock output divided by 4 + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Power Management Controler +// ***************************************************************************** +typedef struct _AT91S_PMC { + AT91_REG PMC_SCER; // System Clock Enable Register + AT91_REG PMC_SCDR; // System Clock Disable Register + AT91_REG PMC_SCSR; // System Clock Status Register + AT91_REG Reserved0[1]; // + AT91_REG PMC_PCER; // Peripheral Clock Enable Register + AT91_REG PMC_PCDR; // Peripheral Clock Disable Register + AT91_REG PMC_PCSR; // Peripheral Clock Status Register + AT91_REG Reserved1[1]; // + AT91_REG PMC_MOR; // Main Oscillator Register + AT91_REG PMC_MCFR; // Main Clock Frequency Register + AT91_REG Reserved2[1]; // + AT91_REG PMC_PLLR; // PLL Register + AT91_REG PMC_MCKR; // Master Clock Register + AT91_REG Reserved3[3]; // + AT91_REG PMC_PCKR[8]; // Programmable Clock Register + AT91_REG PMC_IER; // Interrupt Enable Register + AT91_REG PMC_IDR; // Interrupt Disable Register + AT91_REG PMC_SR; // Status Register + AT91_REG PMC_IMR; // Interrupt Mask Register +} AT91S_PMC, *AT91PS_PMC; + +// -------- PMC_SCER : (PMC Offset: 0x0) System Clock Enable Register -------- +#define AT91C_PMC_PCK ((unsigned int) 0x1 << 0) // (PMC) Processor Clock +#define AT91C_PMC_UDP ((unsigned int) 0x1 << 7) // (PMC) USB Device Port Clock +#define AT91C_PMC_PCK0 ((unsigned int) 0x1 << 8) // (PMC) Programmable Clock Output +#define AT91C_PMC_PCK1 ((unsigned int) 0x1 << 9) // (PMC) Programmable Clock Output +#define AT91C_PMC_PCK2 ((unsigned int) 0x1 << 10) // (PMC) Programmable Clock Output +#define AT91C_PMC_PCK3 ((unsigned int) 0x1 << 11) // (PMC) Programmable Clock Output +// -------- PMC_SCDR : (PMC Offset: 0x4) System Clock Disable Register -------- +// -------- PMC_SCSR : (PMC Offset: 0x8) System Clock Status Register -------- +// -------- CKGR_MOR : (PMC Offset: 0x20) Main Oscillator Register -------- +// -------- CKGR_MCFR : (PMC Offset: 0x24) Main Clock Frequency Register -------- +// -------- CKGR_PLLR : (PMC Offset: 0x2c) PLL B Register -------- +// -------- PMC_MCKR : (PMC Offset: 0x30) Master Clock Register -------- +#define AT91C_PMC_CSS ((unsigned int) 0x3 << 0) // (PMC) Programmable Clock Selection +#define AT91C_PMC_CSS_SLOW_CLK ((unsigned int) 0x0) // (PMC) Slow Clock is selected +#define AT91C_PMC_CSS_MAIN_CLK ((unsigned int) 0x1) // (PMC) Main Clock is selected +#define AT91C_PMC_CSS_PLL_CLK ((unsigned int) 0x3) // (PMC) Clock from PLL is selected +#define AT91C_PMC_PRES ((unsigned int) 0x7 << 2) // (PMC) Programmable Clock Prescaler +#define AT91C_PMC_PRES_CLK ((unsigned int) 0x0 << 2) // (PMC) Selected clock +#define AT91C_PMC_PRES_CLK_2 ((unsigned int) 0x1 << 2) // (PMC) Selected clock divided by 2 +#define AT91C_PMC_PRES_CLK_4 ((unsigned int) 0x2 << 2) // (PMC) Selected clock divided by 4 +#define AT91C_PMC_PRES_CLK_8 ((unsigned int) 0x3 << 2) // (PMC) Selected clock divided by 8 +#define AT91C_PMC_PRES_CLK_16 ((unsigned int) 0x4 << 2) // (PMC) Selected clock divided by 16 +#define AT91C_PMC_PRES_CLK_32 ((unsigned int) 0x5 << 2) // (PMC) Selected clock divided by 32 +#define AT91C_PMC_PRES_CLK_64 ((unsigned int) 0x6 << 2) // (PMC) Selected clock divided by 64 +// -------- PMC_PCKR : (PMC Offset: 0x40) Programmable Clock Register -------- +// -------- PMC_IER : (PMC Offset: 0x60) PMC Interrupt Enable Register -------- +#define AT91C_PMC_MOSCS ((unsigned int) 0x1 << 0) // (PMC) MOSC Status/Enable/Disable/Mask +#define AT91C_PMC_LOCK ((unsigned int) 0x1 << 2) // (PMC) PLL Status/Enable/Disable/Mask +#define AT91C_PMC_MCKRDY ((unsigned int) 0x1 << 3) // (PMC) MCK_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK0RDY ((unsigned int) 0x1 << 8) // (PMC) PCK0_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK1RDY ((unsigned int) 0x1 << 9) // (PMC) PCK1_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK2RDY ((unsigned int) 0x1 << 10) // (PMC) PCK2_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK3RDY ((unsigned int) 0x1 << 11) // (PMC) PCK3_RDY Status/Enable/Disable/Mask +// -------- PMC_IDR : (PMC Offset: 0x64) PMC Interrupt Disable Register -------- +// -------- PMC_SR : (PMC Offset: 0x68) PMC Status Register -------- +// -------- PMC_IMR : (PMC Offset: 0x6c) PMC Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Reset Controller Interface +// ***************************************************************************** +typedef struct _AT91S_RSTC { + AT91_REG RSTC_RCR; // Reset Control Register + AT91_REG RSTC_RSR; // Reset Status Register + AT91_REG RSTC_RMR; // Reset Mode Register +} AT91S_RSTC, *AT91PS_RSTC; + +// -------- SYSC_RCR : (RSTC Offset: 0x0) Reset Control Register -------- +#define AT91C_SYSC_PROCRST ((unsigned int) 0x1 << 0) // (RSTC) Processor Reset +#define AT91C_SYSC_ICERST ((unsigned int) 0x1 << 1) // (RSTC) ICE Interface Reset +#define AT91C_SYSC_PERRST ((unsigned int) 0x1 << 2) // (RSTC) Peripheral Reset +#define AT91C_SYSC_EXTRST ((unsigned int) 0x1 << 3) // (RSTC) External Reset +#define AT91C_SYSC_KEY ((unsigned int) 0xFF << 24) // (RSTC) Password +// -------- SYSC_RSR : (RSTC Offset: 0x4) Reset Status Register -------- +#define AT91C_SYSC_URSTS ((unsigned int) 0x1 << 0) // (RSTC) User Reset Status +#define AT91C_SYSC_BODSTS ((unsigned int) 0x1 << 1) // (RSTC) Brown-out Detection Status +#define AT91C_SYSC_RSTTYP ((unsigned int) 0x7 << 8) // (RSTC) Reset Type +#define AT91C_SYSC_RSTTYP_POWERUP ((unsigned int) 0x0 << 8) // (RSTC) Power-up Reset. VDDCORE rising. +#define AT91C_SYSC_RSTTYP_WATCHDOG ((unsigned int) 0x2 << 8) // (RSTC) Watchdog Reset. Watchdog overflow occured. +#define AT91C_SYSC_RSTTYP_SOFTWARE ((unsigned int) 0x3 << 8) // (RSTC) Software Reset. Processor reset required by the software. +#define AT91C_SYSC_RSTTYP_USER ((unsigned int) 0x4 << 8) // (RSTC) User Reset. NRST pin detected low. +#define AT91C_SYSC_RSTTYP_BROWNOUT ((unsigned int) 0x5 << 8) // (RSTC) Brown-out Reset. +#define AT91C_SYSC_NRSTL ((unsigned int) 0x1 << 16) // (RSTC) NRST pin level +#define AT91C_SYSC_SRCMP ((unsigned int) 0x1 << 17) // (RSTC) Software Reset Command in Progress. +// -------- SYSC_RMR : (RSTC Offset: 0x8) Reset Mode Register -------- +#define AT91C_SYSC_URSTEN ((unsigned int) 0x1 << 0) // (RSTC) User Reset Enable +#define AT91C_SYSC_URSTIEN ((unsigned int) 0x1 << 4) // (RSTC) User Reset Interrupt Enable +#define AT91C_SYSC_ERSTL ((unsigned int) 0xF << 8) // (RSTC) User Reset Enable +#define AT91C_SYSC_BODIEN ((unsigned int) 0x1 << 16) // (RSTC) Brown-out Detection Interrupt Enable + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Real Time Timer Controller Interface +// ***************************************************************************** +typedef struct _AT91S_RTTC { + AT91_REG RTTC_RTMR; // Real-time Mode Register + AT91_REG RTTC_RTAR; // Real-time Alarm Register + AT91_REG RTTC_RTVR; // Real-time Value Register + AT91_REG RTTC_RTSR; // Real-time Status Register +} AT91S_RTTC, *AT91PS_RTTC; + +// -------- SYSC_RTMR : (RTTC Offset: 0x0) Real-time Mode Register -------- +#define AT91C_SYSC_RTPRES ((unsigned int) 0xFFFF << 0) // (RTTC) Real-time Timer Prescaler Value +#define AT91C_SYSC_ALMIEN ((unsigned int) 0x1 << 16) // (RTTC) Alarm Interrupt Enable +#define AT91C_SYSC_RTTINCIEN ((unsigned int) 0x1 << 17) // (RTTC) Real Time Timer Increment Interrupt Enable +#define AT91C_SYSC_RTTRST ((unsigned int) 0x1 << 18) // (RTTC) Real Time Timer Restart +// -------- SYSC_RTAR : (RTTC Offset: 0x4) Real-time Alarm Register -------- +#define AT91C_SYSC_ALMV ((unsigned int) 0x0 << 0) // (RTTC) Alarm Value +// -------- SYSC_RTVR : (RTTC Offset: 0x8) Current Real-time Value Register -------- +#define AT91C_SYSC_CRTV ((unsigned int) 0x0 << 0) // (RTTC) Current Real-time Value +// -------- SYSC_RTSR : (RTTC Offset: 0xc) Real-time Status Register -------- +#define AT91C_SYSC_ALMS ((unsigned int) 0x1 << 0) // (RTTC) Real-time Alarm Status +#define AT91C_SYSC_RTTINC ((unsigned int) 0x1 << 1) // (RTTC) Real-time Timer Increment + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Periodic Interval Timer Controller Interface +// ***************************************************************************** +typedef struct _AT91S_PITC { + AT91_REG PITC_PIMR; // Period Interval Mode Register + AT91_REG PITC_PISR; // Period Interval Status Register + AT91_REG PITC_PIVR; // Period Interval Value Register + AT91_REG PITC_PIIR; // Period Interval Image Register +} AT91S_PITC, *AT91PS_PITC; + +// -------- SYSC_PIMR : (PITC Offset: 0x0) Periodic Interval Mode Register -------- +#define AT91C_SYSC_PIV ((unsigned int) 0xFFFFF << 0) // (PITC) Periodic Interval Value +#define AT91C_SYSC_PITEN ((unsigned int) 0x1 << 24) // (PITC) Periodic Interval Timer Enabled +#define AT91C_SYSC_PITIEN ((unsigned int) 0x1 << 25) // (PITC) Periodic Interval Timer Interrupt Enable +// -------- SYSC_PISR : (PITC Offset: 0x4) Periodic Interval Status Register -------- +#define AT91C_SYSC_PITS ((unsigned int) 0x1 << 0) // (PITC) Periodic Interval Timer Status +// -------- SYSC_PIVR : (PITC Offset: 0x8) Periodic Interval Value Register -------- +#define AT91C_SYSC_CPIV ((unsigned int) 0xFFFFF << 0) // (PITC) Current Periodic Interval Value +#define AT91C_SYSC_PICNT ((unsigned int) 0xFFF << 20) // (PITC) Periodic Interval Counter +// -------- SYSC_PIIR : (PITC Offset: 0xc) Periodic Interval Image Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Watchdog Timer Controller Interface +// ***************************************************************************** +typedef struct _AT91S_WDTC { + AT91_REG WDTC_WDCR; // Watchdog Control Register + AT91_REG WDTC_WDMR; // Watchdog Mode Register + AT91_REG WDTC_WDSR; // Watchdog Status Register +} AT91S_WDTC, *AT91PS_WDTC; + +// -------- SYSC_WDCR : (WDTC Offset: 0x0) Periodic Interval Image Register -------- +#define AT91C_SYSC_WDRSTT ((unsigned int) 0x1 << 0) // (WDTC) Watchdog Restart +// -------- SYSC_WDMR : (WDTC Offset: 0x4) Watchdog Mode Register -------- +#define AT91C_SYSC_WDV ((unsigned int) 0xFFF << 0) // (WDTC) Watchdog Timer Restart +#define AT91C_SYSC_WDFIEN ((unsigned int) 0x1 << 12) // (WDTC) Watchdog Fault Interrupt Enable +#define AT91C_SYSC_WDRSTEN ((unsigned int) 0x1 << 13) // (WDTC) Watchdog Reset Enable +#define AT91C_SYSC_WDRPROC ((unsigned int) 0x1 << 14) // (WDTC) Watchdog Timer Restart +#define AT91C_SYSC_WDDIS ((unsigned int) 0x1 << 15) // (WDTC) Watchdog Disable +#define AT91C_SYSC_WDD ((unsigned int) 0xFFF << 16) // (WDTC) Watchdog Delta Value +#define AT91C_SYSC_WDDBGHLT ((unsigned int) 0x1 << 28) // (WDTC) Watchdog Debug Halt +#define AT91C_SYSC_WDIDLEHLT ((unsigned int) 0x1 << 29) // (WDTC) Watchdog Idle Halt +// -------- SYSC_WDSR : (WDTC Offset: 0x8) Watchdog Status Register -------- +#define AT91C_SYSC_WDUNF ((unsigned int) 0x1 << 0) // (WDTC) Watchdog Underflow +#define AT91C_SYSC_WDERR ((unsigned int) 0x1 << 1) // (WDTC) Watchdog Error + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Memory Controller Interface +// ***************************************************************************** +typedef struct _AT91S_MC { + AT91_REG MC_RCR; // MC Remap Control Register + AT91_REG MC_ASR; // MC Abort Status Register + AT91_REG MC_AASR; // MC Abort Address Status Register + AT91_REG Reserved0[21]; // + AT91_REG MC_FMR; // MC Flash Mode Register + AT91_REG MC_FCR; // MC Flash Command Register + AT91_REG MC_FSR; // MC Flash Status Register +} AT91S_MC, *AT91PS_MC; + +// -------- MC_RCR : (MC Offset: 0x0) MC Remap Control Register -------- +#define AT91C_MC_RCB ((unsigned int) 0x1 << 0) // (MC) Remap Command Bit +// -------- MC_ASR : (MC Offset: 0x4) MC Abort Status Register -------- +#define AT91C_MC_UNDADD ((unsigned int) 0x1 << 0) // (MC) Undefined Addess Abort Status +#define AT91C_MC_MISADD ((unsigned int) 0x1 << 1) // (MC) Misaligned Addess Abort Status +#define AT91C_MC_ABTSZ ((unsigned int) 0x3 << 8) // (MC) Abort Size Status +#define AT91C_MC_ABTSZ_BYTE ((unsigned int) 0x0 << 8) // (MC) Byte +#define AT91C_MC_ABTSZ_HWORD ((unsigned int) 0x1 << 8) // (MC) Half-word +#define AT91C_MC_ABTSZ_WORD ((unsigned int) 0x2 << 8) // (MC) Word +#define AT91C_MC_ABTTYP ((unsigned int) 0x3 << 10) // (MC) Abort Type Status +#define AT91C_MC_ABTTYP_DATAR ((unsigned int) 0x0 << 10) // (MC) Data Read +#define AT91C_MC_ABTTYP_DATAW ((unsigned int) 0x1 << 10) // (MC) Data Write +#define AT91C_MC_ABTTYP_FETCH ((unsigned int) 0x2 << 10) // (MC) Code Fetch +#define AT91C_MC_MST0 ((unsigned int) 0x1 << 16) // (MC) Master 0 Abort Source +#define AT91C_MC_MST1 ((unsigned int) 0x1 << 17) // (MC) Master 1 Abort Source +#define AT91C_MC_SVMST0 ((unsigned int) 0x1 << 24) // (MC) Saved Master 0 Abort Source +#define AT91C_MC_SVMST1 ((unsigned int) 0x1 << 25) // (MC) Saved Master 1 Abort Source +// -------- MC_FMR : (MC Offset: 0x60) MC Flash Mode Register -------- +#define AT91C_MC_FRDY ((unsigned int) 0x1 << 0) // (MC) Flash Ready +#define AT91C_MC_LOCKE ((unsigned int) 0x1 << 2) // (MC) Lock Error +#define AT91C_MC_PROGE ((unsigned int) 0x1 << 3) // (MC) Programming Error +#define AT91C_MC_NEBP ((unsigned int) 0x1 << 7) // (MC) No Erase Before Programming +#define AT91C_MC_FWS ((unsigned int) 0x3 << 8) // (MC) Flash Wait State +#define AT91C_MC_FWS_0FWS ((unsigned int) 0x0 << 8) // (MC) 1 cycle for Read, 2 for Write operations +#define AT91C_MC_FWS_1FWS ((unsigned int) 0x1 << 8) // (MC) 2 cycles for Read, 3 for Write operations +#define AT91C_MC_FWS_2FWS ((unsigned int) 0x2 << 8) // (MC) 3 cycles for Read, 4 for Write operations +#define AT91C_MC_FWS_3FWS ((unsigned int) 0x3 << 8) // (MC) 4 cycles for Read, 4 for Write operations +#define AT91C_MC_FMCN ((unsigned int) 0xFF << 16) // (MC) Flash Microsecond Cycle Number +// -------- MC_FCR : (MC Offset: 0x64) MC Flash Command Register -------- +#define AT91C_MC_FCMD ((unsigned int) 0xF << 0) // (MC) Flash Command +#define AT91C_MC_FCMD_START_PROG ((unsigned int) 0x1) // (MC) Starts the programming of th epage specified by PAGEN. +#define AT91C_MC_FCMD_LOCK ((unsigned int) 0x2) // (MC) Starts a lock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. +#define AT91C_MC_FCMD_PROG_AND_LOCK ((unsigned int) 0x3) // (MC) The lock sequence automatically happens after the programming sequence is completed. +#define AT91C_MC_FCMD_UNLOCK ((unsigned int) 0x4) // (MC) Starts an unlock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. +#define AT91C_MC_FCMD_ERASE_ALL ((unsigned int) 0x8) // (MC) Starts the erase of the entire flash.If at least a page is locked, the command is cancelled. +#define AT91C_MC_FCMD_SET_GP_NVM ((unsigned int) 0xB) // (MC) Set General Purpose NVM bits. +#define AT91C_MC_FCMD_CLR_GP_NVM ((unsigned int) 0xD) // (MC) Clear General Purpose NVM bits. +#define AT91C_MC_FCMD_SET_SECURITY ((unsigned int) 0xF) // (MC) Set Security Bit. +#define AT91C_MC_PAGEN ((unsigned int) 0x3FF << 8) // (MC) Page Number +#define AT91C_MC_KEY ((unsigned int) 0xFF << 24) // (MC) Writing Protect Key +// -------- MC_FSR : (MC Offset: 0x68) MC Flash Command Register -------- +#define AT91C_MC_SECURITY ((unsigned int) 0x1 << 4) // (MC) Security Bit Status +#define AT91C_MC_GPNVM0 ((unsigned int) 0x1 << 8) // (MC) Sector 0 Lock Status +#define AT91C_MC_GPNVM1 ((unsigned int) 0x1 << 9) // (MC) Sector 1 Lock Status +#define AT91C_MC_GPNVM2 ((unsigned int) 0x1 << 10) // (MC) Sector 2 Lock Status +#define AT91C_MC_GPNVM3 ((unsigned int) 0x1 << 11) // (MC) Sector 3 Lock Status +#define AT91C_MC_GPNVM4 ((unsigned int) 0x1 << 12) // (MC) Sector 4 Lock Status +#define AT91C_MC_GPNVM5 ((unsigned int) 0x1 << 13) // (MC) Sector 5 Lock Status +#define AT91C_MC_GPNVM6 ((unsigned int) 0x1 << 14) // (MC) Sector 6 Lock Status +#define AT91C_MC_GPNVM7 ((unsigned int) 0x1 << 15) // (MC) Sector 7 Lock Status +#define AT91C_MC_LOCKS0 ((unsigned int) 0x1 << 16) // (MC) Sector 0 Lock Status +#define AT91C_MC_LOCKS1 ((unsigned int) 0x1 << 17) // (MC) Sector 1 Lock Status +#define AT91C_MC_LOCKS2 ((unsigned int) 0x1 << 18) // (MC) Sector 2 Lock Status +#define AT91C_MC_LOCKS3 ((unsigned int) 0x1 << 19) // (MC) Sector 3 Lock Status +#define AT91C_MC_LOCKS4 ((unsigned int) 0x1 << 20) // (MC) Sector 4 Lock Status +#define AT91C_MC_LOCKS5 ((unsigned int) 0x1 << 21) // (MC) Sector 5 Lock Status +#define AT91C_MC_LOCKS6 ((unsigned int) 0x1 << 22) // (MC) Sector 6 Lock Status +#define AT91C_MC_LOCKS7 ((unsigned int) 0x1 << 23) // (MC) Sector 7 Lock Status +#define AT91C_MC_LOCKS8 ((unsigned int) 0x1 << 24) // (MC) Sector 8 Lock Status +#define AT91C_MC_LOCKS9 ((unsigned int) 0x1 << 25) // (MC) Sector 9 Lock Status +#define AT91C_MC_LOCKS10 ((unsigned int) 0x1 << 26) // (MC) Sector 10 Lock Status +#define AT91C_MC_LOCKS11 ((unsigned int) 0x1 << 27) // (MC) Sector 11 Lock Status +#define AT91C_MC_LOCKS12 ((unsigned int) 0x1 << 28) // (MC) Sector 12 Lock Status +#define AT91C_MC_LOCKS13 ((unsigned int) 0x1 << 29) // (MC) Sector 13 Lock Status +#define AT91C_MC_LOCKS14 ((unsigned int) 0x1 << 30) // (MC) Sector 14 Lock Status +#define AT91C_MC_LOCKS15 ((unsigned int) 0x1 << 31) // (MC) Sector 15 Lock Status + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Serial Parallel Interface +// ***************************************************************************** +typedef struct _AT91S_SPI { + AT91_REG SPI_CR; // Control Register + AT91_REG SPI_MR; // Mode Register + AT91_REG SPI_RDR; // Receive Data Register + AT91_REG SPI_TDR; // Transmit Data Register + AT91_REG SPI_SR; // Status Register + AT91_REG SPI_IER; // Interrupt Enable Register + AT91_REG SPI_IDR; // Interrupt Disable Register + AT91_REG SPI_IMR; // Interrupt Mask Register + AT91_REG Reserved0[4]; // + AT91_REG SPI_CSR[4]; // Chip Select Register + AT91_REG Reserved1[48]; // + AT91_REG SPI_RPR; // Receive Pointer Register + AT91_REG SPI_RCR; // Receive Counter Register + AT91_REG SPI_TPR; // Transmit Pointer Register + AT91_REG SPI_TCR; // Transmit Counter Register + AT91_REG SPI_RNPR; // Receive Next Pointer Register + AT91_REG SPI_RNCR; // Receive Next Counter Register + AT91_REG SPI_TNPR; // Transmit Next Pointer Register + AT91_REG SPI_TNCR; // Transmit Next Counter Register + AT91_REG SPI_PTCR; // PDC Transfer Control Register + AT91_REG SPI_PTSR; // PDC Transfer Status Register +} AT91S_SPI, *AT91PS_SPI; + +// -------- SPI_CR : (SPI Offset: 0x0) SPI Control Register -------- +#define AT91C_SPI_SPIEN ((unsigned int) 0x1 << 0) // (SPI) SPI Enable +#define AT91C_SPI_SPIDIS ((unsigned int) 0x1 << 1) // (SPI) SPI Disable +#define AT91C_SPI_SWRST ((unsigned int) 0x1 << 7) // (SPI) SPI Software reset +#define AT91C_SPI_LASTXFER ((unsigned int) 0x1 << 24) // (SPI) SPI Last Transfer +// -------- SPI_MR : (SPI Offset: 0x4) SPI Mode Register -------- +#define AT91C_SPI_MSTR ((unsigned int) 0x1 << 0) // (SPI) Master/Slave Mode +#define AT91C_SPI_PS ((unsigned int) 0x1 << 1) // (SPI) Peripheral Select +#define AT91C_SPI_PS_FIXED ((unsigned int) 0x0 << 1) // (SPI) Fixed Peripheral Select +#define AT91C_SPI_PS_VARIABLE ((unsigned int) 0x1 << 1) // (SPI) Variable Peripheral Select +#define AT91C_SPI_PCSDEC ((unsigned int) 0x1 << 2) // (SPI) Chip Select Decode +#define AT91C_SPI_FDIV ((unsigned int) 0x1 << 3) // (SPI) Clock Selection +#define AT91C_SPI_MODFDIS ((unsigned int) 0x1 << 4) // (SPI) Mode Fault Detection +#define AT91C_SPI_LLB ((unsigned int) 0x1 << 7) // (SPI) Clock Selection +#define AT91C_SPI_PCS ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select +#define AT91C_SPI_DLYBCS ((unsigned int) 0xFF << 24) // (SPI) Delay Between Chip Selects +// -------- SPI_RDR : (SPI Offset: 0x8) Receive Data Register -------- +#define AT91C_SPI_RD ((unsigned int) 0xFFFF << 0) // (SPI) Receive Data +#define AT91C_SPI_RPCS ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select Status +// -------- SPI_TDR : (SPI Offset: 0xc) Transmit Data Register -------- +#define AT91C_SPI_TD ((unsigned int) 0xFFFF << 0) // (SPI) Transmit Data +#define AT91C_SPI_TPCS ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select Status +// -------- SPI_SR : (SPI Offset: 0x10) Status Register -------- +#define AT91C_SPI_RDRF ((unsigned int) 0x1 << 0) // (SPI) Receive Data Register Full +#define AT91C_SPI_TDRE ((unsigned int) 0x1 << 1) // (SPI) Transmit Data Register Empty +#define AT91C_SPI_MODF ((unsigned int) 0x1 << 2) // (SPI) Mode Fault Error +#define AT91C_SPI_OVRES ((unsigned int) 0x1 << 3) // (SPI) Overrun Error Status +#define AT91C_SPI_ENDRX ((unsigned int) 0x1 << 4) // (SPI) End of Receiver Transfer +#define AT91C_SPI_ENDTX ((unsigned int) 0x1 << 5) // (SPI) End of Receiver Transfer +#define AT91C_SPI_RXBUFF ((unsigned int) 0x1 << 6) // (SPI) RXBUFF Interrupt +#define AT91C_SPI_TXBUFE ((unsigned int) 0x1 << 7) // (SPI) TXBUFE Interrupt +#define AT91C_SPI_NSSR ((unsigned int) 0x1 << 8) // (SPI) NSSR Interrupt +#define AT91C_SPI_TXEMPTY ((unsigned int) 0x1 << 9) // (SPI) TXEMPTY Interrupt +#define AT91C_SPI_SPIENS ((unsigned int) 0x1 << 16) // (SPI) Enable Status +// -------- SPI_IER : (SPI Offset: 0x14) Interrupt Enable Register -------- +// -------- SPI_IDR : (SPI Offset: 0x18) Interrupt Disable Register -------- +// -------- SPI_IMR : (SPI Offset: 0x1c) Interrupt Mask Register -------- +// -------- SPI_CSR : (SPI Offset: 0x30) Chip Select Register -------- +#define AT91C_SPI_CPOL ((unsigned int) 0x1 << 0) // (SPI) Clock Polarity +#define AT91C_SPI_NCPHA ((unsigned int) 0x1 << 1) // (SPI) Clock Phase +#define AT91C_SPI_CSAAT ((unsigned int) 0x1 << 2) // (SPI) Chip Select Active After Transfer +#define AT91C_SPI_BITS ((unsigned int) 0xF << 4) // (SPI) Bits Per Transfer +#define AT91C_SPI_BITS_8 ((unsigned int) 0x0 << 4) // (SPI) 8 Bits Per transfer +#define AT91C_SPI_BITS_9 ((unsigned int) 0x1 << 4) // (SPI) 9 Bits Per transfer +#define AT91C_SPI_BITS_10 ((unsigned int) 0x2 << 4) // (SPI) 10 Bits Per transfer +#define AT91C_SPI_BITS_11 ((unsigned int) 0x3 << 4) // (SPI) 11 Bits Per transfer +#define AT91C_SPI_BITS_12 ((unsigned int) 0x4 << 4) // (SPI) 12 Bits Per transfer +#define AT91C_SPI_BITS_13 ((unsigned int) 0x5 << 4) // (SPI) 13 Bits Per transfer +#define AT91C_SPI_BITS_14 ((unsigned int) 0x6 << 4) // (SPI) 14 Bits Per transfer +#define AT91C_SPI_BITS_15 ((unsigned int) 0x7 << 4) // (SPI) 15 Bits Per transfer +#define AT91C_SPI_BITS_16 ((unsigned int) 0x8 << 4) // (SPI) 16 Bits Per transfer +#define AT91C_SPI_SCBR ((unsigned int) 0xFF << 8) // (SPI) Serial Clock Baud Rate +#define AT91C_SPI_DLYBS ((unsigned int) 0xFF << 16) // (SPI) Serial Clock Baud Rate +#define AT91C_SPI_DLYBCT ((unsigned int) 0xFF << 24) // (SPI) Delay Between Consecutive Transfers + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Analog to Digital Convertor +// ***************************************************************************** +typedef struct _AT91S_ADC { + AT91_REG ADC_CR; // ADC Control Register + AT91_REG ADC_MR; // ADC Mode Register + AT91_REG Reserved0[2]; // + AT91_REG ADC_CHER; // ADC Channel Enable Register + AT91_REG ADC_CHDR; // ADC Channel Disable Register + AT91_REG ADC_CHSR; // ADC Channel Status Register + AT91_REG ADC_SR; // ADC Status Register + AT91_REG ADC_LCDR; // ADC Last Converted Data Register + AT91_REG ADC_IER; // ADC Interrupt Enable Register + AT91_REG ADC_IDR; // ADC Interrupt Disable Register + AT91_REG ADC_IMR; // ADC Interrupt Mask Register + AT91_REG ADC_CDR0; // ADC Channel Data Register 0 + AT91_REG ADC_CDR1; // ADC Channel Data Register 1 + AT91_REG ADC_CDR2; // ADC Channel Data Register 2 + AT91_REG ADC_CDR3; // ADC Channel Data Register 3 + AT91_REG ADC_CDR4; // ADC Channel Data Register 4 + AT91_REG ADC_CDR5; // ADC Channel Data Register 5 + AT91_REG ADC_CDR6; // ADC Channel Data Register 6 + AT91_REG ADC_CDR7; // ADC Channel Data Register 7 + AT91_REG Reserved1[44]; // + AT91_REG ADC_RPR; // Receive Pointer Register + AT91_REG ADC_RCR; // Receive Counter Register + AT91_REG ADC_TPR; // Transmit Pointer Register + AT91_REG ADC_TCR; // Transmit Counter Register + AT91_REG ADC_RNPR; // Receive Next Pointer Register + AT91_REG ADC_RNCR; // Receive Next Counter Register + AT91_REG ADC_TNPR; // Transmit Next Pointer Register + AT91_REG ADC_TNCR; // Transmit Next Counter Register + AT91_REG ADC_PTCR; // PDC Transfer Control Register + AT91_REG ADC_PTSR; // PDC Transfer Status Register +} AT91S_ADC, *AT91PS_ADC; + +// -------- ADC_CR : (ADC Offset: 0x0) ADC Control Register -------- +#define AT91C_ADC_SWRST ((unsigned int) 0x1 << 0) // (ADC) Software Reset +#define AT91C_ADC_START ((unsigned int) 0x1 << 1) // (ADC) Start Conversion +// -------- ADC_MR : (ADC Offset: 0x4) ADC Mode Register -------- +#define AT91C_ADC_TRGEN ((unsigned int) 0x1 << 0) // (ADC) Trigger Enable +#define AT91C_ADC_TRGEN_DIS ((unsigned int) 0x0) // (ADC) Hradware triggers are disabled. Starting a conversion is only possible by software +#define AT91C_ADC_TRGEN_EN ((unsigned int) 0x1) // (ADC) Hardware trigger selected by TRGSEL field is enabled. +#define AT91C_ADC_TRGSEL ((unsigned int) 0x7 << 1) // (ADC) Trigger Selection +#define AT91C_ADC_TRGSEL_TIOA0 ((unsigned int) 0x0 << 1) // (ADC) Selected TRGSEL = TIAO0 +#define AT91C_ADC_TRGSEL_TIOA1 ((unsigned int) 0x1 << 1) // (ADC) Selected TRGSEL = TIAO1 +#define AT91C_ADC_TRGSEL_TIOA2 ((unsigned int) 0x2 << 1) // (ADC) Selected TRGSEL = TIAO2 +#define AT91C_ADC_TRGSEL_TIOA3 ((unsigned int) 0x3 << 1) // (ADC) Selected TRGSEL = TIAO3 +#define AT91C_ADC_TRGSEL_TIOA4 ((unsigned int) 0x4 << 1) // (ADC) Selected TRGSEL = TIAO4 +#define AT91C_ADC_TRGSEL_TIOA5 ((unsigned int) 0x5 << 1) // (ADC) Selected TRGSEL = TIAO5 +#define AT91C_ADC_TRGSEL_EXT ((unsigned int) 0x6 << 1) // (ADC) Selected TRGSEL = External Trigger +#define AT91C_ADC_LOWRES ((unsigned int) 0x1 << 4) // (ADC) Resolution. +#define AT91C_ADC_LOWRES_10_BIT ((unsigned int) 0x0 << 4) // (ADC) 10-bit resolution +#define AT91C_ADC_LOWRES_8_BIT ((unsigned int) 0x1 << 4) // (ADC) 8-bit resolution +#define AT91C_ADC_SLEEP ((unsigned int) 0x1 << 5) // (ADC) Sleep Mode +#define AT91C_ADC_SLEEP_NORMAL_MODE ((unsigned int) 0x0 << 5) // (ADC) Normal Mode +#define AT91C_ADC_SLEEP_MODE ((unsigned int) 0x1 << 5) // (ADC) Sleep Mode +#define AT91C_ADC_PRESCAL ((unsigned int) 0x3F << 8) // (ADC) Prescaler rate selection +#define AT91C_ADC_STARTUP ((unsigned int) 0x1F << 16) // (ADC) Startup Time +#define AT91C_ADC_SHTIM ((unsigned int) 0xF << 24) // (ADC) Sample & Hold Time +// -------- ADC_CHER : (ADC Offset: 0x10) ADC Channel Enable Register -------- +#define AT91C_ADC_CH0 ((unsigned int) 0x1 << 0) // (ADC) Channel 0 +#define AT91C_ADC_CH1 ((unsigned int) 0x1 << 1) // (ADC) Channel 1 +#define AT91C_ADC_CH2 ((unsigned int) 0x1 << 2) // (ADC) Channel 2 +#define AT91C_ADC_CH3 ((unsigned int) 0x1 << 3) // (ADC) Channel 3 +#define AT91C_ADC_CH4 ((unsigned int) 0x1 << 4) // (ADC) Channel 4 +#define AT91C_ADC_CH5 ((unsigned int) 0x1 << 5) // (ADC) Channel 5 +#define AT91C_ADC_CH6 ((unsigned int) 0x1 << 6) // (ADC) Channel 6 +#define AT91C_ADC_CH7 ((unsigned int) 0x1 << 7) // (ADC) Channel 7 +// -------- ADC_CHDR : (ADC Offset: 0x14) ADC Channel Disable Register -------- +// -------- ADC_CHSR : (ADC Offset: 0x18) ADC Channel Status Register -------- +// -------- ADC_SR : (ADC Offset: 0x1c) ADC Status Register -------- +#define AT91C_ADC_EOC0 ((unsigned int) 0x1 << 0) // (ADC) End of Conversion +#define AT91C_ADC_EOC1 ((unsigned int) 0x1 << 1) // (ADC) End of Conversion +#define AT91C_ADC_EOC2 ((unsigned int) 0x1 << 2) // (ADC) End of Conversion +#define AT91C_ADC_EOC3 ((unsigned int) 0x1 << 3) // (ADC) End of Conversion +#define AT91C_ADC_EOC4 ((unsigned int) 0x1 << 4) // (ADC) End of Conversion +#define AT91C_ADC_EOC5 ((unsigned int) 0x1 << 5) // (ADC) End of Conversion +#define AT91C_ADC_EOC6 ((unsigned int) 0x1 << 6) // (ADC) End of Conversion +#define AT91C_ADC_EOC7 ((unsigned int) 0x1 << 7) // (ADC) End of Conversion +#define AT91C_ADC_OVRE0 ((unsigned int) 0x1 << 8) // (ADC) Overrun Error +#define AT91C_ADC_OVRE1 ((unsigned int) 0x1 << 9) // (ADC) Overrun Error +#define AT91C_ADC_OVRE2 ((unsigned int) 0x1 << 10) // (ADC) Overrun Error +#define AT91C_ADC_OVRE3 ((unsigned int) 0x1 << 11) // (ADC) Overrun Error +#define AT91C_ADC_OVRE4 ((unsigned int) 0x1 << 12) // (ADC) Overrun Error +#define AT91C_ADC_OVRE5 ((unsigned int) 0x1 << 13) // (ADC) Overrun Error +#define AT91C_ADC_OVRE6 ((unsigned int) 0x1 << 14) // (ADC) Overrun Error +#define AT91C_ADC_OVRE7 ((unsigned int) 0x1 << 15) // (ADC) Overrun Error +#define AT91C_ADC_DRDY ((unsigned int) 0x1 << 16) // (ADC) Data Ready +#define AT91C_ADC_GOVRE ((unsigned int) 0x1 << 17) // (ADC) General Overrun +#define AT91C_ADC_ENDRX ((unsigned int) 0x1 << 18) // (ADC) End of Receiver Transfer +#define AT91C_ADC_RXBUFF ((unsigned int) 0x1 << 19) // (ADC) RXBUFF Interrupt +// -------- ADC_LCDR : (ADC Offset: 0x20) ADC Last Converted Data Register -------- +#define AT91C_ADC_LDATA ((unsigned int) 0x3FF << 0) // (ADC) Last Data Converted +// -------- ADC_IER : (ADC Offset: 0x24) ADC Interrupt Enable Register -------- +// -------- ADC_IDR : (ADC Offset: 0x28) ADC Interrupt Disable Register -------- +// -------- ADC_IMR : (ADC Offset: 0x2c) ADC Interrupt Mask Register -------- +// -------- ADC_CDR0 : (ADC Offset: 0x30) ADC Channel Data Register 0 -------- +#define AT91C_ADC_DATA ((unsigned int) 0x3FF << 0) // (ADC) Converted Data +// -------- ADC_CDR1 : (ADC Offset: 0x34) ADC Channel Data Register 1 -------- +// -------- ADC_CDR2 : (ADC Offset: 0x38) ADC Channel Data Register 2 -------- +// -------- ADC_CDR3 : (ADC Offset: 0x3c) ADC Channel Data Register 3 -------- +// -------- ADC_CDR4 : (ADC Offset: 0x40) ADC Channel Data Register 4 -------- +// -------- ADC_CDR5 : (ADC Offset: 0x44) ADC Channel Data Register 5 -------- +// -------- ADC_CDR6 : (ADC Offset: 0x48) ADC Channel Data Register 6 -------- +// -------- ADC_CDR7 : (ADC Offset: 0x4c) ADC Channel Data Register 7 -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Synchronous Serial Controller Interface +// ***************************************************************************** +typedef struct _AT91S_SSC { + AT91_REG SSC_CR; // Control Register + AT91_REG SSC_CMR; // Clock Mode Register + AT91_REG Reserved0[2]; // + AT91_REG SSC_RCMR; // Receive Clock ModeRegister + AT91_REG SSC_RFMR; // Receive Frame Mode Register + AT91_REG SSC_TCMR; // Transmit Clock Mode Register + AT91_REG SSC_TFMR; // Transmit Frame Mode Register + AT91_REG SSC_RHR; // Receive Holding Register + AT91_REG SSC_THR; // Transmit Holding Register + AT91_REG Reserved1[2]; // + AT91_REG SSC_RSHR; // Receive Sync Holding Register + AT91_REG SSC_TSHR; // Transmit Sync Holding Register + AT91_REG SSC_RC0R; // Receive Compare 0 Register + AT91_REG SSC_RC1R; // Receive Compare 1 Register + AT91_REG SSC_SR; // Status Register + AT91_REG SSC_IER; // Interrupt Enable Register + AT91_REG SSC_IDR; // Interrupt Disable Register + AT91_REG SSC_IMR; // Interrupt Mask Register + AT91_REG Reserved2[44]; // + AT91_REG SSC_RPR; // Receive Pointer Register + AT91_REG SSC_RCR; // Receive Counter Register + AT91_REG SSC_TPR; // Transmit Pointer Register + AT91_REG SSC_TCR; // Transmit Counter Register + AT91_REG SSC_RNPR; // Receive Next Pointer Register + AT91_REG SSC_RNCR; // Receive Next Counter Register + AT91_REG SSC_TNPR; // Transmit Next Pointer Register + AT91_REG SSC_TNCR; // Transmit Next Counter Register + AT91_REG SSC_PTCR; // PDC Transfer Control Register + AT91_REG SSC_PTSR; // PDC Transfer Status Register +} AT91S_SSC, *AT91PS_SSC; + +// -------- SSC_CR : (SSC Offset: 0x0) SSC Control Register -------- +#define AT91C_SSC_RXEN ((unsigned int) 0x1 << 0) // (SSC) Receive Enable +#define AT91C_SSC_RXDIS ((unsigned int) 0x1 << 1) // (SSC) Receive Disable +#define AT91C_SSC_TXEN ((unsigned int) 0x1 << 8) // (SSC) Transmit Enable +#define AT91C_SSC_TXDIS ((unsigned int) 0x1 << 9) // (SSC) Transmit Disable +#define AT91C_SSC_SWRST ((unsigned int) 0x1 << 15) // (SSC) Software Reset +// -------- SSC_RCMR : (SSC Offset: 0x10) SSC Receive Clock Mode Register -------- +#define AT91C_SSC_CKS ((unsigned int) 0x3 << 0) // (SSC) Receive/Transmit Clock Selection +#define AT91C_SSC_CKS_DIV ((unsigned int) 0x0) // (SSC) Divided Clock +#define AT91C_SSC_CKS_TK ((unsigned int) 0x1) // (SSC) TK Clock signal +#define AT91C_SSC_CKS_RK ((unsigned int) 0x2) // (SSC) RK pin +#define AT91C_SSC_CKO ((unsigned int) 0x7 << 2) // (SSC) Receive/Transmit Clock Output Mode Selection +#define AT91C_SSC_CKO_NONE ((unsigned int) 0x0 << 2) // (SSC) Receive/Transmit Clock Output Mode: None RK pin: Input-only +#define AT91C_SSC_CKO_CONTINOUS ((unsigned int) 0x1 << 2) // (SSC) Continuous Receive/Transmit Clock RK pin: Output +#define AT91C_SSC_CKO_DATA_TX ((unsigned int) 0x2 << 2) // (SSC) Receive/Transmit Clock only during data transfers RK pin: Output +#define AT91C_SSC_CKI ((unsigned int) 0x1 << 5) // (SSC) Receive/Transmit Clock Inversion +#define AT91C_SSC_CKG ((unsigned int) 0x3 << 6) // (SSC) Receive/Transmit Clock Gating Selection +#define AT91C_SSC_CKG_NONE ((unsigned int) 0x0 << 6) // (SSC) Receive/Transmit Clock Gating: None, continuous clock +#define AT91C_SSC_CKG_LOW ((unsigned int) 0x1 << 6) // (SSC) Receive/Transmit Clock enabled only if RF Low +#define AT91C_SSC_CKG_HIGH ((unsigned int) 0x2 << 6) // (SSC) Receive/Transmit Clock enabled only if RF High +#define AT91C_SSC_START ((unsigned int) 0xF << 8) // (SSC) Receive/Transmit Start Selection +#define AT91C_SSC_START_CONTINOUS ((unsigned int) 0x0 << 8) // (SSC) Continuous, as soon as the receiver is enabled, and immediately after the end of transfer of the previous data. +#define AT91C_SSC_START_TX ((unsigned int) 0x1 << 8) // (SSC) Transmit/Receive start +#define AT91C_SSC_START_LOW_RF ((unsigned int) 0x2 << 8) // (SSC) Detection of a low level on RF input +#define AT91C_SSC_START_HIGH_RF ((unsigned int) 0x3 << 8) // (SSC) Detection of a high level on RF input +#define AT91C_SSC_START_FALL_RF ((unsigned int) 0x4 << 8) // (SSC) Detection of a falling edge on RF input +#define AT91C_SSC_START_RISE_RF ((unsigned int) 0x5 << 8) // (SSC) Detection of a rising edge on RF input +#define AT91C_SSC_START_LEVEL_RF ((unsigned int) 0x6 << 8) // (SSC) Detection of any level change on RF input +#define AT91C_SSC_START_EDGE_RF ((unsigned int) 0x7 << 8) // (SSC) Detection of any edge on RF input +#define AT91C_SSC_START_0 ((unsigned int) 0x8 << 8) // (SSC) Compare 0 +#define AT91C_SSC_STOP ((unsigned int) 0x1 << 12) // (SSC) Receive Stop Selection +#define AT91C_SSC_STTOUT ((unsigned int) 0x1 << 15) // (SSC) Receive/Transmit Start Output Selection +#define AT91C_SSC_STTDLY ((unsigned int) 0xFF << 16) // (SSC) Receive/Transmit Start Delay +#define AT91C_SSC_PERIOD ((unsigned int) 0xFF << 24) // (SSC) Receive/Transmit Period Divider Selection +// -------- SSC_RFMR : (SSC Offset: 0x14) SSC Receive Frame Mode Register -------- +#define AT91C_SSC_DATLEN ((unsigned int) 0x1F << 0) // (SSC) Data Length +#define AT91C_SSC_LOOP ((unsigned int) 0x1 << 5) // (SSC) Loop Mode +#define AT91C_SSC_MSBF ((unsigned int) 0x1 << 7) // (SSC) Most Significant Bit First +#define AT91C_SSC_DATNB ((unsigned int) 0xF << 8) // (SSC) Data Number per Frame +#define AT91C_SSC_FSLEN ((unsigned int) 0xF << 16) // (SSC) Receive/Transmit Frame Sync length +#define AT91C_SSC_FSOS ((unsigned int) 0x7 << 20) // (SSC) Receive/Transmit Frame Sync Output Selection +#define AT91C_SSC_FSOS_NONE ((unsigned int) 0x0 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: None RK pin Input-only +#define AT91C_SSC_FSOS_NEGATIVE ((unsigned int) 0x1 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Negative Pulse +#define AT91C_SSC_FSOS_POSITIVE ((unsigned int) 0x2 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Positive Pulse +#define AT91C_SSC_FSOS_LOW ((unsigned int) 0x3 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver Low during data transfer +#define AT91C_SSC_FSOS_HIGH ((unsigned int) 0x4 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver High during data transfer +#define AT91C_SSC_FSOS_TOGGLE ((unsigned int) 0x5 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Toggling at each start of data transfer +#define AT91C_SSC_FSEDGE ((unsigned int) 0x1 << 24) // (SSC) Frame Sync Edge Detection +// -------- SSC_TCMR : (SSC Offset: 0x18) SSC Transmit Clock Mode Register -------- +// -------- SSC_TFMR : (SSC Offset: 0x1c) SSC Transmit Frame Mode Register -------- +#define AT91C_SSC_DATDEF ((unsigned int) 0x1 << 5) // (SSC) Data Default Value +#define AT91C_SSC_FSDEN ((unsigned int) 0x1 << 23) // (SSC) Frame Sync Data Enable +// -------- SSC_SR : (SSC Offset: 0x40) SSC Status Register -------- +#define AT91C_SSC_TXRDY ((unsigned int) 0x1 << 0) // (SSC) Transmit Ready +#define AT91C_SSC_TXEMPTY ((unsigned int) 0x1 << 1) // (SSC) Transmit Empty +#define AT91C_SSC_ENDTX ((unsigned int) 0x1 << 2) // (SSC) End Of Transmission +#define AT91C_SSC_TXBUFE ((unsigned int) 0x1 << 3) // (SSC) Transmit Buffer Empty +#define AT91C_SSC_RXRDY ((unsigned int) 0x1 << 4) // (SSC) Receive Ready +#define AT91C_SSC_OVRUN ((unsigned int) 0x1 << 5) // (SSC) Receive Overrun +#define AT91C_SSC_ENDRX ((unsigned int) 0x1 << 6) // (SSC) End of Reception +#define AT91C_SSC_RXBUFF ((unsigned int) 0x1 << 7) // (SSC) Receive Buffer Full +#define AT91C_SSC_CP0 ((unsigned int) 0x1 << 8) // (SSC) Compare 0 +#define AT91C_SSC_CP1 ((unsigned int) 0x1 << 9) // (SSC) Compare 1 +#define AT91C_SSC_TXSYN ((unsigned int) 0x1 << 10) // (SSC) Transmit Sync +#define AT91C_SSC_RXSYN ((unsigned int) 0x1 << 11) // (SSC) Receive Sync +#define AT91C_SSC_TXENA ((unsigned int) 0x1 << 16) // (SSC) Transmit Enable +#define AT91C_SSC_RXENA ((unsigned int) 0x1 << 17) // (SSC) Receive Enable +// -------- SSC_IER : (SSC Offset: 0x44) SSC Interrupt Enable Register -------- +// -------- SSC_IDR : (SSC Offset: 0x48) SSC Interrupt Disable Register -------- +// -------- SSC_IMR : (SSC Offset: 0x4c) SSC Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Usart +// ***************************************************************************** +typedef struct _AT91S_USART { + AT91_REG US_CR; // Control Register + AT91_REG US_MR; // Mode Register + AT91_REG US_IER; // Interrupt Enable Register + AT91_REG US_IDR; // Interrupt Disable Register + AT91_REG US_IMR; // Interrupt Mask Register + AT91_REG US_CSR; // Channel Status Register + AT91_REG US_RHR; // Receiver Holding Register + AT91_REG US_THR; // Transmitter Holding Register + AT91_REG US_BRGR; // Baud Rate Generator Register + AT91_REG US_RTOR; // Receiver Time-out Register + AT91_REG US_TTGR; // Transmitter Time-guard Register + AT91_REG Reserved0[5]; // + AT91_REG US_FIDI; // FI_DI_Ratio Register + AT91_REG US_NER; // Nb Errors Register + AT91_REG US_XXR; // XON_XOFF Register + AT91_REG US_IF; // IRDA_FILTER Register + AT91_REG Reserved1[44]; // + AT91_REG US_RPR; // Receive Pointer Register + AT91_REG US_RCR; // Receive Counter Register + AT91_REG US_TPR; // Transmit Pointer Register + AT91_REG US_TCR; // Transmit Counter Register + AT91_REG US_RNPR; // Receive Next Pointer Register + AT91_REG US_RNCR; // Receive Next Counter Register + AT91_REG US_TNPR; // Transmit Next Pointer Register + AT91_REG US_TNCR; // Transmit Next Counter Register + AT91_REG US_PTCR; // PDC Transfer Control Register + AT91_REG US_PTSR; // PDC Transfer Status Register +} AT91S_USART, *AT91PS_USART; + +// -------- US_CR : (USART Offset: 0x0) Debug Unit Control Register -------- +#define AT91C_US_RSTSTA ((unsigned int) 0x1 << 8) // (USART) Reset Status Bits +#define AT91C_US_STTBRK ((unsigned int) 0x1 << 9) // (USART) Start Break +#define AT91C_US_STPBRK ((unsigned int) 0x1 << 10) // (USART) Stop Break +#define AT91C_US_STTTO ((unsigned int) 0x1 << 11) // (USART) Start Time-out +#define AT91C_US_SENDA ((unsigned int) 0x1 << 12) // (USART) Send Address +#define AT91C_US_RSTIT ((unsigned int) 0x1 << 13) // (USART) Reset Iterations +#define AT91C_US_RSTNACK ((unsigned int) 0x1 << 14) // (USART) Reset Non Acknowledge +#define AT91C_US_RETTO ((unsigned int) 0x1 << 15) // (USART) Rearm Time-out +#define AT91C_US_DTREN ((unsigned int) 0x1 << 16) // (USART) Data Terminal ready Enable +#define AT91C_US_DTRDIS ((unsigned int) 0x1 << 17) // (USART) Data Terminal ready Disable +#define AT91C_US_RTSEN ((unsigned int) 0x1 << 18) // (USART) Request to Send enable +#define AT91C_US_RTSDIS ((unsigned int) 0x1 << 19) // (USART) Request to Send Disable +// -------- US_MR : (USART Offset: 0x4) Debug Unit Mode Register -------- +#define AT91C_US_USMODE ((unsigned int) 0xF << 0) // (USART) Usart mode +#define AT91C_US_USMODE_NORMAL ((unsigned int) 0x0) // (USART) Normal +#define AT91C_US_USMODE_RS485 ((unsigned int) 0x1) // (USART) RS485 +#define AT91C_US_USMODE_HWHSH ((unsigned int) 0x2) // (USART) Hardware Handshaking +#define AT91C_US_USMODE_MODEM ((unsigned int) 0x3) // (USART) Modem +#define AT91C_US_USMODE_ISO7816_0 ((unsigned int) 0x4) // (USART) ISO7816 protocol: T = 0 +#define AT91C_US_USMODE_ISO7816_1 ((unsigned int) 0x6) // (USART) ISO7816 protocol: T = 1 +#define AT91C_US_USMODE_IRDA ((unsigned int) 0x8) // (USART) IrDA +#define AT91C_US_USMODE_SWHSH ((unsigned int) 0xC) // (USART) Software Handshaking +#define AT91C_US_CLKS ((unsigned int) 0x3 << 4) // (USART) Clock Selection (Baud Rate generator Input Clock +#define AT91C_US_CLKS_CLOCK ((unsigned int) 0x0 << 4) // (USART) Clock +#define AT91C_US_CLKS_FDIV1 ((unsigned int) 0x1 << 4) // (USART) fdiv1 +#define AT91C_US_CLKS_SLOW ((unsigned int) 0x2 << 4) // (USART) slow_clock (ARM) +#define AT91C_US_CLKS_EXT ((unsigned int) 0x3 << 4) // (USART) External (SCK) +#define AT91C_US_CHRL ((unsigned int) 0x3 << 6) // (USART) Clock Selection (Baud Rate generator Input Clock +#define AT91C_US_CHRL_5_BITS ((unsigned int) 0x0 << 6) // (USART) Character Length: 5 bits +#define AT91C_US_CHRL_6_BITS ((unsigned int) 0x1 << 6) // (USART) Character Length: 6 bits +#define AT91C_US_CHRL_7_BITS ((unsigned int) 0x2 << 6) // (USART) Character Length: 7 bits +#define AT91C_US_CHRL_8_BITS ((unsigned int) 0x3 << 6) // (USART) Character Length: 8 bits +#define AT91C_US_SYNC ((unsigned int) 0x1 << 8) // (USART) Synchronous Mode Select +#define AT91C_US_NBSTOP ((unsigned int) 0x3 << 12) // (USART) Number of Stop bits +#define AT91C_US_NBSTOP_1_BIT ((unsigned int) 0x0 << 12) // (USART) 1 stop bit +#define AT91C_US_NBSTOP_15_BIT ((unsigned int) 0x1 << 12) // (USART) Asynchronous (SYNC=0) 2 stop bits Synchronous (SYNC=1) 2 stop bits +#define AT91C_US_NBSTOP_2_BIT ((unsigned int) 0x2 << 12) // (USART) 2 stop bits +#define AT91C_US_MSBF ((unsigned int) 0x1 << 16) // (USART) Bit Order +#define AT91C_US_MODE9 ((unsigned int) 0x1 << 17) // (USART) 9-bit Character length +#define AT91C_US_CKLO ((unsigned int) 0x1 << 18) // (USART) Clock Output Select +#define AT91C_US_OVER ((unsigned int) 0x1 << 19) // (USART) Over Sampling Mode +#define AT91C_US_INACK ((unsigned int) 0x1 << 20) // (USART) Inhibit Non Acknowledge +#define AT91C_US_DSNACK ((unsigned int) 0x1 << 21) // (USART) Disable Successive NACK +#define AT91C_US_MAX_ITER ((unsigned int) 0x1 << 24) // (USART) Number of Repetitions +#define AT91C_US_FILTER ((unsigned int) 0x1 << 28) // (USART) Receive Line Filter +// -------- US_IER : (USART Offset: 0x8) Debug Unit Interrupt Enable Register -------- +#define AT91C_US_RXBRK ((unsigned int) 0x1 << 2) // (USART) Break Received/End of Break +#define AT91C_US_TIMEOUT ((unsigned int) 0x1 << 8) // (USART) Receiver Time-out +#define AT91C_US_ITERATION ((unsigned int) 0x1 << 10) // (USART) Max number of Repetitions Reached +#define AT91C_US_NACK ((unsigned int) 0x1 << 13) // (USART) Non Acknowledge +#define AT91C_US_RIIC ((unsigned int) 0x1 << 16) // (USART) Ring INdicator Input Change Flag +#define AT91C_US_DSRIC ((unsigned int) 0x1 << 17) // (USART) Data Set Ready Input Change Flag +#define AT91C_US_DCDIC ((unsigned int) 0x1 << 18) // (USART) Data Carrier Flag +#define AT91C_US_CTSIC ((unsigned int) 0x1 << 19) // (USART) Clear To Send Input Change Flag +// -------- US_IDR : (USART Offset: 0xc) Debug Unit Interrupt Disable Register -------- +// -------- US_IMR : (USART Offset: 0x10) Debug Unit Interrupt Mask Register -------- +// -------- US_CSR : (USART Offset: 0x14) Debug Unit Channel Status Register -------- +#define AT91C_US_RI ((unsigned int) 0x1 << 20) // (USART) Image of RI Input +#define AT91C_US_DSR ((unsigned int) 0x1 << 21) // (USART) Image of DSR Input +#define AT91C_US_DCD ((unsigned int) 0x1 << 22) // (USART) Image of DCD Input +#define AT91C_US_CTS ((unsigned int) 0x1 << 23) // (USART) Image of CTS Input + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Two-wire Interface +// ***************************************************************************** +typedef struct _AT91S_TWI { + AT91_REG TWI_CR; // Control Register + AT91_REG TWI_MMR; // Master Mode Register + AT91_REG TWI_SMR; // Slave Mode Register + AT91_REG TWI_IADR; // Internal Address Register + AT91_REG TWI_CWGR; // Clock Waveform Generator Register + AT91_REG Reserved0[3]; // + AT91_REG TWI_SR; // Status Register + AT91_REG TWI_IER; // Interrupt Enable Register + AT91_REG TWI_IDR; // Interrupt Disable Register + AT91_REG TWI_IMR; // Interrupt Mask Register + AT91_REG TWI_RHR; // Receive Holding Register + AT91_REG TWI_THR; // Transmit Holding Register +} AT91S_TWI, *AT91PS_TWI; + +// -------- TWI_CR : (TWI Offset: 0x0) TWI Control Register -------- +#define AT91C_TWI_START ((unsigned int) 0x1 << 0) // (TWI) Send a START Condition +#define AT91C_TWI_STOP ((unsigned int) 0x1 << 1) // (TWI) Send a STOP Condition +#define AT91C_TWI_MSEN ((unsigned int) 0x1 << 2) // (TWI) TWI Master Transfer Enabled +#define AT91C_TWI_MSDIS ((unsigned int) 0x1 << 3) // (TWI) TWI Master Transfer Disabled +#define AT91C_TWI_SVEN ((unsigned int) 0x1 << 4) // (TWI) TWI Slave Transfer Enabled +#define AT91C_TWI_SVDIS ((unsigned int) 0x1 << 5) // (TWI) TWI Slave Transfer Disabled +#define AT91C_TWI_SWRST ((unsigned int) 0x1 << 7) // (TWI) Software Reset +// -------- TWI_MMR : (TWI Offset: 0x4) TWI Master Mode Register -------- +#define AT91C_TWI_IADRSZ ((unsigned int) 0x3 << 8) // (TWI) Internal Device Address Size +#define AT91C_TWI_IADRSZ_NO ((unsigned int) 0x0 << 8) // (TWI) No internal device address +#define AT91C_TWI_IADRSZ_1_BYTE ((unsigned int) 0x1 << 8) // (TWI) One-byte internal device address +#define AT91C_TWI_IADRSZ_2_BYTE ((unsigned int) 0x2 << 8) // (TWI) Two-byte internal device address +#define AT91C_TWI_IADRSZ_3_BYTE ((unsigned int) 0x3 << 8) // (TWI) Three-byte internal device address +#define AT91C_TWI_MREAD ((unsigned int) 0x1 << 12) // (TWI) Master Read Direction +#define AT91C_TWI_DADR ((unsigned int) 0x7F << 16) // (TWI) Device Address +// -------- TWI_SMR : (TWI Offset: 0x8) TWI Slave Mode Register -------- +#define AT91C_TWI_SADR ((unsigned int) 0x7F << 16) // (TWI) Slave Device Address +// -------- TWI_CWGR : (TWI Offset: 0x10) TWI Clock Waveform Generator Register -------- +#define AT91C_TWI_CLDIV ((unsigned int) 0xFF << 0) // (TWI) Clock Low Divider +#define AT91C_TWI_CHDIV ((unsigned int) 0xFF << 8) // (TWI) Clock High Divider +#define AT91C_TWI_CKDIV ((unsigned int) 0x7 << 16) // (TWI) Clock Divider +// -------- TWI_SR : (TWI Offset: 0x20) TWI Status Register -------- +#define AT91C_TWI_TXCOMP ((unsigned int) 0x1 << 0) // (TWI) Transmission Completed +#define AT91C_TWI_RXRDY ((unsigned int) 0x1 << 1) // (TWI) Receive holding register ReaDY +#define AT91C_TWI_TXRDY ((unsigned int) 0x1 << 2) // (TWI) Transmit holding register ReaDY +#define AT91C_TWI_SVREAD ((unsigned int) 0x1 << 3) // (TWI) Slave Read +#define AT91C_TWI_SVACC ((unsigned int) 0x1 << 4) // (TWI) Slave Access +#define AT91C_TWI_GCACC ((unsigned int) 0x1 << 5) // (TWI) General Call Access +#define AT91C_TWI_OVRE ((unsigned int) 0x1 << 6) // (TWI) Overrun Error +#define AT91C_TWI_UNRE ((unsigned int) 0x1 << 7) // (TWI) Underrun Error +#define AT91C_TWI_NACK ((unsigned int) 0x1 << 8) // (TWI) Not Acknowledged +#define AT91C_TWI_ARBLST ((unsigned int) 0x1 << 9) // (TWI) Arbitration Lost +// -------- TWI_IER : (TWI Offset: 0x24) TWI Interrupt Enable Register -------- +// -------- TWI_IDR : (TWI Offset: 0x28) TWI Interrupt Disable Register -------- +// -------- TWI_IMR : (TWI Offset: 0x2c) TWI Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Timer Counter Channel Interface +// ***************************************************************************** +typedef struct _AT91S_TC { + AT91_REG TC_CCR; // Channel Control Register + AT91_REG TC_CMR; // Channel Mode Register (Capture Mode / Waveform Mode) + AT91_REG Reserved0[2]; // + AT91_REG TC_CV; // Counter Value + AT91_REG TC_RA; // Register A + AT91_REG TC_RB; // Register B + AT91_REG TC_RC; // Register C + AT91_REG TC_SR; // Status Register + AT91_REG TC_IER; // Interrupt Enable Register + AT91_REG TC_IDR; // Interrupt Disable Register + AT91_REG TC_IMR; // Interrupt Mask Register +} AT91S_TC, *AT91PS_TC; + +// -------- TC_CCR : (TC Offset: 0x0) TC Channel Control Register -------- +#define AT91C_TC_CLKEN ((unsigned int) 0x1 << 0) // (TC) Counter Clock Enable Command +#define AT91C_TC_CLKDIS ((unsigned int) 0x1 << 1) // (TC) Counter Clock Disable Command +#define AT91C_TC_SWTRG ((unsigned int) 0x1 << 2) // (TC) Software Trigger Command +// -------- TC_CMR : (TC Offset: 0x4) TC Channel Mode Register: Capture Mode / Waveform Mode -------- +#define AT91C_TC_CLKS ((unsigned int) 0x7 << 0) // (TC) Clock Selection +#define AT91C_TC_CLKS_TIMER_DIV1_CLOCK ((unsigned int) 0x0) // (TC) Clock selected: TIMER_DIV1_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV2_CLOCK ((unsigned int) 0x1) // (TC) Clock selected: TIMER_DIV2_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV3_CLOCK ((unsigned int) 0x2) // (TC) Clock selected: TIMER_DIV3_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV4_CLOCK ((unsigned int) 0x3) // (TC) Clock selected: TIMER_DIV4_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV5_CLOCK ((unsigned int) 0x4) // (TC) Clock selected: TIMER_DIV5_CLOCK +#define AT91C_TC_CLKS_XC0 ((unsigned int) 0x5) // (TC) Clock selected: XC0 +#define AT91C_TC_CLKS_XC1 ((unsigned int) 0x6) // (TC) Clock selected: XC1 +#define AT91C_TC_CLKS_XC2 ((unsigned int) 0x7) // (TC) Clock selected: XC2 +#define AT91C_TC_CLKI ((unsigned int) 0x1 << 3) // (TC) Clock Invert +#define AT91C_TC_BURST ((unsigned int) 0x3 << 4) // (TC) Burst Signal Selection +#define AT91C_TC_BURST_NONE ((unsigned int) 0x0 << 4) // (TC) The clock is not gated by an external signal +#define AT91C_TC_BURST_XC0 ((unsigned int) 0x1 << 4) // (TC) XC0 is ANDed with the selected clock +#define AT91C_TC_BURST_XC1 ((unsigned int) 0x2 << 4) // (TC) XC1 is ANDed with the selected clock +#define AT91C_TC_BURST_XC2 ((unsigned int) 0x3 << 4) // (TC) XC2 is ANDed with the selected clock +#define AT91C_TC_CPCSTOP ((unsigned int) 0x1 << 6) // (TC) Counter Clock Stopped with RC Compare +#define AT91C_TC_LDBSTOP ((unsigned int) 0x1 << 6) // (TC) Counter Clock Stopped with RB Loading +#define AT91C_TC_LDBDIS ((unsigned int) 0x1 << 7) // (TC) Counter Clock Disabled with RB Loading +#define AT91C_TC_CPCDIS ((unsigned int) 0x1 << 7) // (TC) Counter Clock Disable with RC Compare +#define AT91C_TC_ETRGEDG ((unsigned int) 0x3 << 8) // (TC) External Trigger Edge Selection +#define AT91C_TC_ETRGEDG_NONE ((unsigned int) 0x0 << 8) // (TC) Edge: None +#define AT91C_TC_ETRGEDG_RISING ((unsigned int) 0x1 << 8) // (TC) Edge: rising edge +#define AT91C_TC_ETRGEDG_FALLING ((unsigned int) 0x2 << 8) // (TC) Edge: falling edge +#define AT91C_TC_ETRGEDG_BOTH ((unsigned int) 0x3 << 8) // (TC) Edge: each edge +#define AT91C_TC_EEVTEDG ((unsigned int) 0x3 << 8) // (TC) External Event Edge Selection +#define AT91C_TC_EEVTEDG_NONE ((unsigned int) 0x0 << 8) // (TC) Edge: None +#define AT91C_TC_EEVTEDG_RISING ((unsigned int) 0x1 << 8) // (TC) Edge: rising edge +#define AT91C_TC_EEVTEDG_FALLING ((unsigned int) 0x2 << 8) // (TC) Edge: falling edge +#define AT91C_TC_EEVTEDG_BOTH ((unsigned int) 0x3 << 8) // (TC) Edge: each edge +#define AT91C_TC_ABETRG ((unsigned int) 0x1 << 10) // (TC) TIOA or TIOB External Trigger Selection +#define AT91C_TC_EEVT ((unsigned int) 0x3 << 10) // (TC) External Event Selection +#define AT91C_TC_EEVT_NONE ((unsigned int) 0x0 << 10) // (TC) Signal selected as external event: TIOB TIOB direction: input +#define AT91C_TC_EEVT_RISING ((unsigned int) 0x1 << 10) // (TC) Signal selected as external event: XC0 TIOB direction: output +#define AT91C_TC_EEVT_FALLING ((unsigned int) 0x2 << 10) // (TC) Signal selected as external event: XC1 TIOB direction: output +#define AT91C_TC_EEVT_BOTH ((unsigned int) 0x3 << 10) // (TC) Signal selected as external event: XC2 TIOB direction: output +#define AT91C_TC_ENETRG ((unsigned int) 0x1 << 12) // (TC) External Event Trigger enable +#define AT91C_TC_WAVESEL ((unsigned int) 0x3 << 13) // (TC) Waveform Selection +#define AT91C_TC_WAVESEL_UP ((unsigned int) 0x0 << 13) // (TC) UP mode without atomatic trigger on RC Compare +#define AT91C_TC_WAVESEL_UPDOWN ((unsigned int) 0x1 << 13) // (TC) UPDOWN mode without automatic trigger on RC Compare +#define AT91C_TC_WAVESEL_UP_AUTO ((unsigned int) 0x2 << 13) // (TC) UP mode with automatic trigger on RC Compare +#define AT91C_TC_WAVESEL_UPDOWN_AUTO ((unsigned int) 0x3 << 13) // (TC) UPDOWN mode with automatic trigger on RC Compare +#define AT91C_TC_CPCTRG ((unsigned int) 0x1 << 14) // (TC) RC Compare Trigger Enable +#define AT91C_TC_WAVE ((unsigned int) 0x1 << 15) // (TC) +#define AT91C_TC_LDRA ((unsigned int) 0x3 << 16) // (TC) RA Loading Selection +#define AT91C_TC_LDRA_NONE ((unsigned int) 0x0 << 16) // (TC) Edge: None +#define AT91C_TC_LDRA_RISING ((unsigned int) 0x1 << 16) // (TC) Edge: rising edge of TIOA +#define AT91C_TC_LDRA_FALLING ((unsigned int) 0x2 << 16) // (TC) Edge: falling edge of TIOA +#define AT91C_TC_LDRA_BOTH ((unsigned int) 0x3 << 16) // (TC) Edge: each edge of TIOA +#define AT91C_TC_ACPA ((unsigned int) 0x3 << 16) // (TC) RA Compare Effect on TIOA +#define AT91C_TC_ACPA_NONE ((unsigned int) 0x0 << 16) // (TC) Effect: none +#define AT91C_TC_ACPA_SET ((unsigned int) 0x1 << 16) // (TC) Effect: set +#define AT91C_TC_ACPA_CLEAR ((unsigned int) 0x2 << 16) // (TC) Effect: clear +#define AT91C_TC_ACPA_TOGGLE ((unsigned int) 0x3 << 16) // (TC) Effect: toggle +#define AT91C_TC_LDRB ((unsigned int) 0x3 << 18) // (TC) RB Loading Selection +#define AT91C_TC_LDRB_NONE ((unsigned int) 0x0 << 18) // (TC) Edge: None +#define AT91C_TC_LDRB_RISING ((unsigned int) 0x1 << 18) // (TC) Edge: rising edge of TIOA +#define AT91C_TC_LDRB_FALLING ((unsigned int) 0x2 << 18) // (TC) Edge: falling edge of TIOA +#define AT91C_TC_LDRB_BOTH ((unsigned int) 0x3 << 18) // (TC) Edge: each edge of TIOA +#define AT91C_TC_ACPC ((unsigned int) 0x3 << 18) // (TC) RC Compare Effect on TIOA +#define AT91C_TC_ACPC_NONE ((unsigned int) 0x0 << 18) // (TC) Effect: none +#define AT91C_TC_ACPC_SET ((unsigned int) 0x1 << 18) // (TC) Effect: set +#define AT91C_TC_ACPC_CLEAR ((unsigned int) 0x2 << 18) // (TC) Effect: clear +#define AT91C_TC_ACPC_TOGGLE ((unsigned int) 0x3 << 18) // (TC) Effect: toggle +#define AT91C_TC_AEEVT ((unsigned int) 0x3 << 20) // (TC) External Event Effect on TIOA +#define AT91C_TC_AEEVT_NONE ((unsigned int) 0x0 << 20) // (TC) Effect: none +#define AT91C_TC_AEEVT_SET ((unsigned int) 0x1 << 20) // (TC) Effect: set +#define AT91C_TC_AEEVT_CLEAR ((unsigned int) 0x2 << 20) // (TC) Effect: clear +#define AT91C_TC_AEEVT_TOGGLE ((unsigned int) 0x3 << 20) // (TC) Effect: toggle +#define AT91C_TC_ASWTRG ((unsigned int) 0x3 << 22) // (TC) Software Trigger Effect on TIOA +#define AT91C_TC_ASWTRG_NONE ((unsigned int) 0x0 << 22) // (TC) Effect: none +#define AT91C_TC_ASWTRG_SET ((unsigned int) 0x1 << 22) // (TC) Effect: set +#define AT91C_TC_ASWTRG_CLEAR ((unsigned int) 0x2 << 22) // (TC) Effect: clear +#define AT91C_TC_ASWTRG_TOGGLE ((unsigned int) 0x3 << 22) // (TC) Effect: toggle +#define AT91C_TC_BCPB ((unsigned int) 0x3 << 24) // (TC) RB Compare Effect on TIOB +#define AT91C_TC_BCPB_NONE ((unsigned int) 0x0 << 24) // (TC) Effect: none +#define AT91C_TC_BCPB_SET ((unsigned int) 0x1 << 24) // (TC) Effect: set +#define AT91C_TC_BCPB_CLEAR ((unsigned int) 0x2 << 24) // (TC) Effect: clear +#define AT91C_TC_BCPB_TOGGLE ((unsigned int) 0x3 << 24) // (TC) Effect: toggle +#define AT91C_TC_BCPC ((unsigned int) 0x3 << 26) // (TC) RC Compare Effect on TIOB +#define AT91C_TC_BCPC_NONE ((unsigned int) 0x0 << 26) // (TC) Effect: none +#define AT91C_TC_BCPC_SET ((unsigned int) 0x1 << 26) // (TC) Effect: set +#define AT91C_TC_BCPC_CLEAR ((unsigned int) 0x2 << 26) // (TC) Effect: clear +#define AT91C_TC_BCPC_TOGGLE ((unsigned int) 0x3 << 26) // (TC) Effect: toggle +#define AT91C_TC_BEEVT ((unsigned int) 0x3 << 28) // (TC) External Event Effect on TIOB +#define AT91C_TC_BEEVT_NONE ((unsigned int) 0x0 << 28) // (TC) Effect: none +#define AT91C_TC_BEEVT_SET ((unsigned int) 0x1 << 28) // (TC) Effect: set +#define AT91C_TC_BEEVT_CLEAR ((unsigned int) 0x2 << 28) // (TC) Effect: clear +#define AT91C_TC_BEEVT_TOGGLE ((unsigned int) 0x3 << 28) // (TC) Effect: toggle +#define AT91C_TC_BSWTRG ((unsigned int) 0x3 << 30) // (TC) Software Trigger Effect on TIOB +#define AT91C_TC_BSWTRG_NONE ((unsigned int) 0x0 << 30) // (TC) Effect: none +#define AT91C_TC_BSWTRG_SET ((unsigned int) 0x1 << 30) // (TC) Effect: set +#define AT91C_TC_BSWTRG_CLEAR ((unsigned int) 0x2 << 30) // (TC) Effect: clear +#define AT91C_TC_BSWTRG_TOGGLE ((unsigned int) 0x3 << 30) // (TC) Effect: toggle +// -------- TC_SR : (TC Offset: 0x20) TC Channel Status Register -------- +#define AT91C_TC_COVFS ((unsigned int) 0x1 << 0) // (TC) Counter Overflow +#define AT91C_TC_LOVRS ((unsigned int) 0x1 << 1) // (TC) Load Overrun +#define AT91C_TC_CPAS ((unsigned int) 0x1 << 2) // (TC) RA Compare +#define AT91C_TC_CPBS ((unsigned int) 0x1 << 3) // (TC) RB Compare +#define AT91C_TC_CPCS ((unsigned int) 0x1 << 4) // (TC) RC Compare +#define AT91C_TC_LDRAS ((unsigned int) 0x1 << 5) // (TC) RA Loading +#define AT91C_TC_LDRBS ((unsigned int) 0x1 << 6) // (TC) RB Loading +#define AT91C_TC_ETRCS ((unsigned int) 0x1 << 7) // (TC) External Trigger +#define AT91C_TC_ETRGS ((unsigned int) 0x1 << 16) // (TC) Clock Enabling +#define AT91C_TC_MTIOA ((unsigned int) 0x1 << 17) // (TC) TIOA Mirror +#define AT91C_TC_MTIOB ((unsigned int) 0x1 << 18) // (TC) TIOA Mirror +// -------- TC_IER : (TC Offset: 0x24) TC Channel Interrupt Enable Register -------- +// -------- TC_IDR : (TC Offset: 0x28) TC Channel Interrupt Disable Register -------- +// -------- TC_IMR : (TC Offset: 0x2c) TC Channel Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Timer Counter Interface +// ***************************************************************************** +typedef struct _AT91S_TCB { + AT91S_TC TCB_TC0; // TC Channel 0 + AT91_REG Reserved0[4]; // + AT91S_TC TCB_TC1; // TC Channel 1 + AT91_REG Reserved1[4]; // + AT91S_TC TCB_TC2; // TC Channel 2 + AT91_REG Reserved2[4]; // + AT91_REG TCB_BCR; // TC Block Control Register + AT91_REG TCB_BMR; // TC Block Mode Register +} AT91S_TCB, *AT91PS_TCB; + +// -------- TCB_BCR : (TCB Offset: 0xc0) TC Block Control Register -------- +#define AT91C_TCB_SYNC ((unsigned int) 0x1 << 0) // (TCB) Synchro Command +// -------- TCB_BMR : (TCB Offset: 0xc4) TC Block Mode Register -------- +#define AT91C_TCB_TC0XC0S ((unsigned int) 0x1 << 0) // (TCB) External Clock Signal 0 Selection +#define AT91C_TCB_TC0XC0S_TCLK0 ((unsigned int) 0x0) // (TCB) TCLK0 connected to XC0 +#define AT91C_TCB_TC0XC0S_NONE ((unsigned int) 0x1) // (TCB) None signal connected to XC0 +#define AT91C_TCB_TC0XC0S_TIOA1 ((unsigned int) 0x2) // (TCB) TIOA1 connected to XC0 +#define AT91C_TCB_TC0XC0S_TIOA2 ((unsigned int) 0x3) // (TCB) TIOA2 connected to XC0 +#define AT91C_TCB_TC1XC1S ((unsigned int) 0x1 << 2) // (TCB) External Clock Signal 1 Selection +#define AT91C_TCB_TC1XC1S_TCLK1 ((unsigned int) 0x0 << 2) // (TCB) TCLK1 connected to XC1 +#define AT91C_TCB_TC1XC1S_NONE ((unsigned int) 0x1 << 2) // (TCB) None signal connected to XC1 +#define AT91C_TCB_TC1XC1S_TIOA0 ((unsigned int) 0x2 << 2) // (TCB) TIOA0 connected to XC1 +#define AT91C_TCB_TC1XC1S_TIOA2 ((unsigned int) 0x3 << 2) // (TCB) TIOA2 connected to XC1 +#define AT91C_TCB_TC2XC2S ((unsigned int) 0x1 << 4) // (TCB) External Clock Signal 2 Selection +#define AT91C_TCB_TC2XC2S_TCLK2 ((unsigned int) 0x0 << 4) // (TCB) TCLK2 connected to XC2 +#define AT91C_TCB_TC2XC2S_NONE ((unsigned int) 0x1 << 4) // (TCB) None signal connected to XC2 +#define AT91C_TCB_TC2XC2S_TIOA0 ((unsigned int) 0x2 << 4) // (TCB) TIOA0 connected to XC2 +#define AT91C_TCB_TC2XC2S_TIOA2 ((unsigned int) 0x3 << 4) // (TCB) TIOA2 connected to XC2 + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR PWMC Channel Interface +// ***************************************************************************** +typedef struct _AT91S_PWMC_CH { + AT91_REG PWMC_CMR; // Channel Mode Register + AT91_REG PWMC_CDTYR; // Channel Duty Cycle Register + AT91_REG PWMC_CPRDR; // Channel Period Register + AT91_REG PWMC_CCNTR; // Channel Counter Register + AT91_REG PWMC_CUPDR; // Channel Update Register + AT91_REG PWMC_Reserved[3]; // Reserved +} AT91S_PWMC_CH, *AT91PS_PWMC_CH; + +// -------- PWMC_CMR : (PWMC_CH Offset: 0x0) PWMC Channel Mode Register -------- +#define AT91C_PWMC_CPRE ((unsigned int) 0xF << 0) // (PWMC_CH) Channel Pre-scaler : PWMC_CLKx +#define AT91C_PWMC_CPRE_MCK ((unsigned int) 0x0) // (PWMC_CH) +#define AT91C_PWMC_CPRE_MCKA ((unsigned int) 0xB) // (PWMC_CH) +#define AT91C_PWMC_CPRE_MCKB ((unsigned int) 0xC) // (PWMC_CH) +#define AT91C_PWMC_CALG ((unsigned int) 0x1 << 8) // (PWMC_CH) Channel Alignment +#define AT91C_PWMC_CPOL ((unsigned int) 0x1 << 9) // (PWMC_CH) Channel Polarity +#define AT91C_PWMC_CPD ((unsigned int) 0x1 << 10) // (PWMC_CH) Channel Update Period +// -------- PWMC_CDTYR : (PWMC_CH Offset: 0x4) PWMC Channel Duty Cycle Register -------- +#define AT91C_PWMC_CDTY ((unsigned int) 0x0 << 0) // (PWMC_CH) Channel Duty Cycle +// -------- PWMC_CPRDR : (PWMC_CH Offset: 0x8) PWMC Channel Period Register -------- +#define AT91C_PWMC_CPRD ((unsigned int) 0x0 << 0) // (PWMC_CH) Channel Period +// -------- PWMC_CCNTR : (PWMC_CH Offset: 0xc) PWMC Channel Counter Register -------- +#define AT91C_PWMC_CCNT ((unsigned int) 0x0 << 0) // (PWMC_CH) Channel Counter +// -------- PWMC_CUPDR : (PWMC_CH Offset: 0x10) PWMC Channel Update Register -------- +#define AT91C_PWMC_CUPD ((unsigned int) 0x0 << 0) // (PWMC_CH) Channel Update + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Pulse Width Modulation Controller Interface +// ***************************************************************************** +typedef struct _AT91S_PWMC { + AT91_REG PWMC_MR; // PWMC Mode Register + AT91_REG PWMC_ENA; // PWMC Enable Register + AT91_REG PWMC_DIS; // PWMC Disable Register + AT91_REG PWMC_SR; // PWMC Status Register + AT91_REG PWMC_IER; // PWMC Interrupt Enable Register + AT91_REG PWMC_IDR; // PWMC Interrupt Disable Register + AT91_REG PWMC_IMR; // PWMC Interrupt Mask Register + AT91_REG PWMC_ISR; // PWMC Interrupt Status Register + AT91_REG Reserved0[55]; // + AT91_REG PWMC_VR; // PWMC Version Register + AT91_REG Reserved1[64]; // + AT91S_PWMC_CH PWMC_CH[32]; // PWMC Channel 0 +} AT91S_PWMC, *AT91PS_PWMC; + +// -------- PWMC_MR : (PWMC Offset: 0x0) PWMC Mode Register -------- +#define AT91C_PWMC_DIVA ((unsigned int) 0xFF << 0) // (PWMC) CLKA divide factor. +#define AT91C_PWMC_PREA ((unsigned int) 0xF << 8) // (PWMC) Divider Input Clock Prescaler A +#define AT91C_PWMC_PREA_MCK ((unsigned int) 0x0 << 8) // (PWMC) +#define AT91C_PWMC_DIVB ((unsigned int) 0xFF << 16) // (PWMC) CLKB divide factor. +#define AT91C_PWMC_PREB ((unsigned int) 0xF << 24) // (PWMC) Divider Input Clock Prescaler B +#define AT91C_PWMC_PREB_MCK ((unsigned int) 0x0 << 24) // (PWMC) +// -------- PWMC_ENA : (PWMC Offset: 0x4) PWMC Enable Register -------- +#define AT91C_PWMC_CHID0 ((unsigned int) 0x1 << 0) // (PWMC) Channel ID 0 +#define AT91C_PWMC_CHID1 ((unsigned int) 0x1 << 1) // (PWMC) Channel ID 1 +#define AT91C_PWMC_CHID2 ((unsigned int) 0x1 << 2) // (PWMC) Channel ID 2 +#define AT91C_PWMC_CHID3 ((unsigned int) 0x1 << 3) // (PWMC) Channel ID 3 +#define AT91C_PWMC_CHID4 ((unsigned int) 0x1 << 4) // (PWMC) Channel ID 4 +#define AT91C_PWMC_CHID5 ((unsigned int) 0x1 << 5) // (PWMC) Channel ID 5 +#define AT91C_PWMC_CHID6 ((unsigned int) 0x1 << 6) // (PWMC) Channel ID 6 +#define AT91C_PWMC_CHID7 ((unsigned int) 0x1 << 7) // (PWMC) Channel ID 7 +// -------- PWMC_DIS : (PWMC Offset: 0x8) PWMC Disable Register -------- +// -------- PWMC_SR : (PWMC Offset: 0xc) PWMC Status Register -------- +// -------- PWMC_IER : (PWMC Offset: 0x10) PWMC Interrupt Enable Register -------- +// -------- PWMC_IDR : (PWMC Offset: 0x14) PWMC Interrupt Disable Register -------- +// -------- PWMC_IMR : (PWMC Offset: 0x18) PWMC Interrupt Mask Register -------- +// -------- PWMC_ISR : (PWMC Offset: 0x1c) PWMC Interrupt Status Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR USB Device Interface +// ***************************************************************************** +typedef struct _AT91S_UDP { + AT91_REG UDP_NUM; // Frame Number Register + AT91_REG UDP_GLBSTATE; // Global State Register + AT91_REG UDP_FADDR; // Function Address Register + AT91_REG Reserved0[1]; // + AT91_REG UDP_IER; // Interrupt Enable Register + AT91_REG UDP_IDR; // Interrupt Disable Register + AT91_REG UDP_IMR; // Interrupt Mask Register + AT91_REG UDP_ISR; // Interrupt Status Register + AT91_REG UDP_ICR; // Interrupt Clear Register + AT91_REG Reserved1[1]; // + AT91_REG UDP_RSTEP; // Reset Endpoint Register + AT91_REG Reserved2[1]; // + AT91_REG UDP_CSR[8]; // Endpoint Control and Status Register + AT91_REG UDP_FDR[8]; // Endpoint FIFO Data Register +} AT91S_UDP, *AT91PS_UDP; + +// -------- UDP_FRM_NUM : (UDP Offset: 0x0) USB Frame Number Register -------- +#define AT91C_UDP_FRM_NUM ((unsigned int) 0x7FF << 0) // (UDP) Frame Number as Defined in the Packet Field Formats +#define AT91C_UDP_FRM_ERR ((unsigned int) 0x1 << 16) // (UDP) Frame Error +#define AT91C_UDP_FRM_OK ((unsigned int) 0x1 << 17) // (UDP) Frame OK +// -------- UDP_GLB_STATE : (UDP Offset: 0x4) USB Global State Register -------- +#define AT91C_UDP_FADDEN ((unsigned int) 0x1 << 0) // (UDP) Function Address Enable +#define AT91C_UDP_CONFG ((unsigned int) 0x1 << 1) // (UDP) Configured +#define AT91C_UDP_RMWUPE ((unsigned int) 0x1 << 2) // (UDP) Remote Wake Up Enable +#define AT91C_UDP_RSMINPR ((unsigned int) 0x1 << 3) // (UDP) A Resume Has Been Sent to the Host +// -------- UDP_FADDR : (UDP Offset: 0x8) USB Function Address Register -------- +#define AT91C_UDP_FADD ((unsigned int) 0xFF << 0) // (UDP) Function Address Value +#define AT91C_UDP_FEN ((unsigned int) 0x1 << 8) // (UDP) Function Enable +// -------- UDP_IER : (UDP Offset: 0x10) USB Interrupt Enable Register -------- +#define AT91C_UDP_EPINT0 ((unsigned int) 0x1 << 0) // (UDP) Endpoint 0 Interrupt +#define AT91C_UDP_EPINT1 ((unsigned int) 0x1 << 1) // (UDP) Endpoint 0 Interrupt +#define AT91C_UDP_EPINT2 ((unsigned int) 0x1 << 2) // (UDP) Endpoint 2 Interrupt +#define AT91C_UDP_EPINT3 ((unsigned int) 0x1 << 3) // (UDP) Endpoint 3 Interrupt +#define AT91C_UDP_EPINT4 ((unsigned int) 0x1 << 4) // (UDP) Endpoint 4 Interrupt +#define AT91C_UDP_EPINT5 ((unsigned int) 0x1 << 5) // (UDP) Endpoint 5 Interrupt +#define AT91C_UDP_EPINT6 ((unsigned int) 0x1 << 6) // (UDP) Endpoint 6 Interrupt +#define AT91C_UDP_EPINT7 ((unsigned int) 0x1 << 7) // (UDP) Endpoint 7 Interrupt +#define AT91C_UDP_RXSUSP ((unsigned int) 0x1 << 8) // (UDP) USB Suspend Interrupt +#define AT91C_UDP_RXRSM ((unsigned int) 0x1 << 9) // (UDP) USB Resume Interrupt +#define AT91C_UDP_EXTRSM ((unsigned int) 0x1 << 10) // (UDP) USB External Resume Interrupt +#define AT91C_UDP_SOFINT ((unsigned int) 0x1 << 11) // (UDP) USB Start Of frame Interrupt +#define AT91C_UDP_WAKEUP ((unsigned int) 0x1 << 13) // (UDP) USB Resume Interrupt +// -------- UDP_IDR : (UDP Offset: 0x14) USB Interrupt Disable Register -------- +// -------- UDP_IMR : (UDP Offset: 0x18) USB Interrupt Mask Register -------- +// -------- UDP_ISR : (UDP Offset: 0x1c) USB Interrupt Status Register -------- +#define AT91C_UDP_ENDBUSRES ((unsigned int) 0x1 << 12) // (UDP) USB End Of Bus Reset Interrupt +// -------- UDP_ICR : (UDP Offset: 0x20) USB Interrupt Clear Register -------- +// -------- UDP_RST_EP : (UDP Offset: 0x28) USB Reset Endpoint Register -------- +#define AT91C_UDP_EP0 ((unsigned int) 0x1 << 0) // (UDP) Reset Endpoint 0 +#define AT91C_UDP_EP1 ((unsigned int) 0x1 << 1) // (UDP) Reset Endpoint 1 +#define AT91C_UDP_EP2 ((unsigned int) 0x1 << 2) // (UDP) Reset Endpoint 2 +#define AT91C_UDP_EP3 ((unsigned int) 0x1 << 3) // (UDP) Reset Endpoint 3 +#define AT91C_UDP_EP4 ((unsigned int) 0x1 << 4) // (UDP) Reset Endpoint 4 +#define AT91C_UDP_EP5 ((unsigned int) 0x1 << 5) // (UDP) Reset Endpoint 5 +#define AT91C_UDP_EP6 ((unsigned int) 0x1 << 6) // (UDP) Reset Endpoint 6 +#define AT91C_UDP_EP7 ((unsigned int) 0x1 << 7) // (UDP) Reset Endpoint 7 +// -------- UDP_CSR : (UDP Offset: 0x30) USB Endpoint Control and Status Register -------- +#define AT91C_UDP_TXCOMP ((unsigned int) 0x1 << 0) // (UDP) Generates an IN packet with data previously written in the DPR +#define AT91C_UDP_RX_DATA_BK0 ((unsigned int) 0x1 << 1) // (UDP) Receive Data Bank 0 +#define AT91C_UDP_RXSETUP ((unsigned int) 0x1 << 2) // (UDP) Sends STALL to the Host (Control endpoints) +#define AT91C_UDP_ISOERROR ((unsigned int) 0x1 << 3) // (UDP) Isochronous error (Isochronous endpoints) +#define AT91C_UDP_TXPKTRDY ((unsigned int) 0x1 << 4) // (UDP) Transmit Packet Ready +#define AT91C_UDP_FORCESTALL ((unsigned int) 0x1 << 5) // (UDP) Force Stall (used by Control, Bulk and Isochronous endpoints). +#define AT91C_UDP_RX_DATA_BK1 ((unsigned int) 0x1 << 6) // (UDP) Receive Data Bank 1 (only used by endpoints with ping-pong attributes). +#define AT91C_UDP_DIR ((unsigned int) 0x1 << 7) // (UDP) Transfer Direction +#define AT91C_UDP_EPTYPE ((unsigned int) 0x7 << 8) // (UDP) Endpoint type +#define AT91C_UDP_EPTYPE_CTRL ((unsigned int) 0x0 << 8) // (UDP) Control +#define AT91C_UDP_EPTYPE_ISO_OUT ((unsigned int) 0x1 << 8) // (UDP) Isochronous OUT +#define AT91C_UDP_EPTYPE_BULK_OUT ((unsigned int) 0x2 << 8) // (UDP) Bulk OUT +#define AT91C_UDP_EPTYPE_INT_OUT ((unsigned int) 0x3 << 8) // (UDP) Interrupt OUT +#define AT91C_UDP_EPTYPE_ISO_IN ((unsigned int) 0x5 << 8) // (UDP) Isochronous IN +#define AT91C_UDP_EPTYPE_BULK_IN ((unsigned int) 0x6 << 8) // (UDP) Bulk IN +#define AT91C_UDP_EPTYPE_INT_IN ((unsigned int) 0x7 << 8) // (UDP) Interrupt IN +#define AT91C_UDP_DTGLE ((unsigned int) 0x1 << 11) // (UDP) Data Toggle +#define AT91C_UDP_EPEDS ((unsigned int) 0x1 << 15) // (UDP) Endpoint Enable Disable +#define AT91C_UDP_RXBYTECNT ((unsigned int) 0x7FF << 16) // (UDP) Number Of Bytes Available in the FIFO + +// ***************************************************************************** +// REGISTER ADDRESS DEFINITION FOR AT91SAM7S64 +// ***************************************************************************** +// ========== Register definition for SYSC peripheral ========== +#define AT91C_SYSC_SYSC_VRPM ((AT91_REG *) 0xFFFFFD60) // (SYSC) Voltage Regulator Power Mode Register +// ========== Register definition for AIC peripheral ========== +#define AT91C_AIC_ICCR ((AT91_REG *) 0xFFFFF128) // (AIC) Interrupt Clear Command Register +#define AT91C_AIC_IECR ((AT91_REG *) 0xFFFFF120) // (AIC) Interrupt Enable Command Register +#define AT91C_AIC_SMR ((AT91_REG *) 0xFFFFF000) // (AIC) Source Mode Register +#define AT91C_AIC_ISCR ((AT91_REG *) 0xFFFFF12C) // (AIC) Interrupt Set Command Register +#define AT91C_AIC_EOICR ((AT91_REG *) 0xFFFFF130) // (AIC) End of Interrupt Command Register +#define AT91C_AIC_DCR ((AT91_REG *) 0xFFFFF138) // (AIC) Debug Control Register (Protect) +#define AT91C_AIC_FFER ((AT91_REG *) 0xFFFFF140) // (AIC) Fast Forcing Enable Register +#define AT91C_AIC_SVR ((AT91_REG *) 0xFFFFF080) // (AIC) Source Vector Register +#define AT91C_AIC_SPU ((AT91_REG *) 0xFFFFF134) // (AIC) Spurious Vector Register +#define AT91C_AIC_FFDR ((AT91_REG *) 0xFFFFF144) // (AIC) Fast Forcing Disable Register +#define AT91C_AIC_FVR ((AT91_REG *) 0xFFFFF104) // (AIC) FIQ Vector Register +#define AT91C_AIC_FFSR ((AT91_REG *) 0xFFFFF148) // (AIC) Fast Forcing Status Register +#define AT91C_AIC_IMR ((AT91_REG *) 0xFFFFF110) // (AIC) Interrupt Mask Register +#define AT91C_AIC_ISR ((AT91_REG *) 0xFFFFF108) // (AIC) Interrupt Status Register +#define AT91C_AIC_IVR ((AT91_REG *) 0xFFFFF100) // (AIC) IRQ Vector Register +#define AT91C_AIC_IDCR ((AT91_REG *) 0xFFFFF124) // (AIC) Interrupt Disable Command Register +#define AT91C_AIC_CISR ((AT91_REG *) 0xFFFFF114) // (AIC) Core Interrupt Status Register +#define AT91C_AIC_IPR ((AT91_REG *) 0xFFFFF10C) // (AIC) Interrupt Pending Register +// ========== Register definition for DBGU peripheral ========== +#define AT91C_DBGU_C2R ((AT91_REG *) 0xFFFFF244) // (DBGU) Chip ID2 Register +#define AT91C_DBGU_THR ((AT91_REG *) 0xFFFFF21C) // (DBGU) Transmitter Holding Register +#define AT91C_DBGU_CSR ((AT91_REG *) 0xFFFFF214) // (DBGU) Channel Status Register +#define AT91C_DBGU_IDR ((AT91_REG *) 0xFFFFF20C) // (DBGU) Interrupt Disable Register +#define AT91C_DBGU_MR ((AT91_REG *) 0xFFFFF204) // (DBGU) Mode Register +#define AT91C_DBGU_FNTR ((AT91_REG *) 0xFFFFF248) // (DBGU) Force NTRST Register +#define AT91C_DBGU_C1R ((AT91_REG *) 0xFFFFF240) // (DBGU) Chip ID1 Register +#define AT91C_DBGU_BRGR ((AT91_REG *) 0xFFFFF220) // (DBGU) Baud Rate Generator Register +#define AT91C_DBGU_RHR ((AT91_REG *) 0xFFFFF218) // (DBGU) Receiver Holding Register +#define AT91C_DBGU_IMR ((AT91_REG *) 0xFFFFF210) // (DBGU) Interrupt Mask Register +#define AT91C_DBGU_IER ((AT91_REG *) 0xFFFFF208) // (DBGU) Interrupt Enable Register +#define AT91C_DBGU_CR ((AT91_REG *) 0xFFFFF200) // (DBGU) Control Register +// ========== Register definition for PDC_DBGU peripheral ========== +#define AT91C_DBGU_TNCR ((AT91_REG *) 0xFFFFF31C) // (PDC_DBGU) Transmit Next Counter Register +#define AT91C_DBGU_RNCR ((AT91_REG *) 0xFFFFF314) // (PDC_DBGU) Receive Next Counter Register +#define AT91C_DBGU_PTCR ((AT91_REG *) 0xFFFFF320) // (PDC_DBGU) PDC Transfer Control Register +#define AT91C_DBGU_PTSR ((AT91_REG *) 0xFFFFF324) // (PDC_DBGU) PDC Transfer Status Register +#define AT91C_DBGU_RCR ((AT91_REG *) 0xFFFFF304) // (PDC_DBGU) Receive Counter Register +#define AT91C_DBGU_TCR ((AT91_REG *) 0xFFFFF30C) // (PDC_DBGU) Transmit Counter Register +#define AT91C_DBGU_RPR ((AT91_REG *) 0xFFFFF300) // (PDC_DBGU) Receive Pointer Register +#define AT91C_DBGU_TPR ((AT91_REG *) 0xFFFFF308) // (PDC_DBGU) Transmit Pointer Register +#define AT91C_DBGU_RNPR ((AT91_REG *) 0xFFFFF310) // (PDC_DBGU) Receive Next Pointer Register +#define AT91C_DBGU_TNPR ((AT91_REG *) 0xFFFFF318) // (PDC_DBGU) Transmit Next Pointer Register +// ========== Register definition for PIOA peripheral ========== +#define AT91C_PIOA_IMR ((AT91_REG *) 0xFFFFF448) // (PIOA) Interrupt Mask Register +#define AT91C_PIOA_IER ((AT91_REG *) 0xFFFFF440) // (PIOA) Interrupt Enable Register +#define AT91C_PIOA_OWDR ((AT91_REG *) 0xFFFFF4A4) // (PIOA) Output Write Disable Register +#define AT91C_PIOA_ISR ((AT91_REG *) 0xFFFFF44C) // (PIOA) Interrupt Status Register +#define AT91C_PIOA_PPUDR ((AT91_REG *) 0xFFFFF460) // (PIOA) Pull-up Disable Register +#define AT91C_PIOA_MDSR ((AT91_REG *) 0xFFFFF458) // (PIOA) Multi-driver Status Register +#define AT91C_PIOA_MDER ((AT91_REG *) 0xFFFFF450) // (PIOA) Multi-driver Enable Register +#define AT91C_PIOA_PER ((AT91_REG *) 0xFFFFF400) // (PIOA) PIO Enable Register +#define AT91C_PIOA_PSR ((AT91_REG *) 0xFFFFF408) // (PIOA) PIO Status Register +#define AT91C_PIOA_OER ((AT91_REG *) 0xFFFFF410) // (PIOA) Output Enable Register +#define AT91C_PIOA_BSR ((AT91_REG *) 0xFFFFF474) // (PIOA) Select B Register +#define AT91C_PIOA_PPUER ((AT91_REG *) 0xFFFFF464) // (PIOA) Pull-up Enable Register +#define AT91C_PIOA_MDDR ((AT91_REG *) 0xFFFFF454) // (PIOA) Multi-driver Disable Register +#define AT91C_PIOA_PDR ((AT91_REG *) 0xFFFFF404) // (PIOA) PIO Disable Register +#define AT91C_PIOA_ODR ((AT91_REG *) 0xFFFFF414) // (PIOA) Output Disable Registerr +#define AT91C_PIOA_IFDR ((AT91_REG *) 0xFFFFF424) // (PIOA) Input Filter Disable Register +#define AT91C_PIOA_ABSR ((AT91_REG *) 0xFFFFF478) // (PIOA) AB Select Status Register +#define AT91C_PIOA_ASR ((AT91_REG *) 0xFFFFF470) // (PIOA) Select A Register +#define AT91C_PIOA_PPUSR ((AT91_REG *) 0xFFFFF468) // (PIOA) Pad Pull-up Status Register +#define AT91C_PIOA_ODSR ((AT91_REG *) 0xFFFFF438) // (PIOA) Output Data Status Register +#define AT91C_PIOA_SODR ((AT91_REG *) 0xFFFFF430) // (PIOA) Set Output Data Register +#define AT91C_PIOA_IFSR ((AT91_REG *) 0xFFFFF428) // (PIOA) Input Filter Status Register +#define AT91C_PIOA_IFER ((AT91_REG *) 0xFFFFF420) // (PIOA) Input Filter Enable Register +#define AT91C_PIOA_OSR ((AT91_REG *) 0xFFFFF418) // (PIOA) Output Status Register +#define AT91C_PIOA_IDR ((AT91_REG *) 0xFFFFF444) // (PIOA) Interrupt Disable Register +#define AT91C_PIOA_PDSR ((AT91_REG *) 0xFFFFF43C) // (PIOA) Pin Data Status Register +#define AT91C_PIOA_CODR ((AT91_REG *) 0xFFFFF434) // (PIOA) Clear Output Data Register +#define AT91C_PIOA_OWSR ((AT91_REG *) 0xFFFFF4A8) // (PIOA) Output Write Status Register +#define AT91C_PIOA_OWER ((AT91_REG *) 0xFFFFF4A0) // (PIOA) Output Write Enable Register +// ========== Register definition for CKGR peripheral ========== +#define AT91C_CKGR_PLLR ((AT91_REG *) 0xFFFFFC2C) // (CKGR) PLL Register +#define AT91C_CKGR_MCFR ((AT91_REG *) 0xFFFFFC24) // (CKGR) Main Clock Frequency Register +#define AT91C_CKGR_MOR ((AT91_REG *) 0xFFFFFC20) // (CKGR) Main Oscillator Register +// ========== Register definition for PMC peripheral ========== +#define AT91C_PMC_SCSR ((AT91_REG *) 0xFFFFFC08) // (PMC) System Clock Status Register +#define AT91C_PMC_SCER ((AT91_REG *) 0xFFFFFC00) // (PMC) System Clock Enable Register +#define AT91C_PMC_IMR ((AT91_REG *) 0xFFFFFC6C) // (PMC) Interrupt Mask Register +#define AT91C_PMC_IDR ((AT91_REG *) 0xFFFFFC64) // (PMC) Interrupt Disable Register +#define AT91C_PMC_PCDR ((AT91_REG *) 0xFFFFFC14) // (PMC) Peripheral Clock Disable Register +#define AT91C_PMC_SCDR ((AT91_REG *) 0xFFFFFC04) // (PMC) System Clock Disable Register +#define AT91C_PMC_SR ((AT91_REG *) 0xFFFFFC68) // (PMC) Status Register +#define AT91C_PMC_IER ((AT91_REG *) 0xFFFFFC60) // (PMC) Interrupt Enable Register +#define AT91C_PMC_MCKR ((AT91_REG *) 0xFFFFFC30) // (PMC) Master Clock Register +#define AT91C_PMC_MOR ((AT91_REG *) 0xFFFFFC20) // (PMC) Main Oscillator Register +#define AT91C_PMC_PCER ((AT91_REG *) 0xFFFFFC10) // (PMC) Peripheral Clock Enable Register +#define AT91C_PMC_PCSR ((AT91_REG *) 0xFFFFFC18) // (PMC) Peripheral Clock Status Register +#define AT91C_PMC_PLLR ((AT91_REG *) 0xFFFFFC2C) // (PMC) PLL Register +#define AT91C_PMC_MCFR ((AT91_REG *) 0xFFFFFC24) // (PMC) Main Clock Frequency Register +#define AT91C_PMC_PCKR ((AT91_REG *) 0xFFFFFC40) // (PMC) Programmable Clock Register +// ========== Register definition for RSTC peripheral ========== +#define AT91C_RSTC_RSR ((AT91_REG *) 0xFFFFFD04) // (RSTC) Reset Status Register +#define AT91C_RSTC_RMR ((AT91_REG *) 0xFFFFFD08) // (RSTC) Reset Mode Register +#define AT91C_RSTC_RCR ((AT91_REG *) 0xFFFFFD00) // (RSTC) Reset Control Register +// ========== Register definition for RTTC peripheral ========== +#define AT91C_RTTC_RTSR ((AT91_REG *) 0xFFFFFD2C) // (RTTC) Real-time Status Register +#define AT91C_RTTC_RTAR ((AT91_REG *) 0xFFFFFD24) // (RTTC) Real-time Alarm Register +#define AT91C_RTTC_RTVR ((AT91_REG *) 0xFFFFFD28) // (RTTC) Real-time Value Register +#define AT91C_RTTC_RTMR ((AT91_REG *) 0xFFFFFD20) // (RTTC) Real-time Mode Register +// ========== Register definition for PITC peripheral ========== +#define AT91C_PITC_PIIR ((AT91_REG *) 0xFFFFFD3C) // (PITC) Period Interval Image Register +#define AT91C_PITC_PISR ((AT91_REG *) 0xFFFFFD34) // (PITC) Period Interval Status Register +#define AT91C_PITC_PIVR ((AT91_REG *) 0xFFFFFD38) // (PITC) Period Interval Value Register +#define AT91C_PITC_PIMR ((AT91_REG *) 0xFFFFFD30) // (PITC) Period Interval Mode Register +// ========== Register definition for WDTC peripheral ========== +#define AT91C_WDTC_WDMR ((AT91_REG *) 0xFFFFFD44) // (WDTC) Watchdog Mode Register +#define AT91C_WDTC_WDSR ((AT91_REG *) 0xFFFFFD48) // (WDTC) Watchdog Status Register +#define AT91C_WDTC_WDCR ((AT91_REG *) 0xFFFFFD40) // (WDTC) Watchdog Control Register +// ========== Register definition for MC peripheral ========== +#define AT91C_MC_FCR ((AT91_REG *) 0xFFFFFF64) // (MC) MC Flash Command Register +#define AT91C_MC_ASR ((AT91_REG *) 0xFFFFFF04) // (MC) MC Abort Status Register +#define AT91C_MC_FSR ((AT91_REG *) 0xFFFFFF68) // (MC) MC Flash Status Register +#define AT91C_MC_FMR ((AT91_REG *) 0xFFFFFF60) // (MC) MC Flash Mode Register +#define AT91C_MC_AASR ((AT91_REG *) 0xFFFFFF08) // (MC) MC Abort Address Status Register +#define AT91C_MC_RCR ((AT91_REG *) 0xFFFFFF00) // (MC) MC Remap Control Register +// ========== Register definition for PDC_SPI peripheral ========== +#define AT91C_SPI_PTCR ((AT91_REG *) 0xFFFE0120) // (PDC_SPI) PDC Transfer Control Register +#define AT91C_SPI_TNPR ((AT91_REG *) 0xFFFE0118) // (PDC_SPI) Transmit Next Pointer Register +#define AT91C_SPI_RNPR ((AT91_REG *) 0xFFFE0110) // (PDC_SPI) Receive Next Pointer Register +#define AT91C_SPI_TPR ((AT91_REG *) 0xFFFE0108) // (PDC_SPI) Transmit Pointer Register +#define AT91C_SPI_RPR ((AT91_REG *) 0xFFFE0100) // (PDC_SPI) Receive Pointer Register +#define AT91C_SPI_PTSR ((AT91_REG *) 0xFFFE0124) // (PDC_SPI) PDC Transfer Status Register +#define AT91C_SPI_TNCR ((AT91_REG *) 0xFFFE011C) // (PDC_SPI) Transmit Next Counter Register +#define AT91C_SPI_RNCR ((AT91_REG *) 0xFFFE0114) // (PDC_SPI) Receive Next Counter Register +#define AT91C_SPI_TCR ((AT91_REG *) 0xFFFE010C) // (PDC_SPI) Transmit Counter Register +#define AT91C_SPI_RCR ((AT91_REG *) 0xFFFE0104) // (PDC_SPI) Receive Counter Register +// ========== Register definition for SPI peripheral ========== +#define AT91C_SPI_CSR ((AT91_REG *) 0xFFFE0030) // (SPI) Chip Select Register +#define AT91C_SPI_IDR ((AT91_REG *) 0xFFFE0018) // (SPI) Interrupt Disable Register +#define AT91C_SPI_SR ((AT91_REG *) 0xFFFE0010) // (SPI) Status Register +#define AT91C_SPI_RDR ((AT91_REG *) 0xFFFE0008) // (SPI) Receive Data Register +#define AT91C_SPI_CR ((AT91_REG *) 0xFFFE0000) // (SPI) Control Register +#define AT91C_SPI_IMR ((AT91_REG *) 0xFFFE001C) // (SPI) Interrupt Mask Register +#define AT91C_SPI_IER ((AT91_REG *) 0xFFFE0014) // (SPI) Interrupt Enable Register +#define AT91C_SPI_TDR ((AT91_REG *) 0xFFFE000C) // (SPI) Transmit Data Register +#define AT91C_SPI_MR ((AT91_REG *) 0xFFFE0004) // (SPI) Mode Register +// ========== Register definition for PDC_ADC peripheral ========== +#define AT91C_ADC_PTCR ((AT91_REG *) 0xFFFD8120) // (PDC_ADC) PDC Transfer Control Register +#define AT91C_ADC_TNPR ((AT91_REG *) 0xFFFD8118) // (PDC_ADC) Transmit Next Pointer Register +#define AT91C_ADC_RNPR ((AT91_REG *) 0xFFFD8110) // (PDC_ADC) Receive Next Pointer Register +#define AT91C_ADC_TPR ((AT91_REG *) 0xFFFD8108) // (PDC_ADC) Transmit Pointer Register +#define AT91C_ADC_RPR ((AT91_REG *) 0xFFFD8100) // (PDC_ADC) Receive Pointer Register +#define AT91C_ADC_PTSR ((AT91_REG *) 0xFFFD8124) // (PDC_ADC) PDC Transfer Status Register +#define AT91C_ADC_TNCR ((AT91_REG *) 0xFFFD811C) // (PDC_ADC) Transmit Next Counter Register +#define AT91C_ADC_RNCR ((AT91_REG *) 0xFFFD8114) // (PDC_ADC) Receive Next Counter Register +#define AT91C_ADC_TCR ((AT91_REG *) 0xFFFD810C) // (PDC_ADC) Transmit Counter Register +#define AT91C_ADC_RCR ((AT91_REG *) 0xFFFD8104) // (PDC_ADC) Receive Counter Register +// ========== Register definition for ADC peripheral ========== +#define AT91C_ADC_IMR ((AT91_REG *) 0xFFFD802C) // (ADC) ADC Interrupt Mask Register +#define AT91C_ADC_CDR4 ((AT91_REG *) 0xFFFD8040) // (ADC) ADC Channel Data Register 4 +#define AT91C_ADC_CDR2 ((AT91_REG *) 0xFFFD8038) // (ADC) ADC Channel Data Register 2 +#define AT91C_ADC_CDR0 ((AT91_REG *) 0xFFFD8030) // (ADC) ADC Channel Data Register 0 +#define AT91C_ADC_CDR7 ((AT91_REG *) 0xFFFD804C) // (ADC) ADC Channel Data Register 7 +#define AT91C_ADC_CDR1 ((AT91_REG *) 0xFFFD8034) // (ADC) ADC Channel Data Register 1 +#define AT91C_ADC_CDR3 ((AT91_REG *) 0xFFFD803C) // (ADC) ADC Channel Data Register 3 +#define AT91C_ADC_CDR5 ((AT91_REG *) 0xFFFD8044) // (ADC) ADC Channel Data Register 5 +#define AT91C_ADC_MR ((AT91_REG *) 0xFFFD8004) // (ADC) ADC Mode Register +#define AT91C_ADC_CDR6 ((AT91_REG *) 0xFFFD8048) // (ADC) ADC Channel Data Register 6 +#define AT91C_ADC_CR ((AT91_REG *) 0xFFFD8000) // (ADC) ADC Control Register +#define AT91C_ADC_CHER ((AT91_REG *) 0xFFFD8010) // (ADC) ADC Channel Enable Register +#define AT91C_ADC_CHSR ((AT91_REG *) 0xFFFD8018) // (ADC) ADC Channel Status Register +#define AT91C_ADC_IER ((AT91_REG *) 0xFFFD8024) // (ADC) ADC Interrupt Enable Register +#define AT91C_ADC_SR ((AT91_REG *) 0xFFFD801C) // (ADC) ADC Status Register +#define AT91C_ADC_CHDR ((AT91_REG *) 0xFFFD8014) // (ADC) ADC Channel Disable Register +#define AT91C_ADC_IDR ((AT91_REG *) 0xFFFD8028) // (ADC) ADC Interrupt Disable Register +#define AT91C_ADC_LCDR ((AT91_REG *) 0xFFFD8020) // (ADC) ADC Last Converted Data Register +// ========== Register definition for PDC_SSC peripheral ========== +#define AT91C_SSC_PTCR ((AT91_REG *) 0xFFFD4120) // (PDC_SSC) PDC Transfer Control Register +#define AT91C_SSC_TNPR ((AT91_REG *) 0xFFFD4118) // (PDC_SSC) Transmit Next Pointer Register +#define AT91C_SSC_RNPR ((AT91_REG *) 0xFFFD4110) // (PDC_SSC) Receive Next Pointer Register +#define AT91C_SSC_TPR ((AT91_REG *) 0xFFFD4108) // (PDC_SSC) Transmit Pointer Register +#define AT91C_SSC_RPR ((AT91_REG *) 0xFFFD4100) // (PDC_SSC) Receive Pointer Register +#define AT91C_SSC_PTSR ((AT91_REG *) 0xFFFD4124) // (PDC_SSC) PDC Transfer Status Register +#define AT91C_SSC_TNCR ((AT91_REG *) 0xFFFD411C) // (PDC_SSC) Transmit Next Counter Register +#define AT91C_SSC_RNCR ((AT91_REG *) 0xFFFD4114) // (PDC_SSC) Receive Next Counter Register +#define AT91C_SSC_TCR ((AT91_REG *) 0xFFFD410C) // (PDC_SSC) Transmit Counter Register +#define AT91C_SSC_RCR ((AT91_REG *) 0xFFFD4104) // (PDC_SSC) Receive Counter Register +// ========== Register definition for SSC peripheral ========== +#define AT91C_SSC_RFMR ((AT91_REG *) 0xFFFD4014) // (SSC) Receive Frame Mode Register +#define AT91C_SSC_CMR ((AT91_REG *) 0xFFFD4004) // (SSC) Clock Mode Register +#define AT91C_SSC_IDR ((AT91_REG *) 0xFFFD4048) // (SSC) Interrupt Disable Register +#define AT91C_SSC_SR ((AT91_REG *) 0xFFFD4040) // (SSC) Status Register +#define AT91C_SSC_RC0R ((AT91_REG *) 0xFFFD4038) // (SSC) Receive Compare 0 Register +#define AT91C_SSC_RSHR ((AT91_REG *) 0xFFFD4030) // (SSC) Receive Sync Holding Register +#define AT91C_SSC_RHR ((AT91_REG *) 0xFFFD4020) // (SSC) Receive Holding Register +#define AT91C_SSC_TCMR ((AT91_REG *) 0xFFFD4018) // (SSC) Transmit Clock Mode Register +#define AT91C_SSC_RCMR ((AT91_REG *) 0xFFFD4010) // (SSC) Receive Clock ModeRegister +#define AT91C_SSC_CR ((AT91_REG *) 0xFFFD4000) // (SSC) Control Register +#define AT91C_SSC_IMR ((AT91_REG *) 0xFFFD404C) // (SSC) Interrupt Mask Register +#define AT91C_SSC_IER ((AT91_REG *) 0xFFFD4044) // (SSC) Interrupt Enable Register +#define AT91C_SSC_RC1R ((AT91_REG *) 0xFFFD403C) // (SSC) Receive Compare 1 Register +#define AT91C_SSC_TSHR ((AT91_REG *) 0xFFFD4034) // (SSC) Transmit Sync Holding Register +#define AT91C_SSC_THR ((AT91_REG *) 0xFFFD4024) // (SSC) Transmit Holding Register +#define AT91C_SSC_TFMR ((AT91_REG *) 0xFFFD401C) // (SSC) Transmit Frame Mode Register +// ========== Register definition for PDC_US1 peripheral ========== +#define AT91C_US1_PTSR ((AT91_REG *) 0xFFFC4124) // (PDC_US1) PDC Transfer Status Register +#define AT91C_US1_TNCR ((AT91_REG *) 0xFFFC411C) // (PDC_US1) Transmit Next Counter Register +#define AT91C_US1_RNCR ((AT91_REG *) 0xFFFC4114) // (PDC_US1) Receive Next Counter Register +#define AT91C_US1_TCR ((AT91_REG *) 0xFFFC410C) // (PDC_US1) Transmit Counter Register +#define AT91C_US1_RCR ((AT91_REG *) 0xFFFC4104) // (PDC_US1) Receive Counter Register +#define AT91C_US1_PTCR ((AT91_REG *) 0xFFFC4120) // (PDC_US1) PDC Transfer Control Register +#define AT91C_US1_TNPR ((AT91_REG *) 0xFFFC4118) // (PDC_US1) Transmit Next Pointer Register +#define AT91C_US1_RNPR ((AT91_REG *) 0xFFFC4110) // (PDC_US1) Receive Next Pointer Register +#define AT91C_US1_TPR ((AT91_REG *) 0xFFFC4108) // (PDC_US1) Transmit Pointer Register +#define AT91C_US1_RPR ((AT91_REG *) 0xFFFC4100) // (PDC_US1) Receive Pointer Register +// ========== Register definition for US1 peripheral ========== +#define AT91C_US1_XXR ((AT91_REG *) 0xFFFC4048) // (US1) XON_XOFF Register +#define AT91C_US1_RHR ((AT91_REG *) 0xFFFC4018) // (US1) Receiver Holding Register +#define AT91C_US1_IMR ((AT91_REG *) 0xFFFC4010) // (US1) Interrupt Mask Register +#define AT91C_US1_IER ((AT91_REG *) 0xFFFC4008) // (US1) Interrupt Enable Register +#define AT91C_US1_CR ((AT91_REG *) 0xFFFC4000) // (US1) Control Register +#define AT91C_US1_RTOR ((AT91_REG *) 0xFFFC4024) // (US1) Receiver Time-out Register +#define AT91C_US1_THR ((AT91_REG *) 0xFFFC401C) // (US1) Transmitter Holding Register +#define AT91C_US1_CSR ((AT91_REG *) 0xFFFC4014) // (US1) Channel Status Register +#define AT91C_US1_IDR ((AT91_REG *) 0xFFFC400C) // (US1) Interrupt Disable Register +#define AT91C_US1_FIDI ((AT91_REG *) 0xFFFC4040) // (US1) FI_DI_Ratio Register +#define AT91C_US1_BRGR ((AT91_REG *) 0xFFFC4020) // (US1) Baud Rate Generator Register +#define AT91C_US1_TTGR ((AT91_REG *) 0xFFFC4028) // (US1) Transmitter Time-guard Register +#define AT91C_US1_IF ((AT91_REG *) 0xFFFC404C) // (US1) IRDA_FILTER Register +#define AT91C_US1_NER ((AT91_REG *) 0xFFFC4044) // (US1) Nb Errors Register +#define AT91C_US1_MR ((AT91_REG *) 0xFFFC4004) // (US1) Mode Register +// ========== Register definition for PDC_US0 peripheral ========== +#define AT91C_US0_PTCR ((AT91_REG *) 0xFFFC0120) // (PDC_US0) PDC Transfer Control Register +#define AT91C_US0_TNPR ((AT91_REG *) 0xFFFC0118) // (PDC_US0) Transmit Next Pointer Register +#define AT91C_US0_RNPR ((AT91_REG *) 0xFFFC0110) // (PDC_US0) Receive Next Pointer Register +#define AT91C_US0_TPR ((AT91_REG *) 0xFFFC0108) // (PDC_US0) Transmit Pointer Register +#define AT91C_US0_RPR ((AT91_REG *) 0xFFFC0100) // (PDC_US0) Receive Pointer Register +#define AT91C_US0_PTSR ((AT91_REG *) 0xFFFC0124) // (PDC_US0) PDC Transfer Status Register +#define AT91C_US0_TNCR ((AT91_REG *) 0xFFFC011C) // (PDC_US0) Transmit Next Counter Register +#define AT91C_US0_RNCR ((AT91_REG *) 0xFFFC0114) // (PDC_US0) Receive Next Counter Register +#define AT91C_US0_TCR ((AT91_REG *) 0xFFFC010C) // (PDC_US0) Transmit Counter Register +#define AT91C_US0_RCR ((AT91_REG *) 0xFFFC0104) // (PDC_US0) Receive Counter Register +// ========== Register definition for US0 peripheral ========== +#define AT91C_US0_TTGR ((AT91_REG *) 0xFFFC0028) // (US0) Transmitter Time-guard Register +#define AT91C_US0_BRGR ((AT91_REG *) 0xFFFC0020) // (US0) Baud Rate Generator Register +#define AT91C_US0_RHR ((AT91_REG *) 0xFFFC0018) // (US0) Receiver Holding Register +#define AT91C_US0_IMR ((AT91_REG *) 0xFFFC0010) // (US0) Interrupt Mask Register +#define AT91C_US0_NER ((AT91_REG *) 0xFFFC0044) // (US0) Nb Errors Register +#define AT91C_US0_RTOR ((AT91_REG *) 0xFFFC0024) // (US0) Receiver Time-out Register +#define AT91C_US0_XXR ((AT91_REG *) 0xFFFC0048) // (US0) XON_XOFF Register +#define AT91C_US0_FIDI ((AT91_REG *) 0xFFFC0040) // (US0) FI_DI_Ratio Register +#define AT91C_US0_CR ((AT91_REG *) 0xFFFC0000) // (US0) Control Register +#define AT91C_US0_IER ((AT91_REG *) 0xFFFC0008) // (US0) Interrupt Enable Register +#define AT91C_US0_IF ((AT91_REG *) 0xFFFC004C) // (US0) IRDA_FILTER Register +#define AT91C_US0_MR ((AT91_REG *) 0xFFFC0004) // (US0) Mode Register +#define AT91C_US0_IDR ((AT91_REG *) 0xFFFC000C) // (US0) Interrupt Disable Register +#define AT91C_US0_CSR ((AT91_REG *) 0xFFFC0014) // (US0) Channel Status Register +#define AT91C_US0_THR ((AT91_REG *) 0xFFFC001C) // (US0) Transmitter Holding Register +// ========== Register definition for TWI peripheral ========== +#define AT91C_TWI_RHR ((AT91_REG *) 0xFFFB8030) // (TWI) Receive Holding Register +#define AT91C_TWI_IDR ((AT91_REG *) 0xFFFB8028) // (TWI) Interrupt Disable Register +#define AT91C_TWI_SR ((AT91_REG *) 0xFFFB8020) // (TWI) Status Register +#define AT91C_TWI_CWGR ((AT91_REG *) 0xFFFB8010) // (TWI) Clock Waveform Generator Register +#define AT91C_TWI_SMR ((AT91_REG *) 0xFFFB8008) // (TWI) Slave Mode Register +#define AT91C_TWI_CR ((AT91_REG *) 0xFFFB8000) // (TWI) Control Register +#define AT91C_TWI_THR ((AT91_REG *) 0xFFFB8034) // (TWI) Transmit Holding Register +#define AT91C_TWI_IMR ((AT91_REG *) 0xFFFB802C) // (TWI) Interrupt Mask Register +#define AT91C_TWI_IER ((AT91_REG *) 0xFFFB8024) // (TWI) Interrupt Enable Register +#define AT91C_TWI_IADR ((AT91_REG *) 0xFFFB800C) // (TWI) Internal Address Register +#define AT91C_TWI_MMR ((AT91_REG *) 0xFFFB8004) // (TWI) Master Mode Register +// ========== Register definition for TC2 peripheral ========== +#define AT91C_TC2_IMR ((AT91_REG *) 0xFFFA00AC) // (TC2) Interrupt Mask Register +#define AT91C_TC2_IER ((AT91_REG *) 0xFFFA00A4) // (TC2) Interrupt Enable Register +#define AT91C_TC2_RC ((AT91_REG *) 0xFFFA009C) // (TC2) Register C +#define AT91C_TC2_RA ((AT91_REG *) 0xFFFA0094) // (TC2) Register A +#define AT91C_TC2_CMR ((AT91_REG *) 0xFFFA0084) // (TC2) Channel Mode Register (Capture Mode / Waveform Mode) +#define AT91C_TC2_IDR ((AT91_REG *) 0xFFFA00A8) // (TC2) Interrupt Disable Register +#define AT91C_TC2_SR ((AT91_REG *) 0xFFFA00A0) // (TC2) Status Register +#define AT91C_TC2_RB ((AT91_REG *) 0xFFFA0098) // (TC2) Register B +#define AT91C_TC2_CV ((AT91_REG *) 0xFFFA0090) // (TC2) Counter Value +#define AT91C_TC2_CCR ((AT91_REG *) 0xFFFA0080) // (TC2) Channel Control Register +// ========== Register definition for TC1 peripheral ========== +#define AT91C_TC1_IMR ((AT91_REG *) 0xFFFA006C) // (TC1) Interrupt Mask Register +#define AT91C_TC1_IER ((AT91_REG *) 0xFFFA0064) // (TC1) Interrupt Enable Register +#define AT91C_TC1_RC ((AT91_REG *) 0xFFFA005C) // (TC1) Register C +#define AT91C_TC1_RA ((AT91_REG *) 0xFFFA0054) // (TC1) Register A +#define AT91C_TC1_CMR ((AT91_REG *) 0xFFFA0044) // (TC1) Channel Mode Register (Capture Mode / Waveform Mode) +#define AT91C_TC1_IDR ((AT91_REG *) 0xFFFA0068) // (TC1) Interrupt Disable Register +#define AT91C_TC1_SR ((AT91_REG *) 0xFFFA0060) // (TC1) Status Register +#define AT91C_TC1_RB ((AT91_REG *) 0xFFFA0058) // (TC1) Register B +#define AT91C_TC1_CV ((AT91_REG *) 0xFFFA0050) // (TC1) Counter Value +#define AT91C_TC1_CCR ((AT91_REG *) 0xFFFA0040) // (TC1) Channel Control Register +// ========== Register definition for TC0 peripheral ========== +#define AT91C_TC0_IMR ((AT91_REG *) 0xFFFA002C) // (TC0) Interrupt Mask Register +#define AT91C_TC0_IER ((AT91_REG *) 0xFFFA0024) // (TC0) Interrupt Enable Register +#define AT91C_TC0_RC ((AT91_REG *) 0xFFFA001C) // (TC0) Register C +#define AT91C_TC0_RA ((AT91_REG *) 0xFFFA0014) // (TC0) Register A +#define AT91C_TC0_CMR ((AT91_REG *) 0xFFFA0004) // (TC0) Channel Mode Register (Capture Mode / Waveform Mode) +#define AT91C_TC0_IDR ((AT91_REG *) 0xFFFA0028) // (TC0) Interrupt Disable Register +#define AT91C_TC0_SR ((AT91_REG *) 0xFFFA0020) // (TC0) Status Register +#define AT91C_TC0_RB ((AT91_REG *) 0xFFFA0018) // (TC0) Register B +#define AT91C_TC0_CV ((AT91_REG *) 0xFFFA0010) // (TC0) Counter Value +#define AT91C_TC0_CCR ((AT91_REG *) 0xFFFA0000) // (TC0) Channel Control Register +// ========== Register definition for TCB peripheral ========== +#define AT91C_TCB_BMR ((AT91_REG *) 0xFFFA00C4) // (TCB) TC Block Mode Register +#define AT91C_TCB_BCR ((AT91_REG *) 0xFFFA00C0) // (TCB) TC Block Control Register +// ========== Register definition for PWMC_CH3 peripheral ========== +#define AT91C_CH3_CUPDR ((AT91_REG *) 0xFFFCC270) // (PWMC_CH3) Channel Update Register +#define AT91C_CH3_CPRDR ((AT91_REG *) 0xFFFCC268) // (PWMC_CH3) Channel Period Register +#define AT91C_CH3_CMR ((AT91_REG *) 0xFFFCC260) // (PWMC_CH3) Channel Mode Register +#define AT91C_CH3_Reserved ((AT91_REG *) 0xFFFCC274) // (PWMC_CH3) Reserved +#define AT91C_CH3_CCNTR ((AT91_REG *) 0xFFFCC26C) // (PWMC_CH3) Channel Counter Register +#define AT91C_CH3_CDTYR ((AT91_REG *) 0xFFFCC264) // (PWMC_CH3) Channel Duty Cycle Register +// ========== Register definition for PWMC_CH2 peripheral ========== +#define AT91C_CH2_CUPDR ((AT91_REG *) 0xFFFCC250) // (PWMC_CH2) Channel Update Register +#define AT91C_CH2_CPRDR ((AT91_REG *) 0xFFFCC248) // (PWMC_CH2) Channel Period Register +#define AT91C_CH2_CMR ((AT91_REG *) 0xFFFCC240) // (PWMC_CH2) Channel Mode Register +#define AT91C_CH2_Reserved ((AT91_REG *) 0xFFFCC254) // (PWMC_CH2) Reserved +#define AT91C_CH2_CCNTR ((AT91_REG *) 0xFFFCC24C) // (PWMC_CH2) Channel Counter Register +#define AT91C_CH2_CDTYR ((AT91_REG *) 0xFFFCC244) // (PWMC_CH2) Channel Duty Cycle Register +// ========== Register definition for PWMC_CH1 peripheral ========== +#define AT91C_CH1_CUPDR ((AT91_REG *) 0xFFFCC230) // (PWMC_CH1) Channel Update Register +#define AT91C_CH1_CPRDR ((AT91_REG *) 0xFFFCC228) // (PWMC_CH1) Channel Period Register +#define AT91C_CH1_CMR ((AT91_REG *) 0xFFFCC220) // (PWMC_CH1) Channel Mode Register +#define AT91C_CH1_Reserved ((AT91_REG *) 0xFFFCC234) // (PWMC_CH1) Reserved +#define AT91C_CH1_CCNTR ((AT91_REG *) 0xFFFCC22C) // (PWMC_CH1) Channel Counter Register +#define AT91C_CH1_CDTYR ((AT91_REG *) 0xFFFCC224) // (PWMC_CH1) Channel Duty Cycle Register +// ========== Register definition for PWMC_CH0 peripheral ========== +#define AT91C_CH0_CUPDR ((AT91_REG *) 0xFFFCC210) // (PWMC_CH0) Channel Update Register +#define AT91C_CH0_CPRDR ((AT91_REG *) 0xFFFCC208) // (PWMC_CH0) Channel Period Register +#define AT91C_CH0_CMR ((AT91_REG *) 0xFFFCC200) // (PWMC_CH0) Channel Mode Register +#define AT91C_CH0_Reserved ((AT91_REG *) 0xFFFCC214) // (PWMC_CH0) Reserved +#define AT91C_CH0_CCNTR ((AT91_REG *) 0xFFFCC20C) // (PWMC_CH0) Channel Counter Register +#define AT91C_CH0_CDTYR ((AT91_REG *) 0xFFFCC204) // (PWMC_CH0) Channel Duty Cycle Register +// ========== Register definition for PWMC peripheral ========== +#define AT91C_PWMC_VR ((AT91_REG *) 0xFFFCC0FC) // (PWMC) PWMC Version Register +#define AT91C_PWMC_ISR ((AT91_REG *) 0xFFFCC01C) // (PWMC) PWMC Interrupt Status Register +#define AT91C_PWMC_IDR ((AT91_REG *) 0xFFFCC014) // (PWMC) PWMC Interrupt Disable Register +#define AT91C_PWMC_SR ((AT91_REG *) 0xFFFCC00C) // (PWMC) PWMC Status Register +#define AT91C_PWMC_ENA ((AT91_REG *) 0xFFFCC004) // (PWMC) PWMC Enable Register +#define AT91C_PWMC_IMR ((AT91_REG *) 0xFFFCC018) // (PWMC) PWMC Interrupt Mask Register +#define AT91C_PWMC_MR ((AT91_REG *) 0xFFFCC000) // (PWMC) PWMC Mode Register +#define AT91C_PWMC_DIS ((AT91_REG *) 0xFFFCC008) // (PWMC) PWMC Disable Register +#define AT91C_PWMC_IER ((AT91_REG *) 0xFFFCC010) // (PWMC) PWMC Interrupt Enable Register +// ========== Register definition for UDP peripheral ========== +#define AT91C_UDP_ISR ((AT91_REG *) 0xFFFB001C) // (UDP) Interrupt Status Register +#define AT91C_UDP_IDR ((AT91_REG *) 0xFFFB0014) // (UDP) Interrupt Disable Register +#define AT91C_UDP_GLBSTATE ((AT91_REG *) 0xFFFB0004) // (UDP) Global State Register +#define AT91C_UDP_FDR ((AT91_REG *) 0xFFFB0050) // (UDP) Endpoint FIFO Data Register +#define AT91C_UDP_CSR ((AT91_REG *) 0xFFFB0030) // (UDP) Endpoint Control and Status Register +#define AT91C_UDP_RSTEP ((AT91_REG *) 0xFFFB0028) // (UDP) Reset Endpoint Register +#define AT91C_UDP_ICR ((AT91_REG *) 0xFFFB0020) // (UDP) Interrupt Clear Register +#define AT91C_UDP_IMR ((AT91_REG *) 0xFFFB0018) // (UDP) Interrupt Mask Register +#define AT91C_UDP_IER ((AT91_REG *) 0xFFFB0010) // (UDP) Interrupt Enable Register +#define AT91C_UDP_FADDR ((AT91_REG *) 0xFFFB0008) // (UDP) Function Address Register +#define AT91C_UDP_NUM ((AT91_REG *) 0xFFFB0000) // (UDP) Frame Number Register + +// ***************************************************************************** +// PIO DEFINITIONS FOR AT91SAM7S64 +// ***************************************************************************** +#define AT91C_PIO_PA0 ((unsigned int) 1 << 0) // Pin Controlled by PA0 +#define AT91C_PA0_PWM0 ((unsigned int) AT91C_PIO_PA0) // PWM Channel 0 +#define AT91C_PA0_TIOA0 ((unsigned int) AT91C_PIO_PA0) // Timer Counter 0 Multipurpose Timer I/O Pin A +#define AT91C_PIO_PA1 ((unsigned int) 1 << 1) // Pin Controlled by PA1 +#define AT91C_PA1_PWM1 ((unsigned int) AT91C_PIO_PA1) // PWM Channel 1 +#define AT91C_PA1_TIOB0 ((unsigned int) AT91C_PIO_PA1) // Timer Counter 0 Multipurpose Timer I/O Pin B +#define AT91C_PIO_PA10 ((unsigned int) 1 << 10) // Pin Controlled by PA10 +#define AT91C_PA10_DTXD ((unsigned int) AT91C_PIO_PA10) // DBGU Debug Transmit Data +#define AT91C_PA10_NPCS2 ((unsigned int) AT91C_PIO_PA10) // SPI Peripheral Chip Select 2 +#define AT91C_PIO_PA11 ((unsigned int) 1 << 11) // Pin Controlled by PA11 +#define AT91C_PA11_NPCS0 ((unsigned int) AT91C_PIO_PA11) // SPI Peripheral Chip Select 0 +#define AT91C_PA11_PWM0 ((unsigned int) AT91C_PIO_PA11) // PWM Channel 0 +#define AT91C_PIO_PA12 ((unsigned int) 1 << 12) // Pin Controlled by PA12 +#define AT91C_PA12_MISO ((unsigned int) AT91C_PIO_PA12) // SPI Master In Slave +#define AT91C_PA12_PWM1 ((unsigned int) AT91C_PIO_PA12) // PWM Channel 1 +#define AT91C_PIO_PA13 ((unsigned int) 1 << 13) // Pin Controlled by PA13 +#define AT91C_PA13_MOSI ((unsigned int) AT91C_PIO_PA13) // SPI Master Out Slave +#define AT91C_PA13_PWM2 ((unsigned int) AT91C_PIO_PA13) // PWM Channel 2 +#define AT91C_PIO_PA14 ((unsigned int) 1 << 14) // Pin Controlled by PA14 +#define AT91C_PA14_SPCK ((unsigned int) AT91C_PIO_PA14) // SPI Serial Clock +#define AT91C_PA14_PWM3 ((unsigned int) AT91C_PIO_PA14) // PWM Channel 3 +#define AT91C_PIO_PA15 ((unsigned int) 1 << 15) // Pin Controlled by PA15 +#define AT91C_PA15_TF ((unsigned int) AT91C_PIO_PA15) // SSC Transmit Frame Sync +#define AT91C_PA15_TIOA1 ((unsigned int) AT91C_PIO_PA15) // Timer Counter 1 Multipurpose Timer I/O Pin A +#define AT91C_PIO_PA16 ((unsigned int) 1 << 16) // Pin Controlled by PA16 +#define AT91C_PA16_TK ((unsigned int) AT91C_PIO_PA16) // SSC Transmit Clock +#define AT91C_PA16_TIOB1 ((unsigned int) AT91C_PIO_PA16) // Timer Counter 1 Multipurpose Timer I/O Pin B +#define AT91C_PIO_PA17 ((unsigned int) 1 << 17) // Pin Controlled by PA17 +#define AT91C_PA17_TD ((unsigned int) AT91C_PIO_PA17) // SSC Transmit data +#define AT91C_PA17_PCK1 ((unsigned int) AT91C_PIO_PA17) // PMC Programmable Clock Output 1 +#define AT91C_PIO_PA18 ((unsigned int) 1 << 18) // Pin Controlled by PA18 +#define AT91C_PA18_RD ((unsigned int) AT91C_PIO_PA18) // SSC Receive Data +#define AT91C_PA18_PCK2 ((unsigned int) AT91C_PIO_PA18) // PMC Programmable Clock Output 2 +#define AT91C_PIO_PA19 ((unsigned int) 1 << 19) // Pin Controlled by PA19 +#define AT91C_PA19_RK ((unsigned int) AT91C_PIO_PA19) // SSC Receive Clock +#define AT91C_PA19_FIQ ((unsigned int) AT91C_PIO_PA19) // AIC Fast Interrupt Input +#define AT91C_PIO_PA2 ((unsigned int) 1 << 2) // Pin Controlled by PA2 +#define AT91C_PA2_PWM2 ((unsigned int) AT91C_PIO_PA2) // PWM Channel 2 +#define AT91C_PA2_SCK0 ((unsigned int) AT91C_PIO_PA2) // USART 0 Serial Clock +#define AT91C_PIO_PA20 ((unsigned int) 1 << 20) // Pin Controlled by PA20 +#define AT91C_PA20_RF ((unsigned int) AT91C_PIO_PA20) // SSC Receive Frame Sync +#define AT91C_PA20_IRQ0 ((unsigned int) AT91C_PIO_PA20) // External Interrupt 0 +#define AT91C_PIO_PA21 ((unsigned int) 1 << 21) // Pin Controlled by PA21 +#define AT91C_PA21_RXD1 ((unsigned int) AT91C_PIO_PA21) // USART 1 Receive Data +#define AT91C_PA21_PCK1 ((unsigned int) AT91C_PIO_PA21) // PMC Programmable Clock Output 1 +#define AT91C_PIO_PA22 ((unsigned int) 1 << 22) // Pin Controlled by PA22 +#define AT91C_PA22_TXD1 ((unsigned int) AT91C_PIO_PA22) // USART 1 Transmit Data +#define AT91C_PA22_NPCS3 ((unsigned int) AT91C_PIO_PA22) // SPI Peripheral Chip Select 3 +#define AT91C_PIO_PA23 ((unsigned int) 1 << 23) // Pin Controlled by PA23 +#define AT91C_PA23_SCK1 ((unsigned int) AT91C_PIO_PA23) // USART 1 Serial Clock +#define AT91C_PA23_PWM0 ((unsigned int) AT91C_PIO_PA23) // PWM Channel 0 +#define AT91C_PIO_PA24 ((unsigned int) 1 << 24) // Pin Controlled by PA24 +#define AT91C_PA24_RTS1 ((unsigned int) AT91C_PIO_PA24) // USART 1 Ready To Send +#define AT91C_PA24_PWM1 ((unsigned int) AT91C_PIO_PA24) // PWM Channel 1 +#define AT91C_PIO_PA25 ((unsigned int) 1 << 25) // Pin Controlled by PA25 +#define AT91C_PA25_CTS1 ((unsigned int) AT91C_PIO_PA25) // USART 1 Clear To Send +#define AT91C_PA25_PWM2 ((unsigned int) AT91C_PIO_PA25) // PWM Channel 2 +#define AT91C_PIO_PA26 ((unsigned int) 1 << 26) // Pin Controlled by PA26 +#define AT91C_PA26_DCD1 ((unsigned int) AT91C_PIO_PA26) // USART 1 Data Carrier Detect +#define AT91C_PA26_TIOA2 ((unsigned int) AT91C_PIO_PA26) // Timer Counter 2 Multipurpose Timer I/O Pin A +#define AT91C_PIO_PA27 ((unsigned int) 1 << 27) // Pin Controlled by PA27 +#define AT91C_PA27_DTR1 ((unsigned int) AT91C_PIO_PA27) // USART 1 Data Terminal ready +#define AT91C_PA27_TIOB2 ((unsigned int) AT91C_PIO_PA27) // Timer Counter 2 Multipurpose Timer I/O Pin B +#define AT91C_PIO_PA28 ((unsigned int) 1 << 28) // Pin Controlled by PA28 +#define AT91C_PA28_DSR1 ((unsigned int) AT91C_PIO_PA28) // USART 1 Data Set ready +#define AT91C_PA28_TCLK1 ((unsigned int) AT91C_PIO_PA28) // Timer Counter 1 external clock input +#define AT91C_PIO_PA29 ((unsigned int) 1 << 29) // Pin Controlled by PA29 +#define AT91C_PA29_RI1 ((unsigned int) AT91C_PIO_PA29) // USART 1 Ring Indicator +#define AT91C_PA29_TCLK2 ((unsigned int) AT91C_PIO_PA29) // Timer Counter 2 external clock input +#define AT91C_PIO_PA3 ((unsigned int) 1 << 3) // Pin Controlled by PA3 +#define AT91C_PA3_TWD ((unsigned int) AT91C_PIO_PA3) // TWI Two-wire Serial Data +#define AT91C_PA3_NPCS3 ((unsigned int) AT91C_PIO_PA3) // SPI Peripheral Chip Select 3 +#define AT91C_PIO_PA30 ((unsigned int) 1 << 30) // Pin Controlled by PA30 +#define AT91C_PA30_IRQ1 ((unsigned int) AT91C_PIO_PA30) // External Interrupt 1 +#define AT91C_PA30_NPCS2 ((unsigned int) AT91C_PIO_PA30) // SPI Peripheral Chip Select 2 +#define AT91C_PIO_PA31 ((unsigned int) 1 << 31) // Pin Controlled by PA31 +#define AT91C_PA31_NPCS1 ((unsigned int) AT91C_PIO_PA31) // SPI Peripheral Chip Select 1 +#define AT91C_PA31_PCK2 ((unsigned int) AT91C_PIO_PA31) // PMC Programmable Clock Output 2 +#define AT91C_PIO_PA4 ((unsigned int) 1 << 4) // Pin Controlled by PA4 +#define AT91C_PA4_TWCK ((unsigned int) AT91C_PIO_PA4) // TWI Two-wire Serial Clock +#define AT91C_PA4_TCLK0 ((unsigned int) AT91C_PIO_PA4) // Timer Counter 0 external clock input +#define AT91C_PIO_PA5 ((unsigned int) 1 << 5) // Pin Controlled by PA5 +#define AT91C_PA5_RXD0 ((unsigned int) AT91C_PIO_PA5) // USART 0 Receive Data +#define AT91C_PA5_NPCS3 ((unsigned int) AT91C_PIO_PA5) // SPI Peripheral Chip Select 3 +#define AT91C_PIO_PA6 ((unsigned int) 1 << 6) // Pin Controlled by PA6 +#define AT91C_PA6_TXD0 ((unsigned int) AT91C_PIO_PA6) // USART 0 Transmit Data +#define AT91C_PA6_PCK0 ((unsigned int) AT91C_PIO_PA6) // PMC Programmable Clock Output 0 +#define AT91C_PIO_PA7 ((unsigned int) 1 << 7) // Pin Controlled by PA7 +#define AT91C_PA7_RTS0 ((unsigned int) AT91C_PIO_PA7) // USART 0 Ready To Send +#define AT91C_PA7_PWM3 ((unsigned int) AT91C_PIO_PA7) // PWM Channel 3 +#define AT91C_PIO_PA8 ((unsigned int) 1 << 8) // Pin Controlled by PA8 +#define AT91C_PA8_CTS0 ((unsigned int) AT91C_PIO_PA8) // USART 0 Clear To Send +#define AT91C_PA8_ADTRG ((unsigned int) AT91C_PIO_PA8) // ADC External Trigger +#define AT91C_PIO_PA9 ((unsigned int) 1 << 9) // Pin Controlled by PA9 +#define AT91C_PA9_DRXD ((unsigned int) AT91C_PIO_PA9) // DBGU Debug Receive Data +#define AT91C_PA9_NPCS1 ((unsigned int) AT91C_PIO_PA9) // SPI Peripheral Chip Select 1 + +// ***************************************************************************** +// PERIPHERAL ID DEFINITIONS FOR AT91SAM7S64 +// ***************************************************************************** +#define AT91C_ID_FIQ ((unsigned int) 0) // Advanced Interrupt Controller (FIQ) +#define AT91C_ID_SYS ((unsigned int) 1) // System Peripheral +#define AT91C_ID_PIOA ((unsigned int) 2) // Parallel IO Controller +#define AT91C_ID_3_Reserved ((unsigned int) 3) // Reserved +#define AT91C_ID_ADC ((unsigned int) 4) // Analog-to-Digital Converter +#define AT91C_ID_SPI ((unsigned int) 5) // Serial Peripheral Interface +#define AT91C_ID_US0 ((unsigned int) 6) // USART 0 +#define AT91C_ID_US1 ((unsigned int) 7) // USART 1 +#define AT91C_ID_SSC ((unsigned int) 8) // Serial Synchronous Controller +#define AT91C_ID_TWI ((unsigned int) 9) // Two-Wire Interface +#define AT91C_ID_PWMC ((unsigned int) 10) // PWM Controller +#define AT91C_ID_UDP ((unsigned int) 11) // USB Device Port +#define AT91C_ID_TC0 ((unsigned int) 12) // Timer Counter 0 +#define AT91C_ID_TC1 ((unsigned int) 13) // Timer Counter 1 +#define AT91C_ID_TC2 ((unsigned int) 14) // Timer Counter 2 +#define AT91C_ID_15_Reserved ((unsigned int) 15) // Reserved +#define AT91C_ID_16_Reserved ((unsigned int) 16) // Reserved +#define AT91C_ID_17_Reserved ((unsigned int) 17) // Reserved +#define AT91C_ID_18_Reserved ((unsigned int) 18) // Reserved +#define AT91C_ID_19_Reserved ((unsigned int) 19) // Reserved +#define AT91C_ID_20_Reserved ((unsigned int) 20) // Reserved +#define AT91C_ID_21_Reserved ((unsigned int) 21) // Reserved +#define AT91C_ID_22_Reserved ((unsigned int) 22) // Reserved +#define AT91C_ID_23_Reserved ((unsigned int) 23) // Reserved +#define AT91C_ID_24_Reserved ((unsigned int) 24) // Reserved +#define AT91C_ID_25_Reserved ((unsigned int) 25) // Reserved +#define AT91C_ID_26_Reserved ((unsigned int) 26) // Reserved +#define AT91C_ID_27_Reserved ((unsigned int) 27) // Reserved +#define AT91C_ID_28_Reserved ((unsigned int) 28) // Reserved +#define AT91C_ID_29_Reserved ((unsigned int) 29) // Reserved +#define AT91C_ID_IRQ0 ((unsigned int) 30) // Advanced Interrupt Controller (IRQ0) +#define AT91C_ID_IRQ1 ((unsigned int) 31) // Advanced Interrupt Controller (IRQ1) + +// ***************************************************************************** +// BASE ADDRESS DEFINITIONS FOR AT91SAM7S64 +// ***************************************************************************** +#define AT91C_BASE_SYSC ((AT91PS_SYSC) 0xFFFFF000) // (SYSC) Base Address +#define AT91C_BASE_AIC ((AT91PS_AIC) 0xFFFFF000) // (AIC) Base Address +#define AT91C_BASE_DBGU ((AT91PS_DBGU) 0xFFFFF200) // (DBGU) Base Address +#define AT91C_BASE_PDC_DBGU ((AT91PS_PDC) 0xFFFFF300) // (PDC_DBGU) Base Address +#define AT91C_BASE_PIOA ((AT91PS_PIO) 0xFFFFF400) // (PIOA) Base Address +#define AT91C_BASE_CKGR ((AT91PS_CKGR) 0xFFFFFC20) // (CKGR) Base Address +#define AT91C_BASE_PMC ((AT91PS_PMC) 0xFFFFFC00) // (PMC) Base Address +#define AT91C_BASE_RSTC ((AT91PS_RSTC) 0xFFFFFD00) // (RSTC) Base Address +#define AT91C_BASE_RTTC ((AT91PS_RTTC) 0xFFFFFD20) // (RTTC) Base Address +#define AT91C_BASE_PITC ((AT91PS_PITC) 0xFFFFFD30) // (PITC) Base Address +#define AT91C_BASE_WDTC ((AT91PS_WDTC) 0xFFFFFD40) // (WDTC) Base Address +#define AT91C_BASE_MC ((AT91PS_MC) 0xFFFFFF00) // (MC) Base Address +#define AT91C_BASE_PDC_SPI ((AT91PS_PDC) 0xFFFE0100) // (PDC_SPI) Base Address +#define AT91C_BASE_SPI ((AT91PS_SPI) 0xFFFE0000) // (SPI) Base Address +#define AT91C_BASE_PDC_ADC ((AT91PS_PDC) 0xFFFD8100) // (PDC_ADC) Base Address +#define AT91C_BASE_ADC ((AT91PS_ADC) 0xFFFD8000) // (ADC) Base Address +#define AT91C_BASE_PDC_SSC ((AT91PS_PDC) 0xFFFD4100) // (PDC_SSC) Base Address +#define AT91C_BASE_SSC ((AT91PS_SSC) 0xFFFD4000) // (SSC) Base Address +#define AT91C_BASE_PDC_US1 ((AT91PS_PDC) 0xFFFC4100) // (PDC_US1) Base Address +#define AT91C_BASE_US1 ((AT91PS_USART) 0xFFFC4000) // (US1) Base Address +#define AT91C_BASE_PDC_US0 ((AT91PS_PDC) 0xFFFC0100) // (PDC_US0) Base Address +#define AT91C_BASE_US0 ((AT91PS_USART) 0xFFFC0000) // (US0) Base Address +#define AT91C_BASE_TWI ((AT91PS_TWI) 0xFFFB8000) // (TWI) Base Address +#define AT91C_BASE_TC2 ((AT91PS_TC) 0xFFFA0080) // (TC2) Base Address +#define AT91C_BASE_TC1 ((AT91PS_TC) 0xFFFA0040) // (TC1) Base Address +#define AT91C_BASE_TC0 ((AT91PS_TC) 0xFFFA0000) // (TC0) Base Address +#define AT91C_BASE_TCB ((AT91PS_TCB) 0xFFFA0000) // (TCB) Base Address +#define AT91C_BASE_PWMC_CH3 ((AT91PS_PWMC_CH) 0xFFFCC260) // (PWMC_CH3) Base Address +#define AT91C_BASE_PWMC_CH2 ((AT91PS_PWMC_CH) 0xFFFCC240) // (PWMC_CH2) Base Address +#define AT91C_BASE_PWMC_CH1 ((AT91PS_PWMC_CH) 0xFFFCC220) // (PWMC_CH1) Base Address +#define AT91C_BASE_PWMC_CH0 ((AT91PS_PWMC_CH) 0xFFFCC200) // (PWMC_CH0) Base Address +#define AT91C_BASE_PWMC ((AT91PS_PWMC) 0xFFFCC000) // (PWMC) Base Address +#define AT91C_BASE_UDP ((AT91PS_UDP) 0xFFFB0000) // (UDP) Base Address + +// ***************************************************************************** +// MEMORY MAPPING DEFINITIONS FOR AT91SAM7S64 +// ***************************************************************************** +#define AT91C_ISRAM ((char *) 0x00200000) // Internal SRAM base address +#define AT91C_ISRAM_SIZE ((unsigned int) 0x00004000) // Internal SRAM size in byte (16 Kbyte) +#define AT91C_IFLASH ((char *) 0x00100000) // Internal ROM base address +#define AT91C_IFLASH_SIZE ((unsigned int) 0x00010000) // Internal ROM size in byte (64 Kbyte) + +#endif diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM7S64/AT91SAM7S64_inc.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM7S64/AT91SAM7S64_inc.h new file mode 100644 index 0000000..7d2657a --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM7S64/AT91SAM7S64_inc.h @@ -0,0 +1,1812 @@ +// ---------------------------------------------------------------------------- +// ATMEL Microcontroller Software Support - ROUSSET - +// ---------------------------------------------------------------------------- +// The software is delivered "AS IS" without warranty or condition of any +// kind, either express, implied or statutory. This includes without +// limitation any warranty or condition with respect to merchantability or +// fitness for any particular purpose, or against the infringements of +// intellectual property rights of others. +// ---------------------------------------------------------------------------- +// File Name : AT91SAM7S64.h +// Object : AT91SAM7S64 definitions +// Generated : AT91 SW Application Group 07/16/2004 (07:43:09) +// +// CVS Reference : /AT91SAM7S64.pl/1.12/Mon Jul 12 13:02:30 2004// +// CVS Reference : /SYSC_SAM7Sxx.pl/1.5/Mon Jul 12 16:22:12 2004// +// CVS Reference : /MC_SAM02.pl/1.3/Wed Mar 10 08:37:04 2004// +// CVS Reference : /UDP_1765B.pl/1.3/Fri Aug 2 14:45:38 2002// +// CVS Reference : /AIC_1796B.pl/1.1.1.1/Fri Jun 28 09:36:48 2002// +// CVS Reference : /lib_pmc_SAM.h/1.6/Tue Apr 27 13:53:52 2004// +// CVS Reference : /PIO_1725D.pl/1.1.1.1/Fri Jun 28 09:36:48 2002// +// CVS Reference : /DBGU_1754A.pl/1.4/Fri Jan 31 12:18:24 2003// +// CVS Reference : /US_1739C.pl/1.2/Mon Jul 12 17:26:24 2004// +// CVS Reference : /SPI2.pl/1.2/Fri Oct 17 08:13:40 2003// +// CVS Reference : /SSC_1762A.pl/1.2/Fri Nov 8 13:26:40 2002// +// CVS Reference : /lib_tc_1753b.h/1.1/Fri Jan 31 12:20:02 2003// +// CVS Reference : /TWI_1761B.pl/1.4/Fri Feb 7 10:30:08 2003// +// CVS Reference : /PDC_1734B.pl/1.2/Thu Nov 21 16:38:24 2002// +// CVS Reference : /ADC_SAM.pl/1.7/Fri Oct 17 08:12:38 2003// +// CVS Reference : /lib_PWM_SAM.h/1.3/Thu Jan 22 10:10:50 2004// +// ---------------------------------------------------------------------------- + +// Hardware register definition + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR System Peripherals +// ***************************************************************************** +// *** Register offset in AT91S_SYSC structure *** +#define SYSC_AIC_SMR ( 0) // Source Mode Register +#define SYSC_AIC_SVR (128) // Source Vector Register +#define SYSC_AIC_IVR (256) // IRQ Vector Register +#define SYSC_AIC_FVR (260) // FIQ Vector Register +#define SYSC_AIC_ISR (264) // Interrupt Status Register +#define SYSC_AIC_IPR (268) // Interrupt Pending Register +#define SYSC_AIC_IMR (272) // Interrupt Mask Register +#define SYSC_AIC_CISR (276) // Core Interrupt Status Register +#define SYSC_AIC_IECR (288) // Interrupt Enable Command Register +#define SYSC_AIC_IDCR (292) // Interrupt Disable Command Register +#define SYSC_AIC_ICCR (296) // Interrupt Clear Command Register +#define SYSC_AIC_ISCR (300) // Interrupt Set Command Register +#define SYSC_AIC_EOICR (304) // End of Interrupt Command Register +#define SYSC_AIC_SPU (308) // Spurious Vector Register +#define SYSC_AIC_DCR (312) // Debug Control Register (Protect) +#define SYSC_AIC_FFER (320) // Fast Forcing Enable Register +#define SYSC_AIC_FFDR (324) // Fast Forcing Disable Register +#define SYSC_AIC_FFSR (328) // Fast Forcing Status Register +#define SYSC_DBGU_CR (512) // Control Register +#define SYSC_DBGU_MR (516) // Mode Register +#define SYSC_DBGU_IER (520) // Interrupt Enable Register +#define SYSC_DBGU_IDR (524) // Interrupt Disable Register +#define SYSC_DBGU_IMR (528) // Interrupt Mask Register +#define SYSC_DBGU_CSR (532) // Channel Status Register +#define SYSC_DBGU_RHR (536) // Receiver Holding Register +#define SYSC_DBGU_THR (540) // Transmitter Holding Register +#define SYSC_DBGU_BRGR (544) // Baud Rate Generator Register +#define SYSC_DBGU_C1R (576) // Chip ID1 Register +#define SYSC_DBGU_C2R (580) // Chip ID2 Register +#define SYSC_DBGU_FNTR (584) // Force NTRST Register +#define SYSC_DBGU_RPR (768) // Receive Pointer Register +#define SYSC_DBGU_RCR (772) // Receive Counter Register +#define SYSC_DBGU_TPR (776) // Transmit Pointer Register +#define SYSC_DBGU_TCR (780) // Transmit Counter Register +#define SYSC_DBGU_RNPR (784) // Receive Next Pointer Register +#define SYSC_DBGU_RNCR (788) // Receive Next Counter Register +#define SYSC_DBGU_TNPR (792) // Transmit Next Pointer Register +#define SYSC_DBGU_TNCR (796) // Transmit Next Counter Register +#define SYSC_DBGU_PTCR (800) // PDC Transfer Control Register +#define SYSC_DBGU_PTSR (804) // PDC Transfer Status Register +#define SYSC_PIOA_PER (1024) // PIO Enable Register +#define SYSC_PIOA_PDR (1028) // PIO Disable Register +#define SYSC_PIOA_PSR (1032) // PIO Status Register +#define SYSC_PIOA_OER (1040) // Output Enable Register +#define SYSC_PIOA_ODR (1044) // Output Disable Registerr +#define SYSC_PIOA_OSR (1048) // Output Status Register +#define SYSC_PIOA_IFER (1056) // Input Filter Enable Register +#define SYSC_PIOA_IFDR (1060) // Input Filter Disable Register +#define SYSC_PIOA_IFSR (1064) // Input Filter Status Register +#define SYSC_PIOA_SODR (1072) // Set Output Data Register +#define SYSC_PIOA_CODR (1076) // Clear Output Data Register +#define SYSC_PIOA_ODSR (1080) // Output Data Status Register +#define SYSC_PIOA_PDSR (1084) // Pin Data Status Register +#define SYSC_PIOA_IER (1088) // Interrupt Enable Register +#define SYSC_PIOA_IDR (1092) // Interrupt Disable Register +#define SYSC_PIOA_IMR (1096) // Interrupt Mask Register +#define SYSC_PIOA_ISR (1100) // Interrupt Status Register +#define SYSC_PIOA_MDER (1104) // Multi-driver Enable Register +#define SYSC_PIOA_MDDR (1108) // Multi-driver Disable Register +#define SYSC_PIOA_MDSR (1112) // Multi-driver Status Register +#define SYSC_PIOA_PPUDR (1120) // Pull-up Disable Register +#define SYSC_PIOA_PPUER (1124) // Pull-up Enable Register +#define SYSC_PIOA_PPUSR (1128) // Pad Pull-up Status Register +#define SYSC_PIOA_ASR (1136) // Select A Register +#define SYSC_PIOA_BSR (1140) // Select B Register +#define SYSC_PIOA_ABSR (1144) // AB Select Status Register +#define SYSC_PIOA_OWER (1184) // Output Write Enable Register +#define SYSC_PIOA_OWDR (1188) // Output Write Disable Register +#define SYSC_PIOA_OWSR (1192) // Output Write Status Register +#define SYSC_PMC_SCER (3072) // System Clock Enable Register +#define SYSC_PMC_SCDR (3076) // System Clock Disable Register +#define SYSC_PMC_SCSR (3080) // System Clock Status Register +#define SYSC_PMC_PCER (3088) // Peripheral Clock Enable Register +#define SYSC_PMC_PCDR (3092) // Peripheral Clock Disable Register +#define SYSC_PMC_PCSR (3096) // Peripheral Clock Status Register +#define SYSC_PMC_MOR (3104) // Main Oscillator Register +#define SYSC_PMC_MCFR (3108) // Main Clock Frequency Register +#define SYSC_PMC_PLLR (3116) // PLL Register +#define SYSC_PMC_MCKR (3120) // Master Clock Register +#define SYSC_PMC_PCKR (3136) // Programmable Clock Register +#define SYSC_PMC_IER (3168) // Interrupt Enable Register +#define SYSC_PMC_IDR (3172) // Interrupt Disable Register +#define SYSC_PMC_SR (3176) // Status Register +#define SYSC_PMC_IMR (3180) // Interrupt Mask Register +#define SYSC_RSTC_RCR (3328) // Reset Control Register +#define SYSC_RSTC_RSR (3332) // Reset Status Register +#define SYSC_RSTC_RMR (3336) // Reset Mode Register +#define SYSC_RTTC_RTMR (3360) // Real-time Mode Register +#define SYSC_RTTC_RTAR (3364) // Real-time Alarm Register +#define SYSC_RTTC_RTVR (3368) // Real-time Value Register +#define SYSC_RTTC_RTSR (3372) // Real-time Status Register +#define SYSC_PITC_PIMR (3376) // Period Interval Mode Register +#define SYSC_PITC_PISR (3380) // Period Interval Status Register +#define SYSC_PITC_PIVR (3384) // Period Interval Value Register +#define SYSC_PITC_PIIR (3388) // Period Interval Image Register +#define SYSC_WDTC_WDCR (3392) // Watchdog Control Register +#define SYSC_WDTC_WDMR (3396) // Watchdog Mode Register +#define SYSC_WDTC_WDSR (3400) // Watchdog Status Register +#define SYSC_SYSC_VRPM (3424) // Voltage Regulator Power Mode Register +// -------- VRPM : (SYSC Offset: 0xd60) Voltage Regulator Power Mode Register -------- +#define AT91C_SYSC_PSTDBY (0x1 << 0) // (SYSC) Voltage Regulator Power Mode + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Advanced Interrupt Controller +// ***************************************************************************** +// *** Register offset in AT91S_AIC structure *** +#define AIC_SMR ( 0) // Source Mode Register +#define AIC_SVR (128) // Source Vector Register +#define AIC_IVR (256) // IRQ Vector Register +#define AIC_FVR (260) // FIQ Vector Register +#define AIC_ISR (264) // Interrupt Status Register +#define AIC_IPR (268) // Interrupt Pending Register +#define AIC_IMR (272) // Interrupt Mask Register +#define AIC_CISR (276) // Core Interrupt Status Register +#define AIC_IECR (288) // Interrupt Enable Command Register +#define AIC_IDCR (292) // Interrupt Disable Command Register +#define AIC_ICCR (296) // Interrupt Clear Command Register +#define AIC_ISCR (300) // Interrupt Set Command Register +#define AIC_EOICR (304) // End of Interrupt Command Register +#define AIC_SPU (308) // Spurious Vector Register +#define AIC_DCR (312) // Debug Control Register (Protect) +#define AIC_FFER (320) // Fast Forcing Enable Register +#define AIC_FFDR (324) // Fast Forcing Disable Register +#define AIC_FFSR (328) // Fast Forcing Status Register +// -------- AIC_SMR : (AIC Offset: 0x0) Control Register -------- +#define AT91C_AIC_PRIOR (0x7 << 0) // (AIC) Priority Level +#define AT91C_AIC_PRIOR_LOWEST (0x0) // (AIC) Lowest priority level +#define AT91C_AIC_PRIOR_HIGHEST (0x7) // (AIC) Highest priority level +#define AT91C_AIC_SRCTYPE (0x3 << 5) // (AIC) Interrupt Source Type +#define AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE (0x0 << 5) // (AIC) Internal Sources Code Label Level Sensitive +#define AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED (0x1 << 5) // (AIC) Internal Sources Code Label Edge triggered +#define AT91C_AIC_SRCTYPE_EXT_HIGH_LEVEL (0x2 << 5) // (AIC) External Sources Code Label High-level Sensitive +#define AT91C_AIC_SRCTYPE_EXT_POSITIVE_EDGE (0x3 << 5) // (AIC) External Sources Code Label Positive Edge triggered +// -------- AIC_CISR : (AIC Offset: 0x114) AIC Core Interrupt Status Register -------- +#define AT91C_AIC_NFIQ (0x1 << 0) // (AIC) NFIQ Status +#define AT91C_AIC_NIRQ (0x1 << 1) // (AIC) NIRQ Status +// -------- AIC_DCR : (AIC Offset: 0x138) AIC Debug Control Register (Protect) -------- +#define AT91C_AIC_DCR_PROT (0x1 << 0) // (AIC) Protection Mode +#define AT91C_AIC_DCR_GMSK (0x1 << 1) // (AIC) General Mask + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Debug Unit +// ***************************************************************************** +// *** Register offset in AT91S_DBGU structure *** +#define DBGU_CR ( 0) // Control Register +#define DBGU_MR ( 4) // Mode Register +#define DBGU_IER ( 8) // Interrupt Enable Register +#define DBGU_IDR (12) // Interrupt Disable Register +#define DBGU_IMR (16) // Interrupt Mask Register +#define DBGU_CSR (20) // Channel Status Register +#define DBGU_RHR (24) // Receiver Holding Register +#define DBGU_THR (28) // Transmitter Holding Register +#define DBGU_BRGR (32) // Baud Rate Generator Register +#define DBGU_C1R (64) // Chip ID1 Register +#define DBGU_C2R (68) // Chip ID2 Register +#define DBGU_FNTR (72) // Force NTRST Register +#define DBGU_RPR (256) // Receive Pointer Register +#define DBGU_RCR (260) // Receive Counter Register +#define DBGU_TPR (264) // Transmit Pointer Register +#define DBGU_TCR (268) // Transmit Counter Register +#define DBGU_RNPR (272) // Receive Next Pointer Register +#define DBGU_RNCR (276) // Receive Next Counter Register +#define DBGU_TNPR (280) // Transmit Next Pointer Register +#define DBGU_TNCR (284) // Transmit Next Counter Register +#define DBGU_PTCR (288) // PDC Transfer Control Register +#define DBGU_PTSR (292) // PDC Transfer Status Register +// -------- DBGU_CR : (DBGU Offset: 0x0) Debug Unit Control Register -------- +#define AT91C_US_RSTRX (0x1 << 2) // (DBGU) Reset Receiver +#define AT91C_US_RSTTX (0x1 << 3) // (DBGU) Reset Transmitter +#define AT91C_US_RXEN (0x1 << 4) // (DBGU) Receiver Enable +#define AT91C_US_RXDIS (0x1 << 5) // (DBGU) Receiver Disable +#define AT91C_US_TXEN (0x1 << 6) // (DBGU) Transmitter Enable +#define AT91C_US_TXDIS (0x1 << 7) // (DBGU) Transmitter Disable +// -------- DBGU_MR : (DBGU Offset: 0x4) Debug Unit Mode Register -------- +#define AT91C_US_PAR (0x7 << 9) // (DBGU) Parity type +#define AT91C_US_PAR_EVEN (0x0 << 9) // (DBGU) Even Parity +#define AT91C_US_PAR_ODD (0x1 << 9) // (DBGU) Odd Parity +#define AT91C_US_PAR_SPACE (0x2 << 9) // (DBGU) Parity forced to 0 (Space) +#define AT91C_US_PAR_MARK (0x3 << 9) // (DBGU) Parity forced to 1 (Mark) +#define AT91C_US_PAR_NONE (0x4 << 9) // (DBGU) No Parity +#define AT91C_US_PAR_MULTI_DROP (0x6 << 9) // (DBGU) Multi-drop mode +#define AT91C_US_CHMODE (0x3 << 14) // (DBGU) Channel Mode +#define AT91C_US_CHMODE_NORMAL (0x0 << 14) // (DBGU) Normal Mode: The USART channel operates as an RX/TX USART. +#define AT91C_US_CHMODE_AUTO (0x1 << 14) // (DBGU) Automatic Echo: Receiver Data Input is connected to the TXD pin. +#define AT91C_US_CHMODE_LOCAL (0x2 << 14) // (DBGU) Local Loopback: Transmitter Output Signal is connected to Receiver Input Signal. +#define AT91C_US_CHMODE_REMOTE (0x3 << 14) // (DBGU) Remote Loopback: RXD pin is internally connected to TXD pin. +// -------- DBGU_IER : (DBGU Offset: 0x8) Debug Unit Interrupt Enable Register -------- +#define AT91C_US_RXRDY (0x1 << 0) // (DBGU) RXRDY Interrupt +#define AT91C_US_TXRDY (0x1 << 1) // (DBGU) TXRDY Interrupt +#define AT91C_US_ENDRX (0x1 << 3) // (DBGU) End of Receive Transfer Interrupt +#define AT91C_US_ENDTX (0x1 << 4) // (DBGU) End of Transmit Interrupt +#define AT91C_US_OVRE (0x1 << 5) // (DBGU) Overrun Interrupt +#define AT91C_US_FRAME (0x1 << 6) // (DBGU) Framing Error Interrupt +#define AT91C_US_PARE (0x1 << 7) // (DBGU) Parity Error Interrupt +#define AT91C_US_TXEMPTY (0x1 << 9) // (DBGU) TXEMPTY Interrupt +#define AT91C_US_TXBUFE (0x1 << 11) // (DBGU) TXBUFE Interrupt +#define AT91C_US_RXBUFF (0x1 << 12) // (DBGU) RXBUFF Interrupt +#define AT91C_US_COMM_TX (0x1 << 30) // (DBGU) COMM_TX Interrupt +#define AT91C_US_COMM_RX (0x1 << 31) // (DBGU) COMM_RX Interrupt +// -------- DBGU_IDR : (DBGU Offset: 0xc) Debug Unit Interrupt Disable Register -------- +// -------- DBGU_IMR : (DBGU Offset: 0x10) Debug Unit Interrupt Mask Register -------- +// -------- DBGU_CSR : (DBGU Offset: 0x14) Debug Unit Channel Status Register -------- +// -------- DBGU_FNTR : (DBGU Offset: 0x48) Debug Unit FORCE_NTRST Register -------- +#define AT91C_US_FORCE_NTRST (0x1 << 0) // (DBGU) Force NTRST in JTAG + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Peripheral Data Controller +// ***************************************************************************** +// *** Register offset in AT91S_PDC structure *** +#define PDC_RPR ( 0) // Receive Pointer Register +#define PDC_RCR ( 4) // Receive Counter Register +#define PDC_TPR ( 8) // Transmit Pointer Register +#define PDC_TCR (12) // Transmit Counter Register +#define PDC_RNPR (16) // Receive Next Pointer Register +#define PDC_RNCR (20) // Receive Next Counter Register +#define PDC_TNPR (24) // Transmit Next Pointer Register +#define PDC_TNCR (28) // Transmit Next Counter Register +#define PDC_PTCR (32) // PDC Transfer Control Register +#define PDC_PTSR (36) // PDC Transfer Status Register +// -------- PDC_PTCR : (PDC Offset: 0x20) PDC Transfer Control Register -------- +#define AT91C_PDC_RXTEN (0x1 << 0) // (PDC) Receiver Transfer Enable +#define AT91C_PDC_RXTDIS (0x1 << 1) // (PDC) Receiver Transfer Disable +#define AT91C_PDC_TXTEN (0x1 << 8) // (PDC) Transmitter Transfer Enable +#define AT91C_PDC_TXTDIS (0x1 << 9) // (PDC) Transmitter Transfer Disable +// -------- PDC_PTSR : (PDC Offset: 0x24) PDC Transfer Status Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Parallel Input Output Controler +// ***************************************************************************** +// *** Register offset in AT91S_PIO structure *** +#define PIO_PER ( 0) // PIO Enable Register +#define PIO_PDR ( 4) // PIO Disable Register +#define PIO_PSR ( 8) // PIO Status Register +#define PIO_OER (16) // Output Enable Register +#define PIO_ODR (20) // Output Disable Registerr +#define PIO_OSR (24) // Output Status Register +#define PIO_IFER (32) // Input Filter Enable Register +#define PIO_IFDR (36) // Input Filter Disable Register +#define PIO_IFSR (40) // Input Filter Status Register +#define PIO_SODR (48) // Set Output Data Register +#define PIO_CODR (52) // Clear Output Data Register +#define PIO_ODSR (56) // Output Data Status Register +#define PIO_PDSR (60) // Pin Data Status Register +#define PIO_IER (64) // Interrupt Enable Register +#define PIO_IDR (68) // Interrupt Disable Register +#define PIO_IMR (72) // Interrupt Mask Register +#define PIO_ISR (76) // Interrupt Status Register +#define PIO_MDER (80) // Multi-driver Enable Register +#define PIO_MDDR (84) // Multi-driver Disable Register +#define PIO_MDSR (88) // Multi-driver Status Register +#define PIO_PPUDR (96) // Pull-up Disable Register +#define PIO_PPUER (100) // Pull-up Enable Register +#define PIO_PPUSR (104) // Pad Pull-up Status Register +#define PIO_ASR (112) // Select A Register +#define PIO_BSR (116) // Select B Register +#define PIO_ABSR (120) // AB Select Status Register +#define PIO_OWER (160) // Output Write Enable Register +#define PIO_OWDR (164) // Output Write Disable Register +#define PIO_OWSR (168) // Output Write Status Register + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Clock Generator Controler +// ***************************************************************************** +// *** Register offset in AT91S_CKGR structure *** +#define CKGR_MOR ( 0) // Main Oscillator Register +#define CKGR_MCFR ( 4) // Main Clock Frequency Register +#define CKGR_PLLR (12) // PLL Register +// -------- CKGR_MOR : (CKGR Offset: 0x0) Main Oscillator Register -------- +#define AT91C_CKGR_MOSCEN (0x1 << 0) // (CKGR) Main Oscillator Enable +#define AT91C_CKGR_OSCBYPASS (0x1 << 1) // (CKGR) Main Oscillator Bypass +#define AT91C_CKGR_OSCOUNT (0xFF << 8) // (CKGR) Main Oscillator Start-up Time +// -------- CKGR_MCFR : (CKGR Offset: 0x4) Main Clock Frequency Register -------- +#define AT91C_CKGR_MAINF (0xFFFF << 0) // (CKGR) Main Clock Frequency +#define AT91C_CKGR_MAINRDY (0x1 << 16) // (CKGR) Main Clock Ready +// -------- CKGR_PLLR : (CKGR Offset: 0xc) PLL B Register -------- +#define AT91C_CKGR_DIV (0xFF << 0) // (CKGR) Divider Selected +#define AT91C_CKGR_DIV_0 (0x0) // (CKGR) Divider output is 0 +#define AT91C_CKGR_DIV_BYPASS (0x1) // (CKGR) Divider is bypassed +#define AT91C_CKGR_PLLCOUNT (0x3F << 8) // (CKGR) PLL Counter +#define AT91C_CKGR_OUT (0x3 << 14) // (CKGR) PLL Output Frequency Range +#define AT91C_CKGR_OUT_0 (0x0 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_OUT_1 (0x1 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_OUT_2 (0x2 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_OUT_3 (0x3 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_MUL (0x7FF << 16) // (CKGR) PLL Multiplier +#define AT91C_CKGR_USBDIV (0x3 << 28) // (CKGR) Divider for USB Clocks +#define AT91C_CKGR_USBDIV_0 (0x0 << 28) // (CKGR) Divider output is PLL clock output +#define AT91C_CKGR_USBDIV_1 (0x1 << 28) // (CKGR) Divider output is PLL clock output divided by 2 +#define AT91C_CKGR_USBDIV_2 (0x2 << 28) // (CKGR) Divider output is PLL clock output divided by 4 + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Power Management Controler +// ***************************************************************************** +// *** Register offset in AT91S_PMC structure *** +#define PMC_SCER ( 0) // System Clock Enable Register +#define PMC_SCDR ( 4) // System Clock Disable Register +#define PMC_SCSR ( 8) // System Clock Status Register +#define PMC_PCER (16) // Peripheral Clock Enable Register +#define PMC_PCDR (20) // Peripheral Clock Disable Register +#define PMC_PCSR (24) // Peripheral Clock Status Register +#define PMC_MOR (32) // Main Oscillator Register +#define PMC_MCFR (36) // Main Clock Frequency Register +#define PMC_PLLR (44) // PLL Register +#define PMC_MCKR (48) // Master Clock Register +#define PMC_PCKR (64) // Programmable Clock Register +#define PMC_IER (96) // Interrupt Enable Register +#define PMC_IDR (100) // Interrupt Disable Register +#define PMC_SR (104) // Status Register +#define PMC_IMR (108) // Interrupt Mask Register +// -------- PMC_SCER : (PMC Offset: 0x0) System Clock Enable Register -------- +#define AT91C_PMC_PCK (0x1 << 0) // (PMC) Processor Clock +#define AT91C_PMC_UDP (0x1 << 7) // (PMC) USB Device Port Clock +#define AT91C_PMC_PCK0 (0x1 << 8) // (PMC) Programmable Clock Output +#define AT91C_PMC_PCK1 (0x1 << 9) // (PMC) Programmable Clock Output +#define AT91C_PMC_PCK2 (0x1 << 10) // (PMC) Programmable Clock Output +#define AT91C_PMC_PCK3 (0x1 << 11) // (PMC) Programmable Clock Output +// -------- PMC_SCDR : (PMC Offset: 0x4) System Clock Disable Register -------- +// -------- PMC_SCSR : (PMC Offset: 0x8) System Clock Status Register -------- +// -------- CKGR_MOR : (PMC Offset: 0x20) Main Oscillator Register -------- +// -------- CKGR_MCFR : (PMC Offset: 0x24) Main Clock Frequency Register -------- +// -------- CKGR_PLLR : (PMC Offset: 0x2c) PLL B Register -------- +// -------- PMC_MCKR : (PMC Offset: 0x30) Master Clock Register -------- +#define AT91C_PMC_CSS (0x3 << 0) // (PMC) Programmable Clock Selection +#define AT91C_PMC_CSS_SLOW_CLK (0x0) // (PMC) Slow Clock is selected +#define AT91C_PMC_CSS_MAIN_CLK (0x1) // (PMC) Main Clock is selected +#define AT91C_PMC_CSS_PLL_CLK (0x3) // (PMC) Clock from PLL is selected +#define AT91C_PMC_PRES (0x7 << 2) // (PMC) Programmable Clock Prescaler +#define AT91C_PMC_PRES_CLK (0x0 << 2) // (PMC) Selected clock +#define AT91C_PMC_PRES_CLK_2 (0x1 << 2) // (PMC) Selected clock divided by 2 +#define AT91C_PMC_PRES_CLK_4 (0x2 << 2) // (PMC) Selected clock divided by 4 +#define AT91C_PMC_PRES_CLK_8 (0x3 << 2) // (PMC) Selected clock divided by 8 +#define AT91C_PMC_PRES_CLK_16 (0x4 << 2) // (PMC) Selected clock divided by 16 +#define AT91C_PMC_PRES_CLK_32 (0x5 << 2) // (PMC) Selected clock divided by 32 +#define AT91C_PMC_PRES_CLK_64 (0x6 << 2) // (PMC) Selected clock divided by 64 +// -------- PMC_PCKR : (PMC Offset: 0x40) Programmable Clock Register -------- +// -------- PMC_IER : (PMC Offset: 0x60) PMC Interrupt Enable Register -------- +#define AT91C_PMC_MOSCS (0x1 << 0) // (PMC) MOSC Status/Enable/Disable/Mask +#define AT91C_PMC_LOCK (0x1 << 2) // (PMC) PLL Status/Enable/Disable/Mask +#define AT91C_PMC_MCKRDY (0x1 << 3) // (PMC) MCK_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK0RDY (0x1 << 8) // (PMC) PCK0_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK1RDY (0x1 << 9) // (PMC) PCK1_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK2RDY (0x1 << 10) // (PMC) PCK2_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK3RDY (0x1 << 11) // (PMC) PCK3_RDY Status/Enable/Disable/Mask +// -------- PMC_IDR : (PMC Offset: 0x64) PMC Interrupt Disable Register -------- +// -------- PMC_SR : (PMC Offset: 0x68) PMC Status Register -------- +// -------- PMC_IMR : (PMC Offset: 0x6c) PMC Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Reset Controller Interface +// ***************************************************************************** +// *** Register offset in AT91S_RSTC structure *** +#define RSTC_RCR ( 0) // Reset Control Register +#define RSTC_RSR ( 4) // Reset Status Register +#define RSTC_RMR ( 8) // Reset Mode Register +// -------- SYSC_RCR : (RSTC Offset: 0x0) Reset Control Register -------- +#define AT91C_SYSC_PROCRST (0x1 << 0) // (RSTC) Processor Reset +#define AT91C_SYSC_ICERST (0x1 << 1) // (RSTC) ICE Interface Reset +#define AT91C_SYSC_PERRST (0x1 << 2) // (RSTC) Peripheral Reset +#define AT91C_SYSC_EXTRST (0x1 << 3) // (RSTC) External Reset +#define AT91C_SYSC_KEY (0xFF << 24) // (RSTC) Password +// -------- SYSC_RSR : (RSTC Offset: 0x4) Reset Status Register -------- +#define AT91C_SYSC_URSTS (0x1 << 0) // (RSTC) User Reset Status +#define AT91C_SYSC_BODSTS (0x1 << 1) // (RSTC) Brown-out Detection Status +#define AT91C_SYSC_RSTTYP (0x7 << 8) // (RSTC) Reset Type +#define AT91C_SYSC_RSTTYP_POWERUP (0x0 << 8) // (RSTC) Power-up Reset. VDDCORE rising. +#define AT91C_SYSC_RSTTYP_WATCHDOG (0x2 << 8) // (RSTC) Watchdog Reset. Watchdog overflow occured. +#define AT91C_SYSC_RSTTYP_SOFTWARE (0x3 << 8) // (RSTC) Software Reset. Processor reset required by the software. +#define AT91C_SYSC_RSTTYP_USER (0x4 << 8) // (RSTC) User Reset. NRST pin detected low. +#define AT91C_SYSC_RSTTYP_BROWNOUT (0x5 << 8) // (RSTC) Brown-out Reset. +#define AT91C_SYSC_NRSTL (0x1 << 16) // (RSTC) NRST pin level +#define AT91C_SYSC_SRCMP (0x1 << 17) // (RSTC) Software Reset Command in Progress. +// -------- SYSC_RMR : (RSTC Offset: 0x8) Reset Mode Register -------- +#define AT91C_SYSC_URSTEN (0x1 << 0) // (RSTC) User Reset Enable +#define AT91C_SYSC_URSTIEN (0x1 << 4) // (RSTC) User Reset Interrupt Enable +#define AT91C_SYSC_ERSTL (0xF << 8) // (RSTC) User Reset Enable +#define AT91C_SYSC_BODIEN (0x1 << 16) // (RSTC) Brown-out Detection Interrupt Enable + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Real Time Timer Controller Interface +// ***************************************************************************** +// *** Register offset in AT91S_RTTC structure *** +#define RTTC_RTMR ( 0) // Real-time Mode Register +#define RTTC_RTAR ( 4) // Real-time Alarm Register +#define RTTC_RTVR ( 8) // Real-time Value Register +#define RTTC_RTSR (12) // Real-time Status Register +// -------- SYSC_RTMR : (RTTC Offset: 0x0) Real-time Mode Register -------- +#define AT91C_SYSC_RTPRES (0xFFFF << 0) // (RTTC) Real-time Timer Prescaler Value +#define AT91C_SYSC_ALMIEN (0x1 << 16) // (RTTC) Alarm Interrupt Enable +#define AT91C_SYSC_RTTINCIEN (0x1 << 17) // (RTTC) Real Time Timer Increment Interrupt Enable +#define AT91C_SYSC_RTTRST (0x1 << 18) // (RTTC) Real Time Timer Restart +// -------- SYSC_RTAR : (RTTC Offset: 0x4) Real-time Alarm Register -------- +#define AT91C_SYSC_ALMV (0x0 << 0) // (RTTC) Alarm Value +// -------- SYSC_RTVR : (RTTC Offset: 0x8) Current Real-time Value Register -------- +#define AT91C_SYSC_CRTV (0x0 << 0) // (RTTC) Current Real-time Value +// -------- SYSC_RTSR : (RTTC Offset: 0xc) Real-time Status Register -------- +#define AT91C_SYSC_ALMS (0x1 << 0) // (RTTC) Real-time Alarm Status +#define AT91C_SYSC_RTTINC (0x1 << 1) // (RTTC) Real-time Timer Increment + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Periodic Interval Timer Controller Interface +// ***************************************************************************** +// *** Register offset in AT91S_PITC structure *** +#define PITC_PIMR ( 0) // Period Interval Mode Register +#define PITC_PISR ( 4) // Period Interval Status Register +#define PITC_PIVR ( 8) // Period Interval Value Register +#define PITC_PIIR (12) // Period Interval Image Register +// -------- SYSC_PIMR : (PITC Offset: 0x0) Periodic Interval Mode Register -------- +#define AT91C_SYSC_PIV (0xFFFFF << 0) // (PITC) Periodic Interval Value +#define AT91C_SYSC_PITEN (0x1 << 24) // (PITC) Periodic Interval Timer Enabled +#define AT91C_SYSC_PITIEN (0x1 << 25) // (PITC) Periodic Interval Timer Interrupt Enable +// -------- SYSC_PISR : (PITC Offset: 0x4) Periodic Interval Status Register -------- +#define AT91C_SYSC_PITS (0x1 << 0) // (PITC) Periodic Interval Timer Status +// -------- SYSC_PIVR : (PITC Offset: 0x8) Periodic Interval Value Register -------- +#define AT91C_SYSC_CPIV (0xFFFFF << 0) // (PITC) Current Periodic Interval Value +#define AT91C_SYSC_PICNT (0xFFF << 20) // (PITC) Periodic Interval Counter +// -------- SYSC_PIIR : (PITC Offset: 0xc) Periodic Interval Image Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Watchdog Timer Controller Interface +// ***************************************************************************** +// *** Register offset in AT91S_WDTC structure *** +#define WDTC_WDCR ( 0) // Watchdog Control Register +#define WDTC_WDMR ( 4) // Watchdog Mode Register +#define WDTC_WDSR ( 8) // Watchdog Status Register +// -------- SYSC_WDCR : (WDTC Offset: 0x0) Periodic Interval Image Register -------- +#define AT91C_SYSC_WDRSTT (0x1 << 0) // (WDTC) Watchdog Restart +// -------- SYSC_WDMR : (WDTC Offset: 0x4) Watchdog Mode Register -------- +#define AT91C_SYSC_WDV (0xFFF << 0) // (WDTC) Watchdog Timer Restart +#define AT91C_SYSC_WDFIEN (0x1 << 12) // (WDTC) Watchdog Fault Interrupt Enable +#define AT91C_SYSC_WDRSTEN (0x1 << 13) // (WDTC) Watchdog Reset Enable +#define AT91C_SYSC_WDRPROC (0x1 << 14) // (WDTC) Watchdog Timer Restart +#define AT91C_SYSC_WDDIS (0x1 << 15) // (WDTC) Watchdog Disable +#define AT91C_SYSC_WDD (0xFFF << 16) // (WDTC) Watchdog Delta Value +#define AT91C_SYSC_WDDBGHLT (0x1 << 28) // (WDTC) Watchdog Debug Halt +#define AT91C_SYSC_WDIDLEHLT (0x1 << 29) // (WDTC) Watchdog Idle Halt +// -------- SYSC_WDSR : (WDTC Offset: 0x8) Watchdog Status Register -------- +#define AT91C_SYSC_WDUNF (0x1 << 0) // (WDTC) Watchdog Underflow +#define AT91C_SYSC_WDERR (0x1 << 1) // (WDTC) Watchdog Error + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Memory Controller Interface +// ***************************************************************************** +// *** Register offset in AT91S_MC structure *** +#define MC_RCR ( 0) // MC Remap Control Register +#define MC_ASR ( 4) // MC Abort Status Register +#define MC_AASR ( 8) // MC Abort Address Status Register +#define MC_FMR (96) // MC Flash Mode Register +#define MC_FCR (100) // MC Flash Command Register +#define MC_FSR (104) // MC Flash Status Register +// -------- MC_RCR : (MC Offset: 0x0) MC Remap Control Register -------- +#define AT91C_MC_RCB (0x1 << 0) // (MC) Remap Command Bit +// -------- MC_ASR : (MC Offset: 0x4) MC Abort Status Register -------- +#define AT91C_MC_UNDADD (0x1 << 0) // (MC) Undefined Addess Abort Status +#define AT91C_MC_MISADD (0x1 << 1) // (MC) Misaligned Addess Abort Status +#define AT91C_MC_ABTSZ (0x3 << 8) // (MC) Abort Size Status +#define AT91C_MC_ABTSZ_BYTE (0x0 << 8) // (MC) Byte +#define AT91C_MC_ABTSZ_HWORD (0x1 << 8) // (MC) Half-word +#define AT91C_MC_ABTSZ_WORD (0x2 << 8) // (MC) Word +#define AT91C_MC_ABTTYP (0x3 << 10) // (MC) Abort Type Status +#define AT91C_MC_ABTTYP_DATAR (0x0 << 10) // (MC) Data Read +#define AT91C_MC_ABTTYP_DATAW (0x1 << 10) // (MC) Data Write +#define AT91C_MC_ABTTYP_FETCH (0x2 << 10) // (MC) Code Fetch +#define AT91C_MC_MST0 (0x1 << 16) // (MC) Master 0 Abort Source +#define AT91C_MC_MST1 (0x1 << 17) // (MC) Master 1 Abort Source +#define AT91C_MC_SVMST0 (0x1 << 24) // (MC) Saved Master 0 Abort Source +#define AT91C_MC_SVMST1 (0x1 << 25) // (MC) Saved Master 1 Abort Source +// -------- MC_FMR : (MC Offset: 0x60) MC Flash Mode Register -------- +#define AT91C_MC_FRDY (0x1 << 0) // (MC) Flash Ready +#define AT91C_MC_LOCKE (0x1 << 2) // (MC) Lock Error +#define AT91C_MC_PROGE (0x1 << 3) // (MC) Programming Error +#define AT91C_MC_NEBP (0x1 << 7) // (MC) No Erase Before Programming +#define AT91C_MC_FWS (0x3 << 8) // (MC) Flash Wait State +#define AT91C_MC_FWS_0FWS (0x0 << 8) // (MC) 1 cycle for Read, 2 for Write operations +#define AT91C_MC_FWS_1FWS (0x1 << 8) // (MC) 2 cycles for Read, 3 for Write operations +#define AT91C_MC_FWS_2FWS (0x2 << 8) // (MC) 3 cycles for Read, 4 for Write operations +#define AT91C_MC_FWS_3FWS (0x3 << 8) // (MC) 4 cycles for Read, 4 for Write operations +#define AT91C_MC_FMCN (0xFF << 16) // (MC) Flash Microsecond Cycle Number +// -------- MC_FCR : (MC Offset: 0x64) MC Flash Command Register -------- +#define AT91C_MC_FCMD (0xF << 0) // (MC) Flash Command +#define AT91C_MC_FCMD_START_PROG (0x1) // (MC) Starts the programming of th epage specified by PAGEN. +#define AT91C_MC_FCMD_LOCK (0x2) // (MC) Starts a lock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. +#define AT91C_MC_FCMD_PROG_AND_LOCK (0x3) // (MC) The lock sequence automatically happens after the programming sequence is completed. +#define AT91C_MC_FCMD_UNLOCK (0x4) // (MC) Starts an unlock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. +#define AT91C_MC_FCMD_ERASE_ALL (0x8) // (MC) Starts the erase of the entire flash.If at least a page is locked, the command is cancelled. +#define AT91C_MC_FCMD_SET_GP_NVM (0xB) // (MC) Set General Purpose NVM bits. +#define AT91C_MC_FCMD_CLR_GP_NVM (0xD) // (MC) Clear General Purpose NVM bits. +#define AT91C_MC_FCMD_SET_SECURITY (0xF) // (MC) Set Security Bit. +#define AT91C_MC_PAGEN (0x3FF << 8) // (MC) Page Number +#define AT91C_MC_KEY (0xFF << 24) // (MC) Writing Protect Key +// -------- MC_FSR : (MC Offset: 0x68) MC Flash Command Register -------- +#define AT91C_MC_SECURITY (0x1 << 4) // (MC) Security Bit Status +#define AT91C_MC_GPNVM0 (0x1 << 8) // (MC) Sector 0 Lock Status +#define AT91C_MC_GPNVM1 (0x1 << 9) // (MC) Sector 1 Lock Status +#define AT91C_MC_GPNVM2 (0x1 << 10) // (MC) Sector 2 Lock Status +#define AT91C_MC_GPNVM3 (0x1 << 11) // (MC) Sector 3 Lock Status +#define AT91C_MC_GPNVM4 (0x1 << 12) // (MC) Sector 4 Lock Status +#define AT91C_MC_GPNVM5 (0x1 << 13) // (MC) Sector 5 Lock Status +#define AT91C_MC_GPNVM6 (0x1 << 14) // (MC) Sector 6 Lock Status +#define AT91C_MC_GPNVM7 (0x1 << 15) // (MC) Sector 7 Lock Status +#define AT91C_MC_LOCKS0 (0x1 << 16) // (MC) Sector 0 Lock Status +#define AT91C_MC_LOCKS1 (0x1 << 17) // (MC) Sector 1 Lock Status +#define AT91C_MC_LOCKS2 (0x1 << 18) // (MC) Sector 2 Lock Status +#define AT91C_MC_LOCKS3 (0x1 << 19) // (MC) Sector 3 Lock Status +#define AT91C_MC_LOCKS4 (0x1 << 20) // (MC) Sector 4 Lock Status +#define AT91C_MC_LOCKS5 (0x1 << 21) // (MC) Sector 5 Lock Status +#define AT91C_MC_LOCKS6 (0x1 << 22) // (MC) Sector 6 Lock Status +#define AT91C_MC_LOCKS7 (0x1 << 23) // (MC) Sector 7 Lock Status +#define AT91C_MC_LOCKS8 (0x1 << 24) // (MC) Sector 8 Lock Status +#define AT91C_MC_LOCKS9 (0x1 << 25) // (MC) Sector 9 Lock Status +#define AT91C_MC_LOCKS10 (0x1 << 26) // (MC) Sector 10 Lock Status +#define AT91C_MC_LOCKS11 (0x1 << 27) // (MC) Sector 11 Lock Status +#define AT91C_MC_LOCKS12 (0x1 << 28) // (MC) Sector 12 Lock Status +#define AT91C_MC_LOCKS13 (0x1 << 29) // (MC) Sector 13 Lock Status +#define AT91C_MC_LOCKS14 (0x1 << 30) // (MC) Sector 14 Lock Status +#define AT91C_MC_LOCKS15 (0x1 << 31) // (MC) Sector 15 Lock Status + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Serial Parallel Interface +// ***************************************************************************** +// *** Register offset in AT91S_SPI structure *** +#define SPI_CR ( 0) // Control Register +#define SPI_MR ( 4) // Mode Register +#define SPI_RDR ( 8) // Receive Data Register +#define SPI_TDR (12) // Transmit Data Register +#define SPI_SR (16) // Status Register +#define SPI_IER (20) // Interrupt Enable Register +#define SPI_IDR (24) // Interrupt Disable Register +#define SPI_IMR (28) // Interrupt Mask Register +#define SPI_CSR (48) // Chip Select Register +#define SPI_RPR (256) // Receive Pointer Register +#define SPI_RCR (260) // Receive Counter Register +#define SPI_TPR (264) // Transmit Pointer Register +#define SPI_TCR (268) // Transmit Counter Register +#define SPI_RNPR (272) // Receive Next Pointer Register +#define SPI_RNCR (276) // Receive Next Counter Register +#define SPI_TNPR (280) // Transmit Next Pointer Register +#define SPI_TNCR (284) // Transmit Next Counter Register +#define SPI_PTCR (288) // PDC Transfer Control Register +#define SPI_PTSR (292) // PDC Transfer Status Register +// -------- SPI_CR : (SPI Offset: 0x0) SPI Control Register -------- +#define AT91C_SPI_SPIEN (0x1 << 0) // (SPI) SPI Enable +#define AT91C_SPI_SPIDIS (0x1 << 1) // (SPI) SPI Disable +#define AT91C_SPI_SWRST (0x1 << 7) // (SPI) SPI Software reset +#define AT91C_SPI_LASTXFER (0x1 << 24) // (SPI) SPI Last Transfer +// -------- SPI_MR : (SPI Offset: 0x4) SPI Mode Register -------- +#define AT91C_SPI_MSTR (0x1 << 0) // (SPI) Master/Slave Mode +#define AT91C_SPI_PS (0x1 << 1) // (SPI) Peripheral Select +#define AT91C_SPI_PS_FIXED (0x0 << 1) // (SPI) Fixed Peripheral Select +#define AT91C_SPI_PS_VARIABLE (0x1 << 1) // (SPI) Variable Peripheral Select +#define AT91C_SPI_PCSDEC (0x1 << 2) // (SPI) Chip Select Decode +#define AT91C_SPI_FDIV (0x1 << 3) // (SPI) Clock Selection +#define AT91C_SPI_MODFDIS (0x1 << 4) // (SPI) Mode Fault Detection +#define AT91C_SPI_LLB (0x1 << 7) // (SPI) Clock Selection +#define AT91C_SPI_PCS (0xF << 16) // (SPI) Peripheral Chip Select +#define AT91C_SPI_DLYBCS (0xFF << 24) // (SPI) Delay Between Chip Selects +// -------- SPI_RDR : (SPI Offset: 0x8) Receive Data Register -------- +#define AT91C_SPI_RD (0xFFFF << 0) // (SPI) Receive Data +#define AT91C_SPI_RPCS (0xF << 16) // (SPI) Peripheral Chip Select Status +// -------- SPI_TDR : (SPI Offset: 0xc) Transmit Data Register -------- +#define AT91C_SPI_TD (0xFFFF << 0) // (SPI) Transmit Data +#define AT91C_SPI_TPCS (0xF << 16) // (SPI) Peripheral Chip Select Status +// -------- SPI_SR : (SPI Offset: 0x10) Status Register -------- +#define AT91C_SPI_RDRF (0x1 << 0) // (SPI) Receive Data Register Full +#define AT91C_SPI_TDRE (0x1 << 1) // (SPI) Transmit Data Register Empty +#define AT91C_SPI_MODF (0x1 << 2) // (SPI) Mode Fault Error +#define AT91C_SPI_OVRES (0x1 << 3) // (SPI) Overrun Error Status +#define AT91C_SPI_ENDRX (0x1 << 4) // (SPI) End of Receiver Transfer +#define AT91C_SPI_ENDTX (0x1 << 5) // (SPI) End of Receiver Transfer +#define AT91C_SPI_RXBUFF (0x1 << 6) // (SPI) RXBUFF Interrupt +#define AT91C_SPI_TXBUFE (0x1 << 7) // (SPI) TXBUFE Interrupt +#define AT91C_SPI_NSSR (0x1 << 8) // (SPI) NSSR Interrupt +#define AT91C_SPI_TXEMPTY (0x1 << 9) // (SPI) TXEMPTY Interrupt +#define AT91C_SPI_SPIENS (0x1 << 16) // (SPI) Enable Status +// -------- SPI_IER : (SPI Offset: 0x14) Interrupt Enable Register -------- +// -------- SPI_IDR : (SPI Offset: 0x18) Interrupt Disable Register -------- +// -------- SPI_IMR : (SPI Offset: 0x1c) Interrupt Mask Register -------- +// -------- SPI_CSR : (SPI Offset: 0x30) Chip Select Register -------- +#define AT91C_SPI_CPOL (0x1 << 0) // (SPI) Clock Polarity +#define AT91C_SPI_NCPHA (0x1 << 1) // (SPI) Clock Phase +#define AT91C_SPI_CSAAT (0x1 << 2) // (SPI) Chip Select Active After Transfer +#define AT91C_SPI_BITS (0xF << 4) // (SPI) Bits Per Transfer +#define AT91C_SPI_BITS_8 (0x0 << 4) // (SPI) 8 Bits Per transfer +#define AT91C_SPI_BITS_9 (0x1 << 4) // (SPI) 9 Bits Per transfer +#define AT91C_SPI_BITS_10 (0x2 << 4) // (SPI) 10 Bits Per transfer +#define AT91C_SPI_BITS_11 (0x3 << 4) // (SPI) 11 Bits Per transfer +#define AT91C_SPI_BITS_12 (0x4 << 4) // (SPI) 12 Bits Per transfer +#define AT91C_SPI_BITS_13 (0x5 << 4) // (SPI) 13 Bits Per transfer +#define AT91C_SPI_BITS_14 (0x6 << 4) // (SPI) 14 Bits Per transfer +#define AT91C_SPI_BITS_15 (0x7 << 4) // (SPI) 15 Bits Per transfer +#define AT91C_SPI_BITS_16 (0x8 << 4) // (SPI) 16 Bits Per transfer +#define AT91C_SPI_SCBR (0xFF << 8) // (SPI) Serial Clock Baud Rate +#define AT91C_SPI_DLYBS (0xFF << 16) // (SPI) Serial Clock Baud Rate +#define AT91C_SPI_DLYBCT (0xFF << 24) // (SPI) Delay Between Consecutive Transfers + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Analog to Digital Convertor +// ***************************************************************************** +// *** Register offset in AT91S_ADC structure *** +#define ADC_CR ( 0) // ADC Control Register +#define ADC_MR ( 4) // ADC Mode Register +#define ADC_CHER (16) // ADC Channel Enable Register +#define ADC_CHDR (20) // ADC Channel Disable Register +#define ADC_CHSR (24) // ADC Channel Status Register +#define ADC_SR (28) // ADC Status Register +#define ADC_LCDR (32) // ADC Last Converted Data Register +#define ADC_IER (36) // ADC Interrupt Enable Register +#define ADC_IDR (40) // ADC Interrupt Disable Register +#define ADC_IMR (44) // ADC Interrupt Mask Register +#define ADC_CDR0 (48) // ADC Channel Data Register 0 +#define ADC_CDR1 (52) // ADC Channel Data Register 1 +#define ADC_CDR2 (56) // ADC Channel Data Register 2 +#define ADC_CDR3 (60) // ADC Channel Data Register 3 +#define ADC_CDR4 (64) // ADC Channel Data Register 4 +#define ADC_CDR5 (68) // ADC Channel Data Register 5 +#define ADC_CDR6 (72) // ADC Channel Data Register 6 +#define ADC_CDR7 (76) // ADC Channel Data Register 7 +#define ADC_RPR (256) // Receive Pointer Register +#define ADC_RCR (260) // Receive Counter Register +#define ADC_TPR (264) // Transmit Pointer Register +#define ADC_TCR (268) // Transmit Counter Register +#define ADC_RNPR (272) // Receive Next Pointer Register +#define ADC_RNCR (276) // Receive Next Counter Register +#define ADC_TNPR (280) // Transmit Next Pointer Register +#define ADC_TNCR (284) // Transmit Next Counter Register +#define ADC_PTCR (288) // PDC Transfer Control Register +#define ADC_PTSR (292) // PDC Transfer Status Register +// -------- ADC_CR : (ADC Offset: 0x0) ADC Control Register -------- +#define AT91C_ADC_SWRST (0x1 << 0) // (ADC) Software Reset +#define AT91C_ADC_START (0x1 << 1) // (ADC) Start Conversion +// -------- ADC_MR : (ADC Offset: 0x4) ADC Mode Register -------- +#define AT91C_ADC_TRGEN (0x1 << 0) // (ADC) Trigger Enable +#define AT91C_ADC_TRGEN_DIS (0x0) // (ADC) Hradware triggers are disabled. Starting a conversion is only possible by software +#define AT91C_ADC_TRGEN_EN (0x1) // (ADC) Hardware trigger selected by TRGSEL field is enabled. +#define AT91C_ADC_TRGSEL (0x7 << 1) // (ADC) Trigger Selection +#define AT91C_ADC_TRGSEL_TIOA0 (0x0 << 1) // (ADC) Selected TRGSEL = TIAO0 +#define AT91C_ADC_TRGSEL_TIOA1 (0x1 << 1) // (ADC) Selected TRGSEL = TIAO1 +#define AT91C_ADC_TRGSEL_TIOA2 (0x2 << 1) // (ADC) Selected TRGSEL = TIAO2 +#define AT91C_ADC_TRGSEL_TIOA3 (0x3 << 1) // (ADC) Selected TRGSEL = TIAO3 +#define AT91C_ADC_TRGSEL_TIOA4 (0x4 << 1) // (ADC) Selected TRGSEL = TIAO4 +#define AT91C_ADC_TRGSEL_TIOA5 (0x5 << 1) // (ADC) Selected TRGSEL = TIAO5 +#define AT91C_ADC_TRGSEL_EXT (0x6 << 1) // (ADC) Selected TRGSEL = External Trigger +#define AT91C_ADC_LOWRES (0x1 << 4) // (ADC) Resolution. +#define AT91C_ADC_LOWRES_10_BIT (0x0 << 4) // (ADC) 10-bit resolution +#define AT91C_ADC_LOWRES_8_BIT (0x1 << 4) // (ADC) 8-bit resolution +#define AT91C_ADC_SLEEP (0x1 << 5) // (ADC) Sleep Mode +#define AT91C_ADC_SLEEP_NORMAL_MODE (0x0 << 5) // (ADC) Normal Mode +#define AT91C_ADC_SLEEP_MODE (0x1 << 5) // (ADC) Sleep Mode +#define AT91C_ADC_PRESCAL (0x3F << 8) // (ADC) Prescaler rate selection +#define AT91C_ADC_STARTUP (0x1F << 16) // (ADC) Startup Time +#define AT91C_ADC_SHTIM (0xF << 24) // (ADC) Sample & Hold Time +// -------- ADC_CHER : (ADC Offset: 0x10) ADC Channel Enable Register -------- +#define AT91C_ADC_CH0 (0x1 << 0) // (ADC) Channel 0 +#define AT91C_ADC_CH1 (0x1 << 1) // (ADC) Channel 1 +#define AT91C_ADC_CH2 (0x1 << 2) // (ADC) Channel 2 +#define AT91C_ADC_CH3 (0x1 << 3) // (ADC) Channel 3 +#define AT91C_ADC_CH4 (0x1 << 4) // (ADC) Channel 4 +#define AT91C_ADC_CH5 (0x1 << 5) // (ADC) Channel 5 +#define AT91C_ADC_CH6 (0x1 << 6) // (ADC) Channel 6 +#define AT91C_ADC_CH7 (0x1 << 7) // (ADC) Channel 7 +// -------- ADC_CHDR : (ADC Offset: 0x14) ADC Channel Disable Register -------- +// -------- ADC_CHSR : (ADC Offset: 0x18) ADC Channel Status Register -------- +// -------- ADC_SR : (ADC Offset: 0x1c) ADC Status Register -------- +#define AT91C_ADC_EOC0 (0x1 << 0) // (ADC) End of Conversion +#define AT91C_ADC_EOC1 (0x1 << 1) // (ADC) End of Conversion +#define AT91C_ADC_EOC2 (0x1 << 2) // (ADC) End of Conversion +#define AT91C_ADC_EOC3 (0x1 << 3) // (ADC) End of Conversion +#define AT91C_ADC_EOC4 (0x1 << 4) // (ADC) End of Conversion +#define AT91C_ADC_EOC5 (0x1 << 5) // (ADC) End of Conversion +#define AT91C_ADC_EOC6 (0x1 << 6) // (ADC) End of Conversion +#define AT91C_ADC_EOC7 (0x1 << 7) // (ADC) End of Conversion +#define AT91C_ADC_OVRE0 (0x1 << 8) // (ADC) Overrun Error +#define AT91C_ADC_OVRE1 (0x1 << 9) // (ADC) Overrun Error +#define AT91C_ADC_OVRE2 (0x1 << 10) // (ADC) Overrun Error +#define AT91C_ADC_OVRE3 (0x1 << 11) // (ADC) Overrun Error +#define AT91C_ADC_OVRE4 (0x1 << 12) // (ADC) Overrun Error +#define AT91C_ADC_OVRE5 (0x1 << 13) // (ADC) Overrun Error +#define AT91C_ADC_OVRE6 (0x1 << 14) // (ADC) Overrun Error +#define AT91C_ADC_OVRE7 (0x1 << 15) // (ADC) Overrun Error +#define AT91C_ADC_DRDY (0x1 << 16) // (ADC) Data Ready +#define AT91C_ADC_GOVRE (0x1 << 17) // (ADC) General Overrun +#define AT91C_ADC_ENDRX (0x1 << 18) // (ADC) End of Receiver Transfer +#define AT91C_ADC_RXBUFF (0x1 << 19) // (ADC) RXBUFF Interrupt +// -------- ADC_LCDR : (ADC Offset: 0x20) ADC Last Converted Data Register -------- +#define AT91C_ADC_LDATA (0x3FF << 0) // (ADC) Last Data Converted +// -------- ADC_IER : (ADC Offset: 0x24) ADC Interrupt Enable Register -------- +// -------- ADC_IDR : (ADC Offset: 0x28) ADC Interrupt Disable Register -------- +// -------- ADC_IMR : (ADC Offset: 0x2c) ADC Interrupt Mask Register -------- +// -------- ADC_CDR0 : (ADC Offset: 0x30) ADC Channel Data Register 0 -------- +#define AT91C_ADC_DATA (0x3FF << 0) // (ADC) Converted Data +// -------- ADC_CDR1 : (ADC Offset: 0x34) ADC Channel Data Register 1 -------- +// -------- ADC_CDR2 : (ADC Offset: 0x38) ADC Channel Data Register 2 -------- +// -------- ADC_CDR3 : (ADC Offset: 0x3c) ADC Channel Data Register 3 -------- +// -------- ADC_CDR4 : (ADC Offset: 0x40) ADC Channel Data Register 4 -------- +// -------- ADC_CDR5 : (ADC Offset: 0x44) ADC Channel Data Register 5 -------- +// -------- ADC_CDR6 : (ADC Offset: 0x48) ADC Channel Data Register 6 -------- +// -------- ADC_CDR7 : (ADC Offset: 0x4c) ADC Channel Data Register 7 -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Synchronous Serial Controller Interface +// ***************************************************************************** +// *** Register offset in AT91S_SSC structure *** +#define SSC_CR ( 0) // Control Register +#define SSC_CMR ( 4) // Clock Mode Register +#define SSC_RCMR (16) // Receive Clock ModeRegister +#define SSC_RFMR (20) // Receive Frame Mode Register +#define SSC_TCMR (24) // Transmit Clock Mode Register +#define SSC_TFMR (28) // Transmit Frame Mode Register +#define SSC_RHR (32) // Receive Holding Register +#define SSC_THR (36) // Transmit Holding Register +#define SSC_RSHR (48) // Receive Sync Holding Register +#define SSC_TSHR (52) // Transmit Sync Holding Register +#define SSC_RC0R (56) // Receive Compare 0 Register +#define SSC_RC1R (60) // Receive Compare 1 Register +#define SSC_SR (64) // Status Register +#define SSC_IER (68) // Interrupt Enable Register +#define SSC_IDR (72) // Interrupt Disable Register +#define SSC_IMR (76) // Interrupt Mask Register +#define SSC_RPR (256) // Receive Pointer Register +#define SSC_RCR (260) // Receive Counter Register +#define SSC_TPR (264) // Transmit Pointer Register +#define SSC_TCR (268) // Transmit Counter Register +#define SSC_RNPR (272) // Receive Next Pointer Register +#define SSC_RNCR (276) // Receive Next Counter Register +#define SSC_TNPR (280) // Transmit Next Pointer Register +#define SSC_TNCR (284) // Transmit Next Counter Register +#define SSC_PTCR (288) // PDC Transfer Control Register +#define SSC_PTSR (292) // PDC Transfer Status Register +// -------- SSC_CR : (SSC Offset: 0x0) SSC Control Register -------- +#define AT91C_SSC_RXEN (0x1 << 0) // (SSC) Receive Enable +#define AT91C_SSC_RXDIS (0x1 << 1) // (SSC) Receive Disable +#define AT91C_SSC_TXEN (0x1 << 8) // (SSC) Transmit Enable +#define AT91C_SSC_TXDIS (0x1 << 9) // (SSC) Transmit Disable +#define AT91C_SSC_SWRST (0x1 << 15) // (SSC) Software Reset +// -------- SSC_RCMR : (SSC Offset: 0x10) SSC Receive Clock Mode Register -------- +#define AT91C_SSC_CKS (0x3 << 0) // (SSC) Receive/Transmit Clock Selection +#define AT91C_SSC_CKS_DIV (0x0) // (SSC) Divided Clock +#define AT91C_SSC_CKS_TK (0x1) // (SSC) TK Clock signal +#define AT91C_SSC_CKS_RK (0x2) // (SSC) RK pin +#define AT91C_SSC_CKO (0x7 << 2) // (SSC) Receive/Transmit Clock Output Mode Selection +#define AT91C_SSC_CKO_NONE (0x0 << 2) // (SSC) Receive/Transmit Clock Output Mode: None RK pin: Input-only +#define AT91C_SSC_CKO_CONTINOUS (0x1 << 2) // (SSC) Continuous Receive/Transmit Clock RK pin: Output +#define AT91C_SSC_CKO_DATA_TX (0x2 << 2) // (SSC) Receive/Transmit Clock only during data transfers RK pin: Output +#define AT91C_SSC_CKI (0x1 << 5) // (SSC) Receive/Transmit Clock Inversion +#define AT91C_SSC_CKG (0x3 << 6) // (SSC) Receive/Transmit Clock Gating Selection +#define AT91C_SSC_CKG_NONE (0x0 << 6) // (SSC) Receive/Transmit Clock Gating: None, continuous clock +#define AT91C_SSC_CKG_LOW (0x1 << 6) // (SSC) Receive/Transmit Clock enabled only if RF Low +#define AT91C_SSC_CKG_HIGH (0x2 << 6) // (SSC) Receive/Transmit Clock enabled only if RF High +#define AT91C_SSC_START (0xF << 8) // (SSC) Receive/Transmit Start Selection +#define AT91C_SSC_START_CONTINOUS (0x0 << 8) // (SSC) Continuous, as soon as the receiver is enabled, and immediately after the end of transfer of the previous data. +#define AT91C_SSC_START_TX (0x1 << 8) // (SSC) Transmit/Receive start +#define AT91C_SSC_START_LOW_RF (0x2 << 8) // (SSC) Detection of a low level on RF input +#define AT91C_SSC_START_HIGH_RF (0x3 << 8) // (SSC) Detection of a high level on RF input +#define AT91C_SSC_START_FALL_RF (0x4 << 8) // (SSC) Detection of a falling edge on RF input +#define AT91C_SSC_START_RISE_RF (0x5 << 8) // (SSC) Detection of a rising edge on RF input +#define AT91C_SSC_START_LEVEL_RF (0x6 << 8) // (SSC) Detection of any level change on RF input +#define AT91C_SSC_START_EDGE_RF (0x7 << 8) // (SSC) Detection of any edge on RF input +#define AT91C_SSC_START_0 (0x8 << 8) // (SSC) Compare 0 +#define AT91C_SSC_STOP (0x1 << 12) // (SSC) Receive Stop Selection +#define AT91C_SSC_STTOUT (0x1 << 15) // (SSC) Receive/Transmit Start Output Selection +#define AT91C_SSC_STTDLY (0xFF << 16) // (SSC) Receive/Transmit Start Delay +#define AT91C_SSC_PERIOD (0xFF << 24) // (SSC) Receive/Transmit Period Divider Selection +// -------- SSC_RFMR : (SSC Offset: 0x14) SSC Receive Frame Mode Register -------- +#define AT91C_SSC_DATLEN (0x1F << 0) // (SSC) Data Length +#define AT91C_SSC_LOOP (0x1 << 5) // (SSC) Loop Mode +#define AT91C_SSC_MSBF (0x1 << 7) // (SSC) Most Significant Bit First +#define AT91C_SSC_DATNB (0xF << 8) // (SSC) Data Number per Frame +#define AT91C_SSC_FSLEN (0xF << 16) // (SSC) Receive/Transmit Frame Sync length +#define AT91C_SSC_FSOS (0x7 << 20) // (SSC) Receive/Transmit Frame Sync Output Selection +#define AT91C_SSC_FSOS_NONE (0x0 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: None RK pin Input-only +#define AT91C_SSC_FSOS_NEGATIVE (0x1 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Negative Pulse +#define AT91C_SSC_FSOS_POSITIVE (0x2 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Positive Pulse +#define AT91C_SSC_FSOS_LOW (0x3 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver Low during data transfer +#define AT91C_SSC_FSOS_HIGH (0x4 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver High during data transfer +#define AT91C_SSC_FSOS_TOGGLE (0x5 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Toggling at each start of data transfer +#define AT91C_SSC_FSEDGE (0x1 << 24) // (SSC) Frame Sync Edge Detection +// -------- SSC_TCMR : (SSC Offset: 0x18) SSC Transmit Clock Mode Register -------- +// -------- SSC_TFMR : (SSC Offset: 0x1c) SSC Transmit Frame Mode Register -------- +#define AT91C_SSC_DATDEF (0x1 << 5) // (SSC) Data Default Value +#define AT91C_SSC_FSDEN (0x1 << 23) // (SSC) Frame Sync Data Enable +// -------- SSC_SR : (SSC Offset: 0x40) SSC Status Register -------- +#define AT91C_SSC_TXRDY (0x1 << 0) // (SSC) Transmit Ready +#define AT91C_SSC_TXEMPTY (0x1 << 1) // (SSC) Transmit Empty +#define AT91C_SSC_ENDTX (0x1 << 2) // (SSC) End Of Transmission +#define AT91C_SSC_TXBUFE (0x1 << 3) // (SSC) Transmit Buffer Empty +#define AT91C_SSC_RXRDY (0x1 << 4) // (SSC) Receive Ready +#define AT91C_SSC_OVRUN (0x1 << 5) // (SSC) Receive Overrun +#define AT91C_SSC_ENDRX (0x1 << 6) // (SSC) End of Reception +#define AT91C_SSC_RXBUFF (0x1 << 7) // (SSC) Receive Buffer Full +#define AT91C_SSC_CP0 (0x1 << 8) // (SSC) Compare 0 +#define AT91C_SSC_CP1 (0x1 << 9) // (SSC) Compare 1 +#define AT91C_SSC_TXSYN (0x1 << 10) // (SSC) Transmit Sync +#define AT91C_SSC_RXSYN (0x1 << 11) // (SSC) Receive Sync +#define AT91C_SSC_TXENA (0x1 << 16) // (SSC) Transmit Enable +#define AT91C_SSC_RXENA (0x1 << 17) // (SSC) Receive Enable +// -------- SSC_IER : (SSC Offset: 0x44) SSC Interrupt Enable Register -------- +// -------- SSC_IDR : (SSC Offset: 0x48) SSC Interrupt Disable Register -------- +// -------- SSC_IMR : (SSC Offset: 0x4c) SSC Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Usart +// ***************************************************************************** +// *** Register offset in AT91S_USART structure *** +#define US_CR ( 0) // Control Register +#define US_MR ( 4) // Mode Register +#define US_IER ( 8) // Interrupt Enable Register +#define US_IDR (12) // Interrupt Disable Register +#define US_IMR (16) // Interrupt Mask Register +#define US_CSR (20) // Channel Status Register +#define US_RHR (24) // Receiver Holding Register +#define US_THR (28) // Transmitter Holding Register +#define US_BRGR (32) // Baud Rate Generator Register +#define US_RTOR (36) // Receiver Time-out Register +#define US_TTGR (40) // Transmitter Time-guard Register +#define US_FIDI (64) // FI_DI_Ratio Register +#define US_NER (68) // Nb Errors Register +#define US_XXR (72) // XON_XOFF Register +#define US_IF (76) // IRDA_FILTER Register +#define US_RPR (256) // Receive Pointer Register +#define US_RCR (260) // Receive Counter Register +#define US_TPR (264) // Transmit Pointer Register +#define US_TCR (268) // Transmit Counter Register +#define US_RNPR (272) // Receive Next Pointer Register +#define US_RNCR (276) // Receive Next Counter Register +#define US_TNPR (280) // Transmit Next Pointer Register +#define US_TNCR (284) // Transmit Next Counter Register +#define US_PTCR (288) // PDC Transfer Control Register +#define US_PTSR (292) // PDC Transfer Status Register +// -------- US_CR : (USART Offset: 0x0) Debug Unit Control Register -------- +#define AT91C_US_RSTSTA (0x1 << 8) // (USART) Reset Status Bits +#define AT91C_US_STTBRK (0x1 << 9) // (USART) Start Break +#define AT91C_US_STPBRK (0x1 << 10) // (USART) Stop Break +#define AT91C_US_STTTO (0x1 << 11) // (USART) Start Time-out +#define AT91C_US_SENDA (0x1 << 12) // (USART) Send Address +#define AT91C_US_RSTIT (0x1 << 13) // (USART) Reset Iterations +#define AT91C_US_RSTNACK (0x1 << 14) // (USART) Reset Non Acknowledge +#define AT91C_US_RETTO (0x1 << 15) // (USART) Rearm Time-out +#define AT91C_US_DTREN (0x1 << 16) // (USART) Data Terminal ready Enable +#define AT91C_US_DTRDIS (0x1 << 17) // (USART) Data Terminal ready Disable +#define AT91C_US_RTSEN (0x1 << 18) // (USART) Request to Send enable +#define AT91C_US_RTSDIS (0x1 << 19) // (USART) Request to Send Disable +// -------- US_MR : (USART Offset: 0x4) Debug Unit Mode Register -------- +#define AT91C_US_USMODE (0xF << 0) // (USART) Usart mode +#define AT91C_US_USMODE_NORMAL (0x0) // (USART) Normal +#define AT91C_US_USMODE_RS485 (0x1) // (USART) RS485 +#define AT91C_US_USMODE_HWHSH (0x2) // (USART) Hardware Handshaking +#define AT91C_US_USMODE_MODEM (0x3) // (USART) Modem +#define AT91C_US_USMODE_ISO7816_0 (0x4) // (USART) ISO7816 protocol: T = 0 +#define AT91C_US_USMODE_ISO7816_1 (0x6) // (USART) ISO7816 protocol: T = 1 +#define AT91C_US_USMODE_IRDA (0x8) // (USART) IrDA +#define AT91C_US_USMODE_SWHSH (0xC) // (USART) Software Handshaking +#define AT91C_US_CLKS (0x3 << 4) // (USART) Clock Selection (Baud Rate generator Input Clock +#define AT91C_US_CLKS_CLOCK (0x0 << 4) // (USART) Clock +#define AT91C_US_CLKS_FDIV1 (0x1 << 4) // (USART) fdiv1 +#define AT91C_US_CLKS_SLOW (0x2 << 4) // (USART) slow_clock (ARM) +#define AT91C_US_CLKS_EXT (0x3 << 4) // (USART) External (SCK) +#define AT91C_US_CHRL (0x3 << 6) // (USART) Clock Selection (Baud Rate generator Input Clock +#define AT91C_US_CHRL_5_BITS (0x0 << 6) // (USART) Character Length: 5 bits +#define AT91C_US_CHRL_6_BITS (0x1 << 6) // (USART) Character Length: 6 bits +#define AT91C_US_CHRL_7_BITS (0x2 << 6) // (USART) Character Length: 7 bits +#define AT91C_US_CHRL_8_BITS (0x3 << 6) // (USART) Character Length: 8 bits +#define AT91C_US_SYNC (0x1 << 8) // (USART) Synchronous Mode Select +#define AT91C_US_NBSTOP (0x3 << 12) // (USART) Number of Stop bits +#define AT91C_US_NBSTOP_1_BIT (0x0 << 12) // (USART) 1 stop bit +#define AT91C_US_NBSTOP_15_BIT (0x1 << 12) // (USART) Asynchronous (SYNC=0) 2 stop bits Synchronous (SYNC=1) 2 stop bits +#define AT91C_US_NBSTOP_2_BIT (0x2 << 12) // (USART) 2 stop bits +#define AT91C_US_MSBF (0x1 << 16) // (USART) Bit Order +#define AT91C_US_MODE9 (0x1 << 17) // (USART) 9-bit Character length +#define AT91C_US_CKLO (0x1 << 18) // (USART) Clock Output Select +#define AT91C_US_OVER (0x1 << 19) // (USART) Over Sampling Mode +#define AT91C_US_INACK (0x1 << 20) // (USART) Inhibit Non Acknowledge +#define AT91C_US_DSNACK (0x1 << 21) // (USART) Disable Successive NACK +#define AT91C_US_MAX_ITER (0x1 << 24) // (USART) Number of Repetitions +#define AT91C_US_FILTER (0x1 << 28) // (USART) Receive Line Filter +// -------- US_IER : (USART Offset: 0x8) Debug Unit Interrupt Enable Register -------- +#define AT91C_US_RXBRK (0x1 << 2) // (USART) Break Received/End of Break +#define AT91C_US_TIMEOUT (0x1 << 8) // (USART) Receiver Time-out +#define AT91C_US_ITERATION (0x1 << 10) // (USART) Max number of Repetitions Reached +#define AT91C_US_NACK (0x1 << 13) // (USART) Non Acknowledge +#define AT91C_US_RIIC (0x1 << 16) // (USART) Ring INdicator Input Change Flag +#define AT91C_US_DSRIC (0x1 << 17) // (USART) Data Set Ready Input Change Flag +#define AT91C_US_DCDIC (0x1 << 18) // (USART) Data Carrier Flag +#define AT91C_US_CTSIC (0x1 << 19) // (USART) Clear To Send Input Change Flag +// -------- US_IDR : (USART Offset: 0xc) Debug Unit Interrupt Disable Register -------- +// -------- US_IMR : (USART Offset: 0x10) Debug Unit Interrupt Mask Register -------- +// -------- US_CSR : (USART Offset: 0x14) Debug Unit Channel Status Register -------- +#define AT91C_US_RI (0x1 << 20) // (USART) Image of RI Input +#define AT91C_US_DSR (0x1 << 21) // (USART) Image of DSR Input +#define AT91C_US_DCD (0x1 << 22) // (USART) Image of DCD Input +#define AT91C_US_CTS (0x1 << 23) // (USART) Image of CTS Input + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Two-wire Interface +// ***************************************************************************** +// *** Register offset in AT91S_TWI structure *** +#define TWI_CR ( 0) // Control Register +#define TWI_MMR ( 4) // Master Mode Register +#define TWI_SMR ( 8) // Slave Mode Register +#define TWI_IADR (12) // Internal Address Register +#define TWI_CWGR (16) // Clock Waveform Generator Register +#define TWI_SR (32) // Status Register +#define TWI_IER (36) // Interrupt Enable Register +#define TWI_IDR (40) // Interrupt Disable Register +#define TWI_IMR (44) // Interrupt Mask Register +#define TWI_RHR (48) // Receive Holding Register +#define TWI_THR (52) // Transmit Holding Register +// -------- TWI_CR : (TWI Offset: 0x0) TWI Control Register -------- +#define AT91C_TWI_START (0x1 << 0) // (TWI) Send a START Condition +#define AT91C_TWI_STOP (0x1 << 1) // (TWI) Send a STOP Condition +#define AT91C_TWI_MSEN (0x1 << 2) // (TWI) TWI Master Transfer Enabled +#define AT91C_TWI_MSDIS (0x1 << 3) // (TWI) TWI Master Transfer Disabled +#define AT91C_TWI_SVEN (0x1 << 4) // (TWI) TWI Slave Transfer Enabled +#define AT91C_TWI_SVDIS (0x1 << 5) // (TWI) TWI Slave Transfer Disabled +#define AT91C_TWI_SWRST (0x1 << 7) // (TWI) Software Reset +// -------- TWI_MMR : (TWI Offset: 0x4) TWI Master Mode Register -------- +#define AT91C_TWI_IADRSZ (0x3 << 8) // (TWI) Internal Device Address Size +#define AT91C_TWI_IADRSZ_NO (0x0 << 8) // (TWI) No internal device address +#define AT91C_TWI_IADRSZ_1_BYTE (0x1 << 8) // (TWI) One-byte internal device address +#define AT91C_TWI_IADRSZ_2_BYTE (0x2 << 8) // (TWI) Two-byte internal device address +#define AT91C_TWI_IADRSZ_3_BYTE (0x3 << 8) // (TWI) Three-byte internal device address +#define AT91C_TWI_MREAD (0x1 << 12) // (TWI) Master Read Direction +#define AT91C_TWI_DADR (0x7F << 16) // (TWI) Device Address +// -------- TWI_SMR : (TWI Offset: 0x8) TWI Slave Mode Register -------- +#define AT91C_TWI_SADR (0x7F << 16) // (TWI) Slave Device Address +// -------- TWI_CWGR : (TWI Offset: 0x10) TWI Clock Waveform Generator Register -------- +#define AT91C_TWI_CLDIV (0xFF << 0) // (TWI) Clock Low Divider +#define AT91C_TWI_CHDIV (0xFF << 8) // (TWI) Clock High Divider +#define AT91C_TWI_CKDIV (0x7 << 16) // (TWI) Clock Divider +// -------- TWI_SR : (TWI Offset: 0x20) TWI Status Register -------- +#define AT91C_TWI_TXCOMP (0x1 << 0) // (TWI) Transmission Completed +#define AT91C_TWI_RXRDY (0x1 << 1) // (TWI) Receive holding register ReaDY +#define AT91C_TWI_TXRDY (0x1 << 2) // (TWI) Transmit holding register ReaDY +#define AT91C_TWI_SVREAD (0x1 << 3) // (TWI) Slave Read +#define AT91C_TWI_SVACC (0x1 << 4) // (TWI) Slave Access +#define AT91C_TWI_GCACC (0x1 << 5) // (TWI) General Call Access +#define AT91C_TWI_OVRE (0x1 << 6) // (TWI) Overrun Error +#define AT91C_TWI_UNRE (0x1 << 7) // (TWI) Underrun Error +#define AT91C_TWI_NACK (0x1 << 8) // (TWI) Not Acknowledged +#define AT91C_TWI_ARBLST (0x1 << 9) // (TWI) Arbitration Lost +// -------- TWI_IER : (TWI Offset: 0x24) TWI Interrupt Enable Register -------- +// -------- TWI_IDR : (TWI Offset: 0x28) TWI Interrupt Disable Register -------- +// -------- TWI_IMR : (TWI Offset: 0x2c) TWI Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Timer Counter Channel Interface +// ***************************************************************************** +// *** Register offset in AT91S_TC structure *** +#define TC_CCR ( 0) // Channel Control Register +#define TC_CMR ( 4) // Channel Mode Register (Capture Mode / Waveform Mode) +#define TC_CV (16) // Counter Value +#define TC_RA (20) // Register A +#define TC_RB (24) // Register B +#define TC_RC (28) // Register C +#define TC_SR (32) // Status Register +#define TC_IER (36) // Interrupt Enable Register +#define TC_IDR (40) // Interrupt Disable Register +#define TC_IMR (44) // Interrupt Mask Register +// -------- TC_CCR : (TC Offset: 0x0) TC Channel Control Register -------- +#define AT91C_TC_CLKEN (0x1 << 0) // (TC) Counter Clock Enable Command +#define AT91C_TC_CLKDIS (0x1 << 1) // (TC) Counter Clock Disable Command +#define AT91C_TC_SWTRG (0x1 << 2) // (TC) Software Trigger Command +// -------- TC_CMR : (TC Offset: 0x4) TC Channel Mode Register: Capture Mode / Waveform Mode -------- +#define AT91C_TC_CLKS (0x7 << 0) // (TC) Clock Selection +#define AT91C_TC_CLKS_TIMER_DIV1_CLOCK (0x0) // (TC) Clock selected: TIMER_DIV1_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV2_CLOCK (0x1) // (TC) Clock selected: TIMER_DIV2_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV3_CLOCK (0x2) // (TC) Clock selected: TIMER_DIV3_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV4_CLOCK (0x3) // (TC) Clock selected: TIMER_DIV4_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV5_CLOCK (0x4) // (TC) Clock selected: TIMER_DIV5_CLOCK +#define AT91C_TC_CLKS_XC0 (0x5) // (TC) Clock selected: XC0 +#define AT91C_TC_CLKS_XC1 (0x6) // (TC) Clock selected: XC1 +#define AT91C_TC_CLKS_XC2 (0x7) // (TC) Clock selected: XC2 +#define AT91C_TC_CLKI (0x1 << 3) // (TC) Clock Invert +#define AT91C_TC_BURST (0x3 << 4) // (TC) Burst Signal Selection +#define AT91C_TC_BURST_NONE (0x0 << 4) // (TC) The clock is not gated by an external signal +#define AT91C_TC_BURST_XC0 (0x1 << 4) // (TC) XC0 is ANDed with the selected clock +#define AT91C_TC_BURST_XC1 (0x2 << 4) // (TC) XC1 is ANDed with the selected clock +#define AT91C_TC_BURST_XC2 (0x3 << 4) // (TC) XC2 is ANDed with the selected clock +#define AT91C_TC_CPCSTOP (0x1 << 6) // (TC) Counter Clock Stopped with RC Compare +#define AT91C_TC_LDBSTOP (0x1 << 6) // (TC) Counter Clock Stopped with RB Loading +#define AT91C_TC_LDBDIS (0x1 << 7) // (TC) Counter Clock Disabled with RB Loading +#define AT91C_TC_CPCDIS (0x1 << 7) // (TC) Counter Clock Disable with RC Compare +#define AT91C_TC_ETRGEDG (0x3 << 8) // (TC) External Trigger Edge Selection +#define AT91C_TC_ETRGEDG_NONE (0x0 << 8) // (TC) Edge: None +#define AT91C_TC_ETRGEDG_RISING (0x1 << 8) // (TC) Edge: rising edge +#define AT91C_TC_ETRGEDG_FALLING (0x2 << 8) // (TC) Edge: falling edge +#define AT91C_TC_ETRGEDG_BOTH (0x3 << 8) // (TC) Edge: each edge +#define AT91C_TC_EEVTEDG (0x3 << 8) // (TC) External Event Edge Selection +#define AT91C_TC_EEVTEDG_NONE (0x0 << 8) // (TC) Edge: None +#define AT91C_TC_EEVTEDG_RISING (0x1 << 8) // (TC) Edge: rising edge +#define AT91C_TC_EEVTEDG_FALLING (0x2 << 8) // (TC) Edge: falling edge +#define AT91C_TC_EEVTEDG_BOTH (0x3 << 8) // (TC) Edge: each edge +#define AT91C_TC_ABETRG (0x1 << 10) // (TC) TIOA or TIOB External Trigger Selection +#define AT91C_TC_EEVT (0x3 << 10) // (TC) External Event Selection +#define AT91C_TC_EEVT_NONE (0x0 << 10) // (TC) Signal selected as external event: TIOB TIOB direction: input +#define AT91C_TC_EEVT_RISING (0x1 << 10) // (TC) Signal selected as external event: XC0 TIOB direction: output +#define AT91C_TC_EEVT_FALLING (0x2 << 10) // (TC) Signal selected as external event: XC1 TIOB direction: output +#define AT91C_TC_EEVT_BOTH (0x3 << 10) // (TC) Signal selected as external event: XC2 TIOB direction: output +#define AT91C_TC_ENETRG (0x1 << 12) // (TC) External Event Trigger enable +#define AT91C_TC_WAVESEL (0x3 << 13) // (TC) Waveform Selection +#define AT91C_TC_WAVESEL_UP (0x0 << 13) // (TC) UP mode without atomatic trigger on RC Compare +#define AT91C_TC_WAVESEL_UPDOWN (0x1 << 13) // (TC) UPDOWN mode without automatic trigger on RC Compare +#define AT91C_TC_WAVESEL_UP_AUTO (0x2 << 13) // (TC) UP mode with automatic trigger on RC Compare +#define AT91C_TC_WAVESEL_UPDOWN_AUTO (0x3 << 13) // (TC) UPDOWN mode with automatic trigger on RC Compare +#define AT91C_TC_CPCTRG (0x1 << 14) // (TC) RC Compare Trigger Enable +#define AT91C_TC_WAVE (0x1 << 15) // (TC) +#define AT91C_TC_LDRA (0x3 << 16) // (TC) RA Loading Selection +#define AT91C_TC_LDRA_NONE (0x0 << 16) // (TC) Edge: None +#define AT91C_TC_LDRA_RISING (0x1 << 16) // (TC) Edge: rising edge of TIOA +#define AT91C_TC_LDRA_FALLING (0x2 << 16) // (TC) Edge: falling edge of TIOA +#define AT91C_TC_LDRA_BOTH (0x3 << 16) // (TC) Edge: each edge of TIOA +#define AT91C_TC_ACPA (0x3 << 16) // (TC) RA Compare Effect on TIOA +#define AT91C_TC_ACPA_NONE (0x0 << 16) // (TC) Effect: none +#define AT91C_TC_ACPA_SET (0x1 << 16) // (TC) Effect: set +#define AT91C_TC_ACPA_CLEAR (0x2 << 16) // (TC) Effect: clear +#define AT91C_TC_ACPA_TOGGLE (0x3 << 16) // (TC) Effect: toggle +#define AT91C_TC_LDRB (0x3 << 18) // (TC) RB Loading Selection +#define AT91C_TC_LDRB_NONE (0x0 << 18) // (TC) Edge: None +#define AT91C_TC_LDRB_RISING (0x1 << 18) // (TC) Edge: rising edge of TIOA +#define AT91C_TC_LDRB_FALLING (0x2 << 18) // (TC) Edge: falling edge of TIOA +#define AT91C_TC_LDRB_BOTH (0x3 << 18) // (TC) Edge: each edge of TIOA +#define AT91C_TC_ACPC (0x3 << 18) // (TC) RC Compare Effect on TIOA +#define AT91C_TC_ACPC_NONE (0x0 << 18) // (TC) Effect: none +#define AT91C_TC_ACPC_SET (0x1 << 18) // (TC) Effect: set +#define AT91C_TC_ACPC_CLEAR (0x2 << 18) // (TC) Effect: clear +#define AT91C_TC_ACPC_TOGGLE (0x3 << 18) // (TC) Effect: toggle +#define AT91C_TC_AEEVT (0x3 << 20) // (TC) External Event Effect on TIOA +#define AT91C_TC_AEEVT_NONE (0x0 << 20) // (TC) Effect: none +#define AT91C_TC_AEEVT_SET (0x1 << 20) // (TC) Effect: set +#define AT91C_TC_AEEVT_CLEAR (0x2 << 20) // (TC) Effect: clear +#define AT91C_TC_AEEVT_TOGGLE (0x3 << 20) // (TC) Effect: toggle +#define AT91C_TC_ASWTRG (0x3 << 22) // (TC) Software Trigger Effect on TIOA +#define AT91C_TC_ASWTRG_NONE (0x0 << 22) // (TC) Effect: none +#define AT91C_TC_ASWTRG_SET (0x1 << 22) // (TC) Effect: set +#define AT91C_TC_ASWTRG_CLEAR (0x2 << 22) // (TC) Effect: clear +#define AT91C_TC_ASWTRG_TOGGLE (0x3 << 22) // (TC) Effect: toggle +#define AT91C_TC_BCPB (0x3 << 24) // (TC) RB Compare Effect on TIOB +#define AT91C_TC_BCPB_NONE (0x0 << 24) // (TC) Effect: none +#define AT91C_TC_BCPB_SET (0x1 << 24) // (TC) Effect: set +#define AT91C_TC_BCPB_CLEAR (0x2 << 24) // (TC) Effect: clear +#define AT91C_TC_BCPB_TOGGLE (0x3 << 24) // (TC) Effect: toggle +#define AT91C_TC_BCPC (0x3 << 26) // (TC) RC Compare Effect on TIOB +#define AT91C_TC_BCPC_NONE (0x0 << 26) // (TC) Effect: none +#define AT91C_TC_BCPC_SET (0x1 << 26) // (TC) Effect: set +#define AT91C_TC_BCPC_CLEAR (0x2 << 26) // (TC) Effect: clear +#define AT91C_TC_BCPC_TOGGLE (0x3 << 26) // (TC) Effect: toggle +#define AT91C_TC_BEEVT (0x3 << 28) // (TC) External Event Effect on TIOB +#define AT91C_TC_BEEVT_NONE (0x0 << 28) // (TC) Effect: none +#define AT91C_TC_BEEVT_SET (0x1 << 28) // (TC) Effect: set +#define AT91C_TC_BEEVT_CLEAR (0x2 << 28) // (TC) Effect: clear +#define AT91C_TC_BEEVT_TOGGLE (0x3 << 28) // (TC) Effect: toggle +#define AT91C_TC_BSWTRG (0x3 << 30) // (TC) Software Trigger Effect on TIOB +#define AT91C_TC_BSWTRG_NONE (0x0 << 30) // (TC) Effect: none +#define AT91C_TC_BSWTRG_SET (0x1 << 30) // (TC) Effect: set +#define AT91C_TC_BSWTRG_CLEAR (0x2 << 30) // (TC) Effect: clear +#define AT91C_TC_BSWTRG_TOGGLE (0x3 << 30) // (TC) Effect: toggle +// -------- TC_SR : (TC Offset: 0x20) TC Channel Status Register -------- +#define AT91C_TC_COVFS (0x1 << 0) // (TC) Counter Overflow +#define AT91C_TC_LOVRS (0x1 << 1) // (TC) Load Overrun +#define AT91C_TC_CPAS (0x1 << 2) // (TC) RA Compare +#define AT91C_TC_CPBS (0x1 << 3) // (TC) RB Compare +#define AT91C_TC_CPCS (0x1 << 4) // (TC) RC Compare +#define AT91C_TC_LDRAS (0x1 << 5) // (TC) RA Loading +#define AT91C_TC_LDRBS (0x1 << 6) // (TC) RB Loading +#define AT91C_TC_ETRCS (0x1 << 7) // (TC) External Trigger +#define AT91C_TC_ETRGS (0x1 << 16) // (TC) Clock Enabling +#define AT91C_TC_MTIOA (0x1 << 17) // (TC) TIOA Mirror +#define AT91C_TC_MTIOB (0x1 << 18) // (TC) TIOA Mirror +// -------- TC_IER : (TC Offset: 0x24) TC Channel Interrupt Enable Register -------- +// -------- TC_IDR : (TC Offset: 0x28) TC Channel Interrupt Disable Register -------- +// -------- TC_IMR : (TC Offset: 0x2c) TC Channel Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Timer Counter Interface +// ***************************************************************************** +// *** Register offset in AT91S_TCB structure *** +#define TCB_TC0 ( 0) // TC Channel 0 +#define TCB_TC1 (64) // TC Channel 1 +#define TCB_TC2 (128) // TC Channel 2 +#define TCB_BCR (192) // TC Block Control Register +#define TCB_BMR (196) // TC Block Mode Register +// -------- TCB_BCR : (TCB Offset: 0xc0) TC Block Control Register -------- +#define AT91C_TCB_SYNC (0x1 << 0) // (TCB) Synchro Command +// -------- TCB_BMR : (TCB Offset: 0xc4) TC Block Mode Register -------- +#define AT91C_TCB_TC0XC0S (0x1 << 0) // (TCB) External Clock Signal 0 Selection +#define AT91C_TCB_TC0XC0S_TCLK0 (0x0) // (TCB) TCLK0 connected to XC0 +#define AT91C_TCB_TC0XC0S_NONE (0x1) // (TCB) None signal connected to XC0 +#define AT91C_TCB_TC0XC0S_TIOA1 (0x2) // (TCB) TIOA1 connected to XC0 +#define AT91C_TCB_TC0XC0S_TIOA2 (0x3) // (TCB) TIOA2 connected to XC0 +#define AT91C_TCB_TC1XC1S (0x1 << 2) // (TCB) External Clock Signal 1 Selection +#define AT91C_TCB_TC1XC1S_TCLK1 (0x0 << 2) // (TCB) TCLK1 connected to XC1 +#define AT91C_TCB_TC1XC1S_NONE (0x1 << 2) // (TCB) None signal connected to XC1 +#define AT91C_TCB_TC1XC1S_TIOA0 (0x2 << 2) // (TCB) TIOA0 connected to XC1 +#define AT91C_TCB_TC1XC1S_TIOA2 (0x3 << 2) // (TCB) TIOA2 connected to XC1 +#define AT91C_TCB_TC2XC2S (0x1 << 4) // (TCB) External Clock Signal 2 Selection +#define AT91C_TCB_TC2XC2S_TCLK2 (0x0 << 4) // (TCB) TCLK2 connected to XC2 +#define AT91C_TCB_TC2XC2S_NONE (0x1 << 4) // (TCB) None signal connected to XC2 +#define AT91C_TCB_TC2XC2S_TIOA0 (0x2 << 4) // (TCB) TIOA0 connected to XC2 +#define AT91C_TCB_TC2XC2S_TIOA2 (0x3 << 4) // (TCB) TIOA2 connected to XC2 + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR PWMC Channel Interface +// ***************************************************************************** +// *** Register offset in AT91S_PWMC_CH structure *** +#define PWMC_CMR ( 0) // Channel Mode Register +#define PWMC_CDTYR ( 4) // Channel Duty Cycle Register +#define PWMC_CPRDR ( 8) // Channel Period Register +#define PWMC_CCNTR (12) // Channel Counter Register +#define PWMC_CUPDR (16) // Channel Update Register +#define PWMC_Reserved (20) // Reserved +// -------- PWMC_CMR : (PWMC_CH Offset: 0x0) PWMC Channel Mode Register -------- +#define AT91C_PWMC_CPRE (0xF << 0) // (PWMC_CH) Channel Pre-scaler : PWMC_CLKx +#define AT91C_PWMC_CPRE_MCK (0x0) // (PWMC_CH) +#define AT91C_PWMC_CPRE_MCKA (0xB) // (PWMC_CH) +#define AT91C_PWMC_CPRE_MCKB (0xC) // (PWMC_CH) +#define AT91C_PWMC_CALG (0x1 << 8) // (PWMC_CH) Channel Alignment +#define AT91C_PWMC_CPOL (0x1 << 9) // (PWMC_CH) Channel Polarity +#define AT91C_PWMC_CPD (0x1 << 10) // (PWMC_CH) Channel Update Period +// -------- PWMC_CDTYR : (PWMC_CH Offset: 0x4) PWMC Channel Duty Cycle Register -------- +#define AT91C_PWMC_CDTY (0x0 << 0) // (PWMC_CH) Channel Duty Cycle +// -------- PWMC_CPRDR : (PWMC_CH Offset: 0x8) PWMC Channel Period Register -------- +#define AT91C_PWMC_CPRD (0x0 << 0) // (PWMC_CH) Channel Period +// -------- PWMC_CCNTR : (PWMC_CH Offset: 0xc) PWMC Channel Counter Register -------- +#define AT91C_PWMC_CCNT (0x0 << 0) // (PWMC_CH) Channel Counter +// -------- PWMC_CUPDR : (PWMC_CH Offset: 0x10) PWMC Channel Update Register -------- +#define AT91C_PWMC_CUPD (0x0 << 0) // (PWMC_CH) Channel Update + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Pulse Width Modulation Controller Interface +// ***************************************************************************** +// *** Register offset in AT91S_PWMC structure *** +#define PWMC_MR ( 0) // PWMC Mode Register +#define PWMC_ENA ( 4) // PWMC Enable Register +#define PWMC_DIS ( 8) // PWMC Disable Register +#define PWMC_SR (12) // PWMC Status Register +#define PWMC_IER (16) // PWMC Interrupt Enable Register +#define PWMC_IDR (20) // PWMC Interrupt Disable Register +#define PWMC_IMR (24) // PWMC Interrupt Mask Register +#define PWMC_ISR (28) // PWMC Interrupt Status Register +#define PWMC_VR (252) // PWMC Version Register +#define PWMC_CH (512) // PWMC Channel 0 +// -------- PWMC_MR : (PWMC Offset: 0x0) PWMC Mode Register -------- +#define AT91C_PWMC_DIVA (0xFF << 0) // (PWMC) CLKA divide factor. +#define AT91C_PWMC_PREA (0xF << 8) // (PWMC) Divider Input Clock Prescaler A +#define AT91C_PWMC_PREA_MCK (0x0 << 8) // (PWMC) +#define AT91C_PWMC_DIVB (0xFF << 16) // (PWMC) CLKB divide factor. +#define AT91C_PWMC_PREB (0xF << 24) // (PWMC) Divider Input Clock Prescaler B +#define AT91C_PWMC_PREB_MCK (0x0 << 24) // (PWMC) +// -------- PWMC_ENA : (PWMC Offset: 0x4) PWMC Enable Register -------- +#define AT91C_PWMC_CHID0 (0x1 << 0) // (PWMC) Channel ID 0 +#define AT91C_PWMC_CHID1 (0x1 << 1) // (PWMC) Channel ID 1 +#define AT91C_PWMC_CHID2 (0x1 << 2) // (PWMC) Channel ID 2 +#define AT91C_PWMC_CHID3 (0x1 << 3) // (PWMC) Channel ID 3 +#define AT91C_PWMC_CHID4 (0x1 << 4) // (PWMC) Channel ID 4 +#define AT91C_PWMC_CHID5 (0x1 << 5) // (PWMC) Channel ID 5 +#define AT91C_PWMC_CHID6 (0x1 << 6) // (PWMC) Channel ID 6 +#define AT91C_PWMC_CHID7 (0x1 << 7) // (PWMC) Channel ID 7 +// -------- PWMC_DIS : (PWMC Offset: 0x8) PWMC Disable Register -------- +// -------- PWMC_SR : (PWMC Offset: 0xc) PWMC Status Register -------- +// -------- PWMC_IER : (PWMC Offset: 0x10) PWMC Interrupt Enable Register -------- +// -------- PWMC_IDR : (PWMC Offset: 0x14) PWMC Interrupt Disable Register -------- +// -------- PWMC_IMR : (PWMC Offset: 0x18) PWMC Interrupt Mask Register -------- +// -------- PWMC_ISR : (PWMC Offset: 0x1c) PWMC Interrupt Status Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR USB Device Interface +// ***************************************************************************** +// *** Register offset in AT91S_UDP structure *** +#define UDP_NUM ( 0) // Frame Number Register +#define UDP_GLBSTATE ( 4) // Global State Register +#define UDP_FADDR ( 8) // Function Address Register +#define UDP_IER (16) // Interrupt Enable Register +#define UDP_IDR (20) // Interrupt Disable Register +#define UDP_IMR (24) // Interrupt Mask Register +#define UDP_ISR (28) // Interrupt Status Register +#define UDP_ICR (32) // Interrupt Clear Register +#define UDP_RSTEP (40) // Reset Endpoint Register +#define UDP_CSR (48) // Endpoint Control and Status Register +#define UDP_FDR (80) // Endpoint FIFO Data Register +// -------- UDP_FRM_NUM : (UDP Offset: 0x0) USB Frame Number Register -------- +#define AT91C_UDP_FRM_NUM (0x7FF << 0) // (UDP) Frame Number as Defined in the Packet Field Formats +#define AT91C_UDP_FRM_ERR (0x1 << 16) // (UDP) Frame Error +#define AT91C_UDP_FRM_OK (0x1 << 17) // (UDP) Frame OK +// -------- UDP_GLB_STATE : (UDP Offset: 0x4) USB Global State Register -------- +#define AT91C_UDP_FADDEN (0x1 << 0) // (UDP) Function Address Enable +#define AT91C_UDP_CONFG (0x1 << 1) // (UDP) Configured +#define AT91C_UDP_RMWUPE (0x1 << 2) // (UDP) Remote Wake Up Enable +#define AT91C_UDP_RSMINPR (0x1 << 3) // (UDP) A Resume Has Been Sent to the Host +// -------- UDP_FADDR : (UDP Offset: 0x8) USB Function Address Register -------- +#define AT91C_UDP_FADD (0xFF << 0) // (UDP) Function Address Value +#define AT91C_UDP_FEN (0x1 << 8) // (UDP) Function Enable +// -------- UDP_IER : (UDP Offset: 0x10) USB Interrupt Enable Register -------- +#define AT91C_UDP_EPINT0 (0x1 << 0) // (UDP) Endpoint 0 Interrupt +#define AT91C_UDP_EPINT1 (0x1 << 1) // (UDP) Endpoint 0 Interrupt +#define AT91C_UDP_EPINT2 (0x1 << 2) // (UDP) Endpoint 2 Interrupt +#define AT91C_UDP_EPINT3 (0x1 << 3) // (UDP) Endpoint 3 Interrupt +#define AT91C_UDP_EPINT4 (0x1 << 4) // (UDP) Endpoint 4 Interrupt +#define AT91C_UDP_EPINT5 (0x1 << 5) // (UDP) Endpoint 5 Interrupt +#define AT91C_UDP_EPINT6 (0x1 << 6) // (UDP) Endpoint 6 Interrupt +#define AT91C_UDP_EPINT7 (0x1 << 7) // (UDP) Endpoint 7 Interrupt +#define AT91C_UDP_RXSUSP (0x1 << 8) // (UDP) USB Suspend Interrupt +#define AT91C_UDP_RXRSM (0x1 << 9) // (UDP) USB Resume Interrupt +#define AT91C_UDP_EXTRSM (0x1 << 10) // (UDP) USB External Resume Interrupt +#define AT91C_UDP_SOFINT (0x1 << 11) // (UDP) USB Start Of frame Interrupt +#define AT91C_UDP_WAKEUP (0x1 << 13) // (UDP) USB Resume Interrupt +// -------- UDP_IDR : (UDP Offset: 0x14) USB Interrupt Disable Register -------- +// -------- UDP_IMR : (UDP Offset: 0x18) USB Interrupt Mask Register -------- +// -------- UDP_ISR : (UDP Offset: 0x1c) USB Interrupt Status Register -------- +#define AT91C_UDP_ENDBUSRES (0x1 << 12) // (UDP) USB End Of Bus Reset Interrupt +// -------- UDP_ICR : (UDP Offset: 0x20) USB Interrupt Clear Register -------- +// -------- UDP_RST_EP : (UDP Offset: 0x28) USB Reset Endpoint Register -------- +#define AT91C_UDP_EP0 (0x1 << 0) // (UDP) Reset Endpoint 0 +#define AT91C_UDP_EP1 (0x1 << 1) // (UDP) Reset Endpoint 1 +#define AT91C_UDP_EP2 (0x1 << 2) // (UDP) Reset Endpoint 2 +#define AT91C_UDP_EP3 (0x1 << 3) // (UDP) Reset Endpoint 3 +#define AT91C_UDP_EP4 (0x1 << 4) // (UDP) Reset Endpoint 4 +#define AT91C_UDP_EP5 (0x1 << 5) // (UDP) Reset Endpoint 5 +#define AT91C_UDP_EP6 (0x1 << 6) // (UDP) Reset Endpoint 6 +#define AT91C_UDP_EP7 (0x1 << 7) // (UDP) Reset Endpoint 7 +// -------- UDP_CSR : (UDP Offset: 0x30) USB Endpoint Control and Status Register -------- +#define AT91C_UDP_TXCOMP (0x1 << 0) // (UDP) Generates an IN packet with data previously written in the DPR +#define AT91C_UDP_RX_DATA_BK0 (0x1 << 1) // (UDP) Receive Data Bank 0 +#define AT91C_UDP_RXSETUP (0x1 << 2) // (UDP) Sends STALL to the Host (Control endpoints) +#define AT91C_UDP_ISOERROR (0x1 << 3) // (UDP) Isochronous error (Isochronous endpoints) +#define AT91C_UDP_TXPKTRDY (0x1 << 4) // (UDP) Transmit Packet Ready +#define AT91C_UDP_FORCESTALL (0x1 << 5) // (UDP) Force Stall (used by Control, Bulk and Isochronous endpoints). +#define AT91C_UDP_RX_DATA_BK1 (0x1 << 6) // (UDP) Receive Data Bank 1 (only used by endpoints with ping-pong attributes). +#define AT91C_UDP_DIR (0x1 << 7) // (UDP) Transfer Direction +#define AT91C_UDP_EPTYPE (0x7 << 8) // (UDP) Endpoint type +#define AT91C_UDP_EPTYPE_CTRL (0x0 << 8) // (UDP) Control +#define AT91C_UDP_EPTYPE_ISO_OUT (0x1 << 8) // (UDP) Isochronous OUT +#define AT91C_UDP_EPTYPE_BULK_OUT (0x2 << 8) // (UDP) Bulk OUT +#define AT91C_UDP_EPTYPE_INT_OUT (0x3 << 8) // (UDP) Interrupt OUT +#define AT91C_UDP_EPTYPE_ISO_IN (0x5 << 8) // (UDP) Isochronous IN +#define AT91C_UDP_EPTYPE_BULK_IN (0x6 << 8) // (UDP) Bulk IN +#define AT91C_UDP_EPTYPE_INT_IN (0x7 << 8) // (UDP) Interrupt IN +#define AT91C_UDP_DTGLE (0x1 << 11) // (UDP) Data Toggle +#define AT91C_UDP_EPEDS (0x1 << 15) // (UDP) Endpoint Enable Disable +#define AT91C_UDP_RXBYTECNT (0x7FF << 16) // (UDP) Number Of Bytes Available in the FIFO + +// ***************************************************************************** +// REGISTER ADDRESS DEFINITION FOR AT91SAM7S64 +// ***************************************************************************** +// ========== Register definition for SYSC peripheral ========== +#define AT91C_SYSC_SYSC_VRPM (0xFFFFFD60) // (SYSC) Voltage Regulator Power Mode Register +// ========== Register definition for AIC peripheral ========== +#define AT91C_AIC_ICCR (0xFFFFF128) // (AIC) Interrupt Clear Command Register +#define AT91C_AIC_IECR (0xFFFFF120) // (AIC) Interrupt Enable Command Register +#define AT91C_AIC_SMR (0xFFFFF000) // (AIC) Source Mode Register +#define AT91C_AIC_ISCR (0xFFFFF12C) // (AIC) Interrupt Set Command Register +#define AT91C_AIC_EOICR (0xFFFFF130) // (AIC) End of Interrupt Command Register +#define AT91C_AIC_DCR (0xFFFFF138) // (AIC) Debug Control Register (Protect) +#define AT91C_AIC_FFER (0xFFFFF140) // (AIC) Fast Forcing Enable Register +#define AT91C_AIC_SVR (0xFFFFF080) // (AIC) Source Vector Register +#define AT91C_AIC_SPU (0xFFFFF134) // (AIC) Spurious Vector Register +#define AT91C_AIC_FFDR (0xFFFFF144) // (AIC) Fast Forcing Disable Register +#define AT91C_AIC_FVR (0xFFFFF104) // (AIC) FIQ Vector Register +#define AT91C_AIC_FFSR (0xFFFFF148) // (AIC) Fast Forcing Status Register +#define AT91C_AIC_IMR (0xFFFFF110) // (AIC) Interrupt Mask Register +#define AT91C_AIC_ISR (0xFFFFF108) // (AIC) Interrupt Status Register +#define AT91C_AIC_IVR (0xFFFFF100) // (AIC) IRQ Vector Register +#define AT91C_AIC_IDCR (0xFFFFF124) // (AIC) Interrupt Disable Command Register +#define AT91C_AIC_CISR (0xFFFFF114) // (AIC) Core Interrupt Status Register +#define AT91C_AIC_IPR (0xFFFFF10C) // (AIC) Interrupt Pending Register +// ========== Register definition for DBGU peripheral ========== +#define AT91C_DBGU_C2R (0xFFFFF244) // (DBGU) Chip ID2 Register +#define AT91C_DBGU_THR (0xFFFFF21C) // (DBGU) Transmitter Holding Register +#define AT91C_DBGU_CSR (0xFFFFF214) // (DBGU) Channel Status Register +#define AT91C_DBGU_IDR (0xFFFFF20C) // (DBGU) Interrupt Disable Register +#define AT91C_DBGU_MR (0xFFFFF204) // (DBGU) Mode Register +#define AT91C_DBGU_FNTR (0xFFFFF248) // (DBGU) Force NTRST Register +#define AT91C_DBGU_C1R (0xFFFFF240) // (DBGU) Chip ID1 Register +#define AT91C_DBGU_BRGR (0xFFFFF220) // (DBGU) Baud Rate Generator Register +#define AT91C_DBGU_RHR (0xFFFFF218) // (DBGU) Receiver Holding Register +#define AT91C_DBGU_IMR (0xFFFFF210) // (DBGU) Interrupt Mask Register +#define AT91C_DBGU_IER (0xFFFFF208) // (DBGU) Interrupt Enable Register +#define AT91C_DBGU_CR (0xFFFFF200) // (DBGU) Control Register +// ========== Register definition for PDC_DBGU peripheral ========== +#define AT91C_DBGU_TNCR (0xFFFFF31C) // (PDC_DBGU) Transmit Next Counter Register +#define AT91C_DBGU_RNCR (0xFFFFF314) // (PDC_DBGU) Receive Next Counter Register +#define AT91C_DBGU_PTCR (0xFFFFF320) // (PDC_DBGU) PDC Transfer Control Register +#define AT91C_DBGU_PTSR (0xFFFFF324) // (PDC_DBGU) PDC Transfer Status Register +#define AT91C_DBGU_RCR (0xFFFFF304) // (PDC_DBGU) Receive Counter Register +#define AT91C_DBGU_TCR (0xFFFFF30C) // (PDC_DBGU) Transmit Counter Register +#define AT91C_DBGU_RPR (0xFFFFF300) // (PDC_DBGU) Receive Pointer Register +#define AT91C_DBGU_TPR (0xFFFFF308) // (PDC_DBGU) Transmit Pointer Register +#define AT91C_DBGU_RNPR (0xFFFFF310) // (PDC_DBGU) Receive Next Pointer Register +#define AT91C_DBGU_TNPR (0xFFFFF318) // (PDC_DBGU) Transmit Next Pointer Register +// ========== Register definition for PIOA peripheral ========== +#define AT91C_PIOA_IMR (0xFFFFF448) // (PIOA) Interrupt Mask Register +#define AT91C_PIOA_IER (0xFFFFF440) // (PIOA) Interrupt Enable Register +#define AT91C_PIOA_OWDR (0xFFFFF4A4) // (PIOA) Output Write Disable Register +#define AT91C_PIOA_ISR (0xFFFFF44C) // (PIOA) Interrupt Status Register +#define AT91C_PIOA_PPUDR (0xFFFFF460) // (PIOA) Pull-up Disable Register +#define AT91C_PIOA_MDSR (0xFFFFF458) // (PIOA) Multi-driver Status Register +#define AT91C_PIOA_MDER (0xFFFFF450) // (PIOA) Multi-driver Enable Register +#define AT91C_PIOA_PER (0xFFFFF400) // (PIOA) PIO Enable Register +#define AT91C_PIOA_PSR (0xFFFFF408) // (PIOA) PIO Status Register +#define AT91C_PIOA_OER (0xFFFFF410) // (PIOA) Output Enable Register +#define AT91C_PIOA_BSR (0xFFFFF474) // (PIOA) Select B Register +#define AT91C_PIOA_PPUER (0xFFFFF464) // (PIOA) Pull-up Enable Register +#define AT91C_PIOA_MDDR (0xFFFFF454) // (PIOA) Multi-driver Disable Register +#define AT91C_PIOA_PDR (0xFFFFF404) // (PIOA) PIO Disable Register +#define AT91C_PIOA_ODR (0xFFFFF414) // (PIOA) Output Disable Registerr +#define AT91C_PIOA_IFDR (0xFFFFF424) // (PIOA) Input Filter Disable Register +#define AT91C_PIOA_ABSR (0xFFFFF478) // (PIOA) AB Select Status Register +#define AT91C_PIOA_ASR (0xFFFFF470) // (PIOA) Select A Register +#define AT91C_PIOA_PPUSR (0xFFFFF468) // (PIOA) Pad Pull-up Status Register +#define AT91C_PIOA_ODSR (0xFFFFF438) // (PIOA) Output Data Status Register +#define AT91C_PIOA_SODR (0xFFFFF430) // (PIOA) Set Output Data Register +#define AT91C_PIOA_IFSR (0xFFFFF428) // (PIOA) Input Filter Status Register +#define AT91C_PIOA_IFER (0xFFFFF420) // (PIOA) Input Filter Enable Register +#define AT91C_PIOA_OSR (0xFFFFF418) // (PIOA) Output Status Register +#define AT91C_PIOA_IDR (0xFFFFF444) // (PIOA) Interrupt Disable Register +#define AT91C_PIOA_PDSR (0xFFFFF43C) // (PIOA) Pin Data Status Register +#define AT91C_PIOA_CODR (0xFFFFF434) // (PIOA) Clear Output Data Register +#define AT91C_PIOA_OWSR (0xFFFFF4A8) // (PIOA) Output Write Status Register +#define AT91C_PIOA_OWER (0xFFFFF4A0) // (PIOA) Output Write Enable Register +// ========== Register definition for CKGR peripheral ========== +#define AT91C_CKGR_PLLR (0xFFFFFC2C) // (CKGR) PLL Register +#define AT91C_CKGR_MCFR (0xFFFFFC24) // (CKGR) Main Clock Frequency Register +#define AT91C_CKGR_MOR (0xFFFFFC20) // (CKGR) Main Oscillator Register +// ========== Register definition for PMC peripheral ========== +#define AT91C_PMC_SCSR (0xFFFFFC08) // (PMC) System Clock Status Register +#define AT91C_PMC_SCER (0xFFFFFC00) // (PMC) System Clock Enable Register +#define AT91C_PMC_IMR (0xFFFFFC6C) // (PMC) Interrupt Mask Register +#define AT91C_PMC_IDR (0xFFFFFC64) // (PMC) Interrupt Disable Register +#define AT91C_PMC_PCDR (0xFFFFFC14) // (PMC) Peripheral Clock Disable Register +#define AT91C_PMC_SCDR (0xFFFFFC04) // (PMC) System Clock Disable Register +#define AT91C_PMC_SR (0xFFFFFC68) // (PMC) Status Register +#define AT91C_PMC_IER (0xFFFFFC60) // (PMC) Interrupt Enable Register +#define AT91C_PMC_MCKR (0xFFFFFC30) // (PMC) Master Clock Register +#define AT91C_PMC_MOR (0xFFFFFC20) // (PMC) Main Oscillator Register +#define AT91C_PMC_PCER (0xFFFFFC10) // (PMC) Peripheral Clock Enable Register +#define AT91C_PMC_PCSR (0xFFFFFC18) // (PMC) Peripheral Clock Status Register +#define AT91C_PMC_PLLR (0xFFFFFC2C) // (PMC) PLL Register +#define AT91C_PMC_MCFR (0xFFFFFC24) // (PMC) Main Clock Frequency Register +#define AT91C_PMC_PCKR (0xFFFFFC40) // (PMC) Programmable Clock Register +// ========== Register definition for RSTC peripheral ========== +#define AT91C_RSTC_RSR (0xFFFFFD04) // (RSTC) Reset Status Register +#define AT91C_RSTC_RMR (0xFFFFFD08) // (RSTC) Reset Mode Register +#define AT91C_RSTC_RCR (0xFFFFFD00) // (RSTC) Reset Control Register +// ========== Register definition for RTTC peripheral ========== +#define AT91C_RTTC_RTSR (0xFFFFFD2C) // (RTTC) Real-time Status Register +#define AT91C_RTTC_RTAR (0xFFFFFD24) // (RTTC) Real-time Alarm Register +#define AT91C_RTTC_RTVR (0xFFFFFD28) // (RTTC) Real-time Value Register +#define AT91C_RTTC_RTMR (0xFFFFFD20) // (RTTC) Real-time Mode Register +// ========== Register definition for PITC peripheral ========== +#define AT91C_PITC_PIIR (0xFFFFFD3C) // (PITC) Period Interval Image Register +#define AT91C_PITC_PISR (0xFFFFFD34) // (PITC) Period Interval Status Register +#define AT91C_PITC_PIVR (0xFFFFFD38) // (PITC) Period Interval Value Register +#define AT91C_PITC_PIMR (0xFFFFFD30) // (PITC) Period Interval Mode Register +// ========== Register definition for WDTC peripheral ========== +#define AT91C_WDTC_WDMR (0xFFFFFD44) // (WDTC) Watchdog Mode Register +#define AT91C_WDTC_WDSR (0xFFFFFD48) // (WDTC) Watchdog Status Register +#define AT91C_WDTC_WDCR (0xFFFFFD40) // (WDTC) Watchdog Control Register +// ========== Register definition for MC peripheral ========== +#define AT91C_MC_FCR (0xFFFFFF64) // (MC) MC Flash Command Register +#define AT91C_MC_ASR (0xFFFFFF04) // (MC) MC Abort Status Register +#define AT91C_MC_FSR (0xFFFFFF68) // (MC) MC Flash Status Register +#define AT91C_MC_FMR (0xFFFFFF60) // (MC) MC Flash Mode Register +#define AT91C_MC_AASR (0xFFFFFF08) // (MC) MC Abort Address Status Register +#define AT91C_MC_RCR (0xFFFFFF00) // (MC) MC Remap Control Register +// ========== Register definition for PDC_SPI peripheral ========== +#define AT91C_SPI_PTCR (0xFFFE0120) // (PDC_SPI) PDC Transfer Control Register +#define AT91C_SPI_TNPR (0xFFFE0118) // (PDC_SPI) Transmit Next Pointer Register +#define AT91C_SPI_RNPR (0xFFFE0110) // (PDC_SPI) Receive Next Pointer Register +#define AT91C_SPI_TPR (0xFFFE0108) // (PDC_SPI) Transmit Pointer Register +#define AT91C_SPI_RPR (0xFFFE0100) // (PDC_SPI) Receive Pointer Register +#define AT91C_SPI_PTSR (0xFFFE0124) // (PDC_SPI) PDC Transfer Status Register +#define AT91C_SPI_TNCR (0xFFFE011C) // (PDC_SPI) Transmit Next Counter Register +#define AT91C_SPI_RNCR (0xFFFE0114) // (PDC_SPI) Receive Next Counter Register +#define AT91C_SPI_TCR (0xFFFE010C) // (PDC_SPI) Transmit Counter Register +#define AT91C_SPI_RCR (0xFFFE0104) // (PDC_SPI) Receive Counter Register +// ========== Register definition for SPI peripheral ========== +#define AT91C_SPI_CSR (0xFFFE0030) // (SPI) Chip Select Register +#define AT91C_SPI_IDR (0xFFFE0018) // (SPI) Interrupt Disable Register +#define AT91C_SPI_SR (0xFFFE0010) // (SPI) Status Register +#define AT91C_SPI_RDR (0xFFFE0008) // (SPI) Receive Data Register +#define AT91C_SPI_CR (0xFFFE0000) // (SPI) Control Register +#define AT91C_SPI_IMR (0xFFFE001C) // (SPI) Interrupt Mask Register +#define AT91C_SPI_IER (0xFFFE0014) // (SPI) Interrupt Enable Register +#define AT91C_SPI_TDR (0xFFFE000C) // (SPI) Transmit Data Register +#define AT91C_SPI_MR (0xFFFE0004) // (SPI) Mode Register +// ========== Register definition for PDC_ADC peripheral ========== +#define AT91C_ADC_PTCR (0xFFFD8120) // (PDC_ADC) PDC Transfer Control Register +#define AT91C_ADC_TNPR (0xFFFD8118) // (PDC_ADC) Transmit Next Pointer Register +#define AT91C_ADC_RNPR (0xFFFD8110) // (PDC_ADC) Receive Next Pointer Register +#define AT91C_ADC_TPR (0xFFFD8108) // (PDC_ADC) Transmit Pointer Register +#define AT91C_ADC_RPR (0xFFFD8100) // (PDC_ADC) Receive Pointer Register +#define AT91C_ADC_PTSR (0xFFFD8124) // (PDC_ADC) PDC Transfer Status Register +#define AT91C_ADC_TNCR (0xFFFD811C) // (PDC_ADC) Transmit Next Counter Register +#define AT91C_ADC_RNCR (0xFFFD8114) // (PDC_ADC) Receive Next Counter Register +#define AT91C_ADC_TCR (0xFFFD810C) // (PDC_ADC) Transmit Counter Register +#define AT91C_ADC_RCR (0xFFFD8104) // (PDC_ADC) Receive Counter Register +// ========== Register definition for ADC peripheral ========== +#define AT91C_ADC_IMR (0xFFFD802C) // (ADC) ADC Interrupt Mask Register +#define AT91C_ADC_CDR4 (0xFFFD8040) // (ADC) ADC Channel Data Register 4 +#define AT91C_ADC_CDR2 (0xFFFD8038) // (ADC) ADC Channel Data Register 2 +#define AT91C_ADC_CDR0 (0xFFFD8030) // (ADC) ADC Channel Data Register 0 +#define AT91C_ADC_CDR7 (0xFFFD804C) // (ADC) ADC Channel Data Register 7 +#define AT91C_ADC_CDR1 (0xFFFD8034) // (ADC) ADC Channel Data Register 1 +#define AT91C_ADC_CDR3 (0xFFFD803C) // (ADC) ADC Channel Data Register 3 +#define AT91C_ADC_CDR5 (0xFFFD8044) // (ADC) ADC Channel Data Register 5 +#define AT91C_ADC_MR (0xFFFD8004) // (ADC) ADC Mode Register +#define AT91C_ADC_CDR6 (0xFFFD8048) // (ADC) ADC Channel Data Register 6 +#define AT91C_ADC_CR (0xFFFD8000) // (ADC) ADC Control Register +#define AT91C_ADC_CHER (0xFFFD8010) // (ADC) ADC Channel Enable Register +#define AT91C_ADC_CHSR (0xFFFD8018) // (ADC) ADC Channel Status Register +#define AT91C_ADC_IER (0xFFFD8024) // (ADC) ADC Interrupt Enable Register +#define AT91C_ADC_SR (0xFFFD801C) // (ADC) ADC Status Register +#define AT91C_ADC_CHDR (0xFFFD8014) // (ADC) ADC Channel Disable Register +#define AT91C_ADC_IDR (0xFFFD8028) // (ADC) ADC Interrupt Disable Register +#define AT91C_ADC_LCDR (0xFFFD8020) // (ADC) ADC Last Converted Data Register +// ========== Register definition for PDC_SSC peripheral ========== +#define AT91C_SSC_PTCR (0xFFFD4120) // (PDC_SSC) PDC Transfer Control Register +#define AT91C_SSC_TNPR (0xFFFD4118) // (PDC_SSC) Transmit Next Pointer Register +#define AT91C_SSC_RNPR (0xFFFD4110) // (PDC_SSC) Receive Next Pointer Register +#define AT91C_SSC_TPR (0xFFFD4108) // (PDC_SSC) Transmit Pointer Register +#define AT91C_SSC_RPR (0xFFFD4100) // (PDC_SSC) Receive Pointer Register +#define AT91C_SSC_PTSR (0xFFFD4124) // (PDC_SSC) PDC Transfer Status Register +#define AT91C_SSC_TNCR (0xFFFD411C) // (PDC_SSC) Transmit Next Counter Register +#define AT91C_SSC_RNCR (0xFFFD4114) // (PDC_SSC) Receive Next Counter Register +#define AT91C_SSC_TCR (0xFFFD410C) // (PDC_SSC) Transmit Counter Register +#define AT91C_SSC_RCR (0xFFFD4104) // (PDC_SSC) Receive Counter Register +// ========== Register definition for SSC peripheral ========== +#define AT91C_SSC_RFMR (0xFFFD4014) // (SSC) Receive Frame Mode Register +#define AT91C_SSC_CMR (0xFFFD4004) // (SSC) Clock Mode Register +#define AT91C_SSC_IDR (0xFFFD4048) // (SSC) Interrupt Disable Register +#define AT91C_SSC_SR (0xFFFD4040) // (SSC) Status Register +#define AT91C_SSC_RC0R (0xFFFD4038) // (SSC) Receive Compare 0 Register +#define AT91C_SSC_RSHR (0xFFFD4030) // (SSC) Receive Sync Holding Register +#define AT91C_SSC_RHR (0xFFFD4020) // (SSC) Receive Holding Register +#define AT91C_SSC_TCMR (0xFFFD4018) // (SSC) Transmit Clock Mode Register +#define AT91C_SSC_RCMR (0xFFFD4010) // (SSC) Receive Clock ModeRegister +#define AT91C_SSC_CR (0xFFFD4000) // (SSC) Control Register +#define AT91C_SSC_IMR (0xFFFD404C) // (SSC) Interrupt Mask Register +#define AT91C_SSC_IER (0xFFFD4044) // (SSC) Interrupt Enable Register +#define AT91C_SSC_RC1R (0xFFFD403C) // (SSC) Receive Compare 1 Register +#define AT91C_SSC_TSHR (0xFFFD4034) // (SSC) Transmit Sync Holding Register +#define AT91C_SSC_THR (0xFFFD4024) // (SSC) Transmit Holding Register +#define AT91C_SSC_TFMR (0xFFFD401C) // (SSC) Transmit Frame Mode Register +// ========== Register definition for PDC_US1 peripheral ========== +#define AT91C_US1_PTSR (0xFFFC4124) // (PDC_US1) PDC Transfer Status Register +#define AT91C_US1_TNCR (0xFFFC411C) // (PDC_US1) Transmit Next Counter Register +#define AT91C_US1_RNCR (0xFFFC4114) // (PDC_US1) Receive Next Counter Register +#define AT91C_US1_TCR (0xFFFC410C) // (PDC_US1) Transmit Counter Register +#define AT91C_US1_RCR (0xFFFC4104) // (PDC_US1) Receive Counter Register +#define AT91C_US1_PTCR (0xFFFC4120) // (PDC_US1) PDC Transfer Control Register +#define AT91C_US1_TNPR (0xFFFC4118) // (PDC_US1) Transmit Next Pointer Register +#define AT91C_US1_RNPR (0xFFFC4110) // (PDC_US1) Receive Next Pointer Register +#define AT91C_US1_TPR (0xFFFC4108) // (PDC_US1) Transmit Pointer Register +#define AT91C_US1_RPR (0xFFFC4100) // (PDC_US1) Receive Pointer Register +// ========== Register definition for US1 peripheral ========== +#define AT91C_US1_XXR (0xFFFC4048) // (US1) XON_XOFF Register +#define AT91C_US1_RHR (0xFFFC4018) // (US1) Receiver Holding Register +#define AT91C_US1_IMR (0xFFFC4010) // (US1) Interrupt Mask Register +#define AT91C_US1_IER (0xFFFC4008) // (US1) Interrupt Enable Register +#define AT91C_US1_CR (0xFFFC4000) // (US1) Control Register +#define AT91C_US1_RTOR (0xFFFC4024) // (US1) Receiver Time-out Register +#define AT91C_US1_THR (0xFFFC401C) // (US1) Transmitter Holding Register +#define AT91C_US1_CSR (0xFFFC4014) // (US1) Channel Status Register +#define AT91C_US1_IDR (0xFFFC400C) // (US1) Interrupt Disable Register +#define AT91C_US1_FIDI (0xFFFC4040) // (US1) FI_DI_Ratio Register +#define AT91C_US1_BRGR (0xFFFC4020) // (US1) Baud Rate Generator Register +#define AT91C_US1_TTGR (0xFFFC4028) // (US1) Transmitter Time-guard Register +#define AT91C_US1_IF (0xFFFC404C) // (US1) IRDA_FILTER Register +#define AT91C_US1_NER (0xFFFC4044) // (US1) Nb Errors Register +#define AT91C_US1_MR (0xFFFC4004) // (US1) Mode Register +// ========== Register definition for PDC_US0 peripheral ========== +#define AT91C_US0_PTCR (0xFFFC0120) // (PDC_US0) PDC Transfer Control Register +#define AT91C_US0_TNPR (0xFFFC0118) // (PDC_US0) Transmit Next Pointer Register +#define AT91C_US0_RNPR (0xFFFC0110) // (PDC_US0) Receive Next Pointer Register +#define AT91C_US0_TPR (0xFFFC0108) // (PDC_US0) Transmit Pointer Register +#define AT91C_US0_RPR (0xFFFC0100) // (PDC_US0) Receive Pointer Register +#define AT91C_US0_PTSR (0xFFFC0124) // (PDC_US0) PDC Transfer Status Register +#define AT91C_US0_TNCR (0xFFFC011C) // (PDC_US0) Transmit Next Counter Register +#define AT91C_US0_RNCR (0xFFFC0114) // (PDC_US0) Receive Next Counter Register +#define AT91C_US0_TCR (0xFFFC010C) // (PDC_US0) Transmit Counter Register +#define AT91C_US0_RCR (0xFFFC0104) // (PDC_US0) Receive Counter Register +// ========== Register definition for US0 peripheral ========== +#define AT91C_US0_TTGR (0xFFFC0028) // (US0) Transmitter Time-guard Register +#define AT91C_US0_BRGR (0xFFFC0020) // (US0) Baud Rate Generator Register +#define AT91C_US0_RHR (0xFFFC0018) // (US0) Receiver Holding Register +#define AT91C_US0_IMR (0xFFFC0010) // (US0) Interrupt Mask Register +#define AT91C_US0_NER (0xFFFC0044) // (US0) Nb Errors Register +#define AT91C_US0_RTOR (0xFFFC0024) // (US0) Receiver Time-out Register +#define AT91C_US0_XXR (0xFFFC0048) // (US0) XON_XOFF Register +#define AT91C_US0_FIDI (0xFFFC0040) // (US0) FI_DI_Ratio Register +#define AT91C_US0_CR (0xFFFC0000) // (US0) Control Register +#define AT91C_US0_IER (0xFFFC0008) // (US0) Interrupt Enable Register +#define AT91C_US0_IF (0xFFFC004C) // (US0) IRDA_FILTER Register +#define AT91C_US0_MR (0xFFFC0004) // (US0) Mode Register +#define AT91C_US0_IDR (0xFFFC000C) // (US0) Interrupt Disable Register +#define AT91C_US0_CSR (0xFFFC0014) // (US0) Channel Status Register +#define AT91C_US0_THR (0xFFFC001C) // (US0) Transmitter Holding Register +// ========== Register definition for TWI peripheral ========== +#define AT91C_TWI_RHR (0xFFFB8030) // (TWI) Receive Holding Register +#define AT91C_TWI_IDR (0xFFFB8028) // (TWI) Interrupt Disable Register +#define AT91C_TWI_SR (0xFFFB8020) // (TWI) Status Register +#define AT91C_TWI_CWGR (0xFFFB8010) // (TWI) Clock Waveform Generator Register +#define AT91C_TWI_SMR (0xFFFB8008) // (TWI) Slave Mode Register +#define AT91C_TWI_CR (0xFFFB8000) // (TWI) Control Register +#define AT91C_TWI_THR (0xFFFB8034) // (TWI) Transmit Holding Register +#define AT91C_TWI_IMR (0xFFFB802C) // (TWI) Interrupt Mask Register +#define AT91C_TWI_IER (0xFFFB8024) // (TWI) Interrupt Enable Register +#define AT91C_TWI_IADR (0xFFFB800C) // (TWI) Internal Address Register +#define AT91C_TWI_MMR (0xFFFB8004) // (TWI) Master Mode Register +// ========== Register definition for TC2 peripheral ========== +#define AT91C_TC2_IMR (0xFFFA00AC) // (TC2) Interrupt Mask Register +#define AT91C_TC2_IER (0xFFFA00A4) // (TC2) Interrupt Enable Register +#define AT91C_TC2_RC (0xFFFA009C) // (TC2) Register C +#define AT91C_TC2_RA (0xFFFA0094) // (TC2) Register A +#define AT91C_TC2_CMR (0xFFFA0084) // (TC2) Channel Mode Register (Capture Mode / Waveform Mode) +#define AT91C_TC2_IDR (0xFFFA00A8) // (TC2) Interrupt Disable Register +#define AT91C_TC2_SR (0xFFFA00A0) // (TC2) Status Register +#define AT91C_TC2_RB (0xFFFA0098) // (TC2) Register B +#define AT91C_TC2_CV (0xFFFA0090) // (TC2) Counter Value +#define AT91C_TC2_CCR (0xFFFA0080) // (TC2) Channel Control Register +// ========== Register definition for TC1 peripheral ========== +#define AT91C_TC1_IMR (0xFFFA006C) // (TC1) Interrupt Mask Register +#define AT91C_TC1_IER (0xFFFA0064) // (TC1) Interrupt Enable Register +#define AT91C_TC1_RC (0xFFFA005C) // (TC1) Register C +#define AT91C_TC1_RA (0xFFFA0054) // (TC1) Register A +#define AT91C_TC1_CMR (0xFFFA0044) // (TC1) Channel Mode Register (Capture Mode / Waveform Mode) +#define AT91C_TC1_IDR (0xFFFA0068) // (TC1) Interrupt Disable Register +#define AT91C_TC1_SR (0xFFFA0060) // (TC1) Status Register +#define AT91C_TC1_RB (0xFFFA0058) // (TC1) Register B +#define AT91C_TC1_CV (0xFFFA0050) // (TC1) Counter Value +#define AT91C_TC1_CCR (0xFFFA0040) // (TC1) Channel Control Register +// ========== Register definition for TC0 peripheral ========== +#define AT91C_TC0_IMR (0xFFFA002C) // (TC0) Interrupt Mask Register +#define AT91C_TC0_IER (0xFFFA0024) // (TC0) Interrupt Enable Register +#define AT91C_TC0_RC (0xFFFA001C) // (TC0) Register C +#define AT91C_TC0_RA (0xFFFA0014) // (TC0) Register A +#define AT91C_TC0_CMR (0xFFFA0004) // (TC0) Channel Mode Register (Capture Mode / Waveform Mode) +#define AT91C_TC0_IDR (0xFFFA0028) // (TC0) Interrupt Disable Register +#define AT91C_TC0_SR (0xFFFA0020) // (TC0) Status Register +#define AT91C_TC0_RB (0xFFFA0018) // (TC0) Register B +#define AT91C_TC0_CV (0xFFFA0010) // (TC0) Counter Value +#define AT91C_TC0_CCR (0xFFFA0000) // (TC0) Channel Control Register +// ========== Register definition for TCB peripheral ========== +#define AT91C_TCB_BMR (0xFFFA00C4) // (TCB) TC Block Mode Register +#define AT91C_TCB_BCR (0xFFFA00C0) // (TCB) TC Block Control Register +// ========== Register definition for PWMC_CH3 peripheral ========== +#define AT91C_CH3_CUPDR (0xFFFCC270) // (PWMC_CH3) Channel Update Register +#define AT91C_CH3_CPRDR (0xFFFCC268) // (PWMC_CH3) Channel Period Register +#define AT91C_CH3_CMR (0xFFFCC260) // (PWMC_CH3) Channel Mode Register +#define AT91C_CH3_Reserved (0xFFFCC274) // (PWMC_CH3) Reserved +#define AT91C_CH3_CCNTR (0xFFFCC26C) // (PWMC_CH3) Channel Counter Register +#define AT91C_CH3_CDTYR (0xFFFCC264) // (PWMC_CH3) Channel Duty Cycle Register +// ========== Register definition for PWMC_CH2 peripheral ========== +#define AT91C_CH2_CUPDR (0xFFFCC250) // (PWMC_CH2) Channel Update Register +#define AT91C_CH2_CPRDR (0xFFFCC248) // (PWMC_CH2) Channel Period Register +#define AT91C_CH2_CMR (0xFFFCC240) // (PWMC_CH2) Channel Mode Register +#define AT91C_CH2_Reserved (0xFFFCC254) // (PWMC_CH2) Reserved +#define AT91C_CH2_CCNTR (0xFFFCC24C) // (PWMC_CH2) Channel Counter Register +#define AT91C_CH2_CDTYR (0xFFFCC244) // (PWMC_CH2) Channel Duty Cycle Register +// ========== Register definition for PWMC_CH1 peripheral ========== +#define AT91C_CH1_CUPDR (0xFFFCC230) // (PWMC_CH1) Channel Update Register +#define AT91C_CH1_CPRDR (0xFFFCC228) // (PWMC_CH1) Channel Period Register +#define AT91C_CH1_CMR (0xFFFCC220) // (PWMC_CH1) Channel Mode Register +#define AT91C_CH1_Reserved (0xFFFCC234) // (PWMC_CH1) Reserved +#define AT91C_CH1_CCNTR (0xFFFCC22C) // (PWMC_CH1) Channel Counter Register +#define AT91C_CH1_CDTYR (0xFFFCC224) // (PWMC_CH1) Channel Duty Cycle Register +// ========== Register definition for PWMC_CH0 peripheral ========== +#define AT91C_CH0_CUPDR (0xFFFCC210) // (PWMC_CH0) Channel Update Register +#define AT91C_CH0_CPRDR (0xFFFCC208) // (PWMC_CH0) Channel Period Register +#define AT91C_CH0_CMR (0xFFFCC200) // (PWMC_CH0) Channel Mode Register +#define AT91C_CH0_Reserved (0xFFFCC214) // (PWMC_CH0) Reserved +#define AT91C_CH0_CCNTR (0xFFFCC20C) // (PWMC_CH0) Channel Counter Register +#define AT91C_CH0_CDTYR (0xFFFCC204) // (PWMC_CH0) Channel Duty Cycle Register +// ========== Register definition for PWMC peripheral ========== +#define AT91C_PWMC_VR (0xFFFCC0FC) // (PWMC) PWMC Version Register +#define AT91C_PWMC_ISR (0xFFFCC01C) // (PWMC) PWMC Interrupt Status Register +#define AT91C_PWMC_IDR (0xFFFCC014) // (PWMC) PWMC Interrupt Disable Register +#define AT91C_PWMC_SR (0xFFFCC00C) // (PWMC) PWMC Status Register +#define AT91C_PWMC_ENA (0xFFFCC004) // (PWMC) PWMC Enable Register +#define AT91C_PWMC_IMR (0xFFFCC018) // (PWMC) PWMC Interrupt Mask Register +#define AT91C_PWMC_MR (0xFFFCC000) // (PWMC) PWMC Mode Register +#define AT91C_PWMC_DIS (0xFFFCC008) // (PWMC) PWMC Disable Register +#define AT91C_PWMC_IER (0xFFFCC010) // (PWMC) PWMC Interrupt Enable Register +// ========== Register definition for UDP peripheral ========== +#define AT91C_UDP_ISR (0xFFFB001C) // (UDP) Interrupt Status Register +#define AT91C_UDP_IDR (0xFFFB0014) // (UDP) Interrupt Disable Register +#define AT91C_UDP_GLBSTATE (0xFFFB0004) // (UDP) Global State Register +#define AT91C_UDP_FDR (0xFFFB0050) // (UDP) Endpoint FIFO Data Register +#define AT91C_UDP_CSR (0xFFFB0030) // (UDP) Endpoint Control and Status Register +#define AT91C_UDP_RSTEP (0xFFFB0028) // (UDP) Reset Endpoint Register +#define AT91C_UDP_ICR (0xFFFB0020) // (UDP) Interrupt Clear Register +#define AT91C_UDP_IMR (0xFFFB0018) // (UDP) Interrupt Mask Register +#define AT91C_UDP_IER (0xFFFB0010) // (UDP) Interrupt Enable Register +#define AT91C_UDP_FADDR (0xFFFB0008) // (UDP) Function Address Register +#define AT91C_UDP_NUM (0xFFFB0000) // (UDP) Frame Number Register + +// ***************************************************************************** +// PIO DEFINITIONS FOR AT91SAM7S64 +// ***************************************************************************** +#define AT91C_PIO_PA0 (1 << 0) // Pin Controlled by PA0 +#define AT91C_PA0_PWM0 (AT91C_PIO_PA0) // PWM Channel 0 +#define AT91C_PA0_TIOA0 (AT91C_PIO_PA0) // Timer Counter 0 Multipurpose Timer I/O Pin A +#define AT91C_PIO_PA1 (1 << 1) // Pin Controlled by PA1 +#define AT91C_PA1_PWM1 (AT91C_PIO_PA1) // PWM Channel 1 +#define AT91C_PA1_TIOB0 (AT91C_PIO_PA1) // Timer Counter 0 Multipurpose Timer I/O Pin B +#define AT91C_PIO_PA10 (1 << 10) // Pin Controlled by PA10 +#define AT91C_PA10_DTXD (AT91C_PIO_PA10) // DBGU Debug Transmit Data +#define AT91C_PA10_NPCS2 (AT91C_PIO_PA10) // SPI Peripheral Chip Select 2 +#define AT91C_PIO_PA11 (1 << 11) // Pin Controlled by PA11 +#define AT91C_PA11_NPCS0 (AT91C_PIO_PA11) // SPI Peripheral Chip Select 0 +#define AT91C_PA11_PWM0 (AT91C_PIO_PA11) // PWM Channel 0 +#define AT91C_PIO_PA12 (1 << 12) // Pin Controlled by PA12 +#define AT91C_PA12_MISO (AT91C_PIO_PA12) // SPI Master In Slave +#define AT91C_PA12_PWM1 (AT91C_PIO_PA12) // PWM Channel 1 +#define AT91C_PIO_PA13 (1 << 13) // Pin Controlled by PA13 +#define AT91C_PA13_MOSI (AT91C_PIO_PA13) // SPI Master Out Slave +#define AT91C_PA13_PWM2 (AT91C_PIO_PA13) // PWM Channel 2 +#define AT91C_PIO_PA14 (1 << 14) // Pin Controlled by PA14 +#define AT91C_PA14_SPCK (AT91C_PIO_PA14) // SPI Serial Clock +#define AT91C_PA14_PWM3 (AT91C_PIO_PA14) // PWM Channel 3 +#define AT91C_PIO_PA15 (1 << 15) // Pin Controlled by PA15 +#define AT91C_PA15_TF (AT91C_PIO_PA15) // SSC Transmit Frame Sync +#define AT91C_PA15_TIOA1 (AT91C_PIO_PA15) // Timer Counter 1 Multipurpose Timer I/O Pin A +#define AT91C_PIO_PA16 (1 << 16) // Pin Controlled by PA16 +#define AT91C_PA16_TK (AT91C_PIO_PA16) // SSC Transmit Clock +#define AT91C_PA16_TIOB1 (AT91C_PIO_PA16) // Timer Counter 1 Multipurpose Timer I/O Pin B +#define AT91C_PIO_PA17 (1 << 17) // Pin Controlled by PA17 +#define AT91C_PA17_TD (AT91C_PIO_PA17) // SSC Transmit data +#define AT91C_PA17_PCK1 (AT91C_PIO_PA17) // PMC Programmable Clock Output 1 +#define AT91C_PIO_PA18 (1 << 18) // Pin Controlled by PA18 +#define AT91C_PA18_RD (AT91C_PIO_PA18) // SSC Receive Data +#define AT91C_PA18_PCK2 (AT91C_PIO_PA18) // PMC Programmable Clock Output 2 +#define AT91C_PIO_PA19 (1 << 19) // Pin Controlled by PA19 +#define AT91C_PA19_RK (AT91C_PIO_PA19) // SSC Receive Clock +#define AT91C_PA19_FIQ (AT91C_PIO_PA19) // AIC Fast Interrupt Input +#define AT91C_PIO_PA2 (1 << 2) // Pin Controlled by PA2 +#define AT91C_PA2_PWM2 (AT91C_PIO_PA2) // PWM Channel 2 +#define AT91C_PA2_SCK0 (AT91C_PIO_PA2) // USART 0 Serial Clock +#define AT91C_PIO_PA20 (1 << 20) // Pin Controlled by PA20 +#define AT91C_PA20_RF (AT91C_PIO_PA20) // SSC Receive Frame Sync +#define AT91C_PA20_IRQ0 (AT91C_PIO_PA20) // External Interrupt 0 +#define AT91C_PIO_PA21 (1 << 21) // Pin Controlled by PA21 +#define AT91C_PA21_RXD1 (AT91C_PIO_PA21) // USART 1 Receive Data +#define AT91C_PA21_PCK1 (AT91C_PIO_PA21) // PMC Programmable Clock Output 1 +#define AT91C_PIO_PA22 (1 << 22) // Pin Controlled by PA22 +#define AT91C_PA22_TXD1 (AT91C_PIO_PA22) // USART 1 Transmit Data +#define AT91C_PA22_NPCS3 (AT91C_PIO_PA22) // SPI Peripheral Chip Select 3 +#define AT91C_PIO_PA23 (1 << 23) // Pin Controlled by PA23 +#define AT91C_PA23_SCK1 (AT91C_PIO_PA23) // USART 1 Serial Clock +#define AT91C_PA23_PWM0 (AT91C_PIO_PA23) // PWM Channel 0 +#define AT91C_PIO_PA24 (1 << 24) // Pin Controlled by PA24 +#define AT91C_PA24_RTS1 (AT91C_PIO_PA24) // USART 1 Ready To Send +#define AT91C_PA24_PWM1 (AT91C_PIO_PA24) // PWM Channel 1 +#define AT91C_PIO_PA25 (1 << 25) // Pin Controlled by PA25 +#define AT91C_PA25_CTS1 (AT91C_PIO_PA25) // USART 1 Clear To Send +#define AT91C_PA25_PWM2 (AT91C_PIO_PA25) // PWM Channel 2 +#define AT91C_PIO_PA26 (1 << 26) // Pin Controlled by PA26 +#define AT91C_PA26_DCD1 (AT91C_PIO_PA26) // USART 1 Data Carrier Detect +#define AT91C_PA26_TIOA2 (AT91C_PIO_PA26) // Timer Counter 2 Multipurpose Timer I/O Pin A +#define AT91C_PIO_PA27 (1 << 27) // Pin Controlled by PA27 +#define AT91C_PA27_DTR1 (AT91C_PIO_PA27) // USART 1 Data Terminal ready +#define AT91C_PA27_TIOB2 (AT91C_PIO_PA27) // Timer Counter 2 Multipurpose Timer I/O Pin B +#define AT91C_PIO_PA28 (1 << 28) // Pin Controlled by PA28 +#define AT91C_PA28_DSR1 (AT91C_PIO_PA28) // USART 1 Data Set ready +#define AT91C_PA28_TCLK1 (AT91C_PIO_PA28) // Timer Counter 1 external clock input +#define AT91C_PIO_PA29 (1 << 29) // Pin Controlled by PA29 +#define AT91C_PA29_RI1 (AT91C_PIO_PA29) // USART 1 Ring Indicator +#define AT91C_PA29_TCLK2 (AT91C_PIO_PA29) // Timer Counter 2 external clock input +#define AT91C_PIO_PA3 (1 << 3) // Pin Controlled by PA3 +#define AT91C_PA3_TWD (AT91C_PIO_PA3) // TWI Two-wire Serial Data +#define AT91C_PA3_NPCS3 (AT91C_PIO_PA3) // SPI Peripheral Chip Select 3 +#define AT91C_PIO_PA30 (1 << 30) // Pin Controlled by PA30 +#define AT91C_PA30_IRQ1 (AT91C_PIO_PA30) // External Interrupt 1 +#define AT91C_PA30_NPCS2 (AT91C_PIO_PA30) // SPI Peripheral Chip Select 2 +#define AT91C_PIO_PA31 (1 << 31) // Pin Controlled by PA31 +#define AT91C_PA31_NPCS1 (AT91C_PIO_PA31) // SPI Peripheral Chip Select 1 +#define AT91C_PA31_PCK2 (AT91C_PIO_PA31) // PMC Programmable Clock Output 2 +#define AT91C_PIO_PA4 (1 << 4) // Pin Controlled by PA4 +#define AT91C_PA4_TWCK (AT91C_PIO_PA4) // TWI Two-wire Serial Clock +#define AT91C_PA4_TCLK0 (AT91C_PIO_PA4) // Timer Counter 0 external clock input +#define AT91C_PIO_PA5 (1 << 5) // Pin Controlled by PA5 +#define AT91C_PA5_RXD0 (AT91C_PIO_PA5) // USART 0 Receive Data +#define AT91C_PA5_NPCS3 (AT91C_PIO_PA5) // SPI Peripheral Chip Select 3 +#define AT91C_PIO_PA6 (1 << 6) // Pin Controlled by PA6 +#define AT91C_PA6_TXD0 (AT91C_PIO_PA6) // USART 0 Transmit Data +#define AT91C_PA6_PCK0 (AT91C_PIO_PA6) // PMC Programmable Clock Output 0 +#define AT91C_PIO_PA7 (1 << 7) // Pin Controlled by PA7 +#define AT91C_PA7_RTS0 (AT91C_PIO_PA7) // USART 0 Ready To Send +#define AT91C_PA7_PWM3 (AT91C_PIO_PA7) // PWM Channel 3 +#define AT91C_PIO_PA8 (1 << 8) // Pin Controlled by PA8 +#define AT91C_PA8_CTS0 (AT91C_PIO_PA8) // USART 0 Clear To Send +#define AT91C_PA8_ADTRG (AT91C_PIO_PA8) // ADC External Trigger +#define AT91C_PIO_PA9 (1 << 9) // Pin Controlled by PA9 +#define AT91C_PA9_DRXD (AT91C_PIO_PA9) // DBGU Debug Receive Data +#define AT91C_PA9_NPCS1 (AT91C_PIO_PA9) // SPI Peripheral Chip Select 1 + +// ***************************************************************************** +// PERIPHERAL ID DEFINITIONS FOR AT91SAM7S64 +// ***************************************************************************** +#define AT91C_ID_FIQ ( 0) // Advanced Interrupt Controller (FIQ) +#define AT91C_ID_SYS ( 1) // System Peripheral +#define AT91C_ID_PIOA ( 2) // Parallel IO Controller +#define AT91C_ID_3_Reserved ( 3) // Reserved +#define AT91C_ID_ADC ( 4) // Analog-to-Digital Converter +#define AT91C_ID_SPI ( 5) // Serial Peripheral Interface +#define AT91C_ID_US0 ( 6) // USART 0 +#define AT91C_ID_US1 ( 7) // USART 1 +#define AT91C_ID_SSC ( 8) // Serial Synchronous Controller +#define AT91C_ID_TWI ( 9) // Two-Wire Interface +#define AT91C_ID_PWMC (10) // PWM Controller +#define AT91C_ID_UDP (11) // USB Device Port +#define AT91C_ID_TC0 (12) // Timer Counter 0 +#define AT91C_ID_TC1 (13) // Timer Counter 1 +#define AT91C_ID_TC2 (14) // Timer Counter 2 +#define AT91C_ID_15_Reserved (15) // Reserved +#define AT91C_ID_16_Reserved (16) // Reserved +#define AT91C_ID_17_Reserved (17) // Reserved +#define AT91C_ID_18_Reserved (18) // Reserved +#define AT91C_ID_19_Reserved (19) // Reserved +#define AT91C_ID_20_Reserved (20) // Reserved +#define AT91C_ID_21_Reserved (21) // Reserved +#define AT91C_ID_22_Reserved (22) // Reserved +#define AT91C_ID_23_Reserved (23) // Reserved +#define AT91C_ID_24_Reserved (24) // Reserved +#define AT91C_ID_25_Reserved (25) // Reserved +#define AT91C_ID_26_Reserved (26) // Reserved +#define AT91C_ID_27_Reserved (27) // Reserved +#define AT91C_ID_28_Reserved (28) // Reserved +#define AT91C_ID_29_Reserved (29) // Reserved +#define AT91C_ID_IRQ0 (30) // Advanced Interrupt Controller (IRQ0) +#define AT91C_ID_IRQ1 (31) // Advanced Interrupt Controller (IRQ1) + +// ***************************************************************************** +// BASE ADDRESS DEFINITIONS FOR AT91SAM7S64 +// ***************************************************************************** +#define AT91C_BASE_SYSC (0xFFFFF000) // (SYSC) Base Address +#define AT91C_BASE_AIC (0xFFFFF000) // (AIC) Base Address +#define AT91C_BASE_DBGU (0xFFFFF200) // (DBGU) Base Address +#define AT91C_BASE_PDC_DBGU (0xFFFFF300) // (PDC_DBGU) Base Address +#define AT91C_BASE_PIOA (0xFFFFF400) // (PIOA) Base Address +#define AT91C_BASE_CKGR (0xFFFFFC20) // (CKGR) Base Address +#define AT91C_BASE_PMC (0xFFFFFC00) // (PMC) Base Address +#define AT91C_BASE_RSTC (0xFFFFFD00) // (RSTC) Base Address +#define AT91C_BASE_RTTC (0xFFFFFD20) // (RTTC) Base Address +#define AT91C_BASE_PITC (0xFFFFFD30) // (PITC) Base Address +#define AT91C_BASE_WDTC (0xFFFFFD40) // (WDTC) Base Address +#define AT91C_BASE_MC (0xFFFFFF00) // (MC) Base Address +#define AT91C_BASE_PDC_SPI (0xFFFE0100) // (PDC_SPI) Base Address +#define AT91C_BASE_SPI (0xFFFE0000) // (SPI) Base Address +#define AT91C_BASE_PDC_ADC (0xFFFD8100) // (PDC_ADC) Base Address +#define AT91C_BASE_ADC (0xFFFD8000) // (ADC) Base Address +#define AT91C_BASE_PDC_SSC (0xFFFD4100) // (PDC_SSC) Base Address +#define AT91C_BASE_SSC (0xFFFD4000) // (SSC) Base Address +#define AT91C_BASE_PDC_US1 (0xFFFC4100) // (PDC_US1) Base Address +#define AT91C_BASE_US1 (0xFFFC4000) // (US1) Base Address +#define AT91C_BASE_PDC_US0 (0xFFFC0100) // (PDC_US0) Base Address +#define AT91C_BASE_US0 (0xFFFC0000) // (US0) Base Address +#define AT91C_BASE_TWI (0xFFFB8000) // (TWI) Base Address +#define AT91C_BASE_TC2 (0xFFFA0080) // (TC2) Base Address +#define AT91C_BASE_TC1 (0xFFFA0040) // (TC1) Base Address +#define AT91C_BASE_TC0 (0xFFFA0000) // (TC0) Base Address +#define AT91C_BASE_TCB (0xFFFA0000) // (TCB) Base Address +#define AT91C_BASE_PWMC_CH3 (0xFFFCC260) // (PWMC_CH3) Base Address +#define AT91C_BASE_PWMC_CH2 (0xFFFCC240) // (PWMC_CH2) Base Address +#define AT91C_BASE_PWMC_CH1 (0xFFFCC220) // (PWMC_CH1) Base Address +#define AT91C_BASE_PWMC_CH0 (0xFFFCC200) // (PWMC_CH0) Base Address +#define AT91C_BASE_PWMC (0xFFFCC000) // (PWMC) Base Address +#define AT91C_BASE_UDP (0xFFFB0000) // (UDP) Base Address + +// ***************************************************************************** +// MEMORY MAPPING DEFINITIONS FOR AT91SAM7S64 +// ***************************************************************************** +#define AT91C_ISRAM (0x00200000) // Internal SRAM base address +#define AT91C_ISRAM_SIZE (0x00004000) // Internal SRAM size in byte (16 Kbyte) +#define AT91C_IFLASH (0x00100000) // Internal ROM base address +#define AT91C_IFLASH_SIZE (0x00010000) // Internal ROM size in byte (64 Kbyte) + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM7S64/AT91SAM7X128.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM7S64/AT91SAM7X128.h new file mode 100644 index 0000000..ae4f35f --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM7S64/AT91SAM7X128.h @@ -0,0 +1,2715 @@ +// ---------------------------------------------------------------------------- +// ATMEL Microcontroller Software Support - ROUSSET - +// ---------------------------------------------------------------------------- +// DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR +// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE +// DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT, +// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- +// File Name : AT91SAM7X128.h +// Object : AT91SAM7X128 definitions +// Generated : AT91 SW Application Group 05/20/2005 (16:22:23) +// +// CVS Reference : /AT91SAM7X128.pl/1.14/Tue May 10 12:12:05 2005// +// CVS Reference : /SYS_SAM7X.pl/1.3/Tue Feb 1 17:01:43 2005// +// CVS Reference : /MC_SAM7X.pl/1.2/Fri May 20 14:13:04 2005// +// CVS Reference : /PMC_SAM7X.pl/1.4/Tue Feb 8 13:58:10 2005// +// CVS Reference : /RSTC_SAM7X.pl/1.1/Tue Feb 1 16:16:26 2005// +// CVS Reference : /UDP_SAM7X.pl/1.1/Tue May 10 11:35:35 2005// +// CVS Reference : /PWM_SAM7X.pl/1.1/Tue May 10 11:53:07 2005// +// CVS Reference : /AIC_6075B.pl/1.3/Fri May 20 14:01:30 2005// +// CVS Reference : /PIO_6057A.pl/1.2/Thu Feb 3 10:18:28 2005// +// CVS Reference : /RTTC_6081A.pl/1.2/Tue Nov 9 14:43:58 2004// +// CVS Reference : /PITC_6079A.pl/1.2/Tue Nov 9 14:43:56 2004// +// CVS Reference : /WDTC_6080A.pl/1.3/Tue Nov 9 14:44:00 2004// +// CVS Reference : /VREG_6085B.pl/1.1/Tue Feb 1 16:05:48 2005// +// CVS Reference : /PDC_6074C.pl/1.2/Thu Feb 3 08:48:54 2005// +// CVS Reference : /DBGU_6059D.pl/1.1/Mon Jan 31 13:15:32 2005// +// CVS Reference : /SPI_6088D.pl/1.3/Fri May 20 14:08:59 2005// +// CVS Reference : /US_6089C.pl/1.1/Mon Jul 12 18:23:26 2004// +// CVS Reference : /SSC_6078A.pl/1.1/Tue Jul 13 07:45:40 2004// +// CVS Reference : /TWI_6061A.pl/1.1/Tue Jul 13 07:38:06 2004// +// CVS Reference : /TC_6082A.pl/1.7/Fri Mar 11 12:52:17 2005// +// CVS Reference : /CAN_6019B.pl/1.1/Tue Mar 8 12:42:22 2005// +// CVS Reference : /EMACB_6119A.pl/1.5/Thu Feb 3 15:52:04 2005// +// CVS Reference : /ADC_6051C.pl/1.1/Fri Oct 17 09:12:38 2003// +// CVS Reference : /AES_6149A.pl/1.10/Mon Feb 7 09:44:25 2005// +// CVS Reference : /DES3_6150A.pl/1.1/Mon Jan 17 08:34:31 2005// +// ---------------------------------------------------------------------------- + +#ifndef AT91SAM7X128_H +#define AT91SAM7X128_H + +typedef volatile unsigned int AT91_REG;// Hardware register definition + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR System Peripherals +// ***************************************************************************** +typedef struct _AT91S_SYS { + AT91_REG AIC_SMR[32]; // Source Mode Register + AT91_REG AIC_SVR[32]; // Source Vector Register + AT91_REG AIC_IVR; // IRQ Vector Register + AT91_REG AIC_FVR; // FIQ Vector Register + AT91_REG AIC_ISR; // Interrupt Status Register + AT91_REG AIC_IPR; // Interrupt Pending Register + AT91_REG AIC_IMR; // Interrupt Mask Register + AT91_REG AIC_CISR; // Core Interrupt Status Register + AT91_REG Reserved0[2]; // + AT91_REG AIC_IECR; // Interrupt Enable Command Register + AT91_REG AIC_IDCR; // Interrupt Disable Command Register + AT91_REG AIC_ICCR; // Interrupt Clear Command Register + AT91_REG AIC_ISCR; // Interrupt Set Command Register + AT91_REG AIC_EOICR; // End of Interrupt Command Register + AT91_REG AIC_SPU; // Spurious Vector Register + AT91_REG AIC_DCR; // Debug Control Register (Protect) + AT91_REG Reserved1[1]; // + AT91_REG AIC_FFER; // Fast Forcing Enable Register + AT91_REG AIC_FFDR; // Fast Forcing Disable Register + AT91_REG AIC_FFSR; // Fast Forcing Status Register + AT91_REG Reserved2[45]; // + AT91_REG DBGU_CR; // Control Register + AT91_REG DBGU_MR; // Mode Register + AT91_REG DBGU_IER; // Interrupt Enable Register + AT91_REG DBGU_IDR; // Interrupt Disable Register + AT91_REG DBGU_IMR; // Interrupt Mask Register + AT91_REG DBGU_CSR; // Channel Status Register + AT91_REG DBGU_RHR; // Receiver Holding Register + AT91_REG DBGU_THR; // Transmitter Holding Register + AT91_REG DBGU_BRGR; // Baud Rate Generator Register + AT91_REG Reserved3[7]; // + AT91_REG DBGU_CIDR; // Chip ID Register + AT91_REG DBGU_EXID; // Chip ID Extension Register + AT91_REG DBGU_FNTR; // Force NTRST Register + AT91_REG Reserved4[45]; // + AT91_REG DBGU_RPR; // Receive Pointer Register + AT91_REG DBGU_RCR; // Receive Counter Register + AT91_REG DBGU_TPR; // Transmit Pointer Register + AT91_REG DBGU_TCR; // Transmit Counter Register + AT91_REG DBGU_RNPR; // Receive Next Pointer Register + AT91_REG DBGU_RNCR; // Receive Next Counter Register + AT91_REG DBGU_TNPR; // Transmit Next Pointer Register + AT91_REG DBGU_TNCR; // Transmit Next Counter Register + AT91_REG DBGU_PTCR; // PDC Transfer Control Register + AT91_REG DBGU_PTSR; // PDC Transfer Status Register + AT91_REG Reserved5[54]; // + AT91_REG PIOA_PER; // PIO Enable Register + AT91_REG PIOA_PDR; // PIO Disable Register + AT91_REG PIOA_PSR; // PIO Status Register + AT91_REG Reserved6[1]; // + AT91_REG PIOA_OER; // Output Enable Register + AT91_REG PIOA_ODR; // Output Disable Registerr + AT91_REG PIOA_OSR; // Output Status Register + AT91_REG Reserved7[1]; // + AT91_REG PIOA_IFER; // Input Filter Enable Register + AT91_REG PIOA_IFDR; // Input Filter Disable Register + AT91_REG PIOA_IFSR; // Input Filter Status Register + AT91_REG Reserved8[1]; // + AT91_REG PIOA_SODR; // Set Output Data Register + AT91_REG PIOA_CODR; // Clear Output Data Register + AT91_REG PIOA_ODSR; // Output Data Status Register + AT91_REG PIOA_PDSR; // Pin Data Status Register + AT91_REG PIOA_IER; // Interrupt Enable Register + AT91_REG PIOA_IDR; // Interrupt Disable Register + AT91_REG PIOA_IMR; // Interrupt Mask Register + AT91_REG PIOA_ISR; // Interrupt Status Register + AT91_REG PIOA_MDER; // Multi-driver Enable Register + AT91_REG PIOA_MDDR; // Multi-driver Disable Register + AT91_REG PIOA_MDSR; // Multi-driver Status Register + AT91_REG Reserved9[1]; // + AT91_REG PIOA_PPUDR; // Pull-up Disable Register + AT91_REG PIOA_PPUER; // Pull-up Enable Register + AT91_REG PIOA_PPUSR; // Pull-up Status Register + AT91_REG Reserved10[1]; // + AT91_REG PIOA_ASR; // Select A Register + AT91_REG PIOA_BSR; // Select B Register + AT91_REG PIOA_ABSR; // AB Select Status Register + AT91_REG Reserved11[9]; // + AT91_REG PIOA_OWER; // Output Write Enable Register + AT91_REG PIOA_OWDR; // Output Write Disable Register + AT91_REG PIOA_OWSR; // Output Write Status Register + AT91_REG Reserved12[85]; // + AT91_REG PIOB_PER; // PIO Enable Register + AT91_REG PIOB_PDR; // PIO Disable Register + AT91_REG PIOB_PSR; // PIO Status Register + AT91_REG Reserved13[1]; // + AT91_REG PIOB_OER; // Output Enable Register + AT91_REG PIOB_ODR; // Output Disable Registerr + AT91_REG PIOB_OSR; // Output Status Register + AT91_REG Reserved14[1]; // + AT91_REG PIOB_IFER; // Input Filter Enable Register + AT91_REG PIOB_IFDR; // Input Filter Disable Register + AT91_REG PIOB_IFSR; // Input Filter Status Register + AT91_REG Reserved15[1]; // + AT91_REG PIOB_SODR; // Set Output Data Register + AT91_REG PIOB_CODR; // Clear Output Data Register + AT91_REG PIOB_ODSR; // Output Data Status Register + AT91_REG PIOB_PDSR; // Pin Data Status Register + AT91_REG PIOB_IER; // Interrupt Enable Register + AT91_REG PIOB_IDR; // Interrupt Disable Register + AT91_REG PIOB_IMR; // Interrupt Mask Register + AT91_REG PIOB_ISR; // Interrupt Status Register + AT91_REG PIOB_MDER; // Multi-driver Enable Register + AT91_REG PIOB_MDDR; // Multi-driver Disable Register + AT91_REG PIOB_MDSR; // Multi-driver Status Register + AT91_REG Reserved16[1]; // + AT91_REG PIOB_PPUDR; // Pull-up Disable Register + AT91_REG PIOB_PPUER; // Pull-up Enable Register + AT91_REG PIOB_PPUSR; // Pull-up Status Register + AT91_REG Reserved17[1]; // + AT91_REG PIOB_ASR; // Select A Register + AT91_REG PIOB_BSR; // Select B Register + AT91_REG PIOB_ABSR; // AB Select Status Register + AT91_REG Reserved18[9]; // + AT91_REG PIOB_OWER; // Output Write Enable Register + AT91_REG PIOB_OWDR; // Output Write Disable Register + AT91_REG PIOB_OWSR; // Output Write Status Register + AT91_REG Reserved19[341]; // + AT91_REG PMC_SCER; // System Clock Enable Register + AT91_REG PMC_SCDR; // System Clock Disable Register + AT91_REG PMC_SCSR; // System Clock Status Register + AT91_REG Reserved20[1]; // + AT91_REG PMC_PCER; // Peripheral Clock Enable Register + AT91_REG PMC_PCDR; // Peripheral Clock Disable Register + AT91_REG PMC_PCSR; // Peripheral Clock Status Register + AT91_REG Reserved21[1]; // + AT91_REG PMC_MOR; // Main Oscillator Register + AT91_REG PMC_MCFR; // Main Clock Frequency Register + AT91_REG Reserved22[1]; // + AT91_REG PMC_PLLR; // PLL Register + AT91_REG PMC_MCKR; // Master Clock Register + AT91_REG Reserved23[3]; // + AT91_REG PMC_PCKR[4]; // Programmable Clock Register + AT91_REG Reserved24[4]; // + AT91_REG PMC_IER; // Interrupt Enable Register + AT91_REG PMC_IDR; // Interrupt Disable Register + AT91_REG PMC_SR; // Status Register + AT91_REG PMC_IMR; // Interrupt Mask Register + AT91_REG Reserved25[36]; // + AT91_REG RSTC_RCR; // Reset Control Register + AT91_REG RSTC_RSR; // Reset Status Register + AT91_REG RSTC_RMR; // Reset Mode Register + AT91_REG Reserved26[5]; // + AT91_REG RTTC_RTMR; // Real-time Mode Register + AT91_REG RTTC_RTAR; // Real-time Alarm Register + AT91_REG RTTC_RTVR; // Real-time Value Register + AT91_REG RTTC_RTSR; // Real-time Status Register + AT91_REG PITC_PIMR; // Period Interval Mode Register + AT91_REG PITC_PISR; // Period Interval Status Register + AT91_REG PITC_PIVR; // Period Interval Value Register + AT91_REG PITC_PIIR; // Period Interval Image Register + AT91_REG WDTC_WDCR; // Watchdog Control Register + AT91_REG WDTC_WDMR; // Watchdog Mode Register + AT91_REG WDTC_WDSR; // Watchdog Status Register + AT91_REG Reserved27[5]; // + AT91_REG VREG_MR; // Voltage Regulator Mode Register +} AT91S_SYS, *AT91PS_SYS; + + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Advanced Interrupt Controller +// ***************************************************************************** +typedef struct _AT91S_AIC { + AT91_REG AIC_SMR[32]; // Source Mode Register + AT91_REG AIC_SVR[32]; // Source Vector Register + AT91_REG AIC_IVR; // IRQ Vector Register + AT91_REG AIC_FVR; // FIQ Vector Register + AT91_REG AIC_ISR; // Interrupt Status Register + AT91_REG AIC_IPR; // Interrupt Pending Register + AT91_REG AIC_IMR; // Interrupt Mask Register + AT91_REG AIC_CISR; // Core Interrupt Status Register + AT91_REG Reserved0[2]; // + AT91_REG AIC_IECR; // Interrupt Enable Command Register + AT91_REG AIC_IDCR; // Interrupt Disable Command Register + AT91_REG AIC_ICCR; // Interrupt Clear Command Register + AT91_REG AIC_ISCR; // Interrupt Set Command Register + AT91_REG AIC_EOICR; // End of Interrupt Command Register + AT91_REG AIC_SPU; // Spurious Vector Register + AT91_REG AIC_DCR; // Debug Control Register (Protect) + AT91_REG Reserved1[1]; // + AT91_REG AIC_FFER; // Fast Forcing Enable Register + AT91_REG AIC_FFDR; // Fast Forcing Disable Register + AT91_REG AIC_FFSR; // Fast Forcing Status Register +} AT91S_AIC, *AT91PS_AIC; + +// -------- AIC_SMR : (AIC Offset: 0x0) Control Register -------- +#define AT91C_AIC_PRIOR ((unsigned int) 0x7 << 0) // (AIC) Priority Level +#define AT91C_AIC_PRIOR_LOWEST ((unsigned int) 0x0) // (AIC) Lowest priority level +#define AT91C_AIC_PRIOR_HIGHEST ((unsigned int) 0x7) // (AIC) Highest priority level +#define AT91C_AIC_SRCTYPE ((unsigned int) 0x3 << 5) // (AIC) Interrupt Source Type +#define AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL ((unsigned int) 0x0 << 5) // (AIC) Internal Sources Code Label High-level Sensitive +#define AT91C_AIC_SRCTYPE_EXT_LOW_LEVEL ((unsigned int) 0x0 << 5) // (AIC) External Sources Code Label Low-level Sensitive +#define AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE ((unsigned int) 0x1 << 5) // (AIC) Internal Sources Code Label Positive Edge triggered +#define AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE ((unsigned int) 0x1 << 5) // (AIC) External Sources Code Label Negative Edge triggered +#define AT91C_AIC_SRCTYPE_HIGH_LEVEL ((unsigned int) 0x2 << 5) // (AIC) Internal Or External Sources Code Label High-level Sensitive +#define AT91C_AIC_SRCTYPE_POSITIVE_EDGE ((unsigned int) 0x3 << 5) // (AIC) Internal Or External Sources Code Label Positive Edge triggered +// -------- AIC_CISR : (AIC Offset: 0x114) AIC Core Interrupt Status Register -------- +#define AT91C_AIC_NFIQ ((unsigned int) 0x1 << 0) // (AIC) NFIQ Status +#define AT91C_AIC_NIRQ ((unsigned int) 0x1 << 1) // (AIC) NIRQ Status +// -------- AIC_DCR : (AIC Offset: 0x138) AIC Debug Control Register (Protect) -------- +#define AT91C_AIC_DCR_PROT ((unsigned int) 0x1 << 0) // (AIC) Protection Mode +#define AT91C_AIC_DCR_GMSK ((unsigned int) 0x1 << 1) // (AIC) General Mask + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Peripheral DMA Controller +// ***************************************************************************** +typedef struct _AT91S_PDC { + AT91_REG PDC_RPR; // Receive Pointer Register + AT91_REG PDC_RCR; // Receive Counter Register + AT91_REG PDC_TPR; // Transmit Pointer Register + AT91_REG PDC_TCR; // Transmit Counter Register + AT91_REG PDC_RNPR; // Receive Next Pointer Register + AT91_REG PDC_RNCR; // Receive Next Counter Register + AT91_REG PDC_TNPR; // Transmit Next Pointer Register + AT91_REG PDC_TNCR; // Transmit Next Counter Register + AT91_REG PDC_PTCR; // PDC Transfer Control Register + AT91_REG PDC_PTSR; // PDC Transfer Status Register +} AT91S_PDC, *AT91PS_PDC; + +// -------- PDC_PTCR : (PDC Offset: 0x20) PDC Transfer Control Register -------- +#define AT91C_PDC_RXTEN ((unsigned int) 0x1 << 0) // (PDC) Receiver Transfer Enable +#define AT91C_PDC_RXTDIS ((unsigned int) 0x1 << 1) // (PDC) Receiver Transfer Disable +#define AT91C_PDC_TXTEN ((unsigned int) 0x1 << 8) // (PDC) Transmitter Transfer Enable +#define AT91C_PDC_TXTDIS ((unsigned int) 0x1 << 9) // (PDC) Transmitter Transfer Disable +// -------- PDC_PTSR : (PDC Offset: 0x24) PDC Transfer Status Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Debug Unit +// ***************************************************************************** +typedef struct _AT91S_DBGU { + AT91_REG DBGU_CR; // Control Register + AT91_REG DBGU_MR; // Mode Register + AT91_REG DBGU_IER; // Interrupt Enable Register + AT91_REG DBGU_IDR; // Interrupt Disable Register + AT91_REG DBGU_IMR; // Interrupt Mask Register + AT91_REG DBGU_CSR; // Channel Status Register + AT91_REG DBGU_RHR; // Receiver Holding Register + AT91_REG DBGU_THR; // Transmitter Holding Register + AT91_REG DBGU_BRGR; // Baud Rate Generator Register + AT91_REG Reserved0[7]; // + AT91_REG DBGU_CIDR; // Chip ID Register + AT91_REG DBGU_EXID; // Chip ID Extension Register + AT91_REG DBGU_FNTR; // Force NTRST Register + AT91_REG Reserved1[45]; // + AT91_REG DBGU_RPR; // Receive Pointer Register + AT91_REG DBGU_RCR; // Receive Counter Register + AT91_REG DBGU_TPR; // Transmit Pointer Register + AT91_REG DBGU_TCR; // Transmit Counter Register + AT91_REG DBGU_RNPR; // Receive Next Pointer Register + AT91_REG DBGU_RNCR; // Receive Next Counter Register + AT91_REG DBGU_TNPR; // Transmit Next Pointer Register + AT91_REG DBGU_TNCR; // Transmit Next Counter Register + AT91_REG DBGU_PTCR; // PDC Transfer Control Register + AT91_REG DBGU_PTSR; // PDC Transfer Status Register +} AT91S_DBGU, *AT91PS_DBGU; + +// -------- DBGU_CR : (DBGU Offset: 0x0) Debug Unit Control Register -------- +#define AT91C_US_RSTRX ((unsigned int) 0x1 << 2) // (DBGU) Reset Receiver +#define AT91C_US_RSTTX ((unsigned int) 0x1 << 3) // (DBGU) Reset Transmitter +#define AT91C_US_RXEN ((unsigned int) 0x1 << 4) // (DBGU) Receiver Enable +#define AT91C_US_RXDIS ((unsigned int) 0x1 << 5) // (DBGU) Receiver Disable +#define AT91C_US_TXEN ((unsigned int) 0x1 << 6) // (DBGU) Transmitter Enable +#define AT91C_US_TXDIS ((unsigned int) 0x1 << 7) // (DBGU) Transmitter Disable +#define AT91C_US_RSTSTA ((unsigned int) 0x1 << 8) // (DBGU) Reset Status Bits +// -------- DBGU_MR : (DBGU Offset: 0x4) Debug Unit Mode Register -------- +#define AT91C_US_PAR ((unsigned int) 0x7 << 9) // (DBGU) Parity type +#define AT91C_US_PAR_EVEN ((unsigned int) 0x0 << 9) // (DBGU) Even Parity +#define AT91C_US_PAR_ODD ((unsigned int) 0x1 << 9) // (DBGU) Odd Parity +#define AT91C_US_PAR_SPACE ((unsigned int) 0x2 << 9) // (DBGU) Parity forced to 0 (Space) +#define AT91C_US_PAR_MARK ((unsigned int) 0x3 << 9) // (DBGU) Parity forced to 1 (Mark) +#define AT91C_US_PAR_NONE ((unsigned int) 0x4 << 9) // (DBGU) No Parity +#define AT91C_US_PAR_MULTI_DROP ((unsigned int) 0x6 << 9) // (DBGU) Multi-drop mode +#define AT91C_US_CHMODE ((unsigned int) 0x3 << 14) // (DBGU) Channel Mode +#define AT91C_US_CHMODE_NORMAL ((unsigned int) 0x0 << 14) // (DBGU) Normal Mode: The USART channel operates as an RX/TX USART. +#define AT91C_US_CHMODE_AUTO ((unsigned int) 0x1 << 14) // (DBGU) Automatic Echo: Receiver Data Input is connected to the TXD pin. +#define AT91C_US_CHMODE_LOCAL ((unsigned int) 0x2 << 14) // (DBGU) Local Loopback: Transmitter Output Signal is connected to Receiver Input Signal. +#define AT91C_US_CHMODE_REMOTE ((unsigned int) 0x3 << 14) // (DBGU) Remote Loopback: RXD pin is internally connected to TXD pin. +// -------- DBGU_IER : (DBGU Offset: 0x8) Debug Unit Interrupt Enable Register -------- +#define AT91C_US_RXRDY ((unsigned int) 0x1 << 0) // (DBGU) RXRDY Interrupt +#define AT91C_US_TXRDY ((unsigned int) 0x1 << 1) // (DBGU) TXRDY Interrupt +#define AT91C_US_ENDRX ((unsigned int) 0x1 << 3) // (DBGU) End of Receive Transfer Interrupt +#define AT91C_US_ENDTX ((unsigned int) 0x1 << 4) // (DBGU) End of Transmit Interrupt +#define AT91C_US_OVRE ((unsigned int) 0x1 << 5) // (DBGU) Overrun Interrupt +#define AT91C_US_FRAME ((unsigned int) 0x1 << 6) // (DBGU) Framing Error Interrupt +#define AT91C_US_PARE ((unsigned int) 0x1 << 7) // (DBGU) Parity Error Interrupt +#define AT91C_US_TXEMPTY ((unsigned int) 0x1 << 9) // (DBGU) TXEMPTY Interrupt +#define AT91C_US_TXBUFE ((unsigned int) 0x1 << 11) // (DBGU) TXBUFE Interrupt +#define AT91C_US_RXBUFF ((unsigned int) 0x1 << 12) // (DBGU) RXBUFF Interrupt +#define AT91C_US_COMM_TX ((unsigned int) 0x1 << 30) // (DBGU) COMM_TX Interrupt +#define AT91C_US_COMM_RX ((unsigned int) 0x1 << 31) // (DBGU) COMM_RX Interrupt +// -------- DBGU_IDR : (DBGU Offset: 0xc) Debug Unit Interrupt Disable Register -------- +// -------- DBGU_IMR : (DBGU Offset: 0x10) Debug Unit Interrupt Mask Register -------- +// -------- DBGU_CSR : (DBGU Offset: 0x14) Debug Unit Channel Status Register -------- +// -------- DBGU_FNTR : (DBGU Offset: 0x48) Debug Unit FORCE_NTRST Register -------- +#define AT91C_US_FORCE_NTRST ((unsigned int) 0x1 << 0) // (DBGU) Force NTRST in JTAG + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Parallel Input Output Controler +// ***************************************************************************** +typedef struct _AT91S_PIO { + AT91_REG PIO_PER; // PIO Enable Register + AT91_REG PIO_PDR; // PIO Disable Register + AT91_REG PIO_PSR; // PIO Status Register + AT91_REG Reserved0[1]; // + AT91_REG PIO_OER; // Output Enable Register + AT91_REG PIO_ODR; // Output Disable Registerr + AT91_REG PIO_OSR; // Output Status Register + AT91_REG Reserved1[1]; // + AT91_REG PIO_IFER; // Input Filter Enable Register + AT91_REG PIO_IFDR; // Input Filter Disable Register + AT91_REG PIO_IFSR; // Input Filter Status Register + AT91_REG Reserved2[1]; // + AT91_REG PIO_SODR; // Set Output Data Register + AT91_REG PIO_CODR; // Clear Output Data Register + AT91_REG PIO_ODSR; // Output Data Status Register + AT91_REG PIO_PDSR; // Pin Data Status Register + AT91_REG PIO_IER; // Interrupt Enable Register + AT91_REG PIO_IDR; // Interrupt Disable Register + AT91_REG PIO_IMR; // Interrupt Mask Register + AT91_REG PIO_ISR; // Interrupt Status Register + AT91_REG PIO_MDER; // Multi-driver Enable Register + AT91_REG PIO_MDDR; // Multi-driver Disable Register + AT91_REG PIO_MDSR; // Multi-driver Status Register + AT91_REG Reserved3[1]; // + AT91_REG PIO_PPUDR; // Pull-up Disable Register + AT91_REG PIO_PPUER; // Pull-up Enable Register + AT91_REG PIO_PPUSR; // Pull-up Status Register + AT91_REG Reserved4[1]; // + AT91_REG PIO_ASR; // Select A Register + AT91_REG PIO_BSR; // Select B Register + AT91_REG PIO_ABSR; // AB Select Status Register + AT91_REG Reserved5[9]; // + AT91_REG PIO_OWER; // Output Write Enable Register + AT91_REG PIO_OWDR; // Output Write Disable Register + AT91_REG PIO_OWSR; // Output Write Status Register +} AT91S_PIO, *AT91PS_PIO; + + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Clock Generator Controler +// ***************************************************************************** +typedef struct _AT91S_CKGR { + AT91_REG CKGR_MOR; // Main Oscillator Register + AT91_REG CKGR_MCFR; // Main Clock Frequency Register + AT91_REG Reserved0[1]; // + AT91_REG CKGR_PLLR; // PLL Register +} AT91S_CKGR, *AT91PS_CKGR; + +// -------- CKGR_MOR : (CKGR Offset: 0x0) Main Oscillator Register -------- +#define AT91C_CKGR_MOSCEN ((unsigned int) 0x1 << 0) // (CKGR) Main Oscillator Enable +#define AT91C_CKGR_OSCBYPASS ((unsigned int) 0x1 << 1) // (CKGR) Main Oscillator Bypass +#define AT91C_CKGR_OSCOUNT ((unsigned int) 0xFF << 8) // (CKGR) Main Oscillator Start-up Time +// -------- CKGR_MCFR : (CKGR Offset: 0x4) Main Clock Frequency Register -------- +#define AT91C_CKGR_MAINF ((unsigned int) 0xFFFF << 0) // (CKGR) Main Clock Frequency +#define AT91C_CKGR_MAINRDY ((unsigned int) 0x1 << 16) // (CKGR) Main Clock Ready +// -------- CKGR_PLLR : (CKGR Offset: 0xc) PLL B Register -------- +#define AT91C_CKGR_DIV ((unsigned int) 0xFF << 0) // (CKGR) Divider Selected +#define AT91C_CKGR_DIV_0 ((unsigned int) 0x0) // (CKGR) Divider output is 0 +#define AT91C_CKGR_DIV_BYPASS ((unsigned int) 0x1) // (CKGR) Divider is bypassed +#define AT91C_CKGR_PLLCOUNT ((unsigned int) 0x3F << 8) // (CKGR) PLL Counter +#define AT91C_CKGR_OUT ((unsigned int) 0x3 << 14) // (CKGR) PLL Output Frequency Range +#define AT91C_CKGR_OUT_0 ((unsigned int) 0x0 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_OUT_1 ((unsigned int) 0x1 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_OUT_2 ((unsigned int) 0x2 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_OUT_3 ((unsigned int) 0x3 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_MUL ((unsigned int) 0x7FF << 16) // (CKGR) PLL Multiplier +#define AT91C_CKGR_USBDIV ((unsigned int) 0x3 << 28) // (CKGR) Divider for USB Clocks +#define AT91C_CKGR_USBDIV_0 ((unsigned int) 0x0 << 28) // (CKGR) Divider output is PLL clock output +#define AT91C_CKGR_USBDIV_1 ((unsigned int) 0x1 << 28) // (CKGR) Divider output is PLL clock output divided by 2 +#define AT91C_CKGR_USBDIV_2 ((unsigned int) 0x2 << 28) // (CKGR) Divider output is PLL clock output divided by 4 + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Power Management Controler +// ***************************************************************************** +typedef struct _AT91S_PMC { + AT91_REG PMC_SCER; // System Clock Enable Register + AT91_REG PMC_SCDR; // System Clock Disable Register + AT91_REG PMC_SCSR; // System Clock Status Register + AT91_REG Reserved0[1]; // + AT91_REG PMC_PCER; // Peripheral Clock Enable Register + AT91_REG PMC_PCDR; // Peripheral Clock Disable Register + AT91_REG PMC_PCSR; // Peripheral Clock Status Register + AT91_REG Reserved1[1]; // + AT91_REG PMC_MOR; // Main Oscillator Register + AT91_REG PMC_MCFR; // Main Clock Frequency Register + AT91_REG Reserved2[1]; // + AT91_REG PMC_PLLR; // PLL Register + AT91_REG PMC_MCKR; // Master Clock Register + AT91_REG Reserved3[3]; // + AT91_REG PMC_PCKR[4]; // Programmable Clock Register + AT91_REG Reserved4[4]; // + AT91_REG PMC_IER; // Interrupt Enable Register + AT91_REG PMC_IDR; // Interrupt Disable Register + AT91_REG PMC_SR; // Status Register + AT91_REG PMC_IMR; // Interrupt Mask Register +} AT91S_PMC, *AT91PS_PMC; + +// -------- PMC_SCER : (PMC Offset: 0x0) System Clock Enable Register -------- +#define AT91C_PMC_PCK ((unsigned int) 0x1 << 0) // (PMC) Processor Clock +#define AT91C_PMC_UDP ((unsigned int) 0x1 << 7) // (PMC) USB Device Port Clock +#define AT91C_PMC_PCK0 ((unsigned int) 0x1 << 8) // (PMC) Programmable Clock Output +#define AT91C_PMC_PCK1 ((unsigned int) 0x1 << 9) // (PMC) Programmable Clock Output +#define AT91C_PMC_PCK2 ((unsigned int) 0x1 << 10) // (PMC) Programmable Clock Output +#define AT91C_PMC_PCK3 ((unsigned int) 0x1 << 11) // (PMC) Programmable Clock Output +// -------- PMC_SCDR : (PMC Offset: 0x4) System Clock Disable Register -------- +// -------- PMC_SCSR : (PMC Offset: 0x8) System Clock Status Register -------- +// -------- CKGR_MOR : (PMC Offset: 0x20) Main Oscillator Register -------- +// -------- CKGR_MCFR : (PMC Offset: 0x24) Main Clock Frequency Register -------- +// -------- CKGR_PLLR : (PMC Offset: 0x2c) PLL B Register -------- +// -------- PMC_MCKR : (PMC Offset: 0x30) Master Clock Register -------- +#define AT91C_PMC_CSS ((unsigned int) 0x3 << 0) // (PMC) Programmable Clock Selection +#define AT91C_PMC_CSS_SLOW_CLK ((unsigned int) 0x0) // (PMC) Slow Clock is selected +#define AT91C_PMC_CSS_MAIN_CLK ((unsigned int) 0x1) // (PMC) Main Clock is selected +#define AT91C_PMC_CSS_PLL_CLK ((unsigned int) 0x3) // (PMC) Clock from PLL is selected +#define AT91C_PMC_PRES ((unsigned int) 0x7 << 2) // (PMC) Programmable Clock Prescaler +#define AT91C_PMC_PRES_CLK ((unsigned int) 0x0 << 2) // (PMC) Selected clock +#define AT91C_PMC_PRES_CLK_2 ((unsigned int) 0x1 << 2) // (PMC) Selected clock divided by 2 +#define AT91C_PMC_PRES_CLK_4 ((unsigned int) 0x2 << 2) // (PMC) Selected clock divided by 4 +#define AT91C_PMC_PRES_CLK_8 ((unsigned int) 0x3 << 2) // (PMC) Selected clock divided by 8 +#define AT91C_PMC_PRES_CLK_16 ((unsigned int) 0x4 << 2) // (PMC) Selected clock divided by 16 +#define AT91C_PMC_PRES_CLK_32 ((unsigned int) 0x5 << 2) // (PMC) Selected clock divided by 32 +#define AT91C_PMC_PRES_CLK_64 ((unsigned int) 0x6 << 2) // (PMC) Selected clock divided by 64 +// -------- PMC_PCKR : (PMC Offset: 0x40) Programmable Clock Register -------- +// -------- PMC_IER : (PMC Offset: 0x60) PMC Interrupt Enable Register -------- +#define AT91C_PMC_MOSCS ((unsigned int) 0x1 << 0) // (PMC) MOSC Status/Enable/Disable/Mask +#define AT91C_PMC_LOCK ((unsigned int) 0x1 << 2) // (PMC) PLL Status/Enable/Disable/Mask +#define AT91C_PMC_MCKRDY ((unsigned int) 0x1 << 3) // (PMC) MCK_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK0RDY ((unsigned int) 0x1 << 8) // (PMC) PCK0_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK1RDY ((unsigned int) 0x1 << 9) // (PMC) PCK1_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK2RDY ((unsigned int) 0x1 << 10) // (PMC) PCK2_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK3RDY ((unsigned int) 0x1 << 11) // (PMC) PCK3_RDY Status/Enable/Disable/Mask +// -------- PMC_IDR : (PMC Offset: 0x64) PMC Interrupt Disable Register -------- +// -------- PMC_SR : (PMC Offset: 0x68) PMC Status Register -------- +// -------- PMC_IMR : (PMC Offset: 0x6c) PMC Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Reset Controller Interface +// ***************************************************************************** +typedef struct _AT91S_RSTC { + AT91_REG RSTC_RCR; // Reset Control Register + AT91_REG RSTC_RSR; // Reset Status Register + AT91_REG RSTC_RMR; // Reset Mode Register +} AT91S_RSTC, *AT91PS_RSTC; + +// -------- RSTC_RCR : (RSTC Offset: 0x0) Reset Control Register -------- +#define AT91C_RSTC_PROCRST ((unsigned int) 0x1 << 0) // (RSTC) Processor Reset +#define AT91C_RSTC_PERRST ((unsigned int) 0x1 << 2) // (RSTC) Peripheral Reset +#define AT91C_RSTC_EXTRST ((unsigned int) 0x1 << 3) // (RSTC) External Reset +#define AT91C_RSTC_KEY ((unsigned int) 0xFF << 24) // (RSTC) Password +// -------- RSTC_RSR : (RSTC Offset: 0x4) Reset Status Register -------- +#define AT91C_RSTC_URSTS ((unsigned int) 0x1 << 0) // (RSTC) User Reset Status +#define AT91C_RSTC_BODSTS ((unsigned int) 0x1 << 1) // (RSTC) Brownout Detection Status +#define AT91C_RSTC_RSTTYP ((unsigned int) 0x7 << 8) // (RSTC) Reset Type +#define AT91C_RSTC_RSTTYP_POWERUP ((unsigned int) 0x0 << 8) // (RSTC) Power-up Reset. VDDCORE rising. +#define AT91C_RSTC_RSTTYP_WAKEUP ((unsigned int) 0x1 << 8) // (RSTC) WakeUp Reset. VDDCORE rising. +#define AT91C_RSTC_RSTTYP_WATCHDOG ((unsigned int) 0x2 << 8) // (RSTC) Watchdog Reset. Watchdog overflow occured. +#define AT91C_RSTC_RSTTYP_SOFTWARE ((unsigned int) 0x3 << 8) // (RSTC) Software Reset. Processor reset required by the software. +#define AT91C_RSTC_RSTTYP_USER ((unsigned int) 0x4 << 8) // (RSTC) User Reset. NRST pin detected low. +#define AT91C_RSTC_RSTTYP_BROWNOUT ((unsigned int) 0x5 << 8) // (RSTC) Brownout Reset occured. +#define AT91C_RSTC_NRSTL ((unsigned int) 0x1 << 16) // (RSTC) NRST pin level +#define AT91C_RSTC_SRCMP ((unsigned int) 0x1 << 17) // (RSTC) Software Reset Command in Progress. +// -------- RSTC_RMR : (RSTC Offset: 0x8) Reset Mode Register -------- +#define AT91C_RSTC_URSTEN ((unsigned int) 0x1 << 0) // (RSTC) User Reset Enable +#define AT91C_RSTC_URSTIEN ((unsigned int) 0x1 << 4) // (RSTC) User Reset Interrupt Enable +#define AT91C_RSTC_ERSTL ((unsigned int) 0xF << 8) // (RSTC) User Reset Enable +#define AT91C_RSTC_BODIEN ((unsigned int) 0x1 << 16) // (RSTC) Brownout Detection Interrupt Enable + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Real Time Timer Controller Interface +// ***************************************************************************** +typedef struct _AT91S_RTTC { + AT91_REG RTTC_RTMR; // Real-time Mode Register + AT91_REG RTTC_RTAR; // Real-time Alarm Register + AT91_REG RTTC_RTVR; // Real-time Value Register + AT91_REG RTTC_RTSR; // Real-time Status Register +} AT91S_RTTC, *AT91PS_RTTC; + +// -------- RTTC_RTMR : (RTTC Offset: 0x0) Real-time Mode Register -------- +#define AT91C_RTTC_RTPRES ((unsigned int) 0xFFFF << 0) // (RTTC) Real-time Timer Prescaler Value +#define AT91C_RTTC_ALMIEN ((unsigned int) 0x1 << 16) // (RTTC) Alarm Interrupt Enable +#define AT91C_RTTC_RTTINCIEN ((unsigned int) 0x1 << 17) // (RTTC) Real Time Timer Increment Interrupt Enable +#define AT91C_RTTC_RTTRST ((unsigned int) 0x1 << 18) // (RTTC) Real Time Timer Restart +// -------- RTTC_RTAR : (RTTC Offset: 0x4) Real-time Alarm Register -------- +#define AT91C_RTTC_ALMV ((unsigned int) 0x0 << 0) // (RTTC) Alarm Value +// -------- RTTC_RTVR : (RTTC Offset: 0x8) Current Real-time Value Register -------- +#define AT91C_RTTC_CRTV ((unsigned int) 0x0 << 0) // (RTTC) Current Real-time Value +// -------- RTTC_RTSR : (RTTC Offset: 0xc) Real-time Status Register -------- +#define AT91C_RTTC_ALMS ((unsigned int) 0x1 << 0) // (RTTC) Real-time Alarm Status +#define AT91C_RTTC_RTTINC ((unsigned int) 0x1 << 1) // (RTTC) Real-time Timer Increment + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Periodic Interval Timer Controller Interface +// ***************************************************************************** +typedef struct _AT91S_PITC { + AT91_REG PITC_PIMR; // Period Interval Mode Register + AT91_REG PITC_PISR; // Period Interval Status Register + AT91_REG PITC_PIVR; // Period Interval Value Register + AT91_REG PITC_PIIR; // Period Interval Image Register +} AT91S_PITC, *AT91PS_PITC; + +// -------- PITC_PIMR : (PITC Offset: 0x0) Periodic Interval Mode Register -------- +#define AT91C_PITC_PIV ((unsigned int) 0xFFFFF << 0) // (PITC) Periodic Interval Value +#define AT91C_PITC_PITEN ((unsigned int) 0x1 << 24) // (PITC) Periodic Interval Timer Enabled +#define AT91C_PITC_PITIEN ((unsigned int) 0x1 << 25) // (PITC) Periodic Interval Timer Interrupt Enable +// -------- PITC_PISR : (PITC Offset: 0x4) Periodic Interval Status Register -------- +#define AT91C_PITC_PITS ((unsigned int) 0x1 << 0) // (PITC) Periodic Interval Timer Status +// -------- PITC_PIVR : (PITC Offset: 0x8) Periodic Interval Value Register -------- +#define AT91C_PITC_CPIV ((unsigned int) 0xFFFFF << 0) // (PITC) Current Periodic Interval Value +#define AT91C_PITC_PICNT ((unsigned int) 0xFFF << 20) // (PITC) Periodic Interval Counter +// -------- PITC_PIIR : (PITC Offset: 0xc) Periodic Interval Image Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Watchdog Timer Controller Interface +// ***************************************************************************** +typedef struct _AT91S_WDTC { + AT91_REG WDTC_WDCR; // Watchdog Control Register + AT91_REG WDTC_WDMR; // Watchdog Mode Register + AT91_REG WDTC_WDSR; // Watchdog Status Register +} AT91S_WDTC, *AT91PS_WDTC; + +// -------- WDTC_WDCR : (WDTC Offset: 0x0) Periodic Interval Image Register -------- +#define AT91C_WDTC_WDRSTT ((unsigned int) 0x1 << 0) // (WDTC) Watchdog Restart +#define AT91C_WDTC_KEY ((unsigned int) 0xFF << 24) // (WDTC) Watchdog KEY Password +// -------- WDTC_WDMR : (WDTC Offset: 0x4) Watchdog Mode Register -------- +#define AT91C_WDTC_WDV ((unsigned int) 0xFFF << 0) // (WDTC) Watchdog Timer Restart +#define AT91C_WDTC_WDFIEN ((unsigned int) 0x1 << 12) // (WDTC) Watchdog Fault Interrupt Enable +#define AT91C_WDTC_WDRSTEN ((unsigned int) 0x1 << 13) // (WDTC) Watchdog Reset Enable +#define AT91C_WDTC_WDRPROC ((unsigned int) 0x1 << 14) // (WDTC) Watchdog Timer Restart +#define AT91C_WDTC_WDDIS ((unsigned int) 0x1 << 15) // (WDTC) Watchdog Disable +#define AT91C_WDTC_WDD ((unsigned int) 0xFFF << 16) // (WDTC) Watchdog Delta Value +#define AT91C_WDTC_WDDBGHLT ((unsigned int) 0x1 << 28) // (WDTC) Watchdog Debug Halt +#define AT91C_WDTC_WDIDLEHLT ((unsigned int) 0x1 << 29) // (WDTC) Watchdog Idle Halt +// -------- WDTC_WDSR : (WDTC Offset: 0x8) Watchdog Status Register -------- +#define AT91C_WDTC_WDUNF ((unsigned int) 0x1 << 0) // (WDTC) Watchdog Underflow +#define AT91C_WDTC_WDERR ((unsigned int) 0x1 << 1) // (WDTC) Watchdog Error + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Voltage Regulator Mode Controller Interface +// ***************************************************************************** +typedef struct _AT91S_VREG { + AT91_REG VREG_MR; // Voltage Regulator Mode Register +} AT91S_VREG, *AT91PS_VREG; + +// -------- VREG_MR : (VREG Offset: 0x0) Voltage Regulator Mode Register -------- +#define AT91C_VREG_PSTDBY ((unsigned int) 0x1 << 0) // (VREG) Voltage Regulator Power Standby Mode + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Memory Controller Interface +// ***************************************************************************** +typedef struct _AT91S_MC { + AT91_REG MC_RCR; // MC Remap Control Register + AT91_REG MC_ASR; // MC Abort Status Register + AT91_REG MC_AASR; // MC Abort Address Status Register + AT91_REG Reserved0[21]; // + AT91_REG MC_FMR; // MC Flash Mode Register + AT91_REG MC_FCR; // MC Flash Command Register + AT91_REG MC_FSR; // MC Flash Status Register +} AT91S_MC, *AT91PS_MC; + +// -------- MC_RCR : (MC Offset: 0x0) MC Remap Control Register -------- +#define AT91C_MC_RCB ((unsigned int) 0x1 << 0) // (MC) Remap Command Bit +// -------- MC_ASR : (MC Offset: 0x4) MC Abort Status Register -------- +#define AT91C_MC_UNDADD ((unsigned int) 0x1 << 0) // (MC) Undefined Addess Abort Status +#define AT91C_MC_MISADD ((unsigned int) 0x1 << 1) // (MC) Misaligned Addess Abort Status +#define AT91C_MC_ABTSZ ((unsigned int) 0x3 << 8) // (MC) Abort Size Status +#define AT91C_MC_ABTSZ_BYTE ((unsigned int) 0x0 << 8) // (MC) Byte +#define AT91C_MC_ABTSZ_HWORD ((unsigned int) 0x1 << 8) // (MC) Half-word +#define AT91C_MC_ABTSZ_WORD ((unsigned int) 0x2 << 8) // (MC) Word +#define AT91C_MC_ABTTYP ((unsigned int) 0x3 << 10) // (MC) Abort Type Status +#define AT91C_MC_ABTTYP_DATAR ((unsigned int) 0x0 << 10) // (MC) Data Read +#define AT91C_MC_ABTTYP_DATAW ((unsigned int) 0x1 << 10) // (MC) Data Write +#define AT91C_MC_ABTTYP_FETCH ((unsigned int) 0x2 << 10) // (MC) Code Fetch +#define AT91C_MC_MST0 ((unsigned int) 0x1 << 16) // (MC) Master 0 Abort Source +#define AT91C_MC_MST1 ((unsigned int) 0x1 << 17) // (MC) Master 1 Abort Source +#define AT91C_MC_SVMST0 ((unsigned int) 0x1 << 24) // (MC) Saved Master 0 Abort Source +#define AT91C_MC_SVMST1 ((unsigned int) 0x1 << 25) // (MC) Saved Master 1 Abort Source +// -------- MC_FMR : (MC Offset: 0x60) MC Flash Mode Register -------- +#define AT91C_MC_FRDY ((unsigned int) 0x1 << 0) // (MC) Flash Ready +#define AT91C_MC_LOCKE ((unsigned int) 0x1 << 2) // (MC) Lock Error +#define AT91C_MC_PROGE ((unsigned int) 0x1 << 3) // (MC) Programming Error +#define AT91C_MC_NEBP ((unsigned int) 0x1 << 7) // (MC) No Erase Before Programming +#define AT91C_MC_FWS ((unsigned int) 0x3 << 8) // (MC) Flash Wait State +#define AT91C_MC_FWS_0FWS ((unsigned int) 0x0 << 8) // (MC) 1 cycle for Read, 2 for Write operations +#define AT91C_MC_FWS_1FWS ((unsigned int) 0x1 << 8) // (MC) 2 cycles for Read, 3 for Write operations +#define AT91C_MC_FWS_2FWS ((unsigned int) 0x2 << 8) // (MC) 3 cycles for Read, 4 for Write operations +#define AT91C_MC_FWS_3FWS ((unsigned int) 0x3 << 8) // (MC) 4 cycles for Read, 4 for Write operations +#define AT91C_MC_FMCN ((unsigned int) 0xFF << 16) // (MC) Flash Microsecond Cycle Number +// -------- MC_FCR : (MC Offset: 0x64) MC Flash Command Register -------- +#define AT91C_MC_FCMD ((unsigned int) 0xF << 0) // (MC) Flash Command +#define AT91C_MC_FCMD_START_PROG ((unsigned int) 0x1) // (MC) Starts the programming of th epage specified by PAGEN. +#define AT91C_MC_FCMD_LOCK ((unsigned int) 0x2) // (MC) Starts a lock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. +#define AT91C_MC_FCMD_PROG_AND_LOCK ((unsigned int) 0x3) // (MC) The lock sequence automatically happens after the programming sequence is completed. +#define AT91C_MC_FCMD_UNLOCK ((unsigned int) 0x4) // (MC) Starts an unlock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. +#define AT91C_MC_FCMD_ERASE_ALL ((unsigned int) 0x8) // (MC) Starts the erase of the entire flash.If at least a page is locked, the command is cancelled. +#define AT91C_MC_FCMD_SET_GP_NVM ((unsigned int) 0xB) // (MC) Set General Purpose NVM bits. +#define AT91C_MC_FCMD_CLR_GP_NVM ((unsigned int) 0xD) // (MC) Clear General Purpose NVM bits. +#define AT91C_MC_FCMD_SET_SECURITY ((unsigned int) 0xF) // (MC) Set Security Bit. +#define AT91C_MC_PAGEN ((unsigned int) 0x3FF << 8) // (MC) Page Number +#define AT91C_MC_KEY ((unsigned int) 0xFF << 24) // (MC) Writing Protect Key +// -------- MC_FSR : (MC Offset: 0x68) MC Flash Command Register -------- +#define AT91C_MC_SECURITY ((unsigned int) 0x1 << 4) // (MC) Security Bit Status +#define AT91C_MC_GPNVM0 ((unsigned int) 0x1 << 8) // (MC) Sector 0 Lock Status +#define AT91C_MC_GPNVM1 ((unsigned int) 0x1 << 9) // (MC) Sector 1 Lock Status +#define AT91C_MC_GPNVM2 ((unsigned int) 0x1 << 10) // (MC) Sector 2 Lock Status +#define AT91C_MC_GPNVM3 ((unsigned int) 0x1 << 11) // (MC) Sector 3 Lock Status +#define AT91C_MC_GPNVM4 ((unsigned int) 0x1 << 12) // (MC) Sector 4 Lock Status +#define AT91C_MC_GPNVM5 ((unsigned int) 0x1 << 13) // (MC) Sector 5 Lock Status +#define AT91C_MC_GPNVM6 ((unsigned int) 0x1 << 14) // (MC) Sector 6 Lock Status +#define AT91C_MC_GPNVM7 ((unsigned int) 0x1 << 15) // (MC) Sector 7 Lock Status +#define AT91C_MC_LOCKS0 ((unsigned int) 0x1 << 16) // (MC) Sector 0 Lock Status +#define AT91C_MC_LOCKS1 ((unsigned int) 0x1 << 17) // (MC) Sector 1 Lock Status +#define AT91C_MC_LOCKS2 ((unsigned int) 0x1 << 18) // (MC) Sector 2 Lock Status +#define AT91C_MC_LOCKS3 ((unsigned int) 0x1 << 19) // (MC) Sector 3 Lock Status +#define AT91C_MC_LOCKS4 ((unsigned int) 0x1 << 20) // (MC) Sector 4 Lock Status +#define AT91C_MC_LOCKS5 ((unsigned int) 0x1 << 21) // (MC) Sector 5 Lock Status +#define AT91C_MC_LOCKS6 ((unsigned int) 0x1 << 22) // (MC) Sector 6 Lock Status +#define AT91C_MC_LOCKS7 ((unsigned int) 0x1 << 23) // (MC) Sector 7 Lock Status +#define AT91C_MC_LOCKS8 ((unsigned int) 0x1 << 24) // (MC) Sector 8 Lock Status +#define AT91C_MC_LOCKS9 ((unsigned int) 0x1 << 25) // (MC) Sector 9 Lock Status +#define AT91C_MC_LOCKS10 ((unsigned int) 0x1 << 26) // (MC) Sector 10 Lock Status +#define AT91C_MC_LOCKS11 ((unsigned int) 0x1 << 27) // (MC) Sector 11 Lock Status +#define AT91C_MC_LOCKS12 ((unsigned int) 0x1 << 28) // (MC) Sector 12 Lock Status +#define AT91C_MC_LOCKS13 ((unsigned int) 0x1 << 29) // (MC) Sector 13 Lock Status +#define AT91C_MC_LOCKS14 ((unsigned int) 0x1 << 30) // (MC) Sector 14 Lock Status +#define AT91C_MC_LOCKS15 ((unsigned int) 0x1 << 31) // (MC) Sector 15 Lock Status + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Serial Parallel Interface +// ***************************************************************************** +typedef struct _AT91S_SPI { + AT91_REG SPI_CR; // Control Register + AT91_REG SPI_MR; // Mode Register + AT91_REG SPI_RDR; // Receive Data Register + AT91_REG SPI_TDR; // Transmit Data Register + AT91_REG SPI_SR; // Status Register + AT91_REG SPI_IER; // Interrupt Enable Register + AT91_REG SPI_IDR; // Interrupt Disable Register + AT91_REG SPI_IMR; // Interrupt Mask Register + AT91_REG Reserved0[4]; // + AT91_REG SPI_CSR[4]; // Chip Select Register + AT91_REG Reserved1[48]; // + AT91_REG SPI_RPR; // Receive Pointer Register + AT91_REG SPI_RCR; // Receive Counter Register + AT91_REG SPI_TPR; // Transmit Pointer Register + AT91_REG SPI_TCR; // Transmit Counter Register + AT91_REG SPI_RNPR; // Receive Next Pointer Register + AT91_REG SPI_RNCR; // Receive Next Counter Register + AT91_REG SPI_TNPR; // Transmit Next Pointer Register + AT91_REG SPI_TNCR; // Transmit Next Counter Register + AT91_REG SPI_PTCR; // PDC Transfer Control Register + AT91_REG SPI_PTSR; // PDC Transfer Status Register +} AT91S_SPI, *AT91PS_SPI; + +// -------- SPI_CR : (SPI Offset: 0x0) SPI Control Register -------- +#define AT91C_SPI_SPIEN ((unsigned int) 0x1 << 0) // (SPI) SPI Enable +#define AT91C_SPI_SPIDIS ((unsigned int) 0x1 << 1) // (SPI) SPI Disable +#define AT91C_SPI_SWRST ((unsigned int) 0x1 << 7) // (SPI) SPI Software reset +#define AT91C_SPI_LASTXFER ((unsigned int) 0x1 << 24) // (SPI) SPI Last Transfer +// -------- SPI_MR : (SPI Offset: 0x4) SPI Mode Register -------- +#define AT91C_SPI_MSTR ((unsigned int) 0x1 << 0) // (SPI) Master/Slave Mode +#define AT91C_SPI_PS ((unsigned int) 0x1 << 1) // (SPI) Peripheral Select +#define AT91C_SPI_PS_FIXED ((unsigned int) 0x0 << 1) // (SPI) Fixed Peripheral Select +#define AT91C_SPI_PS_VARIABLE ((unsigned int) 0x1 << 1) // (SPI) Variable Peripheral Select +#define AT91C_SPI_PCSDEC ((unsigned int) 0x1 << 2) // (SPI) Chip Select Decode +#define AT91C_SPI_FDIV ((unsigned int) 0x1 << 3) // (SPI) Clock Selection +#define AT91C_SPI_MODFDIS ((unsigned int) 0x1 << 4) // (SPI) Mode Fault Detection +#define AT91C_SPI_LLB ((unsigned int) 0x1 << 7) // (SPI) Clock Selection +#define AT91C_SPI_PCS ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select +#define AT91C_SPI_DLYBCS ((unsigned int) 0xFF << 24) // (SPI) Delay Between Chip Selects +// -------- SPI_RDR : (SPI Offset: 0x8) Receive Data Register -------- +#define AT91C_SPI_RD ((unsigned int) 0xFFFF << 0) // (SPI) Receive Data +#define AT91C_SPI_RPCS ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select Status +// -------- SPI_TDR : (SPI Offset: 0xc) Transmit Data Register -------- +#define AT91C_SPI_TD ((unsigned int) 0xFFFF << 0) // (SPI) Transmit Data +#define AT91C_SPI_TPCS ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select Status +// -------- SPI_SR : (SPI Offset: 0x10) Status Register -------- +#define AT91C_SPI_RDRF ((unsigned int) 0x1 << 0) // (SPI) Receive Data Register Full +#define AT91C_SPI_TDRE ((unsigned int) 0x1 << 1) // (SPI) Transmit Data Register Empty +#define AT91C_SPI_MODF ((unsigned int) 0x1 << 2) // (SPI) Mode Fault Error +#define AT91C_SPI_OVRES ((unsigned int) 0x1 << 3) // (SPI) Overrun Error Status +#define AT91C_SPI_ENDRX ((unsigned int) 0x1 << 4) // (SPI) End of Receiver Transfer +#define AT91C_SPI_ENDTX ((unsigned int) 0x1 << 5) // (SPI) End of Receiver Transfer +#define AT91C_SPI_RXBUFF ((unsigned int) 0x1 << 6) // (SPI) RXBUFF Interrupt +#define AT91C_SPI_TXBUFE ((unsigned int) 0x1 << 7) // (SPI) TXBUFE Interrupt +#define AT91C_SPI_NSSR ((unsigned int) 0x1 << 8) // (SPI) NSSR Interrupt +#define AT91C_SPI_TXEMPTY ((unsigned int) 0x1 << 9) // (SPI) TXEMPTY Interrupt +#define AT91C_SPI_SPIENS ((unsigned int) 0x1 << 16) // (SPI) Enable Status +// -------- SPI_IER : (SPI Offset: 0x14) Interrupt Enable Register -------- +// -------- SPI_IDR : (SPI Offset: 0x18) Interrupt Disable Register -------- +// -------- SPI_IMR : (SPI Offset: 0x1c) Interrupt Mask Register -------- +// -------- SPI_CSR : (SPI Offset: 0x30) Chip Select Register -------- +#define AT91C_SPI_CPOL ((unsigned int) 0x1 << 0) // (SPI) Clock Polarity +#define AT91C_SPI_NCPHA ((unsigned int) 0x1 << 1) // (SPI) Clock Phase +#define AT91C_SPI_CSAAT ((unsigned int) 0x1 << 3) // (SPI) Chip Select Active After Transfer +#define AT91C_SPI_BITS ((unsigned int) 0xF << 4) // (SPI) Bits Per Transfer +#define AT91C_SPI_BITS_8 ((unsigned int) 0x0 << 4) // (SPI) 8 Bits Per transfer +#define AT91C_SPI_BITS_9 ((unsigned int) 0x1 << 4) // (SPI) 9 Bits Per transfer +#define AT91C_SPI_BITS_10 ((unsigned int) 0x2 << 4) // (SPI) 10 Bits Per transfer +#define AT91C_SPI_BITS_11 ((unsigned int) 0x3 << 4) // (SPI) 11 Bits Per transfer +#define AT91C_SPI_BITS_12 ((unsigned int) 0x4 << 4) // (SPI) 12 Bits Per transfer +#define AT91C_SPI_BITS_13 ((unsigned int) 0x5 << 4) // (SPI) 13 Bits Per transfer +#define AT91C_SPI_BITS_14 ((unsigned int) 0x6 << 4) // (SPI) 14 Bits Per transfer +#define AT91C_SPI_BITS_15 ((unsigned int) 0x7 << 4) // (SPI) 15 Bits Per transfer +#define AT91C_SPI_BITS_16 ((unsigned int) 0x8 << 4) // (SPI) 16 Bits Per transfer +#define AT91C_SPI_SCBR ((unsigned int) 0xFF << 8) // (SPI) Serial Clock Baud Rate +#define AT91C_SPI_DLYBS ((unsigned int) 0xFF << 16) // (SPI) Delay Before SPCK +#define AT91C_SPI_DLYBCT ((unsigned int) 0xFF << 24) // (SPI) Delay Between Consecutive Transfers + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Usart +// ***************************************************************************** +typedef struct _AT91S_USART { + AT91_REG US_CR; // Control Register + AT91_REG US_MR; // Mode Register + AT91_REG US_IER; // Interrupt Enable Register + AT91_REG US_IDR; // Interrupt Disable Register + AT91_REG US_IMR; // Interrupt Mask Register + AT91_REG US_CSR; // Channel Status Register + AT91_REG US_RHR; // Receiver Holding Register + AT91_REG US_THR; // Transmitter Holding Register + AT91_REG US_BRGR; // Baud Rate Generator Register + AT91_REG US_RTOR; // Receiver Time-out Register + AT91_REG US_TTGR; // Transmitter Time-guard Register + AT91_REG Reserved0[5]; // + AT91_REG US_FIDI; // FI_DI_Ratio Register + AT91_REG US_NER; // Nb Errors Register + AT91_REG Reserved1[1]; // + AT91_REG US_IF; // IRDA_FILTER Register + AT91_REG Reserved2[44]; // + AT91_REG US_RPR; // Receive Pointer Register + AT91_REG US_RCR; // Receive Counter Register + AT91_REG US_TPR; // Transmit Pointer Register + AT91_REG US_TCR; // Transmit Counter Register + AT91_REG US_RNPR; // Receive Next Pointer Register + AT91_REG US_RNCR; // Receive Next Counter Register + AT91_REG US_TNPR; // Transmit Next Pointer Register + AT91_REG US_TNCR; // Transmit Next Counter Register + AT91_REG US_PTCR; // PDC Transfer Control Register + AT91_REG US_PTSR; // PDC Transfer Status Register +} AT91S_USART, *AT91PS_USART; + +// -------- US_CR : (USART Offset: 0x0) Debug Unit Control Register -------- +#define AT91C_US_STTBRK ((unsigned int) 0x1 << 9) // (USART) Start Break +#define AT91C_US_STPBRK ((unsigned int) 0x1 << 10) // (USART) Stop Break +#define AT91C_US_STTTO ((unsigned int) 0x1 << 11) // (USART) Start Time-out +#define AT91C_US_SENDA ((unsigned int) 0x1 << 12) // (USART) Send Address +#define AT91C_US_RSTIT ((unsigned int) 0x1 << 13) // (USART) Reset Iterations +#define AT91C_US_RSTNACK ((unsigned int) 0x1 << 14) // (USART) Reset Non Acknowledge +#define AT91C_US_RETTO ((unsigned int) 0x1 << 15) // (USART) Rearm Time-out +#define AT91C_US_DTREN ((unsigned int) 0x1 << 16) // (USART) Data Terminal ready Enable +#define AT91C_US_DTRDIS ((unsigned int) 0x1 << 17) // (USART) Data Terminal ready Disable +#define AT91C_US_RTSEN ((unsigned int) 0x1 << 18) // (USART) Request to Send enable +#define AT91C_US_RTSDIS ((unsigned int) 0x1 << 19) // (USART) Request to Send Disable +// -------- US_MR : (USART Offset: 0x4) Debug Unit Mode Register -------- +#define AT91C_US_USMODE ((unsigned int) 0xF << 0) // (USART) Usart mode +#define AT91C_US_USMODE_NORMAL ((unsigned int) 0x0) // (USART) Normal +#define AT91C_US_USMODE_RS485 ((unsigned int) 0x1) // (USART) RS485 +#define AT91C_US_USMODE_HWHSH ((unsigned int) 0x2) // (USART) Hardware Handshaking +#define AT91C_US_USMODE_MODEM ((unsigned int) 0x3) // (USART) Modem +#define AT91C_US_USMODE_ISO7816_0 ((unsigned int) 0x4) // (USART) ISO7816 protocol: T = 0 +#define AT91C_US_USMODE_ISO7816_1 ((unsigned int) 0x6) // (USART) ISO7816 protocol: T = 1 +#define AT91C_US_USMODE_IRDA ((unsigned int) 0x8) // (USART) IrDA +#define AT91C_US_USMODE_SWHSH ((unsigned int) 0xC) // (USART) Software Handshaking +#define AT91C_US_CLKS ((unsigned int) 0x3 << 4) // (USART) Clock Selection (Baud Rate generator Input Clock +#define AT91C_US_CLKS_CLOCK ((unsigned int) 0x0 << 4) // (USART) Clock +#define AT91C_US_CLKS_FDIV1 ((unsigned int) 0x1 << 4) // (USART) fdiv1 +#define AT91C_US_CLKS_SLOW ((unsigned int) 0x2 << 4) // (USART) slow_clock (ARM) +#define AT91C_US_CLKS_EXT ((unsigned int) 0x3 << 4) // (USART) External (SCK) +#define AT91C_US_CHRL ((unsigned int) 0x3 << 6) // (USART) Clock Selection (Baud Rate generator Input Clock +#define AT91C_US_CHRL_5_BITS ((unsigned int) 0x0 << 6) // (USART) Character Length: 5 bits +#define AT91C_US_CHRL_6_BITS ((unsigned int) 0x1 << 6) // (USART) Character Length: 6 bits +#define AT91C_US_CHRL_7_BITS ((unsigned int) 0x2 << 6) // (USART) Character Length: 7 bits +#define AT91C_US_CHRL_8_BITS ((unsigned int) 0x3 << 6) // (USART) Character Length: 8 bits +#define AT91C_US_SYNC ((unsigned int) 0x1 << 8) // (USART) Synchronous Mode Select +#define AT91C_US_NBSTOP ((unsigned int) 0x3 << 12) // (USART) Number of Stop bits +#define AT91C_US_NBSTOP_1_BIT ((unsigned int) 0x0 << 12) // (USART) 1 stop bit +#define AT91C_US_NBSTOP_15_BIT ((unsigned int) 0x1 << 12) // (USART) Asynchronous (SYNC=0) 2 stop bits Synchronous (SYNC=1) 2 stop bits +#define AT91C_US_NBSTOP_2_BIT ((unsigned int) 0x2 << 12) // (USART) 2 stop bits +#define AT91C_US_MSBF ((unsigned int) 0x1 << 16) // (USART) Bit Order +#define AT91C_US_MODE9 ((unsigned int) 0x1 << 17) // (USART) 9-bit Character length +#define AT91C_US_CKLO ((unsigned int) 0x1 << 18) // (USART) Clock Output Select +#define AT91C_US_OVER ((unsigned int) 0x1 << 19) // (USART) Over Sampling Mode +#define AT91C_US_INACK ((unsigned int) 0x1 << 20) // (USART) Inhibit Non Acknowledge +#define AT91C_US_DSNACK ((unsigned int) 0x1 << 21) // (USART) Disable Successive NACK +#define AT91C_US_MAX_ITER ((unsigned int) 0x1 << 24) // (USART) Number of Repetitions +#define AT91C_US_FILTER ((unsigned int) 0x1 << 28) // (USART) Receive Line Filter +// -------- US_IER : (USART Offset: 0x8) Debug Unit Interrupt Enable Register -------- +#define AT91C_US_RXBRK ((unsigned int) 0x1 << 2) // (USART) Break Received/End of Break +#define AT91C_US_TIMEOUT ((unsigned int) 0x1 << 8) // (USART) Receiver Time-out +#define AT91C_US_ITERATION ((unsigned int) 0x1 << 10) // (USART) Max number of Repetitions Reached +#define AT91C_US_NACK ((unsigned int) 0x1 << 13) // (USART) Non Acknowledge +#define AT91C_US_RIIC ((unsigned int) 0x1 << 16) // (USART) Ring INdicator Input Change Flag +#define AT91C_US_DSRIC ((unsigned int) 0x1 << 17) // (USART) Data Set Ready Input Change Flag +#define AT91C_US_DCDIC ((unsigned int) 0x1 << 18) // (USART) Data Carrier Flag +#define AT91C_US_CTSIC ((unsigned int) 0x1 << 19) // (USART) Clear To Send Input Change Flag +// -------- US_IDR : (USART Offset: 0xc) Debug Unit Interrupt Disable Register -------- +// -------- US_IMR : (USART Offset: 0x10) Debug Unit Interrupt Mask Register -------- +// -------- US_CSR : (USART Offset: 0x14) Debug Unit Channel Status Register -------- +#define AT91C_US_RI ((unsigned int) 0x1 << 20) // (USART) Image of RI Input +#define AT91C_US_DSR ((unsigned int) 0x1 << 21) // (USART) Image of DSR Input +#define AT91C_US_DCD ((unsigned int) 0x1 << 22) // (USART) Image of DCD Input +#define AT91C_US_CTS ((unsigned int) 0x1 << 23) // (USART) Image of CTS Input + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Synchronous Serial Controller Interface +// ***************************************************************************** +typedef struct _AT91S_SSC { + AT91_REG SSC_CR; // Control Register + AT91_REG SSC_CMR; // Clock Mode Register + AT91_REG Reserved0[2]; // + AT91_REG SSC_RCMR; // Receive Clock ModeRegister + AT91_REG SSC_RFMR; // Receive Frame Mode Register + AT91_REG SSC_TCMR; // Transmit Clock Mode Register + AT91_REG SSC_TFMR; // Transmit Frame Mode Register + AT91_REG SSC_RHR; // Receive Holding Register + AT91_REG SSC_THR; // Transmit Holding Register + AT91_REG Reserved1[2]; // + AT91_REG SSC_RSHR; // Receive Sync Holding Register + AT91_REG SSC_TSHR; // Transmit Sync Holding Register + AT91_REG Reserved2[2]; // + AT91_REG SSC_SR; // Status Register + AT91_REG SSC_IER; // Interrupt Enable Register + AT91_REG SSC_IDR; // Interrupt Disable Register + AT91_REG SSC_IMR; // Interrupt Mask Register + AT91_REG Reserved3[44]; // + AT91_REG SSC_RPR; // Receive Pointer Register + AT91_REG SSC_RCR; // Receive Counter Register + AT91_REG SSC_TPR; // Transmit Pointer Register + AT91_REG SSC_TCR; // Transmit Counter Register + AT91_REG SSC_RNPR; // Receive Next Pointer Register + AT91_REG SSC_RNCR; // Receive Next Counter Register + AT91_REG SSC_TNPR; // Transmit Next Pointer Register + AT91_REG SSC_TNCR; // Transmit Next Counter Register + AT91_REG SSC_PTCR; // PDC Transfer Control Register + AT91_REG SSC_PTSR; // PDC Transfer Status Register +} AT91S_SSC, *AT91PS_SSC; + +// -------- SSC_CR : (SSC Offset: 0x0) SSC Control Register -------- +#define AT91C_SSC_RXEN ((unsigned int) 0x1 << 0) // (SSC) Receive Enable +#define AT91C_SSC_RXDIS ((unsigned int) 0x1 << 1) // (SSC) Receive Disable +#define AT91C_SSC_TXEN ((unsigned int) 0x1 << 8) // (SSC) Transmit Enable +#define AT91C_SSC_TXDIS ((unsigned int) 0x1 << 9) // (SSC) Transmit Disable +#define AT91C_SSC_SWRST ((unsigned int) 0x1 << 15) // (SSC) Software Reset +// -------- SSC_RCMR : (SSC Offset: 0x10) SSC Receive Clock Mode Register -------- +#define AT91C_SSC_CKS ((unsigned int) 0x3 << 0) // (SSC) Receive/Transmit Clock Selection +#define AT91C_SSC_CKS_DIV ((unsigned int) 0x0) // (SSC) Divided Clock +#define AT91C_SSC_CKS_TK ((unsigned int) 0x1) // (SSC) TK Clock signal +#define AT91C_SSC_CKS_RK ((unsigned int) 0x2) // (SSC) RK pin +#define AT91C_SSC_CKO ((unsigned int) 0x7 << 2) // (SSC) Receive/Transmit Clock Output Mode Selection +#define AT91C_SSC_CKO_NONE ((unsigned int) 0x0 << 2) // (SSC) Receive/Transmit Clock Output Mode: None RK pin: Input-only +#define AT91C_SSC_CKO_CONTINOUS ((unsigned int) 0x1 << 2) // (SSC) Continuous Receive/Transmit Clock RK pin: Output +#define AT91C_SSC_CKO_DATA_TX ((unsigned int) 0x2 << 2) // (SSC) Receive/Transmit Clock only during data transfers RK pin: Output +#define AT91C_SSC_CKI ((unsigned int) 0x1 << 5) // (SSC) Receive/Transmit Clock Inversion +#define AT91C_SSC_START ((unsigned int) 0xF << 8) // (SSC) Receive/Transmit Start Selection +#define AT91C_SSC_START_CONTINOUS ((unsigned int) 0x0 << 8) // (SSC) Continuous, as soon as the receiver is enabled, and immediately after the end of transfer of the previous data. +#define AT91C_SSC_START_TX ((unsigned int) 0x1 << 8) // (SSC) Transmit/Receive start +#define AT91C_SSC_START_LOW_RF ((unsigned int) 0x2 << 8) // (SSC) Detection of a low level on RF input +#define AT91C_SSC_START_HIGH_RF ((unsigned int) 0x3 << 8) // (SSC) Detection of a high level on RF input +#define AT91C_SSC_START_FALL_RF ((unsigned int) 0x4 << 8) // (SSC) Detection of a falling edge on RF input +#define AT91C_SSC_START_RISE_RF ((unsigned int) 0x5 << 8) // (SSC) Detection of a rising edge on RF input +#define AT91C_SSC_START_LEVEL_RF ((unsigned int) 0x6 << 8) // (SSC) Detection of any level change on RF input +#define AT91C_SSC_START_EDGE_RF ((unsigned int) 0x7 << 8) // (SSC) Detection of any edge on RF input +#define AT91C_SSC_START_0 ((unsigned int) 0x8 << 8) // (SSC) Compare 0 +#define AT91C_SSC_STTDLY ((unsigned int) 0xFF << 16) // (SSC) Receive/Transmit Start Delay +#define AT91C_SSC_PERIOD ((unsigned int) 0xFF << 24) // (SSC) Receive/Transmit Period Divider Selection +// -------- SSC_RFMR : (SSC Offset: 0x14) SSC Receive Frame Mode Register -------- +#define AT91C_SSC_DATLEN ((unsigned int) 0x1F << 0) // (SSC) Data Length +#define AT91C_SSC_LOOP ((unsigned int) 0x1 << 5) // (SSC) Loop Mode +#define AT91C_SSC_MSBF ((unsigned int) 0x1 << 7) // (SSC) Most Significant Bit First +#define AT91C_SSC_DATNB ((unsigned int) 0xF << 8) // (SSC) Data Number per Frame +#define AT91C_SSC_FSLEN ((unsigned int) 0xF << 16) // (SSC) Receive/Transmit Frame Sync length +#define AT91C_SSC_FSOS ((unsigned int) 0x7 << 20) // (SSC) Receive/Transmit Frame Sync Output Selection +#define AT91C_SSC_FSOS_NONE ((unsigned int) 0x0 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: None RK pin Input-only +#define AT91C_SSC_FSOS_NEGATIVE ((unsigned int) 0x1 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Negative Pulse +#define AT91C_SSC_FSOS_POSITIVE ((unsigned int) 0x2 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Positive Pulse +#define AT91C_SSC_FSOS_LOW ((unsigned int) 0x3 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver Low during data transfer +#define AT91C_SSC_FSOS_HIGH ((unsigned int) 0x4 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver High during data transfer +#define AT91C_SSC_FSOS_TOGGLE ((unsigned int) 0x5 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Toggling at each start of data transfer +#define AT91C_SSC_FSEDGE ((unsigned int) 0x1 << 24) // (SSC) Frame Sync Edge Detection +// -------- SSC_TCMR : (SSC Offset: 0x18) SSC Transmit Clock Mode Register -------- +// -------- SSC_TFMR : (SSC Offset: 0x1c) SSC Transmit Frame Mode Register -------- +#define AT91C_SSC_DATDEF ((unsigned int) 0x1 << 5) // (SSC) Data Default Value +#define AT91C_SSC_FSDEN ((unsigned int) 0x1 << 23) // (SSC) Frame Sync Data Enable +// -------- SSC_SR : (SSC Offset: 0x40) SSC Status Register -------- +#define AT91C_SSC_TXRDY ((unsigned int) 0x1 << 0) // (SSC) Transmit Ready +#define AT91C_SSC_TXEMPTY ((unsigned int) 0x1 << 1) // (SSC) Transmit Empty +#define AT91C_SSC_ENDTX ((unsigned int) 0x1 << 2) // (SSC) End Of Transmission +#define AT91C_SSC_TXBUFE ((unsigned int) 0x1 << 3) // (SSC) Transmit Buffer Empty +#define AT91C_SSC_RXRDY ((unsigned int) 0x1 << 4) // (SSC) Receive Ready +#define AT91C_SSC_OVRUN ((unsigned int) 0x1 << 5) // (SSC) Receive Overrun +#define AT91C_SSC_ENDRX ((unsigned int) 0x1 << 6) // (SSC) End of Reception +#define AT91C_SSC_RXBUFF ((unsigned int) 0x1 << 7) // (SSC) Receive Buffer Full +#define AT91C_SSC_TXSYN ((unsigned int) 0x1 << 10) // (SSC) Transmit Sync +#define AT91C_SSC_RXSYN ((unsigned int) 0x1 << 11) // (SSC) Receive Sync +#define AT91C_SSC_TXENA ((unsigned int) 0x1 << 16) // (SSC) Transmit Enable +#define AT91C_SSC_RXENA ((unsigned int) 0x1 << 17) // (SSC) Receive Enable +// -------- SSC_IER : (SSC Offset: 0x44) SSC Interrupt Enable Register -------- +// -------- SSC_IDR : (SSC Offset: 0x48) SSC Interrupt Disable Register -------- +// -------- SSC_IMR : (SSC Offset: 0x4c) SSC Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Two-wire Interface +// ***************************************************************************** +typedef struct _AT91S_TWI { + AT91_REG TWI_CR; // Control Register + AT91_REG TWI_MMR; // Master Mode Register + AT91_REG Reserved0[1]; // + AT91_REG TWI_IADR; // Internal Address Register + AT91_REG TWI_CWGR; // Clock Waveform Generator Register + AT91_REG Reserved1[3]; // + AT91_REG TWI_SR; // Status Register + AT91_REG TWI_IER; // Interrupt Enable Register + AT91_REG TWI_IDR; // Interrupt Disable Register + AT91_REG TWI_IMR; // Interrupt Mask Register + AT91_REG TWI_RHR; // Receive Holding Register + AT91_REG TWI_THR; // Transmit Holding Register +} AT91S_TWI, *AT91PS_TWI; + +// -------- TWI_CR : (TWI Offset: 0x0) TWI Control Register -------- +#define AT91C_TWI_START ((unsigned int) 0x1 << 0) // (TWI) Send a START Condition +#define AT91C_TWI_STOP ((unsigned int) 0x1 << 1) // (TWI) Send a STOP Condition +#define AT91C_TWI_MSEN ((unsigned int) 0x1 << 2) // (TWI) TWI Master Transfer Enabled +#define AT91C_TWI_MSDIS ((unsigned int) 0x1 << 3) // (TWI) TWI Master Transfer Disabled +#define AT91C_TWI_SWRST ((unsigned int) 0x1 << 7) // (TWI) Software Reset +// -------- TWI_MMR : (TWI Offset: 0x4) TWI Master Mode Register -------- +#define AT91C_TWI_IADRSZ ((unsigned int) 0x3 << 8) // (TWI) Internal Device Address Size +#define AT91C_TWI_IADRSZ_NO ((unsigned int) 0x0 << 8) // (TWI) No internal device address +#define AT91C_TWI_IADRSZ_1_BYTE ((unsigned int) 0x1 << 8) // (TWI) One-byte internal device address +#define AT91C_TWI_IADRSZ_2_BYTE ((unsigned int) 0x2 << 8) // (TWI) Two-byte internal device address +#define AT91C_TWI_IADRSZ_3_BYTE ((unsigned int) 0x3 << 8) // (TWI) Three-byte internal device address +#define AT91C_TWI_MREAD ((unsigned int) 0x1 << 12) // (TWI) Master Read Direction +#define AT91C_TWI_DADR ((unsigned int) 0x7F << 16) // (TWI) Device Address +// -------- TWI_CWGR : (TWI Offset: 0x10) TWI Clock Waveform Generator Register -------- +#define AT91C_TWI_CLDIV ((unsigned int) 0xFF << 0) // (TWI) Clock Low Divider +#define AT91C_TWI_CHDIV ((unsigned int) 0xFF << 8) // (TWI) Clock High Divider +#define AT91C_TWI_CKDIV ((unsigned int) 0x7 << 16) // (TWI) Clock Divider +// -------- TWI_SR : (TWI Offset: 0x20) TWI Status Register -------- +#define AT91C_TWI_TXCOMP ((unsigned int) 0x1 << 0) // (TWI) Transmission Completed +#define AT91C_TWI_RXRDY ((unsigned int) 0x1 << 1) // (TWI) Receive holding register ReaDY +#define AT91C_TWI_TXRDY ((unsigned int) 0x1 << 2) // (TWI) Transmit holding register ReaDY +#define AT91C_TWI_OVRE ((unsigned int) 0x1 << 6) // (TWI) Overrun Error +#define AT91C_TWI_UNRE ((unsigned int) 0x1 << 7) // (TWI) Underrun Error +#define AT91C_TWI_NACK ((unsigned int) 0x1 << 8) // (TWI) Not Acknowledged +// -------- TWI_IER : (TWI Offset: 0x24) TWI Interrupt Enable Register -------- +// -------- TWI_IDR : (TWI Offset: 0x28) TWI Interrupt Disable Register -------- +// -------- TWI_IMR : (TWI Offset: 0x2c) TWI Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR PWMC Channel Interface +// ***************************************************************************** +typedef struct _AT91S_PWMC_CH { + AT91_REG PWMC_CMR; // Channel Mode Register + AT91_REG PWMC_CDTYR; // Channel Duty Cycle Register + AT91_REG PWMC_CPRDR; // Channel Period Register + AT91_REG PWMC_CCNTR; // Channel Counter Register + AT91_REG PWMC_CUPDR; // Channel Update Register + AT91_REG PWMC_Reserved[3]; // Reserved +} AT91S_PWMC_CH, *AT91PS_PWMC_CH; + +// -------- PWMC_CMR : (PWMC_CH Offset: 0x0) PWMC Channel Mode Register -------- +#define AT91C_PWMC_CPRE ((unsigned int) 0xF << 0) // (PWMC_CH) Channel Pre-scaler : PWMC_CLKx +#define AT91C_PWMC_CPRE_MCK ((unsigned int) 0x0) // (PWMC_CH) +#define AT91C_PWMC_CPRE_MCKA ((unsigned int) 0xB) // (PWMC_CH) +#define AT91C_PWMC_CPRE_MCKB ((unsigned int) 0xC) // (PWMC_CH) +#define AT91C_PWMC_CALG ((unsigned int) 0x1 << 8) // (PWMC_CH) Channel Alignment +#define AT91C_PWMC_CPOL ((unsigned int) 0x1 << 9) // (PWMC_CH) Channel Polarity +#define AT91C_PWMC_CPD ((unsigned int) 0x1 << 10) // (PWMC_CH) Channel Update Period +// -------- PWMC_CDTYR : (PWMC_CH Offset: 0x4) PWMC Channel Duty Cycle Register -------- +#define AT91C_PWMC_CDTY ((unsigned int) 0x0 << 0) // (PWMC_CH) Channel Duty Cycle +// -------- PWMC_CPRDR : (PWMC_CH Offset: 0x8) PWMC Channel Period Register -------- +#define AT91C_PWMC_CPRD ((unsigned int) 0x0 << 0) // (PWMC_CH) Channel Period +// -------- PWMC_CCNTR : (PWMC_CH Offset: 0xc) PWMC Channel Counter Register -------- +#define AT91C_PWMC_CCNT ((unsigned int) 0x0 << 0) // (PWMC_CH) Channel Counter +// -------- PWMC_CUPDR : (PWMC_CH Offset: 0x10) PWMC Channel Update Register -------- +#define AT91C_PWMC_CUPD ((unsigned int) 0x0 << 0) // (PWMC_CH) Channel Update + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Pulse Width Modulation Controller Interface +// ***************************************************************************** +typedef struct _AT91S_PWMC { + AT91_REG PWMC_MR; // PWMC Mode Register + AT91_REG PWMC_ENA; // PWMC Enable Register + AT91_REG PWMC_DIS; // PWMC Disable Register + AT91_REG PWMC_SR; // PWMC Status Register + AT91_REG PWMC_IER; // PWMC Interrupt Enable Register + AT91_REG PWMC_IDR; // PWMC Interrupt Disable Register + AT91_REG PWMC_IMR; // PWMC Interrupt Mask Register + AT91_REG PWMC_ISR; // PWMC Interrupt Status Register + AT91_REG Reserved0[55]; // + AT91_REG PWMC_VR; // PWMC Version Register + AT91_REG Reserved1[64]; // + AT91S_PWMC_CH PWMC_CH[4]; // PWMC Channel +} AT91S_PWMC, *AT91PS_PWMC; + +// -------- PWMC_MR : (PWMC Offset: 0x0) PWMC Mode Register -------- +#define AT91C_PWMC_DIVA ((unsigned int) 0xFF << 0) // (PWMC) CLKA divide factor. +#define AT91C_PWMC_PREA ((unsigned int) 0xF << 8) // (PWMC) Divider Input Clock Prescaler A +#define AT91C_PWMC_PREA_MCK ((unsigned int) 0x0 << 8) // (PWMC) +#define AT91C_PWMC_DIVB ((unsigned int) 0xFF << 16) // (PWMC) CLKB divide factor. +#define AT91C_PWMC_PREB ((unsigned int) 0xF << 24) // (PWMC) Divider Input Clock Prescaler B +#define AT91C_PWMC_PREB_MCK ((unsigned int) 0x0 << 24) // (PWMC) +// -------- PWMC_ENA : (PWMC Offset: 0x4) PWMC Enable Register -------- +#define AT91C_PWMC_CHID0 ((unsigned int) 0x1 << 0) // (PWMC) Channel ID 0 +#define AT91C_PWMC_CHID1 ((unsigned int) 0x1 << 1) // (PWMC) Channel ID 1 +#define AT91C_PWMC_CHID2 ((unsigned int) 0x1 << 2) // (PWMC) Channel ID 2 +#define AT91C_PWMC_CHID3 ((unsigned int) 0x1 << 3) // (PWMC) Channel ID 3 +// -------- PWMC_DIS : (PWMC Offset: 0x8) PWMC Disable Register -------- +// -------- PWMC_SR : (PWMC Offset: 0xc) PWMC Status Register -------- +// -------- PWMC_IER : (PWMC Offset: 0x10) PWMC Interrupt Enable Register -------- +// -------- PWMC_IDR : (PWMC Offset: 0x14) PWMC Interrupt Disable Register -------- +// -------- PWMC_IMR : (PWMC Offset: 0x18) PWMC Interrupt Mask Register -------- +// -------- PWMC_ISR : (PWMC Offset: 0x1c) PWMC Interrupt Status Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR USB Device Interface +// ***************************************************************************** +typedef struct _AT91S_UDP { + AT91_REG UDP_NUM; // Frame Number Register + AT91_REG UDP_GLBSTATE; // Global State Register + AT91_REG UDP_FADDR; // Function Address Register + AT91_REG Reserved0[1]; // + AT91_REG UDP_IER; // Interrupt Enable Register + AT91_REG UDP_IDR; // Interrupt Disable Register + AT91_REG UDP_IMR; // Interrupt Mask Register + AT91_REG UDP_ISR; // Interrupt Status Register + AT91_REG UDP_ICR; // Interrupt Clear Register + AT91_REG Reserved1[1]; // + AT91_REG UDP_RSTEP; // Reset Endpoint Register + AT91_REG Reserved2[1]; // + AT91_REG UDP_CSR[6]; // Endpoint Control and Status Register + AT91_REG Reserved3[2]; // + AT91_REG UDP_FDR[6]; // Endpoint FIFO Data Register + AT91_REG Reserved4[3]; // + AT91_REG UDP_TXVC; // Transceiver Control Register +} AT91S_UDP, *AT91PS_UDP; + +// -------- UDP_FRM_NUM : (UDP Offset: 0x0) USB Frame Number Register -------- +#define AT91C_UDP_FRM_NUM ((unsigned int) 0x7FF << 0) // (UDP) Frame Number as Defined in the Packet Field Formats +#define AT91C_UDP_FRM_ERR ((unsigned int) 0x1 << 16) // (UDP) Frame Error +#define AT91C_UDP_FRM_OK ((unsigned int) 0x1 << 17) // (UDP) Frame OK +// -------- UDP_GLB_STATE : (UDP Offset: 0x4) USB Global State Register -------- +#define AT91C_UDP_FADDEN ((unsigned int) 0x1 << 0) // (UDP) Function Address Enable +#define AT91C_UDP_CONFG ((unsigned int) 0x1 << 1) // (UDP) Configured +#define AT91C_UDP_ESR ((unsigned int) 0x1 << 2) // (UDP) Enable Send Resume +#define AT91C_UDP_RSMINPR ((unsigned int) 0x1 << 3) // (UDP) A Resume Has Been Sent to the Host +#define AT91C_UDP_RMWUPE ((unsigned int) 0x1 << 4) // (UDP) Remote Wake Up Enable +// -------- UDP_FADDR : (UDP Offset: 0x8) USB Function Address Register -------- +#define AT91C_UDP_FADD ((unsigned int) 0xFF << 0) // (UDP) Function Address Value +#define AT91C_UDP_FEN ((unsigned int) 0x1 << 8) // (UDP) Function Enable +// -------- UDP_IER : (UDP Offset: 0x10) USB Interrupt Enable Register -------- +#define AT91C_UDP_EPINT0 ((unsigned int) 0x1 << 0) // (UDP) Endpoint 0 Interrupt +#define AT91C_UDP_EPINT1 ((unsigned int) 0x1 << 1) // (UDP) Endpoint 0 Interrupt +#define AT91C_UDP_EPINT2 ((unsigned int) 0x1 << 2) // (UDP) Endpoint 2 Interrupt +#define AT91C_UDP_EPINT3 ((unsigned int) 0x1 << 3) // (UDP) Endpoint 3 Interrupt +#define AT91C_UDP_EPINT4 ((unsigned int) 0x1 << 4) // (UDP) Endpoint 4 Interrupt +#define AT91C_UDP_EPINT5 ((unsigned int) 0x1 << 5) // (UDP) Endpoint 5 Interrupt +#define AT91C_UDP_RXSUSP ((unsigned int) 0x1 << 8) // (UDP) USB Suspend Interrupt +#define AT91C_UDP_RXRSM ((unsigned int) 0x1 << 9) // (UDP) USB Resume Interrupt +#define AT91C_UDP_EXTRSM ((unsigned int) 0x1 << 10) // (UDP) USB External Resume Interrupt +#define AT91C_UDP_SOFINT ((unsigned int) 0x1 << 11) // (UDP) USB Start Of frame Interrupt +#define AT91C_UDP_WAKEUP ((unsigned int) 0x1 << 13) // (UDP) USB Resume Interrupt +// -------- UDP_IDR : (UDP Offset: 0x14) USB Interrupt Disable Register -------- +// -------- UDP_IMR : (UDP Offset: 0x18) USB Interrupt Mask Register -------- +// -------- UDP_ISR : (UDP Offset: 0x1c) USB Interrupt Status Register -------- +#define AT91C_UDP_ENDBUSRES ((unsigned int) 0x1 << 12) // (UDP) USB End Of Bus Reset Interrupt +// -------- UDP_ICR : (UDP Offset: 0x20) USB Interrupt Clear Register -------- +// -------- UDP_RST_EP : (UDP Offset: 0x28) USB Reset Endpoint Register -------- +#define AT91C_UDP_EP0 ((unsigned int) 0x1 << 0) // (UDP) Reset Endpoint 0 +#define AT91C_UDP_EP1 ((unsigned int) 0x1 << 1) // (UDP) Reset Endpoint 1 +#define AT91C_UDP_EP2 ((unsigned int) 0x1 << 2) // (UDP) Reset Endpoint 2 +#define AT91C_UDP_EP3 ((unsigned int) 0x1 << 3) // (UDP) Reset Endpoint 3 +#define AT91C_UDP_EP4 ((unsigned int) 0x1 << 4) // (UDP) Reset Endpoint 4 +#define AT91C_UDP_EP5 ((unsigned int) 0x1 << 5) // (UDP) Reset Endpoint 5 +// -------- UDP_CSR : (UDP Offset: 0x30) USB Endpoint Control and Status Register -------- +#define AT91C_UDP_TXCOMP ((unsigned int) 0x1 << 0) // (UDP) Generates an IN packet with data previously written in the DPR +#define AT91C_UDP_RX_DATA_BK0 ((unsigned int) 0x1 << 1) // (UDP) Receive Data Bank 0 +#define AT91C_UDP_RXSETUP ((unsigned int) 0x1 << 2) // (UDP) Sends STALL to the Host (Control endpoints) +#define AT91C_UDP_ISOERROR ((unsigned int) 0x1 << 3) // (UDP) Isochronous error (Isochronous endpoints) +#define AT91C_UDP_TXPKTRDY ((unsigned int) 0x1 << 4) // (UDP) Transmit Packet Ready +#define AT91C_UDP_FORCESTALL ((unsigned int) 0x1 << 5) // (UDP) Force Stall (used by Control, Bulk and Isochronous endpoints). +#define AT91C_UDP_RX_DATA_BK1 ((unsigned int) 0x1 << 6) // (UDP) Receive Data Bank 1 (only used by endpoints with ping-pong attributes). +#define AT91C_UDP_DIR ((unsigned int) 0x1 << 7) // (UDP) Transfer Direction +#define AT91C_UDP_EPTYPE ((unsigned int) 0x7 << 8) // (UDP) Endpoint type +#define AT91C_UDP_EPTYPE_CTRL ((unsigned int) 0x0 << 8) // (UDP) Control +#define AT91C_UDP_EPTYPE_ISO_OUT ((unsigned int) 0x1 << 8) // (UDP) Isochronous OUT +#define AT91C_UDP_EPTYPE_BULK_OUT ((unsigned int) 0x2 << 8) // (UDP) Bulk OUT +#define AT91C_UDP_EPTYPE_INT_OUT ((unsigned int) 0x3 << 8) // (UDP) Interrupt OUT +#define AT91C_UDP_EPTYPE_ISO_IN ((unsigned int) 0x5 << 8) // (UDP) Isochronous IN +#define AT91C_UDP_EPTYPE_BULK_IN ((unsigned int) 0x6 << 8) // (UDP) Bulk IN +#define AT91C_UDP_EPTYPE_INT_IN ((unsigned int) 0x7 << 8) // (UDP) Interrupt IN +#define AT91C_UDP_DTGLE ((unsigned int) 0x1 << 11) // (UDP) Data Toggle +#define AT91C_UDP_EPEDS ((unsigned int) 0x1 << 15) // (UDP) Endpoint Enable Disable +#define AT91C_UDP_RXBYTECNT ((unsigned int) 0x7FF << 16) // (UDP) Number Of Bytes Available in the FIFO +// -------- UDP_TXVC : (UDP Offset: 0x74) Transceiver Control Register -------- +#define AT91C_UDP_TXVDIS ((unsigned int) 0x1 << 8) // (UDP) +#define AT91C_UDP_PUON ((unsigned int) 0x1 << 9) // (UDP) Pull-up ON + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Timer Counter Channel Interface +// ***************************************************************************** +typedef struct _AT91S_TC { + AT91_REG TC_CCR; // Channel Control Register + AT91_REG TC_CMR; // Channel Mode Register (Capture Mode / Waveform Mode) + AT91_REG Reserved0[2]; // + AT91_REG TC_CV; // Counter Value + AT91_REG TC_RA; // Register A + AT91_REG TC_RB; // Register B + AT91_REG TC_RC; // Register C + AT91_REG TC_SR; // Status Register + AT91_REG TC_IER; // Interrupt Enable Register + AT91_REG TC_IDR; // Interrupt Disable Register + AT91_REG TC_IMR; // Interrupt Mask Register +} AT91S_TC, *AT91PS_TC; + +// -------- TC_CCR : (TC Offset: 0x0) TC Channel Control Register -------- +#define AT91C_TC_CLKEN ((unsigned int) 0x1 << 0) // (TC) Counter Clock Enable Command +#define AT91C_TC_CLKDIS ((unsigned int) 0x1 << 1) // (TC) Counter Clock Disable Command +#define AT91C_TC_SWTRG ((unsigned int) 0x1 << 2) // (TC) Software Trigger Command +// -------- TC_CMR : (TC Offset: 0x4) TC Channel Mode Register: Capture Mode / Waveform Mode -------- +#define AT91C_TC_CLKS ((unsigned int) 0x7 << 0) // (TC) Clock Selection +#define AT91C_TC_CLKS_TIMER_DIV1_CLOCK ((unsigned int) 0x0) // (TC) Clock selected: TIMER_DIV1_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV2_CLOCK ((unsigned int) 0x1) // (TC) Clock selected: TIMER_DIV2_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV3_CLOCK ((unsigned int) 0x2) // (TC) Clock selected: TIMER_DIV3_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV4_CLOCK ((unsigned int) 0x3) // (TC) Clock selected: TIMER_DIV4_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV5_CLOCK ((unsigned int) 0x4) // (TC) Clock selected: TIMER_DIV5_CLOCK +#define AT91C_TC_CLKS_XC0 ((unsigned int) 0x5) // (TC) Clock selected: XC0 +#define AT91C_TC_CLKS_XC1 ((unsigned int) 0x6) // (TC) Clock selected: XC1 +#define AT91C_TC_CLKS_XC2 ((unsigned int) 0x7) // (TC) Clock selected: XC2 +#define AT91C_TC_CLKI ((unsigned int) 0x1 << 3) // (TC) Clock Invert +#define AT91C_TC_BURST ((unsigned int) 0x3 << 4) // (TC) Burst Signal Selection +#define AT91C_TC_BURST_NONE ((unsigned int) 0x0 << 4) // (TC) The clock is not gated by an external signal +#define AT91C_TC_BURST_XC0 ((unsigned int) 0x1 << 4) // (TC) XC0 is ANDed with the selected clock +#define AT91C_TC_BURST_XC1 ((unsigned int) 0x2 << 4) // (TC) XC1 is ANDed with the selected clock +#define AT91C_TC_BURST_XC2 ((unsigned int) 0x3 << 4) // (TC) XC2 is ANDed with the selected clock +#define AT91C_TC_CPCSTOP ((unsigned int) 0x1 << 6) // (TC) Counter Clock Stopped with RC Compare +#define AT91C_TC_LDBSTOP ((unsigned int) 0x1 << 6) // (TC) Counter Clock Stopped with RB Loading +#define AT91C_TC_CPCDIS ((unsigned int) 0x1 << 7) // (TC) Counter Clock Disable with RC Compare +#define AT91C_TC_LDBDIS ((unsigned int) 0x1 << 7) // (TC) Counter Clock Disabled with RB Loading +#define AT91C_TC_ETRGEDG ((unsigned int) 0x3 << 8) // (TC) External Trigger Edge Selection +#define AT91C_TC_ETRGEDG_NONE ((unsigned int) 0x0 << 8) // (TC) Edge: None +#define AT91C_TC_ETRGEDG_RISING ((unsigned int) 0x1 << 8) // (TC) Edge: rising edge +#define AT91C_TC_ETRGEDG_FALLING ((unsigned int) 0x2 << 8) // (TC) Edge: falling edge +#define AT91C_TC_ETRGEDG_BOTH ((unsigned int) 0x3 << 8) // (TC) Edge: each edge +#define AT91C_TC_EEVTEDG ((unsigned int) 0x3 << 8) // (TC) External Event Edge Selection +#define AT91C_TC_EEVTEDG_NONE ((unsigned int) 0x0 << 8) // (TC) Edge: None +#define AT91C_TC_EEVTEDG_RISING ((unsigned int) 0x1 << 8) // (TC) Edge: rising edge +#define AT91C_TC_EEVTEDG_FALLING ((unsigned int) 0x2 << 8) // (TC) Edge: falling edge +#define AT91C_TC_EEVTEDG_BOTH ((unsigned int) 0x3 << 8) // (TC) Edge: each edge +#define AT91C_TC_EEVT ((unsigned int) 0x3 << 10) // (TC) External Event Selection +#define AT91C_TC_EEVT_TIOB ((unsigned int) 0x0 << 10) // (TC) Signal selected as external event: TIOB TIOB direction: input +#define AT91C_TC_EEVT_XC0 ((unsigned int) 0x1 << 10) // (TC) Signal selected as external event: XC0 TIOB direction: output +#define AT91C_TC_EEVT_XC1 ((unsigned int) 0x2 << 10) // (TC) Signal selected as external event: XC1 TIOB direction: output +#define AT91C_TC_EEVT_XC2 ((unsigned int) 0x3 << 10) // (TC) Signal selected as external event: XC2 TIOB direction: output +#define AT91C_TC_ABETRG ((unsigned int) 0x1 << 10) // (TC) TIOA or TIOB External Trigger Selection +#define AT91C_TC_ENETRG ((unsigned int) 0x1 << 12) // (TC) External Event Trigger enable +#define AT91C_TC_WAVESEL ((unsigned int) 0x3 << 13) // (TC) Waveform Selection +#define AT91C_TC_WAVESEL_UP ((unsigned int) 0x0 << 13) // (TC) UP mode without atomatic trigger on RC Compare +#define AT91C_TC_WAVESEL_UPDOWN ((unsigned int) 0x1 << 13) // (TC) UPDOWN mode without automatic trigger on RC Compare +#define AT91C_TC_WAVESEL_UP_AUTO ((unsigned int) 0x2 << 13) // (TC) UP mode with automatic trigger on RC Compare +#define AT91C_TC_WAVESEL_UPDOWN_AUTO ((unsigned int) 0x3 << 13) // (TC) UPDOWN mode with automatic trigger on RC Compare +#define AT91C_TC_CPCTRG ((unsigned int) 0x1 << 14) // (TC) RC Compare Trigger Enable +#define AT91C_TC_WAVE ((unsigned int) 0x1 << 15) // (TC) +#define AT91C_TC_ACPA ((unsigned int) 0x3 << 16) // (TC) RA Compare Effect on TIOA +#define AT91C_TC_ACPA_NONE ((unsigned int) 0x0 << 16) // (TC) Effect: none +#define AT91C_TC_ACPA_SET ((unsigned int) 0x1 << 16) // (TC) Effect: set +#define AT91C_TC_ACPA_CLEAR ((unsigned int) 0x2 << 16) // (TC) Effect: clear +#define AT91C_TC_ACPA_TOGGLE ((unsigned int) 0x3 << 16) // (TC) Effect: toggle +#define AT91C_TC_LDRA ((unsigned int) 0x3 << 16) // (TC) RA Loading Selection +#define AT91C_TC_LDRA_NONE ((unsigned int) 0x0 << 16) // (TC) Edge: None +#define AT91C_TC_LDRA_RISING ((unsigned int) 0x1 << 16) // (TC) Edge: rising edge of TIOA +#define AT91C_TC_LDRA_FALLING ((unsigned int) 0x2 << 16) // (TC) Edge: falling edge of TIOA +#define AT91C_TC_LDRA_BOTH ((unsigned int) 0x3 << 16) // (TC) Edge: each edge of TIOA +#define AT91C_TC_ACPC ((unsigned int) 0x3 << 18) // (TC) RC Compare Effect on TIOA +#define AT91C_TC_ACPC_NONE ((unsigned int) 0x0 << 18) // (TC) Effect: none +#define AT91C_TC_ACPC_SET ((unsigned int) 0x1 << 18) // (TC) Effect: set +#define AT91C_TC_ACPC_CLEAR ((unsigned int) 0x2 << 18) // (TC) Effect: clear +#define AT91C_TC_ACPC_TOGGLE ((unsigned int) 0x3 << 18) // (TC) Effect: toggle +#define AT91C_TC_LDRB ((unsigned int) 0x3 << 18) // (TC) RB Loading Selection +#define AT91C_TC_LDRB_NONE ((unsigned int) 0x0 << 18) // (TC) Edge: None +#define AT91C_TC_LDRB_RISING ((unsigned int) 0x1 << 18) // (TC) Edge: rising edge of TIOA +#define AT91C_TC_LDRB_FALLING ((unsigned int) 0x2 << 18) // (TC) Edge: falling edge of TIOA +#define AT91C_TC_LDRB_BOTH ((unsigned int) 0x3 << 18) // (TC) Edge: each edge of TIOA +#define AT91C_TC_AEEVT ((unsigned int) 0x3 << 20) // (TC) External Event Effect on TIOA +#define AT91C_TC_AEEVT_NONE ((unsigned int) 0x0 << 20) // (TC) Effect: none +#define AT91C_TC_AEEVT_SET ((unsigned int) 0x1 << 20) // (TC) Effect: set +#define AT91C_TC_AEEVT_CLEAR ((unsigned int) 0x2 << 20) // (TC) Effect: clear +#define AT91C_TC_AEEVT_TOGGLE ((unsigned int) 0x3 << 20) // (TC) Effect: toggle +#define AT91C_TC_ASWTRG ((unsigned int) 0x3 << 22) // (TC) Software Trigger Effect on TIOA +#define AT91C_TC_ASWTRG_NONE ((unsigned int) 0x0 << 22) // (TC) Effect: none +#define AT91C_TC_ASWTRG_SET ((unsigned int) 0x1 << 22) // (TC) Effect: set +#define AT91C_TC_ASWTRG_CLEAR ((unsigned int) 0x2 << 22) // (TC) Effect: clear +#define AT91C_TC_ASWTRG_TOGGLE ((unsigned int) 0x3 << 22) // (TC) Effect: toggle +#define AT91C_TC_BCPB ((unsigned int) 0x3 << 24) // (TC) RB Compare Effect on TIOB +#define AT91C_TC_BCPB_NONE ((unsigned int) 0x0 << 24) // (TC) Effect: none +#define AT91C_TC_BCPB_SET ((unsigned int) 0x1 << 24) // (TC) Effect: set +#define AT91C_TC_BCPB_CLEAR ((unsigned int) 0x2 << 24) // (TC) Effect: clear +#define AT91C_TC_BCPB_TOGGLE ((unsigned int) 0x3 << 24) // (TC) Effect: toggle +#define AT91C_TC_BCPC ((unsigned int) 0x3 << 26) // (TC) RC Compare Effect on TIOB +#define AT91C_TC_BCPC_NONE ((unsigned int) 0x0 << 26) // (TC) Effect: none +#define AT91C_TC_BCPC_SET ((unsigned int) 0x1 << 26) // (TC) Effect: set +#define AT91C_TC_BCPC_CLEAR ((unsigned int) 0x2 << 26) // (TC) Effect: clear +#define AT91C_TC_BCPC_TOGGLE ((unsigned int) 0x3 << 26) // (TC) Effect: toggle +#define AT91C_TC_BEEVT ((unsigned int) 0x3 << 28) // (TC) External Event Effect on TIOB +#define AT91C_TC_BEEVT_NONE ((unsigned int) 0x0 << 28) // (TC) Effect: none +#define AT91C_TC_BEEVT_SET ((unsigned int) 0x1 << 28) // (TC) Effect: set +#define AT91C_TC_BEEVT_CLEAR ((unsigned int) 0x2 << 28) // (TC) Effect: clear +#define AT91C_TC_BEEVT_TOGGLE ((unsigned int) 0x3 << 28) // (TC) Effect: toggle +#define AT91C_TC_BSWTRG ((unsigned int) 0x3 << 30) // (TC) Software Trigger Effect on TIOB +#define AT91C_TC_BSWTRG_NONE ((unsigned int) 0x0 << 30) // (TC) Effect: none +#define AT91C_TC_BSWTRG_SET ((unsigned int) 0x1 << 30) // (TC) Effect: set +#define AT91C_TC_BSWTRG_CLEAR ((unsigned int) 0x2 << 30) // (TC) Effect: clear +#define AT91C_TC_BSWTRG_TOGGLE ((unsigned int) 0x3 << 30) // (TC) Effect: toggle +// -------- TC_SR : (TC Offset: 0x20) TC Channel Status Register -------- +#define AT91C_TC_COVFS ((unsigned int) 0x1 << 0) // (TC) Counter Overflow +#define AT91C_TC_LOVRS ((unsigned int) 0x1 << 1) // (TC) Load Overrun +#define AT91C_TC_CPAS ((unsigned int) 0x1 << 2) // (TC) RA Compare +#define AT91C_TC_CPBS ((unsigned int) 0x1 << 3) // (TC) RB Compare +#define AT91C_TC_CPCS ((unsigned int) 0x1 << 4) // (TC) RC Compare +#define AT91C_TC_LDRAS ((unsigned int) 0x1 << 5) // (TC) RA Loading +#define AT91C_TC_LDRBS ((unsigned int) 0x1 << 6) // (TC) RB Loading +#define AT91C_TC_ETRGS ((unsigned int) 0x1 << 7) // (TC) External Trigger +#define AT91C_TC_CLKSTA ((unsigned int) 0x1 << 16) // (TC) Clock Enabling +#define AT91C_TC_MTIOA ((unsigned int) 0x1 << 17) // (TC) TIOA Mirror +#define AT91C_TC_MTIOB ((unsigned int) 0x1 << 18) // (TC) TIOA Mirror +// -------- TC_IER : (TC Offset: 0x24) TC Channel Interrupt Enable Register -------- +// -------- TC_IDR : (TC Offset: 0x28) TC Channel Interrupt Disable Register -------- +// -------- TC_IMR : (TC Offset: 0x2c) TC Channel Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Timer Counter Interface +// ***************************************************************************** +typedef struct _AT91S_TCB { + AT91S_TC TCB_TC0; // TC Channel 0 + AT91_REG Reserved0[4]; // + AT91S_TC TCB_TC1; // TC Channel 1 + AT91_REG Reserved1[4]; // + AT91S_TC TCB_TC2; // TC Channel 2 + AT91_REG Reserved2[4]; // + AT91_REG TCB_BCR; // TC Block Control Register + AT91_REG TCB_BMR; // TC Block Mode Register +} AT91S_TCB, *AT91PS_TCB; + +// -------- TCB_BCR : (TCB Offset: 0xc0) TC Block Control Register -------- +#define AT91C_TCB_SYNC ((unsigned int) 0x1 << 0) // (TCB) Synchro Command +// -------- TCB_BMR : (TCB Offset: 0xc4) TC Block Mode Register -------- +#define AT91C_TCB_TC0XC0S ((unsigned int) 0x3 << 0) // (TCB) External Clock Signal 0 Selection +#define AT91C_TCB_TC0XC0S_TCLK0 ((unsigned int) 0x0) // (TCB) TCLK0 connected to XC0 +#define AT91C_TCB_TC0XC0S_NONE ((unsigned int) 0x1) // (TCB) None signal connected to XC0 +#define AT91C_TCB_TC0XC0S_TIOA1 ((unsigned int) 0x2) // (TCB) TIOA1 connected to XC0 +#define AT91C_TCB_TC0XC0S_TIOA2 ((unsigned int) 0x3) // (TCB) TIOA2 connected to XC0 +#define AT91C_TCB_TC1XC1S ((unsigned int) 0x3 << 2) // (TCB) External Clock Signal 1 Selection +#define AT91C_TCB_TC1XC1S_TCLK1 ((unsigned int) 0x0 << 2) // (TCB) TCLK1 connected to XC1 +#define AT91C_TCB_TC1XC1S_NONE ((unsigned int) 0x1 << 2) // (TCB) None signal connected to XC1 +#define AT91C_TCB_TC1XC1S_TIOA0 ((unsigned int) 0x2 << 2) // (TCB) TIOA0 connected to XC1 +#define AT91C_TCB_TC1XC1S_TIOA2 ((unsigned int) 0x3 << 2) // (TCB) TIOA2 connected to XC1 +#define AT91C_TCB_TC2XC2S ((unsigned int) 0x3 << 4) // (TCB) External Clock Signal 2 Selection +#define AT91C_TCB_TC2XC2S_TCLK2 ((unsigned int) 0x0 << 4) // (TCB) TCLK2 connected to XC2 +#define AT91C_TCB_TC2XC2S_NONE ((unsigned int) 0x1 << 4) // (TCB) None signal connected to XC2 +#define AT91C_TCB_TC2XC2S_TIOA0 ((unsigned int) 0x2 << 4) // (TCB) TIOA0 connected to XC2 +#define AT91C_TCB_TC2XC2S_TIOA1 ((unsigned int) 0x3 << 4) // (TCB) TIOA2 connected to XC2 + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Control Area Network MailBox Interface +// ***************************************************************************** +typedef struct _AT91S_CAN_MB { + AT91_REG CAN_MB_MMR; // MailBox Mode Register + AT91_REG CAN_MB_MAM; // MailBox Acceptance Mask Register + AT91_REG CAN_MB_MID; // MailBox ID Register + AT91_REG CAN_MB_MFID; // MailBox Family ID Register + AT91_REG CAN_MB_MSR; // MailBox Status Register + AT91_REG CAN_MB_MDL; // MailBox Data Low Register + AT91_REG CAN_MB_MDH; // MailBox Data High Register + AT91_REG CAN_MB_MCR; // MailBox Control Register +} AT91S_CAN_MB, *AT91PS_CAN_MB; + +// -------- CAN_MMR : (CAN_MB Offset: 0x0) CAN Message Mode Register -------- +#define AT91C_CAN_MTIMEMARK ((unsigned int) 0xFFFF << 0) // (CAN_MB) Mailbox Timemark +#define AT91C_CAN_PRIOR ((unsigned int) 0xF << 16) // (CAN_MB) Mailbox Priority +#define AT91C_CAN_MOT ((unsigned int) 0x7 << 24) // (CAN_MB) Mailbox Object Type +#define AT91C_CAN_MOT_DIS ((unsigned int) 0x0 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_RX ((unsigned int) 0x1 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_RXOVERWRITE ((unsigned int) 0x2 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_TX ((unsigned int) 0x3 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_CONSUMER ((unsigned int) 0x4 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_PRODUCER ((unsigned int) 0x5 << 24) // (CAN_MB) +// -------- CAN_MAM : (CAN_MB Offset: 0x4) CAN Message Acceptance Mask Register -------- +#define AT91C_CAN_MIDvB ((unsigned int) 0x3FFFF << 0) // (CAN_MB) Complementary bits for identifier in extended mode +#define AT91C_CAN_MIDvA ((unsigned int) 0x7FF << 18) // (CAN_MB) Identifier for standard frame mode +#define AT91C_CAN_MIDE ((unsigned int) 0x1 << 29) // (CAN_MB) Identifier Version +// -------- CAN_MID : (CAN_MB Offset: 0x8) CAN Message ID Register -------- +// -------- CAN_MFID : (CAN_MB Offset: 0xc) CAN Message Family ID Register -------- +// -------- CAN_MSR : (CAN_MB Offset: 0x10) CAN Message Status Register -------- +#define AT91C_CAN_MTIMESTAMP ((unsigned int) 0xFFFF << 0) // (CAN_MB) Timer Value +#define AT91C_CAN_MDLC ((unsigned int) 0xF << 16) // (CAN_MB) Mailbox Data Length Code +#define AT91C_CAN_MRTR ((unsigned int) 0x1 << 20) // (CAN_MB) Mailbox Remote Transmission Request +#define AT91C_CAN_MABT ((unsigned int) 0x1 << 22) // (CAN_MB) Mailbox Message Abort +#define AT91C_CAN_MRDY ((unsigned int) 0x1 << 23) // (CAN_MB) Mailbox Ready +#define AT91C_CAN_MMI ((unsigned int) 0x1 << 24) // (CAN_MB) Mailbox Message Ignored +// -------- CAN_MDL : (CAN_MB Offset: 0x14) CAN Message Data Low Register -------- +// -------- CAN_MDH : (CAN_MB Offset: 0x18) CAN Message Data High Register -------- +// -------- CAN_MCR : (CAN_MB Offset: 0x1c) CAN Message Control Register -------- +#define AT91C_CAN_MACR ((unsigned int) 0x1 << 22) // (CAN_MB) Abort Request for Mailbox +#define AT91C_CAN_MTCR ((unsigned int) 0x1 << 23) // (CAN_MB) Mailbox Transfer Command + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Control Area Network Interface +// ***************************************************************************** +typedef struct _AT91S_CAN { + AT91_REG CAN_MR; // Mode Register + AT91_REG CAN_IER; // Interrupt Enable Register + AT91_REG CAN_IDR; // Interrupt Disable Register + AT91_REG CAN_IMR; // Interrupt Mask Register + AT91_REG CAN_SR; // Status Register + AT91_REG CAN_BR; // Baudrate Register + AT91_REG CAN_TIM; // Timer Register + AT91_REG CAN_TIMESTP; // Time Stamp Register + AT91_REG CAN_ECR; // Error Counter Register + AT91_REG CAN_TCR; // Transfer Command Register + AT91_REG CAN_ACR; // Abort Command Register + AT91_REG Reserved0[52]; // + AT91_REG CAN_VR; // Version Register + AT91_REG Reserved1[64]; // + AT91S_CAN_MB CAN_MB0; // CAN Mailbox 0 + AT91S_CAN_MB CAN_MB1; // CAN Mailbox 1 + AT91S_CAN_MB CAN_MB2; // CAN Mailbox 2 + AT91S_CAN_MB CAN_MB3; // CAN Mailbox 3 + AT91S_CAN_MB CAN_MB4; // CAN Mailbox 4 + AT91S_CAN_MB CAN_MB5; // CAN Mailbox 5 + AT91S_CAN_MB CAN_MB6; // CAN Mailbox 6 + AT91S_CAN_MB CAN_MB7; // CAN Mailbox 7 + AT91S_CAN_MB CAN_MB8; // CAN Mailbox 8 + AT91S_CAN_MB CAN_MB9; // CAN Mailbox 9 + AT91S_CAN_MB CAN_MB10; // CAN Mailbox 10 + AT91S_CAN_MB CAN_MB11; // CAN Mailbox 11 + AT91S_CAN_MB CAN_MB12; // CAN Mailbox 12 + AT91S_CAN_MB CAN_MB13; // CAN Mailbox 13 + AT91S_CAN_MB CAN_MB14; // CAN Mailbox 14 + AT91S_CAN_MB CAN_MB15; // CAN Mailbox 15 +} AT91S_CAN, *AT91PS_CAN; + +// -------- CAN_MR : (CAN Offset: 0x0) CAN Mode Register -------- +#define AT91C_CAN_CANEN ((unsigned int) 0x1 << 0) // (CAN) CAN Controller Enable +#define AT91C_CAN_LPM ((unsigned int) 0x1 << 1) // (CAN) Disable/Enable Low Power Mode +#define AT91C_CAN_ABM ((unsigned int) 0x1 << 2) // (CAN) Disable/Enable Autobaud/Listen Mode +#define AT91C_CAN_OVL ((unsigned int) 0x1 << 3) // (CAN) Disable/Enable Overload Frame +#define AT91C_CAN_TEOF ((unsigned int) 0x1 << 4) // (CAN) Time Stamp messages at each end of Frame +#define AT91C_CAN_TTM ((unsigned int) 0x1 << 5) // (CAN) Disable/Enable Time Trigger Mode +#define AT91C_CAN_TIMFRZ ((unsigned int) 0x1 << 6) // (CAN) Enable Timer Freeze +#define AT91C_CAN_DRPT ((unsigned int) 0x1 << 7) // (CAN) Disable Repeat +// -------- CAN_IER : (CAN Offset: 0x4) CAN Interrupt Enable Register -------- +#define AT91C_CAN_MB0 ((unsigned int) 0x1 << 0) // (CAN) Mailbox 0 Flag +#define AT91C_CAN_MB1 ((unsigned int) 0x1 << 1) // (CAN) Mailbox 1 Flag +#define AT91C_CAN_MB2 ((unsigned int) 0x1 << 2) // (CAN) Mailbox 2 Flag +#define AT91C_CAN_MB3 ((unsigned int) 0x1 << 3) // (CAN) Mailbox 3 Flag +#define AT91C_CAN_MB4 ((unsigned int) 0x1 << 4) // (CAN) Mailbox 4 Flag +#define AT91C_CAN_MB5 ((unsigned int) 0x1 << 5) // (CAN) Mailbox 5 Flag +#define AT91C_CAN_MB6 ((unsigned int) 0x1 << 6) // (CAN) Mailbox 6 Flag +#define AT91C_CAN_MB7 ((unsigned int) 0x1 << 7) // (CAN) Mailbox 7 Flag +#define AT91C_CAN_MB8 ((unsigned int) 0x1 << 8) // (CAN) Mailbox 8 Flag +#define AT91C_CAN_MB9 ((unsigned int) 0x1 << 9) // (CAN) Mailbox 9 Flag +#define AT91C_CAN_MB10 ((unsigned int) 0x1 << 10) // (CAN) Mailbox 10 Flag +#define AT91C_CAN_MB11 ((unsigned int) 0x1 << 11) // (CAN) Mailbox 11 Flag +#define AT91C_CAN_MB12 ((unsigned int) 0x1 << 12) // (CAN) Mailbox 12 Flag +#define AT91C_CAN_MB13 ((unsigned int) 0x1 << 13) // (CAN) Mailbox 13 Flag +#define AT91C_CAN_MB14 ((unsigned int) 0x1 << 14) // (CAN) Mailbox 14 Flag +#define AT91C_CAN_MB15 ((unsigned int) 0x1 << 15) // (CAN) Mailbox 15 Flag +#define AT91C_CAN_ERRA ((unsigned int) 0x1 << 16) // (CAN) Error Active Mode Flag +#define AT91C_CAN_WARN ((unsigned int) 0x1 << 17) // (CAN) Warning Limit Flag +#define AT91C_CAN_ERRP ((unsigned int) 0x1 << 18) // (CAN) Error Passive Mode Flag +#define AT91C_CAN_BOFF ((unsigned int) 0x1 << 19) // (CAN) Bus Off Mode Flag +#define AT91C_CAN_SLEEP ((unsigned int) 0x1 << 20) // (CAN) Sleep Flag +#define AT91C_CAN_WAKEUP ((unsigned int) 0x1 << 21) // (CAN) Wakeup Flag +#define AT91C_CAN_TOVF ((unsigned int) 0x1 << 22) // (CAN) Timer Overflow Flag +#define AT91C_CAN_TSTP ((unsigned int) 0x1 << 23) // (CAN) Timestamp Flag +#define AT91C_CAN_CERR ((unsigned int) 0x1 << 24) // (CAN) CRC Error +#define AT91C_CAN_SERR ((unsigned int) 0x1 << 25) // (CAN) Stuffing Error +#define AT91C_CAN_AERR ((unsigned int) 0x1 << 26) // (CAN) Acknowledgment Error +#define AT91C_CAN_FERR ((unsigned int) 0x1 << 27) // (CAN) Form Error +#define AT91C_CAN_BERR ((unsigned int) 0x1 << 28) // (CAN) Bit Error +// -------- CAN_IDR : (CAN Offset: 0x8) CAN Interrupt Disable Register -------- +// -------- CAN_IMR : (CAN Offset: 0xc) CAN Interrupt Mask Register -------- +// -------- CAN_SR : (CAN Offset: 0x10) CAN Status Register -------- +#define AT91C_CAN_RBSY ((unsigned int) 0x1 << 29) // (CAN) Receiver Busy +#define AT91C_CAN_TBSY ((unsigned int) 0x1 << 30) // (CAN) Transmitter Busy +#define AT91C_CAN_OVLY ((unsigned int) 0x1 << 31) // (CAN) Overload Busy +// -------- CAN_BR : (CAN Offset: 0x14) CAN Baudrate Register -------- +#define AT91C_CAN_PHASE2 ((unsigned int) 0x7 << 0) // (CAN) Phase 2 segment +#define AT91C_CAN_PHASE1 ((unsigned int) 0x7 << 4) // (CAN) Phase 1 segment +#define AT91C_CAN_PROPAG ((unsigned int) 0x7 << 8) // (CAN) Programmation time segment +#define AT91C_CAN_SYNC ((unsigned int) 0x3 << 12) // (CAN) Re-synchronization jump width segment +#define AT91C_CAN_BRP ((unsigned int) 0x7F << 16) // (CAN) Baudrate Prescaler +#define AT91C_CAN_SMP ((unsigned int) 0x1 << 24) // (CAN) Sampling mode +// -------- CAN_TIM : (CAN Offset: 0x18) CAN Timer Register -------- +#define AT91C_CAN_TIMER ((unsigned int) 0xFFFF << 0) // (CAN) Timer field +// -------- CAN_TIMESTP : (CAN Offset: 0x1c) CAN Timestamp Register -------- +// -------- CAN_ECR : (CAN Offset: 0x20) CAN Error Counter Register -------- +#define AT91C_CAN_REC ((unsigned int) 0xFF << 0) // (CAN) Receive Error Counter +#define AT91C_CAN_TEC ((unsigned int) 0xFF << 16) // (CAN) Transmit Error Counter +// -------- CAN_TCR : (CAN Offset: 0x24) CAN Transfer Command Register -------- +#define AT91C_CAN_TIMRST ((unsigned int) 0x1 << 31) // (CAN) Timer Reset Field +// -------- CAN_ACR : (CAN Offset: 0x28) CAN Abort Command Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Ethernet MAC 10/100 +// ***************************************************************************** +typedef struct _AT91S_EMAC { + AT91_REG EMAC_NCR; // Network Control Register + AT91_REG EMAC_NCFGR; // Network Configuration Register + AT91_REG EMAC_NSR; // Network Status Register + AT91_REG Reserved0[2]; // + AT91_REG EMAC_TSR; // Transmit Status Register + AT91_REG EMAC_RBQP; // Receive Buffer Queue Pointer + AT91_REG EMAC_TBQP; // Transmit Buffer Queue Pointer + AT91_REG EMAC_RSR; // Receive Status Register + AT91_REG EMAC_ISR; // Interrupt Status Register + AT91_REG EMAC_IER; // Interrupt Enable Register + AT91_REG EMAC_IDR; // Interrupt Disable Register + AT91_REG EMAC_IMR; // Interrupt Mask Register + AT91_REG EMAC_MAN; // PHY Maintenance Register + AT91_REG EMAC_PTR; // Pause Time Register + AT91_REG EMAC_PFR; // Pause Frames received Register + AT91_REG EMAC_FTO; // Frames Transmitted OK Register + AT91_REG EMAC_SCF; // Single Collision Frame Register + AT91_REG EMAC_MCF; // Multiple Collision Frame Register + AT91_REG EMAC_FRO; // Frames Received OK Register + AT91_REG EMAC_FCSE; // Frame Check Sequence Error Register + AT91_REG EMAC_ALE; // Alignment Error Register + AT91_REG EMAC_DTF; // Deferred Transmission Frame Register + AT91_REG EMAC_LCOL; // Late Collision Register + AT91_REG EMAC_ECOL; // Excessive Collision Register + AT91_REG EMAC_TUND; // Transmit Underrun Error Register + AT91_REG EMAC_CSE; // Carrier Sense Error Register + AT91_REG EMAC_RRE; // Receive Ressource Error Register + AT91_REG EMAC_ROV; // Receive Overrun Errors Register + AT91_REG EMAC_RSE; // Receive Symbol Errors Register + AT91_REG EMAC_ELE; // Excessive Length Errors Register + AT91_REG EMAC_RJA; // Receive Jabbers Register + AT91_REG EMAC_USF; // Undersize Frames Register + AT91_REG EMAC_STE; // SQE Test Error Register + AT91_REG EMAC_RLE; // Receive Length Field Mismatch Register + AT91_REG EMAC_TPF; // Transmitted Pause Frames Register + AT91_REG EMAC_HRB; // Hash Address Bottom[31:0] + AT91_REG EMAC_HRT; // Hash Address Top[63:32] + AT91_REG EMAC_SA1L; // Specific Address 1 Bottom, First 4 bytes + AT91_REG EMAC_SA1H; // Specific Address 1 Top, Last 2 bytes + AT91_REG EMAC_SA2L; // Specific Address 2 Bottom, First 4 bytes + AT91_REG EMAC_SA2H; // Specific Address 2 Top, Last 2 bytes + AT91_REG EMAC_SA3L; // Specific Address 3 Bottom, First 4 bytes + AT91_REG EMAC_SA3H; // Specific Address 3 Top, Last 2 bytes + AT91_REG EMAC_SA4L; // Specific Address 4 Bottom, First 4 bytes + AT91_REG EMAC_SA4H; // Specific Address 4 Top, Last 2 bytes + AT91_REG EMAC_TID; // Type ID Checking Register + AT91_REG EMAC_TPQ; // Transmit Pause Quantum Register + AT91_REG EMAC_USRIO; // USER Input/Output Register + AT91_REG EMAC_WOL; // Wake On LAN Register + AT91_REG Reserved1[13]; // + AT91_REG EMAC_REV; // Revision Register +} AT91S_EMAC, *AT91PS_EMAC; + +// -------- EMAC_NCR : (EMAC Offset: 0x0) -------- +#define AT91C_EMAC_LB ((unsigned int) 0x1 << 0) // (EMAC) Loopback. Optional. When set, loopback signal is at high level. +#define AT91C_EMAC_LLB ((unsigned int) 0x1 << 1) // (EMAC) Loopback local. +#define AT91C_EMAC_RE ((unsigned int) 0x1 << 2) // (EMAC) Receive enable. +#define AT91C_EMAC_TE ((unsigned int) 0x1 << 3) // (EMAC) Transmit enable. +#define AT91C_EMAC_MPE ((unsigned int) 0x1 << 4) // (EMAC) Management port enable. +#define AT91C_EMAC_CLRSTAT ((unsigned int) 0x1 << 5) // (EMAC) Clear statistics registers. +#define AT91C_EMAC_INCSTAT ((unsigned int) 0x1 << 6) // (EMAC) Increment statistics registers. +#define AT91C_EMAC_WESTAT ((unsigned int) 0x1 << 7) // (EMAC) Write enable for statistics registers. +#define AT91C_EMAC_BP ((unsigned int) 0x1 << 8) // (EMAC) Back pressure. +#define AT91C_EMAC_TSTART ((unsigned int) 0x1 << 9) // (EMAC) Start Transmission. +#define AT91C_EMAC_THALT ((unsigned int) 0x1 << 10) // (EMAC) Transmission Halt. +#define AT91C_EMAC_TPFR ((unsigned int) 0x1 << 11) // (EMAC) Transmit pause frame +#define AT91C_EMAC_TZQ ((unsigned int) 0x1 << 12) // (EMAC) Transmit zero quantum pause frame +// -------- EMAC_NCFGR : (EMAC Offset: 0x4) Network Configuration Register -------- +#define AT91C_EMAC_SPD ((unsigned int) 0x1 << 0) // (EMAC) Speed. +#define AT91C_EMAC_FD ((unsigned int) 0x1 << 1) // (EMAC) Full duplex. +#define AT91C_EMAC_JFRAME ((unsigned int) 0x1 << 3) // (EMAC) Jumbo Frames. +#define AT91C_EMAC_CAF ((unsigned int) 0x1 << 4) // (EMAC) Copy all frames. +#define AT91C_EMAC_NBC ((unsigned int) 0x1 << 5) // (EMAC) No broadcast. +#define AT91C_EMAC_MTI ((unsigned int) 0x1 << 6) // (EMAC) Multicast hash event enable +#define AT91C_EMAC_UNI ((unsigned int) 0x1 << 7) // (EMAC) Unicast hash enable. +#define AT91C_EMAC_BIG ((unsigned int) 0x1 << 8) // (EMAC) Receive 1522 bytes. +#define AT91C_EMAC_EAE ((unsigned int) 0x1 << 9) // (EMAC) External address match enable. +#define AT91C_EMAC_CLK ((unsigned int) 0x3 << 10) // (EMAC) +#define AT91C_EMAC_CLK_HCLK_8 ((unsigned int) 0x0 << 10) // (EMAC) HCLK divided by 8 +#define AT91C_EMAC_CLK_HCLK_16 ((unsigned int) 0x1 << 10) // (EMAC) HCLK divided by 16 +#define AT91C_EMAC_CLK_HCLK_32 ((unsigned int) 0x2 << 10) // (EMAC) HCLK divided by 32 +#define AT91C_EMAC_CLK_HCLK_64 ((unsigned int) 0x3 << 10) // (EMAC) HCLK divided by 64 +#define AT91C_EMAC_RTY ((unsigned int) 0x1 << 12) // (EMAC) +#define AT91C_EMAC_PAE ((unsigned int) 0x1 << 13) // (EMAC) +#define AT91C_EMAC_RBOF ((unsigned int) 0x3 << 14) // (EMAC) +#define AT91C_EMAC_RBOF_OFFSET_0 ((unsigned int) 0x0 << 14) // (EMAC) no offset from start of receive buffer +#define AT91C_EMAC_RBOF_OFFSET_1 ((unsigned int) 0x1 << 14) // (EMAC) one byte offset from start of receive buffer +#define AT91C_EMAC_RBOF_OFFSET_2 ((unsigned int) 0x2 << 14) // (EMAC) two bytes offset from start of receive buffer +#define AT91C_EMAC_RBOF_OFFSET_3 ((unsigned int) 0x3 << 14) // (EMAC) three bytes offset from start of receive buffer +#define AT91C_EMAC_RLCE ((unsigned int) 0x1 << 16) // (EMAC) Receive Length field Checking Enable +#define AT91C_EMAC_DRFCS ((unsigned int) 0x1 << 17) // (EMAC) Discard Receive FCS +#define AT91C_EMAC_EFRHD ((unsigned int) 0x1 << 18) // (EMAC) +#define AT91C_EMAC_IRXFCS ((unsigned int) 0x1 << 19) // (EMAC) Ignore RX FCS +// -------- EMAC_NSR : (EMAC Offset: 0x8) Network Status Register -------- +#define AT91C_EMAC_LINKR ((unsigned int) 0x1 << 0) // (EMAC) +#define AT91C_EMAC_MDIO ((unsigned int) 0x1 << 1) // (EMAC) +#define AT91C_EMAC_IDLE ((unsigned int) 0x1 << 2) // (EMAC) +// -------- EMAC_TSR : (EMAC Offset: 0x14) Transmit Status Register -------- +#define AT91C_EMAC_UBR ((unsigned int) 0x1 << 0) // (EMAC) +#define AT91C_EMAC_COL ((unsigned int) 0x1 << 1) // (EMAC) +#define AT91C_EMAC_RLES ((unsigned int) 0x1 << 2) // (EMAC) +#define AT91C_EMAC_TGO ((unsigned int) 0x1 << 3) // (EMAC) Transmit Go +#define AT91C_EMAC_BEX ((unsigned int) 0x1 << 4) // (EMAC) Buffers exhausted mid frame +#define AT91C_EMAC_COMP ((unsigned int) 0x1 << 5) // (EMAC) +#define AT91C_EMAC_UND ((unsigned int) 0x1 << 6) // (EMAC) +// -------- EMAC_RSR : (EMAC Offset: 0x20) Receive Status Register -------- +#define AT91C_EMAC_BNA ((unsigned int) 0x1 << 0) // (EMAC) +#define AT91C_EMAC_REC ((unsigned int) 0x1 << 1) // (EMAC) +#define AT91C_EMAC_OVR ((unsigned int) 0x1 << 2) // (EMAC) +// -------- EMAC_ISR : (EMAC Offset: 0x24) Interrupt Status Register -------- +#define AT91C_EMAC_MFD ((unsigned int) 0x1 << 0) // (EMAC) +#define AT91C_EMAC_RCOMP ((unsigned int) 0x1 << 1) // (EMAC) +#define AT91C_EMAC_RXUBR ((unsigned int) 0x1 << 2) // (EMAC) +#define AT91C_EMAC_TXUBR ((unsigned int) 0x1 << 3) // (EMAC) +#define AT91C_EMAC_TUNDR ((unsigned int) 0x1 << 4) // (EMAC) +#define AT91C_EMAC_RLEX ((unsigned int) 0x1 << 5) // (EMAC) +#define AT91C_EMAC_TXERR ((unsigned int) 0x1 << 6) // (EMAC) +#define AT91C_EMAC_TCOMP ((unsigned int) 0x1 << 7) // (EMAC) +#define AT91C_EMAC_LINK ((unsigned int) 0x1 << 9) // (EMAC) +#define AT91C_EMAC_ROVR ((unsigned int) 0x1 << 10) // (EMAC) +#define AT91C_EMAC_HRESP ((unsigned int) 0x1 << 11) // (EMAC) +#define AT91C_EMAC_PFRE ((unsigned int) 0x1 << 12) // (EMAC) +#define AT91C_EMAC_PTZ ((unsigned int) 0x1 << 13) // (EMAC) +// -------- EMAC_IER : (EMAC Offset: 0x28) Interrupt Enable Register -------- +// -------- EMAC_IDR : (EMAC Offset: 0x2c) Interrupt Disable Register -------- +// -------- EMAC_IMR : (EMAC Offset: 0x30) Interrupt Mask Register -------- +// -------- EMAC_MAN : (EMAC Offset: 0x34) PHY Maintenance Register -------- +#define AT91C_EMAC_DATA ((unsigned int) 0xFFFF << 0) // (EMAC) +#define AT91C_EMAC_CODE ((unsigned int) 0x3 << 16) // (EMAC) +#define AT91C_EMAC_REGA ((unsigned int) 0x1F << 18) // (EMAC) +#define AT91C_EMAC_PHYA ((unsigned int) 0x1F << 23) // (EMAC) +#define AT91C_EMAC_RW ((unsigned int) 0x3 << 28) // (EMAC) +#define AT91C_EMAC_SOF ((unsigned int) 0x3 << 30) // (EMAC) +// -------- EMAC_USRIO : (EMAC Offset: 0xc0) USER Input Output Register -------- +#define AT91C_EMAC_RMII ((unsigned int) 0x1 << 0) // (EMAC) Reduce MII +// -------- EMAC_WOL : (EMAC Offset: 0xc4) Wake On LAN Register -------- +#define AT91C_EMAC_IP ((unsigned int) 0xFFFF << 0) // (EMAC) ARP request IP address +#define AT91C_EMAC_MAG ((unsigned int) 0x1 << 16) // (EMAC) Magic packet event enable +#define AT91C_EMAC_ARP ((unsigned int) 0x1 << 17) // (EMAC) ARP request event enable +#define AT91C_EMAC_SA1 ((unsigned int) 0x1 << 18) // (EMAC) Specific address register 1 event enable +// -------- EMAC_REV : (EMAC Offset: 0xfc) Revision Register -------- +#define AT91C_EMAC_REVREF ((unsigned int) 0xFFFF << 0) // (EMAC) +#define AT91C_EMAC_PARTREF ((unsigned int) 0xFFFF << 16) // (EMAC) + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Analog to Digital Convertor +// ***************************************************************************** +typedef struct _AT91S_ADC { + AT91_REG ADC_CR; // ADC Control Register + AT91_REG ADC_MR; // ADC Mode Register + AT91_REG Reserved0[2]; // + AT91_REG ADC_CHER; // ADC Channel Enable Register + AT91_REG ADC_CHDR; // ADC Channel Disable Register + AT91_REG ADC_CHSR; // ADC Channel Status Register + AT91_REG ADC_SR; // ADC Status Register + AT91_REG ADC_LCDR; // ADC Last Converted Data Register + AT91_REG ADC_IER; // ADC Interrupt Enable Register + AT91_REG ADC_IDR; // ADC Interrupt Disable Register + AT91_REG ADC_IMR; // ADC Interrupt Mask Register + AT91_REG ADC_CDR0; // ADC Channel Data Register 0 + AT91_REG ADC_CDR1; // ADC Channel Data Register 1 + AT91_REG ADC_CDR2; // ADC Channel Data Register 2 + AT91_REG ADC_CDR3; // ADC Channel Data Register 3 + AT91_REG ADC_CDR4; // ADC Channel Data Register 4 + AT91_REG ADC_CDR5; // ADC Channel Data Register 5 + AT91_REG ADC_CDR6; // ADC Channel Data Register 6 + AT91_REG ADC_CDR7; // ADC Channel Data Register 7 + AT91_REG Reserved1[44]; // + AT91_REG ADC_RPR; // Receive Pointer Register + AT91_REG ADC_RCR; // Receive Counter Register + AT91_REG ADC_TPR; // Transmit Pointer Register + AT91_REG ADC_TCR; // Transmit Counter Register + AT91_REG ADC_RNPR; // Receive Next Pointer Register + AT91_REG ADC_RNCR; // Receive Next Counter Register + AT91_REG ADC_TNPR; // Transmit Next Pointer Register + AT91_REG ADC_TNCR; // Transmit Next Counter Register + AT91_REG ADC_PTCR; // PDC Transfer Control Register + AT91_REG ADC_PTSR; // PDC Transfer Status Register +} AT91S_ADC, *AT91PS_ADC; + +// -------- ADC_CR : (ADC Offset: 0x0) ADC Control Register -------- +#define AT91C_ADC_SWRST ((unsigned int) 0x1 << 0) // (ADC) Software Reset +#define AT91C_ADC_START ((unsigned int) 0x1 << 1) // (ADC) Start Conversion +// -------- ADC_MR : (ADC Offset: 0x4) ADC Mode Register -------- +#define AT91C_ADC_TRGEN ((unsigned int) 0x1 << 0) // (ADC) Trigger Enable +#define AT91C_ADC_TRGEN_DIS ((unsigned int) 0x0) // (ADC) Hradware triggers are disabled. Starting a conversion is only possible by software +#define AT91C_ADC_TRGEN_EN ((unsigned int) 0x1) // (ADC) Hardware trigger selected by TRGSEL field is enabled. +#define AT91C_ADC_TRGSEL ((unsigned int) 0x7 << 1) // (ADC) Trigger Selection +#define AT91C_ADC_TRGSEL_TIOA0 ((unsigned int) 0x0 << 1) // (ADC) Selected TRGSEL = TIAO0 +#define AT91C_ADC_TRGSEL_TIOA1 ((unsigned int) 0x1 << 1) // (ADC) Selected TRGSEL = TIAO1 +#define AT91C_ADC_TRGSEL_TIOA2 ((unsigned int) 0x2 << 1) // (ADC) Selected TRGSEL = TIAO2 +#define AT91C_ADC_TRGSEL_TIOA3 ((unsigned int) 0x3 << 1) // (ADC) Selected TRGSEL = TIAO3 +#define AT91C_ADC_TRGSEL_TIOA4 ((unsigned int) 0x4 << 1) // (ADC) Selected TRGSEL = TIAO4 +#define AT91C_ADC_TRGSEL_TIOA5 ((unsigned int) 0x5 << 1) // (ADC) Selected TRGSEL = TIAO5 +#define AT91C_ADC_TRGSEL_EXT ((unsigned int) 0x6 << 1) // (ADC) Selected TRGSEL = External Trigger +#define AT91C_ADC_LOWRES ((unsigned int) 0x1 << 4) // (ADC) Resolution. +#define AT91C_ADC_LOWRES_10_BIT ((unsigned int) 0x0 << 4) // (ADC) 10-bit resolution +#define AT91C_ADC_LOWRES_8_BIT ((unsigned int) 0x1 << 4) // (ADC) 8-bit resolution +#define AT91C_ADC_SLEEP ((unsigned int) 0x1 << 5) // (ADC) Sleep Mode +#define AT91C_ADC_SLEEP_NORMAL_MODE ((unsigned int) 0x0 << 5) // (ADC) Normal Mode +#define AT91C_ADC_SLEEP_MODE ((unsigned int) 0x1 << 5) // (ADC) Sleep Mode +#define AT91C_ADC_PRESCAL ((unsigned int) 0x3F << 8) // (ADC) Prescaler rate selection +#define AT91C_ADC_STARTUP ((unsigned int) 0x1F << 16) // (ADC) Startup Time +#define AT91C_ADC_SHTIM ((unsigned int) 0xF << 24) // (ADC) Sample & Hold Time +// -------- ADC_CHER : (ADC Offset: 0x10) ADC Channel Enable Register -------- +#define AT91C_ADC_CH0 ((unsigned int) 0x1 << 0) // (ADC) Channel 0 +#define AT91C_ADC_CH1 ((unsigned int) 0x1 << 1) // (ADC) Channel 1 +#define AT91C_ADC_CH2 ((unsigned int) 0x1 << 2) // (ADC) Channel 2 +#define AT91C_ADC_CH3 ((unsigned int) 0x1 << 3) // (ADC) Channel 3 +#define AT91C_ADC_CH4 ((unsigned int) 0x1 << 4) // (ADC) Channel 4 +#define AT91C_ADC_CH5 ((unsigned int) 0x1 << 5) // (ADC) Channel 5 +#define AT91C_ADC_CH6 ((unsigned int) 0x1 << 6) // (ADC) Channel 6 +#define AT91C_ADC_CH7 ((unsigned int) 0x1 << 7) // (ADC) Channel 7 +// -------- ADC_CHDR : (ADC Offset: 0x14) ADC Channel Disable Register -------- +// -------- ADC_CHSR : (ADC Offset: 0x18) ADC Channel Status Register -------- +// -------- ADC_SR : (ADC Offset: 0x1c) ADC Status Register -------- +#define AT91C_ADC_EOC0 ((unsigned int) 0x1 << 0) // (ADC) End of Conversion +#define AT91C_ADC_EOC1 ((unsigned int) 0x1 << 1) // (ADC) End of Conversion +#define AT91C_ADC_EOC2 ((unsigned int) 0x1 << 2) // (ADC) End of Conversion +#define AT91C_ADC_EOC3 ((unsigned int) 0x1 << 3) // (ADC) End of Conversion +#define AT91C_ADC_EOC4 ((unsigned int) 0x1 << 4) // (ADC) End of Conversion +#define AT91C_ADC_EOC5 ((unsigned int) 0x1 << 5) // (ADC) End of Conversion +#define AT91C_ADC_EOC6 ((unsigned int) 0x1 << 6) // (ADC) End of Conversion +#define AT91C_ADC_EOC7 ((unsigned int) 0x1 << 7) // (ADC) End of Conversion +#define AT91C_ADC_OVRE0 ((unsigned int) 0x1 << 8) // (ADC) Overrun Error +#define AT91C_ADC_OVRE1 ((unsigned int) 0x1 << 9) // (ADC) Overrun Error +#define AT91C_ADC_OVRE2 ((unsigned int) 0x1 << 10) // (ADC) Overrun Error +#define AT91C_ADC_OVRE3 ((unsigned int) 0x1 << 11) // (ADC) Overrun Error +#define AT91C_ADC_OVRE4 ((unsigned int) 0x1 << 12) // (ADC) Overrun Error +#define AT91C_ADC_OVRE5 ((unsigned int) 0x1 << 13) // (ADC) Overrun Error +#define AT91C_ADC_OVRE6 ((unsigned int) 0x1 << 14) // (ADC) Overrun Error +#define AT91C_ADC_OVRE7 ((unsigned int) 0x1 << 15) // (ADC) Overrun Error +#define AT91C_ADC_DRDY ((unsigned int) 0x1 << 16) // (ADC) Data Ready +#define AT91C_ADC_GOVRE ((unsigned int) 0x1 << 17) // (ADC) General Overrun +#define AT91C_ADC_ENDRX ((unsigned int) 0x1 << 18) // (ADC) End of Receiver Transfer +#define AT91C_ADC_RXBUFF ((unsigned int) 0x1 << 19) // (ADC) RXBUFF Interrupt +// -------- ADC_LCDR : (ADC Offset: 0x20) ADC Last Converted Data Register -------- +#define AT91C_ADC_LDATA ((unsigned int) 0x3FF << 0) // (ADC) Last Data Converted +// -------- ADC_IER : (ADC Offset: 0x24) ADC Interrupt Enable Register -------- +// -------- ADC_IDR : (ADC Offset: 0x28) ADC Interrupt Disable Register -------- +// -------- ADC_IMR : (ADC Offset: 0x2c) ADC Interrupt Mask Register -------- +// -------- ADC_CDR0 : (ADC Offset: 0x30) ADC Channel Data Register 0 -------- +#define AT91C_ADC_DATA ((unsigned int) 0x3FF << 0) // (ADC) Converted Data +// -------- ADC_CDR1 : (ADC Offset: 0x34) ADC Channel Data Register 1 -------- +// -------- ADC_CDR2 : (ADC Offset: 0x38) ADC Channel Data Register 2 -------- +// -------- ADC_CDR3 : (ADC Offset: 0x3c) ADC Channel Data Register 3 -------- +// -------- ADC_CDR4 : (ADC Offset: 0x40) ADC Channel Data Register 4 -------- +// -------- ADC_CDR5 : (ADC Offset: 0x44) ADC Channel Data Register 5 -------- +// -------- ADC_CDR6 : (ADC Offset: 0x48) ADC Channel Data Register 6 -------- +// -------- ADC_CDR7 : (ADC Offset: 0x4c) ADC Channel Data Register 7 -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Advanced Encryption Standard +// ***************************************************************************** +typedef struct _AT91S_AES { + AT91_REG AES_CR; // Control Register + AT91_REG AES_MR; // Mode Register + AT91_REG Reserved0[2]; // + AT91_REG AES_IER; // Interrupt Enable Register + AT91_REG AES_IDR; // Interrupt Disable Register + AT91_REG AES_IMR; // Interrupt Mask Register + AT91_REG AES_ISR; // Interrupt Status Register + AT91_REG AES_KEYWxR[4]; // Key Word x Register + AT91_REG Reserved1[4]; // + AT91_REG AES_IDATAxR[4]; // Input Data x Register + AT91_REG AES_ODATAxR[4]; // Output Data x Register + AT91_REG AES_IVxR[4]; // Initialization Vector x Register + AT91_REG Reserved2[35]; // + AT91_REG AES_VR; // AES Version Register + AT91_REG AES_RPR; // Receive Pointer Register + AT91_REG AES_RCR; // Receive Counter Register + AT91_REG AES_TPR; // Transmit Pointer Register + AT91_REG AES_TCR; // Transmit Counter Register + AT91_REG AES_RNPR; // Receive Next Pointer Register + AT91_REG AES_RNCR; // Receive Next Counter Register + AT91_REG AES_TNPR; // Transmit Next Pointer Register + AT91_REG AES_TNCR; // Transmit Next Counter Register + AT91_REG AES_PTCR; // PDC Transfer Control Register + AT91_REG AES_PTSR; // PDC Transfer Status Register +} AT91S_AES, *AT91PS_AES; + +// -------- AES_CR : (AES Offset: 0x0) Control Register -------- +#define AT91C_AES_START ((unsigned int) 0x1 << 0) // (AES) Starts Processing +#define AT91C_AES_SWRST ((unsigned int) 0x1 << 8) // (AES) Software Reset +#define AT91C_AES_LOADSEED ((unsigned int) 0x1 << 16) // (AES) Random Number Generator Seed Loading +// -------- AES_MR : (AES Offset: 0x4) Mode Register -------- +#define AT91C_AES_CIPHER ((unsigned int) 0x1 << 0) // (AES) Processing Mode +#define AT91C_AES_PROCDLY ((unsigned int) 0xF << 4) // (AES) Processing Delay +#define AT91C_AES_SMOD ((unsigned int) 0x3 << 8) // (AES) Start Mode +#define AT91C_AES_SMOD_MANUAL ((unsigned int) 0x0 << 8) // (AES) Manual Mode: The START bit in register AES_CR must be set to begin encryption or decryption. +#define AT91C_AES_SMOD_AUTO ((unsigned int) 0x1 << 8) // (AES) Auto Mode: no action in AES_CR is necessary (cf datasheet). +#define AT91C_AES_SMOD_PDC ((unsigned int) 0x2 << 8) // (AES) PDC Mode (cf datasheet). +#define AT91C_AES_OPMOD ((unsigned int) 0x7 << 12) // (AES) Operation Mode +#define AT91C_AES_OPMOD_ECB ((unsigned int) 0x0 << 12) // (AES) ECB Electronic CodeBook mode. +#define AT91C_AES_OPMOD_CBC ((unsigned int) 0x1 << 12) // (AES) CBC Cipher Block Chaining mode. +#define AT91C_AES_OPMOD_OFB ((unsigned int) 0x2 << 12) // (AES) OFB Output Feedback mode. +#define AT91C_AES_OPMOD_CFB ((unsigned int) 0x3 << 12) // (AES) CFB Cipher Feedback mode. +#define AT91C_AES_OPMOD_CTR ((unsigned int) 0x4 << 12) // (AES) CTR Counter mode. +#define AT91C_AES_LOD ((unsigned int) 0x1 << 15) // (AES) Last Output Data Mode +#define AT91C_AES_CFBS ((unsigned int) 0x7 << 16) // (AES) Cipher Feedback Data Size +#define AT91C_AES_CFBS_128_BIT ((unsigned int) 0x0 << 16) // (AES) 128-bit. +#define AT91C_AES_CFBS_64_BIT ((unsigned int) 0x1 << 16) // (AES) 64-bit. +#define AT91C_AES_CFBS_32_BIT ((unsigned int) 0x2 << 16) // (AES) 32-bit. +#define AT91C_AES_CFBS_16_BIT ((unsigned int) 0x3 << 16) // (AES) 16-bit. +#define AT91C_AES_CFBS_8_BIT ((unsigned int) 0x4 << 16) // (AES) 8-bit. +#define AT91C_AES_CKEY ((unsigned int) 0xF << 20) // (AES) Countermeasure Key +#define AT91C_AES_CTYPE ((unsigned int) 0x1F << 24) // (AES) Countermeasure Type +#define AT91C_AES_CTYPE_TYPE1_EN ((unsigned int) 0x1 << 24) // (AES) Countermeasure type 1 is enabled. +#define AT91C_AES_CTYPE_TYPE2_EN ((unsigned int) 0x2 << 24) // (AES) Countermeasure type 2 is enabled. +#define AT91C_AES_CTYPE_TYPE3_EN ((unsigned int) 0x4 << 24) // (AES) Countermeasure type 3 is enabled. +#define AT91C_AES_CTYPE_TYPE4_EN ((unsigned int) 0x8 << 24) // (AES) Countermeasure type 4 is enabled. +#define AT91C_AES_CTYPE_TYPE5_EN ((unsigned int) 0x10 << 24) // (AES) Countermeasure type 5 is enabled. +// -------- AES_IER : (AES Offset: 0x10) Interrupt Enable Register -------- +#define AT91C_AES_DATRDY ((unsigned int) 0x1 << 0) // (AES) DATRDY +#define AT91C_AES_ENDRX ((unsigned int) 0x1 << 1) // (AES) PDC Read Buffer End +#define AT91C_AES_ENDTX ((unsigned int) 0x1 << 2) // (AES) PDC Write Buffer End +#define AT91C_AES_RXBUFF ((unsigned int) 0x1 << 3) // (AES) PDC Read Buffer Full +#define AT91C_AES_TXBUFE ((unsigned int) 0x1 << 4) // (AES) PDC Write Buffer Empty +#define AT91C_AES_URAD ((unsigned int) 0x1 << 8) // (AES) Unspecified Register Access Detection +// -------- AES_IDR : (AES Offset: 0x14) Interrupt Disable Register -------- +// -------- AES_IMR : (AES Offset: 0x18) Interrupt Mask Register -------- +// -------- AES_ISR : (AES Offset: 0x1c) Interrupt Status Register -------- +#define AT91C_AES_URAT ((unsigned int) 0x7 << 12) // (AES) Unspecified Register Access Type Status +#define AT91C_AES_URAT_IN_DAT_WRITE_DATPROC ((unsigned int) 0x0 << 12) // (AES) Input data register written during the data processing in PDC mode. +#define AT91C_AES_URAT_OUT_DAT_READ_DATPROC ((unsigned int) 0x1 << 12) // (AES) Output data register read during the data processing. +#define AT91C_AES_URAT_MODEREG_WRITE_DATPROC ((unsigned int) 0x2 << 12) // (AES) Mode register written during the data processing. +#define AT91C_AES_URAT_OUT_DAT_READ_SUBKEY ((unsigned int) 0x3 << 12) // (AES) Output data register read during the sub-keys generation. +#define AT91C_AES_URAT_MODEREG_WRITE_SUBKEY ((unsigned int) 0x4 << 12) // (AES) Mode register written during the sub-keys generation. +#define AT91C_AES_URAT_WO_REG_READ ((unsigned int) 0x5 << 12) // (AES) Write-only register read access. + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Triple Data Encryption Standard +// ***************************************************************************** +typedef struct _AT91S_TDES { + AT91_REG TDES_CR; // Control Register + AT91_REG TDES_MR; // Mode Register + AT91_REG Reserved0[2]; // + AT91_REG TDES_IER; // Interrupt Enable Register + AT91_REG TDES_IDR; // Interrupt Disable Register + AT91_REG TDES_IMR; // Interrupt Mask Register + AT91_REG TDES_ISR; // Interrupt Status Register + AT91_REG TDES_KEY1WxR[2]; // Key 1 Word x Register + AT91_REG TDES_KEY2WxR[2]; // Key 2 Word x Register + AT91_REG TDES_KEY3WxR[2]; // Key 3 Word x Register + AT91_REG Reserved1[2]; // + AT91_REG TDES_IDATAxR[2]; // Input Data x Register + AT91_REG Reserved2[2]; // + AT91_REG TDES_ODATAxR[2]; // Output Data x Register + AT91_REG Reserved3[2]; // + AT91_REG TDES_IVxR[2]; // Initialization Vector x Register + AT91_REG Reserved4[37]; // + AT91_REG TDES_VR; // TDES Version Register + AT91_REG TDES_RPR; // Receive Pointer Register + AT91_REG TDES_RCR; // Receive Counter Register + AT91_REG TDES_TPR; // Transmit Pointer Register + AT91_REG TDES_TCR; // Transmit Counter Register + AT91_REG TDES_RNPR; // Receive Next Pointer Register + AT91_REG TDES_RNCR; // Receive Next Counter Register + AT91_REG TDES_TNPR; // Transmit Next Pointer Register + AT91_REG TDES_TNCR; // Transmit Next Counter Register + AT91_REG TDES_PTCR; // PDC Transfer Control Register + AT91_REG TDES_PTSR; // PDC Transfer Status Register +} AT91S_TDES, *AT91PS_TDES; + +// -------- TDES_CR : (TDES Offset: 0x0) Control Register -------- +#define AT91C_TDES_START ((unsigned int) 0x1 << 0) // (TDES) Starts Processing +#define AT91C_TDES_SWRST ((unsigned int) 0x1 << 8) // (TDES) Software Reset +// -------- TDES_MR : (TDES Offset: 0x4) Mode Register -------- +#define AT91C_TDES_CIPHER ((unsigned int) 0x1 << 0) // (TDES) Processing Mode +#define AT91C_TDES_TDESMOD ((unsigned int) 0x1 << 1) // (TDES) Single or Triple DES Mode +#define AT91C_TDES_KEYMOD ((unsigned int) 0x1 << 4) // (TDES) Key Mode +#define AT91C_TDES_SMOD ((unsigned int) 0x3 << 8) // (TDES) Start Mode +#define AT91C_TDES_SMOD_MANUAL ((unsigned int) 0x0 << 8) // (TDES) Manual Mode: The START bit in register TDES_CR must be set to begin encryption or decryption. +#define AT91C_TDES_SMOD_AUTO ((unsigned int) 0x1 << 8) // (TDES) Auto Mode: no action in TDES_CR is necessary (cf datasheet). +#define AT91C_TDES_SMOD_PDC ((unsigned int) 0x2 << 8) // (TDES) PDC Mode (cf datasheet). +#define AT91C_TDES_OPMOD ((unsigned int) 0x3 << 12) // (TDES) Operation Mode +#define AT91C_TDES_OPMOD_ECB ((unsigned int) 0x0 << 12) // (TDES) ECB Electronic CodeBook mode. +#define AT91C_TDES_OPMOD_CBC ((unsigned int) 0x1 << 12) // (TDES) CBC Cipher Block Chaining mode. +#define AT91C_TDES_OPMOD_OFB ((unsigned int) 0x2 << 12) // (TDES) OFB Output Feedback mode. +#define AT91C_TDES_OPMOD_CFB ((unsigned int) 0x3 << 12) // (TDES) CFB Cipher Feedback mode. +#define AT91C_TDES_LOD ((unsigned int) 0x1 << 15) // (TDES) Last Output Data Mode +#define AT91C_TDES_CFBS ((unsigned int) 0x3 << 16) // (TDES) Cipher Feedback Data Size +#define AT91C_TDES_CFBS_64_BIT ((unsigned int) 0x0 << 16) // (TDES) 64-bit. +#define AT91C_TDES_CFBS_32_BIT ((unsigned int) 0x1 << 16) // (TDES) 32-bit. +#define AT91C_TDES_CFBS_16_BIT ((unsigned int) 0x2 << 16) // (TDES) 16-bit. +#define AT91C_TDES_CFBS_8_BIT ((unsigned int) 0x3 << 16) // (TDES) 8-bit. +// -------- TDES_IER : (TDES Offset: 0x10) Interrupt Enable Register -------- +#define AT91C_TDES_DATRDY ((unsigned int) 0x1 << 0) // (TDES) DATRDY +#define AT91C_TDES_ENDRX ((unsigned int) 0x1 << 1) // (TDES) PDC Read Buffer End +#define AT91C_TDES_ENDTX ((unsigned int) 0x1 << 2) // (TDES) PDC Write Buffer End +#define AT91C_TDES_RXBUFF ((unsigned int) 0x1 << 3) // (TDES) PDC Read Buffer Full +#define AT91C_TDES_TXBUFE ((unsigned int) 0x1 << 4) // (TDES) PDC Write Buffer Empty +#define AT91C_TDES_URAD ((unsigned int) 0x1 << 8) // (TDES) Unspecified Register Access Detection +// -------- TDES_IDR : (TDES Offset: 0x14) Interrupt Disable Register -------- +// -------- TDES_IMR : (TDES Offset: 0x18) Interrupt Mask Register -------- +// -------- TDES_ISR : (TDES Offset: 0x1c) Interrupt Status Register -------- +#define AT91C_TDES_URAT ((unsigned int) 0x3 << 12) // (TDES) Unspecified Register Access Type Status +#define AT91C_TDES_URAT_IN_DAT_WRITE_DATPROC ((unsigned int) 0x0 << 12) // (TDES) Input data register written during the data processing in PDC mode. +#define AT91C_TDES_URAT_OUT_DAT_READ_DATPROC ((unsigned int) 0x1 << 12) // (TDES) Output data register read during the data processing. +#define AT91C_TDES_URAT_MODEREG_WRITE_DATPROC ((unsigned int) 0x2 << 12) // (TDES) Mode register written during the data processing. +#define AT91C_TDES_URAT_WO_REG_READ ((unsigned int) 0x3 << 12) // (TDES) Write-only register read access. + +// ***************************************************************************** +// REGISTER ADDRESS DEFINITION FOR AT91SAM7X128 +// ***************************************************************************** +// ========== Register definition for SYS peripheral ========== +// ========== Register definition for AIC peripheral ========== +#define AT91C_AIC_IVR ((AT91_REG *) 0xFFFFF100) // (AIC) IRQ Vector Register +#define AT91C_AIC_SMR ((AT91_REG *) 0xFFFFF000) // (AIC) Source Mode Register +#define AT91C_AIC_FVR ((AT91_REG *) 0xFFFFF104) // (AIC) FIQ Vector Register +#define AT91C_AIC_DCR ((AT91_REG *) 0xFFFFF138) // (AIC) Debug Control Register (Protect) +#define AT91C_AIC_EOICR ((AT91_REG *) 0xFFFFF130) // (AIC) End of Interrupt Command Register +#define AT91C_AIC_SVR ((AT91_REG *) 0xFFFFF080) // (AIC) Source Vector Register +#define AT91C_AIC_FFSR ((AT91_REG *) 0xFFFFF148) // (AIC) Fast Forcing Status Register +#define AT91C_AIC_ICCR ((AT91_REG *) 0xFFFFF128) // (AIC) Interrupt Clear Command Register +#define AT91C_AIC_ISR ((AT91_REG *) 0xFFFFF108) // (AIC) Interrupt Status Register +#define AT91C_AIC_IMR ((AT91_REG *) 0xFFFFF110) // (AIC) Interrupt Mask Register +#define AT91C_AIC_IPR ((AT91_REG *) 0xFFFFF10C) // (AIC) Interrupt Pending Register +#define AT91C_AIC_FFER ((AT91_REG *) 0xFFFFF140) // (AIC) Fast Forcing Enable Register +#define AT91C_AIC_IECR ((AT91_REG *) 0xFFFFF120) // (AIC) Interrupt Enable Command Register +#define AT91C_AIC_ISCR ((AT91_REG *) 0xFFFFF12C) // (AIC) Interrupt Set Command Register +#define AT91C_AIC_FFDR ((AT91_REG *) 0xFFFFF144) // (AIC) Fast Forcing Disable Register +#define AT91C_AIC_CISR ((AT91_REG *) 0xFFFFF114) // (AIC) Core Interrupt Status Register +#define AT91C_AIC_IDCR ((AT91_REG *) 0xFFFFF124) // (AIC) Interrupt Disable Command Register +#define AT91C_AIC_SPU ((AT91_REG *) 0xFFFFF134) // (AIC) Spurious Vector Register +// ========== Register definition for PDC_DBGU peripheral ========== +#define AT91C_DBGU_TCR ((AT91_REG *) 0xFFFFF30C) // (PDC_DBGU) Transmit Counter Register +#define AT91C_DBGU_RNPR ((AT91_REG *) 0xFFFFF310) // (PDC_DBGU) Receive Next Pointer Register +#define AT91C_DBGU_TNPR ((AT91_REG *) 0xFFFFF318) // (PDC_DBGU) Transmit Next Pointer Register +#define AT91C_DBGU_TPR ((AT91_REG *) 0xFFFFF308) // (PDC_DBGU) Transmit Pointer Register +#define AT91C_DBGU_RPR ((AT91_REG *) 0xFFFFF300) // (PDC_DBGU) Receive Pointer Register +#define AT91C_DBGU_RCR ((AT91_REG *) 0xFFFFF304) // (PDC_DBGU) Receive Counter Register +#define AT91C_DBGU_RNCR ((AT91_REG *) 0xFFFFF314) // (PDC_DBGU) Receive Next Counter Register +#define AT91C_DBGU_PTCR ((AT91_REG *) 0xFFFFF320) // (PDC_DBGU) PDC Transfer Control Register +#define AT91C_DBGU_PTSR ((AT91_REG *) 0xFFFFF324) // (PDC_DBGU) PDC Transfer Status Register +#define AT91C_DBGU_TNCR ((AT91_REG *) 0xFFFFF31C) // (PDC_DBGU) Transmit Next Counter Register +// ========== Register definition for DBGU peripheral ========== +#define AT91C_DBGU_EXID ((AT91_REG *) 0xFFFFF244) // (DBGU) Chip ID Extension Register +#define AT91C_DBGU_BRGR ((AT91_REG *) 0xFFFFF220) // (DBGU) Baud Rate Generator Register +#define AT91C_DBGU_IDR ((AT91_REG *) 0xFFFFF20C) // (DBGU) Interrupt Disable Register +#define AT91C_DBGU_CSR ((AT91_REG *) 0xFFFFF214) // (DBGU) Channel Status Register +#define AT91C_DBGU_CIDR ((AT91_REG *) 0xFFFFF240) // (DBGU) Chip ID Register +#define AT91C_DBGU_MR ((AT91_REG *) 0xFFFFF204) // (DBGU) Mode Register +#define AT91C_DBGU_IMR ((AT91_REG *) 0xFFFFF210) // (DBGU) Interrupt Mask Register +#define AT91C_DBGU_CR ((AT91_REG *) 0xFFFFF200) // (DBGU) Control Register +#define AT91C_DBGU_FNTR ((AT91_REG *) 0xFFFFF248) // (DBGU) Force NTRST Register +#define AT91C_DBGU_THR ((AT91_REG *) 0xFFFFF21C) // (DBGU) Transmitter Holding Register +#define AT91C_DBGU_RHR ((AT91_REG *) 0xFFFFF218) // (DBGU) Receiver Holding Register +#define AT91C_DBGU_IER ((AT91_REG *) 0xFFFFF208) // (DBGU) Interrupt Enable Register +// ========== Register definition for PIOA peripheral ========== +#define AT91C_PIOA_ODR ((AT91_REG *) 0xFFFFF414) // (PIOA) Output Disable Registerr +#define AT91C_PIOA_SODR ((AT91_REG *) 0xFFFFF430) // (PIOA) Set Output Data Register +#define AT91C_PIOA_ISR ((AT91_REG *) 0xFFFFF44C) // (PIOA) Interrupt Status Register +#define AT91C_PIOA_ABSR ((AT91_REG *) 0xFFFFF478) // (PIOA) AB Select Status Register +#define AT91C_PIOA_IER ((AT91_REG *) 0xFFFFF440) // (PIOA) Interrupt Enable Register +#define AT91C_PIOA_PPUDR ((AT91_REG *) 0xFFFFF460) // (PIOA) Pull-up Disable Register +#define AT91C_PIOA_IMR ((AT91_REG *) 0xFFFFF448) // (PIOA) Interrupt Mask Register +#define AT91C_PIOA_PER ((AT91_REG *) 0xFFFFF400) // (PIOA) PIO Enable Register +#define AT91C_PIOA_IFDR ((AT91_REG *) 0xFFFFF424) // (PIOA) Input Filter Disable Register +#define AT91C_PIOA_OWDR ((AT91_REG *) 0xFFFFF4A4) // (PIOA) Output Write Disable Register +#define AT91C_PIOA_MDSR ((AT91_REG *) 0xFFFFF458) // (PIOA) Multi-driver Status Register +#define AT91C_PIOA_IDR ((AT91_REG *) 0xFFFFF444) // (PIOA) Interrupt Disable Register +#define AT91C_PIOA_ODSR ((AT91_REG *) 0xFFFFF438) // (PIOA) Output Data Status Register +#define AT91C_PIOA_PPUSR ((AT91_REG *) 0xFFFFF468) // (PIOA) Pull-up Status Register +#define AT91C_PIOA_OWSR ((AT91_REG *) 0xFFFFF4A8) // (PIOA) Output Write Status Register +#define AT91C_PIOA_BSR ((AT91_REG *) 0xFFFFF474) // (PIOA) Select B Register +#define AT91C_PIOA_OWER ((AT91_REG *) 0xFFFFF4A0) // (PIOA) Output Write Enable Register +#define AT91C_PIOA_IFER ((AT91_REG *) 0xFFFFF420) // (PIOA) Input Filter Enable Register +#define AT91C_PIOA_PDSR ((AT91_REG *) 0xFFFFF43C) // (PIOA) Pin Data Status Register +#define AT91C_PIOA_PPUER ((AT91_REG *) 0xFFFFF464) // (PIOA) Pull-up Enable Register +#define AT91C_PIOA_OSR ((AT91_REG *) 0xFFFFF418) // (PIOA) Output Status Register +#define AT91C_PIOA_ASR ((AT91_REG *) 0xFFFFF470) // (PIOA) Select A Register +#define AT91C_PIOA_MDDR ((AT91_REG *) 0xFFFFF454) // (PIOA) Multi-driver Disable Register +#define AT91C_PIOA_CODR ((AT91_REG *) 0xFFFFF434) // (PIOA) Clear Output Data Register +#define AT91C_PIOA_MDER ((AT91_REG *) 0xFFFFF450) // (PIOA) Multi-driver Enable Register +#define AT91C_PIOA_PDR ((AT91_REG *) 0xFFFFF404) // (PIOA) PIO Disable Register +#define AT91C_PIOA_IFSR ((AT91_REG *) 0xFFFFF428) // (PIOA) Input Filter Status Register +#define AT91C_PIOA_OER ((AT91_REG *) 0xFFFFF410) // (PIOA) Output Enable Register +#define AT91C_PIOA_PSR ((AT91_REG *) 0xFFFFF408) // (PIOA) PIO Status Register +// ========== Register definition for PIOB peripheral ========== +#define AT91C_PIOB_OWDR ((AT91_REG *) 0xFFFFF6A4) // (PIOB) Output Write Disable Register +#define AT91C_PIOB_MDER ((AT91_REG *) 0xFFFFF650) // (PIOB) Multi-driver Enable Register +#define AT91C_PIOB_PPUSR ((AT91_REG *) 0xFFFFF668) // (PIOB) Pull-up Status Register +#define AT91C_PIOB_IMR ((AT91_REG *) 0xFFFFF648) // (PIOB) Interrupt Mask Register +#define AT91C_PIOB_ASR ((AT91_REG *) 0xFFFFF670) // (PIOB) Select A Register +#define AT91C_PIOB_PPUDR ((AT91_REG *) 0xFFFFF660) // (PIOB) Pull-up Disable Register +#define AT91C_PIOB_PSR ((AT91_REG *) 0xFFFFF608) // (PIOB) PIO Status Register +#define AT91C_PIOB_IER ((AT91_REG *) 0xFFFFF640) // (PIOB) Interrupt Enable Register +#define AT91C_PIOB_CODR ((AT91_REG *) 0xFFFFF634) // (PIOB) Clear Output Data Register +#define AT91C_PIOB_OWER ((AT91_REG *) 0xFFFFF6A0) // (PIOB) Output Write Enable Register +#define AT91C_PIOB_ABSR ((AT91_REG *) 0xFFFFF678) // (PIOB) AB Select Status Register +#define AT91C_PIOB_IFDR ((AT91_REG *) 0xFFFFF624) // (PIOB) Input Filter Disable Register +#define AT91C_PIOB_PDSR ((AT91_REG *) 0xFFFFF63C) // (PIOB) Pin Data Status Register +#define AT91C_PIOB_IDR ((AT91_REG *) 0xFFFFF644) // (PIOB) Interrupt Disable Register +#define AT91C_PIOB_OWSR ((AT91_REG *) 0xFFFFF6A8) // (PIOB) Output Write Status Register +#define AT91C_PIOB_PDR ((AT91_REG *) 0xFFFFF604) // (PIOB) PIO Disable Register +#define AT91C_PIOB_ODR ((AT91_REG *) 0xFFFFF614) // (PIOB) Output Disable Registerr +#define AT91C_PIOB_IFSR ((AT91_REG *) 0xFFFFF628) // (PIOB) Input Filter Status Register +#define AT91C_PIOB_PPUER ((AT91_REG *) 0xFFFFF664) // (PIOB) Pull-up Enable Register +#define AT91C_PIOB_SODR ((AT91_REG *) 0xFFFFF630) // (PIOB) Set Output Data Register +#define AT91C_PIOB_ISR ((AT91_REG *) 0xFFFFF64C) // (PIOB) Interrupt Status Register +#define AT91C_PIOB_ODSR ((AT91_REG *) 0xFFFFF638) // (PIOB) Output Data Status Register +#define AT91C_PIOB_OSR ((AT91_REG *) 0xFFFFF618) // (PIOB) Output Status Register +#define AT91C_PIOB_MDSR ((AT91_REG *) 0xFFFFF658) // (PIOB) Multi-driver Status Register +#define AT91C_PIOB_IFER ((AT91_REG *) 0xFFFFF620) // (PIOB) Input Filter Enable Register +#define AT91C_PIOB_BSR ((AT91_REG *) 0xFFFFF674) // (PIOB) Select B Register +#define AT91C_PIOB_MDDR ((AT91_REG *) 0xFFFFF654) // (PIOB) Multi-driver Disable Register +#define AT91C_PIOB_OER ((AT91_REG *) 0xFFFFF610) // (PIOB) Output Enable Register +#define AT91C_PIOB_PER ((AT91_REG *) 0xFFFFF600) // (PIOB) PIO Enable Register +// ========== Register definition for CKGR peripheral ========== +#define AT91C_CKGR_MOR ((AT91_REG *) 0xFFFFFC20) // (CKGR) Main Oscillator Register +#define AT91C_CKGR_PLLR ((AT91_REG *) 0xFFFFFC2C) // (CKGR) PLL Register +#define AT91C_CKGR_MCFR ((AT91_REG *) 0xFFFFFC24) // (CKGR) Main Clock Frequency Register +// ========== Register definition for PMC peripheral ========== +#define AT91C_PMC_IDR ((AT91_REG *) 0xFFFFFC64) // (PMC) Interrupt Disable Register +#define AT91C_PMC_MOR ((AT91_REG *) 0xFFFFFC20) // (PMC) Main Oscillator Register +#define AT91C_PMC_PLLR ((AT91_REG *) 0xFFFFFC2C) // (PMC) PLL Register +#define AT91C_PMC_PCER ((AT91_REG *) 0xFFFFFC10) // (PMC) Peripheral Clock Enable Register +#define AT91C_PMC_PCKR ((AT91_REG *) 0xFFFFFC40) // (PMC) Programmable Clock Register +#define AT91C_PMC_MCKR ((AT91_REG *) 0xFFFFFC30) // (PMC) Master Clock Register +#define AT91C_PMC_SCDR ((AT91_REG *) 0xFFFFFC04) // (PMC) System Clock Disable Register +#define AT91C_PMC_PCDR ((AT91_REG *) 0xFFFFFC14) // (PMC) Peripheral Clock Disable Register +#define AT91C_PMC_SCSR ((AT91_REG *) 0xFFFFFC08) // (PMC) System Clock Status Register +#define AT91C_PMC_PCSR ((AT91_REG *) 0xFFFFFC18) // (PMC) Peripheral Clock Status Register +#define AT91C_PMC_MCFR ((AT91_REG *) 0xFFFFFC24) // (PMC) Main Clock Frequency Register +#define AT91C_PMC_SCER ((AT91_REG *) 0xFFFFFC00) // (PMC) System Clock Enable Register +#define AT91C_PMC_IMR ((AT91_REG *) 0xFFFFFC6C) // (PMC) Interrupt Mask Register +#define AT91C_PMC_IER ((AT91_REG *) 0xFFFFFC60) // (PMC) Interrupt Enable Register +#define AT91C_PMC_SR ((AT91_REG *) 0xFFFFFC68) // (PMC) Status Register +// ========== Register definition for RSTC peripheral ========== +#define AT91C_RSTC_RCR ((AT91_REG *) 0xFFFFFD00) // (RSTC) Reset Control Register +#define AT91C_RSTC_RMR ((AT91_REG *) 0xFFFFFD08) // (RSTC) Reset Mode Register +#define AT91C_RSTC_RSR ((AT91_REG *) 0xFFFFFD04) // (RSTC) Reset Status Register +// ========== Register definition for RTTC peripheral ========== +#define AT91C_RTTC_RTSR ((AT91_REG *) 0xFFFFFD2C) // (RTTC) Real-time Status Register +#define AT91C_RTTC_RTMR ((AT91_REG *) 0xFFFFFD20) // (RTTC) Real-time Mode Register +#define AT91C_RTTC_RTVR ((AT91_REG *) 0xFFFFFD28) // (RTTC) Real-time Value Register +#define AT91C_RTTC_RTAR ((AT91_REG *) 0xFFFFFD24) // (RTTC) Real-time Alarm Register +// ========== Register definition for PITC peripheral ========== +#define AT91C_PITC_PIVR ((AT91_REG *) 0xFFFFFD38) // (PITC) Period Interval Value Register +#define AT91C_PITC_PISR ((AT91_REG *) 0xFFFFFD34) // (PITC) Period Interval Status Register +#define AT91C_PITC_PIIR ((AT91_REG *) 0xFFFFFD3C) // (PITC) Period Interval Image Register +#define AT91C_PITC_PIMR ((AT91_REG *) 0xFFFFFD30) // (PITC) Period Interval Mode Register +// ========== Register definition for WDTC peripheral ========== +#define AT91C_WDTC_WDCR ((AT91_REG *) 0xFFFFFD40) // (WDTC) Watchdog Control Register +#define AT91C_WDTC_WDSR ((AT91_REG *) 0xFFFFFD48) // (WDTC) Watchdog Status Register +#define AT91C_WDTC_WDMR ((AT91_REG *) 0xFFFFFD44) // (WDTC) Watchdog Mode Register +// ========== Register definition for VREG peripheral ========== +#define AT91C_VREG_MR ((AT91_REG *) 0xFFFFFD60) // (VREG) Voltage Regulator Mode Register +// ========== Register definition for MC peripheral ========== +#define AT91C_MC_ASR ((AT91_REG *) 0xFFFFFF04) // (MC) MC Abort Status Register +#define AT91C_MC_RCR ((AT91_REG *) 0xFFFFFF00) // (MC) MC Remap Control Register +#define AT91C_MC_FCR ((AT91_REG *) 0xFFFFFF64) // (MC) MC Flash Command Register +#define AT91C_MC_AASR ((AT91_REG *) 0xFFFFFF08) // (MC) MC Abort Address Status Register +#define AT91C_MC_FSR ((AT91_REG *) 0xFFFFFF68) // (MC) MC Flash Status Register +#define AT91C_MC_FMR ((AT91_REG *) 0xFFFFFF60) // (MC) MC Flash Mode Register +// ========== Register definition for PDC_SPI1 peripheral ========== +#define AT91C_SPI1_PTCR ((AT91_REG *) 0xFFFE4120) // (PDC_SPI1) PDC Transfer Control Register +#define AT91C_SPI1_RPR ((AT91_REG *) 0xFFFE4100) // (PDC_SPI1) Receive Pointer Register +#define AT91C_SPI1_TNCR ((AT91_REG *) 0xFFFE411C) // (PDC_SPI1) Transmit Next Counter Register +#define AT91C_SPI1_TPR ((AT91_REG *) 0xFFFE4108) // (PDC_SPI1) Transmit Pointer Register +#define AT91C_SPI1_TNPR ((AT91_REG *) 0xFFFE4118) // (PDC_SPI1) Transmit Next Pointer Register +#define AT91C_SPI1_TCR ((AT91_REG *) 0xFFFE410C) // (PDC_SPI1) Transmit Counter Register +#define AT91C_SPI1_RCR ((AT91_REG *) 0xFFFE4104) // (PDC_SPI1) Receive Counter Register +#define AT91C_SPI1_RNPR ((AT91_REG *) 0xFFFE4110) // (PDC_SPI1) Receive Next Pointer Register +#define AT91C_SPI1_RNCR ((AT91_REG *) 0xFFFE4114) // (PDC_SPI1) Receive Next Counter Register +#define AT91C_SPI1_PTSR ((AT91_REG *) 0xFFFE4124) // (PDC_SPI1) PDC Transfer Status Register +// ========== Register definition for SPI1 peripheral ========== +#define AT91C_SPI1_IMR ((AT91_REG *) 0xFFFE401C) // (SPI1) Interrupt Mask Register +#define AT91C_SPI1_IER ((AT91_REG *) 0xFFFE4014) // (SPI1) Interrupt Enable Register +#define AT91C_SPI1_MR ((AT91_REG *) 0xFFFE4004) // (SPI1) Mode Register +#define AT91C_SPI1_RDR ((AT91_REG *) 0xFFFE4008) // (SPI1) Receive Data Register +#define AT91C_SPI1_IDR ((AT91_REG *) 0xFFFE4018) // (SPI1) Interrupt Disable Register +#define AT91C_SPI1_SR ((AT91_REG *) 0xFFFE4010) // (SPI1) Status Register +#define AT91C_SPI1_TDR ((AT91_REG *) 0xFFFE400C) // (SPI1) Transmit Data Register +#define AT91C_SPI1_CR ((AT91_REG *) 0xFFFE4000) // (SPI1) Control Register +#define AT91C_SPI1_CSR ((AT91_REG *) 0xFFFE4030) // (SPI1) Chip Select Register +// ========== Register definition for PDC_SPI0 peripheral ========== +#define AT91C_SPI0_PTCR ((AT91_REG *) 0xFFFE0120) // (PDC_SPI0) PDC Transfer Control Register +#define AT91C_SPI0_TPR ((AT91_REG *) 0xFFFE0108) // (PDC_SPI0) Transmit Pointer Register +#define AT91C_SPI0_TCR ((AT91_REG *) 0xFFFE010C) // (PDC_SPI0) Transmit Counter Register +#define AT91C_SPI0_RCR ((AT91_REG *) 0xFFFE0104) // (PDC_SPI0) Receive Counter Register +#define AT91C_SPI0_PTSR ((AT91_REG *) 0xFFFE0124) // (PDC_SPI0) PDC Transfer Status Register +#define AT91C_SPI0_RNPR ((AT91_REG *) 0xFFFE0110) // (PDC_SPI0) Receive Next Pointer Register +#define AT91C_SPI0_RPR ((AT91_REG *) 0xFFFE0100) // (PDC_SPI0) Receive Pointer Register +#define AT91C_SPI0_TNCR ((AT91_REG *) 0xFFFE011C) // (PDC_SPI0) Transmit Next Counter Register +#define AT91C_SPI0_RNCR ((AT91_REG *) 0xFFFE0114) // (PDC_SPI0) Receive Next Counter Register +#define AT91C_SPI0_TNPR ((AT91_REG *) 0xFFFE0118) // (PDC_SPI0) Transmit Next Pointer Register +// ========== Register definition for SPI0 peripheral ========== +#define AT91C_SPI0_IER ((AT91_REG *) 0xFFFE0014) // (SPI0) Interrupt Enable Register +#define AT91C_SPI0_SR ((AT91_REG *) 0xFFFE0010) // (SPI0) Status Register +#define AT91C_SPI0_IDR ((AT91_REG *) 0xFFFE0018) // (SPI0) Interrupt Disable Register +#define AT91C_SPI0_CR ((AT91_REG *) 0xFFFE0000) // (SPI0) Control Register +#define AT91C_SPI0_MR ((AT91_REG *) 0xFFFE0004) // (SPI0) Mode Register +#define AT91C_SPI0_IMR ((AT91_REG *) 0xFFFE001C) // (SPI0) Interrupt Mask Register +#define AT91C_SPI0_TDR ((AT91_REG *) 0xFFFE000C) // (SPI0) Transmit Data Register +#define AT91C_SPI0_RDR ((AT91_REG *) 0xFFFE0008) // (SPI0) Receive Data Register +#define AT91C_SPI0_CSR ((AT91_REG *) 0xFFFE0030) // (SPI0) Chip Select Register +// ========== Register definition for PDC_US1 peripheral ========== +#define AT91C_US1_RNCR ((AT91_REG *) 0xFFFC4114) // (PDC_US1) Receive Next Counter Register +#define AT91C_US1_PTCR ((AT91_REG *) 0xFFFC4120) // (PDC_US1) PDC Transfer Control Register +#define AT91C_US1_TCR ((AT91_REG *) 0xFFFC410C) // (PDC_US1) Transmit Counter Register +#define AT91C_US1_PTSR ((AT91_REG *) 0xFFFC4124) // (PDC_US1) PDC Transfer Status Register +#define AT91C_US1_TNPR ((AT91_REG *) 0xFFFC4118) // (PDC_US1) Transmit Next Pointer Register +#define AT91C_US1_RCR ((AT91_REG *) 0xFFFC4104) // (PDC_US1) Receive Counter Register +#define AT91C_US1_RNPR ((AT91_REG *) 0xFFFC4110) // (PDC_US1) Receive Next Pointer Register +#define AT91C_US1_RPR ((AT91_REG *) 0xFFFC4100) // (PDC_US1) Receive Pointer Register +#define AT91C_US1_TNCR ((AT91_REG *) 0xFFFC411C) // (PDC_US1) Transmit Next Counter Register +#define AT91C_US1_TPR ((AT91_REG *) 0xFFFC4108) // (PDC_US1) Transmit Pointer Register +// ========== Register definition for US1 peripheral ========== +#define AT91C_US1_IF ((AT91_REG *) 0xFFFC404C) // (US1) IRDA_FILTER Register +#define AT91C_US1_NER ((AT91_REG *) 0xFFFC4044) // (US1) Nb Errors Register +#define AT91C_US1_RTOR ((AT91_REG *) 0xFFFC4024) // (US1) Receiver Time-out Register +#define AT91C_US1_CSR ((AT91_REG *) 0xFFFC4014) // (US1) Channel Status Register +#define AT91C_US1_IDR ((AT91_REG *) 0xFFFC400C) // (US1) Interrupt Disable Register +#define AT91C_US1_IER ((AT91_REG *) 0xFFFC4008) // (US1) Interrupt Enable Register +#define AT91C_US1_THR ((AT91_REG *) 0xFFFC401C) // (US1) Transmitter Holding Register +#define AT91C_US1_TTGR ((AT91_REG *) 0xFFFC4028) // (US1) Transmitter Time-guard Register +#define AT91C_US1_RHR ((AT91_REG *) 0xFFFC4018) // (US1) Receiver Holding Register +#define AT91C_US1_BRGR ((AT91_REG *) 0xFFFC4020) // (US1) Baud Rate Generator Register +#define AT91C_US1_IMR ((AT91_REG *) 0xFFFC4010) // (US1) Interrupt Mask Register +#define AT91C_US1_FIDI ((AT91_REG *) 0xFFFC4040) // (US1) FI_DI_Ratio Register +#define AT91C_US1_CR ((AT91_REG *) 0xFFFC4000) // (US1) Control Register +#define AT91C_US1_MR ((AT91_REG *) 0xFFFC4004) // (US1) Mode Register +// ========== Register definition for PDC_US0 peripheral ========== +#define AT91C_US0_TNPR ((AT91_REG *) 0xFFFC0118) // (PDC_US0) Transmit Next Pointer Register +#define AT91C_US0_RNPR ((AT91_REG *) 0xFFFC0110) // (PDC_US0) Receive Next Pointer Register +#define AT91C_US0_TCR ((AT91_REG *) 0xFFFC010C) // (PDC_US0) Transmit Counter Register +#define AT91C_US0_PTCR ((AT91_REG *) 0xFFFC0120) // (PDC_US0) PDC Transfer Control Register +#define AT91C_US0_PTSR ((AT91_REG *) 0xFFFC0124) // (PDC_US0) PDC Transfer Status Register +#define AT91C_US0_TNCR ((AT91_REG *) 0xFFFC011C) // (PDC_US0) Transmit Next Counter Register +#define AT91C_US0_TPR ((AT91_REG *) 0xFFFC0108) // (PDC_US0) Transmit Pointer Register +#define AT91C_US0_RCR ((AT91_REG *) 0xFFFC0104) // (PDC_US0) Receive Counter Register +#define AT91C_US0_RPR ((AT91_REG *) 0xFFFC0100) // (PDC_US0) Receive Pointer Register +#define AT91C_US0_RNCR ((AT91_REG *) 0xFFFC0114) // (PDC_US0) Receive Next Counter Register +// ========== Register definition for US0 peripheral ========== +#define AT91C_US0_BRGR ((AT91_REG *) 0xFFFC0020) // (US0) Baud Rate Generator Register +#define AT91C_US0_NER ((AT91_REG *) 0xFFFC0044) // (US0) Nb Errors Register +#define AT91C_US0_CR ((AT91_REG *) 0xFFFC0000) // (US0) Control Register +#define AT91C_US0_IMR ((AT91_REG *) 0xFFFC0010) // (US0) Interrupt Mask Register +#define AT91C_US0_FIDI ((AT91_REG *) 0xFFFC0040) // (US0) FI_DI_Ratio Register +#define AT91C_US0_TTGR ((AT91_REG *) 0xFFFC0028) // (US0) Transmitter Time-guard Register +#define AT91C_US0_MR ((AT91_REG *) 0xFFFC0004) // (US0) Mode Register +#define AT91C_US0_RTOR ((AT91_REG *) 0xFFFC0024) // (US0) Receiver Time-out Register +#define AT91C_US0_CSR ((AT91_REG *) 0xFFFC0014) // (US0) Channel Status Register +#define AT91C_US0_RHR ((AT91_REG *) 0xFFFC0018) // (US0) Receiver Holding Register +#define AT91C_US0_IDR ((AT91_REG *) 0xFFFC000C) // (US0) Interrupt Disable Register +#define AT91C_US0_THR ((AT91_REG *) 0xFFFC001C) // (US0) Transmitter Holding Register +#define AT91C_US0_IF ((AT91_REG *) 0xFFFC004C) // (US0) IRDA_FILTER Register +#define AT91C_US0_IER ((AT91_REG *) 0xFFFC0008) // (US0) Interrupt Enable Register +// ========== Register definition for PDC_SSC peripheral ========== +#define AT91C_SSC_TNCR ((AT91_REG *) 0xFFFD411C) // (PDC_SSC) Transmit Next Counter Register +#define AT91C_SSC_RPR ((AT91_REG *) 0xFFFD4100) // (PDC_SSC) Receive Pointer Register +#define AT91C_SSC_RNCR ((AT91_REG *) 0xFFFD4114) // (PDC_SSC) Receive Next Counter Register +#define AT91C_SSC_TPR ((AT91_REG *) 0xFFFD4108) // (PDC_SSC) Transmit Pointer Register +#define AT91C_SSC_PTCR ((AT91_REG *) 0xFFFD4120) // (PDC_SSC) PDC Transfer Control Register +#define AT91C_SSC_TCR ((AT91_REG *) 0xFFFD410C) // (PDC_SSC) Transmit Counter Register +#define AT91C_SSC_RCR ((AT91_REG *) 0xFFFD4104) // (PDC_SSC) Receive Counter Register +#define AT91C_SSC_RNPR ((AT91_REG *) 0xFFFD4110) // (PDC_SSC) Receive Next Pointer Register +#define AT91C_SSC_TNPR ((AT91_REG *) 0xFFFD4118) // (PDC_SSC) Transmit Next Pointer Register +#define AT91C_SSC_PTSR ((AT91_REG *) 0xFFFD4124) // (PDC_SSC) PDC Transfer Status Register +// ========== Register definition for SSC peripheral ========== +#define AT91C_SSC_RHR ((AT91_REG *) 0xFFFD4020) // (SSC) Receive Holding Register +#define AT91C_SSC_RSHR ((AT91_REG *) 0xFFFD4030) // (SSC) Receive Sync Holding Register +#define AT91C_SSC_TFMR ((AT91_REG *) 0xFFFD401C) // (SSC) Transmit Frame Mode Register +#define AT91C_SSC_IDR ((AT91_REG *) 0xFFFD4048) // (SSC) Interrupt Disable Register +#define AT91C_SSC_THR ((AT91_REG *) 0xFFFD4024) // (SSC) Transmit Holding Register +#define AT91C_SSC_RCMR ((AT91_REG *) 0xFFFD4010) // (SSC) Receive Clock ModeRegister +#define AT91C_SSC_IER ((AT91_REG *) 0xFFFD4044) // (SSC) Interrupt Enable Register +#define AT91C_SSC_TSHR ((AT91_REG *) 0xFFFD4034) // (SSC) Transmit Sync Holding Register +#define AT91C_SSC_SR ((AT91_REG *) 0xFFFD4040) // (SSC) Status Register +#define AT91C_SSC_CMR ((AT91_REG *) 0xFFFD4004) // (SSC) Clock Mode Register +#define AT91C_SSC_TCMR ((AT91_REG *) 0xFFFD4018) // (SSC) Transmit Clock Mode Register +#define AT91C_SSC_CR ((AT91_REG *) 0xFFFD4000) // (SSC) Control Register +#define AT91C_SSC_IMR ((AT91_REG *) 0xFFFD404C) // (SSC) Interrupt Mask Register +#define AT91C_SSC_RFMR ((AT91_REG *) 0xFFFD4014) // (SSC) Receive Frame Mode Register +// ========== Register definition for TWI peripheral ========== +#define AT91C_TWI_IER ((AT91_REG *) 0xFFFB8024) // (TWI) Interrupt Enable Register +#define AT91C_TWI_CR ((AT91_REG *) 0xFFFB8000) // (TWI) Control Register +#define AT91C_TWI_SR ((AT91_REG *) 0xFFFB8020) // (TWI) Status Register +#define AT91C_TWI_IMR ((AT91_REG *) 0xFFFB802C) // (TWI) Interrupt Mask Register +#define AT91C_TWI_THR ((AT91_REG *) 0xFFFB8034) // (TWI) Transmit Holding Register +#define AT91C_TWI_IDR ((AT91_REG *) 0xFFFB8028) // (TWI) Interrupt Disable Register +#define AT91C_TWI_IADR ((AT91_REG *) 0xFFFB800C) // (TWI) Internal Address Register +#define AT91C_TWI_MMR ((AT91_REG *) 0xFFFB8004) // (TWI) Master Mode Register +#define AT91C_TWI_CWGR ((AT91_REG *) 0xFFFB8010) // (TWI) Clock Waveform Generator Register +#define AT91C_TWI_RHR ((AT91_REG *) 0xFFFB8030) // (TWI) Receive Holding Register +// ========== Register definition for PWMC_CH3 peripheral ========== +#define AT91C_PWMC_CH3_CUPDR ((AT91_REG *) 0xFFFCC270) // (PWMC_CH3) Channel Update Register +#define AT91C_PWMC_CH3_Reserved ((AT91_REG *) 0xFFFCC274) // (PWMC_CH3) Reserved +#define AT91C_PWMC_CH3_CPRDR ((AT91_REG *) 0xFFFCC268) // (PWMC_CH3) Channel Period Register +#define AT91C_PWMC_CH3_CDTYR ((AT91_REG *) 0xFFFCC264) // (PWMC_CH3) Channel Duty Cycle Register +#define AT91C_PWMC_CH3_CCNTR ((AT91_REG *) 0xFFFCC26C) // (PWMC_CH3) Channel Counter Register +#define AT91C_PWMC_CH3_CMR ((AT91_REG *) 0xFFFCC260) // (PWMC_CH3) Channel Mode Register +// ========== Register definition for PWMC_CH2 peripheral ========== +#define AT91C_PWMC_CH2_Reserved ((AT91_REG *) 0xFFFCC254) // (PWMC_CH2) Reserved +#define AT91C_PWMC_CH2_CMR ((AT91_REG *) 0xFFFCC240) // (PWMC_CH2) Channel Mode Register +#define AT91C_PWMC_CH2_CCNTR ((AT91_REG *) 0xFFFCC24C) // (PWMC_CH2) Channel Counter Register +#define AT91C_PWMC_CH2_CPRDR ((AT91_REG *) 0xFFFCC248) // (PWMC_CH2) Channel Period Register +#define AT91C_PWMC_CH2_CUPDR ((AT91_REG *) 0xFFFCC250) // (PWMC_CH2) Channel Update Register +#define AT91C_PWMC_CH2_CDTYR ((AT91_REG *) 0xFFFCC244) // (PWMC_CH2) Channel Duty Cycle Register +// ========== Register definition for PWMC_CH1 peripheral ========== +#define AT91C_PWMC_CH1_Reserved ((AT91_REG *) 0xFFFCC234) // (PWMC_CH1) Reserved +#define AT91C_PWMC_CH1_CUPDR ((AT91_REG *) 0xFFFCC230) // (PWMC_CH1) Channel Update Register +#define AT91C_PWMC_CH1_CPRDR ((AT91_REG *) 0xFFFCC228) // (PWMC_CH1) Channel Period Register +#define AT91C_PWMC_CH1_CCNTR ((AT91_REG *) 0xFFFCC22C) // (PWMC_CH1) Channel Counter Register +#define AT91C_PWMC_CH1_CDTYR ((AT91_REG *) 0xFFFCC224) // (PWMC_CH1) Channel Duty Cycle Register +#define AT91C_PWMC_CH1_CMR ((AT91_REG *) 0xFFFCC220) // (PWMC_CH1) Channel Mode Register +// ========== Register definition for PWMC_CH0 peripheral ========== +#define AT91C_PWMC_CH0_Reserved ((AT91_REG *) 0xFFFCC214) // (PWMC_CH0) Reserved +#define AT91C_PWMC_CH0_CPRDR ((AT91_REG *) 0xFFFCC208) // (PWMC_CH0) Channel Period Register +#define AT91C_PWMC_CH0_CDTYR ((AT91_REG *) 0xFFFCC204) // (PWMC_CH0) Channel Duty Cycle Register +#define AT91C_PWMC_CH0_CMR ((AT91_REG *) 0xFFFCC200) // (PWMC_CH0) Channel Mode Register +#define AT91C_PWMC_CH0_CUPDR ((AT91_REG *) 0xFFFCC210) // (PWMC_CH0) Channel Update Register +#define AT91C_PWMC_CH0_CCNTR ((AT91_REG *) 0xFFFCC20C) // (PWMC_CH0) Channel Counter Register +// ========== Register definition for PWMC peripheral ========== +#define AT91C_PWMC_IDR ((AT91_REG *) 0xFFFCC014) // (PWMC) PWMC Interrupt Disable Register +#define AT91C_PWMC_DIS ((AT91_REG *) 0xFFFCC008) // (PWMC) PWMC Disable Register +#define AT91C_PWMC_IER ((AT91_REG *) 0xFFFCC010) // (PWMC) PWMC Interrupt Enable Register +#define AT91C_PWMC_VR ((AT91_REG *) 0xFFFCC0FC) // (PWMC) PWMC Version Register +#define AT91C_PWMC_ISR ((AT91_REG *) 0xFFFCC01C) // (PWMC) PWMC Interrupt Status Register +#define AT91C_PWMC_SR ((AT91_REG *) 0xFFFCC00C) // (PWMC) PWMC Status Register +#define AT91C_PWMC_IMR ((AT91_REG *) 0xFFFCC018) // (PWMC) PWMC Interrupt Mask Register +#define AT91C_PWMC_MR ((AT91_REG *) 0xFFFCC000) // (PWMC) PWMC Mode Register +#define AT91C_PWMC_ENA ((AT91_REG *) 0xFFFCC004) // (PWMC) PWMC Enable Register +// ========== Register definition for UDP peripheral ========== +#define AT91C_UDP_IMR ((AT91_REG *) 0xFFFB0018) // (UDP) Interrupt Mask Register +#define AT91C_UDP_FADDR ((AT91_REG *) 0xFFFB0008) // (UDP) Function Address Register +#define AT91C_UDP_NUM ((AT91_REG *) 0xFFFB0000) // (UDP) Frame Number Register +#define AT91C_UDP_FDR ((AT91_REG *) 0xFFFB0050) // (UDP) Endpoint FIFO Data Register +#define AT91C_UDP_ISR ((AT91_REG *) 0xFFFB001C) // (UDP) Interrupt Status Register +#define AT91C_UDP_CSR ((AT91_REG *) 0xFFFB0030) // (UDP) Endpoint Control and Status Register +#define AT91C_UDP_IDR ((AT91_REG *) 0xFFFB0014) // (UDP) Interrupt Disable Register +#define AT91C_UDP_ICR ((AT91_REG *) 0xFFFB0020) // (UDP) Interrupt Clear Register +#define AT91C_UDP_RSTEP ((AT91_REG *) 0xFFFB0028) // (UDP) Reset Endpoint Register +#define AT91C_UDP_TXVC ((AT91_REG *) 0xFFFB0074) // (UDP) Transceiver Control Register +#define AT91C_UDP_GLBSTATE ((AT91_REG *) 0xFFFB0004) // (UDP) Global State Register +#define AT91C_UDP_IER ((AT91_REG *) 0xFFFB0010) // (UDP) Interrupt Enable Register +// ========== Register definition for TC0 peripheral ========== +#define AT91C_TC0_SR ((AT91_REG *) 0xFFFA0020) // (TC0) Status Register +#define AT91C_TC0_RC ((AT91_REG *) 0xFFFA001C) // (TC0) Register C +#define AT91C_TC0_RB ((AT91_REG *) 0xFFFA0018) // (TC0) Register B +#define AT91C_TC0_CCR ((AT91_REG *) 0xFFFA0000) // (TC0) Channel Control Register +#define AT91C_TC0_CMR ((AT91_REG *) 0xFFFA0004) // (TC0) Channel Mode Register (Capture Mode / Waveform Mode) +#define AT91C_TC0_IER ((AT91_REG *) 0xFFFA0024) // (TC0) Interrupt Enable Register +#define AT91C_TC0_RA ((AT91_REG *) 0xFFFA0014) // (TC0) Register A +#define AT91C_TC0_IDR ((AT91_REG *) 0xFFFA0028) // (TC0) Interrupt Disable Register +#define AT91C_TC0_CV ((AT91_REG *) 0xFFFA0010) // (TC0) Counter Value +#define AT91C_TC0_IMR ((AT91_REG *) 0xFFFA002C) // (TC0) Interrupt Mask Register +// ========== Register definition for TC1 peripheral ========== +#define AT91C_TC1_RB ((AT91_REG *) 0xFFFA0058) // (TC1) Register B +#define AT91C_TC1_CCR ((AT91_REG *) 0xFFFA0040) // (TC1) Channel Control Register +#define AT91C_TC1_IER ((AT91_REG *) 0xFFFA0064) // (TC1) Interrupt Enable Register +#define AT91C_TC1_IDR ((AT91_REG *) 0xFFFA0068) // (TC1) Interrupt Disable Register +#define AT91C_TC1_SR ((AT91_REG *) 0xFFFA0060) // (TC1) Status Register +#define AT91C_TC1_CMR ((AT91_REG *) 0xFFFA0044) // (TC1) Channel Mode Register (Capture Mode / Waveform Mode) +#define AT91C_TC1_RA ((AT91_REG *) 0xFFFA0054) // (TC1) Register A +#define AT91C_TC1_RC ((AT91_REG *) 0xFFFA005C) // (TC1) Register C +#define AT91C_TC1_IMR ((AT91_REG *) 0xFFFA006C) // (TC1) Interrupt Mask Register +#define AT91C_TC1_CV ((AT91_REG *) 0xFFFA0050) // (TC1) Counter Value +// ========== Register definition for TC2 peripheral ========== +#define AT91C_TC2_CMR ((AT91_REG *) 0xFFFA0084) // (TC2) Channel Mode Register (Capture Mode / Waveform Mode) +#define AT91C_TC2_CCR ((AT91_REG *) 0xFFFA0080) // (TC2) Channel Control Register +#define AT91C_TC2_CV ((AT91_REG *) 0xFFFA0090) // (TC2) Counter Value +#define AT91C_TC2_RA ((AT91_REG *) 0xFFFA0094) // (TC2) Register A +#define AT91C_TC2_RB ((AT91_REG *) 0xFFFA0098) // (TC2) Register B +#define AT91C_TC2_IDR ((AT91_REG *) 0xFFFA00A8) // (TC2) Interrupt Disable Register +#define AT91C_TC2_IMR ((AT91_REG *) 0xFFFA00AC) // (TC2) Interrupt Mask Register +#define AT91C_TC2_RC ((AT91_REG *) 0xFFFA009C) // (TC2) Register C +#define AT91C_TC2_IER ((AT91_REG *) 0xFFFA00A4) // (TC2) Interrupt Enable Register +#define AT91C_TC2_SR ((AT91_REG *) 0xFFFA00A0) // (TC2) Status Register +// ========== Register definition for TCB peripheral ========== +#define AT91C_TCB_BMR ((AT91_REG *) 0xFFFA00C4) // (TCB) TC Block Mode Register +#define AT91C_TCB_BCR ((AT91_REG *) 0xFFFA00C0) // (TCB) TC Block Control Register +// ========== Register definition for CAN_MB0 peripheral ========== +#define AT91C_CAN_MB0_MDL ((AT91_REG *) 0xFFFD0214) // (CAN_MB0) MailBox Data Low Register +#define AT91C_CAN_MB0_MAM ((AT91_REG *) 0xFFFD0204) // (CAN_MB0) MailBox Acceptance Mask Register +#define AT91C_CAN_MB0_MCR ((AT91_REG *) 0xFFFD021C) // (CAN_MB0) MailBox Control Register +#define AT91C_CAN_MB0_MID ((AT91_REG *) 0xFFFD0208) // (CAN_MB0) MailBox ID Register +#define AT91C_CAN_MB0_MSR ((AT91_REG *) 0xFFFD0210) // (CAN_MB0) MailBox Status Register +#define AT91C_CAN_MB0_MFID ((AT91_REG *) 0xFFFD020C) // (CAN_MB0) MailBox Family ID Register +#define AT91C_CAN_MB0_MDH ((AT91_REG *) 0xFFFD0218) // (CAN_MB0) MailBox Data High Register +#define AT91C_CAN_MB0_MMR ((AT91_REG *) 0xFFFD0200) // (CAN_MB0) MailBox Mode Register +// ========== Register definition for CAN_MB1 peripheral ========== +#define AT91C_CAN_MB1_MDL ((AT91_REG *) 0xFFFD0234) // (CAN_MB1) MailBox Data Low Register +#define AT91C_CAN_MB1_MID ((AT91_REG *) 0xFFFD0228) // (CAN_MB1) MailBox ID Register +#define AT91C_CAN_MB1_MMR ((AT91_REG *) 0xFFFD0220) // (CAN_MB1) MailBox Mode Register +#define AT91C_CAN_MB1_MSR ((AT91_REG *) 0xFFFD0230) // (CAN_MB1) MailBox Status Register +#define AT91C_CAN_MB1_MAM ((AT91_REG *) 0xFFFD0224) // (CAN_MB1) MailBox Acceptance Mask Register +#define AT91C_CAN_MB1_MDH ((AT91_REG *) 0xFFFD0238) // (CAN_MB1) MailBox Data High Register +#define AT91C_CAN_MB1_MCR ((AT91_REG *) 0xFFFD023C) // (CAN_MB1) MailBox Control Register +#define AT91C_CAN_MB1_MFID ((AT91_REG *) 0xFFFD022C) // (CAN_MB1) MailBox Family ID Register +// ========== Register definition for CAN_MB2 peripheral ========== +#define AT91C_CAN_MB2_MCR ((AT91_REG *) 0xFFFD025C) // (CAN_MB2) MailBox Control Register +#define AT91C_CAN_MB2_MDH ((AT91_REG *) 0xFFFD0258) // (CAN_MB2) MailBox Data High Register +#define AT91C_CAN_MB2_MID ((AT91_REG *) 0xFFFD0248) // (CAN_MB2) MailBox ID Register +#define AT91C_CAN_MB2_MDL ((AT91_REG *) 0xFFFD0254) // (CAN_MB2) MailBox Data Low Register +#define AT91C_CAN_MB2_MMR ((AT91_REG *) 0xFFFD0240) // (CAN_MB2) MailBox Mode Register +#define AT91C_CAN_MB2_MAM ((AT91_REG *) 0xFFFD0244) // (CAN_MB2) MailBox Acceptance Mask Register +#define AT91C_CAN_MB2_MFID ((AT91_REG *) 0xFFFD024C) // (CAN_MB2) MailBox Family ID Register +#define AT91C_CAN_MB2_MSR ((AT91_REG *) 0xFFFD0250) // (CAN_MB2) MailBox Status Register +// ========== Register definition for CAN_MB3 peripheral ========== +#define AT91C_CAN_MB3_MFID ((AT91_REG *) 0xFFFD026C) // (CAN_MB3) MailBox Family ID Register +#define AT91C_CAN_MB3_MAM ((AT91_REG *) 0xFFFD0264) // (CAN_MB3) MailBox Acceptance Mask Register +#define AT91C_CAN_MB3_MID ((AT91_REG *) 0xFFFD0268) // (CAN_MB3) MailBox ID Register +#define AT91C_CAN_MB3_MCR ((AT91_REG *) 0xFFFD027C) // (CAN_MB3) MailBox Control Register +#define AT91C_CAN_MB3_MMR ((AT91_REG *) 0xFFFD0260) // (CAN_MB3) MailBox Mode Register +#define AT91C_CAN_MB3_MSR ((AT91_REG *) 0xFFFD0270) // (CAN_MB3) MailBox Status Register +#define AT91C_CAN_MB3_MDL ((AT91_REG *) 0xFFFD0274) // (CAN_MB3) MailBox Data Low Register +#define AT91C_CAN_MB3_MDH ((AT91_REG *) 0xFFFD0278) // (CAN_MB3) MailBox Data High Register +// ========== Register definition for CAN_MB4 peripheral ========== +#define AT91C_CAN_MB4_MID ((AT91_REG *) 0xFFFD0288) // (CAN_MB4) MailBox ID Register +#define AT91C_CAN_MB4_MMR ((AT91_REG *) 0xFFFD0280) // (CAN_MB4) MailBox Mode Register +#define AT91C_CAN_MB4_MDH ((AT91_REG *) 0xFFFD0298) // (CAN_MB4) MailBox Data High Register +#define AT91C_CAN_MB4_MFID ((AT91_REG *) 0xFFFD028C) // (CAN_MB4) MailBox Family ID Register +#define AT91C_CAN_MB4_MSR ((AT91_REG *) 0xFFFD0290) // (CAN_MB4) MailBox Status Register +#define AT91C_CAN_MB4_MCR ((AT91_REG *) 0xFFFD029C) // (CAN_MB4) MailBox Control Register +#define AT91C_CAN_MB4_MDL ((AT91_REG *) 0xFFFD0294) // (CAN_MB4) MailBox Data Low Register +#define AT91C_CAN_MB4_MAM ((AT91_REG *) 0xFFFD0284) // (CAN_MB4) MailBox Acceptance Mask Register +// ========== Register definition for CAN_MB5 peripheral ========== +#define AT91C_CAN_MB5_MSR ((AT91_REG *) 0xFFFD02B0) // (CAN_MB5) MailBox Status Register +#define AT91C_CAN_MB5_MCR ((AT91_REG *) 0xFFFD02BC) // (CAN_MB5) MailBox Control Register +#define AT91C_CAN_MB5_MFID ((AT91_REG *) 0xFFFD02AC) // (CAN_MB5) MailBox Family ID Register +#define AT91C_CAN_MB5_MDH ((AT91_REG *) 0xFFFD02B8) // (CAN_MB5) MailBox Data High Register +#define AT91C_CAN_MB5_MID ((AT91_REG *) 0xFFFD02A8) // (CAN_MB5) MailBox ID Register +#define AT91C_CAN_MB5_MMR ((AT91_REG *) 0xFFFD02A0) // (CAN_MB5) MailBox Mode Register +#define AT91C_CAN_MB5_MDL ((AT91_REG *) 0xFFFD02B4) // (CAN_MB5) MailBox Data Low Register +#define AT91C_CAN_MB5_MAM ((AT91_REG *) 0xFFFD02A4) // (CAN_MB5) MailBox Acceptance Mask Register +// ========== Register definition for CAN_MB6 peripheral ========== +#define AT91C_CAN_MB6_MFID ((AT91_REG *) 0xFFFD02CC) // (CAN_MB6) MailBox Family ID Register +#define AT91C_CAN_MB6_MID ((AT91_REG *) 0xFFFD02C8) // (CAN_MB6) MailBox ID Register +#define AT91C_CAN_MB6_MAM ((AT91_REG *) 0xFFFD02C4) // (CAN_MB6) MailBox Acceptance Mask Register +#define AT91C_CAN_MB6_MSR ((AT91_REG *) 0xFFFD02D0) // (CAN_MB6) MailBox Status Register +#define AT91C_CAN_MB6_MDL ((AT91_REG *) 0xFFFD02D4) // (CAN_MB6) MailBox Data Low Register +#define AT91C_CAN_MB6_MCR ((AT91_REG *) 0xFFFD02DC) // (CAN_MB6) MailBox Control Register +#define AT91C_CAN_MB6_MDH ((AT91_REG *) 0xFFFD02D8) // (CAN_MB6) MailBox Data High Register +#define AT91C_CAN_MB6_MMR ((AT91_REG *) 0xFFFD02C0) // (CAN_MB6) MailBox Mode Register +// ========== Register definition for CAN_MB7 peripheral ========== +#define AT91C_CAN_MB7_MCR ((AT91_REG *) 0xFFFD02FC) // (CAN_MB7) MailBox Control Register +#define AT91C_CAN_MB7_MDH ((AT91_REG *) 0xFFFD02F8) // (CAN_MB7) MailBox Data High Register +#define AT91C_CAN_MB7_MFID ((AT91_REG *) 0xFFFD02EC) // (CAN_MB7) MailBox Family ID Register +#define AT91C_CAN_MB7_MDL ((AT91_REG *) 0xFFFD02F4) // (CAN_MB7) MailBox Data Low Register +#define AT91C_CAN_MB7_MID ((AT91_REG *) 0xFFFD02E8) // (CAN_MB7) MailBox ID Register +#define AT91C_CAN_MB7_MMR ((AT91_REG *) 0xFFFD02E0) // (CAN_MB7) MailBox Mode Register +#define AT91C_CAN_MB7_MAM ((AT91_REG *) 0xFFFD02E4) // (CAN_MB7) MailBox Acceptance Mask Register +#define AT91C_CAN_MB7_MSR ((AT91_REG *) 0xFFFD02F0) // (CAN_MB7) MailBox Status Register +// ========== Register definition for CAN peripheral ========== +#define AT91C_CAN_TCR ((AT91_REG *) 0xFFFD0024) // (CAN) Transfer Command Register +#define AT91C_CAN_IMR ((AT91_REG *) 0xFFFD000C) // (CAN) Interrupt Mask Register +#define AT91C_CAN_IER ((AT91_REG *) 0xFFFD0004) // (CAN) Interrupt Enable Register +#define AT91C_CAN_ECR ((AT91_REG *) 0xFFFD0020) // (CAN) Error Counter Register +#define AT91C_CAN_TIMESTP ((AT91_REG *) 0xFFFD001C) // (CAN) Time Stamp Register +#define AT91C_CAN_MR ((AT91_REG *) 0xFFFD0000) // (CAN) Mode Register +#define AT91C_CAN_IDR ((AT91_REG *) 0xFFFD0008) // (CAN) Interrupt Disable Register +#define AT91C_CAN_ACR ((AT91_REG *) 0xFFFD0028) // (CAN) Abort Command Register +#define AT91C_CAN_TIM ((AT91_REG *) 0xFFFD0018) // (CAN) Timer Register +#define AT91C_CAN_SR ((AT91_REG *) 0xFFFD0010) // (CAN) Status Register +#define AT91C_CAN_BR ((AT91_REG *) 0xFFFD0014) // (CAN) Baudrate Register +#define AT91C_CAN_VR ((AT91_REG *) 0xFFFD00FC) // (CAN) Version Register +// ========== Register definition for EMAC peripheral ========== +#define AT91C_EMAC_ISR ((AT91_REG *) 0xFFFDC024) // (EMAC) Interrupt Status Register +#define AT91C_EMAC_SA4H ((AT91_REG *) 0xFFFDC0B4) // (EMAC) Specific Address 4 Top, Last 2 bytes +#define AT91C_EMAC_SA1L ((AT91_REG *) 0xFFFDC098) // (EMAC) Specific Address 1 Bottom, First 4 bytes +#define AT91C_EMAC_ELE ((AT91_REG *) 0xFFFDC078) // (EMAC) Excessive Length Errors Register +#define AT91C_EMAC_LCOL ((AT91_REG *) 0xFFFDC05C) // (EMAC) Late Collision Register +#define AT91C_EMAC_RLE ((AT91_REG *) 0xFFFDC088) // (EMAC) Receive Length Field Mismatch Register +#define AT91C_EMAC_WOL ((AT91_REG *) 0xFFFDC0C4) // (EMAC) Wake On LAN Register +#define AT91C_EMAC_DTF ((AT91_REG *) 0xFFFDC058) // (EMAC) Deferred Transmission Frame Register +#define AT91C_EMAC_TUND ((AT91_REG *) 0xFFFDC064) // (EMAC) Transmit Underrun Error Register +#define AT91C_EMAC_NCR ((AT91_REG *) 0xFFFDC000) // (EMAC) Network Control Register +#define AT91C_EMAC_SA4L ((AT91_REG *) 0xFFFDC0B0) // (EMAC) Specific Address 4 Bottom, First 4 bytes +#define AT91C_EMAC_RSR ((AT91_REG *) 0xFFFDC020) // (EMAC) Receive Status Register +#define AT91C_EMAC_SA3L ((AT91_REG *) 0xFFFDC0A8) // (EMAC) Specific Address 3 Bottom, First 4 bytes +#define AT91C_EMAC_TSR ((AT91_REG *) 0xFFFDC014) // (EMAC) Transmit Status Register +#define AT91C_EMAC_IDR ((AT91_REG *) 0xFFFDC02C) // (EMAC) Interrupt Disable Register +#define AT91C_EMAC_RSE ((AT91_REG *) 0xFFFDC074) // (EMAC) Receive Symbol Errors Register +#define AT91C_EMAC_ECOL ((AT91_REG *) 0xFFFDC060) // (EMAC) Excessive Collision Register +#define AT91C_EMAC_TID ((AT91_REG *) 0xFFFDC0B8) // (EMAC) Type ID Checking Register +#define AT91C_EMAC_HRB ((AT91_REG *) 0xFFFDC090) // (EMAC) Hash Address Bottom[31:0] +#define AT91C_EMAC_TBQP ((AT91_REG *) 0xFFFDC01C) // (EMAC) Transmit Buffer Queue Pointer +#define AT91C_EMAC_USRIO ((AT91_REG *) 0xFFFDC0C0) // (EMAC) USER Input/Output Register +#define AT91C_EMAC_PTR ((AT91_REG *) 0xFFFDC038) // (EMAC) Pause Time Register +#define AT91C_EMAC_SA2H ((AT91_REG *) 0xFFFDC0A4) // (EMAC) Specific Address 2 Top, Last 2 bytes +#define AT91C_EMAC_ROV ((AT91_REG *) 0xFFFDC070) // (EMAC) Receive Overrun Errors Register +#define AT91C_EMAC_ALE ((AT91_REG *) 0xFFFDC054) // (EMAC) Alignment Error Register +#define AT91C_EMAC_RJA ((AT91_REG *) 0xFFFDC07C) // (EMAC) Receive Jabbers Register +#define AT91C_EMAC_RBQP ((AT91_REG *) 0xFFFDC018) // (EMAC) Receive Buffer Queue Pointer +#define AT91C_EMAC_TPF ((AT91_REG *) 0xFFFDC08C) // (EMAC) Transmitted Pause Frames Register +#define AT91C_EMAC_NCFGR ((AT91_REG *) 0xFFFDC004) // (EMAC) Network Configuration Register +#define AT91C_EMAC_HRT ((AT91_REG *) 0xFFFDC094) // (EMAC) Hash Address Top[63:32] +#define AT91C_EMAC_USF ((AT91_REG *) 0xFFFDC080) // (EMAC) Undersize Frames Register +#define AT91C_EMAC_FCSE ((AT91_REG *) 0xFFFDC050) // (EMAC) Frame Check Sequence Error Register +#define AT91C_EMAC_TPQ ((AT91_REG *) 0xFFFDC0BC) // (EMAC) Transmit Pause Quantum Register +#define AT91C_EMAC_MAN ((AT91_REG *) 0xFFFDC034) // (EMAC) PHY Maintenance Register +#define AT91C_EMAC_FTO ((AT91_REG *) 0xFFFDC040) // (EMAC) Frames Transmitted OK Register +#define AT91C_EMAC_REV ((AT91_REG *) 0xFFFDC0FC) // (EMAC) Revision Register +#define AT91C_EMAC_IMR ((AT91_REG *) 0xFFFDC030) // (EMAC) Interrupt Mask Register +#define AT91C_EMAC_SCF ((AT91_REG *) 0xFFFDC044) // (EMAC) Single Collision Frame Register +#define AT91C_EMAC_PFR ((AT91_REG *) 0xFFFDC03C) // (EMAC) Pause Frames received Register +#define AT91C_EMAC_MCF ((AT91_REG *) 0xFFFDC048) // (EMAC) Multiple Collision Frame Register +#define AT91C_EMAC_NSR ((AT91_REG *) 0xFFFDC008) // (EMAC) Network Status Register +#define AT91C_EMAC_SA2L ((AT91_REG *) 0xFFFDC0A0) // (EMAC) Specific Address 2 Bottom, First 4 bytes +#define AT91C_EMAC_FRO ((AT91_REG *) 0xFFFDC04C) // (EMAC) Frames Received OK Register +#define AT91C_EMAC_IER ((AT91_REG *) 0xFFFDC028) // (EMAC) Interrupt Enable Register +#define AT91C_EMAC_SA1H ((AT91_REG *) 0xFFFDC09C) // (EMAC) Specific Address 1 Top, Last 2 bytes +#define AT91C_EMAC_CSE ((AT91_REG *) 0xFFFDC068) // (EMAC) Carrier Sense Error Register +#define AT91C_EMAC_SA3H ((AT91_REG *) 0xFFFDC0AC) // (EMAC) Specific Address 3 Top, Last 2 bytes +#define AT91C_EMAC_RRE ((AT91_REG *) 0xFFFDC06C) // (EMAC) Receive Ressource Error Register +#define AT91C_EMAC_STE ((AT91_REG *) 0xFFFDC084) // (EMAC) SQE Test Error Register +// ========== Register definition for PDC_ADC peripheral ========== +#define AT91C_ADC_PTSR ((AT91_REG *) 0xFFFD8124) // (PDC_ADC) PDC Transfer Status Register +#define AT91C_ADC_PTCR ((AT91_REG *) 0xFFFD8120) // (PDC_ADC) PDC Transfer Control Register +#define AT91C_ADC_TNPR ((AT91_REG *) 0xFFFD8118) // (PDC_ADC) Transmit Next Pointer Register +#define AT91C_ADC_TNCR ((AT91_REG *) 0xFFFD811C) // (PDC_ADC) Transmit Next Counter Register +#define AT91C_ADC_RNPR ((AT91_REG *) 0xFFFD8110) // (PDC_ADC) Receive Next Pointer Register +#define AT91C_ADC_RNCR ((AT91_REG *) 0xFFFD8114) // (PDC_ADC) Receive Next Counter Register +#define AT91C_ADC_RPR ((AT91_REG *) 0xFFFD8100) // (PDC_ADC) Receive Pointer Register +#define AT91C_ADC_TCR ((AT91_REG *) 0xFFFD810C) // (PDC_ADC) Transmit Counter Register +#define AT91C_ADC_TPR ((AT91_REG *) 0xFFFD8108) // (PDC_ADC) Transmit Pointer Register +#define AT91C_ADC_RCR ((AT91_REG *) 0xFFFD8104) // (PDC_ADC) Receive Counter Register +// ========== Register definition for ADC peripheral ========== +#define AT91C_ADC_CDR2 ((AT91_REG *) 0xFFFD8038) // (ADC) ADC Channel Data Register 2 +#define AT91C_ADC_CDR3 ((AT91_REG *) 0xFFFD803C) // (ADC) ADC Channel Data Register 3 +#define AT91C_ADC_CDR0 ((AT91_REG *) 0xFFFD8030) // (ADC) ADC Channel Data Register 0 +#define AT91C_ADC_CDR5 ((AT91_REG *) 0xFFFD8044) // (ADC) ADC Channel Data Register 5 +#define AT91C_ADC_CHDR ((AT91_REG *) 0xFFFD8014) // (ADC) ADC Channel Disable Register +#define AT91C_ADC_SR ((AT91_REG *) 0xFFFD801C) // (ADC) ADC Status Register +#define AT91C_ADC_CDR4 ((AT91_REG *) 0xFFFD8040) // (ADC) ADC Channel Data Register 4 +#define AT91C_ADC_CDR1 ((AT91_REG *) 0xFFFD8034) // (ADC) ADC Channel Data Register 1 +#define AT91C_ADC_LCDR ((AT91_REG *) 0xFFFD8020) // (ADC) ADC Last Converted Data Register +#define AT91C_ADC_IDR ((AT91_REG *) 0xFFFD8028) // (ADC) ADC Interrupt Disable Register +#define AT91C_ADC_CR ((AT91_REG *) 0xFFFD8000) // (ADC) ADC Control Register +#define AT91C_ADC_CDR7 ((AT91_REG *) 0xFFFD804C) // (ADC) ADC Channel Data Register 7 +#define AT91C_ADC_CDR6 ((AT91_REG *) 0xFFFD8048) // (ADC) ADC Channel Data Register 6 +#define AT91C_ADC_IER ((AT91_REG *) 0xFFFD8024) // (ADC) ADC Interrupt Enable Register +#define AT91C_ADC_CHER ((AT91_REG *) 0xFFFD8010) // (ADC) ADC Channel Enable Register +#define AT91C_ADC_CHSR ((AT91_REG *) 0xFFFD8018) // (ADC) ADC Channel Status Register +#define AT91C_ADC_MR ((AT91_REG *) 0xFFFD8004) // (ADC) ADC Mode Register +#define AT91C_ADC_IMR ((AT91_REG *) 0xFFFD802C) // (ADC) ADC Interrupt Mask Register +// ========== Register definition for PDC_AES peripheral ========== +#define AT91C_AES_TPR ((AT91_REG *) 0xFFFA4108) // (PDC_AES) Transmit Pointer Register +#define AT91C_AES_PTCR ((AT91_REG *) 0xFFFA4120) // (PDC_AES) PDC Transfer Control Register +#define AT91C_AES_RNPR ((AT91_REG *) 0xFFFA4110) // (PDC_AES) Receive Next Pointer Register +#define AT91C_AES_TNCR ((AT91_REG *) 0xFFFA411C) // (PDC_AES) Transmit Next Counter Register +#define AT91C_AES_TCR ((AT91_REG *) 0xFFFA410C) // (PDC_AES) Transmit Counter Register +#define AT91C_AES_RCR ((AT91_REG *) 0xFFFA4104) // (PDC_AES) Receive Counter Register +#define AT91C_AES_RNCR ((AT91_REG *) 0xFFFA4114) // (PDC_AES) Receive Next Counter Register +#define AT91C_AES_TNPR ((AT91_REG *) 0xFFFA4118) // (PDC_AES) Transmit Next Pointer Register +#define AT91C_AES_RPR ((AT91_REG *) 0xFFFA4100) // (PDC_AES) Receive Pointer Register +#define AT91C_AES_PTSR ((AT91_REG *) 0xFFFA4124) // (PDC_AES) PDC Transfer Status Register +// ========== Register definition for AES peripheral ========== +#define AT91C_AES_IVxR ((AT91_REG *) 0xFFFA4060) // (AES) Initialization Vector x Register +#define AT91C_AES_MR ((AT91_REG *) 0xFFFA4004) // (AES) Mode Register +#define AT91C_AES_VR ((AT91_REG *) 0xFFFA40FC) // (AES) AES Version Register +#define AT91C_AES_ODATAxR ((AT91_REG *) 0xFFFA4050) // (AES) Output Data x Register +#define AT91C_AES_IDATAxR ((AT91_REG *) 0xFFFA4040) // (AES) Input Data x Register +#define AT91C_AES_CR ((AT91_REG *) 0xFFFA4000) // (AES) Control Register +#define AT91C_AES_IDR ((AT91_REG *) 0xFFFA4014) // (AES) Interrupt Disable Register +#define AT91C_AES_IMR ((AT91_REG *) 0xFFFA4018) // (AES) Interrupt Mask Register +#define AT91C_AES_IER ((AT91_REG *) 0xFFFA4010) // (AES) Interrupt Enable Register +#define AT91C_AES_KEYWxR ((AT91_REG *) 0xFFFA4020) // (AES) Key Word x Register +#define AT91C_AES_ISR ((AT91_REG *) 0xFFFA401C) // (AES) Interrupt Status Register +// ========== Register definition for PDC_TDES peripheral ========== +#define AT91C_TDES_RNCR ((AT91_REG *) 0xFFFA8114) // (PDC_TDES) Receive Next Counter Register +#define AT91C_TDES_TCR ((AT91_REG *) 0xFFFA810C) // (PDC_TDES) Transmit Counter Register +#define AT91C_TDES_RCR ((AT91_REG *) 0xFFFA8104) // (PDC_TDES) Receive Counter Register +#define AT91C_TDES_TNPR ((AT91_REG *) 0xFFFA8118) // (PDC_TDES) Transmit Next Pointer Register +#define AT91C_TDES_RNPR ((AT91_REG *) 0xFFFA8110) // (PDC_TDES) Receive Next Pointer Register +#define AT91C_TDES_RPR ((AT91_REG *) 0xFFFA8100) // (PDC_TDES) Receive Pointer Register +#define AT91C_TDES_TNCR ((AT91_REG *) 0xFFFA811C) // (PDC_TDES) Transmit Next Counter Register +#define AT91C_TDES_TPR ((AT91_REG *) 0xFFFA8108) // (PDC_TDES) Transmit Pointer Register +#define AT91C_TDES_PTSR ((AT91_REG *) 0xFFFA8124) // (PDC_TDES) PDC Transfer Status Register +#define AT91C_TDES_PTCR ((AT91_REG *) 0xFFFA8120) // (PDC_TDES) PDC Transfer Control Register +// ========== Register definition for TDES peripheral ========== +#define AT91C_TDES_KEY2WxR ((AT91_REG *) 0xFFFA8028) // (TDES) Key 2 Word x Register +#define AT91C_TDES_KEY3WxR ((AT91_REG *) 0xFFFA8030) // (TDES) Key 3 Word x Register +#define AT91C_TDES_IDR ((AT91_REG *) 0xFFFA8014) // (TDES) Interrupt Disable Register +#define AT91C_TDES_VR ((AT91_REG *) 0xFFFA80FC) // (TDES) TDES Version Register +#define AT91C_TDES_IVxR ((AT91_REG *) 0xFFFA8060) // (TDES) Initialization Vector x Register +#define AT91C_TDES_ODATAxR ((AT91_REG *) 0xFFFA8050) // (TDES) Output Data x Register +#define AT91C_TDES_IMR ((AT91_REG *) 0xFFFA8018) // (TDES) Interrupt Mask Register +#define AT91C_TDES_MR ((AT91_REG *) 0xFFFA8004) // (TDES) Mode Register +#define AT91C_TDES_CR ((AT91_REG *) 0xFFFA8000) // (TDES) Control Register +#define AT91C_TDES_IER ((AT91_REG *) 0xFFFA8010) // (TDES) Interrupt Enable Register +#define AT91C_TDES_ISR ((AT91_REG *) 0xFFFA801C) // (TDES) Interrupt Status Register +#define AT91C_TDES_IDATAxR ((AT91_REG *) 0xFFFA8040) // (TDES) Input Data x Register +#define AT91C_TDES_KEY1WxR ((AT91_REG *) 0xFFFA8020) // (TDES) Key 1 Word x Register + +// ***************************************************************************** +// PIO DEFINITIONS FOR AT91SAM7X128 +// ***************************************************************************** +#define AT91C_PIO_PA0 ((unsigned int) 1 << 0) // Pin Controlled by PA0 +#define AT91C_PA0_RXD0 ((unsigned int) AT91C_PIO_PA0) // USART 0 Receive Data +#define AT91C_PIO_PA1 ((unsigned int) 1 << 1) // Pin Controlled by PA1 +#define AT91C_PA1_TXD0 ((unsigned int) AT91C_PIO_PA1) // USART 0 Transmit Data +#define AT91C_PIO_PA10 ((unsigned int) 1 << 10) // Pin Controlled by PA10 +#define AT91C_PA10_TWD ((unsigned int) AT91C_PIO_PA10) // TWI Two-wire Serial Data +#define AT91C_PIO_PA11 ((unsigned int) 1 << 11) // Pin Controlled by PA11 +#define AT91C_PA11_TWCK ((unsigned int) AT91C_PIO_PA11) // TWI Two-wire Serial Clock +#define AT91C_PIO_PA12 ((unsigned int) 1 << 12) // Pin Controlled by PA12 +#define AT91C_PA12_NPCS00 ((unsigned int) AT91C_PIO_PA12) // SPI 0 Peripheral Chip Select 0 +#define AT91C_PIO_PA13 ((unsigned int) 1 << 13) // Pin Controlled by PA13 +#define AT91C_PA13_NPCS01 ((unsigned int) AT91C_PIO_PA13) // SPI 0 Peripheral Chip Select 1 +#define AT91C_PA13_PCK1 ((unsigned int) AT91C_PIO_PA13) // PMC Programmable Clock Output 1 +#define AT91C_PIO_PA14 ((unsigned int) 1 << 14) // Pin Controlled by PA14 +#define AT91C_PA14_NPCS02 ((unsigned int) AT91C_PIO_PA14) // SPI 0 Peripheral Chip Select 2 +#define AT91C_PA14_IRQ1 ((unsigned int) AT91C_PIO_PA14) // External Interrupt 1 +#define AT91C_PIO_PA15 ((unsigned int) 1 << 15) // Pin Controlled by PA15 +#define AT91C_PA15_NPCS03 ((unsigned int) AT91C_PIO_PA15) // SPI 0 Peripheral Chip Select 3 +#define AT91C_PA15_TCLK2 ((unsigned int) AT91C_PIO_PA15) // Timer Counter 2 external clock input +#define AT91C_PIO_PA16 ((unsigned int) 1 << 16) // Pin Controlled by PA16 +#define AT91C_PA16_MISO0 ((unsigned int) AT91C_PIO_PA16) // SPI 0 Master In Slave +#define AT91C_PIO_PA17 ((unsigned int) 1 << 17) // Pin Controlled by PA17 +#define AT91C_PA17_MOSI0 ((unsigned int) AT91C_PIO_PA17) // SPI 0 Master Out Slave +#define AT91C_PIO_PA18 ((unsigned int) 1 << 18) // Pin Controlled by PA18 +#define AT91C_PA18_SPCK0 ((unsigned int) AT91C_PIO_PA18) // SPI 0 Serial Clock +#define AT91C_PIO_PA19 ((unsigned int) 1 << 19) // Pin Controlled by PA19 +#define AT91C_PA19_CANRX ((unsigned int) AT91C_PIO_PA19) // CAN Receive +#define AT91C_PIO_PA2 ((unsigned int) 1 << 2) // Pin Controlled by PA2 +#define AT91C_PA2_SCK0 ((unsigned int) AT91C_PIO_PA2) // USART 0 Serial Clock +#define AT91C_PA2_NPCS11 ((unsigned int) AT91C_PIO_PA2) // SPI 1 Peripheral Chip Select 1 +#define AT91C_PIO_PA20 ((unsigned int) 1 << 20) // Pin Controlled by PA20 +#define AT91C_PA20_CANTX ((unsigned int) AT91C_PIO_PA20) // CAN Transmit +#define AT91C_PIO_PA21 ((unsigned int) 1 << 21) // Pin Controlled by PA21 +#define AT91C_PA21_TF ((unsigned int) AT91C_PIO_PA21) // SSC Transmit Frame Sync +#define AT91C_PA21_NPCS10 ((unsigned int) AT91C_PIO_PA21) // SPI 1 Peripheral Chip Select 0 +#define AT91C_PIO_PA22 ((unsigned int) 1 << 22) // Pin Controlled by PA22 +#define AT91C_PA22_TK ((unsigned int) AT91C_PIO_PA22) // SSC Transmit Clock +#define AT91C_PA22_SPCK1 ((unsigned int) AT91C_PIO_PA22) // SPI 1 Serial Clock +#define AT91C_PIO_PA23 ((unsigned int) 1 << 23) // Pin Controlled by PA23 +#define AT91C_PA23_TD ((unsigned int) AT91C_PIO_PA23) // SSC Transmit data +#define AT91C_PA23_MOSI1 ((unsigned int) AT91C_PIO_PA23) // SPI 1 Master Out Slave +#define AT91C_PIO_PA24 ((unsigned int) 1 << 24) // Pin Controlled by PA24 +#define AT91C_PA24_RD ((unsigned int) AT91C_PIO_PA24) // SSC Receive Data +#define AT91C_PA24_MISO1 ((unsigned int) AT91C_PIO_PA24) // SPI 1 Master In Slave +#define AT91C_PIO_PA25 ((unsigned int) 1 << 25) // Pin Controlled by PA25 +#define AT91C_PA25_RK ((unsigned int) AT91C_PIO_PA25) // SSC Receive Clock +#define AT91C_PA25_NPCS11 ((unsigned int) AT91C_PIO_PA25) // SPI 1 Peripheral Chip Select 1 +#define AT91C_PIO_PA26 ((unsigned int) 1 << 26) // Pin Controlled by PA26 +#define AT91C_PA26_RF ((unsigned int) AT91C_PIO_PA26) // SSC Receive Frame Sync +#define AT91C_PA26_NPCS12 ((unsigned int) AT91C_PIO_PA26) // SPI 1 Peripheral Chip Select 2 +#define AT91C_PIO_PA27 ((unsigned int) 1 << 27) // Pin Controlled by PA27 +#define AT91C_PA27_DRXD ((unsigned int) AT91C_PIO_PA27) // DBGU Debug Receive Data +#define AT91C_PA27_PCK3 ((unsigned int) AT91C_PIO_PA27) // PMC Programmable Clock Output 3 +#define AT91C_PIO_PA28 ((unsigned int) 1 << 28) // Pin Controlled by PA28 +#define AT91C_PA28_DTXD ((unsigned int) AT91C_PIO_PA28) // DBGU Debug Transmit Data +#define AT91C_PIO_PA29 ((unsigned int) 1 << 29) // Pin Controlled by PA29 +#define AT91C_PA29_FIQ ((unsigned int) AT91C_PIO_PA29) // AIC Fast Interrupt Input +#define AT91C_PA29_NPCS13 ((unsigned int) AT91C_PIO_PA29) // SPI 1 Peripheral Chip Select 3 +#define AT91C_PIO_PA3 ((unsigned int) 1 << 3) // Pin Controlled by PA3 +#define AT91C_PA3_RTS0 ((unsigned int) AT91C_PIO_PA3) // USART 0 Ready To Send +#define AT91C_PA3_NPCS12 ((unsigned int) AT91C_PIO_PA3) // SPI 1 Peripheral Chip Select 2 +#define AT91C_PIO_PA30 ((unsigned int) 1 << 30) // Pin Controlled by PA30 +#define AT91C_PA30_IRQ0 ((unsigned int) AT91C_PIO_PA30) // External Interrupt 0 +#define AT91C_PA30_PCK2 ((unsigned int) AT91C_PIO_PA30) // PMC Programmable Clock Output 2 +#define AT91C_PIO_PA4 ((unsigned int) 1 << 4) // Pin Controlled by PA4 +#define AT91C_PA4_CTS0 ((unsigned int) AT91C_PIO_PA4) // USART 0 Clear To Send +#define AT91C_PA4_NPCS13 ((unsigned int) AT91C_PIO_PA4) // SPI 1 Peripheral Chip Select 3 +#define AT91C_PIO_PA5 ((unsigned int) 1 << 5) // Pin Controlled by PA5 +#define AT91C_PA5_RXD1 ((unsigned int) AT91C_PIO_PA5) // USART 1 Receive Data +#define AT91C_PIO_PA6 ((unsigned int) 1 << 6) // Pin Controlled by PA6 +#define AT91C_PA6_TXD1 ((unsigned int) AT91C_PIO_PA6) // USART 1 Transmit Data +#define AT91C_PIO_PA7 ((unsigned int) 1 << 7) // Pin Controlled by PA7 +#define AT91C_PA7_SCK1 ((unsigned int) AT91C_PIO_PA7) // USART 1 Serial Clock +#define AT91C_PA7_NPCS01 ((unsigned int) AT91C_PIO_PA7) // SPI 0 Peripheral Chip Select 1 +#define AT91C_PIO_PA8 ((unsigned int) 1 << 8) // Pin Controlled by PA8 +#define AT91C_PA8_RTS1 ((unsigned int) AT91C_PIO_PA8) // USART 1 Ready To Send +#define AT91C_PA8_NPCS02 ((unsigned int) AT91C_PIO_PA8) // SPI 0 Peripheral Chip Select 2 +#define AT91C_PIO_PA9 ((unsigned int) 1 << 9) // Pin Controlled by PA9 +#define AT91C_PA9_CTS1 ((unsigned int) AT91C_PIO_PA9) // USART 1 Clear To Send +#define AT91C_PA9_NPCS03 ((unsigned int) AT91C_PIO_PA9) // SPI 0 Peripheral Chip Select 3 +#define AT91C_PIO_PB0 ((unsigned int) 1 << 0) // Pin Controlled by PB0 +#define AT91C_PB0_ETXCK_EREFCK ((unsigned int) AT91C_PIO_PB0) // Ethernet MAC Transmit Clock/Reference Clock +#define AT91C_PB0_PCK0 ((unsigned int) AT91C_PIO_PB0) // PMC Programmable Clock Output 0 +#define AT91C_PIO_PB1 ((unsigned int) 1 << 1) // Pin Controlled by PB1 +#define AT91C_PB1_ETXEN ((unsigned int) AT91C_PIO_PB1) // Ethernet MAC Transmit Enable +#define AT91C_PIO_PB10 ((unsigned int) 1 << 10) // Pin Controlled by PB10 +#define AT91C_PB10_ETX2 ((unsigned int) AT91C_PIO_PB10) // Ethernet MAC Transmit Data 2 +#define AT91C_PB10_NPCS11 ((unsigned int) AT91C_PIO_PB10) // SPI 1 Peripheral Chip Select 1 +#define AT91C_PIO_PB11 ((unsigned int) 1 << 11) // Pin Controlled by PB11 +#define AT91C_PB11_ETX3 ((unsigned int) AT91C_PIO_PB11) // Ethernet MAC Transmit Data 3 +#define AT91C_PB11_NPCS12 ((unsigned int) AT91C_PIO_PB11) // SPI 1 Peripheral Chip Select 2 +#define AT91C_PIO_PB12 ((unsigned int) 1 << 12) // Pin Controlled by PB12 +#define AT91C_PB12_ETXER ((unsigned int) AT91C_PIO_PB12) // Ethernet MAC Transmikt Coding Error +#define AT91C_PB12_TCLK0 ((unsigned int) AT91C_PIO_PB12) // Timer Counter 0 external clock input +#define AT91C_PIO_PB13 ((unsigned int) 1 << 13) // Pin Controlled by PB13 +#define AT91C_PB13_ERX2 ((unsigned int) AT91C_PIO_PB13) // Ethernet MAC Receive Data 2 +#define AT91C_PB13_NPCS01 ((unsigned int) AT91C_PIO_PB13) // SPI 0 Peripheral Chip Select 1 +#define AT91C_PIO_PB14 ((unsigned int) 1 << 14) // Pin Controlled by PB14 +#define AT91C_PB14_ERX3 ((unsigned int) AT91C_PIO_PB14) // Ethernet MAC Receive Data 3 +#define AT91C_PB14_NPCS02 ((unsigned int) AT91C_PIO_PB14) // SPI 0 Peripheral Chip Select 2 +#define AT91C_PIO_PB15 ((unsigned int) 1 << 15) // Pin Controlled by PB15 +#define AT91C_PB15_ERXDV ((unsigned int) AT91C_PIO_PB15) // Ethernet MAC Receive Data Valid +#define AT91C_PIO_PB16 ((unsigned int) 1 << 16) // Pin Controlled by PB16 +#define AT91C_PB16_ECOL ((unsigned int) AT91C_PIO_PB16) // Ethernet MAC Collision Detected +#define AT91C_PB16_NPCS13 ((unsigned int) AT91C_PIO_PB16) // SPI 1 Peripheral Chip Select 3 +#define AT91C_PIO_PB17 ((unsigned int) 1 << 17) // Pin Controlled by PB17 +#define AT91C_PB17_ERXCK ((unsigned int) AT91C_PIO_PB17) // Ethernet MAC Receive Clock +#define AT91C_PB17_NPCS03 ((unsigned int) AT91C_PIO_PB17) // SPI 0 Peripheral Chip Select 3 +#define AT91C_PIO_PB18 ((unsigned int) 1 << 18) // Pin Controlled by PB18 +#define AT91C_PB18_EF100 ((unsigned int) AT91C_PIO_PB18) // Ethernet MAC Force 100 Mbits/sec +#define AT91C_PB18_ADTRG ((unsigned int) AT91C_PIO_PB18) // ADC External Trigger +#define AT91C_PIO_PB19 ((unsigned int) 1 << 19) // Pin Controlled by PB19 +#define AT91C_PB19_PWM0 ((unsigned int) AT91C_PIO_PB19) // PWM Channel 0 +#define AT91C_PB19_TCLK1 ((unsigned int) AT91C_PIO_PB19) // Timer Counter 1 external clock input +#define AT91C_PIO_PB2 ((unsigned int) 1 << 2) // Pin Controlled by PB2 +#define AT91C_PB2_ETX0 ((unsigned int) AT91C_PIO_PB2) // Ethernet MAC Transmit Data 0 +#define AT91C_PIO_PB20 ((unsigned int) 1 << 20) // Pin Controlled by PB20 +#define AT91C_PB20_PWM1 ((unsigned int) AT91C_PIO_PB20) // PWM Channel 1 +#define AT91C_PB20_PCK0 ((unsigned int) AT91C_PIO_PB20) // PMC Programmable Clock Output 0 +#define AT91C_PIO_PB21 ((unsigned int) 1 << 21) // Pin Controlled by PB21 +#define AT91C_PB21_PWM2 ((unsigned int) AT91C_PIO_PB21) // PWM Channel 2 +#define AT91C_PB21_PCK1 ((unsigned int) AT91C_PIO_PB21) // PMC Programmable Clock Output 1 +#define AT91C_PIO_PB22 ((unsigned int) 1 << 22) // Pin Controlled by PB22 +#define AT91C_PB22_PWM3 ((unsigned int) AT91C_PIO_PB22) // PWM Channel 3 +#define AT91C_PB22_PCK2 ((unsigned int) AT91C_PIO_PB22) // PMC Programmable Clock Output 2 +#define AT91C_PIO_PB23 ((unsigned int) 1 << 23) // Pin Controlled by PB23 +#define AT91C_PB23_TIOA0 ((unsigned int) AT91C_PIO_PB23) // Timer Counter 0 Multipurpose Timer I/O Pin A +#define AT91C_PB23_DCD1 ((unsigned int) AT91C_PIO_PB23) // USART 1 Data Carrier Detect +#define AT91C_PIO_PB24 ((unsigned int) 1 << 24) // Pin Controlled by PB24 +#define AT91C_PB24_TIOB0 ((unsigned int) AT91C_PIO_PB24) // Timer Counter 0 Multipurpose Timer I/O Pin B +#define AT91C_PB24_DSR1 ((unsigned int) AT91C_PIO_PB24) // USART 1 Data Set ready +#define AT91C_PIO_PB25 ((unsigned int) 1 << 25) // Pin Controlled by PB25 +#define AT91C_PB25_TIOA1 ((unsigned int) AT91C_PIO_PB25) // Timer Counter 1 Multipurpose Timer I/O Pin A +#define AT91C_PB25_DTR1 ((unsigned int) AT91C_PIO_PB25) // USART 1 Data Terminal ready +#define AT91C_PIO_PB26 ((unsigned int) 1 << 26) // Pin Controlled by PB26 +#define AT91C_PB26_TIOB1 ((unsigned int) AT91C_PIO_PB26) // Timer Counter 1 Multipurpose Timer I/O Pin B +#define AT91C_PB26_RI1 ((unsigned int) AT91C_PIO_PB26) // USART 1 Ring Indicator +#define AT91C_PIO_PB27 ((unsigned int) 1 << 27) // Pin Controlled by PB27 +#define AT91C_PB27_TIOA2 ((unsigned int) AT91C_PIO_PB27) // Timer Counter 2 Multipurpose Timer I/O Pin A +#define AT91C_PB27_PWM0 ((unsigned int) AT91C_PIO_PB27) // PWM Channel 0 +#define AT91C_PIO_PB28 ((unsigned int) 1 << 28) // Pin Controlled by PB28 +#define AT91C_PB28_TIOB2 ((unsigned int) AT91C_PIO_PB28) // Timer Counter 2 Multipurpose Timer I/O Pin B +#define AT91C_PB28_PWM1 ((unsigned int) AT91C_PIO_PB28) // PWM Channel 1 +#define AT91C_PIO_PB29 ((unsigned int) 1 << 29) // Pin Controlled by PB29 +#define AT91C_PB29_PCK1 ((unsigned int) AT91C_PIO_PB29) // PMC Programmable Clock Output 1 +#define AT91C_PB29_PWM2 ((unsigned int) AT91C_PIO_PB29) // PWM Channel 2 +#define AT91C_PIO_PB3 ((unsigned int) 1 << 3) // Pin Controlled by PB3 +#define AT91C_PB3_ETX1 ((unsigned int) AT91C_PIO_PB3) // Ethernet MAC Transmit Data 1 +#define AT91C_PIO_PB30 ((unsigned int) 1 << 30) // Pin Controlled by PB30 +#define AT91C_PB30_PCK2 ((unsigned int) AT91C_PIO_PB30) // PMC Programmable Clock Output 2 +#define AT91C_PB30_PWM3 ((unsigned int) AT91C_PIO_PB30) // PWM Channel 3 +#define AT91C_PIO_PB4 ((unsigned int) 1 << 4) // Pin Controlled by PB4 +#define AT91C_PB4_ECRS_ECRSDV ((unsigned int) AT91C_PIO_PB4) // Ethernet MAC Carrier Sense/Carrier Sense and Data Valid +#define AT91C_PIO_PB5 ((unsigned int) 1 << 5) // Pin Controlled by PB5 +#define AT91C_PB5_ERX0 ((unsigned int) AT91C_PIO_PB5) // Ethernet MAC Receive Data 0 +#define AT91C_PIO_PB6 ((unsigned int) 1 << 6) // Pin Controlled by PB6 +#define AT91C_PB6_ERX1 ((unsigned int) AT91C_PIO_PB6) // Ethernet MAC Receive Data 1 +#define AT91C_PIO_PB7 ((unsigned int) 1 << 7) // Pin Controlled by PB7 +#define AT91C_PB7_ERXER ((unsigned int) AT91C_PIO_PB7) // Ethernet MAC Receive Error +#define AT91C_PIO_PB8 ((unsigned int) 1 << 8) // Pin Controlled by PB8 +#define AT91C_PB8_EMDC ((unsigned int) AT91C_PIO_PB8) // Ethernet MAC Management Data Clock +#define AT91C_PIO_PB9 ((unsigned int) 1 << 9) // Pin Controlled by PB9 +#define AT91C_PB9_EMDIO ((unsigned int) AT91C_PIO_PB9) // Ethernet MAC Management Data Input/Output + +// ***************************************************************************** +// PERIPHERAL ID DEFINITIONS FOR AT91SAM7X128 +// ***************************************************************************** +#define AT91C_ID_FIQ ((unsigned int) 0) // Advanced Interrupt Controller (FIQ) +#define AT91C_ID_SYS ((unsigned int) 1) // System Peripheral +#define AT91C_ID_PIOA ((unsigned int) 2) // Parallel IO Controller A +#define AT91C_ID_PIOB ((unsigned int) 3) // Parallel IO Controller B +#define AT91C_ID_SPI0 ((unsigned int) 4) // Serial Peripheral Interface 0 +#define AT91C_ID_SPI1 ((unsigned int) 5) // Serial Peripheral Interface 1 +#define AT91C_ID_US0 ((unsigned int) 6) // USART 0 +#define AT91C_ID_US1 ((unsigned int) 7) // USART 1 +#define AT91C_ID_SSC ((unsigned int) 8) // Serial Synchronous Controller +#define AT91C_ID_TWI ((unsigned int) 9) // Two-Wire Interface +#define AT91C_ID_PWMC ((unsigned int) 10) // PWM Controller +#define AT91C_ID_UDP ((unsigned int) 11) // USB Device Port +#define AT91C_ID_TC0 ((unsigned int) 12) // Timer Counter 0 +#define AT91C_ID_TC1 ((unsigned int) 13) // Timer Counter 1 +#define AT91C_ID_TC2 ((unsigned int) 14) // Timer Counter 2 +#define AT91C_ID_CAN ((unsigned int) 15) // Control Area Network Controller +#define AT91C_ID_EMAC ((unsigned int) 16) // Ethernet MAC +#define AT91C_ID_ADC ((unsigned int) 17) // Analog-to-Digital Converter +#define AT91C_ID_AES ((unsigned int) 18) // Advanced Encryption Standard 128-bit +#define AT91C_ID_TDES ((unsigned int) 19) // Triple Data Encryption Standard +#define AT91C_ID_20_Reserved ((unsigned int) 20) // Reserved +#define AT91C_ID_21_Reserved ((unsigned int) 21) // Reserved +#define AT91C_ID_22_Reserved ((unsigned int) 22) // Reserved +#define AT91C_ID_23_Reserved ((unsigned int) 23) // Reserved +#define AT91C_ID_24_Reserved ((unsigned int) 24) // Reserved +#define AT91C_ID_25_Reserved ((unsigned int) 25) // Reserved +#define AT91C_ID_26_Reserved ((unsigned int) 26) // Reserved +#define AT91C_ID_27_Reserved ((unsigned int) 27) // Reserved +#define AT91C_ID_28_Reserved ((unsigned int) 28) // Reserved +#define AT91C_ID_29_Reserved ((unsigned int) 29) // Reserved +#define AT91C_ID_IRQ0 ((unsigned int) 30) // Advanced Interrupt Controller (IRQ0) +#define AT91C_ID_IRQ1 ((unsigned int) 31) // Advanced Interrupt Controller (IRQ1) + +// ***************************************************************************** +// BASE ADDRESS DEFINITIONS FOR AT91SAM7X128 +// ***************************************************************************** +#define AT91C_BASE_SYS ((AT91PS_SYS) 0xFFFFF000) // (SYS) Base Address +#define AT91C_BASE_AIC ((AT91PS_AIC) 0xFFFFF000) // (AIC) Base Address +#define AT91C_BASE_PDC_DBGU ((AT91PS_PDC) 0xFFFFF300) // (PDC_DBGU) Base Address +#define AT91C_BASE_DBGU ((AT91PS_DBGU) 0xFFFFF200) // (DBGU) Base Address +#define AT91C_BASE_PIOA ((AT91PS_PIO) 0xFFFFF400) // (PIOA) Base Address +#define AT91C_BASE_PIOB ((AT91PS_PIO) 0xFFFFF600) // (PIOB) Base Address +#define AT91C_BASE_CKGR ((AT91PS_CKGR) 0xFFFFFC20) // (CKGR) Base Address +#define AT91C_BASE_PMC ((AT91PS_PMC) 0xFFFFFC00) // (PMC) Base Address +#define AT91C_BASE_RSTC ((AT91PS_RSTC) 0xFFFFFD00) // (RSTC) Base Address +#define AT91C_BASE_RTTC ((AT91PS_RTTC) 0xFFFFFD20) // (RTTC) Base Address +#define AT91C_BASE_PITC ((AT91PS_PITC) 0xFFFFFD30) // (PITC) Base Address +#define AT91C_BASE_WDTC ((AT91PS_WDTC) 0xFFFFFD40) // (WDTC) Base Address +#define AT91C_BASE_VREG ((AT91PS_VREG) 0xFFFFFD60) // (VREG) Base Address +#define AT91C_BASE_MC ((AT91PS_MC) 0xFFFFFF00) // (MC) Base Address +#define AT91C_BASE_PDC_SPI1 ((AT91PS_PDC) 0xFFFE4100) // (PDC_SPI1) Base Address +#define AT91C_BASE_SPI1 ((AT91PS_SPI) 0xFFFE4000) // (SPI1) Base Address +#define AT91C_BASE_PDC_SPI0 ((AT91PS_PDC) 0xFFFE0100) // (PDC_SPI0) Base Address +#define AT91C_BASE_SPI0 ((AT91PS_SPI) 0xFFFE0000) // (SPI0) Base Address +#define AT91C_BASE_PDC_US1 ((AT91PS_PDC) 0xFFFC4100) // (PDC_US1) Base Address +#define AT91C_BASE_US1 ((AT91PS_USART) 0xFFFC4000) // (US1) Base Address +#define AT91C_BASE_PDC_US0 ((AT91PS_PDC) 0xFFFC0100) // (PDC_US0) Base Address +#define AT91C_BASE_US0 ((AT91PS_USART) 0xFFFC0000) // (US0) Base Address +#define AT91C_BASE_PDC_SSC ((AT91PS_PDC) 0xFFFD4100) // (PDC_SSC) Base Address +#define AT91C_BASE_SSC ((AT91PS_SSC) 0xFFFD4000) // (SSC) Base Address +#define AT91C_BASE_TWI ((AT91PS_TWI) 0xFFFB8000) // (TWI) Base Address +#define AT91C_BASE_PWMC_CH3 ((AT91PS_PWMC_CH) 0xFFFCC260) // (PWMC_CH3) Base Address +#define AT91C_BASE_PWMC_CH2 ((AT91PS_PWMC_CH) 0xFFFCC240) // (PWMC_CH2) Base Address +#define AT91C_BASE_PWMC_CH1 ((AT91PS_PWMC_CH) 0xFFFCC220) // (PWMC_CH1) Base Address +#define AT91C_BASE_PWMC_CH0 ((AT91PS_PWMC_CH) 0xFFFCC200) // (PWMC_CH0) Base Address +#define AT91C_BASE_PWMC ((AT91PS_PWMC) 0xFFFCC000) // (PWMC) Base Address +#define AT91C_BASE_UDP ((AT91PS_UDP) 0xFFFB0000) // (UDP) Base Address +#define AT91C_BASE_TC0 ((AT91PS_TC) 0xFFFA0000) // (TC0) Base Address +#define AT91C_BASE_TC1 ((AT91PS_TC) 0xFFFA0040) // (TC1) Base Address +#define AT91C_BASE_TC2 ((AT91PS_TC) 0xFFFA0080) // (TC2) Base Address +#define AT91C_BASE_TCB ((AT91PS_TCB) 0xFFFA0000) // (TCB) Base Address +#define AT91C_BASE_CAN_MB0 ((AT91PS_CAN_MB) 0xFFFD0200) // (CAN_MB0) Base Address +#define AT91C_BASE_CAN_MB1 ((AT91PS_CAN_MB) 0xFFFD0220) // (CAN_MB1) Base Address +#define AT91C_BASE_CAN_MB2 ((AT91PS_CAN_MB) 0xFFFD0240) // (CAN_MB2) Base Address +#define AT91C_BASE_CAN_MB3 ((AT91PS_CAN_MB) 0xFFFD0260) // (CAN_MB3) Base Address +#define AT91C_BASE_CAN_MB4 ((AT91PS_CAN_MB) 0xFFFD0280) // (CAN_MB4) Base Address +#define AT91C_BASE_CAN_MB5 ((AT91PS_CAN_MB) 0xFFFD02A0) // (CAN_MB5) Base Address +#define AT91C_BASE_CAN_MB6 ((AT91PS_CAN_MB) 0xFFFD02C0) // (CAN_MB6) Base Address +#define AT91C_BASE_CAN_MB7 ((AT91PS_CAN_MB) 0xFFFD02E0) // (CAN_MB7) Base Address +#define AT91C_BASE_CAN ((AT91PS_CAN) 0xFFFD0000) // (CAN) Base Address +#define AT91C_BASE_EMAC ((AT91PS_EMAC) 0xFFFDC000) // (EMAC) Base Address +#define AT91C_BASE_PDC_ADC ((AT91PS_PDC) 0xFFFD8100) // (PDC_ADC) Base Address +#define AT91C_BASE_ADC ((AT91PS_ADC) 0xFFFD8000) // (ADC) Base Address +#define AT91C_BASE_PDC_AES ((AT91PS_PDC) 0xFFFA4100) // (PDC_AES) Base Address +#define AT91C_BASE_AES ((AT91PS_AES) 0xFFFA4000) // (AES) Base Address +#define AT91C_BASE_PDC_TDES ((AT91PS_PDC) 0xFFFA8100) // (PDC_TDES) Base Address +#define AT91C_BASE_TDES ((AT91PS_TDES) 0xFFFA8000) // (TDES) Base Address + +// ***************************************************************************** +// MEMORY MAPPING DEFINITIONS FOR AT91SAM7X128 +// ***************************************************************************** +#define AT91C_ISRAM ((char *) 0x00200000) // Internal SRAM base address +#define AT91C_ISRAM_SIZE ((unsigned int) 0x00008000) // Internal SRAM size in byte (32 Kbyte) +#define AT91C_IFLASH ((char *) 0x00100000) // Internal ROM base address +#define AT91C_IFLASH_SIZE ((unsigned int) 0x00020000) // Internal ROM size in byte (128 Kbyte) + +#endif diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM7S64/AT91SAM7X128_inc.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM7S64/AT91SAM7X128_inc.h new file mode 100644 index 0000000..96b680a --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM7S64/AT91SAM7X128_inc.h @@ -0,0 +1,2446 @@ +// ---------------------------------------------------------------------------- +// ATMEL Microcontroller Software Support - ROUSSET - +// ---------------------------------------------------------------------------- +// DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR +// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE +// DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT, +// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- +// File Name : AT91SAM7X128.h +// Object : AT91SAM7X128 definitions +// Generated : AT91 SW Application Group 05/20/2005 (16:22:23) +// +// CVS Reference : /AT91SAM7X128.pl/1.14/Tue May 10 12:12:05 2005// +// CVS Reference : /SYS_SAM7X.pl/1.3/Tue Feb 1 17:01:43 2005// +// CVS Reference : /MC_SAM7X.pl/1.2/Fri May 20 14:13:04 2005// +// CVS Reference : /PMC_SAM7X.pl/1.4/Tue Feb 8 13:58:10 2005// +// CVS Reference : /RSTC_SAM7X.pl/1.1/Tue Feb 1 16:16:26 2005// +// CVS Reference : /UDP_SAM7X.pl/1.1/Tue May 10 11:35:35 2005// +// CVS Reference : /PWM_SAM7X.pl/1.1/Tue May 10 11:53:07 2005// +// CVS Reference : /AIC_6075B.pl/1.3/Fri May 20 14:01:30 2005// +// CVS Reference : /PIO_6057A.pl/1.2/Thu Feb 3 10:18:28 2005// +// CVS Reference : /RTTC_6081A.pl/1.2/Tue Nov 9 14:43:58 2004// +// CVS Reference : /PITC_6079A.pl/1.2/Tue Nov 9 14:43:56 2004// +// CVS Reference : /WDTC_6080A.pl/1.3/Tue Nov 9 14:44:00 2004// +// CVS Reference : /VREG_6085B.pl/1.1/Tue Feb 1 16:05:48 2005// +// CVS Reference : /PDC_6074C.pl/1.2/Thu Feb 3 08:48:54 2005// +// CVS Reference : /DBGU_6059D.pl/1.1/Mon Jan 31 13:15:32 2005// +// CVS Reference : /SPI_6088D.pl/1.3/Fri May 20 14:08:59 2005// +// CVS Reference : /US_6089C.pl/1.1/Mon Jul 12 18:23:26 2004// +// CVS Reference : /SSC_6078A.pl/1.1/Tue Jul 13 07:45:40 2004// +// CVS Reference : /TWI_6061A.pl/1.1/Tue Jul 13 07:38:06 2004// +// CVS Reference : /TC_6082A.pl/1.7/Fri Mar 11 12:52:17 2005// +// CVS Reference : /CAN_6019B.pl/1.1/Tue Mar 8 12:42:22 2005// +// CVS Reference : /EMACB_6119A.pl/1.5/Thu Feb 3 15:52:04 2005// +// CVS Reference : /ADC_6051C.pl/1.1/Fri Oct 17 09:12:38 2003// +// CVS Reference : /AES_6149A.pl/1.10/Mon Feb 7 09:44:25 2005// +// CVS Reference : /DES3_6150A.pl/1.1/Mon Jan 17 08:34:31 2005// +// ---------------------------------------------------------------------------- + +// Hardware register definition + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR System Peripherals +// ***************************************************************************** + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Advanced Interrupt Controller +// ***************************************************************************** +// *** Register offset in AT91S_AIC structure *** +#define AIC_SMR ( 0) // Source Mode Register +#define AIC_SVR (128) // Source Vector Register +#define AIC_IVR (256) // IRQ Vector Register +#define AIC_FVR (260) // FIQ Vector Register +#define AIC_ISR (264) // Interrupt Status Register +#define AIC_IPR (268) // Interrupt Pending Register +#define AIC_IMR (272) // Interrupt Mask Register +#define AIC_CISR (276) // Core Interrupt Status Register +#define AIC_IECR (288) // Interrupt Enable Command Register +#define AIC_IDCR (292) // Interrupt Disable Command Register +#define AIC_ICCR (296) // Interrupt Clear Command Register +#define AIC_ISCR (300) // Interrupt Set Command Register +#define AIC_EOICR (304) // End of Interrupt Command Register +#define AIC_SPU (308) // Spurious Vector Register +#define AIC_DCR (312) // Debug Control Register (Protect) +#define AIC_FFER (320) // Fast Forcing Enable Register +#define AIC_FFDR (324) // Fast Forcing Disable Register +#define AIC_FFSR (328) // Fast Forcing Status Register +// -------- AIC_SMR : (AIC Offset: 0x0) Control Register -------- +#define AT91C_AIC_PRIOR (0x7 << 0) // (AIC) Priority Level +#define AT91C_AIC_PRIOR_LOWEST (0x0) // (AIC) Lowest priority level +#define AT91C_AIC_PRIOR_HIGHEST (0x7) // (AIC) Highest priority level +#define AT91C_AIC_SRCTYPE (0x3 << 5) // (AIC) Interrupt Source Type +#define AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL (0x0 << 5) // (AIC) Internal Sources Code Label High-level Sensitive +#define AT91C_AIC_SRCTYPE_EXT_LOW_LEVEL (0x0 << 5) // (AIC) External Sources Code Label Low-level Sensitive +#define AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE (0x1 << 5) // (AIC) Internal Sources Code Label Positive Edge triggered +#define AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE (0x1 << 5) // (AIC) External Sources Code Label Negative Edge triggered +#define AT91C_AIC_SRCTYPE_HIGH_LEVEL (0x2 << 5) // (AIC) Internal Or External Sources Code Label High-level Sensitive +#define AT91C_AIC_SRCTYPE_POSITIVE_EDGE (0x3 << 5) // (AIC) Internal Or External Sources Code Label Positive Edge triggered +// -------- AIC_CISR : (AIC Offset: 0x114) AIC Core Interrupt Status Register -------- +#define AT91C_AIC_NFIQ (0x1 << 0) // (AIC) NFIQ Status +#define AT91C_AIC_NIRQ (0x1 << 1) // (AIC) NIRQ Status +// -------- AIC_DCR : (AIC Offset: 0x138) AIC Debug Control Register (Protect) -------- +#define AT91C_AIC_DCR_PROT (0x1 << 0) // (AIC) Protection Mode +#define AT91C_AIC_DCR_GMSK (0x1 << 1) // (AIC) General Mask + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Peripheral DMA Controller +// ***************************************************************************** +// *** Register offset in AT91S_PDC structure *** +#define PDC_RPR ( 0) // Receive Pointer Register +#define PDC_RCR ( 4) // Receive Counter Register +#define PDC_TPR ( 8) // Transmit Pointer Register +#define PDC_TCR (12) // Transmit Counter Register +#define PDC_RNPR (16) // Receive Next Pointer Register +#define PDC_RNCR (20) // Receive Next Counter Register +#define PDC_TNPR (24) // Transmit Next Pointer Register +#define PDC_TNCR (28) // Transmit Next Counter Register +#define PDC_PTCR (32) // PDC Transfer Control Register +#define PDC_PTSR (36) // PDC Transfer Status Register +// -------- PDC_PTCR : (PDC Offset: 0x20) PDC Transfer Control Register -------- +#define AT91C_PDC_RXTEN (0x1 << 0) // (PDC) Receiver Transfer Enable +#define AT91C_PDC_RXTDIS (0x1 << 1) // (PDC) Receiver Transfer Disable +#define AT91C_PDC_TXTEN (0x1 << 8) // (PDC) Transmitter Transfer Enable +#define AT91C_PDC_TXTDIS (0x1 << 9) // (PDC) Transmitter Transfer Disable +// -------- PDC_PTSR : (PDC Offset: 0x24) PDC Transfer Status Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Debug Unit +// ***************************************************************************** +// *** Register offset in AT91S_DBGU structure *** +#define DBGU_CR ( 0) // Control Register +#define DBGU_MR ( 4) // Mode Register +#define DBGU_IER ( 8) // Interrupt Enable Register +#define DBGU_IDR (12) // Interrupt Disable Register +#define DBGU_IMR (16) // Interrupt Mask Register +#define DBGU_CSR (20) // Channel Status Register +#define DBGU_RHR (24) // Receiver Holding Register +#define DBGU_THR (28) // Transmitter Holding Register +#define DBGU_BRGR (32) // Baud Rate Generator Register +#define DBGU_CIDR (64) // Chip ID Register +#define DBGU_EXID (68) // Chip ID Extension Register +#define DBGU_FNTR (72) // Force NTRST Register +#define DBGU_RPR (256) // Receive Pointer Register +#define DBGU_RCR (260) // Receive Counter Register +#define DBGU_TPR (264) // Transmit Pointer Register +#define DBGU_TCR (268) // Transmit Counter Register +#define DBGU_RNPR (272) // Receive Next Pointer Register +#define DBGU_RNCR (276) // Receive Next Counter Register +#define DBGU_TNPR (280) // Transmit Next Pointer Register +#define DBGU_TNCR (284) // Transmit Next Counter Register +#define DBGU_PTCR (288) // PDC Transfer Control Register +#define DBGU_PTSR (292) // PDC Transfer Status Register +// -------- DBGU_CR : (DBGU Offset: 0x0) Debug Unit Control Register -------- +#define AT91C_US_RSTRX (0x1 << 2) // (DBGU) Reset Receiver +#define AT91C_US_RSTTX (0x1 << 3) // (DBGU) Reset Transmitter +#define AT91C_US_RXEN (0x1 << 4) // (DBGU) Receiver Enable +#define AT91C_US_RXDIS (0x1 << 5) // (DBGU) Receiver Disable +#define AT91C_US_TXEN (0x1 << 6) // (DBGU) Transmitter Enable +#define AT91C_US_TXDIS (0x1 << 7) // (DBGU) Transmitter Disable +#define AT91C_US_RSTSTA (0x1 << 8) // (DBGU) Reset Status Bits +// -------- DBGU_MR : (DBGU Offset: 0x4) Debug Unit Mode Register -------- +#define AT91C_US_PAR (0x7 << 9) // (DBGU) Parity type +#define AT91C_US_PAR_EVEN (0x0 << 9) // (DBGU) Even Parity +#define AT91C_US_PAR_ODD (0x1 << 9) // (DBGU) Odd Parity +#define AT91C_US_PAR_SPACE (0x2 << 9) // (DBGU) Parity forced to 0 (Space) +#define AT91C_US_PAR_MARK (0x3 << 9) // (DBGU) Parity forced to 1 (Mark) +#define AT91C_US_PAR_NONE (0x4 << 9) // (DBGU) No Parity +#define AT91C_US_PAR_MULTI_DROP (0x6 << 9) // (DBGU) Multi-drop mode +#define AT91C_US_CHMODE (0x3 << 14) // (DBGU) Channel Mode +#define AT91C_US_CHMODE_NORMAL (0x0 << 14) // (DBGU) Normal Mode: The USART channel operates as an RX/TX USART. +#define AT91C_US_CHMODE_AUTO (0x1 << 14) // (DBGU) Automatic Echo: Receiver Data Input is connected to the TXD pin. +#define AT91C_US_CHMODE_LOCAL (0x2 << 14) // (DBGU) Local Loopback: Transmitter Output Signal is connected to Receiver Input Signal. +#define AT91C_US_CHMODE_REMOTE (0x3 << 14) // (DBGU) Remote Loopback: RXD pin is internally connected to TXD pin. +// -------- DBGU_IER : (DBGU Offset: 0x8) Debug Unit Interrupt Enable Register -------- +#define AT91C_US_RXRDY (0x1 << 0) // (DBGU) RXRDY Interrupt +#define AT91C_US_TXRDY (0x1 << 1) // (DBGU) TXRDY Interrupt +#define AT91C_US_ENDRX (0x1 << 3) // (DBGU) End of Receive Transfer Interrupt +#define AT91C_US_ENDTX (0x1 << 4) // (DBGU) End of Transmit Interrupt +#define AT91C_US_OVRE (0x1 << 5) // (DBGU) Overrun Interrupt +#define AT91C_US_FRAME (0x1 << 6) // (DBGU) Framing Error Interrupt +#define AT91C_US_PARE (0x1 << 7) // (DBGU) Parity Error Interrupt +#define AT91C_US_TXEMPTY (0x1 << 9) // (DBGU) TXEMPTY Interrupt +#define AT91C_US_TXBUFE (0x1 << 11) // (DBGU) TXBUFE Interrupt +#define AT91C_US_RXBUFF (0x1 << 12) // (DBGU) RXBUFF Interrupt +#define AT91C_US_COMM_TX (0x1 << 30) // (DBGU) COMM_TX Interrupt +#define AT91C_US_COMM_RX (0x1 << 31) // (DBGU) COMM_RX Interrupt +// -------- DBGU_IDR : (DBGU Offset: 0xc) Debug Unit Interrupt Disable Register -------- +// -------- DBGU_IMR : (DBGU Offset: 0x10) Debug Unit Interrupt Mask Register -------- +// -------- DBGU_CSR : (DBGU Offset: 0x14) Debug Unit Channel Status Register -------- +// -------- DBGU_FNTR : (DBGU Offset: 0x48) Debug Unit FORCE_NTRST Register -------- +#define AT91C_US_FORCE_NTRST (0x1 << 0) // (DBGU) Force NTRST in JTAG + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Parallel Input Output Controler +// ***************************************************************************** +// *** Register offset in AT91S_PIO structure *** +#define PIO_PER ( 0) // PIO Enable Register +#define PIO_PDR ( 4) // PIO Disable Register +#define PIO_PSR ( 8) // PIO Status Register +#define PIO_OER (16) // Output Enable Register +#define PIO_ODR (20) // Output Disable Registerr +#define PIO_OSR (24) // Output Status Register +#define PIO_IFER (32) // Input Filter Enable Register +#define PIO_IFDR (36) // Input Filter Disable Register +#define PIO_IFSR (40) // Input Filter Status Register +#define PIO_SODR (48) // Set Output Data Register +#define PIO_CODR (52) // Clear Output Data Register +#define PIO_ODSR (56) // Output Data Status Register +#define PIO_PDSR (60) // Pin Data Status Register +#define PIO_IER (64) // Interrupt Enable Register +#define PIO_IDR (68) // Interrupt Disable Register +#define PIO_IMR (72) // Interrupt Mask Register +#define PIO_ISR (76) // Interrupt Status Register +#define PIO_MDER (80) // Multi-driver Enable Register +#define PIO_MDDR (84) // Multi-driver Disable Register +#define PIO_MDSR (88) // Multi-driver Status Register +#define PIO_PPUDR (96) // Pull-up Disable Register +#define PIO_PPUER (100) // Pull-up Enable Register +#define PIO_PPUSR (104) // Pull-up Status Register +#define PIO_ASR (112) // Select A Register +#define PIO_BSR (116) // Select B Register +#define PIO_ABSR (120) // AB Select Status Register +#define PIO_OWER (160) // Output Write Enable Register +#define PIO_OWDR (164) // Output Write Disable Register +#define PIO_OWSR (168) // Output Write Status Register + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Clock Generator Controler +// ***************************************************************************** +// *** Register offset in AT91S_CKGR structure *** +#define CKGR_MOR ( 0) // Main Oscillator Register +#define CKGR_MCFR ( 4) // Main Clock Frequency Register +#define CKGR_PLLR (12) // PLL Register +// -------- CKGR_MOR : (CKGR Offset: 0x0) Main Oscillator Register -------- +#define AT91C_CKGR_MOSCEN (0x1 << 0) // (CKGR) Main Oscillator Enable +#define AT91C_CKGR_OSCBYPASS (0x1 << 1) // (CKGR) Main Oscillator Bypass +#define AT91C_CKGR_OSCOUNT (0xFF << 8) // (CKGR) Main Oscillator Start-up Time +// -------- CKGR_MCFR : (CKGR Offset: 0x4) Main Clock Frequency Register -------- +#define AT91C_CKGR_MAINF (0xFFFF << 0) // (CKGR) Main Clock Frequency +#define AT91C_CKGR_MAINRDY (0x1 << 16) // (CKGR) Main Clock Ready +// -------- CKGR_PLLR : (CKGR Offset: 0xc) PLL B Register -------- +#define AT91C_CKGR_DIV (0xFF << 0) // (CKGR) Divider Selected +#define AT91C_CKGR_DIV_0 (0x0) // (CKGR) Divider output is 0 +#define AT91C_CKGR_DIV_BYPASS (0x1) // (CKGR) Divider is bypassed +#define AT91C_CKGR_PLLCOUNT (0x3F << 8) // (CKGR) PLL Counter +#define AT91C_CKGR_OUT (0x3 << 14) // (CKGR) PLL Output Frequency Range +#define AT91C_CKGR_OUT_0 (0x0 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_OUT_1 (0x1 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_OUT_2 (0x2 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_OUT_3 (0x3 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_MUL (0x7FF << 16) // (CKGR) PLL Multiplier +#define AT91C_CKGR_USBDIV (0x3 << 28) // (CKGR) Divider for USB Clocks +#define AT91C_CKGR_USBDIV_0 (0x0 << 28) // (CKGR) Divider output is PLL clock output +#define AT91C_CKGR_USBDIV_1 (0x1 << 28) // (CKGR) Divider output is PLL clock output divided by 2 +#define AT91C_CKGR_USBDIV_2 (0x2 << 28) // (CKGR) Divider output is PLL clock output divided by 4 + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Power Management Controler +// ***************************************************************************** +// *** Register offset in AT91S_PMC structure *** +#define PMC_SCER ( 0) // System Clock Enable Register +#define PMC_SCDR ( 4) // System Clock Disable Register +#define PMC_SCSR ( 8) // System Clock Status Register +#define PMC_PCER (16) // Peripheral Clock Enable Register +#define PMC_PCDR (20) // Peripheral Clock Disable Register +#define PMC_PCSR (24) // Peripheral Clock Status Register +#define PMC_MOR (32) // Main Oscillator Register +#define PMC_MCFR (36) // Main Clock Frequency Register +#define PMC_PLLR (44) // PLL Register +#define PMC_MCKR (48) // Master Clock Register +#define PMC_PCKR (64) // Programmable Clock Register +#define PMC_IER (96) // Interrupt Enable Register +#define PMC_IDR (100) // Interrupt Disable Register +#define PMC_SR (104) // Status Register +#define PMC_IMR (108) // Interrupt Mask Register +// -------- PMC_SCER : (PMC Offset: 0x0) System Clock Enable Register -------- +#define AT91C_PMC_PCK (0x1 << 0) // (PMC) Processor Clock +#define AT91C_PMC_UDP (0x1 << 7) // (PMC) USB Device Port Clock +#define AT91C_PMC_PCK0 (0x1 << 8) // (PMC) Programmable Clock Output +#define AT91C_PMC_PCK1 (0x1 << 9) // (PMC) Programmable Clock Output +#define AT91C_PMC_PCK2 (0x1 << 10) // (PMC) Programmable Clock Output +#define AT91C_PMC_PCK3 (0x1 << 11) // (PMC) Programmable Clock Output +// -------- PMC_SCDR : (PMC Offset: 0x4) System Clock Disable Register -------- +// -------- PMC_SCSR : (PMC Offset: 0x8) System Clock Status Register -------- +// -------- CKGR_MOR : (PMC Offset: 0x20) Main Oscillator Register -------- +// -------- CKGR_MCFR : (PMC Offset: 0x24) Main Clock Frequency Register -------- +// -------- CKGR_PLLR : (PMC Offset: 0x2c) PLL B Register -------- +// -------- PMC_MCKR : (PMC Offset: 0x30) Master Clock Register -------- +#define AT91C_PMC_CSS (0x3 << 0) // (PMC) Programmable Clock Selection +#define AT91C_PMC_CSS_SLOW_CLK (0x0) // (PMC) Slow Clock is selected +#define AT91C_PMC_CSS_MAIN_CLK (0x1) // (PMC) Main Clock is selected +#define AT91C_PMC_CSS_PLL_CLK (0x3) // (PMC) Clock from PLL is selected +#define AT91C_PMC_PRES (0x7 << 2) // (PMC) Programmable Clock Prescaler +#define AT91C_PMC_PRES_CLK (0x0 << 2) // (PMC) Selected clock +#define AT91C_PMC_PRES_CLK_2 (0x1 << 2) // (PMC) Selected clock divided by 2 +#define AT91C_PMC_PRES_CLK_4 (0x2 << 2) // (PMC) Selected clock divided by 4 +#define AT91C_PMC_PRES_CLK_8 (0x3 << 2) // (PMC) Selected clock divided by 8 +#define AT91C_PMC_PRES_CLK_16 (0x4 << 2) // (PMC) Selected clock divided by 16 +#define AT91C_PMC_PRES_CLK_32 (0x5 << 2) // (PMC) Selected clock divided by 32 +#define AT91C_PMC_PRES_CLK_64 (0x6 << 2) // (PMC) Selected clock divided by 64 +// -------- PMC_PCKR : (PMC Offset: 0x40) Programmable Clock Register -------- +// -------- PMC_IER : (PMC Offset: 0x60) PMC Interrupt Enable Register -------- +#define AT91C_PMC_MOSCS (0x1 << 0) // (PMC) MOSC Status/Enable/Disable/Mask +#define AT91C_PMC_LOCK (0x1 << 2) // (PMC) PLL Status/Enable/Disable/Mask +#define AT91C_PMC_MCKRDY (0x1 << 3) // (PMC) MCK_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK0RDY (0x1 << 8) // (PMC) PCK0_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK1RDY (0x1 << 9) // (PMC) PCK1_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK2RDY (0x1 << 10) // (PMC) PCK2_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK3RDY (0x1 << 11) // (PMC) PCK3_RDY Status/Enable/Disable/Mask +// -------- PMC_IDR : (PMC Offset: 0x64) PMC Interrupt Disable Register -------- +// -------- PMC_SR : (PMC Offset: 0x68) PMC Status Register -------- +// -------- PMC_IMR : (PMC Offset: 0x6c) PMC Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Reset Controller Interface +// ***************************************************************************** +// *** Register offset in AT91S_RSTC structure *** +#define RSTC_RCR ( 0) // Reset Control Register +#define RSTC_RSR ( 4) // Reset Status Register +#define RSTC_RMR ( 8) // Reset Mode Register +// -------- RSTC_RCR : (RSTC Offset: 0x0) Reset Control Register -------- +#define AT91C_RSTC_PROCRST (0x1 << 0) // (RSTC) Processor Reset +#define AT91C_RSTC_PERRST (0x1 << 2) // (RSTC) Peripheral Reset +#define AT91C_RSTC_EXTRST (0x1 << 3) // (RSTC) External Reset +#define AT91C_RSTC_KEY (0xFF << 24) // (RSTC) Password +// -------- RSTC_RSR : (RSTC Offset: 0x4) Reset Status Register -------- +#define AT91C_RSTC_URSTS (0x1 << 0) // (RSTC) User Reset Status +#define AT91C_RSTC_BODSTS (0x1 << 1) // (RSTC) Brownout Detection Status +#define AT91C_RSTC_RSTTYP (0x7 << 8) // (RSTC) Reset Type +#define AT91C_RSTC_RSTTYP_POWERUP (0x0 << 8) // (RSTC) Power-up Reset. VDDCORE rising. +#define AT91C_RSTC_RSTTYP_WAKEUP (0x1 << 8) // (RSTC) WakeUp Reset. VDDCORE rising. +#define AT91C_RSTC_RSTTYP_WATCHDOG (0x2 << 8) // (RSTC) Watchdog Reset. Watchdog overflow occured. +#define AT91C_RSTC_RSTTYP_SOFTWARE (0x3 << 8) // (RSTC) Software Reset. Processor reset required by the software. +#define AT91C_RSTC_RSTTYP_USER (0x4 << 8) // (RSTC) User Reset. NRST pin detected low. +#define AT91C_RSTC_RSTTYP_BROWNOUT (0x5 << 8) // (RSTC) Brownout Reset occured. +#define AT91C_RSTC_NRSTL (0x1 << 16) // (RSTC) NRST pin level +#define AT91C_RSTC_SRCMP (0x1 << 17) // (RSTC) Software Reset Command in Progress. +// -------- RSTC_RMR : (RSTC Offset: 0x8) Reset Mode Register -------- +#define AT91C_RSTC_URSTEN (0x1 << 0) // (RSTC) User Reset Enable +#define AT91C_RSTC_URSTIEN (0x1 << 4) // (RSTC) User Reset Interrupt Enable +#define AT91C_RSTC_ERSTL (0xF << 8) // (RSTC) User Reset Enable +#define AT91C_RSTC_BODIEN (0x1 << 16) // (RSTC) Brownout Detection Interrupt Enable + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Real Time Timer Controller Interface +// ***************************************************************************** +// *** Register offset in AT91S_RTTC structure *** +#define RTTC_RTMR ( 0) // Real-time Mode Register +#define RTTC_RTAR ( 4) // Real-time Alarm Register +#define RTTC_RTVR ( 8) // Real-time Value Register +#define RTTC_RTSR (12) // Real-time Status Register +// -------- RTTC_RTMR : (RTTC Offset: 0x0) Real-time Mode Register -------- +#define AT91C_RTTC_RTPRES (0xFFFF << 0) // (RTTC) Real-time Timer Prescaler Value +#define AT91C_RTTC_ALMIEN (0x1 << 16) // (RTTC) Alarm Interrupt Enable +#define AT91C_RTTC_RTTINCIEN (0x1 << 17) // (RTTC) Real Time Timer Increment Interrupt Enable +#define AT91C_RTTC_RTTRST (0x1 << 18) // (RTTC) Real Time Timer Restart +// -------- RTTC_RTAR : (RTTC Offset: 0x4) Real-time Alarm Register -------- +#define AT91C_RTTC_ALMV (0x0 << 0) // (RTTC) Alarm Value +// -------- RTTC_RTVR : (RTTC Offset: 0x8) Current Real-time Value Register -------- +#define AT91C_RTTC_CRTV (0x0 << 0) // (RTTC) Current Real-time Value +// -------- RTTC_RTSR : (RTTC Offset: 0xc) Real-time Status Register -------- +#define AT91C_RTTC_ALMS (0x1 << 0) // (RTTC) Real-time Alarm Status +#define AT91C_RTTC_RTTINC (0x1 << 1) // (RTTC) Real-time Timer Increment + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Periodic Interval Timer Controller Interface +// ***************************************************************************** +// *** Register offset in AT91S_PITC structure *** +#define PITC_PIMR ( 0) // Period Interval Mode Register +#define PITC_PISR ( 4) // Period Interval Status Register +#define PITC_PIVR ( 8) // Period Interval Value Register +#define PITC_PIIR (12) // Period Interval Image Register +// -------- PITC_PIMR : (PITC Offset: 0x0) Periodic Interval Mode Register -------- +#define AT91C_PITC_PIV (0xFFFFF << 0) // (PITC) Periodic Interval Value +#define AT91C_PITC_PITEN (0x1 << 24) // (PITC) Periodic Interval Timer Enabled +#define AT91C_PITC_PITIEN (0x1 << 25) // (PITC) Periodic Interval Timer Interrupt Enable +// -------- PITC_PISR : (PITC Offset: 0x4) Periodic Interval Status Register -------- +#define AT91C_PITC_PITS (0x1 << 0) // (PITC) Periodic Interval Timer Status +// -------- PITC_PIVR : (PITC Offset: 0x8) Periodic Interval Value Register -------- +#define AT91C_PITC_CPIV (0xFFFFF << 0) // (PITC) Current Periodic Interval Value +#define AT91C_PITC_PICNT (0xFFF << 20) // (PITC) Periodic Interval Counter +// -------- PITC_PIIR : (PITC Offset: 0xc) Periodic Interval Image Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Watchdog Timer Controller Interface +// ***************************************************************************** +// *** Register offset in AT91S_WDTC structure *** +#define WDTC_WDCR ( 0) // Watchdog Control Register +#define WDTC_WDMR ( 4) // Watchdog Mode Register +#define WDTC_WDSR ( 8) // Watchdog Status Register +// -------- WDTC_WDCR : (WDTC Offset: 0x0) Periodic Interval Image Register -------- +#define AT91C_WDTC_WDRSTT (0x1 << 0) // (WDTC) Watchdog Restart +#define AT91C_WDTC_KEY (0xFF << 24) // (WDTC) Watchdog KEY Password +// -------- WDTC_WDMR : (WDTC Offset: 0x4) Watchdog Mode Register -------- +#define AT91C_WDTC_WDV (0xFFF << 0) // (WDTC) Watchdog Timer Restart +#define AT91C_WDTC_WDFIEN (0x1 << 12) // (WDTC) Watchdog Fault Interrupt Enable +#define AT91C_WDTC_WDRSTEN (0x1 << 13) // (WDTC) Watchdog Reset Enable +#define AT91C_WDTC_WDRPROC (0x1 << 14) // (WDTC) Watchdog Timer Restart +#define AT91C_WDTC_WDDIS (0x1 << 15) // (WDTC) Watchdog Disable +#define AT91C_WDTC_WDD (0xFFF << 16) // (WDTC) Watchdog Delta Value +#define AT91C_WDTC_WDDBGHLT (0x1 << 28) // (WDTC) Watchdog Debug Halt +#define AT91C_WDTC_WDIDLEHLT (0x1 << 29) // (WDTC) Watchdog Idle Halt +// -------- WDTC_WDSR : (WDTC Offset: 0x8) Watchdog Status Register -------- +#define AT91C_WDTC_WDUNF (0x1 << 0) // (WDTC) Watchdog Underflow +#define AT91C_WDTC_WDERR (0x1 << 1) // (WDTC) Watchdog Error + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Voltage Regulator Mode Controller Interface +// ***************************************************************************** +// *** Register offset in AT91S_VREG structure *** +#define VREG_MR ( 0) // Voltage Regulator Mode Register +// -------- VREG_MR : (VREG Offset: 0x0) Voltage Regulator Mode Register -------- +#define AT91C_VREG_PSTDBY (0x1 << 0) // (VREG) Voltage Regulator Power Standby Mode + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Memory Controller Interface +// ***************************************************************************** +// *** Register offset in AT91S_MC structure *** +#define MC_RCR ( 0) // MC Remap Control Register +#define MC_ASR ( 4) // MC Abort Status Register +#define MC_AASR ( 8) // MC Abort Address Status Register +#define MC_FMR (96) // MC Flash Mode Register +#define MC_FCR (100) // MC Flash Command Register +#define MC_FSR (104) // MC Flash Status Register +// -------- MC_RCR : (MC Offset: 0x0) MC Remap Control Register -------- +#define AT91C_MC_RCB (0x1 << 0) // (MC) Remap Command Bit +// -------- MC_ASR : (MC Offset: 0x4) MC Abort Status Register -------- +#define AT91C_MC_UNDADD (0x1 << 0) // (MC) Undefined Addess Abort Status +#define AT91C_MC_MISADD (0x1 << 1) // (MC) Misaligned Addess Abort Status +#define AT91C_MC_ABTSZ (0x3 << 8) // (MC) Abort Size Status +#define AT91C_MC_ABTSZ_BYTE (0x0 << 8) // (MC) Byte +#define AT91C_MC_ABTSZ_HWORD (0x1 << 8) // (MC) Half-word +#define AT91C_MC_ABTSZ_WORD (0x2 << 8) // (MC) Word +#define AT91C_MC_ABTTYP (0x3 << 10) // (MC) Abort Type Status +#define AT91C_MC_ABTTYP_DATAR (0x0 << 10) // (MC) Data Read +#define AT91C_MC_ABTTYP_DATAW (0x1 << 10) // (MC) Data Write +#define AT91C_MC_ABTTYP_FETCH (0x2 << 10) // (MC) Code Fetch +#define AT91C_MC_MST0 (0x1 << 16) // (MC) Master 0 Abort Source +#define AT91C_MC_MST1 (0x1 << 17) // (MC) Master 1 Abort Source +#define AT91C_MC_SVMST0 (0x1 << 24) // (MC) Saved Master 0 Abort Source +#define AT91C_MC_SVMST1 (0x1 << 25) // (MC) Saved Master 1 Abort Source +// -------- MC_FMR : (MC Offset: 0x60) MC Flash Mode Register -------- +#define AT91C_MC_FRDY (0x1 << 0) // (MC) Flash Ready +#define AT91C_MC_LOCKE (0x1 << 2) // (MC) Lock Error +#define AT91C_MC_PROGE (0x1 << 3) // (MC) Programming Error +#define AT91C_MC_NEBP (0x1 << 7) // (MC) No Erase Before Programming +#define AT91C_MC_FWS (0x3 << 8) // (MC) Flash Wait State +#define AT91C_MC_FWS_0FWS (0x0 << 8) // (MC) 1 cycle for Read, 2 for Write operations +#define AT91C_MC_FWS_1FWS (0x1 << 8) // (MC) 2 cycles for Read, 3 for Write operations +#define AT91C_MC_FWS_2FWS (0x2 << 8) // (MC) 3 cycles for Read, 4 for Write operations +#define AT91C_MC_FWS_3FWS (0x3 << 8) // (MC) 4 cycles for Read, 4 for Write operations +#define AT91C_MC_FMCN (0xFF << 16) // (MC) Flash Microsecond Cycle Number +// -------- MC_FCR : (MC Offset: 0x64) MC Flash Command Register -------- +#define AT91C_MC_FCMD (0xF << 0) // (MC) Flash Command +#define AT91C_MC_FCMD_START_PROG (0x1) // (MC) Starts the programming of th epage specified by PAGEN. +#define AT91C_MC_FCMD_LOCK (0x2) // (MC) Starts a lock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. +#define AT91C_MC_FCMD_PROG_AND_LOCK (0x3) // (MC) The lock sequence automatically happens after the programming sequence is completed. +#define AT91C_MC_FCMD_UNLOCK (0x4) // (MC) Starts an unlock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. +#define AT91C_MC_FCMD_ERASE_ALL (0x8) // (MC) Starts the erase of the entire flash.If at least a page is locked, the command is cancelled. +#define AT91C_MC_FCMD_SET_GP_NVM (0xB) // (MC) Set General Purpose NVM bits. +#define AT91C_MC_FCMD_CLR_GP_NVM (0xD) // (MC) Clear General Purpose NVM bits. +#define AT91C_MC_FCMD_SET_SECURITY (0xF) // (MC) Set Security Bit. +#define AT91C_MC_PAGEN (0x3FF << 8) // (MC) Page Number +#define AT91C_MC_KEY (0xFF << 24) // (MC) Writing Protect Key +// -------- MC_FSR : (MC Offset: 0x68) MC Flash Command Register -------- +#define AT91C_MC_SECURITY (0x1 << 4) // (MC) Security Bit Status +#define AT91C_MC_GPNVM0 (0x1 << 8) // (MC) Sector 0 Lock Status +#define AT91C_MC_GPNVM1 (0x1 << 9) // (MC) Sector 1 Lock Status +#define AT91C_MC_GPNVM2 (0x1 << 10) // (MC) Sector 2 Lock Status +#define AT91C_MC_GPNVM3 (0x1 << 11) // (MC) Sector 3 Lock Status +#define AT91C_MC_GPNVM4 (0x1 << 12) // (MC) Sector 4 Lock Status +#define AT91C_MC_GPNVM5 (0x1 << 13) // (MC) Sector 5 Lock Status +#define AT91C_MC_GPNVM6 (0x1 << 14) // (MC) Sector 6 Lock Status +#define AT91C_MC_GPNVM7 (0x1 << 15) // (MC) Sector 7 Lock Status +#define AT91C_MC_LOCKS0 (0x1 << 16) // (MC) Sector 0 Lock Status +#define AT91C_MC_LOCKS1 (0x1 << 17) // (MC) Sector 1 Lock Status +#define AT91C_MC_LOCKS2 (0x1 << 18) // (MC) Sector 2 Lock Status +#define AT91C_MC_LOCKS3 (0x1 << 19) // (MC) Sector 3 Lock Status +#define AT91C_MC_LOCKS4 (0x1 << 20) // (MC) Sector 4 Lock Status +#define AT91C_MC_LOCKS5 (0x1 << 21) // (MC) Sector 5 Lock Status +#define AT91C_MC_LOCKS6 (0x1 << 22) // (MC) Sector 6 Lock Status +#define AT91C_MC_LOCKS7 (0x1 << 23) // (MC) Sector 7 Lock Status +#define AT91C_MC_LOCKS8 (0x1 << 24) // (MC) Sector 8 Lock Status +#define AT91C_MC_LOCKS9 (0x1 << 25) // (MC) Sector 9 Lock Status +#define AT91C_MC_LOCKS10 (0x1 << 26) // (MC) Sector 10 Lock Status +#define AT91C_MC_LOCKS11 (0x1 << 27) // (MC) Sector 11 Lock Status +#define AT91C_MC_LOCKS12 (0x1 << 28) // (MC) Sector 12 Lock Status +#define AT91C_MC_LOCKS13 (0x1 << 29) // (MC) Sector 13 Lock Status +#define AT91C_MC_LOCKS14 (0x1 << 30) // (MC) Sector 14 Lock Status +#define AT91C_MC_LOCKS15 (0x1 << 31) // (MC) Sector 15 Lock Status + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Serial Parallel Interface +// ***************************************************************************** +// *** Register offset in AT91S_SPI structure *** +#define SPI_CR ( 0) // Control Register +#define SPI_MR ( 4) // Mode Register +#define SPI_RDR ( 8) // Receive Data Register +#define SPI_TDR (12) // Transmit Data Register +#define SPI_SR (16) // Status Register +#define SPI_IER (20) // Interrupt Enable Register +#define SPI_IDR (24) // Interrupt Disable Register +#define SPI_IMR (28) // Interrupt Mask Register +#define SPI_CSR (48) // Chip Select Register +#define SPI_RPR (256) // Receive Pointer Register +#define SPI_RCR (260) // Receive Counter Register +#define SPI_TPR (264) // Transmit Pointer Register +#define SPI_TCR (268) // Transmit Counter Register +#define SPI_RNPR (272) // Receive Next Pointer Register +#define SPI_RNCR (276) // Receive Next Counter Register +#define SPI_TNPR (280) // Transmit Next Pointer Register +#define SPI_TNCR (284) // Transmit Next Counter Register +#define SPI_PTCR (288) // PDC Transfer Control Register +#define SPI_PTSR (292) // PDC Transfer Status Register +// -------- SPI_CR : (SPI Offset: 0x0) SPI Control Register -------- +#define AT91C_SPI_SPIEN (0x1 << 0) // (SPI) SPI Enable +#define AT91C_SPI_SPIDIS (0x1 << 1) // (SPI) SPI Disable +#define AT91C_SPI_SWRST (0x1 << 7) // (SPI) SPI Software reset +#define AT91C_SPI_LASTXFER (0x1 << 24) // (SPI) SPI Last Transfer +// -------- SPI_MR : (SPI Offset: 0x4) SPI Mode Register -------- +#define AT91C_SPI_MSTR (0x1 << 0) // (SPI) Master/Slave Mode +#define AT91C_SPI_PS (0x1 << 1) // (SPI) Peripheral Select +#define AT91C_SPI_PS_FIXED (0x0 << 1) // (SPI) Fixed Peripheral Select +#define AT91C_SPI_PS_VARIABLE (0x1 << 1) // (SPI) Variable Peripheral Select +#define AT91C_SPI_PCSDEC (0x1 << 2) // (SPI) Chip Select Decode +#define AT91C_SPI_FDIV (0x1 << 3) // (SPI) Clock Selection +#define AT91C_SPI_MODFDIS (0x1 << 4) // (SPI) Mode Fault Detection +#define AT91C_SPI_LLB (0x1 << 7) // (SPI) Clock Selection +#define AT91C_SPI_PCS (0xF << 16) // (SPI) Peripheral Chip Select +#define AT91C_SPI_DLYBCS (0xFF << 24) // (SPI) Delay Between Chip Selects +// -------- SPI_RDR : (SPI Offset: 0x8) Receive Data Register -------- +#define AT91C_SPI_RD (0xFFFF << 0) // (SPI) Receive Data +#define AT91C_SPI_RPCS (0xF << 16) // (SPI) Peripheral Chip Select Status +// -------- SPI_TDR : (SPI Offset: 0xc) Transmit Data Register -------- +#define AT91C_SPI_TD (0xFFFF << 0) // (SPI) Transmit Data +#define AT91C_SPI_TPCS (0xF << 16) // (SPI) Peripheral Chip Select Status +// -------- SPI_SR : (SPI Offset: 0x10) Status Register -------- +#define AT91C_SPI_RDRF (0x1 << 0) // (SPI) Receive Data Register Full +#define AT91C_SPI_TDRE (0x1 << 1) // (SPI) Transmit Data Register Empty +#define AT91C_SPI_MODF (0x1 << 2) // (SPI) Mode Fault Error +#define AT91C_SPI_OVRES (0x1 << 3) // (SPI) Overrun Error Status +#define AT91C_SPI_ENDRX (0x1 << 4) // (SPI) End of Receiver Transfer +#define AT91C_SPI_ENDTX (0x1 << 5) // (SPI) End of Receiver Transfer +#define AT91C_SPI_RXBUFF (0x1 << 6) // (SPI) RXBUFF Interrupt +#define AT91C_SPI_TXBUFE (0x1 << 7) // (SPI) TXBUFE Interrupt +#define AT91C_SPI_NSSR (0x1 << 8) // (SPI) NSSR Interrupt +#define AT91C_SPI_TXEMPTY (0x1 << 9) // (SPI) TXEMPTY Interrupt +#define AT91C_SPI_SPIENS (0x1 << 16) // (SPI) Enable Status +// -------- SPI_IER : (SPI Offset: 0x14) Interrupt Enable Register -------- +// -------- SPI_IDR : (SPI Offset: 0x18) Interrupt Disable Register -------- +// -------- SPI_IMR : (SPI Offset: 0x1c) Interrupt Mask Register -------- +// -------- SPI_CSR : (SPI Offset: 0x30) Chip Select Register -------- +#define AT91C_SPI_CPOL (0x1 << 0) // (SPI) Clock Polarity +#define AT91C_SPI_NCPHA (0x1 << 1) // (SPI) Clock Phase +#define AT91C_SPI_CSAAT (0x1 << 3) // (SPI) Chip Select Active After Transfer +#define AT91C_SPI_BITS (0xF << 4) // (SPI) Bits Per Transfer +#define AT91C_SPI_BITS_8 (0x0 << 4) // (SPI) 8 Bits Per transfer +#define AT91C_SPI_BITS_9 (0x1 << 4) // (SPI) 9 Bits Per transfer +#define AT91C_SPI_BITS_10 (0x2 << 4) // (SPI) 10 Bits Per transfer +#define AT91C_SPI_BITS_11 (0x3 << 4) // (SPI) 11 Bits Per transfer +#define AT91C_SPI_BITS_12 (0x4 << 4) // (SPI) 12 Bits Per transfer +#define AT91C_SPI_BITS_13 (0x5 << 4) // (SPI) 13 Bits Per transfer +#define AT91C_SPI_BITS_14 (0x6 << 4) // (SPI) 14 Bits Per transfer +#define AT91C_SPI_BITS_15 (0x7 << 4) // (SPI) 15 Bits Per transfer +#define AT91C_SPI_BITS_16 (0x8 << 4) // (SPI) 16 Bits Per transfer +#define AT91C_SPI_SCBR (0xFF << 8) // (SPI) Serial Clock Baud Rate +#define AT91C_SPI_DLYBS (0xFF << 16) // (SPI) Delay Before SPCK +#define AT91C_SPI_DLYBCT (0xFF << 24) // (SPI) Delay Between Consecutive Transfers + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Usart +// ***************************************************************************** +// *** Register offset in AT91S_USART structure *** +#define US_CR ( 0) // Control Register +#define US_MR ( 4) // Mode Register +#define US_IER ( 8) // Interrupt Enable Register +#define US_IDR (12) // Interrupt Disable Register +#define US_IMR (16) // Interrupt Mask Register +#define US_CSR (20) // Channel Status Register +#define US_RHR (24) // Receiver Holding Register +#define US_THR (28) // Transmitter Holding Register +#define US_BRGR (32) // Baud Rate Generator Register +#define US_RTOR (36) // Receiver Time-out Register +#define US_TTGR (40) // Transmitter Time-guard Register +#define US_FIDI (64) // FI_DI_Ratio Register +#define US_NER (68) // Nb Errors Register +#define US_IF (76) // IRDA_FILTER Register +#define US_RPR (256) // Receive Pointer Register +#define US_RCR (260) // Receive Counter Register +#define US_TPR (264) // Transmit Pointer Register +#define US_TCR (268) // Transmit Counter Register +#define US_RNPR (272) // Receive Next Pointer Register +#define US_RNCR (276) // Receive Next Counter Register +#define US_TNPR (280) // Transmit Next Pointer Register +#define US_TNCR (284) // Transmit Next Counter Register +#define US_PTCR (288) // PDC Transfer Control Register +#define US_PTSR (292) // PDC Transfer Status Register +// -------- US_CR : (USART Offset: 0x0) Debug Unit Control Register -------- +#define AT91C_US_STTBRK (0x1 << 9) // (USART) Start Break +#define AT91C_US_STPBRK (0x1 << 10) // (USART) Stop Break +#define AT91C_US_STTTO (0x1 << 11) // (USART) Start Time-out +#define AT91C_US_SENDA (0x1 << 12) // (USART) Send Address +#define AT91C_US_RSTIT (0x1 << 13) // (USART) Reset Iterations +#define AT91C_US_RSTNACK (0x1 << 14) // (USART) Reset Non Acknowledge +#define AT91C_US_RETTO (0x1 << 15) // (USART) Rearm Time-out +#define AT91C_US_DTREN (0x1 << 16) // (USART) Data Terminal ready Enable +#define AT91C_US_DTRDIS (0x1 << 17) // (USART) Data Terminal ready Disable +#define AT91C_US_RTSEN (0x1 << 18) // (USART) Request to Send enable +#define AT91C_US_RTSDIS (0x1 << 19) // (USART) Request to Send Disable +// -------- US_MR : (USART Offset: 0x4) Debug Unit Mode Register -------- +#define AT91C_US_USMODE (0xF << 0) // (USART) Usart mode +#define AT91C_US_USMODE_NORMAL (0x0) // (USART) Normal +#define AT91C_US_USMODE_RS485 (0x1) // (USART) RS485 +#define AT91C_US_USMODE_HWHSH (0x2) // (USART) Hardware Handshaking +#define AT91C_US_USMODE_MODEM (0x3) // (USART) Modem +#define AT91C_US_USMODE_ISO7816_0 (0x4) // (USART) ISO7816 protocol: T = 0 +#define AT91C_US_USMODE_ISO7816_1 (0x6) // (USART) ISO7816 protocol: T = 1 +#define AT91C_US_USMODE_IRDA (0x8) // (USART) IrDA +#define AT91C_US_USMODE_SWHSH (0xC) // (USART) Software Handshaking +#define AT91C_US_CLKS (0x3 << 4) // (USART) Clock Selection (Baud Rate generator Input Clock +#define AT91C_US_CLKS_CLOCK (0x0 << 4) // (USART) Clock +#define AT91C_US_CLKS_FDIV1 (0x1 << 4) // (USART) fdiv1 +#define AT91C_US_CLKS_SLOW (0x2 << 4) // (USART) slow_clock (ARM) +#define AT91C_US_CLKS_EXT (0x3 << 4) // (USART) External (SCK) +#define AT91C_US_CHRL (0x3 << 6) // (USART) Clock Selection (Baud Rate generator Input Clock +#define AT91C_US_CHRL_5_BITS (0x0 << 6) // (USART) Character Length: 5 bits +#define AT91C_US_CHRL_6_BITS (0x1 << 6) // (USART) Character Length: 6 bits +#define AT91C_US_CHRL_7_BITS (0x2 << 6) // (USART) Character Length: 7 bits +#define AT91C_US_CHRL_8_BITS (0x3 << 6) // (USART) Character Length: 8 bits +#define AT91C_US_SYNC (0x1 << 8) // (USART) Synchronous Mode Select +#define AT91C_US_NBSTOP (0x3 << 12) // (USART) Number of Stop bits +#define AT91C_US_NBSTOP_1_BIT (0x0 << 12) // (USART) 1 stop bit +#define AT91C_US_NBSTOP_15_BIT (0x1 << 12) // (USART) Asynchronous (SYNC=0) 2 stop bits Synchronous (SYNC=1) 2 stop bits +#define AT91C_US_NBSTOP_2_BIT (0x2 << 12) // (USART) 2 stop bits +#define AT91C_US_MSBF (0x1 << 16) // (USART) Bit Order +#define AT91C_US_MODE9 (0x1 << 17) // (USART) 9-bit Character length +#define AT91C_US_CKLO (0x1 << 18) // (USART) Clock Output Select +#define AT91C_US_OVER (0x1 << 19) // (USART) Over Sampling Mode +#define AT91C_US_INACK (0x1 << 20) // (USART) Inhibit Non Acknowledge +#define AT91C_US_DSNACK (0x1 << 21) // (USART) Disable Successive NACK +#define AT91C_US_MAX_ITER (0x1 << 24) // (USART) Number of Repetitions +#define AT91C_US_FILTER (0x1 << 28) // (USART) Receive Line Filter +// -------- US_IER : (USART Offset: 0x8) Debug Unit Interrupt Enable Register -------- +#define AT91C_US_RXBRK (0x1 << 2) // (USART) Break Received/End of Break +#define AT91C_US_TIMEOUT (0x1 << 8) // (USART) Receiver Time-out +#define AT91C_US_ITERATION (0x1 << 10) // (USART) Max number of Repetitions Reached +#define AT91C_US_NACK (0x1 << 13) // (USART) Non Acknowledge +#define AT91C_US_RIIC (0x1 << 16) // (USART) Ring INdicator Input Change Flag +#define AT91C_US_DSRIC (0x1 << 17) // (USART) Data Set Ready Input Change Flag +#define AT91C_US_DCDIC (0x1 << 18) // (USART) Data Carrier Flag +#define AT91C_US_CTSIC (0x1 << 19) // (USART) Clear To Send Input Change Flag +// -------- US_IDR : (USART Offset: 0xc) Debug Unit Interrupt Disable Register -------- +// -------- US_IMR : (USART Offset: 0x10) Debug Unit Interrupt Mask Register -------- +// -------- US_CSR : (USART Offset: 0x14) Debug Unit Channel Status Register -------- +#define AT91C_US_RI (0x1 << 20) // (USART) Image of RI Input +#define AT91C_US_DSR (0x1 << 21) // (USART) Image of DSR Input +#define AT91C_US_DCD (0x1 << 22) // (USART) Image of DCD Input +#define AT91C_US_CTS (0x1 << 23) // (USART) Image of CTS Input + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Synchronous Serial Controller Interface +// ***************************************************************************** +// *** Register offset in AT91S_SSC structure *** +#define SSC_CR ( 0) // Control Register +#define SSC_CMR ( 4) // Clock Mode Register +#define SSC_RCMR (16) // Receive Clock ModeRegister +#define SSC_RFMR (20) // Receive Frame Mode Register +#define SSC_TCMR (24) // Transmit Clock Mode Register +#define SSC_TFMR (28) // Transmit Frame Mode Register +#define SSC_RHR (32) // Receive Holding Register +#define SSC_THR (36) // Transmit Holding Register +#define SSC_RSHR (48) // Receive Sync Holding Register +#define SSC_TSHR (52) // Transmit Sync Holding Register +#define SSC_SR (64) // Status Register +#define SSC_IER (68) // Interrupt Enable Register +#define SSC_IDR (72) // Interrupt Disable Register +#define SSC_IMR (76) // Interrupt Mask Register +#define SSC_RPR (256) // Receive Pointer Register +#define SSC_RCR (260) // Receive Counter Register +#define SSC_TPR (264) // Transmit Pointer Register +#define SSC_TCR (268) // Transmit Counter Register +#define SSC_RNPR (272) // Receive Next Pointer Register +#define SSC_RNCR (276) // Receive Next Counter Register +#define SSC_TNPR (280) // Transmit Next Pointer Register +#define SSC_TNCR (284) // Transmit Next Counter Register +#define SSC_PTCR (288) // PDC Transfer Control Register +#define SSC_PTSR (292) // PDC Transfer Status Register +// -------- SSC_CR : (SSC Offset: 0x0) SSC Control Register -------- +#define AT91C_SSC_RXEN (0x1 << 0) // (SSC) Receive Enable +#define AT91C_SSC_RXDIS (0x1 << 1) // (SSC) Receive Disable +#define AT91C_SSC_TXEN (0x1 << 8) // (SSC) Transmit Enable +#define AT91C_SSC_TXDIS (0x1 << 9) // (SSC) Transmit Disable +#define AT91C_SSC_SWRST (0x1 << 15) // (SSC) Software Reset +// -------- SSC_RCMR : (SSC Offset: 0x10) SSC Receive Clock Mode Register -------- +#define AT91C_SSC_CKS (0x3 << 0) // (SSC) Receive/Transmit Clock Selection +#define AT91C_SSC_CKS_DIV (0x0) // (SSC) Divided Clock +#define AT91C_SSC_CKS_TK (0x1) // (SSC) TK Clock signal +#define AT91C_SSC_CKS_RK (0x2) // (SSC) RK pin +#define AT91C_SSC_CKO (0x7 << 2) // (SSC) Receive/Transmit Clock Output Mode Selection +#define AT91C_SSC_CKO_NONE (0x0 << 2) // (SSC) Receive/Transmit Clock Output Mode: None RK pin: Input-only +#define AT91C_SSC_CKO_CONTINOUS (0x1 << 2) // (SSC) Continuous Receive/Transmit Clock RK pin: Output +#define AT91C_SSC_CKO_DATA_TX (0x2 << 2) // (SSC) Receive/Transmit Clock only during data transfers RK pin: Output +#define AT91C_SSC_CKI (0x1 << 5) // (SSC) Receive/Transmit Clock Inversion +#define AT91C_SSC_START (0xF << 8) // (SSC) Receive/Transmit Start Selection +#define AT91C_SSC_START_CONTINOUS (0x0 << 8) // (SSC) Continuous, as soon as the receiver is enabled, and immediately after the end of transfer of the previous data. +#define AT91C_SSC_START_TX (0x1 << 8) // (SSC) Transmit/Receive start +#define AT91C_SSC_START_LOW_RF (0x2 << 8) // (SSC) Detection of a low level on RF input +#define AT91C_SSC_START_HIGH_RF (0x3 << 8) // (SSC) Detection of a high level on RF input +#define AT91C_SSC_START_FALL_RF (0x4 << 8) // (SSC) Detection of a falling edge on RF input +#define AT91C_SSC_START_RISE_RF (0x5 << 8) // (SSC) Detection of a rising edge on RF input +#define AT91C_SSC_START_LEVEL_RF (0x6 << 8) // (SSC) Detection of any level change on RF input +#define AT91C_SSC_START_EDGE_RF (0x7 << 8) // (SSC) Detection of any edge on RF input +#define AT91C_SSC_START_0 (0x8 << 8) // (SSC) Compare 0 +#define AT91C_SSC_STTDLY (0xFF << 16) // (SSC) Receive/Transmit Start Delay +#define AT91C_SSC_PERIOD (0xFF << 24) // (SSC) Receive/Transmit Period Divider Selection +// -------- SSC_RFMR : (SSC Offset: 0x14) SSC Receive Frame Mode Register -------- +#define AT91C_SSC_DATLEN (0x1F << 0) // (SSC) Data Length +#define AT91C_SSC_LOOP (0x1 << 5) // (SSC) Loop Mode +#define AT91C_SSC_MSBF (0x1 << 7) // (SSC) Most Significant Bit First +#define AT91C_SSC_DATNB (0xF << 8) // (SSC) Data Number per Frame +#define AT91C_SSC_FSLEN (0xF << 16) // (SSC) Receive/Transmit Frame Sync length +#define AT91C_SSC_FSOS (0x7 << 20) // (SSC) Receive/Transmit Frame Sync Output Selection +#define AT91C_SSC_FSOS_NONE (0x0 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: None RK pin Input-only +#define AT91C_SSC_FSOS_NEGATIVE (0x1 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Negative Pulse +#define AT91C_SSC_FSOS_POSITIVE (0x2 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Positive Pulse +#define AT91C_SSC_FSOS_LOW (0x3 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver Low during data transfer +#define AT91C_SSC_FSOS_HIGH (0x4 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver High during data transfer +#define AT91C_SSC_FSOS_TOGGLE (0x5 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Toggling at each start of data transfer +#define AT91C_SSC_FSEDGE (0x1 << 24) // (SSC) Frame Sync Edge Detection +// -------- SSC_TCMR : (SSC Offset: 0x18) SSC Transmit Clock Mode Register -------- +// -------- SSC_TFMR : (SSC Offset: 0x1c) SSC Transmit Frame Mode Register -------- +#define AT91C_SSC_DATDEF (0x1 << 5) // (SSC) Data Default Value +#define AT91C_SSC_FSDEN (0x1 << 23) // (SSC) Frame Sync Data Enable +// -------- SSC_SR : (SSC Offset: 0x40) SSC Status Register -------- +#define AT91C_SSC_TXRDY (0x1 << 0) // (SSC) Transmit Ready +#define AT91C_SSC_TXEMPTY (0x1 << 1) // (SSC) Transmit Empty +#define AT91C_SSC_ENDTX (0x1 << 2) // (SSC) End Of Transmission +#define AT91C_SSC_TXBUFE (0x1 << 3) // (SSC) Transmit Buffer Empty +#define AT91C_SSC_RXRDY (0x1 << 4) // (SSC) Receive Ready +#define AT91C_SSC_OVRUN (0x1 << 5) // (SSC) Receive Overrun +#define AT91C_SSC_ENDRX (0x1 << 6) // (SSC) End of Reception +#define AT91C_SSC_RXBUFF (0x1 << 7) // (SSC) Receive Buffer Full +#define AT91C_SSC_TXSYN (0x1 << 10) // (SSC) Transmit Sync +#define AT91C_SSC_RXSYN (0x1 << 11) // (SSC) Receive Sync +#define AT91C_SSC_TXENA (0x1 << 16) // (SSC) Transmit Enable +#define AT91C_SSC_RXENA (0x1 << 17) // (SSC) Receive Enable +// -------- SSC_IER : (SSC Offset: 0x44) SSC Interrupt Enable Register -------- +// -------- SSC_IDR : (SSC Offset: 0x48) SSC Interrupt Disable Register -------- +// -------- SSC_IMR : (SSC Offset: 0x4c) SSC Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Two-wire Interface +// ***************************************************************************** +// *** Register offset in AT91S_TWI structure *** +#define TWI_CR ( 0) // Control Register +#define TWI_MMR ( 4) // Master Mode Register +#define TWI_IADR (12) // Internal Address Register +#define TWI_CWGR (16) // Clock Waveform Generator Register +#define TWI_SR (32) // Status Register +#define TWI_IER (36) // Interrupt Enable Register +#define TWI_IDR (40) // Interrupt Disable Register +#define TWI_IMR (44) // Interrupt Mask Register +#define TWI_RHR (48) // Receive Holding Register +#define TWI_THR (52) // Transmit Holding Register +// -------- TWI_CR : (TWI Offset: 0x0) TWI Control Register -------- +#define AT91C_TWI_START (0x1 << 0) // (TWI) Send a START Condition +#define AT91C_TWI_STOP (0x1 << 1) // (TWI) Send a STOP Condition +#define AT91C_TWI_MSEN (0x1 << 2) // (TWI) TWI Master Transfer Enabled +#define AT91C_TWI_MSDIS (0x1 << 3) // (TWI) TWI Master Transfer Disabled +#define AT91C_TWI_SWRST (0x1 << 7) // (TWI) Software Reset +// -------- TWI_MMR : (TWI Offset: 0x4) TWI Master Mode Register -------- +#define AT91C_TWI_IADRSZ (0x3 << 8) // (TWI) Internal Device Address Size +#define AT91C_TWI_IADRSZ_NO (0x0 << 8) // (TWI) No internal device address +#define AT91C_TWI_IADRSZ_1_BYTE (0x1 << 8) // (TWI) One-byte internal device address +#define AT91C_TWI_IADRSZ_2_BYTE (0x2 << 8) // (TWI) Two-byte internal device address +#define AT91C_TWI_IADRSZ_3_BYTE (0x3 << 8) // (TWI) Three-byte internal device address +#define AT91C_TWI_MREAD (0x1 << 12) // (TWI) Master Read Direction +#define AT91C_TWI_DADR (0x7F << 16) // (TWI) Device Address +// -------- TWI_CWGR : (TWI Offset: 0x10) TWI Clock Waveform Generator Register -------- +#define AT91C_TWI_CLDIV (0xFF << 0) // (TWI) Clock Low Divider +#define AT91C_TWI_CHDIV (0xFF << 8) // (TWI) Clock High Divider +#define AT91C_TWI_CKDIV (0x7 << 16) // (TWI) Clock Divider +// -------- TWI_SR : (TWI Offset: 0x20) TWI Status Register -------- +#define AT91C_TWI_TXCOMP (0x1 << 0) // (TWI) Transmission Completed +#define AT91C_TWI_RXRDY (0x1 << 1) // (TWI) Receive holding register ReaDY +#define AT91C_TWI_TXRDY (0x1 << 2) // (TWI) Transmit holding register ReaDY +#define AT91C_TWI_OVRE (0x1 << 6) // (TWI) Overrun Error +#define AT91C_TWI_UNRE (0x1 << 7) // (TWI) Underrun Error +#define AT91C_TWI_NACK (0x1 << 8) // (TWI) Not Acknowledged +// -------- TWI_IER : (TWI Offset: 0x24) TWI Interrupt Enable Register -------- +// -------- TWI_IDR : (TWI Offset: 0x28) TWI Interrupt Disable Register -------- +// -------- TWI_IMR : (TWI Offset: 0x2c) TWI Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR PWMC Channel Interface +// ***************************************************************************** +// *** Register offset in AT91S_PWMC_CH structure *** +#define PWMC_CMR ( 0) // Channel Mode Register +#define PWMC_CDTYR ( 4) // Channel Duty Cycle Register +#define PWMC_CPRDR ( 8) // Channel Period Register +#define PWMC_CCNTR (12) // Channel Counter Register +#define PWMC_CUPDR (16) // Channel Update Register +#define PWMC_Reserved (20) // Reserved +// -------- PWMC_CMR : (PWMC_CH Offset: 0x0) PWMC Channel Mode Register -------- +#define AT91C_PWMC_CPRE (0xF << 0) // (PWMC_CH) Channel Pre-scaler : PWMC_CLKx +#define AT91C_PWMC_CPRE_MCK (0x0) // (PWMC_CH) +#define AT91C_PWMC_CPRE_MCKA (0xB) // (PWMC_CH) +#define AT91C_PWMC_CPRE_MCKB (0xC) // (PWMC_CH) +#define AT91C_PWMC_CALG (0x1 << 8) // (PWMC_CH) Channel Alignment +#define AT91C_PWMC_CPOL (0x1 << 9) // (PWMC_CH) Channel Polarity +#define AT91C_PWMC_CPD (0x1 << 10) // (PWMC_CH) Channel Update Period +// -------- PWMC_CDTYR : (PWMC_CH Offset: 0x4) PWMC Channel Duty Cycle Register -------- +#define AT91C_PWMC_CDTY (0x0 << 0) // (PWMC_CH) Channel Duty Cycle +// -------- PWMC_CPRDR : (PWMC_CH Offset: 0x8) PWMC Channel Period Register -------- +#define AT91C_PWMC_CPRD (0x0 << 0) // (PWMC_CH) Channel Period +// -------- PWMC_CCNTR : (PWMC_CH Offset: 0xc) PWMC Channel Counter Register -------- +#define AT91C_PWMC_CCNT (0x0 << 0) // (PWMC_CH) Channel Counter +// -------- PWMC_CUPDR : (PWMC_CH Offset: 0x10) PWMC Channel Update Register -------- +#define AT91C_PWMC_CUPD (0x0 << 0) // (PWMC_CH) Channel Update + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Pulse Width Modulation Controller Interface +// ***************************************************************************** +// *** Register offset in AT91S_PWMC structure *** +#define PWMC_MR ( 0) // PWMC Mode Register +#define PWMC_ENA ( 4) // PWMC Enable Register +#define PWMC_DIS ( 8) // PWMC Disable Register +#define PWMC_SR (12) // PWMC Status Register +#define PWMC_IER (16) // PWMC Interrupt Enable Register +#define PWMC_IDR (20) // PWMC Interrupt Disable Register +#define PWMC_IMR (24) // PWMC Interrupt Mask Register +#define PWMC_ISR (28) // PWMC Interrupt Status Register +#define PWMC_VR (252) // PWMC Version Register +#define PWMC_CH (512) // PWMC Channel +// -------- PWMC_MR : (PWMC Offset: 0x0) PWMC Mode Register -------- +#define AT91C_PWMC_DIVA (0xFF << 0) // (PWMC) CLKA divide factor. +#define AT91C_PWMC_PREA (0xF << 8) // (PWMC) Divider Input Clock Prescaler A +#define AT91C_PWMC_PREA_MCK (0x0 << 8) // (PWMC) +#define AT91C_PWMC_DIVB (0xFF << 16) // (PWMC) CLKB divide factor. +#define AT91C_PWMC_PREB (0xF << 24) // (PWMC) Divider Input Clock Prescaler B +#define AT91C_PWMC_PREB_MCK (0x0 << 24) // (PWMC) +// -------- PWMC_ENA : (PWMC Offset: 0x4) PWMC Enable Register -------- +#define AT91C_PWMC_CHID0 (0x1 << 0) // (PWMC) Channel ID 0 +#define AT91C_PWMC_CHID1 (0x1 << 1) // (PWMC) Channel ID 1 +#define AT91C_PWMC_CHID2 (0x1 << 2) // (PWMC) Channel ID 2 +#define AT91C_PWMC_CHID3 (0x1 << 3) // (PWMC) Channel ID 3 +// -------- PWMC_DIS : (PWMC Offset: 0x8) PWMC Disable Register -------- +// -------- PWMC_SR : (PWMC Offset: 0xc) PWMC Status Register -------- +// -------- PWMC_IER : (PWMC Offset: 0x10) PWMC Interrupt Enable Register -------- +// -------- PWMC_IDR : (PWMC Offset: 0x14) PWMC Interrupt Disable Register -------- +// -------- PWMC_IMR : (PWMC Offset: 0x18) PWMC Interrupt Mask Register -------- +// -------- PWMC_ISR : (PWMC Offset: 0x1c) PWMC Interrupt Status Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR USB Device Interface +// ***************************************************************************** +// *** Register offset in AT91S_UDP structure *** +#define UDP_NUM ( 0) // Frame Number Register +#define UDP_GLBSTATE ( 4) // Global State Register +#define UDP_FADDR ( 8) // Function Address Register +#define UDP_IER (16) // Interrupt Enable Register +#define UDP_IDR (20) // Interrupt Disable Register +#define UDP_IMR (24) // Interrupt Mask Register +#define UDP_ISR (28) // Interrupt Status Register +#define UDP_ICR (32) // Interrupt Clear Register +#define UDP_RSTEP (40) // Reset Endpoint Register +#define UDP_CSR (48) // Endpoint Control and Status Register +#define UDP_FDR (80) // Endpoint FIFO Data Register +#define UDP_TXVC (116) // Transceiver Control Register +// -------- UDP_FRM_NUM : (UDP Offset: 0x0) USB Frame Number Register -------- +#define AT91C_UDP_FRM_NUM (0x7FF << 0) // (UDP) Frame Number as Defined in the Packet Field Formats +#define AT91C_UDP_FRM_ERR (0x1 << 16) // (UDP) Frame Error +#define AT91C_UDP_FRM_OK (0x1 << 17) // (UDP) Frame OK +// -------- UDP_GLB_STATE : (UDP Offset: 0x4) USB Global State Register -------- +#define AT91C_UDP_FADDEN (0x1 << 0) // (UDP) Function Address Enable +#define AT91C_UDP_CONFG (0x1 << 1) // (UDP) Configured +#define AT91C_UDP_ESR (0x1 << 2) // (UDP) Enable Send Resume +#define AT91C_UDP_RSMINPR (0x1 << 3) // (UDP) A Resume Has Been Sent to the Host +#define AT91C_UDP_RMWUPE (0x1 << 4) // (UDP) Remote Wake Up Enable +// -------- UDP_FADDR : (UDP Offset: 0x8) USB Function Address Register -------- +#define AT91C_UDP_FADD (0xFF << 0) // (UDP) Function Address Value +#define AT91C_UDP_FEN (0x1 << 8) // (UDP) Function Enable +// -------- UDP_IER : (UDP Offset: 0x10) USB Interrupt Enable Register -------- +#define AT91C_UDP_EPINT0 (0x1 << 0) // (UDP) Endpoint 0 Interrupt +#define AT91C_UDP_EPINT1 (0x1 << 1) // (UDP) Endpoint 0 Interrupt +#define AT91C_UDP_EPINT2 (0x1 << 2) // (UDP) Endpoint 2 Interrupt +#define AT91C_UDP_EPINT3 (0x1 << 3) // (UDP) Endpoint 3 Interrupt +#define AT91C_UDP_EPINT4 (0x1 << 4) // (UDP) Endpoint 4 Interrupt +#define AT91C_UDP_EPINT5 (0x1 << 5) // (UDP) Endpoint 5 Interrupt +#define AT91C_UDP_RXSUSP (0x1 << 8) // (UDP) USB Suspend Interrupt +#define AT91C_UDP_RXRSM (0x1 << 9) // (UDP) USB Resume Interrupt +#define AT91C_UDP_EXTRSM (0x1 << 10) // (UDP) USB External Resume Interrupt +#define AT91C_UDP_SOFINT (0x1 << 11) // (UDP) USB Start Of frame Interrupt +#define AT91C_UDP_WAKEUP (0x1 << 13) // (UDP) USB Resume Interrupt +// -------- UDP_IDR : (UDP Offset: 0x14) USB Interrupt Disable Register -------- +// -------- UDP_IMR : (UDP Offset: 0x18) USB Interrupt Mask Register -------- +// -------- UDP_ISR : (UDP Offset: 0x1c) USB Interrupt Status Register -------- +#define AT91C_UDP_ENDBUSRES (0x1 << 12) // (UDP) USB End Of Bus Reset Interrupt +// -------- UDP_ICR : (UDP Offset: 0x20) USB Interrupt Clear Register -------- +// -------- UDP_RST_EP : (UDP Offset: 0x28) USB Reset Endpoint Register -------- +#define AT91C_UDP_EP0 (0x1 << 0) // (UDP) Reset Endpoint 0 +#define AT91C_UDP_EP1 (0x1 << 1) // (UDP) Reset Endpoint 1 +#define AT91C_UDP_EP2 (0x1 << 2) // (UDP) Reset Endpoint 2 +#define AT91C_UDP_EP3 (0x1 << 3) // (UDP) Reset Endpoint 3 +#define AT91C_UDP_EP4 (0x1 << 4) // (UDP) Reset Endpoint 4 +#define AT91C_UDP_EP5 (0x1 << 5) // (UDP) Reset Endpoint 5 +// -------- UDP_CSR : (UDP Offset: 0x30) USB Endpoint Control and Status Register -------- +#define AT91C_UDP_TXCOMP (0x1 << 0) // (UDP) Generates an IN packet with data previously written in the DPR +#define AT91C_UDP_RX_DATA_BK0 (0x1 << 1) // (UDP) Receive Data Bank 0 +#define AT91C_UDP_RXSETUP (0x1 << 2) // (UDP) Sends STALL to the Host (Control endpoints) +#define AT91C_UDP_ISOERROR (0x1 << 3) // (UDP) Isochronous error (Isochronous endpoints) +#define AT91C_UDP_TXPKTRDY (0x1 << 4) // (UDP) Transmit Packet Ready +#define AT91C_UDP_FORCESTALL (0x1 << 5) // (UDP) Force Stall (used by Control, Bulk and Isochronous endpoints). +#define AT91C_UDP_RX_DATA_BK1 (0x1 << 6) // (UDP) Receive Data Bank 1 (only used by endpoints with ping-pong attributes). +#define AT91C_UDP_DIR (0x1 << 7) // (UDP) Transfer Direction +#define AT91C_UDP_EPTYPE (0x7 << 8) // (UDP) Endpoint type +#define AT91C_UDP_EPTYPE_CTRL (0x0 << 8) // (UDP) Control +#define AT91C_UDP_EPTYPE_ISO_OUT (0x1 << 8) // (UDP) Isochronous OUT +#define AT91C_UDP_EPTYPE_BULK_OUT (0x2 << 8) // (UDP) Bulk OUT +#define AT91C_UDP_EPTYPE_INT_OUT (0x3 << 8) // (UDP) Interrupt OUT +#define AT91C_UDP_EPTYPE_ISO_IN (0x5 << 8) // (UDP) Isochronous IN +#define AT91C_UDP_EPTYPE_BULK_IN (0x6 << 8) // (UDP) Bulk IN +#define AT91C_UDP_EPTYPE_INT_IN (0x7 << 8) // (UDP) Interrupt IN +#define AT91C_UDP_DTGLE (0x1 << 11) // (UDP) Data Toggle +#define AT91C_UDP_EPEDS (0x1 << 15) // (UDP) Endpoint Enable Disable +#define AT91C_UDP_RXBYTECNT (0x7FF << 16) // (UDP) Number Of Bytes Available in the FIFO +// -------- UDP_TXVC : (UDP Offset: 0x74) Transceiver Control Register -------- +#define AT91C_UDP_TXVDIS (0x1 << 8) // (UDP) +#define AT91C_UDP_PUON (0x1 << 9) // (UDP) Pull-up ON + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Timer Counter Channel Interface +// ***************************************************************************** +// *** Register offset in AT91S_TC structure *** +#define TC_CCR ( 0) // Channel Control Register +#define TC_CMR ( 4) // Channel Mode Register (Capture Mode / Waveform Mode) +#define TC_CV (16) // Counter Value +#define TC_RA (20) // Register A +#define TC_RB (24) // Register B +#define TC_RC (28) // Register C +#define TC_SR (32) // Status Register +#define TC_IER (36) // Interrupt Enable Register +#define TC_IDR (40) // Interrupt Disable Register +#define TC_IMR (44) // Interrupt Mask Register +// -------- TC_CCR : (TC Offset: 0x0) TC Channel Control Register -------- +#define AT91C_TC_CLKEN (0x1 << 0) // (TC) Counter Clock Enable Command +#define AT91C_TC_CLKDIS (0x1 << 1) // (TC) Counter Clock Disable Command +#define AT91C_TC_SWTRG (0x1 << 2) // (TC) Software Trigger Command +// -------- TC_CMR : (TC Offset: 0x4) TC Channel Mode Register: Capture Mode / Waveform Mode -------- +#define AT91C_TC_CLKS (0x7 << 0) // (TC) Clock Selection +#define AT91C_TC_CLKS_TIMER_DIV1_CLOCK (0x0) // (TC) Clock selected: TIMER_DIV1_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV2_CLOCK (0x1) // (TC) Clock selected: TIMER_DIV2_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV3_CLOCK (0x2) // (TC) Clock selected: TIMER_DIV3_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV4_CLOCK (0x3) // (TC) Clock selected: TIMER_DIV4_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV5_CLOCK (0x4) // (TC) Clock selected: TIMER_DIV5_CLOCK +#define AT91C_TC_CLKS_XC0 (0x5) // (TC) Clock selected: XC0 +#define AT91C_TC_CLKS_XC1 (0x6) // (TC) Clock selected: XC1 +#define AT91C_TC_CLKS_XC2 (0x7) // (TC) Clock selected: XC2 +#define AT91C_TC_CLKI (0x1 << 3) // (TC) Clock Invert +#define AT91C_TC_BURST (0x3 << 4) // (TC) Burst Signal Selection +#define AT91C_TC_BURST_NONE (0x0 << 4) // (TC) The clock is not gated by an external signal +#define AT91C_TC_BURST_XC0 (0x1 << 4) // (TC) XC0 is ANDed with the selected clock +#define AT91C_TC_BURST_XC1 (0x2 << 4) // (TC) XC1 is ANDed with the selected clock +#define AT91C_TC_BURST_XC2 (0x3 << 4) // (TC) XC2 is ANDed with the selected clock +#define AT91C_TC_CPCSTOP (0x1 << 6) // (TC) Counter Clock Stopped with RC Compare +#define AT91C_TC_LDBSTOP (0x1 << 6) // (TC) Counter Clock Stopped with RB Loading +#define AT91C_TC_CPCDIS (0x1 << 7) // (TC) Counter Clock Disable with RC Compare +#define AT91C_TC_LDBDIS (0x1 << 7) // (TC) Counter Clock Disabled with RB Loading +#define AT91C_TC_ETRGEDG (0x3 << 8) // (TC) External Trigger Edge Selection +#define AT91C_TC_ETRGEDG_NONE (0x0 << 8) // (TC) Edge: None +#define AT91C_TC_ETRGEDG_RISING (0x1 << 8) // (TC) Edge: rising edge +#define AT91C_TC_ETRGEDG_FALLING (0x2 << 8) // (TC) Edge: falling edge +#define AT91C_TC_ETRGEDG_BOTH (0x3 << 8) // (TC) Edge: each edge +#define AT91C_TC_EEVTEDG (0x3 << 8) // (TC) External Event Edge Selection +#define AT91C_TC_EEVTEDG_NONE (0x0 << 8) // (TC) Edge: None +#define AT91C_TC_EEVTEDG_RISING (0x1 << 8) // (TC) Edge: rising edge +#define AT91C_TC_EEVTEDG_FALLING (0x2 << 8) // (TC) Edge: falling edge +#define AT91C_TC_EEVTEDG_BOTH (0x3 << 8) // (TC) Edge: each edge +#define AT91C_TC_EEVT (0x3 << 10) // (TC) External Event Selection +#define AT91C_TC_EEVT_TIOB (0x0 << 10) // (TC) Signal selected as external event: TIOB TIOB direction: input +#define AT91C_TC_EEVT_XC0 (0x1 << 10) // (TC) Signal selected as external event: XC0 TIOB direction: output +#define AT91C_TC_EEVT_XC1 (0x2 << 10) // (TC) Signal selected as external event: XC1 TIOB direction: output +#define AT91C_TC_EEVT_XC2 (0x3 << 10) // (TC) Signal selected as external event: XC2 TIOB direction: output +#define AT91C_TC_ABETRG (0x1 << 10) // (TC) TIOA or TIOB External Trigger Selection +#define AT91C_TC_ENETRG (0x1 << 12) // (TC) External Event Trigger enable +#define AT91C_TC_WAVESEL (0x3 << 13) // (TC) Waveform Selection +#define AT91C_TC_WAVESEL_UP (0x0 << 13) // (TC) UP mode without atomatic trigger on RC Compare +#define AT91C_TC_WAVESEL_UPDOWN (0x1 << 13) // (TC) UPDOWN mode without automatic trigger on RC Compare +#define AT91C_TC_WAVESEL_UP_AUTO (0x2 << 13) // (TC) UP mode with automatic trigger on RC Compare +#define AT91C_TC_WAVESEL_UPDOWN_AUTO (0x3 << 13) // (TC) UPDOWN mode with automatic trigger on RC Compare +#define AT91C_TC_CPCTRG (0x1 << 14) // (TC) RC Compare Trigger Enable +#define AT91C_TC_WAVE (0x1 << 15) // (TC) +#define AT91C_TC_ACPA (0x3 << 16) // (TC) RA Compare Effect on TIOA +#define AT91C_TC_ACPA_NONE (0x0 << 16) // (TC) Effect: none +#define AT91C_TC_ACPA_SET (0x1 << 16) // (TC) Effect: set +#define AT91C_TC_ACPA_CLEAR (0x2 << 16) // (TC) Effect: clear +#define AT91C_TC_ACPA_TOGGLE (0x3 << 16) // (TC) Effect: toggle +#define AT91C_TC_LDRA (0x3 << 16) // (TC) RA Loading Selection +#define AT91C_TC_LDRA_NONE (0x0 << 16) // (TC) Edge: None +#define AT91C_TC_LDRA_RISING (0x1 << 16) // (TC) Edge: rising edge of TIOA +#define AT91C_TC_LDRA_FALLING (0x2 << 16) // (TC) Edge: falling edge of TIOA +#define AT91C_TC_LDRA_BOTH (0x3 << 16) // (TC) Edge: each edge of TIOA +#define AT91C_TC_ACPC (0x3 << 18) // (TC) RC Compare Effect on TIOA +#define AT91C_TC_ACPC_NONE (0x0 << 18) // (TC) Effect: none +#define AT91C_TC_ACPC_SET (0x1 << 18) // (TC) Effect: set +#define AT91C_TC_ACPC_CLEAR (0x2 << 18) // (TC) Effect: clear +#define AT91C_TC_ACPC_TOGGLE (0x3 << 18) // (TC) Effect: toggle +#define AT91C_TC_LDRB (0x3 << 18) // (TC) RB Loading Selection +#define AT91C_TC_LDRB_NONE (0x0 << 18) // (TC) Edge: None +#define AT91C_TC_LDRB_RISING (0x1 << 18) // (TC) Edge: rising edge of TIOA +#define AT91C_TC_LDRB_FALLING (0x2 << 18) // (TC) Edge: falling edge of TIOA +#define AT91C_TC_LDRB_BOTH (0x3 << 18) // (TC) Edge: each edge of TIOA +#define AT91C_TC_AEEVT (0x3 << 20) // (TC) External Event Effect on TIOA +#define AT91C_TC_AEEVT_NONE (0x0 << 20) // (TC) Effect: none +#define AT91C_TC_AEEVT_SET (0x1 << 20) // (TC) Effect: set +#define AT91C_TC_AEEVT_CLEAR (0x2 << 20) // (TC) Effect: clear +#define AT91C_TC_AEEVT_TOGGLE (0x3 << 20) // (TC) Effect: toggle +#define AT91C_TC_ASWTRG (0x3 << 22) // (TC) Software Trigger Effect on TIOA +#define AT91C_TC_ASWTRG_NONE (0x0 << 22) // (TC) Effect: none +#define AT91C_TC_ASWTRG_SET (0x1 << 22) // (TC) Effect: set +#define AT91C_TC_ASWTRG_CLEAR (0x2 << 22) // (TC) Effect: clear +#define AT91C_TC_ASWTRG_TOGGLE (0x3 << 22) // (TC) Effect: toggle +#define AT91C_TC_BCPB (0x3 << 24) // (TC) RB Compare Effect on TIOB +#define AT91C_TC_BCPB_NONE (0x0 << 24) // (TC) Effect: none +#define AT91C_TC_BCPB_SET (0x1 << 24) // (TC) Effect: set +#define AT91C_TC_BCPB_CLEAR (0x2 << 24) // (TC) Effect: clear +#define AT91C_TC_BCPB_TOGGLE (0x3 << 24) // (TC) Effect: toggle +#define AT91C_TC_BCPC (0x3 << 26) // (TC) RC Compare Effect on TIOB +#define AT91C_TC_BCPC_NONE (0x0 << 26) // (TC) Effect: none +#define AT91C_TC_BCPC_SET (0x1 << 26) // (TC) Effect: set +#define AT91C_TC_BCPC_CLEAR (0x2 << 26) // (TC) Effect: clear +#define AT91C_TC_BCPC_TOGGLE (0x3 << 26) // (TC) Effect: toggle +#define AT91C_TC_BEEVT (0x3 << 28) // (TC) External Event Effect on TIOB +#define AT91C_TC_BEEVT_NONE (0x0 << 28) // (TC) Effect: none +#define AT91C_TC_BEEVT_SET (0x1 << 28) // (TC) Effect: set +#define AT91C_TC_BEEVT_CLEAR (0x2 << 28) // (TC) Effect: clear +#define AT91C_TC_BEEVT_TOGGLE (0x3 << 28) // (TC) Effect: toggle +#define AT91C_TC_BSWTRG (0x3 << 30) // (TC) Software Trigger Effect on TIOB +#define AT91C_TC_BSWTRG_NONE (0x0 << 30) // (TC) Effect: none +#define AT91C_TC_BSWTRG_SET (0x1 << 30) // (TC) Effect: set +#define AT91C_TC_BSWTRG_CLEAR (0x2 << 30) // (TC) Effect: clear +#define AT91C_TC_BSWTRG_TOGGLE (0x3 << 30) // (TC) Effect: toggle +// -------- TC_SR : (TC Offset: 0x20) TC Channel Status Register -------- +#define AT91C_TC_COVFS (0x1 << 0) // (TC) Counter Overflow +#define AT91C_TC_LOVRS (0x1 << 1) // (TC) Load Overrun +#define AT91C_TC_CPAS (0x1 << 2) // (TC) RA Compare +#define AT91C_TC_CPBS (0x1 << 3) // (TC) RB Compare +#define AT91C_TC_CPCS (0x1 << 4) // (TC) RC Compare +#define AT91C_TC_LDRAS (0x1 << 5) // (TC) RA Loading +#define AT91C_TC_LDRBS (0x1 << 6) // (TC) RB Loading +#define AT91C_TC_ETRGS (0x1 << 7) // (TC) External Trigger +#define AT91C_TC_CLKSTA (0x1 << 16) // (TC) Clock Enabling +#define AT91C_TC_MTIOA (0x1 << 17) // (TC) TIOA Mirror +#define AT91C_TC_MTIOB (0x1 << 18) // (TC) TIOA Mirror +// -------- TC_IER : (TC Offset: 0x24) TC Channel Interrupt Enable Register -------- +// -------- TC_IDR : (TC Offset: 0x28) TC Channel Interrupt Disable Register -------- +// -------- TC_IMR : (TC Offset: 0x2c) TC Channel Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Timer Counter Interface +// ***************************************************************************** +// *** Register offset in AT91S_TCB structure *** +#define TCB_TC0 ( 0) // TC Channel 0 +#define TCB_TC1 (64) // TC Channel 1 +#define TCB_TC2 (128) // TC Channel 2 +#define TCB_BCR (192) // TC Block Control Register +#define TCB_BMR (196) // TC Block Mode Register +// -------- TCB_BCR : (TCB Offset: 0xc0) TC Block Control Register -------- +#define AT91C_TCB_SYNC (0x1 << 0) // (TCB) Synchro Command +// -------- TCB_BMR : (TCB Offset: 0xc4) TC Block Mode Register -------- +#define AT91C_TCB_TC0XC0S (0x3 << 0) // (TCB) External Clock Signal 0 Selection +#define AT91C_TCB_TC0XC0S_TCLK0 (0x0) // (TCB) TCLK0 connected to XC0 +#define AT91C_TCB_TC0XC0S_NONE (0x1) // (TCB) None signal connected to XC0 +#define AT91C_TCB_TC0XC0S_TIOA1 (0x2) // (TCB) TIOA1 connected to XC0 +#define AT91C_TCB_TC0XC0S_TIOA2 (0x3) // (TCB) TIOA2 connected to XC0 +#define AT91C_TCB_TC1XC1S (0x3 << 2) // (TCB) External Clock Signal 1 Selection +#define AT91C_TCB_TC1XC1S_TCLK1 (0x0 << 2) // (TCB) TCLK1 connected to XC1 +#define AT91C_TCB_TC1XC1S_NONE (0x1 << 2) // (TCB) None signal connected to XC1 +#define AT91C_TCB_TC1XC1S_TIOA0 (0x2 << 2) // (TCB) TIOA0 connected to XC1 +#define AT91C_TCB_TC1XC1S_TIOA2 (0x3 << 2) // (TCB) TIOA2 connected to XC1 +#define AT91C_TCB_TC2XC2S (0x3 << 4) // (TCB) External Clock Signal 2 Selection +#define AT91C_TCB_TC2XC2S_TCLK2 (0x0 << 4) // (TCB) TCLK2 connected to XC2 +#define AT91C_TCB_TC2XC2S_NONE (0x1 << 4) // (TCB) None signal connected to XC2 +#define AT91C_TCB_TC2XC2S_TIOA0 (0x2 << 4) // (TCB) TIOA0 connected to XC2 +#define AT91C_TCB_TC2XC2S_TIOA1 (0x3 << 4) // (TCB) TIOA2 connected to XC2 + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Control Area Network MailBox Interface +// ***************************************************************************** +// *** Register offset in AT91S_CAN_MB structure *** +#define CAN_MB_MMR ( 0) // MailBox Mode Register +#define CAN_MB_MAM ( 4) // MailBox Acceptance Mask Register +#define CAN_MB_MID ( 8) // MailBox ID Register +#define CAN_MB_MFID (12) // MailBox Family ID Register +#define CAN_MB_MSR (16) // MailBox Status Register +#define CAN_MB_MDL (20) // MailBox Data Low Register +#define CAN_MB_MDH (24) // MailBox Data High Register +#define CAN_MB_MCR (28) // MailBox Control Register +// -------- CAN_MMR : (CAN_MB Offset: 0x0) CAN Message Mode Register -------- +#define AT91C_CAN_MTIMEMARK (0xFFFF << 0) // (CAN_MB) Mailbox Timemark +#define AT91C_CAN_PRIOR (0xF << 16) // (CAN_MB) Mailbox Priority +#define AT91C_CAN_MOT (0x7 << 24) // (CAN_MB) Mailbox Object Type +#define AT91C_CAN_MOT_DIS (0x0 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_RX (0x1 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_RXOVERWRITE (0x2 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_TX (0x3 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_CONSUMER (0x4 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_PRODUCER (0x5 << 24) // (CAN_MB) +// -------- CAN_MAM : (CAN_MB Offset: 0x4) CAN Message Acceptance Mask Register -------- +#define AT91C_CAN_MIDvB (0x3FFFF << 0) // (CAN_MB) Complementary bits for identifier in extended mode +#define AT91C_CAN_MIDvA (0x7FF << 18) // (CAN_MB) Identifier for standard frame mode +#define AT91C_CAN_MIDE (0x1 << 29) // (CAN_MB) Identifier Version +// -------- CAN_MID : (CAN_MB Offset: 0x8) CAN Message ID Register -------- +// -------- CAN_MFID : (CAN_MB Offset: 0xc) CAN Message Family ID Register -------- +// -------- CAN_MSR : (CAN_MB Offset: 0x10) CAN Message Status Register -------- +#define AT91C_CAN_MTIMESTAMP (0xFFFF << 0) // (CAN_MB) Timer Value +#define AT91C_CAN_MDLC (0xF << 16) // (CAN_MB) Mailbox Data Length Code +#define AT91C_CAN_MRTR (0x1 << 20) // (CAN_MB) Mailbox Remote Transmission Request +#define AT91C_CAN_MABT (0x1 << 22) // (CAN_MB) Mailbox Message Abort +#define AT91C_CAN_MRDY (0x1 << 23) // (CAN_MB) Mailbox Ready +#define AT91C_CAN_MMI (0x1 << 24) // (CAN_MB) Mailbox Message Ignored +// -------- CAN_MDL : (CAN_MB Offset: 0x14) CAN Message Data Low Register -------- +// -------- CAN_MDH : (CAN_MB Offset: 0x18) CAN Message Data High Register -------- +// -------- CAN_MCR : (CAN_MB Offset: 0x1c) CAN Message Control Register -------- +#define AT91C_CAN_MACR (0x1 << 22) // (CAN_MB) Abort Request for Mailbox +#define AT91C_CAN_MTCR (0x1 << 23) // (CAN_MB) Mailbox Transfer Command + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Control Area Network Interface +// ***************************************************************************** +// *** Register offset in AT91S_CAN structure *** +#define CAN_MR ( 0) // Mode Register +#define CAN_IER ( 4) // Interrupt Enable Register +#define CAN_IDR ( 8) // Interrupt Disable Register +#define CAN_IMR (12) // Interrupt Mask Register +#define CAN_SR (16) // Status Register +#define CAN_BR (20) // Baudrate Register +#define CAN_TIM (24) // Timer Register +#define CAN_TIMESTP (28) // Time Stamp Register +#define CAN_ECR (32) // Error Counter Register +#define CAN_TCR (36) // Transfer Command Register +#define CAN_ACR (40) // Abort Command Register +#define CAN_VR (252) // Version Register +#define CAN_MB0 (512) // CAN Mailbox 0 +#define CAN_MB1 (544) // CAN Mailbox 1 +#define CAN_MB2 (576) // CAN Mailbox 2 +#define CAN_MB3 (608) // CAN Mailbox 3 +#define CAN_MB4 (640) // CAN Mailbox 4 +#define CAN_MB5 (672) // CAN Mailbox 5 +#define CAN_MB6 (704) // CAN Mailbox 6 +#define CAN_MB7 (736) // CAN Mailbox 7 +#define CAN_MB8 (768) // CAN Mailbox 8 +#define CAN_MB9 (800) // CAN Mailbox 9 +#define CAN_MB10 (832) // CAN Mailbox 10 +#define CAN_MB11 (864) // CAN Mailbox 11 +#define CAN_MB12 (896) // CAN Mailbox 12 +#define CAN_MB13 (928) // CAN Mailbox 13 +#define CAN_MB14 (960) // CAN Mailbox 14 +#define CAN_MB15 (992) // CAN Mailbox 15 +// -------- CAN_MR : (CAN Offset: 0x0) CAN Mode Register -------- +#define AT91C_CAN_CANEN (0x1 << 0) // (CAN) CAN Controller Enable +#define AT91C_CAN_LPM (0x1 << 1) // (CAN) Disable/Enable Low Power Mode +#define AT91C_CAN_ABM (0x1 << 2) // (CAN) Disable/Enable Autobaud/Listen Mode +#define AT91C_CAN_OVL (0x1 << 3) // (CAN) Disable/Enable Overload Frame +#define AT91C_CAN_TEOF (0x1 << 4) // (CAN) Time Stamp messages at each end of Frame +#define AT91C_CAN_TTM (0x1 << 5) // (CAN) Disable/Enable Time Trigger Mode +#define AT91C_CAN_TIMFRZ (0x1 << 6) // (CAN) Enable Timer Freeze +#define AT91C_CAN_DRPT (0x1 << 7) // (CAN) Disable Repeat +// -------- CAN_IER : (CAN Offset: 0x4) CAN Interrupt Enable Register -------- +#define AT91C_CAN_MB0 (0x1 << 0) // (CAN) Mailbox 0 Flag +#define AT91C_CAN_MB1 (0x1 << 1) // (CAN) Mailbox 1 Flag +#define AT91C_CAN_MB2 (0x1 << 2) // (CAN) Mailbox 2 Flag +#define AT91C_CAN_MB3 (0x1 << 3) // (CAN) Mailbox 3 Flag +#define AT91C_CAN_MB4 (0x1 << 4) // (CAN) Mailbox 4 Flag +#define AT91C_CAN_MB5 (0x1 << 5) // (CAN) Mailbox 5 Flag +#define AT91C_CAN_MB6 (0x1 << 6) // (CAN) Mailbox 6 Flag +#define AT91C_CAN_MB7 (0x1 << 7) // (CAN) Mailbox 7 Flag +#define AT91C_CAN_MB8 (0x1 << 8) // (CAN) Mailbox 8 Flag +#define AT91C_CAN_MB9 (0x1 << 9) // (CAN) Mailbox 9 Flag +#define AT91C_CAN_MB10 (0x1 << 10) // (CAN) Mailbox 10 Flag +#define AT91C_CAN_MB11 (0x1 << 11) // (CAN) Mailbox 11 Flag +#define AT91C_CAN_MB12 (0x1 << 12) // (CAN) Mailbox 12 Flag +#define AT91C_CAN_MB13 (0x1 << 13) // (CAN) Mailbox 13 Flag +#define AT91C_CAN_MB14 (0x1 << 14) // (CAN) Mailbox 14 Flag +#define AT91C_CAN_MB15 (0x1 << 15) // (CAN) Mailbox 15 Flag +#define AT91C_CAN_ERRA (0x1 << 16) // (CAN) Error Active Mode Flag +#define AT91C_CAN_WARN (0x1 << 17) // (CAN) Warning Limit Flag +#define AT91C_CAN_ERRP (0x1 << 18) // (CAN) Error Passive Mode Flag +#define AT91C_CAN_BOFF (0x1 << 19) // (CAN) Bus Off Mode Flag +#define AT91C_CAN_SLEEP (0x1 << 20) // (CAN) Sleep Flag +#define AT91C_CAN_WAKEUP (0x1 << 21) // (CAN) Wakeup Flag +#define AT91C_CAN_TOVF (0x1 << 22) // (CAN) Timer Overflow Flag +#define AT91C_CAN_TSTP (0x1 << 23) // (CAN) Timestamp Flag +#define AT91C_CAN_CERR (0x1 << 24) // (CAN) CRC Error +#define AT91C_CAN_SERR (0x1 << 25) // (CAN) Stuffing Error +#define AT91C_CAN_AERR (0x1 << 26) // (CAN) Acknowledgment Error +#define AT91C_CAN_FERR (0x1 << 27) // (CAN) Form Error +#define AT91C_CAN_BERR (0x1 << 28) // (CAN) Bit Error +// -------- CAN_IDR : (CAN Offset: 0x8) CAN Interrupt Disable Register -------- +// -------- CAN_IMR : (CAN Offset: 0xc) CAN Interrupt Mask Register -------- +// -------- CAN_SR : (CAN Offset: 0x10) CAN Status Register -------- +#define AT91C_CAN_RBSY (0x1 << 29) // (CAN) Receiver Busy +#define AT91C_CAN_TBSY (0x1 << 30) // (CAN) Transmitter Busy +#define AT91C_CAN_OVLY (0x1 << 31) // (CAN) Overload Busy +// -------- CAN_BR : (CAN Offset: 0x14) CAN Baudrate Register -------- +#define AT91C_CAN_PHASE2 (0x7 << 0) // (CAN) Phase 2 segment +#define AT91C_CAN_PHASE1 (0x7 << 4) // (CAN) Phase 1 segment +#define AT91C_CAN_PROPAG (0x7 << 8) // (CAN) Programmation time segment +#define AT91C_CAN_SYNC (0x3 << 12) // (CAN) Re-synchronization jump width segment +#define AT91C_CAN_BRP (0x7F << 16) // (CAN) Baudrate Prescaler +#define AT91C_CAN_SMP (0x1 << 24) // (CAN) Sampling mode +// -------- CAN_TIM : (CAN Offset: 0x18) CAN Timer Register -------- +#define AT91C_CAN_TIMER (0xFFFF << 0) // (CAN) Timer field +// -------- CAN_TIMESTP : (CAN Offset: 0x1c) CAN Timestamp Register -------- +// -------- CAN_ECR : (CAN Offset: 0x20) CAN Error Counter Register -------- +#define AT91C_CAN_REC (0xFF << 0) // (CAN) Receive Error Counter +#define AT91C_CAN_TEC (0xFF << 16) // (CAN) Transmit Error Counter +// -------- CAN_TCR : (CAN Offset: 0x24) CAN Transfer Command Register -------- +#define AT91C_CAN_TIMRST (0x1 << 31) // (CAN) Timer Reset Field +// -------- CAN_ACR : (CAN Offset: 0x28) CAN Abort Command Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Ethernet MAC 10/100 +// ***************************************************************************** +// *** Register offset in AT91S_EMAC structure *** +#define EMAC_NCR ( 0) // Network Control Register +#define EMAC_NCFGR ( 4) // Network Configuration Register +#define EMAC_NSR ( 8) // Network Status Register +#define EMAC_TSR (20) // Transmit Status Register +#define EMAC_RBQP (24) // Receive Buffer Queue Pointer +#define EMAC_TBQP (28) // Transmit Buffer Queue Pointer +#define EMAC_RSR (32) // Receive Status Register +#define EMAC_ISR (36) // Interrupt Status Register +#define EMAC_IER (40) // Interrupt Enable Register +#define EMAC_IDR (44) // Interrupt Disable Register +#define EMAC_IMR (48) // Interrupt Mask Register +#define EMAC_MAN (52) // PHY Maintenance Register +#define EMAC_PTR (56) // Pause Time Register +#define EMAC_PFR (60) // Pause Frames received Register +#define EMAC_FTO (64) // Frames Transmitted OK Register +#define EMAC_SCF (68) // Single Collision Frame Register +#define EMAC_MCF (72) // Multiple Collision Frame Register +#define EMAC_FRO (76) // Frames Received OK Register +#define EMAC_FCSE (80) // Frame Check Sequence Error Register +#define EMAC_ALE (84) // Alignment Error Register +#define EMAC_DTF (88) // Deferred Transmission Frame Register +#define EMAC_LCOL (92) // Late Collision Register +#define EMAC_ECOL (96) // Excessive Collision Register +#define EMAC_TUND (100) // Transmit Underrun Error Register +#define EMAC_CSE (104) // Carrier Sense Error Register +#define EMAC_RRE (108) // Receive Ressource Error Register +#define EMAC_ROV (112) // Receive Overrun Errors Register +#define EMAC_RSE (116) // Receive Symbol Errors Register +#define EMAC_ELE (120) // Excessive Length Errors Register +#define EMAC_RJA (124) // Receive Jabbers Register +#define EMAC_USF (128) // Undersize Frames Register +#define EMAC_STE (132) // SQE Test Error Register +#define EMAC_RLE (136) // Receive Length Field Mismatch Register +#define EMAC_TPF (140) // Transmitted Pause Frames Register +#define EMAC_HRB (144) // Hash Address Bottom[31:0] +#define EMAC_HRT (148) // Hash Address Top[63:32] +#define EMAC_SA1L (152) // Specific Address 1 Bottom, First 4 bytes +#define EMAC_SA1H (156) // Specific Address 1 Top, Last 2 bytes +#define EMAC_SA2L (160) // Specific Address 2 Bottom, First 4 bytes +#define EMAC_SA2H (164) // Specific Address 2 Top, Last 2 bytes +#define EMAC_SA3L (168) // Specific Address 3 Bottom, First 4 bytes +#define EMAC_SA3H (172) // Specific Address 3 Top, Last 2 bytes +#define EMAC_SA4L (176) // Specific Address 4 Bottom, First 4 bytes +#define EMAC_SA4H (180) // Specific Address 4 Top, Last 2 bytes +#define EMAC_TID (184) // Type ID Checking Register +#define EMAC_TPQ (188) // Transmit Pause Quantum Register +#define EMAC_USRIO (192) // USER Input/Output Register +#define EMAC_WOL (196) // Wake On LAN Register +#define EMAC_REV (252) // Revision Register +// -------- EMAC_NCR : (EMAC Offset: 0x0) -------- +#define AT91C_EMAC_LB (0x1 << 0) // (EMAC) Loopback. Optional. When set, loopback signal is at high level. +#define AT91C_EMAC_LLB (0x1 << 1) // (EMAC) Loopback local. +#define AT91C_EMAC_RE (0x1 << 2) // (EMAC) Receive enable. +#define AT91C_EMAC_TE (0x1 << 3) // (EMAC) Transmit enable. +#define AT91C_EMAC_MPE (0x1 << 4) // (EMAC) Management port enable. +#define AT91C_EMAC_CLRSTAT (0x1 << 5) // (EMAC) Clear statistics registers. +#define AT91C_EMAC_INCSTAT (0x1 << 6) // (EMAC) Increment statistics registers. +#define AT91C_EMAC_WESTAT (0x1 << 7) // (EMAC) Write enable for statistics registers. +#define AT91C_EMAC_BP (0x1 << 8) // (EMAC) Back pressure. +#define AT91C_EMAC_TSTART (0x1 << 9) // (EMAC) Start Transmission. +#define AT91C_EMAC_THALT (0x1 << 10) // (EMAC) Transmission Halt. +#define AT91C_EMAC_TPFR (0x1 << 11) // (EMAC) Transmit pause frame +#define AT91C_EMAC_TZQ (0x1 << 12) // (EMAC) Transmit zero quantum pause frame +// -------- EMAC_NCFGR : (EMAC Offset: 0x4) Network Configuration Register -------- +#define AT91C_EMAC_SPD (0x1 << 0) // (EMAC) Speed. +#define AT91C_EMAC_FD (0x1 << 1) // (EMAC) Full duplex. +#define AT91C_EMAC_JFRAME (0x1 << 3) // (EMAC) Jumbo Frames. +#define AT91C_EMAC_CAF (0x1 << 4) // (EMAC) Copy all frames. +#define AT91C_EMAC_NBC (0x1 << 5) // (EMAC) No broadcast. +#define AT91C_EMAC_MTI (0x1 << 6) // (EMAC) Multicast hash event enable +#define AT91C_EMAC_UNI (0x1 << 7) // (EMAC) Unicast hash enable. +#define AT91C_EMAC_BIG (0x1 << 8) // (EMAC) Receive 1522 bytes. +#define AT91C_EMAC_EAE (0x1 << 9) // (EMAC) External address match enable. +#define AT91C_EMAC_CLK (0x3 << 10) // (EMAC) +#define AT91C_EMAC_CLK_HCLK_8 (0x0 << 10) // (EMAC) HCLK divided by 8 +#define AT91C_EMAC_CLK_HCLK_16 (0x1 << 10) // (EMAC) HCLK divided by 16 +#define AT91C_EMAC_CLK_HCLK_32 (0x2 << 10) // (EMAC) HCLK divided by 32 +#define AT91C_EMAC_CLK_HCLK_64 (0x3 << 10) // (EMAC) HCLK divided by 64 +#define AT91C_EMAC_RTY (0x1 << 12) // (EMAC) +#define AT91C_EMAC_PAE (0x1 << 13) // (EMAC) +#define AT91C_EMAC_RBOF (0x3 << 14) // (EMAC) +#define AT91C_EMAC_RBOF_OFFSET_0 (0x0 << 14) // (EMAC) no offset from start of receive buffer +#define AT91C_EMAC_RBOF_OFFSET_1 (0x1 << 14) // (EMAC) one byte offset from start of receive buffer +#define AT91C_EMAC_RBOF_OFFSET_2 (0x2 << 14) // (EMAC) two bytes offset from start of receive buffer +#define AT91C_EMAC_RBOF_OFFSET_3 (0x3 << 14) // (EMAC) three bytes offset from start of receive buffer +#define AT91C_EMAC_RLCE (0x1 << 16) // (EMAC) Receive Length field Checking Enable +#define AT91C_EMAC_DRFCS (0x1 << 17) // (EMAC) Discard Receive FCS +#define AT91C_EMAC_EFRHD (0x1 << 18) // (EMAC) +#define AT91C_EMAC_IRXFCS (0x1 << 19) // (EMAC) Ignore RX FCS +// -------- EMAC_NSR : (EMAC Offset: 0x8) Network Status Register -------- +#define AT91C_EMAC_LINKR (0x1 << 0) // (EMAC) +#define AT91C_EMAC_MDIO (0x1 << 1) // (EMAC) +#define AT91C_EMAC_IDLE (0x1 << 2) // (EMAC) +// -------- EMAC_TSR : (EMAC Offset: 0x14) Transmit Status Register -------- +#define AT91C_EMAC_UBR (0x1 << 0) // (EMAC) +#define AT91C_EMAC_COL (0x1 << 1) // (EMAC) +#define AT91C_EMAC_RLES (0x1 << 2) // (EMAC) +#define AT91C_EMAC_TGO (0x1 << 3) // (EMAC) Transmit Go +#define AT91C_EMAC_BEX (0x1 << 4) // (EMAC) Buffers exhausted mid frame +#define AT91C_EMAC_COMP (0x1 << 5) // (EMAC) +#define AT91C_EMAC_UND (0x1 << 6) // (EMAC) +// -------- EMAC_RSR : (EMAC Offset: 0x20) Receive Status Register -------- +#define AT91C_EMAC_BNA (0x1 << 0) // (EMAC) +#define AT91C_EMAC_REC (0x1 << 1) // (EMAC) +#define AT91C_EMAC_OVR (0x1 << 2) // (EMAC) +// -------- EMAC_ISR : (EMAC Offset: 0x24) Interrupt Status Register -------- +#define AT91C_EMAC_MFD (0x1 << 0) // (EMAC) +#define AT91C_EMAC_RCOMP (0x1 << 1) // (EMAC) +#define AT91C_EMAC_RXUBR (0x1 << 2) // (EMAC) +#define AT91C_EMAC_TXUBR (0x1 << 3) // (EMAC) +#define AT91C_EMAC_TUNDR (0x1 << 4) // (EMAC) +#define AT91C_EMAC_RLEX (0x1 << 5) // (EMAC) +#define AT91C_EMAC_TXERR (0x1 << 6) // (EMAC) +#define AT91C_EMAC_TCOMP (0x1 << 7) // (EMAC) +#define AT91C_EMAC_LINK (0x1 << 9) // (EMAC) +#define AT91C_EMAC_ROVR (0x1 << 10) // (EMAC) +#define AT91C_EMAC_HRESP (0x1 << 11) // (EMAC) +#define AT91C_EMAC_PFRE (0x1 << 12) // (EMAC) +#define AT91C_EMAC_PTZ (0x1 << 13) // (EMAC) +// -------- EMAC_IER : (EMAC Offset: 0x28) Interrupt Enable Register -------- +// -------- EMAC_IDR : (EMAC Offset: 0x2c) Interrupt Disable Register -------- +// -------- EMAC_IMR : (EMAC Offset: 0x30) Interrupt Mask Register -------- +// -------- EMAC_MAN : (EMAC Offset: 0x34) PHY Maintenance Register -------- +#define AT91C_EMAC_DATA (0xFFFF << 0) // (EMAC) +#define AT91C_EMAC_CODE (0x3 << 16) // (EMAC) +#define AT91C_EMAC_REGA (0x1F << 18) // (EMAC) +#define AT91C_EMAC_PHYA (0x1F << 23) // (EMAC) +#define AT91C_EMAC_RW (0x3 << 28) // (EMAC) +#define AT91C_EMAC_SOF (0x3 << 30) // (EMAC) +// -------- EMAC_USRIO : (EMAC Offset: 0xc0) USER Input Output Register -------- +#define AT91C_EMAC_RMII (0x1 << 0) // (EMAC) Reduce MII +// -------- EMAC_WOL : (EMAC Offset: 0xc4) Wake On LAN Register -------- +#define AT91C_EMAC_IP (0xFFFF << 0) // (EMAC) ARP request IP address +#define AT91C_EMAC_MAG (0x1 << 16) // (EMAC) Magic packet event enable +#define AT91C_EMAC_ARP (0x1 << 17) // (EMAC) ARP request event enable +#define AT91C_EMAC_SA1 (0x1 << 18) // (EMAC) Specific address register 1 event enable +// -------- EMAC_REV : (EMAC Offset: 0xfc) Revision Register -------- +#define AT91C_EMAC_REVREF (0xFFFF << 0) // (EMAC) +#define AT91C_EMAC_PARTREF (0xFFFF << 16) // (EMAC) + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Analog to Digital Convertor +// ***************************************************************************** +// *** Register offset in AT91S_ADC structure *** +#define ADC_CR ( 0) // ADC Control Register +#define ADC_MR ( 4) // ADC Mode Register +#define ADC_CHER (16) // ADC Channel Enable Register +#define ADC_CHDR (20) // ADC Channel Disable Register +#define ADC_CHSR (24) // ADC Channel Status Register +#define ADC_SR (28) // ADC Status Register +#define ADC_LCDR (32) // ADC Last Converted Data Register +#define ADC_IER (36) // ADC Interrupt Enable Register +#define ADC_IDR (40) // ADC Interrupt Disable Register +#define ADC_IMR (44) // ADC Interrupt Mask Register +#define ADC_CDR0 (48) // ADC Channel Data Register 0 +#define ADC_CDR1 (52) // ADC Channel Data Register 1 +#define ADC_CDR2 (56) // ADC Channel Data Register 2 +#define ADC_CDR3 (60) // ADC Channel Data Register 3 +#define ADC_CDR4 (64) // ADC Channel Data Register 4 +#define ADC_CDR5 (68) // ADC Channel Data Register 5 +#define ADC_CDR6 (72) // ADC Channel Data Register 6 +#define ADC_CDR7 (76) // ADC Channel Data Register 7 +#define ADC_RPR (256) // Receive Pointer Register +#define ADC_RCR (260) // Receive Counter Register +#define ADC_TPR (264) // Transmit Pointer Register +#define ADC_TCR (268) // Transmit Counter Register +#define ADC_RNPR (272) // Receive Next Pointer Register +#define ADC_RNCR (276) // Receive Next Counter Register +#define ADC_TNPR (280) // Transmit Next Pointer Register +#define ADC_TNCR (284) // Transmit Next Counter Register +#define ADC_PTCR (288) // PDC Transfer Control Register +#define ADC_PTSR (292) // PDC Transfer Status Register +// -------- ADC_CR : (ADC Offset: 0x0) ADC Control Register -------- +#define AT91C_ADC_SWRST (0x1 << 0) // (ADC) Software Reset +#define AT91C_ADC_START (0x1 << 1) // (ADC) Start Conversion +// -------- ADC_MR : (ADC Offset: 0x4) ADC Mode Register -------- +#define AT91C_ADC_TRGEN (0x1 << 0) // (ADC) Trigger Enable +#define AT91C_ADC_TRGEN_DIS (0x0) // (ADC) Hradware triggers are disabled. Starting a conversion is only possible by software +#define AT91C_ADC_TRGEN_EN (0x1) // (ADC) Hardware trigger selected by TRGSEL field is enabled. +#define AT91C_ADC_TRGSEL (0x7 << 1) // (ADC) Trigger Selection +#define AT91C_ADC_TRGSEL_TIOA0 (0x0 << 1) // (ADC) Selected TRGSEL = TIAO0 +#define AT91C_ADC_TRGSEL_TIOA1 (0x1 << 1) // (ADC) Selected TRGSEL = TIAO1 +#define AT91C_ADC_TRGSEL_TIOA2 (0x2 << 1) // (ADC) Selected TRGSEL = TIAO2 +#define AT91C_ADC_TRGSEL_TIOA3 (0x3 << 1) // (ADC) Selected TRGSEL = TIAO3 +#define AT91C_ADC_TRGSEL_TIOA4 (0x4 << 1) // (ADC) Selected TRGSEL = TIAO4 +#define AT91C_ADC_TRGSEL_TIOA5 (0x5 << 1) // (ADC) Selected TRGSEL = TIAO5 +#define AT91C_ADC_TRGSEL_EXT (0x6 << 1) // (ADC) Selected TRGSEL = External Trigger +#define AT91C_ADC_LOWRES (0x1 << 4) // (ADC) Resolution. +#define AT91C_ADC_LOWRES_10_BIT (0x0 << 4) // (ADC) 10-bit resolution +#define AT91C_ADC_LOWRES_8_BIT (0x1 << 4) // (ADC) 8-bit resolution +#define AT91C_ADC_SLEEP (0x1 << 5) // (ADC) Sleep Mode +#define AT91C_ADC_SLEEP_NORMAL_MODE (0x0 << 5) // (ADC) Normal Mode +#define AT91C_ADC_SLEEP_MODE (0x1 << 5) // (ADC) Sleep Mode +#define AT91C_ADC_PRESCAL (0x3F << 8) // (ADC) Prescaler rate selection +#define AT91C_ADC_STARTUP (0x1F << 16) // (ADC) Startup Time +#define AT91C_ADC_SHTIM (0xF << 24) // (ADC) Sample & Hold Time +// -------- ADC_CHER : (ADC Offset: 0x10) ADC Channel Enable Register -------- +#define AT91C_ADC_CH0 (0x1 << 0) // (ADC) Channel 0 +#define AT91C_ADC_CH1 (0x1 << 1) // (ADC) Channel 1 +#define AT91C_ADC_CH2 (0x1 << 2) // (ADC) Channel 2 +#define AT91C_ADC_CH3 (0x1 << 3) // (ADC) Channel 3 +#define AT91C_ADC_CH4 (0x1 << 4) // (ADC) Channel 4 +#define AT91C_ADC_CH5 (0x1 << 5) // (ADC) Channel 5 +#define AT91C_ADC_CH6 (0x1 << 6) // (ADC) Channel 6 +#define AT91C_ADC_CH7 (0x1 << 7) // (ADC) Channel 7 +// -------- ADC_CHDR : (ADC Offset: 0x14) ADC Channel Disable Register -------- +// -------- ADC_CHSR : (ADC Offset: 0x18) ADC Channel Status Register -------- +// -------- ADC_SR : (ADC Offset: 0x1c) ADC Status Register -------- +#define AT91C_ADC_EOC0 (0x1 << 0) // (ADC) End of Conversion +#define AT91C_ADC_EOC1 (0x1 << 1) // (ADC) End of Conversion +#define AT91C_ADC_EOC2 (0x1 << 2) // (ADC) End of Conversion +#define AT91C_ADC_EOC3 (0x1 << 3) // (ADC) End of Conversion +#define AT91C_ADC_EOC4 (0x1 << 4) // (ADC) End of Conversion +#define AT91C_ADC_EOC5 (0x1 << 5) // (ADC) End of Conversion +#define AT91C_ADC_EOC6 (0x1 << 6) // (ADC) End of Conversion +#define AT91C_ADC_EOC7 (0x1 << 7) // (ADC) End of Conversion +#define AT91C_ADC_OVRE0 (0x1 << 8) // (ADC) Overrun Error +#define AT91C_ADC_OVRE1 (0x1 << 9) // (ADC) Overrun Error +#define AT91C_ADC_OVRE2 (0x1 << 10) // (ADC) Overrun Error +#define AT91C_ADC_OVRE3 (0x1 << 11) // (ADC) Overrun Error +#define AT91C_ADC_OVRE4 (0x1 << 12) // (ADC) Overrun Error +#define AT91C_ADC_OVRE5 (0x1 << 13) // (ADC) Overrun Error +#define AT91C_ADC_OVRE6 (0x1 << 14) // (ADC) Overrun Error +#define AT91C_ADC_OVRE7 (0x1 << 15) // (ADC) Overrun Error +#define AT91C_ADC_DRDY (0x1 << 16) // (ADC) Data Ready +#define AT91C_ADC_GOVRE (0x1 << 17) // (ADC) General Overrun +#define AT91C_ADC_ENDRX (0x1 << 18) // (ADC) End of Receiver Transfer +#define AT91C_ADC_RXBUFF (0x1 << 19) // (ADC) RXBUFF Interrupt +// -------- ADC_LCDR : (ADC Offset: 0x20) ADC Last Converted Data Register -------- +#define AT91C_ADC_LDATA (0x3FF << 0) // (ADC) Last Data Converted +// -------- ADC_IER : (ADC Offset: 0x24) ADC Interrupt Enable Register -------- +// -------- ADC_IDR : (ADC Offset: 0x28) ADC Interrupt Disable Register -------- +// -------- ADC_IMR : (ADC Offset: 0x2c) ADC Interrupt Mask Register -------- +// -------- ADC_CDR0 : (ADC Offset: 0x30) ADC Channel Data Register 0 -------- +#define AT91C_ADC_DATA (0x3FF << 0) // (ADC) Converted Data +// -------- ADC_CDR1 : (ADC Offset: 0x34) ADC Channel Data Register 1 -------- +// -------- ADC_CDR2 : (ADC Offset: 0x38) ADC Channel Data Register 2 -------- +// -------- ADC_CDR3 : (ADC Offset: 0x3c) ADC Channel Data Register 3 -------- +// -------- ADC_CDR4 : (ADC Offset: 0x40) ADC Channel Data Register 4 -------- +// -------- ADC_CDR5 : (ADC Offset: 0x44) ADC Channel Data Register 5 -------- +// -------- ADC_CDR6 : (ADC Offset: 0x48) ADC Channel Data Register 6 -------- +// -------- ADC_CDR7 : (ADC Offset: 0x4c) ADC Channel Data Register 7 -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Advanced Encryption Standard +// ***************************************************************************** +// *** Register offset in AT91S_AES structure *** +#define AES_CR ( 0) // Control Register +#define AES_MR ( 4) // Mode Register +#define AES_IER (16) // Interrupt Enable Register +#define AES_IDR (20) // Interrupt Disable Register +#define AES_IMR (24) // Interrupt Mask Register +#define AES_ISR (28) // Interrupt Status Register +#define AES_KEYWxR (32) // Key Word x Register +#define AES_IDATAxR (64) // Input Data x Register +#define AES_ODATAxR (80) // Output Data x Register +#define AES_IVxR (96) // Initialization Vector x Register +#define AES_VR (252) // AES Version Register +#define AES_RPR (256) // Receive Pointer Register +#define AES_RCR (260) // Receive Counter Register +#define AES_TPR (264) // Transmit Pointer Register +#define AES_TCR (268) // Transmit Counter Register +#define AES_RNPR (272) // Receive Next Pointer Register +#define AES_RNCR (276) // Receive Next Counter Register +#define AES_TNPR (280) // Transmit Next Pointer Register +#define AES_TNCR (284) // Transmit Next Counter Register +#define AES_PTCR (288) // PDC Transfer Control Register +#define AES_PTSR (292) // PDC Transfer Status Register +// -------- AES_CR : (AES Offset: 0x0) Control Register -------- +#define AT91C_AES_START (0x1 << 0) // (AES) Starts Processing +#define AT91C_AES_SWRST (0x1 << 8) // (AES) Software Reset +#define AT91C_AES_LOADSEED (0x1 << 16) // (AES) Random Number Generator Seed Loading +// -------- AES_MR : (AES Offset: 0x4) Mode Register -------- +#define AT91C_AES_CIPHER (0x1 << 0) // (AES) Processing Mode +#define AT91C_AES_PROCDLY (0xF << 4) // (AES) Processing Delay +#define AT91C_AES_SMOD (0x3 << 8) // (AES) Start Mode +#define AT91C_AES_SMOD_MANUAL (0x0 << 8) // (AES) Manual Mode: The START bit in register AES_CR must be set to begin encryption or decryption. +#define AT91C_AES_SMOD_AUTO (0x1 << 8) // (AES) Auto Mode: no action in AES_CR is necessary (cf datasheet). +#define AT91C_AES_SMOD_PDC (0x2 << 8) // (AES) PDC Mode (cf datasheet). +#define AT91C_AES_OPMOD (0x7 << 12) // (AES) Operation Mode +#define AT91C_AES_OPMOD_ECB (0x0 << 12) // (AES) ECB Electronic CodeBook mode. +#define AT91C_AES_OPMOD_CBC (0x1 << 12) // (AES) CBC Cipher Block Chaining mode. +#define AT91C_AES_OPMOD_OFB (0x2 << 12) // (AES) OFB Output Feedback mode. +#define AT91C_AES_OPMOD_CFB (0x3 << 12) // (AES) CFB Cipher Feedback mode. +#define AT91C_AES_OPMOD_CTR (0x4 << 12) // (AES) CTR Counter mode. +#define AT91C_AES_LOD (0x1 << 15) // (AES) Last Output Data Mode +#define AT91C_AES_CFBS (0x7 << 16) // (AES) Cipher Feedback Data Size +#define AT91C_AES_CFBS_128_BIT (0x0 << 16) // (AES) 128-bit. +#define AT91C_AES_CFBS_64_BIT (0x1 << 16) // (AES) 64-bit. +#define AT91C_AES_CFBS_32_BIT (0x2 << 16) // (AES) 32-bit. +#define AT91C_AES_CFBS_16_BIT (0x3 << 16) // (AES) 16-bit. +#define AT91C_AES_CFBS_8_BIT (0x4 << 16) // (AES) 8-bit. +#define AT91C_AES_CKEY (0xF << 20) // (AES) Countermeasure Key +#define AT91C_AES_CTYPE (0x1F << 24) // (AES) Countermeasure Type +#define AT91C_AES_CTYPE_TYPE1_EN (0x1 << 24) // (AES) Countermeasure type 1 is enabled. +#define AT91C_AES_CTYPE_TYPE2_EN (0x2 << 24) // (AES) Countermeasure type 2 is enabled. +#define AT91C_AES_CTYPE_TYPE3_EN (0x4 << 24) // (AES) Countermeasure type 3 is enabled. +#define AT91C_AES_CTYPE_TYPE4_EN (0x8 << 24) // (AES) Countermeasure type 4 is enabled. +#define AT91C_AES_CTYPE_TYPE5_EN (0x10 << 24) // (AES) Countermeasure type 5 is enabled. +// -------- AES_IER : (AES Offset: 0x10) Interrupt Enable Register -------- +#define AT91C_AES_DATRDY (0x1 << 0) // (AES) DATRDY +#define AT91C_AES_ENDRX (0x1 << 1) // (AES) PDC Read Buffer End +#define AT91C_AES_ENDTX (0x1 << 2) // (AES) PDC Write Buffer End +#define AT91C_AES_RXBUFF (0x1 << 3) // (AES) PDC Read Buffer Full +#define AT91C_AES_TXBUFE (0x1 << 4) // (AES) PDC Write Buffer Empty +#define AT91C_AES_URAD (0x1 << 8) // (AES) Unspecified Register Access Detection +// -------- AES_IDR : (AES Offset: 0x14) Interrupt Disable Register -------- +// -------- AES_IMR : (AES Offset: 0x18) Interrupt Mask Register -------- +// -------- AES_ISR : (AES Offset: 0x1c) Interrupt Status Register -------- +#define AT91C_AES_URAT (0x7 << 12) // (AES) Unspecified Register Access Type Status +#define AT91C_AES_URAT_IN_DAT_WRITE_DATPROC (0x0 << 12) // (AES) Input data register written during the data processing in PDC mode. +#define AT91C_AES_URAT_OUT_DAT_READ_DATPROC (0x1 << 12) // (AES) Output data register read during the data processing. +#define AT91C_AES_URAT_MODEREG_WRITE_DATPROC (0x2 << 12) // (AES) Mode register written during the data processing. +#define AT91C_AES_URAT_OUT_DAT_READ_SUBKEY (0x3 << 12) // (AES) Output data register read during the sub-keys generation. +#define AT91C_AES_URAT_MODEREG_WRITE_SUBKEY (0x4 << 12) // (AES) Mode register written during the sub-keys generation. +#define AT91C_AES_URAT_WO_REG_READ (0x5 << 12) // (AES) Write-only register read access. + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Triple Data Encryption Standard +// ***************************************************************************** +// *** Register offset in AT91S_TDES structure *** +#define TDES_CR ( 0) // Control Register +#define TDES_MR ( 4) // Mode Register +#define TDES_IER (16) // Interrupt Enable Register +#define TDES_IDR (20) // Interrupt Disable Register +#define TDES_IMR (24) // Interrupt Mask Register +#define TDES_ISR (28) // Interrupt Status Register +#define TDES_KEY1WxR (32) // Key 1 Word x Register +#define TDES_KEY2WxR (40) // Key 2 Word x Register +#define TDES_KEY3WxR (48) // Key 3 Word x Register +#define TDES_IDATAxR (64) // Input Data x Register +#define TDES_ODATAxR (80) // Output Data x Register +#define TDES_IVxR (96) // Initialization Vector x Register +#define TDES_VR (252) // TDES Version Register +#define TDES_RPR (256) // Receive Pointer Register +#define TDES_RCR (260) // Receive Counter Register +#define TDES_TPR (264) // Transmit Pointer Register +#define TDES_TCR (268) // Transmit Counter Register +#define TDES_RNPR (272) // Receive Next Pointer Register +#define TDES_RNCR (276) // Receive Next Counter Register +#define TDES_TNPR (280) // Transmit Next Pointer Register +#define TDES_TNCR (284) // Transmit Next Counter Register +#define TDES_PTCR (288) // PDC Transfer Control Register +#define TDES_PTSR (292) // PDC Transfer Status Register +// -------- TDES_CR : (TDES Offset: 0x0) Control Register -------- +#define AT91C_TDES_START (0x1 << 0) // (TDES) Starts Processing +#define AT91C_TDES_SWRST (0x1 << 8) // (TDES) Software Reset +// -------- TDES_MR : (TDES Offset: 0x4) Mode Register -------- +#define AT91C_TDES_CIPHER (0x1 << 0) // (TDES) Processing Mode +#define AT91C_TDES_TDESMOD (0x1 << 1) // (TDES) Single or Triple DES Mode +#define AT91C_TDES_KEYMOD (0x1 << 4) // (TDES) Key Mode +#define AT91C_TDES_SMOD (0x3 << 8) // (TDES) Start Mode +#define AT91C_TDES_SMOD_MANUAL (0x0 << 8) // (TDES) Manual Mode: The START bit in register TDES_CR must be set to begin encryption or decryption. +#define AT91C_TDES_SMOD_AUTO (0x1 << 8) // (TDES) Auto Mode: no action in TDES_CR is necessary (cf datasheet). +#define AT91C_TDES_SMOD_PDC (0x2 << 8) // (TDES) PDC Mode (cf datasheet). +#define AT91C_TDES_OPMOD (0x3 << 12) // (TDES) Operation Mode +#define AT91C_TDES_OPMOD_ECB (0x0 << 12) // (TDES) ECB Electronic CodeBook mode. +#define AT91C_TDES_OPMOD_CBC (0x1 << 12) // (TDES) CBC Cipher Block Chaining mode. +#define AT91C_TDES_OPMOD_OFB (0x2 << 12) // (TDES) OFB Output Feedback mode. +#define AT91C_TDES_OPMOD_CFB (0x3 << 12) // (TDES) CFB Cipher Feedback mode. +#define AT91C_TDES_LOD (0x1 << 15) // (TDES) Last Output Data Mode +#define AT91C_TDES_CFBS (0x3 << 16) // (TDES) Cipher Feedback Data Size +#define AT91C_TDES_CFBS_64_BIT (0x0 << 16) // (TDES) 64-bit. +#define AT91C_TDES_CFBS_32_BIT (0x1 << 16) // (TDES) 32-bit. +#define AT91C_TDES_CFBS_16_BIT (0x2 << 16) // (TDES) 16-bit. +#define AT91C_TDES_CFBS_8_BIT (0x3 << 16) // (TDES) 8-bit. +// -------- TDES_IER : (TDES Offset: 0x10) Interrupt Enable Register -------- +#define AT91C_TDES_DATRDY (0x1 << 0) // (TDES) DATRDY +#define AT91C_TDES_ENDRX (0x1 << 1) // (TDES) PDC Read Buffer End +#define AT91C_TDES_ENDTX (0x1 << 2) // (TDES) PDC Write Buffer End +#define AT91C_TDES_RXBUFF (0x1 << 3) // (TDES) PDC Read Buffer Full +#define AT91C_TDES_TXBUFE (0x1 << 4) // (TDES) PDC Write Buffer Empty +#define AT91C_TDES_URAD (0x1 << 8) // (TDES) Unspecified Register Access Detection +// -------- TDES_IDR : (TDES Offset: 0x14) Interrupt Disable Register -------- +// -------- TDES_IMR : (TDES Offset: 0x18) Interrupt Mask Register -------- +// -------- TDES_ISR : (TDES Offset: 0x1c) Interrupt Status Register -------- +#define AT91C_TDES_URAT (0x3 << 12) // (TDES) Unspecified Register Access Type Status +#define AT91C_TDES_URAT_IN_DAT_WRITE_DATPROC (0x0 << 12) // (TDES) Input data register written during the data processing in PDC mode. +#define AT91C_TDES_URAT_OUT_DAT_READ_DATPROC (0x1 << 12) // (TDES) Output data register read during the data processing. +#define AT91C_TDES_URAT_MODEREG_WRITE_DATPROC (0x2 << 12) // (TDES) Mode register written during the data processing. +#define AT91C_TDES_URAT_WO_REG_READ (0x3 << 12) // (TDES) Write-only register read access. + +// ***************************************************************************** +// REGISTER ADDRESS DEFINITION FOR AT91SAM7X128 +// ***************************************************************************** +// ========== Register definition for SYS peripheral ========== +// ========== Register definition for AIC peripheral ========== +#define AT91C_AIC_IVR (0xFFFFF100) // (AIC) IRQ Vector Register +#define AT91C_AIC_SMR (0xFFFFF000) // (AIC) Source Mode Register +#define AT91C_AIC_FVR (0xFFFFF104) // (AIC) FIQ Vector Register +#define AT91C_AIC_DCR (0xFFFFF138) // (AIC) Debug Control Register (Protect) +#define AT91C_AIC_EOICR (0xFFFFF130) // (AIC) End of Interrupt Command Register +#define AT91C_AIC_SVR (0xFFFFF080) // (AIC) Source Vector Register +#define AT91C_AIC_FFSR (0xFFFFF148) // (AIC) Fast Forcing Status Register +#define AT91C_AIC_ICCR (0xFFFFF128) // (AIC) Interrupt Clear Command Register +#define AT91C_AIC_ISR (0xFFFFF108) // (AIC) Interrupt Status Register +#define AT91C_AIC_IMR (0xFFFFF110) // (AIC) Interrupt Mask Register +#define AT91C_AIC_IPR (0xFFFFF10C) // (AIC) Interrupt Pending Register +#define AT91C_AIC_FFER (0xFFFFF140) // (AIC) Fast Forcing Enable Register +#define AT91C_AIC_IECR (0xFFFFF120) // (AIC) Interrupt Enable Command Register +#define AT91C_AIC_ISCR (0xFFFFF12C) // (AIC) Interrupt Set Command Register +#define AT91C_AIC_FFDR (0xFFFFF144) // (AIC) Fast Forcing Disable Register +#define AT91C_AIC_CISR (0xFFFFF114) // (AIC) Core Interrupt Status Register +#define AT91C_AIC_IDCR (0xFFFFF124) // (AIC) Interrupt Disable Command Register +#define AT91C_AIC_SPU (0xFFFFF134) // (AIC) Spurious Vector Register +// ========== Register definition for PDC_DBGU peripheral ========== +#define AT91C_DBGU_TCR (0xFFFFF30C) // (PDC_DBGU) Transmit Counter Register +#define AT91C_DBGU_RNPR (0xFFFFF310) // (PDC_DBGU) Receive Next Pointer Register +#define AT91C_DBGU_TNPR (0xFFFFF318) // (PDC_DBGU) Transmit Next Pointer Register +#define AT91C_DBGU_TPR (0xFFFFF308) // (PDC_DBGU) Transmit Pointer Register +#define AT91C_DBGU_RPR (0xFFFFF300) // (PDC_DBGU) Receive Pointer Register +#define AT91C_DBGU_RCR (0xFFFFF304) // (PDC_DBGU) Receive Counter Register +#define AT91C_DBGU_RNCR (0xFFFFF314) // (PDC_DBGU) Receive Next Counter Register +#define AT91C_DBGU_PTCR (0xFFFFF320) // (PDC_DBGU) PDC Transfer Control Register +#define AT91C_DBGU_PTSR (0xFFFFF324) // (PDC_DBGU) PDC Transfer Status Register +#define AT91C_DBGU_TNCR (0xFFFFF31C) // (PDC_DBGU) Transmit Next Counter Register +// ========== Register definition for DBGU peripheral ========== +#define AT91C_DBGU_EXID (0xFFFFF244) // (DBGU) Chip ID Extension Register +#define AT91C_DBGU_BRGR (0xFFFFF220) // (DBGU) Baud Rate Generator Register +#define AT91C_DBGU_IDR (0xFFFFF20C) // (DBGU) Interrupt Disable Register +#define AT91C_DBGU_CSR (0xFFFFF214) // (DBGU) Channel Status Register +#define AT91C_DBGU_CIDR (0xFFFFF240) // (DBGU) Chip ID Register +#define AT91C_DBGU_MR (0xFFFFF204) // (DBGU) Mode Register +#define AT91C_DBGU_IMR (0xFFFFF210) // (DBGU) Interrupt Mask Register +#define AT91C_DBGU_CR (0xFFFFF200) // (DBGU) Control Register +#define AT91C_DBGU_FNTR (0xFFFFF248) // (DBGU) Force NTRST Register +#define AT91C_DBGU_THR (0xFFFFF21C) // (DBGU) Transmitter Holding Register +#define AT91C_DBGU_RHR (0xFFFFF218) // (DBGU) Receiver Holding Register +#define AT91C_DBGU_IER (0xFFFFF208) // (DBGU) Interrupt Enable Register +// ========== Register definition for PIOA peripheral ========== +#define AT91C_PIOA_ODR (0xFFFFF414) // (PIOA) Output Disable Registerr +#define AT91C_PIOA_SODR (0xFFFFF430) // (PIOA) Set Output Data Register +#define AT91C_PIOA_ISR (0xFFFFF44C) // (PIOA) Interrupt Status Register +#define AT91C_PIOA_ABSR (0xFFFFF478) // (PIOA) AB Select Status Register +#define AT91C_PIOA_IER (0xFFFFF440) // (PIOA) Interrupt Enable Register +#define AT91C_PIOA_PPUDR (0xFFFFF460) // (PIOA) Pull-up Disable Register +#define AT91C_PIOA_IMR (0xFFFFF448) // (PIOA) Interrupt Mask Register +#define AT91C_PIOA_PER (0xFFFFF400) // (PIOA) PIO Enable Register +#define AT91C_PIOA_IFDR (0xFFFFF424) // (PIOA) Input Filter Disable Register +#define AT91C_PIOA_OWDR (0xFFFFF4A4) // (PIOA) Output Write Disable Register +#define AT91C_PIOA_MDSR (0xFFFFF458) // (PIOA) Multi-driver Status Register +#define AT91C_PIOA_IDR (0xFFFFF444) // (PIOA) Interrupt Disable Register +#define AT91C_PIOA_ODSR (0xFFFFF438) // (PIOA) Output Data Status Register +#define AT91C_PIOA_PPUSR (0xFFFFF468) // (PIOA) Pull-up Status Register +#define AT91C_PIOA_OWSR (0xFFFFF4A8) // (PIOA) Output Write Status Register +#define AT91C_PIOA_BSR (0xFFFFF474) // (PIOA) Select B Register +#define AT91C_PIOA_OWER (0xFFFFF4A0) // (PIOA) Output Write Enable Register +#define AT91C_PIOA_IFER (0xFFFFF420) // (PIOA) Input Filter Enable Register +#define AT91C_PIOA_PDSR (0xFFFFF43C) // (PIOA) Pin Data Status Register +#define AT91C_PIOA_PPUER (0xFFFFF464) // (PIOA) Pull-up Enable Register +#define AT91C_PIOA_OSR (0xFFFFF418) // (PIOA) Output Status Register +#define AT91C_PIOA_ASR (0xFFFFF470) // (PIOA) Select A Register +#define AT91C_PIOA_MDDR (0xFFFFF454) // (PIOA) Multi-driver Disable Register +#define AT91C_PIOA_CODR (0xFFFFF434) // (PIOA) Clear Output Data Register +#define AT91C_PIOA_MDER (0xFFFFF450) // (PIOA) Multi-driver Enable Register +#define AT91C_PIOA_PDR (0xFFFFF404) // (PIOA) PIO Disable Register +#define AT91C_PIOA_IFSR (0xFFFFF428) // (PIOA) Input Filter Status Register +#define AT91C_PIOA_OER (0xFFFFF410) // (PIOA) Output Enable Register +#define AT91C_PIOA_PSR (0xFFFFF408) // (PIOA) PIO Status Register +// ========== Register definition for PIOB peripheral ========== +#define AT91C_PIOB_OWDR (0xFFFFF6A4) // (PIOB) Output Write Disable Register +#define AT91C_PIOB_MDER (0xFFFFF650) // (PIOB) Multi-driver Enable Register +#define AT91C_PIOB_PPUSR (0xFFFFF668) // (PIOB) Pull-up Status Register +#define AT91C_PIOB_IMR (0xFFFFF648) // (PIOB) Interrupt Mask Register +#define AT91C_PIOB_ASR (0xFFFFF670) // (PIOB) Select A Register +#define AT91C_PIOB_PPUDR (0xFFFFF660) // (PIOB) Pull-up Disable Register +#define AT91C_PIOB_PSR (0xFFFFF608) // (PIOB) PIO Status Register +#define AT91C_PIOB_IER (0xFFFFF640) // (PIOB) Interrupt Enable Register +#define AT91C_PIOB_CODR (0xFFFFF634) // (PIOB) Clear Output Data Register +#define AT91C_PIOB_OWER (0xFFFFF6A0) // (PIOB) Output Write Enable Register +#define AT91C_PIOB_ABSR (0xFFFFF678) // (PIOB) AB Select Status Register +#define AT91C_PIOB_IFDR (0xFFFFF624) // (PIOB) Input Filter Disable Register +#define AT91C_PIOB_PDSR (0xFFFFF63C) // (PIOB) Pin Data Status Register +#define AT91C_PIOB_IDR (0xFFFFF644) // (PIOB) Interrupt Disable Register +#define AT91C_PIOB_OWSR (0xFFFFF6A8) // (PIOB) Output Write Status Register +#define AT91C_PIOB_PDR (0xFFFFF604) // (PIOB) PIO Disable Register +#define AT91C_PIOB_ODR (0xFFFFF614) // (PIOB) Output Disable Registerr +#define AT91C_PIOB_IFSR (0xFFFFF628) // (PIOB) Input Filter Status Register +#define AT91C_PIOB_PPUER (0xFFFFF664) // (PIOB) Pull-up Enable Register +#define AT91C_PIOB_SODR (0xFFFFF630) // (PIOB) Set Output Data Register +#define AT91C_PIOB_ISR (0xFFFFF64C) // (PIOB) Interrupt Status Register +#define AT91C_PIOB_ODSR (0xFFFFF638) // (PIOB) Output Data Status Register +#define AT91C_PIOB_OSR (0xFFFFF618) // (PIOB) Output Status Register +#define AT91C_PIOB_MDSR (0xFFFFF658) // (PIOB) Multi-driver Status Register +#define AT91C_PIOB_IFER (0xFFFFF620) // (PIOB) Input Filter Enable Register +#define AT91C_PIOB_BSR (0xFFFFF674) // (PIOB) Select B Register +#define AT91C_PIOB_MDDR (0xFFFFF654) // (PIOB) Multi-driver Disable Register +#define AT91C_PIOB_OER (0xFFFFF610) // (PIOB) Output Enable Register +#define AT91C_PIOB_PER (0xFFFFF600) // (PIOB) PIO Enable Register +// ========== Register definition for CKGR peripheral ========== +#define AT91C_CKGR_MOR (0xFFFFFC20) // (CKGR) Main Oscillator Register +#define AT91C_CKGR_PLLR (0xFFFFFC2C) // (CKGR) PLL Register +#define AT91C_CKGR_MCFR (0xFFFFFC24) // (CKGR) Main Clock Frequency Register +// ========== Register definition for PMC peripheral ========== +#define AT91C_PMC_IDR (0xFFFFFC64) // (PMC) Interrupt Disable Register +#define AT91C_PMC_MOR (0xFFFFFC20) // (PMC) Main Oscillator Register +#define AT91C_PMC_PLLR (0xFFFFFC2C) // (PMC) PLL Register +#define AT91C_PMC_PCER (0xFFFFFC10) // (PMC) Peripheral Clock Enable Register +#define AT91C_PMC_PCKR (0xFFFFFC40) // (PMC) Programmable Clock Register +#define AT91C_PMC_MCKR (0xFFFFFC30) // (PMC) Master Clock Register +#define AT91C_PMC_SCDR (0xFFFFFC04) // (PMC) System Clock Disable Register +#define AT91C_PMC_PCDR (0xFFFFFC14) // (PMC) Peripheral Clock Disable Register +#define AT91C_PMC_SCSR (0xFFFFFC08) // (PMC) System Clock Status Register +#define AT91C_PMC_PCSR (0xFFFFFC18) // (PMC) Peripheral Clock Status Register +#define AT91C_PMC_MCFR (0xFFFFFC24) // (PMC) Main Clock Frequency Register +#define AT91C_PMC_SCER (0xFFFFFC00) // (PMC) System Clock Enable Register +#define AT91C_PMC_IMR (0xFFFFFC6C) // (PMC) Interrupt Mask Register +#define AT91C_PMC_IER (0xFFFFFC60) // (PMC) Interrupt Enable Register +#define AT91C_PMC_SR (0xFFFFFC68) // (PMC) Status Register +// ========== Register definition for RSTC peripheral ========== +#define AT91C_RSTC_RCR (0xFFFFFD00) // (RSTC) Reset Control Register +#define AT91C_RSTC_RMR (0xFFFFFD08) // (RSTC) Reset Mode Register +#define AT91C_RSTC_RSR (0xFFFFFD04) // (RSTC) Reset Status Register +// ========== Register definition for RTTC peripheral ========== +#define AT91C_RTTC_RTSR (0xFFFFFD2C) // (RTTC) Real-time Status Register +#define AT91C_RTTC_RTMR (0xFFFFFD20) // (RTTC) Real-time Mode Register +#define AT91C_RTTC_RTVR (0xFFFFFD28) // (RTTC) Real-time Value Register +#define AT91C_RTTC_RTAR (0xFFFFFD24) // (RTTC) Real-time Alarm Register +// ========== Register definition for PITC peripheral ========== +#define AT91C_PITC_PIVR (0xFFFFFD38) // (PITC) Period Interval Value Register +#define AT91C_PITC_PISR (0xFFFFFD34) // (PITC) Period Interval Status Register +#define AT91C_PITC_PIIR (0xFFFFFD3C) // (PITC) Period Interval Image Register +#define AT91C_PITC_PIMR (0xFFFFFD30) // (PITC) Period Interval Mode Register +// ========== Register definition for WDTC peripheral ========== +#define AT91C_WDTC_WDCR (0xFFFFFD40) // (WDTC) Watchdog Control Register +#define AT91C_WDTC_WDSR (0xFFFFFD48) // (WDTC) Watchdog Status Register +#define AT91C_WDTC_WDMR (0xFFFFFD44) // (WDTC) Watchdog Mode Register +// ========== Register definition for VREG peripheral ========== +#define AT91C_VREG_MR (0xFFFFFD60) // (VREG) Voltage Regulator Mode Register +// ========== Register definition for MC peripheral ========== +#define AT91C_MC_ASR (0xFFFFFF04) // (MC) MC Abort Status Register +#define AT91C_MC_RCR (0xFFFFFF00) // (MC) MC Remap Control Register +#define AT91C_MC_FCR (0xFFFFFF64) // (MC) MC Flash Command Register +#define AT91C_MC_AASR (0xFFFFFF08) // (MC) MC Abort Address Status Register +#define AT91C_MC_FSR (0xFFFFFF68) // (MC) MC Flash Status Register +#define AT91C_MC_FMR (0xFFFFFF60) // (MC) MC Flash Mode Register +// ========== Register definition for PDC_SPI1 peripheral ========== +#define AT91C_SPI1_PTCR (0xFFFE4120) // (PDC_SPI1) PDC Transfer Control Register +#define AT91C_SPI1_RPR (0xFFFE4100) // (PDC_SPI1) Receive Pointer Register +#define AT91C_SPI1_TNCR (0xFFFE411C) // (PDC_SPI1) Transmit Next Counter Register +#define AT91C_SPI1_TPR (0xFFFE4108) // (PDC_SPI1) Transmit Pointer Register +#define AT91C_SPI1_TNPR (0xFFFE4118) // (PDC_SPI1) Transmit Next Pointer Register +#define AT91C_SPI1_TCR (0xFFFE410C) // (PDC_SPI1) Transmit Counter Register +#define AT91C_SPI1_RCR (0xFFFE4104) // (PDC_SPI1) Receive Counter Register +#define AT91C_SPI1_RNPR (0xFFFE4110) // (PDC_SPI1) Receive Next Pointer Register +#define AT91C_SPI1_RNCR (0xFFFE4114) // (PDC_SPI1) Receive Next Counter Register +#define AT91C_SPI1_PTSR (0xFFFE4124) // (PDC_SPI1) PDC Transfer Status Register +// ========== Register definition for SPI1 peripheral ========== +#define AT91C_SPI1_IMR (0xFFFE401C) // (SPI1) Interrupt Mask Register +#define AT91C_SPI1_IER (0xFFFE4014) // (SPI1) Interrupt Enable Register +#define AT91C_SPI1_MR (0xFFFE4004) // (SPI1) Mode Register +#define AT91C_SPI1_RDR (0xFFFE4008) // (SPI1) Receive Data Register +#define AT91C_SPI1_IDR (0xFFFE4018) // (SPI1) Interrupt Disable Register +#define AT91C_SPI1_SR (0xFFFE4010) // (SPI1) Status Register +#define AT91C_SPI1_TDR (0xFFFE400C) // (SPI1) Transmit Data Register +#define AT91C_SPI1_CR (0xFFFE4000) // (SPI1) Control Register +#define AT91C_SPI1_CSR (0xFFFE4030) // (SPI1) Chip Select Register +// ========== Register definition for PDC_SPI0 peripheral ========== +#define AT91C_SPI0_PTCR (0xFFFE0120) // (PDC_SPI0) PDC Transfer Control Register +#define AT91C_SPI0_TPR (0xFFFE0108) // (PDC_SPI0) Transmit Pointer Register +#define AT91C_SPI0_TCR (0xFFFE010C) // (PDC_SPI0) Transmit Counter Register +#define AT91C_SPI0_RCR (0xFFFE0104) // (PDC_SPI0) Receive Counter Register +#define AT91C_SPI0_PTSR (0xFFFE0124) // (PDC_SPI0) PDC Transfer Status Register +#define AT91C_SPI0_RNPR (0xFFFE0110) // (PDC_SPI0) Receive Next Pointer Register +#define AT91C_SPI0_RPR (0xFFFE0100) // (PDC_SPI0) Receive Pointer Register +#define AT91C_SPI0_TNCR (0xFFFE011C) // (PDC_SPI0) Transmit Next Counter Register +#define AT91C_SPI0_RNCR (0xFFFE0114) // (PDC_SPI0) Receive Next Counter Register +#define AT91C_SPI0_TNPR (0xFFFE0118) // (PDC_SPI0) Transmit Next Pointer Register +// ========== Register definition for SPI0 peripheral ========== +#define AT91C_SPI0_IER (0xFFFE0014) // (SPI0) Interrupt Enable Register +#define AT91C_SPI0_SR (0xFFFE0010) // (SPI0) Status Register +#define AT91C_SPI0_IDR (0xFFFE0018) // (SPI0) Interrupt Disable Register +#define AT91C_SPI0_CR (0xFFFE0000) // (SPI0) Control Register +#define AT91C_SPI0_MR (0xFFFE0004) // (SPI0) Mode Register +#define AT91C_SPI0_IMR (0xFFFE001C) // (SPI0) Interrupt Mask Register +#define AT91C_SPI0_TDR (0xFFFE000C) // (SPI0) Transmit Data Register +#define AT91C_SPI0_RDR (0xFFFE0008) // (SPI0) Receive Data Register +#define AT91C_SPI0_CSR (0xFFFE0030) // (SPI0) Chip Select Register +// ========== Register definition for PDC_US1 peripheral ========== +#define AT91C_US1_RNCR (0xFFFC4114) // (PDC_US1) Receive Next Counter Register +#define AT91C_US1_PTCR (0xFFFC4120) // (PDC_US1) PDC Transfer Control Register +#define AT91C_US1_TCR (0xFFFC410C) // (PDC_US1) Transmit Counter Register +#define AT91C_US1_PTSR (0xFFFC4124) // (PDC_US1) PDC Transfer Status Register +#define AT91C_US1_TNPR (0xFFFC4118) // (PDC_US1) Transmit Next Pointer Register +#define AT91C_US1_RCR (0xFFFC4104) // (PDC_US1) Receive Counter Register +#define AT91C_US1_RNPR (0xFFFC4110) // (PDC_US1) Receive Next Pointer Register +#define AT91C_US1_RPR (0xFFFC4100) // (PDC_US1) Receive Pointer Register +#define AT91C_US1_TNCR (0xFFFC411C) // (PDC_US1) Transmit Next Counter Register +#define AT91C_US1_TPR (0xFFFC4108) // (PDC_US1) Transmit Pointer Register +// ========== Register definition for US1 peripheral ========== +#define AT91C_US1_IF (0xFFFC404C) // (US1) IRDA_FILTER Register +#define AT91C_US1_NER (0xFFFC4044) // (US1) Nb Errors Register +#define AT91C_US1_RTOR (0xFFFC4024) // (US1) Receiver Time-out Register +#define AT91C_US1_CSR (0xFFFC4014) // (US1) Channel Status Register +#define AT91C_US1_IDR (0xFFFC400C) // (US1) Interrupt Disable Register +#define AT91C_US1_IER (0xFFFC4008) // (US1) Interrupt Enable Register +#define AT91C_US1_THR (0xFFFC401C) // (US1) Transmitter Holding Register +#define AT91C_US1_TTGR (0xFFFC4028) // (US1) Transmitter Time-guard Register +#define AT91C_US1_RHR (0xFFFC4018) // (US1) Receiver Holding Register +#define AT91C_US1_BRGR (0xFFFC4020) // (US1) Baud Rate Generator Register +#define AT91C_US1_IMR (0xFFFC4010) // (US1) Interrupt Mask Register +#define AT91C_US1_FIDI (0xFFFC4040) // (US1) FI_DI_Ratio Register +#define AT91C_US1_CR (0xFFFC4000) // (US1) Control Register +#define AT91C_US1_MR (0xFFFC4004) // (US1) Mode Register +// ========== Register definition for PDC_US0 peripheral ========== +#define AT91C_US0_TNPR (0xFFFC0118) // (PDC_US0) Transmit Next Pointer Register +#define AT91C_US0_RNPR (0xFFFC0110) // (PDC_US0) Receive Next Pointer Register +#define AT91C_US0_TCR (0xFFFC010C) // (PDC_US0) Transmit Counter Register +#define AT91C_US0_PTCR (0xFFFC0120) // (PDC_US0) PDC Transfer Control Register +#define AT91C_US0_PTSR (0xFFFC0124) // (PDC_US0) PDC Transfer Status Register +#define AT91C_US0_TNCR (0xFFFC011C) // (PDC_US0) Transmit Next Counter Register +#define AT91C_US0_TPR (0xFFFC0108) // (PDC_US0) Transmit Pointer Register +#define AT91C_US0_RCR (0xFFFC0104) // (PDC_US0) Receive Counter Register +#define AT91C_US0_RPR (0xFFFC0100) // (PDC_US0) Receive Pointer Register +#define AT91C_US0_RNCR (0xFFFC0114) // (PDC_US0) Receive Next Counter Register +// ========== Register definition for US0 peripheral ========== +#define AT91C_US0_BRGR (0xFFFC0020) // (US0) Baud Rate Generator Register +#define AT91C_US0_NER (0xFFFC0044) // (US0) Nb Errors Register +#define AT91C_US0_CR (0xFFFC0000) // (US0) Control Register +#define AT91C_US0_IMR (0xFFFC0010) // (US0) Interrupt Mask Register +#define AT91C_US0_FIDI (0xFFFC0040) // (US0) FI_DI_Ratio Register +#define AT91C_US0_TTGR (0xFFFC0028) // (US0) Transmitter Time-guard Register +#define AT91C_US0_MR (0xFFFC0004) // (US0) Mode Register +#define AT91C_US0_RTOR (0xFFFC0024) // (US0) Receiver Time-out Register +#define AT91C_US0_CSR (0xFFFC0014) // (US0) Channel Status Register +#define AT91C_US0_RHR (0xFFFC0018) // (US0) Receiver Holding Register +#define AT91C_US0_IDR (0xFFFC000C) // (US0) Interrupt Disable Register +#define AT91C_US0_THR (0xFFFC001C) // (US0) Transmitter Holding Register +#define AT91C_US0_IF (0xFFFC004C) // (US0) IRDA_FILTER Register +#define AT91C_US0_IER (0xFFFC0008) // (US0) Interrupt Enable Register +// ========== Register definition for PDC_SSC peripheral ========== +#define AT91C_SSC_TNCR (0xFFFD411C) // (PDC_SSC) Transmit Next Counter Register +#define AT91C_SSC_RPR (0xFFFD4100) // (PDC_SSC) Receive Pointer Register +#define AT91C_SSC_RNCR (0xFFFD4114) // (PDC_SSC) Receive Next Counter Register +#define AT91C_SSC_TPR (0xFFFD4108) // (PDC_SSC) Transmit Pointer Register +#define AT91C_SSC_PTCR (0xFFFD4120) // (PDC_SSC) PDC Transfer Control Register +#define AT91C_SSC_TCR (0xFFFD410C) // (PDC_SSC) Transmit Counter Register +#define AT91C_SSC_RCR (0xFFFD4104) // (PDC_SSC) Receive Counter Register +#define AT91C_SSC_RNPR (0xFFFD4110) // (PDC_SSC) Receive Next Pointer Register +#define AT91C_SSC_TNPR (0xFFFD4118) // (PDC_SSC) Transmit Next Pointer Register +#define AT91C_SSC_PTSR (0xFFFD4124) // (PDC_SSC) PDC Transfer Status Register +// ========== Register definition for SSC peripheral ========== +#define AT91C_SSC_RHR (0xFFFD4020) // (SSC) Receive Holding Register +#define AT91C_SSC_RSHR (0xFFFD4030) // (SSC) Receive Sync Holding Register +#define AT91C_SSC_TFMR (0xFFFD401C) // (SSC) Transmit Frame Mode Register +#define AT91C_SSC_IDR (0xFFFD4048) // (SSC) Interrupt Disable Register +#define AT91C_SSC_THR (0xFFFD4024) // (SSC) Transmit Holding Register +#define AT91C_SSC_RCMR (0xFFFD4010) // (SSC) Receive Clock ModeRegister +#define AT91C_SSC_IER (0xFFFD4044) // (SSC) Interrupt Enable Register +#define AT91C_SSC_TSHR (0xFFFD4034) // (SSC) Transmit Sync Holding Register +#define AT91C_SSC_SR (0xFFFD4040) // (SSC) Status Register +#define AT91C_SSC_CMR (0xFFFD4004) // (SSC) Clock Mode Register +#define AT91C_SSC_TCMR (0xFFFD4018) // (SSC) Transmit Clock Mode Register +#define AT91C_SSC_CR (0xFFFD4000) // (SSC) Control Register +#define AT91C_SSC_IMR (0xFFFD404C) // (SSC) Interrupt Mask Register +#define AT91C_SSC_RFMR (0xFFFD4014) // (SSC) Receive Frame Mode Register +// ========== Register definition for TWI peripheral ========== +#define AT91C_TWI_IER (0xFFFB8024) // (TWI) Interrupt Enable Register +#define AT91C_TWI_CR (0xFFFB8000) // (TWI) Control Register +#define AT91C_TWI_SR (0xFFFB8020) // (TWI) Status Register +#define AT91C_TWI_IMR (0xFFFB802C) // (TWI) Interrupt Mask Register +#define AT91C_TWI_THR (0xFFFB8034) // (TWI) Transmit Holding Register +#define AT91C_TWI_IDR (0xFFFB8028) // (TWI) Interrupt Disable Register +#define AT91C_TWI_IADR (0xFFFB800C) // (TWI) Internal Address Register +#define AT91C_TWI_MMR (0xFFFB8004) // (TWI) Master Mode Register +#define AT91C_TWI_CWGR (0xFFFB8010) // (TWI) Clock Waveform Generator Register +#define AT91C_TWI_RHR (0xFFFB8030) // (TWI) Receive Holding Register +// ========== Register definition for PWMC_CH3 peripheral ========== +#define AT91C_PWMC_CH3_CUPDR (0xFFFCC270) // (PWMC_CH3) Channel Update Register +#define AT91C_PWMC_CH3_Reserved (0xFFFCC274) // (PWMC_CH3) Reserved +#define AT91C_PWMC_CH3_CPRDR (0xFFFCC268) // (PWMC_CH3) Channel Period Register +#define AT91C_PWMC_CH3_CDTYR (0xFFFCC264) // (PWMC_CH3) Channel Duty Cycle Register +#define AT91C_PWMC_CH3_CCNTR (0xFFFCC26C) // (PWMC_CH3) Channel Counter Register +#define AT91C_PWMC_CH3_CMR (0xFFFCC260) // (PWMC_CH3) Channel Mode Register +// ========== Register definition for PWMC_CH2 peripheral ========== +#define AT91C_PWMC_CH2_Reserved (0xFFFCC254) // (PWMC_CH2) Reserved +#define AT91C_PWMC_CH2_CMR (0xFFFCC240) // (PWMC_CH2) Channel Mode Register +#define AT91C_PWMC_CH2_CCNTR (0xFFFCC24C) // (PWMC_CH2) Channel Counter Register +#define AT91C_PWMC_CH2_CPRDR (0xFFFCC248) // (PWMC_CH2) Channel Period Register +#define AT91C_PWMC_CH2_CUPDR (0xFFFCC250) // (PWMC_CH2) Channel Update Register +#define AT91C_PWMC_CH2_CDTYR (0xFFFCC244) // (PWMC_CH2) Channel Duty Cycle Register +// ========== Register definition for PWMC_CH1 peripheral ========== +#define AT91C_PWMC_CH1_Reserved (0xFFFCC234) // (PWMC_CH1) Reserved +#define AT91C_PWMC_CH1_CUPDR (0xFFFCC230) // (PWMC_CH1) Channel Update Register +#define AT91C_PWMC_CH1_CPRDR (0xFFFCC228) // (PWMC_CH1) Channel Period Register +#define AT91C_PWMC_CH1_CCNTR (0xFFFCC22C) // (PWMC_CH1) Channel Counter Register +#define AT91C_PWMC_CH1_CDTYR (0xFFFCC224) // (PWMC_CH1) Channel Duty Cycle Register +#define AT91C_PWMC_CH1_CMR (0xFFFCC220) // (PWMC_CH1) Channel Mode Register +// ========== Register definition for PWMC_CH0 peripheral ========== +#define AT91C_PWMC_CH0_Reserved (0xFFFCC214) // (PWMC_CH0) Reserved +#define AT91C_PWMC_CH0_CPRDR (0xFFFCC208) // (PWMC_CH0) Channel Period Register +#define AT91C_PWMC_CH0_CDTYR (0xFFFCC204) // (PWMC_CH0) Channel Duty Cycle Register +#define AT91C_PWMC_CH0_CMR (0xFFFCC200) // (PWMC_CH0) Channel Mode Register +#define AT91C_PWMC_CH0_CUPDR (0xFFFCC210) // (PWMC_CH0) Channel Update Register +#define AT91C_PWMC_CH0_CCNTR (0xFFFCC20C) // (PWMC_CH0) Channel Counter Register +// ========== Register definition for PWMC peripheral ========== +#define AT91C_PWMC_IDR (0xFFFCC014) // (PWMC) PWMC Interrupt Disable Register +#define AT91C_PWMC_DIS (0xFFFCC008) // (PWMC) PWMC Disable Register +#define AT91C_PWMC_IER (0xFFFCC010) // (PWMC) PWMC Interrupt Enable Register +#define AT91C_PWMC_VR (0xFFFCC0FC) // (PWMC) PWMC Version Register +#define AT91C_PWMC_ISR (0xFFFCC01C) // (PWMC) PWMC Interrupt Status Register +#define AT91C_PWMC_SR (0xFFFCC00C) // (PWMC) PWMC Status Register +#define AT91C_PWMC_IMR (0xFFFCC018) // (PWMC) PWMC Interrupt Mask Register +#define AT91C_PWMC_MR (0xFFFCC000) // (PWMC) PWMC Mode Register +#define AT91C_PWMC_ENA (0xFFFCC004) // (PWMC) PWMC Enable Register +// ========== Register definition for UDP peripheral ========== +#define AT91C_UDP_IMR (0xFFFB0018) // (UDP) Interrupt Mask Register +#define AT91C_UDP_FADDR (0xFFFB0008) // (UDP) Function Address Register +#define AT91C_UDP_NUM (0xFFFB0000) // (UDP) Frame Number Register +#define AT91C_UDP_FDR (0xFFFB0050) // (UDP) Endpoint FIFO Data Register +#define AT91C_UDP_ISR (0xFFFB001C) // (UDP) Interrupt Status Register +#define AT91C_UDP_CSR (0xFFFB0030) // (UDP) Endpoint Control and Status Register +#define AT91C_UDP_IDR (0xFFFB0014) // (UDP) Interrupt Disable Register +#define AT91C_UDP_ICR (0xFFFB0020) // (UDP) Interrupt Clear Register +#define AT91C_UDP_RSTEP (0xFFFB0028) // (UDP) Reset Endpoint Register +#define AT91C_UDP_TXVC (0xFFFB0074) // (UDP) Transceiver Control Register +#define AT91C_UDP_GLBSTATE (0xFFFB0004) // (UDP) Global State Register +#define AT91C_UDP_IER (0xFFFB0010) // (UDP) Interrupt Enable Register +// ========== Register definition for TC0 peripheral ========== +#define AT91C_TC0_SR (0xFFFA0020) // (TC0) Status Register +#define AT91C_TC0_RC (0xFFFA001C) // (TC0) Register C +#define AT91C_TC0_RB (0xFFFA0018) // (TC0) Register B +#define AT91C_TC0_CCR (0xFFFA0000) // (TC0) Channel Control Register +#define AT91C_TC0_CMR (0xFFFA0004) // (TC0) Channel Mode Register (Capture Mode / Waveform Mode) +#define AT91C_TC0_IER (0xFFFA0024) // (TC0) Interrupt Enable Register +#define AT91C_TC0_RA (0xFFFA0014) // (TC0) Register A +#define AT91C_TC0_IDR (0xFFFA0028) // (TC0) Interrupt Disable Register +#define AT91C_TC0_CV (0xFFFA0010) // (TC0) Counter Value +#define AT91C_TC0_IMR (0xFFFA002C) // (TC0) Interrupt Mask Register +// ========== Register definition for TC1 peripheral ========== +#define AT91C_TC1_RB (0xFFFA0058) // (TC1) Register B +#define AT91C_TC1_CCR (0xFFFA0040) // (TC1) Channel Control Register +#define AT91C_TC1_IER (0xFFFA0064) // (TC1) Interrupt Enable Register +#define AT91C_TC1_IDR (0xFFFA0068) // (TC1) Interrupt Disable Register +#define AT91C_TC1_SR (0xFFFA0060) // (TC1) Status Register +#define AT91C_TC1_CMR (0xFFFA0044) // (TC1) Channel Mode Register (Capture Mode / Waveform Mode) +#define AT91C_TC1_RA (0xFFFA0054) // (TC1) Register A +#define AT91C_TC1_RC (0xFFFA005C) // (TC1) Register C +#define AT91C_TC1_IMR (0xFFFA006C) // (TC1) Interrupt Mask Register +#define AT91C_TC1_CV (0xFFFA0050) // (TC1) Counter Value +// ========== Register definition for TC2 peripheral ========== +#define AT91C_TC2_CMR (0xFFFA0084) // (TC2) Channel Mode Register (Capture Mode / Waveform Mode) +#define AT91C_TC2_CCR (0xFFFA0080) // (TC2) Channel Control Register +#define AT91C_TC2_CV (0xFFFA0090) // (TC2) Counter Value +#define AT91C_TC2_RA (0xFFFA0094) // (TC2) Register A +#define AT91C_TC2_RB (0xFFFA0098) // (TC2) Register B +#define AT91C_TC2_IDR (0xFFFA00A8) // (TC2) Interrupt Disable Register +#define AT91C_TC2_IMR (0xFFFA00AC) // (TC2) Interrupt Mask Register +#define AT91C_TC2_RC (0xFFFA009C) // (TC2) Register C +#define AT91C_TC2_IER (0xFFFA00A4) // (TC2) Interrupt Enable Register +#define AT91C_TC2_SR (0xFFFA00A0) // (TC2) Status Register +// ========== Register definition for TCB peripheral ========== +#define AT91C_TCB_BMR (0xFFFA00C4) // (TCB) TC Block Mode Register +#define AT91C_TCB_BCR (0xFFFA00C0) // (TCB) TC Block Control Register +// ========== Register definition for CAN_MB0 peripheral ========== +#define AT91C_CAN_MB0_MDL (0xFFFD0214) // (CAN_MB0) MailBox Data Low Register +#define AT91C_CAN_MB0_MAM (0xFFFD0204) // (CAN_MB0) MailBox Acceptance Mask Register +#define AT91C_CAN_MB0_MCR (0xFFFD021C) // (CAN_MB0) MailBox Control Register +#define AT91C_CAN_MB0_MID (0xFFFD0208) // (CAN_MB0) MailBox ID Register +#define AT91C_CAN_MB0_MSR (0xFFFD0210) // (CAN_MB0) MailBox Status Register +#define AT91C_CAN_MB0_MFID (0xFFFD020C) // (CAN_MB0) MailBox Family ID Register +#define AT91C_CAN_MB0_MDH (0xFFFD0218) // (CAN_MB0) MailBox Data High Register +#define AT91C_CAN_MB0_MMR (0xFFFD0200) // (CAN_MB0) MailBox Mode Register +// ========== Register definition for CAN_MB1 peripheral ========== +#define AT91C_CAN_MB1_MDL (0xFFFD0234) // (CAN_MB1) MailBox Data Low Register +#define AT91C_CAN_MB1_MID (0xFFFD0228) // (CAN_MB1) MailBox ID Register +#define AT91C_CAN_MB1_MMR (0xFFFD0220) // (CAN_MB1) MailBox Mode Register +#define AT91C_CAN_MB1_MSR (0xFFFD0230) // (CAN_MB1) MailBox Status Register +#define AT91C_CAN_MB1_MAM (0xFFFD0224) // (CAN_MB1) MailBox Acceptance Mask Register +#define AT91C_CAN_MB1_MDH (0xFFFD0238) // (CAN_MB1) MailBox Data High Register +#define AT91C_CAN_MB1_MCR (0xFFFD023C) // (CAN_MB1) MailBox Control Register +#define AT91C_CAN_MB1_MFID (0xFFFD022C) // (CAN_MB1) MailBox Family ID Register +// ========== Register definition for CAN_MB2 peripheral ========== +#define AT91C_CAN_MB2_MCR (0xFFFD025C) // (CAN_MB2) MailBox Control Register +#define AT91C_CAN_MB2_MDH (0xFFFD0258) // (CAN_MB2) MailBox Data High Register +#define AT91C_CAN_MB2_MID (0xFFFD0248) // (CAN_MB2) MailBox ID Register +#define AT91C_CAN_MB2_MDL (0xFFFD0254) // (CAN_MB2) MailBox Data Low Register +#define AT91C_CAN_MB2_MMR (0xFFFD0240) // (CAN_MB2) MailBox Mode Register +#define AT91C_CAN_MB2_MAM (0xFFFD0244) // (CAN_MB2) MailBox Acceptance Mask Register +#define AT91C_CAN_MB2_MFID (0xFFFD024C) // (CAN_MB2) MailBox Family ID Register +#define AT91C_CAN_MB2_MSR (0xFFFD0250) // (CAN_MB2) MailBox Status Register +// ========== Register definition for CAN_MB3 peripheral ========== +#define AT91C_CAN_MB3_MFID (0xFFFD026C) // (CAN_MB3) MailBox Family ID Register +#define AT91C_CAN_MB3_MAM (0xFFFD0264) // (CAN_MB3) MailBox Acceptance Mask Register +#define AT91C_CAN_MB3_MID (0xFFFD0268) // (CAN_MB3) MailBox ID Register +#define AT91C_CAN_MB3_MCR (0xFFFD027C) // (CAN_MB3) MailBox Control Register +#define AT91C_CAN_MB3_MMR (0xFFFD0260) // (CAN_MB3) MailBox Mode Register +#define AT91C_CAN_MB3_MSR (0xFFFD0270) // (CAN_MB3) MailBox Status Register +#define AT91C_CAN_MB3_MDL (0xFFFD0274) // (CAN_MB3) MailBox Data Low Register +#define AT91C_CAN_MB3_MDH (0xFFFD0278) // (CAN_MB3) MailBox Data High Register +// ========== Register definition for CAN_MB4 peripheral ========== +#define AT91C_CAN_MB4_MID (0xFFFD0288) // (CAN_MB4) MailBox ID Register +#define AT91C_CAN_MB4_MMR (0xFFFD0280) // (CAN_MB4) MailBox Mode Register +#define AT91C_CAN_MB4_MDH (0xFFFD0298) // (CAN_MB4) MailBox Data High Register +#define AT91C_CAN_MB4_MFID (0xFFFD028C) // (CAN_MB4) MailBox Family ID Register +#define AT91C_CAN_MB4_MSR (0xFFFD0290) // (CAN_MB4) MailBox Status Register +#define AT91C_CAN_MB4_MCR (0xFFFD029C) // (CAN_MB4) MailBox Control Register +#define AT91C_CAN_MB4_MDL (0xFFFD0294) // (CAN_MB4) MailBox Data Low Register +#define AT91C_CAN_MB4_MAM (0xFFFD0284) // (CAN_MB4) MailBox Acceptance Mask Register +// ========== Register definition for CAN_MB5 peripheral ========== +#define AT91C_CAN_MB5_MSR (0xFFFD02B0) // (CAN_MB5) MailBox Status Register +#define AT91C_CAN_MB5_MCR (0xFFFD02BC) // (CAN_MB5) MailBox Control Register +#define AT91C_CAN_MB5_MFID (0xFFFD02AC) // (CAN_MB5) MailBox Family ID Register +#define AT91C_CAN_MB5_MDH (0xFFFD02B8) // (CAN_MB5) MailBox Data High Register +#define AT91C_CAN_MB5_MID (0xFFFD02A8) // (CAN_MB5) MailBox ID Register +#define AT91C_CAN_MB5_MMR (0xFFFD02A0) // (CAN_MB5) MailBox Mode Register +#define AT91C_CAN_MB5_MDL (0xFFFD02B4) // (CAN_MB5) MailBox Data Low Register +#define AT91C_CAN_MB5_MAM (0xFFFD02A4) // (CAN_MB5) MailBox Acceptance Mask Register +// ========== Register definition for CAN_MB6 peripheral ========== +#define AT91C_CAN_MB6_MFID (0xFFFD02CC) // (CAN_MB6) MailBox Family ID Register +#define AT91C_CAN_MB6_MID (0xFFFD02C8) // (CAN_MB6) MailBox ID Register +#define AT91C_CAN_MB6_MAM (0xFFFD02C4) // (CAN_MB6) MailBox Acceptance Mask Register +#define AT91C_CAN_MB6_MSR (0xFFFD02D0) // (CAN_MB6) MailBox Status Register +#define AT91C_CAN_MB6_MDL (0xFFFD02D4) // (CAN_MB6) MailBox Data Low Register +#define AT91C_CAN_MB6_MCR (0xFFFD02DC) // (CAN_MB6) MailBox Control Register +#define AT91C_CAN_MB6_MDH (0xFFFD02D8) // (CAN_MB6) MailBox Data High Register +#define AT91C_CAN_MB6_MMR (0xFFFD02C0) // (CAN_MB6) MailBox Mode Register +// ========== Register definition for CAN_MB7 peripheral ========== +#define AT91C_CAN_MB7_MCR (0xFFFD02FC) // (CAN_MB7) MailBox Control Register +#define AT91C_CAN_MB7_MDH (0xFFFD02F8) // (CAN_MB7) MailBox Data High Register +#define AT91C_CAN_MB7_MFID (0xFFFD02EC) // (CAN_MB7) MailBox Family ID Register +#define AT91C_CAN_MB7_MDL (0xFFFD02F4) // (CAN_MB7) MailBox Data Low Register +#define AT91C_CAN_MB7_MID (0xFFFD02E8) // (CAN_MB7) MailBox ID Register +#define AT91C_CAN_MB7_MMR (0xFFFD02E0) // (CAN_MB7) MailBox Mode Register +#define AT91C_CAN_MB7_MAM (0xFFFD02E4) // (CAN_MB7) MailBox Acceptance Mask Register +#define AT91C_CAN_MB7_MSR (0xFFFD02F0) // (CAN_MB7) MailBox Status Register +// ========== Register definition for CAN peripheral ========== +#define AT91C_CAN_TCR (0xFFFD0024) // (CAN) Transfer Command Register +#define AT91C_CAN_IMR (0xFFFD000C) // (CAN) Interrupt Mask Register +#define AT91C_CAN_IER (0xFFFD0004) // (CAN) Interrupt Enable Register +#define AT91C_CAN_ECR (0xFFFD0020) // (CAN) Error Counter Register +#define AT91C_CAN_TIMESTP (0xFFFD001C) // (CAN) Time Stamp Register +#define AT91C_CAN_MR (0xFFFD0000) // (CAN) Mode Register +#define AT91C_CAN_IDR (0xFFFD0008) // (CAN) Interrupt Disable Register +#define AT91C_CAN_ACR (0xFFFD0028) // (CAN) Abort Command Register +#define AT91C_CAN_TIM (0xFFFD0018) // (CAN) Timer Register +#define AT91C_CAN_SR (0xFFFD0010) // (CAN) Status Register +#define AT91C_CAN_BR (0xFFFD0014) // (CAN) Baudrate Register +#define AT91C_CAN_VR (0xFFFD00FC) // (CAN) Version Register +// ========== Register definition for EMAC peripheral ========== +#define AT91C_EMAC_ISR (0xFFFDC024) // (EMAC) Interrupt Status Register +#define AT91C_EMAC_SA4H (0xFFFDC0B4) // (EMAC) Specific Address 4 Top, Last 2 bytes +#define AT91C_EMAC_SA1L (0xFFFDC098) // (EMAC) Specific Address 1 Bottom, First 4 bytes +#define AT91C_EMAC_ELE (0xFFFDC078) // (EMAC) Excessive Length Errors Register +#define AT91C_EMAC_LCOL (0xFFFDC05C) // (EMAC) Late Collision Register +#define AT91C_EMAC_RLE (0xFFFDC088) // (EMAC) Receive Length Field Mismatch Register +#define AT91C_EMAC_WOL (0xFFFDC0C4) // (EMAC) Wake On LAN Register +#define AT91C_EMAC_DTF (0xFFFDC058) // (EMAC) Deferred Transmission Frame Register +#define AT91C_EMAC_TUND (0xFFFDC064) // (EMAC) Transmit Underrun Error Register +#define AT91C_EMAC_NCR (0xFFFDC000) // (EMAC) Network Control Register +#define AT91C_EMAC_SA4L (0xFFFDC0B0) // (EMAC) Specific Address 4 Bottom, First 4 bytes +#define AT91C_EMAC_RSR (0xFFFDC020) // (EMAC) Receive Status Register +#define AT91C_EMAC_SA3L (0xFFFDC0A8) // (EMAC) Specific Address 3 Bottom, First 4 bytes +#define AT91C_EMAC_TSR (0xFFFDC014) // (EMAC) Transmit Status Register +#define AT91C_EMAC_IDR (0xFFFDC02C) // (EMAC) Interrupt Disable Register +#define AT91C_EMAC_RSE (0xFFFDC074) // (EMAC) Receive Symbol Errors Register +#define AT91C_EMAC_ECOL (0xFFFDC060) // (EMAC) Excessive Collision Register +#define AT91C_EMAC_TID (0xFFFDC0B8) // (EMAC) Type ID Checking Register +#define AT91C_EMAC_HRB (0xFFFDC090) // (EMAC) Hash Address Bottom[31:0] +#define AT91C_EMAC_TBQP (0xFFFDC01C) // (EMAC) Transmit Buffer Queue Pointer +#define AT91C_EMAC_USRIO (0xFFFDC0C0) // (EMAC) USER Input/Output Register +#define AT91C_EMAC_PTR (0xFFFDC038) // (EMAC) Pause Time Register +#define AT91C_EMAC_SA2H (0xFFFDC0A4) // (EMAC) Specific Address 2 Top, Last 2 bytes +#define AT91C_EMAC_ROV (0xFFFDC070) // (EMAC) Receive Overrun Errors Register +#define AT91C_EMAC_ALE (0xFFFDC054) // (EMAC) Alignment Error Register +#define AT91C_EMAC_RJA (0xFFFDC07C) // (EMAC) Receive Jabbers Register +#define AT91C_EMAC_RBQP (0xFFFDC018) // (EMAC) Receive Buffer Queue Pointer +#define AT91C_EMAC_TPF (0xFFFDC08C) // (EMAC) Transmitted Pause Frames Register +#define AT91C_EMAC_NCFGR (0xFFFDC004) // (EMAC) Network Configuration Register +#define AT91C_EMAC_HRT (0xFFFDC094) // (EMAC) Hash Address Top[63:32] +#define AT91C_EMAC_USF (0xFFFDC080) // (EMAC) Undersize Frames Register +#define AT91C_EMAC_FCSE (0xFFFDC050) // (EMAC) Frame Check Sequence Error Register +#define AT91C_EMAC_TPQ (0xFFFDC0BC) // (EMAC) Transmit Pause Quantum Register +#define AT91C_EMAC_MAN (0xFFFDC034) // (EMAC) PHY Maintenance Register +#define AT91C_EMAC_FTO (0xFFFDC040) // (EMAC) Frames Transmitted OK Register +#define AT91C_EMAC_REV (0xFFFDC0FC) // (EMAC) Revision Register +#define AT91C_EMAC_IMR (0xFFFDC030) // (EMAC) Interrupt Mask Register +#define AT91C_EMAC_SCF (0xFFFDC044) // (EMAC) Single Collision Frame Register +#define AT91C_EMAC_PFR (0xFFFDC03C) // (EMAC) Pause Frames received Register +#define AT91C_EMAC_MCF (0xFFFDC048) // (EMAC) Multiple Collision Frame Register +#define AT91C_EMAC_NSR (0xFFFDC008) // (EMAC) Network Status Register +#define AT91C_EMAC_SA2L (0xFFFDC0A0) // (EMAC) Specific Address 2 Bottom, First 4 bytes +#define AT91C_EMAC_FRO (0xFFFDC04C) // (EMAC) Frames Received OK Register +#define AT91C_EMAC_IER (0xFFFDC028) // (EMAC) Interrupt Enable Register +#define AT91C_EMAC_SA1H (0xFFFDC09C) // (EMAC) Specific Address 1 Top, Last 2 bytes +#define AT91C_EMAC_CSE (0xFFFDC068) // (EMAC) Carrier Sense Error Register +#define AT91C_EMAC_SA3H (0xFFFDC0AC) // (EMAC) Specific Address 3 Top, Last 2 bytes +#define AT91C_EMAC_RRE (0xFFFDC06C) // (EMAC) Receive Ressource Error Register +#define AT91C_EMAC_STE (0xFFFDC084) // (EMAC) SQE Test Error Register +// ========== Register definition for PDC_ADC peripheral ========== +#define AT91C_ADC_PTSR (0xFFFD8124) // (PDC_ADC) PDC Transfer Status Register +#define AT91C_ADC_PTCR (0xFFFD8120) // (PDC_ADC) PDC Transfer Control Register +#define AT91C_ADC_TNPR (0xFFFD8118) // (PDC_ADC) Transmit Next Pointer Register +#define AT91C_ADC_TNCR (0xFFFD811C) // (PDC_ADC) Transmit Next Counter Register +#define AT91C_ADC_RNPR (0xFFFD8110) // (PDC_ADC) Receive Next Pointer Register +#define AT91C_ADC_RNCR (0xFFFD8114) // (PDC_ADC) Receive Next Counter Register +#define AT91C_ADC_RPR (0xFFFD8100) // (PDC_ADC) Receive Pointer Register +#define AT91C_ADC_TCR (0xFFFD810C) // (PDC_ADC) Transmit Counter Register +#define AT91C_ADC_TPR (0xFFFD8108) // (PDC_ADC) Transmit Pointer Register +#define AT91C_ADC_RCR (0xFFFD8104) // (PDC_ADC) Receive Counter Register +// ========== Register definition for ADC peripheral ========== +#define AT91C_ADC_CDR2 (0xFFFD8038) // (ADC) ADC Channel Data Register 2 +#define AT91C_ADC_CDR3 (0xFFFD803C) // (ADC) ADC Channel Data Register 3 +#define AT91C_ADC_CDR0 (0xFFFD8030) // (ADC) ADC Channel Data Register 0 +#define AT91C_ADC_CDR5 (0xFFFD8044) // (ADC) ADC Channel Data Register 5 +#define AT91C_ADC_CHDR (0xFFFD8014) // (ADC) ADC Channel Disable Register +#define AT91C_ADC_SR (0xFFFD801C) // (ADC) ADC Status Register +#define AT91C_ADC_CDR4 (0xFFFD8040) // (ADC) ADC Channel Data Register 4 +#define AT91C_ADC_CDR1 (0xFFFD8034) // (ADC) ADC Channel Data Register 1 +#define AT91C_ADC_LCDR (0xFFFD8020) // (ADC) ADC Last Converted Data Register +#define AT91C_ADC_IDR (0xFFFD8028) // (ADC) ADC Interrupt Disable Register +#define AT91C_ADC_CR (0xFFFD8000) // (ADC) ADC Control Register +#define AT91C_ADC_CDR7 (0xFFFD804C) // (ADC) ADC Channel Data Register 7 +#define AT91C_ADC_CDR6 (0xFFFD8048) // (ADC) ADC Channel Data Register 6 +#define AT91C_ADC_IER (0xFFFD8024) // (ADC) ADC Interrupt Enable Register +#define AT91C_ADC_CHER (0xFFFD8010) // (ADC) ADC Channel Enable Register +#define AT91C_ADC_CHSR (0xFFFD8018) // (ADC) ADC Channel Status Register +#define AT91C_ADC_MR (0xFFFD8004) // (ADC) ADC Mode Register +#define AT91C_ADC_IMR (0xFFFD802C) // (ADC) ADC Interrupt Mask Register +// ========== Register definition for PDC_AES peripheral ========== +#define AT91C_AES_TPR (0xFFFA4108) // (PDC_AES) Transmit Pointer Register +#define AT91C_AES_PTCR (0xFFFA4120) // (PDC_AES) PDC Transfer Control Register +#define AT91C_AES_RNPR (0xFFFA4110) // (PDC_AES) Receive Next Pointer Register +#define AT91C_AES_TNCR (0xFFFA411C) // (PDC_AES) Transmit Next Counter Register +#define AT91C_AES_TCR (0xFFFA410C) // (PDC_AES) Transmit Counter Register +#define AT91C_AES_RCR (0xFFFA4104) // (PDC_AES) Receive Counter Register +#define AT91C_AES_RNCR (0xFFFA4114) // (PDC_AES) Receive Next Counter Register +#define AT91C_AES_TNPR (0xFFFA4118) // (PDC_AES) Transmit Next Pointer Register +#define AT91C_AES_RPR (0xFFFA4100) // (PDC_AES) Receive Pointer Register +#define AT91C_AES_PTSR (0xFFFA4124) // (PDC_AES) PDC Transfer Status Register +// ========== Register definition for AES peripheral ========== +#define AT91C_AES_IVxR (0xFFFA4060) // (AES) Initialization Vector x Register +#define AT91C_AES_MR (0xFFFA4004) // (AES) Mode Register +#define AT91C_AES_VR (0xFFFA40FC) // (AES) AES Version Register +#define AT91C_AES_ODATAxR (0xFFFA4050) // (AES) Output Data x Register +#define AT91C_AES_IDATAxR (0xFFFA4040) // (AES) Input Data x Register +#define AT91C_AES_CR (0xFFFA4000) // (AES) Control Register +#define AT91C_AES_IDR (0xFFFA4014) // (AES) Interrupt Disable Register +#define AT91C_AES_IMR (0xFFFA4018) // (AES) Interrupt Mask Register +#define AT91C_AES_IER (0xFFFA4010) // (AES) Interrupt Enable Register +#define AT91C_AES_KEYWxR (0xFFFA4020) // (AES) Key Word x Register +#define AT91C_AES_ISR (0xFFFA401C) // (AES) Interrupt Status Register +// ========== Register definition for PDC_TDES peripheral ========== +#define AT91C_TDES_RNCR (0xFFFA8114) // (PDC_TDES) Receive Next Counter Register +#define AT91C_TDES_TCR (0xFFFA810C) // (PDC_TDES) Transmit Counter Register +#define AT91C_TDES_RCR (0xFFFA8104) // (PDC_TDES) Receive Counter Register +#define AT91C_TDES_TNPR (0xFFFA8118) // (PDC_TDES) Transmit Next Pointer Register +#define AT91C_TDES_RNPR (0xFFFA8110) // (PDC_TDES) Receive Next Pointer Register +#define AT91C_TDES_RPR (0xFFFA8100) // (PDC_TDES) Receive Pointer Register +#define AT91C_TDES_TNCR (0xFFFA811C) // (PDC_TDES) Transmit Next Counter Register +#define AT91C_TDES_TPR (0xFFFA8108) // (PDC_TDES) Transmit Pointer Register +#define AT91C_TDES_PTSR (0xFFFA8124) // (PDC_TDES) PDC Transfer Status Register +#define AT91C_TDES_PTCR (0xFFFA8120) // (PDC_TDES) PDC Transfer Control Register +// ========== Register definition for TDES peripheral ========== +#define AT91C_TDES_KEY2WxR (0xFFFA8028) // (TDES) Key 2 Word x Register +#define AT91C_TDES_KEY3WxR (0xFFFA8030) // (TDES) Key 3 Word x Register +#define AT91C_TDES_IDR (0xFFFA8014) // (TDES) Interrupt Disable Register +#define AT91C_TDES_VR (0xFFFA80FC) // (TDES) TDES Version Register +#define AT91C_TDES_IVxR (0xFFFA8060) // (TDES) Initialization Vector x Register +#define AT91C_TDES_ODATAxR (0xFFFA8050) // (TDES) Output Data x Register +#define AT91C_TDES_IMR (0xFFFA8018) // (TDES) Interrupt Mask Register +#define AT91C_TDES_MR (0xFFFA8004) // (TDES) Mode Register +#define AT91C_TDES_CR (0xFFFA8000) // (TDES) Control Register +#define AT91C_TDES_IER (0xFFFA8010) // (TDES) Interrupt Enable Register +#define AT91C_TDES_ISR (0xFFFA801C) // (TDES) Interrupt Status Register +#define AT91C_TDES_IDATAxR (0xFFFA8040) // (TDES) Input Data x Register +#define AT91C_TDES_KEY1WxR (0xFFFA8020) // (TDES) Key 1 Word x Register + +// ***************************************************************************** +// PIO DEFINITIONS FOR AT91SAM7X128 +// ***************************************************************************** +#define AT91C_PIO_PA0 (1 << 0) // Pin Controlled by PA0 +#define AT91C_PA0_RXD0 (AT91C_PIO_PA0) // USART 0 Receive Data +#define AT91C_PIO_PA1 (1 << 1) // Pin Controlled by PA1 +#define AT91C_PA1_TXD0 (AT91C_PIO_PA1) // USART 0 Transmit Data +#define AT91C_PIO_PA10 (1 << 10) // Pin Controlled by PA10 +#define AT91C_PA10_TWD (AT91C_PIO_PA10) // TWI Two-wire Serial Data +#define AT91C_PIO_PA11 (1 << 11) // Pin Controlled by PA11 +#define AT91C_PA11_TWCK (AT91C_PIO_PA11) // TWI Two-wire Serial Clock +#define AT91C_PIO_PA12 (1 << 12) // Pin Controlled by PA12 +#define AT91C_PA12_NPCS00 (AT91C_PIO_PA12) // SPI 0 Peripheral Chip Select 0 +#define AT91C_PIO_PA13 (1 << 13) // Pin Controlled by PA13 +#define AT91C_PA13_NPCS01 (AT91C_PIO_PA13) // SPI 0 Peripheral Chip Select 1 +#define AT91C_PA13_PCK1 (AT91C_PIO_PA13) // PMC Programmable Clock Output 1 +#define AT91C_PIO_PA14 (1 << 14) // Pin Controlled by PA14 +#define AT91C_PA14_NPCS02 (AT91C_PIO_PA14) // SPI 0 Peripheral Chip Select 2 +#define AT91C_PA14_IRQ1 (AT91C_PIO_PA14) // External Interrupt 1 +#define AT91C_PIO_PA15 (1 << 15) // Pin Controlled by PA15 +#define AT91C_PA15_NPCS03 (AT91C_PIO_PA15) // SPI 0 Peripheral Chip Select 3 +#define AT91C_PA15_TCLK2 (AT91C_PIO_PA15) // Timer Counter 2 external clock input +#define AT91C_PIO_PA16 (1 << 16) // Pin Controlled by PA16 +#define AT91C_PA16_MISO0 (AT91C_PIO_PA16) // SPI 0 Master In Slave +#define AT91C_PIO_PA17 (1 << 17) // Pin Controlled by PA17 +#define AT91C_PA17_MOSI0 (AT91C_PIO_PA17) // SPI 0 Master Out Slave +#define AT91C_PIO_PA18 (1 << 18) // Pin Controlled by PA18 +#define AT91C_PA18_SPCK0 (AT91C_PIO_PA18) // SPI 0 Serial Clock +#define AT91C_PIO_PA19 (1 << 19) // Pin Controlled by PA19 +#define AT91C_PA19_CANRX (AT91C_PIO_PA19) // CAN Receive +#define AT91C_PIO_PA2 (1 << 2) // Pin Controlled by PA2 +#define AT91C_PA2_SCK0 (AT91C_PIO_PA2) // USART 0 Serial Clock +#define AT91C_PA2_NPCS11 (AT91C_PIO_PA2) // SPI 1 Peripheral Chip Select 1 +#define AT91C_PIO_PA20 (1 << 20) // Pin Controlled by PA20 +#define AT91C_PA20_CANTX (AT91C_PIO_PA20) // CAN Transmit +#define AT91C_PIO_PA21 (1 << 21) // Pin Controlled by PA21 +#define AT91C_PA21_TF (AT91C_PIO_PA21) // SSC Transmit Frame Sync +#define AT91C_PA21_NPCS10 (AT91C_PIO_PA21) // SPI 1 Peripheral Chip Select 0 +#define AT91C_PIO_PA22 (1 << 22) // Pin Controlled by PA22 +#define AT91C_PA22_TK (AT91C_PIO_PA22) // SSC Transmit Clock +#define AT91C_PA22_SPCK1 (AT91C_PIO_PA22) // SPI 1 Serial Clock +#define AT91C_PIO_PA23 (1 << 23) // Pin Controlled by PA23 +#define AT91C_PA23_TD (AT91C_PIO_PA23) // SSC Transmit data +#define AT91C_PA23_MOSI1 (AT91C_PIO_PA23) // SPI 1 Master Out Slave +#define AT91C_PIO_PA24 (1 << 24) // Pin Controlled by PA24 +#define AT91C_PA24_RD (AT91C_PIO_PA24) // SSC Receive Data +#define AT91C_PA24_MISO1 (AT91C_PIO_PA24) // SPI 1 Master In Slave +#define AT91C_PIO_PA25 (1 << 25) // Pin Controlled by PA25 +#define AT91C_PA25_RK (AT91C_PIO_PA25) // SSC Receive Clock +#define AT91C_PA25_NPCS11 (AT91C_PIO_PA25) // SPI 1 Peripheral Chip Select 1 +#define AT91C_PIO_PA26 (1 << 26) // Pin Controlled by PA26 +#define AT91C_PA26_RF (AT91C_PIO_PA26) // SSC Receive Frame Sync +#define AT91C_PA26_NPCS12 (AT91C_PIO_PA26) // SPI 1 Peripheral Chip Select 2 +#define AT91C_PIO_PA27 (1 << 27) // Pin Controlled by PA27 +#define AT91C_PA27_DRXD (AT91C_PIO_PA27) // DBGU Debug Receive Data +#define AT91C_PA27_PCK3 (AT91C_PIO_PA27) // PMC Programmable Clock Output 3 +#define AT91C_PIO_PA28 (1 << 28) // Pin Controlled by PA28 +#define AT91C_PA28_DTXD (AT91C_PIO_PA28) // DBGU Debug Transmit Data +#define AT91C_PIO_PA29 (1 << 29) // Pin Controlled by PA29 +#define AT91C_PA29_FIQ (AT91C_PIO_PA29) // AIC Fast Interrupt Input +#define AT91C_PA29_NPCS13 (AT91C_PIO_PA29) // SPI 1 Peripheral Chip Select 3 +#define AT91C_PIO_PA3 (1 << 3) // Pin Controlled by PA3 +#define AT91C_PA3_RTS0 (AT91C_PIO_PA3) // USART 0 Ready To Send +#define AT91C_PA3_NPCS12 (AT91C_PIO_PA3) // SPI 1 Peripheral Chip Select 2 +#define AT91C_PIO_PA30 (1 << 30) // Pin Controlled by PA30 +#define AT91C_PA30_IRQ0 (AT91C_PIO_PA30) // External Interrupt 0 +#define AT91C_PA30_PCK2 (AT91C_PIO_PA30) // PMC Programmable Clock Output 2 +#define AT91C_PIO_PA4 (1 << 4) // Pin Controlled by PA4 +#define AT91C_PA4_CTS0 (AT91C_PIO_PA4) // USART 0 Clear To Send +#define AT91C_PA4_NPCS13 (AT91C_PIO_PA4) // SPI 1 Peripheral Chip Select 3 +#define AT91C_PIO_PA5 (1 << 5) // Pin Controlled by PA5 +#define AT91C_PA5_RXD1 (AT91C_PIO_PA5) // USART 1 Receive Data +#define AT91C_PIO_PA6 (1 << 6) // Pin Controlled by PA6 +#define AT91C_PA6_TXD1 (AT91C_PIO_PA6) // USART 1 Transmit Data +#define AT91C_PIO_PA7 (1 << 7) // Pin Controlled by PA7 +#define AT91C_PA7_SCK1 (AT91C_PIO_PA7) // USART 1 Serial Clock +#define AT91C_PA7_NPCS01 (AT91C_PIO_PA7) // SPI 0 Peripheral Chip Select 1 +#define AT91C_PIO_PA8 (1 << 8) // Pin Controlled by PA8 +#define AT91C_PA8_RTS1 (AT91C_PIO_PA8) // USART 1 Ready To Send +#define AT91C_PA8_NPCS02 (AT91C_PIO_PA8) // SPI 0 Peripheral Chip Select 2 +#define AT91C_PIO_PA9 (1 << 9) // Pin Controlled by PA9 +#define AT91C_PA9_CTS1 (AT91C_PIO_PA9) // USART 1 Clear To Send +#define AT91C_PA9_NPCS03 (AT91C_PIO_PA9) // SPI 0 Peripheral Chip Select 3 +#define AT91C_PIO_PB0 (1 << 0) // Pin Controlled by PB0 +#define AT91C_PB0_ETXCK_EREFCK (AT91C_PIO_PB0) // Ethernet MAC Transmit Clock/Reference Clock +#define AT91C_PB0_PCK0 (AT91C_PIO_PB0) // PMC Programmable Clock Output 0 +#define AT91C_PIO_PB1 (1 << 1) // Pin Controlled by PB1 +#define AT91C_PB1_ETXEN (AT91C_PIO_PB1) // Ethernet MAC Transmit Enable +#define AT91C_PIO_PB10 (1 << 10) // Pin Controlled by PB10 +#define AT91C_PB10_ETX2 (AT91C_PIO_PB10) // Ethernet MAC Transmit Data 2 +#define AT91C_PB10_NPCS11 (AT91C_PIO_PB10) // SPI 1 Peripheral Chip Select 1 +#define AT91C_PIO_PB11 (1 << 11) // Pin Controlled by PB11 +#define AT91C_PB11_ETX3 (AT91C_PIO_PB11) // Ethernet MAC Transmit Data 3 +#define AT91C_PB11_NPCS12 (AT91C_PIO_PB11) // SPI 1 Peripheral Chip Select 2 +#define AT91C_PIO_PB12 (1 << 12) // Pin Controlled by PB12 +#define AT91C_PB12_ETXER (AT91C_PIO_PB12) // Ethernet MAC Transmikt Coding Error +#define AT91C_PB12_TCLK0 (AT91C_PIO_PB12) // Timer Counter 0 external clock input +#define AT91C_PIO_PB13 (1 << 13) // Pin Controlled by PB13 +#define AT91C_PB13_ERX2 (AT91C_PIO_PB13) // Ethernet MAC Receive Data 2 +#define AT91C_PB13_NPCS01 (AT91C_PIO_PB13) // SPI 0 Peripheral Chip Select 1 +#define AT91C_PIO_PB14 (1 << 14) // Pin Controlled by PB14 +#define AT91C_PB14_ERX3 (AT91C_PIO_PB14) // Ethernet MAC Receive Data 3 +#define AT91C_PB14_NPCS02 (AT91C_PIO_PB14) // SPI 0 Peripheral Chip Select 2 +#define AT91C_PIO_PB15 (1 << 15) // Pin Controlled by PB15 +#define AT91C_PB15_ERXDV (AT91C_PIO_PB15) // Ethernet MAC Receive Data Valid +#define AT91C_PIO_PB16 (1 << 16) // Pin Controlled by PB16 +#define AT91C_PB16_ECOL (AT91C_PIO_PB16) // Ethernet MAC Collision Detected +#define AT91C_PB16_NPCS13 (AT91C_PIO_PB16) // SPI 1 Peripheral Chip Select 3 +#define AT91C_PIO_PB17 (1 << 17) // Pin Controlled by PB17 +#define AT91C_PB17_ERXCK (AT91C_PIO_PB17) // Ethernet MAC Receive Clock +#define AT91C_PB17_NPCS03 (AT91C_PIO_PB17) // SPI 0 Peripheral Chip Select 3 +#define AT91C_PIO_PB18 (1 << 18) // Pin Controlled by PB18 +#define AT91C_PB18_EF100 (AT91C_PIO_PB18) // Ethernet MAC Force 100 Mbits/sec +#define AT91C_PB18_ADTRG (AT91C_PIO_PB18) // ADC External Trigger +#define AT91C_PIO_PB19 (1 << 19) // Pin Controlled by PB19 +#define AT91C_PB19_PWM0 (AT91C_PIO_PB19) // PWM Channel 0 +#define AT91C_PB19_TCLK1 (AT91C_PIO_PB19) // Timer Counter 1 external clock input +#define AT91C_PIO_PB2 (1 << 2) // Pin Controlled by PB2 +#define AT91C_PB2_ETX0 (AT91C_PIO_PB2) // Ethernet MAC Transmit Data 0 +#define AT91C_PIO_PB20 (1 << 20) // Pin Controlled by PB20 +#define AT91C_PB20_PWM1 (AT91C_PIO_PB20) // PWM Channel 1 +#define AT91C_PB20_PCK0 (AT91C_PIO_PB20) // PMC Programmable Clock Output 0 +#define AT91C_PIO_PB21 (1 << 21) // Pin Controlled by PB21 +#define AT91C_PB21_PWM2 (AT91C_PIO_PB21) // PWM Channel 2 +#define AT91C_PB21_PCK1 (AT91C_PIO_PB21) // PMC Programmable Clock Output 1 +#define AT91C_PIO_PB22 (1 << 22) // Pin Controlled by PB22 +#define AT91C_PB22_PWM3 (AT91C_PIO_PB22) // PWM Channel 3 +#define AT91C_PB22_PCK2 (AT91C_PIO_PB22) // PMC Programmable Clock Output 2 +#define AT91C_PIO_PB23 (1 << 23) // Pin Controlled by PB23 +#define AT91C_PB23_TIOA0 (AT91C_PIO_PB23) // Timer Counter 0 Multipurpose Timer I/O Pin A +#define AT91C_PB23_DCD1 (AT91C_PIO_PB23) // USART 1 Data Carrier Detect +#define AT91C_PIO_PB24 (1 << 24) // Pin Controlled by PB24 +#define AT91C_PB24_TIOB0 (AT91C_PIO_PB24) // Timer Counter 0 Multipurpose Timer I/O Pin B +#define AT91C_PB24_DSR1 (AT91C_PIO_PB24) // USART 1 Data Set ready +#define AT91C_PIO_PB25 (1 << 25) // Pin Controlled by PB25 +#define AT91C_PB25_TIOA1 (AT91C_PIO_PB25) // Timer Counter 1 Multipurpose Timer I/O Pin A +#define AT91C_PB25_DTR1 (AT91C_PIO_PB25) // USART 1 Data Terminal ready +#define AT91C_PIO_PB26 (1 << 26) // Pin Controlled by PB26 +#define AT91C_PB26_TIOB1 (AT91C_PIO_PB26) // Timer Counter 1 Multipurpose Timer I/O Pin B +#define AT91C_PB26_RI1 (AT91C_PIO_PB26) // USART 1 Ring Indicator +#define AT91C_PIO_PB27 (1 << 27) // Pin Controlled by PB27 +#define AT91C_PB27_TIOA2 (AT91C_PIO_PB27) // Timer Counter 2 Multipurpose Timer I/O Pin A +#define AT91C_PB27_PWM0 (AT91C_PIO_PB27) // PWM Channel 0 +#define AT91C_PIO_PB28 (1 << 28) // Pin Controlled by PB28 +#define AT91C_PB28_TIOB2 (AT91C_PIO_PB28) // Timer Counter 2 Multipurpose Timer I/O Pin B +#define AT91C_PB28_PWM1 (AT91C_PIO_PB28) // PWM Channel 1 +#define AT91C_PIO_PB29 (1 << 29) // Pin Controlled by PB29 +#define AT91C_PB29_PCK1 (AT91C_PIO_PB29) // PMC Programmable Clock Output 1 +#define AT91C_PB29_PWM2 (AT91C_PIO_PB29) // PWM Channel 2 +#define AT91C_PIO_PB3 (1 << 3) // Pin Controlled by PB3 +#define AT91C_PB3_ETX1 (AT91C_PIO_PB3) // Ethernet MAC Transmit Data 1 +#define AT91C_PIO_PB30 (1 << 30) // Pin Controlled by PB30 +#define AT91C_PB30_PCK2 (AT91C_PIO_PB30) // PMC Programmable Clock Output 2 +#define AT91C_PB30_PWM3 (AT91C_PIO_PB30) // PWM Channel 3 +#define AT91C_PIO_PB4 (1 << 4) // Pin Controlled by PB4 +#define AT91C_PB4_ECRS_ECRSDV (AT91C_PIO_PB4) // Ethernet MAC Carrier Sense/Carrier Sense and Data Valid +#define AT91C_PIO_PB5 (1 << 5) // Pin Controlled by PB5 +#define AT91C_PB5_ERX0 (AT91C_PIO_PB5) // Ethernet MAC Receive Data 0 +#define AT91C_PIO_PB6 (1 << 6) // Pin Controlled by PB6 +#define AT91C_PB6_ERX1 (AT91C_PIO_PB6) // Ethernet MAC Receive Data 1 +#define AT91C_PIO_PB7 (1 << 7) // Pin Controlled by PB7 +#define AT91C_PB7_ERXER (AT91C_PIO_PB7) // Ethernet MAC Receive Error +#define AT91C_PIO_PB8 (1 << 8) // Pin Controlled by PB8 +#define AT91C_PB8_EMDC (AT91C_PIO_PB8) // Ethernet MAC Management Data Clock +#define AT91C_PIO_PB9 (1 << 9) // Pin Controlled by PB9 +#define AT91C_PB9_EMDIO (AT91C_PIO_PB9) // Ethernet MAC Management Data Input/Output + +// ***************************************************************************** +// PERIPHERAL ID DEFINITIONS FOR AT91SAM7X128 +// ***************************************************************************** +#define AT91C_ID_FIQ ( 0) // Advanced Interrupt Controller (FIQ) +#define AT91C_ID_SYS ( 1) // System Peripheral +#define AT91C_ID_PIOA ( 2) // Parallel IO Controller A +#define AT91C_ID_PIOB ( 3) // Parallel IO Controller B +#define AT91C_ID_SPI0 ( 4) // Serial Peripheral Interface 0 +#define AT91C_ID_SPI1 ( 5) // Serial Peripheral Interface 1 +#define AT91C_ID_US0 ( 6) // USART 0 +#define AT91C_ID_US1 ( 7) // USART 1 +#define AT91C_ID_SSC ( 8) // Serial Synchronous Controller +#define AT91C_ID_TWI ( 9) // Two-Wire Interface +#define AT91C_ID_PWMC (10) // PWM Controller +#define AT91C_ID_UDP (11) // USB Device Port +#define AT91C_ID_TC0 (12) // Timer Counter 0 +#define AT91C_ID_TC1 (13) // Timer Counter 1 +#define AT91C_ID_TC2 (14) // Timer Counter 2 +#define AT91C_ID_CAN (15) // Control Area Network Controller +#define AT91C_ID_EMAC (16) // Ethernet MAC +#define AT91C_ID_ADC (17) // Analog-to-Digital Converter +#define AT91C_ID_AES (18) // Advanced Encryption Standard 128-bit +#define AT91C_ID_TDES (19) // Triple Data Encryption Standard +#define AT91C_ID_20_Reserved (20) // Reserved +#define AT91C_ID_21_Reserved (21) // Reserved +#define AT91C_ID_22_Reserved (22) // Reserved +#define AT91C_ID_23_Reserved (23) // Reserved +#define AT91C_ID_24_Reserved (24) // Reserved +#define AT91C_ID_25_Reserved (25) // Reserved +#define AT91C_ID_26_Reserved (26) // Reserved +#define AT91C_ID_27_Reserved (27) // Reserved +#define AT91C_ID_28_Reserved (28) // Reserved +#define AT91C_ID_29_Reserved (29) // Reserved +#define AT91C_ID_IRQ0 (30) // Advanced Interrupt Controller (IRQ0) +#define AT91C_ID_IRQ1 (31) // Advanced Interrupt Controller (IRQ1) + +// ***************************************************************************** +// BASE ADDRESS DEFINITIONS FOR AT91SAM7X128 +// ***************************************************************************** +#define AT91C_BASE_SYS (0xFFFFF000) // (SYS) Base Address +#define AT91C_BASE_AIC (0xFFFFF000) // (AIC) Base Address +#define AT91C_BASE_PDC_DBGU (0xFFFFF300) // (PDC_DBGU) Base Address +#define AT91C_BASE_DBGU (0xFFFFF200) // (DBGU) Base Address +#define AT91C_BASE_PIOA (0xFFFFF400) // (PIOA) Base Address +#define AT91C_BASE_PIOB (0xFFFFF600) // (PIOB) Base Address +#define AT91C_BASE_CKGR (0xFFFFFC20) // (CKGR) Base Address +#define AT91C_BASE_PMC (0xFFFFFC00) // (PMC) Base Address +#define AT91C_BASE_RSTC (0xFFFFFD00) // (RSTC) Base Address +#define AT91C_BASE_RTTC (0xFFFFFD20) // (RTTC) Base Address +#define AT91C_BASE_PITC (0xFFFFFD30) // (PITC) Base Address +#define AT91C_BASE_WDTC (0xFFFFFD40) // (WDTC) Base Address +#define AT91C_BASE_VREG (0xFFFFFD60) // (VREG) Base Address +#define AT91C_BASE_MC (0xFFFFFF00) // (MC) Base Address +#define AT91C_BASE_PDC_SPI1 (0xFFFE4100) // (PDC_SPI1) Base Address +#define AT91C_BASE_SPI1 (0xFFFE4000) // (SPI1) Base Address +#define AT91C_BASE_PDC_SPI0 (0xFFFE0100) // (PDC_SPI0) Base Address +#define AT91C_BASE_SPI0 (0xFFFE0000) // (SPI0) Base Address +#define AT91C_BASE_PDC_US1 (0xFFFC4100) // (PDC_US1) Base Address +#define AT91C_BASE_US1 (0xFFFC4000) // (US1) Base Address +#define AT91C_BASE_PDC_US0 (0xFFFC0100) // (PDC_US0) Base Address +#define AT91C_BASE_US0 (0xFFFC0000) // (US0) Base Address +#define AT91C_BASE_PDC_SSC (0xFFFD4100) // (PDC_SSC) Base Address +#define AT91C_BASE_SSC (0xFFFD4000) // (SSC) Base Address +#define AT91C_BASE_TWI (0xFFFB8000) // (TWI) Base Address +#define AT91C_BASE_PWMC_CH3 (0xFFFCC260) // (PWMC_CH3) Base Address +#define AT91C_BASE_PWMC_CH2 (0xFFFCC240) // (PWMC_CH2) Base Address +#define AT91C_BASE_PWMC_CH1 (0xFFFCC220) // (PWMC_CH1) Base Address +#define AT91C_BASE_PWMC_CH0 (0xFFFCC200) // (PWMC_CH0) Base Address +#define AT91C_BASE_PWMC (0xFFFCC000) // (PWMC) Base Address +#define AT91C_BASE_UDP (0xFFFB0000) // (UDP) Base Address +#define AT91C_BASE_TC0 (0xFFFA0000) // (TC0) Base Address +#define AT91C_BASE_TC1 (0xFFFA0040) // (TC1) Base Address +#define AT91C_BASE_TC2 (0xFFFA0080) // (TC2) Base Address +#define AT91C_BASE_TCB (0xFFFA0000) // (TCB) Base Address +#define AT91C_BASE_CAN_MB0 (0xFFFD0200) // (CAN_MB0) Base Address +#define AT91C_BASE_CAN_MB1 (0xFFFD0220) // (CAN_MB1) Base Address +#define AT91C_BASE_CAN_MB2 (0xFFFD0240) // (CAN_MB2) Base Address +#define AT91C_BASE_CAN_MB3 (0xFFFD0260) // (CAN_MB3) Base Address +#define AT91C_BASE_CAN_MB4 (0xFFFD0280) // (CAN_MB4) Base Address +#define AT91C_BASE_CAN_MB5 (0xFFFD02A0) // (CAN_MB5) Base Address +#define AT91C_BASE_CAN_MB6 (0xFFFD02C0) // (CAN_MB6) Base Address +#define AT91C_BASE_CAN_MB7 (0xFFFD02E0) // (CAN_MB7) Base Address +#define AT91C_BASE_CAN (0xFFFD0000) // (CAN) Base Address +#define AT91C_BASE_EMAC (0xFFFDC000) // (EMAC) Base Address +#define AT91C_BASE_PDC_ADC (0xFFFD8100) // (PDC_ADC) Base Address +#define AT91C_BASE_ADC (0xFFFD8000) // (ADC) Base Address +#define AT91C_BASE_PDC_AES (0xFFFA4100) // (PDC_AES) Base Address +#define AT91C_BASE_AES (0xFFFA4000) // (AES) Base Address +#define AT91C_BASE_PDC_TDES (0xFFFA8100) // (PDC_TDES) Base Address +#define AT91C_BASE_TDES (0xFFFA8000) // (TDES) Base Address + +// ***************************************************************************** +// MEMORY MAPPING DEFINITIONS FOR AT91SAM7X128 +// ***************************************************************************** +#define AT91C_ISRAM (0x00200000) // Internal SRAM base address +#define AT91C_ISRAM_SIZE (0x00008000) // Internal SRAM size in byte (32 Kbyte) +#define AT91C_IFLASH (0x00100000) // Internal ROM base address +#define AT91C_IFLASH_SIZE (0x00020000) // Internal ROM size in byte (128 Kbyte) + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM7S64/AT91SAM7X256.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM7S64/AT91SAM7X256.h new file mode 100644 index 0000000..6b73f8a --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM7S64/AT91SAM7X256.h @@ -0,0 +1,2715 @@ +// ---------------------------------------------------------------------------- +// ATMEL Microcontroller Software Support - ROUSSET - +// ---------------------------------------------------------------------------- +// DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR +// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE +// DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT, +// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- +// File Name : AT91SAM7X256.h +// Object : AT91SAM7X256 definitions +// Generated : AT91 SW Application Group 05/20/2005 (16:22:29) +// +// CVS Reference : /AT91SAM7X256.pl/1.11/Tue May 10 12:15:32 2005// +// CVS Reference : /SYS_SAM7X.pl/1.3/Tue Feb 1 17:01:43 2005// +// CVS Reference : /MC_SAM7X.pl/1.2/Fri May 20 14:13:04 2005// +// CVS Reference : /PMC_SAM7X.pl/1.4/Tue Feb 8 13:58:10 2005// +// CVS Reference : /RSTC_SAM7X.pl/1.1/Tue Feb 1 16:16:26 2005// +// CVS Reference : /UDP_SAM7X.pl/1.1/Tue May 10 11:35:35 2005// +// CVS Reference : /PWM_SAM7X.pl/1.1/Tue May 10 11:53:07 2005// +// CVS Reference : /AIC_6075B.pl/1.3/Fri May 20 14:01:30 2005// +// CVS Reference : /PIO_6057A.pl/1.2/Thu Feb 3 10:18:28 2005// +// CVS Reference : /RTTC_6081A.pl/1.2/Tue Nov 9 14:43:58 2004// +// CVS Reference : /PITC_6079A.pl/1.2/Tue Nov 9 14:43:56 2004// +// CVS Reference : /WDTC_6080A.pl/1.3/Tue Nov 9 14:44:00 2004// +// CVS Reference : /VREG_6085B.pl/1.1/Tue Feb 1 16:05:48 2005// +// CVS Reference : /PDC_6074C.pl/1.2/Thu Feb 3 08:48:54 2005// +// CVS Reference : /DBGU_6059D.pl/1.1/Mon Jan 31 13:15:32 2005// +// CVS Reference : /SPI_6088D.pl/1.3/Fri May 20 14:08:59 2005// +// CVS Reference : /US_6089C.pl/1.1/Mon Jul 12 18:23:26 2004// +// CVS Reference : /SSC_6078A.pl/1.1/Tue Jul 13 07:45:40 2004// +// CVS Reference : /TWI_6061A.pl/1.1/Tue Jul 13 07:38:06 2004// +// CVS Reference : /TC_6082A.pl/1.7/Fri Mar 11 12:52:17 2005// +// CVS Reference : /CAN_6019B.pl/1.1/Tue Mar 8 12:42:22 2005// +// CVS Reference : /EMACB_6119A.pl/1.5/Thu Feb 3 15:52:04 2005// +// CVS Reference : /ADC_6051C.pl/1.1/Fri Oct 17 09:12:38 2003// +// CVS Reference : /AES_6149A.pl/1.10/Mon Feb 7 09:44:25 2005// +// CVS Reference : /DES3_6150A.pl/1.1/Mon Jan 17 08:34:31 2005// +// ---------------------------------------------------------------------------- + +#ifndef AT91SAM7X256_H +#define AT91SAM7X256_H + +typedef volatile unsigned int AT91_REG;// Hardware register definition + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR System Peripherals +// ***************************************************************************** +typedef struct _AT91S_SYS { + AT91_REG AIC_SMR[32]; // Source Mode Register + AT91_REG AIC_SVR[32]; // Source Vector Register + AT91_REG AIC_IVR; // IRQ Vector Register + AT91_REG AIC_FVR; // FIQ Vector Register + AT91_REG AIC_ISR; // Interrupt Status Register + AT91_REG AIC_IPR; // Interrupt Pending Register + AT91_REG AIC_IMR; // Interrupt Mask Register + AT91_REG AIC_CISR; // Core Interrupt Status Register + AT91_REG Reserved0[2]; // + AT91_REG AIC_IECR; // Interrupt Enable Command Register + AT91_REG AIC_IDCR; // Interrupt Disable Command Register + AT91_REG AIC_ICCR; // Interrupt Clear Command Register + AT91_REG AIC_ISCR; // Interrupt Set Command Register + AT91_REG AIC_EOICR; // End of Interrupt Command Register + AT91_REG AIC_SPU; // Spurious Vector Register + AT91_REG AIC_DCR; // Debug Control Register (Protect) + AT91_REG Reserved1[1]; // + AT91_REG AIC_FFER; // Fast Forcing Enable Register + AT91_REG AIC_FFDR; // Fast Forcing Disable Register + AT91_REG AIC_FFSR; // Fast Forcing Status Register + AT91_REG Reserved2[45]; // + AT91_REG DBGU_CR; // Control Register + AT91_REG DBGU_MR; // Mode Register + AT91_REG DBGU_IER; // Interrupt Enable Register + AT91_REG DBGU_IDR; // Interrupt Disable Register + AT91_REG DBGU_IMR; // Interrupt Mask Register + AT91_REG DBGU_CSR; // Channel Status Register + AT91_REG DBGU_RHR; // Receiver Holding Register + AT91_REG DBGU_THR; // Transmitter Holding Register + AT91_REG DBGU_BRGR; // Baud Rate Generator Register + AT91_REG Reserved3[7]; // + AT91_REG DBGU_CIDR; // Chip ID Register + AT91_REG DBGU_EXID; // Chip ID Extension Register + AT91_REG DBGU_FNTR; // Force NTRST Register + AT91_REG Reserved4[45]; // + AT91_REG DBGU_RPR; // Receive Pointer Register + AT91_REG DBGU_RCR; // Receive Counter Register + AT91_REG DBGU_TPR; // Transmit Pointer Register + AT91_REG DBGU_TCR; // Transmit Counter Register + AT91_REG DBGU_RNPR; // Receive Next Pointer Register + AT91_REG DBGU_RNCR; // Receive Next Counter Register + AT91_REG DBGU_TNPR; // Transmit Next Pointer Register + AT91_REG DBGU_TNCR; // Transmit Next Counter Register + AT91_REG DBGU_PTCR; // PDC Transfer Control Register + AT91_REG DBGU_PTSR; // PDC Transfer Status Register + AT91_REG Reserved5[54]; // + AT91_REG PIOA_PER; // PIO Enable Register + AT91_REG PIOA_PDR; // PIO Disable Register + AT91_REG PIOA_PSR; // PIO Status Register + AT91_REG Reserved6[1]; // + AT91_REG PIOA_OER; // Output Enable Register + AT91_REG PIOA_ODR; // Output Disable Registerr + AT91_REG PIOA_OSR; // Output Status Register + AT91_REG Reserved7[1]; // + AT91_REG PIOA_IFER; // Input Filter Enable Register + AT91_REG PIOA_IFDR; // Input Filter Disable Register + AT91_REG PIOA_IFSR; // Input Filter Status Register + AT91_REG Reserved8[1]; // + AT91_REG PIOA_SODR; // Set Output Data Register + AT91_REG PIOA_CODR; // Clear Output Data Register + AT91_REG PIOA_ODSR; // Output Data Status Register + AT91_REG PIOA_PDSR; // Pin Data Status Register + AT91_REG PIOA_IER; // Interrupt Enable Register + AT91_REG PIOA_IDR; // Interrupt Disable Register + AT91_REG PIOA_IMR; // Interrupt Mask Register + AT91_REG PIOA_ISR; // Interrupt Status Register + AT91_REG PIOA_MDER; // Multi-driver Enable Register + AT91_REG PIOA_MDDR; // Multi-driver Disable Register + AT91_REG PIOA_MDSR; // Multi-driver Status Register + AT91_REG Reserved9[1]; // + AT91_REG PIOA_PPUDR; // Pull-up Disable Register + AT91_REG PIOA_PPUER; // Pull-up Enable Register + AT91_REG PIOA_PPUSR; // Pull-up Status Register + AT91_REG Reserved10[1]; // + AT91_REG PIOA_ASR; // Select A Register + AT91_REG PIOA_BSR; // Select B Register + AT91_REG PIOA_ABSR; // AB Select Status Register + AT91_REG Reserved11[9]; // + AT91_REG PIOA_OWER; // Output Write Enable Register + AT91_REG PIOA_OWDR; // Output Write Disable Register + AT91_REG PIOA_OWSR; // Output Write Status Register + AT91_REG Reserved12[85]; // + AT91_REG PIOB_PER; // PIO Enable Register + AT91_REG PIOB_PDR; // PIO Disable Register + AT91_REG PIOB_PSR; // PIO Status Register + AT91_REG Reserved13[1]; // + AT91_REG PIOB_OER; // Output Enable Register + AT91_REG PIOB_ODR; // Output Disable Registerr + AT91_REG PIOB_OSR; // Output Status Register + AT91_REG Reserved14[1]; // + AT91_REG PIOB_IFER; // Input Filter Enable Register + AT91_REG PIOB_IFDR; // Input Filter Disable Register + AT91_REG PIOB_IFSR; // Input Filter Status Register + AT91_REG Reserved15[1]; // + AT91_REG PIOB_SODR; // Set Output Data Register + AT91_REG PIOB_CODR; // Clear Output Data Register + AT91_REG PIOB_ODSR; // Output Data Status Register + AT91_REG PIOB_PDSR; // Pin Data Status Register + AT91_REG PIOB_IER; // Interrupt Enable Register + AT91_REG PIOB_IDR; // Interrupt Disable Register + AT91_REG PIOB_IMR; // Interrupt Mask Register + AT91_REG PIOB_ISR; // Interrupt Status Register + AT91_REG PIOB_MDER; // Multi-driver Enable Register + AT91_REG PIOB_MDDR; // Multi-driver Disable Register + AT91_REG PIOB_MDSR; // Multi-driver Status Register + AT91_REG Reserved16[1]; // + AT91_REG PIOB_PPUDR; // Pull-up Disable Register + AT91_REG PIOB_PPUER; // Pull-up Enable Register + AT91_REG PIOB_PPUSR; // Pull-up Status Register + AT91_REG Reserved17[1]; // + AT91_REG PIOB_ASR; // Select A Register + AT91_REG PIOB_BSR; // Select B Register + AT91_REG PIOB_ABSR; // AB Select Status Register + AT91_REG Reserved18[9]; // + AT91_REG PIOB_OWER; // Output Write Enable Register + AT91_REG PIOB_OWDR; // Output Write Disable Register + AT91_REG PIOB_OWSR; // Output Write Status Register + AT91_REG Reserved19[341]; // + AT91_REG PMC_SCER; // System Clock Enable Register + AT91_REG PMC_SCDR; // System Clock Disable Register + AT91_REG PMC_SCSR; // System Clock Status Register + AT91_REG Reserved20[1]; // + AT91_REG PMC_PCER; // Peripheral Clock Enable Register + AT91_REG PMC_PCDR; // Peripheral Clock Disable Register + AT91_REG PMC_PCSR; // Peripheral Clock Status Register + AT91_REG Reserved21[1]; // + AT91_REG PMC_MOR; // Main Oscillator Register + AT91_REG PMC_MCFR; // Main Clock Frequency Register + AT91_REG Reserved22[1]; // + AT91_REG PMC_PLLR; // PLL Register + AT91_REG PMC_MCKR; // Master Clock Register + AT91_REG Reserved23[3]; // + AT91_REG PMC_PCKR[4]; // Programmable Clock Register + AT91_REG Reserved24[4]; // + AT91_REG PMC_IER; // Interrupt Enable Register + AT91_REG PMC_IDR; // Interrupt Disable Register + AT91_REG PMC_SR; // Status Register + AT91_REG PMC_IMR; // Interrupt Mask Register + AT91_REG Reserved25[36]; // + AT91_REG RSTC_RCR; // Reset Control Register + AT91_REG RSTC_RSR; // Reset Status Register + AT91_REG RSTC_RMR; // Reset Mode Register + AT91_REG Reserved26[5]; // + AT91_REG RTTC_RTMR; // Real-time Mode Register + AT91_REG RTTC_RTAR; // Real-time Alarm Register + AT91_REG RTTC_RTVR; // Real-time Value Register + AT91_REG RTTC_RTSR; // Real-time Status Register + AT91_REG PITC_PIMR; // Period Interval Mode Register + AT91_REG PITC_PISR; // Period Interval Status Register + AT91_REG PITC_PIVR; // Period Interval Value Register + AT91_REG PITC_PIIR; // Period Interval Image Register + AT91_REG WDTC_WDCR; // Watchdog Control Register + AT91_REG WDTC_WDMR; // Watchdog Mode Register + AT91_REG WDTC_WDSR; // Watchdog Status Register + AT91_REG Reserved27[5]; // + AT91_REG VREG_MR; // Voltage Regulator Mode Register +} AT91S_SYS, *AT91PS_SYS; + + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Advanced Interrupt Controller +// ***************************************************************************** +typedef struct _AT91S_AIC { + AT91_REG AIC_SMR[32]; // Source Mode Register + AT91_REG AIC_SVR[32]; // Source Vector Register + AT91_REG AIC_IVR; // IRQ Vector Register + AT91_REG AIC_FVR; // FIQ Vector Register + AT91_REG AIC_ISR; // Interrupt Status Register + AT91_REG AIC_IPR; // Interrupt Pending Register + AT91_REG AIC_IMR; // Interrupt Mask Register + AT91_REG AIC_CISR; // Core Interrupt Status Register + AT91_REG Reserved0[2]; // + AT91_REG AIC_IECR; // Interrupt Enable Command Register + AT91_REG AIC_IDCR; // Interrupt Disable Command Register + AT91_REG AIC_ICCR; // Interrupt Clear Command Register + AT91_REG AIC_ISCR; // Interrupt Set Command Register + AT91_REG AIC_EOICR; // End of Interrupt Command Register + AT91_REG AIC_SPU; // Spurious Vector Register + AT91_REG AIC_DCR; // Debug Control Register (Protect) + AT91_REG Reserved1[1]; // + AT91_REG AIC_FFER; // Fast Forcing Enable Register + AT91_REG AIC_FFDR; // Fast Forcing Disable Register + AT91_REG AIC_FFSR; // Fast Forcing Status Register +} AT91S_AIC, *AT91PS_AIC; + +// -------- AIC_SMR : (AIC Offset: 0x0) Control Register -------- +#define AT91C_AIC_PRIOR ((unsigned int) 0x7 << 0) // (AIC) Priority Level +#define AT91C_AIC_PRIOR_LOWEST ((unsigned int) 0x0) // (AIC) Lowest priority level +#define AT91C_AIC_PRIOR_HIGHEST ((unsigned int) 0x7) // (AIC) Highest priority level +#define AT91C_AIC_SRCTYPE ((unsigned int) 0x3 << 5) // (AIC) Interrupt Source Type +#define AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL ((unsigned int) 0x0 << 5) // (AIC) Internal Sources Code Label High-level Sensitive +#define AT91C_AIC_SRCTYPE_EXT_LOW_LEVEL ((unsigned int) 0x0 << 5) // (AIC) External Sources Code Label Low-level Sensitive +#define AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE ((unsigned int) 0x1 << 5) // (AIC) Internal Sources Code Label Positive Edge triggered +#define AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE ((unsigned int) 0x1 << 5) // (AIC) External Sources Code Label Negative Edge triggered +#define AT91C_AIC_SRCTYPE_HIGH_LEVEL ((unsigned int) 0x2 << 5) // (AIC) Internal Or External Sources Code Label High-level Sensitive +#define AT91C_AIC_SRCTYPE_POSITIVE_EDGE ((unsigned int) 0x3 << 5) // (AIC) Internal Or External Sources Code Label Positive Edge triggered +// -------- AIC_CISR : (AIC Offset: 0x114) AIC Core Interrupt Status Register -------- +#define AT91C_AIC_NFIQ ((unsigned int) 0x1 << 0) // (AIC) NFIQ Status +#define AT91C_AIC_NIRQ ((unsigned int) 0x1 << 1) // (AIC) NIRQ Status +// -------- AIC_DCR : (AIC Offset: 0x138) AIC Debug Control Register (Protect) -------- +#define AT91C_AIC_DCR_PROT ((unsigned int) 0x1 << 0) // (AIC) Protection Mode +#define AT91C_AIC_DCR_GMSK ((unsigned int) 0x1 << 1) // (AIC) General Mask + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Peripheral DMA Controller +// ***************************************************************************** +typedef struct _AT91S_PDC { + AT91_REG PDC_RPR; // Receive Pointer Register + AT91_REG PDC_RCR; // Receive Counter Register + AT91_REG PDC_TPR; // Transmit Pointer Register + AT91_REG PDC_TCR; // Transmit Counter Register + AT91_REG PDC_RNPR; // Receive Next Pointer Register + AT91_REG PDC_RNCR; // Receive Next Counter Register + AT91_REG PDC_TNPR; // Transmit Next Pointer Register + AT91_REG PDC_TNCR; // Transmit Next Counter Register + AT91_REG PDC_PTCR; // PDC Transfer Control Register + AT91_REG PDC_PTSR; // PDC Transfer Status Register +} AT91S_PDC, *AT91PS_PDC; + +// -------- PDC_PTCR : (PDC Offset: 0x20) PDC Transfer Control Register -------- +#define AT91C_PDC_RXTEN ((unsigned int) 0x1 << 0) // (PDC) Receiver Transfer Enable +#define AT91C_PDC_RXTDIS ((unsigned int) 0x1 << 1) // (PDC) Receiver Transfer Disable +#define AT91C_PDC_TXTEN ((unsigned int) 0x1 << 8) // (PDC) Transmitter Transfer Enable +#define AT91C_PDC_TXTDIS ((unsigned int) 0x1 << 9) // (PDC) Transmitter Transfer Disable +// -------- PDC_PTSR : (PDC Offset: 0x24) PDC Transfer Status Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Debug Unit +// ***************************************************************************** +typedef struct _AT91S_DBGU { + AT91_REG DBGU_CR; // Control Register + AT91_REG DBGU_MR; // Mode Register + AT91_REG DBGU_IER; // Interrupt Enable Register + AT91_REG DBGU_IDR; // Interrupt Disable Register + AT91_REG DBGU_IMR; // Interrupt Mask Register + AT91_REG DBGU_CSR; // Channel Status Register + AT91_REG DBGU_RHR; // Receiver Holding Register + AT91_REG DBGU_THR; // Transmitter Holding Register + AT91_REG DBGU_BRGR; // Baud Rate Generator Register + AT91_REG Reserved0[7]; // + AT91_REG DBGU_CIDR; // Chip ID Register + AT91_REG DBGU_EXID; // Chip ID Extension Register + AT91_REG DBGU_FNTR; // Force NTRST Register + AT91_REG Reserved1[45]; // + AT91_REG DBGU_RPR; // Receive Pointer Register + AT91_REG DBGU_RCR; // Receive Counter Register + AT91_REG DBGU_TPR; // Transmit Pointer Register + AT91_REG DBGU_TCR; // Transmit Counter Register + AT91_REG DBGU_RNPR; // Receive Next Pointer Register + AT91_REG DBGU_RNCR; // Receive Next Counter Register + AT91_REG DBGU_TNPR; // Transmit Next Pointer Register + AT91_REG DBGU_TNCR; // Transmit Next Counter Register + AT91_REG DBGU_PTCR; // PDC Transfer Control Register + AT91_REG DBGU_PTSR; // PDC Transfer Status Register +} AT91S_DBGU, *AT91PS_DBGU; + +// -------- DBGU_CR : (DBGU Offset: 0x0) Debug Unit Control Register -------- +#define AT91C_US_RSTRX ((unsigned int) 0x1 << 2) // (DBGU) Reset Receiver +#define AT91C_US_RSTTX ((unsigned int) 0x1 << 3) // (DBGU) Reset Transmitter +#define AT91C_US_RXEN ((unsigned int) 0x1 << 4) // (DBGU) Receiver Enable +#define AT91C_US_RXDIS ((unsigned int) 0x1 << 5) // (DBGU) Receiver Disable +#define AT91C_US_TXEN ((unsigned int) 0x1 << 6) // (DBGU) Transmitter Enable +#define AT91C_US_TXDIS ((unsigned int) 0x1 << 7) // (DBGU) Transmitter Disable +#define AT91C_US_RSTSTA ((unsigned int) 0x1 << 8) // (DBGU) Reset Status Bits +// -------- DBGU_MR : (DBGU Offset: 0x4) Debug Unit Mode Register -------- +#define AT91C_US_PAR ((unsigned int) 0x7 << 9) // (DBGU) Parity type +#define AT91C_US_PAR_EVEN ((unsigned int) 0x0 << 9) // (DBGU) Even Parity +#define AT91C_US_PAR_ODD ((unsigned int) 0x1 << 9) // (DBGU) Odd Parity +#define AT91C_US_PAR_SPACE ((unsigned int) 0x2 << 9) // (DBGU) Parity forced to 0 (Space) +#define AT91C_US_PAR_MARK ((unsigned int) 0x3 << 9) // (DBGU) Parity forced to 1 (Mark) +#define AT91C_US_PAR_NONE ((unsigned int) 0x4 << 9) // (DBGU) No Parity +#define AT91C_US_PAR_MULTI_DROP ((unsigned int) 0x6 << 9) // (DBGU) Multi-drop mode +#define AT91C_US_CHMODE ((unsigned int) 0x3 << 14) // (DBGU) Channel Mode +#define AT91C_US_CHMODE_NORMAL ((unsigned int) 0x0 << 14) // (DBGU) Normal Mode: The USART channel operates as an RX/TX USART. +#define AT91C_US_CHMODE_AUTO ((unsigned int) 0x1 << 14) // (DBGU) Automatic Echo: Receiver Data Input is connected to the TXD pin. +#define AT91C_US_CHMODE_LOCAL ((unsigned int) 0x2 << 14) // (DBGU) Local Loopback: Transmitter Output Signal is connected to Receiver Input Signal. +#define AT91C_US_CHMODE_REMOTE ((unsigned int) 0x3 << 14) // (DBGU) Remote Loopback: RXD pin is internally connected to TXD pin. +// -------- DBGU_IER : (DBGU Offset: 0x8) Debug Unit Interrupt Enable Register -------- +#define AT91C_US_RXRDY ((unsigned int) 0x1 << 0) // (DBGU) RXRDY Interrupt +#define AT91C_US_TXRDY ((unsigned int) 0x1 << 1) // (DBGU) TXRDY Interrupt +#define AT91C_US_ENDRX ((unsigned int) 0x1 << 3) // (DBGU) End of Receive Transfer Interrupt +#define AT91C_US_ENDTX ((unsigned int) 0x1 << 4) // (DBGU) End of Transmit Interrupt +#define AT91C_US_OVRE ((unsigned int) 0x1 << 5) // (DBGU) Overrun Interrupt +#define AT91C_US_FRAME ((unsigned int) 0x1 << 6) // (DBGU) Framing Error Interrupt +#define AT91C_US_PARE ((unsigned int) 0x1 << 7) // (DBGU) Parity Error Interrupt +#define AT91C_US_TXEMPTY ((unsigned int) 0x1 << 9) // (DBGU) TXEMPTY Interrupt +#define AT91C_US_TXBUFE ((unsigned int) 0x1 << 11) // (DBGU) TXBUFE Interrupt +#define AT91C_US_RXBUFF ((unsigned int) 0x1 << 12) // (DBGU) RXBUFF Interrupt +#define AT91C_US_COMM_TX ((unsigned int) 0x1 << 30) // (DBGU) COMM_TX Interrupt +#define AT91C_US_COMM_RX ((unsigned int) 0x1 << 31) // (DBGU) COMM_RX Interrupt +// -------- DBGU_IDR : (DBGU Offset: 0xc) Debug Unit Interrupt Disable Register -------- +// -------- DBGU_IMR : (DBGU Offset: 0x10) Debug Unit Interrupt Mask Register -------- +// -------- DBGU_CSR : (DBGU Offset: 0x14) Debug Unit Channel Status Register -------- +// -------- DBGU_FNTR : (DBGU Offset: 0x48) Debug Unit FORCE_NTRST Register -------- +#define AT91C_US_FORCE_NTRST ((unsigned int) 0x1 << 0) // (DBGU) Force NTRST in JTAG + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Parallel Input Output Controler +// ***************************************************************************** +typedef struct _AT91S_PIO { + AT91_REG PIO_PER; // PIO Enable Register + AT91_REG PIO_PDR; // PIO Disable Register + AT91_REG PIO_PSR; // PIO Status Register + AT91_REG Reserved0[1]; // + AT91_REG PIO_OER; // Output Enable Register + AT91_REG PIO_ODR; // Output Disable Registerr + AT91_REG PIO_OSR; // Output Status Register + AT91_REG Reserved1[1]; // + AT91_REG PIO_IFER; // Input Filter Enable Register + AT91_REG PIO_IFDR; // Input Filter Disable Register + AT91_REG PIO_IFSR; // Input Filter Status Register + AT91_REG Reserved2[1]; // + AT91_REG PIO_SODR; // Set Output Data Register + AT91_REG PIO_CODR; // Clear Output Data Register + AT91_REG PIO_ODSR; // Output Data Status Register + AT91_REG PIO_PDSR; // Pin Data Status Register + AT91_REG PIO_IER; // Interrupt Enable Register + AT91_REG PIO_IDR; // Interrupt Disable Register + AT91_REG PIO_IMR; // Interrupt Mask Register + AT91_REG PIO_ISR; // Interrupt Status Register + AT91_REG PIO_MDER; // Multi-driver Enable Register + AT91_REG PIO_MDDR; // Multi-driver Disable Register + AT91_REG PIO_MDSR; // Multi-driver Status Register + AT91_REG Reserved3[1]; // + AT91_REG PIO_PPUDR; // Pull-up Disable Register + AT91_REG PIO_PPUER; // Pull-up Enable Register + AT91_REG PIO_PPUSR; // Pull-up Status Register + AT91_REG Reserved4[1]; // + AT91_REG PIO_ASR; // Select A Register + AT91_REG PIO_BSR; // Select B Register + AT91_REG PIO_ABSR; // AB Select Status Register + AT91_REG Reserved5[9]; // + AT91_REG PIO_OWER; // Output Write Enable Register + AT91_REG PIO_OWDR; // Output Write Disable Register + AT91_REG PIO_OWSR; // Output Write Status Register +} AT91S_PIO, *AT91PS_PIO; + + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Clock Generator Controler +// ***************************************************************************** +typedef struct _AT91S_CKGR { + AT91_REG CKGR_MOR; // Main Oscillator Register + AT91_REG CKGR_MCFR; // Main Clock Frequency Register + AT91_REG Reserved0[1]; // + AT91_REG CKGR_PLLR; // PLL Register +} AT91S_CKGR, *AT91PS_CKGR; + +// -------- CKGR_MOR : (CKGR Offset: 0x0) Main Oscillator Register -------- +#define AT91C_CKGR_MOSCEN ((unsigned int) 0x1 << 0) // (CKGR) Main Oscillator Enable +#define AT91C_CKGR_OSCBYPASS ((unsigned int) 0x1 << 1) // (CKGR) Main Oscillator Bypass +#define AT91C_CKGR_OSCOUNT ((unsigned int) 0xFF << 8) // (CKGR) Main Oscillator Start-up Time +// -------- CKGR_MCFR : (CKGR Offset: 0x4) Main Clock Frequency Register -------- +#define AT91C_CKGR_MAINF ((unsigned int) 0xFFFF << 0) // (CKGR) Main Clock Frequency +#define AT91C_CKGR_MAINRDY ((unsigned int) 0x1 << 16) // (CKGR) Main Clock Ready +// -------- CKGR_PLLR : (CKGR Offset: 0xc) PLL B Register -------- +#define AT91C_CKGR_DIV ((unsigned int) 0xFF << 0) // (CKGR) Divider Selected +#define AT91C_CKGR_DIV_0 ((unsigned int) 0x0) // (CKGR) Divider output is 0 +#define AT91C_CKGR_DIV_BYPASS ((unsigned int) 0x1) // (CKGR) Divider is bypassed +#define AT91C_CKGR_PLLCOUNT ((unsigned int) 0x3F << 8) // (CKGR) PLL Counter +#define AT91C_CKGR_OUT ((unsigned int) 0x3 << 14) // (CKGR) PLL Output Frequency Range +#define AT91C_CKGR_OUT_0 ((unsigned int) 0x0 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_OUT_1 ((unsigned int) 0x1 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_OUT_2 ((unsigned int) 0x2 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_OUT_3 ((unsigned int) 0x3 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_MUL ((unsigned int) 0x7FF << 16) // (CKGR) PLL Multiplier +#define AT91C_CKGR_USBDIV ((unsigned int) 0x3 << 28) // (CKGR) Divider for USB Clocks +#define AT91C_CKGR_USBDIV_0 ((unsigned int) 0x0 << 28) // (CKGR) Divider output is PLL clock output +#define AT91C_CKGR_USBDIV_1 ((unsigned int) 0x1 << 28) // (CKGR) Divider output is PLL clock output divided by 2 +#define AT91C_CKGR_USBDIV_2 ((unsigned int) 0x2 << 28) // (CKGR) Divider output is PLL clock output divided by 4 + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Power Management Controler +// ***************************************************************************** +typedef struct _AT91S_PMC { + AT91_REG PMC_SCER; // System Clock Enable Register + AT91_REG PMC_SCDR; // System Clock Disable Register + AT91_REG PMC_SCSR; // System Clock Status Register + AT91_REG Reserved0[1]; // + AT91_REG PMC_PCER; // Peripheral Clock Enable Register + AT91_REG PMC_PCDR; // Peripheral Clock Disable Register + AT91_REG PMC_PCSR; // Peripheral Clock Status Register + AT91_REG Reserved1[1]; // + AT91_REG PMC_MOR; // Main Oscillator Register + AT91_REG PMC_MCFR; // Main Clock Frequency Register + AT91_REG Reserved2[1]; // + AT91_REG PMC_PLLR; // PLL Register + AT91_REG PMC_MCKR; // Master Clock Register + AT91_REG Reserved3[3]; // + AT91_REG PMC_PCKR[4]; // Programmable Clock Register + AT91_REG Reserved4[4]; // + AT91_REG PMC_IER; // Interrupt Enable Register + AT91_REG PMC_IDR; // Interrupt Disable Register + AT91_REG PMC_SR; // Status Register + AT91_REG PMC_IMR; // Interrupt Mask Register +} AT91S_PMC, *AT91PS_PMC; + +// -------- PMC_SCER : (PMC Offset: 0x0) System Clock Enable Register -------- +#define AT91C_PMC_PCK ((unsigned int) 0x1 << 0) // (PMC) Processor Clock +#define AT91C_PMC_UDP ((unsigned int) 0x1 << 7) // (PMC) USB Device Port Clock +#define AT91C_PMC_PCK0 ((unsigned int) 0x1 << 8) // (PMC) Programmable Clock Output +#define AT91C_PMC_PCK1 ((unsigned int) 0x1 << 9) // (PMC) Programmable Clock Output +#define AT91C_PMC_PCK2 ((unsigned int) 0x1 << 10) // (PMC) Programmable Clock Output +#define AT91C_PMC_PCK3 ((unsigned int) 0x1 << 11) // (PMC) Programmable Clock Output +// -------- PMC_SCDR : (PMC Offset: 0x4) System Clock Disable Register -------- +// -------- PMC_SCSR : (PMC Offset: 0x8) System Clock Status Register -------- +// -------- CKGR_MOR : (PMC Offset: 0x20) Main Oscillator Register -------- +// -------- CKGR_MCFR : (PMC Offset: 0x24) Main Clock Frequency Register -------- +// -------- CKGR_PLLR : (PMC Offset: 0x2c) PLL B Register -------- +// -------- PMC_MCKR : (PMC Offset: 0x30) Master Clock Register -------- +#define AT91C_PMC_CSS ((unsigned int) 0x3 << 0) // (PMC) Programmable Clock Selection +#define AT91C_PMC_CSS_SLOW_CLK ((unsigned int) 0x0) // (PMC) Slow Clock is selected +#define AT91C_PMC_CSS_MAIN_CLK ((unsigned int) 0x1) // (PMC) Main Clock is selected +#define AT91C_PMC_CSS_PLL_CLK ((unsigned int) 0x3) // (PMC) Clock from PLL is selected +#define AT91C_PMC_PRES ((unsigned int) 0x7 << 2) // (PMC) Programmable Clock Prescaler +#define AT91C_PMC_PRES_CLK ((unsigned int) 0x0 << 2) // (PMC) Selected clock +#define AT91C_PMC_PRES_CLK_2 ((unsigned int) 0x1 << 2) // (PMC) Selected clock divided by 2 +#define AT91C_PMC_PRES_CLK_4 ((unsigned int) 0x2 << 2) // (PMC) Selected clock divided by 4 +#define AT91C_PMC_PRES_CLK_8 ((unsigned int) 0x3 << 2) // (PMC) Selected clock divided by 8 +#define AT91C_PMC_PRES_CLK_16 ((unsigned int) 0x4 << 2) // (PMC) Selected clock divided by 16 +#define AT91C_PMC_PRES_CLK_32 ((unsigned int) 0x5 << 2) // (PMC) Selected clock divided by 32 +#define AT91C_PMC_PRES_CLK_64 ((unsigned int) 0x6 << 2) // (PMC) Selected clock divided by 64 +// -------- PMC_PCKR : (PMC Offset: 0x40) Programmable Clock Register -------- +// -------- PMC_IER : (PMC Offset: 0x60) PMC Interrupt Enable Register -------- +#define AT91C_PMC_MOSCS ((unsigned int) 0x1 << 0) // (PMC) MOSC Status/Enable/Disable/Mask +#define AT91C_PMC_LOCK ((unsigned int) 0x1 << 2) // (PMC) PLL Status/Enable/Disable/Mask +#define AT91C_PMC_MCKRDY ((unsigned int) 0x1 << 3) // (PMC) MCK_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK0RDY ((unsigned int) 0x1 << 8) // (PMC) PCK0_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK1RDY ((unsigned int) 0x1 << 9) // (PMC) PCK1_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK2RDY ((unsigned int) 0x1 << 10) // (PMC) PCK2_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK3RDY ((unsigned int) 0x1 << 11) // (PMC) PCK3_RDY Status/Enable/Disable/Mask +// -------- PMC_IDR : (PMC Offset: 0x64) PMC Interrupt Disable Register -------- +// -------- PMC_SR : (PMC Offset: 0x68) PMC Status Register -------- +// -------- PMC_IMR : (PMC Offset: 0x6c) PMC Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Reset Controller Interface +// ***************************************************************************** +typedef struct _AT91S_RSTC { + AT91_REG RSTC_RCR; // Reset Control Register + AT91_REG RSTC_RSR; // Reset Status Register + AT91_REG RSTC_RMR; // Reset Mode Register +} AT91S_RSTC, *AT91PS_RSTC; + +// -------- RSTC_RCR : (RSTC Offset: 0x0) Reset Control Register -------- +#define AT91C_RSTC_PROCRST ((unsigned int) 0x1 << 0) // (RSTC) Processor Reset +#define AT91C_RSTC_PERRST ((unsigned int) 0x1 << 2) // (RSTC) Peripheral Reset +#define AT91C_RSTC_EXTRST ((unsigned int) 0x1 << 3) // (RSTC) External Reset +#define AT91C_RSTC_KEY ((unsigned int) 0xFF << 24) // (RSTC) Password +// -------- RSTC_RSR : (RSTC Offset: 0x4) Reset Status Register -------- +#define AT91C_RSTC_URSTS ((unsigned int) 0x1 << 0) // (RSTC) User Reset Status +#define AT91C_RSTC_BODSTS ((unsigned int) 0x1 << 1) // (RSTC) Brownout Detection Status +#define AT91C_RSTC_RSTTYP ((unsigned int) 0x7 << 8) // (RSTC) Reset Type +#define AT91C_RSTC_RSTTYP_POWERUP ((unsigned int) 0x0 << 8) // (RSTC) Power-up Reset. VDDCORE rising. +#define AT91C_RSTC_RSTTYP_WAKEUP ((unsigned int) 0x1 << 8) // (RSTC) WakeUp Reset. VDDCORE rising. +#define AT91C_RSTC_RSTTYP_WATCHDOG ((unsigned int) 0x2 << 8) // (RSTC) Watchdog Reset. Watchdog overflow occured. +#define AT91C_RSTC_RSTTYP_SOFTWARE ((unsigned int) 0x3 << 8) // (RSTC) Software Reset. Processor reset required by the software. +#define AT91C_RSTC_RSTTYP_USER ((unsigned int) 0x4 << 8) // (RSTC) User Reset. NRST pin detected low. +#define AT91C_RSTC_RSTTYP_BROWNOUT ((unsigned int) 0x5 << 8) // (RSTC) Brownout Reset occured. +#define AT91C_RSTC_NRSTL ((unsigned int) 0x1 << 16) // (RSTC) NRST pin level +#define AT91C_RSTC_SRCMP ((unsigned int) 0x1 << 17) // (RSTC) Software Reset Command in Progress. +// -------- RSTC_RMR : (RSTC Offset: 0x8) Reset Mode Register -------- +#define AT91C_RSTC_URSTEN ((unsigned int) 0x1 << 0) // (RSTC) User Reset Enable +#define AT91C_RSTC_URSTIEN ((unsigned int) 0x1 << 4) // (RSTC) User Reset Interrupt Enable +#define AT91C_RSTC_ERSTL ((unsigned int) 0xF << 8) // (RSTC) User Reset Enable +#define AT91C_RSTC_BODIEN ((unsigned int) 0x1 << 16) // (RSTC) Brownout Detection Interrupt Enable + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Real Time Timer Controller Interface +// ***************************************************************************** +typedef struct _AT91S_RTTC { + AT91_REG RTTC_RTMR; // Real-time Mode Register + AT91_REG RTTC_RTAR; // Real-time Alarm Register + AT91_REG RTTC_RTVR; // Real-time Value Register + AT91_REG RTTC_RTSR; // Real-time Status Register +} AT91S_RTTC, *AT91PS_RTTC; + +// -------- RTTC_RTMR : (RTTC Offset: 0x0) Real-time Mode Register -------- +#define AT91C_RTTC_RTPRES ((unsigned int) 0xFFFF << 0) // (RTTC) Real-time Timer Prescaler Value +#define AT91C_RTTC_ALMIEN ((unsigned int) 0x1 << 16) // (RTTC) Alarm Interrupt Enable +#define AT91C_RTTC_RTTINCIEN ((unsigned int) 0x1 << 17) // (RTTC) Real Time Timer Increment Interrupt Enable +#define AT91C_RTTC_RTTRST ((unsigned int) 0x1 << 18) // (RTTC) Real Time Timer Restart +// -------- RTTC_RTAR : (RTTC Offset: 0x4) Real-time Alarm Register -------- +#define AT91C_RTTC_ALMV ((unsigned int) 0x0 << 0) // (RTTC) Alarm Value +// -------- RTTC_RTVR : (RTTC Offset: 0x8) Current Real-time Value Register -------- +#define AT91C_RTTC_CRTV ((unsigned int) 0x0 << 0) // (RTTC) Current Real-time Value +// -------- RTTC_RTSR : (RTTC Offset: 0xc) Real-time Status Register -------- +#define AT91C_RTTC_ALMS ((unsigned int) 0x1 << 0) // (RTTC) Real-time Alarm Status +#define AT91C_RTTC_RTTINC ((unsigned int) 0x1 << 1) // (RTTC) Real-time Timer Increment + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Periodic Interval Timer Controller Interface +// ***************************************************************************** +typedef struct _AT91S_PITC { + AT91_REG PITC_PIMR; // Period Interval Mode Register + AT91_REG PITC_PISR; // Period Interval Status Register + AT91_REG PITC_PIVR; // Period Interval Value Register + AT91_REG PITC_PIIR; // Period Interval Image Register +} AT91S_PITC, *AT91PS_PITC; + +// -------- PITC_PIMR : (PITC Offset: 0x0) Periodic Interval Mode Register -------- +#define AT91C_PITC_PIV ((unsigned int) 0xFFFFF << 0) // (PITC) Periodic Interval Value +#define AT91C_PITC_PITEN ((unsigned int) 0x1 << 24) // (PITC) Periodic Interval Timer Enabled +#define AT91C_PITC_PITIEN ((unsigned int) 0x1 << 25) // (PITC) Periodic Interval Timer Interrupt Enable +// -------- PITC_PISR : (PITC Offset: 0x4) Periodic Interval Status Register -------- +#define AT91C_PITC_PITS ((unsigned int) 0x1 << 0) // (PITC) Periodic Interval Timer Status +// -------- PITC_PIVR : (PITC Offset: 0x8) Periodic Interval Value Register -------- +#define AT91C_PITC_CPIV ((unsigned int) 0xFFFFF << 0) // (PITC) Current Periodic Interval Value +#define AT91C_PITC_PICNT ((unsigned int) 0xFFF << 20) // (PITC) Periodic Interval Counter +// -------- PITC_PIIR : (PITC Offset: 0xc) Periodic Interval Image Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Watchdog Timer Controller Interface +// ***************************************************************************** +typedef struct _AT91S_WDTC { + AT91_REG WDTC_WDCR; // Watchdog Control Register + AT91_REG WDTC_WDMR; // Watchdog Mode Register + AT91_REG WDTC_WDSR; // Watchdog Status Register +} AT91S_WDTC, *AT91PS_WDTC; + +// -------- WDTC_WDCR : (WDTC Offset: 0x0) Periodic Interval Image Register -------- +#define AT91C_WDTC_WDRSTT ((unsigned int) 0x1 << 0) // (WDTC) Watchdog Restart +#define AT91C_WDTC_KEY ((unsigned int) 0xFF << 24) // (WDTC) Watchdog KEY Password +// -------- WDTC_WDMR : (WDTC Offset: 0x4) Watchdog Mode Register -------- +#define AT91C_WDTC_WDV ((unsigned int) 0xFFF << 0) // (WDTC) Watchdog Timer Restart +#define AT91C_WDTC_WDFIEN ((unsigned int) 0x1 << 12) // (WDTC) Watchdog Fault Interrupt Enable +#define AT91C_WDTC_WDRSTEN ((unsigned int) 0x1 << 13) // (WDTC) Watchdog Reset Enable +#define AT91C_WDTC_WDRPROC ((unsigned int) 0x1 << 14) // (WDTC) Watchdog Timer Restart +#define AT91C_WDTC_WDDIS ((unsigned int) 0x1 << 15) // (WDTC) Watchdog Disable +#define AT91C_WDTC_WDD ((unsigned int) 0xFFF << 16) // (WDTC) Watchdog Delta Value +#define AT91C_WDTC_WDDBGHLT ((unsigned int) 0x1 << 28) // (WDTC) Watchdog Debug Halt +#define AT91C_WDTC_WDIDLEHLT ((unsigned int) 0x1 << 29) // (WDTC) Watchdog Idle Halt +// -------- WDTC_WDSR : (WDTC Offset: 0x8) Watchdog Status Register -------- +#define AT91C_WDTC_WDUNF ((unsigned int) 0x1 << 0) // (WDTC) Watchdog Underflow +#define AT91C_WDTC_WDERR ((unsigned int) 0x1 << 1) // (WDTC) Watchdog Error + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Voltage Regulator Mode Controller Interface +// ***************************************************************************** +typedef struct _AT91S_VREG { + AT91_REG VREG_MR; // Voltage Regulator Mode Register +} AT91S_VREG, *AT91PS_VREG; + +// -------- VREG_MR : (VREG Offset: 0x0) Voltage Regulator Mode Register -------- +#define AT91C_VREG_PSTDBY ((unsigned int) 0x1 << 0) // (VREG) Voltage Regulator Power Standby Mode + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Memory Controller Interface +// ***************************************************************************** +typedef struct _AT91S_MC { + AT91_REG MC_RCR; // MC Remap Control Register + AT91_REG MC_ASR; // MC Abort Status Register + AT91_REG MC_AASR; // MC Abort Address Status Register + AT91_REG Reserved0[21]; // + AT91_REG MC_FMR; // MC Flash Mode Register + AT91_REG MC_FCR; // MC Flash Command Register + AT91_REG MC_FSR; // MC Flash Status Register +} AT91S_MC, *AT91PS_MC; + +// -------- MC_RCR : (MC Offset: 0x0) MC Remap Control Register -------- +#define AT91C_MC_RCB ((unsigned int) 0x1 << 0) // (MC) Remap Command Bit +// -------- MC_ASR : (MC Offset: 0x4) MC Abort Status Register -------- +#define AT91C_MC_UNDADD ((unsigned int) 0x1 << 0) // (MC) Undefined Addess Abort Status +#define AT91C_MC_MISADD ((unsigned int) 0x1 << 1) // (MC) Misaligned Addess Abort Status +#define AT91C_MC_ABTSZ ((unsigned int) 0x3 << 8) // (MC) Abort Size Status +#define AT91C_MC_ABTSZ_BYTE ((unsigned int) 0x0 << 8) // (MC) Byte +#define AT91C_MC_ABTSZ_HWORD ((unsigned int) 0x1 << 8) // (MC) Half-word +#define AT91C_MC_ABTSZ_WORD ((unsigned int) 0x2 << 8) // (MC) Word +#define AT91C_MC_ABTTYP ((unsigned int) 0x3 << 10) // (MC) Abort Type Status +#define AT91C_MC_ABTTYP_DATAR ((unsigned int) 0x0 << 10) // (MC) Data Read +#define AT91C_MC_ABTTYP_DATAW ((unsigned int) 0x1 << 10) // (MC) Data Write +#define AT91C_MC_ABTTYP_FETCH ((unsigned int) 0x2 << 10) // (MC) Code Fetch +#define AT91C_MC_MST0 ((unsigned int) 0x1 << 16) // (MC) Master 0 Abort Source +#define AT91C_MC_MST1 ((unsigned int) 0x1 << 17) // (MC) Master 1 Abort Source +#define AT91C_MC_SVMST0 ((unsigned int) 0x1 << 24) // (MC) Saved Master 0 Abort Source +#define AT91C_MC_SVMST1 ((unsigned int) 0x1 << 25) // (MC) Saved Master 1 Abort Source +// -------- MC_FMR : (MC Offset: 0x60) MC Flash Mode Register -------- +#define AT91C_MC_FRDY ((unsigned int) 0x1 << 0) // (MC) Flash Ready +#define AT91C_MC_LOCKE ((unsigned int) 0x1 << 2) // (MC) Lock Error +#define AT91C_MC_PROGE ((unsigned int) 0x1 << 3) // (MC) Programming Error +#define AT91C_MC_NEBP ((unsigned int) 0x1 << 7) // (MC) No Erase Before Programming +#define AT91C_MC_FWS ((unsigned int) 0x3 << 8) // (MC) Flash Wait State +#define AT91C_MC_FWS_0FWS ((unsigned int) 0x0 << 8) // (MC) 1 cycle for Read, 2 for Write operations +#define AT91C_MC_FWS_1FWS ((unsigned int) 0x1 << 8) // (MC) 2 cycles for Read, 3 for Write operations +#define AT91C_MC_FWS_2FWS ((unsigned int) 0x2 << 8) // (MC) 3 cycles for Read, 4 for Write operations +#define AT91C_MC_FWS_3FWS ((unsigned int) 0x3 << 8) // (MC) 4 cycles for Read, 4 for Write operations +#define AT91C_MC_FMCN ((unsigned int) 0xFF << 16) // (MC) Flash Microsecond Cycle Number +// -------- MC_FCR : (MC Offset: 0x64) MC Flash Command Register -------- +#define AT91C_MC_FCMD ((unsigned int) 0xF << 0) // (MC) Flash Command +#define AT91C_MC_FCMD_START_PROG ((unsigned int) 0x1) // (MC) Starts the programming of th epage specified by PAGEN. +#define AT91C_MC_FCMD_LOCK ((unsigned int) 0x2) // (MC) Starts a lock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. +#define AT91C_MC_FCMD_PROG_AND_LOCK ((unsigned int) 0x3) // (MC) The lock sequence automatically happens after the programming sequence is completed. +#define AT91C_MC_FCMD_UNLOCK ((unsigned int) 0x4) // (MC) Starts an unlock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. +#define AT91C_MC_FCMD_ERASE_ALL ((unsigned int) 0x8) // (MC) Starts the erase of the entire flash.If at least a page is locked, the command is cancelled. +#define AT91C_MC_FCMD_SET_GP_NVM ((unsigned int) 0xB) // (MC) Set General Purpose NVM bits. +#define AT91C_MC_FCMD_CLR_GP_NVM ((unsigned int) 0xD) // (MC) Clear General Purpose NVM bits. +#define AT91C_MC_FCMD_SET_SECURITY ((unsigned int) 0xF) // (MC) Set Security Bit. +#define AT91C_MC_PAGEN ((unsigned int) 0x3FF << 8) // (MC) Page Number +#define AT91C_MC_KEY ((unsigned int) 0xFF << 24) // (MC) Writing Protect Key +// -------- MC_FSR : (MC Offset: 0x68) MC Flash Command Register -------- +#define AT91C_MC_SECURITY ((unsigned int) 0x1 << 4) // (MC) Security Bit Status +#define AT91C_MC_GPNVM0 ((unsigned int) 0x1 << 8) // (MC) Sector 0 Lock Status +#define AT91C_MC_GPNVM1 ((unsigned int) 0x1 << 9) // (MC) Sector 1 Lock Status +#define AT91C_MC_GPNVM2 ((unsigned int) 0x1 << 10) // (MC) Sector 2 Lock Status +#define AT91C_MC_GPNVM3 ((unsigned int) 0x1 << 11) // (MC) Sector 3 Lock Status +#define AT91C_MC_GPNVM4 ((unsigned int) 0x1 << 12) // (MC) Sector 4 Lock Status +#define AT91C_MC_GPNVM5 ((unsigned int) 0x1 << 13) // (MC) Sector 5 Lock Status +#define AT91C_MC_GPNVM6 ((unsigned int) 0x1 << 14) // (MC) Sector 6 Lock Status +#define AT91C_MC_GPNVM7 ((unsigned int) 0x1 << 15) // (MC) Sector 7 Lock Status +#define AT91C_MC_LOCKS0 ((unsigned int) 0x1 << 16) // (MC) Sector 0 Lock Status +#define AT91C_MC_LOCKS1 ((unsigned int) 0x1 << 17) // (MC) Sector 1 Lock Status +#define AT91C_MC_LOCKS2 ((unsigned int) 0x1 << 18) // (MC) Sector 2 Lock Status +#define AT91C_MC_LOCKS3 ((unsigned int) 0x1 << 19) // (MC) Sector 3 Lock Status +#define AT91C_MC_LOCKS4 ((unsigned int) 0x1 << 20) // (MC) Sector 4 Lock Status +#define AT91C_MC_LOCKS5 ((unsigned int) 0x1 << 21) // (MC) Sector 5 Lock Status +#define AT91C_MC_LOCKS6 ((unsigned int) 0x1 << 22) // (MC) Sector 6 Lock Status +#define AT91C_MC_LOCKS7 ((unsigned int) 0x1 << 23) // (MC) Sector 7 Lock Status +#define AT91C_MC_LOCKS8 ((unsigned int) 0x1 << 24) // (MC) Sector 8 Lock Status +#define AT91C_MC_LOCKS9 ((unsigned int) 0x1 << 25) // (MC) Sector 9 Lock Status +#define AT91C_MC_LOCKS10 ((unsigned int) 0x1 << 26) // (MC) Sector 10 Lock Status +#define AT91C_MC_LOCKS11 ((unsigned int) 0x1 << 27) // (MC) Sector 11 Lock Status +#define AT91C_MC_LOCKS12 ((unsigned int) 0x1 << 28) // (MC) Sector 12 Lock Status +#define AT91C_MC_LOCKS13 ((unsigned int) 0x1 << 29) // (MC) Sector 13 Lock Status +#define AT91C_MC_LOCKS14 ((unsigned int) 0x1 << 30) // (MC) Sector 14 Lock Status +#define AT91C_MC_LOCKS15 ((unsigned int) 0x1 << 31) // (MC) Sector 15 Lock Status + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Serial Parallel Interface +// ***************************************************************************** +typedef struct _AT91S_SPI { + AT91_REG SPI_CR; // Control Register + AT91_REG SPI_MR; // Mode Register + AT91_REG SPI_RDR; // Receive Data Register + AT91_REG SPI_TDR; // Transmit Data Register + AT91_REG SPI_SR; // Status Register + AT91_REG SPI_IER; // Interrupt Enable Register + AT91_REG SPI_IDR; // Interrupt Disable Register + AT91_REG SPI_IMR; // Interrupt Mask Register + AT91_REG Reserved0[4]; // + AT91_REG SPI_CSR[4]; // Chip Select Register + AT91_REG Reserved1[48]; // + AT91_REG SPI_RPR; // Receive Pointer Register + AT91_REG SPI_RCR; // Receive Counter Register + AT91_REG SPI_TPR; // Transmit Pointer Register + AT91_REG SPI_TCR; // Transmit Counter Register + AT91_REG SPI_RNPR; // Receive Next Pointer Register + AT91_REG SPI_RNCR; // Receive Next Counter Register + AT91_REG SPI_TNPR; // Transmit Next Pointer Register + AT91_REG SPI_TNCR; // Transmit Next Counter Register + AT91_REG SPI_PTCR; // PDC Transfer Control Register + AT91_REG SPI_PTSR; // PDC Transfer Status Register +} AT91S_SPI, *AT91PS_SPI; + +// -------- SPI_CR : (SPI Offset: 0x0) SPI Control Register -------- +#define AT91C_SPI_SPIEN ((unsigned int) 0x1 << 0) // (SPI) SPI Enable +#define AT91C_SPI_SPIDIS ((unsigned int) 0x1 << 1) // (SPI) SPI Disable +#define AT91C_SPI_SWRST ((unsigned int) 0x1 << 7) // (SPI) SPI Software reset +#define AT91C_SPI_LASTXFER ((unsigned int) 0x1 << 24) // (SPI) SPI Last Transfer +// -------- SPI_MR : (SPI Offset: 0x4) SPI Mode Register -------- +#define AT91C_SPI_MSTR ((unsigned int) 0x1 << 0) // (SPI) Master/Slave Mode +#define AT91C_SPI_PS ((unsigned int) 0x1 << 1) // (SPI) Peripheral Select +#define AT91C_SPI_PS_FIXED ((unsigned int) 0x0 << 1) // (SPI) Fixed Peripheral Select +#define AT91C_SPI_PS_VARIABLE ((unsigned int) 0x1 << 1) // (SPI) Variable Peripheral Select +#define AT91C_SPI_PCSDEC ((unsigned int) 0x1 << 2) // (SPI) Chip Select Decode +#define AT91C_SPI_FDIV ((unsigned int) 0x1 << 3) // (SPI) Clock Selection +#define AT91C_SPI_MODFDIS ((unsigned int) 0x1 << 4) // (SPI) Mode Fault Detection +#define AT91C_SPI_LLB ((unsigned int) 0x1 << 7) // (SPI) Clock Selection +#define AT91C_SPI_PCS ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select +#define AT91C_SPI_DLYBCS ((unsigned int) 0xFF << 24) // (SPI) Delay Between Chip Selects +// -------- SPI_RDR : (SPI Offset: 0x8) Receive Data Register -------- +#define AT91C_SPI_RD ((unsigned int) 0xFFFF << 0) // (SPI) Receive Data +#define AT91C_SPI_RPCS ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select Status +// -------- SPI_TDR : (SPI Offset: 0xc) Transmit Data Register -------- +#define AT91C_SPI_TD ((unsigned int) 0xFFFF << 0) // (SPI) Transmit Data +#define AT91C_SPI_TPCS ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select Status +// -------- SPI_SR : (SPI Offset: 0x10) Status Register -------- +#define AT91C_SPI_RDRF ((unsigned int) 0x1 << 0) // (SPI) Receive Data Register Full +#define AT91C_SPI_TDRE ((unsigned int) 0x1 << 1) // (SPI) Transmit Data Register Empty +#define AT91C_SPI_MODF ((unsigned int) 0x1 << 2) // (SPI) Mode Fault Error +#define AT91C_SPI_OVRES ((unsigned int) 0x1 << 3) // (SPI) Overrun Error Status +#define AT91C_SPI_ENDRX ((unsigned int) 0x1 << 4) // (SPI) End of Receiver Transfer +#define AT91C_SPI_ENDTX ((unsigned int) 0x1 << 5) // (SPI) End of Receiver Transfer +#define AT91C_SPI_RXBUFF ((unsigned int) 0x1 << 6) // (SPI) RXBUFF Interrupt +#define AT91C_SPI_TXBUFE ((unsigned int) 0x1 << 7) // (SPI) TXBUFE Interrupt +#define AT91C_SPI_NSSR ((unsigned int) 0x1 << 8) // (SPI) NSSR Interrupt +#define AT91C_SPI_TXEMPTY ((unsigned int) 0x1 << 9) // (SPI) TXEMPTY Interrupt +#define AT91C_SPI_SPIENS ((unsigned int) 0x1 << 16) // (SPI) Enable Status +// -------- SPI_IER : (SPI Offset: 0x14) Interrupt Enable Register -------- +// -------- SPI_IDR : (SPI Offset: 0x18) Interrupt Disable Register -------- +// -------- SPI_IMR : (SPI Offset: 0x1c) Interrupt Mask Register -------- +// -------- SPI_CSR : (SPI Offset: 0x30) Chip Select Register -------- +#define AT91C_SPI_CPOL ((unsigned int) 0x1 << 0) // (SPI) Clock Polarity +#define AT91C_SPI_NCPHA ((unsigned int) 0x1 << 1) // (SPI) Clock Phase +#define AT91C_SPI_CSAAT ((unsigned int) 0x1 << 3) // (SPI) Chip Select Active After Transfer +#define AT91C_SPI_BITS ((unsigned int) 0xF << 4) // (SPI) Bits Per Transfer +#define AT91C_SPI_BITS_8 ((unsigned int) 0x0 << 4) // (SPI) 8 Bits Per transfer +#define AT91C_SPI_BITS_9 ((unsigned int) 0x1 << 4) // (SPI) 9 Bits Per transfer +#define AT91C_SPI_BITS_10 ((unsigned int) 0x2 << 4) // (SPI) 10 Bits Per transfer +#define AT91C_SPI_BITS_11 ((unsigned int) 0x3 << 4) // (SPI) 11 Bits Per transfer +#define AT91C_SPI_BITS_12 ((unsigned int) 0x4 << 4) // (SPI) 12 Bits Per transfer +#define AT91C_SPI_BITS_13 ((unsigned int) 0x5 << 4) // (SPI) 13 Bits Per transfer +#define AT91C_SPI_BITS_14 ((unsigned int) 0x6 << 4) // (SPI) 14 Bits Per transfer +#define AT91C_SPI_BITS_15 ((unsigned int) 0x7 << 4) // (SPI) 15 Bits Per transfer +#define AT91C_SPI_BITS_16 ((unsigned int) 0x8 << 4) // (SPI) 16 Bits Per transfer +#define AT91C_SPI_SCBR ((unsigned int) 0xFF << 8) // (SPI) Serial Clock Baud Rate +#define AT91C_SPI_DLYBS ((unsigned int) 0xFF << 16) // (SPI) Delay Before SPCK +#define AT91C_SPI_DLYBCT ((unsigned int) 0xFF << 24) // (SPI) Delay Between Consecutive Transfers + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Usart +// ***************************************************************************** +typedef struct _AT91S_USART { + AT91_REG US_CR; // Control Register + AT91_REG US_MR; // Mode Register + AT91_REG US_IER; // Interrupt Enable Register + AT91_REG US_IDR; // Interrupt Disable Register + AT91_REG US_IMR; // Interrupt Mask Register + AT91_REG US_CSR; // Channel Status Register + AT91_REG US_RHR; // Receiver Holding Register + AT91_REG US_THR; // Transmitter Holding Register + AT91_REG US_BRGR; // Baud Rate Generator Register + AT91_REG US_RTOR; // Receiver Time-out Register + AT91_REG US_TTGR; // Transmitter Time-guard Register + AT91_REG Reserved0[5]; // + AT91_REG US_FIDI; // FI_DI_Ratio Register + AT91_REG US_NER; // Nb Errors Register + AT91_REG Reserved1[1]; // + AT91_REG US_IF; // IRDA_FILTER Register + AT91_REG Reserved2[44]; // + AT91_REG US_RPR; // Receive Pointer Register + AT91_REG US_RCR; // Receive Counter Register + AT91_REG US_TPR; // Transmit Pointer Register + AT91_REG US_TCR; // Transmit Counter Register + AT91_REG US_RNPR; // Receive Next Pointer Register + AT91_REG US_RNCR; // Receive Next Counter Register + AT91_REG US_TNPR; // Transmit Next Pointer Register + AT91_REG US_TNCR; // Transmit Next Counter Register + AT91_REG US_PTCR; // PDC Transfer Control Register + AT91_REG US_PTSR; // PDC Transfer Status Register +} AT91S_USART, *AT91PS_USART; + +// -------- US_CR : (USART Offset: 0x0) Debug Unit Control Register -------- +#define AT91C_US_STTBRK ((unsigned int) 0x1 << 9) // (USART) Start Break +#define AT91C_US_STPBRK ((unsigned int) 0x1 << 10) // (USART) Stop Break +#define AT91C_US_STTTO ((unsigned int) 0x1 << 11) // (USART) Start Time-out +#define AT91C_US_SENDA ((unsigned int) 0x1 << 12) // (USART) Send Address +#define AT91C_US_RSTIT ((unsigned int) 0x1 << 13) // (USART) Reset Iterations +#define AT91C_US_RSTNACK ((unsigned int) 0x1 << 14) // (USART) Reset Non Acknowledge +#define AT91C_US_RETTO ((unsigned int) 0x1 << 15) // (USART) Rearm Time-out +#define AT91C_US_DTREN ((unsigned int) 0x1 << 16) // (USART) Data Terminal ready Enable +#define AT91C_US_DTRDIS ((unsigned int) 0x1 << 17) // (USART) Data Terminal ready Disable +#define AT91C_US_RTSEN ((unsigned int) 0x1 << 18) // (USART) Request to Send enable +#define AT91C_US_RTSDIS ((unsigned int) 0x1 << 19) // (USART) Request to Send Disable +// -------- US_MR : (USART Offset: 0x4) Debug Unit Mode Register -------- +#define AT91C_US_USMODE ((unsigned int) 0xF << 0) // (USART) Usart mode +#define AT91C_US_USMODE_NORMAL ((unsigned int) 0x0) // (USART) Normal +#define AT91C_US_USMODE_RS485 ((unsigned int) 0x1) // (USART) RS485 +#define AT91C_US_USMODE_HWHSH ((unsigned int) 0x2) // (USART) Hardware Handshaking +#define AT91C_US_USMODE_MODEM ((unsigned int) 0x3) // (USART) Modem +#define AT91C_US_USMODE_ISO7816_0 ((unsigned int) 0x4) // (USART) ISO7816 protocol: T = 0 +#define AT91C_US_USMODE_ISO7816_1 ((unsigned int) 0x6) // (USART) ISO7816 protocol: T = 1 +#define AT91C_US_USMODE_IRDA ((unsigned int) 0x8) // (USART) IrDA +#define AT91C_US_USMODE_SWHSH ((unsigned int) 0xC) // (USART) Software Handshaking +#define AT91C_US_CLKS ((unsigned int) 0x3 << 4) // (USART) Clock Selection (Baud Rate generator Input Clock +#define AT91C_US_CLKS_CLOCK ((unsigned int) 0x0 << 4) // (USART) Clock +#define AT91C_US_CLKS_FDIV1 ((unsigned int) 0x1 << 4) // (USART) fdiv1 +#define AT91C_US_CLKS_SLOW ((unsigned int) 0x2 << 4) // (USART) slow_clock (ARM) +#define AT91C_US_CLKS_EXT ((unsigned int) 0x3 << 4) // (USART) External (SCK) +#define AT91C_US_CHRL ((unsigned int) 0x3 << 6) // (USART) Clock Selection (Baud Rate generator Input Clock +#define AT91C_US_CHRL_5_BITS ((unsigned int) 0x0 << 6) // (USART) Character Length: 5 bits +#define AT91C_US_CHRL_6_BITS ((unsigned int) 0x1 << 6) // (USART) Character Length: 6 bits +#define AT91C_US_CHRL_7_BITS ((unsigned int) 0x2 << 6) // (USART) Character Length: 7 bits +#define AT91C_US_CHRL_8_BITS ((unsigned int) 0x3 << 6) // (USART) Character Length: 8 bits +#define AT91C_US_SYNC ((unsigned int) 0x1 << 8) // (USART) Synchronous Mode Select +#define AT91C_US_NBSTOP ((unsigned int) 0x3 << 12) // (USART) Number of Stop bits +#define AT91C_US_NBSTOP_1_BIT ((unsigned int) 0x0 << 12) // (USART) 1 stop bit +#define AT91C_US_NBSTOP_15_BIT ((unsigned int) 0x1 << 12) // (USART) Asynchronous (SYNC=0) 2 stop bits Synchronous (SYNC=1) 2 stop bits +#define AT91C_US_NBSTOP_2_BIT ((unsigned int) 0x2 << 12) // (USART) 2 stop bits +#define AT91C_US_MSBF ((unsigned int) 0x1 << 16) // (USART) Bit Order +#define AT91C_US_MODE9 ((unsigned int) 0x1 << 17) // (USART) 9-bit Character length +#define AT91C_US_CKLO ((unsigned int) 0x1 << 18) // (USART) Clock Output Select +#define AT91C_US_OVER ((unsigned int) 0x1 << 19) // (USART) Over Sampling Mode +#define AT91C_US_INACK ((unsigned int) 0x1 << 20) // (USART) Inhibit Non Acknowledge +#define AT91C_US_DSNACK ((unsigned int) 0x1 << 21) // (USART) Disable Successive NACK +#define AT91C_US_MAX_ITER ((unsigned int) 0x1 << 24) // (USART) Number of Repetitions +#define AT91C_US_FILTER ((unsigned int) 0x1 << 28) // (USART) Receive Line Filter +// -------- US_IER : (USART Offset: 0x8) Debug Unit Interrupt Enable Register -------- +#define AT91C_US_RXBRK ((unsigned int) 0x1 << 2) // (USART) Break Received/End of Break +#define AT91C_US_TIMEOUT ((unsigned int) 0x1 << 8) // (USART) Receiver Time-out +#define AT91C_US_ITERATION ((unsigned int) 0x1 << 10) // (USART) Max number of Repetitions Reached +#define AT91C_US_NACK ((unsigned int) 0x1 << 13) // (USART) Non Acknowledge +#define AT91C_US_RIIC ((unsigned int) 0x1 << 16) // (USART) Ring INdicator Input Change Flag +#define AT91C_US_DSRIC ((unsigned int) 0x1 << 17) // (USART) Data Set Ready Input Change Flag +#define AT91C_US_DCDIC ((unsigned int) 0x1 << 18) // (USART) Data Carrier Flag +#define AT91C_US_CTSIC ((unsigned int) 0x1 << 19) // (USART) Clear To Send Input Change Flag +// -------- US_IDR : (USART Offset: 0xc) Debug Unit Interrupt Disable Register -------- +// -------- US_IMR : (USART Offset: 0x10) Debug Unit Interrupt Mask Register -------- +// -------- US_CSR : (USART Offset: 0x14) Debug Unit Channel Status Register -------- +#define AT91C_US_RI ((unsigned int) 0x1 << 20) // (USART) Image of RI Input +#define AT91C_US_DSR ((unsigned int) 0x1 << 21) // (USART) Image of DSR Input +#define AT91C_US_DCD ((unsigned int) 0x1 << 22) // (USART) Image of DCD Input +#define AT91C_US_CTS ((unsigned int) 0x1 << 23) // (USART) Image of CTS Input + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Synchronous Serial Controller Interface +// ***************************************************************************** +typedef struct _AT91S_SSC { + AT91_REG SSC_CR; // Control Register + AT91_REG SSC_CMR; // Clock Mode Register + AT91_REG Reserved0[2]; // + AT91_REG SSC_RCMR; // Receive Clock ModeRegister + AT91_REG SSC_RFMR; // Receive Frame Mode Register + AT91_REG SSC_TCMR; // Transmit Clock Mode Register + AT91_REG SSC_TFMR; // Transmit Frame Mode Register + AT91_REG SSC_RHR; // Receive Holding Register + AT91_REG SSC_THR; // Transmit Holding Register + AT91_REG Reserved1[2]; // + AT91_REG SSC_RSHR; // Receive Sync Holding Register + AT91_REG SSC_TSHR; // Transmit Sync Holding Register + AT91_REG Reserved2[2]; // + AT91_REG SSC_SR; // Status Register + AT91_REG SSC_IER; // Interrupt Enable Register + AT91_REG SSC_IDR; // Interrupt Disable Register + AT91_REG SSC_IMR; // Interrupt Mask Register + AT91_REG Reserved3[44]; // + AT91_REG SSC_RPR; // Receive Pointer Register + AT91_REG SSC_RCR; // Receive Counter Register + AT91_REG SSC_TPR; // Transmit Pointer Register + AT91_REG SSC_TCR; // Transmit Counter Register + AT91_REG SSC_RNPR; // Receive Next Pointer Register + AT91_REG SSC_RNCR; // Receive Next Counter Register + AT91_REG SSC_TNPR; // Transmit Next Pointer Register + AT91_REG SSC_TNCR; // Transmit Next Counter Register + AT91_REG SSC_PTCR; // PDC Transfer Control Register + AT91_REG SSC_PTSR; // PDC Transfer Status Register +} AT91S_SSC, *AT91PS_SSC; + +// -------- SSC_CR : (SSC Offset: 0x0) SSC Control Register -------- +#define AT91C_SSC_RXEN ((unsigned int) 0x1 << 0) // (SSC) Receive Enable +#define AT91C_SSC_RXDIS ((unsigned int) 0x1 << 1) // (SSC) Receive Disable +#define AT91C_SSC_TXEN ((unsigned int) 0x1 << 8) // (SSC) Transmit Enable +#define AT91C_SSC_TXDIS ((unsigned int) 0x1 << 9) // (SSC) Transmit Disable +#define AT91C_SSC_SWRST ((unsigned int) 0x1 << 15) // (SSC) Software Reset +// -------- SSC_RCMR : (SSC Offset: 0x10) SSC Receive Clock Mode Register -------- +#define AT91C_SSC_CKS ((unsigned int) 0x3 << 0) // (SSC) Receive/Transmit Clock Selection +#define AT91C_SSC_CKS_DIV ((unsigned int) 0x0) // (SSC) Divided Clock +#define AT91C_SSC_CKS_TK ((unsigned int) 0x1) // (SSC) TK Clock signal +#define AT91C_SSC_CKS_RK ((unsigned int) 0x2) // (SSC) RK pin +#define AT91C_SSC_CKO ((unsigned int) 0x7 << 2) // (SSC) Receive/Transmit Clock Output Mode Selection +#define AT91C_SSC_CKO_NONE ((unsigned int) 0x0 << 2) // (SSC) Receive/Transmit Clock Output Mode: None RK pin: Input-only +#define AT91C_SSC_CKO_CONTINOUS ((unsigned int) 0x1 << 2) // (SSC) Continuous Receive/Transmit Clock RK pin: Output +#define AT91C_SSC_CKO_DATA_TX ((unsigned int) 0x2 << 2) // (SSC) Receive/Transmit Clock only during data transfers RK pin: Output +#define AT91C_SSC_CKI ((unsigned int) 0x1 << 5) // (SSC) Receive/Transmit Clock Inversion +#define AT91C_SSC_START ((unsigned int) 0xF << 8) // (SSC) Receive/Transmit Start Selection +#define AT91C_SSC_START_CONTINOUS ((unsigned int) 0x0 << 8) // (SSC) Continuous, as soon as the receiver is enabled, and immediately after the end of transfer of the previous data. +#define AT91C_SSC_START_TX ((unsigned int) 0x1 << 8) // (SSC) Transmit/Receive start +#define AT91C_SSC_START_LOW_RF ((unsigned int) 0x2 << 8) // (SSC) Detection of a low level on RF input +#define AT91C_SSC_START_HIGH_RF ((unsigned int) 0x3 << 8) // (SSC) Detection of a high level on RF input +#define AT91C_SSC_START_FALL_RF ((unsigned int) 0x4 << 8) // (SSC) Detection of a falling edge on RF input +#define AT91C_SSC_START_RISE_RF ((unsigned int) 0x5 << 8) // (SSC) Detection of a rising edge on RF input +#define AT91C_SSC_START_LEVEL_RF ((unsigned int) 0x6 << 8) // (SSC) Detection of any level change on RF input +#define AT91C_SSC_START_EDGE_RF ((unsigned int) 0x7 << 8) // (SSC) Detection of any edge on RF input +#define AT91C_SSC_START_0 ((unsigned int) 0x8 << 8) // (SSC) Compare 0 +#define AT91C_SSC_STTDLY ((unsigned int) 0xFF << 16) // (SSC) Receive/Transmit Start Delay +#define AT91C_SSC_PERIOD ((unsigned int) 0xFF << 24) // (SSC) Receive/Transmit Period Divider Selection +// -------- SSC_RFMR : (SSC Offset: 0x14) SSC Receive Frame Mode Register -------- +#define AT91C_SSC_DATLEN ((unsigned int) 0x1F << 0) // (SSC) Data Length +#define AT91C_SSC_LOOP ((unsigned int) 0x1 << 5) // (SSC) Loop Mode +#define AT91C_SSC_MSBF ((unsigned int) 0x1 << 7) // (SSC) Most Significant Bit First +#define AT91C_SSC_DATNB ((unsigned int) 0xF << 8) // (SSC) Data Number per Frame +#define AT91C_SSC_FSLEN ((unsigned int) 0xF << 16) // (SSC) Receive/Transmit Frame Sync length +#define AT91C_SSC_FSOS ((unsigned int) 0x7 << 20) // (SSC) Receive/Transmit Frame Sync Output Selection +#define AT91C_SSC_FSOS_NONE ((unsigned int) 0x0 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: None RK pin Input-only +#define AT91C_SSC_FSOS_NEGATIVE ((unsigned int) 0x1 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Negative Pulse +#define AT91C_SSC_FSOS_POSITIVE ((unsigned int) 0x2 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Positive Pulse +#define AT91C_SSC_FSOS_LOW ((unsigned int) 0x3 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver Low during data transfer +#define AT91C_SSC_FSOS_HIGH ((unsigned int) 0x4 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver High during data transfer +#define AT91C_SSC_FSOS_TOGGLE ((unsigned int) 0x5 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Toggling at each start of data transfer +#define AT91C_SSC_FSEDGE ((unsigned int) 0x1 << 24) // (SSC) Frame Sync Edge Detection +// -------- SSC_TCMR : (SSC Offset: 0x18) SSC Transmit Clock Mode Register -------- +// -------- SSC_TFMR : (SSC Offset: 0x1c) SSC Transmit Frame Mode Register -------- +#define AT91C_SSC_DATDEF ((unsigned int) 0x1 << 5) // (SSC) Data Default Value +#define AT91C_SSC_FSDEN ((unsigned int) 0x1 << 23) // (SSC) Frame Sync Data Enable +// -------- SSC_SR : (SSC Offset: 0x40) SSC Status Register -------- +#define AT91C_SSC_TXRDY ((unsigned int) 0x1 << 0) // (SSC) Transmit Ready +#define AT91C_SSC_TXEMPTY ((unsigned int) 0x1 << 1) // (SSC) Transmit Empty +#define AT91C_SSC_ENDTX ((unsigned int) 0x1 << 2) // (SSC) End Of Transmission +#define AT91C_SSC_TXBUFE ((unsigned int) 0x1 << 3) // (SSC) Transmit Buffer Empty +#define AT91C_SSC_RXRDY ((unsigned int) 0x1 << 4) // (SSC) Receive Ready +#define AT91C_SSC_OVRUN ((unsigned int) 0x1 << 5) // (SSC) Receive Overrun +#define AT91C_SSC_ENDRX ((unsigned int) 0x1 << 6) // (SSC) End of Reception +#define AT91C_SSC_RXBUFF ((unsigned int) 0x1 << 7) // (SSC) Receive Buffer Full +#define AT91C_SSC_TXSYN ((unsigned int) 0x1 << 10) // (SSC) Transmit Sync +#define AT91C_SSC_RXSYN ((unsigned int) 0x1 << 11) // (SSC) Receive Sync +#define AT91C_SSC_TXENA ((unsigned int) 0x1 << 16) // (SSC) Transmit Enable +#define AT91C_SSC_RXENA ((unsigned int) 0x1 << 17) // (SSC) Receive Enable +// -------- SSC_IER : (SSC Offset: 0x44) SSC Interrupt Enable Register -------- +// -------- SSC_IDR : (SSC Offset: 0x48) SSC Interrupt Disable Register -------- +// -------- SSC_IMR : (SSC Offset: 0x4c) SSC Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Two-wire Interface +// ***************************************************************************** +typedef struct _AT91S_TWI { + AT91_REG TWI_CR; // Control Register + AT91_REG TWI_MMR; // Master Mode Register + AT91_REG Reserved0[1]; // + AT91_REG TWI_IADR; // Internal Address Register + AT91_REG TWI_CWGR; // Clock Waveform Generator Register + AT91_REG Reserved1[3]; // + AT91_REG TWI_SR; // Status Register + AT91_REG TWI_IER; // Interrupt Enable Register + AT91_REG TWI_IDR; // Interrupt Disable Register + AT91_REG TWI_IMR; // Interrupt Mask Register + AT91_REG TWI_RHR; // Receive Holding Register + AT91_REG TWI_THR; // Transmit Holding Register +} AT91S_TWI, *AT91PS_TWI; + +// -------- TWI_CR : (TWI Offset: 0x0) TWI Control Register -------- +#define AT91C_TWI_START ((unsigned int) 0x1 << 0) // (TWI) Send a START Condition +#define AT91C_TWI_STOP ((unsigned int) 0x1 << 1) // (TWI) Send a STOP Condition +#define AT91C_TWI_MSEN ((unsigned int) 0x1 << 2) // (TWI) TWI Master Transfer Enabled +#define AT91C_TWI_MSDIS ((unsigned int) 0x1 << 3) // (TWI) TWI Master Transfer Disabled +#define AT91C_TWI_SWRST ((unsigned int) 0x1 << 7) // (TWI) Software Reset +// -------- TWI_MMR : (TWI Offset: 0x4) TWI Master Mode Register -------- +#define AT91C_TWI_IADRSZ ((unsigned int) 0x3 << 8) // (TWI) Internal Device Address Size +#define AT91C_TWI_IADRSZ_NO ((unsigned int) 0x0 << 8) // (TWI) No internal device address +#define AT91C_TWI_IADRSZ_1_BYTE ((unsigned int) 0x1 << 8) // (TWI) One-byte internal device address +#define AT91C_TWI_IADRSZ_2_BYTE ((unsigned int) 0x2 << 8) // (TWI) Two-byte internal device address +#define AT91C_TWI_IADRSZ_3_BYTE ((unsigned int) 0x3 << 8) // (TWI) Three-byte internal device address +#define AT91C_TWI_MREAD ((unsigned int) 0x1 << 12) // (TWI) Master Read Direction +#define AT91C_TWI_DADR ((unsigned int) 0x7F << 16) // (TWI) Device Address +// -------- TWI_CWGR : (TWI Offset: 0x10) TWI Clock Waveform Generator Register -------- +#define AT91C_TWI_CLDIV ((unsigned int) 0xFF << 0) // (TWI) Clock Low Divider +#define AT91C_TWI_CHDIV ((unsigned int) 0xFF << 8) // (TWI) Clock High Divider +#define AT91C_TWI_CKDIV ((unsigned int) 0x7 << 16) // (TWI) Clock Divider +// -------- TWI_SR : (TWI Offset: 0x20) TWI Status Register -------- +#define AT91C_TWI_TXCOMP ((unsigned int) 0x1 << 0) // (TWI) Transmission Completed +#define AT91C_TWI_RXRDY ((unsigned int) 0x1 << 1) // (TWI) Receive holding register ReaDY +#define AT91C_TWI_TXRDY ((unsigned int) 0x1 << 2) // (TWI) Transmit holding register ReaDY +#define AT91C_TWI_OVRE ((unsigned int) 0x1 << 6) // (TWI) Overrun Error +#define AT91C_TWI_UNRE ((unsigned int) 0x1 << 7) // (TWI) Underrun Error +#define AT91C_TWI_NACK ((unsigned int) 0x1 << 8) // (TWI) Not Acknowledged +// -------- TWI_IER : (TWI Offset: 0x24) TWI Interrupt Enable Register -------- +// -------- TWI_IDR : (TWI Offset: 0x28) TWI Interrupt Disable Register -------- +// -------- TWI_IMR : (TWI Offset: 0x2c) TWI Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR PWMC Channel Interface +// ***************************************************************************** +typedef struct _AT91S_PWMC_CH { + AT91_REG PWMC_CMR; // Channel Mode Register + AT91_REG PWMC_CDTYR; // Channel Duty Cycle Register + AT91_REG PWMC_CPRDR; // Channel Period Register + AT91_REG PWMC_CCNTR; // Channel Counter Register + AT91_REG PWMC_CUPDR; // Channel Update Register + AT91_REG PWMC_Reserved[3]; // Reserved +} AT91S_PWMC_CH, *AT91PS_PWMC_CH; + +// -------- PWMC_CMR : (PWMC_CH Offset: 0x0) PWMC Channel Mode Register -------- +#define AT91C_PWMC_CPRE ((unsigned int) 0xF << 0) // (PWMC_CH) Channel Pre-scaler : PWMC_CLKx +#define AT91C_PWMC_CPRE_MCK ((unsigned int) 0x0) // (PWMC_CH) +#define AT91C_PWMC_CPRE_MCKA ((unsigned int) 0xB) // (PWMC_CH) +#define AT91C_PWMC_CPRE_MCKB ((unsigned int) 0xC) // (PWMC_CH) +#define AT91C_PWMC_CALG ((unsigned int) 0x1 << 8) // (PWMC_CH) Channel Alignment +#define AT91C_PWMC_CPOL ((unsigned int) 0x1 << 9) // (PWMC_CH) Channel Polarity +#define AT91C_PWMC_CPD ((unsigned int) 0x1 << 10) // (PWMC_CH) Channel Update Period +// -------- PWMC_CDTYR : (PWMC_CH Offset: 0x4) PWMC Channel Duty Cycle Register -------- +#define AT91C_PWMC_CDTY ((unsigned int) 0x0 << 0) // (PWMC_CH) Channel Duty Cycle +// -------- PWMC_CPRDR : (PWMC_CH Offset: 0x8) PWMC Channel Period Register -------- +#define AT91C_PWMC_CPRD ((unsigned int) 0x0 << 0) // (PWMC_CH) Channel Period +// -------- PWMC_CCNTR : (PWMC_CH Offset: 0xc) PWMC Channel Counter Register -------- +#define AT91C_PWMC_CCNT ((unsigned int) 0x0 << 0) // (PWMC_CH) Channel Counter +// -------- PWMC_CUPDR : (PWMC_CH Offset: 0x10) PWMC Channel Update Register -------- +#define AT91C_PWMC_CUPD ((unsigned int) 0x0 << 0) // (PWMC_CH) Channel Update + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Pulse Width Modulation Controller Interface +// ***************************************************************************** +typedef struct _AT91S_PWMC { + AT91_REG PWMC_MR; // PWMC Mode Register + AT91_REG PWMC_ENA; // PWMC Enable Register + AT91_REG PWMC_DIS; // PWMC Disable Register + AT91_REG PWMC_SR; // PWMC Status Register + AT91_REG PWMC_IER; // PWMC Interrupt Enable Register + AT91_REG PWMC_IDR; // PWMC Interrupt Disable Register + AT91_REG PWMC_IMR; // PWMC Interrupt Mask Register + AT91_REG PWMC_ISR; // PWMC Interrupt Status Register + AT91_REG Reserved0[55]; // + AT91_REG PWMC_VR; // PWMC Version Register + AT91_REG Reserved1[64]; // + AT91S_PWMC_CH PWMC_CH[4]; // PWMC Channel +} AT91S_PWMC, *AT91PS_PWMC; + +// -------- PWMC_MR : (PWMC Offset: 0x0) PWMC Mode Register -------- +#define AT91C_PWMC_DIVA ((unsigned int) 0xFF << 0) // (PWMC) CLKA divide factor. +#define AT91C_PWMC_PREA ((unsigned int) 0xF << 8) // (PWMC) Divider Input Clock Prescaler A +#define AT91C_PWMC_PREA_MCK ((unsigned int) 0x0 << 8) // (PWMC) +#define AT91C_PWMC_DIVB ((unsigned int) 0xFF << 16) // (PWMC) CLKB divide factor. +#define AT91C_PWMC_PREB ((unsigned int) 0xF << 24) // (PWMC) Divider Input Clock Prescaler B +#define AT91C_PWMC_PREB_MCK ((unsigned int) 0x0 << 24) // (PWMC) +// -------- PWMC_ENA : (PWMC Offset: 0x4) PWMC Enable Register -------- +#define AT91C_PWMC_CHID0 ((unsigned int) 0x1 << 0) // (PWMC) Channel ID 0 +#define AT91C_PWMC_CHID1 ((unsigned int) 0x1 << 1) // (PWMC) Channel ID 1 +#define AT91C_PWMC_CHID2 ((unsigned int) 0x1 << 2) // (PWMC) Channel ID 2 +#define AT91C_PWMC_CHID3 ((unsigned int) 0x1 << 3) // (PWMC) Channel ID 3 +// -------- PWMC_DIS : (PWMC Offset: 0x8) PWMC Disable Register -------- +// -------- PWMC_SR : (PWMC Offset: 0xc) PWMC Status Register -------- +// -------- PWMC_IER : (PWMC Offset: 0x10) PWMC Interrupt Enable Register -------- +// -------- PWMC_IDR : (PWMC Offset: 0x14) PWMC Interrupt Disable Register -------- +// -------- PWMC_IMR : (PWMC Offset: 0x18) PWMC Interrupt Mask Register -------- +// -------- PWMC_ISR : (PWMC Offset: 0x1c) PWMC Interrupt Status Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR USB Device Interface +// ***************************************************************************** +typedef struct _AT91S_UDP { + AT91_REG UDP_NUM; // Frame Number Register + AT91_REG UDP_GLBSTATE; // Global State Register + AT91_REG UDP_FADDR; // Function Address Register + AT91_REG Reserved0[1]; // + AT91_REG UDP_IER; // Interrupt Enable Register + AT91_REG UDP_IDR; // Interrupt Disable Register + AT91_REG UDP_IMR; // Interrupt Mask Register + AT91_REG UDP_ISR; // Interrupt Status Register + AT91_REG UDP_ICR; // Interrupt Clear Register + AT91_REG Reserved1[1]; // + AT91_REG UDP_RSTEP; // Reset Endpoint Register + AT91_REG Reserved2[1]; // + AT91_REG UDP_CSR[6]; // Endpoint Control and Status Register + AT91_REG Reserved3[2]; // + AT91_REG UDP_FDR[6]; // Endpoint FIFO Data Register + AT91_REG Reserved4[3]; // + AT91_REG UDP_TXVC; // Transceiver Control Register +} AT91S_UDP, *AT91PS_UDP; + +// -------- UDP_FRM_NUM : (UDP Offset: 0x0) USB Frame Number Register -------- +#define AT91C_UDP_FRM_NUM ((unsigned int) 0x7FF << 0) // (UDP) Frame Number as Defined in the Packet Field Formats +#define AT91C_UDP_FRM_ERR ((unsigned int) 0x1 << 16) // (UDP) Frame Error +#define AT91C_UDP_FRM_OK ((unsigned int) 0x1 << 17) // (UDP) Frame OK +// -------- UDP_GLB_STATE : (UDP Offset: 0x4) USB Global State Register -------- +#define AT91C_UDP_FADDEN ((unsigned int) 0x1 << 0) // (UDP) Function Address Enable +#define AT91C_UDP_CONFG ((unsigned int) 0x1 << 1) // (UDP) Configured +#define AT91C_UDP_ESR ((unsigned int) 0x1 << 2) // (UDP) Enable Send Resume +#define AT91C_UDP_RSMINPR ((unsigned int) 0x1 << 3) // (UDP) A Resume Has Been Sent to the Host +#define AT91C_UDP_RMWUPE ((unsigned int) 0x1 << 4) // (UDP) Remote Wake Up Enable +// -------- UDP_FADDR : (UDP Offset: 0x8) USB Function Address Register -------- +#define AT91C_UDP_FADD ((unsigned int) 0xFF << 0) // (UDP) Function Address Value +#define AT91C_UDP_FEN ((unsigned int) 0x1 << 8) // (UDP) Function Enable +// -------- UDP_IER : (UDP Offset: 0x10) USB Interrupt Enable Register -------- +#define AT91C_UDP_EPINT0 ((unsigned int) 0x1 << 0) // (UDP) Endpoint 0 Interrupt +#define AT91C_UDP_EPINT1 ((unsigned int) 0x1 << 1) // (UDP) Endpoint 0 Interrupt +#define AT91C_UDP_EPINT2 ((unsigned int) 0x1 << 2) // (UDP) Endpoint 2 Interrupt +#define AT91C_UDP_EPINT3 ((unsigned int) 0x1 << 3) // (UDP) Endpoint 3 Interrupt +#define AT91C_UDP_EPINT4 ((unsigned int) 0x1 << 4) // (UDP) Endpoint 4 Interrupt +#define AT91C_UDP_EPINT5 ((unsigned int) 0x1 << 5) // (UDP) Endpoint 5 Interrupt +#define AT91C_UDP_RXSUSP ((unsigned int) 0x1 << 8) // (UDP) USB Suspend Interrupt +#define AT91C_UDP_RXRSM ((unsigned int) 0x1 << 9) // (UDP) USB Resume Interrupt +#define AT91C_UDP_EXTRSM ((unsigned int) 0x1 << 10) // (UDP) USB External Resume Interrupt +#define AT91C_UDP_SOFINT ((unsigned int) 0x1 << 11) // (UDP) USB Start Of frame Interrupt +#define AT91C_UDP_WAKEUP ((unsigned int) 0x1 << 13) // (UDP) USB Resume Interrupt +// -------- UDP_IDR : (UDP Offset: 0x14) USB Interrupt Disable Register -------- +// -------- UDP_IMR : (UDP Offset: 0x18) USB Interrupt Mask Register -------- +// -------- UDP_ISR : (UDP Offset: 0x1c) USB Interrupt Status Register -------- +#define AT91C_UDP_ENDBUSRES ((unsigned int) 0x1 << 12) // (UDP) USB End Of Bus Reset Interrupt +// -------- UDP_ICR : (UDP Offset: 0x20) USB Interrupt Clear Register -------- +// -------- UDP_RST_EP : (UDP Offset: 0x28) USB Reset Endpoint Register -------- +#define AT91C_UDP_EP0 ((unsigned int) 0x1 << 0) // (UDP) Reset Endpoint 0 +#define AT91C_UDP_EP1 ((unsigned int) 0x1 << 1) // (UDP) Reset Endpoint 1 +#define AT91C_UDP_EP2 ((unsigned int) 0x1 << 2) // (UDP) Reset Endpoint 2 +#define AT91C_UDP_EP3 ((unsigned int) 0x1 << 3) // (UDP) Reset Endpoint 3 +#define AT91C_UDP_EP4 ((unsigned int) 0x1 << 4) // (UDP) Reset Endpoint 4 +#define AT91C_UDP_EP5 ((unsigned int) 0x1 << 5) // (UDP) Reset Endpoint 5 +// -------- UDP_CSR : (UDP Offset: 0x30) USB Endpoint Control and Status Register -------- +#define AT91C_UDP_TXCOMP ((unsigned int) 0x1 << 0) // (UDP) Generates an IN packet with data previously written in the DPR +#define AT91C_UDP_RX_DATA_BK0 ((unsigned int) 0x1 << 1) // (UDP) Receive Data Bank 0 +#define AT91C_UDP_RXSETUP ((unsigned int) 0x1 << 2) // (UDP) Sends STALL to the Host (Control endpoints) +#define AT91C_UDP_ISOERROR ((unsigned int) 0x1 << 3) // (UDP) Isochronous error (Isochronous endpoints) +#define AT91C_UDP_TXPKTRDY ((unsigned int) 0x1 << 4) // (UDP) Transmit Packet Ready +#define AT91C_UDP_FORCESTALL ((unsigned int) 0x1 << 5) // (UDP) Force Stall (used by Control, Bulk and Isochronous endpoints). +#define AT91C_UDP_RX_DATA_BK1 ((unsigned int) 0x1 << 6) // (UDP) Receive Data Bank 1 (only used by endpoints with ping-pong attributes). +#define AT91C_UDP_DIR ((unsigned int) 0x1 << 7) // (UDP) Transfer Direction +#define AT91C_UDP_EPTYPE ((unsigned int) 0x7 << 8) // (UDP) Endpoint type +#define AT91C_UDP_EPTYPE_CTRL ((unsigned int) 0x0 << 8) // (UDP) Control +#define AT91C_UDP_EPTYPE_ISO_OUT ((unsigned int) 0x1 << 8) // (UDP) Isochronous OUT +#define AT91C_UDP_EPTYPE_BULK_OUT ((unsigned int) 0x2 << 8) // (UDP) Bulk OUT +#define AT91C_UDP_EPTYPE_INT_OUT ((unsigned int) 0x3 << 8) // (UDP) Interrupt OUT +#define AT91C_UDP_EPTYPE_ISO_IN ((unsigned int) 0x5 << 8) // (UDP) Isochronous IN +#define AT91C_UDP_EPTYPE_BULK_IN ((unsigned int) 0x6 << 8) // (UDP) Bulk IN +#define AT91C_UDP_EPTYPE_INT_IN ((unsigned int) 0x7 << 8) // (UDP) Interrupt IN +#define AT91C_UDP_DTGLE ((unsigned int) 0x1 << 11) // (UDP) Data Toggle +#define AT91C_UDP_EPEDS ((unsigned int) 0x1 << 15) // (UDP) Endpoint Enable Disable +#define AT91C_UDP_RXBYTECNT ((unsigned int) 0x7FF << 16) // (UDP) Number Of Bytes Available in the FIFO +// -------- UDP_TXVC : (UDP Offset: 0x74) Transceiver Control Register -------- +#define AT91C_UDP_TXVDIS ((unsigned int) 0x1 << 8) // (UDP) +#define AT91C_UDP_PUON ((unsigned int) 0x1 << 9) // (UDP) Pull-up ON + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Timer Counter Channel Interface +// ***************************************************************************** +typedef struct _AT91S_TC { + AT91_REG TC_CCR; // Channel Control Register + AT91_REG TC_CMR; // Channel Mode Register (Capture Mode / Waveform Mode) + AT91_REG Reserved0[2]; // + AT91_REG TC_CV; // Counter Value + AT91_REG TC_RA; // Register A + AT91_REG TC_RB; // Register B + AT91_REG TC_RC; // Register C + AT91_REG TC_SR; // Status Register + AT91_REG TC_IER; // Interrupt Enable Register + AT91_REG TC_IDR; // Interrupt Disable Register + AT91_REG TC_IMR; // Interrupt Mask Register +} AT91S_TC, *AT91PS_TC; + +// -------- TC_CCR : (TC Offset: 0x0) TC Channel Control Register -------- +#define AT91C_TC_CLKEN ((unsigned int) 0x1 << 0) // (TC) Counter Clock Enable Command +#define AT91C_TC_CLKDIS ((unsigned int) 0x1 << 1) // (TC) Counter Clock Disable Command +#define AT91C_TC_SWTRG ((unsigned int) 0x1 << 2) // (TC) Software Trigger Command +// -------- TC_CMR : (TC Offset: 0x4) TC Channel Mode Register: Capture Mode / Waveform Mode -------- +#define AT91C_TC_CLKS ((unsigned int) 0x7 << 0) // (TC) Clock Selection +#define AT91C_TC_CLKS_TIMER_DIV1_CLOCK ((unsigned int) 0x0) // (TC) Clock selected: TIMER_DIV1_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV2_CLOCK ((unsigned int) 0x1) // (TC) Clock selected: TIMER_DIV2_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV3_CLOCK ((unsigned int) 0x2) // (TC) Clock selected: TIMER_DIV3_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV4_CLOCK ((unsigned int) 0x3) // (TC) Clock selected: TIMER_DIV4_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV5_CLOCK ((unsigned int) 0x4) // (TC) Clock selected: TIMER_DIV5_CLOCK +#define AT91C_TC_CLKS_XC0 ((unsigned int) 0x5) // (TC) Clock selected: XC0 +#define AT91C_TC_CLKS_XC1 ((unsigned int) 0x6) // (TC) Clock selected: XC1 +#define AT91C_TC_CLKS_XC2 ((unsigned int) 0x7) // (TC) Clock selected: XC2 +#define AT91C_TC_CLKI ((unsigned int) 0x1 << 3) // (TC) Clock Invert +#define AT91C_TC_BURST ((unsigned int) 0x3 << 4) // (TC) Burst Signal Selection +#define AT91C_TC_BURST_NONE ((unsigned int) 0x0 << 4) // (TC) The clock is not gated by an external signal +#define AT91C_TC_BURST_XC0 ((unsigned int) 0x1 << 4) // (TC) XC0 is ANDed with the selected clock +#define AT91C_TC_BURST_XC1 ((unsigned int) 0x2 << 4) // (TC) XC1 is ANDed with the selected clock +#define AT91C_TC_BURST_XC2 ((unsigned int) 0x3 << 4) // (TC) XC2 is ANDed with the selected clock +#define AT91C_TC_CPCSTOP ((unsigned int) 0x1 << 6) // (TC) Counter Clock Stopped with RC Compare +#define AT91C_TC_LDBSTOP ((unsigned int) 0x1 << 6) // (TC) Counter Clock Stopped with RB Loading +#define AT91C_TC_CPCDIS ((unsigned int) 0x1 << 7) // (TC) Counter Clock Disable with RC Compare +#define AT91C_TC_LDBDIS ((unsigned int) 0x1 << 7) // (TC) Counter Clock Disabled with RB Loading +#define AT91C_TC_ETRGEDG ((unsigned int) 0x3 << 8) // (TC) External Trigger Edge Selection +#define AT91C_TC_ETRGEDG_NONE ((unsigned int) 0x0 << 8) // (TC) Edge: None +#define AT91C_TC_ETRGEDG_RISING ((unsigned int) 0x1 << 8) // (TC) Edge: rising edge +#define AT91C_TC_ETRGEDG_FALLING ((unsigned int) 0x2 << 8) // (TC) Edge: falling edge +#define AT91C_TC_ETRGEDG_BOTH ((unsigned int) 0x3 << 8) // (TC) Edge: each edge +#define AT91C_TC_EEVTEDG ((unsigned int) 0x3 << 8) // (TC) External Event Edge Selection +#define AT91C_TC_EEVTEDG_NONE ((unsigned int) 0x0 << 8) // (TC) Edge: None +#define AT91C_TC_EEVTEDG_RISING ((unsigned int) 0x1 << 8) // (TC) Edge: rising edge +#define AT91C_TC_EEVTEDG_FALLING ((unsigned int) 0x2 << 8) // (TC) Edge: falling edge +#define AT91C_TC_EEVTEDG_BOTH ((unsigned int) 0x3 << 8) // (TC) Edge: each edge +#define AT91C_TC_EEVT ((unsigned int) 0x3 << 10) // (TC) External Event Selection +#define AT91C_TC_EEVT_TIOB ((unsigned int) 0x0 << 10) // (TC) Signal selected as external event: TIOB TIOB direction: input +#define AT91C_TC_EEVT_XC0 ((unsigned int) 0x1 << 10) // (TC) Signal selected as external event: XC0 TIOB direction: output +#define AT91C_TC_EEVT_XC1 ((unsigned int) 0x2 << 10) // (TC) Signal selected as external event: XC1 TIOB direction: output +#define AT91C_TC_EEVT_XC2 ((unsigned int) 0x3 << 10) // (TC) Signal selected as external event: XC2 TIOB direction: output +#define AT91C_TC_ABETRG ((unsigned int) 0x1 << 10) // (TC) TIOA or TIOB External Trigger Selection +#define AT91C_TC_ENETRG ((unsigned int) 0x1 << 12) // (TC) External Event Trigger enable +#define AT91C_TC_WAVESEL ((unsigned int) 0x3 << 13) // (TC) Waveform Selection +#define AT91C_TC_WAVESEL_UP ((unsigned int) 0x0 << 13) // (TC) UP mode without atomatic trigger on RC Compare +#define AT91C_TC_WAVESEL_UPDOWN ((unsigned int) 0x1 << 13) // (TC) UPDOWN mode without automatic trigger on RC Compare +#define AT91C_TC_WAVESEL_UP_AUTO ((unsigned int) 0x2 << 13) // (TC) UP mode with automatic trigger on RC Compare +#define AT91C_TC_WAVESEL_UPDOWN_AUTO ((unsigned int) 0x3 << 13) // (TC) UPDOWN mode with automatic trigger on RC Compare +#define AT91C_TC_CPCTRG ((unsigned int) 0x1 << 14) // (TC) RC Compare Trigger Enable +#define AT91C_TC_WAVE ((unsigned int) 0x1 << 15) // (TC) +#define AT91C_TC_ACPA ((unsigned int) 0x3 << 16) // (TC) RA Compare Effect on TIOA +#define AT91C_TC_ACPA_NONE ((unsigned int) 0x0 << 16) // (TC) Effect: none +#define AT91C_TC_ACPA_SET ((unsigned int) 0x1 << 16) // (TC) Effect: set +#define AT91C_TC_ACPA_CLEAR ((unsigned int) 0x2 << 16) // (TC) Effect: clear +#define AT91C_TC_ACPA_TOGGLE ((unsigned int) 0x3 << 16) // (TC) Effect: toggle +#define AT91C_TC_LDRA ((unsigned int) 0x3 << 16) // (TC) RA Loading Selection +#define AT91C_TC_LDRA_NONE ((unsigned int) 0x0 << 16) // (TC) Edge: None +#define AT91C_TC_LDRA_RISING ((unsigned int) 0x1 << 16) // (TC) Edge: rising edge of TIOA +#define AT91C_TC_LDRA_FALLING ((unsigned int) 0x2 << 16) // (TC) Edge: falling edge of TIOA +#define AT91C_TC_LDRA_BOTH ((unsigned int) 0x3 << 16) // (TC) Edge: each edge of TIOA +#define AT91C_TC_ACPC ((unsigned int) 0x3 << 18) // (TC) RC Compare Effect on TIOA +#define AT91C_TC_ACPC_NONE ((unsigned int) 0x0 << 18) // (TC) Effect: none +#define AT91C_TC_ACPC_SET ((unsigned int) 0x1 << 18) // (TC) Effect: set +#define AT91C_TC_ACPC_CLEAR ((unsigned int) 0x2 << 18) // (TC) Effect: clear +#define AT91C_TC_ACPC_TOGGLE ((unsigned int) 0x3 << 18) // (TC) Effect: toggle +#define AT91C_TC_LDRB ((unsigned int) 0x3 << 18) // (TC) RB Loading Selection +#define AT91C_TC_LDRB_NONE ((unsigned int) 0x0 << 18) // (TC) Edge: None +#define AT91C_TC_LDRB_RISING ((unsigned int) 0x1 << 18) // (TC) Edge: rising edge of TIOA +#define AT91C_TC_LDRB_FALLING ((unsigned int) 0x2 << 18) // (TC) Edge: falling edge of TIOA +#define AT91C_TC_LDRB_BOTH ((unsigned int) 0x3 << 18) // (TC) Edge: each edge of TIOA +#define AT91C_TC_AEEVT ((unsigned int) 0x3 << 20) // (TC) External Event Effect on TIOA +#define AT91C_TC_AEEVT_NONE ((unsigned int) 0x0 << 20) // (TC) Effect: none +#define AT91C_TC_AEEVT_SET ((unsigned int) 0x1 << 20) // (TC) Effect: set +#define AT91C_TC_AEEVT_CLEAR ((unsigned int) 0x2 << 20) // (TC) Effect: clear +#define AT91C_TC_AEEVT_TOGGLE ((unsigned int) 0x3 << 20) // (TC) Effect: toggle +#define AT91C_TC_ASWTRG ((unsigned int) 0x3 << 22) // (TC) Software Trigger Effect on TIOA +#define AT91C_TC_ASWTRG_NONE ((unsigned int) 0x0 << 22) // (TC) Effect: none +#define AT91C_TC_ASWTRG_SET ((unsigned int) 0x1 << 22) // (TC) Effect: set +#define AT91C_TC_ASWTRG_CLEAR ((unsigned int) 0x2 << 22) // (TC) Effect: clear +#define AT91C_TC_ASWTRG_TOGGLE ((unsigned int) 0x3 << 22) // (TC) Effect: toggle +#define AT91C_TC_BCPB ((unsigned int) 0x3 << 24) // (TC) RB Compare Effect on TIOB +#define AT91C_TC_BCPB_NONE ((unsigned int) 0x0 << 24) // (TC) Effect: none +#define AT91C_TC_BCPB_SET ((unsigned int) 0x1 << 24) // (TC) Effect: set +#define AT91C_TC_BCPB_CLEAR ((unsigned int) 0x2 << 24) // (TC) Effect: clear +#define AT91C_TC_BCPB_TOGGLE ((unsigned int) 0x3 << 24) // (TC) Effect: toggle +#define AT91C_TC_BCPC ((unsigned int) 0x3 << 26) // (TC) RC Compare Effect on TIOB +#define AT91C_TC_BCPC_NONE ((unsigned int) 0x0 << 26) // (TC) Effect: none +#define AT91C_TC_BCPC_SET ((unsigned int) 0x1 << 26) // (TC) Effect: set +#define AT91C_TC_BCPC_CLEAR ((unsigned int) 0x2 << 26) // (TC) Effect: clear +#define AT91C_TC_BCPC_TOGGLE ((unsigned int) 0x3 << 26) // (TC) Effect: toggle +#define AT91C_TC_BEEVT ((unsigned int) 0x3 << 28) // (TC) External Event Effect on TIOB +#define AT91C_TC_BEEVT_NONE ((unsigned int) 0x0 << 28) // (TC) Effect: none +#define AT91C_TC_BEEVT_SET ((unsigned int) 0x1 << 28) // (TC) Effect: set +#define AT91C_TC_BEEVT_CLEAR ((unsigned int) 0x2 << 28) // (TC) Effect: clear +#define AT91C_TC_BEEVT_TOGGLE ((unsigned int) 0x3 << 28) // (TC) Effect: toggle +#define AT91C_TC_BSWTRG ((unsigned int) 0x3 << 30) // (TC) Software Trigger Effect on TIOB +#define AT91C_TC_BSWTRG_NONE ((unsigned int) 0x0 << 30) // (TC) Effect: none +#define AT91C_TC_BSWTRG_SET ((unsigned int) 0x1 << 30) // (TC) Effect: set +#define AT91C_TC_BSWTRG_CLEAR ((unsigned int) 0x2 << 30) // (TC) Effect: clear +#define AT91C_TC_BSWTRG_TOGGLE ((unsigned int) 0x3 << 30) // (TC) Effect: toggle +// -------- TC_SR : (TC Offset: 0x20) TC Channel Status Register -------- +#define AT91C_TC_COVFS ((unsigned int) 0x1 << 0) // (TC) Counter Overflow +#define AT91C_TC_LOVRS ((unsigned int) 0x1 << 1) // (TC) Load Overrun +#define AT91C_TC_CPAS ((unsigned int) 0x1 << 2) // (TC) RA Compare +#define AT91C_TC_CPBS ((unsigned int) 0x1 << 3) // (TC) RB Compare +#define AT91C_TC_CPCS ((unsigned int) 0x1 << 4) // (TC) RC Compare +#define AT91C_TC_LDRAS ((unsigned int) 0x1 << 5) // (TC) RA Loading +#define AT91C_TC_LDRBS ((unsigned int) 0x1 << 6) // (TC) RB Loading +#define AT91C_TC_ETRGS ((unsigned int) 0x1 << 7) // (TC) External Trigger +#define AT91C_TC_CLKSTA ((unsigned int) 0x1 << 16) // (TC) Clock Enabling +#define AT91C_TC_MTIOA ((unsigned int) 0x1 << 17) // (TC) TIOA Mirror +#define AT91C_TC_MTIOB ((unsigned int) 0x1 << 18) // (TC) TIOA Mirror +// -------- TC_IER : (TC Offset: 0x24) TC Channel Interrupt Enable Register -------- +// -------- TC_IDR : (TC Offset: 0x28) TC Channel Interrupt Disable Register -------- +// -------- TC_IMR : (TC Offset: 0x2c) TC Channel Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Timer Counter Interface +// ***************************************************************************** +typedef struct _AT91S_TCB { + AT91S_TC TCB_TC0; // TC Channel 0 + AT91_REG Reserved0[4]; // + AT91S_TC TCB_TC1; // TC Channel 1 + AT91_REG Reserved1[4]; // + AT91S_TC TCB_TC2; // TC Channel 2 + AT91_REG Reserved2[4]; // + AT91_REG TCB_BCR; // TC Block Control Register + AT91_REG TCB_BMR; // TC Block Mode Register +} AT91S_TCB, *AT91PS_TCB; + +// -------- TCB_BCR : (TCB Offset: 0xc0) TC Block Control Register -------- +#define AT91C_TCB_SYNC ((unsigned int) 0x1 << 0) // (TCB) Synchro Command +// -------- TCB_BMR : (TCB Offset: 0xc4) TC Block Mode Register -------- +#define AT91C_TCB_TC0XC0S ((unsigned int) 0x3 << 0) // (TCB) External Clock Signal 0 Selection +#define AT91C_TCB_TC0XC0S_TCLK0 ((unsigned int) 0x0) // (TCB) TCLK0 connected to XC0 +#define AT91C_TCB_TC0XC0S_NONE ((unsigned int) 0x1) // (TCB) None signal connected to XC0 +#define AT91C_TCB_TC0XC0S_TIOA1 ((unsigned int) 0x2) // (TCB) TIOA1 connected to XC0 +#define AT91C_TCB_TC0XC0S_TIOA2 ((unsigned int) 0x3) // (TCB) TIOA2 connected to XC0 +#define AT91C_TCB_TC1XC1S ((unsigned int) 0x3 << 2) // (TCB) External Clock Signal 1 Selection +#define AT91C_TCB_TC1XC1S_TCLK1 ((unsigned int) 0x0 << 2) // (TCB) TCLK1 connected to XC1 +#define AT91C_TCB_TC1XC1S_NONE ((unsigned int) 0x1 << 2) // (TCB) None signal connected to XC1 +#define AT91C_TCB_TC1XC1S_TIOA0 ((unsigned int) 0x2 << 2) // (TCB) TIOA0 connected to XC1 +#define AT91C_TCB_TC1XC1S_TIOA2 ((unsigned int) 0x3 << 2) // (TCB) TIOA2 connected to XC1 +#define AT91C_TCB_TC2XC2S ((unsigned int) 0x3 << 4) // (TCB) External Clock Signal 2 Selection +#define AT91C_TCB_TC2XC2S_TCLK2 ((unsigned int) 0x0 << 4) // (TCB) TCLK2 connected to XC2 +#define AT91C_TCB_TC2XC2S_NONE ((unsigned int) 0x1 << 4) // (TCB) None signal connected to XC2 +#define AT91C_TCB_TC2XC2S_TIOA0 ((unsigned int) 0x2 << 4) // (TCB) TIOA0 connected to XC2 +#define AT91C_TCB_TC2XC2S_TIOA1 ((unsigned int) 0x3 << 4) // (TCB) TIOA2 connected to XC2 + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Control Area Network MailBox Interface +// ***************************************************************************** +typedef struct _AT91S_CAN_MB { + AT91_REG CAN_MB_MMR; // MailBox Mode Register + AT91_REG CAN_MB_MAM; // MailBox Acceptance Mask Register + AT91_REG CAN_MB_MID; // MailBox ID Register + AT91_REG CAN_MB_MFID; // MailBox Family ID Register + AT91_REG CAN_MB_MSR; // MailBox Status Register + AT91_REG CAN_MB_MDL; // MailBox Data Low Register + AT91_REG CAN_MB_MDH; // MailBox Data High Register + AT91_REG CAN_MB_MCR; // MailBox Control Register +} AT91S_CAN_MB, *AT91PS_CAN_MB; + +// -------- CAN_MMR : (CAN_MB Offset: 0x0) CAN Message Mode Register -------- +#define AT91C_CAN_MTIMEMARK ((unsigned int) 0xFFFF << 0) // (CAN_MB) Mailbox Timemark +#define AT91C_CAN_PRIOR ((unsigned int) 0xF << 16) // (CAN_MB) Mailbox Priority +#define AT91C_CAN_MOT ((unsigned int) 0x7 << 24) // (CAN_MB) Mailbox Object Type +#define AT91C_CAN_MOT_DIS ((unsigned int) 0x0 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_RX ((unsigned int) 0x1 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_RXOVERWRITE ((unsigned int) 0x2 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_TX ((unsigned int) 0x3 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_CONSUMER ((unsigned int) 0x4 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_PRODUCER ((unsigned int) 0x5 << 24) // (CAN_MB) +// -------- CAN_MAM : (CAN_MB Offset: 0x4) CAN Message Acceptance Mask Register -------- +#define AT91C_CAN_MIDvB ((unsigned int) 0x3FFFF << 0) // (CAN_MB) Complementary bits for identifier in extended mode +#define AT91C_CAN_MIDvA ((unsigned int) 0x7FF << 18) // (CAN_MB) Identifier for standard frame mode +#define AT91C_CAN_MIDE ((unsigned int) 0x1 << 29) // (CAN_MB) Identifier Version +// -------- CAN_MID : (CAN_MB Offset: 0x8) CAN Message ID Register -------- +// -------- CAN_MFID : (CAN_MB Offset: 0xc) CAN Message Family ID Register -------- +// -------- CAN_MSR : (CAN_MB Offset: 0x10) CAN Message Status Register -------- +#define AT91C_CAN_MTIMESTAMP ((unsigned int) 0xFFFF << 0) // (CAN_MB) Timer Value +#define AT91C_CAN_MDLC ((unsigned int) 0xF << 16) // (CAN_MB) Mailbox Data Length Code +#define AT91C_CAN_MRTR ((unsigned int) 0x1 << 20) // (CAN_MB) Mailbox Remote Transmission Request +#define AT91C_CAN_MABT ((unsigned int) 0x1 << 22) // (CAN_MB) Mailbox Message Abort +#define AT91C_CAN_MRDY ((unsigned int) 0x1 << 23) // (CAN_MB) Mailbox Ready +#define AT91C_CAN_MMI ((unsigned int) 0x1 << 24) // (CAN_MB) Mailbox Message Ignored +// -------- CAN_MDL : (CAN_MB Offset: 0x14) CAN Message Data Low Register -------- +// -------- CAN_MDH : (CAN_MB Offset: 0x18) CAN Message Data High Register -------- +// -------- CAN_MCR : (CAN_MB Offset: 0x1c) CAN Message Control Register -------- +#define AT91C_CAN_MACR ((unsigned int) 0x1 << 22) // (CAN_MB) Abort Request for Mailbox +#define AT91C_CAN_MTCR ((unsigned int) 0x1 << 23) // (CAN_MB) Mailbox Transfer Command + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Control Area Network Interface +// ***************************************************************************** +typedef struct _AT91S_CAN { + AT91_REG CAN_MR; // Mode Register + AT91_REG CAN_IER; // Interrupt Enable Register + AT91_REG CAN_IDR; // Interrupt Disable Register + AT91_REG CAN_IMR; // Interrupt Mask Register + AT91_REG CAN_SR; // Status Register + AT91_REG CAN_BR; // Baudrate Register + AT91_REG CAN_TIM; // Timer Register + AT91_REG CAN_TIMESTP; // Time Stamp Register + AT91_REG CAN_ECR; // Error Counter Register + AT91_REG CAN_TCR; // Transfer Command Register + AT91_REG CAN_ACR; // Abort Command Register + AT91_REG Reserved0[52]; // + AT91_REG CAN_VR; // Version Register + AT91_REG Reserved1[64]; // + AT91S_CAN_MB CAN_MB0; // CAN Mailbox 0 + AT91S_CAN_MB CAN_MB1; // CAN Mailbox 1 + AT91S_CAN_MB CAN_MB2; // CAN Mailbox 2 + AT91S_CAN_MB CAN_MB3; // CAN Mailbox 3 + AT91S_CAN_MB CAN_MB4; // CAN Mailbox 4 + AT91S_CAN_MB CAN_MB5; // CAN Mailbox 5 + AT91S_CAN_MB CAN_MB6; // CAN Mailbox 6 + AT91S_CAN_MB CAN_MB7; // CAN Mailbox 7 + AT91S_CAN_MB CAN_MB8; // CAN Mailbox 8 + AT91S_CAN_MB CAN_MB9; // CAN Mailbox 9 + AT91S_CAN_MB CAN_MB10; // CAN Mailbox 10 + AT91S_CAN_MB CAN_MB11; // CAN Mailbox 11 + AT91S_CAN_MB CAN_MB12; // CAN Mailbox 12 + AT91S_CAN_MB CAN_MB13; // CAN Mailbox 13 + AT91S_CAN_MB CAN_MB14; // CAN Mailbox 14 + AT91S_CAN_MB CAN_MB15; // CAN Mailbox 15 +} AT91S_CAN, *AT91PS_CAN; + +// -------- CAN_MR : (CAN Offset: 0x0) CAN Mode Register -------- +#define AT91C_CAN_CANEN ((unsigned int) 0x1 << 0) // (CAN) CAN Controller Enable +#define AT91C_CAN_LPM ((unsigned int) 0x1 << 1) // (CAN) Disable/Enable Low Power Mode +#define AT91C_CAN_ABM ((unsigned int) 0x1 << 2) // (CAN) Disable/Enable Autobaud/Listen Mode +#define AT91C_CAN_OVL ((unsigned int) 0x1 << 3) // (CAN) Disable/Enable Overload Frame +#define AT91C_CAN_TEOF ((unsigned int) 0x1 << 4) // (CAN) Time Stamp messages at each end of Frame +#define AT91C_CAN_TTM ((unsigned int) 0x1 << 5) // (CAN) Disable/Enable Time Trigger Mode +#define AT91C_CAN_TIMFRZ ((unsigned int) 0x1 << 6) // (CAN) Enable Timer Freeze +#define AT91C_CAN_DRPT ((unsigned int) 0x1 << 7) // (CAN) Disable Repeat +// -------- CAN_IER : (CAN Offset: 0x4) CAN Interrupt Enable Register -------- +#define AT91C_CAN_MB0 ((unsigned int) 0x1 << 0) // (CAN) Mailbox 0 Flag +#define AT91C_CAN_MB1 ((unsigned int) 0x1 << 1) // (CAN) Mailbox 1 Flag +#define AT91C_CAN_MB2 ((unsigned int) 0x1 << 2) // (CAN) Mailbox 2 Flag +#define AT91C_CAN_MB3 ((unsigned int) 0x1 << 3) // (CAN) Mailbox 3 Flag +#define AT91C_CAN_MB4 ((unsigned int) 0x1 << 4) // (CAN) Mailbox 4 Flag +#define AT91C_CAN_MB5 ((unsigned int) 0x1 << 5) // (CAN) Mailbox 5 Flag +#define AT91C_CAN_MB6 ((unsigned int) 0x1 << 6) // (CAN) Mailbox 6 Flag +#define AT91C_CAN_MB7 ((unsigned int) 0x1 << 7) // (CAN) Mailbox 7 Flag +#define AT91C_CAN_MB8 ((unsigned int) 0x1 << 8) // (CAN) Mailbox 8 Flag +#define AT91C_CAN_MB9 ((unsigned int) 0x1 << 9) // (CAN) Mailbox 9 Flag +#define AT91C_CAN_MB10 ((unsigned int) 0x1 << 10) // (CAN) Mailbox 10 Flag +#define AT91C_CAN_MB11 ((unsigned int) 0x1 << 11) // (CAN) Mailbox 11 Flag +#define AT91C_CAN_MB12 ((unsigned int) 0x1 << 12) // (CAN) Mailbox 12 Flag +#define AT91C_CAN_MB13 ((unsigned int) 0x1 << 13) // (CAN) Mailbox 13 Flag +#define AT91C_CAN_MB14 ((unsigned int) 0x1 << 14) // (CAN) Mailbox 14 Flag +#define AT91C_CAN_MB15 ((unsigned int) 0x1 << 15) // (CAN) Mailbox 15 Flag +#define AT91C_CAN_ERRA ((unsigned int) 0x1 << 16) // (CAN) Error Active Mode Flag +#define AT91C_CAN_WARN ((unsigned int) 0x1 << 17) // (CAN) Warning Limit Flag +#define AT91C_CAN_ERRP ((unsigned int) 0x1 << 18) // (CAN) Error Passive Mode Flag +#define AT91C_CAN_BOFF ((unsigned int) 0x1 << 19) // (CAN) Bus Off Mode Flag +#define AT91C_CAN_SLEEP ((unsigned int) 0x1 << 20) // (CAN) Sleep Flag +#define AT91C_CAN_WAKEUP ((unsigned int) 0x1 << 21) // (CAN) Wakeup Flag +#define AT91C_CAN_TOVF ((unsigned int) 0x1 << 22) // (CAN) Timer Overflow Flag +#define AT91C_CAN_TSTP ((unsigned int) 0x1 << 23) // (CAN) Timestamp Flag +#define AT91C_CAN_CERR ((unsigned int) 0x1 << 24) // (CAN) CRC Error +#define AT91C_CAN_SERR ((unsigned int) 0x1 << 25) // (CAN) Stuffing Error +#define AT91C_CAN_AERR ((unsigned int) 0x1 << 26) // (CAN) Acknowledgment Error +#define AT91C_CAN_FERR ((unsigned int) 0x1 << 27) // (CAN) Form Error +#define AT91C_CAN_BERR ((unsigned int) 0x1 << 28) // (CAN) Bit Error +// -------- CAN_IDR : (CAN Offset: 0x8) CAN Interrupt Disable Register -------- +// -------- CAN_IMR : (CAN Offset: 0xc) CAN Interrupt Mask Register -------- +// -------- CAN_SR : (CAN Offset: 0x10) CAN Status Register -------- +#define AT91C_CAN_RBSY ((unsigned int) 0x1 << 29) // (CAN) Receiver Busy +#define AT91C_CAN_TBSY ((unsigned int) 0x1 << 30) // (CAN) Transmitter Busy +#define AT91C_CAN_OVLY ((unsigned int) 0x1 << 31) // (CAN) Overload Busy +// -------- CAN_BR : (CAN Offset: 0x14) CAN Baudrate Register -------- +#define AT91C_CAN_PHASE2 ((unsigned int) 0x7 << 0) // (CAN) Phase 2 segment +#define AT91C_CAN_PHASE1 ((unsigned int) 0x7 << 4) // (CAN) Phase 1 segment +#define AT91C_CAN_PROPAG ((unsigned int) 0x7 << 8) // (CAN) Programmation time segment +#define AT91C_CAN_SYNC ((unsigned int) 0x3 << 12) // (CAN) Re-synchronization jump width segment +#define AT91C_CAN_BRP ((unsigned int) 0x7F << 16) // (CAN) Baudrate Prescaler +#define AT91C_CAN_SMP ((unsigned int) 0x1 << 24) // (CAN) Sampling mode +// -------- CAN_TIM : (CAN Offset: 0x18) CAN Timer Register -------- +#define AT91C_CAN_TIMER ((unsigned int) 0xFFFF << 0) // (CAN) Timer field +// -------- CAN_TIMESTP : (CAN Offset: 0x1c) CAN Timestamp Register -------- +// -------- CAN_ECR : (CAN Offset: 0x20) CAN Error Counter Register -------- +#define AT91C_CAN_REC ((unsigned int) 0xFF << 0) // (CAN) Receive Error Counter +#define AT91C_CAN_TEC ((unsigned int) 0xFF << 16) // (CAN) Transmit Error Counter +// -------- CAN_TCR : (CAN Offset: 0x24) CAN Transfer Command Register -------- +#define AT91C_CAN_TIMRST ((unsigned int) 0x1 << 31) // (CAN) Timer Reset Field +// -------- CAN_ACR : (CAN Offset: 0x28) CAN Abort Command Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Ethernet MAC 10/100 +// ***************************************************************************** +typedef struct _AT91S_EMAC { + AT91_REG EMAC_NCR; // Network Control Register + AT91_REG EMAC_NCFGR; // Network Configuration Register + AT91_REG EMAC_NSR; // Network Status Register + AT91_REG Reserved0[2]; // + AT91_REG EMAC_TSR; // Transmit Status Register + AT91_REG EMAC_RBQP; // Receive Buffer Queue Pointer + AT91_REG EMAC_TBQP; // Transmit Buffer Queue Pointer + AT91_REG EMAC_RSR; // Receive Status Register + AT91_REG EMAC_ISR; // Interrupt Status Register + AT91_REG EMAC_IER; // Interrupt Enable Register + AT91_REG EMAC_IDR; // Interrupt Disable Register + AT91_REG EMAC_IMR; // Interrupt Mask Register + AT91_REG EMAC_MAN; // PHY Maintenance Register + AT91_REG EMAC_PTR; // Pause Time Register + AT91_REG EMAC_PFR; // Pause Frames received Register + AT91_REG EMAC_FTO; // Frames Transmitted OK Register + AT91_REG EMAC_SCF; // Single Collision Frame Register + AT91_REG EMAC_MCF; // Multiple Collision Frame Register + AT91_REG EMAC_FRO; // Frames Received OK Register + AT91_REG EMAC_FCSE; // Frame Check Sequence Error Register + AT91_REG EMAC_ALE; // Alignment Error Register + AT91_REG EMAC_DTF; // Deferred Transmission Frame Register + AT91_REG EMAC_LCOL; // Late Collision Register + AT91_REG EMAC_ECOL; // Excessive Collision Register + AT91_REG EMAC_TUND; // Transmit Underrun Error Register + AT91_REG EMAC_CSE; // Carrier Sense Error Register + AT91_REG EMAC_RRE; // Receive Ressource Error Register + AT91_REG EMAC_ROV; // Receive Overrun Errors Register + AT91_REG EMAC_RSE; // Receive Symbol Errors Register + AT91_REG EMAC_ELE; // Excessive Length Errors Register + AT91_REG EMAC_RJA; // Receive Jabbers Register + AT91_REG EMAC_USF; // Undersize Frames Register + AT91_REG EMAC_STE; // SQE Test Error Register + AT91_REG EMAC_RLE; // Receive Length Field Mismatch Register + AT91_REG EMAC_TPF; // Transmitted Pause Frames Register + AT91_REG EMAC_HRB; // Hash Address Bottom[31:0] + AT91_REG EMAC_HRT; // Hash Address Top[63:32] + AT91_REG EMAC_SA1L; // Specific Address 1 Bottom, First 4 bytes + AT91_REG EMAC_SA1H; // Specific Address 1 Top, Last 2 bytes + AT91_REG EMAC_SA2L; // Specific Address 2 Bottom, First 4 bytes + AT91_REG EMAC_SA2H; // Specific Address 2 Top, Last 2 bytes + AT91_REG EMAC_SA3L; // Specific Address 3 Bottom, First 4 bytes + AT91_REG EMAC_SA3H; // Specific Address 3 Top, Last 2 bytes + AT91_REG EMAC_SA4L; // Specific Address 4 Bottom, First 4 bytes + AT91_REG EMAC_SA4H; // Specific Address 4 Top, Last 2 bytes + AT91_REG EMAC_TID; // Type ID Checking Register + AT91_REG EMAC_TPQ; // Transmit Pause Quantum Register + AT91_REG EMAC_USRIO; // USER Input/Output Register + AT91_REG EMAC_WOL; // Wake On LAN Register + AT91_REG Reserved1[13]; // + AT91_REG EMAC_REV; // Revision Register +} AT91S_EMAC, *AT91PS_EMAC; + +// -------- EMAC_NCR : (EMAC Offset: 0x0) -------- +#define AT91C_EMAC_LB ((unsigned int) 0x1 << 0) // (EMAC) Loopback. Optional. When set, loopback signal is at high level. +#define AT91C_EMAC_LLB ((unsigned int) 0x1 << 1) // (EMAC) Loopback local. +#define AT91C_EMAC_RE ((unsigned int) 0x1 << 2) // (EMAC) Receive enable. +#define AT91C_EMAC_TE ((unsigned int) 0x1 << 3) // (EMAC) Transmit enable. +#define AT91C_EMAC_MPE ((unsigned int) 0x1 << 4) // (EMAC) Management port enable. +#define AT91C_EMAC_CLRSTAT ((unsigned int) 0x1 << 5) // (EMAC) Clear statistics registers. +#define AT91C_EMAC_INCSTAT ((unsigned int) 0x1 << 6) // (EMAC) Increment statistics registers. +#define AT91C_EMAC_WESTAT ((unsigned int) 0x1 << 7) // (EMAC) Write enable for statistics registers. +#define AT91C_EMAC_BP ((unsigned int) 0x1 << 8) // (EMAC) Back pressure. +#define AT91C_EMAC_TSTART ((unsigned int) 0x1 << 9) // (EMAC) Start Transmission. +#define AT91C_EMAC_THALT ((unsigned int) 0x1 << 10) // (EMAC) Transmission Halt. +#define AT91C_EMAC_TPFR ((unsigned int) 0x1 << 11) // (EMAC) Transmit pause frame +#define AT91C_EMAC_TZQ ((unsigned int) 0x1 << 12) // (EMAC) Transmit zero quantum pause frame +// -------- EMAC_NCFGR : (EMAC Offset: 0x4) Network Configuration Register -------- +#define AT91C_EMAC_SPD ((unsigned int) 0x1 << 0) // (EMAC) Speed. +#define AT91C_EMAC_FD ((unsigned int) 0x1 << 1) // (EMAC) Full duplex. +#define AT91C_EMAC_JFRAME ((unsigned int) 0x1 << 3) // (EMAC) Jumbo Frames. +#define AT91C_EMAC_CAF ((unsigned int) 0x1 << 4) // (EMAC) Copy all frames. +#define AT91C_EMAC_NBC ((unsigned int) 0x1 << 5) // (EMAC) No broadcast. +#define AT91C_EMAC_MTI ((unsigned int) 0x1 << 6) // (EMAC) Multicast hash event enable +#define AT91C_EMAC_UNI ((unsigned int) 0x1 << 7) // (EMAC) Unicast hash enable. +#define AT91C_EMAC_BIG ((unsigned int) 0x1 << 8) // (EMAC) Receive 1522 bytes. +#define AT91C_EMAC_EAE ((unsigned int) 0x1 << 9) // (EMAC) External address match enable. +#define AT91C_EMAC_CLK ((unsigned int) 0x3 << 10) // (EMAC) +#define AT91C_EMAC_CLK_HCLK_8 ((unsigned int) 0x0 << 10) // (EMAC) HCLK divided by 8 +#define AT91C_EMAC_CLK_HCLK_16 ((unsigned int) 0x1 << 10) // (EMAC) HCLK divided by 16 +#define AT91C_EMAC_CLK_HCLK_32 ((unsigned int) 0x2 << 10) // (EMAC) HCLK divided by 32 +#define AT91C_EMAC_CLK_HCLK_64 ((unsigned int) 0x3 << 10) // (EMAC) HCLK divided by 64 +#define AT91C_EMAC_RTY ((unsigned int) 0x1 << 12) // (EMAC) +#define AT91C_EMAC_PAE ((unsigned int) 0x1 << 13) // (EMAC) +#define AT91C_EMAC_RBOF ((unsigned int) 0x3 << 14) // (EMAC) +#define AT91C_EMAC_RBOF_OFFSET_0 ((unsigned int) 0x0 << 14) // (EMAC) no offset from start of receive buffer +#define AT91C_EMAC_RBOF_OFFSET_1 ((unsigned int) 0x1 << 14) // (EMAC) one byte offset from start of receive buffer +#define AT91C_EMAC_RBOF_OFFSET_2 ((unsigned int) 0x2 << 14) // (EMAC) two bytes offset from start of receive buffer +#define AT91C_EMAC_RBOF_OFFSET_3 ((unsigned int) 0x3 << 14) // (EMAC) three bytes offset from start of receive buffer +#define AT91C_EMAC_RLCE ((unsigned int) 0x1 << 16) // (EMAC) Receive Length field Checking Enable +#define AT91C_EMAC_DRFCS ((unsigned int) 0x1 << 17) // (EMAC) Discard Receive FCS +#define AT91C_EMAC_EFRHD ((unsigned int) 0x1 << 18) // (EMAC) +#define AT91C_EMAC_IRXFCS ((unsigned int) 0x1 << 19) // (EMAC) Ignore RX FCS +// -------- EMAC_NSR : (EMAC Offset: 0x8) Network Status Register -------- +#define AT91C_EMAC_LINKR ((unsigned int) 0x1 << 0) // (EMAC) +#define AT91C_EMAC_MDIO ((unsigned int) 0x1 << 1) // (EMAC) +#define AT91C_EMAC_IDLE ((unsigned int) 0x1 << 2) // (EMAC) +// -------- EMAC_TSR : (EMAC Offset: 0x14) Transmit Status Register -------- +#define AT91C_EMAC_UBR ((unsigned int) 0x1 << 0) // (EMAC) +#define AT91C_EMAC_COL ((unsigned int) 0x1 << 1) // (EMAC) +#define AT91C_EMAC_RLES ((unsigned int) 0x1 << 2) // (EMAC) +#define AT91C_EMAC_TGO ((unsigned int) 0x1 << 3) // (EMAC) Transmit Go +#define AT91C_EMAC_BEX ((unsigned int) 0x1 << 4) // (EMAC) Buffers exhausted mid frame +#define AT91C_EMAC_COMP ((unsigned int) 0x1 << 5) // (EMAC) +#define AT91C_EMAC_UND ((unsigned int) 0x1 << 6) // (EMAC) +// -------- EMAC_RSR : (EMAC Offset: 0x20) Receive Status Register -------- +#define AT91C_EMAC_BNA ((unsigned int) 0x1 << 0) // (EMAC) +#define AT91C_EMAC_REC ((unsigned int) 0x1 << 1) // (EMAC) +#define AT91C_EMAC_OVR ((unsigned int) 0x1 << 2) // (EMAC) +// -------- EMAC_ISR : (EMAC Offset: 0x24) Interrupt Status Register -------- +#define AT91C_EMAC_MFD ((unsigned int) 0x1 << 0) // (EMAC) +#define AT91C_EMAC_RCOMP ((unsigned int) 0x1 << 1) // (EMAC) +#define AT91C_EMAC_RXUBR ((unsigned int) 0x1 << 2) // (EMAC) +#define AT91C_EMAC_TXUBR ((unsigned int) 0x1 << 3) // (EMAC) +#define AT91C_EMAC_TUNDR ((unsigned int) 0x1 << 4) // (EMAC) +#define AT91C_EMAC_RLEX ((unsigned int) 0x1 << 5) // (EMAC) +#define AT91C_EMAC_TXERR ((unsigned int) 0x1 << 6) // (EMAC) +#define AT91C_EMAC_TCOMP ((unsigned int) 0x1 << 7) // (EMAC) +#define AT91C_EMAC_LINK ((unsigned int) 0x1 << 9) // (EMAC) +#define AT91C_EMAC_ROVR ((unsigned int) 0x1 << 10) // (EMAC) +#define AT91C_EMAC_HRESP ((unsigned int) 0x1 << 11) // (EMAC) +#define AT91C_EMAC_PFRE ((unsigned int) 0x1 << 12) // (EMAC) +#define AT91C_EMAC_PTZ ((unsigned int) 0x1 << 13) // (EMAC) +// -------- EMAC_IER : (EMAC Offset: 0x28) Interrupt Enable Register -------- +// -------- EMAC_IDR : (EMAC Offset: 0x2c) Interrupt Disable Register -------- +// -------- EMAC_IMR : (EMAC Offset: 0x30) Interrupt Mask Register -------- +// -------- EMAC_MAN : (EMAC Offset: 0x34) PHY Maintenance Register -------- +#define AT91C_EMAC_DATA ((unsigned int) 0xFFFF << 0) // (EMAC) +#define AT91C_EMAC_CODE ((unsigned int) 0x3 << 16) // (EMAC) +#define AT91C_EMAC_REGA ((unsigned int) 0x1F << 18) // (EMAC) +#define AT91C_EMAC_PHYA ((unsigned int) 0x1F << 23) // (EMAC) +#define AT91C_EMAC_RW ((unsigned int) 0x3 << 28) // (EMAC) +#define AT91C_EMAC_SOF ((unsigned int) 0x3 << 30) // (EMAC) +// -------- EMAC_USRIO : (EMAC Offset: 0xc0) USER Input Output Register -------- +#define AT91C_EMAC_RMII ((unsigned int) 0x1 << 0) // (EMAC) Reduce MII +// -------- EMAC_WOL : (EMAC Offset: 0xc4) Wake On LAN Register -------- +#define AT91C_EMAC_IP ((unsigned int) 0xFFFF << 0) // (EMAC) ARP request IP address +#define AT91C_EMAC_MAG ((unsigned int) 0x1 << 16) // (EMAC) Magic packet event enable +#define AT91C_EMAC_ARP ((unsigned int) 0x1 << 17) // (EMAC) ARP request event enable +#define AT91C_EMAC_SA1 ((unsigned int) 0x1 << 18) // (EMAC) Specific address register 1 event enable +// -------- EMAC_REV : (EMAC Offset: 0xfc) Revision Register -------- +#define AT91C_EMAC_REVREF ((unsigned int) 0xFFFF << 0) // (EMAC) +#define AT91C_EMAC_PARTREF ((unsigned int) 0xFFFF << 16) // (EMAC) + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Analog to Digital Convertor +// ***************************************************************************** +typedef struct _AT91S_ADC { + AT91_REG ADC_CR; // ADC Control Register + AT91_REG ADC_MR; // ADC Mode Register + AT91_REG Reserved0[2]; // + AT91_REG ADC_CHER; // ADC Channel Enable Register + AT91_REG ADC_CHDR; // ADC Channel Disable Register + AT91_REG ADC_CHSR; // ADC Channel Status Register + AT91_REG ADC_SR; // ADC Status Register + AT91_REG ADC_LCDR; // ADC Last Converted Data Register + AT91_REG ADC_IER; // ADC Interrupt Enable Register + AT91_REG ADC_IDR; // ADC Interrupt Disable Register + AT91_REG ADC_IMR; // ADC Interrupt Mask Register + AT91_REG ADC_CDR0; // ADC Channel Data Register 0 + AT91_REG ADC_CDR1; // ADC Channel Data Register 1 + AT91_REG ADC_CDR2; // ADC Channel Data Register 2 + AT91_REG ADC_CDR3; // ADC Channel Data Register 3 + AT91_REG ADC_CDR4; // ADC Channel Data Register 4 + AT91_REG ADC_CDR5; // ADC Channel Data Register 5 + AT91_REG ADC_CDR6; // ADC Channel Data Register 6 + AT91_REG ADC_CDR7; // ADC Channel Data Register 7 + AT91_REG Reserved1[44]; // + AT91_REG ADC_RPR; // Receive Pointer Register + AT91_REG ADC_RCR; // Receive Counter Register + AT91_REG ADC_TPR; // Transmit Pointer Register + AT91_REG ADC_TCR; // Transmit Counter Register + AT91_REG ADC_RNPR; // Receive Next Pointer Register + AT91_REG ADC_RNCR; // Receive Next Counter Register + AT91_REG ADC_TNPR; // Transmit Next Pointer Register + AT91_REG ADC_TNCR; // Transmit Next Counter Register + AT91_REG ADC_PTCR; // PDC Transfer Control Register + AT91_REG ADC_PTSR; // PDC Transfer Status Register +} AT91S_ADC, *AT91PS_ADC; + +// -------- ADC_CR : (ADC Offset: 0x0) ADC Control Register -------- +#define AT91C_ADC_SWRST ((unsigned int) 0x1 << 0) // (ADC) Software Reset +#define AT91C_ADC_START ((unsigned int) 0x1 << 1) // (ADC) Start Conversion +// -------- ADC_MR : (ADC Offset: 0x4) ADC Mode Register -------- +#define AT91C_ADC_TRGEN ((unsigned int) 0x1 << 0) // (ADC) Trigger Enable +#define AT91C_ADC_TRGEN_DIS ((unsigned int) 0x0) // (ADC) Hradware triggers are disabled. Starting a conversion is only possible by software +#define AT91C_ADC_TRGEN_EN ((unsigned int) 0x1) // (ADC) Hardware trigger selected by TRGSEL field is enabled. +#define AT91C_ADC_TRGSEL ((unsigned int) 0x7 << 1) // (ADC) Trigger Selection +#define AT91C_ADC_TRGSEL_TIOA0 ((unsigned int) 0x0 << 1) // (ADC) Selected TRGSEL = TIAO0 +#define AT91C_ADC_TRGSEL_TIOA1 ((unsigned int) 0x1 << 1) // (ADC) Selected TRGSEL = TIAO1 +#define AT91C_ADC_TRGSEL_TIOA2 ((unsigned int) 0x2 << 1) // (ADC) Selected TRGSEL = TIAO2 +#define AT91C_ADC_TRGSEL_TIOA3 ((unsigned int) 0x3 << 1) // (ADC) Selected TRGSEL = TIAO3 +#define AT91C_ADC_TRGSEL_TIOA4 ((unsigned int) 0x4 << 1) // (ADC) Selected TRGSEL = TIAO4 +#define AT91C_ADC_TRGSEL_TIOA5 ((unsigned int) 0x5 << 1) // (ADC) Selected TRGSEL = TIAO5 +#define AT91C_ADC_TRGSEL_EXT ((unsigned int) 0x6 << 1) // (ADC) Selected TRGSEL = External Trigger +#define AT91C_ADC_LOWRES ((unsigned int) 0x1 << 4) // (ADC) Resolution. +#define AT91C_ADC_LOWRES_10_BIT ((unsigned int) 0x0 << 4) // (ADC) 10-bit resolution +#define AT91C_ADC_LOWRES_8_BIT ((unsigned int) 0x1 << 4) // (ADC) 8-bit resolution +#define AT91C_ADC_SLEEP ((unsigned int) 0x1 << 5) // (ADC) Sleep Mode +#define AT91C_ADC_SLEEP_NORMAL_MODE ((unsigned int) 0x0 << 5) // (ADC) Normal Mode +#define AT91C_ADC_SLEEP_MODE ((unsigned int) 0x1 << 5) // (ADC) Sleep Mode +#define AT91C_ADC_PRESCAL ((unsigned int) 0x3F << 8) // (ADC) Prescaler rate selection +#define AT91C_ADC_STARTUP ((unsigned int) 0x1F << 16) // (ADC) Startup Time +#define AT91C_ADC_SHTIM ((unsigned int) 0xF << 24) // (ADC) Sample & Hold Time +// -------- ADC_CHER : (ADC Offset: 0x10) ADC Channel Enable Register -------- +#define AT91C_ADC_CH0 ((unsigned int) 0x1 << 0) // (ADC) Channel 0 +#define AT91C_ADC_CH1 ((unsigned int) 0x1 << 1) // (ADC) Channel 1 +#define AT91C_ADC_CH2 ((unsigned int) 0x1 << 2) // (ADC) Channel 2 +#define AT91C_ADC_CH3 ((unsigned int) 0x1 << 3) // (ADC) Channel 3 +#define AT91C_ADC_CH4 ((unsigned int) 0x1 << 4) // (ADC) Channel 4 +#define AT91C_ADC_CH5 ((unsigned int) 0x1 << 5) // (ADC) Channel 5 +#define AT91C_ADC_CH6 ((unsigned int) 0x1 << 6) // (ADC) Channel 6 +#define AT91C_ADC_CH7 ((unsigned int) 0x1 << 7) // (ADC) Channel 7 +// -------- ADC_CHDR : (ADC Offset: 0x14) ADC Channel Disable Register -------- +// -------- ADC_CHSR : (ADC Offset: 0x18) ADC Channel Status Register -------- +// -------- ADC_SR : (ADC Offset: 0x1c) ADC Status Register -------- +#define AT91C_ADC_EOC0 ((unsigned int) 0x1 << 0) // (ADC) End of Conversion +#define AT91C_ADC_EOC1 ((unsigned int) 0x1 << 1) // (ADC) End of Conversion +#define AT91C_ADC_EOC2 ((unsigned int) 0x1 << 2) // (ADC) End of Conversion +#define AT91C_ADC_EOC3 ((unsigned int) 0x1 << 3) // (ADC) End of Conversion +#define AT91C_ADC_EOC4 ((unsigned int) 0x1 << 4) // (ADC) End of Conversion +#define AT91C_ADC_EOC5 ((unsigned int) 0x1 << 5) // (ADC) End of Conversion +#define AT91C_ADC_EOC6 ((unsigned int) 0x1 << 6) // (ADC) End of Conversion +#define AT91C_ADC_EOC7 ((unsigned int) 0x1 << 7) // (ADC) End of Conversion +#define AT91C_ADC_OVRE0 ((unsigned int) 0x1 << 8) // (ADC) Overrun Error +#define AT91C_ADC_OVRE1 ((unsigned int) 0x1 << 9) // (ADC) Overrun Error +#define AT91C_ADC_OVRE2 ((unsigned int) 0x1 << 10) // (ADC) Overrun Error +#define AT91C_ADC_OVRE3 ((unsigned int) 0x1 << 11) // (ADC) Overrun Error +#define AT91C_ADC_OVRE4 ((unsigned int) 0x1 << 12) // (ADC) Overrun Error +#define AT91C_ADC_OVRE5 ((unsigned int) 0x1 << 13) // (ADC) Overrun Error +#define AT91C_ADC_OVRE6 ((unsigned int) 0x1 << 14) // (ADC) Overrun Error +#define AT91C_ADC_OVRE7 ((unsigned int) 0x1 << 15) // (ADC) Overrun Error +#define AT91C_ADC_DRDY ((unsigned int) 0x1 << 16) // (ADC) Data Ready +#define AT91C_ADC_GOVRE ((unsigned int) 0x1 << 17) // (ADC) General Overrun +#define AT91C_ADC_ENDRX ((unsigned int) 0x1 << 18) // (ADC) End of Receiver Transfer +#define AT91C_ADC_RXBUFF ((unsigned int) 0x1 << 19) // (ADC) RXBUFF Interrupt +// -------- ADC_LCDR : (ADC Offset: 0x20) ADC Last Converted Data Register -------- +#define AT91C_ADC_LDATA ((unsigned int) 0x3FF << 0) // (ADC) Last Data Converted +// -------- ADC_IER : (ADC Offset: 0x24) ADC Interrupt Enable Register -------- +// -------- ADC_IDR : (ADC Offset: 0x28) ADC Interrupt Disable Register -------- +// -------- ADC_IMR : (ADC Offset: 0x2c) ADC Interrupt Mask Register -------- +// -------- ADC_CDR0 : (ADC Offset: 0x30) ADC Channel Data Register 0 -------- +#define AT91C_ADC_DATA ((unsigned int) 0x3FF << 0) // (ADC) Converted Data +// -------- ADC_CDR1 : (ADC Offset: 0x34) ADC Channel Data Register 1 -------- +// -------- ADC_CDR2 : (ADC Offset: 0x38) ADC Channel Data Register 2 -------- +// -------- ADC_CDR3 : (ADC Offset: 0x3c) ADC Channel Data Register 3 -------- +// -------- ADC_CDR4 : (ADC Offset: 0x40) ADC Channel Data Register 4 -------- +// -------- ADC_CDR5 : (ADC Offset: 0x44) ADC Channel Data Register 5 -------- +// -------- ADC_CDR6 : (ADC Offset: 0x48) ADC Channel Data Register 6 -------- +// -------- ADC_CDR7 : (ADC Offset: 0x4c) ADC Channel Data Register 7 -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Advanced Encryption Standard +// ***************************************************************************** +typedef struct _AT91S_AES { + AT91_REG AES_CR; // Control Register + AT91_REG AES_MR; // Mode Register + AT91_REG Reserved0[2]; // + AT91_REG AES_IER; // Interrupt Enable Register + AT91_REG AES_IDR; // Interrupt Disable Register + AT91_REG AES_IMR; // Interrupt Mask Register + AT91_REG AES_ISR; // Interrupt Status Register + AT91_REG AES_KEYWxR[4]; // Key Word x Register + AT91_REG Reserved1[4]; // + AT91_REG AES_IDATAxR[4]; // Input Data x Register + AT91_REG AES_ODATAxR[4]; // Output Data x Register + AT91_REG AES_IVxR[4]; // Initialization Vector x Register + AT91_REG Reserved2[35]; // + AT91_REG AES_VR; // AES Version Register + AT91_REG AES_RPR; // Receive Pointer Register + AT91_REG AES_RCR; // Receive Counter Register + AT91_REG AES_TPR; // Transmit Pointer Register + AT91_REG AES_TCR; // Transmit Counter Register + AT91_REG AES_RNPR; // Receive Next Pointer Register + AT91_REG AES_RNCR; // Receive Next Counter Register + AT91_REG AES_TNPR; // Transmit Next Pointer Register + AT91_REG AES_TNCR; // Transmit Next Counter Register + AT91_REG AES_PTCR; // PDC Transfer Control Register + AT91_REG AES_PTSR; // PDC Transfer Status Register +} AT91S_AES, *AT91PS_AES; + +// -------- AES_CR : (AES Offset: 0x0) Control Register -------- +#define AT91C_AES_START ((unsigned int) 0x1 << 0) // (AES) Starts Processing +#define AT91C_AES_SWRST ((unsigned int) 0x1 << 8) // (AES) Software Reset +#define AT91C_AES_LOADSEED ((unsigned int) 0x1 << 16) // (AES) Random Number Generator Seed Loading +// -------- AES_MR : (AES Offset: 0x4) Mode Register -------- +#define AT91C_AES_CIPHER ((unsigned int) 0x1 << 0) // (AES) Processing Mode +#define AT91C_AES_PROCDLY ((unsigned int) 0xF << 4) // (AES) Processing Delay +#define AT91C_AES_SMOD ((unsigned int) 0x3 << 8) // (AES) Start Mode +#define AT91C_AES_SMOD_MANUAL ((unsigned int) 0x0 << 8) // (AES) Manual Mode: The START bit in register AES_CR must be set to begin encryption or decryption. +#define AT91C_AES_SMOD_AUTO ((unsigned int) 0x1 << 8) // (AES) Auto Mode: no action in AES_CR is necessary (cf datasheet). +#define AT91C_AES_SMOD_PDC ((unsigned int) 0x2 << 8) // (AES) PDC Mode (cf datasheet). +#define AT91C_AES_OPMOD ((unsigned int) 0x7 << 12) // (AES) Operation Mode +#define AT91C_AES_OPMOD_ECB ((unsigned int) 0x0 << 12) // (AES) ECB Electronic CodeBook mode. +#define AT91C_AES_OPMOD_CBC ((unsigned int) 0x1 << 12) // (AES) CBC Cipher Block Chaining mode. +#define AT91C_AES_OPMOD_OFB ((unsigned int) 0x2 << 12) // (AES) OFB Output Feedback mode. +#define AT91C_AES_OPMOD_CFB ((unsigned int) 0x3 << 12) // (AES) CFB Cipher Feedback mode. +#define AT91C_AES_OPMOD_CTR ((unsigned int) 0x4 << 12) // (AES) CTR Counter mode. +#define AT91C_AES_LOD ((unsigned int) 0x1 << 15) // (AES) Last Output Data Mode +#define AT91C_AES_CFBS ((unsigned int) 0x7 << 16) // (AES) Cipher Feedback Data Size +#define AT91C_AES_CFBS_128_BIT ((unsigned int) 0x0 << 16) // (AES) 128-bit. +#define AT91C_AES_CFBS_64_BIT ((unsigned int) 0x1 << 16) // (AES) 64-bit. +#define AT91C_AES_CFBS_32_BIT ((unsigned int) 0x2 << 16) // (AES) 32-bit. +#define AT91C_AES_CFBS_16_BIT ((unsigned int) 0x3 << 16) // (AES) 16-bit. +#define AT91C_AES_CFBS_8_BIT ((unsigned int) 0x4 << 16) // (AES) 8-bit. +#define AT91C_AES_CKEY ((unsigned int) 0xF << 20) // (AES) Countermeasure Key +#define AT91C_AES_CTYPE ((unsigned int) 0x1F << 24) // (AES) Countermeasure Type +#define AT91C_AES_CTYPE_TYPE1_EN ((unsigned int) 0x1 << 24) // (AES) Countermeasure type 1 is enabled. +#define AT91C_AES_CTYPE_TYPE2_EN ((unsigned int) 0x2 << 24) // (AES) Countermeasure type 2 is enabled. +#define AT91C_AES_CTYPE_TYPE3_EN ((unsigned int) 0x4 << 24) // (AES) Countermeasure type 3 is enabled. +#define AT91C_AES_CTYPE_TYPE4_EN ((unsigned int) 0x8 << 24) // (AES) Countermeasure type 4 is enabled. +#define AT91C_AES_CTYPE_TYPE5_EN ((unsigned int) 0x10 << 24) // (AES) Countermeasure type 5 is enabled. +// -------- AES_IER : (AES Offset: 0x10) Interrupt Enable Register -------- +#define AT91C_AES_DATRDY ((unsigned int) 0x1 << 0) // (AES) DATRDY +#define AT91C_AES_ENDRX ((unsigned int) 0x1 << 1) // (AES) PDC Read Buffer End +#define AT91C_AES_ENDTX ((unsigned int) 0x1 << 2) // (AES) PDC Write Buffer End +#define AT91C_AES_RXBUFF ((unsigned int) 0x1 << 3) // (AES) PDC Read Buffer Full +#define AT91C_AES_TXBUFE ((unsigned int) 0x1 << 4) // (AES) PDC Write Buffer Empty +#define AT91C_AES_URAD ((unsigned int) 0x1 << 8) // (AES) Unspecified Register Access Detection +// -------- AES_IDR : (AES Offset: 0x14) Interrupt Disable Register -------- +// -------- AES_IMR : (AES Offset: 0x18) Interrupt Mask Register -------- +// -------- AES_ISR : (AES Offset: 0x1c) Interrupt Status Register -------- +#define AT91C_AES_URAT ((unsigned int) 0x7 << 12) // (AES) Unspecified Register Access Type Status +#define AT91C_AES_URAT_IN_DAT_WRITE_DATPROC ((unsigned int) 0x0 << 12) // (AES) Input data register written during the data processing in PDC mode. +#define AT91C_AES_URAT_OUT_DAT_READ_DATPROC ((unsigned int) 0x1 << 12) // (AES) Output data register read during the data processing. +#define AT91C_AES_URAT_MODEREG_WRITE_DATPROC ((unsigned int) 0x2 << 12) // (AES) Mode register written during the data processing. +#define AT91C_AES_URAT_OUT_DAT_READ_SUBKEY ((unsigned int) 0x3 << 12) // (AES) Output data register read during the sub-keys generation. +#define AT91C_AES_URAT_MODEREG_WRITE_SUBKEY ((unsigned int) 0x4 << 12) // (AES) Mode register written during the sub-keys generation. +#define AT91C_AES_URAT_WO_REG_READ ((unsigned int) 0x5 << 12) // (AES) Write-only register read access. + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Triple Data Encryption Standard +// ***************************************************************************** +typedef struct _AT91S_TDES { + AT91_REG TDES_CR; // Control Register + AT91_REG TDES_MR; // Mode Register + AT91_REG Reserved0[2]; // + AT91_REG TDES_IER; // Interrupt Enable Register + AT91_REG TDES_IDR; // Interrupt Disable Register + AT91_REG TDES_IMR; // Interrupt Mask Register + AT91_REG TDES_ISR; // Interrupt Status Register + AT91_REG TDES_KEY1WxR[2]; // Key 1 Word x Register + AT91_REG TDES_KEY2WxR[2]; // Key 2 Word x Register + AT91_REG TDES_KEY3WxR[2]; // Key 3 Word x Register + AT91_REG Reserved1[2]; // + AT91_REG TDES_IDATAxR[2]; // Input Data x Register + AT91_REG Reserved2[2]; // + AT91_REG TDES_ODATAxR[2]; // Output Data x Register + AT91_REG Reserved3[2]; // + AT91_REG TDES_IVxR[2]; // Initialization Vector x Register + AT91_REG Reserved4[37]; // + AT91_REG TDES_VR; // TDES Version Register + AT91_REG TDES_RPR; // Receive Pointer Register + AT91_REG TDES_RCR; // Receive Counter Register + AT91_REG TDES_TPR; // Transmit Pointer Register + AT91_REG TDES_TCR; // Transmit Counter Register + AT91_REG TDES_RNPR; // Receive Next Pointer Register + AT91_REG TDES_RNCR; // Receive Next Counter Register + AT91_REG TDES_TNPR; // Transmit Next Pointer Register + AT91_REG TDES_TNCR; // Transmit Next Counter Register + AT91_REG TDES_PTCR; // PDC Transfer Control Register + AT91_REG TDES_PTSR; // PDC Transfer Status Register +} AT91S_TDES, *AT91PS_TDES; + +// -------- TDES_CR : (TDES Offset: 0x0) Control Register -------- +#define AT91C_TDES_START ((unsigned int) 0x1 << 0) // (TDES) Starts Processing +#define AT91C_TDES_SWRST ((unsigned int) 0x1 << 8) // (TDES) Software Reset +// -------- TDES_MR : (TDES Offset: 0x4) Mode Register -------- +#define AT91C_TDES_CIPHER ((unsigned int) 0x1 << 0) // (TDES) Processing Mode +#define AT91C_TDES_TDESMOD ((unsigned int) 0x1 << 1) // (TDES) Single or Triple DES Mode +#define AT91C_TDES_KEYMOD ((unsigned int) 0x1 << 4) // (TDES) Key Mode +#define AT91C_TDES_SMOD ((unsigned int) 0x3 << 8) // (TDES) Start Mode +#define AT91C_TDES_SMOD_MANUAL ((unsigned int) 0x0 << 8) // (TDES) Manual Mode: The START bit in register TDES_CR must be set to begin encryption or decryption. +#define AT91C_TDES_SMOD_AUTO ((unsigned int) 0x1 << 8) // (TDES) Auto Mode: no action in TDES_CR is necessary (cf datasheet). +#define AT91C_TDES_SMOD_PDC ((unsigned int) 0x2 << 8) // (TDES) PDC Mode (cf datasheet). +#define AT91C_TDES_OPMOD ((unsigned int) 0x3 << 12) // (TDES) Operation Mode +#define AT91C_TDES_OPMOD_ECB ((unsigned int) 0x0 << 12) // (TDES) ECB Electronic CodeBook mode. +#define AT91C_TDES_OPMOD_CBC ((unsigned int) 0x1 << 12) // (TDES) CBC Cipher Block Chaining mode. +#define AT91C_TDES_OPMOD_OFB ((unsigned int) 0x2 << 12) // (TDES) OFB Output Feedback mode. +#define AT91C_TDES_OPMOD_CFB ((unsigned int) 0x3 << 12) // (TDES) CFB Cipher Feedback mode. +#define AT91C_TDES_LOD ((unsigned int) 0x1 << 15) // (TDES) Last Output Data Mode +#define AT91C_TDES_CFBS ((unsigned int) 0x3 << 16) // (TDES) Cipher Feedback Data Size +#define AT91C_TDES_CFBS_64_BIT ((unsigned int) 0x0 << 16) // (TDES) 64-bit. +#define AT91C_TDES_CFBS_32_BIT ((unsigned int) 0x1 << 16) // (TDES) 32-bit. +#define AT91C_TDES_CFBS_16_BIT ((unsigned int) 0x2 << 16) // (TDES) 16-bit. +#define AT91C_TDES_CFBS_8_BIT ((unsigned int) 0x3 << 16) // (TDES) 8-bit. +// -------- TDES_IER : (TDES Offset: 0x10) Interrupt Enable Register -------- +#define AT91C_TDES_DATRDY ((unsigned int) 0x1 << 0) // (TDES) DATRDY +#define AT91C_TDES_ENDRX ((unsigned int) 0x1 << 1) // (TDES) PDC Read Buffer End +#define AT91C_TDES_ENDTX ((unsigned int) 0x1 << 2) // (TDES) PDC Write Buffer End +#define AT91C_TDES_RXBUFF ((unsigned int) 0x1 << 3) // (TDES) PDC Read Buffer Full +#define AT91C_TDES_TXBUFE ((unsigned int) 0x1 << 4) // (TDES) PDC Write Buffer Empty +#define AT91C_TDES_URAD ((unsigned int) 0x1 << 8) // (TDES) Unspecified Register Access Detection +// -------- TDES_IDR : (TDES Offset: 0x14) Interrupt Disable Register -------- +// -------- TDES_IMR : (TDES Offset: 0x18) Interrupt Mask Register -------- +// -------- TDES_ISR : (TDES Offset: 0x1c) Interrupt Status Register -------- +#define AT91C_TDES_URAT ((unsigned int) 0x3 << 12) // (TDES) Unspecified Register Access Type Status +#define AT91C_TDES_URAT_IN_DAT_WRITE_DATPROC ((unsigned int) 0x0 << 12) // (TDES) Input data register written during the data processing in PDC mode. +#define AT91C_TDES_URAT_OUT_DAT_READ_DATPROC ((unsigned int) 0x1 << 12) // (TDES) Output data register read during the data processing. +#define AT91C_TDES_URAT_MODEREG_WRITE_DATPROC ((unsigned int) 0x2 << 12) // (TDES) Mode register written during the data processing. +#define AT91C_TDES_URAT_WO_REG_READ ((unsigned int) 0x3 << 12) // (TDES) Write-only register read access. + +// ***************************************************************************** +// REGISTER ADDRESS DEFINITION FOR AT91SAM7X256 +// ***************************************************************************** +// ========== Register definition for SYS peripheral ========== +// ========== Register definition for AIC peripheral ========== +#define AT91C_AIC_IVR ((AT91_REG *) 0xFFFFF100) // (AIC) IRQ Vector Register +#define AT91C_AIC_SMR ((AT91_REG *) 0xFFFFF000) // (AIC) Source Mode Register +#define AT91C_AIC_FVR ((AT91_REG *) 0xFFFFF104) // (AIC) FIQ Vector Register +#define AT91C_AIC_DCR ((AT91_REG *) 0xFFFFF138) // (AIC) Debug Control Register (Protect) +#define AT91C_AIC_EOICR ((AT91_REG *) 0xFFFFF130) // (AIC) End of Interrupt Command Register +#define AT91C_AIC_SVR ((AT91_REG *) 0xFFFFF080) // (AIC) Source Vector Register +#define AT91C_AIC_FFSR ((AT91_REG *) 0xFFFFF148) // (AIC) Fast Forcing Status Register +#define AT91C_AIC_ICCR ((AT91_REG *) 0xFFFFF128) // (AIC) Interrupt Clear Command Register +#define AT91C_AIC_ISR ((AT91_REG *) 0xFFFFF108) // (AIC) Interrupt Status Register +#define AT91C_AIC_IMR ((AT91_REG *) 0xFFFFF110) // (AIC) Interrupt Mask Register +#define AT91C_AIC_IPR ((AT91_REG *) 0xFFFFF10C) // (AIC) Interrupt Pending Register +#define AT91C_AIC_FFER ((AT91_REG *) 0xFFFFF140) // (AIC) Fast Forcing Enable Register +#define AT91C_AIC_IECR ((AT91_REG *) 0xFFFFF120) // (AIC) Interrupt Enable Command Register +#define AT91C_AIC_ISCR ((AT91_REG *) 0xFFFFF12C) // (AIC) Interrupt Set Command Register +#define AT91C_AIC_FFDR ((AT91_REG *) 0xFFFFF144) // (AIC) Fast Forcing Disable Register +#define AT91C_AIC_CISR ((AT91_REG *) 0xFFFFF114) // (AIC) Core Interrupt Status Register +#define AT91C_AIC_IDCR ((AT91_REG *) 0xFFFFF124) // (AIC) Interrupt Disable Command Register +#define AT91C_AIC_SPU ((AT91_REG *) 0xFFFFF134) // (AIC) Spurious Vector Register +// ========== Register definition for PDC_DBGU peripheral ========== +#define AT91C_DBGU_TCR ((AT91_REG *) 0xFFFFF30C) // (PDC_DBGU) Transmit Counter Register +#define AT91C_DBGU_RNPR ((AT91_REG *) 0xFFFFF310) // (PDC_DBGU) Receive Next Pointer Register +#define AT91C_DBGU_TNPR ((AT91_REG *) 0xFFFFF318) // (PDC_DBGU) Transmit Next Pointer Register +#define AT91C_DBGU_TPR ((AT91_REG *) 0xFFFFF308) // (PDC_DBGU) Transmit Pointer Register +#define AT91C_DBGU_RPR ((AT91_REG *) 0xFFFFF300) // (PDC_DBGU) Receive Pointer Register +#define AT91C_DBGU_RCR ((AT91_REG *) 0xFFFFF304) // (PDC_DBGU) Receive Counter Register +#define AT91C_DBGU_RNCR ((AT91_REG *) 0xFFFFF314) // (PDC_DBGU) Receive Next Counter Register +#define AT91C_DBGU_PTCR ((AT91_REG *) 0xFFFFF320) // (PDC_DBGU) PDC Transfer Control Register +#define AT91C_DBGU_PTSR ((AT91_REG *) 0xFFFFF324) // (PDC_DBGU) PDC Transfer Status Register +#define AT91C_DBGU_TNCR ((AT91_REG *) 0xFFFFF31C) // (PDC_DBGU) Transmit Next Counter Register +// ========== Register definition for DBGU peripheral ========== +#define AT91C_DBGU_EXID ((AT91_REG *) 0xFFFFF244) // (DBGU) Chip ID Extension Register +#define AT91C_DBGU_BRGR ((AT91_REG *) 0xFFFFF220) // (DBGU) Baud Rate Generator Register +#define AT91C_DBGU_IDR ((AT91_REG *) 0xFFFFF20C) // (DBGU) Interrupt Disable Register +#define AT91C_DBGU_CSR ((AT91_REG *) 0xFFFFF214) // (DBGU) Channel Status Register +#define AT91C_DBGU_CIDR ((AT91_REG *) 0xFFFFF240) // (DBGU) Chip ID Register +#define AT91C_DBGU_MR ((AT91_REG *) 0xFFFFF204) // (DBGU) Mode Register +#define AT91C_DBGU_IMR ((AT91_REG *) 0xFFFFF210) // (DBGU) Interrupt Mask Register +#define AT91C_DBGU_CR ((AT91_REG *) 0xFFFFF200) // (DBGU) Control Register +#define AT91C_DBGU_FNTR ((AT91_REG *) 0xFFFFF248) // (DBGU) Force NTRST Register +#define AT91C_DBGU_THR ((AT91_REG *) 0xFFFFF21C) // (DBGU) Transmitter Holding Register +#define AT91C_DBGU_RHR ((AT91_REG *) 0xFFFFF218) // (DBGU) Receiver Holding Register +#define AT91C_DBGU_IER ((AT91_REG *) 0xFFFFF208) // (DBGU) Interrupt Enable Register +// ========== Register definition for PIOA peripheral ========== +#define AT91C_PIOA_ODR ((AT91_REG *) 0xFFFFF414) // (PIOA) Output Disable Registerr +#define AT91C_PIOA_SODR ((AT91_REG *) 0xFFFFF430) // (PIOA) Set Output Data Register +#define AT91C_PIOA_ISR ((AT91_REG *) 0xFFFFF44C) // (PIOA) Interrupt Status Register +#define AT91C_PIOA_ABSR ((AT91_REG *) 0xFFFFF478) // (PIOA) AB Select Status Register +#define AT91C_PIOA_IER ((AT91_REG *) 0xFFFFF440) // (PIOA) Interrupt Enable Register +#define AT91C_PIOA_PPUDR ((AT91_REG *) 0xFFFFF460) // (PIOA) Pull-up Disable Register +#define AT91C_PIOA_IMR ((AT91_REG *) 0xFFFFF448) // (PIOA) Interrupt Mask Register +#define AT91C_PIOA_PER ((AT91_REG *) 0xFFFFF400) // (PIOA) PIO Enable Register +#define AT91C_PIOA_IFDR ((AT91_REG *) 0xFFFFF424) // (PIOA) Input Filter Disable Register +#define AT91C_PIOA_OWDR ((AT91_REG *) 0xFFFFF4A4) // (PIOA) Output Write Disable Register +#define AT91C_PIOA_MDSR ((AT91_REG *) 0xFFFFF458) // (PIOA) Multi-driver Status Register +#define AT91C_PIOA_IDR ((AT91_REG *) 0xFFFFF444) // (PIOA) Interrupt Disable Register +#define AT91C_PIOA_ODSR ((AT91_REG *) 0xFFFFF438) // (PIOA) Output Data Status Register +#define AT91C_PIOA_PPUSR ((AT91_REG *) 0xFFFFF468) // (PIOA) Pull-up Status Register +#define AT91C_PIOA_OWSR ((AT91_REG *) 0xFFFFF4A8) // (PIOA) Output Write Status Register +#define AT91C_PIOA_BSR ((AT91_REG *) 0xFFFFF474) // (PIOA) Select B Register +#define AT91C_PIOA_OWER ((AT91_REG *) 0xFFFFF4A0) // (PIOA) Output Write Enable Register +#define AT91C_PIOA_IFER ((AT91_REG *) 0xFFFFF420) // (PIOA) Input Filter Enable Register +#define AT91C_PIOA_PDSR ((AT91_REG *) 0xFFFFF43C) // (PIOA) Pin Data Status Register +#define AT91C_PIOA_PPUER ((AT91_REG *) 0xFFFFF464) // (PIOA) Pull-up Enable Register +#define AT91C_PIOA_OSR ((AT91_REG *) 0xFFFFF418) // (PIOA) Output Status Register +#define AT91C_PIOA_ASR ((AT91_REG *) 0xFFFFF470) // (PIOA) Select A Register +#define AT91C_PIOA_MDDR ((AT91_REG *) 0xFFFFF454) // (PIOA) Multi-driver Disable Register +#define AT91C_PIOA_CODR ((AT91_REG *) 0xFFFFF434) // (PIOA) Clear Output Data Register +#define AT91C_PIOA_MDER ((AT91_REG *) 0xFFFFF450) // (PIOA) Multi-driver Enable Register +#define AT91C_PIOA_PDR ((AT91_REG *) 0xFFFFF404) // (PIOA) PIO Disable Register +#define AT91C_PIOA_IFSR ((AT91_REG *) 0xFFFFF428) // (PIOA) Input Filter Status Register +#define AT91C_PIOA_OER ((AT91_REG *) 0xFFFFF410) // (PIOA) Output Enable Register +#define AT91C_PIOA_PSR ((AT91_REG *) 0xFFFFF408) // (PIOA) PIO Status Register +// ========== Register definition for PIOB peripheral ========== +#define AT91C_PIOB_OWDR ((AT91_REG *) 0xFFFFF6A4) // (PIOB) Output Write Disable Register +#define AT91C_PIOB_MDER ((AT91_REG *) 0xFFFFF650) // (PIOB) Multi-driver Enable Register +#define AT91C_PIOB_PPUSR ((AT91_REG *) 0xFFFFF668) // (PIOB) Pull-up Status Register +#define AT91C_PIOB_IMR ((AT91_REG *) 0xFFFFF648) // (PIOB) Interrupt Mask Register +#define AT91C_PIOB_ASR ((AT91_REG *) 0xFFFFF670) // (PIOB) Select A Register +#define AT91C_PIOB_PPUDR ((AT91_REG *) 0xFFFFF660) // (PIOB) Pull-up Disable Register +#define AT91C_PIOB_PSR ((AT91_REG *) 0xFFFFF608) // (PIOB) PIO Status Register +#define AT91C_PIOB_IER ((AT91_REG *) 0xFFFFF640) // (PIOB) Interrupt Enable Register +#define AT91C_PIOB_CODR ((AT91_REG *) 0xFFFFF634) // (PIOB) Clear Output Data Register +#define AT91C_PIOB_OWER ((AT91_REG *) 0xFFFFF6A0) // (PIOB) Output Write Enable Register +#define AT91C_PIOB_ABSR ((AT91_REG *) 0xFFFFF678) // (PIOB) AB Select Status Register +#define AT91C_PIOB_IFDR ((AT91_REG *) 0xFFFFF624) // (PIOB) Input Filter Disable Register +#define AT91C_PIOB_PDSR ((AT91_REG *) 0xFFFFF63C) // (PIOB) Pin Data Status Register +#define AT91C_PIOB_IDR ((AT91_REG *) 0xFFFFF644) // (PIOB) Interrupt Disable Register +#define AT91C_PIOB_OWSR ((AT91_REG *) 0xFFFFF6A8) // (PIOB) Output Write Status Register +#define AT91C_PIOB_PDR ((AT91_REG *) 0xFFFFF604) // (PIOB) PIO Disable Register +#define AT91C_PIOB_ODR ((AT91_REG *) 0xFFFFF614) // (PIOB) Output Disable Registerr +#define AT91C_PIOB_IFSR ((AT91_REG *) 0xFFFFF628) // (PIOB) Input Filter Status Register +#define AT91C_PIOB_PPUER ((AT91_REG *) 0xFFFFF664) // (PIOB) Pull-up Enable Register +#define AT91C_PIOB_SODR ((AT91_REG *) 0xFFFFF630) // (PIOB) Set Output Data Register +#define AT91C_PIOB_ISR ((AT91_REG *) 0xFFFFF64C) // (PIOB) Interrupt Status Register +#define AT91C_PIOB_ODSR ((AT91_REG *) 0xFFFFF638) // (PIOB) Output Data Status Register +#define AT91C_PIOB_OSR ((AT91_REG *) 0xFFFFF618) // (PIOB) Output Status Register +#define AT91C_PIOB_MDSR ((AT91_REG *) 0xFFFFF658) // (PIOB) Multi-driver Status Register +#define AT91C_PIOB_IFER ((AT91_REG *) 0xFFFFF620) // (PIOB) Input Filter Enable Register +#define AT91C_PIOB_BSR ((AT91_REG *) 0xFFFFF674) // (PIOB) Select B Register +#define AT91C_PIOB_MDDR ((AT91_REG *) 0xFFFFF654) // (PIOB) Multi-driver Disable Register +#define AT91C_PIOB_OER ((AT91_REG *) 0xFFFFF610) // (PIOB) Output Enable Register +#define AT91C_PIOB_PER ((AT91_REG *) 0xFFFFF600) // (PIOB) PIO Enable Register +// ========== Register definition for CKGR peripheral ========== +#define AT91C_CKGR_MOR ((AT91_REG *) 0xFFFFFC20) // (CKGR) Main Oscillator Register +#define AT91C_CKGR_PLLR ((AT91_REG *) 0xFFFFFC2C) // (CKGR) PLL Register +#define AT91C_CKGR_MCFR ((AT91_REG *) 0xFFFFFC24) // (CKGR) Main Clock Frequency Register +// ========== Register definition for PMC peripheral ========== +#define AT91C_PMC_IDR ((AT91_REG *) 0xFFFFFC64) // (PMC) Interrupt Disable Register +#define AT91C_PMC_MOR ((AT91_REG *) 0xFFFFFC20) // (PMC) Main Oscillator Register +#define AT91C_PMC_PLLR ((AT91_REG *) 0xFFFFFC2C) // (PMC) PLL Register +#define AT91C_PMC_PCER ((AT91_REG *) 0xFFFFFC10) // (PMC) Peripheral Clock Enable Register +#define AT91C_PMC_PCKR ((AT91_REG *) 0xFFFFFC40) // (PMC) Programmable Clock Register +#define AT91C_PMC_MCKR ((AT91_REG *) 0xFFFFFC30) // (PMC) Master Clock Register +#define AT91C_PMC_SCDR ((AT91_REG *) 0xFFFFFC04) // (PMC) System Clock Disable Register +#define AT91C_PMC_PCDR ((AT91_REG *) 0xFFFFFC14) // (PMC) Peripheral Clock Disable Register +#define AT91C_PMC_SCSR ((AT91_REG *) 0xFFFFFC08) // (PMC) System Clock Status Register +#define AT91C_PMC_PCSR ((AT91_REG *) 0xFFFFFC18) // (PMC) Peripheral Clock Status Register +#define AT91C_PMC_MCFR ((AT91_REG *) 0xFFFFFC24) // (PMC) Main Clock Frequency Register +#define AT91C_PMC_SCER ((AT91_REG *) 0xFFFFFC00) // (PMC) System Clock Enable Register +#define AT91C_PMC_IMR ((AT91_REG *) 0xFFFFFC6C) // (PMC) Interrupt Mask Register +#define AT91C_PMC_IER ((AT91_REG *) 0xFFFFFC60) // (PMC) Interrupt Enable Register +#define AT91C_PMC_SR ((AT91_REG *) 0xFFFFFC68) // (PMC) Status Register +// ========== Register definition for RSTC peripheral ========== +#define AT91C_RSTC_RCR ((AT91_REG *) 0xFFFFFD00) // (RSTC) Reset Control Register +#define AT91C_RSTC_RMR ((AT91_REG *) 0xFFFFFD08) // (RSTC) Reset Mode Register +#define AT91C_RSTC_RSR ((AT91_REG *) 0xFFFFFD04) // (RSTC) Reset Status Register +// ========== Register definition for RTTC peripheral ========== +#define AT91C_RTTC_RTSR ((AT91_REG *) 0xFFFFFD2C) // (RTTC) Real-time Status Register +#define AT91C_RTTC_RTMR ((AT91_REG *) 0xFFFFFD20) // (RTTC) Real-time Mode Register +#define AT91C_RTTC_RTVR ((AT91_REG *) 0xFFFFFD28) // (RTTC) Real-time Value Register +#define AT91C_RTTC_RTAR ((AT91_REG *) 0xFFFFFD24) // (RTTC) Real-time Alarm Register +// ========== Register definition for PITC peripheral ========== +#define AT91C_PITC_PIVR ((AT91_REG *) 0xFFFFFD38) // (PITC) Period Interval Value Register +#define AT91C_PITC_PISR ((AT91_REG *) 0xFFFFFD34) // (PITC) Period Interval Status Register +#define AT91C_PITC_PIIR ((AT91_REG *) 0xFFFFFD3C) // (PITC) Period Interval Image Register +#define AT91C_PITC_PIMR ((AT91_REG *) 0xFFFFFD30) // (PITC) Period Interval Mode Register +// ========== Register definition for WDTC peripheral ========== +#define AT91C_WDTC_WDCR ((AT91_REG *) 0xFFFFFD40) // (WDTC) Watchdog Control Register +#define AT91C_WDTC_WDSR ((AT91_REG *) 0xFFFFFD48) // (WDTC) Watchdog Status Register +#define AT91C_WDTC_WDMR ((AT91_REG *) 0xFFFFFD44) // (WDTC) Watchdog Mode Register +// ========== Register definition for VREG peripheral ========== +#define AT91C_VREG_MR ((AT91_REG *) 0xFFFFFD60) // (VREG) Voltage Regulator Mode Register +// ========== Register definition for MC peripheral ========== +#define AT91C_MC_ASR ((AT91_REG *) 0xFFFFFF04) // (MC) MC Abort Status Register +#define AT91C_MC_RCR ((AT91_REG *) 0xFFFFFF00) // (MC) MC Remap Control Register +#define AT91C_MC_FCR ((AT91_REG *) 0xFFFFFF64) // (MC) MC Flash Command Register +#define AT91C_MC_AASR ((AT91_REG *) 0xFFFFFF08) // (MC) MC Abort Address Status Register +#define AT91C_MC_FSR ((AT91_REG *) 0xFFFFFF68) // (MC) MC Flash Status Register +#define AT91C_MC_FMR ((AT91_REG *) 0xFFFFFF60) // (MC) MC Flash Mode Register +// ========== Register definition for PDC_SPI1 peripheral ========== +#define AT91C_SPI1_PTCR ((AT91_REG *) 0xFFFE4120) // (PDC_SPI1) PDC Transfer Control Register +#define AT91C_SPI1_RPR ((AT91_REG *) 0xFFFE4100) // (PDC_SPI1) Receive Pointer Register +#define AT91C_SPI1_TNCR ((AT91_REG *) 0xFFFE411C) // (PDC_SPI1) Transmit Next Counter Register +#define AT91C_SPI1_TPR ((AT91_REG *) 0xFFFE4108) // (PDC_SPI1) Transmit Pointer Register +#define AT91C_SPI1_TNPR ((AT91_REG *) 0xFFFE4118) // (PDC_SPI1) Transmit Next Pointer Register +#define AT91C_SPI1_TCR ((AT91_REG *) 0xFFFE410C) // (PDC_SPI1) Transmit Counter Register +#define AT91C_SPI1_RCR ((AT91_REG *) 0xFFFE4104) // (PDC_SPI1) Receive Counter Register +#define AT91C_SPI1_RNPR ((AT91_REG *) 0xFFFE4110) // (PDC_SPI1) Receive Next Pointer Register +#define AT91C_SPI1_RNCR ((AT91_REG *) 0xFFFE4114) // (PDC_SPI1) Receive Next Counter Register +#define AT91C_SPI1_PTSR ((AT91_REG *) 0xFFFE4124) // (PDC_SPI1) PDC Transfer Status Register +// ========== Register definition for SPI1 peripheral ========== +#define AT91C_SPI1_IMR ((AT91_REG *) 0xFFFE401C) // (SPI1) Interrupt Mask Register +#define AT91C_SPI1_IER ((AT91_REG *) 0xFFFE4014) // (SPI1) Interrupt Enable Register +#define AT91C_SPI1_MR ((AT91_REG *) 0xFFFE4004) // (SPI1) Mode Register +#define AT91C_SPI1_RDR ((AT91_REG *) 0xFFFE4008) // (SPI1) Receive Data Register +#define AT91C_SPI1_IDR ((AT91_REG *) 0xFFFE4018) // (SPI1) Interrupt Disable Register +#define AT91C_SPI1_SR ((AT91_REG *) 0xFFFE4010) // (SPI1) Status Register +#define AT91C_SPI1_TDR ((AT91_REG *) 0xFFFE400C) // (SPI1) Transmit Data Register +#define AT91C_SPI1_CR ((AT91_REG *) 0xFFFE4000) // (SPI1) Control Register +#define AT91C_SPI1_CSR ((AT91_REG *) 0xFFFE4030) // (SPI1) Chip Select Register +// ========== Register definition for PDC_SPI0 peripheral ========== +#define AT91C_SPI0_PTCR ((AT91_REG *) 0xFFFE0120) // (PDC_SPI0) PDC Transfer Control Register +#define AT91C_SPI0_TPR ((AT91_REG *) 0xFFFE0108) // (PDC_SPI0) Transmit Pointer Register +#define AT91C_SPI0_TCR ((AT91_REG *) 0xFFFE010C) // (PDC_SPI0) Transmit Counter Register +#define AT91C_SPI0_RCR ((AT91_REG *) 0xFFFE0104) // (PDC_SPI0) Receive Counter Register +#define AT91C_SPI0_PTSR ((AT91_REG *) 0xFFFE0124) // (PDC_SPI0) PDC Transfer Status Register +#define AT91C_SPI0_RNPR ((AT91_REG *) 0xFFFE0110) // (PDC_SPI0) Receive Next Pointer Register +#define AT91C_SPI0_RPR ((AT91_REG *) 0xFFFE0100) // (PDC_SPI0) Receive Pointer Register +#define AT91C_SPI0_TNCR ((AT91_REG *) 0xFFFE011C) // (PDC_SPI0) Transmit Next Counter Register +#define AT91C_SPI0_RNCR ((AT91_REG *) 0xFFFE0114) // (PDC_SPI0) Receive Next Counter Register +#define AT91C_SPI0_TNPR ((AT91_REG *) 0xFFFE0118) // (PDC_SPI0) Transmit Next Pointer Register +// ========== Register definition for SPI0 peripheral ========== +#define AT91C_SPI0_IER ((AT91_REG *) 0xFFFE0014) // (SPI0) Interrupt Enable Register +#define AT91C_SPI0_SR ((AT91_REG *) 0xFFFE0010) // (SPI0) Status Register +#define AT91C_SPI0_IDR ((AT91_REG *) 0xFFFE0018) // (SPI0) Interrupt Disable Register +#define AT91C_SPI0_CR ((AT91_REG *) 0xFFFE0000) // (SPI0) Control Register +#define AT91C_SPI0_MR ((AT91_REG *) 0xFFFE0004) // (SPI0) Mode Register +#define AT91C_SPI0_IMR ((AT91_REG *) 0xFFFE001C) // (SPI0) Interrupt Mask Register +#define AT91C_SPI0_TDR ((AT91_REG *) 0xFFFE000C) // (SPI0) Transmit Data Register +#define AT91C_SPI0_RDR ((AT91_REG *) 0xFFFE0008) // (SPI0) Receive Data Register +#define AT91C_SPI0_CSR ((AT91_REG *) 0xFFFE0030) // (SPI0) Chip Select Register +// ========== Register definition for PDC_US1 peripheral ========== +#define AT91C_US1_RNCR ((AT91_REG *) 0xFFFC4114) // (PDC_US1) Receive Next Counter Register +#define AT91C_US1_PTCR ((AT91_REG *) 0xFFFC4120) // (PDC_US1) PDC Transfer Control Register +#define AT91C_US1_TCR ((AT91_REG *) 0xFFFC410C) // (PDC_US1) Transmit Counter Register +#define AT91C_US1_PTSR ((AT91_REG *) 0xFFFC4124) // (PDC_US1) PDC Transfer Status Register +#define AT91C_US1_TNPR ((AT91_REG *) 0xFFFC4118) // (PDC_US1) Transmit Next Pointer Register +#define AT91C_US1_RCR ((AT91_REG *) 0xFFFC4104) // (PDC_US1) Receive Counter Register +#define AT91C_US1_RNPR ((AT91_REG *) 0xFFFC4110) // (PDC_US1) Receive Next Pointer Register +#define AT91C_US1_RPR ((AT91_REG *) 0xFFFC4100) // (PDC_US1) Receive Pointer Register +#define AT91C_US1_TNCR ((AT91_REG *) 0xFFFC411C) // (PDC_US1) Transmit Next Counter Register +#define AT91C_US1_TPR ((AT91_REG *) 0xFFFC4108) // (PDC_US1) Transmit Pointer Register +// ========== Register definition for US1 peripheral ========== +#define AT91C_US1_IF ((AT91_REG *) 0xFFFC404C) // (US1) IRDA_FILTER Register +#define AT91C_US1_NER ((AT91_REG *) 0xFFFC4044) // (US1) Nb Errors Register +#define AT91C_US1_RTOR ((AT91_REG *) 0xFFFC4024) // (US1) Receiver Time-out Register +#define AT91C_US1_CSR ((AT91_REG *) 0xFFFC4014) // (US1) Channel Status Register +#define AT91C_US1_IDR ((AT91_REG *) 0xFFFC400C) // (US1) Interrupt Disable Register +#define AT91C_US1_IER ((AT91_REG *) 0xFFFC4008) // (US1) Interrupt Enable Register +#define AT91C_US1_THR ((AT91_REG *) 0xFFFC401C) // (US1) Transmitter Holding Register +#define AT91C_US1_TTGR ((AT91_REG *) 0xFFFC4028) // (US1) Transmitter Time-guard Register +#define AT91C_US1_RHR ((AT91_REG *) 0xFFFC4018) // (US1) Receiver Holding Register +#define AT91C_US1_BRGR ((AT91_REG *) 0xFFFC4020) // (US1) Baud Rate Generator Register +#define AT91C_US1_IMR ((AT91_REG *) 0xFFFC4010) // (US1) Interrupt Mask Register +#define AT91C_US1_FIDI ((AT91_REG *) 0xFFFC4040) // (US1) FI_DI_Ratio Register +#define AT91C_US1_CR ((AT91_REG *) 0xFFFC4000) // (US1) Control Register +#define AT91C_US1_MR ((AT91_REG *) 0xFFFC4004) // (US1) Mode Register +// ========== Register definition for PDC_US0 peripheral ========== +#define AT91C_US0_TNPR ((AT91_REG *) 0xFFFC0118) // (PDC_US0) Transmit Next Pointer Register +#define AT91C_US0_RNPR ((AT91_REG *) 0xFFFC0110) // (PDC_US0) Receive Next Pointer Register +#define AT91C_US0_TCR ((AT91_REG *) 0xFFFC010C) // (PDC_US0) Transmit Counter Register +#define AT91C_US0_PTCR ((AT91_REG *) 0xFFFC0120) // (PDC_US0) PDC Transfer Control Register +#define AT91C_US0_PTSR ((AT91_REG *) 0xFFFC0124) // (PDC_US0) PDC Transfer Status Register +#define AT91C_US0_TNCR ((AT91_REG *) 0xFFFC011C) // (PDC_US0) Transmit Next Counter Register +#define AT91C_US0_TPR ((AT91_REG *) 0xFFFC0108) // (PDC_US0) Transmit Pointer Register +#define AT91C_US0_RCR ((AT91_REG *) 0xFFFC0104) // (PDC_US0) Receive Counter Register +#define AT91C_US0_RPR ((AT91_REG *) 0xFFFC0100) // (PDC_US0) Receive Pointer Register +#define AT91C_US0_RNCR ((AT91_REG *) 0xFFFC0114) // (PDC_US0) Receive Next Counter Register +// ========== Register definition for US0 peripheral ========== +#define AT91C_US0_BRGR ((AT91_REG *) 0xFFFC0020) // (US0) Baud Rate Generator Register +#define AT91C_US0_NER ((AT91_REG *) 0xFFFC0044) // (US0) Nb Errors Register +#define AT91C_US0_CR ((AT91_REG *) 0xFFFC0000) // (US0) Control Register +#define AT91C_US0_IMR ((AT91_REG *) 0xFFFC0010) // (US0) Interrupt Mask Register +#define AT91C_US0_FIDI ((AT91_REG *) 0xFFFC0040) // (US0) FI_DI_Ratio Register +#define AT91C_US0_TTGR ((AT91_REG *) 0xFFFC0028) // (US0) Transmitter Time-guard Register +#define AT91C_US0_MR ((AT91_REG *) 0xFFFC0004) // (US0) Mode Register +#define AT91C_US0_RTOR ((AT91_REG *) 0xFFFC0024) // (US0) Receiver Time-out Register +#define AT91C_US0_CSR ((AT91_REG *) 0xFFFC0014) // (US0) Channel Status Register +#define AT91C_US0_RHR ((AT91_REG *) 0xFFFC0018) // (US0) Receiver Holding Register +#define AT91C_US0_IDR ((AT91_REG *) 0xFFFC000C) // (US0) Interrupt Disable Register +#define AT91C_US0_THR ((AT91_REG *) 0xFFFC001C) // (US0) Transmitter Holding Register +#define AT91C_US0_IF ((AT91_REG *) 0xFFFC004C) // (US0) IRDA_FILTER Register +#define AT91C_US0_IER ((AT91_REG *) 0xFFFC0008) // (US0) Interrupt Enable Register +// ========== Register definition for PDC_SSC peripheral ========== +#define AT91C_SSC_TNCR ((AT91_REG *) 0xFFFD411C) // (PDC_SSC) Transmit Next Counter Register +#define AT91C_SSC_RPR ((AT91_REG *) 0xFFFD4100) // (PDC_SSC) Receive Pointer Register +#define AT91C_SSC_RNCR ((AT91_REG *) 0xFFFD4114) // (PDC_SSC) Receive Next Counter Register +#define AT91C_SSC_TPR ((AT91_REG *) 0xFFFD4108) // (PDC_SSC) Transmit Pointer Register +#define AT91C_SSC_PTCR ((AT91_REG *) 0xFFFD4120) // (PDC_SSC) PDC Transfer Control Register +#define AT91C_SSC_TCR ((AT91_REG *) 0xFFFD410C) // (PDC_SSC) Transmit Counter Register +#define AT91C_SSC_RCR ((AT91_REG *) 0xFFFD4104) // (PDC_SSC) Receive Counter Register +#define AT91C_SSC_RNPR ((AT91_REG *) 0xFFFD4110) // (PDC_SSC) Receive Next Pointer Register +#define AT91C_SSC_TNPR ((AT91_REG *) 0xFFFD4118) // (PDC_SSC) Transmit Next Pointer Register +#define AT91C_SSC_PTSR ((AT91_REG *) 0xFFFD4124) // (PDC_SSC) PDC Transfer Status Register +// ========== Register definition for SSC peripheral ========== +#define AT91C_SSC_RHR ((AT91_REG *) 0xFFFD4020) // (SSC) Receive Holding Register +#define AT91C_SSC_RSHR ((AT91_REG *) 0xFFFD4030) // (SSC) Receive Sync Holding Register +#define AT91C_SSC_TFMR ((AT91_REG *) 0xFFFD401C) // (SSC) Transmit Frame Mode Register +#define AT91C_SSC_IDR ((AT91_REG *) 0xFFFD4048) // (SSC) Interrupt Disable Register +#define AT91C_SSC_THR ((AT91_REG *) 0xFFFD4024) // (SSC) Transmit Holding Register +#define AT91C_SSC_RCMR ((AT91_REG *) 0xFFFD4010) // (SSC) Receive Clock ModeRegister +#define AT91C_SSC_IER ((AT91_REG *) 0xFFFD4044) // (SSC) Interrupt Enable Register +#define AT91C_SSC_TSHR ((AT91_REG *) 0xFFFD4034) // (SSC) Transmit Sync Holding Register +#define AT91C_SSC_SR ((AT91_REG *) 0xFFFD4040) // (SSC) Status Register +#define AT91C_SSC_CMR ((AT91_REG *) 0xFFFD4004) // (SSC) Clock Mode Register +#define AT91C_SSC_TCMR ((AT91_REG *) 0xFFFD4018) // (SSC) Transmit Clock Mode Register +#define AT91C_SSC_CR ((AT91_REG *) 0xFFFD4000) // (SSC) Control Register +#define AT91C_SSC_IMR ((AT91_REG *) 0xFFFD404C) // (SSC) Interrupt Mask Register +#define AT91C_SSC_RFMR ((AT91_REG *) 0xFFFD4014) // (SSC) Receive Frame Mode Register +// ========== Register definition for TWI peripheral ========== +#define AT91C_TWI_IER ((AT91_REG *) 0xFFFB8024) // (TWI) Interrupt Enable Register +#define AT91C_TWI_CR ((AT91_REG *) 0xFFFB8000) // (TWI) Control Register +#define AT91C_TWI_SR ((AT91_REG *) 0xFFFB8020) // (TWI) Status Register +#define AT91C_TWI_IMR ((AT91_REG *) 0xFFFB802C) // (TWI) Interrupt Mask Register +#define AT91C_TWI_THR ((AT91_REG *) 0xFFFB8034) // (TWI) Transmit Holding Register +#define AT91C_TWI_IDR ((AT91_REG *) 0xFFFB8028) // (TWI) Interrupt Disable Register +#define AT91C_TWI_IADR ((AT91_REG *) 0xFFFB800C) // (TWI) Internal Address Register +#define AT91C_TWI_MMR ((AT91_REG *) 0xFFFB8004) // (TWI) Master Mode Register +#define AT91C_TWI_CWGR ((AT91_REG *) 0xFFFB8010) // (TWI) Clock Waveform Generator Register +#define AT91C_TWI_RHR ((AT91_REG *) 0xFFFB8030) // (TWI) Receive Holding Register +// ========== Register definition for PWMC_CH3 peripheral ========== +#define AT91C_PWMC_CH3_CUPDR ((AT91_REG *) 0xFFFCC270) // (PWMC_CH3) Channel Update Register +#define AT91C_PWMC_CH3_Reserved ((AT91_REG *) 0xFFFCC274) // (PWMC_CH3) Reserved +#define AT91C_PWMC_CH3_CPRDR ((AT91_REG *) 0xFFFCC268) // (PWMC_CH3) Channel Period Register +#define AT91C_PWMC_CH3_CDTYR ((AT91_REG *) 0xFFFCC264) // (PWMC_CH3) Channel Duty Cycle Register +#define AT91C_PWMC_CH3_CCNTR ((AT91_REG *) 0xFFFCC26C) // (PWMC_CH3) Channel Counter Register +#define AT91C_PWMC_CH3_CMR ((AT91_REG *) 0xFFFCC260) // (PWMC_CH3) Channel Mode Register +// ========== Register definition for PWMC_CH2 peripheral ========== +#define AT91C_PWMC_CH2_Reserved ((AT91_REG *) 0xFFFCC254) // (PWMC_CH2) Reserved +#define AT91C_PWMC_CH2_CMR ((AT91_REG *) 0xFFFCC240) // (PWMC_CH2) Channel Mode Register +#define AT91C_PWMC_CH2_CCNTR ((AT91_REG *) 0xFFFCC24C) // (PWMC_CH2) Channel Counter Register +#define AT91C_PWMC_CH2_CPRDR ((AT91_REG *) 0xFFFCC248) // (PWMC_CH2) Channel Period Register +#define AT91C_PWMC_CH2_CUPDR ((AT91_REG *) 0xFFFCC250) // (PWMC_CH2) Channel Update Register +#define AT91C_PWMC_CH2_CDTYR ((AT91_REG *) 0xFFFCC244) // (PWMC_CH2) Channel Duty Cycle Register +// ========== Register definition for PWMC_CH1 peripheral ========== +#define AT91C_PWMC_CH1_Reserved ((AT91_REG *) 0xFFFCC234) // (PWMC_CH1) Reserved +#define AT91C_PWMC_CH1_CUPDR ((AT91_REG *) 0xFFFCC230) // (PWMC_CH1) Channel Update Register +#define AT91C_PWMC_CH1_CPRDR ((AT91_REG *) 0xFFFCC228) // (PWMC_CH1) Channel Period Register +#define AT91C_PWMC_CH1_CCNTR ((AT91_REG *) 0xFFFCC22C) // (PWMC_CH1) Channel Counter Register +#define AT91C_PWMC_CH1_CDTYR ((AT91_REG *) 0xFFFCC224) // (PWMC_CH1) Channel Duty Cycle Register +#define AT91C_PWMC_CH1_CMR ((AT91_REG *) 0xFFFCC220) // (PWMC_CH1) Channel Mode Register +// ========== Register definition for PWMC_CH0 peripheral ========== +#define AT91C_PWMC_CH0_Reserved ((AT91_REG *) 0xFFFCC214) // (PWMC_CH0) Reserved +#define AT91C_PWMC_CH0_CPRDR ((AT91_REG *) 0xFFFCC208) // (PWMC_CH0) Channel Period Register +#define AT91C_PWMC_CH0_CDTYR ((AT91_REG *) 0xFFFCC204) // (PWMC_CH0) Channel Duty Cycle Register +#define AT91C_PWMC_CH0_CMR ((AT91_REG *) 0xFFFCC200) // (PWMC_CH0) Channel Mode Register +#define AT91C_PWMC_CH0_CUPDR ((AT91_REG *) 0xFFFCC210) // (PWMC_CH0) Channel Update Register +#define AT91C_PWMC_CH0_CCNTR ((AT91_REG *) 0xFFFCC20C) // (PWMC_CH0) Channel Counter Register +// ========== Register definition for PWMC peripheral ========== +#define AT91C_PWMC_IDR ((AT91_REG *) 0xFFFCC014) // (PWMC) PWMC Interrupt Disable Register +#define AT91C_PWMC_DIS ((AT91_REG *) 0xFFFCC008) // (PWMC) PWMC Disable Register +#define AT91C_PWMC_IER ((AT91_REG *) 0xFFFCC010) // (PWMC) PWMC Interrupt Enable Register +#define AT91C_PWMC_VR ((AT91_REG *) 0xFFFCC0FC) // (PWMC) PWMC Version Register +#define AT91C_PWMC_ISR ((AT91_REG *) 0xFFFCC01C) // (PWMC) PWMC Interrupt Status Register +#define AT91C_PWMC_SR ((AT91_REG *) 0xFFFCC00C) // (PWMC) PWMC Status Register +#define AT91C_PWMC_IMR ((AT91_REG *) 0xFFFCC018) // (PWMC) PWMC Interrupt Mask Register +#define AT91C_PWMC_MR ((AT91_REG *) 0xFFFCC000) // (PWMC) PWMC Mode Register +#define AT91C_PWMC_ENA ((AT91_REG *) 0xFFFCC004) // (PWMC) PWMC Enable Register +// ========== Register definition for UDP peripheral ========== +#define AT91C_UDP_IMR ((AT91_REG *) 0xFFFB0018) // (UDP) Interrupt Mask Register +#define AT91C_UDP_FADDR ((AT91_REG *) 0xFFFB0008) // (UDP) Function Address Register +#define AT91C_UDP_NUM ((AT91_REG *) 0xFFFB0000) // (UDP) Frame Number Register +#define AT91C_UDP_FDR ((AT91_REG *) 0xFFFB0050) // (UDP) Endpoint FIFO Data Register +#define AT91C_UDP_ISR ((AT91_REG *) 0xFFFB001C) // (UDP) Interrupt Status Register +#define AT91C_UDP_CSR ((AT91_REG *) 0xFFFB0030) // (UDP) Endpoint Control and Status Register +#define AT91C_UDP_IDR ((AT91_REG *) 0xFFFB0014) // (UDP) Interrupt Disable Register +#define AT91C_UDP_ICR ((AT91_REG *) 0xFFFB0020) // (UDP) Interrupt Clear Register +#define AT91C_UDP_RSTEP ((AT91_REG *) 0xFFFB0028) // (UDP) Reset Endpoint Register +#define AT91C_UDP_TXVC ((AT91_REG *) 0xFFFB0074) // (UDP) Transceiver Control Register +#define AT91C_UDP_GLBSTATE ((AT91_REG *) 0xFFFB0004) // (UDP) Global State Register +#define AT91C_UDP_IER ((AT91_REG *) 0xFFFB0010) // (UDP) Interrupt Enable Register +// ========== Register definition for TC0 peripheral ========== +#define AT91C_TC0_SR ((AT91_REG *) 0xFFFA0020) // (TC0) Status Register +#define AT91C_TC0_RC ((AT91_REG *) 0xFFFA001C) // (TC0) Register C +#define AT91C_TC0_RB ((AT91_REG *) 0xFFFA0018) // (TC0) Register B +#define AT91C_TC0_CCR ((AT91_REG *) 0xFFFA0000) // (TC0) Channel Control Register +#define AT91C_TC0_CMR ((AT91_REG *) 0xFFFA0004) // (TC0) Channel Mode Register (Capture Mode / Waveform Mode) +#define AT91C_TC0_IER ((AT91_REG *) 0xFFFA0024) // (TC0) Interrupt Enable Register +#define AT91C_TC0_RA ((AT91_REG *) 0xFFFA0014) // (TC0) Register A +#define AT91C_TC0_IDR ((AT91_REG *) 0xFFFA0028) // (TC0) Interrupt Disable Register +#define AT91C_TC0_CV ((AT91_REG *) 0xFFFA0010) // (TC0) Counter Value +#define AT91C_TC0_IMR ((AT91_REG *) 0xFFFA002C) // (TC0) Interrupt Mask Register +// ========== Register definition for TC1 peripheral ========== +#define AT91C_TC1_RB ((AT91_REG *) 0xFFFA0058) // (TC1) Register B +#define AT91C_TC1_CCR ((AT91_REG *) 0xFFFA0040) // (TC1) Channel Control Register +#define AT91C_TC1_IER ((AT91_REG *) 0xFFFA0064) // (TC1) Interrupt Enable Register +#define AT91C_TC1_IDR ((AT91_REG *) 0xFFFA0068) // (TC1) Interrupt Disable Register +#define AT91C_TC1_SR ((AT91_REG *) 0xFFFA0060) // (TC1) Status Register +#define AT91C_TC1_CMR ((AT91_REG *) 0xFFFA0044) // (TC1) Channel Mode Register (Capture Mode / Waveform Mode) +#define AT91C_TC1_RA ((AT91_REG *) 0xFFFA0054) // (TC1) Register A +#define AT91C_TC1_RC ((AT91_REG *) 0xFFFA005C) // (TC1) Register C +#define AT91C_TC1_IMR ((AT91_REG *) 0xFFFA006C) // (TC1) Interrupt Mask Register +#define AT91C_TC1_CV ((AT91_REG *) 0xFFFA0050) // (TC1) Counter Value +// ========== Register definition for TC2 peripheral ========== +#define AT91C_TC2_CMR ((AT91_REG *) 0xFFFA0084) // (TC2) Channel Mode Register (Capture Mode / Waveform Mode) +#define AT91C_TC2_CCR ((AT91_REG *) 0xFFFA0080) // (TC2) Channel Control Register +#define AT91C_TC2_CV ((AT91_REG *) 0xFFFA0090) // (TC2) Counter Value +#define AT91C_TC2_RA ((AT91_REG *) 0xFFFA0094) // (TC2) Register A +#define AT91C_TC2_RB ((AT91_REG *) 0xFFFA0098) // (TC2) Register B +#define AT91C_TC2_IDR ((AT91_REG *) 0xFFFA00A8) // (TC2) Interrupt Disable Register +#define AT91C_TC2_IMR ((AT91_REG *) 0xFFFA00AC) // (TC2) Interrupt Mask Register +#define AT91C_TC2_RC ((AT91_REG *) 0xFFFA009C) // (TC2) Register C +#define AT91C_TC2_IER ((AT91_REG *) 0xFFFA00A4) // (TC2) Interrupt Enable Register +#define AT91C_TC2_SR ((AT91_REG *) 0xFFFA00A0) // (TC2) Status Register +// ========== Register definition for TCB peripheral ========== +#define AT91C_TCB_BMR ((AT91_REG *) 0xFFFA00C4) // (TCB) TC Block Mode Register +#define AT91C_TCB_BCR ((AT91_REG *) 0xFFFA00C0) // (TCB) TC Block Control Register +// ========== Register definition for CAN_MB0 peripheral ========== +#define AT91C_CAN_MB0_MDL ((AT91_REG *) 0xFFFD0214) // (CAN_MB0) MailBox Data Low Register +#define AT91C_CAN_MB0_MAM ((AT91_REG *) 0xFFFD0204) // (CAN_MB0) MailBox Acceptance Mask Register +#define AT91C_CAN_MB0_MCR ((AT91_REG *) 0xFFFD021C) // (CAN_MB0) MailBox Control Register +#define AT91C_CAN_MB0_MID ((AT91_REG *) 0xFFFD0208) // (CAN_MB0) MailBox ID Register +#define AT91C_CAN_MB0_MSR ((AT91_REG *) 0xFFFD0210) // (CAN_MB0) MailBox Status Register +#define AT91C_CAN_MB0_MFID ((AT91_REG *) 0xFFFD020C) // (CAN_MB0) MailBox Family ID Register +#define AT91C_CAN_MB0_MDH ((AT91_REG *) 0xFFFD0218) // (CAN_MB0) MailBox Data High Register +#define AT91C_CAN_MB0_MMR ((AT91_REG *) 0xFFFD0200) // (CAN_MB0) MailBox Mode Register +// ========== Register definition for CAN_MB1 peripheral ========== +#define AT91C_CAN_MB1_MDL ((AT91_REG *) 0xFFFD0234) // (CAN_MB1) MailBox Data Low Register +#define AT91C_CAN_MB1_MID ((AT91_REG *) 0xFFFD0228) // (CAN_MB1) MailBox ID Register +#define AT91C_CAN_MB1_MMR ((AT91_REG *) 0xFFFD0220) // (CAN_MB1) MailBox Mode Register +#define AT91C_CAN_MB1_MSR ((AT91_REG *) 0xFFFD0230) // (CAN_MB1) MailBox Status Register +#define AT91C_CAN_MB1_MAM ((AT91_REG *) 0xFFFD0224) // (CAN_MB1) MailBox Acceptance Mask Register +#define AT91C_CAN_MB1_MDH ((AT91_REG *) 0xFFFD0238) // (CAN_MB1) MailBox Data High Register +#define AT91C_CAN_MB1_MCR ((AT91_REG *) 0xFFFD023C) // (CAN_MB1) MailBox Control Register +#define AT91C_CAN_MB1_MFID ((AT91_REG *) 0xFFFD022C) // (CAN_MB1) MailBox Family ID Register +// ========== Register definition for CAN_MB2 peripheral ========== +#define AT91C_CAN_MB2_MCR ((AT91_REG *) 0xFFFD025C) // (CAN_MB2) MailBox Control Register +#define AT91C_CAN_MB2_MDH ((AT91_REG *) 0xFFFD0258) // (CAN_MB2) MailBox Data High Register +#define AT91C_CAN_MB2_MID ((AT91_REG *) 0xFFFD0248) // (CAN_MB2) MailBox ID Register +#define AT91C_CAN_MB2_MDL ((AT91_REG *) 0xFFFD0254) // (CAN_MB2) MailBox Data Low Register +#define AT91C_CAN_MB2_MMR ((AT91_REG *) 0xFFFD0240) // (CAN_MB2) MailBox Mode Register +#define AT91C_CAN_MB2_MAM ((AT91_REG *) 0xFFFD0244) // (CAN_MB2) MailBox Acceptance Mask Register +#define AT91C_CAN_MB2_MFID ((AT91_REG *) 0xFFFD024C) // (CAN_MB2) MailBox Family ID Register +#define AT91C_CAN_MB2_MSR ((AT91_REG *) 0xFFFD0250) // (CAN_MB2) MailBox Status Register +// ========== Register definition for CAN_MB3 peripheral ========== +#define AT91C_CAN_MB3_MFID ((AT91_REG *) 0xFFFD026C) // (CAN_MB3) MailBox Family ID Register +#define AT91C_CAN_MB3_MAM ((AT91_REG *) 0xFFFD0264) // (CAN_MB3) MailBox Acceptance Mask Register +#define AT91C_CAN_MB3_MID ((AT91_REG *) 0xFFFD0268) // (CAN_MB3) MailBox ID Register +#define AT91C_CAN_MB3_MCR ((AT91_REG *) 0xFFFD027C) // (CAN_MB3) MailBox Control Register +#define AT91C_CAN_MB3_MMR ((AT91_REG *) 0xFFFD0260) // (CAN_MB3) MailBox Mode Register +#define AT91C_CAN_MB3_MSR ((AT91_REG *) 0xFFFD0270) // (CAN_MB3) MailBox Status Register +#define AT91C_CAN_MB3_MDL ((AT91_REG *) 0xFFFD0274) // (CAN_MB3) MailBox Data Low Register +#define AT91C_CAN_MB3_MDH ((AT91_REG *) 0xFFFD0278) // (CAN_MB3) MailBox Data High Register +// ========== Register definition for CAN_MB4 peripheral ========== +#define AT91C_CAN_MB4_MID ((AT91_REG *) 0xFFFD0288) // (CAN_MB4) MailBox ID Register +#define AT91C_CAN_MB4_MMR ((AT91_REG *) 0xFFFD0280) // (CAN_MB4) MailBox Mode Register +#define AT91C_CAN_MB4_MDH ((AT91_REG *) 0xFFFD0298) // (CAN_MB4) MailBox Data High Register +#define AT91C_CAN_MB4_MFID ((AT91_REG *) 0xFFFD028C) // (CAN_MB4) MailBox Family ID Register +#define AT91C_CAN_MB4_MSR ((AT91_REG *) 0xFFFD0290) // (CAN_MB4) MailBox Status Register +#define AT91C_CAN_MB4_MCR ((AT91_REG *) 0xFFFD029C) // (CAN_MB4) MailBox Control Register +#define AT91C_CAN_MB4_MDL ((AT91_REG *) 0xFFFD0294) // (CAN_MB4) MailBox Data Low Register +#define AT91C_CAN_MB4_MAM ((AT91_REG *) 0xFFFD0284) // (CAN_MB4) MailBox Acceptance Mask Register +// ========== Register definition for CAN_MB5 peripheral ========== +#define AT91C_CAN_MB5_MSR ((AT91_REG *) 0xFFFD02B0) // (CAN_MB5) MailBox Status Register +#define AT91C_CAN_MB5_MCR ((AT91_REG *) 0xFFFD02BC) // (CAN_MB5) MailBox Control Register +#define AT91C_CAN_MB5_MFID ((AT91_REG *) 0xFFFD02AC) // (CAN_MB5) MailBox Family ID Register +#define AT91C_CAN_MB5_MDH ((AT91_REG *) 0xFFFD02B8) // (CAN_MB5) MailBox Data High Register +#define AT91C_CAN_MB5_MID ((AT91_REG *) 0xFFFD02A8) // (CAN_MB5) MailBox ID Register +#define AT91C_CAN_MB5_MMR ((AT91_REG *) 0xFFFD02A0) // (CAN_MB5) MailBox Mode Register +#define AT91C_CAN_MB5_MDL ((AT91_REG *) 0xFFFD02B4) // (CAN_MB5) MailBox Data Low Register +#define AT91C_CAN_MB5_MAM ((AT91_REG *) 0xFFFD02A4) // (CAN_MB5) MailBox Acceptance Mask Register +// ========== Register definition for CAN_MB6 peripheral ========== +#define AT91C_CAN_MB6_MFID ((AT91_REG *) 0xFFFD02CC) // (CAN_MB6) MailBox Family ID Register +#define AT91C_CAN_MB6_MID ((AT91_REG *) 0xFFFD02C8) // (CAN_MB6) MailBox ID Register +#define AT91C_CAN_MB6_MAM ((AT91_REG *) 0xFFFD02C4) // (CAN_MB6) MailBox Acceptance Mask Register +#define AT91C_CAN_MB6_MSR ((AT91_REG *) 0xFFFD02D0) // (CAN_MB6) MailBox Status Register +#define AT91C_CAN_MB6_MDL ((AT91_REG *) 0xFFFD02D4) // (CAN_MB6) MailBox Data Low Register +#define AT91C_CAN_MB6_MCR ((AT91_REG *) 0xFFFD02DC) // (CAN_MB6) MailBox Control Register +#define AT91C_CAN_MB6_MDH ((AT91_REG *) 0xFFFD02D8) // (CAN_MB6) MailBox Data High Register +#define AT91C_CAN_MB6_MMR ((AT91_REG *) 0xFFFD02C0) // (CAN_MB6) MailBox Mode Register +// ========== Register definition for CAN_MB7 peripheral ========== +#define AT91C_CAN_MB7_MCR ((AT91_REG *) 0xFFFD02FC) // (CAN_MB7) MailBox Control Register +#define AT91C_CAN_MB7_MDH ((AT91_REG *) 0xFFFD02F8) // (CAN_MB7) MailBox Data High Register +#define AT91C_CAN_MB7_MFID ((AT91_REG *) 0xFFFD02EC) // (CAN_MB7) MailBox Family ID Register +#define AT91C_CAN_MB7_MDL ((AT91_REG *) 0xFFFD02F4) // (CAN_MB7) MailBox Data Low Register +#define AT91C_CAN_MB7_MID ((AT91_REG *) 0xFFFD02E8) // (CAN_MB7) MailBox ID Register +#define AT91C_CAN_MB7_MMR ((AT91_REG *) 0xFFFD02E0) // (CAN_MB7) MailBox Mode Register +#define AT91C_CAN_MB7_MAM ((AT91_REG *) 0xFFFD02E4) // (CAN_MB7) MailBox Acceptance Mask Register +#define AT91C_CAN_MB7_MSR ((AT91_REG *) 0xFFFD02F0) // (CAN_MB7) MailBox Status Register +// ========== Register definition for CAN peripheral ========== +#define AT91C_CAN_TCR ((AT91_REG *) 0xFFFD0024) // (CAN) Transfer Command Register +#define AT91C_CAN_IMR ((AT91_REG *) 0xFFFD000C) // (CAN) Interrupt Mask Register +#define AT91C_CAN_IER ((AT91_REG *) 0xFFFD0004) // (CAN) Interrupt Enable Register +#define AT91C_CAN_ECR ((AT91_REG *) 0xFFFD0020) // (CAN) Error Counter Register +#define AT91C_CAN_TIMESTP ((AT91_REG *) 0xFFFD001C) // (CAN) Time Stamp Register +#define AT91C_CAN_MR ((AT91_REG *) 0xFFFD0000) // (CAN) Mode Register +#define AT91C_CAN_IDR ((AT91_REG *) 0xFFFD0008) // (CAN) Interrupt Disable Register +#define AT91C_CAN_ACR ((AT91_REG *) 0xFFFD0028) // (CAN) Abort Command Register +#define AT91C_CAN_TIM ((AT91_REG *) 0xFFFD0018) // (CAN) Timer Register +#define AT91C_CAN_SR ((AT91_REG *) 0xFFFD0010) // (CAN) Status Register +#define AT91C_CAN_BR ((AT91_REG *) 0xFFFD0014) // (CAN) Baudrate Register +#define AT91C_CAN_VR ((AT91_REG *) 0xFFFD00FC) // (CAN) Version Register +// ========== Register definition for EMAC peripheral ========== +#define AT91C_EMAC_ISR ((AT91_REG *) 0xFFFDC024) // (EMAC) Interrupt Status Register +#define AT91C_EMAC_SA4H ((AT91_REG *) 0xFFFDC0B4) // (EMAC) Specific Address 4 Top, Last 2 bytes +#define AT91C_EMAC_SA1L ((AT91_REG *) 0xFFFDC098) // (EMAC) Specific Address 1 Bottom, First 4 bytes +#define AT91C_EMAC_ELE ((AT91_REG *) 0xFFFDC078) // (EMAC) Excessive Length Errors Register +#define AT91C_EMAC_LCOL ((AT91_REG *) 0xFFFDC05C) // (EMAC) Late Collision Register +#define AT91C_EMAC_RLE ((AT91_REG *) 0xFFFDC088) // (EMAC) Receive Length Field Mismatch Register +#define AT91C_EMAC_WOL ((AT91_REG *) 0xFFFDC0C4) // (EMAC) Wake On LAN Register +#define AT91C_EMAC_DTF ((AT91_REG *) 0xFFFDC058) // (EMAC) Deferred Transmission Frame Register +#define AT91C_EMAC_TUND ((AT91_REG *) 0xFFFDC064) // (EMAC) Transmit Underrun Error Register +#define AT91C_EMAC_NCR ((AT91_REG *) 0xFFFDC000) // (EMAC) Network Control Register +#define AT91C_EMAC_SA4L ((AT91_REG *) 0xFFFDC0B0) // (EMAC) Specific Address 4 Bottom, First 4 bytes +#define AT91C_EMAC_RSR ((AT91_REG *) 0xFFFDC020) // (EMAC) Receive Status Register +#define AT91C_EMAC_SA3L ((AT91_REG *) 0xFFFDC0A8) // (EMAC) Specific Address 3 Bottom, First 4 bytes +#define AT91C_EMAC_TSR ((AT91_REG *) 0xFFFDC014) // (EMAC) Transmit Status Register +#define AT91C_EMAC_IDR ((AT91_REG *) 0xFFFDC02C) // (EMAC) Interrupt Disable Register +#define AT91C_EMAC_RSE ((AT91_REG *) 0xFFFDC074) // (EMAC) Receive Symbol Errors Register +#define AT91C_EMAC_ECOL ((AT91_REG *) 0xFFFDC060) // (EMAC) Excessive Collision Register +#define AT91C_EMAC_TID ((AT91_REG *) 0xFFFDC0B8) // (EMAC) Type ID Checking Register +#define AT91C_EMAC_HRB ((AT91_REG *) 0xFFFDC090) // (EMAC) Hash Address Bottom[31:0] +#define AT91C_EMAC_TBQP ((AT91_REG *) 0xFFFDC01C) // (EMAC) Transmit Buffer Queue Pointer +#define AT91C_EMAC_USRIO ((AT91_REG *) 0xFFFDC0C0) // (EMAC) USER Input/Output Register +#define AT91C_EMAC_PTR ((AT91_REG *) 0xFFFDC038) // (EMAC) Pause Time Register +#define AT91C_EMAC_SA2H ((AT91_REG *) 0xFFFDC0A4) // (EMAC) Specific Address 2 Top, Last 2 bytes +#define AT91C_EMAC_ROV ((AT91_REG *) 0xFFFDC070) // (EMAC) Receive Overrun Errors Register +#define AT91C_EMAC_ALE ((AT91_REG *) 0xFFFDC054) // (EMAC) Alignment Error Register +#define AT91C_EMAC_RJA ((AT91_REG *) 0xFFFDC07C) // (EMAC) Receive Jabbers Register +#define AT91C_EMAC_RBQP ((AT91_REG *) 0xFFFDC018) // (EMAC) Receive Buffer Queue Pointer +#define AT91C_EMAC_TPF ((AT91_REG *) 0xFFFDC08C) // (EMAC) Transmitted Pause Frames Register +#define AT91C_EMAC_NCFGR ((AT91_REG *) 0xFFFDC004) // (EMAC) Network Configuration Register +#define AT91C_EMAC_HRT ((AT91_REG *) 0xFFFDC094) // (EMAC) Hash Address Top[63:32] +#define AT91C_EMAC_USF ((AT91_REG *) 0xFFFDC080) // (EMAC) Undersize Frames Register +#define AT91C_EMAC_FCSE ((AT91_REG *) 0xFFFDC050) // (EMAC) Frame Check Sequence Error Register +#define AT91C_EMAC_TPQ ((AT91_REG *) 0xFFFDC0BC) // (EMAC) Transmit Pause Quantum Register +#define AT91C_EMAC_MAN ((AT91_REG *) 0xFFFDC034) // (EMAC) PHY Maintenance Register +#define AT91C_EMAC_FTO ((AT91_REG *) 0xFFFDC040) // (EMAC) Frames Transmitted OK Register +#define AT91C_EMAC_REV ((AT91_REG *) 0xFFFDC0FC) // (EMAC) Revision Register +#define AT91C_EMAC_IMR ((AT91_REG *) 0xFFFDC030) // (EMAC) Interrupt Mask Register +#define AT91C_EMAC_SCF ((AT91_REG *) 0xFFFDC044) // (EMAC) Single Collision Frame Register +#define AT91C_EMAC_PFR ((AT91_REG *) 0xFFFDC03C) // (EMAC) Pause Frames received Register +#define AT91C_EMAC_MCF ((AT91_REG *) 0xFFFDC048) // (EMAC) Multiple Collision Frame Register +#define AT91C_EMAC_NSR ((AT91_REG *) 0xFFFDC008) // (EMAC) Network Status Register +#define AT91C_EMAC_SA2L ((AT91_REG *) 0xFFFDC0A0) // (EMAC) Specific Address 2 Bottom, First 4 bytes +#define AT91C_EMAC_FRO ((AT91_REG *) 0xFFFDC04C) // (EMAC) Frames Received OK Register +#define AT91C_EMAC_IER ((AT91_REG *) 0xFFFDC028) // (EMAC) Interrupt Enable Register +#define AT91C_EMAC_SA1H ((AT91_REG *) 0xFFFDC09C) // (EMAC) Specific Address 1 Top, Last 2 bytes +#define AT91C_EMAC_CSE ((AT91_REG *) 0xFFFDC068) // (EMAC) Carrier Sense Error Register +#define AT91C_EMAC_SA3H ((AT91_REG *) 0xFFFDC0AC) // (EMAC) Specific Address 3 Top, Last 2 bytes +#define AT91C_EMAC_RRE ((AT91_REG *) 0xFFFDC06C) // (EMAC) Receive Ressource Error Register +#define AT91C_EMAC_STE ((AT91_REG *) 0xFFFDC084) // (EMAC) SQE Test Error Register +// ========== Register definition for PDC_ADC peripheral ========== +#define AT91C_ADC_PTSR ((AT91_REG *) 0xFFFD8124) // (PDC_ADC) PDC Transfer Status Register +#define AT91C_ADC_PTCR ((AT91_REG *) 0xFFFD8120) // (PDC_ADC) PDC Transfer Control Register +#define AT91C_ADC_TNPR ((AT91_REG *) 0xFFFD8118) // (PDC_ADC) Transmit Next Pointer Register +#define AT91C_ADC_TNCR ((AT91_REG *) 0xFFFD811C) // (PDC_ADC) Transmit Next Counter Register +#define AT91C_ADC_RNPR ((AT91_REG *) 0xFFFD8110) // (PDC_ADC) Receive Next Pointer Register +#define AT91C_ADC_RNCR ((AT91_REG *) 0xFFFD8114) // (PDC_ADC) Receive Next Counter Register +#define AT91C_ADC_RPR ((AT91_REG *) 0xFFFD8100) // (PDC_ADC) Receive Pointer Register +#define AT91C_ADC_TCR ((AT91_REG *) 0xFFFD810C) // (PDC_ADC) Transmit Counter Register +#define AT91C_ADC_TPR ((AT91_REG *) 0xFFFD8108) // (PDC_ADC) Transmit Pointer Register +#define AT91C_ADC_RCR ((AT91_REG *) 0xFFFD8104) // (PDC_ADC) Receive Counter Register +// ========== Register definition for ADC peripheral ========== +#define AT91C_ADC_CDR2 ((AT91_REG *) 0xFFFD8038) // (ADC) ADC Channel Data Register 2 +#define AT91C_ADC_CDR3 ((AT91_REG *) 0xFFFD803C) // (ADC) ADC Channel Data Register 3 +#define AT91C_ADC_CDR0 ((AT91_REG *) 0xFFFD8030) // (ADC) ADC Channel Data Register 0 +#define AT91C_ADC_CDR5 ((AT91_REG *) 0xFFFD8044) // (ADC) ADC Channel Data Register 5 +#define AT91C_ADC_CHDR ((AT91_REG *) 0xFFFD8014) // (ADC) ADC Channel Disable Register +#define AT91C_ADC_SR ((AT91_REG *) 0xFFFD801C) // (ADC) ADC Status Register +#define AT91C_ADC_CDR4 ((AT91_REG *) 0xFFFD8040) // (ADC) ADC Channel Data Register 4 +#define AT91C_ADC_CDR1 ((AT91_REG *) 0xFFFD8034) // (ADC) ADC Channel Data Register 1 +#define AT91C_ADC_LCDR ((AT91_REG *) 0xFFFD8020) // (ADC) ADC Last Converted Data Register +#define AT91C_ADC_IDR ((AT91_REG *) 0xFFFD8028) // (ADC) ADC Interrupt Disable Register +#define AT91C_ADC_CR ((AT91_REG *) 0xFFFD8000) // (ADC) ADC Control Register +#define AT91C_ADC_CDR7 ((AT91_REG *) 0xFFFD804C) // (ADC) ADC Channel Data Register 7 +#define AT91C_ADC_CDR6 ((AT91_REG *) 0xFFFD8048) // (ADC) ADC Channel Data Register 6 +#define AT91C_ADC_IER ((AT91_REG *) 0xFFFD8024) // (ADC) ADC Interrupt Enable Register +#define AT91C_ADC_CHER ((AT91_REG *) 0xFFFD8010) // (ADC) ADC Channel Enable Register +#define AT91C_ADC_CHSR ((AT91_REG *) 0xFFFD8018) // (ADC) ADC Channel Status Register +#define AT91C_ADC_MR ((AT91_REG *) 0xFFFD8004) // (ADC) ADC Mode Register +#define AT91C_ADC_IMR ((AT91_REG *) 0xFFFD802C) // (ADC) ADC Interrupt Mask Register +// ========== Register definition for PDC_AES peripheral ========== +#define AT91C_AES_TPR ((AT91_REG *) 0xFFFA4108) // (PDC_AES) Transmit Pointer Register +#define AT91C_AES_PTCR ((AT91_REG *) 0xFFFA4120) // (PDC_AES) PDC Transfer Control Register +#define AT91C_AES_RNPR ((AT91_REG *) 0xFFFA4110) // (PDC_AES) Receive Next Pointer Register +#define AT91C_AES_TNCR ((AT91_REG *) 0xFFFA411C) // (PDC_AES) Transmit Next Counter Register +#define AT91C_AES_TCR ((AT91_REG *) 0xFFFA410C) // (PDC_AES) Transmit Counter Register +#define AT91C_AES_RCR ((AT91_REG *) 0xFFFA4104) // (PDC_AES) Receive Counter Register +#define AT91C_AES_RNCR ((AT91_REG *) 0xFFFA4114) // (PDC_AES) Receive Next Counter Register +#define AT91C_AES_TNPR ((AT91_REG *) 0xFFFA4118) // (PDC_AES) Transmit Next Pointer Register +#define AT91C_AES_RPR ((AT91_REG *) 0xFFFA4100) // (PDC_AES) Receive Pointer Register +#define AT91C_AES_PTSR ((AT91_REG *) 0xFFFA4124) // (PDC_AES) PDC Transfer Status Register +// ========== Register definition for AES peripheral ========== +#define AT91C_AES_IVxR ((AT91_REG *) 0xFFFA4060) // (AES) Initialization Vector x Register +#define AT91C_AES_MR ((AT91_REG *) 0xFFFA4004) // (AES) Mode Register +#define AT91C_AES_VR ((AT91_REG *) 0xFFFA40FC) // (AES) AES Version Register +#define AT91C_AES_ODATAxR ((AT91_REG *) 0xFFFA4050) // (AES) Output Data x Register +#define AT91C_AES_IDATAxR ((AT91_REG *) 0xFFFA4040) // (AES) Input Data x Register +#define AT91C_AES_CR ((AT91_REG *) 0xFFFA4000) // (AES) Control Register +#define AT91C_AES_IDR ((AT91_REG *) 0xFFFA4014) // (AES) Interrupt Disable Register +#define AT91C_AES_IMR ((AT91_REG *) 0xFFFA4018) // (AES) Interrupt Mask Register +#define AT91C_AES_IER ((AT91_REG *) 0xFFFA4010) // (AES) Interrupt Enable Register +#define AT91C_AES_KEYWxR ((AT91_REG *) 0xFFFA4020) // (AES) Key Word x Register +#define AT91C_AES_ISR ((AT91_REG *) 0xFFFA401C) // (AES) Interrupt Status Register +// ========== Register definition for PDC_TDES peripheral ========== +#define AT91C_TDES_RNCR ((AT91_REG *) 0xFFFA8114) // (PDC_TDES) Receive Next Counter Register +#define AT91C_TDES_TCR ((AT91_REG *) 0xFFFA810C) // (PDC_TDES) Transmit Counter Register +#define AT91C_TDES_RCR ((AT91_REG *) 0xFFFA8104) // (PDC_TDES) Receive Counter Register +#define AT91C_TDES_TNPR ((AT91_REG *) 0xFFFA8118) // (PDC_TDES) Transmit Next Pointer Register +#define AT91C_TDES_RNPR ((AT91_REG *) 0xFFFA8110) // (PDC_TDES) Receive Next Pointer Register +#define AT91C_TDES_RPR ((AT91_REG *) 0xFFFA8100) // (PDC_TDES) Receive Pointer Register +#define AT91C_TDES_TNCR ((AT91_REG *) 0xFFFA811C) // (PDC_TDES) Transmit Next Counter Register +#define AT91C_TDES_TPR ((AT91_REG *) 0xFFFA8108) // (PDC_TDES) Transmit Pointer Register +#define AT91C_TDES_PTSR ((AT91_REG *) 0xFFFA8124) // (PDC_TDES) PDC Transfer Status Register +#define AT91C_TDES_PTCR ((AT91_REG *) 0xFFFA8120) // (PDC_TDES) PDC Transfer Control Register +// ========== Register definition for TDES peripheral ========== +#define AT91C_TDES_KEY2WxR ((AT91_REG *) 0xFFFA8028) // (TDES) Key 2 Word x Register +#define AT91C_TDES_KEY3WxR ((AT91_REG *) 0xFFFA8030) // (TDES) Key 3 Word x Register +#define AT91C_TDES_IDR ((AT91_REG *) 0xFFFA8014) // (TDES) Interrupt Disable Register +#define AT91C_TDES_VR ((AT91_REG *) 0xFFFA80FC) // (TDES) TDES Version Register +#define AT91C_TDES_IVxR ((AT91_REG *) 0xFFFA8060) // (TDES) Initialization Vector x Register +#define AT91C_TDES_ODATAxR ((AT91_REG *) 0xFFFA8050) // (TDES) Output Data x Register +#define AT91C_TDES_IMR ((AT91_REG *) 0xFFFA8018) // (TDES) Interrupt Mask Register +#define AT91C_TDES_MR ((AT91_REG *) 0xFFFA8004) // (TDES) Mode Register +#define AT91C_TDES_CR ((AT91_REG *) 0xFFFA8000) // (TDES) Control Register +#define AT91C_TDES_IER ((AT91_REG *) 0xFFFA8010) // (TDES) Interrupt Enable Register +#define AT91C_TDES_ISR ((AT91_REG *) 0xFFFA801C) // (TDES) Interrupt Status Register +#define AT91C_TDES_IDATAxR ((AT91_REG *) 0xFFFA8040) // (TDES) Input Data x Register +#define AT91C_TDES_KEY1WxR ((AT91_REG *) 0xFFFA8020) // (TDES) Key 1 Word x Register + +// ***************************************************************************** +// PIO DEFINITIONS FOR AT91SAM7X256 +// ***************************************************************************** +#define AT91C_PIO_PA0 ((unsigned int) 1 << 0) // Pin Controlled by PA0 +#define AT91C_PA0_RXD0 ((unsigned int) AT91C_PIO_PA0) // USART 0 Receive Data +#define AT91C_PIO_PA1 ((unsigned int) 1 << 1) // Pin Controlled by PA1 +#define AT91C_PA1_TXD0 ((unsigned int) AT91C_PIO_PA1) // USART 0 Transmit Data +#define AT91C_PIO_PA10 ((unsigned int) 1 << 10) // Pin Controlled by PA10 +#define AT91C_PA10_TWD ((unsigned int) AT91C_PIO_PA10) // TWI Two-wire Serial Data +#define AT91C_PIO_PA11 ((unsigned int) 1 << 11) // Pin Controlled by PA11 +#define AT91C_PA11_TWCK ((unsigned int) AT91C_PIO_PA11) // TWI Two-wire Serial Clock +#define AT91C_PIO_PA12 ((unsigned int) 1 << 12) // Pin Controlled by PA12 +#define AT91C_PA12_NPCS00 ((unsigned int) AT91C_PIO_PA12) // SPI 0 Peripheral Chip Select 0 +#define AT91C_PIO_PA13 ((unsigned int) 1 << 13) // Pin Controlled by PA13 +#define AT91C_PA13_NPCS01 ((unsigned int) AT91C_PIO_PA13) // SPI 0 Peripheral Chip Select 1 +#define AT91C_PA13_PCK1 ((unsigned int) AT91C_PIO_PA13) // PMC Programmable Clock Output 1 +#define AT91C_PIO_PA14 ((unsigned int) 1 << 14) // Pin Controlled by PA14 +#define AT91C_PA14_NPCS02 ((unsigned int) AT91C_PIO_PA14) // SPI 0 Peripheral Chip Select 2 +#define AT91C_PA14_IRQ1 ((unsigned int) AT91C_PIO_PA14) // External Interrupt 1 +#define AT91C_PIO_PA15 ((unsigned int) 1 << 15) // Pin Controlled by PA15 +#define AT91C_PA15_NPCS03 ((unsigned int) AT91C_PIO_PA15) // SPI 0 Peripheral Chip Select 3 +#define AT91C_PA15_TCLK2 ((unsigned int) AT91C_PIO_PA15) // Timer Counter 2 external clock input +#define AT91C_PIO_PA16 ((unsigned int) 1 << 16) // Pin Controlled by PA16 +#define AT91C_PA16_MISO0 ((unsigned int) AT91C_PIO_PA16) // SPI 0 Master In Slave +#define AT91C_PIO_PA17 ((unsigned int) 1 << 17) // Pin Controlled by PA17 +#define AT91C_PA17_MOSI0 ((unsigned int) AT91C_PIO_PA17) // SPI 0 Master Out Slave +#define AT91C_PIO_PA18 ((unsigned int) 1 << 18) // Pin Controlled by PA18 +#define AT91C_PA18_SPCK0 ((unsigned int) AT91C_PIO_PA18) // SPI 0 Serial Clock +#define AT91C_PIO_PA19 ((unsigned int) 1 << 19) // Pin Controlled by PA19 +#define AT91C_PA19_CANRX ((unsigned int) AT91C_PIO_PA19) // CAN Receive +#define AT91C_PIO_PA2 ((unsigned int) 1 << 2) // Pin Controlled by PA2 +#define AT91C_PA2_SCK0 ((unsigned int) AT91C_PIO_PA2) // USART 0 Serial Clock +#define AT91C_PA2_NPCS11 ((unsigned int) AT91C_PIO_PA2) // SPI 1 Peripheral Chip Select 1 +#define AT91C_PIO_PA20 ((unsigned int) 1 << 20) // Pin Controlled by PA20 +#define AT91C_PA20_CANTX ((unsigned int) AT91C_PIO_PA20) // CAN Transmit +#define AT91C_PIO_PA21 ((unsigned int) 1 << 21) // Pin Controlled by PA21 +#define AT91C_PA21_TF ((unsigned int) AT91C_PIO_PA21) // SSC Transmit Frame Sync +#define AT91C_PA21_NPCS10 ((unsigned int) AT91C_PIO_PA21) // SPI 1 Peripheral Chip Select 0 +#define AT91C_PIO_PA22 ((unsigned int) 1 << 22) // Pin Controlled by PA22 +#define AT91C_PA22_TK ((unsigned int) AT91C_PIO_PA22) // SSC Transmit Clock +#define AT91C_PA22_SPCK1 ((unsigned int) AT91C_PIO_PA22) // SPI 1 Serial Clock +#define AT91C_PIO_PA23 ((unsigned int) 1 << 23) // Pin Controlled by PA23 +#define AT91C_PA23_TD ((unsigned int) AT91C_PIO_PA23) // SSC Transmit data +#define AT91C_PA23_MOSI1 ((unsigned int) AT91C_PIO_PA23) // SPI 1 Master Out Slave +#define AT91C_PIO_PA24 ((unsigned int) 1 << 24) // Pin Controlled by PA24 +#define AT91C_PA24_RD ((unsigned int) AT91C_PIO_PA24) // SSC Receive Data +#define AT91C_PA24_MISO1 ((unsigned int) AT91C_PIO_PA24) // SPI 1 Master In Slave +#define AT91C_PIO_PA25 ((unsigned int) 1 << 25) // Pin Controlled by PA25 +#define AT91C_PA25_RK ((unsigned int) AT91C_PIO_PA25) // SSC Receive Clock +#define AT91C_PA25_NPCS11 ((unsigned int) AT91C_PIO_PA25) // SPI 1 Peripheral Chip Select 1 +#define AT91C_PIO_PA26 ((unsigned int) 1 << 26) // Pin Controlled by PA26 +#define AT91C_PA26_RF ((unsigned int) AT91C_PIO_PA26) // SSC Receive Frame Sync +#define AT91C_PA26_NPCS12 ((unsigned int) AT91C_PIO_PA26) // SPI 1 Peripheral Chip Select 2 +#define AT91C_PIO_PA27 ((unsigned int) 1 << 27) // Pin Controlled by PA27 +#define AT91C_PA27_DRXD ((unsigned int) AT91C_PIO_PA27) // DBGU Debug Receive Data +#define AT91C_PA27_PCK3 ((unsigned int) AT91C_PIO_PA27) // PMC Programmable Clock Output 3 +#define AT91C_PIO_PA28 ((unsigned int) 1 << 28) // Pin Controlled by PA28 +#define AT91C_PA28_DTXD ((unsigned int) AT91C_PIO_PA28) // DBGU Debug Transmit Data +#define AT91C_PIO_PA29 ((unsigned int) 1 << 29) // Pin Controlled by PA29 +#define AT91C_PA29_FIQ ((unsigned int) AT91C_PIO_PA29) // AIC Fast Interrupt Input +#define AT91C_PA29_NPCS13 ((unsigned int) AT91C_PIO_PA29) // SPI 1 Peripheral Chip Select 3 +#define AT91C_PIO_PA3 ((unsigned int) 1 << 3) // Pin Controlled by PA3 +#define AT91C_PA3_RTS0 ((unsigned int) AT91C_PIO_PA3) // USART 0 Ready To Send +#define AT91C_PA3_NPCS12 ((unsigned int) AT91C_PIO_PA3) // SPI 1 Peripheral Chip Select 2 +#define AT91C_PIO_PA30 ((unsigned int) 1 << 30) // Pin Controlled by PA30 +#define AT91C_PA30_IRQ0 ((unsigned int) AT91C_PIO_PA30) // External Interrupt 0 +#define AT91C_PA30_PCK2 ((unsigned int) AT91C_PIO_PA30) // PMC Programmable Clock Output 2 +#define AT91C_PIO_PA4 ((unsigned int) 1 << 4) // Pin Controlled by PA4 +#define AT91C_PA4_CTS0 ((unsigned int) AT91C_PIO_PA4) // USART 0 Clear To Send +#define AT91C_PA4_NPCS13 ((unsigned int) AT91C_PIO_PA4) // SPI 1 Peripheral Chip Select 3 +#define AT91C_PIO_PA5 ((unsigned int) 1 << 5) // Pin Controlled by PA5 +#define AT91C_PA5_RXD1 ((unsigned int) AT91C_PIO_PA5) // USART 1 Receive Data +#define AT91C_PIO_PA6 ((unsigned int) 1 << 6) // Pin Controlled by PA6 +#define AT91C_PA6_TXD1 ((unsigned int) AT91C_PIO_PA6) // USART 1 Transmit Data +#define AT91C_PIO_PA7 ((unsigned int) 1 << 7) // Pin Controlled by PA7 +#define AT91C_PA7_SCK1 ((unsigned int) AT91C_PIO_PA7) // USART 1 Serial Clock +#define AT91C_PA7_NPCS01 ((unsigned int) AT91C_PIO_PA7) // SPI 0 Peripheral Chip Select 1 +#define AT91C_PIO_PA8 ((unsigned int) 1 << 8) // Pin Controlled by PA8 +#define AT91C_PA8_RTS1 ((unsigned int) AT91C_PIO_PA8) // USART 1 Ready To Send +#define AT91C_PA8_NPCS02 ((unsigned int) AT91C_PIO_PA8) // SPI 0 Peripheral Chip Select 2 +#define AT91C_PIO_PA9 ((unsigned int) 1 << 9) // Pin Controlled by PA9 +#define AT91C_PA9_CTS1 ((unsigned int) AT91C_PIO_PA9) // USART 1 Clear To Send +#define AT91C_PA9_NPCS03 ((unsigned int) AT91C_PIO_PA9) // SPI 0 Peripheral Chip Select 3 +#define AT91C_PIO_PB0 ((unsigned int) 1 << 0) // Pin Controlled by PB0 +#define AT91C_PB0_ETXCK_EREFCK ((unsigned int) AT91C_PIO_PB0) // Ethernet MAC Transmit Clock/Reference Clock +#define AT91C_PB0_PCK0 ((unsigned int) AT91C_PIO_PB0) // PMC Programmable Clock Output 0 +#define AT91C_PIO_PB1 ((unsigned int) 1 << 1) // Pin Controlled by PB1 +#define AT91C_PB1_ETXEN ((unsigned int) AT91C_PIO_PB1) // Ethernet MAC Transmit Enable +#define AT91C_PIO_PB10 ((unsigned int) 1 << 10) // Pin Controlled by PB10 +#define AT91C_PB10_ETX2 ((unsigned int) AT91C_PIO_PB10) // Ethernet MAC Transmit Data 2 +#define AT91C_PB10_NPCS11 ((unsigned int) AT91C_PIO_PB10) // SPI 1 Peripheral Chip Select 1 +#define AT91C_PIO_PB11 ((unsigned int) 1 << 11) // Pin Controlled by PB11 +#define AT91C_PB11_ETX3 ((unsigned int) AT91C_PIO_PB11) // Ethernet MAC Transmit Data 3 +#define AT91C_PB11_NPCS12 ((unsigned int) AT91C_PIO_PB11) // SPI 1 Peripheral Chip Select 2 +#define AT91C_PIO_PB12 ((unsigned int) 1 << 12) // Pin Controlled by PB12 +#define AT91C_PB12_ETXER ((unsigned int) AT91C_PIO_PB12) // Ethernet MAC Transmikt Coding Error +#define AT91C_PB12_TCLK0 ((unsigned int) AT91C_PIO_PB12) // Timer Counter 0 external clock input +#define AT91C_PIO_PB13 ((unsigned int) 1 << 13) // Pin Controlled by PB13 +#define AT91C_PB13_ERX2 ((unsigned int) AT91C_PIO_PB13) // Ethernet MAC Receive Data 2 +#define AT91C_PB13_NPCS01 ((unsigned int) AT91C_PIO_PB13) // SPI 0 Peripheral Chip Select 1 +#define AT91C_PIO_PB14 ((unsigned int) 1 << 14) // Pin Controlled by PB14 +#define AT91C_PB14_ERX3 ((unsigned int) AT91C_PIO_PB14) // Ethernet MAC Receive Data 3 +#define AT91C_PB14_NPCS02 ((unsigned int) AT91C_PIO_PB14) // SPI 0 Peripheral Chip Select 2 +#define AT91C_PIO_PB15 ((unsigned int) 1 << 15) // Pin Controlled by PB15 +#define AT91C_PB15_ERXDV ((unsigned int) AT91C_PIO_PB15) // Ethernet MAC Receive Data Valid +#define AT91C_PIO_PB16 ((unsigned int) 1 << 16) // Pin Controlled by PB16 +#define AT91C_PB16_ECOL ((unsigned int) AT91C_PIO_PB16) // Ethernet MAC Collision Detected +#define AT91C_PB16_NPCS13 ((unsigned int) AT91C_PIO_PB16) // SPI 1 Peripheral Chip Select 3 +#define AT91C_PIO_PB17 ((unsigned int) 1 << 17) // Pin Controlled by PB17 +#define AT91C_PB17_ERXCK ((unsigned int) AT91C_PIO_PB17) // Ethernet MAC Receive Clock +#define AT91C_PB17_NPCS03 ((unsigned int) AT91C_PIO_PB17) // SPI 0 Peripheral Chip Select 3 +#define AT91C_PIO_PB18 ((unsigned int) 1 << 18) // Pin Controlled by PB18 +#define AT91C_PB18_EF100 ((unsigned int) AT91C_PIO_PB18) // Ethernet MAC Force 100 Mbits/sec +#define AT91C_PB18_ADTRG ((unsigned int) AT91C_PIO_PB18) // ADC External Trigger +#define AT91C_PIO_PB19 ((unsigned int) 1 << 19) // Pin Controlled by PB19 +#define AT91C_PB19_PWM0 ((unsigned int) AT91C_PIO_PB19) // PWM Channel 0 +#define AT91C_PB19_TCLK1 ((unsigned int) AT91C_PIO_PB19) // Timer Counter 1 external clock input +#define AT91C_PIO_PB2 ((unsigned int) 1 << 2) // Pin Controlled by PB2 +#define AT91C_PB2_ETX0 ((unsigned int) AT91C_PIO_PB2) // Ethernet MAC Transmit Data 0 +#define AT91C_PIO_PB20 ((unsigned int) 1 << 20) // Pin Controlled by PB20 +#define AT91C_PB20_PWM1 ((unsigned int) AT91C_PIO_PB20) // PWM Channel 1 +#define AT91C_PB20_PCK0 ((unsigned int) AT91C_PIO_PB20) // PMC Programmable Clock Output 0 +#define AT91C_PIO_PB21 ((unsigned int) 1 << 21) // Pin Controlled by PB21 +#define AT91C_PB21_PWM2 ((unsigned int) AT91C_PIO_PB21) // PWM Channel 2 +#define AT91C_PB21_PCK1 ((unsigned int) AT91C_PIO_PB21) // PMC Programmable Clock Output 1 +#define AT91C_PIO_PB22 ((unsigned int) 1 << 22) // Pin Controlled by PB22 +#define AT91C_PB22_PWM3 ((unsigned int) AT91C_PIO_PB22) // PWM Channel 3 +#define AT91C_PB22_PCK2 ((unsigned int) AT91C_PIO_PB22) // PMC Programmable Clock Output 2 +#define AT91C_PIO_PB23 ((unsigned int) 1 << 23) // Pin Controlled by PB23 +#define AT91C_PB23_TIOA0 ((unsigned int) AT91C_PIO_PB23) // Timer Counter 0 Multipurpose Timer I/O Pin A +#define AT91C_PB23_DCD1 ((unsigned int) AT91C_PIO_PB23) // USART 1 Data Carrier Detect +#define AT91C_PIO_PB24 ((unsigned int) 1 << 24) // Pin Controlled by PB24 +#define AT91C_PB24_TIOB0 ((unsigned int) AT91C_PIO_PB24) // Timer Counter 0 Multipurpose Timer I/O Pin B +#define AT91C_PB24_DSR1 ((unsigned int) AT91C_PIO_PB24) // USART 1 Data Set ready +#define AT91C_PIO_PB25 ((unsigned int) 1 << 25) // Pin Controlled by PB25 +#define AT91C_PB25_TIOA1 ((unsigned int) AT91C_PIO_PB25) // Timer Counter 1 Multipurpose Timer I/O Pin A +#define AT91C_PB25_DTR1 ((unsigned int) AT91C_PIO_PB25) // USART 1 Data Terminal ready +#define AT91C_PIO_PB26 ((unsigned int) 1 << 26) // Pin Controlled by PB26 +#define AT91C_PB26_TIOB1 ((unsigned int) AT91C_PIO_PB26) // Timer Counter 1 Multipurpose Timer I/O Pin B +#define AT91C_PB26_RI1 ((unsigned int) AT91C_PIO_PB26) // USART 1 Ring Indicator +#define AT91C_PIO_PB27 ((unsigned int) 1 << 27) // Pin Controlled by PB27 +#define AT91C_PB27_TIOA2 ((unsigned int) AT91C_PIO_PB27) // Timer Counter 2 Multipurpose Timer I/O Pin A +#define AT91C_PB27_PWM0 ((unsigned int) AT91C_PIO_PB27) // PWM Channel 0 +#define AT91C_PIO_PB28 ((unsigned int) 1 << 28) // Pin Controlled by PB28 +#define AT91C_PB28_TIOB2 ((unsigned int) AT91C_PIO_PB28) // Timer Counter 2 Multipurpose Timer I/O Pin B +#define AT91C_PB28_PWM1 ((unsigned int) AT91C_PIO_PB28) // PWM Channel 1 +#define AT91C_PIO_PB29 ((unsigned int) 1 << 29) // Pin Controlled by PB29 +#define AT91C_PB29_PCK1 ((unsigned int) AT91C_PIO_PB29) // PMC Programmable Clock Output 1 +#define AT91C_PB29_PWM2 ((unsigned int) AT91C_PIO_PB29) // PWM Channel 2 +#define AT91C_PIO_PB3 ((unsigned int) 1 << 3) // Pin Controlled by PB3 +#define AT91C_PB3_ETX1 ((unsigned int) AT91C_PIO_PB3) // Ethernet MAC Transmit Data 1 +#define AT91C_PIO_PB30 ((unsigned int) 1 << 30) // Pin Controlled by PB30 +#define AT91C_PB30_PCK2 ((unsigned int) AT91C_PIO_PB30) // PMC Programmable Clock Output 2 +#define AT91C_PB30_PWM3 ((unsigned int) AT91C_PIO_PB30) // PWM Channel 3 +#define AT91C_PIO_PB4 ((unsigned int) 1 << 4) // Pin Controlled by PB4 +#define AT91C_PB4_ECRS_ECRSDV ((unsigned int) AT91C_PIO_PB4) // Ethernet MAC Carrier Sense/Carrier Sense and Data Valid +#define AT91C_PIO_PB5 ((unsigned int) 1 << 5) // Pin Controlled by PB5 +#define AT91C_PB5_ERX0 ((unsigned int) AT91C_PIO_PB5) // Ethernet MAC Receive Data 0 +#define AT91C_PIO_PB6 ((unsigned int) 1 << 6) // Pin Controlled by PB6 +#define AT91C_PB6_ERX1 ((unsigned int) AT91C_PIO_PB6) // Ethernet MAC Receive Data 1 +#define AT91C_PIO_PB7 ((unsigned int) 1 << 7) // Pin Controlled by PB7 +#define AT91C_PB7_ERXER ((unsigned int) AT91C_PIO_PB7) // Ethernet MAC Receive Error +#define AT91C_PIO_PB8 ((unsigned int) 1 << 8) // Pin Controlled by PB8 +#define AT91C_PB8_EMDC ((unsigned int) AT91C_PIO_PB8) // Ethernet MAC Management Data Clock +#define AT91C_PIO_PB9 ((unsigned int) 1 << 9) // Pin Controlled by PB9 +#define AT91C_PB9_EMDIO ((unsigned int) AT91C_PIO_PB9) // Ethernet MAC Management Data Input/Output + +// ***************************************************************************** +// PERIPHERAL ID DEFINITIONS FOR AT91SAM7X256 +// ***************************************************************************** +#define AT91C_ID_FIQ ((unsigned int) 0) // Advanced Interrupt Controller (FIQ) +#define AT91C_ID_SYS ((unsigned int) 1) // System Peripheral +#define AT91C_ID_PIOA ((unsigned int) 2) // Parallel IO Controller A +#define AT91C_ID_PIOB ((unsigned int) 3) // Parallel IO Controller B +#define AT91C_ID_SPI0 ((unsigned int) 4) // Serial Peripheral Interface 0 +#define AT91C_ID_SPI1 ((unsigned int) 5) // Serial Peripheral Interface 1 +#define AT91C_ID_US0 ((unsigned int) 6) // USART 0 +#define AT91C_ID_US1 ((unsigned int) 7) // USART 1 +#define AT91C_ID_SSC ((unsigned int) 8) // Serial Synchronous Controller +#define AT91C_ID_TWI ((unsigned int) 9) // Two-Wire Interface +#define AT91C_ID_PWMC ((unsigned int) 10) // PWM Controller +#define AT91C_ID_UDP ((unsigned int) 11) // USB Device Port +#define AT91C_ID_TC0 ((unsigned int) 12) // Timer Counter 0 +#define AT91C_ID_TC1 ((unsigned int) 13) // Timer Counter 1 +#define AT91C_ID_TC2 ((unsigned int) 14) // Timer Counter 2 +#define AT91C_ID_CAN ((unsigned int) 15) // Control Area Network Controller +#define AT91C_ID_EMAC ((unsigned int) 16) // Ethernet MAC +#define AT91C_ID_ADC ((unsigned int) 17) // Analog-to-Digital Converter +#define AT91C_ID_AES ((unsigned int) 18) // Advanced Encryption Standard 128-bit +#define AT91C_ID_TDES ((unsigned int) 19) // Triple Data Encryption Standard +#define AT91C_ID_20_Reserved ((unsigned int) 20) // Reserved +#define AT91C_ID_21_Reserved ((unsigned int) 21) // Reserved +#define AT91C_ID_22_Reserved ((unsigned int) 22) // Reserved +#define AT91C_ID_23_Reserved ((unsigned int) 23) // Reserved +#define AT91C_ID_24_Reserved ((unsigned int) 24) // Reserved +#define AT91C_ID_25_Reserved ((unsigned int) 25) // Reserved +#define AT91C_ID_26_Reserved ((unsigned int) 26) // Reserved +#define AT91C_ID_27_Reserved ((unsigned int) 27) // Reserved +#define AT91C_ID_28_Reserved ((unsigned int) 28) // Reserved +#define AT91C_ID_29_Reserved ((unsigned int) 29) // Reserved +#define AT91C_ID_IRQ0 ((unsigned int) 30) // Advanced Interrupt Controller (IRQ0) +#define AT91C_ID_IRQ1 ((unsigned int) 31) // Advanced Interrupt Controller (IRQ1) + +// ***************************************************************************** +// BASE ADDRESS DEFINITIONS FOR AT91SAM7X256 +// ***************************************************************************** +#define AT91C_BASE_SYS ((AT91PS_SYS) 0xFFFFF000) // (SYS) Base Address +#define AT91C_BASE_AIC ((AT91PS_AIC) 0xFFFFF000) // (AIC) Base Address +#define AT91C_BASE_PDC_DBGU ((AT91PS_PDC) 0xFFFFF300) // (PDC_DBGU) Base Address +#define AT91C_BASE_DBGU ((AT91PS_DBGU) 0xFFFFF200) // (DBGU) Base Address +#define AT91C_BASE_PIOA ((AT91PS_PIO) 0xFFFFF400) // (PIOA) Base Address +#define AT91C_BASE_PIOB ((AT91PS_PIO) 0xFFFFF600) // (PIOB) Base Address +#define AT91C_BASE_CKGR ((AT91PS_CKGR) 0xFFFFFC20) // (CKGR) Base Address +#define AT91C_BASE_PMC ((AT91PS_PMC) 0xFFFFFC00) // (PMC) Base Address +#define AT91C_BASE_RSTC ((AT91PS_RSTC) 0xFFFFFD00) // (RSTC) Base Address +#define AT91C_BASE_RTTC ((AT91PS_RTTC) 0xFFFFFD20) // (RTTC) Base Address +#define AT91C_BASE_PITC ((AT91PS_PITC) 0xFFFFFD30) // (PITC) Base Address +#define AT91C_BASE_WDTC ((AT91PS_WDTC) 0xFFFFFD40) // (WDTC) Base Address +#define AT91C_BASE_VREG ((AT91PS_VREG) 0xFFFFFD60) // (VREG) Base Address +#define AT91C_BASE_MC ((AT91PS_MC) 0xFFFFFF00) // (MC) Base Address +#define AT91C_BASE_PDC_SPI1 ((AT91PS_PDC) 0xFFFE4100) // (PDC_SPI1) Base Address +#define AT91C_BASE_SPI1 ((AT91PS_SPI) 0xFFFE4000) // (SPI1) Base Address +#define AT91C_BASE_PDC_SPI0 ((AT91PS_PDC) 0xFFFE0100) // (PDC_SPI0) Base Address +#define AT91C_BASE_SPI0 ((AT91PS_SPI) 0xFFFE0000) // (SPI0) Base Address +#define AT91C_BASE_PDC_US1 ((AT91PS_PDC) 0xFFFC4100) // (PDC_US1) Base Address +#define AT91C_BASE_US1 ((AT91PS_USART) 0xFFFC4000) // (US1) Base Address +#define AT91C_BASE_PDC_US0 ((AT91PS_PDC) 0xFFFC0100) // (PDC_US0) Base Address +#define AT91C_BASE_US0 ((AT91PS_USART) 0xFFFC0000) // (US0) Base Address +#define AT91C_BASE_PDC_SSC ((AT91PS_PDC) 0xFFFD4100) // (PDC_SSC) Base Address +#define AT91C_BASE_SSC ((AT91PS_SSC) 0xFFFD4000) // (SSC) Base Address +#define AT91C_BASE_TWI ((AT91PS_TWI) 0xFFFB8000) // (TWI) Base Address +#define AT91C_BASE_PWMC_CH3 ((AT91PS_PWMC_CH) 0xFFFCC260) // (PWMC_CH3) Base Address +#define AT91C_BASE_PWMC_CH2 ((AT91PS_PWMC_CH) 0xFFFCC240) // (PWMC_CH2) Base Address +#define AT91C_BASE_PWMC_CH1 ((AT91PS_PWMC_CH) 0xFFFCC220) // (PWMC_CH1) Base Address +#define AT91C_BASE_PWMC_CH0 ((AT91PS_PWMC_CH) 0xFFFCC200) // (PWMC_CH0) Base Address +#define AT91C_BASE_PWMC ((AT91PS_PWMC) 0xFFFCC000) // (PWMC) Base Address +#define AT91C_BASE_UDP ((AT91PS_UDP) 0xFFFB0000) // (UDP) Base Address +#define AT91C_BASE_TC0 ((AT91PS_TC) 0xFFFA0000) // (TC0) Base Address +#define AT91C_BASE_TC1 ((AT91PS_TC) 0xFFFA0040) // (TC1) Base Address +#define AT91C_BASE_TC2 ((AT91PS_TC) 0xFFFA0080) // (TC2) Base Address +#define AT91C_BASE_TCB ((AT91PS_TCB) 0xFFFA0000) // (TCB) Base Address +#define AT91C_BASE_CAN_MB0 ((AT91PS_CAN_MB) 0xFFFD0200) // (CAN_MB0) Base Address +#define AT91C_BASE_CAN_MB1 ((AT91PS_CAN_MB) 0xFFFD0220) // (CAN_MB1) Base Address +#define AT91C_BASE_CAN_MB2 ((AT91PS_CAN_MB) 0xFFFD0240) // (CAN_MB2) Base Address +#define AT91C_BASE_CAN_MB3 ((AT91PS_CAN_MB) 0xFFFD0260) // (CAN_MB3) Base Address +#define AT91C_BASE_CAN_MB4 ((AT91PS_CAN_MB) 0xFFFD0280) // (CAN_MB4) Base Address +#define AT91C_BASE_CAN_MB5 ((AT91PS_CAN_MB) 0xFFFD02A0) // (CAN_MB5) Base Address +#define AT91C_BASE_CAN_MB6 ((AT91PS_CAN_MB) 0xFFFD02C0) // (CAN_MB6) Base Address +#define AT91C_BASE_CAN_MB7 ((AT91PS_CAN_MB) 0xFFFD02E0) // (CAN_MB7) Base Address +#define AT91C_BASE_CAN ((AT91PS_CAN) 0xFFFD0000) // (CAN) Base Address +#define AT91C_BASE_EMAC ((AT91PS_EMAC) 0xFFFDC000) // (EMAC) Base Address +#define AT91C_BASE_PDC_ADC ((AT91PS_PDC) 0xFFFD8100) // (PDC_ADC) Base Address +#define AT91C_BASE_ADC ((AT91PS_ADC) 0xFFFD8000) // (ADC) Base Address +#define AT91C_BASE_PDC_AES ((AT91PS_PDC) 0xFFFA4100) // (PDC_AES) Base Address +#define AT91C_BASE_AES ((AT91PS_AES) 0xFFFA4000) // (AES) Base Address +#define AT91C_BASE_PDC_TDES ((AT91PS_PDC) 0xFFFA8100) // (PDC_TDES) Base Address +#define AT91C_BASE_TDES ((AT91PS_TDES) 0xFFFA8000) // (TDES) Base Address + +// ***************************************************************************** +// MEMORY MAPPING DEFINITIONS FOR AT91SAM7X256 +// ***************************************************************************** +#define AT91C_ISRAM ((char *) 0x00200000) // Internal SRAM base address +#define AT91C_ISRAM_SIZE ((unsigned int) 0x00010000) // Internal SRAM size in byte (64 Kbyte) +#define AT91C_IFLASH ((char *) 0x00100000) // Internal ROM base address +#define AT91C_IFLASH_SIZE ((unsigned int) 0x00040000) // Internal ROM size in byte (256 Kbyte) + +#endif diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM7S64/AT91SAM7X256_inc.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM7S64/AT91SAM7X256_inc.h new file mode 100644 index 0000000..5b8dfe8 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM7S64/AT91SAM7X256_inc.h @@ -0,0 +1,2446 @@ +// ---------------------------------------------------------------------------- +// ATMEL Microcontroller Software Support - ROUSSET - +// ---------------------------------------------------------------------------- +// DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR +// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE +// DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT, +// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// ---------------------------------------------------------------------------- +// File Name : AT91SAM7X256.h +// Object : AT91SAM7X256 definitions +// Generated : AT91 SW Application Group 05/20/2005 (16:22:29) +// +// CVS Reference : /AT91SAM7X256.pl/1.11/Tue May 10 12:15:32 2005// +// CVS Reference : /SYS_SAM7X.pl/1.3/Tue Feb 1 17:01:43 2005// +// CVS Reference : /MC_SAM7X.pl/1.2/Fri May 20 14:13:04 2005// +// CVS Reference : /PMC_SAM7X.pl/1.4/Tue Feb 8 13:58:10 2005// +// CVS Reference : /RSTC_SAM7X.pl/1.1/Tue Feb 1 16:16:26 2005// +// CVS Reference : /UDP_SAM7X.pl/1.1/Tue May 10 11:35:35 2005// +// CVS Reference : /PWM_SAM7X.pl/1.1/Tue May 10 11:53:07 2005// +// CVS Reference : /AIC_6075B.pl/1.3/Fri May 20 14:01:30 2005// +// CVS Reference : /PIO_6057A.pl/1.2/Thu Feb 3 10:18:28 2005// +// CVS Reference : /RTTC_6081A.pl/1.2/Tue Nov 9 14:43:58 2004// +// CVS Reference : /PITC_6079A.pl/1.2/Tue Nov 9 14:43:56 2004// +// CVS Reference : /WDTC_6080A.pl/1.3/Tue Nov 9 14:44:00 2004// +// CVS Reference : /VREG_6085B.pl/1.1/Tue Feb 1 16:05:48 2005// +// CVS Reference : /PDC_6074C.pl/1.2/Thu Feb 3 08:48:54 2005// +// CVS Reference : /DBGU_6059D.pl/1.1/Mon Jan 31 13:15:32 2005// +// CVS Reference : /SPI_6088D.pl/1.3/Fri May 20 14:08:59 2005// +// CVS Reference : /US_6089C.pl/1.1/Mon Jul 12 18:23:26 2004// +// CVS Reference : /SSC_6078A.pl/1.1/Tue Jul 13 07:45:40 2004// +// CVS Reference : /TWI_6061A.pl/1.1/Tue Jul 13 07:38:06 2004// +// CVS Reference : /TC_6082A.pl/1.7/Fri Mar 11 12:52:17 2005// +// CVS Reference : /CAN_6019B.pl/1.1/Tue Mar 8 12:42:22 2005// +// CVS Reference : /EMACB_6119A.pl/1.5/Thu Feb 3 15:52:04 2005// +// CVS Reference : /ADC_6051C.pl/1.1/Fri Oct 17 09:12:38 2003// +// CVS Reference : /AES_6149A.pl/1.10/Mon Feb 7 09:44:25 2005// +// CVS Reference : /DES3_6150A.pl/1.1/Mon Jan 17 08:34:31 2005// +// ---------------------------------------------------------------------------- + +// Hardware register definition + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR System Peripherals +// ***************************************************************************** + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Advanced Interrupt Controller +// ***************************************************************************** +// *** Register offset in AT91S_AIC structure *** +#define AIC_SMR ( 0) // Source Mode Register +#define AIC_SVR (128) // Source Vector Register +#define AIC_IVR (256) // IRQ Vector Register +#define AIC_FVR (260) // FIQ Vector Register +#define AIC_ISR (264) // Interrupt Status Register +#define AIC_IPR (268) // Interrupt Pending Register +#define AIC_IMR (272) // Interrupt Mask Register +#define AIC_CISR (276) // Core Interrupt Status Register +#define AIC_IECR (288) // Interrupt Enable Command Register +#define AIC_IDCR (292) // Interrupt Disable Command Register +#define AIC_ICCR (296) // Interrupt Clear Command Register +#define AIC_ISCR (300) // Interrupt Set Command Register +#define AIC_EOICR (304) // End of Interrupt Command Register +#define AIC_SPU (308) // Spurious Vector Register +#define AIC_DCR (312) // Debug Control Register (Protect) +#define AIC_FFER (320) // Fast Forcing Enable Register +#define AIC_FFDR (324) // Fast Forcing Disable Register +#define AIC_FFSR (328) // Fast Forcing Status Register +// -------- AIC_SMR : (AIC Offset: 0x0) Control Register -------- +#define AT91C_AIC_PRIOR (0x7 << 0) // (AIC) Priority Level +#define AT91C_AIC_PRIOR_LOWEST (0x0) // (AIC) Lowest priority level +#define AT91C_AIC_PRIOR_HIGHEST (0x7) // (AIC) Highest priority level +#define AT91C_AIC_SRCTYPE (0x3 << 5) // (AIC) Interrupt Source Type +#define AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL (0x0 << 5) // (AIC) Internal Sources Code Label High-level Sensitive +#define AT91C_AIC_SRCTYPE_EXT_LOW_LEVEL (0x0 << 5) // (AIC) External Sources Code Label Low-level Sensitive +#define AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE (0x1 << 5) // (AIC) Internal Sources Code Label Positive Edge triggered +#define AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE (0x1 << 5) // (AIC) External Sources Code Label Negative Edge triggered +#define AT91C_AIC_SRCTYPE_HIGH_LEVEL (0x2 << 5) // (AIC) Internal Or External Sources Code Label High-level Sensitive +#define AT91C_AIC_SRCTYPE_POSITIVE_EDGE (0x3 << 5) // (AIC) Internal Or External Sources Code Label Positive Edge triggered +// -------- AIC_CISR : (AIC Offset: 0x114) AIC Core Interrupt Status Register -------- +#define AT91C_AIC_NFIQ (0x1 << 0) // (AIC) NFIQ Status +#define AT91C_AIC_NIRQ (0x1 << 1) // (AIC) NIRQ Status +// -------- AIC_DCR : (AIC Offset: 0x138) AIC Debug Control Register (Protect) -------- +#define AT91C_AIC_DCR_PROT (0x1 << 0) // (AIC) Protection Mode +#define AT91C_AIC_DCR_GMSK (0x1 << 1) // (AIC) General Mask + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Peripheral DMA Controller +// ***************************************************************************** +// *** Register offset in AT91S_PDC structure *** +#define PDC_RPR ( 0) // Receive Pointer Register +#define PDC_RCR ( 4) // Receive Counter Register +#define PDC_TPR ( 8) // Transmit Pointer Register +#define PDC_TCR (12) // Transmit Counter Register +#define PDC_RNPR (16) // Receive Next Pointer Register +#define PDC_RNCR (20) // Receive Next Counter Register +#define PDC_TNPR (24) // Transmit Next Pointer Register +#define PDC_TNCR (28) // Transmit Next Counter Register +#define PDC_PTCR (32) // PDC Transfer Control Register +#define PDC_PTSR (36) // PDC Transfer Status Register +// -------- PDC_PTCR : (PDC Offset: 0x20) PDC Transfer Control Register -------- +#define AT91C_PDC_RXTEN (0x1 << 0) // (PDC) Receiver Transfer Enable +#define AT91C_PDC_RXTDIS (0x1 << 1) // (PDC) Receiver Transfer Disable +#define AT91C_PDC_TXTEN (0x1 << 8) // (PDC) Transmitter Transfer Enable +#define AT91C_PDC_TXTDIS (0x1 << 9) // (PDC) Transmitter Transfer Disable +// -------- PDC_PTSR : (PDC Offset: 0x24) PDC Transfer Status Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Debug Unit +// ***************************************************************************** +// *** Register offset in AT91S_DBGU structure *** +#define DBGU_CR ( 0) // Control Register +#define DBGU_MR ( 4) // Mode Register +#define DBGU_IER ( 8) // Interrupt Enable Register +#define DBGU_IDR (12) // Interrupt Disable Register +#define DBGU_IMR (16) // Interrupt Mask Register +#define DBGU_CSR (20) // Channel Status Register +#define DBGU_RHR (24) // Receiver Holding Register +#define DBGU_THR (28) // Transmitter Holding Register +#define DBGU_BRGR (32) // Baud Rate Generator Register +#define DBGU_CIDR (64) // Chip ID Register +#define DBGU_EXID (68) // Chip ID Extension Register +#define DBGU_FNTR (72) // Force NTRST Register +#define DBGU_RPR (256) // Receive Pointer Register +#define DBGU_RCR (260) // Receive Counter Register +#define DBGU_TPR (264) // Transmit Pointer Register +#define DBGU_TCR (268) // Transmit Counter Register +#define DBGU_RNPR (272) // Receive Next Pointer Register +#define DBGU_RNCR (276) // Receive Next Counter Register +#define DBGU_TNPR (280) // Transmit Next Pointer Register +#define DBGU_TNCR (284) // Transmit Next Counter Register +#define DBGU_PTCR (288) // PDC Transfer Control Register +#define DBGU_PTSR (292) // PDC Transfer Status Register +// -------- DBGU_CR : (DBGU Offset: 0x0) Debug Unit Control Register -------- +#define AT91C_US_RSTRX (0x1 << 2) // (DBGU) Reset Receiver +#define AT91C_US_RSTTX (0x1 << 3) // (DBGU) Reset Transmitter +#define AT91C_US_RXEN (0x1 << 4) // (DBGU) Receiver Enable +#define AT91C_US_RXDIS (0x1 << 5) // (DBGU) Receiver Disable +#define AT91C_US_TXEN (0x1 << 6) // (DBGU) Transmitter Enable +#define AT91C_US_TXDIS (0x1 << 7) // (DBGU) Transmitter Disable +#define AT91C_US_RSTSTA (0x1 << 8) // (DBGU) Reset Status Bits +// -------- DBGU_MR : (DBGU Offset: 0x4) Debug Unit Mode Register -------- +#define AT91C_US_PAR (0x7 << 9) // (DBGU) Parity type +#define AT91C_US_PAR_EVEN (0x0 << 9) // (DBGU) Even Parity +#define AT91C_US_PAR_ODD (0x1 << 9) // (DBGU) Odd Parity +#define AT91C_US_PAR_SPACE (0x2 << 9) // (DBGU) Parity forced to 0 (Space) +#define AT91C_US_PAR_MARK (0x3 << 9) // (DBGU) Parity forced to 1 (Mark) +#define AT91C_US_PAR_NONE (0x4 << 9) // (DBGU) No Parity +#define AT91C_US_PAR_MULTI_DROP (0x6 << 9) // (DBGU) Multi-drop mode +#define AT91C_US_CHMODE (0x3 << 14) // (DBGU) Channel Mode +#define AT91C_US_CHMODE_NORMAL (0x0 << 14) // (DBGU) Normal Mode: The USART channel operates as an RX/TX USART. +#define AT91C_US_CHMODE_AUTO (0x1 << 14) // (DBGU) Automatic Echo: Receiver Data Input is connected to the TXD pin. +#define AT91C_US_CHMODE_LOCAL (0x2 << 14) // (DBGU) Local Loopback: Transmitter Output Signal is connected to Receiver Input Signal. +#define AT91C_US_CHMODE_REMOTE (0x3 << 14) // (DBGU) Remote Loopback: RXD pin is internally connected to TXD pin. +// -------- DBGU_IER : (DBGU Offset: 0x8) Debug Unit Interrupt Enable Register -------- +#define AT91C_US_RXRDY (0x1 << 0) // (DBGU) RXRDY Interrupt +#define AT91C_US_TXRDY (0x1 << 1) // (DBGU) TXRDY Interrupt +#define AT91C_US_ENDRX (0x1 << 3) // (DBGU) End of Receive Transfer Interrupt +#define AT91C_US_ENDTX (0x1 << 4) // (DBGU) End of Transmit Interrupt +#define AT91C_US_OVRE (0x1 << 5) // (DBGU) Overrun Interrupt +#define AT91C_US_FRAME (0x1 << 6) // (DBGU) Framing Error Interrupt +#define AT91C_US_PARE (0x1 << 7) // (DBGU) Parity Error Interrupt +#define AT91C_US_TXEMPTY (0x1 << 9) // (DBGU) TXEMPTY Interrupt +#define AT91C_US_TXBUFE (0x1 << 11) // (DBGU) TXBUFE Interrupt +#define AT91C_US_RXBUFF (0x1 << 12) // (DBGU) RXBUFF Interrupt +#define AT91C_US_COMM_TX (0x1 << 30) // (DBGU) COMM_TX Interrupt +#define AT91C_US_COMM_RX (0x1 << 31) // (DBGU) COMM_RX Interrupt +// -------- DBGU_IDR : (DBGU Offset: 0xc) Debug Unit Interrupt Disable Register -------- +// -------- DBGU_IMR : (DBGU Offset: 0x10) Debug Unit Interrupt Mask Register -------- +// -------- DBGU_CSR : (DBGU Offset: 0x14) Debug Unit Channel Status Register -------- +// -------- DBGU_FNTR : (DBGU Offset: 0x48) Debug Unit FORCE_NTRST Register -------- +#define AT91C_US_FORCE_NTRST (0x1 << 0) // (DBGU) Force NTRST in JTAG + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Parallel Input Output Controler +// ***************************************************************************** +// *** Register offset in AT91S_PIO structure *** +#define PIO_PER ( 0) // PIO Enable Register +#define PIO_PDR ( 4) // PIO Disable Register +#define PIO_PSR ( 8) // PIO Status Register +#define PIO_OER (16) // Output Enable Register +#define PIO_ODR (20) // Output Disable Registerr +#define PIO_OSR (24) // Output Status Register +#define PIO_IFER (32) // Input Filter Enable Register +#define PIO_IFDR (36) // Input Filter Disable Register +#define PIO_IFSR (40) // Input Filter Status Register +#define PIO_SODR (48) // Set Output Data Register +#define PIO_CODR (52) // Clear Output Data Register +#define PIO_ODSR (56) // Output Data Status Register +#define PIO_PDSR (60) // Pin Data Status Register +#define PIO_IER (64) // Interrupt Enable Register +#define PIO_IDR (68) // Interrupt Disable Register +#define PIO_IMR (72) // Interrupt Mask Register +#define PIO_ISR (76) // Interrupt Status Register +#define PIO_MDER (80) // Multi-driver Enable Register +#define PIO_MDDR (84) // Multi-driver Disable Register +#define PIO_MDSR (88) // Multi-driver Status Register +#define PIO_PPUDR (96) // Pull-up Disable Register +#define PIO_PPUER (100) // Pull-up Enable Register +#define PIO_PPUSR (104) // Pull-up Status Register +#define PIO_ASR (112) // Select A Register +#define PIO_BSR (116) // Select B Register +#define PIO_ABSR (120) // AB Select Status Register +#define PIO_OWER (160) // Output Write Enable Register +#define PIO_OWDR (164) // Output Write Disable Register +#define PIO_OWSR (168) // Output Write Status Register + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Clock Generator Controler +// ***************************************************************************** +// *** Register offset in AT91S_CKGR structure *** +#define CKGR_MOR ( 0) // Main Oscillator Register +#define CKGR_MCFR ( 4) // Main Clock Frequency Register +#define CKGR_PLLR (12) // PLL Register +// -------- CKGR_MOR : (CKGR Offset: 0x0) Main Oscillator Register -------- +#define AT91C_CKGR_MOSCEN (0x1 << 0) // (CKGR) Main Oscillator Enable +#define AT91C_CKGR_OSCBYPASS (0x1 << 1) // (CKGR) Main Oscillator Bypass +#define AT91C_CKGR_OSCOUNT (0xFF << 8) // (CKGR) Main Oscillator Start-up Time +// -------- CKGR_MCFR : (CKGR Offset: 0x4) Main Clock Frequency Register -------- +#define AT91C_CKGR_MAINF (0xFFFF << 0) // (CKGR) Main Clock Frequency +#define AT91C_CKGR_MAINRDY (0x1 << 16) // (CKGR) Main Clock Ready +// -------- CKGR_PLLR : (CKGR Offset: 0xc) PLL B Register -------- +#define AT91C_CKGR_DIV (0xFF << 0) // (CKGR) Divider Selected +#define AT91C_CKGR_DIV_0 (0x0) // (CKGR) Divider output is 0 +#define AT91C_CKGR_DIV_BYPASS (0x1) // (CKGR) Divider is bypassed +#define AT91C_CKGR_PLLCOUNT (0x3F << 8) // (CKGR) PLL Counter +#define AT91C_CKGR_OUT (0x3 << 14) // (CKGR) PLL Output Frequency Range +#define AT91C_CKGR_OUT_0 (0x0 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_OUT_1 (0x1 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_OUT_2 (0x2 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_OUT_3 (0x3 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_MUL (0x7FF << 16) // (CKGR) PLL Multiplier +#define AT91C_CKGR_USBDIV (0x3 << 28) // (CKGR) Divider for USB Clocks +#define AT91C_CKGR_USBDIV_0 (0x0 << 28) // (CKGR) Divider output is PLL clock output +#define AT91C_CKGR_USBDIV_1 (0x1 << 28) // (CKGR) Divider output is PLL clock output divided by 2 +#define AT91C_CKGR_USBDIV_2 (0x2 << 28) // (CKGR) Divider output is PLL clock output divided by 4 + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Power Management Controler +// ***************************************************************************** +// *** Register offset in AT91S_PMC structure *** +#define PMC_SCER ( 0) // System Clock Enable Register +#define PMC_SCDR ( 4) // System Clock Disable Register +#define PMC_SCSR ( 8) // System Clock Status Register +#define PMC_PCER (16) // Peripheral Clock Enable Register +#define PMC_PCDR (20) // Peripheral Clock Disable Register +#define PMC_PCSR (24) // Peripheral Clock Status Register +#define PMC_MOR (32) // Main Oscillator Register +#define PMC_MCFR (36) // Main Clock Frequency Register +#define PMC_PLLR (44) // PLL Register +#define PMC_MCKR (48) // Master Clock Register +#define PMC_PCKR (64) // Programmable Clock Register +#define PMC_IER (96) // Interrupt Enable Register +#define PMC_IDR (100) // Interrupt Disable Register +#define PMC_SR (104) // Status Register +#define PMC_IMR (108) // Interrupt Mask Register +// -------- PMC_SCER : (PMC Offset: 0x0) System Clock Enable Register -------- +#define AT91C_PMC_PCK (0x1 << 0) // (PMC) Processor Clock +#define AT91C_PMC_UDP (0x1 << 7) // (PMC) USB Device Port Clock +#define AT91C_PMC_PCK0 (0x1 << 8) // (PMC) Programmable Clock Output +#define AT91C_PMC_PCK1 (0x1 << 9) // (PMC) Programmable Clock Output +#define AT91C_PMC_PCK2 (0x1 << 10) // (PMC) Programmable Clock Output +#define AT91C_PMC_PCK3 (0x1 << 11) // (PMC) Programmable Clock Output +// -------- PMC_SCDR : (PMC Offset: 0x4) System Clock Disable Register -------- +// -------- PMC_SCSR : (PMC Offset: 0x8) System Clock Status Register -------- +// -------- CKGR_MOR : (PMC Offset: 0x20) Main Oscillator Register -------- +// -------- CKGR_MCFR : (PMC Offset: 0x24) Main Clock Frequency Register -------- +// -------- CKGR_PLLR : (PMC Offset: 0x2c) PLL B Register -------- +// -------- PMC_MCKR : (PMC Offset: 0x30) Master Clock Register -------- +#define AT91C_PMC_CSS (0x3 << 0) // (PMC) Programmable Clock Selection +#define AT91C_PMC_CSS_SLOW_CLK (0x0) // (PMC) Slow Clock is selected +#define AT91C_PMC_CSS_MAIN_CLK (0x1) // (PMC) Main Clock is selected +#define AT91C_PMC_CSS_PLL_CLK (0x3) // (PMC) Clock from PLL is selected +#define AT91C_PMC_PRES (0x7 << 2) // (PMC) Programmable Clock Prescaler +#define AT91C_PMC_PRES_CLK (0x0 << 2) // (PMC) Selected clock +#define AT91C_PMC_PRES_CLK_2 (0x1 << 2) // (PMC) Selected clock divided by 2 +#define AT91C_PMC_PRES_CLK_4 (0x2 << 2) // (PMC) Selected clock divided by 4 +#define AT91C_PMC_PRES_CLK_8 (0x3 << 2) // (PMC) Selected clock divided by 8 +#define AT91C_PMC_PRES_CLK_16 (0x4 << 2) // (PMC) Selected clock divided by 16 +#define AT91C_PMC_PRES_CLK_32 (0x5 << 2) // (PMC) Selected clock divided by 32 +#define AT91C_PMC_PRES_CLK_64 (0x6 << 2) // (PMC) Selected clock divided by 64 +// -------- PMC_PCKR : (PMC Offset: 0x40) Programmable Clock Register -------- +// -------- PMC_IER : (PMC Offset: 0x60) PMC Interrupt Enable Register -------- +#define AT91C_PMC_MOSCS (0x1 << 0) // (PMC) MOSC Status/Enable/Disable/Mask +#define AT91C_PMC_LOCK (0x1 << 2) // (PMC) PLL Status/Enable/Disable/Mask +#define AT91C_PMC_MCKRDY (0x1 << 3) // (PMC) MCK_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK0RDY (0x1 << 8) // (PMC) PCK0_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK1RDY (0x1 << 9) // (PMC) PCK1_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK2RDY (0x1 << 10) // (PMC) PCK2_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK3RDY (0x1 << 11) // (PMC) PCK3_RDY Status/Enable/Disable/Mask +// -------- PMC_IDR : (PMC Offset: 0x64) PMC Interrupt Disable Register -------- +// -------- PMC_SR : (PMC Offset: 0x68) PMC Status Register -------- +// -------- PMC_IMR : (PMC Offset: 0x6c) PMC Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Reset Controller Interface +// ***************************************************************************** +// *** Register offset in AT91S_RSTC structure *** +#define RSTC_RCR ( 0) // Reset Control Register +#define RSTC_RSR ( 4) // Reset Status Register +#define RSTC_RMR ( 8) // Reset Mode Register +// -------- RSTC_RCR : (RSTC Offset: 0x0) Reset Control Register -------- +#define AT91C_RSTC_PROCRST (0x1 << 0) // (RSTC) Processor Reset +#define AT91C_RSTC_PERRST (0x1 << 2) // (RSTC) Peripheral Reset +#define AT91C_RSTC_EXTRST (0x1 << 3) // (RSTC) External Reset +#define AT91C_RSTC_KEY (0xFF << 24) // (RSTC) Password +// -------- RSTC_RSR : (RSTC Offset: 0x4) Reset Status Register -------- +#define AT91C_RSTC_URSTS (0x1 << 0) // (RSTC) User Reset Status +#define AT91C_RSTC_BODSTS (0x1 << 1) // (RSTC) Brownout Detection Status +#define AT91C_RSTC_RSTTYP (0x7 << 8) // (RSTC) Reset Type +#define AT91C_RSTC_RSTTYP_POWERUP (0x0 << 8) // (RSTC) Power-up Reset. VDDCORE rising. +#define AT91C_RSTC_RSTTYP_WAKEUP (0x1 << 8) // (RSTC) WakeUp Reset. VDDCORE rising. +#define AT91C_RSTC_RSTTYP_WATCHDOG (0x2 << 8) // (RSTC) Watchdog Reset. Watchdog overflow occured. +#define AT91C_RSTC_RSTTYP_SOFTWARE (0x3 << 8) // (RSTC) Software Reset. Processor reset required by the software. +#define AT91C_RSTC_RSTTYP_USER (0x4 << 8) // (RSTC) User Reset. NRST pin detected low. +#define AT91C_RSTC_RSTTYP_BROWNOUT (0x5 << 8) // (RSTC) Brownout Reset occured. +#define AT91C_RSTC_NRSTL (0x1 << 16) // (RSTC) NRST pin level +#define AT91C_RSTC_SRCMP (0x1 << 17) // (RSTC) Software Reset Command in Progress. +// -------- RSTC_RMR : (RSTC Offset: 0x8) Reset Mode Register -------- +#define AT91C_RSTC_URSTEN (0x1 << 0) // (RSTC) User Reset Enable +#define AT91C_RSTC_URSTIEN (0x1 << 4) // (RSTC) User Reset Interrupt Enable +#define AT91C_RSTC_ERSTL (0xF << 8) // (RSTC) User Reset Enable +#define AT91C_RSTC_BODIEN (0x1 << 16) // (RSTC) Brownout Detection Interrupt Enable + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Real Time Timer Controller Interface +// ***************************************************************************** +// *** Register offset in AT91S_RTTC structure *** +#define RTTC_RTMR ( 0) // Real-time Mode Register +#define RTTC_RTAR ( 4) // Real-time Alarm Register +#define RTTC_RTVR ( 8) // Real-time Value Register +#define RTTC_RTSR (12) // Real-time Status Register +// -------- RTTC_RTMR : (RTTC Offset: 0x0) Real-time Mode Register -------- +#define AT91C_RTTC_RTPRES (0xFFFF << 0) // (RTTC) Real-time Timer Prescaler Value +#define AT91C_RTTC_ALMIEN (0x1 << 16) // (RTTC) Alarm Interrupt Enable +#define AT91C_RTTC_RTTINCIEN (0x1 << 17) // (RTTC) Real Time Timer Increment Interrupt Enable +#define AT91C_RTTC_RTTRST (0x1 << 18) // (RTTC) Real Time Timer Restart +// -------- RTTC_RTAR : (RTTC Offset: 0x4) Real-time Alarm Register -------- +#define AT91C_RTTC_ALMV (0x0 << 0) // (RTTC) Alarm Value +// -------- RTTC_RTVR : (RTTC Offset: 0x8) Current Real-time Value Register -------- +#define AT91C_RTTC_CRTV (0x0 << 0) // (RTTC) Current Real-time Value +// -------- RTTC_RTSR : (RTTC Offset: 0xc) Real-time Status Register -------- +#define AT91C_RTTC_ALMS (0x1 << 0) // (RTTC) Real-time Alarm Status +#define AT91C_RTTC_RTTINC (0x1 << 1) // (RTTC) Real-time Timer Increment + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Periodic Interval Timer Controller Interface +// ***************************************************************************** +// *** Register offset in AT91S_PITC structure *** +#define PITC_PIMR ( 0) // Period Interval Mode Register +#define PITC_PISR ( 4) // Period Interval Status Register +#define PITC_PIVR ( 8) // Period Interval Value Register +#define PITC_PIIR (12) // Period Interval Image Register +// -------- PITC_PIMR : (PITC Offset: 0x0) Periodic Interval Mode Register -------- +#define AT91C_PITC_PIV (0xFFFFF << 0) // (PITC) Periodic Interval Value +#define AT91C_PITC_PITEN (0x1 << 24) // (PITC) Periodic Interval Timer Enabled +#define AT91C_PITC_PITIEN (0x1 << 25) // (PITC) Periodic Interval Timer Interrupt Enable +// -------- PITC_PISR : (PITC Offset: 0x4) Periodic Interval Status Register -------- +#define AT91C_PITC_PITS (0x1 << 0) // (PITC) Periodic Interval Timer Status +// -------- PITC_PIVR : (PITC Offset: 0x8) Periodic Interval Value Register -------- +#define AT91C_PITC_CPIV (0xFFFFF << 0) // (PITC) Current Periodic Interval Value +#define AT91C_PITC_PICNT (0xFFF << 20) // (PITC) Periodic Interval Counter +// -------- PITC_PIIR : (PITC Offset: 0xc) Periodic Interval Image Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Watchdog Timer Controller Interface +// ***************************************************************************** +// *** Register offset in AT91S_WDTC structure *** +#define WDTC_WDCR ( 0) // Watchdog Control Register +#define WDTC_WDMR ( 4) // Watchdog Mode Register +#define WDTC_WDSR ( 8) // Watchdog Status Register +// -------- WDTC_WDCR : (WDTC Offset: 0x0) Periodic Interval Image Register -------- +#define AT91C_WDTC_WDRSTT (0x1 << 0) // (WDTC) Watchdog Restart +#define AT91C_WDTC_KEY (0xFF << 24) // (WDTC) Watchdog KEY Password +// -------- WDTC_WDMR : (WDTC Offset: 0x4) Watchdog Mode Register -------- +#define AT91C_WDTC_WDV (0xFFF << 0) // (WDTC) Watchdog Timer Restart +#define AT91C_WDTC_WDFIEN (0x1 << 12) // (WDTC) Watchdog Fault Interrupt Enable +#define AT91C_WDTC_WDRSTEN (0x1 << 13) // (WDTC) Watchdog Reset Enable +#define AT91C_WDTC_WDRPROC (0x1 << 14) // (WDTC) Watchdog Timer Restart +#define AT91C_WDTC_WDDIS (0x1 << 15) // (WDTC) Watchdog Disable +#define AT91C_WDTC_WDD (0xFFF << 16) // (WDTC) Watchdog Delta Value +#define AT91C_WDTC_WDDBGHLT (0x1 << 28) // (WDTC) Watchdog Debug Halt +#define AT91C_WDTC_WDIDLEHLT (0x1 << 29) // (WDTC) Watchdog Idle Halt +// -------- WDTC_WDSR : (WDTC Offset: 0x8) Watchdog Status Register -------- +#define AT91C_WDTC_WDUNF (0x1 << 0) // (WDTC) Watchdog Underflow +#define AT91C_WDTC_WDERR (0x1 << 1) // (WDTC) Watchdog Error + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Voltage Regulator Mode Controller Interface +// ***************************************************************************** +// *** Register offset in AT91S_VREG structure *** +#define VREG_MR ( 0) // Voltage Regulator Mode Register +// -------- VREG_MR : (VREG Offset: 0x0) Voltage Regulator Mode Register -------- +#define AT91C_VREG_PSTDBY (0x1 << 0) // (VREG) Voltage Regulator Power Standby Mode + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Memory Controller Interface +// ***************************************************************************** +// *** Register offset in AT91S_MC structure *** +#define MC_RCR ( 0) // MC Remap Control Register +#define MC_ASR ( 4) // MC Abort Status Register +#define MC_AASR ( 8) // MC Abort Address Status Register +#define MC_FMR (96) // MC Flash Mode Register +#define MC_FCR (100) // MC Flash Command Register +#define MC_FSR (104) // MC Flash Status Register +// -------- MC_RCR : (MC Offset: 0x0) MC Remap Control Register -------- +#define AT91C_MC_RCB (0x1 << 0) // (MC) Remap Command Bit +// -------- MC_ASR : (MC Offset: 0x4) MC Abort Status Register -------- +#define AT91C_MC_UNDADD (0x1 << 0) // (MC) Undefined Addess Abort Status +#define AT91C_MC_MISADD (0x1 << 1) // (MC) Misaligned Addess Abort Status +#define AT91C_MC_ABTSZ (0x3 << 8) // (MC) Abort Size Status +#define AT91C_MC_ABTSZ_BYTE (0x0 << 8) // (MC) Byte +#define AT91C_MC_ABTSZ_HWORD (0x1 << 8) // (MC) Half-word +#define AT91C_MC_ABTSZ_WORD (0x2 << 8) // (MC) Word +#define AT91C_MC_ABTTYP (0x3 << 10) // (MC) Abort Type Status +#define AT91C_MC_ABTTYP_DATAR (0x0 << 10) // (MC) Data Read +#define AT91C_MC_ABTTYP_DATAW (0x1 << 10) // (MC) Data Write +#define AT91C_MC_ABTTYP_FETCH (0x2 << 10) // (MC) Code Fetch +#define AT91C_MC_MST0 (0x1 << 16) // (MC) Master 0 Abort Source +#define AT91C_MC_MST1 (0x1 << 17) // (MC) Master 1 Abort Source +#define AT91C_MC_SVMST0 (0x1 << 24) // (MC) Saved Master 0 Abort Source +#define AT91C_MC_SVMST1 (0x1 << 25) // (MC) Saved Master 1 Abort Source +// -------- MC_FMR : (MC Offset: 0x60) MC Flash Mode Register -------- +#define AT91C_MC_FRDY (0x1 << 0) // (MC) Flash Ready +#define AT91C_MC_LOCKE (0x1 << 2) // (MC) Lock Error +#define AT91C_MC_PROGE (0x1 << 3) // (MC) Programming Error +#define AT91C_MC_NEBP (0x1 << 7) // (MC) No Erase Before Programming +#define AT91C_MC_FWS (0x3 << 8) // (MC) Flash Wait State +#define AT91C_MC_FWS_0FWS (0x0 << 8) // (MC) 1 cycle for Read, 2 for Write operations +#define AT91C_MC_FWS_1FWS (0x1 << 8) // (MC) 2 cycles for Read, 3 for Write operations +#define AT91C_MC_FWS_2FWS (0x2 << 8) // (MC) 3 cycles for Read, 4 for Write operations +#define AT91C_MC_FWS_3FWS (0x3 << 8) // (MC) 4 cycles for Read, 4 for Write operations +#define AT91C_MC_FMCN (0xFF << 16) // (MC) Flash Microsecond Cycle Number +// -------- MC_FCR : (MC Offset: 0x64) MC Flash Command Register -------- +#define AT91C_MC_FCMD (0xF << 0) // (MC) Flash Command +#define AT91C_MC_FCMD_START_PROG (0x1) // (MC) Starts the programming of th epage specified by PAGEN. +#define AT91C_MC_FCMD_LOCK (0x2) // (MC) Starts a lock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. +#define AT91C_MC_FCMD_PROG_AND_LOCK (0x3) // (MC) The lock sequence automatically happens after the programming sequence is completed. +#define AT91C_MC_FCMD_UNLOCK (0x4) // (MC) Starts an unlock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. +#define AT91C_MC_FCMD_ERASE_ALL (0x8) // (MC) Starts the erase of the entire flash.If at least a page is locked, the command is cancelled. +#define AT91C_MC_FCMD_SET_GP_NVM (0xB) // (MC) Set General Purpose NVM bits. +#define AT91C_MC_FCMD_CLR_GP_NVM (0xD) // (MC) Clear General Purpose NVM bits. +#define AT91C_MC_FCMD_SET_SECURITY (0xF) // (MC) Set Security Bit. +#define AT91C_MC_PAGEN (0x3FF << 8) // (MC) Page Number +#define AT91C_MC_KEY (0xFF << 24) // (MC) Writing Protect Key +// -------- MC_FSR : (MC Offset: 0x68) MC Flash Command Register -------- +#define AT91C_MC_SECURITY (0x1 << 4) // (MC) Security Bit Status +#define AT91C_MC_GPNVM0 (0x1 << 8) // (MC) Sector 0 Lock Status +#define AT91C_MC_GPNVM1 (0x1 << 9) // (MC) Sector 1 Lock Status +#define AT91C_MC_GPNVM2 (0x1 << 10) // (MC) Sector 2 Lock Status +#define AT91C_MC_GPNVM3 (0x1 << 11) // (MC) Sector 3 Lock Status +#define AT91C_MC_GPNVM4 (0x1 << 12) // (MC) Sector 4 Lock Status +#define AT91C_MC_GPNVM5 (0x1 << 13) // (MC) Sector 5 Lock Status +#define AT91C_MC_GPNVM6 (0x1 << 14) // (MC) Sector 6 Lock Status +#define AT91C_MC_GPNVM7 (0x1 << 15) // (MC) Sector 7 Lock Status +#define AT91C_MC_LOCKS0 (0x1 << 16) // (MC) Sector 0 Lock Status +#define AT91C_MC_LOCKS1 (0x1 << 17) // (MC) Sector 1 Lock Status +#define AT91C_MC_LOCKS2 (0x1 << 18) // (MC) Sector 2 Lock Status +#define AT91C_MC_LOCKS3 (0x1 << 19) // (MC) Sector 3 Lock Status +#define AT91C_MC_LOCKS4 (0x1 << 20) // (MC) Sector 4 Lock Status +#define AT91C_MC_LOCKS5 (0x1 << 21) // (MC) Sector 5 Lock Status +#define AT91C_MC_LOCKS6 (0x1 << 22) // (MC) Sector 6 Lock Status +#define AT91C_MC_LOCKS7 (0x1 << 23) // (MC) Sector 7 Lock Status +#define AT91C_MC_LOCKS8 (0x1 << 24) // (MC) Sector 8 Lock Status +#define AT91C_MC_LOCKS9 (0x1 << 25) // (MC) Sector 9 Lock Status +#define AT91C_MC_LOCKS10 (0x1 << 26) // (MC) Sector 10 Lock Status +#define AT91C_MC_LOCKS11 (0x1 << 27) // (MC) Sector 11 Lock Status +#define AT91C_MC_LOCKS12 (0x1 << 28) // (MC) Sector 12 Lock Status +#define AT91C_MC_LOCKS13 (0x1 << 29) // (MC) Sector 13 Lock Status +#define AT91C_MC_LOCKS14 (0x1 << 30) // (MC) Sector 14 Lock Status +#define AT91C_MC_LOCKS15 (0x1 << 31) // (MC) Sector 15 Lock Status + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Serial Parallel Interface +// ***************************************************************************** +// *** Register offset in AT91S_SPI structure *** +#define SPI_CR ( 0) // Control Register +#define SPI_MR ( 4) // Mode Register +#define SPI_RDR ( 8) // Receive Data Register +#define SPI_TDR (12) // Transmit Data Register +#define SPI_SR (16) // Status Register +#define SPI_IER (20) // Interrupt Enable Register +#define SPI_IDR (24) // Interrupt Disable Register +#define SPI_IMR (28) // Interrupt Mask Register +#define SPI_CSR (48) // Chip Select Register +#define SPI_RPR (256) // Receive Pointer Register +#define SPI_RCR (260) // Receive Counter Register +#define SPI_TPR (264) // Transmit Pointer Register +#define SPI_TCR (268) // Transmit Counter Register +#define SPI_RNPR (272) // Receive Next Pointer Register +#define SPI_RNCR (276) // Receive Next Counter Register +#define SPI_TNPR (280) // Transmit Next Pointer Register +#define SPI_TNCR (284) // Transmit Next Counter Register +#define SPI_PTCR (288) // PDC Transfer Control Register +#define SPI_PTSR (292) // PDC Transfer Status Register +// -------- SPI_CR : (SPI Offset: 0x0) SPI Control Register -------- +#define AT91C_SPI_SPIEN (0x1 << 0) // (SPI) SPI Enable +#define AT91C_SPI_SPIDIS (0x1 << 1) // (SPI) SPI Disable +#define AT91C_SPI_SWRST (0x1 << 7) // (SPI) SPI Software reset +#define AT91C_SPI_LASTXFER (0x1 << 24) // (SPI) SPI Last Transfer +// -------- SPI_MR : (SPI Offset: 0x4) SPI Mode Register -------- +#define AT91C_SPI_MSTR (0x1 << 0) // (SPI) Master/Slave Mode +#define AT91C_SPI_PS (0x1 << 1) // (SPI) Peripheral Select +#define AT91C_SPI_PS_FIXED (0x0 << 1) // (SPI) Fixed Peripheral Select +#define AT91C_SPI_PS_VARIABLE (0x1 << 1) // (SPI) Variable Peripheral Select +#define AT91C_SPI_PCSDEC (0x1 << 2) // (SPI) Chip Select Decode +#define AT91C_SPI_FDIV (0x1 << 3) // (SPI) Clock Selection +#define AT91C_SPI_MODFDIS (0x1 << 4) // (SPI) Mode Fault Detection +#define AT91C_SPI_LLB (0x1 << 7) // (SPI) Clock Selection +#define AT91C_SPI_PCS (0xF << 16) // (SPI) Peripheral Chip Select +#define AT91C_SPI_DLYBCS (0xFF << 24) // (SPI) Delay Between Chip Selects +// -------- SPI_RDR : (SPI Offset: 0x8) Receive Data Register -------- +#define AT91C_SPI_RD (0xFFFF << 0) // (SPI) Receive Data +#define AT91C_SPI_RPCS (0xF << 16) // (SPI) Peripheral Chip Select Status +// -------- SPI_TDR : (SPI Offset: 0xc) Transmit Data Register -------- +#define AT91C_SPI_TD (0xFFFF << 0) // (SPI) Transmit Data +#define AT91C_SPI_TPCS (0xF << 16) // (SPI) Peripheral Chip Select Status +// -------- SPI_SR : (SPI Offset: 0x10) Status Register -------- +#define AT91C_SPI_RDRF (0x1 << 0) // (SPI) Receive Data Register Full +#define AT91C_SPI_TDRE (0x1 << 1) // (SPI) Transmit Data Register Empty +#define AT91C_SPI_MODF (0x1 << 2) // (SPI) Mode Fault Error +#define AT91C_SPI_OVRES (0x1 << 3) // (SPI) Overrun Error Status +#define AT91C_SPI_ENDRX (0x1 << 4) // (SPI) End of Receiver Transfer +#define AT91C_SPI_ENDTX (0x1 << 5) // (SPI) End of Receiver Transfer +#define AT91C_SPI_RXBUFF (0x1 << 6) // (SPI) RXBUFF Interrupt +#define AT91C_SPI_TXBUFE (0x1 << 7) // (SPI) TXBUFE Interrupt +#define AT91C_SPI_NSSR (0x1 << 8) // (SPI) NSSR Interrupt +#define AT91C_SPI_TXEMPTY (0x1 << 9) // (SPI) TXEMPTY Interrupt +#define AT91C_SPI_SPIENS (0x1 << 16) // (SPI) Enable Status +// -------- SPI_IER : (SPI Offset: 0x14) Interrupt Enable Register -------- +// -------- SPI_IDR : (SPI Offset: 0x18) Interrupt Disable Register -------- +// -------- SPI_IMR : (SPI Offset: 0x1c) Interrupt Mask Register -------- +// -------- SPI_CSR : (SPI Offset: 0x30) Chip Select Register -------- +#define AT91C_SPI_CPOL (0x1 << 0) // (SPI) Clock Polarity +#define AT91C_SPI_NCPHA (0x1 << 1) // (SPI) Clock Phase +#define AT91C_SPI_CSAAT (0x1 << 3) // (SPI) Chip Select Active After Transfer +#define AT91C_SPI_BITS (0xF << 4) // (SPI) Bits Per Transfer +#define AT91C_SPI_BITS_8 (0x0 << 4) // (SPI) 8 Bits Per transfer +#define AT91C_SPI_BITS_9 (0x1 << 4) // (SPI) 9 Bits Per transfer +#define AT91C_SPI_BITS_10 (0x2 << 4) // (SPI) 10 Bits Per transfer +#define AT91C_SPI_BITS_11 (0x3 << 4) // (SPI) 11 Bits Per transfer +#define AT91C_SPI_BITS_12 (0x4 << 4) // (SPI) 12 Bits Per transfer +#define AT91C_SPI_BITS_13 (0x5 << 4) // (SPI) 13 Bits Per transfer +#define AT91C_SPI_BITS_14 (0x6 << 4) // (SPI) 14 Bits Per transfer +#define AT91C_SPI_BITS_15 (0x7 << 4) // (SPI) 15 Bits Per transfer +#define AT91C_SPI_BITS_16 (0x8 << 4) // (SPI) 16 Bits Per transfer +#define AT91C_SPI_SCBR (0xFF << 8) // (SPI) Serial Clock Baud Rate +#define AT91C_SPI_DLYBS (0xFF << 16) // (SPI) Delay Before SPCK +#define AT91C_SPI_DLYBCT (0xFF << 24) // (SPI) Delay Between Consecutive Transfers + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Usart +// ***************************************************************************** +// *** Register offset in AT91S_USART structure *** +#define US_CR ( 0) // Control Register +#define US_MR ( 4) // Mode Register +#define US_IER ( 8) // Interrupt Enable Register +#define US_IDR (12) // Interrupt Disable Register +#define US_IMR (16) // Interrupt Mask Register +#define US_CSR (20) // Channel Status Register +#define US_RHR (24) // Receiver Holding Register +#define US_THR (28) // Transmitter Holding Register +#define US_BRGR (32) // Baud Rate Generator Register +#define US_RTOR (36) // Receiver Time-out Register +#define US_TTGR (40) // Transmitter Time-guard Register +#define US_FIDI (64) // FI_DI_Ratio Register +#define US_NER (68) // Nb Errors Register +#define US_IF (76) // IRDA_FILTER Register +#define US_RPR (256) // Receive Pointer Register +#define US_RCR (260) // Receive Counter Register +#define US_TPR (264) // Transmit Pointer Register +#define US_TCR (268) // Transmit Counter Register +#define US_RNPR (272) // Receive Next Pointer Register +#define US_RNCR (276) // Receive Next Counter Register +#define US_TNPR (280) // Transmit Next Pointer Register +#define US_TNCR (284) // Transmit Next Counter Register +#define US_PTCR (288) // PDC Transfer Control Register +#define US_PTSR (292) // PDC Transfer Status Register +// -------- US_CR : (USART Offset: 0x0) Debug Unit Control Register -------- +#define AT91C_US_STTBRK (0x1 << 9) // (USART) Start Break +#define AT91C_US_STPBRK (0x1 << 10) // (USART) Stop Break +#define AT91C_US_STTTO (0x1 << 11) // (USART) Start Time-out +#define AT91C_US_SENDA (0x1 << 12) // (USART) Send Address +#define AT91C_US_RSTIT (0x1 << 13) // (USART) Reset Iterations +#define AT91C_US_RSTNACK (0x1 << 14) // (USART) Reset Non Acknowledge +#define AT91C_US_RETTO (0x1 << 15) // (USART) Rearm Time-out +#define AT91C_US_DTREN (0x1 << 16) // (USART) Data Terminal ready Enable +#define AT91C_US_DTRDIS (0x1 << 17) // (USART) Data Terminal ready Disable +#define AT91C_US_RTSEN (0x1 << 18) // (USART) Request to Send enable +#define AT91C_US_RTSDIS (0x1 << 19) // (USART) Request to Send Disable +// -------- US_MR : (USART Offset: 0x4) Debug Unit Mode Register -------- +#define AT91C_US_USMODE (0xF << 0) // (USART) Usart mode +#define AT91C_US_USMODE_NORMAL (0x0) // (USART) Normal +#define AT91C_US_USMODE_RS485 (0x1) // (USART) RS485 +#define AT91C_US_USMODE_HWHSH (0x2) // (USART) Hardware Handshaking +#define AT91C_US_USMODE_MODEM (0x3) // (USART) Modem +#define AT91C_US_USMODE_ISO7816_0 (0x4) // (USART) ISO7816 protocol: T = 0 +#define AT91C_US_USMODE_ISO7816_1 (0x6) // (USART) ISO7816 protocol: T = 1 +#define AT91C_US_USMODE_IRDA (0x8) // (USART) IrDA +#define AT91C_US_USMODE_SWHSH (0xC) // (USART) Software Handshaking +#define AT91C_US_CLKS (0x3 << 4) // (USART) Clock Selection (Baud Rate generator Input Clock +#define AT91C_US_CLKS_CLOCK (0x0 << 4) // (USART) Clock +#define AT91C_US_CLKS_FDIV1 (0x1 << 4) // (USART) fdiv1 +#define AT91C_US_CLKS_SLOW (0x2 << 4) // (USART) slow_clock (ARM) +#define AT91C_US_CLKS_EXT (0x3 << 4) // (USART) External (SCK) +#define AT91C_US_CHRL (0x3 << 6) // (USART) Clock Selection (Baud Rate generator Input Clock +#define AT91C_US_CHRL_5_BITS (0x0 << 6) // (USART) Character Length: 5 bits +#define AT91C_US_CHRL_6_BITS (0x1 << 6) // (USART) Character Length: 6 bits +#define AT91C_US_CHRL_7_BITS (0x2 << 6) // (USART) Character Length: 7 bits +#define AT91C_US_CHRL_8_BITS (0x3 << 6) // (USART) Character Length: 8 bits +#define AT91C_US_SYNC (0x1 << 8) // (USART) Synchronous Mode Select +#define AT91C_US_NBSTOP (0x3 << 12) // (USART) Number of Stop bits +#define AT91C_US_NBSTOP_1_BIT (0x0 << 12) // (USART) 1 stop bit +#define AT91C_US_NBSTOP_15_BIT (0x1 << 12) // (USART) Asynchronous (SYNC=0) 2 stop bits Synchronous (SYNC=1) 2 stop bits +#define AT91C_US_NBSTOP_2_BIT (0x2 << 12) // (USART) 2 stop bits +#define AT91C_US_MSBF (0x1 << 16) // (USART) Bit Order +#define AT91C_US_MODE9 (0x1 << 17) // (USART) 9-bit Character length +#define AT91C_US_CKLO (0x1 << 18) // (USART) Clock Output Select +#define AT91C_US_OVER (0x1 << 19) // (USART) Over Sampling Mode +#define AT91C_US_INACK (0x1 << 20) // (USART) Inhibit Non Acknowledge +#define AT91C_US_DSNACK (0x1 << 21) // (USART) Disable Successive NACK +#define AT91C_US_MAX_ITER (0x1 << 24) // (USART) Number of Repetitions +#define AT91C_US_FILTER (0x1 << 28) // (USART) Receive Line Filter +// -------- US_IER : (USART Offset: 0x8) Debug Unit Interrupt Enable Register -------- +#define AT91C_US_RXBRK (0x1 << 2) // (USART) Break Received/End of Break +#define AT91C_US_TIMEOUT (0x1 << 8) // (USART) Receiver Time-out +#define AT91C_US_ITERATION (0x1 << 10) // (USART) Max number of Repetitions Reached +#define AT91C_US_NACK (0x1 << 13) // (USART) Non Acknowledge +#define AT91C_US_RIIC (0x1 << 16) // (USART) Ring INdicator Input Change Flag +#define AT91C_US_DSRIC (0x1 << 17) // (USART) Data Set Ready Input Change Flag +#define AT91C_US_DCDIC (0x1 << 18) // (USART) Data Carrier Flag +#define AT91C_US_CTSIC (0x1 << 19) // (USART) Clear To Send Input Change Flag +// -------- US_IDR : (USART Offset: 0xc) Debug Unit Interrupt Disable Register -------- +// -------- US_IMR : (USART Offset: 0x10) Debug Unit Interrupt Mask Register -------- +// -------- US_CSR : (USART Offset: 0x14) Debug Unit Channel Status Register -------- +#define AT91C_US_RI (0x1 << 20) // (USART) Image of RI Input +#define AT91C_US_DSR (0x1 << 21) // (USART) Image of DSR Input +#define AT91C_US_DCD (0x1 << 22) // (USART) Image of DCD Input +#define AT91C_US_CTS (0x1 << 23) // (USART) Image of CTS Input + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Synchronous Serial Controller Interface +// ***************************************************************************** +// *** Register offset in AT91S_SSC structure *** +#define SSC_CR ( 0) // Control Register +#define SSC_CMR ( 4) // Clock Mode Register +#define SSC_RCMR (16) // Receive Clock ModeRegister +#define SSC_RFMR (20) // Receive Frame Mode Register +#define SSC_TCMR (24) // Transmit Clock Mode Register +#define SSC_TFMR (28) // Transmit Frame Mode Register +#define SSC_RHR (32) // Receive Holding Register +#define SSC_THR (36) // Transmit Holding Register +#define SSC_RSHR (48) // Receive Sync Holding Register +#define SSC_TSHR (52) // Transmit Sync Holding Register +#define SSC_SR (64) // Status Register +#define SSC_IER (68) // Interrupt Enable Register +#define SSC_IDR (72) // Interrupt Disable Register +#define SSC_IMR (76) // Interrupt Mask Register +#define SSC_RPR (256) // Receive Pointer Register +#define SSC_RCR (260) // Receive Counter Register +#define SSC_TPR (264) // Transmit Pointer Register +#define SSC_TCR (268) // Transmit Counter Register +#define SSC_RNPR (272) // Receive Next Pointer Register +#define SSC_RNCR (276) // Receive Next Counter Register +#define SSC_TNPR (280) // Transmit Next Pointer Register +#define SSC_TNCR (284) // Transmit Next Counter Register +#define SSC_PTCR (288) // PDC Transfer Control Register +#define SSC_PTSR (292) // PDC Transfer Status Register +// -------- SSC_CR : (SSC Offset: 0x0) SSC Control Register -------- +#define AT91C_SSC_RXEN (0x1 << 0) // (SSC) Receive Enable +#define AT91C_SSC_RXDIS (0x1 << 1) // (SSC) Receive Disable +#define AT91C_SSC_TXEN (0x1 << 8) // (SSC) Transmit Enable +#define AT91C_SSC_TXDIS (0x1 << 9) // (SSC) Transmit Disable +#define AT91C_SSC_SWRST (0x1 << 15) // (SSC) Software Reset +// -------- SSC_RCMR : (SSC Offset: 0x10) SSC Receive Clock Mode Register -------- +#define AT91C_SSC_CKS (0x3 << 0) // (SSC) Receive/Transmit Clock Selection +#define AT91C_SSC_CKS_DIV (0x0) // (SSC) Divided Clock +#define AT91C_SSC_CKS_TK (0x1) // (SSC) TK Clock signal +#define AT91C_SSC_CKS_RK (0x2) // (SSC) RK pin +#define AT91C_SSC_CKO (0x7 << 2) // (SSC) Receive/Transmit Clock Output Mode Selection +#define AT91C_SSC_CKO_NONE (0x0 << 2) // (SSC) Receive/Transmit Clock Output Mode: None RK pin: Input-only +#define AT91C_SSC_CKO_CONTINOUS (0x1 << 2) // (SSC) Continuous Receive/Transmit Clock RK pin: Output +#define AT91C_SSC_CKO_DATA_TX (0x2 << 2) // (SSC) Receive/Transmit Clock only during data transfers RK pin: Output +#define AT91C_SSC_CKI (0x1 << 5) // (SSC) Receive/Transmit Clock Inversion +#define AT91C_SSC_START (0xF << 8) // (SSC) Receive/Transmit Start Selection +#define AT91C_SSC_START_CONTINOUS (0x0 << 8) // (SSC) Continuous, as soon as the receiver is enabled, and immediately after the end of transfer of the previous data. +#define AT91C_SSC_START_TX (0x1 << 8) // (SSC) Transmit/Receive start +#define AT91C_SSC_START_LOW_RF (0x2 << 8) // (SSC) Detection of a low level on RF input +#define AT91C_SSC_START_HIGH_RF (0x3 << 8) // (SSC) Detection of a high level on RF input +#define AT91C_SSC_START_FALL_RF (0x4 << 8) // (SSC) Detection of a falling edge on RF input +#define AT91C_SSC_START_RISE_RF (0x5 << 8) // (SSC) Detection of a rising edge on RF input +#define AT91C_SSC_START_LEVEL_RF (0x6 << 8) // (SSC) Detection of any level change on RF input +#define AT91C_SSC_START_EDGE_RF (0x7 << 8) // (SSC) Detection of any edge on RF input +#define AT91C_SSC_START_0 (0x8 << 8) // (SSC) Compare 0 +#define AT91C_SSC_STTDLY (0xFF << 16) // (SSC) Receive/Transmit Start Delay +#define AT91C_SSC_PERIOD (0xFF << 24) // (SSC) Receive/Transmit Period Divider Selection +// -------- SSC_RFMR : (SSC Offset: 0x14) SSC Receive Frame Mode Register -------- +#define AT91C_SSC_DATLEN (0x1F << 0) // (SSC) Data Length +#define AT91C_SSC_LOOP (0x1 << 5) // (SSC) Loop Mode +#define AT91C_SSC_MSBF (0x1 << 7) // (SSC) Most Significant Bit First +#define AT91C_SSC_DATNB (0xF << 8) // (SSC) Data Number per Frame +#define AT91C_SSC_FSLEN (0xF << 16) // (SSC) Receive/Transmit Frame Sync length +#define AT91C_SSC_FSOS (0x7 << 20) // (SSC) Receive/Transmit Frame Sync Output Selection +#define AT91C_SSC_FSOS_NONE (0x0 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: None RK pin Input-only +#define AT91C_SSC_FSOS_NEGATIVE (0x1 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Negative Pulse +#define AT91C_SSC_FSOS_POSITIVE (0x2 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Positive Pulse +#define AT91C_SSC_FSOS_LOW (0x3 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver Low during data transfer +#define AT91C_SSC_FSOS_HIGH (0x4 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver High during data transfer +#define AT91C_SSC_FSOS_TOGGLE (0x5 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Toggling at each start of data transfer +#define AT91C_SSC_FSEDGE (0x1 << 24) // (SSC) Frame Sync Edge Detection +// -------- SSC_TCMR : (SSC Offset: 0x18) SSC Transmit Clock Mode Register -------- +// -------- SSC_TFMR : (SSC Offset: 0x1c) SSC Transmit Frame Mode Register -------- +#define AT91C_SSC_DATDEF (0x1 << 5) // (SSC) Data Default Value +#define AT91C_SSC_FSDEN (0x1 << 23) // (SSC) Frame Sync Data Enable +// -------- SSC_SR : (SSC Offset: 0x40) SSC Status Register -------- +#define AT91C_SSC_TXRDY (0x1 << 0) // (SSC) Transmit Ready +#define AT91C_SSC_TXEMPTY (0x1 << 1) // (SSC) Transmit Empty +#define AT91C_SSC_ENDTX (0x1 << 2) // (SSC) End Of Transmission +#define AT91C_SSC_TXBUFE (0x1 << 3) // (SSC) Transmit Buffer Empty +#define AT91C_SSC_RXRDY (0x1 << 4) // (SSC) Receive Ready +#define AT91C_SSC_OVRUN (0x1 << 5) // (SSC) Receive Overrun +#define AT91C_SSC_ENDRX (0x1 << 6) // (SSC) End of Reception +#define AT91C_SSC_RXBUFF (0x1 << 7) // (SSC) Receive Buffer Full +#define AT91C_SSC_TXSYN (0x1 << 10) // (SSC) Transmit Sync +#define AT91C_SSC_RXSYN (0x1 << 11) // (SSC) Receive Sync +#define AT91C_SSC_TXENA (0x1 << 16) // (SSC) Transmit Enable +#define AT91C_SSC_RXENA (0x1 << 17) // (SSC) Receive Enable +// -------- SSC_IER : (SSC Offset: 0x44) SSC Interrupt Enable Register -------- +// -------- SSC_IDR : (SSC Offset: 0x48) SSC Interrupt Disable Register -------- +// -------- SSC_IMR : (SSC Offset: 0x4c) SSC Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Two-wire Interface +// ***************************************************************************** +// *** Register offset in AT91S_TWI structure *** +#define TWI_CR ( 0) // Control Register +#define TWI_MMR ( 4) // Master Mode Register +#define TWI_IADR (12) // Internal Address Register +#define TWI_CWGR (16) // Clock Waveform Generator Register +#define TWI_SR (32) // Status Register +#define TWI_IER (36) // Interrupt Enable Register +#define TWI_IDR (40) // Interrupt Disable Register +#define TWI_IMR (44) // Interrupt Mask Register +#define TWI_RHR (48) // Receive Holding Register +#define TWI_THR (52) // Transmit Holding Register +// -------- TWI_CR : (TWI Offset: 0x0) TWI Control Register -------- +#define AT91C_TWI_START (0x1 << 0) // (TWI) Send a START Condition +#define AT91C_TWI_STOP (0x1 << 1) // (TWI) Send a STOP Condition +#define AT91C_TWI_MSEN (0x1 << 2) // (TWI) TWI Master Transfer Enabled +#define AT91C_TWI_MSDIS (0x1 << 3) // (TWI) TWI Master Transfer Disabled +#define AT91C_TWI_SWRST (0x1 << 7) // (TWI) Software Reset +// -------- TWI_MMR : (TWI Offset: 0x4) TWI Master Mode Register -------- +#define AT91C_TWI_IADRSZ (0x3 << 8) // (TWI) Internal Device Address Size +#define AT91C_TWI_IADRSZ_NO (0x0 << 8) // (TWI) No internal device address +#define AT91C_TWI_IADRSZ_1_BYTE (0x1 << 8) // (TWI) One-byte internal device address +#define AT91C_TWI_IADRSZ_2_BYTE (0x2 << 8) // (TWI) Two-byte internal device address +#define AT91C_TWI_IADRSZ_3_BYTE (0x3 << 8) // (TWI) Three-byte internal device address +#define AT91C_TWI_MREAD (0x1 << 12) // (TWI) Master Read Direction +#define AT91C_TWI_DADR (0x7F << 16) // (TWI) Device Address +// -------- TWI_CWGR : (TWI Offset: 0x10) TWI Clock Waveform Generator Register -------- +#define AT91C_TWI_CLDIV (0xFF << 0) // (TWI) Clock Low Divider +#define AT91C_TWI_CHDIV (0xFF << 8) // (TWI) Clock High Divider +#define AT91C_TWI_CKDIV (0x7 << 16) // (TWI) Clock Divider +// -------- TWI_SR : (TWI Offset: 0x20) TWI Status Register -------- +#define AT91C_TWI_TXCOMP (0x1 << 0) // (TWI) Transmission Completed +#define AT91C_TWI_RXRDY (0x1 << 1) // (TWI) Receive holding register ReaDY +#define AT91C_TWI_TXRDY (0x1 << 2) // (TWI) Transmit holding register ReaDY +#define AT91C_TWI_OVRE (0x1 << 6) // (TWI) Overrun Error +#define AT91C_TWI_UNRE (0x1 << 7) // (TWI) Underrun Error +#define AT91C_TWI_NACK (0x1 << 8) // (TWI) Not Acknowledged +// -------- TWI_IER : (TWI Offset: 0x24) TWI Interrupt Enable Register -------- +// -------- TWI_IDR : (TWI Offset: 0x28) TWI Interrupt Disable Register -------- +// -------- TWI_IMR : (TWI Offset: 0x2c) TWI Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR PWMC Channel Interface +// ***************************************************************************** +// *** Register offset in AT91S_PWMC_CH structure *** +#define PWMC_CMR ( 0) // Channel Mode Register +#define PWMC_CDTYR ( 4) // Channel Duty Cycle Register +#define PWMC_CPRDR ( 8) // Channel Period Register +#define PWMC_CCNTR (12) // Channel Counter Register +#define PWMC_CUPDR (16) // Channel Update Register +#define PWMC_Reserved (20) // Reserved +// -------- PWMC_CMR : (PWMC_CH Offset: 0x0) PWMC Channel Mode Register -------- +#define AT91C_PWMC_CPRE (0xF << 0) // (PWMC_CH) Channel Pre-scaler : PWMC_CLKx +#define AT91C_PWMC_CPRE_MCK (0x0) // (PWMC_CH) +#define AT91C_PWMC_CPRE_MCKA (0xB) // (PWMC_CH) +#define AT91C_PWMC_CPRE_MCKB (0xC) // (PWMC_CH) +#define AT91C_PWMC_CALG (0x1 << 8) // (PWMC_CH) Channel Alignment +#define AT91C_PWMC_CPOL (0x1 << 9) // (PWMC_CH) Channel Polarity +#define AT91C_PWMC_CPD (0x1 << 10) // (PWMC_CH) Channel Update Period +// -------- PWMC_CDTYR : (PWMC_CH Offset: 0x4) PWMC Channel Duty Cycle Register -------- +#define AT91C_PWMC_CDTY (0x0 << 0) // (PWMC_CH) Channel Duty Cycle +// -------- PWMC_CPRDR : (PWMC_CH Offset: 0x8) PWMC Channel Period Register -------- +#define AT91C_PWMC_CPRD (0x0 << 0) // (PWMC_CH) Channel Period +// -------- PWMC_CCNTR : (PWMC_CH Offset: 0xc) PWMC Channel Counter Register -------- +#define AT91C_PWMC_CCNT (0x0 << 0) // (PWMC_CH) Channel Counter +// -------- PWMC_CUPDR : (PWMC_CH Offset: 0x10) PWMC Channel Update Register -------- +#define AT91C_PWMC_CUPD (0x0 << 0) // (PWMC_CH) Channel Update + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Pulse Width Modulation Controller Interface +// ***************************************************************************** +// *** Register offset in AT91S_PWMC structure *** +#define PWMC_MR ( 0) // PWMC Mode Register +#define PWMC_ENA ( 4) // PWMC Enable Register +#define PWMC_DIS ( 8) // PWMC Disable Register +#define PWMC_SR (12) // PWMC Status Register +#define PWMC_IER (16) // PWMC Interrupt Enable Register +#define PWMC_IDR (20) // PWMC Interrupt Disable Register +#define PWMC_IMR (24) // PWMC Interrupt Mask Register +#define PWMC_ISR (28) // PWMC Interrupt Status Register +#define PWMC_VR (252) // PWMC Version Register +#define PWMC_CH (512) // PWMC Channel +// -------- PWMC_MR : (PWMC Offset: 0x0) PWMC Mode Register -------- +#define AT91C_PWMC_DIVA (0xFF << 0) // (PWMC) CLKA divide factor. +#define AT91C_PWMC_PREA (0xF << 8) // (PWMC) Divider Input Clock Prescaler A +#define AT91C_PWMC_PREA_MCK (0x0 << 8) // (PWMC) +#define AT91C_PWMC_DIVB (0xFF << 16) // (PWMC) CLKB divide factor. +#define AT91C_PWMC_PREB (0xF << 24) // (PWMC) Divider Input Clock Prescaler B +#define AT91C_PWMC_PREB_MCK (0x0 << 24) // (PWMC) +// -------- PWMC_ENA : (PWMC Offset: 0x4) PWMC Enable Register -------- +#define AT91C_PWMC_CHID0 (0x1 << 0) // (PWMC) Channel ID 0 +#define AT91C_PWMC_CHID1 (0x1 << 1) // (PWMC) Channel ID 1 +#define AT91C_PWMC_CHID2 (0x1 << 2) // (PWMC) Channel ID 2 +#define AT91C_PWMC_CHID3 (0x1 << 3) // (PWMC) Channel ID 3 +// -------- PWMC_DIS : (PWMC Offset: 0x8) PWMC Disable Register -------- +// -------- PWMC_SR : (PWMC Offset: 0xc) PWMC Status Register -------- +// -------- PWMC_IER : (PWMC Offset: 0x10) PWMC Interrupt Enable Register -------- +// -------- PWMC_IDR : (PWMC Offset: 0x14) PWMC Interrupt Disable Register -------- +// -------- PWMC_IMR : (PWMC Offset: 0x18) PWMC Interrupt Mask Register -------- +// -------- PWMC_ISR : (PWMC Offset: 0x1c) PWMC Interrupt Status Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR USB Device Interface +// ***************************************************************************** +// *** Register offset in AT91S_UDP structure *** +#define UDP_NUM ( 0) // Frame Number Register +#define UDP_GLBSTATE ( 4) // Global State Register +#define UDP_FADDR ( 8) // Function Address Register +#define UDP_IER (16) // Interrupt Enable Register +#define UDP_IDR (20) // Interrupt Disable Register +#define UDP_IMR (24) // Interrupt Mask Register +#define UDP_ISR (28) // Interrupt Status Register +#define UDP_ICR (32) // Interrupt Clear Register +#define UDP_RSTEP (40) // Reset Endpoint Register +#define UDP_CSR (48) // Endpoint Control and Status Register +#define UDP_FDR (80) // Endpoint FIFO Data Register +#define UDP_TXVC (116) // Transceiver Control Register +// -------- UDP_FRM_NUM : (UDP Offset: 0x0) USB Frame Number Register -------- +#define AT91C_UDP_FRM_NUM (0x7FF << 0) // (UDP) Frame Number as Defined in the Packet Field Formats +#define AT91C_UDP_FRM_ERR (0x1 << 16) // (UDP) Frame Error +#define AT91C_UDP_FRM_OK (0x1 << 17) // (UDP) Frame OK +// -------- UDP_GLB_STATE : (UDP Offset: 0x4) USB Global State Register -------- +#define AT91C_UDP_FADDEN (0x1 << 0) // (UDP) Function Address Enable +#define AT91C_UDP_CONFG (0x1 << 1) // (UDP) Configured +#define AT91C_UDP_ESR (0x1 << 2) // (UDP) Enable Send Resume +#define AT91C_UDP_RSMINPR (0x1 << 3) // (UDP) A Resume Has Been Sent to the Host +#define AT91C_UDP_RMWUPE (0x1 << 4) // (UDP) Remote Wake Up Enable +// -------- UDP_FADDR : (UDP Offset: 0x8) USB Function Address Register -------- +#define AT91C_UDP_FADD (0xFF << 0) // (UDP) Function Address Value +#define AT91C_UDP_FEN (0x1 << 8) // (UDP) Function Enable +// -------- UDP_IER : (UDP Offset: 0x10) USB Interrupt Enable Register -------- +#define AT91C_UDP_EPINT0 (0x1 << 0) // (UDP) Endpoint 0 Interrupt +#define AT91C_UDP_EPINT1 (0x1 << 1) // (UDP) Endpoint 0 Interrupt +#define AT91C_UDP_EPINT2 (0x1 << 2) // (UDP) Endpoint 2 Interrupt +#define AT91C_UDP_EPINT3 (0x1 << 3) // (UDP) Endpoint 3 Interrupt +#define AT91C_UDP_EPINT4 (0x1 << 4) // (UDP) Endpoint 4 Interrupt +#define AT91C_UDP_EPINT5 (0x1 << 5) // (UDP) Endpoint 5 Interrupt +#define AT91C_UDP_RXSUSP (0x1 << 8) // (UDP) USB Suspend Interrupt +#define AT91C_UDP_RXRSM (0x1 << 9) // (UDP) USB Resume Interrupt +#define AT91C_UDP_EXTRSM (0x1 << 10) // (UDP) USB External Resume Interrupt +#define AT91C_UDP_SOFINT (0x1 << 11) // (UDP) USB Start Of frame Interrupt +#define AT91C_UDP_WAKEUP (0x1 << 13) // (UDP) USB Resume Interrupt +// -------- UDP_IDR : (UDP Offset: 0x14) USB Interrupt Disable Register -------- +// -------- UDP_IMR : (UDP Offset: 0x18) USB Interrupt Mask Register -------- +// -------- UDP_ISR : (UDP Offset: 0x1c) USB Interrupt Status Register -------- +#define AT91C_UDP_ENDBUSRES (0x1 << 12) // (UDP) USB End Of Bus Reset Interrupt +// -------- UDP_ICR : (UDP Offset: 0x20) USB Interrupt Clear Register -------- +// -------- UDP_RST_EP : (UDP Offset: 0x28) USB Reset Endpoint Register -------- +#define AT91C_UDP_EP0 (0x1 << 0) // (UDP) Reset Endpoint 0 +#define AT91C_UDP_EP1 (0x1 << 1) // (UDP) Reset Endpoint 1 +#define AT91C_UDP_EP2 (0x1 << 2) // (UDP) Reset Endpoint 2 +#define AT91C_UDP_EP3 (0x1 << 3) // (UDP) Reset Endpoint 3 +#define AT91C_UDP_EP4 (0x1 << 4) // (UDP) Reset Endpoint 4 +#define AT91C_UDP_EP5 (0x1 << 5) // (UDP) Reset Endpoint 5 +// -------- UDP_CSR : (UDP Offset: 0x30) USB Endpoint Control and Status Register -------- +#define AT91C_UDP_TXCOMP (0x1 << 0) // (UDP) Generates an IN packet with data previously written in the DPR +#define AT91C_UDP_RX_DATA_BK0 (0x1 << 1) // (UDP) Receive Data Bank 0 +#define AT91C_UDP_RXSETUP (0x1 << 2) // (UDP) Sends STALL to the Host (Control endpoints) +#define AT91C_UDP_ISOERROR (0x1 << 3) // (UDP) Isochronous error (Isochronous endpoints) +#define AT91C_UDP_TXPKTRDY (0x1 << 4) // (UDP) Transmit Packet Ready +#define AT91C_UDP_FORCESTALL (0x1 << 5) // (UDP) Force Stall (used by Control, Bulk and Isochronous endpoints). +#define AT91C_UDP_RX_DATA_BK1 (0x1 << 6) // (UDP) Receive Data Bank 1 (only used by endpoints with ping-pong attributes). +#define AT91C_UDP_DIR (0x1 << 7) // (UDP) Transfer Direction +#define AT91C_UDP_EPTYPE (0x7 << 8) // (UDP) Endpoint type +#define AT91C_UDP_EPTYPE_CTRL (0x0 << 8) // (UDP) Control +#define AT91C_UDP_EPTYPE_ISO_OUT (0x1 << 8) // (UDP) Isochronous OUT +#define AT91C_UDP_EPTYPE_BULK_OUT (0x2 << 8) // (UDP) Bulk OUT +#define AT91C_UDP_EPTYPE_INT_OUT (0x3 << 8) // (UDP) Interrupt OUT +#define AT91C_UDP_EPTYPE_ISO_IN (0x5 << 8) // (UDP) Isochronous IN +#define AT91C_UDP_EPTYPE_BULK_IN (0x6 << 8) // (UDP) Bulk IN +#define AT91C_UDP_EPTYPE_INT_IN (0x7 << 8) // (UDP) Interrupt IN +#define AT91C_UDP_DTGLE (0x1 << 11) // (UDP) Data Toggle +#define AT91C_UDP_EPEDS (0x1 << 15) // (UDP) Endpoint Enable Disable +#define AT91C_UDP_RXBYTECNT (0x7FF << 16) // (UDP) Number Of Bytes Available in the FIFO +// -------- UDP_TXVC : (UDP Offset: 0x74) Transceiver Control Register -------- +#define AT91C_UDP_TXVDIS (0x1 << 8) // (UDP) +#define AT91C_UDP_PUON (0x1 << 9) // (UDP) Pull-up ON + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Timer Counter Channel Interface +// ***************************************************************************** +// *** Register offset in AT91S_TC structure *** +#define TC_CCR ( 0) // Channel Control Register +#define TC_CMR ( 4) // Channel Mode Register (Capture Mode / Waveform Mode) +#define TC_CV (16) // Counter Value +#define TC_RA (20) // Register A +#define TC_RB (24) // Register B +#define TC_RC (28) // Register C +#define TC_SR (32) // Status Register +#define TC_IER (36) // Interrupt Enable Register +#define TC_IDR (40) // Interrupt Disable Register +#define TC_IMR (44) // Interrupt Mask Register +// -------- TC_CCR : (TC Offset: 0x0) TC Channel Control Register -------- +#define AT91C_TC_CLKEN (0x1 << 0) // (TC) Counter Clock Enable Command +#define AT91C_TC_CLKDIS (0x1 << 1) // (TC) Counter Clock Disable Command +#define AT91C_TC_SWTRG (0x1 << 2) // (TC) Software Trigger Command +// -------- TC_CMR : (TC Offset: 0x4) TC Channel Mode Register: Capture Mode / Waveform Mode -------- +#define AT91C_TC_CLKS (0x7 << 0) // (TC) Clock Selection +#define AT91C_TC_CLKS_TIMER_DIV1_CLOCK (0x0) // (TC) Clock selected: TIMER_DIV1_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV2_CLOCK (0x1) // (TC) Clock selected: TIMER_DIV2_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV3_CLOCK (0x2) // (TC) Clock selected: TIMER_DIV3_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV4_CLOCK (0x3) // (TC) Clock selected: TIMER_DIV4_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV5_CLOCK (0x4) // (TC) Clock selected: TIMER_DIV5_CLOCK +#define AT91C_TC_CLKS_XC0 (0x5) // (TC) Clock selected: XC0 +#define AT91C_TC_CLKS_XC1 (0x6) // (TC) Clock selected: XC1 +#define AT91C_TC_CLKS_XC2 (0x7) // (TC) Clock selected: XC2 +#define AT91C_TC_CLKI (0x1 << 3) // (TC) Clock Invert +#define AT91C_TC_BURST (0x3 << 4) // (TC) Burst Signal Selection +#define AT91C_TC_BURST_NONE (0x0 << 4) // (TC) The clock is not gated by an external signal +#define AT91C_TC_BURST_XC0 (0x1 << 4) // (TC) XC0 is ANDed with the selected clock +#define AT91C_TC_BURST_XC1 (0x2 << 4) // (TC) XC1 is ANDed with the selected clock +#define AT91C_TC_BURST_XC2 (0x3 << 4) // (TC) XC2 is ANDed with the selected clock +#define AT91C_TC_CPCSTOP (0x1 << 6) // (TC) Counter Clock Stopped with RC Compare +#define AT91C_TC_LDBSTOP (0x1 << 6) // (TC) Counter Clock Stopped with RB Loading +#define AT91C_TC_CPCDIS (0x1 << 7) // (TC) Counter Clock Disable with RC Compare +#define AT91C_TC_LDBDIS (0x1 << 7) // (TC) Counter Clock Disabled with RB Loading +#define AT91C_TC_ETRGEDG (0x3 << 8) // (TC) External Trigger Edge Selection +#define AT91C_TC_ETRGEDG_NONE (0x0 << 8) // (TC) Edge: None +#define AT91C_TC_ETRGEDG_RISING (0x1 << 8) // (TC) Edge: rising edge +#define AT91C_TC_ETRGEDG_FALLING (0x2 << 8) // (TC) Edge: falling edge +#define AT91C_TC_ETRGEDG_BOTH (0x3 << 8) // (TC) Edge: each edge +#define AT91C_TC_EEVTEDG (0x3 << 8) // (TC) External Event Edge Selection +#define AT91C_TC_EEVTEDG_NONE (0x0 << 8) // (TC) Edge: None +#define AT91C_TC_EEVTEDG_RISING (0x1 << 8) // (TC) Edge: rising edge +#define AT91C_TC_EEVTEDG_FALLING (0x2 << 8) // (TC) Edge: falling edge +#define AT91C_TC_EEVTEDG_BOTH (0x3 << 8) // (TC) Edge: each edge +#define AT91C_TC_EEVT (0x3 << 10) // (TC) External Event Selection +#define AT91C_TC_EEVT_TIOB (0x0 << 10) // (TC) Signal selected as external event: TIOB TIOB direction: input +#define AT91C_TC_EEVT_XC0 (0x1 << 10) // (TC) Signal selected as external event: XC0 TIOB direction: output +#define AT91C_TC_EEVT_XC1 (0x2 << 10) // (TC) Signal selected as external event: XC1 TIOB direction: output +#define AT91C_TC_EEVT_XC2 (0x3 << 10) // (TC) Signal selected as external event: XC2 TIOB direction: output +#define AT91C_TC_ABETRG (0x1 << 10) // (TC) TIOA or TIOB External Trigger Selection +#define AT91C_TC_ENETRG (0x1 << 12) // (TC) External Event Trigger enable +#define AT91C_TC_WAVESEL (0x3 << 13) // (TC) Waveform Selection +#define AT91C_TC_WAVESEL_UP (0x0 << 13) // (TC) UP mode without atomatic trigger on RC Compare +#define AT91C_TC_WAVESEL_UPDOWN (0x1 << 13) // (TC) UPDOWN mode without automatic trigger on RC Compare +#define AT91C_TC_WAVESEL_UP_AUTO (0x2 << 13) // (TC) UP mode with automatic trigger on RC Compare +#define AT91C_TC_WAVESEL_UPDOWN_AUTO (0x3 << 13) // (TC) UPDOWN mode with automatic trigger on RC Compare +#define AT91C_TC_CPCTRG (0x1 << 14) // (TC) RC Compare Trigger Enable +#define AT91C_TC_WAVE (0x1 << 15) // (TC) +#define AT91C_TC_ACPA (0x3 << 16) // (TC) RA Compare Effect on TIOA +#define AT91C_TC_ACPA_NONE (0x0 << 16) // (TC) Effect: none +#define AT91C_TC_ACPA_SET (0x1 << 16) // (TC) Effect: set +#define AT91C_TC_ACPA_CLEAR (0x2 << 16) // (TC) Effect: clear +#define AT91C_TC_ACPA_TOGGLE (0x3 << 16) // (TC) Effect: toggle +#define AT91C_TC_LDRA (0x3 << 16) // (TC) RA Loading Selection +#define AT91C_TC_LDRA_NONE (0x0 << 16) // (TC) Edge: None +#define AT91C_TC_LDRA_RISING (0x1 << 16) // (TC) Edge: rising edge of TIOA +#define AT91C_TC_LDRA_FALLING (0x2 << 16) // (TC) Edge: falling edge of TIOA +#define AT91C_TC_LDRA_BOTH (0x3 << 16) // (TC) Edge: each edge of TIOA +#define AT91C_TC_ACPC (0x3 << 18) // (TC) RC Compare Effect on TIOA +#define AT91C_TC_ACPC_NONE (0x0 << 18) // (TC) Effect: none +#define AT91C_TC_ACPC_SET (0x1 << 18) // (TC) Effect: set +#define AT91C_TC_ACPC_CLEAR (0x2 << 18) // (TC) Effect: clear +#define AT91C_TC_ACPC_TOGGLE (0x3 << 18) // (TC) Effect: toggle +#define AT91C_TC_LDRB (0x3 << 18) // (TC) RB Loading Selection +#define AT91C_TC_LDRB_NONE (0x0 << 18) // (TC) Edge: None +#define AT91C_TC_LDRB_RISING (0x1 << 18) // (TC) Edge: rising edge of TIOA +#define AT91C_TC_LDRB_FALLING (0x2 << 18) // (TC) Edge: falling edge of TIOA +#define AT91C_TC_LDRB_BOTH (0x3 << 18) // (TC) Edge: each edge of TIOA +#define AT91C_TC_AEEVT (0x3 << 20) // (TC) External Event Effect on TIOA +#define AT91C_TC_AEEVT_NONE (0x0 << 20) // (TC) Effect: none +#define AT91C_TC_AEEVT_SET (0x1 << 20) // (TC) Effect: set +#define AT91C_TC_AEEVT_CLEAR (0x2 << 20) // (TC) Effect: clear +#define AT91C_TC_AEEVT_TOGGLE (0x3 << 20) // (TC) Effect: toggle +#define AT91C_TC_ASWTRG (0x3 << 22) // (TC) Software Trigger Effect on TIOA +#define AT91C_TC_ASWTRG_NONE (0x0 << 22) // (TC) Effect: none +#define AT91C_TC_ASWTRG_SET (0x1 << 22) // (TC) Effect: set +#define AT91C_TC_ASWTRG_CLEAR (0x2 << 22) // (TC) Effect: clear +#define AT91C_TC_ASWTRG_TOGGLE (0x3 << 22) // (TC) Effect: toggle +#define AT91C_TC_BCPB (0x3 << 24) // (TC) RB Compare Effect on TIOB +#define AT91C_TC_BCPB_NONE (0x0 << 24) // (TC) Effect: none +#define AT91C_TC_BCPB_SET (0x1 << 24) // (TC) Effect: set +#define AT91C_TC_BCPB_CLEAR (0x2 << 24) // (TC) Effect: clear +#define AT91C_TC_BCPB_TOGGLE (0x3 << 24) // (TC) Effect: toggle +#define AT91C_TC_BCPC (0x3 << 26) // (TC) RC Compare Effect on TIOB +#define AT91C_TC_BCPC_NONE (0x0 << 26) // (TC) Effect: none +#define AT91C_TC_BCPC_SET (0x1 << 26) // (TC) Effect: set +#define AT91C_TC_BCPC_CLEAR (0x2 << 26) // (TC) Effect: clear +#define AT91C_TC_BCPC_TOGGLE (0x3 << 26) // (TC) Effect: toggle +#define AT91C_TC_BEEVT (0x3 << 28) // (TC) External Event Effect on TIOB +#define AT91C_TC_BEEVT_NONE (0x0 << 28) // (TC) Effect: none +#define AT91C_TC_BEEVT_SET (0x1 << 28) // (TC) Effect: set +#define AT91C_TC_BEEVT_CLEAR (0x2 << 28) // (TC) Effect: clear +#define AT91C_TC_BEEVT_TOGGLE (0x3 << 28) // (TC) Effect: toggle +#define AT91C_TC_BSWTRG (0x3 << 30) // (TC) Software Trigger Effect on TIOB +#define AT91C_TC_BSWTRG_NONE (0x0 << 30) // (TC) Effect: none +#define AT91C_TC_BSWTRG_SET (0x1 << 30) // (TC) Effect: set +#define AT91C_TC_BSWTRG_CLEAR (0x2 << 30) // (TC) Effect: clear +#define AT91C_TC_BSWTRG_TOGGLE (0x3 << 30) // (TC) Effect: toggle +// -------- TC_SR : (TC Offset: 0x20) TC Channel Status Register -------- +#define AT91C_TC_COVFS (0x1 << 0) // (TC) Counter Overflow +#define AT91C_TC_LOVRS (0x1 << 1) // (TC) Load Overrun +#define AT91C_TC_CPAS (0x1 << 2) // (TC) RA Compare +#define AT91C_TC_CPBS (0x1 << 3) // (TC) RB Compare +#define AT91C_TC_CPCS (0x1 << 4) // (TC) RC Compare +#define AT91C_TC_LDRAS (0x1 << 5) // (TC) RA Loading +#define AT91C_TC_LDRBS (0x1 << 6) // (TC) RB Loading +#define AT91C_TC_ETRGS (0x1 << 7) // (TC) External Trigger +#define AT91C_TC_CLKSTA (0x1 << 16) // (TC) Clock Enabling +#define AT91C_TC_MTIOA (0x1 << 17) // (TC) TIOA Mirror +#define AT91C_TC_MTIOB (0x1 << 18) // (TC) TIOA Mirror +// -------- TC_IER : (TC Offset: 0x24) TC Channel Interrupt Enable Register -------- +// -------- TC_IDR : (TC Offset: 0x28) TC Channel Interrupt Disable Register -------- +// -------- TC_IMR : (TC Offset: 0x2c) TC Channel Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Timer Counter Interface +// ***************************************************************************** +// *** Register offset in AT91S_TCB structure *** +#define TCB_TC0 ( 0) // TC Channel 0 +#define TCB_TC1 (64) // TC Channel 1 +#define TCB_TC2 (128) // TC Channel 2 +#define TCB_BCR (192) // TC Block Control Register +#define TCB_BMR (196) // TC Block Mode Register +// -------- TCB_BCR : (TCB Offset: 0xc0) TC Block Control Register -------- +#define AT91C_TCB_SYNC (0x1 << 0) // (TCB) Synchro Command +// -------- TCB_BMR : (TCB Offset: 0xc4) TC Block Mode Register -------- +#define AT91C_TCB_TC0XC0S (0x3 << 0) // (TCB) External Clock Signal 0 Selection +#define AT91C_TCB_TC0XC0S_TCLK0 (0x0) // (TCB) TCLK0 connected to XC0 +#define AT91C_TCB_TC0XC0S_NONE (0x1) // (TCB) None signal connected to XC0 +#define AT91C_TCB_TC0XC0S_TIOA1 (0x2) // (TCB) TIOA1 connected to XC0 +#define AT91C_TCB_TC0XC0S_TIOA2 (0x3) // (TCB) TIOA2 connected to XC0 +#define AT91C_TCB_TC1XC1S (0x3 << 2) // (TCB) External Clock Signal 1 Selection +#define AT91C_TCB_TC1XC1S_TCLK1 (0x0 << 2) // (TCB) TCLK1 connected to XC1 +#define AT91C_TCB_TC1XC1S_NONE (0x1 << 2) // (TCB) None signal connected to XC1 +#define AT91C_TCB_TC1XC1S_TIOA0 (0x2 << 2) // (TCB) TIOA0 connected to XC1 +#define AT91C_TCB_TC1XC1S_TIOA2 (0x3 << 2) // (TCB) TIOA2 connected to XC1 +#define AT91C_TCB_TC2XC2S (0x3 << 4) // (TCB) External Clock Signal 2 Selection +#define AT91C_TCB_TC2XC2S_TCLK2 (0x0 << 4) // (TCB) TCLK2 connected to XC2 +#define AT91C_TCB_TC2XC2S_NONE (0x1 << 4) // (TCB) None signal connected to XC2 +#define AT91C_TCB_TC2XC2S_TIOA0 (0x2 << 4) // (TCB) TIOA0 connected to XC2 +#define AT91C_TCB_TC2XC2S_TIOA1 (0x3 << 4) // (TCB) TIOA2 connected to XC2 + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Control Area Network MailBox Interface +// ***************************************************************************** +// *** Register offset in AT91S_CAN_MB structure *** +#define CAN_MB_MMR ( 0) // MailBox Mode Register +#define CAN_MB_MAM ( 4) // MailBox Acceptance Mask Register +#define CAN_MB_MID ( 8) // MailBox ID Register +#define CAN_MB_MFID (12) // MailBox Family ID Register +#define CAN_MB_MSR (16) // MailBox Status Register +#define CAN_MB_MDL (20) // MailBox Data Low Register +#define CAN_MB_MDH (24) // MailBox Data High Register +#define CAN_MB_MCR (28) // MailBox Control Register +// -------- CAN_MMR : (CAN_MB Offset: 0x0) CAN Message Mode Register -------- +#define AT91C_CAN_MTIMEMARK (0xFFFF << 0) // (CAN_MB) Mailbox Timemark +#define AT91C_CAN_PRIOR (0xF << 16) // (CAN_MB) Mailbox Priority +#define AT91C_CAN_MOT (0x7 << 24) // (CAN_MB) Mailbox Object Type +#define AT91C_CAN_MOT_DIS (0x0 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_RX (0x1 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_RXOVERWRITE (0x2 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_TX (0x3 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_CONSUMER (0x4 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_PRODUCER (0x5 << 24) // (CAN_MB) +// -------- CAN_MAM : (CAN_MB Offset: 0x4) CAN Message Acceptance Mask Register -------- +#define AT91C_CAN_MIDvB (0x3FFFF << 0) // (CAN_MB) Complementary bits for identifier in extended mode +#define AT91C_CAN_MIDvA (0x7FF << 18) // (CAN_MB) Identifier for standard frame mode +#define AT91C_CAN_MIDE (0x1 << 29) // (CAN_MB) Identifier Version +// -------- CAN_MID : (CAN_MB Offset: 0x8) CAN Message ID Register -------- +// -------- CAN_MFID : (CAN_MB Offset: 0xc) CAN Message Family ID Register -------- +// -------- CAN_MSR : (CAN_MB Offset: 0x10) CAN Message Status Register -------- +#define AT91C_CAN_MTIMESTAMP (0xFFFF << 0) // (CAN_MB) Timer Value +#define AT91C_CAN_MDLC (0xF << 16) // (CAN_MB) Mailbox Data Length Code +#define AT91C_CAN_MRTR (0x1 << 20) // (CAN_MB) Mailbox Remote Transmission Request +#define AT91C_CAN_MABT (0x1 << 22) // (CAN_MB) Mailbox Message Abort +#define AT91C_CAN_MRDY (0x1 << 23) // (CAN_MB) Mailbox Ready +#define AT91C_CAN_MMI (0x1 << 24) // (CAN_MB) Mailbox Message Ignored +// -------- CAN_MDL : (CAN_MB Offset: 0x14) CAN Message Data Low Register -------- +// -------- CAN_MDH : (CAN_MB Offset: 0x18) CAN Message Data High Register -------- +// -------- CAN_MCR : (CAN_MB Offset: 0x1c) CAN Message Control Register -------- +#define AT91C_CAN_MACR (0x1 << 22) // (CAN_MB) Abort Request for Mailbox +#define AT91C_CAN_MTCR (0x1 << 23) // (CAN_MB) Mailbox Transfer Command + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Control Area Network Interface +// ***************************************************************************** +// *** Register offset in AT91S_CAN structure *** +#define CAN_MR ( 0) // Mode Register +#define CAN_IER ( 4) // Interrupt Enable Register +#define CAN_IDR ( 8) // Interrupt Disable Register +#define CAN_IMR (12) // Interrupt Mask Register +#define CAN_SR (16) // Status Register +#define CAN_BR (20) // Baudrate Register +#define CAN_TIM (24) // Timer Register +#define CAN_TIMESTP (28) // Time Stamp Register +#define CAN_ECR (32) // Error Counter Register +#define CAN_TCR (36) // Transfer Command Register +#define CAN_ACR (40) // Abort Command Register +#define CAN_VR (252) // Version Register +#define CAN_MB0 (512) // CAN Mailbox 0 +#define CAN_MB1 (544) // CAN Mailbox 1 +#define CAN_MB2 (576) // CAN Mailbox 2 +#define CAN_MB3 (608) // CAN Mailbox 3 +#define CAN_MB4 (640) // CAN Mailbox 4 +#define CAN_MB5 (672) // CAN Mailbox 5 +#define CAN_MB6 (704) // CAN Mailbox 6 +#define CAN_MB7 (736) // CAN Mailbox 7 +#define CAN_MB8 (768) // CAN Mailbox 8 +#define CAN_MB9 (800) // CAN Mailbox 9 +#define CAN_MB10 (832) // CAN Mailbox 10 +#define CAN_MB11 (864) // CAN Mailbox 11 +#define CAN_MB12 (896) // CAN Mailbox 12 +#define CAN_MB13 (928) // CAN Mailbox 13 +#define CAN_MB14 (960) // CAN Mailbox 14 +#define CAN_MB15 (992) // CAN Mailbox 15 +// -------- CAN_MR : (CAN Offset: 0x0) CAN Mode Register -------- +#define AT91C_CAN_CANEN (0x1 << 0) // (CAN) CAN Controller Enable +#define AT91C_CAN_LPM (0x1 << 1) // (CAN) Disable/Enable Low Power Mode +#define AT91C_CAN_ABM (0x1 << 2) // (CAN) Disable/Enable Autobaud/Listen Mode +#define AT91C_CAN_OVL (0x1 << 3) // (CAN) Disable/Enable Overload Frame +#define AT91C_CAN_TEOF (0x1 << 4) // (CAN) Time Stamp messages at each end of Frame +#define AT91C_CAN_TTM (0x1 << 5) // (CAN) Disable/Enable Time Trigger Mode +#define AT91C_CAN_TIMFRZ (0x1 << 6) // (CAN) Enable Timer Freeze +#define AT91C_CAN_DRPT (0x1 << 7) // (CAN) Disable Repeat +// -------- CAN_IER : (CAN Offset: 0x4) CAN Interrupt Enable Register -------- +#define AT91C_CAN_MB0 (0x1 << 0) // (CAN) Mailbox 0 Flag +#define AT91C_CAN_MB1 (0x1 << 1) // (CAN) Mailbox 1 Flag +#define AT91C_CAN_MB2 (0x1 << 2) // (CAN) Mailbox 2 Flag +#define AT91C_CAN_MB3 (0x1 << 3) // (CAN) Mailbox 3 Flag +#define AT91C_CAN_MB4 (0x1 << 4) // (CAN) Mailbox 4 Flag +#define AT91C_CAN_MB5 (0x1 << 5) // (CAN) Mailbox 5 Flag +#define AT91C_CAN_MB6 (0x1 << 6) // (CAN) Mailbox 6 Flag +#define AT91C_CAN_MB7 (0x1 << 7) // (CAN) Mailbox 7 Flag +#define AT91C_CAN_MB8 (0x1 << 8) // (CAN) Mailbox 8 Flag +#define AT91C_CAN_MB9 (0x1 << 9) // (CAN) Mailbox 9 Flag +#define AT91C_CAN_MB10 (0x1 << 10) // (CAN) Mailbox 10 Flag +#define AT91C_CAN_MB11 (0x1 << 11) // (CAN) Mailbox 11 Flag +#define AT91C_CAN_MB12 (0x1 << 12) // (CAN) Mailbox 12 Flag +#define AT91C_CAN_MB13 (0x1 << 13) // (CAN) Mailbox 13 Flag +#define AT91C_CAN_MB14 (0x1 << 14) // (CAN) Mailbox 14 Flag +#define AT91C_CAN_MB15 (0x1 << 15) // (CAN) Mailbox 15 Flag +#define AT91C_CAN_ERRA (0x1 << 16) // (CAN) Error Active Mode Flag +#define AT91C_CAN_WARN (0x1 << 17) // (CAN) Warning Limit Flag +#define AT91C_CAN_ERRP (0x1 << 18) // (CAN) Error Passive Mode Flag +#define AT91C_CAN_BOFF (0x1 << 19) // (CAN) Bus Off Mode Flag +#define AT91C_CAN_SLEEP (0x1 << 20) // (CAN) Sleep Flag +#define AT91C_CAN_WAKEUP (0x1 << 21) // (CAN) Wakeup Flag +#define AT91C_CAN_TOVF (0x1 << 22) // (CAN) Timer Overflow Flag +#define AT91C_CAN_TSTP (0x1 << 23) // (CAN) Timestamp Flag +#define AT91C_CAN_CERR (0x1 << 24) // (CAN) CRC Error +#define AT91C_CAN_SERR (0x1 << 25) // (CAN) Stuffing Error +#define AT91C_CAN_AERR (0x1 << 26) // (CAN) Acknowledgment Error +#define AT91C_CAN_FERR (0x1 << 27) // (CAN) Form Error +#define AT91C_CAN_BERR (0x1 << 28) // (CAN) Bit Error +// -------- CAN_IDR : (CAN Offset: 0x8) CAN Interrupt Disable Register -------- +// -------- CAN_IMR : (CAN Offset: 0xc) CAN Interrupt Mask Register -------- +// -------- CAN_SR : (CAN Offset: 0x10) CAN Status Register -------- +#define AT91C_CAN_RBSY (0x1 << 29) // (CAN) Receiver Busy +#define AT91C_CAN_TBSY (0x1 << 30) // (CAN) Transmitter Busy +#define AT91C_CAN_OVLY (0x1 << 31) // (CAN) Overload Busy +// -------- CAN_BR : (CAN Offset: 0x14) CAN Baudrate Register -------- +#define AT91C_CAN_PHASE2 (0x7 << 0) // (CAN) Phase 2 segment +#define AT91C_CAN_PHASE1 (0x7 << 4) // (CAN) Phase 1 segment +#define AT91C_CAN_PROPAG (0x7 << 8) // (CAN) Programmation time segment +#define AT91C_CAN_SYNC (0x3 << 12) // (CAN) Re-synchronization jump width segment +#define AT91C_CAN_BRP (0x7F << 16) // (CAN) Baudrate Prescaler +#define AT91C_CAN_SMP (0x1 << 24) // (CAN) Sampling mode +// -------- CAN_TIM : (CAN Offset: 0x18) CAN Timer Register -------- +#define AT91C_CAN_TIMER (0xFFFF << 0) // (CAN) Timer field +// -------- CAN_TIMESTP : (CAN Offset: 0x1c) CAN Timestamp Register -------- +// -------- CAN_ECR : (CAN Offset: 0x20) CAN Error Counter Register -------- +#define AT91C_CAN_REC (0xFF << 0) // (CAN) Receive Error Counter +#define AT91C_CAN_TEC (0xFF << 16) // (CAN) Transmit Error Counter +// -------- CAN_TCR : (CAN Offset: 0x24) CAN Transfer Command Register -------- +#define AT91C_CAN_TIMRST (0x1 << 31) // (CAN) Timer Reset Field +// -------- CAN_ACR : (CAN Offset: 0x28) CAN Abort Command Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Ethernet MAC 10/100 +// ***************************************************************************** +// *** Register offset in AT91S_EMAC structure *** +#define EMAC_NCR ( 0) // Network Control Register +#define EMAC_NCFGR ( 4) // Network Configuration Register +#define EMAC_NSR ( 8) // Network Status Register +#define EMAC_TSR (20) // Transmit Status Register +#define EMAC_RBQP (24) // Receive Buffer Queue Pointer +#define EMAC_TBQP (28) // Transmit Buffer Queue Pointer +#define EMAC_RSR (32) // Receive Status Register +#define EMAC_ISR (36) // Interrupt Status Register +#define EMAC_IER (40) // Interrupt Enable Register +#define EMAC_IDR (44) // Interrupt Disable Register +#define EMAC_IMR (48) // Interrupt Mask Register +#define EMAC_MAN (52) // PHY Maintenance Register +#define EMAC_PTR (56) // Pause Time Register +#define EMAC_PFR (60) // Pause Frames received Register +#define EMAC_FTO (64) // Frames Transmitted OK Register +#define EMAC_SCF (68) // Single Collision Frame Register +#define EMAC_MCF (72) // Multiple Collision Frame Register +#define EMAC_FRO (76) // Frames Received OK Register +#define EMAC_FCSE (80) // Frame Check Sequence Error Register +#define EMAC_ALE (84) // Alignment Error Register +#define EMAC_DTF (88) // Deferred Transmission Frame Register +#define EMAC_LCOL (92) // Late Collision Register +#define EMAC_ECOL (96) // Excessive Collision Register +#define EMAC_TUND (100) // Transmit Underrun Error Register +#define EMAC_CSE (104) // Carrier Sense Error Register +#define EMAC_RRE (108) // Receive Ressource Error Register +#define EMAC_ROV (112) // Receive Overrun Errors Register +#define EMAC_RSE (116) // Receive Symbol Errors Register +#define EMAC_ELE (120) // Excessive Length Errors Register +#define EMAC_RJA (124) // Receive Jabbers Register +#define EMAC_USF (128) // Undersize Frames Register +#define EMAC_STE (132) // SQE Test Error Register +#define EMAC_RLE (136) // Receive Length Field Mismatch Register +#define EMAC_TPF (140) // Transmitted Pause Frames Register +#define EMAC_HRB (144) // Hash Address Bottom[31:0] +#define EMAC_HRT (148) // Hash Address Top[63:32] +#define EMAC_SA1L (152) // Specific Address 1 Bottom, First 4 bytes +#define EMAC_SA1H (156) // Specific Address 1 Top, Last 2 bytes +#define EMAC_SA2L (160) // Specific Address 2 Bottom, First 4 bytes +#define EMAC_SA2H (164) // Specific Address 2 Top, Last 2 bytes +#define EMAC_SA3L (168) // Specific Address 3 Bottom, First 4 bytes +#define EMAC_SA3H (172) // Specific Address 3 Top, Last 2 bytes +#define EMAC_SA4L (176) // Specific Address 4 Bottom, First 4 bytes +#define EMAC_SA4H (180) // Specific Address 4 Top, Last 2 bytes +#define EMAC_TID (184) // Type ID Checking Register +#define EMAC_TPQ (188) // Transmit Pause Quantum Register +#define EMAC_USRIO (192) // USER Input/Output Register +#define EMAC_WOL (196) // Wake On LAN Register +#define EMAC_REV (252) // Revision Register +// -------- EMAC_NCR : (EMAC Offset: 0x0) -------- +#define AT91C_EMAC_LB (0x1 << 0) // (EMAC) Loopback. Optional. When set, loopback signal is at high level. +#define AT91C_EMAC_LLB (0x1 << 1) // (EMAC) Loopback local. +#define AT91C_EMAC_RE (0x1 << 2) // (EMAC) Receive enable. +#define AT91C_EMAC_TE (0x1 << 3) // (EMAC) Transmit enable. +#define AT91C_EMAC_MPE (0x1 << 4) // (EMAC) Management port enable. +#define AT91C_EMAC_CLRSTAT (0x1 << 5) // (EMAC) Clear statistics registers. +#define AT91C_EMAC_INCSTAT (0x1 << 6) // (EMAC) Increment statistics registers. +#define AT91C_EMAC_WESTAT (0x1 << 7) // (EMAC) Write enable for statistics registers. +#define AT91C_EMAC_BP (0x1 << 8) // (EMAC) Back pressure. +#define AT91C_EMAC_TSTART (0x1 << 9) // (EMAC) Start Transmission. +#define AT91C_EMAC_THALT (0x1 << 10) // (EMAC) Transmission Halt. +#define AT91C_EMAC_TPFR (0x1 << 11) // (EMAC) Transmit pause frame +#define AT91C_EMAC_TZQ (0x1 << 12) // (EMAC) Transmit zero quantum pause frame +// -------- EMAC_NCFGR : (EMAC Offset: 0x4) Network Configuration Register -------- +#define AT91C_EMAC_SPD (0x1 << 0) // (EMAC) Speed. +#define AT91C_EMAC_FD (0x1 << 1) // (EMAC) Full duplex. +#define AT91C_EMAC_JFRAME (0x1 << 3) // (EMAC) Jumbo Frames. +#define AT91C_EMAC_CAF (0x1 << 4) // (EMAC) Copy all frames. +#define AT91C_EMAC_NBC (0x1 << 5) // (EMAC) No broadcast. +#define AT91C_EMAC_MTI (0x1 << 6) // (EMAC) Multicast hash event enable +#define AT91C_EMAC_UNI (0x1 << 7) // (EMAC) Unicast hash enable. +#define AT91C_EMAC_BIG (0x1 << 8) // (EMAC) Receive 1522 bytes. +#define AT91C_EMAC_EAE (0x1 << 9) // (EMAC) External address match enable. +#define AT91C_EMAC_CLK (0x3 << 10) // (EMAC) +#define AT91C_EMAC_CLK_HCLK_8 (0x0 << 10) // (EMAC) HCLK divided by 8 +#define AT91C_EMAC_CLK_HCLK_16 (0x1 << 10) // (EMAC) HCLK divided by 16 +#define AT91C_EMAC_CLK_HCLK_32 (0x2 << 10) // (EMAC) HCLK divided by 32 +#define AT91C_EMAC_CLK_HCLK_64 (0x3 << 10) // (EMAC) HCLK divided by 64 +#define AT91C_EMAC_RTY (0x1 << 12) // (EMAC) +#define AT91C_EMAC_PAE (0x1 << 13) // (EMAC) +#define AT91C_EMAC_RBOF (0x3 << 14) // (EMAC) +#define AT91C_EMAC_RBOF_OFFSET_0 (0x0 << 14) // (EMAC) no offset from start of receive buffer +#define AT91C_EMAC_RBOF_OFFSET_1 (0x1 << 14) // (EMAC) one byte offset from start of receive buffer +#define AT91C_EMAC_RBOF_OFFSET_2 (0x2 << 14) // (EMAC) two bytes offset from start of receive buffer +#define AT91C_EMAC_RBOF_OFFSET_3 (0x3 << 14) // (EMAC) three bytes offset from start of receive buffer +#define AT91C_EMAC_RLCE (0x1 << 16) // (EMAC) Receive Length field Checking Enable +#define AT91C_EMAC_DRFCS (0x1 << 17) // (EMAC) Discard Receive FCS +#define AT91C_EMAC_EFRHD (0x1 << 18) // (EMAC) +#define AT91C_EMAC_IRXFCS (0x1 << 19) // (EMAC) Ignore RX FCS +// -------- EMAC_NSR : (EMAC Offset: 0x8) Network Status Register -------- +#define AT91C_EMAC_LINKR (0x1 << 0) // (EMAC) +#define AT91C_EMAC_MDIO (0x1 << 1) // (EMAC) +#define AT91C_EMAC_IDLE (0x1 << 2) // (EMAC) +// -------- EMAC_TSR : (EMAC Offset: 0x14) Transmit Status Register -------- +#define AT91C_EMAC_UBR (0x1 << 0) // (EMAC) +#define AT91C_EMAC_COL (0x1 << 1) // (EMAC) +#define AT91C_EMAC_RLES (0x1 << 2) // (EMAC) +#define AT91C_EMAC_TGO (0x1 << 3) // (EMAC) Transmit Go +#define AT91C_EMAC_BEX (0x1 << 4) // (EMAC) Buffers exhausted mid frame +#define AT91C_EMAC_COMP (0x1 << 5) // (EMAC) +#define AT91C_EMAC_UND (0x1 << 6) // (EMAC) +// -------- EMAC_RSR : (EMAC Offset: 0x20) Receive Status Register -------- +#define AT91C_EMAC_BNA (0x1 << 0) // (EMAC) +#define AT91C_EMAC_REC (0x1 << 1) // (EMAC) +#define AT91C_EMAC_OVR (0x1 << 2) // (EMAC) +// -------- EMAC_ISR : (EMAC Offset: 0x24) Interrupt Status Register -------- +#define AT91C_EMAC_MFD (0x1 << 0) // (EMAC) +#define AT91C_EMAC_RCOMP (0x1 << 1) // (EMAC) +#define AT91C_EMAC_RXUBR (0x1 << 2) // (EMAC) +#define AT91C_EMAC_TXUBR (0x1 << 3) // (EMAC) +#define AT91C_EMAC_TUNDR (0x1 << 4) // (EMAC) +#define AT91C_EMAC_RLEX (0x1 << 5) // (EMAC) +#define AT91C_EMAC_TXERR (0x1 << 6) // (EMAC) +#define AT91C_EMAC_TCOMP (0x1 << 7) // (EMAC) +#define AT91C_EMAC_LINK (0x1 << 9) // (EMAC) +#define AT91C_EMAC_ROVR (0x1 << 10) // (EMAC) +#define AT91C_EMAC_HRESP (0x1 << 11) // (EMAC) +#define AT91C_EMAC_PFRE (0x1 << 12) // (EMAC) +#define AT91C_EMAC_PTZ (0x1 << 13) // (EMAC) +// -------- EMAC_IER : (EMAC Offset: 0x28) Interrupt Enable Register -------- +// -------- EMAC_IDR : (EMAC Offset: 0x2c) Interrupt Disable Register -------- +// -------- EMAC_IMR : (EMAC Offset: 0x30) Interrupt Mask Register -------- +// -------- EMAC_MAN : (EMAC Offset: 0x34) PHY Maintenance Register -------- +#define AT91C_EMAC_DATA (0xFFFF << 0) // (EMAC) +#define AT91C_EMAC_CODE (0x3 << 16) // (EMAC) +#define AT91C_EMAC_REGA (0x1F << 18) // (EMAC) +#define AT91C_EMAC_PHYA (0x1F << 23) // (EMAC) +#define AT91C_EMAC_RW (0x3 << 28) // (EMAC) +#define AT91C_EMAC_SOF (0x3 << 30) // (EMAC) +// -------- EMAC_USRIO : (EMAC Offset: 0xc0) USER Input Output Register -------- +#define AT91C_EMAC_RMII (0x1 << 0) // (EMAC) Reduce MII +// -------- EMAC_WOL : (EMAC Offset: 0xc4) Wake On LAN Register -------- +#define AT91C_EMAC_IP (0xFFFF << 0) // (EMAC) ARP request IP address +#define AT91C_EMAC_MAG (0x1 << 16) // (EMAC) Magic packet event enable +#define AT91C_EMAC_ARP (0x1 << 17) // (EMAC) ARP request event enable +#define AT91C_EMAC_SA1 (0x1 << 18) // (EMAC) Specific address register 1 event enable +// -------- EMAC_REV : (EMAC Offset: 0xfc) Revision Register -------- +#define AT91C_EMAC_REVREF (0xFFFF << 0) // (EMAC) +#define AT91C_EMAC_PARTREF (0xFFFF << 16) // (EMAC) + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Analog to Digital Convertor +// ***************************************************************************** +// *** Register offset in AT91S_ADC structure *** +#define ADC_CR ( 0) // ADC Control Register +#define ADC_MR ( 4) // ADC Mode Register +#define ADC_CHER (16) // ADC Channel Enable Register +#define ADC_CHDR (20) // ADC Channel Disable Register +#define ADC_CHSR (24) // ADC Channel Status Register +#define ADC_SR (28) // ADC Status Register +#define ADC_LCDR (32) // ADC Last Converted Data Register +#define ADC_IER (36) // ADC Interrupt Enable Register +#define ADC_IDR (40) // ADC Interrupt Disable Register +#define ADC_IMR (44) // ADC Interrupt Mask Register +#define ADC_CDR0 (48) // ADC Channel Data Register 0 +#define ADC_CDR1 (52) // ADC Channel Data Register 1 +#define ADC_CDR2 (56) // ADC Channel Data Register 2 +#define ADC_CDR3 (60) // ADC Channel Data Register 3 +#define ADC_CDR4 (64) // ADC Channel Data Register 4 +#define ADC_CDR5 (68) // ADC Channel Data Register 5 +#define ADC_CDR6 (72) // ADC Channel Data Register 6 +#define ADC_CDR7 (76) // ADC Channel Data Register 7 +#define ADC_RPR (256) // Receive Pointer Register +#define ADC_RCR (260) // Receive Counter Register +#define ADC_TPR (264) // Transmit Pointer Register +#define ADC_TCR (268) // Transmit Counter Register +#define ADC_RNPR (272) // Receive Next Pointer Register +#define ADC_RNCR (276) // Receive Next Counter Register +#define ADC_TNPR (280) // Transmit Next Pointer Register +#define ADC_TNCR (284) // Transmit Next Counter Register +#define ADC_PTCR (288) // PDC Transfer Control Register +#define ADC_PTSR (292) // PDC Transfer Status Register +// -------- ADC_CR : (ADC Offset: 0x0) ADC Control Register -------- +#define AT91C_ADC_SWRST (0x1 << 0) // (ADC) Software Reset +#define AT91C_ADC_START (0x1 << 1) // (ADC) Start Conversion +// -------- ADC_MR : (ADC Offset: 0x4) ADC Mode Register -------- +#define AT91C_ADC_TRGEN (0x1 << 0) // (ADC) Trigger Enable +#define AT91C_ADC_TRGEN_DIS (0x0) // (ADC) Hradware triggers are disabled. Starting a conversion is only possible by software +#define AT91C_ADC_TRGEN_EN (0x1) // (ADC) Hardware trigger selected by TRGSEL field is enabled. +#define AT91C_ADC_TRGSEL (0x7 << 1) // (ADC) Trigger Selection +#define AT91C_ADC_TRGSEL_TIOA0 (0x0 << 1) // (ADC) Selected TRGSEL = TIAO0 +#define AT91C_ADC_TRGSEL_TIOA1 (0x1 << 1) // (ADC) Selected TRGSEL = TIAO1 +#define AT91C_ADC_TRGSEL_TIOA2 (0x2 << 1) // (ADC) Selected TRGSEL = TIAO2 +#define AT91C_ADC_TRGSEL_TIOA3 (0x3 << 1) // (ADC) Selected TRGSEL = TIAO3 +#define AT91C_ADC_TRGSEL_TIOA4 (0x4 << 1) // (ADC) Selected TRGSEL = TIAO4 +#define AT91C_ADC_TRGSEL_TIOA5 (0x5 << 1) // (ADC) Selected TRGSEL = TIAO5 +#define AT91C_ADC_TRGSEL_EXT (0x6 << 1) // (ADC) Selected TRGSEL = External Trigger +#define AT91C_ADC_LOWRES (0x1 << 4) // (ADC) Resolution. +#define AT91C_ADC_LOWRES_10_BIT (0x0 << 4) // (ADC) 10-bit resolution +#define AT91C_ADC_LOWRES_8_BIT (0x1 << 4) // (ADC) 8-bit resolution +#define AT91C_ADC_SLEEP (0x1 << 5) // (ADC) Sleep Mode +#define AT91C_ADC_SLEEP_NORMAL_MODE (0x0 << 5) // (ADC) Normal Mode +#define AT91C_ADC_SLEEP_MODE (0x1 << 5) // (ADC) Sleep Mode +#define AT91C_ADC_PRESCAL (0x3F << 8) // (ADC) Prescaler rate selection +#define AT91C_ADC_STARTUP (0x1F << 16) // (ADC) Startup Time +#define AT91C_ADC_SHTIM (0xF << 24) // (ADC) Sample & Hold Time +// -------- ADC_CHER : (ADC Offset: 0x10) ADC Channel Enable Register -------- +#define AT91C_ADC_CH0 (0x1 << 0) // (ADC) Channel 0 +#define AT91C_ADC_CH1 (0x1 << 1) // (ADC) Channel 1 +#define AT91C_ADC_CH2 (0x1 << 2) // (ADC) Channel 2 +#define AT91C_ADC_CH3 (0x1 << 3) // (ADC) Channel 3 +#define AT91C_ADC_CH4 (0x1 << 4) // (ADC) Channel 4 +#define AT91C_ADC_CH5 (0x1 << 5) // (ADC) Channel 5 +#define AT91C_ADC_CH6 (0x1 << 6) // (ADC) Channel 6 +#define AT91C_ADC_CH7 (0x1 << 7) // (ADC) Channel 7 +// -------- ADC_CHDR : (ADC Offset: 0x14) ADC Channel Disable Register -------- +// -------- ADC_CHSR : (ADC Offset: 0x18) ADC Channel Status Register -------- +// -------- ADC_SR : (ADC Offset: 0x1c) ADC Status Register -------- +#define AT91C_ADC_EOC0 (0x1 << 0) // (ADC) End of Conversion +#define AT91C_ADC_EOC1 (0x1 << 1) // (ADC) End of Conversion +#define AT91C_ADC_EOC2 (0x1 << 2) // (ADC) End of Conversion +#define AT91C_ADC_EOC3 (0x1 << 3) // (ADC) End of Conversion +#define AT91C_ADC_EOC4 (0x1 << 4) // (ADC) End of Conversion +#define AT91C_ADC_EOC5 (0x1 << 5) // (ADC) End of Conversion +#define AT91C_ADC_EOC6 (0x1 << 6) // (ADC) End of Conversion +#define AT91C_ADC_EOC7 (0x1 << 7) // (ADC) End of Conversion +#define AT91C_ADC_OVRE0 (0x1 << 8) // (ADC) Overrun Error +#define AT91C_ADC_OVRE1 (0x1 << 9) // (ADC) Overrun Error +#define AT91C_ADC_OVRE2 (0x1 << 10) // (ADC) Overrun Error +#define AT91C_ADC_OVRE3 (0x1 << 11) // (ADC) Overrun Error +#define AT91C_ADC_OVRE4 (0x1 << 12) // (ADC) Overrun Error +#define AT91C_ADC_OVRE5 (0x1 << 13) // (ADC) Overrun Error +#define AT91C_ADC_OVRE6 (0x1 << 14) // (ADC) Overrun Error +#define AT91C_ADC_OVRE7 (0x1 << 15) // (ADC) Overrun Error +#define AT91C_ADC_DRDY (0x1 << 16) // (ADC) Data Ready +#define AT91C_ADC_GOVRE (0x1 << 17) // (ADC) General Overrun +#define AT91C_ADC_ENDRX (0x1 << 18) // (ADC) End of Receiver Transfer +#define AT91C_ADC_RXBUFF (0x1 << 19) // (ADC) RXBUFF Interrupt +// -------- ADC_LCDR : (ADC Offset: 0x20) ADC Last Converted Data Register -------- +#define AT91C_ADC_LDATA (0x3FF << 0) // (ADC) Last Data Converted +// -------- ADC_IER : (ADC Offset: 0x24) ADC Interrupt Enable Register -------- +// -------- ADC_IDR : (ADC Offset: 0x28) ADC Interrupt Disable Register -------- +// -------- ADC_IMR : (ADC Offset: 0x2c) ADC Interrupt Mask Register -------- +// -------- ADC_CDR0 : (ADC Offset: 0x30) ADC Channel Data Register 0 -------- +#define AT91C_ADC_DATA (0x3FF << 0) // (ADC) Converted Data +// -------- ADC_CDR1 : (ADC Offset: 0x34) ADC Channel Data Register 1 -------- +// -------- ADC_CDR2 : (ADC Offset: 0x38) ADC Channel Data Register 2 -------- +// -------- ADC_CDR3 : (ADC Offset: 0x3c) ADC Channel Data Register 3 -------- +// -------- ADC_CDR4 : (ADC Offset: 0x40) ADC Channel Data Register 4 -------- +// -------- ADC_CDR5 : (ADC Offset: 0x44) ADC Channel Data Register 5 -------- +// -------- ADC_CDR6 : (ADC Offset: 0x48) ADC Channel Data Register 6 -------- +// -------- ADC_CDR7 : (ADC Offset: 0x4c) ADC Channel Data Register 7 -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Advanced Encryption Standard +// ***************************************************************************** +// *** Register offset in AT91S_AES structure *** +#define AES_CR ( 0) // Control Register +#define AES_MR ( 4) // Mode Register +#define AES_IER (16) // Interrupt Enable Register +#define AES_IDR (20) // Interrupt Disable Register +#define AES_IMR (24) // Interrupt Mask Register +#define AES_ISR (28) // Interrupt Status Register +#define AES_KEYWxR (32) // Key Word x Register +#define AES_IDATAxR (64) // Input Data x Register +#define AES_ODATAxR (80) // Output Data x Register +#define AES_IVxR (96) // Initialization Vector x Register +#define AES_VR (252) // AES Version Register +#define AES_RPR (256) // Receive Pointer Register +#define AES_RCR (260) // Receive Counter Register +#define AES_TPR (264) // Transmit Pointer Register +#define AES_TCR (268) // Transmit Counter Register +#define AES_RNPR (272) // Receive Next Pointer Register +#define AES_RNCR (276) // Receive Next Counter Register +#define AES_TNPR (280) // Transmit Next Pointer Register +#define AES_TNCR (284) // Transmit Next Counter Register +#define AES_PTCR (288) // PDC Transfer Control Register +#define AES_PTSR (292) // PDC Transfer Status Register +// -------- AES_CR : (AES Offset: 0x0) Control Register -------- +#define AT91C_AES_START (0x1 << 0) // (AES) Starts Processing +#define AT91C_AES_SWRST (0x1 << 8) // (AES) Software Reset +#define AT91C_AES_LOADSEED (0x1 << 16) // (AES) Random Number Generator Seed Loading +// -------- AES_MR : (AES Offset: 0x4) Mode Register -------- +#define AT91C_AES_CIPHER (0x1 << 0) // (AES) Processing Mode +#define AT91C_AES_PROCDLY (0xF << 4) // (AES) Processing Delay +#define AT91C_AES_SMOD (0x3 << 8) // (AES) Start Mode +#define AT91C_AES_SMOD_MANUAL (0x0 << 8) // (AES) Manual Mode: The START bit in register AES_CR must be set to begin encryption or decryption. +#define AT91C_AES_SMOD_AUTO (0x1 << 8) // (AES) Auto Mode: no action in AES_CR is necessary (cf datasheet). +#define AT91C_AES_SMOD_PDC (0x2 << 8) // (AES) PDC Mode (cf datasheet). +#define AT91C_AES_OPMOD (0x7 << 12) // (AES) Operation Mode +#define AT91C_AES_OPMOD_ECB (0x0 << 12) // (AES) ECB Electronic CodeBook mode. +#define AT91C_AES_OPMOD_CBC (0x1 << 12) // (AES) CBC Cipher Block Chaining mode. +#define AT91C_AES_OPMOD_OFB (0x2 << 12) // (AES) OFB Output Feedback mode. +#define AT91C_AES_OPMOD_CFB (0x3 << 12) // (AES) CFB Cipher Feedback mode. +#define AT91C_AES_OPMOD_CTR (0x4 << 12) // (AES) CTR Counter mode. +#define AT91C_AES_LOD (0x1 << 15) // (AES) Last Output Data Mode +#define AT91C_AES_CFBS (0x7 << 16) // (AES) Cipher Feedback Data Size +#define AT91C_AES_CFBS_128_BIT (0x0 << 16) // (AES) 128-bit. +#define AT91C_AES_CFBS_64_BIT (0x1 << 16) // (AES) 64-bit. +#define AT91C_AES_CFBS_32_BIT (0x2 << 16) // (AES) 32-bit. +#define AT91C_AES_CFBS_16_BIT (0x3 << 16) // (AES) 16-bit. +#define AT91C_AES_CFBS_8_BIT (0x4 << 16) // (AES) 8-bit. +#define AT91C_AES_CKEY (0xF << 20) // (AES) Countermeasure Key +#define AT91C_AES_CTYPE (0x1F << 24) // (AES) Countermeasure Type +#define AT91C_AES_CTYPE_TYPE1_EN (0x1 << 24) // (AES) Countermeasure type 1 is enabled. +#define AT91C_AES_CTYPE_TYPE2_EN (0x2 << 24) // (AES) Countermeasure type 2 is enabled. +#define AT91C_AES_CTYPE_TYPE3_EN (0x4 << 24) // (AES) Countermeasure type 3 is enabled. +#define AT91C_AES_CTYPE_TYPE4_EN (0x8 << 24) // (AES) Countermeasure type 4 is enabled. +#define AT91C_AES_CTYPE_TYPE5_EN (0x10 << 24) // (AES) Countermeasure type 5 is enabled. +// -------- AES_IER : (AES Offset: 0x10) Interrupt Enable Register -------- +#define AT91C_AES_DATRDY (0x1 << 0) // (AES) DATRDY +#define AT91C_AES_ENDRX (0x1 << 1) // (AES) PDC Read Buffer End +#define AT91C_AES_ENDTX (0x1 << 2) // (AES) PDC Write Buffer End +#define AT91C_AES_RXBUFF (0x1 << 3) // (AES) PDC Read Buffer Full +#define AT91C_AES_TXBUFE (0x1 << 4) // (AES) PDC Write Buffer Empty +#define AT91C_AES_URAD (0x1 << 8) // (AES) Unspecified Register Access Detection +// -------- AES_IDR : (AES Offset: 0x14) Interrupt Disable Register -------- +// -------- AES_IMR : (AES Offset: 0x18) Interrupt Mask Register -------- +// -------- AES_ISR : (AES Offset: 0x1c) Interrupt Status Register -------- +#define AT91C_AES_URAT (0x7 << 12) // (AES) Unspecified Register Access Type Status +#define AT91C_AES_URAT_IN_DAT_WRITE_DATPROC (0x0 << 12) // (AES) Input data register written during the data processing in PDC mode. +#define AT91C_AES_URAT_OUT_DAT_READ_DATPROC (0x1 << 12) // (AES) Output data register read during the data processing. +#define AT91C_AES_URAT_MODEREG_WRITE_DATPROC (0x2 << 12) // (AES) Mode register written during the data processing. +#define AT91C_AES_URAT_OUT_DAT_READ_SUBKEY (0x3 << 12) // (AES) Output data register read during the sub-keys generation. +#define AT91C_AES_URAT_MODEREG_WRITE_SUBKEY (0x4 << 12) // (AES) Mode register written during the sub-keys generation. +#define AT91C_AES_URAT_WO_REG_READ (0x5 << 12) // (AES) Write-only register read access. + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Triple Data Encryption Standard +// ***************************************************************************** +// *** Register offset in AT91S_TDES structure *** +#define TDES_CR ( 0) // Control Register +#define TDES_MR ( 4) // Mode Register +#define TDES_IER (16) // Interrupt Enable Register +#define TDES_IDR (20) // Interrupt Disable Register +#define TDES_IMR (24) // Interrupt Mask Register +#define TDES_ISR (28) // Interrupt Status Register +#define TDES_KEY1WxR (32) // Key 1 Word x Register +#define TDES_KEY2WxR (40) // Key 2 Word x Register +#define TDES_KEY3WxR (48) // Key 3 Word x Register +#define TDES_IDATAxR (64) // Input Data x Register +#define TDES_ODATAxR (80) // Output Data x Register +#define TDES_IVxR (96) // Initialization Vector x Register +#define TDES_VR (252) // TDES Version Register +#define TDES_RPR (256) // Receive Pointer Register +#define TDES_RCR (260) // Receive Counter Register +#define TDES_TPR (264) // Transmit Pointer Register +#define TDES_TCR (268) // Transmit Counter Register +#define TDES_RNPR (272) // Receive Next Pointer Register +#define TDES_RNCR (276) // Receive Next Counter Register +#define TDES_TNPR (280) // Transmit Next Pointer Register +#define TDES_TNCR (284) // Transmit Next Counter Register +#define TDES_PTCR (288) // PDC Transfer Control Register +#define TDES_PTSR (292) // PDC Transfer Status Register +// -------- TDES_CR : (TDES Offset: 0x0) Control Register -------- +#define AT91C_TDES_START (0x1 << 0) // (TDES) Starts Processing +#define AT91C_TDES_SWRST (0x1 << 8) // (TDES) Software Reset +// -------- TDES_MR : (TDES Offset: 0x4) Mode Register -------- +#define AT91C_TDES_CIPHER (0x1 << 0) // (TDES) Processing Mode +#define AT91C_TDES_TDESMOD (0x1 << 1) // (TDES) Single or Triple DES Mode +#define AT91C_TDES_KEYMOD (0x1 << 4) // (TDES) Key Mode +#define AT91C_TDES_SMOD (0x3 << 8) // (TDES) Start Mode +#define AT91C_TDES_SMOD_MANUAL (0x0 << 8) // (TDES) Manual Mode: The START bit in register TDES_CR must be set to begin encryption or decryption. +#define AT91C_TDES_SMOD_AUTO (0x1 << 8) // (TDES) Auto Mode: no action in TDES_CR is necessary (cf datasheet). +#define AT91C_TDES_SMOD_PDC (0x2 << 8) // (TDES) PDC Mode (cf datasheet). +#define AT91C_TDES_OPMOD (0x3 << 12) // (TDES) Operation Mode +#define AT91C_TDES_OPMOD_ECB (0x0 << 12) // (TDES) ECB Electronic CodeBook mode. +#define AT91C_TDES_OPMOD_CBC (0x1 << 12) // (TDES) CBC Cipher Block Chaining mode. +#define AT91C_TDES_OPMOD_OFB (0x2 << 12) // (TDES) OFB Output Feedback mode. +#define AT91C_TDES_OPMOD_CFB (0x3 << 12) // (TDES) CFB Cipher Feedback mode. +#define AT91C_TDES_LOD (0x1 << 15) // (TDES) Last Output Data Mode +#define AT91C_TDES_CFBS (0x3 << 16) // (TDES) Cipher Feedback Data Size +#define AT91C_TDES_CFBS_64_BIT (0x0 << 16) // (TDES) 64-bit. +#define AT91C_TDES_CFBS_32_BIT (0x1 << 16) // (TDES) 32-bit. +#define AT91C_TDES_CFBS_16_BIT (0x2 << 16) // (TDES) 16-bit. +#define AT91C_TDES_CFBS_8_BIT (0x3 << 16) // (TDES) 8-bit. +// -------- TDES_IER : (TDES Offset: 0x10) Interrupt Enable Register -------- +#define AT91C_TDES_DATRDY (0x1 << 0) // (TDES) DATRDY +#define AT91C_TDES_ENDRX (0x1 << 1) // (TDES) PDC Read Buffer End +#define AT91C_TDES_ENDTX (0x1 << 2) // (TDES) PDC Write Buffer End +#define AT91C_TDES_RXBUFF (0x1 << 3) // (TDES) PDC Read Buffer Full +#define AT91C_TDES_TXBUFE (0x1 << 4) // (TDES) PDC Write Buffer Empty +#define AT91C_TDES_URAD (0x1 << 8) // (TDES) Unspecified Register Access Detection +// -------- TDES_IDR : (TDES Offset: 0x14) Interrupt Disable Register -------- +// -------- TDES_IMR : (TDES Offset: 0x18) Interrupt Mask Register -------- +// -------- TDES_ISR : (TDES Offset: 0x1c) Interrupt Status Register -------- +#define AT91C_TDES_URAT (0x3 << 12) // (TDES) Unspecified Register Access Type Status +#define AT91C_TDES_URAT_IN_DAT_WRITE_DATPROC (0x0 << 12) // (TDES) Input data register written during the data processing in PDC mode. +#define AT91C_TDES_URAT_OUT_DAT_READ_DATPROC (0x1 << 12) // (TDES) Output data register read during the data processing. +#define AT91C_TDES_URAT_MODEREG_WRITE_DATPROC (0x2 << 12) // (TDES) Mode register written during the data processing. +#define AT91C_TDES_URAT_WO_REG_READ (0x3 << 12) // (TDES) Write-only register read access. + +// ***************************************************************************** +// REGISTER ADDRESS DEFINITION FOR AT91SAM7X256 +// ***************************************************************************** +// ========== Register definition for SYS peripheral ========== +// ========== Register definition for AIC peripheral ========== +#define AT91C_AIC_IVR (0xFFFFF100) // (AIC) IRQ Vector Register +#define AT91C_AIC_SMR (0xFFFFF000) // (AIC) Source Mode Register +#define AT91C_AIC_FVR (0xFFFFF104) // (AIC) FIQ Vector Register +#define AT91C_AIC_DCR (0xFFFFF138) // (AIC) Debug Control Register (Protect) +#define AT91C_AIC_EOICR (0xFFFFF130) // (AIC) End of Interrupt Command Register +#define AT91C_AIC_SVR (0xFFFFF080) // (AIC) Source Vector Register +#define AT91C_AIC_FFSR (0xFFFFF148) // (AIC) Fast Forcing Status Register +#define AT91C_AIC_ICCR (0xFFFFF128) // (AIC) Interrupt Clear Command Register +#define AT91C_AIC_ISR (0xFFFFF108) // (AIC) Interrupt Status Register +#define AT91C_AIC_IMR (0xFFFFF110) // (AIC) Interrupt Mask Register +#define AT91C_AIC_IPR (0xFFFFF10C) // (AIC) Interrupt Pending Register +#define AT91C_AIC_FFER (0xFFFFF140) // (AIC) Fast Forcing Enable Register +#define AT91C_AIC_IECR (0xFFFFF120) // (AIC) Interrupt Enable Command Register +#define AT91C_AIC_ISCR (0xFFFFF12C) // (AIC) Interrupt Set Command Register +#define AT91C_AIC_FFDR (0xFFFFF144) // (AIC) Fast Forcing Disable Register +#define AT91C_AIC_CISR (0xFFFFF114) // (AIC) Core Interrupt Status Register +#define AT91C_AIC_IDCR (0xFFFFF124) // (AIC) Interrupt Disable Command Register +#define AT91C_AIC_SPU (0xFFFFF134) // (AIC) Spurious Vector Register +// ========== Register definition for PDC_DBGU peripheral ========== +#define AT91C_DBGU_TCR (0xFFFFF30C) // (PDC_DBGU) Transmit Counter Register +#define AT91C_DBGU_RNPR (0xFFFFF310) // (PDC_DBGU) Receive Next Pointer Register +#define AT91C_DBGU_TNPR (0xFFFFF318) // (PDC_DBGU) Transmit Next Pointer Register +#define AT91C_DBGU_TPR (0xFFFFF308) // (PDC_DBGU) Transmit Pointer Register +#define AT91C_DBGU_RPR (0xFFFFF300) // (PDC_DBGU) Receive Pointer Register +#define AT91C_DBGU_RCR (0xFFFFF304) // (PDC_DBGU) Receive Counter Register +#define AT91C_DBGU_RNCR (0xFFFFF314) // (PDC_DBGU) Receive Next Counter Register +#define AT91C_DBGU_PTCR (0xFFFFF320) // (PDC_DBGU) PDC Transfer Control Register +#define AT91C_DBGU_PTSR (0xFFFFF324) // (PDC_DBGU) PDC Transfer Status Register +#define AT91C_DBGU_TNCR (0xFFFFF31C) // (PDC_DBGU) Transmit Next Counter Register +// ========== Register definition for DBGU peripheral ========== +#define AT91C_DBGU_EXID (0xFFFFF244) // (DBGU) Chip ID Extension Register +#define AT91C_DBGU_BRGR (0xFFFFF220) // (DBGU) Baud Rate Generator Register +#define AT91C_DBGU_IDR (0xFFFFF20C) // (DBGU) Interrupt Disable Register +#define AT91C_DBGU_CSR (0xFFFFF214) // (DBGU) Channel Status Register +#define AT91C_DBGU_CIDR (0xFFFFF240) // (DBGU) Chip ID Register +#define AT91C_DBGU_MR (0xFFFFF204) // (DBGU) Mode Register +#define AT91C_DBGU_IMR (0xFFFFF210) // (DBGU) Interrupt Mask Register +#define AT91C_DBGU_CR (0xFFFFF200) // (DBGU) Control Register +#define AT91C_DBGU_FNTR (0xFFFFF248) // (DBGU) Force NTRST Register +#define AT91C_DBGU_THR (0xFFFFF21C) // (DBGU) Transmitter Holding Register +#define AT91C_DBGU_RHR (0xFFFFF218) // (DBGU) Receiver Holding Register +#define AT91C_DBGU_IER (0xFFFFF208) // (DBGU) Interrupt Enable Register +// ========== Register definition for PIOA peripheral ========== +#define AT91C_PIOA_ODR (0xFFFFF414) // (PIOA) Output Disable Registerr +#define AT91C_PIOA_SODR (0xFFFFF430) // (PIOA) Set Output Data Register +#define AT91C_PIOA_ISR (0xFFFFF44C) // (PIOA) Interrupt Status Register +#define AT91C_PIOA_ABSR (0xFFFFF478) // (PIOA) AB Select Status Register +#define AT91C_PIOA_IER (0xFFFFF440) // (PIOA) Interrupt Enable Register +#define AT91C_PIOA_PPUDR (0xFFFFF460) // (PIOA) Pull-up Disable Register +#define AT91C_PIOA_IMR (0xFFFFF448) // (PIOA) Interrupt Mask Register +#define AT91C_PIOA_PER (0xFFFFF400) // (PIOA) PIO Enable Register +#define AT91C_PIOA_IFDR (0xFFFFF424) // (PIOA) Input Filter Disable Register +#define AT91C_PIOA_OWDR (0xFFFFF4A4) // (PIOA) Output Write Disable Register +#define AT91C_PIOA_MDSR (0xFFFFF458) // (PIOA) Multi-driver Status Register +#define AT91C_PIOA_IDR (0xFFFFF444) // (PIOA) Interrupt Disable Register +#define AT91C_PIOA_ODSR (0xFFFFF438) // (PIOA) Output Data Status Register +#define AT91C_PIOA_PPUSR (0xFFFFF468) // (PIOA) Pull-up Status Register +#define AT91C_PIOA_OWSR (0xFFFFF4A8) // (PIOA) Output Write Status Register +#define AT91C_PIOA_BSR (0xFFFFF474) // (PIOA) Select B Register +#define AT91C_PIOA_OWER (0xFFFFF4A0) // (PIOA) Output Write Enable Register +#define AT91C_PIOA_IFER (0xFFFFF420) // (PIOA) Input Filter Enable Register +#define AT91C_PIOA_PDSR (0xFFFFF43C) // (PIOA) Pin Data Status Register +#define AT91C_PIOA_PPUER (0xFFFFF464) // (PIOA) Pull-up Enable Register +#define AT91C_PIOA_OSR (0xFFFFF418) // (PIOA) Output Status Register +#define AT91C_PIOA_ASR (0xFFFFF470) // (PIOA) Select A Register +#define AT91C_PIOA_MDDR (0xFFFFF454) // (PIOA) Multi-driver Disable Register +#define AT91C_PIOA_CODR (0xFFFFF434) // (PIOA) Clear Output Data Register +#define AT91C_PIOA_MDER (0xFFFFF450) // (PIOA) Multi-driver Enable Register +#define AT91C_PIOA_PDR (0xFFFFF404) // (PIOA) PIO Disable Register +#define AT91C_PIOA_IFSR (0xFFFFF428) // (PIOA) Input Filter Status Register +#define AT91C_PIOA_OER (0xFFFFF410) // (PIOA) Output Enable Register +#define AT91C_PIOA_PSR (0xFFFFF408) // (PIOA) PIO Status Register +// ========== Register definition for PIOB peripheral ========== +#define AT91C_PIOB_OWDR (0xFFFFF6A4) // (PIOB) Output Write Disable Register +#define AT91C_PIOB_MDER (0xFFFFF650) // (PIOB) Multi-driver Enable Register +#define AT91C_PIOB_PPUSR (0xFFFFF668) // (PIOB) Pull-up Status Register +#define AT91C_PIOB_IMR (0xFFFFF648) // (PIOB) Interrupt Mask Register +#define AT91C_PIOB_ASR (0xFFFFF670) // (PIOB) Select A Register +#define AT91C_PIOB_PPUDR (0xFFFFF660) // (PIOB) Pull-up Disable Register +#define AT91C_PIOB_PSR (0xFFFFF608) // (PIOB) PIO Status Register +#define AT91C_PIOB_IER (0xFFFFF640) // (PIOB) Interrupt Enable Register +#define AT91C_PIOB_CODR (0xFFFFF634) // (PIOB) Clear Output Data Register +#define AT91C_PIOB_OWER (0xFFFFF6A0) // (PIOB) Output Write Enable Register +#define AT91C_PIOB_ABSR (0xFFFFF678) // (PIOB) AB Select Status Register +#define AT91C_PIOB_IFDR (0xFFFFF624) // (PIOB) Input Filter Disable Register +#define AT91C_PIOB_PDSR (0xFFFFF63C) // (PIOB) Pin Data Status Register +#define AT91C_PIOB_IDR (0xFFFFF644) // (PIOB) Interrupt Disable Register +#define AT91C_PIOB_OWSR (0xFFFFF6A8) // (PIOB) Output Write Status Register +#define AT91C_PIOB_PDR (0xFFFFF604) // (PIOB) PIO Disable Register +#define AT91C_PIOB_ODR (0xFFFFF614) // (PIOB) Output Disable Registerr +#define AT91C_PIOB_IFSR (0xFFFFF628) // (PIOB) Input Filter Status Register +#define AT91C_PIOB_PPUER (0xFFFFF664) // (PIOB) Pull-up Enable Register +#define AT91C_PIOB_SODR (0xFFFFF630) // (PIOB) Set Output Data Register +#define AT91C_PIOB_ISR (0xFFFFF64C) // (PIOB) Interrupt Status Register +#define AT91C_PIOB_ODSR (0xFFFFF638) // (PIOB) Output Data Status Register +#define AT91C_PIOB_OSR (0xFFFFF618) // (PIOB) Output Status Register +#define AT91C_PIOB_MDSR (0xFFFFF658) // (PIOB) Multi-driver Status Register +#define AT91C_PIOB_IFER (0xFFFFF620) // (PIOB) Input Filter Enable Register +#define AT91C_PIOB_BSR (0xFFFFF674) // (PIOB) Select B Register +#define AT91C_PIOB_MDDR (0xFFFFF654) // (PIOB) Multi-driver Disable Register +#define AT91C_PIOB_OER (0xFFFFF610) // (PIOB) Output Enable Register +#define AT91C_PIOB_PER (0xFFFFF600) // (PIOB) PIO Enable Register +// ========== Register definition for CKGR peripheral ========== +#define AT91C_CKGR_MOR (0xFFFFFC20) // (CKGR) Main Oscillator Register +#define AT91C_CKGR_PLLR (0xFFFFFC2C) // (CKGR) PLL Register +#define AT91C_CKGR_MCFR (0xFFFFFC24) // (CKGR) Main Clock Frequency Register +// ========== Register definition for PMC peripheral ========== +#define AT91C_PMC_IDR (0xFFFFFC64) // (PMC) Interrupt Disable Register +#define AT91C_PMC_MOR (0xFFFFFC20) // (PMC) Main Oscillator Register +#define AT91C_PMC_PLLR (0xFFFFFC2C) // (PMC) PLL Register +#define AT91C_PMC_PCER (0xFFFFFC10) // (PMC) Peripheral Clock Enable Register +#define AT91C_PMC_PCKR (0xFFFFFC40) // (PMC) Programmable Clock Register +#define AT91C_PMC_MCKR (0xFFFFFC30) // (PMC) Master Clock Register +#define AT91C_PMC_SCDR (0xFFFFFC04) // (PMC) System Clock Disable Register +#define AT91C_PMC_PCDR (0xFFFFFC14) // (PMC) Peripheral Clock Disable Register +#define AT91C_PMC_SCSR (0xFFFFFC08) // (PMC) System Clock Status Register +#define AT91C_PMC_PCSR (0xFFFFFC18) // (PMC) Peripheral Clock Status Register +#define AT91C_PMC_MCFR (0xFFFFFC24) // (PMC) Main Clock Frequency Register +#define AT91C_PMC_SCER (0xFFFFFC00) // (PMC) System Clock Enable Register +#define AT91C_PMC_IMR (0xFFFFFC6C) // (PMC) Interrupt Mask Register +#define AT91C_PMC_IER (0xFFFFFC60) // (PMC) Interrupt Enable Register +#define AT91C_PMC_SR (0xFFFFFC68) // (PMC) Status Register +// ========== Register definition for RSTC peripheral ========== +#define AT91C_RSTC_RCR (0xFFFFFD00) // (RSTC) Reset Control Register +#define AT91C_RSTC_RMR (0xFFFFFD08) // (RSTC) Reset Mode Register +#define AT91C_RSTC_RSR (0xFFFFFD04) // (RSTC) Reset Status Register +// ========== Register definition for RTTC peripheral ========== +#define AT91C_RTTC_RTSR (0xFFFFFD2C) // (RTTC) Real-time Status Register +#define AT91C_RTTC_RTMR (0xFFFFFD20) // (RTTC) Real-time Mode Register +#define AT91C_RTTC_RTVR (0xFFFFFD28) // (RTTC) Real-time Value Register +#define AT91C_RTTC_RTAR (0xFFFFFD24) // (RTTC) Real-time Alarm Register +// ========== Register definition for PITC peripheral ========== +#define AT91C_PITC_PIVR (0xFFFFFD38) // (PITC) Period Interval Value Register +#define AT91C_PITC_PISR (0xFFFFFD34) // (PITC) Period Interval Status Register +#define AT91C_PITC_PIIR (0xFFFFFD3C) // (PITC) Period Interval Image Register +#define AT91C_PITC_PIMR (0xFFFFFD30) // (PITC) Period Interval Mode Register +// ========== Register definition for WDTC peripheral ========== +#define AT91C_WDTC_WDCR (0xFFFFFD40) // (WDTC) Watchdog Control Register +#define AT91C_WDTC_WDSR (0xFFFFFD48) // (WDTC) Watchdog Status Register +#define AT91C_WDTC_WDMR (0xFFFFFD44) // (WDTC) Watchdog Mode Register +// ========== Register definition for VREG peripheral ========== +#define AT91C_VREG_MR (0xFFFFFD60) // (VREG) Voltage Regulator Mode Register +// ========== Register definition for MC peripheral ========== +#define AT91C_MC_ASR (0xFFFFFF04) // (MC) MC Abort Status Register +#define AT91C_MC_RCR (0xFFFFFF00) // (MC) MC Remap Control Register +#define AT91C_MC_FCR (0xFFFFFF64) // (MC) MC Flash Command Register +#define AT91C_MC_AASR (0xFFFFFF08) // (MC) MC Abort Address Status Register +#define AT91C_MC_FSR (0xFFFFFF68) // (MC) MC Flash Status Register +#define AT91C_MC_FMR (0xFFFFFF60) // (MC) MC Flash Mode Register +// ========== Register definition for PDC_SPI1 peripheral ========== +#define AT91C_SPI1_PTCR (0xFFFE4120) // (PDC_SPI1) PDC Transfer Control Register +#define AT91C_SPI1_RPR (0xFFFE4100) // (PDC_SPI1) Receive Pointer Register +#define AT91C_SPI1_TNCR (0xFFFE411C) // (PDC_SPI1) Transmit Next Counter Register +#define AT91C_SPI1_TPR (0xFFFE4108) // (PDC_SPI1) Transmit Pointer Register +#define AT91C_SPI1_TNPR (0xFFFE4118) // (PDC_SPI1) Transmit Next Pointer Register +#define AT91C_SPI1_TCR (0xFFFE410C) // (PDC_SPI1) Transmit Counter Register +#define AT91C_SPI1_RCR (0xFFFE4104) // (PDC_SPI1) Receive Counter Register +#define AT91C_SPI1_RNPR (0xFFFE4110) // (PDC_SPI1) Receive Next Pointer Register +#define AT91C_SPI1_RNCR (0xFFFE4114) // (PDC_SPI1) Receive Next Counter Register +#define AT91C_SPI1_PTSR (0xFFFE4124) // (PDC_SPI1) PDC Transfer Status Register +// ========== Register definition for SPI1 peripheral ========== +#define AT91C_SPI1_IMR (0xFFFE401C) // (SPI1) Interrupt Mask Register +#define AT91C_SPI1_IER (0xFFFE4014) // (SPI1) Interrupt Enable Register +#define AT91C_SPI1_MR (0xFFFE4004) // (SPI1) Mode Register +#define AT91C_SPI1_RDR (0xFFFE4008) // (SPI1) Receive Data Register +#define AT91C_SPI1_IDR (0xFFFE4018) // (SPI1) Interrupt Disable Register +#define AT91C_SPI1_SR (0xFFFE4010) // (SPI1) Status Register +#define AT91C_SPI1_TDR (0xFFFE400C) // (SPI1) Transmit Data Register +#define AT91C_SPI1_CR (0xFFFE4000) // (SPI1) Control Register +#define AT91C_SPI1_CSR (0xFFFE4030) // (SPI1) Chip Select Register +// ========== Register definition for PDC_SPI0 peripheral ========== +#define AT91C_SPI0_PTCR (0xFFFE0120) // (PDC_SPI0) PDC Transfer Control Register +#define AT91C_SPI0_TPR (0xFFFE0108) // (PDC_SPI0) Transmit Pointer Register +#define AT91C_SPI0_TCR (0xFFFE010C) // (PDC_SPI0) Transmit Counter Register +#define AT91C_SPI0_RCR (0xFFFE0104) // (PDC_SPI0) Receive Counter Register +#define AT91C_SPI0_PTSR (0xFFFE0124) // (PDC_SPI0) PDC Transfer Status Register +#define AT91C_SPI0_RNPR (0xFFFE0110) // (PDC_SPI0) Receive Next Pointer Register +#define AT91C_SPI0_RPR (0xFFFE0100) // (PDC_SPI0) Receive Pointer Register +#define AT91C_SPI0_TNCR (0xFFFE011C) // (PDC_SPI0) Transmit Next Counter Register +#define AT91C_SPI0_RNCR (0xFFFE0114) // (PDC_SPI0) Receive Next Counter Register +#define AT91C_SPI0_TNPR (0xFFFE0118) // (PDC_SPI0) Transmit Next Pointer Register +// ========== Register definition for SPI0 peripheral ========== +#define AT91C_SPI0_IER (0xFFFE0014) // (SPI0) Interrupt Enable Register +#define AT91C_SPI0_SR (0xFFFE0010) // (SPI0) Status Register +#define AT91C_SPI0_IDR (0xFFFE0018) // (SPI0) Interrupt Disable Register +#define AT91C_SPI0_CR (0xFFFE0000) // (SPI0) Control Register +#define AT91C_SPI0_MR (0xFFFE0004) // (SPI0) Mode Register +#define AT91C_SPI0_IMR (0xFFFE001C) // (SPI0) Interrupt Mask Register +#define AT91C_SPI0_TDR (0xFFFE000C) // (SPI0) Transmit Data Register +#define AT91C_SPI0_RDR (0xFFFE0008) // (SPI0) Receive Data Register +#define AT91C_SPI0_CSR (0xFFFE0030) // (SPI0) Chip Select Register +// ========== Register definition for PDC_US1 peripheral ========== +#define AT91C_US1_RNCR (0xFFFC4114) // (PDC_US1) Receive Next Counter Register +#define AT91C_US1_PTCR (0xFFFC4120) // (PDC_US1) PDC Transfer Control Register +#define AT91C_US1_TCR (0xFFFC410C) // (PDC_US1) Transmit Counter Register +#define AT91C_US1_PTSR (0xFFFC4124) // (PDC_US1) PDC Transfer Status Register +#define AT91C_US1_TNPR (0xFFFC4118) // (PDC_US1) Transmit Next Pointer Register +#define AT91C_US1_RCR (0xFFFC4104) // (PDC_US1) Receive Counter Register +#define AT91C_US1_RNPR (0xFFFC4110) // (PDC_US1) Receive Next Pointer Register +#define AT91C_US1_RPR (0xFFFC4100) // (PDC_US1) Receive Pointer Register +#define AT91C_US1_TNCR (0xFFFC411C) // (PDC_US1) Transmit Next Counter Register +#define AT91C_US1_TPR (0xFFFC4108) // (PDC_US1) Transmit Pointer Register +// ========== Register definition for US1 peripheral ========== +#define AT91C_US1_IF (0xFFFC404C) // (US1) IRDA_FILTER Register +#define AT91C_US1_NER (0xFFFC4044) // (US1) Nb Errors Register +#define AT91C_US1_RTOR (0xFFFC4024) // (US1) Receiver Time-out Register +#define AT91C_US1_CSR (0xFFFC4014) // (US1) Channel Status Register +#define AT91C_US1_IDR (0xFFFC400C) // (US1) Interrupt Disable Register +#define AT91C_US1_IER (0xFFFC4008) // (US1) Interrupt Enable Register +#define AT91C_US1_THR (0xFFFC401C) // (US1) Transmitter Holding Register +#define AT91C_US1_TTGR (0xFFFC4028) // (US1) Transmitter Time-guard Register +#define AT91C_US1_RHR (0xFFFC4018) // (US1) Receiver Holding Register +#define AT91C_US1_BRGR (0xFFFC4020) // (US1) Baud Rate Generator Register +#define AT91C_US1_IMR (0xFFFC4010) // (US1) Interrupt Mask Register +#define AT91C_US1_FIDI (0xFFFC4040) // (US1) FI_DI_Ratio Register +#define AT91C_US1_CR (0xFFFC4000) // (US1) Control Register +#define AT91C_US1_MR (0xFFFC4004) // (US1) Mode Register +// ========== Register definition for PDC_US0 peripheral ========== +#define AT91C_US0_TNPR (0xFFFC0118) // (PDC_US0) Transmit Next Pointer Register +#define AT91C_US0_RNPR (0xFFFC0110) // (PDC_US0) Receive Next Pointer Register +#define AT91C_US0_TCR (0xFFFC010C) // (PDC_US0) Transmit Counter Register +#define AT91C_US0_PTCR (0xFFFC0120) // (PDC_US0) PDC Transfer Control Register +#define AT91C_US0_PTSR (0xFFFC0124) // (PDC_US0) PDC Transfer Status Register +#define AT91C_US0_TNCR (0xFFFC011C) // (PDC_US0) Transmit Next Counter Register +#define AT91C_US0_TPR (0xFFFC0108) // (PDC_US0) Transmit Pointer Register +#define AT91C_US0_RCR (0xFFFC0104) // (PDC_US0) Receive Counter Register +#define AT91C_US0_RPR (0xFFFC0100) // (PDC_US0) Receive Pointer Register +#define AT91C_US0_RNCR (0xFFFC0114) // (PDC_US0) Receive Next Counter Register +// ========== Register definition for US0 peripheral ========== +#define AT91C_US0_BRGR (0xFFFC0020) // (US0) Baud Rate Generator Register +#define AT91C_US0_NER (0xFFFC0044) // (US0) Nb Errors Register +#define AT91C_US0_CR (0xFFFC0000) // (US0) Control Register +#define AT91C_US0_IMR (0xFFFC0010) // (US0) Interrupt Mask Register +#define AT91C_US0_FIDI (0xFFFC0040) // (US0) FI_DI_Ratio Register +#define AT91C_US0_TTGR (0xFFFC0028) // (US0) Transmitter Time-guard Register +#define AT91C_US0_MR (0xFFFC0004) // (US0) Mode Register +#define AT91C_US0_RTOR (0xFFFC0024) // (US0) Receiver Time-out Register +#define AT91C_US0_CSR (0xFFFC0014) // (US0) Channel Status Register +#define AT91C_US0_RHR (0xFFFC0018) // (US0) Receiver Holding Register +#define AT91C_US0_IDR (0xFFFC000C) // (US0) Interrupt Disable Register +#define AT91C_US0_THR (0xFFFC001C) // (US0) Transmitter Holding Register +#define AT91C_US0_IF (0xFFFC004C) // (US0) IRDA_FILTER Register +#define AT91C_US0_IER (0xFFFC0008) // (US0) Interrupt Enable Register +// ========== Register definition for PDC_SSC peripheral ========== +#define AT91C_SSC_TNCR (0xFFFD411C) // (PDC_SSC) Transmit Next Counter Register +#define AT91C_SSC_RPR (0xFFFD4100) // (PDC_SSC) Receive Pointer Register +#define AT91C_SSC_RNCR (0xFFFD4114) // (PDC_SSC) Receive Next Counter Register +#define AT91C_SSC_TPR (0xFFFD4108) // (PDC_SSC) Transmit Pointer Register +#define AT91C_SSC_PTCR (0xFFFD4120) // (PDC_SSC) PDC Transfer Control Register +#define AT91C_SSC_TCR (0xFFFD410C) // (PDC_SSC) Transmit Counter Register +#define AT91C_SSC_RCR (0xFFFD4104) // (PDC_SSC) Receive Counter Register +#define AT91C_SSC_RNPR (0xFFFD4110) // (PDC_SSC) Receive Next Pointer Register +#define AT91C_SSC_TNPR (0xFFFD4118) // (PDC_SSC) Transmit Next Pointer Register +#define AT91C_SSC_PTSR (0xFFFD4124) // (PDC_SSC) PDC Transfer Status Register +// ========== Register definition for SSC peripheral ========== +#define AT91C_SSC_RHR (0xFFFD4020) // (SSC) Receive Holding Register +#define AT91C_SSC_RSHR (0xFFFD4030) // (SSC) Receive Sync Holding Register +#define AT91C_SSC_TFMR (0xFFFD401C) // (SSC) Transmit Frame Mode Register +#define AT91C_SSC_IDR (0xFFFD4048) // (SSC) Interrupt Disable Register +#define AT91C_SSC_THR (0xFFFD4024) // (SSC) Transmit Holding Register +#define AT91C_SSC_RCMR (0xFFFD4010) // (SSC) Receive Clock ModeRegister +#define AT91C_SSC_IER (0xFFFD4044) // (SSC) Interrupt Enable Register +#define AT91C_SSC_TSHR (0xFFFD4034) // (SSC) Transmit Sync Holding Register +#define AT91C_SSC_SR (0xFFFD4040) // (SSC) Status Register +#define AT91C_SSC_CMR (0xFFFD4004) // (SSC) Clock Mode Register +#define AT91C_SSC_TCMR (0xFFFD4018) // (SSC) Transmit Clock Mode Register +#define AT91C_SSC_CR (0xFFFD4000) // (SSC) Control Register +#define AT91C_SSC_IMR (0xFFFD404C) // (SSC) Interrupt Mask Register +#define AT91C_SSC_RFMR (0xFFFD4014) // (SSC) Receive Frame Mode Register +// ========== Register definition for TWI peripheral ========== +#define AT91C_TWI_IER (0xFFFB8024) // (TWI) Interrupt Enable Register +#define AT91C_TWI_CR (0xFFFB8000) // (TWI) Control Register +#define AT91C_TWI_SR (0xFFFB8020) // (TWI) Status Register +#define AT91C_TWI_IMR (0xFFFB802C) // (TWI) Interrupt Mask Register +#define AT91C_TWI_THR (0xFFFB8034) // (TWI) Transmit Holding Register +#define AT91C_TWI_IDR (0xFFFB8028) // (TWI) Interrupt Disable Register +#define AT91C_TWI_IADR (0xFFFB800C) // (TWI) Internal Address Register +#define AT91C_TWI_MMR (0xFFFB8004) // (TWI) Master Mode Register +#define AT91C_TWI_CWGR (0xFFFB8010) // (TWI) Clock Waveform Generator Register +#define AT91C_TWI_RHR (0xFFFB8030) // (TWI) Receive Holding Register +// ========== Register definition for PWMC_CH3 peripheral ========== +#define AT91C_PWMC_CH3_CUPDR (0xFFFCC270) // (PWMC_CH3) Channel Update Register +#define AT91C_PWMC_CH3_Reserved (0xFFFCC274) // (PWMC_CH3) Reserved +#define AT91C_PWMC_CH3_CPRDR (0xFFFCC268) // (PWMC_CH3) Channel Period Register +#define AT91C_PWMC_CH3_CDTYR (0xFFFCC264) // (PWMC_CH3) Channel Duty Cycle Register +#define AT91C_PWMC_CH3_CCNTR (0xFFFCC26C) // (PWMC_CH3) Channel Counter Register +#define AT91C_PWMC_CH3_CMR (0xFFFCC260) // (PWMC_CH3) Channel Mode Register +// ========== Register definition for PWMC_CH2 peripheral ========== +#define AT91C_PWMC_CH2_Reserved (0xFFFCC254) // (PWMC_CH2) Reserved +#define AT91C_PWMC_CH2_CMR (0xFFFCC240) // (PWMC_CH2) Channel Mode Register +#define AT91C_PWMC_CH2_CCNTR (0xFFFCC24C) // (PWMC_CH2) Channel Counter Register +#define AT91C_PWMC_CH2_CPRDR (0xFFFCC248) // (PWMC_CH2) Channel Period Register +#define AT91C_PWMC_CH2_CUPDR (0xFFFCC250) // (PWMC_CH2) Channel Update Register +#define AT91C_PWMC_CH2_CDTYR (0xFFFCC244) // (PWMC_CH2) Channel Duty Cycle Register +// ========== Register definition for PWMC_CH1 peripheral ========== +#define AT91C_PWMC_CH1_Reserved (0xFFFCC234) // (PWMC_CH1) Reserved +#define AT91C_PWMC_CH1_CUPDR (0xFFFCC230) // (PWMC_CH1) Channel Update Register +#define AT91C_PWMC_CH1_CPRDR (0xFFFCC228) // (PWMC_CH1) Channel Period Register +#define AT91C_PWMC_CH1_CCNTR (0xFFFCC22C) // (PWMC_CH1) Channel Counter Register +#define AT91C_PWMC_CH1_CDTYR (0xFFFCC224) // (PWMC_CH1) Channel Duty Cycle Register +#define AT91C_PWMC_CH1_CMR (0xFFFCC220) // (PWMC_CH1) Channel Mode Register +// ========== Register definition for PWMC_CH0 peripheral ========== +#define AT91C_PWMC_CH0_Reserved (0xFFFCC214) // (PWMC_CH0) Reserved +#define AT91C_PWMC_CH0_CPRDR (0xFFFCC208) // (PWMC_CH0) Channel Period Register +#define AT91C_PWMC_CH0_CDTYR (0xFFFCC204) // (PWMC_CH0) Channel Duty Cycle Register +#define AT91C_PWMC_CH0_CMR (0xFFFCC200) // (PWMC_CH0) Channel Mode Register +#define AT91C_PWMC_CH0_CUPDR (0xFFFCC210) // (PWMC_CH0) Channel Update Register +#define AT91C_PWMC_CH0_CCNTR (0xFFFCC20C) // (PWMC_CH0) Channel Counter Register +// ========== Register definition for PWMC peripheral ========== +#define AT91C_PWMC_IDR (0xFFFCC014) // (PWMC) PWMC Interrupt Disable Register +#define AT91C_PWMC_DIS (0xFFFCC008) // (PWMC) PWMC Disable Register +#define AT91C_PWMC_IER (0xFFFCC010) // (PWMC) PWMC Interrupt Enable Register +#define AT91C_PWMC_VR (0xFFFCC0FC) // (PWMC) PWMC Version Register +#define AT91C_PWMC_ISR (0xFFFCC01C) // (PWMC) PWMC Interrupt Status Register +#define AT91C_PWMC_SR (0xFFFCC00C) // (PWMC) PWMC Status Register +#define AT91C_PWMC_IMR (0xFFFCC018) // (PWMC) PWMC Interrupt Mask Register +#define AT91C_PWMC_MR (0xFFFCC000) // (PWMC) PWMC Mode Register +#define AT91C_PWMC_ENA (0xFFFCC004) // (PWMC) PWMC Enable Register +// ========== Register definition for UDP peripheral ========== +#define AT91C_UDP_IMR (0xFFFB0018) // (UDP) Interrupt Mask Register +#define AT91C_UDP_FADDR (0xFFFB0008) // (UDP) Function Address Register +#define AT91C_UDP_NUM (0xFFFB0000) // (UDP) Frame Number Register +#define AT91C_UDP_FDR (0xFFFB0050) // (UDP) Endpoint FIFO Data Register +#define AT91C_UDP_ISR (0xFFFB001C) // (UDP) Interrupt Status Register +#define AT91C_UDP_CSR (0xFFFB0030) // (UDP) Endpoint Control and Status Register +#define AT91C_UDP_IDR (0xFFFB0014) // (UDP) Interrupt Disable Register +#define AT91C_UDP_ICR (0xFFFB0020) // (UDP) Interrupt Clear Register +#define AT91C_UDP_RSTEP (0xFFFB0028) // (UDP) Reset Endpoint Register +#define AT91C_UDP_TXVC (0xFFFB0074) // (UDP) Transceiver Control Register +#define AT91C_UDP_GLBSTATE (0xFFFB0004) // (UDP) Global State Register +#define AT91C_UDP_IER (0xFFFB0010) // (UDP) Interrupt Enable Register +// ========== Register definition for TC0 peripheral ========== +#define AT91C_TC0_SR (0xFFFA0020) // (TC0) Status Register +#define AT91C_TC0_RC (0xFFFA001C) // (TC0) Register C +#define AT91C_TC0_RB (0xFFFA0018) // (TC0) Register B +#define AT91C_TC0_CCR (0xFFFA0000) // (TC0) Channel Control Register +#define AT91C_TC0_CMR (0xFFFA0004) // (TC0) Channel Mode Register (Capture Mode / Waveform Mode) +#define AT91C_TC0_IER (0xFFFA0024) // (TC0) Interrupt Enable Register +#define AT91C_TC0_RA (0xFFFA0014) // (TC0) Register A +#define AT91C_TC0_IDR (0xFFFA0028) // (TC0) Interrupt Disable Register +#define AT91C_TC0_CV (0xFFFA0010) // (TC0) Counter Value +#define AT91C_TC0_IMR (0xFFFA002C) // (TC0) Interrupt Mask Register +// ========== Register definition for TC1 peripheral ========== +#define AT91C_TC1_RB (0xFFFA0058) // (TC1) Register B +#define AT91C_TC1_CCR (0xFFFA0040) // (TC1) Channel Control Register +#define AT91C_TC1_IER (0xFFFA0064) // (TC1) Interrupt Enable Register +#define AT91C_TC1_IDR (0xFFFA0068) // (TC1) Interrupt Disable Register +#define AT91C_TC1_SR (0xFFFA0060) // (TC1) Status Register +#define AT91C_TC1_CMR (0xFFFA0044) // (TC1) Channel Mode Register (Capture Mode / Waveform Mode) +#define AT91C_TC1_RA (0xFFFA0054) // (TC1) Register A +#define AT91C_TC1_RC (0xFFFA005C) // (TC1) Register C +#define AT91C_TC1_IMR (0xFFFA006C) // (TC1) Interrupt Mask Register +#define AT91C_TC1_CV (0xFFFA0050) // (TC1) Counter Value +// ========== Register definition for TC2 peripheral ========== +#define AT91C_TC2_CMR (0xFFFA0084) // (TC2) Channel Mode Register (Capture Mode / Waveform Mode) +#define AT91C_TC2_CCR (0xFFFA0080) // (TC2) Channel Control Register +#define AT91C_TC2_CV (0xFFFA0090) // (TC2) Counter Value +#define AT91C_TC2_RA (0xFFFA0094) // (TC2) Register A +#define AT91C_TC2_RB (0xFFFA0098) // (TC2) Register B +#define AT91C_TC2_IDR (0xFFFA00A8) // (TC2) Interrupt Disable Register +#define AT91C_TC2_IMR (0xFFFA00AC) // (TC2) Interrupt Mask Register +#define AT91C_TC2_RC (0xFFFA009C) // (TC2) Register C +#define AT91C_TC2_IER (0xFFFA00A4) // (TC2) Interrupt Enable Register +#define AT91C_TC2_SR (0xFFFA00A0) // (TC2) Status Register +// ========== Register definition for TCB peripheral ========== +#define AT91C_TCB_BMR (0xFFFA00C4) // (TCB) TC Block Mode Register +#define AT91C_TCB_BCR (0xFFFA00C0) // (TCB) TC Block Control Register +// ========== Register definition for CAN_MB0 peripheral ========== +#define AT91C_CAN_MB0_MDL (0xFFFD0214) // (CAN_MB0) MailBox Data Low Register +#define AT91C_CAN_MB0_MAM (0xFFFD0204) // (CAN_MB0) MailBox Acceptance Mask Register +#define AT91C_CAN_MB0_MCR (0xFFFD021C) // (CAN_MB0) MailBox Control Register +#define AT91C_CAN_MB0_MID (0xFFFD0208) // (CAN_MB0) MailBox ID Register +#define AT91C_CAN_MB0_MSR (0xFFFD0210) // (CAN_MB0) MailBox Status Register +#define AT91C_CAN_MB0_MFID (0xFFFD020C) // (CAN_MB0) MailBox Family ID Register +#define AT91C_CAN_MB0_MDH (0xFFFD0218) // (CAN_MB0) MailBox Data High Register +#define AT91C_CAN_MB0_MMR (0xFFFD0200) // (CAN_MB0) MailBox Mode Register +// ========== Register definition for CAN_MB1 peripheral ========== +#define AT91C_CAN_MB1_MDL (0xFFFD0234) // (CAN_MB1) MailBox Data Low Register +#define AT91C_CAN_MB1_MID (0xFFFD0228) // (CAN_MB1) MailBox ID Register +#define AT91C_CAN_MB1_MMR (0xFFFD0220) // (CAN_MB1) MailBox Mode Register +#define AT91C_CAN_MB1_MSR (0xFFFD0230) // (CAN_MB1) MailBox Status Register +#define AT91C_CAN_MB1_MAM (0xFFFD0224) // (CAN_MB1) MailBox Acceptance Mask Register +#define AT91C_CAN_MB1_MDH (0xFFFD0238) // (CAN_MB1) MailBox Data High Register +#define AT91C_CAN_MB1_MCR (0xFFFD023C) // (CAN_MB1) MailBox Control Register +#define AT91C_CAN_MB1_MFID (0xFFFD022C) // (CAN_MB1) MailBox Family ID Register +// ========== Register definition for CAN_MB2 peripheral ========== +#define AT91C_CAN_MB2_MCR (0xFFFD025C) // (CAN_MB2) MailBox Control Register +#define AT91C_CAN_MB2_MDH (0xFFFD0258) // (CAN_MB2) MailBox Data High Register +#define AT91C_CAN_MB2_MID (0xFFFD0248) // (CAN_MB2) MailBox ID Register +#define AT91C_CAN_MB2_MDL (0xFFFD0254) // (CAN_MB2) MailBox Data Low Register +#define AT91C_CAN_MB2_MMR (0xFFFD0240) // (CAN_MB2) MailBox Mode Register +#define AT91C_CAN_MB2_MAM (0xFFFD0244) // (CAN_MB2) MailBox Acceptance Mask Register +#define AT91C_CAN_MB2_MFID (0xFFFD024C) // (CAN_MB2) MailBox Family ID Register +#define AT91C_CAN_MB2_MSR (0xFFFD0250) // (CAN_MB2) MailBox Status Register +// ========== Register definition for CAN_MB3 peripheral ========== +#define AT91C_CAN_MB3_MFID (0xFFFD026C) // (CAN_MB3) MailBox Family ID Register +#define AT91C_CAN_MB3_MAM (0xFFFD0264) // (CAN_MB3) MailBox Acceptance Mask Register +#define AT91C_CAN_MB3_MID (0xFFFD0268) // (CAN_MB3) MailBox ID Register +#define AT91C_CAN_MB3_MCR (0xFFFD027C) // (CAN_MB3) MailBox Control Register +#define AT91C_CAN_MB3_MMR (0xFFFD0260) // (CAN_MB3) MailBox Mode Register +#define AT91C_CAN_MB3_MSR (0xFFFD0270) // (CAN_MB3) MailBox Status Register +#define AT91C_CAN_MB3_MDL (0xFFFD0274) // (CAN_MB3) MailBox Data Low Register +#define AT91C_CAN_MB3_MDH (0xFFFD0278) // (CAN_MB3) MailBox Data High Register +// ========== Register definition for CAN_MB4 peripheral ========== +#define AT91C_CAN_MB4_MID (0xFFFD0288) // (CAN_MB4) MailBox ID Register +#define AT91C_CAN_MB4_MMR (0xFFFD0280) // (CAN_MB4) MailBox Mode Register +#define AT91C_CAN_MB4_MDH (0xFFFD0298) // (CAN_MB4) MailBox Data High Register +#define AT91C_CAN_MB4_MFID (0xFFFD028C) // (CAN_MB4) MailBox Family ID Register +#define AT91C_CAN_MB4_MSR (0xFFFD0290) // (CAN_MB4) MailBox Status Register +#define AT91C_CAN_MB4_MCR (0xFFFD029C) // (CAN_MB4) MailBox Control Register +#define AT91C_CAN_MB4_MDL (0xFFFD0294) // (CAN_MB4) MailBox Data Low Register +#define AT91C_CAN_MB4_MAM (0xFFFD0284) // (CAN_MB4) MailBox Acceptance Mask Register +// ========== Register definition for CAN_MB5 peripheral ========== +#define AT91C_CAN_MB5_MSR (0xFFFD02B0) // (CAN_MB5) MailBox Status Register +#define AT91C_CAN_MB5_MCR (0xFFFD02BC) // (CAN_MB5) MailBox Control Register +#define AT91C_CAN_MB5_MFID (0xFFFD02AC) // (CAN_MB5) MailBox Family ID Register +#define AT91C_CAN_MB5_MDH (0xFFFD02B8) // (CAN_MB5) MailBox Data High Register +#define AT91C_CAN_MB5_MID (0xFFFD02A8) // (CAN_MB5) MailBox ID Register +#define AT91C_CAN_MB5_MMR (0xFFFD02A0) // (CAN_MB5) MailBox Mode Register +#define AT91C_CAN_MB5_MDL (0xFFFD02B4) // (CAN_MB5) MailBox Data Low Register +#define AT91C_CAN_MB5_MAM (0xFFFD02A4) // (CAN_MB5) MailBox Acceptance Mask Register +// ========== Register definition for CAN_MB6 peripheral ========== +#define AT91C_CAN_MB6_MFID (0xFFFD02CC) // (CAN_MB6) MailBox Family ID Register +#define AT91C_CAN_MB6_MID (0xFFFD02C8) // (CAN_MB6) MailBox ID Register +#define AT91C_CAN_MB6_MAM (0xFFFD02C4) // (CAN_MB6) MailBox Acceptance Mask Register +#define AT91C_CAN_MB6_MSR (0xFFFD02D0) // (CAN_MB6) MailBox Status Register +#define AT91C_CAN_MB6_MDL (0xFFFD02D4) // (CAN_MB6) MailBox Data Low Register +#define AT91C_CAN_MB6_MCR (0xFFFD02DC) // (CAN_MB6) MailBox Control Register +#define AT91C_CAN_MB6_MDH (0xFFFD02D8) // (CAN_MB6) MailBox Data High Register +#define AT91C_CAN_MB6_MMR (0xFFFD02C0) // (CAN_MB6) MailBox Mode Register +// ========== Register definition for CAN_MB7 peripheral ========== +#define AT91C_CAN_MB7_MCR (0xFFFD02FC) // (CAN_MB7) MailBox Control Register +#define AT91C_CAN_MB7_MDH (0xFFFD02F8) // (CAN_MB7) MailBox Data High Register +#define AT91C_CAN_MB7_MFID (0xFFFD02EC) // (CAN_MB7) MailBox Family ID Register +#define AT91C_CAN_MB7_MDL (0xFFFD02F4) // (CAN_MB7) MailBox Data Low Register +#define AT91C_CAN_MB7_MID (0xFFFD02E8) // (CAN_MB7) MailBox ID Register +#define AT91C_CAN_MB7_MMR (0xFFFD02E0) // (CAN_MB7) MailBox Mode Register +#define AT91C_CAN_MB7_MAM (0xFFFD02E4) // (CAN_MB7) MailBox Acceptance Mask Register +#define AT91C_CAN_MB7_MSR (0xFFFD02F0) // (CAN_MB7) MailBox Status Register +// ========== Register definition for CAN peripheral ========== +#define AT91C_CAN_TCR (0xFFFD0024) // (CAN) Transfer Command Register +#define AT91C_CAN_IMR (0xFFFD000C) // (CAN) Interrupt Mask Register +#define AT91C_CAN_IER (0xFFFD0004) // (CAN) Interrupt Enable Register +#define AT91C_CAN_ECR (0xFFFD0020) // (CAN) Error Counter Register +#define AT91C_CAN_TIMESTP (0xFFFD001C) // (CAN) Time Stamp Register +#define AT91C_CAN_MR (0xFFFD0000) // (CAN) Mode Register +#define AT91C_CAN_IDR (0xFFFD0008) // (CAN) Interrupt Disable Register +#define AT91C_CAN_ACR (0xFFFD0028) // (CAN) Abort Command Register +#define AT91C_CAN_TIM (0xFFFD0018) // (CAN) Timer Register +#define AT91C_CAN_SR (0xFFFD0010) // (CAN) Status Register +#define AT91C_CAN_BR (0xFFFD0014) // (CAN) Baudrate Register +#define AT91C_CAN_VR (0xFFFD00FC) // (CAN) Version Register +// ========== Register definition for EMAC peripheral ========== +#define AT91C_EMAC_ISR (0xFFFDC024) // (EMAC) Interrupt Status Register +#define AT91C_EMAC_SA4H (0xFFFDC0B4) // (EMAC) Specific Address 4 Top, Last 2 bytes +#define AT91C_EMAC_SA1L (0xFFFDC098) // (EMAC) Specific Address 1 Bottom, First 4 bytes +#define AT91C_EMAC_ELE (0xFFFDC078) // (EMAC) Excessive Length Errors Register +#define AT91C_EMAC_LCOL (0xFFFDC05C) // (EMAC) Late Collision Register +#define AT91C_EMAC_RLE (0xFFFDC088) // (EMAC) Receive Length Field Mismatch Register +#define AT91C_EMAC_WOL (0xFFFDC0C4) // (EMAC) Wake On LAN Register +#define AT91C_EMAC_DTF (0xFFFDC058) // (EMAC) Deferred Transmission Frame Register +#define AT91C_EMAC_TUND (0xFFFDC064) // (EMAC) Transmit Underrun Error Register +#define AT91C_EMAC_NCR (0xFFFDC000) // (EMAC) Network Control Register +#define AT91C_EMAC_SA4L (0xFFFDC0B0) // (EMAC) Specific Address 4 Bottom, First 4 bytes +#define AT91C_EMAC_RSR (0xFFFDC020) // (EMAC) Receive Status Register +#define AT91C_EMAC_SA3L (0xFFFDC0A8) // (EMAC) Specific Address 3 Bottom, First 4 bytes +#define AT91C_EMAC_TSR (0xFFFDC014) // (EMAC) Transmit Status Register +#define AT91C_EMAC_IDR (0xFFFDC02C) // (EMAC) Interrupt Disable Register +#define AT91C_EMAC_RSE (0xFFFDC074) // (EMAC) Receive Symbol Errors Register +#define AT91C_EMAC_ECOL (0xFFFDC060) // (EMAC) Excessive Collision Register +#define AT91C_EMAC_TID (0xFFFDC0B8) // (EMAC) Type ID Checking Register +#define AT91C_EMAC_HRB (0xFFFDC090) // (EMAC) Hash Address Bottom[31:0] +#define AT91C_EMAC_TBQP (0xFFFDC01C) // (EMAC) Transmit Buffer Queue Pointer +#define AT91C_EMAC_USRIO (0xFFFDC0C0) // (EMAC) USER Input/Output Register +#define AT91C_EMAC_PTR (0xFFFDC038) // (EMAC) Pause Time Register +#define AT91C_EMAC_SA2H (0xFFFDC0A4) // (EMAC) Specific Address 2 Top, Last 2 bytes +#define AT91C_EMAC_ROV (0xFFFDC070) // (EMAC) Receive Overrun Errors Register +#define AT91C_EMAC_ALE (0xFFFDC054) // (EMAC) Alignment Error Register +#define AT91C_EMAC_RJA (0xFFFDC07C) // (EMAC) Receive Jabbers Register +#define AT91C_EMAC_RBQP (0xFFFDC018) // (EMAC) Receive Buffer Queue Pointer +#define AT91C_EMAC_TPF (0xFFFDC08C) // (EMAC) Transmitted Pause Frames Register +#define AT91C_EMAC_NCFGR (0xFFFDC004) // (EMAC) Network Configuration Register +#define AT91C_EMAC_HRT (0xFFFDC094) // (EMAC) Hash Address Top[63:32] +#define AT91C_EMAC_USF (0xFFFDC080) // (EMAC) Undersize Frames Register +#define AT91C_EMAC_FCSE (0xFFFDC050) // (EMAC) Frame Check Sequence Error Register +#define AT91C_EMAC_TPQ (0xFFFDC0BC) // (EMAC) Transmit Pause Quantum Register +#define AT91C_EMAC_MAN (0xFFFDC034) // (EMAC) PHY Maintenance Register +#define AT91C_EMAC_FTO (0xFFFDC040) // (EMAC) Frames Transmitted OK Register +#define AT91C_EMAC_REV (0xFFFDC0FC) // (EMAC) Revision Register +#define AT91C_EMAC_IMR (0xFFFDC030) // (EMAC) Interrupt Mask Register +#define AT91C_EMAC_SCF (0xFFFDC044) // (EMAC) Single Collision Frame Register +#define AT91C_EMAC_PFR (0xFFFDC03C) // (EMAC) Pause Frames received Register +#define AT91C_EMAC_MCF (0xFFFDC048) // (EMAC) Multiple Collision Frame Register +#define AT91C_EMAC_NSR (0xFFFDC008) // (EMAC) Network Status Register +#define AT91C_EMAC_SA2L (0xFFFDC0A0) // (EMAC) Specific Address 2 Bottom, First 4 bytes +#define AT91C_EMAC_FRO (0xFFFDC04C) // (EMAC) Frames Received OK Register +#define AT91C_EMAC_IER (0xFFFDC028) // (EMAC) Interrupt Enable Register +#define AT91C_EMAC_SA1H (0xFFFDC09C) // (EMAC) Specific Address 1 Top, Last 2 bytes +#define AT91C_EMAC_CSE (0xFFFDC068) // (EMAC) Carrier Sense Error Register +#define AT91C_EMAC_SA3H (0xFFFDC0AC) // (EMAC) Specific Address 3 Top, Last 2 bytes +#define AT91C_EMAC_RRE (0xFFFDC06C) // (EMAC) Receive Ressource Error Register +#define AT91C_EMAC_STE (0xFFFDC084) // (EMAC) SQE Test Error Register +// ========== Register definition for PDC_ADC peripheral ========== +#define AT91C_ADC_PTSR (0xFFFD8124) // (PDC_ADC) PDC Transfer Status Register +#define AT91C_ADC_PTCR (0xFFFD8120) // (PDC_ADC) PDC Transfer Control Register +#define AT91C_ADC_TNPR (0xFFFD8118) // (PDC_ADC) Transmit Next Pointer Register +#define AT91C_ADC_TNCR (0xFFFD811C) // (PDC_ADC) Transmit Next Counter Register +#define AT91C_ADC_RNPR (0xFFFD8110) // (PDC_ADC) Receive Next Pointer Register +#define AT91C_ADC_RNCR (0xFFFD8114) // (PDC_ADC) Receive Next Counter Register +#define AT91C_ADC_RPR (0xFFFD8100) // (PDC_ADC) Receive Pointer Register +#define AT91C_ADC_TCR (0xFFFD810C) // (PDC_ADC) Transmit Counter Register +#define AT91C_ADC_TPR (0xFFFD8108) // (PDC_ADC) Transmit Pointer Register +#define AT91C_ADC_RCR (0xFFFD8104) // (PDC_ADC) Receive Counter Register +// ========== Register definition for ADC peripheral ========== +#define AT91C_ADC_CDR2 (0xFFFD8038) // (ADC) ADC Channel Data Register 2 +#define AT91C_ADC_CDR3 (0xFFFD803C) // (ADC) ADC Channel Data Register 3 +#define AT91C_ADC_CDR0 (0xFFFD8030) // (ADC) ADC Channel Data Register 0 +#define AT91C_ADC_CDR5 (0xFFFD8044) // (ADC) ADC Channel Data Register 5 +#define AT91C_ADC_CHDR (0xFFFD8014) // (ADC) ADC Channel Disable Register +#define AT91C_ADC_SR (0xFFFD801C) // (ADC) ADC Status Register +#define AT91C_ADC_CDR4 (0xFFFD8040) // (ADC) ADC Channel Data Register 4 +#define AT91C_ADC_CDR1 (0xFFFD8034) // (ADC) ADC Channel Data Register 1 +#define AT91C_ADC_LCDR (0xFFFD8020) // (ADC) ADC Last Converted Data Register +#define AT91C_ADC_IDR (0xFFFD8028) // (ADC) ADC Interrupt Disable Register +#define AT91C_ADC_CR (0xFFFD8000) // (ADC) ADC Control Register +#define AT91C_ADC_CDR7 (0xFFFD804C) // (ADC) ADC Channel Data Register 7 +#define AT91C_ADC_CDR6 (0xFFFD8048) // (ADC) ADC Channel Data Register 6 +#define AT91C_ADC_IER (0xFFFD8024) // (ADC) ADC Interrupt Enable Register +#define AT91C_ADC_CHER (0xFFFD8010) // (ADC) ADC Channel Enable Register +#define AT91C_ADC_CHSR (0xFFFD8018) // (ADC) ADC Channel Status Register +#define AT91C_ADC_MR (0xFFFD8004) // (ADC) ADC Mode Register +#define AT91C_ADC_IMR (0xFFFD802C) // (ADC) ADC Interrupt Mask Register +// ========== Register definition for PDC_AES peripheral ========== +#define AT91C_AES_TPR (0xFFFA4108) // (PDC_AES) Transmit Pointer Register +#define AT91C_AES_PTCR (0xFFFA4120) // (PDC_AES) PDC Transfer Control Register +#define AT91C_AES_RNPR (0xFFFA4110) // (PDC_AES) Receive Next Pointer Register +#define AT91C_AES_TNCR (0xFFFA411C) // (PDC_AES) Transmit Next Counter Register +#define AT91C_AES_TCR (0xFFFA410C) // (PDC_AES) Transmit Counter Register +#define AT91C_AES_RCR (0xFFFA4104) // (PDC_AES) Receive Counter Register +#define AT91C_AES_RNCR (0xFFFA4114) // (PDC_AES) Receive Next Counter Register +#define AT91C_AES_TNPR (0xFFFA4118) // (PDC_AES) Transmit Next Pointer Register +#define AT91C_AES_RPR (0xFFFA4100) // (PDC_AES) Receive Pointer Register +#define AT91C_AES_PTSR (0xFFFA4124) // (PDC_AES) PDC Transfer Status Register +// ========== Register definition for AES peripheral ========== +#define AT91C_AES_IVxR (0xFFFA4060) // (AES) Initialization Vector x Register +#define AT91C_AES_MR (0xFFFA4004) // (AES) Mode Register +#define AT91C_AES_VR (0xFFFA40FC) // (AES) AES Version Register +#define AT91C_AES_ODATAxR (0xFFFA4050) // (AES) Output Data x Register +#define AT91C_AES_IDATAxR (0xFFFA4040) // (AES) Input Data x Register +#define AT91C_AES_CR (0xFFFA4000) // (AES) Control Register +#define AT91C_AES_IDR (0xFFFA4014) // (AES) Interrupt Disable Register +#define AT91C_AES_IMR (0xFFFA4018) // (AES) Interrupt Mask Register +#define AT91C_AES_IER (0xFFFA4010) // (AES) Interrupt Enable Register +#define AT91C_AES_KEYWxR (0xFFFA4020) // (AES) Key Word x Register +#define AT91C_AES_ISR (0xFFFA401C) // (AES) Interrupt Status Register +// ========== Register definition for PDC_TDES peripheral ========== +#define AT91C_TDES_RNCR (0xFFFA8114) // (PDC_TDES) Receive Next Counter Register +#define AT91C_TDES_TCR (0xFFFA810C) // (PDC_TDES) Transmit Counter Register +#define AT91C_TDES_RCR (0xFFFA8104) // (PDC_TDES) Receive Counter Register +#define AT91C_TDES_TNPR (0xFFFA8118) // (PDC_TDES) Transmit Next Pointer Register +#define AT91C_TDES_RNPR (0xFFFA8110) // (PDC_TDES) Receive Next Pointer Register +#define AT91C_TDES_RPR (0xFFFA8100) // (PDC_TDES) Receive Pointer Register +#define AT91C_TDES_TNCR (0xFFFA811C) // (PDC_TDES) Transmit Next Counter Register +#define AT91C_TDES_TPR (0xFFFA8108) // (PDC_TDES) Transmit Pointer Register +#define AT91C_TDES_PTSR (0xFFFA8124) // (PDC_TDES) PDC Transfer Status Register +#define AT91C_TDES_PTCR (0xFFFA8120) // (PDC_TDES) PDC Transfer Control Register +// ========== Register definition for TDES peripheral ========== +#define AT91C_TDES_KEY2WxR (0xFFFA8028) // (TDES) Key 2 Word x Register +#define AT91C_TDES_KEY3WxR (0xFFFA8030) // (TDES) Key 3 Word x Register +#define AT91C_TDES_IDR (0xFFFA8014) // (TDES) Interrupt Disable Register +#define AT91C_TDES_VR (0xFFFA80FC) // (TDES) TDES Version Register +#define AT91C_TDES_IVxR (0xFFFA8060) // (TDES) Initialization Vector x Register +#define AT91C_TDES_ODATAxR (0xFFFA8050) // (TDES) Output Data x Register +#define AT91C_TDES_IMR (0xFFFA8018) // (TDES) Interrupt Mask Register +#define AT91C_TDES_MR (0xFFFA8004) // (TDES) Mode Register +#define AT91C_TDES_CR (0xFFFA8000) // (TDES) Control Register +#define AT91C_TDES_IER (0xFFFA8010) // (TDES) Interrupt Enable Register +#define AT91C_TDES_ISR (0xFFFA801C) // (TDES) Interrupt Status Register +#define AT91C_TDES_IDATAxR (0xFFFA8040) // (TDES) Input Data x Register +#define AT91C_TDES_KEY1WxR (0xFFFA8020) // (TDES) Key 1 Word x Register + +// ***************************************************************************** +// PIO DEFINITIONS FOR AT91SAM7X256 +// ***************************************************************************** +#define AT91C_PIO_PA0 (1 << 0) // Pin Controlled by PA0 +#define AT91C_PA0_RXD0 (AT91C_PIO_PA0) // USART 0 Receive Data +#define AT91C_PIO_PA1 (1 << 1) // Pin Controlled by PA1 +#define AT91C_PA1_TXD0 (AT91C_PIO_PA1) // USART 0 Transmit Data +#define AT91C_PIO_PA10 (1 << 10) // Pin Controlled by PA10 +#define AT91C_PA10_TWD (AT91C_PIO_PA10) // TWI Two-wire Serial Data +#define AT91C_PIO_PA11 (1 << 11) // Pin Controlled by PA11 +#define AT91C_PA11_TWCK (AT91C_PIO_PA11) // TWI Two-wire Serial Clock +#define AT91C_PIO_PA12 (1 << 12) // Pin Controlled by PA12 +#define AT91C_PA12_NPCS00 (AT91C_PIO_PA12) // SPI 0 Peripheral Chip Select 0 +#define AT91C_PIO_PA13 (1 << 13) // Pin Controlled by PA13 +#define AT91C_PA13_NPCS01 (AT91C_PIO_PA13) // SPI 0 Peripheral Chip Select 1 +#define AT91C_PA13_PCK1 (AT91C_PIO_PA13) // PMC Programmable Clock Output 1 +#define AT91C_PIO_PA14 (1 << 14) // Pin Controlled by PA14 +#define AT91C_PA14_NPCS02 (AT91C_PIO_PA14) // SPI 0 Peripheral Chip Select 2 +#define AT91C_PA14_IRQ1 (AT91C_PIO_PA14) // External Interrupt 1 +#define AT91C_PIO_PA15 (1 << 15) // Pin Controlled by PA15 +#define AT91C_PA15_NPCS03 (AT91C_PIO_PA15) // SPI 0 Peripheral Chip Select 3 +#define AT91C_PA15_TCLK2 (AT91C_PIO_PA15) // Timer Counter 2 external clock input +#define AT91C_PIO_PA16 (1 << 16) // Pin Controlled by PA16 +#define AT91C_PA16_MISO0 (AT91C_PIO_PA16) // SPI 0 Master In Slave +#define AT91C_PIO_PA17 (1 << 17) // Pin Controlled by PA17 +#define AT91C_PA17_MOSI0 (AT91C_PIO_PA17) // SPI 0 Master Out Slave +#define AT91C_PIO_PA18 (1 << 18) // Pin Controlled by PA18 +#define AT91C_PA18_SPCK0 (AT91C_PIO_PA18) // SPI 0 Serial Clock +#define AT91C_PIO_PA19 (1 << 19) // Pin Controlled by PA19 +#define AT91C_PA19_CANRX (AT91C_PIO_PA19) // CAN Receive +#define AT91C_PIO_PA2 (1 << 2) // Pin Controlled by PA2 +#define AT91C_PA2_SCK0 (AT91C_PIO_PA2) // USART 0 Serial Clock +#define AT91C_PA2_NPCS11 (AT91C_PIO_PA2) // SPI 1 Peripheral Chip Select 1 +#define AT91C_PIO_PA20 (1 << 20) // Pin Controlled by PA20 +#define AT91C_PA20_CANTX (AT91C_PIO_PA20) // CAN Transmit +#define AT91C_PIO_PA21 (1 << 21) // Pin Controlled by PA21 +#define AT91C_PA21_TF (AT91C_PIO_PA21) // SSC Transmit Frame Sync +#define AT91C_PA21_NPCS10 (AT91C_PIO_PA21) // SPI 1 Peripheral Chip Select 0 +#define AT91C_PIO_PA22 (1 << 22) // Pin Controlled by PA22 +#define AT91C_PA22_TK (AT91C_PIO_PA22) // SSC Transmit Clock +#define AT91C_PA22_SPCK1 (AT91C_PIO_PA22) // SPI 1 Serial Clock +#define AT91C_PIO_PA23 (1 << 23) // Pin Controlled by PA23 +#define AT91C_PA23_TD (AT91C_PIO_PA23) // SSC Transmit data +#define AT91C_PA23_MOSI1 (AT91C_PIO_PA23) // SPI 1 Master Out Slave +#define AT91C_PIO_PA24 (1 << 24) // Pin Controlled by PA24 +#define AT91C_PA24_RD (AT91C_PIO_PA24) // SSC Receive Data +#define AT91C_PA24_MISO1 (AT91C_PIO_PA24) // SPI 1 Master In Slave +#define AT91C_PIO_PA25 (1 << 25) // Pin Controlled by PA25 +#define AT91C_PA25_RK (AT91C_PIO_PA25) // SSC Receive Clock +#define AT91C_PA25_NPCS11 (AT91C_PIO_PA25) // SPI 1 Peripheral Chip Select 1 +#define AT91C_PIO_PA26 (1 << 26) // Pin Controlled by PA26 +#define AT91C_PA26_RF (AT91C_PIO_PA26) // SSC Receive Frame Sync +#define AT91C_PA26_NPCS12 (AT91C_PIO_PA26) // SPI 1 Peripheral Chip Select 2 +#define AT91C_PIO_PA27 (1 << 27) // Pin Controlled by PA27 +#define AT91C_PA27_DRXD (AT91C_PIO_PA27) // DBGU Debug Receive Data +#define AT91C_PA27_PCK3 (AT91C_PIO_PA27) // PMC Programmable Clock Output 3 +#define AT91C_PIO_PA28 (1 << 28) // Pin Controlled by PA28 +#define AT91C_PA28_DTXD (AT91C_PIO_PA28) // DBGU Debug Transmit Data +#define AT91C_PIO_PA29 (1 << 29) // Pin Controlled by PA29 +#define AT91C_PA29_FIQ (AT91C_PIO_PA29) // AIC Fast Interrupt Input +#define AT91C_PA29_NPCS13 (AT91C_PIO_PA29) // SPI 1 Peripheral Chip Select 3 +#define AT91C_PIO_PA3 (1 << 3) // Pin Controlled by PA3 +#define AT91C_PA3_RTS0 (AT91C_PIO_PA3) // USART 0 Ready To Send +#define AT91C_PA3_NPCS12 (AT91C_PIO_PA3) // SPI 1 Peripheral Chip Select 2 +#define AT91C_PIO_PA30 (1 << 30) // Pin Controlled by PA30 +#define AT91C_PA30_IRQ0 (AT91C_PIO_PA30) // External Interrupt 0 +#define AT91C_PA30_PCK2 (AT91C_PIO_PA30) // PMC Programmable Clock Output 2 +#define AT91C_PIO_PA4 (1 << 4) // Pin Controlled by PA4 +#define AT91C_PA4_CTS0 (AT91C_PIO_PA4) // USART 0 Clear To Send +#define AT91C_PA4_NPCS13 (AT91C_PIO_PA4) // SPI 1 Peripheral Chip Select 3 +#define AT91C_PIO_PA5 (1 << 5) // Pin Controlled by PA5 +#define AT91C_PA5_RXD1 (AT91C_PIO_PA5) // USART 1 Receive Data +#define AT91C_PIO_PA6 (1 << 6) // Pin Controlled by PA6 +#define AT91C_PA6_TXD1 (AT91C_PIO_PA6) // USART 1 Transmit Data +#define AT91C_PIO_PA7 (1 << 7) // Pin Controlled by PA7 +#define AT91C_PA7_SCK1 (AT91C_PIO_PA7) // USART 1 Serial Clock +#define AT91C_PA7_NPCS01 (AT91C_PIO_PA7) // SPI 0 Peripheral Chip Select 1 +#define AT91C_PIO_PA8 (1 << 8) // Pin Controlled by PA8 +#define AT91C_PA8_RTS1 (AT91C_PIO_PA8) // USART 1 Ready To Send +#define AT91C_PA8_NPCS02 (AT91C_PIO_PA8) // SPI 0 Peripheral Chip Select 2 +#define AT91C_PIO_PA9 (1 << 9) // Pin Controlled by PA9 +#define AT91C_PA9_CTS1 (AT91C_PIO_PA9) // USART 1 Clear To Send +#define AT91C_PA9_NPCS03 (AT91C_PIO_PA9) // SPI 0 Peripheral Chip Select 3 +#define AT91C_PIO_PB0 (1 << 0) // Pin Controlled by PB0 +#define AT91C_PB0_ETXCK_EREFCK (AT91C_PIO_PB0) // Ethernet MAC Transmit Clock/Reference Clock +#define AT91C_PB0_PCK0 (AT91C_PIO_PB0) // PMC Programmable Clock Output 0 +#define AT91C_PIO_PB1 (1 << 1) // Pin Controlled by PB1 +#define AT91C_PB1_ETXEN (AT91C_PIO_PB1) // Ethernet MAC Transmit Enable +#define AT91C_PIO_PB10 (1 << 10) // Pin Controlled by PB10 +#define AT91C_PB10_ETX2 (AT91C_PIO_PB10) // Ethernet MAC Transmit Data 2 +#define AT91C_PB10_NPCS11 (AT91C_PIO_PB10) // SPI 1 Peripheral Chip Select 1 +#define AT91C_PIO_PB11 (1 << 11) // Pin Controlled by PB11 +#define AT91C_PB11_ETX3 (AT91C_PIO_PB11) // Ethernet MAC Transmit Data 3 +#define AT91C_PB11_NPCS12 (AT91C_PIO_PB11) // SPI 1 Peripheral Chip Select 2 +#define AT91C_PIO_PB12 (1 << 12) // Pin Controlled by PB12 +#define AT91C_PB12_ETXER (AT91C_PIO_PB12) // Ethernet MAC Transmikt Coding Error +#define AT91C_PB12_TCLK0 (AT91C_PIO_PB12) // Timer Counter 0 external clock input +#define AT91C_PIO_PB13 (1 << 13) // Pin Controlled by PB13 +#define AT91C_PB13_ERX2 (AT91C_PIO_PB13) // Ethernet MAC Receive Data 2 +#define AT91C_PB13_NPCS01 (AT91C_PIO_PB13) // SPI 0 Peripheral Chip Select 1 +#define AT91C_PIO_PB14 (1 << 14) // Pin Controlled by PB14 +#define AT91C_PB14_ERX3 (AT91C_PIO_PB14) // Ethernet MAC Receive Data 3 +#define AT91C_PB14_NPCS02 (AT91C_PIO_PB14) // SPI 0 Peripheral Chip Select 2 +#define AT91C_PIO_PB15 (1 << 15) // Pin Controlled by PB15 +#define AT91C_PB15_ERXDV (AT91C_PIO_PB15) // Ethernet MAC Receive Data Valid +#define AT91C_PIO_PB16 (1 << 16) // Pin Controlled by PB16 +#define AT91C_PB16_ECOL (AT91C_PIO_PB16) // Ethernet MAC Collision Detected +#define AT91C_PB16_NPCS13 (AT91C_PIO_PB16) // SPI 1 Peripheral Chip Select 3 +#define AT91C_PIO_PB17 (1 << 17) // Pin Controlled by PB17 +#define AT91C_PB17_ERXCK (AT91C_PIO_PB17) // Ethernet MAC Receive Clock +#define AT91C_PB17_NPCS03 (AT91C_PIO_PB17) // SPI 0 Peripheral Chip Select 3 +#define AT91C_PIO_PB18 (1 << 18) // Pin Controlled by PB18 +#define AT91C_PB18_EF100 (AT91C_PIO_PB18) // Ethernet MAC Force 100 Mbits/sec +#define AT91C_PB18_ADTRG (AT91C_PIO_PB18) // ADC External Trigger +#define AT91C_PIO_PB19 (1 << 19) // Pin Controlled by PB19 +#define AT91C_PB19_PWM0 (AT91C_PIO_PB19) // PWM Channel 0 +#define AT91C_PB19_TCLK1 (AT91C_PIO_PB19) // Timer Counter 1 external clock input +#define AT91C_PIO_PB2 (1 << 2) // Pin Controlled by PB2 +#define AT91C_PB2_ETX0 (AT91C_PIO_PB2) // Ethernet MAC Transmit Data 0 +#define AT91C_PIO_PB20 (1 << 20) // Pin Controlled by PB20 +#define AT91C_PB20_PWM1 (AT91C_PIO_PB20) // PWM Channel 1 +#define AT91C_PB20_PCK0 (AT91C_PIO_PB20) // PMC Programmable Clock Output 0 +#define AT91C_PIO_PB21 (1 << 21) // Pin Controlled by PB21 +#define AT91C_PB21_PWM2 (AT91C_PIO_PB21) // PWM Channel 2 +#define AT91C_PB21_PCK1 (AT91C_PIO_PB21) // PMC Programmable Clock Output 1 +#define AT91C_PIO_PB22 (1 << 22) // Pin Controlled by PB22 +#define AT91C_PB22_PWM3 (AT91C_PIO_PB22) // PWM Channel 3 +#define AT91C_PB22_PCK2 (AT91C_PIO_PB22) // PMC Programmable Clock Output 2 +#define AT91C_PIO_PB23 (1 << 23) // Pin Controlled by PB23 +#define AT91C_PB23_TIOA0 (AT91C_PIO_PB23) // Timer Counter 0 Multipurpose Timer I/O Pin A +#define AT91C_PB23_DCD1 (AT91C_PIO_PB23) // USART 1 Data Carrier Detect +#define AT91C_PIO_PB24 (1 << 24) // Pin Controlled by PB24 +#define AT91C_PB24_TIOB0 (AT91C_PIO_PB24) // Timer Counter 0 Multipurpose Timer I/O Pin B +#define AT91C_PB24_DSR1 (AT91C_PIO_PB24) // USART 1 Data Set ready +#define AT91C_PIO_PB25 (1 << 25) // Pin Controlled by PB25 +#define AT91C_PB25_TIOA1 (AT91C_PIO_PB25) // Timer Counter 1 Multipurpose Timer I/O Pin A +#define AT91C_PB25_DTR1 (AT91C_PIO_PB25) // USART 1 Data Terminal ready +#define AT91C_PIO_PB26 (1 << 26) // Pin Controlled by PB26 +#define AT91C_PB26_TIOB1 (AT91C_PIO_PB26) // Timer Counter 1 Multipurpose Timer I/O Pin B +#define AT91C_PB26_RI1 (AT91C_PIO_PB26) // USART 1 Ring Indicator +#define AT91C_PIO_PB27 (1 << 27) // Pin Controlled by PB27 +#define AT91C_PB27_TIOA2 (AT91C_PIO_PB27) // Timer Counter 2 Multipurpose Timer I/O Pin A +#define AT91C_PB27_PWM0 (AT91C_PIO_PB27) // PWM Channel 0 +#define AT91C_PIO_PB28 (1 << 28) // Pin Controlled by PB28 +#define AT91C_PB28_TIOB2 (AT91C_PIO_PB28) // Timer Counter 2 Multipurpose Timer I/O Pin B +#define AT91C_PB28_PWM1 (AT91C_PIO_PB28) // PWM Channel 1 +#define AT91C_PIO_PB29 (1 << 29) // Pin Controlled by PB29 +#define AT91C_PB29_PCK1 (AT91C_PIO_PB29) // PMC Programmable Clock Output 1 +#define AT91C_PB29_PWM2 (AT91C_PIO_PB29) // PWM Channel 2 +#define AT91C_PIO_PB3 (1 << 3) // Pin Controlled by PB3 +#define AT91C_PB3_ETX1 (AT91C_PIO_PB3) // Ethernet MAC Transmit Data 1 +#define AT91C_PIO_PB30 (1 << 30) // Pin Controlled by PB30 +#define AT91C_PB30_PCK2 (AT91C_PIO_PB30) // PMC Programmable Clock Output 2 +#define AT91C_PB30_PWM3 (AT91C_PIO_PB30) // PWM Channel 3 +#define AT91C_PIO_PB4 (1 << 4) // Pin Controlled by PB4 +#define AT91C_PB4_ECRS_ECRSDV (AT91C_PIO_PB4) // Ethernet MAC Carrier Sense/Carrier Sense and Data Valid +#define AT91C_PIO_PB5 (1 << 5) // Pin Controlled by PB5 +#define AT91C_PB5_ERX0 (AT91C_PIO_PB5) // Ethernet MAC Receive Data 0 +#define AT91C_PIO_PB6 (1 << 6) // Pin Controlled by PB6 +#define AT91C_PB6_ERX1 (AT91C_PIO_PB6) // Ethernet MAC Receive Data 1 +#define AT91C_PIO_PB7 (1 << 7) // Pin Controlled by PB7 +#define AT91C_PB7_ERXER (AT91C_PIO_PB7) // Ethernet MAC Receive Error +#define AT91C_PIO_PB8 (1 << 8) // Pin Controlled by PB8 +#define AT91C_PB8_EMDC (AT91C_PIO_PB8) // Ethernet MAC Management Data Clock +#define AT91C_PIO_PB9 (1 << 9) // Pin Controlled by PB9 +#define AT91C_PB9_EMDIO (AT91C_PIO_PB9) // Ethernet MAC Management Data Input/Output + +// ***************************************************************************** +// PERIPHERAL ID DEFINITIONS FOR AT91SAM7X256 +// ***************************************************************************** +#define AT91C_ID_FIQ ( 0) // Advanced Interrupt Controller (FIQ) +#define AT91C_ID_SYS ( 1) // System Peripheral +#define AT91C_ID_PIOA ( 2) // Parallel IO Controller A +#define AT91C_ID_PIOB ( 3) // Parallel IO Controller B +#define AT91C_ID_SPI0 ( 4) // Serial Peripheral Interface 0 +#define AT91C_ID_SPI1 ( 5) // Serial Peripheral Interface 1 +#define AT91C_ID_US0 ( 6) // USART 0 +#define AT91C_ID_US1 ( 7) // USART 1 +#define AT91C_ID_SSC ( 8) // Serial Synchronous Controller +#define AT91C_ID_TWI ( 9) // Two-Wire Interface +#define AT91C_ID_PWMC (10) // PWM Controller +#define AT91C_ID_UDP (11) // USB Device Port +#define AT91C_ID_TC0 (12) // Timer Counter 0 +#define AT91C_ID_TC1 (13) // Timer Counter 1 +#define AT91C_ID_TC2 (14) // Timer Counter 2 +#define AT91C_ID_CAN (15) // Control Area Network Controller +#define AT91C_ID_EMAC (16) // Ethernet MAC +#define AT91C_ID_ADC (17) // Analog-to-Digital Converter +#define AT91C_ID_AES (18) // Advanced Encryption Standard 128-bit +#define AT91C_ID_TDES (19) // Triple Data Encryption Standard +#define AT91C_ID_20_Reserved (20) // Reserved +#define AT91C_ID_21_Reserved (21) // Reserved +#define AT91C_ID_22_Reserved (22) // Reserved +#define AT91C_ID_23_Reserved (23) // Reserved +#define AT91C_ID_24_Reserved (24) // Reserved +#define AT91C_ID_25_Reserved (25) // Reserved +#define AT91C_ID_26_Reserved (26) // Reserved +#define AT91C_ID_27_Reserved (27) // Reserved +#define AT91C_ID_28_Reserved (28) // Reserved +#define AT91C_ID_29_Reserved (29) // Reserved +#define AT91C_ID_IRQ0 (30) // Advanced Interrupt Controller (IRQ0) +#define AT91C_ID_IRQ1 (31) // Advanced Interrupt Controller (IRQ1) + +// ***************************************************************************** +// BASE ADDRESS DEFINITIONS FOR AT91SAM7X256 +// ***************************************************************************** +#define AT91C_BASE_SYS (0xFFFFF000) // (SYS) Base Address +#define AT91C_BASE_AIC (0xFFFFF000) // (AIC) Base Address +#define AT91C_BASE_PDC_DBGU (0xFFFFF300) // (PDC_DBGU) Base Address +#define AT91C_BASE_DBGU (0xFFFFF200) // (DBGU) Base Address +#define AT91C_BASE_PIOA (0xFFFFF400) // (PIOA) Base Address +#define AT91C_BASE_PIOB (0xFFFFF600) // (PIOB) Base Address +#define AT91C_BASE_CKGR (0xFFFFFC20) // (CKGR) Base Address +#define AT91C_BASE_PMC (0xFFFFFC00) // (PMC) Base Address +#define AT91C_BASE_RSTC (0xFFFFFD00) // (RSTC) Base Address +#define AT91C_BASE_RTTC (0xFFFFFD20) // (RTTC) Base Address +#define AT91C_BASE_PITC (0xFFFFFD30) // (PITC) Base Address +#define AT91C_BASE_WDTC (0xFFFFFD40) // (WDTC) Base Address +#define AT91C_BASE_VREG (0xFFFFFD60) // (VREG) Base Address +#define AT91C_BASE_MC (0xFFFFFF00) // (MC) Base Address +#define AT91C_BASE_PDC_SPI1 (0xFFFE4100) // (PDC_SPI1) Base Address +#define AT91C_BASE_SPI1 (0xFFFE4000) // (SPI1) Base Address +#define AT91C_BASE_PDC_SPI0 (0xFFFE0100) // (PDC_SPI0) Base Address +#define AT91C_BASE_SPI0 (0xFFFE0000) // (SPI0) Base Address +#define AT91C_BASE_PDC_US1 (0xFFFC4100) // (PDC_US1) Base Address +#define AT91C_BASE_US1 (0xFFFC4000) // (US1) Base Address +#define AT91C_BASE_PDC_US0 (0xFFFC0100) // (PDC_US0) Base Address +#define AT91C_BASE_US0 (0xFFFC0000) // (US0) Base Address +#define AT91C_BASE_PDC_SSC (0xFFFD4100) // (PDC_SSC) Base Address +#define AT91C_BASE_SSC (0xFFFD4000) // (SSC) Base Address +#define AT91C_BASE_TWI (0xFFFB8000) // (TWI) Base Address +#define AT91C_BASE_PWMC_CH3 (0xFFFCC260) // (PWMC_CH3) Base Address +#define AT91C_BASE_PWMC_CH2 (0xFFFCC240) // (PWMC_CH2) Base Address +#define AT91C_BASE_PWMC_CH1 (0xFFFCC220) // (PWMC_CH1) Base Address +#define AT91C_BASE_PWMC_CH0 (0xFFFCC200) // (PWMC_CH0) Base Address +#define AT91C_BASE_PWMC (0xFFFCC000) // (PWMC) Base Address +#define AT91C_BASE_UDP (0xFFFB0000) // (UDP) Base Address +#define AT91C_BASE_TC0 (0xFFFA0000) // (TC0) Base Address +#define AT91C_BASE_TC1 (0xFFFA0040) // (TC1) Base Address +#define AT91C_BASE_TC2 (0xFFFA0080) // (TC2) Base Address +#define AT91C_BASE_TCB (0xFFFA0000) // (TCB) Base Address +#define AT91C_BASE_CAN_MB0 (0xFFFD0200) // (CAN_MB0) Base Address +#define AT91C_BASE_CAN_MB1 (0xFFFD0220) // (CAN_MB1) Base Address +#define AT91C_BASE_CAN_MB2 (0xFFFD0240) // (CAN_MB2) Base Address +#define AT91C_BASE_CAN_MB3 (0xFFFD0260) // (CAN_MB3) Base Address +#define AT91C_BASE_CAN_MB4 (0xFFFD0280) // (CAN_MB4) Base Address +#define AT91C_BASE_CAN_MB5 (0xFFFD02A0) // (CAN_MB5) Base Address +#define AT91C_BASE_CAN_MB6 (0xFFFD02C0) // (CAN_MB6) Base Address +#define AT91C_BASE_CAN_MB7 (0xFFFD02E0) // (CAN_MB7) Base Address +#define AT91C_BASE_CAN (0xFFFD0000) // (CAN) Base Address +#define AT91C_BASE_EMAC (0xFFFDC000) // (EMAC) Base Address +#define AT91C_BASE_PDC_ADC (0xFFFD8100) // (PDC_ADC) Base Address +#define AT91C_BASE_ADC (0xFFFD8000) // (ADC) Base Address +#define AT91C_BASE_PDC_AES (0xFFFA4100) // (PDC_AES) Base Address +#define AT91C_BASE_AES (0xFFFA4000) // (AES) Base Address +#define AT91C_BASE_PDC_TDES (0xFFFA8100) // (PDC_TDES) Base Address +#define AT91C_BASE_TDES (0xFFFA8000) // (TDES) Base Address + +// ***************************************************************************** +// MEMORY MAPPING DEFINITIONS FOR AT91SAM7X256 +// ***************************************************************************** +#define AT91C_ISRAM (0x00200000) // Internal SRAM base address +#define AT91C_ISRAM_SIZE (0x00010000) // Internal SRAM size in byte (64 Kbyte) +#define AT91C_IFLASH (0x00100000) // Internal ROM base address +#define AT91C_IFLASH_SIZE (0x00040000) // Internal ROM size in byte (256 Kbyte) + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM7S64/ISR_Support.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM7S64/ISR_Support.h new file mode 100644 index 0000000..af77eca --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM7S64/ISR_Support.h @@ -0,0 +1,131 @@ +;/* +; FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. +; All rights reserved +; +; +; *************************************************************************** +; * * +; * FreeRTOS tutorial books are available in pdf and paperback. * +; * Complete, revised, and edited pdf reference manuals are also * +; * available. * +; * * +; * Purchasing FreeRTOS documentation will not only help you, by * +; * ensuring you get running as quickly as possible and with an * +; * in-depth knowledge of how to use FreeRTOS, it will also help * +; * the FreeRTOS project to continue with its mission of providing * +; * professional grade, cross platform, de facto standard solutions * +; * for microcontrollers - completely free of charge! * +; * * +; * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * +; * * +; * Thank you for using FreeRTOS, and thank you for your support! * +; * * +; *************************************************************************** +; +; +; This file is part of the FreeRTOS distribution. +; +; FreeRTOS is free software; you can redistribute it and/or modify it under +; the terms of the GNU General Public License (version 2) as published by the +; Free Software Foundation AND MODIFIED BY the FreeRTOS exception. +; >>>NOTE<<< The modification to the GPL is included to allow you to +; distribute a combined work that includes FreeRTOS without being obliged to +; provide the source code for proprietary components outside of the FreeRTOS +; kernel. FreeRTOS is distributed in the hope that it will be useful, but +; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +; more details. You should have received a copy of the GNU General Public +; License and the FreeRTOS license exception along with FreeRTOS; if not it +; can be viewed here: http://www.freertos.org/a00114.html and also obtained +; by writing to Richard Barry, contact details for whom are available on the +; FreeRTOS WEB site. +; +; 1 tab == 4 spaces! +; +; http://www.FreeRTOS.org - Documentation, latest information, license and +; contact details. +; +; http://www.SafeRTOS.com - A version that is certified for use in safety +; critical systems. +; +; http://www.OpenRTOS.com - Commercial support, development, porting, +; licensing and training services. +;*/ + EXTERN pxCurrentTCB + EXTERN ulCriticalNesting + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Context save and restore macro definitions +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +portSAVE_CONTEXT MACRO + + ; Push R0 as we are going to use the register. + STMDB SP!, {R0} + + ; Set R0 to point to the task stack pointer. + STMDB SP, {SP}^ + NOP + SUB SP, SP, #4 + LDMIA SP!, {R0} + + ; Push the return address onto the stack. + STMDB R0!, {LR} + + ; Now we have saved LR we can use it instead of R0. + MOV LR, R0 + + ; Pop R0 so we can save it onto the system mode stack. + LDMIA SP!, {R0} + + ; Push all the system mode registers onto the task stack. + STMDB LR, {R0-LR}^ + NOP + SUB LR, LR, #60 + + ; Push the SPSR onto the task stack. + MRS R0, SPSR + STMDB LR!, {R0} + + LDR R0, =ulCriticalNesting + LDR R0, [R0] + STMDB LR!, {R0} + + ; Store the new top of stack for the task. + LDR R1, =pxCurrentTCB + LDR R0, [R1] + STR LR, [R0] + + ENDM + + +portRESTORE_CONTEXT MACRO + + ; Set the LR to the task stack. + LDR R1, =pxCurrentTCB + LDR R0, [R1] + LDR LR, [R0] + + ; The critical nesting depth is the first item on the stack. + ; Load it into the ulCriticalNesting variable. + LDR R0, =ulCriticalNesting + LDMFD LR!, {R1} + STR R1, [R0] + + ; Get the SPSR from the stack. + LDMFD LR!, {R0} + MSR SPSR_cxsf, R0 + + ; Restore all system mode registers for the task. + LDMFD LR, {R0-R14}^ + NOP + + ; Restore the return address. + LDR LR, [LR, #+60] + + ; And return - correcting the offset in the LR to obtain the + ; correct address. + SUBS PC, LR, #4 + + ENDM + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM7S64/lib_AT91SAM7S64.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM7S64/lib_AT91SAM7S64.h new file mode 100644 index 0000000..9d012c4 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM7S64/lib_AT91SAM7S64.h @@ -0,0 +1,3265 @@ +//*---------------------------------------------------------------------------- +//* ATMEL Microcontroller Software Support - ROUSSET - +//*---------------------------------------------------------------------------- +//* The software is delivered "AS IS" without warranty or condition of any +//* kind, either express, implied or statutory. This includes without +//* limitation any warranty or condition with respect to merchantability or +//* fitness for any particular purpose, or against the infringements of +//* intellectual property rights of others. +//*---------------------------------------------------------------------------- +//* File Name : lib_AT91SAM7S64.h +//* Object : AT91SAM7S64 inlined functions +//* Generated : AT91 SW Application Group 07/16/2004 (07:43:09) +//* +//* CVS Reference : /lib_MC_SAM.h/1.3/Thu Mar 25 15:19:14 2004// +//* CVS Reference : /lib_pdc_1363d.h/1.2/Wed Feb 19 09:25:22 2003// +//* CVS Reference : /lib_dbgu.h/1.1/Fri Jan 31 12:18:40 2003// +//* CVS Reference : /lib_ssc.h/1.4/Fri Jan 31 12:19:20 2003// +//* CVS Reference : /lib_spi2.h/1.1/Mon Aug 25 13:23:52 2003// +//* CVS Reference : /lib_PWM_SAM.h/1.3/Thu Jan 22 10:10:50 2004// +//* CVS Reference : /lib_tc_1753b.h/1.1/Fri Jan 31 12:20:02 2003// +//* CVS Reference : /lib_pmc_SAM.h/1.6/Tue Apr 27 13:53:52 2004// +//* CVS Reference : /lib_adc.h/1.6/Fri Oct 17 08:12:38 2003// +//* CVS Reference : /lib_pio.h/1.3/Fri Jan 31 12:18:56 2003// +//* CVS Reference : /lib_twi.h/1.2/Fri Jan 31 12:19:38 2003// +//* CVS Reference : /lib_usart.h/1.5/Thu Nov 21 16:01:54 2002// +//* CVS Reference : /lib_udp.h/1.3/Fri Jan 31 12:19:48 2003// +//* CVS Reference : /lib_aic.h/1.3/Fri Jul 12 07:46:12 2002// +//*---------------------------------------------------------------------------- + +#ifndef lib_AT91SAM7S64_H +#define lib_AT91SAM7S64_H + +/* ***************************************************************************** + SOFTWARE API FOR MC + ***************************************************************************** */ + +#define AT91C_MC_CORRECT_KEY ((unsigned int) 0x5A << 24) // (MC) Correct Protect Key + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_Remap +//* \brief Make Remap +//*---------------------------------------------------------------------------- +__inline void AT91F_MC_Remap (void) // +{ + AT91PS_MC pMC = (AT91PS_MC) AT91C_BASE_MC; + + pMC->MC_RCR = AT91C_MC_RCB; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_CfgModeReg +//* \brief Configure the EFC Mode Register of the MC controller +//*---------------------------------------------------------------------------- +__inline void AT91F_MC_EFC_CfgModeReg ( + AT91PS_MC pMC, // pointer to a MC controller + unsigned int mode) // mode register +{ + // Write to the FMR register + pMC->MC_FMR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_GetModeReg +//* \brief Return MC EFC Mode Regsiter +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_MC_EFC_GetModeReg( + AT91PS_MC pMC) // pointer to a MC controller +{ + return pMC->MC_FMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_ComputeFMCN +//* \brief Return MC EFC Mode Regsiter +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_MC_EFC_ComputeFMCN( + int master_clock) // master clock in Hz +{ + return (master_clock/1000000 +2); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_PerformCmd +//* \brief Perform EFC Command +//*---------------------------------------------------------------------------- +__inline void AT91F_MC_EFC_PerformCmd ( + AT91PS_MC pMC, // pointer to a MC controller + unsigned int transfer_cmd) +{ + pMC->MC_FCR = transfer_cmd; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_GetStatus +//* \brief Return MC EFC Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_MC_EFC_GetStatus( + AT91PS_MC pMC) // pointer to a MC controller +{ + return pMC->MC_FSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_IsInterruptMasked +//* \brief Test if EFC MC Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_MC_EFC_IsInterruptMasked( + AT91PS_MC pMC, // \arg pointer to a MC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_MC_EFC_GetModeReg(pMC) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_IsInterruptSet +//* \brief Test if EFC MC Interrupt is Set +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_MC_EFC_IsInterruptSet( + AT91PS_MC pMC, // \arg pointer to a MC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_MC_EFC_GetStatus(pMC) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR PDC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_SetNextRx +//* \brief Set the next receive transfer descriptor +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_SetNextRx ( + AT91PS_PDC pPDC, // \arg pointer to a PDC controller + char *address, // \arg address to the next bloc to be received + unsigned int bytes) // \arg number of bytes to be received +{ + pPDC->PDC_RNPR = (unsigned int) address; + pPDC->PDC_RNCR = bytes; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_SetNextTx +//* \brief Set the next transmit transfer descriptor +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_SetNextTx ( + AT91PS_PDC pPDC, // \arg pointer to a PDC controller + char *address, // \arg address to the next bloc to be transmitted + unsigned int bytes) // \arg number of bytes to be transmitted +{ + pPDC->PDC_TNPR = (unsigned int) address; + pPDC->PDC_TNCR = bytes; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_SetRx +//* \brief Set the receive transfer descriptor +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_SetRx ( + AT91PS_PDC pPDC, // \arg pointer to a PDC controller + char *address, // \arg address to the next bloc to be received + unsigned int bytes) // \arg number of bytes to be received +{ + pPDC->PDC_RPR = (unsigned int) address; + pPDC->PDC_RCR = bytes; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_SetTx +//* \brief Set the transmit transfer descriptor +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_SetTx ( + AT91PS_PDC pPDC, // \arg pointer to a PDC controller + char *address, // \arg address to the next bloc to be transmitted + unsigned int bytes) // \arg number of bytes to be transmitted +{ + pPDC->PDC_TPR = (unsigned int) address; + pPDC->PDC_TCR = bytes; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_EnableTx +//* \brief Enable transmit +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_EnableTx ( + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + pPDC->PDC_PTCR = AT91C_PDC_TXTEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_EnableRx +//* \brief Enable receive +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_EnableRx ( + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + pPDC->PDC_PTCR = AT91C_PDC_RXTEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_DisableTx +//* \brief Disable transmit +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_DisableTx ( + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + pPDC->PDC_PTCR = AT91C_PDC_TXTDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_DisableRx +//* \brief Disable receive +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_DisableRx ( + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + pPDC->PDC_PTCR = AT91C_PDC_RXTDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_IsTxEmpty +//* \brief Test if the current transfer descriptor has been sent +//*---------------------------------------------------------------------------- +__inline int AT91F_PDC_IsTxEmpty ( // \return return 1 if transfer is complete + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + return !(pPDC->PDC_TCR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_IsNextTxEmpty +//* \brief Test if the next transfer descriptor has been moved to the current td +//*---------------------------------------------------------------------------- +__inline int AT91F_PDC_IsNextTxEmpty ( // \return return 1 if transfer is complete + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + return !(pPDC->PDC_TNCR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_IsRxEmpty +//* \brief Test if the current transfer descriptor has been filled +//*---------------------------------------------------------------------------- +__inline int AT91F_PDC_IsRxEmpty ( // \return return 1 if transfer is complete + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + return !(pPDC->PDC_RCR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_IsNextRxEmpty +//* \brief Test if the next transfer descriptor has been moved to the current td +//*---------------------------------------------------------------------------- +__inline int AT91F_PDC_IsNextRxEmpty ( // \return return 1 if transfer is complete + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + return !(pPDC->PDC_RNCR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_Open +//* \brief Open PDC: disable TX and RX reset transfer descriptors, re-enable RX and TX +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_Open ( + AT91PS_PDC pPDC) // \arg pointer to a PDC controller +{ + //* Disable the RX and TX PDC transfer requests + AT91F_PDC_DisableRx(pPDC); + AT91F_PDC_DisableTx(pPDC); + + //* Reset all Counter register Next buffer first + AT91F_PDC_SetNextTx(pPDC, (char *) 0, 0); + AT91F_PDC_SetNextRx(pPDC, (char *) 0, 0); + AT91F_PDC_SetTx(pPDC, (char *) 0, 0); + AT91F_PDC_SetRx(pPDC, (char *) 0, 0); + + //* Enable the RX and TX PDC transfer requests + AT91F_PDC_EnableRx(pPDC); + AT91F_PDC_EnableTx(pPDC); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_Close +//* \brief Close PDC: disable TX and RX reset transfer descriptors +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_Close ( + AT91PS_PDC pPDC) // \arg pointer to a PDC controller +{ + //* Disable the RX and TX PDC transfer requests + AT91F_PDC_DisableRx(pPDC); + AT91F_PDC_DisableTx(pPDC); + + //* Reset all Counter register Next buffer first + AT91F_PDC_SetNextTx(pPDC, (char *) 0, 0); + AT91F_PDC_SetNextRx(pPDC, (char *) 0, 0); + AT91F_PDC_SetTx(pPDC, (char *) 0, 0); + AT91F_PDC_SetRx(pPDC, (char *) 0, 0); + +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_SendFrame +//* \brief Close PDC: disable TX and RX reset transfer descriptors +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PDC_SendFrame( + AT91PS_PDC pPDC, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + if (AT91F_PDC_IsTxEmpty(pPDC)) { + //* Buffer and next buffer can be initialized + AT91F_PDC_SetTx(pPDC, pBuffer, szBuffer); + AT91F_PDC_SetNextTx(pPDC, pNextBuffer, szNextBuffer); + return 2; + } + else if (AT91F_PDC_IsNextTxEmpty(pPDC)) { + //* Only one buffer can be initialized + AT91F_PDC_SetNextTx(pPDC, pBuffer, szBuffer); + return 1; + } + else { + //* All buffer are in use... + return 0; + } +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_ReceiveFrame +//* \brief Close PDC: disable TX and RX reset transfer descriptors +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PDC_ReceiveFrame ( + AT91PS_PDC pPDC, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + if (AT91F_PDC_IsRxEmpty(pPDC)) { + //* Buffer and next buffer can be initialized + AT91F_PDC_SetRx(pPDC, pBuffer, szBuffer); + AT91F_PDC_SetNextRx(pPDC, pNextBuffer, szNextBuffer); + return 2; + } + else if (AT91F_PDC_IsNextRxEmpty(pPDC)) { + //* Only one buffer can be initialized + AT91F_PDC_SetNextRx(pPDC, pBuffer, szBuffer); + return 1; + } + else { + //* All buffer are in use... + return 0; + } +} +/* ***************************************************************************** + SOFTWARE API FOR DBGU + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_DBGU_InterruptEnable +//* \brief Enable DBGU Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_DBGU_InterruptEnable( + AT91PS_DBGU pDbgu, // \arg pointer to a DBGU controller + unsigned int flag) // \arg dbgu interrupt to be enabled +{ + pDbgu->DBGU_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_DBGU_InterruptDisable +//* \brief Disable DBGU Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_DBGU_InterruptDisable( + AT91PS_DBGU pDbgu, // \arg pointer to a DBGU controller + unsigned int flag) // \arg dbgu interrupt to be disabled +{ + pDbgu->DBGU_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_DBGU_GetInterruptMaskStatus +//* \brief Return DBGU Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_DBGU_GetInterruptMaskStatus( // \return DBGU Interrupt Mask Status + AT91PS_DBGU pDbgu) // \arg pointer to a DBGU controller +{ + return pDbgu->DBGU_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_DBGU_IsInterruptMasked +//* \brief Test if DBGU Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_DBGU_IsInterruptMasked( + AT91PS_DBGU pDbgu, // \arg pointer to a DBGU controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_DBGU_GetInterruptMaskStatus(pDbgu) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR SSC + ***************************************************************************** */ +//* Define the standard I2S mode configuration + +//* Configuration to set in the SSC Transmit Clock Mode Register +//* Parameters : nb_bit_by_slot : 8, 16 or 32 bits +//* nb_slot_by_frame : number of channels +#define AT91C_I2S_ASY_MASTER_TX_SETTING(nb_bit_by_slot, nb_slot_by_frame)( +\ + AT91C_SSC_CKS_DIV +\ + AT91C_SSC_CKO_CONTINOUS +\ + AT91C_SSC_CKG_NONE +\ + AT91C_SSC_START_FALL_RF +\ + AT91C_SSC_STTOUT +\ + ((1<<16) & AT91C_SSC_STTDLY) +\ + ((((nb_bit_by_slot*nb_slot_by_frame)/2)-1) <<24)) + + +//* Configuration to set in the SSC Transmit Frame Mode Register +//* Parameters : nb_bit_by_slot : 8, 16 or 32 bits +//* nb_slot_by_frame : number of channels +#define AT91C_I2S_ASY_TX_FRAME_SETTING(nb_bit_by_slot, nb_slot_by_frame)( +\ + (nb_bit_by_slot-1) +\ + AT91C_SSC_MSBF +\ + (((nb_slot_by_frame-1)<<8) & AT91C_SSC_DATNB) +\ + (((nb_bit_by_slot-1)<<16) & AT91C_SSC_FSLEN) +\ + AT91C_SSC_FSOS_NEGATIVE) + + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_SetBaudrate +//* \brief Set the baudrate according to the CPU clock +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_SetBaudrate ( + AT91PS_SSC pSSC, // \arg pointer to a SSC controller + unsigned int mainClock, // \arg peripheral clock + unsigned int speed) // \arg SSC baudrate +{ + unsigned int baud_value; + //* Define the baud rate divisor register + if (speed == 0) + baud_value = 0; + else + { + baud_value = (unsigned int) (mainClock * 10)/(2*speed); + if ((baud_value % 10) >= 5) + baud_value = (baud_value / 10) + 1; + else + baud_value /= 10; + } + + pSSC->SSC_CMR = baud_value; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_Configure +//* \brief Configure SSC +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_Configure ( + AT91PS_SSC pSSC, // \arg pointer to a SSC controller + unsigned int syst_clock, // \arg System Clock Frequency + unsigned int baud_rate, // \arg Expected Baud Rate Frequency + unsigned int clock_rx, // \arg Receiver Clock Parameters + unsigned int mode_rx, // \arg mode Register to be programmed + unsigned int clock_tx, // \arg Transmitter Clock Parameters + unsigned int mode_tx) // \arg mode Register to be programmed +{ + //* Disable interrupts + pSSC->SSC_IDR = (unsigned int) -1; + + //* Reset receiver and transmitter + pSSC->SSC_CR = AT91C_SSC_SWRST | AT91C_SSC_RXDIS | AT91C_SSC_TXDIS ; + + //* Define the Clock Mode Register + AT91F_SSC_SetBaudrate(pSSC, syst_clock, baud_rate); + + //* Write the Receive Clock Mode Register + pSSC->SSC_RCMR = clock_rx; + + //* Write the Transmit Clock Mode Register + pSSC->SSC_TCMR = clock_tx; + + //* Write the Receive Frame Mode Register + pSSC->SSC_RFMR = mode_rx; + + //* Write the Transmit Frame Mode Register + pSSC->SSC_TFMR = mode_tx; + + //* Clear Transmit and Receive Counters + AT91F_PDC_Open((AT91PS_PDC) &(pSSC->SSC_RPR)); + + +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_EnableRx +//* \brief Enable receiving datas +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_EnableRx ( + AT91PS_SSC pSSC) // \arg pointer to a SSC controller +{ + //* Enable receiver + pSSC->SSC_CR = AT91C_SSC_RXEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_DisableRx +//* \brief Disable receiving datas +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_DisableRx ( + AT91PS_SSC pSSC) // \arg pointer to a SSC controller +{ + //* Disable receiver + pSSC->SSC_CR = AT91C_SSC_RXDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_EnableTx +//* \brief Enable sending datas +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_EnableTx ( + AT91PS_SSC pSSC) // \arg pointer to a SSC controller +{ + //* Enable transmitter + pSSC->SSC_CR = AT91C_SSC_TXEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_DisableTx +//* \brief Disable sending datas +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_DisableTx ( + AT91PS_SSC pSSC) // \arg pointer to a SSC controller +{ + //* Disable transmitter + pSSC->SSC_CR = AT91C_SSC_TXDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_EnableIt +//* \brief Enable SSC IT +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_EnableIt ( + AT91PS_SSC pSSC, // \arg pointer to a SSC controller + unsigned int flag) // \arg IT to be enabled +{ + //* Write to the IER register + pSSC->SSC_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_DisableIt +//* \brief Disable SSC IT +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_DisableIt ( + AT91PS_SSC pSSC, // \arg pointer to a SSC controller + unsigned int flag) // \arg IT to be disabled +{ + //* Write to the IDR register + pSSC->SSC_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_ReceiveFrame +//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initialized with Next Buffer, 0 if PDC is busy +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SSC_ReceiveFrame ( + AT91PS_SSC pSSC, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + return AT91F_PDC_ReceiveFrame( + (AT91PS_PDC) &(pSSC->SSC_RPR), + pBuffer, + szBuffer, + pNextBuffer, + szNextBuffer); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_SendFrame +//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initialized with Next Buffer, 0 if PDC is busy +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SSC_SendFrame( + AT91PS_SSC pSSC, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + return AT91F_PDC_SendFrame( + (AT91PS_PDC) &(pSSC->SSC_RPR), + pBuffer, + szBuffer, + pNextBuffer, + szNextBuffer); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_GetInterruptMaskStatus +//* \brief Return SSC Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SSC_GetInterruptMaskStatus( // \return SSC Interrupt Mask Status + AT91PS_SSC pSsc) // \arg pointer to a SSC controller +{ + return pSsc->SSC_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_IsInterruptMasked +//* \brief Test if SSC Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_SSC_IsInterruptMasked( + AT91PS_SSC pSsc, // \arg pointer to a SSC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_SSC_GetInterruptMaskStatus(pSsc) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR SPI + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_Open +//* \brief Open a SPI Port +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SPI_Open ( + const unsigned int null) // \arg +{ + /* NOT DEFINED AT THIS MOMENT */ + return ( 0 ); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_CfgCs +//* \brief Configure SPI chip select register +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_CfgCs ( + AT91PS_SPI pSPI, // pointer to a SPI controller + int cs, // SPI cs number (0 to 3) + int val) // chip select register +{ + //* Write to the CSR register + *(pSPI->SPI_CSR + cs) = val; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_EnableIt +//* \brief Enable SPI interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_EnableIt ( + AT91PS_SPI pSPI, // pointer to a SPI controller + unsigned int flag) // IT to be enabled +{ + //* Write to the IER register + pSPI->SPI_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_DisableIt +//* \brief Disable SPI interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_DisableIt ( + AT91PS_SPI pSPI, // pointer to a SPI controller + unsigned int flag) // IT to be disabled +{ + //* Write to the IDR register + pSPI->SPI_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_Reset +//* \brief Reset the SPI controller +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_Reset ( + AT91PS_SPI pSPI // pointer to a SPI controller + ) +{ + //* Write to the CR register + pSPI->SPI_CR = AT91C_SPI_SWRST; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_Enable +//* \brief Enable the SPI controller +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_Enable ( + AT91PS_SPI pSPI // pointer to a SPI controller + ) +{ + //* Write to the CR register + pSPI->SPI_CR = AT91C_SPI_SPIEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_Disable +//* \brief Disable the SPI controller +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_Disable ( + AT91PS_SPI pSPI // pointer to a SPI controller + ) +{ + //* Write to the CR register + pSPI->SPI_CR = AT91C_SPI_SPIDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_CfgMode +//* \brief Enable the SPI controller +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_CfgMode ( + AT91PS_SPI pSPI, // pointer to a SPI controller + int mode) // mode register +{ + //* Write to the MR register + pSPI->SPI_MR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_CfgPCS +//* \brief Switch to the correct PCS of SPI Mode Register : Fixed Peripheral Selected +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_CfgPCS ( + AT91PS_SPI pSPI, // pointer to a SPI controller + char PCS_Device) // PCS of the Device +{ + //* Write to the MR register + pSPI->SPI_MR &= 0xFFF0FFFF; + pSPI->SPI_MR |= ( (PCS_Device<<16) & AT91C_SPI_PCS ); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_ReceiveFrame +//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is busy +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SPI_ReceiveFrame ( + AT91PS_SPI pSPI, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + return AT91F_PDC_ReceiveFrame( + (AT91PS_PDC) &(pSPI->SPI_RPR), + pBuffer, + szBuffer, + pNextBuffer, + szNextBuffer); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_SendFrame +//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is bSPIy +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SPI_SendFrame( + AT91PS_SPI pSPI, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + return AT91F_PDC_SendFrame( + (AT91PS_PDC) &(pSPI->SPI_RPR), + pBuffer, + szBuffer, + pNextBuffer, + szNextBuffer); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_Close +//* \brief Close SPI: disable IT disable transfert, close PDC +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_Close ( + AT91PS_SPI pSPI) // \arg pointer to a SPI controller +{ + //* Reset all the Chip Select register + pSPI->SPI_CSR[0] = 0 ; + pSPI->SPI_CSR[1] = 0 ; + pSPI->SPI_CSR[2] = 0 ; + pSPI->SPI_CSR[3] = 0 ; + + //* Reset the SPI mode + pSPI->SPI_MR = 0 ; + + //* Disable all interrupts + pSPI->SPI_IDR = 0xFFFFFFFF ; + + //* Abort the Peripheral Data Transfers + AT91F_PDC_Close((AT91PS_PDC) &(pSPI->SPI_RPR)); + + //* Disable receiver and transmitter and stop any activity immediately + pSPI->SPI_CR = AT91C_SPI_SPIDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_PutChar +//* \brief Send a character,does not check if ready to send +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_PutChar ( + AT91PS_SPI pSPI, + unsigned int character, + unsigned int cs_number ) +{ + unsigned int value_for_cs; + value_for_cs = (~(1 << cs_number)) & 0xF; //Place a zero among a 4 ONEs number + pSPI->SPI_TDR = (character & 0xFFFF) | (value_for_cs << 16); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_GetChar +//* \brief Receive a character,does not check if a character is available +//*---------------------------------------------------------------------------- +__inline int AT91F_SPI_GetChar ( + const AT91PS_SPI pSPI) +{ + return((pSPI->SPI_RDR) & 0xFFFF); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_GetInterruptMaskStatus +//* \brief Return SPI Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SPI_GetInterruptMaskStatus( // \return SPI Interrupt Mask Status + AT91PS_SPI pSpi) // \arg pointer to a SPI controller +{ + return pSpi->SPI_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_IsInterruptMasked +//* \brief Test if SPI Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_SPI_IsInterruptMasked( + AT91PS_SPI pSpi, // \arg pointer to a SPI controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_SPI_GetInterruptMaskStatus(pSpi) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR PWMC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_GetStatus +//* \brief Return PWM Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PWMC_GetStatus( // \return PWM Interrupt Status + AT91PS_PWMC pPWM) // pointer to a PWM controller +{ + return pPWM->PWMC_SR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_InterruptEnable +//* \brief Enable PWM Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_InterruptEnable( + AT91PS_PWMC pPwm, // \arg pointer to a PWM controller + unsigned int flag) // \arg PWM interrupt to be enabled +{ + pPwm->PWMC_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_InterruptDisable +//* \brief Disable PWM Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_InterruptDisable( + AT91PS_PWMC pPwm, // \arg pointer to a PWM controller + unsigned int flag) // \arg PWM interrupt to be disabled +{ + pPwm->PWMC_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_GetInterruptMaskStatus +//* \brief Return PWM Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PWMC_GetInterruptMaskStatus( // \return PWM Interrupt Mask Status + AT91PS_PWMC pPwm) // \arg pointer to a PWM controller +{ + return pPwm->PWMC_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_IsInterruptMasked +//* \brief Test if PWM Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PWMC_IsInterruptMasked( + AT91PS_PWMC pPWM, // \arg pointer to a PWM controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PWMC_GetInterruptMaskStatus(pPWM) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_IsStatusSet +//* \brief Test if PWM Interrupt is Set +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PWMC_IsStatusSet( + AT91PS_PWMC pPWM, // \arg pointer to a PWM controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PWMC_GetStatus(pPWM) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_CfgChannel +//* \brief Test if PWM Interrupt is Set +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_CfgChannel( + AT91PS_PWMC pPWM, // \arg pointer to a PWM controller + unsigned int channelId, // \arg PWM channel ID + unsigned int mode, // \arg PWM mode + unsigned int period, // \arg PWM period + unsigned int duty) // \arg PWM duty cycle +{ + pPWM->PWMC_CH[channelId].PWMC_CMR = mode; + pPWM->PWMC_CH[channelId].PWMC_CDTYR = duty; + pPWM->PWMC_CH[channelId].PWMC_CPRDR = period; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_StartChannel +//* \brief Enable channel +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_StartChannel( + AT91PS_PWMC pPWM, // \arg pointer to a PWM controller + unsigned int flag) // \arg Channels IDs to be enabled +{ + pPWM->PWMC_ENA = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_StopChannel +//* \brief Disable channel +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_StopChannel( + AT91PS_PWMC pPWM, // \arg pointer to a PWM controller + unsigned int flag) // \arg Channels IDs to be enabled +{ + pPWM->PWMC_DIS = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_UpdateChannel +//* \brief Update Period or Duty Cycle +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_UpdateChannel( + AT91PS_PWMC pPWM, // \arg pointer to a PWM controller + unsigned int channelId, // \arg PWM channel ID + unsigned int update) // \arg Channels IDs to be enabled +{ + pPWM->PWMC_CH[channelId].PWMC_CUPDR = update; +} + +/* ***************************************************************************** + SOFTWARE API FOR TC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC_InterruptEnable +//* \brief Enable TC Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_TC_InterruptEnable( + AT91PS_TC pTc, // \arg pointer to a TC controller + unsigned int flag) // \arg TC interrupt to be enabled +{ + pTc->TC_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC_InterruptDisable +//* \brief Disable TC Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_TC_InterruptDisable( + AT91PS_TC pTc, // \arg pointer to a TC controller + unsigned int flag) // \arg TC interrupt to be disabled +{ + pTc->TC_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC_GetInterruptMaskStatus +//* \brief Return TC Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TC_GetInterruptMaskStatus( // \return TC Interrupt Mask Status + AT91PS_TC pTc) // \arg pointer to a TC controller +{ + return pTc->TC_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC_IsInterruptMasked +//* \brief Test if TC Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_TC_IsInterruptMasked( + AT91PS_TC pTc, // \arg pointer to a TC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_TC_GetInterruptMaskStatus(pTc) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR PMC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_CfgSysClkEnableReg +//* \brief Configure the System Clock Enable Register of the PMC controller +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_CfgSysClkEnableReg ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int mode) +{ + //* Write to the SCER register + pPMC->PMC_SCER = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_CfgSysClkDisableReg +//* \brief Configure the System Clock Disable Register of the PMC controller +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_CfgSysClkDisableReg ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int mode) +{ + //* Write to the SCDR register + pPMC->PMC_SCDR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_GetSysClkStatusReg +//* \brief Return the System Clock Status Register of the PMC controller +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_GetSysClkStatusReg ( + AT91PS_PMC pPMC // pointer to a CAN controller + ) +{ + return pPMC->PMC_SCSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_EnablePeriphClock +//* \brief Enable peripheral clock +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_EnablePeriphClock ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int periphIds) // \arg IDs of peripherals to enable +{ + pPMC->PMC_PCER = periphIds; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_DisablePeriphClock +//* \brief Disable peripheral clock +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_DisablePeriphClock ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int periphIds) // \arg IDs of peripherals to enable +{ + pPMC->PMC_PCDR = periphIds; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_GetPeriphClock +//* \brief Get peripheral clock status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_GetPeriphClock ( + AT91PS_PMC pPMC) // \arg pointer to PMC controller +{ + return pPMC->PMC_PCSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_CfgMainOscillatorReg +//* \brief Cfg the main oscillator +//*---------------------------------------------------------------------------- +__inline void AT91F_CKGR_CfgMainOscillatorReg ( + AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller + unsigned int mode) +{ + pCKGR->CKGR_MOR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_GetMainOscillatorReg +//* \brief Cfg the main oscillator +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CKGR_GetMainOscillatorReg ( + AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller +{ + return pCKGR->CKGR_MOR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_EnableMainOscillator +//* \brief Enable the main oscillator +//*---------------------------------------------------------------------------- +__inline void AT91F_CKGR_EnableMainOscillator( + AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller +{ + pCKGR->CKGR_MOR |= AT91C_CKGR_MOSCEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_DisableMainOscillator +//* \brief Disable the main oscillator +//*---------------------------------------------------------------------------- +__inline void AT91F_CKGR_DisableMainOscillator ( + AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller +{ + pCKGR->CKGR_MOR &= ~AT91C_CKGR_MOSCEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_CfgMainOscStartUpTime +//* \brief Cfg MOR Register according to the main osc startup time +//*---------------------------------------------------------------------------- +__inline void AT91F_CKGR_CfgMainOscStartUpTime ( + AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller + unsigned int startup_time, // \arg main osc startup time in microsecond (us) + unsigned int slowClock) // \arg slowClock in Hz +{ + pCKGR->CKGR_MOR &= ~AT91C_CKGR_OSCOUNT; + pCKGR->CKGR_MOR |= ((slowClock * startup_time)/(8*1000000)) << 8; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_GetMainClockFreqReg +//* \brief Cfg the main oscillator +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CKGR_GetMainClockFreqReg ( + AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller +{ + return pCKGR->CKGR_MCFR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_GetMainClock +//* \brief Return Main clock in Hz +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CKGR_GetMainClock ( + AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller + unsigned int slowClock) // \arg slowClock in Hz +{ + return ((pCKGR->CKGR_MCFR & AT91C_CKGR_MAINF) * slowClock) >> 4; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_CfgMCKReg +//* \brief Cfg Master Clock Register +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_CfgMCKReg ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int mode) +{ + pPMC->PMC_MCKR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_GetMCKReg +//* \brief Return Master Clock Register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_GetMCKReg( + AT91PS_PMC pPMC) // \arg pointer to PMC controller +{ + return pPMC->PMC_MCKR; +} + +//*------------------------------------------------------------------------------ +//* \fn AT91F_PMC_GetMasterClock +//* \brief Return master clock in Hz which correponds to processor clock for ARM7 +//*------------------------------------------------------------------------------ +__inline unsigned int AT91F_PMC_GetMasterClock ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller + unsigned int slowClock) // \arg slowClock in Hz +{ + unsigned int reg = pPMC->PMC_MCKR; + unsigned int prescaler = (1 << ((reg & AT91C_PMC_PRES) >> 2)); + unsigned int pllDivider, pllMultiplier; + + switch (reg & AT91C_PMC_CSS) { + case AT91C_PMC_CSS_SLOW_CLK: // Slow clock selected + return slowClock / prescaler; + case AT91C_PMC_CSS_MAIN_CLK: // Main clock is selected + return AT91F_CKGR_GetMainClock(pCKGR, slowClock) / prescaler; + case AT91C_PMC_CSS_PLL_CLK: // PLLB clock is selected + reg = pCKGR->CKGR_PLLR; + pllDivider = (reg & AT91C_CKGR_DIV); + pllMultiplier = ((reg & AT91C_CKGR_MUL) >> 16) + 1; + return AT91F_CKGR_GetMainClock(pCKGR, slowClock) / pllDivider * pllMultiplier / prescaler; + } + return 0; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_EnablePCK +//* \brief Enable peripheral clock +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_EnablePCK ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int pck, // \arg Peripheral clock identifier 0 .. 7 + unsigned int mode) +{ + pPMC->PMC_PCKR[pck] = mode; + pPMC->PMC_SCER = (1 << pck) << 8; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_DisablePCK +//* \brief Enable peripheral clock +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_DisablePCK ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int pck) // \arg Peripheral clock identifier 0 .. 7 +{ + pPMC->PMC_SCDR = (1 << pck) << 8; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_EnableIt +//* \brief Enable PMC interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_EnableIt ( + AT91PS_PMC pPMC, // pointer to a PMC controller + unsigned int flag) // IT to be enabled +{ + //* Write to the IER register + pPMC->PMC_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_DisableIt +//* \brief Disable PMC interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_DisableIt ( + AT91PS_PMC pPMC, // pointer to a PMC controller + unsigned int flag) // IT to be disabled +{ + //* Write to the IDR register + pPMC->PMC_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_GetStatus +//* \brief Return PMC Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_GetStatus( // \return PMC Interrupt Status + AT91PS_PMC pPMC) // pointer to a PMC controller +{ + return pPMC->PMC_SR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_GetInterruptMaskStatus +//* \brief Return PMC Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_GetInterruptMaskStatus( // \return PMC Interrupt Mask Status + AT91PS_PMC pPMC) // pointer to a PMC controller +{ + return pPMC->PMC_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_IsInterruptMasked +//* \brief Test if PMC Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_IsInterruptMasked( + AT91PS_PMC pPMC, // \arg pointer to a PMC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PMC_GetInterruptMaskStatus(pPMC) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_IsStatusSet +//* \brief Test if PMC Status is Set +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_IsStatusSet( + AT91PS_PMC pPMC, // \arg pointer to a PMC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PMC_GetStatus(pPMC) & flag); +}/* ***************************************************************************** + SOFTWARE API FOR ADC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_EnableIt +//* \brief Enable ADC interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_EnableIt ( + AT91PS_ADC pADC, // pointer to a ADC controller + unsigned int flag) // IT to be enabled +{ + //* Write to the IER register + pADC->ADC_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_DisableIt +//* \brief Disable ADC interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_DisableIt ( + AT91PS_ADC pADC, // pointer to a ADC controller + unsigned int flag) // IT to be disabled +{ + //* Write to the IDR register + pADC->ADC_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetStatus +//* \brief Return ADC Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetStatus( // \return ADC Interrupt Status + AT91PS_ADC pADC) // pointer to a ADC controller +{ + return pADC->ADC_SR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetInterruptMaskStatus +//* \brief Return ADC Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetInterruptMaskStatus( // \return ADC Interrupt Mask Status + AT91PS_ADC pADC) // pointer to a ADC controller +{ + return pADC->ADC_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_IsInterruptMasked +//* \brief Test if ADC Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_IsInterruptMasked( + AT91PS_ADC pADC, // \arg pointer to a ADC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_ADC_GetInterruptMaskStatus(pADC) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_IsStatusSet +//* \brief Test if ADC Status is Set +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_IsStatusSet( + AT91PS_ADC pADC, // \arg pointer to a ADC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_ADC_GetStatus(pADC) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_CfgModeReg +//* \brief Configure the Mode Register of the ADC controller +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_CfgModeReg ( + AT91PS_ADC pADC, // pointer to a ADC controller + unsigned int mode) // mode register +{ + //* Write to the MR register + pADC->ADC_MR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetModeReg +//* \brief Return the Mode Register of the ADC controller value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetModeReg ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_MR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_CfgTimings +//* \brief Configure the different necessary timings of the ADC controller +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_CfgTimings ( + AT91PS_ADC pADC, // pointer to a ADC controller + unsigned int mck_clock, // in MHz + unsigned int adc_clock, // in MHz + unsigned int startup_time, // in us + unsigned int sample_and_hold_time) // in ns +{ + unsigned int prescal,startup,shtim; + + prescal = mck_clock/(2*adc_clock) - 1; + startup = adc_clock*startup_time/8 - 1; + shtim = adc_clock*sample_and_hold_time/1000 - 1; + + //* Write to the MR register + pADC->ADC_MR = ( (prescal<<8) & AT91C_ADC_PRESCAL) | ( (startup<<16) & AT91C_ADC_STARTUP) | ( (shtim<<24) & AT91C_ADC_SHTIM); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_EnableChannel +//* \brief Return ADC Timer Register Value +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_EnableChannel ( + AT91PS_ADC pADC, // pointer to a ADC controller + unsigned int channel) // mode register +{ + //* Write to the CHER register + pADC->ADC_CHER = channel; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_DisableChannel +//* \brief Return ADC Timer Register Value +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_DisableChannel ( + AT91PS_ADC pADC, // pointer to a ADC controller + unsigned int channel) // mode register +{ + //* Write to the CHDR register + pADC->ADC_CHDR = channel; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetChannelStatus +//* \brief Return ADC Timer Register Value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetChannelStatus ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CHSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_StartConversion +//* \brief Software request for a analog to digital conversion +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_StartConversion ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + pADC->ADC_CR = AT91C_ADC_START; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_SoftReset +//* \brief Software reset +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_SoftReset ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + pADC->ADC_CR = AT91C_ADC_SWRST; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetLastConvertedData +//* \brief Return the Last Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetLastConvertedData ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_LCDR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH0 +//* \brief Return the Channel 0 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH0 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR0; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH1 +//* \brief Return the Channel 1 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH1 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR1; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH2 +//* \brief Return the Channel 2 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH2 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR2; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH3 +//* \brief Return the Channel 3 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH3 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR3; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH4 +//* \brief Return the Channel 4 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH4 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR4; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH5 +//* \brief Return the Channel 5 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH5 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR5; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH6 +//* \brief Return the Channel 6 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH6 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR6; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH7 +//* \brief Return the Channel 7 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH7 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR7; +} + +/* ***************************************************************************** + SOFTWARE API FOR PIO + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgPeriph +//* \brief Enable pins to be drived by peripheral +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgPeriph( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int periphAEnable, // \arg PERIPH A to enable + unsigned int periphBEnable) // \arg PERIPH B to enable + +{ + pPio->PIO_ASR = periphAEnable; + pPio->PIO_BSR = periphBEnable; + pPio->PIO_PDR = (periphAEnable | periphBEnable); // Set in Periph mode +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgOutput +//* \brief Enable PIO in output mode +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgOutput( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int pioEnable) // \arg PIO to be enabled +{ + pPio->PIO_PER = pioEnable; // Set in PIO mode + pPio->PIO_OER = pioEnable; // Configure in Output +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgInput +//* \brief Enable PIO in input mode +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgInput( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int inputEnable) // \arg PIO to be enabled +{ + // Disable output + pPio->PIO_ODR = inputEnable; + pPio->PIO_PER = inputEnable; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgOpendrain +//* \brief Configure PIO in open drain +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgOpendrain( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int multiDrvEnable) // \arg pio to be configured in open drain +{ + // Configure the multi-drive option + pPio->PIO_MDDR = ~multiDrvEnable; + pPio->PIO_MDER = multiDrvEnable; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgPullup +//* \brief Enable pullup on PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgPullup( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int pullupEnable) // \arg enable pullup on PIO +{ + // Connect or not Pullup + pPio->PIO_PPUDR = ~pullupEnable; + pPio->PIO_PPUER = pullupEnable; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgDirectDrive +//* \brief Enable direct drive on PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgDirectDrive( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int directDrive) // \arg PIO to be configured with direct drive + +{ + // Configure the Direct Drive + pPio->PIO_OWDR = ~directDrive; + pPio->PIO_OWER = directDrive; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgInputFilter +//* \brief Enable input filter on input PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgInputFilter( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int inputFilter) // \arg PIO to be configured with input filter + +{ + // Configure the Direct Drive + pPio->PIO_IFDR = ~inputFilter; + pPio->PIO_IFER = inputFilter; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetInput +//* \brief Return PIO input value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetInput( // \return PIO input + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_PDSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsInputSet +//* \brief Test if PIO is input flag is active +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsInputSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetInput(pPio) & flag); +} + + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_SetOutput +//* \brief Set to 1 output PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_SetOutput( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg output to be set +{ + pPio->PIO_SODR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_ClearOutput +//* \brief Set to 0 output PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_ClearOutput( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg output to be cleared +{ + pPio->PIO_CODR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_ForceOutput +//* \brief Force output when Direct drive option is enabled +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_ForceOutput( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg output to be forced +{ + pPio->PIO_ODSR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_Enable +//* \brief Enable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_Enable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio to be enabled +{ + pPio->PIO_PER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_Disable +//* \brief Disable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_Disable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio to be disabled +{ + pPio->PIO_PDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetStatus +//* \brief Return PIO Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetStatus( // \return PIO Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_PSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsSet +//* \brief Test if PIO is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_OutputEnable +//* \brief Output Enable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_OutputEnable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio output to be enabled +{ + pPio->PIO_OER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_OutputDisable +//* \brief Output Enable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_OutputDisable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio output to be disabled +{ + pPio->PIO_ODR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetOutputStatus +//* \brief Return PIO Output Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetOutputStatus( // \return PIO Output Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_OSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsOuputSet +//* \brief Test if PIO Output is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsOutputSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetOutputStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_InputFilterEnable +//* \brief Input Filter Enable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_InputFilterEnable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio input filter to be enabled +{ + pPio->PIO_IFER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_InputFilterDisable +//* \brief Input Filter Disable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_InputFilterDisable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio input filter to be disabled +{ + pPio->PIO_IFDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetInputFilterStatus +//* \brief Return PIO Input Filter Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetInputFilterStatus( // \return PIO Input Filter Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_IFSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsInputFilterSet +//* \brief Test if PIO Input filter is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsInputFilterSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetInputFilterStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetOutputDataStatus +//* \brief Return PIO Output Data Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetOutputDataStatus( // \return PIO Output Data Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_ODSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_InterruptEnable +//* \brief Enable PIO Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_InterruptEnable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio interrupt to be enabled +{ + pPio->PIO_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_InterruptDisable +//* \brief Disable PIO Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_InterruptDisable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio interrupt to be disabled +{ + pPio->PIO_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetInterruptMaskStatus +//* \brief Return PIO Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetInterruptMaskStatus( // \return PIO Interrupt Mask Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetInterruptStatus +//* \brief Return PIO Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetInterruptStatus( // \return PIO Interrupt Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_ISR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsInterruptMasked +//* \brief Test if PIO Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsInterruptMasked( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetInterruptMaskStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsInterruptSet +//* \brief Test if PIO Interrupt is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsInterruptSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetInterruptStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_MultiDriverEnable +//* \brief Multi Driver Enable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_MultiDriverEnable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio to be enabled +{ + pPio->PIO_MDER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_MultiDriverDisable +//* \brief Multi Driver Disable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_MultiDriverDisable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio to be disabled +{ + pPio->PIO_MDDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetMultiDriverStatus +//* \brief Return PIO Multi Driver Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetMultiDriverStatus( // \return PIO Multi Driver Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_MDSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsMultiDriverSet +//* \brief Test if PIO MultiDriver is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsMultiDriverSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetMultiDriverStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_A_RegisterSelection +//* \brief PIO A Register Selection +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_A_RegisterSelection( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio A register selection +{ + pPio->PIO_ASR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_B_RegisterSelection +//* \brief PIO B Register Selection +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_B_RegisterSelection( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio B register selection +{ + pPio->PIO_BSR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_Get_AB_RegisterStatus +//* \brief Return PIO Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_Get_AB_RegisterStatus( // \return PIO AB Register Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_ABSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsAB_RegisterSet +//* \brief Test if PIO AB Register is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsAB_RegisterSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_Get_AB_RegisterStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_OutputWriteEnable +//* \brief Output Write Enable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_OutputWriteEnable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio output write to be enabled +{ + pPio->PIO_OWER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_OutputWriteDisable +//* \brief Output Write Disable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_OutputWriteDisable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio output write to be disabled +{ + pPio->PIO_OWDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetOutputWriteStatus +//* \brief Return PIO Output Write Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetOutputWriteStatus( // \return PIO Output Write Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_OWSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsOutputWriteSet +//* \brief Test if PIO OutputWrite is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsOutputWriteSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetOutputWriteStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetCfgPullup +//* \brief Return PIO Configuration Pullup +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetCfgPullup( // \return PIO Configuration Pullup + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_PPUSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsOutputDataStatusSet +//* \brief Test if PIO Output Data Status is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsOutputDataStatusSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetOutputDataStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsCfgPullupStatusSet +//* \brief Test if PIO Configuration Pullup Status is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsCfgPullupStatusSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (~AT91F_PIO_GetCfgPullup(pPio) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR TWI + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_EnableIt +//* \brief Enable TWI IT +//*---------------------------------------------------------------------------- +__inline void AT91F_TWI_EnableIt ( + AT91PS_TWI pTWI, // \arg pointer to a TWI controller + unsigned int flag) // \arg IT to be enabled +{ + //* Write to the IER register + pTWI->TWI_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_DisableIt +//* \brief Disable TWI IT +//*---------------------------------------------------------------------------- +__inline void AT91F_TWI_DisableIt ( + AT91PS_TWI pTWI, // \arg pointer to a TWI controller + unsigned int flag) // \arg IT to be disabled +{ + //* Write to the IDR register + pTWI->TWI_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_Configure +//* \brief Configure TWI in master mode +//*---------------------------------------------------------------------------- +__inline void AT91F_TWI_Configure ( AT91PS_TWI pTWI ) // \arg pointer to a TWI controller +{ + //* Disable interrupts + pTWI->TWI_IDR = (unsigned int) -1; + + //* Reset peripheral + pTWI->TWI_CR = AT91C_TWI_SWRST; + + //* Set Master mode + pTWI->TWI_CR = AT91C_TWI_MSEN | AT91C_TWI_SVDIS; + +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_GetInterruptMaskStatus +//* \brief Return TWI Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TWI_GetInterruptMaskStatus( // \return TWI Interrupt Mask Status + AT91PS_TWI pTwi) // \arg pointer to a TWI controller +{ + return pTwi->TWI_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_IsInterruptMasked +//* \brief Test if TWI Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_TWI_IsInterruptMasked( + AT91PS_TWI pTwi, // \arg pointer to a TWI controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_TWI_GetInterruptMaskStatus(pTwi) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR USART + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_Baudrate +//* \brief Calculate the baudrate +//* Standard Asynchronous Mode : 8 bits , 1 stop , no parity +#define AT91C_US_ASYNC_MODE ( AT91C_US_USMODE_NORMAL + \ + AT91C_US_NBSTOP_1_BIT + \ + AT91C_US_PAR_NONE + \ + AT91C_US_CHRL_8_BITS + \ + AT91C_US_CLKS_CLOCK ) + +//* Standard External Asynchronous Mode : 8 bits , 1 stop , no parity +#define AT91C_US_ASYNC_SCK_MODE ( AT91C_US_USMODE_NORMAL + \ + AT91C_US_NBSTOP_1_BIT + \ + AT91C_US_PAR_NONE + \ + AT91C_US_CHRL_8_BITS + \ + AT91C_US_CLKS_EXT ) + +//* Standard Synchronous Mode : 8 bits , 1 stop , no parity +#define AT91C_US_SYNC_MODE ( AT91C_US_SYNC + \ + AT91C_US_USMODE_NORMAL + \ + AT91C_US_NBSTOP_1_BIT + \ + AT91C_US_PAR_NONE + \ + AT91C_US_CHRL_8_BITS + \ + AT91C_US_CLKS_CLOCK ) + +//* SCK used Label +#define AT91C_US_SCK_USED (AT91C_US_CKLO | AT91C_US_CLKS_EXT) + +//* Standard ISO T=0 Mode : 8 bits , 1 stop , parity +#define AT91C_US_ISO_READER_MODE ( AT91C_US_USMODE_ISO7816_0 + \ + AT91C_US_CLKS_CLOCK +\ + AT91C_US_NBSTOP_1_BIT + \ + AT91C_US_PAR_EVEN + \ + AT91C_US_CHRL_8_BITS + \ + AT91C_US_CKLO +\ + AT91C_US_OVER) + +//* Standard IRDA mode +#define AT91C_US_ASYNC_IRDA_MODE ( AT91C_US_USMODE_IRDA + \ + AT91C_US_NBSTOP_1_BIT + \ + AT91C_US_PAR_NONE + \ + AT91C_US_CHRL_8_BITS + \ + AT91C_US_CLKS_CLOCK ) + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_Baudrate +//* \brief Caluculate baud_value according to the main clock and the baud rate +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_US_Baudrate ( + const unsigned int main_clock, // \arg peripheral clock + const unsigned int baud_rate) // \arg UART baudrate +{ + unsigned int baud_value = ((main_clock*10)/(baud_rate * 16)); + if ((baud_value % 10) >= 5) + baud_value = (baud_value / 10) + 1; + else + baud_value /= 10; + return baud_value; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_SetBaudrate +//* \brief Set the baudrate according to the CPU clock +//*---------------------------------------------------------------------------- +__inline void AT91F_US_SetBaudrate ( + AT91PS_USART pUSART, // \arg pointer to a USART controller + unsigned int mainClock, // \arg peripheral clock + unsigned int speed) // \arg UART baudrate +{ + //* Define the baud rate divisor register + pUSART->US_BRGR = AT91F_US_Baudrate(mainClock, speed); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_SetTimeguard +//* \brief Set USART timeguard +//*---------------------------------------------------------------------------- +__inline void AT91F_US_SetTimeguard ( + AT91PS_USART pUSART, // \arg pointer to a USART controller + unsigned int timeguard) // \arg timeguard value +{ + //* Write the Timeguard Register + pUSART->US_TTGR = timeguard ; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_EnableIt +//* \brief Enable USART IT +//*---------------------------------------------------------------------------- +__inline void AT91F_US_EnableIt ( + AT91PS_USART pUSART, // \arg pointer to a USART controller + unsigned int flag) // \arg IT to be enabled +{ + //* Write to the IER register + pUSART->US_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_DisableIt +//* \brief Disable USART IT +//*---------------------------------------------------------------------------- +__inline void AT91F_US_DisableIt ( + AT91PS_USART pUSART, // \arg pointer to a USART controller + unsigned int flag) // \arg IT to be disabled +{ + //* Write to the IER register + pUSART->US_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_Configure +//* \brief Configure USART +//*---------------------------------------------------------------------------- +__inline void AT91F_US_Configure ( + AT91PS_USART pUSART, // \arg pointer to a USART controller + unsigned int mainClock, // \arg peripheral clock + unsigned int mode , // \arg mode Register to be programmed + unsigned int baudRate , // \arg baudrate to be programmed + unsigned int timeguard ) // \arg timeguard to be programmed +{ + //* Disable interrupts + pUSART->US_IDR = (unsigned int) -1; + + //* Reset receiver and transmitter + pUSART->US_CR = AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RXDIS | AT91C_US_TXDIS ; + + //* Define the baud rate divisor register + AT91F_US_SetBaudrate(pUSART, mainClock, baudRate); + + //* Write the Timeguard Register + AT91F_US_SetTimeguard(pUSART, timeguard); + + //* Clear Transmit and Receive Counters + AT91F_PDC_Open((AT91PS_PDC) &(pUSART->US_RPR)); + + //* Define the USART mode + pUSART->US_MR = mode ; + +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_EnableRx +//* \brief Enable receiving characters +//*---------------------------------------------------------------------------- +__inline void AT91F_US_EnableRx ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Enable receiver + pUSART->US_CR = AT91C_US_RXEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_EnableTx +//* \brief Enable sending characters +//*---------------------------------------------------------------------------- +__inline void AT91F_US_EnableTx ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Enable transmitter + pUSART->US_CR = AT91C_US_TXEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_ResetRx +//* \brief Reset Receiver and re-enable it +//*---------------------------------------------------------------------------- +__inline void AT91F_US_ResetRx ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Reset receiver + pUSART->US_CR = AT91C_US_RSTRX; + //* Re-Enable receiver + pUSART->US_CR = AT91C_US_RXEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_ResetTx +//* \brief Reset Transmitter and re-enable it +//*---------------------------------------------------------------------------- +__inline void AT91F_US_ResetTx ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Reset transmitter + pUSART->US_CR = AT91C_US_RSTTX; + //* Enable transmitter + pUSART->US_CR = AT91C_US_TXEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_DisableRx +//* \brief Disable Receiver +//*---------------------------------------------------------------------------- +__inline void AT91F_US_DisableRx ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Disable receiver + pUSART->US_CR = AT91C_US_RXDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_DisableTx +//* \brief Disable Transmitter +//*---------------------------------------------------------------------------- +__inline void AT91F_US_DisableTx ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Disable transmitter + pUSART->US_CR = AT91C_US_TXDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_Close +//* \brief Close USART: disable IT disable receiver and transmitter, close PDC +//*---------------------------------------------------------------------------- +__inline void AT91F_US_Close ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Reset the baud rate divisor register + pUSART->US_BRGR = 0 ; + + //* Reset the USART mode + pUSART->US_MR = 0 ; + + //* Reset the Timeguard Register + pUSART->US_TTGR = 0; + + //* Disable all interrupts + pUSART->US_IDR = 0xFFFFFFFF ; + + //* Abort the Peripheral Data Transfers + AT91F_PDC_Close((AT91PS_PDC) &(pUSART->US_RPR)); + + //* Disable receiver and transmitter and stop any activity immediately + pUSART->US_CR = AT91C_US_TXDIS | AT91C_US_RXDIS | AT91C_US_RSTTX | AT91C_US_RSTRX ; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_TxReady +//* \brief Return 1 if a character can be written in US_THR +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_US_TxReady ( + AT91PS_USART pUSART ) // \arg pointer to a USART controller +{ + return (pUSART->US_CSR & AT91C_US_TXRDY); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_RxReady +//* \brief Return 1 if a character can be read in US_RHR +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_US_RxReady ( + AT91PS_USART pUSART ) // \arg pointer to a USART controller +{ + return (pUSART->US_CSR & AT91C_US_RXRDY); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_Error +//* \brief Return the error flag +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_US_Error ( + AT91PS_USART pUSART ) // \arg pointer to a USART controller +{ + return (pUSART->US_CSR & + (AT91C_US_OVRE | // Overrun error + AT91C_US_FRAME | // Framing error + AT91C_US_PARE)); // Parity error +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_PutChar +//* \brief Send a character,does not check if ready to send +//*---------------------------------------------------------------------------- +__inline void AT91F_US_PutChar ( + AT91PS_USART pUSART, + int character ) +{ + pUSART->US_THR = (character & 0x1FF); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_GetChar +//* \brief Receive a character,does not check if a character is available +//*---------------------------------------------------------------------------- +__inline int AT91F_US_GetChar ( + const AT91PS_USART pUSART) +{ + return((pUSART->US_RHR) & 0x1FF); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_SendFrame +//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is busy +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_US_SendFrame( + AT91PS_USART pUSART, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + return AT91F_PDC_SendFrame( + (AT91PS_PDC) &(pUSART->US_RPR), + pBuffer, + szBuffer, + pNextBuffer, + szNextBuffer); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_ReceiveFrame +//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is busy +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_US_ReceiveFrame ( + AT91PS_USART pUSART, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + return AT91F_PDC_ReceiveFrame( + (AT91PS_PDC) &(pUSART->US_RPR), + pBuffer, + szBuffer, + pNextBuffer, + szNextBuffer); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_SetIrdaFilter +//* \brief Set the value of IrDa filter tregister +//*---------------------------------------------------------------------------- +__inline void AT91F_US_SetIrdaFilter ( + AT91PS_USART pUSART, + unsigned char value +) +{ + pUSART->US_IF = value; +} + +/* ***************************************************************************** + SOFTWARE API FOR UDP + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EnableIt +//* \brief Enable UDP IT +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EnableIt ( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned int flag) // \arg IT to be enabled +{ + //* Write to the IER register + pUDP->UDP_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_DisableIt +//* \brief Disable UDP IT +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_DisableIt ( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned int flag) // \arg IT to be disabled +{ + //* Write to the IDR register + pUDP->UDP_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_SetAddress +//* \brief Set UDP functional address +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_SetAddress ( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char address) // \arg new UDP address +{ + pUDP->UDP_FADDR = (AT91C_UDP_FEN | address); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EnableEp +//* \brief Enable Endpoint +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EnableEp ( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned int flag) // \arg endpoints to be enabled +{ + pUDP->UDP_GLBSTATE |= flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_DisableEp +//* \brief Enable Endpoint +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_DisableEp ( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned int flag) // \arg endpoints to be enabled +{ + pUDP->UDP_GLBSTATE &= ~(flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_SetState +//* \brief Set UDP Device state +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_SetState ( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned int flag) // \arg new UDP address +{ + pUDP->UDP_GLBSTATE &= ~(AT91C_UDP_FADDEN | AT91C_UDP_CONFG); + pUDP->UDP_GLBSTATE |= flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_GetState +//* \brief return UDP Device state +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_UDP_GetState ( // \return the UDP device state + AT91PS_UDP pUDP) // \arg pointer to a UDP controller +{ + return (pUDP->UDP_GLBSTATE & (AT91C_UDP_FADDEN | AT91C_UDP_CONFG)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_ResetEp +//* \brief Reset UDP endpoint +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_ResetEp ( // \return the UDP device state + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned int flag) // \arg Endpoints to be reset +{ + pUDP->UDP_RSTEP = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpStall +//* \brief Endpoint will STALL requests +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EpStall( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint) // \arg endpoint number +{ + pUDP->UDP_CSR[endpoint] |= AT91C_UDP_FORCESTALL; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpWrite +//* \brief Write value in the DPR +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EpWrite( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint, // \arg endpoint number + unsigned char value) // \arg value to be written in the DPR +{ + pUDP->UDP_FDR[endpoint] = value; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpRead +//* \brief Return value from the DPR +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_UDP_EpRead( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint) // \arg endpoint number +{ + return pUDP->UDP_FDR[endpoint]; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpEndOfWr +//* \brief Notify the UDP that values in DPR are ready to be sent +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EpEndOfWr( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint) // \arg endpoint number +{ + pUDP->UDP_CSR[endpoint] |= AT91C_UDP_TXPKTRDY; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpClear +//* \brief Clear flag in the endpoint CSR register +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EpClear( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint, // \arg endpoint number + unsigned int flag) // \arg flag to be cleared +{ + pUDP->UDP_CSR[endpoint] &= ~(flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpSet +//* \brief Set flag in the endpoint CSR register +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EpSet( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint, // \arg endpoint number + unsigned int flag) // \arg flag to be cleared +{ + pUDP->UDP_CSR[endpoint] |= flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpStatus +//* \brief Return the endpoint CSR register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_UDP_EpStatus( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint) // \arg endpoint number +{ + return pUDP->UDP_CSR[endpoint]; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_GetInterruptMaskStatus +//* \brief Return UDP Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_UDP_GetInterruptMaskStatus( // \return UDP Interrupt Mask Status + AT91PS_UDP pUdp) // \arg pointer to a UDP controller +{ + return pUdp->UDP_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_IsInterruptMasked +//* \brief Test if UDP Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_UDP_IsInterruptMasked( + AT91PS_UDP pUdp, // \arg pointer to a UDP controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_UDP_GetInterruptMaskStatus(pUdp) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR AIC + ***************************************************************************** */ +#define AT91C_AIC_BRANCH_OPCODE ((void (*) ()) 0xE51FFF20) // ldr, pc, [pc, #-&F20] + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_ConfigureIt +//* \brief Interrupt Handler Initialization +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AIC_ConfigureIt ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id, // \arg interrupt number to initialize + unsigned int priority, // \arg priority to give to the interrupt + unsigned int src_type, // \arg activation and sense of activation + void (*newHandler) (void) ) // \arg address of the interrupt handler +{ + unsigned int oldHandler; + unsigned int mask ; + + oldHandler = pAic->AIC_SVR[irq_id]; + + mask = 0x1 << irq_id ; + //* Disable the interrupt on the interrupt controller + pAic->AIC_IDCR = mask ; + //* Save the interrupt handler routine pointer and the interrupt priority + pAic->AIC_SVR[irq_id] = (unsigned int) newHandler ; + //* Store the Source Mode Register + pAic->AIC_SMR[irq_id] = src_type | priority ; + //* Clear the interrupt on the interrupt controller + pAic->AIC_ICCR = mask ; + + return oldHandler; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_EnableIt +//* \brief Enable corresponding IT number +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_EnableIt ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id ) // \arg interrupt number to initialize +{ + //* Enable the interrupt on the interrupt controller + pAic->AIC_IECR = 0x1 << irq_id ; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_DisableIt +//* \brief Disable corresponding IT number +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_DisableIt ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id ) // \arg interrupt number to initialize +{ + unsigned int mask = 0x1 << irq_id; + //* Disable the interrupt on the interrupt controller + pAic->AIC_IDCR = mask ; + //* Clear the interrupt on the Interrupt Controller ( if one is pending ) + pAic->AIC_ICCR = mask ; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_ClearIt +//* \brief Clear corresponding IT number +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_ClearIt ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id) // \arg interrupt number to initialize +{ + //* Clear the interrupt on the Interrupt Controller ( if one is pending ) + pAic->AIC_ICCR = (0x1 << irq_id); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_AcknowledgeIt +//* \brief Acknowledge corresponding IT number +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_AcknowledgeIt ( + AT91PS_AIC pAic) // \arg pointer to the AIC registers +{ + pAic->AIC_EOICR = pAic->AIC_EOICR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_SetExceptionVector +//* \brief Configure vector handler +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AIC_SetExceptionVector ( + unsigned int *pVector, // \arg pointer to the AIC registers + void (*Handler) () ) // \arg Interrupt Handler +{ + unsigned int oldVector = *pVector; + + if ((unsigned int) Handler == (unsigned int) AT91C_AIC_BRANCH_OPCODE) + *pVector = (unsigned int) AT91C_AIC_BRANCH_OPCODE; + else + *pVector = (((((unsigned int) Handler) - ((unsigned int) pVector) - 0x8) >> 2) & 0x00FFFFFF) | 0xEA000000; + + return oldVector; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_Trig +//* \brief Trig an IT +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_Trig ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id) // \arg interrupt number +{ + pAic->AIC_ISCR = (0x1 << irq_id) ; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_IsActive +//* \brief Test if an IT is active +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AIC_IsActive ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id) // \arg Interrupt Number +{ + return (pAic->AIC_ISR & (0x1 << irq_id)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_IsPending +//* \brief Test if an IT is pending +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AIC_IsPending ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id) // \arg Interrupt Number +{ + return (pAic->AIC_IPR & (0x1 << irq_id)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_Open +//* \brief Set exception vectors and AIC registers to default values +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_Open( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + void (*IrqHandler) (), // \arg Default IRQ vector exception + void (*FiqHandler) (), // \arg Default FIQ vector exception + void (*DefaultHandler) (), // \arg Default Handler set in ISR + void (*SpuriousHandler) (), // \arg Default Spurious Handler + unsigned int protectMode) // \arg Debug Control Register +{ + int i; + + // Disable all interrupts and set IVR to the default handler + for (i = 0; i < 32; ++i) { + AT91F_AIC_DisableIt(pAic, i); + AT91F_AIC_ConfigureIt(pAic, i, AT91C_AIC_PRIOR_LOWEST, AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE, DefaultHandler); + } + + // Set the IRQ exception vector + AT91F_AIC_SetExceptionVector((unsigned int *) 0x18, IrqHandler); + // Set the Fast Interrupt exception vector + AT91F_AIC_SetExceptionVector((unsigned int *) 0x1C, FiqHandler); + + pAic->AIC_SPU = (unsigned int) SpuriousHandler; + pAic->AIC_DCR = protectMode; +} +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_CfgPMC +//* \brief Enable Peripheral clock in PMC for MC +//*---------------------------------------------------------------------------- +__inline void AT91F_MC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_DBGU_CfgPMC +//* \brief Enable Peripheral clock in PMC for DBGU +//*---------------------------------------------------------------------------- +__inline void AT91F_DBGU_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_DBGU_CfgPIO +//* \brief Configure PIO controllers to drive DBGU signals +//*---------------------------------------------------------------------------- +__inline void AT91F_DBGU_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA10_DTXD ) | + ((unsigned int) AT91C_PA9_DRXD ), // Peripheral A + 0); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWMC_CH3_CfgPIO +//* \brief Configure PIO controllers to drive PWMC_CH3 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_CH3_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PA14_PWM3 ) | + ((unsigned int) AT91C_PA7_PWM3 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWMC_CH2_CfgPIO +//* \brief Configure PIO controllers to drive PWMC_CH2 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_CH2_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA2_PWM2 ), // Peripheral A + ((unsigned int) AT91C_PA25_PWM2 ) | + ((unsigned int) AT91C_PA13_PWM2 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWMC_CH1_CfgPIO +//* \brief Configure PIO controllers to drive PWMC_CH1 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_CH1_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA1_PWM1 ), // Peripheral A + ((unsigned int) AT91C_PA24_PWM1 ) | + ((unsigned int) AT91C_PA12_PWM1 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWMC_CH0_CfgPIO +//* \brief Configure PIO controllers to drive PWMC_CH0 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_CH0_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA0_PWM0 ), // Peripheral A + ((unsigned int) AT91C_PA23_PWM0 ) | + ((unsigned int) AT91C_PA11_PWM0 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_CfgPMC +//* \brief Enable Peripheral clock in PMC for SSC +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SSC)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_CfgPIO +//* \brief Configure PIO controllers to drive SSC signals +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA17_TD ) | + ((unsigned int) AT91C_PA15_TF ) | + ((unsigned int) AT91C_PA19_RK ) | + ((unsigned int) AT91C_PA18_RD ) | + ((unsigned int) AT91C_PA20_RF ) | + ((unsigned int) AT91C_PA16_TK ), // Peripheral A + 0); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_CfgPMC +//* \brief Enable Peripheral clock in PMC for SPI +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SPI)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_CfgPIO +//* \brief Configure PIO controllers to drive SPI signals +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA11_NPCS0 ) | + ((unsigned int) AT91C_PA13_MOSI ) | + ((unsigned int) AT91C_PA31_NPCS1 ) | + ((unsigned int) AT91C_PA12_MISO ) | + ((unsigned int) AT91C_PA14_SPCK ), // Peripheral A + ((unsigned int) AT91C_PA9_NPCS1 ) | + ((unsigned int) AT91C_PA30_NPCS2 ) | + ((unsigned int) AT91C_PA10_NPCS2 ) | + ((unsigned int) AT91C_PA22_NPCS3 ) | + ((unsigned int) AT91C_PA3_NPCS3 ) | + ((unsigned int) AT91C_PA5_NPCS3 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWMC_CfgPMC +//* \brief Enable Peripheral clock in PMC for PWMC +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_PWMC)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC2_CfgPMC +//* \brief Enable Peripheral clock in PMC for TC2 +//*---------------------------------------------------------------------------- +__inline void AT91F_TC2_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_TC2)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC2_CfgPIO +//* \brief Configure PIO controllers to drive TC2 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_TC2_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PA26_TIOA2 ) | + ((unsigned int) AT91C_PA27_TIOB2 ) | + ((unsigned int) AT91C_PA29_TCLK2 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC1_CfgPMC +//* \brief Enable Peripheral clock in PMC for TC1 +//*---------------------------------------------------------------------------- +__inline void AT91F_TC1_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_TC1)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC1_CfgPIO +//* \brief Configure PIO controllers to drive TC1 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_TC1_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PA15_TIOA1 ) | + ((unsigned int) AT91C_PA16_TIOB1 ) | + ((unsigned int) AT91C_PA28_TCLK1 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC0_CfgPMC +//* \brief Enable Peripheral clock in PMC for TC0 +//*---------------------------------------------------------------------------- +__inline void AT91F_TC0_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_TC0)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC0_CfgPIO +//* \brief Configure PIO controllers to drive TC0 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_TC0_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PA0_TIOA0 ) | + ((unsigned int) AT91C_PA1_TIOB0 ) | + ((unsigned int) AT91C_PA4_TCLK0 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_CfgPMC +//* \brief Enable Peripheral clock in PMC for PMC +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_CfgPIO +//* \brief Configure PIO controllers to drive PMC signals +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PA17_PCK1 ) | + ((unsigned int) AT91C_PA21_PCK1 ) | + ((unsigned int) AT91C_PA31_PCK2 ) | + ((unsigned int) AT91C_PA18_PCK2 ) | + ((unsigned int) AT91C_PA6_PCK0 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_CfgPMC +//* \brief Enable Peripheral clock in PMC for ADC +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_ADC)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_CfgPIO +//* \brief Configure PIO controllers to drive ADC signals +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PA8_ADTRG )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIOA_CfgPMC +//* \brief Enable Peripheral clock in PMC for PIOA +//*---------------------------------------------------------------------------- +__inline void AT91F_PIOA_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_PIOA)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_CfgPMC +//* \brief Enable Peripheral clock in PMC for TWI +//*---------------------------------------------------------------------------- +__inline void AT91F_TWI_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_TWI)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_CfgPIO +//* \brief Configure PIO controllers to drive TWI signals +//*---------------------------------------------------------------------------- +__inline void AT91F_TWI_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA3_TWD ) | + ((unsigned int) AT91C_PA4_TWCK ), // Peripheral A + 0); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US1_CfgPMC +//* \brief Enable Peripheral clock in PMC for US1 +//*---------------------------------------------------------------------------- +__inline void AT91F_US1_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_US1)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US1_CfgPIO +//* \brief Configure PIO controllers to drive US1 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_US1_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA21_RXD1 ) | + ((unsigned int) AT91C_PA27_DTR1 ) | + ((unsigned int) AT91C_PA26_DCD1 ) | + ((unsigned int) AT91C_PA22_TXD1 ) | + ((unsigned int) AT91C_PA24_RTS1 ) | + ((unsigned int) AT91C_PA23_SCK1 ) | + ((unsigned int) AT91C_PA28_DSR1 ) | + ((unsigned int) AT91C_PA29_RI1 ) | + ((unsigned int) AT91C_PA25_CTS1 ), // Peripheral A + 0); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US0_CfgPMC +//* \brief Enable Peripheral clock in PMC for US0 +//*---------------------------------------------------------------------------- +__inline void AT91F_US0_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_US0)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US0_CfgPIO +//* \brief Configure PIO controllers to drive US0 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_US0_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA5_RXD0 ) | + ((unsigned int) AT91C_PA6_TXD0 ) | + ((unsigned int) AT91C_PA7_RTS0 ) | + ((unsigned int) AT91C_PA8_CTS0 ), // Peripheral A + ((unsigned int) AT91C_PA2_SCK0 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_CfgPMC +//* \brief Enable Peripheral clock in PMC for UDP +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_UDP)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_CfgPMC +//* \brief Enable Peripheral clock in PMC for AIC +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_IRQ0) | + ((unsigned int) 1 << AT91C_ID_FIQ) | + ((unsigned int) 1 << AT91C_ID_IRQ1)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_CfgPIO +//* \brief Configure PIO controllers to drive AIC signals +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA30_IRQ1 ), // Peripheral A + ((unsigned int) AT91C_PA20_IRQ0 ) | + ((unsigned int) AT91C_PA19_FIQ )); // Peripheral B +} + +#endif // lib_AT91SAM7S64_H diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X128.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X128.h new file mode 100644 index 0000000..805a2bc --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X128.h @@ -0,0 +1,4558 @@ +//* ---------------------------------------------------------------------------- +//* ATMEL Microcontroller Software Support - ROUSSET - +//* ---------------------------------------------------------------------------- +//* DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR +//* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +//* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE +//* DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT, +//* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +//* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +//* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +//* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +//* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +//* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//* ---------------------------------------------------------------------------- +//* File Name : lib_AT91SAM7X128.h +//* Object : AT91SAM7X128 inlined functions +//* Generated : AT91 SW Application Group 05/20/2005 (16:22:23) +//* +//* CVS Reference : /lib_dbgu.h/1.1/Fri Jan 31 12:18:40 2003// +//* CVS Reference : /lib_pmc_SAM7X.h/1.1/Tue Feb 1 08:32:10 2005// +//* CVS Reference : /lib_VREG_6085B.h/1.1/Tue Feb 1 16:20:47 2005// +//* CVS Reference : /lib_rstc_6098A.h/1.1/Wed Oct 6 10:39:20 2004// +//* CVS Reference : /lib_ssc.h/1.4/Fri Jan 31 12:19:20 2003// +//* CVS Reference : /lib_wdtc_6080A.h/1.1/Wed Oct 6 10:38:30 2004// +//* CVS Reference : /lib_usart.h/1.5/Thu Nov 21 16:01:54 2002// +//* CVS Reference : /lib_spi2.h/1.1/Mon Aug 25 14:23:52 2003// +//* CVS Reference : /lib_pitc_6079A.h/1.2/Tue Nov 9 14:43:56 2004// +//* CVS Reference : /lib_aic_6075b.h/1.1/Fri May 20 14:01:19 2005// +//* CVS Reference : /lib_aes_6149a.h/1.1/Mon Jan 17 07:43:09 2005// +//* CVS Reference : /lib_twi.h/1.3/Mon Jul 19 14:27:58 2004// +//* CVS Reference : /lib_adc.h/1.6/Fri Oct 17 09:12:38 2003// +//* CVS Reference : /lib_rttc_6081A.h/1.1/Wed Oct 6 10:39:38 2004// +//* CVS Reference : /lib_udp.h/1.4/Wed Feb 16 08:39:34 2005// +//* CVS Reference : /lib_des3_6150a.h/1.1/Mon Jan 17 09:19:19 2005// +//* CVS Reference : /lib_tc_1753b.h/1.1/Fri Jan 31 12:20:02 2003// +//* CVS Reference : /lib_MC_SAM7X.h/1.1/Thu Mar 25 15:19:14 2004// +//* CVS Reference : /lib_pio.h/1.3/Fri Jan 31 12:18:56 2003// +//* CVS Reference : /lib_can_AT91.h/1.4/Fri Oct 17 09:12:50 2003// +//* CVS Reference : /lib_PWM_SAM.h/1.3/Thu Jan 22 10:10:50 2004// +//* CVS Reference : /lib_pdc.h/1.2/Tue Jul 2 13:29:40 2002// +//* ---------------------------------------------------------------------------- + +#ifndef lib_AT91SAM7X128_H +#define lib_AT91SAM7X128_H + +/* ***************************************************************************** + SOFTWARE API FOR AIC + ***************************************************************************** */ +#define AT91C_AIC_BRANCH_OPCODE ((void (*) ()) 0xE51FFF20) // ldr, pc, [pc, #-&F20] + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_ConfigureIt +//* \brief Interrupt Handler Initialization +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AIC_ConfigureIt ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id, // \arg interrupt number to initialize + unsigned int priority, // \arg priority to give to the interrupt + unsigned int src_type, // \arg activation and sense of activation + void (*newHandler) (void) ) // \arg address of the interrupt handler +{ + unsigned int oldHandler; + unsigned int mask ; + + oldHandler = pAic->AIC_SVR[irq_id]; + + mask = 0x1 << irq_id ; + //* Disable the interrupt on the interrupt controller + pAic->AIC_IDCR = mask ; + //* Save the interrupt handler routine pointer and the interrupt priority + pAic->AIC_SVR[irq_id] = (unsigned int) newHandler ; + //* Store the Source Mode Register + pAic->AIC_SMR[irq_id] = src_type | priority ; + //* Clear the interrupt on the interrupt controller + pAic->AIC_ICCR = mask ; + + return oldHandler; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_EnableIt +//* \brief Enable corresponding IT number +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_EnableIt ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id ) // \arg interrupt number to initialize +{ + //* Enable the interrupt on the interrupt controller + pAic->AIC_IECR = 0x1 << irq_id ; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_DisableIt +//* \brief Disable corresponding IT number +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_DisableIt ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id ) // \arg interrupt number to initialize +{ + unsigned int mask = 0x1 << irq_id; + //* Disable the interrupt on the interrupt controller + pAic->AIC_IDCR = mask ; + //* Clear the interrupt on the Interrupt Controller ( if one is pending ) + pAic->AIC_ICCR = mask ; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_ClearIt +//* \brief Clear corresponding IT number +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_ClearIt ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id) // \arg interrupt number to initialize +{ + //* Clear the interrupt on the Interrupt Controller ( if one is pending ) + pAic->AIC_ICCR = (0x1 << irq_id); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_AcknowledgeIt +//* \brief Acknowledge corresponding IT number +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_AcknowledgeIt ( + AT91PS_AIC pAic) // \arg pointer to the AIC registers +{ + pAic->AIC_EOICR = pAic->AIC_EOICR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_SetExceptionVector +//* \brief Configure vector handler +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AIC_SetExceptionVector ( + unsigned int *pVector, // \arg pointer to the AIC registers + void (*Handler) () ) // \arg Interrupt Handler +{ + unsigned int oldVector = *pVector; + + if ((unsigned int) Handler == (unsigned int) AT91C_AIC_BRANCH_OPCODE) + *pVector = (unsigned int) AT91C_AIC_BRANCH_OPCODE; + else + *pVector = (((((unsigned int) Handler) - ((unsigned int) pVector) - 0x8) >> 2) & 0x00FFFFFF) | 0xEA000000; + + return oldVector; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_Trig +//* \brief Trig an IT +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_Trig ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id) // \arg interrupt number +{ + pAic->AIC_ISCR = (0x1 << irq_id) ; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_IsActive +//* \brief Test if an IT is active +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AIC_IsActive ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id) // \arg Interrupt Number +{ + return (pAic->AIC_ISR & (0x1 << irq_id)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_IsPending +//* \brief Test if an IT is pending +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AIC_IsPending ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id) // \arg Interrupt Number +{ + return (pAic->AIC_IPR & (0x1 << irq_id)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_Open +//* \brief Set exception vectors and AIC registers to default values +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_Open( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + void (*IrqHandler) (), // \arg Default IRQ vector exception + void (*FiqHandler) (), // \arg Default FIQ vector exception + void (*DefaultHandler) (), // \arg Default Handler set in ISR + void (*SpuriousHandler) (), // \arg Default Spurious Handler + unsigned int protectMode) // \arg Debug Control Register +{ + int i; + + // Disable all interrupts and set IVR to the default handler + for (i = 0; i < 32; ++i) { + AT91F_AIC_DisableIt(pAic, i); + AT91F_AIC_ConfigureIt(pAic, i, AT91C_AIC_PRIOR_LOWEST, AT91C_AIC_SRCTYPE_HIGH_LEVEL, DefaultHandler); + } + + // Set the IRQ exception vector + AT91F_AIC_SetExceptionVector((unsigned int *) 0x18, IrqHandler); + // Set the Fast Interrupt exception vector + AT91F_AIC_SetExceptionVector((unsigned int *) 0x1C, FiqHandler); + + pAic->AIC_SPU = (unsigned int) SpuriousHandler; + pAic->AIC_DCR = protectMode; +} +/* ***************************************************************************** + SOFTWARE API FOR PDC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_SetNextRx +//* \brief Set the next receive transfer descriptor +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_SetNextRx ( + AT91PS_PDC pPDC, // \arg pointer to a PDC controller + char *address, // \arg address to the next bloc to be received + unsigned int bytes) // \arg number of bytes to be received +{ + pPDC->PDC_RNPR = (unsigned int) address; + pPDC->PDC_RNCR = bytes; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_SetNextTx +//* \brief Set the next transmit transfer descriptor +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_SetNextTx ( + AT91PS_PDC pPDC, // \arg pointer to a PDC controller + char *address, // \arg address to the next bloc to be transmitted + unsigned int bytes) // \arg number of bytes to be transmitted +{ + pPDC->PDC_TNPR = (unsigned int) address; + pPDC->PDC_TNCR = bytes; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_SetRx +//* \brief Set the receive transfer descriptor +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_SetRx ( + AT91PS_PDC pPDC, // \arg pointer to a PDC controller + char *address, // \arg address to the next bloc to be received + unsigned int bytes) // \arg number of bytes to be received +{ + pPDC->PDC_RPR = (unsigned int) address; + pPDC->PDC_RCR = bytes; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_SetTx +//* \brief Set the transmit transfer descriptor +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_SetTx ( + AT91PS_PDC pPDC, // \arg pointer to a PDC controller + char *address, // \arg address to the next bloc to be transmitted + unsigned int bytes) // \arg number of bytes to be transmitted +{ + pPDC->PDC_TPR = (unsigned int) address; + pPDC->PDC_TCR = bytes; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_EnableTx +//* \brief Enable transmit +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_EnableTx ( + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + pPDC->PDC_PTCR = AT91C_PDC_TXTEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_EnableRx +//* \brief Enable receive +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_EnableRx ( + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + pPDC->PDC_PTCR = AT91C_PDC_RXTEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_DisableTx +//* \brief Disable transmit +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_DisableTx ( + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + pPDC->PDC_PTCR = AT91C_PDC_TXTDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_DisableRx +//* \brief Disable receive +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_DisableRx ( + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + pPDC->PDC_PTCR = AT91C_PDC_RXTDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_IsTxEmpty +//* \brief Test if the current transfer descriptor has been sent +//*---------------------------------------------------------------------------- +__inline int AT91F_PDC_IsTxEmpty ( // \return return 1 if transfer is complete + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + return !(pPDC->PDC_TCR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_IsNextTxEmpty +//* \brief Test if the next transfer descriptor has been moved to the current td +//*---------------------------------------------------------------------------- +__inline int AT91F_PDC_IsNextTxEmpty ( // \return return 1 if transfer is complete + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + return !(pPDC->PDC_TNCR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_IsRxEmpty +//* \brief Test if the current transfer descriptor has been filled +//*---------------------------------------------------------------------------- +__inline int AT91F_PDC_IsRxEmpty ( // \return return 1 if transfer is complete + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + return !(pPDC->PDC_RCR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_IsNextRxEmpty +//* \brief Test if the next transfer descriptor has been moved to the current td +//*---------------------------------------------------------------------------- +__inline int AT91F_PDC_IsNextRxEmpty ( // \return return 1 if transfer is complete + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + return !(pPDC->PDC_RNCR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_Open +//* \brief Open PDC: disable TX and RX reset transfer descriptors, re-enable RX and TX +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_Open ( + AT91PS_PDC pPDC) // \arg pointer to a PDC controller +{ + //* Disable the RX and TX PDC transfer requests + AT91F_PDC_DisableRx(pPDC); + AT91F_PDC_DisableTx(pPDC); + + //* Reset all Counter register Next buffer first + AT91F_PDC_SetNextTx(pPDC, (char *) 0, 0); + AT91F_PDC_SetNextRx(pPDC, (char *) 0, 0); + AT91F_PDC_SetTx(pPDC, (char *) 0, 0); + AT91F_PDC_SetRx(pPDC, (char *) 0, 0); + + //* Enable the RX and TX PDC transfer requests + AT91F_PDC_EnableRx(pPDC); + AT91F_PDC_EnableTx(pPDC); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_Close +//* \brief Close PDC: disable TX and RX reset transfer descriptors +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_Close ( + AT91PS_PDC pPDC) // \arg pointer to a PDC controller +{ + //* Disable the RX and TX PDC transfer requests + AT91F_PDC_DisableRx(pPDC); + AT91F_PDC_DisableTx(pPDC); + + //* Reset all Counter register Next buffer first + AT91F_PDC_SetNextTx(pPDC, (char *) 0, 0); + AT91F_PDC_SetNextRx(pPDC, (char *) 0, 0); + AT91F_PDC_SetTx(pPDC, (char *) 0, 0); + AT91F_PDC_SetRx(pPDC, (char *) 0, 0); + +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_SendFrame +//* \brief Close PDC: disable TX and RX reset transfer descriptors +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PDC_SendFrame( + AT91PS_PDC pPDC, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + if (AT91F_PDC_IsTxEmpty(pPDC)) { + //* Buffer and next buffer can be initialized + AT91F_PDC_SetTx(pPDC, pBuffer, szBuffer); + AT91F_PDC_SetNextTx(pPDC, pNextBuffer, szNextBuffer); + return 2; + } + else if (AT91F_PDC_IsNextTxEmpty(pPDC)) { + //* Only one buffer can be initialized + AT91F_PDC_SetNextTx(pPDC, pBuffer, szBuffer); + return 1; + } + else { + //* All buffer are in use... + return 0; + } +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_ReceiveFrame +//* \brief Close PDC: disable TX and RX reset transfer descriptors +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PDC_ReceiveFrame ( + AT91PS_PDC pPDC, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + if (AT91F_PDC_IsRxEmpty(pPDC)) { + //* Buffer and next buffer can be initialized + AT91F_PDC_SetRx(pPDC, pBuffer, szBuffer); + AT91F_PDC_SetNextRx(pPDC, pNextBuffer, szNextBuffer); + return 2; + } + else if (AT91F_PDC_IsNextRxEmpty(pPDC)) { + //* Only one buffer can be initialized + AT91F_PDC_SetNextRx(pPDC, pBuffer, szBuffer); + return 1; + } + else { + //* All buffer are in use... + return 0; + } +} +/* ***************************************************************************** + SOFTWARE API FOR DBGU + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_DBGU_InterruptEnable +//* \brief Enable DBGU Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_DBGU_InterruptEnable( + AT91PS_DBGU pDbgu, // \arg pointer to a DBGU controller + unsigned int flag) // \arg dbgu interrupt to be enabled +{ + pDbgu->DBGU_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_DBGU_InterruptDisable +//* \brief Disable DBGU Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_DBGU_InterruptDisable( + AT91PS_DBGU pDbgu, // \arg pointer to a DBGU controller + unsigned int flag) // \arg dbgu interrupt to be disabled +{ + pDbgu->DBGU_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_DBGU_GetInterruptMaskStatus +//* \brief Return DBGU Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_DBGU_GetInterruptMaskStatus( // \return DBGU Interrupt Mask Status + AT91PS_DBGU pDbgu) // \arg pointer to a DBGU controller +{ + return pDbgu->DBGU_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_DBGU_IsInterruptMasked +//* \brief Test if DBGU Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_DBGU_IsInterruptMasked( + AT91PS_DBGU pDbgu, // \arg pointer to a DBGU controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_DBGU_GetInterruptMaskStatus(pDbgu) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR PIO + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgPeriph +//* \brief Enable pins to be drived by peripheral +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgPeriph( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int periphAEnable, // \arg PERIPH A to enable + unsigned int periphBEnable) // \arg PERIPH B to enable + +{ + pPio->PIO_ASR = periphAEnable; + pPio->PIO_BSR = periphBEnable; + pPio->PIO_PDR = (periphAEnable | periphBEnable); // Set in Periph mode +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgOutput +//* \brief Enable PIO in output mode +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgOutput( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int pioEnable) // \arg PIO to be enabled +{ + pPio->PIO_PER = pioEnable; // Set in PIO mode + pPio->PIO_OER = pioEnable; // Configure in Output +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgInput +//* \brief Enable PIO in input mode +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgInput( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int inputEnable) // \arg PIO to be enabled +{ + // Disable output + pPio->PIO_ODR = inputEnable; + pPio->PIO_PER = inputEnable; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgOpendrain +//* \brief Configure PIO in open drain +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgOpendrain( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int multiDrvEnable) // \arg pio to be configured in open drain +{ + // Configure the multi-drive option + pPio->PIO_MDDR = ~multiDrvEnable; + pPio->PIO_MDER = multiDrvEnable; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgPullup +//* \brief Enable pullup on PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgPullup( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int pullupEnable) // \arg enable pullup on PIO +{ + // Connect or not Pullup + pPio->PIO_PPUDR = ~pullupEnable; + pPio->PIO_PPUER = pullupEnable; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgDirectDrive +//* \brief Enable direct drive on PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgDirectDrive( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int directDrive) // \arg PIO to be configured with direct drive + +{ + // Configure the Direct Drive + pPio->PIO_OWDR = ~directDrive; + pPio->PIO_OWER = directDrive; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgInputFilter +//* \brief Enable input filter on input PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgInputFilter( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int inputFilter) // \arg PIO to be configured with input filter + +{ + // Configure the Direct Drive + pPio->PIO_IFDR = ~inputFilter; + pPio->PIO_IFER = inputFilter; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetInput +//* \brief Return PIO input value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetInput( // \return PIO input + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_PDSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsInputSet +//* \brief Test if PIO is input flag is active +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsInputSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetInput(pPio) & flag); +} + + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_SetOutput +//* \brief Set to 1 output PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_SetOutput( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg output to be set +{ + pPio->PIO_SODR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_ClearOutput +//* \brief Set to 0 output PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_ClearOutput( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg output to be cleared +{ + pPio->PIO_CODR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_ForceOutput +//* \brief Force output when Direct drive option is enabled +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_ForceOutput( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg output to be forced +{ + pPio->PIO_ODSR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_Enable +//* \brief Enable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_Enable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio to be enabled +{ + pPio->PIO_PER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_Disable +//* \brief Disable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_Disable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio to be disabled +{ + pPio->PIO_PDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetStatus +//* \brief Return PIO Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetStatus( // \return PIO Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_PSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsSet +//* \brief Test if PIO is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_OutputEnable +//* \brief Output Enable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_OutputEnable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio output to be enabled +{ + pPio->PIO_OER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_OutputDisable +//* \brief Output Enable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_OutputDisable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio output to be disabled +{ + pPio->PIO_ODR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetOutputStatus +//* \brief Return PIO Output Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetOutputStatus( // \return PIO Output Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_OSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsOuputSet +//* \brief Test if PIO Output is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsOutputSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetOutputStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_InputFilterEnable +//* \brief Input Filter Enable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_InputFilterEnable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio input filter to be enabled +{ + pPio->PIO_IFER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_InputFilterDisable +//* \brief Input Filter Disable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_InputFilterDisable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio input filter to be disabled +{ + pPio->PIO_IFDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetInputFilterStatus +//* \brief Return PIO Input Filter Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetInputFilterStatus( // \return PIO Input Filter Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_IFSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsInputFilterSet +//* \brief Test if PIO Input filter is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsInputFilterSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetInputFilterStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetOutputDataStatus +//* \brief Return PIO Output Data Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetOutputDataStatus( // \return PIO Output Data Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_ODSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_InterruptEnable +//* \brief Enable PIO Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_InterruptEnable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio interrupt to be enabled +{ + pPio->PIO_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_InterruptDisable +//* \brief Disable PIO Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_InterruptDisable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio interrupt to be disabled +{ + pPio->PIO_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetInterruptMaskStatus +//* \brief Return PIO Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetInterruptMaskStatus( // \return PIO Interrupt Mask Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetInterruptStatus +//* \brief Return PIO Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetInterruptStatus( // \return PIO Interrupt Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_ISR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsInterruptMasked +//* \brief Test if PIO Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsInterruptMasked( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetInterruptMaskStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsInterruptSet +//* \brief Test if PIO Interrupt is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsInterruptSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetInterruptStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_MultiDriverEnable +//* \brief Multi Driver Enable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_MultiDriverEnable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio to be enabled +{ + pPio->PIO_MDER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_MultiDriverDisable +//* \brief Multi Driver Disable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_MultiDriverDisable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio to be disabled +{ + pPio->PIO_MDDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetMultiDriverStatus +//* \brief Return PIO Multi Driver Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetMultiDriverStatus( // \return PIO Multi Driver Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_MDSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsMultiDriverSet +//* \brief Test if PIO MultiDriver is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsMultiDriverSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetMultiDriverStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_A_RegisterSelection +//* \brief PIO A Register Selection +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_A_RegisterSelection( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio A register selection +{ + pPio->PIO_ASR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_B_RegisterSelection +//* \brief PIO B Register Selection +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_B_RegisterSelection( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio B register selection +{ + pPio->PIO_BSR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_Get_AB_RegisterStatus +//* \brief Return PIO Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_Get_AB_RegisterStatus( // \return PIO AB Register Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_ABSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsAB_RegisterSet +//* \brief Test if PIO AB Register is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsAB_RegisterSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_Get_AB_RegisterStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_OutputWriteEnable +//* \brief Output Write Enable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_OutputWriteEnable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio output write to be enabled +{ + pPio->PIO_OWER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_OutputWriteDisable +//* \brief Output Write Disable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_OutputWriteDisable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio output write to be disabled +{ + pPio->PIO_OWDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetOutputWriteStatus +//* \brief Return PIO Output Write Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetOutputWriteStatus( // \return PIO Output Write Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_OWSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsOutputWriteSet +//* \brief Test if PIO OutputWrite is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsOutputWriteSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetOutputWriteStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetCfgPullup +//* \brief Return PIO Configuration Pullup +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetCfgPullup( // \return PIO Configuration Pullup + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_PPUSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsOutputDataStatusSet +//* \brief Test if PIO Output Data Status is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsOutputDataStatusSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetOutputDataStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsCfgPullupStatusSet +//* \brief Test if PIO Configuration Pullup Status is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsCfgPullupStatusSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (~AT91F_PIO_GetCfgPullup(pPio) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR PMC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_CfgSysClkEnableReg +//* \brief Configure the System Clock Enable Register of the PMC controller +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_CfgSysClkEnableReg ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int mode) +{ + //* Write to the SCER register + pPMC->PMC_SCER = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_CfgSysClkDisableReg +//* \brief Configure the System Clock Disable Register of the PMC controller +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_CfgSysClkDisableReg ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int mode) +{ + //* Write to the SCDR register + pPMC->PMC_SCDR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_GetSysClkStatusReg +//* \brief Return the System Clock Status Register of the PMC controller +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_GetSysClkStatusReg ( + AT91PS_PMC pPMC // pointer to a CAN controller + ) +{ + return pPMC->PMC_SCSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_EnablePeriphClock +//* \brief Enable peripheral clock +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_EnablePeriphClock ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int periphIds) // \arg IDs of peripherals to enable +{ + pPMC->PMC_PCER = periphIds; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_DisablePeriphClock +//* \brief Disable peripheral clock +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_DisablePeriphClock ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int periphIds) // \arg IDs of peripherals to enable +{ + pPMC->PMC_PCDR = periphIds; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_GetPeriphClock +//* \brief Get peripheral clock status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_GetPeriphClock ( + AT91PS_PMC pPMC) // \arg pointer to PMC controller +{ + return pPMC->PMC_PCSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_CfgMainOscillatorReg +//* \brief Cfg the main oscillator +//*---------------------------------------------------------------------------- +__inline void AT91F_CKGR_CfgMainOscillatorReg ( + AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller + unsigned int mode) +{ + pCKGR->CKGR_MOR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_GetMainOscillatorReg +//* \brief Cfg the main oscillator +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CKGR_GetMainOscillatorReg ( + AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller +{ + return pCKGR->CKGR_MOR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_EnableMainOscillator +//* \brief Enable the main oscillator +//*---------------------------------------------------------------------------- +__inline void AT91F_CKGR_EnableMainOscillator( + AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller +{ + pCKGR->CKGR_MOR |= AT91C_CKGR_MOSCEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_DisableMainOscillator +//* \brief Disable the main oscillator +//*---------------------------------------------------------------------------- +__inline void AT91F_CKGR_DisableMainOscillator ( + AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller +{ + pCKGR->CKGR_MOR &= ~AT91C_CKGR_MOSCEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_CfgMainOscStartUpTime +//* \brief Cfg MOR Register according to the main osc startup time +//*---------------------------------------------------------------------------- +__inline void AT91F_CKGR_CfgMainOscStartUpTime ( + AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller + unsigned int startup_time, // \arg main osc startup time in microsecond (us) + unsigned int slowClock) // \arg slowClock in Hz +{ + pCKGR->CKGR_MOR &= ~AT91C_CKGR_OSCOUNT; + pCKGR->CKGR_MOR |= ((slowClock * startup_time)/(8*1000000)) << 8; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_GetMainClockFreqReg +//* \brief Cfg the main oscillator +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CKGR_GetMainClockFreqReg ( + AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller +{ + return pCKGR->CKGR_MCFR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_GetMainClock +//* \brief Return Main clock in Hz +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CKGR_GetMainClock ( + AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller + unsigned int slowClock) // \arg slowClock in Hz +{ + return ((pCKGR->CKGR_MCFR & AT91C_CKGR_MAINF) * slowClock) >> 4; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_CfgMCKReg +//* \brief Cfg Master Clock Register +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_CfgMCKReg ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int mode) +{ + pPMC->PMC_MCKR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_GetMCKReg +//* \brief Return Master Clock Register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_GetMCKReg( + AT91PS_PMC pPMC) // \arg pointer to PMC controller +{ + return pPMC->PMC_MCKR; +} + +//*------------------------------------------------------------------------------ +//* \fn AT91F_PMC_GetMasterClock +//* \brief Return master clock in Hz which correponds to processor clock for ARM7 +//*------------------------------------------------------------------------------ +__inline unsigned int AT91F_PMC_GetMasterClock ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller + unsigned int slowClock) // \arg slowClock in Hz +{ + unsigned int reg = pPMC->PMC_MCKR; + unsigned int prescaler = (1 << ((reg & AT91C_PMC_PRES) >> 2)); + unsigned int pllDivider, pllMultiplier; + + switch (reg & AT91C_PMC_CSS) { + case AT91C_PMC_CSS_SLOW_CLK: // Slow clock selected + return slowClock / prescaler; + case AT91C_PMC_CSS_MAIN_CLK: // Main clock is selected + return AT91F_CKGR_GetMainClock(pCKGR, slowClock) / prescaler; + case AT91C_PMC_CSS_PLL_CLK: // PLLB clock is selected + reg = pCKGR->CKGR_PLLR; + pllDivider = (reg & AT91C_CKGR_DIV); + pllMultiplier = ((reg & AT91C_CKGR_MUL) >> 16) + 1; + return AT91F_CKGR_GetMainClock(pCKGR, slowClock) / pllDivider * pllMultiplier / prescaler; + } + return 0; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_EnablePCK +//* \brief Enable peripheral clock +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_EnablePCK ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int pck, // \arg Peripheral clock identifier 0 .. 7 + unsigned int mode) +{ + pPMC->PMC_PCKR[pck] = mode; + pPMC->PMC_SCER = (1 << pck) << 8; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_DisablePCK +//* \brief Enable peripheral clock +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_DisablePCK ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int pck) // \arg Peripheral clock identifier 0 .. 7 +{ + pPMC->PMC_SCDR = (1 << pck) << 8; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_EnableIt +//* \brief Enable PMC interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_EnableIt ( + AT91PS_PMC pPMC, // pointer to a PMC controller + unsigned int flag) // IT to be enabled +{ + //* Write to the IER register + pPMC->PMC_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_DisableIt +//* \brief Disable PMC interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_DisableIt ( + AT91PS_PMC pPMC, // pointer to a PMC controller + unsigned int flag) // IT to be disabled +{ + //* Write to the IDR register + pPMC->PMC_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_GetStatus +//* \brief Return PMC Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_GetStatus( // \return PMC Interrupt Status + AT91PS_PMC pPMC) // pointer to a PMC controller +{ + return pPMC->PMC_SR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_GetInterruptMaskStatus +//* \brief Return PMC Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_GetInterruptMaskStatus( // \return PMC Interrupt Mask Status + AT91PS_PMC pPMC) // pointer to a PMC controller +{ + return pPMC->PMC_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_IsInterruptMasked +//* \brief Test if PMC Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_IsInterruptMasked( + AT91PS_PMC pPMC, // \arg pointer to a PMC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PMC_GetInterruptMaskStatus(pPMC) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_IsStatusSet +//* \brief Test if PMC Status is Set +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_IsStatusSet( + AT91PS_PMC pPMC, // \arg pointer to a PMC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PMC_GetStatus(pPMC) & flag); +}/* ***************************************************************************** + SOFTWARE API FOR RSTC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_RSTSoftReset +//* \brief Start Software Reset +//*---------------------------------------------------------------------------- +__inline void AT91F_RSTSoftReset( + AT91PS_RSTC pRSTC, + unsigned int reset) +{ + pRSTC->RSTC_RCR = (0xA5000000 | reset); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_RSTSetMode +//* \brief Set Reset Mode +//*---------------------------------------------------------------------------- +__inline void AT91F_RSTSetMode( + AT91PS_RSTC pRSTC, + unsigned int mode) +{ + pRSTC->RSTC_RMR = (0xA5000000 | mode); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_RSTGetMode +//* \brief Get Reset Mode +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_RSTGetMode( + AT91PS_RSTC pRSTC) +{ + return (pRSTC->RSTC_RMR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_RSTGetStatus +//* \brief Get Reset Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_RSTGetStatus( + AT91PS_RSTC pRSTC) +{ + return (pRSTC->RSTC_RSR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_RSTIsSoftRstActive +//* \brief Return !=0 if software reset is still not completed +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_RSTIsSoftRstActive( + AT91PS_RSTC pRSTC) +{ + return ((pRSTC->RSTC_RSR) & AT91C_RSTC_SRCMP); +} +/* ***************************************************************************** + SOFTWARE API FOR RTTC + ***************************************************************************** */ +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_SetRTT_TimeBase() +//* \brief Set the RTT prescaler according to the TimeBase in ms +//*-------------------------------------------------------------------------------------- +__inline unsigned int AT91F_RTTSetTimeBase( + AT91PS_RTTC pRTTC, + unsigned int ms) +{ + if (ms > 2000) + return 1; // AT91C_TIME_OUT_OF_RANGE + pRTTC->RTTC_RTMR &= ~0xFFFF; + pRTTC->RTTC_RTMR |= (((ms << 15) /1000) & 0xFFFF); + return 0; +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTTSetPrescaler() +//* \brief Set the new prescaler value +//*-------------------------------------------------------------------------------------- +__inline unsigned int AT91F_RTTSetPrescaler( + AT91PS_RTTC pRTTC, + unsigned int rtpres) +{ + pRTTC->RTTC_RTMR &= ~0xFFFF; + pRTTC->RTTC_RTMR |= (rtpres & 0xFFFF); + return (pRTTC->RTTC_RTMR); +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTTRestart() +//* \brief Restart the RTT prescaler +//*-------------------------------------------------------------------------------------- +__inline void AT91F_RTTRestart( + AT91PS_RTTC pRTTC) +{ + pRTTC->RTTC_RTMR |= AT91C_RTTC_RTTRST; +} + + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTT_SetAlarmINT() +//* \brief Enable RTT Alarm Interrupt +//*-------------------------------------------------------------------------------------- +__inline void AT91F_RTTSetAlarmINT( + AT91PS_RTTC pRTTC) +{ + pRTTC->RTTC_RTMR |= AT91C_RTTC_ALMIEN; +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTT_ClearAlarmINT() +//* \brief Disable RTT Alarm Interrupt +//*-------------------------------------------------------------------------------------- +__inline void AT91F_RTTClearAlarmINT( + AT91PS_RTTC pRTTC) +{ + pRTTC->RTTC_RTMR &= ~AT91C_RTTC_ALMIEN; +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTT_SetRttIncINT() +//* \brief Enable RTT INC Interrupt +//*-------------------------------------------------------------------------------------- +__inline void AT91F_RTTSetRttIncINT( + AT91PS_RTTC pRTTC) +{ + pRTTC->RTTC_RTMR |= AT91C_RTTC_RTTINCIEN; +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTT_ClearRttIncINT() +//* \brief Disable RTT INC Interrupt +//*-------------------------------------------------------------------------------------- +__inline void AT91F_RTTClearRttIncINT( + AT91PS_RTTC pRTTC) +{ + pRTTC->RTTC_RTMR &= ~AT91C_RTTC_RTTINCIEN; +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTT_SetAlarmValue() +//* \brief Set RTT Alarm Value +//*-------------------------------------------------------------------------------------- +__inline void AT91F_RTTSetAlarmValue( + AT91PS_RTTC pRTTC, unsigned int alarm) +{ + pRTTC->RTTC_RTAR = alarm; +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTT_GetAlarmValue() +//* \brief Get RTT Alarm Value +//*-------------------------------------------------------------------------------------- +__inline unsigned int AT91F_RTTGetAlarmValue( + AT91PS_RTTC pRTTC) +{ + return(pRTTC->RTTC_RTAR); +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTTGetStatus() +//* \brief Read the RTT status +//*-------------------------------------------------------------------------------------- +__inline unsigned int AT91F_RTTGetStatus( + AT91PS_RTTC pRTTC) +{ + return(pRTTC->RTTC_RTSR); +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTT_ReadValue() +//* \brief Read the RTT value +//*-------------------------------------------------------------------------------------- +__inline unsigned int AT91F_RTTReadValue( + AT91PS_RTTC pRTTC) +{ + register volatile unsigned int val1,val2; + do + { + val1 = pRTTC->RTTC_RTVR; + val2 = pRTTC->RTTC_RTVR; + } + while(val1 != val2); + return(val1); +} +/* ***************************************************************************** + SOFTWARE API FOR PITC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITInit +//* \brief System timer init : period in µsecond, system clock freq in MHz +//*---------------------------------------------------------------------------- +__inline void AT91F_PITInit( + AT91PS_PITC pPITC, + unsigned int period, + unsigned int pit_frequency) +{ + pPITC->PITC_PIMR = period? (period * pit_frequency + 8) >> 4 : 0; // +8 to avoid %10 and /10 + pPITC->PITC_PIMR |= AT91C_PITC_PITEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITSetPIV +//* \brief Set the PIT Periodic Interval Value +//*---------------------------------------------------------------------------- +__inline void AT91F_PITSetPIV( + AT91PS_PITC pPITC, + unsigned int piv) +{ + pPITC->PITC_PIMR = piv | (pPITC->PITC_PIMR & (AT91C_PITC_PITEN | AT91C_PITC_PITIEN)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITEnableInt +//* \brief Enable PIT periodic interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PITEnableInt( + AT91PS_PITC pPITC) +{ + pPITC->PITC_PIMR |= AT91C_PITC_PITIEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITDisableInt +//* \brief Disable PIT periodic interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PITDisableInt( + AT91PS_PITC pPITC) +{ + pPITC->PITC_PIMR &= ~AT91C_PITC_PITIEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITGetMode +//* \brief Read PIT mode register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PITGetMode( + AT91PS_PITC pPITC) +{ + return(pPITC->PITC_PIMR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITGetStatus +//* \brief Read PIT status register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PITGetStatus( + AT91PS_PITC pPITC) +{ + return(pPITC->PITC_PISR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITGetPIIR +//* \brief Read PIT CPIV and PICNT without ressetting the counters +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PITGetPIIR( + AT91PS_PITC pPITC) +{ + return(pPITC->PITC_PIIR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITGetPIVR +//* \brief Read System timer CPIV and PICNT without ressetting the counters +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PITGetPIVR( + AT91PS_PITC pPITC) +{ + return(pPITC->PITC_PIVR); +} +/* ***************************************************************************** + SOFTWARE API FOR WDTC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_WDTSetMode +//* \brief Set Watchdog Mode Register +//*---------------------------------------------------------------------------- +__inline void AT91F_WDTSetMode( + AT91PS_WDTC pWDTC, + unsigned int Mode) +{ + pWDTC->WDTC_WDMR = Mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_WDTRestart +//* \brief Restart Watchdog +//*---------------------------------------------------------------------------- +__inline void AT91F_WDTRestart( + AT91PS_WDTC pWDTC) +{ + pWDTC->WDTC_WDCR = 0xA5000001; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_WDTSGettatus +//* \brief Get Watchdog Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_WDTSGettatus( + AT91PS_WDTC pWDTC) +{ + return(pWDTC->WDTC_WDSR & 0x3); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_WDTGetPeriod +//* \brief Translate ms into Watchdog Compatible value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_WDTGetPeriod(unsigned int ms) +{ + if ((ms < 4) || (ms > 16000)) + return 0; + return((ms << 8) / 1000); +} +/* ***************************************************************************** + SOFTWARE API FOR VREG + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_VREG_Enable_LowPowerMode +//* \brief Enable VREG Low Power Mode +//*---------------------------------------------------------------------------- +__inline void AT91F_VREG_Enable_LowPowerMode( + AT91PS_VREG pVREG) +{ + pVREG->VREG_MR |= AT91C_VREG_PSTDBY; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_VREG_Disable_LowPowerMode +//* \brief Disable VREG Low Power Mode +//*---------------------------------------------------------------------------- +__inline void AT91F_VREG_Disable_LowPowerMode( + AT91PS_VREG pVREG) +{ + pVREG->VREG_MR &= ~AT91C_VREG_PSTDBY; +}/* ***************************************************************************** + SOFTWARE API FOR MC + ***************************************************************************** */ + +#define AT91C_MC_CORRECT_KEY ((unsigned int) 0x5A << 24) // (MC) Correct Protect Key + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_Remap +//* \brief Make Remap +//*---------------------------------------------------------------------------- +__inline void AT91F_MC_Remap (void) // +{ + AT91PS_MC pMC = (AT91PS_MC) AT91C_BASE_MC; + + pMC->MC_RCR = AT91C_MC_RCB; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_CfgModeReg +//* \brief Configure the EFC Mode Register of the MC controller +//*---------------------------------------------------------------------------- +__inline void AT91F_MC_EFC_CfgModeReg ( + AT91PS_MC pMC, // pointer to a MC controller + unsigned int mode) // mode register +{ + // Write to the FMR register + pMC->MC_FMR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_GetModeReg +//* \brief Return MC EFC Mode Regsiter +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_MC_EFC_GetModeReg( + AT91PS_MC pMC) // pointer to a MC controller +{ + return pMC->MC_FMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_ComputeFMCN +//* \brief Return MC EFC Mode Regsiter +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_MC_EFC_ComputeFMCN( + int master_clock) // master clock in Hz +{ + return (master_clock/1000000 +2); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_PerformCmd +//* \brief Perform EFC Command +//*---------------------------------------------------------------------------- +__inline void AT91F_MC_EFC_PerformCmd ( + AT91PS_MC pMC, // pointer to a MC controller + unsigned int transfer_cmd) +{ + pMC->MC_FCR = transfer_cmd; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_GetStatus +//* \brief Return MC EFC Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_MC_EFC_GetStatus( + AT91PS_MC pMC) // pointer to a MC controller +{ + return pMC->MC_FSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_IsInterruptMasked +//* \brief Test if EFC MC Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_MC_EFC_IsInterruptMasked( + AT91PS_MC pMC, // \arg pointer to a MC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_MC_EFC_GetModeReg(pMC) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_IsInterruptSet +//* \brief Test if EFC MC Interrupt is Set +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_MC_EFC_IsInterruptSet( + AT91PS_MC pMC, // \arg pointer to a MC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_MC_EFC_GetStatus(pMC) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR SPI + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_Open +//* \brief Open a SPI Port +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SPI_Open ( + const unsigned int null) // \arg +{ + /* NOT DEFINED AT THIS MOMENT */ + return ( 0 ); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_CfgCs +//* \brief Configure SPI chip select register +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_CfgCs ( + AT91PS_SPI pSPI, // pointer to a SPI controller + int cs, // SPI cs number (0 to 3) + int val) // chip select register +{ + //* Write to the CSR register + *(pSPI->SPI_CSR + cs) = val; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_EnableIt +//* \brief Enable SPI interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_EnableIt ( + AT91PS_SPI pSPI, // pointer to a SPI controller + unsigned int flag) // IT to be enabled +{ + //* Write to the IER register + pSPI->SPI_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_DisableIt +//* \brief Disable SPI interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_DisableIt ( + AT91PS_SPI pSPI, // pointer to a SPI controller + unsigned int flag) // IT to be disabled +{ + //* Write to the IDR register + pSPI->SPI_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_Reset +//* \brief Reset the SPI controller +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_Reset ( + AT91PS_SPI pSPI // pointer to a SPI controller + ) +{ + //* Write to the CR register + pSPI->SPI_CR = AT91C_SPI_SWRST; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_Enable +//* \brief Enable the SPI controller +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_Enable ( + AT91PS_SPI pSPI // pointer to a SPI controller + ) +{ + //* Write to the CR register + pSPI->SPI_CR = AT91C_SPI_SPIEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_Disable +//* \brief Disable the SPI controller +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_Disable ( + AT91PS_SPI pSPI // pointer to a SPI controller + ) +{ + //* Write to the CR register + pSPI->SPI_CR = AT91C_SPI_SPIDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_CfgMode +//* \brief Enable the SPI controller +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_CfgMode ( + AT91PS_SPI pSPI, // pointer to a SPI controller + int mode) // mode register +{ + //* Write to the MR register + pSPI->SPI_MR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_CfgPCS +//* \brief Switch to the correct PCS of SPI Mode Register : Fixed Peripheral Selected +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_CfgPCS ( + AT91PS_SPI pSPI, // pointer to a SPI controller + char PCS_Device) // PCS of the Device +{ + //* Write to the MR register + pSPI->SPI_MR &= 0xFFF0FFFF; + pSPI->SPI_MR |= ( (PCS_Device<<16) & AT91C_SPI_PCS ); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_ReceiveFrame +//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is busy +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SPI_ReceiveFrame ( + AT91PS_SPI pSPI, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + return AT91F_PDC_ReceiveFrame( + (AT91PS_PDC) &(pSPI->SPI_RPR), + pBuffer, + szBuffer, + pNextBuffer, + szNextBuffer); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_SendFrame +//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is bSPIy +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SPI_SendFrame( + AT91PS_SPI pSPI, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + return AT91F_PDC_SendFrame( + (AT91PS_PDC) &(pSPI->SPI_RPR), + pBuffer, + szBuffer, + pNextBuffer, + szNextBuffer); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_Close +//* \brief Close SPI: disable IT disable transfert, close PDC +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_Close ( + AT91PS_SPI pSPI) // \arg pointer to a SPI controller +{ + //* Reset all the Chip Select register + pSPI->SPI_CSR[0] = 0 ; + pSPI->SPI_CSR[1] = 0 ; + pSPI->SPI_CSR[2] = 0 ; + pSPI->SPI_CSR[3] = 0 ; + + //* Reset the SPI mode + pSPI->SPI_MR = 0 ; + + //* Disable all interrupts + pSPI->SPI_IDR = 0xFFFFFFFF ; + + //* Abort the Peripheral Data Transfers + AT91F_PDC_Close((AT91PS_PDC) &(pSPI->SPI_RPR)); + + //* Disable receiver and transmitter and stop any activity immediately + pSPI->SPI_CR = AT91C_SPI_SPIDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_PutChar +//* \brief Send a character,does not check if ready to send +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_PutChar ( + AT91PS_SPI pSPI, + unsigned int character, + unsigned int cs_number ) +{ + unsigned int value_for_cs; + value_for_cs = (~(1 << cs_number)) & 0xF; //Place a zero among a 4 ONEs number + pSPI->SPI_TDR = (character & 0xFFFF) | (value_for_cs << 16); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_GetChar +//* \brief Receive a character,does not check if a character is available +//*---------------------------------------------------------------------------- +__inline int AT91F_SPI_GetChar ( + const AT91PS_SPI pSPI) +{ + return((pSPI->SPI_RDR) & 0xFFFF); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_GetInterruptMaskStatus +//* \brief Return SPI Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SPI_GetInterruptMaskStatus( // \return SPI Interrupt Mask Status + AT91PS_SPI pSpi) // \arg pointer to a SPI controller +{ + return pSpi->SPI_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_IsInterruptMasked +//* \brief Test if SPI Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_SPI_IsInterruptMasked( + AT91PS_SPI pSpi, // \arg pointer to a SPI controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_SPI_GetInterruptMaskStatus(pSpi) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR USART + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_Baudrate +//* \brief Calculate the baudrate +//* Standard Asynchronous Mode : 8 bits , 1 stop , no parity +#define AT91C_US_ASYNC_MODE ( AT91C_US_USMODE_NORMAL + \ + AT91C_US_NBSTOP_1_BIT + \ + AT91C_US_PAR_NONE + \ + AT91C_US_CHRL_8_BITS + \ + AT91C_US_CLKS_CLOCK ) + +//* Standard External Asynchronous Mode : 8 bits , 1 stop , no parity +#define AT91C_US_ASYNC_SCK_MODE ( AT91C_US_USMODE_NORMAL + \ + AT91C_US_NBSTOP_1_BIT + \ + AT91C_US_PAR_NONE + \ + AT91C_US_CHRL_8_BITS + \ + AT91C_US_CLKS_EXT ) + +//* Standard Synchronous Mode : 8 bits , 1 stop , no parity +#define AT91C_US_SYNC_MODE ( AT91C_US_SYNC + \ + AT91C_US_USMODE_NORMAL + \ + AT91C_US_NBSTOP_1_BIT + \ + AT91C_US_PAR_NONE + \ + AT91C_US_CHRL_8_BITS + \ + AT91C_US_CLKS_CLOCK ) + +//* SCK used Label +#define AT91C_US_SCK_USED (AT91C_US_CKLO | AT91C_US_CLKS_EXT) + +//* Standard ISO T=0 Mode : 8 bits , 1 stop , parity +#define AT91C_US_ISO_READER_MODE ( AT91C_US_USMODE_ISO7816_0 + \ + AT91C_US_CLKS_CLOCK +\ + AT91C_US_NBSTOP_1_BIT + \ + AT91C_US_PAR_EVEN + \ + AT91C_US_CHRL_8_BITS + \ + AT91C_US_CKLO +\ + AT91C_US_OVER) + +//* Standard IRDA mode +#define AT91C_US_ASYNC_IRDA_MODE ( AT91C_US_USMODE_IRDA + \ + AT91C_US_NBSTOP_1_BIT + \ + AT91C_US_PAR_NONE + \ + AT91C_US_CHRL_8_BITS + \ + AT91C_US_CLKS_CLOCK ) + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_Baudrate +//* \brief Caluculate baud_value according to the main clock and the baud rate +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_US_Baudrate ( + const unsigned int main_clock, // \arg peripheral clock + const unsigned int baud_rate) // \arg UART baudrate +{ + unsigned int baud_value = ((main_clock*10)/(baud_rate * 16)); + if ((baud_value % 10) >= 5) + baud_value = (baud_value / 10) + 1; + else + baud_value /= 10; + return baud_value; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_SetBaudrate +//* \brief Set the baudrate according to the CPU clock +//*---------------------------------------------------------------------------- +__inline void AT91F_US_SetBaudrate ( + AT91PS_USART pUSART, // \arg pointer to a USART controller + unsigned int mainClock, // \arg peripheral clock + unsigned int speed) // \arg UART baudrate +{ + //* Define the baud rate divisor register + pUSART->US_BRGR = AT91F_US_Baudrate(mainClock, speed); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_SetTimeguard +//* \brief Set USART timeguard +//*---------------------------------------------------------------------------- +__inline void AT91F_US_SetTimeguard ( + AT91PS_USART pUSART, // \arg pointer to a USART controller + unsigned int timeguard) // \arg timeguard value +{ + //* Write the Timeguard Register + pUSART->US_TTGR = timeguard ; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_EnableIt +//* \brief Enable USART IT +//*---------------------------------------------------------------------------- +__inline void AT91F_US_EnableIt ( + AT91PS_USART pUSART, // \arg pointer to a USART controller + unsigned int flag) // \arg IT to be enabled +{ + //* Write to the IER register + pUSART->US_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_DisableIt +//* \brief Disable USART IT +//*---------------------------------------------------------------------------- +__inline void AT91F_US_DisableIt ( + AT91PS_USART pUSART, // \arg pointer to a USART controller + unsigned int flag) // \arg IT to be disabled +{ + //* Write to the IER register + pUSART->US_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_Configure +//* \brief Configure USART +//*---------------------------------------------------------------------------- +__inline void AT91F_US_Configure ( + AT91PS_USART pUSART, // \arg pointer to a USART controller + unsigned int mainClock, // \arg peripheral clock + unsigned int mode , // \arg mode Register to be programmed + unsigned int baudRate , // \arg baudrate to be programmed + unsigned int timeguard ) // \arg timeguard to be programmed +{ + //* Disable interrupts + pUSART->US_IDR = (unsigned int) -1; + + //* Reset receiver and transmitter + pUSART->US_CR = AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RXDIS | AT91C_US_TXDIS ; + + //* Define the baud rate divisor register + AT91F_US_SetBaudrate(pUSART, mainClock, baudRate); + + //* Write the Timeguard Register + AT91F_US_SetTimeguard(pUSART, timeguard); + + //* Clear Transmit and Receive Counters + AT91F_PDC_Open((AT91PS_PDC) &(pUSART->US_RPR)); + + //* Define the USART mode + pUSART->US_MR = mode ; + +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_EnableRx +//* \brief Enable receiving characters +//*---------------------------------------------------------------------------- +__inline void AT91F_US_EnableRx ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Enable receiver + pUSART->US_CR = AT91C_US_RXEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_EnableTx +//* \brief Enable sending characters +//*---------------------------------------------------------------------------- +__inline void AT91F_US_EnableTx ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Enable transmitter + pUSART->US_CR = AT91C_US_TXEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_ResetRx +//* \brief Reset Receiver and re-enable it +//*---------------------------------------------------------------------------- +__inline void AT91F_US_ResetRx ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Reset receiver + pUSART->US_CR = AT91C_US_RSTRX; + //* Re-Enable receiver + pUSART->US_CR = AT91C_US_RXEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_ResetTx +//* \brief Reset Transmitter and re-enable it +//*---------------------------------------------------------------------------- +__inline void AT91F_US_ResetTx ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Reset transmitter + pUSART->US_CR = AT91C_US_RSTTX; + //* Enable transmitter + pUSART->US_CR = AT91C_US_TXEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_DisableRx +//* \brief Disable Receiver +//*---------------------------------------------------------------------------- +__inline void AT91F_US_DisableRx ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Disable receiver + pUSART->US_CR = AT91C_US_RXDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_DisableTx +//* \brief Disable Transmitter +//*---------------------------------------------------------------------------- +__inline void AT91F_US_DisableTx ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Disable transmitter + pUSART->US_CR = AT91C_US_TXDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_Close +//* \brief Close USART: disable IT disable receiver and transmitter, close PDC +//*---------------------------------------------------------------------------- +__inline void AT91F_US_Close ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Reset the baud rate divisor register + pUSART->US_BRGR = 0 ; + + //* Reset the USART mode + pUSART->US_MR = 0 ; + + //* Reset the Timeguard Register + pUSART->US_TTGR = 0; + + //* Disable all interrupts + pUSART->US_IDR = 0xFFFFFFFF ; + + //* Abort the Peripheral Data Transfers + AT91F_PDC_Close((AT91PS_PDC) &(pUSART->US_RPR)); + + //* Disable receiver and transmitter and stop any activity immediately + pUSART->US_CR = AT91C_US_TXDIS | AT91C_US_RXDIS | AT91C_US_RSTTX | AT91C_US_RSTRX ; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_TxReady +//* \brief Return 1 if a character can be written in US_THR +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_US_TxReady ( + AT91PS_USART pUSART ) // \arg pointer to a USART controller +{ + return (pUSART->US_CSR & AT91C_US_TXRDY); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_RxReady +//* \brief Return 1 if a character can be read in US_RHR +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_US_RxReady ( + AT91PS_USART pUSART ) // \arg pointer to a USART controller +{ + return (pUSART->US_CSR & AT91C_US_RXRDY); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_Error +//* \brief Return the error flag +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_US_Error ( + AT91PS_USART pUSART ) // \arg pointer to a USART controller +{ + return (pUSART->US_CSR & + (AT91C_US_OVRE | // Overrun error + AT91C_US_FRAME | // Framing error + AT91C_US_PARE)); // Parity error +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_PutChar +//* \brief Send a character,does not check if ready to send +//*---------------------------------------------------------------------------- +__inline void AT91F_US_PutChar ( + AT91PS_USART pUSART, + int character ) +{ + pUSART->US_THR = (character & 0x1FF); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_GetChar +//* \brief Receive a character,does not check if a character is available +//*---------------------------------------------------------------------------- +__inline int AT91F_US_GetChar ( + const AT91PS_USART pUSART) +{ + return((pUSART->US_RHR) & 0x1FF); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_SendFrame +//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is busy +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_US_SendFrame( + AT91PS_USART pUSART, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + return AT91F_PDC_SendFrame( + (AT91PS_PDC) &(pUSART->US_RPR), + pBuffer, + szBuffer, + pNextBuffer, + szNextBuffer); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_ReceiveFrame +//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is busy +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_US_ReceiveFrame ( + AT91PS_USART pUSART, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + return AT91F_PDC_ReceiveFrame( + (AT91PS_PDC) &(pUSART->US_RPR), + pBuffer, + szBuffer, + pNextBuffer, + szNextBuffer); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_SetIrdaFilter +//* \brief Set the value of IrDa filter tregister +//*---------------------------------------------------------------------------- +__inline void AT91F_US_SetIrdaFilter ( + AT91PS_USART pUSART, + unsigned char value +) +{ + pUSART->US_IF = value; +} + +/* ***************************************************************************** + SOFTWARE API FOR SSC + ***************************************************************************** */ +//* Define the standard I2S mode configuration + +//* Configuration to set in the SSC Transmit Clock Mode Register +//* Parameters : nb_bit_by_slot : 8, 16 or 32 bits +//* nb_slot_by_frame : number of channels +#define AT91C_I2S_ASY_MASTER_TX_SETTING(nb_bit_by_slot, nb_slot_by_frame)( +\ + AT91C_SSC_CKS_DIV +\ + AT91C_SSC_CKO_CONTINOUS +\ + AT91C_SSC_CKG_NONE +\ + AT91C_SSC_START_FALL_RF +\ + AT91C_SSC_STTOUT +\ + ((1<<16) & AT91C_SSC_STTDLY) +\ + ((((nb_bit_by_slot*nb_slot_by_frame)/2)-1) <<24)) + + +//* Configuration to set in the SSC Transmit Frame Mode Register +//* Parameters : nb_bit_by_slot : 8, 16 or 32 bits +//* nb_slot_by_frame : number of channels +#define AT91C_I2S_ASY_TX_FRAME_SETTING(nb_bit_by_slot, nb_slot_by_frame)( +\ + (nb_bit_by_slot-1) +\ + AT91C_SSC_MSBF +\ + (((nb_slot_by_frame-1)<<8) & AT91C_SSC_DATNB) +\ + (((nb_bit_by_slot-1)<<16) & AT91C_SSC_FSLEN) +\ + AT91C_SSC_FSOS_NEGATIVE) + + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_SetBaudrate +//* \brief Set the baudrate according to the CPU clock +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_SetBaudrate ( + AT91PS_SSC pSSC, // \arg pointer to a SSC controller + unsigned int mainClock, // \arg peripheral clock + unsigned int speed) // \arg SSC baudrate +{ + unsigned int baud_value; + //* Define the baud rate divisor register + if (speed == 0) + baud_value = 0; + else + { + baud_value = (unsigned int) (mainClock * 10)/(2*speed); + if ((baud_value % 10) >= 5) + baud_value = (baud_value / 10) + 1; + else + baud_value /= 10; + } + + pSSC->SSC_CMR = baud_value; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_Configure +//* \brief Configure SSC +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_Configure ( + AT91PS_SSC pSSC, // \arg pointer to a SSC controller + unsigned int syst_clock, // \arg System Clock Frequency + unsigned int baud_rate, // \arg Expected Baud Rate Frequency + unsigned int clock_rx, // \arg Receiver Clock Parameters + unsigned int mode_rx, // \arg mode Register to be programmed + unsigned int clock_tx, // \arg Transmitter Clock Parameters + unsigned int mode_tx) // \arg mode Register to be programmed +{ + //* Disable interrupts + pSSC->SSC_IDR = (unsigned int) -1; + + //* Reset receiver and transmitter + pSSC->SSC_CR = AT91C_SSC_SWRST | AT91C_SSC_RXDIS | AT91C_SSC_TXDIS ; + + //* Define the Clock Mode Register + AT91F_SSC_SetBaudrate(pSSC, syst_clock, baud_rate); + + //* Write the Receive Clock Mode Register + pSSC->SSC_RCMR = clock_rx; + + //* Write the Transmit Clock Mode Register + pSSC->SSC_TCMR = clock_tx; + + //* Write the Receive Frame Mode Register + pSSC->SSC_RFMR = mode_rx; + + //* Write the Transmit Frame Mode Register + pSSC->SSC_TFMR = mode_tx; + + //* Clear Transmit and Receive Counters + AT91F_PDC_Open((AT91PS_PDC) &(pSSC->SSC_RPR)); + + +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_EnableRx +//* \brief Enable receiving datas +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_EnableRx ( + AT91PS_SSC pSSC) // \arg pointer to a SSC controller +{ + //* Enable receiver + pSSC->SSC_CR = AT91C_SSC_RXEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_DisableRx +//* \brief Disable receiving datas +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_DisableRx ( + AT91PS_SSC pSSC) // \arg pointer to a SSC controller +{ + //* Disable receiver + pSSC->SSC_CR = AT91C_SSC_RXDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_EnableTx +//* \brief Enable sending datas +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_EnableTx ( + AT91PS_SSC pSSC) // \arg pointer to a SSC controller +{ + //* Enable transmitter + pSSC->SSC_CR = AT91C_SSC_TXEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_DisableTx +//* \brief Disable sending datas +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_DisableTx ( + AT91PS_SSC pSSC) // \arg pointer to a SSC controller +{ + //* Disable transmitter + pSSC->SSC_CR = AT91C_SSC_TXDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_EnableIt +//* \brief Enable SSC IT +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_EnableIt ( + AT91PS_SSC pSSC, // \arg pointer to a SSC controller + unsigned int flag) // \arg IT to be enabled +{ + //* Write to the IER register + pSSC->SSC_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_DisableIt +//* \brief Disable SSC IT +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_DisableIt ( + AT91PS_SSC pSSC, // \arg pointer to a SSC controller + unsigned int flag) // \arg IT to be disabled +{ + //* Write to the IDR register + pSSC->SSC_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_ReceiveFrame +//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initialized with Next Buffer, 0 if PDC is busy +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SSC_ReceiveFrame ( + AT91PS_SSC pSSC, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + return AT91F_PDC_ReceiveFrame( + (AT91PS_PDC) &(pSSC->SSC_RPR), + pBuffer, + szBuffer, + pNextBuffer, + szNextBuffer); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_SendFrame +//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initialized with Next Buffer, 0 if PDC is busy +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SSC_SendFrame( + AT91PS_SSC pSSC, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + return AT91F_PDC_SendFrame( + (AT91PS_PDC) &(pSSC->SSC_RPR), + pBuffer, + szBuffer, + pNextBuffer, + szNextBuffer); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_GetInterruptMaskStatus +//* \brief Return SSC Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SSC_GetInterruptMaskStatus( // \return SSC Interrupt Mask Status + AT91PS_SSC pSsc) // \arg pointer to a SSC controller +{ + return pSsc->SSC_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_IsInterruptMasked +//* \brief Test if SSC Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_SSC_IsInterruptMasked( + AT91PS_SSC pSsc, // \arg pointer to a SSC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_SSC_GetInterruptMaskStatus(pSsc) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR TWI + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_EnableIt +//* \brief Enable TWI IT +//*---------------------------------------------------------------------------- +__inline void AT91F_TWI_EnableIt ( + AT91PS_TWI pTWI, // \arg pointer to a TWI controller + unsigned int flag) // \arg IT to be enabled +{ + //* Write to the IER register + pTWI->TWI_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_DisableIt +//* \brief Disable TWI IT +//*---------------------------------------------------------------------------- +__inline void AT91F_TWI_DisableIt ( + AT91PS_TWI pTWI, // \arg pointer to a TWI controller + unsigned int flag) // \arg IT to be disabled +{ + //* Write to the IDR register + pTWI->TWI_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_Configure +//* \brief Configure TWI in master mode +//*---------------------------------------------------------------------------- +__inline void AT91F_TWI_Configure ( AT91PS_TWI pTWI ) // \arg pointer to a TWI controller +{ + //* Disable interrupts + pTWI->TWI_IDR = (unsigned int) -1; + + //* Reset peripheral + pTWI->TWI_CR = AT91C_TWI_SWRST; + + //* Set Master mode + pTWI->TWI_CR = AT91C_TWI_MSEN; + +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_GetInterruptMaskStatus +//* \brief Return TWI Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TWI_GetInterruptMaskStatus( // \return TWI Interrupt Mask Status + AT91PS_TWI pTwi) // \arg pointer to a TWI controller +{ + return pTwi->TWI_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_IsInterruptMasked +//* \brief Test if TWI Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_TWI_IsInterruptMasked( + AT91PS_TWI pTwi, // \arg pointer to a TWI controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_TWI_GetInterruptMaskStatus(pTwi) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR PWMC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_GetStatus +//* \brief Return PWM Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PWMC_GetStatus( // \return PWM Interrupt Status + AT91PS_PWMC pPWM) // pointer to a PWM controller +{ + return pPWM->PWMC_SR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_InterruptEnable +//* \brief Enable PWM Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_InterruptEnable( + AT91PS_PWMC pPwm, // \arg pointer to a PWM controller + unsigned int flag) // \arg PWM interrupt to be enabled +{ + pPwm->PWMC_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_InterruptDisable +//* \brief Disable PWM Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_InterruptDisable( + AT91PS_PWMC pPwm, // \arg pointer to a PWM controller + unsigned int flag) // \arg PWM interrupt to be disabled +{ + pPwm->PWMC_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_GetInterruptMaskStatus +//* \brief Return PWM Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PWMC_GetInterruptMaskStatus( // \return PWM Interrupt Mask Status + AT91PS_PWMC pPwm) // \arg pointer to a PWM controller +{ + return pPwm->PWMC_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_IsInterruptMasked +//* \brief Test if PWM Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PWMC_IsInterruptMasked( + AT91PS_PWMC pPWM, // \arg pointer to a PWM controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PWMC_GetInterruptMaskStatus(pPWM) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_IsStatusSet +//* \brief Test if PWM Interrupt is Set +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PWMC_IsStatusSet( + AT91PS_PWMC pPWM, // \arg pointer to a PWM controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PWMC_GetStatus(pPWM) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_CfgChannel +//* \brief Test if PWM Interrupt is Set +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_CfgChannel( + AT91PS_PWMC pPWM, // \arg pointer to a PWM controller + unsigned int channelId, // \arg PWM channel ID + unsigned int mode, // \arg PWM mode + unsigned int period, // \arg PWM period + unsigned int duty) // \arg PWM duty cycle +{ + pPWM->PWMC_CH[channelId].PWMC_CMR = mode; + pPWM->PWMC_CH[channelId].PWMC_CDTYR = duty; + pPWM->PWMC_CH[channelId].PWMC_CPRDR = period; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_StartChannel +//* \brief Enable channel +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_StartChannel( + AT91PS_PWMC pPWM, // \arg pointer to a PWM controller + unsigned int flag) // \arg Channels IDs to be enabled +{ + pPWM->PWMC_ENA = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_StopChannel +//* \brief Disable channel +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_StopChannel( + AT91PS_PWMC pPWM, // \arg pointer to a PWM controller + unsigned int flag) // \arg Channels IDs to be enabled +{ + pPWM->PWMC_DIS = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_UpdateChannel +//* \brief Update Period or Duty Cycle +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_UpdateChannel( + AT91PS_PWMC pPWM, // \arg pointer to a PWM controller + unsigned int channelId, // \arg PWM channel ID + unsigned int update) // \arg Channels IDs to be enabled +{ + pPWM->PWMC_CH[channelId].PWMC_CUPDR = update; +} + +/* ***************************************************************************** + SOFTWARE API FOR UDP + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EnableIt +//* \brief Enable UDP IT +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EnableIt ( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned int flag) // \arg IT to be enabled +{ + //* Write to the IER register + pUDP->UDP_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_DisableIt +//* \brief Disable UDP IT +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_DisableIt ( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned int flag) // \arg IT to be disabled +{ + //* Write to the IDR register + pUDP->UDP_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_SetAddress +//* \brief Set UDP functional address +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_SetAddress ( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char address) // \arg new UDP address +{ + pUDP->UDP_FADDR = (AT91C_UDP_FEN | address); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EnableEp +//* \brief Enable Endpoint +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EnableEp ( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint) // \arg endpoint number +{ + pUDP->UDP_CSR[endpoint] |= AT91C_UDP_EPEDS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_DisableEp +//* \brief Enable Endpoint +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_DisableEp ( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint) // \arg endpoint number +{ + pUDP->UDP_CSR[endpoint] &= ~AT91C_UDP_EPEDS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_SetState +//* \brief Set UDP Device state +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_SetState ( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned int flag) // \arg new UDP address +{ + pUDP->UDP_GLBSTATE &= ~(AT91C_UDP_FADDEN | AT91C_UDP_CONFG); + pUDP->UDP_GLBSTATE |= flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_GetState +//* \brief return UDP Device state +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_UDP_GetState ( // \return the UDP device state + AT91PS_UDP pUDP) // \arg pointer to a UDP controller +{ + return (pUDP->UDP_GLBSTATE & (AT91C_UDP_FADDEN | AT91C_UDP_CONFG)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_ResetEp +//* \brief Reset UDP endpoint +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_ResetEp ( // \return the UDP device state + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned int flag) // \arg Endpoints to be reset +{ + pUDP->UDP_RSTEP = flag; + pUDP->UDP_RSTEP = 0; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpStall +//* \brief Endpoint will STALL requests +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EpStall( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint) // \arg endpoint number +{ + pUDP->UDP_CSR[endpoint] |= AT91C_UDP_FORCESTALL; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpWrite +//* \brief Write value in the DPR +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EpWrite( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint, // \arg endpoint number + unsigned char value) // \arg value to be written in the DPR +{ + pUDP->UDP_FDR[endpoint] = value; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpRead +//* \brief Return value from the DPR +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_UDP_EpRead( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint) // \arg endpoint number +{ + return pUDP->UDP_FDR[endpoint]; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpEndOfWr +//* \brief Notify the UDP that values in DPR are ready to be sent +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EpEndOfWr( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint) // \arg endpoint number +{ + pUDP->UDP_CSR[endpoint] |= AT91C_UDP_TXPKTRDY; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpClear +//* \brief Clear flag in the endpoint CSR register +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EpClear( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint, // \arg endpoint number + unsigned int flag) // \arg flag to be cleared +{ + pUDP->UDP_CSR[endpoint] &= ~(flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpSet +//* \brief Set flag in the endpoint CSR register +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EpSet( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint, // \arg endpoint number + unsigned int flag) // \arg flag to be cleared +{ + pUDP->UDP_CSR[endpoint] |= flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpStatus +//* \brief Return the endpoint CSR register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_UDP_EpStatus( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint) // \arg endpoint number +{ + return pUDP->UDP_CSR[endpoint]; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_GetInterruptMaskStatus +//* \brief Return UDP Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_UDP_GetInterruptMaskStatus( // \return UDP Interrupt Mask Status + AT91PS_UDP pUdp) // \arg pointer to a UDP controller +{ + return pUdp->UDP_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_IsInterruptMasked +//* \brief Test if UDP Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_UDP_IsInterruptMasked( + AT91PS_UDP pUdp, // \arg pointer to a UDP controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_UDP_GetInterruptMaskStatus(pUdp) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR TC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC_InterruptEnable +//* \brief Enable TC Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_TC_InterruptEnable( + AT91PS_TC pTc, // \arg pointer to a TC controller + unsigned int flag) // \arg TC interrupt to be enabled +{ + pTc->TC_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC_InterruptDisable +//* \brief Disable TC Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_TC_InterruptDisable( + AT91PS_TC pTc, // \arg pointer to a TC controller + unsigned int flag) // \arg TC interrupt to be disabled +{ + pTc->TC_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC_GetInterruptMaskStatus +//* \brief Return TC Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TC_GetInterruptMaskStatus( // \return TC Interrupt Mask Status + AT91PS_TC pTc) // \arg pointer to a TC controller +{ + return pTc->TC_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC_IsInterruptMasked +//* \brief Test if TC Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_TC_IsInterruptMasked( + AT91PS_TC pTc, // \arg pointer to a TC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_TC_GetInterruptMaskStatus(pTc) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR CAN + ***************************************************************************** */ +#define STANDARD_FORMAT 0 +#define EXTENDED_FORMAT 1 + +//*---------------------------------------------------------------------------- +//* \fn AT91F_InitMailboxRegisters() +//* \brief Configure the corresponding mailbox +//*---------------------------------------------------------------------------- +__inline void AT91F_InitMailboxRegisters(AT91PS_CAN_MB CAN_Mailbox, + int mode_reg, + int acceptance_mask_reg, + int id_reg, + int data_low_reg, + int data_high_reg, + int control_reg) +{ + CAN_Mailbox->CAN_MB_MCR = 0x0; + CAN_Mailbox->CAN_MB_MMR = mode_reg; + CAN_Mailbox->CAN_MB_MAM = acceptance_mask_reg; + CAN_Mailbox->CAN_MB_MID = id_reg; + CAN_Mailbox->CAN_MB_MDL = data_low_reg; + CAN_Mailbox->CAN_MB_MDH = data_high_reg; + CAN_Mailbox->CAN_MB_MCR = control_reg; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_EnableCAN() +//* \brief +//*---------------------------------------------------------------------------- +__inline void AT91F_EnableCAN( + AT91PS_CAN pCAN) // pointer to a CAN controller +{ + pCAN->CAN_MR |= AT91C_CAN_CANEN; + + // Wait for WAKEUP flag raising <=> 11-recessive-bit were scanned by the transceiver + while( (pCAN->CAN_SR & AT91C_CAN_WAKEUP) != AT91C_CAN_WAKEUP ); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_DisableCAN() +//* \brief +//*---------------------------------------------------------------------------- +__inline void AT91F_DisableCAN( + AT91PS_CAN pCAN) // pointer to a CAN controller +{ + pCAN->CAN_MR &= ~AT91C_CAN_CANEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_EnableIt +//* \brief Enable CAN interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_EnableIt ( + AT91PS_CAN pCAN, // pointer to a CAN controller + unsigned int flag) // IT to be enabled +{ + //* Write to the IER register + pCAN->CAN_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_DisableIt +//* \brief Disable CAN interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_DisableIt ( + AT91PS_CAN pCAN, // pointer to a CAN controller + unsigned int flag) // IT to be disabled +{ + //* Write to the IDR register + pCAN->CAN_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetStatus +//* \brief Return CAN Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetStatus( // \return CAN Interrupt Status + AT91PS_CAN pCAN) // pointer to a CAN controller +{ + return pCAN->CAN_SR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetInterruptMaskStatus +//* \brief Return CAN Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetInterruptMaskStatus( // \return CAN Interrupt Mask Status + AT91PS_CAN pCAN) // pointer to a CAN controller +{ + return pCAN->CAN_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_IsInterruptMasked +//* \brief Test if CAN Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_IsInterruptMasked( + AT91PS_CAN pCAN, // \arg pointer to a CAN controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_CAN_GetInterruptMaskStatus(pCAN) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_IsStatusSet +//* \brief Test if CAN Interrupt is Set +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_IsStatusSet( + AT91PS_CAN pCAN, // \arg pointer to a CAN controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_CAN_GetStatus(pCAN) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgModeReg +//* \brief Configure the Mode Register of the CAN controller +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgModeReg ( + AT91PS_CAN pCAN, // pointer to a CAN controller + unsigned int mode) // mode register +{ + //* Write to the MR register + pCAN->CAN_MR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetModeReg +//* \brief Return the Mode Register of the CAN controller value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetModeReg ( + AT91PS_CAN pCAN // pointer to a CAN controller + ) +{ + return pCAN->CAN_MR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgBaudrateReg +//* \brief Configure the Baudrate of the CAN controller for the network +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgBaudrateReg ( + AT91PS_CAN pCAN, // pointer to a CAN controller + unsigned int baudrate_cfg) +{ + //* Write to the BR register + pCAN->CAN_BR = baudrate_cfg; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetBaudrate +//* \brief Return the Baudrate of the CAN controller for the network value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetBaudrate ( + AT91PS_CAN pCAN // pointer to a CAN controller + ) +{ + return pCAN->CAN_BR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetInternalCounter +//* \brief Return CAN Timer Regsiter Value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetInternalCounter ( + AT91PS_CAN pCAN // pointer to a CAN controller + ) +{ + return pCAN->CAN_TIM; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetTimestamp +//* \brief Return CAN Timestamp Register Value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetTimestamp ( + AT91PS_CAN pCAN // pointer to a CAN controller + ) +{ + return pCAN->CAN_TIMESTP; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetErrorCounter +//* \brief Return CAN Error Counter Register Value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetErrorCounter ( + AT91PS_CAN pCAN // pointer to a CAN controller + ) +{ + return pCAN->CAN_ECR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_InitTransferRequest +//* \brief Request for a transfer on the corresponding mailboxes +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_InitTransferRequest ( + AT91PS_CAN pCAN, // pointer to a CAN controller + unsigned int transfer_cmd) +{ + pCAN->CAN_TCR = transfer_cmd; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_InitAbortRequest +//* \brief Abort the corresponding mailboxes +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_InitAbortRequest ( + AT91PS_CAN pCAN, // pointer to a CAN controller + unsigned int abort_cmd) +{ + pCAN->CAN_ACR = abort_cmd; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgMessageModeReg +//* \brief Program the Message Mode Register +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgMessageModeReg ( + AT91PS_CAN_MB CAN_Mailbox, // pointer to a CAN Mailbox + unsigned int mode) +{ + CAN_Mailbox->CAN_MB_MMR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetMessageModeReg +//* \brief Return the Message Mode Register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetMessageModeReg ( + AT91PS_CAN_MB CAN_Mailbox) // pointer to a CAN Mailbox +{ + return CAN_Mailbox->CAN_MB_MMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgMessageIDReg +//* \brief Program the Message ID Register +//* \brief Version == 0 for Standard messsage, Version == 1 for Extended +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgMessageIDReg ( + AT91PS_CAN_MB CAN_Mailbox, // pointer to a CAN Mailbox + unsigned int id, + unsigned char version) +{ + if(version==0) // IDvA Standard Format + CAN_Mailbox->CAN_MB_MID = id<<18; + else // IDvB Extended Format + CAN_Mailbox->CAN_MB_MID = id | (1<<29); // set MIDE bit +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetMessageIDReg +//* \brief Return the Message ID Register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetMessageIDReg ( + AT91PS_CAN_MB CAN_Mailbox) // pointer to a CAN Mailbox +{ + return CAN_Mailbox->CAN_MB_MID; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgMessageAcceptanceMaskReg +//* \brief Program the Message Acceptance Mask Register +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgMessageAcceptanceMaskReg ( + AT91PS_CAN_MB CAN_Mailbox, // pointer to a CAN Mailbox + unsigned int mask) +{ + CAN_Mailbox->CAN_MB_MAM = mask; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetMessageAcceptanceMaskReg +//* \brief Return the Message Acceptance Mask Register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetMessageAcceptanceMaskReg ( + AT91PS_CAN_MB CAN_Mailbox) // pointer to a CAN Mailbox +{ + return CAN_Mailbox->CAN_MB_MAM; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetFamilyID +//* \brief Return the Message ID Register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetFamilyID ( + AT91PS_CAN_MB CAN_Mailbox) // pointer to a CAN Mailbox +{ + return CAN_Mailbox->CAN_MB_MFID; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgMessageCtrl +//* \brief Request and config for a transfer on the corresponding mailbox +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgMessageCtrlReg ( + AT91PS_CAN_MB CAN_Mailbox, // pointer to a CAN Mailbox + unsigned int message_ctrl_cmd) +{ + CAN_Mailbox->CAN_MB_MCR = message_ctrl_cmd; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetMessageStatus +//* \brief Return CAN Mailbox Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetMessageStatus ( + AT91PS_CAN_MB CAN_Mailbox) // pointer to a CAN Mailbox +{ + return CAN_Mailbox->CAN_MB_MSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgMessageDataLow +//* \brief Program data low value +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgMessageDataLow ( + AT91PS_CAN_MB CAN_Mailbox, // pointer to a CAN Mailbox + unsigned int data) +{ + CAN_Mailbox->CAN_MB_MDL = data; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetMessageDataLow +//* \brief Return data low value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetMessageDataLow ( + AT91PS_CAN_MB CAN_Mailbox) // pointer to a CAN Mailbox +{ + return CAN_Mailbox->CAN_MB_MDL; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgMessageDataHigh +//* \brief Program data high value +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgMessageDataHigh ( + AT91PS_CAN_MB CAN_Mailbox, // pointer to a CAN Mailbox + unsigned int data) +{ + CAN_Mailbox->CAN_MB_MDH = data; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetMessageDataHigh +//* \brief Return data high value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetMessageDataHigh ( + AT91PS_CAN_MB CAN_Mailbox) // pointer to a CAN Mailbox +{ + return CAN_Mailbox->CAN_MB_MDH; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_Open +//* \brief Open a CAN Port +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_Open ( + const unsigned int null) // \arg +{ + /* NOT DEFINED AT THIS MOMENT */ + return ( 0 ); +} +/* ***************************************************************************** + SOFTWARE API FOR ADC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_EnableIt +//* \brief Enable ADC interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_EnableIt ( + AT91PS_ADC pADC, // pointer to a ADC controller + unsigned int flag) // IT to be enabled +{ + //* Write to the IER register + pADC->ADC_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_DisableIt +//* \brief Disable ADC interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_DisableIt ( + AT91PS_ADC pADC, // pointer to a ADC controller + unsigned int flag) // IT to be disabled +{ + //* Write to the IDR register + pADC->ADC_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetStatus +//* \brief Return ADC Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetStatus( // \return ADC Interrupt Status + AT91PS_ADC pADC) // pointer to a ADC controller +{ + return pADC->ADC_SR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetInterruptMaskStatus +//* \brief Return ADC Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetInterruptMaskStatus( // \return ADC Interrupt Mask Status + AT91PS_ADC pADC) // pointer to a ADC controller +{ + return pADC->ADC_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_IsInterruptMasked +//* \brief Test if ADC Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_IsInterruptMasked( + AT91PS_ADC pADC, // \arg pointer to a ADC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_ADC_GetInterruptMaskStatus(pADC) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_IsStatusSet +//* \brief Test if ADC Status is Set +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_IsStatusSet( + AT91PS_ADC pADC, // \arg pointer to a ADC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_ADC_GetStatus(pADC) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_CfgModeReg +//* \brief Configure the Mode Register of the ADC controller +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_CfgModeReg ( + AT91PS_ADC pADC, // pointer to a ADC controller + unsigned int mode) // mode register +{ + //* Write to the MR register + pADC->ADC_MR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetModeReg +//* \brief Return the Mode Register of the ADC controller value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetModeReg ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_MR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_CfgTimings +//* \brief Configure the different necessary timings of the ADC controller +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_CfgTimings ( + AT91PS_ADC pADC, // pointer to a ADC controller + unsigned int mck_clock, // in MHz + unsigned int adc_clock, // in MHz + unsigned int startup_time, // in us + unsigned int sample_and_hold_time) // in ns +{ + unsigned int prescal,startup,shtim; + + prescal = mck_clock/(2*adc_clock) - 1; + startup = adc_clock*startup_time/8 - 1; + shtim = adc_clock*sample_and_hold_time/1000 - 1; + + //* Write to the MR register + pADC->ADC_MR = ( (prescal<<8) & AT91C_ADC_PRESCAL) | ( (startup<<16) & AT91C_ADC_STARTUP) | ( (shtim<<24) & AT91C_ADC_SHTIM); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_EnableChannel +//* \brief Return ADC Timer Register Value +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_EnableChannel ( + AT91PS_ADC pADC, // pointer to a ADC controller + unsigned int channel) // mode register +{ + //* Write to the CHER register + pADC->ADC_CHER = channel; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_DisableChannel +//* \brief Return ADC Timer Register Value +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_DisableChannel ( + AT91PS_ADC pADC, // pointer to a ADC controller + unsigned int channel) // mode register +{ + //* Write to the CHDR register + pADC->ADC_CHDR = channel; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetChannelStatus +//* \brief Return ADC Timer Register Value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetChannelStatus ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CHSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_StartConversion +//* \brief Software request for a analog to digital conversion +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_StartConversion ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + pADC->ADC_CR = AT91C_ADC_START; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_SoftReset +//* \brief Software reset +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_SoftReset ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + pADC->ADC_CR = AT91C_ADC_SWRST; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetLastConvertedData +//* \brief Return the Last Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetLastConvertedData ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_LCDR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH0 +//* \brief Return the Channel 0 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH0 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR0; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH1 +//* \brief Return the Channel 1 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH1 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR1; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH2 +//* \brief Return the Channel 2 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH2 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR2; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH3 +//* \brief Return the Channel 3 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH3 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR3; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH4 +//* \brief Return the Channel 4 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH4 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR4; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH5 +//* \brief Return the Channel 5 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH5 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR5; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH6 +//* \brief Return the Channel 6 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH6 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR6; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH7 +//* \brief Return the Channel 7 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH7 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR7; +} + +/* ***************************************************************************** + SOFTWARE API FOR AES + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_EnableIt +//* \brief Enable AES interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_EnableIt ( + AT91PS_AES pAES, // pointer to a AES controller + unsigned int flag) // IT to be enabled +{ + //* Write to the IER register + pAES->AES_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_DisableIt +//* \brief Disable AES interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_DisableIt ( + AT91PS_AES pAES, // pointer to a AES controller + unsigned int flag) // IT to be disabled +{ + //* Write to the IDR register + pAES->AES_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_GetStatus +//* \brief Return AES Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AES_GetStatus( // \return AES Interrupt Status + AT91PS_AES pAES) // pointer to a AES controller +{ + return pAES->AES_ISR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_GetInterruptMaskStatus +//* \brief Return AES Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AES_GetInterruptMaskStatus( // \return AES Interrupt Mask Status + AT91PS_AES pAES) // pointer to a AES controller +{ + return pAES->AES_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_IsInterruptMasked +//* \brief Test if AES Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AES_IsInterruptMasked( + AT91PS_AES pAES, // \arg pointer to a AES controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_AES_GetInterruptMaskStatus(pAES) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_IsStatusSet +//* \brief Test if AES Status is Set +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AES_IsStatusSet( + AT91PS_AES pAES, // \arg pointer to a AES controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_AES_GetStatus(pAES) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_CfgModeReg +//* \brief Configure the Mode Register of the AES controller +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_CfgModeReg ( + AT91PS_AES pAES, // pointer to a AES controller + unsigned int mode) // mode register +{ + //* Write to the MR register + pAES->AES_MR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_GetModeReg +//* \brief Return the Mode Register of the AES controller value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AES_GetModeReg ( + AT91PS_AES pAES // pointer to a AES controller + ) +{ + return pAES->AES_MR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_StartProcessing +//* \brief Start Encryption or Decryption +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_StartProcessing ( + AT91PS_AES pAES // pointer to a AES controller + ) +{ + pAES->AES_CR = AT91C_AES_START; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_SoftReset +//* \brief Reset AES +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_SoftReset ( + AT91PS_AES pAES // pointer to a AES controller + ) +{ + pAES->AES_CR = AT91C_AES_SWRST; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_LoadNewSeed +//* \brief Load New Seed in the random number generator +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_LoadNewSeed ( + AT91PS_AES pAES // pointer to a AES controller + ) +{ + pAES->AES_CR = AT91C_AES_LOADSEED; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_SetCryptoKey +//* \brief Set Cryptographic Key x +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_SetCryptoKey ( + AT91PS_AES pAES, // pointer to a AES controller + unsigned char index, + unsigned int keyword + ) +{ + pAES->AES_KEYWxR[index] = keyword; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_InputData +//* \brief Set Input Data x +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_InputData ( + AT91PS_AES pAES, // pointer to a AES controller + unsigned char index, + unsigned int indata + ) +{ + pAES->AES_IDATAxR[index] = indata; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_GetOutputData +//* \brief Get Output Data x +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AES_GetOutputData ( + AT91PS_AES pAES, // pointer to a AES controller + unsigned char index + ) +{ + return pAES->AES_ODATAxR[index]; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_SetInitializationVector +//* \brief Set Initialization Vector (or Counter) x +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_SetInitializationVector ( + AT91PS_AES pAES, // pointer to a AES controller + unsigned char index, + unsigned int initvector + ) +{ + pAES->AES_IVxR[index] = initvector; +} + +/* ***************************************************************************** + SOFTWARE API FOR TDES + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_EnableIt +//* \brief Enable TDES interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_EnableIt ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned int flag) // IT to be enabled +{ + //* Write to the IER register + pTDES->TDES_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_DisableIt +//* \brief Disable TDES interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_DisableIt ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned int flag) // IT to be disabled +{ + //* Write to the IDR register + pTDES->TDES_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_GetStatus +//* \brief Return TDES Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TDES_GetStatus( // \return TDES Interrupt Status + AT91PS_TDES pTDES) // pointer to a TDES controller +{ + return pTDES->TDES_ISR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_GetInterruptMaskStatus +//* \brief Return TDES Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TDES_GetInterruptMaskStatus( // \return TDES Interrupt Mask Status + AT91PS_TDES pTDES) // pointer to a TDES controller +{ + return pTDES->TDES_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_IsInterruptMasked +//* \brief Test if TDES Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TDES_IsInterruptMasked( + AT91PS_TDES pTDES, // \arg pointer to a TDES controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_TDES_GetInterruptMaskStatus(pTDES) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_IsStatusSet +//* \brief Test if TDES Status is Set +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TDES_IsStatusSet( + AT91PS_TDES pTDES, // \arg pointer to a TDES controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_TDES_GetStatus(pTDES) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_CfgModeReg +//* \brief Configure the Mode Register of the TDES controller +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_CfgModeReg ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned int mode) // mode register +{ + //* Write to the MR register + pTDES->TDES_MR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_GetModeReg +//* \brief Return the Mode Register of the TDES controller value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TDES_GetModeReg ( + AT91PS_TDES pTDES // pointer to a TDES controller + ) +{ + return pTDES->TDES_MR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_StartProcessing +//* \brief Start Encryption or Decryption +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_StartProcessing ( + AT91PS_TDES pTDES // pointer to a TDES controller + ) +{ + pTDES->TDES_CR = AT91C_TDES_START; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_SoftReset +//* \brief Reset TDES +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_SoftReset ( + AT91PS_TDES pTDES // pointer to a TDES controller + ) +{ + pTDES->TDES_CR = AT91C_TDES_SWRST; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_SetCryptoKey1 +//* \brief Set Cryptographic Key 1 Word x +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_SetCryptoKey1 ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned char index, + unsigned int keyword + ) +{ + pTDES->TDES_KEY1WxR[index] = keyword; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_SetCryptoKey2 +//* \brief Set Cryptographic Key 2 Word x +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_SetCryptoKey2 ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned char index, + unsigned int keyword + ) +{ + pTDES->TDES_KEY2WxR[index] = keyword; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_SetCryptoKey3 +//* \brief Set Cryptographic Key 3 Word x +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_SetCryptoKey3 ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned char index, + unsigned int keyword + ) +{ + pTDES->TDES_KEY3WxR[index] = keyword; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_InputData +//* \brief Set Input Data x +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_InputData ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned char index, + unsigned int indata + ) +{ + pTDES->TDES_IDATAxR[index] = indata; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_GetOutputData +//* \brief Get Output Data x +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TDES_GetOutputData ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned char index + ) +{ + return pTDES->TDES_ODATAxR[index]; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_SetInitializationVector +//* \brief Set Initialization Vector x +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_SetInitializationVector ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned char index, + unsigned int initvector + ) +{ + pTDES->TDES_IVxR[index] = initvector; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_DBGU_CfgPMC +//* \brief Enable Peripheral clock in PMC for DBGU +//*---------------------------------------------------------------------------- +__inline void AT91F_DBGU_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_DBGU_CfgPIO +//* \brief Configure PIO controllers to drive DBGU signals +//*---------------------------------------------------------------------------- +__inline void AT91F_DBGU_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA27_DRXD ) | + ((unsigned int) AT91C_PA28_DTXD ), // Peripheral A + 0); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_CfgPMC +//* \brief Enable Peripheral clock in PMC for PMC +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_CfgPIO +//* \brief Configure PIO controllers to drive PMC signals +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB30_PCK2 ) | + ((unsigned int) AT91C_PB29_PCK1 ), // Peripheral A + ((unsigned int) AT91C_PB20_PCK0 ) | + ((unsigned int) AT91C_PB0_PCK0 ) | + ((unsigned int) AT91C_PB22_PCK2 ) | + ((unsigned int) AT91C_PB21_PCK1 )); // Peripheral B + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PA30_PCK2 ) | + ((unsigned int) AT91C_PA13_PCK1 ) | + ((unsigned int) AT91C_PA27_PCK3 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_VREG_CfgPMC +//* \brief Enable Peripheral clock in PMC for VREG +//*---------------------------------------------------------------------------- +__inline void AT91F_VREG_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_RSTC_CfgPMC +//* \brief Enable Peripheral clock in PMC for RSTC +//*---------------------------------------------------------------------------- +__inline void AT91F_RSTC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_CfgPMC +//* \brief Enable Peripheral clock in PMC for SSC +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SSC)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_CfgPIO +//* \brief Configure PIO controllers to drive SSC signals +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA25_RK ) | + ((unsigned int) AT91C_PA22_TK ) | + ((unsigned int) AT91C_PA21_TF ) | + ((unsigned int) AT91C_PA24_RD ) | + ((unsigned int) AT91C_PA26_RF ) | + ((unsigned int) AT91C_PA23_TD ), // Peripheral A + 0); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_WDTC_CfgPMC +//* \brief Enable Peripheral clock in PMC for WDTC +//*---------------------------------------------------------------------------- +__inline void AT91F_WDTC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US1_CfgPMC +//* \brief Enable Peripheral clock in PMC for US1 +//*---------------------------------------------------------------------------- +__inline void AT91F_US1_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_US1)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US1_CfgPIO +//* \brief Configure PIO controllers to drive US1 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_US1_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PB26_RI1 ) | + ((unsigned int) AT91C_PB24_DSR1 ) | + ((unsigned int) AT91C_PB23_DCD1 ) | + ((unsigned int) AT91C_PB25_DTR1 )); // Peripheral B + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA7_SCK1 ) | + ((unsigned int) AT91C_PA8_RTS1 ) | + ((unsigned int) AT91C_PA6_TXD1 ) | + ((unsigned int) AT91C_PA5_RXD1 ) | + ((unsigned int) AT91C_PA9_CTS1 ), // Peripheral A + 0); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US0_CfgPMC +//* \brief Enable Peripheral clock in PMC for US0 +//*---------------------------------------------------------------------------- +__inline void AT91F_US0_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_US0)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US0_CfgPIO +//* \brief Configure PIO controllers to drive US0 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_US0_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA0_RXD0 ) | + ((unsigned int) AT91C_PA4_CTS0 ) | + ((unsigned int) AT91C_PA3_RTS0 ) | + ((unsigned int) AT91C_PA2_SCK0 ) | + ((unsigned int) AT91C_PA1_TXD0 ), // Peripheral A + 0); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI1_CfgPMC +//* \brief Enable Peripheral clock in PMC for SPI1 +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI1_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SPI1)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI1_CfgPIO +//* \brief Configure PIO controllers to drive SPI1 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI1_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PB16_NPCS13 ) | + ((unsigned int) AT91C_PB10_NPCS11 ) | + ((unsigned int) AT91C_PB11_NPCS12 )); // Peripheral B + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PA4_NPCS13 ) | + ((unsigned int) AT91C_PA29_NPCS13 ) | + ((unsigned int) AT91C_PA21_NPCS10 ) | + ((unsigned int) AT91C_PA22_SPCK1 ) | + ((unsigned int) AT91C_PA25_NPCS11 ) | + ((unsigned int) AT91C_PA2_NPCS11 ) | + ((unsigned int) AT91C_PA24_MISO1 ) | + ((unsigned int) AT91C_PA3_NPCS12 ) | + ((unsigned int) AT91C_PA26_NPCS12 ) | + ((unsigned int) AT91C_PA23_MOSI1 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI0_CfgPMC +//* \brief Enable Peripheral clock in PMC for SPI0 +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI0_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SPI0)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI0_CfgPIO +//* \brief Configure PIO controllers to drive SPI0 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI0_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PB13_NPCS01 ) | + ((unsigned int) AT91C_PB17_NPCS03 ) | + ((unsigned int) AT91C_PB14_NPCS02 )); // Peripheral B + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA16_MISO0 ) | + ((unsigned int) AT91C_PA13_NPCS01 ) | + ((unsigned int) AT91C_PA15_NPCS03 ) | + ((unsigned int) AT91C_PA17_MOSI0 ) | + ((unsigned int) AT91C_PA18_SPCK0 ) | + ((unsigned int) AT91C_PA14_NPCS02 ) | + ((unsigned int) AT91C_PA12_NPCS00 ), // Peripheral A + ((unsigned int) AT91C_PA7_NPCS01 ) | + ((unsigned int) AT91C_PA9_NPCS03 ) | + ((unsigned int) AT91C_PA8_NPCS02 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITC_CfgPMC +//* \brief Enable Peripheral clock in PMC for PITC +//*---------------------------------------------------------------------------- +__inline void AT91F_PITC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_CfgPMC +//* \brief Enable Peripheral clock in PMC for AIC +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_FIQ) | + ((unsigned int) 1 << AT91C_ID_IRQ0) | + ((unsigned int) 1 << AT91C_ID_IRQ1)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_CfgPIO +//* \brief Configure PIO controllers to drive AIC signals +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA30_IRQ0 ) | + ((unsigned int) AT91C_PA29_FIQ ), // Peripheral A + ((unsigned int) AT91C_PA14_IRQ1 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_CfgPMC +//* \brief Enable Peripheral clock in PMC for AES +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_AES)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_CfgPMC +//* \brief Enable Peripheral clock in PMC for TWI +//*---------------------------------------------------------------------------- +__inline void AT91F_TWI_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_TWI)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_CfgPIO +//* \brief Configure PIO controllers to drive TWI signals +//*---------------------------------------------------------------------------- +__inline void AT91F_TWI_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA11_TWCK ) | + ((unsigned int) AT91C_PA10_TWD ), // Peripheral A + 0); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_CfgPMC +//* \brief Enable Peripheral clock in PMC for ADC +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_ADC)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_CfgPIO +//* \brief Configure PIO controllers to drive ADC signals +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PB18_ADTRG )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWMC_CH3_CfgPIO +//* \brief Configure PIO controllers to drive PWMC_CH3 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_CH3_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB22_PWM3 ), // Peripheral A + ((unsigned int) AT91C_PB30_PWM3 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWMC_CH2_CfgPIO +//* \brief Configure PIO controllers to drive PWMC_CH2 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_CH2_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB21_PWM2 ), // Peripheral A + ((unsigned int) AT91C_PB29_PWM2 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWMC_CH1_CfgPIO +//* \brief Configure PIO controllers to drive PWMC_CH1 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_CH1_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB20_PWM1 ), // Peripheral A + ((unsigned int) AT91C_PB28_PWM1 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWMC_CH0_CfgPIO +//* \brief Configure PIO controllers to drive PWMC_CH0 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_CH0_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB19_PWM0 ), // Peripheral A + ((unsigned int) AT91C_PB27_PWM0 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_RTTC_CfgPMC +//* \brief Enable Peripheral clock in PMC for RTTC +//*---------------------------------------------------------------------------- +__inline void AT91F_RTTC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_CfgPMC +//* \brief Enable Peripheral clock in PMC for UDP +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_UDP)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_CfgPMC +//* \brief Enable Peripheral clock in PMC for TDES +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_TDES)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_EMAC_CfgPMC +//* \brief Enable Peripheral clock in PMC for EMAC +//*---------------------------------------------------------------------------- +__inline void AT91F_EMAC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_EMAC)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_EMAC_CfgPIO +//* \brief Configure PIO controllers to drive EMAC signals +//*---------------------------------------------------------------------------- +__inline void AT91F_EMAC_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB2_ETX0 ) | + ((unsigned int) AT91C_PB12_ETXER ) | + ((unsigned int) AT91C_PB16_ECOL ) | + ((unsigned int) AT91C_PB11_ETX3 ) | + ((unsigned int) AT91C_PB6_ERX1 ) | + ((unsigned int) AT91C_PB15_ERXDV ) | + ((unsigned int) AT91C_PB13_ERX2 ) | + ((unsigned int) AT91C_PB3_ETX1 ) | + ((unsigned int) AT91C_PB8_EMDC ) | + ((unsigned int) AT91C_PB5_ERX0 ) | + //((unsigned int) AT91C_PB18_EF100 ) | + ((unsigned int) AT91C_PB14_ERX3 ) | + ((unsigned int) AT91C_PB4_ECRS_ECRSDV) | + ((unsigned int) AT91C_PB1_ETXEN ) | + ((unsigned int) AT91C_PB10_ETX2 ) | + ((unsigned int) AT91C_PB0_ETXCK_EREFCK) | + ((unsigned int) AT91C_PB9_EMDIO ) | + ((unsigned int) AT91C_PB7_ERXER ) | + ((unsigned int) AT91C_PB17_ERXCK ), // Peripheral A + 0); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC0_CfgPMC +//* \brief Enable Peripheral clock in PMC for TC0 +//*---------------------------------------------------------------------------- +__inline void AT91F_TC0_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_TC0)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC0_CfgPIO +//* \brief Configure PIO controllers to drive TC0 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_TC0_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB23_TIOA0 ) | + ((unsigned int) AT91C_PB24_TIOB0 ), // Peripheral A + ((unsigned int) AT91C_PB12_TCLK0 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC1_CfgPMC +//* \brief Enable Peripheral clock in PMC for TC1 +//*---------------------------------------------------------------------------- +__inline void AT91F_TC1_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_TC1)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC1_CfgPIO +//* \brief Configure PIO controllers to drive TC1 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_TC1_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB25_TIOA1 ) | + ((unsigned int) AT91C_PB26_TIOB1 ), // Peripheral A + ((unsigned int) AT91C_PB19_TCLK1 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC2_CfgPMC +//* \brief Enable Peripheral clock in PMC for TC2 +//*---------------------------------------------------------------------------- +__inline void AT91F_TC2_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_TC2)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC2_CfgPIO +//* \brief Configure PIO controllers to drive TC2 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_TC2_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB28_TIOB2 ) | + ((unsigned int) AT91C_PB27_TIOA2 ), // Peripheral A + 0); // Peripheral B + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PA15_TCLK2 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_CfgPMC +//* \brief Enable Peripheral clock in PMC for MC +//*---------------------------------------------------------------------------- +__inline void AT91F_MC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIOA_CfgPMC +//* \brief Enable Peripheral clock in PMC for PIOA +//*---------------------------------------------------------------------------- +__inline void AT91F_PIOA_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_PIOA)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIOB_CfgPMC +//* \brief Enable Peripheral clock in PMC for PIOB +//*---------------------------------------------------------------------------- +__inline void AT91F_PIOB_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_PIOB)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgPMC +//* \brief Enable Peripheral clock in PMC for CAN +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_CAN)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgPIO +//* \brief Configure PIO controllers to drive CAN signals +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA20_CANTX ) | + ((unsigned int) AT91C_PA19_CANRX ), // Peripheral A + 0); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWMC_CfgPMC +//* \brief Enable Peripheral clock in PMC for PWMC +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_PWMC)); +} + +#endif // lib_AT91SAM7X128_H diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X256.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X256.h new file mode 100644 index 0000000..02ee900 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X256.h @@ -0,0 +1,4558 @@ +//* ---------------------------------------------------------------------------- +//* ATMEL Microcontroller Software Support - ROUSSET - +//* ---------------------------------------------------------------------------- +//* DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR +//* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +//* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE +//* DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT, +//* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +//* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +//* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +//* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +//* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +//* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//* ---------------------------------------------------------------------------- +//* File Name : lib_AT91SAM7X256.h +//* Object : AT91SAM7X256 inlined functions +//* Generated : AT91 SW Application Group 05/20/2005 (16:22:29) +//* +//* CVS Reference : /lib_dbgu.h/1.1/Fri Jan 31 12:18:40 2003// +//* CVS Reference : /lib_pmc_SAM7X.h/1.1/Tue Feb 1 08:32:10 2005// +//* CVS Reference : /lib_VREG_6085B.h/1.1/Tue Feb 1 16:20:47 2005// +//* CVS Reference : /lib_rstc_6098A.h/1.1/Wed Oct 6 10:39:20 2004// +//* CVS Reference : /lib_ssc.h/1.4/Fri Jan 31 12:19:20 2003// +//* CVS Reference : /lib_wdtc_6080A.h/1.1/Wed Oct 6 10:38:30 2004// +//* CVS Reference : /lib_usart.h/1.5/Thu Nov 21 16:01:54 2002// +//* CVS Reference : /lib_spi2.h/1.1/Mon Aug 25 14:23:52 2003// +//* CVS Reference : /lib_pitc_6079A.h/1.2/Tue Nov 9 14:43:56 2004// +//* CVS Reference : /lib_aic_6075b.h/1.1/Fri May 20 14:01:19 2005// +//* CVS Reference : /lib_aes_6149a.h/1.1/Mon Jan 17 07:43:09 2005// +//* CVS Reference : /lib_twi.h/1.3/Mon Jul 19 14:27:58 2004// +//* CVS Reference : /lib_adc.h/1.6/Fri Oct 17 09:12:38 2003// +//* CVS Reference : /lib_rttc_6081A.h/1.1/Wed Oct 6 10:39:38 2004// +//* CVS Reference : /lib_udp.h/1.4/Wed Feb 16 08:39:34 2005// +//* CVS Reference : /lib_des3_6150a.h/1.1/Mon Jan 17 09:19:19 2005// +//* CVS Reference : /lib_tc_1753b.h/1.1/Fri Jan 31 12:20:02 2003// +//* CVS Reference : /lib_MC_SAM7X.h/1.1/Thu Mar 25 15:19:14 2004// +//* CVS Reference : /lib_pio.h/1.3/Fri Jan 31 12:18:56 2003// +//* CVS Reference : /lib_can_AT91.h/1.4/Fri Oct 17 09:12:50 2003// +//* CVS Reference : /lib_PWM_SAM.h/1.3/Thu Jan 22 10:10:50 2004// +//* CVS Reference : /lib_pdc.h/1.2/Tue Jul 2 13:29:40 2002// +//* ---------------------------------------------------------------------------- + +#ifndef lib_AT91SAM7X256_H +#define lib_AT91SAM7X256_H + +/* ***************************************************************************** + SOFTWARE API FOR AIC + ***************************************************************************** */ +#define AT91C_AIC_BRANCH_OPCODE ((void (*) ()) 0xE51FFF20) // ldr, pc, [pc, #-&F20] + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_ConfigureIt +//* \brief Interrupt Handler Initialization +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AIC_ConfigureIt ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id, // \arg interrupt number to initialize + unsigned int priority, // \arg priority to give to the interrupt + unsigned int src_type, // \arg activation and sense of activation + void (*newHandler) (void) ) // \arg address of the interrupt handler +{ + unsigned int oldHandler; + unsigned int mask ; + + oldHandler = pAic->AIC_SVR[irq_id]; + + mask = 0x1 << irq_id ; + //* Disable the interrupt on the interrupt controller + pAic->AIC_IDCR = mask ; + //* Save the interrupt handler routine pointer and the interrupt priority + pAic->AIC_SVR[irq_id] = (unsigned int) newHandler ; + //* Store the Source Mode Register + pAic->AIC_SMR[irq_id] = src_type | priority ; + //* Clear the interrupt on the interrupt controller + pAic->AIC_ICCR = mask ; + + return oldHandler; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_EnableIt +//* \brief Enable corresponding IT number +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_EnableIt ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id ) // \arg interrupt number to initialize +{ + //* Enable the interrupt on the interrupt controller + pAic->AIC_IECR = 0x1 << irq_id ; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_DisableIt +//* \brief Disable corresponding IT number +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_DisableIt ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id ) // \arg interrupt number to initialize +{ + unsigned int mask = 0x1 << irq_id; + //* Disable the interrupt on the interrupt controller + pAic->AIC_IDCR = mask ; + //* Clear the interrupt on the Interrupt Controller ( if one is pending ) + pAic->AIC_ICCR = mask ; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_ClearIt +//* \brief Clear corresponding IT number +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_ClearIt ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id) // \arg interrupt number to initialize +{ + //* Clear the interrupt on the Interrupt Controller ( if one is pending ) + pAic->AIC_ICCR = (0x1 << irq_id); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_AcknowledgeIt +//* \brief Acknowledge corresponding IT number +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_AcknowledgeIt ( + AT91PS_AIC pAic) // \arg pointer to the AIC registers +{ + pAic->AIC_EOICR = pAic->AIC_EOICR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_SetExceptionVector +//* \brief Configure vector handler +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AIC_SetExceptionVector ( + unsigned int *pVector, // \arg pointer to the AIC registers + void (*Handler) () ) // \arg Interrupt Handler +{ + unsigned int oldVector = *pVector; + + if ((unsigned int) Handler == (unsigned int) AT91C_AIC_BRANCH_OPCODE) + *pVector = (unsigned int) AT91C_AIC_BRANCH_OPCODE; + else + *pVector = (((((unsigned int) Handler) - ((unsigned int) pVector) - 0x8) >> 2) & 0x00FFFFFF) | 0xEA000000; + + return oldVector; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_Trig +//* \brief Trig an IT +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_Trig ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id) // \arg interrupt number +{ + pAic->AIC_ISCR = (0x1 << irq_id) ; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_IsActive +//* \brief Test if an IT is active +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AIC_IsActive ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id) // \arg Interrupt Number +{ + return (pAic->AIC_ISR & (0x1 << irq_id)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_IsPending +//* \brief Test if an IT is pending +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AIC_IsPending ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id) // \arg Interrupt Number +{ + return (pAic->AIC_IPR & (0x1 << irq_id)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_Open +//* \brief Set exception vectors and AIC registers to default values +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_Open( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + void (*IrqHandler) (), // \arg Default IRQ vector exception + void (*FiqHandler) (), // \arg Default FIQ vector exception + void (*DefaultHandler) (), // \arg Default Handler set in ISR + void (*SpuriousHandler) (), // \arg Default Spurious Handler + unsigned int protectMode) // \arg Debug Control Register +{ + int i; + + // Disable all interrupts and set IVR to the default handler + for (i = 0; i < 32; ++i) { + AT91F_AIC_DisableIt(pAic, i); + AT91F_AIC_ConfigureIt(pAic, i, AT91C_AIC_PRIOR_LOWEST, AT91C_AIC_SRCTYPE_HIGH_LEVEL, DefaultHandler); + } + + // Set the IRQ exception vector + AT91F_AIC_SetExceptionVector((unsigned int *) 0x18, IrqHandler); + // Set the Fast Interrupt exception vector + AT91F_AIC_SetExceptionVector((unsigned int *) 0x1C, FiqHandler); + + pAic->AIC_SPU = (unsigned int) SpuriousHandler; + pAic->AIC_DCR = protectMode; +} +/* ***************************************************************************** + SOFTWARE API FOR PDC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_SetNextRx +//* \brief Set the next receive transfer descriptor +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_SetNextRx ( + AT91PS_PDC pPDC, // \arg pointer to a PDC controller + char *address, // \arg address to the next bloc to be received + unsigned int bytes) // \arg number of bytes to be received +{ + pPDC->PDC_RNPR = (unsigned int) address; + pPDC->PDC_RNCR = bytes; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_SetNextTx +//* \brief Set the next transmit transfer descriptor +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_SetNextTx ( + AT91PS_PDC pPDC, // \arg pointer to a PDC controller + char *address, // \arg address to the next bloc to be transmitted + unsigned int bytes) // \arg number of bytes to be transmitted +{ + pPDC->PDC_TNPR = (unsigned int) address; + pPDC->PDC_TNCR = bytes; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_SetRx +//* \brief Set the receive transfer descriptor +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_SetRx ( + AT91PS_PDC pPDC, // \arg pointer to a PDC controller + char *address, // \arg address to the next bloc to be received + unsigned int bytes) // \arg number of bytes to be received +{ + pPDC->PDC_RPR = (unsigned int) address; + pPDC->PDC_RCR = bytes; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_SetTx +//* \brief Set the transmit transfer descriptor +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_SetTx ( + AT91PS_PDC pPDC, // \arg pointer to a PDC controller + char *address, // \arg address to the next bloc to be transmitted + unsigned int bytes) // \arg number of bytes to be transmitted +{ + pPDC->PDC_TPR = (unsigned int) address; + pPDC->PDC_TCR = bytes; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_EnableTx +//* \brief Enable transmit +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_EnableTx ( + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + pPDC->PDC_PTCR = AT91C_PDC_TXTEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_EnableRx +//* \brief Enable receive +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_EnableRx ( + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + pPDC->PDC_PTCR = AT91C_PDC_RXTEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_DisableTx +//* \brief Disable transmit +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_DisableTx ( + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + pPDC->PDC_PTCR = AT91C_PDC_TXTDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_DisableRx +//* \brief Disable receive +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_DisableRx ( + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + pPDC->PDC_PTCR = AT91C_PDC_RXTDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_IsTxEmpty +//* \brief Test if the current transfer descriptor has been sent +//*---------------------------------------------------------------------------- +__inline int AT91F_PDC_IsTxEmpty ( // \return return 1 if transfer is complete + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + return !(pPDC->PDC_TCR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_IsNextTxEmpty +//* \brief Test if the next transfer descriptor has been moved to the current td +//*---------------------------------------------------------------------------- +__inline int AT91F_PDC_IsNextTxEmpty ( // \return return 1 if transfer is complete + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + return !(pPDC->PDC_TNCR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_IsRxEmpty +//* \brief Test if the current transfer descriptor has been filled +//*---------------------------------------------------------------------------- +__inline int AT91F_PDC_IsRxEmpty ( // \return return 1 if transfer is complete + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + return !(pPDC->PDC_RCR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_IsNextRxEmpty +//* \brief Test if the next transfer descriptor has been moved to the current td +//*---------------------------------------------------------------------------- +__inline int AT91F_PDC_IsNextRxEmpty ( // \return return 1 if transfer is complete + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + return !(pPDC->PDC_RNCR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_Open +//* \brief Open PDC: disable TX and RX reset transfer descriptors, re-enable RX and TX +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_Open ( + AT91PS_PDC pPDC) // \arg pointer to a PDC controller +{ + //* Disable the RX and TX PDC transfer requests + AT91F_PDC_DisableRx(pPDC); + AT91F_PDC_DisableTx(pPDC); + + //* Reset all Counter register Next buffer first + AT91F_PDC_SetNextTx(pPDC, (char *) 0, 0); + AT91F_PDC_SetNextRx(pPDC, (char *) 0, 0); + AT91F_PDC_SetTx(pPDC, (char *) 0, 0); + AT91F_PDC_SetRx(pPDC, (char *) 0, 0); + + //* Enable the RX and TX PDC transfer requests + AT91F_PDC_EnableRx(pPDC); + AT91F_PDC_EnableTx(pPDC); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_Close +//* \brief Close PDC: disable TX and RX reset transfer descriptors +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_Close ( + AT91PS_PDC pPDC) // \arg pointer to a PDC controller +{ + //* Disable the RX and TX PDC transfer requests + AT91F_PDC_DisableRx(pPDC); + AT91F_PDC_DisableTx(pPDC); + + //* Reset all Counter register Next buffer first + AT91F_PDC_SetNextTx(pPDC, (char *) 0, 0); + AT91F_PDC_SetNextRx(pPDC, (char *) 0, 0); + AT91F_PDC_SetTx(pPDC, (char *) 0, 0); + AT91F_PDC_SetRx(pPDC, (char *) 0, 0); + +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_SendFrame +//* \brief Close PDC: disable TX and RX reset transfer descriptors +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PDC_SendFrame( + AT91PS_PDC pPDC, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + if (AT91F_PDC_IsTxEmpty(pPDC)) { + //* Buffer and next buffer can be initialized + AT91F_PDC_SetTx(pPDC, pBuffer, szBuffer); + AT91F_PDC_SetNextTx(pPDC, pNextBuffer, szNextBuffer); + return 2; + } + else if (AT91F_PDC_IsNextTxEmpty(pPDC)) { + //* Only one buffer can be initialized + AT91F_PDC_SetNextTx(pPDC, pBuffer, szBuffer); + return 1; + } + else { + //* All buffer are in use... + return 0; + } +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_ReceiveFrame +//* \brief Close PDC: disable TX and RX reset transfer descriptors +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PDC_ReceiveFrame ( + AT91PS_PDC pPDC, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + if (AT91F_PDC_IsRxEmpty(pPDC)) { + //* Buffer and next buffer can be initialized + AT91F_PDC_SetRx(pPDC, pBuffer, szBuffer); + AT91F_PDC_SetNextRx(pPDC, pNextBuffer, szNextBuffer); + return 2; + } + else if (AT91F_PDC_IsNextRxEmpty(pPDC)) { + //* Only one buffer can be initialized + AT91F_PDC_SetNextRx(pPDC, pBuffer, szBuffer); + return 1; + } + else { + //* All buffer are in use... + return 0; + } +} +/* ***************************************************************************** + SOFTWARE API FOR DBGU + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_DBGU_InterruptEnable +//* \brief Enable DBGU Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_DBGU_InterruptEnable( + AT91PS_DBGU pDbgu, // \arg pointer to a DBGU controller + unsigned int flag) // \arg dbgu interrupt to be enabled +{ + pDbgu->DBGU_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_DBGU_InterruptDisable +//* \brief Disable DBGU Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_DBGU_InterruptDisable( + AT91PS_DBGU pDbgu, // \arg pointer to a DBGU controller + unsigned int flag) // \arg dbgu interrupt to be disabled +{ + pDbgu->DBGU_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_DBGU_GetInterruptMaskStatus +//* \brief Return DBGU Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_DBGU_GetInterruptMaskStatus( // \return DBGU Interrupt Mask Status + AT91PS_DBGU pDbgu) // \arg pointer to a DBGU controller +{ + return pDbgu->DBGU_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_DBGU_IsInterruptMasked +//* \brief Test if DBGU Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_DBGU_IsInterruptMasked( + AT91PS_DBGU pDbgu, // \arg pointer to a DBGU controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_DBGU_GetInterruptMaskStatus(pDbgu) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR PIO + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgPeriph +//* \brief Enable pins to be drived by peripheral +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgPeriph( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int periphAEnable, // \arg PERIPH A to enable + unsigned int periphBEnable) // \arg PERIPH B to enable + +{ + pPio->PIO_ASR = periphAEnable; + pPio->PIO_BSR = periphBEnable; + pPio->PIO_PDR = (periphAEnable | periphBEnable); // Set in Periph mode +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgOutput +//* \brief Enable PIO in output mode +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgOutput( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int pioEnable) // \arg PIO to be enabled +{ + pPio->PIO_PER = pioEnable; // Set in PIO mode + pPio->PIO_OER = pioEnable; // Configure in Output +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgInput +//* \brief Enable PIO in input mode +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgInput( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int inputEnable) // \arg PIO to be enabled +{ + // Disable output + pPio->PIO_ODR = inputEnable; + pPio->PIO_PER = inputEnable; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgOpendrain +//* \brief Configure PIO in open drain +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgOpendrain( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int multiDrvEnable) // \arg pio to be configured in open drain +{ + // Configure the multi-drive option + pPio->PIO_MDDR = ~multiDrvEnable; + pPio->PIO_MDER = multiDrvEnable; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgPullup +//* \brief Enable pullup on PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgPullup( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int pullupEnable) // \arg enable pullup on PIO +{ + // Connect or not Pullup + pPio->PIO_PPUDR = ~pullupEnable; + pPio->PIO_PPUER = pullupEnable; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgDirectDrive +//* \brief Enable direct drive on PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgDirectDrive( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int directDrive) // \arg PIO to be configured with direct drive + +{ + // Configure the Direct Drive + pPio->PIO_OWDR = ~directDrive; + pPio->PIO_OWER = directDrive; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgInputFilter +//* \brief Enable input filter on input PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgInputFilter( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int inputFilter) // \arg PIO to be configured with input filter + +{ + // Configure the Direct Drive + pPio->PIO_IFDR = ~inputFilter; + pPio->PIO_IFER = inputFilter; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetInput +//* \brief Return PIO input value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetInput( // \return PIO input + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_PDSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsInputSet +//* \brief Test if PIO is input flag is active +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsInputSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetInput(pPio) & flag); +} + + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_SetOutput +//* \brief Set to 1 output PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_SetOutput( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg output to be set +{ + pPio->PIO_SODR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_ClearOutput +//* \brief Set to 0 output PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_ClearOutput( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg output to be cleared +{ + pPio->PIO_CODR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_ForceOutput +//* \brief Force output when Direct drive option is enabled +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_ForceOutput( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg output to be forced +{ + pPio->PIO_ODSR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_Enable +//* \brief Enable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_Enable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio to be enabled +{ + pPio->PIO_PER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_Disable +//* \brief Disable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_Disable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio to be disabled +{ + pPio->PIO_PDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetStatus +//* \brief Return PIO Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetStatus( // \return PIO Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_PSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsSet +//* \brief Test if PIO is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_OutputEnable +//* \brief Output Enable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_OutputEnable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio output to be enabled +{ + pPio->PIO_OER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_OutputDisable +//* \brief Output Enable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_OutputDisable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio output to be disabled +{ + pPio->PIO_ODR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetOutputStatus +//* \brief Return PIO Output Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetOutputStatus( // \return PIO Output Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_OSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsOuputSet +//* \brief Test if PIO Output is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsOutputSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetOutputStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_InputFilterEnable +//* \brief Input Filter Enable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_InputFilterEnable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio input filter to be enabled +{ + pPio->PIO_IFER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_InputFilterDisable +//* \brief Input Filter Disable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_InputFilterDisable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio input filter to be disabled +{ + pPio->PIO_IFDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetInputFilterStatus +//* \brief Return PIO Input Filter Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetInputFilterStatus( // \return PIO Input Filter Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_IFSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsInputFilterSet +//* \brief Test if PIO Input filter is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsInputFilterSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetInputFilterStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetOutputDataStatus +//* \brief Return PIO Output Data Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetOutputDataStatus( // \return PIO Output Data Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_ODSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_InterruptEnable +//* \brief Enable PIO Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_InterruptEnable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio interrupt to be enabled +{ + pPio->PIO_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_InterruptDisable +//* \brief Disable PIO Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_InterruptDisable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio interrupt to be disabled +{ + pPio->PIO_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetInterruptMaskStatus +//* \brief Return PIO Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetInterruptMaskStatus( // \return PIO Interrupt Mask Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetInterruptStatus +//* \brief Return PIO Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetInterruptStatus( // \return PIO Interrupt Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_ISR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsInterruptMasked +//* \brief Test if PIO Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsInterruptMasked( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetInterruptMaskStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsInterruptSet +//* \brief Test if PIO Interrupt is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsInterruptSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetInterruptStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_MultiDriverEnable +//* \brief Multi Driver Enable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_MultiDriverEnable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio to be enabled +{ + pPio->PIO_MDER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_MultiDriverDisable +//* \brief Multi Driver Disable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_MultiDriverDisable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio to be disabled +{ + pPio->PIO_MDDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetMultiDriverStatus +//* \brief Return PIO Multi Driver Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetMultiDriverStatus( // \return PIO Multi Driver Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_MDSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsMultiDriverSet +//* \brief Test if PIO MultiDriver is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsMultiDriverSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetMultiDriverStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_A_RegisterSelection +//* \brief PIO A Register Selection +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_A_RegisterSelection( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio A register selection +{ + pPio->PIO_ASR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_B_RegisterSelection +//* \brief PIO B Register Selection +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_B_RegisterSelection( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio B register selection +{ + pPio->PIO_BSR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_Get_AB_RegisterStatus +//* \brief Return PIO Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_Get_AB_RegisterStatus( // \return PIO AB Register Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_ABSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsAB_RegisterSet +//* \brief Test if PIO AB Register is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsAB_RegisterSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_Get_AB_RegisterStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_OutputWriteEnable +//* \brief Output Write Enable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_OutputWriteEnable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio output write to be enabled +{ + pPio->PIO_OWER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_OutputWriteDisable +//* \brief Output Write Disable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_OutputWriteDisable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio output write to be disabled +{ + pPio->PIO_OWDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetOutputWriteStatus +//* \brief Return PIO Output Write Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetOutputWriteStatus( // \return PIO Output Write Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_OWSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsOutputWriteSet +//* \brief Test if PIO OutputWrite is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsOutputWriteSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetOutputWriteStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetCfgPullup +//* \brief Return PIO Configuration Pullup +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetCfgPullup( // \return PIO Configuration Pullup + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_PPUSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsOutputDataStatusSet +//* \brief Test if PIO Output Data Status is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsOutputDataStatusSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetOutputDataStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsCfgPullupStatusSet +//* \brief Test if PIO Configuration Pullup Status is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsCfgPullupStatusSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (~AT91F_PIO_GetCfgPullup(pPio) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR PMC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_CfgSysClkEnableReg +//* \brief Configure the System Clock Enable Register of the PMC controller +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_CfgSysClkEnableReg ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int mode) +{ + //* Write to the SCER register + pPMC->PMC_SCER = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_CfgSysClkDisableReg +//* \brief Configure the System Clock Disable Register of the PMC controller +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_CfgSysClkDisableReg ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int mode) +{ + //* Write to the SCDR register + pPMC->PMC_SCDR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_GetSysClkStatusReg +//* \brief Return the System Clock Status Register of the PMC controller +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_GetSysClkStatusReg ( + AT91PS_PMC pPMC // pointer to a CAN controller + ) +{ + return pPMC->PMC_SCSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_EnablePeriphClock +//* \brief Enable peripheral clock +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_EnablePeriphClock ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int periphIds) // \arg IDs of peripherals to enable +{ + pPMC->PMC_PCER = periphIds; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_DisablePeriphClock +//* \brief Disable peripheral clock +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_DisablePeriphClock ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int periphIds) // \arg IDs of peripherals to enable +{ + pPMC->PMC_PCDR = periphIds; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_GetPeriphClock +//* \brief Get peripheral clock status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_GetPeriphClock ( + AT91PS_PMC pPMC) // \arg pointer to PMC controller +{ + return pPMC->PMC_PCSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_CfgMainOscillatorReg +//* \brief Cfg the main oscillator +//*---------------------------------------------------------------------------- +__inline void AT91F_CKGR_CfgMainOscillatorReg ( + AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller + unsigned int mode) +{ + pCKGR->CKGR_MOR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_GetMainOscillatorReg +//* \brief Cfg the main oscillator +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CKGR_GetMainOscillatorReg ( + AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller +{ + return pCKGR->CKGR_MOR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_EnableMainOscillator +//* \brief Enable the main oscillator +//*---------------------------------------------------------------------------- +__inline void AT91F_CKGR_EnableMainOscillator( + AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller +{ + pCKGR->CKGR_MOR |= AT91C_CKGR_MOSCEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_DisableMainOscillator +//* \brief Disable the main oscillator +//*---------------------------------------------------------------------------- +__inline void AT91F_CKGR_DisableMainOscillator ( + AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller +{ + pCKGR->CKGR_MOR &= ~AT91C_CKGR_MOSCEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_CfgMainOscStartUpTime +//* \brief Cfg MOR Register according to the main osc startup time +//*---------------------------------------------------------------------------- +__inline void AT91F_CKGR_CfgMainOscStartUpTime ( + AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller + unsigned int startup_time, // \arg main osc startup time in microsecond (us) + unsigned int slowClock) // \arg slowClock in Hz +{ + pCKGR->CKGR_MOR &= ~AT91C_CKGR_OSCOUNT; + pCKGR->CKGR_MOR |= ((slowClock * startup_time)/(8*1000000)) << 8; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_GetMainClockFreqReg +//* \brief Cfg the main oscillator +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CKGR_GetMainClockFreqReg ( + AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller +{ + return pCKGR->CKGR_MCFR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_GetMainClock +//* \brief Return Main clock in Hz +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CKGR_GetMainClock ( + AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller + unsigned int slowClock) // \arg slowClock in Hz +{ + return ((pCKGR->CKGR_MCFR & AT91C_CKGR_MAINF) * slowClock) >> 4; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_CfgMCKReg +//* \brief Cfg Master Clock Register +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_CfgMCKReg ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int mode) +{ + pPMC->PMC_MCKR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_GetMCKReg +//* \brief Return Master Clock Register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_GetMCKReg( + AT91PS_PMC pPMC) // \arg pointer to PMC controller +{ + return pPMC->PMC_MCKR; +} + +//*------------------------------------------------------------------------------ +//* \fn AT91F_PMC_GetMasterClock +//* \brief Return master clock in Hz which correponds to processor clock for ARM7 +//*------------------------------------------------------------------------------ +__inline unsigned int AT91F_PMC_GetMasterClock ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller + unsigned int slowClock) // \arg slowClock in Hz +{ + unsigned int reg = pPMC->PMC_MCKR; + unsigned int prescaler = (1 << ((reg & AT91C_PMC_PRES) >> 2)); + unsigned int pllDivider, pllMultiplier; + + switch (reg & AT91C_PMC_CSS) { + case AT91C_PMC_CSS_SLOW_CLK: // Slow clock selected + return slowClock / prescaler; + case AT91C_PMC_CSS_MAIN_CLK: // Main clock is selected + return AT91F_CKGR_GetMainClock(pCKGR, slowClock) / prescaler; + case AT91C_PMC_CSS_PLL_CLK: // PLLB clock is selected + reg = pCKGR->CKGR_PLLR; + pllDivider = (reg & AT91C_CKGR_DIV); + pllMultiplier = ((reg & AT91C_CKGR_MUL) >> 16) + 1; + return AT91F_CKGR_GetMainClock(pCKGR, slowClock) / pllDivider * pllMultiplier / prescaler; + } + return 0; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_EnablePCK +//* \brief Enable peripheral clock +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_EnablePCK ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int pck, // \arg Peripheral clock identifier 0 .. 7 + unsigned int mode) +{ + pPMC->PMC_PCKR[pck] = mode; + pPMC->PMC_SCER = (1 << pck) << 8; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_DisablePCK +//* \brief Enable peripheral clock +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_DisablePCK ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int pck) // \arg Peripheral clock identifier 0 .. 7 +{ + pPMC->PMC_SCDR = (1 << pck) << 8; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_EnableIt +//* \brief Enable PMC interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_EnableIt ( + AT91PS_PMC pPMC, // pointer to a PMC controller + unsigned int flag) // IT to be enabled +{ + //* Write to the IER register + pPMC->PMC_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_DisableIt +//* \brief Disable PMC interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_DisableIt ( + AT91PS_PMC pPMC, // pointer to a PMC controller + unsigned int flag) // IT to be disabled +{ + //* Write to the IDR register + pPMC->PMC_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_GetStatus +//* \brief Return PMC Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_GetStatus( // \return PMC Interrupt Status + AT91PS_PMC pPMC) // pointer to a PMC controller +{ + return pPMC->PMC_SR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_GetInterruptMaskStatus +//* \brief Return PMC Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_GetInterruptMaskStatus( // \return PMC Interrupt Mask Status + AT91PS_PMC pPMC) // pointer to a PMC controller +{ + return pPMC->PMC_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_IsInterruptMasked +//* \brief Test if PMC Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_IsInterruptMasked( + AT91PS_PMC pPMC, // \arg pointer to a PMC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PMC_GetInterruptMaskStatus(pPMC) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_IsStatusSet +//* \brief Test if PMC Status is Set +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_IsStatusSet( + AT91PS_PMC pPMC, // \arg pointer to a PMC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PMC_GetStatus(pPMC) & flag); +}/* ***************************************************************************** + SOFTWARE API FOR RSTC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_RSTSoftReset +//* \brief Start Software Reset +//*---------------------------------------------------------------------------- +__inline void AT91F_RSTSoftReset( + AT91PS_RSTC pRSTC, + unsigned int reset) +{ + pRSTC->RSTC_RCR = (0xA5000000 | reset); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_RSTSetMode +//* \brief Set Reset Mode +//*---------------------------------------------------------------------------- +__inline void AT91F_RSTSetMode( + AT91PS_RSTC pRSTC, + unsigned int mode) +{ + pRSTC->RSTC_RMR = (0xA5000000 | mode); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_RSTGetMode +//* \brief Get Reset Mode +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_RSTGetMode( + AT91PS_RSTC pRSTC) +{ + return (pRSTC->RSTC_RMR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_RSTGetStatus +//* \brief Get Reset Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_RSTGetStatus( + AT91PS_RSTC pRSTC) +{ + return (pRSTC->RSTC_RSR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_RSTIsSoftRstActive +//* \brief Return !=0 if software reset is still not completed +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_RSTIsSoftRstActive( + AT91PS_RSTC pRSTC) +{ + return ((pRSTC->RSTC_RSR) & AT91C_RSTC_SRCMP); +} +/* ***************************************************************************** + SOFTWARE API FOR RTTC + ***************************************************************************** */ +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_SetRTT_TimeBase() +//* \brief Set the RTT prescaler according to the TimeBase in ms +//*-------------------------------------------------------------------------------------- +__inline unsigned int AT91F_RTTSetTimeBase( + AT91PS_RTTC pRTTC, + unsigned int ms) +{ + if (ms > 2000) + return 1; // AT91C_TIME_OUT_OF_RANGE + pRTTC->RTTC_RTMR &= ~0xFFFF; + pRTTC->RTTC_RTMR |= (((ms << 15) /1000) & 0xFFFF); + return 0; +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTTSetPrescaler() +//* \brief Set the new prescaler value +//*-------------------------------------------------------------------------------------- +__inline unsigned int AT91F_RTTSetPrescaler( + AT91PS_RTTC pRTTC, + unsigned int rtpres) +{ + pRTTC->RTTC_RTMR &= ~0xFFFF; + pRTTC->RTTC_RTMR |= (rtpres & 0xFFFF); + return (pRTTC->RTTC_RTMR); +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTTRestart() +//* \brief Restart the RTT prescaler +//*-------------------------------------------------------------------------------------- +__inline void AT91F_RTTRestart( + AT91PS_RTTC pRTTC) +{ + pRTTC->RTTC_RTMR |= AT91C_RTTC_RTTRST; +} + + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTT_SetAlarmINT() +//* \brief Enable RTT Alarm Interrupt +//*-------------------------------------------------------------------------------------- +__inline void AT91F_RTTSetAlarmINT( + AT91PS_RTTC pRTTC) +{ + pRTTC->RTTC_RTMR |= AT91C_RTTC_ALMIEN; +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTT_ClearAlarmINT() +//* \brief Disable RTT Alarm Interrupt +//*-------------------------------------------------------------------------------------- +__inline void AT91F_RTTClearAlarmINT( + AT91PS_RTTC pRTTC) +{ + pRTTC->RTTC_RTMR &= ~AT91C_RTTC_ALMIEN; +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTT_SetRttIncINT() +//* \brief Enable RTT INC Interrupt +//*-------------------------------------------------------------------------------------- +__inline void AT91F_RTTSetRttIncINT( + AT91PS_RTTC pRTTC) +{ + pRTTC->RTTC_RTMR |= AT91C_RTTC_RTTINCIEN; +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTT_ClearRttIncINT() +//* \brief Disable RTT INC Interrupt +//*-------------------------------------------------------------------------------------- +__inline void AT91F_RTTClearRttIncINT( + AT91PS_RTTC pRTTC) +{ + pRTTC->RTTC_RTMR &= ~AT91C_RTTC_RTTINCIEN; +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTT_SetAlarmValue() +//* \brief Set RTT Alarm Value +//*-------------------------------------------------------------------------------------- +__inline void AT91F_RTTSetAlarmValue( + AT91PS_RTTC pRTTC, unsigned int alarm) +{ + pRTTC->RTTC_RTAR = alarm; +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTT_GetAlarmValue() +//* \brief Get RTT Alarm Value +//*-------------------------------------------------------------------------------------- +__inline unsigned int AT91F_RTTGetAlarmValue( + AT91PS_RTTC pRTTC) +{ + return(pRTTC->RTTC_RTAR); +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTTGetStatus() +//* \brief Read the RTT status +//*-------------------------------------------------------------------------------------- +__inline unsigned int AT91F_RTTGetStatus( + AT91PS_RTTC pRTTC) +{ + return(pRTTC->RTTC_RTSR); +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTT_ReadValue() +//* \brief Read the RTT value +//*-------------------------------------------------------------------------------------- +__inline unsigned int AT91F_RTTReadValue( + AT91PS_RTTC pRTTC) +{ + register volatile unsigned int val1,val2; + do + { + val1 = pRTTC->RTTC_RTVR; + val2 = pRTTC->RTTC_RTVR; + } + while(val1 != val2); + return(val1); +} +/* ***************************************************************************** + SOFTWARE API FOR PITC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITInit +//* \brief System timer init : period in µsecond, system clock freq in MHz +//*---------------------------------------------------------------------------- +__inline void AT91F_PITInit( + AT91PS_PITC pPITC, + unsigned int period, + unsigned int pit_frequency) +{ + pPITC->PITC_PIMR = period? (period * pit_frequency + 8) >> 4 : 0; // +8 to avoid %10 and /10 + pPITC->PITC_PIMR |= AT91C_PITC_PITEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITSetPIV +//* \brief Set the PIT Periodic Interval Value +//*---------------------------------------------------------------------------- +__inline void AT91F_PITSetPIV( + AT91PS_PITC pPITC, + unsigned int piv) +{ + pPITC->PITC_PIMR = piv | (pPITC->PITC_PIMR & (AT91C_PITC_PITEN | AT91C_PITC_PITIEN)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITEnableInt +//* \brief Enable PIT periodic interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PITEnableInt( + AT91PS_PITC pPITC) +{ + pPITC->PITC_PIMR |= AT91C_PITC_PITIEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITDisableInt +//* \brief Disable PIT periodic interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PITDisableInt( + AT91PS_PITC pPITC) +{ + pPITC->PITC_PIMR &= ~AT91C_PITC_PITIEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITGetMode +//* \brief Read PIT mode register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PITGetMode( + AT91PS_PITC pPITC) +{ + return(pPITC->PITC_PIMR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITGetStatus +//* \brief Read PIT status register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PITGetStatus( + AT91PS_PITC pPITC) +{ + return(pPITC->PITC_PISR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITGetPIIR +//* \brief Read PIT CPIV and PICNT without ressetting the counters +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PITGetPIIR( + AT91PS_PITC pPITC) +{ + return(pPITC->PITC_PIIR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITGetPIVR +//* \brief Read System timer CPIV and PICNT without ressetting the counters +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PITGetPIVR( + AT91PS_PITC pPITC) +{ + return(pPITC->PITC_PIVR); +} +/* ***************************************************************************** + SOFTWARE API FOR WDTC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_WDTSetMode +//* \brief Set Watchdog Mode Register +//*---------------------------------------------------------------------------- +__inline void AT91F_WDTSetMode( + AT91PS_WDTC pWDTC, + unsigned int Mode) +{ + pWDTC->WDTC_WDMR = Mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_WDTRestart +//* \brief Restart Watchdog +//*---------------------------------------------------------------------------- +__inline void AT91F_WDTRestart( + AT91PS_WDTC pWDTC) +{ + pWDTC->WDTC_WDCR = 0xA5000001; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_WDTSGettatus +//* \brief Get Watchdog Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_WDTSGettatus( + AT91PS_WDTC pWDTC) +{ + return(pWDTC->WDTC_WDSR & 0x3); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_WDTGetPeriod +//* \brief Translate ms into Watchdog Compatible value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_WDTGetPeriod(unsigned int ms) +{ + if ((ms < 4) || (ms > 16000)) + return 0; + return((ms << 8) / 1000); +} +/* ***************************************************************************** + SOFTWARE API FOR VREG + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_VREG_Enable_LowPowerMode +//* \brief Enable VREG Low Power Mode +//*---------------------------------------------------------------------------- +__inline void AT91F_VREG_Enable_LowPowerMode( + AT91PS_VREG pVREG) +{ + pVREG->VREG_MR |= AT91C_VREG_PSTDBY; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_VREG_Disable_LowPowerMode +//* \brief Disable VREG Low Power Mode +//*---------------------------------------------------------------------------- +__inline void AT91F_VREG_Disable_LowPowerMode( + AT91PS_VREG pVREG) +{ + pVREG->VREG_MR &= ~AT91C_VREG_PSTDBY; +}/* ***************************************************************************** + SOFTWARE API FOR MC + ***************************************************************************** */ + +#define AT91C_MC_CORRECT_KEY ((unsigned int) 0x5A << 24) // (MC) Correct Protect Key + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_Remap +//* \brief Make Remap +//*---------------------------------------------------------------------------- +__inline void AT91F_MC_Remap (void) // +{ + AT91PS_MC pMC = (AT91PS_MC) AT91C_BASE_MC; + + pMC->MC_RCR = AT91C_MC_RCB; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_CfgModeReg +//* \brief Configure the EFC Mode Register of the MC controller +//*---------------------------------------------------------------------------- +__inline void AT91F_MC_EFC_CfgModeReg ( + AT91PS_MC pMC, // pointer to a MC controller + unsigned int mode) // mode register +{ + // Write to the FMR register + pMC->MC_FMR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_GetModeReg +//* \brief Return MC EFC Mode Regsiter +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_MC_EFC_GetModeReg( + AT91PS_MC pMC) // pointer to a MC controller +{ + return pMC->MC_FMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_ComputeFMCN +//* \brief Return MC EFC Mode Regsiter +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_MC_EFC_ComputeFMCN( + int master_clock) // master clock in Hz +{ + return (master_clock/1000000 +2); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_PerformCmd +//* \brief Perform EFC Command +//*---------------------------------------------------------------------------- +__inline void AT91F_MC_EFC_PerformCmd ( + AT91PS_MC pMC, // pointer to a MC controller + unsigned int transfer_cmd) +{ + pMC->MC_FCR = transfer_cmd; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_GetStatus +//* \brief Return MC EFC Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_MC_EFC_GetStatus( + AT91PS_MC pMC) // pointer to a MC controller +{ + return pMC->MC_FSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_IsInterruptMasked +//* \brief Test if EFC MC Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_MC_EFC_IsInterruptMasked( + AT91PS_MC pMC, // \arg pointer to a MC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_MC_EFC_GetModeReg(pMC) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_IsInterruptSet +//* \brief Test if EFC MC Interrupt is Set +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_MC_EFC_IsInterruptSet( + AT91PS_MC pMC, // \arg pointer to a MC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_MC_EFC_GetStatus(pMC) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR SPI + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_Open +//* \brief Open a SPI Port +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SPI_Open ( + const unsigned int null) // \arg +{ + /* NOT DEFINED AT THIS MOMENT */ + return ( 0 ); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_CfgCs +//* \brief Configure SPI chip select register +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_CfgCs ( + AT91PS_SPI pSPI, // pointer to a SPI controller + int cs, // SPI cs number (0 to 3) + int val) // chip select register +{ + //* Write to the CSR register + *(pSPI->SPI_CSR + cs) = val; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_EnableIt +//* \brief Enable SPI interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_EnableIt ( + AT91PS_SPI pSPI, // pointer to a SPI controller + unsigned int flag) // IT to be enabled +{ + //* Write to the IER register + pSPI->SPI_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_DisableIt +//* \brief Disable SPI interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_DisableIt ( + AT91PS_SPI pSPI, // pointer to a SPI controller + unsigned int flag) // IT to be disabled +{ + //* Write to the IDR register + pSPI->SPI_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_Reset +//* \brief Reset the SPI controller +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_Reset ( + AT91PS_SPI pSPI // pointer to a SPI controller + ) +{ + //* Write to the CR register + pSPI->SPI_CR = AT91C_SPI_SWRST; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_Enable +//* \brief Enable the SPI controller +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_Enable ( + AT91PS_SPI pSPI // pointer to a SPI controller + ) +{ + //* Write to the CR register + pSPI->SPI_CR = AT91C_SPI_SPIEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_Disable +//* \brief Disable the SPI controller +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_Disable ( + AT91PS_SPI pSPI // pointer to a SPI controller + ) +{ + //* Write to the CR register + pSPI->SPI_CR = AT91C_SPI_SPIDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_CfgMode +//* \brief Enable the SPI controller +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_CfgMode ( + AT91PS_SPI pSPI, // pointer to a SPI controller + int mode) // mode register +{ + //* Write to the MR register + pSPI->SPI_MR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_CfgPCS +//* \brief Switch to the correct PCS of SPI Mode Register : Fixed Peripheral Selected +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_CfgPCS ( + AT91PS_SPI pSPI, // pointer to a SPI controller + char PCS_Device) // PCS of the Device +{ + //* Write to the MR register + pSPI->SPI_MR &= 0xFFF0FFFF; + pSPI->SPI_MR |= ( (PCS_Device<<16) & AT91C_SPI_PCS ); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_ReceiveFrame +//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is busy +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SPI_ReceiveFrame ( + AT91PS_SPI pSPI, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + return AT91F_PDC_ReceiveFrame( + (AT91PS_PDC) &(pSPI->SPI_RPR), + pBuffer, + szBuffer, + pNextBuffer, + szNextBuffer); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_SendFrame +//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is bSPIy +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SPI_SendFrame( + AT91PS_SPI pSPI, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + return AT91F_PDC_SendFrame( + (AT91PS_PDC) &(pSPI->SPI_RPR), + pBuffer, + szBuffer, + pNextBuffer, + szNextBuffer); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_Close +//* \brief Close SPI: disable IT disable transfert, close PDC +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_Close ( + AT91PS_SPI pSPI) // \arg pointer to a SPI controller +{ + //* Reset all the Chip Select register + pSPI->SPI_CSR[0] = 0 ; + pSPI->SPI_CSR[1] = 0 ; + pSPI->SPI_CSR[2] = 0 ; + pSPI->SPI_CSR[3] = 0 ; + + //* Reset the SPI mode + pSPI->SPI_MR = 0 ; + + //* Disable all interrupts + pSPI->SPI_IDR = 0xFFFFFFFF ; + + //* Abort the Peripheral Data Transfers + AT91F_PDC_Close((AT91PS_PDC) &(pSPI->SPI_RPR)); + + //* Disable receiver and transmitter and stop any activity immediately + pSPI->SPI_CR = AT91C_SPI_SPIDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_PutChar +//* \brief Send a character,does not check if ready to send +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_PutChar ( + AT91PS_SPI pSPI, + unsigned int character, + unsigned int cs_number ) +{ + unsigned int value_for_cs; + value_for_cs = (~(1 << cs_number)) & 0xF; //Place a zero among a 4 ONEs number + pSPI->SPI_TDR = (character & 0xFFFF) | (value_for_cs << 16); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_GetChar +//* \brief Receive a character,does not check if a character is available +//*---------------------------------------------------------------------------- +__inline int AT91F_SPI_GetChar ( + const AT91PS_SPI pSPI) +{ + return((pSPI->SPI_RDR) & 0xFFFF); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_GetInterruptMaskStatus +//* \brief Return SPI Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SPI_GetInterruptMaskStatus( // \return SPI Interrupt Mask Status + AT91PS_SPI pSpi) // \arg pointer to a SPI controller +{ + return pSpi->SPI_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_IsInterruptMasked +//* \brief Test if SPI Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_SPI_IsInterruptMasked( + AT91PS_SPI pSpi, // \arg pointer to a SPI controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_SPI_GetInterruptMaskStatus(pSpi) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR USART + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_Baudrate +//* \brief Calculate the baudrate +//* Standard Asynchronous Mode : 8 bits , 1 stop , no parity +#define AT91C_US_ASYNC_MODE ( AT91C_US_USMODE_NORMAL + \ + AT91C_US_NBSTOP_1_BIT + \ + AT91C_US_PAR_NONE + \ + AT91C_US_CHRL_8_BITS + \ + AT91C_US_CLKS_CLOCK ) + +//* Standard External Asynchronous Mode : 8 bits , 1 stop , no parity +#define AT91C_US_ASYNC_SCK_MODE ( AT91C_US_USMODE_NORMAL + \ + AT91C_US_NBSTOP_1_BIT + \ + AT91C_US_PAR_NONE + \ + AT91C_US_CHRL_8_BITS + \ + AT91C_US_CLKS_EXT ) + +//* Standard Synchronous Mode : 8 bits , 1 stop , no parity +#define AT91C_US_SYNC_MODE ( AT91C_US_SYNC + \ + AT91C_US_USMODE_NORMAL + \ + AT91C_US_NBSTOP_1_BIT + \ + AT91C_US_PAR_NONE + \ + AT91C_US_CHRL_8_BITS + \ + AT91C_US_CLKS_CLOCK ) + +//* SCK used Label +#define AT91C_US_SCK_USED (AT91C_US_CKLO | AT91C_US_CLKS_EXT) + +//* Standard ISO T=0 Mode : 8 bits , 1 stop , parity +#define AT91C_US_ISO_READER_MODE ( AT91C_US_USMODE_ISO7816_0 + \ + AT91C_US_CLKS_CLOCK +\ + AT91C_US_NBSTOP_1_BIT + \ + AT91C_US_PAR_EVEN + \ + AT91C_US_CHRL_8_BITS + \ + AT91C_US_CKLO +\ + AT91C_US_OVER) + +//* Standard IRDA mode +#define AT91C_US_ASYNC_IRDA_MODE ( AT91C_US_USMODE_IRDA + \ + AT91C_US_NBSTOP_1_BIT + \ + AT91C_US_PAR_NONE + \ + AT91C_US_CHRL_8_BITS + \ + AT91C_US_CLKS_CLOCK ) + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_Baudrate +//* \brief Caluculate baud_value according to the main clock and the baud rate +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_US_Baudrate ( + const unsigned int main_clock, // \arg peripheral clock + const unsigned int baud_rate) // \arg UART baudrate +{ + unsigned int baud_value = ((main_clock*10)/(baud_rate * 16)); + if ((baud_value % 10) >= 5) + baud_value = (baud_value / 10) + 1; + else + baud_value /= 10; + return baud_value; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_SetBaudrate +//* \brief Set the baudrate according to the CPU clock +//*---------------------------------------------------------------------------- +__inline void AT91F_US_SetBaudrate ( + AT91PS_USART pUSART, // \arg pointer to a USART controller + unsigned int mainClock, // \arg peripheral clock + unsigned int speed) // \arg UART baudrate +{ + //* Define the baud rate divisor register + pUSART->US_BRGR = AT91F_US_Baudrate(mainClock, speed); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_SetTimeguard +//* \brief Set USART timeguard +//*---------------------------------------------------------------------------- +__inline void AT91F_US_SetTimeguard ( + AT91PS_USART pUSART, // \arg pointer to a USART controller + unsigned int timeguard) // \arg timeguard value +{ + //* Write the Timeguard Register + pUSART->US_TTGR = timeguard ; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_EnableIt +//* \brief Enable USART IT +//*---------------------------------------------------------------------------- +__inline void AT91F_US_EnableIt ( + AT91PS_USART pUSART, // \arg pointer to a USART controller + unsigned int flag) // \arg IT to be enabled +{ + //* Write to the IER register + pUSART->US_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_DisableIt +//* \brief Disable USART IT +//*---------------------------------------------------------------------------- +__inline void AT91F_US_DisableIt ( + AT91PS_USART pUSART, // \arg pointer to a USART controller + unsigned int flag) // \arg IT to be disabled +{ + //* Write to the IER register + pUSART->US_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_Configure +//* \brief Configure USART +//*---------------------------------------------------------------------------- +__inline void AT91F_US_Configure ( + AT91PS_USART pUSART, // \arg pointer to a USART controller + unsigned int mainClock, // \arg peripheral clock + unsigned int mode , // \arg mode Register to be programmed + unsigned int baudRate , // \arg baudrate to be programmed + unsigned int timeguard ) // \arg timeguard to be programmed +{ + //* Disable interrupts + pUSART->US_IDR = (unsigned int) -1; + + //* Reset receiver and transmitter + pUSART->US_CR = AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RXDIS | AT91C_US_TXDIS ; + + //* Define the baud rate divisor register + AT91F_US_SetBaudrate(pUSART, mainClock, baudRate); + + //* Write the Timeguard Register + AT91F_US_SetTimeguard(pUSART, timeguard); + + //* Clear Transmit and Receive Counters + AT91F_PDC_Open((AT91PS_PDC) &(pUSART->US_RPR)); + + //* Define the USART mode + pUSART->US_MR = mode ; + +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_EnableRx +//* \brief Enable receiving characters +//*---------------------------------------------------------------------------- +__inline void AT91F_US_EnableRx ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Enable receiver + pUSART->US_CR = AT91C_US_RXEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_EnableTx +//* \brief Enable sending characters +//*---------------------------------------------------------------------------- +__inline void AT91F_US_EnableTx ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Enable transmitter + pUSART->US_CR = AT91C_US_TXEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_ResetRx +//* \brief Reset Receiver and re-enable it +//*---------------------------------------------------------------------------- +__inline void AT91F_US_ResetRx ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Reset receiver + pUSART->US_CR = AT91C_US_RSTRX; + //* Re-Enable receiver + pUSART->US_CR = AT91C_US_RXEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_ResetTx +//* \brief Reset Transmitter and re-enable it +//*---------------------------------------------------------------------------- +__inline void AT91F_US_ResetTx ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Reset transmitter + pUSART->US_CR = AT91C_US_RSTTX; + //* Enable transmitter + pUSART->US_CR = AT91C_US_TXEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_DisableRx +//* \brief Disable Receiver +//*---------------------------------------------------------------------------- +__inline void AT91F_US_DisableRx ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Disable receiver + pUSART->US_CR = AT91C_US_RXDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_DisableTx +//* \brief Disable Transmitter +//*---------------------------------------------------------------------------- +__inline void AT91F_US_DisableTx ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Disable transmitter + pUSART->US_CR = AT91C_US_TXDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_Close +//* \brief Close USART: disable IT disable receiver and transmitter, close PDC +//*---------------------------------------------------------------------------- +__inline void AT91F_US_Close ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Reset the baud rate divisor register + pUSART->US_BRGR = 0 ; + + //* Reset the USART mode + pUSART->US_MR = 0 ; + + //* Reset the Timeguard Register + pUSART->US_TTGR = 0; + + //* Disable all interrupts + pUSART->US_IDR = 0xFFFFFFFF ; + + //* Abort the Peripheral Data Transfers + AT91F_PDC_Close((AT91PS_PDC) &(pUSART->US_RPR)); + + //* Disable receiver and transmitter and stop any activity immediately + pUSART->US_CR = AT91C_US_TXDIS | AT91C_US_RXDIS | AT91C_US_RSTTX | AT91C_US_RSTRX ; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_TxReady +//* \brief Return 1 if a character can be written in US_THR +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_US_TxReady ( + AT91PS_USART pUSART ) // \arg pointer to a USART controller +{ + return (pUSART->US_CSR & AT91C_US_TXRDY); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_RxReady +//* \brief Return 1 if a character can be read in US_RHR +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_US_RxReady ( + AT91PS_USART pUSART ) // \arg pointer to a USART controller +{ + return (pUSART->US_CSR & AT91C_US_RXRDY); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_Error +//* \brief Return the error flag +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_US_Error ( + AT91PS_USART pUSART ) // \arg pointer to a USART controller +{ + return (pUSART->US_CSR & + (AT91C_US_OVRE | // Overrun error + AT91C_US_FRAME | // Framing error + AT91C_US_PARE)); // Parity error +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_PutChar +//* \brief Send a character,does not check if ready to send +//*---------------------------------------------------------------------------- +__inline void AT91F_US_PutChar ( + AT91PS_USART pUSART, + int character ) +{ + pUSART->US_THR = (character & 0x1FF); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_GetChar +//* \brief Receive a character,does not check if a character is available +//*---------------------------------------------------------------------------- +__inline int AT91F_US_GetChar ( + const AT91PS_USART pUSART) +{ + return((pUSART->US_RHR) & 0x1FF); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_SendFrame +//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is busy +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_US_SendFrame( + AT91PS_USART pUSART, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + return AT91F_PDC_SendFrame( + (AT91PS_PDC) &(pUSART->US_RPR), + pBuffer, + szBuffer, + pNextBuffer, + szNextBuffer); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_ReceiveFrame +//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is busy +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_US_ReceiveFrame ( + AT91PS_USART pUSART, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + return AT91F_PDC_ReceiveFrame( + (AT91PS_PDC) &(pUSART->US_RPR), + pBuffer, + szBuffer, + pNextBuffer, + szNextBuffer); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_SetIrdaFilter +//* \brief Set the value of IrDa filter tregister +//*---------------------------------------------------------------------------- +__inline void AT91F_US_SetIrdaFilter ( + AT91PS_USART pUSART, + unsigned char value +) +{ + pUSART->US_IF = value; +} + +/* ***************************************************************************** + SOFTWARE API FOR SSC + ***************************************************************************** */ +//* Define the standard I2S mode configuration + +//* Configuration to set in the SSC Transmit Clock Mode Register +//* Parameters : nb_bit_by_slot : 8, 16 or 32 bits +//* nb_slot_by_frame : number of channels +#define AT91C_I2S_ASY_MASTER_TX_SETTING(nb_bit_by_slot, nb_slot_by_frame)( +\ + AT91C_SSC_CKS_DIV +\ + AT91C_SSC_CKO_CONTINOUS +\ + AT91C_SSC_CKG_NONE +\ + AT91C_SSC_START_FALL_RF +\ + AT91C_SSC_STTOUT +\ + ((1<<16) & AT91C_SSC_STTDLY) +\ + ((((nb_bit_by_slot*nb_slot_by_frame)/2)-1) <<24)) + + +//* Configuration to set in the SSC Transmit Frame Mode Register +//* Parameters : nb_bit_by_slot : 8, 16 or 32 bits +//* nb_slot_by_frame : number of channels +#define AT91C_I2S_ASY_TX_FRAME_SETTING(nb_bit_by_slot, nb_slot_by_frame)( +\ + (nb_bit_by_slot-1) +\ + AT91C_SSC_MSBF +\ + (((nb_slot_by_frame-1)<<8) & AT91C_SSC_DATNB) +\ + (((nb_bit_by_slot-1)<<16) & AT91C_SSC_FSLEN) +\ + AT91C_SSC_FSOS_NEGATIVE) + + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_SetBaudrate +//* \brief Set the baudrate according to the CPU clock +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_SetBaudrate ( + AT91PS_SSC pSSC, // \arg pointer to a SSC controller + unsigned int mainClock, // \arg peripheral clock + unsigned int speed) // \arg SSC baudrate +{ + unsigned int baud_value; + //* Define the baud rate divisor register + if (speed == 0) + baud_value = 0; + else + { + baud_value = (unsigned int) (mainClock * 10)/(2*speed); + if ((baud_value % 10) >= 5) + baud_value = (baud_value / 10) + 1; + else + baud_value /= 10; + } + + pSSC->SSC_CMR = baud_value; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_Configure +//* \brief Configure SSC +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_Configure ( + AT91PS_SSC pSSC, // \arg pointer to a SSC controller + unsigned int syst_clock, // \arg System Clock Frequency + unsigned int baud_rate, // \arg Expected Baud Rate Frequency + unsigned int clock_rx, // \arg Receiver Clock Parameters + unsigned int mode_rx, // \arg mode Register to be programmed + unsigned int clock_tx, // \arg Transmitter Clock Parameters + unsigned int mode_tx) // \arg mode Register to be programmed +{ + //* Disable interrupts + pSSC->SSC_IDR = (unsigned int) -1; + + //* Reset receiver and transmitter + pSSC->SSC_CR = AT91C_SSC_SWRST | AT91C_SSC_RXDIS | AT91C_SSC_TXDIS ; + + //* Define the Clock Mode Register + AT91F_SSC_SetBaudrate(pSSC, syst_clock, baud_rate); + + //* Write the Receive Clock Mode Register + pSSC->SSC_RCMR = clock_rx; + + //* Write the Transmit Clock Mode Register + pSSC->SSC_TCMR = clock_tx; + + //* Write the Receive Frame Mode Register + pSSC->SSC_RFMR = mode_rx; + + //* Write the Transmit Frame Mode Register + pSSC->SSC_TFMR = mode_tx; + + //* Clear Transmit and Receive Counters + AT91F_PDC_Open((AT91PS_PDC) &(pSSC->SSC_RPR)); + + +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_EnableRx +//* \brief Enable receiving datas +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_EnableRx ( + AT91PS_SSC pSSC) // \arg pointer to a SSC controller +{ + //* Enable receiver + pSSC->SSC_CR = AT91C_SSC_RXEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_DisableRx +//* \brief Disable receiving datas +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_DisableRx ( + AT91PS_SSC pSSC) // \arg pointer to a SSC controller +{ + //* Disable receiver + pSSC->SSC_CR = AT91C_SSC_RXDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_EnableTx +//* \brief Enable sending datas +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_EnableTx ( + AT91PS_SSC pSSC) // \arg pointer to a SSC controller +{ + //* Enable transmitter + pSSC->SSC_CR = AT91C_SSC_TXEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_DisableTx +//* \brief Disable sending datas +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_DisableTx ( + AT91PS_SSC pSSC) // \arg pointer to a SSC controller +{ + //* Disable transmitter + pSSC->SSC_CR = AT91C_SSC_TXDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_EnableIt +//* \brief Enable SSC IT +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_EnableIt ( + AT91PS_SSC pSSC, // \arg pointer to a SSC controller + unsigned int flag) // \arg IT to be enabled +{ + //* Write to the IER register + pSSC->SSC_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_DisableIt +//* \brief Disable SSC IT +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_DisableIt ( + AT91PS_SSC pSSC, // \arg pointer to a SSC controller + unsigned int flag) // \arg IT to be disabled +{ + //* Write to the IDR register + pSSC->SSC_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_ReceiveFrame +//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initialized with Next Buffer, 0 if PDC is busy +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SSC_ReceiveFrame ( + AT91PS_SSC pSSC, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + return AT91F_PDC_ReceiveFrame( + (AT91PS_PDC) &(pSSC->SSC_RPR), + pBuffer, + szBuffer, + pNextBuffer, + szNextBuffer); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_SendFrame +//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initialized with Next Buffer, 0 if PDC is busy +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SSC_SendFrame( + AT91PS_SSC pSSC, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + return AT91F_PDC_SendFrame( + (AT91PS_PDC) &(pSSC->SSC_RPR), + pBuffer, + szBuffer, + pNextBuffer, + szNextBuffer); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_GetInterruptMaskStatus +//* \brief Return SSC Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SSC_GetInterruptMaskStatus( // \return SSC Interrupt Mask Status + AT91PS_SSC pSsc) // \arg pointer to a SSC controller +{ + return pSsc->SSC_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_IsInterruptMasked +//* \brief Test if SSC Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_SSC_IsInterruptMasked( + AT91PS_SSC pSsc, // \arg pointer to a SSC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_SSC_GetInterruptMaskStatus(pSsc) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR TWI + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_EnableIt +//* \brief Enable TWI IT +//*---------------------------------------------------------------------------- +__inline void AT91F_TWI_EnableIt ( + AT91PS_TWI pTWI, // \arg pointer to a TWI controller + unsigned int flag) // \arg IT to be enabled +{ + //* Write to the IER register + pTWI->TWI_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_DisableIt +//* \brief Disable TWI IT +//*---------------------------------------------------------------------------- +__inline void AT91F_TWI_DisableIt ( + AT91PS_TWI pTWI, // \arg pointer to a TWI controller + unsigned int flag) // \arg IT to be disabled +{ + //* Write to the IDR register + pTWI->TWI_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_Configure +//* \brief Configure TWI in master mode +//*---------------------------------------------------------------------------- +__inline void AT91F_TWI_Configure ( AT91PS_TWI pTWI ) // \arg pointer to a TWI controller +{ + //* Disable interrupts + pTWI->TWI_IDR = (unsigned int) -1; + + //* Reset peripheral + pTWI->TWI_CR = AT91C_TWI_SWRST; + + //* Set Master mode + pTWI->TWI_CR = AT91C_TWI_MSEN; + +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_GetInterruptMaskStatus +//* \brief Return TWI Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TWI_GetInterruptMaskStatus( // \return TWI Interrupt Mask Status + AT91PS_TWI pTwi) // \arg pointer to a TWI controller +{ + return pTwi->TWI_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_IsInterruptMasked +//* \brief Test if TWI Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_TWI_IsInterruptMasked( + AT91PS_TWI pTwi, // \arg pointer to a TWI controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_TWI_GetInterruptMaskStatus(pTwi) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR PWMC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_GetStatus +//* \brief Return PWM Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PWMC_GetStatus( // \return PWM Interrupt Status + AT91PS_PWMC pPWM) // pointer to a PWM controller +{ + return pPWM->PWMC_SR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_InterruptEnable +//* \brief Enable PWM Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_InterruptEnable( + AT91PS_PWMC pPwm, // \arg pointer to a PWM controller + unsigned int flag) // \arg PWM interrupt to be enabled +{ + pPwm->PWMC_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_InterruptDisable +//* \brief Disable PWM Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_InterruptDisable( + AT91PS_PWMC pPwm, // \arg pointer to a PWM controller + unsigned int flag) // \arg PWM interrupt to be disabled +{ + pPwm->PWMC_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_GetInterruptMaskStatus +//* \brief Return PWM Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PWMC_GetInterruptMaskStatus( // \return PWM Interrupt Mask Status + AT91PS_PWMC pPwm) // \arg pointer to a PWM controller +{ + return pPwm->PWMC_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_IsInterruptMasked +//* \brief Test if PWM Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PWMC_IsInterruptMasked( + AT91PS_PWMC pPWM, // \arg pointer to a PWM controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PWMC_GetInterruptMaskStatus(pPWM) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_IsStatusSet +//* \brief Test if PWM Interrupt is Set +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PWMC_IsStatusSet( + AT91PS_PWMC pPWM, // \arg pointer to a PWM controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PWMC_GetStatus(pPWM) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_CfgChannel +//* \brief Test if PWM Interrupt is Set +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_CfgChannel( + AT91PS_PWMC pPWM, // \arg pointer to a PWM controller + unsigned int channelId, // \arg PWM channel ID + unsigned int mode, // \arg PWM mode + unsigned int period, // \arg PWM period + unsigned int duty) // \arg PWM duty cycle +{ + pPWM->PWMC_CH[channelId].PWMC_CMR = mode; + pPWM->PWMC_CH[channelId].PWMC_CDTYR = duty; + pPWM->PWMC_CH[channelId].PWMC_CPRDR = period; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_StartChannel +//* \brief Enable channel +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_StartChannel( + AT91PS_PWMC pPWM, // \arg pointer to a PWM controller + unsigned int flag) // \arg Channels IDs to be enabled +{ + pPWM->PWMC_ENA = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_StopChannel +//* \brief Disable channel +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_StopChannel( + AT91PS_PWMC pPWM, // \arg pointer to a PWM controller + unsigned int flag) // \arg Channels IDs to be enabled +{ + pPWM->PWMC_DIS = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_UpdateChannel +//* \brief Update Period or Duty Cycle +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_UpdateChannel( + AT91PS_PWMC pPWM, // \arg pointer to a PWM controller + unsigned int channelId, // \arg PWM channel ID + unsigned int update) // \arg Channels IDs to be enabled +{ + pPWM->PWMC_CH[channelId].PWMC_CUPDR = update; +} + +/* ***************************************************************************** + SOFTWARE API FOR UDP + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EnableIt +//* \brief Enable UDP IT +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EnableIt ( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned int flag) // \arg IT to be enabled +{ + //* Write to the IER register + pUDP->UDP_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_DisableIt +//* \brief Disable UDP IT +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_DisableIt ( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned int flag) // \arg IT to be disabled +{ + //* Write to the IDR register + pUDP->UDP_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_SetAddress +//* \brief Set UDP functional address +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_SetAddress ( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char address) // \arg new UDP address +{ + pUDP->UDP_FADDR = (AT91C_UDP_FEN | address); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EnableEp +//* \brief Enable Endpoint +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EnableEp ( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint) // \arg endpoint number +{ + pUDP->UDP_CSR[endpoint] |= AT91C_UDP_EPEDS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_DisableEp +//* \brief Enable Endpoint +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_DisableEp ( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint) // \arg endpoint number +{ + pUDP->UDP_CSR[endpoint] &= ~AT91C_UDP_EPEDS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_SetState +//* \brief Set UDP Device state +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_SetState ( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned int flag) // \arg new UDP address +{ + pUDP->UDP_GLBSTATE &= ~(AT91C_UDP_FADDEN | AT91C_UDP_CONFG); + pUDP->UDP_GLBSTATE |= flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_GetState +//* \brief return UDP Device state +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_UDP_GetState ( // \return the UDP device state + AT91PS_UDP pUDP) // \arg pointer to a UDP controller +{ + return (pUDP->UDP_GLBSTATE & (AT91C_UDP_FADDEN | AT91C_UDP_CONFG)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_ResetEp +//* \brief Reset UDP endpoint +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_ResetEp ( // \return the UDP device state + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned int flag) // \arg Endpoints to be reset +{ + pUDP->UDP_RSTEP = flag; + pUDP->UDP_RSTEP = 0; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpStall +//* \brief Endpoint will STALL requests +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EpStall( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint) // \arg endpoint number +{ + pUDP->UDP_CSR[endpoint] |= AT91C_UDP_FORCESTALL; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpWrite +//* \brief Write value in the DPR +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EpWrite( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint, // \arg endpoint number + unsigned char value) // \arg value to be written in the DPR +{ + pUDP->UDP_FDR[endpoint] = value; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpRead +//* \brief Return value from the DPR +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_UDP_EpRead( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint) // \arg endpoint number +{ + return pUDP->UDP_FDR[endpoint]; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpEndOfWr +//* \brief Notify the UDP that values in DPR are ready to be sent +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EpEndOfWr( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint) // \arg endpoint number +{ + pUDP->UDP_CSR[endpoint] |= AT91C_UDP_TXPKTRDY; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpClear +//* \brief Clear flag in the endpoint CSR register +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EpClear( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint, // \arg endpoint number + unsigned int flag) // \arg flag to be cleared +{ + pUDP->UDP_CSR[endpoint] &= ~(flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpSet +//* \brief Set flag in the endpoint CSR register +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EpSet( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint, // \arg endpoint number + unsigned int flag) // \arg flag to be cleared +{ + pUDP->UDP_CSR[endpoint] |= flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpStatus +//* \brief Return the endpoint CSR register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_UDP_EpStatus( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint) // \arg endpoint number +{ + return pUDP->UDP_CSR[endpoint]; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_GetInterruptMaskStatus +//* \brief Return UDP Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_UDP_GetInterruptMaskStatus( // \return UDP Interrupt Mask Status + AT91PS_UDP pUdp) // \arg pointer to a UDP controller +{ + return pUdp->UDP_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_IsInterruptMasked +//* \brief Test if UDP Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_UDP_IsInterruptMasked( + AT91PS_UDP pUdp, // \arg pointer to a UDP controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_UDP_GetInterruptMaskStatus(pUdp) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR TC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC_InterruptEnable +//* \brief Enable TC Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_TC_InterruptEnable( + AT91PS_TC pTc, // \arg pointer to a TC controller + unsigned int flag) // \arg TC interrupt to be enabled +{ + pTc->TC_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC_InterruptDisable +//* \brief Disable TC Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_TC_InterruptDisable( + AT91PS_TC pTc, // \arg pointer to a TC controller + unsigned int flag) // \arg TC interrupt to be disabled +{ + pTc->TC_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC_GetInterruptMaskStatus +//* \brief Return TC Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TC_GetInterruptMaskStatus( // \return TC Interrupt Mask Status + AT91PS_TC pTc) // \arg pointer to a TC controller +{ + return pTc->TC_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC_IsInterruptMasked +//* \brief Test if TC Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_TC_IsInterruptMasked( + AT91PS_TC pTc, // \arg pointer to a TC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_TC_GetInterruptMaskStatus(pTc) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR CAN + ***************************************************************************** */ +#define STANDARD_FORMAT 0 +#define EXTENDED_FORMAT 1 + +//*---------------------------------------------------------------------------- +//* \fn AT91F_InitMailboxRegisters() +//* \brief Configure the corresponding mailbox +//*---------------------------------------------------------------------------- +__inline void AT91F_InitMailboxRegisters(AT91PS_CAN_MB CAN_Mailbox, + int mode_reg, + int acceptance_mask_reg, + int id_reg, + int data_low_reg, + int data_high_reg, + int control_reg) +{ + CAN_Mailbox->CAN_MB_MCR = 0x0; + CAN_Mailbox->CAN_MB_MMR = mode_reg; + CAN_Mailbox->CAN_MB_MAM = acceptance_mask_reg; + CAN_Mailbox->CAN_MB_MID = id_reg; + CAN_Mailbox->CAN_MB_MDL = data_low_reg; + CAN_Mailbox->CAN_MB_MDH = data_high_reg; + CAN_Mailbox->CAN_MB_MCR = control_reg; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_EnableCAN() +//* \brief +//*---------------------------------------------------------------------------- +__inline void AT91F_EnableCAN( + AT91PS_CAN pCAN) // pointer to a CAN controller +{ + pCAN->CAN_MR |= AT91C_CAN_CANEN; + + // Wait for WAKEUP flag raising <=> 11-recessive-bit were scanned by the transceiver + while( (pCAN->CAN_SR & AT91C_CAN_WAKEUP) != AT91C_CAN_WAKEUP ); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_DisableCAN() +//* \brief +//*---------------------------------------------------------------------------- +__inline void AT91F_DisableCAN( + AT91PS_CAN pCAN) // pointer to a CAN controller +{ + pCAN->CAN_MR &= ~AT91C_CAN_CANEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_EnableIt +//* \brief Enable CAN interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_EnableIt ( + AT91PS_CAN pCAN, // pointer to a CAN controller + unsigned int flag) // IT to be enabled +{ + //* Write to the IER register + pCAN->CAN_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_DisableIt +//* \brief Disable CAN interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_DisableIt ( + AT91PS_CAN pCAN, // pointer to a CAN controller + unsigned int flag) // IT to be disabled +{ + //* Write to the IDR register + pCAN->CAN_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetStatus +//* \brief Return CAN Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetStatus( // \return CAN Interrupt Status + AT91PS_CAN pCAN) // pointer to a CAN controller +{ + return pCAN->CAN_SR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetInterruptMaskStatus +//* \brief Return CAN Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetInterruptMaskStatus( // \return CAN Interrupt Mask Status + AT91PS_CAN pCAN) // pointer to a CAN controller +{ + return pCAN->CAN_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_IsInterruptMasked +//* \brief Test if CAN Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_IsInterruptMasked( + AT91PS_CAN pCAN, // \arg pointer to a CAN controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_CAN_GetInterruptMaskStatus(pCAN) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_IsStatusSet +//* \brief Test if CAN Interrupt is Set +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_IsStatusSet( + AT91PS_CAN pCAN, // \arg pointer to a CAN controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_CAN_GetStatus(pCAN) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgModeReg +//* \brief Configure the Mode Register of the CAN controller +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgModeReg ( + AT91PS_CAN pCAN, // pointer to a CAN controller + unsigned int mode) // mode register +{ + //* Write to the MR register + pCAN->CAN_MR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetModeReg +//* \brief Return the Mode Register of the CAN controller value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetModeReg ( + AT91PS_CAN pCAN // pointer to a CAN controller + ) +{ + return pCAN->CAN_MR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgBaudrateReg +//* \brief Configure the Baudrate of the CAN controller for the network +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgBaudrateReg ( + AT91PS_CAN pCAN, // pointer to a CAN controller + unsigned int baudrate_cfg) +{ + //* Write to the BR register + pCAN->CAN_BR = baudrate_cfg; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetBaudrate +//* \brief Return the Baudrate of the CAN controller for the network value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetBaudrate ( + AT91PS_CAN pCAN // pointer to a CAN controller + ) +{ + return pCAN->CAN_BR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetInternalCounter +//* \brief Return CAN Timer Regsiter Value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetInternalCounter ( + AT91PS_CAN pCAN // pointer to a CAN controller + ) +{ + return pCAN->CAN_TIM; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetTimestamp +//* \brief Return CAN Timestamp Register Value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetTimestamp ( + AT91PS_CAN pCAN // pointer to a CAN controller + ) +{ + return pCAN->CAN_TIMESTP; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetErrorCounter +//* \brief Return CAN Error Counter Register Value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetErrorCounter ( + AT91PS_CAN pCAN // pointer to a CAN controller + ) +{ + return pCAN->CAN_ECR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_InitTransferRequest +//* \brief Request for a transfer on the corresponding mailboxes +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_InitTransferRequest ( + AT91PS_CAN pCAN, // pointer to a CAN controller + unsigned int transfer_cmd) +{ + pCAN->CAN_TCR = transfer_cmd; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_InitAbortRequest +//* \brief Abort the corresponding mailboxes +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_InitAbortRequest ( + AT91PS_CAN pCAN, // pointer to a CAN controller + unsigned int abort_cmd) +{ + pCAN->CAN_ACR = abort_cmd; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgMessageModeReg +//* \brief Program the Message Mode Register +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgMessageModeReg ( + AT91PS_CAN_MB CAN_Mailbox, // pointer to a CAN Mailbox + unsigned int mode) +{ + CAN_Mailbox->CAN_MB_MMR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetMessageModeReg +//* \brief Return the Message Mode Register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetMessageModeReg ( + AT91PS_CAN_MB CAN_Mailbox) // pointer to a CAN Mailbox +{ + return CAN_Mailbox->CAN_MB_MMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgMessageIDReg +//* \brief Program the Message ID Register +//* \brief Version == 0 for Standard messsage, Version == 1 for Extended +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgMessageIDReg ( + AT91PS_CAN_MB CAN_Mailbox, // pointer to a CAN Mailbox + unsigned int id, + unsigned char version) +{ + if(version==0) // IDvA Standard Format + CAN_Mailbox->CAN_MB_MID = id<<18; + else // IDvB Extended Format + CAN_Mailbox->CAN_MB_MID = id | (1<<29); // set MIDE bit +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetMessageIDReg +//* \brief Return the Message ID Register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetMessageIDReg ( + AT91PS_CAN_MB CAN_Mailbox) // pointer to a CAN Mailbox +{ + return CAN_Mailbox->CAN_MB_MID; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgMessageAcceptanceMaskReg +//* \brief Program the Message Acceptance Mask Register +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgMessageAcceptanceMaskReg ( + AT91PS_CAN_MB CAN_Mailbox, // pointer to a CAN Mailbox + unsigned int mask) +{ + CAN_Mailbox->CAN_MB_MAM = mask; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetMessageAcceptanceMaskReg +//* \brief Return the Message Acceptance Mask Register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetMessageAcceptanceMaskReg ( + AT91PS_CAN_MB CAN_Mailbox) // pointer to a CAN Mailbox +{ + return CAN_Mailbox->CAN_MB_MAM; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetFamilyID +//* \brief Return the Message ID Register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetFamilyID ( + AT91PS_CAN_MB CAN_Mailbox) // pointer to a CAN Mailbox +{ + return CAN_Mailbox->CAN_MB_MFID; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgMessageCtrl +//* \brief Request and config for a transfer on the corresponding mailbox +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgMessageCtrlReg ( + AT91PS_CAN_MB CAN_Mailbox, // pointer to a CAN Mailbox + unsigned int message_ctrl_cmd) +{ + CAN_Mailbox->CAN_MB_MCR = message_ctrl_cmd; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetMessageStatus +//* \brief Return CAN Mailbox Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetMessageStatus ( + AT91PS_CAN_MB CAN_Mailbox) // pointer to a CAN Mailbox +{ + return CAN_Mailbox->CAN_MB_MSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgMessageDataLow +//* \brief Program data low value +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgMessageDataLow ( + AT91PS_CAN_MB CAN_Mailbox, // pointer to a CAN Mailbox + unsigned int data) +{ + CAN_Mailbox->CAN_MB_MDL = data; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetMessageDataLow +//* \brief Return data low value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetMessageDataLow ( + AT91PS_CAN_MB CAN_Mailbox) // pointer to a CAN Mailbox +{ + return CAN_Mailbox->CAN_MB_MDL; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgMessageDataHigh +//* \brief Program data high value +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgMessageDataHigh ( + AT91PS_CAN_MB CAN_Mailbox, // pointer to a CAN Mailbox + unsigned int data) +{ + CAN_Mailbox->CAN_MB_MDH = data; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetMessageDataHigh +//* \brief Return data high value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetMessageDataHigh ( + AT91PS_CAN_MB CAN_Mailbox) // pointer to a CAN Mailbox +{ + return CAN_Mailbox->CAN_MB_MDH; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_Open +//* \brief Open a CAN Port +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_Open ( + const unsigned int null) // \arg +{ + /* NOT DEFINED AT THIS MOMENT */ + return ( 0 ); +} +/* ***************************************************************************** + SOFTWARE API FOR ADC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_EnableIt +//* \brief Enable ADC interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_EnableIt ( + AT91PS_ADC pADC, // pointer to a ADC controller + unsigned int flag) // IT to be enabled +{ + //* Write to the IER register + pADC->ADC_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_DisableIt +//* \brief Disable ADC interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_DisableIt ( + AT91PS_ADC pADC, // pointer to a ADC controller + unsigned int flag) // IT to be disabled +{ + //* Write to the IDR register + pADC->ADC_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetStatus +//* \brief Return ADC Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetStatus( // \return ADC Interrupt Status + AT91PS_ADC pADC) // pointer to a ADC controller +{ + return pADC->ADC_SR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetInterruptMaskStatus +//* \brief Return ADC Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetInterruptMaskStatus( // \return ADC Interrupt Mask Status + AT91PS_ADC pADC) // pointer to a ADC controller +{ + return pADC->ADC_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_IsInterruptMasked +//* \brief Test if ADC Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_IsInterruptMasked( + AT91PS_ADC pADC, // \arg pointer to a ADC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_ADC_GetInterruptMaskStatus(pADC) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_IsStatusSet +//* \brief Test if ADC Status is Set +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_IsStatusSet( + AT91PS_ADC pADC, // \arg pointer to a ADC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_ADC_GetStatus(pADC) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_CfgModeReg +//* \brief Configure the Mode Register of the ADC controller +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_CfgModeReg ( + AT91PS_ADC pADC, // pointer to a ADC controller + unsigned int mode) // mode register +{ + //* Write to the MR register + pADC->ADC_MR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetModeReg +//* \brief Return the Mode Register of the ADC controller value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetModeReg ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_MR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_CfgTimings +//* \brief Configure the different necessary timings of the ADC controller +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_CfgTimings ( + AT91PS_ADC pADC, // pointer to a ADC controller + unsigned int mck_clock, // in MHz + unsigned int adc_clock, // in MHz + unsigned int startup_time, // in us + unsigned int sample_and_hold_time) // in ns +{ + unsigned int prescal,startup,shtim; + + prescal = mck_clock/(2*adc_clock) - 1; + startup = adc_clock*startup_time/8 - 1; + shtim = adc_clock*sample_and_hold_time/1000 - 1; + + //* Write to the MR register + pADC->ADC_MR = ( (prescal<<8) & AT91C_ADC_PRESCAL) | ( (startup<<16) & AT91C_ADC_STARTUP) | ( (shtim<<24) & AT91C_ADC_SHTIM); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_EnableChannel +//* \brief Return ADC Timer Register Value +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_EnableChannel ( + AT91PS_ADC pADC, // pointer to a ADC controller + unsigned int channel) // mode register +{ + //* Write to the CHER register + pADC->ADC_CHER = channel; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_DisableChannel +//* \brief Return ADC Timer Register Value +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_DisableChannel ( + AT91PS_ADC pADC, // pointer to a ADC controller + unsigned int channel) // mode register +{ + //* Write to the CHDR register + pADC->ADC_CHDR = channel; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetChannelStatus +//* \brief Return ADC Timer Register Value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetChannelStatus ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CHSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_StartConversion +//* \brief Software request for a analog to digital conversion +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_StartConversion ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + pADC->ADC_CR = AT91C_ADC_START; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_SoftReset +//* \brief Software reset +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_SoftReset ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + pADC->ADC_CR = AT91C_ADC_SWRST; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetLastConvertedData +//* \brief Return the Last Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetLastConvertedData ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_LCDR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH0 +//* \brief Return the Channel 0 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH0 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR0; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH1 +//* \brief Return the Channel 1 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH1 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR1; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH2 +//* \brief Return the Channel 2 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH2 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR2; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH3 +//* \brief Return the Channel 3 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH3 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR3; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH4 +//* \brief Return the Channel 4 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH4 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR4; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH5 +//* \brief Return the Channel 5 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH5 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR5; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH6 +//* \brief Return the Channel 6 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH6 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR6; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH7 +//* \brief Return the Channel 7 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH7 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR7; +} + +/* ***************************************************************************** + SOFTWARE API FOR AES + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_EnableIt +//* \brief Enable AES interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_EnableIt ( + AT91PS_AES pAES, // pointer to a AES controller + unsigned int flag) // IT to be enabled +{ + //* Write to the IER register + pAES->AES_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_DisableIt +//* \brief Disable AES interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_DisableIt ( + AT91PS_AES pAES, // pointer to a AES controller + unsigned int flag) // IT to be disabled +{ + //* Write to the IDR register + pAES->AES_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_GetStatus +//* \brief Return AES Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AES_GetStatus( // \return AES Interrupt Status + AT91PS_AES pAES) // pointer to a AES controller +{ + return pAES->AES_ISR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_GetInterruptMaskStatus +//* \brief Return AES Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AES_GetInterruptMaskStatus( // \return AES Interrupt Mask Status + AT91PS_AES pAES) // pointer to a AES controller +{ + return pAES->AES_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_IsInterruptMasked +//* \brief Test if AES Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AES_IsInterruptMasked( + AT91PS_AES pAES, // \arg pointer to a AES controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_AES_GetInterruptMaskStatus(pAES) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_IsStatusSet +//* \brief Test if AES Status is Set +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AES_IsStatusSet( + AT91PS_AES pAES, // \arg pointer to a AES controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_AES_GetStatus(pAES) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_CfgModeReg +//* \brief Configure the Mode Register of the AES controller +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_CfgModeReg ( + AT91PS_AES pAES, // pointer to a AES controller + unsigned int mode) // mode register +{ + //* Write to the MR register + pAES->AES_MR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_GetModeReg +//* \brief Return the Mode Register of the AES controller value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AES_GetModeReg ( + AT91PS_AES pAES // pointer to a AES controller + ) +{ + return pAES->AES_MR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_StartProcessing +//* \brief Start Encryption or Decryption +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_StartProcessing ( + AT91PS_AES pAES // pointer to a AES controller + ) +{ + pAES->AES_CR = AT91C_AES_START; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_SoftReset +//* \brief Reset AES +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_SoftReset ( + AT91PS_AES pAES // pointer to a AES controller + ) +{ + pAES->AES_CR = AT91C_AES_SWRST; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_LoadNewSeed +//* \brief Load New Seed in the random number generator +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_LoadNewSeed ( + AT91PS_AES pAES // pointer to a AES controller + ) +{ + pAES->AES_CR = AT91C_AES_LOADSEED; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_SetCryptoKey +//* \brief Set Cryptographic Key x +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_SetCryptoKey ( + AT91PS_AES pAES, // pointer to a AES controller + unsigned char index, + unsigned int keyword + ) +{ + pAES->AES_KEYWxR[index] = keyword; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_InputData +//* \brief Set Input Data x +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_InputData ( + AT91PS_AES pAES, // pointer to a AES controller + unsigned char index, + unsigned int indata + ) +{ + pAES->AES_IDATAxR[index] = indata; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_GetOutputData +//* \brief Get Output Data x +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AES_GetOutputData ( + AT91PS_AES pAES, // pointer to a AES controller + unsigned char index + ) +{ + return pAES->AES_ODATAxR[index]; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_SetInitializationVector +//* \brief Set Initialization Vector (or Counter) x +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_SetInitializationVector ( + AT91PS_AES pAES, // pointer to a AES controller + unsigned char index, + unsigned int initvector + ) +{ + pAES->AES_IVxR[index] = initvector; +} + +/* ***************************************************************************** + SOFTWARE API FOR TDES + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_EnableIt +//* \brief Enable TDES interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_EnableIt ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned int flag) // IT to be enabled +{ + //* Write to the IER register + pTDES->TDES_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_DisableIt +//* \brief Disable TDES interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_DisableIt ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned int flag) // IT to be disabled +{ + //* Write to the IDR register + pTDES->TDES_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_GetStatus +//* \brief Return TDES Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TDES_GetStatus( // \return TDES Interrupt Status + AT91PS_TDES pTDES) // pointer to a TDES controller +{ + return pTDES->TDES_ISR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_GetInterruptMaskStatus +//* \brief Return TDES Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TDES_GetInterruptMaskStatus( // \return TDES Interrupt Mask Status + AT91PS_TDES pTDES) // pointer to a TDES controller +{ + return pTDES->TDES_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_IsInterruptMasked +//* \brief Test if TDES Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TDES_IsInterruptMasked( + AT91PS_TDES pTDES, // \arg pointer to a TDES controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_TDES_GetInterruptMaskStatus(pTDES) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_IsStatusSet +//* \brief Test if TDES Status is Set +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TDES_IsStatusSet( + AT91PS_TDES pTDES, // \arg pointer to a TDES controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_TDES_GetStatus(pTDES) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_CfgModeReg +//* \brief Configure the Mode Register of the TDES controller +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_CfgModeReg ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned int mode) // mode register +{ + //* Write to the MR register + pTDES->TDES_MR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_GetModeReg +//* \brief Return the Mode Register of the TDES controller value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TDES_GetModeReg ( + AT91PS_TDES pTDES // pointer to a TDES controller + ) +{ + return pTDES->TDES_MR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_StartProcessing +//* \brief Start Encryption or Decryption +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_StartProcessing ( + AT91PS_TDES pTDES // pointer to a TDES controller + ) +{ + pTDES->TDES_CR = AT91C_TDES_START; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_SoftReset +//* \brief Reset TDES +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_SoftReset ( + AT91PS_TDES pTDES // pointer to a TDES controller + ) +{ + pTDES->TDES_CR = AT91C_TDES_SWRST; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_SetCryptoKey1 +//* \brief Set Cryptographic Key 1 Word x +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_SetCryptoKey1 ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned char index, + unsigned int keyword + ) +{ + pTDES->TDES_KEY1WxR[index] = keyword; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_SetCryptoKey2 +//* \brief Set Cryptographic Key 2 Word x +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_SetCryptoKey2 ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned char index, + unsigned int keyword + ) +{ + pTDES->TDES_KEY2WxR[index] = keyword; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_SetCryptoKey3 +//* \brief Set Cryptographic Key 3 Word x +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_SetCryptoKey3 ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned char index, + unsigned int keyword + ) +{ + pTDES->TDES_KEY3WxR[index] = keyword; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_InputData +//* \brief Set Input Data x +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_InputData ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned char index, + unsigned int indata + ) +{ + pTDES->TDES_IDATAxR[index] = indata; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_GetOutputData +//* \brief Get Output Data x +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TDES_GetOutputData ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned char index + ) +{ + return pTDES->TDES_ODATAxR[index]; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_SetInitializationVector +//* \brief Set Initialization Vector x +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_SetInitializationVector ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned char index, + unsigned int initvector + ) +{ + pTDES->TDES_IVxR[index] = initvector; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_DBGU_CfgPMC +//* \brief Enable Peripheral clock in PMC for DBGU +//*---------------------------------------------------------------------------- +__inline void AT91F_DBGU_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_DBGU_CfgPIO +//* \brief Configure PIO controllers to drive DBGU signals +//*---------------------------------------------------------------------------- +__inline void AT91F_DBGU_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA27_DRXD ) | + ((unsigned int) AT91C_PA28_DTXD ), // Peripheral A + 0); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_CfgPMC +//* \brief Enable Peripheral clock in PMC for PMC +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_CfgPIO +//* \brief Configure PIO controllers to drive PMC signals +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB30_PCK2 ) | + ((unsigned int) AT91C_PB29_PCK1 ), // Peripheral A + ((unsigned int) AT91C_PB20_PCK0 ) | + ((unsigned int) AT91C_PB0_PCK0 ) | + ((unsigned int) AT91C_PB22_PCK2 ) | + ((unsigned int) AT91C_PB21_PCK1 )); // Peripheral B + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PA30_PCK2 ) | + ((unsigned int) AT91C_PA13_PCK1 ) | + ((unsigned int) AT91C_PA27_PCK3 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_VREG_CfgPMC +//* \brief Enable Peripheral clock in PMC for VREG +//*---------------------------------------------------------------------------- +__inline void AT91F_VREG_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_RSTC_CfgPMC +//* \brief Enable Peripheral clock in PMC for RSTC +//*---------------------------------------------------------------------------- +__inline void AT91F_RSTC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_CfgPMC +//* \brief Enable Peripheral clock in PMC for SSC +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SSC)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_CfgPIO +//* \brief Configure PIO controllers to drive SSC signals +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA25_RK ) | + ((unsigned int) AT91C_PA22_TK ) | + ((unsigned int) AT91C_PA21_TF ) | + ((unsigned int) AT91C_PA24_RD ) | + ((unsigned int) AT91C_PA26_RF ) | + ((unsigned int) AT91C_PA23_TD ), // Peripheral A + 0); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_WDTC_CfgPMC +//* \brief Enable Peripheral clock in PMC for WDTC +//*---------------------------------------------------------------------------- +__inline void AT91F_WDTC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US1_CfgPMC +//* \brief Enable Peripheral clock in PMC for US1 +//*---------------------------------------------------------------------------- +__inline void AT91F_US1_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_US1)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US1_CfgPIO +//* \brief Configure PIO controllers to drive US1 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_US1_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PB26_RI1 ) | + ((unsigned int) AT91C_PB24_DSR1 ) | + ((unsigned int) AT91C_PB23_DCD1 ) | + ((unsigned int) AT91C_PB25_DTR1 )); // Peripheral B + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA7_SCK1 ) | + ((unsigned int) AT91C_PA8_RTS1 ) | + ((unsigned int) AT91C_PA6_TXD1 ) | + ((unsigned int) AT91C_PA5_RXD1 ) | + ((unsigned int) AT91C_PA9_CTS1 ), // Peripheral A + 0); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US0_CfgPMC +//* \brief Enable Peripheral clock in PMC for US0 +//*---------------------------------------------------------------------------- +__inline void AT91F_US0_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_US0)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US0_CfgPIO +//* \brief Configure PIO controllers to drive US0 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_US0_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA0_RXD0 ) | + ((unsigned int) AT91C_PA4_CTS0 ) | + ((unsigned int) AT91C_PA3_RTS0 ) | + ((unsigned int) AT91C_PA2_SCK0 ) | + ((unsigned int) AT91C_PA1_TXD0 ), // Peripheral A + 0); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI1_CfgPMC +//* \brief Enable Peripheral clock in PMC for SPI1 +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI1_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SPI1)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI1_CfgPIO +//* \brief Configure PIO controllers to drive SPI1 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI1_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PB16_NPCS13 ) | + ((unsigned int) AT91C_PB10_NPCS11 ) | + ((unsigned int) AT91C_PB11_NPCS12 )); // Peripheral B + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PA4_NPCS13 ) | + ((unsigned int) AT91C_PA29_NPCS13 ) | + ((unsigned int) AT91C_PA21_NPCS10 ) | + ((unsigned int) AT91C_PA22_SPCK1 ) | + ((unsigned int) AT91C_PA25_NPCS11 ) | + ((unsigned int) AT91C_PA2_NPCS11 ) | + ((unsigned int) AT91C_PA24_MISO1 ) | + ((unsigned int) AT91C_PA3_NPCS12 ) | + ((unsigned int) AT91C_PA26_NPCS12 ) | + ((unsigned int) AT91C_PA23_MOSI1 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI0_CfgPMC +//* \brief Enable Peripheral clock in PMC for SPI0 +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI0_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SPI0)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI0_CfgPIO +//* \brief Configure PIO controllers to drive SPI0 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI0_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PB13_NPCS01 ) | + ((unsigned int) AT91C_PB17_NPCS03 ) | + ((unsigned int) AT91C_PB14_NPCS02 )); // Peripheral B + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA16_MISO0 ) | + ((unsigned int) AT91C_PA13_NPCS01 ) | + ((unsigned int) AT91C_PA15_NPCS03 ) | + ((unsigned int) AT91C_PA17_MOSI0 ) | + ((unsigned int) AT91C_PA18_SPCK0 ) | + ((unsigned int) AT91C_PA14_NPCS02 ) | + ((unsigned int) AT91C_PA12_NPCS00 ), // Peripheral A + ((unsigned int) AT91C_PA7_NPCS01 ) | + ((unsigned int) AT91C_PA9_NPCS03 ) | + ((unsigned int) AT91C_PA8_NPCS02 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITC_CfgPMC +//* \brief Enable Peripheral clock in PMC for PITC +//*---------------------------------------------------------------------------- +__inline void AT91F_PITC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_CfgPMC +//* \brief Enable Peripheral clock in PMC for AIC +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_FIQ) | + ((unsigned int) 1 << AT91C_ID_IRQ0) | + ((unsigned int) 1 << AT91C_ID_IRQ1)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_CfgPIO +//* \brief Configure PIO controllers to drive AIC signals +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA30_IRQ0 ) | + ((unsigned int) AT91C_PA29_FIQ ), // Peripheral A + ((unsigned int) AT91C_PA14_IRQ1 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_CfgPMC +//* \brief Enable Peripheral clock in PMC for AES +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_AES)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_CfgPMC +//* \brief Enable Peripheral clock in PMC for TWI +//*---------------------------------------------------------------------------- +__inline void AT91F_TWI_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_TWI)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_CfgPIO +//* \brief Configure PIO controllers to drive TWI signals +//*---------------------------------------------------------------------------- +__inline void AT91F_TWI_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA11_TWCK ) | + ((unsigned int) AT91C_PA10_TWD ), // Peripheral A + 0); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_CfgPMC +//* \brief Enable Peripheral clock in PMC for ADC +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_ADC)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_CfgPIO +//* \brief Configure PIO controllers to drive ADC signals +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PB18_ADTRG )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWMC_CH3_CfgPIO +//* \brief Configure PIO controllers to drive PWMC_CH3 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_CH3_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB22_PWM3 ), // Peripheral A + ((unsigned int) AT91C_PB30_PWM3 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWMC_CH2_CfgPIO +//* \brief Configure PIO controllers to drive PWMC_CH2 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_CH2_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB21_PWM2 ), // Peripheral A + ((unsigned int) AT91C_PB29_PWM2 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWMC_CH1_CfgPIO +//* \brief Configure PIO controllers to drive PWMC_CH1 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_CH1_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB20_PWM1 ), // Peripheral A + ((unsigned int) AT91C_PB28_PWM1 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWMC_CH0_CfgPIO +//* \brief Configure PIO controllers to drive PWMC_CH0 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_CH0_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB19_PWM0 ), // Peripheral A + ((unsigned int) AT91C_PB27_PWM0 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_RTTC_CfgPMC +//* \brief Enable Peripheral clock in PMC for RTTC +//*---------------------------------------------------------------------------- +__inline void AT91F_RTTC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_CfgPMC +//* \brief Enable Peripheral clock in PMC for UDP +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_UDP)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_CfgPMC +//* \brief Enable Peripheral clock in PMC for TDES +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_TDES)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_EMAC_CfgPMC +//* \brief Enable Peripheral clock in PMC for EMAC +//*---------------------------------------------------------------------------- +__inline void AT91F_EMAC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_EMAC)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_EMAC_CfgPIO +//* \brief Configure PIO controllers to drive EMAC signals +//*---------------------------------------------------------------------------- +__inline void AT91F_EMAC_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB2_ETX0 ) | + ((unsigned int) AT91C_PB12_ETXER ) | + ((unsigned int) AT91C_PB16_ECOL ) | + ((unsigned int) AT91C_PB11_ETX3 ) | + ((unsigned int) AT91C_PB6_ERX1 ) | + ((unsigned int) AT91C_PB15_ERXDV ) | + ((unsigned int) AT91C_PB13_ERX2 ) | + ((unsigned int) AT91C_PB3_ETX1 ) | + ((unsigned int) AT91C_PB8_EMDC ) | + ((unsigned int) AT91C_PB5_ERX0 ) | + //((unsigned int) AT91C_PB18_EF100 ) | + ((unsigned int) AT91C_PB14_ERX3 ) | + ((unsigned int) AT91C_PB4_ECRS_ECRSDV) | + ((unsigned int) AT91C_PB1_ETXEN ) | + ((unsigned int) AT91C_PB10_ETX2 ) | + ((unsigned int) AT91C_PB0_ETXCK_EREFCK) | + ((unsigned int) AT91C_PB9_EMDIO ) | + ((unsigned int) AT91C_PB7_ERXER ) | + ((unsigned int) AT91C_PB17_ERXCK ), // Peripheral A + 0); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC0_CfgPMC +//* \brief Enable Peripheral clock in PMC for TC0 +//*---------------------------------------------------------------------------- +__inline void AT91F_TC0_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_TC0)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC0_CfgPIO +//* \brief Configure PIO controllers to drive TC0 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_TC0_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB23_TIOA0 ) | + ((unsigned int) AT91C_PB24_TIOB0 ), // Peripheral A + ((unsigned int) AT91C_PB12_TCLK0 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC1_CfgPMC +//* \brief Enable Peripheral clock in PMC for TC1 +//*---------------------------------------------------------------------------- +__inline void AT91F_TC1_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_TC1)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC1_CfgPIO +//* \brief Configure PIO controllers to drive TC1 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_TC1_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB25_TIOA1 ) | + ((unsigned int) AT91C_PB26_TIOB1 ), // Peripheral A + ((unsigned int) AT91C_PB19_TCLK1 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC2_CfgPMC +//* \brief Enable Peripheral clock in PMC for TC2 +//*---------------------------------------------------------------------------- +__inline void AT91F_TC2_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_TC2)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC2_CfgPIO +//* \brief Configure PIO controllers to drive TC2 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_TC2_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB28_TIOB2 ) | + ((unsigned int) AT91C_PB27_TIOA2 ), // Peripheral A + 0); // Peripheral B + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PA15_TCLK2 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_CfgPMC +//* \brief Enable Peripheral clock in PMC for MC +//*---------------------------------------------------------------------------- +__inline void AT91F_MC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIOA_CfgPMC +//* \brief Enable Peripheral clock in PMC for PIOA +//*---------------------------------------------------------------------------- +__inline void AT91F_PIOA_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_PIOA)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIOB_CfgPMC +//* \brief Enable Peripheral clock in PMC for PIOB +//*---------------------------------------------------------------------------- +__inline void AT91F_PIOB_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_PIOB)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgPMC +//* \brief Enable Peripheral clock in PMC for CAN +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_CAN)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgPIO +//* \brief Configure PIO controllers to drive CAN signals +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA20_CANTX ) | + ((unsigned int) AT91C_PA19_CANRX ), // Peripheral A + 0); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWMC_CfgPMC +//* \brief Enable Peripheral clock in PMC for PWMC +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_PWMC)); +} + +#endif // lib_AT91SAM7X256_H diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM7S64/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM7S64/port.c new file mode 100644 index 0000000..6dfcbdc --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM7S64/port.c @@ -0,0 +1,301 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the Atmel ARM7 port. + *----------------------------------------------------------*/ + + +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Constants required to setup the initial stack. */ +#define portINITIAL_SPSR ( ( StackType_t ) 0x1f ) /* System mode, ARM mode, interrupts enabled. */ +#define portTHUMB_MODE_BIT ( ( StackType_t ) 0x20 ) +#define portINSTRUCTION_SIZE ( ( StackType_t ) 4 ) + +/* Constants required to setup the PIT. */ +#define portPIT_CLOCK_DIVISOR ( ( uint32_t ) 16 ) +#define portPIT_COUNTER_VALUE ( ( ( configCPU_CLOCK_HZ / portPIT_CLOCK_DIVISOR ) / 1000UL ) * portTICK_PERIOD_MS ) + +/* Constants required to handle critical sections. */ +#define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) + + +#define portINT_LEVEL_SENSITIVE 0 +#define portPIT_ENABLE ( ( uint16_t ) 0x1 << 24 ) +#define portPIT_INT_ENABLE ( ( uint16_t ) 0x1 << 25 ) +/*-----------------------------------------------------------*/ + +/* Setup the PIT to generate the tick interrupts. */ +static void prvSetupTimerInterrupt( void ); + +/* ulCriticalNesting will get set to zero when the first task starts. It +cannot be initialised to 0 as this will cause interrupts to be enabled +during the kernel initialisation process. */ +uint32_t ulCriticalNesting = ( uint32_t ) 9999; + +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been called. + * + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +StackType_t *pxOriginalTOS; + + pxOriginalTOS = pxTopOfStack; + + /* To ensure asserts in tasks.c don't fail, although in this case the assert + is not really required. */ + pxTopOfStack--; + + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. */ + + /* First on the stack is the return address - which in this case is the + start of the task. The offset is added to make the return address appear + as it would within an IRQ ISR. */ + *pxTopOfStack = ( StackType_t ) pxCode + portINSTRUCTION_SIZE; + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) 0xaaaaaaaa; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxOriginalTOS; /* Stack used when task starts goes in R13. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */ + pxTopOfStack--; + + /* When the task starts is will expect to find the function parameter in + R0. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + + /* The status register is set for system mode, with interrupts enabled. */ + *pxTopOfStack = ( StackType_t ) portINITIAL_SPSR; + + if( ( ( uint32_t ) pxCode & 0x01UL ) != 0x00UL ) + { + /* We want the task to start in thumb mode. */ + *pxTopOfStack |= portTHUMB_MODE_BIT; + } + + pxTopOfStack--; + + /* Interrupt flags cannot always be stored on the stack and will + instead be stored in a variable, which is then saved as part of the + tasks context. */ + *pxTopOfStack = portNO_CRITICAL_NESTING; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void vPortStartFirstTask( void ); + + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + prvSetupTimerInterrupt(); + + /* Start the first task. */ + vPortStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the ARM port will require this function as there + is nothing to return to. */ +} +/*-----------------------------------------------------------*/ + +#if configUSE_PREEMPTION == 0 + + /* The cooperative scheduler requires a normal IRQ service routine to + simply increment the system tick. */ + static __arm __irq void vPortNonPreemptiveTick( void ); + static __arm __irq void vPortNonPreemptiveTick( void ) + { + uint32_t ulDummy; + + /* Increment the tick count - which may wake some tasks but as the + preemptive scheduler is not being used any woken task is not given + processor time no matter what its priority. */ + xTaskIncrementTick(); + + /* Clear the PIT interrupt. */ + ulDummy = AT91C_BASE_PITC->PITC_PIVR; + + /* End the interrupt in the AIC. */ + AT91C_BASE_AIC->AIC_EOICR = ulDummy; + } + +#else + + /* Currently the IAR port requires the preemptive tick function to be + defined in an asm file. */ + +#endif + +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt( void ) +{ +AT91PS_PITC pxPIT = AT91C_BASE_PITC; + + /* Setup the AIC for PIT interrupts. The interrupt routine chosen depends + on whether the preemptive or cooperative scheduler is being used. */ + #if configUSE_PREEMPTION == 0 + + AT91F_AIC_ConfigureIt( AT91C_BASE_AIC, AT91C_ID_SYS, AT91C_AIC_PRIOR_HIGHEST, portINT_LEVEL_SENSITIVE, ( void (*)(void) ) vPortNonPreemptiveTick ); + + #else + + extern void ( vPortPreemptiveTick )( void ); + AT91F_AIC_ConfigureIt( AT91C_BASE_AIC, AT91C_ID_SYS, AT91C_AIC_PRIOR_HIGHEST, portINT_LEVEL_SENSITIVE, ( void (*)(void) ) vPortPreemptiveTick ); + + #endif + + /* Configure the PIT period. */ + pxPIT->PITC_PIMR = portPIT_ENABLE | portPIT_INT_ENABLE | portPIT_COUNTER_VALUE; + + /* Enable the interrupt. Global interrupts are disables at this point so + this is safe. */ + AT91F_AIC_EnableIt( AT91C_BASE_AIC, AT91C_ID_SYS ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + /* Disable interrupts first! */ + __disable_interrupt(); + + /* Now interrupts are disabled ulCriticalNesting can be accessed + directly. Increment ulCriticalNesting to keep a count of how many times + portENTER_CRITICAL() has been called. */ + ulCriticalNesting++; +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + if( ulCriticalNesting > portNO_CRITICAL_NESTING ) + { + /* Decrement the nesting count as we are leaving a critical section. */ + ulCriticalNesting--; + + /* If the nesting level has reached zero then interrupts should be + re-enabled. */ + if( ulCriticalNesting == portNO_CRITICAL_NESTING ) + { + __enable_interrupt(); + } + } +} +/*-----------------------------------------------------------*/ + + + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM7S64/portasm.s79 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM7S64/portasm.s79 new file mode 100644 index 0000000..d6398f5 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM7S64/portasm.s79 @@ -0,0 +1,115 @@ +;/* +; FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. +; All rights reserved +; +; +; *************************************************************************** +; * * +; * FreeRTOS tutorial books are available in pdf and paperback. * +; * Complete, revised, and edited pdf reference manuals are also * +; * available. * +; * * +; * Purchasing FreeRTOS documentation will not only help you, by * +; * ensuring you get running as quickly as possible and with an * +; * in-depth knowledge of how to use FreeRTOS, it will also help * +; * the FreeRTOS project to continue with its mission of providing * +; * professional grade, cross platform, de facto standard solutions * +; * for microcontrollers - completely free of charge! * +; * * +; * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * +; * * +; * Thank you for using FreeRTOS, and thank you for your support! * +; * * +; *************************************************************************** +; +; +; This file is part of the FreeRTOS distribution. +; +; FreeRTOS is free software; you can redistribute it and/or modify it under +; the terms of the GNU General Public License (version 2) as published by the +; Free Software Foundation AND MODIFIED BY the FreeRTOS exception. +; >>>NOTE<<< The modification to the GPL is included to allow you to +; distribute a combined work that includes FreeRTOS without being obliged to +; provide the source code for proprietary components outside of the FreeRTOS +; kernel. FreeRTOS is distributed in the hope that it will be useful, but +; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +; more details. You should have received a copy of the GNU General Public +; License and the FreeRTOS license exception along with FreeRTOS; if not it +; can be viewed here: http://www.freertos.org/a00114.html and also obtained +; by writing to Richard Barry, contact details for whom are available on the +; FreeRTOS WEB site. +; +; 1 tab == 4 spaces! +; +; http://www.FreeRTOS.org - Documentation, latest information, license and +; contact details. +; +; http://www.SafeRTOS.com - A version that is certified for use in safety +; critical systems. +; +; http://www.OpenRTOS.com - Commercial support, development, porting, +; licensing and training services. +;*/ + RSEG ICODE:CODE + CODE32 + + EXTERN vTaskSwitchContext + EXTERN xTaskIncrementTick + + PUBLIC vPortYieldProcessor + PUBLIC vPortPreemptiveTick + PUBLIC vPortStartFirstTask + +#include "AT91SAM7S64_inc.h" +#include "ISR_Support.h" + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Starting the first task is just a matter of restoring the context that +; was created by pxPortInitialiseStack(). +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +vPortStartFirstTask: + portRESTORE_CONTEXT + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Manual context switch function. This is the SWI hander. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +vPortYieldProcessor: + ADD LR, LR, #4 ; Add 4 to the LR to make the LR appear exactly + ; as if the context was saved during and IRQ + ; handler. + + portSAVE_CONTEXT ; Save the context of the current task... + LDR R0, =vTaskSwitchContext ; before selecting the next task to execute. + mov lr, pc + BX R0 + portRESTORE_CONTEXT ; Restore the context of the selected task. + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Preemptive context switch function. This will only ever get installed if +; portUSE_PREEMPTION is set to 1 in portmacro.h. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +vPortPreemptiveTick: + portSAVE_CONTEXT ; Save the context of the current task. + + LDR R0, =xTaskIncrementTick ; Increment the tick count - this may wake a task. + mov lr, pc + BX R0 + + CMP R0, #0 + BEQ SkipContextSwitch + LDR R0, =vTaskSwitchContext ; Select the next task to execute. + mov lr, pc + BX R0 +SkipContextSwitch + LDR R14, =AT91C_BASE_PITC ; Clear the PIT interrupt + LDR R0, [R14, #PITC_PIVR ] + + LDR R14, =AT91C_BASE_AIC ; Mark the End of Interrupt on the AIC + STR R14, [R14, #AIC_EOICR] + + portRESTORE_CONTEXT ; Restore the context of the selected task. + + + END + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM7S64/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM7S64/portmacro.h new file mode 100644 index 0000000..64e4076 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM7S64/portmacro.h @@ -0,0 +1,153 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +#define portYIELD() asm ( "SWI 0" ) +#define portNOP() asm ( "NOP" ) +/*-----------------------------------------------------------*/ + +/* Critical section handling. */ +__arm __interwork void vPortDisableInterruptsFromThumb( void ); +__arm __interwork void vPortEnableInterruptsFromThumb( void ); +__arm __interwork void vPortEnterCritical( void ); +__arm __interwork void vPortExitCritical( void ); + +#define portDISABLE_INTERRUPTS() __disable_interrupt() +#define portENABLE_INTERRUPTS() __enable_interrupt() +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() +/*-----------------------------------------------------------*/ + +/* Task utilities. */ +#define portEND_SWITCHING_ISR( xSwitchRequired ) \ +{ \ +extern void vTaskSwitchContext( void ); \ + \ + if( xSwitchRequired ) \ + { \ + vTaskSwitchContext(); \ + } \ +} +/*-----------------------------------------------------------*/ + + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM9XE/ISR_Support.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM9XE/ISR_Support.h new file mode 100644 index 0000000..4a32f39 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM9XE/ISR_Support.h @@ -0,0 +1,78 @@ + EXTERN pxCurrentTCB + EXTERN ulCriticalNesting + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Context save and restore macro definitions +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +portSAVE_CONTEXT MACRO + + ; Push R0 as we are going to use the register. + STMDB SP!, {R0} + + ; Set R0 to point to the task stack pointer. + STMDB SP, {SP}^ + NOP + SUB SP, SP, #4 + LDMIA SP!, {R0} + + ; Push the return address onto the stack. + STMDB R0!, {LR} + + ; Now we have saved LR we can use it instead of R0. + MOV LR, R0 + + ; Pop R0 so we can save it onto the system mode stack. + LDMIA SP!, {R0} + + ; Push all the system mode registers onto the task stack. + STMDB LR, {R0-LR}^ + NOP + SUB LR, LR, #60 + + ; Push the SPSR onto the task stack. + MRS R0, SPSR + STMDB LR!, {R0} + + LDR R0, =ulCriticalNesting + LDR R0, [R0] + STMDB LR!, {R0} + + ; Store the new top of stack for the task. + LDR R1, =pxCurrentTCB + LDR R0, [R1] + STR LR, [R0] + + ENDM + + +portRESTORE_CONTEXT MACRO + + ; Set the LR to the task stack. + LDR R1, =pxCurrentTCB + LDR R0, [R1] + LDR LR, [R0] + + ; The critical nesting depth is the first item on the stack. + ; Load it into the ulCriticalNesting variable. + LDR R0, =ulCriticalNesting + LDMFD LR!, {R1} + STR R1, [R0] + + ; Get the SPSR from the stack. + LDMFD LR!, {R0} + MSR SPSR_cxsf, R0 + + ; Restore all system mode registers for the task. + LDMFD LR, {R0-R14}^ + NOP + + ; Restore the return address. + LDR LR, [LR, #+60] + + ; And return - correcting the offset in the LR to obtain the + ; correct address. + SUBS PC, LR, #4 + + ENDM + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM9XE/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM9XE/port.c new file mode 100644 index 0000000..1310c16 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM9XE/port.c @@ -0,0 +1,298 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the Atmel ARM7 port. + *----------------------------------------------------------*/ + + +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Hardware includes. */ +#include +#include +#include +#include +#include +#include +#include +#include + +/*-----------------------------------------------------------*/ + +/* Constants required to setup the initial stack. */ +#define portINITIAL_SPSR ( ( StackType_t ) 0x1f ) /* System mode, ARM mode, interrupts enabled. */ +#define portTHUMB_MODE_BIT ( ( StackType_t ) 0x20 ) +#define portINSTRUCTION_SIZE ( ( StackType_t ) 4 ) + +/* Constants required to setup the PIT. */ +#define port1MHz_IN_Hz ( 1000000ul ) +#define port1SECOND_IN_uS ( 1000000.0 ) + +/* Constants required to handle critical sections. */ +#define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) + + +#define portINT_LEVEL_SENSITIVE 0 +#define portPIT_ENABLE ( ( uint16_t ) 0x1 << 24 ) +#define portPIT_INT_ENABLE ( ( uint16_t ) 0x1 << 25 ) +/*-----------------------------------------------------------*/ + +/* Setup the PIT to generate the tick interrupts. */ +static void prvSetupTimerInterrupt( void ); + +/* The PIT interrupt handler - the RTOS tick. */ +static void vPortTickISR( void ); + +/* ulCriticalNesting will get set to zero when the first task starts. It +cannot be initialised to 0 as this will cause interrupts to be enabled +during the kernel initialisation process. */ +uint32_t ulCriticalNesting = ( uint32_t ) 9999; + +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been called. + * + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +StackType_t *pxOriginalTOS; + + pxOriginalTOS = pxTopOfStack; + + /* To ensure asserts in tasks.c don't fail, although in this case the assert + is not really required. */ + pxTopOfStack--; + + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. */ + + /* First on the stack is the return address - which in this case is the + start of the task. The offset is added to make the return address appear + as it would within an IRQ ISR. */ + *pxTopOfStack = ( StackType_t ) pxCode + portINSTRUCTION_SIZE; + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) 0xaaaaaaaa; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxOriginalTOS; /* Stack used when task starts goes in R13. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */ + pxTopOfStack--; + + /* When the task starts is will expect to find the function parameter in + R0. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + + /* The status register is set for system mode, with interrupts enabled. */ + *pxTopOfStack = ( StackType_t ) portINITIAL_SPSR; + + #ifdef THUMB_INTERWORK + { + /* We want the task to start in thumb mode. */ + *pxTopOfStack |= portTHUMB_MODE_BIT; + } + #endif + + pxTopOfStack--; + + /* Interrupt flags cannot always be stored on the stack and will + instead be stored in a variable, which is then saved as part of the + tasks context. */ + *pxTopOfStack = portNO_CRITICAL_NESTING; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void vPortStartFirstTask( void ); + + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + prvSetupTimerInterrupt(); + + /* Start the first task. */ + vPortStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the ARM port will require this function as there + is nothing to return to. */ +} +/*-----------------------------------------------------------*/ + +static __arm void vPortTickISR( void ) +{ +volatile uint32_t ulDummy; + + /* Increment the tick count - which may wake some tasks but as the + preemptive scheduler is not being used any woken task is not given + processor time no matter what its priority. */ + if( xTaskIncrementTick() != pdFALSE ) + { + vTaskSwitchContext(); + } + + /* Clear the PIT interrupt. */ + ulDummy = AT91C_BASE_PITC->PITC_PIVR; + + /* To remove compiler warning. */ + ( void ) ulDummy; + + /* The AIC is cleared in the asm wrapper, outside of this function. */ +} +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt( void ) +{ +const uint32_t ulPeriodIn_uS = ( 1.0 / ( double ) configTICK_RATE_HZ ) * port1SECOND_IN_uS; + + /* Setup the PIT for the required frequency. */ + PIT_Init( ulPeriodIn_uS, BOARD_MCK / port1MHz_IN_Hz ); + + /* Setup the PIT interrupt. */ + AIC_DisableIT( AT91C_ID_SYS ); + AIC_ConfigureIT( AT91C_ID_SYS, AT91C_AIC_PRIOR_LOWEST, vPortTickISR ); + AIC_EnableIT( AT91C_ID_SYS ); + PIT_EnableIT(); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + /* Disable interrupts first! */ + __disable_irq(); + + /* Now interrupts are disabled ulCriticalNesting can be accessed + directly. Increment ulCriticalNesting to keep a count of how many times + portENTER_CRITICAL() has been called. */ + ulCriticalNesting++; +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + if( ulCriticalNesting > portNO_CRITICAL_NESTING ) + { + /* Decrement the nesting count as we are leaving a critical section. */ + ulCriticalNesting--; + + /* If the nesting level has reached zero then interrupts should be + re-enabled. */ + if( ulCriticalNesting == portNO_CRITICAL_NESTING ) + { + __enable_irq(); + } + } +} +/*-----------------------------------------------------------*/ + + + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM9XE/portasm.s79 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM9XE/portasm.s79 new file mode 100644 index 0000000..d5ac7eb --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM9XE/portasm.s79 @@ -0,0 +1,34 @@ + RSEG ICODE:CODE + CODE32 + + EXTERN vTaskSwitchContext + + PUBLIC vPortYieldProcessor + PUBLIC vPortStartFirstTask + +#include "ISR_Support.h" + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Starting the first task is just a matter of restoring the context that +; was created by pxPortInitialiseStack(). +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +vPortStartFirstTask: + portRESTORE_CONTEXT + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Manual context switch function. This is the SWI hander. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +vPortYieldProcessor: + ADD LR, LR, #4 ; Add 4 to the LR to make the LR appear exactly + ; as if the context was saved during and IRQ + ; handler. + + portSAVE_CONTEXT ; Save the context of the current task... + LDR R0, =vTaskSwitchContext ; before selecting the next task to execute. + mov lr, pc + BX R0 + portRESTORE_CONTEXT ; Restore the context of the selected task. + + + END + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM9XE/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM9XE/portmacro.h new file mode 100644 index 0000000..8f7088b --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/AtmelSAM9XE/portmacro.h @@ -0,0 +1,156 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +#define portYIELD() asm ( "SWI 0" ) +#define portNOP() asm ( "NOP" ) +/*-----------------------------------------------------------*/ + +/* Critical section handling. */ +__arm __interwork void vPortDisableInterruptsFromThumb( void ); +__arm __interwork void vPortEnableInterruptsFromThumb( void ); +__arm __interwork void vPortEnterCritical( void ); +__arm __interwork void vPortExitCritical( void ); + +#define portDISABLE_INTERRUPTS() __disable_irq() +#define portENABLE_INTERRUPTS() __enable_irq() +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() +/*-----------------------------------------------------------*/ + +/* Task utilities. */ +#define portEND_SWITCHING_ISR( xSwitchRequired ) \ +{ \ +extern void vTaskSwitchContext( void ); \ + \ + if( xSwitchRequired ) \ + { \ + vTaskSwitchContext(); \ + } \ +} +/*-----------------------------------------------------------*/ + + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/LPC2000/ISR_Support.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/LPC2000/ISR_Support.h new file mode 100644 index 0000000..af77eca --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/LPC2000/ISR_Support.h @@ -0,0 +1,131 @@ +;/* +; FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. +; All rights reserved +; +; +; *************************************************************************** +; * * +; * FreeRTOS tutorial books are available in pdf and paperback. * +; * Complete, revised, and edited pdf reference manuals are also * +; * available. * +; * * +; * Purchasing FreeRTOS documentation will not only help you, by * +; * ensuring you get running as quickly as possible and with an * +; * in-depth knowledge of how to use FreeRTOS, it will also help * +; * the FreeRTOS project to continue with its mission of providing * +; * professional grade, cross platform, de facto standard solutions * +; * for microcontrollers - completely free of charge! * +; * * +; * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * +; * * +; * Thank you for using FreeRTOS, and thank you for your support! * +; * * +; *************************************************************************** +; +; +; This file is part of the FreeRTOS distribution. +; +; FreeRTOS is free software; you can redistribute it and/or modify it under +; the terms of the GNU General Public License (version 2) as published by the +; Free Software Foundation AND MODIFIED BY the FreeRTOS exception. +; >>>NOTE<<< The modification to the GPL is included to allow you to +; distribute a combined work that includes FreeRTOS without being obliged to +; provide the source code for proprietary components outside of the FreeRTOS +; kernel. FreeRTOS is distributed in the hope that it will be useful, but +; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +; more details. You should have received a copy of the GNU General Public +; License and the FreeRTOS license exception along with FreeRTOS; if not it +; can be viewed here: http://www.freertos.org/a00114.html and also obtained +; by writing to Richard Barry, contact details for whom are available on the +; FreeRTOS WEB site. +; +; 1 tab == 4 spaces! +; +; http://www.FreeRTOS.org - Documentation, latest information, license and +; contact details. +; +; http://www.SafeRTOS.com - A version that is certified for use in safety +; critical systems. +; +; http://www.OpenRTOS.com - Commercial support, development, porting, +; licensing and training services. +;*/ + EXTERN pxCurrentTCB + EXTERN ulCriticalNesting + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Context save and restore macro definitions +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +portSAVE_CONTEXT MACRO + + ; Push R0 as we are going to use the register. + STMDB SP!, {R0} + + ; Set R0 to point to the task stack pointer. + STMDB SP, {SP}^ + NOP + SUB SP, SP, #4 + LDMIA SP!, {R0} + + ; Push the return address onto the stack. + STMDB R0!, {LR} + + ; Now we have saved LR we can use it instead of R0. + MOV LR, R0 + + ; Pop R0 so we can save it onto the system mode stack. + LDMIA SP!, {R0} + + ; Push all the system mode registers onto the task stack. + STMDB LR, {R0-LR}^ + NOP + SUB LR, LR, #60 + + ; Push the SPSR onto the task stack. + MRS R0, SPSR + STMDB LR!, {R0} + + LDR R0, =ulCriticalNesting + LDR R0, [R0] + STMDB LR!, {R0} + + ; Store the new top of stack for the task. + LDR R1, =pxCurrentTCB + LDR R0, [R1] + STR LR, [R0] + + ENDM + + +portRESTORE_CONTEXT MACRO + + ; Set the LR to the task stack. + LDR R1, =pxCurrentTCB + LDR R0, [R1] + LDR LR, [R0] + + ; The critical nesting depth is the first item on the stack. + ; Load it into the ulCriticalNesting variable. + LDR R0, =ulCriticalNesting + LDMFD LR!, {R1} + STR R1, [R0] + + ; Get the SPSR from the stack. + LDMFD LR!, {R0} + MSR SPSR_cxsf, R0 + + ; Restore all system mode registers for the task. + LDMFD LR, {R0-R14}^ + NOP + + ; Restore the return address. + LDR LR, [LR, #+60] + + ; And return - correcting the offset in the LR to obtain the + ; correct address. + SUBS PC, LR, #4 + + ENDM + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/LPC2000/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/LPC2000/port.c new file mode 100644 index 0000000..3151794 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/LPC2000/port.c @@ -0,0 +1,359 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the Philips ARM7 port. + *----------------------------------------------------------*/ + +/* + Changes from V3.2.2 + + + Bug fix - The prescale value for the timer setup is now written to T0PR + instead of T0PC. This bug would have had no effect unless a prescale + value was actually used. +*/ + +/* Standard includes. */ +#include +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Constants required to setup the tick ISR. */ +#define portENABLE_TIMER ( ( uint8_t ) 0x01 ) +#define portPRESCALE_VALUE 0x00 +#define portINTERRUPT_ON_MATCH ( ( uint32_t ) 0x01 ) +#define portRESET_COUNT_ON_MATCH ( ( uint32_t ) 0x02 ) + +/* Constants required to setup the initial stack. */ +#define portINITIAL_SPSR ( ( StackType_t ) 0x1f ) /* System mode, ARM mode, interrupts enabled. */ +#define portTHUMB_MODE_BIT ( ( StackType_t ) 0x20 ) +#define portINSTRUCTION_SIZE ( ( StackType_t ) 4 ) + +/* Constants required to setup the PIT. */ +#define portPIT_CLOCK_DIVISOR ( ( uint32_t ) 16 ) +#define portPIT_COUNTER_VALUE ( ( ( configCPU_CLOCK_HZ / portPIT_CLOCK_DIVISOR ) / 1000UL ) * portTICK_PERIOD_MS ) + +/* Constants required to handle interrupts. */ +#define portTIMER_MATCH_ISR_BIT ( ( uint8_t ) 0x01 ) +#define portCLEAR_VIC_INTERRUPT ( ( uint32_t ) 0 ) + +/* Constants required to handle critical sections. */ +#define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) + + +#define portINT_LEVEL_SENSITIVE 0 +#define portPIT_ENABLE ( ( uint16_t ) 0x1 << 24 ) +#define portPIT_INT_ENABLE ( ( uint16_t ) 0x1 << 25 ) + +/* Constants required to setup the VIC for the tick ISR. */ +#define portTIMER_VIC_CHANNEL ( ( uint32_t ) 0x0004 ) +#define portTIMER_VIC_CHANNEL_BIT ( ( uint32_t ) 0x0010 ) +#define portTIMER_VIC_ENABLE ( ( uint32_t ) 0x0020 ) + +/*-----------------------------------------------------------*/ + +/* Setup the PIT to generate the tick interrupts. */ +static void prvSetupTimerInterrupt( void ); + +/* ulCriticalNesting will get set to zero when the first task starts. It +cannot be initialised to 0 as this will cause interrupts to be enabled +during the kernel initialisation process. */ +uint32_t ulCriticalNesting = ( uint32_t ) 9999; + +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been called. + * + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +StackType_t *pxOriginalTOS; + + pxOriginalTOS = pxTopOfStack; + + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. */ + + /* First on the stack is the return address - which in this case is the + start of the task. The offset is added to make the return address appear + as it would within an IRQ ISR. */ + *pxTopOfStack = ( StackType_t ) pxCode + portINSTRUCTION_SIZE; + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) 0xaaaaaaaa; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxOriginalTOS; /* Stack used when task starts goes in R13. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */ + pxTopOfStack--; + + /* When the task starts is will expect to find the function parameter in + R0. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + + /* The status register is set for system mode, with interrupts enabled. */ + *pxTopOfStack = ( StackType_t ) portINITIAL_SPSR; + + if( ( ( uint32_t ) pxCode & 0x01UL ) != 0x00UL ) + { + /* We want the task to start in thumb mode. */ + *pxTopOfStack |= portTHUMB_MODE_BIT; + } + + pxTopOfStack--; + + /* Interrupt flags cannot always be stored on the stack and will + instead be stored in a variable, which is then saved as part of the + tasks context. */ + *pxTopOfStack = portNO_CRITICAL_NESTING; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void vPortStartFirstTask( void ); + + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + prvSetupTimerInterrupt(); + + /* Start the first task. */ + vPortStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the ARM port will require this function as there + is nothing to return to. */ +} +/*-----------------------------------------------------------*/ + +#if configUSE_PREEMPTION == 0 + + /* The cooperative scheduler requires a normal IRQ service routine to + simply increment the system tick. */ + static __arm __irq void vPortNonPreemptiveTick( void ); + static __arm __irq void vPortNonPreemptiveTick( void ) + { + /* Increment the tick count - which may wake some tasks but as the + preemptive scheduler is not being used any woken task is not given + processor time no matter what its priority. */ + xTaskIncrementTick(); + + /* Ready for the next interrupt. */ + T0IR = portTIMER_MATCH_ISR_BIT; + VICVectAddr = portCLEAR_VIC_INTERRUPT; + } + +#else + + /* This function is called from an asm wrapper, so does not require the __irq + keyword. */ + void vPortPreemptiveTick( void ); + void vPortPreemptiveTick( void ) + { + /* Increment the tick counter. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* The new tick value might unblock a task. Ensure the highest task that + is ready to execute is the task that will execute when the tick ISR + exits. */ + vTaskSwitchContext(); + } + + /* Ready for the next interrupt. */ + T0IR = portTIMER_MATCH_ISR_BIT; + VICVectAddr = portCLEAR_VIC_INTERRUPT; + } + +#endif + +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt( void ) +{ +uint32_t ulCompareMatch; + + /* A 1ms tick does not require the use of the timer prescale. This is + defaulted to zero but can be used if necessary. */ + T0PR = portPRESCALE_VALUE; + + /* Calculate the match value required for our wanted tick rate. */ + ulCompareMatch = configCPU_CLOCK_HZ / configTICK_RATE_HZ; + + /* Protect against divide by zero. Using an if() statement still results + in a warning - hence the #if. */ + #if portPRESCALE_VALUE != 0 + { + ulCompareMatch /= ( portPRESCALE_VALUE + 1 ); + } + #endif + + T0MR0 = ulCompareMatch; + + /* Generate tick with timer 0 compare match. */ + T0MCR = portRESET_COUNT_ON_MATCH | portINTERRUPT_ON_MATCH; + + /* Setup the VIC for the timer. */ + VICIntSelect &= ~( portTIMER_VIC_CHANNEL_BIT ); + VICIntEnable |= portTIMER_VIC_CHANNEL_BIT; + + /* The ISR installed depends on whether the preemptive or cooperative + scheduler is being used. */ + #if configUSE_PREEMPTION == 1 + { + extern void ( vPortPreemptiveTickEntry )( void ); + + VICVectAddr0 = ( uint32_t ) vPortPreemptiveTickEntry; + } + #else + { + extern void ( vNonPreemptiveTick )( void ); + + VICVectAddr0 = ( int32_t ) vPortNonPreemptiveTick; + } + #endif + + VICVectCntl0 = portTIMER_VIC_CHANNEL | portTIMER_VIC_ENABLE; + + /* Start the timer - interrupts are disabled when this function is called + so it is okay to do this here. */ + T0TCR = portENABLE_TIMER; +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + /* Disable interrupts first! */ + __disable_interrupt(); + + /* Now interrupts are disabled ulCriticalNesting can be accessed + directly. Increment ulCriticalNesting to keep a count of how many times + portENTER_CRITICAL() has been called. */ + ulCriticalNesting++; +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + if( ulCriticalNesting > portNO_CRITICAL_NESTING ) + { + /* Decrement the nesting count as we are leaving a critical section. */ + ulCriticalNesting--; + + /* If the nesting level has reached zero then interrupts should be + re-enabled. */ + if( ulCriticalNesting == portNO_CRITICAL_NESTING ) + { + __enable_interrupt(); + } + } +} +/*-----------------------------------------------------------*/ + + + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/LPC2000/portasm.s79 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/LPC2000/portasm.s79 new file mode 100644 index 0000000..43c41c8 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/LPC2000/portasm.s79 @@ -0,0 +1,102 @@ +;/* +; FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. +; All rights reserved +; +; +; *************************************************************************** +; * * +; * FreeRTOS tutorial books are available in pdf and paperback. * +; * Complete, revised, and edited pdf reference manuals are also * +; * available. * +; * * +; * Purchasing FreeRTOS documentation will not only help you, by * +; * ensuring you get running as quickly as possible and with an * +; * in-depth knowledge of how to use FreeRTOS, it will also help * +; * the FreeRTOS project to continue with its mission of providing * +; * professional grade, cross platform, de facto standard solutions * +; * for microcontrollers - completely free of charge! * +; * * +; * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * +; * * +; * Thank you for using FreeRTOS, and thank you for your support! * +; * * +; *************************************************************************** +; +; +; This file is part of the FreeRTOS distribution. +; +; FreeRTOS is free software; you can redistribute it and/or modify it under +; the terms of the GNU General Public License (version 2) as published by the +; Free Software Foundation AND MODIFIED BY the FreeRTOS exception. +; >>>NOTE<<< The modification to the GPL is included to allow you to +; distribute a combined work that includes FreeRTOS without being obliged to +; provide the source code for proprietary components outside of the FreeRTOS +; kernel. FreeRTOS is distributed in the hope that it will be useful, but +; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +; more details. You should have received a copy of the GNU General Public +; License and the FreeRTOS license exception along with FreeRTOS; if not it +; can be viewed here: http://www.freertos.org/a00114.html and also obtained +; by writing to Richard Barry, contact details for whom are available on the +; FreeRTOS WEB site. +; +; 1 tab == 4 spaces! +; +; http://www.FreeRTOS.org - Documentation, latest information, license and +; contact details. +; +; http://www.SafeRTOS.com - A version that is certified for use in safety +; critical systems. +; +; http://www.OpenRTOS.com - Commercial support, development, porting, +; licensing and training services. +;*/ + RSEG ICODE:CODE + CODE32 + + EXTERN vTaskSwitchContext + EXTERN vPortPreemptiveTick + + PUBLIC vPortPreemptiveTickEntry + PUBLIC vPortYieldProcessor + PUBLIC vPortStartFirstTask + +#include "FreeRTOSConfig.h" +#include "ISR_Support.h" + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Starting the first task is just a matter of restoring the context that +; was created by pxPortInitialiseStack(). +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +vPortStartFirstTask: + portRESTORE_CONTEXT + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Manual context switch function. This is the SWI hander. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +vPortYieldProcessor: + ADD LR, LR, #4 ; Add 4 to the LR to make the LR appear exactly + ; as if the context was saved during and IRQ + ; handler. + + portSAVE_CONTEXT ; Save the context of the current task... + LDR R0, =vTaskSwitchContext ; before selecting the next task to execute. + mov lr, pc + BX R0 + portRESTORE_CONTEXT ; Restore the context of the selected task. + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Preemptive context switch function. This will only ever get installed if +; portUSE_PREEMPTION is set to 1 in portmacro.h. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +vPortPreemptiveTickEntry: +#if configUSE_PREEMPTION == 1 + portSAVE_CONTEXT ; Save the context of the current task... + LDR R0, =vPortPreemptiveTick; before selecting the next task to execute. + mov lr, pc + BX R0 + portRESTORE_CONTEXT ; Restore the context of the selected task. +#endif + + END + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/LPC2000/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/LPC2000/portmacro.h new file mode 100644 index 0000000..64b1062 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/LPC2000/portmacro.h @@ -0,0 +1,155 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +#define portYIELD() asm ( "SWI 0" ) +#define portNOP() asm ( "NOP" ) +/*-----------------------------------------------------------*/ + +/* Critical section handling. */ +__arm __interwork void vPortDisableInterruptsFromThumb( void ); +__arm __interwork void vPortEnableInterruptsFromThumb( void ); +__arm __interwork void vPortEnterCritical( void ); +__arm __interwork void vPortExitCritical( void ); + +#define portDISABLE_INTERRUPTS() __disable_interrupt() +#define portENABLE_INTERRUPTS() __enable_interrupt() +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() +/*-----------------------------------------------------------*/ + +/* Task utilities. */ +#define portEND_SWITCHING_ISR( xSwitchRequired ) \ +{ \ +extern void vTaskSwitchContext( void ); \ + \ + if( xSwitchRequired ) \ + { \ + vTaskSwitchContext(); \ + } \ +} +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/MSP430/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/MSP430/port.c new file mode 100644 index 0000000..2b04e60 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/MSP430/port.c @@ -0,0 +1,215 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the MSP430 port. + *----------------------------------------------------------*/ + +/* Constants required for hardware setup. The tick ISR runs off the ACLK, +not the MCLK. */ +#define portACLK_FREQUENCY_HZ ( ( TickType_t ) 32768 ) +#define portINITIAL_CRITICAL_NESTING ( ( uint16_t ) 10 ) +#define portFLAGS_INT_ENABLED ( ( StackType_t ) 0x08 ) + +/* We require the address of the pxCurrentTCB variable, but don't want to know +any details of its type. */ +typedef void TCB_t; +extern volatile TCB_t * volatile pxCurrentTCB; + +/* Each task maintains a count of the critical section nesting depth. Each +time a critical section is entered the count is incremented. Each time a +critical section is exited the count is decremented - with interrupts only +being re-enabled if the count is zero. + +usCriticalNesting will get set to zero when the scheduler starts, but must +not be initialised to zero as this will cause problems during the startup +sequence. */ +volatile uint16_t usCriticalNesting = portINITIAL_CRITICAL_NESTING; +/*-----------------------------------------------------------*/ + + +/* + * Sets up the periodic ISR used for the RTOS tick. This uses timer 0, but + * could have alternatively used the watchdog timer or timer 1. + */ +void vPortSetupTimerInterrupt( void ); +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been called. + * + * See the header file portable.h. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* + Place a few bytes of known values on the bottom of the stack. + This is just useful for debugging and can be included if required. + + *pxTopOfStack = ( StackType_t ) 0x1111; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x2222; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x3333; + pxTopOfStack--; + */ + + /* The msp430 automatically pushes the PC then SR onto the stack before + executing an ISR. We want the stack to look just as if this has happened + so place a pointer to the start of the task on the stack first - followed + by the flags we want the task to use when it starts up. */ + *pxTopOfStack = ( StackType_t ) pxCode; + pxTopOfStack--; + *pxTopOfStack = portFLAGS_INT_ENABLED; + pxTopOfStack--; + + /* Next the general purpose registers. */ + *pxTopOfStack = ( StackType_t ) 0x4444; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x5555; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x6666; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x7777; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x8888; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x9999; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xaaaa; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xbbbb; + pxTopOfStack--; + + /* When the task starts is will expect to find the function parameter in + R15. */ + *pxTopOfStack = ( StackType_t ) pvParameters; + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) 0xdddd; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xeeee; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xffff; + pxTopOfStack--; + + /* A variable is used to keep track of the critical section nesting. + This variable has to be stored as part of the task context and is + initially set to zero. */ + *pxTopOfStack = ( StackType_t ) portNO_CRITICAL_SECTION_NESTING; + + /* Return a pointer to the top of the stack we have generated so this can + be stored in the task control block for the task. */ + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the MSP430 port will get stopped. If required simply + disable the tick interrupt here. */ +} +/*-----------------------------------------------------------*/ + +/* + * Hardware initialisation to generate the RTOS tick. This uses timer 0 + * but could alternatively use the watchdog timer or timer 1. + */ +void vPortSetupTimerInterrupt( void ) +{ + /* Ensure the timer is stopped. */ + TACTL = 0; + + /* Run the timer of the ACLK. */ + TACTL = TASSEL_1; + + /* Clear everything to start with. */ + TACTL |= TACLR; + + /* Set the compare match value according to the tick rate we want. */ + TACCR0 = portACLK_FREQUENCY_HZ / configTICK_RATE_HZ; + + /* Enable the interrupts. */ + TACCTL0 = CCIE; + + /* Start up clean. */ + TACTL |= TACLR; + + /* Up mode. */ + TACTL |= MC_1; +} +/*-----------------------------------------------------------*/ + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/MSP430/portasm.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/MSP430/portasm.h new file mode 100644 index 0000000..51e08ac --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/MSP430/portasm.h @@ -0,0 +1,126 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTASM_H +#define PORTASM_H + +portSAVE_CONTEXT macro + + IMPORT pxCurrentTCB + IMPORT usCriticalNesting + + /* Save the remaining registers. */ + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + mov.w &usCriticalNesting, r14 + push r14 + mov.w &pxCurrentTCB, r12 + mov.w r1, 0(r12) + endm +/*-----------------------------------------------------------*/ + +portRESTORE_CONTEXT macro + mov.w &pxCurrentTCB, r12 + mov.w @r12, r1 + pop r15 + mov.w r15, &usCriticalNesting + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + + /* The last thing on the stack will be the status register. + Ensure the power down bits are clear ready for the next + time this power down register is popped from the stack. */ + bic.w #0xf0,0(SP) + + reti + endm +/*-----------------------------------------------------------*/ + +#endif + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/MSP430/portext.s43 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/MSP430/portext.s43 new file mode 100644 index 0000000..f70128c --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/MSP430/portext.s43 @@ -0,0 +1,148 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ +#include "FreeRTOSConfig.h" +#include "portasm.h" + + IMPORT xTaskIncrementTick + IMPORT vTaskSwitchContext + IMPORT vPortSetupTimerInterrupt + + EXPORT vTickISR + EXPORT vPortYield + EXPORT xPortStartScheduler + + RSEG CODE + +/* + * The RTOS tick ISR. + * + * If the cooperative scheduler is in use this simply increments the tick + * count. + * + * If the preemptive scheduler is in use a context switch can also occur. + */ +vTickISR: + portSAVE_CONTEXT + + call #xTaskIncrementTick + cmp.w #0x0, R12 + jeq SkipContextSwitch + call #vTaskSwitchContext +SkipContextSwitch: + + portRESTORE_CONTEXT +/*-----------------------------------------------------------*/ + + +/* + * Manual context switch called by the portYIELD() macro. + */ +vPortYield: + + /* Mimic an interrupt by pushing the SR. */ + push SR + + /* Now the SR is stacked we can disable interrupts. */ + dint + + /* Save the context of the current task. */ + portSAVE_CONTEXT + + /* Switch to the highest priority task that is ready to run. */ + call #vTaskSwitchContext + + /* Restore the context of the new task. */ + portRESTORE_CONTEXT +/*-----------------------------------------------------------*/ + + +/* + * Start off the scheduler by initialising the RTOS tick timer, then restoring + * the context of the first task. + */ +xPortStartScheduler: + + /* Setup the hardware to generate the tick. Interrupts are disabled + when this function is called. */ + call #vPortSetupTimerInterrupt + + /* Restore the context of the first task that is going to run. */ + portRESTORE_CONTEXT +/*-----------------------------------------------------------*/ + + + /* Install vTickISR as the timer A0 interrupt. */ + ASEG + ORG 0xFFE0 + TIMERA0_VECTOR + + _vTickISR_: DC16 vTickISR + + + END + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/MSP430/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/MSP430/portmacro.h new file mode 100644 index 0000000..8a594f6 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/MSP430/portmacro.h @@ -0,0 +1,175 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT int +#define portSTACK_TYPE uint16_t +#define portBASE_TYPE short + +typedef portSTACK_TYPE StackType_t; +typedef short BaseType_t; +typedef unsigned short UBaseType_t; + + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif + +/*-----------------------------------------------------------*/ + +/* Interrupt control macros. */ +#define portDISABLE_INTERRUPTS() _DINT(); _NOP() +#define portENABLE_INTERRUPTS() _EINT(); _NOP() +/*-----------------------------------------------------------*/ + +/* Critical section control macros. */ +#define portNO_CRITICAL_SECTION_NESTING ( ( uint16_t ) 0 ) + +#define portENTER_CRITICAL() \ +{ \ +extern volatile uint16_t usCriticalNesting; \ + \ + portDISABLE_INTERRUPTS(); \ + \ + /* Now interrupts are disabled usCriticalNesting can be accessed */ \ + /* directly. Increment ulCriticalNesting to keep a count of how many */ \ + /* times portENTER_CRITICAL() has been called. */ \ + usCriticalNesting++; \ +} + +#define portEXIT_CRITICAL() \ +{ \ +extern volatile uint16_t usCriticalNesting; \ + \ + if( usCriticalNesting > portNO_CRITICAL_SECTION_NESTING ) \ + { \ + /* Decrement the nesting count as we are leaving a critical section. */ \ + usCriticalNesting--; \ + \ + /* If the nesting level has reached zero then interrupts should be */ \ + /* re-enabled. */ \ + if( usCriticalNesting == portNO_CRITICAL_SECTION_NESTING ) \ + { \ + portENABLE_INTERRUPTS(); \ + } \ + } \ +} +/*-----------------------------------------------------------*/ + +/* Task utilities. */ + +/* + * Manual context switch called by portYIELD or taskYIELD. + */ +extern void vPortYield( void ); +#define portYIELD() vPortYield() +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 2 +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portNOP() +#define portPOINTER_SIZE_TYPE uint16_t +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#if configINTERRUPT_EXAMPLE_METHOD == 2 + +extern void vTaskSwitchContext( void ); +#define portYIELD_FROM_ISR( x ) if( x ) vTaskSwitchContext() + +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/MSP430X/data_model.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/MSP430X/data_model.h new file mode 100644 index 0000000..334f866 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/MSP430X/data_model.h @@ -0,0 +1,105 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef DATA_MODEL_H +#define DATA_MODEL_H + +#if __DATA_MODEL__ == __DATA_MODEL_SMALL__ + #define pushm_x pushm.w + #define popm_x popm.w + #define push_x push.w + #define pop_x pop.w + #define mov_x mov.w + #define cmp_x cmp.w +#endif + +#if __DATA_MODEL__ == __DATA_MODEL_MEDIUM__ + #define pushm_x pushm.a + #define popm_x popm.a + #define push_x pushx.a + #define pop_x popx.a + #define mov_x mov.w + #define cmp_x cmp.w +#endif + +#if __DATA_MODEL__ == __DATA_MODEL_LARGE__ + #define pushm_x pushm.a + #define popm_x popm.a + #define push_x pushx.a + #define pop_x popx.a + #define mov_x movx.a + #define cmp_x cmpx.a +#endif + +#ifndef pushm_x + #error The assembler options must define one of the following symbols: __DATA_MODEL_SMALL__, __DATA_MODEL_MEDIUM__, or __DATA_MODEL_LARGE__ +#endif + +#endif /* DATA_MODEL_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/MSP430X/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/MSP430X/port.c new file mode 100644 index 0000000..f699e3a --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/MSP430X/port.c @@ -0,0 +1,224 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the MSP430X port. + *----------------------------------------------------------*/ + +/* Constants required for hardware setup. The tick ISR runs off the ACLK, +not the MCLK. */ +#define portACLK_FREQUENCY_HZ ( ( TickType_t ) 32768 ) +#define portINITIAL_CRITICAL_NESTING ( ( uint16_t ) 10 ) +#define portFLAGS_INT_ENABLED ( ( StackType_t ) 0x08 ) + +/* We require the address of the pxCurrentTCB variable, but don't want to know +any details of its type. */ +typedef void TCB_t; +extern volatile TCB_t * volatile pxCurrentTCB; + +/* Each task maintains a count of the critical section nesting depth. Each +time a critical section is entered the count is incremented. Each time a +critical section is exited the count is decremented - with interrupts only +being re-enabled if the count is zero. + +usCriticalNesting will get set to zero when the scheduler starts, but must +not be initialised to zero as this will cause problems during the startup +sequence. */ +volatile uint16_t usCriticalNesting = portINITIAL_CRITICAL_NESTING; +/*-----------------------------------------------------------*/ + + +/* + * Sets up the periodic ISR used for the RTOS tick. This uses timer 0, but + * could have alternatively used the watchdog timer or timer 1. + */ +void vPortSetupTimerInterrupt( void ); +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been called. + * + * See the header file portable.h. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +uint16_t *pusTopOfStack; +uint32_t *pulTopOfStack; + + /* + Place a few bytes of known values on the bottom of the stack. + This is just useful for debugging and can be included if required. + + *pxTopOfStack = ( StackType_t ) 0x1111; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x2222; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x3333; + */ + + /* StackType_t is either 16 bits or 32 bits depending on the data model. + Some stacked items do not change size depending on the data model so have + to be explicitly cast to the correct size so this function will work + whichever data model is being used. */ + if( sizeof( StackType_t ) == sizeof( uint16_t ) ) + { + /* Make room for a 20 bit value stored as a 32 bit value. */ + pusTopOfStack = ( uint16_t * ) pxTopOfStack; + pusTopOfStack--; + pulTopOfStack = ( uint32_t * ) pusTopOfStack; + } + else + { + pulTopOfStack = ( uint32_t * ) pxTopOfStack; + } + *pulTopOfStack = ( uint32_t ) pxCode; + + pusTopOfStack = ( uint16_t * ) pulTopOfStack; + pusTopOfStack--; + *pusTopOfStack = portFLAGS_INT_ENABLED; + pusTopOfStack -= ( sizeof( StackType_t ) / 2 ); + + /* From here on the size of stacked items depends on the memory model. */ + pxTopOfStack = ( StackType_t * ) pusTopOfStack; + + /* Next the general purpose registers. */ + #ifdef PRELOAD_REGISTER_VALUES + *pxTopOfStack = ( StackType_t ) 0xffff; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xeeee; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xdddd; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xbbbb; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xaaaa; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x9999; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x8888; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x5555; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x6666; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x5555; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x4444; + pxTopOfStack--; + #else + pxTopOfStack -= 3; + *pxTopOfStack = ( StackType_t ) pvParameters; + pxTopOfStack -= 9; + #endif + + + /* A variable is used to keep track of the critical section nesting. + This variable has to be stored as part of the task context and is + initially set to zero. */ + *pxTopOfStack = ( StackType_t ) portNO_CRITICAL_SECTION_NESTING; + + /* Return a pointer to the top of the stack we have generated so this can + be stored in the task control block for the task. */ + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the MSP430 port will get stopped. If required simply + disable the tick interrupt here. */ +} +/*-----------------------------------------------------------*/ + +/* + * Hardware initialisation to generate the RTOS tick. + */ +void vPortSetupTimerInterrupt( void ) +{ + vApplicationSetupTimerInterrupt(); +} +/*-----------------------------------------------------------*/ + +#pragma vector=configTICK_VECTOR +__interrupt __raw void vTickISREntry( void ) +{ +extern void vPortTickISR( void ); + + __bic_SR_register_on_exit( SCG1 + SCG0 + OSCOFF + CPUOFF ); + vPortTickISR(); +} + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/MSP430X/portext.s43 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/MSP430X/portext.s43 new file mode 100644 index 0000000..6335325 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/MSP430X/portext.s43 @@ -0,0 +1,180 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ +#include "msp430.h" +#include "FreeRTOSConfig.h" +#include "data_model.h" + + IMPORT xTaskIncrementTick + IMPORT vTaskSwitchContext + IMPORT vPortSetupTimerInterrupt + IMPORT pxCurrentTCB + IMPORT usCriticalNesting + + EXPORT vPortTickISR + EXPORT vPortYield + EXPORT xPortStartScheduler + +portSAVE_CONTEXT macro + + /* Save the remaining registers. */ + pushm_x #12, r15 + mov.w &usCriticalNesting, r14 + push_x r14 + mov_x &pxCurrentTCB, r12 + mov_x sp, 0( r12 ) + endm +/*-----------------------------------------------------------*/ + +portRESTORE_CONTEXT macro + + mov_x &pxCurrentTCB, r12 + mov_x @r12, sp + pop_x r15 + mov.w r15, &usCriticalNesting + popm_x #12, r15 + nop + pop.w sr + nop + reta + endm +/*-----------------------------------------------------------*/ + + +/* + * The RTOS tick ISR. + * + * If the cooperative scheduler is in use this simply increments the tick + * count. + * + * If the preemptive scheduler is in use a context switch can also occur. + */ + + RSEG CODE + EVEN + +vPortTickISR: + + /* The sr is not saved in portSAVE_CONTEXT() because vPortYield() needs + to save it manually before it gets modified (interrupts get disabled). + Entering through this interrupt means the SR is already on the stack, but + this keeps the stack frames identical. */ + push.w sr + portSAVE_CONTEXT + + calla #xTaskIncrementTick + cmp.w #0x0, R12 + jeq SkipContextSwitch + calla #vTaskSwitchContext +SkipContextSwitch: + portRESTORE_CONTEXT +/*-----------------------------------------------------------*/ + +/* + * Manual context switch called by the portYIELD() macro. + */ + EVEN + +vPortYield: + + /* The sr needs saving before it is modified. */ + push.w sr + + /* Now the SR is stacked interrupts can be disabled. */ + dint + nop + + /* Save the context of the current task. */ + portSAVE_CONTEXT + + /* Select the next task to run. */ + calla #vTaskSwitchContext + + /* Restore the context of the new task. */ + portRESTORE_CONTEXT +/*-----------------------------------------------------------*/ + + +/* + * Start off the scheduler by initialising the RTOS tick timer, then restoring + * the context of the first task. + */ + EVEN + +xPortStartScheduler: + + /* Setup the hardware to generate the tick. Interrupts are disabled + when this function is called. */ + calla #vPortSetupTimerInterrupt + + /* Restore the context of the first task that is going to run. */ + portRESTORE_CONTEXT +/*-----------------------------------------------------------*/ + + END + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/MSP430X/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/MSP430X/portmacro.h new file mode 100644 index 0000000..8754b4a --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/MSP430X/portmacro.h @@ -0,0 +1,184 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Hardware includes. */ +#include "msp430.h" + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT int +#define portBASE_TYPE short + +/* The stack type changes depending on the data model. */ +#if( __DATA_MODEL__ == __DATA_MODEL_SMALL__ ) + #define portSTACK_TYPE uint16_t + #define portPOINTER_SIZE_TYPE uint16_t +#else + #define portSTACK_TYPE uint32_t +#endif + +typedef portSTACK_TYPE StackType_t; +typedef short BaseType_t; +typedef unsigned short UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif + +/*-----------------------------------------------------------*/ + +/* Interrupt control macros. */ +#define portDISABLE_INTERRUPTS() _DINT(); _NOP() +#define portENABLE_INTERRUPTS() _EINT(); _NOP() +/*-----------------------------------------------------------*/ + +/* Critical section control macros. */ +#define portNO_CRITICAL_SECTION_NESTING ( ( uint16_t ) 0 ) + +#define portENTER_CRITICAL() \ +{ \ +extern volatile uint16_t usCriticalNesting; \ + \ + portDISABLE_INTERRUPTS(); \ + \ + /* Now interrupts are disabled usCriticalNesting can be accessed */ \ + /* directly. Increment ulCriticalNesting to keep a count of how many */ \ + /* times portENTER_CRITICAL() has been called. */ \ + usCriticalNesting++; \ +} + +#define portEXIT_CRITICAL() \ +{ \ +extern volatile uint16_t usCriticalNesting; \ + \ + if( usCriticalNesting > portNO_CRITICAL_SECTION_NESTING ) \ + { \ + /* Decrement the nesting count as we are leaving a critical section. */ \ + usCriticalNesting--; \ + \ + /* If the nesting level has reached zero then interrupts should be */ \ + /* re-enabled. */ \ + if( usCriticalNesting == portNO_CRITICAL_SECTION_NESTING ) \ + { \ + portENABLE_INTERRUPTS(); \ + } \ + } \ +} +/*-----------------------------------------------------------*/ + +/* Task utilities. */ + +/* + * Manual context switch called by portYIELD or taskYIELD. + */ +extern void vPortYield( void ); +#define portYIELD() vPortYield() +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 2 +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portNOP() __no_operation() +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#define portYIELD_FROM_ISR( x ) if( x ) vPortYield() + +void vApplicationSetupTimerInterrupt( void ); + +/* sizeof( int ) != sizeof( long ) so a full printf() library is required if +run time stats information is to be displayed. */ +#define portLU_PRINTF_SPECIFIER_REQUIRED + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/RL78/ISR_Support.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/RL78/ISR_Support.h new file mode 100644 index 0000000..45b970f --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/RL78/ISR_Support.h @@ -0,0 +1,110 @@ +;/* +; FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. +; All rights reserved +; +; +; *************************************************************************** +; * * +; * FreeRTOS tutorial books are available in pdf and paperback. * +; * Complete, revised, and edited pdf reference manuals are also * +; * available. * +; * * +; * Purchasing FreeRTOS documentation will not only help you, by * +; * ensuring you get running as quickly as possible and with an * +; * in-depth knowledge of how to use FreeRTOS, it will also help * +; * the FreeRTOS project to continue with its mission of providing * +; * professional grade, cross platform, de facto standard solutions * +; * for microcontrollers - completely free of charge! * +; * * +; * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * +; * * +; * Thank you for using FreeRTOS, and thank you for your support! * +; * * +; *************************************************************************** +; +; +; This file is part of the FreeRTOS distribution. +; +; FreeRTOS is free software; you can redistribute it and/or modify it under +; the terms of the GNU General Public License (version 2) as published by the +; Free Software Foundation AND MODIFIED BY the FreeRTOS exception. +; >>>NOTE<<< The modification to the GPL is included to allow you to +; distribute a combined work that includes FreeRTOS without being obliged to +; provide the source code for proprietary components outside of the FreeRTOS +; kernel. FreeRTOS is distributed in the hope that it will be useful, but +; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +; more details. You should have received a copy of the GNU General Public +; License and the FreeRTOS license exception along with FreeRTOS; if not it +; can be viewed here: http://www.freertos.org/a00114.html and also obtained +; by writing to Richard Barry, contact details for whom are available on the +; FreeRTOS WEB site. +; +; 1 tab == 4 spaces! +; +; http://www.FreeRTOS.org - Documentation, latest information, license and +; contact details. +; +; http://www.SafeRTOS.com - A version that is certified for use in safety +; critical systems. +; +; http://www.OpenRTOS.com - Commercial support, development, porting, +; licensing and training services. +;*/ + + +#include "FreeRTOSConfig.h" + +; Variables used by scheduler +;------------------------------------------------------------------------------ + EXTERN pxCurrentTCB + EXTERN usCriticalNesting + +;------------------------------------------------------------------------------ +; portSAVE_CONTEXT MACRO +; Saves the context of the general purpose registers, CS and ES (only in far +; memory mode) registers the usCriticalNesting Value and the Stack Pointer +; of the active Task onto the task stack +;------------------------------------------------------------------------------ +portSAVE_CONTEXT MACRO + + PUSH AX ; Save AX Register to stack. + PUSH HL + MOV A, CS ; Save CS register. + XCH A, X + MOV A, ES ; Save ES register. + PUSH AX + PUSH DE ; Save the remaining general purpose registers. + PUSH BC + MOVW AX, usCriticalNesting ; Save the usCriticalNesting value. + PUSH AX + MOVW AX, pxCurrentTCB ; Save the Stack pointer. + MOVW HL, AX + MOVW AX, SP + MOVW [HL], AX + ENDM +;------------------------------------------------------------------------------ + +;------------------------------------------------------------------------------ +; portRESTORE_CONTEXT MACRO +; Restores the task Stack Pointer then use this to restore usCriticalNesting, +; general purpose registers and the CS and ES (only in far memory mode) +; of the selected task from the task stack +;------------------------------------------------------------------------------ +portRESTORE_CONTEXT MACRO + MOVW AX, pxCurrentTCB ; Restore the Stack pointer. + MOVW HL, AX + MOVW AX, [HL] + MOVW SP, AX + POP AX ; Restore usCriticalNesting value. + MOVW usCriticalNesting, AX + POP BC ; Restore the necessary general purpose registers. + POP DE + POP AX ; Restore the ES register. + MOV ES, A + XCH A, X ; Restore the CS register. + MOV CS, A + POP HL ; Restore general purpose register HL. + POP AX ; Restore AX. + ENDM +;------------------------------------------------------------------------------ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/RL78/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/RL78/port.c new file mode 100644 index 0000000..b8248e8 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/RL78/port.c @@ -0,0 +1,322 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* The critical nesting value is initialised to a non zero value to ensure +interrupts don't accidentally become enabled before the scheduler is started. */ +#define portINITIAL_CRITICAL_NESTING ( ( uint16_t ) 10 ) + +/* Initial PSW value allocated to a newly created task. + * 1100011000000000 + * ||||||||-------------- Fill byte + * |||||||--------------- Carry Flag cleared + * |||||----------------- In-service priority Flags set to low level + * ||||------------------ Register bank Select 0 Flag cleared + * |||------------------- Auxiliary Carry Flag cleared + * ||-------------------- Register bank Select 1 Flag cleared + * |--------------------- Zero Flag set + * ---------------------- Global Interrupt Flag set (enabled) + */ +#define portPSW ( 0xc6UL ) + +/* The address of the pxCurrentTCB variable, but don't know or need to know its +type. */ +typedef void TCB_t; +extern volatile TCB_t * volatile pxCurrentTCB; + +/* Each task maintains a count of the critical section nesting depth. Each time +a critical section is entered the count is incremented. Each time a critical +section is exited the count is decremented - with interrupts only being +re-enabled if the count is zero. + +usCriticalNesting will get set to zero when the scheduler starts, but must +not be initialised to zero as that could cause problems during the startup +sequence. */ +volatile uint16_t usCriticalNesting = portINITIAL_CRITICAL_NESTING; + +/*-----------------------------------------------------------*/ + +/* + * Sets up the periodic ISR used for the RTOS tick using the interval timer. + * The application writer can define configSETUP_TICK_INTERRUPT() (in + * FreeRTOSConfig.h) such that their own tick interrupt configuration is used + * in place of prvSetupTimerInterrupt(). + */ +static void prvSetupTimerInterrupt( void ); +#ifndef configSETUP_TICK_INTERRUPT + /* The user has not provided their own tick interrupt configuration so use + the definition in this file (which uses the interval timer). */ + #define configSETUP_TICK_INTERRUPT() prvSetupTimerInterrupt() +#endif /* configSETUP_TICK_INTERRUPT */ + +/* + * Defined in portasm.s87, this function starts the scheduler by loading the + * context of the first task to run. + */ +extern void vPortStartFirstTask( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been called. + * + * See the header file portable.h. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +uint32_t *pulLocal; + + /* With large code and large data sizeof( StackType_t ) == 2, and + sizeof( StackType_t * ) == 4. With small code and small data + sizeof( StackType_t ) == 2 and sizeof( StackType_t * ) == 2. */ + + #if __DATA_MODEL__ == __DATA_MODEL_FAR__ + { + /* Parameters are passed in on the stack, and written using a 32-bit value + hence a space is left for the second two bytes. */ + pxTopOfStack--; + + /* Write in the parameter value. */ + pulLocal = ( uint32_t * ) pxTopOfStack; + *pulLocal = ( uint32_t ) pvParameters; + pxTopOfStack--; + + /* The return address, leaving space for the first two bytes of the + 32-bit value. See the comments above the prvTaskExitError() prototype + at the top of this file. */ + pxTopOfStack--; + pulLocal = ( uint32_t * ) pxTopOfStack; + *pulLocal = ( uint32_t ) prvTaskExitError; + pxTopOfStack--; + + /* The start address / PSW value is also written in as a 32-bit value, + so leave a space for the second two bytes. */ + pxTopOfStack--; + + /* Task function start address combined with the PSW. */ + pulLocal = ( uint32_t * ) pxTopOfStack; + *pulLocal = ( ( ( uint32_t ) pxCode ) | ( portPSW << 24UL ) ); + pxTopOfStack--; + + /* An initial value for the AX register. */ + *pxTopOfStack = ( StackType_t ) 0x1111; + pxTopOfStack--; + } + #else + { + /* The return address, leaving space for the first two bytes of the + 32-bit value. See the comments above the prvTaskExitError() prototype + at the top of this file. */ + pxTopOfStack--; + pulLocal = ( uint32_t * ) pxTopOfStack; + *pulLocal = ( uint32_t ) prvTaskExitError; + pxTopOfStack--; + + /* Task function. Again as it is written as a 32-bit value a space is + left on the stack for the second two bytes. */ + pxTopOfStack--; + + /* Task function start address combined with the PSW. */ + pulLocal = ( uint32_t * ) pxTopOfStack; + *pulLocal = ( ( ( uint32_t ) pxCode ) | ( portPSW << 24UL ) ); + pxTopOfStack--; + + /* The parameter is passed in AX. */ + *pxTopOfStack = ( StackType_t ) pvParameters; + pxTopOfStack--; + } + #endif + + /* An initial value for the HL register. */ + *pxTopOfStack = ( StackType_t ) 0x2222; + pxTopOfStack--; + + /* CS and ES registers. */ + *pxTopOfStack = ( StackType_t ) 0x0F00; + pxTopOfStack--; + + /* The remaining general purpose registers DE and BC */ + *pxTopOfStack = ( StackType_t ) 0xDEDE; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xBCBC; + pxTopOfStack--; + + /* Finally the critical section nesting count is set to zero when the task + first starts. */ + *pxTopOfStack = ( StackType_t ) portNO_CRITICAL_SECTION_NESTING; + + /* Return a pointer to the top of the stack that has been generated so it + can be stored in the task control block for the task. */ + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT( usCriticalNesting == ~0U ); + portDISABLE_INTERRUPTS(); + for( ;; ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* Setup the hardware to generate the tick. Interrupts are disabled when + this function is called. */ + configSETUP_TICK_INTERRUPT(); + + /* Restore the context of the first task that is going to run. */ + vPortStartFirstTask(); + + /* Execution should not reach here as the tasks are now running! + prvSetupTimerInterrupt() is called here to prevent the compiler outputting + a warning about a statically declared function not being referenced in the + case that the application writer has provided their own tick interrupt + configuration routine (and defined configSETUP_TICK_INTERRUPT() such that + their own routine will be called in place of prvSetupTimerInterrupt()). */ + prvSetupTimerInterrupt(); + return pdTRUE; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the RL78 port will get stopped. */ +} +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt( void ) +{ +const uint16_t usClockHz = 15000UL; /* Internal clock. */ +const uint16_t usCompareMatch = ( usClockHz / configTICK_RATE_HZ ) + 1UL; + + /* Use the internal 15K clock. */ + OSMC = ( uint8_t ) 0x16; + + #ifdef RTCEN + { + /* Supply the interval timer clock. */ + RTCEN = ( uint8_t ) 1U; + + /* Disable INTIT interrupt. */ + ITMK = ( uint8_t ) 1; + + /* Disable ITMC operation. */ + ITMC = ( uint8_t ) 0x0000; + + /* Clear INIT interrupt. */ + ITIF = ( uint8_t ) 0; + + /* Set interval and enable interrupt operation. */ + ITMC = usCompareMatch | 0x8000U; + + /* Enable INTIT interrupt. */ + ITMK = ( uint8_t ) 0; + } + #endif + + #ifdef TMKAEN + { + /* Supply the interval timer clock. */ + TMKAEN = ( uint8_t ) 1U; + + /* Disable INTIT interrupt. */ + TMKAMK = ( uint8_t ) 1; + + /* Disable ITMC operation. */ + ITMC = ( uint8_t ) 0x0000; + + /* Clear INIT interrupt. */ + TMKAIF = ( uint8_t ) 0; + + /* Set interval and enable interrupt operation. */ + ITMC = usCompareMatch | 0x8000U; + + /* Enable INTIT interrupt. */ + TMKAMK = ( uint8_t ) 0; + } + #endif +} +/*-----------------------------------------------------------*/ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/RL78/portasm.s87 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/RL78/portasm.s87 new file mode 100644 index 0000000..a83c38e --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/RL78/portasm.s87 @@ -0,0 +1,110 @@ +;/* +; FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. +; All rights reserved +; +; +; *************************************************************************** +; * * +; * FreeRTOS tutorial books are available in pdf and paperback. * +; * Complete, revised, and edited pdf reference manuals are also * +; * available. * +; * * +; * Purchasing FreeRTOS documentation will not only help you, by * +; * ensuring you get running as quickly as possible and with an * +; * in-depth knowledge of how to use FreeRTOS, it will also help * +; * the FreeRTOS project to continue with its mission of providing * +; * professional grade, cross platform, de facto standard solutions * +; * for microcontrollers - completely free of charge! * +; * * +; * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * +; * * +; * Thank you for using FreeRTOS, and thank you for your support! * +; * * +; *************************************************************************** +; +; +; This file is part of the FreeRTOS distribution. +; +; FreeRTOS is free software; you can redistribute it and/or modify it under +; the terms of the GNU General Public License (version 2) as published by the +; Free Software Foundation AND MODIFIED BY the FreeRTOS exception. +; >>>NOTE<<< The modification to the GPL is included to allow you to +; distribute a combined work that includes FreeRTOS without being obliged to +; provide the source code for proprietary components outside of the FreeRTOS +; kernel. FreeRTOS is distributed in the hope that it will be useful, but +; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +; more details. You should have received a copy of the GNU General Public +; License and the FreeRTOS license exception along with FreeRTOS; if not it +; can be viewed here: http://www.freertos.org/a00114.html and also obtained +; by writing to Richard Barry, contact details for whom are available on the +; FreeRTOS WEB site. +; +; 1 tab == 4 spaces! +; +; http://www.FreeRTOS.org - Documentation, latest information, license and +; contact details. +; +; http://www.SafeRTOS.com - A version that is certified for use in safety +; critical systems. +; +; http://www.OpenRTOS.com - Commercial support, development, porting, +; licensing and training services. +;*/ + +#include "ISR_Support.h" + +#define CS 0xFFFFC +#define ES 0xFFFFD + + PUBLIC vPortYield + PUBLIC vPortStartFirstTask + PUBLIC vPortTickISR + + EXTERN vTaskSwitchContext + EXTERN xTaskIncrementTick + +; FreeRTOS yield handler. This is installed as the BRK software interrupt +; handler. + RSEG CODE:CODE +vPortYield: + portSAVE_CONTEXT ; Save the context of the current task. + call vTaskSwitchContext ; Call the scheduler to select the next task. + portRESTORE_CONTEXT ; Restore the context of the next task to run. + retb + + +; Starts the scheduler by restoring the context of the task that will execute +; first. + RSEG CODE:CODE +vPortStartFirstTask: + portRESTORE_CONTEXT ; Restore the context of whichever task the ... + reti ; An interrupt stack frame is used so the task + ; is started using a RETI instruction. + +; FreeRTOS tick handler. This is installed as the interval timer interrupt +; handler. + RSEG CODE:CODE +vPortTickISR: + + portSAVE_CONTEXT ; Save the context of the current task. + call xTaskIncrementTick ; Call the timer tick function. + cmpw ax, #0x00 + skz + call vTaskSwitchContext ; Call the scheduler to select the next task. + portRESTORE_CONTEXT ; Restore the context of the next task to run. + reti + + +; Install the interrupt handlers + + COMMON INTVEC:CODE:ROOT(1) + ORG configTICK_VECTOR + DW vPortTickISR + + COMMON INTVEC:CODE:ROOT(1) + ORG 126 + DW vPortYield + + + END \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/RL78/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/RL78/portmacro.h new file mode 100644 index 0000000..2da00d6 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/RL78/portmacro.h @@ -0,0 +1,186 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +#if __DATA_MODEL__ == __DATA_MODEL_FAR__ && __CODE_MODEL__ == __CODE_MODEL_NEAR__ + #warning This port has not been tested with your selected memory model combination. If a far data model is required it is recommended to also use a far code model. +#endif + +#if __DATA_MODEL__ == __DATA_MODEL_NEAR__ && __CODE_MODEL__ == __CODE_MODEL_FAR__ + #warning This port has not been tested with your selected memory model combination. If a far code model is required it is recommended to also use a far data model. +#endif + +/* Type definitions. */ + +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint16_t +#define portBASE_TYPE short + +typedef portSTACK_TYPE StackType_t; +typedef short BaseType_t; +typedef unsigned short UBaseType_t; + + +#if __DATA_MODEL__ == __DATA_MODEL_FAR__ + #define portPOINTER_SIZE_TYPE uint32_t +#else + #define portPOINTER_SIZE_TYPE uint16_t +#endif + + +#if ( configUSE_16_BIT_TICKS == 1 ) + typedef unsigned int TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Interrupt control macros. */ +#define portDISABLE_INTERRUPTS() __asm ( "DI" ) +#define portENABLE_INTERRUPTS() __asm ( "EI" ) +/*-----------------------------------------------------------*/ + +/* Critical section control macros. */ +#define portNO_CRITICAL_SECTION_NESTING ( ( uint16_t ) 0 ) + +#define portENTER_CRITICAL() \ +{ \ +extern volatile uint16_t usCriticalNesting; \ + \ + portDISABLE_INTERRUPTS(); \ + \ + /* Now interrupts are disabled ulCriticalNesting can be accessed */ \ + /* directly. Increment ulCriticalNesting to keep a count of how many */ \ + /* times portENTER_CRITICAL() has been called. */ \ + usCriticalNesting++; \ +} + +#define portEXIT_CRITICAL() \ +{ \ +extern volatile uint16_t usCriticalNesting; \ + \ + if( usCriticalNesting > portNO_CRITICAL_SECTION_NESTING ) \ + { \ + /* Decrement the nesting count as we are leaving a critical section. */ \ + usCriticalNesting--; \ + \ + /* If the nesting level has reached zero then interrupts should be */ \ + /* re-enabled. */ \ + if( usCriticalNesting == portNO_CRITICAL_SECTION_NESTING ) \ + { \ + portENABLE_INTERRUPTS(); \ + } \ + } \ +} +/*-----------------------------------------------------------*/ + +/* Task utilities. */ +#define portYIELD() __asm( "BRK" ) +#define portYIELD_FROM_ISR( xHigherPriorityTaskWoken ) if( xHigherPriorityTaskWoken ) vTaskSwitchContext() +#define portNOP() __asm( "NOP" ) +/*-----------------------------------------------------------*/ + +/* Hardwware specifics. */ +#define portBYTE_ALIGNMENT 2 +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/RX100/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/RX100/port.c new file mode 100644 index 0000000..ba52db2 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/RX100/port.c @@ -0,0 +1,558 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the SH2A port. + *----------------------------------------------------------*/ + +/* Standard C includes. */ +#include "limits.h" + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Library includes. */ +#include "string.h" + +/* Hardware specifics. */ +#include "machine.h" + +/*-----------------------------------------------------------*/ + +/* Tasks should start with interrupts enabled and in Supervisor mode, therefore +PSW is set with U and I set, and PM and IPL clear. */ +#define portINITIAL_PSW ( ( StackType_t ) 0x00030000 ) + +/* The peripheral clock is divided by this value before being supplying the +CMT. */ +#if ( configUSE_TICKLESS_IDLE == 0 ) + /* If tickless idle is not used then the divisor can be fixed. */ + #define portCLOCK_DIVISOR 8UL +#elif ( configPERIPHERAL_CLOCK_HZ >= 12000000 ) + #define portCLOCK_DIVISOR 512UL +#elif ( configPERIPHERAL_CLOCK_HZ >= 6000000 ) + #define portCLOCK_DIVISOR 128UL +#elif ( configPERIPHERAL_CLOCK_HZ >= 1000000 ) + #define portCLOCK_DIVISOR 32UL +#else + #define portCLOCK_DIVISOR 8UL +#endif + + +/* Keys required to lock and unlock access to certain system registers +respectively. */ +#define portUNLOCK_KEY 0xA50B +#define portLOCK_KEY 0xA500 + +/*-----------------------------------------------------------*/ + +/* + * Function to start the first task executing - written in asm code as direct + * access to registers is required. + */ +extern void prvStartFirstTask( void ); + +/* + * The tick ISR handler. The peripheral used is configured by the application + * via a hook/callback function. + */ +__interrupt static void prvTickISR( void ); + +/* + * Sets up the periodic ISR used for the RTOS tick using the CMT. + * The application writer can define configSETUP_TICK_INTERRUPT() (in + * FreeRTOSConfig.h) such that their own tick interrupt configuration is used + * in place of prvSetupTimerInterrupt(). + */ +static void prvSetupTimerInterrupt( void ); +#ifndef configSETUP_TICK_INTERRUPT + /* The user has not provided their own tick interrupt configuration so use + the definition in this file (which uses the interval timer). */ + #define configSETUP_TICK_INTERRUPT() prvSetupTimerInterrupt() +#endif /* configSETUP_TICK_INTERRUPT */ + +/* + * Called after the sleep mode registers have been configured, prvSleep() + * executes the pre and post sleep macros, and actually calls the wait + * instruction. + */ +#if configUSE_TICKLESS_IDLE == 1 + static void prvSleep( TickType_t xExpectedIdleTime ); +#endif /* configUSE_TICKLESS_IDLE */ + +/*-----------------------------------------------------------*/ + +extern void *pxCurrentTCB; + +/*-----------------------------------------------------------*/ + +/* Calculate how many clock increments make up a single tick period. */ +static const uint32_t ulMatchValueForOneTick = ( ( configPERIPHERAL_CLOCK_HZ / portCLOCK_DIVISOR ) / configTICK_RATE_HZ ); + +#if configUSE_TICKLESS_IDLE == 1 + + /* Holds the maximum number of ticks that can be suppressed - which is + basically how far into the future an interrupt can be generated. Set + during initialisation. This is the maximum possible value that the + compare match register can hold divided by ulMatchValueForOneTick. */ + static const TickType_t xMaximumPossibleSuppressedTicks = USHRT_MAX / ( ( configPERIPHERAL_CLOCK_HZ / portCLOCK_DIVISOR ) / configTICK_RATE_HZ ); + + /* Flag set from the tick interrupt to allow the sleep processing to know if + sleep mode was exited because of a tick interrupt, or an interrupt + generated by something else. */ + static volatile uint32_t ulTickFlag = pdFALSE; + + /* The CMT counter is stopped temporarily each time it is re-programmed. + The following constant offsets the CMT counter match value by the number of + CMT counts that would typically be missed while the counter was stopped to + compensate for the lost time. The large difference between the divided CMT + clock and the CPU clock means it is likely ulStoppedTimerCompensation will + equal zero - and be optimised away. */ + static const uint32_t ulStoppedTimerCompensation = 100UL / ( configCPU_CLOCK_HZ / ( configPERIPHERAL_CLOCK_HZ / portCLOCK_DIVISOR ) ); + +#endif + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Offset to end up on 8 byte boundary. */ + pxTopOfStack--; + + /* R0 is not included as it is the stack pointer. */ + *pxTopOfStack = 0x00; + pxTopOfStack--; + *pxTopOfStack = 0x00; + pxTopOfStack--; + *pxTopOfStack = portINITIAL_PSW; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; + + /* When debugging it can be useful if every register is set to a known + value. Otherwise code space can be saved by just setting the registers + that need to be set. */ + #ifdef USE_FULL_REGISTER_INITIALISATION + { + pxTopOfStack--; + *pxTopOfStack = 0x12345678; /* r15. */ + pxTopOfStack--; + *pxTopOfStack = 0xaaaabbbb; + pxTopOfStack--; + *pxTopOfStack = 0xdddddddd; + pxTopOfStack--; + *pxTopOfStack = 0xcccccccc; + pxTopOfStack--; + *pxTopOfStack = 0xbbbbbbbb; + pxTopOfStack--; + *pxTopOfStack = 0xaaaaaaaa; + pxTopOfStack--; + *pxTopOfStack = 0x99999999; + pxTopOfStack--; + *pxTopOfStack = 0x88888888; + pxTopOfStack--; + *pxTopOfStack = 0x77777777; + pxTopOfStack--; + *pxTopOfStack = 0x66666666; + pxTopOfStack--; + *pxTopOfStack = 0x55555555; + pxTopOfStack--; + *pxTopOfStack = 0x44444444; + pxTopOfStack--; + *pxTopOfStack = 0x33333333; + pxTopOfStack--; + *pxTopOfStack = 0x22222222; + pxTopOfStack--; + } + #else + { + /* Leave space for the registers that will get popped from the stack + when the task first starts executing. */ + pxTopOfStack -= 15; + } + #endif + + *pxTopOfStack = ( StackType_t ) pvParameters; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = 0x12345678; /* Accumulator. */ + pxTopOfStack--; + *pxTopOfStack = 0x87654321; /* Accumulator. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* Use pxCurrentTCB just so it does not get optimised away. */ + if( pxCurrentTCB != NULL ) + { + /* Call an application function to set up the timer that will generate + the tick interrupt. This way the application can decide which + peripheral to use. If tickless mode is used then the default + implementation defined in this file (which uses CMT0) should not be + overridden. */ + configSETUP_TICK_INTERRUPT(); + + /* Enable the software interrupt. */ + _IEN( _ICU_SWINT ) = 1; + + /* Ensure the software interrupt is clear. */ + _IR( _ICU_SWINT ) = 0; + + /* Ensure the software interrupt is set to the kernel priority. */ + _IPR( _ICU_SWINT ) = configKERNEL_INTERRUPT_PRIORITY; + + /* Start the first task. */ + prvStartFirstTask(); + } + + /* Execution should not reach here as the tasks are now running! + prvSetupTimerInterrupt() is called here to prevent the compiler outputting + a warning about a statically declared function not being referenced in the + case that the application writer has provided their own tick interrupt + configuration routine (and defined configSETUP_TICK_INTERRUPT() such that + their own routine will be called in place of prvSetupTimerInterrupt()). */ + prvSetupTimerInterrupt(); + + /* Should not get here. */ + return pdFAIL; +} +/*-----------------------------------------------------------*/ + +#pragma vector = configTICK_VECTOR +__interrupt static void prvTickISR( void ) +{ + /* Re-enable interrupts. */ + __enable_interrupt(); + + /* Increment the tick, and perform any processing the new tick value + necessitates. */ + __set_interrupt_level( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + { + if( xTaskIncrementTick() != pdFALSE ) + { + taskYIELD(); + } + } + __set_interrupt_level( configKERNEL_INTERRUPT_PRIORITY ); + + #if configUSE_TICKLESS_IDLE == 1 + { + /* The CPU woke because of a tick. */ + ulTickFlag = pdTRUE; + + /* If this is the first tick since exiting tickless mode then the CMT + compare match value needs resetting. */ + CMT0.CMCOR = ( uint16_t ) ulMatchValueForOneTick; + } + #endif +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( pxCurrentTCB == NULL ); +} +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt( void ) +{ + /* Unlock. */ + SYSTEM.PRCR.WORD = portUNLOCK_KEY; + + /* Enable CMT0. */ + MSTP( CMT0 ) = 0; + + /* Lock again. */ + SYSTEM.PRCR.WORD = portLOCK_KEY; + + /* Interrupt on compare match. */ + CMT0.CMCR.BIT.CMIE = 1; + + /* Set the compare match value. */ + CMT0.CMCOR = ( uint16_t ) ulMatchValueForOneTick; + + /* Divide the PCLK. */ + #if portCLOCK_DIVISOR == 512 + { + CMT0.CMCR.BIT.CKS = 3; + } + #elif portCLOCK_DIVISOR == 128 + { + CMT0.CMCR.BIT.CKS = 2; + } + #elif portCLOCK_DIVISOR == 32 + { + CMT0.CMCR.BIT.CKS = 1; + } + #elif portCLOCK_DIVISOR == 8 + { + CMT0.CMCR.BIT.CKS = 0; + } + #else + { + #error Invalid portCLOCK_DIVISOR setting + } + #endif + + + /* Enable the interrupt... */ + _IEN( _CMT0_CMI0 ) = 1; + + /* ...and set its priority to the application defined kernel priority. */ + _IPR( _CMT0_CMI0 ) = configKERNEL_INTERRUPT_PRIORITY; + + /* Start the timer. */ + CMT.CMSTR0.BIT.STR0 = 1; +} +/*-----------------------------------------------------------*/ + +#if configUSE_TICKLESS_IDLE == 1 + + static void prvSleep( TickType_t xExpectedIdleTime ) + { + /* Allow the application to define some pre-sleep processing. */ + configPRE_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* xExpectedIdleTime being set to 0 by configPRE_SLEEP_PROCESSING() + means the application defined code has already executed the WAIT + instruction. */ + if( xExpectedIdleTime > 0 ) + { + __wait_for_interrupt(); + } + + /* Allow the application to define some post sleep processing. */ + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + } + +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +#if configUSE_TICKLESS_IDLE == 1 + + void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulMatchValue, ulCompleteTickPeriods, ulCurrentCount; + eSleepModeStatus eSleepAction; + + /* THIS FUNCTION IS CALLED WITH THE SCHEDULER SUSPENDED. */ + + /* Make sure the CMT reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Calculate the reload value required to wait xExpectedIdleTime tick + periods. */ + ulMatchValue = ulMatchValueForOneTick * xExpectedIdleTime; + if( ulMatchValue > ulStoppedTimerCompensation ) + { + /* Compensate for the fact that the CMT is going to be stopped + momentarily. */ + ulMatchValue -= ulStoppedTimerCompensation; + } + + /* Stop the CMT momentarily. The time the CMT is stopped for is + accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + CMT.CMSTR0.BIT.STR0 = 0; + while( CMT.CMSTR0.BIT.STR0 == 1 ) + { + /* Nothing to do here. */ + } + + /* Critical section using the global interrupt bit as the i bit is + automatically reset by the WAIT instruction. */ + __disable_interrupt(); + + /* The tick flag is set to false before sleeping. If it is true when + sleep mode is exited then sleep mode was probably exited because the + tick was suppressed for the entire xExpectedIdleTime period. */ + ulTickFlag = pdFALSE; + + /* If a context switch is pending then abandon the low power entry as + the context switch might have been pended by an external interrupt that + requires processing. */ + eSleepAction = eTaskConfirmSleepModeStatus(); + if( eSleepAction == eAbortSleep ) + { + /* Restart tick. */ + CMT.CMSTR0.BIT.STR0 = 1; + __enable_interrupt(); + } + else if( eSleepAction == eNoTasksWaitingTimeout ) + { + /* Protection off. */ + SYSTEM.PRCR.WORD = portUNLOCK_KEY; + + /* Ready for software standby with all clocks stopped. */ + SYSTEM.SBYCR.BIT.SSBY = 1; + + /* Protection on. */ + SYSTEM.PRCR.WORD = portLOCK_KEY; + + /* Sleep until something happens. Calling prvSleep() will + automatically reset the i bit in the PSW. */ + prvSleep( xExpectedIdleTime ); + + /* Restart the CMT. */ + CMT.CMSTR0.BIT.STR0 = 1; + } + else + { + /* Protection off. */ + SYSTEM.PRCR.WORD = portUNLOCK_KEY; + + /* Ready for deep sleep mode. */ + SYSTEM.MSTPCRC.BIT.DSLPE = 1; + SYSTEM.MSTPCRA.BIT.MSTPA28 = 1; + SYSTEM.SBYCR.BIT.SSBY = 0; + + /* Protection on. */ + SYSTEM.PRCR.WORD = portLOCK_KEY; + + /* Adjust the match value to take into account that the current + time slice is already partially complete. */ + ulMatchValue -= ( uint32_t ) CMT0.CMCNT; + CMT0.CMCOR = ( uint16_t ) ulMatchValue; + + /* Restart the CMT to count up to the new match value. */ + CMT0.CMCNT = 0; + CMT.CMSTR0.BIT.STR0 = 1; + + /* Sleep until something happens. Calling prvSleep() will + automatically reset the i bit in the PSW. */ + prvSleep( xExpectedIdleTime ); + + /* Stop CMT. Again, the time the SysTick is stopped for is + accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + CMT.CMSTR0.BIT.STR0 = 0; + while( CMT.CMSTR0.BIT.STR0 == 1 ) + { + /* Nothing to do here. */ + } + + ulCurrentCount = ( uint32_t ) CMT0.CMCNT; + + if( ulTickFlag != pdFALSE ) + { + /* The tick interrupt has already executed, although because + this function is called with the scheduler suspended the actual + tick processing will not occur until after this function has + exited. Reset the match value with whatever remains of this + tick period. */ + ulMatchValue = ulMatchValueForOneTick - ulCurrentCount; + CMT0.CMCOR = ( uint16_t ) ulMatchValue; + + /* The tick interrupt handler will already have pended the tick + processing in the kernel. As the pending tick will be + processed as soon as this function exits, the tick value + maintained by the tick is stepped forward by one less than the + time spent sleeping. The actual stepping of the tick appears + later in this function. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. + How many complete tick periods passed while the processor was + sleeping? */ + ulCompleteTickPeriods = ulCurrentCount / ulMatchValueForOneTick; + + /* The match value is set to whatever fraction of a single tick + period remains. */ + ulMatchValue = ulCurrentCount - ( ulCompleteTickPeriods * ulMatchValueForOneTick ); + CMT0.CMCOR = ( uint16_t ) ulMatchValue; + } + + /* Restart the CMT so it runs up to the match value. The match value + will get set to the value required to generate exactly one tick period + the next time the CMT interrupt executes. */ + CMT0.CMCNT = 0; + CMT.CMSTR0.BIT.STR0 = 1; + + /* Wind the tick forward by the number of tick periods that the CPU + remained in a low power state. */ + vTaskStepTick( ulCompleteTickPeriods ); + } + } + +#endif /* configUSE_TICKLESS_IDLE */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/RX100/port_asm.s b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/RX100/port_asm.s new file mode 100644 index 0000000..2b998b2 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/RX100/port_asm.s @@ -0,0 +1,193 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#include "PriorityDefinitions.h" + + PUBLIC _prvStartFirstTask + PUBLIC ___interrupt_27 + + EXTERN _pxCurrentTCB + EXTERN _vTaskSwitchContext + + RSEG CODE:CODE(4) + +_prvStartFirstTask: + + /* When starting the scheduler there is nothing that needs moving to the + interrupt stack because the function is not called from an interrupt. + Just ensure the current stack is the user stack. */ + SETPSW U + + /* Obtain the location of the stack associated with which ever task + pxCurrentTCB is currently pointing to. */ + MOV.L #_pxCurrentTCB, R15 + MOV.L [R15], R15 + MOV.L [R15], R0 + + /* Restore the registers from the stack of the task pointed to by + pxCurrentTCB. */ + POP R15 + + /* Accumulator low 32 bits. */ + MVTACLO R15 + POP R15 + + /* Accumulator high 32 bits. */ + MVTACHI R15 + + /* R1 to R15 - R0 is not included as it is the SP. */ + POPM R1-R15 + + /* This pops the remaining registers. */ + RTE + NOP + NOP + +/*-----------------------------------------------------------*/ + +/* The software interrupt - overwrite the default 'weak' definition. */ +___interrupt_27: + + /* Re-enable interrupts. */ + SETPSW I + + /* Move the data that was automatically pushed onto the interrupt stack when + the interrupt occurred from the interrupt stack to the user stack. + + R15 is saved before it is clobbered. */ + PUSH.L R15 + + /* Read the user stack pointer. */ + MVFC USP, R15 + + /* Move the address down to the data being moved. */ + SUB #12, R15 + MVTC R15, USP + + /* Copy the data across, R15, then PC, then PSW. */ + MOV.L [ R0 ], [ R15 ] + MOV.L 4[ R0 ], 4[ R15 ] + MOV.L 8[ R0 ], 8[ R15 ] + + /* Move the interrupt stack pointer to its new correct position. */ + ADD #12, R0 + + /* All the rest of the registers are saved directly to the user stack. */ + SETPSW U + + /* Save the rest of the general registers (R15 has been saved already). */ + PUSHM R1-R14 + + /* Save the accumulator. */ + MVFACHI R15 + PUSH.L R15 + + /* Middle word. */ + MVFACMI R15 + + /* Shifted left as it is restored to the low order word. */ + SHLL #16, R15 + PUSH.L R15 + + /* Save the stack pointer to the TCB. */ + MOV.L #_pxCurrentTCB, R15 + MOV.L [ R15 ], R15 + MOV.L R0, [ R15 ] + + /* Ensure the interrupt mask is set to the syscall priority while the kernel + structures are being accessed. */ + MVTIPL #configMAX_SYSCALL_INTERRUPT_PRIORITY + + /* Select the next task to run. */ + BSR.A _vTaskSwitchContext + + /* Reset the interrupt mask as no more data structure access is required. */ + MVTIPL #configKERNEL_INTERRUPT_PRIORITY + + /* Load the stack pointer of the task that is now selected as the Running + state task from its TCB. */ + MOV.L #_pxCurrentTCB,R15 + MOV.L [ R15 ], R15 + MOV.L [ R15 ], R0 + + /* Restore the context of the new task. The PSW (Program Status Word) and + PC will be popped by the RTE instruction. */ + POP R15 + MVTACLO R15 + POP R15 + MVTACHI R15 + POPM R1-R15 + RTE + NOP + NOP + +/*-----------------------------------------------------------*/ + + END + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/RX100/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/RX100/portmacro.h new file mode 100644 index 0000000..2b9366c --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/RX100/portmacro.h @@ -0,0 +1,192 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Hardware specifics. */ +#include "machine.h" + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions - these are a bit legacy and not really used now, other than +portSTACK_TYPE and portBASE_TYPE. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 8 /* Could make four, according to manual. */ +#define portSTACK_GROWTH -1 +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portNOP() __no_operation() + +#define portYIELD() \ + __asm volatile \ + ( \ + "MOV.L #0x872E0, R15 \n" \ + "MOV.B #1, [R15] \n" \ + "MOV.L [R15], R15 \n" \ + ::: "R15" \ + ) + +#define portYIELD_FROM_ISR( x ) if( ( x ) != pdFALSE ) { portYIELD(); } + +/* These macros should not be called directly, but through the +taskENTER_CRITICAL() and taskEXIT_CRITICAL() macros. An extra check is +performed if configASSERT() is defined to ensure an assertion handler does not +inadvertently attempt to lower the IPL when the call to assert was triggered +because the IPL value was found to be above configMAX_SYSCALL_INTERRUPT_PRIORITY +when an ISR safe FreeRTOS API function was executed. ISR safe FreeRTOS API +functions are those that end in FromISR. FreeRTOS maintains a separate +interrupt API to ensure API function and interrupt entry is as fast and as +simple as possible. */ +#define portENABLE_INTERRUPTS() __set_interrupt_level( ( uint8_t ) 0 ) +#ifdef configASSERT + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() configASSERT( ( __get_interrupt_level() <= configMAX_SYSCALL_INTERRUPT_PRIORITY ) ) + #define portDISABLE_INTERRUPTS() if( __get_interrupt_level() < configMAX_SYSCALL_INTERRUPT_PRIORITY ) __set_interrupt_level( ( uint8_t ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#else + #define portDISABLE_INTERRUPTS() __set_interrupt_level( ( uint8_t ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#endif + +/* Critical nesting counts are stored in the TCB. */ +#define portCRITICAL_NESTING_IN_TCB ( 1 ) + +/* The critical nesting functions defined within tasks.c. */ +extern void vTaskEnterCritical( void ); +extern void vTaskExitCritical( void ); +#define portENTER_CRITICAL() vTaskEnterCritical() +#define portEXIT_CRITICAL() vTaskExitCritical() + +/* As this port allows interrupt nesting... */ +#define portSET_INTERRUPT_MASK_FROM_ISR() __get_interrupt_level(); portDISABLE_INTERRUPTS() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ) __set_interrupt_level( ( uint8_t ) ( uxSavedInterruptStatus ) ) + +/* Tickless idle/low power functionality. */ +#if configUSE_TICKLESS_IDLE == 1 + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif +#endif + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +/* Prevent warnings of undefined behaviour: the order of volatile accesses is +undefined - all warnings have been manually checked and are not an issue, and +the warnings cannot be prevent by code changes without undesirable effects. */ +#pragma diag_suppress=Pa082 + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/RX600/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/RX600/port.c new file mode 100644 index 0000000..62cb2f7 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/RX600/port.c @@ -0,0 +1,235 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the SH2A port. + *----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Library includes. */ +#include "string.h" + +/* Hardware specifics. */ +#include + +/*-----------------------------------------------------------*/ + +/* Tasks should start with interrupts enabled and in Supervisor mode, therefore +PSW is set with U and I set, and PM and IPL clear. */ +#define portINITIAL_PSW ( ( StackType_t ) 0x00030000 ) +#define portINITIAL_FPSW ( ( StackType_t ) 0x00000100 ) + +/*-----------------------------------------------------------*/ + +/* + * Function to start the first task executing - written in asm code as direct + * access to registers is required. + */ +extern void prvStartFirstTask( void ); + +/* + * The tick ISR handler. The peripheral used is configured by the application + * via a hook/callback function. + */ +__interrupt void vTickISR( void ); + +/*-----------------------------------------------------------*/ + +extern void *pxCurrentTCB; + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* R0 is not included as it is the stack pointer. */ + + *pxTopOfStack = 0x00; + pxTopOfStack--; + *pxTopOfStack = portINITIAL_PSW; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; + + /* When debugging it can be useful if every register is set to a known + value. Otherwise code space can be saved by just setting the registers + that need to be set. */ + #ifdef USE_FULL_REGISTER_INITIALISATION + { + pxTopOfStack--; + *pxTopOfStack = 0xffffffff; /* r15. */ + pxTopOfStack--; + *pxTopOfStack = 0xeeeeeeee; + pxTopOfStack--; + *pxTopOfStack = 0xdddddddd; + pxTopOfStack--; + *pxTopOfStack = 0xcccccccc; + pxTopOfStack--; + *pxTopOfStack = 0xbbbbbbbb; + pxTopOfStack--; + *pxTopOfStack = 0xaaaaaaaa; + pxTopOfStack--; + *pxTopOfStack = 0x99999999; + pxTopOfStack--; + *pxTopOfStack = 0x88888888; + pxTopOfStack--; + *pxTopOfStack = 0x77777777; + pxTopOfStack--; + *pxTopOfStack = 0x66666666; + pxTopOfStack--; + *pxTopOfStack = 0x55555555; + pxTopOfStack--; + *pxTopOfStack = 0x44444444; + pxTopOfStack--; + *pxTopOfStack = 0x33333333; + pxTopOfStack--; + *pxTopOfStack = 0x22222222; + pxTopOfStack--; + } + #else + { + pxTopOfStack -= 15; + } + #endif + + *pxTopOfStack = ( StackType_t ) pvParameters; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_FPSW; + pxTopOfStack--; + *pxTopOfStack = 0x12345678; /* Accumulator. */ + pxTopOfStack--; + *pxTopOfStack = 0x87654321; /* Accumulator. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void vApplicationSetupTimerInterrupt( void ); + + /* Use pxCurrentTCB just so it does not get optimised away. */ + if( pxCurrentTCB != NULL ) + { + /* Call an application function to set up the timer that will generate the + tick interrupt. This way the application can decide which peripheral to + use. A demo application is provided to show a suitable example. */ + vApplicationSetupTimerInterrupt(); + + /* Enable the software interrupt. */ + _IEN( _ICU_SWINT ) = 1; + + /* Ensure the software interrupt is clear. */ + _IR( _ICU_SWINT ) = 0; + + /* Ensure the software interrupt is set to the kernel priority. */ + _IPR( _ICU_SWINT ) = configKERNEL_INTERRUPT_PRIORITY; + + /* Start the first task. */ + prvStartFirstTask(); + } + + /* Should not get here. */ + return pdFAIL; +} +/*-----------------------------------------------------------*/ + +#pragma vector = configTICK_VECTOR +__interrupt void vTickISR( void ) +{ + /* Re-enable interrupts. */ + __enable_interrupt(); + + /* Increment the tick, and perform any processing the new tick value + necessitates. */ + __set_interrupt_level( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + { + if( xTaskIncrementTick() != pdFALSE ) + { + taskYIELD(); + } + } + __set_interrupt_level( configKERNEL_INTERRUPT_PRIORITY ); +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( pxCurrentTCB == NULL ); +} +/*-----------------------------------------------------------*/ + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/RX600/port_asm.s b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/RX600/port_asm.s new file mode 100644 index 0000000..016f285 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/RX600/port_asm.s @@ -0,0 +1,201 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#include "PriorityDefinitions.h" + + PUBLIC _prvStartFirstTask + PUBLIC ___interrupt_27 + + EXTERN _pxCurrentTCB + EXTERN _vTaskSwitchContext + + RSEG CODE:CODE(4) + +_prvStartFirstTask: + + /* When starting the scheduler there is nothing that needs moving to the + interrupt stack because the function is not called from an interrupt. + Just ensure the current stack is the user stack. */ + SETPSW U + + /* Obtain the location of the stack associated with which ever task + pxCurrentTCB is currently pointing to. */ + MOV.L #_pxCurrentTCB, R15 + MOV.L [R15], R15 + MOV.L [R15], R0 + + /* Restore the registers from the stack of the task pointed to by + pxCurrentTCB. */ + POP R15 + + /* Accumulator low 32 bits. */ + MVTACLO R15 + POP R15 + + /* Accumulator high 32 bits. */ + MVTACHI R15 + POP R15 + + /* Floating point status word. */ + MVTC R15, FPSW + + /* R1 to R15 - R0 is not included as it is the SP. */ + POPM R1-R15 + + /* This pops the remaining registers. */ + RTE + NOP + NOP + +/*-----------------------------------------------------------*/ + +/* The software interrupt - overwrite the default 'weak' definition. */ +___interrupt_27: + + /* Re-enable interrupts. */ + SETPSW I + + /* Move the data that was automatically pushed onto the interrupt stack when + the interrupt occurred from the interrupt stack to the user stack. + + R15 is saved before it is clobbered. */ + PUSH.L R15 + + /* Read the user stack pointer. */ + MVFC USP, R15 + + /* Move the address down to the data being moved. */ + SUB #12, R15 + MVTC R15, USP + + /* Copy the data across, R15, then PC, then PSW. */ + MOV.L [ R0 ], [ R15 ] + MOV.L 4[ R0 ], 4[ R15 ] + MOV.L 8[ R0 ], 8[ R15 ] + + /* Move the interrupt stack pointer to its new correct position. */ + ADD #12, R0 + + /* All the rest of the registers are saved directly to the user stack. */ + SETPSW U + + /* Save the rest of the general registers (R15 has been saved already). */ + PUSHM R1-R14 + + /* Save the FPSW and accumulator. */ + MVFC FPSW, R15 + PUSH.L R15 + MVFACHI R15 + PUSH.L R15 + + /* Middle word. */ + MVFACMI R15 + + /* Shifted left as it is restored to the low order word. */ + SHLL #16, R15 + PUSH.L R15 + + /* Save the stack pointer to the TCB. */ + MOV.L #_pxCurrentTCB, R15 + MOV.L [ R15 ], R15 + MOV.L R0, [ R15 ] + + /* Ensure the interrupt mask is set to the syscall priority while the kernel + structures are being accessed. */ + MVTIPL #configMAX_SYSCALL_INTERRUPT_PRIORITY + + /* Select the next task to run. */ + BSR.A _vTaskSwitchContext + + /* Reset the interrupt mask as no more data structure access is required. */ + MVTIPL #configKERNEL_INTERRUPT_PRIORITY + + /* Load the stack pointer of the task that is now selected as the Running + state task from its TCB. */ + MOV.L #_pxCurrentTCB,R15 + MOV.L [ R15 ], R15 + MOV.L [ R15 ], R0 + + /* Restore the context of the new task. The PSW (Program Status Word) and + PC will be popped by the RTE instruction. */ + POP R15 + MVTACLO R15 + POP R15 + MVTACHI R15 + POP R15 + MVTC R15, FPSW + POPM R1-R15 + RTE + NOP + NOP + +/*-----------------------------------------------------------*/ + + END + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/RX600/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/RX600/portmacro.h new file mode 100644 index 0000000..0bbb527 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/RX600/portmacro.h @@ -0,0 +1,181 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions - these are a bit legacy and not really used now, other than +portSTACK_TYPE and portBASE_TYPE. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 8 /* Could make four, according to manual. */ +#define portSTACK_GROWTH -1 +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portNOP() __no_operation() + +/* Yield equivalent to "*portITU_SWINTR = 0x01; ( void ) *portITU_SWINTR;" +where portITU_SWINTR is the location of the software interrupt register +(0x000872E0). Don't rely on the assembler to select a register, so instead +save and restore clobbered registers manually. */ +#define portYIELD() \ + __asm volatile \ + ( \ + "PUSH.L R10 \n" \ + "MOV.L #0x872E0, R10 \n" \ + "MOV.B #0x1, [R10] \n" \ + "MOV.L [R10], R10 \n" \ + "POP R10 \n" \ + ) + +#define portYIELD_FROM_ISR( x ) if( ( x ) != pdFALSE ) portYIELD() + +/* These macros should not be called directly, but through the +taskENTER_CRITICAL() and taskEXIT_CRITICAL() macros. An extra check is +performed if configASSERT() is defined to ensure an assertion handler does not +inadvertently attempt to lower the IPL when the call to assert was triggered +because the IPL value was found to be above configMAX_SYSCALL_INTERRUPT_PRIORITY +when an ISR safe FreeRTOS API function was executed. ISR safe FreeRTOS API +functions are those that end in FromISR. FreeRTOS maintains a separate +interrupt API to ensure API function and interrupt entry is as fast and as +simple as possible. */ +#define portENABLE_INTERRUPTS() __set_interrupt_level( ( uint8_t ) 0 ) +#ifdef configASSERT + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() configASSERT( ( __get_interrupt_level() <= configMAX_SYSCALL_INTERRUPT_PRIORITY ) ) + #define portDISABLE_INTERRUPTS() if( __get_interrupt_level() < configMAX_SYSCALL_INTERRUPT_PRIORITY ) __set_interrupt_level( ( uint8_t ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#else + #define portDISABLE_INTERRUPTS() __set_interrupt_level( ( uint8_t ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#endif + +/* Critical nesting counts are stored in the TCB. */ +#define portCRITICAL_NESTING_IN_TCB ( 1 ) + +/* The critical nesting functions defined within tasks.c. */ +extern void vTaskEnterCritical( void ); +extern void vTaskExitCritical( void ); +#define portENTER_CRITICAL() vTaskEnterCritical() +#define portEXIT_CRITICAL() vTaskExitCritical() + +/* As this port allows interrupt nesting... */ +#define portSET_INTERRUPT_MASK_FROM_ISR() __get_interrupt_level(); portDISABLE_INTERRUPTS() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ) __set_interrupt_level( ( uint8_t ) ( uxSavedInterruptStatus ) ) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/RXv2/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/RXv2/port.c new file mode 100644 index 0000000..409b6bc --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/RXv2/port.c @@ -0,0 +1,243 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the SH2A port. + *----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Library includes. */ +#include "string.h" + +/* Hardware specifics. */ +#include + +/*-----------------------------------------------------------*/ + +/* Tasks should start with interrupts enabled and in Supervisor mode, therefore +PSW is set with U and I set, and PM and IPL clear. */ +#define portINITIAL_PSW ( ( StackType_t ) 0x00030000 ) +#define portINITIAL_FPSW ( ( StackType_t ) 0x00000100 ) + +/*-----------------------------------------------------------*/ + +/* + * Function to start the first task executing - written in asm code as direct + * access to registers is required. + */ +extern void prvStartFirstTask( void ); + +/* + * The tick ISR handler. The peripheral used is configured by the application + * via a hook/callback function. + */ +__interrupt void vTickISR( void ); + +/*-----------------------------------------------------------*/ + +extern void *pxCurrentTCB; + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* R0 is not included as it is the stack pointer. */ + + *pxTopOfStack = 0x00; + pxTopOfStack--; + *pxTopOfStack = portINITIAL_PSW; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; + + /* When debugging it can be useful if every register is set to a known + value. Otherwise code space can be saved by just setting the registers + that need to be set. */ + #ifdef USE_FULL_REGISTER_INITIALISATION + { + pxTopOfStack--; + *pxTopOfStack = 0xffffffff; /* r15. */ + pxTopOfStack--; + *pxTopOfStack = 0xeeeeeeee; + pxTopOfStack--; + *pxTopOfStack = 0xdddddddd; + pxTopOfStack--; + *pxTopOfStack = 0xcccccccc; + pxTopOfStack--; + *pxTopOfStack = 0xbbbbbbbb; + pxTopOfStack--; + *pxTopOfStack = 0xaaaaaaaa; + pxTopOfStack--; + *pxTopOfStack = 0x99999999; + pxTopOfStack--; + *pxTopOfStack = 0x88888888; + pxTopOfStack--; + *pxTopOfStack = 0x77777777; + pxTopOfStack--; + *pxTopOfStack = 0x66666666; + pxTopOfStack--; + *pxTopOfStack = 0x55555555; + pxTopOfStack--; + *pxTopOfStack = 0x44444444; + pxTopOfStack--; + *pxTopOfStack = 0x33333333; + pxTopOfStack--; + *pxTopOfStack = 0x22222222; + pxTopOfStack--; + } + #else + { + pxTopOfStack -= 15; + } + #endif + + *pxTopOfStack = ( StackType_t ) pvParameters; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_FPSW; + pxTopOfStack--; + *pxTopOfStack = 0x11111111; /* Accumulator 0. */ + pxTopOfStack--; + *pxTopOfStack = 0x22222222; /* Accumulator 0. */ + pxTopOfStack--; + *pxTopOfStack = 0x33333333; /* Accumulator 0. */ + pxTopOfStack--; + *pxTopOfStack = 0x44444444; /* Accumulator 1. */ + pxTopOfStack--; + *pxTopOfStack = 0x55555555; /* Accumulator 1. */ + pxTopOfStack--; + *pxTopOfStack = 0x66666666; /* Accumulator 1. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void vApplicationSetupTimerInterrupt( void ); + + /* Use pxCurrentTCB just so it does not get optimised away. */ + if( pxCurrentTCB != NULL ) + { + /* Call an application function to set up the timer that will generate the + tick interrupt. This way the application can decide which peripheral to + use. A demo application is provided to show a suitable example. */ + vApplicationSetupTimerInterrupt(); + + /* Enable the software interrupt. */ + _IEN( _ICU_SWINT ) = 1; + + /* Ensure the software interrupt is clear. */ + _IR( _ICU_SWINT ) = 0; + + /* Ensure the software interrupt is set to the kernel priority. */ + _IPR( _ICU_SWINT ) = configKERNEL_INTERRUPT_PRIORITY; + + /* Start the first task. */ + prvStartFirstTask(); + } + + /* Should not get here. */ + return pdFAIL; +} +/*-----------------------------------------------------------*/ + +#pragma vector = configTICK_VECTOR +__interrupt void vTickISR( void ) +{ + /* Re-enable interrupts. */ + __enable_interrupt(); + + /* Increment the tick, and perform any processing the new tick value + necessitates. */ + __set_interrupt_level( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + { + if( xTaskIncrementTick() != pdFALSE ) + { + taskYIELD(); + } + } + __set_interrupt_level( configKERNEL_INTERRUPT_PRIORITY ); +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( pxCurrentTCB == NULL ); +} +/*-----------------------------------------------------------*/ + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/RXv2/port_asm.s b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/RXv2/port_asm.s new file mode 100644 index 0000000..da92a9b --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/RXv2/port_asm.s @@ -0,0 +1,242 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#include "PriorityDefinitions.h" + + PUBLIC _prvStartFirstTask + PUBLIC ___interrupt_27 + + EXTERN _pxCurrentTCB + EXTERN _vTaskSwitchContext + + RSEG CODE:CODE(4) + +_prvStartFirstTask: + + /* When starting the scheduler there is nothing that needs moving to the + interrupt stack because the function is not called from an interrupt. + Just ensure the current stack is the user stack. */ + SETPSW U + + /* Obtain the location of the stack associated with which ever task + pxCurrentTCB is currently pointing to. */ + MOV.L #_pxCurrentTCB, R15 + MOV.L [R15], R15 + MOV.L [R15], R0 + + /* Restore the registers from the stack of the task pointed to by + pxCurrentTCB. */ + POP R15 + + /* Accumulator low 32 bits. */ + MVTACLO R15, A0 + POP R15 + + /* Accumulator high 32 bits. */ + MVTACHI R15, A0 + POP R15 + + /* Accumulator guard. */ + MVTACGU R15, A0 + POP R15 + + /* Accumulator low 32 bits. */ + MVTACLO R15, A1 + POP R15 + + /* Accumulator high 32 bits. */ + MVTACHI R15, A1 + POP R15 + + /* Accumulator guard. */ + MVTACGU R15, A1 + POP R15 + + /* Floating point status word. */ + MVTC R15, FPSW + + /* R1 to R15 - R0 is not included as it is the SP. */ + POPM R1-R15 + + /* This pops the remaining registers. */ + RTE + NOP + NOP + +/*-----------------------------------------------------------*/ + +/* The software interrupt - overwrite the default 'weak' definition. */ +___interrupt_27: + + /* Re-enable interrupts. */ + SETPSW I + + /* Move the data that was automatically pushed onto the interrupt stack when + the interrupt occurred from the interrupt stack to the user stack. + + R15 is saved before it is clobbered. */ + PUSH.L R15 + + /* Read the user stack pointer. */ + MVFC USP, R15 + + /* Move the address down to the data being moved. */ + SUB #12, R15 + MVTC R15, USP + + /* Copy the data across, R15, then PC, then PSW. */ + MOV.L [ R0 ], [ R15 ] + MOV.L 4[ R0 ], 4[ R15 ] + MOV.L 8[ R0 ], 8[ R15 ] + + /* Move the interrupt stack pointer to its new correct position. */ + ADD #12, R0 + + /* All the rest of the registers are saved directly to the user stack. */ + SETPSW U + + /* Save the rest of the general registers (R15 has been saved already). */ + PUSHM R1-R14 + + /* Save the FPSW and accumulator. */ + MVFC FPSW, R15 + PUSH.L R15 + MVFACGU #0, A1, R15 + PUSH.L R15 + MVFACHI #0, A1, R15 + PUSH.L R15 + /* Low order word. */ + MVFACLO #0, A1, R15 + PUSH.L R15 + MVFACGU #0, A0, R15 + PUSH.L R15 + MVFACHI #0, A0, R15 + PUSH.L R15 + /* Low order word. */ + MVFACLO #0, A0, R15 + PUSH.L R15 + + /* Save the stack pointer to the TCB. */ + MOV.L #_pxCurrentTCB, R15 + MOV.L [ R15 ], R15 + MOV.L R0, [ R15 ] + + /* Ensure the interrupt mask is set to the syscall priority while the kernel + structures are being accessed. */ + MVTIPL #configMAX_SYSCALL_INTERRUPT_PRIORITY + + /* Select the next task to run. */ + BSR.A _vTaskSwitchContext + + /* Reset the interrupt mask as no more data structure access is required. */ + MVTIPL #configKERNEL_INTERRUPT_PRIORITY + + /* Load the stack pointer of the task that is now selected as the Running + state task from its TCB. */ + MOV.L #_pxCurrentTCB,R15 + MOV.L [ R15 ], R15 + MOV.L [ R15 ], R0 + + /* Restore the context of the new task. The PSW (Program Status Word) and + PC will be popped by the RTE instruction. */ + POP R15 + + /* Accumulator low 32 bits. */ + MVTACLO R15, A0 + POP R15 + + /* Accumulator high 32 bits. */ + MVTACHI R15, A0 + POP R15 + + /* Accumulator guard. */ + MVTACGU R15, A0 + POP R15 + + /* Accumulator low 32 bits. */ + MVTACLO R15, A1 + POP R15 + + /* Accumulator high 32 bits. */ + MVTACHI R15, A1 + POP R15 + + /* Accumulator guard. */ + MVTACGU R15, A1 + POP R15 + MVTC R15, FPSW + POPM R1-R15 + RTE + NOP + NOP + +/*-----------------------------------------------------------*/ + + END + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/RXv2/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/RXv2/portmacro.h new file mode 100644 index 0000000..b1f3a31 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/RXv2/portmacro.h @@ -0,0 +1,186 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions - these are a bit legacy and not really used now, other than +portSTACK_TYPE and portBASE_TYPE. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 8 /* Could make four, according to manual. */ +#define portSTACK_GROWTH -1 +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portNOP() __no_operation() + +/* Yield equivalent to "*portITU_SWINTR = 0x01; ( void ) *portITU_SWINTR;" +where portITU_SWINTR is the location of the software interrupt register +(0x000872E0). Don't rely on the assembler to select a register, so instead +save and restore clobbered registers manually. */ +#define portYIELD() \ + __asm volatile \ + ( \ + "PUSH.L R10 \n" \ + "MOV.L #0x872E0, R10 \n" \ + "MOV.B #0x1, [R10] \n" \ + "MOV.L [R10], R10 \n" \ + "POP R10 \n" \ + ) + +#define portYIELD_FROM_ISR( x ) if( ( x ) != pdFALSE ) portYIELD() + +/* These macros should not be called directly, but through the +taskENTER_CRITICAL() and taskEXIT_CRITICAL() macros. An extra check is +performed if configASSERT() is defined to ensure an assertion handler does not +inadvertently attempt to lower the IPL when the call to assert was triggered +because the IPL value was found to be above configMAX_SYSCALL_INTERRUPT_PRIORITY +when an ISR safe FreeRTOS API function was executed. ISR safe FreeRTOS API +functions are those that end in FromISR. FreeRTOS maintains a separate +interrupt API to ensure API function and interrupt entry is as fast and as +simple as possible. */ +#define portENABLE_INTERRUPTS() __set_interrupt_level( ( uint8_t ) 0 ) +#ifdef configASSERT + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() configASSERT( ( __get_interrupt_level() <= configMAX_SYSCALL_INTERRUPT_PRIORITY ) ) + #define portDISABLE_INTERRUPTS() if( __get_interrupt_level() < configMAX_SYSCALL_INTERRUPT_PRIORITY ) __set_interrupt_level( ( uint8_t ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#else + #define portDISABLE_INTERRUPTS() __set_interrupt_level( ( uint8_t ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#endif + +/* Critical nesting counts are stored in the TCB. */ +#define portCRITICAL_NESTING_IN_TCB ( 1 ) + +/* The critical nesting functions defined within tasks.c. */ +extern void vTaskEnterCritical( void ); +extern void vTaskExitCritical( void ); +#define portENTER_CRITICAL() vTaskEnterCritical() +#define portEXIT_CRITICAL() vTaskExitCritical() + +/* As this port allows interrupt nesting... */ +#define portSET_INTERRUPT_MASK_FROM_ISR() __get_interrupt_level(); portDISABLE_INTERRUPTS() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ) __set_interrupt_level( ( uint8_t ) ( uxSavedInterruptStatus ) ) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +/* Prevent warnings of undefined behaviour: the order of volatile accesses is +undefined - all warnings have been manually checked and are not an issue, and +the warnings cannot be prevent by code changes without undesirable effects. */ +#pragma diag_suppress=Pa082 + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/STR71x/ISR_Support.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/STR71x/ISR_Support.h new file mode 100644 index 0000000..af77eca --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/STR71x/ISR_Support.h @@ -0,0 +1,131 @@ +;/* +; FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. +; All rights reserved +; +; +; *************************************************************************** +; * * +; * FreeRTOS tutorial books are available in pdf and paperback. * +; * Complete, revised, and edited pdf reference manuals are also * +; * available. * +; * * +; * Purchasing FreeRTOS documentation will not only help you, by * +; * ensuring you get running as quickly as possible and with an * +; * in-depth knowledge of how to use FreeRTOS, it will also help * +; * the FreeRTOS project to continue with its mission of providing * +; * professional grade, cross platform, de facto standard solutions * +; * for microcontrollers - completely free of charge! * +; * * +; * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * +; * * +; * Thank you for using FreeRTOS, and thank you for your support! * +; * * +; *************************************************************************** +; +; +; This file is part of the FreeRTOS distribution. +; +; FreeRTOS is free software; you can redistribute it and/or modify it under +; the terms of the GNU General Public License (version 2) as published by the +; Free Software Foundation AND MODIFIED BY the FreeRTOS exception. +; >>>NOTE<<< The modification to the GPL is included to allow you to +; distribute a combined work that includes FreeRTOS without being obliged to +; provide the source code for proprietary components outside of the FreeRTOS +; kernel. FreeRTOS is distributed in the hope that it will be useful, but +; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +; more details. You should have received a copy of the GNU General Public +; License and the FreeRTOS license exception along with FreeRTOS; if not it +; can be viewed here: http://www.freertos.org/a00114.html and also obtained +; by writing to Richard Barry, contact details for whom are available on the +; FreeRTOS WEB site. +; +; 1 tab == 4 spaces! +; +; http://www.FreeRTOS.org - Documentation, latest information, license and +; contact details. +; +; http://www.SafeRTOS.com - A version that is certified for use in safety +; critical systems. +; +; http://www.OpenRTOS.com - Commercial support, development, porting, +; licensing and training services. +;*/ + EXTERN pxCurrentTCB + EXTERN ulCriticalNesting + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Context save and restore macro definitions +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +portSAVE_CONTEXT MACRO + + ; Push R0 as we are going to use the register. + STMDB SP!, {R0} + + ; Set R0 to point to the task stack pointer. + STMDB SP, {SP}^ + NOP + SUB SP, SP, #4 + LDMIA SP!, {R0} + + ; Push the return address onto the stack. + STMDB R0!, {LR} + + ; Now we have saved LR we can use it instead of R0. + MOV LR, R0 + + ; Pop R0 so we can save it onto the system mode stack. + LDMIA SP!, {R0} + + ; Push all the system mode registers onto the task stack. + STMDB LR, {R0-LR}^ + NOP + SUB LR, LR, #60 + + ; Push the SPSR onto the task stack. + MRS R0, SPSR + STMDB LR!, {R0} + + LDR R0, =ulCriticalNesting + LDR R0, [R0] + STMDB LR!, {R0} + + ; Store the new top of stack for the task. + LDR R1, =pxCurrentTCB + LDR R0, [R1] + STR LR, [R0] + + ENDM + + +portRESTORE_CONTEXT MACRO + + ; Set the LR to the task stack. + LDR R1, =pxCurrentTCB + LDR R0, [R1] + LDR LR, [R0] + + ; The critical nesting depth is the first item on the stack. + ; Load it into the ulCriticalNesting variable. + LDR R0, =ulCriticalNesting + LDMFD LR!, {R1} + STR R1, [R0] + + ; Get the SPSR from the stack. + LDMFD LR!, {R0} + MSR SPSR_cxsf, R0 + + ; Restore all system mode registers for the task. + LDMFD LR, {R0-R14}^ + NOP + + ; Restore the return address. + LDR LR, [LR, #+60] + + ; And return - correcting the offset in the LR to obtain the + ; correct address. + SUBS PC, LR, #4 + + ENDM + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/STR71x/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/STR71x/port.c new file mode 100644 index 0000000..940d889 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/STR71x/port.c @@ -0,0 +1,300 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the ST STR71x ARM7 + * port. + *----------------------------------------------------------*/ + +/* Library includes. */ +#include "wdg.h" +#include "eic.h" + +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Constants required to setup the initial stack. */ +#define portINITIAL_SPSR ( ( StackType_t ) 0x1f ) /* System mode, ARM mode, interrupts enabled. */ +#define portTHUMB_MODE_BIT ( ( StackType_t ) 0x20 ) +#define portINSTRUCTION_SIZE ( ( StackType_t ) 4 ) + +/* Constants required to handle critical sections. */ +#define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) + +#define portMICROS_PER_SECOND 1000000 + +/*-----------------------------------------------------------*/ + +/* Setup the watchdog to generate the tick interrupts. */ +static void prvSetupTimerInterrupt( void ); + +/* ulCriticalNesting will get set to zero when the first task starts. It +cannot be initialised to 0 as this will cause interrupts to be enabled +during the kernel initialisation process. */ +uint32_t ulCriticalNesting = ( uint32_t ) 9999; + +/* Tick interrupt routines for cooperative and preemptive operation +respectively. The preemptive version is not defined as __irq as it is called +from an asm wrapper function. */ +__arm __irq void vPortNonPreemptiveTick( void ); +void vPortPreemptiveTick( void ); + +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been called. + * + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +StackType_t *pxOriginalTOS; + + pxOriginalTOS = pxTopOfStack; + + /* To ensure asserts in tasks.c don't fail, although in this case the assert + is not really required. */ + pxTopOfStack--; + + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. */ + + /* First on the stack is the return address - which in this case is the + start of the task. The offset is added to make the return address appear + as it would within an IRQ ISR. */ + *pxTopOfStack = ( StackType_t ) pxCode + portINSTRUCTION_SIZE; + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) 0xaaaaaaaa; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxOriginalTOS; /* Stack used when task starts goes in R13. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */ + pxTopOfStack--; + + /* When the task starts is will expect to find the function parameter in + R0. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + + /* The status register is set for system mode, with interrupts enabled. */ + *pxTopOfStack = ( StackType_t ) portINITIAL_SPSR; + + if( ( ( uint32_t ) pxCode & 0x01UL ) != 0x00UL ) + { + /* We want the task to start in thumb mode. */ + *pxTopOfStack |= portTHUMB_MODE_BIT; + } + + pxTopOfStack--; + + /* Interrupt flags cannot always be stored on the stack and will + instead be stored in a variable, which is then saved as part of the + tasks context. */ + *pxTopOfStack = portNO_CRITICAL_NESTING; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void vPortStartFirstTask( void ); + + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + prvSetupTimerInterrupt(); + + /* Start the first task. */ + vPortStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the ARM port will require this function as there + is nothing to return to. */ +} +/*-----------------------------------------------------------*/ + +/* The cooperative scheduler requires a normal IRQ service routine to +simply increment the system tick. */ +__arm __irq void vPortNonPreemptiveTick( void ) +{ + /* Increment the tick count - which may wake some tasks but as the + preemptive scheduler is not being used any woken task is not given + processor time no matter what its priority. */ + xTaskIncrementTick(); + + /* Clear the interrupt in the watchdog and EIC. */ + WDG->SR = 0x0000; + portCLEAR_EIC(); +} +/*-----------------------------------------------------------*/ + +/* This function is called from an asm wrapper, so does not require the __irq +keyword. */ +void vPortPreemptiveTick( void ) +{ + /* Increment the tick counter. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Select a new task to execute. */ + vTaskSwitchContext(); + } + + /* Clear the interrupt in the watchdog and EIC. */ + WDG->SR = 0x0000; + portCLEAR_EIC(); +} +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt( void ) +{ + /* Set the watchdog up to generate a periodic tick. */ + WDG_ECITConfig( DISABLE ); + WDG_CntOnOffConfig( DISABLE ); + WDG_PeriodValueConfig( portMICROS_PER_SECOND / configTICK_RATE_HZ ); + + /* Setup the tick interrupt in the EIC. */ + EIC_IRQChannelPriorityConfig( WDG_IRQChannel, 1 ); + EIC_IRQChannelConfig( WDG_IRQChannel, ENABLE ); + EIC_IRQConfig( ENABLE ); + WDG_ECITConfig( ENABLE ); + + /* Start the timer - interrupts are actually disabled at this point so + it is safe to do this here. */ + WDG_CntOnOffConfig( ENABLE ); +} +/*-----------------------------------------------------------*/ + +__arm __interwork void vPortEnterCritical( void ) +{ + /* Disable interrupts first! */ + __disable_interrupt(); + + /* Now interrupts are disabled ulCriticalNesting can be accessed + directly. Increment ulCriticalNesting to keep a count of how many times + portENTER_CRITICAL() has been called. */ + ulCriticalNesting++; +} +/*-----------------------------------------------------------*/ + +__arm __interwork void vPortExitCritical( void ) +{ + if( ulCriticalNesting > portNO_CRITICAL_NESTING ) + { + /* Decrement the nesting count as we are leaving a critical section. */ + ulCriticalNesting--; + + /* If the nesting level has reached zero then interrupts should be + re-enabled. */ + if( ulCriticalNesting == portNO_CRITICAL_NESTING ) + { + __enable_interrupt(); + } + } +} +/*-----------------------------------------------------------*/ + + + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/STR71x/portasm.s79 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/STR71x/portasm.s79 new file mode 100644 index 0000000..017e2a3 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/STR71x/portasm.s79 @@ -0,0 +1,102 @@ +;/* +; FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. +; All rights reserved +; +; +; *************************************************************************** +; * * +; * FreeRTOS tutorial books are available in pdf and paperback. * +; * Complete, revised, and edited pdf reference manuals are also * +; * available. * +; * * +; * Purchasing FreeRTOS documentation will not only help you, by * +; * ensuring you get running as quickly as possible and with an * +; * in-depth knowledge of how to use FreeRTOS, it will also help * +; * the FreeRTOS project to continue with its mission of providing * +; * professional grade, cross platform, de facto standard solutions * +; * for microcontrollers - completely free of charge! * +; * * +; * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * +; * * +; * Thank you for using FreeRTOS, and thank you for your support! * +; * * +; *************************************************************************** +; +; +; This file is part of the FreeRTOS distribution. +; +; FreeRTOS is free software; you can redistribute it and/or modify it under +; the terms of the GNU General Public License (version 2) as published by the +; Free Software Foundation AND MODIFIED BY the FreeRTOS exception. +; >>>NOTE<<< The modification to the GPL is included to allow you to +; distribute a combined work that includes FreeRTOS without being obliged to +; provide the source code for proprietary components outside of the FreeRTOS +; kernel. FreeRTOS is distributed in the hope that it will be useful, but +; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +; more details. You should have received a copy of the GNU General Public +; License and the FreeRTOS license exception along with FreeRTOS; if not it +; can be viewed here: http://www.freertos.org/a00114.html and also obtained +; by writing to Richard Barry, contact details for whom are available on the +; FreeRTOS WEB site. +; +; 1 tab == 4 spaces! +; +; http://www.FreeRTOS.org - Documentation, latest information, license and +; contact details. +; +; http://www.SafeRTOS.com - A version that is certified for use in safety +; critical systems. +; +; http://www.OpenRTOS.com - Commercial support, development, porting, +; licensing and training services. +;*/ + RSEG ICODE:CODE + CODE32 + + EXTERN vPortPreemptiveTick + EXTERN vTaskSwitchContext + + PUBLIC vPortYieldProcessor + PUBLIC vPortStartFirstTask + PUBLIC vPortPreemptiveTickISR + +#include "ISR_Support.h" + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Starting the first task is just a matter of restoring the context that +; was created by pxPortInitialiseStack(). +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +vPortStartFirstTask: + portRESTORE_CONTEXT + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Manual context switch function. This is the SWI hander. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +vPortYieldProcessor: + ADD LR, LR, #4 ; Add 4 to the LR to make the LR appear exactly + ; as if the context was saved during and IRQ + ; handler. + + portSAVE_CONTEXT ; Save the context of the current task... + LDR R0, =vTaskSwitchContext ; before selecting the next task to execute. + mov lr, pc + BX R0 + portRESTORE_CONTEXT ; Restore the context of the selected task. + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Preemptive context switch function. This will only ever get used if +; portUSE_PREEMPTION is set to 1 in portmacro.h. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +vPortPreemptiveTickISR: + portSAVE_CONTEXT ; Save the context of the current task. + + LDR R0, =vPortPreemptiveTick ; Increment the tick count - this may wake a task. + MOV lr, pc + BX R0 + + portRESTORE_CONTEXT ; Restore the context of the selected task. + + + END + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/STR71x/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/STR71x/portmacro.h new file mode 100644 index 0000000..3d951c3 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/STR71x/portmacro.h @@ -0,0 +1,163 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +#define portYIELD() asm ( "SWI 0" ) +#define portNOP() asm ( "NOP" ) +/*-----------------------------------------------------------*/ + +/* Critical section handling. */ +__arm __interwork void vPortDisableInterruptsFromThumb( void ); +__arm __interwork void vPortEnableInterruptsFromThumb( void ); +__arm __interwork void vPortEnterCritical( void ); +__arm __interwork void vPortExitCritical( void ); + +#define portDISABLE_INTERRUPTS() __disable_interrupt() +#define portENABLE_INTERRUPTS() __enable_interrupt() +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() +/*-----------------------------------------------------------*/ + +/* Task utilities. */ +#define portEND_SWITCHING_ISR( xSwitchRequired ) \ +{ \ +extern void vTaskSwitchContext( void ); \ + \ + if( xSwitchRequired ) \ + { \ + vTaskSwitchContext(); \ + } \ +} +/*-----------------------------------------------------------*/ + +/* EIC utilities. */ +#define portEIC_CICR_ADDR *( ( uint32_t * ) 0xFFFFF804 ) +#define portEIC_IPR_ADDR *( ( uint32_t * ) 0xFFFFF840 ) +#define portCLEAR_EIC() portEIC_IPR_ADDR = 0x01 << portEIC_CICR_ADDR + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/STR75x/ISR_Support.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/STR75x/ISR_Support.h new file mode 100644 index 0000000..f022488 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/STR75x/ISR_Support.h @@ -0,0 +1,132 @@ +;/* +; FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. +; All rights reserved +; +; +; *************************************************************************** +; * * +; * FreeRTOS tutorial books are available in pdf and paperback. * +; * Complete, revised, and edited pdf reference manuals are also * +; * available. * +; * * +; * Purchasing FreeRTOS documentation will not only help you, by * +; * ensuring you get running as quickly as possible and with an * +; * in-depth knowledge of how to use FreeRTOS, it will also help * +; * the FreeRTOS project to continue with its mission of providing * +; * professional grade, cross platform, de facto standard solutions * +; * for microcontrollers - completely free of charge! * +; * * +; * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * +; * * +; * Thank you for using FreeRTOS, and thank you for your support! * +; * * +; *************************************************************************** +; +; +; This file is part of the FreeRTOS distribution. +; +; FreeRTOS is free software; you can redistribute it and/or modify it under +; the terms of the GNU General Public License (version 2) as published by the +; Free Software Foundation AND MODIFIED BY the FreeRTOS exception. +; >>>NOTE<<< The modification to the GPL is included to allow you to +; distribute a combined work that includes FreeRTOS without being obliged to +; provide the source code for proprietary components outside of the FreeRTOS +; kernel. FreeRTOS is distributed in the hope that it will be useful, but +; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +; more details. You should have received a copy of the GNU General Public +; License and the FreeRTOS license exception along with FreeRTOS; if not it +; can be viewed here: http://www.freertos.org/a00114.html and also obtained +; by writing to Richard Barry, contact details for whom are available on the +; FreeRTOS WEB site. +; +; 1 tab == 4 spaces! +; +; http://www.FreeRTOS.org - Documentation, latest information, license and +; contact details. +; +; http://www.SafeRTOS.com - A version that is certified for use in safety +; critical systems. +; +; http://www.OpenRTOS.com - Commercial support, development, porting, +; licensing and training services. +;*/ + + EXTERN pxCurrentTCB + EXTERN ulCriticalNesting + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Context save and restore macro definitions +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +portSAVE_CONTEXT MACRO + + ; Push R0 as we are going to use the register. + STMDB SP!, {R0} + + ; Set R0 to point to the task stack pointer. + STMDB SP, {SP}^ + NOP + SUB SP, SP, #4 + LDMIA SP!, {R0} + + ; Push the return address onto the stack. + STMDB R0!, {LR} + + ; Now we have saved LR we can use it instead of R0. + MOV LR, R0 + + ; Pop R0 so we can save it onto the system mode stack. + LDMIA SP!, {R0} + + ; Push all the system mode registers onto the task stack. + STMDB LR, {R0-LR}^ + NOP + SUB LR, LR, #60 + + ; Push the SPSR onto the task stack. + MRS R0, SPSR + STMDB LR!, {R0} + + LDR R0, =ulCriticalNesting + LDR R0, [R0] + STMDB LR!, {R0} + + ; Store the new top of stack for the task. + LDR R1, =pxCurrentTCB + LDR R0, [R1] + STR LR, [R0] + + ENDM + + +portRESTORE_CONTEXT MACRO + + ; Set the LR to the task stack. + LDR R1, =pxCurrentTCB + LDR R0, [R1] + LDR LR, [R0] + + ; The critical nesting depth is the first item on the stack. + ; Load it into the ulCriticalNesting variable. + LDR R0, =ulCriticalNesting + LDMFD LR!, {R1} + STR R1, [R0] + + ; Get the SPSR from the stack. + LDMFD LR!, {R0} + MSR SPSR_cxsf, R0 + + ; Restore all system mode registers for the task. + LDMFD LR, {R0-R14}^ + NOP + + ; Restore the return address. + LDR LR, [LR, #+60] + + ; And return - correcting the offset in the LR to obtain the + ; correct address. + SUBS PC, LR, #4 + + ENDM + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/STR75x/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/STR75x/port.c new file mode 100644 index 0000000..1c75bd9 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/STR75x/port.c @@ -0,0 +1,279 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the ST STR75x ARM7 + * port. + *----------------------------------------------------------*/ + +/* Library includes. */ +#include "75x_tb.h" +#include "75x_eic.h" + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Constants required to setup the initial stack. */ +#define portINITIAL_SPSR ( ( StackType_t ) 0x3f ) /* System mode, THUMB mode, interrupts enabled. */ +#define portINSTRUCTION_SIZE ( ( StackType_t ) 4 ) + +/* Constants required to handle critical sections. */ +#define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) + +/* Prescale used on the timer clock when calculating the tick period. */ +#define portPRESCALE 20 + + +/*-----------------------------------------------------------*/ + +/* Setup the TB to generate the tick interrupts. */ +static void prvSetupTimerInterrupt( void ); + +/* ulCriticalNesting will get set to zero when the first task starts. It +cannot be initialised to 0 as this will cause interrupts to be enabled +during the kernel initialisation process. */ +uint32_t ulCriticalNesting = ( uint32_t ) 9999; + +/* Tick interrupt routines for preemptive operation. */ +__arm void vPortPreemptiveTick( void ); + +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been called. + * + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +StackType_t *pxOriginalTOS; + + pxOriginalTOS = pxTopOfStack; + + /* To ensure asserts in tasks.c don't fail, although in this case the assert + is not really required. */ + pxTopOfStack--; + + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. */ + + /* First on the stack is the return address - which in this case is the + start of the task. The offset is added to make the return address appear + as it would within an IRQ ISR. */ + *pxTopOfStack = ( StackType_t ) pxCode + portINSTRUCTION_SIZE; + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) 0xaaaaaaaa; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxOriginalTOS; /* Stack used when task starts goes in R13. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */ + pxTopOfStack--; + + /* When the task starts is will expect to find the function parameter in + R0. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + + /* The status register is set for system mode, with interrupts enabled. */ + *pxTopOfStack = ( StackType_t ) portINITIAL_SPSR; + pxTopOfStack--; + + /* Interrupt flags cannot always be stored on the stack and will + instead be stored in a variable, which is then saved as part of the + tasks context. */ + *pxTopOfStack = portNO_CRITICAL_NESTING; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void vPortStartFirstTask( void ); + + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + prvSetupTimerInterrupt(); + + /* Start the first task. */ + vPortStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the ARM port will require this function as there + is nothing to return to. */ +} +/*-----------------------------------------------------------*/ + +__arm void vPortPreemptiveTick( void ) +{ + /* Increment the tick counter. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Select a new task to execute. */ + vTaskSwitchContext(); + } + + TB_ClearITPendingBit( TB_IT_Update ); +} +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt( void ) +{ +EIC_IRQInitTypeDef EIC_IRQInitStructure; +TB_InitTypeDef TB_InitStructure; + + /* Setup the EIC for the TB. */ + EIC_IRQInitStructure.EIC_IRQChannelCmd = ENABLE; + EIC_IRQInitStructure.EIC_IRQChannel = TB_IRQChannel; + EIC_IRQInitStructure.EIC_IRQChannelPriority = 1; + EIC_IRQInit(&EIC_IRQInitStructure); + + /* Setup the TB for the generation of the tick interrupt. */ + TB_InitStructure.TB_Mode = TB_Mode_Timing; + TB_InitStructure.TB_CounterMode = TB_CounterMode_Down; + TB_InitStructure.TB_Prescaler = portPRESCALE - 1; + TB_InitStructure.TB_AutoReload = ( ( configCPU_CLOCK_HZ / portPRESCALE ) / configTICK_RATE_HZ ); + TB_Init(&TB_InitStructure); + + /* Enable TB Update interrupt */ + TB_ITConfig(TB_IT_Update, ENABLE); + + /* Clear TB Update interrupt pending bit */ + TB_ClearITPendingBit(TB_IT_Update); + + /* Enable TB */ + TB_Cmd(ENABLE); +} +/*-----------------------------------------------------------*/ + +__arm __interwork void vPortEnterCritical( void ) +{ + /* Disable interrupts first! */ + __disable_interrupt(); + + /* Now interrupts are disabled ulCriticalNesting can be accessed + directly. Increment ulCriticalNesting to keep a count of how many times + portENTER_CRITICAL() has been called. */ + ulCriticalNesting++; +} +/*-----------------------------------------------------------*/ + +__arm __interwork void vPortExitCritical( void ) +{ + if( ulCriticalNesting > portNO_CRITICAL_NESTING ) + { + /* Decrement the nesting count as we are leaving a critical section. */ + ulCriticalNesting--; + + /* If the nesting level has reached zero then interrupts should be + re-enabled. */ + if( ulCriticalNesting == portNO_CRITICAL_NESTING ) + { + __enable_interrupt(); + } + } +} +/*-----------------------------------------------------------*/ + + + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/STR75x/portasm.s79 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/STR75x/portasm.s79 new file mode 100644 index 0000000..f42fb31 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/STR75x/portasm.s79 @@ -0,0 +1,90 @@ +;/* +; FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. +; All rights reserved +; +; +; *************************************************************************** +; * * +; * FreeRTOS tutorial books are available in pdf and paperback. * +; * Complete, revised, and edited pdf reference manuals are also * +; * available. * +; * * +; * Purchasing FreeRTOS documentation will not only help you, by * +; * ensuring you get running as quickly as possible and with an * +; * in-depth knowledge of how to use FreeRTOS, it will also help * +; * the FreeRTOS project to continue with its mission of providing * +; * professional grade, cross platform, de facto standard solutions * +; * for microcontrollers - completely free of charge! * +; * * +; * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * +; * * +; * Thank you for using FreeRTOS, and thank you for your support! * +; * * +; *************************************************************************** +; +; +; This file is part of the FreeRTOS distribution. +; +; FreeRTOS is free software; you can redistribute it and/or modify it under +; the terms of the GNU General Public License (version 2) as published by the +; Free Software Foundation AND MODIFIED BY the FreeRTOS exception. +; >>>NOTE<<< The modification to the GPL is included to allow you to +; distribute a combined work that includes FreeRTOS without being obliged to +; provide the source code for proprietary components outside of the FreeRTOS +; kernel. FreeRTOS is distributed in the hope that it will be useful, but +; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +; more details. You should have received a copy of the GNU General Public +; License and the FreeRTOS license exception along with FreeRTOS; if not it +; can be viewed here: http://www.freertos.org/a00114.html and also obtained +; by writing to Richard Barry, contact details for whom are available on the +; FreeRTOS WEB site. +; +; 1 tab == 4 spaces! +; +; http://www.FreeRTOS.org - Documentation, latest information, license and +; contact details. +; +; http://www.SafeRTOS.com - A version that is certified for use in safety +; critical systems. +; +; http://www.OpenRTOS.com - Commercial support, development, porting, +; licensing and training services. +;*/ + + RSEG ICODE:CODE + CODE32 + + EXTERN vPortPreemptiveTick + EXTERN vTaskSwitchContext + + PUBLIC vPortYieldProcessor + PUBLIC vPortStartFirstTask + +#include "ISR_Support.h" + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Starting the first task is just a matter of restoring the context that +; was created by pxPortInitialiseStack(). +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +vPortStartFirstTask: + portRESTORE_CONTEXT + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Manual context switch function. This is the SWI hander. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +vPortYieldProcessor: + ADD LR, LR, #4 ; Add 4 to the LR to make the LR appear exactly + ; as if the context was saved during and IRQ + ; handler. + + portSAVE_CONTEXT ; Save the context of the current task... + LDR R0, =vTaskSwitchContext ; before selecting the next task to execute. + mov lr, pc + BX R0 + portRESTORE_CONTEXT ; Restore the context of the selected task. + + + + END + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/STR75x/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/STR75x/portmacro.h new file mode 100644 index 0000000..a29de63 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/STR75x/portmacro.h @@ -0,0 +1,154 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +#define portYIELD() asm ( "SWI 0" ) +#define portNOP() asm ( "NOP" ) +/*-----------------------------------------------------------*/ + +/* Critical section handling. */ +__arm __interwork void vPortEnterCritical( void ); +__arm __interwork void vPortExitCritical( void ); + +#define portDISABLE_INTERRUPTS() __disable_interrupt() +#define portENABLE_INTERRUPTS() __enable_interrupt() +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() +/*-----------------------------------------------------------*/ + +/* Task utilities. */ +#define portEND_SWITCHING_ISR( xSwitchRequired ) \ +{ \ +extern void vTaskSwitchContext( void ); \ + \ + if( xSwitchRequired ) \ + { \ + vTaskSwitchContext(); \ + } \ +} +/*-----------------------------------------------------------*/ + + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/STR91x/ISR_Support.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/STR91x/ISR_Support.h new file mode 100644 index 0000000..8b1578f --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/STR91x/ISR_Support.h @@ -0,0 +1,147 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + EXTERN pxCurrentTCB + EXTERN ulCriticalNesting + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Context save and restore macro definitions +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +portSAVE_CONTEXT MACRO + + ; Push R0 as we are going to use the register. + STMDB SP!, {R0} + + ; Set R0 to point to the task stack pointer. + STMDB SP, {SP}^ + NOP + SUB SP, SP, #4 + LDMIA SP!, {R0} + + ; Push the return address onto the stack. + STMDB R0!, {LR} + + ; Now we have saved LR we can use it instead of R0. + MOV LR, R0 + + ; Pop R0 so we can save it onto the system mode stack. + LDMIA SP!, {R0} + + ; Push all the system mode registers onto the task stack. + STMDB LR, {R0-LR}^ + NOP + SUB LR, LR, #60 + + ; Push the SPSR onto the task stack. + MRS R0, SPSR + STMDB LR!, {R0} + + LDR R0, =ulCriticalNesting + LDR R0, [R0] + STMDB LR!, {R0} + + ; Store the new top of stack for the task. + LDR R1, =pxCurrentTCB + LDR R0, [R1] + STR LR, [R0] + + ENDM + + +portRESTORE_CONTEXT MACRO + + ; Set the LR to the task stack. + LDR R1, =pxCurrentTCB + LDR R0, [R1] + LDR LR, [R0] + + ; The critical nesting depth is the first item on the stack. + ; Load it into the ulCriticalNesting variable. + LDR R0, =ulCriticalNesting + LDMFD LR!, {R1} + STR R1, [R0] + + ; Get the SPSR from the stack. + LDMFD LR!, {R0} + MSR SPSR_cxsf, R0 + + ; Restore all system mode registers for the task. + LDMFD LR, {R0-R14}^ + NOP + + ; Restore the return address. + LDR LR, [LR, #+60] + + ; And return - correcting the offset in the LR to obtain the + ; correct address. + SUBS PC, LR, #4 + + ENDM + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/STR91x/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/STR91x/port.c new file mode 100644 index 0000000..5153e44 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/STR91x/port.c @@ -0,0 +1,463 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the ST STR91x ARM9 + * port. + *----------------------------------------------------------*/ + +/* Library includes. */ +#include "91x_lib.h" + +/* Standard includes. */ +#include +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#ifndef configUSE_WATCHDOG_TICK + #error configUSE_WATCHDOG_TICK must be set to either 1 or 0 in FreeRTOSConfig.h to use either the Watchdog or timer 2 to generate the tick interrupt respectively. +#endif + +/* Constants required to setup the initial stack. */ +#ifndef _RUN_TASK_IN_ARM_MODE_ + #define portINITIAL_SPSR ( ( StackType_t ) 0x3f ) /* System mode, THUMB mode, interrupts enabled. */ +#else + #define portINITIAL_SPSR ( ( StackType_t ) 0x1f ) /* System mode, ARM mode, interrupts enabled. */ +#endif + +#define portINSTRUCTION_SIZE ( ( StackType_t ) 4 ) + +/* Constants required to handle critical sections. */ +#define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) + +#ifndef abs + #define abs(x) ((x)>0 ? (x) : -(x)) +#endif + +/** + * Toggle a led using the following algorithm: + * if ( GPIO_ReadBit(GPIO9, GPIO_Pin_2) ) + * { + * GPIO_WriteBit( GPIO9, GPIO_Pin_2, Bit_RESET ); + * } + * else + * { + * GPIO_WriteBit( GPIO9, GPIO_Pin_2, Bit_RESET ); + * } + * + */ +#define TOGGLE_LED(port,pin) \ + if ( ((((port)->DR[(pin)<<2])) & (pin)) != Bit_RESET ) \ + { \ + (port)->DR[(pin) <<2] = 0x00; \ + } \ + else \ + { \ + (port)->DR[(pin) <<2] = (pin); \ + } + + +/*-----------------------------------------------------------*/ + +/* Setup the watchdog to generate the tick interrupts. */ +static void prvSetupTimerInterrupt( void ); + +/* ulCriticalNesting will get set to zero when the first task starts. It +cannot be initialised to 0 as this will cause interrupts to be enabled +during the kernel initialisation process. */ +uint32_t ulCriticalNesting = ( uint32_t ) 9999; + +/* Tick interrupt routines for cooperative and preemptive operation +respectively. The preemptive version is not defined as __irq as it is called +from an asm wrapper function. */ +void WDG_IRQHandler( void ); + +/* VIC interrupt default handler. */ +static void prvDefaultHandler( void ); + +#if configUSE_WATCHDOG_TICK == 0 + /* Used to update the OCR timer register */ + static u16 s_nPulseLength; +#endif + +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been called. + * + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + StackType_t *pxOriginalTOS; + + pxOriginalTOS = pxTopOfStack; + + /* To ensure asserts in tasks.c don't fail, although in this case the assert + is not really required. */ + pxTopOfStack--; + + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. */ + + /* First on the stack is the return address - which in this case is the + start of the task. The offset is added to make the return address appear + as it would within an IRQ ISR. */ + *pxTopOfStack = ( StackType_t ) pxCode + portINSTRUCTION_SIZE; + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) 0xaaaaaaaa; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxOriginalTOS; /* Stack used when task starts goes in R13. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */ + pxTopOfStack--; + + /* When the task starts is will expect to find the function parameter in + R0. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + + /* The status register is set for system mode, with interrupts enabled. */ + *pxTopOfStack = ( StackType_t ) portINITIAL_SPSR; + pxTopOfStack--; + + /* Interrupt flags cannot always be stored on the stack and will + instead be stored in a variable, which is then saved as part of the + tasks context. */ + *pxTopOfStack = portNO_CRITICAL_NESTING; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void vPortStartFirstTask( void ); + + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + prvSetupTimerInterrupt(); + + /* Start the first task. */ + vPortStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the ARM port will require this function as there + is nothing to return to. */ +} +/*-----------------------------------------------------------*/ + +/* This function is called from an asm wrapper, so does not require the __irq +keyword. */ +#if configUSE_WATCHDOG_TICK == 1 + + static void prvFindFactors(u32 n, u16 *a, u32 *b) + { + /* This function is copied from the ST STR7 library and is + copyright STMicroelectronics. Reproduced with permission. */ + + u32 b0; + u16 a0; + int32_t err, err_min=n; + + *a = a0 = ((n-1)/65536ul) + 1; + *b = b0 = n / *a; + + for (; *a <= 256; (*a)++) + { + *b = n / *a; + err = (int32_t)*a * (int32_t)*b - (int32_t)n; + if (abs(err) > (*a / 2)) + { + (*b)++; + err = (int32_t)*a * (int32_t)*b - (int32_t)n; + } + if (abs(err) < abs(err_min)) + { + err_min = err; + a0 = *a; + b0 = *b; + if (err == 0) break; + } + } + + *a = a0; + *b = b0; + } + /*-----------------------------------------------------------*/ + + static void prvSetupTimerInterrupt( void ) + { + WDG_InitTypeDef xWdg; + uint16_t a; + uint32_t n = configCPU_PERIPH_HZ / configTICK_RATE_HZ, b; + + /* Configure the watchdog as a free running timer that generates a + periodic interrupt. */ + + SCU_APBPeriphClockConfig( __WDG, ENABLE ); + WDG_DeInit(); + WDG_StructInit(&xWdg); + prvFindFactors( n, &a, &b ); + xWdg.WDG_Prescaler = a - 1; + xWdg.WDG_Preload = b - 1; + WDG_Init( &xWdg ); + WDG_ITConfig(ENABLE); + + /* Configure the VIC for the WDG interrupt. */ + VIC_Config( WDG_ITLine, VIC_IRQ, 10 ); + VIC_ITCmd( WDG_ITLine, ENABLE ); + + /* Install the default handlers for both VIC's. */ + VIC0->DVAR = ( uint32_t ) prvDefaultHandler; + VIC1->DVAR = ( uint32_t ) prvDefaultHandler; + + WDG_Cmd(ENABLE); + } + /*-----------------------------------------------------------*/ + + void WDG_IRQHandler( void ) + { + { + /* Increment the tick counter. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Select a new task to execute. */ + vTaskSwitchContext(); + } + + /* Clear the interrupt in the watchdog. */ + WDG->SR &= ~0x0001; + } + } + +#else + + static void prvFindFactors(u32 n, u8 *a, u16 *b) + { + /* This function is copied from the ST STR7 library and is + copyright STMicroelectronics. Reproduced with permission. */ + + u16 b0; + u8 a0; + int32_t err, err_min=n; + + + *a = a0 = ((n-1)/256) + 1; + *b = b0 = n / *a; + + for (; *a <= 256; (*a)++) + { + *b = n / *a; + err = (int32_t)*a * (int32_t)*b - (int32_t)n; + if (abs(err) > (*a / 2)) + { + (*b)++; + err = (int32_t)*a * (int32_t)*b - (int32_t)n; + } + if (abs(err) < abs(err_min)) + { + err_min = err; + a0 = *a; + b0 = *b; + if (err == 0) break; + } + } + + *a = a0; + *b = b0; + } + /*-----------------------------------------------------------*/ + + static void prvSetupTimerInterrupt( void ) + { + uint8_t a; + uint16_t b; + uint32_t n = configCPU_PERIPH_HZ / configTICK_RATE_HZ; + + TIM_InitTypeDef timer; + + SCU_APBPeriphClockConfig( __TIM23, ENABLE ); + TIM_DeInit(TIM2); + TIM_StructInit(&timer); + prvFindFactors( n, &a, &b ); + + timer.TIM_Mode = TIM_OCM_CHANNEL_1; + timer.TIM_OC1_Modes = TIM_TIMING; + timer.TIM_Clock_Source = TIM_CLK_APB; + timer.TIM_Clock_Edge = TIM_CLK_EDGE_RISING; + timer.TIM_Prescaler = a-1; + timer.TIM_Pulse_Level_1 = TIM_HIGH; + timer.TIM_Pulse_Length_1 = s_nPulseLength = b-1; + + TIM_Init (TIM2, &timer); + TIM_ITConfig(TIM2, TIM_IT_OC1, ENABLE); + /* Configure the VIC for the WDG interrupt. */ + VIC_Config( TIM2_ITLine, VIC_IRQ, 10 ); + VIC_ITCmd( TIM2_ITLine, ENABLE ); + + /* Install the default handlers for both VIC's. */ + VIC0->DVAR = ( uint32_t ) prvDefaultHandler; + VIC1->DVAR = ( uint32_t ) prvDefaultHandler; + + TIM_CounterCmd(TIM2, TIM_CLEAR); + TIM_CounterCmd(TIM2, TIM_START); + } + /*-----------------------------------------------------------*/ + + void TIM2_IRQHandler( void ) + { + /* Reset the timer counter to avioid overflow. */ + TIM2->OC1R += s_nPulseLength; + + /* Increment the tick counter. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Select a new task to run. */ + vTaskSwitchContext(); + } + + /* Clear the interrupt in the watchdog. */ + TIM2->SR &= ~TIM_FLAG_OC1; + } + +#endif /* USE_WATCHDOG_TICK */ + +/*-----------------------------------------------------------*/ + +__arm __interwork void vPortEnterCritical( void ) +{ + /* Disable interrupts first! */ + portDISABLE_INTERRUPTS(); + + /* Now interrupts are disabled ulCriticalNesting can be accessed + directly. Increment ulCriticalNesting to keep a count of how many times + portENTER_CRITICAL() has been called. */ + ulCriticalNesting++; +} +/*-----------------------------------------------------------*/ + +__arm __interwork void vPortExitCritical( void ) +{ + if( ulCriticalNesting > portNO_CRITICAL_NESTING ) + { + /* Decrement the nesting count as we are leaving a critical section. */ + ulCriticalNesting--; + + /* If the nesting level has reached zero then interrupts should be + re-enabled. */ + if( ulCriticalNesting == portNO_CRITICAL_NESTING ) + { + portENABLE_INTERRUPTS(); + } + } +} +/*-----------------------------------------------------------*/ + +static void prvDefaultHandler( void ) +{ +} + + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/STR91x/portasm.s79 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/STR91x/portasm.s79 new file mode 100644 index 0000000..586b10e --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/STR91x/portasm.s79 @@ -0,0 +1,102 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + RSEG ICODE:CODE + CODE32 + + EXTERN vTaskSwitchContext + + PUBLIC vPortYieldProcessor + PUBLIC vPortStartFirstTask + +#include "ISR_Support.h" + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Starting the first task is just a matter of restoring the context that +; was created by pxPortInitialiseStack(). +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +vPortStartFirstTask: + portRESTORE_CONTEXT + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Manual context switch function. This is the SWI hander. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +vPortYieldProcessor: + ADD LR, LR, #4 ; Add 4 to the LR to make the LR appear exactly + ; as if the context was saved during and IRQ + ; handler. + + portSAVE_CONTEXT ; Save the context of the current task... + LDR R0, =vTaskSwitchContext ; before selecting the next task to execute. + MOV lr, pc + BX R0 + portRESTORE_CONTEXT ; Restore the context of the selected task. + + END + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/STR91x/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/STR91x/portmacro.h new file mode 100644 index 0000000..d1839b8 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/STR91x/portmacro.h @@ -0,0 +1,156 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +#define portYIELD() asm ( "SWI 0" ) +#define portNOP() asm ( "NOP" ) +/*-----------------------------------------------------------*/ + +/* Critical section handling. */ +__arm __interwork void vPortEnterCritical( void ); +__arm __interwork void vPortExitCritical( void ); +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() + +#define portDISABLE_INTERRUPTS() __disable_interrupt() +#define portENABLE_INTERRUPTS() __enable_interrupt() + + +/*-----------------------------------------------------------*/ + +/* Task utilities. */ +#define portEND_SWITCHING_ISR( xSwitchRequired ) \ +{ \ +extern void vTaskSwitchContext( void ); \ + \ + if( xSwitchRequired ) \ + { \ + vTaskSwitchContext(); \ + } \ +} +/*-----------------------------------------------------------*/ + + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/V850ES/ISR_Support.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/V850ES/ISR_Support.h new file mode 100644 index 0000000..8154ab6 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/V850ES/ISR_Support.h @@ -0,0 +1,191 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + EXTERN pxCurrentTCB + EXTERN usCriticalNesting + +#include "FreeRTOSConfig.h" + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Context save and restore macro definitions +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +portSAVE_CONTEXT MACRO + + add -0x0C,sp ; prepare stack to save necessary values + st.w lp,8[sp] ; store LP to stack + stsr 0,r31 + st.w lp,4[sp] ; store EIPC to stack + stsr 1,lp + st.w lp,0[sp] ; store EIPSW to stack +#if configDATA_MODE == 1 ; Using the Tiny data model + prepare {r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30},76,sp ; save general purpose registers + sst.w r19,72[ep] + sst.w r18,68[ep] + sst.w r17,64[ep] + sst.w r16,60[ep] + sst.w r15,56[ep] + sst.w r14,52[ep] + sst.w r13,48[ep] + sst.w r12,44[ep] + sst.w r11,40[ep] + sst.w r10,36[ep] + sst.w r9,32[ep] + sst.w r8,28[ep] + sst.w r7,24[ep] + sst.w r6,20[ep] + sst.w r5,16[ep] + sst.w r4,12[ep] +#else ; Using the Small/Large data model + prepare {r20,r21,r22,r23,r24,r26,r27,r28,r29,r30},72,sp ; save general purpose registers + sst.w r19,68[ep] + sst.w r18,64[ep] + sst.w r17,60[ep] + sst.w r16,56[ep] + sst.w r15,52[ep] + sst.w r14,48[ep] + sst.w r13,44[ep] + sst.w r12,40[ep] + sst.w r11,36[ep] + sst.w r10,32[ep] + sst.w r9,28[ep] + sst.w r8,24[ep] + sst.w r7,20[ep] + sst.w r6,16[ep] + sst.w r5,12[ep] +#endif /* configDATA_MODE */ + sst.w r2,8[ep] + sst.w r1,4[ep] + MOVHI hi1(usCriticalNesting),r0,r1 ; save usCriticalNesting value to stack + ld.w lw1(usCriticalNesting)[r1],r2 + sst.w r2,0[ep] + MOVHI hi1(pxCurrentTCB),r0,r1 ; save SP to top of current TCB + ld.w lw1(pxCurrentTCB)[r1],r2 + st.w sp,0[r2] + ENDM + + +portRESTORE_CONTEXT MACRO + + MOVHI hi1(pxCurrentTCB),r0,r1 ; get Stackpointer address + ld.w lw1(pxCurrentTCB)[r1],sp + MOV sp,r1 + ld.w 0[r1],sp ; load stackpointer + MOV sp,ep ; set stack pointer to element pointer + sld.w 0[ep],r1 ; load usCriticalNesting value from stack + MOVHI hi1(usCriticalNesting),r0,r2 + st.w r1,lw1(usCriticalNesting)[r2] + sld.w 4[ep],r1 ; restore general purpose registers + sld.w 8[ep],r2 +#if configDATA_MODE == 1 ; Using Tiny data model + sld.w 12[ep],r4 + sld.w 16[ep],r5 + sld.w 20[ep],r6 + sld.w 24[ep],r7 + sld.w 28[ep],r8 + sld.w 32[ep],r9 + sld.w 36[ep],r10 + sld.w 40[ep],r11 + sld.w 44[ep],r12 + sld.w 48[ep],r13 + sld.w 52[ep],r14 + sld.w 56[ep],r15 + sld.w 60[ep],r16 + sld.w 64[ep],r17 + sld.w 68[ep],r18 + sld.w 72[ep],r19 + dispose 76,{r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30} +#else ; Using Small/Large data model + sld.w 12[ep],r5 + sld.w 16[ep],r6 + sld.w 20[ep],r7 + sld.w 24[ep],r8 + sld.w 28[ep],r9 + sld.w 32[ep],r10 + sld.w 36[ep],r11 + sld.w 40[ep],r12 + sld.w 44[ep],r13 + sld.w 48[ep],r14 + sld.w 52[ep],r15 + sld.w 56[ep],r16 + sld.w 60[ep],r17 + sld.w 64[ep],r18 + sld.w 68[ep],r19 + dispose 72,{r20,r21,r22,r23,r24,r26,r27,r28,r29,r30} +#endif /* configDATA_MODE */ + ld.w 0[sp],lp ; restore EIPSW from stack + ldsr lp,1 + ld.w 4[sp],lp ; restore EIPC from stack + ldsr lp,0 + ld.w 8[sp],lp ; restore LP from stack + add 0x0C,sp ; set SP to right position + + RETI + + ENDM diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/V850ES/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/V850ES/port.c new file mode 100644 index 0000000..b847127 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/V850ES/port.c @@ -0,0 +1,225 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Critical nesting should be initialised to a non zero value so interrupts don't +accidentally get enabled before the scheduler is started. */ +#define portINITIAL_CRITICAL_NESTING (( StackType_t ) 10) + +/* The PSW value assigned to tasks when they start to run for the first time. */ +#define portPSW (( StackType_t ) 0x00000000) + +/* We require the address of the pxCurrentTCB variable, but don't want to know +any details of its type. */ +typedef void TCB_t; +extern volatile TCB_t * volatile pxCurrentTCB; + +/* Keeps track of the nesting level of critical sections. */ +volatile StackType_t usCriticalNesting = portINITIAL_CRITICAL_NESTING; +/*-----------------------------------------------------------*/ + +/* Sets up the timer to generate the tick interrupt. */ +static void prvSetupTimerInterrupt( void ); + +/*-----------------------------------------------------------*/ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + *pxTopOfStack = ( StackType_t ) pxCode; /* Task function start address */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* Task function start address */ + pxTopOfStack--; + *pxTopOfStack = portPSW; /* Initial PSW value */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x20202020; /* Initial Value of R20 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x21212121; /* Initial Value of R21 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x22222222; /* Initial Value of R22 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x23232323; /* Initial Value of R23 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x24242424; /* Initial Value of R24 */ + pxTopOfStack--; +#if (__DATA_MODEL__ == 0) || (__DATA_MODEL__ == 1) + *pxTopOfStack = ( StackType_t ) 0x25252525; /* Initial Value of R25 */ + pxTopOfStack--; +#endif /* configDATA_MODE */ + *pxTopOfStack = ( StackType_t ) 0x26262626; /* Initial Value of R26 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x27272727; /* Initial Value of R27 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x28282828; /* Initial Value of R28 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x29292929; /* Initial Value of R29 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x30303030; /* Initial Value of R30 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x19191919; /* Initial Value of R19 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x18181818; /* Initial Value of R18 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x17171717; /* Initial Value of R17 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x16161616; /* Initial Value of R16 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x15151515; /* Initial Value of R15 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x14141414; /* Initial Value of R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x13131313; /* Initial Value of R13 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212; /* Initial Value of R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111; /* Initial Value of R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010; /* Initial Value of R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x99999999; /* Initial Value of R09 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x88888888; /* Initial Value of R08 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x77777777; /* Initial Value of R07 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x66666666; /* Initial Value of R06 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x55555555; /* Initial Value of R05 */ + pxTopOfStack--; +#if __DATA_MODEL__ == 0 || __DATA_MODEL__ == 1 + *pxTopOfStack = ( StackType_t ) 0x44444444; /* Initial Value of R04 */ + pxTopOfStack--; +#endif /* configDATA_MODE */ + *pxTopOfStack = ( StackType_t ) 0x22222222; /* Initial Value of R02 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters; /* R1 is expected to hold the function parameter*/ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portNO_CRITICAL_SECTION_NESTING; + + /* + * Return a pointer to the top of the stack we have generated so this can + * be stored in the task control block for the task. + */ + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* Setup the hardware to generate the tick. Interrupts are disabled when + this function is called. */ + prvSetupTimerInterrupt(); + + /* Restore the context of the first task that is going to run. */ + vPortStart(); + + /* Should not get here as the tasks are now running! */ + return pdTRUE; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the V850ES/Fx3 port will get stopped. If required simply + disable the tick interrupt here. */ +} +/*-----------------------------------------------------------*/ + +/* + * Hardware initialisation to generate the RTOS tick. This uses + */ +static void prvSetupTimerInterrupt( void ) +{ + TM0CE = 0; /* TMM0 operation disable */ + TM0EQMK0 = 1; /* INTTM0EQ0 interrupt disable */ + TM0EQIF0 = 0; /* clear INTTM0EQ0 interrupt flag */ + + #ifdef __IAR_V850ES_Fx3__ + { + TM0CMP0 = (((configCPU_CLOCK_HZ / configTICK_RATE_HZ) / 2)-1); /* divided by 2 because peripherals only run at CPU_CLOCK/2 */ + } + #else + { + TM0CMP0 = (configCPU_CLOCK_HZ / configTICK_RATE_HZ); + } + #endif + + TM0EQIC0 &= 0xF8; + TM0CTL0 = 0x00; + TM0EQIF0 = 0; /* clear INTTM0EQ0 interrupt flag */ + TM0EQMK0 = 0; /* INTTM0EQ0 interrupt enable */ + TM0CE = 1; /* TMM0 operation enable */ +} +/*-----------------------------------------------------------*/ + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/V850ES/portasm.s85 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/V850ES/portasm.s85 new file mode 100644 index 0000000..e8cfa4b --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/V850ES/portasm.s85 @@ -0,0 +1,342 @@ +;/* +; FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. +; All rights reserved +; +; +; *************************************************************************** +; * * +; * FreeRTOS tutorial books are available in pdf and paperback. * +; * Complete, revised, and edited pdf reference manuals are also * +; * available. * +; * * +; * Purchasing FreeRTOS documentation will not only help you, by * +; * ensuring you get running as quickly as possible and with an * +; * in-depth knowledge of how to use FreeRTOS, it will also help * +; * the FreeRTOS project to continue with its mission of providing * +; * professional grade, cross platform, de facto standard solutions * +; * for microcontrollers - completely free of charge! * +; * * +; * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * +; * * +; * Thank you for using FreeRTOS, and thank you for your support! * +; * * +; *************************************************************************** +; +; +; This file is part of the FreeRTOS distribution. +; +; FreeRTOS is free software; you can redistribute it and/or modify it under +; the terms of the GNU General Public License (version 2) as published by the +; Free Software Foundation AND MODIFIED BY the FreeRTOS exception. +; >>>NOTE<<< The modification to the GPL is included to allow you to +; distribute a combined work that includes FreeRTOS without being obliged to +; provide the source code for proprietary components outside of the FreeRTOS +; kernel. FreeRTOS is distributed in the hope that it will be useful, but +; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +; more details. You should have received a copy of the GNU General Public +; License and the FreeRTOS license exception along with FreeRTOS; if not it +; can be viewed here: http://www.freertos.org/a00114.html and also obtained +; by writing to Richard Barry, contact details for whom are available on the +; FreeRTOS WEB site. +; +; 1 tab == 4 spaces! +; +; http://www.FreeRTOS.org - Documentation, latest information, license and +; contact details. +; +; http://www.SafeRTOS.com - A version that is certified for use in safety +; critical systems. +; +; http://www.OpenRTOS.com - Commercial support, development, porting, +; licensing and training services. +;*/ +; Note: Select the correct include files for the device used by the application. +#include "FreeRTOSConfig.h" +;------------------------------------------------------------------------------ + +; Functions used by scheduler +;------------------------------------------------------------------------------ + EXTERN vTaskSwitchContext + EXTERN xTaskIncrementTick + +; Variables used by scheduler +;------------------------------------------------------------------------------ + EXTERN pxCurrentTCB + EXTERN usCriticalNesting + +; Functions implemented in this file +;------------------------------------------------------------------------------ + PUBLIC vPortYield + PUBLIC vPortStart + +; Security ID definition +;------------------------------------------------------------------------------ +#define CG_SECURITY0 0FFH +#define CG_SECURITY1 0FFH +#define CG_SECURITY2 0FFH +#define CG_SECURITY3 0FFH +#define CG_SECURITY4 0FFH +#define CG_SECURITY5 0FFH +#define CG_SECURITY6 0FFH +#define CG_SECURITY7 0FFH +#define CG_SECURITY8 0FFH +#define CG_SECURITY9 0FFH + +; Tick ISR Prototype +;------------------------------------------------------------------------------ + PUBWEAK `??MD_INTTM0EQ0??INTVEC 640` + PUBLIC MD_INTTM0EQ0 + +MD_INTTM0EQ0 SYMBOL "MD_INTTM0EQ0" +`??MD_INTTM0EQ0??INTVEC 640` SYMBOL "??INTVEC 640", MD_INTTM0EQ0 + +;------------------------------------------------------------------------------ +; portSAVE_CONTEXT MACRO +; Saves the context of the remaining general purpose registers +; and the usCriticalNesting Value of the active Task onto the task stack +; saves stack pointer to the TCB +;------------------------------------------------------------------------------ +portSAVE_CONTEXT MACRO +#if configDATA_MODE == 1 ; Using the Tiny data model + prepare {r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30},76,sp ; save general purpose registers + sst.w r19,72[ep] + sst.w r18,68[ep] + sst.w r17,64[ep] + sst.w r16,60[ep] + sst.w r15,56[ep] + sst.w r14,52[ep] + sst.w r13,48[ep] + sst.w r12,44[ep] + sst.w r11,40[ep] + sst.w r10,36[ep] + sst.w r9,32[ep] + sst.w r8,28[ep] + sst.w r7,24[ep] + sst.w r6,20[ep] + sst.w r5,16[ep] + sst.w r4,12[ep] +#else ; Using the Small/Large data model + prepare {r20,r21,r22,r23,r24,r26,r27,r28,r29,r30},72,sp ; save general purpose registers + sst.w r19,68[ep] + sst.w r18,64[ep] + sst.w r17,60[ep] + sst.w r16,56[ep] + sst.w r15,52[ep] + sst.w r14,48[ep] + sst.w r13,44[ep] + sst.w r12,40[ep] + sst.w r11,36[ep] + sst.w r10,32[ep] + sst.w r9,28[ep] + sst.w r8,24[ep] + sst.w r7,20[ep] + sst.w r6,16[ep] + sst.w r5,12[ep] +#endif /* configDATA_MODE */ + sst.w r2,8[ep] + sst.w r1,4[ep] + MOVHI hi1(usCriticalNesting),r0,r1 ; save usCriticalNesting value to stack + ld.w lw1(usCriticalNesting)[r1],r2 + sst.w r2,0[ep] + MOVHI hi1(pxCurrentTCB),r0,r1 ; save SP to top of current TCB + ld.w lw1(pxCurrentTCB)[r1],r2 + st.w sp,0[r2] + ENDM +;------------------------------------------------------------------------------ + +;------------------------------------------------------------------------------ +; portRESTORE_CONTEXT MACRO +; Gets stack pointer from the current TCB +; Restores the context of the usCriticalNesting value and general purpose +; registers of the selected task from the task stack +;------------------------------------------------------------------------------ +portRESTORE_CONTEXT MACRO + MOVHI hi1(pxCurrentTCB),r0,r1 ; get Stackpointer address + ld.w lw1(pxCurrentTCB)[r1],sp + MOV sp,r1 + ld.w 0[r1],sp ; load stackpointer + MOV sp,ep ; set stack pointer to element pointer + sld.w 0[ep],r1 ; load usCriticalNesting value from stack + MOVHI hi1(usCriticalNesting),r0,r2 + st.w r1,lw1(usCriticalNesting)[r2] + sld.w 4[ep],r1 ; restore general purpose registers + sld.w 8[ep],r2 +#if configDATA_MODE == 1 ; Using Tiny data model + sld.w 12[ep],r4 + sld.w 16[ep],r5 + sld.w 20[ep],r6 + sld.w 24[ep],r7 + sld.w 28[ep],r8 + sld.w 32[ep],r9 + sld.w 36[ep],r10 + sld.w 40[ep],r11 + sld.w 44[ep],r12 + sld.w 48[ep],r13 + sld.w 52[ep],r14 + sld.w 56[ep],r15 + sld.w 60[ep],r16 + sld.w 64[ep],r17 + sld.w 68[ep],r18 + sld.w 72[ep],r19 + dispose 76,{r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30} +#else ; Using Small/Large data model + sld.w 12[ep],r5 + sld.w 16[ep],r6 + sld.w 20[ep],r7 + sld.w 24[ep],r8 + sld.w 28[ep],r9 + sld.w 32[ep],r10 + sld.w 36[ep],r11 + sld.w 40[ep],r12 + sld.w 44[ep],r13 + sld.w 48[ep],r14 + sld.w 52[ep],r15 + sld.w 56[ep],r16 + sld.w 60[ep],r17 + sld.w 64[ep],r18 + sld.w 68[ep],r19 + dispose 72,{r20,r21,r22,r23,r24,r26,r27,r28,r29,r30} +#endif /* configDATA_MODE */ + ENDM +;------------------------------------------------------------------------------ + +;------------------------------------------------------------------------------ +; Restore the context of the first task that is going to run. +; +; Input: NONE +; +; Call: CALL vPortStart +; +; Output: NONE +;------------------------------------------------------------------------------ + RSEG CODE:CODE +vPortStart: + portRESTORE_CONTEXT ; Restore the context of whichever task the ... + ld.w 0[sp],lp + ldsr lp,5 ; restore PSW + DI + ld.w 4[sp],lp ; restore LP + ld.w 8[sp],lp ; restore LP + ADD 0x0C,sp ; set SP to right position + EI + jmp [lp] +;------------------------------------------------------------------------------ + +;------------------------------------------------------------------------------ +; Port Yield function to check for a Task switch in the cooperative and +; preemptive mode +; +; Input: NONE +; +; Call: CALL vPortYield +; +; Output: NONE +;------------------------------------------------------------------------------ + + RSEG CODE:CODE +vPortYield: + + add -0x0C,sp ; prepare stack to save necessary values + st.w lp,8[sp] ; store LP to stack + stsr 0,r31 + st.w lp,4[sp] ; store EIPC to stack + stsr 1,lp + st.w lp,0[sp] ; store EIPSW to stack + portSAVE_CONTEXT ; Save the context of the current task. + jarl vTaskSwitchContext,lp ; Call the scheduler. + portRESTORE_CONTEXT ; Restore the context of whichever task the ... + ; ... scheduler decided should run. + ld.w 0[sp],lp ; restore EIPSW from stack + ldsr lp,1 + ld.w 4[sp],lp ; restore EIPC from stack + ldsr lp,0 + ld.w 8[sp],lp ; restore LP from stack + add 0x0C,sp ; set SP to right position + + RETI + +;------------------------------------------------------------------------------ + +;------------------------------------------------------------------------------ +; Perform the necessary steps of the Tick Count Increment and Task Switch +; depending on the chosen kernel configuration +; +; Input: NONE +; +; Call: ISR +; +; Output: NONE +;------------------------------------------------------------------------------ +#if configUSE_PREEMPTION == 1 ; use preemptive kernel mode + +MD_INTTM0EQ0: + + add -0x0C,sp ; prepare stack to save necessary values + st.w lp,8[sp] ; store LP to stack + stsr 0,r31 + st.w lp,4[sp] ; store EIPC to stack + stsr 1,lp + st.w lp,0[sp] ; store EIPSW to stack + portSAVE_CONTEXT ; Save the context of the current task. + jarl xTaskIncrementTick,lp ; Call the timer tick function. + jarl vTaskSwitchContext,lp ; Call the scheduler. + portRESTORE_CONTEXT ; Restore the context of whichever task the ... + ; ... scheduler decided should run. + ld.w 0[sp],lp ; restore EIPSW from stack + ldsr lp,1 + ld.w 4[sp],lp ; restore EIPC from stack + ldsr lp,0 + ld.w 8[sp],lp ; restore LP from stack + add 0x0C,sp ; set SP to right position + + RETI +;------------------------------------------------------------------------------ +#else ; use cooperative kernel mode + +MD_INTTM0EQ0: + prepare {lp,ep},8,sp + sst.w r1,4[ep] + sst.w r5,0[ep] + jarl xTaskIncrementTick,lp ; Call the timer tick function. + sld.w 0[ep],r5 + sld.w 4[ep],r1 + dispose 8,{lp,ep} + RETI +#endif /* configUSE_PREEMPTION */ + +;------------------------------------------------------------------------------ + COMMON INTVEC:CODE:ROOT(2) + ORG 640 +`??MD_INTTM0EQ0??INTVEC 640`: + JR MD_INTTM0EQ0 + + RSEG NEAR_ID:CONST:SORT:NOROOT(2) +`?`: + DW 10 + + COMMON INTVEC:CODE:ROOT(2) + ORG 40H +`??vPortYield??INTVEC 40`: + JR vPortYield + +;------------------------------------------------------------------------------ +; set microcontroller security ID + + COMMON INTVEC:CODE:ROOT(2) + ORG 70H +`SECUID`: + DB CG_SECURITY0 + DB CG_SECURITY1 + DB CG_SECURITY2 + DB CG_SECURITY3 + DB CG_SECURITY4 + DB CG_SECURITY5 + DB CG_SECURITY6 + DB CG_SECURITY7 + DB CG_SECURITY8 + DB CG_SECURITY9 + + + END + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/V850ES/portasm_Fx3.s85 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/V850ES/portasm_Fx3.s85 new file mode 100644 index 0000000..8c6ec3d --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/V850ES/portasm_Fx3.s85 @@ -0,0 +1,362 @@ +;/* +; FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. +; All rights reserved +; +; +; *************************************************************************** +; * * +; * FreeRTOS tutorial books are available in pdf and paperback. * +; * Complete, revised, and edited pdf reference manuals are also * +; * available. * +; * * +; * Purchasing FreeRTOS documentation will not only help you, by * +; * ensuring you get running as quickly as possible and with an * +; * in-depth knowledge of how to use FreeRTOS, it will also help * +; * the FreeRTOS project to continue with its mission of providing * +; * professional grade, cross platform, de facto standard solutions * +; * for microcontrollers - completely free of charge! * +; * * +; * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * +; * * +; * Thank you for using FreeRTOS, and thank you for your support! * +; * * +; *************************************************************************** +; +; +; This file is part of the FreeRTOS distribution. +; +; FreeRTOS is free software; you can redistribute it and/or modify it under +; the terms of the GNU General Public License (version 2) as published by the +; Free Software Foundation AND MODIFIED BY the FreeRTOS exception. +; >>>NOTE<<< The modification to the GPL is included to allow you to +; distribute a combined work that includes FreeRTOS without being obliged to +; provide the source code for proprietary components outside of the FreeRTOS +; kernel. FreeRTOS is distributed in the hope that it will be useful, but +; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +; more details. You should have received a copy of the GNU General Public +; License and the FreeRTOS license exception along with FreeRTOS; if not it +; can be viewed here: http://www.freertos.org/a00114.html and also obtained +; by writing to Richard Barry, contact details for whom are available on the +; FreeRTOS WEB site. +; +; 1 tab == 4 spaces! +; +; http://www.FreeRTOS.org - Documentation, latest information, license and +; contact details. +; +; http://www.SafeRTOS.com - A version that is certified for use in safety +; critical systems. +; +; http://www.OpenRTOS.com - Commercial support, development, porting, +; licensing and training services. +;*/ +; Note: Select the correct include files for the device used by the application. +#include "FreeRTOSConfig.h" +;------------------------------------------------------------------------------ + +; Functions used by scheduler +;------------------------------------------------------------------------------ + EXTERN vTaskSwitchContext + EXTERN xTaskIncrementTick + +; Variables used by scheduler +;------------------------------------------------------------------------------ + EXTERN pxCurrentTCB + EXTERN usCriticalNesting + +; Functions implemented in this file +;------------------------------------------------------------------------------ + PUBLIC vPortYield + PUBLIC vPortStart + +; Security ID definition +;------------------------------------------------------------------------------ +#define CG_SECURITY0 0FFH +#define CG_SECURITY1 0FFH +#define CG_SECURITY2 0FFH +#define CG_SECURITY3 0FFH +#define CG_SECURITY4 0FFH +#define CG_SECURITY5 0FFH +#define CG_SECURITY6 0FFH +#define CG_SECURITY7 0FFH +#define CG_SECURITY8 0FFH +#define CG_SECURITY9 0FFH + +; Option Byte definitions +;------------------------------------------------------------------------------ +#define CG_OPTION7A 0x00 +#define CG_OPTION7B 0x04 +#define OPT7C 0x00 +#define OPT7D 0x00 +#define OPT7E 0x00 +#define OPT7F 0x00 + +; Tick ISR Prototype +;------------------------------------------------------------------------------ + PUBWEAK `??MD_INTTM0EQ0??INTVEC 608` + PUBLIC MD_INTTM0EQ0 + +MD_INTTM0EQ0 SYMBOL "MD_INTTM0EQ0" +`??MD_INTTM0EQ0??INTVEC 608` SYMBOL "??INTVEC 608", MD_INTTM0EQ0 + +;------------------------------------------------------------------------------ +; portSAVE_CONTEXT MACRO +; Saves the context of the remaining general purpose registers +; and the usCriticalNesting Value of the active Task onto the task stack +; saves stack pointer to the TCB +;------------------------------------------------------------------------------ +portSAVE_CONTEXT MACRO +#if configDATA_MODE == 1 ; Using the Tiny data model + prepare {r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30},76,sp ; save general purpose registers + sst.w r19,72[ep] + sst.w r18,68[ep] + sst.w r17,64[ep] + sst.w r16,60[ep] + sst.w r15,56[ep] + sst.w r14,52[ep] + sst.w r13,48[ep] + sst.w r12,44[ep] + sst.w r11,40[ep] + sst.w r10,36[ep] + sst.w r9,32[ep] + sst.w r8,28[ep] + sst.w r7,24[ep] + sst.w r6,20[ep] + sst.w r5,16[ep] + sst.w r4,12[ep] +#else ; Using the Small/Large data model + prepare {r20,r21,r22,r23,r24,r26,r27,r28,r29,r30},72,sp ; save general purpose registers + sst.w r19,68[ep] + sst.w r18,64[ep] + sst.w r17,60[ep] + sst.w r16,56[ep] + sst.w r15,52[ep] + sst.w r14,48[ep] + sst.w r13,44[ep] + sst.w r12,40[ep] + sst.w r11,36[ep] + sst.w r10,32[ep] + sst.w r9,28[ep] + sst.w r8,24[ep] + sst.w r7,20[ep] + sst.w r6,16[ep] + sst.w r5,12[ep] +#endif /* configDATA_MODE */ + sst.w r2,8[ep] + sst.w r1,4[ep] + MOVHI hi1(usCriticalNesting),r0,r1 ; save usCriticalNesting value to stack + ld.w lw1(usCriticalNesting)[r1],r2 + sst.w r2,0[ep] + MOVHI hi1(pxCurrentTCB),r0,r1 ; save SP to top of current TCB + ld.w lw1(pxCurrentTCB)[r1],r2 + st.w sp,0[r2] + ENDM +;------------------------------------------------------------------------------ + +;------------------------------------------------------------------------------ +; portRESTORE_CONTEXT MACRO +; Gets stack pointer from the current TCB +; Restores the context of the usCriticalNesting value and general purpose +; registers of the selected task from the task stack +;------------------------------------------------------------------------------ +portRESTORE_CONTEXT MACRO + MOVHI hi1(pxCurrentTCB),r0,r1 ; get Stackpointer address + ld.w lw1(pxCurrentTCB)[r1],sp + MOV sp,r1 + ld.w 0[r1],sp ; load stackpointer + MOV sp,ep ; set stack pointer to element pointer + sld.w 0[ep],r1 ; load usCriticalNesting value from stack + MOVHI hi1(usCriticalNesting),r0,r2 + st.w r1,lw1(usCriticalNesting)[r2] + sld.w 4[ep],r1 ; restore general purpose registers + sld.w 8[ep],r2 +#if configDATA_MODE == 1 ; Using Tiny data model + sld.w 12[ep],r4 + sld.w 16[ep],r5 + sld.w 20[ep],r6 + sld.w 24[ep],r7 + sld.w 28[ep],r8 + sld.w 32[ep],r9 + sld.w 36[ep],r10 + sld.w 40[ep],r11 + sld.w 44[ep],r12 + sld.w 48[ep],r13 + sld.w 52[ep],r14 + sld.w 56[ep],r15 + sld.w 60[ep],r16 + sld.w 64[ep],r17 + sld.w 68[ep],r18 + sld.w 72[ep],r19 + dispose 76,{r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30} +#else ; Using Small/Large data model + sld.w 12[ep],r5 + sld.w 16[ep],r6 + sld.w 20[ep],r7 + sld.w 24[ep],r8 + sld.w 28[ep],r9 + sld.w 32[ep],r10 + sld.w 36[ep],r11 + sld.w 40[ep],r12 + sld.w 44[ep],r13 + sld.w 48[ep],r14 + sld.w 52[ep],r15 + sld.w 56[ep],r16 + sld.w 60[ep],r17 + sld.w 64[ep],r18 + sld.w 68[ep],r19 + dispose 72,{r20,r21,r22,r23,r24,r26,r27,r28,r29,r30} +#endif /* configDATA_MODE */ + ENDM +;------------------------------------------------------------------------------ + +;------------------------------------------------------------------------------ +; Restore the context of the first task that is going to run. +; +; Input: NONE +; +; Call: CALL vPortStart +; +; Output: NONE +;------------------------------------------------------------------------------ + RSEG CODE:CODE +vPortStart: + portRESTORE_CONTEXT ; Restore the context of whichever task the ... + ld.w 0[sp],lp + ldsr lp,5 ; restore PSW + DI + ld.w 4[sp],lp ; restore LP + ld.w 8[sp],lp ; restore LP + ADD 0x0C,sp ; set SP to right position + EI + jmp [lp] +;------------------------------------------------------------------------------ + +;------------------------------------------------------------------------------ +; Port Yield function to check for a Task switch in the cooperative and +; preemptive mode +; +; Input: NONE +; +; Call: CALL vPortYield +; +; Output: NONE +;------------------------------------------------------------------------------ + + RSEG CODE:CODE +vPortYield: + + add -0x0C,sp ; prepare stack to save necessary values + st.w lp,8[sp] ; store LP to stack + stsr 0,r31 + st.w lp,4[sp] ; store EIPC to stack + stsr 1,lp + st.w lp,0[sp] ; store EIPSW to stack + portSAVE_CONTEXT ; Save the context of the current task. + jarl vTaskSwitchContext,lp ; Call the scheduler. + portRESTORE_CONTEXT ; Restore the context of whichever task the ... + ; ... scheduler decided should run. + ld.w 0[sp],lp ; restore EIPSW from stack + ldsr lp,1 + ld.w 4[sp],lp ; restore EIPC from stack + ldsr lp,0 + ld.w 8[sp],lp ; restore LP from stack + add 0x0C,sp ; set SP to right position + + RETI + +;------------------------------------------------------------------------------ + +;------------------------------------------------------------------------------ +; Perform the necessary steps of the Tick Count Increment and Task Switch +; depending on the chosen kernel configuration +; +; Input: NONE +; +; Call: ISR +; +; Output: NONE +;------------------------------------------------------------------------------ +#if configUSE_PREEMPTION == 1 ; use preemptive kernel mode + +MD_INTTM0EQ0: + + add -0x0C,sp ; prepare stack to save necessary values + st.w lp,8[sp] ; store LP to stack + stsr 0,r31 + st.w lp,4[sp] ; store EIPC to stack + stsr 1,lp + st.w lp,0[sp] ; store EIPSW to stack + portSAVE_CONTEXT ; Save the context of the current task. + jarl xTaskIncrementTick,lp ; Call the timer tick function. + jarl vTaskSwitchContext,lp ; Call the scheduler. + portRESTORE_CONTEXT ; Restore the context of whichever task the ... + ; ... scheduler decided should run. + ld.w 0[sp],lp ; restore EIPSW from stack + ldsr lp,1 + ld.w 4[sp],lp ; restore EIPC from stack + ldsr lp,0 + ld.w 8[sp],lp ; restore LP from stack + add 0x0C,sp ; set SP to right position + + RETI +;------------------------------------------------------------------------------ +#else ; use cooperative kernel mode + +MD_INTTM0EQ0: + prepare {lp,ep},8,sp + sst.w r1,4[ep] + sst.w r5,0[ep] + jarl xTaskIncrementTick,lp ; Call the timer tick function. + sld.w 0[ep],r5 + sld.w 4[ep],r1 + dispose 8,{lp,ep} + RETI +#endif /* configUSE_PREEMPTION */ + +;------------------------------------------------------------------------------ + COMMON INTVEC:CODE:ROOT(2) + ORG 608 +`??MD_INTTM0EQ0??INTVEC 608`: + JR MD_INTTM0EQ0 + + RSEG NEAR_ID:CONST:SORT:NOROOT(2) +`?`: + DW 10 + + COMMON INTVEC:CODE:ROOT(2) + ORG 40H +`??vPortYield??INTVEC 40`: + JR vPortYield + +;------------------------------------------------------------------------------ +; set microcontroller security ID + + COMMON INTVEC:CODE:ROOT(2) + ORG 70H +`SECUID`: + DB CG_SECURITY0 + DB CG_SECURITY1 + DB CG_SECURITY2 + DB CG_SECURITY3 + DB CG_SECURITY4 + DB CG_SECURITY5 + DB CG_SECURITY6 + DB CG_SECURITY7 + DB CG_SECURITY8 + DB CG_SECURITY9 + +;------------------------------------------------------------------------------ +; set microcontroller option bytes + + COMMON INTVEC:CODE:ROOT(2) + ORG 7AH +`OPTBYTES`: + DB CG_OPTION7A + DB CG_OPTION7B + DB OPT7C + DB OPT7D + DB OPT7E + DB OPT7F + + END \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/V850ES/portasm_Hx2.s85 b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/V850ES/portasm_Hx2.s85 new file mode 100644 index 0000000..5a048c4 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/V850ES/portasm_Hx2.s85 @@ -0,0 +1,377 @@ +;/* +; FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. +; All rights reserved +; +; +; *************************************************************************** +; * * +; * FreeRTOS tutorial books are available in pdf and paperback. * +; * Complete, revised, and edited pdf reference manuals are also * +; * available. * +; * * +; * Purchasing FreeRTOS documentation will not only help you, by * +; * ensuring you get running as quickly as possible and with an * +; * in-depth knowledge of how to use FreeRTOS, it will also help * +; * the FreeRTOS project to continue with its mission of providing * +; * professional grade, cross platform, de facto standard solutions * +; * for microcontrollers - completely free of charge! * +; * * +; * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * +; * * +; * Thank you for using FreeRTOS, and thank you for your support! * +; * * +; *************************************************************************** +; +; +; This file is part of the FreeRTOS distribution. +; +; FreeRTOS is free software; you can redistribute it and/or modify it under +; the terms of the GNU General Public License (version 2) as published by the +; Free Software Foundation AND MODIFIED BY the FreeRTOS exception. +; >>>NOTE<<< The modification to the GPL is included to allow you to +; distribute a combined work that includes FreeRTOS without being obliged to +; provide the source code for proprietary components outside of the FreeRTOS +; kernel. FreeRTOS is distributed in the hope that it will be useful, but +; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +; more details. You should have received a copy of the GNU General Public +; License and the FreeRTOS license exception along with FreeRTOS; if not it +; can be viewed here: http://www.freertos.org/a00114.html and also obtained +; by writing to Richard Barry, contact details for whom are available on the +; FreeRTOS WEB site. +; +; 1 tab == 4 spaces! +; +; http://www.FreeRTOS.org - Documentation, latest information, license and +; contact details. +; +; http://www.SafeRTOS.com - A version that is certified for use in safety +; critical systems. +; +; http://www.OpenRTOS.com - Commercial support, development, porting, +; licensing and training services. +;*/ +; Note: Select the correct include files for the device used by the application. +#include "FreeRTOSConfig.h" +;------------------------------------------------------------------------------ + +; Functions used by scheduler +;------------------------------------------------------------------------------ + EXTERN vTaskSwitchContext + EXTERN xTaskIncrementTick + +; Variables used by scheduler +;------------------------------------------------------------------------------ + EXTERN pxCurrentTCB + EXTERN usCriticalNesting + +; Functions implemented in this file +;------------------------------------------------------------------------------ + PUBLIC vPortYield + PUBLIC vPortStart + +; Security ID definition +;------------------------------------------------------------------------------ +#define CG_SECURITY0 0FFH +#define CG_SECURITY1 0FFH +#define CG_SECURITY2 0FFH +#define CG_SECURITY3 0FFH +#define CG_SECURITY4 0FFH +#define CG_SECURITY5 0FFH +#define CG_SECURITY6 0FFH +#define CG_SECURITY7 0FFH +#define CG_SECURITY8 0FFH +#define CG_SECURITY9 0FFH + +; Tick ISR Prototype +;------------------------------------------------------------------------------ + PUBWEAK `??MD_INTTM0EQ0??INTVEC 544` + PUBLIC MD_INTTM0EQ0 + +MD_INTTM0EQ0 SYMBOL "MD_INTTM0EQ0" +`??MD_INTTM0EQ0??INTVEC 544` SYMBOL "??INTVEC 544", MD_INTTM0EQ0 + +;------------------------------------------------------------------------------ +; portSAVE_CONTEXT MACRO +; Saves the context of the remaining general purpose registers +; and the usCriticalNesting Value of the active Task onto the task stack +; saves stack pointer to the TCB +;------------------------------------------------------------------------------ +portSAVE_CONTEXT MACRO +#if configDATA_MODE == 1 ; Using the Tiny data model + prepare {r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30},76,sp ; save general purpose registers + sst.w r19,72[ep] + sst.w r18,68[ep] + sst.w r17,64[ep] + sst.w r16,60[ep] + sst.w r15,56[ep] + sst.w r14,52[ep] + sst.w r13,48[ep] + sst.w r12,44[ep] + sst.w r11,40[ep] + sst.w r10,36[ep] + sst.w r9,32[ep] + sst.w r8,28[ep] + sst.w r7,24[ep] + sst.w r6,20[ep] + sst.w r5,16[ep] + sst.w r4,12[ep] +#else ; Using the Small/Large data model + prepare {r20,r21,r22,r23,r24,r26,r27,r28,r29,r30},72,sp ; save general purpose registers + sst.w r19,68[ep] + sst.w r18,64[ep] + sst.w r17,60[ep] + sst.w r16,56[ep] + sst.w r15,52[ep] + sst.w r14,48[ep] + sst.w r13,44[ep] + sst.w r12,40[ep] + sst.w r11,36[ep] + sst.w r10,32[ep] + sst.w r9,28[ep] + sst.w r8,24[ep] + sst.w r7,20[ep] + sst.w r6,16[ep] + sst.w r5,12[ep] +#endif /* configDATA_MODE */ + sst.w r2,8[ep] + sst.w r1,4[ep] + MOVHI hi1(usCriticalNesting),r0,r1 ; save usCriticalNesting value to stack + ld.w lw1(usCriticalNesting)[r1],r2 + sst.w r2,0[ep] + MOVHI hi1(pxCurrentTCB),r0,r1 ; save SP to top of current TCB + ld.w lw1(pxCurrentTCB)[r1],r2 + st.w sp,0[r2] + ENDM +;------------------------------------------------------------------------------ + +;------------------------------------------------------------------------------ +; portRESTORE_CONTEXT MACRO +; Gets stack pointer from the current TCB +; Restores the context of the usCriticalNesting value and general purpose +; registers of the selected task from the task stack +;------------------------------------------------------------------------------ +portRESTORE_CONTEXT MACRO + MOVHI hi1(pxCurrentTCB),r0,r1 ; get Stackpointer address + ld.w lw1(pxCurrentTCB)[r1],sp + MOV sp,r1 + ld.w 0[r1],sp ; load stackpointer + MOV sp,ep ; set stack pointer to element pointer + sld.w 0[ep],r1 ; load usCriticalNesting value from stack + MOVHI hi1(usCriticalNesting),r0,r2 + st.w r1,lw1(usCriticalNesting)[r2] + sld.w 4[ep],r1 ; restore general purpose registers + sld.w 8[ep],r2 +#if configDATA_MODE == 1 ; Using Tiny data model + sld.w 12[ep],r4 + sld.w 16[ep],r5 + sld.w 20[ep],r6 + sld.w 24[ep],r7 + sld.w 28[ep],r8 + sld.w 32[ep],r9 + sld.w 36[ep],r10 + sld.w 40[ep],r11 + sld.w 44[ep],r12 + sld.w 48[ep],r13 + sld.w 52[ep],r14 + sld.w 56[ep],r15 + sld.w 60[ep],r16 + sld.w 64[ep],r17 + sld.w 68[ep],r18 + sld.w 72[ep],r19 + dispose 76,{r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30} +#else ; Using Small/Large data model + sld.w 12[ep],r5 + sld.w 16[ep],r6 + sld.w 20[ep],r7 + sld.w 24[ep],r8 + sld.w 28[ep],r9 + sld.w 32[ep],r10 + sld.w 36[ep],r11 + sld.w 40[ep],r12 + sld.w 44[ep],r13 + sld.w 48[ep],r14 + sld.w 52[ep],r15 + sld.w 56[ep],r16 + sld.w 60[ep],r17 + sld.w 64[ep],r18 + sld.w 68[ep],r19 + dispose 72,{r20,r21,r22,r23,r24,r26,r27,r28,r29,r30} +#endif /* configDATA_MODE */ + ENDM +;------------------------------------------------------------------------------ + +;------------------------------------------------------------------------------ +; Restore the context of the first task that is going to run. +; +; Input: NONE +; +; Call: CALL vPortStart +; +; Output: NONE +;------------------------------------------------------------------------------ + RSEG CODE:CODE +vPortStart: + portRESTORE_CONTEXT ; Restore the context of whichever task the ... + ld.w 0[sp],lp + ldsr lp,5 ; restore PSW + DI + ld.w 4[sp],lp ; restore LP + ld.w 8[sp],lp ; restore LP + ADD 0x0C,sp ; set SP to right position + EI + jmp [lp] +;------------------------------------------------------------------------------ + +;------------------------------------------------------------------------------ +; Port Yield function to check for a Task switch in the cooperative and +; preemptive mode +; +; Input: NONE +; +; Call: CALL vPortYield +; +; Output: NONE +;------------------------------------------------------------------------------ + + RSEG CODE:CODE +vPortYield: + + add -0x0C,sp ; prepare stack to save necessary values + st.w lp,8[sp] ; store LP to stack + stsr 0,r31 + st.w lp,4[sp] ; store EIPC to stack + stsr 1,lp + st.w lp,0[sp] ; store EIPSW to stack + portSAVE_CONTEXT ; Save the context of the current task. + jarl vTaskSwitchContext,lp ; Call the scheduler. + portRESTORE_CONTEXT ; Restore the context of whichever task the ... + ; ... scheduler decided should run. + ld.w 0[sp],lp ; restore EIPSW from stack + ldsr lp,1 + ld.w 4[sp],lp ; restore EIPC from stack + ldsr lp,0 + ld.w 8[sp],lp ; restore LP from stack + add 0x0C,sp ; set SP to right position + + RETI + +;------------------------------------------------------------------------------ + +;------------------------------------------------------------------------------ +; Perform the necessary steps of the Tick Count Increment and Task Switch +; depending on the chosen kernel configuration +; +; Input: NONE +; +; Call: ISR +; +; Output: NONE +;------------------------------------------------------------------------------ +#if configUSE_PREEMPTION == 1 ; use preemptive kernel mode + +MD_INTTM0EQ0: + + add -0x0C,sp ; prepare stack to save necessary values + st.w lp,8[sp] ; store LP to stack + stsr 0,r31 + st.w lp,4[sp] ; store EIPC to stack + stsr 1,lp + st.w lp,0[sp] ; store EIPSW to stack + portSAVE_CONTEXT ; Save the context of the current task. + jarl xTaskIncrementTick,lp ; Call the timer tick function. + jarl vTaskSwitchContext,lp ; Call the scheduler. + portRESTORE_CONTEXT ; Restore the context of whichever task the ... + ; ... scheduler decided should run. + ld.w 0[sp],lp ; restore EIPSW from stack + ldsr lp,1 + ld.w 4[sp],lp ; restore EIPC from stack + ldsr lp,0 + ld.w 8[sp],lp ; restore LP from stack + add 0x0C,sp ; set SP to right position + + RETI +;------------------------------------------------------------------------------ +#else ; use cooperative kernel mode + +MD_INTTM0EQ0: + prepare {lp,ep},8,sp + sst.w r1,4[ep] + sst.w r5,0[ep] + jarl xTaskIncrementTick,lp ; Call the timer tick function. + sld.w 0[ep],r5 + sld.w 4[ep],r1 + dispose 8,{lp,ep} + RETI +#endif /* configUSE_PREEMPTION */ + +;------------------------------------------------------------------------------ + COMMON INTVEC:CODE:ROOT(2) + ORG 544 +`??MD_INTTM0EQ0??INTVEC 544`: + JR MD_INTTM0EQ0 + + RSEG NEAR_ID:CONST:SORT:NOROOT(2) +`?`: + DW 10 + + COMMON INTVEC:CODE:ROOT(2) + ORG 40H +`??vPortYield??INTVEC 40`: + JR vPortYield + +;------------------------------------------------------------------------------ +; set microcontroller security ID + + COMMON INTVEC:CODE:ROOT(2) + ORG 70H +`SECUID`: + DB CG_SECURITY0 + DB CG_SECURITY1 + DB CG_SECURITY2 + DB CG_SECURITY3 + DB CG_SECURITY4 + DB CG_SECURITY5 + DB CG_SECURITY6 + DB CG_SECURITY7 + DB CG_SECURITY8 + DB CG_SECURITY9 + + +; set microcontroller Option bytes + + COMMON INTVEC:CODE:ROOT(2) + ORG 122 +`OPTBYTES`: + DB 0xFD + DB 0xFF + DB 0xFF + DB 0xFF + DB 0xFF + DB 0xFF + +#if configOCD_USAGE == 1 + + COMMON INTVEC:CODE:ROOT(4) + ORG 0x230 + PUBLIC ROM_INT2 +ROM_INT2: + DB 0xff, 0xff, 0xff, 0xff + DB 0xff, 0xff, 0xff, 0xff + DB 0xff, 0xff, 0xff, 0xff + DB 0xff, 0xff, 0xff, 0xff + + + COMMON INTVEC:CODE:ROOT(4) + ORG 0x60 + PUBLIC ROM_INT +ROM_INT: + DB 0xff, 0xff, 0xff, 0xff + DB 0xff, 0xff, 0xff, 0xff + DB 0xff, 0xff, 0xff, 0xff + DB 0xff, 0xff, 0xff, 0xff + +#endif /* configOCD_USAGE */ + + END + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/V850ES/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/V850ES/portmacro.h new file mode 100644 index 0000000..81f5417 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/IAR/V850ES/portmacro.h @@ -0,0 +1,177 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE unsigned int +#define portBASE_TYPE int + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + + +#if (configUSE_16_BIT_TICKS==1) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Interrupt control macros. */ +#define portDISABLE_INTERRUPTS() __asm ( "DI" ) +#define portENABLE_INTERRUPTS() __asm ( "EI" ) +/*-----------------------------------------------------------*/ + +/* Critical section control macros. */ +#define portNO_CRITICAL_SECTION_NESTING ( ( UBaseType_t ) 0 ) + +#define portENTER_CRITICAL() \ +{ \ +extern volatile /*uint16_t*/ portSTACK_TYPE usCriticalNesting; \ + \ + portDISABLE_INTERRUPTS(); \ + \ + /* Now interrupts are disabled ulCriticalNesting can be accessed */ \ + /* directly. Increment ulCriticalNesting to keep a count of how many */ \ + /* times portENTER_CRITICAL() has been called. */ \ + usCriticalNesting++; \ +} + +#define portEXIT_CRITICAL() \ +{ \ +extern volatile /*uint16_t*/ portSTACK_TYPE usCriticalNesting; \ + \ + if( usCriticalNesting > portNO_CRITICAL_SECTION_NESTING ) \ + { \ + /* Decrement the nesting count as we are leaving a critical section. */ \ + usCriticalNesting--; \ + \ + /* If the nesting level has reached zero then interrupts should be */ \ + /* re-enabled. */ \ + if( usCriticalNesting == portNO_CRITICAL_SECTION_NESTING ) \ + { \ + portENABLE_INTERRUPTS(); \ + } \ + } \ +} +/*-----------------------------------------------------------*/ + +/* Task utilities. */ +extern void vPortYield( void ); +extern void vPortStart( void ); +extern void portSAVE_CONTEXT( void ); +extern void portRESTORE_CONTEXT( void ); +#define portYIELD() __asm ( "trap 0" ) +#define portNOP() __asm ( "NOP" ) +extern void vTaskSwitchContext( void ); +#define portYIELD_FROM_ISR( xHigherPriorityTaskWoken ) if( xHigherPriorityTaskWoken ) vTaskSwitchContext() + +/*-----------------------------------------------------------*/ + +/* Hardwware specifics. */ +#define portBYTE_ALIGNMENT 4 +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Keil/See-also-the-RVDS-directory.txt b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Keil/See-also-the-RVDS-directory.txt new file mode 100644 index 0000000..bd7fab7 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Keil/See-also-the-RVDS-directory.txt @@ -0,0 +1 @@ +Nothing to see here. \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC18F/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC18F/port.c new file mode 100644 index 0000000..8a045f1 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC18F/port.c @@ -0,0 +1,657 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* +Changes between V1.2.4 and V1.2.5 + + + Introduced portGLOBAL_INTERRUPT_FLAG definition to test the global + interrupt flag setting. Using the two bits defined within + portINITAL_INTERRUPT_STATE was causing the w register to get clobbered + before the test was performed. + +Changes from V1.2.5 + + + Set the interrupt vector address to 0x08. Previously it was at the + incorrect address for compatibility mode of 0x18. + +Changes from V2.1.1 + + + PCLATU and PCLATH are now saved as part of the context. This allows + function pointers to be used within tasks. Thanks to Javier Espeche + for the enhancement. + +Changes from V2.3.1 + + + TABLAT is now saved as part of the task context. + +Changes from V3.2.0 + + + TBLPTRU is now initialised to zero as the MPLAB compiler expects this + value and does not write to the register. +*/ + +/* Scheduler include files. */ +#include "FreeRTOS.h" +#include "task.h" + +/* MPLAB library include file. */ +#include "timers.h" + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the PIC port. + *----------------------------------------------------------*/ + +/* Hardware setup for tick. */ +#define portTIMER_FOSC_SCALE ( ( uint32_t ) 4 ) + +/* Initial interrupt enable state for newly created tasks. This value is +copied into INTCON when a task switches in for the first time. */ +#define portINITAL_INTERRUPT_STATE 0xc0 + +/* Just the bit within INTCON for the global interrupt flag. */ +#define portGLOBAL_INTERRUPT_FLAG 0x80 + +/* Constant used for context switch macro when we require the interrupt +enable state to be unchanged when the interrupted task is switched back in. */ +#define portINTERRUPTS_UNCHANGED 0x00 + +/* Some memory areas get saved as part of the task context. These memory +area's get used by the compiler for temporary storage, especially when +performing mathematical operations, or when using 32bit data types. This +constant defines the size of memory area which must be saved. */ +#define portCOMPILER_MANAGED_MEMORY_SIZE ( ( uint8_t ) 0x13 ) + +/* We require the address of the pxCurrentTCB variable, but don't want to know +any details of its type. */ +typedef void TCB_t; +extern volatile TCB_t * volatile pxCurrentTCB; + +/* IO port constants. */ +#define portBIT_SET ( ( uint8_t ) 1 ) +#define portBIT_CLEAR ( ( uint8_t ) 0 ) + +/* + * The serial port ISR's are defined in serial.c, but are called from portable + * as they use the same vector as the tick ISR. + */ +void vSerialTxISR( void ); +void vSerialRxISR( void ); + +/* + * Perform hardware setup to enable ticks. + */ +static void prvSetupTimerInterrupt( void ); + +/* + * ISR to maintain the tick, and perform tick context switches if the + * preemptive scheduler is being used. + */ +static void prvTickISR( void ); + +/* + * ISR placed on the low priority vector. This calls the appropriate ISR for + * the actual interrupt. + */ +static void prvLowInterrupt( void ); + +/* + * Macro that pushes all the registers that make up the context of a task onto + * the stack, then saves the new top of stack into the TCB. + * + * If this is called from an ISR then the interrupt enable bits must have been + * set for the ISR to ever get called. Therefore we want to save the INTCON + * register with the enable bits forced to be set - and ucForcedInterruptFlags + * must contain these bit settings. This means the interrupts will again be + * enabled when the interrupted task is switched back in. + * + * If this is called from a manual context switch (i.e. from a call to yield), + * then we want to save the INTCON so it is restored with its current state, + * and ucForcedInterruptFlags must be 0. This allows a yield from within + * a critical section. + * + * The compiler uses some locations at the bottom of the memory for temporary + * storage during math and other computations. This is especially true if + * 32bit data types are utilised (as they are by the scheduler). The .tmpdata + * and MATH_DATA sections have to be stored in there entirety as part of a task + * context. This macro stores from data address 0x00 to + * portCOMPILER_MANAGED_MEMORY_SIZE. This is sufficient for the demo + * applications but you should check the map file for your project to ensure + * this is sufficient for your needs. It is not clear whether this size is + * fixed for all compilations or has the potential to be program specific. + */ +#define portSAVE_CONTEXT( ucForcedInterruptFlags ) \ +{ \ + _asm \ + /* Save the status and WREG registers first, as these will get modified \ + by the operations below. */ \ + MOVFF WREG, PREINC1 \ + MOVFF STATUS, PREINC1 \ + /* Save the INTCON register with the appropriate bits forced if \ + necessary - as described above. */ \ + MOVFF INTCON, WREG \ + IORLW ucForcedInterruptFlags \ + MOVFF WREG, PREINC1 \ + _endasm \ + \ + portDISABLE_INTERRUPTS(); \ + \ + _asm \ + /* Store the necessary registers to the stack. */ \ + MOVFF BSR, PREINC1 \ + MOVFF FSR2L, PREINC1 \ + MOVFF FSR2H, PREINC1 \ + MOVFF FSR0L, PREINC1 \ + MOVFF FSR0H, PREINC1 \ + MOVFF TABLAT, PREINC1 \ + MOVFF TBLPTRU, PREINC1 \ + MOVFF TBLPTRH, PREINC1 \ + MOVFF TBLPTRL, PREINC1 \ + MOVFF PRODH, PREINC1 \ + MOVFF PRODL, PREINC1 \ + MOVFF PCLATU, PREINC1 \ + MOVFF PCLATH, PREINC1 \ + /* Store the .tempdata and MATH_DATA areas as described above. */ \ + CLRF FSR0L, 0 \ + CLRF FSR0H, 0 \ + MOVFF POSTINC0, PREINC1 \ + MOVFF POSTINC0, PREINC1 \ + MOVFF POSTINC0, PREINC1 \ + MOVFF POSTINC0, PREINC1 \ + MOVFF POSTINC0, PREINC1 \ + MOVFF POSTINC0, PREINC1 \ + MOVFF POSTINC0, PREINC1 \ + MOVFF POSTINC0, PREINC1 \ + MOVFF POSTINC0, PREINC1 \ + MOVFF POSTINC0, PREINC1 \ + MOVFF POSTINC0, PREINC1 \ + MOVFF POSTINC0, PREINC1 \ + MOVFF POSTINC0, PREINC1 \ + MOVFF POSTINC0, PREINC1 \ + MOVFF POSTINC0, PREINC1 \ + MOVFF POSTINC0, PREINC1 \ + MOVFF POSTINC0, PREINC1 \ + MOVFF POSTINC0, PREINC1 \ + MOVFF POSTINC0, PREINC1 \ + MOVFF INDF0, PREINC1 \ + MOVFF FSR0L, PREINC1 \ + MOVFF FSR0H, PREINC1 \ + /* Store the hardware stack pointer in a temp register before we \ + modify it. */ \ + MOVFF STKPTR, FSR0L \ + _endasm \ + \ + /* Store each address from the hardware stack. */ \ + while( STKPTR > ( uint8_t ) 0 ) \ + { \ + _asm \ + MOVFF TOSL, PREINC1 \ + MOVFF TOSH, PREINC1 \ + MOVFF TOSU, PREINC1 \ + POP \ + _endasm \ + } \ + \ + _asm \ + /* Store the number of addresses on the hardware stack (from the \ + temporary register). */ \ + MOVFF FSR0L, PREINC1 \ + MOVF PREINC1, 1, 0 \ + _endasm \ + \ + /* Save the new top of the software stack in the TCB. */ \ + _asm \ + MOVFF pxCurrentTCB, FSR0L \ + MOVFF pxCurrentTCB + 1, FSR0H \ + MOVFF FSR1L, POSTINC0 \ + MOVFF FSR1H, POSTINC0 \ + _endasm \ +} +/*-----------------------------------------------------------*/ + +/* + * This is the reverse of portSAVE_CONTEXT. See portSAVE_CONTEXT for more + * details. + */ +#define portRESTORE_CONTEXT() \ +{ \ + _asm \ + /* Set FSR0 to point to pxCurrentTCB->pxTopOfStack. */ \ + MOVFF pxCurrentTCB, FSR0L \ + MOVFF pxCurrentTCB + 1, FSR0H \ + \ + /* De-reference FSR0 to set the address it holds into FSR1. \ + (i.e. *( pxCurrentTCB->pxTopOfStack ) ). */ \ + MOVFF POSTINC0, FSR1L \ + MOVFF POSTINC0, FSR1H \ + \ + /* How many return addresses are there on the hardware stack? Discard \ + the first byte as we are pointing to the next free space. */ \ + MOVFF POSTDEC1, FSR0L \ + MOVFF POSTDEC1, FSR0L \ + _endasm \ + \ + /* Fill the hardware stack from our software stack. */ \ + STKPTR = 0; \ + \ + while( STKPTR < FSR0L ) \ + { \ + _asm \ + PUSH \ + MOVF POSTDEC1, 0, 0 \ + MOVWF TOSU, 0 \ + MOVF POSTDEC1, 0, 0 \ + MOVWF TOSH, 0 \ + MOVF POSTDEC1, 0, 0 \ + MOVWF TOSL, 0 \ + _endasm \ + } \ + \ + _asm \ + /* Restore the .tmpdata and MATH_DATA memory. */ \ + MOVFF POSTDEC1, FSR0H \ + MOVFF POSTDEC1, FSR0L \ + MOVFF POSTDEC1, POSTDEC0 \ + MOVFF POSTDEC1, POSTDEC0 \ + MOVFF POSTDEC1, POSTDEC0 \ + MOVFF POSTDEC1, POSTDEC0 \ + MOVFF POSTDEC1, POSTDEC0 \ + MOVFF POSTDEC1, POSTDEC0 \ + MOVFF POSTDEC1, POSTDEC0 \ + MOVFF POSTDEC1, POSTDEC0 \ + MOVFF POSTDEC1, POSTDEC0 \ + MOVFF POSTDEC1, POSTDEC0 \ + MOVFF POSTDEC1, POSTDEC0 \ + MOVFF POSTDEC1, POSTDEC0 \ + MOVFF POSTDEC1, POSTDEC0 \ + MOVFF POSTDEC1, POSTDEC0 \ + MOVFF POSTDEC1, POSTDEC0 \ + MOVFF POSTDEC1, POSTDEC0 \ + MOVFF POSTDEC1, POSTDEC0 \ + MOVFF POSTDEC1, POSTDEC0 \ + MOVFF POSTDEC1, POSTDEC0 \ + MOVFF POSTDEC1, INDF0 \ + /* Restore the other registers forming the tasks context. */ \ + MOVFF POSTDEC1, PCLATH \ + MOVFF POSTDEC1, PCLATU \ + MOVFF POSTDEC1, PRODL \ + MOVFF POSTDEC1, PRODH \ + MOVFF POSTDEC1, TBLPTRL \ + MOVFF POSTDEC1, TBLPTRH \ + MOVFF POSTDEC1, TBLPTRU \ + MOVFF POSTDEC1, TABLAT \ + MOVFF POSTDEC1, FSR0H \ + MOVFF POSTDEC1, FSR0L \ + MOVFF POSTDEC1, FSR2H \ + MOVFF POSTDEC1, FSR2L \ + MOVFF POSTDEC1, BSR \ + /* The next byte is the INTCON register. Read this into WREG as some \ + manipulation is required. */ \ + MOVFF POSTDEC1, WREG \ + _endasm \ + \ + /* From the INTCON register, only the interrupt enable bits form part \ + of the tasks context. It is perfectly legitimate for another task to \ + have modified any other bits. We therefore only restore the top two bits. \ + */ \ + if( WREG & portGLOBAL_INTERRUPT_FLAG ) \ + { \ + _asm \ + MOVFF POSTDEC1, STATUS \ + MOVFF POSTDEC1, WREG \ + /* Return enabling interrupts. */ \ + RETFIE 0 \ + _endasm \ + } \ + else \ + { \ + _asm \ + MOVFF POSTDEC1, STATUS \ + MOVFF POSTDEC1, WREG \ + /* Return without effecting interrupts. The context may have \ + been saved from a critical region. */ \ + RETURN 0 \ + _endasm \ + } \ +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +uint32_t ulAddress; +uint8_t ucBlock; + + /* Place a few bytes of known values on the bottom of the stack. + This is just useful for debugging. */ + + *pxTopOfStack = 0x11; + pxTopOfStack++; + *pxTopOfStack = 0x22; + pxTopOfStack++; + *pxTopOfStack = 0x33; + pxTopOfStack++; + + + /* Simulate how the stack would look after a call to vPortYield() generated + by the compiler. + + First store the function parameters. This is where the task will expect to + find them when it starts running. */ + ulAddress = ( uint32_t ) pvParameters; + *pxTopOfStack = ( StackType_t ) ( ulAddress & ( uint32_t ) 0x00ff ); + pxTopOfStack++; + + ulAddress >>= 8; + *pxTopOfStack = ( StackType_t ) ( ulAddress & ( uint32_t ) 0x00ff ); + pxTopOfStack++; + + /* Next we just leave a space. When a context is saved the stack pointer + is incremented before it is used so as not to corrupt whatever the stack + pointer is actually pointing to. This is especially necessary during + function epilogue code generated by the compiler. */ + *pxTopOfStack = 0x44; + pxTopOfStack++; + + /* Next are all the registers that form part of the task context. */ + + *pxTopOfStack = ( StackType_t ) 0x66; /* WREG. */ + pxTopOfStack++; + + *pxTopOfStack = ( StackType_t ) 0xcc; /* Status. */ + pxTopOfStack++; + + /* INTCON is saved with interrupts enabled. */ + *pxTopOfStack = ( StackType_t ) portINITAL_INTERRUPT_STATE; /* INTCON */ + pxTopOfStack++; + + *pxTopOfStack = ( StackType_t ) 0x11; /* BSR. */ + pxTopOfStack++; + + *pxTopOfStack = ( StackType_t ) 0x22; /* FSR2L. */ + pxTopOfStack++; + + *pxTopOfStack = ( StackType_t ) 0x33; /* FSR2H. */ + pxTopOfStack++; + + *pxTopOfStack = ( StackType_t ) 0x44; /* FSR0L. */ + pxTopOfStack++; + + *pxTopOfStack = ( StackType_t ) 0x55; /* FSR0H. */ + pxTopOfStack++; + + *pxTopOfStack = ( StackType_t ) 0x66; /* TABLAT. */ + pxTopOfStack++; + + *pxTopOfStack = ( StackType_t ) 0x00; /* TBLPTRU. */ + pxTopOfStack++; + + *pxTopOfStack = ( StackType_t ) 0x88; /* TBLPTRUH. */ + pxTopOfStack++; + + *pxTopOfStack = ( StackType_t ) 0x99; /* TBLPTRUL. */ + pxTopOfStack++; + + *pxTopOfStack = ( StackType_t ) 0xaa; /* PRODH. */ + pxTopOfStack++; + + *pxTopOfStack = ( StackType_t ) 0xbb; /* PRODL. */ + pxTopOfStack++; + + *pxTopOfStack = ( StackType_t ) 0x00; /* PCLATU. */ + pxTopOfStack++; + + *pxTopOfStack = ( StackType_t ) 0x00; /* PCLATH. */ + pxTopOfStack++; + + /* Next the .tmpdata and MATH_DATA sections. */ + for( ucBlock = 0; ucBlock <= portCOMPILER_MANAGED_MEMORY_SIZE; ucBlock++ ) + { + *pxTopOfStack = ( StackType_t ) ucBlock; + *pxTopOfStack++; + } + + /* Store the top of the global data section. */ + *pxTopOfStack = ( StackType_t ) portCOMPILER_MANAGED_MEMORY_SIZE; /* Low. */ + pxTopOfStack++; + + *pxTopOfStack = ( StackType_t ) 0x00; /* High. */ + pxTopOfStack++; + + /* The only function return address so far is the address of the + task. */ + ulAddress = ( uint32_t ) pxCode; + + /* TOS low. */ + *pxTopOfStack = ( StackType_t ) ( ulAddress & ( uint32_t ) 0x00ff ); + pxTopOfStack++; + ulAddress >>= 8; + + /* TOS high. */ + *pxTopOfStack = ( StackType_t ) ( ulAddress & ( uint32_t ) 0x00ff ); + pxTopOfStack++; + ulAddress >>= 8; + + /* TOS even higher. */ + *pxTopOfStack = ( StackType_t ) ( ulAddress & ( uint32_t ) 0x00ff ); + pxTopOfStack++; + + /* Store the number of return addresses on the hardware stack - so far only + the address of the task entry point. */ + *pxTopOfStack = ( StackType_t ) 1; + pxTopOfStack++; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* Setup a timer for the tick ISR is using the preemptive scheduler. */ + prvSetupTimerInterrupt(); + + /* Restore the context of the first task to run. */ + portRESTORE_CONTEXT(); + + /* Should not get here. Use the function name to stop compiler warnings. */ + ( void ) prvLowInterrupt; + ( void ) prvTickISR; + + return pdTRUE; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the scheduler for the PIC port will get stopped + once running. If required disable the tick interrupt here, then return + to xPortStartScheduler(). */ +} +/*-----------------------------------------------------------*/ + +/* + * Manual context switch. This is similar to the tick context switch, + * but does not increment the tick count. It must be identical to the + * tick context switch in how it stores the stack of a task. + */ +void vPortYield( void ) +{ + /* This can get called with interrupts either enabled or disabled. We + will save the INTCON register with the interrupt enable bits unmodified. */ + portSAVE_CONTEXT( portINTERRUPTS_UNCHANGED ); + + /* Switch to the highest priority task that is ready to run. */ + vTaskSwitchContext(); + + /* Start executing the task we have just switched to. */ + portRESTORE_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +/* + * Vector for ISR. Nothing here must alter any registers! + */ +#pragma code high_vector=0x08 +static void prvLowInterrupt( void ) +{ + /* Was the interrupt the tick? */ + if( PIR1bits.CCP1IF ) + { + _asm + goto prvTickISR + _endasm + } + + /* Was the interrupt a byte being received? */ + if( PIR1bits.RCIF ) + { + _asm + goto vSerialRxISR + _endasm + } + + /* Was the interrupt the Tx register becoming empty? */ + if( PIR1bits.TXIF ) + { + if( PIE1bits.TXIE ) + { + _asm + goto vSerialTxISR + _endasm + } + } +} +#pragma code + +/*-----------------------------------------------------------*/ + +/* + * ISR for the tick. + * This increments the tick count and, if using the preemptive scheduler, + * performs a context switch. This must be identical to the manual + * context switch in how it stores the context of a task. + */ +static void prvTickISR( void ) +{ + /* Interrupts must have been enabled for the ISR to fire, so we have to + save the context with interrupts enabled. */ + portSAVE_CONTEXT( portGLOBAL_INTERRUPT_FLAG ); + PIR1bits.CCP1IF = 0; + + /* Maintain the tick count. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Switch to the highest priority task that is ready to run. */ + vTaskSwitchContext(); + } + + portRESTORE_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +/* + * Setup a timer for a regular tick. + */ +static void prvSetupTimerInterrupt( void ) +{ +const uint32_t ulConstCompareValue = ( ( configCPU_CLOCK_HZ / portTIMER_FOSC_SCALE ) / configTICK_RATE_HZ ); +uint32_t ulCompareValue; +uint8_t ucByte; + + /* Interrupts are disabled when this function is called. + + Setup CCP1 to provide the tick interrupt using a compare match on timer + 1. + + Clear the time count then setup timer. */ + TMR1H = ( uint8_t ) 0x00; + TMR1L = ( uint8_t ) 0x00; + + /* Set the compare match value. */ + ulCompareValue = ulConstCompareValue; + CCPR1L = ( uint8_t ) ( ulCompareValue & ( uint32_t ) 0xff ); + ulCompareValue >>= ( uint32_t ) 8; + CCPR1H = ( uint8_t ) ( ulCompareValue & ( uint32_t ) 0xff ); + + CCP1CONbits.CCP1M0 = portBIT_SET; /*< Compare match mode. */ + CCP1CONbits.CCP1M1 = portBIT_SET; /*< Compare match mode. */ + CCP1CONbits.CCP1M2 = portBIT_CLEAR; /*< Compare match mode. */ + CCP1CONbits.CCP1M3 = portBIT_SET; /*< Compare match mode. */ + PIE1bits.CCP1IE = portBIT_SET; /*< Interrupt enable. */ + + /* We are only going to use the global interrupt bit, so set the peripheral + bit to true. */ + INTCONbits.GIEL = portBIT_SET; + + /* Provided library function for setting up the timer that will produce the + tick. */ + OpenTimer1( T1_16BIT_RW & T1_SOURCE_INT & T1_PS_1_1 & T1_CCP1_T3_CCP2 ); +} + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC18F/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC18F/portmacro.h new file mode 100644 index 0000000..46860c6 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC18F/portmacro.h @@ -0,0 +1,154 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT int +#define portSTACK_TYPE uint8_t +#define portBASE_TYPE char + +typedef portSTACK_TYPE StackType_t; +typedef signed char BaseType_t; +typedef unsigned char UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 1 +#define portGLOBAL_INT_ENABLE_BIT 0x80 +#define portSTACK_GROWTH 1 +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +#define portDISABLE_INTERRUPTS() INTCONbits.GIEH = 0; +#define portENABLE_INTERRUPTS() INTCONbits.GIEH = 1; + +/* Push the INTCON register onto the stack, then disable interrupts. */ +#define portENTER_CRITICAL() POSTINC1 = INTCON; \ + INTCONbits.GIEH = 0; + +/* Retrieve the INTCON register from the stack, and enable interrupts +if they were saved as being enabled. Don't modify any other bits +within the INTCON register as these may have lagitimately have been +modified within the critical region. */ +#define portEXIT_CRITICAL() _asm \ + MOVF POSTDEC1, 1, 0 \ + _endasm \ + if( INDF1 & portGLOBAL_INT_ENABLE_BIT ) \ + { \ + portENABLE_INTERRUPTS(); \ + } +/*-----------------------------------------------------------*/ + +/* Task utilities. */ +extern void vPortYield( void ); +#define portYIELD() vPortYield() +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*-----------------------------------------------------------*/ + +/* Required by the kernel aware debugger. */ +#ifdef __DEBUG + #define portREMOVE_STATIC_QUALIFIER +#endif + + +#define portNOP() _asm \ + NOP \ + _endasm + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC18F/stdio.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC18F/stdio.h new file mode 100644 index 0000000..e69de29 diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC24_dsPIC/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC24_dsPIC/port.c new file mode 100644 index 0000000..465fe05 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC24_dsPIC/port.c @@ -0,0 +1,375 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* + Changes from V4.2.1 + + + Introduced the configKERNEL_INTERRUPT_PRIORITY definition. +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the PIC24 port. + *----------------------------------------------------------*/ + +/* Scheduler include files. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Hardware specifics. */ +#define portBIT_SET 1 +#define portTIMER_PRESCALE 8 +#define portINITIAL_SR 0 + +/* Defined for backward compatability with project created prior to +FreeRTOS.org V4.3.0. */ +#ifndef configKERNEL_INTERRUPT_PRIORITY + #define configKERNEL_INTERRUPT_PRIORITY 1 +#endif + +/* Use _T1Interrupt as the interrupt handler name if the application writer has +not provided their own. */ +#ifndef configTICK_INTERRUPT_HANDLER + #define configTICK_INTERRUPT_HANDLER _T1Interrupt +#endif /* configTICK_INTERRUPT_HANDLER */ + +/* The program counter is only 23 bits. */ +#define portUNUSED_PR_BITS 0x7f + +/* Records the nesting depth of calls to portENTER_CRITICAL(). */ +UBaseType_t uxCriticalNesting = 0xef; + +#if configKERNEL_INTERRUPT_PRIORITY != 1 + #error If configKERNEL_INTERRUPT_PRIORITY is not 1 then the #32 in the following macros needs changing to equal the portINTERRUPT_BITS value, which is ( configKERNEL_INTERRUPT_PRIORITY << 5 ) +#endif + +#if defined( __PIC24E__ ) || defined ( __PIC24F__ ) || defined( __PIC24FK__ ) || defined( __PIC24H__ ) + + #ifdef __HAS_EDS__ + #define portRESTORE_CONTEXT() \ + asm volatile( "MOV _pxCurrentTCB, W0 \n" /* Restore the stack pointer for the task. */ \ + "MOV [W0], W15 \n" \ + "POP W0 \n" /* Restore the critical nesting counter for the task. */ \ + "MOV W0, _uxCriticalNesting \n" \ + "POP DSWPAG \n" \ + "POP DSRPAG \n" \ + "POP CORCON \n" \ + "POP TBLPAG \n" \ + "POP RCOUNT \n" /* Restore the registers from the stack. */ \ + "POP W14 \n" \ + "POP.D W12 \n" \ + "POP.D W10 \n" \ + "POP.D W8 \n" \ + "POP.D W6 \n" \ + "POP.D W4 \n" \ + "POP.D W2 \n" \ + "POP.D W0 \n" \ + "POP SR " ); + #else /* __HAS_EDS__ */ + #define portRESTORE_CONTEXT() \ + asm volatile( "MOV _pxCurrentTCB, W0 \n" /* Restore the stack pointer for the task. */ \ + "MOV [W0], W15 \n" \ + "POP W0 \n" /* Restore the critical nesting counter for the task. */ \ + "MOV W0, _uxCriticalNesting \n" \ + "POP PSVPAG \n" \ + "POP CORCON \n" \ + "POP TBLPAG \n" \ + "POP RCOUNT \n" /* Restore the registers from the stack. */ \ + "POP W14 \n" \ + "POP.D W12 \n" \ + "POP.D W10 \n" \ + "POP.D W8 \n" \ + "POP.D W6 \n" \ + "POP.D W4 \n" \ + "POP.D W2 \n" \ + "POP.D W0 \n" \ + "POP SR " ); + #endif /* __HAS_EDS__ */ +#endif /* MPLAB_PIC24_PORT */ + +#if defined( __dsPIC30F__ ) || defined( __dsPIC33F__ ) + + #define portRESTORE_CONTEXT() \ + asm volatile( "MOV _pxCurrentTCB, W0 \n" /* Restore the stack pointer for the task. */ \ + "MOV [W0], W15 \n" \ + "POP W0 \n" /* Restore the critical nesting counter for the task. */ \ + "MOV W0, _uxCriticalNesting \n" \ + "POP PSVPAG \n" \ + "POP CORCON \n" \ + "POP DOENDH \n" \ + "POP DOENDL \n" \ + "POP DOSTARTH \n" \ + "POP DOSTARTL \n" \ + "POP DCOUNT \n" \ + "POP ACCBU \n" \ + "POP ACCBH \n" \ + "POP ACCBL \n" \ + "POP ACCAU \n" \ + "POP ACCAH \n" \ + "POP ACCAL \n" \ + "POP TBLPAG \n" \ + "POP RCOUNT \n" /* Restore the registers from the stack. */ \ + "POP W14 \n" \ + "POP.D W12 \n" \ + "POP.D W10 \n" \ + "POP.D W8 \n" \ + "POP.D W6 \n" \ + "POP.D W4 \n" \ + "POP.D W2 \n" \ + "POP.D W0 \n" \ + "POP SR " ); + +#endif /* MPLAB_DSPIC_PORT */ + +#ifndef portRESTORE_CONTEXT + #error Unrecognised device selected + + /* Note: dsPIC parts with EDS are not supported as there is no easy way to + recover the hardware stacked copies for DOCOUNT, DOHIGH, DOLOW. */ +#endif + +/* + * Setup the timer used to generate the tick interrupt. + */ +void vApplicationSetupTickTimerInterrupt( void ); + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +uint16_t usCode; +UBaseType_t i; + +const StackType_t xInitialStack[] = +{ + 0x1111, /* W1 */ + 0x2222, /* W2 */ + 0x3333, /* W3 */ + 0x4444, /* W4 */ + 0x5555, /* W5 */ + 0x6666, /* W6 */ + 0x7777, /* W7 */ + 0x8888, /* W8 */ + 0x9999, /* W9 */ + 0xaaaa, /* W10 */ + 0xbbbb, /* W11 */ + 0xcccc, /* W12 */ + 0xdddd, /* W13 */ + 0xeeee, /* W14 */ + 0xcdce, /* RCOUNT */ + 0xabac, /* TBLPAG */ + + /* dsPIC specific registers. */ + #ifdef MPLAB_DSPIC_PORT + 0x0202, /* ACCAL */ + 0x0303, /* ACCAH */ + 0x0404, /* ACCAU */ + 0x0505, /* ACCBL */ + 0x0606, /* ACCBH */ + 0x0707, /* ACCBU */ + 0x0808, /* DCOUNT */ + 0x090a, /* DOSTARTL */ + 0x1010, /* DOSTARTH */ + 0x1110, /* DOENDL */ + 0x1212, /* DOENDH */ + #endif +}; + + /* Setup the stack as if a yield had occurred. + + Save the low bytes of the program counter. */ + usCode = ( uint16_t ) pxCode; + *pxTopOfStack = ( StackType_t ) usCode; + pxTopOfStack++; + + /* Save the high byte of the program counter. This will always be zero + here as it is passed in a 16bit pointer. If the address is greater than + 16 bits then the pointer will point to a jump table. */ + *pxTopOfStack = ( StackType_t ) 0; + pxTopOfStack++; + + /* Status register with interrupts enabled. */ + *pxTopOfStack = portINITIAL_SR; + pxTopOfStack++; + + /* Parameters are passed in W0. */ + *pxTopOfStack = ( StackType_t ) pvParameters; + pxTopOfStack++; + + for( i = 0; i < ( sizeof( xInitialStack ) / sizeof( StackType_t ) ); i++ ) + { + *pxTopOfStack = xInitialStack[ i ]; + pxTopOfStack++; + } + + *pxTopOfStack = CORCON; + pxTopOfStack++; + + #if defined(__HAS_EDS__) + *pxTopOfStack = DSRPAG; + pxTopOfStack++; + *pxTopOfStack = DSWPAG; + pxTopOfStack++; + #else /* __HAS_EDS__ */ + *pxTopOfStack = PSVPAG; + pxTopOfStack++; + #endif /* __HAS_EDS__ */ + + /* Finally the critical nesting depth. */ + *pxTopOfStack = 0x00; + pxTopOfStack++; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* Setup a timer for the tick ISR. */ + vApplicationSetupTickTimerInterrupt(); + + /* Restore the context of the first task to run. */ + portRESTORE_CONTEXT(); + + /* Simulate the end of the yield function. */ + asm volatile ( "return" ); + + /* Should not reach here. */ + return pdTRUE; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +/* + * Setup a timer for a regular tick. + */ +__attribute__(( weak )) void vApplicationSetupTickTimerInterrupt( void ) +{ +const uint32_t ulCompareMatch = ( ( configCPU_CLOCK_HZ / portTIMER_PRESCALE ) / configTICK_RATE_HZ ) - 1; + + /* Prescale of 8. */ + T1CON = 0; + TMR1 = 0; + + PR1 = ( uint16_t ) ulCompareMatch; + + /* Setup timer 1 interrupt priority. */ + IPC0bits.T1IP = configKERNEL_INTERRUPT_PRIORITY; + + /* Clear the interrupt as a starting condition. */ + IFS0bits.T1IF = 0; + + /* Enable the interrupt. */ + IEC0bits.T1IE = 1; + + /* Setup the prescale value. */ + T1CONbits.TCKPS0 = 1; + T1CONbits.TCKPS1 = 0; + + /* Start the timer. */ + T1CONbits.TON = 1; +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void __attribute__((__interrupt__, auto_psv)) configTICK_INTERRUPT_HANDLER( void ) +{ + /* Clear the timer interrupt. */ + IFS0bits.T1IF = 0; + + if( xTaskIncrementTick() != pdFALSE ) + { + portYIELD(); + } +} + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC24_dsPIC/portasm_PIC24.S b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC24_dsPIC/portasm_PIC24.S new file mode 100644 index 0000000..f298df9 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC24_dsPIC/portasm_PIC24.S @@ -0,0 +1,134 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#if defined( __PIC24E__ ) || defined ( __PIC24F__ ) || defined( __PIC24FK__ ) || defined( __PIC24H__ ) + + .global _vPortYield + .extern _vTaskSwitchContext + .extern uxCriticalNesting + +_vPortYield: + + PUSH SR /* Save the SR used by the task.... */ + PUSH W0 /* ....then disable interrupts. */ + MOV #32, W0 + MOV W0, SR + PUSH W1 /* Save registers to the stack. */ + PUSH.D W2 + PUSH.D W4 + PUSH.D W6 + PUSH.D W8 + PUSH.D W10 + PUSH.D W12 + PUSH W14 + PUSH RCOUNT + PUSH TBLPAG + + PUSH CORCON + #ifdef __HAS_EDS__ + PUSH DSRPAG + PUSH DSWPAG + #else + PUSH PSVPAG + #endif /* __HAS_EDS__ */ + MOV _uxCriticalNesting, W0 /* Save the critical nesting counter for the task. */ + PUSH W0 + MOV _pxCurrentTCB, W0 /* Save the new top of stack into the TCB. */ + MOV W15, [W0] + + call _vTaskSwitchContext + + MOV _pxCurrentTCB, W0 /* Restore the stack pointer for the task. */ + MOV [W0], W15 + POP W0 /* Restore the critical nesting counter for the task. */ + MOV W0, _uxCriticalNesting + #ifdef __HAS_EDS__ + POP DSWPAG + POP DSRPAG + #else + POP PSVPAG + #endif /* __HAS_EDS__ */ + POP CORCON + POP TBLPAG + POP RCOUNT /* Restore the registers from the stack. */ + POP W14 + POP.D W12 + POP.D W10 + POP.D W8 + POP.D W6 + POP.D W4 + POP.D W2 + POP.D W0 + POP SR + + return + + .end + +#endif /* defined( __PIC24E__ ) || defined ( __PIC24F__ ) || defined( __PIC24FK__ ) || defined( __PIC24H__ ) */ \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC24_dsPIC/portasm_dsPIC.S b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC24_dsPIC/portasm_dsPIC.S new file mode 100644 index 0000000..26e0604 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC24_dsPIC/portasm_dsPIC.S @@ -0,0 +1,148 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#if defined( __dsPIC30F__ ) || defined( __dsPIC33F__ ) + + .global _vPortYield + .extern _vTaskSwitchContext + .extern uxCriticalNesting + +_vPortYield: + + PUSH SR /* Save the SR used by the task.... */ + PUSH W0 /* ....then disable interrupts. */ + MOV #32, W0 + MOV W0, SR + PUSH W1 /* Save registers to the stack. */ + PUSH.D W2 + PUSH.D W4 + PUSH.D W6 + PUSH.D W8 + PUSH.D W10 + PUSH.D W12 + PUSH W14 + PUSH RCOUNT + PUSH TBLPAG + PUSH ACCAL + PUSH ACCAH + PUSH ACCAU + PUSH ACCBL + PUSH ACCBH + PUSH ACCBU + PUSH DCOUNT + PUSH DOSTARTL + PUSH DOSTARTH + PUSH DOENDL + PUSH DOENDH + + + PUSH CORCON + PUSH PSVPAG + MOV _uxCriticalNesting, W0 /* Save the critical nesting counter for the task. */ + PUSH W0 + MOV _pxCurrentTCB, W0 /* Save the new top of stack into the TCB. */ + MOV W15, [W0] + + call _vTaskSwitchContext + + MOV _pxCurrentTCB, W0 /* Restore the stack pointer for the task. */ + MOV [W0], W15 + POP W0 /* Restore the critical nesting counter for the task. */ + MOV W0, _uxCriticalNesting + POP PSVPAG + POP CORCON + POP DOENDH + POP DOENDL + POP DOSTARTH + POP DOSTARTL + POP DCOUNT + POP ACCBU + POP ACCBH + POP ACCBL + POP ACCAU + POP ACCAH + POP ACCAL + POP TBLPAG + POP RCOUNT /* Restore the registers from the stack. */ + POP W14 + POP.D W12 + POP.D W10 + POP.D W8 + POP.D W6 + POP.D W4 + POP.D W2 + POP.D W0 + POP SR + + return + + .end + +#endif /* defined( __dsPIC30F__ ) || defined( __dsPIC33F__ ) */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC24_dsPIC/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC24_dsPIC/portmacro.h new file mode 100644 index 0000000..0ee6983 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC24_dsPIC/portmacro.h @@ -0,0 +1,150 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint16_t +#define portBASE_TYPE short + +typedef portSTACK_TYPE StackType_t; +typedef short BaseType_t; +typedef unsigned short UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 2 +#define portSTACK_GROWTH 1 +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +#define portDISABLE_INTERRUPTS() SET_CPU_IPL( configKERNEL_INTERRUPT_PRIORITY ); __asm volatile ( "NOP" ) +#define portENABLE_INTERRUPTS() SET_CPU_IPL( 0 ) + +/* Note that exiting a critical sectino will set the IPL bits to 0, nomatter +what their value was prior to entering the critical section. */ +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() +/*-----------------------------------------------------------*/ + +/* Task utilities. */ +extern void vPortYield( void ); +#define portYIELD() asm volatile ( "CALL _vPortYield \n" \ + "NOP " ); +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*-----------------------------------------------------------*/ + +/* Required by the kernel aware debugger. */ +#ifdef __DEBUG + #define portREMOVE_STATIC_QUALIFIER +#endif + +#define portNOP() asm volatile ( "NOP" ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC32MEC14xx/ISR_Support.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC32MEC14xx/ISR_Support.h new file mode 100644 index 0000000..6a444ef --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC32MEC14xx/ISR_Support.h @@ -0,0 +1,256 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#include "FreeRTOSConfig.h" + +#define portCONTEXT_SIZE 132 +#define portEPC_STACK_LOCATION 124 +#define portSTATUS_STACK_LOCATION 128 + +#ifdef __LANGUAGE_ASSEMBLY__ + +/******************************************************************/ +.macro portSAVE_CONTEXT + + /* Make room for the context. First save the current status so it can be + manipulated, and the cause and EPC registers so their original values are + captured. */ + mfc0 k0, _CP0_CAUSE + addiu sp, sp, -portCONTEXT_SIZE + mfc0 k1, _CP0_STATUS + + /* Also save s6 and s5 so they can be used. Any nesting interrupts should + maintain the values of these registers across the ISR. */ + sw s6, 44(sp) + sw s5, 40(sp) + sw k1, portSTATUS_STACK_LOCATION(sp) + + /* Prepare to enable interrupts above the current priority. + k0 = k0 >> 10. Moves RIPL[17:10] to [7:0] */ + srl k0, k0, 0xa + + /* Insert bit field. 7 bits k0[6:0] to k1[16:10] */ + ins k1, k0, 10, 7 + + /* Sets CP0.Status.IPL = CP0.Cause.RIPL + Copy the MSB of the IPL, but it would be an error if it was set anyway. */ + srl k0, k0, 0x7 + + /* MSB of IPL is bit[18] of CP0.Status */ + ins k1, k0, 18, 1 + + /* CP0.Status[5:1] = 0 b[5]=Rsvd, b[4]=UM, + b[3]=Rsvd, b[2]=ERL, b[1]=EXL + Setting EXL=0 allows higher priority interrupts + to preempt this handler */ + ins k1, zero, 1, 4 + + + /* s5 is used as the frame pointer. */ + add s5, zero, sp + + /* Check the nesting count value. */ + la k0, uxInterruptNesting + lw s6, (k0) + + /* If the nesting count is 0 then swap to the the system stack, otherwise + the system stack is already being used. */ + bne s6, zero, 1f + nop + + /* Swap to the system stack. */ + la sp, xISRStackTop + lw sp, (sp) + + /* Increment and save the nesting count. */ +1: addiu s6, s6, 1 + sw s6, 0(k0) + + /* s6 holds the EPC value, this is saved after interrupts are re-enabled. */ + mfc0 s6, _CP0_EPC + + /* Re-enable interrupts. */ + mtc0 k1, _CP0_STATUS + + /* Save the context into the space just created. s6 is saved again + here as it now contains the EPC value. No other s registers need be + saved. */ + sw ra, 120(s5) /* Return address (RA=R31) */ + sw s8, 116(s5) /* Frame Pointer (FP=R30) */ + sw t9, 112(s5) + sw t8, 108(s5) + sw t7, 104(s5) + sw t6, 100(s5) + sw t5, 96(s5) + sw t4, 92(s5) + sw t3, 88(s5) + sw t2, 84(s5) + sw t1, 80(s5) + sw t0, 76(s5) + sw a3, 72(s5) + sw a2, 68(s5) + sw a1, 64(s5) + sw a0, 60(s5) + sw v1, 56(s5) + sw v0, 52(s5) + sw s6, portEPC_STACK_LOCATION(s5) + sw $1, 16(s5) + + /* MEC14xx does not have DSP, removed 7 words */ + mfhi s6 + sw s6, 12(s5) + mflo s6 + sw s6, 8(s5) + + /* Update the task stack pointer value if nesting is zero. */ + la s6, uxInterruptNesting + lw s6, (s6) + addiu s6, s6, -1 + bne s6, zero, 1f + nop + + /* Save the stack pointer. */ + la s6, uxSavedTaskStackPointer + sw s5, (s6) +1: + .endm + +/******************************************************************/ +.macro portRESTORE_CONTEXT + + /* Restore the stack pointer from the TCB. This is only done if the + nesting count is 1. */ + la s6, uxInterruptNesting + lw s6, (s6) + addiu s6, s6, -1 + bne s6, zero, 1f + nop + la s6, uxSavedTaskStackPointer + lw s5, (s6) + + /* Restore the context. + MCHP MEC14xx does not include DSP */ +1: + lw s6, 8(s5) + mtlo s6 + lw s6, 12(s5) + mthi s6 + lw $1, 16(s5) + + /* s6 is loaded as it was used as a scratch register and therefore saved + as part of the interrupt context. */ + lw s6, 44(s5) + lw v0, 52(s5) + lw v1, 56(s5) + lw a0, 60(s5) + lw a1, 64(s5) + lw a2, 68(s5) + lw a3, 72(s5) + lw t0, 76(s5) + lw t1, 80(s5) + lw t2, 84(s5) + lw t3, 88(s5) + lw t4, 92(s5) + lw t5, 96(s5) + lw t6, 100(s5) + lw t7, 104(s5) + lw t8, 108(s5) + lw t9, 112(s5) + lw s8, 116(s5) + lw ra, 120(s5) + + /* Protect access to the k registers, and others. */ + di + ehb + + /* Decrement the nesting count. */ + la k0, uxInterruptNesting + lw k1, (k0) + addiu k1, k1, -1 + sw k1, 0(k0) + + lw k0, portSTATUS_STACK_LOCATION(s5) + lw k1, portEPC_STACK_LOCATION(s5) + + /* Leave the stack in its original state. First load sp from s5, then + restore s5 from the stack. */ + add sp, zero, s5 + lw s5, 40(sp) + addiu sp, sp, portCONTEXT_SIZE + + mtc0 k0, _CP0_STATUS + mtc0 k1, _CP0_EPC + ehb + eret + nop + + .endm + +#endif /* #ifdef __LANGUAGE_ASSEMBLY__ */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC32MEC14xx/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC32MEC14xx/port.c new file mode 100644 index 0000000..bab8706 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC32MEC14xx/port.c @@ -0,0 +1,387 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the PIC32MEC14xx port. + *----------------------------------------------------------*/ + +/* Scheduler include files. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Microchip includes. */ +#include +#include + +#if !defined(__MEC__) + #error This port is designed to work with XC32 on MEC14xx. Please update your C compiler version or settings. +#endif + +#if( ( configMAX_SYSCALL_INTERRUPT_PRIORITY >= 0x7 ) || ( configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 ) ) + #error configMAX_SYSCALL_INTERRUPT_PRIORITY must be less than 7 and greater than 0 +#endif + +/* Bits within various registers. */ +#define portIE_BIT ( 0x00000001 ) +#define portEXL_BIT ( 0x00000002 ) + +/* The EXL bit is set to ensure interrupts do not occur while the context of +the first task is being restored. MEC14xx does not have DSP HW. */ +#define portINITIAL_SR ( portIE_BIT | portEXL_BIT ) + +/* MEC14xx RTOS Timer MMCR's. */ +#define portMMCR_RTMR_PRELOAD *((volatile uint32_t *)(0xA0007404ul)) +#define portMMCR_RTMR_CONTROL *((volatile uint32_t *)(0xA0007408ul)) + +/* MEC14xx JTVIC external interrupt controller is mapped to M14K closely-coupled +peripheral space. */ +#define portGIRQ23_RTOS_TIMER_BITPOS ( 4 ) +#define portGIRQ23_RTOS_TIMER_MASK ( 1ul << ( portGIRQ23_RTOS_TIMER_BITPOS ) ) +#define portMMCR_JTVIC_GIRQ23_SRC *((volatile uint32_t *)(0xBFFFC0F0ul)) +#define portMMCR_JTVIC_GIRQ23_SETEN *((volatile uint32_t *)(0xBFFFC0F4ul)) +#define portMMCR_JTVIC_GIRQ23_PRIA *((volatile uint32_t *)(0xBFFFC3F0ul)) + +/* MIPS Software Interrupts are routed through JTVIC GIRQ24 */ +#define portGIRQ24_M14K_SOFTIRQ0_BITPOS ( 1 ) +#define portGIRQ24_M14K_SOFTIRQ0_MASK ( 1ul << ( portGIRQ24_M14K_SOFTIRQ0_BITPOS ) ) +#define portMMCR_JTVIC_GIRQ24_SRC *((volatile uint32_t *)(0xBFFFC100ul)) +#define portMMCR_JTVIC_GIRQ24_SETEN *((volatile uint32_t *)(0xBFFFC104ul)) +#define portMMCR_JTVIC_GIRQ24_PRIA *((volatile uint32_t *)(0xBFFFC400ul)) + +/* +By default port.c generates its tick interrupt from the RTOS timer. The user +can override this behaviour by: + 1: Providing their own implementation of vApplicationSetupTickTimerInterrupt(), + which is the function that configures the timer. The function is defined + as a weak symbol in this file so if the same function name is used in the + application code then the version in the application code will be linked + into the application in preference to the version defined in this file. + 2: Provide a vector implementation in port_asm.S that overrides the default + behaviour for the specified interrupt vector. + 3: Specify the correct bit to clear the interrupt during the timer interrupt + handler. +*/ +#ifndef configTICK_INTERRUPT_VECTOR + #define configTICK_INTERRUPT_VECTOR girq23_b4 + #define configCLEAR_TICK_TIMER_INTERRUPT() portMMCR_JTVIC_GIRQ23_SRC = portGIRQ23_RTOS_TIMER_MASK +#else + #ifndef configCLEAR_TICK_TIMER_INTERRUPT + #error If configTICK_INTERRUPT_VECTOR is defined in application code then configCLEAR_TICK_TIMER_INTERRUPT must also be defined in application code. + #endif +#endif + +/* Let the user override the pre-loading of the initial RA with the address of +prvTaskExitError() in case it messes up unwinding of the stack in the debugger - +in which case configTASK_RETURN_ADDRESS can be defined as 0 (NULL). */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/* Set configCHECK_FOR_STACK_OVERFLOW to 3 to add ISR stack checking to task +stack checking. A problem in the ISR stack will trigger an assert, not call the +stack overflow hook function (because the stack overflow hook is specific to a +task stack, not the ISR stack). */ +#if( configCHECK_FOR_STACK_OVERFLOW > 2 ) + + /* Don't use 0xa5 as the stack fill bytes as that is used by the kernel for + the task stacks, and so will legitimately appear in many positions within + the ISR stack. */ + #define portISR_STACK_FILL_BYTE 0xee + + static const uint8_t ucExpectedStackBytes[] = { + portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, \ + portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, \ + portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, \ + portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, \ + portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE }; \ + + #define portCHECK_ISR_STACK() configASSERT( ( memcmp( ( void * ) xISRStack, ( void * ) ucExpectedStackBytes, sizeof( ucExpectedStackBytes ) ) == 0 ) ) +#else + /* Define the function away. */ + #define portCHECK_ISR_STACK() +#endif /* configCHECK_FOR_STACK_OVERFLOW > 2 */ + + +/*-----------------------------------------------------------*/ + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* Records the interrupt nesting depth. This is initialised to one as it is +decremented to 0 when the first task starts. */ +volatile UBaseType_t uxInterruptNesting = 0x01; + +/* Stores the task stack pointer when a switch is made to use the system stack. */ +UBaseType_t uxSavedTaskStackPointer = 0; + +/* The stack used by interrupt service routines that cause a context switch. */ +StackType_t xISRStack[ configISR_STACK_SIZE ] = { 0 }; + +/* The top of stack value ensures there is enough space to store 6 registers on +the callers stack, as some functions seem to want to do this. */ +const StackType_t * const xISRStackTop = &( xISRStack[ configISR_STACK_SIZE - 7 ] ); + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Ensure byte alignment is maintained when leaving this function. */ + pxTopOfStack--; + + *pxTopOfStack = (StackType_t) 0xDEADBEEF; + pxTopOfStack--; + + *pxTopOfStack = (StackType_t) 0x12345678; /* Word to which the stack pointer will be left pointing after context restore. */ + pxTopOfStack--; + + *pxTopOfStack = (StackType_t) ulPortGetCP0Cause(); + pxTopOfStack--; + + *pxTopOfStack = (StackType_t) portINITIAL_SR; /* CP0_STATUS */ + pxTopOfStack--; + + *pxTopOfStack = (StackType_t) pxCode; /* CP0_EPC */ + pxTopOfStack--; + + *pxTopOfStack = (StackType_t) portTASK_RETURN_ADDRESS; /* ra */ + pxTopOfStack -= 15; + + *pxTopOfStack = (StackType_t) pvParameters; /* Parameters to pass in. */ + pxTopOfStack -= 15; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static __inline uint32_t prvDisableInterrupt( void ) +{ +uint32_t prev_state; + + __asm volatile( "di %0; ehb" : "=r" ( prev_state ) :: "memory" ); + return prev_state; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT( uxSavedTaskStackPointer == 0UL ); + portDISABLE_INTERRUPTS(); + for( ;; ); +} +/*-----------------------------------------------------------*/ + +/* + * Setup a timer for a regular tick. This function uses the RTOS timer. + * The function is declared weak so an application writer can use a different + * timer by redefining this implementation. If a different timer is used then + * configTICK_INTERRUPT_VECTOR must also be defined in FreeRTOSConfig.h to + * ensure the RTOS provided tick interrupt handler is installed on the correct + * vector number. + */ +__attribute__(( weak )) void vApplicationSetupTickTimerInterrupt( void ) +{ +/* MEC14xx RTOS Timer whose input clock is 32KHz. */ +const uint32_t ulPreload = ( 32768ul / ( configTICK_RATE_HZ ) ); + + configASSERT( ulPreload != 0UL ); + + /* Configure the RTOS timer. */ + portMMCR_RTMR_CONTROL = 0ul; + portMMCR_RTMR_PRELOAD = ulPreload; + + /* Configure interrupts from the RTOS timer. */ + portMMCR_JTVIC_GIRQ23_SRC = ( portGIRQ23_RTOS_TIMER_MASK ); + portMMCR_JTVIC_GIRQ23_PRIA &= ~( 0x0Ful << 16 ); + portMMCR_JTVIC_GIRQ23_PRIA |= ( ( portIPL_TO_CODE( configKERNEL_INTERRUPT_PRIORITY ) ) << 16 ); + portMMCR_JTVIC_GIRQ23_SETEN = ( portGIRQ23_RTOS_TIMER_MASK ); + + /* Enable the RTOS timer. */ + portMMCR_RTMR_CONTROL = 0x0Fu; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler(void) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( uxInterruptNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void vPortStartFirstTask( void ); +extern void *pxCurrentTCB; + + #if ( configCHECK_FOR_STACK_OVERFLOW > 2 ) + { + /* Fill the ISR stack to make it easy to asses how much is being used. */ + memset( ( void * ) xISRStack, portISR_STACK_FILL_BYTE, sizeof( xISRStack ) ); + } + #endif /* configCHECK_FOR_STACK_OVERFLOW > 2 */ + + /* Clear the software interrupt flag. */ + portMMCR_JTVIC_GIRQ24_SRC = (portGIRQ24_M14K_SOFTIRQ0_MASK); + + /* Set software timer priority. Each GIRQn has one nibble containing its + priority */ + portMMCR_JTVIC_GIRQ24_PRIA &= ~(0xF0ul); + portMMCR_JTVIC_GIRQ24_PRIA |= ( portIPL_TO_CODE( configKERNEL_INTERRUPT_PRIORITY ) << 4 ); + + /* Enable software interrupt. */ + portMMCR_JTVIC_GIRQ24_SETEN = ( portGIRQ24_M14K_SOFTIRQ0_MASK ); + + /* Setup the timer to generate the tick. Interrupts will have been disabled + by the time we get here. */ + vApplicationSetupTickTimerInterrupt(); + + /* Start the highest priority task that has been created so far. Its stack + location is loaded into uxSavedTaskStackPointer. */ + uxSavedTaskStackPointer = *( UBaseType_t * ) pxCurrentTCB; + vPortStartFirstTask(); + + /* Should never get here as the tasks will now be executing! Call the task + exit error function to prevent compiler warnings about a static function + not being called in the case that the application writer overrides this + functionality by defining configTASK_RETURN_ADDRESS. */ + prvTaskExitError(); + + return pdFALSE; +} +/*-----------------------------------------------------------*/ + +void vPortIncrementTick( void ) +{ +UBaseType_t uxSavedStatus; +uint32_t ulCause; + + uxSavedStatus = uxPortSetInterruptMaskFromISR(); + { + if( xTaskIncrementTick() != pdFALSE ) + { + /* Pend a context switch. */ + ulCause = ulPortGetCP0Cause(); + ulCause |= ( 1ul << 8UL ); + vPortSetCP0Cause( ulCause ); + } + } + vPortClearInterruptMaskFromISR( uxSavedStatus ); + + /* Look for the ISR stack getting near or past its limit. */ + portCHECK_ISR_STACK(); + + /* Clear timer interrupt. */ + configCLEAR_TICK_TIMER_INTERRUPT(); +} +/*-----------------------------------------------------------*/ + +UBaseType_t uxPortSetInterruptMaskFromISR( void ) +{ +UBaseType_t uxSavedStatusRegister; + + prvDisableInterrupt(); + uxSavedStatusRegister = ulPortGetCP0Status() | 0x01; + + /* This clears the IPL bits, then sets them to + configMAX_SYSCALL_INTERRUPT_PRIORITY. This function should not be called + from an interrupt that has a priority above + configMAX_SYSCALL_INTERRUPT_PRIORITY so, when used correctly, the action + can only result in the IPL being unchanged or raised, and therefore never + lowered. */ + vPortSetCP0Status( ( ( uxSavedStatusRegister & ( ~portALL_IPL_BITS ) ) ) | ( configMAX_SYSCALL_INTERRUPT_PRIORITY << portIPL_SHIFT ) ); + + return uxSavedStatusRegister; +} +/*-----------------------------------------------------------*/ + +void vPortClearInterruptMaskFromISR( UBaseType_t uxSavedStatusRegister ) +{ + vPortSetCP0Status( uxSavedStatusRegister ); +} +/*-----------------------------------------------------------*/ + + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC32MEC14xx/port_asm.S b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC32MEC14xx/port_asm.S new file mode 100644 index 0000000..7f932f1 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC32MEC14xx/port_asm.S @@ -0,0 +1,390 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* FreeRTOS includes. */ +#include "FreeRTOSConfig.h" +#include "ISR_Support.h" + +/* Microchip includes. */ +#include +#include + + .extern pxCurrentTCB + .extern vTaskSwitchContext + .extern vPortIncrementTick + .extern xISRStackTop + + PORT_CPP_JTVIC_BASE = 0xBFFFC000 + PORT_CCP_JTVIC_GIRQ24_SRC = 0xBFFFC100 + + .global vPortStartFirstTask .text + .global vPortYieldISR .text + .global vPortTickInterruptHandler .text + + +/******************************************************************/ + + +/*************************************************************** +* The following is needed to locate the +* vPortTickInterruptHandler function into the correct vector +* MEC14xx - This ISR will only be used if HW timers' interrupts +* in GIRQ23 are disaggregated. +* +***************************************************************/ + + .set noreorder + .set noat + .set micromips + + .section .text, code + .ent vPortTickInterruptHandler + +#if configTIMERS_DISAGGREGATED_ISRS == 0 + + .globl girq23_isr + +girq23_isr: +vPortTickInterruptHandler: + + portSAVE_CONTEXT + + jal girq23_handler + nop + + portRESTORE_CONTEXT + +.end vPortTickInterruptHandler + +#else + + .globl girq23_b4 + +girq23_b4: +vPortTickInterruptHandler: + + portSAVE_CONTEXT + + jal vPortIncrementTick + nop + + portRESTORE_CONTEXT + +.end vPortTickInterruptHandler + +#endif /* #if configTIMERS_DISAGGREGATED_ISRS == 0 */ + +/******************************************************************/ + + .set micromips + .set noreorder + .set noat + + .section .text, code + .ent vPortStartFirstTask + +vPortStartFirstTask: + + /* Simply restore the context of the highest priority task that has + been created so far. */ + portRESTORE_CONTEXT + +.end vPortStartFirstTask + + + +/*******************************************************************/ + +/*************************************************************** +* The following is needed to locate the vPortYieldISR function into the correct +* vector. +***************************************************************/ + + .set micromips + .set noreorder + .set noat + + .section .text, code + + .global vPortYieldISR + + +#if configCPU_DISAGGREGATED_ISRS == 0 + .global girq24_isr + .ent girq24_isr +girq24_isr: + la k0, PORT_CPP_JTVIC_BASE + lw k0, 0x10C(k0) + andi k1, k0, 0x2 + bgtz k1, vPortYieldISR + nop + + portSAVE_CONTEXT + + jal girq24_b_0_2 + + portRESTORE_CONTEXT + + .end girq24_isr + +#else + .global girq24_b1 +girq24_b1: +#endif + .ent vPortYieldISR +vPortYieldISR: + + /* Make room for the context. First save the current status so it can be + manipulated, and the cause and EPC registers so thier original values + are captured. */ + addiu sp, sp, -portCONTEXT_SIZE + mfc0 k1, _CP0_STATUS + + /* Also save s6 and s5 so they can be used. Any nesting interrupts should + maintain the values of these registers across the ISR. */ + sw s6, 44(sp) + sw s5, 40(sp) + sw k1, portSTATUS_STACK_LOCATION(sp) + + /* Prepare to re-enable interrupts above the kernel priority. */ + ins k1, zero, 10, 7 /* Clear IPL bits 0:6. */ + ins k1, zero, 18, 1 /* Clear IPL bit 7 */ + ori k1, k1, ( configMAX_SYSCALL_INTERRUPT_PRIORITY << 10 ) + ins k1, zero, 1, 4 /* Clear EXL, ERL and UM. */ + + /* s5 is used as the frame pointer. */ + add s5, zero, sp + + /* Swap to the system stack. This is not conditional on the nesting + count as this interrupt is always the lowest priority and therefore + the nesting is always 0. */ + la sp, xISRStackTop + lw sp, (sp) + + /* Set the nesting count. */ + la k0, uxInterruptNesting + addiu s6, zero, 1 + sw s6, 0(k0) + + /* s6 holds the EPC value, this is saved with the rest of the context + after interrupts are enabled. */ + mfc0 s6, _CP0_EPC + + /* Re-enable interrupts above configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + mtc0 k1, _CP0_STATUS + + /* Save the context into the space just created. s6 is saved again + here as it now contains the EPC value. */ + sw ra, 120(s5) + sw s8, 116(s5) + sw t9, 112(s5) + sw t8, 108(s5) + sw t7, 104(s5) + sw t6, 100(s5) + sw t5, 96(s5) + sw t4, 92(s5) + sw t3, 88(s5) + sw t2, 84(s5) + sw t1, 80(s5) + sw t0, 76(s5) + sw a3, 72(s5) + sw a2, 68(s5) + sw a1, 64(s5) + sw a0, 60(s5) + sw v1, 56(s5) + sw v0, 52(s5) + sw s7, 48(s5) + sw s6, portEPC_STACK_LOCATION(s5) + /* s5 and s6 has already been saved. */ + sw s4, 36(s5) + sw s3, 32(s5) + sw s2, 28(s5) + sw s1, 24(s5) + sw s0, 20(s5) + sw $1, 16(s5) + + /* s7 is used as a scratch register as this should always be saved acro ss + nesting interrupts. */ + mfhi s7 + sw s7, 12(s5) + mflo s7 + sw s7, 8(s5) + + /* Save the stack pointer to the task. */ + la s7, pxCurrentTCB + lw s7, (s7) + sw s5, (s7) + + /* Set the interrupt mask to the max priority that can use the API. + The yield handler will only be called at configKERNEL_INTERRUPT_PRIORITY + which is below configMAX_SYSCALL_INTERRUPT_PRIORITY - so this can only + ever raise the IPL value and never lower it. */ + di + ehb + mfc0 s7, _CP0_STATUS + ins s7, zero, 10, 7 + ins s7, zero, 18, 1 + ori s6, s7, ( configMAX_SYSCALL_INTERRUPT_PRIORITY << 10 ) | 1 + + /* This mtc0 re-enables interrupts, but only above + configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + mtc0 s6, _CP0_STATUS + ehb + + /* Clear the software interrupt in the core. */ + mfc0 s6, _CP0_CAUSE + ins s6, zero, 8, 1 + mtc0 s6, _CP0_CAUSE + ehb + + /* Clear the interrupt in the interrupt controller. + MEC14xx GIRQ24 Source bit[1] = 1 to clear */ + la s6, PORT_CCP_JTVIC_GIRQ24_SRC + addiu s4, zero, 2 + sw s4, (s6) + jal vTaskSwitchContext + nop + + /* Clear the interrupt mask again. The saved status value is still in s7 */ + mtc0 s7, _CP0_STATUS + ehb + + /* Restore the stack pointer from the TCB. */ + la s0, pxCurrentTCB + lw s0, (s0) + lw s5, (s0) + + /* Restore the rest of the context. */ + lw s0, 8(s5) + mtlo s0 + lw s0, 12(s5) + mthi s0 + + lw $1, 16(s5) + lw s0, 20(s5) + lw s1, 24(s5) + lw s2, 28(s5) + lw s3, 32(s5) + lw s4, 36(s5) + + /* s5 is loaded later. */ + lw s6, 44(s5) + lw s7, 48(s5) + lw v0, 52(s5) + lw v1, 56(s5) + lw a0, 60(s5) + lw a1, 64(s5) + lw a2, 68(s5) + lw a3, 72(s5) + lw t0, 76(s5) + lw t1, 80(s5) + lw t2, 84(s5) + lw t3, 88(s5) + lw t4, 92(s5) + lw t5, 96(s5) + lw t6, 100(s5) + lw t7, 104(s5) + lw t8, 108(s5) + lw t9, 112(s5) + lw s8, 116(s5) + lw ra, 120(s5) + + /* Protect access to the k registers, and others. */ + di + ehb + + /* Set nesting back to zero. As the lowest priority interrupt this + interrupt cannot have nested. */ + la k0, uxInterruptNesting + sw zero, 0(k0) + + /* Switch back to use the real stack pointer. */ + add sp, zero, s5 + + /* Restore the real s5 value. */ + lw s5, 40(sp) + + /* Pop the status and epc values. */ + lw k1, portSTATUS_STACK_LOCATION(sp) + lw k0, portEPC_STACK_LOCATION(sp) + + /* Remove stack frame. */ + addiu sp, sp, portCONTEXT_SIZE + + mtc0 k1, _CP0_STATUS + mtc0 k0, _CP0_EPC + ehb + eret + nop + +.end vPortYieldISR + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC32MEC14xx/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC32MEC14xx/portmacro.h new file mode 100644 index 0000000..114d40d --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC32MEC14xx/portmacro.h @@ -0,0 +1,294 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 8 +#define portSTACK_GROWTH -1 +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +#define portIPL_SHIFT ( 10UL ) +/* Don't straddle the CEE bit. Interrupts calling FreeRTOS functions should +never have higher IPL bits set anyway. */ +#define portALL_IPL_BITS ( 0x7FUL << portIPL_SHIFT ) +#define portSW0_BIT ( 0x01 << 8 ) + +/* Interrupt priority conversion */ +#define portIPL_TO_CODE( iplNumber ) ( ( iplNumber >> 1 ) & 0x03ul ) +#define portCODE_TO_IPL( iplCode ) ( ( iplCode << 1 ) | 0x01ul ) + +/*-----------------------------------------------------------*/ + +static inline uint32_t ulPortGetCP0Status( void ) +{ +uint32_t rv; + + __asm volatile( + "\n\t" + "mfc0 %0,$12,0 \n\t" + : "=r" ( rv ) :: ); + + return rv; +} +/*-----------------------------------------------------------*/ + +static inline void vPortSetCP0Status( uint32_t new_status) +{ + ( void ) new_status; + + __asm__ __volatile__( + "\n\t" + "mtc0 %0,$12,0 \n\t" + "ehb \n\t" + : + :"r" ( new_status ) : ); +} +/*-----------------------------------------------------------*/ + +static inline uint32_t ulPortGetCP0Cause( void ) +{ +uint32_t rv; + + __asm volatile( + "\n\t" + "mfc0 %0,$13,0 \n\t" + : "=r" ( rv ) :: ); + + return rv; +} +/*-----------------------------------------------------------*/ + +static inline void vPortSetCP0Cause( uint32_t new_cause ) +{ + ( void ) new_cause; + + __asm__ __volatile__( + "\n\t" + "mtc0 %0,$13,0 \n\t" + "ehb \n\t" + : + :"r" ( new_cause ) : ); +} +/*-----------------------------------------------------------*/ + +/* This clears the IPL bits, then sets them to +configMAX_SYSCALL_INTERRUPT_PRIORITY. An extra check is performed if +configASSERT() is defined to ensure an assertion handler does not inadvertently +attempt to lower the IPL when the call to assert was triggered because the IPL +value was found to be above configMAX_SYSCALL_INTERRUPT_PRIORITY when an ISR +safe FreeRTOS API function was executed. ISR safe FreeRTOS API functions are +those that end in FromISR. FreeRTOS maintains a separate interrupt API to +ensure API function and interrupt entry is as fast and as simple as possible. */ +#ifdef configASSERT + #define portDISABLE_INTERRUPTS() \ + { \ + uint32_t ulStatus; \ + /* Mask interrupts at and below the kernel interrupt priority. */ \ + ulStatus = ulPortGetCP0Status(); \ + /* Is the current IPL below configMAX_SYSCALL_INTERRUPT_PRIORITY? */ \ + if( ( ( ulStatus & portALL_IPL_BITS ) >> portIPL_SHIFT ) < configMAX_SYSCALL_INTERRUPT_PRIORITY ) \ + { \ + ulStatus &= ~portALL_IPL_BITS; \ + vPortSetCP0Status( ( ulStatus | ( configMAX_SYSCALL_INTERRUPT_PRIORITY << portIPL_SHIFT ) ) ); \ + } \ + } +#else /* configASSERT */ + #define portDISABLE_INTERRUPTS() \ + { \ + uint32_t ulStatus; \ + /* Mask interrupts at and below the kernel interrupt priority. */ \ + ulStatus = ulPortGetCP0Status(); \ + ulStatus &= ~portALL_IPL_BITS; \ + vPortSetCP0Status( ( ulStatus | ( configMAX_SYSCALL_INTERRUPT_PRIORITY << portIPL_SHIFT ) ) ); \ + } +#endif /* configASSERT */ + +#define portENABLE_INTERRUPTS() \ +{ \ +uint32_t ulStatus; \ + /* Unmask all interrupts. */ \ + ulStatus = ulPortGetCP0Status(); \ + ulStatus &= ~portALL_IPL_BITS; \ + vPortSetCP0Status( ulStatus ); \ +} + + +extern void vTaskEnterCritical( void ); +extern void vTaskExitCritical( void ); +#define portCRITICAL_NESTING_IN_TCB 1 +#define portENTER_CRITICAL() vTaskEnterCritical() +#define portEXIT_CRITICAL() vTaskExitCritical() + +extern UBaseType_t uxPortSetInterruptMaskFromISR(); +extern void vPortClearInterruptMaskFromISR( UBaseType_t ); +#define portSET_INTERRUPT_MASK_FROM_ISR() uxPortSetInterruptMaskFromISR() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedStatusRegister ) vPortClearInterruptMaskFromISR( uxSavedStatusRegister ) + +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31 - _clz( ( uxReadyPriorities ) ) ) + +#endif /* taskRECORD_READY_PRIORITY */ + +/*-----------------------------------------------------------*/ + +/* Task utilities. */ + +#define portYIELD() \ +{ \ +uint32_t ulCause; \ + /* Trigger software interrupt. */ \ + ulCause = ulPortGetCP0Cause(); \ + ulCause |= portSW0_BIT; \ + vPortSetCP0Cause( ulCause ); \ +} + +extern volatile UBaseType_t uxInterruptNesting; +#define portASSERT_IF_IN_ISR() configASSERT( uxInterruptNesting == 0 ) + +#define portNOP() __asm volatile ( "nop" ) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) __attribute__((noreturn)) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*-----------------------------------------------------------*/ + +#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired ) \ + { \ + portYIELD(); \ + } + +/* Required by the kernel aware debugger. */ +#ifdef __DEBUG + #define portREMOVE_STATIC_QUALIFIER +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC32MX/ISR_Support.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC32MX/ISR_Support.h new file mode 100644 index 0000000..1697d43 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC32MX/ISR_Support.h @@ -0,0 +1,233 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#include "FreeRTOSConfig.h" + +#define portCONTEXT_SIZE 132 +#define portEPC_STACK_LOCATION 124 +#define portSTATUS_STACK_LOCATION 128 + +/******************************************************************/ +.macro portSAVE_CONTEXT + + /* Make room for the context. First save the current status so it can be + manipulated, and the cause and EPC registers so their original values are + captured. */ + mfc0 k0, _CP0_CAUSE + addiu sp, sp, -portCONTEXT_SIZE + mfc0 k1, _CP0_STATUS + + /* Also save s6 and s5 so they can be used. Any nesting interrupts should + maintain the values of these registers across the ISR. */ + sw s6, 44(sp) + sw s5, 40(sp) + sw k1, portSTATUS_STACK_LOCATION(sp) + + /* Prepare to enable interrupts above the current priority. */ + srl k0, k0, 0xa + ins k1, k0, 10, 6 + ins k1, zero, 1, 4 + + /* s5 is used as the frame pointer. */ + add s5, zero, sp + + /* Check the nesting count value. */ + la k0, uxInterruptNesting + lw s6, (k0) + + /* If the nesting count is 0 then swap to the the system stack, otherwise + the system stack is already being used. */ + bne s6, zero, 1f + nop + + /* Swap to the system stack. */ + la sp, xISRStackTop + lw sp, (sp) + + /* Increment and save the nesting count. */ +1: addiu s6, s6, 1 + sw s6, 0(k0) + + /* s6 holds the EPC value, this is saved after interrupts are re-enabled. */ + mfc0 s6, _CP0_EPC + + /* Re-enable interrupts. */ + mtc0 k1, _CP0_STATUS + + /* Save the context into the space just created. s6 is saved again + here as it now contains the EPC value. No other s registers need be + saved. */ + sw ra, 120(s5) + sw s8, 116(s5) + sw t9, 112(s5) + sw t8, 108(s5) + sw t7, 104(s5) + sw t6, 100(s5) + sw t5, 96(s5) + sw t4, 92(s5) + sw t3, 88(s5) + sw t2, 84(s5) + sw t1, 80(s5) + sw t0, 76(s5) + sw a3, 72(s5) + sw a2, 68(s5) + sw a1, 64(s5) + sw a0, 60(s5) + sw v1, 56(s5) + sw v0, 52(s5) + sw s6, portEPC_STACK_LOCATION(s5) + sw $1, 16(s5) + + /* s6 is used as a scratch register. */ + mfhi s6 + sw s6, 12(s5) + mflo s6 + sw s6, 8(s5) + + /* Update the task stack pointer value if nesting is zero. */ + la s6, uxInterruptNesting + lw s6, (s6) + addiu s6, s6, -1 + bne s6, zero, 1f + nop + + /* Save the stack pointer. */ + la s6, uxSavedTaskStackPointer + sw s5, (s6) +1: + .endm + +/******************************************************************/ +.macro portRESTORE_CONTEXT + + /* Restore the stack pointer from the TCB. This is only done if the + nesting count is 1. */ + la s6, uxInterruptNesting + lw s6, (s6) + addiu s6, s6, -1 + bne s6, zero, 1f + nop + la s6, uxSavedTaskStackPointer + lw s5, (s6) + + /* Restore the context. */ +1: lw s6, 8(s5) + mtlo s6 + lw s6, 12(s5) + mthi s6 + lw $1, 16(s5) + /* s6 is loaded as it was used as a scratch register and therefore saved + as part of the interrupt context. */ + lw s6, 44(s5) + lw v0, 52(s5) + lw v1, 56(s5) + lw a0, 60(s5) + lw a1, 64(s5) + lw a2, 68(s5) + lw a3, 72(s5) + lw t0, 76(s5) + lw t1, 80(s5) + lw t2, 84(s5) + lw t3, 88(s5) + lw t4, 92(s5) + lw t5, 96(s5) + lw t6, 100(s5) + lw t7, 104(s5) + lw t8, 108(s5) + lw t9, 112(s5) + lw s8, 116(s5) + lw ra, 120(s5) + + /* Protect access to the k registers, and others. */ + di + ehb + + /* Decrement the nesting count. */ + la k0, uxInterruptNesting + lw k1, (k0) + addiu k1, k1, -1 + sw k1, 0(k0) + + lw k0, portSTATUS_STACK_LOCATION(s5) + lw k1, portEPC_STACK_LOCATION(s5) + + /* Leave the stack in its original state. First load sp from s5, then + restore s5 from the stack. */ + add sp, zero, s5 + lw s5, 40(sp) + addiu sp, sp, portCONTEXT_SIZE + + mtc0 k0, _CP0_STATUS + mtc0 k1, _CP0_EPC + ehb + eret + nop + + .endm + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC32MX/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC32MX/port.c new file mode 100644 index 0000000..43da50f --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC32MX/port.c @@ -0,0 +1,374 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the PIC32MX port. + *----------------------------------------------------------*/ + +#ifndef __XC + #error This port is designed to work with XC32. Please update your C compiler version. +#endif + +/* Scheduler include files. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Hardware specifics. */ +#define portTIMER_PRESCALE 8 +#define portPRESCALE_BITS 1 + +/* Bits within various registers. */ +#define portIE_BIT ( 0x00000001 ) +#define portEXL_BIT ( 0x00000002 ) + +/* Bits within the CAUSE register. */ +#define portCORE_SW_0 ( 0x00000100 ) +#define portCORE_SW_1 ( 0x00000200 ) + +/* The EXL bit is set to ensure interrupts do not occur while the context of +the first task is being restored. */ +#define portINITIAL_SR ( portIE_BIT | portEXL_BIT ) + +/* +By default port.c generates its tick interrupt from TIMER1. The user can +override this behaviour by: + 1: Providing their own implementation of vApplicationSetupTickTimerInterrupt(), + which is the function that configures the timer. The function is defined + as a weak symbol in this file so if the same function name is used in the + application code then the version in the application code will be linked + into the application in preference to the version defined in this file. + 2: Define configTICK_INTERRUPT_VECTOR to the vector number of the timer used + to generate the tick interrupt. For example, when timer 1 is used then + configTICK_INTERRUPT_VECTOR is set to _TIMER_1_VECTOR. + configTICK_INTERRUPT_VECTOR should be defined in FreeRTOSConfig.h. + 3: Define configCLEAR_TICK_TIMER_INTERRUPT() to clear the interrupt in the + timer used to generate the tick interrupt. For example, when timer 1 is + used configCLEAR_TICK_TIMER_INTERRUPT() is defined to + IFS0CLR = _IFS0_T1IF_MASK. +*/ +#ifndef configTICK_INTERRUPT_VECTOR + #define configTICK_INTERRUPT_VECTOR _TIMER_1_VECTOR + #define configCLEAR_TICK_TIMER_INTERRUPT() IFS0CLR = _IFS0_T1IF_MASK +#else + #ifndef configCLEAR_TICK_TIMER_INTERRUPT + #error If configTICK_INTERRUPT_VECTOR is defined in application code then configCLEAR_TICK_TIMER_INTERRUPT must also be defined in application code. + #endif +#endif + +/* Let the user override the pre-loading of the initial RA with the address of +prvTaskExitError() in case it messes up unwinding of the stack in the +debugger - in which case configTASK_RETURN_ADDRESS can be defined as 0 (NULL). */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/* Set configCHECK_FOR_STACK_OVERFLOW to 3 to add ISR stack checking to task +stack checking. A problem in the ISR stack will trigger an assert, not call the +stack overflow hook function (because the stack overflow hook is specific to a +task stack, not the ISR stack). */ +#if( configCHECK_FOR_STACK_OVERFLOW > 2 ) + + /* Don't use 0xa5 as the stack fill bytes as that is used by the kernerl for + the task stacks, and so will legitimately appear in many positions within + the ISR stack. */ + #define portISR_STACK_FILL_BYTE 0xee + + static const uint8_t ucExpectedStackBytes[] = { + portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, \ + portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, \ + portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, \ + portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, \ + portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE }; \ + + #define portCHECK_ISR_STACK() configASSERT( ( memcmp( ( void * ) xISRStack, ( void * ) ucExpectedStackBytes, sizeof( ucExpectedStackBytes ) ) == 0 ) ) +#else + /* Define the function away. */ + #define portCHECK_ISR_STACK() +#endif /* configCHECK_FOR_STACK_OVERFLOW > 2 */ + +/*-----------------------------------------------------------*/ + + +/* + * Place the prototype here to ensure the interrupt vector is correctly installed. + * Note that because the interrupt is written in assembly, the IPL setting in the + * following line of code has no effect. The interrupt priority is set by the + * call to ConfigIntTimer1() in vApplicationSetupTickTimerInterrupt(). + */ +extern void __attribute__( (interrupt(IPL1AUTO), vector( configTICK_INTERRUPT_VECTOR ))) vPortTickInterruptHandler( void ); + +/* + * The software interrupt handler that performs the yield. Note that, because + * the interrupt is written in assembly, the IPL setting in the following line of + * code has no effect. The interrupt priority is set by the call to + * mConfigIntCoreSW0() in xPortStartScheduler(). + */ +void __attribute__( (interrupt(IPL1AUTO), vector(_CORE_SOFTWARE_0_VECTOR))) vPortYieldISR( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* Records the interrupt nesting depth. This is initialised to one as it is +decremented to 0 when the first task starts. */ +volatile UBaseType_t uxInterruptNesting = 0x01; + +/* Stores the task stack pointer when a switch is made to use the system stack. */ +UBaseType_t uxSavedTaskStackPointer = 0; + +/* The stack used by interrupt service routines that cause a context switch. */ +StackType_t xISRStack[ configISR_STACK_SIZE ] = { 0 }; + +/* The top of stack value ensures there is enough space to store 6 registers on +the callers stack, as some functions seem to want to do this. */ +const StackType_t * const xISRStackTop = &( xISRStack[ configISR_STACK_SIZE - 7 ] ); + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Ensure byte alignment is maintained when leaving this function. */ + pxTopOfStack--; + + *pxTopOfStack = (StackType_t) 0xDEADBEEF; + pxTopOfStack--; + + *pxTopOfStack = (StackType_t) 0x12345678; /* Word to which the stack pointer will be left pointing after context restore. */ + pxTopOfStack--; + + *pxTopOfStack = (StackType_t) _CP0_GET_CAUSE(); + pxTopOfStack--; + + *pxTopOfStack = (StackType_t) portINITIAL_SR;/* CP0_STATUS */ + pxTopOfStack--; + + *pxTopOfStack = (StackType_t) pxCode; /* CP0_EPC */ + pxTopOfStack--; + + *pxTopOfStack = (StackType_t) portTASK_RETURN_ADDRESS; /* ra */ + pxTopOfStack -= 15; + + *pxTopOfStack = (StackType_t) pvParameters; /* Parameters to pass in. */ + pxTopOfStack -= 15; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT( uxSavedTaskStackPointer == 0UL ); + portDISABLE_INTERRUPTS(); + for( ;; ); +} +/*-----------------------------------------------------------*/ + +/* + * Setup a timer for a regular tick. This function uses peripheral timer 1. + * The function is declared weak so an application writer can use a different + * timer by redefining this implementation. If a different timer is used then + * configTICK_INTERRUPT_VECTOR must also be defined in FreeRTOSConfig.h to + * ensure the RTOS provided tick interrupt handler is installed on the correct + * vector number. When Timer 1 is used the vector number is defined as + * _TIMER_1_VECTOR. + */ +__attribute__(( weak )) void vApplicationSetupTickTimerInterrupt( void ) +{ +const uint32_t ulCompareMatch = ( (configPERIPHERAL_CLOCK_HZ / portTIMER_PRESCALE) / configTICK_RATE_HZ ) - 1; + + T1CON = 0x0000; + T1CONbits.TCKPS = portPRESCALE_BITS; + PR1 = ulCompareMatch; + IPC1bits.T1IP = configKERNEL_INTERRUPT_PRIORITY; + + /* Clear the interrupt as a starting condition. */ + IFS0bits.T1IF = 0; + + /* Enable the interrupt. */ + IEC0bits.T1IE = 1; + + /* Start the timer. */ + T1CONbits.TON = 1; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler(void) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( uxInterruptNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void vPortStartFirstTask( void ); +extern void *pxCurrentTCB; + + #if ( configCHECK_FOR_STACK_OVERFLOW > 2 ) + { + /* Fill the ISR stack to make it easy to asses how much is being used. */ + memset( ( void * ) xISRStack, portISR_STACK_FILL_BYTE, sizeof( xISRStack ) ); + } + #endif /* configCHECK_FOR_STACK_OVERFLOW > 2 */ + + /* Clear the software interrupt flag. */ + IFS0CLR = _IFS0_CS0IF_MASK; + + /* Set software timer priority. */ + IPC0CLR = _IPC0_CS0IP_MASK; + IPC0SET = ( configKERNEL_INTERRUPT_PRIORITY << _IPC0_CS0IP_POSITION ); + + /* Enable software interrupt. */ + IEC0CLR = _IEC0_CS0IE_MASK; + IEC0SET = 1 << _IEC0_CS0IE_POSITION; + + /* Setup the timer to generate the tick. Interrupts will have been + disabled by the time we get here. */ + vApplicationSetupTickTimerInterrupt(); + + /* Kick off the highest priority task that has been created so far. + Its stack location is loaded into uxSavedTaskStackPointer. */ + uxSavedTaskStackPointer = *( UBaseType_t * ) pxCurrentTCB; + vPortStartFirstTask(); + + /* Should never get here as the tasks will now be executing! Call the task + exit error function to prevent compiler warnings about a static function + not being called in the case that the application writer overrides this + functionality by defining configTASK_RETURN_ADDRESS. */ + prvTaskExitError(); + + return pdFALSE; +} +/*-----------------------------------------------------------*/ + +void vPortIncrementTick( void ) +{ +UBaseType_t uxSavedStatus; + + uxSavedStatus = uxPortSetInterruptMaskFromISR(); + { + if( xTaskIncrementTick() != pdFALSE ) + { + /* Pend a context switch. */ + _CP0_BIS_CAUSE( portCORE_SW_0 ); + } + } + vPortClearInterruptMaskFromISR( uxSavedStatus ); + + /* Look for the ISR stack getting near or past its limit. */ + portCHECK_ISR_STACK(); + + /* Clear timer interrupt. */ + configCLEAR_TICK_TIMER_INTERRUPT(); +} +/*-----------------------------------------------------------*/ + +UBaseType_t uxPortSetInterruptMaskFromISR( void ) +{ +UBaseType_t uxSavedStatusRegister; + + __builtin_disable_interrupts(); + uxSavedStatusRegister = _CP0_GET_STATUS() | 0x01; + /* This clears the IPL bits, then sets them to + configMAX_SYSCALL_INTERRUPT_PRIORITY. This function should not be called + from an interrupt that has a priority above + configMAX_SYSCALL_INTERRUPT_PRIORITY so, when used correctly, the action + can only result in the IPL being unchanged or raised, and therefore never + lowered. */ + _CP0_SET_STATUS( ( ( uxSavedStatusRegister & ( ~portALL_IPL_BITS ) ) ) | ( configMAX_SYSCALL_INTERRUPT_PRIORITY << portIPL_SHIFT ) ); + + return uxSavedStatusRegister; +} +/*-----------------------------------------------------------*/ + +void vPortClearInterruptMaskFromISR( UBaseType_t uxSavedStatusRegister ) +{ + _CP0_SET_STATUS( uxSavedStatusRegister ); +} +/*-----------------------------------------------------------*/ + + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC32MX/port_asm.S b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC32MX/port_asm.S new file mode 100644 index 0000000..6f6ee62 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC32MX/port_asm.S @@ -0,0 +1,310 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#include +#include +#include "ISR_Support.h" + + + .set nomips16 + .set noreorder + + .extern pxCurrentTCB + .extern vTaskSwitchContext + .extern vPortIncrementTick + .extern xISRStackTop + + .global vPortStartFirstTask + .global vPortYieldISR + .global vPortTickInterruptHandler + + +/******************************************************************/ + + .set noreorder + .set noat + .ent vPortTickInterruptHandler + +vPortTickInterruptHandler: + + portSAVE_CONTEXT + + jal vPortIncrementTick + nop + + portRESTORE_CONTEXT + + .end vPortTickInterruptHandler + +/******************************************************************/ + + .set noreorder + .set noat + .ent vPortStartFirstTask + +vPortStartFirstTask: + + /* Simply restore the context of the highest priority task that has been + created so far. */ + portRESTORE_CONTEXT + + .end vPortStartFirstTask + + + +/*******************************************************************/ + + .set noreorder + .set noat + .ent vPortYieldISR + +vPortYieldISR: + + /* Make room for the context. First save the current status so it can be + manipulated. */ + addiu sp, sp, -portCONTEXT_SIZE + mfc0 k1, _CP0_STATUS + + /* Also save s6 and s5 so they can be used. Any nesting interrupts should + maintain the values of these registers across the ISR. */ + sw s6, 44(sp) + sw s5, 40(sp) + sw k1, portSTATUS_STACK_LOCATION(sp) + + /* Prepare to re-enabled interrupt above the kernel priority. */ + ins k1, zero, 10, 6 + ori k1, k1, ( configMAX_SYSCALL_INTERRUPT_PRIORITY << 10 ) + ins k1, zero, 1, 4 + + /* s5 is used as the frame pointer. */ + add s5, zero, sp + + /* Swap to the system stack. This is not conditional on the nesting + count as this interrupt is always the lowest priority and therefore + the nesting is always 0. */ + la sp, xISRStackTop + lw sp, (sp) + + /* Set the nesting count. */ + la k0, uxInterruptNesting + addiu s6, zero, 1 + sw s6, 0(k0) + + /* s6 holds the EPC value, this is saved with the rest of the context + after interrupts are enabled. */ + mfc0 s6, _CP0_EPC + + /* Re-enable interrupts above configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + mtc0 k1, _CP0_STATUS + + /* Save the context into the space just created. s6 is saved again + here as it now contains the EPC value. */ + sw ra, 120(s5) + sw s8, 116(s5) + sw t9, 112(s5) + sw t8, 108(s5) + sw t7, 104(s5) + sw t6, 100(s5) + sw t5, 96(s5) + sw t4, 92(s5) + sw t3, 88(s5) + sw t2, 84(s5) + sw t1, 80(s5) + sw t0, 76(s5) + sw a3, 72(s5) + sw a2, 68(s5) + sw a1, 64(s5) + sw a0, 60(s5) + sw v1, 56(s5) + sw v0, 52(s5) + sw s7, 48(s5) + sw s6, portEPC_STACK_LOCATION(s5) + /* s5 and s6 has already been saved. */ + sw s4, 36(s5) + sw s3, 32(s5) + sw s2, 28(s5) + sw s1, 24(s5) + sw s0, 20(s5) + sw $1, 16(s5) + + /* s7 is used as a scratch register as this should always be saved across + nesting interrupts. */ + mfhi s7 + sw s7, 12(s5) + mflo s7 + sw s7, 8(s5) + + /* Save the stack pointer to the task. */ + la s7, pxCurrentTCB + lw s7, (s7) + sw s5, (s7) + + /* Set the interrupt mask to the max priority that can use the API. The + yield handler will only be called at configKERNEL_INTERRUPT_PRIORITY which + is below configMAX_SYSCALL_INTERRUPT_PRIORITY - so this can only ever + raise the IPL value and never lower it. */ + di + ehb + mfc0 s7, _CP0_STATUS + ins s7, zero, 10, 6 + ori s6, s7, ( configMAX_SYSCALL_INTERRUPT_PRIORITY << 10 ) | 1 + + /* This mtc0 re-enables interrupts, but only above + configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + mtc0 s6, _CP0_STATUS + ehb + + /* Clear the software interrupt in the core. */ + mfc0 s6, _CP0_CAUSE + ins s6, zero, 8, 1 + mtc0 s6, _CP0_CAUSE + ehb + + /* Clear the interrupt in the interrupt controller. */ + la s6, IFS0CLR + addiu s4, zero, 2 + sw s4, (s6) + + jal vTaskSwitchContext + nop + + /* Clear the interrupt mask again. The saved status value is still in s7. */ + mtc0 s7, _CP0_STATUS + ehb + + /* Restore the stack pointer from the TCB. */ + la s0, pxCurrentTCB + lw s0, (s0) + lw s5, (s0) + + /* Restore the rest of the context. */ + lw s0, 8(s5) + mtlo s0 + lw s0, 12(s5) + mthi s0 + lw $1, 16(s5) + lw s0, 20(s5) + lw s1, 24(s5) + lw s2, 28(s5) + lw s3, 32(s5) + lw s4, 36(s5) + /* s5 is loaded later. */ + lw s6, 44(s5) + lw s7, 48(s5) + lw v0, 52(s5) + lw v1, 56(s5) + lw a0, 60(s5) + lw a1, 64(s5) + lw a2, 68(s5) + lw a3, 72(s5) + lw t0, 76(s5) + lw t1, 80(s5) + lw t2, 84(s5) + lw t3, 88(s5) + lw t4, 92(s5) + lw t5, 96(s5) + lw t6, 100(s5) + lw t7, 104(s5) + lw t8, 108(s5) + lw t9, 112(s5) + lw s8, 116(s5) + lw ra, 120(s5) + + /* Protect access to the k registers, and others. */ + di + ehb + + /* Set nesting back to zero. As the lowest priority interrupt this + interrupt cannot have nested. */ + la k0, uxInterruptNesting + sw zero, 0(k0) + + /* Switch back to use the real stack pointer. */ + add sp, zero, s5 + + /* Restore the real s5 value. */ + lw s5, 40(sp) + + /* Pop the status and epc values. */ + lw k1, portSTATUS_STACK_LOCATION(sp) + lw k0, portEPC_STACK_LOCATION(sp) + + /* Remove stack frame. */ + addiu sp, sp, portCONTEXT_SIZE + + mtc0 k1, _CP0_STATUS + mtc0 k0, _CP0_EPC + ehb + eret + nop + + .end vPortYieldISR + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC32MX/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC32MX/portmacro.h new file mode 100644 index 0000000..83a1ce3 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC32MX/portmacro.h @@ -0,0 +1,246 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/* System include files */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 8 +#define portSTACK_GROWTH -1 +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +#define portIPL_SHIFT ( 10UL ) +#define portALL_IPL_BITS ( 0x3fUL << portIPL_SHIFT ) +#define portSW0_BIT ( 0x01 << 8 ) + +/* This clears the IPL bits, then sets them to +configMAX_SYSCALL_INTERRUPT_PRIORITY. An extra check is performed if +configASSERT() is defined to ensure an assertion handler does not inadvertently +attempt to lower the IPL when the call to assert was triggered because the IPL +value was found to be above configMAX_SYSCALL_INTERRUPT_PRIORITY when an ISR +safe FreeRTOS API function was executed. ISR safe FreeRTOS API functions are +those that end in FromISR. FreeRTOS maintains a separate interrupt API to +ensure API function and interrupt entry is as fast and as simple as possible. */ +#ifdef configASSERT + #define portDISABLE_INTERRUPTS() \ + { \ + uint32_t ulStatus; \ + \ + /* Mask interrupts at and below the kernel interrupt priority. */ \ + ulStatus = _CP0_GET_STATUS(); \ + \ + /* Is the current IPL below configMAX_SYSCALL_INTERRUPT_PRIORITY? */ \ + if( ( ( ulStatus & portALL_IPL_BITS ) >> portIPL_SHIFT ) < configMAX_SYSCALL_INTERRUPT_PRIORITY ) \ + { \ + ulStatus &= ~portALL_IPL_BITS; \ + _CP0_SET_STATUS( ( ulStatus | ( configMAX_SYSCALL_INTERRUPT_PRIORITY << portIPL_SHIFT ) ) ); \ + } \ + } +#else /* configASSERT */ + #define portDISABLE_INTERRUPTS() \ + { \ + uint32_t ulStatus; \ + \ + /* Mask interrupts at and below the kernel interrupt priority. */ \ + ulStatus = _CP0_GET_STATUS(); \ + ulStatus &= ~portALL_IPL_BITS; \ + _CP0_SET_STATUS( ( ulStatus | ( configMAX_SYSCALL_INTERRUPT_PRIORITY << portIPL_SHIFT ) ) ); \ + } +#endif /* configASSERT */ + +#define portENABLE_INTERRUPTS() \ +{ \ +uint32_t ulStatus; \ + \ + /* Unmask all interrupts. */ \ + ulStatus = _CP0_GET_STATUS(); \ + ulStatus &= ~portALL_IPL_BITS; \ + _CP0_SET_STATUS( ulStatus ); \ +} + + +extern void vTaskEnterCritical( void ); +extern void vTaskExitCritical( void ); +#define portCRITICAL_NESTING_IN_TCB 1 +#define portENTER_CRITICAL() vTaskEnterCritical() +#define portEXIT_CRITICAL() vTaskExitCritical() + +extern UBaseType_t uxPortSetInterruptMaskFromISR(); +extern void vPortClearInterruptMaskFromISR( UBaseType_t ); +#define portSET_INTERRUPT_MASK_FROM_ISR() uxPortSetInterruptMaskFromISR() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedStatusRegister ) vPortClearInterruptMaskFromISR( uxSavedStatusRegister ) + +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31 - _clz( ( uxReadyPriorities ) ) ) + +#endif /* taskRECORD_READY_PRIORITY */ + +/*-----------------------------------------------------------*/ + +/* Task utilities. */ + +#define portYIELD() \ +{ \ +uint32_t ulCause; \ + \ + /* Trigger software interrupt. */ \ + ulCause = _CP0_GET_CAUSE(); \ + ulCause |= portSW0_BIT; \ + _CP0_SET_CAUSE( ulCause ); \ +} + +extern volatile UBaseType_t uxInterruptNesting; +#define portASSERT_IF_IN_ISR() configASSERT( uxInterruptNesting == 0 ) + +#define portNOP() __asm volatile ( "nop" ) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) __attribute__((noreturn)) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*-----------------------------------------------------------*/ + +#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired ) \ + { \ + portYIELD(); \ + } + +/* Required by the kernel aware debugger. */ +#ifdef __DEBUG + #define portREMOVE_STATIC_QUALIFIER +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC32MZ/ISR_Support.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC32MZ/ISR_Support.h new file mode 100644 index 0000000..15349e6 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC32MZ/ISR_Support.h @@ -0,0 +1,474 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#include "FreeRTOSConfig.h" + +#define portCONTEXT_SIZE 160 +#define portEPC_STACK_LOCATION 152 +#define portSTATUS_STACK_LOCATION 156 +#define portFPCSR_STACK_LOCATION 0 +#define portTASK_HAS_FPU_STACK_LOCATION 0 +#define portFPU_CONTEXT_SIZE 264 + +/******************************************************************/ +.macro portSAVE_FPU_REGS offset, base + /* Macro to assist with saving just the FPU registers to the + * specified address and base offset, + * offset is a constant, base is the base pointer register */ + + sdc1 $f31, \offset + 248(\base) + sdc1 $f30, \offset + 240(\base) + sdc1 $f29, \offset + 232(\base) + sdc1 $f28, \offset + 224(\base) + sdc1 $f27, \offset + 216(\base) + sdc1 $f26, \offset + 208(\base) + sdc1 $f25, \offset + 200(\base) + sdc1 $f24, \offset + 192(\base) + sdc1 $f23, \offset + 184(\base) + sdc1 $f22, \offset + 176(\base) + sdc1 $f21, \offset + 168(\base) + sdc1 $f20, \offset + 160(\base) + sdc1 $f19, \offset + 152(\base) + sdc1 $f18, \offset + 144(\base) + sdc1 $f17, \offset + 136(\base) + sdc1 $f16, \offset + 128(\base) + sdc1 $f15, \offset + 120(\base) + sdc1 $f14, \offset + 112(\base) + sdc1 $f13, \offset + 104(\base) + sdc1 $f12, \offset + 96(\base) + sdc1 $f11, \offset + 88(\base) + sdc1 $f10, \offset + 80(\base) + sdc1 $f9, \offset + 72(\base) + sdc1 $f8, \offset + 64(\base) + sdc1 $f7, \offset + 56(\base) + sdc1 $f6, \offset + 48(\base) + sdc1 $f5, \offset + 40(\base) + sdc1 $f4, \offset + 32(\base) + sdc1 $f3, \offset + 24(\base) + sdc1 $f2, \offset + 16(\base) + sdc1 $f1, \offset + 8(\base) + sdc1 $f0, \offset + 0(\base) + + .endm + +/******************************************************************/ +.macro portLOAD_FPU_REGS offset, base + /* Macro to assist with loading just the FPU registers from the + * specified address and base offset, offset is a constant, + * base is the base pointer register */ + + ldc1 $f0, \offset + 0(\base) + ldc1 $f1, \offset + 8(\base) + ldc1 $f2, \offset + 16(\base) + ldc1 $f3, \offset + 24(\base) + ldc1 $f4, \offset + 32(\base) + ldc1 $f5, \offset + 40(\base) + ldc1 $f6, \offset + 48(\base) + ldc1 $f7, \offset + 56(\base) + ldc1 $f8, \offset + 64(\base) + ldc1 $f9, \offset + 72(\base) + ldc1 $f10, \offset + 80(\base) + ldc1 $f11, \offset + 88(\base) + ldc1 $f12, \offset + 96(\base) + ldc1 $f13, \offset + 104(\base) + ldc1 $f14, \offset + 112(\base) + ldc1 $f15, \offset + 120(\base) + ldc1 $f16, \offset + 128(\base) + ldc1 $f17, \offset + 136(\base) + ldc1 $f18, \offset + 144(\base) + ldc1 $f19, \offset + 152(\base) + ldc1 $f20, \offset + 160(\base) + ldc1 $f21, \offset + 168(\base) + ldc1 $f22, \offset + 176(\base) + ldc1 $f23, \offset + 184(\base) + ldc1 $f24, \offset + 192(\base) + ldc1 $f25, \offset + 200(\base) + ldc1 $f26, \offset + 208(\base) + ldc1 $f27, \offset + 216(\base) + ldc1 $f28, \offset + 224(\base) + ldc1 $f29, \offset + 232(\base) + ldc1 $f30, \offset + 240(\base) + ldc1 $f31, \offset + 248(\base) + + .endm + +/******************************************************************/ +.macro portSAVE_CONTEXT + + /* Make room for the context. First save the current status so it can be + manipulated, and the cause and EPC registers so their original values are + captured. */ + mfc0 k0, _CP0_CAUSE + addiu sp, sp, -portCONTEXT_SIZE + + #if ( __mips_hard_float == 1 ) && ( configUSE_TASK_FPU_SUPPORT == 1 ) + /* Test if we are already using the system stack. Only tasks may use the + FPU so if we are already in a nested interrupt then the FPU context does + not require saving. */ + la k1, uxInterruptNesting + lw k1, 0(k1) + bne k1, zero, 2f + nop + + /* Test if the current task needs the FPU context saving. */ + la k1, ulTaskHasFPUContext + lw k1, 0(k1) + beq k1, zero, 1f + nop + + /* Adjust the stack to account for the additional FPU context.*/ + addiu sp, sp, -portFPU_CONTEXT_SIZE + + 1: + /* Save the ulTaskHasFPUContext flag. */ + sw k1, portTASK_HAS_FPU_STACK_LOCATION(sp) + + 2: + #endif + + mfc0 k1, _CP0_STATUS + + /* Also save s7, s6 and s5 so they can be used. Any nesting interrupts + should maintain the values of these registers across the ISR. */ + sw s7, 48(sp) + sw s6, 44(sp) + sw s5, 40(sp) + sw k1, portSTATUS_STACK_LOCATION(sp) + + /* Prepare to enable interrupts above the current priority. */ + srl k0, k0, 0xa + ins k1, k0, 10, 7 + srl k0, k0, 0x7 /* This copies the MSB of the IPL, but it would be an error if it was set anyway. */ + ins k1, k0, 18, 1 + ins k1, zero, 1, 4 + + /* s5 is used as the frame pointer. */ + add s5, zero, sp + + /* Check the nesting count value. */ + la k0, uxInterruptNesting + lw s6, (k0) + + /* If the nesting count is 0 then swap to the the system stack, otherwise + the system stack is already being used. */ + bne s6, zero, 1f + nop + + /* Swap to the system stack. */ + la sp, xISRStackTop + lw sp, (sp) + + /* Increment and save the nesting count. */ +1: addiu s6, s6, 1 + sw s6, 0(k0) + + /* s6 holds the EPC value, this is saved after interrupts are re-enabled. */ + mfc0 s6, _CP0_EPC + + /* Re-enable interrupts. */ + mtc0 k1, _CP0_STATUS + + /* Save the context into the space just created. s6 is saved again + here as it now contains the EPC value. No other s registers need be + saved. */ + sw ra, 120(s5) + sw s8, 116(s5) + sw t9, 112(s5) + sw t8, 108(s5) + sw t7, 104(s5) + sw t6, 100(s5) + sw t5, 96(s5) + sw t4, 92(s5) + sw t3, 88(s5) + sw t2, 84(s5) + sw t1, 80(s5) + sw t0, 76(s5) + sw a3, 72(s5) + sw a2, 68(s5) + sw a1, 64(s5) + sw a0, 60(s5) + sw v1, 56(s5) + sw v0, 52(s5) + sw s6, portEPC_STACK_LOCATION(s5) + sw $1, 16(s5) + + /* Save the AC0, AC1, AC2, AC3 registers from the DSP. s6 is used as a + scratch register. */ + mfhi s6, $ac1 + sw s6, 128(s5) + mflo s6, $ac1 + sw s6, 124(s5) + + mfhi s6, $ac2 + sw s6, 136(s5) + mflo s6, $ac2 + sw s6, 132(s5) + + mfhi s6, $ac3 + sw s6, 144(s5) + mflo s6, $ac3 + sw s6, 140(s5) + + /* Save the DSP Control register */ + rddsp s6 + sw s6, 148(s5) + + /* ac0 is done separately to match the MX port. */ + mfhi s6, $ac0 + sw s6, 12(s5) + mflo s6, $ac0 + sw s6, 8(s5) + + /* Save the FPU context if the nesting count was zero. */ + #if ( __mips_hard_float == 1 ) && ( configUSE_TASK_FPU_SUPPORT == 1 ) + la s6, uxInterruptNesting + lw s6, 0(s6) + addiu s6, s6, -1 + bne s6, zero, 1f + nop + + /* Test if the current task needs the FPU context saving. */ + lw s6, portTASK_HAS_FPU_STACK_LOCATION(s5) + beq s6, zero, 1f + nop + + /* Save the FPU registers. */ + portSAVE_FPU_REGS ( portCONTEXT_SIZE + 8 ), s5 + + /* Save the FPU status register */ + cfc1 s6, $f31 + sw s6, (portCONTEXT_SIZE + portFPCSR_STACK_LOCATION)(s5) + + 1: + #endif + + /* Update the task stack pointer value if nesting is zero. */ + la s6, uxInterruptNesting + lw s6, (s6) + addiu s6, s6, -1 + bne s6, zero, 1f + nop + + /* Save the stack pointer. */ + la s6, uxSavedTaskStackPointer + sw s5, (s6) +1: + .endm + +/******************************************************************/ +.macro portRESTORE_CONTEXT + + /* Restore the stack pointer from the TCB. This is only done if the + nesting count is 1. */ + la s6, uxInterruptNesting + lw s6, (s6) + addiu s6, s6, -1 + bne s6, zero, 1f + nop + la s6, uxSavedTaskStackPointer + lw s5, (s6) + + #if ( __mips_hard_float == 1 ) && ( configUSE_TASK_FPU_SUPPORT == 1 ) + /* Restore the FPU context if required. */ + lw s6, portTASK_HAS_FPU_STACK_LOCATION(s5) + beq s6, zero, 1f + nop + + /* Restore the FPU registers. */ + portLOAD_FPU_REGS ( portCONTEXT_SIZE + 8 ), s5 + + /* Restore the FPU status register. */ + lw s6, ( portCONTEXT_SIZE + portFPCSR_STACK_LOCATION )(s5) + ctc1 s6, $f31 + #endif + +1: + + /* Restore the context. */ + lw s6, 128(s5) + mthi s6, $ac1 + lw s6, 124(s5) + mtlo s6, $ac1 + + lw s6, 136(s5) + mthi s6, $ac2 + lw s6, 132(s5) + mtlo s6, $ac2 + + lw s6, 144(s5) + mthi s6, $ac3 + lw s6, 140(s5) + mtlo s6, $ac3 + + /* Restore DSPControl. */ + lw s6, 148(s5) + wrdsp s6 + + lw s6, 8(s5) + mtlo s6, $ac0 + lw s6, 12(s5) + mthi s6, $ac0 + lw $1, 16(s5) + + /* s6 is loaded as it was used as a scratch register and therefore saved + as part of the interrupt context. */ + lw s7, 48(s5) + lw s6, 44(s5) + lw v0, 52(s5) + lw v1, 56(s5) + lw a0, 60(s5) + lw a1, 64(s5) + lw a2, 68(s5) + lw a3, 72(s5) + lw t0, 76(s5) + lw t1, 80(s5) + lw t2, 84(s5) + lw t3, 88(s5) + lw t4, 92(s5) + lw t5, 96(s5) + lw t6, 100(s5) + lw t7, 104(s5) + lw t8, 108(s5) + lw t9, 112(s5) + lw s8, 116(s5) + lw ra, 120(s5) + + /* Protect access to the k registers, and others. */ + di + ehb + + /* Decrement the nesting count. */ + la k0, uxInterruptNesting + lw k1, (k0) + addiu k1, k1, -1 + sw k1, 0(k0) + + #if ( __mips_hard_float == 1 ) && ( configUSE_TASK_FPU_SUPPORT == 1 ) + /* If the nesting count is now zero then the FPU context may be restored. */ + bne k1, zero, 1f + nop + + /* Restore the value of ulTaskHasFPUContext */ + la k0, ulTaskHasFPUContext + lw k1, 0(s5) + sw k1, 0(k0) + + /* If the task does not have an FPU context then adjust the stack normally. */ + beq k1, zero, 1f + nop + + /* Restore the STATUS and EPC registers */ + lw k0, portSTATUS_STACK_LOCATION(s5) + lw k1, portEPC_STACK_LOCATION(s5) + + /* Leave the stack in its original state. First load sp from s5, then + restore s5 from the stack. */ + add sp, zero, s5 + lw s5, 40(sp) + + /* Adjust the stack pointer to remove the FPU context */ + addiu sp, sp, portFPU_CONTEXT_SIZE + beq zero, zero, 2f + nop + + 1: /* Restore the STATUS and EPC registers */ + lw k0, portSTATUS_STACK_LOCATION(s5) + lw k1, portEPC_STACK_LOCATION(s5) + + /* Leave the stack in its original state. First load sp from s5, then + restore s5 from the stack. */ + add sp, zero, s5 + lw s5, 40(sp) + + 2: /* Adjust the stack pointer */ + addiu sp, sp, portCONTEXT_SIZE + + #else + + /* Restore the frame when there is no hardware FP support. */ + lw k0, portSTATUS_STACK_LOCATION(s5) + lw k1, portEPC_STACK_LOCATION(s5) + + /* Leave the stack in its original state. First load sp from s5, then + restore s5 from the stack. */ + add sp, zero, s5 + lw s5, 40(sp) + + addiu sp, sp, portCONTEXT_SIZE + + #endif // ( __mips_hard_float == 1 ) && ( configUSE_TASK_FPU_SUPPORT == 1 ) + + mtc0 k0, _CP0_STATUS + mtc0 k1, _CP0_EPC + ehb + eret + nop + + .endm + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC32MZ/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC32MZ/port.c new file mode 100644 index 0000000..b573b16 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC32MZ/port.c @@ -0,0 +1,408 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the PIC32MZ port. + *----------------------------------------------------------*/ + +#include + +/* Scheduler include files. */ +#include "FreeRTOS.h" +#include "task.h" + +#if !defined(__PIC32MZ__) + #error This port is designed to work with XC32 on PIC32MZ MCUs. Please update your C compiler version or settings. +#endif + +#if( ( configMAX_SYSCALL_INTERRUPT_PRIORITY >= 0x7 ) || ( configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 ) ) + #error configMAX_SYSCALL_INTERRUPT_PRIORITY must be less than 7 and greater than 0 +#endif + +/* Hardware specifics. */ +#define portTIMER_PRESCALE 8 +#define portPRESCALE_BITS 1 + +/* Bits within various registers. */ +#define portIE_BIT ( 0x00000001 ) +#define portEXL_BIT ( 0x00000002 ) +#define portMX_BIT ( 0x01000000 ) /* Allow access to DSP instructions. */ +#define portCU1_BIT ( 0x20000000 ) /* enable CP1 for parts with hardware. */ +#define portFR_BIT ( 0x04000000 ) /* Enable 64 bit floating point registers. */ + +/* Bits within the CAUSE register. */ +#define portCORE_SW_0 ( 0x00000100 ) +#define portCORE_SW_1 ( 0x00000200 ) + +/* The EXL bit is set to ensure interrupts do not occur while the context of +the first task is being restored. */ +#if ( __mips_hard_float == 1 ) + #define portINITIAL_SR ( portIE_BIT | portEXL_BIT | portMX_BIT | portFR_BIT | portCU1_BIT ) +#else + #define portINITIAL_SR ( portIE_BIT | portEXL_BIT | portMX_BIT ) +#endif + +/* The initial value to store into the FPU status and control register. This is + only used on parts that support a hardware FPU. */ +#define portINITIAL_FPSCR (0x1000000) /* High perf on denormal ops */ + + +/* +By default port.c generates its tick interrupt from TIMER1. The user can +override this behaviour by: + 1: Providing their own implementation of vApplicationSetupTickTimerInterrupt(), + which is the function that configures the timer. The function is defined + as a weak symbol in this file so if the same function name is used in the + application code then the version in the application code will be linked + into the application in preference to the version defined in this file. + 2: Define configTICK_INTERRUPT_VECTOR to the vector number of the timer used + to generate the tick interrupt. For example, when timer 1 is used then + configTICK_INTERRUPT_VECTOR is set to _TIMER_1_VECTOR. + configTICK_INTERRUPT_VECTOR should be defined in FreeRTOSConfig.h. + 3: Define configCLEAR_TICK_TIMER_INTERRUPT() to clear the interrupt in the + timer used to generate the tick interrupt. For example, when timer 1 is + used configCLEAR_TICK_TIMER_INTERRUPT() is defined to + IFS0CLR = _IFS0_T1IF_MASK. +*/ +#ifndef configTICK_INTERRUPT_VECTOR + #define configTICK_INTERRUPT_VECTOR _TIMER_1_VECTOR + #define configCLEAR_TICK_TIMER_INTERRUPT() IFS0CLR = _IFS0_T1IF_MASK +#else + #ifndef configCLEAR_TICK_TIMER_INTERRUPT + #error If configTICK_INTERRUPT_VECTOR is defined in application code then configCLEAR_TICK_TIMER_INTERRUPT must also be defined in application code. + #endif +#endif + +/* Let the user override the pre-loading of the initial RA with the address of +prvTaskExitError() in case it messes up unwinding of the stack in the +debugger - in which case configTASK_RETURN_ADDRESS can be defined as 0 (NULL). */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/* Set configCHECK_FOR_STACK_OVERFLOW to 3 to add ISR stack checking to task +stack checking. A problem in the ISR stack will trigger an assert, not call the +stack overflow hook function (because the stack overflow hook is specific to a +task stack, not the ISR stack). */ +#if( configCHECK_FOR_STACK_OVERFLOW > 2 ) + + /* Don't use 0xa5 as the stack fill bytes as that is used by the kernerl for + the task stacks, and so will legitimately appear in many positions within + the ISR stack. */ + #define portISR_STACK_FILL_BYTE 0xee + + static const uint8_t ucExpectedStackBytes[] = { + portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, \ + portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, \ + portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, \ + portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, \ + portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE }; \ + + #define portCHECK_ISR_STACK() configASSERT( ( memcmp( ( void * ) xISRStack, ( void * ) ucExpectedStackBytes, sizeof( ucExpectedStackBytes ) ) == 0 ) ) +#else + /* Define the function away. */ + #define portCHECK_ISR_STACK() +#endif /* configCHECK_FOR_STACK_OVERFLOW > 2 */ + +/*-----------------------------------------------------------*/ + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* Records the interrupt nesting depth. This is initialised to one as it is +decremented to 0 when the first task starts. */ +volatile UBaseType_t uxInterruptNesting = 0x01; + +/* Stores the task stack pointer when a switch is made to use the system stack. */ +UBaseType_t uxSavedTaskStackPointer = 0; + +/* The stack used by interrupt service routines that cause a context switch. */ +StackType_t xISRStack[ configISR_STACK_SIZE ] = { 0 }; + +/* The top of stack value ensures there is enough space to store 6 registers on +the callers stack, as some functions seem to want to do this. */ +const StackType_t * const xISRStackTop = &( xISRStack[ configISR_STACK_SIZE - 7 ] ); + +/* Saved as part of the task context. Set to pdFALSE if the task does not + require an FPU context. */ +#if ( __mips_hard_float == 1 ) && ( configUSE_TASK_FPU_SUPPORT == 1 ) + uint32_t ulTaskHasFPUContext = 0; +#endif + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Ensure 8 byte alignment is maintained when leaving this function. */ + pxTopOfStack--; + pxTopOfStack--; + + *pxTopOfStack = (StackType_t) 0xDEADBEEF; + pxTopOfStack--; + + *pxTopOfStack = (StackType_t) 0x12345678; /* Word to which the stack pointer will be left pointing after context restore. */ + pxTopOfStack--; + + *pxTopOfStack = (StackType_t) _CP0_GET_CAUSE(); + pxTopOfStack--; + + *pxTopOfStack = (StackType_t) portINITIAL_SR;/* CP0_STATUS */ + pxTopOfStack--; + + *pxTopOfStack = (StackType_t) pxCode; /* CP0_EPC */ + pxTopOfStack--; + + *pxTopOfStack = (StackType_t) 0x00000000; /* DSPControl */ + pxTopOfStack -= 7; /* Includes space for AC1 - AC3. */ + + *pxTopOfStack = (StackType_t) portTASK_RETURN_ADDRESS; /* ra */ + pxTopOfStack -= 15; + + *pxTopOfStack = (StackType_t) pvParameters; /* Parameters to pass in. */ + pxTopOfStack -= 15; + + *pxTopOfStack = (StackType_t) pdFALSE; /*by default disable FPU context save on parts with FPU */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT( uxSavedTaskStackPointer == 0UL ); + portDISABLE_INTERRUPTS(); + for( ;; ); +} +/*-----------------------------------------------------------*/ + +/* + * Setup a timer for a regular tick. This function uses peripheral timer 1. + * The function is declared weak so an application writer can use a different + * timer by redefining this implementation. If a different timer is used then + * configTICK_INTERRUPT_VECTOR must also be defined in FreeRTOSConfig.h to + * ensure the RTOS provided tick interrupt handler is installed on the correct + * vector number. When Timer 1 is used the vector number is defined as + * _TIMER_1_VECTOR. + */ +__attribute__(( weak )) void vApplicationSetupTickTimerInterrupt( void ) +{ +const uint32_t ulCompareMatch = ( (configPERIPHERAL_CLOCK_HZ / portTIMER_PRESCALE) / configTICK_RATE_HZ ) - 1UL; + + T1CON = 0x0000; + T1CONbits.TCKPS = portPRESCALE_BITS; + PR1 = ulCompareMatch; + IPC1bits.T1IP = configKERNEL_INTERRUPT_PRIORITY; + + /* Clear the interrupt as a starting condition. */ + IFS0bits.T1IF = 0; + + /* Enable the interrupt. */ + IEC0bits.T1IE = 1; + + /* Start the timer. */ + T1CONbits.TON = 1; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler(void) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( uxInterruptNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void vPortStartFirstTask( void ); +extern void *pxCurrentTCB; + + #if ( configCHECK_FOR_STACK_OVERFLOW > 2 ) + { + /* Fill the ISR stack to make it easy to asses how much is being used. */ + memset( ( void * ) xISRStack, portISR_STACK_FILL_BYTE, sizeof( xISRStack ) ); + } + #endif /* configCHECK_FOR_STACK_OVERFLOW > 2 */ + + /* Clear the software interrupt flag. */ + IFS0CLR = _IFS0_CS0IF_MASK; + + /* Set software timer priority. */ + IPC0CLR = _IPC0_CS0IP_MASK; + IPC0SET = ( configKERNEL_INTERRUPT_PRIORITY << _IPC0_CS0IP_POSITION ); + + /* Enable software interrupt. */ + IEC0CLR = _IEC0_CS0IE_MASK; + IEC0SET = 1 << _IEC0_CS0IE_POSITION; + + /* Setup the timer to generate the tick. Interrupts will have been + disabled by the time we get here. */ + vApplicationSetupTickTimerInterrupt(); + + /* Kick off the highest priority task that has been created so far. + Its stack location is loaded into uxSavedTaskStackPointer. */ + uxSavedTaskStackPointer = *( UBaseType_t * ) pxCurrentTCB; + vPortStartFirstTask(); + + /* Should never get here as the tasks will now be executing! Call the task + exit error function to prevent compiler warnings about a static function + not being called in the case that the application writer overrides this + functionality by defining configTASK_RETURN_ADDRESS. */ + prvTaskExitError(); + + return pdFALSE; +} +/*-----------------------------------------------------------*/ + +void vPortIncrementTick( void ) +{ +UBaseType_t uxSavedStatus; + + uxSavedStatus = uxPortSetInterruptMaskFromISR(); + { + if( xTaskIncrementTick() != pdFALSE ) + { + /* Pend a context switch. */ + _CP0_BIS_CAUSE( portCORE_SW_0 ); + } + } + vPortClearInterruptMaskFromISR( uxSavedStatus ); + + /* Look for the ISR stack getting near or past its limit. */ + portCHECK_ISR_STACK(); + + /* Clear timer interrupt. */ + configCLEAR_TICK_TIMER_INTERRUPT(); +} +/*-----------------------------------------------------------*/ + +UBaseType_t uxPortSetInterruptMaskFromISR( void ) +{ +UBaseType_t uxSavedStatusRegister; + + __builtin_disable_interrupts(); + uxSavedStatusRegister = _CP0_GET_STATUS() | 0x01; + /* This clears the IPL bits, then sets them to + configMAX_SYSCALL_INTERRUPT_PRIORITY. This function should not be called + from an interrupt that has a priority above + configMAX_SYSCALL_INTERRUPT_PRIORITY so, when used correctly, the action + can only result in the IPL being unchanged or raised, and therefore never + lowered. */ + _CP0_SET_STATUS( ( ( uxSavedStatusRegister & ( ~portALL_IPL_BITS ) ) ) | ( configMAX_SYSCALL_INTERRUPT_PRIORITY << portIPL_SHIFT ) ); + + return uxSavedStatusRegister; +} +/*-----------------------------------------------------------*/ + +void vPortClearInterruptMaskFromISR( UBaseType_t uxSavedStatusRegister ) +{ + _CP0_SET_STATUS( uxSavedStatusRegister ); +} +/*-----------------------------------------------------------*/ + +#if ( __mips_hard_float == 1 ) && ( configUSE_TASK_FPU_SUPPORT == 1 ) + + void vPortTaskUsesFPU(void) + { + extern void vPortInitialiseFPSCR( uint32_t uxFPSCRInit ); + + portENTER_CRITICAL(); + + /* Initialise the floating point status register. */ + vPortInitialiseFPSCR(portINITIAL_FPSCR); + + /* A task is registering the fact that it needs a FPU context. Set the + FPU flag (saved as part of the task context). */ + ulTaskHasFPUContext = pdTRUE; + + portEXIT_CRITICAL(); + } + +#endif /* __mips_hard_float == 1 */ + +/*-----------------------------------------------------------*/ + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC32MZ/port_asm.S b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC32MZ/port_asm.S new file mode 100644 index 0000000..33d9740 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC32MZ/port_asm.S @@ -0,0 +1,810 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#include +#include +#include "FreeRTOSConfig.h" +#include "ISR_Support.h" + + .extern pxCurrentTCB + .extern vTaskSwitchContext + .extern vPortIncrementTick + .extern xISRStackTop + .extern ulTaskHasFPUContext + + .global vPortStartFirstTask + .global vPortYieldISR + .global vPortTickInterruptHandler + .global vPortInitialiseFPSCR + + +/******************************************************************/ + + .set nomips16 + .set nomicromips + .set noreorder + .set noat + + /*************************************************************** + * The following is needed to locate the + * vPortTickInterruptHandler function into the correct vector + ***************************************************************/ + #ifdef configTICK_INTERRUPT_VECTOR + #if (configTICK_INTERRUPT_VECTOR == _CORE_TIMER_VECTOR) + .equ __vector_dispatch_0, vPortTickInterruptHandler + .global __vector_dispatch_0 + .section .vector_0, code, keep + #elif (configTICK_INTERRUPT_VECTOR == _TIMER_1_VECTOR) + .equ __vector_dispatch_4, vPortTickInterruptHandler + .global __vector_dispatch_4 + .section .vector_4, code, keep + #elif (configTICK_INTERRUPT_VECTOR == _TIMER_2_VECTOR) + .equ __vector_dispatch_9, vPortTickInterruptHandler + .global __vector_dispatch_9 + .section .vector_9, code, keep + #elif (configTICK_INTERRUPT_VECTOR == _TIMER_3_VECTOR) + .equ __vector_dispatch_14, vPortTickInterruptHandler + .global __vector_dispatch_14 + .section .vector_14, code, keep + #elif (configTICK_INTERRUPT_VECTOR == _TIMER_4_VECTOR) + .equ __vector_dispatch_19, vPortTickInterruptHandler + .global __vector_dispatch_19 + .section .vector_19, code, keep + #elif (configTICK_INTERRUPT_VECTOR == _TIMER_5_VECTOR) + .equ __vector_dispatch_24, vPortTickInterruptHandler + .global __vector_dispatch_24 + .section .vector_24, code, keep + #elif (configTICK_INTERRUPT_VECTOR == _TIMER_6_VECTOR) + .equ __vector_dispatch_28, vPortTickInterruptHandler + .global __vector_dispatch_28 + .section .vector_28, code, keep + #elif (configTICK_INTERRUPT_VECTOR == _TIMER_7_VECTOR) + .equ __vector_dispatch_32, vPortTickInterruptHandler + .global __vector_dispatch_32 + .section .vector_32, code, keep + #elif (configTICK_INTERRUPT_VECTOR == _TIMER_8_VECTOR) + .equ __vector_dispatch_36, vPortTickInterruptHandler + .global __vector_dispatch_36 + .section .vector_36, code, keep + #elif (configTICK_INTERRUPT_VECTOR == _TIMER_9_VECTOR) + .equ __vector_dispatch_40, vPortTickInterruptHandler + .global __vector_dispatch_40 + .section .vector_40, code, keep + #endif + #else + .equ __vector_dispatch_4, vPortTickInterruptHandler + .global __vector_dispatch_4 + .section .vector_4, code, keep + #endif + + .ent vPortTickInterruptHandler + +vPortTickInterruptHandler: + + portSAVE_CONTEXT + + jal vPortIncrementTick + nop + + portRESTORE_CONTEXT + + .end vPortTickInterruptHandler + +/******************************************************************/ + + .set noreorder + .set noat + .section .text, code + .ent vPortStartFirstTask + +vPortStartFirstTask: + + /* Simply restore the context of the highest priority task that has been + created so far. */ + portRESTORE_CONTEXT + + .end vPortStartFirstTask + + + +/*******************************************************************/ + + .set nomips16 + .set nomicromips + .set noreorder + .set noat + /*************************************************************** + * The following is needed to locate the vPortYieldISR function + * into the correct vector + ***************************************************************/ + .equ __vector_dispatch_1, vPortYieldISR + .global __vector_dispatch_1 + .section .vector_1, code + + .ent vPortYieldISR +vPortYieldISR: + + #if ( __mips_hard_float == 1 ) && ( configUSE_TASK_FPU_SUPPORT == 1 ) + /* Code sequence for FPU support, the context save requires advance + knowledge of the stack frame size and if the current task actually uses the + FPU. */ + + /* Make room for the context. First save the current status so it can be + manipulated, and the cause and EPC registers so their original values are + captured. */ + la k0, ulTaskHasFPUContext + lw k0, 0(k0) + beq k0, zero, 1f + addiu sp, sp, -portCONTEXT_SIZE /* always reserve space for the context. */ + addiu sp, sp, -portFPU_CONTEXT_SIZE /* reserve additional space for the FPU context. */ + 1: + mfc0 k1, _CP0_STATUS + + /* Also save s6 and s5 so they can be used. Any nesting interrupts should + maintain the values of these registers across the ISR. */ + sw s6, 44(sp) + sw s5, 40(sp) + sw k1, portSTATUS_STACK_LOCATION(sp) + sw k0, portTASK_HAS_FPU_STACK_LOCATION(sp) + + /* Prepare to re-enabled interrupts above the kernel priority. */ + ins k1, zero, 10, 7 /* Clear IPL bits 0:6. */ + ins k1, zero, 18, 1 /* Clear IPL bit 7. It would be an error here if this bit were set anyway. */ + ori k1, k1, ( configMAX_SYSCALL_INTERRUPT_PRIORITY << 10 ) + ins k1, zero, 1, 4 /* Clear EXL, ERL and UM. */ + + /* s5 is used as the frame pointer. */ + add s5, zero, sp + + /* Swap to the system stack. This is not conditional on the nesting + count as this interrupt is always the lowest priority and therefore + the nesting is always 0. */ + la sp, xISRStackTop + lw sp, (sp) + + /* Set the nesting count. */ + la k0, uxInterruptNesting + addiu s6, zero, 1 + sw s6, 0(k0) + + /* s6 holds the EPC value, this is saved with the rest of the context + after interrupts are enabled. */ + mfc0 s6, _CP0_EPC + + /* Re-enable interrupts above configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + mtc0 k1, _CP0_STATUS + + /* Save the context into the space just created. s6 is saved again + here as it now contains the EPC value. */ + sw ra, 120(s5) + sw s8, 116(s5) + sw t9, 112(s5) + sw t8, 108(s5) + sw t7, 104(s5) + sw t6, 100(s5) + sw t5, 96(s5) + sw t4, 92(s5) + sw t3, 88(s5) + sw t2, 84(s5) + sw t1, 80(s5) + sw t0, 76(s5) + sw a3, 72(s5) + sw a2, 68(s5) + sw a1, 64(s5) + sw a0, 60(s5) + sw v1, 56(s5) + sw v0, 52(s5) + sw s7, 48(s5) + sw s6, portEPC_STACK_LOCATION(s5) + /* s5 and s6 has already been saved. */ + sw s4, 36(s5) + sw s3, 32(s5) + sw s2, 28(s5) + sw s1, 24(s5) + sw s0, 20(s5) + sw $1, 16(s5) + + /* s7 is used as a scratch register as this should always be saved across + nesting interrupts. */ + + /* Save the AC0, AC1, AC2 and AC3. */ + mfhi s7, $ac1 + sw s7, 128(s5) + mflo s7, $ac1 + sw s7, 124(s5) + + mfhi s7, $ac2 + sw s7, 136(s5) + mflo s7, $ac2 + sw s7, 132(s5) + + mfhi s7, $ac3 + sw s7, 144(s5) + mflo s7, $ac3 + sw s7, 140(s5) + + rddsp s7 + sw s7, 148(s5) + + mfhi s7, $ac0 + sw s7, 12(s5) + mflo s7, $ac0 + sw s7, 8(s5) + + /* Test if FPU context save is required. */ + lw s7, portTASK_HAS_FPU_STACK_LOCATION(s5) + beq s7, zero, 1f + nop + + /* Save the FPU registers above the normal context. */ + portSAVE_FPU_REGS (portCONTEXT_SIZE + 8), s5 + + /* Save the FPU status register */ + cfc1 s7, $f31 + sw s7, ( portCONTEXT_SIZE + portFPCSR_STACK_LOCATION )(s5) + + 1: + /* Save the stack pointer to the task. */ + la s7, pxCurrentTCB + lw s7, (s7) + sw s5, (s7) + + /* Set the interrupt mask to the max priority that can use the API. The + yield handler will only be called at configKERNEL_INTERRUPT_PRIORITY which + is below configMAX_SYSCALL_INTERRUPT_PRIORITY - so this can only ever + raise the IPL value and never lower it. */ + di + ehb + mfc0 s7, _CP0_STATUS + ins s7, zero, 10, 7 + ins s7, zero, 18, 1 + ori s6, s7, ( configMAX_SYSCALL_INTERRUPT_PRIORITY << 10 ) | 1 + + /* This mtc0 re-enables interrupts, but only above + configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + mtc0 s6, _CP0_STATUS + ehb + + /* Clear the software interrupt in the core. */ + mfc0 s6, _CP0_CAUSE + ins s6, zero, 8, 1 + mtc0 s6, _CP0_CAUSE + ehb + + /* Clear the interrupt in the interrupt controller. */ + la s6, IFS0CLR + addiu s4, zero, 2 + sw s4, (s6) + + jal vTaskSwitchContext + nop + + /* Clear the interrupt mask again. The saved status value is still in s7. */ + mtc0 s7, _CP0_STATUS + ehb + + /* Restore the stack pointer from the TCB. */ + la s0, pxCurrentTCB + lw s0, (s0) + lw s5, (s0) + + /* Test if the FPU context needs restoring. */ + lw s0, portTASK_HAS_FPU_STACK_LOCATION(s5) + beq s0, zero, 1f + nop + + /* Restore the FPU status register. */ + lw s0, ( portCONTEXT_SIZE + portFPCSR_STACK_LOCATION )(s5) + ctc1 s0, $f31 + + /* Restore the FPU registers. */ + portLOAD_FPU_REGS ( portCONTEXT_SIZE + 8 ), s5 + + 1: + /* Restore the rest of the context. */ + lw s0, 128(s5) + mthi s0, $ac1 + lw s0, 124(s5) + mtlo s0, $ac1 + + lw s0, 136(s5) + mthi s0, $ac2 + lw s0, 132(s5) + mtlo s0, $ac2 + + lw s0, 144(s5) + mthi s0, $ac3 + lw s0, 140(s5) + mtlo s0, $ac3 + + lw s0, 148(s5) + wrdsp s0 + + lw s0, 8(s5) + mtlo s0, $ac0 + lw s0, 12(s5) + mthi s0, $ac0 + + lw $1, 16(s5) + lw s0, 20(s5) + lw s1, 24(s5) + lw s2, 28(s5) + lw s3, 32(s5) + lw s4, 36(s5) + + /* s5 is loaded later. */ + lw s6, 44(s5) + lw s7, 48(s5) + lw v0, 52(s5) + lw v1, 56(s5) + lw a0, 60(s5) + lw a1, 64(s5) + lw a2, 68(s5) + lw a3, 72(s5) + lw t0, 76(s5) + lw t1, 80(s5) + lw t2, 84(s5) + lw t3, 88(s5) + lw t4, 92(s5) + lw t5, 96(s5) + lw t6, 100(s5) + lw t7, 104(s5) + lw t8, 108(s5) + lw t9, 112(s5) + lw s8, 116(s5) + lw ra, 120(s5) + + /* Protect access to the k registers, and others. */ + di + ehb + + /* Set nesting back to zero. As the lowest priority interrupt this + interrupt cannot have nested. */ + la k0, uxInterruptNesting + sw zero, 0(k0) + + /* Switch back to use the real stack pointer. */ + add sp, zero, s5 + + /* Restore the real s5 value. */ + lw s5, 40(sp) + + /* Pop the FPU context value from the stack */ + lw k0, portTASK_HAS_FPU_STACK_LOCATION(sp) + la k1, ulTaskHasFPUContext + sw k0, 0(k1) + beq k0, zero, 1f + nop + + /* task has FPU context so adjust the stack frame after popping the + status and epc values. */ + lw k1, portSTATUS_STACK_LOCATION(sp) + lw k0, portEPC_STACK_LOCATION(sp) + addiu sp, sp, portFPU_CONTEXT_SIZE + beq zero, zero, 2f + nop + + 1: + /* Pop the status and epc values. */ + lw k1, portSTATUS_STACK_LOCATION(sp) + lw k0, portEPC_STACK_LOCATION(sp) + + 2: + /* Remove stack frame. */ + addiu sp, sp, portCONTEXT_SIZE + + #else + /* Code sequence for no FPU support, the context save requires advance + knowledge of the stack frame size when no FPU is being used */ + + /* Make room for the context. First save the current status so it can be + manipulated, and the cause and EPC registers so thier original values are + captured. */ + addiu sp, sp, -portCONTEXT_SIZE + mfc0 k1, _CP0_STATUS + + /* Also save s6 and s5 so they can be used. Any nesting interrupts should + maintain the values of these registers across the ISR. */ + sw s6, 44(sp) + sw s5, 40(sp) + sw k1, portSTATUS_STACK_LOCATION(sp) + + /* Prepare to re-enabled interrupts above the kernel priority. */ + ins k1, zero, 10, 7 /* Clear IPL bits 0:6. */ + ins k1, zero, 18, 1 /* Clear IPL bit 7. It would be an error here if this bit were set anyway. */ + ori k1, k1, ( configMAX_SYSCALL_INTERRUPT_PRIORITY << 10 ) + ins k1, zero, 1, 4 /* Clear EXL, ERL and UM. */ + + /* s5 is used as the frame pointer. */ + add s5, zero, sp + + /* Swap to the system stack. This is not conditional on the nesting + count as this interrupt is always the lowest priority and therefore + the nesting is always 0. */ + la sp, xISRStackTop + lw sp, (sp) + + /* Set the nesting count. */ + la k0, uxInterruptNesting + addiu s6, zero, 1 + sw s6, 0(k0) + + /* s6 holds the EPC value, this is saved with the rest of the context + after interrupts are enabled. */ + mfc0 s6, _CP0_EPC + + /* Re-enable interrupts above configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + mtc0 k1, _CP0_STATUS + + /* Save the context into the space just created. s6 is saved again + here as it now contains the EPC value. */ + sw ra, 120(s5) + sw s8, 116(s5) + sw t9, 112(s5) + sw t8, 108(s5) + sw t7, 104(s5) + sw t6, 100(s5) + sw t5, 96(s5) + sw t4, 92(s5) + sw t3, 88(s5) + sw t2, 84(s5) + sw t1, 80(s5) + sw t0, 76(s5) + sw a3, 72(s5) + sw a2, 68(s5) + sw a1, 64(s5) + sw a0, 60(s5) + sw v1, 56(s5) + sw v0, 52(s5) + sw s7, 48(s5) + sw s6, portEPC_STACK_LOCATION(s5) + /* s5 and s6 has already been saved. */ + sw s4, 36(s5) + sw s3, 32(s5) + sw s2, 28(s5) + sw s1, 24(s5) + sw s0, 20(s5) + sw $1, 16(s5) + + /* s7 is used as a scratch register as this should always be saved across + nesting interrupts. */ + + /* Save the AC0, AC1, AC2 and AC3. */ + mfhi s7, $ac1 + sw s7, 128(s5) + mflo s7, $ac1 + sw s7, 124(s5) + + mfhi s7, $ac2 + sw s7, 136(s5) + mflo s7, $ac2 + sw s7, 132(s5) + + mfhi s7, $ac3 + sw s7, 144(s5) + mflo s7, $ac3 + sw s7, 140(s5) + + rddsp s7 + sw s7, 148(s5) + + mfhi s7, $ac0 + sw s7, 12(s5) + mflo s7, $ac0 + sw s7, 8(s5) + + /* Save the stack pointer to the task. */ + la s7, pxCurrentTCB + lw s7, (s7) + sw s5, (s7) + + /* Set the interrupt mask to the max priority that can use the API. The + yield handler will only be called at configKERNEL_INTERRUPT_PRIORITY which + is below configMAX_SYSCALL_INTERRUPT_PRIORITY - so this can only ever + raise the IPL value and never lower it. */ + di + ehb + mfc0 s7, _CP0_STATUS + ins s7, zero, 10, 7 + ins s7, zero, 18, 1 + ori s6, s7, ( configMAX_SYSCALL_INTERRUPT_PRIORITY << 10 ) | 1 + + /* This mtc0 re-enables interrupts, but only above + configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + mtc0 s6, _CP0_STATUS + ehb + + /* Clear the software interrupt in the core. */ + mfc0 s6, _CP0_CAUSE + ins s6, zero, 8, 1 + mtc0 s6, _CP0_CAUSE + ehb + + /* Clear the interrupt in the interrupt controller. */ + la s6, IFS0CLR + addiu s4, zero, 2 + sw s4, (s6) + + jal vTaskSwitchContext + nop + + /* Clear the interrupt mask again. The saved status value is still in s7. */ + mtc0 s7, _CP0_STATUS + ehb + + /* Restore the stack pointer from the TCB. */ + la s0, pxCurrentTCB + lw s0, (s0) + lw s5, (s0) + + /* Restore the rest of the context. */ + lw s0, 128(s5) + mthi s0, $ac1 + lw s0, 124(s5) + mtlo s0, $ac1 + + lw s0, 136(s5) + mthi s0, $ac2 + lw s0, 132(s5) + mtlo s0, $ac2 + + lw s0, 144(s5) + mthi s0, $ac3 + lw s0, 140(s5) + mtlo s0, $ac3 + + lw s0, 148(s5) + wrdsp s0 + + lw s0, 8(s5) + mtlo s0, $ac0 + lw s0, 12(s5) + mthi s0, $ac0 + + lw $1, 16(s5) + lw s0, 20(s5) + lw s1, 24(s5) + lw s2, 28(s5) + lw s3, 32(s5) + lw s4, 36(s5) + + /* s5 is loaded later. */ + lw s6, 44(s5) + lw s7, 48(s5) + lw v0, 52(s5) + lw v1, 56(s5) + lw a0, 60(s5) + lw a1, 64(s5) + lw a2, 68(s5) + lw a3, 72(s5) + lw t0, 76(s5) + lw t1, 80(s5) + lw t2, 84(s5) + lw t3, 88(s5) + lw t4, 92(s5) + lw t5, 96(s5) + lw t6, 100(s5) + lw t7, 104(s5) + lw t8, 108(s5) + lw t9, 112(s5) + lw s8, 116(s5) + lw ra, 120(s5) + + /* Protect access to the k registers, and others. */ + di + ehb + + /* Set nesting back to zero. As the lowest priority interrupt this + interrupt cannot have nested. */ + la k0, uxInterruptNesting + sw zero, 0(k0) + + /* Switch back to use the real stack pointer. */ + add sp, zero, s5 + + /* Restore the real s5 value. */ + lw s5, 40(sp) + + /* Pop the status and epc values. */ + lw k1, portSTATUS_STACK_LOCATION(sp) + lw k0, portEPC_STACK_LOCATION(sp) + + /* Remove stack frame. */ + addiu sp, sp, portCONTEXT_SIZE + + #endif /* ( __mips_hard_float == 1 ) && ( configUSE_TASK_FPU_SUPPORT == 1 ) */ + + /* Restore the status and EPC registers and return */ + mtc0 k1, _CP0_STATUS + mtc0 k0, _CP0_EPC + ehb + eret + nop + + .end vPortYieldISR + +/******************************************************************/ + +#if ( __mips_hard_float == 1 ) && ( configUSE_TASK_FPU_SUPPORT == 1 ) + + .macro portFPUSetAndInc reg, dest + mtc1 \reg, \dest + cvt.d.w \dest, \dest + addiu \reg, \reg, 1 + .endm + + .set noreorder + .set noat + .section .text, code + .ent vPortInitialiseFPSCR + +vPortInitialiseFPSCR: + + /* Initialize the floating point status register in CP1. The initial + value is passed in a0. */ + ctc1 a0, $f31 + + /* Clear the FPU registers */ + addiu a0, zero, 0x0000 + portFPUSetAndInc a0, $f0 + portFPUSetAndInc a0, $f1 + portFPUSetAndInc a0, $f2 + portFPUSetAndInc a0, $f3 + portFPUSetAndInc a0, $f4 + portFPUSetAndInc a0, $f5 + portFPUSetAndInc a0, $f6 + portFPUSetAndInc a0, $f7 + portFPUSetAndInc a0, $f8 + portFPUSetAndInc a0, $f9 + portFPUSetAndInc a0, $f10 + portFPUSetAndInc a0, $f11 + portFPUSetAndInc a0, $f12 + portFPUSetAndInc a0, $f13 + portFPUSetAndInc a0, $f14 + portFPUSetAndInc a0, $f15 + portFPUSetAndInc a0, $f16 + portFPUSetAndInc a0, $f17 + portFPUSetAndInc a0, $f18 + portFPUSetAndInc a0, $f19 + portFPUSetAndInc a0, $f20 + portFPUSetAndInc a0, $f21 + portFPUSetAndInc a0, $f22 + portFPUSetAndInc a0, $f23 + portFPUSetAndInc a0, $f24 + portFPUSetAndInc a0, $f25 + portFPUSetAndInc a0, $f26 + portFPUSetAndInc a0, $f27 + portFPUSetAndInc a0, $f28 + portFPUSetAndInc a0, $f29 + portFPUSetAndInc a0, $f30 + portFPUSetAndInc a0, $f31 + + jr ra + nop + + .end vPortInitialiseFPSCR + +#endif /* ( __mips_hard_float == 1 ) && ( configUSE_TASK_FPU_SUPPORT == 1 ) */ + +#if ( __mips_hard_float == 1 ) && ( configUSE_TASK_FPU_SUPPORT == 1 ) + + /**********************************************************************/ + /* Test read back */ + /* a0 = address to store registers */ + + .set noreorder + .set noat + .section .text, code + .ent vPortFPUReadback + .global vPortFPUReadback + +vPortFPUReadback: + sdc1 $f0, 0(a0) + sdc1 $f1, 8(a0) + sdc1 $f2, 16(a0) + sdc1 $f3, 24(a0) + sdc1 $f4, 32(a0) + sdc1 $f5, 40(a0) + sdc1 $f6, 48(a0) + sdc1 $f7, 56(a0) + sdc1 $f8, 64(a0) + sdc1 $f9, 72(a0) + sdc1 $f10, 80(a0) + sdc1 $f11, 88(a0) + sdc1 $f12, 96(a0) + sdc1 $f13, 104(a0) + sdc1 $f14, 112(a0) + sdc1 $f15, 120(a0) + sdc1 $f16, 128(a0) + sdc1 $f17, 136(a0) + sdc1 $f18, 144(a0) + sdc1 $f19, 152(a0) + sdc1 $f20, 160(a0) + sdc1 $f21, 168(a0) + sdc1 $f22, 176(a0) + sdc1 $f23, 184(a0) + sdc1 $f24, 192(a0) + sdc1 $f25, 200(a0) + sdc1 $f26, 208(a0) + sdc1 $f27, 216(a0) + sdc1 $f28, 224(a0) + sdc1 $f29, 232(a0) + sdc1 $f30, 240(a0) + sdc1 $f31, 248(a0) + + jr ra + nop + + .end vPortFPUReadback + +#endif /* ( __mips_hard_float == 1 ) && ( configUSE_TASK_FPU_SUPPORT == 1 ) */ + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC32MZ/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC32MZ/portmacro.h new file mode 100644 index 0000000..203508a --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MPLAB/PIC32MZ/portmacro.h @@ -0,0 +1,257 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/* System include files */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 8 +#define portSTACK_GROWTH -1 +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +#define portIPL_SHIFT ( 10UL ) +/* Don't straddle the CEE bit. Interrupts calling FreeRTOS functions should +never have higher IPL bits set anyway. */ +#define portALL_IPL_BITS ( 0x7FUL << portIPL_SHIFT ) +#define portSW0_BIT ( 0x01 << 8 ) + +/* This clears the IPL bits, then sets them to +configMAX_SYSCALL_INTERRUPT_PRIORITY. An extra check is performed if +configASSERT() is defined to ensure an assertion handler does not inadvertently +attempt to lower the IPL when the call to assert was triggered because the IPL +value was found to be above configMAX_SYSCALL_INTERRUPT_PRIORITY when an ISR +safe FreeRTOS API function was executed. ISR safe FreeRTOS API functions are +those that end in FromISR. FreeRTOS maintains a separate interrupt API to +ensure API function and interrupt entry is as fast and as simple as possible. */ +#ifdef configASSERT + #define portDISABLE_INTERRUPTS() \ + { \ + uint32_t ulStatus; \ + \ + /* Mask interrupts at and below the kernel interrupt priority. */ \ + ulStatus = _CP0_GET_STATUS(); \ + \ + /* Is the current IPL below configMAX_SYSCALL_INTERRUPT_PRIORITY? */ \ + if( ( ( ulStatus & portALL_IPL_BITS ) >> portIPL_SHIFT ) < configMAX_SYSCALL_INTERRUPT_PRIORITY ) \ + { \ + ulStatus &= ~portALL_IPL_BITS; \ + _CP0_SET_STATUS( ( ulStatus | ( configMAX_SYSCALL_INTERRUPT_PRIORITY << portIPL_SHIFT ) ) ); \ + } \ + } +#else /* configASSERT */ + #define portDISABLE_INTERRUPTS() \ + { \ + uint32_t ulStatus; \ + \ + /* Mask interrupts at and below the kernel interrupt priority. */ \ + ulStatus = _CP0_GET_STATUS(); \ + ulStatus &= ~portALL_IPL_BITS; \ + _CP0_SET_STATUS( ( ulStatus | ( configMAX_SYSCALL_INTERRUPT_PRIORITY << portIPL_SHIFT ) ) ); \ + } +#endif /* configASSERT */ + +#define portENABLE_INTERRUPTS() \ +{ \ +uint32_t ulStatus; \ + \ + /* Unmask all interrupts. */ \ + ulStatus = _CP0_GET_STATUS(); \ + ulStatus &= ~portALL_IPL_BITS; \ + _CP0_SET_STATUS( ulStatus ); \ +} + + +extern void vTaskEnterCritical( void ); +extern void vTaskExitCritical( void ); +#define portCRITICAL_NESTING_IN_TCB 1 +#define portENTER_CRITICAL() vTaskEnterCritical() +#define portEXIT_CRITICAL() vTaskExitCritical() + +extern UBaseType_t uxPortSetInterruptMaskFromISR(); +extern void vPortClearInterruptMaskFromISR( UBaseType_t ); +#define portSET_INTERRUPT_MASK_FROM_ISR() uxPortSetInterruptMaskFromISR() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedStatusRegister ) vPortClearInterruptMaskFromISR( uxSavedStatusRegister ) + +#if ( __mips_hard_float == 0 ) && ( configUSE_TASK_FPU_SUPPORT == 1 ) + #error configUSE_TASK_FPU_SUPPORT can only be set to 1 when the part supports a hardware FPU module. +#endif + +#if ( __mips_hard_float == 1 ) && ( configUSE_TASK_FPU_SUPPORT == 1 ) + void vPortTaskUsesFPU( void ); + #define portTASK_USES_FLOATING_POINT() vPortTaskUsesFPU() +#endif + +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31 - _clz( ( uxReadyPriorities ) ) ) + +#endif /* taskRECORD_READY_PRIORITY */ + +/*-----------------------------------------------------------*/ + +/* Task utilities. */ + +#define portYIELD() \ +{ \ +uint32_t ulCause; \ + \ + /* Trigger software interrupt. */ \ + ulCause = _CP0_GET_CAUSE(); \ + ulCause |= portSW0_BIT; \ + _CP0_SET_CAUSE( ulCause ); \ +} + +extern volatile UBaseType_t uxInterruptNesting; +#define portASSERT_IF_IN_ISR() configASSERT( uxInterruptNesting == 0 ) + +#define portNOP() __asm volatile ( "nop" ) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) __attribute__((noreturn)) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*-----------------------------------------------------------*/ + +#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired ) \ + { \ + portYIELD(); \ + } + +/* Required by the kernel aware debugger. */ +#ifdef __DEBUG + #define portREMOVE_STATIC_QUALIFIER +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MSVC-MingW/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MSVC-MingW/port.c new file mode 100644 index 0000000..8189fb0 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MSVC-MingW/port.c @@ -0,0 +1,660 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#ifdef __GNUC__ + #include "mmsystem.h" +#else + #pragma comment(lib, "winmm.lib") +#endif + +#define portMAX_INTERRUPTS ( ( uint32_t ) sizeof( uint32_t ) * 8UL ) /* The number of bits in an uint32_t. */ +#define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) + +/* The priorities at which the various components of the simulation execute. +Priorities are higher when a soak test is performed to lessen the effect of +Windows interfering with the timing. */ +#define portSOAK_TEST +#ifndef portSOAK_TEST + #define portDELETE_SELF_THREAD_PRIORITY THREAD_PRIORITY_HIGHEST /* Must be highest. */ + #define portSIMULATED_INTERRUPTS_THREAD_PRIORITY THREAD_PRIORITY_NORMAL + #define portSIMULATED_TIMER_THREAD_PRIORITY THREAD_PRIORITY_BELOW_NORMAL + #define portTASK_THREAD_PRIORITY THREAD_PRIORITY_IDLE +#else + #define portDELETE_SELF_THREAD_PRIORITY THREAD_PRIORITY_TIME_CRITICAL /* Must be highest. */ + #define portSIMULATED_INTERRUPTS_THREAD_PRIORITY THREAD_PRIORITY_HIGHEST + #define portSIMULATED_TIMER_THREAD_PRIORITY THREAD_PRIORITY_ABOVE_NORMAL + #define portTASK_THREAD_PRIORITY THREAD_PRIORITY_NORMAL +#endif +/* + * Created as a high priority thread, this function uses a timer to simulate + * a tick interrupt being generated on an embedded target. In this Windows + * environment the timer does not achieve anything approaching real time + * performance though. + */ +static DWORD WINAPI prvSimulatedPeripheralTimer( LPVOID lpParameter ); + +/* + * Process all the simulated interrupts - each represented by a bit in + * ulPendingInterrupts variable. + */ +static void prvProcessSimulatedInterrupts( void ); + +/* + * Interrupt handlers used by the kernel itself. These are executed from the + * simulated interrupt handler thread. + */ +static uint32_t prvProcessYieldInterrupt( void ); +static uint32_t prvProcessTickInterrupt( void ); + +/* + * Called when the process exits to let Windows know the high timer resolution + * is no longer required. + */ +static BOOL WINAPI prvEndProcess( DWORD dwCtrlType ); + +/*-----------------------------------------------------------*/ + +/* The WIN32 simulator runs each task in a thread. The context switching is +managed by the threads, so the task stack does not have to be managed directly, +although the task stack is still used to hold an xThreadState structure this is +the only thing it will ever hold. The structure indirectly maps the task handle +to a thread handle. */ +typedef struct +{ + /* Handle of the thread that executes the task. */ + void *pvThread; + +} xThreadState; + +/* Simulated interrupts waiting to be processed. This is a bit mask where each +bit represents one interrupt, so a maximum of 32 interrupts can be simulated. */ +static volatile uint32_t ulPendingInterrupts = 0UL; + +/* An event used to inform the simulated interrupt processing thread (a high +priority thread that simulated interrupt processing) that an interrupt is +pending. */ +static void *pvInterruptEvent = NULL; + +/* Mutex used to protect all the simulated interrupt variables that are accessed +by multiple threads. */ +static void *pvInterruptEventMutex = NULL; + +/* The critical nesting count for the currently executing task. This is +initialised to a non-zero value so interrupts do not become enabled during +the initialisation phase. As each task has its own critical nesting value +ulCriticalNesting will get set to zero when the first task runs. This +initialisation is probably not critical in this simulated environment as the +simulated interrupt handlers do not get created until the FreeRTOS scheduler is +started anyway. */ +static uint32_t ulCriticalNesting = 9999UL; + +/* Handlers for all the simulated software interrupts. The first two positions +are used for the Yield and Tick interrupts so are handled slightly differently, +all the other interrupts can be user defined. */ +static uint32_t (*ulIsrHandler[ portMAX_INTERRUPTS ])( void ) = { 0 }; + +/* Pointer to the TCB of the currently executing task. */ +extern void *pxCurrentTCB; + +/* Used to ensure nothing is processed during the startup sequence. */ +static BaseType_t xPortRunning = pdFALSE; + +/*-----------------------------------------------------------*/ + +static DWORD WINAPI prvSimulatedPeripheralTimer( LPVOID lpParameter ) +{ +TickType_t xMinimumWindowsBlockTime; +TIMECAPS xTimeCaps; + + /* Set the timer resolution to the maximum possible. */ + if( timeGetDevCaps( &xTimeCaps, sizeof( xTimeCaps ) ) == MMSYSERR_NOERROR ) + { + xMinimumWindowsBlockTime = ( TickType_t ) xTimeCaps.wPeriodMin; + timeBeginPeriod( xTimeCaps.wPeriodMin ); + + /* Register an exit handler so the timeBeginPeriod() function can be + matched with a timeEndPeriod() when the application exits. */ + SetConsoleCtrlHandler( prvEndProcess, TRUE ); + } + else + { + xMinimumWindowsBlockTime = ( TickType_t ) 20; + } + + /* Just to prevent compiler warnings. */ + ( void ) lpParameter; + + for( ;; ) + { + /* Wait until the timer expires and we can access the simulated interrupt + variables. *NOTE* this is not a 'real time' way of generating tick + events as the next wake time should be relative to the previous wake + time, not the time that Sleep() is called. It is done this way to + prevent overruns in this very non real time simulated/emulated + environment. */ + if( portTICK_PERIOD_MS < xMinimumWindowsBlockTime ) + { + Sleep( xMinimumWindowsBlockTime ); + } + else + { + Sleep( portTICK_PERIOD_MS ); + } + + configASSERT( xPortRunning ); + + WaitForSingleObject( pvInterruptEventMutex, INFINITE ); + + /* The timer has expired, generate the simulated tick event. */ + ulPendingInterrupts |= ( 1 << portINTERRUPT_TICK ); + + /* The interrupt is now pending - notify the simulated interrupt + handler thread. */ + if( ulCriticalNesting == 0 ) + { + SetEvent( pvInterruptEvent ); + } + + /* Give back the mutex so the simulated interrupt handler unblocks + and can access the interrupt handler variables. */ + ReleaseMutex( pvInterruptEventMutex ); + } + + #ifdef __GNUC__ + /* Should never reach here - MingW complains if you leave this line out, + MSVC complains if you put it in. */ + return 0; + #endif +} +/*-----------------------------------------------------------*/ + +static BOOL WINAPI prvEndProcess( DWORD dwCtrlType ) +{ +TIMECAPS xTimeCaps; + + ( void ) dwCtrlType; + + if( timeGetDevCaps( &xTimeCaps, sizeof( xTimeCaps ) ) == MMSYSERR_NOERROR ) + { + /* Match the call to timeBeginPeriod( xTimeCaps.wPeriodMin ) made when + the process started with a timeEndPeriod() as the process exits. */ + timeEndPeriod( xTimeCaps.wPeriodMin ); + } + + return pdPASS; +} +/*-----------------------------------------------------------*/ + +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +xThreadState *pxThreadState = NULL; +int8_t *pcTopOfStack = ( int8_t * ) pxTopOfStack; +const SIZE_T xStackSize = 1024; /* Set the size to a small number which will get rounded up to the minimum possible. */ + + #ifdef portSOAK_TEST + { + /* Ensure highest priority class is inherited. */ + if( !SetPriorityClass( GetCurrentProcess(), REALTIME_PRIORITY_CLASS ) ) + { + printf( "SetPriorityClass() failed\r\n" ); + } + } + #endif + + /* In this simulated case a stack is not initialised, but instead a thread + is created that will execute the task being created. The thread handles + the context switching itself. The xThreadState object is placed onto + the stack that was created for the task - so the stack buffer is still + used, just not in the conventional way. It will not be used for anything + other than holding this structure. */ + pxThreadState = ( xThreadState * ) ( pcTopOfStack - sizeof( xThreadState ) ); + + /* Create the thread itself. */ + pxThreadState->pvThread = CreateThread( NULL, xStackSize, ( LPTHREAD_START_ROUTINE ) pxCode, pvParameters, CREATE_SUSPENDED | STACK_SIZE_PARAM_IS_A_RESERVATION, NULL ); + configASSERT( pxThreadState->pvThread ); /* See comment where TerminateThread() is called. */ + SetThreadAffinityMask( pxThreadState->pvThread, 0x01 ); + SetThreadPriorityBoost( pxThreadState->pvThread, TRUE ); + SetThreadPriority( pxThreadState->pvThread, portTASK_THREAD_PRIORITY ); + + return ( StackType_t * ) pxThreadState; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +void *pvHandle; +int32_t lSuccess = pdPASS; +xThreadState *pxThreadState; + + /* Install the interrupt handlers used by the scheduler itself. */ + vPortSetInterruptHandler( portINTERRUPT_YIELD, prvProcessYieldInterrupt ); + vPortSetInterruptHandler( portINTERRUPT_TICK, prvProcessTickInterrupt ); + + /* Create the events and mutexes that are used to synchronise all the + threads. */ + pvInterruptEventMutex = CreateMutex( NULL, FALSE, NULL ); + pvInterruptEvent = CreateEvent( NULL, FALSE, FALSE, NULL ); + + if( ( pvInterruptEventMutex == NULL ) || ( pvInterruptEvent == NULL ) ) + { + lSuccess = pdFAIL; + } + + /* Set the priority of this thread such that it is above the priority of + the threads that run tasks. This higher priority is required to ensure + simulated interrupts take priority over tasks. */ + pvHandle = GetCurrentThread(); + if( pvHandle == NULL ) + { + lSuccess = pdFAIL; + } + + if( lSuccess == pdPASS ) + { + if( SetThreadPriority( pvHandle, portSIMULATED_INTERRUPTS_THREAD_PRIORITY ) == 0 ) + { + lSuccess = pdFAIL; + } + SetThreadPriorityBoost( pvHandle, TRUE ); + SetThreadAffinityMask( pvHandle, 0x01 ); + } + + if( lSuccess == pdPASS ) + { + /* Start the thread that simulates the timer peripheral to generate + tick interrupts. The priority is set below that of the simulated + interrupt handler so the interrupt event mutex is used for the + handshake / overrun protection. */ + pvHandle = CreateThread( NULL, 0, prvSimulatedPeripheralTimer, NULL, CREATE_SUSPENDED, NULL ); + if( pvHandle != NULL ) + { + SetThreadPriority( pvHandle, portSIMULATED_TIMER_THREAD_PRIORITY ); + SetThreadPriorityBoost( pvHandle, TRUE ); + SetThreadAffinityMask( pvHandle, 0x01 ); + ResumeThread( pvHandle ); + } + + /* Start the highest priority task by obtaining its associated thread + state structure, in which is stored the thread handle. */ + pxThreadState = ( xThreadState * ) *( ( size_t * ) pxCurrentTCB ); + ulCriticalNesting = portNO_CRITICAL_NESTING; + + /* Bump up the priority of the thread that is going to run, in the + hope that this will assist in getting the Windows thread scheduler to + behave as an embedded engineer might expect. */ + ResumeThread( pxThreadState->pvThread ); + + /* Handle all simulated interrupts - including yield requests and + simulated ticks. */ + prvProcessSimulatedInterrupts(); + } + + /* Would not expect to return from prvProcessSimulatedInterrupts(), so should + not get here. */ + return 0; +} +/*-----------------------------------------------------------*/ + +static uint32_t prvProcessYieldInterrupt( void ) +{ + return pdTRUE; +} +/*-----------------------------------------------------------*/ + +static uint32_t prvProcessTickInterrupt( void ) +{ +uint32_t ulSwitchRequired; + + /* Process the tick itself. */ + configASSERT( xPortRunning ); + ulSwitchRequired = ( uint32_t ) xTaskIncrementTick(); + + return ulSwitchRequired; +} +/*-----------------------------------------------------------*/ + +static void prvProcessSimulatedInterrupts( void ) +{ +uint32_t ulSwitchRequired, i; +xThreadState *pxThreadState; +void *pvObjectList[ 2 ]; +CONTEXT xContext; + + /* Going to block on the mutex that ensured exclusive access to the simulated + interrupt objects, and the event that signals that a simulated interrupt + should be processed. */ + pvObjectList[ 0 ] = pvInterruptEventMutex; + pvObjectList[ 1 ] = pvInterruptEvent; + + /* Create a pending tick to ensure the first task is started as soon as + this thread pends. */ + ulPendingInterrupts |= ( 1 << portINTERRUPT_TICK ); + SetEvent( pvInterruptEvent ); + + xPortRunning = pdTRUE; + + for(;;) + { + WaitForMultipleObjects( sizeof( pvObjectList ) / sizeof( void * ), pvObjectList, TRUE, INFINITE ); + + /* Used to indicate whether the simulated interrupt processing has + necessitated a context switch to another task/thread. */ + ulSwitchRequired = pdFALSE; + + /* For each interrupt we are interested in processing, each of which is + represented by a bit in the 32bit ulPendingInterrupts variable. */ + for( i = 0; i < portMAX_INTERRUPTS; i++ ) + { + /* Is the simulated interrupt pending? */ + if( ulPendingInterrupts & ( 1UL << i ) ) + { + /* Is a handler installed? */ + if( ulIsrHandler[ i ] != NULL ) + { + /* Run the actual handler. */ + if( ulIsrHandler[ i ]() != pdFALSE ) + { + ulSwitchRequired |= ( 1 << i ); + } + } + + /* Clear the interrupt pending bit. */ + ulPendingInterrupts &= ~( 1UL << i ); + } + } + + if( ulSwitchRequired != pdFALSE ) + { + void *pvOldCurrentTCB; + + pvOldCurrentTCB = pxCurrentTCB; + + /* Select the next task to run. */ + vTaskSwitchContext(); + + /* If the task selected to enter the running state is not the task + that is already in the running state. */ + if( pvOldCurrentTCB != pxCurrentTCB ) + { + /* Suspend the old thread. */ + pxThreadState = ( xThreadState *) *( ( size_t * ) pvOldCurrentTCB ); + SuspendThread( pxThreadState->pvThread ); + + /* Ensure the thread is actually suspended by performing a + synchronous operation that can only complete when the thread is + actually suspended. The below code asks for dummy register + data. */ + xContext.ContextFlags = CONTEXT_INTEGER; + ( void ) GetThreadContext( pxThreadState->pvThread, &xContext ); + + /* Obtain the state of the task now selected to enter the + Running state. */ + pxThreadState = ( xThreadState * ) ( *( size_t *) pxCurrentTCB ); + ResumeThread( pxThreadState->pvThread ); + } + } + + ReleaseMutex( pvInterruptEventMutex ); + } +} +/*-----------------------------------------------------------*/ + +void vPortDeleteThread( void *pvTaskToDelete ) +{ +xThreadState *pxThreadState; +uint32_t ulErrorCode; + + /* Remove compiler warnings if configASSERT() is not defined. */ + ( void ) ulErrorCode; + + /* Find the handle of the thread being deleted. */ + pxThreadState = ( xThreadState * ) ( *( size_t *) pvTaskToDelete ); + + /* Check that the thread is still valid, it might have been closed by + vPortCloseRunningThread() - which will be the case if the task associated + with the thread originally deleted itself rather than being deleted by a + different task. */ + if( pxThreadState->pvThread != NULL ) + { + WaitForSingleObject( pvInterruptEventMutex, INFINITE ); + + /* !!! This is not a nice way to terminate a thread, and will eventually + result in resources being depleted if tasks frequently delete other + tasks (rather than deleting themselves) as the task stacks will not be + freed. */ + ulErrorCode = TerminateThread( pxThreadState->pvThread, 0 ); + configASSERT( ulErrorCode ); + + ulErrorCode = CloseHandle( pxThreadState->pvThread ); + configASSERT( ulErrorCode ); + + ReleaseMutex( pvInterruptEventMutex ); + } +} +/*-----------------------------------------------------------*/ + +void vPortCloseRunningThread( void *pvTaskToDelete, volatile BaseType_t *pxPendYield ) +{ +xThreadState *pxThreadState; +void *pvThread; +uint32_t ulErrorCode; + + /* Remove compiler warnings if configASSERT() is not defined. */ + ( void ) ulErrorCode; + + /* Find the handle of the thread being deleted. */ + pxThreadState = ( xThreadState * ) ( *( size_t *) pvTaskToDelete ); + pvThread = pxThreadState->pvThread; + + /* Raise the Windows priority of the thread to ensure the FreeRTOS scheduler + does not run and swap it out before it is closed. If that were to happen + the thread would never run again and effectively be a thread handle and + memory leak. */ + SetThreadPriority( pvThread, portDELETE_SELF_THREAD_PRIORITY ); + + /* This function will not return, therefore a yield is set as pending to + ensure a context switch occurs away from this thread on the next tick. */ + *pxPendYield = pdTRUE; + + /* Mark the thread associated with this task as invalid so + vPortDeleteThread() does not try to terminate it. */ + pxThreadState->pvThread = NULL; + + /* Close the thread. */ + ulErrorCode = CloseHandle( pvThread ); + configASSERT( ulErrorCode ); + + /* This is called from a critical section, which must be exited before the + thread stops. */ + taskEXIT_CRITICAL(); + + ExitThread( 0 ); +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* This function IS NOT TESTED! */ + TerminateProcess( GetCurrentProcess(), 0 ); +} +/*-----------------------------------------------------------*/ + +void vPortGenerateSimulatedInterrupt( uint32_t ulInterruptNumber ) +{ + configASSERT( xPortRunning ); + + if( ( ulInterruptNumber < portMAX_INTERRUPTS ) && ( pvInterruptEventMutex != NULL ) ) + { + /* Yield interrupts are processed even when critical nesting is + non-zero. */ + WaitForSingleObject( pvInterruptEventMutex, INFINITE ); + ulPendingInterrupts |= ( 1 << ulInterruptNumber ); + + /* The simulated interrupt is now held pending, but don't actually + process it yet if this call is within a critical section. It is + possible for this to be in a critical section as calls to wait for + mutexes are accumulative. */ + if( ulCriticalNesting == 0 ) + { + SetEvent( pvInterruptEvent ); + } + + ReleaseMutex( pvInterruptEventMutex ); + } +} +/*-----------------------------------------------------------*/ + +void vPortSetInterruptHandler( uint32_t ulInterruptNumber, uint32_t (*pvHandler)( void ) ) +{ + if( ulInterruptNumber < portMAX_INTERRUPTS ) + { + if( pvInterruptEventMutex != NULL ) + { + WaitForSingleObject( pvInterruptEventMutex, INFINITE ); + ulIsrHandler[ ulInterruptNumber ] = pvHandler; + ReleaseMutex( pvInterruptEventMutex ); + } + else + { + ulIsrHandler[ ulInterruptNumber ] = pvHandler; + } + } +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + if( xPortRunning == pdTRUE ) + { + /* The interrupt event mutex is held for the entire critical section, + effectively disabling (simulated) interrupts. */ + WaitForSingleObject( pvInterruptEventMutex, INFINITE ); + ulCriticalNesting++; + } + else + { + ulCriticalNesting++; + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ +int32_t lMutexNeedsReleasing; + + /* The interrupt event mutex should already be held by this thread as it was + obtained on entry to the critical section. */ + + lMutexNeedsReleasing = pdTRUE; + + if( ulCriticalNesting > portNO_CRITICAL_NESTING ) + { + if( ulCriticalNesting == ( portNO_CRITICAL_NESTING + 1 ) ) + { + ulCriticalNesting--; + + /* Were any interrupts set to pending while interrupts were + (simulated) disabled? */ + if( ulPendingInterrupts != 0UL ) + { + configASSERT( xPortRunning ); + SetEvent( pvInterruptEvent ); + + /* Mutex will be released now, so does not require releasing + on function exit. */ + lMutexNeedsReleasing = pdFALSE; + ReleaseMutex( pvInterruptEventMutex ); + } + } + else + { + /* Tick interrupts will still not be processed as the critical + nesting depth will not be zero. */ + ulCriticalNesting--; + } + } + + if( pvInterruptEventMutex != NULL ) + { + if( lMutexNeedsReleasing == pdTRUE ) + { + configASSERT( xPortRunning ); + ReleaseMutex( pvInterruptEventMutex ); + } + } +} +/*-----------------------------------------------------------*/ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MSVC-MingW/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MSVC-MingW/portmacro.h new file mode 100644 index 0000000..34634fd --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MSVC-MingW/portmacro.h @@ -0,0 +1,198 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#include + +/****************************************************************************** + Defines +******************************************************************************/ +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE size_t +#define portBASE_TYPE long +#define portPOINTER_SIZE_TYPE size_t + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32/64-bit tick type on a 32/64-bit architecture, so reads of the tick + count do not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif + +/* Hardware specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portINLINE __inline + +#if defined( __x86_64__) || defined( _M_X64 ) + #define portBYTE_ALIGNMENT 8 +#else + #define portBYTE_ALIGNMENT 4 +#endif + +#define portYIELD() vPortGenerateSimulatedInterrupt( portINTERRUPT_YIELD ) + +/* Simulated interrupts return pdFALSE if no context switch should be performed, +or a non-zero number if a context switch should be performed. */ +#define portYIELD_FROM_ISR( x ) return x +#define portEND_SWITCHING_ISR( x ) portYIELD_FROM_ISR( ( x ) ) + +void vPortCloseRunningThread( void *pvTaskToDelete, volatile BaseType_t *pxPendYield ); +void vPortDeleteThread( void *pvThreadToDelete ); +#define portCLEAN_UP_TCB( pxTCB ) vPortDeleteThread( pxTCB ) +#define portPRE_TASK_DELETE_HOOK( pvTaskToDelete, pxPendYield ) vPortCloseRunningThread( ( pvTaskToDelete ), ( pxPendYield ) ) +#define portDISABLE_INTERRUPTS() vPortEnterCritical() +#define portENABLE_INTERRUPTS() vPortExitCritical() + +/* Critical section handling. */ +void vPortEnterCritical( void ); +void vPortExitCritical( void ); + +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() + +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + + /*-----------------------------------------------------------*/ + + #ifdef __GNUC__ + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) \ + __asm volatile( "bsr %1, %0\n\t" \ + :"=r"(uxTopPriority) : "rm"(uxReadyPriorities) : "cc" ) + #else + /* BitScanReverse returns the bit position of the most significant '1' + in the word. */ + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) _BitScanReverse( ( DWORD * ) &( uxTopPriority ), ( uxReadyPriorities ) ) + #endif /* __GNUC__ */ + +#endif /* taskRECORD_READY_PRIORITY */ + +#ifndef __GNUC__ + __pragma( warning( disable:4211 ) ) /* Nonstandard extension used, as extern is only nonstandard to MSVC. */ +#endif + + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) + +#define portINTERRUPT_YIELD ( 0UL ) +#define portINTERRUPT_TICK ( 1UL ) + +/* + * Raise a simulated interrupt represented by the bit mask in ulInterruptMask. + * Each bit can be used to represent an individual interrupt - with the first + * two bits being used for the Yield and Tick interrupts respectively. +*/ +void vPortGenerateSimulatedInterrupt( uint32_t ulInterruptNumber ); + +/* + * Install an interrupt handler to be called by the simulated interrupt handler + * thread. The interrupt number must be above any used by the kernel itself + * (at the time of writing the kernel was using interrupt numbers 0, 1, and 2 + * as defined above). The number must also be lower than 32. + * + * Interrupt handler functions must return a non-zero value if executing the + * handler resulted in a task switch being required. + */ +void vPortSetInterruptHandler( uint32_t ulInterruptNumber, uint32_t (*pvHandler)( void ) ); + +#endif + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MemMang/ReadMe.url b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MemMang/ReadMe.url new file mode 100644 index 0000000..b04bfe3 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MemMang/ReadMe.url @@ -0,0 +1,5 @@ +[{000214A0-0000-0000-C000-000000000046}] +Prop3=19,2 +[InternetShortcut] +URL=http://www.freertos.org/a00111.html +IDList= diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MemMang/heap_1.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MemMang/heap_1.c new file mode 100644 index 0000000..435c99d --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MemMang/heap_1.c @@ -0,0 +1,188 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +/* + * The simplest possible implementation of pvPortMalloc(). Note that this + * implementation does NOT allow allocated memory to be freed again. + * + * See heap_2.c, heap_3.c and heap_4.c for alternative implementations, and the + * memory management pages of http://www.FreeRTOS.org for more information. + */ +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining +all the API functions to use the MPU wrappers. That should only be done when +task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#if( configSUPPORT_DYNAMIC_ALLOCATION == 0 ) + #error This file must not be used if configSUPPORT_DYNAMIC_ALLOCATION is 0 +#endif + +/* A few bytes might be lost to byte aligning the heap start address. */ +#define configADJUSTED_HEAP_SIZE ( configTOTAL_HEAP_SIZE - portBYTE_ALIGNMENT ) + +/* Allocate the memory for the heap. */ +/* Allocate the memory for the heap. */ +#if( configAPPLICATION_ALLOCATED_HEAP == 1 ) + /* The application writer has already defined the array used for the RTOS + heap - probably so it can be placed in a special segment or address. */ + extern uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]; +#else + static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]; +#endif /* configAPPLICATION_ALLOCATED_HEAP */ + +static size_t xNextFreeByte = ( size_t ) 0; + +/*-----------------------------------------------------------*/ + +void *pvPortMalloc( size_t xWantedSize ) +{ +void *pvReturn = NULL; +static uint8_t *pucAlignedHeap = NULL; + + /* Ensure that blocks are always aligned to the required number of bytes. */ + #if( portBYTE_ALIGNMENT != 1 ) + { + if( xWantedSize & portBYTE_ALIGNMENT_MASK ) + { + /* Byte alignment required. */ + xWantedSize += ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) ); + } + } + #endif + + vTaskSuspendAll(); + { + if( pucAlignedHeap == NULL ) + { + /* Ensure the heap starts on a correctly aligned boundary. */ + pucAlignedHeap = ( uint8_t * ) ( ( ( portPOINTER_SIZE_TYPE ) &ucHeap[ portBYTE_ALIGNMENT ] ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) ); + } + + /* Check there is enough room left for the allocation. */ + if( ( ( xNextFreeByte + xWantedSize ) < configADJUSTED_HEAP_SIZE ) && + ( ( xNextFreeByte + xWantedSize ) > xNextFreeByte ) )/* Check for overflow. */ + { + /* Return the next free byte then increment the index past this + block. */ + pvReturn = pucAlignedHeap + xNextFreeByte; + xNextFreeByte += xWantedSize; + } + + traceMALLOC( pvReturn, xWantedSize ); + } + ( void ) xTaskResumeAll(); + + #if( configUSE_MALLOC_FAILED_HOOK == 1 ) + { + if( pvReturn == NULL ) + { + extern void vApplicationMallocFailedHook( void ); + vApplicationMallocFailedHook(); + } + } + #endif + + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void vPortFree( void *pv ) +{ + /* Memory cannot be freed using this scheme. See heap_2.c, heap_3.c and + heap_4.c for alternative implementations, and the memory management pages of + http://www.FreeRTOS.org for more information. */ + ( void ) pv; + + /* Force an assert as it is invalid to call this function. */ + configASSERT( pv == NULL ); +} +/*-----------------------------------------------------------*/ + +void vPortInitialiseBlocks( void ) +{ + /* Only required when static memory is not cleared. */ + xNextFreeByte = ( size_t ) 0; +} +/*-----------------------------------------------------------*/ + +size_t xPortGetFreeHeapSize( void ) +{ + return ( configADJUSTED_HEAP_SIZE - xNextFreeByte ); +} + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MemMang/heap_2.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MemMang/heap_2.c new file mode 100644 index 0000000..fb9c8b1 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MemMang/heap_2.c @@ -0,0 +1,314 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* + * A sample implementation of pvPortMalloc() and vPortFree() that permits + * allocated blocks to be freed, but does not combine adjacent free blocks + * into a single larger block (and so will fragment memory). See heap_4.c for + * an equivalent that does combine adjacent blocks into single larger blocks. + * + * See heap_1.c, heap_3.c and heap_4.c for alternative implementations, and the + * memory management pages of http://www.FreeRTOS.org for more information. + */ +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining +all the API functions to use the MPU wrappers. That should only be done when +task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#if( configSUPPORT_DYNAMIC_ALLOCATION == 0 ) + #error This file must not be used if configSUPPORT_DYNAMIC_ALLOCATION is 0 +#endif + +/* A few bytes might be lost to byte aligning the heap start address. */ +#define configADJUSTED_HEAP_SIZE ( configTOTAL_HEAP_SIZE - portBYTE_ALIGNMENT ) + +/* + * Initialises the heap structures before their first use. + */ +static void prvHeapInit( void ); + +/* Allocate the memory for the heap. */ +#if( configAPPLICATION_ALLOCATED_HEAP == 1 ) + /* The application writer has already defined the array used for the RTOS + heap - probably so it can be placed in a special segment or address. */ + extern uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]; +#else + static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]; +#endif /* configAPPLICATION_ALLOCATED_HEAP */ + + +/* Define the linked list structure. This is used to link free blocks in order +of their size. */ +typedef struct A_BLOCK_LINK +{ + struct A_BLOCK_LINK *pxNextFreeBlock; /*<< The next free block in the list. */ + size_t xBlockSize; /*<< The size of the free block. */ +} BlockLink_t; + + +static const uint16_t heapSTRUCT_SIZE = ( ( sizeof ( BlockLink_t ) + ( portBYTE_ALIGNMENT - 1 ) ) & ~portBYTE_ALIGNMENT_MASK ); +#define heapMINIMUM_BLOCK_SIZE ( ( size_t ) ( heapSTRUCT_SIZE * 2 ) ) + +/* Create a couple of list links to mark the start and end of the list. */ +static BlockLink_t xStart, xEnd; + +/* Keeps track of the number of free bytes remaining, but says nothing about +fragmentation. */ +static size_t xFreeBytesRemaining = configADJUSTED_HEAP_SIZE; + +/* STATIC FUNCTIONS ARE DEFINED AS MACROS TO MINIMIZE THE FUNCTION CALL DEPTH. */ + +/* + * Insert a block into the list of free blocks - which is ordered by size of + * the block. Small blocks at the start of the list and large blocks at the end + * of the list. + */ +#define prvInsertBlockIntoFreeList( pxBlockToInsert ) \ +{ \ +BlockLink_t *pxIterator; \ +size_t xBlockSize; \ + \ + xBlockSize = pxBlockToInsert->xBlockSize; \ + \ + /* Iterate through the list until a block is found that has a larger size */ \ + /* than the block we are inserting. */ \ + for( pxIterator = &xStart; pxIterator->pxNextFreeBlock->xBlockSize < xBlockSize; pxIterator = pxIterator->pxNextFreeBlock ) \ + { \ + /* There is nothing to do here - just iterate to the correct position. */ \ + } \ + \ + /* Update the list to include the block being inserted in the correct */ \ + /* position. */ \ + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock; \ + pxIterator->pxNextFreeBlock = pxBlockToInsert; \ +} +/*-----------------------------------------------------------*/ + +void *pvPortMalloc( size_t xWantedSize ) +{ +BlockLink_t *pxBlock, *pxPreviousBlock, *pxNewBlockLink; +static BaseType_t xHeapHasBeenInitialised = pdFALSE; +void *pvReturn = NULL; + + vTaskSuspendAll(); + { + /* If this is the first call to malloc then the heap will require + initialisation to setup the list of free blocks. */ + if( xHeapHasBeenInitialised == pdFALSE ) + { + prvHeapInit(); + xHeapHasBeenInitialised = pdTRUE; + } + + /* The wanted size is increased so it can contain a BlockLink_t + structure in addition to the requested amount of bytes. */ + if( xWantedSize > 0 ) + { + xWantedSize += heapSTRUCT_SIZE; + + /* Ensure that blocks are always aligned to the required number of bytes. */ + if( ( xWantedSize & portBYTE_ALIGNMENT_MASK ) != 0 ) + { + /* Byte alignment required. */ + xWantedSize += ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) ); + } + } + + if( ( xWantedSize > 0 ) && ( xWantedSize < configADJUSTED_HEAP_SIZE ) ) + { + /* Blocks are stored in byte order - traverse the list from the start + (smallest) block until one of adequate size is found. */ + pxPreviousBlock = &xStart; + pxBlock = xStart.pxNextFreeBlock; + while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) ) + { + pxPreviousBlock = pxBlock; + pxBlock = pxBlock->pxNextFreeBlock; + } + + /* If we found the end marker then a block of adequate size was not found. */ + if( pxBlock != &xEnd ) + { + /* Return the memory space - jumping over the BlockLink_t structure + at its start. */ + pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + heapSTRUCT_SIZE ); + + /* This block is being returned for use so must be taken out of the + list of free blocks. */ + pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock; + + /* If the block is larger than required it can be split into two. */ + if( ( pxBlock->xBlockSize - xWantedSize ) > heapMINIMUM_BLOCK_SIZE ) + { + /* This block is to be split into two. Create a new block + following the number of bytes requested. The void cast is + used to prevent byte alignment warnings from the compiler. */ + pxNewBlockLink = ( void * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize ); + + /* Calculate the sizes of two blocks split from the single + block. */ + pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize; + pxBlock->xBlockSize = xWantedSize; + + /* Insert the new block into the list of free blocks. */ + prvInsertBlockIntoFreeList( ( pxNewBlockLink ) ); + } + + xFreeBytesRemaining -= pxBlock->xBlockSize; + } + } + + traceMALLOC( pvReturn, xWantedSize ); + } + ( void ) xTaskResumeAll(); + + #if( configUSE_MALLOC_FAILED_HOOK == 1 ) + { + if( pvReturn == NULL ) + { + extern void vApplicationMallocFailedHook( void ); + vApplicationMallocFailedHook(); + } + } + #endif + + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void vPortFree( void *pv ) +{ +uint8_t *puc = ( uint8_t * ) pv; +BlockLink_t *pxLink; + + if( pv != NULL ) + { + /* The memory being freed will have an BlockLink_t structure immediately + before it. */ + puc -= heapSTRUCT_SIZE; + + /* This unexpected casting is to keep some compilers from issuing + byte alignment warnings. */ + pxLink = ( void * ) puc; + + vTaskSuspendAll(); + { + /* Add this block to the list of free blocks. */ + prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) ); + xFreeBytesRemaining += pxLink->xBlockSize; + traceFREE( pv, pxLink->xBlockSize ); + } + ( void ) xTaskResumeAll(); + } +} +/*-----------------------------------------------------------*/ + +size_t xPortGetFreeHeapSize( void ) +{ + return xFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ + +void vPortInitialiseBlocks( void ) +{ + /* This just exists to keep the linker quiet. */ +} +/*-----------------------------------------------------------*/ + +static void prvHeapInit( void ) +{ +BlockLink_t *pxFirstFreeBlock; +uint8_t *pucAlignedHeap; + + /* Ensure the heap starts on a correctly aligned boundary. */ + pucAlignedHeap = ( uint8_t * ) ( ( ( portPOINTER_SIZE_TYPE ) &ucHeap[ portBYTE_ALIGNMENT ] ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) ); + + /* xStart is used to hold a pointer to the first item in the list of free + blocks. The void cast is used to prevent compiler warnings. */ + xStart.pxNextFreeBlock = ( void * ) pucAlignedHeap; + xStart.xBlockSize = ( size_t ) 0; + + /* xEnd is used to mark the end of the list of free blocks. */ + xEnd.xBlockSize = configADJUSTED_HEAP_SIZE; + xEnd.pxNextFreeBlock = NULL; + + /* To start with there is a single free block that is sized to take up the + entire heap space. */ + pxFirstFreeBlock = ( void * ) pucAlignedHeap; + pxFirstFreeBlock->xBlockSize = configADJUSTED_HEAP_SIZE; + pxFirstFreeBlock->pxNextFreeBlock = &xEnd; +} +/*-----------------------------------------------------------*/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MemMang/heap_3.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MemMang/heap_3.c new file mode 100644 index 0000000..cda8aa7 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MemMang/heap_3.c @@ -0,0 +1,139 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +/* + * Implementation of pvPortMalloc() and vPortFree() that relies on the + * compilers own malloc() and free() implementations. + * + * This file can only be used if the linker is configured to to generate + * a heap memory area. + * + * See heap_1.c, heap_2.c and heap_4.c for alternative implementations, and the + * memory management pages of http://www.FreeRTOS.org for more information. + */ + +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining +all the API functions to use the MPU wrappers. That should only be done when +task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#if( configSUPPORT_DYNAMIC_ALLOCATION == 0 ) + #error This file must not be used if configSUPPORT_DYNAMIC_ALLOCATION is 0 +#endif + +/*-----------------------------------------------------------*/ + +void *pvPortMalloc( size_t xWantedSize ) +{ +void *pvReturn; + + vTaskSuspendAll(); + { + pvReturn = malloc( xWantedSize ); + traceMALLOC( pvReturn, xWantedSize ); + } + ( void ) xTaskResumeAll(); + + #if( configUSE_MALLOC_FAILED_HOOK == 1 ) + { + if( pvReturn == NULL ) + { + extern void vApplicationMallocFailedHook( void ); + vApplicationMallocFailedHook(); + } + } + #endif + + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void vPortFree( void *pv ) +{ + if( pv ) + { + vTaskSuspendAll(); + { + free( pv ); + traceFREE( pv, 0 ); + } + ( void ) xTaskResumeAll(); + } +} + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MemMang/heap_4.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MemMang/heap_4.c new file mode 100644 index 0000000..1091371 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MemMang/heap_4.c @@ -0,0 +1,478 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* + * A sample implementation of pvPortMalloc() and vPortFree() that combines + * (coalescences) adjacent memory blocks as they are freed, and in so doing + * limits memory fragmentation. + * + * See heap_1.c, heap_2.c and heap_3.c for alternative implementations, and the + * memory management pages of http://www.FreeRTOS.org for more information. + */ +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining +all the API functions to use the MPU wrappers. That should only be done when +task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#if( configSUPPORT_DYNAMIC_ALLOCATION == 0 ) + #error This file must not be used if configSUPPORT_DYNAMIC_ALLOCATION is 0 +#endif + +/* Block sizes must not get too small. */ +#define heapMINIMUM_BLOCK_SIZE ( ( size_t ) ( xHeapStructSize << 1 ) ) + +/* Assumes 8bit bytes! */ +#define heapBITS_PER_BYTE ( ( size_t ) 8 ) + +/* Allocate the memory for the heap. */ +#if( configAPPLICATION_ALLOCATED_HEAP == 1 ) + /* The application writer has already defined the array used for the RTOS + heap - probably so it can be placed in a special segment or address. */ + extern uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]; +#else + static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]; +#endif /* configAPPLICATION_ALLOCATED_HEAP */ + +/* Define the linked list structure. This is used to link free blocks in order +of their memory address. */ +typedef struct A_BLOCK_LINK +{ + struct A_BLOCK_LINK *pxNextFreeBlock; /*<< The next free block in the list. */ + size_t xBlockSize; /*<< The size of the free block. */ +} BlockLink_t; + +/*-----------------------------------------------------------*/ + +/* + * Inserts a block of memory that is being freed into the correct position in + * the list of free memory blocks. The block being freed will be merged with + * the block in front it and/or the block behind it if the memory blocks are + * adjacent to each other. + */ +static void prvInsertBlockIntoFreeList( BlockLink_t *pxBlockToInsert ); + +/* + * Called automatically to setup the required heap structures the first time + * pvPortMalloc() is called. + */ +static void prvHeapInit( void ); + +/*-----------------------------------------------------------*/ + +/* The size of the structure placed at the beginning of each allocated memory +block must by correctly byte aligned. */ +static const size_t xHeapStructSize = ( sizeof( BlockLink_t ) + ( ( size_t ) ( portBYTE_ALIGNMENT - 1 ) ) ) & ~( ( size_t ) portBYTE_ALIGNMENT_MASK ); + +/* Create a couple of list links to mark the start and end of the list. */ +static BlockLink_t xStart, *pxEnd = NULL; + +/* Keeps track of the number of free bytes remaining, but says nothing about +fragmentation. */ +static size_t xFreeBytesRemaining = 0U; +static size_t xMinimumEverFreeBytesRemaining = 0U; + +/* Gets set to the top bit of an size_t type. When this bit in the xBlockSize +member of an BlockLink_t structure is set then the block belongs to the +application. When the bit is free the block is still part of the free heap +space. */ +static size_t xBlockAllocatedBit = 0; + +/*-----------------------------------------------------------*/ + +void *pvPortMalloc( size_t xWantedSize ) +{ +BlockLink_t *pxBlock, *pxPreviousBlock, *pxNewBlockLink; +void *pvReturn = NULL; + + vTaskSuspendAll(); + { + /* If this is the first call to malloc then the heap will require + initialisation to setup the list of free blocks. */ + if( pxEnd == NULL ) + { + prvHeapInit(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Check the requested block size is not so large that the top bit is + set. The top bit of the block size member of the BlockLink_t structure + is used to determine who owns the block - the application or the + kernel, so it must be free. */ + if( ( xWantedSize & xBlockAllocatedBit ) == 0 ) + { + /* The wanted size is increased so it can contain a BlockLink_t + structure in addition to the requested amount of bytes. */ + if( xWantedSize > 0 ) + { + xWantedSize += xHeapStructSize; + + /* Ensure that blocks are always aligned to the required number + of bytes. */ + if( ( xWantedSize & portBYTE_ALIGNMENT_MASK ) != 0x00 ) + { + /* Byte alignment required. */ + xWantedSize += ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) ); + configASSERT( ( xWantedSize & portBYTE_ALIGNMENT_MASK ) == 0 ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( ( xWantedSize > 0 ) && ( xWantedSize <= xFreeBytesRemaining ) ) + { + /* Traverse the list from the start (lowest address) block until + one of adequate size is found. */ + pxPreviousBlock = &xStart; + pxBlock = xStart.pxNextFreeBlock; + while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) ) + { + pxPreviousBlock = pxBlock; + pxBlock = pxBlock->pxNextFreeBlock; + } + + /* If the end marker was reached then a block of adequate size + was not found. */ + if( pxBlock != pxEnd ) + { + /* Return the memory space pointed to - jumping over the + BlockLink_t structure at its start. */ + pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + xHeapStructSize ); + + /* This block is being returned for use so must be taken out + of the list of free blocks. */ + pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock; + + /* If the block is larger than required it can be split into + two. */ + if( ( pxBlock->xBlockSize - xWantedSize ) > heapMINIMUM_BLOCK_SIZE ) + { + /* This block is to be split into two. Create a new + block following the number of bytes requested. The void + cast is used to prevent byte alignment warnings from the + compiler. */ + pxNewBlockLink = ( void * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize ); + configASSERT( ( ( ( size_t ) pxNewBlockLink ) & portBYTE_ALIGNMENT_MASK ) == 0 ); + + /* Calculate the sizes of two blocks split from the + single block. */ + pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize; + pxBlock->xBlockSize = xWantedSize; + + /* Insert the new block into the list of free blocks. */ + prvInsertBlockIntoFreeList( pxNewBlockLink ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xFreeBytesRemaining -= pxBlock->xBlockSize; + + if( xFreeBytesRemaining < xMinimumEverFreeBytesRemaining ) + { + xMinimumEverFreeBytesRemaining = xFreeBytesRemaining; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* The block is being returned - it is allocated and owned + by the application and has no "next" block. */ + pxBlock->xBlockSize |= xBlockAllocatedBit; + pxBlock->pxNextFreeBlock = NULL; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceMALLOC( pvReturn, xWantedSize ); + } + ( void ) xTaskResumeAll(); + + #if( configUSE_MALLOC_FAILED_HOOK == 1 ) + { + if( pvReturn == NULL ) + { + extern void vApplicationMallocFailedHook( void ); + vApplicationMallocFailedHook(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif + + configASSERT( ( ( ( size_t ) pvReturn ) & ( size_t ) portBYTE_ALIGNMENT_MASK ) == 0 ); + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void vPortFree( void *pv ) +{ +uint8_t *puc = ( uint8_t * ) pv; +BlockLink_t *pxLink; + + if( pv != NULL ) + { + /* The memory being freed will have an BlockLink_t structure immediately + before it. */ + puc -= xHeapStructSize; + + /* This casting is to keep the compiler from issuing warnings. */ + pxLink = ( void * ) puc; + + /* Check the block is actually allocated. */ + configASSERT( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 ); + configASSERT( pxLink->pxNextFreeBlock == NULL ); + + if( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 ) + { + if( pxLink->pxNextFreeBlock == NULL ) + { + /* The block is being returned to the heap - it is no longer + allocated. */ + pxLink->xBlockSize &= ~xBlockAllocatedBit; + + vTaskSuspendAll(); + { + /* Add this block to the list of free blocks. */ + xFreeBytesRemaining += pxLink->xBlockSize; + traceFREE( pv, pxLink->xBlockSize ); + prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) ); + } + ( void ) xTaskResumeAll(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } +} +/*-----------------------------------------------------------*/ + +size_t xPortGetFreeHeapSize( void ) +{ + return xFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ + +size_t xPortGetMinimumEverFreeHeapSize( void ) +{ + return xMinimumEverFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ + +void vPortInitialiseBlocks( void ) +{ + /* This just exists to keep the linker quiet. */ +} +/*-----------------------------------------------------------*/ + +static void prvHeapInit( void ) +{ +BlockLink_t *pxFirstFreeBlock; +uint8_t *pucAlignedHeap; +size_t uxAddress; +size_t xTotalHeapSize = configTOTAL_HEAP_SIZE; + + /* Ensure the heap starts on a correctly aligned boundary. */ + uxAddress = ( size_t ) ucHeap; + + if( ( uxAddress & portBYTE_ALIGNMENT_MASK ) != 0 ) + { + uxAddress += ( portBYTE_ALIGNMENT - 1 ); + uxAddress &= ~( ( size_t ) portBYTE_ALIGNMENT_MASK ); + xTotalHeapSize -= uxAddress - ( size_t ) ucHeap; + } + + pucAlignedHeap = ( uint8_t * ) uxAddress; + + /* xStart is used to hold a pointer to the first item in the list of free + blocks. The void cast is used to prevent compiler warnings. */ + xStart.pxNextFreeBlock = ( void * ) pucAlignedHeap; + xStart.xBlockSize = ( size_t ) 0; + + /* pxEnd is used to mark the end of the list of free blocks and is inserted + at the end of the heap space. */ + uxAddress = ( ( size_t ) pucAlignedHeap ) + xTotalHeapSize; + uxAddress -= xHeapStructSize; + uxAddress &= ~( ( size_t ) portBYTE_ALIGNMENT_MASK ); + pxEnd = ( void * ) uxAddress; + pxEnd->xBlockSize = 0; + pxEnd->pxNextFreeBlock = NULL; + + /* To start with there is a single free block that is sized to take up the + entire heap space, minus the space taken by pxEnd. */ + pxFirstFreeBlock = ( void * ) pucAlignedHeap; + pxFirstFreeBlock->xBlockSize = uxAddress - ( size_t ) pxFirstFreeBlock; + pxFirstFreeBlock->pxNextFreeBlock = pxEnd; + + /* Only one block exists - and it covers the entire usable heap space. */ + xMinimumEverFreeBytesRemaining = pxFirstFreeBlock->xBlockSize; + xFreeBytesRemaining = pxFirstFreeBlock->xBlockSize; + + /* Work out the position of the top bit in a size_t variable. */ + xBlockAllocatedBit = ( ( size_t ) 1 ) << ( ( sizeof( size_t ) * heapBITS_PER_BYTE ) - 1 ); +} +/*-----------------------------------------------------------*/ + +static void prvInsertBlockIntoFreeList( BlockLink_t *pxBlockToInsert ) +{ +BlockLink_t *pxIterator; +uint8_t *puc; + + /* Iterate through the list until a block is found that has a higher address + than the block being inserted. */ + for( pxIterator = &xStart; pxIterator->pxNextFreeBlock < pxBlockToInsert; pxIterator = pxIterator->pxNextFreeBlock ) + { + /* Nothing to do here, just iterate to the right position. */ + } + + /* Do the block being inserted, and the block it is being inserted after + make a contiguous block of memory? */ + puc = ( uint8_t * ) pxIterator; + if( ( puc + pxIterator->xBlockSize ) == ( uint8_t * ) pxBlockToInsert ) + { + pxIterator->xBlockSize += pxBlockToInsert->xBlockSize; + pxBlockToInsert = pxIterator; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Do the block being inserted, and the block it is being inserted before + make a contiguous block of memory? */ + puc = ( uint8_t * ) pxBlockToInsert; + if( ( puc + pxBlockToInsert->xBlockSize ) == ( uint8_t * ) pxIterator->pxNextFreeBlock ) + { + if( pxIterator->pxNextFreeBlock != pxEnd ) + { + /* Form one big block from the two blocks. */ + pxBlockToInsert->xBlockSize += pxIterator->pxNextFreeBlock->xBlockSize; + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock->pxNextFreeBlock; + } + else + { + pxBlockToInsert->pxNextFreeBlock = pxEnd; + } + } + else + { + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock; + } + + /* If the block being inserted plugged a gab, so was merged with the block + before and the block after, then it's pxNextFreeBlock pointer will have + already been set, and should not be set here as that would make it point + to itself. */ + if( pxIterator != pxBlockToInsert ) + { + pxIterator->pxNextFreeBlock = pxBlockToInsert; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } +} + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MemMang/heap_5.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MemMang/heap_5.c new file mode 100644 index 0000000..8ac661e --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MemMang/heap_5.c @@ -0,0 +1,527 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* + * A sample implementation of pvPortMalloc() that allows the heap to be defined + * across multiple non-contigous blocks and combines (coalescences) adjacent + * memory blocks as they are freed. + * + * See heap_1.c, heap_2.c, heap_3.c and heap_4.c for alternative + * implementations, and the memory management pages of http://www.FreeRTOS.org + * for more information. + * + * Usage notes: + * + * vPortDefineHeapRegions() ***must*** be called before pvPortMalloc(). + * pvPortMalloc() will be called if any task objects (tasks, queues, event + * groups, etc.) are created, therefore vPortDefineHeapRegions() ***must*** be + * called before any other objects are defined. + * + * vPortDefineHeapRegions() takes a single parameter. The parameter is an array + * of HeapRegion_t structures. HeapRegion_t is defined in portable.h as + * + * typedef struct HeapRegion + * { + * uint8_t *pucStartAddress; << Start address of a block of memory that will be part of the heap. + * size_t xSizeInBytes; << Size of the block of memory. + * } HeapRegion_t; + * + * The array is terminated using a NULL zero sized region definition, and the + * memory regions defined in the array ***must*** appear in address order from + * low address to high address. So the following is a valid example of how + * to use the function. + * + * HeapRegion_t xHeapRegions[] = + * { + * { ( uint8_t * ) 0x80000000UL, 0x10000 }, << Defines a block of 0x10000 bytes starting at address 0x80000000 + * { ( uint8_t * ) 0x90000000UL, 0xa0000 }, << Defines a block of 0xa0000 bytes starting at address of 0x90000000 + * { NULL, 0 } << Terminates the array. + * }; + * + * vPortDefineHeapRegions( xHeapRegions ); << Pass the array into vPortDefineHeapRegions(). + * + * Note 0x80000000 is the lower address so appears in the array first. + * + */ +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining +all the API functions to use the MPU wrappers. That should only be done when +task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#if( configSUPPORT_DYNAMIC_ALLOCATION == 0 ) + #error This file must not be used if configSUPPORT_DYNAMIC_ALLOCATION is 0 +#endif + +/* Block sizes must not get too small. */ +#define heapMINIMUM_BLOCK_SIZE ( ( size_t ) ( xHeapStructSize << 1 ) ) + +/* Assumes 8bit bytes! */ +#define heapBITS_PER_BYTE ( ( size_t ) 8 ) + +/* Define the linked list structure. This is used to link free blocks in order +of their memory address. */ +typedef struct A_BLOCK_LINK +{ + struct A_BLOCK_LINK *pxNextFreeBlock; /*<< The next free block in the list. */ + size_t xBlockSize; /*<< The size of the free block. */ +} BlockLink_t; + +/*-----------------------------------------------------------*/ + +/* + * Inserts a block of memory that is being freed into the correct position in + * the list of free memory blocks. The block being freed will be merged with + * the block in front it and/or the block behind it if the memory blocks are + * adjacent to each other. + */ +static void prvInsertBlockIntoFreeList( BlockLink_t *pxBlockToInsert ); + +/*-----------------------------------------------------------*/ + +/* The size of the structure placed at the beginning of each allocated memory +block must by correctly byte aligned. */ +static const size_t xHeapStructSize = ( sizeof( BlockLink_t ) + ( ( size_t ) ( portBYTE_ALIGNMENT - 1 ) ) ) & ~( ( size_t ) portBYTE_ALIGNMENT_MASK ); + +/* Create a couple of list links to mark the start and end of the list. */ +static BlockLink_t xStart, *pxEnd = NULL; + +/* Keeps track of the number of free bytes remaining, but says nothing about +fragmentation. */ +static size_t xFreeBytesRemaining = 0U; +static size_t xMinimumEverFreeBytesRemaining = 0U; + +/* Gets set to the top bit of an size_t type. When this bit in the xBlockSize +member of an BlockLink_t structure is set then the block belongs to the +application. When the bit is free the block is still part of the free heap +space. */ +static size_t xBlockAllocatedBit = 0; + +/*-----------------------------------------------------------*/ + +void *pvPortMalloc( size_t xWantedSize ) +{ +BlockLink_t *pxBlock, *pxPreviousBlock, *pxNewBlockLink; +void *pvReturn = NULL; + + /* The heap must be initialised before the first call to + prvPortMalloc(). */ + configASSERT( pxEnd ); + + vTaskSuspendAll(); + { + /* Check the requested block size is not so large that the top bit is + set. The top bit of the block size member of the BlockLink_t structure + is used to determine who owns the block - the application or the + kernel, so it must be free. */ + if( ( xWantedSize & xBlockAllocatedBit ) == 0 ) + { + /* The wanted size is increased so it can contain a BlockLink_t + structure in addition to the requested amount of bytes. */ + if( xWantedSize > 0 ) + { + xWantedSize += xHeapStructSize; + + /* Ensure that blocks are always aligned to the required number + of bytes. */ + if( ( xWantedSize & portBYTE_ALIGNMENT_MASK ) != 0x00 ) + { + /* Byte alignment required. */ + xWantedSize += ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( ( xWantedSize > 0 ) && ( xWantedSize <= xFreeBytesRemaining ) ) + { + /* Traverse the list from the start (lowest address) block until + one of adequate size is found. */ + pxPreviousBlock = &xStart; + pxBlock = xStart.pxNextFreeBlock; + while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) ) + { + pxPreviousBlock = pxBlock; + pxBlock = pxBlock->pxNextFreeBlock; + } + + /* If the end marker was reached then a block of adequate size + was not found. */ + if( pxBlock != pxEnd ) + { + /* Return the memory space pointed to - jumping over the + BlockLink_t structure at its start. */ + pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + xHeapStructSize ); + + /* This block is being returned for use so must be taken out + of the list of free blocks. */ + pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock; + + /* If the block is larger than required it can be split into + two. */ + if( ( pxBlock->xBlockSize - xWantedSize ) > heapMINIMUM_BLOCK_SIZE ) + { + /* This block is to be split into two. Create a new + block following the number of bytes requested. The void + cast is used to prevent byte alignment warnings from the + compiler. */ + pxNewBlockLink = ( void * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize ); + + /* Calculate the sizes of two blocks split from the + single block. */ + pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize; + pxBlock->xBlockSize = xWantedSize; + + /* Insert the new block into the list of free blocks. */ + prvInsertBlockIntoFreeList( ( pxNewBlockLink ) ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xFreeBytesRemaining -= pxBlock->xBlockSize; + + if( xFreeBytesRemaining < xMinimumEverFreeBytesRemaining ) + { + xMinimumEverFreeBytesRemaining = xFreeBytesRemaining; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* The block is being returned - it is allocated and owned + by the application and has no "next" block. */ + pxBlock->xBlockSize |= xBlockAllocatedBit; + pxBlock->pxNextFreeBlock = NULL; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceMALLOC( pvReturn, xWantedSize ); + } + ( void ) xTaskResumeAll(); + + #if( configUSE_MALLOC_FAILED_HOOK == 1 ) + { + if( pvReturn == NULL ) + { + extern void vApplicationMallocFailedHook( void ); + vApplicationMallocFailedHook(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif + + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void vPortFree( void *pv ) +{ +uint8_t *puc = ( uint8_t * ) pv; +BlockLink_t *pxLink; + + if( pv != NULL ) + { + /* The memory being freed will have an BlockLink_t structure immediately + before it. */ + puc -= xHeapStructSize; + + /* This casting is to keep the compiler from issuing warnings. */ + pxLink = ( void * ) puc; + + /* Check the block is actually allocated. */ + configASSERT( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 ); + configASSERT( pxLink->pxNextFreeBlock == NULL ); + + if( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 ) + { + if( pxLink->pxNextFreeBlock == NULL ) + { + /* The block is being returned to the heap - it is no longer + allocated. */ + pxLink->xBlockSize &= ~xBlockAllocatedBit; + + vTaskSuspendAll(); + { + /* Add this block to the list of free blocks. */ + xFreeBytesRemaining += pxLink->xBlockSize; + traceFREE( pv, pxLink->xBlockSize ); + prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) ); + } + ( void ) xTaskResumeAll(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } +} +/*-----------------------------------------------------------*/ + +size_t xPortGetFreeHeapSize( void ) +{ + return xFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ + +size_t xPortGetMinimumEverFreeHeapSize( void ) +{ + return xMinimumEverFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ + +static void prvInsertBlockIntoFreeList( BlockLink_t *pxBlockToInsert ) +{ +BlockLink_t *pxIterator; +uint8_t *puc; + + /* Iterate through the list until a block is found that has a higher address + than the block being inserted. */ + for( pxIterator = &xStart; pxIterator->pxNextFreeBlock < pxBlockToInsert; pxIterator = pxIterator->pxNextFreeBlock ) + { + /* Nothing to do here, just iterate to the right position. */ + } + + /* Do the block being inserted, and the block it is being inserted after + make a contiguous block of memory? */ + puc = ( uint8_t * ) pxIterator; + if( ( puc + pxIterator->xBlockSize ) == ( uint8_t * ) pxBlockToInsert ) + { + pxIterator->xBlockSize += pxBlockToInsert->xBlockSize; + pxBlockToInsert = pxIterator; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Do the block being inserted, and the block it is being inserted before + make a contiguous block of memory? */ + puc = ( uint8_t * ) pxBlockToInsert; + if( ( puc + pxBlockToInsert->xBlockSize ) == ( uint8_t * ) pxIterator->pxNextFreeBlock ) + { + if( pxIterator->pxNextFreeBlock != pxEnd ) + { + /* Form one big block from the two blocks. */ + pxBlockToInsert->xBlockSize += pxIterator->pxNextFreeBlock->xBlockSize; + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock->pxNextFreeBlock; + } + else + { + pxBlockToInsert->pxNextFreeBlock = pxEnd; + } + } + else + { + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock; + } + + /* If the block being inserted plugged a gab, so was merged with the block + before and the block after, then it's pxNextFreeBlock pointer will have + already been set, and should not be set here as that would make it point + to itself. */ + if( pxIterator != pxBlockToInsert ) + { + pxIterator->pxNextFreeBlock = pxBlockToInsert; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } +} +/*-----------------------------------------------------------*/ + +void vPortDefineHeapRegions( const HeapRegion_t * const pxHeapRegions ) +{ +BlockLink_t *pxFirstFreeBlockInRegion = NULL, *pxPreviousFreeBlock; +size_t xAlignedHeap; +size_t xTotalRegionSize, xTotalHeapSize = 0; +BaseType_t xDefinedRegions = 0; +size_t xAddress; +const HeapRegion_t *pxHeapRegion; + + /* Can only call once! */ + configASSERT( pxEnd == NULL ); + + pxHeapRegion = &( pxHeapRegions[ xDefinedRegions ] ); + + while( pxHeapRegion->xSizeInBytes > 0 ) + { + xTotalRegionSize = pxHeapRegion->xSizeInBytes; + + /* Ensure the heap region starts on a correctly aligned boundary. */ + xAddress = ( size_t ) pxHeapRegion->pucStartAddress; + if( ( xAddress & portBYTE_ALIGNMENT_MASK ) != 0 ) + { + xAddress += ( portBYTE_ALIGNMENT - 1 ); + xAddress &= ~portBYTE_ALIGNMENT_MASK; + + /* Adjust the size for the bytes lost to alignment. */ + xTotalRegionSize -= xAddress - ( size_t ) pxHeapRegion->pucStartAddress; + } + + xAlignedHeap = xAddress; + + /* Set xStart if it has not already been set. */ + if( xDefinedRegions == 0 ) + { + /* xStart is used to hold a pointer to the first item in the list of + free blocks. The void cast is used to prevent compiler warnings. */ + xStart.pxNextFreeBlock = ( BlockLink_t * ) xAlignedHeap; + xStart.xBlockSize = ( size_t ) 0; + } + else + { + /* Should only get here if one region has already been added to the + heap. */ + configASSERT( pxEnd != NULL ); + + /* Check blocks are passed in with increasing start addresses. */ + configASSERT( xAddress > ( size_t ) pxEnd ); + } + + /* Remember the location of the end marker in the previous region, if + any. */ + pxPreviousFreeBlock = pxEnd; + + /* pxEnd is used to mark the end of the list of free blocks and is + inserted at the end of the region space. */ + xAddress = xAlignedHeap + xTotalRegionSize; + xAddress -= xHeapStructSize; + xAddress &= ~portBYTE_ALIGNMENT_MASK; + pxEnd = ( BlockLink_t * ) xAddress; + pxEnd->xBlockSize = 0; + pxEnd->pxNextFreeBlock = NULL; + + /* To start with there is a single free block in this region that is + sized to take up the entire heap region minus the space taken by the + free block structure. */ + pxFirstFreeBlockInRegion = ( BlockLink_t * ) xAlignedHeap; + pxFirstFreeBlockInRegion->xBlockSize = xAddress - ( size_t ) pxFirstFreeBlockInRegion; + pxFirstFreeBlockInRegion->pxNextFreeBlock = pxEnd; + + /* If this is not the first region that makes up the entire heap space + then link the previous region to this region. */ + if( pxPreviousFreeBlock != NULL ) + { + pxPreviousFreeBlock->pxNextFreeBlock = pxFirstFreeBlockInRegion; + } + + xTotalHeapSize += pxFirstFreeBlockInRegion->xBlockSize; + + /* Move onto the next HeapRegion_t structure. */ + xDefinedRegions++; + pxHeapRegion = &( pxHeapRegions[ xDefinedRegions ] ); + } + + xMinimumEverFreeBytesRemaining = xTotalHeapSize; + xFreeBytesRemaining = xTotalHeapSize; + + /* Check something was actually defined before it is accessed. */ + configASSERT( xTotalHeapSize ); + + /* Work out the position of the top bit in a size_t variable. */ + xBlockAllocatedBit = ( ( size_t ) 1 ) << ( ( sizeof( size_t ) * heapBITS_PER_BYTE ) - 1 ); +} + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MikroC/ARM_CM4F/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MikroC/ARM_CM4F/port.c new file mode 100644 index 0000000..97a7c8d --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MikroC/ARM_CM4F/port.c @@ -0,0 +1,791 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the ARM CM4F port. + *----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + + +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#else + /* The way the SysTick is clocked is not modified in case it is not the same + as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 0 ) +#endif + +/* Constants required to manipulate the core. Registers first... */ +#define portNVIC_SYSTICK_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( * ( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( * ( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SYSPRI2_REG ( * ( ( volatile uint32_t * ) 0xe000ed20 ) ) +/* ...then bits in the registers. */ +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) + +#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( * ( ( volatile uint32_t * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */ +#define portVECTACTIVE_MASK ( 0xFFUL ) + +/* Constants required to manipulate the VFP. */ +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating point context control register. */ +#define portASPEN_AND_LSPEN_BITS ( 0x3UL << 30UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) +#define portINITIAL_EXEC_RETURN ( 0xfffffffd ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have +occurred while the SysTick counter is stopped during tickless idle +calculations. */ +#define portMISSED_COUNTS_FACTOR ( 45UL ) + +/* Let the user override the pre-loading of the initial LR with the address of +prvTaskExitError() in case it messes up unwinding of the stack in the +debugger. */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/* Cannot find a weak linkage attribute, so the +configOVERRIDE_DEFAULT_TICK_CONFIGURATION constant must be set to 1 if the +application writer wants to provide their own implementation of +vPortSetupTimerInterrupt(). Ensure configOVERRIDE_DEFAULT_TICK_CONFIGURATION +is defined. */ +#ifndef configOVERRIDE_DEFAULT_TICK_CONFIGURATION + #define configOVERRIDE_DEFAULT_TICK_CONFIGURATION 0 +#endif + +/* Manual definition of missing asm names. */ +#define psp 9 +#define basepri 17 +#define msp 8 +#define ipsr 5 + +/* From port.c. */ +extern void *pxCurrentTCB; + +/* Each task maintains its own interrupt status in the critical nesting +variable. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortPendSVHandler( void ); +void xPortSysTickHandler( void ); +void vPortSVCHandler( void ); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +static void prvPortStartFirstTask( void ); + +/* + * Function to enable the VFP. + */ + static void vPortEnableVFP( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* + * The number of SysTick increments that make up one tick period. + */ +#if configUSE_TICKLESS_IDLE == 1 + static uint32_t ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * The maximum number of tick periods that can be suppressed is limited by the + * 24 bit resolution of the SysTick timer. + */ +#if configUSE_TICKLESS_IDLE == 1 + static uint32_t xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Compensate for the CPU cycles that pass while the SysTick is stopped (low + * power functionality only. + */ +#if configUSE_TICKLESS_IDLE == 1 + static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static uint8_t ucMaxSysCallPriority = 0; + static uint32_t ulMaxPRIGROUPValue = 0; +#endif /* configASSERT_DEFINED */ + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + interrupt. */ + + /* Offset added to account for the way the MCU uses the stack on entry/exit + of interrupts, and to ensure alignment. */ + pxTopOfStack--; + + /* Sometimes the parameters are loaded from the stack. */ + *pxTopOfStack = ( StackType_t ) pvParameters; + pxTopOfStack--; + + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + + /* Save code space by skipping register initialisation. */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + + /* A save method is being used that requires each task to maintain its + own exec return value. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXEC_RETURN; + + pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + for( ;; ); +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler( void ) iv IVT_INT_SVCall ics ICS_OFF +{ + __asm { + ldr r3, =_pxCurrentTCB /* Restore the context. */ + ldr r1, [r3] /* Use pxCurrentTCBConst to get the pxCurrentTCB address. */ + ldr r0, [r1] /* The first item in pxCurrentTCB is the task top of stack. */ + ldm r0!, (r4-r11, r14)/* Pop the registers that are not automatically saved on exception entry and the critical nesting count. */ + msr psp, r0 /* Restore the task stack pointer. */ + isb + mov r0, #0 + msr basepri, r0 + bx r14 + }; +} +/*-----------------------------------------------------------*/ + +static void prvPortStartFirstTask( void ) +{ + __asm { + ldr r0, =0xE000ED08 /* Use the NVIC offset register to locate the stack. */ + ldr r0, [r0] + ldr r0, [r0] + msr msp, r0 /* Set the msp back to the start of the stack. */ + cpsie i /* Globally enable interrupts. */ + cpsie f + dsb + isb + svc #0 /* System call to start first task. */ + nop + }; +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. + See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + + #if( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + functions can be called. ISR safe functions are those that end in + "FromISR". FreeRTOS maintains separate thread and ISR API functions to + ensure interrupt entry is as fast and simple as possible. + + Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* The kernel interrupt priority should be set to the lowest + priority. */ + configASSERT( ucMaxPriorityValue == ( configKERNEL_INTERRUPT_PRIORITY & ucMaxPriorityValue ) ); + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( uint8_t ) 0x01; + } + + /* Shift the priority group value back to its position within the AIRCR + register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* conifgASSERT_DEFINED */ + + /* Make PendSV and SysTick the lowest priority interrupts. */ + portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI; + portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Ensure the VFP is enabled - it should be anyway. */ + vPortEnableVFP(); + + /* Lazy save always. */ + *( portFPCCR ) |= portASPEN_AND_LSPEN_BITS; + + /* Start the first task. */ + prvPortStartFirstTask(); + + /* Should never get here as the tasks will now be executing! Call the task + exit error function to prevent compiler warnings about a static function + not being called in the case that the application writer overrides this + functionality by defining configTASK_RETURN_ADDRESS. */ + prvTaskExitError(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + assert() if it is being called from an interrupt context. Only API + functions that end in "FromISR" can be used in an interrupt. Only assert if + the critical nesting count is 1 to protect against recursive calls if the + assert function also uses a critical section. */ + if( uxCriticalNesting == 1 ) + { + configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +const uint8_t ucMaxSyscallInterruptPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY; +void xPortPendSVHandler( void ) iv IVT_INT_PendSV ics ICS_OFF +{ + __asm { +#ifdef HW_DEBUG + /* The function is not truly naked, so add back the 4 bytes subtracted + from the stack pointer by the function prologue. */ + add sp, sp, #4 +#endif + mrs r0, psp + isb + + ldr r3, =_pxCurrentTCB /* Get the location of the current TCB. */ + ldr r2, [r3] + + tst r14, #0x10 /* Is the task using the FPU context? If so, push high vfp registers. */ + it eq + vstmdbeq r0!, (s16-s31) + + stmdb r0!, (r4-r11, r14) /* Save the core registers. */ + + str r0, [r2] /* Save the new top of stack into the first member of the TCB. */ +/*_RB_? mrs r0, psp why was this here? */ + + stmdb sp!, (r3) + ldr r0, =_ucMaxSyscallInterruptPriority + ldr r1, [r0] + msr basepri, r1 + dsb + isb + bl _vTaskSwitchContext + mov r0, #0 + msr basepri, r0 + ldm sp!, (r3) + + ldr r1, [r3] /* The first item in pxCurrentTCB is the task top of stack. */ + ldr r0, [r1] + + ldm r0!, (r4-r11, r14) /* Pop the core registers. */ + + tst r14, #0x10 /* Is the task using the FPU context? If so, pop the high vfp registers too. */ + it eq + vldmiaeq r0!, (s16-s31) + + msr psp, r0 + isb + bx r14 + } +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) iv IVT_INT_SysTick ics ICS_AUTO +{ + /* The SysTick runs at the lowest interrupt priority, so when this interrupt + executes all interrupts must be unmasked. There is therefore no need to + save and then restore the interrupt mask value as its value is already + known - therefore the slightly faster portDISABLE_INTERRUPTS() function is + used in place of portSET_INTERRUPT_MASK_FROM_ISR(). */ + portDISABLE_INTERRUPTS(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* A context switch is required. Context switching is performed in + the PendSV interrupt. Pend the PendSV interrupt. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portENABLE_INTERRUPTS(); +} +/*-----------------------------------------------------------*/ + +#if( ( configUSE_TICKLESS_IDLE == 1 ) && ( configOVERRIDE_DEFAULT_TICK_CONFIGURATION == 0 ) ) + + void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickCTRL; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Stop the SysTick momentarily. The time the SysTick is stopped for + is accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG &= ~portNVIC_SYSTICK_ENABLE_BIT; + + /* Calculate the reload value required to wait xExpectedIdleTime + tick periods. -1 is used because this code will execute part way + through one of the tick periods. */ + ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + method as that will mask interrupts that should exit sleep mode. */ + __asm { "cpsid i" }; + __asm { "dsb" }; + __asm { "isb" }; + + /* If a context switch is pending or a task is waiting for the scheduler + to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Restart from whatever is left in the count register to complete + this tick period. */ + portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Reset the reload register to the value required for normal tick + periods. */ + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + + /* Re-enable interrupts - see comments above the cpsid instruction() + above. */ + __asm { "cpsie i" }; + } + else + { + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + set its parameter to 0 to indicate that its implementation contains + its own wait for interrupt or wait for event instruction, and so wfi + should not be executed again. However, the original expected idle + time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + if( xModifiableIdleTime > 0 ) + { + __asm { "dsb" }; + __asm { "wfi" }; + __asm { "isb" }; + } + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Stop SysTick. Again, the time the SysTick is stopped for is + accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + ulSysTickCTRL = portNVIC_SYSTICK_CTRL_REG; + portNVIC_SYSTICK_CTRL_REG = ( ulSysTickCTRL & ~portNVIC_SYSTICK_ENABLE_BIT ); + + /* Re-enable interrupts - see comments above the cpsid instruction() + above. */ + __asm { "cpsie i" }; + __asm { "wfi" }; + __asm { "isb" }; + + if( ( ulSysTickCTRL & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt has already executed, and the SysTick + count reloaded with ulReloadValue. Reset the + portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick + period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + underflowed because the post sleep hook did something + that took too long. */ + if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* The tick interrupt handler will already have pended the tick + processing in the kernel. As the pending tick will be + processed as soon as this function exits, the tick value + maintained by the tick is stepped forward by one less than the + time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. + Work out how long the sleep lasted rounded to complete tick + periods (not the ulReload value which accounted for part + ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* How many complete tick periods passed while the processor + was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1 ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG + again, then set portNVIC_SYSTICK_LOAD_REG back to its standard + value. The critical section is used to ensure the tick interrupt + can only execute once in the case that the reload register is near + zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portENTER_CRITICAL(); + { + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + vTaskStepTick( ulCompleteTickPeriods ); + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + portEXIT_CRITICAL(); + } + } + +#endif /* #if configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +#if( configOVERRIDE_DEFAULT_TICK_CONFIGURATION == 0 ) + + void vPortSetupTimerInterrupt( void ) + { + /* Calculate the constants required to configure the tick interrupt. */ + #if configUSE_TICKLESS_IDLE == 1 + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); + } + +#endif /* configOVERRIDE_DEFAULT_TICK_CONFIGURATION */ +/*-----------------------------------------------------------*/ + +/* This is a naked function. */ +static void vPortEnableVFP( void ) +{ + __asm { + ldr r0, =0xE000ED88 /* The FPU enable bits are in the CPACR. */ + ldr r1, [r0] + + orr r1, r1, #0xF00000 /* Enable CP10 and CP11 coprocessors, then save back. */ + str r1, [r0] + bx r14 + }; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortIsInsideInterrupt( void ) +{ +BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. */ + if( CPU_REG_GET( CPU_IPSR ) == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + +#if( configASSERT_DEFINED == 1 ) + + /* Limitations in the MikroC inline asm means ulCurrentInterrupt has to be + global - which makes vPortValidateInterruptPriority() non re-entrant. + However that should not matter as an interrupt can only itself be + interrupted by a higher priority interrupt. That means if + ulCurrentInterrupt, so ulCurrentInterrupt getting corrupted cannot lead to + an invalid interrupt priority being missed. */ + uint32_t ulCurrentInterrupt; + uint8_t ucCurrentPriority; + void vPortValidateInterruptPriority( void ) + { + /* Obtain the number of the currently executing interrupt. */ + __asm { push (r0, r1) + mrs r0, ipsr + ldr r1, =_ulCurrentInterrupt + str r0, [r1] + pop (r0, r1) + }; + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = *( ( uint8_t * ) ( portNVIC_IP_REGISTERS_OFFSET_16 + ulCurrentInterrupt ) ); + + /* The following assertion will fail if a service routine (ISR) for + an interrupt that has been assigned a priority above + configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + function. ISR safe FreeRTOS API functions must *only* be called + from interrupts that have been assigned a priority at or below + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Numerically low interrupt priority numbers represent logically high + interrupt priorities, therefore the priority of the interrupt must + be set to a value equal to or numerically *higher* than + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Interrupts that use the FreeRTOS API must not be left at their + default priority of zero as that is the highest possible priority, + which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + and therefore also guaranteed to be invalid. + + FreeRTOS maintains separate thread and ISR API functions to ensure + interrupt entry is as fast and simple as possible. + + The following links provide detailed information: + http://www.freertos.org/RTOS-Cortex-M3-M4.html + http://www.freertos.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + that define each interrupt's priority to be split between bits that + define the interrupt's pre-emption priority bits and bits that define + the interrupt's sub-priority. For simplicity all bits must be defined + to be pre-emption priority bits. The following assertion will fail if + this is not the case (if some bits represent a sub-priority). + + If the application only uses CMSIS libraries for interrupt + configuration then the correct setting can be achieved on all Cortex-M + devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + scheduler. Note however that some vendor specific peripheral libraries + assume a non-zero priority group setting, in which cases using a value + of zero will result in unpredicable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MikroC/ARM_CM4F/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MikroC/ARM_CM4F/portmacro.h new file mode 100644 index 0000000..58d6563 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/MikroC/ARM_CM4F/portmacro.h @@ -0,0 +1,230 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* The compiler needs to be told functions that are only referenced by pointer +are to be included in the build. NOTE: Omitting these lines will result in a +run-time crash, not a linker error! */ +#pragma funcall vTaskStartScheduler prvIdleTask +#pragma funcall xTimerCreateTimerTask prvTimerTask + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +/*-----------------------------------------------------------*/ + +/* Scheduler utilities. */ +#define portYIELD() \ +{ \ + /* Set a PendSV to request a context switch. */ \ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ + \ + /* Barriers are normally not required but do ensure the code is completely \ + within the specified behaviour for the architecture. */ \ + __asm{ dsb }; \ + __asm{ isb }; \ +} + +#define portNVIC_INT_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed04 ) ) +#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) +#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired != pdFALSE ) portYIELD() +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); +#define portDISABLE_INTERRUPTS() CPU_REG_SET( CPU_BASEPRI, configMAX_SYSCALL_INTERRUPT_PRIORITY ); __asm{ dsb }; __asm{ isb } +#define portENABLE_INTERRUPTS() CPU_REG_SET( CPU_BASEPRI, 0 ); +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() +#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortRaiseBASEPRI() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) CPU_REG_SET( CPU_BASEPRI, x ); /* Barrier instructions not used as this is only used to lower the basepri. */ + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are +not necessary for to use this port. They are defined so the common demo files +(which build with all the ports) will build. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ +#ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specific optimisations. */ +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Generic helper function. */ + __attribute__( ( always_inline ) ) static inline uint8_t ucPortCountLeadingZeros( uint32_t ulBitmap ) + { + uint8_t ucReturn; + + __asm volatile ( "clz %0, %1" : "=r" ( ucReturn ) : "r" ( ulBitmap ) ); + return ucReturn; + } + + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) ucPortCountLeadingZeros( ( uxReadyPriorities ) ) ) + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +/*-----------------------------------------------------------*/ + +#ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() +#endif + +/* portNOP() is not required by this port. */ +#define portNOP() + +BaseType_t xPortIsInsideInterrupt( void ); + +/*-----------------------------------------------------------*/ + +static inline uint32_t ulPortRaiseBASEPRI( void ) +{ +uint32_t ulOriginalBASEPRI; + + ulOriginalBASEPRI = CPU_REG_GET( CPU_BASEPRI ); + CPU_REG_SET( CPU_BASEPRI, configMAX_SYSCALL_INTERRUPT_PRIORITY ); + __asm{ dsb }; + __asm{ isb }; + return ulOriginalBASEPRI; +} +/*-----------------------------------------------------------*/ + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Paradigm/Tern_EE/large_untested/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Paradigm/Tern_EE/large_untested/port.c new file mode 100644 index 0000000..9764554 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Paradigm/Tern_EE/large_untested/port.c @@ -0,0 +1,281 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the Tern EE 186 + * port. + *----------------------------------------------------------*/ + +/* Library includes. */ +#include +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "portasm.h" + +/* The timer increments every four clocks, hence the divide by 4. */ +#define portTIMER_COMPARE ( uint16_t ) ( ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) / ( uint32_t ) 4 ) + +/* From the RDC data sheet. */ +#define portENABLE_TIMER_AND_INTERRUPT ( uint16_t ) 0xe001 + +/* Interrupt control. */ +#define portEIO_REGISTER 0xff22 +#define portCLEAR_INTERRUPT 0x0008 + +/* Setup the hardware to generate the required tick frequency. */ +static void prvSetupTimerInterrupt( void ); + +/* The ISR used depends on whether the preemptive or cooperative scheduler +is being used. */ +#if( configUSE_PREEMPTION == 1 ) + /* Tick service routine used by the scheduler when preemptive scheduling is + being used. */ + static void __interrupt __far prvPreemptiveTick( void ); +#else + /* Tick service routine used by the scheduler when cooperative scheduling is + being used. */ + static void __interrupt __far prvNonPreemptiveTick( void ); +#endif + +/* Trap routine used by taskYIELD() to manually cause a context switch. */ +static void __interrupt __far prvYieldProcessor( void ); + +/* The timer initialisation functions leave interrupts enabled, +which is not what we want. This ISR is installed temporarily in case +the timer fires before we get a change to disable interrupts again. */ +static void __interrupt __far prvDummyISR( void ); + +/*-----------------------------------------------------------*/ +/* See header file for description. */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +StackType_t DS_Reg = 0; + + /* Place a few bytes of known values on the bottom of the stack. + This is just useful for debugging. */ + + *pxTopOfStack = 0x1111; + pxTopOfStack--; + *pxTopOfStack = 0x2222; + pxTopOfStack--; + *pxTopOfStack = 0x3333; + pxTopOfStack--; + + /* We are going to start the scheduler using a return from interrupt + instruction to load the program counter, so first there would be the + function call with parameters preamble. */ + + *pxTopOfStack = FP_SEG( pvParameters ); + pxTopOfStack--; + *pxTopOfStack = FP_OFF( pvParameters ); + pxTopOfStack--; + *pxTopOfStack = FP_SEG( pxCode ); + pxTopOfStack--; + *pxTopOfStack = FP_OFF( pxCode ); + pxTopOfStack--; + + /* Next the status register and interrupt return address. */ + *pxTopOfStack = portINITIAL_SW; + pxTopOfStack--; + *pxTopOfStack = FP_SEG( pxCode ); + pxTopOfStack--; + *pxTopOfStack = FP_OFF( pxCode ); + pxTopOfStack--; + + /* The remaining registers would be pushed on the stack by our context + switch function. These are loaded with values simply to make debugging + easier. */ + *pxTopOfStack = ( StackType_t ) 0xAAAA; /* AX */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xBBBB; /* BX */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xCCCC; /* CX */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xDDDD; /* DX */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xEEEE; /* ES */ + pxTopOfStack--; + + /* We need the true data segment. */ + __asm{ MOV DS_Reg, DS }; + + *pxTopOfStack = DS_Reg; /* DS */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x0123; /* SI */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xDDDD; /* DI */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xBBBB; /* BP */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* This is called with interrupts already disabled. */ + + /* Put our manual switch (yield) function on a known + vector. */ + setvect( portSWITCH_INT_NUMBER, prvYieldProcessor ); + + /* Setup the tick interrupt. */ + prvSetupTimerInterrupt(); + + /* Kick off the scheduler by setting up the context of the first task. */ + portFIRST_CONTEXT(); + + /* Should not get here! */ + return pdFALSE; +} +/*-----------------------------------------------------------*/ + +static void __interrupt __far prvDummyISR( void ) +{ + /* The timer initialisation functions leave interrupts enabled, + which is not what we want. This ISR is installed temporarily in case + the timer fires before we get a change to disable interrupts again. */ + outport( portEIO_REGISTER, portCLEAR_INTERRUPT ); +} +/*-----------------------------------------------------------*/ + +/* The ISR used depends on whether the preemptive or cooperative scheduler +is being used. */ +#if( configUSE_PREEMPTION == 1 ) + static void __interrupt __far prvPreemptiveTick( void ) + { + /* Get the scheduler to update the task states following the tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Switch in the context of the next task to be run. */ + portSWITCH_CONTEXT(); + } + + /* Reset interrupt. */ + outport( portEIO_REGISTER, portCLEAR_INTERRUPT ); + } +#else + static void __interrupt __far prvNonPreemptiveTick( void ) + { + /* Same as preemptive tick, but the cooperative scheduler is being used + so we don't have to switch in the context of the next task. */ + xTaskIncrementTick(); + + /* Reset interrupt. */ + outport( portEIO_REGISTER, portCLEAR_INTERRUPT ); + } +#endif +/*-----------------------------------------------------------*/ + +static void __interrupt __far prvYieldProcessor( void ) +{ + /* Switch in the context of the next task to be run. */ + portSWITCH_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented. */ +} +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt( void ) +{ +const uint16_t usTimerACompare = portTIMER_COMPARE, usTimerAMode = portENABLE_TIMER_AND_INTERRUPT; +const uint16_t usT2_IRQ = 0x13; + + /* Configure the timer, the dummy handler is used here as the init + function leaves interrupts enabled. */ + t2_init( usTimerAMode, usTimerACompare, prvDummyISR ); + + /* Disable interrupts again before installing the real handlers. */ + portDISABLE_INTERRUPTS(); + + #if( configUSE_PREEMPTION == 1 ) + /* Tick service routine used by the scheduler when preemptive scheduling is + being used. */ + setvect( usT2_IRQ, prvPreemptiveTick ); + #else + /* Tick service routine used by the scheduler when cooperative scheduling is + being used. */ + setvect( usT2_IRQ, prvNonPreemptiveTick ); + #endif +} + + + + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Paradigm/Tern_EE/large_untested/portasm.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Paradigm/Tern_EE/large_untested/portasm.h new file mode 100644 index 0000000..aeefdf1 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Paradigm/Tern_EE/large_untested/portasm.h @@ -0,0 +1,118 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +typedef void TCB_t; +extern volatile TCB_t * volatile pxCurrentTCB; +extern void vTaskSwitchContext( void ); + +/* + * Saves the stack pointer for one task into its TCB, calls + * vTaskSwitchContext() to update the TCB being used, then restores the stack + * from the new TCB read to run the task. + */ +void portSWITCH_CONTEXT( void ); + +/* + * Load the stack pointer from the TCB of the task which is going to be first + * to execute. Then force an IRET so the registers and IP are popped off the + * stack. + */ +void portFIRST_CONTEXT( void ); + +#define portSWITCH_CONTEXT() \ + asm { mov ax, seg pxCurrentTCB } \ + asm { mov ds, ax } \ + asm { les bx, pxCurrentTCB } /* Save the stack pointer into the TCB. */ \ + asm { mov es:0x2[ bx ], ss } \ + asm { mov es:[ bx ], sp } \ + asm { call far ptr vTaskSwitchContext } /* Perform the switch. */ \ + asm { mov ax, seg pxCurrentTCB } /* Restore the stack pointer from the TCB. */ \ + asm { mov ds, ax } \ + asm { les bx, dword ptr pxCurrentTCB } \ + asm { mov ss, es:[ bx + 2 ] } \ + asm { mov sp, es:[ bx ] } + +#define portFIRST_CONTEXT() \ + asm { mov ax, seg pxCurrentTCB } \ + asm { mov ds, ax } \ + asm { les bx, dword ptr pxCurrentTCB } \ + asm { mov ss, es:[ bx + 2 ] } \ + asm { mov sp, es:[ bx ] } \ + asm { pop bp } \ + asm { pop di } \ + asm { pop si } \ + asm { pop ds } \ + asm { pop es } \ + asm { pop dx } \ + asm { pop cx } \ + asm { pop bx } \ + asm { pop ax } \ + asm { iret } + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Paradigm/Tern_EE/large_untested/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Paradigm/Tern_EE/large_untested/portmacro.h new file mode 100644 index 0000000..bbeeacc --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Paradigm/Tern_EE/large_untested/portmacro.h @@ -0,0 +1,148 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE long +#define portLONG long +#define portSHORT int +#define portSTACK_TYPE uint16_t +#define portBASE_TYPE short + +typedef portSTACK_TYPE StackType_t; +typedef short BaseType_t; +typedef unsigned short UBaseType_t; + + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Critical section handling. */ +#define portENTER_CRITICAL() __asm{ pushf } \ + __asm{ cli } \ + +#define portEXIT_CRITICAL() __asm{ popf } + +#define portDISABLE_INTERRUPTS() __asm{ cli } + +#define portENABLE_INTERRUPTS() __asm{ sti } +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portNOP() __asm{ nop } +#define portSTACK_GROWTH ( -1 ) +#define portSWITCH_INT_NUMBER 0x80 +#define portYIELD() __asm{ int portSWITCH_INT_NUMBER } +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 2 +#define portINITIAL_SW ( ( portSTACK_TYPE ) 0x0202 ) /* Start the tasks with interrupts enabled. */ +/*-----------------------------------------------------------*/ + +/* Compiler specifics. */ +#define portINPUT_BYTE( xAddr ) inp( xAddr ) +#define portOUTPUT_BYTE( xAddr, ucValue ) outp( xAddr, ucValue ) +#define portINPUT_WORD( xAddr ) inpw( xAddr ) +#define portOUTPUT_WORD( xAddr, usValue ) outpw( xAddr, usValue ) +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vTaskFunction, vParameters ) void vTaskFunction( void *pvParameters ) +#define portTASK_FUNCTION( vTaskFunction, vParameters ) void vTaskFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Paradigm/Tern_EE/small/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Paradigm/Tern_EE/small/port.c new file mode 100644 index 0000000..b4d5330 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Paradigm/Tern_EE/small/port.c @@ -0,0 +1,261 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the Tern EE 186 + * port. + *----------------------------------------------------------*/ + +/* Library includes. */ +#include +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "portasm.h" + +/* The timer increments every four clocks, hence the divide by 4. */ +#define portPRESCALE_VALUE ( 16 ) +#define portTIMER_COMPARE ( configCPU_CLOCK_HZ / ( configTICK_RATE_HZ * 4UL ) ) + +/* From the RDC data sheet. */ +#define portENABLE_TIMER_AND_INTERRUPT ( uint16_t ) 0xe00b +#define portENABLE_TIMER ( uint16_t ) 0xC001 + +/* Interrupt control. */ +#define portEIO_REGISTER 0xff22 +#define portCLEAR_INTERRUPT 0x0008 + +/* Setup the hardware to generate the required tick frequency. */ +static void prvSetupTimerInterrupt( void ); + +/* The ISR used depends on whether the preemptive or cooperative scheduler +is being used. */ +#if( configUSE_PREEMPTION == 1 ) + /* Tick service routine used by the scheduler when preemptive scheduling is + being used. */ + static void __interrupt __far prvPreemptiveTick( void ); +#else + /* Tick service routine used by the scheduler when cooperative scheduling is + being used. */ + static void __interrupt __far prvNonPreemptiveTick( void ); +#endif + +/* Trap routine used by taskYIELD() to manually cause a context switch. */ +static void __interrupt __far prvYieldProcessor( void ); + +/*-----------------------------------------------------------*/ +/* See header file for description. */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +StackType_t DS_Reg = 0; + + /* We need the true data segment. */ + __asm{ MOV DS_Reg, DS }; + + /* Place a few bytes of known values on the bottom of the stack. + This is just useful for debugging. */ + + *pxTopOfStack = 0x1111; + pxTopOfStack--; + *pxTopOfStack = 0x2222; + pxTopOfStack--; + *pxTopOfStack = 0x3333; + pxTopOfStack--; + + /* We are going to start the scheduler using a return from interrupt + instruction to load the program counter, so first there would be the + function call with parameters preamble. */ + + *pxTopOfStack = FP_OFF( pvParameters ); + pxTopOfStack--; + *pxTopOfStack = FP_OFF( pxCode ); + pxTopOfStack--; + + /* Next the status register and interrupt return address. */ + *pxTopOfStack = portINITIAL_SW; + pxTopOfStack--; + *pxTopOfStack = FP_SEG( pxCode ); + pxTopOfStack--; + *pxTopOfStack = FP_OFF( pxCode ); + pxTopOfStack--; + + /* The remaining registers would be pushed on the stack by our context + switch function. These are loaded with values simply to make debugging + easier. */ + *pxTopOfStack = ( StackType_t ) 0xAAAA; /* AX */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xBBBB; /* BX */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xCCCC; /* CX */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xDDDD; /* DX */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xEEEE; /* ES */ + pxTopOfStack--; + + *pxTopOfStack = DS_Reg; /* DS */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x0123; /* SI */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xDDDD; /* DI */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xBBBB; /* BP */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* This is called with interrupts already disabled. */ + + /* Put our manual switch (yield) function on a known + vector. */ + setvect( portSWITCH_INT_NUMBER, prvYieldProcessor ); + + /* Setup the tick interrupt. */ + prvSetupTimerInterrupt(); + + /* Kick off the scheduler by setting up the context of the first task. */ + portFIRST_CONTEXT(); + + /* Should not get here! */ + return pdFALSE; +} +/*-----------------------------------------------------------*/ + +/* The ISR used depends on whether the preemptive or cooperative scheduler +is being used. */ +#if( configUSE_PREEMPTION == 1 ) + static void __interrupt __far prvPreemptiveTick( void ) + { + /* Get the scheduler to update the task states following the tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Switch in the context of the next task to be run. */ + portEND_SWITCHING_ISR(); + } + + /* Reset interrupt. */ + outport( portEIO_REGISTER, portCLEAR_INTERRUPT ); + } +#else + static void __interrupt __far prvNonPreemptiveTick( void ) + { + /* Same as preemptive tick, but the cooperative scheduler is being used + so we don't have to switch in the context of the next task. */ + xTaskIncrementTick(); + + /* Reset interrupt. */ + outport( portEIO_REGISTER, portCLEAR_INTERRUPT ); + } +#endif +/*-----------------------------------------------------------*/ + +static void __interrupt __far prvYieldProcessor( void ) +{ + /* Switch in the context of the next task to be run. */ + portEND_SWITCHING_ISR(); +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented. */ +} +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt( void ) +{ +const uint32_t ulCompareValue = portTIMER_COMPARE; +uint16_t usTimerCompare; + + usTimerCompare = ( uint16_t ) ( ulCompareValue >> 4 ); + t2_init( portENABLE_TIMER, portPRESCALE_VALUE, NULL ); + + #if( configUSE_PREEMPTION == 1 ) + /* Tick service routine used by the scheduler when preemptive scheduling is + being used. */ + t1_init( portENABLE_TIMER_AND_INTERRUPT, usTimerCompare, usTimerCompare, prvPreemptiveTick ); + #else + /* Tick service routine used by the scheduler when cooperative scheduling is + being used. */ + t1_init( portENABLE_TIMER_AND_INTERRUPT, usTimerCompare, usTimerCompare, prvNonPreemptiveTick ); + #endif +} + + + + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Paradigm/Tern_EE/small/portasm.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Paradigm/Tern_EE/small/portasm.h new file mode 100644 index 0000000..aab227f --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Paradigm/Tern_EE/small/portasm.h @@ -0,0 +1,114 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORT_ASM_H +#define PORT_ASM_H + +typedef void TCB_t; +extern volatile TCB_t * volatile pxCurrentTCB; +extern void vTaskSwitchContext( void ); + +/* + * Saves the stack pointer for one task into its TCB, calls + * vTaskSwitchContext() to update the TCB being used, then restores the stack + * from the new TCB read to run the task. + */ +void portEND_SWITCHING_ISR( void ); + +/* + * Load the stack pointer from the TCB of the task which is going to be first + * to execute. Then force an IRET so the registers and IP are popped off the + * stack. + */ +void portFIRST_CONTEXT( void ); + +#define portEND_SWITCHING_ISR() \ + asm { mov bx, [pxCurrentTCB] } \ + asm { mov word ptr [bx], sp } \ + asm { call far ptr vTaskSwitchContext } \ + asm { mov bx, [pxCurrentTCB] } \ + asm { mov sp, [bx] } + +#define portFIRST_CONTEXT() \ + asm { mov bx, [pxCurrentTCB] } \ + asm { mov sp, [bx] } \ + asm { pop bp } \ + asm { pop di } \ + asm { pop si } \ + asm { pop ds } \ + asm { pop es } \ + asm { pop dx } \ + asm { pop cx } \ + asm { pop bx } \ + asm { pop ax } \ + asm { iret } + + +#endif + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Paradigm/Tern_EE/small/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Paradigm/Tern_EE/small/portmacro.h new file mode 100644 index 0000000..1d82672 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Paradigm/Tern_EE/small/portmacro.h @@ -0,0 +1,149 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE long +#define portLONG long +#define portSHORT int +#define portSTACK_TYPE uint16_t +#define portBASE_TYPE short + +typedef portSTACK_TYPE StackType_t; +typedef short BaseType_t; +typedef unsigned short UBaseType_t; + + +typedef void ( __interrupt __far *pxISR )(); + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Critical section handling. */ +#define portENTER_CRITICAL() __asm{ pushf } \ + __asm{ cli } \ + +#define portEXIT_CRITICAL() __asm{ popf } + +#define portDISABLE_INTERRUPTS() __asm{ cli } + +#define portENABLE_INTERRUPTS() __asm{ sti } +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portNOP() __asm{ nop } +#define portSTACK_GROWTH ( -1 ) +#define portSWITCH_INT_NUMBER 0x80 +#define portYIELD() __asm{ int portSWITCH_INT_NUMBER } +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 2 +#define portINITIAL_SW ( ( portSTACK_TYPE ) 0x0202 ) /* Start the tasks with interrupts enabled. */ +/*-----------------------------------------------------------*/ + +/* Compiler specifics. */ +#define portINPUT_BYTE( xAddr ) inp( xAddr ) +#define portOUTPUT_BYTE( xAddr, ucValue ) outp( xAddr, ucValue ) +#define portINPUT_WORD( xAddr ) inpw( xAddr ) +#define portOUTPUT_WORD( xAddr, usValue ) outpw( xAddr, usValue ) +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vTaskFunction, vParameters ) void vTaskFunction( void *pvParameters ) +#define portTASK_FUNCTION( vTaskFunction, vParameters ) void vTaskFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM7_LPC21xx/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM7_LPC21xx/port.c new file mode 100644 index 0000000..e8d05e4 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM7_LPC21xx/port.c @@ -0,0 +1,333 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Constants required to setup the initial task context. */ +#define portINITIAL_SPSR ( ( StackType_t ) 0x1f ) /* System mode, ARM mode, interrupts enabled. */ +#define portTHUMB_MODE_BIT ( ( StackType_t ) 0x20 ) +#define portINSTRUCTION_SIZE ( ( StackType_t ) 4 ) +#define portNO_CRITICAL_SECTION_NESTING ( ( StackType_t ) 0 ) + +/* Constants required to setup the tick ISR. */ +#define portENABLE_TIMER ( ( uint8_t ) 0x01 ) +#define portPRESCALE_VALUE 0x00 +#define portINTERRUPT_ON_MATCH ( ( uint32_t ) 0x01 ) +#define portRESET_COUNT_ON_MATCH ( ( uint32_t ) 0x02 ) + +/* Constants required to setup the VIC for the tick ISR. */ +#define portTIMER_VIC_CHANNEL ( ( uint32_t ) 0x0004 ) +#define portTIMER_VIC_CHANNEL_BIT ( ( uint32_t ) 0x0010 ) +#define portTIMER_VIC_ENABLE ( ( uint32_t ) 0x0020 ) + +/* Constants required to handle interrupts. */ +#define portTIMER_MATCH_ISR_BIT ( ( uint8_t ) 0x01 ) +#define portCLEAR_VIC_INTERRUPT ( ( uint32_t ) 0 ) + +/*-----------------------------------------------------------*/ + +/* The code generated by the Keil compiler does not maintain separate +stack and frame pointers. The portENTER_CRITICAL macro cannot therefore +use the stack as per other ports. Instead a variable is used to keep +track of the critical section nesting. This variable has to be stored +as part of the task context and must be initialised to a non zero value. */ + +#define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) +volatile uint32_t ulCriticalNesting = 9999UL; + +/*-----------------------------------------------------------*/ + +/* Setup the timer to generate the tick interrupts. */ +static void prvSetupTimerInterrupt( void ); + +/* + * The scheduler can only be started from ARM mode, so + * vPortStartFirstSTask() is defined in portISR.c. + */ +extern __asm void vPortStartFirstTask( void ); + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +StackType_t *pxOriginalTOS; + + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. + + Remember where the top of the (simulated) stack is before we place + anything on it. */ + pxOriginalTOS = pxTopOfStack; + + /* To ensure asserts in tasks.c don't fail, although in this case the assert + is not really required. */ + pxTopOfStack--; + + /* First on the stack is the return address - which in this case is the + start of the task. The offset is added to make the return address appear + as it would within an IRQ ISR. */ + *pxTopOfStack = ( StackType_t ) pxCode + portINSTRUCTION_SIZE; + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) 0xaaaaaaaa; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxOriginalTOS; /* Stack used when task starts goes in R13. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + + /* The last thing onto the stack is the status register, which is set for + system mode, with interrupts enabled. */ + *pxTopOfStack = ( StackType_t ) portINITIAL_SPSR; + + if( ( ( uint32_t ) pxCode & 0x01UL ) != 0x00UL ) + { + /* We want the task to start in thumb mode. */ + *pxTopOfStack |= portTHUMB_MODE_BIT; + } + + pxTopOfStack--; + + /* The code generated by the Keil compiler does not maintain separate + stack and frame pointers. The portENTER_CRITICAL macro cannot therefore + use the stack as per other ports. Instead a variable is used to keep + track of the critical section nesting. This variable has to be stored + as part of the task context and is initially set to zero. */ + *pxTopOfStack = portNO_CRITICAL_SECTION_NESTING; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* Start the timer that generates the tick ISR. */ + prvSetupTimerInterrupt(); + + /* Start the first task. This is done from portISR.c as ARM mode must be + used. */ + vPortStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the ARM port will require this function as there + is nothing to return to. If this is required - stop the tick ISR then + return back to main. */ +} +/*-----------------------------------------------------------*/ + +#if configUSE_PREEMPTION == 0 + + /* + * The cooperative scheduler requires a normal IRQ service routine to + * simply increment the system tick. + */ + void vNonPreemptiveTick( void ) __irq; + void vNonPreemptiveTick( void ) __irq + { + /* Increment the tick count - this may make a delaying task ready + to run - but a context switch is not performed. */ + xTaskIncrementTick(); + + T0IR = portTIMER_MATCH_ISR_BIT; /* Clear the timer event */ + VICVectAddr = portCLEAR_VIC_INTERRUPT; /* Acknowledge the Interrupt */ + } + + #else + + /* + ************************************************************************** + * The preemptive scheduler ISR is written in assembler and can be found + * in the portASM.s file. This will only get used if portUSE_PREEMPTION + * is set to 1 in portmacro.h + ************************************************************************** + */ + + void vPreemptiveTick( void ); + +#endif +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt( void ) +{ +uint32_t ulCompareMatch; + + /* A 1ms tick does not require the use of the timer prescale. This is + defaulted to zero but can be used if necessary. */ + T0PR = portPRESCALE_VALUE; + + /* Calculate the match value required for our wanted tick rate. */ + ulCompareMatch = configCPU_CLOCK_HZ / configTICK_RATE_HZ; + + /* Protect against divide by zero. Using an if() statement still results + in a warning - hence the #if. */ + #if portPRESCALE_VALUE != 0 + { + ulCompareMatch /= ( portPRESCALE_VALUE + 1 ); + } + #endif + + T0MR0 = ulCompareMatch; + + /* Generate tick with timer 0 compare match. */ + T0MCR = portRESET_COUNT_ON_MATCH | portINTERRUPT_ON_MATCH; + + /* Setup the VIC for the timer. */ + VICIntSelect &= ~( portTIMER_VIC_CHANNEL_BIT ); + VICIntEnable |= portTIMER_VIC_CHANNEL_BIT; + + /* The ISR installed depends on whether the preemptive or cooperative + scheduler is being used. */ + #if configUSE_PREEMPTION == 1 + { + VICVectAddr0 = ( uint32_t ) vPreemptiveTick; + } + #else + { + VICVectAddr0 = ( uint32_t ) vNonPreemptiveTick; + } + #endif + + VICVectCntl0 = portTIMER_VIC_CHANNEL | portTIMER_VIC_ENABLE; + + /* Start the timer - interrupts are disabled when this function is called + so it is okay to do this here. */ + T0TCR = portENABLE_TIMER; +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + /* Disable interrupts as per portDISABLE_INTERRUPTS(); */ + __disable_irq(); + + /* Now interrupts are disabled ulCriticalNesting can be accessed + directly. Increment ulCriticalNesting to keep a count of how many times + portENTER_CRITICAL() has been called. */ + ulCriticalNesting++; +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + if( ulCriticalNesting > portNO_CRITICAL_NESTING ) + { + /* Decrement the nesting count as we are leaving a critical section. */ + ulCriticalNesting--; + + /* If the nesting level has reached zero then interrupts should be + re-enabled. */ + if( ulCriticalNesting == portNO_CRITICAL_NESTING ) + { + /* Enable interrupts as per portEXIT_CRITICAL(). */ + __enable_irq(); + } + } +} +/*-----------------------------------------------------------*/ + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM7_LPC21xx/portASM.s b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM7_LPC21xx/portASM.s new file mode 100644 index 0000000..1a588d1 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM7_LPC21xx/portASM.s @@ -0,0 +1,151 @@ +;/* +; FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. +; All rights reserved +; +; +; *************************************************************************** +; * * +; * FreeRTOS tutorial books are available in pdf and paperback. * +; * Complete, revised, and edited pdf reference manuals are also * +; * available. * +; * * +; * Purchasing FreeRTOS documentation will not only help you, by * +; * ensuring you get running as quickly as possible and with an * +; * in-depth knowledge of how to use FreeRTOS, it will also help * +; * the FreeRTOS project to continue with its mission of providing * +; * professional grade, cross platform, de facto standard solutions * +; * for microcontrollers - completely free of charge! * +; * * +; * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * +; * * +; * Thank you for using FreeRTOS, and thank you for your support! * +; * * +; *************************************************************************** +; +; +; This file is part of the FreeRTOS distribution. +; +; FreeRTOS is free software; you can redistribute it and/or modify it under +; the terms of the GNU General Public License (version 2) as published by the +; Free Software Foundation AND MODIFIED BY the FreeRTOS exception. +; >>>NOTE<<< The modification to the GPL is included to allow you to +; distribute a combined work that includes FreeRTOS without being obliged to +; provide the source code for proprietary components outside of the FreeRTOS +; kernel. FreeRTOS is distributed in the hope that it will be useful, but +; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +; more details. You should have received a copy of the GNU General Public +; License and the FreeRTOS license exception along with FreeRTOS; if not it +; can be viewed here: http://www.freertos.org/a00114.html and also obtained +; by writing to Richard Barry, contact details for whom are available on the +; FreeRTOS WEB site. +; +; 1 tab == 4 spaces! +; +; http://www.FreeRTOS.org - Documentation, latest information, license and +; contact details. +; +; http://www.SafeRTOS.com - A version that is certified for use in safety +; critical systems. +; +; http://www.OpenRTOS.com - Commercial support, development, porting, +; licensing and training services. +;*/ + + INCLUDE portmacro.inc + + IMPORT vTaskSwitchContext + IMPORT xTaskIncrementTick + + EXPORT vPortYieldProcessor + EXPORT vPortStartFirstTask + EXPORT vPreemptiveTick + EXPORT vPortYield + + +VICVECTADDR EQU 0xFFFFF030 +T0IR EQU 0xE0004000 +T0MATCHBIT EQU 0x00000001 + + ARM + AREA PORT_ASM, CODE, READONLY + + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Starting the first task is done by just restoring the context +; setup by pxPortInitialiseStack +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +vPortStartFirstTask + + PRESERVE8 + + portRESTORE_CONTEXT + +vPortYield + + PRESERVE8 + + SVC 0 + bx lr + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Interrupt service routine for the SWI interrupt. The vector table is +; configured in the startup.s file. +; +; vPortYieldProcessor() is used to manually force a context switch. The +; SWI interrupt is generated by a call to taskYIELD() or portYIELD(). +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +vPortYieldProcessor + + PRESERVE8 + + ; Within an IRQ ISR the link register has an offset from the true return + ; address, but an SWI ISR does not. Add the offset manually so the same + ; ISR return code can be used in both cases. + ADD LR, LR, #4 + + ; Perform the context switch. + portSAVE_CONTEXT ; Save current task context + LDR R0, =vTaskSwitchContext ; Get the address of the context switch function + MOV LR, PC ; Store the return address + BX R0 ; Call the contedxt switch function + portRESTORE_CONTEXT ; restore the context of the selected task + + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Interrupt service routine for preemptive scheduler tick timer +; Only used if portUSE_PREEMPTION is set to 1 in portmacro.h +; +; Uses timer 0 of LPC21XX Family +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +vPreemptiveTick + + PRESERVE8 + + portSAVE_CONTEXT ; Save the context of the current task. + + LDR R0, =xTaskIncrementTick ; Increment the tick count. + MOV LR, PC ; This may make a delayed task ready + BX R0 ; to run. + + CMP R0, #0 + BEQ SkipContextSwitch + LDR R0, =vTaskSwitchContext ; Find the highest priority task that + MOV LR, PC ; is ready to run. + BX R0 +SkipContextSwitch + MOV R0, #T0MATCHBIT ; Clear the timer event + LDR R1, =T0IR + STR R0, [R1] + + LDR R0, =VICVECTADDR ; Acknowledge the interrupt + STR R0,[R0] + + portRESTORE_CONTEXT ; Restore the context of the highest + ; priority task that is ready to run. + END + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM7_LPC21xx/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM7_LPC21xx/portmacro.h new file mode 100644 index 0000000..d667596 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM7_LPC21xx/portmacro.h @@ -0,0 +1,188 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +/*-----------------------------------------------------------*/ + +/* Task utilities. */ + +/*----------------------------------------------------------- + * ISR entry and exit macros. These are only required if a task switch + * is required from an ISR. + *----------------------------------------------------------*/ + +/* If a switch is required then we just need to call */ +/* vTaskSwitchContext() as the context has already been */ +/* saved. */ + +#define portEXIT_SWITCHING_ISR(SwitchRequired) \ +{ \ +extern void vTaskSwitchContext(void); \ + \ + if(SwitchRequired) \ + { \ + vTaskSwitchContext(); \ + } \ +} \ + +extern void vPortYield( void ); +#define portYIELD() vPortYield() + + +/* Critical section management. */ + +/* + ****************************************************************** + * We don't need to worry about whether we're in ARM or + * THUMB mode with the Keil Real View compiler when enabling + * or disabling interrupts as the compiler's intrinsic functions + * take care of that for us. + ******************************************************************* + */ +#define portDISABLE_INTERRUPTS() __disable_irq() +#define portENABLE_INTERRUPTS() __enable_irq() + + +/*----------------------------------------------------------- + * Critical section control + * + * The code generated by the Keil compiler does not maintain separate + * stack and frame pointers. The portENTER_CRITICAL macro cannot therefore + * use the stack as per other ports. Instead a variable is used to keep + * track of the critical section nesting. This necessitates the use of a + * function in place of the macro. + *----------------------------------------------------------*/ + +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); + +#define portENTER_CRITICAL() vPortEnterCritical(); +#define portEXIT_CRITICAL() vPortExitCritical(); +/*-----------------------------------------------------------*/ + +/* Compiler specifics. */ +#define inline +#define register +#define portNOP() __asm{ NOP } +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM7_LPC21xx/portmacro.inc b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM7_LPC21xx/portmacro.inc new file mode 100644 index 0000000..37fe6df --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM7_LPC21xx/portmacro.inc @@ -0,0 +1,118 @@ +;/* +; FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. +; All rights reserved +; +; +; *************************************************************************** +; * * +; * FreeRTOS tutorial books are available in pdf and paperback. * +; * Complete, revised, and edited pdf reference manuals are also * +; * available. * +; * * +; * Purchasing FreeRTOS documentation will not only help you, by * +; * ensuring you get running as quickly as possible and with an * +; * in-depth knowledge of how to use FreeRTOS, it will also help * +; * the FreeRTOS project to continue with its mission of providing * +; * professional grade, cross platform, de facto standard solutions * +; * for microcontrollers - completely free of charge! * +; * * +; * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * +; * * +; * Thank you for using FreeRTOS, and thank you for your support! * +; * * +; *************************************************************************** +; +; +; This file is part of the FreeRTOS distribution. +; +; FreeRTOS is free software; you can redistribute it and/or modify it under +; the terms of the GNU General Public License (version 2) as published by the +; Free Software Foundation AND MODIFIED BY the FreeRTOS exception. +; >>>NOTE<<< The modification to the GPL is included to allow you to +; distribute a combined work that includes FreeRTOS without being obliged to +; provide the source code for proprietary components outside of the FreeRTOS +; kernel. FreeRTOS is distributed in the hope that it will be useful, but +; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +; more details. You should have received a copy of the GNU General Public +; License and the FreeRTOS license exception along with FreeRTOS; if not it +; can be viewed here: http://www.freertos.org/a00114.html and also obtained +; by writing to Richard Barry, contact details for whom are available on the +; FreeRTOS WEB site. +; +; 1 tab == 4 spaces! +; +; http://www.FreeRTOS.org - Documentation, latest information, license and +; contact details. +; +; http://www.SafeRTOS.com - A version that is certified for use in safety +; critical systems. +; +; http://www.OpenRTOS.com - Commercial support, development, porting, +; licensing and training services. +;*/ + + IMPORT ulCriticalNesting ; + IMPORT pxCurrentTCB ; + + + MACRO + portRESTORE_CONTEXT + + + LDR R0, =pxCurrentTCB ; Set the LR to the task stack. The location was... + LDR R0, [R0] ; ... stored in pxCurrentTCB + LDR LR, [R0] + + LDR R0, =ulCriticalNesting ; The critical nesting depth is the first item on... + LDMFD LR!, {R1} ; ...the stack. Load it into the ulCriticalNesting var. + STR R1, [R0] ; + + LDMFD LR!, {R0} ; Get the SPSR from the stack. + MSR SPSR_cxsf, R0 ; + + LDMFD LR, {R0-R14}^ ; Restore all system mode registers for the task. + NOP ; + + LDR LR, [LR, #+60] ; Restore the return address + + ; And return - correcting the offset in the LR to obtain ... + SUBS PC, LR, #4 ; ...the correct address. + + MEND + +; /**********************************************************************/ + + MACRO + portSAVE_CONTEXT + + + STMDB SP!, {R0} ; Store R0 first as we need to use it. + + STMDB SP,{SP}^ ; Set R0 to point to the task stack pointer. + NOP ; + SUB SP, SP, #4 ; + LDMIA SP!,{R0} ; + + STMDB R0!, {LR} ; Push the return address onto the stack. + MOV LR, R0 ; Now we have saved LR we can use it instead of R0. + LDMIA SP!, {R0} ; Pop R0 so we can save it onto the system mode stack. + + STMDB LR,{R0-LR}^ ; Push all the system mode registers onto the task stack. + NOP ; + SUB LR, LR, #60 ; + + MRS R0, SPSR ; Push the SPSR onto the task stack. + STMDB LR!, {R0} ; + + LDR R0, =ulCriticalNesting ; + LDR R0, [R0] ; + STMDB LR!, {R0} ; + + LDR R0, =pxCurrentTCB ; Store the new top of stack for the task. + LDR R1, [R0] ; + STR LR, [R1] ; + + MEND + + END diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM_CA9/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM_CA9/port.c new file mode 100644 index 0000000..10f6ae4 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM_CA9/port.c @@ -0,0 +1,522 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#ifndef configINTERRUPT_CONTROLLER_BASE_ADDRESS + #error configINTERRUPT_CONTROLLER_BASE_ADDRESS must be defined. See http://www.freertos.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html +#endif + +#ifndef configINTERRUPT_CONTROLLER_CPU_INTERFACE_OFFSET + #error configINTERRUPT_CONTROLLER_CPU_INTERFACE_OFFSET must be defined. See http://www.freertos.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html +#endif + +#ifndef configUNIQUE_INTERRUPT_PRIORITIES + #error configUNIQUE_INTERRUPT_PRIORITIES must be defined. See http://www.freertos.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html +#endif + +#ifndef configSETUP_TICK_INTERRUPT + #error configSETUP_TICK_INTERRUPT() must be defined. See http://www.freertos.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html +#endif /* configSETUP_TICK_INTERRUPT */ + +#ifndef configMAX_API_CALL_INTERRUPT_PRIORITY + #error configMAX_API_CALL_INTERRUPT_PRIORITY must be defined. See http://www.freertos.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html +#endif + +#if configMAX_API_CALL_INTERRUPT_PRIORITY == 0 + #error configMAX_API_CALL_INTERRUPT_PRIORITY must not be set to 0 +#endif + +#if configMAX_API_CALL_INTERRUPT_PRIORITY > configUNIQUE_INTERRUPT_PRIORITIES + #error configMAX_API_CALL_INTERRUPT_PRIORITY must be less than or equal to configUNIQUE_INTERRUPT_PRIORITIES as the lower the numeric priority value the higher the logical interrupt priority +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +/* In case security extensions are implemented. */ +#if configMAX_API_CALL_INTERRUPT_PRIORITY <= ( configUNIQUE_INTERRUPT_PRIORITIES / 2 ) + #error configMAX_API_CALL_INTERRUPT_PRIORITY must be greater than ( configUNIQUE_INTERRUPT_PRIORITIES / 2 ) +#endif + +#ifndef configCLEAR_TICK_INTERRUPT + #define configCLEAR_TICK_INTERRUPT() +#endif + +/* The number of bits to shift for an interrupt priority is dependent on the +number of bits implemented by the interrupt controller. */ +#if configUNIQUE_INTERRUPT_PRIORITIES == 16 + #define portPRIORITY_SHIFT 4 + #define portMAX_BINARY_POINT_VALUE 3 +#elif configUNIQUE_INTERRUPT_PRIORITIES == 32 + #define portPRIORITY_SHIFT 3 + #define portMAX_BINARY_POINT_VALUE 2 +#elif configUNIQUE_INTERRUPT_PRIORITIES == 64 + #define portPRIORITY_SHIFT 2 + #define portMAX_BINARY_POINT_VALUE 1 +#elif configUNIQUE_INTERRUPT_PRIORITIES == 128 + #define portPRIORITY_SHIFT 1 + #define portMAX_BINARY_POINT_VALUE 0 +#elif configUNIQUE_INTERRUPT_PRIORITIES == 256 + #define portPRIORITY_SHIFT 0 + #define portMAX_BINARY_POINT_VALUE 0 +#else + #error Invalid configUNIQUE_INTERRUPT_PRIORITIES setting. configUNIQUE_INTERRUPT_PRIORITIES must be set to the number of unique priorities implemented by the target hardware +#endif + +/* A critical section is exited when the critical section nesting count reaches +this value. */ +#define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) + +/* In all GICs 255 can be written to the priority mask register to unmask all +(but the lowest) interrupt priority. */ +#define portUNMASK_VALUE ( 0xFFUL ) + +/* Tasks are not created with a floating point context, but can be given a +floating point context after they have been created. A variable is stored as +part of the tasks context that holds portNO_FLOATING_POINT_CONTEXT if the task +does not have an FPU context, or any other value if the task does have an FPU +context. */ +#define portNO_FLOATING_POINT_CONTEXT ( ( StackType_t ) 0 ) + +/* Interrupt controller access addresses. */ +#define portICCPMR_PRIORITY_MASK_OFFSET ( 0x04 ) +#define portICCIAR_INTERRUPT_ACKNOWLEDGE_OFFSET ( 0x0C ) +#define portICCEOIR_END_OF_INTERRUPT_OFFSET ( 0x10 ) +#define portICCBPR_BINARY_POINT_OFFSET ( 0x08 ) +#define portICCRPR_RUNNING_PRIORITY_OFFSET ( 0x14 ) +#define portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS ( configINTERRUPT_CONTROLLER_BASE_ADDRESS + configINTERRUPT_CONTROLLER_CPU_INTERFACE_OFFSET ) +#define portICCPMR_PRIORITY_MASK_REGISTER ( *( ( volatile uint32_t * ) ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCPMR_PRIORITY_MASK_OFFSET ) ) ) +#define portICCIAR_INTERRUPT_ACKNOWLEDGE_REGISTER_ADDRESS ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCIAR_INTERRUPT_ACKNOWLEDGE_OFFSET ) +#define portICCEOIR_END_OF_INTERRUPT_REGISTER_ADDRESS ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCEOIR_END_OF_INTERRUPT_OFFSET ) +#define portICCPMR_PRIORITY_MASK_REGISTER_ADDRESS ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCPMR_PRIORITY_MASK_OFFSET ) +#define portICCBPR_BINARY_POINT_REGISTER ( *( ( const volatile uint32_t * ) ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCBPR_BINARY_POINT_OFFSET ) ) ) +#define portICCRPR_RUNNING_PRIORITY_REGISTER ( *( ( const volatile uint32_t * ) ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCRPR_RUNNING_PRIORITY_OFFSET ) ) ) + +/* Used by portASSERT_IF_INTERRUPT_PRIORITY_INVALID() when ensuring the binary +point is zero. */ +#define portBINARY_POINT_BITS ( ( uint8_t ) 0x03 ) + +/* Constants required to setup the initial task context. */ +#define portINITIAL_SPSR ( ( StackType_t ) 0x1f ) /* System mode, ARM mode, interrupts enabled. */ +#define portTHUMB_MODE_BIT ( ( StackType_t ) 0x20 ) +#define portTHUMB_MODE_ADDRESS ( 0x01UL ) + +/* Masks all bits in the APSR other than the mode bits. */ +#define portAPSR_MODE_BITS_MASK ( 0x1F ) + +/* The value of the mode bits in the APSR when the CPU is executing in user +mode. */ +#define portAPSR_USER_MODE ( 0x10 ) + +/* Macro to unmask all interrupt priorities. */ +#define portCLEAR_INTERRUPT_MASK() \ +{ \ + __disable_irq(); \ + portICCPMR_PRIORITY_MASK_REGISTER = portUNMASK_VALUE; \ + __asm( "DSB \n" \ + "ISB \n" ); \ + __enable_irq(); \ +} + +/*-----------------------------------------------------------*/ + +/* + * Starts the first task executing. This function is necessarily written in + * assembly code so is implemented in portASM.s. + */ +extern void vPortRestoreTaskContext( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* A variable is used to keep track of the critical section nesting. This +variable has to be stored as part of the task context and must be initialised to +a non zero value to ensure interrupts don't inadvertently become unmasked before +the scheduler starts. As it is stored as part of the task context it will +automatically be set to 0 when the first task is started. */ +volatile uint32_t ulCriticalNesting = 9999UL; + +/* Used to pass constants into the ASM code. The address at which variables are +placed is the constant value so indirect loads in the asm code are not +required. */ +uint32_t ulICCIAR __attribute__( ( at( portICCIAR_INTERRUPT_ACKNOWLEDGE_REGISTER_ADDRESS ) ) ); +uint32_t ulICCEOIR __attribute__( ( at( portICCEOIR_END_OF_INTERRUPT_REGISTER_ADDRESS ) ) ); +uint32_t ulICCPMR __attribute__( ( at( portICCPMR_PRIORITY_MASK_REGISTER_ADDRESS ) ) ); +uint32_t ulAsmAPIPriorityMask __attribute__( ( at( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ) ) ); + +/* Saved as part of the task context. If ulPortTaskHasFPUContext is non-zero then +a floating point context must be saved and restored for the task. */ +uint32_t ulPortTaskHasFPUContext = pdFALSE; + +/* Set to 1 to pend a context switch from an ISR. */ +uint32_t ulPortYieldRequired = pdFALSE; + +/* Counts the interrupt nesting depth. A context switch is only performed if +if the nesting depth is 0. */ +uint32_t ulPortInterruptNesting = 0UL; + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. + + The fist real value on the stack is the status register, which is set for + system mode, with interrupts enabled. A few NULLs are added first to ensure + GDB does not try decoding a non-existent return address. */ + *pxTopOfStack = NULL; + pxTopOfStack--; + *pxTopOfStack = NULL; + pxTopOfStack--; + *pxTopOfStack = NULL; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portINITIAL_SPSR; + + if( ( ( uint32_t ) pxCode & portTHUMB_MODE_ADDRESS ) != 0x00UL ) + { + /* The task will start in THUMB mode. */ + *pxTopOfStack |= portTHUMB_MODE_BIT; + } + + pxTopOfStack--; + + /* Next the return address, which in this case is the start of the task. */ + *pxTopOfStack = ( StackType_t ) pxCode; + pxTopOfStack--; + + /* Next all the registers other than the stack pointer. */ + *pxTopOfStack = ( StackType_t ) prvTaskExitError; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + + /* The task will start with a critical nesting count of 0 as interrupts are + enabled. */ + *pxTopOfStack = portNO_CRITICAL_NESTING; + pxTopOfStack--; + + /* The task will start without a floating point context. A task that uses + the floating point hardware must call vPortTaskUsesFPU() before executing + any floating point instructions. */ + *pxTopOfStack = portNO_FLOATING_POINT_CONTEXT; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT( ulPortInterruptNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + for( ;; ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +uint32_t ulAPSR; + + /* Only continue if the CPU is not in User mode. The CPU must be in a + Privileged mode for the scheduler to start. */ + __asm( "MRS ulAPSR, APSR" ); + ulAPSR &= portAPSR_MODE_BITS_MASK; + configASSERT( ulAPSR != portAPSR_USER_MODE ); + + if( ulAPSR != portAPSR_USER_MODE ) + { + /* Only continue if the binary point value is set to its lowest possible + setting. See the comments in vPortValidateInterruptPriority() below for + more information. */ + configASSERT( ( portICCBPR_BINARY_POINT_REGISTER & portBINARY_POINT_BITS ) <= portMAX_BINARY_POINT_VALUE ); + + if( ( portICCBPR_BINARY_POINT_REGISTER & portBINARY_POINT_BITS ) <= portMAX_BINARY_POINT_VALUE ) + { + /* Start the timer that generates the tick ISR. */ + configSETUP_TICK_INTERRUPT(); + + __enable_irq(); + vPortRestoreTaskContext(); + } + } + + /* Will only get here if vTaskStartScheduler() was called with the CPU in + a non-privileged mode or the binary point register was not set to its lowest + possible value. */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( ulCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + /* Disable interrupts as per portDISABLE_INTERRUPTS(); */ + ulPortSetInterruptMask(); + + /* Now interrupts are disabled ulCriticalNesting can be accessed + directly. Increment ulCriticalNesting to keep a count of how many times + portENTER_CRITICAL() has been called. */ + ulCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + assert() if it is being called from an interrupt context. Only API + functions that end in "FromISR" can be used in an interrupt. Only assert if + the critical nesting count is 1 to protect against recursive calls if the + assert function also uses a critical section. */ + if( ulCriticalNesting == 1 ) + { + configASSERT( ulPortInterruptNesting == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + if( ulCriticalNesting > portNO_CRITICAL_NESTING ) + { + /* Decrement the nesting count as the critical section is being + exited. */ + ulCriticalNesting--; + + /* If the nesting level has reached zero then all interrupt + priorities must be re-enabled. */ + if( ulCriticalNesting == portNO_CRITICAL_NESTING ) + { + /* Critical nesting has reached zero so all interrupt priorities + should be unmasked. */ + portCLEAR_INTERRUPT_MASK(); + } + } +} +/*-----------------------------------------------------------*/ + +void FreeRTOS_Tick_Handler( void ) +{ + /* Set interrupt mask before altering scheduler structures. The tick + handler runs at the lowest priority, so interrupts cannot already be masked, + so there is no need to save and restore the current mask value. */ + __disable_irq(); + portICCPMR_PRIORITY_MASK_REGISTER = ( uint32_t ) ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ); + __asm( "DSB \n" + "ISB \n" ); + __enable_irq(); + + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + ulPortYieldRequired = pdTRUE; + } + + /* Ensure all interrupt priorities are active again. */ + portCLEAR_INTERRUPT_MASK(); + configCLEAR_TICK_INTERRUPT(); +} +/*-----------------------------------------------------------*/ + +void vPortTaskUsesFPU( void ) +{ +uint32_t ulInitialFPSCR = 0; + + /* A task is registering the fact that it needs an FPU context. Set the + FPU flag (which is saved as part of the task context). */ + ulPortTaskHasFPUContext = pdTRUE; + + /* Initialise the floating point status register. */ + __asm( "FMXR FPSCR, ulInitialFPSCR" ); +} +/*-----------------------------------------------------------*/ + +void vPortClearInterruptMask( uint32_t ulNewMaskValue ) +{ + if( ulNewMaskValue == pdFALSE ) + { + portCLEAR_INTERRUPT_MASK(); + } +} +/*-----------------------------------------------------------*/ + +uint32_t ulPortSetInterruptMask( void ) +{ +uint32_t ulReturn; + + __disable_irq(); + if( portICCPMR_PRIORITY_MASK_REGISTER == ( uint32_t ) ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ) ) + { + /* Interrupts were already masked. */ + ulReturn = pdTRUE; + } + else + { + ulReturn = pdFALSE; + portICCPMR_PRIORITY_MASK_REGISTER = ( uint32_t ) ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ); + __asm( "DSB \n" + "ISB \n" ); + } + __enable_irq(); + + return ulReturn; +} +/*-----------------------------------------------------------*/ + +#if( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + /* The following assertion will fail if a service routine (ISR) for + an interrupt that has been assigned a priority above + configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + function. ISR safe FreeRTOS API functions must *only* be called + from interrupts that have been assigned a priority at or below + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Numerically low interrupt priority numbers represent logically high + interrupt priorities, therefore the priority of the interrupt must + be set to a value equal to or numerically *higher* than + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + FreeRTOS maintains separate thread and ISR API functions to ensure + interrupt entry is as fast and simple as possible. + + The following links provide detailed information: + http://www.freertos.org/RTOS-Cortex-M3-M4.html + http://www.freertos.org/FAQHelp.html */ + configASSERT( portICCRPR_RUNNING_PRIORITY_REGISTER >= ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ) ); + + /* Priority grouping: The interrupt controller (GIC) allows the bits + that define each interrupt's priority to be split between bits that + define the interrupt's pre-emption priority bits and bits that define + the interrupt's sub-priority. For simplicity all bits must be defined + to be pre-emption priority bits. The following assertion will fail if + this is not the case (if some bits represent a sub-priority). + + The priority grouping is configured by the GIC's binary point register + (ICCBPR). Writting 0 to ICCBPR will ensure it is set to its lowest + possible value (which may be above 0). */ + configASSERT( portICCBPR_BINARY_POINT_REGISTER <= portMAX_BINARY_POINT_VALUE ); + } + +#endif /* configASSERT_DEFINED */ + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM_CA9/portASM.s b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM_CA9/portASM.s new file mode 100644 index 0000000..55091c8 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM_CA9/portASM.s @@ -0,0 +1,200 @@ +;/* +; FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. +; All rights reserved +; +; +; *************************************************************************** +; * * +; * FreeRTOS tutorial books are available in pdf and paperback. * +; * Complete, revised, and edited pdf reference manuals are also * +; * available. * +; * * +; * Purchasing FreeRTOS documentation will not only help you, by * +; * ensuring you get running as quickly as possible and with an * +; * in-depth knowledge of how to use FreeRTOS, it will also help * +; * the FreeRTOS project to continue with its mission of providing * +; * professional grade, cross platform, de facto standard solutions * +; * for microcontrollers - completely free of charge! * +; * * +; * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * +; * * +; * Thank you for using FreeRTOS, and thank you for your support! * +; * * +; *************************************************************************** +; +; +; This file is part of the FreeRTOS distribution. +; +; FreeRTOS is free software; you can redistribute it and/or modify it under +; the terms of the GNU General Public License (version 2) as published by the +; Free Software Foundation AND MODIFIED BY the FreeRTOS exception. +; >>>NOTE<<< The modification to the GPL is included to allow you to +; distribute a combined work that includes FreeRTOS without being obliged to +; provide the source code for proprietary components outside of the FreeRTOS +; kernel. FreeRTOS is distributed in the hope that it will be useful, but +; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +; more details. You should have received a copy of the GNU General Public +; License and the FreeRTOS license exception along with FreeRTOS; if not it +; can be viewed here: http://www.freertos.org/a00114.html and also obtained +; by writing to Richard Barry, contact details for whom are available on the +; FreeRTOS WEB site. +; +; 1 tab == 4 spaces! +; +; http://www.FreeRTOS.org - Documentation, latest information, license and +; contact details. +; +; http://www.SafeRTOS.com - A version that is certified for use in safety +; critical systems. +; +; http://www.OpenRTOS.com - Commercial support, development, porting, +; licensing and training services. +;*/ + + INCLUDE portmacro.inc + + IMPORT vApplicationIRQHandler + IMPORT vTaskSwitchContext + IMPORT ulPortYieldRequired + IMPORT ulPortInterruptNesting + IMPORT vTaskSwitchContext + IMPORT ulICCIAR + IMPORT ulICCEOIR + + EXPORT FreeRTOS_SWI_Handler + EXPORT FreeRTOS_IRQ_Handler + EXPORT vPortRestoreTaskContext + + ARM + AREA PORT_ASM, CODE, READONLY + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; SVC handler is used to yield a task. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +FreeRTOS_SWI_Handler + + PRESERVE8 + + ; Save the context of the current task and select a new task to run. + portSAVE_CONTEXT + LDR R0, =vTaskSwitchContext + BLX R0 + portRESTORE_CONTEXT + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; vPortRestoreTaskContext is used to start the scheduler. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +vPortRestoreTaskContext + ; Switch to system mode + CPS #SYS_MODE + portRESTORE_CONTEXT + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; PL390 GIC interrupt handler +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +FreeRTOS_IRQ_Handler + + ; Return to the interrupted instruction. + SUB lr, lr, #4 + + ; Push the return address and SPSR + PUSH {lr} + MRS lr, SPSR + PUSH {lr} + + ; Change to supervisor mode to allow reentry. + CPS #SVC_MODE + + ; Push used registers. + PUSH {r0-r4, r12} + + ; Increment nesting count. r3 holds the address of ulPortInterruptNesting + ; for future use. r1 holds the original ulPortInterruptNesting value for + ; future use. + LDR r3, =ulPortInterruptNesting + LDR r1, [r3] + ADD r4, r1, #1 + STR r4, [r3] + + ; Read value from the interrupt acknowledge register, which is stored in r0 + ; for future parameter and interrupt clearing use. + LDR r2, =ulICCIAR + LDR r0, [r2] + + ; Ensure bit 2 of the stack pointer is clear. r2 holds the bit 2 value for + ; future use. + MOV r2, sp + AND r2, r2, #4 + SUB sp, sp, r2 + + ; Call the interrupt handler + PUSH {r0-r3, lr} + LDR r1, =vApplicationIRQHandler + BLX r1 + POP {r0-r3, lr} + ADD sp, sp, r2 + + CPSID i + + ; Write the value read from ICCIAR to ICCEOIR + LDR r4, =ulICCEOIR + STR r0, [r4] + + ; Restore the old nesting count + STR r1, [r3] + + ; A context switch is never performed if the nesting count is not 0 + CMP r1, #0 + BNE exit_without_switch + + ; Did the interrupt request a context switch? r1 holds the address of + ; ulPortYieldRequired and r0 the value of ulPortYieldRequired for future + ; use. + LDR r1, =ulPortYieldRequired + LDR r0, [r1] + CMP r0, #0 + BNE switch_before_exit + +exit_without_switch + ; No context switch. Restore used registers, LR_irq and SPSR before + ; returning. + POP {r0-r4, r12} + CPS #IRQ_MODE + POP {LR} + MSR SPSR_cxsf, LR + POP {LR} + MOVS PC, LR + +switch_before_exit + ; A context swtich is to be performed. Clear the context switch pending + ; flag. + MOV r0, #0 + STR r0, [r1] + + ; Restore used registers, LR-irq and SPSR before saving the context + ; to the task stack. + POP {r0-r4, r12} + CPS #IRQ_MODE + POP {LR} + MSR SPSR_cxsf, LR + POP {LR} + portSAVE_CONTEXT + + ; Call the function that selects the new task to execute. + ; vTaskSwitchContext() if vTaskSwitchContext() uses LDRD or STRD + ; instructions, or 8 byte aligned stack allocated data. LR does not need + ; saving as a new LR will be loaded by portRESTORE_CONTEXT anyway. + LDR r0, =vTaskSwitchContext + BLX r0 + + ; Restore the context of, and branch to, the task selected to execute next. + portRESTORE_CONTEXT + + + END + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM_CA9/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM_CA9/portmacro.h new file mode 100644 index 0000000..469120d --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM_CA9/portmacro.h @@ -0,0 +1,205 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 + +/*-----------------------------------------------------------*/ + +/* Task utilities. */ + +/* Called at the end of an ISR that can cause a context switch. */ +#define portEND_SWITCHING_ISR( xSwitchRequired )\ +{ \ +extern uint32_t ulPortYieldRequired; \ + \ + if( xSwitchRequired != pdFALSE ) \ + { \ + ulPortYieldRequired = pdTRUE; \ + } \ +} + +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +#define portYIELD() __asm( "SWI 0" ); + + +/*----------------------------------------------------------- + * Critical section control + *----------------------------------------------------------*/ + +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); +extern uint32_t ulPortSetInterruptMask( void ); +extern void vPortClearInterruptMask( uint32_t ulNewMaskValue ); + +/* These macros do not globally disable/enable interrupts. They do mask off +interrupts that have a priority below configMAX_API_CALL_INTERRUPT_PRIORITY. */ +#define portENTER_CRITICAL() vPortEnterCritical(); +#define portEXIT_CRITICAL() vPortExitCritical(); +#define portDISABLE_INTERRUPTS() ulPortSetInterruptMask() +#define portENABLE_INTERRUPTS() vPortClearInterruptMask( 0 ) +#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortSetInterruptMask() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vPortClearInterruptMask(x) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are +not required for this port but included in case common demo code that uses these +macros is used. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +/* Prototype of the FreeRTOS tick handler. This must be installed as the +handler for whichever peripheral is used to generate the RTOS tick. */ +void FreeRTOS_Tick_Handler( void ); + +/* Any task that uses the floating point unit MUST call vPortTaskUsesFPU() +before any floating point instructions are executed. */ +void vPortTaskUsesFPU( void ); +#define portTASK_USES_FLOATING_POINT() vPortTaskUsesFPU() + +#define portLOWEST_INTERRUPT_PRIORITY ( ( ( uint32_t ) configUNIQUE_INTERRUPT_PRIORITIES ) - 1UL ) +#define portLOWEST_USABLE_INTERRUPT_PRIORITY ( portLOWEST_INTERRUPT_PRIORITY - 1UL ) + +/* Architecture specific optimisations. */ +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31 - __clz( uxReadyPriorities ) ) + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +#ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() +#endif + +#define portNOP() __nop() + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM_CA9/portmacro.inc b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM_CA9/portmacro.inc new file mode 100644 index 0000000..4a46924 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM_CA9/portmacro.inc @@ -0,0 +1,147 @@ +;/* +; FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. +; All rights reserved +; +; +; *************************************************************************** +; * * +; * FreeRTOS tutorial books are available in pdf and paperback. * +; * Complete, revised, and edited pdf reference manuals are also * +; * available. * +; * * +; * Purchasing FreeRTOS documentation will not only help you, by * +; * ensuring you get running as quickly as possible and with an * +; * in-depth knowledge of how to use FreeRTOS, it will also help * +; * the FreeRTOS project to continue with its mission of providing * +; * professional grade, cross platform, de facto standard solutions * +; * for microcontrollers - completely free of charge! * +; * * +; * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * +; * * +; * Thank you for using FreeRTOS, and thank you for your support! * +; * * +; *************************************************************************** +; +; +; This file is part of the FreeRTOS distribution. +; +; FreeRTOS is free software; you can redistribute it and/or modify it under +; the terms of the GNU General Public License (version 2) as published by the +; Free Software Foundation AND MODIFIED BY the FreeRTOS exception. +; >>>NOTE<<< The modification to the GPL is included to allow you to +; distribute a combined work that includes FreeRTOS without being obliged to +; provide the source code for proprietary components outside of the FreeRTOS +; kernel. FreeRTOS is distributed in the hope that it will be useful, but +; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +; more details. You should have received a copy of the GNU General Public +; License and the FreeRTOS license exception along with FreeRTOS; if not it +; can be viewed here: http://www.freertos.org/a00114.html and also obtained +; by writing to Richard Barry, contact details for whom are available on the +; FreeRTOS WEB site. +; +; 1 tab == 4 spaces! +; +; http://www.FreeRTOS.org - Documentation, latest information, license and +; contact details. +; +; http://www.SafeRTOS.com - A version that is certified for use in safety +; critical systems. +; +; http://www.OpenRTOS.com - Commercial support, development, porting, +; licensing and training services. +;*/ + +SYS_MODE EQU 0x1f +SVC_MODE EQU 0x13 +IRQ_MODE EQU 0x12 + + IMPORT ulCriticalNesting + IMPORT pxCurrentTCB + IMPORT ulPortTaskHasFPUContext + IMPORT ulAsmAPIPriorityMask + IMPORT ulICCPMR + + + MACRO + portSAVE_CONTEXT + + ; Save the LR and SPSR onto the system mode stack before switching to + ; system mode to save the remaining system mode registers + SRSDB sp!, #SYS_MODE + CPS #SYS_MODE + PUSH {R0-R12, R14} + + ; Push the critical nesting count + LDR R2, =ulCriticalNesting + LDR R1, [R2] + PUSH {R1} + + ; Does the task have a floating point context that needs saving? If + ; ulPortTaskHasFPUContext is 0 then no. + LDR R2, =ulPortTaskHasFPUContext + LDR R3, [R2] + CMP R3, #0 + + ; Save the floating point context, if any + FMRXNE R1, FPSCR + VPUSHNE {D0-D15} + VPUSHNE {D16-D31} + PUSHNE {R1} + + ; Save ulPortTaskHasFPUContext itself + PUSH {R3} + + ; Save the stack pointer in the TCB + LDR R0, =pxCurrentTCB + LDR R1, [R0] + STR SP, [R1] + + MEND + +; /**********************************************************************/ + + MACRO + portRESTORE_CONTEXT + + ; Set the SP to point to the stack of the task being restored. + LDR R0, =pxCurrentTCB + LDR R1, [R0] + LDR SP, [R1] + + ; Is there a floating point context to restore? If the restored + ; ulPortTaskHasFPUContext is zero then no. + LDR R0, =ulPortTaskHasFPUContext + POP {R1} + STR R1, [R0] + CMP R1, #0 + + ; Restore the floating point context, if any + POPNE {R0} + VPOPNE {D16-D31} + VPOPNE {D0-D15} + VMSRNE FPSCR, R0 + + ; Restore the critical section nesting depth + LDR R0, =ulCriticalNesting + POP {R1} + STR R1, [R0] + + ; Ensure the priority mask is correct for the critical nesting depth + LDR R2, =ulICCPMR + CMP R1, #0 + MOVEQ R4, #255 + LDRNE R4, =ulAsmAPIPriorityMask + STR R4, [r2] + + ; Restore all system mode registers other than the SP (which is already + ; being used) + POP {R0-R12, R14} + + ; Return to the task code, loading CPSR on the way. + RFEIA sp! + + MEND + + END + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM_CM0/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM_CM0/port.c new file mode 100644 index 0000000..6fc1e94 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM_CM0/port.c @@ -0,0 +1,349 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the ARM CM0 port. + *----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Constants required to manipulate the NVIC. */ +#define portNVIC_SYSTICK_CTRL ( ( volatile uint32_t *) 0xe000e010 ) +#define portNVIC_SYSTICK_LOAD ( ( volatile uint32_t *) 0xe000e014 ) +#define portNVIC_INT_CTRL ( ( volatile uint32_t *) 0xe000ed04 ) +#define portNVIC_SYSPRI2 ( ( volatile uint32_t *) 0xe000ed20 ) +#define portNVIC_SYSTICK_CLK 0x00000004 +#define portNVIC_SYSTICK_INT 0x00000002 +#define portNVIC_SYSTICK_ENABLE 0x00000001 +#define portNVIC_PENDSVSET 0x10000000 +#define portMIN_INTERRUPT_PRIORITY ( 255UL ) +#define portNVIC_PENDSV_PRI ( portMIN_INTERRUPT_PRIORITY << 16UL ) +#define portNVIC_SYSTICK_PRI ( portMIN_INTERRUPT_PRIORITY << 24UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) + +/* Constants used with memory barrier intrinsics. */ +#define portSY_FULL_READ_WRITE ( 15 ) + +/* Each task maintains its own interrupt status in the critical nesting +variable. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* + * Setup the timer to generate the tick interrupts. + */ +static void prvSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortPendSVHandler( void ); +void xPortSysTickHandler( void ); +void vPortSVCHandler( void ); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +static void prvPortStartFirstTask( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + interrupt. */ + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) prvTaskExitError; /* LR */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack -= 8; /* R11..R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + for( ;; ); +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler( void ) +{ + /* This function is no longer used, but retained for backward + compatibility. */ +} +/*-----------------------------------------------------------*/ + +__asm void prvPortStartFirstTask( void ) +{ + extern pxCurrentTCB; + + PRESERVE8 + + /* The MSP stack is not reset as, unlike on M3/4 parts, there is no vector + table offset register that can be used to locate the initial stack value. + Not all M0 parts have the application vector table at address 0. */ + + ldr r3, =pxCurrentTCB /* Obtain location of pxCurrentTCB. */ + ldr r1, [r3] + ldr r0, [r1] /* The first item in pxCurrentTCB is the task top of stack. */ + adds r0, #32 /* Discard everything up to r0. */ + msr psp, r0 /* This is now the new top of stack to use in the task. */ + movs r0, #2 /* Switch to the psp stack. */ + msr CONTROL, r0 + isb + pop {r0-r5} /* Pop the registers that are saved automatically. */ + mov lr, r5 /* lr is now in r5. */ + pop {r3} /* The return address is now in r3. */ + pop {r2} /* Pop and discard the XPSR. */ + cpsie i /* The first task has its context and interrupts can be enabled. */ + bx r3 /* Finally, jump to the user defined task code. */ + + ALIGN +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + /* Make PendSV, CallSV and SysTick the same priroity as the kernel. */ + *(portNVIC_SYSPRI2) |= portNVIC_PENDSV_PRI; + *(portNVIC_SYSPRI2) |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + prvSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Start the first task. */ + prvPortStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortYield( void ) +{ + /* Set a PendSV to request a context switch. */ + *( portNVIC_INT_CTRL ) = portNVIC_PENDSVSET; + + /* Barriers are normally not required but do ensure the code is completely + within the specified behaviour for the architecture. */ + __dsb( portSY_FULL_READ_WRITE ); + __isb( portSY_FULL_READ_WRITE ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + __dsb( portSY_FULL_READ_WRITE ); + __isb( portSY_FULL_READ_WRITE ); +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +__asm uint32_t ulSetInterruptMaskFromISR( void ) +{ + mrs r0, PRIMASK + cpsid i + bx lr +} +/*-----------------------------------------------------------*/ + +__asm void vClearInterruptMaskFromISR( uint32_t ulMask ) +{ + msr PRIMASK, r0 + bx lr +} +/*-----------------------------------------------------------*/ + +__asm void xPortPendSVHandler( void ) +{ + extern vTaskSwitchContext + extern pxCurrentTCB + + PRESERVE8 + + mrs r0, psp + + ldr r3, =pxCurrentTCB /* Get the location of the current TCB. */ + ldr r2, [r3] + + subs r0, #32 /* Make space for the remaining low registers. */ + str r0, [r2] /* Save the new top of stack. */ + stmia r0!, {r4-r7} /* Store the low registers that are not saved automatically. */ + mov r4, r8 /* Store the high registers. */ + mov r5, r9 + mov r6, r10 + mov r7, r11 + stmia r0!, {r4-r7} + + push {r3, r14} + cpsid i + bl vTaskSwitchContext + cpsie i + pop {r2, r3} /* lr goes in r3. r2 now holds tcb pointer. */ + + ldr r1, [r2] + ldr r0, [r1] /* The first item in pxCurrentTCB is the task top of stack. */ + adds r0, #16 /* Move to the high registers. */ + ldmia r0!, {r4-r7} /* Pop the high registers. */ + mov r8, r4 + mov r9, r5 + mov r10, r6 + mov r11, r7 + + msr psp, r0 /* Remember the new top of stack for the task. */ + + subs r0, #32 /* Go back for the low registers that are not automatically restored. */ + ldmia r0!, {r4-r7} /* Pop low registers. */ + + bx r3 + ALIGN +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ +uint32_t ulPreviousMask; + + ulPreviousMask = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Pend a context switch. */ + *(portNVIC_INT_CTRL) = portNVIC_PENDSVSET; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulPreviousMask ); +} +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +void prvSetupTimerInterrupt( void ) +{ + /* Configure SysTick to interrupt at the requested rate. */ + *(portNVIC_SYSTICK_LOAD) = ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + *(portNVIC_SYSTICK_CTRL) = portNVIC_SYSTICK_CLK | portNVIC_SYSTICK_INT | portNVIC_SYSTICK_ENABLE; +} +/*-----------------------------------------------------------*/ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM_CM0/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM_CM0/portmacro.h new file mode 100644 index 0000000..70a12e5 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM_CM0/portmacro.h @@ -0,0 +1,156 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +/*-----------------------------------------------------------*/ + + +/* Scheduler utilities. */ +extern void vPortYield( void ); +#define portNVIC_INT_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed04 ) ) +#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) +#define portYIELD() vPortYield() +#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); +extern uint32_t ulSetInterruptMaskFromISR( void ); +extern void vClearInterruptMaskFromISR( uint32_t ulMask ); + +#define portSET_INTERRUPT_MASK_FROM_ISR() ulSetInterruptMaskFromISR() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vClearInterruptMaskFromISR( x ) +#define portDISABLE_INTERRUPTS() __disable_irq() +#define portENABLE_INTERRUPTS() __enable_irq() +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#define portNOP() + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM_CM3/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM_CM3/port.c new file mode 100644 index 0000000..61d8596 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM_CM3/port.c @@ -0,0 +1,701 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the ARM CM3 port. + *----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#ifndef configKERNEL_INTERRUPT_PRIORITY + #define configKERNEL_INTERRUPT_PRIORITY 255 +#endif + +#if configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 + #error configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html +#endif + +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#else + /* The way the SysTick is clocked is not modified in case it is not the same + as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 0 ) +#endif + +/* The __weak attribute does not work as you might expect with the Keil tools +so the configOVERRIDE_DEFAULT_TICK_CONFIGURATION constant must be set to 1 if +the application writer wants to provide their own implementation of +vPortSetupTimerInterrupt(). Ensure configOVERRIDE_DEFAULT_TICK_CONFIGURATION +is defined. */ +#ifndef configOVERRIDE_DEFAULT_TICK_CONFIGURATION + #define configOVERRIDE_DEFAULT_TICK_CONFIGURATION 0 +#endif + +/* Constants required to manipulate the core. Registers first... */ +#define portNVIC_SYSTICK_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( * ( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( * ( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SYSPRI2_REG ( * ( ( volatile uint32_t * ) 0xe000ed20 ) ) +/* ...then bits in the registers. */ +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) + +/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */ +#define portVECTACTIVE_MASK ( 0xFFUL ) + +#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( * ( ( volatile uint32_t * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have +occurred while the SysTick counter is stopped during tickless idle +calculations. */ +#define portMISSED_COUNTS_FACTOR ( 45UL ) + +/* For strict compliance with the Cortex-M spec the task start address should +have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ +#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) + +/* Each task maintains its own interrupt status in the critical nesting +variable. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortPendSVHandler( void ); +void xPortSysTickHandler( void ); +void vPortSVCHandler( void ); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +static void prvStartFirstTask( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* + * The number of SysTick increments that make up one tick period. + */ +#if configUSE_TICKLESS_IDLE == 1 + static uint32_t ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * The maximum number of tick periods that can be suppressed is limited by the + * 24 bit resolution of the SysTick timer. + */ +#if configUSE_TICKLESS_IDLE == 1 + static uint32_t xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Compensate for the CPU cycles that pass while the SysTick is stopped (low + * power functionality only. + */ +#if configUSE_TICKLESS_IDLE == 1 + static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static uint8_t ucMaxSysCallPriority = 0; + static uint32_t ulMaxPRIGROUPValue = 0; + static const volatile uint8_t * const pcInterruptPriorityRegisters = ( uint8_t * ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + interrupt. */ + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) prvTaskExitError; /* LR */ + + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + for( ;; ); +} +/*-----------------------------------------------------------*/ + +__asm void vPortSVCHandler( void ) +{ + PRESERVE8 + + ldr r3, =pxCurrentTCB /* Restore the context. */ + ldr r1, [r3] /* Use pxCurrentTCBConst to get the pxCurrentTCB address. */ + ldr r0, [r1] /* The first item in pxCurrentTCB is the task top of stack. */ + ldmia r0!, {r4-r11} /* Pop the registers that are not automatically saved on exception entry and the critical nesting count. */ + msr psp, r0 /* Restore the task stack pointer. */ + isb + mov r0, #0 + msr basepri, r0 + orr r14, #0xd + bx r14 +} +/*-----------------------------------------------------------*/ + +__asm void prvStartFirstTask( void ) +{ + PRESERVE8 + + /* Use the NVIC offset register to locate the stack. */ + ldr r0, =0xE000ED08 + ldr r0, [r0] + ldr r0, [r0] + + /* Set the msp back to the start of the stack. */ + msr msp, r0 + /* Globally enable interrupts. */ + cpsie i + cpsie f + dsb + isb + /* Call SVC to start the first task. */ + svc 0 + nop + nop +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + #if( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( uint8_t * ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + functions can be called. ISR safe functions are those that end in + "FromISR". FreeRTOS maintains separate thread and ISR API functions to + ensure interrupt entry is as fast and simple as possible. + + Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( uint8_t ) 0x01; + } + + /* Shift the priority group value back to its position within the AIRCR + register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* conifgASSERT_DEFINED */ + + /* Make PendSV and SysTick the lowest priority interrupts. */ + portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI; + portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Start the first task. */ + prvStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + assert() if it is being called from an interrupt context. Only API + functions that end in "FromISR" can be used in an interrupt. Only assert if + the critical nesting count is 1 to protect against recursive calls if the + assert function also uses a critical section. */ + if( uxCriticalNesting == 1 ) + { + configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +__asm void xPortPendSVHandler( void ) +{ + extern uxCriticalNesting; + extern pxCurrentTCB; + extern vTaskSwitchContext; + + PRESERVE8 + + mrs r0, psp + isb + + ldr r3, =pxCurrentTCB /* Get the location of the current TCB. */ + ldr r2, [r3] + + stmdb r0!, {r4-r11} /* Save the remaining registers. */ + str r0, [r2] /* Save the new top of stack into the first member of the TCB. */ + + stmdb sp!, {r3, r14} + mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY + msr basepri, r0 + dsb + isb + bl vTaskSwitchContext + mov r0, #0 + msr basepri, r0 + ldmia sp!, {r3, r14} + + ldr r1, [r3] + ldr r0, [r1] /* The first item in pxCurrentTCB is the task top of stack. */ + ldmia r0!, {r4-r11} /* Pop the registers and the critical nesting count. */ + msr psp, r0 + isb + bx r14 + nop +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + /* The SysTick runs at the lowest interrupt priority, so when this interrupt + executes all interrupts must be unmasked. There is therefore no need to + save and then restore the interrupt mask value as its value is already + known - therefore the slightly faster vPortRaiseBASEPRI() function is used + in place of portSET_INTERRUPT_MASK_FROM_ISR(). */ + vPortRaiseBASEPRI(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* A context switch is required. Context switching is performed in + the PendSV interrupt. Pend the PendSV interrupt. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + vPortClearBASEPRIFromISR(); +} +/*-----------------------------------------------------------*/ + +#if configUSE_TICKLESS_IDLE == 1 + + __weak void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickCTRL; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Stop the SysTick momentarily. The time the SysTick is stopped for + is accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG &= ~portNVIC_SYSTICK_ENABLE_BIT; + + /* Calculate the reload value required to wait xExpectedIdleTime + tick periods. -1 is used because this code will execute part way + through one of the tick periods. */ + ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + method as that will mask interrupts that should exit sleep mode. */ + __disable_irq(); + __dsb( portSY_FULL_READ_WRITE ); + __isb( portSY_FULL_READ_WRITE ); + + /* If a context switch is pending or a task is waiting for the scheduler + to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Restart from whatever is left in the count register to complete + this tick period. */ + portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Reset the reload register to the value required for normal tick + periods. */ + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + + /* Re-enable interrupts - see comments above __disable_irq() call + above. */ + __enable_irq(); + } + else + { + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + set its parameter to 0 to indicate that its implementation contains + its own wait for interrupt or wait for event instruction, and so wfi + should not be executed again. However, the original expected idle + time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + if( xModifiableIdleTime > 0 ) + { + __dsb( portSY_FULL_READ_WRITE ); + __wfi(); + __isb( portSY_FULL_READ_WRITE ); + } + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Stop SysTick. Again, the time the SysTick is stopped for is + accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + ulSysTickCTRL = portNVIC_SYSTICK_CTRL_REG; + portNVIC_SYSTICK_CTRL_REG = ( ulSysTickCTRL & ~portNVIC_SYSTICK_ENABLE_BIT ); + + /* Re-enable interrupts - see comments above __disable_irq() call + above. */ + __enable_irq(); + + if( ( ulSysTickCTRL & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt has already executed, and the SysTick + count reloaded with ulReloadValue. Reset the + portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick + period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + underflowed because the post sleep hook did something + that took too long. */ + if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* The tick interrupt handler will already have pended the tick + processing in the kernel. As the pending tick will be + processed as soon as this function exits, the tick value + maintained by the tick is stepped forward by one less than the + time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. + Work out how long the sleep lasted rounded to complete tick + periods (not the ulReload value which accounted for part + ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* How many complete tick periods passed while the processor + was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG + again, then set portNVIC_SYSTICK_LOAD_REG back to its standard + value. The critical section is used to ensure the tick interrupt + can only execute once in the case that the reload register is near + zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portENTER_CRITICAL(); + { + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + vTaskStepTick( ulCompleteTickPeriods ); + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + portEXIT_CRITICAL(); + } + } + +#endif /* #if configUSE_TICKLESS_IDLE */ + +/*-----------------------------------------------------------*/ + +/* + * Setup the SysTick timer to generate the tick interrupts at the required + * frequency. + */ +#if configOVERRIDE_DEFAULT_TICK_CONFIGURATION == 0 + + void vPortSetupTimerInterrupt( void ) + { + /* Calculate the constants required to configure the tick interrupt. */ + #if configUSE_TICKLESS_IDLE == 1 + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); + } + +#endif /* configOVERRIDE_DEFAULT_TICK_CONFIGURATION */ +/*-----------------------------------------------------------*/ + +__asm uint32_t vPortGetIPSR( void ) +{ + PRESERVE8 + + mrs r0, ipsr + bx r14 +} +/*-----------------------------------------------------------*/ + +#if( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + uint32_t ulCurrentInterrupt; + uint8_t ucCurrentPriority; + + /* Obtain the number of the currently executing interrupt. */ + ulCurrentInterrupt = vPortGetIPSR(); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + an interrupt that has been assigned a priority above + configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + function. ISR safe FreeRTOS API functions must *only* be called + from interrupts that have been assigned a priority at or below + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Numerically low interrupt priority numbers represent logically high + interrupt priorities, therefore the priority of the interrupt must + be set to a value equal to or numerically *higher* than + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Interrupts that use the FreeRTOS API must not be left at their + default priority of zero as that is the highest possible priority, + which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + and therefore also guaranteed to be invalid. + + FreeRTOS maintains separate thread and ISR API functions to ensure + interrupt entry is as fast and simple as possible. + + The following links provide detailed information: + http://www.freertos.org/RTOS-Cortex-M3-M4.html + http://www.freertos.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + that define each interrupt's priority to be split between bits that + define the interrupt's pre-emption priority bits and bits that define + the interrupt's sub-priority. For simplicity all bits must be defined + to be pre-emption priority bits. The following assertion will fail if + this is not the case (if some bits represent a sub-priority). + + If the application only uses CMSIS libraries for interrupt + configuration then the correct setting can be achieved on all Cortex-M + devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + scheduler. Note however that some vendor specific peripheral libraries + assume a non-zero priority group setting, in which cases using a value + of zero will result in unpredicable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM_CM3/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM_CM3/portmacro.h new file mode 100644 index 0000000..25a69a2 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM_CM3/portmacro.h @@ -0,0 +1,294 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 + +/* Constants used with memory barrier intrinsics. */ +#define portSY_FULL_READ_WRITE ( 15 ) + +/*-----------------------------------------------------------*/ + +/* Scheduler utilities. */ +#define portYIELD() \ +{ \ + /* Set a PendSV to request a context switch. */ \ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ + \ + /* Barriers are normally not required but do ensure the code is completely \ + within the specified behaviour for the architecture. */ \ + __dsb( portSY_FULL_READ_WRITE ); \ + __isb( portSY_FULL_READ_WRITE ); \ +} +/*-----------------------------------------------------------*/ + +#define portNVIC_INT_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed04 ) ) +#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) +#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired != pdFALSE ) portYIELD() +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); + +#define portDISABLE_INTERRUPTS() vPortRaiseBASEPRI() +#define portENABLE_INTERRUPTS() vPortSetBASEPRI( 0 ) +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() +#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortRaiseBASEPRI() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vPortSetBASEPRI(x) + +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ +#ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) +#endif +/*-----------------------------------------------------------*/ + +/* Port specific optimisations. */ +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) __clz( ( uxReadyPriorities ) ) ) + +#endif /* taskRECORD_READY_PRIORITY */ +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are +not necessary for to use this port. They are defined so the common demo files +(which build with all the ports) will build. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*-----------------------------------------------------------*/ + +#ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() +#endif + +/* portNOP() is not required by this port. */ +#define portNOP() + +#define portINLINE __inline + +#ifndef portFORCE_INLINE + #define portFORCE_INLINE __forceinline +#endif + +/*-----------------------------------------------------------*/ + +static portFORCE_INLINE void vPortSetBASEPRI( uint32_t ulBASEPRI ) +{ + __asm + { + /* Barrier instructions are not used as this function is only used to + lower the BASEPRI value. */ + msr basepri, ulBASEPRI + } +} +/*-----------------------------------------------------------*/ + +static portFORCE_INLINE void vPortRaiseBASEPRI( void ) +{ +uint32_t ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY; + + __asm + { + /* Set BASEPRI to the max syscall priority to effect a critical + section. */ + msr basepri, ulNewBASEPRI + dsb + isb + } +} +/*-----------------------------------------------------------*/ + +static portFORCE_INLINE void vPortClearBASEPRIFromISR( void ) +{ + __asm + { + /* Set BASEPRI to 0 so no interrupts are masked. This function is only + used to lower the mask in an interrupt, so memory barriers are not + used. */ + msr basepri, #0 + } +} +/*-----------------------------------------------------------*/ + +static portFORCE_INLINE uint32_t ulPortRaiseBASEPRI( void ) +{ +uint32_t ulReturn, ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY; + + __asm + { + /* Set BASEPRI to the max syscall priority to effect a critical + section. */ + mrs ulReturn, basepri + msr basepri, ulNewBASEPRI + dsb + isb + } + + return ulReturn; +} +/*-----------------------------------------------------------*/ + +static portFORCE_INLINE BaseType_t xPortIsInsideInterrupt( void ) +{ +uint32_t ulCurrentInterrupt; +BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. */ + __asm + { + mrs ulCurrentInterrupt, ipsr + } + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; +} + + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM_CM4F/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM_CM4F/port.c new file mode 100644 index 0000000..1dc1b5b --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM_CM4F/port.c @@ -0,0 +1,789 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the ARM CM4F port. + *----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#ifndef __TARGET_FPU_VFP + #error This port can only be used when the project options are configured to enable hardware floating point support. +#endif + +#if configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 + #error configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html +#endif + +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#else + /* The way the SysTick is clocked is not modified in case it is not the same + as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 0 ) +#endif + +/* The __weak attribute does not work as you might expect with the Keil tools +so the configOVERRIDE_DEFAULT_TICK_CONFIGURATION constant must be set to 1 if +the application writer wants to provide their own implementation of +vPortSetupTimerInterrupt(). Ensure configOVERRIDE_DEFAULT_TICK_CONFIGURATION +is defined. */ +#ifndef configOVERRIDE_DEFAULT_TICK_CONFIGURATION + #define configOVERRIDE_DEFAULT_TICK_CONFIGURATION 0 +#endif + +/* Constants required to manipulate the core. Registers first... */ +#define portNVIC_SYSTICK_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( * ( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( * ( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SYSPRI2_REG ( * ( ( volatile uint32_t * ) 0xe000ed20 ) ) +/* ...then bits in the registers. */ +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) + +/* Constants used to detect a Cortex-M7 r0p1 core, which should use the ARM_CM7 +r0p1 port. */ +#define portCPUID ( * ( ( volatile uint32_t * ) 0xE000ed00 ) ) +#define portCORTEX_M7_r0p1_ID ( 0x410FC271UL ) +#define portCORTEX_M7_r0p0_ID ( 0x410FC270UL ) + +#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( * ( ( volatile uint32_t * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */ +#define portVECTACTIVE_MASK ( 0xFFUL ) + +/* Constants required to manipulate the VFP. */ +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating point context control register. */ +#define portASPEN_AND_LSPEN_BITS ( 0x3UL << 30UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) +#define portINITIAL_EXEC_RETURN ( 0xfffffffd ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have +occurred while the SysTick counter is stopped during tickless idle +calculations. */ +#define portMISSED_COUNTS_FACTOR ( 45UL ) + +/* For strict compliance with the Cortex-M spec the task start address should +have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ +#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) + +/* Each task maintains its own interrupt status in the critical nesting +variable. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortPendSVHandler( void ); +void xPortSysTickHandler( void ); +void vPortSVCHandler( void ); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +static void prvStartFirstTask( void ); + +/* + * Functions defined in portasm.s to enable the VFP. + */ +static void prvEnableVFP( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* + * The number of SysTick increments that make up one tick period. + */ +#if configUSE_TICKLESS_IDLE == 1 + static uint32_t ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * The maximum number of tick periods that can be suppressed is limited by the + * 24 bit resolution of the SysTick timer. + */ +#if configUSE_TICKLESS_IDLE == 1 + static uint32_t xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Compensate for the CPU cycles that pass while the SysTick is stopped (low + * power functionality only. + */ +#if configUSE_TICKLESS_IDLE == 1 + static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static uint8_t ucMaxSysCallPriority = 0; + static uint32_t ulMaxPRIGROUPValue = 0; + static const volatile uint8_t * const pcInterruptPriorityRegisters = ( uint8_t * ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + interrupt. */ + + /* Offset added to account for the way the MCU uses the stack on entry/exit + of interrupts, and to ensure alignment. */ + pxTopOfStack--; + + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) prvTaskExitError; /* LR */ + + /* Save code space by skipping register initialisation. */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + + /* A save method is being used that requires each task to maintain its + own exec return value. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXEC_RETURN; + + pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + for( ;; ); +} +/*-----------------------------------------------------------*/ + +__asm void vPortSVCHandler( void ) +{ + PRESERVE8 + + /* Get the location of the current TCB. */ + ldr r3, =pxCurrentTCB + ldr r1, [r3] + ldr r0, [r1] + /* Pop the core registers. */ + ldmia r0!, {r4-r11, r14} + msr psp, r0 + isb + mov r0, #0 + msr basepri, r0 + bx r14 +} +/*-----------------------------------------------------------*/ + +__asm void prvStartFirstTask( void ) +{ + PRESERVE8 + + /* Use the NVIC offset register to locate the stack. */ + ldr r0, =0xE000ED08 + ldr r0, [r0] + ldr r0, [r0] + /* Set the msp back to the start of the stack. */ + msr msp, r0 + /* Globally enable interrupts. */ + cpsie i + cpsie f + dsb + isb + /* Call SVC to start the first task. */ + svc 0 + nop + nop +} +/*-----------------------------------------------------------*/ + +__asm void prvEnableVFP( void ) +{ + PRESERVE8 + + /* The FPU enable bits are in the CPACR. */ + ldr.w r0, =0xE000ED88 + ldr r1, [r0] + + /* Enable CP10 and CP11 coprocessors, then save back. */ + orr r1, r1, #( 0xf << 20 ) + str r1, [r0] + bx r14 + nop +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. + See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + + /* This port can be used on all revisions of the Cortex-M7 core other than + the r0p1 parts. r0p1 parts should use the port from the + /source/portable/GCC/ARM_CM7/r0p1 directory. */ + configASSERT( portCPUID != portCORTEX_M7_r0p1_ID ); + configASSERT( portCPUID != portCORTEX_M7_r0p0_ID ); + + #if( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( uint8_t * ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + functions can be called. ISR safe functions are those that end in + "FromISR". FreeRTOS maintains separate thread and ISR API functions to + ensure interrupt entry is as fast and simple as possible. + + Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* The kernel interrupt priority should be set to the lowest + priority. */ + configASSERT( ucMaxPriorityValue == ( configKERNEL_INTERRUPT_PRIORITY & ucMaxPriorityValue ) ); + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( uint8_t ) 0x01; + } + + /* Shift the priority group value back to its position within the AIRCR + register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* conifgASSERT_DEFINED */ + + /* Make PendSV and SysTick the lowest priority interrupts. */ + portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI; + portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Ensure the VFP is enabled - it should be anyway. */ + prvEnableVFP(); + + /* Lazy save always. */ + *( portFPCCR ) |= portASPEN_AND_LSPEN_BITS; + + /* Start the first task. */ + prvStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + assert() if it is being called from an interrupt context. Only API + functions that end in "FromISR" can be used in an interrupt. Only assert if + the critical nesting count is 1 to protect against recursive calls if the + assert function also uses a critical section. */ + if( uxCriticalNesting == 1 ) + { + configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +__asm void xPortPendSVHandler( void ) +{ + extern uxCriticalNesting; + extern pxCurrentTCB; + extern vTaskSwitchContext; + + PRESERVE8 + + mrs r0, psp + isb + /* Get the location of the current TCB. */ + ldr r3, =pxCurrentTCB + ldr r2, [r3] + + /* Is the task using the FPU context? If so, push high vfp registers. */ + tst r14, #0x10 + it eq + vstmdbeq r0!, {s16-s31} + + /* Save the core registers. */ + stmdb r0!, {r4-r11, r14} + + /* Save the new top of stack into the first member of the TCB. */ + str r0, [r2] + + stmdb sp!, {r3} + mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY + msr basepri, r0 + dsb + isb + bl vTaskSwitchContext + mov r0, #0 + msr basepri, r0 + ldmia sp!, {r3} + + /* The first item in pxCurrentTCB is the task top of stack. */ + ldr r1, [r3] + ldr r0, [r1] + + /* Pop the core registers. */ + ldmia r0!, {r4-r11, r14} + + /* Is the task using the FPU context? If so, pop the high vfp registers + too. */ + tst r14, #0x10 + it eq + vldmiaeq r0!, {s16-s31} + + msr psp, r0 + isb + #ifdef WORKAROUND_PMU_CM001 /* XMC4000 specific errata */ + #if WORKAROUND_PMU_CM001 == 1 + push { r14 } + pop { pc } + nop + #endif + #endif + + bx r14 +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + /* The SysTick runs at the lowest interrupt priority, so when this interrupt + executes all interrupts must be unmasked. There is therefore no need to + save and then restore the interrupt mask value as its value is already + known - therefore the slightly faster vPortRaiseBASEPRI() function is used + in place of portSET_INTERRUPT_MASK_FROM_ISR(). */ + vPortRaiseBASEPRI(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* A context switch is required. Context switching is performed in + the PendSV interrupt. Pend the PendSV interrupt. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + vPortClearBASEPRIFromISR(); +} +/*-----------------------------------------------------------*/ + +#if configUSE_TICKLESS_IDLE == 1 + + __weak void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickCTRL; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Stop the SysTick momentarily. The time the SysTick is stopped for + is accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG &= ~portNVIC_SYSTICK_ENABLE_BIT; + + /* Calculate the reload value required to wait xExpectedIdleTime + tick periods. -1 is used because this code will execute part way + through one of the tick periods. */ + ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + method as that will mask interrupts that should exit sleep mode. */ + __disable_irq(); + __dsb( portSY_FULL_READ_WRITE ); + __isb( portSY_FULL_READ_WRITE ); + + /* If a context switch is pending or a task is waiting for the scheduler + to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Restart from whatever is left in the count register to complete + this tick period. */ + portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Reset the reload register to the value required for normal tick + periods. */ + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + + /* Re-enable interrupts - see comments above __disable_irq() call + above. */ + __enable_irq(); + } + else + { + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + set its parameter to 0 to indicate that its implementation contains + its own wait for interrupt or wait for event instruction, and so wfi + should not be executed again. However, the original expected idle + time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + if( xModifiableIdleTime > 0 ) + { + __dsb( portSY_FULL_READ_WRITE ); + __wfi(); + __isb( portSY_FULL_READ_WRITE ); + } + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Stop SysTick. Again, the time the SysTick is stopped for is + accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + ulSysTickCTRL = portNVIC_SYSTICK_CTRL_REG; + portNVIC_SYSTICK_CTRL_REG = ( ulSysTickCTRL & ~portNVIC_SYSTICK_ENABLE_BIT ); + + /* Re-enable interrupts - see comments above __disable_irq() call + above. */ + __enable_irq(); + + if( ( ulSysTickCTRL & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt has already executed, and the SysTick + count reloaded with ulReloadValue. Reset the + portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick + period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + underflowed because the post sleep hook did something + that took too long. */ + if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* The tick interrupt handler will already have pended the tick + processing in the kernel. As the pending tick will be + processed as soon as this function exits, the tick value + maintained by the tick is stepped forward by one less than the + time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. + Work out how long the sleep lasted rounded to complete tick + periods (not the ulReload value which accounted for part + ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* How many complete tick periods passed while the processor + was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG + again, then set portNVIC_SYSTICK_LOAD_REG back to its standard + value. The critical section is used to ensure the tick interrupt + can only execute once in the case that the reload register is near + zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portENTER_CRITICAL(); + { + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + vTaskStepTick( ulCompleteTickPeriods ); + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + portEXIT_CRITICAL(); + } + } + +#endif /* #if configUSE_TICKLESS_IDLE */ + +/*-----------------------------------------------------------*/ + +/* + * Setup the SysTick timer to generate the tick interrupts at the required + * frequency. + */ +#if configOVERRIDE_DEFAULT_TICK_CONFIGURATION == 0 + + void vPortSetupTimerInterrupt( void ) + { + /* Calculate the constants required to configure the tick interrupt. */ + #if configUSE_TICKLESS_IDLE == 1 + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); + } + +#endif /* configOVERRIDE_DEFAULT_TICK_CONFIGURATION */ +/*-----------------------------------------------------------*/ + +__asm uint32_t vPortGetIPSR( void ) +{ + PRESERVE8 + + mrs r0, ipsr + bx r14 +} +/*-----------------------------------------------------------*/ + +#if( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + uint32_t ulCurrentInterrupt; + uint8_t ucCurrentPriority; + + /* Obtain the number of the currently executing interrupt. */ + ulCurrentInterrupt = vPortGetIPSR(); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + an interrupt that has been assigned a priority above + configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + function. ISR safe FreeRTOS API functions must *only* be called + from interrupts that have been assigned a priority at or below + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Numerically low interrupt priority numbers represent logically high + interrupt priorities, therefore the priority of the interrupt must + be set to a value equal to or numerically *higher* than + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Interrupts that use the FreeRTOS API must not be left at their + default priority of zero as that is the highest possible priority, + which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + and therefore also guaranteed to be invalid. + + FreeRTOS maintains separate thread and ISR API functions to ensure + interrupt entry is as fast and simple as possible. + + The following links provide detailed information: + http://www.freertos.org/RTOS-Cortex-M3-M4.html + http://www.freertos.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + that define each interrupt's priority to be split between bits that + define the interrupt's pre-emption priority bits and bits that define + the interrupt's sub-priority. For simplicity all bits must be defined + to be pre-emption priority bits. The following assertion will fail if + this is not the case (if some bits represent a sub-priority). + + If the application only uses CMSIS libraries for interrupt + configuration then the correct setting can be achieved on all Cortex-M + devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + scheduler. Note however that some vendor specific peripheral libraries + assume a non-zero priority group setting, in which cases using a value + of zero will result in unpredicable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM_CM4F/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM_CM4F/portmacro.h new file mode 100644 index 0000000..25a69a2 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM_CM4F/portmacro.h @@ -0,0 +1,294 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 + +/* Constants used with memory barrier intrinsics. */ +#define portSY_FULL_READ_WRITE ( 15 ) + +/*-----------------------------------------------------------*/ + +/* Scheduler utilities. */ +#define portYIELD() \ +{ \ + /* Set a PendSV to request a context switch. */ \ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ + \ + /* Barriers are normally not required but do ensure the code is completely \ + within the specified behaviour for the architecture. */ \ + __dsb( portSY_FULL_READ_WRITE ); \ + __isb( portSY_FULL_READ_WRITE ); \ +} +/*-----------------------------------------------------------*/ + +#define portNVIC_INT_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed04 ) ) +#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) +#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired != pdFALSE ) portYIELD() +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); + +#define portDISABLE_INTERRUPTS() vPortRaiseBASEPRI() +#define portENABLE_INTERRUPTS() vPortSetBASEPRI( 0 ) +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() +#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortRaiseBASEPRI() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vPortSetBASEPRI(x) + +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ +#ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) +#endif +/*-----------------------------------------------------------*/ + +/* Port specific optimisations. */ +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) __clz( ( uxReadyPriorities ) ) ) + +#endif /* taskRECORD_READY_PRIORITY */ +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are +not necessary for to use this port. They are defined so the common demo files +(which build with all the ports) will build. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*-----------------------------------------------------------*/ + +#ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() +#endif + +/* portNOP() is not required by this port. */ +#define portNOP() + +#define portINLINE __inline + +#ifndef portFORCE_INLINE + #define portFORCE_INLINE __forceinline +#endif + +/*-----------------------------------------------------------*/ + +static portFORCE_INLINE void vPortSetBASEPRI( uint32_t ulBASEPRI ) +{ + __asm + { + /* Barrier instructions are not used as this function is only used to + lower the BASEPRI value. */ + msr basepri, ulBASEPRI + } +} +/*-----------------------------------------------------------*/ + +static portFORCE_INLINE void vPortRaiseBASEPRI( void ) +{ +uint32_t ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY; + + __asm + { + /* Set BASEPRI to the max syscall priority to effect a critical + section. */ + msr basepri, ulNewBASEPRI + dsb + isb + } +} +/*-----------------------------------------------------------*/ + +static portFORCE_INLINE void vPortClearBASEPRIFromISR( void ) +{ + __asm + { + /* Set BASEPRI to 0 so no interrupts are masked. This function is only + used to lower the mask in an interrupt, so memory barriers are not + used. */ + msr basepri, #0 + } +} +/*-----------------------------------------------------------*/ + +static portFORCE_INLINE uint32_t ulPortRaiseBASEPRI( void ) +{ +uint32_t ulReturn, ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY; + + __asm + { + /* Set BASEPRI to the max syscall priority to effect a critical + section. */ + mrs ulReturn, basepri + msr basepri, ulNewBASEPRI + dsb + isb + } + + return ulReturn; +} +/*-----------------------------------------------------------*/ + +static portFORCE_INLINE BaseType_t xPortIsInsideInterrupt( void ) +{ +uint32_t ulCurrentInterrupt; +BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. */ + __asm + { + mrs ulCurrentInterrupt, ipsr + } + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; +} + + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM_CM4_MPU/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM_CM4_MPU/port.c new file mode 100644 index 0000000..bbe2a96 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM_CM4_MPU/port.c @@ -0,0 +1,845 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the ARM CM3 port. + *----------------------------------------------------------*/ + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining +all the API functions to use the MPU wrappers. That should only be done when +task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "queue.h" +#include "event_groups.h" +#include "mpu_prototypes.h" + +#ifndef __TARGET_FPU_VFP + #error This port can only be used when the project options are configured to enable hardware floating point support. +#endif + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Constants required to access and manipulate the NVIC. */ +#define portNVIC_SYSTICK_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( * ( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSPRI2_REG ( * ( ( volatile uint32_t * ) 0xe000ed20 ) ) +#define portNVIC_SYSPRI1_REG ( * ( ( volatile uint32_t * ) 0xe000ed1c ) ) +#define portNVIC_SYS_CTRL_STATE_REG ( * ( ( volatile uint32_t * ) 0xe000ed24 ) ) +#define portNVIC_MEM_FAULT_ENABLE ( 1UL << 16UL ) + +/* Constants required to access and manipulate the MPU. */ +#define portMPU_TYPE_REG ( * ( ( volatile uint32_t * ) 0xe000ed90 ) ) +#define portMPU_REGION_BASE_ADDRESS_REG ( * ( ( volatile uint32_t * ) 0xe000ed9C ) ) +#define portMPU_REGION_ATTRIBUTE_REG ( * ( ( volatile uint32_t * ) 0xe000edA0 ) ) +#define portMPU_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed94 ) ) +#define portEXPECTED_MPU_TYPE_VALUE ( 8UL << 8UL ) /* 8 regions, unified. */ +#define portMPU_ENABLE ( 0x01UL ) +#define portMPU_BACKGROUND_ENABLE ( 1UL << 2UL ) +#define portPRIVILEGED_EXECUTION_START_ADDRESS ( 0UL ) +#define portMPU_REGION_VALID ( 0x10UL ) +#define portMPU_REGION_ENABLE ( 0x01UL ) +#define portPERIPHERALS_START_ADDRESS 0x40000000UL +#define portPERIPHERALS_END_ADDRESS 0x5FFFFFFFUL + +/* Constants required to access and manipulate the SysTick. */ +#define portNVIC_SYSTICK_CLK ( 0x00000004UL ) +#define portNVIC_SYSTICK_INT ( 0x00000002UL ) +#define portNVIC_SYSTICK_ENABLE ( 0x00000001UL ) +#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) +#define portNVIC_SVC_PRI ( ( ( uint32_t ) configMAX_SYSCALL_INTERRUPT_PRIORITY - 1UL ) << 24UL ) + +/* Constants required to manipulate the VFP. */ +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34UL ) /* Floating point context control register. */ +#define portASPEN_AND_LSPEN_BITS ( 0x3UL << 30UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000UL ) +#define portINITIAL_EXEC_RETURN ( 0xfffffffdUL ) +#define portINITIAL_CONTROL_IF_UNPRIVILEGED ( 0x03 ) +#define portINITIAL_CONTROL_IF_PRIVILEGED ( 0x02 ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( * ( ( volatile uint32_t * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Offsets in the stack to the parameters when inside the SVC handler. */ +#define portOFFSET_TO_PC ( 6 ) + +/* For strict compliance with the Cortex-M spec the task start address should +have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ +#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) + +/* Each task maintains its own interrupt status in the critical nesting +variable. Note this is not saved as part of the task context as context +switches can only occur when uxCriticalNesting is zero. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* + * Setup the timer to generate the tick interrupts. + */ +static void prvSetupTimerInterrupt( void ) PRIVILEGED_FUNCTION; + +/* + * Configure a number of standard MPU regions that are used by all tasks. + */ +static void prvSetupMPU( void ) PRIVILEGED_FUNCTION; + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +static void prvStartFirstTask( void ) PRIVILEGED_FUNCTION; + +/* + * Return the smallest MPU region size that a given number of bytes will fit + * into. The region size is returned as the value that should be programmed + * into the region attribute register for that region. + */ +static uint32_t prvGetMPURegionSizeSetting( uint32_t ulActualSizeInBytes ) PRIVILEGED_FUNCTION; + +/* + * Checks to see if being called from the context of an unprivileged task, and + * if so raises the privilege level and returns false - otherwise does nothing + * other than return true. + */ +BaseType_t xPortRaisePrivilege( void ); + +/* + * Standard FreeRTOS exception handlers. + */ +void xPortPendSVHandler( void ) PRIVILEGED_FUNCTION; +void xPortSysTickHandler( void ) PRIVILEGED_FUNCTION; +void vPortSVCHandler( void ) PRIVILEGED_FUNCTION; + +/* + * Starts the scheduler by restoring the context of the first task to run. + */ +static void prvRestoreContextOfFirstTask( void ) PRIVILEGED_FUNCTION; + +/* + * C portion of the SVC handler. The SVC handler is split between an asm entry + * and a C wrapper for simplicity of coding and maintenance. + */ +void prvSVCHandler( uint32_t *pulRegisters ) __attribute__((used)) PRIVILEGED_FUNCTION; + +/* + * Function to enable the VFP. + */ +static void vPortEnableVFP( void ); + +/* + * Utility function. + */ +static uint32_t prvPortGetIPSR( void ); + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static uint8_t ucMaxSysCallPriority = 0; + static uint32_t ulMaxPRIGROUPValue = 0; + static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const uint8_t * ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters, BaseType_t xRunPrivileged ) +{ + /* Simulate the stack frame as it would be created by a context switch + interrupt. */ + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ + pxTopOfStack--; + *pxTopOfStack = 0; /* LR */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + + /* A save method is being used that requires each task to maintain its + own exec return value. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXEC_RETURN; + + pxTopOfStack -= 9; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + if( xRunPrivileged == pdTRUE ) + { + *pxTopOfStack = portINITIAL_CONTROL_IF_PRIVILEGED; + } + else + { + *pxTopOfStack = portINITIAL_CONTROL_IF_UNPRIVILEGED; + } + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +void prvSVCHandler( uint32_t *pulParam ) +{ +uint8_t ucSVCNumber; +uint32_t ulReg; + + /* The stack contains: r0, r1, r2, r3, r12, r14, the return address and + xPSR. The first argument (r0) is pulParam[ 0 ]. */ + ucSVCNumber = ( ( uint8_t * ) pulParam[ portOFFSET_TO_PC ] )[ -2 ]; + switch( ucSVCNumber ) + { + case portSVC_START_SCHEDULER : portNVIC_SYSPRI1_REG |= portNVIC_SVC_PRI; + prvRestoreContextOfFirstTask(); + break; + + case portSVC_YIELD : portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + /* Barriers are normally not required + but do ensure the code is completely + within the specified behaviour for the + architecture. */ + __asm volatile( "dsb" ); + __asm volatile( "isb" ); + + break; + + case portSVC_RAISE_PRIVILEGE : __asm + { + mrs ulReg, control /* Obtain current control value. */ + bic ulReg, #1 /* Set privilege bit. */ + msr control, ulReg /* Write back new control value. */ + } + break; + + default : /* Unknown SVC call. */ + break; + } +} +/*-----------------------------------------------------------*/ + +__asm void vPortSVCHandler( void ) +{ + extern prvSVCHandler + + PRESERVE8 + + /* Assumes psp was in use. */ + #ifndef USE_PROCESS_STACK /* Code should not be required if a main() is using the process stack. */ + tst lr, #4 + ite eq + mrseq r0, msp + mrsne r0, psp + #else + mrs r0, psp + #endif + b prvSVCHandler +} +/*-----------------------------------------------------------*/ + +__asm void prvRestoreContextOfFirstTask( void ) +{ + PRESERVE8 + + ldr r0, =0xE000ED08 /* Use the NVIC offset register to locate the stack. */ + ldr r0, [r0] + ldr r0, [r0] + msr msp, r0 /* Set the msp back to the start of the stack. */ + ldr r3, =pxCurrentTCB /* Restore the context. */ + ldr r1, [r3] + ldr r0, [r1] /* The first item in the TCB is the task top of stack. */ + add r1, r1, #4 /* Move onto the second item in the TCB... */ + ldr r2, =0xe000ed9c /* Region Base Address register. */ + ldmia r1!, {r4-r11} /* Read 4 sets of MPU registers. */ + stmia r2!, {r4-r11} /* Write 4 sets of MPU registers. */ + ldmia r0!, {r3-r11, r14} /* Pop the registers that are not automatically saved on exception entry. */ + msr control, r3 + msr psp, r0 /* Restore the task stack pointer. */ + mov r0, #0 + msr basepri, r0 + bx r14 + nop +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. See + http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + configASSERT( ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) ); + + #if( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + functions can be called. ISR safe functions are those that end in + "FromISR". FreeRTOS maintains separate thread and ISR API functions to + ensure interrupt entry is as fast and simple as possible. + + Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( uint8_t ) 0x01; + } + + /* Shift the priority group value back to its position within the AIRCR + register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* conifgASSERT_DEFINED */ + + /* Make PendSV and SysTick the same priority as the kernel, and the SVC + handler higher priority so it can be used to exit a critical section (where + lower priorities are masked). */ + portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI; + portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI; + + /* Configure the regions in the MPU that are common to all tasks. */ + prvSetupMPU(); + + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + prvSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Ensure the VFP is enabled - it should be anyway. */ + vPortEnableVFP(); + + /* Lazy save always. */ + *( portFPCCR ) |= portASPEN_AND_LSPEN_BITS; + + /* Start the first task. */ + prvStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +__asm void prvStartFirstTask( void ) +{ + PRESERVE8 + + ldr r0, =0xE000ED08 /* Use the NVIC offset register to locate the stack. */ + ldr r0, [r0] + ldr r0, [r0] + msr msp, r0 /* Set the msp back to the start of the stack. */ + cpsie i /* Globally enable interrupts. */ + cpsie f + dsb + isb + svc portSVC_START_SCHEDULER /* System call to start first task. */ + nop + nop +} + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + + vPortResetPrivilege( xRunningPrivileged ); +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ +BaseType_t xRunningPrivileged = xPortRaisePrivilege(); + + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } + vPortResetPrivilege( xRunningPrivileged ); +} +/*-----------------------------------------------------------*/ + +__asm void xPortPendSVHandler( void ) +{ + extern uxCriticalNesting; + extern pxCurrentTCB; + extern vTaskSwitchContext; + + PRESERVE8 + + mrs r0, psp + + ldr r3, =pxCurrentTCB /* Get the location of the current TCB. */ + ldr r2, [r3] + + tst r14, #0x10 /* Is the task using the FPU context? If so, push high vfp registers. */ + it eq + vstmdbeq r0!, {s16-s31} + + mrs r1, control + stmdb r0!, {r1, r4-r11, r14} /* Save the remaining registers. */ + str r0, [r2] /* Save the new top of stack into the first member of the TCB. */ + + stmdb sp!, {r3} + mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY + msr basepri, r0 + dsb + isb + bl vTaskSwitchContext + mov r0, #0 + msr basepri, r0 + ldmia sp!, {r3} + /* Restore the context. */ + ldr r1, [r3] + ldr r0, [r1] /* The first item in the TCB is the task top of stack. */ + add r1, r1, #4 /* Move onto the second item in the TCB... */ + ldr r2, =0xe000ed9c /* Region Base Address register. */ + ldmia r1!, {r4-r11} /* Read 4 sets of MPU registers. */ + stmia r2!, {r4-r11} /* Write 4 sets of MPU registers. */ + ldmia r0!, {r3-r11, r14} /* Pop the registers that are not automatically saved on exception entry. */ + msr control, r3 + + tst r14, #0x10 /* Is the task using the FPU context? If so, pop the high vfp registers too. */ + it eq + vldmiaeq r0!, {s16-s31} + + msr psp, r0 + bx r14 + nop +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ +uint32_t ulDummy; + + ulDummy = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Pend a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulDummy ); +} +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +static void prvSetupTimerInterrupt( void ) +{ + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK | portNVIC_SYSTICK_INT | portNVIC_SYSTICK_ENABLE; +} +/*-----------------------------------------------------------*/ + +__asm void vPortSwitchToUserMode( void ) +{ + PRESERVE8 + + mrs r0, control + orr r0, #1 + msr control, r0 + bx r14 +} +/*-----------------------------------------------------------*/ + +__asm void vPortEnableVFP( void ) +{ + PRESERVE8 + + ldr.w r0, =0xE000ED88 /* The FPU enable bits are in the CPACR. */ + ldr r1, [r0] + + orr r1, r1, #( 0xf << 20 ) /* Enable CP10 and CP11 coprocessors, then save back. */ + str r1, [r0] + bx r14 + nop + nop +} +/*-----------------------------------------------------------*/ + +static void prvSetupMPU( void ) +{ +extern uint32_t __privileged_functions_end__; +extern uint32_t __FLASH_segment_start__; +extern uint32_t __FLASH_segment_end__; +extern uint32_t __privileged_data_start__; +extern uint32_t __privileged_data_end__; + + /* Check the expected MPU is present. */ + if( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ) + { + /* First setup the entire flash for unprivileged read only access. */ + portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __FLASH_segment_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portUNPRIVILEGED_FLASH_REGION ); + + portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_READ_ONLY ) | + ( portMPU_REGION_CACHEABLE_BUFFERABLE ) | + ( prvGetMPURegionSizeSetting( ( uint32_t ) __FLASH_segment_end__ - ( uint32_t ) __FLASH_segment_start__ ) ) | + ( portMPU_REGION_ENABLE ); + + /* Setup the first 16K for privileged only access (even though less + than 10K is actually being used). This is where the kernel code is + placed. */ + portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __FLASH_segment_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portPRIVILEGED_FLASH_REGION ); + + portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_PRIVILEGED_READ_ONLY ) | + ( portMPU_REGION_CACHEABLE_BUFFERABLE ) | + ( prvGetMPURegionSizeSetting( ( uint32_t ) __privileged_functions_end__ - ( uint32_t ) __FLASH_segment_start__ ) ) | + ( portMPU_REGION_ENABLE ); + + /* Setup the privileged data RAM region. This is where the kernel data + is placed. */ + portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __privileged_data_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portPRIVILEGED_RAM_REGION ); + + portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_PRIVILEGED_READ_WRITE ) | + ( portMPU_REGION_CACHEABLE_BUFFERABLE ) | + prvGetMPURegionSizeSetting( ( uint32_t ) __privileged_data_end__ - ( uint32_t ) __privileged_data_start__ ) | + ( portMPU_REGION_ENABLE ); + + /* By default allow everything to access the general peripherals. The + system peripherals and registers are protected. */ + portMPU_REGION_BASE_ADDRESS_REG = ( portPERIPHERALS_START_ADDRESS ) | + ( portMPU_REGION_VALID ) | + ( portGENERAL_PERIPHERALS_REGION ); + + portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_READ_WRITE | portMPU_REGION_EXECUTE_NEVER ) | + ( prvGetMPURegionSizeSetting( portPERIPHERALS_END_ADDRESS - portPERIPHERALS_START_ADDRESS ) ) | + ( portMPU_REGION_ENABLE ); + + /* Enable the memory fault exception. */ + portNVIC_SYS_CTRL_STATE_REG |= portNVIC_MEM_FAULT_ENABLE; + + /* Enable the MPU with the background region configured. */ + portMPU_CTRL_REG |= ( portMPU_ENABLE | portMPU_BACKGROUND_ENABLE ); + } +} +/*-----------------------------------------------------------*/ + +static uint32_t prvGetMPURegionSizeSetting( uint32_t ulActualSizeInBytes ) +{ +uint32_t ulRegionSize, ulReturnValue = 4; + + /* 32 is the smallest region size, 31 is the largest valid value for + ulReturnValue. */ + for( ulRegionSize = 32UL; ulReturnValue < 31UL; ( ulRegionSize <<= 1UL ) ) + { + if( ulActualSizeInBytes <= ulRegionSize ) + { + break; + } + else + { + ulReturnValue++; + } + } + + /* Shift the code by one before returning so it can be written directly + into the the correct bit position of the attribute register. */ + return ( ulReturnValue << 1UL ); +} +/*-----------------------------------------------------------*/ + +__asm BaseType_t xPortRaisePrivilege( void ) +{ + mrs r0, control + tst r0, #1 /* Is the task running privileged? */ + itte ne + movne r0, #0 /* CONTROL[0]!=0, return false. */ + svcne portSVC_RAISE_PRIVILEGE /* Switch to privileged. */ + moveq r0, #1 /* CONTROL[0]==0, return true. */ + bx lr +} +/*-----------------------------------------------------------*/ + +void vPortStoreTaskMPUSettings( xMPU_SETTINGS *xMPUSettings, const struct xMEMORY_REGION * const xRegions, StackType_t *pxBottomOfStack, uint32_t ulStackDepth ) +{ +extern uint32_t __SRAM_segment_start__; +extern uint32_t __SRAM_segment_end__; +extern uint32_t __privileged_data_start__; +extern uint32_t __privileged_data_end__; + + +int32_t lIndex; +uint32_t ul; + + if( xRegions == NULL ) + { + /* No MPU regions are specified so allow access to all RAM. */ + xMPUSettings->xRegion[ 0 ].ulRegionBaseAddress = + ( ( uint32_t ) __SRAM_segment_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portSTACK_REGION ); + + xMPUSettings->xRegion[ 0 ].ulRegionAttribute = + ( portMPU_REGION_READ_WRITE ) | + ( portMPU_REGION_CACHEABLE_BUFFERABLE ) | + ( prvGetMPURegionSizeSetting( ( uint32_t ) __SRAM_segment_end__ - ( uint32_t ) __SRAM_segment_start__ ) ) | + ( portMPU_REGION_ENABLE ); + + /* Re-instate the privileged only RAM region as xRegion[ 0 ] will have + just removed the privileged only parameters. */ + xMPUSettings->xRegion[ 1 ].ulRegionBaseAddress = + ( ( uint32_t ) __privileged_data_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portSTACK_REGION + 1 ); + + xMPUSettings->xRegion[ 1 ].ulRegionAttribute = + ( portMPU_REGION_PRIVILEGED_READ_WRITE ) | + ( portMPU_REGION_CACHEABLE_BUFFERABLE ) | + prvGetMPURegionSizeSetting( ( uint32_t ) __privileged_data_end__ - ( uint32_t ) __privileged_data_start__ ) | + ( portMPU_REGION_ENABLE ); + + /* Invalidate all other regions. */ + for( ul = 2; ul <= portNUM_CONFIGURABLE_REGIONS; ul++ ) + { + xMPUSettings->xRegion[ ul ].ulRegionBaseAddress = ( portSTACK_REGION + ul ) | portMPU_REGION_VALID; + xMPUSettings->xRegion[ ul ].ulRegionAttribute = 0UL; + } + } + else + { + /* This function is called automatically when the task is created - in + which case the stack region parameters will be valid. At all other + times the stack parameters will not be valid and it is assumed that the + stack region has already been configured. */ + if( ulStackDepth > 0 ) + { + /* Define the region that allows access to the stack. */ + xMPUSettings->xRegion[ 0 ].ulRegionBaseAddress = + ( ( uint32_t ) pxBottomOfStack ) | + ( portMPU_REGION_VALID ) | + ( portSTACK_REGION ); /* Region number. */ + + xMPUSettings->xRegion[ 0 ].ulRegionAttribute = + ( portMPU_REGION_READ_WRITE ) | /* Read and write. */ + ( prvGetMPURegionSizeSetting( ulStackDepth * ( uint32_t ) sizeof( StackType_t ) ) ) | + ( portMPU_REGION_CACHEABLE_BUFFERABLE ) | + ( portMPU_REGION_ENABLE ); + } + + lIndex = 0; + + for( ul = 1; ul <= portNUM_CONFIGURABLE_REGIONS; ul++ ) + { + if( ( xRegions[ lIndex ] ).ulLengthInBytes > 0UL ) + { + /* Translate the generic region definition contained in + xRegions into the CM3 specific MPU settings that are then + stored in xMPUSettings. */ + xMPUSettings->xRegion[ ul ].ulRegionBaseAddress = + ( ( uint32_t ) xRegions[ lIndex ].pvBaseAddress ) | + ( portMPU_REGION_VALID ) | + ( portSTACK_REGION + ul ); /* Region number. */ + + xMPUSettings->xRegion[ ul ].ulRegionAttribute = + ( prvGetMPURegionSizeSetting( xRegions[ lIndex ].ulLengthInBytes ) ) | + ( xRegions[ lIndex ].ulParameters ) | + ( portMPU_REGION_ENABLE ); + } + else + { + /* Invalidate the region. */ + xMPUSettings->xRegion[ ul ].ulRegionBaseAddress = ( portSTACK_REGION + ul ) | portMPU_REGION_VALID; + xMPUSettings->xRegion[ ul ].ulRegionAttribute = 0UL; + } + + lIndex++; + } + } +} +/*-----------------------------------------------------------*/ + +__asm uint32_t prvPortGetIPSR( void ) +{ + PRESERVE8 + + mrs r0, ipsr + bx r14 +} +/*-----------------------------------------------------------*/ + +#if( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + uint32_t ulCurrentInterrupt; + uint8_t ucCurrentPriority; + + /* Obtain the number of the currently executing interrupt. */ + ulCurrentInterrupt = prvPortGetIPSR(); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + an interrupt that has been assigned a priority above + configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + function. ISR safe FreeRTOS API functions must *only* be called + from interrupts that have been assigned a priority at or below + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Numerically low interrupt priority numbers represent logically high + interrupt priorities, therefore the priority of the interrupt must + be set to a value equal to or numerically *higher* than + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Interrupts that use the FreeRTOS API must not be left at their + default priority of zero as that is the highest possible priority, + which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + and therefore also guaranteed to be invalid. + + FreeRTOS maintains separate thread and ISR API functions to ensure + interrupt entry is as fast and simple as possible. + + The following links provide detailed information: + http://www.freertos.org/RTOS-Cortex-M3-M4.html + http://www.freertos.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + that define each interrupt's priority to be split between bits that + define the interrupt's pre-emption priority bits and bits that define + the interrupt's sub-priority. For simplicity all bits must be defined + to be pre-emption priority bits. The following assertion will fail if + this is not the case (if some bits represent a sub-priority). + + If the application only uses CMSIS libraries for interrupt + configuration then the correct setting can be achieved on all Cortex-M + devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + scheduler. Note however that some vendor specific peripheral libraries + assume a non-zero priority group setting, in which cases using a value + of zero will result in unpredicable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM_CM4_MPU/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM_CM4_MPU/portmacro.h new file mode 100644 index 0000000..8d441ee --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM_CM4_MPU/portmacro.h @@ -0,0 +1,348 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* MPU specific constants. */ +#define portUSING_MPU_WRAPPERS 1 +#define portPRIVILEGE_BIT ( 0x80000000UL ) + +#define portMPU_REGION_READ_WRITE ( 0x03UL << 24UL ) +#define portMPU_REGION_PRIVILEGED_READ_ONLY ( 0x05UL << 24UL ) +#define portMPU_REGION_READ_ONLY ( 0x06UL << 24UL ) +#define portMPU_REGION_PRIVILEGED_READ_WRITE ( 0x01UL << 24UL ) +#define portMPU_REGION_CACHEABLE_BUFFERABLE ( 0x07UL << 16UL ) +#define portMPU_REGION_EXECUTE_NEVER ( 0x01UL << 28UL ) + +#define portUNPRIVILEGED_FLASH_REGION ( 0UL ) +#define portPRIVILEGED_FLASH_REGION ( 1UL ) +#define portPRIVILEGED_RAM_REGION ( 2UL ) +#define portGENERAL_PERIPHERALS_REGION ( 3UL ) +#define portSTACK_REGION ( 4UL ) +#define portFIRST_CONFIGURABLE_REGION ( 5UL ) +#define portLAST_CONFIGURABLE_REGION ( 7UL ) +#define portNUM_CONFIGURABLE_REGIONS ( ( portLAST_CONFIGURABLE_REGION - portFIRST_CONFIGURABLE_REGION ) + 1 ) +#define portTOTAL_NUM_REGIONS ( portNUM_CONFIGURABLE_REGIONS + 1 ) /* Plus one to make space for the stack region. */ + +void vPortSwitchToUserMode( void ); +#define portSWITCH_TO_USER_MODE() vPortSwitchToUserMode() + +typedef struct MPU_REGION_REGISTERS +{ + uint32_t ulRegionBaseAddress; + uint32_t ulRegionAttribute; +} xMPU_REGION_REGISTERS; + +/* Plus 1 to create space for the stack region. */ +typedef struct MPU_SETTINGS +{ + xMPU_REGION_REGISTERS xRegion[ portTOTAL_NUM_REGIONS ]; +} xMPU_SETTINGS; + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 + +/* Constants used with memory barrier intrinsics. */ +#define portSY_FULL_READ_WRITE ( 15 ) + +/*-----------------------------------------------------------*/ + +/* SVC numbers for various services. */ +#define portSVC_START_SCHEDULER 0 +#define portSVC_YIELD 1 +#define portSVC_RAISE_PRIVILEGE 2 + +/* Scheduler utilities. */ + +#define portYIELD() __asm{ SVC portSVC_YIELD } +#define portYIELD_WITHIN_API() \ +{ \ + /* Set a PendSV to request a context switch. */ \ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ + \ + /* Barriers are normally not required but do ensure the code is completely \ + within the specified behaviour for the architecture. */ \ + __dsb( portSY_FULL_READ_WRITE ); \ + __isb( portSY_FULL_READ_WRITE ); \ +} +/*-----------------------------------------------------------*/ + +#define portNVIC_INT_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed04 ) ) +#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) +#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); + +#define portDISABLE_INTERRUPTS() vPortRaiseBASEPRI() +#define portENABLE_INTERRUPTS() vPortSetBASEPRI(0) +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() +#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortRaiseBASEPRI() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vPortSetBASEPRI(x) + +/*-----------------------------------------------------------*/ + +/* Architecture specific optimisations. */ +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) __clz( ( uxReadyPriorities ) ) ) + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are +not necessary for to use this port. They are defined so the common demo files +(which build with all the ports) will build. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*-----------------------------------------------------------*/ + +#ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() +#endif + +/* portNOP() is not required by this port. */ +#define portNOP() + +#define portINLINE __inline + +#ifndef portFORCE_INLINE + #define portFORCE_INLINE __forceinline +#endif + +/*-----------------------------------------------------------*/ + +static portFORCE_INLINE void vPortSetBASEPRI( uint32_t ulBASEPRI ) +{ + __asm + { + /* Barrier instructions are not used as this function is only used to + lower the BASEPRI value. */ + msr basepri, ulBASEPRI + } +} +/*-----------------------------------------------------------*/ + +static portFORCE_INLINE void vPortRaiseBASEPRI( void ) +{ +uint32_t ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY; + + __asm + { + /* Set BASEPRI to the max syscall priority to effect a critical + section. */ + msr basepri, ulNewBASEPRI + dsb + isb + } +} +/*-----------------------------------------------------------*/ + +static portFORCE_INLINE void vPortClearBASEPRIFromISR( void ) +{ + __asm + { + /* Set BASEPRI to 0 so no interrupts are masked. This function is only + used to lower the mask in an interrupt, so memory barriers are not + used. */ + msr basepri, #0 + } +} +/*-----------------------------------------------------------*/ + +static portFORCE_INLINE uint32_t ulPortRaiseBASEPRI( void ) +{ +uint32_t ulReturn, ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY; + + __asm + { + /* Set BASEPRI to the max syscall priority to effect a critical + section. */ + mrs ulReturn, basepri + msr basepri, ulNewBASEPRI + dsb + isb + } + + return ulReturn; +} +/*-----------------------------------------------------------*/ + +static portFORCE_INLINE BaseType_t xPortIsInsideInterrupt( void ) +{ +uint32_t ulCurrentInterrupt; +BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. */ + __asm + { + mrs ulCurrentInterrupt, ipsr + } + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + +/* Set the privilege level to user mode if xRunningPrivileged is false. */ +portFORCE_INLINE static void vPortResetPrivilege( BaseType_t xRunningPrivileged ) +{ +uint32_t ulReg; + + if( xRunningPrivileged != pdTRUE ) + { + __asm + { + mrs ulReg, control + orr ulReg, #1 + msr control, ulReg + } + } +} +/*-----------------------------------------------------------*/ + + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM_CM7/ReadMe.txt b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM_CM7/ReadMe.txt new file mode 100644 index 0000000..b3950da --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM_CM7/ReadMe.txt @@ -0,0 +1,18 @@ +There are two options for running FreeRTOS on ARM Cortex-M7 microcontrollers. +The best option depends on the revision of the ARM Cortex-M7 core in use. The +revision is specified by an 'r' number, and a 'p' number, so will look something +like 'r0p1'. Check the documentation for the microcontroller in use to find the +revision of the Cortex-M7 core used in that microcontroller. If in doubt, use +the FreeRTOS port provided specifically for r0p1 revisions, as that can be used +with all core revisions. + +The first option is to use the ARM Cortex-M4F port, and the second option is to +use the Cortex-M7 r0p1 port - the latter containing a minor errata workaround. + +If the revision of the ARM Cortex-M7 core is not r0p1 then either option can be +used, but it is recommended to use the FreeRTOS ARM Cortex-M4F port located in +the /FreeRTOS/Source/portable/RVDS/ARM_CM4F directory. + +If the revision of the ARM Cortex-M7 core is r0p1 then use the FreeRTOS ARM +Cortex-M7 r0p1 port located in the /FreeRTOS/Source/portable/RVDS/ARM_CM7/r0p1 +directory. \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM_CM7/r0p1/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM_CM7/r0p1/port.c new file mode 100644 index 0000000..ef34402 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM_CM7/r0p1/port.c @@ -0,0 +1,775 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the ARM CM4F port. + *----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#ifndef __TARGET_FPU_VFP + #error This port can only be used when the project options are configured to enable hardware floating point support. +#endif + +#if configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 + #error configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html +#endif + +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#else + /* The way the SysTick is clocked is not modified in case it is not the same + as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 0 ) +#endif + +/* The __weak attribute does not work as you might expect with the Keil tools +so the configOVERRIDE_DEFAULT_TICK_CONFIGURATION constant must be set to 1 if +the application writer wants to provide their own implementation of +vPortSetupTimerInterrupt(). Ensure configOVERRIDE_DEFAULT_TICK_CONFIGURATION +is defined. */ +#ifndef configOVERRIDE_DEFAULT_TICK_CONFIGURATION + #define configOVERRIDE_DEFAULT_TICK_CONFIGURATION 0 +#endif + +/* Constants required to manipulate the core. Registers first... */ +#define portNVIC_SYSTICK_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( * ( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( * ( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SYSPRI2_REG ( * ( ( volatile uint32_t * ) 0xe000ed20 ) ) +/* ...then bits in the registers. */ +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) + +#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( * ( ( volatile uint32_t * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */ +#define portVECTACTIVE_MASK ( 0xFFUL ) + +/* Constants required to manipulate the VFP. */ +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating point context control register. */ +#define portASPEN_AND_LSPEN_BITS ( 0x3UL << 30UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) +#define portINITIAL_EXEC_RETURN ( 0xfffffffd ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have +occurred while the SysTick counter is stopped during tickless idle +calculations. */ +#define portMISSED_COUNTS_FACTOR ( 45UL ) + +/* For strict compliance with the Cortex-M spec the task start address should +have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ +#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) + +/* Each task maintains its own interrupt status in the critical nesting +variable. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortPendSVHandler( void ); +void xPortSysTickHandler( void ); +void vPortSVCHandler( void ); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +static void prvStartFirstTask( void ); + +/* + * Functions defined in portasm.s to enable the VFP. + */ +static void prvEnableVFP( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* + * The number of SysTick increments that make up one tick period. + */ +#if configUSE_TICKLESS_IDLE == 1 + static uint32_t ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * The maximum number of tick periods that can be suppressed is limited by the + * 24 bit resolution of the SysTick timer. + */ +#if configUSE_TICKLESS_IDLE == 1 + static uint32_t xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Compensate for the CPU cycles that pass while the SysTick is stopped (low + * power functionality only. + */ +#if configUSE_TICKLESS_IDLE == 1 + static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static uint8_t ucMaxSysCallPriority = 0; + static uint32_t ulMaxPRIGROUPValue = 0; + static const volatile uint8_t * const pcInterruptPriorityRegisters = ( uint8_t * ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + interrupt. */ + + /* Offset added to account for the way the MCU uses the stack on entry/exit + of interrupts, and to ensure alignment. */ + pxTopOfStack--; + + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) prvTaskExitError; /* LR */ + + /* Save code space by skipping register initialisation. */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + + /* A save method is being used that requires each task to maintain its + own exec return value. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXEC_RETURN; + + pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + for( ;; ); +} +/*-----------------------------------------------------------*/ + +__asm void vPortSVCHandler( void ) +{ + PRESERVE8 + + /* Get the location of the current TCB. */ + ldr r3, =pxCurrentTCB + ldr r1, [r3] + ldr r0, [r1] + /* Pop the core registers. */ + ldmia r0!, {r4-r11, r14} + msr psp, r0 + isb + mov r0, #0 + msr basepri, r0 + bx r14 +} +/*-----------------------------------------------------------*/ + +__asm void prvStartFirstTask( void ) +{ + PRESERVE8 + + /* Use the NVIC offset register to locate the stack. */ + ldr r0, =0xE000ED08 + ldr r0, [r0] + ldr r0, [r0] + /* Set the msp back to the start of the stack. */ + msr msp, r0 + /* Globally enable interrupts. */ + cpsie i + cpsie f + dsb + isb + /* Call SVC to start the first task. */ + svc 0 + nop + nop +} +/*-----------------------------------------------------------*/ + +__asm void prvEnableVFP( void ) +{ + PRESERVE8 + + /* The FPU enable bits are in the CPACR. */ + ldr.w r0, =0xE000ED88 + ldr r1, [r0] + + /* Enable CP10 and CP11 coprocessors, then save back. */ + orr r1, r1, #( 0xf << 20 ) + str r1, [r0] + bx r14 + nop +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + #if( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( uint8_t * ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + functions can be called. ISR safe functions are those that end in + "FromISR". FreeRTOS maintains separate thread and ISR API functions to + ensure interrupt entry is as fast and simple as possible. + + Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* The kernel interrupt priority should be set to the lowest + priority. */ + configASSERT( ucMaxPriorityValue == ( configKERNEL_INTERRUPT_PRIORITY & ucMaxPriorityValue ) ); + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( uint8_t ) 0x01; + } + + /* Shift the priority group value back to its position within the AIRCR + register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* conifgASSERT_DEFINED */ + + /* Make PendSV and SysTick the lowest priority interrupts. */ + portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI; + portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Ensure the VFP is enabled - it should be anyway. */ + prvEnableVFP(); + + /* Lazy save always. */ + *( portFPCCR ) |= portASPEN_AND_LSPEN_BITS; + + /* Start the first task. */ + prvStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + assert() if it is being called from an interrupt context. Only API + functions that end in "FromISR" can be used in an interrupt. Only assert if + the critical nesting count is 1 to protect against recursive calls if the + assert function also uses a critical section. */ + if( uxCriticalNesting == 1 ) + { + configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +__asm void xPortPendSVHandler( void ) +{ + extern uxCriticalNesting; + extern pxCurrentTCB; + extern vTaskSwitchContext; + + PRESERVE8 + + mrs r0, psp + isb + /* Get the location of the current TCB. */ + ldr r3, =pxCurrentTCB + ldr r2, [r3] + + /* Is the task using the FPU context? If so, push high vfp registers. */ + tst r14, #0x10 + it eq + vstmdbeq r0!, {s16-s31} + + /* Save the core registers. */ + stmdb r0!, {r4-r11, r14} + + /* Save the new top of stack into the first member of the TCB. */ + str r0, [r2] + + stmdb sp!, {r3} + mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY + cpsid i + msr basepri, r0 + dsb + isb + cpsie i + bl vTaskSwitchContext + mov r0, #0 + msr basepri, r0 + ldmia sp!, {r3} + + /* The first item in pxCurrentTCB is the task top of stack. */ + ldr r1, [r3] + ldr r0, [r1] + + /* Pop the core registers. */ + ldmia r0!, {r4-r11, r14} + + /* Is the task using the FPU context? If so, pop the high vfp registers + too. */ + tst r14, #0x10 + it eq + vldmiaeq r0!, {s16-s31} + + msr psp, r0 + isb + #ifdef WORKAROUND_PMU_CM001 /* XMC4000 specific errata */ + #if WORKAROUND_PMU_CM001 == 1 + push { r14 } + pop { pc } + nop + #endif + #endif + + bx r14 +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + /* The SysTick runs at the lowest interrupt priority, so when this interrupt + executes all interrupts must be unmasked. There is therefore no need to + save and then restore the interrupt mask value as its value is already + known - therefore the slightly faster vPortRaiseBASEPRI() function is used + in place of portSET_INTERRUPT_MASK_FROM_ISR(). */ + vPortRaiseBASEPRI(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* A context switch is required. Context switching is performed in + the PendSV interrupt. Pend the PendSV interrupt. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + vPortClearBASEPRIFromISR(); +} +/*-----------------------------------------------------------*/ + +#if configUSE_TICKLESS_IDLE == 1 + + __weak void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickCTRL; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Stop the SysTick momentarily. The time the SysTick is stopped for + is accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG &= ~portNVIC_SYSTICK_ENABLE_BIT; + + /* Calculate the reload value required to wait xExpectedIdleTime + tick periods. -1 is used because this code will execute part way + through one of the tick periods. */ + ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + method as that will mask interrupts that should exit sleep mode. */ + __disable_irq(); + __dsb( portSY_FULL_READ_WRITE ); + __isb( portSY_FULL_READ_WRITE ); + + /* If a context switch is pending or a task is waiting for the scheduler + to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Restart from whatever is left in the count register to complete + this tick period. */ + portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Reset the reload register to the value required for normal tick + periods. */ + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + + /* Re-enable interrupts - see comments above __disable_irq() call + above. */ + __enable_irq(); + } + else + { + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + set its parameter to 0 to indicate that its implementation contains + its own wait for interrupt or wait for event instruction, and so wfi + should not be executed again. However, the original expected idle + time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + if( xModifiableIdleTime > 0 ) + { + __dsb( portSY_FULL_READ_WRITE ); + __wfi(); + __isb( portSY_FULL_READ_WRITE ); + } + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Stop SysTick. Again, the time the SysTick is stopped for is + accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + ulSysTickCTRL = portNVIC_SYSTICK_CTRL_REG; + portNVIC_SYSTICK_CTRL_REG = ( ulSysTickCTRL & ~portNVIC_SYSTICK_ENABLE_BIT ); + + /* Re-enable interrupts - see comments above __disable_irq() call + above. */ + __enable_irq(); + + if( ( ulSysTickCTRL & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt has already executed, and the SysTick + count reloaded with ulReloadValue. Reset the + portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick + period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + underflowed because the post sleep hook did something + that took too long. */ + if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* The tick interrupt handler will already have pended the tick + processing in the kernel. As the pending tick will be + processed as soon as this function exits, the tick value + maintained by the tick is stepped forward by one less than the + time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. + Work out how long the sleep lasted rounded to complete tick + periods (not the ulReload value which accounted for part + ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* How many complete tick periods passed while the processor + was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG + again, then set portNVIC_SYSTICK_LOAD_REG back to its standard + value. The critical section is used to ensure the tick interrupt + can only execute once in the case that the reload register is near + zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portENTER_CRITICAL(); + { + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + vTaskStepTick( ulCompleteTickPeriods ); + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + portEXIT_CRITICAL(); + } + } + +#endif /* #if configUSE_TICKLESS_IDLE */ + +/*-----------------------------------------------------------*/ + +/* + * Setup the SysTick timer to generate the tick interrupts at the required + * frequency. + */ +#if configOVERRIDE_DEFAULT_TICK_CONFIGURATION == 0 + + void vPortSetupTimerInterrupt( void ) + { + /* Calculate the constants required to configure the tick interrupt. */ + #if configUSE_TICKLESS_IDLE == 1 + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); + } + +#endif /* configOVERRIDE_DEFAULT_TICK_CONFIGURATION */ +/*-----------------------------------------------------------*/ + +__asm uint32_t vPortGetIPSR( void ) +{ + PRESERVE8 + + mrs r0, ipsr + bx r14 +} +/*-----------------------------------------------------------*/ + +#if( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + uint32_t ulCurrentInterrupt; + uint8_t ucCurrentPriority; + + /* Obtain the number of the currently executing interrupt. */ + ulCurrentInterrupt = vPortGetIPSR(); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + an interrupt that has been assigned a priority above + configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + function. ISR safe FreeRTOS API functions must *only* be called + from interrupts that have been assigned a priority at or below + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Numerically low interrupt priority numbers represent logically high + interrupt priorities, therefore the priority of the interrupt must + be set to a value equal to or numerically *higher* than + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Interrupts that use the FreeRTOS API must not be left at their + default priority of zero as that is the highest possible priority, + which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + and therefore also guaranteed to be invalid. + + FreeRTOS maintains separate thread and ISR API functions to ensure + interrupt entry is as fast and simple as possible. + + The following links provide detailed information: + http://www.freertos.org/RTOS-Cortex-M3-M4.html + http://www.freertos.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + that define each interrupt's priority to be split between bits that + define the interrupt's pre-emption priority bits and bits that define + the interrupt's sub-priority. For simplicity all bits must be defined + to be pre-emption priority bits. The following assertion will fail if + this is not the case (if some bits represent a sub-priority). + + If the application only uses CMSIS libraries for interrupt + configuration then the correct setting can be achieved on all Cortex-M + devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + scheduler. Note however that some vendor specific peripheral libraries + assume a non-zero priority group setting, in which cases using a value + of zero will result in unpredicable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM_CM7/r0p1/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM_CM7/r0p1/portmacro.h new file mode 100644 index 0000000..a156240 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/RVDS/ARM_CM7/r0p1/portmacro.h @@ -0,0 +1,298 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 + +/* Constants used with memory barrier intrinsics. */ +#define portSY_FULL_READ_WRITE ( 15 ) + +/*-----------------------------------------------------------*/ + +/* Scheduler utilities. */ +#define portYIELD() \ +{ \ + /* Set a PendSV to request a context switch. */ \ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ + \ + /* Barriers are normally not required but do ensure the code is completely \ + within the specified behaviour for the architecture. */ \ + __dsb( portSY_FULL_READ_WRITE ); \ + __isb( portSY_FULL_READ_WRITE ); \ +} +/*-----------------------------------------------------------*/ + +#define portNVIC_INT_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed04 ) ) +#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) +#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired != pdFALSE ) portYIELD() +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); + +#define portDISABLE_INTERRUPTS() vPortRaiseBASEPRI() +#define portENABLE_INTERRUPTS() vPortSetBASEPRI( 0 ) +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() +#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortRaiseBASEPRI() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) vPortSetBASEPRI( x ) + +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ +#ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) +#endif +/*-----------------------------------------------------------*/ + +/* Port specific optimisations. */ +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) __clz( ( uxReadyPriorities ) ) ) + +#endif /* taskRECORD_READY_PRIORITY */ +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are +not necessary for to use this port. They are defined so the common demo files +(which build with all the ports) will build. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*-----------------------------------------------------------*/ + +#ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() +#endif + +/* portNOP() is not required by this port. */ +#define portNOP() + +#define portINLINE __inline + +#ifndef portFORCE_INLINE + #define portFORCE_INLINE __forceinline +#endif + +/*-----------------------------------------------------------*/ + +static portFORCE_INLINE void vPortSetBASEPRI( uint32_t ulBASEPRI ) +{ + __asm + { + /* Barrier instructions are not used as this function is only used to + lower the BASEPRI value. */ + msr basepri, ulBASEPRI + } +} +/*-----------------------------------------------------------*/ + +static portFORCE_INLINE void vPortRaiseBASEPRI( void ) +{ +uint32_t ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY; + + __asm + { + /* Set BASEPRI to the max syscall priority to effect a critical + section. */ + cpsid i + msr basepri, ulNewBASEPRI + dsb + isb + cpsie i + } +} +/*-----------------------------------------------------------*/ + +static portFORCE_INLINE void vPortClearBASEPRIFromISR( void ) +{ + __asm + { + /* Set BASEPRI to 0 so no interrupts are masked. This function is only + used to lower the mask in an interrupt, so memory barriers are not + used. */ + msr basepri, #0 + } +} +/*-----------------------------------------------------------*/ + +static portFORCE_INLINE uint32_t ulPortRaiseBASEPRI( void ) +{ +uint32_t ulReturn, ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY; + + __asm + { + /* Set BASEPRI to the max syscall priority to effect a critical + section. */ + mrs ulReturn, basepri + cpsid i + msr basepri, ulNewBASEPRI + dsb + isb + cpsie i + } + + return ulReturn; +} +/*-----------------------------------------------------------*/ + +static portFORCE_INLINE BaseType_t xPortIsInsideInterrupt( void ) +{ +uint32_t ulCurrentInterrupt; +BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. */ + __asm + { + mrs ulCurrentInterrupt, ipsr + } + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; +} + + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Renesas/RX100/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Renesas/RX100/port.c new file mode 100644 index 0000000..4acc091 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Renesas/RX100/port.c @@ -0,0 +1,688 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the RX100 port. + *----------------------------------------------------------*/ + +/* Standard C includes. */ +#include "limits.h" + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Library includes. */ +#include "string.h" + +/* Hardware specifics. */ +#include "iodefine.h" + +/*-----------------------------------------------------------*/ + +/* Tasks should start with interrupts enabled and in Supervisor mode, therefore +PSW is set with U and I set, and PM and IPL clear. */ +#define portINITIAL_PSW ( ( StackType_t ) 0x00030000 ) + +/* The peripheral clock is divided by this value before being supplying the +CMT. */ +#if ( configUSE_TICKLESS_IDLE == 0 ) + /* If tickless idle is not used then the divisor can be fixed. */ + #define portCLOCK_DIVISOR 8UL +#elif ( configPERIPHERAL_CLOCK_HZ >= 12000000 ) + #define portCLOCK_DIVISOR 512UL +#elif ( configPERIPHERAL_CLOCK_HZ >= 6000000 ) + #define portCLOCK_DIVISOR 128UL +#elif ( configPERIPHERAL_CLOCK_HZ >= 1000000 ) + #define portCLOCK_DIVISOR 32UL +#else + #define portCLOCK_DIVISOR 8UL +#endif + + +/* Keys required to lock and unlock access to certain system registers +respectively. */ +#define portUNLOCK_KEY 0xA50B +#define portLOCK_KEY 0xA500 + +/*-----------------------------------------------------------*/ + +/* The following lines are to ensure vSoftwareInterruptEntry can be referenced, + and therefore installed in the vector table, when the FreeRTOS code is built +as a library. */ +extern BaseType_t vSoftwareInterruptEntry; +const BaseType_t * p_vSoftwareInterruptEntry = &vSoftwareInterruptEntry; + +/*-----------------------------------------------------------*/ + +/* + * Function to start the first task executing - written in asm code as direct + * access to registers is required. + */ +static void prvStartFirstTask( void ); + +/* + * Software interrupt handler. Performs the actual context switch (saving and + * restoring of registers). Written in asm code as direct register access is + * required. + */ +static void prvYieldHandler( void ); + +/* + * The entry point for the software interrupt handler. This is the function + * that calls the inline asm function prvYieldHandler(). It is installed in + * the vector table, but the code that installs it is in prvYieldHandler rather + * than using a #pragma. + */ +void vSoftwareInterruptISR( void ); + +/* + * Sets up the periodic ISR used for the RTOS tick using the CMT. + * The application writer can define configSETUP_TICK_INTERRUPT() (in + * FreeRTOSConfig.h) such that their own tick interrupt configuration is used + * in place of prvSetupTimerInterrupt(). + */ +static void prvSetupTimerInterrupt( void ); +#ifndef configSETUP_TICK_INTERRUPT + /* The user has not provided their own tick interrupt configuration so use + the definition in this file (which uses the interval timer). */ + #define configSETUP_TICK_INTERRUPT() prvSetupTimerInterrupt() +#endif /* configSETUP_TICK_INTERRUPT */ + +/* + * Called after the sleep mode registers have been configured, prvSleep() + * executes the pre and post sleep macros, and actually calls the wait + * instruction. + */ +#if configUSE_TICKLESS_IDLE == 1 + static void prvSleep( TickType_t xExpectedIdleTime ); +#endif /* configUSE_TICKLESS_IDLE */ + +/*-----------------------------------------------------------*/ + +/* These is accessed by the inline assembler functions. */ +extern void *pxCurrentTCB; +extern void vTaskSwitchContext( void ); + +/*-----------------------------------------------------------*/ + +/* Calculate how many clock increments make up a single tick period. */ +static const uint32_t ulMatchValueForOneTick = ( ( configPERIPHERAL_CLOCK_HZ / portCLOCK_DIVISOR ) / configTICK_RATE_HZ ); + +#if configUSE_TICKLESS_IDLE == 1 + + /* Holds the maximum number of ticks that can be suppressed - which is + basically how far into the future an interrupt can be generated. Set + during initialisation. This is the maximum possible value that the + compare match register can hold divided by ulMatchValueForOneTick. */ + static const TickType_t xMaximumPossibleSuppressedTicks = USHRT_MAX / ( ( configPERIPHERAL_CLOCK_HZ / portCLOCK_DIVISOR ) / configTICK_RATE_HZ ); + + /* Flag set from the tick interrupt to allow the sleep processing to know if + sleep mode was exited because of a tick interrupt, or an interrupt + generated by something else. */ + static volatile uint32_t ulTickFlag = pdFALSE; + + /* The CMT counter is stopped temporarily each time it is re-programmed. + The following constant offsets the CMT counter match value by the number of + CMT counts that would typically be missed while the counter was stopped to + compensate for the lost time. The large difference between the divided CMT + clock and the CPU clock means it is likely ulStoppedTimerCompensation will + equal zero - and be optimised away. */ + static const uint32_t ulStoppedTimerCompensation = 100UL / ( configCPU_CLOCK_HZ / ( configPERIPHERAL_CLOCK_HZ / portCLOCK_DIVISOR ) ); + +#endif + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Offset to end up on 8 byte boundary. */ + pxTopOfStack--; + + /* R0 is not included as it is the stack pointer. */ + *pxTopOfStack = 0x00; + pxTopOfStack--; + *pxTopOfStack = 0x00; + pxTopOfStack--; + *pxTopOfStack = portINITIAL_PSW; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; + + /* When debugging it can be useful if every register is set to a known + value. Otherwise code space can be saved by just setting the registers + that need to be set. */ + #ifdef USE_FULL_REGISTER_INITIALISATION + { + pxTopOfStack--; + *pxTopOfStack = 0x12345678; /* r15. */ + pxTopOfStack--; + *pxTopOfStack = 0xaaaabbbb; + pxTopOfStack--; + *pxTopOfStack = 0xdddddddd; + pxTopOfStack--; + *pxTopOfStack = 0xcccccccc; + pxTopOfStack--; + *pxTopOfStack = 0xbbbbbbbb; + pxTopOfStack--; + *pxTopOfStack = 0xaaaaaaaa; + pxTopOfStack--; + *pxTopOfStack = 0x99999999; + pxTopOfStack--; + *pxTopOfStack = 0x88888888; + pxTopOfStack--; + *pxTopOfStack = 0x77777777; + pxTopOfStack--; + *pxTopOfStack = 0x66666666; + pxTopOfStack--; + *pxTopOfStack = 0x55555555; + pxTopOfStack--; + *pxTopOfStack = 0x44444444; + pxTopOfStack--; + *pxTopOfStack = 0x33333333; + pxTopOfStack--; + *pxTopOfStack = 0x22222222; + pxTopOfStack--; + } + #else + { + /* Leave space for the registers that will get popped from the stack + when the task first starts executing. */ + pxTopOfStack -= 15; + } + #endif + + *pxTopOfStack = ( StackType_t ) pvParameters; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = 0x12345678; /* Accumulator. */ + pxTopOfStack--; + *pxTopOfStack = 0x87654321; /* Accumulator. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* Use pxCurrentTCB just so it does not get optimised away. */ + if( pxCurrentTCB != NULL ) + { + /* Call an application function to set up the timer that will generate + the tick interrupt. This way the application can decide which + peripheral to use. If tickless mode is used then the default + implementation defined in this file (which uses CMT0) should not be + overridden. */ + configSETUP_TICK_INTERRUPT(); + + /* Enable the software interrupt. */ + _IEN( _ICU_SWINT ) = 1; + + /* Ensure the software interrupt is clear. */ + _IR( _ICU_SWINT ) = 0; + + /* Ensure the software interrupt is set to the kernel priority. */ + _IPR( _ICU_SWINT ) = configKERNEL_INTERRUPT_PRIORITY; + + /* Start the first task. */ + prvStartFirstTask(); + } + + /* Execution should not reach here as the tasks are now running! + prvSetupTimerInterrupt() is called here to prevent the compiler outputting + a warning about a statically declared function not being referenced in the + case that the application writer has provided their own tick interrupt + configuration routine (and defined configSETUP_TICK_INTERRUPT() such that + their own routine will be called in place of prvSetupTimerInterrupt()). */ + prvSetupTimerInterrupt(); + + /* Just to make sure the function is not optimised away. */ + ( void ) vSoftwareInterruptISR(); + + /* Should not get here. */ + return pdFAIL; +} +/*-----------------------------------------------------------*/ + +#pragma inline_asm prvStartFirstTask +static void prvStartFirstTask( void ) +{ + /* When starting the scheduler there is nothing that needs moving to the + interrupt stack because the function is not called from an interrupt. + Just ensure the current stack is the user stack. */ + SETPSW U + + /* Obtain the location of the stack associated with which ever task + pxCurrentTCB is currently pointing to. */ + MOV.L #_pxCurrentTCB, R15 + MOV.L [R15], R15 + MOV.L [R15], R0 + + /* Restore the registers from the stack of the task pointed to by + pxCurrentTCB. */ + POP R15 + MVTACLO R15 /* Accumulator low 32 bits. */ + POP R15 + MVTACHI R15 /* Accumulator high 32 bits. */ + POPM R1-R15 /* R1 to R15 - R0 is not included as it is the SP. */ + RTE /* This pops the remaining registers. */ + NOP + NOP +} +/*-----------------------------------------------------------*/ + +#pragma interrupt ( prvTickISR( vect = configTICK_VECTOR, enable ) ) +void prvTickISR( void ) +{ + /* Increment the tick, and perform any processing the new tick value + necessitates. */ + set_ipl( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + { + if( xTaskIncrementTick() != pdFALSE ) + { + taskYIELD(); + } + } + set_ipl( configKERNEL_INTERRUPT_PRIORITY ); + + #if configUSE_TICKLESS_IDLE == 1 + { + /* The CPU woke because of a tick. */ + ulTickFlag = pdTRUE; + + /* If this is the first tick since exiting tickless mode then the CMT + compare match value needs resetting. */ + CMT0.CMCOR = ( uint16_t ) ulMatchValueForOneTick; + } + #endif +} +/*-----------------------------------------------------------*/ + +void vSoftwareInterruptISR( void ) +{ + prvYieldHandler(); +} +/*-----------------------------------------------------------*/ + +#pragma inline_asm prvYieldHandler +static void prvYieldHandler( void ) +{ + /* Re-enable interrupts. */ + SETPSW I + + /* Move the data that was automatically pushed onto the interrupt stack + when the interrupt occurred from the interrupt stack to the user stack. + + R15 is saved before it is clobbered. */ + PUSH.L R15 + + /* Read the user stack pointer. */ + MVFC USP, R15 + + /* Move the address down to the data being moved. */ + SUB #12, R15 + MVTC R15, USP + + /* Copy the data across. */ + MOV.L [ R0 ], [ R15 ] ; R15 + MOV.L 4[ R0 ], 4[ R15 ] ; PC + MOV.L 8[ R0 ], 8[ R15 ] ; PSW + + /* Move the interrupt stack pointer to its new correct position. */ + ADD #12, R0 + + /* All the rest of the registers are saved directly to the user stack. */ + SETPSW U + + /* Save the rest of the general registers (R15 has been saved already). */ + PUSHM R1-R14 + + /* Save the accumulator. */ + MVFACHI R15 + PUSH.L R15 + MVFACMI R15 ; Middle order word. + SHLL #16, R15 ; Shifted left as it is restored to the low order word. + PUSH.L R15 + + /* Save the stack pointer to the TCB. */ + MOV.L #_pxCurrentTCB, R15 + MOV.L [ R15 ], R15 + MOV.L R0, [ R15 ] + + /* Ensure the interrupt mask is set to the syscall priority while the + kernel structures are being accessed. */ + MVTIPL #configMAX_SYSCALL_INTERRUPT_PRIORITY + + /* Select the next task to run. */ + BSR.A _vTaskSwitchContext + + /* Reset the interrupt mask as no more data structure access is + required. */ + MVTIPL #configKERNEL_INTERRUPT_PRIORITY + + /* Load the stack pointer of the task that is now selected as the Running + state task from its TCB. */ + MOV.L #_pxCurrentTCB,R15 + MOV.L [ R15 ], R15 + MOV.L [ R15 ], R0 + + /* Restore the context of the new task. The PSW (Program Status Word) and + PC will be popped by the RTE instruction. */ + POP R15 + MVTACLO R15 + POP R15 + MVTACHI R15 + POPM R1-R15 + RTE + NOP + NOP +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( pxCurrentTCB == NULL ); + + /* The following line is just to prevent the symbol getting optimised away. */ + ( void ) vTaskSwitchContext(); +} +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt( void ) +{ + /* Unlock. */ + SYSTEM.PRCR.WORD = portUNLOCK_KEY; + + /* Enable CMT0. */ + MSTP( CMT0 ) = 0; + + /* Lock again. */ + SYSTEM.PRCR.WORD = portLOCK_KEY; + + /* Interrupt on compare match. */ + CMT0.CMCR.BIT.CMIE = 1; + + /* Set the compare match value. */ + CMT0.CMCOR = ( uint16_t ) ulMatchValueForOneTick; + + /* Divide the PCLK. */ + #if portCLOCK_DIVISOR == 512 + { + CMT0.CMCR.BIT.CKS = 3; + } + #elif portCLOCK_DIVISOR == 128 + { + CMT0.CMCR.BIT.CKS = 2; + } + #elif portCLOCK_DIVISOR == 32 + { + CMT0.CMCR.BIT.CKS = 1; + } + #elif portCLOCK_DIVISOR == 8 + { + CMT0.CMCR.BIT.CKS = 0; + } + #else + { + #error Invalid portCLOCK_DIVISOR setting + } + #endif + + + /* Enable the interrupt... */ + _IEN( _CMT0_CMI0 ) = 1; + + /* ...and set its priority to the application defined kernel priority. */ + _IPR( _CMT0_CMI0 ) = configKERNEL_INTERRUPT_PRIORITY; + + /* Start the timer. */ + CMT.CMSTR0.BIT.STR0 = 1; +} +/*-----------------------------------------------------------*/ + +#if configUSE_TICKLESS_IDLE == 1 + + static void prvSleep( TickType_t xExpectedIdleTime ) + { + /* Allow the application to define some pre-sleep processing. */ + configPRE_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* xExpectedIdleTime being set to 0 by configPRE_SLEEP_PROCESSING() + means the application defined code has already executed the WAIT + instruction. */ + if( xExpectedIdleTime > 0 ) + { + wait(); + } + + /* Allow the application to define some post sleep processing. */ + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + } + +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +#if configUSE_TICKLESS_IDLE == 1 + + void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulMatchValue, ulCompleteTickPeriods, ulCurrentCount; + eSleepModeStatus eSleepAction; + + /* THIS FUNCTION IS CALLED WITH THE SCHEDULER SUSPENDED. */ + + /* Make sure the CMT reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Calculate the reload value required to wait xExpectedIdleTime tick + periods. */ + ulMatchValue = ulMatchValueForOneTick * xExpectedIdleTime; + if( ulMatchValue > ulStoppedTimerCompensation ) + { + /* Compensate for the fact that the CMT is going to be stopped + momentarily. */ + ulMatchValue -= ulStoppedTimerCompensation; + } + + /* Stop the CMT momentarily. The time the CMT is stopped for is + accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + CMT.CMSTR0.BIT.STR0 = 0; + while( CMT.CMSTR0.BIT.STR0 == 1 ) + { + /* Nothing to do here. */ + } + + /* Critical section using the global interrupt bit as the i bit is + automatically reset by the WAIT instruction. */ + clrpsw_i(); + + /* The tick flag is set to false before sleeping. If it is true when + sleep mode is exited then sleep mode was probably exited because the + tick was suppressed for the entire xExpectedIdleTime period. */ + ulTickFlag = pdFALSE; + + /* If a context switch is pending then abandon the low power entry as + the context switch might have been pended by an external interrupt that + requires processing. */ + eSleepAction = eTaskConfirmSleepModeStatus(); + if( eSleepAction == eAbortSleep ) + { + /* Restart tick. */ + CMT.CMSTR0.BIT.STR0 = 1; + setpsw_i(); + } + else if( eSleepAction == eNoTasksWaitingTimeout ) + { + /* Protection off. */ + SYSTEM.PRCR.WORD = portUNLOCK_KEY; + + /* Ready for software standby with all clocks stopped. */ + SYSTEM.SBYCR.BIT.SSBY = 1; + + /* Protection on. */ + SYSTEM.PRCR.WORD = portLOCK_KEY; + + /* Sleep until something happens. Calling prvSleep() will + automatically reset the i bit in the PSW. */ + prvSleep( xExpectedIdleTime ); + + /* Restart the CMT. */ + CMT.CMSTR0.BIT.STR0 = 1; + } + else + { + /* Protection off. */ + SYSTEM.PRCR.WORD = portUNLOCK_KEY; + + /* Ready for deep sleep mode. */ + SYSTEM.MSTPCRC.BIT.DSLPE = 1; + SYSTEM.MSTPCRA.BIT.MSTPA28 = 1; + SYSTEM.SBYCR.BIT.SSBY = 0; + + /* Protection on. */ + SYSTEM.PRCR.WORD = portLOCK_KEY; + + /* Adjust the match value to take into account that the current + time slice is already partially complete. */ + ulMatchValue -= ( uint32_t ) CMT0.CMCNT; + CMT0.CMCOR = ( uint16_t ) ulMatchValue; + + /* Restart the CMT to count up to the new match value. */ + CMT0.CMCNT = 0; + CMT.CMSTR0.BIT.STR0 = 1; + + /* Sleep until something happens. Calling prvSleep() will + automatically reset the i bit in the PSW. */ + prvSleep( xExpectedIdleTime ); + + /* Stop CMT. Again, the time the SysTick is stopped for is + accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + CMT.CMSTR0.BIT.STR0 = 0; + while( CMT.CMSTR0.BIT.STR0 == 1 ) + { + /* Nothing to do here. */ + } + + ulCurrentCount = ( uint32_t ) CMT0.CMCNT; + + if( ulTickFlag != pdFALSE ) + { + /* The tick interrupt has already executed, although because + this function is called with the scheduler suspended the actual + tick processing will not occur until after this function has + exited. Reset the match value with whatever remains of this + tick period. */ + ulMatchValue = ulMatchValueForOneTick - ulCurrentCount; + CMT0.CMCOR = ( uint16_t ) ulMatchValue; + + /* The tick interrupt handler will already have pended the tick + processing in the kernel. As the pending tick will be + processed as soon as this function exits, the tick value + maintained by the tick is stepped forward by one less than the + time spent sleeping. The actual stepping of the tick appears + later in this function. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. + How many complete tick periods passed while the processor was + sleeping? */ + ulCompleteTickPeriods = ulCurrentCount / ulMatchValueForOneTick; + + /* The match value is set to whatever fraction of a single tick + period remains. */ + ulMatchValue = ulCurrentCount - ( ulCompleteTickPeriods * ulMatchValueForOneTick ); + CMT0.CMCOR = ( uint16_t ) ulMatchValue; + } + + /* Restart the CMT so it runs up to the match value. The match value + will get set to the value required to generate exactly one tick period + the next time the CMT interrupt executes. */ + CMT0.CMCNT = 0; + CMT.CMSTR0.BIT.STR0 = 1; + + /* Wind the tick forward by the number of tick periods that the CPU + remained in a low power state. */ + vTaskStepTick( ulCompleteTickPeriods ); + } + } + +#endif /* configUSE_TICKLESS_IDLE */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Renesas/RX100/port_asm.src b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Renesas/RX100/port_asm.src new file mode 100644 index 0000000..e1b89ae --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Renesas/RX100/port_asm.src @@ -0,0 +1,68 @@ +;/* +; FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. +; All rights reserved +; +; +; *************************************************************************** +; * * +; * FreeRTOS tutorial books are available in pdf and paperback. * +; * Complete, revised, and edited pdf reference manuals are also * +; * available. * +; * * +; * Purchasing FreeRTOS documentation will not only help you, by * +; * ensuring you get running as quickly as possible and with an * +; * in-depth knowledge of how to use FreeRTOS, it will also help * +; * the FreeRTOS project to continue with its mission of providing * +; * professional grade, cross platform, de facto standard solutions * +; * for microcontrollers - completely free of charge! * +; * * +; * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * +; * * +; * Thank you for using FreeRTOS, and thank you for your support! * +; * * +; *************************************************************************** +; +; +; This file is part of the FreeRTOS distribution. +; +; FreeRTOS is free software; you can redistribute it and/or modify it under +; the terms of the GNU General Public License (version 2) as published by the +; Free Software Foundation AND MODIFIED BY the FreeRTOS exception. +; >>>NOTE<<< The modification to the GPL is included to allow you to +; distribute a combined work that includes FreeRTOS without being obliged to +; provide the source code for proprietary components outside of the FreeRTOS +; kernel. FreeRTOS is distributed in the hope that it will be useful, but +; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +; more details. You should have received a copy of the GNU General Public +; License and the FreeRTOS license exception along with FreeRTOS; if not it +; can be viewed here: http://www.freertos.org/a00114.html and also obtained +; by writing to Richard Barry, contact details for whom are available on the +; FreeRTOS WEB site. +; +; 1 tab == 4 spaces! +; +; http://www.FreeRTOS.org - Documentation, latest information, license and +; contact details. +; +; http://www.SafeRTOS.com - A version that is certified for use in safety +; critical systems. +; +; http://www.OpenRTOS.com - Commercial support, development, porting, +; licensing and training services. +;*/ + .GLB _vSoftwareInterruptISR + .GLB _vSoftwareInterruptEntry + + .SECTION P,CODE + +_vSoftwareInterruptEntry: + + BRA _vSoftwareInterruptISR + + .RVECTOR 27, _vSoftwareInterruptEntry + + .END + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Renesas/RX100/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Renesas/RX100/portmacro.h new file mode 100644 index 0000000..da0ea12 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Renesas/RX100/portmacro.h @@ -0,0 +1,193 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Hardware specifics. */ +#include "machine.h" + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions - these are a bit legacy and not really used now, other +than portSTACK_TYPE and portBASE_TYPE. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 8 /* Could make four, according to manual. */ +#define portSTACK_GROWTH -1 +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portNOP() nop() + +#pragma inline_asm vPortYield +static void vPortYield( void ) +{ + /* Save clobbered register - may not actually be necessary if inline asm + functions are considered to use the same rules as function calls by the + compiler. */ + PUSH.L R5 + /* Set ITU SWINTR. */ + MOV.L #872E0H, R5 + MOV.B #1, [R5] + /* Read back to ensure the value is taken before proceeding. */ + MOV.L [R5], R5 + /* Restore clobbered register to its previous value. */ + POP R5 +} +#define portYIELD() vPortYield() +#define portYIELD_FROM_ISR( x ) if( x != pdFALSE ) { portYIELD(); } + +/* These macros should not be called directly, but through the +taskENTER_CRITICAL() and taskEXIT_CRITICAL() macros. An extra check is +performed if configASSERT() is defined to ensure an assertion handler does not +inadvertently attempt to lower the IPL when the call to assert was triggered +because the IPL value was found to be above configMAX_SYSCALL_INTERRUPT_PRIORITY +when an ISR safe FreeRTOS API function was executed. ISR safe FreeRTOS API +functions are those that end in FromISR. FreeRTOS maintains a separate +interrupt API to ensure API function and interrupt entry is as fast and as +simple as possible. */ +#define portENABLE_INTERRUPTS() set_ipl( ( long ) 0 ) +#ifdef configASSERT + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() configASSERT( ( get_ipl() <= configMAX_SYSCALL_INTERRUPT_PRIORITY ) ) + #define portDISABLE_INTERRUPTS() if( get_ipl() < configMAX_SYSCALL_INTERRUPT_PRIORITY ) set_ipl( ( long ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#else + #define portDISABLE_INTERRUPTS() set_ipl( ( long ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#endif + +/* Critical nesting counts are stored in the TCB. */ +#define portCRITICAL_NESTING_IN_TCB ( 1 ) + +/* The critical nesting functions defined within tasks.c. */ +extern void vTaskEnterCritical( void ); +extern void vTaskExitCritical( void ); +#define portENTER_CRITICAL() vTaskEnterCritical() +#define portEXIT_CRITICAL() vTaskExitCritical() + +/* As this port allows interrupt nesting... */ +#define portSET_INTERRUPT_MASK_FROM_ISR() ( UBaseType_t ) get_ipl(); set_ipl( ( signed long ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ) set_ipl( ( signed long ) uxSavedInterruptStatus ) + +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ +#if configUSE_TICKLESS_IDLE == 1 + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif +#endif + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Renesas/RX200/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Renesas/RX200/port.c new file mode 100644 index 0000000..01294ed --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Renesas/RX200/port.c @@ -0,0 +1,366 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the RX200 port. + *----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Library includes. */ +#include "string.h" + +/* Hardware specifics. */ +#include "iodefine.h" + +/*-----------------------------------------------------------*/ + +/* Tasks should start with interrupts enabled and in Supervisor mode, therefore +PSW is set with U and I set, and PM and IPL clear. */ +#define portINITIAL_PSW ( ( StackType_t ) 0x00030000 ) + +/*-----------------------------------------------------------*/ + +/* The following lines are to ensure vSoftwareInterruptEntry can be referenced, + and therefore installed in the vector table, when the FreeRTOS code is built +as a library. */ +extern BaseType_t vSoftwareInterruptEntry; +const BaseType_t * p_vSoftwareInterruptEntry = &vSoftwareInterruptEntry; + +/*-----------------------------------------------------------*/ + +/* + * Function to start the first task executing - written in asm code as direct + * access to registers is required. + */ +static void prvStartFirstTask( void ); + +/* + * Software interrupt handler. Performs the actual context switch (saving and + * restoring of registers). Written in asm code as direct register access is + * required. + */ +static void prvYieldHandler( void ); + +/* + * The entry point for the software interrupt handler. This is the function + * that calls the inline asm function prvYieldHandler(). It is installed in + * the vector table, but the code that installs it is in prvYieldHandler rather + * than using a #pragma. + */ +void vSoftwareInterruptISR( void ); + +/*-----------------------------------------------------------*/ + +/* This is accessed by the inline assembler functions so is file scope for +convenience. */ +extern void *pxCurrentTCB; +extern void vTaskSwitchContext( void ); + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Offset to end up on 8 byte boundary. */ + pxTopOfStack--; + + /* R0 is not included as it is the stack pointer. */ + *pxTopOfStack = 0x00; + pxTopOfStack--; + *pxTopOfStack = 0x00; + pxTopOfStack--; + *pxTopOfStack = portINITIAL_PSW; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; + + /* When debugging it can be useful if every register is set to a known + value. Otherwise code space can be saved by just setting the registers + that need to be set. */ + #ifdef USE_FULL_REGISTER_INITIALISATION + { + pxTopOfStack--; + *pxTopOfStack = 0x12345678; /* r15. */ + pxTopOfStack--; + *pxTopOfStack = 0xaaaabbbb; + pxTopOfStack--; + *pxTopOfStack = 0xdddddddd; + pxTopOfStack--; + *pxTopOfStack = 0xcccccccc; + pxTopOfStack--; + *pxTopOfStack = 0xbbbbbbbb; + pxTopOfStack--; + *pxTopOfStack = 0xaaaaaaaa; + pxTopOfStack--; + *pxTopOfStack = 0x99999999; + pxTopOfStack--; + *pxTopOfStack = 0x88888888; + pxTopOfStack--; + *pxTopOfStack = 0x77777777; + pxTopOfStack--; + *pxTopOfStack = 0x66666666; + pxTopOfStack--; + *pxTopOfStack = 0x55555555; + pxTopOfStack--; + *pxTopOfStack = 0x44444444; + pxTopOfStack--; + *pxTopOfStack = 0x33333333; + pxTopOfStack--; + *pxTopOfStack = 0x22222222; + pxTopOfStack--; + } + #else + { + pxTopOfStack -= 15; + } + #endif + + *pxTopOfStack = ( StackType_t ) pvParameters; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = 0x12345678; /* Accumulator. */ + pxTopOfStack--; + *pxTopOfStack = 0x87654321; /* Accumulator. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void vApplicationSetupTimerInterrupt( void ); + + /* Use pxCurrentTCB just so it does not get optimised away. */ + if( pxCurrentTCB != NULL ) + { + /* Call an application function to set up the timer that will generate the + tick interrupt. This way the application can decide which peripheral to + use. A demo application is provided to show a suitable example. */ + vApplicationSetupTimerInterrupt(); + + /* Enable the software interrupt. */ + _IEN( _ICU_SWINT ) = 1; + + /* Ensure the software interrupt is clear. */ + _IR( _ICU_SWINT ) = 0; + + /* Ensure the software interrupt is set to the kernel priority. */ + _IPR( _ICU_SWINT ) = configKERNEL_INTERRUPT_PRIORITY; + + /* Start the first task. */ + prvStartFirstTask(); + } + + /* Just to make sure the function is not optimised away. */ + ( void ) vSoftwareInterruptISR(); + + /* Should not get here. */ + return pdFAIL; +} +/*-----------------------------------------------------------*/ + +#pragma inline_asm prvStartFirstTask +static void prvStartFirstTask( void ) +{ + /* When starting the scheduler there is nothing that needs moving to the + interrupt stack because the function is not called from an interrupt. + Just ensure the current stack is the user stack. */ + SETPSW U + + /* Obtain the location of the stack associated with which ever task + pxCurrentTCB is currently pointing to. */ + MOV.L #_pxCurrentTCB, R15 + MOV.L [R15], R15 + MOV.L [R15], R0 + + /* Restore the registers from the stack of the task pointed to by + pxCurrentTCB. */ + POP R15 + MVTACLO R15 /* Accumulator low 32 bits. */ + POP R15 + MVTACHI R15 /* Accumulator high 32 bits. */ + POPM R1-R15 /* R1 to R15 - R0 is not included as it is the SP. */ + RTE /* This pops the remaining registers. */ + NOP + NOP +} +/*-----------------------------------------------------------*/ + +#pragma interrupt ( vTickISR( vect = _VECT( configTICK_VECTOR ), enable ) ) +void vTickISR( void ) +{ + /* Increment the tick, and perform any processing the new tick value + necessitates. */ + set_ipl( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + { + if( xTaskIncrementTick() != pdFALSE ) + { + taskYIELD(); + } + } + set_ipl( configKERNEL_INTERRUPT_PRIORITY ); +} +/*-----------------------------------------------------------*/ + +void vSoftwareInterruptISR( void ) +{ + prvYieldHandler(); +} +/*-----------------------------------------------------------*/ + +#pragma inline_asm prvYieldHandler +static void prvYieldHandler( void ) +{ + /* Re-enable interrupts. */ + SETPSW I + + /* Move the data that was automatically pushed onto the interrupt stack when + the interrupt occurred from the interrupt stack to the user stack. + + R15 is saved before it is clobbered. */ + PUSH.L R15 + + /* Read the user stack pointer. */ + MVFC USP, R15 + + /* Move the address down to the data being moved. */ + SUB #12, R15 + MVTC R15, USP + + /* Copy the data across. */ + MOV.L [ R0 ], [ R15 ] ; R15 + MOV.L 4[ R0 ], 4[ R15 ] ; PC + MOV.L 8[ R0 ], 8[ R15 ] ; PSW + + /* Move the interrupt stack pointer to its new correct position. */ + ADD #12, R0 + + /* All the rest of the registers are saved directly to the user stack. */ + SETPSW U + + /* Save the rest of the general registers (R15 has been saved already). */ + PUSHM R1-R14 + + /* Save the accumulator. */ + MVFACHI R15 + PUSH.L R15 + MVFACMI R15 ; Middle order word. + SHLL #16, R15 ; Shifted left as it is restored to the low order word. + PUSH.L R15 + + /* Save the stack pointer to the TCB. */ + MOV.L #_pxCurrentTCB, R15 + MOV.L [ R15 ], R15 + MOV.L R0, [ R15 ] + + /* Ensure the interrupt mask is set to the syscall priority while the kernel + structures are being accessed. */ + MVTIPL #configMAX_SYSCALL_INTERRUPT_PRIORITY + + /* Select the next task to run. */ + BSR.A _vTaskSwitchContext + + /* Reset the interrupt mask as no more data structure access is required. */ + MVTIPL #configKERNEL_INTERRUPT_PRIORITY + + /* Load the stack pointer of the task that is now selected as the Running + state task from its TCB. */ + MOV.L #_pxCurrentTCB,R15 + MOV.L [ R15 ], R15 + MOV.L [ R15 ], R0 + + /* Restore the context of the new task. The PSW (Program Status Word) and + PC will be popped by the RTE instruction. */ + POP R15 + MVTACLO R15 + POP R15 + MVTACHI R15 + POPM R1-R15 + RTE + NOP + NOP +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( pxCurrentTCB == NULL ); + + /* The following line is just to prevent the symbol getting optimised away. */ + ( void ) vTaskSwitchContext(); +} +/*-----------------------------------------------------------*/ + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Renesas/RX200/port_asm.src b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Renesas/RX200/port_asm.src new file mode 100644 index 0000000..e1b89ae --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Renesas/RX200/port_asm.src @@ -0,0 +1,68 @@ +;/* +; FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. +; All rights reserved +; +; +; *************************************************************************** +; * * +; * FreeRTOS tutorial books are available in pdf and paperback. * +; * Complete, revised, and edited pdf reference manuals are also * +; * available. * +; * * +; * Purchasing FreeRTOS documentation will not only help you, by * +; * ensuring you get running as quickly as possible and with an * +; * in-depth knowledge of how to use FreeRTOS, it will also help * +; * the FreeRTOS project to continue with its mission of providing * +; * professional grade, cross platform, de facto standard solutions * +; * for microcontrollers - completely free of charge! * +; * * +; * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * +; * * +; * Thank you for using FreeRTOS, and thank you for your support! * +; * * +; *************************************************************************** +; +; +; This file is part of the FreeRTOS distribution. +; +; FreeRTOS is free software; you can redistribute it and/or modify it under +; the terms of the GNU General Public License (version 2) as published by the +; Free Software Foundation AND MODIFIED BY the FreeRTOS exception. +; >>>NOTE<<< The modification to the GPL is included to allow you to +; distribute a combined work that includes FreeRTOS without being obliged to +; provide the source code for proprietary components outside of the FreeRTOS +; kernel. FreeRTOS is distributed in the hope that it will be useful, but +; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +; more details. You should have received a copy of the GNU General Public +; License and the FreeRTOS license exception along with FreeRTOS; if not it +; can be viewed here: http://www.freertos.org/a00114.html and also obtained +; by writing to Richard Barry, contact details for whom are available on the +; FreeRTOS WEB site. +; +; 1 tab == 4 spaces! +; +; http://www.FreeRTOS.org - Documentation, latest information, license and +; contact details. +; +; http://www.SafeRTOS.com - A version that is certified for use in safety +; critical systems. +; +; http://www.OpenRTOS.com - Commercial support, development, porting, +; licensing and training services. +;*/ + .GLB _vSoftwareInterruptISR + .GLB _vSoftwareInterruptEntry + + .SECTION P,CODE + +_vSoftwareInterruptEntry: + + BRA _vSoftwareInterruptISR + + .RVECTOR 27, _vSoftwareInterruptEntry + + .END + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Renesas/RX200/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Renesas/RX200/portmacro.h new file mode 100644 index 0000000..fed2a71 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Renesas/RX200/portmacro.h @@ -0,0 +1,183 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Hardware specifics. */ +#include "machine.h" + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions - these are a bit legacy and not really used now, other than +portSTACK_TYPE and portBASE_TYPE. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 8 /* Could make four, according to manual. */ +#define portSTACK_GROWTH -1 +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portNOP() nop() + +#pragma inline_asm vPortYield +static void vPortYield( void ) +{ + /* Save clobbered register - may not actually be necessary if inline asm + functions are considered to use the same rules as function calls by the + compiler. */ + PUSH.L R5 + /* Set ITU SWINTR. */ + MOV.L #553696, R5 + MOV.B #1, [R5] + /* Read back to ensure the value is taken before proceeding. */ + MOV.L [R5], R5 + /* Restore clobbered register to its previous value. */ + POP R5 +} +#define portYIELD() vPortYield() +#define portYIELD_FROM_ISR( x ) if( x != pdFALSE ) portYIELD() + +/* These macros should not be called directly, but through the +taskENTER_CRITICAL() and taskEXIT_CRITICAL() macros. An extra check is +performed if configASSERT() is defined to ensure an assertion handler does not +inadvertently attempt to lower the IPL when the call to assert was triggered +because the IPL value was found to be above configMAX_SYSCALL_INTERRUPT_PRIORITY +when an ISR safe FreeRTOS API function was executed. ISR safe FreeRTOS API +functions are those that end in FromISR. FreeRTOS maintains a separate +interrupt API to ensure API function and interrupt entry is as fast and as +simple as possible. */ +#define portENABLE_INTERRUPTS() set_ipl( ( long ) 0 ) +#ifdef configASSERT + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() configASSERT( ( get_ipl() <= configMAX_SYSCALL_INTERRUPT_PRIORITY ) ) + #define portDISABLE_INTERRUPTS() if( get_ipl() < configMAX_SYSCALL_INTERRUPT_PRIORITY ) set_ipl( ( long ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#else + #define portDISABLE_INTERRUPTS() set_ipl( ( long ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#endif + +/* Critical nesting counts are stored in the TCB. */ +#define portCRITICAL_NESTING_IN_TCB ( 1 ) + +/* The critical nesting functions defined within tasks.c. */ +extern void vTaskEnterCritical( void ); +extern void vTaskExitCritical( void ); +#define portENTER_CRITICAL() vTaskEnterCritical() +#define portEXIT_CRITICAL() vTaskExitCritical() + +/* As this port allows interrupt nesting... */ +#define portSET_INTERRUPT_MASK_FROM_ISR() get_ipl(); set_ipl( ( long ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ) set_ipl( ( long ) uxSavedInterruptStatus ) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Renesas/RX600/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Renesas/RX600/port.c new file mode 100644 index 0000000..124ee72 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Renesas/RX600/port.c @@ -0,0 +1,371 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the RX600 port. + *----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Library includes. */ +#include "string.h" + +/* Hardware specifics. */ +#include "iodefine.h" + +/*-----------------------------------------------------------*/ + +/* Tasks should start with interrupts enabled and in Supervisor mode, therefore +PSW is set with U and I set, and PM and IPL clear. */ +#define portINITIAL_PSW ( ( StackType_t ) 0x00030000 ) +#define portINITIAL_FPSW ( ( StackType_t ) 0x00000100 ) + +/*-----------------------------------------------------------*/ + +/* The following lines are to ensure vSoftwareInterruptEntry can be referenced, + and therefore installed in the vector table, when the FreeRTOS code is built +as a library. */ +extern BaseType_t vSoftwareInterruptEntry; +const BaseType_t * p_vSoftwareInterruptEntry = &vSoftwareInterruptEntry; + +/*-----------------------------------------------------------*/ + +/* + * Function to start the first task executing - written in asm code as direct + * access to registers is required. + */ +static void prvStartFirstTask( void ); + +/* + * Software interrupt handler. Performs the actual context switch (saving and + * restoring of registers). Written in asm code as direct register access is + * required. + */ +static void prvYieldHandler( void ); + +/* + * The entry point for the software interrupt handler. This is the function + * that calls the inline asm function prvYieldHandler(). It is installed in + * the vector table, but the code that installs it is in prvYieldHandler rather + * than using a #pragma. + */ +void vSoftwareInterruptISR( void ); + +/*-----------------------------------------------------------*/ + +/* This is accessed by the inline assembler functions so is file scope for +convenience. */ +extern void *pxCurrentTCB; +extern void vTaskSwitchContext( void ); + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* R0 is not included as it is the stack pointer. */ + + *pxTopOfStack = 0x00; + pxTopOfStack--; + *pxTopOfStack = portINITIAL_PSW; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; + + /* When debugging it can be useful if every register is set to a known + value. Otherwise code space can be saved by just setting the registers + that need to be set. */ + #ifdef USE_FULL_REGISTER_INITIALISATION + { + pxTopOfStack--; + *pxTopOfStack = 0xffffffff; /* r15. */ + pxTopOfStack--; + *pxTopOfStack = 0xeeeeeeee; + pxTopOfStack--; + *pxTopOfStack = 0xdddddddd; + pxTopOfStack--; + *pxTopOfStack = 0xcccccccc; + pxTopOfStack--; + *pxTopOfStack = 0xbbbbbbbb; + pxTopOfStack--; + *pxTopOfStack = 0xaaaaaaaa; + pxTopOfStack--; + *pxTopOfStack = 0x99999999; + pxTopOfStack--; + *pxTopOfStack = 0x88888888; + pxTopOfStack--; + *pxTopOfStack = 0x77777777; + pxTopOfStack--; + *pxTopOfStack = 0x66666666; + pxTopOfStack--; + *pxTopOfStack = 0x55555555; + pxTopOfStack--; + *pxTopOfStack = 0x44444444; + pxTopOfStack--; + *pxTopOfStack = 0x33333333; + pxTopOfStack--; + *pxTopOfStack = 0x22222222; + pxTopOfStack--; + } + #else + { + pxTopOfStack -= 15; + } + #endif + + *pxTopOfStack = ( StackType_t ) pvParameters; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_FPSW; + pxTopOfStack--; + *pxTopOfStack = 0x12345678; /* Accumulator. */ + pxTopOfStack--; + *pxTopOfStack = 0x87654321; /* Accumulator. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void vApplicationSetupTimerInterrupt( void ); + + /* Use pxCurrentTCB just so it does not get optimised away. */ + if( pxCurrentTCB != NULL ) + { + /* Call an application function to set up the timer that will generate the + tick interrupt. This way the application can decide which peripheral to + use. A demo application is provided to show a suitable example. */ + vApplicationSetupTimerInterrupt(); + + /* Enable the software interrupt. */ + _IEN( _ICU_SWINT ) = 1; + + /* Ensure the software interrupt is clear. */ + _IR( _ICU_SWINT ) = 0; + + /* Ensure the software interrupt is set to the kernel priority. */ + _IPR( _ICU_SWINT ) = configKERNEL_INTERRUPT_PRIORITY; + + /* Start the first task. */ + prvStartFirstTask(); + } + + /* Just to make sure the function is not optimised away. */ + ( void ) vSoftwareInterruptISR(); + + /* Should not get here. */ + return pdFAIL; +} +/*-----------------------------------------------------------*/ + +#pragma inline_asm prvStartFirstTask +static void prvStartFirstTask( void ) +{ + /* When starting the scheduler there is nothing that needs moving to the + interrupt stack because the function is not called from an interrupt. + Just ensure the current stack is the user stack. */ + SETPSW U + + /* Obtain the location of the stack associated with which ever task + pxCurrentTCB is currently pointing to. */ + MOV.L #_pxCurrentTCB, R15 + MOV.L [R15], R15 + MOV.L [R15], R0 + + /* Restore the registers from the stack of the task pointed to by + pxCurrentTCB. */ + POP R15 + MVTACLO R15 /* Accumulator low 32 bits. */ + POP R15 + MVTACHI R15 /* Accumulator high 32 bits. */ + POP R15 + MVTC R15,FPSW /* Floating point status word. */ + POPM R1-R15 /* R1 to R15 - R0 is not included as it is the SP. */ + RTE /* This pops the remaining registers. */ + NOP + NOP +} +/*-----------------------------------------------------------*/ + +#pragma interrupt ( vTickISR( vect = _VECT( configTICK_VECTOR ), enable ) ) +void vTickISR( void ) +{ + /* Increment the tick, and perform any processing the new tick value + necessitates. */ + set_ipl( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + { + if( xTaskIncrementTick() != pdFALSE ) + { + taskYIELD(); + } + } + set_ipl( configKERNEL_INTERRUPT_PRIORITY ); +} +/*-----------------------------------------------------------*/ + +void vSoftwareInterruptISR( void ) +{ + prvYieldHandler(); +} +/*-----------------------------------------------------------*/ + +#pragma inline_asm prvYieldHandler +static void prvYieldHandler( void ) +{ + /* Re-enable interrupts. */ + SETPSW I + + /* Move the data that was automatically pushed onto the interrupt stack when + the interrupt occurred from the interrupt stack to the user stack. + + R15 is saved before it is clobbered. */ + PUSH.L R15 + + /* Read the user stack pointer. */ + MVFC USP, R15 + + /* Move the address down to the data being moved. */ + SUB #12, R15 + MVTC R15, USP + + /* Copy the data across. */ + MOV.L [ R0 ], [ R15 ] ; R15 + MOV.L 4[ R0 ], 4[ R15 ] ; PC + MOV.L 8[ R0 ], 8[ R15 ] ; PSW + + /* Move the interrupt stack pointer to its new correct position. */ + ADD #12, R0 + + /* All the rest of the registers are saved directly to the user stack. */ + SETPSW U + + /* Save the rest of the general registers (R15 has been saved already). */ + PUSHM R1-R14 + + /* Save the FPSW and accumulator. */ + MVFC FPSW, R15 + PUSH.L R15 + MVFACHI R15 + PUSH.L R15 + MVFACMI R15 ; Middle order word. + SHLL #16, R15 ; Shifted left as it is restored to the low order word. + PUSH.L R15 + + /* Save the stack pointer to the TCB. */ + MOV.L #_pxCurrentTCB, R15 + MOV.L [ R15 ], R15 + MOV.L R0, [ R15 ] + + /* Ensure the interrupt mask is set to the syscall priority while the kernel + structures are being accessed. */ + MVTIPL #configMAX_SYSCALL_INTERRUPT_PRIORITY + + /* Select the next task to run. */ + BSR.A _vTaskSwitchContext + + /* Reset the interrupt mask as no more data structure access is required. */ + MVTIPL #configKERNEL_INTERRUPT_PRIORITY + + /* Load the stack pointer of the task that is now selected as the Running + state task from its TCB. */ + MOV.L #_pxCurrentTCB,R15 + MOV.L [ R15 ], R15 + MOV.L [ R15 ], R0 + + /* Restore the context of the new task. The PSW (Program Status Word) and + PC will be popped by the RTE instruction. */ + POP R15 + MVTACLO R15 + POP R15 + MVTACHI R15 + POP R15 + MVTC R15,FPSW + POPM R1-R15 + RTE + NOP + NOP +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( pxCurrentTCB == NULL ); + + /* The following line is just to prevent the symbol getting optimised away. */ + ( void ) vTaskSwitchContext(); +} +/*-----------------------------------------------------------*/ + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Renesas/RX600/port_asm.src b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Renesas/RX600/port_asm.src new file mode 100644 index 0000000..e1b89ae --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Renesas/RX600/port_asm.src @@ -0,0 +1,68 @@ +;/* +; FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. +; All rights reserved +; +; +; *************************************************************************** +; * * +; * FreeRTOS tutorial books are available in pdf and paperback. * +; * Complete, revised, and edited pdf reference manuals are also * +; * available. * +; * * +; * Purchasing FreeRTOS documentation will not only help you, by * +; * ensuring you get running as quickly as possible and with an * +; * in-depth knowledge of how to use FreeRTOS, it will also help * +; * the FreeRTOS project to continue with its mission of providing * +; * professional grade, cross platform, de facto standard solutions * +; * for microcontrollers - completely free of charge! * +; * * +; * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * +; * * +; * Thank you for using FreeRTOS, and thank you for your support! * +; * * +; *************************************************************************** +; +; +; This file is part of the FreeRTOS distribution. +; +; FreeRTOS is free software; you can redistribute it and/or modify it under +; the terms of the GNU General Public License (version 2) as published by the +; Free Software Foundation AND MODIFIED BY the FreeRTOS exception. +; >>>NOTE<<< The modification to the GPL is included to allow you to +; distribute a combined work that includes FreeRTOS without being obliged to +; provide the source code for proprietary components outside of the FreeRTOS +; kernel. FreeRTOS is distributed in the hope that it will be useful, but +; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +; more details. You should have received a copy of the GNU General Public +; License and the FreeRTOS license exception along with FreeRTOS; if not it +; can be viewed here: http://www.freertos.org/a00114.html and also obtained +; by writing to Richard Barry, contact details for whom are available on the +; FreeRTOS WEB site. +; +; 1 tab == 4 spaces! +; +; http://www.FreeRTOS.org - Documentation, latest information, license and +; contact details. +; +; http://www.SafeRTOS.com - A version that is certified for use in safety +; critical systems. +; +; http://www.OpenRTOS.com - Commercial support, development, porting, +; licensing and training services. +;*/ + .GLB _vSoftwareInterruptISR + .GLB _vSoftwareInterruptEntry + + .SECTION P,CODE + +_vSoftwareInterruptEntry: + + BRA _vSoftwareInterruptISR + + .RVECTOR 27, _vSoftwareInterruptEntry + + .END + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Renesas/RX600/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Renesas/RX600/portmacro.h new file mode 100644 index 0000000..e2bb844 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Renesas/RX600/portmacro.h @@ -0,0 +1,184 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Hardware specifics. */ +#include "machine.h" + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions - these are a bit legacy and not really used now, other than +portSTACK_TYPE and portBASE_TYPE. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 8 /* Could make four, according to manual. */ +#define portSTACK_GROWTH -1 +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portNOP() nop() + + +#pragma inline_asm vPortYield +static void vPortYield( void ) +{ + /* Save clobbered register - may not actually be necessary if inline asm + functions are considered to use the same rules as function calls by the + compiler. */ + PUSH.L R5 + /* Set ITU SWINTR. */ + MOV.L #553696, R5 + MOV.B #1, [R5] + /* Read back to ensure the value is taken before proceeding. */ + MOV.L [R5], R5 + /* Restore clobbered register to its previous value. */ + POP R5 +} +#define portYIELD() vPortYield() +#define portYIELD_FROM_ISR( x ) if( x != pdFALSE ) portYIELD() + +/* These macros should not be called directly, but through the +taskENTER_CRITICAL() and taskEXIT_CRITICAL() macros. An extra check is +performed if configASSERT() is defined to ensure an assertion handler does not +inadvertently attempt to lower the IPL when the call to assert was triggered +because the IPL value was found to be above configMAX_SYSCALL_INTERRUPT_PRIORITY +when an ISR safe FreeRTOS API function was executed. ISR safe FreeRTOS API +functions are those that end in FromISR. FreeRTOS maintains a separate +interrupt API to ensure API function and interrupt entry is as fast and as +simple as possible. */ +#define portENABLE_INTERRUPTS() set_ipl( ( long ) 0 ) +#ifdef configASSERT + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() configASSERT( ( get_ipl() <= configMAX_SYSCALL_INTERRUPT_PRIORITY ) ) + #define portDISABLE_INTERRUPTS() if( get_ipl() < configMAX_SYSCALL_INTERRUPT_PRIORITY ) set_ipl( ( long ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#else + #define portDISABLE_INTERRUPTS() set_ipl( ( long ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#endif + +/* Critical nesting counts are stored in the TCB. */ +#define portCRITICAL_NESTING_IN_TCB ( 1 ) + +/* The critical nesting functions defined within tasks.c. */ +extern void vTaskEnterCritical( void ); +extern void vTaskExitCritical( void ); +#define portENTER_CRITICAL() vTaskEnterCritical() +#define portEXIT_CRITICAL() vTaskExitCritical() + +/* As this port allows interrupt nesting... */ +#define portSET_INTERRUPT_MASK_FROM_ISR() get_ipl(); set_ipl( ( long ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ) set_ipl( ( long ) uxSavedInterruptStatus ) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Renesas/RX600v2/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Renesas/RX600v2/port.c new file mode 100644 index 0000000..c7b8f95 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Renesas/RX600v2/port.c @@ -0,0 +1,402 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the RX600 port. + *----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Library includes. */ +#include "string.h" + +/* Hardware specifics. */ +#include "iodefine.h" + +/*-----------------------------------------------------------*/ + +/* Tasks should start with interrupts enabled and in Supervisor mode, therefore +PSW is set with U and I set, and PM and IPL clear. */ +#define portINITIAL_PSW ( ( StackType_t ) 0x00030000 ) +#define portINITIAL_FPSW ( ( StackType_t ) 0x00000100 ) + +/*-----------------------------------------------------------*/ + +/* The following lines are to ensure vSoftwareInterruptEntry can be referenced, + and therefore installed in the vector table, when the FreeRTOS code is built +as a library. */ +extern BaseType_t vSoftwareInterruptEntry; +const BaseType_t * p_vSoftwareInterruptEntry = &vSoftwareInterruptEntry; + +/*-----------------------------------------------------------*/ + +/* + * Function to start the first task executing - written in asm code as direct + * access to registers is required. + */ +static void prvStartFirstTask( void ); + +/* + * Software interrupt handler. Performs the actual context switch (saving and + * restoring of registers). Written in asm code as direct register access is + * required. + */ +static void prvYieldHandler( void ); + +/* + * The entry point for the software interrupt handler. This is the function + * that calls the inline asm function prvYieldHandler(). It is installed in + * the vector table, but the code that installs it is in prvYieldHandler rather + * than using a #pragma. + */ +void vSoftwareInterruptISR( void ); + +/*-----------------------------------------------------------*/ + +/* This is accessed by the inline assembler functions so is file scope for +convenience. */ +extern void *pxCurrentTCB; +extern void vTaskSwitchContext( void ); + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* R0 is not included as it is the stack pointer. */ + + *pxTopOfStack = 0x00; + pxTopOfStack--; + *pxTopOfStack = portINITIAL_PSW; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; + + /* When debugging it can be useful if every register is set to a known + value. Otherwise code space can be saved by just setting the registers + that need to be set. */ + #ifdef USE_FULL_REGISTER_INITIALISATION + { + pxTopOfStack--; + *pxTopOfStack = 0xffffffff; /* r15. */ + pxTopOfStack--; + *pxTopOfStack = 0xeeeeeeee; + pxTopOfStack--; + *pxTopOfStack = 0xdddddddd; + pxTopOfStack--; + *pxTopOfStack = 0xcccccccc; + pxTopOfStack--; + *pxTopOfStack = 0xbbbbbbbb; + pxTopOfStack--; + *pxTopOfStack = 0xaaaaaaaa; + pxTopOfStack--; + *pxTopOfStack = 0x99999999; + pxTopOfStack--; + *pxTopOfStack = 0x88888888; + pxTopOfStack--; + *pxTopOfStack = 0x77777777; + pxTopOfStack--; + *pxTopOfStack = 0x66666666; + pxTopOfStack--; + *pxTopOfStack = 0x55555555; + pxTopOfStack--; + *pxTopOfStack = 0x44444444; + pxTopOfStack--; + *pxTopOfStack = 0x33333333; + pxTopOfStack--; + *pxTopOfStack = 0x22222222; + pxTopOfStack--; + } + #else + { + pxTopOfStack -= 15; + } + #endif + + *pxTopOfStack = ( StackType_t ) pvParameters; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_FPSW; + pxTopOfStack--; + *pxTopOfStack = 0x11111111; /* Accumulator 0. */ + pxTopOfStack--; + *pxTopOfStack = 0x22222222; /* Accumulator 0. */ + pxTopOfStack--; + *pxTopOfStack = 0x33333333; /* Accumulator 0. */ + pxTopOfStack--; + *pxTopOfStack = 0x44444444; /* Accumulator 1. */ + pxTopOfStack--; + *pxTopOfStack = 0x55555555; /* Accumulator 1. */ + pxTopOfStack--; + *pxTopOfStack = 0x66666666; /* Accumulator 1. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void vApplicationSetupTimerInterrupt( void ); + + /* Use pxCurrentTCB just so it does not get optimised away. */ + if( pxCurrentTCB != NULL ) + { + /* Call an application function to set up the timer that will generate the + tick interrupt. This way the application can decide which peripheral to + use. A demo application is provided to show a suitable example. */ + vApplicationSetupTimerInterrupt(); + + /* Enable the software interrupt. */ + _IEN( _ICU_SWINT ) = 1; + + /* Ensure the software interrupt is clear. */ + _IR( _ICU_SWINT ) = 0; + + /* Ensure the software interrupt is set to the kernel priority. */ + _IPR( _ICU_SWINT ) = configKERNEL_INTERRUPT_PRIORITY; + + /* Start the first task. */ + prvStartFirstTask(); + } + + /* Just to make sure the function is not optimised away. */ + ( void ) vSoftwareInterruptISR(); + + /* Should not get here. */ + return pdFAIL; +} +/*-----------------------------------------------------------*/ + +#pragma inline_asm prvStartFirstTask +static void prvStartFirstTask( void ) +{ + /* When starting the scheduler there is nothing that needs moving to the + interrupt stack because the function is not called from an interrupt. + Just ensure the current stack is the user stack. */ + SETPSW U + + /* Obtain the location of the stack associated with which ever task + pxCurrentTCB is currently pointing to. */ + MOV.L #_pxCurrentTCB, R15 + MOV.L [R15], R15 + MOV.L [R15], R0 + + /* Restore the registers from the stack of the task pointed to by + pxCurrentTCB. */ + POP R15 + MVTACLO R15, A0 /* Accumulator low 32 bits. */ + POP R15 + MVTACHI R15, A0 /* Accumulator high 32 bits. */ + POP R15 + MVTACGU R15, A0 /* Accumulator guard. */ + POP R15 + MVTACLO R15, A1 /* Accumulator low 32 bits. */ + POP R15 + MVTACHI R15, A1 /* Accumulator high 32 bits. */ + POP R15 + MVTACGU R15, A1 /* Accumulator guard. */ + POP R15 + MVTC R15,FPSW /* Floating point status word. */ + POPM R1-R15 /* R1 to R15 - R0 is not included as it is the SP. */ + RTE /* This pops the remaining registers. */ + NOP + NOP +} +/*-----------------------------------------------------------*/ + +#pragma interrupt ( vTickISR( vect = _VECT( configTICK_VECTOR ), enable ) ) +void vTickISR( void ) +{ + /* Increment the tick, and perform any processing the new tick value + necessitates. */ + set_ipl( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + { + if( xTaskIncrementTick() != pdFALSE ) + { + taskYIELD(); + } + } + set_ipl( configKERNEL_INTERRUPT_PRIORITY ); +} +/*-----------------------------------------------------------*/ + +void vSoftwareInterruptISR( void ) +{ + prvYieldHandler(); +} +/*-----------------------------------------------------------*/ + +#pragma inline_asm prvYieldHandler +static void prvYieldHandler( void ) +{ + /* Re-enable interrupts. */ + SETPSW I + + /* Move the data that was automatically pushed onto the interrupt stack when + the interrupt occurred from the interrupt stack to the user stack. + + R15 is saved before it is clobbered. */ + PUSH.L R15 + + /* Read the user stack pointer. */ + MVFC USP, R15 + + /* Move the address down to the data being moved. */ + SUB #12, R15 + MVTC R15, USP + + /* Copy the data across. */ + MOV.L [ R0 ], [ R15 ] ; R15 + MOV.L 4[ R0 ], 4[ R15 ] ; PC + MOV.L 8[ R0 ], 8[ R15 ] ; PSW + + /* Move the interrupt stack pointer to its new correct position. */ + ADD #12, R0 + + /* All the rest of the registers are saved directly to the user stack. */ + SETPSW U + + /* Save the rest of the general registers (R15 has been saved already). */ + PUSHM R1-R14 + + /* Save the FPSW and accumulators. */ + MVFC FPSW, R15 + PUSH.L R15 + MVFACGU #0, A1, R15 + PUSH.L R15 + MVFACHI #0, A1, R15 + PUSH.L R15 + MVFACLO #0, A1, R15 ; Low order word. + PUSH.L R15 + MVFACGU #0, A0, R15 + PUSH.L R15 + MVFACHI #0, A0, R15 + PUSH.L R15 + MVFACLO #0, A0, R15 ; Low order word. + PUSH.L R15 + + /* Save the stack pointer to the TCB. */ + MOV.L #_pxCurrentTCB, R15 + MOV.L [ R15 ], R15 + MOV.L R0, [ R15 ] + + /* Ensure the interrupt mask is set to the syscall priority while the kernel + structures are being accessed. */ + MVTIPL #configMAX_SYSCALL_INTERRUPT_PRIORITY + + /* Select the next task to run. */ + BSR.A _vTaskSwitchContext + + /* Reset the interrupt mask as no more data structure access is required. */ + MVTIPL #configKERNEL_INTERRUPT_PRIORITY + + /* Load the stack pointer of the task that is now selected as the Running + state task from its TCB. */ + MOV.L #_pxCurrentTCB,R15 + MOV.L [ R15 ], R15 + MOV.L [ R15 ], R0 + + /* Restore the context of the new task. The PSW (Program Status Word) and + PC will be popped by the RTE instruction. */ + POP R15 + MVTACLO R15, A0 /* Accumulator low 32 bits. */ + POP R15 + MVTACHI R15, A0 /* Accumulator high 32 bits. */ + POP R15 + MVTACGU R15, A0 /* Accumulator guard. */ + POP R15 + MVTACLO R15, A1 /* Accumulator low 32 bits. */ + POP R15 + MVTACHI R15, A1 /* Accumulator high 32 bits. */ + POP R15 + MVTACGU R15, A1 /* Accumulator guard. */ + POP R15 + MVTC R15,FPSW + POPM R1-R15 + RTE + NOP + NOP +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( pxCurrentTCB == NULL ); + + /* The following line is just to prevent the symbol getting optimised away. */ + ( void ) vTaskSwitchContext(); +} +/*-----------------------------------------------------------*/ + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Renesas/RX600v2/port_asm.src b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Renesas/RX600v2/port_asm.src new file mode 100644 index 0000000..40abfc8 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Renesas/RX600v2/port_asm.src @@ -0,0 +1,68 @@ +;/* +; FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. +; All rights reserved +; +; +; *************************************************************************** +; * * +; * FreeRTOS tutorial books are available in pdf and paperback. * +; * Complete, revised, and edited pdf reference manuals are also * +; * available. * +; * * +; * Purchasing FreeRTOS documentation will not only help you, by * +; * ensuring you get running as quickly as possible and with an * +; * in-depth knowledge of how to use FreeRTOS, it will also help * +; * the FreeRTOS project to continue with its mission of providing * +; * professional grade, cross platform, de facto standard solutions * +; * for microcontrollers - completely free of charge! * +; * * +; * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * +; * * +; * Thank you for using FreeRTOS, and thank you for your support! * +; * * +; *************************************************************************** +; +; +; This file is part of the FreeRTOS distribution. +; +; FreeRTOS is free software; you can redistribute it and/or modify it under +; the terms of the GNU General Public License (version 2) as published by the +; Free Software Foundation AND MODIFIED BY the FreeRTOS exception. +; >>>NOTE<<< The modification to the GPL is included to allow you to +; distribute a combined work that includes FreeRTOS without being obliged to +; provide the source code for proprietary components outside of the FreeRTOS +; kernel. FreeRTOS is distributed in the hope that it will be useful, but +; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +; more details. You should have received a copy of the GNU General Public +; License and the FreeRTOS license exception along with FreeRTOS; if not it +; can be viewed here: http://www.freertos.org/a00114.html and also obtained +; by writing to Richard Barry, contact details for whom are available on the +; FreeRTOS WEB site. +; +; 1 tab == 4 spaces! +; +; http://www.FreeRTOS.org - Documentation, latest information, license and +; contact details. +; +; http://www.SafeRTOS.com - A version that is certified for use in safety +; critical systems. +; +; http://www.OpenRTOS.com - Commercial support, development, porting, +; licensing and training services. +;*/ + .GLB _vSoftwareInterruptISR + .GLB _vSoftwareInterruptEntry + + .SECTION P,CODE + +_vSoftwareInterruptEntry: + + BRA _vSoftwareInterruptISR + + .RVECTOR 27, _vSoftwareInterruptEntry + + .END + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Renesas/RX600v2/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Renesas/RX600v2/portmacro.h new file mode 100644 index 0000000..8e159bd --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Renesas/RX600v2/portmacro.h @@ -0,0 +1,184 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Hardware specifics. */ +#include "machine.h" + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions - these are a bit legacy and not really used now, other than +portSTACK_TYPE and portBASE_TYPE. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 8 /* Could make four, according to manual. */ +#define portSTACK_GROWTH -1 +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portNOP() nop() + + +#pragma inline_asm vPortYield +static void vPortYield( void ) +{ + /* Save clobbered register - may not actually be necessary if inline asm + functions are considered to use the same rules as function calls by the + compiler. */ + PUSH.L R5 + /* Set ITU SWINTR. */ + MOV.L #553696, R5 + MOV.B #1, [R5] + /* Read back to ensure the value is taken before proceeding. */ + MOV.L [R5], R5 + /* Restore clobbered register to its previous value. */ + POP R5 +} +#define portYIELD() vPortYield() +#define portYIELD_FROM_ISR( x ) if( x != pdFALSE ) portYIELD() + +/* These macros should not be called directly, but through the +taskENTER_CRITICAL() and taskEXIT_CRITICAL() macros. An extra check is +performed if configASSERT() is defined to ensure an assertion handler does not +inadvertently attempt to lower the IPL when the call to assert was triggered +because the IPL value was found to be above configMAX_SYSCALL_INTERRUPT_PRIORITY +when an ISR safe FreeRTOS API function was executed. ISR safe FreeRTOS API +functions are those that end in FromISR. FreeRTOS maintains a separate +interrupt API to ensure API function and interrupt entry is as fast and as +simple as possible. */ +#define portENABLE_INTERRUPTS() set_ipl( ( long ) 0 ) +#ifdef configASSERT + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() configASSERT( ( get_ipl() <= configMAX_SYSCALL_INTERRUPT_PRIORITY ) ) + #define portDISABLE_INTERRUPTS() if( get_ipl() < configMAX_SYSCALL_INTERRUPT_PRIORITY ) set_ipl( ( long ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#else + #define portDISABLE_INTERRUPTS() set_ipl( ( long ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#endif + +/* Critical nesting counts are stored in the TCB. */ +#define portCRITICAL_NESTING_IN_TCB ( 1 ) + +/* The critical nesting functions defined within tasks.c. */ +extern void vTaskEnterCritical( void ); +extern void vTaskExitCritical( void ); +#define portENTER_CRITICAL() vTaskEnterCritical() +#define portEXIT_CRITICAL() vTaskExitCritical() + +/* As this port allows interrupt nesting... */ +#define portSET_INTERRUPT_MASK_FROM_ISR() ( UBaseType_t ) get_ipl(); set_ipl( ( long ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ) set_ipl( ( long ) uxSavedInterruptStatus ) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Renesas/SH2A_FPU/ISR_Support.inc b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Renesas/SH2A_FPU/ISR_Support.inc new file mode 100644 index 0000000..5484ea6 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Renesas/SH2A_FPU/ISR_Support.inc @@ -0,0 +1,101 @@ +;/* +; FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. +; All rights reserved +; +; +; *************************************************************************** +; * * +; * FreeRTOS tutorial books are available in pdf and paperback. * +; * Complete, revised, and edited pdf reference manuals are also * +; * available. * +; * * +; * Purchasing FreeRTOS documentation will not only help you, by * +; * ensuring you get running as quickly as possible and with an * +; * in-depth knowledge of how to use FreeRTOS, it will also help * +; * the FreeRTOS project to continue with its mission of providing * +; * professional grade, cross platform, de facto standard solutions * +; * for microcontrollers - completely free of charge! * +; * * +; * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * +; * * +; * Thank you for using FreeRTOS, and thank you for your support! * +; * * +; *************************************************************************** +; +; +; This file is part of the FreeRTOS distribution. +; +; FreeRTOS is free software; you can redistribute it and/or modify it under +; the terms of the GNU General Public License (version 2) as published by the +; Free Software Foundation AND MODIFIED BY the FreeRTOS exception. +; >>>NOTE<<< The modification to the GPL is included to allow you to +; distribute a combined work that includes FreeRTOS without being obliged to +; provide the source code for proprietary components outside of the FreeRTOS +; kernel. FreeRTOS is distributed in the hope that it will be useful, but +; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +; more details. You should have received a copy of the GNU General Public +; License and the FreeRTOS license exception along with FreeRTOS; if not it +; can be viewed here: http://www.freertos.org/a00114.html and also obtained +; by writing to Richard Barry, contact details for whom are available on the +; FreeRTOS WEB site. +; +; 1 tab == 4 spaces! +; +; http://www.FreeRTOS.org - Documentation, latest information, license and +; contact details. +; +; http://www.SafeRTOS.com - A version that is certified for use in safety +; critical systems. +; +; http://www.OpenRTOS.com - Commercial support, development, porting, +; licensing and training services. +;*/ + .macro portSAVE_CONTEXT + + ; Save r0 to r14 and pr. + movml.l r15, @-r15 + + ; Save mac1, mach and gbr + sts.l macl, @-r15 + sts.l mach, @-r15 + stc.l gbr, @-r15 + + ; Get the address of pxCurrentTCB + mov.l #_pxCurrentTCB, r0 + + ; Get the address of pxTopOfStack from the TCB. + mov.l @r0, r0 + + ; Save the stack pointer in pxTopOfStack. + mov.l r15, @r0 + + .endm + +;----------------------------------------------------------- + + .macro portRESTORE_CONTEXT + + ; Get the address of the pxCurrentTCB variable. + mov.l #_pxCurrentTCB, r0 + + ; Get the address of the task stack from pxCurrentTCB. + mov.l @r0, r0 + + ; Get the task stack itself into the stack pointer. + mov.l @r0, r15 + + ; Restore system registers. + ldc.l @r15+, gbr + lds.l @r15+, mach + lds.l @r15+, macl + + ; Restore r0 to r14 and PR + movml.l @r15+, r15 + + ; Pop the SR and PC to jump to the start of the task. + rte + nop + + .endm +;----------------------------------------------------------- \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Renesas/SH2A_FPU/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Renesas/SH2A_FPU/port.c new file mode 100644 index 0000000..117f764 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Renesas/SH2A_FPU/port.c @@ -0,0 +1,313 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the SH2A port. + *----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Library includes. */ +#include "string.h" + +/*-----------------------------------------------------------*/ + +/* The SR assigned to a newly created task. The only important thing in this +value is for all interrupts to be enabled. */ +#define portINITIAL_SR ( 0UL ) + +/* Dimensions the array into which the floating point context is saved. +Allocate enough space for FPR0 to FPR15, FPUL and FPSCR, each of which is 4 +bytes big. If this number is changed then the 72 in portasm.src also needs +changing. */ +#define portFLOP_REGISTERS_TO_STORE ( 18 ) +#define portFLOP_STORAGE_SIZE ( portFLOP_REGISTERS_TO_STORE * 4 ) + +#if( configSUPPORT_DYNAMIC_ALLOCATION == 0 ) + #error configSUPPORT_DYNAMIC_ALLOCATION must be 1 to use this port. +#endif + +/*-----------------------------------------------------------*/ + +/* + * The TRAPA handler used to force a context switch. + */ +void vPortYield( void ); + +/* + * Function to start the first task executing - defined in portasm.src. + */ +extern void vPortStartFirstTask( void ); + +/* + * Obtains the current GBR value - defined in portasm.src. + */ +extern uint32_t ulPortGetGBR( void ); + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Mark the end of the stack - used for debugging only and can be removed. */ + *pxTopOfStack = 0x11111111UL; + pxTopOfStack--; + *pxTopOfStack = 0x22222222UL; + pxTopOfStack--; + *pxTopOfStack = 0x33333333UL; + pxTopOfStack--; + + /* SR. */ + *pxTopOfStack = portINITIAL_SR; + pxTopOfStack--; + + /* PC. */ + *pxTopOfStack = ( uint32_t ) pxCode; + pxTopOfStack--; + + /* PR. */ + *pxTopOfStack = 15; + pxTopOfStack--; + + /* 14. */ + *pxTopOfStack = 14; + pxTopOfStack--; + + /* R13. */ + *pxTopOfStack = 13; + pxTopOfStack--; + + /* R12. */ + *pxTopOfStack = 12; + pxTopOfStack--; + + /* R11. */ + *pxTopOfStack = 11; + pxTopOfStack--; + + /* R10. */ + *pxTopOfStack = 10; + pxTopOfStack--; + + /* R9. */ + *pxTopOfStack = 9; + pxTopOfStack--; + + /* R8. */ + *pxTopOfStack = 8; + pxTopOfStack--; + + /* R7. */ + *pxTopOfStack = 7; + pxTopOfStack--; + + /* R6. */ + *pxTopOfStack = 6; + pxTopOfStack--; + + /* R5. */ + *pxTopOfStack = 5; + pxTopOfStack--; + + /* R4. */ + *pxTopOfStack = ( uint32_t ) pvParameters; + pxTopOfStack--; + + /* R3. */ + *pxTopOfStack = 3; + pxTopOfStack--; + + /* R2. */ + *pxTopOfStack = 2; + pxTopOfStack--; + + /* R1. */ + *pxTopOfStack = 1; + pxTopOfStack--; + + /* R0 */ + *pxTopOfStack = 0; + pxTopOfStack--; + + /* MACL. */ + *pxTopOfStack = 16; + pxTopOfStack--; + + /* MACH. */ + *pxTopOfStack = 17; + pxTopOfStack--; + + /* GBR. */ + *pxTopOfStack = ulPortGetGBR(); + + /* GBR = global base register. + VBR = vector base register. + TBR = jump table base register. + R15 is the stack pointer. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void vApplicationSetupTimerInterrupt( void ); + + /* Call an application function to set up the timer that will generate the + tick interrupt. This way the application can decide which peripheral to + use. A demo application is provided to show a suitable example. */ + vApplicationSetupTimerInterrupt(); + + /* Start the first task. This will only restore the standard registers and + not the flop registers. This does not really matter though because the only + flop register that is initialised to a particular value is fpscr, and it is + only initialised to the current value, which will still be the current value + when the first task starts executing. */ + trapa( portSTART_SCHEDULER_TRAP_NO ); + + /* Should not get here. */ + return pdFAIL; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented as there is nothing to return to. */ +} +/*-----------------------------------------------------------*/ + +void vPortYield( void ) +{ +int32_t lInterruptMask; + + /* Ensure the yield trap runs at the same priority as the other interrupts + that can cause a context switch. */ + lInterruptMask = get_imask(); + + /* taskYIELD() can only be called from a task, not an interrupt, so the + current interrupt mask can only be 0 or portKERNEL_INTERRUPT_PRIORITY and + the mask can be set without risk of accidentally lowering the mask value. */ + set_imask( portKERNEL_INTERRUPT_PRIORITY ); + + trapa( portYIELD_TRAP_NO ); + + /* Restore the interrupt mask to whatever it was previously (when the + function was entered). */ + set_imask( ( int ) lInterruptMask ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortUsesFloatingPoint( TaskHandle_t xTask ) +{ +uint32_t *pulFlopBuffer; +BaseType_t xReturn; +extern void * volatile pxCurrentTCB; + + /* This function tells the kernel that the task referenced by xTask is + going to use the floating point registers and therefore requires the + floating point registers saved as part of its context. */ + + /* Passing NULL as xTask is used to indicate that the calling task is the + subject task - so pxCurrentTCB is the task handle. */ + if( xTask == NULL ) + { + xTask = ( TaskHandle_t ) pxCurrentTCB; + } + + /* Allocate a buffer large enough to hold all the flop registers. */ + pulFlopBuffer = ( uint32_t * ) pvPortMalloc( portFLOP_STORAGE_SIZE ); + + if( pulFlopBuffer != NULL ) + { + /* Start with the registers in a benign state. */ + memset( ( void * ) pulFlopBuffer, 0x00, portFLOP_STORAGE_SIZE ); + + /* The first thing to get saved in the buffer is the FPSCR value - + initialise this to the current FPSCR value. */ + *pulFlopBuffer = get_fpscr(); + + /* Use the task tag to point to the flop buffer. Pass pointer to just + above the buffer because the flop save routine uses a pre-decrement. */ + vTaskSetApplicationTaskTag( xTask, ( void * ) ( pulFlopBuffer + portFLOP_REGISTERS_TO_STORE ) ); + xReturn = pdPASS; + } + else + { + xReturn = pdFAIL; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Renesas/SH2A_FPU/portasm.src b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Renesas/SH2A_FPU/portasm.src new file mode 100644 index 0000000..81a4146 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Renesas/SH2A_FPU/portasm.src @@ -0,0 +1,177 @@ +;/* +; FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. +; All rights reserved +; +; +; *************************************************************************** +; * * +; * FreeRTOS tutorial books are available in pdf and paperback. * +; * Complete, revised, and edited pdf reference manuals are also * +; * available. * +; * * +; * Purchasing FreeRTOS documentation will not only help you, by * +; * ensuring you get running as quickly as possible and with an * +; * in-depth knowledge of how to use FreeRTOS, it will also help * +; * the FreeRTOS project to continue with its mission of providing * +; * professional grade, cross platform, de facto standard solutions * +; * for microcontrollers - completely free of charge! * +; * * +; * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * +; * * +; * Thank you for using FreeRTOS, and thank you for your support! * +; * * +; *************************************************************************** +; +; +; This file is part of the FreeRTOS distribution. +; +; FreeRTOS is free software; you can redistribute it and/or modify it under +; the terms of the GNU General Public License (version 2) as published by the +; Free Software Foundation AND MODIFIED BY the FreeRTOS exception. +; >>>NOTE<<< The modification to the GPL is included to allow you to +; distribute a combined work that includes FreeRTOS without being obliged to +; provide the source code for proprietary components outside of the FreeRTOS +; kernel. FreeRTOS is distributed in the hope that it will be useful, but +; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +; more details. You should have received a copy of the GNU General Public +; License and the FreeRTOS license exception along with FreeRTOS; if not it +; can be viewed here: http://www.freertos.org/a00114.html and also obtained +; by writing to Richard Barry, contact details for whom are available on the +; FreeRTOS WEB site. +; +; 1 tab == 4 spaces! +; +; http://www.FreeRTOS.org - Documentation, latest information, license and +; contact details. +; +; http://www.SafeRTOS.com - A version that is certified for use in safety +; critical systems. +; +; http://www.OpenRTOS.com - Commercial support, development, porting, +; licensing and training services. +;*/ + + .import _pxCurrentTCB + .import _vTaskSwitchContext + .import _xTaskIncrementTick + + .export _vPortStartFirstTask + .export _ulPortGetGBR + .export _vPortYieldHandler + .export _vPortPreemptiveTick + .export _vPortCooperativeTick + .export _vPortSaveFlopRegisters + .export _vPortRestoreFlopRegisters + + .section P + + .INCLUDE "ISR_Support.inc" + +_vPortStartFirstTask: + + portRESTORE_CONTEXT + +;----------------------------------------------------------- + +_vPortYieldHandler: + + portSAVE_CONTEXT + + mov.l #_vTaskSwitchContext, r0 + jsr @r0 + nop + + portRESTORE_CONTEXT + +;----------------------------------------------------------- + +_vPortPreemptiveTick + + portSAVE_CONTEXT + + mov.l #_xTaskIncrementTick, r0 + jsr @r0 + nop + + mov.l #_vTaskSwitchContext, r0 + jsr @r0 + nop + + portRESTORE_CONTEXT + +;----------------------------------------------------------- + +_vPortCooperativeTick + + portSAVE_CONTEXT + + mov.l #_xTaskIncrementTick, r0 + jsr @r0 + nop + + portRESTORE_CONTEXT + +;----------------------------------------------------------- + +_ulPortGetGBR: + + stc.l gbr, r0 + rts + nop + +;----------------------------------------------------------- + +_vPortSaveFlopRegisters: + + fmov.s fr0, @-r4 + fmov.s fr1, @-r4 + fmov.s fr2, @-r4 + fmov.s fr3, @-r4 + fmov.s fr4, @-r4 + fmov.s fr5, @-r4 + fmov.s fr6, @-r4 + fmov.s fr7, @-r4 + fmov.s fr8, @-r4 + fmov.s fr9, @-r4 + fmov.s fr10, @-r4 + fmov.s fr11, @-r4 + fmov.s fr12, @-r4 + fmov.s fr13, @-r4 + fmov.s fr14, @-r4 + fmov.s fr15, @-r4 + sts.l fpul, @-r4 + sts.l fpscr, @-r4 + + rts + nop + +;----------------------------------------------------------- + +_vPortRestoreFlopRegisters: + + add.l #-72, r4 + lds.l @r4+, fpscr + lds.l @r4+, fpul + fmov.s @r4+, fr15 + fmov.s @r4+, fr14 + fmov.s @r4+, fr13 + fmov.s @r4+, fr12 + fmov.s @r4+, fr11 + fmov.s @r4+, fr10 + fmov.s @r4+, fr9 + fmov.s @r4+, fr8 + fmov.s @r4+, fr7 + fmov.s @r4+, fr6 + fmov.s @r4+, fr5 + fmov.s @r4+, fr4 + fmov.s @r4+, fr3 + fmov.s @r4+, fr2 + fmov.s @r4+, fr1 + fmov.s @r4+, fr0 + + rts + nop + + .end + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Renesas/SH2A_FPU/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Renesas/SH2A_FPU/portmacro.h new file mode 100644 index 0000000..1ba51a9 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Renesas/SH2A_FPU/portmacro.h @@ -0,0 +1,181 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions - these are a bit legacy and not really used now, other than +portSTACK_TYPE and portBASE_TYPE. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 8 +#define portSTACK_GROWTH -1 +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portNOP() nop() +#define portSTART_SCHEDULER_TRAP_NO ( 32 ) +#define portYIELD_TRAP_NO ( 33 ) +#define portKERNEL_INTERRUPT_PRIORITY ( 1 ) + +void vPortYield( void ); +#define portYIELD() vPortYield() + +extern void vTaskSwitchContext( void ); +#define portYIELD_FROM_ISR( x ) if( x != pdFALSE ) vTaskSwitchContext() + +/* + * This function tells the kernel that the task referenced by xTask is going to + * use the floating point registers and therefore requires the floating point + * registers saved as part of its context. + */ +BaseType_t xPortUsesFloatingPoint( void* xTask ); + +/* + * The flop save and restore functions are defined in portasm.src and called by + * the trace "task switched in" and "trace task switched out" macros. + */ +void vPortSaveFlopRegisters( void *pulBuffer ); +void vPortRestoreFlopRegisters( void *pulBuffer ); + +/* + * pxTaskTag is used to point to the buffer into which the floating point + * context should be saved. If pxTaskTag is NULL then the task does not use + * a floating point context. + */ +#define traceTASK_SWITCHED_OUT() if( pxCurrentTCB->pxTaskTag != NULL ) vPortSaveFlopRegisters( pxCurrentTCB->pxTaskTag ) +#define traceTASK_SWITCHED_IN() if( pxCurrentTCB->pxTaskTag != NULL ) vPortRestoreFlopRegisters( pxCurrentTCB->pxTaskTag ) + +/* + * These macros should be called directly, but through the taskENTER_CRITICAL() + * and taskEXIT_CRITICAL() macros. + */ +#define portENABLE_INTERRUPTS() set_imask( 0x00 ) +#define portDISABLE_INTERRUPTS() set_imask( portKERNEL_INTERRUPT_PRIORITY ) + +/* Critical nesting counts are stored in the TCB. */ +#define portCRITICAL_NESTING_IN_TCB ( 1 ) + +/* The critical nesting functions defined within tasks.c. */ +extern void vTaskEnterCritical( void ); +extern void vTaskExitCritical( void ); +#define portENTER_CRITICAL() vTaskEnterCritical(); +#define portEXIT_CRITICAL() vTaskExitCritical(); + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Rowley/ARM7/readme.txt b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Rowley/ARM7/readme.txt new file mode 100644 index 0000000..8d3e87f --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Rowley/ARM7/readme.txt @@ -0,0 +1 @@ +The Rowley ARM7 demo uses the GCC ARM7 port files. \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Rowley/MSP430F449/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Rowley/MSP430F449/port.c new file mode 100644 index 0000000..e725ca2 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Rowley/MSP430F449/port.c @@ -0,0 +1,214 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the MSP430 port. + *----------------------------------------------------------*/ + +/* Constants required for hardware setup. The tick ISR runs off the ACLK, +not the MCLK. */ +#define portACLK_FREQUENCY_HZ ( ( TickType_t ) 32768 ) +#define portINITIAL_CRITICAL_NESTING ( ( uint16_t ) 10 ) +#define portFLAGS_INT_ENABLED ( ( StackType_t ) 0x08 ) + +/* We require the address of the pxCurrentTCB variable, but don't want to know +any details of its type. */ +typedef void TCB_t; +extern volatile TCB_t * volatile pxCurrentTCB; + +/* Each task maintains a count of the critical section nesting depth. Each +time a critical section is entered the count is incremented. Each time a +critical section is exited the count is decremented - with interrupts only +being re-enabled if the count is zero. + +usCriticalNesting will get set to zero when the scheduler starts, but must +not be initialised to zero as this will cause problems during the startup +sequence. */ +volatile uint16_t usCriticalNesting = portINITIAL_CRITICAL_NESTING; +/*-----------------------------------------------------------*/ + + +/* + * Sets up the periodic ISR used for the RTOS tick. This uses timer 0, but + * could have alternatively used the watchdog timer or timer 1. + */ +void prvSetupTimerInterrupt( void ); +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been called. + * + * See the header file portable.h. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* + Place a few bytes of known values on the bottom of the stack. + This is just useful for debugging and can be included if required. + + *pxTopOfStack = ( StackType_t ) 0x1111; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x2222; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x3333; + pxTopOfStack--; + */ + + /* The msp430 automatically pushes the PC then SR onto the stack before + executing an ISR. We want the stack to look just as if this has happened + so place a pointer to the start of the task on the stack first - followed + by the flags we want the task to use when it starts up. */ + *pxTopOfStack = ( StackType_t ) pxCode; + pxTopOfStack--; + *pxTopOfStack = portFLAGS_INT_ENABLED; + pxTopOfStack--; + + /* Next the general purpose registers. */ + *pxTopOfStack = ( StackType_t ) 0x4444; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x5555; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x6666; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x7777; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x8888; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x9999; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xaaaa; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xbbbb; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xcccc; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xdddd; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xeeee; + pxTopOfStack--; + + /* When the task starts is will expect to find the function parameter in + R15. */ + *pxTopOfStack = ( StackType_t ) pvParameters; + pxTopOfStack--; + + /* A variable is used to keep track of the critical section nesting. + This variable has to be stored as part of the task context and is + initially set to zero. */ + *pxTopOfStack = ( StackType_t ) portNO_CRITICAL_SECTION_NESTING; + + /* Return a pointer to the top of the stack we have generated so this can + be stored in the task control block for the task. */ + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the MSP430 port will get stopped. If required simply + disable the tick interrupt here. */ +} +/*-----------------------------------------------------------*/ + +/* + * Hardware initialisation to generate the RTOS tick. This uses timer 0 + * but could alternatively use the watchdog timer or timer 1. + */ +void prvSetupTimerInterrupt( void ) +{ + /* Ensure the timer is stopped. */ + TACTL = 0; + + /* Run the timer of the ACLK. */ + TACTL = TASSEL_1; + + /* Clear everything to start with. */ + TACTL |= TACLR; + + /* Set the compare match value according to the tick rate we want. */ + TACCR0 = portACLK_FREQUENCY_HZ / configTICK_RATE_HZ; + + /* Enable the interrupts. */ + TACCTL0 = CCIE; + + /* Start up clean. */ + TACTL |= TACLR; + + /* Up mode. */ + TACTL |= MC_1; +} +/*-----------------------------------------------------------*/ + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Rowley/MSP430F449/portasm.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Rowley/MSP430F449/portasm.h new file mode 100644 index 0000000..ca67ce2 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Rowley/MSP430F449/portasm.h @@ -0,0 +1,122 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORT_ASM_H +#define PORT_ASM_H + +portSAVE_CONTEXT macro + /* Save the remaining registers. */ + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + mov.w &_usCriticalNesting, r14 + push r14 + mov.w &_pxCurrentTCB, r12 + mov.w r1, @r12 + endm +/*-----------------------------------------------------------*/ + +portRESTORE_CONTEXT macro + mov.w &_pxCurrentTCB, r12 + mov.w @r12, r1 + pop r15 + mov.w r15, &_usCriticalNesting + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + + /* The last thing on the stack will be the status register. + Ensure the power down bits are clear ready for the next + time this power down register is popped from the stack. */ + bic.w #0xf0,0(SP) + + reti + endm +/*-----------------------------------------------------------*/ + +#endif + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Rowley/MSP430F449/portext.asm b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Rowley/MSP430F449/portext.asm new file mode 100644 index 0000000..ada08b4 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Rowley/MSP430F449/portext.asm @@ -0,0 +1,144 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#include "FreeRTOSConfig.h" +#include "portasm.h" + + +.CODE + +/* + * The RTOS tick ISR. + * + * If the cooperative scheduler is in use this simply increments the tick + * count. + * + * If the preemptive scheduler is in use a context switch can also occur. + */ +_vTickISR: + portSAVE_CONTEXT + + call #_xTaskIncrementTick + cmp.w #0x00, r15 + jeq _SkipContextSwitch + call #_vTaskSwitchContext +_SkipContextSwitch: + portRESTORE_CONTEXT +/*-----------------------------------------------------------*/ + + +/* + * Manual context switch called by the portYIELD() macro. + */ +_vPortYield:: + + /* Mimic an interrupt by pushing the SR. */ + push SR + + /* Now the SR is stacked we can disable interrupts. */ + dint + + /* Save the context of the current task. */ + portSAVE_CONTEXT + + /* Switch to the highest priority task that is ready to run. */ + call #_vTaskSwitchContext + + /* Restore the context of the new task. */ + portRESTORE_CONTEXT +/*-----------------------------------------------------------*/ + + +/* + * Start off the scheduler by initialising the RTOS tick timer, then restoring + * the context of the first task. + */ +_xPortStartScheduler:: + + /* Setup the hardware to generate the tick. Interrupts are disabled + when this function is called. */ + call #_prvSetupTimerInterrupt + + /* Restore the context of the first task that is going to run. */ + portRESTORE_CONTEXT +/*-----------------------------------------------------------*/ + + + /* Place the tick ISR in the correct vector. */ + .VECTORS + + .KEEP + + ORG TIMERA0_VECTOR + DW _vTickISR + + + + END + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Rowley/MSP430F449/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Rowley/MSP430F449/portmacro.h new file mode 100644 index 0000000..8bd888e --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Rowley/MSP430F449/portmacro.h @@ -0,0 +1,174 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT int +#define portSTACK_TYPE uint16_t +#define portBASE_TYPE short + +typedef portSTACK_TYPE StackType_t; +typedef short BaseType_t; +typedef unsigned short UBaseType_t; + + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif + +/*-----------------------------------------------------------*/ + +/* Interrupt control macros. */ +#define portDISABLE_INTERRUPTS() _DINT(); _NOP() +#define portENABLE_INTERRUPTS() _EINT(); +/*-----------------------------------------------------------*/ + +/* Critical section control macros. */ +#define portNO_CRITICAL_SECTION_NESTING ( ( uint16_t ) 0 ) + +#define portENTER_CRITICAL() \ +{ \ +extern volatile uint16_t usCriticalNesting; \ + \ + portDISABLE_INTERRUPTS(); \ + \ + /* Now interrupts are disabled usCriticalNesting can be accessed */ \ + /* directly. Increment ulCriticalNesting to keep a count of how many */ \ + /* times portENTER_CRITICAL() has been called. */ \ + usCriticalNesting++; \ +} + +#define portEXIT_CRITICAL() \ +{ \ +extern volatile uint16_t usCriticalNesting; \ + \ + if( usCriticalNesting > portNO_CRITICAL_SECTION_NESTING ) \ + { \ + /* Decrement the nesting count as we are leaving a critical section. */ \ + usCriticalNesting--; \ + \ + /* If the nesting level has reached zero then interrupts should be */ \ + /* re-enabled. */ \ + if( usCriticalNesting == portNO_CRITICAL_SECTION_NESTING ) \ + { \ + portENABLE_INTERRUPTS(); \ + } \ + } \ +} +/*-----------------------------------------------------------*/ + +/* Task utilities. */ + +/* + * Manual context switch called by portYIELD or taskYIELD. + */ +extern void vPortYield( void ); +#define portYIELD() vPortYield() +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 2 +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portNOP() +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) __toplevel + +#if configINTERRUPT_EXAMPLE_METHOD == 2 + +extern void vTaskSwitchContext( void ); +#define portYIELD_FROM_ISR( x ) if( x ) vTaskSwitchContext() + +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/SDCC/Cygnal/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/SDCC/Cygnal/port.c new file mode 100644 index 0000000..414f5ab --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/SDCC/Cygnal/port.c @@ -0,0 +1,466 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the Cygnal port. + *----------------------------------------------------------*/ + +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Constants required to setup timer 2 to produce the RTOS tick. */ +#define portCLOCK_DIVISOR ( ( uint32_t ) 12 ) +#define portMAX_TIMER_VALUE ( ( uint32_t ) 0xffff ) +#define portENABLE_TIMER ( ( uint8_t ) 0x04 ) +#define portTIMER_2_INTERRUPT_ENABLE ( ( uint8_t ) 0x20 ) + +/* The value used in the IE register when a task first starts. */ +#define portGLOBAL_INTERRUPT_BIT ( ( StackType_t ) 0x80 ) + +/* The value used in the PSW register when a task first starts. */ +#define portINITIAL_PSW ( ( StackType_t ) 0x00 ) + +/* Macro to clear the timer 2 interrupt flag. */ +#define portCLEAR_INTERRUPT_FLAG() TMR2CN &= ~0x80; + +/* Used during a context switch to store the size of the stack being copied +to or from XRAM. */ +data static uint8_t ucStackBytes; + +/* Used during a context switch to point to the next byte in XRAM from/to which +a RAM byte is to be copied. */ +xdata static StackType_t * data pxXRAMStack; + +/* Used during a context switch to point to the next byte in RAM from/to which +an XRAM byte is to be copied. */ +data static StackType_t * data pxRAMStack; + +/* We require the address of the pxCurrentTCB variable, but don't want to know +any details of its type. */ +typedef void TCB_t; +extern volatile TCB_t * volatile pxCurrentTCB; + +/* + * Setup the hardware to generate an interrupt off timer 2 at the required + * frequency. + */ +static void prvSetupTimerInterrupt( void ); + +/*-----------------------------------------------------------*/ +/* + * Macro that copies the current stack from internal RAM to XRAM. This is + * required as the 8051 only contains enough internal RAM for a single stack, + * but we have a stack for every task. + */ +#define portCOPY_STACK_TO_XRAM() \ +{ \ + /* pxCurrentTCB points to a TCB which itself points to the location into \ + which the first stack byte should be copied. Set pxXRAMStack to point \ + to the location into which the first stack byte is to be copied. */ \ + pxXRAMStack = ( xdata StackType_t * ) *( ( xdata StackType_t ** ) pxCurrentTCB ); \ + \ + /* Set pxRAMStack to point to the first byte to be coped from the stack. */ \ + pxRAMStack = ( data StackType_t * data ) configSTACK_START; \ + \ + /* Calculate the size of the stack we are about to copy from the current \ + stack pointer value. */ \ + ucStackBytes = SP - ( configSTACK_START - 1 ); \ + \ + /* Before starting to copy the stack, store the calculated stack size so \ + the stack can be restored when the task is resumed. */ \ + *pxXRAMStack = ucStackBytes; \ + \ + /* Copy each stack byte in turn. pxXRAMStack is incremented first as we \ + have already stored the stack size into XRAM. */ \ + while( ucStackBytes ) \ + { \ + pxXRAMStack++; \ + *pxXRAMStack = *pxRAMStack; \ + pxRAMStack++; \ + ucStackBytes--; \ + } \ +} +/*-----------------------------------------------------------*/ + +/* + * Macro that copies the stack of the task being resumed from XRAM into + * internal RAM. + */ +#define portCOPY_XRAM_TO_STACK() \ +{ \ + /* Setup the pointers as per portCOPY_STACK_TO_XRAM(), but this time to \ + copy the data back out of XRAM and into the stack. */ \ + pxXRAMStack = ( xdata StackType_t * ) *( ( xdata StackType_t ** ) pxCurrentTCB ); \ + pxRAMStack = ( data StackType_t * data ) ( configSTACK_START - 1 ); \ + \ + /* The first value stored in XRAM was the size of the stack - i.e. the \ + number of bytes we need to copy back. */ \ + ucStackBytes = pxXRAMStack[ 0 ]; \ + \ + /* Copy the required number of bytes back into the stack. */ \ + do \ + { \ + pxXRAMStack++; \ + pxRAMStack++; \ + *pxRAMStack = *pxXRAMStack; \ + ucStackBytes--; \ + } while( ucStackBytes ); \ + \ + /* Restore the stack pointer ready to use the restored stack. */ \ + SP = ( uint8_t ) pxRAMStack; \ +} +/*-----------------------------------------------------------*/ + +/* + * Macro to push the current execution context onto the stack, before the stack + * is moved to XRAM. + */ +#define portSAVE_CONTEXT() \ +{ \ + _asm \ + /* Push ACC first, as when restoring the context it must be restored \ + last (it is used to set the IE register). */ \ + push ACC \ + /* Store the IE register then disable interrupts. */ \ + push IE \ + clr _EA \ + push DPL \ + push DPH \ + push b \ + push ar2 \ + push ar3 \ + push ar4 \ + push ar5 \ + push ar6 \ + push ar7 \ + push ar0 \ + push ar1 \ + push PSW \ + _endasm; \ + PSW = 0; \ + _asm \ + push _bp \ + _endasm; \ +} +/*-----------------------------------------------------------*/ + +/* + * Macro that restores the execution context from the stack. The execution + * context was saved into the stack before the stack was copied into XRAM. + */ +#define portRESTORE_CONTEXT() \ +{ \ + _asm \ + pop _bp \ + pop PSW \ + pop ar1 \ + pop ar0 \ + pop ar7 \ + pop ar6 \ + pop ar5 \ + pop ar4 \ + pop ar3 \ + pop ar2 \ + pop b \ + pop DPH \ + pop DPL \ + /* The next byte of the stack is the IE register. Only the global \ + enable bit forms part of the task context. Pop off the IE then set \ + the global enable bit to match that of the stored IE register. */ \ + pop ACC \ + JB ACC.7,0098$ \ + CLR IE.7 \ + LJMP 0099$ \ + 0098$: \ + SETB IE.7 \ + 0099$: \ + /* Finally pop off the ACC, which was the first register saved. */ \ + pop ACC \ + reti \ + _endasm; \ +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +uint32_t ulAddress; +StackType_t *pxStartOfStack; + + /* Leave space to write the size of the stack as the first byte. */ + pxStartOfStack = pxTopOfStack; + pxTopOfStack++; + + /* Place a few bytes of known values on the bottom of the stack. + This is just useful for debugging and can be uncommented if required. + *pxTopOfStack = 0x11; + pxTopOfStack++; + *pxTopOfStack = 0x22; + pxTopOfStack++; + *pxTopOfStack = 0x33; + pxTopOfStack++; + */ + + /* Simulate how the stack would look after a call to the scheduler tick + ISR. + + The return address that would have been pushed by the MCU. */ + ulAddress = ( uint32_t ) pxCode; + *pxTopOfStack = ( StackType_t ) ulAddress; + ulAddress >>= 8; + pxTopOfStack++; + *pxTopOfStack = ( StackType_t ) ( ulAddress ); + pxTopOfStack++; + + /* Next all the registers will have been pushed by portSAVE_CONTEXT(). */ + *pxTopOfStack = 0xaa; /* acc */ + pxTopOfStack++; + + /* We want tasks to start with interrupts enabled. */ + *pxTopOfStack = portGLOBAL_INTERRUPT_BIT; + pxTopOfStack++; + + /* The function parameters will be passed in the DPTR and B register as + a three byte generic pointer is used. */ + ulAddress = ( uint32_t ) pvParameters; + *pxTopOfStack = ( StackType_t ) ulAddress; /* DPL */ + ulAddress >>= 8; + *pxTopOfStack++; + *pxTopOfStack = ( StackType_t ) ulAddress; /* DPH */ + ulAddress >>= 8; + pxTopOfStack++; + *pxTopOfStack = ( StackType_t ) ulAddress; /* b */ + pxTopOfStack++; + + /* The remaining registers are straight forward. */ + *pxTopOfStack = 0x02; /* R2 */ + pxTopOfStack++; + *pxTopOfStack = 0x03; /* R3 */ + pxTopOfStack++; + *pxTopOfStack = 0x04; /* R4 */ + pxTopOfStack++; + *pxTopOfStack = 0x05; /* R5 */ + pxTopOfStack++; + *pxTopOfStack = 0x06; /* R6 */ + pxTopOfStack++; + *pxTopOfStack = 0x07; /* R7 */ + pxTopOfStack++; + *pxTopOfStack = 0x00; /* R0 */ + pxTopOfStack++; + *pxTopOfStack = 0x01; /* R1 */ + pxTopOfStack++; + *pxTopOfStack = 0x00; /* PSW */ + pxTopOfStack++; + *pxTopOfStack = 0xbb; /* BP */ + + /* Dont increment the stack size here as we don't want to include + the stack size byte as part of the stack size count. + + Finally we place the stack size at the beginning. */ + *pxStartOfStack = ( StackType_t ) ( pxTopOfStack - pxStartOfStack ); + + /* Unlike most ports, we return the start of the stack as this is where the + size of the stack is stored. */ + return pxStartOfStack; +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + /* Setup timer 2 to generate the RTOS tick. */ + prvSetupTimerInterrupt(); + + /* Make sure we start with the expected SFR page. This line should not + really be required. */ + SFRPAGE = 0; + + /* Copy the stack for the first task to execute from XRAM into the stack, + restore the task context from the new stack, then start running the task. */ + portCOPY_XRAM_TO_STACK(); + portRESTORE_CONTEXT(); + + /* Should never get here! */ + return pdTRUE; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented for this port. */ +} +/*-----------------------------------------------------------*/ + +/* + * Manual context switch. The first thing we do is save the registers so we + * can use a naked attribute. + */ +void vPortYield( void ) _naked +{ + /* Save the execution context onto the stack, then copy the entire stack + to XRAM. This is necessary as the internal RAM is only large enough to + hold one stack, and we want one per task. + + PERFORMANCE COULD BE IMPROVED BY ONLY COPYING TO XRAM IF A TASK SWITCH + IS REQUIRED. */ + portSAVE_CONTEXT(); + portCOPY_STACK_TO_XRAM(); + + /* Call the standard scheduler context switch function. */ + vTaskSwitchContext(); + + /* Copy the stack of the task about to execute from XRAM into RAM and + restore it's context ready to run on exiting. */ + portCOPY_XRAM_TO_STACK(); + portRESTORE_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +#if configUSE_PREEMPTION == 1 + void vTimer2ISR( void ) interrupt 5 _naked + { + /* Preemptive context switch function triggered by the timer 2 ISR. + This does the same as vPortYield() (see above) with the addition + of incrementing the RTOS tick count. */ + + portSAVE_CONTEXT(); + portCOPY_STACK_TO_XRAM(); + + if( xTaskIncrementTick() != pdFALSE ) + { + vTaskSwitchContext(); + } + + portCLEAR_INTERRUPT_FLAG(); + portCOPY_XRAM_TO_STACK(); + portRESTORE_CONTEXT(); + } +#else + void vTimer2ISR( void ) interrupt 5 + { + /* When using the cooperative scheduler the timer 2 ISR is only + required to increment the RTOS tick count. */ + + xTaskIncrementTick(); + portCLEAR_INTERRUPT_FLAG(); + } +#endif +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt( void ) +{ +uint8_t ucOriginalSFRPage; + +/* Constants calculated to give the required timer capture values. */ +const uint32_t ulTicksPerSecond = configCPU_CLOCK_HZ / portCLOCK_DIVISOR; +const uint32_t ulCaptureTime = ulTicksPerSecond / configTICK_RATE_HZ; +const uint32_t ulCaptureValue = portMAX_TIMER_VALUE - ulCaptureTime; +const uint8_t ucLowCaptureByte = ( uint8_t ) ( ulCaptureValue & ( uint32_t ) 0xff ); +const uint8_t ucHighCaptureByte = ( uint8_t ) ( ulCaptureValue >> ( uint32_t ) 8 ); + + /* NOTE: This uses a timer only present on 8052 architecture. */ + + /* Remember the current SFR page so we can restore it at the end of the + function. */ + ucOriginalSFRPage = SFRPAGE; + SFRPAGE = 0; + + /* TMR2CF can be left in its default state. */ + TMR2CF = ( uint8_t ) 0; + + /* Setup the overflow reload value. */ + RCAP2L = ucLowCaptureByte; + RCAP2H = ucHighCaptureByte; + + /* The initial load is performed manually. */ + TMR2L = ucLowCaptureByte; + TMR2H = ucHighCaptureByte; + + /* Enable the timer 2 interrupts. */ + IE |= portTIMER_2_INTERRUPT_ENABLE; + + /* Interrupts are disabled when this is called so the timer can be started + here. */ + TMR2CN = portENABLE_TIMER; + + /* Restore the original SFR page. */ + SFRPAGE = ucOriginalSFRPage; +} + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/SDCC/Cygnal/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/SDCC/Cygnal/portmacro.h new file mode 100644 index 0000000..80fc200 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/SDCC/Cygnal/portmacro.h @@ -0,0 +1,157 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#if configUSE_PREEMPTION == 0 + void vTimer2ISR( void ) interrupt 5; +#else + void vTimer2ISR( void ) interrupt 5 _naked; +#endif + +void vSerialISR( void ) interrupt 4; + + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE float +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint8_t +#define portBASE_TYPE char + +typedef portSTACK_TYPE StackType_t; +typedef signed char BaseType_t; +typedef unsigned char UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +#define portENTER_CRITICAL() _asm \ + push ACC \ + push IE \ + _endasm; \ + EA = 0; + +#define portEXIT_CRITICAL() _asm \ + pop ACC \ + _endasm; \ + ACC &= 0x80; \ + IE |= ACC; \ + _asm \ + pop ACC \ + _endasm; + +#define portDISABLE_INTERRUPTS() EA = 0; +#define portENABLE_INTERRUPTS() EA = 1; +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 1 +#define portSTACK_GROWTH ( 1 ) +#define portTICK_PERIOD_MS ( ( uint32_t ) 1000 / configTICK_RATE_HZ ) +/*-----------------------------------------------------------*/ + +/* Task utilities. */ +void vPortYield( void ) _naked; +#define portYIELD() vPortYield(); +/*-----------------------------------------------------------*/ + +#define portNOP() _asm \ + nop \ + _endasm; + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#endif /* PORTMACRO_H */ + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Softune/MB91460/__STD_LIB_sbrk.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Softune/MB91460/__STD_LIB_sbrk.c new file mode 100644 index 0000000..fe70d48 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Softune/MB91460/__STD_LIB_sbrk.c @@ -0,0 +1,23 @@ +#include "FreeRTOSConfig.h" +#include + + static long brk_siz = 0; +// #if configTOTAL_HEAP_SIZE != 0 + typedef int _heep_t; + #define ROUNDUP(s) (((s)+sizeof(_heep_t)-1)&~(sizeof(_heep_t)-1)) + static _heep_t _heep[ROUNDUP(configTOTAL_HEAP_SIZE)/sizeof(_heep_t)]; + #define _heep_size ROUNDUP(configTOTAL_HEAP_SIZE) +/* #else + extern char *_heep; + extern long _heep_size; + #endif +*/ + extern char *sbrk(int size) + { + if (brk_siz + size > _heep_size || brk_siz + size < 0) + + return((char*)-1); + brk_siz += size; + return( (char*)_heep + brk_siz - size); + } + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Softune/MB91460/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Softune/MB91460/port.c new file mode 100644 index 0000000..76c1ba6 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Softune/MB91460/port.c @@ -0,0 +1,363 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#include "FreeRTOS.h" +#include "task.h" +#include "mb91467d.h" + +/*-----------------------------------------------------------*/ + +/* We require the address of the pxCurrentTCB variable, but don't want to know +any details of its type. */ +typedef void TCB_t; +extern volatile TCB_t * volatile pxCurrentTCB; + +/*-----------------------------------------------------------*/ + +#pragma asm +#macro SaveContext + ORCCR #0x20 ;Switch to user stack + ST RP,@-R15 ;Store RP + STM0 (R7,R6,R5,R4,R3,R2,R1,R0) ;Store R7-R0 + STM1 (R14,R13,R12,R11,R10,R9,R8) ;Store R14-R8 + ST MDH, @-R15 ;Store MDH + ST MDL, @-R15 ;Store MDL + + ANDCCR #0xDF ;Switch back to system stack + LD @R15+,R0 ;Store PC to R0 + ORCCR #0x20 ;Switch to user stack + ST R0,@-R15 ;Store PC to User stack + + ANDCCR #0xDF ;Switch back to system stack + LD @R15+,R0 ;Store PS to R0 + ORCCR #0x20 ;Switch to user stack + ST R0,@-R15 ;Store PS to User stack + + LDI #_pxCurrentTCB, R0 ;Get pxCurrentTCB address + LD @R0, R0 ;Get the pxCurrentTCB->pxTopOfStack address + ST R15,@R0 ;Store USP to pxCurrentTCB->pxTopOfStack + + ANDCCR #0xDF ;Switch back to system stack for the rest of tick ISR +#endm + +#macro RestoreContext + LDI #_pxCurrentTCB, R0 ;Get pxCurrentTCB address + LD @R0, R0 ;Get the pxCurrentTCB->pxTopOfStack address + ORCCR #0x20 ;Switch to user stack + LD @R0, R15 ;Restore USP from pxCurrentTCB->pxTopOfStack + + LD @R15+,R0 ;Store PS to R0 + ANDCCR #0xDF ;Switch to system stack + ST R0,@-R15 ;Store PS to system stack + + ORCCR #0x20 ;Switch to user stack + LD @R15+,R0 ;Store PC to R0 + ANDCCR #0xDF ;Switch to system stack + ST R0,@-R15 ;Store PC to system stack + + ORCCR #0x20 ;Switch back to retrieve the remaining context + + LD @R15+, MDL ;Restore MDL + LD @R15+, MDH ;Restore MDH + LDM1 (R14,R13,R12,R11,R10,R9,R8) ;Restore R14-R8 + LDM0 (R7,R6,R5,R4,R3,R2,R1,R0) ;Restore R7-R0 + LD @R15+, RP ;Restore RP + + ANDCCR #0xDF ;Switch back to system stack for the rest of tick ISR +#endm +#pragma endasm + +/*-----------------------------------------------------------*/ + +/* + * Perform hardware setup to enable ticks from timer 1, + */ +static void prvSetupTimerInterrupt( void ); +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been called. + * + * See the header file portable.h. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Place a few bytes of known values on the bottom of the stack. + This is just useful for debugging. */ + + *pxTopOfStack = 0x11111111; + pxTopOfStack--; + *pxTopOfStack = 0x22222222; + pxTopOfStack--; + *pxTopOfStack = 0x33333333; + pxTopOfStack--; + + /* This is a redundant push to the stack, it may be required if + in some implementations of the compiler the parameter to the task + is passed on to the stack rather than in R4 register. */ + *pxTopOfStack = (StackType_t)(pvParameters); + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) 0x00000000; /* RP */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x00007777; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x00006666; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x00005555; /* R5 */ + pxTopOfStack--; + + /* In the current implementation of the compiler the first + parameter to the task (or function) is passed via R4 parameter + to the task, hence the pvParameters pointer is copied into the R4 + register. See compiler manual section 4.6.2 for more information. */ + *pxTopOfStack = ( StackType_t ) (pvParameters); /* R4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x00003333; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x00002222; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x00001111; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x00000001; /* R0 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x0000EEEE; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x0000DDDD; /* R13 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x0000CCCC; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x0000BBBB; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x0000AAAA; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x00009999; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x00008888; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11110000; /* MDH */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x22220000; /* MDL */ + pxTopOfStack--; + + /* The start of the task code. */ + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + + /* PS - User Mode, USP, ILM=31, Interrupts enabled */ + *pxTopOfStack = ( StackType_t ) 0x001F0030; /* PS */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* Setup the hardware to generate the tick. */ + prvSetupTimerInterrupt(); + + /* Restore the context of the first task that is going to run. */ + #pragma asm + RestoreContext + #pragma endasm + + /* Simulate a function call end as generated by the compiler. We will now + jump to the start of the task the context of which we have just restored. */ + __asm(" reti "); + + /* Should not get here. */ + return pdFAIL; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented - unlikely to ever be required as there is nothing to + return to. */ +} +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt( void ) +{ +/* The peripheral clock divided by 32 is used by the timer. */ +const uint16_t usReloadValue = ( uint16_t ) ( ( ( configPER_CLOCK_HZ / configTICK_RATE_HZ ) / 32UL ) - 1UL ); + + /* Setup RLT0 to generate a tick interrupt. */ + + TMCSR0_CNTE = 0; /* Count Disable */ + TMCSR0_CSL = 0x2; /* CLKP/32 */ + TMCSR0_MOD = 0; /* Software trigger */ + TMCSR0_RELD = 1; /* Reload */ + + TMCSR0_UF = 0; /* Clear underflow flag */ + TMRLR0 = usReloadValue; + TMCSR0_INTE = 1; /* Interrupt Enable */ + TMCSR0_CNTE = 1; /* Count Enable */ + TMCSR0_TRG = 1; /* Trigger */ + + PORTEN = 0x3; /* Port Enable */ +} +/*-----------------------------------------------------------*/ + +#if configUSE_PREEMPTION == 1 + + /* + * Tick ISR for preemptive scheduler. The tick count is incremented + * after the context is saved. Then the context is switched if required, + * and last the context of the task which is to be resumed is restored. + */ + + #pragma asm + + .global _ReloadTimer0_IRQHandler + _ReloadTimer0_IRQHandler: + + ANDCCR #0xEF ;Disable Interrupts + SaveContext ;Save context + ORCCR #0x10 ;Re-enable Interrupts + + LDI #0xFFFB,R1 + LDI #_tmcsr0, R0 + AND R1,@R0 ;Clear RLT0 interrupt flag + + CALL32 _xTaskIncrementTick,R12 ;Increment Tick + CALL32 _vTaskSwitchContext,R12 ;Switch context if required + + ANDCCR #0xEF ;Disable Interrupts + RestoreContext ;Restore context + ORCCR #0x10 ;Re-enable Interrupts + + RETI + + #pragma endasm + +#else + + /* + * Tick ISR for the cooperative scheduler. All this does is increment the + * tick count. We don't need to switch context, this can only be done by + * manual calls to taskYIELD(); + */ + __interrupt void ReloadTimer0_IRQHandler( void ) + { + /* Clear RLT0 interrupt flag */ + TMCSR0_UF = 0; + xTaskIncrementTick(); + } + +#endif + +/* + * Manual context switch. We can use a __nosavereg attribute as the context + * would be saved by PortSAVE_CONTEXT(). The context is switched and then + * the context of the new task is restored saved. + */ +#pragma asm + + .global _vPortYieldDelayed + _vPortYieldDelayed: + + ANDCCR #0xEF ;Disable Interrupts + SaveContext ;Save context + ORCCR #0x10 ;Re-enable Interrupts + + LDI #_dicr, R0 + BANDL #0x0E, @R0 ;Clear Delayed interrupt flag + + CALL32 _vTaskSwitchContext,R12 ;Switch context if required + + ANDCCR #0xEF ;Disable Interrupts + RestoreContext ;Restore context + ORCCR #0x10 ;Re-enable Interrupts + + RETI + +#pragma endasm +/*-----------------------------------------------------------*/ + +/* + * Manual context switch. We can use a __nosavereg attribute as the context + * would be saved by PortSAVE_CONTEXT(). The context is switched and then + * the context of the new task is restored saved. + */ +#pragma asm + + .global _vPortYield + _vPortYield: + + SaveContext ;Save context + CALL32 _vTaskSwitchContext,R12 ;Switch context if required + RestoreContext ;Restore context + + RETI + +#pragma endasm +/*-----------------------------------------------------------*/ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Softune/MB91460/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Softune/MB91460/portmacro.h new file mode 100644 index 0000000..8a7ddd2 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Softune/MB91460/portmacro.h @@ -0,0 +1,151 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/* Hardware specific includes. */ +#include "mb91467d.h" + +/* Standard includes. */ +#include + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +#if configKERNEL_INTERRUPT_PRIORITY != 30 + #error configKERNEL_INTERRUPT_PRIORITY (set in FreeRTOSConfig.h) must match the ILM value set in the following line - 30 (1Eh) being the default. +#endif +#define portDISABLE_INTERRUPTS() __asm(" STILM #1Eh ") +#define portENABLE_INTERRUPTS() __asm(" STILM #1Fh ") + +#define portENTER_CRITICAL() \ + __asm(" ST PS,@-R15 "); \ + __asm(" ANDCCR #0xef "); \ + + +#define portEXIT_CRITICAL() \ + __asm(" LD @R15+,PS "); \ + +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 4 +#define portNOP() __asm( " nop " ); +/*-----------------------------------------------------------*/ + +/* portYIELD() uses a SW interrupt */ +#define portYIELD() __asm( " INT #40H " ); + +/* portYIELD_FROM_ISR() uses delayed interrupt */ +#define portYIELD_FROM_ISR() DICR_DLYI = 1 +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#define portMINIMAL_STACK_SIZE configMINIMAL_STACK_SIZE + + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Softune/MB96340/__STD_LIB_sbrk.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Softune/MB96340/__STD_LIB_sbrk.c new file mode 100644 index 0000000..a520aff --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Softune/MB96340/__STD_LIB_sbrk.c @@ -0,0 +1,28 @@ +/* THIS SAMPLE CODE IS PROVIDED AS IS AND IS SUBJECT TO ALTERATIONS. FUJITSU */ +/* MICROELECTRONICS ACCEPTS NO RESPONSIBILITY OR LIABILITY FOR ANY ERRORS OR */ +/* ELIGIBILITY FOR ANY PURPOSES. */ +/* (C) Fujitsu Microelectronics Europe GmbH */ +/*--------------------------------------------------------------------------- + __STD_LIB_sbrk.C + - Used by heap_3.c for memory accocation and deletion. + +/*---------------------------------------------------------------------------*/ + +#include "FreeRTOSConfig.h" +#include + + static long brk_siz = 0; + typedef int _heep_t; + #define ROUNDUP(s) (((s)+sizeof(_heep_t)-1)&~(sizeof(_heep_t)-1)) + static _heep_t _heep[ROUNDUP(configTOTAL_HEAP_SIZE)/sizeof(_heep_t)]; + #define _heep_size ROUNDUP(configTOTAL_HEAP_SIZE) + + extern char *sbrk(int size) + { + if (brk_siz + size > _heep_size || brk_siz + size < 0) + + return((char*)-1); + brk_siz += size; + return( (char*)_heep + brk_siz - size); + } + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Softune/MB96340/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Softune/MB96340/port.c new file mode 100644 index 0000000..7841f47 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Softune/MB96340/port.c @@ -0,0 +1,551 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#include "FreeRTOS.h" +#include "task.h" + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the 16FX port. + *----------------------------------------------------------*/ + +/* + * Get current value of DPR and ADB registers + */ +StackType_t xGet_DPR_ADB_bank( void ); + +/* + * Get current value of DTB and PCB registers + */ +StackType_t xGet_DTB_PCB_bank( void ); + +/* + * Sets up the periodic ISR used for the RTOS tick. This uses RLT0, but + * can be done using any given RLT. + */ +static void prvSetupRLT0Interrupt( void ); + +/*-----------------------------------------------------------*/ + +/* + * We require the address of the pxCurrentTCB variable, but don't want to know + * any details of its type. + */ +typedef void TCB_t; +extern volatile TCB_t * volatile pxCurrentTCB; + +/*-----------------------------------------------------------*/ + +/* + * Macro to save a task context to the task stack. This macro copies the + * saved context (AH:AL, DPR:ADB, DTB:PCB , PC and PS) from the system + * stack to task stack pointed by user stack pointer ( USP for SMALL and + * MEDIUM memory model amd USB:USP for COMPACT and LARGE memory model ), + * then it pushes the general purpose registers RW0-RW7 on to the task + * stack. Finally the resultant stack pointer value is saved into the + * task control block so it can be retrieved the next time the task + * executes. + */ +#if( ( configMEMMODEL == portSMALL ) || ( configMEMMODEL == portMEDIUM ) ) + + #define portSAVE_CONTEXT() \ + { __asm(" POPW A "); \ + __asm(" AND CCR,#H'DF "); \ + __asm(" PUSHW A "); \ + __asm(" OR CCR,#H'20 "); \ + __asm(" POPW A "); \ + __asm(" AND CCR,#H'DF "); \ + __asm(" PUSHW A "); \ + __asm(" OR CCR,#H'20 "); \ + __asm(" POPW A "); \ + __asm(" AND CCR,#H'DF "); \ + __asm(" PUSHW A "); \ + __asm(" OR CCR,#H'20 "); \ + __asm(" POPW A "); \ + __asm(" AND CCR,#H'DF "); \ + __asm(" PUSHW A "); \ + __asm(" OR CCR,#H'20 "); \ + __asm(" POPW A "); \ + __asm(" AND CCR,#H'DF "); \ + __asm(" PUSHW A "); \ + __asm(" OR CCR,#H'20 "); \ + __asm(" POPW A "); \ + __asm(" AND CCR,#H'DF "); \ + __asm(" PUSHW A "); \ + __asm(" PUSHW (RW0,RW1,RW2,RW3,RW4,RW5,RW6,RW7) "); \ + __asm(" MOVW A, _pxCurrentTCB "); \ + __asm(" MOVW A, SP "); \ + __asm(" SWAPW "); \ + __asm(" MOVW @AL, AH "); \ + __asm(" OR CCR,#H'20 "); \ + } + +/* + * Macro to restore a task context from the task stack. This is effecti- + * vely the reverse of SAVE_CONTEXT(). First the stack pointer value + * (USP for SMALL and MEDIUM memory model amd USB:USP for COMPACT and + * LARGE memory model ) is loaded from the task control block. Next the + * value of all the general purpose registers RW0-RW7 is retrieved. Fina- + * lly it copies of the context ( AH:AL, DPR:ADB, DTB:PCB, PC and PS) of + * the task to be executed upon RETI from user stack to system stack. + */ + + #define portRESTORE_CONTEXT() \ + { __asm(" MOVW A, _pxCurrentTCB "); \ + __asm(" MOVW A, @A "); \ + __asm(" AND CCR,#H'DF "); \ + __asm(" MOVW SP, A "); \ + __asm(" POPW (RW0,RW1,RW2,RW3,RW4,RW5,RW6,RW7) "); \ + __asm(" POPW A "); \ + __asm(" OR CCR,#H'20 "); \ + __asm(" PUSHW A "); \ + __asm(" AND CCR,#H'DF "); \ + __asm(" POPW A "); \ + __asm(" OR CCR,#H'20 "); \ + __asm(" PUSHW A "); \ + __asm(" AND CCR,#H'DF "); \ + __asm(" POPW A "); \ + __asm(" OR CCR,#H'20 "); \ + __asm(" PUSHW A "); \ + __asm(" AND CCR,#H'DF "); \ + __asm(" POPW A "); \ + __asm(" OR CCR,#H'20 "); \ + __asm(" PUSHW A "); \ + __asm(" AND CCR,#H'DF "); \ + __asm(" POPW A "); \ + __asm(" OR CCR,#H'20 "); \ + __asm(" PUSHW A "); \ + __asm(" AND CCR,#H'DF "); \ + __asm(" POPW A "); \ + __asm(" OR CCR,#H'20 "); \ + __asm(" PUSHW A "); \ + } + +#elif( ( configMEMMODEL == portCOMPACT ) || ( configMEMMODEL == portLARGE ) ) + + #define portSAVE_CONTEXT() \ + { __asm(" POPW A "); \ + __asm(" AND CCR,#H'DF "); \ + __asm(" PUSHW A "); \ + __asm(" OR CCR,#H'20 "); \ + __asm(" POPW A "); \ + __asm(" AND CCR,#H'DF "); \ + __asm(" PUSHW A "); \ + __asm(" OR CCR,#H'20 "); \ + __asm(" POPW A "); \ + __asm(" AND CCR,#H'DF "); \ + __asm(" PUSHW A "); \ + __asm(" OR CCR,#H'20 "); \ + __asm(" POPW A "); \ + __asm(" AND CCR,#H'DF "); \ + __asm(" PUSHW A "); \ + __asm(" OR CCR,#H'20 "); \ + __asm(" POPW A "); \ + __asm(" AND CCR,#H'DF "); \ + __asm(" PUSHW A "); \ + __asm(" OR CCR,#H'20 "); \ + __asm(" POPW A "); \ + __asm(" AND CCR,#H'DF "); \ + __asm(" PUSHW A "); \ + __asm(" PUSHW (RW0,RW1,RW2,RW3,RW4,RW5,RW6,RW7) "); \ + __asm(" MOVL A, _pxCurrentTCB "); \ + __asm(" MOVL RL2, A "); \ + __asm(" MOVW A, SP "); \ + __asm(" MOVW @RL2+0, A "); \ + __asm(" MOV A, USB "); \ + __asm(" MOV @RL2+2, A "); \ + } + + #define portRESTORE_CONTEXT() \ + { __asm(" MOVL A, _pxCurrentTCB "); \ + __asm(" MOVL RL2, A "); \ + __asm(" MOVW A, @RL2+0 "); \ + __asm(" AND CCR,#H'DF "); \ + __asm(" MOVW SP, A "); \ + __asm(" MOV A, @RL2+2 "); \ + __asm(" MOV USB, A "); \ + __asm(" POPW (RW0,RW1,RW2,RW3,RW4,RW5,RW6,RW7) "); \ + __asm(" POPW A "); \ + __asm(" OR CCR,#H'20 "); \ + __asm(" PUSHW A "); \ + __asm(" AND CCR,#H'DF "); \ + __asm(" POPW A "); \ + __asm(" OR CCR,#H'20 "); \ + __asm(" PUSHW A "); \ + __asm(" AND CCR,#H'DF "); \ + __asm(" POPW A "); \ + __asm(" OR CCR,#H'20 "); \ + __asm(" PUSHW A "); \ + __asm(" AND CCR,#H'DF "); \ + __asm(" POPW A "); \ + __asm(" OR CCR,#H'20 "); \ + __asm(" PUSHW A "); \ + __asm(" AND CCR,#H'DF "); \ + __asm(" POPW A "); \ + __asm(" OR CCR,#H'20 "); \ + __asm(" PUSHW A "); \ + __asm(" AND CCR,#H'DF "); \ + __asm(" POPW A "); \ + __asm(" OR CCR,#H'20 "); \ + __asm(" PUSHW A "); \ + } +#endif + +/*-----------------------------------------------------------*/ + +/* + * Functions for obtaining the current value of DPR:ADB, DTB:PCB bank registers + */ + +#pragma asm + + .GLOBAL _xGet_DPR_ADB_bank + .GLOBAL _xGet_DTB_PCB_bank + .SECTION CODE, CODE, ALIGN=1 + +_xGet_DPR_ADB_bank: + + MOV A, DPR + SWAP + MOV A, ADB + ORW A + #if configMEMMODEL == portMEDIUM || configMEMMODEL == portLARGE + RETP + #elif configMEMMODEL == portSMALL || configMEMMODEL == portCOMPACT + RET + #endif + + +_xGet_DTB_PCB_bank: + + MOV A, DTB + SWAP + MOV A, PCB + ORW A + #if configMEMMODEL == portMEDIUM || configMEMMODEL == portLARGE + RETP + #elif configMEMMODEL == portSMALL || configMEMMODEL == portCOMPACT + RET + #endif + +#pragma endasm +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been called. + * + * See the header file portable.h. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Place a few bytes of known values on the bottom of the stack. + This is just useful for debugging. */ + *pxTopOfStack = 0x1111; + pxTopOfStack--; + *pxTopOfStack = 0x2222; + pxTopOfStack--; + *pxTopOfStack = 0x3333; + pxTopOfStack--; + + /* Once the task is called the task would push the pointer to the + parameter onto the stack. Hence here the pointer would be copied to the stack + first. When using the COMPACT or LARGE memory model the pointer would be 24 + bits, and when using the SMALL or MEDIUM memory model the pointer would be 16 + bits. */ + #if( ( configMEMMODEL == portCOMPACT ) || ( configMEMMODEL == portLARGE ) ) + { + *pxTopOfStack = ( StackType_t ) ( ( uint32_t ) ( pvParameters ) >> 16 ); + pxTopOfStack--; + } + #endif + + *pxTopOfStack = ( StackType_t ) ( pvParameters ); + pxTopOfStack--; + + /* This is redundant push to the stack. This is required in order to introduce + an offset so that the task accesses a parameter correctly that is passed on to + the task stack. */ + #if( ( configMEMMODEL == portMEDIUM ) || ( configMEMMODEL == portLARGE ) ) + { + *pxTopOfStack = ( xGet_DTB_PCB_bank() & 0xff00 ) | ( ( ( int32_t ) ( pxCode ) >> 16 ) & 0xff ); + pxTopOfStack--; + } + #endif + + /* This is redundant push to the stack. This is required in order to introduce + an offset so the task correctly accesses the parameter passed on the task stack. */ + *pxTopOfStack = ( StackType_t ) ( pxCode ); + pxTopOfStack--; + + /* PS - User Mode, ILM=7, RB=0, Interrupts enabled,USP */ + *pxTopOfStack = 0xE0C0; + pxTopOfStack--; + + /* PC */ + *pxTopOfStack = ( StackType_t ) ( pxCode ); + pxTopOfStack--; + + /* DTB | PCB */ + #if configMEMMODEL == portSMALL || configMEMMODEL == portCOMPACT + { + *pxTopOfStack = xGet_DTB_PCB_bank(); + pxTopOfStack--; + } + #endif + + /* DTB | PCB, in case of MEDIUM and LARGE memory models, PCB would be used + along with PC to indicate the start address of the function. */ + #if( ( configMEMMODEL == portMEDIUM ) || ( configMEMMODEL == portLARGE ) ) + { + *pxTopOfStack = ( xGet_DTB_PCB_bank() & 0xff00 ) | ( ( ( int32_t ) ( pxCode ) >> 16 ) & 0xff ); + pxTopOfStack--; + } + #endif + + /* DPR | ADB */ + *pxTopOfStack = xGet_DPR_ADB_bank(); + pxTopOfStack--; + + /* AL */ + *pxTopOfStack = ( StackType_t ) 0x9999; + pxTopOfStack--; + + /* AH */ + *pxTopOfStack = ( StackType_t ) 0xAAAA; + pxTopOfStack--; + + /* Next the general purpose registers. */ + *pxTopOfStack = ( StackType_t ) 0x7777; /* RW7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x6666; /* RW6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x5555; /* RW5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x4444; /* RW4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x3333; /* RW3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x2222; /* RW2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x1111; /* RW1 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x8888; /* RW0 */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvSetupRLT0Interrupt( void ) +{ +/* The peripheral clock divided by 16 is used by the timer. */ +const uint16_t usReloadValue = ( uint16_t ) ( ( ( configCLKP1_CLOCK_HZ / configTICK_RATE_HZ ) / 16UL ) - 1UL ); + + /* set reload value = 34999+1, TICK Interrupt after 10 ms @ 56MHz of CLKP1 */ + TMRLR0 = usReloadValue; + + /* prescaler 1:16, reload, interrupt enable, count enable, trigger */ + TMCSR0 = 0x041B; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* Setup the hardware to generate the tick. */ + prvSetupRLT0Interrupt(); + + /* Restore the context of the first task that is going to run. */ + portRESTORE_CONTEXT(); + + /* Simulate a function call end as generated by the compiler. We will now + jump to the start of the task the context of which we have just restored. */ + __asm(" reti "); + + + /* Should not get here. */ + return pdTRUE; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented - unlikely to ever be required as there is nothing to + return to. */ +} + +/*-----------------------------------------------------------*/ + +/* + * The interrupt service routine used depends on whether the pre-emptive + * scheduler is being used or not. + */ + +#if configUSE_PREEMPTION == 1 + + /* + * Tick ISR for preemptive scheduler. We can use a __nosavereg attribute + * as the context is to be saved by the portSAVE_CONTEXT() macro, not the + * compiler generated code. The tick count is incremented after the context + * is saved. + */ + __nosavereg __interrupt void prvRLT0_TICKISR( void ) + { + /* Disable interrupts so that portSAVE_CONTEXT() is not interrupted */ + __DI(); + + /* Save the context of the interrupted task. */ + portSAVE_CONTEXT(); + + /* Enable interrupts */ + __EI(); + + /* Clear RLT0 interrupt flag */ + TMCSR0_UF = 0; + + /* Increment the tick count then switch to the highest priority task + that is ready to run. */ + if( xTaskIncrementTick() != pdFALSE ) + { + vTaskSwitchContext(); + } + + /* Disable interrupts so that portRESTORE_CONTEXT() is not interrupted */ + __DI(); + + /* Restore the context of the new task. */ + portRESTORE_CONTEXT(); + + /* Enable interrupts */ + __EI(); + } + +#else + + /* + * Tick ISR for the cooperative scheduler. All this does is increment the + * tick count. We don't need to switch context, this can only be done by + * manual calls to taskYIELD(); + */ + __interrupt void prvRLT0_TICKISR( void ) + { + /* Clear RLT0 interrupt flag */ + TMCSR0_UF = 0; + + xTaskIncrementTick(); + } + +#endif + +/*-----------------------------------------------------------*/ + +/* + * Manual context switch. We can use a __nosavereg attribute as the context + * is to be saved by the portSAVE_CONTEXT() macro, not the compiler generated + * code. + */ +__nosavereg __interrupt void vPortYield( void ) +{ + /* Save the context of the interrupted task. */ + portSAVE_CONTEXT(); + + /* Switch to the highest priority task that is ready to run. */ + vTaskSwitchContext(); + + /* Restore the context of the new task. */ + portRESTORE_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +__nosavereg __interrupt void vPortYieldDelayed( void ) +{ + /* Disable interrupts so that portSAVE_CONTEXT() is not interrupted */ + __DI(); + + /* Save the context of the interrupted task. */ + portSAVE_CONTEXT(); + + /* Enable interrupts */ + __EI(); + + /* Clear delayed interrupt flag */ + __asm (" CLRB 03A4H:0 "); + + /* Switch to the highest priority task that is ready to run. */ + vTaskSwitchContext(); + + /* Disable interrupts so that portSAVE_CONTEXT() is not interrupted */ + __DI(); + + /* Restore the context of the new task. */ + portRESTORE_CONTEXT(); + + /* Enable interrupts */ + __EI(); +} +/*-----------------------------------------------------------*/ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Softune/MB96340/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Softune/MB96340/portmacro.h new file mode 100644 index 0000000..023a32e --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Softune/MB96340/portmacro.h @@ -0,0 +1,158 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/* Standard includes. */ +#include + +/* Constants denoting the available memory models. These are used within +FreeRTOSConfig.h to set the configMEMMODEL value. */ +#define portSMALL 0 +#define portMEDIUM 1 +#define portCOMPACT 2 +#define portLARGE 3 + + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint16_t +#define portBASE_TYPE short + +typedef portSTACK_TYPE StackType_t; +typedef short BaseType_t; +typedef unsigned short UBaseType_t; + + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Critical section handling. */ +#if configKERNEL_INTERRUPT_PRIORITY != 6 + #error configKERNEL_INTERRUPT_PRIORITY (set in FreeRTOSConfig.h) must match the ILM value set in the following line - #06H being the default. +#endif +#define portDISABLE_INTERRUPTS() __asm(" MOV ILM, #06h ") +#define portENABLE_INTERRUPTS() __asm(" MOV ILM, #07h ") + +#define portENTER_CRITICAL() \ + { __asm(" PUSHW PS "); \ + portDISABLE_INTERRUPTS(); \ + } + +#define portEXIT_CRITICAL() \ + { __asm(" POPW PS "); \ + } + +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 2 +#define portNOP() __asm( " NOP " ); +/*-----------------------------------------------------------*/ + +/* portYIELD() uses SW interrupt */ +#define portYIELD() __asm( " INT #122 " ); + +/* portYIELD_FROM_ISR() uses delayed interrupt */ +#define portYIELD_FROM_ISR() __asm( " SETB 03A4H:0 " ); +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#define portMINIMAL_STACK_SIZE configMINIMAL_STACK_SIZE + + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Tasking/ARM_CM4F/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Tasking/ARM_CM4F/port.c new file mode 100644 index 0000000..6f44c25 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Tasking/ARM_CM4F/port.c @@ -0,0 +1,305 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the ARM CM4F port. + *----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Constants required to manipulate the NVIC. */ +#define portNVIC_SYSTICK_CTRL ( ( volatile uint32_t * ) 0xe000e010 ) +#define portNVIC_SYSTICK_LOAD ( ( volatile uint32_t * ) 0xe000e014 ) +#define portNVIC_SYSPRI2 ( ( volatile uint32_t * ) 0xe000ed20 ) +#define portNVIC_SYSTICK_CLK 0x00000004 +#define portNVIC_SYSTICK_INT 0x00000002 +#define portNVIC_SYSTICK_ENABLE 0x00000001 +#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16 ) +#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24 ) + +/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */ +#define portVECTACTIVE_MASK ( 0xFFUL ) + +/* Constants required to manipulate the VFP. */ +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating point context control register. */ +#define portASPEN_AND_LSPEN_BITS ( 0x3UL << 30UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) +#define portINITIAL_EXEC_RETURN ( 0xfffffffd ) + +/* Let the user override the pre-loading of the initial LR with the address of +prvTaskExitError() in case it messes up unwinding of the stack in the +debugger. */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/* For strict compliance with the Cortex-M spec the task start address should +have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ +#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) + +/* The priority used by the kernel is assigned to a variable to make access +from inline assembler easier. */ +const uint32_t ulKernelPriority = configKERNEL_INTERRUPT_PRIORITY; + +/* Each task maintains its own interrupt status in the critical nesting +variable. */ +static uint32_t ulCriticalNesting = 0xaaaaaaaaUL; + +/* + * Setup the timer to generate the tick interrupts. + */ +static void prvSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void SysTick_Handler( void ); + +/* + * Functions defined in port_asm.asm. + */ +extern void vPortEnableVFP( void ); +extern void vPortStartFirstTask( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/* This exists purely to allow the const to be used from within the +port_asm.asm assembly file. */ +const uint32_t ulMaxSyscallInterruptPriorityConst = configMAX_SYSCALL_INTERRUPT_PRIORITY; + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + interrupt. */ + + /* Offset added to account for the way the MCU uses the stack on entry/exit + of interrupts, and to ensure alignment. */ + pxTopOfStack--; + + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + + /* Save code space by skipping register initialisation. */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + + /* A save method is being used that requires each task to maintain its + own exec return value. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXEC_RETURN; + + pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT( ulCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + for( ;; ); +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. + See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + configASSERT( ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) ); + + /* Make PendSV and SysTick the lowest priority interrupts. */ + *(portNVIC_SYSPRI2) |= portNVIC_PENDSV_PRI; + *(portNVIC_SYSPRI2) |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + prvSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + ulCriticalNesting = 0; + + /* Ensure the VFP is enabled - it should be anyway. */ + vPortEnableVFP(); + + /* Lazy save always. */ + *( portFPCCR ) |= portASPEN_AND_LSPEN_BITS; + + /* Start the first task. */ + vPortStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( ulCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortYield( void ) +{ + /* Set a PendSV to request a context switch. */ + *(portNVIC_INT_CTRL) = portNVIC_PENDSVSET; + + /* Barriers are normally not required but do ensure the code is completely + within the specified behaviour for the architecture. */ + __DSB(); + __ISB(); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + ulCriticalNesting++; + __DSB(); + __ISB(); + + /* This is not the interrupt safe version of the enter critical function so + assert() if it is being called from an interrupt context. Only API + functions that end in "FromISR" can be used in an interrupt. Only assert if + the critical nesting count is 1 to protect against recursive calls if the + assert function also uses a critical section. */ + if( ulCriticalNesting == 1 ) + { + configASSERT( ( ( *(portNVIC_INT_CTRL) ) & portVECTACTIVE_MASK ) == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + configASSERT( ulCriticalNesting ); + ulCriticalNesting--; + if( ulCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void SysTick_Handler( void ) +{ +uint32_t ulDummy; + + ulDummy = portSET_INTERRUPT_MASK_FROM_ISR(); + { + if( xTaskIncrementTick() != pdFALSE ) + { + /* Pend a context switch. */ + *(portNVIC_INT_CTRL) = portNVIC_PENDSVSET; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulDummy ); +} +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +void prvSetupTimerInterrupt( void ) +{ + /* Configure SysTick to interrupt at the requested rate. */ + *(portNVIC_SYSTICK_LOAD) = ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + *(portNVIC_SYSTICK_CTRL) = portNVIC_SYSTICK_CLK | portNVIC_SYSTICK_INT | portNVIC_SYSTICK_ENABLE; +} +/*-----------------------------------------------------------*/ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Tasking/ARM_CM4F/port_asm.asm b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Tasking/ARM_CM4F/port_asm.asm new file mode 100644 index 0000000..4ab1663 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Tasking/ARM_CM4F/port_asm.asm @@ -0,0 +1,263 @@ +;/* +; FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. +; All rights reserved +; +; +; *************************************************************************** +; * * +; * FreeRTOS tutorial books are available in pdf and paperback. * +; * Complete, revised, and edited pdf reference manuals are also * +; * available. * +; * * +; * Purchasing FreeRTOS documentation will not only help you, by * +; * ensuring you get running as quickly as possible and with an * +; * in-depth knowledge of how to use FreeRTOS, it will also help * +; * the FreeRTOS project to continue with its mission of providing * +; * professional grade, cross platform, de facto standard solutions * +; * for microcontrollers - completely free of charge! * +; * * +; * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * +; * * +; * Thank you for using FreeRTOS, and thank you for your support! * +; * * +; *************************************************************************** +; +; +; This file is part of the FreeRTOS distribution. +; +; FreeRTOS is free software; you can redistribute it and/or modify it under +; the terms of the GNU General Public License (version 2) as published by the +; Free Software Foundation AND MODIFIED BY the FreeRTOS exception. +; >>>NOTE<<< The modification to the GPL is included to allow you to +; distribute a combined work that includes FreeRTOS without being obliged to +; provide the source code for proprietary components outside of the FreeRTOS +; kernel. FreeRTOS is distributed in the hope that it will be useful, but +; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +; more details. You should have received a copy of the GNU General Public +; License and the FreeRTOS license exception along with FreeRTOS; if not it +; can be viewed here: http://www.freertos.org/a00114.html and also obtained +; by writing to Richard Barry, contact details for whom are available on the +; FreeRTOS WEB site. +; +; 1 tab == 4 spaces! +; +; http://www.FreeRTOS.org - Documentation, latest information, license and +; contact details. +; +; http://www.SafeRTOS.com - A version that is certified for use in safety +; critical systems. +; +; http://www.OpenRTOS.com - Commercial support, development, porting, +; licensing and training services. +;*/ + + + .extern pxCurrentTCB + .extern vTaskSwitchContext + .extern ulMaxSyscallInterruptPriorityConst + + .global _vector_14 + .global _lc_ref__vector_pp_14 + .global SVC_Handler + .global vPortStartFirstTask + .global vPortEnableVFP + .global ulPortSetInterruptMask + .global vPortClearInterruptMask + +;----------------------------------------------------------- + + .section .text + .thumb + .align 4 +_vector_14: .type func + + mrs r0, psp + isb + + ;Get the location of the current TCB. + ldr.w r3, =pxCurrentTCB + ldr r2, [r3] + + ;Is the task using the FPU context? If so, push high vfp registers. + tst r14, #0x10 + it eq + vstmdbeq r0!, {s16-s31} + + ;Save the core registers. + stmdb r0!, {r4-r11, r14} + + ;Save the new top of stack into the first member of the TCB. + str r0, [r2] + + stmdb sp!, {r3} + ldr.w r0, =ulMaxSyscallInterruptPriorityConst + ldr r0, [r0] + msr basepri, r0 + bl vTaskSwitchContext + mov r0, #0 + msr basepri, r0 + ldmia sp!, {r3} + + ;The first item in pxCurrentTCB is the task top of stack. + ldr r1, [r3] + ldr r0, [r1] + + ;Pop the core registers. + ldmia r0!, {r4-r11, r14} + + ;Is the task using the FPU context? If so, pop the high vfp registers too. + tst r14, #0x10 + it eq + vldmiaeq r0!, {s16-s31} + + msr psp, r0 + isb + bx r14 + + .size _vector_14, $-_vector_14 + .endsec + +;----------------------------------------------------------- + +; This function is an XMC4000 silicon errata workaround. It will get used when +; the SILICON_BUG_PMC_CM_001 linker macro is defined. + .section .text + .thumb + .align 4 +_lc_ref__vector_pp_14: .type func + + mrs r0, psp + isb + + ;Get the location of the current TCB. + ldr.w r3, =pxCurrentTCB + ldr r2, [r3] + + ;Is the task using the FPU context? If so, push high vfp registers. + tst r14, #0x10 + it eq + vstmdbeq r0!, {s16-s31} + + ;Save the core registers. + stmdb r0!, {r4-r11, r14} + + ;Save the new top of stack into the first member of the TCB. + str r0, [r2] + + stmdb sp!, {r3} + ldr.w r0, =ulMaxSyscallInterruptPriorityConst + ldr r0, [r0] + msr basepri, r0 + bl vTaskSwitchContext + mov r0, #0 + msr basepri, r0 + ldmia sp!, {r3} + + ;The first item in pxCurrentTCB is the task top of stack. + ldr r1, [r3] + ldr r0, [r1] + + ;Pop the core registers. + ldmia r0!, {r4-r11, r14} + + ;Is the task using the FPU context? If so, pop the high vfp registers too. + tst r14, #0x10 + it eq + vldmiaeq r0!, {s16-s31} + + msr psp, r0 + isb + push { lr } + pop { pc } ; XMC4000 specific errata workaround. Do not used "bx lr" here. + + .size _lc_ref__vector_pp_14, $-_lc_ref__vector_pp_14 + .endsec + +;----------------------------------------------------------- + + .section .text + .thumb + .align 4 +SVC_Handler: .type func + ;Get the location of the current TCB. + ldr.w r3, =pxCurrentTCB + ldr r1, [r3] + ldr r0, [r1] + ;Pop the core registers. + ldmia r0!, {r4-r11, r14} + msr psp, r0 + isb + mov r0, #0 + msr basepri, r0 + bx r14 + .size SVC_Handler, $-SVC_Handler + .endsec + +;----------------------------------------------------------- + + .section .text + .thumb + .align 4 +vPortStartFirstTask .type func + ;Use the NVIC offset register to locate the stack. + ldr.w r0, =0xE000ED08 + ldr r0, [r0] + ldr r0, [r0] + ;Set the msp back to the start of the stack. + msr msp, r0 + ;Call SVC to start the first task. + cpsie i + cpsie f + dsb + isb + svc 0 + .size vPortStartFirstTask, $-vPortStartFirstTask + .endsec + +;----------------------------------------------------------- + + .section .text + .thumb + .align 4 +vPortEnableVFP .type func + ;The FPU enable bits are in the CPACR. + ldr.w r0, =0xE000ED88 + ldr r1, [r0] + + ;Enable CP10 and CP11 coprocessors, then save back. + orr r1, r1, #( 0xf << 20 ) + str r1, [r0] + bx r14 + .size vPortEnableVFP, $-vPortEnableVFP + .endsec + +;----------------------------------------------------------- + + .section .text + .thumb + .align 4 +ulPortSetInterruptMask: + mrs r0, basepri + ldr.w r1, =ulMaxSyscallInterruptPriorityConst + ldr r1, [r1] + msr basepri, r1 + bx r14 + .size ulPortSetInterruptMask, $-ulPortSetInterruptMask + .endsec + +;----------------------------------------------------------- + + .section .text + .thumb + .align 4 +vPortClearInterruptMask: + msr basepri, r0 + bx r14 + .size vPortClearInterruptMask, $-vPortClearInterruptMask + .endsec + +;----------------------------------------------------------- + + .end + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Tasking/ARM_CM4F/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Tasking/ARM_CM4F/portmacro.h new file mode 100644 index 0000000..4a2d456 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/Tasking/ARM_CM4F/portmacro.h @@ -0,0 +1,175 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +/*-----------------------------------------------------------*/ + + +/* Scheduler utilities. */ +extern void vPortYield( void ); +#define portNVIC_INT_CTRL ( ( volatile uint32_t * ) 0xe000ed04 ) +#define portNVIC_PENDSVSET 0x10000000 +#define portYIELD() vPortYield() + +#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired ) *(portNVIC_INT_CTRL) = portNVIC_PENDSVSET +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + + +/* Critical section management. */ + +/* + * Set basepri to portMAX_SYSCALL_INTERRUPT_PRIORITY without effecting other + * registers. r0 is clobbered. + */ +#define portSET_INTERRUPT_MASK() __set_BASEPRI( configMAX_SYSCALL_INTERRUPT_PRIORITY ) + +/* + * Set basepri back to 0 without effective other registers. + * r0 is clobbered. FAQ: Setting BASEPRI to 0 is not a bug. Please see + * http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html before disagreeing. + */ +#define portCLEAR_INTERRUPT_MASK() __set_BASEPRI( 0 ) + +extern uint32_t ulPortSetInterruptMask( void ); +extern void vPortClearInterruptMask( uint32_t ulNewMask ); +#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortSetInterruptMask() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vPortClearInterruptMask( x ) + + +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); + +#define portDISABLE_INTERRUPTS() portSET_INTERRUPT_MASK() +#define portENABLE_INTERRUPTS() portCLEAR_INTERRUPT_MASK() +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#define portNOP() + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/WizC/PIC18/Drivers/Tick/Tick.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/WizC/PIC18/Drivers/Tick/Tick.c new file mode 100644 index 0000000..921903a --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/WizC/PIC18/Drivers/Tick/Tick.c @@ -0,0 +1,180 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* +Changes from V3.0.0 + + ISRcode is pulled inline and portTICKisr() is therefore + deleted from this file. + + + Prescaler logic for Timer1 added to allow for a wider + range of TickRates. + +Changes from V3.0.1 +*/ + +#include +#include + +/* IO port constants. */ +#define portBIT_SET (1) +#define portBIT_CLEAR (0) + +/* + * Hardware setup for the tick. + * We use a compare match on timer1. Depending on MPU-frequency + * and requested tickrate, a prescaled value with a matching + * prescaler are determined. + */ +#define portTIMER_COMPARE_BASE ((APROCFREQ/4)/configTICK_RATE_HZ) + +#if portTIMER_COMPARE_BASE < 0x10000 + #define portTIMER_COMPARE_VALUE (portTIMER_COMPARE_BASE) + #define portTIMER_COMPARE_PS1 (portBIT_CLEAR) + #define portTIMER_COMPARE_PS0 (portBIT_CLEAR) +#elif portTIMER_COMPARE_BASE < 0x20000 + #define portTIMER_COMPARE_VALUE (portTIMER_COMPARE_BASE / 2) + #define portTIMER_COMPARE_PS1 (portBIT_CLEAR) + #define portTIMER_COMPARE_PS0 (portBIT_SET) +#elif portTIMER_COMPARE_BASE < 0x40000 + #define portTIMER_COMPARE_VALUE (portTIMER_COMPARE_BASE / 4) + #define portTIMER_COMPARE_PS1 (portBIT_SET) + #define portTIMER_COMPARE_PS0 (portBIT_CLEAR) +#elif portTIMER_COMPARE_BASE < 0x80000 + #define portTIMER_COMPARE_VALUE (portTIMER_COMPARE_BASE / 8) + #define portTIMER_COMPARE_PS1 (portBIT_SET) + #define portTIMER_COMPARE_PS0 (portBIT_SET) +#else + #error "TickRate out of range" +#endif + +/*-----------------------------------------------------------*/ + +/* + * Setup a timer for a regular tick. + */ +void portSetupTick( void ) +{ + /* + * Interrupts are disabled when this function is called. + */ + + /* + * Setup CCP1 + * Provide the tick interrupt using a compare match on timer1. + */ + + /* + * Set the compare match value. + */ + CCPR1H = ( uint8_t ) ( ( portTIMER_COMPARE_VALUE >> 8 ) & 0xff ); + CCPR1L = ( uint8_t ) ( portTIMER_COMPARE_VALUE & 0xff ); + + /* + * Set Compare Special Event Trigger Mode + */ + bCCP1M3 = portBIT_SET; + bCCP1M2 = portBIT_CLEAR; + bCCP1M1 = portBIT_SET; + bCCP1M0 = portBIT_SET; + + /* + * Enable CCP1 interrupt + */ + bCCP1IE = portBIT_SET; + + /* + * We are only going to use the global interrupt bit, so disable + * interruptpriorities and enable peripheral interrupts. + */ + bIPEN = portBIT_CLEAR; + bPEIE = portBIT_SET; + + /* + * Set up timer1 + * It will produce the system tick. + */ + + /* + * Clear the time count + */ + TMR1H = ( uint8_t ) 0x00; + TMR1L = ( uint8_t ) 0x00; + + /* + * Setup the timer + */ + bRD16 = portBIT_SET; // 16-bit + bT1CKPS1 = portTIMER_COMPARE_PS1; // prescaler + bT1CKPS0 = portTIMER_COMPARE_PS0; // prescaler + bT1OSCEN = portBIT_SET; // Oscillator enable + bT1SYNC = portBIT_SET; // No external clock sync + bTMR1CS = portBIT_CLEAR; // Internal clock + + bTMR1ON = portBIT_SET; // Start timer1 +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/WizC/PIC18/Drivers/Tick/isrTick.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/WizC/PIC18/Drivers/Tick/isrTick.c new file mode 100644 index 0000000..652d55c --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/WizC/PIC18/Drivers/Tick/isrTick.c @@ -0,0 +1,120 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* +Changes from V3.0.0 + + ISRcode pulled inline to reduce stack-usage. + + + Added functionality to only call vTaskSwitchContext() once + when handling multiple interruptsources in a single interruptcall. + + + Filename changed to a .c extension to allow stepping through code + using F7. + +Changes from V3.0.1 +*/ + +/* + * ISR for the tick. + * This increments the tick count and, if using the preemptive scheduler, + * performs a context switch. This must be identical to the manual + * context switch in how it stores the context of a task. + */ + +#ifndef _FREERTOS_DRIVERS_TICK_ISRTICK_C +#define _FREERTOS_DRIVERS_TICK_ISRTICK_C + +{ + /* + * Was the interrupt the SystemClock? + */ + if( bCCP1IF && bCCP1IE ) + { + /* + * Reset the interrupt flag + */ + bCCP1IF = 0; + + /* + * Maintain the tick count. + */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* + * Ask for a switch to the highest priority task + * that is ready to run. + */ + uxSwitchRequested = pdTRUE; + } + } +} + +#pragma wizcpp uselib "$__PATHNAME__/Tick.c" + +#endif /* _FREERTOS_DRIVERS_TICK_ISRTICK_C */ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/WizC/PIC18/Install.bat b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/WizC/PIC18/Install.bat new file mode 100644 index 0000000..9d67175 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/WizC/PIC18/Install.bat @@ -0,0 +1,225 @@ +REM/* +REM FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. +REM +REM +REM *************************************************************************** +REM * * +REM * FreeRTOS tutorial books are available in pdf and paperback. * +REM * Complete, revised, and edited pdf reference manuals are also * +REM * available. * +REM * * +REM * Purchasing FreeRTOS documentation will not only help you, by * +REM * ensuring you get running as quickly as possible and with an * +REM * in-depth knowledge of how to use FreeRTOS, it will also help * +REM * the FreeRTOS project to continue with its mission of providing * +REM * professional grade, cross platform, de facto standard solutions * +REM * for microcontrollers - completely free of charge! * +REM * * +REM * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * +REM * * +REM * Thank you for using FreeRTOS, and thank you for your support! * +REM * * +REM *************************************************************************** +REM +REM +REM This file is part of the FreeRTOS distribution. +REM +REM FreeRTOS is free softwareREM you can redistribute it and/or modify it under +REM the terms of the GNU General Public License (version 2) as published by the +REM Free Software Foundation AND MODIFIED BY the FreeRTOS exception. +REM >>>NOTE<<< The modification to the GPL is included to allow you to +REM distribute a combined work that includes FreeRTOS without being obliged to +REM provide the source code for proprietary components outside of the FreeRTOS +REM kernel. FreeRTOS is distributed in the hope that it will be useful, but +REM WITHOUT ANY WARRANTYREM without even the implied warranty of MERCHANTABILITY +REM or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +REM more details. You should have received a copy of the GNU General Public +REM License and the FreeRTOS license exception along with FreeRTOSREM if not it +REM can be viewed here: http://www.freertos.org/a00114.html and also obtained +REM by writing to Richard Barry, contact details for whom are available on the +REM FreeRTOS WEB site. +REM +REM 1 tab == 4 spaces! +REM +REM http://www.FreeRTOS.org - Documentation, latest information, license and +REM contact details. +REM +REM http://www.SafeRTOS.com - A version that is certified for use in safety +REM critical systems. +REM +REM http://www.OpenRTOS.com - Commercial support, development, porting, +REM licensing and training services. +REM*/ + + +@echo off +cls + +SET PACKAGENAME=the FreeRTOS port for fedC and wizC + +echo. +echo Hello, I'm the installationscript for %PACKAGENAME%. +echo. + +:CHECKFEDC + set FED=C:\Program Files\FED\PIC_C + echo. + echo I'm checking your system for fedC + if not exist "%FED%" goto NOFEDC + echo YES, I found a fedC-installation! + goto FOUNDFED +:NOFEDC + echo I could not find a fedC-installation. + + +:CHECKWIZC + set FED=C:\Program Files\FED\PIXIE + echo. + echo I'm checking your system for wizC + if not exist "%FED%" goto NOWIZC + echo YES, I found a wizC-installation! + goto FOUNDFED +:noWIZC + echo I could not find a wizC-installation. + + +:ERROR + echo. + echo. + echo I could not find a FED C-compiler installation on your system. + echo. + echo Perhaps I got confused because you installed fedC or wizC in a non-default directory. + echo If this is the case, please change the path at the top of this install-script. + echo After that rerun the script and I will be happy to try again. + echo. + goto ENDIT + + +:FOUNDFED + echo. + echo. + + set FEDLIBS=%FED%\Libs + set FEDLIBSUSER=%FEDLIBS%\LibsUser + + if exist "%FEDLIBS%" goto INSTALL + echo The FED installationdirectory "%FED%" + echo contains no Libs subdirectory. This is weird! + echo. + echo Installation is aborted, sorry... + goto ENDIT + + +:INSTALL + echo I am about to install %PACKAGENAME% + echo into directory %FEDLIBSUSER% + echo. + echo Press 'enter' to let me do my thing + echo Press 'ctrl-c' to stop me + pause >nul + echo. + echo Installing... + + +:RESET_READONLY + echo. + echo Removing ReadOnly attributes + attrib -R "%FEDLIBSUSER%\libFreeRTOS\Modules\Croutine.c" >nul + attrib -R "%FEDLIBSUSER%\libFreeRTOS\Modules\Port.c" >nul + attrib -R "%FEDLIBSUSER%\libFreeRTOS\Modules\List.c" >nul + attrib -R "%FEDLIBSUSER%\libFreeRTOS\Modules\Queue.c" >nul + attrib -R "%FEDLIBSUSER%\libFreeRTOS\Modules\Tasks.c" >nul + attrib -R "%FEDLIBSUSER%\libFreeRTOS\Drivers\Tick\Tick.c" >nul + attrib -R "%FEDLIBSUSER%\libFreeRTOS\Drivers\Tick\isrTick.c" >nul + attrib -R "%FEDLIBSUSER%\libFreeRTOS\Include\Portmacro.h" >nul + attrib -R "%FEDLIBSUSER%\libFreeRTOS\Include\Croutine.h" >nul + attrib -R "%FEDLIBSUSER%\libFreeRTOS\Include\List.h" >nul + attrib -R "%FEDLIBSUSER%\libFreeRTOS\Include\Portable.h" >nul + attrib -R "%FEDLIBSUSER%\libFreeRTOS\Include\Projdefs.h" >nul + attrib -R "%FEDLIBSUSER%\libFreeRTOS\Include\Queue.h" >nul + attrib -R "%FEDLIBSUSER%\libFreeRTOS\Include\Semphr.h" >nul + attrib -R "%FEDLIBSUSER%\libFreeRTOS\Include\Task.h" >nul + attrib -R "%FEDLIBSUSER%\FreeRTOS.h" >nul + echo Done + +:CREATE_DIRECTORIES + echo. + echo Creating directories (if necessary)... + if not exist "%FEDLIBSUSER%" mkdir "%FEDLIBSUSER%" + if not exist "%FEDLIBSUSER%\libFreeRTOS" mkdir "%FEDLIBSUSER%\libFreeRTOS" + if not exist "%FEDLIBSUSER%\libFreeRTOS\Drivers" mkdir "%FEDLIBSUSER%\libFreeRTOS\Drivers" + if not exist "%FEDLIBSUSER%\libFreeRTOS\Drivers\Tick" mkdir "%FEDLIBSUSER%\libFreeRTOS\Drivers\Tick" + if not exist "%FEDLIBSUSER%\libFreeRTOS\Include" mkdir "%FEDLIBSUSER%\libFreeRTOS\Include" + if not exist "%FEDLIBSUSER%\libFreeRTOS\Modules" mkdir "%FEDLIBSUSER%\libFreeRTOS\Modules" + echo Done + + + echo. + echo Copying Files... +:COPY_MODULES + echo Modules... + copy /V /Y "Port.c" "%FEDLIBSUSER%\libFreeRTOS\Modules\Port.c" >nul + copy /V /Y "..\..\..\Croutine.c" "%FEDLIBSUSER%\libFreeRTOS\Modules\Croutine.c" >nul + copy /V /Y "..\..\..\List.c" "%FEDLIBSUSER%\libFreeRTOS\Modules\List.c" >nul + copy /V /Y "..\..\..\Queue.c" "%FEDLIBSUSER%\libFreeRTOS\Modules\Queue.c" >nul + copy /V /Y "..\..\..\Tasks.c" "%FEDLIBSUSER%\libFreeRTOS\Modules\Tasks.c" >nul + +:COPY_DRIVERS + echo Drivers... + copy /V /Y "Drivers\Tick\Tick.c" "%FEDLIBSUSER%\libFreeRTOS\Drivers\Tick\Tick.c" >nul + copy /V /Y "Drivers\Tick\isrTick.c" "%FEDLIBSUSER%\libFreeRTOS\Drivers\Tick\isrTick.c" >nul + +:COPY_HEADERS + echo Headers... + copy /V /Y "portmacro.h" "%FEDLIBSUSER%\libFreeRTOS\Include\Portmacro.h" >nul + copy /V /Y "..\..\..\include\Croutine.h" "%FEDLIBSUSER%\libFreeRTOS\Include\Croutine.h" >nul + copy /V /Y "..\..\..\include\List.h" "%FEDLIBSUSER%\libFreeRTOS\Include\List.h" >nul + copy /V /Y "..\..\..\include\Portable.h" "%FEDLIBSUSER%\libFreeRTOS\Include\Portable.h" >nul + copy /V /Y "..\..\..\include\Projdefs.h" "%FEDLIBSUSER%\libFreeRTOS\Include\Projdefs.h" >nul + copy /V /Y "..\..\..\include\Queue.h" "%FEDLIBSUSER%\libFreeRTOS\Include\Queue.h" >nul + copy /V /Y "..\..\..\include\Semphr.h" "%FEDLIBSUSER%\libFreeRTOS\Include\Semphr.h" >nul + copy /V /Y "..\..\..\include\Task.h" "%FEDLIBSUSER%\libFreeRTOS\Include\Task.h" >nul + copy /V /Y "addFreeRTOS.h" + "..\..\..\include\FreeRTOS.h" "%FEDLIBSUSER%\FreeRTOS.h" >nul + + + echo Done + + +:SET_READONLY + echo. + echo Setting files to ReadOnly + attrib +R "%FEDLIBSUSER%\libFreeRTOS\Modules\Port.c" >nul + attrib +R "%FEDLIBSUSER%\libFreeRTOS\Modules\Croutine.c" >nul + attrib +R "%FEDLIBSUSER%\libFreeRTOS\Modules\List.c" >nul + attrib +R "%FEDLIBSUSER%\libFreeRTOS\Modules\Queue.c" >nul + attrib +R "%FEDLIBSUSER%\libFreeRTOS\Modules\Tasks.c" >nul + attrib +R "%FEDLIBSUSER%\libFreeRTOS\Drivers\Tick\Tick.c" >nul + attrib +R "%FEDLIBSUSER%\libFreeRTOS\Drivers\Tick\isrTick.c" >nul + attrib +R "%FEDLIBSUSER%\libFreeRTOS\Include\Portmacro.h" >nul + attrib +R "%FEDLIBSUSER%\libFreeRTOS\Include\Croutine.h" >nul + attrib +R "%FEDLIBSUSER%\libFreeRTOS\Include\List.h" >nul + attrib +R "%FEDLIBSUSER%\libFreeRTOS\Include\Portable.h" >nul + attrib +R "%FEDLIBSUSER%\libFreeRTOS\Include\Projdefs.h" >nul + attrib +R "%FEDLIBSUSER%\libFreeRTOS\Include\Queue.h" >nul + attrib +R "%FEDLIBSUSER%\libFreeRTOS\Include\Semphr.h" >nul + attrib +R "%FEDLIBSUSER%\libFreeRTOS\Include\Task.h" >nul + attrib +R "%FEDLIBSUSER%\FreeRTOS.h" >nul + echo Done + + +:FINISHED + echo. + echo The installation of %PACKAGENAME% is completed. + echo. + echo Please review the installation instructions as additional libraries + echo and fedC/wizC configuration settings may be needed for FreeRTOS + echo to function correctly. + + goto ENDIT + + +:ENDIT + echo. + echo. + echo Press 'enter' to close this window + pause >nul diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/WizC/PIC18/addFreeRTOS.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/WizC/PIC18/addFreeRTOS.h new file mode 100644 index 0000000..da38e48 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/WizC/PIC18/addFreeRTOS.h @@ -0,0 +1,95 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* +Changes from V3.0.0 + +Changes from V3.0.1 + +Changes from V4.0.1 + Uselib pragma added for Croutine.c +*/ + +/* + * The installation script will automatically prepend this file to the default FreeRTOS.h. + */ + +#ifndef WIZC_FREERTOS_H +#define WIZC_FREERTOS_H + +#pragma noheap +#pragma wizcpp expandnl on +#pragma wizcpp searchpath "$__PATHNAME__/libFreeRTOS/Include/" +#pragma wizcpp uselib "$__PATHNAME__/libFreeRTOS/Modules/Croutine.c" +#pragma wizcpp uselib "$__PATHNAME__/libFreeRTOS/Modules/Tasks.c" +#pragma wizcpp uselib "$__PATHNAME__/libFreeRTOS/Modules/Queue.c" +#pragma wizcpp uselib "$__PATHNAME__/libFreeRTOS/Modules/List.c" +#pragma wizcpp uselib "$__PATHNAME__/libFreeRTOS/Modules/Port.c" + +#endif /* WIZC_FREERTOS_H */ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/WizC/PIC18/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/WizC/PIC18/port.c new file mode 100644 index 0000000..85ba6c0 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/WizC/PIC18/port.c @@ -0,0 +1,359 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* +Changes from V3.2.1 + + CallReturn Depth increased from 8 to 10 levels to accomodate wizC/fedC V12. + +Changes from V3.2.0 + + TBLPTRU is now initialised to zero during the initial stack creation of a new task. This solves + an error on devices with more than 64kB ROM. + +Changes from V3.0.0 + + ucCriticalNesting is now initialised to 0x7F to prevent interrupts from being + handled before the scheduler is started. + +Changes from V3.0.1 +*/ + +/* Scheduler include files. */ +#include +#include + +#include + +/*--------------------------------------------------------------------------- + * Implementation of functions defined in portable.h for the WizC PIC18 port. + *---------------------------------------------------------------------------*/ + +/* + * We require the address of the pxCurrentTCB variable, but don't want to + * know any details of its type. + */ +typedef void TCB_t; +extern volatile TCB_t * volatile pxCurrentTCB; + +/* + * Define minimal-stack constants + * ----- + * FSR's: + * STATUS, WREG, BSR, PRODH, PRODL, FSR0H, FSR0L, + * FSR1H, FSR1L,TABLAT, (TBLPTRU), TBLPTRH, TBLPTRL, + * (PCLATU), PCLATH + * sfr's within parenthesis only on devices > 64kB + * ----- + * Call/Return stack: + * 2 bytes per entry on devices <= 64kB + * 3 bytes per entry on devices > 64kB + * ----- + * Other bytes: + * 2 bytes: FunctionParameter for initial taskcode + * 1 byte : Number of entries on call/return stack + * 1 byte : ucCriticalNesting + * 16 bytes: Free space on stack + */ +#if _ROMSIZE > 0x8000 + #define portSTACK_FSR_BYTES ( 15 ) + #define portSTACK_CALLRETURN_ENTRY_SIZE ( 3 ) +#else + #define portSTACK_FSR_BYTES ( 13 ) + #define portSTACK_CALLRETURN_ENTRY_SIZE ( 2 ) +#endif + +#define portSTACK_MINIMAL_CALLRETURN_DEPTH ( 10 ) +#define portSTACK_OTHER_BYTES ( 20 ) + +uint16_t usCalcMinStackSize = 0; + +/*-----------------------------------------------------------*/ + +/* + * We initialise ucCriticalNesting to the middle value an + * uint8_t can contain. This way portENTER_CRITICAL() + * and portEXIT_CRITICAL() can be called without interrupts + * being enabled before the scheduler starts. + */ +register uint8_t ucCriticalNesting = 0x7F; + +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a new task. + * See portSAVE_CONTEXT macro for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +uint8_t ucScratch; + /* + * Get the size of the RAMarea in page 0 used by the compiler + * We do this here already to avoid W-register conflicts. + */ + _Pragma("asm") + movlw OVERHEADPAGE0-LOCOPTSIZE+MAXLOCOPTSIZE + movwf PRODL,ACCESS ; PRODL is used as temp register + _Pragma("asmend") + ucScratch = PRODL; + + /* + * Place a few bytes of known values on the bottom of the stack. + * This is just useful for debugging. + */ +// *pxTopOfStack-- = 0x11; +// *pxTopOfStack-- = 0x22; +// *pxTopOfStack-- = 0x33; + + /* + * Simulate how the stack would look after a call to vPortYield() + * generated by the compiler. + */ + + /* + * First store the function parameters. This is where the task expects + * to find them when it starts running. + */ + *pxTopOfStack-- = ( StackType_t ) ( (( uint16_t ) pvParameters >> 8) & 0x00ff ); + *pxTopOfStack-- = ( StackType_t ) ( ( uint16_t ) pvParameters & 0x00ff ); + + /* + * Next are all the registers that form part of the task context. + */ + *pxTopOfStack-- = ( StackType_t ) 0x11; /* STATUS. */ + *pxTopOfStack-- = ( StackType_t ) 0x22; /* WREG. */ + *pxTopOfStack-- = ( StackType_t ) 0x33; /* BSR. */ + *pxTopOfStack-- = ( StackType_t ) 0x44; /* PRODH. */ + *pxTopOfStack-- = ( StackType_t ) 0x55; /* PRODL. */ + *pxTopOfStack-- = ( StackType_t ) 0x66; /* FSR0H. */ + *pxTopOfStack-- = ( StackType_t ) 0x77; /* FSR0L. */ + *pxTopOfStack-- = ( StackType_t ) 0x88; /* FSR1H. */ + *pxTopOfStack-- = ( StackType_t ) 0x99; /* FSR1L. */ + *pxTopOfStack-- = ( StackType_t ) 0xAA; /* TABLAT. */ +#if _ROMSIZE > 0x8000 + *pxTopOfStack-- = ( StackType_t ) 0x00; /* TBLPTRU. */ +#endif + *pxTopOfStack-- = ( StackType_t ) 0xCC; /* TBLPTRH. */ + *pxTopOfStack-- = ( StackType_t ) 0xDD; /* TBLPTRL. */ +#if _ROMSIZE > 0x8000 + *pxTopOfStack-- = ( StackType_t ) 0xEE; /* PCLATU. */ +#endif + *pxTopOfStack-- = ( StackType_t ) 0xFF; /* PCLATH. */ + + /* + * Next the compiler's scratchspace. + */ + while(ucScratch-- > 0) + { + *pxTopOfStack-- = ( StackType_t ) 0; + } + + /* + * The only function return address so far is the address of the task entry. + * The order is TOSU/TOSH/TOSL. For devices > 64kB, TOSU is put on the + * stack, too. TOSU is always written as zero here because wizC does not allow + * functionpointers to point above 64kB in ROM. + */ +#if _ROMSIZE > 0x8000 + *pxTopOfStack-- = ( StackType_t ) 0; +#endif + *pxTopOfStack-- = ( StackType_t ) ( ( ( uint16_t ) pxCode >> 8 ) & 0x00ff ); + *pxTopOfStack-- = ( StackType_t ) ( ( uint16_t ) pxCode & 0x00ff ); + + /* + * Store the number of return addresses on the hardware stack. + * So far only the address of the task entry point. + */ + *pxTopOfStack-- = ( StackType_t ) 1; + + /* + * The code generated by wizC does not maintain separate + * stack and frame pointers. Therefore the portENTER_CRITICAL macro cannot + * use the stack as per other ports. Instead a variable is used to keep + * track of the critical section nesting. This variable has to be stored + * as part of the task context and is initially set to zero. + */ + *pxTopOfStack-- = ( StackType_t ) portNO_CRITICAL_SECTION_NESTING; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +uint16_t usPortCALCULATE_MINIMAL_STACK_SIZE( void ) +{ + /* + * Fetch the size of compiler's scratchspace. + */ + _Pragma("asm") + movlw OVERHEADPAGE0-LOCOPTSIZE+MAXLOCOPTSIZE + movlb usCalcMinStackSize>>8 + movwf usCalcMinStackSize,BANKED + _Pragma("asmend") + + /* + * Add minimum needed stackspace + */ + usCalcMinStackSize += ( portSTACK_FSR_BYTES ) + + ( portSTACK_MINIMAL_CALLRETURN_DEPTH * portSTACK_CALLRETURN_ENTRY_SIZE ) + + ( portSTACK_OTHER_BYTES ); + + return(usCalcMinStackSize); +} + +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + extern void portSetupTick( void ); + + /* + * Setup a timer for the tick ISR for the preemptive scheduler. + */ + portSetupTick(); + + /* + * Restore the context of the first task to run. + */ + portRESTORE_CONTEXT(); + + /* + * This point should never be reached during execution. + */ + return pdTRUE; +} + +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* + * It is unlikely that the scheduler for the PIC port will get stopped + * once running. When called a reset is done which is probably the + * most valid action. + */ + _Pragma(asmline reset); +} + +/*-----------------------------------------------------------*/ + +/* + * Manual context switch. This is similar to the tick context switch, + * but does not increment the tick count. It must be identical to the + * tick context switch in how it stores the stack of a task. + */ +void vPortYield( void ) +{ + /* + * Save the context of the current task. + */ + portSAVE_CONTEXT( portINTERRUPTS_UNCHANGED ); + + /* + * Switch to the highest priority task that is ready to run. + */ + vTaskSwitchContext(); + + /* + * Start executing the task we have just switched to. + */ + portRESTORE_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + + void *pvPortMalloc( uint16_t usWantedSize ) + { + void *pvReturn; + + vTaskSuspendAll(); + { + pvReturn = malloc( ( malloc_t ) usWantedSize ); + } + xTaskResumeAll(); + + return pvReturn; + } + +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + + void vPortFree( void *pv ) + { + if( pv ) + { + vTaskSuspendAll(); + { + free( pv ); + } + xTaskResumeAll(); + } + } + +#endif /* configSUPPORT_DYNAMIC_ALLOCATION */ \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/WizC/PIC18/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/WizC/PIC18/portmacro.h new file mode 100644 index 0000000..b12cb92 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/WizC/PIC18/portmacro.h @@ -0,0 +1,465 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* +Changes from V3.0.0 + +Changes from V3.0.1 +*/ +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#if !defined(_SERIES) || _SERIES != 18 + #error "WizC supports FreeRTOS on the Microchip PIC18-series only" +#endif + +#if !defined(QUICKCALL) || QUICKCALL != 1 + #error "QuickCall must be enabled (see ProjectOptions/Optimisations)" +#endif + +#include +#include + +#define portCHAR char +#define portFLOAT float +#define portDOUBLE portFLOAT +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint8_t +#define portBASE_TYPE char + +typedef portSTACK_TYPE StackType_t; +typedef signed char BaseType_t; +typedef unsigned char UBaseType_t; + + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) ( 0xFFFF ) +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) ( 0xFFFFFFFF ) +#endif + +#define portBYTE_ALIGNMENT 1 + +/*-----------------------------------------------------------*/ + +/* + * Constant used for context switch macro when we require the interrupt + * enable state to be forced when the interrupted task is switched back in. + */ +#define portINTERRUPTS_FORCED (0x01) + +/* + * Constant used for context switch macro when we require the interrupt + * enable state to be unchanged when the interrupted task is switched back in. + */ +#define portINTERRUPTS_UNCHANGED (0x00) + +/* Initial interrupt enable state for newly created tasks. This value is + * used when a task switches in for the first time. + */ +#define portINTERRUPTS_INITIAL_STATE (portINTERRUPTS_FORCED) + +/* + * Macros to modify the global interrupt enable bit in INTCON. + */ +#define portDISABLE_INTERRUPTS() \ + do \ + { \ + bGIE=0; \ + } while(bGIE) // MicroChip recommends this check! + +#define portENABLE_INTERRUPTS() \ + do \ + { \ + bGIE=1; \ + } while(0) + +/*-----------------------------------------------------------*/ + +/* + * Critical section macros. + */ +extern uint8_t ucCriticalNesting; + +#define portNO_CRITICAL_SECTION_NESTING ( ( uint8_t ) 0 ) + +#define portENTER_CRITICAL() \ + do \ + { \ + portDISABLE_INTERRUPTS(); \ + \ + /* \ + * Now interrupts are disabled ucCriticalNesting \ + * can be accessed directly. Increment \ + * ucCriticalNesting to keep a count of how \ + * many times portENTER_CRITICAL() has been called. \ + */ \ + ucCriticalNesting++; \ + } while(0) + +#define portEXIT_CRITICAL() \ + do \ + { \ + if(ucCriticalNesting > portNO_CRITICAL_SECTION_NESTING) \ + { \ + /* \ + * Decrement the nesting count as we are leaving a \ + * critical section. \ + */ \ + ucCriticalNesting--; \ + } \ + \ + /* \ + * If the nesting level has reached zero then \ + * interrupts should be re-enabled. \ + */ \ + if( ucCriticalNesting == portNO_CRITICAL_SECTION_NESTING ) \ + { \ + portENABLE_INTERRUPTS(); \ + } \ + } while(0) + +/*-----------------------------------------------------------*/ + +/* + * The minimal stacksize is calculated on the first reference of + * portMINIMAL_STACK_SIZE. Some input to this calculation is + * compiletime determined, other input is port-defined (see port.c) + */ +extern uint16_t usPortCALCULATE_MINIMAL_STACK_SIZE( void ); +extern uint16_t usCalcMinStackSize; + +#define portMINIMAL_STACK_SIZE \ + ((usCalcMinStackSize == 0) \ + ? usPortCALCULATE_MINIMAL_STACK_SIZE() \ + : usCalcMinStackSize ) + +/* + * WizC uses a downgrowing stack + */ +#define portSTACK_GROWTH ( -1 ) + +/*-----------------------------------------------------------*/ + +/* + * Macro's that pushes all the registers that make up the context of a task onto + * the stack, then saves the new top of stack into the TCB. TOSU and TBLPTRU + * are only saved/restored on devices with more than 64kB (32k Words) ROM. + * + * The stackpointer is helt by WizC in FSR2 and points to the first free byte. + * WizC uses a "downgrowing" stack. There is no framepointer. + * + * We keep track of the interruptstatus using ucCriticalNesting. When this + * value equals zero, interrupts have to be enabled upon exit from the + * portRESTORE_CONTEXT macro. + * + * If this is called from an ISR then the interrupt enable bits must have been + * set for the ISR to ever get called. Therefore we want to save + * ucCriticalNesting with value zero. This means the interrupts will again be + * re-enabled when the interrupted task is switched back in. + * + * If this is called from a manual context switch (i.e. from a call to yield), + * then we want to keep the current value of ucCritialNesting so it is restored + * with its current value. This allows a yield from within a critical section. + * + * The compiler uses some locations at the bottom of RAM for temporary + * storage. The compiler may also have been instructed to optimize + * function-parameters and local variables to global storage. The compiler + * uses an area called LocOpt for this wizC feature. + * The total overheadstorage has to be saved in it's entirety as part of + * a task context. These macro's store/restore from data address 0x0000 to + * (OVERHEADPAGE0-LOCOPTSIZE+MAXLOCOPTSIZE - 1). + * OVERHEADPAGE0, LOCOPTSIZE and MAXLOCOPTSIZE are compiler-generated + * assembler definitions. + */ + +#define portSAVE_CONTEXT( ucInterruptForced ) \ + do \ + { \ + portDISABLE_INTERRUPTS(); \ + \ + _Pragma("asm") \ + ; \ + ; Push the relevant SFR's onto the task's stack \ + ; \ + movff STATUS,POSTDEC2 \ + movff WREG,POSTDEC2 \ + movff BSR,POSTDEC2 \ + movff PRODH,POSTDEC2 \ + movff PRODL,POSTDEC2 \ + movff FSR0H,POSTDEC2 \ + movff FSR0L,POSTDEC2 \ + movff FSR1H,POSTDEC2 \ + movff FSR1L,POSTDEC2 \ + movff TABLAT,POSTDEC2 \ + if __ROMSIZE > 0x8000 \ + movff TBLPTRU,POSTDEC2 \ + endif \ + movff TBLPTRH,POSTDEC2 \ + movff TBLPTRL,POSTDEC2 \ + if __ROMSIZE > 0x8000 \ + movff PCLATU,POSTDEC2 \ + endif \ + movff PCLATH,POSTDEC2 \ + ; \ + ; Store the compiler-scratch-area as described above. \ + ; \ + movlw OVERHEADPAGE0-LOCOPTSIZE+MAXLOCOPTSIZE \ + clrf FSR0L,ACCESS \ + clrf FSR0H,ACCESS \ + _rtos_S1: \ + movff POSTINC0,POSTDEC2 \ + decfsz WREG,W,ACCESS \ + SMARTJUMP _rtos_S1 \ + ; \ + ; Save the pic call/return-stack belonging to the \ + ; current task by copying it to the task's software- \ + ; stack. We save the hardware stack pointer (which \ + ; is the number of addresses on the stack) in the \ + ; W-register first because we need it later and it \ + ; is modified in the save-loop by executing pop's. \ + ; After the loop the W-register is stored on the \ + ; stack, too. \ + ; \ + movf STKPTR,W,ACCESS \ + bz _rtos_s3 \ + _rtos_S2: \ + if __ROMSIZE > 0x8000 \ + movff TOSU,POSTDEC2 \ + endif \ + movff TOSH,POSTDEC2 \ + movff TOSL,POSTDEC2 \ + pop \ + tstfsz STKPTR,ACCESS \ + SMARTJUMP _rtos_S2 \ + _rtos_s3: \ + movwf POSTDEC2,ACCESS \ + ; \ + ; Next the value for ucCriticalNesting used by the \ + ; task is stored on the stack. When \ + ; (ucInterruptForced == portINTERRUPTS_FORCED), we save \ + ; it as 0 (portNO_CRITICAL_SECTION_NESTING). \ + ; \ + if ucInterruptForced == portINTERRUPTS_FORCED \ + clrf POSTDEC2,ACCESS \ + else \ + movff ucCriticalNesting,POSTDEC2 \ + endif \ + ; \ + ; Save the new top of the software stack in the TCB. \ + ; \ + movff pxCurrentTCB,FSR0L \ + movff pxCurrentTCB+1,FSR0H \ + movff FSR2L,POSTINC0 \ + movff FSR2H,POSTINC0 \ + _Pragma("asmend") \ + } while(0) + +/************************************************************/ + +/* + * This is the reverse of portSAVE_CONTEXT. + */ +#define portRESTORE_CONTEXT() \ + do \ + { \ + _Pragma("asm") \ + ; \ + ; Set FSR0 to point to pxCurrentTCB->pxTopOfStack. \ + ; \ + movff pxCurrentTCB,FSR0L \ + movff pxCurrentTCB+1,FSR0H \ + ; \ + ; De-reference FSR0 to set the address it holds into \ + ; FSR2 (i.e. *( pxCurrentTCB->pxTopOfStack ) ). FSR2 \ + ; is used by wizC as stackpointer. \ + ; \ + movff POSTINC0,FSR2L \ + movff POSTINC0,FSR2H \ + ; \ + ; Next, the value for ucCriticalNesting used by the \ + ; task is retrieved from the stack. \ + ; \ + movff PREINC2,ucCriticalNesting \ + ; \ + ; Rebuild the pic call/return-stack. The number of \ + ; return addresses is the next item on the task stack. \ + ; Save this number in PRODL. Then fetch the addresses \ + ; and store them on the hardwarestack. \ + ; The datasheets say we can't use movff here... \ + ; \ + movff PREINC2,PRODL // Use PRODL as tempregister \ + clrf STKPTR,ACCESS \ + _rtos_R1: \ + push \ + movf PREINC2,W,ACCESS \ + movwf TOSL,ACCESS \ + movf PREINC2,W,ACCESS \ + movwf TOSH,ACCESS \ + if __ROMSIZE > 0x8000 \ + movf PREINC2,W,ACCESS \ + movwf TOSU,ACCESS \ + else \ + clrf TOSU,ACCESS \ + endif \ + decfsz PRODL,F,ACCESS \ + SMARTJUMP _rtos_R1 \ + ; \ + ; Restore the compiler's working storage area to page 0 \ + ; \ + movlw OVERHEADPAGE0-LOCOPTSIZE+MAXLOCOPTSIZE \ + movwf FSR0L,ACCESS \ + clrf FSR0H,ACCESS \ + _rtos_R2: \ + decf FSR0L,F,ACCESS \ + movff PREINC2,INDF0 \ + tstfsz FSR0L,ACCESS \ + SMARTJUMP _rtos_R2 \ + ; \ + ; Restore the sfr's forming the tasks context. \ + ; We cannot yet restore bsr, w and status because \ + ; we need these registers for a final test. \ + ; \ + movff PREINC2,PCLATH \ + if __ROMSIZE > 0x8000 \ + movff PREINC2,PCLATU \ + else \ + clrf PCLATU,ACCESS \ + endif \ + movff PREINC2,TBLPTRL \ + movff PREINC2,TBLPTRH \ + if __ROMSIZE > 0x8000 \ + movff PREINC2,TBLPTRU \ + else \ + clrf TBLPTRU,ACCESS \ + endif \ + movff PREINC2,TABLAT \ + movff PREINC2,FSR1L \ + movff PREINC2,FSR1H \ + movff PREINC2,FSR0L \ + movff PREINC2,FSR0H \ + movff PREINC2,PRODL \ + movff PREINC2,PRODH \ + ; \ + ; The return from portRESTORE_CONTEXT() depends on \ + ; the value of ucCriticalNesting. When it is zero, \ + ; interrupts need to be enabled. This is done via a \ + ; retfie instruction because we need the \ + ; interrupt-enabling and the return to the restored \ + ; task to be uninterruptable. \ + ; Because bsr, status and W are affected by the test \ + ; they are restored after the test. \ + ; \ + movlb ucCriticalNesting>>8 \ + tstfsz ucCriticalNesting,BANKED \ + SMARTJUMP _rtos_R4 \ + _rtos_R3: \ + movff PREINC2,BSR \ + movff PREINC2,WREG \ + movff PREINC2,STATUS \ + retfie 0 ; Return enabling interrupts \ + _rtos_R4: \ + movff PREINC2,BSR \ + movff PREINC2,WREG \ + movff PREINC2,STATUS \ + return 0 ; Return without affecting interrupts \ + _Pragma("asmend") \ + } while(0) + +/*-----------------------------------------------------------*/ + +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + +/*-----------------------------------------------------------*/ + +extern void vPortYield( void ); +#define portYIELD() vPortYield() + +#define portNOP() _Pragma("asm") \ + nop \ + _Pragma("asmend") + +/*-----------------------------------------------------------*/ + +#define portTASK_FUNCTION( xFunction, pvParameters ) \ + void pointed xFunction( void *pvParameters ) \ + _Pragma(asmfunc xFunction) + +#define portTASK_FUNCTION_PROTO portTASK_FUNCTION +/*-----------------------------------------------------------*/ + + +#define volatile +#define register + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/oWatcom/16BitDOS/Flsh186/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/oWatcom/16BitDOS/Flsh186/port.c new file mode 100644 index 0000000..b56e898 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/oWatcom/16BitDOS/Flsh186/port.c @@ -0,0 +1,288 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* +Changes from V1.00: + + + Call to taskYIELD() from within tick ISR has been replaced by the more + efficient portSWITCH_CONTEXT(). + + ISR function definitions renamed to include the prv prefix. + +Changes from V1.2.0: + + + portRESET_PIC() is now called last thing before the end of the preemptive + tick routine. + +Changes from V2.6.1 + + + Replaced the sUsingPreemption variable with the configUSE_PREEMPTION + macro to be consistent with the later ports. +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the Flashlite 186 + * port. + *----------------------------------------------------------*/ + +#include +#include +#include +#include + +#include "FreeRTOS.h" +#include "task.h" +#include "portasm.h" + +/*lint -e950 Non ANSI reserved words okay in this file only. */ + +#define portTIMER_EOI_TYPE ( 8 ) +#define portRESET_PIC() portOUTPUT_WORD( ( uint16_t ) 0xff22, portTIMER_EOI_TYPE ) +#define portTIMER_INT_NUMBER 0x12 + +#define portTIMER_1_CONTROL_REGISTER ( ( uint16_t ) 0xff5e ) +#define portTIMER_0_CONTROL_REGISTER ( ( uint16_t ) 0xff56 ) +#define portTIMER_INTERRUPT_ENABLE ( ( uint16_t ) 0x2000 ) + +/* Setup the hardware to generate the required tick frequency. */ +static void prvSetTickFrequency( uint32_t ulTickRateHz ); + +/* Set the hardware back to the state as per before the scheduler started. */ +static void prvExitFunction( void ); + +#if configUSE_PREEMPTION == 1 + /* Tick service routine used by the scheduler when preemptive scheduling is + being used. */ + static void __interrupt __far prvPreemptiveTick( void ); +#else + /* Tick service routine used by the scheduler when cooperative scheduling is + being used. */ + static void __interrupt __far prvNonPreemptiveTick( void ); +#endif + +/* Trap routine used by taskYIELD() to manually cause a context switch. */ +static void __interrupt __far prvYieldProcessor( void ); + +/*lint -e956 File scopes necessary here. */ + +/* Set true when the vectors are set so the scheduler will service the tick. */ +static int16_t sSchedulerRunning = pdFALSE; + +/* Points to the original routine installed on the vector we use for manual context switches. This is then used to restore the original routine during prvExitFunction(). */ +static void ( __interrupt __far *pxOldSwitchISR )(); + +/* Used to restore the original DOS context when the scheduler is ended. */ +static jmp_buf xJumpBuf; + +/*lint +e956 */ + +/*-----------------------------------------------------------*/ +BaseType_t xPortStartScheduler( void ) +{ + /* This is called with interrupts already disabled. */ + + /* Remember what was on the interrupts we are going to use + so we can put them back later if required. */ + pxOldSwitchISR = _dos_getvect( portSWITCH_INT_NUMBER ); + + /* Put our manual switch (yield) function on a known + vector. */ + _dos_setvect( portSWITCH_INT_NUMBER, prvYieldProcessor ); + + #if configUSE_PREEMPTION == 1 + { + /* Put our tick switch function on the timer interrupt. */ + _dos_setvect( portTIMER_INT_NUMBER, prvPreemptiveTick ); + } + #else + { + /* We want the timer interrupt to just increment the tick count. */ + _dos_setvect( portTIMER_INT_NUMBER, prvNonPreemptiveTick ); + } + #endif + + prvSetTickFrequency( configTICK_RATE_HZ ); + + /* Clean up function if we want to return to DOS. */ + if( setjmp( xJumpBuf ) != 0 ) + { + prvExitFunction(); + sSchedulerRunning = pdFALSE; + } + else + { + sSchedulerRunning = pdTRUE; + + /* Kick off the scheduler by setting up the context of the first task. */ + portFIRST_CONTEXT(); + } + + return sSchedulerRunning; +} +/*-----------------------------------------------------------*/ + +/* The tick ISR used depend on whether or not the preemptive or cooperative +kernel is being used. */ +#if configUSE_PREEMPTION == 1 + static void __interrupt __far prvPreemptiveTick( void ) + { + /* Get the scheduler to update the task states following the tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Switch in the context of the next task to be run. */ + portSWITCH_CONTEXT(); + } + + /* Reset the PIC ready for the next time. */ + portRESET_PIC(); + } +#else + static void __interrupt __far prvNonPreemptiveTick( void ) + { + /* Same as preemptive tick, but the cooperative scheduler is being used + so we don't have to switch in the context of the next task. */ + xTaskIncrementTick(); + portRESET_PIC(); + } +#endif +/*-----------------------------------------------------------*/ + +static void __interrupt __far prvYieldProcessor( void ) +{ + /* Switch in the context of the next task to be run. */ + portSWITCH_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Jump back to the processor state prior to starting the + scheduler. This means we are not going to be using a + task stack frame so the task can be deleted. */ + longjmp( xJumpBuf, 1 ); +} +/*-----------------------------------------------------------*/ + +static void prvExitFunction( void ) +{ +const uint16_t usTimerDisable = 0x0000; +uint16_t usTimer0Control; + + /* Interrupts should be disabled here anyway - but no + harm in making sure. */ + portDISABLE_INTERRUPTS(); + if( sSchedulerRunning == pdTRUE ) + { + /* Put back the switch interrupt routines that was in place + before the scheduler started. */ + _dos_setvect( portSWITCH_INT_NUMBER, pxOldSwitchISR ); + } + + /* Disable the timer used for the tick to ensure the scheduler is + not called before restoring interrupts. There was previously nothing + on this timer so there is no old ISR to restore. */ + portOUTPUT_WORD( portTIMER_1_CONTROL_REGISTER, usTimerDisable ); + + /* Restart the DOS tick. */ + usTimer0Control = portINPUT_WORD( portTIMER_0_CONTROL_REGISTER ); + usTimer0Control |= portTIMER_INTERRUPT_ENABLE; + portOUTPUT_WORD( portTIMER_0_CONTROL_REGISTER, usTimer0Control ); + + + portENABLE_INTERRUPTS(); +} +/*-----------------------------------------------------------*/ + +static void prvSetTickFrequency( uint32_t ulTickRateHz ) +{ +const uint16_t usMaxCountRegister = 0xff5a; +const uint16_t usTimerPriorityRegister = 0xff32; +const uint16_t usTimerEnable = 0xC000; +const uint16_t usRetrigger = 0x0001; +const uint16_t usTimerHighPriority = 0x0000; +uint16_t usTimer0Control; + +/* ( CPU frequency / 4 ) / clock 2 max count [inpw( 0xff62 ) = 7] */ + +const uint32_t ulClockFrequency = 0x7f31a0; + +uint32_t ulTimerCount = ulClockFrequency / ulTickRateHz; + + portOUTPUT_WORD( portTIMER_1_CONTROL_REGISTER, usTimerEnable | portTIMER_INTERRUPT_ENABLE | usRetrigger ); + portOUTPUT_WORD( usMaxCountRegister, ( uint16_t ) ulTimerCount ); + portOUTPUT_WORD( usTimerPriorityRegister, usTimerHighPriority ); + + /* Stop the DOS tick - don't do this if you want to maintain a TOD clock. */ + usTimer0Control = portINPUT_WORD( portTIMER_0_CONTROL_REGISTER ); + usTimer0Control &= ~portTIMER_INTERRUPT_ENABLE; + portOUTPUT_WORD( portTIMER_0_CONTROL_REGISTER, usTimer0Control ); +} + + +/*lint +e950 */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/oWatcom/16BitDOS/Flsh186/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/oWatcom/16BitDOS/Flsh186/portmacro.h new file mode 100644 index 0000000..13dd4d8 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/oWatcom/16BitDOS/Flsh186/portmacro.h @@ -0,0 +1,152 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE long +#define portLONG long +#define portSHORT int +#define portSTACK_TYPE uint16_t +#define portBASE_TYPE short + +typedef portSTACK_TYPE StackType_t; +typedef short BaseType_t; +typedef unsigned short UBaseType_t; + + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +void portENTER_CRITICAL( void ); +#pragma aux portENTER_CRITICAL = "pushf" \ + "cli"; + +void portEXIT_CRITICAL( void ); +#pragma aux portEXIT_CRITICAL = "popf"; + +void portDISABLE_INTERRUPTS( void ); +#pragma aux portDISABLE_INTERRUPTS = "cli"; + +void portENABLE_INTERRUPTS( void ); +#pragma aux portENABLE_INTERRUPTS = "sti"; +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portSWITCH_INT_NUMBER 0x80 +#define portYIELD() __asm{ int portSWITCH_INT_NUMBER } +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 2 +#define portINITIAL_SW ( ( portSTACK_TYPE ) 0x0202 ) /* Start the tasks with interrupts enabled. */ +#define portNOP() __asm{ nop } +/*-----------------------------------------------------------*/ + +/* Compiler specifics. */ +#define portINPUT_BYTE( xAddr ) inp( xAddr ) +#define portOUTPUT_BYTE( xAddr, ucValue ) outp( xAddr, ucValue ) +#define portINPUT_WORD( xAddr ) inpw( xAddr ) +#define portOUTPUT_WORD( xAddr, usValue ) outpw( xAddr, usValue ) +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/oWatcom/16BitDOS/PC/port.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/oWatcom/16BitDOS/PC/port.c new file mode 100644 index 0000000..a6d3eb9 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/oWatcom/16BitDOS/PC/port.c @@ -0,0 +1,344 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* +Changes from V1.00: + + + Call to taskYIELD() from within tick ISR has been replaced by the more + efficient portSWITCH_CONTEXT(). + + ISR function definitions renamed to include the prv prefix. + +Changes from V1.2.0: + + + prvPortResetPIC() is now called last thing before the end of the + preemptive tick routine. + +Changes from V2.6.1 + + + Replaced the sUsingPreemption variable with the configUSE_PREEMPTION + macro to be consistent with the later ports. + +Changes from V4.0.1 + + + Add function prvSetTickFrequencyDefault() to set the DOS tick back to + its proper value when the scheduler exits. +*/ + +#include +#include +#include +#include +#include + +#include "FreeRTOS.h" +#include "task.h" +#include "portasm.h" + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the industrial + * PC port. + *----------------------------------------------------------*/ + +/*lint -e950 Non ANSI reserved words okay in this file only. */ + +#define portTIMER_INT_NUMBER 0x08 + +/* Setup hardware for required tick interrupt rate. */ +static void prvSetTickFrequency( uint32_t ulTickRateHz ); + +/* Restore hardware to as it was prior to starting the scheduler. */ +static void prvExitFunction( void ); + +/* Either chain to the DOS tick (which itself clears the PIC) or clear the PIC +directly. We chain to the DOS tick as close as possible to the standard DOS +tick rate. */ +static void prvPortResetPIC( void ); + +/* The tick ISR used depends on whether the preemptive or cooperative scheduler +is being used. */ +#if configUSE_PREEMPTION == 1 + /* Tick service routine used by the scheduler when preemptive scheduling is + being used. */ + static void __interrupt __far prvPreemptiveTick( void ); +#else + /* Tick service routine used by the scheduler when cooperative scheduling is + being used. */ + static void __interrupt __far prvNonPreemptiveTick( void ); +#endif +/* Trap routine used by taskYIELD() to manually cause a context switch. */ +static void __interrupt __far prvYieldProcessor( void ); + +/* Set the tick frequency back so the floppy drive works correctly when the +scheduler exits. */ +static void prvSetTickFrequencyDefault( void ); + +/*lint -e956 File scopes necessary here. */ + +/* Used to signal when to chain to the DOS tick, and when to just clear the PIC ourselves. */ +static int16_t sDOSTickCounter; + +/* Set true when the vectors are set so the scheduler will service the tick. */ +static int16_t sSchedulerRunning = pdFALSE; + +/* Points to the original routine installed on the vector we use for manual context switches. This is then used to restore the original routine during prvExitFunction(). */ +static void ( __interrupt __far *pxOldSwitchISR )(); + +/* Points to the original routine installed on the vector we use to chain to the DOS tick. This is then used to restore the original routine during prvExitFunction(). */ +static void ( __interrupt __far *pxOldSwitchISRPlus1 )(); + +/* Used to restore the original DOS context when the scheduler is ended. */ +static jmp_buf xJumpBuf; + +/*lint +e956 */ + +/*-----------------------------------------------------------*/ +BaseType_t xPortStartScheduler( void ) +{ +pxISR pxOriginalTickISR; + + /* This is called with interrupts already disabled. */ + + /* Remember what was on the interrupts we are going to use + so we can put them back later if required. */ + pxOldSwitchISR = _dos_getvect( portSWITCH_INT_NUMBER ); + pxOriginalTickISR = _dos_getvect( portTIMER_INT_NUMBER ); + pxOldSwitchISRPlus1 = _dos_getvect( portSWITCH_INT_NUMBER + 1 ); + + prvSetTickFrequency( configTICK_RATE_HZ ); + + /* Put our manual switch (yield) function on a known + vector. */ + _dos_setvect( portSWITCH_INT_NUMBER, prvYieldProcessor ); + + /* Put the old tick on a different interrupt number so we can + call it when we want. */ + _dos_setvect( portSWITCH_INT_NUMBER + 1, pxOriginalTickISR ); + + #if configUSE_PREEMPTION == 1 + { + /* Put our tick switch function on the timer interrupt. */ + _dos_setvect( portTIMER_INT_NUMBER, prvPreemptiveTick ); + } + #else + { + /* We want the timer interrupt to just increment the tick count. */ + _dos_setvect( portTIMER_INT_NUMBER, prvNonPreemptiveTick ); + } + #endif + + /* Setup a counter that is used to call the DOS interrupt as close + to it's original frequency as can be achieved given our chosen tick + frequency. */ + sDOSTickCounter = portTICKS_PER_DOS_TICK; + + /* Clean up function if we want to return to DOS. */ + if( setjmp( xJumpBuf ) != 0 ) + { + prvExitFunction(); + sSchedulerRunning = pdFALSE; + } + else + { + sSchedulerRunning = pdTRUE; + + /* Kick off the scheduler by setting up the context of the first task. */ + portFIRST_CONTEXT(); + } + + return sSchedulerRunning; +} +/*-----------------------------------------------------------*/ + +/* The tick ISR used depends on whether the preemptive or cooperative scheduler +is being used. */ +#if configUSE_PREEMPTION == 1 + /* Tick service routine used by the scheduler when preemptive scheduling is + being used. */ + static void __interrupt __far prvPreemptiveTick( void ) + { + /* Get the scheduler to update the task states following the tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Switch in the context of the next task to be run. */ + portSWITCH_CONTEXT(); + } + + /* Reset the PIC ready for the next time. */ + prvPortResetPIC(); + } +#else + static void __interrupt __far prvNonPreemptiveTick( void ) + { + /* Same as preemptive tick, but the cooperative scheduler is being used + so we don't have to switch in the context of the next task. */ + xTaskIncrementTick(); + prvPortResetPIC(); + } +#endif +/*-----------------------------------------------------------*/ + + +static void __interrupt __far prvYieldProcessor( void ) +{ + /* Switch in the context of the next task to be run. */ + portSWITCH_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +static void prvPortResetPIC( void ) +{ + /* We are going to call the DOS tick interrupt at as close a + frequency to the normal DOS tick as possible. */ + + /* WE SHOULD NOT DO THIS IF YIELD WAS CALLED. */ + --sDOSTickCounter; + if( sDOSTickCounter <= 0 ) + { + sDOSTickCounter = ( int16_t ) portTICKS_PER_DOS_TICK; + __asm{ int portSWITCH_INT_NUMBER + 1 }; + } + else + { + /* Reset the PIC as the DOS tick is not being called to + do it. */ + __asm + { + mov al, 20H + out 20H, al + }; + } +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Jump back to the processor state prior to starting the + scheduler. This means we are not going to be using a + task stack frame so the task can be deleted. */ + longjmp( xJumpBuf, 1 ); +} +/*-----------------------------------------------------------*/ + +static void prvExitFunction( void ) +{ +void ( __interrupt __far *pxOriginalTickISR )(); + + /* Interrupts should be disabled here anyway - but no + harm in making sure. */ + portDISABLE_INTERRUPTS(); + if( sSchedulerRunning == pdTRUE ) + { + /* Set the DOS tick back onto the timer ticker. */ + pxOriginalTickISR = _dos_getvect( portSWITCH_INT_NUMBER + 1 ); + _dos_setvect( portTIMER_INT_NUMBER, pxOriginalTickISR ); + prvSetTickFrequencyDefault(); + + /* Put back the switch interrupt routines that was in place + before the scheduler started. */ + _dos_setvect( portSWITCH_INT_NUMBER, pxOldSwitchISR ); + _dos_setvect( portSWITCH_INT_NUMBER + 1, pxOldSwitchISRPlus1 ); + } + /* The tick timer is back how DOS wants it. We can re-enable + interrupts without the scheduler being called. */ + portENABLE_INTERRUPTS(); +} +/*-----------------------------------------------------------*/ + +static void prvSetTickFrequency( uint32_t ulTickRateHz ) +{ +const uint16_t usPIT_MODE = ( uint16_t ) 0x43; +const uint16_t usPIT0 = ( uint16_t ) 0x40; +const uint32_t ulPIT_CONST = ( uint32_t ) 1193180; +const uint16_t us8254_CTR0_MODE3 = ( uint16_t ) 0x36; +uint32_t ulOutput; + + /* Setup the 8245 to tick at the wanted frequency. */ + portOUTPUT_BYTE( usPIT_MODE, us8254_CTR0_MODE3 ); + ulOutput = ulPIT_CONST / ulTickRateHz; + + portOUTPUT_BYTE( usPIT0, ( uint16_t )( ulOutput & ( uint32_t ) 0xff ) ); + ulOutput >>= 8; + portOUTPUT_BYTE( usPIT0, ( uint16_t ) ( ulOutput & ( uint32_t ) 0xff ) ); +} +/*-----------------------------------------------------------*/ + +static void prvSetTickFrequencyDefault( void ) +{ +const uint16_t usPIT_MODE = ( uint16_t ) 0x43; +const uint16_t usPIT0 = ( uint16_t ) 0x40; +const uint16_t us8254_CTR0_MODE3 = ( uint16_t ) 0x36; + + portOUTPUT_BYTE( usPIT_MODE, us8254_CTR0_MODE3 ); + portOUTPUT_BYTE( usPIT0,0 ); + portOUTPUT_BYTE( usPIT0,0 ); +} + + +/*lint +e950 */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/oWatcom/16BitDOS/PC/portmacro.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/oWatcom/16BitDOS/PC/portmacro.h new file mode 100644 index 0000000..2db988c --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/oWatcom/16BitDOS/PC/portmacro.h @@ -0,0 +1,154 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT int +#define portSTACK_TYPE uint16_t +#define portBASE_TYPE short + +typedef portSTACK_TYPE StackType_t; +typedef short BaseType_t; +typedef unsigned short UBaseType_t; + + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Critical section definitions. portENTER_CRITICAL() must be defined as a +macro for portable.h to work properly. */ +void portLOCAL_ENTER_CRITICAL( void ); +#pragma aux portLOCAL_ENTER_CRITICAL = "pushf" \ + "cli"; +#define portENTER_CRITICAL() portLOCAL_ENTER_CRITICAL() + +void portEXIT_CRITICAL( void ); +#pragma aux portEXIT_CRITICAL = "popf"; + +void portDISABLE_INTERRUPTS( void ); +#pragma aux portDISABLE_INTERRUPTS = "cli"; + +void portENABLE_INTERRUPTS( void ); +#pragma aux portENABLE_INTERRUPTS = "sti"; +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portSWITCH_INT_NUMBER 0x80 +#define portYIELD() __asm{ int portSWITCH_INT_NUMBER } +#define portDOS_TICK_RATE ( 18.20648 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portTICKS_PER_DOS_TICK ( ( uint16_t ) ( ( ( portDOUBLE ) configTICK_RATE_HZ / portDOS_TICK_RATE ) + 0.5 ) ) +#define portINITIAL_SW ( ( portSTACK_TYPE ) 0x0202 ) /* Start the tasks with interrupts enabled. */ +#define portBYTE_ALIGNMENT ( 2 ) +/*-----------------------------------------------------------*/ + +/* Compiler specifics. */ +#define portINPUT_BYTE( xAddr ) inp( xAddr ) +#define portOUTPUT_BYTE( xAddr, ucValue ) outp( xAddr, ucValue ) +#define portNOP() __asm{ nop } +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vTaskFunction, pvParameters ) void vTaskFunction( void *pvParameters ) +#define portTASK_FUNCTION( vTaskFunction, pvParameters ) void vTaskFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + + +#endif /* PORTMACRO_H */ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/oWatcom/16BitDOS/common/portasm.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/oWatcom/16BitDOS/common/portasm.h new file mode 100644 index 0000000..63637e8 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/oWatcom/16BitDOS/common/portasm.h @@ -0,0 +1,152 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +typedef void TCB_t; +extern volatile TCB_t * volatile pxCurrentTCB; +extern void vTaskSwitchContext( void ); + +/* + * Saves the stack pointer for one task into its TCB, calls + * vTaskSwitchContext() to update the TCB being used, then restores the stack + * from the new TCB read to run the task. + */ +void portSWITCH_CONTEXT( void ); + +/* + * Load the stack pointer from the TCB of the task which is going to be first + * to execute. Then force an IRET so the registers and IP are popped off the + * stack. + */ +void portFIRST_CONTEXT( void ); + +/* There are slightly different versions depending on whether you are building +to include debugger information. If debugger information is used then there +are a couple of extra bytes left of the ISR stack (presumably for use by the +debugger). The true stack pointer is then stored in the bp register. We add +2 to the stack pointer to remove the extra bytes before we restore our context. */ + +#ifdef DEBUG_BUILD + + #pragma aux portSWITCH_CONTEXT = "mov ax, seg pxCurrentTCB" \ + "mov ds, ax" \ + "les bx, pxCurrentTCB" /* Save the stack pointer into the TCB. */ \ + "mov es:0x2[ bx ], ss" \ + "mov es:[ bx ], sp" \ + "call vTaskSwitchContext" /* Perform the switch. */ \ + "mov ax, seg pxCurrentTCB" /* Restore the stack pointer from the TCB. */ \ + "mov ds, ax" \ + "les bx, dword ptr pxCurrentTCB" \ + "mov ss, es:[ bx + 2 ]" \ + "mov sp, es:[ bx ]" \ + "mov bp, sp" /* Prepair the bp register for the restoration of the SP in the compiler generated portion of the ISR */ \ + "add bp, 0x0002" + + + + #pragma aux portFIRST_CONTEXT = "mov ax, seg pxCurrentTCB" \ + "mov ds, ax" \ + "les bx, dword ptr pxCurrentTCB" \ + "mov ss, es:[ bx + 2 ]" \ + "mov sp, es:[ bx ]" \ + "add sp, 0x0002" /* Remove the extra bytes that exist in debug builds before restoring the context. */ \ + "pop ax" \ + "pop ax" \ + "pop es" \ + "pop ds" \ + "popa" \ + "iret" +#else + + #pragma aux portSWITCH_CONTEXT = "mov ax, seg pxCurrentTCB" \ + "mov ds, ax" \ + "les bx, pxCurrentTCB" /* Save the stack pointer into the TCB. */ \ + "mov es:0x2[ bx ], ss" \ + "mov es:[ bx ], sp" \ + "call vTaskSwitchContext" /* Perform the switch. */ \ + "mov ax, seg pxCurrentTCB" /* Restore the stack pointer from the TCB. */ \ + "mov ds, ax" \ + "les bx, dword ptr pxCurrentTCB" \ + "mov ss, es:[ bx + 2 ]" \ + "mov sp, es:[ bx ]" + + + #pragma aux portFIRST_CONTEXT = "mov ax, seg pxCurrentTCB" \ + "mov ds, ax" \ + "les bx, dword ptr pxCurrentTCB" \ + "mov ss, es:[ bx + 2 ]" \ + "mov sp, es:[ bx ]" \ + "pop ax" \ + "pop ax" \ + "pop es" \ + "pop ds" \ + "popa" \ + "iret" +#endif + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/oWatcom/16BitDOS/common/portcomn.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/oWatcom/16BitDOS/common/portcomn.c new file mode 100644 index 0000000..e673b6a --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/oWatcom/16BitDOS/common/portcomn.c @@ -0,0 +1,183 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* +Changes from V1.00: + + + pxPortInitialiseStack() now initialises the stack of new tasks to the + same format used by the compiler. This allows the compiler generated + interrupt mechanism to be used for context switches. + +Changes from V2.4.2: + + + pvPortMalloc and vPortFree have been removed. The projects now use + the definitions from the source/portable/MemMang directory. + +Changes from V2.6.1: + + + usPortCheckFreeStackSpace() has been moved to tasks.c. +*/ + + + +#include +#include "FreeRTOS.h" + +/*-----------------------------------------------------------*/ + +/* See header file for description. */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +StackType_t DS_Reg = 0, *pxOriginalSP; + + /* Place a few bytes of known values on the bottom of the stack. + This is just useful for debugging. */ + + *pxTopOfStack = 0x1111; + pxTopOfStack--; + *pxTopOfStack = 0x2222; + pxTopOfStack--; + *pxTopOfStack = 0x3333; + pxTopOfStack--; + *pxTopOfStack = 0x4444; + pxTopOfStack--; + *pxTopOfStack = 0x5555; + pxTopOfStack--; + + + /*lint -e950 -e611 -e923 Lint doesn't like this much - but nothing I can do about it. */ + + /* We are going to start the scheduler using a return from interrupt + instruction to load the program counter, so first there would be the + status register and interrupt return address. We make this the start + of the task. */ + *pxTopOfStack = portINITIAL_SW; + pxTopOfStack--; + *pxTopOfStack = FP_SEG( pxCode ); + pxTopOfStack--; + *pxTopOfStack = FP_OFF( pxCode ); + pxTopOfStack--; + + /* We are going to setup the stack for the new task to look like + the stack frame was setup by a compiler generated ISR. We need to know + the address of the existing stack top to place in the SP register within + the stack frame. pxOriginalSP holds SP before (simulated) pusha was + called. */ + pxOriginalSP = pxTopOfStack; + + /* The remaining registers would be pushed on the stack by our context + switch function. These are loaded with values simply to make debugging + easier. */ + *pxTopOfStack = FP_OFF( pvParameters ); /* AX */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xCCCC; /* CX */ + pxTopOfStack--; + *pxTopOfStack = FP_SEG( pvParameters ); /* DX */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xBBBB; /* BX */ + pxTopOfStack--; + *pxTopOfStack = FP_OFF( pxOriginalSP ); /* SP */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xBBBB; /* BP */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x0123; /* SI */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xDDDD; /* DI */ + + /* We need the true data segment. */ + __asm{ MOV DS_Reg, DS }; + + pxTopOfStack--; + *pxTopOfStack = DS_Reg; /* DS */ + + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xEEEE; /* ES */ + + /* The AX register is pushed again twice - don't know why. */ + pxTopOfStack--; + *pxTopOfStack = FP_OFF( pvParameters ); /* AX */ + pxTopOfStack--; + *pxTopOfStack = FP_OFF( pvParameters ); /* AX */ + + + #ifdef DEBUG_BUILD + /* The compiler adds space to each ISR stack if building to + include debug information. Presumably this is used by the + debugger - we don't need to initialise it to anything just + make sure it is there. */ + pxTopOfStack--; + #endif + + /*lint +e950 +e611 +e923 */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/readme.txt b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/readme.txt new file mode 100644 index 0000000..b22b36b --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/portable/readme.txt @@ -0,0 +1,20 @@ +Each real time kernel port consists of three files that contain the core kernel +components and are common to every port, and one or more files that are +specific to a particular microcontroller and/or compiler. + + ++ The FreeRTOS/Source/Portable/MemMang directory contains the five sample +memory allocators as described on the http://www.FreeRTOS.org WEB site. + ++ The other directories each contain files specific to a particular +microcontroller or compiler, where the directory name denotes the compiler +specific files the directory contains. + + + +For example, if you are interested in the [compiler] port for the [architecture] +microcontroller, then the port specific files are contained in +FreeRTOS/Source/Portable/[compiler]/[architecture] directory. If this is the +only port you are interested in then all the other directories can be +ignored. + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/queue.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/queue.c new file mode 100644 index 0000000..9884658 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/queue.c @@ -0,0 +1,2566 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#include +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining +all the API functions to use the MPU wrappers. That should only be done when +task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" + +#if ( configUSE_CO_ROUTINES == 1 ) + #include "croutine.h" +#endif + +/* Lint e961 and e750 are suppressed as a MISRA exception justified because the +MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined for the +header files above, but not in this file, in order to generate the correct +privileged Vs unprivileged linkage and placement. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750. */ + + +/* Constants used with the cRxLock and cTxLock structure members. */ +#define queueUNLOCKED ( ( int8_t ) -1 ) +#define queueLOCKED_UNMODIFIED ( ( int8_t ) 0 ) + +/* When the Queue_t structure is used to represent a base queue its pcHead and +pcTail members are used as pointers into the queue storage area. When the +Queue_t structure is used to represent a mutex pcHead and pcTail pointers are +not necessary, and the pcHead pointer is set to NULL to indicate that the +pcTail pointer actually points to the mutex holder (if any). Map alternative +names to the pcHead and pcTail structure members to ensure the readability of +the code is maintained despite this dual use of two structure members. An +alternative implementation would be to use a union, but use of a union is +against the coding standard (although an exception to the standard has been +permitted where the dual use also significantly changes the type of the +structure member). */ +#define pxMutexHolder pcTail +#define uxQueueType pcHead +#define queueQUEUE_IS_MUTEX NULL + +/* Semaphores do not actually store or copy data, so have an item size of +zero. */ +#define queueSEMAPHORE_QUEUE_ITEM_LENGTH ( ( UBaseType_t ) 0 ) +#define queueMUTEX_GIVE_BLOCK_TIME ( ( TickType_t ) 0U ) + +#if( configUSE_PREEMPTION == 0 ) + /* If the cooperative scheduler is being used then a yield should not be + performed just because a higher priority task has been woken. */ + #define queueYIELD_IF_USING_PREEMPTION() +#else + #define queueYIELD_IF_USING_PREEMPTION() portYIELD_WITHIN_API() +#endif + +/* + * Definition of the queue used by the scheduler. + * Items are queued by copy, not reference. See the following link for the + * rationale: http://www.freertos.org/Embedded-RTOS-Queues.html + */ +typedef struct QueueDefinition +{ + int8_t *pcHead; /*< Points to the beginning of the queue storage area. */ + int8_t *pcTail; /*< Points to the byte at the end of the queue storage area. Once more byte is allocated than necessary to store the queue items, this is used as a marker. */ + int8_t *pcWriteTo; /*< Points to the free next place in the storage area. */ + + union /* Use of a union is an exception to the coding standard to ensure two mutually exclusive structure members don't appear simultaneously (wasting RAM). */ + { + int8_t *pcReadFrom; /*< Points to the last place that a queued item was read from when the structure is used as a queue. */ + UBaseType_t uxRecursiveCallCount;/*< Maintains a count of the number of times a recursive mutex has been recursively 'taken' when the structure is used as a mutex. */ + } u; + + List_t xTasksWaitingToSend; /*< List of tasks that are blocked waiting to post onto this queue. Stored in priority order. */ + List_t xTasksWaitingToReceive; /*< List of tasks that are blocked waiting to read from this queue. Stored in priority order. */ + + volatile UBaseType_t uxMessagesWaiting;/*< The number of items currently in the queue. */ + UBaseType_t uxLength; /*< The length of the queue defined as the number of items it will hold, not the number of bytes. */ + UBaseType_t uxItemSize; /*< The size of each items that the queue will hold. */ + + volatile int8_t cRxLock; /*< Stores the number of items received from the queue (removed from the queue) while the queue was locked. Set to queueUNLOCKED when the queue is not locked. */ + volatile int8_t cTxLock; /*< Stores the number of items transmitted to the queue (added to the queue) while the queue was locked. Set to queueUNLOCKED when the queue is not locked. */ + + #if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + uint8_t ucStaticallyAllocated; /*< Set to pdTRUE if the memory used by the queue was statically allocated to ensure no attempt is made to free the memory. */ + #endif + + #if ( configUSE_QUEUE_SETS == 1 ) + struct QueueDefinition *pxQueueSetContainer; + #endif + + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxQueueNumber; + uint8_t ucQueueType; + #endif + +} xQUEUE; + +/* The old xQUEUE name is maintained above then typedefed to the new Queue_t +name below to enable the use of older kernel aware debuggers. */ +typedef xQUEUE Queue_t; + +/*-----------------------------------------------------------*/ + +/* + * The queue registry is just a means for kernel aware debuggers to locate + * queue structures. It has no other purpose so is an optional component. + */ +#if ( configQUEUE_REGISTRY_SIZE > 0 ) + + /* The type stored within the queue registry array. This allows a name + to be assigned to each queue making kernel aware debugging a little + more user friendly. */ + typedef struct QUEUE_REGISTRY_ITEM + { + const char *pcQueueName; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + QueueHandle_t xHandle; + } xQueueRegistryItem; + + /* The old xQueueRegistryItem name is maintained above then typedefed to the + new xQueueRegistryItem name below to enable the use of older kernel aware + debuggers. */ + typedef xQueueRegistryItem QueueRegistryItem_t; + + /* The queue registry is simply an array of QueueRegistryItem_t structures. + The pcQueueName member of a structure being NULL is indicative of the + array position being vacant. */ + PRIVILEGED_DATA QueueRegistryItem_t xQueueRegistry[ configQUEUE_REGISTRY_SIZE ]; + +#endif /* configQUEUE_REGISTRY_SIZE */ + +/* + * Unlocks a queue locked by a call to prvLockQueue. Locking a queue does not + * prevent an ISR from adding or removing items to the queue, but does prevent + * an ISR from removing tasks from the queue event lists. If an ISR finds a + * queue is locked it will instead increment the appropriate queue lock count + * to indicate that a task may require unblocking. When the queue in unlocked + * these lock counts are inspected, and the appropriate action taken. + */ +static void prvUnlockQueue( Queue_t * const pxQueue ) PRIVILEGED_FUNCTION; + +/* + * Uses a critical section to determine if there is any data in a queue. + * + * @return pdTRUE if the queue contains no items, otherwise pdFALSE. + */ +static BaseType_t prvIsQueueEmpty( const Queue_t *pxQueue ) PRIVILEGED_FUNCTION; + +/* + * Uses a critical section to determine if there is any space in a queue. + * + * @return pdTRUE if there is no space, otherwise pdFALSE; + */ +static BaseType_t prvIsQueueFull( const Queue_t *pxQueue ) PRIVILEGED_FUNCTION; + +/* + * Copies an item into the queue, either at the front of the queue or the + * back of the queue. + */ +static BaseType_t prvCopyDataToQueue( Queue_t * const pxQueue, const void *pvItemToQueue, const BaseType_t xPosition ) PRIVILEGED_FUNCTION; + +/* + * Copies an item out of a queue. + */ +static void prvCopyDataFromQueue( Queue_t * const pxQueue, void * const pvBuffer ) PRIVILEGED_FUNCTION; + +#if ( configUSE_QUEUE_SETS == 1 ) + /* + * Checks to see if a queue is a member of a queue set, and if so, notifies + * the queue set that the queue contains data. + */ + static BaseType_t prvNotifyQueueSetContainer( const Queue_t * const pxQueue, const BaseType_t xCopyPosition ) PRIVILEGED_FUNCTION; +#endif + +/* + * Called after a Queue_t structure has been allocated either statically or + * dynamically to fill in the structure's members. + */ +static void prvInitialiseNewQueue( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, uint8_t *pucQueueStorage, const uint8_t ucQueueType, Queue_t *pxNewQueue ) PRIVILEGED_FUNCTION; + +/* + * Mutexes are a special type of queue. When a mutex is created, first the + * queue is created, then prvInitialiseMutex() is called to configure the queue + * as a mutex. + */ +#if( configUSE_MUTEXES == 1 ) + static void prvInitialiseMutex( Queue_t *pxNewQueue ) PRIVILEGED_FUNCTION; +#endif + +/*-----------------------------------------------------------*/ + +/* + * Macro to mark a queue as locked. Locking a queue prevents an ISR from + * accessing the queue event lists. + */ +#define prvLockQueue( pxQueue ) \ + taskENTER_CRITICAL(); \ + { \ + if( ( pxQueue )->cRxLock == queueUNLOCKED ) \ + { \ + ( pxQueue )->cRxLock = queueLOCKED_UNMODIFIED; \ + } \ + if( ( pxQueue )->cTxLock == queueUNLOCKED ) \ + { \ + ( pxQueue )->cTxLock = queueLOCKED_UNMODIFIED; \ + } \ + } \ + taskEXIT_CRITICAL() +/*-----------------------------------------------------------*/ + +BaseType_t xQueueGenericReset( QueueHandle_t xQueue, BaseType_t xNewQueue ) +{ +Queue_t * const pxQueue = ( Queue_t * ) xQueue; + + configASSERT( pxQueue ); + + taskENTER_CRITICAL(); + { + pxQueue->pcTail = pxQueue->pcHead + ( pxQueue->uxLength * pxQueue->uxItemSize ); + pxQueue->uxMessagesWaiting = ( UBaseType_t ) 0U; + pxQueue->pcWriteTo = pxQueue->pcHead; + pxQueue->u.pcReadFrom = pxQueue->pcHead + ( ( pxQueue->uxLength - ( UBaseType_t ) 1U ) * pxQueue->uxItemSize ); + pxQueue->cRxLock = queueUNLOCKED; + pxQueue->cTxLock = queueUNLOCKED; + + if( xNewQueue == pdFALSE ) + { + /* If there are tasks blocked waiting to read from the queue, then + the tasks will remain blocked as after this function exits the queue + will still be empty. If there are tasks blocked waiting to write to + the queue, then one should be unblocked as after this function exits + it will be possible to write to it. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* Ensure the event queues start in the correct state. */ + vListInitialise( &( pxQueue->xTasksWaitingToSend ) ); + vListInitialise( &( pxQueue->xTasksWaitingToReceive ) ); + } + } + taskEXIT_CRITICAL(); + + /* A value is returned for calling semantic consistency with previous + versions. */ + return pdPASS; +} +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + + QueueHandle_t xQueueGenericCreateStatic( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, uint8_t *pucQueueStorage, StaticQueue_t *pxStaticQueue, const uint8_t ucQueueType ) + { + Queue_t *pxNewQueue; + + configASSERT( uxQueueLength > ( UBaseType_t ) 0 ); + + /* The StaticQueue_t structure and the queue storage area must be + supplied. */ + configASSERT( pxStaticQueue != NULL ); + + /* A queue storage area should be provided if the item size is not 0, and + should not be provided if the item size is 0. */ + configASSERT( !( ( pucQueueStorage != NULL ) && ( uxItemSize == 0 ) ) ); + configASSERT( !( ( pucQueueStorage == NULL ) && ( uxItemSize != 0 ) ) ); + + #if( configASSERT_DEFINED == 1 ) + { + /* Sanity check that the size of the structure used to declare a + variable of type StaticQueue_t or StaticSemaphore_t equals the size of + the real queue and semaphore structures. */ + volatile size_t xSize = sizeof( StaticQueue_t ); + configASSERT( xSize == sizeof( Queue_t ) ); + } + #endif /* configASSERT_DEFINED */ + + /* The address of a statically allocated queue was passed in, use it. + The address of a statically allocated storage area was also passed in + but is already set. */ + pxNewQueue = ( Queue_t * ) pxStaticQueue; /*lint !e740 Unusual cast is ok as the structures are designed to have the same alignment, and the size is checked by an assert. */ + + if( pxNewQueue != NULL ) + { + #if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + { + /* Queues can be allocated wither statically or dynamically, so + note this queue was allocated statically in case the queue is + later deleted. */ + pxNewQueue->ucStaticallyAllocated = pdTRUE; + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ + + prvInitialiseNewQueue( uxQueueLength, uxItemSize, pucQueueStorage, ucQueueType, pxNewQueue ); + } + + return pxNewQueue; + } + +#endif /* configSUPPORT_STATIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + + QueueHandle_t xQueueGenericCreate( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, const uint8_t ucQueueType ) + { + Queue_t *pxNewQueue; + size_t xQueueSizeInBytes; + uint8_t *pucQueueStorage; + + configASSERT( uxQueueLength > ( UBaseType_t ) 0 ); + + if( uxItemSize == ( UBaseType_t ) 0 ) + { + /* There is not going to be a queue storage area. */ + xQueueSizeInBytes = ( size_t ) 0; + } + else + { + /* Allocate enough space to hold the maximum number of items that + can be in the queue at any time. */ + xQueueSizeInBytes = ( size_t ) ( uxQueueLength * uxItemSize ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + } + + pxNewQueue = ( Queue_t * ) pvPortMalloc( sizeof( Queue_t ) + xQueueSizeInBytes ); + + if( pxNewQueue != NULL ) + { + /* Jump past the queue structure to find the location of the queue + storage area. */ + pucQueueStorage = ( ( uint8_t * ) pxNewQueue ) + sizeof( Queue_t ); + + #if( configSUPPORT_STATIC_ALLOCATION == 1 ) + { + /* Queues can be created either statically or dynamically, so + note this task was created dynamically in case it is later + deleted. */ + pxNewQueue->ucStaticallyAllocated = pdFALSE; + } + #endif /* configSUPPORT_STATIC_ALLOCATION */ + + prvInitialiseNewQueue( uxQueueLength, uxItemSize, pucQueueStorage, ucQueueType, pxNewQueue ); + } + + return pxNewQueue; + } + +#endif /* configSUPPORT_STATIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +static void prvInitialiseNewQueue( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, uint8_t *pucQueueStorage, const uint8_t ucQueueType, Queue_t *pxNewQueue ) +{ + /* Remove compiler warnings about unused parameters should + configUSE_TRACE_FACILITY not be set to 1. */ + ( void ) ucQueueType; + + if( uxItemSize == ( UBaseType_t ) 0 ) + { + /* No RAM was allocated for the queue storage area, but PC head cannot + be set to NULL because NULL is used as a key to say the queue is used as + a mutex. Therefore just set pcHead to point to the queue as a benign + value that is known to be within the memory map. */ + pxNewQueue->pcHead = ( int8_t * ) pxNewQueue; + } + else + { + /* Set the head to the start of the queue storage area. */ + pxNewQueue->pcHead = ( int8_t * ) pucQueueStorage; + } + + /* Initialise the queue members as described where the queue type is + defined. */ + pxNewQueue->uxLength = uxQueueLength; + pxNewQueue->uxItemSize = uxItemSize; + ( void ) xQueueGenericReset( pxNewQueue, pdTRUE ); + + #if ( configUSE_TRACE_FACILITY == 1 ) + { + pxNewQueue->ucQueueType = ucQueueType; + } + #endif /* configUSE_TRACE_FACILITY */ + + #if( configUSE_QUEUE_SETS == 1 ) + { + pxNewQueue->pxQueueSetContainer = NULL; + } + #endif /* configUSE_QUEUE_SETS */ + + traceQUEUE_CREATE( pxNewQueue ); +} +/*-----------------------------------------------------------*/ + +#if( configUSE_MUTEXES == 1 ) + + static void prvInitialiseMutex( Queue_t *pxNewQueue ) + { + if( pxNewQueue != NULL ) + { + /* The queue create function will set all the queue structure members + correctly for a generic queue, but this function is creating a + mutex. Overwrite those members that need to be set differently - + in particular the information required for priority inheritance. */ + pxNewQueue->pxMutexHolder = NULL; + pxNewQueue->uxQueueType = queueQUEUE_IS_MUTEX; + + /* In case this is a recursive mutex. */ + pxNewQueue->u.uxRecursiveCallCount = 0; + + traceCREATE_MUTEX( pxNewQueue ); + + /* Start with the semaphore in the expected state. */ + ( void ) xQueueGenericSend( pxNewQueue, NULL, ( TickType_t ) 0U, queueSEND_TO_BACK ); + } + else + { + traceCREATE_MUTEX_FAILED(); + } + } + +#endif /* configUSE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if( ( configUSE_MUTEXES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + + QueueHandle_t xQueueCreateMutex( const uint8_t ucQueueType ) + { + Queue_t *pxNewQueue; + const UBaseType_t uxMutexLength = ( UBaseType_t ) 1, uxMutexSize = ( UBaseType_t ) 0; + + pxNewQueue = ( Queue_t * ) xQueueGenericCreate( uxMutexLength, uxMutexSize, ucQueueType ); + prvInitialiseMutex( pxNewQueue ); + + return pxNewQueue; + } + +#endif /* configUSE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if( ( configUSE_MUTEXES == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + + QueueHandle_t xQueueCreateMutexStatic( const uint8_t ucQueueType, StaticQueue_t *pxStaticQueue ) + { + Queue_t *pxNewQueue; + const UBaseType_t uxMutexLength = ( UBaseType_t ) 1, uxMutexSize = ( UBaseType_t ) 0; + + /* Prevent compiler warnings about unused parameters if + configUSE_TRACE_FACILITY does not equal 1. */ + ( void ) ucQueueType; + + pxNewQueue = ( Queue_t * ) xQueueGenericCreateStatic( uxMutexLength, uxMutexSize, NULL, pxStaticQueue, ucQueueType ); + prvInitialiseMutex( pxNewQueue ); + + return pxNewQueue; + } + +#endif /* configUSE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) ) + + void* xQueueGetMutexHolder( QueueHandle_t xSemaphore ) + { + void *pxReturn; + + /* This function is called by xSemaphoreGetMutexHolder(), and should not + be called directly. Note: This is a good way of determining if the + calling task is the mutex holder, but not a good way of determining the + identity of the mutex holder, as the holder may change between the + following critical section exiting and the function returning. */ + taskENTER_CRITICAL(); + { + if( ( ( Queue_t * ) xSemaphore )->uxQueueType == queueQUEUE_IS_MUTEX ) + { + pxReturn = ( void * ) ( ( Queue_t * ) xSemaphore )->pxMutexHolder; + } + else + { + pxReturn = NULL; + } + } + taskEXIT_CRITICAL(); + + return pxReturn; + } /*lint !e818 xSemaphore cannot be a pointer to const because it is a typedef. */ + +#endif +/*-----------------------------------------------------------*/ + +#if ( configUSE_RECURSIVE_MUTEXES == 1 ) + + BaseType_t xQueueGiveMutexRecursive( QueueHandle_t xMutex ) + { + BaseType_t xReturn; + Queue_t * const pxMutex = ( Queue_t * ) xMutex; + + configASSERT( pxMutex ); + + /* If this is the task that holds the mutex then pxMutexHolder will not + change outside of this task. If this task does not hold the mutex then + pxMutexHolder can never coincidentally equal the tasks handle, and as + this is the only condition we are interested in it does not matter if + pxMutexHolder is accessed simultaneously by another task. Therefore no + mutual exclusion is required to test the pxMutexHolder variable. */ + if( pxMutex->pxMutexHolder == ( void * ) xTaskGetCurrentTaskHandle() ) /*lint !e961 Not a redundant cast as TaskHandle_t is a typedef. */ + { + traceGIVE_MUTEX_RECURSIVE( pxMutex ); + + /* uxRecursiveCallCount cannot be zero if pxMutexHolder is equal to + the task handle, therefore no underflow check is required. Also, + uxRecursiveCallCount is only modified by the mutex holder, and as + there can only be one, no mutual exclusion is required to modify the + uxRecursiveCallCount member. */ + ( pxMutex->u.uxRecursiveCallCount )--; + + /* Has the recursive call count unwound to 0? */ + if( pxMutex->u.uxRecursiveCallCount == ( UBaseType_t ) 0 ) + { + /* Return the mutex. This will automatically unblock any other + task that might be waiting to access the mutex. */ + ( void ) xQueueGenericSend( pxMutex, NULL, queueMUTEX_GIVE_BLOCK_TIME, queueSEND_TO_BACK ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xReturn = pdPASS; + } + else + { + /* The mutex cannot be given because the calling task is not the + holder. */ + xReturn = pdFAIL; + + traceGIVE_MUTEX_RECURSIVE_FAILED( pxMutex ); + } + + return xReturn; + } + +#endif /* configUSE_RECURSIVE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_RECURSIVE_MUTEXES == 1 ) + + BaseType_t xQueueTakeMutexRecursive( QueueHandle_t xMutex, TickType_t xTicksToWait ) + { + BaseType_t xReturn; + Queue_t * const pxMutex = ( Queue_t * ) xMutex; + + configASSERT( pxMutex ); + + /* Comments regarding mutual exclusion as per those within + xQueueGiveMutexRecursive(). */ + + traceTAKE_MUTEX_RECURSIVE( pxMutex ); + + if( pxMutex->pxMutexHolder == ( void * ) xTaskGetCurrentTaskHandle() ) /*lint !e961 Cast is not redundant as TaskHandle_t is a typedef. */ + { + ( pxMutex->u.uxRecursiveCallCount )++; + xReturn = pdPASS; + } + else + { + xReturn = xQueueGenericReceive( pxMutex, NULL, xTicksToWait, pdFALSE ); + + /* pdPASS will only be returned if the mutex was successfully + obtained. The calling task may have entered the Blocked state + before reaching here. */ + if( xReturn != pdFAIL ) + { + ( pxMutex->u.uxRecursiveCallCount )++; + } + else + { + traceTAKE_MUTEX_RECURSIVE_FAILED( pxMutex ); + } + } + + return xReturn; + } + +#endif /* configUSE_RECURSIVE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + + QueueHandle_t xQueueCreateCountingSemaphoreStatic( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount, StaticQueue_t *pxStaticQueue ) + { + QueueHandle_t xHandle; + + configASSERT( uxMaxCount != 0 ); + configASSERT( uxInitialCount <= uxMaxCount ); + + xHandle = xQueueGenericCreateStatic( uxMaxCount, queueSEMAPHORE_QUEUE_ITEM_LENGTH, NULL, pxStaticQueue, queueQUEUE_TYPE_COUNTING_SEMAPHORE ); + + if( xHandle != NULL ) + { + ( ( Queue_t * ) xHandle )->uxMessagesWaiting = uxInitialCount; + + traceCREATE_COUNTING_SEMAPHORE(); + } + else + { + traceCREATE_COUNTING_SEMAPHORE_FAILED(); + } + + return xHandle; + } + +#endif /* ( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) */ +/*-----------------------------------------------------------*/ + +#if( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + + QueueHandle_t xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount ) + { + QueueHandle_t xHandle; + + configASSERT( uxMaxCount != 0 ); + configASSERT( uxInitialCount <= uxMaxCount ); + + xHandle = xQueueGenericCreate( uxMaxCount, queueSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_COUNTING_SEMAPHORE ); + + if( xHandle != NULL ) + { + ( ( Queue_t * ) xHandle )->uxMessagesWaiting = uxInitialCount; + + traceCREATE_COUNTING_SEMAPHORE(); + } + else + { + traceCREATE_COUNTING_SEMAPHORE_FAILED(); + } + + return xHandle; + } + +#endif /* ( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) */ +/*-----------------------------------------------------------*/ + +BaseType_t xQueueGenericSend( QueueHandle_t xQueue, const void * const pvItemToQueue, TickType_t xTicksToWait, const BaseType_t xCopyPosition ) +{ +BaseType_t xEntryTimeSet = pdFALSE, xYieldRequired; +TimeOut_t xTimeOut; +Queue_t * const pxQueue = ( Queue_t * ) xQueue; + + configASSERT( pxQueue ); + configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) ); + configASSERT( !( ( xCopyPosition == queueOVERWRITE ) && ( pxQueue->uxLength != 1 ) ) ); + #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + { + configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); + } + #endif + + + /* This function relaxes the coding standard somewhat to allow return + statements within the function itself. This is done in the interest + of execution time efficiency. */ + for( ;; ) + { + taskENTER_CRITICAL(); + { + /* Is there room on the queue now? The running task must be the + highest priority task wanting to access the queue. If the head item + in the queue is to be overwritten then it does not matter if the + queue is full. */ + if( ( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) || ( xCopyPosition == queueOVERWRITE ) ) + { + traceQUEUE_SEND( pxQueue ); + xYieldRequired = prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition ); + + #if ( configUSE_QUEUE_SETS == 1 ) + { + if( pxQueue->pxQueueSetContainer != NULL ) + { + if( prvNotifyQueueSetContainer( pxQueue, xCopyPosition ) != pdFALSE ) + { + /* The queue is a member of a queue set, and posting + to the queue set caused a higher priority task to + unblock. A context switch is required. */ + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* If there was a task waiting for data to arrive on the + queue then unblock it now. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The unblocked task has a priority higher than + our own so yield immediately. Yes it is ok to + do this from within the critical section - the + kernel takes care of that. */ + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else if( xYieldRequired != pdFALSE ) + { + /* This path is a special case that will only get + executed if the task was holding multiple mutexes + and the mutexes were given back in an order that is + different to that in which they were taken. */ + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + #else /* configUSE_QUEUE_SETS */ + { + /* If there was a task waiting for data to arrive on the + queue then unblock it now. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The unblocked task has a priority higher than + our own so yield immediately. Yes it is ok to do + this from within the critical section - the kernel + takes care of that. */ + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else if( xYieldRequired != pdFALSE ) + { + /* This path is a special case that will only get + executed if the task was holding multiple mutexes and + the mutexes were given back in an order that is + different to that in which they were taken. */ + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_QUEUE_SETS */ + + taskEXIT_CRITICAL(); + return pdPASS; + } + else + { + if( xTicksToWait == ( TickType_t ) 0 ) + { + /* The queue was full and no block time is specified (or + the block time has expired) so leave now. */ + taskEXIT_CRITICAL(); + + /* Return to the original privilege level before exiting + the function. */ + traceQUEUE_SEND_FAILED( pxQueue ); + return errQUEUE_FULL; + } + else if( xEntryTimeSet == pdFALSE ) + { + /* The queue was full and a block time was specified so + configure the timeout structure. */ + vTaskSetTimeOutState( &xTimeOut ); + xEntryTimeSet = pdTRUE; + } + else + { + /* Entry time was already set. */ + mtCOVERAGE_TEST_MARKER(); + } + } + } + taskEXIT_CRITICAL(); + + /* Interrupts and other tasks can send to and receive from the queue + now the critical section has been exited. */ + + vTaskSuspendAll(); + prvLockQueue( pxQueue ); + + /* Update the timeout state to see if it has expired yet. */ + if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ) + { + if( prvIsQueueFull( pxQueue ) != pdFALSE ) + { + traceBLOCKING_ON_QUEUE_SEND( pxQueue ); + vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToSend ), xTicksToWait ); + + /* Unlocking the queue means queue events can effect the + event list. It is possible that interrupts occurring now + remove this task from the event list again - but as the + scheduler is suspended the task will go onto the pending + ready last instead of the actual ready list. */ + prvUnlockQueue( pxQueue ); + + /* Resuming the scheduler will move tasks from the pending + ready list into the ready list - so it is feasible that this + task is already in a ready list before it yields - in which + case the yield will not cause a context switch unless there + is also a higher priority task in the pending ready list. */ + if( xTaskResumeAll() == pdFALSE ) + { + portYIELD_WITHIN_API(); + } + } + else + { + /* Try again. */ + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + } + } + else + { + /* The timeout has expired. */ + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + + traceQUEUE_SEND_FAILED( pxQueue ); + return errQUEUE_FULL; + } + } +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueueGenericSendFromISR( QueueHandle_t xQueue, const void * const pvItemToQueue, BaseType_t * const pxHigherPriorityTaskWoken, const BaseType_t xCopyPosition ) +{ +BaseType_t xReturn; +UBaseType_t uxSavedInterruptStatus; +Queue_t * const pxQueue = ( Queue_t * ) xQueue; + + configASSERT( pxQueue ); + configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) ); + configASSERT( !( ( xCopyPosition == queueOVERWRITE ) && ( pxQueue->uxLength != 1 ) ) ); + + /* RTOS ports that support interrupt nesting have the concept of a maximum + system call (or maximum API call) interrupt priority. Interrupts that are + above the maximum system call priority are kept permanently enabled, even + when the RTOS kernel is in a critical section, but cannot make any calls to + FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h + then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + failure if a FreeRTOS API function is called from an interrupt that has been + assigned a priority above the configured maximum system call priority. + Only FreeRTOS functions that end in FromISR can be called from interrupts + that have been assigned a priority at or (logically) below the maximum + system call interrupt priority. FreeRTOS maintains a separate interrupt + safe API to ensure interrupt entry is as fast and as simple as possible. + More information (albeit Cortex-M specific) is provided on the following + link: http://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + /* Similar to xQueueGenericSend, except without blocking if there is no room + in the queue. Also don't directly wake a task that was blocked on a queue + read, instead return a flag to say whether a context switch is required or + not (i.e. has a task with a higher priority than us been woken by this + post). */ + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + if( ( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) || ( xCopyPosition == queueOVERWRITE ) ) + { + const int8_t cTxLock = pxQueue->cTxLock; + + traceQUEUE_SEND_FROM_ISR( pxQueue ); + + /* Semaphores use xQueueGiveFromISR(), so pxQueue will not be a + semaphore or mutex. That means prvCopyDataToQueue() cannot result + in a task disinheriting a priority and prvCopyDataToQueue() can be + called here even though the disinherit function does not check if + the scheduler is suspended before accessing the ready lists. */ + ( void ) prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition ); + + /* The event list is not altered if the queue is locked. This will + be done when the queue is unlocked later. */ + if( cTxLock == queueUNLOCKED ) + { + #if ( configUSE_QUEUE_SETS == 1 ) + { + if( pxQueue->pxQueueSetContainer != NULL ) + { + if( prvNotifyQueueSetContainer( pxQueue, xCopyPosition ) != pdFALSE ) + { + /* The queue is a member of a queue set, and posting + to the queue set caused a higher priority task to + unblock. A context switch is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so + record that a context switch is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + #else /* configUSE_QUEUE_SETS */ + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so record that a + context switch is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_QUEUE_SETS */ + } + else + { + /* Increment the lock count so the task that unlocks the queue + knows that data was posted while it was locked. */ + pxQueue->cTxLock = ( int8_t ) ( cTxLock + 1 ); + } + + xReturn = pdPASS; + } + else + { + traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue ); + xReturn = errQUEUE_FULL; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueueGiveFromISR( QueueHandle_t xQueue, BaseType_t * const pxHigherPriorityTaskWoken ) +{ +BaseType_t xReturn; +UBaseType_t uxSavedInterruptStatus; +Queue_t * const pxQueue = ( Queue_t * ) xQueue; + + /* Similar to xQueueGenericSendFromISR() but used with semaphores where the + item size is 0. Don't directly wake a task that was blocked on a queue + read, instead return a flag to say whether a context switch is required or + not (i.e. has a task with a higher priority than us been woken by this + post). */ + + configASSERT( pxQueue ); + + /* xQueueGenericSendFromISR() should be used instead of xQueueGiveFromISR() + if the item size is not 0. */ + configASSERT( pxQueue->uxItemSize == 0 ); + + /* Normally a mutex would not be given from an interrupt, especially if + there is a mutex holder, as priority inheritance makes no sense for an + interrupts, only tasks. */ + configASSERT( !( ( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) && ( pxQueue->pxMutexHolder != NULL ) ) ); + + /* RTOS ports that support interrupt nesting have the concept of a maximum + system call (or maximum API call) interrupt priority. Interrupts that are + above the maximum system call priority are kept permanently enabled, even + when the RTOS kernel is in a critical section, but cannot make any calls to + FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h + then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + failure if a FreeRTOS API function is called from an interrupt that has been + assigned a priority above the configured maximum system call priority. + Only FreeRTOS functions that end in FromISR can be called from interrupts + that have been assigned a priority at or (logically) below the maximum + system call interrupt priority. FreeRTOS maintains a separate interrupt + safe API to ensure interrupt entry is as fast and as simple as possible. + More information (albeit Cortex-M specific) is provided on the following + link: http://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + const UBaseType_t uxMessagesWaiting = pxQueue->uxMessagesWaiting; + + /* When the queue is used to implement a semaphore no data is ever + moved through the queue but it is still valid to see if the queue 'has + space'. */ + if( uxMessagesWaiting < pxQueue->uxLength ) + { + const int8_t cTxLock = pxQueue->cTxLock; + + traceQUEUE_SEND_FROM_ISR( pxQueue ); + + /* A task can only have an inherited priority if it is a mutex + holder - and if there is a mutex holder then the mutex cannot be + given from an ISR. As this is the ISR version of the function it + can be assumed there is no mutex holder and no need to determine if + priority disinheritance is needed. Simply increase the count of + messages (semaphores) available. */ + pxQueue->uxMessagesWaiting = uxMessagesWaiting + 1; + + /* The event list is not altered if the queue is locked. This will + be done when the queue is unlocked later. */ + if( cTxLock == queueUNLOCKED ) + { + #if ( configUSE_QUEUE_SETS == 1 ) + { + if( pxQueue->pxQueueSetContainer != NULL ) + { + if( prvNotifyQueueSetContainer( pxQueue, queueSEND_TO_BACK ) != pdFALSE ) + { + /* The semaphore is a member of a queue set, and + posting to the queue set caused a higher priority + task to unblock. A context switch is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so + record that a context switch is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + #else /* configUSE_QUEUE_SETS */ + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so record that a + context switch is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_QUEUE_SETS */ + } + else + { + /* Increment the lock count so the task that unlocks the queue + knows that data was posted while it was locked. */ + pxQueue->cTxLock = ( int8_t ) ( cTxLock + 1 ); + } + + xReturn = pdPASS; + } + else + { + traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue ); + xReturn = errQUEUE_FULL; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueueGenericReceive( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait, const BaseType_t xJustPeeking ) +{ +BaseType_t xEntryTimeSet = pdFALSE; +TimeOut_t xTimeOut; +int8_t *pcOriginalReadPosition; +Queue_t * const pxQueue = ( Queue_t * ) xQueue; + + configASSERT( pxQueue ); + configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) ); + #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + { + configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); + } + #endif + + /* This function relaxes the coding standard somewhat to allow return + statements within the function itself. This is done in the interest + of execution time efficiency. */ + + for( ;; ) + { + taskENTER_CRITICAL(); + { + const UBaseType_t uxMessagesWaiting = pxQueue->uxMessagesWaiting; + + /* Is there data in the queue now? To be running the calling task + must be the highest priority task wanting to access the queue. */ + if( uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + /* Remember the read position in case the queue is only being + peeked. */ + pcOriginalReadPosition = pxQueue->u.pcReadFrom; + + prvCopyDataFromQueue( pxQueue, pvBuffer ); + + if( xJustPeeking == pdFALSE ) + { + traceQUEUE_RECEIVE( pxQueue ); + + /* Actually removing data, not just peeking. */ + pxQueue->uxMessagesWaiting = uxMessagesWaiting - 1; + + #if ( configUSE_MUTEXES == 1 ) + { + if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) + { + /* Record the information required to implement + priority inheritance should it become necessary. */ + pxQueue->pxMutexHolder = ( int8_t * ) pvTaskIncrementMutexHeldCount(); /*lint !e961 Cast is not redundant as TaskHandle_t is a typedef. */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_MUTEXES */ + + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + traceQUEUE_PEEK( pxQueue ); + + /* The data is not being removed, so reset the read + pointer. */ + pxQueue->u.pcReadFrom = pcOriginalReadPosition; + + /* The data is being left in the queue, so see if there are + any other tasks waiting for the data. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority than this task. */ + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + taskEXIT_CRITICAL(); + return pdPASS; + } + else + { + if( xTicksToWait == ( TickType_t ) 0 ) + { + /* The queue was empty and no block time is specified (or + the block time has expired) so leave now. */ + taskEXIT_CRITICAL(); + traceQUEUE_RECEIVE_FAILED( pxQueue ); + return errQUEUE_EMPTY; + } + else if( xEntryTimeSet == pdFALSE ) + { + /* The queue was empty and a block time was specified so + configure the timeout structure. */ + vTaskSetTimeOutState( &xTimeOut ); + xEntryTimeSet = pdTRUE; + } + else + { + /* Entry time was already set. */ + mtCOVERAGE_TEST_MARKER(); + } + } + } + taskEXIT_CRITICAL(); + + /* Interrupts and other tasks can send to and receive from the queue + now the critical section has been exited. */ + + vTaskSuspendAll(); + prvLockQueue( pxQueue ); + + /* Update the timeout state to see if it has expired yet. */ + if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ) + { + if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) + { + traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue ); + + #if ( configUSE_MUTEXES == 1 ) + { + if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) + { + taskENTER_CRITICAL(); + { + vTaskPriorityInherit( ( void * ) pxQueue->pxMutexHolder ); + } + taskEXIT_CRITICAL(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif + + vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait ); + prvUnlockQueue( pxQueue ); + if( xTaskResumeAll() == pdFALSE ) + { + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* Try again. */ + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + } + } + else + { + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + + if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) + { + traceQUEUE_RECEIVE_FAILED( pxQueue ); + return errQUEUE_EMPTY; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueueReceiveFromISR( QueueHandle_t xQueue, void * const pvBuffer, BaseType_t * const pxHigherPriorityTaskWoken ) +{ +BaseType_t xReturn; +UBaseType_t uxSavedInterruptStatus; +Queue_t * const pxQueue = ( Queue_t * ) xQueue; + + configASSERT( pxQueue ); + configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) ); + + /* RTOS ports that support interrupt nesting have the concept of a maximum + system call (or maximum API call) interrupt priority. Interrupts that are + above the maximum system call priority are kept permanently enabled, even + when the RTOS kernel is in a critical section, but cannot make any calls to + FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h + then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + failure if a FreeRTOS API function is called from an interrupt that has been + assigned a priority above the configured maximum system call priority. + Only FreeRTOS functions that end in FromISR can be called from interrupts + that have been assigned a priority at or (logically) below the maximum + system call interrupt priority. FreeRTOS maintains a separate interrupt + safe API to ensure interrupt entry is as fast and as simple as possible. + More information (albeit Cortex-M specific) is provided on the following + link: http://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + const UBaseType_t uxMessagesWaiting = pxQueue->uxMessagesWaiting; + + /* Cannot block in an ISR, so check there is data available. */ + if( uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + const int8_t cRxLock = pxQueue->cRxLock; + + traceQUEUE_RECEIVE_FROM_ISR( pxQueue ); + + prvCopyDataFromQueue( pxQueue, pvBuffer ); + pxQueue->uxMessagesWaiting = uxMessagesWaiting - 1; + + /* If the queue is locked the event list will not be modified. + Instead update the lock count so the task that unlocks the queue + will know that an ISR has removed data while the queue was + locked. */ + if( cRxLock == queueUNLOCKED ) + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + /* The task waiting has a higher priority than us so + force a context switch. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* Increment the lock count so the task that unlocks the queue + knows that data was removed while it was locked. */ + pxQueue->cRxLock = ( int8_t ) ( cRxLock + 1 ); + } + + xReturn = pdPASS; + } + else + { + xReturn = pdFAIL; + traceQUEUE_RECEIVE_FROM_ISR_FAILED( pxQueue ); + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueuePeekFromISR( QueueHandle_t xQueue, void * const pvBuffer ) +{ +BaseType_t xReturn; +UBaseType_t uxSavedInterruptStatus; +int8_t *pcOriginalReadPosition; +Queue_t * const pxQueue = ( Queue_t * ) xQueue; + + configASSERT( pxQueue ); + configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) ); + configASSERT( pxQueue->uxItemSize != 0 ); /* Can't peek a semaphore. */ + + /* RTOS ports that support interrupt nesting have the concept of a maximum + system call (or maximum API call) interrupt priority. Interrupts that are + above the maximum system call priority are kept permanently enabled, even + when the RTOS kernel is in a critical section, but cannot make any calls to + FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h + then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + failure if a FreeRTOS API function is called from an interrupt that has been + assigned a priority above the configured maximum system call priority. + Only FreeRTOS functions that end in FromISR can be called from interrupts + that have been assigned a priority at or (logically) below the maximum + system call interrupt priority. FreeRTOS maintains a separate interrupt + safe API to ensure interrupt entry is as fast and as simple as possible. + More information (albeit Cortex-M specific) is provided on the following + link: http://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Cannot block in an ISR, so check there is data available. */ + if( pxQueue->uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + traceQUEUE_PEEK_FROM_ISR( pxQueue ); + + /* Remember the read position so it can be reset as nothing is + actually being removed from the queue. */ + pcOriginalReadPosition = pxQueue->u.pcReadFrom; + prvCopyDataFromQueue( pxQueue, pvBuffer ); + pxQueue->u.pcReadFrom = pcOriginalReadPosition; + + xReturn = pdPASS; + } + else + { + xReturn = pdFAIL; + traceQUEUE_PEEK_FROM_ISR_FAILED( pxQueue ); + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +UBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue ) +{ +UBaseType_t uxReturn; + + configASSERT( xQueue ); + + taskENTER_CRITICAL(); + { + uxReturn = ( ( Queue_t * ) xQueue )->uxMessagesWaiting; + } + taskEXIT_CRITICAL(); + + return uxReturn; +} /*lint !e818 Pointer cannot be declared const as xQueue is a typedef not pointer. */ +/*-----------------------------------------------------------*/ + +UBaseType_t uxQueueSpacesAvailable( const QueueHandle_t xQueue ) +{ +UBaseType_t uxReturn; +Queue_t *pxQueue; + + pxQueue = ( Queue_t * ) xQueue; + configASSERT( pxQueue ); + + taskENTER_CRITICAL(); + { + uxReturn = pxQueue->uxLength - pxQueue->uxMessagesWaiting; + } + taskEXIT_CRITICAL(); + + return uxReturn; +} /*lint !e818 Pointer cannot be declared const as xQueue is a typedef not pointer. */ +/*-----------------------------------------------------------*/ + +UBaseType_t uxQueueMessagesWaitingFromISR( const QueueHandle_t xQueue ) +{ +UBaseType_t uxReturn; + + configASSERT( xQueue ); + + uxReturn = ( ( Queue_t * ) xQueue )->uxMessagesWaiting; + + return uxReturn; +} /*lint !e818 Pointer cannot be declared const as xQueue is a typedef not pointer. */ +/*-----------------------------------------------------------*/ + +void vQueueDelete( QueueHandle_t xQueue ) +{ +Queue_t * const pxQueue = ( Queue_t * ) xQueue; + + configASSERT( pxQueue ); + traceQUEUE_DELETE( pxQueue ); + + #if ( configQUEUE_REGISTRY_SIZE > 0 ) + { + vQueueUnregisterQueue( pxQueue ); + } + #endif + + #if( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 0 ) ) + { + /* The queue can only have been allocated dynamically - free it + again. */ + vPortFree( pxQueue ); + } + #elif( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + { + /* The queue could have been allocated statically or dynamically, so + check before attempting to free the memory. */ + if( pxQueue->ucStaticallyAllocated == ( uint8_t ) pdFALSE ) + { + vPortFree( pxQueue ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #else + { + /* The queue must have been statically allocated, so is not going to be + deleted. Avoid compiler warnings about the unused parameter. */ + ( void ) pxQueue; + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + UBaseType_t uxQueueGetQueueNumber( QueueHandle_t xQueue ) + { + return ( ( Queue_t * ) xQueue )->uxQueueNumber; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + void vQueueSetQueueNumber( QueueHandle_t xQueue, UBaseType_t uxQueueNumber ) + { + ( ( Queue_t * ) xQueue )->uxQueueNumber = uxQueueNumber; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + uint8_t ucQueueGetQueueType( QueueHandle_t xQueue ) + { + return ( ( Queue_t * ) xQueue )->ucQueueType; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +static BaseType_t prvCopyDataToQueue( Queue_t * const pxQueue, const void *pvItemToQueue, const BaseType_t xPosition ) +{ +BaseType_t xReturn = pdFALSE; +UBaseType_t uxMessagesWaiting; + + /* This function is called from a critical section. */ + + uxMessagesWaiting = pxQueue->uxMessagesWaiting; + + if( pxQueue->uxItemSize == ( UBaseType_t ) 0 ) + { + #if ( configUSE_MUTEXES == 1 ) + { + if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) + { + /* The mutex is no longer being held. */ + xReturn = xTaskPriorityDisinherit( ( void * ) pxQueue->pxMutexHolder ); + pxQueue->pxMutexHolder = NULL; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_MUTEXES */ + } + else if( xPosition == queueSEND_TO_BACK ) + { + ( void ) memcpy( ( void * ) pxQueue->pcWriteTo, pvItemToQueue, ( size_t ) pxQueue->uxItemSize ); /*lint !e961 !e418 MISRA exception as the casts are only redundant for some ports, plus previous logic ensures a null pointer can only be passed to memcpy() if the copy size is 0. */ + pxQueue->pcWriteTo += pxQueue->uxItemSize; + if( pxQueue->pcWriteTo >= pxQueue->pcTail ) /*lint !e946 MISRA exception justified as comparison of pointers is the cleanest solution. */ + { + pxQueue->pcWriteTo = pxQueue->pcHead; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + ( void ) memcpy( ( void * ) pxQueue->u.pcReadFrom, pvItemToQueue, ( size_t ) pxQueue->uxItemSize ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + pxQueue->u.pcReadFrom -= pxQueue->uxItemSize; + if( pxQueue->u.pcReadFrom < pxQueue->pcHead ) /*lint !e946 MISRA exception justified as comparison of pointers is the cleanest solution. */ + { + pxQueue->u.pcReadFrom = ( pxQueue->pcTail - pxQueue->uxItemSize ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( xPosition == queueOVERWRITE ) + { + if( uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + /* An item is not being added but overwritten, so subtract + one from the recorded number of items in the queue so when + one is added again below the number of recorded items remains + correct. */ + --uxMessagesWaiting; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + pxQueue->uxMessagesWaiting = uxMessagesWaiting + 1; + + return xReturn; +} +/*-----------------------------------------------------------*/ + +static void prvCopyDataFromQueue( Queue_t * const pxQueue, void * const pvBuffer ) +{ + if( pxQueue->uxItemSize != ( UBaseType_t ) 0 ) + { + pxQueue->u.pcReadFrom += pxQueue->uxItemSize; + if( pxQueue->u.pcReadFrom >= pxQueue->pcTail ) /*lint !e946 MISRA exception justified as use of the relational operator is the cleanest solutions. */ + { + pxQueue->u.pcReadFrom = pxQueue->pcHead; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + ( void ) memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->u.pcReadFrom, ( size_t ) pxQueue->uxItemSize ); /*lint !e961 !e418 MISRA exception as the casts are only redundant for some ports. Also previous logic ensures a null pointer can only be passed to memcpy() when the count is 0. */ + } +} +/*-----------------------------------------------------------*/ + +static void prvUnlockQueue( Queue_t * const pxQueue ) +{ + /* THIS FUNCTION MUST BE CALLED WITH THE SCHEDULER SUSPENDED. */ + + /* The lock counts contains the number of extra data items placed or + removed from the queue while the queue was locked. When a queue is + locked items can be added or removed, but the event lists cannot be + updated. */ + taskENTER_CRITICAL(); + { + int8_t cTxLock = pxQueue->cTxLock; + + /* See if data was added to the queue while it was locked. */ + while( cTxLock > queueLOCKED_UNMODIFIED ) + { + /* Data was posted while the queue was locked. Are any tasks + blocked waiting for data to become available? */ + #if ( configUSE_QUEUE_SETS == 1 ) + { + if( pxQueue->pxQueueSetContainer != NULL ) + { + if( prvNotifyQueueSetContainer( pxQueue, queueSEND_TO_BACK ) != pdFALSE ) + { + /* The queue is a member of a queue set, and posting to + the queue set caused a higher priority task to unblock. + A context switch is required. */ + vTaskMissedYield(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* Tasks that are removed from the event list will get + added to the pending ready list as the scheduler is still + suspended. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so record that a + context switch is required. */ + vTaskMissedYield(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + break; + } + } + } + #else /* configUSE_QUEUE_SETS */ + { + /* Tasks that are removed from the event list will get added to + the pending ready list as the scheduler is still suspended. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so record that + a context switch is required. */ + vTaskMissedYield(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + break; + } + } + #endif /* configUSE_QUEUE_SETS */ + + --cTxLock; + } + + pxQueue->cTxLock = queueUNLOCKED; + } + taskEXIT_CRITICAL(); + + /* Do the same for the Rx lock. */ + taskENTER_CRITICAL(); + { + int8_t cRxLock = pxQueue->cRxLock; + + while( cRxLock > queueLOCKED_UNMODIFIED ) + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + vTaskMissedYield(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + --cRxLock; + } + else + { + break; + } + } + + pxQueue->cRxLock = queueUNLOCKED; + } + taskEXIT_CRITICAL(); +} +/*-----------------------------------------------------------*/ + +static BaseType_t prvIsQueueEmpty( const Queue_t *pxQueue ) +{ +BaseType_t xReturn; + + taskENTER_CRITICAL(); + { + if( pxQueue->uxMessagesWaiting == ( UBaseType_t ) 0 ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + } + taskEXIT_CRITICAL(); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueueIsQueueEmptyFromISR( const QueueHandle_t xQueue ) +{ +BaseType_t xReturn; + + configASSERT( xQueue ); + if( ( ( Queue_t * ) xQueue )->uxMessagesWaiting == ( UBaseType_t ) 0 ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + + return xReturn; +} /*lint !e818 xQueue could not be pointer to const because it is a typedef. */ +/*-----------------------------------------------------------*/ + +static BaseType_t prvIsQueueFull( const Queue_t *pxQueue ) +{ +BaseType_t xReturn; + + taskENTER_CRITICAL(); + { + if( pxQueue->uxMessagesWaiting == pxQueue->uxLength ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + } + taskEXIT_CRITICAL(); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueueIsQueueFullFromISR( const QueueHandle_t xQueue ) +{ +BaseType_t xReturn; + + configASSERT( xQueue ); + if( ( ( Queue_t * ) xQueue )->uxMessagesWaiting == ( ( Queue_t * ) xQueue )->uxLength ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + + return xReturn; +} /*lint !e818 xQueue could not be pointer to const because it is a typedef. */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_CO_ROUTINES == 1 ) + + BaseType_t xQueueCRSend( QueueHandle_t xQueue, const void *pvItemToQueue, TickType_t xTicksToWait ) + { + BaseType_t xReturn; + Queue_t * const pxQueue = ( Queue_t * ) xQueue; + + /* If the queue is already full we may have to block. A critical section + is required to prevent an interrupt removing something from the queue + between the check to see if the queue is full and blocking on the queue. */ + portDISABLE_INTERRUPTS(); + { + if( prvIsQueueFull( pxQueue ) != pdFALSE ) + { + /* The queue is full - do we want to block or just leave without + posting? */ + if( xTicksToWait > ( TickType_t ) 0 ) + { + /* As this is called from a coroutine we cannot block directly, but + return indicating that we need to block. */ + vCoRoutineAddToDelayedList( xTicksToWait, &( pxQueue->xTasksWaitingToSend ) ); + portENABLE_INTERRUPTS(); + return errQUEUE_BLOCKED; + } + else + { + portENABLE_INTERRUPTS(); + return errQUEUE_FULL; + } + } + } + portENABLE_INTERRUPTS(); + + portDISABLE_INTERRUPTS(); + { + if( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) + { + /* There is room in the queue, copy the data into the queue. */ + prvCopyDataToQueue( pxQueue, pvItemToQueue, queueSEND_TO_BACK ); + xReturn = pdPASS; + + /* Were any co-routines waiting for data to become available? */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + /* In this instance the co-routine could be placed directly + into the ready list as we are within a critical section. + Instead the same pending ready list mechanism is used as if + the event were caused from within an interrupt. */ + if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The co-routine waiting has a higher priority so record + that a yield might be appropriate. */ + xReturn = errQUEUE_YIELD; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + xReturn = errQUEUE_FULL; + } + } + portENABLE_INTERRUPTS(); + + return xReturn; + } + +#endif /* configUSE_CO_ROUTINES */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_CO_ROUTINES == 1 ) + + BaseType_t xQueueCRReceive( QueueHandle_t xQueue, void *pvBuffer, TickType_t xTicksToWait ) + { + BaseType_t xReturn; + Queue_t * const pxQueue = ( Queue_t * ) xQueue; + + /* If the queue is already empty we may have to block. A critical section + is required to prevent an interrupt adding something to the queue + between the check to see if the queue is empty and blocking on the queue. */ + portDISABLE_INTERRUPTS(); + { + if( pxQueue->uxMessagesWaiting == ( UBaseType_t ) 0 ) + { + /* There are no messages in the queue, do we want to block or just + leave with nothing? */ + if( xTicksToWait > ( TickType_t ) 0 ) + { + /* As this is a co-routine we cannot block directly, but return + indicating that we need to block. */ + vCoRoutineAddToDelayedList( xTicksToWait, &( pxQueue->xTasksWaitingToReceive ) ); + portENABLE_INTERRUPTS(); + return errQUEUE_BLOCKED; + } + else + { + portENABLE_INTERRUPTS(); + return errQUEUE_FULL; + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + portENABLE_INTERRUPTS(); + + portDISABLE_INTERRUPTS(); + { + if( pxQueue->uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + /* Data is available from the queue. */ + pxQueue->u.pcReadFrom += pxQueue->uxItemSize; + if( pxQueue->u.pcReadFrom >= pxQueue->pcTail ) + { + pxQueue->u.pcReadFrom = pxQueue->pcHead; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + --( pxQueue->uxMessagesWaiting ); + ( void ) memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->u.pcReadFrom, ( unsigned ) pxQueue->uxItemSize ); + + xReturn = pdPASS; + + /* Were any co-routines waiting for space to become available? */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + /* In this instance the co-routine could be placed directly + into the ready list as we are within a critical section. + Instead the same pending ready list mechanism is used as if + the event were caused from within an interrupt. */ + if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + xReturn = errQUEUE_YIELD; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + xReturn = pdFAIL; + } + } + portENABLE_INTERRUPTS(); + + return xReturn; + } + +#endif /* configUSE_CO_ROUTINES */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_CO_ROUTINES == 1 ) + + BaseType_t xQueueCRSendFromISR( QueueHandle_t xQueue, const void *pvItemToQueue, BaseType_t xCoRoutinePreviouslyWoken ) + { + Queue_t * const pxQueue = ( Queue_t * ) xQueue; + + /* Cannot block within an ISR so if there is no space on the queue then + exit without doing anything. */ + if( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) + { + prvCopyDataToQueue( pxQueue, pvItemToQueue, queueSEND_TO_BACK ); + + /* We only want to wake one co-routine per ISR, so check that a + co-routine has not already been woken. */ + if( xCoRoutinePreviouslyWoken == pdFALSE ) + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + return pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return xCoRoutinePreviouslyWoken; + } + +#endif /* configUSE_CO_ROUTINES */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_CO_ROUTINES == 1 ) + + BaseType_t xQueueCRReceiveFromISR( QueueHandle_t xQueue, void *pvBuffer, BaseType_t *pxCoRoutineWoken ) + { + BaseType_t xReturn; + Queue_t * const pxQueue = ( Queue_t * ) xQueue; + + /* We cannot block from an ISR, so check there is data available. If + not then just leave without doing anything. */ + if( pxQueue->uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + /* Copy the data from the queue. */ + pxQueue->u.pcReadFrom += pxQueue->uxItemSize; + if( pxQueue->u.pcReadFrom >= pxQueue->pcTail ) + { + pxQueue->u.pcReadFrom = pxQueue->pcHead; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + --( pxQueue->uxMessagesWaiting ); + ( void ) memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->u.pcReadFrom, ( unsigned ) pxQueue->uxItemSize ); + + if( ( *pxCoRoutineWoken ) == pdFALSE ) + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + *pxCoRoutineWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xReturn = pdPASS; + } + else + { + xReturn = pdFAIL; + } + + return xReturn; + } + +#endif /* configUSE_CO_ROUTINES */ +/*-----------------------------------------------------------*/ + +#if ( configQUEUE_REGISTRY_SIZE > 0 ) + + void vQueueAddToRegistry( QueueHandle_t xQueue, const char *pcQueueName ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + { + UBaseType_t ux; + + /* See if there is an empty space in the registry. A NULL name denotes + a free slot. */ + for( ux = ( UBaseType_t ) 0U; ux < ( UBaseType_t ) configQUEUE_REGISTRY_SIZE; ux++ ) + { + if( xQueueRegistry[ ux ].pcQueueName == NULL ) + { + /* Store the information on this queue. */ + xQueueRegistry[ ux ].pcQueueName = pcQueueName; + xQueueRegistry[ ux ].xHandle = xQueue; + + traceQUEUE_REGISTRY_ADD( xQueue, pcQueueName ); + break; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + +#endif /* configQUEUE_REGISTRY_SIZE */ +/*-----------------------------------------------------------*/ + +#if ( configQUEUE_REGISTRY_SIZE > 0 ) + + const char *pcQueueGetName( QueueHandle_t xQueue ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + { + UBaseType_t ux; + const char *pcReturn = NULL; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + + /* Note there is nothing here to protect against another task adding or + removing entries from the registry while it is being searched. */ + for( ux = ( UBaseType_t ) 0U; ux < ( UBaseType_t ) configQUEUE_REGISTRY_SIZE; ux++ ) + { + if( xQueueRegistry[ ux ].xHandle == xQueue ) + { + pcReturn = xQueueRegistry[ ux ].pcQueueName; + break; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + return pcReturn; + } + +#endif /* configQUEUE_REGISTRY_SIZE */ +/*-----------------------------------------------------------*/ + +#if ( configQUEUE_REGISTRY_SIZE > 0 ) + + void vQueueUnregisterQueue( QueueHandle_t xQueue ) + { + UBaseType_t ux; + + /* See if the handle of the queue being unregistered in actually in the + registry. */ + for( ux = ( UBaseType_t ) 0U; ux < ( UBaseType_t ) configQUEUE_REGISTRY_SIZE; ux++ ) + { + if( xQueueRegistry[ ux ].xHandle == xQueue ) + { + /* Set the name to NULL to show that this slot if free again. */ + xQueueRegistry[ ux ].pcQueueName = NULL; + + /* Set the handle to NULL to ensure the same queue handle cannot + appear in the registry twice if it is added, removed, then + added again. */ + xQueueRegistry[ ux ].xHandle = ( QueueHandle_t ) 0; + break; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + } /*lint !e818 xQueue could not be pointer to const because it is a typedef. */ + +#endif /* configQUEUE_REGISTRY_SIZE */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TIMERS == 1 ) + + void vQueueWaitForMessageRestricted( QueueHandle_t xQueue, TickType_t xTicksToWait, const BaseType_t xWaitIndefinitely ) + { + Queue_t * const pxQueue = ( Queue_t * ) xQueue; + + /* This function should not be called by application code hence the + 'Restricted' in its name. It is not part of the public API. It is + designed for use by kernel code, and has special calling requirements. + It can result in vListInsert() being called on a list that can only + possibly ever have one item in it, so the list will be fast, but even + so it should be called with the scheduler locked and not from a critical + section. */ + + /* Only do anything if there are no messages in the queue. This function + will not actually cause the task to block, just place it on a blocked + list. It will not block until the scheduler is unlocked - at which + time a yield will be performed. If an item is added to the queue while + the queue is locked, and the calling task blocks on the queue, then the + calling task will be immediately unblocked when the queue is unlocked. */ + prvLockQueue( pxQueue ); + if( pxQueue->uxMessagesWaiting == ( UBaseType_t ) 0U ) + { + /* There is nothing in the queue, block for the specified period. */ + vTaskPlaceOnEventListRestricted( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait, xWaitIndefinitely ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + prvUnlockQueue( pxQueue ); + } + +#endif /* configUSE_TIMERS */ +/*-----------------------------------------------------------*/ + +#if( ( configUSE_QUEUE_SETS == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + + QueueSetHandle_t xQueueCreateSet( const UBaseType_t uxEventQueueLength ) + { + QueueSetHandle_t pxQueue; + + pxQueue = xQueueGenericCreate( uxEventQueueLength, sizeof( Queue_t * ), queueQUEUE_TYPE_SET ); + + return pxQueue; + } + +#endif /* configUSE_QUEUE_SETS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_QUEUE_SETS == 1 ) + + BaseType_t xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet ) + { + BaseType_t xReturn; + + taskENTER_CRITICAL(); + { + if( ( ( Queue_t * ) xQueueOrSemaphore )->pxQueueSetContainer != NULL ) + { + /* Cannot add a queue/semaphore to more than one queue set. */ + xReturn = pdFAIL; + } + else if( ( ( Queue_t * ) xQueueOrSemaphore )->uxMessagesWaiting != ( UBaseType_t ) 0 ) + { + /* Cannot add a queue/semaphore to a queue set if there are already + items in the queue/semaphore. */ + xReturn = pdFAIL; + } + else + { + ( ( Queue_t * ) xQueueOrSemaphore )->pxQueueSetContainer = xQueueSet; + xReturn = pdPASS; + } + } + taskEXIT_CRITICAL(); + + return xReturn; + } + +#endif /* configUSE_QUEUE_SETS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_QUEUE_SETS == 1 ) + + BaseType_t xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet ) + { + BaseType_t xReturn; + Queue_t * const pxQueueOrSemaphore = ( Queue_t * ) xQueueOrSemaphore; + + if( pxQueueOrSemaphore->pxQueueSetContainer != xQueueSet ) + { + /* The queue was not a member of the set. */ + xReturn = pdFAIL; + } + else if( pxQueueOrSemaphore->uxMessagesWaiting != ( UBaseType_t ) 0 ) + { + /* It is dangerous to remove a queue from a set when the queue is + not empty because the queue set will still hold pending events for + the queue. */ + xReturn = pdFAIL; + } + else + { + taskENTER_CRITICAL(); + { + /* The queue is no longer contained in the set. */ + pxQueueOrSemaphore->pxQueueSetContainer = NULL; + } + taskEXIT_CRITICAL(); + xReturn = pdPASS; + } + + return xReturn; + } /*lint !e818 xQueueSet could not be declared as pointing to const as it is a typedef. */ + +#endif /* configUSE_QUEUE_SETS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_QUEUE_SETS == 1 ) + + QueueSetMemberHandle_t xQueueSelectFromSet( QueueSetHandle_t xQueueSet, TickType_t const xTicksToWait ) + { + QueueSetMemberHandle_t xReturn = NULL; + + ( void ) xQueueGenericReceive( ( QueueHandle_t ) xQueueSet, &xReturn, xTicksToWait, pdFALSE ); /*lint !e961 Casting from one typedef to another is not redundant. */ + return xReturn; + } + +#endif /* configUSE_QUEUE_SETS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_QUEUE_SETS == 1 ) + + QueueSetMemberHandle_t xQueueSelectFromSetFromISR( QueueSetHandle_t xQueueSet ) + { + QueueSetMemberHandle_t xReturn = NULL; + + ( void ) xQueueReceiveFromISR( ( QueueHandle_t ) xQueueSet, &xReturn, NULL ); /*lint !e961 Casting from one typedef to another is not redundant. */ + return xReturn; + } + +#endif /* configUSE_QUEUE_SETS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_QUEUE_SETS == 1 ) + + static BaseType_t prvNotifyQueueSetContainer( const Queue_t * const pxQueue, const BaseType_t xCopyPosition ) + { + Queue_t *pxQueueSetContainer = pxQueue->pxQueueSetContainer; + BaseType_t xReturn = pdFALSE; + + /* This function must be called form a critical section. */ + + configASSERT( pxQueueSetContainer ); + configASSERT( pxQueueSetContainer->uxMessagesWaiting < pxQueueSetContainer->uxLength ); + + if( pxQueueSetContainer->uxMessagesWaiting < pxQueueSetContainer->uxLength ) + { + const int8_t cTxLock = pxQueueSetContainer->cTxLock; + + traceQUEUE_SEND( pxQueueSetContainer ); + + /* The data copied is the handle of the queue that contains data. */ + xReturn = prvCopyDataToQueue( pxQueueSetContainer, &pxQueue, xCopyPosition ); + + if( cTxLock == queueUNLOCKED ) + { + if( listLIST_IS_EMPTY( &( pxQueueSetContainer->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueueSetContainer->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority. */ + xReturn = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + pxQueueSetContainer->cTxLock = ( int8_t ) ( cTxLock + 1 ); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return xReturn; + } + +#endif /* configUSE_QUEUE_SETS */ + + + + + + + + + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/readme.txt b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/readme.txt new file mode 100644 index 0000000..81518ec --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/readme.txt @@ -0,0 +1,17 @@ +Each real time kernel port consists of three files that contain the core kernel +components and are common to every port, and one or more files that are +specific to a particular microcontroller and or compiler. + ++ The FreeRTOS/Source directory contains the three files that are common to +every port - list.c, queue.c and tasks.c. The kernel is contained within these +three files. croutine.c implements the optional co-routine functionality - which +is normally only used on very memory limited systems. + ++ The FreeRTOS/Source/Portable directory contains the files that are specific to +a particular microcontroller and or compiler. + ++ The FreeRTOS/Source/include directory contains the real time kernel header +files. + +See the readme file in the FreeRTOS/Source/Portable directory for more +information. \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/tasks.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/tasks.c new file mode 100644 index 0000000..8aea1cd --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/tasks.c @@ -0,0 +1,4807 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* Standard includes. */ +#include +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining +all the API functions to use the MPU wrappers. That should only be done when +task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* FreeRTOS includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "timers.h" +#include "StackMacros.h" + +/* Lint e961 and e750 are suppressed as a MISRA exception justified because the +MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined for the +header files above, but not in this file, in order to generate the correct +privileged Vs unprivileged linkage and placement. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750. */ + +/* Set configUSE_STATS_FORMATTING_FUNCTIONS to 2 to include the stats formatting +functions but without including stdio.h here. */ +#if ( configUSE_STATS_FORMATTING_FUNCTIONS == 1 ) + /* At the bottom of this file are two optional functions that can be used + to generate human readable text from the raw data generated by the + uxTaskGetSystemState() function. Note the formatting functions are provided + for convenience only, and are NOT considered part of the kernel. */ + #include +#endif /* configUSE_STATS_FORMATTING_FUNCTIONS == 1 ) */ + +#if( configUSE_PREEMPTION == 0 ) + /* If the cooperative scheduler is being used then a yield should not be + performed just because a higher priority task has been woken. */ + #define taskYIELD_IF_USING_PREEMPTION() +#else + #define taskYIELD_IF_USING_PREEMPTION() portYIELD_WITHIN_API() +#endif + +/* Values that can be assigned to the ucNotifyState member of the TCB. */ +#define taskNOT_WAITING_NOTIFICATION ( ( uint8_t ) 0 ) +#define taskWAITING_NOTIFICATION ( ( uint8_t ) 1 ) +#define taskNOTIFICATION_RECEIVED ( ( uint8_t ) 2 ) + +/* + * The value used to fill the stack of a task when the task is created. This + * is used purely for checking the high water mark for tasks. + */ +#define tskSTACK_FILL_BYTE ( 0xa5U ) + +/* Sometimes the FreeRTOSConfig.h settings only allow a task to be created using +dynamically allocated RAM, in which case when any task is deleted it is known +that both the task's stack and TCB need to be freed. Sometimes the +FreeRTOSConfig.h settings only allow a task to be created using statically +allocated RAM, in which case when any task is deleted it is known that neither +the task's stack or TCB should be freed. Sometimes the FreeRTOSConfig.h +settings allow a task to be created using either statically or dynamically +allocated RAM, in which case a member of the TCB is used to record whether the +stack and/or TCB were allocated statically or dynamically, so when a task is +deleted the RAM that was allocated dynamically is freed again and no attempt is +made to free the RAM that was allocated statically. +tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE is only true if it is possible for a +task to be created using either statically or dynamically allocated RAM. Note +that if portUSING_MPU_WRAPPERS is 1 then a protected task can be created with +a statically allocated stack and a dynamically allocated TCB. */ +#define tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE ( ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) || ( portUSING_MPU_WRAPPERS == 1 ) ) +#define tskDYNAMICALLY_ALLOCATED_STACK_AND_TCB ( ( uint8_t ) 0 ) +#define tskSTATICALLY_ALLOCATED_STACK_ONLY ( ( uint8_t ) 1 ) +#define tskSTATICALLY_ALLOCATED_STACK_AND_TCB ( ( uint8_t ) 2 ) + +/* + * Macros used by vListTask to indicate which state a task is in. + */ +#define tskBLOCKED_CHAR ( 'B' ) +#define tskREADY_CHAR ( 'R' ) +#define tskDELETED_CHAR ( 'D' ) +#define tskSUSPENDED_CHAR ( 'S' ) + +/* + * Some kernel aware debuggers require the data the debugger needs access to be + * global, rather than file scope. + */ +#ifdef portREMOVE_STATIC_QUALIFIER + #define static +#endif + +#if ( configUSE_PORT_OPTIMISED_TASK_SELECTION == 0 ) + + /* If configUSE_PORT_OPTIMISED_TASK_SELECTION is 0 then task selection is + performed in a generic way that is not optimised to any particular + microcontroller architecture. */ + + /* uxTopReadyPriority holds the priority of the highest priority ready + state task. */ + #define taskRECORD_READY_PRIORITY( uxPriority ) \ + { \ + if( ( uxPriority ) > uxTopReadyPriority ) \ + { \ + uxTopReadyPriority = ( uxPriority ); \ + } \ + } /* taskRECORD_READY_PRIORITY */ + + /*-----------------------------------------------------------*/ + + #define taskSELECT_HIGHEST_PRIORITY_TASK() \ + { \ + UBaseType_t uxTopPriority = uxTopReadyPriority; \ + \ + /* Find the highest priority queue that contains ready tasks. */ \ + while( listLIST_IS_EMPTY( &( pxReadyTasksLists[ uxTopPriority ] ) ) ) \ + { \ + configASSERT( uxTopPriority ); \ + --uxTopPriority; \ + } \ + \ + /* listGET_OWNER_OF_NEXT_ENTRY indexes through the list, so the tasks of \ + the same priority get an equal share of the processor time. */ \ + listGET_OWNER_OF_NEXT_ENTRY( pxCurrentTCB, &( pxReadyTasksLists[ uxTopPriority ] ) ); \ + uxTopReadyPriority = uxTopPriority; \ + } /* taskSELECT_HIGHEST_PRIORITY_TASK */ + + /*-----------------------------------------------------------*/ + + /* Define away taskRESET_READY_PRIORITY() and portRESET_READY_PRIORITY() as + they are only required when a port optimised method of task selection is + being used. */ + #define taskRESET_READY_PRIORITY( uxPriority ) + #define portRESET_READY_PRIORITY( uxPriority, uxTopReadyPriority ) + +#else /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + + /* If configUSE_PORT_OPTIMISED_TASK_SELECTION is 1 then task selection is + performed in a way that is tailored to the particular microcontroller + architecture being used. */ + + /* A port optimised version is provided. Call the port defined macros. */ + #define taskRECORD_READY_PRIORITY( uxPriority ) portRECORD_READY_PRIORITY( uxPriority, uxTopReadyPriority ) + + /*-----------------------------------------------------------*/ + + #define taskSELECT_HIGHEST_PRIORITY_TASK() \ + { \ + UBaseType_t uxTopPriority; \ + \ + /* Find the highest priority list that contains ready tasks. */ \ + portGET_HIGHEST_PRIORITY( uxTopPriority, uxTopReadyPriority ); \ + configASSERT( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ uxTopPriority ] ) ) > 0 ); \ + listGET_OWNER_OF_NEXT_ENTRY( pxCurrentTCB, &( pxReadyTasksLists[ uxTopPriority ] ) ); \ + } /* taskSELECT_HIGHEST_PRIORITY_TASK() */ + + /*-----------------------------------------------------------*/ + + /* A port optimised version is provided, call it only if the TCB being reset + is being referenced from a ready list. If it is referenced from a delayed + or suspended list then it won't be in a ready list. */ + #define taskRESET_READY_PRIORITY( uxPriority ) \ + { \ + if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ ( uxPriority ) ] ) ) == ( UBaseType_t ) 0 ) \ + { \ + portRESET_READY_PRIORITY( ( uxPriority ), ( uxTopReadyPriority ) ); \ + } \ + } + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +/*-----------------------------------------------------------*/ + +/* pxDelayedTaskList and pxOverflowDelayedTaskList are switched when the tick +count overflows. */ +#define taskSWITCH_DELAYED_LISTS() \ +{ \ + List_t *pxTemp; \ + \ + /* The delayed tasks list should be empty when the lists are switched. */ \ + configASSERT( ( listLIST_IS_EMPTY( pxDelayedTaskList ) ) ); \ + \ + pxTemp = pxDelayedTaskList; \ + pxDelayedTaskList = pxOverflowDelayedTaskList; \ + pxOverflowDelayedTaskList = pxTemp; \ + xNumOfOverflows++; \ + prvResetNextTaskUnblockTime(); \ +} + +/*-----------------------------------------------------------*/ + +/* + * Place the task represented by pxTCB into the appropriate ready list for + * the task. It is inserted at the end of the list. + */ +#define prvAddTaskToReadyList( pxTCB ) \ + traceMOVED_TASK_TO_READY_STATE( pxTCB ); \ + taskRECORD_READY_PRIORITY( ( pxTCB )->uxPriority ); \ + vListInsertEnd( &( pxReadyTasksLists[ ( pxTCB )->uxPriority ] ), &( ( pxTCB )->xStateListItem ) ); \ + tracePOST_MOVED_TASK_TO_READY_STATE( pxTCB ) +/*-----------------------------------------------------------*/ + +/* + * Several functions take an TaskHandle_t parameter that can optionally be NULL, + * where NULL is used to indicate that the handle of the currently executing + * task should be used in place of the parameter. This macro simply checks to + * see if the parameter is NULL and returns a pointer to the appropriate TCB. + */ +#define prvGetTCBFromHandle( pxHandle ) ( ( ( pxHandle ) == NULL ) ? ( TCB_t * ) pxCurrentTCB : ( TCB_t * ) ( pxHandle ) ) + +/* The item value of the event list item is normally used to hold the priority +of the task to which it belongs (coded to allow it to be held in reverse +priority order). However, it is occasionally borrowed for other purposes. It +is important its value is not updated due to a task priority change while it is +being used for another purpose. The following bit definition is used to inform +the scheduler that the value should not be changed - in which case it is the +responsibility of whichever module is using the value to ensure it gets set back +to its original value when it is released. */ +#if( configUSE_16_BIT_TICKS == 1 ) + #define taskEVENT_LIST_ITEM_VALUE_IN_USE 0x8000U +#else + #define taskEVENT_LIST_ITEM_VALUE_IN_USE 0x80000000UL +#endif + +/* + * Task control block. A task control block (TCB) is allocated for each task, + * and stores task state information, including a pointer to the task's context + * (the task's run time environment, including register values) + */ +typedef struct tskTaskControlBlock +{ + volatile StackType_t *pxTopOfStack; /*< Points to the location of the last item placed on the tasks stack. THIS MUST BE THE FIRST MEMBER OF THE TCB STRUCT. */ + + #if ( portUSING_MPU_WRAPPERS == 1 ) + xMPU_SETTINGS xMPUSettings; /*< The MPU settings are defined as part of the port layer. THIS MUST BE THE SECOND MEMBER OF THE TCB STRUCT. */ + #endif + + ListItem_t xStateListItem; /*< The list that the state list item of a task is reference from denotes the state of that task (Ready, Blocked, Suspended ). */ + ListItem_t xEventListItem; /*< Used to reference a task from an event list. */ + UBaseType_t uxPriority; /*< The priority of the task. 0 is the lowest priority. */ + StackType_t *pxStack; /*< Points to the start of the stack. */ + char pcTaskName[ configMAX_TASK_NAME_LEN ];/*< Descriptive name given to the task when created. Facilitates debugging only. */ /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + + #if ( portSTACK_GROWTH > 0 ) + StackType_t *pxEndOfStack; /*< Points to the end of the stack on architectures where the stack grows up from low memory. */ + #endif + + #if ( portCRITICAL_NESTING_IN_TCB == 1 ) + UBaseType_t uxCriticalNesting; /*< Holds the critical section nesting depth for ports that do not maintain their own count in the port layer. */ + #endif + + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxTCBNumber; /*< Stores a number that increments each time a TCB is created. It allows debuggers to determine when a task has been deleted and then recreated. */ + UBaseType_t uxTaskNumber; /*< Stores a number specifically for use by third party trace code. */ + #endif + + #if ( configUSE_MUTEXES == 1 ) + UBaseType_t uxBasePriority; /*< The priority last assigned to the task - used by the priority inheritance mechanism. */ + UBaseType_t uxMutexesHeld; + #endif + + #if ( configUSE_APPLICATION_TASK_TAG == 1 ) + TaskHookFunction_t pxTaskTag; + #endif + + #if( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 ) + void *pvThreadLocalStoragePointers[ configNUM_THREAD_LOCAL_STORAGE_POINTERS ]; + #endif + + #if( configGENERATE_RUN_TIME_STATS == 1 ) + uint32_t ulRunTimeCounter; /*< Stores the amount of time the task has spent in the Running state. */ + #endif + + #if ( configUSE_NEWLIB_REENTRANT == 1 ) + /* Allocate a Newlib reent structure that is specific to this task. + Note Newlib support has been included by popular demand, but is not + used by the FreeRTOS maintainers themselves. FreeRTOS is not + responsible for resulting newlib operation. User must be familiar with + newlib and must provide system-wide implementations of the necessary + stubs. Be warned that (at the time of writing) the current newlib design + implements a system-wide malloc() that must be provided with locks. */ + struct _reent xNewLib_reent; + #endif + + #if( configUSE_TASK_NOTIFICATIONS == 1 ) + volatile uint32_t ulNotifiedValue; + volatile uint8_t ucNotifyState; + #endif + + /* See the comments above the definition of + tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE. */ + #if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) + uint8_t ucStaticallyAllocated; /*< Set to pdTRUE if the task is a statically allocated to ensure no attempt is made to free the memory. */ + #endif + + #if( INCLUDE_xTaskAbortDelay == 1 ) + uint8_t ucDelayAborted; + #endif + +} tskTCB; + +/* The old tskTCB name is maintained above then typedefed to the new TCB_t name +below to enable the use of older kernel aware debuggers. */ +typedef tskTCB TCB_t; + +/*lint -e956 A manual analysis and inspection has been used to determine which +static variables must be declared volatile. */ + +PRIVILEGED_DATA TCB_t * volatile pxCurrentTCB = NULL; + +/* Lists for ready and blocked tasks. --------------------*/ +PRIVILEGED_DATA static List_t pxReadyTasksLists[ configMAX_PRIORITIES ];/*< Prioritised ready tasks. */ +PRIVILEGED_DATA static List_t xDelayedTaskList1; /*< Delayed tasks. */ +PRIVILEGED_DATA static List_t xDelayedTaskList2; /*< Delayed tasks (two lists are used - one for delays that have overflowed the current tick count. */ +PRIVILEGED_DATA static List_t * volatile pxDelayedTaskList; /*< Points to the delayed task list currently being used. */ +PRIVILEGED_DATA static List_t * volatile pxOverflowDelayedTaskList; /*< Points to the delayed task list currently being used to hold tasks that have overflowed the current tick count. */ +PRIVILEGED_DATA static List_t xPendingReadyList; /*< Tasks that have been readied while the scheduler was suspended. They will be moved to the ready list when the scheduler is resumed. */ + +#if( INCLUDE_vTaskDelete == 1 ) + + PRIVILEGED_DATA static List_t xTasksWaitingTermination; /*< Tasks that have been deleted - but their memory not yet freed. */ + PRIVILEGED_DATA static volatile UBaseType_t uxDeletedTasksWaitingCleanUp = ( UBaseType_t ) 0U; + +#endif + +#if ( INCLUDE_vTaskSuspend == 1 ) + + PRIVILEGED_DATA static List_t xSuspendedTaskList; /*< Tasks that are currently suspended. */ + +#endif + +/* Other file private variables. --------------------------------*/ +PRIVILEGED_DATA static volatile UBaseType_t uxCurrentNumberOfTasks = ( UBaseType_t ) 0U; +PRIVILEGED_DATA static volatile TickType_t xTickCount = ( TickType_t ) 0U; +PRIVILEGED_DATA static volatile UBaseType_t uxTopReadyPriority = tskIDLE_PRIORITY; +PRIVILEGED_DATA static volatile BaseType_t xSchedulerRunning = pdFALSE; +PRIVILEGED_DATA static volatile UBaseType_t uxPendedTicks = ( UBaseType_t ) 0U; +PRIVILEGED_DATA static volatile BaseType_t xYieldPending = pdFALSE; +PRIVILEGED_DATA static volatile BaseType_t xNumOfOverflows = ( BaseType_t ) 0; +PRIVILEGED_DATA static UBaseType_t uxTaskNumber = ( UBaseType_t ) 0U; +PRIVILEGED_DATA static volatile TickType_t xNextTaskUnblockTime = ( TickType_t ) 0U; /* Initialised to portMAX_DELAY before the scheduler starts. */ +PRIVILEGED_DATA static TaskHandle_t xIdleTaskHandle = NULL; /*< Holds the handle of the idle task. The idle task is created automatically when the scheduler is started. */ + +/* Context switches are held pending while the scheduler is suspended. Also, +interrupts must not manipulate the xStateListItem of a TCB, or any of the +lists the xStateListItem can be referenced from, if the scheduler is suspended. +If an interrupt needs to unblock a task while the scheduler is suspended then it +moves the task's event list item into the xPendingReadyList, ready for the +kernel to move the task from the pending ready list into the real ready list +when the scheduler is unsuspended. The pending ready list itself can only be +accessed from a critical section. */ +PRIVILEGED_DATA static volatile UBaseType_t uxSchedulerSuspended = ( UBaseType_t ) pdFALSE; + +#if ( configGENERATE_RUN_TIME_STATS == 1 ) + + PRIVILEGED_DATA static uint32_t ulTaskSwitchedInTime = 0UL; /*< Holds the value of a timer/counter the last time a task was switched in. */ + PRIVILEGED_DATA static uint32_t ulTotalRunTime = 0UL; /*< Holds the total amount of execution time as defined by the run time counter clock. */ + +#endif + +/*lint +e956 */ + +/*-----------------------------------------------------------*/ + +/* Callback function prototypes. --------------------------*/ +#if( configCHECK_FOR_STACK_OVERFLOW > 0 ) + extern void vApplicationStackOverflowHook( TaskHandle_t xTask, char *pcTaskName ); +#endif + +#if( configUSE_TICK_HOOK > 0 ) + extern void vApplicationTickHook( void ); +#endif + +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + extern void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize ); +#endif + +/* File private functions. --------------------------------*/ + +/** + * Utility task that simply returns pdTRUE if the task referenced by xTask is + * currently in the Suspended state, or pdFALSE if the task referenced by xTask + * is in any other state. + */ +#if ( INCLUDE_vTaskSuspend == 1 ) + static BaseType_t prvTaskIsTaskSuspended( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION; +#endif /* INCLUDE_vTaskSuspend */ + +/* + * Utility to ready all the lists used by the scheduler. This is called + * automatically upon the creation of the first task. + */ +static void prvInitialiseTaskLists( void ) PRIVILEGED_FUNCTION; + +/* + * The idle task, which as all tasks is implemented as a never ending loop. + * The idle task is automatically created and added to the ready lists upon + * creation of the first user task. + * + * The portTASK_FUNCTION_PROTO() macro is used to allow port/compiler specific + * language extensions. The equivalent prototype for this function is: + * + * void prvIdleTask( void *pvParameters ); + * + */ +static portTASK_FUNCTION_PROTO( prvIdleTask, pvParameters ); + +/* + * Utility to free all memory allocated by the scheduler to hold a TCB, + * including the stack pointed to by the TCB. + * + * This does not free memory allocated by the task itself (i.e. memory + * allocated by calls to pvPortMalloc from within the tasks application code). + */ +#if ( INCLUDE_vTaskDelete == 1 ) + + static void prvDeleteTCB( TCB_t *pxTCB ) PRIVILEGED_FUNCTION; + +#endif + +/* + * Used only by the idle task. This checks to see if anything has been placed + * in the list of tasks waiting to be deleted. If so the task is cleaned up + * and its TCB deleted. + */ +static void prvCheckTasksWaitingTermination( void ) PRIVILEGED_FUNCTION; + +/* + * The currently executing task is entering the Blocked state. Add the task to + * either the current or the overflow delayed task list. + */ +static void prvAddCurrentTaskToDelayedList( TickType_t xTicksToWait, const BaseType_t xCanBlockIndefinitely ) PRIVILEGED_FUNCTION; + +/* + * Fills an TaskStatus_t structure with information on each task that is + * referenced from the pxList list (which may be a ready list, a delayed list, + * a suspended list, etc.). + * + * THIS FUNCTION IS INTENDED FOR DEBUGGING ONLY, AND SHOULD NOT BE CALLED FROM + * NORMAL APPLICATION CODE. + */ +#if ( configUSE_TRACE_FACILITY == 1 ) + + static UBaseType_t prvListTasksWithinSingleList( TaskStatus_t *pxTaskStatusArray, List_t *pxList, eTaskState eState ) PRIVILEGED_FUNCTION; + +#endif + +/* + * Searches pxList for a task with name pcNameToQuery - returning a handle to + * the task if it is found, or NULL if the task is not found. + */ +#if ( INCLUDE_xTaskGetHandle == 1 ) + + static TCB_t *prvSearchForNameWithinSingleList( List_t *pxList, const char pcNameToQuery[] ) PRIVILEGED_FUNCTION; + +#endif + +/* + * When a task is created, the stack of the task is filled with a known value. + * This function determines the 'high water mark' of the task stack by + * determining how much of the stack remains at the original preset value. + */ +#if ( ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) ) + + static uint16_t prvTaskCheckFreeStackSpace( const uint8_t * pucStackByte ) PRIVILEGED_FUNCTION; + +#endif + +/* + * Return the amount of time, in ticks, that will pass before the kernel will + * next move a task from the Blocked state to the Running state. + * + * This conditional compilation should use inequality to 0, not equality to 1. + * This is to ensure portSUPPRESS_TICKS_AND_SLEEP() can be called when user + * defined low power mode implementations require configUSE_TICKLESS_IDLE to be + * set to a value other than 1. + */ +#if ( configUSE_TICKLESS_IDLE != 0 ) + + static TickType_t prvGetExpectedIdleTime( void ) PRIVILEGED_FUNCTION; + +#endif + +/* + * Set xNextTaskUnblockTime to the time at which the next Blocked state task + * will exit the Blocked state. + */ +static void prvResetNextTaskUnblockTime( void ); + +#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) + + /* + * Helper function used to pad task names with spaces when printing out + * human readable tables of task information. + */ + static char *prvWriteNameToBuffer( char *pcBuffer, const char *pcTaskName ) PRIVILEGED_FUNCTION; + +#endif + +/* + * Called after a Task_t structure has been allocated either statically or + * dynamically to fill in the structure's members. + */ +static void prvInitialiseNewTask( TaskFunction_t pxTaskCode, + const char * const pcName, + const uint32_t ulStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + TaskHandle_t * const pxCreatedTask, + TCB_t *pxNewTCB, + const MemoryRegion_t * const xRegions ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + +/* + * Called after a new task has been created and initialised to place the task + * under the control of the scheduler. + */ +static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB ) PRIVILEGED_FUNCTION; + +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + + TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode, + const char * const pcName, + const uint32_t ulStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + StackType_t * const puxStackBuffer, + StaticTask_t * const pxTaskBuffer ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + { + TCB_t *pxNewTCB; + TaskHandle_t xReturn; + + configASSERT( puxStackBuffer != NULL ); + configASSERT( pxTaskBuffer != NULL ); + + if( ( pxTaskBuffer != NULL ) && ( puxStackBuffer != NULL ) ) + { + /* The memory used for the task's TCB and stack are passed into this + function - use them. */ + pxNewTCB = ( TCB_t * ) pxTaskBuffer; /*lint !e740 Unusual cast is ok as the structures are designed to have the same alignment, and the size is checked by an assert. */ + pxNewTCB->pxStack = ( StackType_t * ) puxStackBuffer; + + #if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) + { + /* Tasks can be created statically or dynamically, so note this + task was created statically in case the task is later deleted. */ + pxNewTCB->ucStaticallyAllocated = tskSTATICALLY_ALLOCATED_STACK_AND_TCB; + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ + + prvInitialiseNewTask( pxTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, &xReturn, pxNewTCB, NULL ); + prvAddNewTaskToReadyList( pxNewTCB ); + } + else + { + xReturn = NULL; + } + + return xReturn; + } + +#endif /* SUPPORT_STATIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +#if( portUSING_MPU_WRAPPERS == 1 ) + + BaseType_t xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition, TaskHandle_t *pxCreatedTask ) + { + TCB_t *pxNewTCB; + BaseType_t xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; + + configASSERT( pxTaskDefinition->puxStackBuffer ); + + if( pxTaskDefinition->puxStackBuffer != NULL ) + { + /* Allocate space for the TCB. Where the memory comes from depends + on the implementation of the port malloc function and whether or + not static allocation is being used. */ + pxNewTCB = ( TCB_t * ) pvPortMalloc( sizeof( TCB_t ) ); + + if( pxNewTCB != NULL ) + { + /* Store the stack location in the TCB. */ + pxNewTCB->pxStack = pxTaskDefinition->puxStackBuffer; + + /* Tasks can be created statically or dynamically, so note + this task had a statically allocated stack in case it is + later deleted. The TCB was allocated dynamically. */ + pxNewTCB->ucStaticallyAllocated = tskSTATICALLY_ALLOCATED_STACK_ONLY; + + prvInitialiseNewTask( pxTaskDefinition->pvTaskCode, + pxTaskDefinition->pcName, + ( uint32_t ) pxTaskDefinition->usStackDepth, + pxTaskDefinition->pvParameters, + pxTaskDefinition->uxPriority, + pxCreatedTask, pxNewTCB, + pxTaskDefinition->xRegions ); + + prvAddNewTaskToReadyList( pxNewTCB ); + xReturn = pdPASS; + } + } + + return xReturn; + } + +#endif /* portUSING_MPU_WRAPPERS */ +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + + BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, + const char * const pcName, + const uint16_t usStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + TaskHandle_t * const pxCreatedTask ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + { + TCB_t *pxNewTCB; + BaseType_t xReturn; + + /* If the stack grows down then allocate the stack then the TCB so the stack + does not grow into the TCB. Likewise if the stack grows up then allocate + the TCB then the stack. */ + #if( portSTACK_GROWTH > 0 ) + { + /* Allocate space for the TCB. Where the memory comes from depends on + the implementation of the port malloc function and whether or not static + allocation is being used. */ + pxNewTCB = ( TCB_t * ) pvPortMalloc( sizeof( TCB_t ) ); + + if( pxNewTCB != NULL ) + { + /* Allocate space for the stack used by the task being created. + The base of the stack memory stored in the TCB so the task can + be deleted later if required. */ + pxNewTCB->pxStack = ( StackType_t * ) pvPortMalloc( ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) ) ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + + if( pxNewTCB->pxStack == NULL ) + { + /* Could not allocate the stack. Delete the allocated TCB. */ + vPortFree( pxNewTCB ); + pxNewTCB = NULL; + } + } + } + #else /* portSTACK_GROWTH */ + { + StackType_t *pxStack; + + /* Allocate space for the stack used by the task being created. */ + pxStack = ( StackType_t * ) pvPortMalloc( ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) ) ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + + if( pxStack != NULL ) + { + /* Allocate space for the TCB. */ + pxNewTCB = ( TCB_t * ) pvPortMalloc( sizeof( TCB_t ) ); /*lint !e961 MISRA exception as the casts are only redundant for some paths. */ + + if( pxNewTCB != NULL ) + { + /* Store the stack location in the TCB. */ + pxNewTCB->pxStack = pxStack; + } + else + { + /* The stack cannot be used as the TCB was not created. Free + it again. */ + vPortFree( pxStack ); + } + } + else + { + pxNewTCB = NULL; + } + } + #endif /* portSTACK_GROWTH */ + + if( pxNewTCB != NULL ) + { + #if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) + { + /* Tasks can be created statically or dynamically, so note this + task was created dynamically in case it is later deleted. */ + pxNewTCB->ucStaticallyAllocated = tskDYNAMICALLY_ALLOCATED_STACK_AND_TCB; + } + #endif /* configSUPPORT_STATIC_ALLOCATION */ + + prvInitialiseNewTask( pxTaskCode, pcName, ( uint32_t ) usStackDepth, pvParameters, uxPriority, pxCreatedTask, pxNewTCB, NULL ); + prvAddNewTaskToReadyList( pxNewTCB ); + xReturn = pdPASS; + } + else + { + xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; + } + + return xReturn; + } + +#endif /* configSUPPORT_DYNAMIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +static void prvInitialiseNewTask( TaskFunction_t pxTaskCode, + const char * const pcName, + const uint32_t ulStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + TaskHandle_t * const pxCreatedTask, + TCB_t *pxNewTCB, + const MemoryRegion_t * const xRegions ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ +{ +StackType_t *pxTopOfStack; +UBaseType_t x; + + #if( portUSING_MPU_WRAPPERS == 1 ) + /* Should the task be created in privileged mode? */ + BaseType_t xRunPrivileged; + if( ( uxPriority & portPRIVILEGE_BIT ) != 0U ) + { + xRunPrivileged = pdTRUE; + } + else + { + xRunPrivileged = pdFALSE; + } + uxPriority &= ~portPRIVILEGE_BIT; + #endif /* portUSING_MPU_WRAPPERS == 1 */ + + /* Avoid dependency on memset() if it is not required. */ + #if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) || ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) ) + { + /* Fill the stack with a known value to assist debugging. */ + ( void ) memset( pxNewTCB->pxStack, ( int ) tskSTACK_FILL_BYTE, ( size_t ) ulStackDepth * sizeof( StackType_t ) ); + } + #endif /* ( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) || ( ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) ) ) */ + + /* Calculate the top of stack address. This depends on whether the stack + grows from high memory to low (as per the 80x86) or vice versa. + portSTACK_GROWTH is used to make the result positive or negative as required + by the port. */ + #if( portSTACK_GROWTH < 0 ) + { + pxTopOfStack = pxNewTCB->pxStack + ( ulStackDepth - ( uint32_t ) 1 ); + pxTopOfStack = ( StackType_t * ) ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) ); /*lint !e923 MISRA exception. Avoiding casts between pointers and integers is not practical. Size differences accounted for using portPOINTER_SIZE_TYPE type. */ + + /* Check the alignment of the calculated top of stack is correct. */ + configASSERT( ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack & ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) == 0UL ) ); + } + #else /* portSTACK_GROWTH */ + { + pxTopOfStack = pxNewTCB->pxStack; + + /* Check the alignment of the stack buffer is correct. */ + configASSERT( ( ( ( portPOINTER_SIZE_TYPE ) pxNewTCB->pxStack & ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) == 0UL ) ); + + /* The other extreme of the stack space is required if stack checking is + performed. */ + pxNewTCB->pxEndOfStack = pxNewTCB->pxStack + ( ulStackDepth - ( uint32_t ) 1 ); + } + #endif /* portSTACK_GROWTH */ + + /* Store the task name in the TCB. */ + for( x = ( UBaseType_t ) 0; x < ( UBaseType_t ) configMAX_TASK_NAME_LEN; x++ ) + { + pxNewTCB->pcTaskName[ x ] = pcName[ x ]; + + /* Don't copy all configMAX_TASK_NAME_LEN if the string is shorter than + configMAX_TASK_NAME_LEN characters just in case the memory after the + string is not accessible (extremely unlikely). */ + if( pcName[ x ] == 0x00 ) + { + break; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + /* Ensure the name string is terminated in the case that the string length + was greater or equal to configMAX_TASK_NAME_LEN. */ + pxNewTCB->pcTaskName[ configMAX_TASK_NAME_LEN - 1 ] = '\0'; + + /* This is used as an array index so must ensure it's not too large. First + remove the privilege bit if one is present. */ + if( uxPriority >= ( UBaseType_t ) configMAX_PRIORITIES ) + { + uxPriority = ( UBaseType_t ) configMAX_PRIORITIES - ( UBaseType_t ) 1U; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + pxNewTCB->uxPriority = uxPriority; + #if ( configUSE_MUTEXES == 1 ) + { + pxNewTCB->uxBasePriority = uxPriority; + pxNewTCB->uxMutexesHeld = 0; + } + #endif /* configUSE_MUTEXES */ + + vListInitialiseItem( &( pxNewTCB->xStateListItem ) ); + vListInitialiseItem( &( pxNewTCB->xEventListItem ) ); + + /* Set the pxNewTCB as a link back from the ListItem_t. This is so we can get + back to the containing TCB from a generic item in a list. */ + listSET_LIST_ITEM_OWNER( &( pxNewTCB->xStateListItem ), pxNewTCB ); + + /* Event lists are always in priority order. */ + listSET_LIST_ITEM_VALUE( &( pxNewTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) uxPriority ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + listSET_LIST_ITEM_OWNER( &( pxNewTCB->xEventListItem ), pxNewTCB ); + + #if ( portCRITICAL_NESTING_IN_TCB == 1 ) + { + pxNewTCB->uxCriticalNesting = ( UBaseType_t ) 0U; + } + #endif /* portCRITICAL_NESTING_IN_TCB */ + + #if ( configUSE_APPLICATION_TASK_TAG == 1 ) + { + pxNewTCB->pxTaskTag = NULL; + } + #endif /* configUSE_APPLICATION_TASK_TAG */ + + #if ( configGENERATE_RUN_TIME_STATS == 1 ) + { + pxNewTCB->ulRunTimeCounter = 0UL; + } + #endif /* configGENERATE_RUN_TIME_STATS */ + + #if ( portUSING_MPU_WRAPPERS == 1 ) + { + vPortStoreTaskMPUSettings( &( pxNewTCB->xMPUSettings ), xRegions, pxNewTCB->pxStack, ulStackDepth ); + } + #else + { + /* Avoid compiler warning about unreferenced parameter. */ + ( void ) xRegions; + } + #endif + + #if( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 ) + { + for( x = 0; x < ( UBaseType_t ) configNUM_THREAD_LOCAL_STORAGE_POINTERS; x++ ) + { + pxNewTCB->pvThreadLocalStoragePointers[ x ] = NULL; + } + } + #endif + + #if ( configUSE_TASK_NOTIFICATIONS == 1 ) + { + pxNewTCB->ulNotifiedValue = 0; + pxNewTCB->ucNotifyState = taskNOT_WAITING_NOTIFICATION; + } + #endif + + #if ( configUSE_NEWLIB_REENTRANT == 1 ) + { + /* Initialise this task's Newlib reent structure. */ + _REENT_INIT_PTR( ( &( pxNewTCB->xNewLib_reent ) ) ); + } + #endif + + #if( INCLUDE_xTaskAbortDelay == 1 ) + { + pxNewTCB->ucDelayAborted = pdFALSE; + } + #endif + + /* Initialize the TCB stack to look as if the task was already running, + but had been interrupted by the scheduler. The return address is set + to the start of the task function. Once the stack has been initialised + the top of stack variable is updated. */ + #if( portUSING_MPU_WRAPPERS == 1 ) + { + pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxTaskCode, pvParameters, xRunPrivileged ); + } + #else /* portUSING_MPU_WRAPPERS */ + { + pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxTaskCode, pvParameters ); + } + #endif /* portUSING_MPU_WRAPPERS */ + + if( ( void * ) pxCreatedTask != NULL ) + { + /* Pass the handle out in an anonymous way. The handle can be used to + change the created task's priority, delete the created task, etc.*/ + *pxCreatedTask = ( TaskHandle_t ) pxNewTCB; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } +} +/*-----------------------------------------------------------*/ + +static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB ) +{ + /* Ensure interrupts don't access the task lists while the lists are being + updated. */ + taskENTER_CRITICAL(); + { + uxCurrentNumberOfTasks++; + if( pxCurrentTCB == NULL ) + { + /* There are no other tasks, or all the other tasks are in + the suspended state - make this the current task. */ + pxCurrentTCB = pxNewTCB; + + if( uxCurrentNumberOfTasks == ( UBaseType_t ) 1 ) + { + /* This is the first task to be created so do the preliminary + initialisation required. We will not recover if this call + fails, but we will report the failure. */ + prvInitialiseTaskLists(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* If the scheduler is not already running, make this task the + current task if it is the highest priority task to be created + so far. */ + if( xSchedulerRunning == pdFALSE ) + { + if( pxCurrentTCB->uxPriority <= pxNewTCB->uxPriority ) + { + pxCurrentTCB = pxNewTCB; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + uxTaskNumber++; + + #if ( configUSE_TRACE_FACILITY == 1 ) + { + /* Add a counter into the TCB for tracing only. */ + pxNewTCB->uxTCBNumber = uxTaskNumber; + } + #endif /* configUSE_TRACE_FACILITY */ + traceTASK_CREATE( pxNewTCB ); + + prvAddTaskToReadyList( pxNewTCB ); + + portSETUP_TCB( pxNewTCB ); + } + taskEXIT_CRITICAL(); + + if( xSchedulerRunning != pdFALSE ) + { + /* If the created task is of a higher priority than the current task + then it should run now. */ + if( pxCurrentTCB->uxPriority < pxNewTCB->uxPriority ) + { + taskYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } +} +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskDelete == 1 ) + + void vTaskDelete( TaskHandle_t xTaskToDelete ) + { + TCB_t *pxTCB; + + taskENTER_CRITICAL(); + { + /* If null is passed in here then it is the calling task that is + being deleted. */ + pxTCB = prvGetTCBFromHandle( xTaskToDelete ); + + /* Remove task from the ready list. */ + if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) + { + taskRESET_READY_PRIORITY( pxTCB->uxPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Is the task waiting on an event also? */ + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) + { + ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Increment the uxTaskNumber also so kernel aware debuggers can + detect that the task lists need re-generating. This is done before + portPRE_TASK_DELETE_HOOK() as in the Windows port that macro will + not return. */ + uxTaskNumber++; + + if( pxTCB == pxCurrentTCB ) + { + /* A task is deleting itself. This cannot complete within the + task itself, as a context switch to another task is required. + Place the task in the termination list. The idle task will + check the termination list and free up any memory allocated by + the scheduler for the TCB and stack of the deleted task. */ + vListInsertEnd( &xTasksWaitingTermination, &( pxTCB->xStateListItem ) ); + + /* Increment the ucTasksDeleted variable so the idle task knows + there is a task that has been deleted and that it should therefore + check the xTasksWaitingTermination list. */ + ++uxDeletedTasksWaitingCleanUp; + + /* The pre-delete hook is primarily for the Windows simulator, + in which Windows specific clean up operations are performed, + after which it is not possible to yield away from this task - + hence xYieldPending is used to latch that a context switch is + required. */ + portPRE_TASK_DELETE_HOOK( pxTCB, &xYieldPending ); + } + else + { + --uxCurrentNumberOfTasks; + prvDeleteTCB( pxTCB ); + + /* Reset the next expected unblock time in case it referred to + the task that has just been deleted. */ + prvResetNextTaskUnblockTime(); + } + + traceTASK_DELETE( pxTCB ); + } + taskEXIT_CRITICAL(); + + /* Force a reschedule if it is the currently running task that has just + been deleted. */ + if( xSchedulerRunning != pdFALSE ) + { + if( pxTCB == pxCurrentTCB ) + { + configASSERT( uxSchedulerSuspended == 0 ); + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + +#endif /* INCLUDE_vTaskDelete */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskDelayUntil == 1 ) + + void vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, const TickType_t xTimeIncrement ) + { + TickType_t xTimeToWake; + BaseType_t xAlreadyYielded, xShouldDelay = pdFALSE; + + configASSERT( pxPreviousWakeTime ); + configASSERT( ( xTimeIncrement > 0U ) ); + configASSERT( uxSchedulerSuspended == 0 ); + + vTaskSuspendAll(); + { + /* Minor optimisation. The tick count cannot change in this + block. */ + const TickType_t xConstTickCount = xTickCount; + + /* Generate the tick time at which the task wants to wake. */ + xTimeToWake = *pxPreviousWakeTime + xTimeIncrement; + + if( xConstTickCount < *pxPreviousWakeTime ) + { + /* The tick count has overflowed since this function was + lasted called. In this case the only time we should ever + actually delay is if the wake time has also overflowed, + and the wake time is greater than the tick time. When this + is the case it is as if neither time had overflowed. */ + if( ( xTimeToWake < *pxPreviousWakeTime ) && ( xTimeToWake > xConstTickCount ) ) + { + xShouldDelay = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* The tick time has not overflowed. In this case we will + delay if either the wake time has overflowed, and/or the + tick time is less than the wake time. */ + if( ( xTimeToWake < *pxPreviousWakeTime ) || ( xTimeToWake > xConstTickCount ) ) + { + xShouldDelay = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + /* Update the wake time ready for the next call. */ + *pxPreviousWakeTime = xTimeToWake; + + if( xShouldDelay != pdFALSE ) + { + traceTASK_DELAY_UNTIL( xTimeToWake ); + + /* prvAddCurrentTaskToDelayedList() needs the block time, not + the time to wake, so subtract the current tick count. */ + prvAddCurrentTaskToDelayedList( xTimeToWake - xConstTickCount, pdFALSE ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + xAlreadyYielded = xTaskResumeAll(); + + /* Force a reschedule if xTaskResumeAll has not already done so, we may + have put ourselves to sleep. */ + if( xAlreadyYielded == pdFALSE ) + { + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + +#endif /* INCLUDE_vTaskDelayUntil */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskDelay == 1 ) + + void vTaskDelay( const TickType_t xTicksToDelay ) + { + BaseType_t xAlreadyYielded = pdFALSE; + + /* A delay time of zero just forces a reschedule. */ + if( xTicksToDelay > ( TickType_t ) 0U ) + { + configASSERT( uxSchedulerSuspended == 0 ); + vTaskSuspendAll(); + { + traceTASK_DELAY(); + + /* A task that is removed from the event list while the + scheduler is suspended will not get placed in the ready + list or removed from the blocked list until the scheduler + is resumed. + + This task cannot be in an event list as it is the currently + executing task. */ + prvAddCurrentTaskToDelayedList( xTicksToDelay, pdFALSE ); + } + xAlreadyYielded = xTaskResumeAll(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Force a reschedule if xTaskResumeAll has not already done so, we may + have put ourselves to sleep. */ + if( xAlreadyYielded == pdFALSE ) + { + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + +#endif /* INCLUDE_vTaskDelay */ +/*-----------------------------------------------------------*/ + +#if( ( INCLUDE_eTaskGetState == 1 ) || ( configUSE_TRACE_FACILITY == 1 ) ) + + eTaskState eTaskGetState( TaskHandle_t xTask ) + { + eTaskState eReturn; + List_t *pxStateList; + const TCB_t * const pxTCB = ( TCB_t * ) xTask; + + configASSERT( pxTCB ); + + if( pxTCB == pxCurrentTCB ) + { + /* The task calling this function is querying its own state. */ + eReturn = eRunning; + } + else + { + taskENTER_CRITICAL(); + { + pxStateList = ( List_t * ) listLIST_ITEM_CONTAINER( &( pxTCB->xStateListItem ) ); + } + taskEXIT_CRITICAL(); + + if( ( pxStateList == pxDelayedTaskList ) || ( pxStateList == pxOverflowDelayedTaskList ) ) + { + /* The task being queried is referenced from one of the Blocked + lists. */ + eReturn = eBlocked; + } + + #if ( INCLUDE_vTaskSuspend == 1 ) + else if( pxStateList == &xSuspendedTaskList ) + { + /* The task being queried is referenced from the suspended + list. Is it genuinely suspended or is it block + indefinitely? */ + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) == NULL ) + { + eReturn = eSuspended; + } + else + { + eReturn = eBlocked; + } + } + #endif + + #if ( INCLUDE_vTaskDelete == 1 ) + else if( ( pxStateList == &xTasksWaitingTermination ) || ( pxStateList == NULL ) ) + { + /* The task being queried is referenced from the deleted + tasks list, or it is not referenced from any lists at + all. */ + eReturn = eDeleted; + } + #endif + + else /*lint !e525 Negative indentation is intended to make use of pre-processor clearer. */ + { + /* If the task is not in any other state, it must be in the + Ready (including pending ready) state. */ + eReturn = eReady; + } + } + + return eReturn; + } /*lint !e818 xTask cannot be a pointer to const because it is a typedef. */ + +#endif /* INCLUDE_eTaskGetState */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_uxTaskPriorityGet == 1 ) + + UBaseType_t uxTaskPriorityGet( TaskHandle_t xTask ) + { + TCB_t *pxTCB; + UBaseType_t uxReturn; + + taskENTER_CRITICAL(); + { + /* If null is passed in here then it is the priority of the that + called uxTaskPriorityGet() that is being queried. */ + pxTCB = prvGetTCBFromHandle( xTask ); + uxReturn = pxTCB->uxPriority; + } + taskEXIT_CRITICAL(); + + return uxReturn; + } + +#endif /* INCLUDE_uxTaskPriorityGet */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_uxTaskPriorityGet == 1 ) + + UBaseType_t uxTaskPriorityGetFromISR( TaskHandle_t xTask ) + { + TCB_t *pxTCB; + UBaseType_t uxReturn, uxSavedInterruptState; + + /* RTOS ports that support interrupt nesting have the concept of a + maximum system call (or maximum API call) interrupt priority. + Interrupts that are above the maximum system call priority are keep + permanently enabled, even when the RTOS kernel is in a critical section, + but cannot make any calls to FreeRTOS API functions. If configASSERT() + is defined in FreeRTOSConfig.h then + portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + failure if a FreeRTOS API function is called from an interrupt that has + been assigned a priority above the configured maximum system call + priority. Only FreeRTOS functions that end in FromISR can be called + from interrupts that have been assigned a priority at or (logically) + below the maximum system call interrupt priority. FreeRTOS maintains a + separate interrupt safe API to ensure interrupt entry is as fast and as + simple as possible. More information (albeit Cortex-M specific) is + provided on the following link: + http://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + uxSavedInterruptState = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* If null is passed in here then it is the priority of the calling + task that is being queried. */ + pxTCB = prvGetTCBFromHandle( xTask ); + uxReturn = pxTCB->uxPriority; + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptState ); + + return uxReturn; + } + +#endif /* INCLUDE_uxTaskPriorityGet */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskPrioritySet == 1 ) + + void vTaskPrioritySet( TaskHandle_t xTask, UBaseType_t uxNewPriority ) + { + TCB_t *pxTCB; + UBaseType_t uxCurrentBasePriority, uxPriorityUsedOnEntry; + BaseType_t xYieldRequired = pdFALSE; + + configASSERT( ( uxNewPriority < configMAX_PRIORITIES ) ); + + /* Ensure the new priority is valid. */ + if( uxNewPriority >= ( UBaseType_t ) configMAX_PRIORITIES ) + { + uxNewPriority = ( UBaseType_t ) configMAX_PRIORITIES - ( UBaseType_t ) 1U; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + taskENTER_CRITICAL(); + { + /* If null is passed in here then it is the priority of the calling + task that is being changed. */ + pxTCB = prvGetTCBFromHandle( xTask ); + + traceTASK_PRIORITY_SET( pxTCB, uxNewPriority ); + + #if ( configUSE_MUTEXES == 1 ) + { + uxCurrentBasePriority = pxTCB->uxBasePriority; + } + #else + { + uxCurrentBasePriority = pxTCB->uxPriority; + } + #endif + + if( uxCurrentBasePriority != uxNewPriority ) + { + /* The priority change may have readied a task of higher + priority than the calling task. */ + if( uxNewPriority > uxCurrentBasePriority ) + { + if( pxTCB != pxCurrentTCB ) + { + /* The priority of a task other than the currently + running task is being raised. Is the priority being + raised above that of the running task? */ + if( uxNewPriority >= pxCurrentTCB->uxPriority ) + { + xYieldRequired = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* The priority of the running task is being raised, + but the running task must already be the highest + priority task able to run so no yield is required. */ + } + } + else if( pxTCB == pxCurrentTCB ) + { + /* Setting the priority of the running task down means + there may now be another task of higher priority that + is ready to execute. */ + xYieldRequired = pdTRUE; + } + else + { + /* Setting the priority of any other task down does not + require a yield as the running task must be above the + new priority of the task being modified. */ + } + + /* Remember the ready list the task might be referenced from + before its uxPriority member is changed so the + taskRESET_READY_PRIORITY() macro can function correctly. */ + uxPriorityUsedOnEntry = pxTCB->uxPriority; + + #if ( configUSE_MUTEXES == 1 ) + { + /* Only change the priority being used if the task is not + currently using an inherited priority. */ + if( pxTCB->uxBasePriority == pxTCB->uxPriority ) + { + pxTCB->uxPriority = uxNewPriority; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* The base priority gets set whatever. */ + pxTCB->uxBasePriority = uxNewPriority; + } + #else + { + pxTCB->uxPriority = uxNewPriority; + } + #endif + + /* Only reset the event list item value if the value is not + being used for anything else. */ + if( ( listGET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ) ) & taskEVENT_LIST_ITEM_VALUE_IN_USE ) == 0UL ) + { + listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) uxNewPriority ) ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* If the task is in the blocked or suspended list we need do + nothing more than change it's priority variable. However, if + the task is in a ready list it needs to be removed and placed + in the list appropriate to its new priority. */ + if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ uxPriorityUsedOnEntry ] ), &( pxTCB->xStateListItem ) ) != pdFALSE ) + { + /* The task is currently in its ready list - remove before adding + it to it's new ready list. As we are in a critical section we + can do this even if the scheduler is suspended. */ + if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) + { + /* It is known that the task is in its ready list so + there is no need to check again and the port level + reset macro can be called directly. */ + portRESET_READY_PRIORITY( uxPriorityUsedOnEntry, uxTopReadyPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + prvAddTaskToReadyList( pxTCB ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( xYieldRequired != pdFALSE ) + { + taskYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Remove compiler warning about unused variables when the port + optimised task selection is not being used. */ + ( void ) uxPriorityUsedOnEntry; + } + } + taskEXIT_CRITICAL(); + } + +#endif /* INCLUDE_vTaskPrioritySet */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskSuspend == 1 ) + + void vTaskSuspend( TaskHandle_t xTaskToSuspend ) + { + TCB_t *pxTCB; + + taskENTER_CRITICAL(); + { + /* If null is passed in here then it is the running task that is + being suspended. */ + pxTCB = prvGetTCBFromHandle( xTaskToSuspend ); + + traceTASK_SUSPEND( pxTCB ); + + /* Remove task from the ready/delayed list and place in the + suspended list. */ + if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) + { + taskRESET_READY_PRIORITY( pxTCB->uxPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Is the task waiting on an event also? */ + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) + { + ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + vListInsertEnd( &xSuspendedTaskList, &( pxTCB->xStateListItem ) ); + } + taskEXIT_CRITICAL(); + + if( xSchedulerRunning != pdFALSE ) + { + /* Reset the next expected unblock time in case it referred to the + task that is now in the Suspended state. */ + taskENTER_CRITICAL(); + { + prvResetNextTaskUnblockTime(); + } + taskEXIT_CRITICAL(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( pxTCB == pxCurrentTCB ) + { + if( xSchedulerRunning != pdFALSE ) + { + /* The current task has just been suspended. */ + configASSERT( uxSchedulerSuspended == 0 ); + portYIELD_WITHIN_API(); + } + else + { + /* The scheduler is not running, but the task that was pointed + to by pxCurrentTCB has just been suspended and pxCurrentTCB + must be adjusted to point to a different task. */ + if( listCURRENT_LIST_LENGTH( &xSuspendedTaskList ) == uxCurrentNumberOfTasks ) + { + /* No other tasks are ready, so set pxCurrentTCB back to + NULL so when the next task is created pxCurrentTCB will + be set to point to it no matter what its relative priority + is. */ + pxCurrentTCB = NULL; + } + else + { + vTaskSwitchContext(); + } + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + +#endif /* INCLUDE_vTaskSuspend */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskSuspend == 1 ) + + static BaseType_t prvTaskIsTaskSuspended( const TaskHandle_t xTask ) + { + BaseType_t xReturn = pdFALSE; + const TCB_t * const pxTCB = ( TCB_t * ) xTask; + + /* Accesses xPendingReadyList so must be called from a critical + section. */ + + /* It does not make sense to check if the calling task is suspended. */ + configASSERT( xTask ); + + /* Is the task being resumed actually in the suspended list? */ + if( listIS_CONTAINED_WITHIN( &xSuspendedTaskList, &( pxTCB->xStateListItem ) ) != pdFALSE ) + { + /* Has the task already been resumed from within an ISR? */ + if( listIS_CONTAINED_WITHIN( &xPendingReadyList, &( pxTCB->xEventListItem ) ) == pdFALSE ) + { + /* Is it in the suspended list because it is in the Suspended + state, or because is is blocked with no timeout? */ + if( listIS_CONTAINED_WITHIN( NULL, &( pxTCB->xEventListItem ) ) != pdFALSE ) + { + xReturn = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return xReturn; + } /*lint !e818 xTask cannot be a pointer to const because it is a typedef. */ + +#endif /* INCLUDE_vTaskSuspend */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskSuspend == 1 ) + + void vTaskResume( TaskHandle_t xTaskToResume ) + { + TCB_t * const pxTCB = ( TCB_t * ) xTaskToResume; + + /* It does not make sense to resume the calling task. */ + configASSERT( xTaskToResume ); + + /* The parameter cannot be NULL as it is impossible to resume the + currently executing task. */ + if( ( pxTCB != NULL ) && ( pxTCB != pxCurrentTCB ) ) + { + taskENTER_CRITICAL(); + { + if( prvTaskIsTaskSuspended( pxTCB ) != pdFALSE ) + { + traceTASK_RESUME( pxTCB ); + + /* As we are in a critical section we can access the ready + lists even if the scheduler is suspended. */ + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxTCB ); + + /* We may have just resumed a higher priority task. */ + if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority ) + { + /* This yield may not cause the task just resumed to run, + but will leave the lists in the correct state for the + next yield. */ + taskYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + +#endif /* INCLUDE_vTaskSuspend */ + +/*-----------------------------------------------------------*/ + +#if ( ( INCLUDE_xTaskResumeFromISR == 1 ) && ( INCLUDE_vTaskSuspend == 1 ) ) + + BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume ) + { + BaseType_t xYieldRequired = pdFALSE; + TCB_t * const pxTCB = ( TCB_t * ) xTaskToResume; + UBaseType_t uxSavedInterruptStatus; + + configASSERT( xTaskToResume ); + + /* RTOS ports that support interrupt nesting have the concept of a + maximum system call (or maximum API call) interrupt priority. + Interrupts that are above the maximum system call priority are keep + permanently enabled, even when the RTOS kernel is in a critical section, + but cannot make any calls to FreeRTOS API functions. If configASSERT() + is defined in FreeRTOSConfig.h then + portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + failure if a FreeRTOS API function is called from an interrupt that has + been assigned a priority above the configured maximum system call + priority. Only FreeRTOS functions that end in FromISR can be called + from interrupts that have been assigned a priority at or (logically) + below the maximum system call interrupt priority. FreeRTOS maintains a + separate interrupt safe API to ensure interrupt entry is as fast and as + simple as possible. More information (albeit Cortex-M specific) is + provided on the following link: + http://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + if( prvTaskIsTaskSuspended( pxTCB ) != pdFALSE ) + { + traceTASK_RESUME_FROM_ISR( pxTCB ); + + /* Check the ready lists can be accessed. */ + if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) + { + /* Ready lists can be accessed so move the task from the + suspended list to the ready list directly. */ + if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority ) + { + xYieldRequired = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxTCB ); + } + else + { + /* The delayed or ready lists cannot be accessed so the task + is held in the pending ready list until the scheduler is + unsuspended. */ + vListInsertEnd( &( xPendingReadyList ), &( pxTCB->xEventListItem ) ); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xYieldRequired; + } + +#endif /* ( ( INCLUDE_xTaskResumeFromISR == 1 ) && ( INCLUDE_vTaskSuspend == 1 ) ) */ +/*-----------------------------------------------------------*/ + +void vTaskStartScheduler( void ) +{ +BaseType_t xReturn; + + /* Add the idle task at the lowest priority. */ + #if( configSUPPORT_STATIC_ALLOCATION == 1 ) + { + StaticTask_t *pxIdleTaskTCBBuffer = NULL; + StackType_t *pxIdleTaskStackBuffer = NULL; + uint32_t ulIdleTaskStackSize; + + /* The Idle task is created using user provided RAM - obtain the + address of the RAM then create the idle task. */ + vApplicationGetIdleTaskMemory( &pxIdleTaskTCBBuffer, &pxIdleTaskStackBuffer, &ulIdleTaskStackSize ); + xIdleTaskHandle = xTaskCreateStatic( prvIdleTask, + "IDLE", + ulIdleTaskStackSize, + ( void * ) NULL, + ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), + pxIdleTaskStackBuffer, + pxIdleTaskTCBBuffer ); /*lint !e961 MISRA exception, justified as it is not a redundant explicit cast to all supported compilers. */ + + if( xIdleTaskHandle != NULL ) + { + xReturn = pdPASS; + } + else + { + xReturn = pdFAIL; + } + } + #else + { + /* The Idle task is being created using dynamically allocated RAM. */ + xReturn = xTaskCreate( prvIdleTask, + "IDLE", configMINIMAL_STACK_SIZE, + ( void * ) NULL, + ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), + &xIdleTaskHandle ); /*lint !e961 MISRA exception, justified as it is not a redundant explicit cast to all supported compilers. */ + } + #endif /* configSUPPORT_STATIC_ALLOCATION */ + + #if ( configUSE_TIMERS == 1 ) + { + if( xReturn == pdPASS ) + { + xReturn = xTimerCreateTimerTask(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_TIMERS */ + + if( xReturn == pdPASS ) + { + /* Interrupts are turned off here, to ensure a tick does not occur + before or during the call to xPortStartScheduler(). The stacks of + the created tasks contain a status word with interrupts switched on + so interrupts will automatically get re-enabled when the first task + starts to run. */ + portDISABLE_INTERRUPTS(); + + #if ( configUSE_NEWLIB_REENTRANT == 1 ) + { + /* Switch Newlib's _impure_ptr variable to point to the _reent + structure specific to the task that will run first. */ + _impure_ptr = &( pxCurrentTCB->xNewLib_reent ); + } + #endif /* configUSE_NEWLIB_REENTRANT */ + + xNextTaskUnblockTime = portMAX_DELAY; + xSchedulerRunning = pdTRUE; + xTickCount = ( TickType_t ) 0U; + + /* If configGENERATE_RUN_TIME_STATS is defined then the following + macro must be defined to configure the timer/counter used to generate + the run time counter time base. */ + portCONFIGURE_TIMER_FOR_RUN_TIME_STATS(); + + /* Setting up the timer tick is hardware specific and thus in the + portable interface. */ + if( xPortStartScheduler() != pdFALSE ) + { + /* Should not reach here as if the scheduler is running the + function will not return. */ + } + else + { + /* Should only reach here if a task calls xTaskEndScheduler(). */ + } + } + else + { + /* This line will only be reached if the kernel could not be started, + because there was not enough FreeRTOS heap to create the idle task + or the timer task. */ + configASSERT( xReturn != errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY ); + } + + /* Prevent compiler warnings if INCLUDE_xTaskGetIdleTaskHandle is set to 0, + meaning xIdleTaskHandle is not used anywhere else. */ + ( void ) xIdleTaskHandle; +} +/*-----------------------------------------------------------*/ + +void vTaskEndScheduler( void ) +{ + /* Stop the scheduler interrupts and call the portable scheduler end + routine so the original ISRs can be restored if necessary. The port + layer must ensure interrupts enable bit is left in the correct state. */ + portDISABLE_INTERRUPTS(); + xSchedulerRunning = pdFALSE; + vPortEndScheduler(); +} +/*----------------------------------------------------------*/ + +void vTaskSuspendAll( void ) +{ + /* A critical section is not required as the variable is of type + BaseType_t. Please read Richard Barry's reply in the following link to a + post in the FreeRTOS support forum before reporting this as a bug! - + http://goo.gl/wu4acr */ + ++uxSchedulerSuspended; +} +/*----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE != 0 ) + + static TickType_t prvGetExpectedIdleTime( void ) + { + TickType_t xReturn; + UBaseType_t uxHigherPriorityReadyTasks = pdFALSE; + + /* uxHigherPriorityReadyTasks takes care of the case where + configUSE_PREEMPTION is 0, so there may be tasks above the idle priority + task that are in the Ready state, even though the idle task is + running. */ + #if( configUSE_PORT_OPTIMISED_TASK_SELECTION == 0 ) + { + if( uxTopReadyPriority > tskIDLE_PRIORITY ) + { + uxHigherPriorityReadyTasks = pdTRUE; + } + } + #else + { + const UBaseType_t uxLeastSignificantBit = ( UBaseType_t ) 0x01; + + /* When port optimised task selection is used the uxTopReadyPriority + variable is used as a bit map. If bits other than the least + significant bit are set then there are tasks that have a priority + above the idle priority that are in the Ready state. This takes + care of the case where the co-operative scheduler is in use. */ + if( uxTopReadyPriority > uxLeastSignificantBit ) + { + uxHigherPriorityReadyTasks = pdTRUE; + } + } + #endif + + if( pxCurrentTCB->uxPriority > tskIDLE_PRIORITY ) + { + xReturn = 0; + } + else if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ tskIDLE_PRIORITY ] ) ) > 1 ) + { + /* There are other idle priority tasks in the ready state. If + time slicing is used then the very next tick interrupt must be + processed. */ + xReturn = 0; + } + else if( uxHigherPriorityReadyTasks != pdFALSE ) + { + /* There are tasks in the Ready state that have a priority above the + idle priority. This path can only be reached if + configUSE_PREEMPTION is 0. */ + xReturn = 0; + } + else + { + xReturn = xNextTaskUnblockTime - xTickCount; + } + + return xReturn; + } + +#endif /* configUSE_TICKLESS_IDLE */ +/*----------------------------------------------------------*/ + +BaseType_t xTaskResumeAll( void ) +{ +TCB_t *pxTCB = NULL; +BaseType_t xAlreadyYielded = pdFALSE; + + /* If uxSchedulerSuspended is zero then this function does not match a + previous call to vTaskSuspendAll(). */ + configASSERT( uxSchedulerSuspended ); + + /* It is possible that an ISR caused a task to be removed from an event + list while the scheduler was suspended. If this was the case then the + removed task will have been added to the xPendingReadyList. Once the + scheduler has been resumed it is safe to move all the pending ready + tasks from this list into their appropriate ready list. */ + taskENTER_CRITICAL(); + { + --uxSchedulerSuspended; + + if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) + { + if( uxCurrentNumberOfTasks > ( UBaseType_t ) 0U ) + { + /* Move any readied tasks from the pending list into the + appropriate ready list. */ + while( listLIST_IS_EMPTY( &xPendingReadyList ) == pdFALSE ) + { + pxTCB = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( ( &xPendingReadyList ) ); + ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxTCB ); + + /* If the moved task has a priority higher than the current + task then a yield must be performed. */ + if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority ) + { + xYieldPending = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + if( pxTCB != NULL ) + { + /* A task was unblocked while the scheduler was suspended, + which may have prevented the next unblock time from being + re-calculated, in which case re-calculate it now. Mainly + important for low power tickless implementations, where + this can prevent an unnecessary exit from low power + state. */ + prvResetNextTaskUnblockTime(); + } + + /* If any ticks occurred while the scheduler was suspended then + they should be processed now. This ensures the tick count does + not slip, and that any delayed tasks are resumed at the correct + time. */ + { + UBaseType_t uxPendedCounts = uxPendedTicks; /* Non-volatile copy. */ + + if( uxPendedCounts > ( UBaseType_t ) 0U ) + { + do + { + if( xTaskIncrementTick() != pdFALSE ) + { + xYieldPending = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + --uxPendedCounts; + } while( uxPendedCounts > ( UBaseType_t ) 0U ); + + uxPendedTicks = 0; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + if( xYieldPending != pdFALSE ) + { + #if( configUSE_PREEMPTION != 0 ) + { + xAlreadyYielded = pdTRUE; + } + #endif + taskYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + + return xAlreadyYielded; +} +/*-----------------------------------------------------------*/ + +TickType_t xTaskGetTickCount( void ) +{ +TickType_t xTicks; + + /* Critical section required if running on a 16 bit processor. */ + portTICK_TYPE_ENTER_CRITICAL(); + { + xTicks = xTickCount; + } + portTICK_TYPE_EXIT_CRITICAL(); + + return xTicks; +} +/*-----------------------------------------------------------*/ + +TickType_t xTaskGetTickCountFromISR( void ) +{ +TickType_t xReturn; +UBaseType_t uxSavedInterruptStatus; + + /* RTOS ports that support interrupt nesting have the concept of a maximum + system call (or maximum API call) interrupt priority. Interrupts that are + above the maximum system call priority are kept permanently enabled, even + when the RTOS kernel is in a critical section, but cannot make any calls to + FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h + then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + failure if a FreeRTOS API function is called from an interrupt that has been + assigned a priority above the configured maximum system call priority. + Only FreeRTOS functions that end in FromISR can be called from interrupts + that have been assigned a priority at or (logically) below the maximum + system call interrupt priority. FreeRTOS maintains a separate interrupt + safe API to ensure interrupt entry is as fast and as simple as possible. + More information (albeit Cortex-M specific) is provided on the following + link: http://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + uxSavedInterruptStatus = portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR(); + { + xReturn = xTickCount; + } + portTICK_TYPE_CLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +UBaseType_t uxTaskGetNumberOfTasks( void ) +{ + /* A critical section is not required because the variables are of type + BaseType_t. */ + return uxCurrentNumberOfTasks; +} +/*-----------------------------------------------------------*/ + +char *pcTaskGetName( TaskHandle_t xTaskToQuery ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ +{ +TCB_t *pxTCB; + + /* If null is passed in here then the name of the calling task is being + queried. */ + pxTCB = prvGetTCBFromHandle( xTaskToQuery ); + configASSERT( pxTCB ); + return &( pxTCB->pcTaskName[ 0 ] ); +} +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_xTaskGetHandle == 1 ) + + static TCB_t *prvSearchForNameWithinSingleList( List_t *pxList, const char pcNameToQuery[] ) + { + TCB_t *pxNextTCB, *pxFirstTCB, *pxReturn = NULL; + UBaseType_t x; + char cNextChar; + + /* This function is called with the scheduler suspended. */ + + if( listCURRENT_LIST_LENGTH( pxList ) > ( UBaseType_t ) 0 ) + { + listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, pxList ); + + do + { + listGET_OWNER_OF_NEXT_ENTRY( pxNextTCB, pxList ); + + /* Check each character in the name looking for a match or + mismatch. */ + for( x = ( UBaseType_t ) 0; x < ( UBaseType_t ) configMAX_TASK_NAME_LEN; x++ ) + { + cNextChar = pxNextTCB->pcTaskName[ x ]; + + if( cNextChar != pcNameToQuery[ x ] ) + { + /* Characters didn't match. */ + break; + } + else if( cNextChar == 0x00 ) + { + /* Both strings terminated, a match must have been + found. */ + pxReturn = pxNextTCB; + break; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + if( pxReturn != NULL ) + { + /* The handle has been found. */ + break; + } + + } while( pxNextTCB != pxFirstTCB ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return pxReturn; + } + +#endif /* INCLUDE_xTaskGetHandle */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_xTaskGetHandle == 1 ) + + TaskHandle_t xTaskGetHandle( const char *pcNameToQuery ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + { + UBaseType_t uxQueue = configMAX_PRIORITIES; + TCB_t* pxTCB; + + /* Task names will be truncated to configMAX_TASK_NAME_LEN - 1 bytes. */ + configASSERT( strlen( pcNameToQuery ) < configMAX_TASK_NAME_LEN ); + + vTaskSuspendAll(); + { + /* Search the ready lists. */ + do + { + uxQueue--; + pxTCB = prvSearchForNameWithinSingleList( ( List_t * ) &( pxReadyTasksLists[ uxQueue ] ), pcNameToQuery ); + + if( pxTCB != NULL ) + { + /* Found the handle. */ + break; + } + + } while( uxQueue > ( UBaseType_t ) tskIDLE_PRIORITY ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + + /* Search the delayed lists. */ + if( pxTCB == NULL ) + { + pxTCB = prvSearchForNameWithinSingleList( ( List_t * ) pxDelayedTaskList, pcNameToQuery ); + } + + if( pxTCB == NULL ) + { + pxTCB = prvSearchForNameWithinSingleList( ( List_t * ) pxOverflowDelayedTaskList, pcNameToQuery ); + } + + #if ( INCLUDE_vTaskSuspend == 1 ) + { + if( pxTCB == NULL ) + { + /* Search the suspended list. */ + pxTCB = prvSearchForNameWithinSingleList( &xSuspendedTaskList, pcNameToQuery ); + } + } + #endif + + #if( INCLUDE_vTaskDelete == 1 ) + { + if( pxTCB == NULL ) + { + /* Search the deleted list. */ + pxTCB = prvSearchForNameWithinSingleList( &xTasksWaitingTermination, pcNameToQuery ); + } + } + #endif + } + ( void ) xTaskResumeAll(); + + return ( TaskHandle_t ) pxTCB; + } + +#endif /* INCLUDE_xTaskGetHandle */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + UBaseType_t uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray, const UBaseType_t uxArraySize, uint32_t * const pulTotalRunTime ) + { + UBaseType_t uxTask = 0, uxQueue = configMAX_PRIORITIES; + + vTaskSuspendAll(); + { + /* Is there a space in the array for each task in the system? */ + if( uxArraySize >= uxCurrentNumberOfTasks ) + { + /* Fill in an TaskStatus_t structure with information on each + task in the Ready state. */ + do + { + uxQueue--; + uxTask += prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), &( pxReadyTasksLists[ uxQueue ] ), eReady ); + + } while( uxQueue > ( UBaseType_t ) tskIDLE_PRIORITY ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + + /* Fill in an TaskStatus_t structure with information on each + task in the Blocked state. */ + uxTask += prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), ( List_t * ) pxDelayedTaskList, eBlocked ); + uxTask += prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), ( List_t * ) pxOverflowDelayedTaskList, eBlocked ); + + #if( INCLUDE_vTaskDelete == 1 ) + { + /* Fill in an TaskStatus_t structure with information on + each task that has been deleted but not yet cleaned up. */ + uxTask += prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), &xTasksWaitingTermination, eDeleted ); + } + #endif + + #if ( INCLUDE_vTaskSuspend == 1 ) + { + /* Fill in an TaskStatus_t structure with information on + each task in the Suspended state. */ + uxTask += prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), &xSuspendedTaskList, eSuspended ); + } + #endif + + #if ( configGENERATE_RUN_TIME_STATS == 1) + { + if( pulTotalRunTime != NULL ) + { + #ifdef portALT_GET_RUN_TIME_COUNTER_VALUE + portALT_GET_RUN_TIME_COUNTER_VALUE( ( *pulTotalRunTime ) ); + #else + *pulTotalRunTime = portGET_RUN_TIME_COUNTER_VALUE(); + #endif + } + } + #else + { + if( pulTotalRunTime != NULL ) + { + *pulTotalRunTime = 0; + } + } + #endif + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + ( void ) xTaskResumeAll(); + + return uxTask; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*----------------------------------------------------------*/ + +#if ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) + + TaskHandle_t xTaskGetIdleTaskHandle( void ) + { + /* If xTaskGetIdleTaskHandle() is called before the scheduler has been + started, then xIdleTaskHandle will be NULL. */ + configASSERT( ( xIdleTaskHandle != NULL ) ); + return xIdleTaskHandle; + } + +#endif /* INCLUDE_xTaskGetIdleTaskHandle */ +/*----------------------------------------------------------*/ + +/* This conditional compilation should use inequality to 0, not equality to 1. +This is to ensure vTaskStepTick() is available when user defined low power mode +implementations require configUSE_TICKLESS_IDLE to be set to a value other than +1. */ +#if ( configUSE_TICKLESS_IDLE != 0 ) + + void vTaskStepTick( const TickType_t xTicksToJump ) + { + /* Correct the tick count value after a period during which the tick + was suppressed. Note this does *not* call the tick hook function for + each stepped tick. */ + configASSERT( ( xTickCount + xTicksToJump ) <= xNextTaskUnblockTime ); + xTickCount += xTicksToJump; + traceINCREASE_TICK_COUNT( xTicksToJump ); + } + +#endif /* configUSE_TICKLESS_IDLE */ +/*----------------------------------------------------------*/ + +#if ( INCLUDE_xTaskAbortDelay == 1 ) + + BaseType_t xTaskAbortDelay( TaskHandle_t xTask ) + { + TCB_t *pxTCB = ( TCB_t * ) xTask; + BaseType_t xReturn = pdFALSE; + + configASSERT( pxTCB ); + + vTaskSuspendAll(); + { + /* A task can only be prematurely removed from the Blocked state if + it is actually in the Blocked state. */ + if( eTaskGetState( xTask ) == eBlocked ) + { + /* Remove the reference to the task from the blocked list. An + interrupt won't touch the xStateListItem because the + scheduler is suspended. */ + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + + /* Is the task waiting on an event also? If so remove it from + the event list too. Interrupts can touch the event list item, + even though the scheduler is suspended, so a critical section + is used. */ + taskENTER_CRITICAL(); + { + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) + { + ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); + pxTCB->ucDelayAborted = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + + /* Place the unblocked task into the appropriate ready list. */ + prvAddTaskToReadyList( pxTCB ); + + /* A task being unblocked cannot cause an immediate context + switch if preemption is turned off. */ + #if ( configUSE_PREEMPTION == 1 ) + { + /* Preemption is on, but a context switch should only be + performed if the unblocked task has a priority that is + equal to or higher than the currently executing task. */ + if( pxTCB->uxPriority > pxCurrentTCB->uxPriority ) + { + /* Pend the yield to be performed when the scheduler + is unsuspended. */ + xYieldPending = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_PREEMPTION */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + xTaskResumeAll(); + + return xReturn; + } + +#endif /* INCLUDE_xTaskAbortDelay */ +/*----------------------------------------------------------*/ + +BaseType_t xTaskIncrementTick( void ) +{ +TCB_t * pxTCB; +TickType_t xItemValue; +BaseType_t xSwitchRequired = pdFALSE; + + /* Called by the portable layer each time a tick interrupt occurs. + Increments the tick then checks to see if the new tick value will cause any + tasks to be unblocked. */ + traceTASK_INCREMENT_TICK( xTickCount ); + if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) + { + /* Minor optimisation. The tick count cannot change in this + block. */ + const TickType_t xConstTickCount = xTickCount + 1; + + /* Increment the RTOS tick, switching the delayed and overflowed + delayed lists if it wraps to 0. */ + xTickCount = xConstTickCount; + + if( xConstTickCount == ( TickType_t ) 0U ) + { + taskSWITCH_DELAYED_LISTS(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* See if this tick has made a timeout expire. Tasks are stored in + the queue in the order of their wake time - meaning once one task + has been found whose block time has not expired there is no need to + look any further down the list. */ + if( xConstTickCount >= xNextTaskUnblockTime ) + { + for( ;; ) + { + if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE ) + { + /* The delayed list is empty. Set xNextTaskUnblockTime + to the maximum possible value so it is extremely + unlikely that the + if( xTickCount >= xNextTaskUnblockTime ) test will pass + next time through. */ + xNextTaskUnblockTime = portMAX_DELAY; /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + break; + } + else + { + /* The delayed list is not empty, get the value of the + item at the head of the delayed list. This is the time + at which the task at the head of the delayed list must + be removed from the Blocked state. */ + pxTCB = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList ); + xItemValue = listGET_LIST_ITEM_VALUE( &( pxTCB->xStateListItem ) ); + + if( xConstTickCount < xItemValue ) + { + /* It is not time to unblock this item yet, but the + item value is the time at which the task at the head + of the blocked list must be removed from the Blocked + state - so record the item value in + xNextTaskUnblockTime. */ + xNextTaskUnblockTime = xItemValue; + break; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* It is time to remove the item from the Blocked state. */ + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + + /* Is the task waiting on an event also? If so remove + it from the event list. */ + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) + { + ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Place the unblocked task into the appropriate ready + list. */ + prvAddTaskToReadyList( pxTCB ); + + /* A task being unblocked cannot cause an immediate + context switch if preemption is turned off. */ + #if ( configUSE_PREEMPTION == 1 ) + { + /* Preemption is on, but a context switch should + only be performed if the unblocked task has a + priority that is equal to or higher than the + currently executing task. */ + if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority ) + { + xSwitchRequired = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_PREEMPTION */ + } + } + } + + /* Tasks of equal priority to the currently running task will share + processing time (time slice) if preemption is on, and the application + writer has not explicitly turned time slicing off. */ + #if ( ( configUSE_PREEMPTION == 1 ) && ( configUSE_TIME_SLICING == 1 ) ) + { + if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ pxCurrentTCB->uxPriority ] ) ) > ( UBaseType_t ) 1 ) + { + xSwitchRequired = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* ( ( configUSE_PREEMPTION == 1 ) && ( configUSE_TIME_SLICING == 1 ) ) */ + + #if ( configUSE_TICK_HOOK == 1 ) + { + /* Guard against the tick hook being called when the pended tick + count is being unwound (when the scheduler is being unlocked). */ + if( uxPendedTicks == ( UBaseType_t ) 0U ) + { + vApplicationTickHook(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_TICK_HOOK */ + } + else + { + ++uxPendedTicks; + + /* The tick hook gets called at regular intervals, even if the + scheduler is locked. */ + #if ( configUSE_TICK_HOOK == 1 ) + { + vApplicationTickHook(); + } + #endif + } + + #if ( configUSE_PREEMPTION == 1 ) + { + if( xYieldPending != pdFALSE ) + { + xSwitchRequired = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_PREEMPTION */ + + return xSwitchRequired; +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_APPLICATION_TASK_TAG == 1 ) + + void vTaskSetApplicationTaskTag( TaskHandle_t xTask, TaskHookFunction_t pxHookFunction ) + { + TCB_t *xTCB; + + /* If xTask is NULL then it is the task hook of the calling task that is + getting set. */ + if( xTask == NULL ) + { + xTCB = ( TCB_t * ) pxCurrentTCB; + } + else + { + xTCB = ( TCB_t * ) xTask; + } + + /* Save the hook function in the TCB. A critical section is required as + the value can be accessed from an interrupt. */ + taskENTER_CRITICAL(); + xTCB->pxTaskTag = pxHookFunction; + taskEXIT_CRITICAL(); + } + +#endif /* configUSE_APPLICATION_TASK_TAG */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_APPLICATION_TASK_TAG == 1 ) + + TaskHookFunction_t xTaskGetApplicationTaskTag( TaskHandle_t xTask ) + { + TCB_t *xTCB; + TaskHookFunction_t xReturn; + + /* If xTask is NULL then we are setting our own task hook. */ + if( xTask == NULL ) + { + xTCB = ( TCB_t * ) pxCurrentTCB; + } + else + { + xTCB = ( TCB_t * ) xTask; + } + + /* Save the hook function in the TCB. A critical section is required as + the value can be accessed from an interrupt. */ + taskENTER_CRITICAL(); + { + xReturn = xTCB->pxTaskTag; + } + taskEXIT_CRITICAL(); + + return xReturn; + } + +#endif /* configUSE_APPLICATION_TASK_TAG */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_APPLICATION_TASK_TAG == 1 ) + + BaseType_t xTaskCallApplicationTaskHook( TaskHandle_t xTask, void *pvParameter ) + { + TCB_t *xTCB; + BaseType_t xReturn; + + /* If xTask is NULL then we are calling our own task hook. */ + if( xTask == NULL ) + { + xTCB = ( TCB_t * ) pxCurrentTCB; + } + else + { + xTCB = ( TCB_t * ) xTask; + } + + if( xTCB->pxTaskTag != NULL ) + { + xReturn = xTCB->pxTaskTag( pvParameter ); + } + else + { + xReturn = pdFAIL; + } + + return xReturn; + } + +#endif /* configUSE_APPLICATION_TASK_TAG */ +/*-----------------------------------------------------------*/ + +void vTaskSwitchContext( void ) +{ + if( uxSchedulerSuspended != ( UBaseType_t ) pdFALSE ) + { + /* The scheduler is currently suspended - do not allow a context + switch. */ + xYieldPending = pdTRUE; + } + else + { + xYieldPending = pdFALSE; + traceTASK_SWITCHED_OUT(); + + #if ( configGENERATE_RUN_TIME_STATS == 1 ) + { + #ifdef portALT_GET_RUN_TIME_COUNTER_VALUE + portALT_GET_RUN_TIME_COUNTER_VALUE( ulTotalRunTime ); + #else + ulTotalRunTime = portGET_RUN_TIME_COUNTER_VALUE(); + #endif + + /* Add the amount of time the task has been running to the + accumulated time so far. The time the task started running was + stored in ulTaskSwitchedInTime. Note that there is no overflow + protection here so count values are only valid until the timer + overflows. The guard against negative values is to protect + against suspect run time stat counter implementations - which + are provided by the application, not the kernel. */ + if( ulTotalRunTime > ulTaskSwitchedInTime ) + { + pxCurrentTCB->ulRunTimeCounter += ( ulTotalRunTime - ulTaskSwitchedInTime ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + ulTaskSwitchedInTime = ulTotalRunTime; + } + #endif /* configGENERATE_RUN_TIME_STATS */ + + /* Check for stack overflow, if configured. */ + taskCHECK_FOR_STACK_OVERFLOW(); + + /* Select a new task to run using either the generic C or port + optimised asm code. */ + taskSELECT_HIGHEST_PRIORITY_TASK(); + traceTASK_SWITCHED_IN(); + + #if ( configUSE_NEWLIB_REENTRANT == 1 ) + { + /* Switch Newlib's _impure_ptr variable to point to the _reent + structure specific to this task. */ + _impure_ptr = &( pxCurrentTCB->xNewLib_reent ); + } + #endif /* configUSE_NEWLIB_REENTRANT */ + } +} +/*-----------------------------------------------------------*/ + +void vTaskPlaceOnEventList( List_t * const pxEventList, const TickType_t xTicksToWait ) +{ + configASSERT( pxEventList ); + + /* THIS FUNCTION MUST BE CALLED WITH EITHER INTERRUPTS DISABLED OR THE + SCHEDULER SUSPENDED AND THE QUEUE BEING ACCESSED LOCKED. */ + + /* Place the event list item of the TCB in the appropriate event list. + This is placed in the list in priority order so the highest priority task + is the first to be woken by the event. The queue that contains the event + list is locked, preventing simultaneous access from interrupts. */ + vListInsert( pxEventList, &( pxCurrentTCB->xEventListItem ) ); + + prvAddCurrentTaskToDelayedList( xTicksToWait, pdTRUE ); +} +/*-----------------------------------------------------------*/ + +void vTaskPlaceOnUnorderedEventList( List_t * pxEventList, const TickType_t xItemValue, const TickType_t xTicksToWait ) +{ + configASSERT( pxEventList ); + + /* THIS FUNCTION MUST BE CALLED WITH THE SCHEDULER SUSPENDED. It is used by + the event groups implementation. */ + configASSERT( uxSchedulerSuspended != 0 ); + + /* Store the item value in the event list item. It is safe to access the + event list item here as interrupts won't access the event list item of a + task that is not in the Blocked state. */ + listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xEventListItem ), xItemValue | taskEVENT_LIST_ITEM_VALUE_IN_USE ); + + /* Place the event list item of the TCB at the end of the appropriate event + list. It is safe to access the event list here because it is part of an + event group implementation - and interrupts don't access event groups + directly (instead they access them indirectly by pending function calls to + the task level). */ + vListInsertEnd( pxEventList, &( pxCurrentTCB->xEventListItem ) ); + + prvAddCurrentTaskToDelayedList( xTicksToWait, pdTRUE ); +} +/*-----------------------------------------------------------*/ + +#if( configUSE_TIMERS == 1 ) + + void vTaskPlaceOnEventListRestricted( List_t * const pxEventList, TickType_t xTicksToWait, const BaseType_t xWaitIndefinitely ) + { + configASSERT( pxEventList ); + + /* This function should not be called by application code hence the + 'Restricted' in its name. It is not part of the public API. It is + designed for use by kernel code, and has special calling requirements - + it should be called with the scheduler suspended. */ + + + /* Place the event list item of the TCB in the appropriate event list. + In this case it is assume that this is the only task that is going to + be waiting on this event list, so the faster vListInsertEnd() function + can be used in place of vListInsert. */ + vListInsertEnd( pxEventList, &( pxCurrentTCB->xEventListItem ) ); + + /* If the task should block indefinitely then set the block time to a + value that will be recognised as an indefinite delay inside the + prvAddCurrentTaskToDelayedList() function. */ + if( xWaitIndefinitely != pdFALSE ) + { + xTicksToWait = portMAX_DELAY; + } + + traceTASK_DELAY_UNTIL( ( xTickCount + xTicksToWait ) ); + prvAddCurrentTaskToDelayedList( xTicksToWait, xWaitIndefinitely ); + } + +#endif /* configUSE_TIMERS */ +/*-----------------------------------------------------------*/ + +BaseType_t xTaskRemoveFromEventList( const List_t * const pxEventList ) +{ +TCB_t *pxUnblockedTCB; +BaseType_t xReturn; + + /* THIS FUNCTION MUST BE CALLED FROM A CRITICAL SECTION. It can also be + called from a critical section within an ISR. */ + + /* The event list is sorted in priority order, so the first in the list can + be removed as it is known to be the highest priority. Remove the TCB from + the delayed list, and add it to the ready list. + + If an event is for a queue that is locked then this function will never + get called - the lock count on the queue will get modified instead. This + means exclusive access to the event list is guaranteed here. + + This function assumes that a check has already been made to ensure that + pxEventList is not empty. */ + pxUnblockedTCB = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxEventList ); + configASSERT( pxUnblockedTCB ); + ( void ) uxListRemove( &( pxUnblockedTCB->xEventListItem ) ); + + if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) + { + ( void ) uxListRemove( &( pxUnblockedTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxUnblockedTCB ); + } + else + { + /* The delayed and ready lists cannot be accessed, so hold this task + pending until the scheduler is resumed. */ + vListInsertEnd( &( xPendingReadyList ), &( pxUnblockedTCB->xEventListItem ) ); + } + + if( pxUnblockedTCB->uxPriority > pxCurrentTCB->uxPriority ) + { + /* Return true if the task removed from the event list has a higher + priority than the calling task. This allows the calling task to know if + it should force a context switch now. */ + xReturn = pdTRUE; + + /* Mark that a yield is pending in case the user is not using the + "xHigherPriorityTaskWoken" parameter to an ISR safe FreeRTOS function. */ + xYieldPending = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + + #if( configUSE_TICKLESS_IDLE != 0 ) + { + /* If a task is blocked on a kernel object then xNextTaskUnblockTime + might be set to the blocked task's time out time. If the task is + unblocked for a reason other than a timeout xNextTaskUnblockTime is + normally left unchanged, because it is automatically reset to a new + value when the tick count equals xNextTaskUnblockTime. However if + tickless idling is used it might be more important to enter sleep mode + at the earliest possible time - so reset xNextTaskUnblockTime here to + ensure it is updated at the earliest possible time. */ + prvResetNextTaskUnblockTime(); + } + #endif + + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t xTaskRemoveFromUnorderedEventList( ListItem_t * pxEventListItem, const TickType_t xItemValue ) +{ +TCB_t *pxUnblockedTCB; +BaseType_t xReturn; + + /* THIS FUNCTION MUST BE CALLED WITH THE SCHEDULER SUSPENDED. It is used by + the event flags implementation. */ + configASSERT( uxSchedulerSuspended != pdFALSE ); + + /* Store the new item value in the event list. */ + listSET_LIST_ITEM_VALUE( pxEventListItem, xItemValue | taskEVENT_LIST_ITEM_VALUE_IN_USE ); + + /* Remove the event list form the event flag. Interrupts do not access + event flags. */ + pxUnblockedTCB = ( TCB_t * ) listGET_LIST_ITEM_OWNER( pxEventListItem ); + configASSERT( pxUnblockedTCB ); + ( void ) uxListRemove( pxEventListItem ); + + /* Remove the task from the delayed list and add it to the ready list. The + scheduler is suspended so interrupts will not be accessing the ready + lists. */ + ( void ) uxListRemove( &( pxUnblockedTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxUnblockedTCB ); + + if( pxUnblockedTCB->uxPriority > pxCurrentTCB->uxPriority ) + { + /* Return true if the task removed from the event list has + a higher priority than the calling task. This allows + the calling task to know if it should force a context + switch now. */ + xReturn = pdTRUE; + + /* Mark that a yield is pending in case the user is not using the + "xHigherPriorityTaskWoken" parameter to an ISR safe FreeRTOS function. */ + xYieldPending = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + +void vTaskSetTimeOutState( TimeOut_t * const pxTimeOut ) +{ + configASSERT( pxTimeOut ); + pxTimeOut->xOverflowCount = xNumOfOverflows; + pxTimeOut->xTimeOnEntering = xTickCount; +} +/*-----------------------------------------------------------*/ + +BaseType_t xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, TickType_t * const pxTicksToWait ) +{ +BaseType_t xReturn; + + configASSERT( pxTimeOut ); + configASSERT( pxTicksToWait ); + + taskENTER_CRITICAL(); + { + /* Minor optimisation. The tick count cannot change in this block. */ + const TickType_t xConstTickCount = xTickCount; + + #if( INCLUDE_xTaskAbortDelay == 1 ) + if( pxCurrentTCB->ucDelayAborted != pdFALSE ) + { + /* The delay was aborted, which is not the same as a time out, + but has the same result. */ + pxCurrentTCB->ucDelayAborted = pdFALSE; + xReturn = pdTRUE; + } + else + #endif + + #if ( INCLUDE_vTaskSuspend == 1 ) + if( *pxTicksToWait == portMAX_DELAY ) + { + /* If INCLUDE_vTaskSuspend is set to 1 and the block time + specified is the maximum block time then the task should block + indefinitely, and therefore never time out. */ + xReturn = pdFALSE; + } + else + #endif + + if( ( xNumOfOverflows != pxTimeOut->xOverflowCount ) && ( xConstTickCount >= pxTimeOut->xTimeOnEntering ) ) /*lint !e525 Indentation preferred as is to make code within pre-processor directives clearer. */ + { + /* The tick count is greater than the time at which + vTaskSetTimeout() was called, but has also overflowed since + vTaskSetTimeOut() was called. It must have wrapped all the way + around and gone past again. This passed since vTaskSetTimeout() + was called. */ + xReturn = pdTRUE; + } + else if( ( ( TickType_t ) ( xConstTickCount - pxTimeOut->xTimeOnEntering ) ) < *pxTicksToWait ) /*lint !e961 Explicit casting is only redundant with some compilers, whereas others require it to prevent integer conversion errors. */ + { + /* Not a genuine timeout. Adjust parameters for time remaining. */ + *pxTicksToWait -= ( xConstTickCount - pxTimeOut->xTimeOnEntering ); + vTaskSetTimeOutState( pxTimeOut ); + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + } + taskEXIT_CRITICAL(); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +void vTaskMissedYield( void ) +{ + xYieldPending = pdTRUE; +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + UBaseType_t uxTaskGetTaskNumber( TaskHandle_t xTask ) + { + UBaseType_t uxReturn; + TCB_t *pxTCB; + + if( xTask != NULL ) + { + pxTCB = ( TCB_t * ) xTask; + uxReturn = pxTCB->uxTaskNumber; + } + else + { + uxReturn = 0U; + } + + return uxReturn; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + void vTaskSetTaskNumber( TaskHandle_t xTask, const UBaseType_t uxHandle ) + { + TCB_t *pxTCB; + + if( xTask != NULL ) + { + pxTCB = ( TCB_t * ) xTask; + pxTCB->uxTaskNumber = uxHandle; + } + } + +#endif /* configUSE_TRACE_FACILITY */ + +/* + * ----------------------------------------------------------- + * The Idle task. + * ---------------------------------------------------------- + * + * The portTASK_FUNCTION() macro is used to allow port/compiler specific + * language extensions. The equivalent prototype for this function is: + * + * void prvIdleTask( void *pvParameters ); + * + */ +static portTASK_FUNCTION( prvIdleTask, pvParameters ) +{ + /* Stop warnings. */ + ( void ) pvParameters; + + /** THIS IS THE RTOS IDLE TASK - WHICH IS CREATED AUTOMATICALLY WHEN THE + SCHEDULER IS STARTED. **/ + + for( ;; ) + { + /* See if any tasks have deleted themselves - if so then the idle task + is responsible for freeing the deleted task's TCB and stack. */ + prvCheckTasksWaitingTermination(); + + #if ( configUSE_PREEMPTION == 0 ) + { + /* If we are not using preemption we keep forcing a task switch to + see if any other task has become available. If we are using + preemption we don't need to do this as any task becoming available + will automatically get the processor anyway. */ + taskYIELD(); + } + #endif /* configUSE_PREEMPTION */ + + #if ( ( configUSE_PREEMPTION == 1 ) && ( configIDLE_SHOULD_YIELD == 1 ) ) + { + /* When using preemption tasks of equal priority will be + timesliced. If a task that is sharing the idle priority is ready + to run then the idle task should yield before the end of the + timeslice. + + A critical region is not required here as we are just reading from + the list, and an occasional incorrect value will not matter. If + the ready list at the idle priority contains more than one task + then a task other than the idle task is ready to execute. */ + if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ tskIDLE_PRIORITY ] ) ) > ( UBaseType_t ) 1 ) + { + taskYIELD(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* ( ( configUSE_PREEMPTION == 1 ) && ( configIDLE_SHOULD_YIELD == 1 ) ) */ + + #if ( configUSE_IDLE_HOOK == 1 ) + { + extern void vApplicationIdleHook( void ); + + /* Call the user defined function from within the idle task. This + allows the application designer to add background functionality + without the overhead of a separate task. + NOTE: vApplicationIdleHook() MUST NOT, UNDER ANY CIRCUMSTANCES, + CALL A FUNCTION THAT MIGHT BLOCK. */ + vApplicationIdleHook(); + } + #endif /* configUSE_IDLE_HOOK */ + + /* This conditional compilation should use inequality to 0, not equality + to 1. This is to ensure portSUPPRESS_TICKS_AND_SLEEP() is called when + user defined low power mode implementations require + configUSE_TICKLESS_IDLE to be set to a value other than 1. */ + #if ( configUSE_TICKLESS_IDLE != 0 ) + { + TickType_t xExpectedIdleTime; + + /* It is not desirable to suspend then resume the scheduler on + each iteration of the idle task. Therefore, a preliminary + test of the expected idle time is performed without the + scheduler suspended. The result here is not necessarily + valid. */ + xExpectedIdleTime = prvGetExpectedIdleTime(); + + if( xExpectedIdleTime >= configEXPECTED_IDLE_TIME_BEFORE_SLEEP ) + { + vTaskSuspendAll(); + { + /* Now the scheduler is suspended, the expected idle + time can be sampled again, and this time its value can + be used. */ + configASSERT( xNextTaskUnblockTime >= xTickCount ); + xExpectedIdleTime = prvGetExpectedIdleTime(); + + if( xExpectedIdleTime >= configEXPECTED_IDLE_TIME_BEFORE_SLEEP ) + { + traceLOW_POWER_IDLE_BEGIN(); + portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ); + traceLOW_POWER_IDLE_END(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + ( void ) xTaskResumeAll(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_TICKLESS_IDLE */ + } +} +/*-----------------------------------------------------------*/ + +#if( configUSE_TICKLESS_IDLE != 0 ) + + eSleepModeStatus eTaskConfirmSleepModeStatus( void ) + { + /* The idle task exists in addition to the application tasks. */ + const UBaseType_t uxNonApplicationTasks = 1; + eSleepModeStatus eReturn = eStandardSleep; + + if( listCURRENT_LIST_LENGTH( &xPendingReadyList ) != 0 ) + { + /* A task was made ready while the scheduler was suspended. */ + eReturn = eAbortSleep; + } + else if( xYieldPending != pdFALSE ) + { + /* A yield was pended while the scheduler was suspended. */ + eReturn = eAbortSleep; + } + else + { + /* If all the tasks are in the suspended list (which might mean they + have an infinite block time rather than actually being suspended) + then it is safe to turn all clocks off and just wait for external + interrupts. */ + if( listCURRENT_LIST_LENGTH( &xSuspendedTaskList ) == ( uxCurrentNumberOfTasks - uxNonApplicationTasks ) ) + { + eReturn = eNoTasksWaitingTimeout; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + return eReturn; + } + +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +#if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 ) + + void vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet, BaseType_t xIndex, void *pvValue ) + { + TCB_t *pxTCB; + + if( xIndex < configNUM_THREAD_LOCAL_STORAGE_POINTERS ) + { + pxTCB = prvGetTCBFromHandle( xTaskToSet ); + pxTCB->pvThreadLocalStoragePointers[ xIndex ] = pvValue; + } + } + +#endif /* configNUM_THREAD_LOCAL_STORAGE_POINTERS */ +/*-----------------------------------------------------------*/ + +#if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 ) + + void *pvTaskGetThreadLocalStoragePointer( TaskHandle_t xTaskToQuery, BaseType_t xIndex ) + { + void *pvReturn = NULL; + TCB_t *pxTCB; + + if( xIndex < configNUM_THREAD_LOCAL_STORAGE_POINTERS ) + { + pxTCB = prvGetTCBFromHandle( xTaskToQuery ); + pvReturn = pxTCB->pvThreadLocalStoragePointers[ xIndex ]; + } + else + { + pvReturn = NULL; + } + + return pvReturn; + } + +#endif /* configNUM_THREAD_LOCAL_STORAGE_POINTERS */ +/*-----------------------------------------------------------*/ + +#if ( portUSING_MPU_WRAPPERS == 1 ) + + void vTaskAllocateMPURegions( TaskHandle_t xTaskToModify, const MemoryRegion_t * const xRegions ) + { + TCB_t *pxTCB; + + /* If null is passed in here then we are modifying the MPU settings of + the calling task. */ + pxTCB = prvGetTCBFromHandle( xTaskToModify ); + + vPortStoreTaskMPUSettings( &( pxTCB->xMPUSettings ), xRegions, NULL, 0 ); + } + +#endif /* portUSING_MPU_WRAPPERS */ +/*-----------------------------------------------------------*/ + +static void prvInitialiseTaskLists( void ) +{ +UBaseType_t uxPriority; + + for( uxPriority = ( UBaseType_t ) 0U; uxPriority < ( UBaseType_t ) configMAX_PRIORITIES; uxPriority++ ) + { + vListInitialise( &( pxReadyTasksLists[ uxPriority ] ) ); + } + + vListInitialise( &xDelayedTaskList1 ); + vListInitialise( &xDelayedTaskList2 ); + vListInitialise( &xPendingReadyList ); + + #if ( INCLUDE_vTaskDelete == 1 ) + { + vListInitialise( &xTasksWaitingTermination ); + } + #endif /* INCLUDE_vTaskDelete */ + + #if ( INCLUDE_vTaskSuspend == 1 ) + { + vListInitialise( &xSuspendedTaskList ); + } + #endif /* INCLUDE_vTaskSuspend */ + + /* Start with pxDelayedTaskList using list1 and the pxOverflowDelayedTaskList + using list2. */ + pxDelayedTaskList = &xDelayedTaskList1; + pxOverflowDelayedTaskList = &xDelayedTaskList2; +} +/*-----------------------------------------------------------*/ + +static void prvCheckTasksWaitingTermination( void ) +{ + + /** THIS FUNCTION IS CALLED FROM THE RTOS IDLE TASK **/ + + #if ( INCLUDE_vTaskDelete == 1 ) + { + BaseType_t xListIsEmpty; + + /* ucTasksDeleted is used to prevent vTaskSuspendAll() being called + too often in the idle task. */ + while( uxDeletedTasksWaitingCleanUp > ( UBaseType_t ) 0U ) + { + vTaskSuspendAll(); + { + xListIsEmpty = listLIST_IS_EMPTY( &xTasksWaitingTermination ); + } + ( void ) xTaskResumeAll(); + + if( xListIsEmpty == pdFALSE ) + { + TCB_t *pxTCB; + + taskENTER_CRITICAL(); + { + pxTCB = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( ( &xTasksWaitingTermination ) ); + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + --uxCurrentNumberOfTasks; + --uxDeletedTasksWaitingCleanUp; + } + taskEXIT_CRITICAL(); + + prvDeleteTCB( pxTCB ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + #endif /* INCLUDE_vTaskDelete */ +} +/*-----------------------------------------------------------*/ + +#if( configUSE_TRACE_FACILITY == 1 ) + + void vTaskGetInfo( TaskHandle_t xTask, TaskStatus_t *pxTaskStatus, BaseType_t xGetFreeStackSpace, eTaskState eState ) + { + TCB_t *pxTCB; + + /* xTask is NULL then get the state of the calling task. */ + pxTCB = prvGetTCBFromHandle( xTask ); + + pxTaskStatus->xHandle = ( TaskHandle_t ) pxTCB; + pxTaskStatus->pcTaskName = ( const char * ) &( pxTCB->pcTaskName [ 0 ] ); + pxTaskStatus->uxCurrentPriority = pxTCB->uxPriority; + pxTaskStatus->pxStackBase = pxTCB->pxStack; + pxTaskStatus->xTaskNumber = pxTCB->uxTCBNumber; + + #if ( INCLUDE_vTaskSuspend == 1 ) + { + /* If the task is in the suspended list then there is a chance it is + actually just blocked indefinitely - so really it should be reported as + being in the Blocked state. */ + if( pxTaskStatus->eCurrentState == eSuspended ) + { + vTaskSuspendAll(); + { + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) + { + pxTaskStatus->eCurrentState = eBlocked; + } + } + xTaskResumeAll(); + } + } + #endif /* INCLUDE_vTaskSuspend */ + + #if ( configUSE_MUTEXES == 1 ) + { + pxTaskStatus->uxBasePriority = pxTCB->uxBasePriority; + } + #else + { + pxTaskStatus->uxBasePriority = 0; + } + #endif + + #if ( configGENERATE_RUN_TIME_STATS == 1 ) + { + pxTaskStatus->ulRunTimeCounter = pxTCB->ulRunTimeCounter; + } + #else + { + pxTaskStatus->ulRunTimeCounter = 0; + } + #endif + + /* Obtaining the task state is a little fiddly, so is only done if the value + of eState passed into this function is eInvalid - otherwise the state is + just set to whatever is passed in. */ + if( eState != eInvalid ) + { + pxTaskStatus->eCurrentState = eState; + } + else + { + pxTaskStatus->eCurrentState = eTaskGetState( xTask ); + } + + /* Obtaining the stack space takes some time, so the xGetFreeStackSpace + parameter is provided to allow it to be skipped. */ + if( xGetFreeStackSpace != pdFALSE ) + { + #if ( portSTACK_GROWTH > 0 ) + { + pxTaskStatus->usStackHighWaterMark = prvTaskCheckFreeStackSpace( ( uint8_t * ) pxTCB->pxEndOfStack ); + } + #else + { + pxTaskStatus->usStackHighWaterMark = prvTaskCheckFreeStackSpace( ( uint8_t * ) pxTCB->pxStack ); + } + #endif + } + else + { + pxTaskStatus->usStackHighWaterMark = 0; + } + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + static UBaseType_t prvListTasksWithinSingleList( TaskStatus_t *pxTaskStatusArray, List_t *pxList, eTaskState eState ) + { + volatile TCB_t *pxNextTCB, *pxFirstTCB; + UBaseType_t uxTask = 0; + + if( listCURRENT_LIST_LENGTH( pxList ) > ( UBaseType_t ) 0 ) + { + listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, pxList ); + + /* Populate an TaskStatus_t structure within the + pxTaskStatusArray array for each task that is referenced from + pxList. See the definition of TaskStatus_t in task.h for the + meaning of each TaskStatus_t structure member. */ + do + { + listGET_OWNER_OF_NEXT_ENTRY( pxNextTCB, pxList ); + vTaskGetInfo( ( TaskHandle_t ) pxNextTCB, &( pxTaskStatusArray[ uxTask ] ), pdTRUE, eState ); + uxTask++; + } while( pxNextTCB != pxFirstTCB ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return uxTask; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) ) + + static uint16_t prvTaskCheckFreeStackSpace( const uint8_t * pucStackByte ) + { + uint32_t ulCount = 0U; + + while( *pucStackByte == ( uint8_t ) tskSTACK_FILL_BYTE ) + { + pucStackByte -= portSTACK_GROWTH; + ulCount++; + } + + ulCount /= ( uint32_t ) sizeof( StackType_t ); /*lint !e961 Casting is not redundant on smaller architectures. */ + + return ( uint16_t ) ulCount; + } + +#endif /* ( ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) ) */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) + + UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask ) + { + TCB_t *pxTCB; + uint8_t *pucEndOfStack; + UBaseType_t uxReturn; + + pxTCB = prvGetTCBFromHandle( xTask ); + + #if portSTACK_GROWTH < 0 + { + pucEndOfStack = ( uint8_t * ) pxTCB->pxStack; + } + #else + { + pucEndOfStack = ( uint8_t * ) pxTCB->pxEndOfStack; + } + #endif + + uxReturn = ( UBaseType_t ) prvTaskCheckFreeStackSpace( pucEndOfStack ); + + return uxReturn; + } + +#endif /* INCLUDE_uxTaskGetStackHighWaterMark */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskDelete == 1 ) + + static void prvDeleteTCB( TCB_t *pxTCB ) + { + /* This call is required specifically for the TriCore port. It must be + above the vPortFree() calls. The call is also used by ports/demos that + want to allocate and clean RAM statically. */ + portCLEAN_UP_TCB( pxTCB ); + + /* Free up the memory allocated by the scheduler for the task. It is up + to the task to free any memory allocated at the application level. */ + #if ( configUSE_NEWLIB_REENTRANT == 1 ) + { + _reclaim_reent( &( pxTCB->xNewLib_reent ) ); + } + #endif /* configUSE_NEWLIB_REENTRANT */ + + #if( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 0 ) && ( portUSING_MPU_WRAPPERS == 0 ) ) + { + /* The task can only have been allocated dynamically - free both + the stack and TCB. */ + vPortFree( pxTCB->pxStack ); + vPortFree( pxTCB ); + } + #elif( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE == 1 ) + { + /* The task could have been allocated statically or dynamically, so + check what was statically allocated before trying to free the + memory. */ + if( pxTCB->ucStaticallyAllocated == tskDYNAMICALLY_ALLOCATED_STACK_AND_TCB ) + { + /* Both the stack and TCB were allocated dynamically, so both + must be freed. */ + vPortFree( pxTCB->pxStack ); + vPortFree( pxTCB ); + } + else if( pxTCB->ucStaticallyAllocated == tskSTATICALLY_ALLOCATED_STACK_ONLY ) + { + /* Only the stack was statically allocated, so the TCB is the + only memory that must be freed. */ + vPortFree( pxTCB ); + } + else + { + /* Neither the stack nor the TCB were allocated dynamically, so + nothing needs to be freed. */ + configASSERT( pxTCB->ucStaticallyAllocated == tskSTATICALLY_ALLOCATED_STACK_AND_TCB ) + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ + } + +#endif /* INCLUDE_vTaskDelete */ +/*-----------------------------------------------------------*/ + +static void prvResetNextTaskUnblockTime( void ) +{ +TCB_t *pxTCB; + + if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE ) + { + /* The new current delayed list is empty. Set xNextTaskUnblockTime to + the maximum possible value so it is extremely unlikely that the + if( xTickCount >= xNextTaskUnblockTime ) test will pass until + there is an item in the delayed list. */ + xNextTaskUnblockTime = portMAX_DELAY; + } + else + { + /* The new current delayed list is not empty, get the value of + the item at the head of the delayed list. This is the time at + which the task at the head of the delayed list should be removed + from the Blocked state. */ + ( pxTCB ) = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList ); + xNextTaskUnblockTime = listGET_LIST_ITEM_VALUE( &( ( pxTCB )->xStateListItem ) ); + } +} +/*-----------------------------------------------------------*/ + +#if ( ( INCLUDE_xTaskGetCurrentTaskHandle == 1 ) || ( configUSE_MUTEXES == 1 ) ) + + TaskHandle_t xTaskGetCurrentTaskHandle( void ) + { + TaskHandle_t xReturn; + + /* A critical section is not required as this is not called from + an interrupt and the current TCB will always be the same for any + individual execution thread. */ + xReturn = pxCurrentTCB; + + return xReturn; + } + +#endif /* ( ( INCLUDE_xTaskGetCurrentTaskHandle == 1 ) || ( configUSE_MUTEXES == 1 ) ) */ +/*-----------------------------------------------------------*/ + +#if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + + BaseType_t xTaskGetSchedulerState( void ) + { + BaseType_t xReturn; + + if( xSchedulerRunning == pdFALSE ) + { + xReturn = taskSCHEDULER_NOT_STARTED; + } + else + { + if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) + { + xReturn = taskSCHEDULER_RUNNING; + } + else + { + xReturn = taskSCHEDULER_SUSPENDED; + } + } + + return xReturn; + } + +#endif /* ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_MUTEXES == 1 ) + + void vTaskPriorityInherit( TaskHandle_t const pxMutexHolder ) + { + TCB_t * const pxTCB = ( TCB_t * ) pxMutexHolder; + + /* If the mutex was given back by an interrupt while the queue was + locked then the mutex holder might now be NULL. */ + if( pxMutexHolder != NULL ) + { + /* If the holder of the mutex has a priority below the priority of + the task attempting to obtain the mutex then it will temporarily + inherit the priority of the task attempting to obtain the mutex. */ + if( pxTCB->uxPriority < pxCurrentTCB->uxPriority ) + { + /* Adjust the mutex holder state to account for its new + priority. Only reset the event list item value if the value is + not being used for anything else. */ + if( ( listGET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ) ) & taskEVENT_LIST_ITEM_VALUE_IN_USE ) == 0UL ) + { + listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) pxCurrentTCB->uxPriority ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* If the task being modified is in the ready state it will need + to be moved into a new list. */ + if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ pxTCB->uxPriority ] ), &( pxTCB->xStateListItem ) ) != pdFALSE ) + { + if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) + { + taskRESET_READY_PRIORITY( pxTCB->uxPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Inherit the priority before being moved into the new list. */ + pxTCB->uxPriority = pxCurrentTCB->uxPriority; + prvAddTaskToReadyList( pxTCB ); + } + else + { + /* Just inherit the priority. */ + pxTCB->uxPriority = pxCurrentTCB->uxPriority; + } + + traceTASK_PRIORITY_INHERIT( pxTCB, pxCurrentTCB->uxPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + +#endif /* configUSE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_MUTEXES == 1 ) + + BaseType_t xTaskPriorityDisinherit( TaskHandle_t const pxMutexHolder ) + { + TCB_t * const pxTCB = ( TCB_t * ) pxMutexHolder; + BaseType_t xReturn = pdFALSE; + + if( pxMutexHolder != NULL ) + { + /* A task can only have an inherited priority if it holds the mutex. + If the mutex is held by a task then it cannot be given from an + interrupt, and if a mutex is given by the holding task then it must + be the running state task. */ + configASSERT( pxTCB == pxCurrentTCB ); + + configASSERT( pxTCB->uxMutexesHeld ); + ( pxTCB->uxMutexesHeld )--; + + /* Has the holder of the mutex inherited the priority of another + task? */ + if( pxTCB->uxPriority != pxTCB->uxBasePriority ) + { + /* Only disinherit if no other mutexes are held. */ + if( pxTCB->uxMutexesHeld == ( UBaseType_t ) 0 ) + { + /* A task can only have an inherited priority if it holds + the mutex. If the mutex is held by a task then it cannot be + given from an interrupt, and if a mutex is given by the + holding task then it must be the running state task. Remove + the holding task from the ready list. */ + if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) + { + taskRESET_READY_PRIORITY( pxTCB->uxPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Disinherit the priority before adding the task into the + new ready list. */ + traceTASK_PRIORITY_DISINHERIT( pxTCB, pxTCB->uxBasePriority ); + pxTCB->uxPriority = pxTCB->uxBasePriority; + + /* Reset the event list item value. It cannot be in use for + any other purpose if this task is running, and it must be + running to give back the mutex. */ + listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) pxTCB->uxPriority ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + prvAddTaskToReadyList( pxTCB ); + + /* Return true to indicate that a context switch is required. + This is only actually required in the corner case whereby + multiple mutexes were held and the mutexes were given back + in an order different to that in which they were taken. + If a context switch did not occur when the first mutex was + returned, even if a task was waiting on it, then a context + switch should occur when the last mutex is returned whether + a task is waiting on it or not. */ + xReturn = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return xReturn; + } + +#endif /* configUSE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if ( portCRITICAL_NESTING_IN_TCB == 1 ) + + void vTaskEnterCritical( void ) + { + portDISABLE_INTERRUPTS(); + + if( xSchedulerRunning != pdFALSE ) + { + ( pxCurrentTCB->uxCriticalNesting )++; + + /* This is not the interrupt safe version of the enter critical + function so assert() if it is being called from an interrupt + context. Only API functions that end in "FromISR" can be used in an + interrupt. Only assert if the critical nesting count is 1 to + protect against recursive calls if the assert function also uses a + critical section. */ + if( pxCurrentTCB->uxCriticalNesting == 1 ) + { + portASSERT_IF_IN_ISR(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + +#endif /* portCRITICAL_NESTING_IN_TCB */ +/*-----------------------------------------------------------*/ + +#if ( portCRITICAL_NESTING_IN_TCB == 1 ) + + void vTaskExitCritical( void ) + { + if( xSchedulerRunning != pdFALSE ) + { + if( pxCurrentTCB->uxCriticalNesting > 0U ) + { + ( pxCurrentTCB->uxCriticalNesting )--; + + if( pxCurrentTCB->uxCriticalNesting == 0U ) + { + portENABLE_INTERRUPTS(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + +#endif /* portCRITICAL_NESTING_IN_TCB */ +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) + + static char *prvWriteNameToBuffer( char *pcBuffer, const char *pcTaskName ) + { + size_t x; + + /* Start by copying the entire string. */ + strcpy( pcBuffer, pcTaskName ); + + /* Pad the end of the string with spaces to ensure columns line up when + printed out. */ + for( x = strlen( pcBuffer ); x < ( size_t ) ( configMAX_TASK_NAME_LEN - 1 ); x++ ) + { + pcBuffer[ x ] = ' '; + } + + /* Terminate. */ + pcBuffer[ x ] = 0x00; + + /* Return the new end of string. */ + return &( pcBuffer[ x ] ); + } + +#endif /* ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) */ +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) + + void vTaskList( char * pcWriteBuffer ) + { + TaskStatus_t *pxTaskStatusArray; + volatile UBaseType_t uxArraySize, x; + char cStatus; + + /* + * PLEASE NOTE: + * + * This function is provided for convenience only, and is used by many + * of the demo applications. Do not consider it to be part of the + * scheduler. + * + * vTaskList() calls uxTaskGetSystemState(), then formats part of the + * uxTaskGetSystemState() output into a human readable table that + * displays task names, states and stack usage. + * + * vTaskList() has a dependency on the sprintf() C library function that + * might bloat the code size, use a lot of stack, and provide different + * results on different platforms. An alternative, tiny, third party, + * and limited functionality implementation of sprintf() is provided in + * many of the FreeRTOS/Demo sub-directories in a file called + * printf-stdarg.c (note printf-stdarg.c does not provide a full + * snprintf() implementation!). + * + * It is recommended that production systems call uxTaskGetSystemState() + * directly to get access to raw stats data, rather than indirectly + * through a call to vTaskList(). + */ + + + /* Make sure the write buffer does not contain a string. */ + *pcWriteBuffer = 0x00; + + /* Take a snapshot of the number of tasks in case it changes while this + function is executing. */ + uxArraySize = uxCurrentNumberOfTasks; + + /* Allocate an array index for each task. NOTE! if + configSUPPORT_DYNAMIC_ALLOCATION is set to 0 then pvPortMalloc() will + equate to NULL. */ + pxTaskStatusArray = pvPortMalloc( uxCurrentNumberOfTasks * sizeof( TaskStatus_t ) ); + + if( pxTaskStatusArray != NULL ) + { + /* Generate the (binary) data. */ + uxArraySize = uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, NULL ); + + /* Create a human readable table from the binary data. */ + for( x = 0; x < uxArraySize; x++ ) + { + switch( pxTaskStatusArray[ x ].eCurrentState ) + { + case eReady: cStatus = tskREADY_CHAR; + break; + + case eBlocked: cStatus = tskBLOCKED_CHAR; + break; + + case eSuspended: cStatus = tskSUSPENDED_CHAR; + break; + + case eDeleted: cStatus = tskDELETED_CHAR; + break; + + default: /* Should not get here, but it is included + to prevent static checking errors. */ + cStatus = 0x00; + break; + } + + /* Write the task name to the string, padding with spaces so it + can be printed in tabular form more easily. */ + pcWriteBuffer = prvWriteNameToBuffer( pcWriteBuffer, pxTaskStatusArray[ x ].pcTaskName ); + + /* Write the rest of the string. */ + sprintf( pcWriteBuffer, "\t%c\t%u\t%u\t%u\r\n", cStatus, ( unsigned int ) pxTaskStatusArray[ x ].uxCurrentPriority, ( unsigned int ) pxTaskStatusArray[ x ].usStackHighWaterMark, ( unsigned int ) pxTaskStatusArray[ x ].xTaskNumber ); + pcWriteBuffer += strlen( pcWriteBuffer ); + } + + /* Free the array again. NOTE! If configSUPPORT_DYNAMIC_ALLOCATION + is 0 then vPortFree() will be #defined to nothing. */ + vPortFree( pxTaskStatusArray ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + +#endif /* ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) */ +/*----------------------------------------------------------*/ + +#if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) + + void vTaskGetRunTimeStats( char *pcWriteBuffer ) + { + TaskStatus_t *pxTaskStatusArray; + volatile UBaseType_t uxArraySize, x; + uint32_t ulTotalTime, ulStatsAsPercentage; + + #if( configUSE_TRACE_FACILITY != 1 ) + { + #error configUSE_TRACE_FACILITY must also be set to 1 in FreeRTOSConfig.h to use vTaskGetRunTimeStats(). + } + #endif + + /* + * PLEASE NOTE: + * + * This function is provided for convenience only, and is used by many + * of the demo applications. Do not consider it to be part of the + * scheduler. + * + * vTaskGetRunTimeStats() calls uxTaskGetSystemState(), then formats part + * of the uxTaskGetSystemState() output into a human readable table that + * displays the amount of time each task has spent in the Running state + * in both absolute and percentage terms. + * + * vTaskGetRunTimeStats() has a dependency on the sprintf() C library + * function that might bloat the code size, use a lot of stack, and + * provide different results on different platforms. An alternative, + * tiny, third party, and limited functionality implementation of + * sprintf() is provided in many of the FreeRTOS/Demo sub-directories in + * a file called printf-stdarg.c (note printf-stdarg.c does not provide + * a full snprintf() implementation!). + * + * It is recommended that production systems call uxTaskGetSystemState() + * directly to get access to raw stats data, rather than indirectly + * through a call to vTaskGetRunTimeStats(). + */ + + /* Make sure the write buffer does not contain a string. */ + *pcWriteBuffer = 0x00; + + /* Take a snapshot of the number of tasks in case it changes while this + function is executing. */ + uxArraySize = uxCurrentNumberOfTasks; + + /* Allocate an array index for each task. NOTE! If + configSUPPORT_DYNAMIC_ALLOCATION is set to 0 then pvPortMalloc() will + equate to NULL. */ + pxTaskStatusArray = pvPortMalloc( uxCurrentNumberOfTasks * sizeof( TaskStatus_t ) ); + + if( pxTaskStatusArray != NULL ) + { + /* Generate the (binary) data. */ + uxArraySize = uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, &ulTotalTime ); + + /* For percentage calculations. */ + ulTotalTime /= 100UL; + + /* Avoid divide by zero errors. */ + if( ulTotalTime > 0 ) + { + /* Create a human readable table from the binary data. */ + for( x = 0; x < uxArraySize; x++ ) + { + /* What percentage of the total run time has the task used? + This will always be rounded down to the nearest integer. + ulTotalRunTimeDiv100 has already been divided by 100. */ + ulStatsAsPercentage = pxTaskStatusArray[ x ].ulRunTimeCounter / ulTotalTime; + + /* Write the task name to the string, padding with + spaces so it can be printed in tabular form more + easily. */ + pcWriteBuffer = prvWriteNameToBuffer( pcWriteBuffer, pxTaskStatusArray[ x ].pcTaskName ); + + if( ulStatsAsPercentage > 0UL ) + { + #ifdef portLU_PRINTF_SPECIFIER_REQUIRED + { + sprintf( pcWriteBuffer, "\t%lu\t\t%lu%%\r\n", pxTaskStatusArray[ x ].ulRunTimeCounter, ulStatsAsPercentage ); + } + #else + { + /* sizeof( int ) == sizeof( long ) so a smaller + printf() library can be used. */ + sprintf( pcWriteBuffer, "\t%u\t\t%u%%\r\n", ( unsigned int ) pxTaskStatusArray[ x ].ulRunTimeCounter, ( unsigned int ) ulStatsAsPercentage ); + } + #endif + } + else + { + /* If the percentage is zero here then the task has + consumed less than 1% of the total run time. */ + #ifdef portLU_PRINTF_SPECIFIER_REQUIRED + { + sprintf( pcWriteBuffer, "\t%lu\t\t<1%%\r\n", pxTaskStatusArray[ x ].ulRunTimeCounter ); + } + #else + { + /* sizeof( int ) == sizeof( long ) so a smaller + printf() library can be used. */ + sprintf( pcWriteBuffer, "\t%u\t\t<1%%\r\n", ( unsigned int ) pxTaskStatusArray[ x ].ulRunTimeCounter ); + } + #endif + } + + pcWriteBuffer += strlen( pcWriteBuffer ); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Free the array again. NOTE! If configSUPPORT_DYNAMIC_ALLOCATION + is 0 then vPortFree() will be #defined to nothing. */ + vPortFree( pxTaskStatusArray ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + +#endif /* ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) */ +/*-----------------------------------------------------------*/ + +TickType_t uxTaskResetEventItemValue( void ) +{ +TickType_t uxReturn; + + uxReturn = listGET_LIST_ITEM_VALUE( &( pxCurrentTCB->xEventListItem ) ); + + /* Reset the event list item to its normal value - so it can be used with + queues and semaphores. */ + listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xEventListItem ), ( ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) pxCurrentTCB->uxPriority ) ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + + return uxReturn; +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_MUTEXES == 1 ) + + void *pvTaskIncrementMutexHeldCount( void ) + { + /* If xSemaphoreCreateMutex() is called before any tasks have been created + then pxCurrentTCB will be NULL. */ + if( pxCurrentTCB != NULL ) + { + ( pxCurrentTCB->uxMutexesHeld )++; + } + + return pxCurrentTCB; + } + +#endif /* configUSE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if( configUSE_TASK_NOTIFICATIONS == 1 ) + + uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait ) + { + uint32_t ulReturn; + + taskENTER_CRITICAL(); + { + /* Only block if the notification count is not already non-zero. */ + if( pxCurrentTCB->ulNotifiedValue == 0UL ) + { + /* Mark this task as waiting for a notification. */ + pxCurrentTCB->ucNotifyState = taskWAITING_NOTIFICATION; + + if( xTicksToWait > ( TickType_t ) 0 ) + { + prvAddCurrentTaskToDelayedList( xTicksToWait, pdTRUE ); + traceTASK_NOTIFY_TAKE_BLOCK(); + + /* All ports are written to allow a yield in a critical + section (some will yield immediately, others wait until the + critical section exits) - but it is not something that + application code should ever do. */ + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + + taskENTER_CRITICAL(); + { + traceTASK_NOTIFY_TAKE(); + ulReturn = pxCurrentTCB->ulNotifiedValue; + + if( ulReturn != 0UL ) + { + if( xClearCountOnExit != pdFALSE ) + { + pxCurrentTCB->ulNotifiedValue = 0UL; + } + else + { + pxCurrentTCB->ulNotifiedValue = ulReturn - 1; + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + pxCurrentTCB->ucNotifyState = taskNOT_WAITING_NOTIFICATION; + } + taskEXIT_CRITICAL(); + + return ulReturn; + } + +#endif /* configUSE_TASK_NOTIFICATIONS */ +/*-----------------------------------------------------------*/ + +#if( configUSE_TASK_NOTIFICATIONS == 1 ) + + BaseType_t xTaskNotifyWait( uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, uint32_t *pulNotificationValue, TickType_t xTicksToWait ) + { + BaseType_t xReturn; + + taskENTER_CRITICAL(); + { + /* Only block if a notification is not already pending. */ + if( pxCurrentTCB->ucNotifyState != taskNOTIFICATION_RECEIVED ) + { + /* Clear bits in the task's notification value as bits may get + set by the notifying task or interrupt. This can be used to + clear the value to zero. */ + pxCurrentTCB->ulNotifiedValue &= ~ulBitsToClearOnEntry; + + /* Mark this task as waiting for a notification. */ + pxCurrentTCB->ucNotifyState = taskWAITING_NOTIFICATION; + + if( xTicksToWait > ( TickType_t ) 0 ) + { + prvAddCurrentTaskToDelayedList( xTicksToWait, pdTRUE ); + traceTASK_NOTIFY_WAIT_BLOCK(); + + /* All ports are written to allow a yield in a critical + section (some will yield immediately, others wait until the + critical section exits) - but it is not something that + application code should ever do. */ + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + + taskENTER_CRITICAL(); + { + traceTASK_NOTIFY_WAIT(); + + if( pulNotificationValue != NULL ) + { + /* Output the current notification value, which may or may not + have changed. */ + *pulNotificationValue = pxCurrentTCB->ulNotifiedValue; + } + + /* If ucNotifyValue is set then either the task never entered the + blocked state (because a notification was already pending) or the + task unblocked because of a notification. Otherwise the task + unblocked because of a timeout. */ + if( pxCurrentTCB->ucNotifyState == taskWAITING_NOTIFICATION ) + { + /* A notification was not received. */ + xReturn = pdFALSE; + } + else + { + /* A notification was already pending or a notification was + received while the task was waiting. */ + pxCurrentTCB->ulNotifiedValue &= ~ulBitsToClearOnExit; + xReturn = pdTRUE; + } + + pxCurrentTCB->ucNotifyState = taskNOT_WAITING_NOTIFICATION; + } + taskEXIT_CRITICAL(); + + return xReturn; + } + +#endif /* configUSE_TASK_NOTIFICATIONS */ +/*-----------------------------------------------------------*/ + +#if( configUSE_TASK_NOTIFICATIONS == 1 ) + + BaseType_t xTaskGenericNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue ) + { + TCB_t * pxTCB; + BaseType_t xReturn = pdPASS; + uint8_t ucOriginalNotifyState; + + configASSERT( xTaskToNotify ); + pxTCB = ( TCB_t * ) xTaskToNotify; + + taskENTER_CRITICAL(); + { + if( pulPreviousNotificationValue != NULL ) + { + *pulPreviousNotificationValue = pxTCB->ulNotifiedValue; + } + + ucOriginalNotifyState = pxTCB->ucNotifyState; + + pxTCB->ucNotifyState = taskNOTIFICATION_RECEIVED; + + switch( eAction ) + { + case eSetBits : + pxTCB->ulNotifiedValue |= ulValue; + break; + + case eIncrement : + ( pxTCB->ulNotifiedValue )++; + break; + + case eSetValueWithOverwrite : + pxTCB->ulNotifiedValue = ulValue; + break; + + case eSetValueWithoutOverwrite : + if( ucOriginalNotifyState != taskNOTIFICATION_RECEIVED ) + { + pxTCB->ulNotifiedValue = ulValue; + } + else + { + /* The value could not be written to the task. */ + xReturn = pdFAIL; + } + break; + + case eNoAction: + /* The task is being notified without its notify value being + updated. */ + break; + } + + traceTASK_NOTIFY(); + + /* If the task is in the blocked state specifically to wait for a + notification then unblock it now. */ + if( ucOriginalNotifyState == taskWAITING_NOTIFICATION ) + { + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxTCB ); + + /* The task should not have been on an event list. */ + configASSERT( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) == NULL ); + + #if( configUSE_TICKLESS_IDLE != 0 ) + { + /* If a task is blocked waiting for a notification then + xNextTaskUnblockTime might be set to the blocked task's time + out time. If the task is unblocked for a reason other than + a timeout xNextTaskUnblockTime is normally left unchanged, + because it will automatically get reset to a new value when + the tick count equals xNextTaskUnblockTime. However if + tickless idling is used it might be more important to enter + sleep mode at the earliest possible time - so reset + xNextTaskUnblockTime here to ensure it is updated at the + earliest possible time. */ + prvResetNextTaskUnblockTime(); + } + #endif + + if( pxTCB->uxPriority > pxCurrentTCB->uxPriority ) + { + /* The notified task has a priority above the currently + executing task so a yield is required. */ + taskYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + + return xReturn; + } + +#endif /* configUSE_TASK_NOTIFICATIONS */ +/*-----------------------------------------------------------*/ + +#if( configUSE_TASK_NOTIFICATIONS == 1 ) + + BaseType_t xTaskGenericNotifyFromISR( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue, BaseType_t *pxHigherPriorityTaskWoken ) + { + TCB_t * pxTCB; + uint8_t ucOriginalNotifyState; + BaseType_t xReturn = pdPASS; + UBaseType_t uxSavedInterruptStatus; + + configASSERT( xTaskToNotify ); + + /* RTOS ports that support interrupt nesting have the concept of a + maximum system call (or maximum API call) interrupt priority. + Interrupts that are above the maximum system call priority are keep + permanently enabled, even when the RTOS kernel is in a critical section, + but cannot make any calls to FreeRTOS API functions. If configASSERT() + is defined in FreeRTOSConfig.h then + portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + failure if a FreeRTOS API function is called from an interrupt that has + been assigned a priority above the configured maximum system call + priority. Only FreeRTOS functions that end in FromISR can be called + from interrupts that have been assigned a priority at or (logically) + below the maximum system call interrupt priority. FreeRTOS maintains a + separate interrupt safe API to ensure interrupt entry is as fast and as + simple as possible. More information (albeit Cortex-M specific) is + provided on the following link: + http://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + pxTCB = ( TCB_t * ) xTaskToNotify; + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + if( pulPreviousNotificationValue != NULL ) + { + *pulPreviousNotificationValue = pxTCB->ulNotifiedValue; + } + + ucOriginalNotifyState = pxTCB->ucNotifyState; + pxTCB->ucNotifyState = taskNOTIFICATION_RECEIVED; + + switch( eAction ) + { + case eSetBits : + pxTCB->ulNotifiedValue |= ulValue; + break; + + case eIncrement : + ( pxTCB->ulNotifiedValue )++; + break; + + case eSetValueWithOverwrite : + pxTCB->ulNotifiedValue = ulValue; + break; + + case eSetValueWithoutOverwrite : + if( ucOriginalNotifyState != taskNOTIFICATION_RECEIVED ) + { + pxTCB->ulNotifiedValue = ulValue; + } + else + { + /* The value could not be written to the task. */ + xReturn = pdFAIL; + } + break; + + case eNoAction : + /* The task is being notified without its notify value being + updated. */ + break; + } + + traceTASK_NOTIFY_FROM_ISR(); + + /* If the task is in the blocked state specifically to wait for a + notification then unblock it now. */ + if( ucOriginalNotifyState == taskWAITING_NOTIFICATION ) + { + /* The task should not have been on an event list. */ + configASSERT( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) == NULL ); + + if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) + { + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxTCB ); + } + else + { + /* The delayed and ready lists cannot be accessed, so hold + this task pending until the scheduler is resumed. */ + vListInsertEnd( &( xPendingReadyList ), &( pxTCB->xEventListItem ) ); + } + + if( pxTCB->uxPriority > pxCurrentTCB->uxPriority ) + { + /* The notified task has a priority above the currently + executing task so a yield is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + /* Mark that a yield is pending in case the user is not + using the "xHigherPriorityTaskWoken" parameter to an ISR + safe FreeRTOS function. */ + xYieldPending = pdTRUE; + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; + } + +#endif /* configUSE_TASK_NOTIFICATIONS */ +/*-----------------------------------------------------------*/ + +#if( configUSE_TASK_NOTIFICATIONS == 1 ) + + void vTaskNotifyGiveFromISR( TaskHandle_t xTaskToNotify, BaseType_t *pxHigherPriorityTaskWoken ) + { + TCB_t * pxTCB; + uint8_t ucOriginalNotifyState; + UBaseType_t uxSavedInterruptStatus; + + configASSERT( xTaskToNotify ); + + /* RTOS ports that support interrupt nesting have the concept of a + maximum system call (or maximum API call) interrupt priority. + Interrupts that are above the maximum system call priority are keep + permanently enabled, even when the RTOS kernel is in a critical section, + but cannot make any calls to FreeRTOS API functions. If configASSERT() + is defined in FreeRTOSConfig.h then + portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + failure if a FreeRTOS API function is called from an interrupt that has + been assigned a priority above the configured maximum system call + priority. Only FreeRTOS functions that end in FromISR can be called + from interrupts that have been assigned a priority at or (logically) + below the maximum system call interrupt priority. FreeRTOS maintains a + separate interrupt safe API to ensure interrupt entry is as fast and as + simple as possible. More information (albeit Cortex-M specific) is + provided on the following link: + http://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + pxTCB = ( TCB_t * ) xTaskToNotify; + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + ucOriginalNotifyState = pxTCB->ucNotifyState; + pxTCB->ucNotifyState = taskNOTIFICATION_RECEIVED; + + /* 'Giving' is equivalent to incrementing a count in a counting + semaphore. */ + ( pxTCB->ulNotifiedValue )++; + + traceTASK_NOTIFY_GIVE_FROM_ISR(); + + /* If the task is in the blocked state specifically to wait for a + notification then unblock it now. */ + if( ucOriginalNotifyState == taskWAITING_NOTIFICATION ) + { + /* The task should not have been on an event list. */ + configASSERT( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) == NULL ); + + if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) + { + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxTCB ); + } + else + { + /* The delayed and ready lists cannot be accessed, so hold + this task pending until the scheduler is resumed. */ + vListInsertEnd( &( xPendingReadyList ), &( pxTCB->xEventListItem ) ); + } + + if( pxTCB->uxPriority > pxCurrentTCB->uxPriority ) + { + /* The notified task has a priority above the currently + executing task so a yield is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + /* Mark that a yield is pending in case the user is not + using the "xHigherPriorityTaskWoken" parameter in an ISR + safe FreeRTOS function. */ + xYieldPending = pdTRUE; + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + } + +#endif /* configUSE_TASK_NOTIFICATIONS */ + +/*-----------------------------------------------------------*/ + +#if( configUSE_TASK_NOTIFICATIONS == 1 ) + + BaseType_t xTaskNotifyStateClear( TaskHandle_t xTask ) + { + TCB_t *pxTCB; + BaseType_t xReturn; + + /* If null is passed in here then it is the calling task that is having + its notification state cleared. */ + pxTCB = prvGetTCBFromHandle( xTask ); + + taskENTER_CRITICAL(); + { + if( pxTCB->ucNotifyState == taskNOTIFICATION_RECEIVED ) + { + pxTCB->ucNotifyState = taskNOT_WAITING_NOTIFICATION; + xReturn = pdPASS; + } + else + { + xReturn = pdFAIL; + } + } + taskEXIT_CRITICAL(); + + return xReturn; + } + +#endif /* configUSE_TASK_NOTIFICATIONS */ +/*-----------------------------------------------------------*/ + + +static void prvAddCurrentTaskToDelayedList( TickType_t xTicksToWait, const BaseType_t xCanBlockIndefinitely ) +{ +TickType_t xTimeToWake; +const TickType_t xConstTickCount = xTickCount; + + #if( INCLUDE_xTaskAbortDelay == 1 ) + { + /* About to enter a delayed list, so ensure the ucDelayAborted flag is + reset to pdFALSE so it can be detected as having been set to pdTRUE + when the task leaves the Blocked state. */ + pxCurrentTCB->ucDelayAborted = pdFALSE; + } + #endif + + /* Remove the task from the ready list before adding it to the blocked list + as the same list item is used for both lists. */ + if( uxListRemove( &( pxCurrentTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) + { + /* The current task must be in a ready list, so there is no need to + check, and the port reset macro can be called directly. */ + portRESET_READY_PRIORITY( pxCurrentTCB->uxPriority, uxTopReadyPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + #if ( INCLUDE_vTaskSuspend == 1 ) + { + if( ( xTicksToWait == portMAX_DELAY ) && ( xCanBlockIndefinitely != pdFALSE ) ) + { + /* Add the task to the suspended task list instead of a delayed task + list to ensure it is not woken by a timing event. It will block + indefinitely. */ + vListInsertEnd( &xSuspendedTaskList, &( pxCurrentTCB->xStateListItem ) ); + } + else + { + /* Calculate the time at which the task should be woken if the event + does not occur. This may overflow but this doesn't matter, the + kernel will manage it correctly. */ + xTimeToWake = xConstTickCount + xTicksToWait; + + /* The list item will be inserted in wake time order. */ + listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xStateListItem ), xTimeToWake ); + + if( xTimeToWake < xConstTickCount ) + { + /* Wake time has overflowed. Place this item in the overflow + list. */ + vListInsert( pxOverflowDelayedTaskList, &( pxCurrentTCB->xStateListItem ) ); + } + else + { + /* The wake time has not overflowed, so the current block list + is used. */ + vListInsert( pxDelayedTaskList, &( pxCurrentTCB->xStateListItem ) ); + + /* If the task entering the blocked state was placed at the + head of the list of blocked tasks then xNextTaskUnblockTime + needs to be updated too. */ + if( xTimeToWake < xNextTaskUnblockTime ) + { + xNextTaskUnblockTime = xTimeToWake; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + } + #else /* INCLUDE_vTaskSuspend */ + { + /* Calculate the time at which the task should be woken if the event + does not occur. This may overflow but this doesn't matter, the kernel + will manage it correctly. */ + xTimeToWake = xConstTickCount + xTicksToWait; + + /* The list item will be inserted in wake time order. */ + listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xStateListItem ), xTimeToWake ); + + if( xTimeToWake < xConstTickCount ) + { + /* Wake time has overflowed. Place this item in the overflow list. */ + vListInsert( pxOverflowDelayedTaskList, &( pxCurrentTCB->xStateListItem ) ); + } + else + { + /* The wake time has not overflowed, so the current block list is used. */ + vListInsert( pxDelayedTaskList, &( pxCurrentTCB->xStateListItem ) ); + + /* If the task entering the blocked state was placed at the head of the + list of blocked tasks then xNextTaskUnblockTime needs to be updated + too. */ + if( xTimeToWake < xNextTaskUnblockTime ) + { + xNextTaskUnblockTime = xTimeToWake; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + /* Avoid compiler warning when INCLUDE_vTaskSuspend is not 1. */ + ( void ) xCanBlockIndefinitely; + } + #endif /* INCLUDE_vTaskSuspend */ +} + + +#ifdef FREERTOS_MODULE_TEST + #include "tasks_test_access_functions.h" +#endif + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/timers.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/timers.c new file mode 100644 index 0000000..e49587f --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/Source/timers.c @@ -0,0 +1,1092 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* Standard includes. */ +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining +all the API functions to use the MPU wrappers. That should only be done when +task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "timers.h" + +#if ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 0 ) + #error configUSE_TIMERS must be set to 1 to make the xTimerPendFunctionCall() function available. +#endif + +/* Lint e961 and e750 are suppressed as a MISRA exception justified because the +MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined for the +header files above, but not in this file, in order to generate the correct +privileged Vs unprivileged linkage and placement. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750. */ + + +/* This entire source file will be skipped if the application is not configured +to include software timer functionality. This #if is closed at the very bottom +of this file. If you want to include software timer functionality then ensure +configUSE_TIMERS is set to 1 in FreeRTOSConfig.h. */ +#if ( configUSE_TIMERS == 1 ) + +/* Misc definitions. */ +#define tmrNO_DELAY ( TickType_t ) 0U + +/* The definition of the timers themselves. */ +typedef struct tmrTimerControl +{ + const char *pcTimerName; /*<< Text name. This is not used by the kernel, it is included simply to make debugging easier. */ /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + ListItem_t xTimerListItem; /*<< Standard linked list item as used by all kernel features for event management. */ + TickType_t xTimerPeriodInTicks;/*<< How quickly and often the timer expires. */ + UBaseType_t uxAutoReload; /*<< Set to pdTRUE if the timer should be automatically restarted once expired. Set to pdFALSE if the timer is, in effect, a one-shot timer. */ + void *pvTimerID; /*<< An ID to identify the timer. This allows the timer to be identified when the same callback is used for multiple timers. */ + TimerCallbackFunction_t pxCallbackFunction; /*<< The function that will be called when the timer expires. */ + #if( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxTimerNumber; /*<< An ID assigned by trace tools such as FreeRTOS+Trace */ + #endif + + #if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + uint8_t ucStaticallyAllocated; /*<< Set to pdTRUE if the timer was created statically so no attempt is made to free the memory again if the timer is later deleted. */ + #endif +} xTIMER; + +/* The old xTIMER name is maintained above then typedefed to the new Timer_t +name below to enable the use of older kernel aware debuggers. */ +typedef xTIMER Timer_t; + +/* The definition of messages that can be sent and received on the timer queue. +Two types of message can be queued - messages that manipulate a software timer, +and messages that request the execution of a non-timer related callback. The +two message types are defined in two separate structures, xTimerParametersType +and xCallbackParametersType respectively. */ +typedef struct tmrTimerParameters +{ + TickType_t xMessageValue; /*<< An optional value used by a subset of commands, for example, when changing the period of a timer. */ + Timer_t * pxTimer; /*<< The timer to which the command will be applied. */ +} TimerParameter_t; + + +typedef struct tmrCallbackParameters +{ + PendedFunction_t pxCallbackFunction; /* << The callback function to execute. */ + void *pvParameter1; /* << The value that will be used as the callback functions first parameter. */ + uint32_t ulParameter2; /* << The value that will be used as the callback functions second parameter. */ +} CallbackParameters_t; + +/* The structure that contains the two message types, along with an identifier +that is used to determine which message type is valid. */ +typedef struct tmrTimerQueueMessage +{ + BaseType_t xMessageID; /*<< The command being sent to the timer service task. */ + union + { + TimerParameter_t xTimerParameters; + + /* Don't include xCallbackParameters if it is not going to be used as + it makes the structure (and therefore the timer queue) larger. */ + #if ( INCLUDE_xTimerPendFunctionCall == 1 ) + CallbackParameters_t xCallbackParameters; + #endif /* INCLUDE_xTimerPendFunctionCall */ + } u; +} DaemonTaskMessage_t; + +/*lint -e956 A manual analysis and inspection has been used to determine which +static variables must be declared volatile. */ + +/* The list in which active timers are stored. Timers are referenced in expire +time order, with the nearest expiry time at the front of the list. Only the +timer service task is allowed to access these lists. */ +PRIVILEGED_DATA static List_t xActiveTimerList1; +PRIVILEGED_DATA static List_t xActiveTimerList2; +PRIVILEGED_DATA static List_t *pxCurrentTimerList; +PRIVILEGED_DATA static List_t *pxOverflowTimerList; + +/* A queue that is used to send commands to the timer service task. */ +PRIVILEGED_DATA static QueueHandle_t xTimerQueue = NULL; +PRIVILEGED_DATA static TaskHandle_t xTimerTaskHandle = NULL; + +/*lint +e956 */ + +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + + /* If static allocation is supported then the application must provide the + following callback function - which enables the application to optionally + provide the memory that will be used by the timer task as the task's stack + and TCB. */ + extern void vApplicationGetTimerTaskMemory( StaticTask_t **ppxTimerTaskTCBBuffer, StackType_t **ppxTimerTaskStackBuffer, uint32_t *pulTimerTaskStackSize ); + +#endif + +/* + * Initialise the infrastructure used by the timer service task if it has not + * been initialised already. + */ +static void prvCheckForValidListAndQueue( void ) PRIVILEGED_FUNCTION; + +/* + * The timer service task (daemon). Timer functionality is controlled by this + * task. Other tasks communicate with the timer service task using the + * xTimerQueue queue. + */ +static void prvTimerTask( void *pvParameters ) PRIVILEGED_FUNCTION; + +/* + * Called by the timer service task to interpret and process a command it + * received on the timer queue. + */ +static void prvProcessReceivedCommands( void ) PRIVILEGED_FUNCTION; + +/* + * Insert the timer into either xActiveTimerList1, or xActiveTimerList2, + * depending on if the expire time causes a timer counter overflow. + */ +static BaseType_t prvInsertTimerInActiveList( Timer_t * const pxTimer, const TickType_t xNextExpiryTime, const TickType_t xTimeNow, const TickType_t xCommandTime ) PRIVILEGED_FUNCTION; + +/* + * An active timer has reached its expire time. Reload the timer if it is an + * auto reload timer, then call its callback. + */ +static void prvProcessExpiredTimer( const TickType_t xNextExpireTime, const TickType_t xTimeNow ) PRIVILEGED_FUNCTION; + +/* + * The tick count has overflowed. Switch the timer lists after ensuring the + * current timer list does not still reference some timers. + */ +static void prvSwitchTimerLists( void ) PRIVILEGED_FUNCTION; + +/* + * Obtain the current tick count, setting *pxTimerListsWereSwitched to pdTRUE + * if a tick count overflow occurred since prvSampleTimeNow() was last called. + */ +static TickType_t prvSampleTimeNow( BaseType_t * const pxTimerListsWereSwitched ) PRIVILEGED_FUNCTION; + +/* + * If the timer list contains any active timers then return the expire time of + * the timer that will expire first and set *pxListWasEmpty to false. If the + * timer list does not contain any timers then return 0 and set *pxListWasEmpty + * to pdTRUE. + */ +static TickType_t prvGetNextExpireTime( BaseType_t * const pxListWasEmpty ) PRIVILEGED_FUNCTION; + +/* + * If a timer has expired, process it. Otherwise, block the timer service task + * until either a timer does expire or a command is received. + */ +static void prvProcessTimerOrBlockTask( const TickType_t xNextExpireTime, BaseType_t xListWasEmpty ) PRIVILEGED_FUNCTION; + +/* + * Called after a Timer_t structure has been allocated either statically or + * dynamically to fill in the structure's members. + */ +static void prvInitialiseNewTimer( const char * const pcTimerName, + const TickType_t xTimerPeriodInTicks, + const UBaseType_t uxAutoReload, + void * const pvTimerID, + TimerCallbackFunction_t pxCallbackFunction, + Timer_t *pxNewTimer ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ +/*-----------------------------------------------------------*/ + +BaseType_t xTimerCreateTimerTask( void ) +{ +BaseType_t xReturn = pdFAIL; + + /* This function is called when the scheduler is started if + configUSE_TIMERS is set to 1. Check that the infrastructure used by the + timer service task has been created/initialised. If timers have already + been created then the initialisation will already have been performed. */ + prvCheckForValidListAndQueue(); + + if( xTimerQueue != NULL ) + { + #if( configSUPPORT_STATIC_ALLOCATION == 1 ) + { + StaticTask_t *pxTimerTaskTCBBuffer = NULL; + StackType_t *pxTimerTaskStackBuffer = NULL; + uint32_t ulTimerTaskStackSize; + + vApplicationGetTimerTaskMemory( &pxTimerTaskTCBBuffer, &pxTimerTaskStackBuffer, &ulTimerTaskStackSize ); + xTimerTaskHandle = xTaskCreateStatic( prvTimerTask, + "Tmr Svc", + ulTimerTaskStackSize, + NULL, + ( ( UBaseType_t ) configTIMER_TASK_PRIORITY ) | portPRIVILEGE_BIT, + pxTimerTaskStackBuffer, + pxTimerTaskTCBBuffer ); + + if( xTimerTaskHandle != NULL ) + { + xReturn = pdPASS; + } + } + #else + { + xReturn = xTaskCreate( prvTimerTask, + "Tmr Svc", + configTIMER_TASK_STACK_DEPTH, + NULL, + ( ( UBaseType_t ) configTIMER_TASK_PRIORITY ) | portPRIVILEGE_BIT, + &xTimerTaskHandle ); + } + #endif /* configSUPPORT_STATIC_ALLOCATION */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + configASSERT( xReturn ); + return xReturn; +} +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + + TimerHandle_t xTimerCreate( const char * const pcTimerName, + const TickType_t xTimerPeriodInTicks, + const UBaseType_t uxAutoReload, + void * const pvTimerID, + TimerCallbackFunction_t pxCallbackFunction ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + { + Timer_t *pxNewTimer; + + pxNewTimer = ( Timer_t * ) pvPortMalloc( sizeof( Timer_t ) ); + + if( pxNewTimer != NULL ) + { + prvInitialiseNewTimer( pcTimerName, xTimerPeriodInTicks, uxAutoReload, pvTimerID, pxCallbackFunction, pxNewTimer ); + + #if( configSUPPORT_STATIC_ALLOCATION == 1 ) + { + /* Timers can be created statically or dynamically, so note this + timer was created dynamically in case the timer is later + deleted. */ + pxNewTimer->ucStaticallyAllocated = pdFALSE; + } + #endif /* configSUPPORT_STATIC_ALLOCATION */ + } + + return pxNewTimer; + } + +#endif /* configSUPPORT_STATIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + + TimerHandle_t xTimerCreateStatic( const char * const pcTimerName, + const TickType_t xTimerPeriodInTicks, + const UBaseType_t uxAutoReload, + void * const pvTimerID, + TimerCallbackFunction_t pxCallbackFunction, + StaticTimer_t *pxTimerBuffer ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + { + Timer_t *pxNewTimer; + + #if( configASSERT_DEFINED == 1 ) + { + /* Sanity check that the size of the structure used to declare a + variable of type StaticTimer_t equals the size of the real timer + structures. */ + volatile size_t xSize = sizeof( StaticTimer_t ); + configASSERT( xSize == sizeof( Timer_t ) ); + } + #endif /* configASSERT_DEFINED */ + + /* A pointer to a StaticTimer_t structure MUST be provided, use it. */ + configASSERT( pxTimerBuffer ); + pxNewTimer = ( Timer_t * ) pxTimerBuffer; /*lint !e740 Unusual cast is ok as the structures are designed to have the same alignment, and the size is checked by an assert. */ + + if( pxNewTimer != NULL ) + { + prvInitialiseNewTimer( pcTimerName, xTimerPeriodInTicks, uxAutoReload, pvTimerID, pxCallbackFunction, pxNewTimer ); + + #if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + { + /* Timers can be created statically or dynamically so note this + timer was created statically in case it is later deleted. */ + pxNewTimer->ucStaticallyAllocated = pdTRUE; + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ + } + + return pxNewTimer; + } + +#endif /* configSUPPORT_STATIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +static void prvInitialiseNewTimer( const char * const pcTimerName, + const TickType_t xTimerPeriodInTicks, + const UBaseType_t uxAutoReload, + void * const pvTimerID, + TimerCallbackFunction_t pxCallbackFunction, + Timer_t *pxNewTimer ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ +{ + /* 0 is not a valid value for xTimerPeriodInTicks. */ + configASSERT( ( xTimerPeriodInTicks > 0 ) ); + + if( pxNewTimer != NULL ) + { + /* Ensure the infrastructure used by the timer service task has been + created/initialised. */ + prvCheckForValidListAndQueue(); + + /* Initialise the timer structure members using the function + parameters. */ + pxNewTimer->pcTimerName = pcTimerName; + pxNewTimer->xTimerPeriodInTicks = xTimerPeriodInTicks; + pxNewTimer->uxAutoReload = uxAutoReload; + pxNewTimer->pvTimerID = pvTimerID; + pxNewTimer->pxCallbackFunction = pxCallbackFunction; + vListInitialiseItem( &( pxNewTimer->xTimerListItem ) ); + traceTIMER_CREATE( pxNewTimer ); + } +} +/*-----------------------------------------------------------*/ + +BaseType_t xTimerGenericCommand( TimerHandle_t xTimer, const BaseType_t xCommandID, const TickType_t xOptionalValue, BaseType_t * const pxHigherPriorityTaskWoken, const TickType_t xTicksToWait ) +{ +BaseType_t xReturn = pdFAIL; +DaemonTaskMessage_t xMessage; + + configASSERT( xTimer ); + + /* Send a message to the timer service task to perform a particular action + on a particular timer definition. */ + if( xTimerQueue != NULL ) + { + /* Send a command to the timer service task to start the xTimer timer. */ + xMessage.xMessageID = xCommandID; + xMessage.u.xTimerParameters.xMessageValue = xOptionalValue; + xMessage.u.xTimerParameters.pxTimer = ( Timer_t * ) xTimer; + + if( xCommandID < tmrFIRST_FROM_ISR_COMMAND ) + { + if( xTaskGetSchedulerState() == taskSCHEDULER_RUNNING ) + { + xReturn = xQueueSendToBack( xTimerQueue, &xMessage, xTicksToWait ); + } + else + { + xReturn = xQueueSendToBack( xTimerQueue, &xMessage, tmrNO_DELAY ); + } + } + else + { + xReturn = xQueueSendToBackFromISR( xTimerQueue, &xMessage, pxHigherPriorityTaskWoken ); + } + + traceTIMER_COMMAND_SEND( xTimer, xCommandID, xOptionalValue, xReturn ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + +TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ) +{ + /* If xTimerGetTimerDaemonTaskHandle() is called before the scheduler has been + started, then xTimerTaskHandle will be NULL. */ + configASSERT( ( xTimerTaskHandle != NULL ) ); + return xTimerTaskHandle; +} +/*-----------------------------------------------------------*/ + +TickType_t xTimerGetPeriod( TimerHandle_t xTimer ) +{ +Timer_t *pxTimer = ( Timer_t * ) xTimer; + + configASSERT( xTimer ); + return pxTimer->xTimerPeriodInTicks; +} +/*-----------------------------------------------------------*/ + +TickType_t xTimerGetExpiryTime( TimerHandle_t xTimer ) +{ +Timer_t * pxTimer = ( Timer_t * ) xTimer; +TickType_t xReturn; + + configASSERT( xTimer ); + xReturn = listGET_LIST_ITEM_VALUE( &( pxTimer->xTimerListItem ) ); + return xReturn; +} +/*-----------------------------------------------------------*/ + +const char * pcTimerGetName( TimerHandle_t xTimer ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ +{ +Timer_t *pxTimer = ( Timer_t * ) xTimer; + + configASSERT( xTimer ); + return pxTimer->pcTimerName; +} +/*-----------------------------------------------------------*/ + +static void prvProcessExpiredTimer( const TickType_t xNextExpireTime, const TickType_t xTimeNow ) +{ +BaseType_t xResult; +Timer_t * const pxTimer = ( Timer_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxCurrentTimerList ); + + /* Remove the timer from the list of active timers. A check has already + been performed to ensure the list is not empty. */ + ( void ) uxListRemove( &( pxTimer->xTimerListItem ) ); + traceTIMER_EXPIRED( pxTimer ); + + /* If the timer is an auto reload timer then calculate the next + expiry time and re-insert the timer in the list of active timers. */ + if( pxTimer->uxAutoReload == ( UBaseType_t ) pdTRUE ) + { + /* The timer is inserted into a list using a time relative to anything + other than the current time. It will therefore be inserted into the + correct list relative to the time this task thinks it is now. */ + if( prvInsertTimerInActiveList( pxTimer, ( xNextExpireTime + pxTimer->xTimerPeriodInTicks ), xTimeNow, xNextExpireTime ) != pdFALSE ) + { + /* The timer expired before it was added to the active timer + list. Reload it now. */ + xResult = xTimerGenericCommand( pxTimer, tmrCOMMAND_START_DONT_TRACE, xNextExpireTime, NULL, tmrNO_DELAY ); + configASSERT( xResult ); + ( void ) xResult; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Call the timer callback. */ + pxTimer->pxCallbackFunction( ( TimerHandle_t ) pxTimer ); +} +/*-----------------------------------------------------------*/ + +static void prvTimerTask( void *pvParameters ) +{ +TickType_t xNextExpireTime; +BaseType_t xListWasEmpty; + + /* Just to avoid compiler warnings. */ + ( void ) pvParameters; + + #if( configUSE_DAEMON_TASK_STARTUP_HOOK == 1 ) + { + extern void vApplicationDaemonTaskStartupHook( void ); + + /* Allow the application writer to execute some code in the context of + this task at the point the task starts executing. This is useful if the + application includes initialisation code that would benefit from + executing after the scheduler has been started. */ + vApplicationDaemonTaskStartupHook(); + } + #endif /* configUSE_DAEMON_TASK_STARTUP_HOOK */ + + for( ;; ) + { + /* Query the timers list to see if it contains any timers, and if so, + obtain the time at which the next timer will expire. */ + xNextExpireTime = prvGetNextExpireTime( &xListWasEmpty ); + + /* If a timer has expired, process it. Otherwise, block this task + until either a timer does expire, or a command is received. */ + prvProcessTimerOrBlockTask( xNextExpireTime, xListWasEmpty ); + + /* Empty the command queue. */ + prvProcessReceivedCommands(); + } +} +/*-----------------------------------------------------------*/ + +static void prvProcessTimerOrBlockTask( const TickType_t xNextExpireTime, BaseType_t xListWasEmpty ) +{ +TickType_t xTimeNow; +BaseType_t xTimerListsWereSwitched; + + vTaskSuspendAll(); + { + /* Obtain the time now to make an assessment as to whether the timer + has expired or not. If obtaining the time causes the lists to switch + then don't process this timer as any timers that remained in the list + when the lists were switched will have been processed within the + prvSampleTimeNow() function. */ + xTimeNow = prvSampleTimeNow( &xTimerListsWereSwitched ); + if( xTimerListsWereSwitched == pdFALSE ) + { + /* The tick count has not overflowed, has the timer expired? */ + if( ( xListWasEmpty == pdFALSE ) && ( xNextExpireTime <= xTimeNow ) ) + { + ( void ) xTaskResumeAll(); + prvProcessExpiredTimer( xNextExpireTime, xTimeNow ); + } + else + { + /* The tick count has not overflowed, and the next expire + time has not been reached yet. This task should therefore + block to wait for the next expire time or a command to be + received - whichever comes first. The following line cannot + be reached unless xNextExpireTime > xTimeNow, except in the + case when the current timer list is empty. */ + if( xListWasEmpty != pdFALSE ) + { + /* The current timer list is empty - is the overflow list + also empty? */ + xListWasEmpty = listLIST_IS_EMPTY( pxOverflowTimerList ); + } + + vQueueWaitForMessageRestricted( xTimerQueue, ( xNextExpireTime - xTimeNow ), xListWasEmpty ); + + if( xTaskResumeAll() == pdFALSE ) + { + /* Yield to wait for either a command to arrive, or the + block time to expire. If a command arrived between the + critical section being exited and this yield then the yield + will not cause the task to block. */ + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + else + { + ( void ) xTaskResumeAll(); + } + } +} +/*-----------------------------------------------------------*/ + +static TickType_t prvGetNextExpireTime( BaseType_t * const pxListWasEmpty ) +{ +TickType_t xNextExpireTime; + + /* Timers are listed in expiry time order, with the head of the list + referencing the task that will expire first. Obtain the time at which + the timer with the nearest expiry time will expire. If there are no + active timers then just set the next expire time to 0. That will cause + this task to unblock when the tick count overflows, at which point the + timer lists will be switched and the next expiry time can be + re-assessed. */ + *pxListWasEmpty = listLIST_IS_EMPTY( pxCurrentTimerList ); + if( *pxListWasEmpty == pdFALSE ) + { + xNextExpireTime = listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxCurrentTimerList ); + } + else + { + /* Ensure the task unblocks when the tick count rolls over. */ + xNextExpireTime = ( TickType_t ) 0U; + } + + return xNextExpireTime; +} +/*-----------------------------------------------------------*/ + +static TickType_t prvSampleTimeNow( BaseType_t * const pxTimerListsWereSwitched ) +{ +TickType_t xTimeNow; +PRIVILEGED_DATA static TickType_t xLastTime = ( TickType_t ) 0U; /*lint !e956 Variable is only accessible to one task. */ + + xTimeNow = xTaskGetTickCount(); + + if( xTimeNow < xLastTime ) + { + prvSwitchTimerLists(); + *pxTimerListsWereSwitched = pdTRUE; + } + else + { + *pxTimerListsWereSwitched = pdFALSE; + } + + xLastTime = xTimeNow; + + return xTimeNow; +} +/*-----------------------------------------------------------*/ + +static BaseType_t prvInsertTimerInActiveList( Timer_t * const pxTimer, const TickType_t xNextExpiryTime, const TickType_t xTimeNow, const TickType_t xCommandTime ) +{ +BaseType_t xProcessTimerNow = pdFALSE; + + listSET_LIST_ITEM_VALUE( &( pxTimer->xTimerListItem ), xNextExpiryTime ); + listSET_LIST_ITEM_OWNER( &( pxTimer->xTimerListItem ), pxTimer ); + + if( xNextExpiryTime <= xTimeNow ) + { + /* Has the expiry time elapsed between the command to start/reset a + timer was issued, and the time the command was processed? */ + if( ( ( TickType_t ) ( xTimeNow - xCommandTime ) ) >= pxTimer->xTimerPeriodInTicks ) /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + { + /* The time between a command being issued and the command being + processed actually exceeds the timers period. */ + xProcessTimerNow = pdTRUE; + } + else + { + vListInsert( pxOverflowTimerList, &( pxTimer->xTimerListItem ) ); + } + } + else + { + if( ( xTimeNow < xCommandTime ) && ( xNextExpiryTime >= xCommandTime ) ) + { + /* If, since the command was issued, the tick count has overflowed + but the expiry time has not, then the timer must have already passed + its expiry time and should be processed immediately. */ + xProcessTimerNow = pdTRUE; + } + else + { + vListInsert( pxCurrentTimerList, &( pxTimer->xTimerListItem ) ); + } + } + + return xProcessTimerNow; +} +/*-----------------------------------------------------------*/ + +static void prvProcessReceivedCommands( void ) +{ +DaemonTaskMessage_t xMessage; +Timer_t *pxTimer; +BaseType_t xTimerListsWereSwitched, xResult; +TickType_t xTimeNow; + + while( xQueueReceive( xTimerQueue, &xMessage, tmrNO_DELAY ) != pdFAIL ) /*lint !e603 xMessage does not have to be initialised as it is passed out, not in, and it is not used unless xQueueReceive() returns pdTRUE. */ + { + #if ( INCLUDE_xTimerPendFunctionCall == 1 ) + { + /* Negative commands are pended function calls rather than timer + commands. */ + if( xMessage.xMessageID < ( BaseType_t ) 0 ) + { + const CallbackParameters_t * const pxCallback = &( xMessage.u.xCallbackParameters ); + + /* The timer uses the xCallbackParameters member to request a + callback be executed. Check the callback is not NULL. */ + configASSERT( pxCallback ); + + /* Call the function. */ + pxCallback->pxCallbackFunction( pxCallback->pvParameter1, pxCallback->ulParameter2 ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* INCLUDE_xTimerPendFunctionCall */ + + /* Commands that are positive are timer commands rather than pended + function calls. */ + if( xMessage.xMessageID >= ( BaseType_t ) 0 ) + { + /* The messages uses the xTimerParameters member to work on a + software timer. */ + pxTimer = xMessage.u.xTimerParameters.pxTimer; + + if( listIS_CONTAINED_WITHIN( NULL, &( pxTimer->xTimerListItem ) ) == pdFALSE ) + { + /* The timer is in a list, remove it. */ + ( void ) uxListRemove( &( pxTimer->xTimerListItem ) ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceTIMER_COMMAND_RECEIVED( pxTimer, xMessage.xMessageID, xMessage.u.xTimerParameters.xMessageValue ); + + /* In this case the xTimerListsWereSwitched parameter is not used, but + it must be present in the function call. prvSampleTimeNow() must be + called after the message is received from xTimerQueue so there is no + possibility of a higher priority task adding a message to the message + queue with a time that is ahead of the timer daemon task (because it + pre-empted the timer daemon task after the xTimeNow value was set). */ + xTimeNow = prvSampleTimeNow( &xTimerListsWereSwitched ); + + switch( xMessage.xMessageID ) + { + case tmrCOMMAND_START : + case tmrCOMMAND_START_FROM_ISR : + case tmrCOMMAND_RESET : + case tmrCOMMAND_RESET_FROM_ISR : + case tmrCOMMAND_START_DONT_TRACE : + /* Start or restart a timer. */ + if( prvInsertTimerInActiveList( pxTimer, xMessage.u.xTimerParameters.xMessageValue + pxTimer->xTimerPeriodInTicks, xTimeNow, xMessage.u.xTimerParameters.xMessageValue ) != pdFALSE ) + { + /* The timer expired before it was added to the active + timer list. Process it now. */ + pxTimer->pxCallbackFunction( ( TimerHandle_t ) pxTimer ); + traceTIMER_EXPIRED( pxTimer ); + + if( pxTimer->uxAutoReload == ( UBaseType_t ) pdTRUE ) + { + xResult = xTimerGenericCommand( pxTimer, tmrCOMMAND_START_DONT_TRACE, xMessage.u.xTimerParameters.xMessageValue + pxTimer->xTimerPeriodInTicks, NULL, tmrNO_DELAY ); + configASSERT( xResult ); + ( void ) xResult; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + break; + + case tmrCOMMAND_STOP : + case tmrCOMMAND_STOP_FROM_ISR : + /* The timer has already been removed from the active list. + There is nothing to do here. */ + break; + + case tmrCOMMAND_CHANGE_PERIOD : + case tmrCOMMAND_CHANGE_PERIOD_FROM_ISR : + pxTimer->xTimerPeriodInTicks = xMessage.u.xTimerParameters.xMessageValue; + configASSERT( ( pxTimer->xTimerPeriodInTicks > 0 ) ); + + /* The new period does not really have a reference, and can + be longer or shorter than the old one. The command time is + therefore set to the current time, and as the period cannot + be zero the next expiry time can only be in the future, + meaning (unlike for the xTimerStart() case above) there is + no fail case that needs to be handled here. */ + ( void ) prvInsertTimerInActiveList( pxTimer, ( xTimeNow + pxTimer->xTimerPeriodInTicks ), xTimeNow, xTimeNow ); + break; + + case tmrCOMMAND_DELETE : + /* The timer has already been removed from the active list, + just free up the memory if the memory was dynamically + allocated. */ + #if( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 0 ) ) + { + /* The timer can only have been allocated dynamically - + free it again. */ + vPortFree( pxTimer ); + } + #elif( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + { + /* The timer could have been allocated statically or + dynamically, so check before attempting to free the + memory. */ + if( pxTimer->ucStaticallyAllocated == ( uint8_t ) pdFALSE ) + { + vPortFree( pxTimer ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ + break; + + default : + /* Don't expect to get here. */ + break; + } + } + } +} +/*-----------------------------------------------------------*/ + +static void prvSwitchTimerLists( void ) +{ +TickType_t xNextExpireTime, xReloadTime; +List_t *pxTemp; +Timer_t *pxTimer; +BaseType_t xResult; + + /* The tick count has overflowed. The timer lists must be switched. + If there are any timers still referenced from the current timer list + then they must have expired and should be processed before the lists + are switched. */ + while( listLIST_IS_EMPTY( pxCurrentTimerList ) == pdFALSE ) + { + xNextExpireTime = listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxCurrentTimerList ); + + /* Remove the timer from the list. */ + pxTimer = ( Timer_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxCurrentTimerList ); + ( void ) uxListRemove( &( pxTimer->xTimerListItem ) ); + traceTIMER_EXPIRED( pxTimer ); + + /* Execute its callback, then send a command to restart the timer if + it is an auto-reload timer. It cannot be restarted here as the lists + have not yet been switched. */ + pxTimer->pxCallbackFunction( ( TimerHandle_t ) pxTimer ); + + if( pxTimer->uxAutoReload == ( UBaseType_t ) pdTRUE ) + { + /* Calculate the reload value, and if the reload value results in + the timer going into the same timer list then it has already expired + and the timer should be re-inserted into the current list so it is + processed again within this loop. Otherwise a command should be sent + to restart the timer to ensure it is only inserted into a list after + the lists have been swapped. */ + xReloadTime = ( xNextExpireTime + pxTimer->xTimerPeriodInTicks ); + if( xReloadTime > xNextExpireTime ) + { + listSET_LIST_ITEM_VALUE( &( pxTimer->xTimerListItem ), xReloadTime ); + listSET_LIST_ITEM_OWNER( &( pxTimer->xTimerListItem ), pxTimer ); + vListInsert( pxCurrentTimerList, &( pxTimer->xTimerListItem ) ); + } + else + { + xResult = xTimerGenericCommand( pxTimer, tmrCOMMAND_START_DONT_TRACE, xNextExpireTime, NULL, tmrNO_DELAY ); + configASSERT( xResult ); + ( void ) xResult; + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + pxTemp = pxCurrentTimerList; + pxCurrentTimerList = pxOverflowTimerList; + pxOverflowTimerList = pxTemp; +} +/*-----------------------------------------------------------*/ + +static void prvCheckForValidListAndQueue( void ) +{ + /* Check that the list from which active timers are referenced, and the + queue used to communicate with the timer service, have been + initialised. */ + taskENTER_CRITICAL(); + { + if( xTimerQueue == NULL ) + { + vListInitialise( &xActiveTimerList1 ); + vListInitialise( &xActiveTimerList2 ); + pxCurrentTimerList = &xActiveTimerList1; + pxOverflowTimerList = &xActiveTimerList2; + + #if( configSUPPORT_STATIC_ALLOCATION == 1 ) + { + /* The timer queue is allocated statically in case + configSUPPORT_DYNAMIC_ALLOCATION is 0. */ + static StaticQueue_t xStaticTimerQueue; + static uint8_t ucStaticTimerQueueStorage[ configTIMER_QUEUE_LENGTH * sizeof( DaemonTaskMessage_t ) ]; + + xTimerQueue = xQueueCreateStatic( ( UBaseType_t ) configTIMER_QUEUE_LENGTH, sizeof( DaemonTaskMessage_t ), &( ucStaticTimerQueueStorage[ 0 ] ), &xStaticTimerQueue ); + } + #else + { + xTimerQueue = xQueueCreate( ( UBaseType_t ) configTIMER_QUEUE_LENGTH, sizeof( DaemonTaskMessage_t ) ); + } + #endif + + #if ( configQUEUE_REGISTRY_SIZE > 0 ) + { + if( xTimerQueue != NULL ) + { + vQueueAddToRegistry( xTimerQueue, "TmrQ" ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configQUEUE_REGISTRY_SIZE */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); +} +/*-----------------------------------------------------------*/ + +BaseType_t xTimerIsTimerActive( TimerHandle_t xTimer ) +{ +BaseType_t xTimerIsInActiveList; +Timer_t *pxTimer = ( Timer_t * ) xTimer; + + configASSERT( xTimer ); + + /* Is the timer in the list of active timers? */ + taskENTER_CRITICAL(); + { + /* Checking to see if it is in the NULL list in effect checks to see if + it is referenced from either the current or the overflow timer lists in + one go, but the logic has to be reversed, hence the '!'. */ + xTimerIsInActiveList = ( BaseType_t ) !( listIS_CONTAINED_WITHIN( NULL, &( pxTimer->xTimerListItem ) ) ); + } + taskEXIT_CRITICAL(); + + return xTimerIsInActiveList; +} /*lint !e818 Can't be pointer to const due to the typedef. */ +/*-----------------------------------------------------------*/ + +void *pvTimerGetTimerID( const TimerHandle_t xTimer ) +{ +Timer_t * const pxTimer = ( Timer_t * ) xTimer; +void *pvReturn; + + configASSERT( xTimer ); + + taskENTER_CRITICAL(); + { + pvReturn = pxTimer->pvTimerID; + } + taskEXIT_CRITICAL(); + + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void vTimerSetTimerID( TimerHandle_t xTimer, void *pvNewID ) +{ +Timer_t * const pxTimer = ( Timer_t * ) xTimer; + + configASSERT( xTimer ); + + taskENTER_CRITICAL(); + { + pxTimer->pvTimerID = pvNewID; + } + taskEXIT_CRITICAL(); +} +/*-----------------------------------------------------------*/ + +#if( INCLUDE_xTimerPendFunctionCall == 1 ) + + BaseType_t xTimerPendFunctionCallFromISR( PendedFunction_t xFunctionToPend, void *pvParameter1, uint32_t ulParameter2, BaseType_t *pxHigherPriorityTaskWoken ) + { + DaemonTaskMessage_t xMessage; + BaseType_t xReturn; + + /* Complete the message with the function parameters and post it to the + daemon task. */ + xMessage.xMessageID = tmrCOMMAND_EXECUTE_CALLBACK_FROM_ISR; + xMessage.u.xCallbackParameters.pxCallbackFunction = xFunctionToPend; + xMessage.u.xCallbackParameters.pvParameter1 = pvParameter1; + xMessage.u.xCallbackParameters.ulParameter2 = ulParameter2; + + xReturn = xQueueSendFromISR( xTimerQueue, &xMessage, pxHigherPriorityTaskWoken ); + + tracePEND_FUNC_CALL_FROM_ISR( xFunctionToPend, pvParameter1, ulParameter2, xReturn ); + + return xReturn; + } + +#endif /* INCLUDE_xTimerPendFunctionCall */ +/*-----------------------------------------------------------*/ + +#if( INCLUDE_xTimerPendFunctionCall == 1 ) + + BaseType_t xTimerPendFunctionCall( PendedFunction_t xFunctionToPend, void *pvParameter1, uint32_t ulParameter2, TickType_t xTicksToWait ) + { + DaemonTaskMessage_t xMessage; + BaseType_t xReturn; + + /* This function can only be called after a timer has been created or + after the scheduler has been started because, until then, the timer + queue does not exist. */ + configASSERT( xTimerQueue ); + + /* Complete the message with the function parameters and post it to the + daemon task. */ + xMessage.xMessageID = tmrCOMMAND_EXECUTE_CALLBACK; + xMessage.u.xCallbackParameters.pxCallbackFunction = xFunctionToPend; + xMessage.u.xCallbackParameters.pvParameter1 = pvParameter1; + xMessage.u.xCallbackParameters.ulParameter2 = ulParameter2; + + xReturn = xQueueSendToBack( xTimerQueue, &xMessage, xTicksToWait ); + + tracePEND_FUNC_CALL( xFunctionToPend, pvParameter1, ulParameter2, xReturn ); + + return xReturn; + } + +#endif /* INCLUDE_xTimerPendFunctionCall */ +/*-----------------------------------------------------------*/ + +/* This entire source file will be skipped if the application is not configured +to include software timer functionality. If you want to include software timer +functionality then ensure configUSE_TIMERS is set to 1 in FreeRTOSConfig.h. */ +#endif /* configUSE_TIMERS == 1 */ + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/readme.txt b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/readme.txt new file mode 100644 index 0000000..13ddc51 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/FreeRTOS/readme.txt @@ -0,0 +1,21 @@ +Directories: + ++ The FreeRTOS/Source directory contains the FreeRTOS source code, and contains + its own readme file. + ++ The FreeRTOS/Demo directory contains a demo application for every official +FreeRTOS port, and contains its own readme file. + ++ See http://www.freertos.org/a00017.html for full details of the directory + structure and information on locating the files you require. + +The easiest way to use FreeRTOS is to start with one of the pre-configured demo +application projects (found in the FreeRTOS/Demo directory). That way you will +have the correct FreeRTOS source files included, and the correct include paths +configured. Once a demo application is building and executing you can remove +the demo application file, and start to add in your own application source +files. + +See also - +http://www.freertos.org/FreeRTOS-quick-start-guide.html +http://www.freertos.org/FAQHelp.html diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/HAL/.cproject b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/HAL/.cproject new file mode 100644 index 0000000..da6a77b --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/HAL/.cproject @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/HAL/.project b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/HAL/.project new file mode 100644 index 0000000..bdbac9c --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/HAL/.project @@ -0,0 +1,26 @@ + + + HAL + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/HAL/.settings/language.settings.xml b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/HAL/.settings/language.settings.xml new file mode 100644 index 0000000..a0f50bf --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/HAL/.settings/language.settings.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/RemoteSystemsTempFiles/.project b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/RemoteSystemsTempFiles/.project new file mode 100644 index 0000000..7675629 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/RemoteSystemsTempFiles/.project @@ -0,0 +1,12 @@ + + + RemoteSystemsTempFiles + + + + + + + org.eclipse.rse.ui.remoteSystemsTempNature + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/.cproject b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/.cproject new file mode 100644 index 0000000..039a57a --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/.cproject @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + make + + all + true + false + true + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/.project b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/.project new file mode 100644 index 0000000..c17cfe5 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/.project @@ -0,0 +1,27 @@ + + + STM32F10x_StdPeriph_Lib_V3.5.0 + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + fr.ac6.mcu.ide.core.MCUFirmwareProjectNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/.settings/language.settings.xml b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/.settings/language.settings.xml new file mode 100644 index 0000000..7d2e012 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/.settings/language.settings.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport/core_cm3.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport/core_cm3.c new file mode 100644 index 0000000..56fddc5 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport/core_cm3.c @@ -0,0 +1,784 @@ +/**************************************************************************//** + * @file core_cm3.c + * @brief CMSIS Cortex-M3 Core Peripheral Access Layer Source File + * @version V1.30 + * @date 30. October 2009 + * + * @note + * Copyright (C) 2009 ARM Limited. All rights reserved. + * + * @par + * ARM Limited (ARM) is supplying this software for use with Cortex-M + * processor based microcontrollers. This file can be freely distributed + * within development tools that are supporting such ARM based processors. + * + * @par + * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED + * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. + * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR + * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. + * + ******************************************************************************/ + +#include + +/* define compiler specific symbols */ +#if defined ( __CC_ARM ) + #define __ASM __asm /*!< asm keyword for ARM Compiler */ + #define __INLINE __inline /*!< inline keyword for ARM Compiler */ + +#elif defined ( __ICCARM__ ) + #define __ASM __asm /*!< asm keyword for IAR Compiler */ + #define __INLINE inline /*!< inline keyword for IAR Compiler. Only avaiable in High optimization mode! */ + +#elif defined ( __GNUC__ ) + #define __ASM __asm /*!< asm keyword for GNU Compiler */ + #define __INLINE inline /*!< inline keyword for GNU Compiler */ + +#elif defined ( __TASKING__ ) + #define __ASM __asm /*!< asm keyword for TASKING Compiler */ + #define __INLINE inline /*!< inline keyword for TASKING Compiler */ + +#endif + + +/* ################### Compiler specific Intrinsics ########################### */ + +#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/ +/* ARM armcc specific functions */ + +/** + * @brief Return the Process Stack Pointer + * + * @return ProcessStackPointer + * + * Return the actual process stack pointer + */ +__ASM uint32_t __get_PSP(void) +{ + mrs r0, psp + bx lr +} + +/** + * @brief Set the Process Stack Pointer + * + * @param topOfProcStack Process Stack Pointer + * + * Assign the value ProcessStackPointer to the MSP + * (process stack pointer) Cortex processor register + */ +__ASM void __set_PSP(uint32_t topOfProcStack) +{ + msr psp, r0 + bx lr +} + +/** + * @brief Return the Main Stack Pointer + * + * @return Main Stack Pointer + * + * Return the current value of the MSP (main stack pointer) + * Cortex processor register + */ +__ASM uint32_t __get_MSP(void) +{ + mrs r0, msp + bx lr +} + +/** + * @brief Set the Main Stack Pointer + * + * @param topOfMainStack Main Stack Pointer + * + * Assign the value mainStackPointer to the MSP + * (main stack pointer) Cortex processor register + */ +__ASM void __set_MSP(uint32_t mainStackPointer) +{ + msr msp, r0 + bx lr +} + +/** + * @brief Reverse byte order in unsigned short value + * + * @param value value to reverse + * @return reversed value + * + * Reverse byte order in unsigned short value + */ +__ASM uint32_t __REV16(uint16_t value) +{ + rev16 r0, r0 + bx lr +} + +/** + * @brief Reverse byte order in signed short value with sign extension to integer + * + * @param value value to reverse + * @return reversed value + * + * Reverse byte order in signed short value with sign extension to integer + */ +__ASM int32_t __REVSH(int16_t value) +{ + revsh r0, r0 + bx lr +} + + +#if (__ARMCC_VERSION < 400000) + +/** + * @brief Remove the exclusive lock created by ldrex + * + * Removes the exclusive lock which is created by ldrex. + */ +__ASM void __CLREX(void) +{ + clrex +} + +/** + * @brief Return the Base Priority value + * + * @return BasePriority + * + * Return the content of the base priority register + */ +__ASM uint32_t __get_BASEPRI(void) +{ + mrs r0, basepri + bx lr +} + +/** + * @brief Set the Base Priority value + * + * @param basePri BasePriority + * + * Set the base priority register + */ +__ASM void __set_BASEPRI(uint32_t basePri) +{ + msr basepri, r0 + bx lr +} + +/** + * @brief Return the Priority Mask value + * + * @return PriMask + * + * Return state of the priority mask bit from the priority mask register + */ +__ASM uint32_t __get_PRIMASK(void) +{ + mrs r0, primask + bx lr +} + +/** + * @brief Set the Priority Mask value + * + * @param priMask PriMask + * + * Set the priority mask bit in the priority mask register + */ +__ASM void __set_PRIMASK(uint32_t priMask) +{ + msr primask, r0 + bx lr +} + +/** + * @brief Return the Fault Mask value + * + * @return FaultMask + * + * Return the content of the fault mask register + */ +__ASM uint32_t __get_FAULTMASK(void) +{ + mrs r0, faultmask + bx lr +} + +/** + * @brief Set the Fault Mask value + * + * @param faultMask faultMask value + * + * Set the fault mask register + */ +__ASM void __set_FAULTMASK(uint32_t faultMask) +{ + msr faultmask, r0 + bx lr +} + +/** + * @brief Return the Control Register value + * + * @return Control value + * + * Return the content of the control register + */ +__ASM uint32_t __get_CONTROL(void) +{ + mrs r0, control + bx lr +} + +/** + * @brief Set the Control Register value + * + * @param control Control value + * + * Set the control register + */ +__ASM void __set_CONTROL(uint32_t control) +{ + msr control, r0 + bx lr +} + +#endif /* __ARMCC_VERSION */ + + + +#elif (defined (__ICCARM__)) /*------------------ ICC Compiler -------------------*/ +/* IAR iccarm specific functions */ +#pragma diag_suppress=Pe940 + +/** + * @brief Return the Process Stack Pointer + * + * @return ProcessStackPointer + * + * Return the actual process stack pointer + */ +uint32_t __get_PSP(void) +{ + __ASM("mrs r0, psp"); + __ASM("bx lr"); +} + +/** + * @brief Set the Process Stack Pointer + * + * @param topOfProcStack Process Stack Pointer + * + * Assign the value ProcessStackPointer to the MSP + * (process stack pointer) Cortex processor register + */ +void __set_PSP(uint32_t topOfProcStack) +{ + __ASM("msr psp, r0"); + __ASM("bx lr"); +} + +/** + * @brief Return the Main Stack Pointer + * + * @return Main Stack Pointer + * + * Return the current value of the MSP (main stack pointer) + * Cortex processor register + */ +uint32_t __get_MSP(void) +{ + __ASM("mrs r0, msp"); + __ASM("bx lr"); +} + +/** + * @brief Set the Main Stack Pointer + * + * @param topOfMainStack Main Stack Pointer + * + * Assign the value mainStackPointer to the MSP + * (main stack pointer) Cortex processor register + */ +void __set_MSP(uint32_t topOfMainStack) +{ + __ASM("msr msp, r0"); + __ASM("bx lr"); +} + +/** + * @brief Reverse byte order in unsigned short value + * + * @param value value to reverse + * @return reversed value + * + * Reverse byte order in unsigned short value + */ +uint32_t __REV16(uint16_t value) +{ + __ASM("rev16 r0, r0"); + __ASM("bx lr"); +} + +/** + * @brief Reverse bit order of value + * + * @param value value to reverse + * @return reversed value + * + * Reverse bit order of value + */ +uint32_t __RBIT(uint32_t value) +{ + __ASM("rbit r0, r0"); + __ASM("bx lr"); +} + +/** + * @brief LDR Exclusive (8 bit) + * + * @param *addr address pointer + * @return value of (*address) + * + * Exclusive LDR command for 8 bit values) + */ +uint8_t __LDREXB(uint8_t *addr) +{ + __ASM("ldrexb r0, [r0]"); + __ASM("bx lr"); +} + +/** + * @brief LDR Exclusive (16 bit) + * + * @param *addr address pointer + * @return value of (*address) + * + * Exclusive LDR command for 16 bit values + */ +uint16_t __LDREXH(uint16_t *addr) +{ + __ASM("ldrexh r0, [r0]"); + __ASM("bx lr"); +} + +/** + * @brief LDR Exclusive (32 bit) + * + * @param *addr address pointer + * @return value of (*address) + * + * Exclusive LDR command for 32 bit values + */ +uint32_t __LDREXW(uint32_t *addr) +{ + __ASM("ldrex r0, [r0]"); + __ASM("bx lr"); +} + +/** + * @brief STR Exclusive (8 bit) + * + * @param value value to store + * @param *addr address pointer + * @return successful / failed + * + * Exclusive STR command for 8 bit values + */ +uint32_t __STREXB(uint8_t value, uint8_t *addr) +{ + __ASM("strexb r0, r0, [r1]"); + __ASM("bx lr"); +} + +/** + * @brief STR Exclusive (16 bit) + * + * @param value value to store + * @param *addr address pointer + * @return successful / failed + * + * Exclusive STR command for 16 bit values + */ +uint32_t __STREXH(uint16_t value, uint16_t *addr) +{ + __ASM("strexh r0, r0, [r1]"); + __ASM("bx lr"); +} + +/** + * @brief STR Exclusive (32 bit) + * + * @param value value to store + * @param *addr address pointer + * @return successful / failed + * + * Exclusive STR command for 32 bit values + */ +uint32_t __STREXW(uint32_t value, uint32_t *addr) +{ + __ASM("strex r0, r0, [r1]"); + __ASM("bx lr"); +} + +#pragma diag_default=Pe940 + + +#elif (defined (__GNUC__)) /*------------------ GNU Compiler ---------------------*/ +/* GNU gcc specific functions */ + +/** + * @brief Return the Process Stack Pointer + * + * @return ProcessStackPointer + * + * Return the actual process stack pointer + */ +uint32_t __get_PSP(void) __attribute__( ( naked ) ); +uint32_t __get_PSP(void) +{ + uint32_t result=0; + + __ASM volatile ("MRS %0, psp\n\t" + "MOV r0, %0 \n\t" + "BX lr \n\t" : "=r" (result) ); + return(result); +} + +/** + * @brief Set the Process Stack Pointer + * + * @param topOfProcStack Process Stack Pointer + * + * Assign the value ProcessStackPointer to the MSP + * (process stack pointer) Cortex processor register + */ +void __set_PSP(uint32_t topOfProcStack) __attribute__( ( naked ) ); +void __set_PSP(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp, %0\n\t" + "BX lr \n\t" : : "r" (topOfProcStack) ); +} + +/** + * @brief Return the Main Stack Pointer + * + * @return Main Stack Pointer + * + * Return the current value of the MSP (main stack pointer) + * Cortex processor register + */ +uint32_t __get_MSP(void) __attribute__( ( naked ) ); +uint32_t __get_MSP(void) +{ + uint32_t result=0; + + __ASM volatile ("MRS %0, msp\n\t" + "MOV r0, %0 \n\t" + "BX lr \n\t" : "=r" (result) ); + return(result); +} + +/** + * @brief Set the Main Stack Pointer + * + * @param topOfMainStack Main Stack Pointer + * + * Assign the value mainStackPointer to the MSP + * (main stack pointer) Cortex processor register + */ +void __set_MSP(uint32_t topOfMainStack) __attribute__( ( naked ) ); +void __set_MSP(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp, %0\n\t" + "BX lr \n\t" : : "r" (topOfMainStack) ); +} + +/** + * @brief Return the Base Priority value + * + * @return BasePriority + * + * Return the content of the base priority register + */ +uint32_t __get_BASEPRI(void) +{ + uint32_t result=0; + + __ASM volatile ("MRS %0, basepri_max" : "=r" (result) ); + return(result); +} + +/** + * @brief Set the Base Priority value + * + * @param basePri BasePriority + * + * Set the base priority register + */ +void __set_BASEPRI(uint32_t value) +{ + __ASM volatile ("MSR basepri, %0" : : "r" (value) ); +} + +/** + * @brief Return the Priority Mask value + * + * @return PriMask + * + * Return state of the priority mask bit from the priority mask register + */ +uint32_t __get_PRIMASK(void) +{ + uint32_t result=0; + + __ASM volatile ("MRS %0, primask" : "=r" (result) ); + return(result); +} + +/** + * @brief Set the Priority Mask value + * + * @param priMask PriMask + * + * Set the priority mask bit in the priority mask register + */ +void __set_PRIMASK(uint32_t priMask) +{ + __ASM volatile ("MSR primask, %0" : : "r" (priMask) ); +} + +/** + * @brief Return the Fault Mask value + * + * @return FaultMask + * + * Return the content of the fault mask register + */ +uint32_t __get_FAULTMASK(void) +{ + uint32_t result=0; + + __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); + return(result); +} + +/** + * @brief Set the Fault Mask value + * + * @param faultMask faultMask value + * + * Set the fault mask register + */ +void __set_FAULTMASK(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) ); +} + +/** + * @brief Return the Control Register value +* +* @return Control value + * + * Return the content of the control register + */ +uint32_t __get_CONTROL(void) +{ + uint32_t result=0; + + __ASM volatile ("MRS %0, control" : "=r" (result) ); + return(result); +} + +/** + * @brief Set the Control Register value + * + * @param control Control value + * + * Set the control register + */ +void __set_CONTROL(uint32_t control) +{ + __ASM volatile ("MSR control, %0" : : "r" (control) ); +} + + +/** + * @brief Reverse byte order in integer value + * + * @param value value to reverse + * @return reversed value + * + * Reverse byte order in integer value + */ +uint32_t __REV(uint32_t value) +{ + uint32_t result=0; + + __ASM volatile ("rev %0, %1" : "=r" (result) : "r" (value) ); + return(result); +} + +/** + * @brief Reverse byte order in unsigned short value + * + * @param value value to reverse + * @return reversed value + * + * Reverse byte order in unsigned short value + */ +uint32_t __REV16(uint16_t value) +{ + uint32_t result=0; + + __ASM volatile ("rev16 %0, %1" : "=r" (result) : "r" (value) ); + return(result); +} + +/** + * @brief Reverse byte order in signed short value with sign extension to integer + * + * @param value value to reverse + * @return reversed value + * + * Reverse byte order in signed short value with sign extension to integer + */ +int32_t __REVSH(int16_t value) +{ + uint32_t result=0; + + __ASM volatile ("revsh %0, %1" : "=r" (result) : "r" (value) ); + return(result); +} + +/** + * @brief Reverse bit order of value + * + * @param value value to reverse + * @return reversed value + * + * Reverse bit order of value + */ +uint32_t __RBIT(uint32_t value) +{ + uint32_t result=0; + + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + return(result); +} + +/** + * @brief LDR Exclusive (8 bit) + * + * @param *addr address pointer + * @return value of (*address) + * + * Exclusive LDR command for 8 bit value + */ +uint8_t __LDREXB(uint8_t *addr) +{ + uint8_t result=0; + + __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) ); + return(result); +} + +/** + * @brief LDR Exclusive (16 bit) + * + * @param *addr address pointer + * @return value of (*address) + * + * Exclusive LDR command for 16 bit values + */ +uint16_t __LDREXH(uint16_t *addr) +{ + uint16_t result=0; + + __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) ); + return(result); +} + +/** + * @brief LDR Exclusive (32 bit) + * + * @param *addr address pointer + * @return value of (*address) + * + * Exclusive LDR command for 32 bit values + */ +uint32_t __LDREXW(uint32_t *addr) +{ + uint32_t result=0; + + __ASM volatile ("ldrex %0, [%1]" : "=r" (result) : "r" (addr) ); + return(result); +} + +/** + * @brief STR Exclusive (8 bit) + * + * @param value value to store + * @param *addr address pointer + * @return successful / failed + * + * Exclusive STR command for 8 bit values + */ +uint32_t __STREXB(uint8_t value, uint8_t *addr) +{ + uint32_t result=0; + + __ASM volatile ("strexb %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) ); + return(result); +} + +/** + * @brief STR Exclusive (16 bit) + * + * @param value value to store + * @param *addr address pointer + * @return successful / failed + * + * Exclusive STR command for 16 bit values + */ +uint32_t __STREXH(uint16_t value, uint16_t *addr) +{ + uint32_t result=0; + + __ASM volatile ("strexh %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) ); + return(result); +} + +/** + * @brief STR Exclusive (32 bit) + * + * @param value value to store + * @param *addr address pointer + * @return successful / failed + * + * Exclusive STR command for 32 bit values + */ +uint32_t __STREXW(uint32_t value, uint32_t *addr) +{ + uint32_t result=0; + + __ASM volatile ("strex %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) ); + return(result); +} + + +#elif (defined (__TASKING__)) /*------------------ TASKING Compiler ---------------------*/ +/* TASKING carm specific functions */ + +/* + * The CMSIS functions have been implemented as intrinsics in the compiler. + * Please use "carm -?i" to get an up to date list of all instrinsics, + * Including the CMSIS ones. + */ + +#endif diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport/core_cm3.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport/core_cm3.h new file mode 100644 index 0000000..2b6b51a --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport/core_cm3.h @@ -0,0 +1,1818 @@ +/**************************************************************************//** + * @file core_cm3.h + * @brief CMSIS Cortex-M3 Core Peripheral Access Layer Header File + * @version V1.30 + * @date 30. October 2009 + * + * @note + * Copyright (C) 2009 ARM Limited. All rights reserved. + * + * @par + * ARM Limited (ARM) is supplying this software for use with Cortex-M + * processor based microcontrollers. This file can be freely distributed + * within development tools that are supporting such ARM based processors. + * + * @par + * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED + * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. + * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR + * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. + * + ******************************************************************************/ + +#ifndef __CM3_CORE_H__ +#define __CM3_CORE_H__ + +/** @addtogroup CMSIS_CM3_core_LintCinfiguration CMSIS CM3 Core Lint Configuration + * + * List of Lint messages which will be suppressed and not shown: + * - Error 10: \n + * register uint32_t __regBasePri __asm("basepri"); \n + * Error 10: Expecting ';' + * . + * - Error 530: \n + * return(__regBasePri); \n + * Warning 530: Symbol '__regBasePri' (line 264) not initialized + * . + * - Error 550: \n + * __regBasePri = (basePri & 0x1ff); \n + * Warning 550: Symbol '__regBasePri' (line 271) not accessed + * . + * - Error 754: \n + * uint32_t RESERVED0[24]; \n + * Info 754: local structure member '' (line 109, file ./cm3_core.h) not referenced + * . + * - Error 750: \n + * #define __CM3_CORE_H__ \n + * Info 750: local macro '__CM3_CORE_H__' (line 43, file./cm3_core.h) not referenced + * . + * - Error 528: \n + * static __INLINE void NVIC_DisableIRQ(uint32_t IRQn) \n + * Warning 528: Symbol 'NVIC_DisableIRQ(unsigned int)' (line 419, file ./cm3_core.h) not referenced + * . + * - Error 751: \n + * } InterruptType_Type; \n + * Info 751: local typedef 'InterruptType_Type' (line 170, file ./cm3_core.h) not referenced + * . + * Note: To re-enable a Message, insert a space before 'lint' * + * + */ + +/*lint -save */ +/*lint -e10 */ +/*lint -e530 */ +/*lint -e550 */ +/*lint -e754 */ +/*lint -e750 */ +/*lint -e528 */ +/*lint -e751 */ + + +/** @addtogroup CMSIS_CM3_core_definitions CM3 Core Definitions + This file defines all structures and symbols for CMSIS core: + - CMSIS version number + - Cortex-M core registers and bitfields + - Cortex-M core peripheral base address + @{ + */ + +#ifdef __cplusplus + extern "C" { +#endif + +#define __CM3_CMSIS_VERSION_MAIN (0x01) /*!< [31:16] CMSIS HAL main version */ +#define __CM3_CMSIS_VERSION_SUB (0x30) /*!< [15:0] CMSIS HAL sub version */ +#define __CM3_CMSIS_VERSION ((__CM3_CMSIS_VERSION_MAIN << 16) | __CM3_CMSIS_VERSION_SUB) /*!< CMSIS HAL version number */ + +#define __CORTEX_M (0x03) /*!< Cortex core */ + +#include /* Include standard types */ + +#if defined (__ICCARM__) + #include /* IAR Intrinsics */ +#endif + + +#ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 4 /*!< standard definition for NVIC Priority Bits */ +#endif + + + + +/** + * IO definitions + * + * define access restrictions to peripheral registers + */ + +#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 */ + + + +/******************************************************************************* + * Register Abstraction + ******************************************************************************/ +/** @addtogroup CMSIS_CM3_core_register CMSIS CM3 Core Register + @{ +*/ + + +/** @addtogroup CMSIS_CM3_NVIC CMSIS CM3 NVIC + memory mapped structure for Nested Vectored Interrupt Controller (NVIC) + @{ + */ +typedef struct +{ + __IO uint32_t ISER[8]; /*!< Offset: 0x000 Interrupt Set Enable Register */ + uint32_t RESERVED0[24]; + __IO uint32_t ICER[8]; /*!< Offset: 0x080 Interrupt Clear Enable Register */ + uint32_t RSERVED1[24]; + __IO uint32_t ISPR[8]; /*!< Offset: 0x100 Interrupt Set Pending Register */ + uint32_t RESERVED2[24]; + __IO uint32_t ICPR[8]; /*!< Offset: 0x180 Interrupt Clear Pending Register */ + uint32_t RESERVED3[24]; + __IO uint32_t IABR[8]; /*!< Offset: 0x200 Interrupt Active bit Register */ + uint32_t RESERVED4[56]; + __IO uint8_t IP[240]; /*!< Offset: 0x300 Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED5[644]; + __O uint32_t STIR; /*!< Offset: 0xE00 Software Trigger Interrupt Register */ +} NVIC_Type; +/*@}*/ /* end of group CMSIS_CM3_NVIC */ + + +/** @addtogroup CMSIS_CM3_SCB CMSIS CM3 SCB + memory mapped structure for System Control Block (SCB) + @{ + */ +typedef struct +{ + __I uint32_t CPUID; /*!< Offset: 0x00 CPU ID Base Register */ + __IO uint32_t ICSR; /*!< Offset: 0x04 Interrupt Control State Register */ + __IO uint32_t VTOR; /*!< Offset: 0x08 Vector Table Offset Register */ + __IO uint32_t AIRCR; /*!< Offset: 0x0C Application Interrupt / Reset Control Register */ + __IO uint32_t SCR; /*!< Offset: 0x10 System Control Register */ + __IO uint32_t CCR; /*!< Offset: 0x14 Configuration Control Register */ + __IO uint8_t SHP[12]; /*!< Offset: 0x18 System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IO uint32_t SHCSR; /*!< Offset: 0x24 System Handler Control and State Register */ + __IO uint32_t CFSR; /*!< Offset: 0x28 Configurable Fault Status Register */ + __IO uint32_t HFSR; /*!< Offset: 0x2C Hard Fault Status Register */ + __IO uint32_t DFSR; /*!< Offset: 0x30 Debug Fault Status Register */ + __IO uint32_t MMFAR; /*!< Offset: 0x34 Mem Manage Address Register */ + __IO uint32_t BFAR; /*!< Offset: 0x38 Bus Fault Address Register */ + __IO uint32_t AFSR; /*!< Offset: 0x3C Auxiliary Fault Status Register */ + __I uint32_t PFR[2]; /*!< Offset: 0x40 Processor Feature Register */ + __I uint32_t DFR; /*!< Offset: 0x48 Debug Feature Register */ + __I uint32_t ADR; /*!< Offset: 0x4C Auxiliary Feature Register */ + __I uint32_t MMFR[4]; /*!< Offset: 0x50 Memory Model Feature Register */ + __I uint32_t ISAR[5]; /*!< Offset: 0x60 ISA Feature Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24 /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFul << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20 /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFul << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_PARTNO_Pos 4 /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFul << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0 /*!< 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 31 /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1ul << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28 /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1ul << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27 /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1ul << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26 /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1ul << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25 /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1ul << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23 /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1ul << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22 /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1ul << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12 /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFul << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11 /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1ul << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0 /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFul << SCB_ICSR_VECTACTIVE_Pos) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_VTOR_TBLBASE_Pos 29 /*!< SCB VTOR: TBLBASE Position */ +#define SCB_VTOR_TBLBASE_Msk (0x1FFul << SCB_VTOR_TBLBASE_Pos) /*!< SCB VTOR: TBLBASE Mask */ + +#define SCB_VTOR_TBLOFF_Pos 7 /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x3FFFFFul << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16 /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFul << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16 /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFul << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15 /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1ul << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8 /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7ul << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2 /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1ul << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1 /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1ul << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +#define SCB_AIRCR_VECTRESET_Pos 0 /*!< SCB AIRCR: VECTRESET Position */ +#define SCB_AIRCR_VECTRESET_Msk (1ul << SCB_AIRCR_VECTRESET_Pos) /*!< SCB AIRCR: VECTRESET Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4 /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1ul << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2 /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1ul << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1 /*!< 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 9 /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1ul << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8 /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1ul << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4 /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1ul << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3 /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1ul << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1 /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1ul << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +#define SCB_CCR_NONBASETHRDENA_Pos 0 /*!< SCB CCR: NONBASETHRDENA Position */ +#define SCB_CCR_NONBASETHRDENA_Msk (1ul << SCB_CCR_NONBASETHRDENA_Pos) /*!< SCB CCR: NONBASETHRDENA Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_USGFAULTENA_Pos 18 /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1ul << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17 /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1ul << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16 /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1ul << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15 /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1ul << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14 /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1ul << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13 /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1ul << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12 /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1ul << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11 /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1ul << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10 /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1ul << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8 /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1ul << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7 /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1ul << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3 /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1ul << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1 /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1ul << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0 /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1ul << SCB_SHCSR_MEMFAULTACT_Pos) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Registers Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16 /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFul << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8 /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFul << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0 /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFul << SCB_CFSR_MEMFAULTSR_Pos) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* SCB Hard Fault Status Registers Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31 /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1ul << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30 /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1ul << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1 /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1ul << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4 /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1ul << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3 /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1ul << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2 /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1ul << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1 /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1ul << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0 /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1ul << SCB_DFSR_HALTED_Pos) /*!< SCB DFSR: HALTED Mask */ +/*@}*/ /* end of group CMSIS_CM3_SCB */ + + +/** @addtogroup CMSIS_CM3_SysTick CMSIS CM3 SysTick + memory mapped structure for SysTick + @{ + */ +typedef struct +{ + __IO uint32_t CTRL; /*!< Offset: 0x00 SysTick Control and Status Register */ + __IO uint32_t LOAD; /*!< Offset: 0x04 SysTick Reload Value Register */ + __IO uint32_t VAL; /*!< Offset: 0x08 SysTick Current Value Register */ + __I uint32_t CALIB; /*!< Offset: 0x0C SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16 /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1ul << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2 /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1ul << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1 /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1ul << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0 /*!< 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 0 /*!< 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 0 /*!< 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 31 /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1ul << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30 /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1ul << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0 /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFul << SysTick_VAL_CURRENT_Pos) /*!< SysTick CALIB: TENMS Mask */ +/*@}*/ /* end of group CMSIS_CM3_SysTick */ + + +/** @addtogroup CMSIS_CM3_ITM CMSIS CM3 ITM + memory mapped structure for Instrumentation Trace Macrocell (ITM) + @{ + */ +typedef struct +{ + __O union + { + __O uint8_t u8; /*!< Offset: ITM Stimulus Port 8-bit */ + __O uint16_t u16; /*!< Offset: ITM Stimulus Port 16-bit */ + __O uint32_t u32; /*!< Offset: ITM Stimulus Port 32-bit */ + } PORT [32]; /*!< Offset: 0x00 ITM Stimulus Port Registers */ + uint32_t RESERVED0[864]; + __IO uint32_t TER; /*!< Offset: ITM Trace Enable Register */ + uint32_t RESERVED1[15]; + __IO uint32_t TPR; /*!< Offset: ITM Trace Privilege Register */ + uint32_t RESERVED2[15]; + __IO uint32_t TCR; /*!< Offset: ITM Trace Control Register */ + uint32_t RESERVED3[29]; + __IO uint32_t IWR; /*!< Offset: ITM Integration Write Register */ + __IO uint32_t IRR; /*!< Offset: ITM Integration Read Register */ + __IO uint32_t IMCR; /*!< Offset: ITM Integration Mode Control Register */ + uint32_t RESERVED4[43]; + __IO uint32_t LAR; /*!< Offset: ITM Lock Access Register */ + __IO uint32_t LSR; /*!< Offset: ITM Lock Status Register */ + uint32_t RESERVED5[6]; + __I uint32_t PID4; /*!< Offset: ITM Peripheral Identification Register #4 */ + __I uint32_t PID5; /*!< Offset: ITM Peripheral Identification Register #5 */ + __I uint32_t PID6; /*!< Offset: ITM Peripheral Identification Register #6 */ + __I uint32_t PID7; /*!< Offset: ITM Peripheral Identification Register #7 */ + __I uint32_t PID0; /*!< Offset: ITM Peripheral Identification Register #0 */ + __I uint32_t PID1; /*!< Offset: ITM Peripheral Identification Register #1 */ + __I uint32_t PID2; /*!< Offset: ITM Peripheral Identification Register #2 */ + __I uint32_t PID3; /*!< Offset: ITM Peripheral Identification Register #3 */ + __I uint32_t CID0; /*!< Offset: ITM Component Identification Register #0 */ + __I uint32_t CID1; /*!< Offset: ITM Component Identification Register #1 */ + __I uint32_t CID2; /*!< Offset: ITM Component Identification Register #2 */ + __I uint32_t CID3; /*!< Offset: ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0 /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFul << ITM_TPR_PRIVMASK_Pos) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23 /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1ul << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_ATBID_Pos 16 /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_ATBID_Msk (0x7Ful << ITM_TCR_ATBID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_TSPrescale_Pos 8 /*!< ITM TCR: TSPrescale Position */ +#define ITM_TCR_TSPrescale_Msk (3ul << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ + +#define ITM_TCR_SWOENA_Pos 4 /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1ul << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3 /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1ul << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2 /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1ul << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1 /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1ul << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0 /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1ul << ITM_TCR_ITMENA_Pos) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Integration Write Register Definitions */ +#define ITM_IWR_ATVALIDM_Pos 0 /*!< ITM IWR: ATVALIDM Position */ +#define ITM_IWR_ATVALIDM_Msk (1ul << ITM_IWR_ATVALIDM_Pos) /*!< ITM IWR: ATVALIDM Mask */ + +/* ITM Integration Read Register Definitions */ +#define ITM_IRR_ATREADYM_Pos 0 /*!< ITM IRR: ATREADYM Position */ +#define ITM_IRR_ATREADYM_Msk (1ul << ITM_IRR_ATREADYM_Pos) /*!< ITM IRR: ATREADYM Mask */ + +/* ITM Integration Mode Control Register Definitions */ +#define ITM_IMCR_INTEGRATION_Pos 0 /*!< ITM IMCR: INTEGRATION Position */ +#define ITM_IMCR_INTEGRATION_Msk (1ul << ITM_IMCR_INTEGRATION_Pos) /*!< ITM IMCR: INTEGRATION Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2 /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1ul << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1 /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1ul << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0 /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1ul << ITM_LSR_Present_Pos) /*!< ITM LSR: Present Mask */ +/*@}*/ /* end of group CMSIS_CM3_ITM */ + + +/** @addtogroup CMSIS_CM3_InterruptType CMSIS CM3 Interrupt Type + memory mapped structure for Interrupt Type + @{ + */ +typedef struct +{ + uint32_t RESERVED0; + __I uint32_t ICTR; /*!< Offset: 0x04 Interrupt Control Type Register */ +#if ((defined __CM3_REV) && (__CM3_REV >= 0x200)) + __IO uint32_t ACTLR; /*!< Offset: 0x08 Auxiliary Control Register */ +#else + uint32_t RESERVED1; +#endif +} InterruptType_Type; + +/* Interrupt Controller Type Register Definitions */ +#define InterruptType_ICTR_INTLINESNUM_Pos 0 /*!< InterruptType ICTR: INTLINESNUM Position */ +#define InterruptType_ICTR_INTLINESNUM_Msk (0x1Ful << InterruptType_ICTR_INTLINESNUM_Pos) /*!< InterruptType ICTR: INTLINESNUM Mask */ + +/* Auxiliary Control Register Definitions */ +#define InterruptType_ACTLR_DISFOLD_Pos 2 /*!< InterruptType ACTLR: DISFOLD Position */ +#define InterruptType_ACTLR_DISFOLD_Msk (1ul << InterruptType_ACTLR_DISFOLD_Pos) /*!< InterruptType ACTLR: DISFOLD Mask */ + +#define InterruptType_ACTLR_DISDEFWBUF_Pos 1 /*!< InterruptType ACTLR: DISDEFWBUF Position */ +#define InterruptType_ACTLR_DISDEFWBUF_Msk (1ul << InterruptType_ACTLR_DISDEFWBUF_Pos) /*!< InterruptType ACTLR: DISDEFWBUF Mask */ + +#define InterruptType_ACTLR_DISMCYCINT_Pos 0 /*!< InterruptType ACTLR: DISMCYCINT Position */ +#define InterruptType_ACTLR_DISMCYCINT_Msk (1ul << InterruptType_ACTLR_DISMCYCINT_Pos) /*!< InterruptType ACTLR: DISMCYCINT Mask */ +/*@}*/ /* end of group CMSIS_CM3_InterruptType */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1) +/** @addtogroup CMSIS_CM3_MPU CMSIS CM3 MPU + memory mapped structure for Memory Protection Unit (MPU) + @{ + */ +typedef struct +{ + __I uint32_t TYPE; /*!< Offset: 0x00 MPU Type Register */ + __IO uint32_t CTRL; /*!< Offset: 0x04 MPU Control Register */ + __IO uint32_t RNR; /*!< Offset: 0x08 MPU Region RNRber Register */ + __IO uint32_t RBAR; /*!< Offset: 0x0C MPU Region Base Address Register */ + __IO uint32_t RASR; /*!< Offset: 0x10 MPU Region Attribute and Size Register */ + __IO uint32_t RBAR_A1; /*!< Offset: 0x14 MPU Alias 1 Region Base Address Register */ + __IO uint32_t RASR_A1; /*!< Offset: 0x18 MPU Alias 1 Region Attribute and Size Register */ + __IO uint32_t RBAR_A2; /*!< Offset: 0x1C MPU Alias 2 Region Base Address Register */ + __IO uint32_t RASR_A2; /*!< Offset: 0x20 MPU Alias 2 Region Attribute and Size Register */ + __IO uint32_t RBAR_A3; /*!< Offset: 0x24 MPU Alias 3 Region Base Address Register */ + __IO uint32_t RASR_A3; /*!< Offset: 0x28 MPU Alias 3 Region Attribute and Size Register */ +} MPU_Type; + +/* MPU Type Register */ +#define MPU_TYPE_IREGION_Pos 16 /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFul << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8 /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFul << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0 /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1ul << MPU_TYPE_SEPARATE_Pos) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register */ +#define MPU_CTRL_PRIVDEFENA_Pos 2 /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1ul << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1 /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1ul << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0 /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1ul << MPU_CTRL_ENABLE_Pos) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register */ +#define MPU_RNR_REGION_Pos 0 /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFul << MPU_RNR_REGION_Pos) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register */ +#define MPU_RBAR_ADDR_Pos 5 /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0x7FFFFFFul << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4 /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1ul << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0 /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFul << MPU_RBAR_REGION_Pos) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register */ +#define MPU_RASR_XN_Pos 28 /*!< MPU RASR: XN Position */ +#define MPU_RASR_XN_Msk (1ul << MPU_RASR_XN_Pos) /*!< MPU RASR: XN Mask */ + +#define MPU_RASR_AP_Pos 24 /*!< MPU RASR: AP Position */ +#define MPU_RASR_AP_Msk (7ul << MPU_RASR_AP_Pos) /*!< MPU RASR: AP Mask */ + +#define MPU_RASR_TEX_Pos 19 /*!< MPU RASR: TEX Position */ +#define MPU_RASR_TEX_Msk (7ul << MPU_RASR_TEX_Pos) /*!< MPU RASR: TEX Mask */ + +#define MPU_RASR_S_Pos 18 /*!< MPU RASR: Shareable bit Position */ +#define MPU_RASR_S_Msk (1ul << MPU_RASR_S_Pos) /*!< MPU RASR: Shareable bit Mask */ + +#define MPU_RASR_C_Pos 17 /*!< MPU RASR: Cacheable bit Position */ +#define MPU_RASR_C_Msk (1ul << MPU_RASR_C_Pos) /*!< MPU RASR: Cacheable bit Mask */ + +#define MPU_RASR_B_Pos 16 /*!< MPU RASR: Bufferable bit Position */ +#define MPU_RASR_B_Msk (1ul << MPU_RASR_B_Pos) /*!< MPU RASR: Bufferable bit Mask */ + +#define MPU_RASR_SRD_Pos 8 /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFul << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1 /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1Ful << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENA_Pos 0 /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENA_Msk (0x1Ful << MPU_RASR_ENA_Pos) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@}*/ /* end of group CMSIS_CM3_MPU */ +#endif + + +/** @addtogroup CMSIS_CM3_CoreDebug CMSIS CM3 Core Debug + memory mapped structure for Core Debug Register + @{ + */ +typedef struct +{ + __IO uint32_t DHCSR; /*!< Offset: 0x00 Debug Halting Control and Status Register */ + __O uint32_t DCRSR; /*!< Offset: 0x04 Debug Core Register Selector Register */ + __IO uint32_t DCRDR; /*!< Offset: 0x08 Debug Core Register Data Register */ + __IO uint32_t DEMCR; /*!< Offset: 0x0C Debug Exception and Monitor Control Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16 /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFul << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25 /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1ul << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24 /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1ul << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19 /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1ul << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18 /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1ul << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17 /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1ul << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16 /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1ul << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5 /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1ul << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3 /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1ul << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2 /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1ul << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1 /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1ul << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0 /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1ul << CoreDebug_DHCSR_C_DEBUGEN_Pos) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register */ +#define CoreDebug_DCRSR_REGWnR_Pos 16 /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1ul << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0 /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1Ful << CoreDebug_DCRSR_REGSEL_Pos) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register */ +#define CoreDebug_DEMCR_TRCENA_Pos 24 /*!< CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1ul << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19 /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1ul << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18 /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1ul << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17 /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1ul << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16 /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1ul << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10 /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1ul << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9 /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1ul << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8 /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1ul << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7 /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1ul << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6 /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1ul << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5 /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1ul << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4 /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1ul << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0 /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1ul << CoreDebug_DEMCR_VC_CORERESET_Pos) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ +/*@}*/ /* end of group CMSIS_CM3_CoreDebug */ + + +/* Memory mapping of Cortex-M3 Hardware */ +#define SCS_BASE (0xE000E000) /*!< System Control Space Base Address */ +#define ITM_BASE (0xE0000000) /*!< ITM Base Address */ +#define CoreDebug_BASE (0xE000EDF0) /*!< Core Debug Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00) /*!< System Control Block Base Address */ + +#define InterruptType ((InterruptType_Type *) SCS_BASE) /*!< Interrupt Type Register */ +#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 */ +#define ITM ((ITM_Type *) ITM_BASE) /*!< ITM configuration struct */ +#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1) + #define MPU_BASE (SCS_BASE + 0x0D90) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type*) MPU_BASE) /*!< Memory Protection Unit */ +#endif + +/*@}*/ /* end of group CMSIS_CM3_core_register */ + + +/******************************************************************************* + * Hardware Abstraction Layer + ******************************************************************************/ + +#if defined ( __CC_ARM ) + #define __ASM __asm /*!< asm keyword for ARM Compiler */ + #define __INLINE __inline /*!< inline keyword for ARM Compiler */ + +#elif defined ( __ICCARM__ ) + #define __ASM __asm /*!< asm keyword for IAR Compiler */ + #define __INLINE inline /*!< inline keyword for IAR Compiler. Only avaiable in High optimization mode! */ + +#elif defined ( __GNUC__ ) + #define __ASM __asm /*!< asm keyword for GNU Compiler */ + #define __INLINE inline /*!< inline keyword for GNU Compiler */ + +#elif defined ( __TASKING__ ) + #define __ASM __asm /*!< asm keyword for TASKING Compiler */ + #define __INLINE inline /*!< inline keyword for TASKING Compiler */ + +#endif + + +/* ################### Compiler specific Intrinsics ########################### */ + +#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/ +/* ARM armcc specific functions */ + +#define __enable_fault_irq __enable_fiq +#define __disable_fault_irq __disable_fiq + +#define __NOP __nop +#define __WFI __wfi +#define __WFE __wfe +#define __SEV __sev +#define __ISB() __isb(0) +#define __DSB() __dsb(0) +#define __DMB() __dmb(0) +#define __REV __rev +#define __RBIT __rbit +#define __LDREXB(ptr) ((unsigned char ) __ldrex(ptr)) +#define __LDREXH(ptr) ((unsigned short) __ldrex(ptr)) +#define __LDREXW(ptr) ((unsigned int ) __ldrex(ptr)) +#define __STREXB(value, ptr) __strex(value, ptr) +#define __STREXH(value, ptr) __strex(value, ptr) +#define __STREXW(value, ptr) __strex(value, ptr) + + +/* intrinsic unsigned long long __ldrexd(volatile void *ptr) */ +/* intrinsic int __strexd(unsigned long long val, volatile void *ptr) */ +/* intrinsic void __enable_irq(); */ +/* intrinsic void __disable_irq(); */ + + +/** + * @brief Return the Process Stack Pointer + * + * @return ProcessStackPointer + * + * Return the actual process stack pointer + */ +extern uint32_t __get_PSP(void); + +/** + * @brief Set the Process Stack Pointer + * + * @param topOfProcStack Process Stack Pointer + * + * Assign the value ProcessStackPointer to the MSP + * (process stack pointer) Cortex processor register + */ +extern void __set_PSP(uint32_t topOfProcStack); + +/** + * @brief Return the Main Stack Pointer + * + * @return Main Stack Pointer + * + * Return the current value of the MSP (main stack pointer) + * Cortex processor register + */ +extern uint32_t __get_MSP(void); + +/** + * @brief Set the Main Stack Pointer + * + * @param topOfMainStack Main Stack Pointer + * + * Assign the value mainStackPointer to the MSP + * (main stack pointer) Cortex processor register + */ +extern void __set_MSP(uint32_t topOfMainStack); + +/** + * @brief Reverse byte order in unsigned short value + * + * @param value value to reverse + * @return reversed value + * + * Reverse byte order in unsigned short value + */ +extern uint32_t __REV16(uint16_t value); + +/** + * @brief Reverse byte order in signed short value with sign extension to integer + * + * @param value value to reverse + * @return reversed value + * + * Reverse byte order in signed short value with sign extension to integer + */ +extern int32_t __REVSH(int16_t value); + + +#if (__ARMCC_VERSION < 400000) + +/** + * @brief Remove the exclusive lock created by ldrex + * + * Removes the exclusive lock which is created by ldrex. + */ +extern void __CLREX(void); + +/** + * @brief Return the Base Priority value + * + * @return BasePriority + * + * Return the content of the base priority register + */ +extern uint32_t __get_BASEPRI(void); + +/** + * @brief Set the Base Priority value + * + * @param basePri BasePriority + * + * Set the base priority register + */ +extern void __set_BASEPRI(uint32_t basePri); + +/** + * @brief Return the Priority Mask value + * + * @return PriMask + * + * Return state of the priority mask bit from the priority mask register + */ +extern uint32_t __get_PRIMASK(void); + +/** + * @brief Set the Priority Mask value + * + * @param priMask PriMask + * + * Set the priority mask bit in the priority mask register + */ +extern void __set_PRIMASK(uint32_t priMask); + +/** + * @brief Return the Fault Mask value + * + * @return FaultMask + * + * Return the content of the fault mask register + */ +extern uint32_t __get_FAULTMASK(void); + +/** + * @brief Set the Fault Mask value + * + * @param faultMask faultMask value + * + * Set the fault mask register + */ +extern void __set_FAULTMASK(uint32_t faultMask); + +/** + * @brief Return the Control Register value + * + * @return Control value + * + * Return the content of the control register + */ +extern uint32_t __get_CONTROL(void); + +/** + * @brief Set the Control Register value + * + * @param control Control value + * + * Set the control register + */ +extern void __set_CONTROL(uint32_t control); + +#else /* (__ARMCC_VERSION >= 400000) */ + +/** + * @brief Remove the exclusive lock created by ldrex + * + * Removes the exclusive lock which is created by ldrex. + */ +#define __CLREX __clrex + +/** + * @brief Return the Base Priority value + * + * @return BasePriority + * + * Return the content of the base priority register + */ +static __INLINE uint32_t __get_BASEPRI(void) +{ + register uint32_t __regBasePri __ASM("basepri"); + return(__regBasePri); +} + +/** + * @brief Set the Base Priority value + * + * @param basePri BasePriority + * + * Set the base priority register + */ +static __INLINE void __set_BASEPRI(uint32_t basePri) +{ + register uint32_t __regBasePri __ASM("basepri"); + __regBasePri = (basePri & 0xff); +} + +/** + * @brief Return the Priority Mask value + * + * @return PriMask + * + * Return state of the priority mask bit from the priority mask register + */ +static __INLINE uint32_t __get_PRIMASK(void) +{ + register uint32_t __regPriMask __ASM("primask"); + return(__regPriMask); +} + +/** + * @brief Set the Priority Mask value + * + * @param priMask PriMask + * + * Set the priority mask bit in the priority mask register + */ +static __INLINE void __set_PRIMASK(uint32_t priMask) +{ + register uint32_t __regPriMask __ASM("primask"); + __regPriMask = (priMask); +} + +/** + * @brief Return the Fault Mask value + * + * @return FaultMask + * + * Return the content of the fault mask register + */ +static __INLINE uint32_t __get_FAULTMASK(void) +{ + register uint32_t __regFaultMask __ASM("faultmask"); + return(__regFaultMask); +} + +/** + * @brief Set the Fault Mask value + * + * @param faultMask faultMask value + * + * Set the fault mask register + */ +static __INLINE void __set_FAULTMASK(uint32_t faultMask) +{ + register uint32_t __regFaultMask __ASM("faultmask"); + __regFaultMask = (faultMask & 1); +} + +/** + * @brief Return the Control Register value + * + * @return Control value + * + * Return the content of the control register + */ +static __INLINE uint32_t __get_CONTROL(void) +{ + register uint32_t __regControl __ASM("control"); + return(__regControl); +} + +/** + * @brief Set the Control Register value + * + * @param control Control value + * + * Set the control register + */ +static __INLINE void __set_CONTROL(uint32_t control) +{ + register uint32_t __regControl __ASM("control"); + __regControl = control; +} + +#endif /* __ARMCC_VERSION */ + + + +#elif (defined (__ICCARM__)) /*------------------ ICC Compiler -------------------*/ +/* IAR iccarm specific functions */ + +#define __enable_irq __enable_interrupt /*!< global Interrupt enable */ +#define __disable_irq __disable_interrupt /*!< global Interrupt disable */ + +static __INLINE void __enable_fault_irq() { __ASM ("cpsie f"); } +static __INLINE void __disable_fault_irq() { __ASM ("cpsid f"); } + +#define __NOP __no_operation /*!< no operation intrinsic in IAR Compiler */ +static __INLINE void __WFI() { __ASM ("wfi"); } +static __INLINE void __WFE() { __ASM ("wfe"); } +static __INLINE void __SEV() { __ASM ("sev"); } +static __INLINE void __CLREX() { __ASM ("clrex"); } + +/* intrinsic void __ISB(void) */ +/* intrinsic void __DSB(void) */ +/* intrinsic void __DMB(void) */ +/* intrinsic void __set_PRIMASK(); */ +/* intrinsic void __get_PRIMASK(); */ +/* intrinsic void __set_FAULTMASK(); */ +/* intrinsic void __get_FAULTMASK(); */ +/* intrinsic uint32_t __REV(uint32_t value); */ +/* intrinsic uint32_t __REVSH(uint32_t value); */ +/* intrinsic unsigned long __STREX(unsigned long, unsigned long); */ +/* intrinsic unsigned long __LDREX(unsigned long *); */ + + +/** + * @brief Return the Process Stack Pointer + * + * @return ProcessStackPointer + * + * Return the actual process stack pointer + */ +extern uint32_t __get_PSP(void); + +/** + * @brief Set the Process Stack Pointer + * + * @param topOfProcStack Process Stack Pointer + * + * Assign the value ProcessStackPointer to the MSP + * (process stack pointer) Cortex processor register + */ +extern void __set_PSP(uint32_t topOfProcStack); + +/** + * @brief Return the Main Stack Pointer + * + * @return Main Stack Pointer + * + * Return the current value of the MSP (main stack pointer) + * Cortex processor register + */ +extern uint32_t __get_MSP(void); + +/** + * @brief Set the Main Stack Pointer + * + * @param topOfMainStack Main Stack Pointer + * + * Assign the value mainStackPointer to the MSP + * (main stack pointer) Cortex processor register + */ +extern void __set_MSP(uint32_t topOfMainStack); + +/** + * @brief Reverse byte order in unsigned short value + * + * @param value value to reverse + * @return reversed value + * + * Reverse byte order in unsigned short value + */ +extern uint32_t __REV16(uint16_t value); + +/** + * @brief Reverse bit order of value + * + * @param value value to reverse + * @return reversed value + * + * Reverse bit order of value + */ +extern uint32_t __RBIT(uint32_t value); + +/** + * @brief LDR Exclusive (8 bit) + * + * @param *addr address pointer + * @return value of (*address) + * + * Exclusive LDR command for 8 bit values) + */ +extern uint8_t __LDREXB(uint8_t *addr); + +/** + * @brief LDR Exclusive (16 bit) + * + * @param *addr address pointer + * @return value of (*address) + * + * Exclusive LDR command for 16 bit values + */ +extern uint16_t __LDREXH(uint16_t *addr); + +/** + * @brief LDR Exclusive (32 bit) + * + * @param *addr address pointer + * @return value of (*address) + * + * Exclusive LDR command for 32 bit values + */ +extern uint32_t __LDREXW(uint32_t *addr); + +/** + * @brief STR Exclusive (8 bit) + * + * @param value value to store + * @param *addr address pointer + * @return successful / failed + * + * Exclusive STR command for 8 bit values + */ +extern uint32_t __STREXB(uint8_t value, uint8_t *addr); + +/** + * @brief STR Exclusive (16 bit) + * + * @param value value to store + * @param *addr address pointer + * @return successful / failed + * + * Exclusive STR command for 16 bit values + */ +extern uint32_t __STREXH(uint16_t value, uint16_t *addr); + +/** + * @brief STR Exclusive (32 bit) + * + * @param value value to store + * @param *addr address pointer + * @return successful / failed + * + * Exclusive STR command for 32 bit values + */ +extern uint32_t __STREXW(uint32_t value, uint32_t *addr); + + + +#elif (defined (__GNUC__)) /*------------------ GNU Compiler ---------------------*/ +/* GNU gcc specific functions */ + +static __INLINE void __enable_irq() { __ASM volatile ("cpsie i"); } +static __INLINE void __disable_irq() { __ASM volatile ("cpsid i"); } + +static __INLINE void __enable_fault_irq() { __ASM volatile ("cpsie f"); } +static __INLINE void __disable_fault_irq() { __ASM volatile ("cpsid f"); } + +static __INLINE void __NOP() { __ASM volatile ("nop"); } +static __INLINE void __WFI() { __ASM volatile ("wfi"); } +static __INLINE void __WFE() { __ASM volatile ("wfe"); } +static __INLINE void __SEV() { __ASM volatile ("sev"); } +static __INLINE void __ISB() { __ASM volatile ("isb"); } +static __INLINE void __DSB() { __ASM volatile ("dsb"); } +static __INLINE void __DMB() { __ASM volatile ("dmb"); } +static __INLINE void __CLREX() { __ASM volatile ("clrex"); } + + +/** + * @brief Return the Process Stack Pointer + * + * @return ProcessStackPointer + * + * Return the actual process stack pointer + */ +extern uint32_t __get_PSP(void); + +/** + * @brief Set the Process Stack Pointer + * + * @param topOfProcStack Process Stack Pointer + * + * Assign the value ProcessStackPointer to the MSP + * (process stack pointer) Cortex processor register + */ +extern void __set_PSP(uint32_t topOfProcStack); + +/** + * @brief Return the Main Stack Pointer + * + * @return Main Stack Pointer + * + * Return the current value of the MSP (main stack pointer) + * Cortex processor register + */ +extern uint32_t __get_MSP(void); + +/** + * @brief Set the Main Stack Pointer + * + * @param topOfMainStack Main Stack Pointer + * + * Assign the value mainStackPointer to the MSP + * (main stack pointer) Cortex processor register + */ +extern void __set_MSP(uint32_t topOfMainStack); + +/** + * @brief Return the Base Priority value + * + * @return BasePriority + * + * Return the content of the base priority register + */ +extern uint32_t __get_BASEPRI(void); + +/** + * @brief Set the Base Priority value + * + * @param basePri BasePriority + * + * Set the base priority register + */ +extern void __set_BASEPRI(uint32_t basePri); + +/** + * @brief Return the Priority Mask value + * + * @return PriMask + * + * Return state of the priority mask bit from the priority mask register + */ +extern uint32_t __get_PRIMASK(void); + +/** + * @brief Set the Priority Mask value + * + * @param priMask PriMask + * + * Set the priority mask bit in the priority mask register + */ +extern void __set_PRIMASK(uint32_t priMask); + +/** + * @brief Return the Fault Mask value + * + * @return FaultMask + * + * Return the content of the fault mask register + */ +extern uint32_t __get_FAULTMASK(void); + +/** + * @brief Set the Fault Mask value + * + * @param faultMask faultMask value + * + * Set the fault mask register + */ +extern void __set_FAULTMASK(uint32_t faultMask); + +/** + * @brief Return the Control Register value +* +* @return Control value + * + * Return the content of the control register + */ +extern uint32_t __get_CONTROL(void); + +/** + * @brief Set the Control Register value + * + * @param control Control value + * + * Set the control register + */ +extern void __set_CONTROL(uint32_t control); + +/** + * @brief Reverse byte order in integer value + * + * @param value value to reverse + * @return reversed value + * + * Reverse byte order in integer value + */ +extern uint32_t __REV(uint32_t value); + +/** + * @brief Reverse byte order in unsigned short value + * + * @param value value to reverse + * @return reversed value + * + * Reverse byte order in unsigned short value + */ +extern uint32_t __REV16(uint16_t value); + +/** + * @brief Reverse byte order in signed short value with sign extension to integer + * + * @param value value to reverse + * @return reversed value + * + * Reverse byte order in signed short value with sign extension to integer + */ +extern int32_t __REVSH(int16_t value); + +/** + * @brief Reverse bit order of value + * + * @param value value to reverse + * @return reversed value + * + * Reverse bit order of value + */ +extern uint32_t __RBIT(uint32_t value); + +/** + * @brief LDR Exclusive (8 bit) + * + * @param *addr address pointer + * @return value of (*address) + * + * Exclusive LDR command for 8 bit value + */ +extern uint8_t __LDREXB(uint8_t *addr); + +/** + * @brief LDR Exclusive (16 bit) + * + * @param *addr address pointer + * @return value of (*address) + * + * Exclusive LDR command for 16 bit values + */ +extern uint16_t __LDREXH(uint16_t *addr); + +/** + * @brief LDR Exclusive (32 bit) + * + * @param *addr address pointer + * @return value of (*address) + * + * Exclusive LDR command for 32 bit values + */ +extern uint32_t __LDREXW(uint32_t *addr); + +/** + * @brief STR Exclusive (8 bit) + * + * @param value value to store + * @param *addr address pointer + * @return successful / failed + * + * Exclusive STR command for 8 bit values + */ +extern uint32_t __STREXB(uint8_t value, uint8_t *addr); + +/** + * @brief STR Exclusive (16 bit) + * + * @param value value to store + * @param *addr address pointer + * @return successful / failed + * + * Exclusive STR command for 16 bit values + */ +extern uint32_t __STREXH(uint16_t value, uint16_t *addr); + +/** + * @brief STR Exclusive (32 bit) + * + * @param value value to store + * @param *addr address pointer + * @return successful / failed + * + * Exclusive STR command for 32 bit values + */ +extern uint32_t __STREXW(uint32_t value, uint32_t *addr); + + +#elif (defined (__TASKING__)) /*------------------ TASKING Compiler ---------------------*/ +/* TASKING carm specific functions */ + +/* + * The CMSIS functions have been implemented as intrinsics in the compiler. + * Please use "carm -?i" to get an up to date list of all instrinsics, + * Including the CMSIS ones. + */ + +#endif + + +/** @addtogroup CMSIS_CM3_Core_FunctionInterface CMSIS CM3 Core Function Interface + Core Function Interface containing: + - Core NVIC Functions + - Core SysTick Functions + - Core Reset Functions +*/ +/*@{*/ + +/* ########################## NVIC functions #################################### */ + +/** + * @brief Set the Priority Grouping in NVIC Interrupt Controller + * + * @param PriorityGroup is priority grouping field + * + * Set the priority grouping field using the required unlock sequence. + * The parameter priority_grouping is assigned to the field + * SCB->AIRCR [10:8] PRIGROUP field. Only values from 0..7 are used. + * In case of a conflict between priority grouping and available + * priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + */ +static __INLINE void NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & 0x07); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk); /* clear bits to change */ + reg_value = (reg_value | + (0x5FA << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << 8)); /* Insert write key and priorty group */ + SCB->AIRCR = reg_value; +} + +/** + * @brief Get the Priority Grouping from NVIC Interrupt Controller + * + * @return priority grouping field + * + * Get the priority grouping from NVIC Interrupt Controller. + * priority grouping is SCB->AIRCR [10:8] PRIGROUP field. + */ +static __INLINE uint32_t NVIC_GetPriorityGrouping(void) +{ + return ((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos); /* read priority grouping field */ +} + +/** + * @brief Enable Interrupt in NVIC Interrupt Controller + * + * @param IRQn The positive number of the external interrupt to enable + * + * Enable a device specific interupt in the NVIC interrupt controller. + * The interrupt number cannot be a negative value. + */ +static __INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) +{ + NVIC->ISER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* enable interrupt */ +} + +/** + * @brief Disable the interrupt line for external interrupt specified + * + * @param IRQn The positive number of the external interrupt to disable + * + * Disable a device specific interupt in the NVIC interrupt controller. + * The interrupt number cannot be a negative value. + */ +static __INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) +{ + NVIC->ICER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* disable interrupt */ +} + +/** + * @brief Read the interrupt pending bit for a device specific interrupt source + * + * @param IRQn The number of the device specifc interrupt + * @return 1 = interrupt pending, 0 = interrupt not pending + * + * Read the pending register in NVIC and return 1 if its status is pending, + * otherwise it returns 0 + */ +static __INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + return((uint32_t) ((NVIC->ISPR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); /* Return 1 if pending else 0 */ +} + +/** + * @brief Set the pending bit for an external interrupt + * + * @param IRQn The number of the interrupt for set pending + * + * Set the pending bit for the specified interrupt. + * The interrupt number cannot be a negative value. + */ +static __INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + NVIC->ISPR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* set interrupt pending */ +} + +/** + * @brief Clear the pending bit for an external interrupt + * + * @param IRQn The number of the interrupt for clear pending + * + * Clear the pending bit for the specified interrupt. + * The interrupt number cannot be a negative value. + */ +static __INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + NVIC->ICPR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* Clear pending interrupt */ +} + +/** + * @brief Read the active bit for an external interrupt + * + * @param IRQn The number of the interrupt for read active bit + * @return 1 = interrupt active, 0 = interrupt not active + * + * Read the active register in NVIC and returns 1 if its status is active, + * otherwise it returns 0. + */ +static __INLINE uint32_t NVIC_GetActive(IRQn_Type IRQn) +{ + return((uint32_t)((NVIC->IABR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); /* Return 1 if active else 0 */ +} + +/** + * @brief Set the priority for an interrupt + * + * @param IRQn The number of the interrupt for set priority + * @param priority The priority to set + * + * Set the priority for the specified interrupt. The interrupt + * number can be positive to specify an external (device specific) + * interrupt, or negative to specify an internal (core) interrupt. + * + * Note: The priority cannot be set for every core interrupt. + */ +static __INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if(IRQn < 0) { + SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for Cortex-M3 System Interrupts */ + else { + NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for device specific Interrupts */ +} + +/** + * @brief Read the priority for an interrupt + * + * @param IRQn The number of the interrupt for get priority + * @return The priority for the interrupt + * + * Read the priority for the specified interrupt. The interrupt + * number can be positive to specify an external (device specific) + * interrupt, or negative to specify an internal (core) interrupt. + * + * The returned priority value is automatically aligned to the implemented + * priority bits of the microcontroller. + * + * Note: The priority cannot be set for every core interrupt. + */ +static __INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) +{ + + if(IRQn < 0) { + return((uint32_t)(SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] >> (8 - __NVIC_PRIO_BITS))); } /* get priority for Cortex-M3 system interrupts */ + else { + return((uint32_t)(NVIC->IP[(uint32_t)(IRQn)] >> (8 - __NVIC_PRIO_BITS))); } /* get priority for device specific interrupts */ +} + + +/** + * @brief Encode the priority for an interrupt + * + * @param PriorityGroup The used priority group + * @param PreemptPriority The preemptive priority value (starting from 0) + * @param SubPriority The sub priority value (starting from 0) + * @return The encoded priority for the interrupt + * + * Encode the priority for an interrupt with the given priority group, + * preemptive priority value and sub priority value. + * In case of a conflict between priority grouping and available + * priority bits (__NVIC_PRIO_BITS) the samllest possible priority group is set. + * + * The returned priority value can be used for NVIC_SetPriority(...) function + */ +static __INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & 0x07); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7 - PriorityGroupTmp) > __NVIC_PRIO_BITS) ? __NVIC_PRIO_BITS : 7 - PriorityGroupTmp; + SubPriorityBits = ((PriorityGroupTmp + __NVIC_PRIO_BITS) < 7) ? 0 : PriorityGroupTmp - 7 + __NVIC_PRIO_BITS; + + return ( + ((PreemptPriority & ((1 << (PreemptPriorityBits)) - 1)) << SubPriorityBits) | + ((SubPriority & ((1 << (SubPriorityBits )) - 1))) + ); +} + + +/** + * @brief Decode the priority of an interrupt + * + * @param Priority The priority for the interrupt + * @param PriorityGroup The used priority group + * @param pPreemptPriority The preemptive priority value (starting from 0) + * @param pSubPriority The sub priority value (starting from 0) + * + * Decode an interrupt priority value with the given priority group to + * preemptive priority value and sub priority value. + * In case of a conflict between priority grouping and available + * priority bits (__NVIC_PRIO_BITS) the samllest possible priority group is set. + * + * The priority value can be retrieved with NVIC_GetPriority(...) function + */ +static __INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* pPreemptPriority, uint32_t* pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & 0x07); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7 - PriorityGroupTmp) > __NVIC_PRIO_BITS) ? __NVIC_PRIO_BITS : 7 - PriorityGroupTmp; + SubPriorityBits = ((PriorityGroupTmp + __NVIC_PRIO_BITS) < 7) ? 0 : PriorityGroupTmp - 7 + __NVIC_PRIO_BITS; + + *pPreemptPriority = (Priority >> SubPriorityBits) & ((1 << (PreemptPriorityBits)) - 1); + *pSubPriority = (Priority ) & ((1 << (SubPriorityBits )) - 1); +} + + + +/* ################################## SysTick function ############################################ */ + +#if (!defined (__Vendor_SysTickConfig)) || (__Vendor_SysTickConfig == 0) + +/** + * @brief Initialize and start the SysTick counter and its interrupt. + * + * @param ticks number of ticks between two interrupts + * @return 1 = failed, 0 = successful + * + * Initialise the system tick timer and its interrupt and start the + * system tick timer / counter in free running mode to generate + * periodical interrupts. + */ +static __INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */ + + SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */ + SysTick->VAL = 0; /* 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 (0); /* Function successful */ +} + +#endif + + + + +/* ################################## Reset function ############################################ */ + +/** + * @brief Initiate a system reset request. + * + * Initiate a system reset request to reset the MCU + */ +static __INLINE void NVIC_SystemReset(void) +{ + SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + while(1); /* wait until reset */ +} + +/*@}*/ /* end of group CMSIS_CM3_Core_FunctionInterface */ + + + +/* ##################################### Debug In/Output function ########################################### */ + +/** @addtogroup CMSIS_CM3_CoreDebugInterface CMSIS CM3 Core Debug Interface + Core Debug Interface containing: + - Core Debug Receive / Transmit Functions + - Core Debug Defines + - Core Debug Variables +*/ +/*@{*/ + +extern volatile int ITM_RxBuffer; /*!< variable to receive characters */ +#define ITM_RXBUFFER_EMPTY 0x5AA55AA5 /*!< value identifying ITM_RxBuffer is ready for next character */ + + +/** + * @brief Outputs a character via the ITM channel 0 + * + * @param ch character to output + * @return character to output + * + * The function outputs a character via the ITM channel 0. + * The function returns when no debugger is connected that has booked the output. + * It is blocking when a debugger is connected, but the previous character send is not transmitted. + */ +static __INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if ((CoreDebug->DEMCR & CoreDebug_DEMCR_TRCENA_Msk) && /* Trace enabled */ + (ITM->TCR & ITM_TCR_ITMENA_Msk) && /* ITM enabled */ + (ITM->TER & (1ul << 0) ) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0].u32 == 0); + ITM->PORT[0].u8 = (uint8_t) ch; + } + return (ch); +} + + +/** + * @brief Inputs a character via variable ITM_RxBuffer + * + * @return received character, -1 = no character received + * + * The function inputs a character via variable ITM_RxBuffer. + * The function returns when no debugger is connected that has booked the output. + * It is blocking when a debugger is connected, but the previous character send is not transmitted. + */ +static __INLINE int ITM_ReceiveChar (void) { + int ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + * @brief Check if a character via variable ITM_RxBuffer is available + * + * @return 1 = character available, 0 = no character available + * + * The function checks variable ITM_RxBuffer whether a character is available or not. + * The function returns '1' if a character is available and '0' if no character is available. + */ +static __INLINE int ITM_CheckChar (void) { + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) { + return (0); /* no character available */ + } else { + return (1); /* character available */ + } +} + +/*@}*/ /* end of group CMSIS_CM3_core_DebugInterface */ + + +#ifdef __cplusplus +} +#endif + +/*@}*/ /* end of group CMSIS_CM3_core_definitions */ + +#endif /* __CM3_CORE_H__ */ + +/*lint -restore */ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/Release_Notes.html b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/Release_Notes.html new file mode 100644 index 0000000..b80f38d --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/Release_Notes.html @@ -0,0 +1,284 @@ + + + + + + + + + + + + +Release Notes for STM32F10x CMSIS + + + + + +
+


+

+
+ + + + + + +
+ + + + + + + + + +
Back to Release page
+

Release +Notes for STM32F10x CMSIS

+

Copyright 2011 STMicroelectronics

+

+
+

 

+ + + + + + +
+

Contents

+
    +
  1. STM32F10x CMSIS +update History
  2. +
  3. License
  4. +
+ +

STM32F10x CMSIS +update History


+

V3.5.0 / 11-March-2011

+

Main +Changes

+ +
    +
  • stm32f10x.h +and startup_stm32f10x_hd_vl.s files: remove the FSMC interrupt +definition for STM32F10x High-density Value line devices.
    +
  • +
  • system_stm32f10x.c file provided within the CMSIS folder.
    +
  • + +
+ +

3.4.0 +- 10/15/2010

+ +
    +
  1. General
  2. +
+ +
    +
  • Add support +for STM32F10x High-density Value line devices.
  • +
+
    +
  1. STM32F10x CMSIS Device Peripheral Access Layer
  2. +
+ + + +
    +
  • STM32F10x CMSIS Cortex-M3 Device Peripheral Access Layer Header File: stm32f10x.h
    +
    • Update to support High-density Value line devices
      • Add new define STM32F10X_HD_VL
      • +
      • RCC, AFIO, FSMC bits definition updated
      • +
      +
    • + + All +STM32 devices definitions are commented by default. User has to select the +appropriate device before starting else an error will be signaled on compile +time.
    • +
    • Add new IRQs definitons inside the IRQn_Type enumeration for STM23 High-density Value line devices.
    • +
    • "bool" type removed.
      +
    • +
  • STM32F10x CMSIS Cortex-M3 Device Peripheral Access Layer System Files: system_stm32f10x.h and system_stm32f10x.c
    +
  • +
      +
    • "system_stm32f10x.c" moved to to "STM32F10x_StdPeriph_Template" directory. This file is also moved to each example directory under "STM32F10x_StdPeriph_Examples".
      +
    • +
    • SystemInit_ExtMemCtl() function: update to support High-density Value line devices.
    • +
    • Add "VECT_TAB_SRAM" inside "system_stm32f10x.c" +to select if the user want to place the Vector Table in internal SRAM. +An additional define is also to specify the Vector Table offset "VECT_TAB_OFFSET".
      +
    • + +
    +
  • STM32F10x CMSIS startup files:startup_stm32f10x_xx.s
    • Add three +startup files for STM32 High-density Value line devices: + startup_stm32f10x_hd_vl.s
    +
+

3.3.0 +- 04/16/2010

+ +
  1. General
+
  • Add support +for STM32F10x XL-density devices.
  • Add startup files for TrueSTUDIO toolchain
  1. STM32F10x CMSIS Device Peripheral Access Layer
+ +
  • STM32F10x CMSIS Cortex-M3 Device Peripheral Access Layer Header File: stm32f10x.h
    +
    • Update to support XL-density devices
      • Add new define STM32F10X_XL
      • Add new IRQs for TIM9..14
      • Update FLASH_TypeDef structure
      • Add new IP instances TIM9..14
      • RCC, AFIO, DBGMCU bits definition updated
    • Correct IRQs definition for MD-, LD-, MD_VL- and LD_VL-density devices (remove comma "," at the end of enum list)
  • STM32F10x CMSIS Cortex-M3 Device Peripheral Access Layer System Files: system_stm32f10x.h and system_stm32f10x.c
    +
    • SystemInit_ExtMemCtl() function: update to support XL-density devices
    • SystemInit() function: swap the order of SetSysClock() and SystemInit_ExtMemCtl() functions. 
      +
  • STM32F10x CMSIS startup files:
    • add three +startup files for STM32 XL-density devices: + startup_stm32f10x_xl.s
    • startup_stm32f10x_md_vl.s for RIDE7: add USART3 IRQ Handler (was missing in previous version)
    • Add startup files for TrueSTUDIO toolchain
+

3.2.0 +- 03/01/2010

+
    +
  1. General
  2. +
+
    + +
  • STM32F10x CMSIS files updated to CMSIS V1.30 release
  • +
  • Directory structure updated to be aligned with CMSIS V1.30
    +
  • +
  • Add support +for STM32 Low-density Value line (STM32F100x4/6) and +Medium-density Value line (STM32F100x8/B) devices
  • + +
+
    +
  1. CMSIS Core Peripheral Access Layer
+ +
    +
  1. STM32F10x CMSIS Device Peripheral Access Layer
  2. + +
+ +
    + +
  • STM32F10x CMSIS Cortex-M3 Device Peripheral Access Layer Header File: stm32f10x.h
    +
  • +
      +
    • Update +the stm32f10x.h file to support new Value line devices features: CEC +peripheral, new General purpose timers TIM15, TIM16 and TIM17.
    • +
    • Peripherals Bits definitions updated to be in line with Value line devices available features.
      +
    • +
    • HSE_Value, +HSI_Value and HSEStartup_TimeOut changed to upper case: HSE_VALUE, +HSI_VALUE and HSE_STARTUP_TIMEOUT. Old names are kept for legacy +purposes.
      +
    • +
    +
  • STM32F10x CMSIS Cortex-M3 Device Peripheral Access Layer System Files: system_stm32f10x.h and system_stm32f10x.c
    +
  • +
      +
    • SystemFrequency variable name changed to SystemCoreClock
      +
    • +
    • Default + SystemCoreClock is changed to 24MHz when Value line devices are selected and to 72MHz on other devices.
      +
    • +
    • All while(1) loop were removed from all clock setting functions. User has to handle the HSE startup failure.
      +
    • +
    • Additional function void SystemCoreClockUpdate (void) is provided.
      +
    • +
    +
  • STM32F10x CMSIS Startup files: startup_stm32f10x_xx.s
  • +
      +
    • Add new +startup files for STM32 Low-density Value line devices: + startup_stm32f10x_ld_vl.s
    • +
    • Add new startup +files for STM32 Medium-density Value line devices: + startup_stm32f10x_md_vl.s
    • +
    • SystemInit() function is called from startup file (startup_stm32f10x_xx.s) before to branch to application main.
      +To reconfigure the default setting of SystemInit() function, refer to system_stm32f10x.c file
      +
    • +
    • GNU startup file for Low density devices (startup_stm32f10x_ld.s) is updated to fix compilation errors.
      +
    • +
    + +
+ +
    +
+

License

+

The +enclosed firmware and all the related documentation are not covered by +a License Agreement, if you need such License you can contact your +local STMicroelectronics office.

+

THE +PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS +WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO +SAVE TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR +ANY DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY +CLAIMS ARISING FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY +CUSTOMERS OF THE CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH +THEIR PRODUCTS.

+

 

+
+
+

For +complete documentation on STM32(CORTEX M3) 32-Bit Microcontrollers +visit www.st.com/STM32

+
+

+
+
+

 

+
+ \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/TrueSTUDIO/startup_stm32f10x_cl.s b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/TrueSTUDIO/startup_stm32f10x_cl.s new file mode 100644 index 0000000..e34a520 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/TrueSTUDIO/startup_stm32f10x_cl.s @@ -0,0 +1,473 @@ +/** + ****************************************************************************** + * @file startup_stm32f10x_cl.s + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief STM32F10x Connectivity line Devices vector table for Atollic + * toolchain. + * This module performs: + * - Set the initial SP + * - Set the initial PC == Reset_Handler, + * - Set the vector table entries with the exceptions ISR + * address. + * - Configure the clock system + * - Branches to main in the C library (which eventually + * calls main()). + * After Reset the Cortex-M3 processor is in Thread mode, + * priority is Privileged, and the Stack is set to Main. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + + .syntax unified + .cpu cortex-m3 + .fpu softvfp + .thumb + +.global g_pfnVectors +.global Default_Handler + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss + +.equ BootRAM, 0xF1E0F85F +/** + * @brief This is the code that gets called when the processor first + * starts execution following a reset event. Only the absolutely + * necessary set is performed, after which the application + * supplied main() routine is called. + * @param None + * @retval : None +*/ + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + +/* Copy the data segment initializers from flash to SRAM */ + movs r1, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r3, =_sidata + ldr r3, [r3, r1] + str r3, [r0, r1] + adds r1, r1, #4 + +LoopCopyDataInit: + ldr r0, =_sdata + ldr r3, =_edata + adds r2, r0, r1 + cmp r2, r3 + bcc CopyDataInit + ldr r2, =_sbss + b LoopFillZerobss + +/* Zero fill the bss segment. */ +FillZerobss: + movs r3, #0 + str r3, [r2], #4 + +LoopFillZerobss: + ldr r3, = _ebss + cmp r2, r3 + bcc FillZerobss + +/* Call the clock system intitialization function.*/ + bl SystemInit +/* Call static constructors */ + bl __libc_init_array +/* Call the application's entry point.*/ + bl main + bx lr +.size Reset_Handler, .-Reset_Handler + +/** + * @brief This is the code that gets called when the processor receives an + * unexpected interrupt. This simply enters an infinite loop, preserving + * the system state for examination by a debugger. + * + * @param None + * @retval : None +*/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + .size Default_Handler, .-Default_Handler + +/****************************************************************************** +* +* The minimal vector table for a Cortex M3. Note that the proper constructs +* must be placed on this to ensure that it ends up at physical address +* 0x0000.0000. +* +******************************************************************************/ + .section .isr_vector,"a",%progbits + .type g_pfnVectors, %object + .size g_pfnVectors, .-g_pfnVectors + + +g_pfnVectors: + .word _estack + .word Reset_Handler + .word NMI_Handler + .word HardFault_Handler + .word MemManage_Handler + .word BusFault_Handler + .word UsageFault_Handler + .word 0 + .word 0 + .word 0 + .word 0 + .word SVC_Handler + .word DebugMon_Handler + .word 0 + .word PendSV_Handler + .word SysTick_Handler + .word WWDG_IRQHandler + .word PVD_IRQHandler + .word TAMPER_IRQHandler + .word RTC_IRQHandler + .word FLASH_IRQHandler + .word RCC_IRQHandler + .word EXTI0_IRQHandler + .word EXTI1_IRQHandler + .word EXTI2_IRQHandler + .word EXTI3_IRQHandler + .word EXTI4_IRQHandler + .word DMA1_Channel1_IRQHandler + .word DMA1_Channel2_IRQHandler + .word DMA1_Channel3_IRQHandler + .word DMA1_Channel4_IRQHandler + .word DMA1_Channel5_IRQHandler + .word DMA1_Channel6_IRQHandler + .word DMA1_Channel7_IRQHandler + .word ADC1_2_IRQHandler + .word CAN1_TX_IRQHandler + .word CAN1_RX0_IRQHandler + .word CAN1_RX1_IRQHandler + .word CAN1_SCE_IRQHandler + .word EXTI9_5_IRQHandler + .word TIM1_BRK_IRQHandler + .word TIM1_UP_IRQHandler + .word TIM1_TRG_COM_IRQHandler + .word TIM1_CC_IRQHandler + .word TIM2_IRQHandler + .word TIM3_IRQHandler + .word TIM4_IRQHandler + .word I2C1_EV_IRQHandler + .word I2C1_ER_IRQHandler + .word I2C2_EV_IRQHandler + .word I2C2_ER_IRQHandler + .word SPI1_IRQHandler + .word SPI2_IRQHandler + .word USART1_IRQHandler + .word USART2_IRQHandler + .word USART3_IRQHandler + .word EXTI15_10_IRQHandler + .word RTCAlarm_IRQHandler + .word OTG_FS_WKUP_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word TIM5_IRQHandler + .word SPI3_IRQHandler + .word UART4_IRQHandler + .word UART5_IRQHandler + .word TIM6_IRQHandler + .word TIM7_IRQHandler + .word DMA2_Channel1_IRQHandler + .word DMA2_Channel2_IRQHandler + .word DMA2_Channel3_IRQHandler + .word DMA2_Channel4_IRQHandler + .word DMA2_Channel5_IRQHandler + .word ETH_IRQHandler + .word ETH_WKUP_IRQHandler + .word CAN2_TX_IRQHandler + .word CAN2_RX0_IRQHandler + .word CAN2_RX1_IRQHandler + .word CAN2_SCE_IRQHandler + .word OTG_FS_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word BootRAM /* @0x1E0. This is for boot in RAM mode for + STM32F10x Connectivity line Devices. */ + +/******************************************************************************* +* +* Provide weak aliases for each Exception handler to the Default_Handler. +* As they are weak aliases, any function with the same name will override +* this definition. +* +*******************************************************************************/ + .weak NMI_Handler + .thumb_set NMI_Handler,Default_Handler + + .weak HardFault_Handler + .thumb_set HardFault_Handler,Default_Handler + + .weak MemManage_Handler + .thumb_set MemManage_Handler,Default_Handler + + .weak BusFault_Handler + .thumb_set BusFault_Handler,Default_Handler + + .weak UsageFault_Handler + .thumb_set UsageFault_Handler,Default_Handler + + .weak SVC_Handler + .thumb_set SVC_Handler,Default_Handler + + .weak DebugMon_Handler + .thumb_set DebugMon_Handler,Default_Handler + + .weak PendSV_Handler + .thumb_set PendSV_Handler,Default_Handler + + .weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler + + .weak WWDG_IRQHandler + .thumb_set WWDG_IRQHandler,Default_Handler + + .weak PVD_IRQHandler + .thumb_set PVD_IRQHandler,Default_Handler + + .weak TAMPER_IRQHandler + .thumb_set TAMPER_IRQHandler,Default_Handler + + .weak RTC_IRQHandler + .thumb_set RTC_IRQHandler,Default_Handler + + .weak FLASH_IRQHandler + .thumb_set FLASH_IRQHandler,Default_Handler + + .weak RCC_IRQHandler + .thumb_set RCC_IRQHandler,Default_Handler + + .weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler + + .weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler + + .weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler + + .weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler + + .weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler + + .weak DMA1_Channel1_IRQHandler + .thumb_set DMA1_Channel1_IRQHandler,Default_Handler + + .weak DMA1_Channel2_IRQHandler + .thumb_set DMA1_Channel2_IRQHandler,Default_Handler + + .weak DMA1_Channel3_IRQHandler + .thumb_set DMA1_Channel3_IRQHandler,Default_Handler + + .weak DMA1_Channel4_IRQHandler + .thumb_set DMA1_Channel4_IRQHandler,Default_Handler + + .weak DMA1_Channel5_IRQHandler + .thumb_set DMA1_Channel5_IRQHandler,Default_Handler + + .weak DMA1_Channel6_IRQHandler + .thumb_set DMA1_Channel6_IRQHandler,Default_Handler + + .weak DMA1_Channel7_IRQHandler + .thumb_set DMA1_Channel7_IRQHandler,Default_Handler + + .weak ADC1_2_IRQHandler + .thumb_set ADC1_2_IRQHandler,Default_Handler + + .weak CAN1_TX_IRQHandler + .thumb_set CAN1_TX_IRQHandler,Default_Handler + + .weak CAN1_RX0_IRQHandler + .thumb_set CAN1_RX0_IRQHandler,Default_Handler + + .weak CAN1_RX1_IRQHandler + .thumb_set CAN1_RX1_IRQHandler,Default_Handler + + .weak CAN1_SCE_IRQHandler + .thumb_set CAN1_SCE_IRQHandler,Default_Handler + + .weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler + + .weak TIM1_BRK_IRQHandler + .thumb_set TIM1_BRK_IRQHandler,Default_Handler + + .weak TIM1_UP_IRQHandler + .thumb_set TIM1_UP_IRQHandler,Default_Handler + + .weak TIM1_TRG_COM_IRQHandler + .thumb_set TIM1_TRG_COM_IRQHandler,Default_Handler + + .weak TIM1_CC_IRQHandler + .thumb_set TIM1_CC_IRQHandler,Default_Handler + + .weak TIM2_IRQHandler + .thumb_set TIM2_IRQHandler,Default_Handler + + .weak TIM3_IRQHandler + .thumb_set TIM3_IRQHandler,Default_Handler + + .weak TIM4_IRQHandler + .thumb_set TIM4_IRQHandler,Default_Handler + + .weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler + + .weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler + + .weak I2C2_EV_IRQHandler + .thumb_set I2C2_EV_IRQHandler,Default_Handler + + .weak I2C2_ER_IRQHandler + .thumb_set I2C2_ER_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak SPI2_IRQHandler + .thumb_set SPI2_IRQHandler,Default_Handler + + .weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler + + .weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler + + .weak USART3_IRQHandler + .thumb_set USART3_IRQHandler,Default_Handler + + .weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler + + .weak RTCAlarm_IRQHandler + .thumb_set RTCAlarm_IRQHandler,Default_Handler + + .weak OTG_FS_WKUP_IRQHandler + .thumb_set OTG_FS_WKUP_IRQHandler,Default_Handler + + .weak TIM5_IRQHandler + .thumb_set TIM5_IRQHandler,Default_Handler + + .weak SPI3_IRQHandler + .thumb_set SPI3_IRQHandler,Default_Handler + + .weak UART4_IRQHandler + .thumb_set UART4_IRQHandler,Default_Handler + + .weak UART5_IRQHandler + .thumb_set UART5_IRQHandler,Default_Handler + + .weak TIM6_IRQHandler + .thumb_set TIM6_IRQHandler,Default_Handler + + .weak TIM7_IRQHandler + .thumb_set TIM7_IRQHandler,Default_Handler + + .weak DMA2_Channel1_IRQHandler + .thumb_set DMA2_Channel1_IRQHandler,Default_Handler + + .weak DMA2_Channel2_IRQHandler + .thumb_set DMA2_Channel2_IRQHandler,Default_Handler + + .weak DMA2_Channel3_IRQHandler + .thumb_set DMA2_Channel3_IRQHandler,Default_Handler + + .weak DMA2_Channel4_IRQHandler + .thumb_set DMA2_Channel4_IRQHandler,Default_Handler + + .weak DMA2_Channel5_IRQHandler + .thumb_set DMA2_Channel5_IRQHandler,Default_Handler + + .weak ETH_IRQHandler + .thumb_set ETH_IRQHandler,Default_Handler + + .weak ETH_WKUP_IRQHandler + .thumb_set ETH_WKUP_IRQHandler,Default_Handler + + .weak CAN2_TX_IRQHandler + .thumb_set CAN2_TX_IRQHandler,Default_Handler + + .weak CAN2_RX0_IRQHandler + .thumb_set CAN2_RX0_IRQHandler,Default_Handler + + .weak CAN2_RX1_IRQHandler + .thumb_set CAN2_RX1_IRQHandler,Default_Handler + + .weak CAN2_SCE_IRQHandler + .thumb_set CAN2_SCE_IRQHandler,Default_Handler + + .weak OTG_FS_IRQHandler + .thumb_set OTG_FS_IRQHandler ,Default_Handler + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/TrueSTUDIO/startup_stm32f10x_hd.s b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/TrueSTUDIO/startup_stm32f10x_hd.s new file mode 100644 index 0000000..0aa9188 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/TrueSTUDIO/startup_stm32f10x_hd.s @@ -0,0 +1,469 @@ +/** + ****************************************************************************** + * @file startup_stm32f10x_hd.s + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief STM32F10x High Density Devices vector table for Atollic toolchain. + * This module performs: + * - Set the initial SP + * - Set the initial PC == Reset_Handler, + * - Set the vector table entries with the exceptions ISR address, + * - Configure the clock system + * - Configure external SRAM mounted on STM3210E-EVAL board + * to be used as data memory (optional, to be enabled by user) + * - Branches to main in the C library (which eventually + * calls main()). + * After Reset the Cortex-M3 processor is in Thread mode, + * priority is Privileged, and the Stack is set to Main. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + + .syntax unified + .cpu cortex-m3 + .fpu softvfp + .thumb + +.global g_pfnVectors +.global Default_Handler + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss + +.equ BootRAM, 0xF1E0F85F +/** + * @brief This is the code that gets called when the processor first + * starts execution following a reset event. Only the absolutely + * necessary set is performed, after which the application + * supplied main() routine is called. + * @param None + * @retval : None +*/ + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + +/* Copy the data segment initializers from flash to SRAM */ + movs r1, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r3, =_sidata + ldr r3, [r3, r1] + str r3, [r0, r1] + adds r1, r1, #4 + +LoopCopyDataInit: + ldr r0, =_sdata + ldr r3, =_edata + adds r2, r0, r1 + cmp r2, r3 + bcc CopyDataInit + ldr r2, =_sbss + b LoopFillZerobss +/* Zero fill the bss segment. */ +FillZerobss: + movs r3, #0 + str r3, [r2], #4 + +LoopFillZerobss: + ldr r3, = _ebss + cmp r2, r3 + bcc FillZerobss + +/* Call the clock system intitialization function.*/ + bl SystemInit +/* Call static constructors */ + bl __libc_init_array +/* Call the application's entry point.*/ + bl main + bx lr +.size Reset_Handler, .-Reset_Handler + +/** + * @brief This is the code that gets called when the processor receives an + * unexpected interrupt. This simply enters an infinite loop, preserving + * the system state for examination by a debugger. + * + * @param None + * @retval : None +*/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + .size Default_Handler, .-Default_Handler +/****************************************************************************** +* +* The minimal vector table for a Cortex M3. Note that the proper constructs +* must be placed on this to ensure that it ends up at physical address +* 0x0000.0000. +* +******************************************************************************/ + .section .isr_vector,"a",%progbits + .type g_pfnVectors, %object + .size g_pfnVectors, .-g_pfnVectors + + +g_pfnVectors: + .word _estack + .word Reset_Handler + .word NMI_Handler + .word HardFault_Handler + .word MemManage_Handler + .word BusFault_Handler + .word UsageFault_Handler + .word 0 + .word 0 + .word 0 + .word 0 + .word SVC_Handler + .word DebugMon_Handler + .word 0 + .word PendSV_Handler + .word SysTick_Handler + .word WWDG_IRQHandler + .word PVD_IRQHandler + .word TAMPER_IRQHandler + .word RTC_IRQHandler + .word FLASH_IRQHandler + .word RCC_IRQHandler + .word EXTI0_IRQHandler + .word EXTI1_IRQHandler + .word EXTI2_IRQHandler + .word EXTI3_IRQHandler + .word EXTI4_IRQHandler + .word DMA1_Channel1_IRQHandler + .word DMA1_Channel2_IRQHandler + .word DMA1_Channel3_IRQHandler + .word DMA1_Channel4_IRQHandler + .word DMA1_Channel5_IRQHandler + .word DMA1_Channel6_IRQHandler + .word DMA1_Channel7_IRQHandler + .word ADC1_2_IRQHandler + .word USB_HP_CAN1_TX_IRQHandler + .word USB_LP_CAN1_RX0_IRQHandler + .word CAN1_RX1_IRQHandler + .word CAN1_SCE_IRQHandler + .word EXTI9_5_IRQHandler + .word TIM1_BRK_IRQHandler + .word TIM1_UP_IRQHandler + .word TIM1_TRG_COM_IRQHandler + .word TIM1_CC_IRQHandler + .word TIM2_IRQHandler + .word TIM3_IRQHandler + .word TIM4_IRQHandler + .word I2C1_EV_IRQHandler + .word I2C1_ER_IRQHandler + .word I2C2_EV_IRQHandler + .word I2C2_ER_IRQHandler + .word SPI1_IRQHandler + .word SPI2_IRQHandler + .word USART1_IRQHandler + .word USART2_IRQHandler + .word USART3_IRQHandler + .word EXTI15_10_IRQHandler + .word RTCAlarm_IRQHandler + .word USBWakeUp_IRQHandler + .word TIM8_BRK_IRQHandler + .word TIM8_UP_IRQHandler + .word TIM8_TRG_COM_IRQHandler + .word TIM8_CC_IRQHandler + .word ADC3_IRQHandler + .word FSMC_IRQHandler + .word SDIO_IRQHandler + .word TIM5_IRQHandler + .word SPI3_IRQHandler + .word UART4_IRQHandler + .word UART5_IRQHandler + .word TIM6_IRQHandler + .word TIM7_IRQHandler + .word DMA2_Channel1_IRQHandler + .word DMA2_Channel2_IRQHandler + .word DMA2_Channel3_IRQHandler + .word DMA2_Channel4_5_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word BootRAM /* @0x1E0. This is for boot in RAM mode for + STM32F10x High Density devices. */ + +/******************************************************************************* +* +* Provide weak aliases for each Exception handler to the Default_Handler. +* As they are weak aliases, any function with the same name will override +* this definition. +* +*******************************************************************************/ + + .weak NMI_Handler + .thumb_set NMI_Handler,Default_Handler + + .weak HardFault_Handler + .thumb_set HardFault_Handler,Default_Handler + + .weak MemManage_Handler + .thumb_set MemManage_Handler,Default_Handler + + .weak BusFault_Handler + .thumb_set BusFault_Handler,Default_Handler + + .weak UsageFault_Handler + .thumb_set UsageFault_Handler,Default_Handler + + .weak SVC_Handler + .thumb_set SVC_Handler,Default_Handler + + .weak DebugMon_Handler + .thumb_set DebugMon_Handler,Default_Handler + + .weak PendSV_Handler + .thumb_set PendSV_Handler,Default_Handler + + .weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler + + .weak WWDG_IRQHandler + .thumb_set WWDG_IRQHandler,Default_Handler + + .weak PVD_IRQHandler + .thumb_set PVD_IRQHandler,Default_Handler + + .weak TAMPER_IRQHandler + .thumb_set TAMPER_IRQHandler,Default_Handler + + .weak RTC_IRQHandler + .thumb_set RTC_IRQHandler,Default_Handler + + .weak FLASH_IRQHandler + .thumb_set FLASH_IRQHandler,Default_Handler + + .weak RCC_IRQHandler + .thumb_set RCC_IRQHandler,Default_Handler + + .weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler + + .weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler + + .weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler + + .weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler + + .weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler + + .weak DMA1_Channel1_IRQHandler + .thumb_set DMA1_Channel1_IRQHandler,Default_Handler + + .weak DMA1_Channel2_IRQHandler + .thumb_set DMA1_Channel2_IRQHandler,Default_Handler + + .weak DMA1_Channel3_IRQHandler + .thumb_set DMA1_Channel3_IRQHandler,Default_Handler + + .weak DMA1_Channel4_IRQHandler + .thumb_set DMA1_Channel4_IRQHandler,Default_Handler + + .weak DMA1_Channel5_IRQHandler + .thumb_set DMA1_Channel5_IRQHandler,Default_Handler + + .weak DMA1_Channel6_IRQHandler + .thumb_set DMA1_Channel6_IRQHandler,Default_Handler + + .weak DMA1_Channel7_IRQHandler + .thumb_set DMA1_Channel7_IRQHandler,Default_Handler + + .weak ADC1_2_IRQHandler + .thumb_set ADC1_2_IRQHandler,Default_Handler + + .weak USB_HP_CAN1_TX_IRQHandler + .thumb_set USB_HP_CAN1_TX_IRQHandler,Default_Handler + + .weak USB_LP_CAN1_RX0_IRQHandler + .thumb_set USB_LP_CAN1_RX0_IRQHandler,Default_Handler + + .weak CAN1_RX1_IRQHandler + .thumb_set CAN1_RX1_IRQHandler,Default_Handler + + .weak CAN1_SCE_IRQHandler + .thumb_set CAN1_SCE_IRQHandler,Default_Handler + + .weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler + + .weak TIM1_BRK_IRQHandler + .thumb_set TIM1_BRK_IRQHandler,Default_Handler + + .weak TIM1_UP_IRQHandler + .thumb_set TIM1_UP_IRQHandler,Default_Handler + + .weak TIM1_TRG_COM_IRQHandler + .thumb_set TIM1_TRG_COM_IRQHandler,Default_Handler + + .weak TIM1_CC_IRQHandler + .thumb_set TIM1_CC_IRQHandler,Default_Handler + + .weak TIM2_IRQHandler + .thumb_set TIM2_IRQHandler,Default_Handler + + .weak TIM3_IRQHandler + .thumb_set TIM3_IRQHandler,Default_Handler + + .weak TIM4_IRQHandler + .thumb_set TIM4_IRQHandler,Default_Handler + + .weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler + + .weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler + + .weak I2C2_EV_IRQHandler + .thumb_set I2C2_EV_IRQHandler,Default_Handler + + .weak I2C2_ER_IRQHandler + .thumb_set I2C2_ER_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak SPI2_IRQHandler + .thumb_set SPI2_IRQHandler,Default_Handler + + .weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler + + .weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler + + .weak USART3_IRQHandler + .thumb_set USART3_IRQHandler,Default_Handler + + .weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler + + .weak RTCAlarm_IRQHandler + .thumb_set RTCAlarm_IRQHandler,Default_Handler + + .weak USBWakeUp_IRQHandler + .thumb_set USBWakeUp_IRQHandler,Default_Handler + + .weak TIM8_BRK_IRQHandler + .thumb_set TIM8_BRK_IRQHandler,Default_Handler + + .weak TIM8_UP_IRQHandler + .thumb_set TIM8_UP_IRQHandler,Default_Handler + + .weak TIM8_TRG_COM_IRQHandler + .thumb_set TIM8_TRG_COM_IRQHandler,Default_Handler + + .weak TIM8_CC_IRQHandler + .thumb_set TIM8_CC_IRQHandler,Default_Handler + + .weak ADC3_IRQHandler + .thumb_set ADC3_IRQHandler,Default_Handler + + .weak FSMC_IRQHandler + .thumb_set FSMC_IRQHandler,Default_Handler + + .weak SDIO_IRQHandler + .thumb_set SDIO_IRQHandler,Default_Handler + + .weak TIM5_IRQHandler + .thumb_set TIM5_IRQHandler,Default_Handler + + .weak SPI3_IRQHandler + .thumb_set SPI3_IRQHandler,Default_Handler + + .weak UART4_IRQHandler + .thumb_set UART4_IRQHandler,Default_Handler + + .weak UART5_IRQHandler + .thumb_set UART5_IRQHandler,Default_Handler + + .weak TIM6_IRQHandler + .thumb_set TIM6_IRQHandler,Default_Handler + + .weak TIM7_IRQHandler + .thumb_set TIM7_IRQHandler,Default_Handler + + .weak DMA2_Channel1_IRQHandler + .thumb_set DMA2_Channel1_IRQHandler,Default_Handler + + .weak DMA2_Channel2_IRQHandler + .thumb_set DMA2_Channel2_IRQHandler,Default_Handler + + .weak DMA2_Channel3_IRQHandler + .thumb_set DMA2_Channel3_IRQHandler,Default_Handler + + .weak DMA2_Channel4_5_IRQHandler + .thumb_set DMA2_Channel4_5_IRQHandler,Default_Handler + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/TrueSTUDIO/startup_stm32f10x_hd_vl.s b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/TrueSTUDIO/startup_stm32f10x_hd_vl.s new file mode 100644 index 0000000..55aa398 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/TrueSTUDIO/startup_stm32f10x_hd_vl.s @@ -0,0 +1,451 @@ +/** + ****************************************************************************** + * @file startup_stm32f10x_hd_vl.s + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief STM32F10x High Density Value Line Devices vector table for Atollic + * toolchain. + * This module performs: + * - Set the initial SP + * - Set the initial PC == Reset_Handler, + * - Set the vector table entries with the exceptions ISR address + * - Configure the clock system + * - Configure external SRAM mounted on STM32100E-EVAL board + * to be used as data memory (optional, to be enabled by user) + * - Branches to main in the C library (which eventually + * calls main()). + * After Reset the Cortex-M3 processor is in Thread mode, + * priority is Privileged, and the Stack is set to Main. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + + .syntax unified + .cpu cortex-m3 + .fpu softvfp + .thumb + +.global g_pfnVectors +.global Default_Handler + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss + +.equ BootRAM, 0xF108F85F +/** + * @brief This is the code that gets called when the processor first + * starts execution following a reset event. Only the absolutely + * necessary set is performed, after which the application + * supplied main() routine is called. + * @param None + * @retval : None +*/ + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + +/* Copy the data segment initializers from flash to SRAM */ + movs r1, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r3, =_sidata + ldr r3, [r3, r1] + str r3, [r0, r1] + adds r1, r1, #4 + +LoopCopyDataInit: + ldr r0, =_sdata + ldr r3, =_edata + adds r2, r0, r1 + cmp r2, r3 + bcc CopyDataInit + ldr r2, =_sbss + b LoopFillZerobss +/* Zero fill the bss segment. */ +FillZerobss: + movs r3, #0 + str r3, [r2], #4 + +LoopFillZerobss: + ldr r3, = _ebss + cmp r2, r3 + bcc FillZerobss + +/* Call the clock system intitialization function.*/ + bl SystemInit +/* Call static constructors */ + bl __libc_init_array +/* Call the application's entry point.*/ + bl main + bx lr +.size Reset_Handler, .-Reset_Handler + +/** + * @brief This is the code that gets called when the processor receives an + * unexpected interrupt. This simply enters an infinite loop, preserving + * the system state for examination by a debugger. + * + * @param None + * @retval : None +*/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + .size Default_Handler, .-Default_Handler +/****************************************************************************** +* +* The minimal vector table for a Cortex M3. Note that the proper constructs +* must be placed on this to ensure that it ends up at physical address +* 0x0000.0000. +* +******************************************************************************/ + .section .isr_vector,"a",%progbits + .type g_pfnVectors, %object + .size g_pfnVectors, .-g_pfnVectors + + +g_pfnVectors: + .word _estack + .word Reset_Handler + .word NMI_Handler + .word HardFault_Handler + .word MemManage_Handler + .word BusFault_Handler + .word UsageFault_Handler + .word 0 + .word 0 + .word 0 + .word 0 + .word SVC_Handler + .word DebugMon_Handler + .word 0 + .word PendSV_Handler + .word SysTick_Handler + .word WWDG_IRQHandler + .word PVD_IRQHandler + .word TAMPER_IRQHandler + .word RTC_IRQHandler + .word FLASH_IRQHandler + .word RCC_IRQHandler + .word EXTI0_IRQHandler + .word EXTI1_IRQHandler + .word EXTI2_IRQHandler + .word EXTI3_IRQHandler + .word EXTI4_IRQHandler + .word DMA1_Channel1_IRQHandler + .word DMA1_Channel2_IRQHandler + .word DMA1_Channel3_IRQHandler + .word DMA1_Channel4_IRQHandler + .word DMA1_Channel5_IRQHandler + .word DMA1_Channel6_IRQHandler + .word DMA1_Channel7_IRQHandler + .word ADC1_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word EXTI9_5_IRQHandler + .word TIM1_BRK_TIM15_IRQHandler + .word TIM1_UP_TIM16_IRQHandler + .word TIM1_TRG_COM_TIM17_IRQHandler + .word TIM1_CC_IRQHandler + .word TIM2_IRQHandler + .word TIM3_IRQHandler + .word TIM4_IRQHandler + .word I2C1_EV_IRQHandler + .word I2C1_ER_IRQHandler + .word I2C2_EV_IRQHandler + .word I2C2_ER_IRQHandler + .word SPI1_IRQHandler + .word SPI2_IRQHandler + .word USART1_IRQHandler + .word USART2_IRQHandler + .word USART3_IRQHandler + .word EXTI15_10_IRQHandler + .word RTCAlarm_IRQHandler + .word CEC_IRQHandler + .word TIM12_IRQHandler + .word TIM13_IRQHandler + .word TIM14_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word TIM5_IRQHandler + .word SPI3_IRQHandler + .word UART4_IRQHandler + .word UART5_IRQHandler + .word TIM6_DAC_IRQHandler + .word TIM7_IRQHandler + .word DMA2_Channel1_IRQHandler + .word DMA2_Channel2_IRQHandler + .word DMA2_Channel3_IRQHandler + .word DMA2_Channel4_5_IRQHandler + .word DMA2_Channel5_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word BootRAM /* @0x1E0. This is for boot in RAM mode for + STM32F10x High Density Value line devices. */ + +/******************************************************************************* +* +* Provide weak aliases for each Exception handler to the Default_Handler. +* As they are weak aliases, any function with the same name will override +* this definition. +* +*******************************************************************************/ + + + .weak NMI_Handler + .thumb_set NMI_Handler,Default_Handler + + .weak HardFault_Handler + .thumb_set HardFault_Handler,Default_Handler + + .weak MemManage_Handler + .thumb_set MemManage_Handler,Default_Handler + + .weak BusFault_Handler + .thumb_set BusFault_Handler,Default_Handler + + .weak UsageFault_Handler + .thumb_set UsageFault_Handler,Default_Handler + + .weak SVC_Handler + .thumb_set SVC_Handler,Default_Handler + + .weak DebugMon_Handler + .thumb_set DebugMon_Handler,Default_Handler + + .weak PendSV_Handler + .thumb_set PendSV_Handler,Default_Handler + + .weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler + + .weak WWDG_IRQHandler + .thumb_set WWDG_IRQHandler,Default_Handler + + .weak PVD_IRQHandler + .thumb_set PVD_IRQHandler,Default_Handler + + .weak TAMPER_IRQHandler + .thumb_set TAMPER_IRQHandler,Default_Handler + + .weak RTC_IRQHandler + .thumb_set RTC_IRQHandler,Default_Handler + + .weak FLASH_IRQHandler + .thumb_set FLASH_IRQHandler,Default_Handler + + .weak RCC_IRQHandler + .thumb_set RCC_IRQHandler,Default_Handler + + .weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler + + .weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler + + .weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler + + .weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler + + .weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler + + .weak DMA1_Channel1_IRQHandler + .thumb_set DMA1_Channel1_IRQHandler,Default_Handler + + .weak DMA1_Channel2_IRQHandler + .thumb_set DMA1_Channel2_IRQHandler,Default_Handler + + .weak DMA1_Channel3_IRQHandler + .thumb_set DMA1_Channel3_IRQHandler,Default_Handler + + .weak DMA1_Channel4_IRQHandler + .thumb_set DMA1_Channel4_IRQHandler,Default_Handler + + .weak DMA1_Channel5_IRQHandler + .thumb_set DMA1_Channel5_IRQHandler,Default_Handler + + .weak DMA1_Channel6_IRQHandler + .thumb_set DMA1_Channel6_IRQHandler,Default_Handler + + .weak DMA1_Channel7_IRQHandler + .thumb_set DMA1_Channel7_IRQHandler,Default_Handler + + .weak ADC1_IRQHandler + .thumb_set ADC1_IRQHandler,Default_Handler + + .weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler + + .weak TIM1_BRK_TIM15_IRQHandler + .thumb_set TIM1_BRK_TIM15_IRQHandler,Default_Handler + + .weak TIM1_UP_TIM16_IRQHandler + .thumb_set TIM1_UP_TIM16_IRQHandler,Default_Handler + + .weak TIM1_TRG_COM_TIM17_IRQHandler + .thumb_set TIM1_TRG_COM_TIM17_IRQHandler,Default_Handler + + .weak TIM1_CC_IRQHandler + .thumb_set TIM1_CC_IRQHandler,Default_Handler + + .weak TIM2_IRQHandler + .thumb_set TIM2_IRQHandler,Default_Handler + + .weak TIM3_IRQHandler + .thumb_set TIM3_IRQHandler,Default_Handler + + .weak TIM4_IRQHandler + .thumb_set TIM4_IRQHandler,Default_Handler + + .weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler + + .weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler + + .weak I2C2_EV_IRQHandler + .thumb_set I2C2_EV_IRQHandler,Default_Handler + + .weak I2C2_ER_IRQHandler + .thumb_set I2C2_ER_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak SPI2_IRQHandler + .thumb_set SPI2_IRQHandler,Default_Handler + + .weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler + + .weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler + + .weak USART3_IRQHandler + .thumb_set USART3_IRQHandler,Default_Handler + + .weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler + + .weak RTCAlarm_IRQHandler + .thumb_set RTCAlarm_IRQHandler,Default_Handler + + .weak CEC_IRQHandler + .thumb_set CEC_IRQHandler,Default_Handler + + .weak TIM12_IRQHandler + .thumb_set TIM12_IRQHandler,Default_Handler + + .weak TIM13_IRQHandler + .thumb_set TIM13_IRQHandler,Default_Handler + + .weak TIM14_IRQHandler + .thumb_set TIM14_IRQHandler,Default_Handler + + .weak TIM5_IRQHandler + .thumb_set TIM5_IRQHandler,Default_Handler + + .weak SPI3_IRQHandler + .thumb_set SPI3_IRQHandler,Default_Handler + + .weak UART4_IRQHandler + .thumb_set UART4_IRQHandler,Default_Handler + + .weak UART5_IRQHandler + .thumb_set UART5_IRQHandler,Default_Handler + + .weak TIM6_DAC_IRQHandler + .thumb_set TIM6_DAC_IRQHandler,Default_Handler + + .weak TIM7_IRQHandler + .thumb_set TIM7_IRQHandler,Default_Handler + + .weak DMA2_Channel1_IRQHandler + .thumb_set DMA2_Channel1_IRQHandler,Default_Handler + + .weak DMA2_Channel2_IRQHandler + .thumb_set DMA2_Channel2_IRQHandler,Default_Handler + + .weak DMA2_Channel3_IRQHandler + .thumb_set DMA2_Channel3_IRQHandler,Default_Handler + + .weak DMA2_Channel4_5_IRQHandler + .thumb_set DMA2_Channel4_5_IRQHandler,Default_Handler + + .weak DMA2_Channel5_IRQHandler + .thumb_set DMA2_Channel5_IRQHandler,Default_Handler + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/TrueSTUDIO/startup_stm32f10x_ld.s b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/TrueSTUDIO/startup_stm32f10x_ld.s new file mode 100644 index 0000000..2c5aaa0 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/TrueSTUDIO/startup_stm32f10x_ld.s @@ -0,0 +1,347 @@ +/** + ****************************************************************************** + * @file startup_stm32f10x_ld.s + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief STM32F10x Low Density Devices vector table for Atollic toolchain. + * This module performs: + * - Set the initial SP + * - Set the initial PC == Reset_Handler, + * - Set the vector table entries with the exceptions ISR address. + * - Configure the clock system + * - Branches to main in the C library (which eventually + * calls main()). + * After Reset the Cortex-M3 processor is in Thread mode, + * priority is Privileged, and the Stack is set to Main. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + + .syntax unified + .cpu cortex-m3 + .fpu softvfp + .thumb + +.global g_pfnVectors +.global Default_Handler + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss + +.equ BootRAM, 0xF108F85F +/** + * @brief This is the code that gets called when the processor first + * starts execution following a reset event. Only the absolutely + * necessary set is performed, after which the application + * supplied main() routine is called. + * @param None + * @retval : None +*/ + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + +/* Copy the data segment initializers from flash to SRAM */ + movs r1, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r3, =_sidata + ldr r3, [r3, r1] + str r3, [r0, r1] + adds r1, r1, #4 + +LoopCopyDataInit: + ldr r0, =_sdata + ldr r3, =_edata + adds r2, r0, r1 + cmp r2, r3 + bcc CopyDataInit + ldr r2, =_sbss + b LoopFillZerobss +/* Zero fill the bss segment. */ +FillZerobss: + movs r3, #0 + str r3, [r2], #4 + +LoopFillZerobss: + ldr r3, = _ebss + cmp r2, r3 + bcc FillZerobss + +/* Call the clock system intitialization function.*/ + bl SystemInit +/* Call static constructors */ + bl __libc_init_array +/* Call the application's entry point.*/ + bl main + bx lr +.size Reset_Handler, .-Reset_Handler + +/** + * @brief This is the code that gets called when the processor receives an + * unexpected interrupt. This simply enters an infinite loop, preserving + * the system state for examination by a debugger. + * + * @param None + * @retval : None +*/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + .size Default_Handler, .-Default_Handler +/****************************************************************************** +* +* The minimal vector table for a Cortex M3. Note that the proper constructs +* must be placed on this to ensure that it ends up at physical address +* 0x0000.0000. +* +******************************************************************************/ + .section .isr_vector,"a",%progbits + .type g_pfnVectors, %object + .size g_pfnVectors, .-g_pfnVectors + + +g_pfnVectors: + .word _estack + .word Reset_Handler + .word NMI_Handler + .word HardFault_Handler + .word MemManage_Handler + .word BusFault_Handler + .word UsageFault_Handler + .word 0 + .word 0 + .word 0 + .word 0 + .word SVC_Handler + .word DebugMon_Handler + .word 0 + .word PendSV_Handler + .word SysTick_Handler + .word WWDG_IRQHandler + .word PVD_IRQHandler + .word TAMPER_IRQHandler + .word RTC_IRQHandler + .word FLASH_IRQHandler + .word RCC_IRQHandler + .word EXTI0_IRQHandler + .word EXTI1_IRQHandler + .word EXTI2_IRQHandler + .word EXTI3_IRQHandler + .word EXTI4_IRQHandler + .word DMA1_Channel1_IRQHandler + .word DMA1_Channel2_IRQHandler + .word DMA1_Channel3_IRQHandler + .word DMA1_Channel4_IRQHandler + .word DMA1_Channel5_IRQHandler + .word DMA1_Channel6_IRQHandler + .word DMA1_Channel7_IRQHandler + .word ADC1_2_IRQHandler + .word USB_HP_CAN1_TX_IRQHandler + .word USB_LP_CAN1_RX0_IRQHandler + .word CAN1_RX1_IRQHandler + .word CAN1_SCE_IRQHandler + .word EXTI9_5_IRQHandler + .word TIM1_BRK_IRQHandler + .word TIM1_UP_IRQHandler + .word TIM1_TRG_COM_IRQHandler + .word TIM1_CC_IRQHandler + .word TIM2_IRQHandler + .word TIM3_IRQHandler + .word 0 + .word I2C1_EV_IRQHandler + .word I2C1_ER_IRQHandler + .word 0 + .word 0 + .word SPI1_IRQHandler + .word 0 + .word USART1_IRQHandler + .word USART2_IRQHandler + .word 0 + .word EXTI15_10_IRQHandler + .word RTCAlarm_IRQHandler + .word USBWakeUp_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word BootRAM /* @0x108. This is for boot in RAM mode for + STM32F10x Low Density devices.*/ + +/******************************************************************************* +* +* Provide weak aliases for each Exception handler to the Default_Handler. +* As they are weak aliases, any function with the same name will override +* this definition. +* +*******************************************************************************/ + + .weak NMI_Handler + .thumb_set NMI_Handler,Default_Handler + + .weak HardFault_Handler + .thumb_set HardFault_Handler,Default_Handler + + .weak MemManage_Handler + .thumb_set MemManage_Handler,Default_Handler + + .weak BusFault_Handler + .thumb_set BusFault_Handler,Default_Handler + + .weak UsageFault_Handler + .thumb_set UsageFault_Handler,Default_Handler + + .weak SVC_Handler + .thumb_set SVC_Handler,Default_Handler + + .weak DebugMon_Handler + .thumb_set DebugMon_Handler,Default_Handler + + .weak PendSV_Handler + .thumb_set PendSV_Handler,Default_Handler + + .weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler + + .weak WWDG_IRQHandler + .thumb_set WWDG_IRQHandler,Default_Handler + + .weak PVD_IRQHandler + .thumb_set PVD_IRQHandler,Default_Handler + + .weak TAMPER_IRQHandler + .thumb_set TAMPER_IRQHandler,Default_Handler + + .weak RTC_IRQHandler + .thumb_set RTC_IRQHandler,Default_Handler + + .weak FLASH_IRQHandler + .thumb_set FLASH_IRQHandler,Default_Handler + + .weak RCC_IRQHandler + .thumb_set RCC_IRQHandler,Default_Handler + + .weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler + + .weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler + + .weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler + + .weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler + + .weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler + + .weak DMA1_Channel1_IRQHandler + .thumb_set DMA1_Channel1_IRQHandler,Default_Handler + + .weak DMA1_Channel2_IRQHandler + .thumb_set DMA1_Channel2_IRQHandler,Default_Handler + + .weak DMA1_Channel3_IRQHandler + .thumb_set DMA1_Channel3_IRQHandler,Default_Handler + + .weak DMA1_Channel4_IRQHandler + .thumb_set DMA1_Channel4_IRQHandler,Default_Handler + + .weak DMA1_Channel5_IRQHandler + .thumb_set DMA1_Channel5_IRQHandler,Default_Handler + + .weak DMA1_Channel6_IRQHandler + .thumb_set DMA1_Channel6_IRQHandler,Default_Handler + + .weak DMA1_Channel7_IRQHandler + .thumb_set DMA1_Channel7_IRQHandler,Default_Handler + + .weak ADC1_2_IRQHandler + .thumb_set ADC1_2_IRQHandler,Default_Handler + + .weak USB_HP_CAN1_TX_IRQHandler + .thumb_set USB_HP_CAN1_TX_IRQHandler,Default_Handler + + .weak USB_LP_CAN1_RX0_IRQHandler + .thumb_set USB_LP_CAN1_RX0_IRQHandler,Default_Handler + + .weak CAN1_RX1_IRQHandler + .thumb_set CAN1_RX1_IRQHandler,Default_Handler + + .weak CAN1_SCE_IRQHandler + .thumb_set CAN1_SCE_IRQHandler,Default_Handler + + .weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler + + .weak TIM1_BRK_IRQHandler + .thumb_set TIM1_BRK_IRQHandler,Default_Handler + + .weak TIM1_UP_IRQHandler + .thumb_set TIM1_UP_IRQHandler,Default_Handler + + .weak TIM1_TRG_COM_IRQHandler + .thumb_set TIM1_TRG_COM_IRQHandler,Default_Handler + + .weak TIM1_CC_IRQHandler + .thumb_set TIM1_CC_IRQHandler,Default_Handler + + .weak TIM2_IRQHandler + .thumb_set TIM2_IRQHandler,Default_Handler + + .weak TIM3_IRQHandler + .thumb_set TIM3_IRQHandler,Default_Handler + + .weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler + + .weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler + + .weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler + + .weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler + + .weak RTCAlarm_IRQHandler + .thumb_set RTCAlarm_IRQHandler,Default_Handler + + .weak USBWakeUp_IRQHandler + .thumb_set USBWakeUp_IRQHandler,Default_Handler + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/TrueSTUDIO/startup_stm32f10x_ld_vl.s b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/TrueSTUDIO/startup_stm32f10x_ld_vl.s new file mode 100644 index 0000000..9af6e8b --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/TrueSTUDIO/startup_stm32f10x_ld_vl.s @@ -0,0 +1,392 @@ +/** + ****************************************************************************** + * @file startup_stm32f10x_ld_vl.s + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief STM32F10x Low Density Value Line Devices vector table for Atollic toolchain. + * This module performs: + * - Set the initial SP + * - Set the initial PC == Reset_Handler, + * - Set the vector table entries with the exceptions ISR address + * - Configure the clock system + * - Branches to main in the C library (which eventually + * calls main()). + * After Reset the Cortex-M3 processor is in Thread mode, + * priority is Privileged, and the Stack is set to Main. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + + .syntax unified + .cpu cortex-m3 + .fpu softvfp + .thumb + +.global g_pfnVectors +.global Default_Handler + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss + +.equ BootRAM, 0xF108F85F +/** + * @brief This is the code that gets called when the processor first + * starts execution following a reset event. Only the absolutely + * necessary set is performed, after which the application + * supplied main() routine is called. + * @param None + * @retval : None +*/ + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + +/* Copy the data segment initializers from flash to SRAM */ + movs r1, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r3, =_sidata + ldr r3, [r3, r1] + str r3, [r0, r1] + adds r1, r1, #4 + +LoopCopyDataInit: + ldr r0, =_sdata + ldr r3, =_edata + adds r2, r0, r1 + cmp r2, r3 + bcc CopyDataInit + ldr r2, =_sbss + b LoopFillZerobss +/* Zero fill the bss segment. */ +FillZerobss: + movs r3, #0 + str r3, [r2], #4 + +LoopFillZerobss: + ldr r3, = _ebss + cmp r2, r3 + bcc FillZerobss + +/* Call the clock system intitialization function.*/ + bl SystemInit +/* Call static constructors */ + bl __libc_init_array +/* Call the application's entry point.*/ + bl main + bx lr +.size Reset_Handler, .-Reset_Handler + +/** + * @brief This is the code that gets called when the processor receives an + * unexpected interrupt. This simply enters an infinite loop, preserving + * the system state for examination by a debugger. + * + * @param None + * @retval : None +*/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + .size Default_Handler, .-Default_Handler +/****************************************************************************** +* +* The minimal vector table for a Cortex M3. Note that the proper constructs +* must be placed on this to ensure that it ends up at physical address +* 0x0000.0000. +* +******************************************************************************/ + .section .isr_vector,"a",%progbits + .type g_pfnVectors, %object + .size g_pfnVectors, .-g_pfnVectors + + +g_pfnVectors: + .word _estack + .word Reset_Handler + .word NMI_Handler + .word HardFault_Handler + .word MemManage_Handler + .word BusFault_Handler + .word UsageFault_Handler + .word 0 + .word 0 + .word 0 + .word 0 + .word SVC_Handler + .word DebugMon_Handler + .word 0 + .word PendSV_Handler + .word SysTick_Handler + .word WWDG_IRQHandler + .word PVD_IRQHandler + .word TAMPER_IRQHandler + .word RTC_IRQHandler + .word FLASH_IRQHandler + .word RCC_IRQHandler + .word EXTI0_IRQHandler + .word EXTI1_IRQHandler + .word EXTI2_IRQHandler + .word EXTI3_IRQHandler + .word EXTI4_IRQHandler + .word DMA1_Channel1_IRQHandler + .word DMA1_Channel2_IRQHandler + .word DMA1_Channel3_IRQHandler + .word DMA1_Channel4_IRQHandler + .word DMA1_Channel5_IRQHandler + .word DMA1_Channel6_IRQHandler + .word DMA1_Channel7_IRQHandler + .word ADC1_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word EXTI9_5_IRQHandler + .word TIM1_BRK_TIM15_IRQHandler + .word TIM1_UP_TIM16_IRQHandler + .word TIM1_TRG_COM_TIM17_IRQHandler + .word TIM1_CC_IRQHandler + .word TIM2_IRQHandler + .word TIM3_IRQHandler + .word 0 + .word I2C1_EV_IRQHandler + .word I2C1_ER_IRQHandler + .word 0 + .word 0 + .word SPI1_IRQHandler + .word 0 + .word USART1_IRQHandler + .word USART2_IRQHandler + .word 0 + .word EXTI15_10_IRQHandler + .word RTCAlarm_IRQHandler + .word CEC_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word TIM6_DAC_IRQHandler + .word TIM7_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word BootRAM /* @0x01CC. This is for boot in RAM mode for + STM32F10x Medium Value Line Density devices. */ + +/******************************************************************************* +* +* Provide weak aliases for each Exception handler to the Default_Handler. +* As they are weak aliases, any function with the same name will override +* this definition. +* +*******************************************************************************/ + + + .weak NMI_Handler + .thumb_set NMI_Handler,Default_Handler + + .weak HardFault_Handler + .thumb_set HardFault_Handler,Default_Handler + + .weak MemManage_Handler + .thumb_set MemManage_Handler,Default_Handler + + .weak BusFault_Handler + .thumb_set BusFault_Handler,Default_Handler + + .weak UsageFault_Handler + .thumb_set UsageFault_Handler,Default_Handler + + .weak SVC_Handler + .thumb_set SVC_Handler,Default_Handler + + .weak DebugMon_Handler + .thumb_set DebugMon_Handler,Default_Handler + + .weak PendSV_Handler + .thumb_set PendSV_Handler,Default_Handler + + .weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler + + .weak WWDG_IRQHandler + .thumb_set WWDG_IRQHandler,Default_Handler + + .weak PVD_IRQHandler + .thumb_set PVD_IRQHandler,Default_Handler + + .weak TAMPER_IRQHandler + .thumb_set TAMPER_IRQHandler,Default_Handler + + .weak RTC_IRQHandler + .thumb_set RTC_IRQHandler,Default_Handler + + .weak FLASH_IRQHandler + .thumb_set FLASH_IRQHandler,Default_Handler + + .weak RCC_IRQHandler + .thumb_set RCC_IRQHandler,Default_Handler + + .weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler + + .weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler + + .weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler + + .weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler + + .weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler + + .weak DMA1_Channel1_IRQHandler + .thumb_set DMA1_Channel1_IRQHandler,Default_Handler + + .weak DMA1_Channel2_IRQHandler + .thumb_set DMA1_Channel2_IRQHandler,Default_Handler + + .weak DMA1_Channel3_IRQHandler + .thumb_set DMA1_Channel3_IRQHandler,Default_Handler + + .weak DMA1_Channel4_IRQHandler + .thumb_set DMA1_Channel4_IRQHandler,Default_Handler + + .weak DMA1_Channel5_IRQHandler + .thumb_set DMA1_Channel5_IRQHandler,Default_Handler + + .weak DMA1_Channel6_IRQHandler + .thumb_set DMA1_Channel6_IRQHandler,Default_Handler + + .weak DMA1_Channel7_IRQHandler + .thumb_set DMA1_Channel7_IRQHandler,Default_Handler + + .weak ADC1_IRQHandler + .thumb_set ADC1_IRQHandler,Default_Handler + + .weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler + + .weak TIM1_BRK_TIM15_IRQHandler + .thumb_set TIM1_BRK_TIM15_IRQHandler,Default_Handler + + .weak TIM1_UP_TIM16_IRQHandler + .thumb_set TIM1_UP_TIM16_IRQHandler,Default_Handler + + .weak TIM1_TRG_COM_TIM17_IRQHandler + .thumb_set TIM1_TRG_COM_TIM17_IRQHandler,Default_Handler + + .weak TIM1_CC_IRQHandler + .thumb_set TIM1_CC_IRQHandler,Default_Handler + + .weak TIM2_IRQHandler + .thumb_set TIM2_IRQHandler,Default_Handler + + .weak TIM3_IRQHandler + .thumb_set TIM3_IRQHandler,Default_Handler + + .weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler + + .weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler + + .weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler + + .weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler + + .weak RTCAlarm_IRQHandler + .thumb_set RTCAlarm_IRQHandler,Default_Handler + + .weak CEC_IRQHandler + .thumb_set CEC_IRQHandler,Default_Handler + + .weak TIM6_DAC_IRQHandler + .thumb_set TIM6_DAC_IRQHandler,Default_Handler + + .weak TIM7_IRQHandler + .thumb_set TIM7_IRQHandler,Default_Handler + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/TrueSTUDIO/startup_stm32f10x_md.s b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/TrueSTUDIO/startup_stm32f10x_md.s new file mode 100644 index 0000000..c14ba21 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/TrueSTUDIO/startup_stm32f10x_md.s @@ -0,0 +1,363 @@ +/** + ****************************************************************************** + * @file startup_stm32f10x_md.s + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief STM32F10x Medium Density Devices vector table for Atollic toolchain. + * This module performs: + * - Set the initial SP + * - Set the initial PC == Reset_Handler, + * - Set the vector table entries with the exceptions ISR address + * - Configure the clock system + * - Branches to main in the C library (which eventually + * calls main()). + * After Reset the Cortex-M3 processor is in Thread mode, + * priority is Privileged, and the Stack is set to Main. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + + .syntax unified + .cpu cortex-m3 + .fpu softvfp + .thumb + +.global g_pfnVectors +.global Default_Handler + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss + +.equ BootRAM, 0xF108F85F +/** + * @brief This is the code that gets called when the processor first + * starts execution following a reset event. Only the absolutely + * necessary set is performed, after which the application + * supplied main() routine is called. + * @param None + * @retval : None +*/ + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + +/* Copy the data segment initializers from flash to SRAM */ + movs r1, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r3, =_sidata + ldr r3, [r3, r1] + str r3, [r0, r1] + adds r1, r1, #4 + +LoopCopyDataInit: + ldr r0, =_sdata + ldr r3, =_edata + adds r2, r0, r1 + cmp r2, r3 + bcc CopyDataInit + ldr r2, =_sbss + b LoopFillZerobss +/* Zero fill the bss segment. */ +FillZerobss: + movs r3, #0 + str r3, [r2], #4 + +LoopFillZerobss: + ldr r3, = _ebss + cmp r2, r3 + bcc FillZerobss + +/* Call the clock system intitialization function.*/ + bl SystemInit +/* Call static constructors */ + bl __libc_init_array +/* Call the application's entry point.*/ + bl main + bx lr +.size Reset_Handler, .-Reset_Handler + +/** + * @brief This is the code that gets called when the processor receives an + * unexpected interrupt. This simply enters an infinite loop, preserving + * the system state for examination by a debugger. + * + * @param None + * @retval : None +*/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + .size Default_Handler, .-Default_Handler +/****************************************************************************** +* +* The minimal vector table for a Cortex M3. Note that the proper constructs +* must be placed on this to ensure that it ends up at physical address +* 0x0000.0000. +* +******************************************************************************/ + .section .isr_vector,"a",%progbits + .type g_pfnVectors, %object + .size g_pfnVectors, .-g_pfnVectors + + +g_pfnVectors: + .word _estack + .word Reset_Handler + .word NMI_Handler + .word HardFault_Handler + .word MemManage_Handler + .word BusFault_Handler + .word UsageFault_Handler + .word 0 + .word 0 + .word 0 + .word 0 + .word SVC_Handler + .word DebugMon_Handler + .word 0 + .word PendSV_Handler + .word SysTick_Handler + .word WWDG_IRQHandler + .word PVD_IRQHandler + .word TAMPER_IRQHandler + .word RTC_IRQHandler + .word FLASH_IRQHandler + .word RCC_IRQHandler + .word EXTI0_IRQHandler + .word EXTI1_IRQHandler + .word EXTI2_IRQHandler + .word EXTI3_IRQHandler + .word EXTI4_IRQHandler + .word DMA1_Channel1_IRQHandler + .word DMA1_Channel2_IRQHandler + .word DMA1_Channel3_IRQHandler + .word DMA1_Channel4_IRQHandler + .word DMA1_Channel5_IRQHandler + .word DMA1_Channel6_IRQHandler + .word DMA1_Channel7_IRQHandler + .word ADC1_2_IRQHandler + .word USB_HP_CAN1_TX_IRQHandler + .word USB_LP_CAN1_RX0_IRQHandler + .word CAN1_RX1_IRQHandler + .word CAN1_SCE_IRQHandler + .word EXTI9_5_IRQHandler + .word TIM1_BRK_IRQHandler + .word TIM1_UP_IRQHandler + .word TIM1_TRG_COM_IRQHandler + .word TIM1_CC_IRQHandler + .word TIM2_IRQHandler + .word TIM3_IRQHandler + .word TIM4_IRQHandler + .word I2C1_EV_IRQHandler + .word I2C1_ER_IRQHandler + .word I2C2_EV_IRQHandler + .word I2C2_ER_IRQHandler + .word SPI1_IRQHandler + .word SPI2_IRQHandler + .word USART1_IRQHandler + .word USART2_IRQHandler + .word USART3_IRQHandler + .word EXTI15_10_IRQHandler + .word RTCAlarm_IRQHandler + .word USBWakeUp_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word BootRAM /* @0x108. This is for boot in RAM mode for + STM32F10x Medium Density devices. */ + +/******************************************************************************* +* +* Provide weak aliases for each Exception handler to the Default_Handler. +* As they are weak aliases, any function with the same name will override +* this definition. +* +*******************************************************************************/ + + .weak NMI_Handler + .thumb_set NMI_Handler,Default_Handler + + .weak HardFault_Handler + .thumb_set HardFault_Handler,Default_Handler + + .weak MemManage_Handler + .thumb_set MemManage_Handler,Default_Handler + + .weak BusFault_Handler + .thumb_set BusFault_Handler,Default_Handler + + .weak UsageFault_Handler + .thumb_set UsageFault_Handler,Default_Handler + + .weak SVC_Handler + .thumb_set SVC_Handler,Default_Handler + + .weak DebugMon_Handler + .thumb_set DebugMon_Handler,Default_Handler + + .weak PendSV_Handler + .thumb_set PendSV_Handler,Default_Handler + + .weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler + + .weak WWDG_IRQHandler + .thumb_set WWDG_IRQHandler,Default_Handler + + .weak PVD_IRQHandler + .thumb_set PVD_IRQHandler,Default_Handler + + .weak TAMPER_IRQHandler + .thumb_set TAMPER_IRQHandler,Default_Handler + + .weak RTC_IRQHandler + .thumb_set RTC_IRQHandler,Default_Handler + + .weak FLASH_IRQHandler + .thumb_set FLASH_IRQHandler,Default_Handler + + .weak RCC_IRQHandler + .thumb_set RCC_IRQHandler,Default_Handler + + .weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler + + .weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler + + .weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler + + .weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler + + .weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler + + .weak DMA1_Channel1_IRQHandler + .thumb_set DMA1_Channel1_IRQHandler,Default_Handler + + .weak DMA1_Channel2_IRQHandler + .thumb_set DMA1_Channel2_IRQHandler,Default_Handler + + .weak DMA1_Channel3_IRQHandler + .thumb_set DMA1_Channel3_IRQHandler,Default_Handler + + .weak DMA1_Channel4_IRQHandler + .thumb_set DMA1_Channel4_IRQHandler,Default_Handler + + .weak DMA1_Channel5_IRQHandler + .thumb_set DMA1_Channel5_IRQHandler,Default_Handler + + .weak DMA1_Channel6_IRQHandler + .thumb_set DMA1_Channel6_IRQHandler,Default_Handler + + .weak DMA1_Channel7_IRQHandler + .thumb_set DMA1_Channel7_IRQHandler,Default_Handler + + .weak ADC1_2_IRQHandler + .thumb_set ADC1_2_IRQHandler,Default_Handler + + .weak USB_HP_CAN1_TX_IRQHandler + .thumb_set USB_HP_CAN1_TX_IRQHandler,Default_Handler + + .weak USB_LP_CAN1_RX0_IRQHandler + .thumb_set USB_LP_CAN1_RX0_IRQHandler,Default_Handler + + .weak CAN1_RX1_IRQHandler + .thumb_set CAN1_RX1_IRQHandler,Default_Handler + + .weak CAN1_SCE_IRQHandler + .thumb_set CAN1_SCE_IRQHandler,Default_Handler + + .weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler + + .weak TIM1_BRK_IRQHandler + .thumb_set TIM1_BRK_IRQHandler,Default_Handler + + .weak TIM1_UP_IRQHandler + .thumb_set TIM1_UP_IRQHandler,Default_Handler + + .weak TIM1_TRG_COM_IRQHandler + .thumb_set TIM1_TRG_COM_IRQHandler,Default_Handler + + .weak TIM1_CC_IRQHandler + .thumb_set TIM1_CC_IRQHandler,Default_Handler + + .weak TIM2_IRQHandler + .thumb_set TIM2_IRQHandler,Default_Handler + + .weak TIM3_IRQHandler + .thumb_set TIM3_IRQHandler,Default_Handler + + .weak TIM4_IRQHandler + .thumb_set TIM4_IRQHandler,Default_Handler + + .weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler + + .weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler + + .weak I2C2_EV_IRQHandler + .thumb_set I2C2_EV_IRQHandler,Default_Handler + + .weak I2C2_ER_IRQHandler + .thumb_set I2C2_ER_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak SPI2_IRQHandler + .thumb_set SPI2_IRQHandler,Default_Handler + + .weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler + + .weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler + + .weak USART3_IRQHandler + .thumb_set USART3_IRQHandler,Default_Handler + + .weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler + + .weak RTCAlarm_IRQHandler + .thumb_set RTCAlarm_IRQHandler,Default_Handler + + .weak USBWakeUp_IRQHandler + .thumb_set USBWakeUp_IRQHandler,Default_Handler + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/TrueSTUDIO/startup_stm32f10x_md_vl.s b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/TrueSTUDIO/startup_stm32f10x_md_vl.s new file mode 100644 index 0000000..4ac1230 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/TrueSTUDIO/startup_stm32f10x_md_vl.s @@ -0,0 +1,408 @@ +/** + ****************************************************************************** + * @file startup_stm32f10x_md_vl.s + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief STM32F10x Medium Density Value Line Devices vector table for Atollic + * toolchain. + * This module performs: + * - Set the initial SP + * - Set the initial PC == Reset_Handler, + * - Set the vector table entries with the exceptions ISR address + * - Configure the clock system + * - Branches to main in the C library (which eventually + * calls main()). + * After Reset the Cortex-M3 processor is in Thread mode, + * priority is Privileged, and the Stack is set to Main. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + + .syntax unified + .cpu cortex-m3 + .fpu softvfp + .thumb + +.global g_pfnVectors +.global Default_Handler + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss + +.equ BootRAM, 0xF108F85F +/** + * @brief This is the code that gets called when the processor first + * starts execution following a reset event. Only the absolutely + * necessary set is performed, after which the application + * supplied main() routine is called. + * @param None + * @retval : None +*/ + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + +/* Copy the data segment initializers from flash to SRAM */ + movs r1, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r3, =_sidata + ldr r3, [r3, r1] + str r3, [r0, r1] + adds r1, r1, #4 + +LoopCopyDataInit: + ldr r0, =_sdata + ldr r3, =_edata + adds r2, r0, r1 + cmp r2, r3 + bcc CopyDataInit + ldr r2, =_sbss + b LoopFillZerobss +/* Zero fill the bss segment. */ +FillZerobss: + movs r3, #0 + str r3, [r2], #4 + +LoopFillZerobss: + ldr r3, = _ebss + cmp r2, r3 + bcc FillZerobss + +/* Call the clock system intitialization function.*/ + bl SystemInit +/* Call static constructors */ + bl __libc_init_array +/* Call the application's entry point.*/ + bl main + bx lr +.size Reset_Handler, .-Reset_Handler + +/** + * @brief This is the code that gets called when the processor receives an + * unexpected interrupt. This simply enters an infinite loop, preserving + * the system state for examination by a debugger. + * + * @param None + * @retval : None +*/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + .size Default_Handler, .-Default_Handler +/****************************************************************************** +* +* The minimal vector table for a Cortex M3. Note that the proper constructs +* must be placed on this to ensure that it ends up at physical address +* 0x0000.0000. +* +******************************************************************************/ + .section .isr_vector,"a",%progbits + .type g_pfnVectors, %object + .size g_pfnVectors, .-g_pfnVectors + + +g_pfnVectors: + .word _estack + .word Reset_Handler + .word NMI_Handler + .word HardFault_Handler + .word MemManage_Handler + .word BusFault_Handler + .word UsageFault_Handler + .word 0 + .word 0 + .word 0 + .word 0 + .word SVC_Handler + .word DebugMon_Handler + .word 0 + .word PendSV_Handler + .word SysTick_Handler + .word WWDG_IRQHandler + .word PVD_IRQHandler + .word TAMPER_IRQHandler + .word RTC_IRQHandler + .word FLASH_IRQHandler + .word RCC_IRQHandler + .word EXTI0_IRQHandler + .word EXTI1_IRQHandler + .word EXTI2_IRQHandler + .word EXTI3_IRQHandler + .word EXTI4_IRQHandler + .word DMA1_Channel1_IRQHandler + .word DMA1_Channel2_IRQHandler + .word DMA1_Channel3_IRQHandler + .word DMA1_Channel4_IRQHandler + .word DMA1_Channel5_IRQHandler + .word DMA1_Channel6_IRQHandler + .word DMA1_Channel7_IRQHandler + .word ADC1_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word EXTI9_5_IRQHandler + .word TIM1_BRK_TIM15_IRQHandler + .word TIM1_UP_TIM16_IRQHandler + .word TIM1_TRG_COM_TIM17_IRQHandler + .word TIM1_CC_IRQHandler + .word TIM2_IRQHandler + .word TIM3_IRQHandler + .word TIM4_IRQHandler + .word I2C1_EV_IRQHandler + .word I2C1_ER_IRQHandler + .word I2C2_EV_IRQHandler + .word I2C2_ER_IRQHandler + .word SPI1_IRQHandler + .word SPI2_IRQHandler + .word USART1_IRQHandler + .word USART2_IRQHandler + .word USART3_IRQHandler + .word EXTI15_10_IRQHandler + .word RTCAlarm_IRQHandler + .word CEC_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word TIM6_DAC_IRQHandler + .word TIM7_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word BootRAM /* @0x01CC. This is for boot in RAM mode for + STM32F10x Medium Value Line Density devices. */ + +/******************************************************************************* +* +* Provide weak aliases for each Exception handler to the Default_Handler. +* As they are weak aliases, any function with the same name will override +* this definition. +* +*******************************************************************************/ + + + .weak NMI_Handler + .thumb_set NMI_Handler,Default_Handler + + .weak HardFault_Handler + .thumb_set HardFault_Handler,Default_Handler + + .weak MemManage_Handler + .thumb_set MemManage_Handler,Default_Handler + + .weak BusFault_Handler + .thumb_set BusFault_Handler,Default_Handler + + .weak UsageFault_Handler + .thumb_set UsageFault_Handler,Default_Handler + + .weak SVC_Handler + .thumb_set SVC_Handler,Default_Handler + + .weak DebugMon_Handler + .thumb_set DebugMon_Handler,Default_Handler + + .weak PendSV_Handler + .thumb_set PendSV_Handler,Default_Handler + + .weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler + + .weak WWDG_IRQHandler + .thumb_set WWDG_IRQHandler,Default_Handler + + .weak PVD_IRQHandler + .thumb_set PVD_IRQHandler,Default_Handler + + .weak TAMPER_IRQHandler + .thumb_set TAMPER_IRQHandler,Default_Handler + + .weak RTC_IRQHandler + .thumb_set RTC_IRQHandler,Default_Handler + + .weak FLASH_IRQHandler + .thumb_set FLASH_IRQHandler,Default_Handler + + .weak RCC_IRQHandler + .thumb_set RCC_IRQHandler,Default_Handler + + .weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler + + .weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler + + .weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler + + .weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler + + .weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler + + .weak DMA1_Channel1_IRQHandler + .thumb_set DMA1_Channel1_IRQHandler,Default_Handler + + .weak DMA1_Channel2_IRQHandler + .thumb_set DMA1_Channel2_IRQHandler,Default_Handler + + .weak DMA1_Channel3_IRQHandler + .thumb_set DMA1_Channel3_IRQHandler,Default_Handler + + .weak DMA1_Channel4_IRQHandler + .thumb_set DMA1_Channel4_IRQHandler,Default_Handler + + .weak DMA1_Channel5_IRQHandler + .thumb_set DMA1_Channel5_IRQHandler,Default_Handler + + .weak DMA1_Channel6_IRQHandler + .thumb_set DMA1_Channel6_IRQHandler,Default_Handler + + .weak DMA1_Channel7_IRQHandler + .thumb_set DMA1_Channel7_IRQHandler,Default_Handler + + .weak ADC1_IRQHandler + .thumb_set ADC1_IRQHandler,Default_Handler + + .weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler + + .weak TIM1_BRK_TIM15_IRQHandler + .thumb_set TIM1_BRK_TIM15_IRQHandler,Default_Handler + + .weak TIM1_UP_TIM16_IRQHandler + .thumb_set TIM1_UP_TIM16_IRQHandler,Default_Handler + + .weak TIM1_TRG_COM_TIM17_IRQHandler + .thumb_set TIM1_TRG_COM_TIM17_IRQHandler,Default_Handler + + .weak TIM1_CC_IRQHandler + .thumb_set TIM1_CC_IRQHandler,Default_Handler + + .weak TIM2_IRQHandler + .thumb_set TIM2_IRQHandler,Default_Handler + + .weak TIM3_IRQHandler + .thumb_set TIM3_IRQHandler,Default_Handler + + .weak TIM4_IRQHandler + .thumb_set TIM4_IRQHandler,Default_Handler + + .weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler + + .weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler + + .weak I2C2_EV_IRQHandler + .thumb_set I2C2_EV_IRQHandler,Default_Handler + + .weak I2C2_ER_IRQHandler + .thumb_set I2C2_ER_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak SPI2_IRQHandler + .thumb_set SPI2_IRQHandler,Default_Handler + + .weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler + + .weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler + + .weak USART3_IRQHandler + .thumb_set USART3_IRQHandler,Default_Handler + + .weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler + + .weak RTCAlarm_IRQHandler + .thumb_set RTCAlarm_IRQHandler,Default_Handler + + .weak CEC_IRQHandler + .thumb_set CEC_IRQHandler,Default_Handler + + .weak TIM6_DAC_IRQHandler + .thumb_set TIM6_DAC_IRQHandler,Default_Handler + + .weak TIM7_IRQHandler + .thumb_set TIM7_IRQHandler,Default_Handler + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/TrueSTUDIO/startup_stm32f10x_xl.s b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/TrueSTUDIO/startup_stm32f10x_xl.s new file mode 100644 index 0000000..19bdf5a --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/TrueSTUDIO/startup_stm32f10x_xl.s @@ -0,0 +1,467 @@ +/** + ****************************************************************************** + * @file startup_stm32f10x_xl.s + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief STM32F10x XL-Density Devices vector table for TrueSTUDIO toolchain. + * This module performs: + * - Set the initial SP + * - Set the initial PC == Reset_Handler, + * - Set the vector table entries with the exceptions ISR address + * - Configure the clock system and the external SRAM mounted on + * STM3210E-EVAL board to be used as data memory (optional, + * to be enabled by user) + * - Branches to main in the C library (which eventually + * calls main()). + * After Reset the Cortex-M3 processor is in Thread mode, + * priority is Privileged, and the Stack is set to Main. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + + .syntax unified + .cpu cortex-m3 + .fpu softvfp + .thumb + +.global g_pfnVectors +.global Default_Handler + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss + +.equ BootRAM, 0xF1E0F85F +/** + * @brief This is the code that gets called when the processor first + * starts execution following a reset event. Only the absolutely + * necessary set is performed, after which the application + * supplied main() routine is called. + * @param None + * @retval : None +*/ + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + +/* Copy the data segment initializers from flash to SRAM */ + movs r1, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r3, =_sidata + ldr r3, [r3, r1] + str r3, [r0, r1] + adds r1, r1, #4 + +LoopCopyDataInit: + ldr r0, =_sdata + ldr r3, =_edata + adds r2, r0, r1 + cmp r2, r3 + bcc CopyDataInit + ldr r2, =_sbss + b LoopFillZerobss +/* Zero fill the bss segment. */ +FillZerobss: + movs r3, #0 + str r3, [r2], #4 + +LoopFillZerobss: + ldr r3, = _ebss + cmp r2, r3 + bcc FillZerobss + +/* Call the clock system intitialization function.*/ + bl SystemInit +/* Call static constructors */ + bl __libc_init_array +/* Call the application's entry point.*/ + bl main + bx lr +.size Reset_Handler, .-Reset_Handler + +/** + * @brief This is the code that gets called when the processor receives an + * unexpected interrupt. This simply enters an infinite loop, preserving + * the system state for examination by a debugger. + * @param None + * @retval None +*/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + .size Default_Handler, .-Default_Handler +/****************************************************************************** +* +* The minimal vector table for a Cortex M3. Note that the proper constructs +* must be placed on this to ensure that it ends up at physical address +* 0x0000.0000. +* +*******************************************************************************/ + .section .isr_vector,"a",%progbits + .type g_pfnVectors, %object + .size g_pfnVectors, .-g_pfnVectors + + +g_pfnVectors: + .word _estack + .word Reset_Handler + .word NMI_Handler + .word HardFault_Handler + .word MemManage_Handler + .word BusFault_Handler + .word UsageFault_Handler + .word 0 + .word 0 + .word 0 + .word 0 + .word SVC_Handler + .word DebugMon_Handler + .word 0 + .word PendSV_Handler + .word SysTick_Handler + .word WWDG_IRQHandler + .word PVD_IRQHandler + .word TAMPER_IRQHandler + .word RTC_IRQHandler + .word FLASH_IRQHandler + .word RCC_IRQHandler + .word EXTI0_IRQHandler + .word EXTI1_IRQHandler + .word EXTI2_IRQHandler + .word EXTI3_IRQHandler + .word EXTI4_IRQHandler + .word DMA1_Channel1_IRQHandler + .word DMA1_Channel2_IRQHandler + .word DMA1_Channel3_IRQHandler + .word DMA1_Channel4_IRQHandler + .word DMA1_Channel5_IRQHandler + .word DMA1_Channel6_IRQHandler + .word DMA1_Channel7_IRQHandler + .word ADC1_2_IRQHandler + .word USB_HP_CAN1_TX_IRQHandler + .word USB_LP_CAN1_RX0_IRQHandler + .word CAN1_RX1_IRQHandler + .word CAN1_SCE_IRQHandler + .word EXTI9_5_IRQHandler + .word TIM1_BRK_TIM9_IRQHandler + .word TIM1_UP_TIM10_IRQHandler + .word TIM1_TRG_COM_TIM11_IRQHandler + .word TIM1_CC_IRQHandler + .word TIM2_IRQHandler + .word TIM3_IRQHandler + .word TIM4_IRQHandler + .word I2C1_EV_IRQHandler + .word I2C1_ER_IRQHandler + .word I2C2_EV_IRQHandler + .word I2C2_ER_IRQHandler + .word SPI1_IRQHandler + .word SPI2_IRQHandler + .word USART1_IRQHandler + .word USART2_IRQHandler + .word USART3_IRQHandler + .word EXTI15_10_IRQHandler + .word RTCAlarm_IRQHandler + .word USBWakeUp_IRQHandler + .word TIM8_BRK_TIM12_IRQHandler + .word TIM8_UP_TIM13_IRQHandler + .word TIM8_TRG_COM_TIM14_IRQHandler + .word TIM8_CC_IRQHandler + .word ADC3_IRQHandler + .word FSMC_IRQHandler + .word SDIO_IRQHandler + .word TIM5_IRQHandler + .word SPI3_IRQHandler + .word UART4_IRQHandler + .word UART5_IRQHandler + .word TIM6_IRQHandler + .word TIM7_IRQHandler + .word DMA2_Channel1_IRQHandler + .word DMA2_Channel2_IRQHandler + .word DMA2_Channel3_IRQHandler + .word DMA2_Channel4_5_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word BootRAM /* @0x1E0. This is for boot in RAM mode for + STM32F10x XL-Density devices. */ +/******************************************************************************* +* +* Provide weak aliases for each Exception handler to the Default_Handler. +* As they are weak aliases, any function with the same name will override +* this definition. +* +*******************************************************************************/ + + .weak NMI_Handler + .thumb_set NMI_Handler,Default_Handler + + .weak HardFault_Handler + .thumb_set HardFault_Handler,Default_Handler + + .weak MemManage_Handler + .thumb_set MemManage_Handler,Default_Handler + + .weak BusFault_Handler + .thumb_set BusFault_Handler,Default_Handler + + .weak UsageFault_Handler + .thumb_set UsageFault_Handler,Default_Handler + + .weak SVC_Handler + .thumb_set SVC_Handler,Default_Handler + + .weak DebugMon_Handler + .thumb_set DebugMon_Handler,Default_Handler + + .weak PendSV_Handler + .thumb_set PendSV_Handler,Default_Handler + + .weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler + + .weak WWDG_IRQHandler + .thumb_set WWDG_IRQHandler,Default_Handler + + .weak PVD_IRQHandler + .thumb_set PVD_IRQHandler,Default_Handler + + .weak TAMPER_IRQHandler + .thumb_set TAMPER_IRQHandler,Default_Handler + + .weak RTC_IRQHandler + .thumb_set RTC_IRQHandler,Default_Handler + + .weak FLASH_IRQHandler + .thumb_set FLASH_IRQHandler,Default_Handler + + .weak RCC_IRQHandler + .thumb_set RCC_IRQHandler,Default_Handler + + .weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler + + .weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler + + .weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler + + .weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler + + .weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler + + .weak DMA1_Channel1_IRQHandler + .thumb_set DMA1_Channel1_IRQHandler,Default_Handler + + .weak DMA1_Channel2_IRQHandler + .thumb_set DMA1_Channel2_IRQHandler,Default_Handler + + .weak DMA1_Channel3_IRQHandler + .thumb_set DMA1_Channel3_IRQHandler,Default_Handler + + .weak DMA1_Channel4_IRQHandler + .thumb_set DMA1_Channel4_IRQHandler,Default_Handler + + .weak DMA1_Channel5_IRQHandler + .thumb_set DMA1_Channel5_IRQHandler,Default_Handler + + .weak DMA1_Channel6_IRQHandler + .thumb_set DMA1_Channel6_IRQHandler,Default_Handler + + .weak DMA1_Channel7_IRQHandler + .thumb_set DMA1_Channel7_IRQHandler,Default_Handler + + .weak ADC1_2_IRQHandler + .thumb_set ADC1_2_IRQHandler,Default_Handler + + .weak USB_HP_CAN1_TX_IRQHandler + .thumb_set USB_HP_CAN1_TX_IRQHandler,Default_Handler + + .weak USB_LP_CAN1_RX0_IRQHandler + .thumb_set USB_LP_CAN1_RX0_IRQHandler,Default_Handler + + .weak CAN1_RX1_IRQHandler + .thumb_set CAN1_RX1_IRQHandler,Default_Handler + + .weak CAN1_SCE_IRQHandler + .thumb_set CAN1_SCE_IRQHandler,Default_Handler + + .weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler + + .weak TIM1_BRK_TIM9_IRQHandler + .thumb_set TIM1_BRK_TIM9_IRQHandler,Default_Handler + + .weak TIM1_UP_TIM10_IRQHandler + .thumb_set TIM1_UP_TIM10_IRQHandler,Default_Handler + + .weak TIM1_TRG_COM_TIM11_IRQHandler + .thumb_set TIM1_TRG_COM_TIM11_IRQHandler,Default_Handler + + .weak TIM1_CC_IRQHandler + .thumb_set TIM1_CC_IRQHandler,Default_Handler + + .weak TIM2_IRQHandler + .thumb_set TIM2_IRQHandler,Default_Handler + + .weak TIM3_IRQHandler + .thumb_set TIM3_IRQHandler,Default_Handler + + .weak TIM4_IRQHandler + .thumb_set TIM4_IRQHandler,Default_Handler + + .weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler + + .weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler + + .weak I2C2_EV_IRQHandler + .thumb_set I2C2_EV_IRQHandler,Default_Handler + + .weak I2C2_ER_IRQHandler + .thumb_set I2C2_ER_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak SPI2_IRQHandler + .thumb_set SPI2_IRQHandler,Default_Handler + + .weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler + + .weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler + + .weak USART3_IRQHandler + .thumb_set USART3_IRQHandler,Default_Handler + + .weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler + + .weak RTCAlarm_IRQHandler + .thumb_set RTCAlarm_IRQHandler,Default_Handler + + .weak USBWakeUp_IRQHandler + .thumb_set USBWakeUp_IRQHandler,Default_Handler + + .weak TIM8_BRK_TIM12_IRQHandler + .thumb_set TIM8_BRK_TIM12_IRQHandler,Default_Handler + + .weak TIM8_UP_TIM13_IRQHandler + .thumb_set TIM8_UP_TIM13_IRQHandler,Default_Handler + + .weak TIM8_TRG_COM_TIM14_IRQHandler + .thumb_set TIM8_TRG_COM_TIM14_IRQHandler,Default_Handler + + .weak TIM8_CC_IRQHandler + .thumb_set TIM8_CC_IRQHandler,Default_Handler + + .weak ADC3_IRQHandler + .thumb_set ADC3_IRQHandler,Default_Handler + + .weak FSMC_IRQHandler + .thumb_set FSMC_IRQHandler,Default_Handler + + .weak SDIO_IRQHandler + .thumb_set SDIO_IRQHandler,Default_Handler + + .weak TIM5_IRQHandler + .thumb_set TIM5_IRQHandler,Default_Handler + + .weak SPI3_IRQHandler + .thumb_set SPI3_IRQHandler,Default_Handler + + .weak UART4_IRQHandler + .thumb_set UART4_IRQHandler,Default_Handler + + .weak UART5_IRQHandler + .thumb_set UART5_IRQHandler,Default_Handler + + .weak TIM6_IRQHandler + .thumb_set TIM6_IRQHandler,Default_Handler + + .weak TIM7_IRQHandler + .thumb_set TIM7_IRQHandler,Default_Handler + + .weak DMA2_Channel1_IRQHandler + .thumb_set DMA2_Channel1_IRQHandler,Default_Handler + + .weak DMA2_Channel2_IRQHandler + .thumb_set DMA2_Channel2_IRQHandler,Default_Handler + + .weak DMA2_Channel3_IRQHandler + .thumb_set DMA2_Channel3_IRQHandler,Default_Handler + + .weak DMA2_Channel4_5_IRQHandler + .thumb_set DMA2_Channel4_5_IRQHandler,Default_Handler + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_cl.s b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_cl.s new file mode 100644 index 0000000..8196e69 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_cl.s @@ -0,0 +1,368 @@ +;******************** (C) COPYRIGHT 2011 STMicroelectronics ******************** +;* File Name : startup_stm32f10x_cl.s +;* Author : MCD Application Team +;* Version : V3.5.0 +;* Date : 11-March-2011 +;* Description : STM32F10x Connectivity line devices vector table for MDK-ARM +;* toolchain. +;* This module performs: +;* - Set the initial SP +;* - Set the initial PC == Reset_Handler +;* - Set the vector table entries with the exceptions ISR address +;* - Configure the clock system +;* - Branches to __main in the C library (which eventually +;* calls main()). +;* After Reset the CortexM3 processor is in Thread mode, +;* priority is Privileged, and the Stack is set to Main. +;* <<< Use Configuration Wizard in Context Menu >>> +;******************************************************************************* +; THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS +; WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. +; AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, +; INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE +; CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING +; INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. +;******************************************************************************* + +; Amount of memory (in bytes) allocated for Stack +; Tailor this value to your application needs +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000200 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WWDG_IRQHandler ; Window Watchdog + DCD PVD_IRQHandler ; PVD through EXTI Line detect + DCD TAMPER_IRQHandler ; Tamper + DCD RTC_IRQHandler ; RTC + DCD FLASH_IRQHandler ; Flash + DCD RCC_IRQHandler ; RCC + DCD EXTI0_IRQHandler ; EXTI Line 0 + DCD EXTI1_IRQHandler ; EXTI Line 1 + DCD EXTI2_IRQHandler ; EXTI Line 2 + DCD EXTI3_IRQHandler ; EXTI Line 3 + DCD EXTI4_IRQHandler ; EXTI Line 4 + DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 + DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 + DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 + DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 + DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 + DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 + DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 + DCD ADC1_2_IRQHandler ; ADC1 and ADC2 + DCD CAN1_TX_IRQHandler ; CAN1 TX + DCD CAN1_RX0_IRQHandler ; CAN1 RX0 + DCD CAN1_RX1_IRQHandler ; CAN1 RX1 + DCD CAN1_SCE_IRQHandler ; CAN1 SCE + DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 + DCD TIM1_BRK_IRQHandler ; TIM1 Break + DCD TIM1_UP_IRQHandler ; TIM1 Update + DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation + DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare + DCD TIM2_IRQHandler ; TIM2 + DCD TIM3_IRQHandler ; TIM3 + DCD TIM4_IRQHandler ; TIM4 + DCD I2C1_EV_IRQHandler ; I2C1 Event + DCD I2C1_ER_IRQHandler ; I2C1 Error + DCD I2C2_EV_IRQHandler ; I2C2 Event + DCD I2C2_ER_IRQHandler ; I2C1 Error + DCD SPI1_IRQHandler ; SPI1 + DCD SPI2_IRQHandler ; SPI2 + DCD USART1_IRQHandler ; USART1 + DCD USART2_IRQHandler ; USART2 + DCD USART3_IRQHandler ; USART3 + DCD EXTI15_10_IRQHandler ; EXTI Line 15..10 + DCD RTCAlarm_IRQHandler ; RTC alarm through EXTI line + DCD OTG_FS_WKUP_IRQHandler ; USB OTG FS Wakeup through EXTI line + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD TIM5_IRQHandler ; TIM5 + DCD SPI3_IRQHandler ; SPI3 + DCD UART4_IRQHandler ; UART4 + DCD UART5_IRQHandler ; UART5 + DCD TIM6_IRQHandler ; TIM6 + DCD TIM7_IRQHandler ; TIM7 + DCD DMA2_Channel1_IRQHandler ; DMA2 Channel1 + DCD DMA2_Channel2_IRQHandler ; DMA2 Channel2 + DCD DMA2_Channel3_IRQHandler ; DMA2 Channel3 + DCD DMA2_Channel4_IRQHandler ; DMA2 Channel4 + DCD DMA2_Channel5_IRQHandler ; DMA2 Channel5 + DCD ETH_IRQHandler ; Ethernet + DCD ETH_WKUP_IRQHandler ; Ethernet Wakeup through EXTI line + DCD CAN2_TX_IRQHandler ; CAN2 TX + DCD CAN2_RX0_IRQHandler ; CAN2 RX0 + DCD CAN2_RX1_IRQHandler ; CAN2 RX1 + DCD CAN2_SCE_IRQHandler ; CAN2 SCE + DCD OTG_FS_IRQHandler ; USB OTG FS +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + +; Reset handler +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WWDG_IRQHandler [WEAK] + EXPORT PVD_IRQHandler [WEAK] + EXPORT TAMPER_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT FLASH_IRQHandler [WEAK] + EXPORT RCC_IRQHandler [WEAK] + EXPORT EXTI0_IRQHandler [WEAK] + EXPORT EXTI1_IRQHandler [WEAK] + EXPORT EXTI2_IRQHandler [WEAK] + EXPORT EXTI3_IRQHandler [WEAK] + EXPORT EXTI4_IRQHandler [WEAK] + EXPORT DMA1_Channel1_IRQHandler [WEAK] + EXPORT DMA1_Channel2_IRQHandler [WEAK] + EXPORT DMA1_Channel3_IRQHandler [WEAK] + EXPORT DMA1_Channel4_IRQHandler [WEAK] + EXPORT DMA1_Channel5_IRQHandler [WEAK] + EXPORT DMA1_Channel6_IRQHandler [WEAK] + EXPORT DMA1_Channel7_IRQHandler [WEAK] + EXPORT ADC1_2_IRQHandler [WEAK] + EXPORT CAN1_TX_IRQHandler [WEAK] + EXPORT CAN1_RX0_IRQHandler [WEAK] + EXPORT CAN1_RX1_IRQHandler [WEAK] + EXPORT CAN1_SCE_IRQHandler [WEAK] + EXPORT EXTI9_5_IRQHandler [WEAK] + EXPORT TIM1_BRK_IRQHandler [WEAK] + EXPORT TIM1_UP_IRQHandler [WEAK] + EXPORT TIM1_TRG_COM_IRQHandler [WEAK] + EXPORT TIM1_CC_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT TIM3_IRQHandler [WEAK] + EXPORT TIM4_IRQHandler [WEAK] + EXPORT I2C1_EV_IRQHandler [WEAK] + EXPORT I2C1_ER_IRQHandler [WEAK] + EXPORT I2C2_EV_IRQHandler [WEAK] + EXPORT I2C2_ER_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT SPI2_IRQHandler [WEAK] + EXPORT USART1_IRQHandler [WEAK] + EXPORT USART2_IRQHandler [WEAK] + EXPORT USART3_IRQHandler [WEAK] + EXPORT EXTI15_10_IRQHandler [WEAK] + EXPORT RTCAlarm_IRQHandler [WEAK] + EXPORT OTG_FS_WKUP_IRQHandler [WEAK] + EXPORT TIM5_IRQHandler [WEAK] + EXPORT SPI3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT UART5_IRQHandler [WEAK] + EXPORT TIM6_IRQHandler [WEAK] + EXPORT TIM7_IRQHandler [WEAK] + EXPORT DMA2_Channel1_IRQHandler [WEAK] + EXPORT DMA2_Channel2_IRQHandler [WEAK] + EXPORT DMA2_Channel3_IRQHandler [WEAK] + EXPORT DMA2_Channel4_IRQHandler [WEAK] + EXPORT DMA2_Channel5_IRQHandler [WEAK] + EXPORT ETH_IRQHandler [WEAK] + EXPORT ETH_WKUP_IRQHandler [WEAK] + EXPORT CAN2_TX_IRQHandler [WEAK] + EXPORT CAN2_RX0_IRQHandler [WEAK] + EXPORT CAN2_RX1_IRQHandler [WEAK] + EXPORT CAN2_SCE_IRQHandler [WEAK] + EXPORT OTG_FS_IRQHandler [WEAK] + +WWDG_IRQHandler +PVD_IRQHandler +TAMPER_IRQHandler +RTC_IRQHandler +FLASH_IRQHandler +RCC_IRQHandler +EXTI0_IRQHandler +EXTI1_IRQHandler +EXTI2_IRQHandler +EXTI3_IRQHandler +EXTI4_IRQHandler +DMA1_Channel1_IRQHandler +DMA1_Channel2_IRQHandler +DMA1_Channel3_IRQHandler +DMA1_Channel4_IRQHandler +DMA1_Channel5_IRQHandler +DMA1_Channel6_IRQHandler +DMA1_Channel7_IRQHandler +ADC1_2_IRQHandler +CAN1_TX_IRQHandler +CAN1_RX0_IRQHandler +CAN1_RX1_IRQHandler +CAN1_SCE_IRQHandler +EXTI9_5_IRQHandler +TIM1_BRK_IRQHandler +TIM1_UP_IRQHandler +TIM1_TRG_COM_IRQHandler +TIM1_CC_IRQHandler +TIM2_IRQHandler +TIM3_IRQHandler +TIM4_IRQHandler +I2C1_EV_IRQHandler +I2C1_ER_IRQHandler +I2C2_EV_IRQHandler +I2C2_ER_IRQHandler +SPI1_IRQHandler +SPI2_IRQHandler +USART1_IRQHandler +USART2_IRQHandler +USART3_IRQHandler +EXTI15_10_IRQHandler +RTCAlarm_IRQHandler +OTG_FS_WKUP_IRQHandler +TIM5_IRQHandler +SPI3_IRQHandler +UART4_IRQHandler +UART5_IRQHandler +TIM6_IRQHandler +TIM7_IRQHandler +DMA2_Channel1_IRQHandler +DMA2_Channel2_IRQHandler +DMA2_Channel3_IRQHandler +DMA2_Channel4_IRQHandler +DMA2_Channel5_IRQHandler +ETH_IRQHandler +ETH_WKUP_IRQHandler +CAN2_TX_IRQHandler +CAN2_RX0_IRQHandler +CAN2_RX1_IRQHandler +CAN2_SCE_IRQHandler +OTG_FS_IRQHandler + + B . + + ENDP + + ALIGN + +;******************************************************************************* +; User Stack and Heap initialization +;******************************************************************************* + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap + + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + + ALIGN + + ENDIF + + END + +;******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE***** diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_hd.s b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_hd.s new file mode 100644 index 0000000..adc9b94 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_hd.s @@ -0,0 +1,358 @@ +;******************** (C) COPYRIGHT 2011 STMicroelectronics ******************** +;* File Name : startup_stm32f10x_hd.s +;* Author : MCD Application Team +;* Version : V3.5.0 +;* Date : 11-March-2011 +;* Description : STM32F10x High Density Devices vector table for MDK-ARM +;* toolchain. +;* This module performs: +;* - Set the initial SP +;* - Set the initial PC == Reset_Handler +;* - Set the vector table entries with the exceptions ISR address +;* - Configure the clock system and also configure the external +;* SRAM mounted on STM3210E-EVAL board to be used as data +;* memory (optional, to be enabled by user) +;* - Branches to __main in the C library (which eventually +;* calls main()). +;* After Reset the CortexM3 processor is in Thread mode, +;* priority is Privileged, and the Stack is set to Main. +;* <<< Use Configuration Wizard in Context Menu >>> +;******************************************************************************* +; THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS +; WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. +; AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, +; INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE +; CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING +; INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. +;******************************************************************************* + +; Amount of memory (in bytes) allocated for Stack +; Tailor this value to your application needs +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000200 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WWDG_IRQHandler ; Window Watchdog + DCD PVD_IRQHandler ; PVD through EXTI Line detect + DCD TAMPER_IRQHandler ; Tamper + DCD RTC_IRQHandler ; RTC + DCD FLASH_IRQHandler ; Flash + DCD RCC_IRQHandler ; RCC + DCD EXTI0_IRQHandler ; EXTI Line 0 + DCD EXTI1_IRQHandler ; EXTI Line 1 + DCD EXTI2_IRQHandler ; EXTI Line 2 + DCD EXTI3_IRQHandler ; EXTI Line 3 + DCD EXTI4_IRQHandler ; EXTI Line 4 + DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 + DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 + DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 + DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 + DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 + DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 + DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 + DCD ADC1_2_IRQHandler ; ADC1 & ADC2 + DCD USB_HP_CAN1_TX_IRQHandler ; USB High Priority or CAN1 TX + DCD USB_LP_CAN1_RX0_IRQHandler ; USB Low Priority or CAN1 RX0 + DCD CAN1_RX1_IRQHandler ; CAN1 RX1 + DCD CAN1_SCE_IRQHandler ; CAN1 SCE + DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 + DCD TIM1_BRK_IRQHandler ; TIM1 Break + DCD TIM1_UP_IRQHandler ; TIM1 Update + DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation + DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare + DCD TIM2_IRQHandler ; TIM2 + DCD TIM3_IRQHandler ; TIM3 + DCD TIM4_IRQHandler ; TIM4 + DCD I2C1_EV_IRQHandler ; I2C1 Event + DCD I2C1_ER_IRQHandler ; I2C1 Error + DCD I2C2_EV_IRQHandler ; I2C2 Event + DCD I2C2_ER_IRQHandler ; I2C2 Error + DCD SPI1_IRQHandler ; SPI1 + DCD SPI2_IRQHandler ; SPI2 + DCD USART1_IRQHandler ; USART1 + DCD USART2_IRQHandler ; USART2 + DCD USART3_IRQHandler ; USART3 + DCD EXTI15_10_IRQHandler ; EXTI Line 15..10 + DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line + DCD USBWakeUp_IRQHandler ; USB Wakeup from suspend + DCD TIM8_BRK_IRQHandler ; TIM8 Break + DCD TIM8_UP_IRQHandler ; TIM8 Update + DCD TIM8_TRG_COM_IRQHandler ; TIM8 Trigger and Commutation + DCD TIM8_CC_IRQHandler ; TIM8 Capture Compare + DCD ADC3_IRQHandler ; ADC3 + DCD FSMC_IRQHandler ; FSMC + DCD SDIO_IRQHandler ; SDIO + DCD TIM5_IRQHandler ; TIM5 + DCD SPI3_IRQHandler ; SPI3 + DCD UART4_IRQHandler ; UART4 + DCD UART5_IRQHandler ; UART5 + DCD TIM6_IRQHandler ; TIM6 + DCD TIM7_IRQHandler ; TIM7 + DCD DMA2_Channel1_IRQHandler ; DMA2 Channel1 + DCD DMA2_Channel2_IRQHandler ; DMA2 Channel2 + DCD DMA2_Channel3_IRQHandler ; DMA2 Channel3 + DCD DMA2_Channel4_5_IRQHandler ; DMA2 Channel4 & Channel5 +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + +; Reset handler +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT __main + IMPORT SystemInit + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WWDG_IRQHandler [WEAK] + EXPORT PVD_IRQHandler [WEAK] + EXPORT TAMPER_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT FLASH_IRQHandler [WEAK] + EXPORT RCC_IRQHandler [WEAK] + EXPORT EXTI0_IRQHandler [WEAK] + EXPORT EXTI1_IRQHandler [WEAK] + EXPORT EXTI2_IRQHandler [WEAK] + EXPORT EXTI3_IRQHandler [WEAK] + EXPORT EXTI4_IRQHandler [WEAK] + EXPORT DMA1_Channel1_IRQHandler [WEAK] + EXPORT DMA1_Channel2_IRQHandler [WEAK] + EXPORT DMA1_Channel3_IRQHandler [WEAK] + EXPORT DMA1_Channel4_IRQHandler [WEAK] + EXPORT DMA1_Channel5_IRQHandler [WEAK] + EXPORT DMA1_Channel6_IRQHandler [WEAK] + EXPORT DMA1_Channel7_IRQHandler [WEAK] + EXPORT ADC1_2_IRQHandler [WEAK] + EXPORT USB_HP_CAN1_TX_IRQHandler [WEAK] + EXPORT USB_LP_CAN1_RX0_IRQHandler [WEAK] + EXPORT CAN1_RX1_IRQHandler [WEAK] + EXPORT CAN1_SCE_IRQHandler [WEAK] + EXPORT EXTI9_5_IRQHandler [WEAK] + EXPORT TIM1_BRK_IRQHandler [WEAK] + EXPORT TIM1_UP_IRQHandler [WEAK] + EXPORT TIM1_TRG_COM_IRQHandler [WEAK] + EXPORT TIM1_CC_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT TIM3_IRQHandler [WEAK] + EXPORT TIM4_IRQHandler [WEAK] + EXPORT I2C1_EV_IRQHandler [WEAK] + EXPORT I2C1_ER_IRQHandler [WEAK] + EXPORT I2C2_EV_IRQHandler [WEAK] + EXPORT I2C2_ER_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT SPI2_IRQHandler [WEAK] + EXPORT USART1_IRQHandler [WEAK] + EXPORT USART2_IRQHandler [WEAK] + EXPORT USART3_IRQHandler [WEAK] + EXPORT EXTI15_10_IRQHandler [WEAK] + EXPORT RTCAlarm_IRQHandler [WEAK] + EXPORT USBWakeUp_IRQHandler [WEAK] + EXPORT TIM8_BRK_IRQHandler [WEAK] + EXPORT TIM8_UP_IRQHandler [WEAK] + EXPORT TIM8_TRG_COM_IRQHandler [WEAK] + EXPORT TIM8_CC_IRQHandler [WEAK] + EXPORT ADC3_IRQHandler [WEAK] + EXPORT FSMC_IRQHandler [WEAK] + EXPORT SDIO_IRQHandler [WEAK] + EXPORT TIM5_IRQHandler [WEAK] + EXPORT SPI3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT UART5_IRQHandler [WEAK] + EXPORT TIM6_IRQHandler [WEAK] + EXPORT TIM7_IRQHandler [WEAK] + EXPORT DMA2_Channel1_IRQHandler [WEAK] + EXPORT DMA2_Channel2_IRQHandler [WEAK] + EXPORT DMA2_Channel3_IRQHandler [WEAK] + EXPORT DMA2_Channel4_5_IRQHandler [WEAK] + +WWDG_IRQHandler +PVD_IRQHandler +TAMPER_IRQHandler +RTC_IRQHandler +FLASH_IRQHandler +RCC_IRQHandler +EXTI0_IRQHandler +EXTI1_IRQHandler +EXTI2_IRQHandler +EXTI3_IRQHandler +EXTI4_IRQHandler +DMA1_Channel1_IRQHandler +DMA1_Channel2_IRQHandler +DMA1_Channel3_IRQHandler +DMA1_Channel4_IRQHandler +DMA1_Channel5_IRQHandler +DMA1_Channel6_IRQHandler +DMA1_Channel7_IRQHandler +ADC1_2_IRQHandler +USB_HP_CAN1_TX_IRQHandler +USB_LP_CAN1_RX0_IRQHandler +CAN1_RX1_IRQHandler +CAN1_SCE_IRQHandler +EXTI9_5_IRQHandler +TIM1_BRK_IRQHandler +TIM1_UP_IRQHandler +TIM1_TRG_COM_IRQHandler +TIM1_CC_IRQHandler +TIM2_IRQHandler +TIM3_IRQHandler +TIM4_IRQHandler +I2C1_EV_IRQHandler +I2C1_ER_IRQHandler +I2C2_EV_IRQHandler +I2C2_ER_IRQHandler +SPI1_IRQHandler +SPI2_IRQHandler +USART1_IRQHandler +USART2_IRQHandler +USART3_IRQHandler +EXTI15_10_IRQHandler +RTCAlarm_IRQHandler +USBWakeUp_IRQHandler +TIM8_BRK_IRQHandler +TIM8_UP_IRQHandler +TIM8_TRG_COM_IRQHandler +TIM8_CC_IRQHandler +ADC3_IRQHandler +FSMC_IRQHandler +SDIO_IRQHandler +TIM5_IRQHandler +SPI3_IRQHandler +UART4_IRQHandler +UART5_IRQHandler +TIM6_IRQHandler +TIM7_IRQHandler +DMA2_Channel1_IRQHandler +DMA2_Channel2_IRQHandler +DMA2_Channel3_IRQHandler +DMA2_Channel4_5_IRQHandler + B . + + ENDP + + ALIGN + +;******************************************************************************* +; User Stack and Heap initialization +;******************************************************************************* + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap + + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + + ALIGN + + ENDIF + + END + +;******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE***** diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_hd_vl.s b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_hd_vl.s new file mode 100644 index 0000000..d6082b0 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_hd_vl.s @@ -0,0 +1,346 @@ +;******************** (C) COPYRIGHT 2011 STMicroelectronics ******************** +;* File Name : startup_stm32f10x_hd_vl.s +;* Author : MCD Application Team +;* Version : V3.5.0 +;* Date : 11-March-2011 +;* Description : STM32F10x High Density Value Line Devices vector table +;* for MDK-ARM toolchain. +;* This module performs: +;* - Set the initial SP +;* - Set the initial PC == Reset_Handler +;* - Set the vector table entries with the exceptions ISR address +;* - Configure the clock system and also configure the external +;* SRAM mounted on STM32100E-EVAL board to be used as data +;* memory (optional, to be enabled by user) +;* - Branches to __main in the C library (which eventually +;* calls main()). +;* After Reset the CortexM3 processor is in Thread mode, +;* priority is Privileged, and the Stack is set to Main. +;* <<< Use Configuration Wizard in Context Menu >>> +;******************************************************************************* +; THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS +; WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. +; AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, +; INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE +; CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING +; INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. +;******************************************************************************* + +; Amount of memory (in bytes) allocated for Stack +; Tailor this value to your application needs +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000200 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WWDG_IRQHandler ; Window Watchdog + DCD PVD_IRQHandler ; PVD through EXTI Line detect + DCD TAMPER_IRQHandler ; Tamper + DCD RTC_IRQHandler ; RTC + DCD FLASH_IRQHandler ; Flash + DCD RCC_IRQHandler ; RCC + DCD EXTI0_IRQHandler ; EXTI Line 0 + DCD EXTI1_IRQHandler ; EXTI Line 1 + DCD EXTI2_IRQHandler ; EXTI Line 2 + DCD EXTI3_IRQHandler ; EXTI Line 3 + DCD EXTI4_IRQHandler ; EXTI Line 4 + DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 + DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 + DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 + DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 + DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 + DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 + DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 + DCD ADC1_IRQHandler ; ADC1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 + DCD TIM1_BRK_TIM15_IRQHandler ; TIM1 Break and TIM15 + DCD TIM1_UP_TIM16_IRQHandler ; TIM1 Update and TIM16 + DCD TIM1_TRG_COM_TIM17_IRQHandler ; TIM1 Trigger and Commutation and TIM17 + DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare + DCD TIM2_IRQHandler ; TIM2 + DCD TIM3_IRQHandler ; TIM3 + DCD TIM4_IRQHandler ; TIM4 + DCD I2C1_EV_IRQHandler ; I2C1 Event + DCD I2C1_ER_IRQHandler ; I2C1 Error + DCD I2C2_EV_IRQHandler ; I2C2 Event + DCD I2C2_ER_IRQHandler ; I2C2 Error + DCD SPI1_IRQHandler ; SPI1 + DCD SPI2_IRQHandler ; SPI2 + DCD USART1_IRQHandler ; USART1 + DCD USART2_IRQHandler ; USART2 + DCD USART3_IRQHandler ; USART3 + DCD EXTI15_10_IRQHandler ; EXTI Line 15..10 + DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line + DCD CEC_IRQHandler ; HDMI-CEC + DCD TIM12_IRQHandler ; TIM12 + DCD TIM13_IRQHandler ; TIM13 + DCD TIM14_IRQHandler ; TIM14 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD TIM5_IRQHandler ; TIM5 + DCD SPI3_IRQHandler ; SPI3 + DCD UART4_IRQHandler ; UART4 + DCD UART5_IRQHandler ; UART5 + DCD TIM6_DAC_IRQHandler ; TIM6 and DAC underrun + DCD TIM7_IRQHandler ; TIM7 + DCD DMA2_Channel1_IRQHandler ; DMA2 Channel1 + DCD DMA2_Channel2_IRQHandler ; DMA2 Channel2 + DCD DMA2_Channel3_IRQHandler ; DMA2 Channel3 + DCD DMA2_Channel4_5_IRQHandler ; DMA2 Channel4 & Channel5 + DCD DMA2_Channel5_IRQHandler ; DMA2 Channel5 +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + +; Reset handler +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT __main + IMPORT SystemInit + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WWDG_IRQHandler [WEAK] + EXPORT PVD_IRQHandler [WEAK] + EXPORT TAMPER_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT FLASH_IRQHandler [WEAK] + EXPORT RCC_IRQHandler [WEAK] + EXPORT EXTI0_IRQHandler [WEAK] + EXPORT EXTI1_IRQHandler [WEAK] + EXPORT EXTI2_IRQHandler [WEAK] + EXPORT EXTI3_IRQHandler [WEAK] + EXPORT EXTI4_IRQHandler [WEAK] + EXPORT DMA1_Channel1_IRQHandler [WEAK] + EXPORT DMA1_Channel2_IRQHandler [WEAK] + EXPORT DMA1_Channel3_IRQHandler [WEAK] + EXPORT DMA1_Channel4_IRQHandler [WEAK] + EXPORT DMA1_Channel5_IRQHandler [WEAK] + EXPORT DMA1_Channel6_IRQHandler [WEAK] + EXPORT DMA1_Channel7_IRQHandler [WEAK] + EXPORT ADC1_IRQHandler [WEAK] + EXPORT EXTI9_5_IRQHandler [WEAK] + EXPORT TIM1_BRK_TIM15_IRQHandler [WEAK] + EXPORT TIM1_UP_TIM16_IRQHandler [WEAK] + EXPORT TIM1_TRG_COM_TIM17_IRQHandler [WEAK] + EXPORT TIM1_CC_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT TIM3_IRQHandler [WEAK] + EXPORT TIM4_IRQHandler [WEAK] + EXPORT I2C1_EV_IRQHandler [WEAK] + EXPORT I2C1_ER_IRQHandler [WEAK] + EXPORT I2C2_EV_IRQHandler [WEAK] + EXPORT I2C2_ER_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT SPI2_IRQHandler [WEAK] + EXPORT USART1_IRQHandler [WEAK] + EXPORT USART2_IRQHandler [WEAK] + EXPORT USART3_IRQHandler [WEAK] + EXPORT EXTI15_10_IRQHandler [WEAK] + EXPORT RTCAlarm_IRQHandler [WEAK] + EXPORT CEC_IRQHandler [WEAK] + EXPORT TIM12_IRQHandler [WEAK] + EXPORT TIM13_IRQHandler [WEAK] + EXPORT TIM14_IRQHandler [WEAK] + EXPORT TIM5_IRQHandler [WEAK] + EXPORT SPI3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT UART5_IRQHandler [WEAK] + EXPORT TIM6_DAC_IRQHandler [WEAK] + EXPORT TIM7_IRQHandler [WEAK] + EXPORT DMA2_Channel1_IRQHandler [WEAK] + EXPORT DMA2_Channel2_IRQHandler [WEAK] + EXPORT DMA2_Channel3_IRQHandler [WEAK] + EXPORT DMA2_Channel4_5_IRQHandler [WEAK] + EXPORT DMA2_Channel5_IRQHandler [WEAK] + +WWDG_IRQHandler +PVD_IRQHandler +TAMPER_IRQHandler +RTC_IRQHandler +FLASH_IRQHandler +RCC_IRQHandler +EXTI0_IRQHandler +EXTI1_IRQHandler +EXTI2_IRQHandler +EXTI3_IRQHandler +EXTI4_IRQHandler +DMA1_Channel1_IRQHandler +DMA1_Channel2_IRQHandler +DMA1_Channel3_IRQHandler +DMA1_Channel4_IRQHandler +DMA1_Channel5_IRQHandler +DMA1_Channel6_IRQHandler +DMA1_Channel7_IRQHandler +ADC1_IRQHandler +EXTI9_5_IRQHandler +TIM1_BRK_TIM15_IRQHandler +TIM1_UP_TIM16_IRQHandler +TIM1_TRG_COM_TIM17_IRQHandler +TIM1_CC_IRQHandler +TIM2_IRQHandler +TIM3_IRQHandler +TIM4_IRQHandler +I2C1_EV_IRQHandler +I2C1_ER_IRQHandler +I2C2_EV_IRQHandler +I2C2_ER_IRQHandler +SPI1_IRQHandler +SPI2_IRQHandler +USART1_IRQHandler +USART2_IRQHandler +USART3_IRQHandler +EXTI15_10_IRQHandler +RTCAlarm_IRQHandler +CEC_IRQHandler +TIM12_IRQHandler +TIM13_IRQHandler +TIM14_IRQHandler +TIM5_IRQHandler +SPI3_IRQHandler +UART4_IRQHandler +UART5_IRQHandler +TIM6_DAC_IRQHandler +TIM7_IRQHandler +DMA2_Channel1_IRQHandler +DMA2_Channel2_IRQHandler +DMA2_Channel3_IRQHandler +DMA2_Channel4_5_IRQHandler +DMA2_Channel5_IRQHandler + B . + + ENDP + + ALIGN + +;******************************************************************************* +; User Stack and Heap initialization +;******************************************************************************* + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap + + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + + ALIGN + + ENDIF + + END + +;******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE***** diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_ld.s b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_ld.s new file mode 100644 index 0000000..3f3ac2f --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_ld.s @@ -0,0 +1,297 @@ +;******************** (C) COPYRIGHT 2011 STMicroelectronics ******************** +;* File Name : startup_stm32f10x_ld.s +;* Author : MCD Application Team +;* Version : V3.5.0 +;* Date : 11-March-2011 +;* Description : STM32F10x Low Density Devices vector table for MDK-ARM +;* toolchain. +;* This module performs: +;* - Set the initial SP +;* - Set the initial PC == Reset_Handler +;* - Set the vector table entries with the exceptions ISR address +;* - Configure the clock system +;* - Branches to __main in the C library (which eventually +;* calls main()). +;* After Reset the CortexM3 processor is in Thread mode, +;* priority is Privileged, and the Stack is set to Main. +;* <<< Use Configuration Wizard in Context Menu >>> +;******************************************************************************* +; THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS +; WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. +; AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, +; INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE +; CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING +; INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. +;******************************************************************************* + +; Amount of memory (in bytes) allocated for Stack +; Tailor this value to your application needs +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000200 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WWDG_IRQHandler ; Window Watchdog + DCD PVD_IRQHandler ; PVD through EXTI Line detect + DCD TAMPER_IRQHandler ; Tamper + DCD RTC_IRQHandler ; RTC + DCD FLASH_IRQHandler ; Flash + DCD RCC_IRQHandler ; RCC + DCD EXTI0_IRQHandler ; EXTI Line 0 + DCD EXTI1_IRQHandler ; EXTI Line 1 + DCD EXTI2_IRQHandler ; EXTI Line 2 + DCD EXTI3_IRQHandler ; EXTI Line 3 + DCD EXTI4_IRQHandler ; EXTI Line 4 + DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 + DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 + DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 + DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 + DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 + DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 + DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 + DCD ADC1_2_IRQHandler ; ADC1_2 + DCD USB_HP_CAN1_TX_IRQHandler ; USB High Priority or CAN1 TX + DCD USB_LP_CAN1_RX0_IRQHandler ; USB Low Priority or CAN1 RX0 + DCD CAN1_RX1_IRQHandler ; CAN1 RX1 + DCD CAN1_SCE_IRQHandler ; CAN1 SCE + DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 + DCD TIM1_BRK_IRQHandler ; TIM1 Break + DCD TIM1_UP_IRQHandler ; TIM1 Update + DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation + DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare + DCD TIM2_IRQHandler ; TIM2 + DCD TIM3_IRQHandler ; TIM3 + DCD 0 ; Reserved + DCD I2C1_EV_IRQHandler ; I2C1 Event + DCD I2C1_ER_IRQHandler ; I2C1 Error + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SPI1_IRQHandler ; SPI1 + DCD 0 ; Reserved + DCD USART1_IRQHandler ; USART1 + DCD USART2_IRQHandler ; USART2 + DCD 0 ; Reserved + DCD EXTI15_10_IRQHandler ; EXTI Line 15..10 + DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line + DCD USBWakeUp_IRQHandler ; USB Wakeup from suspend +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + +; Reset handler routine +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT __main + IMPORT SystemInit + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WWDG_IRQHandler [WEAK] + EXPORT PVD_IRQHandler [WEAK] + EXPORT TAMPER_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT FLASH_IRQHandler [WEAK] + EXPORT RCC_IRQHandler [WEAK] + EXPORT EXTI0_IRQHandler [WEAK] + EXPORT EXTI1_IRQHandler [WEAK] + EXPORT EXTI2_IRQHandler [WEAK] + EXPORT EXTI3_IRQHandler [WEAK] + EXPORT EXTI4_IRQHandler [WEAK] + EXPORT DMA1_Channel1_IRQHandler [WEAK] + EXPORT DMA1_Channel2_IRQHandler [WEAK] + EXPORT DMA1_Channel3_IRQHandler [WEAK] + EXPORT DMA1_Channel4_IRQHandler [WEAK] + EXPORT DMA1_Channel5_IRQHandler [WEAK] + EXPORT DMA1_Channel6_IRQHandler [WEAK] + EXPORT DMA1_Channel7_IRQHandler [WEAK] + EXPORT ADC1_2_IRQHandler [WEAK] + EXPORT USB_HP_CAN1_TX_IRQHandler [WEAK] + EXPORT USB_LP_CAN1_RX0_IRQHandler [WEAK] + EXPORT CAN1_RX1_IRQHandler [WEAK] + EXPORT CAN1_SCE_IRQHandler [WEAK] + EXPORT EXTI9_5_IRQHandler [WEAK] + EXPORT TIM1_BRK_IRQHandler [WEAK] + EXPORT TIM1_UP_IRQHandler [WEAK] + EXPORT TIM1_TRG_COM_IRQHandler [WEAK] + EXPORT TIM1_CC_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT TIM3_IRQHandler [WEAK] + EXPORT I2C1_EV_IRQHandler [WEAK] + EXPORT I2C1_ER_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT USART1_IRQHandler [WEAK] + EXPORT USART2_IRQHandler [WEAK] + EXPORT EXTI15_10_IRQHandler [WEAK] + EXPORT RTCAlarm_IRQHandler [WEAK] + EXPORT USBWakeUp_IRQHandler [WEAK] + +WWDG_IRQHandler +PVD_IRQHandler +TAMPER_IRQHandler +RTC_IRQHandler +FLASH_IRQHandler +RCC_IRQHandler +EXTI0_IRQHandler +EXTI1_IRQHandler +EXTI2_IRQHandler +EXTI3_IRQHandler +EXTI4_IRQHandler +DMA1_Channel1_IRQHandler +DMA1_Channel2_IRQHandler +DMA1_Channel3_IRQHandler +DMA1_Channel4_IRQHandler +DMA1_Channel5_IRQHandler +DMA1_Channel6_IRQHandler +DMA1_Channel7_IRQHandler +ADC1_2_IRQHandler +USB_HP_CAN1_TX_IRQHandler +USB_LP_CAN1_RX0_IRQHandler +CAN1_RX1_IRQHandler +CAN1_SCE_IRQHandler +EXTI9_5_IRQHandler +TIM1_BRK_IRQHandler +TIM1_UP_IRQHandler +TIM1_TRG_COM_IRQHandler +TIM1_CC_IRQHandler +TIM2_IRQHandler +TIM3_IRQHandler +I2C1_EV_IRQHandler +I2C1_ER_IRQHandler +SPI1_IRQHandler +USART1_IRQHandler +USART2_IRQHandler +EXTI15_10_IRQHandler +RTCAlarm_IRQHandler +USBWakeUp_IRQHandler + + B . + + ENDP + + ALIGN + +;******************************************************************************* +; User Stack and Heap initialization +;******************************************************************************* + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap + + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + + ALIGN + + ENDIF + + END + +;******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE***** diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_ld_vl.s b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_ld_vl.s new file mode 100644 index 0000000..fe22fc0 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_ld_vl.s @@ -0,0 +1,304 @@ +;******************** (C) COPYRIGHT 2011 STMicroelectronics ******************** +;* File Name : startup_stm32f10x_ld_vl.s +;* Author : MCD Application Team +;* Version : V3.5.0 +;* Date : 11-March-2011 +;* Description : STM32F10x Low Density Value Line Devices vector table +;* for MDK-ARM toolchain. +;* This module performs: +;* - Set the initial SP +;* - Set the initial PC == Reset_Handler +;* - Set the vector table entries with the exceptions ISR address +;* - Configure the clock system +;* - Branches to __main in the C library (which eventually +;* calls main()). +;* After Reset the CortexM3 processor is in Thread mode, +;* priority is Privileged, and the Stack is set to Main. +;* <<< Use Configuration Wizard in Context Menu >>> +;******************************************************************************* +; THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS +; WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. +; AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, +; INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE +; CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING +; INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. +;******************************************************************************* + +; Amount of memory (in bytes) allocated for Stack +; Tailor this value to your application needs +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000200 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WWDG_IRQHandler ; Window Watchdog + DCD PVD_IRQHandler ; PVD through EXTI Line detect + DCD TAMPER_IRQHandler ; Tamper + DCD RTC_IRQHandler ; RTC + DCD FLASH_IRQHandler ; Flash + DCD RCC_IRQHandler ; RCC + DCD EXTI0_IRQHandler ; EXTI Line 0 + DCD EXTI1_IRQHandler ; EXTI Line 1 + DCD EXTI2_IRQHandler ; EXTI Line 2 + DCD EXTI3_IRQHandler ; EXTI Line 3 + DCD EXTI4_IRQHandler ; EXTI Line 4 + DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 + DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 + DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 + DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 + DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 + DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 + DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 + DCD ADC1_IRQHandler ; ADC1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 + DCD TIM1_BRK_TIM15_IRQHandler ; TIM1 Break and TIM15 + DCD TIM1_UP_TIM16_IRQHandler ; TIM1 Update and TIM16 + DCD TIM1_TRG_COM_TIM17_IRQHandler ; TIM1 Trigger and Commutation and TIM17 + DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare + DCD TIM2_IRQHandler ; TIM2 + DCD TIM3_IRQHandler ; TIM3 + DCD 0 ; Reserved + DCD I2C1_EV_IRQHandler ; I2C1 Event + DCD I2C1_ER_IRQHandler ; I2C1 Error + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SPI1_IRQHandler ; SPI1 + DCD 0 ; Reserved + DCD USART1_IRQHandler ; USART1 + DCD USART2_IRQHandler ; USART2 + DCD 0 ; Reserved + DCD EXTI15_10_IRQHandler ; EXTI Line 15..10 + DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line + DCD CEC_IRQHandler ; HDMI-CEC + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD TIM6_DAC_IRQHandler ; TIM6 and DAC underrun + DCD TIM7_IRQHandler ; TIM7 +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + +; Reset handler +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT __main + IMPORT SystemInit + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WWDG_IRQHandler [WEAK] + EXPORT PVD_IRQHandler [WEAK] + EXPORT TAMPER_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT FLASH_IRQHandler [WEAK] + EXPORT RCC_IRQHandler [WEAK] + EXPORT EXTI0_IRQHandler [WEAK] + EXPORT EXTI1_IRQHandler [WEAK] + EXPORT EXTI2_IRQHandler [WEAK] + EXPORT EXTI3_IRQHandler [WEAK] + EXPORT EXTI4_IRQHandler [WEAK] + EXPORT DMA1_Channel1_IRQHandler [WEAK] + EXPORT DMA1_Channel2_IRQHandler [WEAK] + EXPORT DMA1_Channel3_IRQHandler [WEAK] + EXPORT DMA1_Channel4_IRQHandler [WEAK] + EXPORT DMA1_Channel5_IRQHandler [WEAK] + EXPORT DMA1_Channel6_IRQHandler [WEAK] + EXPORT DMA1_Channel7_IRQHandler [WEAK] + EXPORT ADC1_IRQHandler [WEAK] + EXPORT EXTI9_5_IRQHandler [WEAK] + EXPORT TIM1_BRK_TIM15_IRQHandler [WEAK] + EXPORT TIM1_UP_TIM16_IRQHandler [WEAK] + EXPORT TIM1_TRG_COM_TIM17_IRQHandler [WEAK] + EXPORT TIM1_CC_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT TIM3_IRQHandler [WEAK] + EXPORT I2C1_EV_IRQHandler [WEAK] + EXPORT I2C1_ER_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT USART1_IRQHandler [WEAK] + EXPORT USART2_IRQHandler [WEAK] + EXPORT EXTI15_10_IRQHandler [WEAK] + EXPORT RTCAlarm_IRQHandler [WEAK] + EXPORT CEC_IRQHandler [WEAK] + EXPORT TIM6_DAC_IRQHandler [WEAK] + EXPORT TIM7_IRQHandler [WEAK] +WWDG_IRQHandler +PVD_IRQHandler +TAMPER_IRQHandler +RTC_IRQHandler +FLASH_IRQHandler +RCC_IRQHandler +EXTI0_IRQHandler +EXTI1_IRQHandler +EXTI2_IRQHandler +EXTI3_IRQHandler +EXTI4_IRQHandler +DMA1_Channel1_IRQHandler +DMA1_Channel2_IRQHandler +DMA1_Channel3_IRQHandler +DMA1_Channel4_IRQHandler +DMA1_Channel5_IRQHandler +DMA1_Channel6_IRQHandler +DMA1_Channel7_IRQHandler +ADC1_IRQHandler +EXTI9_5_IRQHandler +TIM1_BRK_TIM15_IRQHandler +TIM1_UP_TIM16_IRQHandler +TIM1_TRG_COM_TIM17_IRQHandler +TIM1_CC_IRQHandler +TIM2_IRQHandler +TIM3_IRQHandler +I2C1_EV_IRQHandler +I2C1_ER_IRQHandler +SPI1_IRQHandler +USART1_IRQHandler +USART2_IRQHandler +EXTI15_10_IRQHandler +RTCAlarm_IRQHandler +CEC_IRQHandler +TIM6_DAC_IRQHandler +TIM7_IRQHandler + B . + + ENDP + + ALIGN + +;******************************************************************************* +; User Stack and Heap initialization +;******************************************************************************* + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap + + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + + ALIGN + + ENDIF + + END + +;******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE***** diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_md.s b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_md.s new file mode 100644 index 0000000..3223fc9 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_md.s @@ -0,0 +1,307 @@ +;******************** (C) COPYRIGHT 2011 STMicroelectronics ******************** +;* File Name : startup_stm32f10x_md.s +;* Author : MCD Application Team +;* Version : V3.5.0 +;* Date : 11-March-2011 +;* Description : STM32F10x Medium Density Devices vector table for MDK-ARM +;* toolchain. +;* This module performs: +;* - Set the initial SP +;* - Set the initial PC == Reset_Handler +;* - Set the vector table entries with the exceptions ISR address +;* - Configure the clock system +;* - Branches to __main in the C library (which eventually +;* calls main()). +;* After Reset the CortexM3 processor is in Thread mode, +;* priority is Privileged, and the Stack is set to Main. +;* <<< Use Configuration Wizard in Context Menu >>> +;******************************************************************************* +; THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS +; WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. +; AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, +; INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE +; CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING +; INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. +;******************************************************************************* + +; Amount of memory (in bytes) allocated for Stack +; Tailor this value to your application needs +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000200 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WWDG_IRQHandler ; Window Watchdog + DCD PVD_IRQHandler ; PVD through EXTI Line detect + DCD TAMPER_IRQHandler ; Tamper + DCD RTC_IRQHandler ; RTC + DCD FLASH_IRQHandler ; Flash + DCD RCC_IRQHandler ; RCC + DCD EXTI0_IRQHandler ; EXTI Line 0 + DCD EXTI1_IRQHandler ; EXTI Line 1 + DCD EXTI2_IRQHandler ; EXTI Line 2 + DCD EXTI3_IRQHandler ; EXTI Line 3 + DCD EXTI4_IRQHandler ; EXTI Line 4 + DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 + DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 + DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 + DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 + DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 + DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 + DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 + DCD ADC1_2_IRQHandler ; ADC1_2 + DCD USB_HP_CAN1_TX_IRQHandler ; USB High Priority or CAN1 TX + DCD USB_LP_CAN1_RX0_IRQHandler ; USB Low Priority or CAN1 RX0 + DCD CAN1_RX1_IRQHandler ; CAN1 RX1 + DCD CAN1_SCE_IRQHandler ; CAN1 SCE + DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 + DCD TIM1_BRK_IRQHandler ; TIM1 Break + DCD TIM1_UP_IRQHandler ; TIM1 Update + DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation + DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare + DCD TIM2_IRQHandler ; TIM2 + DCD TIM3_IRQHandler ; TIM3 + DCD TIM4_IRQHandler ; TIM4 + DCD I2C1_EV_IRQHandler ; I2C1 Event + DCD I2C1_ER_IRQHandler ; I2C1 Error + DCD I2C2_EV_IRQHandler ; I2C2 Event + DCD I2C2_ER_IRQHandler ; I2C2 Error + DCD SPI1_IRQHandler ; SPI1 + DCD SPI2_IRQHandler ; SPI2 + DCD USART1_IRQHandler ; USART1 + DCD USART2_IRQHandler ; USART2 + DCD USART3_IRQHandler ; USART3 + DCD EXTI15_10_IRQHandler ; EXTI Line 15..10 + DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line + DCD USBWakeUp_IRQHandler ; USB Wakeup from suspend +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + +; Reset handler +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT __main + IMPORT SystemInit + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WWDG_IRQHandler [WEAK] + EXPORT PVD_IRQHandler [WEAK] + EXPORT TAMPER_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT FLASH_IRQHandler [WEAK] + EXPORT RCC_IRQHandler [WEAK] + EXPORT EXTI0_IRQHandler [WEAK] + EXPORT EXTI1_IRQHandler [WEAK] + EXPORT EXTI2_IRQHandler [WEAK] + EXPORT EXTI3_IRQHandler [WEAK] + EXPORT EXTI4_IRQHandler [WEAK] + EXPORT DMA1_Channel1_IRQHandler [WEAK] + EXPORT DMA1_Channel2_IRQHandler [WEAK] + EXPORT DMA1_Channel3_IRQHandler [WEAK] + EXPORT DMA1_Channel4_IRQHandler [WEAK] + EXPORT DMA1_Channel5_IRQHandler [WEAK] + EXPORT DMA1_Channel6_IRQHandler [WEAK] + EXPORT DMA1_Channel7_IRQHandler [WEAK] + EXPORT ADC1_2_IRQHandler [WEAK] + EXPORT USB_HP_CAN1_TX_IRQHandler [WEAK] + EXPORT USB_LP_CAN1_RX0_IRQHandler [WEAK] + EXPORT CAN1_RX1_IRQHandler [WEAK] + EXPORT CAN1_SCE_IRQHandler [WEAK] + EXPORT EXTI9_5_IRQHandler [WEAK] + EXPORT TIM1_BRK_IRQHandler [WEAK] + EXPORT TIM1_UP_IRQHandler [WEAK] + EXPORT TIM1_TRG_COM_IRQHandler [WEAK] + EXPORT TIM1_CC_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT TIM3_IRQHandler [WEAK] + EXPORT TIM4_IRQHandler [WEAK] + EXPORT I2C1_EV_IRQHandler [WEAK] + EXPORT I2C1_ER_IRQHandler [WEAK] + EXPORT I2C2_EV_IRQHandler [WEAK] + EXPORT I2C2_ER_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT SPI2_IRQHandler [WEAK] + EXPORT USART1_IRQHandler [WEAK] + EXPORT USART2_IRQHandler [WEAK] + EXPORT USART3_IRQHandler [WEAK] + EXPORT EXTI15_10_IRQHandler [WEAK] + EXPORT RTCAlarm_IRQHandler [WEAK] + EXPORT USBWakeUp_IRQHandler [WEAK] + +WWDG_IRQHandler +PVD_IRQHandler +TAMPER_IRQHandler +RTC_IRQHandler +FLASH_IRQHandler +RCC_IRQHandler +EXTI0_IRQHandler +EXTI1_IRQHandler +EXTI2_IRQHandler +EXTI3_IRQHandler +EXTI4_IRQHandler +DMA1_Channel1_IRQHandler +DMA1_Channel2_IRQHandler +DMA1_Channel3_IRQHandler +DMA1_Channel4_IRQHandler +DMA1_Channel5_IRQHandler +DMA1_Channel6_IRQHandler +DMA1_Channel7_IRQHandler +ADC1_2_IRQHandler +USB_HP_CAN1_TX_IRQHandler +USB_LP_CAN1_RX0_IRQHandler +CAN1_RX1_IRQHandler +CAN1_SCE_IRQHandler +EXTI9_5_IRQHandler +TIM1_BRK_IRQHandler +TIM1_UP_IRQHandler +TIM1_TRG_COM_IRQHandler +TIM1_CC_IRQHandler +TIM2_IRQHandler +TIM3_IRQHandler +TIM4_IRQHandler +I2C1_EV_IRQHandler +I2C1_ER_IRQHandler +I2C2_EV_IRQHandler +I2C2_ER_IRQHandler +SPI1_IRQHandler +SPI2_IRQHandler +USART1_IRQHandler +USART2_IRQHandler +USART3_IRQHandler +EXTI15_10_IRQHandler +RTCAlarm_IRQHandler +USBWakeUp_IRQHandler + + B . + + ENDP + + ALIGN + +;******************************************************************************* +; User Stack and Heap initialization +;******************************************************************************* + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap + + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + + ALIGN + + ENDIF + + END + +;******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE***** diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_md_vl.s b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_md_vl.s new file mode 100644 index 0000000..d3b8aa6 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_md_vl.s @@ -0,0 +1,315 @@ +;******************** (C) COPYRIGHT 2011 STMicroelectronics ******************** +;* File Name : startup_stm32f10x_md_vl.s +;* Author : MCD Application Team +;* Version : V3.5.0 +;* Date : 11-March-2011 +;* Description : STM32F10x Medium Density Value Line Devices vector table +;* for MDK-ARM toolchain. +;* This module performs: +;* - Set the initial SP +;* - Set the initial PC == Reset_Handler +;* - Set the vector table entries with the exceptions ISR address +;* - Configure the clock system +;* - Branches to __main in the C library (which eventually +;* calls main()). +;* After Reset the CortexM3 processor is in Thread mode, +;* priority is Privileged, and the Stack is set to Main. +;* <<< Use Configuration Wizard in Context Menu >>> +;******************************************************************************* +; THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS +; WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. +; AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, +; INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE +; CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING +; INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. +;******************************************************************************* + +; Amount of memory (in bytes) allocated for Stack +; Tailor this value to your application needs +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000200 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WWDG_IRQHandler ; Window Watchdog + DCD PVD_IRQHandler ; PVD through EXTI Line detect + DCD TAMPER_IRQHandler ; Tamper + DCD RTC_IRQHandler ; RTC + DCD FLASH_IRQHandler ; Flash + DCD RCC_IRQHandler ; RCC + DCD EXTI0_IRQHandler ; EXTI Line 0 + DCD EXTI1_IRQHandler ; EXTI Line 1 + DCD EXTI2_IRQHandler ; EXTI Line 2 + DCD EXTI3_IRQHandler ; EXTI Line 3 + DCD EXTI4_IRQHandler ; EXTI Line 4 + DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 + DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 + DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 + DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 + DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 + DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 + DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 + DCD ADC1_IRQHandler ; ADC1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 + DCD TIM1_BRK_TIM15_IRQHandler ; TIM1 Break and TIM15 + DCD TIM1_UP_TIM16_IRQHandler ; TIM1 Update and TIM16 + DCD TIM1_TRG_COM_TIM17_IRQHandler ; TIM1 Trigger and Commutation and TIM17 + DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare + DCD TIM2_IRQHandler ; TIM2 + DCD TIM3_IRQHandler ; TIM3 + DCD TIM4_IRQHandler ; TIM4 + DCD I2C1_EV_IRQHandler ; I2C1 Event + DCD I2C1_ER_IRQHandler ; I2C1 Error + DCD I2C2_EV_IRQHandler ; I2C2 Event + DCD I2C2_ER_IRQHandler ; I2C2 Error + DCD SPI1_IRQHandler ; SPI1 + DCD SPI2_IRQHandler ; SPI2 + DCD USART1_IRQHandler ; USART1 + DCD USART2_IRQHandler ; USART2 + DCD USART3_IRQHandler ; USART3 + DCD EXTI15_10_IRQHandler ; EXTI Line 15..10 + DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line + DCD CEC_IRQHandler ; HDMI-CEC + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD TIM6_DAC_IRQHandler ; TIM6 and DAC underrun + DCD TIM7_IRQHandler ; TIM7 +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + +; Reset handler +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT __main + IMPORT SystemInit + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WWDG_IRQHandler [WEAK] + EXPORT PVD_IRQHandler [WEAK] + EXPORT TAMPER_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT FLASH_IRQHandler [WEAK] + EXPORT RCC_IRQHandler [WEAK] + EXPORT EXTI0_IRQHandler [WEAK] + EXPORT EXTI1_IRQHandler [WEAK] + EXPORT EXTI2_IRQHandler [WEAK] + EXPORT EXTI3_IRQHandler [WEAK] + EXPORT EXTI4_IRQHandler [WEAK] + EXPORT DMA1_Channel1_IRQHandler [WEAK] + EXPORT DMA1_Channel2_IRQHandler [WEAK] + EXPORT DMA1_Channel3_IRQHandler [WEAK] + EXPORT DMA1_Channel4_IRQHandler [WEAK] + EXPORT DMA1_Channel5_IRQHandler [WEAK] + EXPORT DMA1_Channel6_IRQHandler [WEAK] + EXPORT DMA1_Channel7_IRQHandler [WEAK] + EXPORT ADC1_IRQHandler [WEAK] + EXPORT EXTI9_5_IRQHandler [WEAK] + EXPORT TIM1_BRK_TIM15_IRQHandler [WEAK] + EXPORT TIM1_UP_TIM16_IRQHandler [WEAK] + EXPORT TIM1_TRG_COM_TIM17_IRQHandler [WEAK] + EXPORT TIM1_CC_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT TIM3_IRQHandler [WEAK] + EXPORT TIM4_IRQHandler [WEAK] + EXPORT I2C1_EV_IRQHandler [WEAK] + EXPORT I2C1_ER_IRQHandler [WEAK] + EXPORT I2C2_EV_IRQHandler [WEAK] + EXPORT I2C2_ER_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT SPI2_IRQHandler [WEAK] + EXPORT USART1_IRQHandler [WEAK] + EXPORT USART2_IRQHandler [WEAK] + EXPORT USART3_IRQHandler [WEAK] + EXPORT EXTI15_10_IRQHandler [WEAK] + EXPORT RTCAlarm_IRQHandler [WEAK] + EXPORT CEC_IRQHandler [WEAK] + EXPORT TIM6_DAC_IRQHandler [WEAK] + EXPORT TIM7_IRQHandler [WEAK] + +WWDG_IRQHandler +PVD_IRQHandler +TAMPER_IRQHandler +RTC_IRQHandler +FLASH_IRQHandler +RCC_IRQHandler +EXTI0_IRQHandler +EXTI1_IRQHandler +EXTI2_IRQHandler +EXTI3_IRQHandler +EXTI4_IRQHandler +DMA1_Channel1_IRQHandler +DMA1_Channel2_IRQHandler +DMA1_Channel3_IRQHandler +DMA1_Channel4_IRQHandler +DMA1_Channel5_IRQHandler +DMA1_Channel6_IRQHandler +DMA1_Channel7_IRQHandler +ADC1_IRQHandler +EXTI9_5_IRQHandler +TIM1_BRK_TIM15_IRQHandler +TIM1_UP_TIM16_IRQHandler +TIM1_TRG_COM_TIM17_IRQHandler +TIM1_CC_IRQHandler +TIM2_IRQHandler +TIM3_IRQHandler +TIM4_IRQHandler +I2C1_EV_IRQHandler +I2C1_ER_IRQHandler +I2C2_EV_IRQHandler +I2C2_ER_IRQHandler +SPI1_IRQHandler +SPI2_IRQHandler +USART1_IRQHandler +USART2_IRQHandler +USART3_IRQHandler +EXTI15_10_IRQHandler +RTCAlarm_IRQHandler +CEC_IRQHandler +TIM6_DAC_IRQHandler +TIM7_IRQHandler + B . + + ENDP + + ALIGN + +;******************************************************************************* +; User Stack and Heap initialization +;******************************************************************************* + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap + + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + + ALIGN + + ENDIF + + END + +;******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE***** diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_xl.s b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_xl.s new file mode 100644 index 0000000..7970052 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_xl.s @@ -0,0 +1,358 @@ +;******************** (C) COPYRIGHT 2011 STMicroelectronics ******************** +;* File Name : startup_stm32f10x_xl.s +;* Author : MCD Application Team +;* Version : V3.5.0 +;* Date : 11-March-2011 +;* Description : STM32F10x XL-Density Devices vector table for MDK-ARM +;* toolchain. +;* This module performs: +;* - Set the initial SP +;* - Set the initial PC == Reset_Handler +;* - Set the vector table entries with the exceptions ISR address +;* - Configure the clock system and also configure the external +;* SRAM mounted on STM3210E-EVAL board to be used as data +;* memory (optional, to be enabled by user) +;* - Branches to __main in the C library (which eventually +;* calls main()). +;* After Reset the CortexM3 processor is in Thread mode, +;* priority is Privileged, and the Stack is set to Main. +;* <<< Use Configuration Wizard in Context Menu >>> +;******************************************************************************* +; THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS +; WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. +; AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, +; INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE +; CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING +; INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. +;******************************************************************************* + +; Amount of memory (in bytes) allocated for Stack +; Tailor this value to your application needs +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000200 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WWDG_IRQHandler ; Window Watchdog + DCD PVD_IRQHandler ; PVD through EXTI Line detect + DCD TAMPER_IRQHandler ; Tamper + DCD RTC_IRQHandler ; RTC + DCD FLASH_IRQHandler ; Flash + DCD RCC_IRQHandler ; RCC + DCD EXTI0_IRQHandler ; EXTI Line 0 + DCD EXTI1_IRQHandler ; EXTI Line 1 + DCD EXTI2_IRQHandler ; EXTI Line 2 + DCD EXTI3_IRQHandler ; EXTI Line 3 + DCD EXTI4_IRQHandler ; EXTI Line 4 + DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 + DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 + DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 + DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 + DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 + DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 + DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 + DCD ADC1_2_IRQHandler ; ADC1 & ADC2 + DCD USB_HP_CAN1_TX_IRQHandler ; USB High Priority or CAN1 TX + DCD USB_LP_CAN1_RX0_IRQHandler ; USB Low Priority or CAN1 RX0 + DCD CAN1_RX1_IRQHandler ; CAN1 RX1 + DCD CAN1_SCE_IRQHandler ; CAN1 SCE + DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 + DCD TIM1_BRK_TIM9_IRQHandler ; TIM1 Break and TIM9 + DCD TIM1_UP_TIM10_IRQHandler ; TIM1 Update and TIM10 + DCD TIM1_TRG_COM_TIM11_IRQHandler ; TIM1 Trigger and Commutation and TIM11 + DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare + DCD TIM2_IRQHandler ; TIM2 + DCD TIM3_IRQHandler ; TIM3 + DCD TIM4_IRQHandler ; TIM4 + DCD I2C1_EV_IRQHandler ; I2C1 Event + DCD I2C1_ER_IRQHandler ; I2C1 Error + DCD I2C2_EV_IRQHandler ; I2C2 Event + DCD I2C2_ER_IRQHandler ; I2C2 Error + DCD SPI1_IRQHandler ; SPI1 + DCD SPI2_IRQHandler ; SPI2 + DCD USART1_IRQHandler ; USART1 + DCD USART2_IRQHandler ; USART2 + DCD USART3_IRQHandler ; USART3 + DCD EXTI15_10_IRQHandler ; EXTI Line 15..10 + DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line + DCD USBWakeUp_IRQHandler ; USB Wakeup from suspend + DCD TIM8_BRK_TIM12_IRQHandler ; TIM8 Break and TIM12 + DCD TIM8_UP_TIM13_IRQHandler ; TIM8 Update and TIM13 + DCD TIM8_TRG_COM_TIM14_IRQHandler ; TIM8 Trigger and Commutation and TIM14 + DCD TIM8_CC_IRQHandler ; TIM8 Capture Compare + DCD ADC3_IRQHandler ; ADC3 + DCD FSMC_IRQHandler ; FSMC + DCD SDIO_IRQHandler ; SDIO + DCD TIM5_IRQHandler ; TIM5 + DCD SPI3_IRQHandler ; SPI3 + DCD UART4_IRQHandler ; UART4 + DCD UART5_IRQHandler ; UART5 + DCD TIM6_IRQHandler ; TIM6 + DCD TIM7_IRQHandler ; TIM7 + DCD DMA2_Channel1_IRQHandler ; DMA2 Channel1 + DCD DMA2_Channel2_IRQHandler ; DMA2 Channel2 + DCD DMA2_Channel3_IRQHandler ; DMA2 Channel3 + DCD DMA2_Channel4_5_IRQHandler ; DMA2 Channel4 & Channel5 +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + +; Reset handler +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT __main + IMPORT SystemInit + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WWDG_IRQHandler [WEAK] + EXPORT PVD_IRQHandler [WEAK] + EXPORT TAMPER_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT FLASH_IRQHandler [WEAK] + EXPORT RCC_IRQHandler [WEAK] + EXPORT EXTI0_IRQHandler [WEAK] + EXPORT EXTI1_IRQHandler [WEAK] + EXPORT EXTI2_IRQHandler [WEAK] + EXPORT EXTI3_IRQHandler [WEAK] + EXPORT EXTI4_IRQHandler [WEAK] + EXPORT DMA1_Channel1_IRQHandler [WEAK] + EXPORT DMA1_Channel2_IRQHandler [WEAK] + EXPORT DMA1_Channel3_IRQHandler [WEAK] + EXPORT DMA1_Channel4_IRQHandler [WEAK] + EXPORT DMA1_Channel5_IRQHandler [WEAK] + EXPORT DMA1_Channel6_IRQHandler [WEAK] + EXPORT DMA1_Channel7_IRQHandler [WEAK] + EXPORT ADC1_2_IRQHandler [WEAK] + EXPORT USB_HP_CAN1_TX_IRQHandler [WEAK] + EXPORT USB_LP_CAN1_RX0_IRQHandler [WEAK] + EXPORT CAN1_RX1_IRQHandler [WEAK] + EXPORT CAN1_SCE_IRQHandler [WEAK] + EXPORT EXTI9_5_IRQHandler [WEAK] + EXPORT TIM1_BRK_TIM9_IRQHandler [WEAK] + EXPORT TIM1_UP_TIM10_IRQHandler [WEAK] + EXPORT TIM1_TRG_COM_TIM11_IRQHandler [WEAK] + EXPORT TIM1_CC_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT TIM3_IRQHandler [WEAK] + EXPORT TIM4_IRQHandler [WEAK] + EXPORT I2C1_EV_IRQHandler [WEAK] + EXPORT I2C1_ER_IRQHandler [WEAK] + EXPORT I2C2_EV_IRQHandler [WEAK] + EXPORT I2C2_ER_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT SPI2_IRQHandler [WEAK] + EXPORT USART1_IRQHandler [WEAK] + EXPORT USART2_IRQHandler [WEAK] + EXPORT USART3_IRQHandler [WEAK] + EXPORT EXTI15_10_IRQHandler [WEAK] + EXPORT RTCAlarm_IRQHandler [WEAK] + EXPORT USBWakeUp_IRQHandler [WEAK] + EXPORT TIM8_BRK_TIM12_IRQHandler [WEAK] + EXPORT TIM8_UP_TIM13_IRQHandler [WEAK] + EXPORT TIM8_TRG_COM_TIM14_IRQHandler [WEAK] + EXPORT TIM8_CC_IRQHandler [WEAK] + EXPORT ADC3_IRQHandler [WEAK] + EXPORT FSMC_IRQHandler [WEAK] + EXPORT SDIO_IRQHandler [WEAK] + EXPORT TIM5_IRQHandler [WEAK] + EXPORT SPI3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT UART5_IRQHandler [WEAK] + EXPORT TIM6_IRQHandler [WEAK] + EXPORT TIM7_IRQHandler [WEAK] + EXPORT DMA2_Channel1_IRQHandler [WEAK] + EXPORT DMA2_Channel2_IRQHandler [WEAK] + EXPORT DMA2_Channel3_IRQHandler [WEAK] + EXPORT DMA2_Channel4_5_IRQHandler [WEAK] + +WWDG_IRQHandler +PVD_IRQHandler +TAMPER_IRQHandler +RTC_IRQHandler +FLASH_IRQHandler +RCC_IRQHandler +EXTI0_IRQHandler +EXTI1_IRQHandler +EXTI2_IRQHandler +EXTI3_IRQHandler +EXTI4_IRQHandler +DMA1_Channel1_IRQHandler +DMA1_Channel2_IRQHandler +DMA1_Channel3_IRQHandler +DMA1_Channel4_IRQHandler +DMA1_Channel5_IRQHandler +DMA1_Channel6_IRQHandler +DMA1_Channel7_IRQHandler +ADC1_2_IRQHandler +USB_HP_CAN1_TX_IRQHandler +USB_LP_CAN1_RX0_IRQHandler +CAN1_RX1_IRQHandler +CAN1_SCE_IRQHandler +EXTI9_5_IRQHandler +TIM1_BRK_TIM9_IRQHandler +TIM1_UP_TIM10_IRQHandler +TIM1_TRG_COM_TIM11_IRQHandler +TIM1_CC_IRQHandler +TIM2_IRQHandler +TIM3_IRQHandler +TIM4_IRQHandler +I2C1_EV_IRQHandler +I2C1_ER_IRQHandler +I2C2_EV_IRQHandler +I2C2_ER_IRQHandler +SPI1_IRQHandler +SPI2_IRQHandler +USART1_IRQHandler +USART2_IRQHandler +USART3_IRQHandler +EXTI15_10_IRQHandler +RTCAlarm_IRQHandler +USBWakeUp_IRQHandler +TIM8_BRK_TIM12_IRQHandler +TIM8_UP_TIM13_IRQHandler +TIM8_TRG_COM_TIM14_IRQHandler +TIM8_CC_IRQHandler +ADC3_IRQHandler +FSMC_IRQHandler +SDIO_IRQHandler +TIM5_IRQHandler +SPI3_IRQHandler +UART4_IRQHandler +UART5_IRQHandler +TIM6_IRQHandler +TIM7_IRQHandler +DMA2_Channel1_IRQHandler +DMA2_Channel2_IRQHandler +DMA2_Channel3_IRQHandler +DMA2_Channel4_5_IRQHandler + B . + + ENDP + + ALIGN + +;******************************************************************************* +; User Stack and Heap initialization +;******************************************************************************* + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap + + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + + ALIGN + + ENDIF + + END + +;******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE***** diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_cl.s b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_cl.s new file mode 100644 index 0000000..039ec06 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_cl.s @@ -0,0 +1,468 @@ +/** + ****************************************************************************** + * @file startup_stm32f10x_cl.s + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief STM32F10x Connectivity line Devices vector table for RIDE7 toolchain. + * This module performs: + * - Set the initial SP + * - Set the initial PC == Reset_Handler, + * - Set the vector table entries with the exceptions ISR + * address. + * - Configure the clock system + * - Branches to main in the C library (which eventually + * calls main()). + * After Reset the Cortex-M3 processor is in Thread mode, + * priority is Privileged, and the Stack is set to Main. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + + .syntax unified + .cpu cortex-m3 + .fpu softvfp + .thumb + +.global g_pfnVectors +.global Default_Handler + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss + +.equ BootRAM, 0xF1E0F85F +/** + * @brief This is the code that gets called when the processor first + * starts execution following a reset event. Only the absolutely + * necessary set is performed, after which the application + * supplied main() routine is called. + * @param None + * @retval : None +*/ + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + +/* Copy the data segment initializers from flash to SRAM */ + movs r1, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r3, =_sidata + ldr r3, [r3, r1] + str r3, [r0, r1] + adds r1, r1, #4 + +LoopCopyDataInit: + ldr r0, =_sdata + ldr r3, =_edata + adds r2, r0, r1 + cmp r2, r3 + bcc CopyDataInit + ldr r2, =_sbss + b LoopFillZerobss + +/* Zero fill the bss segment. */ +FillZerobss: + movs r3, #0 + str r3, [r2], #4 + +LoopFillZerobss: + ldr r3, = _ebss + cmp r2, r3 + bcc FillZerobss +/* Call the clock system intitialization function.*/ + bl SystemInit +/* Call the application's entry point.*/ + bl main + bx lr +.size Reset_Handler, .-Reset_Handler + +/** + * @brief This is the code that gets called when the processor receives an + * unexpected interrupt. This simply enters an infinite loop, preserving + * the system state for examination by a debugger. + * @param None + * @retval None +*/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + .size Default_Handler, .-Default_Handler + +/****************************************************************************** +* +* The minimal vector table for a Cortex M3. Note that the proper constructs +* must be placed on this to ensure that it ends up at physical address +* 0x0000.0000. +* +*******************************************************************************/ + .section .isr_vector,"a",%progbits + .type g_pfnVectors, %object + .size g_pfnVectors, .-g_pfnVectors + + +g_pfnVectors: + .word _estack + .word Reset_Handler + .word NMI_Handler + .word HardFault_Handler + .word MemManage_Handler + .word BusFault_Handler + .word UsageFault_Handler + .word 0 + .word 0 + .word 0 + .word 0 + .word SVC_Handler + .word DebugMon_Handler + .word 0 + .word PendSV_Handler + .word SysTick_Handler + .word WWDG_IRQHandler + .word PVD_IRQHandler + .word TAMPER_IRQHandler + .word RTC_IRQHandler + .word FLASH_IRQHandler + .word RCC_IRQHandler + .word EXTI0_IRQHandler + .word EXTI1_IRQHandler + .word EXTI2_IRQHandler + .word EXTI3_IRQHandler + .word EXTI4_IRQHandler + .word DMA1_Channel1_IRQHandler + .word DMA1_Channel2_IRQHandler + .word DMA1_Channel3_IRQHandler + .word DMA1_Channel4_IRQHandler + .word DMA1_Channel5_IRQHandler + .word DMA1_Channel6_IRQHandler + .word DMA1_Channel7_IRQHandler + .word ADC1_2_IRQHandler + .word CAN1_TX_IRQHandler + .word CAN1_RX0_IRQHandler + .word CAN1_RX1_IRQHandler + .word CAN1_SCE_IRQHandler + .word EXTI9_5_IRQHandler + .word TIM1_BRK_IRQHandler + .word TIM1_UP_IRQHandler + .word TIM1_TRG_COM_IRQHandler + .word TIM1_CC_IRQHandler + .word TIM2_IRQHandler + .word TIM3_IRQHandler + .word TIM4_IRQHandler + .word I2C1_EV_IRQHandler + .word I2C1_ER_IRQHandler + .word I2C2_EV_IRQHandler + .word I2C2_ER_IRQHandler + .word SPI1_IRQHandler + .word SPI2_IRQHandler + .word USART1_IRQHandler + .word USART2_IRQHandler + .word USART3_IRQHandler + .word EXTI15_10_IRQHandler + .word RTCAlarm_IRQHandler + .word OTG_FS_WKUP_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word TIM5_IRQHandler + .word SPI3_IRQHandler + .word UART4_IRQHandler + .word UART5_IRQHandler + .word TIM6_IRQHandler + .word TIM7_IRQHandler + .word DMA2_Channel1_IRQHandler + .word DMA2_Channel2_IRQHandler + .word DMA2_Channel3_IRQHandler + .word DMA2_Channel4_IRQHandler + .word DMA2_Channel5_IRQHandler + .word ETH_IRQHandler + .word ETH_WKUP_IRQHandler + .word CAN2_TX_IRQHandler + .word CAN2_RX0_IRQHandler + .word CAN2_RX1_IRQHandler + .word CAN2_SCE_IRQHandler + .word OTG_FS_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word BootRAM /* @0x1E0. This is for boot in RAM mode for + STM32F10x Connectivity line Devices. */ + +/******************************************************************************* +* +* Provide weak aliases for each Exception handler to the Default_Handler. +* As they are weak aliases, any function with the same name will override +* this definition. +* +*******************************************************************************/ + .weak NMI_Handler + .thumb_set NMI_Handler,Default_Handler + + .weak HardFault_Handler + .thumb_set HardFault_Handler,Default_Handler + + .weak MemManage_Handler + .thumb_set MemManage_Handler,Default_Handler + + .weak BusFault_Handler + .thumb_set BusFault_Handler,Default_Handler + + .weak UsageFault_Handler + .thumb_set UsageFault_Handler,Default_Handler + + .weak SVC_Handler + .thumb_set SVC_Handler,Default_Handler + + .weak DebugMon_Handler + .thumb_set DebugMon_Handler,Default_Handler + + .weak PendSV_Handler + .thumb_set PendSV_Handler,Default_Handler + + .weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler + + .weak WWDG_IRQHandler + .thumb_set WWDG_IRQHandler,Default_Handler + + .weak PVD_IRQHandler + .thumb_set PVD_IRQHandler,Default_Handler + + .weak TAMPER_IRQHandler + .thumb_set TAMPER_IRQHandler,Default_Handler + + .weak RTC_IRQHandler + .thumb_set RTC_IRQHandler,Default_Handler + + .weak FLASH_IRQHandler + .thumb_set FLASH_IRQHandler,Default_Handler + + .weak RCC_IRQHandler + .thumb_set RCC_IRQHandler,Default_Handler + + .weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler + + .weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler + + .weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler + + .weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler + + .weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler + + .weak DMA1_Channel1_IRQHandler + .thumb_set DMA1_Channel1_IRQHandler,Default_Handler + + .weak DMA1_Channel2_IRQHandler + .thumb_set DMA1_Channel2_IRQHandler,Default_Handler + + .weak DMA1_Channel3_IRQHandler + .thumb_set DMA1_Channel3_IRQHandler,Default_Handler + + .weak DMA1_Channel4_IRQHandler + .thumb_set DMA1_Channel4_IRQHandler,Default_Handler + + .weak DMA1_Channel5_IRQHandler + .thumb_set DMA1_Channel5_IRQHandler,Default_Handler + + .weak DMA1_Channel6_IRQHandler + .thumb_set DMA1_Channel6_IRQHandler,Default_Handler + + .weak DMA1_Channel7_IRQHandler + .thumb_set DMA1_Channel7_IRQHandler,Default_Handler + + .weak ADC1_2_IRQHandler + .thumb_set ADC1_2_IRQHandler,Default_Handler + + .weak CAN1_TX_IRQHandler + .thumb_set CAN1_TX_IRQHandler,Default_Handler + + .weak CAN1_RX0_IRQHandler + .thumb_set CAN1_RX0_IRQHandler,Default_Handler + + .weak CAN1_RX1_IRQHandler + .thumb_set CAN1_RX1_IRQHandler,Default_Handler + + .weak CAN1_SCE_IRQHandler + .thumb_set CAN1_SCE_IRQHandler,Default_Handler + + .weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler + + .weak TIM1_BRK_IRQHandler + .thumb_set TIM1_BRK_IRQHandler,Default_Handler + + .weak TIM1_UP_IRQHandler + .thumb_set TIM1_UP_IRQHandler,Default_Handler + + .weak TIM1_TRG_COM_IRQHandler + .thumb_set TIM1_TRG_COM_IRQHandler,Default_Handler + + .weak TIM1_CC_IRQHandler + .thumb_set TIM1_CC_IRQHandler,Default_Handler + + .weak TIM2_IRQHandler + .thumb_set TIM2_IRQHandler,Default_Handler + + .weak TIM3_IRQHandler + .thumb_set TIM3_IRQHandler,Default_Handler + + .weak TIM4_IRQHandler + .thumb_set TIM4_IRQHandler,Default_Handler + + .weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler + + .weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler + + .weak I2C2_EV_IRQHandler + .thumb_set I2C2_EV_IRQHandler,Default_Handler + + .weak I2C2_ER_IRQHandler + .thumb_set I2C2_ER_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak SPI2_IRQHandler + .thumb_set SPI2_IRQHandler,Default_Handler + + .weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler + + .weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler + + .weak USART3_IRQHandler + .thumb_set USART3_IRQHandler,Default_Handler + + .weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler + + .weak RTCAlarm_IRQHandler + .thumb_set RTCAlarm_IRQHandler,Default_Handler + + .weak OTG_FS_WKUP_IRQHandler + .thumb_set OTG_FS_WKUP_IRQHandler,Default_Handler + + .weak TIM5_IRQHandler + .thumb_set TIM5_IRQHandler,Default_Handler + + .weak SPI3_IRQHandler + .thumb_set SPI3_IRQHandler,Default_Handler + + .weak UART4_IRQHandler + .thumb_set UART4_IRQHandler,Default_Handler + + .weak UART5_IRQHandler + .thumb_set UART5_IRQHandler,Default_Handler + + .weak TIM6_IRQHandler + .thumb_set TIM6_IRQHandler,Default_Handler + + .weak TIM7_IRQHandler + .thumb_set TIM7_IRQHandler,Default_Handler + + .weak DMA2_Channel1_IRQHandler + .thumb_set DMA2_Channel1_IRQHandler,Default_Handler + + .weak DMA2_Channel2_IRQHandler + .thumb_set DMA2_Channel2_IRQHandler,Default_Handler + + .weak DMA2_Channel3_IRQHandler + .thumb_set DMA2_Channel3_IRQHandler,Default_Handler + + .weak DMA2_Channel4_IRQHandler + .thumb_set DMA2_Channel4_IRQHandler,Default_Handler + + .weak DMA2_Channel5_IRQHandler + .thumb_set DMA2_Channel5_IRQHandler,Default_Handler + + .weak ETH_IRQHandler + .thumb_set ETH_IRQHandler,Default_Handler + + .weak ETH_WKUP_IRQHandler + .thumb_set ETH_WKUP_IRQHandler,Default_Handler + + .weak CAN2_TX_IRQHandler + .thumb_set CAN2_TX_IRQHandler,Default_Handler + + .weak CAN2_RX0_IRQHandler + .thumb_set CAN2_RX0_IRQHandler,Default_Handler + + .weak CAN2_RX1_IRQHandler + .thumb_set CAN2_RX1_IRQHandler,Default_Handler + + .weak CAN2_SCE_IRQHandler + .thumb_set CAN2_SCE_IRQHandler,Default_Handler + + .weak OTG_FS_IRQHandler + .thumb_set OTG_FS_IRQHandler ,Default_Handler + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_hd.s b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_hd.s new file mode 100644 index 0000000..e4ba08c --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_hd.s @@ -0,0 +1,465 @@ +/** + ****************************************************************************** + * @file startup_stm32f10x_hd.s + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief STM32F10x High Density Devices vector table for RIDE7 toolchain. + * This module performs: + * - Set the initial SP + * - Set the initial PC == Reset_Handler, + * - Set the vector table entries with the exceptions ISR address + * - Configure the clock system and the external SRAM mounted on + * STM3210E-EVAL board to be used as data memory (optional, + * to be enabled by user) + * - Branches to main in the C library (which eventually + * calls main()). + * After Reset the Cortex-M3 processor is in Thread mode, + * priority is Privileged, and the Stack is set to Main. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + + .syntax unified + .cpu cortex-m3 + .fpu softvfp + .thumb + +.global g_pfnVectors +.global Default_Handler + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss +/* stack used for SystemInit_ExtMemCtl; always internal RAM used */ + +.equ BootRAM, 0xF1E0F85F +/** + * @brief This is the code that gets called when the processor first + * starts execution following a reset event. Only the absolutely + * necessary set is performed, after which the application + * supplied main() routine is called. + * @param None + * @retval : None +*/ + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + +/* Copy the data segment initializers from flash to SRAM */ + movs r1, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r3, =_sidata + ldr r3, [r3, r1] + str r3, [r0, r1] + adds r1, r1, #4 + +LoopCopyDataInit: + ldr r0, =_sdata + ldr r3, =_edata + adds r2, r0, r1 + cmp r2, r3 + bcc CopyDataInit + ldr r2, =_sbss + b LoopFillZerobss +/* Zero fill the bss segment. */ +FillZerobss: + movs r3, #0 + str r3, [r2], #4 + +LoopFillZerobss: + ldr r3, = _ebss + cmp r2, r3 + bcc FillZerobss +/* Call the clock system intitialization function.*/ + bl SystemInit +/* Call the application's entry point.*/ + bl main + bx lr +.size Reset_Handler, .-Reset_Handler + +/** + * @brief This is the code that gets called when the processor receives an + * unexpected interrupt. This simply enters an infinite loop, preserving + * the system state for examination by a debugger. + * @param None + * @retval None +*/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + .size Default_Handler, .-Default_Handler +/****************************************************************************** +* +* The minimal vector table for a Cortex M3. Note that the proper constructs +* must be placed on this to ensure that it ends up at physical address +* 0x0000.0000. +* +*******************************************************************************/ + .section .isr_vector,"a",%progbits + .type g_pfnVectors, %object + .size g_pfnVectors, .-g_pfnVectors + + +g_pfnVectors: + .word _estack + .word Reset_Handler + .word NMI_Handler + .word HardFault_Handler + .word MemManage_Handler + .word BusFault_Handler + .word UsageFault_Handler + .word 0 + .word 0 + .word 0 + .word 0 + .word SVC_Handler + .word DebugMon_Handler + .word 0 + .word PendSV_Handler + .word SysTick_Handler + .word WWDG_IRQHandler + .word PVD_IRQHandler + .word TAMPER_IRQHandler + .word RTC_IRQHandler + .word FLASH_IRQHandler + .word RCC_IRQHandler + .word EXTI0_IRQHandler + .word EXTI1_IRQHandler + .word EXTI2_IRQHandler + .word EXTI3_IRQHandler + .word EXTI4_IRQHandler + .word DMA1_Channel1_IRQHandler + .word DMA1_Channel2_IRQHandler + .word DMA1_Channel3_IRQHandler + .word DMA1_Channel4_IRQHandler + .word DMA1_Channel5_IRQHandler + .word DMA1_Channel6_IRQHandler + .word DMA1_Channel7_IRQHandler + .word ADC1_2_IRQHandler + .word USB_HP_CAN1_TX_IRQHandler + .word USB_LP_CAN1_RX0_IRQHandler + .word CAN1_RX1_IRQHandler + .word CAN1_SCE_IRQHandler + .word EXTI9_5_IRQHandler + .word TIM1_BRK_IRQHandler + .word TIM1_UP_IRQHandler + .word TIM1_TRG_COM_IRQHandler + .word TIM1_CC_IRQHandler + .word TIM2_IRQHandler + .word TIM3_IRQHandler + .word TIM4_IRQHandler + .word I2C1_EV_IRQHandler + .word I2C1_ER_IRQHandler + .word I2C2_EV_IRQHandler + .word I2C2_ER_IRQHandler + .word SPI1_IRQHandler + .word SPI2_IRQHandler + .word USART1_IRQHandler + .word USART2_IRQHandler + .word USART3_IRQHandler + .word EXTI15_10_IRQHandler + .word RTCAlarm_IRQHandler + .word USBWakeUp_IRQHandler + .word TIM8_BRK_IRQHandler + .word TIM8_UP_IRQHandler + .word TIM8_TRG_COM_IRQHandler + .word TIM8_CC_IRQHandler + .word ADC3_IRQHandler + .word FSMC_IRQHandler + .word SDIO_IRQHandler + .word TIM5_IRQHandler + .word SPI3_IRQHandler + .word UART4_IRQHandler + .word UART5_IRQHandler + .word TIM6_IRQHandler + .word TIM7_IRQHandler + .word DMA2_Channel1_IRQHandler + .word DMA2_Channel2_IRQHandler + .word DMA2_Channel3_IRQHandler + .word DMA2_Channel4_5_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word BootRAM /* @0x1E0. This is for boot in RAM mode for + STM32F10x High Density devices. */ +/******************************************************************************* +* +* Provide weak aliases for each Exception handler to the Default_Handler. +* As they are weak aliases, any function with the same name will override +* this definition. +* +*******************************************************************************/ + + .weak NMI_Handler + .thumb_set NMI_Handler,Default_Handler + + .weak HardFault_Handler + .thumb_set HardFault_Handler,Default_Handler + + .weak MemManage_Handler + .thumb_set MemManage_Handler,Default_Handler + + .weak BusFault_Handler + .thumb_set BusFault_Handler,Default_Handler + + .weak UsageFault_Handler + .thumb_set UsageFault_Handler,Default_Handler + + .weak SVC_Handler + .thumb_set SVC_Handler,Default_Handler + + .weak DebugMon_Handler + .thumb_set DebugMon_Handler,Default_Handler + + .weak PendSV_Handler + .thumb_set PendSV_Handler,Default_Handler + + .weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler + + .weak WWDG_IRQHandler + .thumb_set WWDG_IRQHandler,Default_Handler + + .weak PVD_IRQHandler + .thumb_set PVD_IRQHandler,Default_Handler + + .weak TAMPER_IRQHandler + .thumb_set TAMPER_IRQHandler,Default_Handler + + .weak RTC_IRQHandler + .thumb_set RTC_IRQHandler,Default_Handler + + .weak FLASH_IRQHandler + .thumb_set FLASH_IRQHandler,Default_Handler + + .weak RCC_IRQHandler + .thumb_set RCC_IRQHandler,Default_Handler + + .weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler + + .weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler + + .weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler + + .weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler + + .weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler + + .weak DMA1_Channel1_IRQHandler + .thumb_set DMA1_Channel1_IRQHandler,Default_Handler + + .weak DMA1_Channel2_IRQHandler + .thumb_set DMA1_Channel2_IRQHandler,Default_Handler + + .weak DMA1_Channel3_IRQHandler + .thumb_set DMA1_Channel3_IRQHandler,Default_Handler + + .weak DMA1_Channel4_IRQHandler + .thumb_set DMA1_Channel4_IRQHandler,Default_Handler + + .weak DMA1_Channel5_IRQHandler + .thumb_set DMA1_Channel5_IRQHandler,Default_Handler + + .weak DMA1_Channel6_IRQHandler + .thumb_set DMA1_Channel6_IRQHandler,Default_Handler + + .weak DMA1_Channel7_IRQHandler + .thumb_set DMA1_Channel7_IRQHandler,Default_Handler + + .weak ADC1_2_IRQHandler + .thumb_set ADC1_2_IRQHandler,Default_Handler + + .weak USB_HP_CAN1_TX_IRQHandler + .thumb_set USB_HP_CAN1_TX_IRQHandler,Default_Handler + + .weak USB_LP_CAN1_RX0_IRQHandler + .thumb_set USB_LP_CAN1_RX0_IRQHandler,Default_Handler + + .weak CAN1_RX1_IRQHandler + .thumb_set CAN1_RX1_IRQHandler,Default_Handler + + .weak CAN1_SCE_IRQHandler + .thumb_set CAN1_SCE_IRQHandler,Default_Handler + + .weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler + + .weak TIM1_BRK_IRQHandler + .thumb_set TIM1_BRK_IRQHandler,Default_Handler + + .weak TIM1_UP_IRQHandler + .thumb_set TIM1_UP_IRQHandler,Default_Handler + + .weak TIM1_TRG_COM_IRQHandler + .thumb_set TIM1_TRG_COM_IRQHandler,Default_Handler + + .weak TIM1_CC_IRQHandler + .thumb_set TIM1_CC_IRQHandler,Default_Handler + + .weak TIM2_IRQHandler + .thumb_set TIM2_IRQHandler,Default_Handler + + .weak TIM3_IRQHandler + .thumb_set TIM3_IRQHandler,Default_Handler + + .weak TIM4_IRQHandler + .thumb_set TIM4_IRQHandler,Default_Handler + + .weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler + + .weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler + + .weak I2C2_EV_IRQHandler + .thumb_set I2C2_EV_IRQHandler,Default_Handler + + .weak I2C2_ER_IRQHandler + .thumb_set I2C2_ER_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak SPI2_IRQHandler + .thumb_set SPI2_IRQHandler,Default_Handler + + .weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler + + .weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler + + .weak USART3_IRQHandler + .thumb_set USART3_IRQHandler,Default_Handler + + .weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler + + .weak RTCAlarm_IRQHandler + .thumb_set RTCAlarm_IRQHandler,Default_Handler + + .weak USBWakeUp_IRQHandler + .thumb_set USBWakeUp_IRQHandler,Default_Handler + + .weak TIM8_BRK_IRQHandler + .thumb_set TIM8_BRK_IRQHandler,Default_Handler + + .weak TIM8_UP_IRQHandler + .thumb_set TIM8_UP_IRQHandler,Default_Handler + + .weak TIM8_TRG_COM_IRQHandler + .thumb_set TIM8_TRG_COM_IRQHandler,Default_Handler + + .weak TIM8_CC_IRQHandler + .thumb_set TIM8_CC_IRQHandler,Default_Handler + + .weak ADC3_IRQHandler + .thumb_set ADC3_IRQHandler,Default_Handler + + .weak FSMC_IRQHandler + .thumb_set FSMC_IRQHandler,Default_Handler + + .weak SDIO_IRQHandler + .thumb_set SDIO_IRQHandler,Default_Handler + + .weak TIM5_IRQHandler + .thumb_set TIM5_IRQHandler,Default_Handler + + .weak SPI3_IRQHandler + .thumb_set SPI3_IRQHandler,Default_Handler + + .weak UART4_IRQHandler + .thumb_set UART4_IRQHandler,Default_Handler + + .weak UART5_IRQHandler + .thumb_set UART5_IRQHandler,Default_Handler + + .weak TIM6_IRQHandler + .thumb_set TIM6_IRQHandler,Default_Handler + + .weak TIM7_IRQHandler + .thumb_set TIM7_IRQHandler,Default_Handler + + .weak DMA2_Channel1_IRQHandler + .thumb_set DMA2_Channel1_IRQHandler,Default_Handler + + .weak DMA2_Channel2_IRQHandler + .thumb_set DMA2_Channel2_IRQHandler,Default_Handler + + .weak DMA2_Channel3_IRQHandler + .thumb_set DMA2_Channel3_IRQHandler,Default_Handler + + .weak DMA2_Channel4_5_IRQHandler + .thumb_set DMA2_Channel4_5_IRQHandler,Default_Handler + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_hd_vl.s b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_hd_vl.s new file mode 100644 index 0000000..daad5cc --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_hd_vl.s @@ -0,0 +1,442 @@ +/** + ****************************************************************************** + * @file startup_stm32f10x_hd_vl.s + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief STM32F10x High Density Value Line Devices vector table for RIDE7 + * toolchain. + * This module performs: + * - Set the initial SP + * - Set the initial PC == Reset_Handler, + * - Set the vector table entries with the exceptions ISR address + * - Configure the clock system and the external SRAM mounted on + * STM32100E-EVAL board to be used as data memory (optional, + * to be enabled by user) + * - Branches to main in the C library (which eventually + * calls main()). + * After Reset the Cortex-M3 processor is in Thread mode, + * priority is Privileged, and the Stack is set to Main. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + + .syntax unified + .cpu cortex-m3 + .fpu softvfp + .thumb + +.global g_pfnVectors +.global Default_Handler + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss + +.equ BootRAM, 0xF108F85F +/** + * @brief This is the code that gets called when the processor first + * starts execution following a reset event. Only the absolutely + * necessary set is performed, after which the application + * supplied main() routine is called. + * @param None + * @retval None +*/ + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + +/* Copy the data segment initializers from flash to SRAM */ + movs r1, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r3, =_sidata + ldr r3, [r3, r1] + str r3, [r0, r1] + adds r1, r1, #4 + +LoopCopyDataInit: + ldr r0, =_sdata + ldr r3, =_edata + adds r2, r0, r1 + cmp r2, r3 + bcc CopyDataInit + ldr r2, =_sbss + b LoopFillZerobss +/* Zero fill the bss segment. */ +FillZerobss: + movs r3, #0 + str r3, [r2], #4 + +LoopFillZerobss: + ldr r3, = _ebss + cmp r2, r3 + bcc FillZerobss +/* Call the clock system intitialization function.*/ + bl SystemInit +/* Call the application's entry point.*/ + bl main + bx lr +.size Reset_Handler, .-Reset_Handler + +/** + * @brief This is the code that gets called when the processor receives an + * unexpected interrupt. This simply enters an infinite loop, preserving + * the system state for examination by a debugger. + * @param None + * @retval None +*/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + .size Default_Handler, .-Default_Handler +/****************************************************************************** +* +* The minimal vector table for a Cortex M3. Note that the proper constructs +* must be placed on this to ensure that it ends up at physical address +* 0x0000.0000. +* +******************************************************************************/ + .section .isr_vector,"a",%progbits + .type g_pfnVectors, %object + .size g_pfnVectors, .-g_pfnVectors + +g_pfnVectors: + .word _estack + .word Reset_Handler + .word NMI_Handler + .word HardFault_Handler + .word MemManage_Handler + .word BusFault_Handler + .word UsageFault_Handler + .word 0 + .word 0 + .word 0 + .word 0 + .word SVC_Handler + .word DebugMon_Handler + .word 0 + .word PendSV_Handler + .word SysTick_Handler + .word WWDG_IRQHandler + .word PVD_IRQHandler + .word TAMPER_IRQHandler + .word RTC_IRQHandler + .word FLASH_IRQHandler + .word RCC_IRQHandler + .word EXTI0_IRQHandler + .word EXTI1_IRQHandler + .word EXTI2_IRQHandler + .word EXTI3_IRQHandler + .word EXTI4_IRQHandler + .word DMA1_Channel1_IRQHandler + .word DMA1_Channel2_IRQHandler + .word DMA1_Channel3_IRQHandler + .word DMA1_Channel4_IRQHandler + .word DMA1_Channel5_IRQHandler + .word DMA1_Channel6_IRQHandler + .word DMA1_Channel7_IRQHandler + .word ADC1_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word EXTI9_5_IRQHandler + .word TIM1_BRK_TIM15_IRQHandler + .word TIM1_UP_TIM16_IRQHandler + .word TIM1_TRG_COM_TIM17_IRQHandler + .word TIM1_CC_IRQHandler + .word TIM2_IRQHandler + .word TIM3_IRQHandler + .word TIM4_IRQHandler + .word I2C1_EV_IRQHandler + .word I2C1_ER_IRQHandler + .word I2C2_EV_IRQHandler + .word I2C2_ER_IRQHandler + .word SPI1_IRQHandler + .word SPI2_IRQHandler + .word USART1_IRQHandler + .word USART2_IRQHandler + .word USART3_IRQHandler + .word EXTI15_10_IRQHandler + .word RTCAlarm_IRQHandler + .word CEC_IRQHandler + .word TIM12_IRQHandler + .word TIM13_IRQHandler + .word TIM14_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word TIM5_IRQHandler + .word SPI3_IRQHandler + .word UART4_IRQHandler + .word UART5_IRQHandler + .word TIM6_DAC_IRQHandler + .word TIM7_IRQHandler + .word DMA2_Channel1_IRQHandler + .word DMA2_Channel2_IRQHandler + .word DMA2_Channel3_IRQHandler + .word DMA2_Channel4_5_IRQHandler + .word DMA2_Channel5_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word BootRAM /* @0x1E0. This is for boot in RAM mode for + STM32F10x High Density Value line devices. */ + +/******************************************************************************* +* Provide weak aliases for each Exception handler to the Default_Handler. +* As they are weak aliases, any function with the same name will override +* this definition. +*******************************************************************************/ + + .weak NMI_Handler + .thumb_set NMI_Handler,Default_Handler + + .weak HardFault_Handler + .thumb_set HardFault_Handler,Default_Handler + + .weak MemManage_Handler + .thumb_set MemManage_Handler,Default_Handler + + .weak BusFault_Handler + .thumb_set BusFault_Handler,Default_Handler + + .weak UsageFault_Handler + .thumb_set UsageFault_Handler,Default_Handler + + .weak SVC_Handler + .thumb_set SVC_Handler,Default_Handler + + .weak DebugMon_Handler + .thumb_set DebugMon_Handler,Default_Handler + + .weak PendSV_Handler + .thumb_set PendSV_Handler,Default_Handler + + .weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler + + .weak WWDG_IRQHandler + .thumb_set WWDG_IRQHandler,Default_Handler + + .weak PVD_IRQHandler + .thumb_set PVD_IRQHandler,Default_Handler + + .weak TAMPER_IRQHandler + .thumb_set TAMPER_IRQHandler,Default_Handler + + .weak RTC_IRQHandler + .thumb_set RTC_IRQHandler,Default_Handler + + .weak FLASH_IRQHandler + .thumb_set FLASH_IRQHandler,Default_Handler + + .weak RCC_IRQHandler + .thumb_set RCC_IRQHandler,Default_Handler + + .weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler + + .weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler + + .weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler + + .weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler + + .weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler + + .weak DMA1_Channel1_IRQHandler + .thumb_set DMA1_Channel1_IRQHandler,Default_Handler + + .weak DMA1_Channel2_IRQHandler + .thumb_set DMA1_Channel2_IRQHandler,Default_Handler + + .weak DMA1_Channel3_IRQHandler + .thumb_set DMA1_Channel3_IRQHandler,Default_Handler + + .weak DMA1_Channel4_IRQHandler + .thumb_set DMA1_Channel4_IRQHandler,Default_Handler + + .weak DMA1_Channel5_IRQHandler + .thumb_set DMA1_Channel5_IRQHandler,Default_Handler + + .weak DMA1_Channel6_IRQHandler + .thumb_set DMA1_Channel6_IRQHandler,Default_Handler + + .weak DMA1_Channel7_IRQHandler + .thumb_set DMA1_Channel7_IRQHandler,Default_Handler + + .weak ADC1_IRQHandler + .thumb_set ADC1_IRQHandler,Default_Handler + + .weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler + + .weak TIM1_BRK_TIM15_IRQHandler + .thumb_set TIM1_BRK_TIM15_IRQHandler,Default_Handler + + .weak TIM1_UP_TIM16_IRQHandler + .thumb_set TIM1_UP_TIM16_IRQHandler,Default_Handler + + .weak TIM1_TRG_COM_TIM17_IRQHandler + .thumb_set TIM1_TRG_COM_TIM17_IRQHandler,Default_Handler + + .weak TIM1_CC_IRQHandler + .thumb_set TIM1_CC_IRQHandler,Default_Handler + + .weak TIM2_IRQHandler + .thumb_set TIM2_IRQHandler,Default_Handler + + .weak TIM3_IRQHandler + .thumb_set TIM3_IRQHandler,Default_Handler + + .weak TIM4_IRQHandler + .thumb_set TIM4_IRQHandler,Default_Handler + + .weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler + + .weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler + + .weak I2C2_EV_IRQHandler + .thumb_set I2C2_EV_IRQHandler,Default_Handler + + .weak I2C2_ER_IRQHandler + .thumb_set I2C2_ER_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak SPI2_IRQHandler + .thumb_set SPI2_IRQHandler,Default_Handler + + .weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler + + .weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler + + .weak USART3_IRQHandler + .thumb_set USART3_IRQHandler,Default_Handler + + .weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler + + .weak RTCAlarm_IRQHandler + .thumb_set RTCAlarm_IRQHandler,Default_Handler + + .weak CEC_IRQHandler + .thumb_set CEC_IRQHandler,Default_Handler + + .weak TIM12_IRQHandler + .thumb_set TIM12_IRQHandler,Default_Handler + + .weak TIM13_IRQHandler + .thumb_set TIM13_IRQHandler,Default_Handler + + .weak TIM14_IRQHandler + .thumb_set TIM14_IRQHandler,Default_Handler + + .weak TIM5_IRQHandler + .thumb_set TIM5_IRQHandler,Default_Handler + + .weak SPI3_IRQHandler + .thumb_set SPI3_IRQHandler,Default_Handler + + .weak UART4_IRQHandler + .thumb_set UART4_IRQHandler,Default_Handler + + .weak UART5_IRQHandler + .thumb_set UART5_IRQHandler,Default_Handler + + .weak TIM6_DAC_IRQHandler + .thumb_set TIM6_DAC_IRQHandler,Default_Handler + + .weak TIM7_IRQHandler + .thumb_set TIM7_IRQHandler,Default_Handler + + .weak DMA2_Channel1_IRQHandler + .thumb_set DMA2_Channel1_IRQHandler,Default_Handler + + .weak DMA2_Channel2_IRQHandler + .thumb_set DMA2_Channel2_IRQHandler,Default_Handler + + .weak DMA2_Channel3_IRQHandler + .thumb_set DMA2_Channel3_IRQHandler,Default_Handler + + .weak DMA2_Channel4_5_IRQHandler + .thumb_set DMA2_Channel4_5_IRQHandler,Default_Handler + + .weak DMA2_Channel5_IRQHandler + .thumb_set DMA2_Channel5_IRQHandler,Default_Handler + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_ld.s b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_ld.s new file mode 100644 index 0000000..aaa09ec --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_ld.s @@ -0,0 +1,343 @@ +/** + ****************************************************************************** + * @file startup_stm32f10x_ld.s + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief STM32F10x Low Density Devices vector table for RIDE7 toolchain. + * This module performs: + * - Set the initial SP + * - Set the initial PC == Reset_Handler, + * - Set the vector table entries with the exceptions ISR address + * - Configure the clock system + * - Branches to main in the C library (which eventually + * calls main()). + * After Reset the Cortex-M3 processor is in Thread mode, + * priority is Privileged, and the Stack is set to Main. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + + .syntax unified + .cpu cortex-m3 + .fpu softvfp + .thumb + +.global g_pfnVectors +.global Default_Handler + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss + +.equ BootRAM, 0xF108F85F +/** + * @brief This is the code that gets called when the processor first + * starts execution following a reset event. Only the absolutely + * necessary set is performed, after which the application + * supplied main() routine is called. + * @param None + * @retval : None +*/ + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + +/* Copy the data segment initializers from flash to SRAM */ + movs r1, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r3, =_sidata + ldr r3, [r3, r1] + str r3, [r0, r1] + adds r1, r1, #4 + +LoopCopyDataInit: + ldr r0, =_sdata + ldr r3, =_edata + adds r2, r0, r1 + cmp r2, r3 + bcc CopyDataInit + ldr r2, =_sbss + b LoopFillZerobss +/* Zero fill the bss segment. */ +FillZerobss: + movs r3, #0 + str r3, [r2], #4 + +LoopFillZerobss: + ldr r3, = _ebss + cmp r2, r3 + bcc FillZerobss +/* Call the clock system intitialization function.*/ + bl SystemInit +/* Call the application's entry point.*/ + bl main + bx lr +.size Reset_Handler, .-Reset_Handler + +/** + * @brief This is the code that gets called when the processor receives an + * unexpected interrupt. This simply enters an infinite loop, preserving + * the system state for examination by a debugger. + * @param None + * @retval None +*/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + .size Default_Handler, .-Default_Handler +/****************************************************************************** +* +* The minimal vector table for a Cortex M3. Note that the proper constructs +* must be placed on this to ensure that it ends up at physical address +* 0x0000.0000. +* +******************************************************************************/ + .section .isr_vector,"a",%progbits + .type g_pfnVectors, %object + .size g_pfnVectors, .-g_pfnVectors + + +g_pfnVectors: + .word _estack + .word Reset_Handler + .word NMI_Handler + .word HardFault_Handler + .word MemManage_Handler + .word BusFault_Handler + .word UsageFault_Handler + .word 0 + .word 0 + .word 0 + .word 0 + .word SVC_Handler + .word DebugMon_Handler + .word 0 + .word PendSV_Handler + .word SysTick_Handler + .word WWDG_IRQHandler + .word PVD_IRQHandler + .word TAMPER_IRQHandler + .word RTC_IRQHandler + .word FLASH_IRQHandler + .word RCC_IRQHandler + .word EXTI0_IRQHandler + .word EXTI1_IRQHandler + .word EXTI2_IRQHandler + .word EXTI3_IRQHandler + .word EXTI4_IRQHandler + .word DMA1_Channel1_IRQHandler + .word DMA1_Channel2_IRQHandler + .word DMA1_Channel3_IRQHandler + .word DMA1_Channel4_IRQHandler + .word DMA1_Channel5_IRQHandler + .word DMA1_Channel6_IRQHandler + .word DMA1_Channel7_IRQHandler + .word ADC1_2_IRQHandler + .word USB_HP_CAN1_TX_IRQHandler + .word USB_LP_CAN1_RX0_IRQHandler + .word CAN1_RX1_IRQHandler + .word CAN1_SCE_IRQHandler + .word EXTI9_5_IRQHandler + .word TIM1_BRK_IRQHandler + .word TIM1_UP_IRQHandler + .word TIM1_TRG_COM_IRQHandler + .word TIM1_CC_IRQHandler + .word TIM2_IRQHandler + .word TIM3_IRQHandler + .word 0 + .word I2C1_EV_IRQHandler + .word I2C1_ER_IRQHandler + .word 0 + .word 0 + .word SPI1_IRQHandler + .word 0 + .word USART1_IRQHandler + .word USART2_IRQHandler + .word 0 + .word EXTI15_10_IRQHandler + .word RTCAlarm_IRQHandler + .word USBWakeUp_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word BootRAM /* @0x108. This is for boot in RAM mode for + STM32F10x Low Density devices.*/ + +/******************************************************************************* +* +* Provide weak aliases for each Exception handler to the Default_Handler. +* As they are weak aliases, any function with the same name will override +* this definition. +* +*******************************************************************************/ + + .weak NMI_Handler + .thumb_set NMI_Handler,Default_Handler + + .weak HardFault_Handler + .thumb_set HardFault_Handler,Default_Handler + + .weak MemManage_Handler + .thumb_set MemManage_Handler,Default_Handler + + .weak BusFault_Handler + .thumb_set BusFault_Handler,Default_Handler + + .weak UsageFault_Handler + .thumb_set UsageFault_Handler,Default_Handler + + .weak SVC_Handler + .thumb_set SVC_Handler,Default_Handler + + .weak DebugMon_Handler + .thumb_set DebugMon_Handler,Default_Handler + + .weak PendSV_Handler + .thumb_set PendSV_Handler,Default_Handler + + .weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler + + .weak WWDG_IRQHandler + .thumb_set WWDG_IRQHandler,Default_Handler + + .weak PVD_IRQHandler + .thumb_set PVD_IRQHandler,Default_Handler + + .weak TAMPER_IRQHandler + .thumb_set TAMPER_IRQHandler,Default_Handler + + .weak RTC_IRQHandler + .thumb_set RTC_IRQHandler,Default_Handler + + .weak FLASH_IRQHandler + .thumb_set FLASH_IRQHandler,Default_Handler + + .weak RCC_IRQHandler + .thumb_set RCC_IRQHandler,Default_Handler + + .weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler + + .weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler + + .weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler + + .weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler + + .weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler + + .weak DMA1_Channel1_IRQHandler + .thumb_set DMA1_Channel1_IRQHandler,Default_Handler + + .weak DMA1_Channel2_IRQHandler + .thumb_set DMA1_Channel2_IRQHandler,Default_Handler + + .weak DMA1_Channel3_IRQHandler + .thumb_set DMA1_Channel3_IRQHandler,Default_Handler + + .weak DMA1_Channel4_IRQHandler + .thumb_set DMA1_Channel4_IRQHandler,Default_Handler + + .weak DMA1_Channel5_IRQHandler + .thumb_set DMA1_Channel5_IRQHandler,Default_Handler + + .weak DMA1_Channel6_IRQHandler + .thumb_set DMA1_Channel6_IRQHandler,Default_Handler + + .weak DMA1_Channel7_IRQHandler + .thumb_set DMA1_Channel7_IRQHandler,Default_Handler + + .weak ADC1_2_IRQHandler + .thumb_set ADC1_2_IRQHandler,Default_Handler + + .weak USB_HP_CAN1_TX_IRQHandler + .thumb_set USB_HP_CAN1_TX_IRQHandler,Default_Handler + + .weak USB_LP_CAN1_RX0_IRQHandler + .thumb_set USB_LP_CAN1_RX0_IRQHandler,Default_Handler + + .weak CAN1_RX1_IRQHandler + .thumb_set CAN1_RX1_IRQHandler,Default_Handler + + .weak CAN1_SCE_IRQHandler + .thumb_set CAN1_SCE_IRQHandler,Default_Handler + + .weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler + + .weak TIM1_BRK_IRQHandler + .thumb_set TIM1_BRK_IRQHandler,Default_Handler + + .weak TIM1_UP_IRQHandler + .thumb_set TIM1_UP_IRQHandler,Default_Handler + + .weak TIM1_TRG_COM_IRQHandler + .thumb_set TIM1_TRG_COM_IRQHandler,Default_Handler + + .weak TIM1_CC_IRQHandler + .thumb_set TIM1_CC_IRQHandler,Default_Handler + + .weak TIM2_IRQHandler + .thumb_set TIM2_IRQHandler,Default_Handler + + .weak TIM3_IRQHandler + .thumb_set TIM3_IRQHandler,Default_Handler + + .weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler + + .weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler + + .weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler + + .weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler + + .weak RTCAlarm_IRQHandler + .thumb_set RTCAlarm_IRQHandler,Default_Handler + + .weak USBWakeUp_IRQHandler + .thumb_set USBWakeUp_IRQHandler,Default_Handler + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_ld_vl.s b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_ld_vl.s new file mode 100644 index 0000000..d4401be --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_ld_vl.s @@ -0,0 +1,383 @@ +/** + ****************************************************************************** + * @file startup_stm32f10x_ld_vl.s + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief STM32F10x Low Density Value Line Devices vector table for RIDE7 + * toolchain. + * This module performs: + * - Set the initial SP + * - Set the initial PC == Reset_Handler, + * - Set the vector table entries with the exceptions ISR address + * - Configure the clock system + * - Branches to main in the C library (which eventually + * calls main()). + * After Reset the Cortex-M3 processor is in Thread mode, + * priority is Privileged, and the Stack is set to Main. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + + .syntax unified + .cpu cortex-m3 + .fpu softvfp + .thumb + +.global g_pfnVectors +.global Default_Handler + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss + +.equ BootRAM, 0xF108F85F +/** + * @brief This is the code that gets called when the processor first + * starts execution following a reset event. Only the absolutely + * necessary set is performed, after which the application + * supplied main() routine is called. + * @param None + * @retval None +*/ + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + +/* Copy the data segment initializers from flash to SRAM */ + movs r1, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r3, =_sidata + ldr r3, [r3, r1] + str r3, [r0, r1] + adds r1, r1, #4 + +LoopCopyDataInit: + ldr r0, =_sdata + ldr r3, =_edata + adds r2, r0, r1 + cmp r2, r3 + bcc CopyDataInit + ldr r2, =_sbss + b LoopFillZerobss +/* Zero fill the bss segment. */ +FillZerobss: + movs r3, #0 + str r3, [r2], #4 + +LoopFillZerobss: + ldr r3, = _ebss + cmp r2, r3 + bcc FillZerobss +/* Call the clock system intitialization function.*/ + bl SystemInit +/* Call the application's entry point.*/ + bl main + bx lr +.size Reset_Handler, .-Reset_Handler + +/** + * @brief This is the code that gets called when the processor receives an + * unexpected interrupt. This simply enters an infinite loop, preserving + * the system state for examination by a debugger. + * @param None + * @retval None +*/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + .size Default_Handler, .-Default_Handler +/****************************************************************************** +* The minimal vector table for a Cortex M3. Note that the proper constructs +* must be placed on this to ensure that it ends up at physical address +* 0x0000.0000. +* +******************************************************************************/ + .section .isr_vector,"a",%progbits + .type g_pfnVectors, %object + .size g_pfnVectors, .-g_pfnVectors + +g_pfnVectors: + .word _estack + .word Reset_Handler + .word NMI_Handler + .word HardFault_Handler + .word MemManage_Handler + .word BusFault_Handler + .word UsageFault_Handler + .word 0 + .word 0 + .word 0 + .word 0 + .word SVC_Handler + .word DebugMon_Handler + .word 0 + .word PendSV_Handler + .word SysTick_Handler + .word WWDG_IRQHandler + .word PVD_IRQHandler + .word TAMPER_IRQHandler + .word RTC_IRQHandler + .word FLASH_IRQHandler + .word RCC_IRQHandler + .word EXTI0_IRQHandler + .word EXTI1_IRQHandler + .word EXTI2_IRQHandler + .word EXTI3_IRQHandler + .word EXTI4_IRQHandler + .word DMA1_Channel1_IRQHandler + .word DMA1_Channel2_IRQHandler + .word DMA1_Channel3_IRQHandler + .word DMA1_Channel4_IRQHandler + .word DMA1_Channel5_IRQHandler + .word DMA1_Channel6_IRQHandler + .word DMA1_Channel7_IRQHandler + .word ADC1_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word EXTI9_5_IRQHandler + .word TIM1_BRK_TIM15_IRQHandler + .word TIM1_UP_TIM16_IRQHandler + .word TIM1_TRG_COM_TIM17_IRQHandler + .word TIM1_CC_IRQHandler + .word TIM2_IRQHandler + .word TIM3_IRQHandler + .word 0 + .word I2C1_EV_IRQHandler + .word I2C1_ER_IRQHandler + .word 0 + .word 0 + .word SPI1_IRQHandler + .word 0 + .word USART1_IRQHandler + .word USART2_IRQHandler + .word 0 + .word EXTI15_10_IRQHandler + .word RTCAlarm_IRQHandler + .word CEC_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word TIM6_DAC_IRQHandler + .word TIM7_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word BootRAM /* @0x01CC. This is for boot in RAM mode for + STM32F10x Low Density Value Line devices. */ + +/******************************************************************************* +* Provide weak aliases for each Exception handler to the Default_Handler. +* As they are weak aliases, any function with the same name will override +* this definition. +*******************************************************************************/ + + .weak NMI_Handler + .thumb_set NMI_Handler,Default_Handler + + .weak HardFault_Handler + .thumb_set HardFault_Handler,Default_Handler + + .weak MemManage_Handler + .thumb_set MemManage_Handler,Default_Handler + + .weak BusFault_Handler + .thumb_set BusFault_Handler,Default_Handler + + .weak UsageFault_Handler + .thumb_set UsageFault_Handler,Default_Handler + + .weak SVC_Handler + .thumb_set SVC_Handler,Default_Handler + + .weak DebugMon_Handler + .thumb_set DebugMon_Handler,Default_Handler + + .weak PendSV_Handler + .thumb_set PendSV_Handler,Default_Handler + + .weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler + + .weak WWDG_IRQHandler + .thumb_set WWDG_IRQHandler,Default_Handler + + .weak PVD_IRQHandler + .thumb_set PVD_IRQHandler,Default_Handler + + .weak TAMPER_IRQHandler + .thumb_set TAMPER_IRQHandler,Default_Handler + + .weak RTC_IRQHandler + .thumb_set RTC_IRQHandler,Default_Handler + + .weak FLASH_IRQHandler + .thumb_set FLASH_IRQHandler,Default_Handler + + .weak RCC_IRQHandler + .thumb_set RCC_IRQHandler,Default_Handler + + .weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler + + .weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler + + .weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler + + .weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler + + .weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler + + .weak DMA1_Channel1_IRQHandler + .thumb_set DMA1_Channel1_IRQHandler,Default_Handler + + .weak DMA1_Channel2_IRQHandler + .thumb_set DMA1_Channel2_IRQHandler,Default_Handler + + .weak DMA1_Channel3_IRQHandler + .thumb_set DMA1_Channel3_IRQHandler,Default_Handler + + .weak DMA1_Channel4_IRQHandler + .thumb_set DMA1_Channel4_IRQHandler,Default_Handler + + .weak DMA1_Channel5_IRQHandler + .thumb_set DMA1_Channel5_IRQHandler,Default_Handler + + .weak DMA1_Channel6_IRQHandler + .thumb_set DMA1_Channel6_IRQHandler,Default_Handler + + .weak DMA1_Channel7_IRQHandler + .thumb_set DMA1_Channel7_IRQHandler,Default_Handler + + .weak ADC1_IRQHandler + .thumb_set ADC1_IRQHandler,Default_Handler + + .weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler + + .weak TIM1_BRK_TIM15_IRQHandler + .thumb_set TIM1_BRK_TIM15_IRQHandler,Default_Handler + + .weak TIM1_UP_TIM16_IRQHandler + .thumb_set TIM1_UP_TIM16_IRQHandler,Default_Handler + + .weak TIM1_TRG_COM_TIM17_IRQHandler + .thumb_set TIM1_TRG_COM_TIM17_IRQHandler,Default_Handler + + .weak TIM1_CC_IRQHandler + .thumb_set TIM1_CC_IRQHandler,Default_Handler + + .weak TIM2_IRQHandler + .thumb_set TIM2_IRQHandler,Default_Handler + + .weak TIM3_IRQHandler + .thumb_set TIM3_IRQHandler,Default_Handler + + .weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler + + .weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler + + .weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler + + .weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler + + .weak RTCAlarm_IRQHandler + .thumb_set RTCAlarm_IRQHandler,Default_Handler + + .weak CEC_IRQHandler + .thumb_set CEC_IRQHandler,Default_Handler + + .weak TIM6_DAC_IRQHandler + .thumb_set TIM6_DAC_IRQHandler,Default_Handler + + .weak TIM7_IRQHandler + .thumb_set TIM7_IRQHandler,Default_Handler + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_md.s b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_md.s new file mode 100644 index 0000000..4b4a050 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_md.s @@ -0,0 +1,358 @@ +/** + ****************************************************************************** + * @file startup_stm32f10x_md.s + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief STM32F10x Medium Density Devices vector table for RIDE7 toolchain. + * This module performs: + * - Set the initial SP + * - Set the initial PC == Reset_Handler, + * - Set the vector table entries with the exceptions ISR address + * - Configure the clock system + * - Branches to main in the C library (which eventually + * calls main()). + * After Reset the Cortex-M3 processor is in Thread mode, + * priority is Privileged, and the Stack is set to Main. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + + .syntax unified + .cpu cortex-m3 + .fpu softvfp + .thumb + +.global g_pfnVectors +.global Default_Handler + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss + +.equ BootRAM, 0xF108F85F +/** + * @brief This is the code that gets called when the processor first + * starts execution following a reset event. Only the absolutely + * necessary set is performed, after which the application + * supplied main() routine is called. + * @param None + * @retval : None +*/ + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + +/* Copy the data segment initializers from flash to SRAM */ + movs r1, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r3, =_sidata + ldr r3, [r3, r1] + str r3, [r0, r1] + adds r1, r1, #4 + +LoopCopyDataInit: + ldr r0, =_sdata + ldr r3, =_edata + adds r2, r0, r1 + cmp r2, r3 + bcc CopyDataInit + ldr r2, =_sbss + b LoopFillZerobss +/* Zero fill the bss segment. */ +FillZerobss: + movs r3, #0 + str r3, [r2], #4 + +LoopFillZerobss: + ldr r3, = _ebss + cmp r2, r3 + bcc FillZerobss +/* Call the clock system intitialization function.*/ + bl SystemInit +/* Call the application's entry point.*/ + bl main + bx lr +.size Reset_Handler, .-Reset_Handler + +/** + * @brief This is the code that gets called when the processor receives an + * unexpected interrupt. This simply enters an infinite loop, preserving + * the system state for examination by a debugger. + * @param None + * @retval None +*/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + .size Default_Handler, .-Default_Handler +/****************************************************************************** +* +* The minimal vector table for a Cortex M3. Note that the proper constructs +* must be placed on this to ensure that it ends up at physical address +* 0x0000.0000. +* +******************************************************************************/ + .section .isr_vector,"a",%progbits + .type g_pfnVectors, %object + .size g_pfnVectors, .-g_pfnVectors + + +g_pfnVectors: + .word _estack + .word Reset_Handler + .word NMI_Handler + .word HardFault_Handler + .word MemManage_Handler + .word BusFault_Handler + .word UsageFault_Handler + .word 0 + .word 0 + .word 0 + .word 0 + .word SVC_Handler + .word DebugMon_Handler + .word 0 + .word PendSV_Handler + .word SysTick_Handler + .word WWDG_IRQHandler + .word PVD_IRQHandler + .word TAMPER_IRQHandler + .word RTC_IRQHandler + .word FLASH_IRQHandler + .word RCC_IRQHandler + .word EXTI0_IRQHandler + .word EXTI1_IRQHandler + .word EXTI2_IRQHandler + .word EXTI3_IRQHandler + .word EXTI4_IRQHandler + .word DMA1_Channel1_IRQHandler + .word DMA1_Channel2_IRQHandler + .word DMA1_Channel3_IRQHandler + .word DMA1_Channel4_IRQHandler + .word DMA1_Channel5_IRQHandler + .word DMA1_Channel6_IRQHandler + .word DMA1_Channel7_IRQHandler + .word ADC1_2_IRQHandler + .word USB_HP_CAN1_TX_IRQHandler + .word USB_LP_CAN1_RX0_IRQHandler + .word CAN1_RX1_IRQHandler + .word CAN1_SCE_IRQHandler + .word EXTI9_5_IRQHandler + .word TIM1_BRK_IRQHandler + .word TIM1_UP_IRQHandler + .word TIM1_TRG_COM_IRQHandler + .word TIM1_CC_IRQHandler + .word TIM2_IRQHandler + .word TIM3_IRQHandler + .word TIM4_IRQHandler + .word I2C1_EV_IRQHandler + .word I2C1_ER_IRQHandler + .word I2C2_EV_IRQHandler + .word I2C2_ER_IRQHandler + .word SPI1_IRQHandler + .word SPI2_IRQHandler + .word USART1_IRQHandler + .word USART2_IRQHandler + .word USART3_IRQHandler + .word EXTI15_10_IRQHandler + .word RTCAlarm_IRQHandler + .word USBWakeUp_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word BootRAM /* @0x108. This is for boot in RAM mode for + STM32F10x Medium Density devices. */ + +/******************************************************************************* +* +* Provide weak aliases for each Exception handler to the Default_Handler. +* As they are weak aliases, any function with the same name will override +* this definition. +* +*******************************************************************************/ + + .weak NMI_Handler + .thumb_set NMI_Handler,Default_Handler + + .weak HardFault_Handler + .thumb_set HardFault_Handler,Default_Handler + + .weak MemManage_Handler + .thumb_set MemManage_Handler,Default_Handler + + .weak BusFault_Handler + .thumb_set BusFault_Handler,Default_Handler + + .weak UsageFault_Handler + .thumb_set UsageFault_Handler,Default_Handler + + .weak SVC_Handler + .thumb_set SVC_Handler,Default_Handler + + .weak DebugMon_Handler + .thumb_set DebugMon_Handler,Default_Handler + + .weak PendSV_Handler + .thumb_set PendSV_Handler,Default_Handler + + .weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler + + .weak WWDG_IRQHandler + .thumb_set WWDG_IRQHandler,Default_Handler + + .weak PVD_IRQHandler + .thumb_set PVD_IRQHandler,Default_Handler + + .weak TAMPER_IRQHandler + .thumb_set TAMPER_IRQHandler,Default_Handler + + .weak RTC_IRQHandler + .thumb_set RTC_IRQHandler,Default_Handler + + .weak FLASH_IRQHandler + .thumb_set FLASH_IRQHandler,Default_Handler + + .weak RCC_IRQHandler + .thumb_set RCC_IRQHandler,Default_Handler + + .weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler + + .weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler + + .weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler + + .weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler + + .weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler + + .weak DMA1_Channel1_IRQHandler + .thumb_set DMA1_Channel1_IRQHandler,Default_Handler + + .weak DMA1_Channel2_IRQHandler + .thumb_set DMA1_Channel2_IRQHandler,Default_Handler + + .weak DMA1_Channel3_IRQHandler + .thumb_set DMA1_Channel3_IRQHandler,Default_Handler + + .weak DMA1_Channel4_IRQHandler + .thumb_set DMA1_Channel4_IRQHandler,Default_Handler + + .weak DMA1_Channel5_IRQHandler + .thumb_set DMA1_Channel5_IRQHandler,Default_Handler + + .weak DMA1_Channel6_IRQHandler + .thumb_set DMA1_Channel6_IRQHandler,Default_Handler + + .weak DMA1_Channel7_IRQHandler + .thumb_set DMA1_Channel7_IRQHandler,Default_Handler + + .weak ADC1_2_IRQHandler + .thumb_set ADC1_2_IRQHandler,Default_Handler + + .weak USB_HP_CAN1_TX_IRQHandler + .thumb_set USB_HP_CAN1_TX_IRQHandler,Default_Handler + + .weak USB_LP_CAN1_RX0_IRQHandler + .thumb_set USB_LP_CAN1_RX0_IRQHandler,Default_Handler + + .weak CAN1_RX1_IRQHandler + .thumb_set CAN1_RX1_IRQHandler,Default_Handler + + .weak CAN1_SCE_IRQHandler + .thumb_set CAN1_SCE_IRQHandler,Default_Handler + + .weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler + + .weak TIM1_BRK_IRQHandler + .thumb_set TIM1_BRK_IRQHandler,Default_Handler + + .weak TIM1_UP_IRQHandler + .thumb_set TIM1_UP_IRQHandler,Default_Handler + + .weak TIM1_TRG_COM_IRQHandler + .thumb_set TIM1_TRG_COM_IRQHandler,Default_Handler + + .weak TIM1_CC_IRQHandler + .thumb_set TIM1_CC_IRQHandler,Default_Handler + + .weak TIM2_IRQHandler + .thumb_set TIM2_IRQHandler,Default_Handler + + .weak TIM3_IRQHandler + .thumb_set TIM3_IRQHandler,Default_Handler + + .weak TIM4_IRQHandler + .thumb_set TIM4_IRQHandler,Default_Handler + + .weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler + + .weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler + + .weak I2C2_EV_IRQHandler + .thumb_set I2C2_EV_IRQHandler,Default_Handler + + .weak I2C2_ER_IRQHandler + .thumb_set I2C2_ER_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak SPI2_IRQHandler + .thumb_set SPI2_IRQHandler,Default_Handler + + .weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler + + .weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler + + .weak USART3_IRQHandler + .thumb_set USART3_IRQHandler,Default_Handler + + .weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler + + .weak RTCAlarm_IRQHandler + .thumb_set RTCAlarm_IRQHandler,Default_Handler + + .weak USBWakeUp_IRQHandler + .thumb_set USBWakeUp_IRQHandler,Default_Handler + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_md_vl.s b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_md_vl.s new file mode 100644 index 0000000..8bce997 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_md_vl.s @@ -0,0 +1,399 @@ +/** + ****************************************************************************** + * @file startup_stm32f10x_md_vl.s + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief STM32F10x Medium Density Value Line Devices vector table for RIDE7 + * toolchain. + * This module performs: + * - Set the initial SP + * - Set the initial PC == Reset_Handler, + * - Set the vector table entries with the exceptions ISR address + * - Configure the clock system + * - Branches to main in the C library (which eventually + * calls main()). + * After Reset the Cortex-M3 processor is in Thread mode, + * priority is Privileged, and the Stack is set to Main. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + + .syntax unified + .cpu cortex-m3 + .fpu softvfp + .thumb + +.global g_pfnVectors +.global Default_Handler + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss + +.equ BootRAM, 0xF108F85F +/** + * @brief This is the code that gets called when the processor first + * starts execution following a reset event. Only the absolutely + * necessary set is performed, after which the application + * supplied main() routine is called. + * @param None + * @retval None +*/ + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + +/* Copy the data segment initializers from flash to SRAM */ + movs r1, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r3, =_sidata + ldr r3, [r3, r1] + str r3, [r0, r1] + adds r1, r1, #4 + +LoopCopyDataInit: + ldr r0, =_sdata + ldr r3, =_edata + adds r2, r0, r1 + cmp r2, r3 + bcc CopyDataInit + ldr r2, =_sbss + b LoopFillZerobss +/* Zero fill the bss segment. */ +FillZerobss: + movs r3, #0 + str r3, [r2], #4 + +LoopFillZerobss: + ldr r3, = _ebss + cmp r2, r3 + bcc FillZerobss +/* Call the clock system intitialization function.*/ + bl SystemInit +/* Call the application's entry point.*/ + bl main + bx lr +.size Reset_Handler, .-Reset_Handler + +/** + * @brief This is the code that gets called when the processor receives an + * unexpected interrupt. This simply enters an infinite loop, preserving + * the system state for examination by a debugger. + * @param None + * @retval None +*/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + .size Default_Handler, .-Default_Handler +/****************************************************************************** +* +* The minimal vector table for a Cortex M3. Note that the proper constructs +* must be placed on this to ensure that it ends up at physical address +* 0x0000.0000. +* +******************************************************************************/ + .section .isr_vector,"a",%progbits + .type g_pfnVectors, %object + .size g_pfnVectors, .-g_pfnVectors + +g_pfnVectors: + .word _estack + .word Reset_Handler + .word NMI_Handler + .word HardFault_Handler + .word MemManage_Handler + .word BusFault_Handler + .word UsageFault_Handler + .word 0 + .word 0 + .word 0 + .word 0 + .word SVC_Handler + .word DebugMon_Handler + .word 0 + .word PendSV_Handler + .word SysTick_Handler + .word WWDG_IRQHandler + .word PVD_IRQHandler + .word TAMPER_IRQHandler + .word RTC_IRQHandler + .word FLASH_IRQHandler + .word RCC_IRQHandler + .word EXTI0_IRQHandler + .word EXTI1_IRQHandler + .word EXTI2_IRQHandler + .word EXTI3_IRQHandler + .word EXTI4_IRQHandler + .word DMA1_Channel1_IRQHandler + .word DMA1_Channel2_IRQHandler + .word DMA1_Channel3_IRQHandler + .word DMA1_Channel4_IRQHandler + .word DMA1_Channel5_IRQHandler + .word DMA1_Channel6_IRQHandler + .word DMA1_Channel7_IRQHandler + .word ADC1_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word EXTI9_5_IRQHandler + .word TIM1_BRK_TIM15_IRQHandler + .word TIM1_UP_TIM16_IRQHandler + .word TIM1_TRG_COM_TIM17_IRQHandler + .word TIM1_CC_IRQHandler + .word TIM2_IRQHandler + .word TIM3_IRQHandler + .word TIM4_IRQHandler + .word I2C1_EV_IRQHandler + .word I2C1_ER_IRQHandler + .word I2C2_EV_IRQHandler + .word I2C2_ER_IRQHandler + .word SPI1_IRQHandler + .word SPI2_IRQHandler + .word USART1_IRQHandler + .word USART2_IRQHandler + .word USART3_IRQHandler + .word EXTI15_10_IRQHandler + .word RTCAlarm_IRQHandler + .word CEC_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word TIM6_DAC_IRQHandler + .word TIM7_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word BootRAM /* @0x01CC. This is for boot in RAM mode for + STM32F10x Medium Value Line Density devices. */ + +/******************************************************************************* +* Provide weak aliases for each Exception handler to the Default_Handler. +* As they are weak aliases, any function with the same name will override +* this definition. +*******************************************************************************/ + + .weak NMI_Handler + .thumb_set NMI_Handler,Default_Handler + + .weak HardFault_Handler + .thumb_set HardFault_Handler,Default_Handler + + .weak MemManage_Handler + .thumb_set MemManage_Handler,Default_Handler + + .weak BusFault_Handler + .thumb_set BusFault_Handler,Default_Handler + + .weak UsageFault_Handler + .thumb_set UsageFault_Handler,Default_Handler + + .weak SVC_Handler + .thumb_set SVC_Handler,Default_Handler + + .weak DebugMon_Handler + .thumb_set DebugMon_Handler,Default_Handler + + .weak PendSV_Handler + .thumb_set PendSV_Handler,Default_Handler + + .weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler + + .weak WWDG_IRQHandler + .thumb_set WWDG_IRQHandler,Default_Handler + + .weak PVD_IRQHandler + .thumb_set PVD_IRQHandler,Default_Handler + + .weak TAMPER_IRQHandler + .thumb_set TAMPER_IRQHandler,Default_Handler + + .weak RTC_IRQHandler + .thumb_set RTC_IRQHandler,Default_Handler + + .weak FLASH_IRQHandler + .thumb_set FLASH_IRQHandler,Default_Handler + + .weak RCC_IRQHandler + .thumb_set RCC_IRQHandler,Default_Handler + + .weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler + + .weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler + + .weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler + + .weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler + + .weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler + + .weak DMA1_Channel1_IRQHandler + .thumb_set DMA1_Channel1_IRQHandler,Default_Handler + + .weak DMA1_Channel2_IRQHandler + .thumb_set DMA1_Channel2_IRQHandler,Default_Handler + + .weak DMA1_Channel3_IRQHandler + .thumb_set DMA1_Channel3_IRQHandler,Default_Handler + + .weak DMA1_Channel4_IRQHandler + .thumb_set DMA1_Channel4_IRQHandler,Default_Handler + + .weak DMA1_Channel5_IRQHandler + .thumb_set DMA1_Channel5_IRQHandler,Default_Handler + + .weak DMA1_Channel6_IRQHandler + .thumb_set DMA1_Channel6_IRQHandler,Default_Handler + + .weak DMA1_Channel7_IRQHandler + .thumb_set DMA1_Channel7_IRQHandler,Default_Handler + + .weak ADC1_IRQHandler + .thumb_set ADC1_IRQHandler,Default_Handler + + .weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler + + .weak TIM1_BRK_TIM15_IRQHandler + .thumb_set TIM1_BRK_TIM15_IRQHandler,Default_Handler + + .weak TIM1_UP_TIM16_IRQHandler + .thumb_set TIM1_UP_TIM16_IRQHandler,Default_Handler + + .weak TIM1_TRG_COM_TIM17_IRQHandler + .thumb_set TIM1_TRG_COM_TIM17_IRQHandler,Default_Handler + + .weak TIM1_CC_IRQHandler + .thumb_set TIM1_CC_IRQHandler,Default_Handler + + .weak TIM2_IRQHandler + .thumb_set TIM2_IRQHandler,Default_Handler + + .weak TIM3_IRQHandler + .thumb_set TIM3_IRQHandler,Default_Handler + + .weak TIM4_IRQHandler + .thumb_set TIM4_IRQHandler,Default_Handler + + .weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler + + .weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler + + .weak I2C2_EV_IRQHandler + .thumb_set I2C2_EV_IRQHandler,Default_Handler + + .weak I2C2_ER_IRQHandler + .thumb_set I2C2_ER_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak SPI2_IRQHandler + .thumb_set SPI2_IRQHandler,Default_Handler + + .weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler + + .weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler + + .weak USART3_IRQHandler + .thumb_set USART3_IRQHandler,Default_Handler + + .weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler + + .weak RTCAlarm_IRQHandler + .thumb_set RTCAlarm_IRQHandler,Default_Handler + + .weak CEC_IRQHandler + .thumb_set CEC_IRQHandler,Default_Handler + + .weak TIM6_DAC_IRQHandler + .thumb_set TIM6_DAC_IRQHandler,Default_Handler + + .weak TIM7_IRQHandler + .thumb_set TIM7_IRQHandler,Default_Handler + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_xl.s b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_xl.s new file mode 100644 index 0000000..3d727a0 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_xl.s @@ -0,0 +1,465 @@ +/** + ****************************************************************************** + * @file startup_stm32f10x_xl.s + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief STM32F10x XL-Density Devices vector table for RIDE7 toolchain. + * This module performs: + * - Set the initial SP + * - Set the initial PC == Reset_Handler, + * - Set the vector table entries with the exceptions ISR address + * - Configure the clock system and the external SRAM mounted on + * STM3210E-EVAL board to be used as data memory (optional, + * to be enabled by user) + * - Branches to main in the C library (which eventually + * calls main()). + * After Reset the Cortex-M3 processor is in Thread mode, + * priority is Privileged, and the Stack is set to Main. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + + .syntax unified + .cpu cortex-m3 + .fpu softvfp + .thumb + +.global g_pfnVectors +.global Default_Handler + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss +/* stack used for SystemInit_ExtMemCtl; always internal RAM used */ + +.equ BootRAM, 0xF1E0F85F +/** + * @brief This is the code that gets called when the processor first + * starts execution following a reset event. Only the absolutely + * necessary set is performed, after which the application + * supplied main() routine is called. + * @param None + * @retval : None +*/ + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + +/* Copy the data segment initializers from flash to SRAM */ + movs r1, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r3, =_sidata + ldr r3, [r3, r1] + str r3, [r0, r1] + adds r1, r1, #4 + +LoopCopyDataInit: + ldr r0, =_sdata + ldr r3, =_edata + adds r2, r0, r1 + cmp r2, r3 + bcc CopyDataInit + ldr r2, =_sbss + b LoopFillZerobss +/* Zero fill the bss segment. */ +FillZerobss: + movs r3, #0 + str r3, [r2], #4 + +LoopFillZerobss: + ldr r3, = _ebss + cmp r2, r3 + bcc FillZerobss +/* Call the clock system intitialization function.*/ + bl SystemInit +/* Call the application's entry point.*/ + bl main + bx lr +.size Reset_Handler, .-Reset_Handler + +/** + * @brief This is the code that gets called when the processor receives an + * unexpected interrupt. This simply enters an infinite loop, preserving + * the system state for examination by a debugger. + * @param None + * @retval None +*/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + .size Default_Handler, .-Default_Handler +/****************************************************************************** +* +* The minimal vector table for a Cortex M3. Note that the proper constructs +* must be placed on this to ensure that it ends up at physical address +* 0x0000.0000. +* +*******************************************************************************/ + .section .isr_vector,"a",%progbits + .type g_pfnVectors, %object + .size g_pfnVectors, .-g_pfnVectors + + +g_pfnVectors: + .word _estack + .word Reset_Handler + .word NMI_Handler + .word HardFault_Handler + .word MemManage_Handler + .word BusFault_Handler + .word UsageFault_Handler + .word 0 + .word 0 + .word 0 + .word 0 + .word SVC_Handler + .word DebugMon_Handler + .word 0 + .word PendSV_Handler + .word SysTick_Handler + .word WWDG_IRQHandler + .word PVD_IRQHandler + .word TAMPER_IRQHandler + .word RTC_IRQHandler + .word FLASH_IRQHandler + .word RCC_IRQHandler + .word EXTI0_IRQHandler + .word EXTI1_IRQHandler + .word EXTI2_IRQHandler + .word EXTI3_IRQHandler + .word EXTI4_IRQHandler + .word DMA1_Channel1_IRQHandler + .word DMA1_Channel2_IRQHandler + .word DMA1_Channel3_IRQHandler + .word DMA1_Channel4_IRQHandler + .word DMA1_Channel5_IRQHandler + .word DMA1_Channel6_IRQHandler + .word DMA1_Channel7_IRQHandler + .word ADC1_2_IRQHandler + .word USB_HP_CAN1_TX_IRQHandler + .word USB_LP_CAN1_RX0_IRQHandler + .word CAN1_RX1_IRQHandler + .word CAN1_SCE_IRQHandler + .word EXTI9_5_IRQHandler + .word TIM1_BRK_TIM9_IRQHandler + .word TIM1_UP_TIM10_IRQHandler + .word TIM1_TRG_COM_TIM11_IRQHandler + .word TIM1_CC_IRQHandler + .word TIM2_IRQHandler + .word TIM3_IRQHandler + .word TIM4_IRQHandler + .word I2C1_EV_IRQHandler + .word I2C1_ER_IRQHandler + .word I2C2_EV_IRQHandler + .word I2C2_ER_IRQHandler + .word SPI1_IRQHandler + .word SPI2_IRQHandler + .word USART1_IRQHandler + .word USART2_IRQHandler + .word USART3_IRQHandler + .word EXTI15_10_IRQHandler + .word RTCAlarm_IRQHandler + .word USBWakeUp_IRQHandler + .word TIM8_BRK_TIM12_IRQHandler + .word TIM8_UP_TIM13_IRQHandler + .word TIM8_TRG_COM_TIM14_IRQHandler + .word TIM8_CC_IRQHandler + .word ADC3_IRQHandler + .word FSMC_IRQHandler + .word SDIO_IRQHandler + .word TIM5_IRQHandler + .word SPI3_IRQHandler + .word UART4_IRQHandler + .word UART5_IRQHandler + .word TIM6_IRQHandler + .word TIM7_IRQHandler + .word DMA2_Channel1_IRQHandler + .word DMA2_Channel2_IRQHandler + .word DMA2_Channel3_IRQHandler + .word DMA2_Channel4_5_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word BootRAM /* @0x1E0. This is for boot in RAM mode for + STM32F10x XL Density devices. */ +/******************************************************************************* +* +* Provide weak aliases for each Exception handler to the Default_Handler. +* As they are weak aliases, any function with the same name will override +* this definition. +* +*******************************************************************************/ + + .weak NMI_Handler + .thumb_set NMI_Handler,Default_Handler + + .weak HardFault_Handler + .thumb_set HardFault_Handler,Default_Handler + + .weak MemManage_Handler + .thumb_set MemManage_Handler,Default_Handler + + .weak BusFault_Handler + .thumb_set BusFault_Handler,Default_Handler + + .weak UsageFault_Handler + .thumb_set UsageFault_Handler,Default_Handler + + .weak SVC_Handler + .thumb_set SVC_Handler,Default_Handler + + .weak DebugMon_Handler + .thumb_set DebugMon_Handler,Default_Handler + + .weak PendSV_Handler + .thumb_set PendSV_Handler,Default_Handler + + .weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler + + .weak WWDG_IRQHandler + .thumb_set WWDG_IRQHandler,Default_Handler + + .weak PVD_IRQHandler + .thumb_set PVD_IRQHandler,Default_Handler + + .weak TAMPER_IRQHandler + .thumb_set TAMPER_IRQHandler,Default_Handler + + .weak RTC_IRQHandler + .thumb_set RTC_IRQHandler,Default_Handler + + .weak FLASH_IRQHandler + .thumb_set FLASH_IRQHandler,Default_Handler + + .weak RCC_IRQHandler + .thumb_set RCC_IRQHandler,Default_Handler + + .weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler + + .weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler + + .weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler + + .weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler + + .weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler + + .weak DMA1_Channel1_IRQHandler + .thumb_set DMA1_Channel1_IRQHandler,Default_Handler + + .weak DMA1_Channel2_IRQHandler + .thumb_set DMA1_Channel2_IRQHandler,Default_Handler + + .weak DMA1_Channel3_IRQHandler + .thumb_set DMA1_Channel3_IRQHandler,Default_Handler + + .weak DMA1_Channel4_IRQHandler + .thumb_set DMA1_Channel4_IRQHandler,Default_Handler + + .weak DMA1_Channel5_IRQHandler + .thumb_set DMA1_Channel5_IRQHandler,Default_Handler + + .weak DMA1_Channel6_IRQHandler + .thumb_set DMA1_Channel6_IRQHandler,Default_Handler + + .weak DMA1_Channel7_IRQHandler + .thumb_set DMA1_Channel7_IRQHandler,Default_Handler + + .weak ADC1_2_IRQHandler + .thumb_set ADC1_2_IRQHandler,Default_Handler + + .weak USB_HP_CAN1_TX_IRQHandler + .thumb_set USB_HP_CAN1_TX_IRQHandler,Default_Handler + + .weak USB_LP_CAN1_RX0_IRQHandler + .thumb_set USB_LP_CAN1_RX0_IRQHandler,Default_Handler + + .weak CAN1_RX1_IRQHandler + .thumb_set CAN1_RX1_IRQHandler,Default_Handler + + .weak CAN1_SCE_IRQHandler + .thumb_set CAN1_SCE_IRQHandler,Default_Handler + + .weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler + + .weak TIM1_BRK_TIM9_IRQHandler + .thumb_set TIM1_BRK_TIM9_IRQHandler,Default_Handler + + .weak TIM1_UP_TIM10_IRQHandler + .thumb_set TIM1_UP_TIM10_IRQHandler,Default_Handler + + .weak TIM1_TRG_COM_TIM11_IRQHandler + .thumb_set TIM1_TRG_COM_TIM11_IRQHandler,Default_Handler + + .weak TIM1_CC_IRQHandler + .thumb_set TIM1_CC_IRQHandler,Default_Handler + + .weak TIM2_IRQHandler + .thumb_set TIM2_IRQHandler,Default_Handler + + .weak TIM3_IRQHandler + .thumb_set TIM3_IRQHandler,Default_Handler + + .weak TIM4_IRQHandler + .thumb_set TIM4_IRQHandler,Default_Handler + + .weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler + + .weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler + + .weak I2C2_EV_IRQHandler + .thumb_set I2C2_EV_IRQHandler,Default_Handler + + .weak I2C2_ER_IRQHandler + .thumb_set I2C2_ER_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak SPI2_IRQHandler + .thumb_set SPI2_IRQHandler,Default_Handler + + .weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler + + .weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler + + .weak USART3_IRQHandler + .thumb_set USART3_IRQHandler,Default_Handler + + .weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler + + .weak RTCAlarm_IRQHandler + .thumb_set RTCAlarm_IRQHandler,Default_Handler + + .weak USBWakeUp_IRQHandler + .thumb_set USBWakeUp_IRQHandler,Default_Handler + + .weak TIM8_BRK_TIM12_IRQHandler + .thumb_set TIM8_BRK_TIM12_IRQHandler,Default_Handler + + .weak TIM8_UP_TIM13_IRQHandler + .thumb_set TIM8_UP_TIM13_IRQHandler,Default_Handler + + .weak TIM8_TRG_COM_TIM14_IRQHandler + .thumb_set TIM8_TRG_COM_TIM14_IRQHandler,Default_Handler + + .weak TIM8_CC_IRQHandler + .thumb_set TIM8_CC_IRQHandler,Default_Handler + + .weak ADC3_IRQHandler + .thumb_set ADC3_IRQHandler,Default_Handler + + .weak FSMC_IRQHandler + .thumb_set FSMC_IRQHandler,Default_Handler + + .weak SDIO_IRQHandler + .thumb_set SDIO_IRQHandler,Default_Handler + + .weak TIM5_IRQHandler + .thumb_set TIM5_IRQHandler,Default_Handler + + .weak SPI3_IRQHandler + .thumb_set SPI3_IRQHandler,Default_Handler + + .weak UART4_IRQHandler + .thumb_set UART4_IRQHandler,Default_Handler + + .weak UART5_IRQHandler + .thumb_set UART5_IRQHandler,Default_Handler + + .weak TIM6_IRQHandler + .thumb_set TIM6_IRQHandler,Default_Handler + + .weak TIM7_IRQHandler + .thumb_set TIM7_IRQHandler,Default_Handler + + .weak DMA2_Channel1_IRQHandler + .thumb_set DMA2_Channel1_IRQHandler,Default_Handler + + .weak DMA2_Channel2_IRQHandler + .thumb_set DMA2_Channel2_IRQHandler,Default_Handler + + .weak DMA2_Channel3_IRQHandler + .thumb_set DMA2_Channel3_IRQHandler,Default_Handler + + .weak DMA2_Channel4_5_IRQHandler + .thumb_set DMA2_Channel4_5_IRQHandler,Default_Handler + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/iar/startup_stm32f10x_cl.s b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/iar/startup_stm32f10x_cl.s new file mode 100644 index 0000000..55a7932 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/iar/startup_stm32f10x_cl.s @@ -0,0 +1,507 @@ +;******************** (C) COPYRIGHT 2011 STMicroelectronics ******************* +;* File Name : startup_stm32f10x_cl.s +;* Author : MCD Application Team +;* Version : V3.5.0 +;* Date : 11-March-2011 +;* Description : STM32F10x Connectivity line devices vector table for +;* EWARM toolchain. +;* This module performs: +;* - Set the initial SP +;* - Configure the clock system +;* - Set the initial PC == __iar_program_start, +;* - Set the vector table entries with the exceptions ISR +;* address. +;* After Reset the Cortex-M3 processor is in Thread mode, +;* priority is Privileged, and the Stack is set to Main. +;******************************************************************************** +;* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS +;* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. +;* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, +;* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE +;* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING +;* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. +;******************************************************************************* +; +; +; The modules in this file are included in the libraries, and may be replaced +; by any user-defined modules that define the PUBLIC symbol _program_start or +; a user defined start symbol. +; To override the cstartup defined in the library, simply add your modified +; version to the workbench project. +; +; The vector table is normally located at address 0. +; When debugging in RAM, it can be located in RAM, aligned to at least 2^6. +; The name "__vector_table" has special meaning for C-SPY: +; it is where the SP start value is found, and the NVIC vector +; table register (VTOR) is initialized to this address if != 0. +; +; Cortex-M version +; + + MODULE ?cstartup + + ;; Forward declaration of sections. + SECTION CSTACK:DATA:NOROOT(3) + + SECTION .intvec:CODE:NOROOT(2) + + EXTERN __iar_program_start + EXTERN SystemInit + PUBLIC __vector_table + + DATA +__vector_table + DCD sfe(CSTACK) + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WWDG_IRQHandler ; Window Watchdog + DCD PVD_IRQHandler ; PVD through EXTI Line detect + DCD TAMPER_IRQHandler ; Tamper + DCD RTC_IRQHandler ; RTC + DCD FLASH_IRQHandler ; Flash + DCD RCC_IRQHandler ; RCC + DCD EXTI0_IRQHandler ; EXTI Line 0 + DCD EXTI1_IRQHandler ; EXTI Line 1 + DCD EXTI2_IRQHandler ; EXTI Line 2 + DCD EXTI3_IRQHandler ; EXTI Line 3 + DCD EXTI4_IRQHandler ; EXTI Line 4 + DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 + DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 + DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 + DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 + DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 + DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 + DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 + DCD ADC1_2_IRQHandler ; ADC1 and ADC2 + DCD CAN1_TX_IRQHandler ; CAN1 TX + DCD CAN1_RX0_IRQHandler ; CAN1 RX0 + DCD CAN1_RX1_IRQHandler ; CAN1 RX1 + DCD CAN1_SCE_IRQHandler ; CAN1 SCE + DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 + DCD TIM1_BRK_IRQHandler ; TIM1 Break + DCD TIM1_UP_IRQHandler ; TIM1 Update + DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation + DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare + DCD TIM2_IRQHandler ; TIM2 + DCD TIM3_IRQHandler ; TIM3 + DCD TIM4_IRQHandler ; TIM4 + DCD I2C1_EV_IRQHandler ; I2C1 Event + DCD I2C1_ER_IRQHandler ; I2C1 Error + DCD I2C2_EV_IRQHandler ; I2C2 Event + DCD I2C2_ER_IRQHandler ; I2C1 Error + DCD SPI1_IRQHandler ; SPI1 + DCD SPI2_IRQHandler ; SPI2 + DCD USART1_IRQHandler ; USART1 + DCD USART2_IRQHandler ; USART2 + DCD USART3_IRQHandler ; USART3 + DCD EXTI15_10_IRQHandler ; EXTI Line 15..10 + DCD RTCAlarm_IRQHandler ; RTC alarm through EXTI line + DCD OTG_FS_WKUP_IRQHandler ; USB OTG FS Wakeup through EXTI line + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD TIM5_IRQHandler ; TIM5 + DCD SPI3_IRQHandler ; SPI3 + DCD UART4_IRQHandler ; UART4 + DCD UART5_IRQHandler ; UART5 + DCD TIM6_IRQHandler ; TIM6 + DCD TIM7_IRQHandler ; TIM7 + DCD DMA2_Channel1_IRQHandler ; DMA2 Channel1 + DCD DMA2_Channel2_IRQHandler ; DMA2 Channel2 + DCD DMA2_Channel3_IRQHandler ; DMA2 Channel3 + DCD DMA2_Channel4_IRQHandler ; DMA2 Channel4 + DCD DMA2_Channel5_IRQHandler ; DMA2 Channel5 + DCD ETH_IRQHandler ; Ethernet + DCD ETH_WKUP_IRQHandler ; Ethernet Wakeup through EXTI line + DCD CAN2_TX_IRQHandler ; CAN2 TX + DCD CAN2_RX0_IRQHandler ; CAN2 RX0 + DCD CAN2_RX1_IRQHandler ; CAN2 RX1 + DCD CAN2_SCE_IRQHandler ; CAN2 SCE + DCD OTG_FS_IRQHandler ; USB OTG FS + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Default interrupt handlers. +;; + THUMB + + PUBWEAK Reset_Handler + SECTION .text:CODE:REORDER(2) +Reset_Handler + LDR R0, =SystemInit + BLX R0 + LDR R0, =__iar_program_start + BX R0 + + PUBWEAK NMI_Handler + SECTION .text:CODE:REORDER(1) +NMI_Handler + B NMI_Handler + + PUBWEAK HardFault_Handler + SECTION .text:CODE:REORDER(1) +HardFault_Handler + B HardFault_Handler + + PUBWEAK MemManage_Handler + SECTION .text:CODE:REORDER(1) +MemManage_Handler + B MemManage_Handler + + PUBWEAK BusFault_Handler + SECTION .text:CODE:REORDER(1) +BusFault_Handler + B BusFault_Handler + + PUBWEAK UsageFault_Handler + SECTION .text:CODE:REORDER(1) +UsageFault_Handler + B UsageFault_Handler + + PUBWEAK SVC_Handler + SECTION .text:CODE:REORDER(1) +SVC_Handler + B SVC_Handler + + PUBWEAK DebugMon_Handler + SECTION .text:CODE:REORDER(1) +DebugMon_Handler + B DebugMon_Handler + + PUBWEAK PendSV_Handler + SECTION .text:CODE:REORDER(1) +PendSV_Handler + B PendSV_Handler + + PUBWEAK SysTick_Handler + SECTION .text:CODE:REORDER(1) +SysTick_Handler + B SysTick_Handler + + PUBWEAK WWDG_IRQHandler + SECTION .text:CODE:REORDER(1) +WWDG_IRQHandler + B WWDG_IRQHandler + + PUBWEAK PVD_IRQHandler + SECTION .text:CODE:REORDER(1) +PVD_IRQHandler + B PVD_IRQHandler + + PUBWEAK TAMPER_IRQHandler + SECTION .text:CODE:REORDER(1) +TAMPER_IRQHandler + B TAMPER_IRQHandler + + PUBWEAK RTC_IRQHandler + SECTION .text:CODE:REORDER(1) +RTC_IRQHandler + B RTC_IRQHandler + + PUBWEAK FLASH_IRQHandler + SECTION .text:CODE:REORDER(1) +FLASH_IRQHandler + B FLASH_IRQHandler + + PUBWEAK RCC_IRQHandler + SECTION .text:CODE:REORDER(1) +RCC_IRQHandler + B RCC_IRQHandler + + PUBWEAK EXTI0_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI0_IRQHandler + B EXTI0_IRQHandler + + PUBWEAK EXTI1_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI1_IRQHandler + B EXTI1_IRQHandler + + PUBWEAK EXTI2_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI2_IRQHandler + B EXTI2_IRQHandler + + PUBWEAK EXTI3_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI3_IRQHandler + B EXTI3_IRQHandler + + + PUBWEAK EXTI4_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI4_IRQHandler + B EXTI4_IRQHandler + + PUBWEAK DMA1_Channel1_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel1_IRQHandler + B DMA1_Channel1_IRQHandler + + PUBWEAK DMA1_Channel2_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel2_IRQHandler + B DMA1_Channel2_IRQHandler + + PUBWEAK DMA1_Channel3_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel3_IRQHandler + B DMA1_Channel3_IRQHandler + + PUBWEAK DMA1_Channel4_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel4_IRQHandler + B DMA1_Channel4_IRQHandler + + PUBWEAK DMA1_Channel5_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel5_IRQHandler + B DMA1_Channel5_IRQHandler + + PUBWEAK DMA1_Channel6_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel6_IRQHandler + B DMA1_Channel6_IRQHandler + + PUBWEAK DMA1_Channel7_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel7_IRQHandler + B DMA1_Channel7_IRQHandler + + PUBWEAK ADC1_2_IRQHandler + SECTION .text:CODE:REORDER(1) +ADC1_2_IRQHandler + B ADC1_2_IRQHandler + + PUBWEAK CAN1_TX_IRQHandler + SECTION .text:CODE:REORDER(1) +CAN1_TX_IRQHandler + B CAN1_TX_IRQHandler + + PUBWEAK CAN1_RX0_IRQHandler + SECTION .text:CODE:REORDER(1) +CAN1_RX0_IRQHandler + B CAN1_RX0_IRQHandler + + PUBWEAK CAN1_RX1_IRQHandler + SECTION .text:CODE:REORDER(1) +CAN1_RX1_IRQHandler + B CAN1_RX1_IRQHandler + + PUBWEAK CAN1_SCE_IRQHandler + SECTION .text:CODE:REORDER(1) +CAN1_SCE_IRQHandler + B CAN1_SCE_IRQHandler + + PUBWEAK EXTI9_5_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI9_5_IRQHandler + B EXTI9_5_IRQHandler + + PUBWEAK TIM1_BRK_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM1_BRK_IRQHandler + B TIM1_BRK_IRQHandler + + PUBWEAK TIM1_UP_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM1_UP_IRQHandler + B TIM1_UP_IRQHandler + + PUBWEAK TIM1_TRG_COM_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM1_TRG_COM_IRQHandler + B TIM1_TRG_COM_IRQHandler + + PUBWEAK TIM1_CC_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM1_CC_IRQHandler + B TIM1_CC_IRQHandler + + PUBWEAK TIM2_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM2_IRQHandler + B TIM2_IRQHandler + + PUBWEAK TIM3_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM3_IRQHandler + B TIM3_IRQHandler + + PUBWEAK TIM4_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM4_IRQHandler + B TIM4_IRQHandler + + PUBWEAK I2C1_EV_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C1_EV_IRQHandler + B I2C1_EV_IRQHandler + + PUBWEAK I2C1_ER_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C1_ER_IRQHandler + B I2C1_ER_IRQHandler + + PUBWEAK I2C2_EV_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C2_EV_IRQHandler + B I2C2_EV_IRQHandler + + PUBWEAK I2C2_ER_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C2_ER_IRQHandler + B I2C2_ER_IRQHandler + + PUBWEAK SPI1_IRQHandler + SECTION .text:CODE:REORDER(1) +SPI1_IRQHandler + B SPI1_IRQHandler + + PUBWEAK SPI2_IRQHandler + SECTION .text:CODE:REORDER(1) +SPI2_IRQHandler + B SPI2_IRQHandler + + PUBWEAK USART1_IRQHandler + SECTION .text:CODE:REORDER(1) +USART1_IRQHandler + B USART1_IRQHandler + + PUBWEAK USART2_IRQHandler + SECTION .text:CODE:REORDER(1) +USART2_IRQHandler + B USART2_IRQHandler + + PUBWEAK USART3_IRQHandler + SECTION .text:CODE:REORDER(1) +USART3_IRQHandler + B USART3_IRQHandler + + PUBWEAK EXTI15_10_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI15_10_IRQHandler + B EXTI15_10_IRQHandler + + PUBWEAK RTCAlarm_IRQHandler + SECTION .text:CODE:REORDER(1) +RTCAlarm_IRQHandler + B RTCAlarm_IRQHandler + + PUBWEAK OTG_FS_WKUP_IRQHandler + SECTION .text:CODE:REORDER(1) +OTG_FS_WKUP_IRQHandler + B OTG_FS_WKUP_IRQHandler + + PUBWEAK TIM5_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM5_IRQHandler + B TIM5_IRQHandler + + PUBWEAK SPI3_IRQHandler + SECTION .text:CODE:REORDER(1) +SPI3_IRQHandler + B SPI3_IRQHandler + + PUBWEAK UART4_IRQHandler + SECTION .text:CODE:REORDER(1) +UART4_IRQHandler + B UART4_IRQHandler + + PUBWEAK UART5_IRQHandler + SECTION .text:CODE:REORDER(1) +UART5_IRQHandler + B UART5_IRQHandler + + PUBWEAK TIM6_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM6_IRQHandler + B TIM6_IRQHandler + + PUBWEAK TIM7_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM7_IRQHandler + B TIM7_IRQHandler + + PUBWEAK DMA2_Channel1_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA2_Channel1_IRQHandler + B DMA2_Channel1_IRQHandler + + PUBWEAK DMA2_Channel2_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA2_Channel2_IRQHandler + B DMA2_Channel2_IRQHandler + + PUBWEAK DMA2_Channel3_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA2_Channel3_IRQHandler + B DMA2_Channel3_IRQHandler + + PUBWEAK DMA2_Channel4_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA2_Channel4_IRQHandler + B DMA2_Channel4_IRQHandler + + PUBWEAK DMA2_Channel5_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA2_Channel5_IRQHandler + B DMA2_Channel5_IRQHandler + + PUBWEAK ETH_IRQHandler + SECTION .text:CODE:REORDER(1) +ETH_IRQHandler + B ETH_IRQHandler + + PUBWEAK ETH_WKUP_IRQHandler + SECTION .text:CODE:REORDER(1) +ETH_WKUP_IRQHandler + B ETH_WKUP_IRQHandler + + PUBWEAK CAN2_TX_IRQHandler + SECTION .text:CODE:REORDER(1) +CAN2_TX_IRQHandler + B CAN2_TX_IRQHandler + + PUBWEAK CAN2_RX0_IRQHandler + SECTION .text:CODE:REORDER(1) +CAN2_RX0_IRQHandler + B CAN2_RX0_IRQHandler + + PUBWEAK CAN2_RX1_IRQHandler + SECTION .text:CODE:REORDER(1) +CAN2_RX1_IRQHandler + B CAN2_RX1_IRQHandler + + PUBWEAK CAN2_SCE_IRQHandler + SECTION .text:CODE:REORDER(1) +CAN2_SCE_IRQHandler + B CAN2_SCE_IRQHandler + + PUBWEAK OTG_FS_IRQHandler + SECTION .text:CODE:REORDER(1) +OTG_FS_IRQHandler + B OTG_FS_IRQHandler + + END +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/iar/startup_stm32f10x_hd.s b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/iar/startup_stm32f10x_hd.s new file mode 100644 index 0000000..37ee7a2 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/iar/startup_stm32f10x_hd.s @@ -0,0 +1,496 @@ +;******************** (C) COPYRIGHT 2011 STMicroelectronics ******************** +;* File Name : startup_stm32f10x_hd.s +;* Author : MCD Application Team +;* Version : V3.5.0 +;* Date : 11-March-2011 +;* Description : STM32F10x High Density Devices vector table for EWARM +;* toolchain. +;* This module performs: +;* - Set the initial SP +;* - Configure the clock system and the external SRAM +;* mounted on STM3210E-EVAL board to be used as data +;* memory (optional, to be enabled by user) +;* - Set the initial PC == __iar_program_start, +;* - Set the vector table entries with the exceptions ISR address, +;* After Reset the Cortex-M3 processor is in Thread mode, +;* priority is Privileged, and the Stack is set to Main. +;******************************************************************************** +;* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS +;* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. +;* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, +;* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE +;* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING +;* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. +;******************************************************************************* +; +; +; The modules in this file are included in the libraries, and may be replaced +; by any user-defined modules that define the PUBLIC symbol _program_start or +; a user defined start symbol. +; To override the cstartup defined in the library, simply add your modified +; version to the workbench project. +; +; The vector table is normally located at address 0. +; When debugging in RAM, it can be located in RAM, aligned to at least 2^6. +; The name "__vector_table" has special meaning for C-SPY: +; it is where the SP start value is found, and the NVIC vector +; table register (VTOR) is initialized to this address if != 0. +; +; Cortex-M version +; + + MODULE ?cstartup + + ;; Forward declaration of sections. + SECTION CSTACK:DATA:NOROOT(3) + + SECTION .intvec:CODE:NOROOT(2) + + EXTERN __iar_program_start + EXTERN SystemInit + PUBLIC __vector_table + + DATA + +__vector_table + DCD sfe(CSTACK) + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WWDG_IRQHandler ; Window Watchdog + DCD PVD_IRQHandler ; PVD through EXTI Line detect + DCD TAMPER_IRQHandler ; Tamper + DCD RTC_IRQHandler ; RTC + DCD FLASH_IRQHandler ; Flash + DCD RCC_IRQHandler ; RCC + DCD EXTI0_IRQHandler ; EXTI Line 0 + DCD EXTI1_IRQHandler ; EXTI Line 1 + DCD EXTI2_IRQHandler ; EXTI Line 2 + DCD EXTI3_IRQHandler ; EXTI Line 3 + DCD EXTI4_IRQHandler ; EXTI Line 4 + DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 + DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 + DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 + DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 + DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 + DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 + DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 + DCD ADC1_2_IRQHandler ; ADC1 & ADC2 + DCD USB_HP_CAN1_TX_IRQHandler ; USB High Priority or CAN1 TX + DCD USB_LP_CAN1_RX0_IRQHandler ; USB Low Priority or CAN1 RX0 + DCD CAN1_RX1_IRQHandler ; CAN1 RX1 + DCD CAN1_SCE_IRQHandler ; CAN1 SCE + DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 + DCD TIM1_BRK_IRQHandler ; TIM1 Break + DCD TIM1_UP_IRQHandler ; TIM1 Update + DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation + DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare + DCD TIM2_IRQHandler ; TIM2 + DCD TIM3_IRQHandler ; TIM3 + DCD TIM4_IRQHandler ; TIM4 + DCD I2C1_EV_IRQHandler ; I2C1 Event + DCD I2C1_ER_IRQHandler ; I2C1 Error + DCD I2C2_EV_IRQHandler ; I2C2 Event + DCD I2C2_ER_IRQHandler ; I2C2 Error + DCD SPI1_IRQHandler ; SPI1 + DCD SPI2_IRQHandler ; SPI2 + DCD USART1_IRQHandler ; USART1 + DCD USART2_IRQHandler ; USART2 + DCD USART3_IRQHandler ; USART3 + DCD EXTI15_10_IRQHandler ; EXTI Line 15..10 + DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line + DCD USBWakeUp_IRQHandler ; USB Wakeup from suspend + DCD TIM8_BRK_IRQHandler ; TIM8 Break + DCD TIM8_UP_IRQHandler ; TIM8 Update + DCD TIM8_TRG_COM_IRQHandler ; TIM8 Trigger and Commutation + DCD TIM8_CC_IRQHandler ; TIM8 Capture Compare + DCD ADC3_IRQHandler ; ADC3 + DCD FSMC_IRQHandler ; FSMC + DCD SDIO_IRQHandler ; SDIO + DCD TIM5_IRQHandler ; TIM5 + DCD SPI3_IRQHandler ; SPI3 + DCD UART4_IRQHandler ; UART4 + DCD UART5_IRQHandler ; UART5 + DCD TIM6_IRQHandler ; TIM6 + DCD TIM7_IRQHandler ; TIM7 + DCD DMA2_Channel1_IRQHandler ; DMA2 Channel1 + DCD DMA2_Channel2_IRQHandler ; DMA2 Channel2 + DCD DMA2_Channel3_IRQHandler ; DMA2 Channel3 + DCD DMA2_Channel4_5_IRQHandler ; DMA2 Channel4 & Channel5 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Default interrupt handlers. +;; + THUMB + + PUBWEAK Reset_Handler + SECTION .text:CODE:REORDER(2) +Reset_Handler + LDR R0, =SystemInit + BLX R0 + LDR R0, =__iar_program_start + BX R0 + + PUBWEAK NMI_Handler + SECTION .text:CODE:REORDER(1) +NMI_Handler + B NMI_Handler + + PUBWEAK HardFault_Handler + SECTION .text:CODE:REORDER(1) +HardFault_Handler + B HardFault_Handler + + PUBWEAK MemManage_Handler + SECTION .text:CODE:REORDER(1) +MemManage_Handler + B MemManage_Handler + + PUBWEAK BusFault_Handler + SECTION .text:CODE:REORDER(1) +BusFault_Handler + B BusFault_Handler + + PUBWEAK UsageFault_Handler + SECTION .text:CODE:REORDER(1) +UsageFault_Handler + B UsageFault_Handler + + PUBWEAK SVC_Handler + SECTION .text:CODE:REORDER(1) +SVC_Handler + B SVC_Handler + + PUBWEAK DebugMon_Handler + SECTION .text:CODE:REORDER(1) +DebugMon_Handler + B DebugMon_Handler + + PUBWEAK PendSV_Handler + SECTION .text:CODE:REORDER(1) +PendSV_Handler + B PendSV_Handler + + PUBWEAK SysTick_Handler + SECTION .text:CODE:REORDER(1) +SysTick_Handler + B SysTick_Handler + + PUBWEAK WWDG_IRQHandler + SECTION .text:CODE:REORDER(1) +WWDG_IRQHandler + B WWDG_IRQHandler + + PUBWEAK PVD_IRQHandler + SECTION .text:CODE:REORDER(1) +PVD_IRQHandler + B PVD_IRQHandler + + PUBWEAK TAMPER_IRQHandler + SECTION .text:CODE:REORDER(1) +TAMPER_IRQHandler + B TAMPER_IRQHandler + + PUBWEAK RTC_IRQHandler + SECTION .text:CODE:REORDER(1) +RTC_IRQHandler + B RTC_IRQHandler + + PUBWEAK FLASH_IRQHandler + SECTION .text:CODE:REORDER(1) +FLASH_IRQHandler + B FLASH_IRQHandler + + PUBWEAK RCC_IRQHandler + SECTION .text:CODE:REORDER(1) +RCC_IRQHandler + B RCC_IRQHandler + + PUBWEAK EXTI0_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI0_IRQHandler + B EXTI0_IRQHandler + + PUBWEAK EXTI1_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI1_IRQHandler + B EXTI1_IRQHandler + + PUBWEAK EXTI2_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI2_IRQHandler + B EXTI2_IRQHandler + + PUBWEAK EXTI3_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI3_IRQHandler + B EXTI3_IRQHandler + + PUBWEAK EXTI4_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI4_IRQHandler + B EXTI4_IRQHandler + + PUBWEAK DMA1_Channel1_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel1_IRQHandler + B DMA1_Channel1_IRQHandler + + PUBWEAK DMA1_Channel2_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel2_IRQHandler + B DMA1_Channel2_IRQHandler + + PUBWEAK DMA1_Channel3_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel3_IRQHandler + B DMA1_Channel3_IRQHandler + + PUBWEAK DMA1_Channel4_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel4_IRQHandler + B DMA1_Channel4_IRQHandler + + PUBWEAK DMA1_Channel5_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel5_IRQHandler + B DMA1_Channel5_IRQHandler + + PUBWEAK DMA1_Channel6_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel6_IRQHandler + B DMA1_Channel6_IRQHandler + + PUBWEAK DMA1_Channel7_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel7_IRQHandler + B DMA1_Channel7_IRQHandler + + PUBWEAK ADC1_2_IRQHandler + SECTION .text:CODE:REORDER(1) +ADC1_2_IRQHandler + B ADC1_2_IRQHandler + + PUBWEAK USB_HP_CAN1_TX_IRQHandler + SECTION .text:CODE:REORDER(1) +USB_HP_CAN1_TX_IRQHandler + B USB_HP_CAN1_TX_IRQHandler + + PUBWEAK USB_LP_CAN1_RX0_IRQHandler + SECTION .text:CODE:REORDER(1) +USB_LP_CAN1_RX0_IRQHandler + B USB_LP_CAN1_RX0_IRQHandler + + PUBWEAK CAN1_RX1_IRQHandler + SECTION .text:CODE:REORDER(1) +CAN1_RX1_IRQHandler + B CAN1_RX1_IRQHandler + + PUBWEAK CAN1_SCE_IRQHandler + SECTION .text:CODE:REORDER(1) +CAN1_SCE_IRQHandler + B CAN1_SCE_IRQHandler + + PUBWEAK EXTI9_5_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI9_5_IRQHandler + B EXTI9_5_IRQHandler + + PUBWEAK TIM1_BRK_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM1_BRK_IRQHandler + B TIM1_BRK_IRQHandler + + PUBWEAK TIM1_UP_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM1_UP_IRQHandler + B TIM1_UP_IRQHandler + + PUBWEAK TIM1_TRG_COM_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM1_TRG_COM_IRQHandler + B TIM1_TRG_COM_IRQHandler + + PUBWEAK TIM1_CC_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM1_CC_IRQHandler + B TIM1_CC_IRQHandler + + PUBWEAK TIM2_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM2_IRQHandler + B TIM2_IRQHandler + + PUBWEAK TIM3_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM3_IRQHandler + B TIM3_IRQHandler + + PUBWEAK TIM4_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM4_IRQHandler + B TIM4_IRQHandler + + PUBWEAK I2C1_EV_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C1_EV_IRQHandler + B I2C1_EV_IRQHandler + + PUBWEAK I2C1_ER_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C1_ER_IRQHandler + B I2C1_ER_IRQHandler + + PUBWEAK I2C2_EV_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C2_EV_IRQHandler + B I2C2_EV_IRQHandler + + PUBWEAK I2C2_ER_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C2_ER_IRQHandler + B I2C2_ER_IRQHandler + + PUBWEAK SPI1_IRQHandler + SECTION .text:CODE:REORDER(1) +SPI1_IRQHandler + B SPI1_IRQHandler + + PUBWEAK SPI2_IRQHandler + SECTION .text:CODE:REORDER(1) +SPI2_IRQHandler + B SPI2_IRQHandler + + PUBWEAK USART1_IRQHandler + SECTION .text:CODE:REORDER(1) +USART1_IRQHandler + B USART1_IRQHandler + + PUBWEAK USART2_IRQHandler + SECTION .text:CODE:REORDER(1) +USART2_IRQHandler + B USART2_IRQHandler + + PUBWEAK USART3_IRQHandler + SECTION .text:CODE:REORDER(1) +USART3_IRQHandler + B USART3_IRQHandler + + PUBWEAK EXTI15_10_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI15_10_IRQHandler + B EXTI15_10_IRQHandler + + PUBWEAK RTCAlarm_IRQHandler + SECTION .text:CODE:REORDER(1) +RTCAlarm_IRQHandler + B RTCAlarm_IRQHandler + + PUBWEAK USBWakeUp_IRQHandler + SECTION .text:CODE:REORDER(1) +USBWakeUp_IRQHandler + B USBWakeUp_IRQHandler + + PUBWEAK TIM8_BRK_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM8_BRK_IRQHandler + B TIM8_BRK_IRQHandler + + PUBWEAK TIM8_UP_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM8_UP_IRQHandler + B TIM8_UP_IRQHandler + + PUBWEAK TIM8_TRG_COM_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM8_TRG_COM_IRQHandler + B TIM8_TRG_COM_IRQHandler + + PUBWEAK TIM8_CC_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM8_CC_IRQHandler + B TIM8_CC_IRQHandler + + PUBWEAK ADC3_IRQHandler + SECTION .text:CODE:REORDER(1) +ADC3_IRQHandler + B ADC3_IRQHandler + + PUBWEAK FSMC_IRQHandler + SECTION .text:CODE:REORDER(1) +FSMC_IRQHandler + B FSMC_IRQHandler + + PUBWEAK SDIO_IRQHandler + SECTION .text:CODE:REORDER(1) +SDIO_IRQHandler + B SDIO_IRQHandler + + PUBWEAK TIM5_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM5_IRQHandler + B TIM5_IRQHandler + + PUBWEAK SPI3_IRQHandler + SECTION .text:CODE:REORDER(1) +SPI3_IRQHandler + B SPI3_IRQHandler + + PUBWEAK UART4_IRQHandler + SECTION .text:CODE:REORDER(1) +UART4_IRQHandler + B UART4_IRQHandler + + PUBWEAK UART5_IRQHandler + SECTION .text:CODE:REORDER(1) +UART5_IRQHandler + B UART5_IRQHandler + + PUBWEAK TIM6_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM6_IRQHandler + B TIM6_IRQHandler + + PUBWEAK TIM7_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM7_IRQHandler + B TIM7_IRQHandler + + PUBWEAK DMA2_Channel1_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA2_Channel1_IRQHandler + B DMA2_Channel1_IRQHandler + + PUBWEAK DMA2_Channel2_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA2_Channel2_IRQHandler + B DMA2_Channel2_IRQHandler + + PUBWEAK DMA2_Channel3_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA2_Channel3_IRQHandler + B DMA2_Channel3_IRQHandler + + PUBWEAK DMA2_Channel4_5_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA2_Channel4_5_IRQHandler + B DMA2_Channel4_5_IRQHandler + + + END + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/iar/startup_stm32f10x_hd_vl.s b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/iar/startup_stm32f10x_hd_vl.s new file mode 100644 index 0000000..33f592f --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/iar/startup_stm32f10x_hd_vl.s @@ -0,0 +1,461 @@ +;******************** (C) COPYRIGHT 2011 STMicroelectronics ******************** +;* File Name : startup_stm32f10x_hd_vl.s +;* Author : MCD Application Team +;* Version : V3.5.0 +;* Date : 11-March-2011 +;* Description : STM32F10x High Density Value Line Devices vector table +;* for EWARM toolchain. +;* This module performs: +;* - Set the initial SP +;* - Configure the clock system and the external SRAM +;* mounted on STM32100E-EVAL board to be used as data +;* memory (optional, to be enabled by user) +;* - Set the initial PC == __iar_program_start, +;* - Set the vector table entries with the exceptions ISR +;* address. +;* After Reset the Cortex-M3 processor is in Thread mode, +;* priority is Privileged, and the Stack is set to Main. +;******************************************************************************** +;* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS +;* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. +;* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, +;* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE +;* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING +;* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. +;******************************************************************************* +; +; +; The modules in this file are included in the libraries, and may be replaced +; by any user-defined modules that define the PUBLIC symbol _program_start or +; a user defined start symbol. +; To override the cstartup defined in the library, simply add your modified +; version to the workbench project. +; +; The vector table is normally located at address 0. +; When debugging in RAM, it can be located in RAM, aligned to at least 2^6. +; The name "__vector_table" has special meaning for C-SPY: +; it is where the SP start value is found, and the NVIC vector +; table register (VTOR) is initialized to this address if != 0. +; +; Cortex-M version +; + + MODULE ?cstartup + + ;; Forward declaration of sections. + SECTION CSTACK:DATA:NOROOT(3) + + SECTION .intvec:CODE:NOROOT(2) + + EXTERN __iar_program_start + EXTERN SystemInit + PUBLIC __vector_table + + DATA +__vector_table + DCD sfe(CSTACK) + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WWDG_IRQHandler ; Window Watchdog + DCD PVD_IRQHandler ; PVD through EXTI Line detect + DCD TAMPER_IRQHandler ; Tamper + DCD RTC_IRQHandler ; RTC + DCD FLASH_IRQHandler ; Flash + DCD RCC_IRQHandler ; RCC + DCD EXTI0_IRQHandler ; EXTI Line 0 + DCD EXTI1_IRQHandler ; EXTI Line 1 + DCD EXTI2_IRQHandler ; EXTI Line 2 + DCD EXTI3_IRQHandler ; EXTI Line 3 + DCD EXTI4_IRQHandler ; EXTI Line 4 + DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 + DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 + DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 + DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 + DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 + DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 + DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 + DCD ADC1_IRQHandler ; ADC1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 + DCD TIM1_BRK_TIM15_IRQHandler ; TIM1 Break and TIM15 + DCD TIM1_UP_TIM16_IRQHandler ; TIM1 Update and TIM16 + DCD TIM1_TRG_COM_TIM17_IRQHandler ; TIM1 Trigger and Commutation and TIM17 + DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare + DCD TIM2_IRQHandler ; TIM2 + DCD TIM3_IRQHandler ; TIM3 + DCD TIM4_IRQHandler ; TIM4 + DCD I2C1_EV_IRQHandler ; I2C1 Event + DCD I2C1_ER_IRQHandler ; I2C1 Error + DCD I2C2_EV_IRQHandler ; I2C2 Event + DCD I2C2_ER_IRQHandler ; I2C2 Error + DCD SPI1_IRQHandler ; SPI1 + DCD SPI2_IRQHandler ; SPI2 + DCD USART1_IRQHandler ; USART1 + DCD USART2_IRQHandler ; USART2 + DCD USART3_IRQHandler ; USART3 + DCD EXTI15_10_IRQHandler ; EXTI Line 15..10 + DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line + DCD CEC_IRQHandler ; HDMI-CEC + DCD TIM12_IRQHandler ; TIM12 + DCD TIM13_IRQHandler ; TIM13 + DCD TIM14_IRQHandler ; TIM14 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD TIM5_IRQHandler ; TIM5 + DCD SPI3_IRQHandler ; SPI3 + DCD UART4_IRQHandler ; UART4 + DCD UART5_IRQHandler ; UART5 + DCD TIM6_DAC_IRQHandler ; TIM6 and DAC underrun + DCD TIM7_IRQHandler ; TIM7 + DCD DMA2_Channel1_IRQHandler ; DMA2 Channel1 + DCD DMA2_Channel2_IRQHandler ; DMA2 Channel2 + DCD DMA2_Channel3_IRQHandler ; DMA2 Channel3 + DCD DMA2_Channel4_5_IRQHandler ; DMA2 Channel4 & Channel5 + DCD DMA2_Channel5_IRQHandler ; DMA2 Channel5 + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Default interrupt handlers. +;; + THUMB + + PUBWEAK Reset_Handler + SECTION .text:CODE:REORDER(2) +Reset_Handler + LDR R0, =SystemInit + BLX R0 + LDR R0, =__iar_program_start + BX R0 + + PUBWEAK NMI_Handler + SECTION .text:CODE:REORDER(1) +NMI_Handler + B NMI_Handler + + PUBWEAK HardFault_Handler + SECTION .text:CODE:REORDER(1) +HardFault_Handler + B HardFault_Handler + + PUBWEAK MemManage_Handler + SECTION .text:CODE:REORDER(1) +MemManage_Handler + B MemManage_Handler + + PUBWEAK BusFault_Handler + SECTION .text:CODE:REORDER(1) +BusFault_Handler + B BusFault_Handler + + PUBWEAK UsageFault_Handler + SECTION .text:CODE:REORDER(1) +UsageFault_Handler + B UsageFault_Handler + + PUBWEAK SVC_Handler + SECTION .text:CODE:REORDER(1) +SVC_Handler + B SVC_Handler + + PUBWEAK DebugMon_Handler + SECTION .text:CODE:REORDER(1) +DebugMon_Handler + B DebugMon_Handler + + PUBWEAK PendSV_Handler + SECTION .text:CODE:REORDER(1) +PendSV_Handler + B PendSV_Handler + + PUBWEAK SysTick_Handler + SECTION .text:CODE:REORDER(1) +SysTick_Handler + B SysTick_Handler + + PUBWEAK WWDG_IRQHandler + SECTION .text:CODE:REORDER(1) +WWDG_IRQHandler + B WWDG_IRQHandler + + PUBWEAK PVD_IRQHandler + SECTION .text:CODE:REORDER(1) +PVD_IRQHandler + B PVD_IRQHandler + + PUBWEAK TAMPER_IRQHandler + SECTION .text:CODE:REORDER(1) +TAMPER_IRQHandler + B TAMPER_IRQHandler + + PUBWEAK RTC_IRQHandler + SECTION .text:CODE:REORDER(1) +RTC_IRQHandler + B RTC_IRQHandler + + PUBWEAK FLASH_IRQHandler + SECTION .text:CODE:REORDER(1) +FLASH_IRQHandler + B FLASH_IRQHandler + + PUBWEAK RCC_IRQHandler + SECTION .text:CODE:REORDER(1) +RCC_IRQHandler + B RCC_IRQHandler + + PUBWEAK EXTI0_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI0_IRQHandler + B EXTI0_IRQHandler + + PUBWEAK EXTI1_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI1_IRQHandler + B EXTI1_IRQHandler + + PUBWEAK EXTI2_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI2_IRQHandler + B EXTI2_IRQHandler + + PUBWEAK EXTI3_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI3_IRQHandler + B EXTI3_IRQHandler + + PUBWEAK EXTI4_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI4_IRQHandler + B EXTI4_IRQHandler + + PUBWEAK DMA1_Channel1_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel1_IRQHandler + B DMA1_Channel1_IRQHandler + + PUBWEAK DMA1_Channel2_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel2_IRQHandler + B DMA1_Channel2_IRQHandler + + PUBWEAK DMA1_Channel3_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel3_IRQHandler + B DMA1_Channel3_IRQHandler + + PUBWEAK DMA1_Channel4_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel4_IRQHandler + B DMA1_Channel4_IRQHandler + + PUBWEAK DMA1_Channel5_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel5_IRQHandler + B DMA1_Channel5_IRQHandler + + PUBWEAK DMA1_Channel6_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel6_IRQHandler + B DMA1_Channel6_IRQHandler + + PUBWEAK DMA1_Channel7_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel7_IRQHandler + B DMA1_Channel7_IRQHandler + + PUBWEAK ADC1_IRQHandler + SECTION .text:CODE:REORDER(1) +ADC1_IRQHandler + B ADC1_IRQHandler + + PUBWEAK EXTI9_5_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI9_5_IRQHandler + B EXTI9_5_IRQHandler + + PUBWEAK TIM1_BRK_TIM15_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM1_BRK_TIM15_IRQHandler + B TIM1_BRK_TIM15_IRQHandler + + PUBWEAK TIM1_UP_TIM16_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM1_UP_TIM16_IRQHandler + B TIM1_UP_TIM16_IRQHandler + + PUBWEAK TIM1_TRG_COM_TIM17_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM1_TRG_COM_TIM17_IRQHandler + B TIM1_TRG_COM_TIM17_IRQHandler + + PUBWEAK TIM1_CC_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM1_CC_IRQHandler + B TIM1_CC_IRQHandler + + PUBWEAK TIM2_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM2_IRQHandler + B TIM2_IRQHandler + + PUBWEAK TIM3_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM3_IRQHandler + B TIM3_IRQHandler + + PUBWEAK TIM4_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM4_IRQHandler + B TIM4_IRQHandler + + PUBWEAK I2C1_EV_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C1_EV_IRQHandler + B I2C1_EV_IRQHandler + + PUBWEAK I2C1_ER_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C1_ER_IRQHandler + B I2C1_ER_IRQHandler + + PUBWEAK I2C2_EV_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C2_EV_IRQHandler + B I2C2_EV_IRQHandler + + PUBWEAK I2C2_ER_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C2_ER_IRQHandler + B I2C2_ER_IRQHandler + + PUBWEAK SPI1_IRQHandler + SECTION .text:CODE:REORDER(1) +SPI1_IRQHandler + B SPI1_IRQHandler + + PUBWEAK SPI2_IRQHandler + SECTION .text:CODE:REORDER(1) +SPI2_IRQHandler + B SPI2_IRQHandler + + PUBWEAK USART1_IRQHandler + SECTION .text:CODE:REORDER(1) +USART1_IRQHandler + B USART1_IRQHandler + + PUBWEAK USART2_IRQHandler + SECTION .text:CODE:REORDER(1) +USART2_IRQHandler + B USART2_IRQHandler + + PUBWEAK USART3_IRQHandler + SECTION .text:CODE:REORDER(1) +USART3_IRQHandler + B USART3_IRQHandler + + PUBWEAK EXTI15_10_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI15_10_IRQHandler + B EXTI15_10_IRQHandler + + PUBWEAK RTCAlarm_IRQHandler + SECTION .text:CODE:REORDER(1) +RTCAlarm_IRQHandler + B RTCAlarm_IRQHandler + + PUBWEAK CEC_IRQHandler + SECTION .text:CODE:REORDER(1) +CEC_IRQHandler + B CEC_IRQHandler + + PUBWEAK TIM12_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM12_IRQHandler + B TIM12_IRQHandler + + PUBWEAK TIM13_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM13_IRQHandler + B TIM13_IRQHandler + + PUBWEAK TIM14_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM14_IRQHandler + B TIM14_IRQHandler + + PUBWEAK TIM5_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM5_IRQHandler + B TIM5_IRQHandler + + PUBWEAK SPI3_IRQHandler + SECTION .text:CODE:REORDER(1) +SPI3_IRQHandler + B SPI3_IRQHandler + + PUBWEAK UART4_IRQHandler + SECTION .text:CODE:REORDER(1) +UART4_IRQHandler + B UART4_IRQHandler + + PUBWEAK UART5_IRQHandler + SECTION .text:CODE:REORDER(1) +UART5_IRQHandler + B UART5_IRQHandler + + PUBWEAK TIM6_DAC_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM6_DAC_IRQHandler + B TIM6_DAC_IRQHandler + + PUBWEAK TIM7_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM7_IRQHandler + B TIM7_IRQHandler + + PUBWEAK DMA2_Channel1_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA2_Channel1_IRQHandler + B DMA2_Channel1_IRQHandler + + PUBWEAK DMA2_Channel2_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA2_Channel2_IRQHandler + B DMA2_Channel2_IRQHandler + + PUBWEAK DMA2_Channel3_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA2_Channel3_IRQHandler + B DMA2_Channel3_IRQHandler + + PUBWEAK DMA2_Channel4_5_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA2_Channel4_5_IRQHandler + B DMA2_Channel4_5_IRQHandler + + PUBWEAK DMA2_Channel5_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA2_Channel5_IRQHandler + B DMA2_Channel5_IRQHandler + + END +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/iar/startup_stm32f10x_ld.s b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/iar/startup_stm32f10x_ld.s new file mode 100644 index 0000000..e2b2b4d --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/iar/startup_stm32f10x_ld.s @@ -0,0 +1,366 @@ +;******************** (C) COPYRIGHT 2011 STMicroelectronics ******************** +;* File Name : startup_stm32f10x_ld.s +;* Author : MCD Application Team +;* Version : V3.5.0 +;* Date : 11-March-2011 +;* Description : STM32F10x Low Density Devices vector table for EWARM +;* toolchain. +;* This module performs: +;* - Set the initial SP +;* - Configure the clock system +;* - Set the initial PC == __iar_program_start, +;* - Set the vector table entries with the exceptions ISR +;* address. +;* After Reset the Cortex-M3 processor is in Thread mode, +;* priority is Privileged, and the Stack is set to Main. +;******************************************************************************** +;* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS +;* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. +;* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, +;* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE +;* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING +;* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. +;******************************************************************************* +; +; +; The modules in this file are included in the libraries, and may be replaced +; by any user-defined modules that define the PUBLIC symbol _program_start or +; a user defined start symbol. +; To override the cstartup defined in the library, simply add your modified +; version to the workbench project. +; +; The vector table is normally located at address 0. +; When debugging in RAM, it can be located in RAM, aligned to at least 2^6. +; The name "__vector_table" has special meaning for C-SPY: +; it is where the SP start value is found, and the NVIC vector +; table register (VTOR) is initialized to this address if != 0. +; +; Cortex-M version +; + + MODULE ?cstartup + + ;; Forward declaration of sections. + SECTION CSTACK:DATA:NOROOT(3) + + SECTION .intvec:CODE:NOROOT(2) + + EXTERN __iar_program_start + EXTERN SystemInit + PUBLIC __vector_table + + DATA +__vector_table + DCD sfe(CSTACK) + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WWDG_IRQHandler ; Window Watchdog + DCD PVD_IRQHandler ; PVD through EXTI Line detect + DCD TAMPER_IRQHandler ; Tamper + DCD RTC_IRQHandler ; RTC + DCD FLASH_IRQHandler ; Flash + DCD RCC_IRQHandler ; RCC + DCD EXTI0_IRQHandler ; EXTI Line 0 + DCD EXTI1_IRQHandler ; EXTI Line 1 + DCD EXTI2_IRQHandler ; EXTI Line 2 + DCD EXTI3_IRQHandler ; EXTI Line 3 + DCD EXTI4_IRQHandler ; EXTI Line 4 + DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 + DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 + DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 + DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 + DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 + DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 + DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 + DCD ADC1_2_IRQHandler ; ADC1 & ADC2 + DCD USB_HP_CAN1_TX_IRQHandler ; USB High Priority or CAN1 TX + DCD USB_LP_CAN1_RX0_IRQHandler ; USB Low Priority or CAN1 RX0 + DCD CAN1_RX1_IRQHandler ; CAN1 RX1 + DCD CAN1_SCE_IRQHandler ; CAN1 SCE + DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 + DCD TIM1_BRK_IRQHandler ; TIM1 Break + DCD TIM1_UP_IRQHandler ; TIM1 Update + DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation + DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare + DCD TIM2_IRQHandler ; TIM2 + DCD TIM3_IRQHandler ; TIM3 + DCD 0 ; Reserved + DCD I2C1_EV_IRQHandler ; I2C1 Event + DCD I2C1_ER_IRQHandler ; I2C1 Error + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SPI1_IRQHandler ; SPI1 + DCD 0 ; Reserved + DCD USART1_IRQHandler ; USART1 + DCD USART2_IRQHandler ; USART2 + DCD 0 ; Reserved + DCD EXTI15_10_IRQHandler ; EXTI Line 15..10 + DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line + DCD USBWakeUp_IRQHandler ; USB Wakeup from suspend + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Default interrupt handlers. +;; + THUMB + + PUBWEAK Reset_Handler + SECTION .text:CODE:REORDER(2) +Reset_Handler + LDR R0, =SystemInit + BLX R0 + LDR R0, =__iar_program_start + BX R0 + + PUBWEAK NMI_Handler + SECTION .text:CODE:REORDER(1) +NMI_Handler + B NMI_Handler + + PUBWEAK HardFault_Handler + SECTION .text:CODE:REORDER(1) +HardFault_Handler + B HardFault_Handler + + PUBWEAK MemManage_Handler + SECTION .text:CODE:REORDER(1) +MemManage_Handler + B MemManage_Handler + + PUBWEAK BusFault_Handler + SECTION .text:CODE:REORDER(1) +BusFault_Handler + B BusFault_Handler + + PUBWEAK UsageFault_Handler + SECTION .text:CODE:REORDER(1) +UsageFault_Handler + B UsageFault_Handler + + PUBWEAK SVC_Handler + SECTION .text:CODE:REORDER(1) +SVC_Handler + B SVC_Handler + + PUBWEAK DebugMon_Handler + SECTION .text:CODE:REORDER(1) +DebugMon_Handler + B DebugMon_Handler + + PUBWEAK PendSV_Handler + SECTION .text:CODE:REORDER(1) +PendSV_Handler + B PendSV_Handler + + PUBWEAK SysTick_Handler + SECTION .text:CODE:REORDER(1) +SysTick_Handler + B SysTick_Handler + + PUBWEAK WWDG_IRQHandler + SECTION .text:CODE:REORDER(1) +WWDG_IRQHandler + B WWDG_IRQHandler + + PUBWEAK PVD_IRQHandler + SECTION .text:CODE:REORDER(1) +PVD_IRQHandler + B PVD_IRQHandler + + PUBWEAK TAMPER_IRQHandler + SECTION .text:CODE:REORDER(1) +TAMPER_IRQHandler + B TAMPER_IRQHandler + + PUBWEAK RTC_IRQHandler + SECTION .text:CODE:REORDER(1) +RTC_IRQHandler + B RTC_IRQHandler + + PUBWEAK FLASH_IRQHandler + SECTION .text:CODE:REORDER(1) +FLASH_IRQHandler + B FLASH_IRQHandler + + PUBWEAK RCC_IRQHandler + SECTION .text:CODE:REORDER(1) +RCC_IRQHandler + B RCC_IRQHandler + + PUBWEAK EXTI0_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI0_IRQHandler + B EXTI0_IRQHandler + + PUBWEAK EXTI1_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI1_IRQHandler + B EXTI1_IRQHandler + + PUBWEAK EXTI2_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI2_IRQHandler + B EXTI2_IRQHandler + + PUBWEAK EXTI3_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI3_IRQHandler + B EXTI3_IRQHandler + + PUBWEAK EXTI4_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI4_IRQHandler + B EXTI4_IRQHandler + + PUBWEAK DMA1_Channel1_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel1_IRQHandler + B DMA1_Channel1_IRQHandler + + PUBWEAK DMA1_Channel2_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel2_IRQHandler + B DMA1_Channel2_IRQHandler + + PUBWEAK DMA1_Channel3_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel3_IRQHandler + B DMA1_Channel3_IRQHandler + + PUBWEAK DMA1_Channel4_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel4_IRQHandler + B DMA1_Channel4_IRQHandler + + PUBWEAK DMA1_Channel5_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel5_IRQHandler + B DMA1_Channel5_IRQHandler + + PUBWEAK DMA1_Channel6_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel6_IRQHandler + B DMA1_Channel6_IRQHandler + + PUBWEAK DMA1_Channel7_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel7_IRQHandler + B DMA1_Channel7_IRQHandler + + PUBWEAK ADC1_2_IRQHandler + SECTION .text:CODE:REORDER(1) +ADC1_2_IRQHandler + B ADC1_2_IRQHandler + + PUBWEAK USB_HP_CAN1_TX_IRQHandler + SECTION .text:CODE:REORDER(1) +USB_HP_CAN1_TX_IRQHandler + B USB_HP_CAN1_TX_IRQHandler + + PUBWEAK USB_LP_CAN1_RX0_IRQHandler + SECTION .text:CODE:REORDER(1) +USB_LP_CAN1_RX0_IRQHandler + B USB_LP_CAN1_RX0_IRQHandler + + PUBWEAK CAN1_RX1_IRQHandler + SECTION .text:CODE:REORDER(1) +CAN1_RX1_IRQHandler + B CAN1_RX1_IRQHandler + + PUBWEAK CAN1_SCE_IRQHandler + SECTION .text:CODE:REORDER(1) +CAN1_SCE_IRQHandler + B CAN1_SCE_IRQHandler + + PUBWEAK EXTI9_5_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI9_5_IRQHandler + B EXTI9_5_IRQHandler + + PUBWEAK TIM1_BRK_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM1_BRK_IRQHandler + B TIM1_BRK_IRQHandler + + PUBWEAK TIM1_UP_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM1_UP_IRQHandler + B TIM1_UP_IRQHandler + + PUBWEAK TIM1_TRG_COM_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM1_TRG_COM_IRQHandler + B TIM1_TRG_COM_IRQHandler + + PUBWEAK TIM1_CC_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM1_CC_IRQHandler + B TIM1_CC_IRQHandler + + PUBWEAK TIM2_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM2_IRQHandler + B TIM2_IRQHandler + + PUBWEAK TIM3_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM3_IRQHandler + B TIM3_IRQHandler + + PUBWEAK I2C1_EV_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C1_EV_IRQHandler + B I2C1_EV_IRQHandler + + PUBWEAK I2C1_ER_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C1_ER_IRQHandler + B I2C1_ER_IRQHandler + + PUBWEAK SPI1_IRQHandler + SECTION .text:CODE:REORDER(1) +SPI1_IRQHandler + B SPI1_IRQHandler + + PUBWEAK USART1_IRQHandler + SECTION .text:CODE:REORDER(1) +USART1_IRQHandler + B USART1_IRQHandler + + PUBWEAK USART2_IRQHandler + SECTION .text:CODE:REORDER(1) +USART2_IRQHandler + B USART2_IRQHandler + + PUBWEAK EXTI15_10_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI15_10_IRQHandler + B EXTI15_10_IRQHandler + + PUBWEAK RTCAlarm_IRQHandler + SECTION .text:CODE:REORDER(1) +RTCAlarm_IRQHandler + B RTCAlarm_IRQHandler + + PUBWEAK USBWakeUp_IRQHandler + SECTION .text:CODE:REORDER(1) +USBWakeUp_IRQHandler + B USBWakeUp_IRQHandler + + END +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/iar/startup_stm32f10x_ld_vl.s b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/iar/startup_stm32f10x_ld_vl.s new file mode 100644 index 0000000..a4a4933 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/iar/startup_stm32f10x_ld_vl.s @@ -0,0 +1,369 @@ +;******************** (C) COPYRIGHT 2011 STMicroelectronics ******************** +;* File Name : startup_stm32f10x_ld_vl.s +;* Author : MCD Application Team +;* Version : V3.5.0 +;* Date : 11-March-2011 +;* Description : STM32F10x Low Density Value Line Devices vector table +;* for EWARM toolchain. +;* This module performs: +;* - Set the initial SP +;* - Configure the clock system +;* - Set the initial PC == __iar_program_start, +;* - Set the vector table entries with the exceptions ISR +;* address. +;* After Reset the Cortex-M3 processor is in Thread mode, +;* priority is Privileged, and the Stack is set to Main. +;******************************************************************************** +;* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS +;* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. +;* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, +;* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE +;* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING +;* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. +;******************************************************************************* +; +; +; The modules in this file are included in the libraries, and may be replaced +; by any user-defined modules that define the PUBLIC symbol _program_start or +; a user defined start symbol. +; To override the cstartup defined in the library, simply add your modified +; version to the workbench project. +; +; The vector table is normally located at address 0. +; When debugging in RAM, it can be located in RAM, aligned to at least 2^6. +; The name "__vector_table" has special meaning for C-SPY: +; it is where the SP start value is found, and the NVIC vector +; table register (VTOR) is initialized to this address if != 0. +; +; Cortex-M version +; + + MODULE ?cstartup + + ;; Forward declaration of sections. + SECTION CSTACK:DATA:NOROOT(3) + + SECTION .intvec:CODE:NOROOT(2) + + EXTERN __iar_program_start + EXTERN SystemInit + PUBLIC __vector_table + + DATA +__vector_table + DCD sfe(CSTACK) + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WWDG_IRQHandler ; Window Watchdog + DCD PVD_IRQHandler ; PVD through EXTI Line detect + DCD TAMPER_IRQHandler ; Tamper + DCD RTC_IRQHandler ; RTC + DCD FLASH_IRQHandler ; Flash + DCD RCC_IRQHandler ; RCC + DCD EXTI0_IRQHandler ; EXTI Line 0 + DCD EXTI1_IRQHandler ; EXTI Line 1 + DCD EXTI2_IRQHandler ; EXTI Line 2 + DCD EXTI3_IRQHandler ; EXTI Line 3 + DCD EXTI4_IRQHandler ; EXTI Line 4 + DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 + DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 + DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 + DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 + DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 + DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 + DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 + DCD ADC1_IRQHandler ; ADC1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 + DCD TIM1_BRK_TIM15_IRQHandler ; TIM1 Break and TIM15 + DCD TIM1_UP_TIM16_IRQHandler ; TIM1 Update and TIM16 + DCD TIM1_TRG_COM_TIM17_IRQHandler ; TIM1 Trigger and Commutation and TIM17 + DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare + DCD TIM2_IRQHandler ; TIM2 + DCD TIM3_IRQHandler ; TIM3 + DCD 0 ; Reserved + DCD I2C1_EV_IRQHandler ; I2C1 Event + DCD I2C1_ER_IRQHandler ; I2C1 Error + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SPI1_IRQHandler ; SPI1 + DCD 0 ; Reserved + DCD USART1_IRQHandler ; USART1 + DCD USART2_IRQHandler ; USART2 + DCD 0 ; Reserved + DCD EXTI15_10_IRQHandler ; EXTI Line 15..10 + DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line + DCD CEC_IRQHandler ; HDMI-CEC + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD TIM6_DAC_IRQHandler ; TIM6 and DAC underrun + DCD TIM7_IRQHandler ; TIM7 + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Default interrupt handlers. +;; + THUMB + + PUBWEAK Reset_Handler + SECTION .text:CODE:REORDER(2) +Reset_Handler + LDR R0, =SystemInit + BLX R0 + LDR R0, =__iar_program_start + BX R0 + + PUBWEAK NMI_Handler + SECTION .text:CODE:REORDER(1) +NMI_Handler + B NMI_Handler + + PUBWEAK HardFault_Handler + SECTION .text:CODE:REORDER(1) +HardFault_Handler + B HardFault_Handler + + PUBWEAK MemManage_Handler + SECTION .text:CODE:REORDER(1) +MemManage_Handler + B MemManage_Handler + + PUBWEAK BusFault_Handler + SECTION .text:CODE:REORDER(1) +BusFault_Handler + B BusFault_Handler + + PUBWEAK UsageFault_Handler + SECTION .text:CODE:REORDER(1) +UsageFault_Handler + B UsageFault_Handler + + PUBWEAK SVC_Handler + SECTION .text:CODE:REORDER(1) +SVC_Handler + B SVC_Handler + + PUBWEAK DebugMon_Handler + SECTION .text:CODE:REORDER(1) +DebugMon_Handler + B DebugMon_Handler + + PUBWEAK PendSV_Handler + SECTION .text:CODE:REORDER(1) +PendSV_Handler + B PendSV_Handler + + PUBWEAK SysTick_Handler + SECTION .text:CODE:REORDER(1) +SysTick_Handler + B SysTick_Handler + + PUBWEAK WWDG_IRQHandler + SECTION .text:CODE:REORDER(1) +WWDG_IRQHandler + B WWDG_IRQHandler + + PUBWEAK PVD_IRQHandler + SECTION .text:CODE:REORDER(1) +PVD_IRQHandler + B PVD_IRQHandler + + PUBWEAK TAMPER_IRQHandler + SECTION .text:CODE:REORDER(1) +TAMPER_IRQHandler + B TAMPER_IRQHandler + + PUBWEAK RTC_IRQHandler + SECTION .text:CODE:REORDER(1) +RTC_IRQHandler + B RTC_IRQHandler + + PUBWEAK FLASH_IRQHandler + SECTION .text:CODE:REORDER(1) +FLASH_IRQHandler + B FLASH_IRQHandler + + PUBWEAK RCC_IRQHandler + SECTION .text:CODE:REORDER(1) +RCC_IRQHandler + B RCC_IRQHandler + + PUBWEAK EXTI0_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI0_IRQHandler + B EXTI0_IRQHandler + + PUBWEAK EXTI1_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI1_IRQHandler + B EXTI1_IRQHandler + + PUBWEAK EXTI2_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI2_IRQHandler + B EXTI2_IRQHandler + + PUBWEAK EXTI3_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI3_IRQHandler + B EXTI3_IRQHandler + + PUBWEAK EXTI4_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI4_IRQHandler + B EXTI4_IRQHandler + + PUBWEAK DMA1_Channel1_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel1_IRQHandler + B DMA1_Channel1_IRQHandler + + PUBWEAK DMA1_Channel2_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel2_IRQHandler + B DMA1_Channel2_IRQHandler + + PUBWEAK DMA1_Channel3_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel3_IRQHandler + B DMA1_Channel3_IRQHandler + + PUBWEAK DMA1_Channel4_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel4_IRQHandler + B DMA1_Channel4_IRQHandler + + PUBWEAK DMA1_Channel5_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel5_IRQHandler + B DMA1_Channel5_IRQHandler + + PUBWEAK DMA1_Channel6_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel6_IRQHandler + B DMA1_Channel6_IRQHandler + + PUBWEAK DMA1_Channel7_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel7_IRQHandler + B DMA1_Channel7_IRQHandler + + PUBWEAK ADC1_IRQHandler + SECTION .text:CODE:REORDER(1) +ADC1_IRQHandler + B ADC1_IRQHandler + + PUBWEAK EXTI9_5_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI9_5_IRQHandler + B EXTI9_5_IRQHandler + + PUBWEAK TIM1_BRK_TIM15_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM1_BRK_TIM15_IRQHandler + B TIM1_BRK_TIM15_IRQHandler + + PUBWEAK TIM1_UP_TIM16_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM1_UP_TIM16_IRQHandler + B TIM1_UP_TIM16_IRQHandler + + PUBWEAK TIM1_TRG_COM_TIM17_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM1_TRG_COM_TIM17_IRQHandler + B TIM1_TRG_COM_TIM17_IRQHandler + + PUBWEAK TIM1_CC_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM1_CC_IRQHandler + B TIM1_CC_IRQHandler + + PUBWEAK TIM2_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM2_IRQHandler + B TIM2_IRQHandler + + PUBWEAK TIM3_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM3_IRQHandler + B TIM3_IRQHandler + + PUBWEAK I2C1_EV_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C1_EV_IRQHandler + B I2C1_EV_IRQHandler + + PUBWEAK I2C1_ER_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C1_ER_IRQHandler + B I2C1_ER_IRQHandler + + PUBWEAK SPI1_IRQHandler + SECTION .text:CODE:REORDER(1) +SPI1_IRQHandler + B SPI1_IRQHandler + + PUBWEAK USART1_IRQHandler + SECTION .text:CODE:REORDER(1) +USART1_IRQHandler + B USART1_IRQHandler + + PUBWEAK USART2_IRQHandler + SECTION .text:CODE:REORDER(1) +USART2_IRQHandler + B USART2_IRQHandler + + PUBWEAK EXTI15_10_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI15_10_IRQHandler + B EXTI15_10_IRQHandler + + PUBWEAK RTCAlarm_IRQHandler + SECTION .text:CODE:REORDER(1) +RTCAlarm_IRQHandler + B RTCAlarm_IRQHandler + + PUBWEAK CEC_IRQHandler + SECTION .text:CODE:REORDER(1) +CEC_IRQHandler + B CEC_IRQHandler + + PUBWEAK TIM6_DAC_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM6_DAC_IRQHandler + B TIM6_DAC_IRQHandler + + PUBWEAK TIM7_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM7_IRQHandler + B TIM7_IRQHandler + + END +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/iar/startup_stm32f10x_md.s b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/iar/startup_stm32f10x_md.s new file mode 100644 index 0000000..5863eb9 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/iar/startup_stm32f10x_md.s @@ -0,0 +1,391 @@ +;******************** (C) COPYRIGHT 2011 STMicroelectronics ******************** +;* File Name : startup_stm32f10x_md.s +;* Author : MCD Application Team +;* Version : V3.5.0 +;* Date : 11-March-2011 +;* Description : STM32F10x Medium Density Devices vector table for +;* EWARM toolchain. +;* This module performs: +;* - Set the initial SP +;* - Configure the clock system +;* - Set the initial PC == __iar_program_start, +;* - Set the vector table entries with the exceptions ISR +;* address. +;* After Reset the Cortex-M3 processor is in Thread mode, +;* priority is Privileged, and the Stack is set to Main. +;******************************************************************************** +;* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS +;* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. +;* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, +;* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE +;* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING +;* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. +;******************************************************************************* +; +; +; The modules in this file are included in the libraries, and may be replaced +; by any user-defined modules that define the PUBLIC symbol _program_start or +; a user defined start symbol. +; To override the cstartup defined in the library, simply add your modified +; version to the workbench project. +; +; The vector table is normally located at address 0. +; When debugging in RAM, it can be located in RAM, aligned to at least 2^6. +; The name "__vector_table" has special meaning for C-SPY: +; it is where the SP start value is found, and the NVIC vector +; table register (VTOR) is initialized to this address if != 0. +; +; Cortex-M version +; + + MODULE ?cstartup + + ;; Forward declaration of sections. + SECTION CSTACK:DATA:NOROOT(3) + + SECTION .intvec:CODE:NOROOT(2) + + EXTERN __iar_program_start + EXTERN SystemInit + PUBLIC __vector_table + + DATA +__vector_table + DCD sfe(CSTACK) + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WWDG_IRQHandler ; Window Watchdog + DCD PVD_IRQHandler ; PVD through EXTI Line detect + DCD TAMPER_IRQHandler ; Tamper + DCD RTC_IRQHandler ; RTC + DCD FLASH_IRQHandler ; Flash + DCD RCC_IRQHandler ; RCC + DCD EXTI0_IRQHandler ; EXTI Line 0 + DCD EXTI1_IRQHandler ; EXTI Line 1 + DCD EXTI2_IRQHandler ; EXTI Line 2 + DCD EXTI3_IRQHandler ; EXTI Line 3 + DCD EXTI4_IRQHandler ; EXTI Line 4 + DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 + DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 + DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 + DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 + DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 + DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 + DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 + DCD ADC1_2_IRQHandler ; ADC1 & ADC2 + DCD USB_HP_CAN1_TX_IRQHandler ; USB High Priority or CAN1 TX + DCD USB_LP_CAN1_RX0_IRQHandler ; USB Low Priority or CAN1 RX0 + DCD CAN1_RX1_IRQHandler ; CAN1 RX1 + DCD CAN1_SCE_IRQHandler ; CAN1 SCE + DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 + DCD TIM1_BRK_IRQHandler ; TIM1 Break + DCD TIM1_UP_IRQHandler ; TIM1 Update + DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation + DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare + DCD TIM2_IRQHandler ; TIM2 + DCD TIM3_IRQHandler ; TIM3 + DCD TIM4_IRQHandler ; TIM4 + DCD I2C1_EV_IRQHandler ; I2C1 Event + DCD I2C1_ER_IRQHandler ; I2C1 Error + DCD I2C2_EV_IRQHandler ; I2C2 Event + DCD I2C2_ER_IRQHandler ; I2C2 Error + DCD SPI1_IRQHandler ; SPI1 + DCD SPI2_IRQHandler ; SPI2 + DCD USART1_IRQHandler ; USART1 + DCD USART2_IRQHandler ; USART2 + DCD USART3_IRQHandler ; USART3 + DCD EXTI15_10_IRQHandler ; EXTI Line 15..10 + DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line + DCD USBWakeUp_IRQHandler ; USB Wakeup from suspend + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Default interrupt handlers. +;; + THUMB + + PUBWEAK Reset_Handler + SECTION .text:CODE:REORDER(2) +Reset_Handler + LDR R0, =SystemInit + BLX R0 + LDR R0, =__iar_program_start + BX R0 + + PUBWEAK NMI_Handler + SECTION .text:CODE:REORDER(1) +NMI_Handler + B NMI_Handler + + PUBWEAK HardFault_Handler + SECTION .text:CODE:REORDER(1) +HardFault_Handler + B HardFault_Handler + + PUBWEAK MemManage_Handler + SECTION .text:CODE:REORDER(1) +MemManage_Handler + B MemManage_Handler + + PUBWEAK BusFault_Handler + SECTION .text:CODE:REORDER(1) +BusFault_Handler + B BusFault_Handler + + PUBWEAK UsageFault_Handler + SECTION .text:CODE:REORDER(1) +UsageFault_Handler + B UsageFault_Handler + + PUBWEAK SVC_Handler + SECTION .text:CODE:REORDER(1) +SVC_Handler + B SVC_Handler + + PUBWEAK DebugMon_Handler + SECTION .text:CODE:REORDER(1) +DebugMon_Handler + B DebugMon_Handler + + PUBWEAK PendSV_Handler + SECTION .text:CODE:REORDER(1) +PendSV_Handler + B PendSV_Handler + + PUBWEAK SysTick_Handler + SECTION .text:CODE:REORDER(1) +SysTick_Handler + B SysTick_Handler + + PUBWEAK WWDG_IRQHandler + SECTION .text:CODE:REORDER(1) +WWDG_IRQHandler + B WWDG_IRQHandler + + PUBWEAK PVD_IRQHandler + SECTION .text:CODE:REORDER(1) +PVD_IRQHandler + B PVD_IRQHandler + + PUBWEAK TAMPER_IRQHandler + SECTION .text:CODE:REORDER(1) +TAMPER_IRQHandler + B TAMPER_IRQHandler + + PUBWEAK RTC_IRQHandler + SECTION .text:CODE:REORDER(1) +RTC_IRQHandler + B RTC_IRQHandler + + PUBWEAK FLASH_IRQHandler + SECTION .text:CODE:REORDER(1) +FLASH_IRQHandler + B FLASH_IRQHandler + + PUBWEAK RCC_IRQHandler + SECTION .text:CODE:REORDER(1) +RCC_IRQHandler + B RCC_IRQHandler + + PUBWEAK EXTI0_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI0_IRQHandler + B EXTI0_IRQHandler + + PUBWEAK EXTI1_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI1_IRQHandler + B EXTI1_IRQHandler + + PUBWEAK EXTI2_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI2_IRQHandler + B EXTI2_IRQHandler + + PUBWEAK EXTI3_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI3_IRQHandler + B EXTI3_IRQHandler + + PUBWEAK EXTI4_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI4_IRQHandler + B EXTI4_IRQHandler + + PUBWEAK DMA1_Channel1_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel1_IRQHandler + B DMA1_Channel1_IRQHandler + + PUBWEAK DMA1_Channel2_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel2_IRQHandler + B DMA1_Channel2_IRQHandler + + PUBWEAK DMA1_Channel3_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel3_IRQHandler + B DMA1_Channel3_IRQHandler + + PUBWEAK DMA1_Channel4_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel4_IRQHandler + B DMA1_Channel4_IRQHandler + + PUBWEAK DMA1_Channel5_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel5_IRQHandler + B DMA1_Channel5_IRQHandler + + PUBWEAK DMA1_Channel6_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel6_IRQHandler + B DMA1_Channel6_IRQHandler + + PUBWEAK DMA1_Channel7_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel7_IRQHandler + B DMA1_Channel7_IRQHandler + + PUBWEAK ADC1_2_IRQHandler + SECTION .text:CODE:REORDER(1) +ADC1_2_IRQHandler + B ADC1_2_IRQHandler + + PUBWEAK USB_HP_CAN1_TX_IRQHandler + SECTION .text:CODE:REORDER(1) +USB_HP_CAN1_TX_IRQHandler + B USB_HP_CAN1_TX_IRQHandler + + PUBWEAK USB_LP_CAN1_RX0_IRQHandler + SECTION .text:CODE:REORDER(1) +USB_LP_CAN1_RX0_IRQHandler + B USB_LP_CAN1_RX0_IRQHandler + + PUBWEAK CAN1_RX1_IRQHandler + SECTION .text:CODE:REORDER(1) +CAN1_RX1_IRQHandler + B CAN1_RX1_IRQHandler + + PUBWEAK CAN1_SCE_IRQHandler + SECTION .text:CODE:REORDER(1) +CAN1_SCE_IRQHandler + B CAN1_SCE_IRQHandler + + PUBWEAK EXTI9_5_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI9_5_IRQHandler + B EXTI9_5_IRQHandler + + PUBWEAK TIM1_BRK_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM1_BRK_IRQHandler + B TIM1_BRK_IRQHandler + + PUBWEAK TIM1_UP_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM1_UP_IRQHandler + B TIM1_UP_IRQHandler + + PUBWEAK TIM1_TRG_COM_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM1_TRG_COM_IRQHandler + B TIM1_TRG_COM_IRQHandler + + PUBWEAK TIM1_CC_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM1_CC_IRQHandler + B TIM1_CC_IRQHandler + + PUBWEAK TIM2_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM2_IRQHandler + B TIM2_IRQHandler + + PUBWEAK TIM3_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM3_IRQHandler + B TIM3_IRQHandler + + PUBWEAK TIM4_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM4_IRQHandler + B TIM4_IRQHandler + + PUBWEAK I2C1_EV_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C1_EV_IRQHandler + B I2C1_EV_IRQHandler + + PUBWEAK I2C1_ER_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C1_ER_IRQHandler + B I2C1_ER_IRQHandler + + PUBWEAK I2C2_EV_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C2_EV_IRQHandler + B I2C2_EV_IRQHandler + + PUBWEAK I2C2_ER_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C2_ER_IRQHandler + B I2C2_ER_IRQHandler + + PUBWEAK SPI1_IRQHandler + SECTION .text:CODE:REORDER(1) +SPI1_IRQHandler + B SPI1_IRQHandler + + PUBWEAK SPI2_IRQHandler + SECTION .text:CODE:REORDER(1) +SPI2_IRQHandler + B SPI2_IRQHandler + + PUBWEAK USART1_IRQHandler + SECTION .text:CODE:REORDER(1) +USART1_IRQHandler + B USART1_IRQHandler + + PUBWEAK USART2_IRQHandler + SECTION .text:CODE:REORDER(1) +USART2_IRQHandler + B USART2_IRQHandler + + PUBWEAK USART3_IRQHandler + SECTION .text:CODE:REORDER(1) +USART3_IRQHandler + B USART3_IRQHandler + + PUBWEAK EXTI15_10_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI15_10_IRQHandler + B EXTI15_10_IRQHandler + + PUBWEAK RTCAlarm_IRQHandler + SECTION .text:CODE:REORDER(1) +RTCAlarm_IRQHandler + B RTCAlarm_IRQHandler + + PUBWEAK USBWakeUp_IRQHandler + SECTION .text:CODE:REORDER(1) +USBWakeUp_IRQHandler + B USBWakeUp_IRQHandler + + END +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/iar/startup_stm32f10x_md_vl.s b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/iar/startup_stm32f10x_md_vl.s new file mode 100644 index 0000000..add509d --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/iar/startup_stm32f10x_md_vl.s @@ -0,0 +1,394 @@ +;******************** (C) COPYRIGHT 2011 STMicroelectronics ******************** +;* File Name : startup_stm32f10x_md_vl.s +;* Author : MCD Application Team +;* Version : V3.5.0 +;* Date : 11-March-2011 +;* Description : STM32F10x Medium Density Value Line Devices vector table +;* for EWARM toolchain. +;* This module performs: +;* - Set the initial SP +;* - Configure the clock system +;* - Set the initial PC == __iar_program_start, +;* - Set the vector table entries with the exceptions ISR +;* address. +;* After Reset the Cortex-M3 processor is in Thread mode, +;* priority is Privileged, and the Stack is set to Main. +;******************************************************************************** +;* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS +;* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. +;* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, +;* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE +;* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING +;* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. +;******************************************************************************* +; +; +; The modules in this file are included in the libraries, and may be replaced +; by any user-defined modules that define the PUBLIC symbol _program_start or +; a user defined start symbol. +; To override the cstartup defined in the library, simply add your modified +; version to the workbench project. +; +; The vector table is normally located at address 0. +; When debugging in RAM, it can be located in RAM, aligned to at least 2^6. +; The name "__vector_table" has special meaning for C-SPY: +; it is where the SP start value is found, and the NVIC vector +; table register (VTOR) is initialized to this address if != 0. +; +; Cortex-M version +; + + MODULE ?cstartup + + ;; Forward declaration of sections. + SECTION CSTACK:DATA:NOROOT(3) + + SECTION .intvec:CODE:NOROOT(2) + + EXTERN __iar_program_start + EXTERN SystemInit + PUBLIC __vector_table + + DATA +__vector_table + DCD sfe(CSTACK) + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WWDG_IRQHandler ; Window Watchdog + DCD PVD_IRQHandler ; PVD through EXTI Line detect + DCD TAMPER_IRQHandler ; Tamper + DCD RTC_IRQHandler ; RTC + DCD FLASH_IRQHandler ; Flash + DCD RCC_IRQHandler ; RCC + DCD EXTI0_IRQHandler ; EXTI Line 0 + DCD EXTI1_IRQHandler ; EXTI Line 1 + DCD EXTI2_IRQHandler ; EXTI Line 2 + DCD EXTI3_IRQHandler ; EXTI Line 3 + DCD EXTI4_IRQHandler ; EXTI Line 4 + DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 + DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 + DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 + DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 + DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 + DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 + DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 + DCD ADC1_IRQHandler ; ADC1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 + DCD TIM1_BRK_TIM15_IRQHandler ; TIM1 Break and TIM15 + DCD TIM1_UP_TIM16_IRQHandler ; TIM1 Update and TIM16 + DCD TIM1_TRG_COM_TIM17_IRQHandler ; TIM1 Trigger and Commutation and TIM17 + DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare + DCD TIM2_IRQHandler ; TIM2 + DCD TIM3_IRQHandler ; TIM3 + DCD TIM4_IRQHandler ; TIM4 + DCD I2C1_EV_IRQHandler ; I2C1 Event + DCD I2C1_ER_IRQHandler ; I2C1 Error + DCD I2C2_EV_IRQHandler ; I2C2 Event + DCD I2C2_ER_IRQHandler ; I2C2 Error + DCD SPI1_IRQHandler ; SPI1 + DCD SPI2_IRQHandler ; SPI2 + DCD USART1_IRQHandler ; USART1 + DCD USART2_IRQHandler ; USART2 + DCD USART3_IRQHandler ; USART3 + DCD EXTI15_10_IRQHandler ; EXTI Line 15..10 + DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line + DCD CEC_IRQHandler ; HDMI-CEC + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD TIM6_DAC_IRQHandler ; TIM6 and DAC underrun + DCD TIM7_IRQHandler ; TIM7 + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Default interrupt handlers. +;; + THUMB + + PUBWEAK Reset_Handler + SECTION .text:CODE:REORDER(2) +Reset_Handler + LDR R0, =SystemInit + BLX R0 + LDR R0, =__iar_program_start + BX R0 + + PUBWEAK NMI_Handler + SECTION .text:CODE:REORDER(1) +NMI_Handler + B NMI_Handler + + PUBWEAK HardFault_Handler + SECTION .text:CODE:REORDER(1) +HardFault_Handler + B HardFault_Handler + + PUBWEAK MemManage_Handler + SECTION .text:CODE:REORDER(1) +MemManage_Handler + B MemManage_Handler + + PUBWEAK BusFault_Handler + SECTION .text:CODE:REORDER(1) +BusFault_Handler + B BusFault_Handler + + PUBWEAK UsageFault_Handler + SECTION .text:CODE:REORDER(1) +UsageFault_Handler + B UsageFault_Handler + + PUBWEAK SVC_Handler + SECTION .text:CODE:REORDER(1) +SVC_Handler + B SVC_Handler + + PUBWEAK DebugMon_Handler + SECTION .text:CODE:REORDER(1) +DebugMon_Handler + B DebugMon_Handler + + PUBWEAK PendSV_Handler + SECTION .text:CODE:REORDER(1) +PendSV_Handler + B PendSV_Handler + + PUBWEAK SysTick_Handler + SECTION .text:CODE:REORDER(1) +SysTick_Handler + B SysTick_Handler + + PUBWEAK WWDG_IRQHandler + SECTION .text:CODE:REORDER(1) +WWDG_IRQHandler + B WWDG_IRQHandler + + PUBWEAK PVD_IRQHandler + SECTION .text:CODE:REORDER(1) +PVD_IRQHandler + B PVD_IRQHandler + + PUBWEAK TAMPER_IRQHandler + SECTION .text:CODE:REORDER(1) +TAMPER_IRQHandler + B TAMPER_IRQHandler + + PUBWEAK RTC_IRQHandler + SECTION .text:CODE:REORDER(1) +RTC_IRQHandler + B RTC_IRQHandler + + PUBWEAK FLASH_IRQHandler + SECTION .text:CODE:REORDER(1) +FLASH_IRQHandler + B FLASH_IRQHandler + + PUBWEAK RCC_IRQHandler + SECTION .text:CODE:REORDER(1) +RCC_IRQHandler + B RCC_IRQHandler + + PUBWEAK EXTI0_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI0_IRQHandler + B EXTI0_IRQHandler + + PUBWEAK EXTI1_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI1_IRQHandler + B EXTI1_IRQHandler + + PUBWEAK EXTI2_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI2_IRQHandler + B EXTI2_IRQHandler + + PUBWEAK EXTI3_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI3_IRQHandler + B EXTI3_IRQHandler + + PUBWEAK EXTI4_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI4_IRQHandler + B EXTI4_IRQHandler + + PUBWEAK DMA1_Channel1_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel1_IRQHandler + B DMA1_Channel1_IRQHandler + + PUBWEAK DMA1_Channel2_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel2_IRQHandler + B DMA1_Channel2_IRQHandler + + PUBWEAK DMA1_Channel3_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel3_IRQHandler + B DMA1_Channel3_IRQHandler + + PUBWEAK DMA1_Channel4_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel4_IRQHandler + B DMA1_Channel4_IRQHandler + + PUBWEAK DMA1_Channel5_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel5_IRQHandler + B DMA1_Channel5_IRQHandler + + PUBWEAK DMA1_Channel6_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel6_IRQHandler + B DMA1_Channel6_IRQHandler + + PUBWEAK DMA1_Channel7_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel7_IRQHandler + B DMA1_Channel7_IRQHandler + + PUBWEAK ADC1_IRQHandler + SECTION .text:CODE:REORDER(1) +ADC1_IRQHandler + B ADC1_IRQHandler + + PUBWEAK EXTI9_5_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI9_5_IRQHandler + B EXTI9_5_IRQHandler + + PUBWEAK TIM1_BRK_TIM15_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM1_BRK_TIM15_IRQHandler + B TIM1_BRK_TIM15_IRQHandler + + PUBWEAK TIM1_UP_TIM16_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM1_UP_TIM16_IRQHandler + B TIM1_UP_TIM16_IRQHandler + + PUBWEAK TIM1_TRG_COM_TIM17_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM1_TRG_COM_TIM17_IRQHandler + B TIM1_TRG_COM_TIM17_IRQHandler + + PUBWEAK TIM1_CC_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM1_CC_IRQHandler + B TIM1_CC_IRQHandler + + PUBWEAK TIM2_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM2_IRQHandler + B TIM2_IRQHandler + + PUBWEAK TIM3_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM3_IRQHandler + B TIM3_IRQHandler + + PUBWEAK TIM4_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM4_IRQHandler + B TIM4_IRQHandler + + PUBWEAK I2C1_EV_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C1_EV_IRQHandler + B I2C1_EV_IRQHandler + + PUBWEAK I2C1_ER_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C1_ER_IRQHandler + B I2C1_ER_IRQHandler + + PUBWEAK I2C2_EV_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C2_EV_IRQHandler + B I2C2_EV_IRQHandler + + PUBWEAK I2C2_ER_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C2_ER_IRQHandler + B I2C2_ER_IRQHandler + + PUBWEAK SPI1_IRQHandler + SECTION .text:CODE:REORDER(1) +SPI1_IRQHandler + B SPI1_IRQHandler + + PUBWEAK SPI2_IRQHandler + SECTION .text:CODE:REORDER(1) +SPI2_IRQHandler + B SPI2_IRQHandler + + PUBWEAK USART1_IRQHandler + SECTION .text:CODE:REORDER(1) +USART1_IRQHandler + B USART1_IRQHandler + + PUBWEAK USART2_IRQHandler + SECTION .text:CODE:REORDER(1) +USART2_IRQHandler + B USART2_IRQHandler + + PUBWEAK USART3_IRQHandler + SECTION .text:CODE:REORDER(1) +USART3_IRQHandler + B USART3_IRQHandler + + PUBWEAK EXTI15_10_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI15_10_IRQHandler + B EXTI15_10_IRQHandler + + PUBWEAK RTCAlarm_IRQHandler + SECTION .text:CODE:REORDER(1) +RTCAlarm_IRQHandler + B RTCAlarm_IRQHandler + + PUBWEAK CEC_IRQHandler + SECTION .text:CODE:REORDER(1) +CEC_IRQHandler + B CEC_IRQHandler + + PUBWEAK TIM6_DAC_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM6_DAC_IRQHandler + B TIM6_DAC_IRQHandler + + PUBWEAK TIM7_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM7_IRQHandler + B TIM7_IRQHandler + + END +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/iar/startup_stm32f10x_xl.s b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/iar/startup_stm32f10x_xl.s new file mode 100644 index 0000000..a7f49c5 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/iar/startup_stm32f10x_xl.s @@ -0,0 +1,496 @@ +;******************** (C) COPYRIGHT 2011 STMicroelectronics ******************** +;* File Name : startup_stm32f10x_xl.s +;* Author : MCD Application Team +;* Version : V3.5.0 +;* Date : 11-March-2011 +;* Description : STM32F10x XL-Density Devices vector table for EWARM +;* toolchain. +;* This module performs: +;* - Set the initial SP +;* - Configure the clock system and the external SRAM +;* mounted on STM3210E-EVAL board to be used as data +;* memory (optional, to be enabled by user) +;* - Set the initial PC == __iar_program_start, +;* - Set the vector table entries with the exceptions ISR address, +;* After Reset the Cortex-M3 processor is in Thread mode, +;* priority is Privileged, and the Stack is set to Main. +;******************************************************************************** +;* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS +;* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. +;* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, +;* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE +;* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING +;* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. +;******************************************************************************* +; +; +; The modules in this file are included in the libraries, and may be replaced +; by any user-defined modules that define the PUBLIC symbol _program_start or +; a user defined start symbol. +; To override the cstartup defined in the library, simply add your modified +; version to the workbench project. +; +; The vector table is normally located at address 0. +; When debugging in RAM, it can be located in RAM, aligned to at least 2^6. +; The name "__vector_table" has special meaning for C-SPY: +; it is where the SP start value is found, and the NVIC vector +; table register (VTOR) is initialized to this address if != 0. +; +; Cortex-M version +; + + MODULE ?cstartup + + ;; Forward declaration of sections. + SECTION CSTACK:DATA:NOROOT(3) + + SECTION .intvec:CODE:NOROOT(2) + + EXTERN __iar_program_start + EXTERN SystemInit + PUBLIC __vector_table + + DATA + +__vector_table + DCD sfe(CSTACK) + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WWDG_IRQHandler ; Window Watchdog + DCD PVD_IRQHandler ; PVD through EXTI Line detect + DCD TAMPER_IRQHandler ; Tamper + DCD RTC_IRQHandler ; RTC + DCD FLASH_IRQHandler ; Flash + DCD RCC_IRQHandler ; RCC + DCD EXTI0_IRQHandler ; EXTI Line 0 + DCD EXTI1_IRQHandler ; EXTI Line 1 + DCD EXTI2_IRQHandler ; EXTI Line 2 + DCD EXTI3_IRQHandler ; EXTI Line 3 + DCD EXTI4_IRQHandler ; EXTI Line 4 + DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 + DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 + DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 + DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 + DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 + DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 + DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 + DCD ADC1_2_IRQHandler ; ADC1 & ADC2 + DCD USB_HP_CAN1_TX_IRQHandler ; USB High Priority or CAN1 TX + DCD USB_LP_CAN1_RX0_IRQHandler ; USB Low Priority or CAN1 RX0 + DCD CAN1_RX1_IRQHandler ; CAN1 RX1 + DCD CAN1_SCE_IRQHandler ; CAN1 SCE + DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 + DCD TIM1_BRK_TIM9_IRQHandler ; TIM1 Break and TIM9 + DCD TIM1_UP_TIM10_IRQHandler ; TIM1 Update and TIM10 + DCD TIM1_TRG_COM_TIM11_IRQHandler ; TIM1 Trigger and Commutation and TIM11 + DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare + DCD TIM2_IRQHandler ; TIM2 + DCD TIM3_IRQHandler ; TIM3 + DCD TIM4_IRQHandler ; TIM4 + DCD I2C1_EV_IRQHandler ; I2C1 Event + DCD I2C1_ER_IRQHandler ; I2C1 Error + DCD I2C2_EV_IRQHandler ; I2C2 Event + DCD I2C2_ER_IRQHandler ; I2C2 Error + DCD SPI1_IRQHandler ; SPI1 + DCD SPI2_IRQHandler ; SPI2 + DCD USART1_IRQHandler ; USART1 + DCD USART2_IRQHandler ; USART2 + DCD USART3_IRQHandler ; USART3 + DCD EXTI15_10_IRQHandler ; EXTI Line 15..10 + DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line + DCD USBWakeUp_IRQHandler ; USB Wakeup from suspend + DCD TIM8_BRK_TIM12_IRQHandler ; TIM8 Break and TIM12 + DCD TIM8_UP_TIM13_IRQHandler ; TIM8 Update and TIM13 + DCD TIM8_TRG_COM_TIM14_IRQHandler ; TIM8 Trigger and Commutation and TIM14 + DCD TIM8_CC_IRQHandler ; TIM8 Capture Compare + DCD ADC3_IRQHandler ; ADC3 + DCD FSMC_IRQHandler ; FSMC + DCD SDIO_IRQHandler ; SDIO + DCD TIM5_IRQHandler ; TIM5 + DCD SPI3_IRQHandler ; SPI3 + DCD UART4_IRQHandler ; UART4 + DCD UART5_IRQHandler ; UART5 + DCD TIM6_IRQHandler ; TIM6 + DCD TIM7_IRQHandler ; TIM7 + DCD DMA2_Channel1_IRQHandler ; DMA2 Channel1 + DCD DMA2_Channel2_IRQHandler ; DMA2 Channel2 + DCD DMA2_Channel3_IRQHandler ; DMA2 Channel3 + DCD DMA2_Channel4_5_IRQHandler ; DMA2 Channel4 & Channel5 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Default interrupt handlers. +;; + THUMB + + PUBWEAK Reset_Handler + SECTION .text:CODE:REORDER(2) +Reset_Handler + LDR R0, =SystemInit + BLX R0 + LDR R0, =__iar_program_start + BX R0 + + PUBWEAK NMI_Handler + SECTION .text:CODE:REORDER(1) +NMI_Handler + B NMI_Handler + + PUBWEAK HardFault_Handler + SECTION .text:CODE:REORDER(1) +HardFault_Handler + B HardFault_Handler + + PUBWEAK MemManage_Handler + SECTION .text:CODE:REORDER(1) +MemManage_Handler + B MemManage_Handler + + PUBWEAK BusFault_Handler + SECTION .text:CODE:REORDER(1) +BusFault_Handler + B BusFault_Handler + + PUBWEAK UsageFault_Handler + SECTION .text:CODE:REORDER(1) +UsageFault_Handler + B UsageFault_Handler + + PUBWEAK SVC_Handler + SECTION .text:CODE:REORDER(1) +SVC_Handler + B SVC_Handler + + PUBWEAK DebugMon_Handler + SECTION .text:CODE:REORDER(1) +DebugMon_Handler + B DebugMon_Handler + + PUBWEAK PendSV_Handler + SECTION .text:CODE:REORDER(1) +PendSV_Handler + B PendSV_Handler + + PUBWEAK SysTick_Handler + SECTION .text:CODE:REORDER(1) +SysTick_Handler + B SysTick_Handler + + PUBWEAK WWDG_IRQHandler + SECTION .text:CODE:REORDER(1) +WWDG_IRQHandler + B WWDG_IRQHandler + + PUBWEAK PVD_IRQHandler + SECTION .text:CODE:REORDER(1) +PVD_IRQHandler + B PVD_IRQHandler + + PUBWEAK TAMPER_IRQHandler + SECTION .text:CODE:REORDER(1) +TAMPER_IRQHandler + B TAMPER_IRQHandler + + PUBWEAK RTC_IRQHandler + SECTION .text:CODE:REORDER(1) +RTC_IRQHandler + B RTC_IRQHandler + + PUBWEAK FLASH_IRQHandler + SECTION .text:CODE:REORDER(1) +FLASH_IRQHandler + B FLASH_IRQHandler + + PUBWEAK RCC_IRQHandler + SECTION .text:CODE:REORDER(1) +RCC_IRQHandler + B RCC_IRQHandler + + PUBWEAK EXTI0_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI0_IRQHandler + B EXTI0_IRQHandler + + PUBWEAK EXTI1_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI1_IRQHandler + B EXTI1_IRQHandler + + PUBWEAK EXTI2_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI2_IRQHandler + B EXTI2_IRQHandler + + PUBWEAK EXTI3_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI3_IRQHandler + B EXTI3_IRQHandler + + PUBWEAK EXTI4_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI4_IRQHandler + B EXTI4_IRQHandler + + PUBWEAK DMA1_Channel1_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel1_IRQHandler + B DMA1_Channel1_IRQHandler + + PUBWEAK DMA1_Channel2_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel2_IRQHandler + B DMA1_Channel2_IRQHandler + + PUBWEAK DMA1_Channel3_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel3_IRQHandler + B DMA1_Channel3_IRQHandler + + PUBWEAK DMA1_Channel4_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel4_IRQHandler + B DMA1_Channel4_IRQHandler + + PUBWEAK DMA1_Channel5_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel5_IRQHandler + B DMA1_Channel5_IRQHandler + + PUBWEAK DMA1_Channel6_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel6_IRQHandler + B DMA1_Channel6_IRQHandler + + PUBWEAK DMA1_Channel7_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel7_IRQHandler + B DMA1_Channel7_IRQHandler + + PUBWEAK ADC1_2_IRQHandler + SECTION .text:CODE:REORDER(1) +ADC1_2_IRQHandler + B ADC1_2_IRQHandler + + PUBWEAK USB_HP_CAN1_TX_IRQHandler + SECTION .text:CODE:REORDER(1) +USB_HP_CAN1_TX_IRQHandler + B USB_HP_CAN1_TX_IRQHandler + + PUBWEAK USB_LP_CAN1_RX0_IRQHandler + SECTION .text:CODE:REORDER(1) +USB_LP_CAN1_RX0_IRQHandler + B USB_LP_CAN1_RX0_IRQHandler + + PUBWEAK CAN1_RX1_IRQHandler + SECTION .text:CODE:REORDER(1) +CAN1_RX1_IRQHandler + B CAN1_RX1_IRQHandler + + PUBWEAK CAN1_SCE_IRQHandler + SECTION .text:CODE:REORDER(1) +CAN1_SCE_IRQHandler + B CAN1_SCE_IRQHandler + + PUBWEAK EXTI9_5_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI9_5_IRQHandler + B EXTI9_5_IRQHandler + + PUBWEAK TIM1_BRK_TIM9_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM1_BRK_TIM9_IRQHandler + B TIM1_BRK_TIM9_IRQHandler + + PUBWEAK TIM1_UP_TIM10_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM1_UP_TIM10_IRQHandler + B TIM1_UP_TIM10_IRQHandler + + PUBWEAK TIM1_TRG_COM_TIM11_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM1_TRG_COM_TIM11_IRQHandler + B TIM1_TRG_COM_TIM11_IRQHandler + + PUBWEAK TIM1_CC_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM1_CC_IRQHandler + B TIM1_CC_IRQHandler + + PUBWEAK TIM2_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM2_IRQHandler + B TIM2_IRQHandler + + PUBWEAK TIM3_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM3_IRQHandler + B TIM3_IRQHandler + + PUBWEAK TIM4_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM4_IRQHandler + B TIM4_IRQHandler + + PUBWEAK I2C1_EV_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C1_EV_IRQHandler + B I2C1_EV_IRQHandler + + PUBWEAK I2C1_ER_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C1_ER_IRQHandler + B I2C1_ER_IRQHandler + + PUBWEAK I2C2_EV_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C2_EV_IRQHandler + B I2C2_EV_IRQHandler + + PUBWEAK I2C2_ER_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C2_ER_IRQHandler + B I2C2_ER_IRQHandler + + PUBWEAK SPI1_IRQHandler + SECTION .text:CODE:REORDER(1) +SPI1_IRQHandler + B SPI1_IRQHandler + + PUBWEAK SPI2_IRQHandler + SECTION .text:CODE:REORDER(1) +SPI2_IRQHandler + B SPI2_IRQHandler + + PUBWEAK USART1_IRQHandler + SECTION .text:CODE:REORDER(1) +USART1_IRQHandler + B USART1_IRQHandler + + PUBWEAK USART2_IRQHandler + SECTION .text:CODE:REORDER(1) +USART2_IRQHandler + B USART2_IRQHandler + + PUBWEAK USART3_IRQHandler + SECTION .text:CODE:REORDER(1) +USART3_IRQHandler + B USART3_IRQHandler + + PUBWEAK EXTI15_10_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI15_10_IRQHandler + B EXTI15_10_IRQHandler + + PUBWEAK RTCAlarm_IRQHandler + SECTION .text:CODE:REORDER(1) +RTCAlarm_IRQHandler + B RTCAlarm_IRQHandler + + PUBWEAK USBWakeUp_IRQHandler + SECTION .text:CODE:REORDER(1) +USBWakeUp_IRQHandler + B USBWakeUp_IRQHandler + + PUBWEAK TIM8_BRK_TIM12_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM8_BRK_TIM12_IRQHandler + B TIM8_BRK_TIM12_IRQHandler + + PUBWEAK TIM8_UP_TIM13_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM8_UP_TIM13_IRQHandler + B TIM8_UP_TIM13_IRQHandler + + PUBWEAK TIM8_TRG_COM_TIM14_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM8_TRG_COM_TIM14_IRQHandler + B TIM8_TRG_COM_TIM14_IRQHandler + + PUBWEAK TIM8_CC_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM8_CC_IRQHandler + B TIM8_CC_IRQHandler + + PUBWEAK ADC3_IRQHandler + SECTION .text:CODE:REORDER(1) +ADC3_IRQHandler + B ADC3_IRQHandler + + PUBWEAK FSMC_IRQHandler + SECTION .text:CODE:REORDER(1) +FSMC_IRQHandler + B FSMC_IRQHandler + + PUBWEAK SDIO_IRQHandler + SECTION .text:CODE:REORDER(1) +SDIO_IRQHandler + B SDIO_IRQHandler + + PUBWEAK TIM5_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM5_IRQHandler + B TIM5_IRQHandler + + PUBWEAK SPI3_IRQHandler + SECTION .text:CODE:REORDER(1) +SPI3_IRQHandler + B SPI3_IRQHandler + + PUBWEAK UART4_IRQHandler + SECTION .text:CODE:REORDER(1) +UART4_IRQHandler + B UART4_IRQHandler + + PUBWEAK UART5_IRQHandler + SECTION .text:CODE:REORDER(1) +UART5_IRQHandler + B UART5_IRQHandler + + PUBWEAK TIM6_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM6_IRQHandler + B TIM6_IRQHandler + + PUBWEAK TIM7_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM7_IRQHandler + B TIM7_IRQHandler + + PUBWEAK DMA2_Channel1_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA2_Channel1_IRQHandler + B DMA2_Channel1_IRQHandler + + PUBWEAK DMA2_Channel2_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA2_Channel2_IRQHandler + B DMA2_Channel2_IRQHandler + + PUBWEAK DMA2_Channel3_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA2_Channel3_IRQHandler + B DMA2_Channel3_IRQHandler + + PUBWEAK DMA2_Channel4_5_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA2_Channel4_5_IRQHandler + B DMA2_Channel4_5_IRQHandler + + + END + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/stm32f10x.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/stm32f10x.h new file mode 100644 index 0000000..e48468e --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/stm32f10x.h @@ -0,0 +1,8336 @@ +/** + ****************************************************************************** + * @file stm32f10x.h + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief CMSIS Cortex-M3 Device Peripheral Access Layer Header File. + * This file contains all the peripheral register's definitions, bits + * definitions and memory mapping for STM32F10x Connectivity line, + * High density, High density value line, Medium density, + * Medium density Value line, Low density, Low density Value line + * and XL-density devices. + * + * The file is the unique include file that the application programmer + * is using in the C source code, usually in main.c. This file contains: + * - Configuration section that allows to select: + * - The device used in the target application + * - To use or not the peripheral’s drivers in application code(i.e. + * code will be based on direct access to peripheral’s registers + * rather than drivers API), this option is controlled by + * "#define USE_STDPERIPH_DRIVER" + * - To change few application-specific parameters such as the HSE + * crystal frequency + * - Data structures and the address mapping for all peripherals + * - Peripheral's registers declarations and bits definition + * - Macros to access peripheral’s registers hardware + * + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f10x + * @{ + */ + +#ifndef __STM32F10x_H +#define __STM32F10x_H + +#ifdef __cplusplus + extern "C" { +#endif + +/** @addtogroup Library_configuration_section + * @{ + */ + +/* Uncomment the line below according to the target STM32 device used in your + application + */ + +#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD) && !defined (STM32F10X_HD_VL) && !defined (STM32F10X_XL) && !defined (STM32F10X_CL) + /* #define STM32F10X_LD */ /*!< STM32F10X_LD: STM32 Low density devices */ + /* #define STM32F10X_LD_VL */ /*!< STM32F10X_LD_VL: STM32 Low density Value Line devices */ + /* #define STM32F10X_MD */ /*!< STM32F10X_MD: STM32 Medium density devices */ + /* #define STM32F10X_MD_VL */ /*!< STM32F10X_MD_VL: STM32 Medium density Value Line devices */ + /* #define STM32F10X_HD */ /*!< STM32F10X_HD: STM32 High density devices */ + /* #define STM32F10X_HD_VL */ /*!< STM32F10X_HD_VL: STM32 High density value line devices */ + /* #define STM32F10X_XL */ /*!< STM32F10X_XL: STM32 XL-density devices */ + #define STM32F10X_CL /*!< STM32F10X_CL: STM32 Connectivity line devices */ +#endif +/* Tip: To avoid modifying this file each time you need to switch between these + devices, you can define the device in your toolchain compiler preprocessor. + + - Low-density devices are STM32F101xx, STM32F102xx and STM32F103xx microcontrollers + where the Flash memory density ranges between 16 and 32 Kbytes. + - Low-density value line devices are STM32F100xx microcontrollers where the Flash + memory density ranges between 16 and 32 Kbytes. + - Medium-density devices are STM32F101xx, STM32F102xx and STM32F103xx microcontrollers + where the Flash memory density ranges between 64 and 128 Kbytes. + - Medium-density value line devices are STM32F100xx microcontrollers where the + Flash memory density ranges between 64 and 128 Kbytes. + - High-density devices are STM32F101xx and STM32F103xx microcontrollers where + the Flash memory density ranges between 256 and 512 Kbytes. + - High-density value line devices are STM32F100xx microcontrollers where the + Flash memory density ranges between 256 and 512 Kbytes. + - XL-density devices are STM32F101xx and STM32F103xx microcontrollers where + the Flash memory density ranges between 512 and 1024 Kbytes. + - Connectivity line devices are STM32F105xx and STM32F107xx microcontrollers. + */ + +#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD) && !defined (STM32F10X_HD_VL) && !defined (STM32F10X_XL) && !defined (STM32F10X_CL) + #error "Please select first the target STM32F10x device used in your application (in stm32f10x.h file)" +#endif + +#if !defined USE_STDPERIPH_DRIVER +/** + * @brief Comment the line below if you will not use the peripherals drivers. + In this case, these drivers will not be included and the application code will + be based on direct access to peripherals registers + */ + /*#define USE_STDPERIPH_DRIVER*/ +#endif + +/** + * @brief In the following line adjust the value of External High Speed oscillator (HSE) + used in your application + + Tip: To avoid modifying this file each time you need to use different HSE, you + can define the HSE value in your toolchain compiler preprocessor. + */ +#if !defined HSE_VALUE + #ifdef STM32F10X_CL + #define HSE_VALUE ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */ + #else + #define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */ + #endif /* STM32F10X_CL */ +#endif /* HSE_VALUE */ + + +/** + * @brief In the following line adjust the External High Speed oscillator (HSE) Startup + Timeout value + */ +#define HSE_STARTUP_TIMEOUT ((uint16_t)0x0500) /*!< Time out for HSE start up */ + +#define HSI_VALUE ((uint32_t)8000000) /*!< Value of the Internal oscillator in Hz*/ + +/** + * @brief STM32F10x Standard Peripheral Library version number + */ +#define __STM32F10X_STDPERIPH_VERSION_MAIN (0x03) /*!< [31:24] main version */ +#define __STM32F10X_STDPERIPH_VERSION_SUB1 (0x05) /*!< [23:16] sub1 version */ +#define __STM32F10X_STDPERIPH_VERSION_SUB2 (0x00) /*!< [15:8] sub2 version */ +#define __STM32F10X_STDPERIPH_VERSION_RC (0x00) /*!< [7:0] release candidate */ +#define __STM32F10X_STDPERIPH_VERSION ( (__STM32F10X_STDPERIPH_VERSION_MAIN << 24)\ + |(__STM32F10X_STDPERIPH_VERSION_SUB1 << 16)\ + |(__STM32F10X_STDPERIPH_VERSION_SUB2 << 8)\ + |(__STM32F10X_STDPERIPH_VERSION_RC)) + +/** + * @} + */ + +/** @addtogroup Configuration_section_for_CMSIS + * @{ + */ + +/** + * @brief Configuration of the Cortex-M3 Processor and Core Peripherals + */ +#ifdef STM32F10X_XL + #define __MPU_PRESENT 1 /*!< STM32 XL-density devices provide an MPU */ +#else + #define __MPU_PRESENT 0 /*!< Other STM32 devices does not provide an MPU */ +#endif /* STM32F10X_XL */ +#define __NVIC_PRIO_BITS 4 /*!< STM32 uses 4 Bits for the Priority Levels */ +#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */ + +/** + * @brief STM32F10x Interrupt Number Definition, according to the selected device + * in @ref Library_configuration_section + */ +typedef enum IRQn +{ +/****** Cortex-M3 Processor Exceptions Numbers ***************************************************/ + NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ + MemoryManagement_IRQn = -12, /*!< 4 Cortex-M3 Memory Management Interrupt */ + BusFault_IRQn = -11, /*!< 5 Cortex-M3 Bus Fault Interrupt */ + UsageFault_IRQn = -10, /*!< 6 Cortex-M3 Usage Fault Interrupt */ + SVCall_IRQn = -5, /*!< 11 Cortex-M3 SV Call Interrupt */ + DebugMonitor_IRQn = -4, /*!< 12 Cortex-M3 Debug Monitor Interrupt */ + PendSV_IRQn = -2, /*!< 14 Cortex-M3 Pend SV Interrupt */ + SysTick_IRQn = -1, /*!< 15 Cortex-M3 System Tick Interrupt */ + +/****** STM32 specific Interrupt Numbers *********************************************************/ + WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */ + PVD_IRQn = 1, /*!< PVD through EXTI Line detection Interrupt */ + TAMPER_IRQn = 2, /*!< Tamper Interrupt */ + RTC_IRQn = 3, /*!< RTC global Interrupt */ + FLASH_IRQn = 4, /*!< FLASH global Interrupt */ + RCC_IRQn = 5, /*!< RCC global Interrupt */ + EXTI0_IRQn = 6, /*!< EXTI Line0 Interrupt */ + EXTI1_IRQn = 7, /*!< EXTI Line1 Interrupt */ + EXTI2_IRQn = 8, /*!< EXTI Line2 Interrupt */ + EXTI3_IRQn = 9, /*!< EXTI Line3 Interrupt */ + EXTI4_IRQn = 10, /*!< EXTI Line4 Interrupt */ + DMA1_Channel1_IRQn = 11, /*!< DMA1 Channel 1 global Interrupt */ + DMA1_Channel2_IRQn = 12, /*!< DMA1 Channel 2 global Interrupt */ + DMA1_Channel3_IRQn = 13, /*!< DMA1 Channel 3 global Interrupt */ + DMA1_Channel4_IRQn = 14, /*!< DMA1 Channel 4 global Interrupt */ + DMA1_Channel5_IRQn = 15, /*!< DMA1 Channel 5 global Interrupt */ + DMA1_Channel6_IRQn = 16, /*!< DMA1 Channel 6 global Interrupt */ + DMA1_Channel7_IRQn = 17, /*!< DMA1 Channel 7 global Interrupt */ + +#ifdef STM32F10X_LD + ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ + USB_HP_CAN1_TX_IRQn = 19, /*!< USB Device High Priority or CAN1 TX Interrupts */ + USB_LP_CAN1_RX0_IRQn = 20, /*!< USB Device Low Priority or CAN1 RX0 Interrupts */ + CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ + CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ + EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ + TIM1_BRK_IRQn = 24, /*!< TIM1 Break Interrupt */ + TIM1_UP_IRQn = 25, /*!< TIM1 Update Interrupt */ + TIM1_TRG_COM_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt */ + TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ + TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ + TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ + I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ + I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ + SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ + USART1_IRQn = 37, /*!< USART1 global Interrupt */ + USART2_IRQn = 38, /*!< USART2 global Interrupt */ + EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ + RTCAlarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ + USBWakeUp_IRQn = 42 /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */ +#endif /* STM32F10X_LD */ + +#ifdef STM32F10X_LD_VL + ADC1_IRQn = 18, /*!< ADC1 global Interrupt */ + EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ + TIM1_BRK_TIM15_IRQn = 24, /*!< TIM1 Break and TIM15 Interrupts */ + TIM1_UP_TIM16_IRQn = 25, /*!< TIM1 Update and TIM16 Interrupts */ + TIM1_TRG_COM_TIM17_IRQn = 26, /*!< TIM1 Trigger and Commutation and TIM17 Interrupt */ + TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ + TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ + TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ + I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ + I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ + SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ + USART1_IRQn = 37, /*!< USART1 global Interrupt */ + USART2_IRQn = 38, /*!< USART2 global Interrupt */ + EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ + RTCAlarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ + CEC_IRQn = 42, /*!< HDMI-CEC Interrupt */ + TIM6_DAC_IRQn = 54, /*!< TIM6 and DAC underrun Interrupt */ + TIM7_IRQn = 55 /*!< TIM7 Interrupt */ +#endif /* STM32F10X_LD_VL */ + +#ifdef STM32F10X_MD + ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ + USB_HP_CAN1_TX_IRQn = 19, /*!< USB Device High Priority or CAN1 TX Interrupts */ + USB_LP_CAN1_RX0_IRQn = 20, /*!< USB Device Low Priority or CAN1 RX0 Interrupts */ + CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ + CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ + EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ + TIM1_BRK_IRQn = 24, /*!< TIM1 Break Interrupt */ + TIM1_UP_IRQn = 25, /*!< TIM1 Update Interrupt */ + TIM1_TRG_COM_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt */ + TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ + TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ + TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ + TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ + I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ + I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ + I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ + I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ + SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ + SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ + USART1_IRQn = 37, /*!< USART1 global Interrupt */ + USART2_IRQn = 38, /*!< USART2 global Interrupt */ + USART3_IRQn = 39, /*!< USART3 global Interrupt */ + EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ + RTCAlarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ + USBWakeUp_IRQn = 42 /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */ +#endif /* STM32F10X_MD */ + +#ifdef STM32F10X_MD_VL + ADC1_IRQn = 18, /*!< ADC1 global Interrupt */ + EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ + TIM1_BRK_TIM15_IRQn = 24, /*!< TIM1 Break and TIM15 Interrupts */ + TIM1_UP_TIM16_IRQn = 25, /*!< TIM1 Update and TIM16 Interrupts */ + TIM1_TRG_COM_TIM17_IRQn = 26, /*!< TIM1 Trigger and Commutation and TIM17 Interrupt */ + TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ + TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ + TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ + TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ + I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ + I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ + I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ + I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ + SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ + SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ + USART1_IRQn = 37, /*!< USART1 global Interrupt */ + USART2_IRQn = 38, /*!< USART2 global Interrupt */ + USART3_IRQn = 39, /*!< USART3 global Interrupt */ + EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ + RTCAlarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ + CEC_IRQn = 42, /*!< HDMI-CEC Interrupt */ + TIM6_DAC_IRQn = 54, /*!< TIM6 and DAC underrun Interrupt */ + TIM7_IRQn = 55 /*!< TIM7 Interrupt */ +#endif /* STM32F10X_MD_VL */ + +#ifdef STM32F10X_HD + ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ + USB_HP_CAN1_TX_IRQn = 19, /*!< USB Device High Priority or CAN1 TX Interrupts */ + USB_LP_CAN1_RX0_IRQn = 20, /*!< USB Device Low Priority or CAN1 RX0 Interrupts */ + CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ + CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ + EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ + TIM1_BRK_IRQn = 24, /*!< TIM1 Break Interrupt */ + TIM1_UP_IRQn = 25, /*!< TIM1 Update Interrupt */ + TIM1_TRG_COM_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt */ + TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ + TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ + TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ + TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ + I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ + I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ + I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ + I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ + SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ + SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ + USART1_IRQn = 37, /*!< USART1 global Interrupt */ + USART2_IRQn = 38, /*!< USART2 global Interrupt */ + USART3_IRQn = 39, /*!< USART3 global Interrupt */ + EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ + RTCAlarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ + USBWakeUp_IRQn = 42, /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */ + TIM8_BRK_IRQn = 43, /*!< TIM8 Break Interrupt */ + TIM8_UP_IRQn = 44, /*!< TIM8 Update Interrupt */ + TIM8_TRG_COM_IRQn = 45, /*!< TIM8 Trigger and Commutation Interrupt */ + TIM8_CC_IRQn = 46, /*!< TIM8 Capture Compare Interrupt */ + ADC3_IRQn = 47, /*!< ADC3 global Interrupt */ + FSMC_IRQn = 48, /*!< FSMC global Interrupt */ + SDIO_IRQn = 49, /*!< SDIO global Interrupt */ + TIM5_IRQn = 50, /*!< TIM5 global Interrupt */ + SPI3_IRQn = 51, /*!< SPI3 global Interrupt */ + UART4_IRQn = 52, /*!< UART4 global Interrupt */ + UART5_IRQn = 53, /*!< UART5 global Interrupt */ + TIM6_IRQn = 54, /*!< TIM6 global Interrupt */ + TIM7_IRQn = 55, /*!< TIM7 global Interrupt */ + DMA2_Channel1_IRQn = 56, /*!< DMA2 Channel 1 global Interrupt */ + DMA2_Channel2_IRQn = 57, /*!< DMA2 Channel 2 global Interrupt */ + DMA2_Channel3_IRQn = 58, /*!< DMA2 Channel 3 global Interrupt */ + DMA2_Channel4_5_IRQn = 59 /*!< DMA2 Channel 4 and Channel 5 global Interrupt */ +#endif /* STM32F10X_HD */ + +#ifdef STM32F10X_HD_VL + ADC1_IRQn = 18, /*!< ADC1 global Interrupt */ + EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ + TIM1_BRK_TIM15_IRQn = 24, /*!< TIM1 Break and TIM15 Interrupts */ + TIM1_UP_TIM16_IRQn = 25, /*!< TIM1 Update and TIM16 Interrupts */ + TIM1_TRG_COM_TIM17_IRQn = 26, /*!< TIM1 Trigger and Commutation and TIM17 Interrupt */ + TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ + TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ + TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ + TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ + I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ + I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ + I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ + I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ + SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ + SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ + USART1_IRQn = 37, /*!< USART1 global Interrupt */ + USART2_IRQn = 38, /*!< USART2 global Interrupt */ + USART3_IRQn = 39, /*!< USART3 global Interrupt */ + EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ + RTCAlarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ + CEC_IRQn = 42, /*!< HDMI-CEC Interrupt */ + TIM12_IRQn = 43, /*!< TIM12 global Interrupt */ + TIM13_IRQn = 44, /*!< TIM13 global Interrupt */ + TIM14_IRQn = 45, /*!< TIM14 global Interrupt */ + TIM5_IRQn = 50, /*!< TIM5 global Interrupt */ + SPI3_IRQn = 51, /*!< SPI3 global Interrupt */ + UART4_IRQn = 52, /*!< UART4 global Interrupt */ + UART5_IRQn = 53, /*!< UART5 global Interrupt */ + TIM6_DAC_IRQn = 54, /*!< TIM6 and DAC underrun Interrupt */ + TIM7_IRQn = 55, /*!< TIM7 Interrupt */ + DMA2_Channel1_IRQn = 56, /*!< DMA2 Channel 1 global Interrupt */ + DMA2_Channel2_IRQn = 57, /*!< DMA2 Channel 2 global Interrupt */ + DMA2_Channel3_IRQn = 58, /*!< DMA2 Channel 3 global Interrupt */ + DMA2_Channel4_5_IRQn = 59, /*!< DMA2 Channel 4 and Channel 5 global Interrupt */ + DMA2_Channel5_IRQn = 60 /*!< DMA2 Channel 5 global Interrupt (DMA2 Channel 5 is + mapped at position 60 only if the MISC_REMAP bit in + the AFIO_MAPR2 register is set) */ +#endif /* STM32F10X_HD_VL */ + +#ifdef STM32F10X_XL + ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ + USB_HP_CAN1_TX_IRQn = 19, /*!< USB Device High Priority or CAN1 TX Interrupts */ + USB_LP_CAN1_RX0_IRQn = 20, /*!< USB Device Low Priority or CAN1 RX0 Interrupts */ + CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ + CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ + EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ + TIM1_BRK_TIM9_IRQn = 24, /*!< TIM1 Break Interrupt and TIM9 global Interrupt */ + TIM1_UP_TIM10_IRQn = 25, /*!< TIM1 Update Interrupt and TIM10 global Interrupt */ + TIM1_TRG_COM_TIM11_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt and TIM11 global interrupt */ + TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ + TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ + TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ + TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ + I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ + I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ + I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ + I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ + SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ + SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ + USART1_IRQn = 37, /*!< USART1 global Interrupt */ + USART2_IRQn = 38, /*!< USART2 global Interrupt */ + USART3_IRQn = 39, /*!< USART3 global Interrupt */ + EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ + RTCAlarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ + USBWakeUp_IRQn = 42, /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */ + TIM8_BRK_TIM12_IRQn = 43, /*!< TIM8 Break Interrupt and TIM12 global Interrupt */ + TIM8_UP_TIM13_IRQn = 44, /*!< TIM8 Update Interrupt and TIM13 global Interrupt */ + TIM8_TRG_COM_TIM14_IRQn = 45, /*!< TIM8 Trigger and Commutation Interrupt and TIM14 global interrupt */ + TIM8_CC_IRQn = 46, /*!< TIM8 Capture Compare Interrupt */ + ADC3_IRQn = 47, /*!< ADC3 global Interrupt */ + FSMC_IRQn = 48, /*!< FSMC global Interrupt */ + SDIO_IRQn = 49, /*!< SDIO global Interrupt */ + TIM5_IRQn = 50, /*!< TIM5 global Interrupt */ + SPI3_IRQn = 51, /*!< SPI3 global Interrupt */ + UART4_IRQn = 52, /*!< UART4 global Interrupt */ + UART5_IRQn = 53, /*!< UART5 global Interrupt */ + TIM6_IRQn = 54, /*!< TIM6 global Interrupt */ + TIM7_IRQn = 55, /*!< TIM7 global Interrupt */ + DMA2_Channel1_IRQn = 56, /*!< DMA2 Channel 1 global Interrupt */ + DMA2_Channel2_IRQn = 57, /*!< DMA2 Channel 2 global Interrupt */ + DMA2_Channel3_IRQn = 58, /*!< DMA2 Channel 3 global Interrupt */ + DMA2_Channel4_5_IRQn = 59 /*!< DMA2 Channel 4 and Channel 5 global Interrupt */ +#endif /* STM32F10X_XL */ + +#ifdef STM32F10X_CL + ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ + CAN1_TX_IRQn = 19, /*!< USB Device High Priority or CAN1 TX Interrupts */ + CAN1_RX0_IRQn = 20, /*!< USB Device Low Priority or CAN1 RX0 Interrupts */ + CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ + CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ + EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ + TIM1_BRK_IRQn = 24, /*!< TIM1 Break Interrupt */ + TIM1_UP_IRQn = 25, /*!< TIM1 Update Interrupt */ + TIM1_TRG_COM_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt */ + TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ + TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ + TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ + TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ + I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ + I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ + I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ + I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ + SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ + SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ + USART1_IRQn = 37, /*!< USART1 global Interrupt */ + USART2_IRQn = 38, /*!< USART2 global Interrupt */ + USART3_IRQn = 39, /*!< USART3 global Interrupt */ + EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ + RTCAlarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ + OTG_FS_WKUP_IRQn = 42, /*!< USB OTG FS WakeUp from suspend through EXTI Line Interrupt */ + TIM5_IRQn = 50, /*!< TIM5 global Interrupt */ + SPI3_IRQn = 51, /*!< SPI3 global Interrupt */ + UART4_IRQn = 52, /*!< UART4 global Interrupt */ + UART5_IRQn = 53, /*!< UART5 global Interrupt */ + TIM6_IRQn = 54, /*!< TIM6 global Interrupt */ + TIM7_IRQn = 55, /*!< TIM7 global Interrupt */ + DMA2_Channel1_IRQn = 56, /*!< DMA2 Channel 1 global Interrupt */ + DMA2_Channel2_IRQn = 57, /*!< DMA2 Channel 2 global Interrupt */ + DMA2_Channel3_IRQn = 58, /*!< DMA2 Channel 3 global Interrupt */ + DMA2_Channel4_IRQn = 59, /*!< DMA2 Channel 4 global Interrupt */ + DMA2_Channel5_IRQn = 60, /*!< DMA2 Channel 5 global Interrupt */ + ETH_IRQn = 61, /*!< Ethernet global Interrupt */ + ETH_WKUP_IRQn = 62, /*!< Ethernet Wakeup through EXTI line Interrupt */ + CAN2_TX_IRQn = 63, /*!< CAN2 TX Interrupt */ + CAN2_RX0_IRQn = 64, /*!< CAN2 RX0 Interrupt */ + CAN2_RX1_IRQn = 65, /*!< CAN2 RX1 Interrupt */ + CAN2_SCE_IRQn = 66, /*!< CAN2 SCE Interrupt */ + OTG_FS_IRQn = 67 /*!< USB OTG FS global Interrupt */ +#endif /* STM32F10X_CL */ +} IRQn_Type; + +/** + * @} + */ + +#include "core_cm3.h" +#include "system_stm32f10x.h" +#include + +/** @addtogroup Exported_types + * @{ + */ + +/*!< STM32F10x Standard Peripheral Library old types (maintained for legacy purpose) */ +typedef int32_t s32; +typedef int16_t s16; +typedef int8_t s8; + +typedef const int32_t sc32; /*!< Read Only */ +typedef const int16_t sc16; /*!< Read Only */ +typedef const int8_t sc8; /*!< Read Only */ + +typedef __IO int32_t vs32; +typedef __IO int16_t vs16; +typedef __IO int8_t vs8; + +typedef __I int32_t vsc32; /*!< Read Only */ +typedef __I int16_t vsc16; /*!< Read Only */ +typedef __I int8_t vsc8; /*!< Read Only */ + +typedef uint32_t u32; +typedef uint16_t u16; +typedef uint8_t u8; + +typedef const uint32_t uc32; /*!< Read Only */ +typedef const uint16_t uc16; /*!< Read Only */ +typedef const uint8_t uc8; /*!< Read Only */ + +typedef __IO uint32_t vu32; +typedef __IO uint16_t vu16; +typedef __IO uint8_t vu8; + +typedef __I uint32_t vuc32; /*!< Read Only */ +typedef __I uint16_t vuc16; /*!< Read Only */ +typedef __I uint8_t vuc8; /*!< Read Only */ + +typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus; + +typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState; +#define IS_FUNCTIONAL_STATE(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE)) + +typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrorStatus; + +/*!< STM32F10x Standard Peripheral Library old definitions (maintained for legacy purpose) */ +#define HSEStartUp_TimeOut HSE_STARTUP_TIMEOUT +#define HSE_Value HSE_VALUE +#define HSI_Value HSI_VALUE +/** + * @} + */ + +/** @addtogroup Peripheral_registers_structures + * @{ + */ + +/** + * @brief Analog to Digital Converter + */ + +typedef struct +{ + __IO uint32_t SR; + __IO uint32_t CR1; + __IO uint32_t CR2; + __IO uint32_t SMPR1; + __IO uint32_t SMPR2; + __IO uint32_t JOFR1; + __IO uint32_t JOFR2; + __IO uint32_t JOFR3; + __IO uint32_t JOFR4; + __IO uint32_t HTR; + __IO uint32_t LTR; + __IO uint32_t SQR1; + __IO uint32_t SQR2; + __IO uint32_t SQR3; + __IO uint32_t JSQR; + __IO uint32_t JDR1; + __IO uint32_t JDR2; + __IO uint32_t JDR3; + __IO uint32_t JDR4; + __IO uint32_t DR; +} ADC_TypeDef; + +/** + * @brief Backup Registers + */ + +typedef struct +{ + uint32_t RESERVED0; + __IO uint16_t DR1; + uint16_t RESERVED1; + __IO uint16_t DR2; + uint16_t RESERVED2; + __IO uint16_t DR3; + uint16_t RESERVED3; + __IO uint16_t DR4; + uint16_t RESERVED4; + __IO uint16_t DR5; + uint16_t RESERVED5; + __IO uint16_t DR6; + uint16_t RESERVED6; + __IO uint16_t DR7; + uint16_t RESERVED7; + __IO uint16_t DR8; + uint16_t RESERVED8; + __IO uint16_t DR9; + uint16_t RESERVED9; + __IO uint16_t DR10; + uint16_t RESERVED10; + __IO uint16_t RTCCR; + uint16_t RESERVED11; + __IO uint16_t CR; + uint16_t RESERVED12; + __IO uint16_t CSR; + uint16_t RESERVED13[5]; + __IO uint16_t DR11; + uint16_t RESERVED14; + __IO uint16_t DR12; + uint16_t RESERVED15; + __IO uint16_t DR13; + uint16_t RESERVED16; + __IO uint16_t DR14; + uint16_t RESERVED17; + __IO uint16_t DR15; + uint16_t RESERVED18; + __IO uint16_t DR16; + uint16_t RESERVED19; + __IO uint16_t DR17; + uint16_t RESERVED20; + __IO uint16_t DR18; + uint16_t RESERVED21; + __IO uint16_t DR19; + uint16_t RESERVED22; + __IO uint16_t DR20; + uint16_t RESERVED23; + __IO uint16_t DR21; + uint16_t RESERVED24; + __IO uint16_t DR22; + uint16_t RESERVED25; + __IO uint16_t DR23; + uint16_t RESERVED26; + __IO uint16_t DR24; + uint16_t RESERVED27; + __IO uint16_t DR25; + uint16_t RESERVED28; + __IO uint16_t DR26; + uint16_t RESERVED29; + __IO uint16_t DR27; + uint16_t RESERVED30; + __IO uint16_t DR28; + uint16_t RESERVED31; + __IO uint16_t DR29; + uint16_t RESERVED32; + __IO uint16_t DR30; + uint16_t RESERVED33; + __IO uint16_t DR31; + uint16_t RESERVED34; + __IO uint16_t DR32; + uint16_t RESERVED35; + __IO uint16_t DR33; + uint16_t RESERVED36; + __IO uint16_t DR34; + uint16_t RESERVED37; + __IO uint16_t DR35; + uint16_t RESERVED38; + __IO uint16_t DR36; + uint16_t RESERVED39; + __IO uint16_t DR37; + uint16_t RESERVED40; + __IO uint16_t DR38; + uint16_t RESERVED41; + __IO uint16_t DR39; + uint16_t RESERVED42; + __IO uint16_t DR40; + uint16_t RESERVED43; + __IO uint16_t DR41; + uint16_t RESERVED44; + __IO uint16_t DR42; + uint16_t RESERVED45; +} BKP_TypeDef; + +/** + * @brief Controller Area Network TxMailBox + */ + +typedef struct +{ + __IO uint32_t TIR; + __IO uint32_t TDTR; + __IO uint32_t TDLR; + __IO uint32_t TDHR; +} CAN_TxMailBox_TypeDef; + +/** + * @brief Controller Area Network FIFOMailBox + */ + +typedef struct +{ + __IO uint32_t RIR; + __IO uint32_t RDTR; + __IO uint32_t RDLR; + __IO uint32_t RDHR; +} CAN_FIFOMailBox_TypeDef; + +/** + * @brief Controller Area Network FilterRegister + */ + +typedef struct +{ + __IO uint32_t FR1; + __IO uint32_t FR2; +} CAN_FilterRegister_TypeDef; + +/** + * @brief Controller Area Network + */ + +typedef struct +{ + __IO uint32_t MCR; + __IO uint32_t MSR; + __IO uint32_t TSR; + __IO uint32_t RF0R; + __IO uint32_t RF1R; + __IO uint32_t IER; + __IO uint32_t ESR; + __IO uint32_t BTR; + uint32_t RESERVED0[88]; + CAN_TxMailBox_TypeDef sTxMailBox[3]; + CAN_FIFOMailBox_TypeDef sFIFOMailBox[2]; + uint32_t RESERVED1[12]; + __IO uint32_t FMR; + __IO uint32_t FM1R; + uint32_t RESERVED2; + __IO uint32_t FS1R; + uint32_t RESERVED3; + __IO uint32_t FFA1R; + uint32_t RESERVED4; + __IO uint32_t FA1R; + uint32_t RESERVED5[8]; +#ifndef STM32F10X_CL + CAN_FilterRegister_TypeDef sFilterRegister[14]; +#else + CAN_FilterRegister_TypeDef sFilterRegister[28]; +#endif /* STM32F10X_CL */ +} CAN_TypeDef; + +/** + * @brief Consumer Electronics Control (CEC) + */ +typedef struct +{ + __IO uint32_t CFGR; + __IO uint32_t OAR; + __IO uint32_t PRES; + __IO uint32_t ESR; + __IO uint32_t CSR; + __IO uint32_t TXD; + __IO uint32_t RXD; +} CEC_TypeDef; + +/** + * @brief CRC calculation unit + */ + +typedef struct +{ + __IO uint32_t DR; + __IO uint8_t IDR; + uint8_t RESERVED0; + uint16_t RESERVED1; + __IO uint32_t CR; +} CRC_TypeDef; + +/** + * @brief Digital to Analog Converter + */ + +typedef struct +{ + __IO uint32_t CR; + __IO uint32_t SWTRIGR; + __IO uint32_t DHR12R1; + __IO uint32_t DHR12L1; + __IO uint32_t DHR8R1; + __IO uint32_t DHR12R2; + __IO uint32_t DHR12L2; + __IO uint32_t DHR8R2; + __IO uint32_t DHR12RD; + __IO uint32_t DHR12LD; + __IO uint32_t DHR8RD; + __IO uint32_t DOR1; + __IO uint32_t DOR2; +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) + __IO uint32_t SR; +#endif +} DAC_TypeDef; + +/** + * @brief Debug MCU + */ + +typedef struct +{ + __IO uint32_t IDCODE; + __IO uint32_t CR; +}DBGMCU_TypeDef; + +/** + * @brief DMA Controller + */ + +typedef struct +{ + __IO uint32_t CCR; + __IO uint32_t CNDTR; + __IO uint32_t CPAR; + __IO uint32_t CMAR; +} DMA_Channel_TypeDef; + +typedef struct +{ + __IO uint32_t ISR; + __IO uint32_t IFCR; +} DMA_TypeDef; + +/** + * @brief Ethernet MAC + */ + +typedef struct +{ + __IO uint32_t MACCR; + __IO uint32_t MACFFR; + __IO uint32_t MACHTHR; + __IO uint32_t MACHTLR; + __IO uint32_t MACMIIAR; + __IO uint32_t MACMIIDR; + __IO uint32_t MACFCR; + __IO uint32_t MACVLANTR; /* 8 */ + uint32_t RESERVED0[2]; + __IO uint32_t MACRWUFFR; /* 11 */ + __IO uint32_t MACPMTCSR; + uint32_t RESERVED1[2]; + __IO uint32_t MACSR; /* 15 */ + __IO uint32_t MACIMR; + __IO uint32_t MACA0HR; + __IO uint32_t MACA0LR; + __IO uint32_t MACA1HR; + __IO uint32_t MACA1LR; + __IO uint32_t MACA2HR; + __IO uint32_t MACA2LR; + __IO uint32_t MACA3HR; + __IO uint32_t MACA3LR; /* 24 */ + uint32_t RESERVED2[40]; + __IO uint32_t MMCCR; /* 65 */ + __IO uint32_t MMCRIR; + __IO uint32_t MMCTIR; + __IO uint32_t MMCRIMR; + __IO uint32_t MMCTIMR; /* 69 */ + uint32_t RESERVED3[14]; + __IO uint32_t MMCTGFSCCR; /* 84 */ + __IO uint32_t MMCTGFMSCCR; + uint32_t RESERVED4[5]; + __IO uint32_t MMCTGFCR; + uint32_t RESERVED5[10]; + __IO uint32_t MMCRFCECR; + __IO uint32_t MMCRFAECR; + uint32_t RESERVED6[10]; + __IO uint32_t MMCRGUFCR; + uint32_t RESERVED7[334]; + __IO uint32_t PTPTSCR; + __IO uint32_t PTPSSIR; + __IO uint32_t PTPTSHR; + __IO uint32_t PTPTSLR; + __IO uint32_t PTPTSHUR; + __IO uint32_t PTPTSLUR; + __IO uint32_t PTPTSAR; + __IO uint32_t PTPTTHR; + __IO uint32_t PTPTTLR; + uint32_t RESERVED8[567]; + __IO uint32_t DMABMR; + __IO uint32_t DMATPDR; + __IO uint32_t DMARPDR; + __IO uint32_t DMARDLAR; + __IO uint32_t DMATDLAR; + __IO uint32_t DMASR; + __IO uint32_t DMAOMR; + __IO uint32_t DMAIER; + __IO uint32_t DMAMFBOCR; + uint32_t RESERVED9[9]; + __IO uint32_t DMACHTDR; + __IO uint32_t DMACHRDR; + __IO uint32_t DMACHTBAR; + __IO uint32_t DMACHRBAR; +} ETH_TypeDef; + +/** + * @brief External Interrupt/Event Controller + */ + +typedef struct +{ + __IO uint32_t IMR; + __IO uint32_t EMR; + __IO uint32_t RTSR; + __IO uint32_t FTSR; + __IO uint32_t SWIER; + __IO uint32_t PR; +} EXTI_TypeDef; + +/** + * @brief FLASH Registers + */ + +typedef struct +{ + __IO uint32_t ACR; + __IO uint32_t KEYR; + __IO uint32_t OPTKEYR; + __IO uint32_t SR; + __IO uint32_t CR; + __IO uint32_t AR; + __IO uint32_t RESERVED; + __IO uint32_t OBR; + __IO uint32_t WRPR; +#ifdef STM32F10X_XL + uint32_t RESERVED1[8]; + __IO uint32_t KEYR2; + uint32_t RESERVED2; + __IO uint32_t SR2; + __IO uint32_t CR2; + __IO uint32_t AR2; +#endif /* STM32F10X_XL */ +} FLASH_TypeDef; + +/** + * @brief Option Bytes Registers + */ + +typedef struct +{ + __IO uint16_t RDP; + __IO uint16_t USER; + __IO uint16_t Data0; + __IO uint16_t Data1; + __IO uint16_t WRP0; + __IO uint16_t WRP1; + __IO uint16_t WRP2; + __IO uint16_t WRP3; +} OB_TypeDef; + +/** + * @brief Flexible Static Memory Controller + */ + +typedef struct +{ + __IO uint32_t BTCR[8]; +} FSMC_Bank1_TypeDef; + +/** + * @brief Flexible Static Memory Controller Bank1E + */ + +typedef struct +{ + __IO uint32_t BWTR[7]; +} FSMC_Bank1E_TypeDef; + +/** + * @brief Flexible Static Memory Controller Bank2 + */ + +typedef struct +{ + __IO uint32_t PCR2; + __IO uint32_t SR2; + __IO uint32_t PMEM2; + __IO uint32_t PATT2; + uint32_t RESERVED0; + __IO uint32_t ECCR2; +} FSMC_Bank2_TypeDef; + +/** + * @brief Flexible Static Memory Controller Bank3 + */ + +typedef struct +{ + __IO uint32_t PCR3; + __IO uint32_t SR3; + __IO uint32_t PMEM3; + __IO uint32_t PATT3; + uint32_t RESERVED0; + __IO uint32_t ECCR3; +} FSMC_Bank3_TypeDef; + +/** + * @brief Flexible Static Memory Controller Bank4 + */ + +typedef struct +{ + __IO uint32_t PCR4; + __IO uint32_t SR4; + __IO uint32_t PMEM4; + __IO uint32_t PATT4; + __IO uint32_t PIO4; +} FSMC_Bank4_TypeDef; + +/** + * @brief General Purpose I/O + */ + +typedef struct +{ + __IO uint32_t CRL; + __IO uint32_t CRH; + __IO uint32_t IDR; + __IO uint32_t ODR; + __IO uint32_t BSRR; + __IO uint32_t BRR; + __IO uint32_t LCKR; +} GPIO_TypeDef; + +/** + * @brief Alternate Function I/O + */ + +typedef struct +{ + __IO uint32_t EVCR; + __IO uint32_t MAPR; + __IO uint32_t EXTICR[4]; + uint32_t RESERVED0; + __IO uint32_t MAPR2; +} AFIO_TypeDef; +/** + * @brief Inter Integrated Circuit Interface + */ + +typedef struct +{ + __IO uint16_t CR1; + uint16_t RESERVED0; + __IO uint16_t CR2; + uint16_t RESERVED1; + __IO uint16_t OAR1; + uint16_t RESERVED2; + __IO uint16_t OAR2; + uint16_t RESERVED3; + __IO uint16_t DR; + uint16_t RESERVED4; + __IO uint16_t SR1; + uint16_t RESERVED5; + __IO uint16_t SR2; + uint16_t RESERVED6; + __IO uint16_t CCR; + uint16_t RESERVED7; + __IO uint16_t TRISE; + uint16_t RESERVED8; +} I2C_TypeDef; + +/** + * @brief Independent WATCHDOG + */ + +typedef struct +{ + __IO uint32_t KR; + __IO uint32_t PR; + __IO uint32_t RLR; + __IO uint32_t SR; +} IWDG_TypeDef; + +/** + * @brief Power Control + */ + +typedef struct +{ + __IO uint32_t CR; + __IO uint32_t CSR; +} PWR_TypeDef; + +/** + * @brief Reset and Clock Control + */ + +typedef struct +{ + __IO uint32_t CR; + __IO uint32_t CFGR; + __IO uint32_t CIR; + __IO uint32_t APB2RSTR; + __IO uint32_t APB1RSTR; + __IO uint32_t AHBENR; + __IO uint32_t APB2ENR; + __IO uint32_t APB1ENR; + __IO uint32_t BDCR; + __IO uint32_t CSR; + +#ifdef STM32F10X_CL + __IO uint32_t AHBRSTR; + __IO uint32_t CFGR2; +#endif /* STM32F10X_CL */ + +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) + uint32_t RESERVED0; + __IO uint32_t CFGR2; +#endif /* STM32F10X_LD_VL || STM32F10X_MD_VL || STM32F10X_HD_VL */ +} RCC_TypeDef; + +/** + * @brief Real-Time Clock + */ + +typedef struct +{ + __IO uint16_t CRH; + uint16_t RESERVED0; + __IO uint16_t CRL; + uint16_t RESERVED1; + __IO uint16_t PRLH; + uint16_t RESERVED2; + __IO uint16_t PRLL; + uint16_t RESERVED3; + __IO uint16_t DIVH; + uint16_t RESERVED4; + __IO uint16_t DIVL; + uint16_t RESERVED5; + __IO uint16_t CNTH; + uint16_t RESERVED6; + __IO uint16_t CNTL; + uint16_t RESERVED7; + __IO uint16_t ALRH; + uint16_t RESERVED8; + __IO uint16_t ALRL; + uint16_t RESERVED9; +} RTC_TypeDef; + +/** + * @brief SD host Interface + */ + +typedef struct +{ + __IO uint32_t POWER; + __IO uint32_t CLKCR; + __IO uint32_t ARG; + __IO uint32_t CMD; + __I uint32_t RESPCMD; + __I uint32_t RESP1; + __I uint32_t RESP2; + __I uint32_t RESP3; + __I uint32_t RESP4; + __IO uint32_t DTIMER; + __IO uint32_t DLEN; + __IO uint32_t DCTRL; + __I uint32_t DCOUNT; + __I uint32_t STA; + __IO uint32_t ICR; + __IO uint32_t MASK; + uint32_t RESERVED0[2]; + __I uint32_t FIFOCNT; + uint32_t RESERVED1[13]; + __IO uint32_t FIFO; +} SDIO_TypeDef; + +/** + * @brief Serial Peripheral Interface + */ + +typedef struct +{ + __IO uint16_t CR1; + uint16_t RESERVED0; + __IO uint16_t CR2; + uint16_t RESERVED1; + __IO uint16_t SR; + uint16_t RESERVED2; + __IO uint16_t DR; + uint16_t RESERVED3; + __IO uint16_t CRCPR; + uint16_t RESERVED4; + __IO uint16_t RXCRCR; + uint16_t RESERVED5; + __IO uint16_t TXCRCR; + uint16_t RESERVED6; + __IO uint16_t I2SCFGR; + uint16_t RESERVED7; + __IO uint16_t I2SPR; + uint16_t RESERVED8; +} SPI_TypeDef; + +/** + * @brief TIM + */ + +typedef struct +{ + __IO uint16_t CR1; + uint16_t RESERVED0; + __IO uint16_t CR2; + uint16_t RESERVED1; + __IO uint16_t SMCR; + uint16_t RESERVED2; + __IO uint16_t DIER; + uint16_t RESERVED3; + __IO uint16_t SR; + uint16_t RESERVED4; + __IO uint16_t EGR; + uint16_t RESERVED5; + __IO uint16_t CCMR1; + uint16_t RESERVED6; + __IO uint16_t CCMR2; + uint16_t RESERVED7; + __IO uint16_t CCER; + uint16_t RESERVED8; + __IO uint16_t CNT; + uint16_t RESERVED9; + __IO uint16_t PSC; + uint16_t RESERVED10; + __IO uint16_t ARR; + uint16_t RESERVED11; + __IO uint16_t RCR; + uint16_t RESERVED12; + __IO uint16_t CCR1; + uint16_t RESERVED13; + __IO uint16_t CCR2; + uint16_t RESERVED14; + __IO uint16_t CCR3; + uint16_t RESERVED15; + __IO uint16_t CCR4; + uint16_t RESERVED16; + __IO uint16_t BDTR; + uint16_t RESERVED17; + __IO uint16_t DCR; + uint16_t RESERVED18; + __IO uint16_t DMAR; + uint16_t RESERVED19; +} TIM_TypeDef; + +/** + * @brief Universal Synchronous Asynchronous Receiver Transmitter + */ + +typedef struct +{ + __IO uint16_t SR; + uint16_t RESERVED0; + __IO uint16_t DR; + uint16_t RESERVED1; + __IO uint16_t BRR; + uint16_t RESERVED2; + __IO uint16_t CR1; + uint16_t RESERVED3; + __IO uint16_t CR2; + uint16_t RESERVED4; + __IO uint16_t CR3; + uint16_t RESERVED5; + __IO uint16_t GTPR; + uint16_t RESERVED6; +} USART_TypeDef; + +/** + * @brief Window WATCHDOG + */ + +typedef struct +{ + __IO uint32_t CR; + __IO uint32_t CFR; + __IO uint32_t SR; +} WWDG_TypeDef; + +/** + * @} + */ + +/** @addtogroup Peripheral_memory_map + * @{ + */ + + +#define FLASH_BASE ((uint32_t)0x08000000) /*!< FLASH base address in the alias region */ +#define SRAM_BASE ((uint32_t)0x20000000) /*!< SRAM base address in the alias region */ +#define PERIPH_BASE ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */ + +#define SRAM_BB_BASE ((uint32_t)0x22000000) /*!< SRAM base address in the bit-band region */ +#define PERIPH_BB_BASE ((uint32_t)0x42000000) /*!< Peripheral base address in the bit-band region */ + +#define FSMC_R_BASE ((uint32_t)0xA0000000) /*!< FSMC registers base address */ + +/*!< Peripheral memory map */ +#define APB1PERIPH_BASE PERIPH_BASE +#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000) +#define AHBPERIPH_BASE (PERIPH_BASE + 0x20000) + +#define TIM2_BASE (APB1PERIPH_BASE + 0x0000) +#define TIM3_BASE (APB1PERIPH_BASE + 0x0400) +#define TIM4_BASE (APB1PERIPH_BASE + 0x0800) +#define TIM5_BASE (APB1PERIPH_BASE + 0x0C00) +#define TIM6_BASE (APB1PERIPH_BASE + 0x1000) +#define TIM7_BASE (APB1PERIPH_BASE + 0x1400) +#define TIM12_BASE (APB1PERIPH_BASE + 0x1800) +#define TIM13_BASE (APB1PERIPH_BASE + 0x1C00) +#define TIM14_BASE (APB1PERIPH_BASE + 0x2000) +#define RTC_BASE (APB1PERIPH_BASE + 0x2800) +#define WWDG_BASE (APB1PERIPH_BASE + 0x2C00) +#define IWDG_BASE (APB1PERIPH_BASE + 0x3000) +#define SPI2_BASE (APB1PERIPH_BASE + 0x3800) +#define SPI3_BASE (APB1PERIPH_BASE + 0x3C00) +#define USART2_BASE (APB1PERIPH_BASE + 0x4400) +#define USART3_BASE (APB1PERIPH_BASE + 0x4800) +#define UART4_BASE (APB1PERIPH_BASE + 0x4C00) +#define UART5_BASE (APB1PERIPH_BASE + 0x5000) +#define I2C1_BASE (APB1PERIPH_BASE + 0x5400) +#define I2C2_BASE (APB1PERIPH_BASE + 0x5800) +#define CAN1_BASE (APB1PERIPH_BASE + 0x6400) +#define CAN2_BASE (APB1PERIPH_BASE + 0x6800) +#define BKP_BASE (APB1PERIPH_BASE + 0x6C00) +#define PWR_BASE (APB1PERIPH_BASE + 0x7000) +#define DAC_BASE (APB1PERIPH_BASE + 0x7400) +#define CEC_BASE (APB1PERIPH_BASE + 0x7800) + +#define AFIO_BASE (APB2PERIPH_BASE + 0x0000) +#define EXTI_BASE (APB2PERIPH_BASE + 0x0400) +#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800) +#define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00) +#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000) +#define GPIOD_BASE (APB2PERIPH_BASE + 0x1400) +#define GPIOE_BASE (APB2PERIPH_BASE + 0x1800) +#define GPIOF_BASE (APB2PERIPH_BASE + 0x1C00) +#define GPIOG_BASE (APB2PERIPH_BASE + 0x2000) +#define ADC1_BASE (APB2PERIPH_BASE + 0x2400) +#define ADC2_BASE (APB2PERIPH_BASE + 0x2800) +#define TIM1_BASE (APB2PERIPH_BASE + 0x2C00) +#define SPI1_BASE (APB2PERIPH_BASE + 0x3000) +#define TIM8_BASE (APB2PERIPH_BASE + 0x3400) +#define USART1_BASE (APB2PERIPH_BASE + 0x3800) +#define ADC3_BASE (APB2PERIPH_BASE + 0x3C00) +#define TIM15_BASE (APB2PERIPH_BASE + 0x4000) +#define TIM16_BASE (APB2PERIPH_BASE + 0x4400) +#define TIM17_BASE (APB2PERIPH_BASE + 0x4800) +#define TIM9_BASE (APB2PERIPH_BASE + 0x4C00) +#define TIM10_BASE (APB2PERIPH_BASE + 0x5000) +#define TIM11_BASE (APB2PERIPH_BASE + 0x5400) + +#define SDIO_BASE (PERIPH_BASE + 0x18000) + +#define DMA1_BASE (AHBPERIPH_BASE + 0x0000) +#define DMA1_Channel1_BASE (AHBPERIPH_BASE + 0x0008) +#define DMA1_Channel2_BASE (AHBPERIPH_BASE + 0x001C) +#define DMA1_Channel3_BASE (AHBPERIPH_BASE + 0x0030) +#define DMA1_Channel4_BASE (AHBPERIPH_BASE + 0x0044) +#define DMA1_Channel5_BASE (AHBPERIPH_BASE + 0x0058) +#define DMA1_Channel6_BASE (AHBPERIPH_BASE + 0x006C) +#define DMA1_Channel7_BASE (AHBPERIPH_BASE + 0x0080) +#define DMA2_BASE (AHBPERIPH_BASE + 0x0400) +#define DMA2_Channel1_BASE (AHBPERIPH_BASE + 0x0408) +#define DMA2_Channel2_BASE (AHBPERIPH_BASE + 0x041C) +#define DMA2_Channel3_BASE (AHBPERIPH_BASE + 0x0430) +#define DMA2_Channel4_BASE (AHBPERIPH_BASE + 0x0444) +#define DMA2_Channel5_BASE (AHBPERIPH_BASE + 0x0458) +#define RCC_BASE (AHBPERIPH_BASE + 0x1000) +#define CRC_BASE (AHBPERIPH_BASE + 0x3000) + +#define FLASH_R_BASE (AHBPERIPH_BASE + 0x2000) /*!< Flash registers base address */ +#define OB_BASE ((uint32_t)0x1FFFF800) /*!< Flash Option Bytes base address */ + +#define ETH_BASE (AHBPERIPH_BASE + 0x8000) +#define ETH_MAC_BASE (ETH_BASE) +#define ETH_MMC_BASE (ETH_BASE + 0x0100) +#define ETH_PTP_BASE (ETH_BASE + 0x0700) +#define ETH_DMA_BASE (ETH_BASE + 0x1000) + +#define FSMC_Bank1_R_BASE (FSMC_R_BASE + 0x0000) /*!< FSMC Bank1 registers base address */ +#define FSMC_Bank1E_R_BASE (FSMC_R_BASE + 0x0104) /*!< FSMC Bank1E registers base address */ +#define FSMC_Bank2_R_BASE (FSMC_R_BASE + 0x0060) /*!< FSMC Bank2 registers base address */ +#define FSMC_Bank3_R_BASE (FSMC_R_BASE + 0x0080) /*!< FSMC Bank3 registers base address */ +#define FSMC_Bank4_R_BASE (FSMC_R_BASE + 0x00A0) /*!< FSMC Bank4 registers base address */ + +#define DBGMCU_BASE ((uint32_t)0xE0042000) /*!< Debug MCU registers base address */ + +/** + * @} + */ + +/** @addtogroup Peripheral_declaration + * @{ + */ + +#define TIM2 ((TIM_TypeDef *) TIM2_BASE) +#define TIM3 ((TIM_TypeDef *) TIM3_BASE) +#define TIM4 ((TIM_TypeDef *) TIM4_BASE) +#define TIM5 ((TIM_TypeDef *) TIM5_BASE) +#define TIM6 ((TIM_TypeDef *) TIM6_BASE) +#define TIM7 ((TIM_TypeDef *) TIM7_BASE) +#define TIM12 ((TIM_TypeDef *) TIM12_BASE) +#define TIM13 ((TIM_TypeDef *) TIM13_BASE) +#define TIM14 ((TIM_TypeDef *) TIM14_BASE) +#define RTC ((RTC_TypeDef *) RTC_BASE) +#define WWDG ((WWDG_TypeDef *) WWDG_BASE) +#define IWDG ((IWDG_TypeDef *) IWDG_BASE) +#define SPI2 ((SPI_TypeDef *) SPI2_BASE) +#define SPI3 ((SPI_TypeDef *) SPI3_BASE) +#define USART2 ((USART_TypeDef *) USART2_BASE) +#define USART3 ((USART_TypeDef *) USART3_BASE) +#define UART4 ((USART_TypeDef *) UART4_BASE) +#define UART5 ((USART_TypeDef *) UART5_BASE) +#define I2C1 ((I2C_TypeDef *) I2C1_BASE) +#define I2C2 ((I2C_TypeDef *) I2C2_BASE) +#define CAN1 ((CAN_TypeDef *) CAN1_BASE) +#define CAN2 ((CAN_TypeDef *) CAN2_BASE) +#define BKP ((BKP_TypeDef *) BKP_BASE) +#define PWR ((PWR_TypeDef *) PWR_BASE) +#define DAC ((DAC_TypeDef *) DAC_BASE) +#define CEC ((CEC_TypeDef *) CEC_BASE) +#define AFIO ((AFIO_TypeDef *) AFIO_BASE) +#define EXTI ((EXTI_TypeDef *) EXTI_BASE) +#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) +#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE) +#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE) +#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE) +#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE) +#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE) +#define GPIOG ((GPIO_TypeDef *) GPIOG_BASE) +#define ADC1 ((ADC_TypeDef *) ADC1_BASE) +#define ADC2 ((ADC_TypeDef *) ADC2_BASE) +#define TIM1 ((TIM_TypeDef *) TIM1_BASE) +#define SPI1 ((SPI_TypeDef *) SPI1_BASE) +#define TIM8 ((TIM_TypeDef *) TIM8_BASE) +#define USART1 ((USART_TypeDef *) USART1_BASE) +#define ADC3 ((ADC_TypeDef *) ADC3_BASE) +#define TIM15 ((TIM_TypeDef *) TIM15_BASE) +#define TIM16 ((TIM_TypeDef *) TIM16_BASE) +#define TIM17 ((TIM_TypeDef *) TIM17_BASE) +#define TIM9 ((TIM_TypeDef *) TIM9_BASE) +#define TIM10 ((TIM_TypeDef *) TIM10_BASE) +#define TIM11 ((TIM_TypeDef *) TIM11_BASE) +#define SDIO ((SDIO_TypeDef *) SDIO_BASE) +#define DMA1 ((DMA_TypeDef *) DMA1_BASE) +#define DMA2 ((DMA_TypeDef *) DMA2_BASE) +#define DMA1_Channel1 ((DMA_Channel_TypeDef *) DMA1_Channel1_BASE) +#define DMA1_Channel2 ((DMA_Channel_TypeDef *) DMA1_Channel2_BASE) +#define DMA1_Channel3 ((DMA_Channel_TypeDef *) DMA1_Channel3_BASE) +#define DMA1_Channel4 ((DMA_Channel_TypeDef *) DMA1_Channel4_BASE) +#define DMA1_Channel5 ((DMA_Channel_TypeDef *) DMA1_Channel5_BASE) +#define DMA1_Channel6 ((DMA_Channel_TypeDef *) DMA1_Channel6_BASE) +#define DMA1_Channel7 ((DMA_Channel_TypeDef *) DMA1_Channel7_BASE) +#define DMA2_Channel1 ((DMA_Channel_TypeDef *) DMA2_Channel1_BASE) +#define DMA2_Channel2 ((DMA_Channel_TypeDef *) DMA2_Channel2_BASE) +#define DMA2_Channel3 ((DMA_Channel_TypeDef *) DMA2_Channel3_BASE) +#define DMA2_Channel4 ((DMA_Channel_TypeDef *) DMA2_Channel4_BASE) +#define DMA2_Channel5 ((DMA_Channel_TypeDef *) DMA2_Channel5_BASE) +#define RCC ((RCC_TypeDef *) RCC_BASE) +#define CRC ((CRC_TypeDef *) CRC_BASE) +#define FLASH ((FLASH_TypeDef *) FLASH_R_BASE) +#define OB ((OB_TypeDef *) OB_BASE) +#define ETH ((ETH_TypeDef *) ETH_BASE) +#define FSMC_Bank1 ((FSMC_Bank1_TypeDef *) FSMC_Bank1_R_BASE) +#define FSMC_Bank1E ((FSMC_Bank1E_TypeDef *) FSMC_Bank1E_R_BASE) +#define FSMC_Bank2 ((FSMC_Bank2_TypeDef *) FSMC_Bank2_R_BASE) +#define FSMC_Bank3 ((FSMC_Bank3_TypeDef *) FSMC_Bank3_R_BASE) +#define FSMC_Bank4 ((FSMC_Bank4_TypeDef *) FSMC_Bank4_R_BASE) +#define DBGMCU ((DBGMCU_TypeDef *) DBGMCU_BASE) + +/** + * @} + */ + +/** @addtogroup Exported_constants + * @{ + */ + + /** @addtogroup Peripheral_Registers_Bits_Definition + * @{ + */ + +/******************************************************************************/ +/* Peripheral Registers_Bits_Definition */ +/******************************************************************************/ + +/******************************************************************************/ +/* */ +/* CRC calculation unit */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for CRC_DR register *********************/ +#define CRC_DR_DR ((uint32_t)0xFFFFFFFF) /*!< Data register bits */ + + +/******************* Bit definition for CRC_IDR register ********************/ +#define CRC_IDR_IDR ((uint8_t)0xFF) /*!< General-purpose 8-bit data register bits */ + + +/******************** Bit definition for CRC_CR register ********************/ +#define CRC_CR_RESET ((uint8_t)0x01) /*!< RESET bit */ + +/******************************************************************************/ +/* */ +/* Power Control */ +/* */ +/******************************************************************************/ + +/******************** Bit definition for PWR_CR register ********************/ +#define PWR_CR_LPDS ((uint16_t)0x0001) /*!< Low-Power Deepsleep */ +#define PWR_CR_PDDS ((uint16_t)0x0002) /*!< Power Down Deepsleep */ +#define PWR_CR_CWUF ((uint16_t)0x0004) /*!< Clear Wakeup Flag */ +#define PWR_CR_CSBF ((uint16_t)0x0008) /*!< Clear Standby Flag */ +#define PWR_CR_PVDE ((uint16_t)0x0010) /*!< Power Voltage Detector Enable */ + +#define PWR_CR_PLS ((uint16_t)0x00E0) /*!< PLS[2:0] bits (PVD Level Selection) */ +#define PWR_CR_PLS_0 ((uint16_t)0x0020) /*!< Bit 0 */ +#define PWR_CR_PLS_1 ((uint16_t)0x0040) /*!< Bit 1 */ +#define PWR_CR_PLS_2 ((uint16_t)0x0080) /*!< Bit 2 */ + +/*!< PVD level configuration */ +#define PWR_CR_PLS_2V2 ((uint16_t)0x0000) /*!< PVD level 2.2V */ +#define PWR_CR_PLS_2V3 ((uint16_t)0x0020) /*!< PVD level 2.3V */ +#define PWR_CR_PLS_2V4 ((uint16_t)0x0040) /*!< PVD level 2.4V */ +#define PWR_CR_PLS_2V5 ((uint16_t)0x0060) /*!< PVD level 2.5V */ +#define PWR_CR_PLS_2V6 ((uint16_t)0x0080) /*!< PVD level 2.6V */ +#define PWR_CR_PLS_2V7 ((uint16_t)0x00A0) /*!< PVD level 2.7V */ +#define PWR_CR_PLS_2V8 ((uint16_t)0x00C0) /*!< PVD level 2.8V */ +#define PWR_CR_PLS_2V9 ((uint16_t)0x00E0) /*!< PVD level 2.9V */ + +#define PWR_CR_DBP ((uint16_t)0x0100) /*!< Disable Backup Domain write protection */ + + +/******************* Bit definition for PWR_CSR register ********************/ +#define PWR_CSR_WUF ((uint16_t)0x0001) /*!< Wakeup Flag */ +#define PWR_CSR_SBF ((uint16_t)0x0002) /*!< Standby Flag */ +#define PWR_CSR_PVDO ((uint16_t)0x0004) /*!< PVD Output */ +#define PWR_CSR_EWUP ((uint16_t)0x0100) /*!< Enable WKUP pin */ + +/******************************************************************************/ +/* */ +/* Backup registers */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for BKP_DR1 register ********************/ +#define BKP_DR1_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR2 register ********************/ +#define BKP_DR2_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR3 register ********************/ +#define BKP_DR3_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR4 register ********************/ +#define BKP_DR4_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR5 register ********************/ +#define BKP_DR5_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR6 register ********************/ +#define BKP_DR6_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR7 register ********************/ +#define BKP_DR7_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR8 register ********************/ +#define BKP_DR8_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR9 register ********************/ +#define BKP_DR9_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR10 register *******************/ +#define BKP_DR10_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR11 register *******************/ +#define BKP_DR11_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR12 register *******************/ +#define BKP_DR12_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR13 register *******************/ +#define BKP_DR13_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR14 register *******************/ +#define BKP_DR14_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR15 register *******************/ +#define BKP_DR15_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR16 register *******************/ +#define BKP_DR16_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR17 register *******************/ +#define BKP_DR17_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/****************** Bit definition for BKP_DR18 register ********************/ +#define BKP_DR18_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR19 register *******************/ +#define BKP_DR19_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR20 register *******************/ +#define BKP_DR20_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR21 register *******************/ +#define BKP_DR21_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR22 register *******************/ +#define BKP_DR22_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR23 register *******************/ +#define BKP_DR23_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR24 register *******************/ +#define BKP_DR24_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR25 register *******************/ +#define BKP_DR25_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR26 register *******************/ +#define BKP_DR26_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR27 register *******************/ +#define BKP_DR27_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR28 register *******************/ +#define BKP_DR28_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR29 register *******************/ +#define BKP_DR29_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR30 register *******************/ +#define BKP_DR30_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR31 register *******************/ +#define BKP_DR31_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR32 register *******************/ +#define BKP_DR32_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR33 register *******************/ +#define BKP_DR33_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR34 register *******************/ +#define BKP_DR34_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR35 register *******************/ +#define BKP_DR35_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR36 register *******************/ +#define BKP_DR36_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR37 register *******************/ +#define BKP_DR37_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR38 register *******************/ +#define BKP_DR38_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR39 register *******************/ +#define BKP_DR39_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR40 register *******************/ +#define BKP_DR40_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR41 register *******************/ +#define BKP_DR41_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR42 register *******************/ +#define BKP_DR42_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/****************** Bit definition for BKP_RTCCR register *******************/ +#define BKP_RTCCR_CAL ((uint16_t)0x007F) /*!< Calibration value */ +#define BKP_RTCCR_CCO ((uint16_t)0x0080) /*!< Calibration Clock Output */ +#define BKP_RTCCR_ASOE ((uint16_t)0x0100) /*!< Alarm or Second Output Enable */ +#define BKP_RTCCR_ASOS ((uint16_t)0x0200) /*!< Alarm or Second Output Selection */ + +/******************** Bit definition for BKP_CR register ********************/ +#define BKP_CR_TPE ((uint8_t)0x01) /*!< TAMPER pin enable */ +#define BKP_CR_TPAL ((uint8_t)0x02) /*!< TAMPER pin active level */ + +/******************* Bit definition for BKP_CSR register ********************/ +#define BKP_CSR_CTE ((uint16_t)0x0001) /*!< Clear Tamper event */ +#define BKP_CSR_CTI ((uint16_t)0x0002) /*!< Clear Tamper Interrupt */ +#define BKP_CSR_TPIE ((uint16_t)0x0004) /*!< TAMPER Pin interrupt enable */ +#define BKP_CSR_TEF ((uint16_t)0x0100) /*!< Tamper Event Flag */ +#define BKP_CSR_TIF ((uint16_t)0x0200) /*!< Tamper Interrupt Flag */ + +/******************************************************************************/ +/* */ +/* Reset and Clock Control */ +/* */ +/******************************************************************************/ + +/******************** Bit definition for RCC_CR register ********************/ +#define RCC_CR_HSION ((uint32_t)0x00000001) /*!< Internal High Speed clock enable */ +#define RCC_CR_HSIRDY ((uint32_t)0x00000002) /*!< Internal High Speed clock ready flag */ +#define RCC_CR_HSITRIM ((uint32_t)0x000000F8) /*!< Internal High Speed clock trimming */ +#define RCC_CR_HSICAL ((uint32_t)0x0000FF00) /*!< Internal High Speed clock Calibration */ +#define RCC_CR_HSEON ((uint32_t)0x00010000) /*!< External High Speed clock enable */ +#define RCC_CR_HSERDY ((uint32_t)0x00020000) /*!< External High Speed clock ready flag */ +#define RCC_CR_HSEBYP ((uint32_t)0x00040000) /*!< External High Speed clock Bypass */ +#define RCC_CR_CSSON ((uint32_t)0x00080000) /*!< Clock Security System enable */ +#define RCC_CR_PLLON ((uint32_t)0x01000000) /*!< PLL enable */ +#define RCC_CR_PLLRDY ((uint32_t)0x02000000) /*!< PLL clock ready flag */ + +#ifdef STM32F10X_CL + #define RCC_CR_PLL2ON ((uint32_t)0x04000000) /*!< PLL2 enable */ + #define RCC_CR_PLL2RDY ((uint32_t)0x08000000) /*!< PLL2 clock ready flag */ + #define RCC_CR_PLL3ON ((uint32_t)0x10000000) /*!< PLL3 enable */ + #define RCC_CR_PLL3RDY ((uint32_t)0x20000000) /*!< PLL3 clock ready flag */ +#endif /* STM32F10X_CL */ + +/******************* Bit definition for RCC_CFGR register *******************/ +/*!< SW configuration */ +#define RCC_CFGR_SW ((uint32_t)0x00000003) /*!< SW[1:0] bits (System clock Switch) */ +#define RCC_CFGR_SW_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define RCC_CFGR_SW_1 ((uint32_t)0x00000002) /*!< Bit 1 */ + +#define RCC_CFGR_SW_HSI ((uint32_t)0x00000000) /*!< HSI selected as system clock */ +#define RCC_CFGR_SW_HSE ((uint32_t)0x00000001) /*!< HSE selected as system clock */ +#define RCC_CFGR_SW_PLL ((uint32_t)0x00000002) /*!< PLL selected as system clock */ + +/*!< SWS configuration */ +#define RCC_CFGR_SWS ((uint32_t)0x0000000C) /*!< SWS[1:0] bits (System Clock Switch Status) */ +#define RCC_CFGR_SWS_0 ((uint32_t)0x00000004) /*!< Bit 0 */ +#define RCC_CFGR_SWS_1 ((uint32_t)0x00000008) /*!< Bit 1 */ + +#define RCC_CFGR_SWS_HSI ((uint32_t)0x00000000) /*!< HSI oscillator used as system clock */ +#define RCC_CFGR_SWS_HSE ((uint32_t)0x00000004) /*!< HSE oscillator used as system clock */ +#define RCC_CFGR_SWS_PLL ((uint32_t)0x00000008) /*!< PLL used as system clock */ + +/*!< HPRE configuration */ +#define RCC_CFGR_HPRE ((uint32_t)0x000000F0) /*!< HPRE[3:0] bits (AHB prescaler) */ +#define RCC_CFGR_HPRE_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define RCC_CFGR_HPRE_1 ((uint32_t)0x00000020) /*!< Bit 1 */ +#define RCC_CFGR_HPRE_2 ((uint32_t)0x00000040) /*!< Bit 2 */ +#define RCC_CFGR_HPRE_3 ((uint32_t)0x00000080) /*!< Bit 3 */ + +#define RCC_CFGR_HPRE_DIV1 ((uint32_t)0x00000000) /*!< SYSCLK not divided */ +#define RCC_CFGR_HPRE_DIV2 ((uint32_t)0x00000080) /*!< SYSCLK divided by 2 */ +#define RCC_CFGR_HPRE_DIV4 ((uint32_t)0x00000090) /*!< SYSCLK divided by 4 */ +#define RCC_CFGR_HPRE_DIV8 ((uint32_t)0x000000A0) /*!< SYSCLK divided by 8 */ +#define RCC_CFGR_HPRE_DIV16 ((uint32_t)0x000000B0) /*!< SYSCLK divided by 16 */ +#define RCC_CFGR_HPRE_DIV64 ((uint32_t)0x000000C0) /*!< SYSCLK divided by 64 */ +#define RCC_CFGR_HPRE_DIV128 ((uint32_t)0x000000D0) /*!< SYSCLK divided by 128 */ +#define RCC_CFGR_HPRE_DIV256 ((uint32_t)0x000000E0) /*!< SYSCLK divided by 256 */ +#define RCC_CFGR_HPRE_DIV512 ((uint32_t)0x000000F0) /*!< SYSCLK divided by 512 */ + +/*!< PPRE1 configuration */ +#define RCC_CFGR_PPRE1 ((uint32_t)0x00000700) /*!< PRE1[2:0] bits (APB1 prescaler) */ +#define RCC_CFGR_PPRE1_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define RCC_CFGR_PPRE1_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define RCC_CFGR_PPRE1_2 ((uint32_t)0x00000400) /*!< Bit 2 */ + +#define RCC_CFGR_PPRE1_DIV1 ((uint32_t)0x00000000) /*!< HCLK not divided */ +#define RCC_CFGR_PPRE1_DIV2 ((uint32_t)0x00000400) /*!< HCLK divided by 2 */ +#define RCC_CFGR_PPRE1_DIV4 ((uint32_t)0x00000500) /*!< HCLK divided by 4 */ +#define RCC_CFGR_PPRE1_DIV8 ((uint32_t)0x00000600) /*!< HCLK divided by 8 */ +#define RCC_CFGR_PPRE1_DIV16 ((uint32_t)0x00000700) /*!< HCLK divided by 16 */ + +/*!< PPRE2 configuration */ +#define RCC_CFGR_PPRE2 ((uint32_t)0x00003800) /*!< PRE2[2:0] bits (APB2 prescaler) */ +#define RCC_CFGR_PPRE2_0 ((uint32_t)0x00000800) /*!< Bit 0 */ +#define RCC_CFGR_PPRE2_1 ((uint32_t)0x00001000) /*!< Bit 1 */ +#define RCC_CFGR_PPRE2_2 ((uint32_t)0x00002000) /*!< Bit 2 */ + +#define RCC_CFGR_PPRE2_DIV1 ((uint32_t)0x00000000) /*!< HCLK not divided */ +#define RCC_CFGR_PPRE2_DIV2 ((uint32_t)0x00002000) /*!< HCLK divided by 2 */ +#define RCC_CFGR_PPRE2_DIV4 ((uint32_t)0x00002800) /*!< HCLK divided by 4 */ +#define RCC_CFGR_PPRE2_DIV8 ((uint32_t)0x00003000) /*!< HCLK divided by 8 */ +#define RCC_CFGR_PPRE2_DIV16 ((uint32_t)0x00003800) /*!< HCLK divided by 16 */ + +/*!< ADCPPRE configuration */ +#define RCC_CFGR_ADCPRE ((uint32_t)0x0000C000) /*!< ADCPRE[1:0] bits (ADC prescaler) */ +#define RCC_CFGR_ADCPRE_0 ((uint32_t)0x00004000) /*!< Bit 0 */ +#define RCC_CFGR_ADCPRE_1 ((uint32_t)0x00008000) /*!< Bit 1 */ + +#define RCC_CFGR_ADCPRE_DIV2 ((uint32_t)0x00000000) /*!< PCLK2 divided by 2 */ +#define RCC_CFGR_ADCPRE_DIV4 ((uint32_t)0x00004000) /*!< PCLK2 divided by 4 */ +#define RCC_CFGR_ADCPRE_DIV6 ((uint32_t)0x00008000) /*!< PCLK2 divided by 6 */ +#define RCC_CFGR_ADCPRE_DIV8 ((uint32_t)0x0000C000) /*!< PCLK2 divided by 8 */ + +#define RCC_CFGR_PLLSRC ((uint32_t)0x00010000) /*!< PLL entry clock source */ + +#define RCC_CFGR_PLLXTPRE ((uint32_t)0x00020000) /*!< HSE divider for PLL entry */ + +/*!< PLLMUL configuration */ +#define RCC_CFGR_PLLMULL ((uint32_t)0x003C0000) /*!< PLLMUL[3:0] bits (PLL multiplication factor) */ +#define RCC_CFGR_PLLMULL_0 ((uint32_t)0x00040000) /*!< Bit 0 */ +#define RCC_CFGR_PLLMULL_1 ((uint32_t)0x00080000) /*!< Bit 1 */ +#define RCC_CFGR_PLLMULL_2 ((uint32_t)0x00100000) /*!< Bit 2 */ +#define RCC_CFGR_PLLMULL_3 ((uint32_t)0x00200000) /*!< Bit 3 */ + +#ifdef STM32F10X_CL + #define RCC_CFGR_PLLSRC_HSI_Div2 ((uint32_t)0x00000000) /*!< HSI clock divided by 2 selected as PLL entry clock source */ + #define RCC_CFGR_PLLSRC_PREDIV1 ((uint32_t)0x00010000) /*!< PREDIV1 clock selected as PLL entry clock source */ + + #define RCC_CFGR_PLLXTPRE_PREDIV1 ((uint32_t)0x00000000) /*!< PREDIV1 clock not divided for PLL entry */ + #define RCC_CFGR_PLLXTPRE_PREDIV1_Div2 ((uint32_t)0x00020000) /*!< PREDIV1 clock divided by 2 for PLL entry */ + + #define RCC_CFGR_PLLMULL4 ((uint32_t)0x00080000) /*!< PLL input clock * 4 */ + #define RCC_CFGR_PLLMULL5 ((uint32_t)0x000C0000) /*!< PLL input clock * 5 */ + #define RCC_CFGR_PLLMULL6 ((uint32_t)0x00100000) /*!< PLL input clock * 6 */ + #define RCC_CFGR_PLLMULL7 ((uint32_t)0x00140000) /*!< PLL input clock * 7 */ + #define RCC_CFGR_PLLMULL8 ((uint32_t)0x00180000) /*!< PLL input clock * 8 */ + #define RCC_CFGR_PLLMULL9 ((uint32_t)0x001C0000) /*!< PLL input clock * 9 */ + #define RCC_CFGR_PLLMULL6_5 ((uint32_t)0x00340000) /*!< PLL input clock * 6.5 */ + + #define RCC_CFGR_OTGFSPRE ((uint32_t)0x00400000) /*!< USB OTG FS prescaler */ + +/*!< MCO configuration */ + #define RCC_CFGR_MCO ((uint32_t)0x0F000000) /*!< MCO[3:0] bits (Microcontroller Clock Output) */ + #define RCC_CFGR_MCO_0 ((uint32_t)0x01000000) /*!< Bit 0 */ + #define RCC_CFGR_MCO_1 ((uint32_t)0x02000000) /*!< Bit 1 */ + #define RCC_CFGR_MCO_2 ((uint32_t)0x04000000) /*!< Bit 2 */ + #define RCC_CFGR_MCO_3 ((uint32_t)0x08000000) /*!< Bit 3 */ + + #define RCC_CFGR_MCO_NOCLOCK ((uint32_t)0x00000000) /*!< No clock */ + #define RCC_CFGR_MCO_SYSCLK ((uint32_t)0x04000000) /*!< System clock selected as MCO source */ + #define RCC_CFGR_MCO_HSI ((uint32_t)0x05000000) /*!< HSI clock selected as MCO source */ + #define RCC_CFGR_MCO_HSE ((uint32_t)0x06000000) /*!< HSE clock selected as MCO source */ + #define RCC_CFGR_MCO_PLLCLK_Div2 ((uint32_t)0x07000000) /*!< PLL clock divided by 2 selected as MCO source */ + #define RCC_CFGR_MCO_PLL2CLK ((uint32_t)0x08000000) /*!< PLL2 clock selected as MCO source*/ + #define RCC_CFGR_MCO_PLL3CLK_Div2 ((uint32_t)0x09000000) /*!< PLL3 clock divided by 2 selected as MCO source*/ + #define RCC_CFGR_MCO_Ext_HSE ((uint32_t)0x0A000000) /*!< XT1 external 3-25 MHz oscillator clock selected as MCO source */ + #define RCC_CFGR_MCO_PLL3CLK ((uint32_t)0x0B000000) /*!< PLL3 clock selected as MCO source */ +#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) + #define RCC_CFGR_PLLSRC_HSI_Div2 ((uint32_t)0x00000000) /*!< HSI clock divided by 2 selected as PLL entry clock source */ + #define RCC_CFGR_PLLSRC_PREDIV1 ((uint32_t)0x00010000) /*!< PREDIV1 clock selected as PLL entry clock source */ + + #define RCC_CFGR_PLLXTPRE_PREDIV1 ((uint32_t)0x00000000) /*!< PREDIV1 clock not divided for PLL entry */ + #define RCC_CFGR_PLLXTPRE_PREDIV1_Div2 ((uint32_t)0x00020000) /*!< PREDIV1 clock divided by 2 for PLL entry */ + + #define RCC_CFGR_PLLMULL2 ((uint32_t)0x00000000) /*!< PLL input clock*2 */ + #define RCC_CFGR_PLLMULL3 ((uint32_t)0x00040000) /*!< PLL input clock*3 */ + #define RCC_CFGR_PLLMULL4 ((uint32_t)0x00080000) /*!< PLL input clock*4 */ + #define RCC_CFGR_PLLMULL5 ((uint32_t)0x000C0000) /*!< PLL input clock*5 */ + #define RCC_CFGR_PLLMULL6 ((uint32_t)0x00100000) /*!< PLL input clock*6 */ + #define RCC_CFGR_PLLMULL7 ((uint32_t)0x00140000) /*!< PLL input clock*7 */ + #define RCC_CFGR_PLLMULL8 ((uint32_t)0x00180000) /*!< PLL input clock*8 */ + #define RCC_CFGR_PLLMULL9 ((uint32_t)0x001C0000) /*!< PLL input clock*9 */ + #define RCC_CFGR_PLLMULL10 ((uint32_t)0x00200000) /*!< PLL input clock10 */ + #define RCC_CFGR_PLLMULL11 ((uint32_t)0x00240000) /*!< PLL input clock*11 */ + #define RCC_CFGR_PLLMULL12 ((uint32_t)0x00280000) /*!< PLL input clock*12 */ + #define RCC_CFGR_PLLMULL13 ((uint32_t)0x002C0000) /*!< PLL input clock*13 */ + #define RCC_CFGR_PLLMULL14 ((uint32_t)0x00300000) /*!< PLL input clock*14 */ + #define RCC_CFGR_PLLMULL15 ((uint32_t)0x00340000) /*!< PLL input clock*15 */ + #define RCC_CFGR_PLLMULL16 ((uint32_t)0x00380000) /*!< PLL input clock*16 */ + +/*!< MCO configuration */ + #define RCC_CFGR_MCO ((uint32_t)0x07000000) /*!< MCO[2:0] bits (Microcontroller Clock Output) */ + #define RCC_CFGR_MCO_0 ((uint32_t)0x01000000) /*!< Bit 0 */ + #define RCC_CFGR_MCO_1 ((uint32_t)0x02000000) /*!< Bit 1 */ + #define RCC_CFGR_MCO_2 ((uint32_t)0x04000000) /*!< Bit 2 */ + + #define RCC_CFGR_MCO_NOCLOCK ((uint32_t)0x00000000) /*!< No clock */ + #define RCC_CFGR_MCO_SYSCLK ((uint32_t)0x04000000) /*!< System clock selected as MCO source */ + #define RCC_CFGR_MCO_HSI ((uint32_t)0x05000000) /*!< HSI clock selected as MCO source */ + #define RCC_CFGR_MCO_HSE ((uint32_t)0x06000000) /*!< HSE clock selected as MCO source */ + #define RCC_CFGR_MCO_PLL ((uint32_t)0x07000000) /*!< PLL clock divided by 2 selected as MCO source */ +#else + #define RCC_CFGR_PLLSRC_HSI_Div2 ((uint32_t)0x00000000) /*!< HSI clock divided by 2 selected as PLL entry clock source */ + #define RCC_CFGR_PLLSRC_HSE ((uint32_t)0x00010000) /*!< HSE clock selected as PLL entry clock source */ + + #define RCC_CFGR_PLLXTPRE_HSE ((uint32_t)0x00000000) /*!< HSE clock not divided for PLL entry */ + #define RCC_CFGR_PLLXTPRE_HSE_Div2 ((uint32_t)0x00020000) /*!< HSE clock divided by 2 for PLL entry */ + + #define RCC_CFGR_PLLMULL2 ((uint32_t)0x00000000) /*!< PLL input clock*2 */ + #define RCC_CFGR_PLLMULL3 ((uint32_t)0x00040000) /*!< PLL input clock*3 */ + #define RCC_CFGR_PLLMULL4 ((uint32_t)0x00080000) /*!< PLL input clock*4 */ + #define RCC_CFGR_PLLMULL5 ((uint32_t)0x000C0000) /*!< PLL input clock*5 */ + #define RCC_CFGR_PLLMULL6 ((uint32_t)0x00100000) /*!< PLL input clock*6 */ + #define RCC_CFGR_PLLMULL7 ((uint32_t)0x00140000) /*!< PLL input clock*7 */ + #define RCC_CFGR_PLLMULL8 ((uint32_t)0x00180000) /*!< PLL input clock*8 */ + #define RCC_CFGR_PLLMULL9 ((uint32_t)0x001C0000) /*!< PLL input clock*9 */ + #define RCC_CFGR_PLLMULL10 ((uint32_t)0x00200000) /*!< PLL input clock10 */ + #define RCC_CFGR_PLLMULL11 ((uint32_t)0x00240000) /*!< PLL input clock*11 */ + #define RCC_CFGR_PLLMULL12 ((uint32_t)0x00280000) /*!< PLL input clock*12 */ + #define RCC_CFGR_PLLMULL13 ((uint32_t)0x002C0000) /*!< PLL input clock*13 */ + #define RCC_CFGR_PLLMULL14 ((uint32_t)0x00300000) /*!< PLL input clock*14 */ + #define RCC_CFGR_PLLMULL15 ((uint32_t)0x00340000) /*!< PLL input clock*15 */ + #define RCC_CFGR_PLLMULL16 ((uint32_t)0x00380000) /*!< PLL input clock*16 */ + #define RCC_CFGR_USBPRE ((uint32_t)0x00400000) /*!< USB Device prescaler */ + +/*!< MCO configuration */ + #define RCC_CFGR_MCO ((uint32_t)0x07000000) /*!< MCO[2:0] bits (Microcontroller Clock Output) */ + #define RCC_CFGR_MCO_0 ((uint32_t)0x01000000) /*!< Bit 0 */ + #define RCC_CFGR_MCO_1 ((uint32_t)0x02000000) /*!< Bit 1 */ + #define RCC_CFGR_MCO_2 ((uint32_t)0x04000000) /*!< Bit 2 */ + + #define RCC_CFGR_MCO_NOCLOCK ((uint32_t)0x00000000) /*!< No clock */ + #define RCC_CFGR_MCO_SYSCLK ((uint32_t)0x04000000) /*!< System clock selected as MCO source */ + #define RCC_CFGR_MCO_HSI ((uint32_t)0x05000000) /*!< HSI clock selected as MCO source */ + #define RCC_CFGR_MCO_HSE ((uint32_t)0x06000000) /*!< HSE clock selected as MCO source */ + #define RCC_CFGR_MCO_PLL ((uint32_t)0x07000000) /*!< PLL clock divided by 2 selected as MCO source */ +#endif /* STM32F10X_CL */ + +/*!<****************** Bit definition for RCC_CIR register ********************/ +#define RCC_CIR_LSIRDYF ((uint32_t)0x00000001) /*!< LSI Ready Interrupt flag */ +#define RCC_CIR_LSERDYF ((uint32_t)0x00000002) /*!< LSE Ready Interrupt flag */ +#define RCC_CIR_HSIRDYF ((uint32_t)0x00000004) /*!< HSI Ready Interrupt flag */ +#define RCC_CIR_HSERDYF ((uint32_t)0x00000008) /*!< HSE Ready Interrupt flag */ +#define RCC_CIR_PLLRDYF ((uint32_t)0x00000010) /*!< PLL Ready Interrupt flag */ +#define RCC_CIR_CSSF ((uint32_t)0x00000080) /*!< Clock Security System Interrupt flag */ +#define RCC_CIR_LSIRDYIE ((uint32_t)0x00000100) /*!< LSI Ready Interrupt Enable */ +#define RCC_CIR_LSERDYIE ((uint32_t)0x00000200) /*!< LSE Ready Interrupt Enable */ +#define RCC_CIR_HSIRDYIE ((uint32_t)0x00000400) /*!< HSI Ready Interrupt Enable */ +#define RCC_CIR_HSERDYIE ((uint32_t)0x00000800) /*!< HSE Ready Interrupt Enable */ +#define RCC_CIR_PLLRDYIE ((uint32_t)0x00001000) /*!< PLL Ready Interrupt Enable */ +#define RCC_CIR_LSIRDYC ((uint32_t)0x00010000) /*!< LSI Ready Interrupt Clear */ +#define RCC_CIR_LSERDYC ((uint32_t)0x00020000) /*!< LSE Ready Interrupt Clear */ +#define RCC_CIR_HSIRDYC ((uint32_t)0x00040000) /*!< HSI Ready Interrupt Clear */ +#define RCC_CIR_HSERDYC ((uint32_t)0x00080000) /*!< HSE Ready Interrupt Clear */ +#define RCC_CIR_PLLRDYC ((uint32_t)0x00100000) /*!< PLL Ready Interrupt Clear */ +#define RCC_CIR_CSSC ((uint32_t)0x00800000) /*!< Clock Security System Interrupt Clear */ + +#ifdef STM32F10X_CL + #define RCC_CIR_PLL2RDYF ((uint32_t)0x00000020) /*!< PLL2 Ready Interrupt flag */ + #define RCC_CIR_PLL3RDYF ((uint32_t)0x00000040) /*!< PLL3 Ready Interrupt flag */ + #define RCC_CIR_PLL2RDYIE ((uint32_t)0x00002000) /*!< PLL2 Ready Interrupt Enable */ + #define RCC_CIR_PLL3RDYIE ((uint32_t)0x00004000) /*!< PLL3 Ready Interrupt Enable */ + #define RCC_CIR_PLL2RDYC ((uint32_t)0x00200000) /*!< PLL2 Ready Interrupt Clear */ + #define RCC_CIR_PLL3RDYC ((uint32_t)0x00400000) /*!< PLL3 Ready Interrupt Clear */ +#endif /* STM32F10X_CL */ + +/***************** Bit definition for RCC_APB2RSTR register *****************/ +#define RCC_APB2RSTR_AFIORST ((uint32_t)0x00000001) /*!< Alternate Function I/O reset */ +#define RCC_APB2RSTR_IOPARST ((uint32_t)0x00000004) /*!< I/O port A reset */ +#define RCC_APB2RSTR_IOPBRST ((uint32_t)0x00000008) /*!< I/O port B reset */ +#define RCC_APB2RSTR_IOPCRST ((uint32_t)0x00000010) /*!< I/O port C reset */ +#define RCC_APB2RSTR_IOPDRST ((uint32_t)0x00000020) /*!< I/O port D reset */ +#define RCC_APB2RSTR_ADC1RST ((uint32_t)0x00000200) /*!< ADC 1 interface reset */ + +#if !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD_VL) +#define RCC_APB2RSTR_ADC2RST ((uint32_t)0x00000400) /*!< ADC 2 interface reset */ +#endif + +#define RCC_APB2RSTR_TIM1RST ((uint32_t)0x00000800) /*!< TIM1 Timer reset */ +#define RCC_APB2RSTR_SPI1RST ((uint32_t)0x00001000) /*!< SPI 1 reset */ +#define RCC_APB2RSTR_USART1RST ((uint32_t)0x00004000) /*!< USART1 reset */ + +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) +#define RCC_APB2RSTR_TIM15RST ((uint32_t)0x00010000) /*!< TIM15 Timer reset */ +#define RCC_APB2RSTR_TIM16RST ((uint32_t)0x00020000) /*!< TIM16 Timer reset */ +#define RCC_APB2RSTR_TIM17RST ((uint32_t)0x00040000) /*!< TIM17 Timer reset */ +#endif + +#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) + #define RCC_APB2RSTR_IOPERST ((uint32_t)0x00000040) /*!< I/O port E reset */ +#endif /* STM32F10X_LD && STM32F10X_LD_VL */ + +#if defined (STM32F10X_HD) || defined (STM32F10X_XL) + #define RCC_APB2RSTR_IOPFRST ((uint32_t)0x00000080) /*!< I/O port F reset */ + #define RCC_APB2RSTR_IOPGRST ((uint32_t)0x00000100) /*!< I/O port G reset */ + #define RCC_APB2RSTR_TIM8RST ((uint32_t)0x00002000) /*!< TIM8 Timer reset */ + #define RCC_APB2RSTR_ADC3RST ((uint32_t)0x00008000) /*!< ADC3 interface reset */ +#endif + +#if defined (STM32F10X_HD_VL) + #define RCC_APB2RSTR_IOPFRST ((uint32_t)0x00000080) /*!< I/O port F reset */ + #define RCC_APB2RSTR_IOPGRST ((uint32_t)0x00000100) /*!< I/O port G reset */ +#endif + +#ifdef STM32F10X_XL + #define RCC_APB2RSTR_TIM9RST ((uint32_t)0x00080000) /*!< TIM9 Timer reset */ + #define RCC_APB2RSTR_TIM10RST ((uint32_t)0x00100000) /*!< TIM10 Timer reset */ + #define RCC_APB2RSTR_TIM11RST ((uint32_t)0x00200000) /*!< TIM11 Timer reset */ +#endif /* STM32F10X_XL */ + +/***************** Bit definition for RCC_APB1RSTR register *****************/ +#define RCC_APB1RSTR_TIM2RST ((uint32_t)0x00000001) /*!< Timer 2 reset */ +#define RCC_APB1RSTR_TIM3RST ((uint32_t)0x00000002) /*!< Timer 3 reset */ +#define RCC_APB1RSTR_WWDGRST ((uint32_t)0x00000800) /*!< Window Watchdog reset */ +#define RCC_APB1RSTR_USART2RST ((uint32_t)0x00020000) /*!< USART 2 reset */ +#define RCC_APB1RSTR_I2C1RST ((uint32_t)0x00200000) /*!< I2C 1 reset */ + +#if !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD_VL) +#define RCC_APB1RSTR_CAN1RST ((uint32_t)0x02000000) /*!< CAN1 reset */ +#endif + +#define RCC_APB1RSTR_BKPRST ((uint32_t)0x08000000) /*!< Backup interface reset */ +#define RCC_APB1RSTR_PWRRST ((uint32_t)0x10000000) /*!< Power interface reset */ + +#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) + #define RCC_APB1RSTR_TIM4RST ((uint32_t)0x00000004) /*!< Timer 4 reset */ + #define RCC_APB1RSTR_SPI2RST ((uint32_t)0x00004000) /*!< SPI 2 reset */ + #define RCC_APB1RSTR_USART3RST ((uint32_t)0x00040000) /*!< USART 3 reset */ + #define RCC_APB1RSTR_I2C2RST ((uint32_t)0x00400000) /*!< I2C 2 reset */ +#endif /* STM32F10X_LD && STM32F10X_LD_VL */ + +#if defined (STM32F10X_HD) || defined (STM32F10X_MD) || defined (STM32F10X_LD) || defined (STM32F10X_XL) + #define RCC_APB1RSTR_USBRST ((uint32_t)0x00800000) /*!< USB Device reset */ +#endif + +#if defined (STM32F10X_HD) || defined (STM32F10X_CL) || defined (STM32F10X_XL) + #define RCC_APB1RSTR_TIM5RST ((uint32_t)0x00000008) /*!< Timer 5 reset */ + #define RCC_APB1RSTR_TIM6RST ((uint32_t)0x00000010) /*!< Timer 6 reset */ + #define RCC_APB1RSTR_TIM7RST ((uint32_t)0x00000020) /*!< Timer 7 reset */ + #define RCC_APB1RSTR_SPI3RST ((uint32_t)0x00008000) /*!< SPI 3 reset */ + #define RCC_APB1RSTR_UART4RST ((uint32_t)0x00080000) /*!< UART 4 reset */ + #define RCC_APB1RSTR_UART5RST ((uint32_t)0x00100000) /*!< UART 5 reset */ + #define RCC_APB1RSTR_DACRST ((uint32_t)0x20000000) /*!< DAC interface reset */ +#endif + +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) + #define RCC_APB1RSTR_TIM6RST ((uint32_t)0x00000010) /*!< Timer 6 reset */ + #define RCC_APB1RSTR_TIM7RST ((uint32_t)0x00000020) /*!< Timer 7 reset */ + #define RCC_APB1RSTR_DACRST ((uint32_t)0x20000000) /*!< DAC interface reset */ + #define RCC_APB1RSTR_CECRST ((uint32_t)0x40000000) /*!< CEC interface reset */ +#endif + +#if defined (STM32F10X_HD_VL) + #define RCC_APB1RSTR_TIM5RST ((uint32_t)0x00000008) /*!< Timer 5 reset */ + #define RCC_APB1RSTR_TIM12RST ((uint32_t)0x00000040) /*!< TIM12 Timer reset */ + #define RCC_APB1RSTR_TIM13RST ((uint32_t)0x00000080) /*!< TIM13 Timer reset */ + #define RCC_APB1RSTR_TIM14RST ((uint32_t)0x00000100) /*!< TIM14 Timer reset */ + #define RCC_APB1RSTR_SPI3RST ((uint32_t)0x00008000) /*!< SPI 3 reset */ + #define RCC_APB1RSTR_UART4RST ((uint32_t)0x00080000) /*!< UART 4 reset */ + #define RCC_APB1RSTR_UART5RST ((uint32_t)0x00100000) /*!< UART 5 reset */ +#endif + +#ifdef STM32F10X_CL + #define RCC_APB1RSTR_CAN2RST ((uint32_t)0x04000000) /*!< CAN2 reset */ +#endif /* STM32F10X_CL */ + +#ifdef STM32F10X_XL + #define RCC_APB1RSTR_TIM12RST ((uint32_t)0x00000040) /*!< TIM12 Timer reset */ + #define RCC_APB1RSTR_TIM13RST ((uint32_t)0x00000080) /*!< TIM13 Timer reset */ + #define RCC_APB1RSTR_TIM14RST ((uint32_t)0x00000100) /*!< TIM14 Timer reset */ +#endif /* STM32F10X_XL */ + +/****************** Bit definition for RCC_AHBENR register ******************/ +#define RCC_AHBENR_DMA1EN ((uint16_t)0x0001) /*!< DMA1 clock enable */ +#define RCC_AHBENR_SRAMEN ((uint16_t)0x0004) /*!< SRAM interface clock enable */ +#define RCC_AHBENR_FLITFEN ((uint16_t)0x0010) /*!< FLITF clock enable */ +#define RCC_AHBENR_CRCEN ((uint16_t)0x0040) /*!< CRC clock enable */ + +#if defined (STM32F10X_HD) || defined (STM32F10X_CL) || defined (STM32F10X_HD_VL) + #define RCC_AHBENR_DMA2EN ((uint16_t)0x0002) /*!< DMA2 clock enable */ +#endif + +#if defined (STM32F10X_HD) || defined (STM32F10X_XL) + #define RCC_AHBENR_FSMCEN ((uint16_t)0x0100) /*!< FSMC clock enable */ + #define RCC_AHBENR_SDIOEN ((uint16_t)0x0400) /*!< SDIO clock enable */ +#endif + +#if defined (STM32F10X_HD_VL) + #define RCC_AHBENR_FSMCEN ((uint16_t)0x0100) /*!< FSMC clock enable */ +#endif + +#ifdef STM32F10X_CL + #define RCC_AHBENR_OTGFSEN ((uint32_t)0x00001000) /*!< USB OTG FS clock enable */ + #define RCC_AHBENR_ETHMACEN ((uint32_t)0x00004000) /*!< ETHERNET MAC clock enable */ + #define RCC_AHBENR_ETHMACTXEN ((uint32_t)0x00008000) /*!< ETHERNET MAC Tx clock enable */ + #define RCC_AHBENR_ETHMACRXEN ((uint32_t)0x00010000) /*!< ETHERNET MAC Rx clock enable */ +#endif /* STM32F10X_CL */ + +/****************** Bit definition for RCC_APB2ENR register *****************/ +#define RCC_APB2ENR_AFIOEN ((uint32_t)0x00000001) /*!< Alternate Function I/O clock enable */ +#define RCC_APB2ENR_IOPAEN ((uint32_t)0x00000004) /*!< I/O port A clock enable */ +#define RCC_APB2ENR_IOPBEN ((uint32_t)0x00000008) /*!< I/O port B clock enable */ +#define RCC_APB2ENR_IOPCEN ((uint32_t)0x00000010) /*!< I/O port C clock enable */ +#define RCC_APB2ENR_IOPDEN ((uint32_t)0x00000020) /*!< I/O port D clock enable */ +#define RCC_APB2ENR_ADC1EN ((uint32_t)0x00000200) /*!< ADC 1 interface clock enable */ + +#if !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD_VL) +#define RCC_APB2ENR_ADC2EN ((uint32_t)0x00000400) /*!< ADC 2 interface clock enable */ +#endif + +#define RCC_APB2ENR_TIM1EN ((uint32_t)0x00000800) /*!< TIM1 Timer clock enable */ +#define RCC_APB2ENR_SPI1EN ((uint32_t)0x00001000) /*!< SPI 1 clock enable */ +#define RCC_APB2ENR_USART1EN ((uint32_t)0x00004000) /*!< USART1 clock enable */ + +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) +#define RCC_APB2ENR_TIM15EN ((uint32_t)0x00010000) /*!< TIM15 Timer clock enable */ +#define RCC_APB2ENR_TIM16EN ((uint32_t)0x00020000) /*!< TIM16 Timer clock enable */ +#define RCC_APB2ENR_TIM17EN ((uint32_t)0x00040000) /*!< TIM17 Timer clock enable */ +#endif + +#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) + #define RCC_APB2ENR_IOPEEN ((uint32_t)0x00000040) /*!< I/O port E clock enable */ +#endif /* STM32F10X_LD && STM32F10X_LD_VL */ + +#if defined (STM32F10X_HD) || defined (STM32F10X_XL) + #define RCC_APB2ENR_IOPFEN ((uint32_t)0x00000080) /*!< I/O port F clock enable */ + #define RCC_APB2ENR_IOPGEN ((uint32_t)0x00000100) /*!< I/O port G clock enable */ + #define RCC_APB2ENR_TIM8EN ((uint32_t)0x00002000) /*!< TIM8 Timer clock enable */ + #define RCC_APB2ENR_ADC3EN ((uint32_t)0x00008000) /*!< DMA1 clock enable */ +#endif + +#if defined (STM32F10X_HD_VL) + #define RCC_APB2ENR_IOPFEN ((uint32_t)0x00000080) /*!< I/O port F clock enable */ + #define RCC_APB2ENR_IOPGEN ((uint32_t)0x00000100) /*!< I/O port G clock enable */ +#endif + +#ifdef STM32F10X_XL + #define RCC_APB2ENR_TIM9EN ((uint32_t)0x00080000) /*!< TIM9 Timer clock enable */ + #define RCC_APB2ENR_TIM10EN ((uint32_t)0x00100000) /*!< TIM10 Timer clock enable */ + #define RCC_APB2ENR_TIM11EN ((uint32_t)0x00200000) /*!< TIM11 Timer clock enable */ +#endif + +/***************** Bit definition for RCC_APB1ENR register ******************/ +#define RCC_APB1ENR_TIM2EN ((uint32_t)0x00000001) /*!< Timer 2 clock enabled*/ +#define RCC_APB1ENR_TIM3EN ((uint32_t)0x00000002) /*!< Timer 3 clock enable */ +#define RCC_APB1ENR_WWDGEN ((uint32_t)0x00000800) /*!< Window Watchdog clock enable */ +#define RCC_APB1ENR_USART2EN ((uint32_t)0x00020000) /*!< USART 2 clock enable */ +#define RCC_APB1ENR_I2C1EN ((uint32_t)0x00200000) /*!< I2C 1 clock enable */ + +#if !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD_VL) +#define RCC_APB1ENR_CAN1EN ((uint32_t)0x02000000) /*!< CAN1 clock enable */ +#endif + +#define RCC_APB1ENR_BKPEN ((uint32_t)0x08000000) /*!< Backup interface clock enable */ +#define RCC_APB1ENR_PWREN ((uint32_t)0x10000000) /*!< Power interface clock enable */ + +#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) + #define RCC_APB1ENR_TIM4EN ((uint32_t)0x00000004) /*!< Timer 4 clock enable */ + #define RCC_APB1ENR_SPI2EN ((uint32_t)0x00004000) /*!< SPI 2 clock enable */ + #define RCC_APB1ENR_USART3EN ((uint32_t)0x00040000) /*!< USART 3 clock enable */ + #define RCC_APB1ENR_I2C2EN ((uint32_t)0x00400000) /*!< I2C 2 clock enable */ +#endif /* STM32F10X_LD && STM32F10X_LD_VL */ + +#if defined (STM32F10X_HD) || defined (STM32F10X_MD) || defined (STM32F10X_LD) + #define RCC_APB1ENR_USBEN ((uint32_t)0x00800000) /*!< USB Device clock enable */ +#endif + +#if defined (STM32F10X_HD) || defined (STM32F10X_CL) + #define RCC_APB1ENR_TIM5EN ((uint32_t)0x00000008) /*!< Timer 5 clock enable */ + #define RCC_APB1ENR_TIM6EN ((uint32_t)0x00000010) /*!< Timer 6 clock enable */ + #define RCC_APB1ENR_TIM7EN ((uint32_t)0x00000020) /*!< Timer 7 clock enable */ + #define RCC_APB1ENR_SPI3EN ((uint32_t)0x00008000) /*!< SPI 3 clock enable */ + #define RCC_APB1ENR_UART4EN ((uint32_t)0x00080000) /*!< UART 4 clock enable */ + #define RCC_APB1ENR_UART5EN ((uint32_t)0x00100000) /*!< UART 5 clock enable */ + #define RCC_APB1ENR_DACEN ((uint32_t)0x20000000) /*!< DAC interface clock enable */ +#endif + +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) + #define RCC_APB1ENR_TIM6EN ((uint32_t)0x00000010) /*!< Timer 6 clock enable */ + #define RCC_APB1ENR_TIM7EN ((uint32_t)0x00000020) /*!< Timer 7 clock enable */ + #define RCC_APB1ENR_DACEN ((uint32_t)0x20000000) /*!< DAC interface clock enable */ + #define RCC_APB1ENR_CECEN ((uint32_t)0x40000000) /*!< CEC interface clock enable */ +#endif + +#ifdef STM32F10X_HD_VL + #define RCC_APB1ENR_TIM5EN ((uint32_t)0x00000008) /*!< Timer 5 clock enable */ + #define RCC_APB1ENR_TIM12EN ((uint32_t)0x00000040) /*!< TIM12 Timer clock enable */ + #define RCC_APB1ENR_TIM13EN ((uint32_t)0x00000080) /*!< TIM13 Timer clock enable */ + #define RCC_APB1ENR_TIM14EN ((uint32_t)0x00000100) /*!< TIM14 Timer clock enable */ + #define RCC_APB1ENR_SPI3EN ((uint32_t)0x00008000) /*!< SPI 3 clock enable */ + #define RCC_APB1ENR_UART4EN ((uint32_t)0x00080000) /*!< UART 4 clock enable */ + #define RCC_APB1ENR_UART5EN ((uint32_t)0x00100000) /*!< UART 5 clock enable */ +#endif /* STM32F10X_HD_VL */ + +#ifdef STM32F10X_CL + #define RCC_APB1ENR_CAN2EN ((uint32_t)0x04000000) /*!< CAN2 clock enable */ +#endif /* STM32F10X_CL */ + +#ifdef STM32F10X_XL + #define RCC_APB1ENR_TIM12EN ((uint32_t)0x00000040) /*!< TIM12 Timer clock enable */ + #define RCC_APB1ENR_TIM13EN ((uint32_t)0x00000080) /*!< TIM13 Timer clock enable */ + #define RCC_APB1ENR_TIM14EN ((uint32_t)0x00000100) /*!< TIM14 Timer clock enable */ +#endif /* STM32F10X_XL */ + +/******************* Bit definition for RCC_BDCR register *******************/ +#define RCC_BDCR_LSEON ((uint32_t)0x00000001) /*!< External Low Speed oscillator enable */ +#define RCC_BDCR_LSERDY ((uint32_t)0x00000002) /*!< External Low Speed oscillator Ready */ +#define RCC_BDCR_LSEBYP ((uint32_t)0x00000004) /*!< External Low Speed oscillator Bypass */ + +#define RCC_BDCR_RTCSEL ((uint32_t)0x00000300) /*!< RTCSEL[1:0] bits (RTC clock source selection) */ +#define RCC_BDCR_RTCSEL_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define RCC_BDCR_RTCSEL_1 ((uint32_t)0x00000200) /*!< Bit 1 */ + +/*!< RTC congiguration */ +#define RCC_BDCR_RTCSEL_NOCLOCK ((uint32_t)0x00000000) /*!< No clock */ +#define RCC_BDCR_RTCSEL_LSE ((uint32_t)0x00000100) /*!< LSE oscillator clock used as RTC clock */ +#define RCC_BDCR_RTCSEL_LSI ((uint32_t)0x00000200) /*!< LSI oscillator clock used as RTC clock */ +#define RCC_BDCR_RTCSEL_HSE ((uint32_t)0x00000300) /*!< HSE oscillator clock divided by 128 used as RTC clock */ + +#define RCC_BDCR_RTCEN ((uint32_t)0x00008000) /*!< RTC clock enable */ +#define RCC_BDCR_BDRST ((uint32_t)0x00010000) /*!< Backup domain software reset */ + +/******************* Bit definition for RCC_CSR register ********************/ +#define RCC_CSR_LSION ((uint32_t)0x00000001) /*!< Internal Low Speed oscillator enable */ +#define RCC_CSR_LSIRDY ((uint32_t)0x00000002) /*!< Internal Low Speed oscillator Ready */ +#define RCC_CSR_RMVF ((uint32_t)0x01000000) /*!< Remove reset flag */ +#define RCC_CSR_PINRSTF ((uint32_t)0x04000000) /*!< PIN reset flag */ +#define RCC_CSR_PORRSTF ((uint32_t)0x08000000) /*!< POR/PDR reset flag */ +#define RCC_CSR_SFTRSTF ((uint32_t)0x10000000) /*!< Software Reset flag */ +#define RCC_CSR_IWDGRSTF ((uint32_t)0x20000000) /*!< Independent Watchdog reset flag */ +#define RCC_CSR_WWDGRSTF ((uint32_t)0x40000000) /*!< Window watchdog reset flag */ +#define RCC_CSR_LPWRRSTF ((uint32_t)0x80000000) /*!< Low-Power reset flag */ + +#ifdef STM32F10X_CL +/******************* Bit definition for RCC_AHBRSTR register ****************/ + #define RCC_AHBRSTR_OTGFSRST ((uint32_t)0x00001000) /*!< USB OTG FS reset */ + #define RCC_AHBRSTR_ETHMACRST ((uint32_t)0x00004000) /*!< ETHERNET MAC reset */ + +/******************* Bit definition for RCC_CFGR2 register ******************/ +/*!< PREDIV1 configuration */ + #define RCC_CFGR2_PREDIV1 ((uint32_t)0x0000000F) /*!< PREDIV1[3:0] bits */ + #define RCC_CFGR2_PREDIV1_0 ((uint32_t)0x00000001) /*!< Bit 0 */ + #define RCC_CFGR2_PREDIV1_1 ((uint32_t)0x00000002) /*!< Bit 1 */ + #define RCC_CFGR2_PREDIV1_2 ((uint32_t)0x00000004) /*!< Bit 2 */ + #define RCC_CFGR2_PREDIV1_3 ((uint32_t)0x00000008) /*!< Bit 3 */ + + #define RCC_CFGR2_PREDIV1_DIV1 ((uint32_t)0x00000000) /*!< PREDIV1 input clock not divided */ + #define RCC_CFGR2_PREDIV1_DIV2 ((uint32_t)0x00000001) /*!< PREDIV1 input clock divided by 2 */ + #define RCC_CFGR2_PREDIV1_DIV3 ((uint32_t)0x00000002) /*!< PREDIV1 input clock divided by 3 */ + #define RCC_CFGR2_PREDIV1_DIV4 ((uint32_t)0x00000003) /*!< PREDIV1 input clock divided by 4 */ + #define RCC_CFGR2_PREDIV1_DIV5 ((uint32_t)0x00000004) /*!< PREDIV1 input clock divided by 5 */ + #define RCC_CFGR2_PREDIV1_DIV6 ((uint32_t)0x00000005) /*!< PREDIV1 input clock divided by 6 */ + #define RCC_CFGR2_PREDIV1_DIV7 ((uint32_t)0x00000006) /*!< PREDIV1 input clock divided by 7 */ + #define RCC_CFGR2_PREDIV1_DIV8 ((uint32_t)0x00000007) /*!< PREDIV1 input clock divided by 8 */ + #define RCC_CFGR2_PREDIV1_DIV9 ((uint32_t)0x00000008) /*!< PREDIV1 input clock divided by 9 */ + #define RCC_CFGR2_PREDIV1_DIV10 ((uint32_t)0x00000009) /*!< PREDIV1 input clock divided by 10 */ + #define RCC_CFGR2_PREDIV1_DIV11 ((uint32_t)0x0000000A) /*!< PREDIV1 input clock divided by 11 */ + #define RCC_CFGR2_PREDIV1_DIV12 ((uint32_t)0x0000000B) /*!< PREDIV1 input clock divided by 12 */ + #define RCC_CFGR2_PREDIV1_DIV13 ((uint32_t)0x0000000C) /*!< PREDIV1 input clock divided by 13 */ + #define RCC_CFGR2_PREDIV1_DIV14 ((uint32_t)0x0000000D) /*!< PREDIV1 input clock divided by 14 */ + #define RCC_CFGR2_PREDIV1_DIV15 ((uint32_t)0x0000000E) /*!< PREDIV1 input clock divided by 15 */ + #define RCC_CFGR2_PREDIV1_DIV16 ((uint32_t)0x0000000F) /*!< PREDIV1 input clock divided by 16 */ + +/*!< PREDIV2 configuration */ + #define RCC_CFGR2_PREDIV2 ((uint32_t)0x000000F0) /*!< PREDIV2[3:0] bits */ + #define RCC_CFGR2_PREDIV2_0 ((uint32_t)0x00000010) /*!< Bit 0 */ + #define RCC_CFGR2_PREDIV2_1 ((uint32_t)0x00000020) /*!< Bit 1 */ + #define RCC_CFGR2_PREDIV2_2 ((uint32_t)0x00000040) /*!< Bit 2 */ + #define RCC_CFGR2_PREDIV2_3 ((uint32_t)0x00000080) /*!< Bit 3 */ + + #define RCC_CFGR2_PREDIV2_DIV1 ((uint32_t)0x00000000) /*!< PREDIV2 input clock not divided */ + #define RCC_CFGR2_PREDIV2_DIV2 ((uint32_t)0x00000010) /*!< PREDIV2 input clock divided by 2 */ + #define RCC_CFGR2_PREDIV2_DIV3 ((uint32_t)0x00000020) /*!< PREDIV2 input clock divided by 3 */ + #define RCC_CFGR2_PREDIV2_DIV4 ((uint32_t)0x00000030) /*!< PREDIV2 input clock divided by 4 */ + #define RCC_CFGR2_PREDIV2_DIV5 ((uint32_t)0x00000040) /*!< PREDIV2 input clock divided by 5 */ + #define RCC_CFGR2_PREDIV2_DIV6 ((uint32_t)0x00000050) /*!< PREDIV2 input clock divided by 6 */ + #define RCC_CFGR2_PREDIV2_DIV7 ((uint32_t)0x00000060) /*!< PREDIV2 input clock divided by 7 */ + #define RCC_CFGR2_PREDIV2_DIV8 ((uint32_t)0x00000070) /*!< PREDIV2 input clock divided by 8 */ + #define RCC_CFGR2_PREDIV2_DIV9 ((uint32_t)0x00000080) /*!< PREDIV2 input clock divided by 9 */ + #define RCC_CFGR2_PREDIV2_DIV10 ((uint32_t)0x00000090) /*!< PREDIV2 input clock divided by 10 */ + #define RCC_CFGR2_PREDIV2_DIV11 ((uint32_t)0x000000A0) /*!< PREDIV2 input clock divided by 11 */ + #define RCC_CFGR2_PREDIV2_DIV12 ((uint32_t)0x000000B0) /*!< PREDIV2 input clock divided by 12 */ + #define RCC_CFGR2_PREDIV2_DIV13 ((uint32_t)0x000000C0) /*!< PREDIV2 input clock divided by 13 */ + #define RCC_CFGR2_PREDIV2_DIV14 ((uint32_t)0x000000D0) /*!< PREDIV2 input clock divided by 14 */ + #define RCC_CFGR2_PREDIV2_DIV15 ((uint32_t)0x000000E0) /*!< PREDIV2 input clock divided by 15 */ + #define RCC_CFGR2_PREDIV2_DIV16 ((uint32_t)0x000000F0) /*!< PREDIV2 input clock divided by 16 */ + +/*!< PLL2MUL configuration */ + #define RCC_CFGR2_PLL2MUL ((uint32_t)0x00000F00) /*!< PLL2MUL[3:0] bits */ + #define RCC_CFGR2_PLL2MUL_0 ((uint32_t)0x00000100) /*!< Bit 0 */ + #define RCC_CFGR2_PLL2MUL_1 ((uint32_t)0x00000200) /*!< Bit 1 */ + #define RCC_CFGR2_PLL2MUL_2 ((uint32_t)0x00000400) /*!< Bit 2 */ + #define RCC_CFGR2_PLL2MUL_3 ((uint32_t)0x00000800) /*!< Bit 3 */ + + #define RCC_CFGR2_PLL2MUL8 ((uint32_t)0x00000600) /*!< PLL2 input clock * 8 */ + #define RCC_CFGR2_PLL2MUL9 ((uint32_t)0x00000700) /*!< PLL2 input clock * 9 */ + #define RCC_CFGR2_PLL2MUL10 ((uint32_t)0x00000800) /*!< PLL2 input clock * 10 */ + #define RCC_CFGR2_PLL2MUL11 ((uint32_t)0x00000900) /*!< PLL2 input clock * 11 */ + #define RCC_CFGR2_PLL2MUL12 ((uint32_t)0x00000A00) /*!< PLL2 input clock * 12 */ + #define RCC_CFGR2_PLL2MUL13 ((uint32_t)0x00000B00) /*!< PLL2 input clock * 13 */ + #define RCC_CFGR2_PLL2MUL14 ((uint32_t)0x00000C00) /*!< PLL2 input clock * 14 */ + #define RCC_CFGR2_PLL2MUL16 ((uint32_t)0x00000E00) /*!< PLL2 input clock * 16 */ + #define RCC_CFGR2_PLL2MUL20 ((uint32_t)0x00000F00) /*!< PLL2 input clock * 20 */ + +/*!< PLL3MUL configuration */ + #define RCC_CFGR2_PLL3MUL ((uint32_t)0x0000F000) /*!< PLL3MUL[3:0] bits */ + #define RCC_CFGR2_PLL3MUL_0 ((uint32_t)0x00001000) /*!< Bit 0 */ + #define RCC_CFGR2_PLL3MUL_1 ((uint32_t)0x00002000) /*!< Bit 1 */ + #define RCC_CFGR2_PLL3MUL_2 ((uint32_t)0x00004000) /*!< Bit 2 */ + #define RCC_CFGR2_PLL3MUL_3 ((uint32_t)0x00008000) /*!< Bit 3 */ + + #define RCC_CFGR2_PLL3MUL8 ((uint32_t)0x00006000) /*!< PLL3 input clock * 8 */ + #define RCC_CFGR2_PLL3MUL9 ((uint32_t)0x00007000) /*!< PLL3 input clock * 9 */ + #define RCC_CFGR2_PLL3MUL10 ((uint32_t)0x00008000) /*!< PLL3 input clock * 10 */ + #define RCC_CFGR2_PLL3MUL11 ((uint32_t)0x00009000) /*!< PLL3 input clock * 11 */ + #define RCC_CFGR2_PLL3MUL12 ((uint32_t)0x0000A000) /*!< PLL3 input clock * 12 */ + #define RCC_CFGR2_PLL3MUL13 ((uint32_t)0x0000B000) /*!< PLL3 input clock * 13 */ + #define RCC_CFGR2_PLL3MUL14 ((uint32_t)0x0000C000) /*!< PLL3 input clock * 14 */ + #define RCC_CFGR2_PLL3MUL16 ((uint32_t)0x0000E000) /*!< PLL3 input clock * 16 */ + #define RCC_CFGR2_PLL3MUL20 ((uint32_t)0x0000F000) /*!< PLL3 input clock * 20 */ + + #define RCC_CFGR2_PREDIV1SRC ((uint32_t)0x00010000) /*!< PREDIV1 entry clock source */ + #define RCC_CFGR2_PREDIV1SRC_PLL2 ((uint32_t)0x00010000) /*!< PLL2 selected as PREDIV1 entry clock source */ + #define RCC_CFGR2_PREDIV1SRC_HSE ((uint32_t)0x00000000) /*!< HSE selected as PREDIV1 entry clock source */ + #define RCC_CFGR2_I2S2SRC ((uint32_t)0x00020000) /*!< I2S2 entry clock source */ + #define RCC_CFGR2_I2S3SRC ((uint32_t)0x00040000) /*!< I2S3 clock source */ +#endif /* STM32F10X_CL */ + +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) +/******************* Bit definition for RCC_CFGR2 register ******************/ +/*!< PREDIV1 configuration */ + #define RCC_CFGR2_PREDIV1 ((uint32_t)0x0000000F) /*!< PREDIV1[3:0] bits */ + #define RCC_CFGR2_PREDIV1_0 ((uint32_t)0x00000001) /*!< Bit 0 */ + #define RCC_CFGR2_PREDIV1_1 ((uint32_t)0x00000002) /*!< Bit 1 */ + #define RCC_CFGR2_PREDIV1_2 ((uint32_t)0x00000004) /*!< Bit 2 */ + #define RCC_CFGR2_PREDIV1_3 ((uint32_t)0x00000008) /*!< Bit 3 */ + + #define RCC_CFGR2_PREDIV1_DIV1 ((uint32_t)0x00000000) /*!< PREDIV1 input clock not divided */ + #define RCC_CFGR2_PREDIV1_DIV2 ((uint32_t)0x00000001) /*!< PREDIV1 input clock divided by 2 */ + #define RCC_CFGR2_PREDIV1_DIV3 ((uint32_t)0x00000002) /*!< PREDIV1 input clock divided by 3 */ + #define RCC_CFGR2_PREDIV1_DIV4 ((uint32_t)0x00000003) /*!< PREDIV1 input clock divided by 4 */ + #define RCC_CFGR2_PREDIV1_DIV5 ((uint32_t)0x00000004) /*!< PREDIV1 input clock divided by 5 */ + #define RCC_CFGR2_PREDIV1_DIV6 ((uint32_t)0x00000005) /*!< PREDIV1 input clock divided by 6 */ + #define RCC_CFGR2_PREDIV1_DIV7 ((uint32_t)0x00000006) /*!< PREDIV1 input clock divided by 7 */ + #define RCC_CFGR2_PREDIV1_DIV8 ((uint32_t)0x00000007) /*!< PREDIV1 input clock divided by 8 */ + #define RCC_CFGR2_PREDIV1_DIV9 ((uint32_t)0x00000008) /*!< PREDIV1 input clock divided by 9 */ + #define RCC_CFGR2_PREDIV1_DIV10 ((uint32_t)0x00000009) /*!< PREDIV1 input clock divided by 10 */ + #define RCC_CFGR2_PREDIV1_DIV11 ((uint32_t)0x0000000A) /*!< PREDIV1 input clock divided by 11 */ + #define RCC_CFGR2_PREDIV1_DIV12 ((uint32_t)0x0000000B) /*!< PREDIV1 input clock divided by 12 */ + #define RCC_CFGR2_PREDIV1_DIV13 ((uint32_t)0x0000000C) /*!< PREDIV1 input clock divided by 13 */ + #define RCC_CFGR2_PREDIV1_DIV14 ((uint32_t)0x0000000D) /*!< PREDIV1 input clock divided by 14 */ + #define RCC_CFGR2_PREDIV1_DIV15 ((uint32_t)0x0000000E) /*!< PREDIV1 input clock divided by 15 */ + #define RCC_CFGR2_PREDIV1_DIV16 ((uint32_t)0x0000000F) /*!< PREDIV1 input clock divided by 16 */ +#endif + +/******************************************************************************/ +/* */ +/* General Purpose and Alternate Function I/O */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for GPIO_CRL register *******************/ +#define GPIO_CRL_MODE ((uint32_t)0x33333333) /*!< Port x mode bits */ + +#define GPIO_CRL_MODE0 ((uint32_t)0x00000003) /*!< MODE0[1:0] bits (Port x mode bits, pin 0) */ +#define GPIO_CRL_MODE0_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define GPIO_CRL_MODE0_1 ((uint32_t)0x00000002) /*!< Bit 1 */ + +#define GPIO_CRL_MODE1 ((uint32_t)0x00000030) /*!< MODE1[1:0] bits (Port x mode bits, pin 1) */ +#define GPIO_CRL_MODE1_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define GPIO_CRL_MODE1_1 ((uint32_t)0x00000020) /*!< Bit 1 */ + +#define GPIO_CRL_MODE2 ((uint32_t)0x00000300) /*!< MODE2[1:0] bits (Port x mode bits, pin 2) */ +#define GPIO_CRL_MODE2_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define GPIO_CRL_MODE2_1 ((uint32_t)0x00000200) /*!< Bit 1 */ + +#define GPIO_CRL_MODE3 ((uint32_t)0x00003000) /*!< MODE3[1:0] bits (Port x mode bits, pin 3) */ +#define GPIO_CRL_MODE3_0 ((uint32_t)0x00001000) /*!< Bit 0 */ +#define GPIO_CRL_MODE3_1 ((uint32_t)0x00002000) /*!< Bit 1 */ + +#define GPIO_CRL_MODE4 ((uint32_t)0x00030000) /*!< MODE4[1:0] bits (Port x mode bits, pin 4) */ +#define GPIO_CRL_MODE4_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define GPIO_CRL_MODE4_1 ((uint32_t)0x00020000) /*!< Bit 1 */ + +#define GPIO_CRL_MODE5 ((uint32_t)0x00300000) /*!< MODE5[1:0] bits (Port x mode bits, pin 5) */ +#define GPIO_CRL_MODE5_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define GPIO_CRL_MODE5_1 ((uint32_t)0x00200000) /*!< Bit 1 */ + +#define GPIO_CRL_MODE6 ((uint32_t)0x03000000) /*!< MODE6[1:0] bits (Port x mode bits, pin 6) */ +#define GPIO_CRL_MODE6_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define GPIO_CRL_MODE6_1 ((uint32_t)0x02000000) /*!< Bit 1 */ + +#define GPIO_CRL_MODE7 ((uint32_t)0x30000000) /*!< MODE7[1:0] bits (Port x mode bits, pin 7) */ +#define GPIO_CRL_MODE7_0 ((uint32_t)0x10000000) /*!< Bit 0 */ +#define GPIO_CRL_MODE7_1 ((uint32_t)0x20000000) /*!< Bit 1 */ + +#define GPIO_CRL_CNF ((uint32_t)0xCCCCCCCC) /*!< Port x configuration bits */ + +#define GPIO_CRL_CNF0 ((uint32_t)0x0000000C) /*!< CNF0[1:0] bits (Port x configuration bits, pin 0) */ +#define GPIO_CRL_CNF0_0 ((uint32_t)0x00000004) /*!< Bit 0 */ +#define GPIO_CRL_CNF0_1 ((uint32_t)0x00000008) /*!< Bit 1 */ + +#define GPIO_CRL_CNF1 ((uint32_t)0x000000C0) /*!< CNF1[1:0] bits (Port x configuration bits, pin 1) */ +#define GPIO_CRL_CNF1_0 ((uint32_t)0x00000040) /*!< Bit 0 */ +#define GPIO_CRL_CNF1_1 ((uint32_t)0x00000080) /*!< Bit 1 */ + +#define GPIO_CRL_CNF2 ((uint32_t)0x00000C00) /*!< CNF2[1:0] bits (Port x configuration bits, pin 2) */ +#define GPIO_CRL_CNF2_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define GPIO_CRL_CNF2_1 ((uint32_t)0x00000800) /*!< Bit 1 */ + +#define GPIO_CRL_CNF3 ((uint32_t)0x0000C000) /*!< CNF3[1:0] bits (Port x configuration bits, pin 3) */ +#define GPIO_CRL_CNF3_0 ((uint32_t)0x00004000) /*!< Bit 0 */ +#define GPIO_CRL_CNF3_1 ((uint32_t)0x00008000) /*!< Bit 1 */ + +#define GPIO_CRL_CNF4 ((uint32_t)0x000C0000) /*!< CNF4[1:0] bits (Port x configuration bits, pin 4) */ +#define GPIO_CRL_CNF4_0 ((uint32_t)0x00040000) /*!< Bit 0 */ +#define GPIO_CRL_CNF4_1 ((uint32_t)0x00080000) /*!< Bit 1 */ + +#define GPIO_CRL_CNF5 ((uint32_t)0x00C00000) /*!< CNF5[1:0] bits (Port x configuration bits, pin 5) */ +#define GPIO_CRL_CNF5_0 ((uint32_t)0x00400000) /*!< Bit 0 */ +#define GPIO_CRL_CNF5_1 ((uint32_t)0x00800000) /*!< Bit 1 */ + +#define GPIO_CRL_CNF6 ((uint32_t)0x0C000000) /*!< CNF6[1:0] bits (Port x configuration bits, pin 6) */ +#define GPIO_CRL_CNF6_0 ((uint32_t)0x04000000) /*!< Bit 0 */ +#define GPIO_CRL_CNF6_1 ((uint32_t)0x08000000) /*!< Bit 1 */ + +#define GPIO_CRL_CNF7 ((uint32_t)0xC0000000) /*!< CNF7[1:0] bits (Port x configuration bits, pin 7) */ +#define GPIO_CRL_CNF7_0 ((uint32_t)0x40000000) /*!< Bit 0 */ +#define GPIO_CRL_CNF7_1 ((uint32_t)0x80000000) /*!< Bit 1 */ + +/******************* Bit definition for GPIO_CRH register *******************/ +#define GPIO_CRH_MODE ((uint32_t)0x33333333) /*!< Port x mode bits */ + +#define GPIO_CRH_MODE8 ((uint32_t)0x00000003) /*!< MODE8[1:0] bits (Port x mode bits, pin 8) */ +#define GPIO_CRH_MODE8_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define GPIO_CRH_MODE8_1 ((uint32_t)0x00000002) /*!< Bit 1 */ + +#define GPIO_CRH_MODE9 ((uint32_t)0x00000030) /*!< MODE9[1:0] bits (Port x mode bits, pin 9) */ +#define GPIO_CRH_MODE9_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define GPIO_CRH_MODE9_1 ((uint32_t)0x00000020) /*!< Bit 1 */ + +#define GPIO_CRH_MODE10 ((uint32_t)0x00000300) /*!< MODE10[1:0] bits (Port x mode bits, pin 10) */ +#define GPIO_CRH_MODE10_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define GPIO_CRH_MODE10_1 ((uint32_t)0x00000200) /*!< Bit 1 */ + +#define GPIO_CRH_MODE11 ((uint32_t)0x00003000) /*!< MODE11[1:0] bits (Port x mode bits, pin 11) */ +#define GPIO_CRH_MODE11_0 ((uint32_t)0x00001000) /*!< Bit 0 */ +#define GPIO_CRH_MODE11_1 ((uint32_t)0x00002000) /*!< Bit 1 */ + +#define GPIO_CRH_MODE12 ((uint32_t)0x00030000) /*!< MODE12[1:0] bits (Port x mode bits, pin 12) */ +#define GPIO_CRH_MODE12_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define GPIO_CRH_MODE12_1 ((uint32_t)0x00020000) /*!< Bit 1 */ + +#define GPIO_CRH_MODE13 ((uint32_t)0x00300000) /*!< MODE13[1:0] bits (Port x mode bits, pin 13) */ +#define GPIO_CRH_MODE13_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define GPIO_CRH_MODE13_1 ((uint32_t)0x00200000) /*!< Bit 1 */ + +#define GPIO_CRH_MODE14 ((uint32_t)0x03000000) /*!< MODE14[1:0] bits (Port x mode bits, pin 14) */ +#define GPIO_CRH_MODE14_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define GPIO_CRH_MODE14_1 ((uint32_t)0x02000000) /*!< Bit 1 */ + +#define GPIO_CRH_MODE15 ((uint32_t)0x30000000) /*!< MODE15[1:0] bits (Port x mode bits, pin 15) */ +#define GPIO_CRH_MODE15_0 ((uint32_t)0x10000000) /*!< Bit 0 */ +#define GPIO_CRH_MODE15_1 ((uint32_t)0x20000000) /*!< Bit 1 */ + +#define GPIO_CRH_CNF ((uint32_t)0xCCCCCCCC) /*!< Port x configuration bits */ + +#define GPIO_CRH_CNF8 ((uint32_t)0x0000000C) /*!< CNF8[1:0] bits (Port x configuration bits, pin 8) */ +#define GPIO_CRH_CNF8_0 ((uint32_t)0x00000004) /*!< Bit 0 */ +#define GPIO_CRH_CNF8_1 ((uint32_t)0x00000008) /*!< Bit 1 */ + +#define GPIO_CRH_CNF9 ((uint32_t)0x000000C0) /*!< CNF9[1:0] bits (Port x configuration bits, pin 9) */ +#define GPIO_CRH_CNF9_0 ((uint32_t)0x00000040) /*!< Bit 0 */ +#define GPIO_CRH_CNF9_1 ((uint32_t)0x00000080) /*!< Bit 1 */ + +#define GPIO_CRH_CNF10 ((uint32_t)0x00000C00) /*!< CNF10[1:0] bits (Port x configuration bits, pin 10) */ +#define GPIO_CRH_CNF10_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define GPIO_CRH_CNF10_1 ((uint32_t)0x00000800) /*!< Bit 1 */ + +#define GPIO_CRH_CNF11 ((uint32_t)0x0000C000) /*!< CNF11[1:0] bits (Port x configuration bits, pin 11) */ +#define GPIO_CRH_CNF11_0 ((uint32_t)0x00004000) /*!< Bit 0 */ +#define GPIO_CRH_CNF11_1 ((uint32_t)0x00008000) /*!< Bit 1 */ + +#define GPIO_CRH_CNF12 ((uint32_t)0x000C0000) /*!< CNF12[1:0] bits (Port x configuration bits, pin 12) */ +#define GPIO_CRH_CNF12_0 ((uint32_t)0x00040000) /*!< Bit 0 */ +#define GPIO_CRH_CNF12_1 ((uint32_t)0x00080000) /*!< Bit 1 */ + +#define GPIO_CRH_CNF13 ((uint32_t)0x00C00000) /*!< CNF13[1:0] bits (Port x configuration bits, pin 13) */ +#define GPIO_CRH_CNF13_0 ((uint32_t)0x00400000) /*!< Bit 0 */ +#define GPIO_CRH_CNF13_1 ((uint32_t)0x00800000) /*!< Bit 1 */ + +#define GPIO_CRH_CNF14 ((uint32_t)0x0C000000) /*!< CNF14[1:0] bits (Port x configuration bits, pin 14) */ +#define GPIO_CRH_CNF14_0 ((uint32_t)0x04000000) /*!< Bit 0 */ +#define GPIO_CRH_CNF14_1 ((uint32_t)0x08000000) /*!< Bit 1 */ + +#define GPIO_CRH_CNF15 ((uint32_t)0xC0000000) /*!< CNF15[1:0] bits (Port x configuration bits, pin 15) */ +#define GPIO_CRH_CNF15_0 ((uint32_t)0x40000000) /*!< Bit 0 */ +#define GPIO_CRH_CNF15_1 ((uint32_t)0x80000000) /*!< Bit 1 */ + +/*!<****************** Bit definition for GPIO_IDR register *******************/ +#define GPIO_IDR_IDR0 ((uint16_t)0x0001) /*!< Port input data, bit 0 */ +#define GPIO_IDR_IDR1 ((uint16_t)0x0002) /*!< Port input data, bit 1 */ +#define GPIO_IDR_IDR2 ((uint16_t)0x0004) /*!< Port input data, bit 2 */ +#define GPIO_IDR_IDR3 ((uint16_t)0x0008) /*!< Port input data, bit 3 */ +#define GPIO_IDR_IDR4 ((uint16_t)0x0010) /*!< Port input data, bit 4 */ +#define GPIO_IDR_IDR5 ((uint16_t)0x0020) /*!< Port input data, bit 5 */ +#define GPIO_IDR_IDR6 ((uint16_t)0x0040) /*!< Port input data, bit 6 */ +#define GPIO_IDR_IDR7 ((uint16_t)0x0080) /*!< Port input data, bit 7 */ +#define GPIO_IDR_IDR8 ((uint16_t)0x0100) /*!< Port input data, bit 8 */ +#define GPIO_IDR_IDR9 ((uint16_t)0x0200) /*!< Port input data, bit 9 */ +#define GPIO_IDR_IDR10 ((uint16_t)0x0400) /*!< Port input data, bit 10 */ +#define GPIO_IDR_IDR11 ((uint16_t)0x0800) /*!< Port input data, bit 11 */ +#define GPIO_IDR_IDR12 ((uint16_t)0x1000) /*!< Port input data, bit 12 */ +#define GPIO_IDR_IDR13 ((uint16_t)0x2000) /*!< Port input data, bit 13 */ +#define GPIO_IDR_IDR14 ((uint16_t)0x4000) /*!< Port input data, bit 14 */ +#define GPIO_IDR_IDR15 ((uint16_t)0x8000) /*!< Port input data, bit 15 */ + +/******************* Bit definition for GPIO_ODR register *******************/ +#define GPIO_ODR_ODR0 ((uint16_t)0x0001) /*!< Port output data, bit 0 */ +#define GPIO_ODR_ODR1 ((uint16_t)0x0002) /*!< Port output data, bit 1 */ +#define GPIO_ODR_ODR2 ((uint16_t)0x0004) /*!< Port output data, bit 2 */ +#define GPIO_ODR_ODR3 ((uint16_t)0x0008) /*!< Port output data, bit 3 */ +#define GPIO_ODR_ODR4 ((uint16_t)0x0010) /*!< Port output data, bit 4 */ +#define GPIO_ODR_ODR5 ((uint16_t)0x0020) /*!< Port output data, bit 5 */ +#define GPIO_ODR_ODR6 ((uint16_t)0x0040) /*!< Port output data, bit 6 */ +#define GPIO_ODR_ODR7 ((uint16_t)0x0080) /*!< Port output data, bit 7 */ +#define GPIO_ODR_ODR8 ((uint16_t)0x0100) /*!< Port output data, bit 8 */ +#define GPIO_ODR_ODR9 ((uint16_t)0x0200) /*!< Port output data, bit 9 */ +#define GPIO_ODR_ODR10 ((uint16_t)0x0400) /*!< Port output data, bit 10 */ +#define GPIO_ODR_ODR11 ((uint16_t)0x0800) /*!< Port output data, bit 11 */ +#define GPIO_ODR_ODR12 ((uint16_t)0x1000) /*!< Port output data, bit 12 */ +#define GPIO_ODR_ODR13 ((uint16_t)0x2000) /*!< Port output data, bit 13 */ +#define GPIO_ODR_ODR14 ((uint16_t)0x4000) /*!< Port output data, bit 14 */ +#define GPIO_ODR_ODR15 ((uint16_t)0x8000) /*!< Port output data, bit 15 */ + +/****************** Bit definition for GPIO_BSRR register *******************/ +#define GPIO_BSRR_BS0 ((uint32_t)0x00000001) /*!< Port x Set bit 0 */ +#define GPIO_BSRR_BS1 ((uint32_t)0x00000002) /*!< Port x Set bit 1 */ +#define GPIO_BSRR_BS2 ((uint32_t)0x00000004) /*!< Port x Set bit 2 */ +#define GPIO_BSRR_BS3 ((uint32_t)0x00000008) /*!< Port x Set bit 3 */ +#define GPIO_BSRR_BS4 ((uint32_t)0x00000010) /*!< Port x Set bit 4 */ +#define GPIO_BSRR_BS5 ((uint32_t)0x00000020) /*!< Port x Set bit 5 */ +#define GPIO_BSRR_BS6 ((uint32_t)0x00000040) /*!< Port x Set bit 6 */ +#define GPIO_BSRR_BS7 ((uint32_t)0x00000080) /*!< Port x Set bit 7 */ +#define GPIO_BSRR_BS8 ((uint32_t)0x00000100) /*!< Port x Set bit 8 */ +#define GPIO_BSRR_BS9 ((uint32_t)0x00000200) /*!< Port x Set bit 9 */ +#define GPIO_BSRR_BS10 ((uint32_t)0x00000400) /*!< Port x Set bit 10 */ +#define GPIO_BSRR_BS11 ((uint32_t)0x00000800) /*!< Port x Set bit 11 */ +#define GPIO_BSRR_BS12 ((uint32_t)0x00001000) /*!< Port x Set bit 12 */ +#define GPIO_BSRR_BS13 ((uint32_t)0x00002000) /*!< Port x Set bit 13 */ +#define GPIO_BSRR_BS14 ((uint32_t)0x00004000) /*!< Port x Set bit 14 */ +#define GPIO_BSRR_BS15 ((uint32_t)0x00008000) /*!< Port x Set bit 15 */ + +#define GPIO_BSRR_BR0 ((uint32_t)0x00010000) /*!< Port x Reset bit 0 */ +#define GPIO_BSRR_BR1 ((uint32_t)0x00020000) /*!< Port x Reset bit 1 */ +#define GPIO_BSRR_BR2 ((uint32_t)0x00040000) /*!< Port x Reset bit 2 */ +#define GPIO_BSRR_BR3 ((uint32_t)0x00080000) /*!< Port x Reset bit 3 */ +#define GPIO_BSRR_BR4 ((uint32_t)0x00100000) /*!< Port x Reset bit 4 */ +#define GPIO_BSRR_BR5 ((uint32_t)0x00200000) /*!< Port x Reset bit 5 */ +#define GPIO_BSRR_BR6 ((uint32_t)0x00400000) /*!< Port x Reset bit 6 */ +#define GPIO_BSRR_BR7 ((uint32_t)0x00800000) /*!< Port x Reset bit 7 */ +#define GPIO_BSRR_BR8 ((uint32_t)0x01000000) /*!< Port x Reset bit 8 */ +#define GPIO_BSRR_BR9 ((uint32_t)0x02000000) /*!< Port x Reset bit 9 */ +#define GPIO_BSRR_BR10 ((uint32_t)0x04000000) /*!< Port x Reset bit 10 */ +#define GPIO_BSRR_BR11 ((uint32_t)0x08000000) /*!< Port x Reset bit 11 */ +#define GPIO_BSRR_BR12 ((uint32_t)0x10000000) /*!< Port x Reset bit 12 */ +#define GPIO_BSRR_BR13 ((uint32_t)0x20000000) /*!< Port x Reset bit 13 */ +#define GPIO_BSRR_BR14 ((uint32_t)0x40000000) /*!< Port x Reset bit 14 */ +#define GPIO_BSRR_BR15 ((uint32_t)0x80000000) /*!< Port x Reset bit 15 */ + +/******************* Bit definition for GPIO_BRR register *******************/ +#define GPIO_BRR_BR0 ((uint16_t)0x0001) /*!< Port x Reset bit 0 */ +#define GPIO_BRR_BR1 ((uint16_t)0x0002) /*!< Port x Reset bit 1 */ +#define GPIO_BRR_BR2 ((uint16_t)0x0004) /*!< Port x Reset bit 2 */ +#define GPIO_BRR_BR3 ((uint16_t)0x0008) /*!< Port x Reset bit 3 */ +#define GPIO_BRR_BR4 ((uint16_t)0x0010) /*!< Port x Reset bit 4 */ +#define GPIO_BRR_BR5 ((uint16_t)0x0020) /*!< Port x Reset bit 5 */ +#define GPIO_BRR_BR6 ((uint16_t)0x0040) /*!< Port x Reset bit 6 */ +#define GPIO_BRR_BR7 ((uint16_t)0x0080) /*!< Port x Reset bit 7 */ +#define GPIO_BRR_BR8 ((uint16_t)0x0100) /*!< Port x Reset bit 8 */ +#define GPIO_BRR_BR9 ((uint16_t)0x0200) /*!< Port x Reset bit 9 */ +#define GPIO_BRR_BR10 ((uint16_t)0x0400) /*!< Port x Reset bit 10 */ +#define GPIO_BRR_BR11 ((uint16_t)0x0800) /*!< Port x Reset bit 11 */ +#define GPIO_BRR_BR12 ((uint16_t)0x1000) /*!< Port x Reset bit 12 */ +#define GPIO_BRR_BR13 ((uint16_t)0x2000) /*!< Port x Reset bit 13 */ +#define GPIO_BRR_BR14 ((uint16_t)0x4000) /*!< Port x Reset bit 14 */ +#define GPIO_BRR_BR15 ((uint16_t)0x8000) /*!< Port x Reset bit 15 */ + +/****************** Bit definition for GPIO_LCKR register *******************/ +#define GPIO_LCKR_LCK0 ((uint32_t)0x00000001) /*!< Port x Lock bit 0 */ +#define GPIO_LCKR_LCK1 ((uint32_t)0x00000002) /*!< Port x Lock bit 1 */ +#define GPIO_LCKR_LCK2 ((uint32_t)0x00000004) /*!< Port x Lock bit 2 */ +#define GPIO_LCKR_LCK3 ((uint32_t)0x00000008) /*!< Port x Lock bit 3 */ +#define GPIO_LCKR_LCK4 ((uint32_t)0x00000010) /*!< Port x Lock bit 4 */ +#define GPIO_LCKR_LCK5 ((uint32_t)0x00000020) /*!< Port x Lock bit 5 */ +#define GPIO_LCKR_LCK6 ((uint32_t)0x00000040) /*!< Port x Lock bit 6 */ +#define GPIO_LCKR_LCK7 ((uint32_t)0x00000080) /*!< Port x Lock bit 7 */ +#define GPIO_LCKR_LCK8 ((uint32_t)0x00000100) /*!< Port x Lock bit 8 */ +#define GPIO_LCKR_LCK9 ((uint32_t)0x00000200) /*!< Port x Lock bit 9 */ +#define GPIO_LCKR_LCK10 ((uint32_t)0x00000400) /*!< Port x Lock bit 10 */ +#define GPIO_LCKR_LCK11 ((uint32_t)0x00000800) /*!< Port x Lock bit 11 */ +#define GPIO_LCKR_LCK12 ((uint32_t)0x00001000) /*!< Port x Lock bit 12 */ +#define GPIO_LCKR_LCK13 ((uint32_t)0x00002000) /*!< Port x Lock bit 13 */ +#define GPIO_LCKR_LCK14 ((uint32_t)0x00004000) /*!< Port x Lock bit 14 */ +#define GPIO_LCKR_LCK15 ((uint32_t)0x00008000) /*!< Port x Lock bit 15 */ +#define GPIO_LCKR_LCKK ((uint32_t)0x00010000) /*!< Lock key */ + +/*----------------------------------------------------------------------------*/ + +/****************** Bit definition for AFIO_EVCR register *******************/ +#define AFIO_EVCR_PIN ((uint8_t)0x0F) /*!< PIN[3:0] bits (Pin selection) */ +#define AFIO_EVCR_PIN_0 ((uint8_t)0x01) /*!< Bit 0 */ +#define AFIO_EVCR_PIN_1 ((uint8_t)0x02) /*!< Bit 1 */ +#define AFIO_EVCR_PIN_2 ((uint8_t)0x04) /*!< Bit 2 */ +#define AFIO_EVCR_PIN_3 ((uint8_t)0x08) /*!< Bit 3 */ + +/*!< PIN configuration */ +#define AFIO_EVCR_PIN_PX0 ((uint8_t)0x00) /*!< Pin 0 selected */ +#define AFIO_EVCR_PIN_PX1 ((uint8_t)0x01) /*!< Pin 1 selected */ +#define AFIO_EVCR_PIN_PX2 ((uint8_t)0x02) /*!< Pin 2 selected */ +#define AFIO_EVCR_PIN_PX3 ((uint8_t)0x03) /*!< Pin 3 selected */ +#define AFIO_EVCR_PIN_PX4 ((uint8_t)0x04) /*!< Pin 4 selected */ +#define AFIO_EVCR_PIN_PX5 ((uint8_t)0x05) /*!< Pin 5 selected */ +#define AFIO_EVCR_PIN_PX6 ((uint8_t)0x06) /*!< Pin 6 selected */ +#define AFIO_EVCR_PIN_PX7 ((uint8_t)0x07) /*!< Pin 7 selected */ +#define AFIO_EVCR_PIN_PX8 ((uint8_t)0x08) /*!< Pin 8 selected */ +#define AFIO_EVCR_PIN_PX9 ((uint8_t)0x09) /*!< Pin 9 selected */ +#define AFIO_EVCR_PIN_PX10 ((uint8_t)0x0A) /*!< Pin 10 selected */ +#define AFIO_EVCR_PIN_PX11 ((uint8_t)0x0B) /*!< Pin 11 selected */ +#define AFIO_EVCR_PIN_PX12 ((uint8_t)0x0C) /*!< Pin 12 selected */ +#define AFIO_EVCR_PIN_PX13 ((uint8_t)0x0D) /*!< Pin 13 selected */ +#define AFIO_EVCR_PIN_PX14 ((uint8_t)0x0E) /*!< Pin 14 selected */ +#define AFIO_EVCR_PIN_PX15 ((uint8_t)0x0F) /*!< Pin 15 selected */ + +#define AFIO_EVCR_PORT ((uint8_t)0x70) /*!< PORT[2:0] bits (Port selection) */ +#define AFIO_EVCR_PORT_0 ((uint8_t)0x10) /*!< Bit 0 */ +#define AFIO_EVCR_PORT_1 ((uint8_t)0x20) /*!< Bit 1 */ +#define AFIO_EVCR_PORT_2 ((uint8_t)0x40) /*!< Bit 2 */ + +/*!< PORT configuration */ +#define AFIO_EVCR_PORT_PA ((uint8_t)0x00) /*!< Port A selected */ +#define AFIO_EVCR_PORT_PB ((uint8_t)0x10) /*!< Port B selected */ +#define AFIO_EVCR_PORT_PC ((uint8_t)0x20) /*!< Port C selected */ +#define AFIO_EVCR_PORT_PD ((uint8_t)0x30) /*!< Port D selected */ +#define AFIO_EVCR_PORT_PE ((uint8_t)0x40) /*!< Port E selected */ + +#define AFIO_EVCR_EVOE ((uint8_t)0x80) /*!< Event Output Enable */ + +/****************** Bit definition for AFIO_MAPR register *******************/ +#define AFIO_MAPR_SPI1_REMAP ((uint32_t)0x00000001) /*!< SPI1 remapping */ +#define AFIO_MAPR_I2C1_REMAP ((uint32_t)0x00000002) /*!< I2C1 remapping */ +#define AFIO_MAPR_USART1_REMAP ((uint32_t)0x00000004) /*!< USART1 remapping */ +#define AFIO_MAPR_USART2_REMAP ((uint32_t)0x00000008) /*!< USART2 remapping */ + +#define AFIO_MAPR_USART3_REMAP ((uint32_t)0x00000030) /*!< USART3_REMAP[1:0] bits (USART3 remapping) */ +#define AFIO_MAPR_USART3_REMAP_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define AFIO_MAPR_USART3_REMAP_1 ((uint32_t)0x00000020) /*!< Bit 1 */ + +/* USART3_REMAP configuration */ +#define AFIO_MAPR_USART3_REMAP_NOREMAP ((uint32_t)0x00000000) /*!< No remap (TX/PB10, RX/PB11, CK/PB12, CTS/PB13, RTS/PB14) */ +#define AFIO_MAPR_USART3_REMAP_PARTIALREMAP ((uint32_t)0x00000010) /*!< Partial remap (TX/PC10, RX/PC11, CK/PC12, CTS/PB13, RTS/PB14) */ +#define AFIO_MAPR_USART3_REMAP_FULLREMAP ((uint32_t)0x00000030) /*!< Full remap (TX/PD8, RX/PD9, CK/PD10, CTS/PD11, RTS/PD12) */ + +#define AFIO_MAPR_TIM1_REMAP ((uint32_t)0x000000C0) /*!< TIM1_REMAP[1:0] bits (TIM1 remapping) */ +#define AFIO_MAPR_TIM1_REMAP_0 ((uint32_t)0x00000040) /*!< Bit 0 */ +#define AFIO_MAPR_TIM1_REMAP_1 ((uint32_t)0x00000080) /*!< Bit 1 */ + +/*!< TIM1_REMAP configuration */ +#define AFIO_MAPR_TIM1_REMAP_NOREMAP ((uint32_t)0x00000000) /*!< No remap (ETR/PA12, CH1/PA8, CH2/PA9, CH3/PA10, CH4/PA11, BKIN/PB12, CH1N/PB13, CH2N/PB14, CH3N/PB15) */ +#define AFIO_MAPR_TIM1_REMAP_PARTIALREMAP ((uint32_t)0x00000040) /*!< Partial remap (ETR/PA12, CH1/PA8, CH2/PA9, CH3/PA10, CH4/PA11, BKIN/PA6, CH1N/PA7, CH2N/PB0, CH3N/PB1) */ +#define AFIO_MAPR_TIM1_REMAP_FULLREMAP ((uint32_t)0x000000C0) /*!< Full remap (ETR/PE7, CH1/PE9, CH2/PE11, CH3/PE13, CH4/PE14, BKIN/PE15, CH1N/PE8, CH2N/PE10, CH3N/PE12) */ + +#define AFIO_MAPR_TIM2_REMAP ((uint32_t)0x00000300) /*!< TIM2_REMAP[1:0] bits (TIM2 remapping) */ +#define AFIO_MAPR_TIM2_REMAP_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define AFIO_MAPR_TIM2_REMAP_1 ((uint32_t)0x00000200) /*!< Bit 1 */ + +/*!< TIM2_REMAP configuration */ +#define AFIO_MAPR_TIM2_REMAP_NOREMAP ((uint32_t)0x00000000) /*!< No remap (CH1/ETR/PA0, CH2/PA1, CH3/PA2, CH4/PA3) */ +#define AFIO_MAPR_TIM2_REMAP_PARTIALREMAP1 ((uint32_t)0x00000100) /*!< Partial remap (CH1/ETR/PA15, CH2/PB3, CH3/PA2, CH4/PA3) */ +#define AFIO_MAPR_TIM2_REMAP_PARTIALREMAP2 ((uint32_t)0x00000200) /*!< Partial remap (CH1/ETR/PA0, CH2/PA1, CH3/PB10, CH4/PB11) */ +#define AFIO_MAPR_TIM2_REMAP_FULLREMAP ((uint32_t)0x00000300) /*!< Full remap (CH1/ETR/PA15, CH2/PB3, CH3/PB10, CH4/PB11) */ + +#define AFIO_MAPR_TIM3_REMAP ((uint32_t)0x00000C00) /*!< TIM3_REMAP[1:0] bits (TIM3 remapping) */ +#define AFIO_MAPR_TIM3_REMAP_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define AFIO_MAPR_TIM3_REMAP_1 ((uint32_t)0x00000800) /*!< Bit 1 */ + +/*!< TIM3_REMAP configuration */ +#define AFIO_MAPR_TIM3_REMAP_NOREMAP ((uint32_t)0x00000000) /*!< No remap (CH1/PA6, CH2/PA7, CH3/PB0, CH4/PB1) */ +#define AFIO_MAPR_TIM3_REMAP_PARTIALREMAP ((uint32_t)0x00000800) /*!< Partial remap (CH1/PB4, CH2/PB5, CH3/PB0, CH4/PB1) */ +#define AFIO_MAPR_TIM3_REMAP_FULLREMAP ((uint32_t)0x00000C00) /*!< Full remap (CH1/PC6, CH2/PC7, CH3/PC8, CH4/PC9) */ + +#define AFIO_MAPR_TIM4_REMAP ((uint32_t)0x00001000) /*!< TIM4_REMAP bit (TIM4 remapping) */ + +#define AFIO_MAPR_CAN_REMAP ((uint32_t)0x00006000) /*!< CAN_REMAP[1:0] bits (CAN Alternate function remapping) */ +#define AFIO_MAPR_CAN_REMAP_0 ((uint32_t)0x00002000) /*!< Bit 0 */ +#define AFIO_MAPR_CAN_REMAP_1 ((uint32_t)0x00004000) /*!< Bit 1 */ + +/*!< CAN_REMAP configuration */ +#define AFIO_MAPR_CAN_REMAP_REMAP1 ((uint32_t)0x00000000) /*!< CANRX mapped to PA11, CANTX mapped to PA12 */ +#define AFIO_MAPR_CAN_REMAP_REMAP2 ((uint32_t)0x00004000) /*!< CANRX mapped to PB8, CANTX mapped to PB9 */ +#define AFIO_MAPR_CAN_REMAP_REMAP3 ((uint32_t)0x00006000) /*!< CANRX mapped to PD0, CANTX mapped to PD1 */ + +#define AFIO_MAPR_PD01_REMAP ((uint32_t)0x00008000) /*!< Port D0/Port D1 mapping on OSC_IN/OSC_OUT */ +#define AFIO_MAPR_TIM5CH4_IREMAP ((uint32_t)0x00010000) /*!< TIM5 Channel4 Internal Remap */ +#define AFIO_MAPR_ADC1_ETRGINJ_REMAP ((uint32_t)0x00020000) /*!< ADC 1 External Trigger Injected Conversion remapping */ +#define AFIO_MAPR_ADC1_ETRGREG_REMAP ((uint32_t)0x00040000) /*!< ADC 1 External Trigger Regular Conversion remapping */ +#define AFIO_MAPR_ADC2_ETRGINJ_REMAP ((uint32_t)0x00080000) /*!< ADC 2 External Trigger Injected Conversion remapping */ +#define AFIO_MAPR_ADC2_ETRGREG_REMAP ((uint32_t)0x00100000) /*!< ADC 2 External Trigger Regular Conversion remapping */ + +/*!< SWJ_CFG configuration */ +#define AFIO_MAPR_SWJ_CFG ((uint32_t)0x07000000) /*!< SWJ_CFG[2:0] bits (Serial Wire JTAG configuration) */ +#define AFIO_MAPR_SWJ_CFG_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define AFIO_MAPR_SWJ_CFG_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define AFIO_MAPR_SWJ_CFG_2 ((uint32_t)0x04000000) /*!< Bit 2 */ + +#define AFIO_MAPR_SWJ_CFG_RESET ((uint32_t)0x00000000) /*!< Full SWJ (JTAG-DP + SW-DP) : Reset State */ +#define AFIO_MAPR_SWJ_CFG_NOJNTRST ((uint32_t)0x01000000) /*!< Full SWJ (JTAG-DP + SW-DP) but without JNTRST */ +#define AFIO_MAPR_SWJ_CFG_JTAGDISABLE ((uint32_t)0x02000000) /*!< JTAG-DP Disabled and SW-DP Enabled */ +#define AFIO_MAPR_SWJ_CFG_DISABLE ((uint32_t)0x04000000) /*!< JTAG-DP Disabled and SW-DP Disabled */ + +#ifdef STM32F10X_CL +/*!< ETH_REMAP configuration */ + #define AFIO_MAPR_ETH_REMAP ((uint32_t)0x00200000) /*!< SPI3_REMAP bit (Ethernet MAC I/O remapping) */ + +/*!< CAN2_REMAP configuration */ + #define AFIO_MAPR_CAN2_REMAP ((uint32_t)0x00400000) /*!< CAN2_REMAP bit (CAN2 I/O remapping) */ + +/*!< MII_RMII_SEL configuration */ + #define AFIO_MAPR_MII_RMII_SEL ((uint32_t)0x00800000) /*!< MII_RMII_SEL bit (Ethernet MII or RMII selection) */ + +/*!< SPI3_REMAP configuration */ + #define AFIO_MAPR_SPI3_REMAP ((uint32_t)0x10000000) /*!< SPI3_REMAP bit (SPI3 remapping) */ + +/*!< TIM2ITR1_IREMAP configuration */ + #define AFIO_MAPR_TIM2ITR1_IREMAP ((uint32_t)0x20000000) /*!< TIM2ITR1_IREMAP bit (TIM2 internal trigger 1 remapping) */ + +/*!< PTP_PPS_REMAP configuration */ + #define AFIO_MAPR_PTP_PPS_REMAP ((uint32_t)0x40000000) /*!< PTP_PPS_REMAP bit (Ethernet PTP PPS remapping) */ +#endif + +/***************** Bit definition for AFIO_EXTICR1 register *****************/ +#define AFIO_EXTICR1_EXTI0 ((uint16_t)0x000F) /*!< EXTI 0 configuration */ +#define AFIO_EXTICR1_EXTI1 ((uint16_t)0x00F0) /*!< EXTI 1 configuration */ +#define AFIO_EXTICR1_EXTI2 ((uint16_t)0x0F00) /*!< EXTI 2 configuration */ +#define AFIO_EXTICR1_EXTI3 ((uint16_t)0xF000) /*!< EXTI 3 configuration */ + +/*!< EXTI0 configuration */ +#define AFIO_EXTICR1_EXTI0_PA ((uint16_t)0x0000) /*!< PA[0] pin */ +#define AFIO_EXTICR1_EXTI0_PB ((uint16_t)0x0001) /*!< PB[0] pin */ +#define AFIO_EXTICR1_EXTI0_PC ((uint16_t)0x0002) /*!< PC[0] pin */ +#define AFIO_EXTICR1_EXTI0_PD ((uint16_t)0x0003) /*!< PD[0] pin */ +#define AFIO_EXTICR1_EXTI0_PE ((uint16_t)0x0004) /*!< PE[0] pin */ +#define AFIO_EXTICR1_EXTI0_PF ((uint16_t)0x0005) /*!< PF[0] pin */ +#define AFIO_EXTICR1_EXTI0_PG ((uint16_t)0x0006) /*!< PG[0] pin */ + +/*!< EXTI1 configuration */ +#define AFIO_EXTICR1_EXTI1_PA ((uint16_t)0x0000) /*!< PA[1] pin */ +#define AFIO_EXTICR1_EXTI1_PB ((uint16_t)0x0010) /*!< PB[1] pin */ +#define AFIO_EXTICR1_EXTI1_PC ((uint16_t)0x0020) /*!< PC[1] pin */ +#define AFIO_EXTICR1_EXTI1_PD ((uint16_t)0x0030) /*!< PD[1] pin */ +#define AFIO_EXTICR1_EXTI1_PE ((uint16_t)0x0040) /*!< PE[1] pin */ +#define AFIO_EXTICR1_EXTI1_PF ((uint16_t)0x0050) /*!< PF[1] pin */ +#define AFIO_EXTICR1_EXTI1_PG ((uint16_t)0x0060) /*!< PG[1] pin */ + +/*!< EXTI2 configuration */ +#define AFIO_EXTICR1_EXTI2_PA ((uint16_t)0x0000) /*!< PA[2] pin */ +#define AFIO_EXTICR1_EXTI2_PB ((uint16_t)0x0100) /*!< PB[2] pin */ +#define AFIO_EXTICR1_EXTI2_PC ((uint16_t)0x0200) /*!< PC[2] pin */ +#define AFIO_EXTICR1_EXTI2_PD ((uint16_t)0x0300) /*!< PD[2] pin */ +#define AFIO_EXTICR1_EXTI2_PE ((uint16_t)0x0400) /*!< PE[2] pin */ +#define AFIO_EXTICR1_EXTI2_PF ((uint16_t)0x0500) /*!< PF[2] pin */ +#define AFIO_EXTICR1_EXTI2_PG ((uint16_t)0x0600) /*!< PG[2] pin */ + +/*!< EXTI3 configuration */ +#define AFIO_EXTICR1_EXTI3_PA ((uint16_t)0x0000) /*!< PA[3] pin */ +#define AFIO_EXTICR1_EXTI3_PB ((uint16_t)0x1000) /*!< PB[3] pin */ +#define AFIO_EXTICR1_EXTI3_PC ((uint16_t)0x2000) /*!< PC[3] pin */ +#define AFIO_EXTICR1_EXTI3_PD ((uint16_t)0x3000) /*!< PD[3] pin */ +#define AFIO_EXTICR1_EXTI3_PE ((uint16_t)0x4000) /*!< PE[3] pin */ +#define AFIO_EXTICR1_EXTI3_PF ((uint16_t)0x5000) /*!< PF[3] pin */ +#define AFIO_EXTICR1_EXTI3_PG ((uint16_t)0x6000) /*!< PG[3] pin */ + +/***************** Bit definition for AFIO_EXTICR2 register *****************/ +#define AFIO_EXTICR2_EXTI4 ((uint16_t)0x000F) /*!< EXTI 4 configuration */ +#define AFIO_EXTICR2_EXTI5 ((uint16_t)0x00F0) /*!< EXTI 5 configuration */ +#define AFIO_EXTICR2_EXTI6 ((uint16_t)0x0F00) /*!< EXTI 6 configuration */ +#define AFIO_EXTICR2_EXTI7 ((uint16_t)0xF000) /*!< EXTI 7 configuration */ + +/*!< EXTI4 configuration */ +#define AFIO_EXTICR2_EXTI4_PA ((uint16_t)0x0000) /*!< PA[4] pin */ +#define AFIO_EXTICR2_EXTI4_PB ((uint16_t)0x0001) /*!< PB[4] pin */ +#define AFIO_EXTICR2_EXTI4_PC ((uint16_t)0x0002) /*!< PC[4] pin */ +#define AFIO_EXTICR2_EXTI4_PD ((uint16_t)0x0003) /*!< PD[4] pin */ +#define AFIO_EXTICR2_EXTI4_PE ((uint16_t)0x0004) /*!< PE[4] pin */ +#define AFIO_EXTICR2_EXTI4_PF ((uint16_t)0x0005) /*!< PF[4] pin */ +#define AFIO_EXTICR2_EXTI4_PG ((uint16_t)0x0006) /*!< PG[4] pin */ + +/* EXTI5 configuration */ +#define AFIO_EXTICR2_EXTI5_PA ((uint16_t)0x0000) /*!< PA[5] pin */ +#define AFIO_EXTICR2_EXTI5_PB ((uint16_t)0x0010) /*!< PB[5] pin */ +#define AFIO_EXTICR2_EXTI5_PC ((uint16_t)0x0020) /*!< PC[5] pin */ +#define AFIO_EXTICR2_EXTI5_PD ((uint16_t)0x0030) /*!< PD[5] pin */ +#define AFIO_EXTICR2_EXTI5_PE ((uint16_t)0x0040) /*!< PE[5] pin */ +#define AFIO_EXTICR2_EXTI5_PF ((uint16_t)0x0050) /*!< PF[5] pin */ +#define AFIO_EXTICR2_EXTI5_PG ((uint16_t)0x0060) /*!< PG[5] pin */ + +/*!< EXTI6 configuration */ +#define AFIO_EXTICR2_EXTI6_PA ((uint16_t)0x0000) /*!< PA[6] pin */ +#define AFIO_EXTICR2_EXTI6_PB ((uint16_t)0x0100) /*!< PB[6] pin */ +#define AFIO_EXTICR2_EXTI6_PC ((uint16_t)0x0200) /*!< PC[6] pin */ +#define AFIO_EXTICR2_EXTI6_PD ((uint16_t)0x0300) /*!< PD[6] pin */ +#define AFIO_EXTICR2_EXTI6_PE ((uint16_t)0x0400) /*!< PE[6] pin */ +#define AFIO_EXTICR2_EXTI6_PF ((uint16_t)0x0500) /*!< PF[6] pin */ +#define AFIO_EXTICR2_EXTI6_PG ((uint16_t)0x0600) /*!< PG[6] pin */ + +/*!< EXTI7 configuration */ +#define AFIO_EXTICR2_EXTI7_PA ((uint16_t)0x0000) /*!< PA[7] pin */ +#define AFIO_EXTICR2_EXTI7_PB ((uint16_t)0x1000) /*!< PB[7] pin */ +#define AFIO_EXTICR2_EXTI7_PC ((uint16_t)0x2000) /*!< PC[7] pin */ +#define AFIO_EXTICR2_EXTI7_PD ((uint16_t)0x3000) /*!< PD[7] pin */ +#define AFIO_EXTICR2_EXTI7_PE ((uint16_t)0x4000) /*!< PE[7] pin */ +#define AFIO_EXTICR2_EXTI7_PF ((uint16_t)0x5000) /*!< PF[7] pin */ +#define AFIO_EXTICR2_EXTI7_PG ((uint16_t)0x6000) /*!< PG[7] pin */ + +/***************** Bit definition for AFIO_EXTICR3 register *****************/ +#define AFIO_EXTICR3_EXTI8 ((uint16_t)0x000F) /*!< EXTI 8 configuration */ +#define AFIO_EXTICR3_EXTI9 ((uint16_t)0x00F0) /*!< EXTI 9 configuration */ +#define AFIO_EXTICR3_EXTI10 ((uint16_t)0x0F00) /*!< EXTI 10 configuration */ +#define AFIO_EXTICR3_EXTI11 ((uint16_t)0xF000) /*!< EXTI 11 configuration */ + +/*!< EXTI8 configuration */ +#define AFIO_EXTICR3_EXTI8_PA ((uint16_t)0x0000) /*!< PA[8] pin */ +#define AFIO_EXTICR3_EXTI8_PB ((uint16_t)0x0001) /*!< PB[8] pin */ +#define AFIO_EXTICR3_EXTI8_PC ((uint16_t)0x0002) /*!< PC[8] pin */ +#define AFIO_EXTICR3_EXTI8_PD ((uint16_t)0x0003) /*!< PD[8] pin */ +#define AFIO_EXTICR3_EXTI8_PE ((uint16_t)0x0004) /*!< PE[8] pin */ +#define AFIO_EXTICR3_EXTI8_PF ((uint16_t)0x0005) /*!< PF[8] pin */ +#define AFIO_EXTICR3_EXTI8_PG ((uint16_t)0x0006) /*!< PG[8] pin */ + +/*!< EXTI9 configuration */ +#define AFIO_EXTICR3_EXTI9_PA ((uint16_t)0x0000) /*!< PA[9] pin */ +#define AFIO_EXTICR3_EXTI9_PB ((uint16_t)0x0010) /*!< PB[9] pin */ +#define AFIO_EXTICR3_EXTI9_PC ((uint16_t)0x0020) /*!< PC[9] pin */ +#define AFIO_EXTICR3_EXTI9_PD ((uint16_t)0x0030) /*!< PD[9] pin */ +#define AFIO_EXTICR3_EXTI9_PE ((uint16_t)0x0040) /*!< PE[9] pin */ +#define AFIO_EXTICR3_EXTI9_PF ((uint16_t)0x0050) /*!< PF[9] pin */ +#define AFIO_EXTICR3_EXTI9_PG ((uint16_t)0x0060) /*!< PG[9] pin */ + +/*!< EXTI10 configuration */ +#define AFIO_EXTICR3_EXTI10_PA ((uint16_t)0x0000) /*!< PA[10] pin */ +#define AFIO_EXTICR3_EXTI10_PB ((uint16_t)0x0100) /*!< PB[10] pin */ +#define AFIO_EXTICR3_EXTI10_PC ((uint16_t)0x0200) /*!< PC[10] pin */ +#define AFIO_EXTICR3_EXTI10_PD ((uint16_t)0x0300) /*!< PD[10] pin */ +#define AFIO_EXTICR3_EXTI10_PE ((uint16_t)0x0400) /*!< PE[10] pin */ +#define AFIO_EXTICR3_EXTI10_PF ((uint16_t)0x0500) /*!< PF[10] pin */ +#define AFIO_EXTICR3_EXTI10_PG ((uint16_t)0x0600) /*!< PG[10] pin */ + +/*!< EXTI11 configuration */ +#define AFIO_EXTICR3_EXTI11_PA ((uint16_t)0x0000) /*!< PA[11] pin */ +#define AFIO_EXTICR3_EXTI11_PB ((uint16_t)0x1000) /*!< PB[11] pin */ +#define AFIO_EXTICR3_EXTI11_PC ((uint16_t)0x2000) /*!< PC[11] pin */ +#define AFIO_EXTICR3_EXTI11_PD ((uint16_t)0x3000) /*!< PD[11] pin */ +#define AFIO_EXTICR3_EXTI11_PE ((uint16_t)0x4000) /*!< PE[11] pin */ +#define AFIO_EXTICR3_EXTI11_PF ((uint16_t)0x5000) /*!< PF[11] pin */ +#define AFIO_EXTICR3_EXTI11_PG ((uint16_t)0x6000) /*!< PG[11] pin */ + +/***************** Bit definition for AFIO_EXTICR4 register *****************/ +#define AFIO_EXTICR4_EXTI12 ((uint16_t)0x000F) /*!< EXTI 12 configuration */ +#define AFIO_EXTICR4_EXTI13 ((uint16_t)0x00F0) /*!< EXTI 13 configuration */ +#define AFIO_EXTICR4_EXTI14 ((uint16_t)0x0F00) /*!< EXTI 14 configuration */ +#define AFIO_EXTICR4_EXTI15 ((uint16_t)0xF000) /*!< EXTI 15 configuration */ + +/* EXTI12 configuration */ +#define AFIO_EXTICR4_EXTI12_PA ((uint16_t)0x0000) /*!< PA[12] pin */ +#define AFIO_EXTICR4_EXTI12_PB ((uint16_t)0x0001) /*!< PB[12] pin */ +#define AFIO_EXTICR4_EXTI12_PC ((uint16_t)0x0002) /*!< PC[12] pin */ +#define AFIO_EXTICR4_EXTI12_PD ((uint16_t)0x0003) /*!< PD[12] pin */ +#define AFIO_EXTICR4_EXTI12_PE ((uint16_t)0x0004) /*!< PE[12] pin */ +#define AFIO_EXTICR4_EXTI12_PF ((uint16_t)0x0005) /*!< PF[12] pin */ +#define AFIO_EXTICR4_EXTI12_PG ((uint16_t)0x0006) /*!< PG[12] pin */ + +/* EXTI13 configuration */ +#define AFIO_EXTICR4_EXTI13_PA ((uint16_t)0x0000) /*!< PA[13] pin */ +#define AFIO_EXTICR4_EXTI13_PB ((uint16_t)0x0010) /*!< PB[13] pin */ +#define AFIO_EXTICR4_EXTI13_PC ((uint16_t)0x0020) /*!< PC[13] pin */ +#define AFIO_EXTICR4_EXTI13_PD ((uint16_t)0x0030) /*!< PD[13] pin */ +#define AFIO_EXTICR4_EXTI13_PE ((uint16_t)0x0040) /*!< PE[13] pin */ +#define AFIO_EXTICR4_EXTI13_PF ((uint16_t)0x0050) /*!< PF[13] pin */ +#define AFIO_EXTICR4_EXTI13_PG ((uint16_t)0x0060) /*!< PG[13] pin */ + +/*!< EXTI14 configuration */ +#define AFIO_EXTICR4_EXTI14_PA ((uint16_t)0x0000) /*!< PA[14] pin */ +#define AFIO_EXTICR4_EXTI14_PB ((uint16_t)0x0100) /*!< PB[14] pin */ +#define AFIO_EXTICR4_EXTI14_PC ((uint16_t)0x0200) /*!< PC[14] pin */ +#define AFIO_EXTICR4_EXTI14_PD ((uint16_t)0x0300) /*!< PD[14] pin */ +#define AFIO_EXTICR4_EXTI14_PE ((uint16_t)0x0400) /*!< PE[14] pin */ +#define AFIO_EXTICR4_EXTI14_PF ((uint16_t)0x0500) /*!< PF[14] pin */ +#define AFIO_EXTICR4_EXTI14_PG ((uint16_t)0x0600) /*!< PG[14] pin */ + +/*!< EXTI15 configuration */ +#define AFIO_EXTICR4_EXTI15_PA ((uint16_t)0x0000) /*!< PA[15] pin */ +#define AFIO_EXTICR4_EXTI15_PB ((uint16_t)0x1000) /*!< PB[15] pin */ +#define AFIO_EXTICR4_EXTI15_PC ((uint16_t)0x2000) /*!< PC[15] pin */ +#define AFIO_EXTICR4_EXTI15_PD ((uint16_t)0x3000) /*!< PD[15] pin */ +#define AFIO_EXTICR4_EXTI15_PE ((uint16_t)0x4000) /*!< PE[15] pin */ +#define AFIO_EXTICR4_EXTI15_PF ((uint16_t)0x5000) /*!< PF[15] pin */ +#define AFIO_EXTICR4_EXTI15_PG ((uint16_t)0x6000) /*!< PG[15] pin */ + +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) +/****************** Bit definition for AFIO_MAPR2 register ******************/ +#define AFIO_MAPR2_TIM15_REMAP ((uint32_t)0x00000001) /*!< TIM15 remapping */ +#define AFIO_MAPR2_TIM16_REMAP ((uint32_t)0x00000002) /*!< TIM16 remapping */ +#define AFIO_MAPR2_TIM17_REMAP ((uint32_t)0x00000004) /*!< TIM17 remapping */ +#define AFIO_MAPR2_CEC_REMAP ((uint32_t)0x00000008) /*!< CEC remapping */ +#define AFIO_MAPR2_TIM1_DMA_REMAP ((uint32_t)0x00000010) /*!< TIM1_DMA remapping */ +#endif + +#ifdef STM32F10X_HD_VL +#define AFIO_MAPR2_TIM13_REMAP ((uint32_t)0x00000100) /*!< TIM13 remapping */ +#define AFIO_MAPR2_TIM14_REMAP ((uint32_t)0x00000200) /*!< TIM14 remapping */ +#define AFIO_MAPR2_FSMC_NADV_REMAP ((uint32_t)0x00000400) /*!< FSMC NADV remapping */ +#define AFIO_MAPR2_TIM67_DAC_DMA_REMAP ((uint32_t)0x00000800) /*!< TIM6/TIM7 and DAC DMA remapping */ +#define AFIO_MAPR2_TIM12_REMAP ((uint32_t)0x00001000) /*!< TIM12 remapping */ +#define AFIO_MAPR2_MISC_REMAP ((uint32_t)0x00002000) /*!< Miscellaneous remapping */ +#endif + +#ifdef STM32F10X_XL +/****************** Bit definition for AFIO_MAPR2 register ******************/ +#define AFIO_MAPR2_TIM9_REMAP ((uint32_t)0x00000020) /*!< TIM9 remapping */ +#define AFIO_MAPR2_TIM10_REMAP ((uint32_t)0x00000040) /*!< TIM10 remapping */ +#define AFIO_MAPR2_TIM11_REMAP ((uint32_t)0x00000080) /*!< TIM11 remapping */ +#define AFIO_MAPR2_TIM13_REMAP ((uint32_t)0x00000100) /*!< TIM13 remapping */ +#define AFIO_MAPR2_TIM14_REMAP ((uint32_t)0x00000200) /*!< TIM14 remapping */ +#define AFIO_MAPR2_FSMC_NADV_REMAP ((uint32_t)0x00000400) /*!< FSMC NADV remapping */ +#endif + +/******************************************************************************/ +/* */ +/* SystemTick */ +/* */ +/******************************************************************************/ + +/***************** Bit definition for SysTick_CTRL register *****************/ +#define SysTick_CTRL_ENABLE ((uint32_t)0x00000001) /*!< Counter enable */ +#define SysTick_CTRL_TICKINT ((uint32_t)0x00000002) /*!< Counting down to 0 pends the SysTick handler */ +#define SysTick_CTRL_CLKSOURCE ((uint32_t)0x00000004) /*!< Clock source */ +#define SysTick_CTRL_COUNTFLAG ((uint32_t)0x00010000) /*!< Count Flag */ + +/***************** Bit definition for SysTick_LOAD register *****************/ +#define SysTick_LOAD_RELOAD ((uint32_t)0x00FFFFFF) /*!< Value to load into the SysTick Current Value Register when the counter reaches 0 */ + +/***************** Bit definition for SysTick_VAL register ******************/ +#define SysTick_VAL_CURRENT ((uint32_t)0x00FFFFFF) /*!< Current value at the time the register is accessed */ + +/***************** Bit definition for SysTick_CALIB register ****************/ +#define SysTick_CALIB_TENMS ((uint32_t)0x00FFFFFF) /*!< Reload value to use for 10ms timing */ +#define SysTick_CALIB_SKEW ((uint32_t)0x40000000) /*!< Calibration value is not exactly 10 ms */ +#define SysTick_CALIB_NOREF ((uint32_t)0x80000000) /*!< The reference clock is not provided */ + +/******************************************************************************/ +/* */ +/* Nested Vectored Interrupt Controller */ +/* */ +/******************************************************************************/ + +/****************** Bit definition for NVIC_ISER register *******************/ +#define NVIC_ISER_SETENA ((uint32_t)0xFFFFFFFF) /*!< Interrupt set enable bits */ +#define NVIC_ISER_SETENA_0 ((uint32_t)0x00000001) /*!< bit 0 */ +#define NVIC_ISER_SETENA_1 ((uint32_t)0x00000002) /*!< bit 1 */ +#define NVIC_ISER_SETENA_2 ((uint32_t)0x00000004) /*!< bit 2 */ +#define NVIC_ISER_SETENA_3 ((uint32_t)0x00000008) /*!< bit 3 */ +#define NVIC_ISER_SETENA_4 ((uint32_t)0x00000010) /*!< bit 4 */ +#define NVIC_ISER_SETENA_5 ((uint32_t)0x00000020) /*!< bit 5 */ +#define NVIC_ISER_SETENA_6 ((uint32_t)0x00000040) /*!< bit 6 */ +#define NVIC_ISER_SETENA_7 ((uint32_t)0x00000080) /*!< bit 7 */ +#define NVIC_ISER_SETENA_8 ((uint32_t)0x00000100) /*!< bit 8 */ +#define NVIC_ISER_SETENA_9 ((uint32_t)0x00000200) /*!< bit 9 */ +#define NVIC_ISER_SETENA_10 ((uint32_t)0x00000400) /*!< bit 10 */ +#define NVIC_ISER_SETENA_11 ((uint32_t)0x00000800) /*!< bit 11 */ +#define NVIC_ISER_SETENA_12 ((uint32_t)0x00001000) /*!< bit 12 */ +#define NVIC_ISER_SETENA_13 ((uint32_t)0x00002000) /*!< bit 13 */ +#define NVIC_ISER_SETENA_14 ((uint32_t)0x00004000) /*!< bit 14 */ +#define NVIC_ISER_SETENA_15 ((uint32_t)0x00008000) /*!< bit 15 */ +#define NVIC_ISER_SETENA_16 ((uint32_t)0x00010000) /*!< bit 16 */ +#define NVIC_ISER_SETENA_17 ((uint32_t)0x00020000) /*!< bit 17 */ +#define NVIC_ISER_SETENA_18 ((uint32_t)0x00040000) /*!< bit 18 */ +#define NVIC_ISER_SETENA_19 ((uint32_t)0x00080000) /*!< bit 19 */ +#define NVIC_ISER_SETENA_20 ((uint32_t)0x00100000) /*!< bit 20 */ +#define NVIC_ISER_SETENA_21 ((uint32_t)0x00200000) /*!< bit 21 */ +#define NVIC_ISER_SETENA_22 ((uint32_t)0x00400000) /*!< bit 22 */ +#define NVIC_ISER_SETENA_23 ((uint32_t)0x00800000) /*!< bit 23 */ +#define NVIC_ISER_SETENA_24 ((uint32_t)0x01000000) /*!< bit 24 */ +#define NVIC_ISER_SETENA_25 ((uint32_t)0x02000000) /*!< bit 25 */ +#define NVIC_ISER_SETENA_26 ((uint32_t)0x04000000) /*!< bit 26 */ +#define NVIC_ISER_SETENA_27 ((uint32_t)0x08000000) /*!< bit 27 */ +#define NVIC_ISER_SETENA_28 ((uint32_t)0x10000000) /*!< bit 28 */ +#define NVIC_ISER_SETENA_29 ((uint32_t)0x20000000) /*!< bit 29 */ +#define NVIC_ISER_SETENA_30 ((uint32_t)0x40000000) /*!< bit 30 */ +#define NVIC_ISER_SETENA_31 ((uint32_t)0x80000000) /*!< bit 31 */ + +/****************** Bit definition for NVIC_ICER register *******************/ +#define NVIC_ICER_CLRENA ((uint32_t)0xFFFFFFFF) /*!< Interrupt clear-enable bits */ +#define NVIC_ICER_CLRENA_0 ((uint32_t)0x00000001) /*!< bit 0 */ +#define NVIC_ICER_CLRENA_1 ((uint32_t)0x00000002) /*!< bit 1 */ +#define NVIC_ICER_CLRENA_2 ((uint32_t)0x00000004) /*!< bit 2 */ +#define NVIC_ICER_CLRENA_3 ((uint32_t)0x00000008) /*!< bit 3 */ +#define NVIC_ICER_CLRENA_4 ((uint32_t)0x00000010) /*!< bit 4 */ +#define NVIC_ICER_CLRENA_5 ((uint32_t)0x00000020) /*!< bit 5 */ +#define NVIC_ICER_CLRENA_6 ((uint32_t)0x00000040) /*!< bit 6 */ +#define NVIC_ICER_CLRENA_7 ((uint32_t)0x00000080) /*!< bit 7 */ +#define NVIC_ICER_CLRENA_8 ((uint32_t)0x00000100) /*!< bit 8 */ +#define NVIC_ICER_CLRENA_9 ((uint32_t)0x00000200) /*!< bit 9 */ +#define NVIC_ICER_CLRENA_10 ((uint32_t)0x00000400) /*!< bit 10 */ +#define NVIC_ICER_CLRENA_11 ((uint32_t)0x00000800) /*!< bit 11 */ +#define NVIC_ICER_CLRENA_12 ((uint32_t)0x00001000) /*!< bit 12 */ +#define NVIC_ICER_CLRENA_13 ((uint32_t)0x00002000) /*!< bit 13 */ +#define NVIC_ICER_CLRENA_14 ((uint32_t)0x00004000) /*!< bit 14 */ +#define NVIC_ICER_CLRENA_15 ((uint32_t)0x00008000) /*!< bit 15 */ +#define NVIC_ICER_CLRENA_16 ((uint32_t)0x00010000) /*!< bit 16 */ +#define NVIC_ICER_CLRENA_17 ((uint32_t)0x00020000) /*!< bit 17 */ +#define NVIC_ICER_CLRENA_18 ((uint32_t)0x00040000) /*!< bit 18 */ +#define NVIC_ICER_CLRENA_19 ((uint32_t)0x00080000) /*!< bit 19 */ +#define NVIC_ICER_CLRENA_20 ((uint32_t)0x00100000) /*!< bit 20 */ +#define NVIC_ICER_CLRENA_21 ((uint32_t)0x00200000) /*!< bit 21 */ +#define NVIC_ICER_CLRENA_22 ((uint32_t)0x00400000) /*!< bit 22 */ +#define NVIC_ICER_CLRENA_23 ((uint32_t)0x00800000) /*!< bit 23 */ +#define NVIC_ICER_CLRENA_24 ((uint32_t)0x01000000) /*!< bit 24 */ +#define NVIC_ICER_CLRENA_25 ((uint32_t)0x02000000) /*!< bit 25 */ +#define NVIC_ICER_CLRENA_26 ((uint32_t)0x04000000) /*!< bit 26 */ +#define NVIC_ICER_CLRENA_27 ((uint32_t)0x08000000) /*!< bit 27 */ +#define NVIC_ICER_CLRENA_28 ((uint32_t)0x10000000) /*!< bit 28 */ +#define NVIC_ICER_CLRENA_29 ((uint32_t)0x20000000) /*!< bit 29 */ +#define NVIC_ICER_CLRENA_30 ((uint32_t)0x40000000) /*!< bit 30 */ +#define NVIC_ICER_CLRENA_31 ((uint32_t)0x80000000) /*!< bit 31 */ + +/****************** Bit definition for NVIC_ISPR register *******************/ +#define NVIC_ISPR_SETPEND ((uint32_t)0xFFFFFFFF) /*!< Interrupt set-pending bits */ +#define NVIC_ISPR_SETPEND_0 ((uint32_t)0x00000001) /*!< bit 0 */ +#define NVIC_ISPR_SETPEND_1 ((uint32_t)0x00000002) /*!< bit 1 */ +#define NVIC_ISPR_SETPEND_2 ((uint32_t)0x00000004) /*!< bit 2 */ +#define NVIC_ISPR_SETPEND_3 ((uint32_t)0x00000008) /*!< bit 3 */ +#define NVIC_ISPR_SETPEND_4 ((uint32_t)0x00000010) /*!< bit 4 */ +#define NVIC_ISPR_SETPEND_5 ((uint32_t)0x00000020) /*!< bit 5 */ +#define NVIC_ISPR_SETPEND_6 ((uint32_t)0x00000040) /*!< bit 6 */ +#define NVIC_ISPR_SETPEND_7 ((uint32_t)0x00000080) /*!< bit 7 */ +#define NVIC_ISPR_SETPEND_8 ((uint32_t)0x00000100) /*!< bit 8 */ +#define NVIC_ISPR_SETPEND_9 ((uint32_t)0x00000200) /*!< bit 9 */ +#define NVIC_ISPR_SETPEND_10 ((uint32_t)0x00000400) /*!< bit 10 */ +#define NVIC_ISPR_SETPEND_11 ((uint32_t)0x00000800) /*!< bit 11 */ +#define NVIC_ISPR_SETPEND_12 ((uint32_t)0x00001000) /*!< bit 12 */ +#define NVIC_ISPR_SETPEND_13 ((uint32_t)0x00002000) /*!< bit 13 */ +#define NVIC_ISPR_SETPEND_14 ((uint32_t)0x00004000) /*!< bit 14 */ +#define NVIC_ISPR_SETPEND_15 ((uint32_t)0x00008000) /*!< bit 15 */ +#define NVIC_ISPR_SETPEND_16 ((uint32_t)0x00010000) /*!< bit 16 */ +#define NVIC_ISPR_SETPEND_17 ((uint32_t)0x00020000) /*!< bit 17 */ +#define NVIC_ISPR_SETPEND_18 ((uint32_t)0x00040000) /*!< bit 18 */ +#define NVIC_ISPR_SETPEND_19 ((uint32_t)0x00080000) /*!< bit 19 */ +#define NVIC_ISPR_SETPEND_20 ((uint32_t)0x00100000) /*!< bit 20 */ +#define NVIC_ISPR_SETPEND_21 ((uint32_t)0x00200000) /*!< bit 21 */ +#define NVIC_ISPR_SETPEND_22 ((uint32_t)0x00400000) /*!< bit 22 */ +#define NVIC_ISPR_SETPEND_23 ((uint32_t)0x00800000) /*!< bit 23 */ +#define NVIC_ISPR_SETPEND_24 ((uint32_t)0x01000000) /*!< bit 24 */ +#define NVIC_ISPR_SETPEND_25 ((uint32_t)0x02000000) /*!< bit 25 */ +#define NVIC_ISPR_SETPEND_26 ((uint32_t)0x04000000) /*!< bit 26 */ +#define NVIC_ISPR_SETPEND_27 ((uint32_t)0x08000000) /*!< bit 27 */ +#define NVIC_ISPR_SETPEND_28 ((uint32_t)0x10000000) /*!< bit 28 */ +#define NVIC_ISPR_SETPEND_29 ((uint32_t)0x20000000) /*!< bit 29 */ +#define NVIC_ISPR_SETPEND_30 ((uint32_t)0x40000000) /*!< bit 30 */ +#define NVIC_ISPR_SETPEND_31 ((uint32_t)0x80000000) /*!< bit 31 */ + +/****************** Bit definition for NVIC_ICPR register *******************/ +#define NVIC_ICPR_CLRPEND ((uint32_t)0xFFFFFFFF) /*!< Interrupt clear-pending bits */ +#define NVIC_ICPR_CLRPEND_0 ((uint32_t)0x00000001) /*!< bit 0 */ +#define NVIC_ICPR_CLRPEND_1 ((uint32_t)0x00000002) /*!< bit 1 */ +#define NVIC_ICPR_CLRPEND_2 ((uint32_t)0x00000004) /*!< bit 2 */ +#define NVIC_ICPR_CLRPEND_3 ((uint32_t)0x00000008) /*!< bit 3 */ +#define NVIC_ICPR_CLRPEND_4 ((uint32_t)0x00000010) /*!< bit 4 */ +#define NVIC_ICPR_CLRPEND_5 ((uint32_t)0x00000020) /*!< bit 5 */ +#define NVIC_ICPR_CLRPEND_6 ((uint32_t)0x00000040) /*!< bit 6 */ +#define NVIC_ICPR_CLRPEND_7 ((uint32_t)0x00000080) /*!< bit 7 */ +#define NVIC_ICPR_CLRPEND_8 ((uint32_t)0x00000100) /*!< bit 8 */ +#define NVIC_ICPR_CLRPEND_9 ((uint32_t)0x00000200) /*!< bit 9 */ +#define NVIC_ICPR_CLRPEND_10 ((uint32_t)0x00000400) /*!< bit 10 */ +#define NVIC_ICPR_CLRPEND_11 ((uint32_t)0x00000800) /*!< bit 11 */ +#define NVIC_ICPR_CLRPEND_12 ((uint32_t)0x00001000) /*!< bit 12 */ +#define NVIC_ICPR_CLRPEND_13 ((uint32_t)0x00002000) /*!< bit 13 */ +#define NVIC_ICPR_CLRPEND_14 ((uint32_t)0x00004000) /*!< bit 14 */ +#define NVIC_ICPR_CLRPEND_15 ((uint32_t)0x00008000) /*!< bit 15 */ +#define NVIC_ICPR_CLRPEND_16 ((uint32_t)0x00010000) /*!< bit 16 */ +#define NVIC_ICPR_CLRPEND_17 ((uint32_t)0x00020000) /*!< bit 17 */ +#define NVIC_ICPR_CLRPEND_18 ((uint32_t)0x00040000) /*!< bit 18 */ +#define NVIC_ICPR_CLRPEND_19 ((uint32_t)0x00080000) /*!< bit 19 */ +#define NVIC_ICPR_CLRPEND_20 ((uint32_t)0x00100000) /*!< bit 20 */ +#define NVIC_ICPR_CLRPEND_21 ((uint32_t)0x00200000) /*!< bit 21 */ +#define NVIC_ICPR_CLRPEND_22 ((uint32_t)0x00400000) /*!< bit 22 */ +#define NVIC_ICPR_CLRPEND_23 ((uint32_t)0x00800000) /*!< bit 23 */ +#define NVIC_ICPR_CLRPEND_24 ((uint32_t)0x01000000) /*!< bit 24 */ +#define NVIC_ICPR_CLRPEND_25 ((uint32_t)0x02000000) /*!< bit 25 */ +#define NVIC_ICPR_CLRPEND_26 ((uint32_t)0x04000000) /*!< bit 26 */ +#define NVIC_ICPR_CLRPEND_27 ((uint32_t)0x08000000) /*!< bit 27 */ +#define NVIC_ICPR_CLRPEND_28 ((uint32_t)0x10000000) /*!< bit 28 */ +#define NVIC_ICPR_CLRPEND_29 ((uint32_t)0x20000000) /*!< bit 29 */ +#define NVIC_ICPR_CLRPEND_30 ((uint32_t)0x40000000) /*!< bit 30 */ +#define NVIC_ICPR_CLRPEND_31 ((uint32_t)0x80000000) /*!< bit 31 */ + +/****************** Bit definition for NVIC_IABR register *******************/ +#define NVIC_IABR_ACTIVE ((uint32_t)0xFFFFFFFF) /*!< Interrupt active flags */ +#define NVIC_IABR_ACTIVE_0 ((uint32_t)0x00000001) /*!< bit 0 */ +#define NVIC_IABR_ACTIVE_1 ((uint32_t)0x00000002) /*!< bit 1 */ +#define NVIC_IABR_ACTIVE_2 ((uint32_t)0x00000004) /*!< bit 2 */ +#define NVIC_IABR_ACTIVE_3 ((uint32_t)0x00000008) /*!< bit 3 */ +#define NVIC_IABR_ACTIVE_4 ((uint32_t)0x00000010) /*!< bit 4 */ +#define NVIC_IABR_ACTIVE_5 ((uint32_t)0x00000020) /*!< bit 5 */ +#define NVIC_IABR_ACTIVE_6 ((uint32_t)0x00000040) /*!< bit 6 */ +#define NVIC_IABR_ACTIVE_7 ((uint32_t)0x00000080) /*!< bit 7 */ +#define NVIC_IABR_ACTIVE_8 ((uint32_t)0x00000100) /*!< bit 8 */ +#define NVIC_IABR_ACTIVE_9 ((uint32_t)0x00000200) /*!< bit 9 */ +#define NVIC_IABR_ACTIVE_10 ((uint32_t)0x00000400) /*!< bit 10 */ +#define NVIC_IABR_ACTIVE_11 ((uint32_t)0x00000800) /*!< bit 11 */ +#define NVIC_IABR_ACTIVE_12 ((uint32_t)0x00001000) /*!< bit 12 */ +#define NVIC_IABR_ACTIVE_13 ((uint32_t)0x00002000) /*!< bit 13 */ +#define NVIC_IABR_ACTIVE_14 ((uint32_t)0x00004000) /*!< bit 14 */ +#define NVIC_IABR_ACTIVE_15 ((uint32_t)0x00008000) /*!< bit 15 */ +#define NVIC_IABR_ACTIVE_16 ((uint32_t)0x00010000) /*!< bit 16 */ +#define NVIC_IABR_ACTIVE_17 ((uint32_t)0x00020000) /*!< bit 17 */ +#define NVIC_IABR_ACTIVE_18 ((uint32_t)0x00040000) /*!< bit 18 */ +#define NVIC_IABR_ACTIVE_19 ((uint32_t)0x00080000) /*!< bit 19 */ +#define NVIC_IABR_ACTIVE_20 ((uint32_t)0x00100000) /*!< bit 20 */ +#define NVIC_IABR_ACTIVE_21 ((uint32_t)0x00200000) /*!< bit 21 */ +#define NVIC_IABR_ACTIVE_22 ((uint32_t)0x00400000) /*!< bit 22 */ +#define NVIC_IABR_ACTIVE_23 ((uint32_t)0x00800000) /*!< bit 23 */ +#define NVIC_IABR_ACTIVE_24 ((uint32_t)0x01000000) /*!< bit 24 */ +#define NVIC_IABR_ACTIVE_25 ((uint32_t)0x02000000) /*!< bit 25 */ +#define NVIC_IABR_ACTIVE_26 ((uint32_t)0x04000000) /*!< bit 26 */ +#define NVIC_IABR_ACTIVE_27 ((uint32_t)0x08000000) /*!< bit 27 */ +#define NVIC_IABR_ACTIVE_28 ((uint32_t)0x10000000) /*!< bit 28 */ +#define NVIC_IABR_ACTIVE_29 ((uint32_t)0x20000000) /*!< bit 29 */ +#define NVIC_IABR_ACTIVE_30 ((uint32_t)0x40000000) /*!< bit 30 */ +#define NVIC_IABR_ACTIVE_31 ((uint32_t)0x80000000) /*!< bit 31 */ + +/****************** Bit definition for NVIC_PRI0 register *******************/ +#define NVIC_IPR0_PRI_0 ((uint32_t)0x000000FF) /*!< Priority of interrupt 0 */ +#define NVIC_IPR0_PRI_1 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 1 */ +#define NVIC_IPR0_PRI_2 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 2 */ +#define NVIC_IPR0_PRI_3 ((uint32_t)0xFF000000) /*!< Priority of interrupt 3 */ + +/****************** Bit definition for NVIC_PRI1 register *******************/ +#define NVIC_IPR1_PRI_4 ((uint32_t)0x000000FF) /*!< Priority of interrupt 4 */ +#define NVIC_IPR1_PRI_5 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 5 */ +#define NVIC_IPR1_PRI_6 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 6 */ +#define NVIC_IPR1_PRI_7 ((uint32_t)0xFF000000) /*!< Priority of interrupt 7 */ + +/****************** Bit definition for NVIC_PRI2 register *******************/ +#define NVIC_IPR2_PRI_8 ((uint32_t)0x000000FF) /*!< Priority of interrupt 8 */ +#define NVIC_IPR2_PRI_9 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 9 */ +#define NVIC_IPR2_PRI_10 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 10 */ +#define NVIC_IPR2_PRI_11 ((uint32_t)0xFF000000) /*!< Priority of interrupt 11 */ + +/****************** Bit definition for NVIC_PRI3 register *******************/ +#define NVIC_IPR3_PRI_12 ((uint32_t)0x000000FF) /*!< Priority of interrupt 12 */ +#define NVIC_IPR3_PRI_13 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 13 */ +#define NVIC_IPR3_PRI_14 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 14 */ +#define NVIC_IPR3_PRI_15 ((uint32_t)0xFF000000) /*!< Priority of interrupt 15 */ + +/****************** Bit definition for NVIC_PRI4 register *******************/ +#define NVIC_IPR4_PRI_16 ((uint32_t)0x000000FF) /*!< Priority of interrupt 16 */ +#define NVIC_IPR4_PRI_17 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 17 */ +#define NVIC_IPR4_PRI_18 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 18 */ +#define NVIC_IPR4_PRI_19 ((uint32_t)0xFF000000) /*!< Priority of interrupt 19 */ + +/****************** Bit definition for NVIC_PRI5 register *******************/ +#define NVIC_IPR5_PRI_20 ((uint32_t)0x000000FF) /*!< Priority of interrupt 20 */ +#define NVIC_IPR5_PRI_21 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 21 */ +#define NVIC_IPR5_PRI_22 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 22 */ +#define NVIC_IPR5_PRI_23 ((uint32_t)0xFF000000) /*!< Priority of interrupt 23 */ + +/****************** Bit definition for NVIC_PRI6 register *******************/ +#define NVIC_IPR6_PRI_24 ((uint32_t)0x000000FF) /*!< Priority of interrupt 24 */ +#define NVIC_IPR6_PRI_25 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 25 */ +#define NVIC_IPR6_PRI_26 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 26 */ +#define NVIC_IPR6_PRI_27 ((uint32_t)0xFF000000) /*!< Priority of interrupt 27 */ + +/****************** Bit definition for NVIC_PRI7 register *******************/ +#define NVIC_IPR7_PRI_28 ((uint32_t)0x000000FF) /*!< Priority of interrupt 28 */ +#define NVIC_IPR7_PRI_29 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 29 */ +#define NVIC_IPR7_PRI_30 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 30 */ +#define NVIC_IPR7_PRI_31 ((uint32_t)0xFF000000) /*!< Priority of interrupt 31 */ + +/****************** Bit definition for SCB_CPUID register *******************/ +#define SCB_CPUID_REVISION ((uint32_t)0x0000000F) /*!< Implementation defined revision number */ +#define SCB_CPUID_PARTNO ((uint32_t)0x0000FFF0) /*!< Number of processor within family */ +#define SCB_CPUID_Constant ((uint32_t)0x000F0000) /*!< Reads as 0x0F */ +#define SCB_CPUID_VARIANT ((uint32_t)0x00F00000) /*!< Implementation defined variant number */ +#define SCB_CPUID_IMPLEMENTER ((uint32_t)0xFF000000) /*!< Implementer code. ARM is 0x41 */ + +/******************* Bit definition for SCB_ICSR register *******************/ +#define SCB_ICSR_VECTACTIVE ((uint32_t)0x000001FF) /*!< Active ISR number field */ +#define SCB_ICSR_RETTOBASE ((uint32_t)0x00000800) /*!< All active exceptions minus the IPSR_current_exception yields the empty set */ +#define SCB_ICSR_VECTPENDING ((uint32_t)0x003FF000) /*!< Pending ISR number field */ +#define SCB_ICSR_ISRPENDING ((uint32_t)0x00400000) /*!< Interrupt pending flag */ +#define SCB_ICSR_ISRPREEMPT ((uint32_t)0x00800000) /*!< It indicates that a pending interrupt becomes active in the next running cycle */ +#define SCB_ICSR_PENDSTCLR ((uint32_t)0x02000000) /*!< Clear pending SysTick bit */ +#define SCB_ICSR_PENDSTSET ((uint32_t)0x04000000) /*!< Set pending SysTick bit */ +#define SCB_ICSR_PENDSVCLR ((uint32_t)0x08000000) /*!< Clear pending pendSV bit */ +#define SCB_ICSR_PENDSVSET ((uint32_t)0x10000000) /*!< Set pending pendSV bit */ +#define SCB_ICSR_NMIPENDSET ((uint32_t)0x80000000) /*!< Set pending NMI bit */ + +/******************* Bit definition for SCB_VTOR register *******************/ +#define SCB_VTOR_TBLOFF ((uint32_t)0x1FFFFF80) /*!< Vector table base offset field */ +#define SCB_VTOR_TBLBASE ((uint32_t)0x20000000) /*!< Table base in code(0) or RAM(1) */ + +/*!<***************** Bit definition for SCB_AIRCR register *******************/ +#define SCB_AIRCR_VECTRESET ((uint32_t)0x00000001) /*!< System Reset bit */ +#define SCB_AIRCR_VECTCLRACTIVE ((uint32_t)0x00000002) /*!< Clear active vector bit */ +#define SCB_AIRCR_SYSRESETREQ ((uint32_t)0x00000004) /*!< Requests chip control logic to generate a reset */ + +#define SCB_AIRCR_PRIGROUP ((uint32_t)0x00000700) /*!< PRIGROUP[2:0] bits (Priority group) */ +#define SCB_AIRCR_PRIGROUP_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define SCB_AIRCR_PRIGROUP_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define SCB_AIRCR_PRIGROUP_2 ((uint32_t)0x00000400) /*!< Bit 2 */ + +/* prority group configuration */ +#define SCB_AIRCR_PRIGROUP0 ((uint32_t)0x00000000) /*!< Priority group=0 (7 bits of pre-emption priority, 1 bit of subpriority) */ +#define SCB_AIRCR_PRIGROUP1 ((uint32_t)0x00000100) /*!< Priority group=1 (6 bits of pre-emption priority, 2 bits of subpriority) */ +#define SCB_AIRCR_PRIGROUP2 ((uint32_t)0x00000200) /*!< Priority group=2 (5 bits of pre-emption priority, 3 bits of subpriority) */ +#define SCB_AIRCR_PRIGROUP3 ((uint32_t)0x00000300) /*!< Priority group=3 (4 bits of pre-emption priority, 4 bits of subpriority) */ +#define SCB_AIRCR_PRIGROUP4 ((uint32_t)0x00000400) /*!< Priority group=4 (3 bits of pre-emption priority, 5 bits of subpriority) */ +#define SCB_AIRCR_PRIGROUP5 ((uint32_t)0x00000500) /*!< Priority group=5 (2 bits of pre-emption priority, 6 bits of subpriority) */ +#define SCB_AIRCR_PRIGROUP6 ((uint32_t)0x00000600) /*!< Priority group=6 (1 bit of pre-emption priority, 7 bits of subpriority) */ +#define SCB_AIRCR_PRIGROUP7 ((uint32_t)0x00000700) /*!< Priority group=7 (no pre-emption priority, 8 bits of subpriority) */ + +#define SCB_AIRCR_ENDIANESS ((uint32_t)0x00008000) /*!< Data endianness bit */ +#define SCB_AIRCR_VECTKEY ((uint32_t)0xFFFF0000) /*!< Register key (VECTKEY) - Reads as 0xFA05 (VECTKEYSTAT) */ + +/******************* Bit definition for SCB_SCR register ********************/ +#define SCB_SCR_SLEEPONEXIT ((uint8_t)0x02) /*!< Sleep on exit bit */ +#define SCB_SCR_SLEEPDEEP ((uint8_t)0x04) /*!< Sleep deep bit */ +#define SCB_SCR_SEVONPEND ((uint8_t)0x10) /*!< Wake up from WFE */ + +/******************** Bit definition for SCB_CCR register *******************/ +#define SCB_CCR_NONBASETHRDENA ((uint16_t)0x0001) /*!< Thread mode can be entered from any level in Handler mode by controlled return value */ +#define SCB_CCR_USERSETMPEND ((uint16_t)0x0002) /*!< Enables user code to write the Software Trigger Interrupt register to trigger (pend) a Main exception */ +#define SCB_CCR_UNALIGN_TRP ((uint16_t)0x0008) /*!< Trap for unaligned access */ +#define SCB_CCR_DIV_0_TRP ((uint16_t)0x0010) /*!< Trap on Divide by 0 */ +#define SCB_CCR_BFHFNMIGN ((uint16_t)0x0100) /*!< Handlers running at priority -1 and -2 */ +#define SCB_CCR_STKALIGN ((uint16_t)0x0200) /*!< On exception entry, the SP used prior to the exception is adjusted to be 8-byte aligned */ + +/******************* Bit definition for SCB_SHPR register ********************/ +#define SCB_SHPR_PRI_N ((uint32_t)0x000000FF) /*!< Priority of system handler 4,8, and 12. Mem Manage, reserved and Debug Monitor */ +#define SCB_SHPR_PRI_N1 ((uint32_t)0x0000FF00) /*!< Priority of system handler 5,9, and 13. Bus Fault, reserved and reserved */ +#define SCB_SHPR_PRI_N2 ((uint32_t)0x00FF0000) /*!< Priority of system handler 6,10, and 14. Usage Fault, reserved and PendSV */ +#define SCB_SHPR_PRI_N3 ((uint32_t)0xFF000000) /*!< Priority of system handler 7,11, and 15. Reserved, SVCall and SysTick */ + +/****************** Bit definition for SCB_SHCSR register *******************/ +#define SCB_SHCSR_MEMFAULTACT ((uint32_t)0x00000001) /*!< MemManage is active */ +#define SCB_SHCSR_BUSFAULTACT ((uint32_t)0x00000002) /*!< BusFault is active */ +#define SCB_SHCSR_USGFAULTACT ((uint32_t)0x00000008) /*!< UsageFault is active */ +#define SCB_SHCSR_SVCALLACT ((uint32_t)0x00000080) /*!< SVCall is active */ +#define SCB_SHCSR_MONITORACT ((uint32_t)0x00000100) /*!< Monitor is active */ +#define SCB_SHCSR_PENDSVACT ((uint32_t)0x00000400) /*!< PendSV is active */ +#define SCB_SHCSR_SYSTICKACT ((uint32_t)0x00000800) /*!< SysTick is active */ +#define SCB_SHCSR_USGFAULTPENDED ((uint32_t)0x00001000) /*!< Usage Fault is pended */ +#define SCB_SHCSR_MEMFAULTPENDED ((uint32_t)0x00002000) /*!< MemManage is pended */ +#define SCB_SHCSR_BUSFAULTPENDED ((uint32_t)0x00004000) /*!< Bus Fault is pended */ +#define SCB_SHCSR_SVCALLPENDED ((uint32_t)0x00008000) /*!< SVCall is pended */ +#define SCB_SHCSR_MEMFAULTENA ((uint32_t)0x00010000) /*!< MemManage enable */ +#define SCB_SHCSR_BUSFAULTENA ((uint32_t)0x00020000) /*!< Bus Fault enable */ +#define SCB_SHCSR_USGFAULTENA ((uint32_t)0x00040000) /*!< UsageFault enable */ + +/******************* Bit definition for SCB_CFSR register *******************/ +/*!< MFSR */ +#define SCB_CFSR_IACCVIOL ((uint32_t)0x00000001) /*!< Instruction access violation */ +#define SCB_CFSR_DACCVIOL ((uint32_t)0x00000002) /*!< Data access violation */ +#define SCB_CFSR_MUNSTKERR ((uint32_t)0x00000008) /*!< Unstacking error */ +#define SCB_CFSR_MSTKERR ((uint32_t)0x00000010) /*!< Stacking error */ +#define SCB_CFSR_MMARVALID ((uint32_t)0x00000080) /*!< Memory Manage Address Register address valid flag */ +/*!< BFSR */ +#define SCB_CFSR_IBUSERR ((uint32_t)0x00000100) /*!< Instruction bus error flag */ +#define SCB_CFSR_PRECISERR ((uint32_t)0x00000200) /*!< Precise data bus error */ +#define SCB_CFSR_IMPRECISERR ((uint32_t)0x00000400) /*!< Imprecise data bus error */ +#define SCB_CFSR_UNSTKERR ((uint32_t)0x00000800) /*!< Unstacking error */ +#define SCB_CFSR_STKERR ((uint32_t)0x00001000) /*!< Stacking error */ +#define SCB_CFSR_BFARVALID ((uint32_t)0x00008000) /*!< Bus Fault Address Register address valid flag */ +/*!< UFSR */ +#define SCB_CFSR_UNDEFINSTR ((uint32_t)0x00010000) /*!< The processor attempt to execute an undefined instruction */ +#define SCB_CFSR_INVSTATE ((uint32_t)0x00020000) /*!< Invalid combination of EPSR and instruction */ +#define SCB_CFSR_INVPC ((uint32_t)0x00040000) /*!< Attempt to load EXC_RETURN into pc illegally */ +#define SCB_CFSR_NOCP ((uint32_t)0x00080000) /*!< Attempt to use a coprocessor instruction */ +#define SCB_CFSR_UNALIGNED ((uint32_t)0x01000000) /*!< Fault occurs when there is an attempt to make an unaligned memory access */ +#define SCB_CFSR_DIVBYZERO ((uint32_t)0x02000000) /*!< Fault occurs when SDIV or DIV instruction is used with a divisor of 0 */ + +/******************* Bit definition for SCB_HFSR register *******************/ +#define SCB_HFSR_VECTTBL ((uint32_t)0x00000002) /*!< Fault occurs because of vector table read on exception processing */ +#define SCB_HFSR_FORCED ((uint32_t)0x40000000) /*!< Hard Fault activated when a configurable Fault was received and cannot activate */ +#define SCB_HFSR_DEBUGEVT ((uint32_t)0x80000000) /*!< Fault related to debug */ + +/******************* Bit definition for SCB_DFSR register *******************/ +#define SCB_DFSR_HALTED ((uint8_t)0x01) /*!< Halt request flag */ +#define SCB_DFSR_BKPT ((uint8_t)0x02) /*!< BKPT flag */ +#define SCB_DFSR_DWTTRAP ((uint8_t)0x04) /*!< Data Watchpoint and Trace (DWT) flag */ +#define SCB_DFSR_VCATCH ((uint8_t)0x08) /*!< Vector catch flag */ +#define SCB_DFSR_EXTERNAL ((uint8_t)0x10) /*!< External debug request flag */ + +/******************* Bit definition for SCB_MMFAR register ******************/ +#define SCB_MMFAR_ADDRESS ((uint32_t)0xFFFFFFFF) /*!< Mem Manage fault address field */ + +/******************* Bit definition for SCB_BFAR register *******************/ +#define SCB_BFAR_ADDRESS ((uint32_t)0xFFFFFFFF) /*!< Bus fault address field */ + +/******************* Bit definition for SCB_afsr register *******************/ +#define SCB_AFSR_IMPDEF ((uint32_t)0xFFFFFFFF) /*!< Implementation defined */ + +/******************************************************************************/ +/* */ +/* External Interrupt/Event Controller */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for EXTI_IMR register *******************/ +#define EXTI_IMR_MR0 ((uint32_t)0x00000001) /*!< Interrupt Mask on line 0 */ +#define EXTI_IMR_MR1 ((uint32_t)0x00000002) /*!< Interrupt Mask on line 1 */ +#define EXTI_IMR_MR2 ((uint32_t)0x00000004) /*!< Interrupt Mask on line 2 */ +#define EXTI_IMR_MR3 ((uint32_t)0x00000008) /*!< Interrupt Mask on line 3 */ +#define EXTI_IMR_MR4 ((uint32_t)0x00000010) /*!< Interrupt Mask on line 4 */ +#define EXTI_IMR_MR5 ((uint32_t)0x00000020) /*!< Interrupt Mask on line 5 */ +#define EXTI_IMR_MR6 ((uint32_t)0x00000040) /*!< Interrupt Mask on line 6 */ +#define EXTI_IMR_MR7 ((uint32_t)0x00000080) /*!< Interrupt Mask on line 7 */ +#define EXTI_IMR_MR8 ((uint32_t)0x00000100) /*!< Interrupt Mask on line 8 */ +#define EXTI_IMR_MR9 ((uint32_t)0x00000200) /*!< Interrupt Mask on line 9 */ +#define EXTI_IMR_MR10 ((uint32_t)0x00000400) /*!< Interrupt Mask on line 10 */ +#define EXTI_IMR_MR11 ((uint32_t)0x00000800) /*!< Interrupt Mask on line 11 */ +#define EXTI_IMR_MR12 ((uint32_t)0x00001000) /*!< Interrupt Mask on line 12 */ +#define EXTI_IMR_MR13 ((uint32_t)0x00002000) /*!< Interrupt Mask on line 13 */ +#define EXTI_IMR_MR14 ((uint32_t)0x00004000) /*!< Interrupt Mask on line 14 */ +#define EXTI_IMR_MR15 ((uint32_t)0x00008000) /*!< Interrupt Mask on line 15 */ +#define EXTI_IMR_MR16 ((uint32_t)0x00010000) /*!< Interrupt Mask on line 16 */ +#define EXTI_IMR_MR17 ((uint32_t)0x00020000) /*!< Interrupt Mask on line 17 */ +#define EXTI_IMR_MR18 ((uint32_t)0x00040000) /*!< Interrupt Mask on line 18 */ +#define EXTI_IMR_MR19 ((uint32_t)0x00080000) /*!< Interrupt Mask on line 19 */ + +/******************* Bit definition for EXTI_EMR register *******************/ +#define EXTI_EMR_MR0 ((uint32_t)0x00000001) /*!< Event Mask on line 0 */ +#define EXTI_EMR_MR1 ((uint32_t)0x00000002) /*!< Event Mask on line 1 */ +#define EXTI_EMR_MR2 ((uint32_t)0x00000004) /*!< Event Mask on line 2 */ +#define EXTI_EMR_MR3 ((uint32_t)0x00000008) /*!< Event Mask on line 3 */ +#define EXTI_EMR_MR4 ((uint32_t)0x00000010) /*!< Event Mask on line 4 */ +#define EXTI_EMR_MR5 ((uint32_t)0x00000020) /*!< Event Mask on line 5 */ +#define EXTI_EMR_MR6 ((uint32_t)0x00000040) /*!< Event Mask on line 6 */ +#define EXTI_EMR_MR7 ((uint32_t)0x00000080) /*!< Event Mask on line 7 */ +#define EXTI_EMR_MR8 ((uint32_t)0x00000100) /*!< Event Mask on line 8 */ +#define EXTI_EMR_MR9 ((uint32_t)0x00000200) /*!< Event Mask on line 9 */ +#define EXTI_EMR_MR10 ((uint32_t)0x00000400) /*!< Event Mask on line 10 */ +#define EXTI_EMR_MR11 ((uint32_t)0x00000800) /*!< Event Mask on line 11 */ +#define EXTI_EMR_MR12 ((uint32_t)0x00001000) /*!< Event Mask on line 12 */ +#define EXTI_EMR_MR13 ((uint32_t)0x00002000) /*!< Event Mask on line 13 */ +#define EXTI_EMR_MR14 ((uint32_t)0x00004000) /*!< Event Mask on line 14 */ +#define EXTI_EMR_MR15 ((uint32_t)0x00008000) /*!< Event Mask on line 15 */ +#define EXTI_EMR_MR16 ((uint32_t)0x00010000) /*!< Event Mask on line 16 */ +#define EXTI_EMR_MR17 ((uint32_t)0x00020000) /*!< Event Mask on line 17 */ +#define EXTI_EMR_MR18 ((uint32_t)0x00040000) /*!< Event Mask on line 18 */ +#define EXTI_EMR_MR19 ((uint32_t)0x00080000) /*!< Event Mask on line 19 */ + +/****************** Bit definition for EXTI_RTSR register *******************/ +#define EXTI_RTSR_TR0 ((uint32_t)0x00000001) /*!< Rising trigger event configuration bit of line 0 */ +#define EXTI_RTSR_TR1 ((uint32_t)0x00000002) /*!< Rising trigger event configuration bit of line 1 */ +#define EXTI_RTSR_TR2 ((uint32_t)0x00000004) /*!< Rising trigger event configuration bit of line 2 */ +#define EXTI_RTSR_TR3 ((uint32_t)0x00000008) /*!< Rising trigger event configuration bit of line 3 */ +#define EXTI_RTSR_TR4 ((uint32_t)0x00000010) /*!< Rising trigger event configuration bit of line 4 */ +#define EXTI_RTSR_TR5 ((uint32_t)0x00000020) /*!< Rising trigger event configuration bit of line 5 */ +#define EXTI_RTSR_TR6 ((uint32_t)0x00000040) /*!< Rising trigger event configuration bit of line 6 */ +#define EXTI_RTSR_TR7 ((uint32_t)0x00000080) /*!< Rising trigger event configuration bit of line 7 */ +#define EXTI_RTSR_TR8 ((uint32_t)0x00000100) /*!< Rising trigger event configuration bit of line 8 */ +#define EXTI_RTSR_TR9 ((uint32_t)0x00000200) /*!< Rising trigger event configuration bit of line 9 */ +#define EXTI_RTSR_TR10 ((uint32_t)0x00000400) /*!< Rising trigger event configuration bit of line 10 */ +#define EXTI_RTSR_TR11 ((uint32_t)0x00000800) /*!< Rising trigger event configuration bit of line 11 */ +#define EXTI_RTSR_TR12 ((uint32_t)0x00001000) /*!< Rising trigger event configuration bit of line 12 */ +#define EXTI_RTSR_TR13 ((uint32_t)0x00002000) /*!< Rising trigger event configuration bit of line 13 */ +#define EXTI_RTSR_TR14 ((uint32_t)0x00004000) /*!< Rising trigger event configuration bit of line 14 */ +#define EXTI_RTSR_TR15 ((uint32_t)0x00008000) /*!< Rising trigger event configuration bit of line 15 */ +#define EXTI_RTSR_TR16 ((uint32_t)0x00010000) /*!< Rising trigger event configuration bit of line 16 */ +#define EXTI_RTSR_TR17 ((uint32_t)0x00020000) /*!< Rising trigger event configuration bit of line 17 */ +#define EXTI_RTSR_TR18 ((uint32_t)0x00040000) /*!< Rising trigger event configuration bit of line 18 */ +#define EXTI_RTSR_TR19 ((uint32_t)0x00080000) /*!< Rising trigger event configuration bit of line 19 */ + +/****************** Bit definition for EXTI_FTSR register *******************/ +#define EXTI_FTSR_TR0 ((uint32_t)0x00000001) /*!< Falling trigger event configuration bit of line 0 */ +#define EXTI_FTSR_TR1 ((uint32_t)0x00000002) /*!< Falling trigger event configuration bit of line 1 */ +#define EXTI_FTSR_TR2 ((uint32_t)0x00000004) /*!< Falling trigger event configuration bit of line 2 */ +#define EXTI_FTSR_TR3 ((uint32_t)0x00000008) /*!< Falling trigger event configuration bit of line 3 */ +#define EXTI_FTSR_TR4 ((uint32_t)0x00000010) /*!< Falling trigger event configuration bit of line 4 */ +#define EXTI_FTSR_TR5 ((uint32_t)0x00000020) /*!< Falling trigger event configuration bit of line 5 */ +#define EXTI_FTSR_TR6 ((uint32_t)0x00000040) /*!< Falling trigger event configuration bit of line 6 */ +#define EXTI_FTSR_TR7 ((uint32_t)0x00000080) /*!< Falling trigger event configuration bit of line 7 */ +#define EXTI_FTSR_TR8 ((uint32_t)0x00000100) /*!< Falling trigger event configuration bit of line 8 */ +#define EXTI_FTSR_TR9 ((uint32_t)0x00000200) /*!< Falling trigger event configuration bit of line 9 */ +#define EXTI_FTSR_TR10 ((uint32_t)0x00000400) /*!< Falling trigger event configuration bit of line 10 */ +#define EXTI_FTSR_TR11 ((uint32_t)0x00000800) /*!< Falling trigger event configuration bit of line 11 */ +#define EXTI_FTSR_TR12 ((uint32_t)0x00001000) /*!< Falling trigger event configuration bit of line 12 */ +#define EXTI_FTSR_TR13 ((uint32_t)0x00002000) /*!< Falling trigger event configuration bit of line 13 */ +#define EXTI_FTSR_TR14 ((uint32_t)0x00004000) /*!< Falling trigger event configuration bit of line 14 */ +#define EXTI_FTSR_TR15 ((uint32_t)0x00008000) /*!< Falling trigger event configuration bit of line 15 */ +#define EXTI_FTSR_TR16 ((uint32_t)0x00010000) /*!< Falling trigger event configuration bit of line 16 */ +#define EXTI_FTSR_TR17 ((uint32_t)0x00020000) /*!< Falling trigger event configuration bit of line 17 */ +#define EXTI_FTSR_TR18 ((uint32_t)0x00040000) /*!< Falling trigger event configuration bit of line 18 */ +#define EXTI_FTSR_TR19 ((uint32_t)0x00080000) /*!< Falling trigger event configuration bit of line 19 */ + +/****************** Bit definition for EXTI_SWIER register ******************/ +#define EXTI_SWIER_SWIER0 ((uint32_t)0x00000001) /*!< Software Interrupt on line 0 */ +#define EXTI_SWIER_SWIER1 ((uint32_t)0x00000002) /*!< Software Interrupt on line 1 */ +#define EXTI_SWIER_SWIER2 ((uint32_t)0x00000004) /*!< Software Interrupt on line 2 */ +#define EXTI_SWIER_SWIER3 ((uint32_t)0x00000008) /*!< Software Interrupt on line 3 */ +#define EXTI_SWIER_SWIER4 ((uint32_t)0x00000010) /*!< Software Interrupt on line 4 */ +#define EXTI_SWIER_SWIER5 ((uint32_t)0x00000020) /*!< Software Interrupt on line 5 */ +#define EXTI_SWIER_SWIER6 ((uint32_t)0x00000040) /*!< Software Interrupt on line 6 */ +#define EXTI_SWIER_SWIER7 ((uint32_t)0x00000080) /*!< Software Interrupt on line 7 */ +#define EXTI_SWIER_SWIER8 ((uint32_t)0x00000100) /*!< Software Interrupt on line 8 */ +#define EXTI_SWIER_SWIER9 ((uint32_t)0x00000200) /*!< Software Interrupt on line 9 */ +#define EXTI_SWIER_SWIER10 ((uint32_t)0x00000400) /*!< Software Interrupt on line 10 */ +#define EXTI_SWIER_SWIER11 ((uint32_t)0x00000800) /*!< Software Interrupt on line 11 */ +#define EXTI_SWIER_SWIER12 ((uint32_t)0x00001000) /*!< Software Interrupt on line 12 */ +#define EXTI_SWIER_SWIER13 ((uint32_t)0x00002000) /*!< Software Interrupt on line 13 */ +#define EXTI_SWIER_SWIER14 ((uint32_t)0x00004000) /*!< Software Interrupt on line 14 */ +#define EXTI_SWIER_SWIER15 ((uint32_t)0x00008000) /*!< Software Interrupt on line 15 */ +#define EXTI_SWIER_SWIER16 ((uint32_t)0x00010000) /*!< Software Interrupt on line 16 */ +#define EXTI_SWIER_SWIER17 ((uint32_t)0x00020000) /*!< Software Interrupt on line 17 */ +#define EXTI_SWIER_SWIER18 ((uint32_t)0x00040000) /*!< Software Interrupt on line 18 */ +#define EXTI_SWIER_SWIER19 ((uint32_t)0x00080000) /*!< Software Interrupt on line 19 */ + +/******************* Bit definition for EXTI_PR register ********************/ +#define EXTI_PR_PR0 ((uint32_t)0x00000001) /*!< Pending bit for line 0 */ +#define EXTI_PR_PR1 ((uint32_t)0x00000002) /*!< Pending bit for line 1 */ +#define EXTI_PR_PR2 ((uint32_t)0x00000004) /*!< Pending bit for line 2 */ +#define EXTI_PR_PR3 ((uint32_t)0x00000008) /*!< Pending bit for line 3 */ +#define EXTI_PR_PR4 ((uint32_t)0x00000010) /*!< Pending bit for line 4 */ +#define EXTI_PR_PR5 ((uint32_t)0x00000020) /*!< Pending bit for line 5 */ +#define EXTI_PR_PR6 ((uint32_t)0x00000040) /*!< Pending bit for line 6 */ +#define EXTI_PR_PR7 ((uint32_t)0x00000080) /*!< Pending bit for line 7 */ +#define EXTI_PR_PR8 ((uint32_t)0x00000100) /*!< Pending bit for line 8 */ +#define EXTI_PR_PR9 ((uint32_t)0x00000200) /*!< Pending bit for line 9 */ +#define EXTI_PR_PR10 ((uint32_t)0x00000400) /*!< Pending bit for line 10 */ +#define EXTI_PR_PR11 ((uint32_t)0x00000800) /*!< Pending bit for line 11 */ +#define EXTI_PR_PR12 ((uint32_t)0x00001000) /*!< Pending bit for line 12 */ +#define EXTI_PR_PR13 ((uint32_t)0x00002000) /*!< Pending bit for line 13 */ +#define EXTI_PR_PR14 ((uint32_t)0x00004000) /*!< Pending bit for line 14 */ +#define EXTI_PR_PR15 ((uint32_t)0x00008000) /*!< Pending bit for line 15 */ +#define EXTI_PR_PR16 ((uint32_t)0x00010000) /*!< Pending bit for line 16 */ +#define EXTI_PR_PR17 ((uint32_t)0x00020000) /*!< Pending bit for line 17 */ +#define EXTI_PR_PR18 ((uint32_t)0x00040000) /*!< Pending bit for line 18 */ +#define EXTI_PR_PR19 ((uint32_t)0x00080000) /*!< Pending bit for line 19 */ + +/******************************************************************************/ +/* */ +/* DMA Controller */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for DMA_ISR register ********************/ +#define DMA_ISR_GIF1 ((uint32_t)0x00000001) /*!< Channel 1 Global interrupt flag */ +#define DMA_ISR_TCIF1 ((uint32_t)0x00000002) /*!< Channel 1 Transfer Complete flag */ +#define DMA_ISR_HTIF1 ((uint32_t)0x00000004) /*!< Channel 1 Half Transfer flag */ +#define DMA_ISR_TEIF1 ((uint32_t)0x00000008) /*!< Channel 1 Transfer Error flag */ +#define DMA_ISR_GIF2 ((uint32_t)0x00000010) /*!< Channel 2 Global interrupt flag */ +#define DMA_ISR_TCIF2 ((uint32_t)0x00000020) /*!< Channel 2 Transfer Complete flag */ +#define DMA_ISR_HTIF2 ((uint32_t)0x00000040) /*!< Channel 2 Half Transfer flag */ +#define DMA_ISR_TEIF2 ((uint32_t)0x00000080) /*!< Channel 2 Transfer Error flag */ +#define DMA_ISR_GIF3 ((uint32_t)0x00000100) /*!< Channel 3 Global interrupt flag */ +#define DMA_ISR_TCIF3 ((uint32_t)0x00000200) /*!< Channel 3 Transfer Complete flag */ +#define DMA_ISR_HTIF3 ((uint32_t)0x00000400) /*!< Channel 3 Half Transfer flag */ +#define DMA_ISR_TEIF3 ((uint32_t)0x00000800) /*!< Channel 3 Transfer Error flag */ +#define DMA_ISR_GIF4 ((uint32_t)0x00001000) /*!< Channel 4 Global interrupt flag */ +#define DMA_ISR_TCIF4 ((uint32_t)0x00002000) /*!< Channel 4 Transfer Complete flag */ +#define DMA_ISR_HTIF4 ((uint32_t)0x00004000) /*!< Channel 4 Half Transfer flag */ +#define DMA_ISR_TEIF4 ((uint32_t)0x00008000) /*!< Channel 4 Transfer Error flag */ +#define DMA_ISR_GIF5 ((uint32_t)0x00010000) /*!< Channel 5 Global interrupt flag */ +#define DMA_ISR_TCIF5 ((uint32_t)0x00020000) /*!< Channel 5 Transfer Complete flag */ +#define DMA_ISR_HTIF5 ((uint32_t)0x00040000) /*!< Channel 5 Half Transfer flag */ +#define DMA_ISR_TEIF5 ((uint32_t)0x00080000) /*!< Channel 5 Transfer Error flag */ +#define DMA_ISR_GIF6 ((uint32_t)0x00100000) /*!< Channel 6 Global interrupt flag */ +#define DMA_ISR_TCIF6 ((uint32_t)0x00200000) /*!< Channel 6 Transfer Complete flag */ +#define DMA_ISR_HTIF6 ((uint32_t)0x00400000) /*!< Channel 6 Half Transfer flag */ +#define DMA_ISR_TEIF6 ((uint32_t)0x00800000) /*!< Channel 6 Transfer Error flag */ +#define DMA_ISR_GIF7 ((uint32_t)0x01000000) /*!< Channel 7 Global interrupt flag */ +#define DMA_ISR_TCIF7 ((uint32_t)0x02000000) /*!< Channel 7 Transfer Complete flag */ +#define DMA_ISR_HTIF7 ((uint32_t)0x04000000) /*!< Channel 7 Half Transfer flag */ +#define DMA_ISR_TEIF7 ((uint32_t)0x08000000) /*!< Channel 7 Transfer Error flag */ + +/******************* Bit definition for DMA_IFCR register *******************/ +#define DMA_IFCR_CGIF1 ((uint32_t)0x00000001) /*!< Channel 1 Global interrupt clear */ +#define DMA_IFCR_CTCIF1 ((uint32_t)0x00000002) /*!< Channel 1 Transfer Complete clear */ +#define DMA_IFCR_CHTIF1 ((uint32_t)0x00000004) /*!< Channel 1 Half Transfer clear */ +#define DMA_IFCR_CTEIF1 ((uint32_t)0x00000008) /*!< Channel 1 Transfer Error clear */ +#define DMA_IFCR_CGIF2 ((uint32_t)0x00000010) /*!< Channel 2 Global interrupt clear */ +#define DMA_IFCR_CTCIF2 ((uint32_t)0x00000020) /*!< Channel 2 Transfer Complete clear */ +#define DMA_IFCR_CHTIF2 ((uint32_t)0x00000040) /*!< Channel 2 Half Transfer clear */ +#define DMA_IFCR_CTEIF2 ((uint32_t)0x00000080) /*!< Channel 2 Transfer Error clear */ +#define DMA_IFCR_CGIF3 ((uint32_t)0x00000100) /*!< Channel 3 Global interrupt clear */ +#define DMA_IFCR_CTCIF3 ((uint32_t)0x00000200) /*!< Channel 3 Transfer Complete clear */ +#define DMA_IFCR_CHTIF3 ((uint32_t)0x00000400) /*!< Channel 3 Half Transfer clear */ +#define DMA_IFCR_CTEIF3 ((uint32_t)0x00000800) /*!< Channel 3 Transfer Error clear */ +#define DMA_IFCR_CGIF4 ((uint32_t)0x00001000) /*!< Channel 4 Global interrupt clear */ +#define DMA_IFCR_CTCIF4 ((uint32_t)0x00002000) /*!< Channel 4 Transfer Complete clear */ +#define DMA_IFCR_CHTIF4 ((uint32_t)0x00004000) /*!< Channel 4 Half Transfer clear */ +#define DMA_IFCR_CTEIF4 ((uint32_t)0x00008000) /*!< Channel 4 Transfer Error clear */ +#define DMA_IFCR_CGIF5 ((uint32_t)0x00010000) /*!< Channel 5 Global interrupt clear */ +#define DMA_IFCR_CTCIF5 ((uint32_t)0x00020000) /*!< Channel 5 Transfer Complete clear */ +#define DMA_IFCR_CHTIF5 ((uint32_t)0x00040000) /*!< Channel 5 Half Transfer clear */ +#define DMA_IFCR_CTEIF5 ((uint32_t)0x00080000) /*!< Channel 5 Transfer Error clear */ +#define DMA_IFCR_CGIF6 ((uint32_t)0x00100000) /*!< Channel 6 Global interrupt clear */ +#define DMA_IFCR_CTCIF6 ((uint32_t)0x00200000) /*!< Channel 6 Transfer Complete clear */ +#define DMA_IFCR_CHTIF6 ((uint32_t)0x00400000) /*!< Channel 6 Half Transfer clear */ +#define DMA_IFCR_CTEIF6 ((uint32_t)0x00800000) /*!< Channel 6 Transfer Error clear */ +#define DMA_IFCR_CGIF7 ((uint32_t)0x01000000) /*!< Channel 7 Global interrupt clear */ +#define DMA_IFCR_CTCIF7 ((uint32_t)0x02000000) /*!< Channel 7 Transfer Complete clear */ +#define DMA_IFCR_CHTIF7 ((uint32_t)0x04000000) /*!< Channel 7 Half Transfer clear */ +#define DMA_IFCR_CTEIF7 ((uint32_t)0x08000000) /*!< Channel 7 Transfer Error clear */ + +/******************* Bit definition for DMA_CCR1 register *******************/ +#define DMA_CCR1_EN ((uint16_t)0x0001) /*!< Channel enable*/ +#define DMA_CCR1_TCIE ((uint16_t)0x0002) /*!< Transfer complete interrupt enable */ +#define DMA_CCR1_HTIE ((uint16_t)0x0004) /*!< Half Transfer interrupt enable */ +#define DMA_CCR1_TEIE ((uint16_t)0x0008) /*!< Transfer error interrupt enable */ +#define DMA_CCR1_DIR ((uint16_t)0x0010) /*!< Data transfer direction */ +#define DMA_CCR1_CIRC ((uint16_t)0x0020) /*!< Circular mode */ +#define DMA_CCR1_PINC ((uint16_t)0x0040) /*!< Peripheral increment mode */ +#define DMA_CCR1_MINC ((uint16_t)0x0080) /*!< Memory increment mode */ + +#define DMA_CCR1_PSIZE ((uint16_t)0x0300) /*!< PSIZE[1:0] bits (Peripheral size) */ +#define DMA_CCR1_PSIZE_0 ((uint16_t)0x0100) /*!< Bit 0 */ +#define DMA_CCR1_PSIZE_1 ((uint16_t)0x0200) /*!< Bit 1 */ + +#define DMA_CCR1_MSIZE ((uint16_t)0x0C00) /*!< MSIZE[1:0] bits (Memory size) */ +#define DMA_CCR1_MSIZE_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define DMA_CCR1_MSIZE_1 ((uint16_t)0x0800) /*!< Bit 1 */ + +#define DMA_CCR1_PL ((uint16_t)0x3000) /*!< PL[1:0] bits(Channel Priority level) */ +#define DMA_CCR1_PL_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define DMA_CCR1_PL_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define DMA_CCR1_MEM2MEM ((uint16_t)0x4000) /*!< Memory to memory mode */ + +/******************* Bit definition for DMA_CCR2 register *******************/ +#define DMA_CCR2_EN ((uint16_t)0x0001) /*!< Channel enable */ +#define DMA_CCR2_TCIE ((uint16_t)0x0002) /*!< Transfer complete interrupt enable */ +#define DMA_CCR2_HTIE ((uint16_t)0x0004) /*!< Half Transfer interrupt enable */ +#define DMA_CCR2_TEIE ((uint16_t)0x0008) /*!< Transfer error interrupt enable */ +#define DMA_CCR2_DIR ((uint16_t)0x0010) /*!< Data transfer direction */ +#define DMA_CCR2_CIRC ((uint16_t)0x0020) /*!< Circular mode */ +#define DMA_CCR2_PINC ((uint16_t)0x0040) /*!< Peripheral increment mode */ +#define DMA_CCR2_MINC ((uint16_t)0x0080) /*!< Memory increment mode */ + +#define DMA_CCR2_PSIZE ((uint16_t)0x0300) /*!< PSIZE[1:0] bits (Peripheral size) */ +#define DMA_CCR2_PSIZE_0 ((uint16_t)0x0100) /*!< Bit 0 */ +#define DMA_CCR2_PSIZE_1 ((uint16_t)0x0200) /*!< Bit 1 */ + +#define DMA_CCR2_MSIZE ((uint16_t)0x0C00) /*!< MSIZE[1:0] bits (Memory size) */ +#define DMA_CCR2_MSIZE_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define DMA_CCR2_MSIZE_1 ((uint16_t)0x0800) /*!< Bit 1 */ + +#define DMA_CCR2_PL ((uint16_t)0x3000) /*!< PL[1:0] bits (Channel Priority level) */ +#define DMA_CCR2_PL_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define DMA_CCR2_PL_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define DMA_CCR2_MEM2MEM ((uint16_t)0x4000) /*!< Memory to memory mode */ + +/******************* Bit definition for DMA_CCR3 register *******************/ +#define DMA_CCR3_EN ((uint16_t)0x0001) /*!< Channel enable */ +#define DMA_CCR3_TCIE ((uint16_t)0x0002) /*!< Transfer complete interrupt enable */ +#define DMA_CCR3_HTIE ((uint16_t)0x0004) /*!< Half Transfer interrupt enable */ +#define DMA_CCR3_TEIE ((uint16_t)0x0008) /*!< Transfer error interrupt enable */ +#define DMA_CCR3_DIR ((uint16_t)0x0010) /*!< Data transfer direction */ +#define DMA_CCR3_CIRC ((uint16_t)0x0020) /*!< Circular mode */ +#define DMA_CCR3_PINC ((uint16_t)0x0040) /*!< Peripheral increment mode */ +#define DMA_CCR3_MINC ((uint16_t)0x0080) /*!< Memory increment mode */ + +#define DMA_CCR3_PSIZE ((uint16_t)0x0300) /*!< PSIZE[1:0] bits (Peripheral size) */ +#define DMA_CCR3_PSIZE_0 ((uint16_t)0x0100) /*!< Bit 0 */ +#define DMA_CCR3_PSIZE_1 ((uint16_t)0x0200) /*!< Bit 1 */ + +#define DMA_CCR3_MSIZE ((uint16_t)0x0C00) /*!< MSIZE[1:0] bits (Memory size) */ +#define DMA_CCR3_MSIZE_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define DMA_CCR3_MSIZE_1 ((uint16_t)0x0800) /*!< Bit 1 */ + +#define DMA_CCR3_PL ((uint16_t)0x3000) /*!< PL[1:0] bits (Channel Priority level) */ +#define DMA_CCR3_PL_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define DMA_CCR3_PL_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define DMA_CCR3_MEM2MEM ((uint16_t)0x4000) /*!< Memory to memory mode */ + +/*!<****************** Bit definition for DMA_CCR4 register *******************/ +#define DMA_CCR4_EN ((uint16_t)0x0001) /*!< Channel enable */ +#define DMA_CCR4_TCIE ((uint16_t)0x0002) /*!< Transfer complete interrupt enable */ +#define DMA_CCR4_HTIE ((uint16_t)0x0004) /*!< Half Transfer interrupt enable */ +#define DMA_CCR4_TEIE ((uint16_t)0x0008) /*!< Transfer error interrupt enable */ +#define DMA_CCR4_DIR ((uint16_t)0x0010) /*!< Data transfer direction */ +#define DMA_CCR4_CIRC ((uint16_t)0x0020) /*!< Circular mode */ +#define DMA_CCR4_PINC ((uint16_t)0x0040) /*!< Peripheral increment mode */ +#define DMA_CCR4_MINC ((uint16_t)0x0080) /*!< Memory increment mode */ + +#define DMA_CCR4_PSIZE ((uint16_t)0x0300) /*!< PSIZE[1:0] bits (Peripheral size) */ +#define DMA_CCR4_PSIZE_0 ((uint16_t)0x0100) /*!< Bit 0 */ +#define DMA_CCR4_PSIZE_1 ((uint16_t)0x0200) /*!< Bit 1 */ + +#define DMA_CCR4_MSIZE ((uint16_t)0x0C00) /*!< MSIZE[1:0] bits (Memory size) */ +#define DMA_CCR4_MSIZE_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define DMA_CCR4_MSIZE_1 ((uint16_t)0x0800) /*!< Bit 1 */ + +#define DMA_CCR4_PL ((uint16_t)0x3000) /*!< PL[1:0] bits (Channel Priority level) */ +#define DMA_CCR4_PL_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define DMA_CCR4_PL_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define DMA_CCR4_MEM2MEM ((uint16_t)0x4000) /*!< Memory to memory mode */ + +/****************** Bit definition for DMA_CCR5 register *******************/ +#define DMA_CCR5_EN ((uint16_t)0x0001) /*!< Channel enable */ +#define DMA_CCR5_TCIE ((uint16_t)0x0002) /*!< Transfer complete interrupt enable */ +#define DMA_CCR5_HTIE ((uint16_t)0x0004) /*!< Half Transfer interrupt enable */ +#define DMA_CCR5_TEIE ((uint16_t)0x0008) /*!< Transfer error interrupt enable */ +#define DMA_CCR5_DIR ((uint16_t)0x0010) /*!< Data transfer direction */ +#define DMA_CCR5_CIRC ((uint16_t)0x0020) /*!< Circular mode */ +#define DMA_CCR5_PINC ((uint16_t)0x0040) /*!< Peripheral increment mode */ +#define DMA_CCR5_MINC ((uint16_t)0x0080) /*!< Memory increment mode */ + +#define DMA_CCR5_PSIZE ((uint16_t)0x0300) /*!< PSIZE[1:0] bits (Peripheral size) */ +#define DMA_CCR5_PSIZE_0 ((uint16_t)0x0100) /*!< Bit 0 */ +#define DMA_CCR5_PSIZE_1 ((uint16_t)0x0200) /*!< Bit 1 */ + +#define DMA_CCR5_MSIZE ((uint16_t)0x0C00) /*!< MSIZE[1:0] bits (Memory size) */ +#define DMA_CCR5_MSIZE_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define DMA_CCR5_MSIZE_1 ((uint16_t)0x0800) /*!< Bit 1 */ + +#define DMA_CCR5_PL ((uint16_t)0x3000) /*!< PL[1:0] bits (Channel Priority level) */ +#define DMA_CCR5_PL_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define DMA_CCR5_PL_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define DMA_CCR5_MEM2MEM ((uint16_t)0x4000) /*!< Memory to memory mode enable */ + +/******************* Bit definition for DMA_CCR6 register *******************/ +#define DMA_CCR6_EN ((uint16_t)0x0001) /*!< Channel enable */ +#define DMA_CCR6_TCIE ((uint16_t)0x0002) /*!< Transfer complete interrupt enable */ +#define DMA_CCR6_HTIE ((uint16_t)0x0004) /*!< Half Transfer interrupt enable */ +#define DMA_CCR6_TEIE ((uint16_t)0x0008) /*!< Transfer error interrupt enable */ +#define DMA_CCR6_DIR ((uint16_t)0x0010) /*!< Data transfer direction */ +#define DMA_CCR6_CIRC ((uint16_t)0x0020) /*!< Circular mode */ +#define DMA_CCR6_PINC ((uint16_t)0x0040) /*!< Peripheral increment mode */ +#define DMA_CCR6_MINC ((uint16_t)0x0080) /*!< Memory increment mode */ + +#define DMA_CCR6_PSIZE ((uint16_t)0x0300) /*!< PSIZE[1:0] bits (Peripheral size) */ +#define DMA_CCR6_PSIZE_0 ((uint16_t)0x0100) /*!< Bit 0 */ +#define DMA_CCR6_PSIZE_1 ((uint16_t)0x0200) /*!< Bit 1 */ + +#define DMA_CCR6_MSIZE ((uint16_t)0x0C00) /*!< MSIZE[1:0] bits (Memory size) */ +#define DMA_CCR6_MSIZE_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define DMA_CCR6_MSIZE_1 ((uint16_t)0x0800) /*!< Bit 1 */ + +#define DMA_CCR6_PL ((uint16_t)0x3000) /*!< PL[1:0] bits (Channel Priority level) */ +#define DMA_CCR6_PL_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define DMA_CCR6_PL_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define DMA_CCR6_MEM2MEM ((uint16_t)0x4000) /*!< Memory to memory mode */ + +/******************* Bit definition for DMA_CCR7 register *******************/ +#define DMA_CCR7_EN ((uint16_t)0x0001) /*!< Channel enable */ +#define DMA_CCR7_TCIE ((uint16_t)0x0002) /*!< Transfer complete interrupt enable */ +#define DMA_CCR7_HTIE ((uint16_t)0x0004) /*!< Half Transfer interrupt enable */ +#define DMA_CCR7_TEIE ((uint16_t)0x0008) /*!< Transfer error interrupt enable */ +#define DMA_CCR7_DIR ((uint16_t)0x0010) /*!< Data transfer direction */ +#define DMA_CCR7_CIRC ((uint16_t)0x0020) /*!< Circular mode */ +#define DMA_CCR7_PINC ((uint16_t)0x0040) /*!< Peripheral increment mode */ +#define DMA_CCR7_MINC ((uint16_t)0x0080) /*!< Memory increment mode */ + +#define DMA_CCR7_PSIZE , ((uint16_t)0x0300) /*!< PSIZE[1:0] bits (Peripheral size) */ +#define DMA_CCR7_PSIZE_0 ((uint16_t)0x0100) /*!< Bit 0 */ +#define DMA_CCR7_PSIZE_1 ((uint16_t)0x0200) /*!< Bit 1 */ + +#define DMA_CCR7_MSIZE ((uint16_t)0x0C00) /*!< MSIZE[1:0] bits (Memory size) */ +#define DMA_CCR7_MSIZE_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define DMA_CCR7_MSIZE_1 ((uint16_t)0x0800) /*!< Bit 1 */ + +#define DMA_CCR7_PL ((uint16_t)0x3000) /*!< PL[1:0] bits (Channel Priority level) */ +#define DMA_CCR7_PL_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define DMA_CCR7_PL_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define DMA_CCR7_MEM2MEM ((uint16_t)0x4000) /*!< Memory to memory mode enable */ + +/****************** Bit definition for DMA_CNDTR1 register ******************/ +#define DMA_CNDTR1_NDT ((uint16_t)0xFFFF) /*!< Number of data to Transfer */ + +/****************** Bit definition for DMA_CNDTR2 register ******************/ +#define DMA_CNDTR2_NDT ((uint16_t)0xFFFF) /*!< Number of data to Transfer */ + +/****************** Bit definition for DMA_CNDTR3 register ******************/ +#define DMA_CNDTR3_NDT ((uint16_t)0xFFFF) /*!< Number of data to Transfer */ + +/****************** Bit definition for DMA_CNDTR4 register ******************/ +#define DMA_CNDTR4_NDT ((uint16_t)0xFFFF) /*!< Number of data to Transfer */ + +/****************** Bit definition for DMA_CNDTR5 register ******************/ +#define DMA_CNDTR5_NDT ((uint16_t)0xFFFF) /*!< Number of data to Transfer */ + +/****************** Bit definition for DMA_CNDTR6 register ******************/ +#define DMA_CNDTR6_NDT ((uint16_t)0xFFFF) /*!< Number of data to Transfer */ + +/****************** Bit definition for DMA_CNDTR7 register ******************/ +#define DMA_CNDTR7_NDT ((uint16_t)0xFFFF) /*!< Number of data to Transfer */ + +/****************** Bit definition for DMA_CPAR1 register *******************/ +#define DMA_CPAR1_PA ((uint32_t)0xFFFFFFFF) /*!< Peripheral Address */ + +/****************** Bit definition for DMA_CPAR2 register *******************/ +#define DMA_CPAR2_PA ((uint32_t)0xFFFFFFFF) /*!< Peripheral Address */ + +/****************** Bit definition for DMA_CPAR3 register *******************/ +#define DMA_CPAR3_PA ((uint32_t)0xFFFFFFFF) /*!< Peripheral Address */ + + +/****************** Bit definition for DMA_CPAR4 register *******************/ +#define DMA_CPAR4_PA ((uint32_t)0xFFFFFFFF) /*!< Peripheral Address */ + +/****************** Bit definition for DMA_CPAR5 register *******************/ +#define DMA_CPAR5_PA ((uint32_t)0xFFFFFFFF) /*!< Peripheral Address */ + +/****************** Bit definition for DMA_CPAR6 register *******************/ +#define DMA_CPAR6_PA ((uint32_t)0xFFFFFFFF) /*!< Peripheral Address */ + + +/****************** Bit definition for DMA_CPAR7 register *******************/ +#define DMA_CPAR7_PA ((uint32_t)0xFFFFFFFF) /*!< Peripheral Address */ + +/****************** Bit definition for DMA_CMAR1 register *******************/ +#define DMA_CMAR1_MA ((uint32_t)0xFFFFFFFF) /*!< Memory Address */ + +/****************** Bit definition for DMA_CMAR2 register *******************/ +#define DMA_CMAR2_MA ((uint32_t)0xFFFFFFFF) /*!< Memory Address */ + +/****************** Bit definition for DMA_CMAR3 register *******************/ +#define DMA_CMAR3_MA ((uint32_t)0xFFFFFFFF) /*!< Memory Address */ + + +/****************** Bit definition for DMA_CMAR4 register *******************/ +#define DMA_CMAR4_MA ((uint32_t)0xFFFFFFFF) /*!< Memory Address */ + +/****************** Bit definition for DMA_CMAR5 register *******************/ +#define DMA_CMAR5_MA ((uint32_t)0xFFFFFFFF) /*!< Memory Address */ + +/****************** Bit definition for DMA_CMAR6 register *******************/ +#define DMA_CMAR6_MA ((uint32_t)0xFFFFFFFF) /*!< Memory Address */ + +/****************** Bit definition for DMA_CMAR7 register *******************/ +#define DMA_CMAR7_MA ((uint32_t)0xFFFFFFFF) /*!< Memory Address */ + +/******************************************************************************/ +/* */ +/* Analog to Digital Converter */ +/* */ +/******************************************************************************/ + +/******************** Bit definition for ADC_SR register ********************/ +#define ADC_SR_AWD ((uint8_t)0x01) /*!< Analog watchdog flag */ +#define ADC_SR_EOC ((uint8_t)0x02) /*!< End of conversion */ +#define ADC_SR_JEOC ((uint8_t)0x04) /*!< Injected channel end of conversion */ +#define ADC_SR_JSTRT ((uint8_t)0x08) /*!< Injected channel Start flag */ +#define ADC_SR_STRT ((uint8_t)0x10) /*!< Regular channel Start flag */ + +/******************* Bit definition for ADC_CR1 register ********************/ +#define ADC_CR1_AWDCH ((uint32_t)0x0000001F) /*!< AWDCH[4:0] bits (Analog watchdog channel select bits) */ +#define ADC_CR1_AWDCH_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define ADC_CR1_AWDCH_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define ADC_CR1_AWDCH_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define ADC_CR1_AWDCH_3 ((uint32_t)0x00000008) /*!< Bit 3 */ +#define ADC_CR1_AWDCH_4 ((uint32_t)0x00000010) /*!< Bit 4 */ + +#define ADC_CR1_EOCIE ((uint32_t)0x00000020) /*!< Interrupt enable for EOC */ +#define ADC_CR1_AWDIE ((uint32_t)0x00000040) /*!< Analog Watchdog interrupt enable */ +#define ADC_CR1_JEOCIE ((uint32_t)0x00000080) /*!< Interrupt enable for injected channels */ +#define ADC_CR1_SCAN ((uint32_t)0x00000100) /*!< Scan mode */ +#define ADC_CR1_AWDSGL ((uint32_t)0x00000200) /*!< Enable the watchdog on a single channel in scan mode */ +#define ADC_CR1_JAUTO ((uint32_t)0x00000400) /*!< Automatic injected group conversion */ +#define ADC_CR1_DISCEN ((uint32_t)0x00000800) /*!< Discontinuous mode on regular channels */ +#define ADC_CR1_JDISCEN ((uint32_t)0x00001000) /*!< Discontinuous mode on injected channels */ + +#define ADC_CR1_DISCNUM ((uint32_t)0x0000E000) /*!< DISCNUM[2:0] bits (Discontinuous mode channel count) */ +#define ADC_CR1_DISCNUM_0 ((uint32_t)0x00002000) /*!< Bit 0 */ +#define ADC_CR1_DISCNUM_1 ((uint32_t)0x00004000) /*!< Bit 1 */ +#define ADC_CR1_DISCNUM_2 ((uint32_t)0x00008000) /*!< Bit 2 */ + +#define ADC_CR1_DUALMOD ((uint32_t)0x000F0000) /*!< DUALMOD[3:0] bits (Dual mode selection) */ +#define ADC_CR1_DUALMOD_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define ADC_CR1_DUALMOD_1 ((uint32_t)0x00020000) /*!< Bit 1 */ +#define ADC_CR1_DUALMOD_2 ((uint32_t)0x00040000) /*!< Bit 2 */ +#define ADC_CR1_DUALMOD_3 ((uint32_t)0x00080000) /*!< Bit 3 */ + +#define ADC_CR1_JAWDEN ((uint32_t)0x00400000) /*!< Analog watchdog enable on injected channels */ +#define ADC_CR1_AWDEN ((uint32_t)0x00800000) /*!< Analog watchdog enable on regular channels */ + + +/******************* Bit definition for ADC_CR2 register ********************/ +#define ADC_CR2_ADON ((uint32_t)0x00000001) /*!< A/D Converter ON / OFF */ +#define ADC_CR2_CONT ((uint32_t)0x00000002) /*!< Continuous Conversion */ +#define ADC_CR2_CAL ((uint32_t)0x00000004) /*!< A/D Calibration */ +#define ADC_CR2_RSTCAL ((uint32_t)0x00000008) /*!< Reset Calibration */ +#define ADC_CR2_DMA ((uint32_t)0x00000100) /*!< Direct Memory access mode */ +#define ADC_CR2_ALIGN ((uint32_t)0x00000800) /*!< Data Alignment */ + +#define ADC_CR2_JEXTSEL ((uint32_t)0x00007000) /*!< JEXTSEL[2:0] bits (External event select for injected group) */ +#define ADC_CR2_JEXTSEL_0 ((uint32_t)0x00001000) /*!< Bit 0 */ +#define ADC_CR2_JEXTSEL_1 ((uint32_t)0x00002000) /*!< Bit 1 */ +#define ADC_CR2_JEXTSEL_2 ((uint32_t)0x00004000) /*!< Bit 2 */ + +#define ADC_CR2_JEXTTRIG ((uint32_t)0x00008000) /*!< External Trigger Conversion mode for injected channels */ + +#define ADC_CR2_EXTSEL ((uint32_t)0x000E0000) /*!< EXTSEL[2:0] bits (External Event Select for regular group) */ +#define ADC_CR2_EXTSEL_0 ((uint32_t)0x00020000) /*!< Bit 0 */ +#define ADC_CR2_EXTSEL_1 ((uint32_t)0x00040000) /*!< Bit 1 */ +#define ADC_CR2_EXTSEL_2 ((uint32_t)0x00080000) /*!< Bit 2 */ + +#define ADC_CR2_EXTTRIG ((uint32_t)0x00100000) /*!< External Trigger Conversion mode for regular channels */ +#define ADC_CR2_JSWSTART ((uint32_t)0x00200000) /*!< Start Conversion of injected channels */ +#define ADC_CR2_SWSTART ((uint32_t)0x00400000) /*!< Start Conversion of regular channels */ +#define ADC_CR2_TSVREFE ((uint32_t)0x00800000) /*!< Temperature Sensor and VREFINT Enable */ + +/****************** Bit definition for ADC_SMPR1 register *******************/ +#define ADC_SMPR1_SMP10 ((uint32_t)0x00000007) /*!< SMP10[2:0] bits (Channel 10 Sample time selection) */ +#define ADC_SMPR1_SMP10_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define ADC_SMPR1_SMP10_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define ADC_SMPR1_SMP10_2 ((uint32_t)0x00000004) /*!< Bit 2 */ + +#define ADC_SMPR1_SMP11 ((uint32_t)0x00000038) /*!< SMP11[2:0] bits (Channel 11 Sample time selection) */ +#define ADC_SMPR1_SMP11_0 ((uint32_t)0x00000008) /*!< Bit 0 */ +#define ADC_SMPR1_SMP11_1 ((uint32_t)0x00000010) /*!< Bit 1 */ +#define ADC_SMPR1_SMP11_2 ((uint32_t)0x00000020) /*!< Bit 2 */ + +#define ADC_SMPR1_SMP12 ((uint32_t)0x000001C0) /*!< SMP12[2:0] bits (Channel 12 Sample time selection) */ +#define ADC_SMPR1_SMP12_0 ((uint32_t)0x00000040) /*!< Bit 0 */ +#define ADC_SMPR1_SMP12_1 ((uint32_t)0x00000080) /*!< Bit 1 */ +#define ADC_SMPR1_SMP12_2 ((uint32_t)0x00000100) /*!< Bit 2 */ + +#define ADC_SMPR1_SMP13 ((uint32_t)0x00000E00) /*!< SMP13[2:0] bits (Channel 13 Sample time selection) */ +#define ADC_SMPR1_SMP13_0 ((uint32_t)0x00000200) /*!< Bit 0 */ +#define ADC_SMPR1_SMP13_1 ((uint32_t)0x00000400) /*!< Bit 1 */ +#define ADC_SMPR1_SMP13_2 ((uint32_t)0x00000800) /*!< Bit 2 */ + +#define ADC_SMPR1_SMP14 ((uint32_t)0x00007000) /*!< SMP14[2:0] bits (Channel 14 Sample time selection) */ +#define ADC_SMPR1_SMP14_0 ((uint32_t)0x00001000) /*!< Bit 0 */ +#define ADC_SMPR1_SMP14_1 ((uint32_t)0x00002000) /*!< Bit 1 */ +#define ADC_SMPR1_SMP14_2 ((uint32_t)0x00004000) /*!< Bit 2 */ + +#define ADC_SMPR1_SMP15 ((uint32_t)0x00038000) /*!< SMP15[2:0] bits (Channel 15 Sample time selection) */ +#define ADC_SMPR1_SMP15_0 ((uint32_t)0x00008000) /*!< Bit 0 */ +#define ADC_SMPR1_SMP15_1 ((uint32_t)0x00010000) /*!< Bit 1 */ +#define ADC_SMPR1_SMP15_2 ((uint32_t)0x00020000) /*!< Bit 2 */ + +#define ADC_SMPR1_SMP16 ((uint32_t)0x001C0000) /*!< SMP16[2:0] bits (Channel 16 Sample time selection) */ +#define ADC_SMPR1_SMP16_0 ((uint32_t)0x00040000) /*!< Bit 0 */ +#define ADC_SMPR1_SMP16_1 ((uint32_t)0x00080000) /*!< Bit 1 */ +#define ADC_SMPR1_SMP16_2 ((uint32_t)0x00100000) /*!< Bit 2 */ + +#define ADC_SMPR1_SMP17 ((uint32_t)0x00E00000) /*!< SMP17[2:0] bits (Channel 17 Sample time selection) */ +#define ADC_SMPR1_SMP17_0 ((uint32_t)0x00200000) /*!< Bit 0 */ +#define ADC_SMPR1_SMP17_1 ((uint32_t)0x00400000) /*!< Bit 1 */ +#define ADC_SMPR1_SMP17_2 ((uint32_t)0x00800000) /*!< Bit 2 */ + +/****************** Bit definition for ADC_SMPR2 register *******************/ +#define ADC_SMPR2_SMP0 ((uint32_t)0x00000007) /*!< SMP0[2:0] bits (Channel 0 Sample time selection) */ +#define ADC_SMPR2_SMP0_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define ADC_SMPR2_SMP0_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define ADC_SMPR2_SMP0_2 ((uint32_t)0x00000004) /*!< Bit 2 */ + +#define ADC_SMPR2_SMP1 ((uint32_t)0x00000038) /*!< SMP1[2:0] bits (Channel 1 Sample time selection) */ +#define ADC_SMPR2_SMP1_0 ((uint32_t)0x00000008) /*!< Bit 0 */ +#define ADC_SMPR2_SMP1_1 ((uint32_t)0x00000010) /*!< Bit 1 */ +#define ADC_SMPR2_SMP1_2 ((uint32_t)0x00000020) /*!< Bit 2 */ + +#define ADC_SMPR2_SMP2 ((uint32_t)0x000001C0) /*!< SMP2[2:0] bits (Channel 2 Sample time selection) */ +#define ADC_SMPR2_SMP2_0 ((uint32_t)0x00000040) /*!< Bit 0 */ +#define ADC_SMPR2_SMP2_1 ((uint32_t)0x00000080) /*!< Bit 1 */ +#define ADC_SMPR2_SMP2_2 ((uint32_t)0x00000100) /*!< Bit 2 */ + +#define ADC_SMPR2_SMP3 ((uint32_t)0x00000E00) /*!< SMP3[2:0] bits (Channel 3 Sample time selection) */ +#define ADC_SMPR2_SMP3_0 ((uint32_t)0x00000200) /*!< Bit 0 */ +#define ADC_SMPR2_SMP3_1 ((uint32_t)0x00000400) /*!< Bit 1 */ +#define ADC_SMPR2_SMP3_2 ((uint32_t)0x00000800) /*!< Bit 2 */ + +#define ADC_SMPR2_SMP4 ((uint32_t)0x00007000) /*!< SMP4[2:0] bits (Channel 4 Sample time selection) */ +#define ADC_SMPR2_SMP4_0 ((uint32_t)0x00001000) /*!< Bit 0 */ +#define ADC_SMPR2_SMP4_1 ((uint32_t)0x00002000) /*!< Bit 1 */ +#define ADC_SMPR2_SMP4_2 ((uint32_t)0x00004000) /*!< Bit 2 */ + +#define ADC_SMPR2_SMP5 ((uint32_t)0x00038000) /*!< SMP5[2:0] bits (Channel 5 Sample time selection) */ +#define ADC_SMPR2_SMP5_0 ((uint32_t)0x00008000) /*!< Bit 0 */ +#define ADC_SMPR2_SMP5_1 ((uint32_t)0x00010000) /*!< Bit 1 */ +#define ADC_SMPR2_SMP5_2 ((uint32_t)0x00020000) /*!< Bit 2 */ + +#define ADC_SMPR2_SMP6 ((uint32_t)0x001C0000) /*!< SMP6[2:0] bits (Channel 6 Sample time selection) */ +#define ADC_SMPR2_SMP6_0 ((uint32_t)0x00040000) /*!< Bit 0 */ +#define ADC_SMPR2_SMP6_1 ((uint32_t)0x00080000) /*!< Bit 1 */ +#define ADC_SMPR2_SMP6_2 ((uint32_t)0x00100000) /*!< Bit 2 */ + +#define ADC_SMPR2_SMP7 ((uint32_t)0x00E00000) /*!< SMP7[2:0] bits (Channel 7 Sample time selection) */ +#define ADC_SMPR2_SMP7_0 ((uint32_t)0x00200000) /*!< Bit 0 */ +#define ADC_SMPR2_SMP7_1 ((uint32_t)0x00400000) /*!< Bit 1 */ +#define ADC_SMPR2_SMP7_2 ((uint32_t)0x00800000) /*!< Bit 2 */ + +#define ADC_SMPR2_SMP8 ((uint32_t)0x07000000) /*!< SMP8[2:0] bits (Channel 8 Sample time selection) */ +#define ADC_SMPR2_SMP8_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define ADC_SMPR2_SMP8_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define ADC_SMPR2_SMP8_2 ((uint32_t)0x04000000) /*!< Bit 2 */ + +#define ADC_SMPR2_SMP9 ((uint32_t)0x38000000) /*!< SMP9[2:0] bits (Channel 9 Sample time selection) */ +#define ADC_SMPR2_SMP9_0 ((uint32_t)0x08000000) /*!< Bit 0 */ +#define ADC_SMPR2_SMP9_1 ((uint32_t)0x10000000) /*!< Bit 1 */ +#define ADC_SMPR2_SMP9_2 ((uint32_t)0x20000000) /*!< Bit 2 */ + +/****************** Bit definition for ADC_JOFR1 register *******************/ +#define ADC_JOFR1_JOFFSET1 ((uint16_t)0x0FFF) /*!< Data offset for injected channel 1 */ + +/****************** Bit definition for ADC_JOFR2 register *******************/ +#define ADC_JOFR2_JOFFSET2 ((uint16_t)0x0FFF) /*!< Data offset for injected channel 2 */ + +/****************** Bit definition for ADC_JOFR3 register *******************/ +#define ADC_JOFR3_JOFFSET3 ((uint16_t)0x0FFF) /*!< Data offset for injected channel 3 */ + +/****************** Bit definition for ADC_JOFR4 register *******************/ +#define ADC_JOFR4_JOFFSET4 ((uint16_t)0x0FFF) /*!< Data offset for injected channel 4 */ + +/******************* Bit definition for ADC_HTR register ********************/ +#define ADC_HTR_HT ((uint16_t)0x0FFF) /*!< Analog watchdog high threshold */ + +/******************* Bit definition for ADC_LTR register ********************/ +#define ADC_LTR_LT ((uint16_t)0x0FFF) /*!< Analog watchdog low threshold */ + +/******************* Bit definition for ADC_SQR1 register *******************/ +#define ADC_SQR1_SQ13 ((uint32_t)0x0000001F) /*!< SQ13[4:0] bits (13th conversion in regular sequence) */ +#define ADC_SQR1_SQ13_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define ADC_SQR1_SQ13_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define ADC_SQR1_SQ13_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define ADC_SQR1_SQ13_3 ((uint32_t)0x00000008) /*!< Bit 3 */ +#define ADC_SQR1_SQ13_4 ((uint32_t)0x00000010) /*!< Bit 4 */ + +#define ADC_SQR1_SQ14 ((uint32_t)0x000003E0) /*!< SQ14[4:0] bits (14th conversion in regular sequence) */ +#define ADC_SQR1_SQ14_0 ((uint32_t)0x00000020) /*!< Bit 0 */ +#define ADC_SQR1_SQ14_1 ((uint32_t)0x00000040) /*!< Bit 1 */ +#define ADC_SQR1_SQ14_2 ((uint32_t)0x00000080) /*!< Bit 2 */ +#define ADC_SQR1_SQ14_3 ((uint32_t)0x00000100) /*!< Bit 3 */ +#define ADC_SQR1_SQ14_4 ((uint32_t)0x00000200) /*!< Bit 4 */ + +#define ADC_SQR1_SQ15 ((uint32_t)0x00007C00) /*!< SQ15[4:0] bits (15th conversion in regular sequence) */ +#define ADC_SQR1_SQ15_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define ADC_SQR1_SQ15_1 ((uint32_t)0x00000800) /*!< Bit 1 */ +#define ADC_SQR1_SQ15_2 ((uint32_t)0x00001000) /*!< Bit 2 */ +#define ADC_SQR1_SQ15_3 ((uint32_t)0x00002000) /*!< Bit 3 */ +#define ADC_SQR1_SQ15_4 ((uint32_t)0x00004000) /*!< Bit 4 */ + +#define ADC_SQR1_SQ16 ((uint32_t)0x000F8000) /*!< SQ16[4:0] bits (16th conversion in regular sequence) */ +#define ADC_SQR1_SQ16_0 ((uint32_t)0x00008000) /*!< Bit 0 */ +#define ADC_SQR1_SQ16_1 ((uint32_t)0x00010000) /*!< Bit 1 */ +#define ADC_SQR1_SQ16_2 ((uint32_t)0x00020000) /*!< Bit 2 */ +#define ADC_SQR1_SQ16_3 ((uint32_t)0x00040000) /*!< Bit 3 */ +#define ADC_SQR1_SQ16_4 ((uint32_t)0x00080000) /*!< Bit 4 */ + +#define ADC_SQR1_L ((uint32_t)0x00F00000) /*!< L[3:0] bits (Regular channel sequence length) */ +#define ADC_SQR1_L_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define ADC_SQR1_L_1 ((uint32_t)0x00200000) /*!< Bit 1 */ +#define ADC_SQR1_L_2 ((uint32_t)0x00400000) /*!< Bit 2 */ +#define ADC_SQR1_L_3 ((uint32_t)0x00800000) /*!< Bit 3 */ + +/******************* Bit definition for ADC_SQR2 register *******************/ +#define ADC_SQR2_SQ7 ((uint32_t)0x0000001F) /*!< SQ7[4:0] bits (7th conversion in regular sequence) */ +#define ADC_SQR2_SQ7_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define ADC_SQR2_SQ7_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define ADC_SQR2_SQ7_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define ADC_SQR2_SQ7_3 ((uint32_t)0x00000008) /*!< Bit 3 */ +#define ADC_SQR2_SQ7_4 ((uint32_t)0x00000010) /*!< Bit 4 */ + +#define ADC_SQR2_SQ8 ((uint32_t)0x000003E0) /*!< SQ8[4:0] bits (8th conversion in regular sequence) */ +#define ADC_SQR2_SQ8_0 ((uint32_t)0x00000020) /*!< Bit 0 */ +#define ADC_SQR2_SQ8_1 ((uint32_t)0x00000040) /*!< Bit 1 */ +#define ADC_SQR2_SQ8_2 ((uint32_t)0x00000080) /*!< Bit 2 */ +#define ADC_SQR2_SQ8_3 ((uint32_t)0x00000100) /*!< Bit 3 */ +#define ADC_SQR2_SQ8_4 ((uint32_t)0x00000200) /*!< Bit 4 */ + +#define ADC_SQR2_SQ9 ((uint32_t)0x00007C00) /*!< SQ9[4:0] bits (9th conversion in regular sequence) */ +#define ADC_SQR2_SQ9_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define ADC_SQR2_SQ9_1 ((uint32_t)0x00000800) /*!< Bit 1 */ +#define ADC_SQR2_SQ9_2 ((uint32_t)0x00001000) /*!< Bit 2 */ +#define ADC_SQR2_SQ9_3 ((uint32_t)0x00002000) /*!< Bit 3 */ +#define ADC_SQR2_SQ9_4 ((uint32_t)0x00004000) /*!< Bit 4 */ + +#define ADC_SQR2_SQ10 ((uint32_t)0x000F8000) /*!< SQ10[4:0] bits (10th conversion in regular sequence) */ +#define ADC_SQR2_SQ10_0 ((uint32_t)0x00008000) /*!< Bit 0 */ +#define ADC_SQR2_SQ10_1 ((uint32_t)0x00010000) /*!< Bit 1 */ +#define ADC_SQR2_SQ10_2 ((uint32_t)0x00020000) /*!< Bit 2 */ +#define ADC_SQR2_SQ10_3 ((uint32_t)0x00040000) /*!< Bit 3 */ +#define ADC_SQR2_SQ10_4 ((uint32_t)0x00080000) /*!< Bit 4 */ + +#define ADC_SQR2_SQ11 ((uint32_t)0x01F00000) /*!< SQ11[4:0] bits (11th conversion in regular sequence) */ +#define ADC_SQR2_SQ11_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define ADC_SQR2_SQ11_1 ((uint32_t)0x00200000) /*!< Bit 1 */ +#define ADC_SQR2_SQ11_2 ((uint32_t)0x00400000) /*!< Bit 2 */ +#define ADC_SQR2_SQ11_3 ((uint32_t)0x00800000) /*!< Bit 3 */ +#define ADC_SQR2_SQ11_4 ((uint32_t)0x01000000) /*!< Bit 4 */ + +#define ADC_SQR2_SQ12 ((uint32_t)0x3E000000) /*!< SQ12[4:0] bits (12th conversion in regular sequence) */ +#define ADC_SQR2_SQ12_0 ((uint32_t)0x02000000) /*!< Bit 0 */ +#define ADC_SQR2_SQ12_1 ((uint32_t)0x04000000) /*!< Bit 1 */ +#define ADC_SQR2_SQ12_2 ((uint32_t)0x08000000) /*!< Bit 2 */ +#define ADC_SQR2_SQ12_3 ((uint32_t)0x10000000) /*!< Bit 3 */ +#define ADC_SQR2_SQ12_4 ((uint32_t)0x20000000) /*!< Bit 4 */ + +/******************* Bit definition for ADC_SQR3 register *******************/ +#define ADC_SQR3_SQ1 ((uint32_t)0x0000001F) /*!< SQ1[4:0] bits (1st conversion in regular sequence) */ +#define ADC_SQR3_SQ1_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define ADC_SQR3_SQ1_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define ADC_SQR3_SQ1_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define ADC_SQR3_SQ1_3 ((uint32_t)0x00000008) /*!< Bit 3 */ +#define ADC_SQR3_SQ1_4 ((uint32_t)0x00000010) /*!< Bit 4 */ + +#define ADC_SQR3_SQ2 ((uint32_t)0x000003E0) /*!< SQ2[4:0] bits (2nd conversion in regular sequence) */ +#define ADC_SQR3_SQ2_0 ((uint32_t)0x00000020) /*!< Bit 0 */ +#define ADC_SQR3_SQ2_1 ((uint32_t)0x00000040) /*!< Bit 1 */ +#define ADC_SQR3_SQ2_2 ((uint32_t)0x00000080) /*!< Bit 2 */ +#define ADC_SQR3_SQ2_3 ((uint32_t)0x00000100) /*!< Bit 3 */ +#define ADC_SQR3_SQ2_4 ((uint32_t)0x00000200) /*!< Bit 4 */ + +#define ADC_SQR3_SQ3 ((uint32_t)0x00007C00) /*!< SQ3[4:0] bits (3rd conversion in regular sequence) */ +#define ADC_SQR3_SQ3_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define ADC_SQR3_SQ3_1 ((uint32_t)0x00000800) /*!< Bit 1 */ +#define ADC_SQR3_SQ3_2 ((uint32_t)0x00001000) /*!< Bit 2 */ +#define ADC_SQR3_SQ3_3 ((uint32_t)0x00002000) /*!< Bit 3 */ +#define ADC_SQR3_SQ3_4 ((uint32_t)0x00004000) /*!< Bit 4 */ + +#define ADC_SQR3_SQ4 ((uint32_t)0x000F8000) /*!< SQ4[4:0] bits (4th conversion in regular sequence) */ +#define ADC_SQR3_SQ4_0 ((uint32_t)0x00008000) /*!< Bit 0 */ +#define ADC_SQR3_SQ4_1 ((uint32_t)0x00010000) /*!< Bit 1 */ +#define ADC_SQR3_SQ4_2 ((uint32_t)0x00020000) /*!< Bit 2 */ +#define ADC_SQR3_SQ4_3 ((uint32_t)0x00040000) /*!< Bit 3 */ +#define ADC_SQR3_SQ4_4 ((uint32_t)0x00080000) /*!< Bit 4 */ + +#define ADC_SQR3_SQ5 ((uint32_t)0x01F00000) /*!< SQ5[4:0] bits (5th conversion in regular sequence) */ +#define ADC_SQR3_SQ5_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define ADC_SQR3_SQ5_1 ((uint32_t)0x00200000) /*!< Bit 1 */ +#define ADC_SQR3_SQ5_2 ((uint32_t)0x00400000) /*!< Bit 2 */ +#define ADC_SQR3_SQ5_3 ((uint32_t)0x00800000) /*!< Bit 3 */ +#define ADC_SQR3_SQ5_4 ((uint32_t)0x01000000) /*!< Bit 4 */ + +#define ADC_SQR3_SQ6 ((uint32_t)0x3E000000) /*!< SQ6[4:0] bits (6th conversion in regular sequence) */ +#define ADC_SQR3_SQ6_0 ((uint32_t)0x02000000) /*!< Bit 0 */ +#define ADC_SQR3_SQ6_1 ((uint32_t)0x04000000) /*!< Bit 1 */ +#define ADC_SQR3_SQ6_2 ((uint32_t)0x08000000) /*!< Bit 2 */ +#define ADC_SQR3_SQ6_3 ((uint32_t)0x10000000) /*!< Bit 3 */ +#define ADC_SQR3_SQ6_4 ((uint32_t)0x20000000) /*!< Bit 4 */ + +/******************* Bit definition for ADC_JSQR register *******************/ +#define ADC_JSQR_JSQ1 ((uint32_t)0x0000001F) /*!< JSQ1[4:0] bits (1st conversion in injected sequence) */ +#define ADC_JSQR_JSQ1_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define ADC_JSQR_JSQ1_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define ADC_JSQR_JSQ1_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define ADC_JSQR_JSQ1_3 ((uint32_t)0x00000008) /*!< Bit 3 */ +#define ADC_JSQR_JSQ1_4 ((uint32_t)0x00000010) /*!< Bit 4 */ + +#define ADC_JSQR_JSQ2 ((uint32_t)0x000003E0) /*!< JSQ2[4:0] bits (2nd conversion in injected sequence) */ +#define ADC_JSQR_JSQ2_0 ((uint32_t)0x00000020) /*!< Bit 0 */ +#define ADC_JSQR_JSQ2_1 ((uint32_t)0x00000040) /*!< Bit 1 */ +#define ADC_JSQR_JSQ2_2 ((uint32_t)0x00000080) /*!< Bit 2 */ +#define ADC_JSQR_JSQ2_3 ((uint32_t)0x00000100) /*!< Bit 3 */ +#define ADC_JSQR_JSQ2_4 ((uint32_t)0x00000200) /*!< Bit 4 */ + +#define ADC_JSQR_JSQ3 ((uint32_t)0x00007C00) /*!< JSQ3[4:0] bits (3rd conversion in injected sequence) */ +#define ADC_JSQR_JSQ3_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define ADC_JSQR_JSQ3_1 ((uint32_t)0x00000800) /*!< Bit 1 */ +#define ADC_JSQR_JSQ3_2 ((uint32_t)0x00001000) /*!< Bit 2 */ +#define ADC_JSQR_JSQ3_3 ((uint32_t)0x00002000) /*!< Bit 3 */ +#define ADC_JSQR_JSQ3_4 ((uint32_t)0x00004000) /*!< Bit 4 */ + +#define ADC_JSQR_JSQ4 ((uint32_t)0x000F8000) /*!< JSQ4[4:0] bits (4th conversion in injected sequence) */ +#define ADC_JSQR_JSQ4_0 ((uint32_t)0x00008000) /*!< Bit 0 */ +#define ADC_JSQR_JSQ4_1 ((uint32_t)0x00010000) /*!< Bit 1 */ +#define ADC_JSQR_JSQ4_2 ((uint32_t)0x00020000) /*!< Bit 2 */ +#define ADC_JSQR_JSQ4_3 ((uint32_t)0x00040000) /*!< Bit 3 */ +#define ADC_JSQR_JSQ4_4 ((uint32_t)0x00080000) /*!< Bit 4 */ + +#define ADC_JSQR_JL ((uint32_t)0x00300000) /*!< JL[1:0] bits (Injected Sequence length) */ +#define ADC_JSQR_JL_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define ADC_JSQR_JL_1 ((uint32_t)0x00200000) /*!< Bit 1 */ + +/******************* Bit definition for ADC_JDR1 register *******************/ +#define ADC_JDR1_JDATA ((uint16_t)0xFFFF) /*!< Injected data */ + +/******************* Bit definition for ADC_JDR2 register *******************/ +#define ADC_JDR2_JDATA ((uint16_t)0xFFFF) /*!< Injected data */ + +/******************* Bit definition for ADC_JDR3 register *******************/ +#define ADC_JDR3_JDATA ((uint16_t)0xFFFF) /*!< Injected data */ + +/******************* Bit definition for ADC_JDR4 register *******************/ +#define ADC_JDR4_JDATA ((uint16_t)0xFFFF) /*!< Injected data */ + +/******************** Bit definition for ADC_DR register ********************/ +#define ADC_DR_DATA ((uint32_t)0x0000FFFF) /*!< Regular data */ +#define ADC_DR_ADC2DATA ((uint32_t)0xFFFF0000) /*!< ADC2 data */ + +/******************************************************************************/ +/* */ +/* Digital to Analog Converter */ +/* */ +/******************************************************************************/ + +/******************** Bit definition for DAC_CR register ********************/ +#define DAC_CR_EN1 ((uint32_t)0x00000001) /*!< DAC channel1 enable */ +#define DAC_CR_BOFF1 ((uint32_t)0x00000002) /*!< DAC channel1 output buffer disable */ +#define DAC_CR_TEN1 ((uint32_t)0x00000004) /*!< DAC channel1 Trigger enable */ + +#define DAC_CR_TSEL1 ((uint32_t)0x00000038) /*!< TSEL1[2:0] (DAC channel1 Trigger selection) */ +#define DAC_CR_TSEL1_0 ((uint32_t)0x00000008) /*!< Bit 0 */ +#define DAC_CR_TSEL1_1 ((uint32_t)0x00000010) /*!< Bit 1 */ +#define DAC_CR_TSEL1_2 ((uint32_t)0x00000020) /*!< Bit 2 */ + +#define DAC_CR_WAVE1 ((uint32_t)0x000000C0) /*!< WAVE1[1:0] (DAC channel1 noise/triangle wave generation enable) */ +#define DAC_CR_WAVE1_0 ((uint32_t)0x00000040) /*!< Bit 0 */ +#define DAC_CR_WAVE1_1 ((uint32_t)0x00000080) /*!< Bit 1 */ + +#define DAC_CR_MAMP1 ((uint32_t)0x00000F00) /*!< MAMP1[3:0] (DAC channel1 Mask/Amplitude selector) */ +#define DAC_CR_MAMP1_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define DAC_CR_MAMP1_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define DAC_CR_MAMP1_2 ((uint32_t)0x00000400) /*!< Bit 2 */ +#define DAC_CR_MAMP1_3 ((uint32_t)0x00000800) /*!< Bit 3 */ + +#define DAC_CR_DMAEN1 ((uint32_t)0x00001000) /*!< DAC channel1 DMA enable */ +#define DAC_CR_EN2 ((uint32_t)0x00010000) /*!< DAC channel2 enable */ +#define DAC_CR_BOFF2 ((uint32_t)0x00020000) /*!< DAC channel2 output buffer disable */ +#define DAC_CR_TEN2 ((uint32_t)0x00040000) /*!< DAC channel2 Trigger enable */ + +#define DAC_CR_TSEL2 ((uint32_t)0x00380000) /*!< TSEL2[2:0] (DAC channel2 Trigger selection) */ +#define DAC_CR_TSEL2_0 ((uint32_t)0x00080000) /*!< Bit 0 */ +#define DAC_CR_TSEL2_1 ((uint32_t)0x00100000) /*!< Bit 1 */ +#define DAC_CR_TSEL2_2 ((uint32_t)0x00200000) /*!< Bit 2 */ + +#define DAC_CR_WAVE2 ((uint32_t)0x00C00000) /*!< WAVE2[1:0] (DAC channel2 noise/triangle wave generation enable) */ +#define DAC_CR_WAVE2_0 ((uint32_t)0x00400000) /*!< Bit 0 */ +#define DAC_CR_WAVE2_1 ((uint32_t)0x00800000) /*!< Bit 1 */ + +#define DAC_CR_MAMP2 ((uint32_t)0x0F000000) /*!< MAMP2[3:0] (DAC channel2 Mask/Amplitude selector) */ +#define DAC_CR_MAMP2_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define DAC_CR_MAMP2_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define DAC_CR_MAMP2_2 ((uint32_t)0x04000000) /*!< Bit 2 */ +#define DAC_CR_MAMP2_3 ((uint32_t)0x08000000) /*!< Bit 3 */ + +#define DAC_CR_DMAEN2 ((uint32_t)0x10000000) /*!< DAC channel2 DMA enabled */ + +/***************** Bit definition for DAC_SWTRIGR register ******************/ +#define DAC_SWTRIGR_SWTRIG1 ((uint8_t)0x01) /*!< DAC channel1 software trigger */ +#define DAC_SWTRIGR_SWTRIG2 ((uint8_t)0x02) /*!< DAC channel2 software trigger */ + +/***************** Bit definition for DAC_DHR12R1 register ******************/ +#define DAC_DHR12R1_DACC1DHR ((uint16_t)0x0FFF) /*!< DAC channel1 12-bit Right aligned data */ + +/***************** Bit definition for DAC_DHR12L1 register ******************/ +#define DAC_DHR12L1_DACC1DHR ((uint16_t)0xFFF0) /*!< DAC channel1 12-bit Left aligned data */ + +/****************** Bit definition for DAC_DHR8R1 register ******************/ +#define DAC_DHR8R1_DACC1DHR ((uint8_t)0xFF) /*!< DAC channel1 8-bit Right aligned data */ + +/***************** Bit definition for DAC_DHR12R2 register ******************/ +#define DAC_DHR12R2_DACC2DHR ((uint16_t)0x0FFF) /*!< DAC channel2 12-bit Right aligned data */ + +/***************** Bit definition for DAC_DHR12L2 register ******************/ +#define DAC_DHR12L2_DACC2DHR ((uint16_t)0xFFF0) /*!< DAC channel2 12-bit Left aligned data */ + +/****************** Bit definition for DAC_DHR8R2 register ******************/ +#define DAC_DHR8R2_DACC2DHR ((uint8_t)0xFF) /*!< DAC channel2 8-bit Right aligned data */ + +/***************** Bit definition for DAC_DHR12RD register ******************/ +#define DAC_DHR12RD_DACC1DHR ((uint32_t)0x00000FFF) /*!< DAC channel1 12-bit Right aligned data */ +#define DAC_DHR12RD_DACC2DHR ((uint32_t)0x0FFF0000) /*!< DAC channel2 12-bit Right aligned data */ + +/***************** Bit definition for DAC_DHR12LD register ******************/ +#define DAC_DHR12LD_DACC1DHR ((uint32_t)0x0000FFF0) /*!< DAC channel1 12-bit Left aligned data */ +#define DAC_DHR12LD_DACC2DHR ((uint32_t)0xFFF00000) /*!< DAC channel2 12-bit Left aligned data */ + +/****************** Bit definition for DAC_DHR8RD register ******************/ +#define DAC_DHR8RD_DACC1DHR ((uint16_t)0x00FF) /*!< DAC channel1 8-bit Right aligned data */ +#define DAC_DHR8RD_DACC2DHR ((uint16_t)0xFF00) /*!< DAC channel2 8-bit Right aligned data */ + +/******************* Bit definition for DAC_DOR1 register *******************/ +#define DAC_DOR1_DACC1DOR ((uint16_t)0x0FFF) /*!< DAC channel1 data output */ + +/******************* Bit definition for DAC_DOR2 register *******************/ +#define DAC_DOR2_DACC2DOR ((uint16_t)0x0FFF) /*!< DAC channel2 data output */ + +/******************** Bit definition for DAC_SR register ********************/ +#define DAC_SR_DMAUDR1 ((uint32_t)0x00002000) /*!< DAC channel1 DMA underrun flag */ +#define DAC_SR_DMAUDR2 ((uint32_t)0x20000000) /*!< DAC channel2 DMA underrun flag */ + +/******************************************************************************/ +/* */ +/* CEC */ +/* */ +/******************************************************************************/ +/******************** Bit definition for CEC_CFGR register ******************/ +#define CEC_CFGR_PE ((uint16_t)0x0001) /*!< Peripheral Enable */ +#define CEC_CFGR_IE ((uint16_t)0x0002) /*!< Interrupt Enable */ +#define CEC_CFGR_BTEM ((uint16_t)0x0004) /*!< Bit Timing Error Mode */ +#define CEC_CFGR_BPEM ((uint16_t)0x0008) /*!< Bit Period Error Mode */ + +/******************** Bit definition for CEC_OAR register ******************/ +#define CEC_OAR_OA ((uint16_t)0x000F) /*!< OA[3:0]: Own Address */ +#define CEC_OAR_OA_0 ((uint16_t)0x0001) /*!< Bit 0 */ +#define CEC_OAR_OA_1 ((uint16_t)0x0002) /*!< Bit 1 */ +#define CEC_OAR_OA_2 ((uint16_t)0x0004) /*!< Bit 2 */ +#define CEC_OAR_OA_3 ((uint16_t)0x0008) /*!< Bit 3 */ + +/******************** Bit definition for CEC_PRES register ******************/ +#define CEC_PRES_PRES ((uint16_t)0x3FFF) /*!< Prescaler Counter Value */ + +/******************** Bit definition for CEC_ESR register ******************/ +#define CEC_ESR_BTE ((uint16_t)0x0001) /*!< Bit Timing Error */ +#define CEC_ESR_BPE ((uint16_t)0x0002) /*!< Bit Period Error */ +#define CEC_ESR_RBTFE ((uint16_t)0x0004) /*!< Rx Block Transfer Finished Error */ +#define CEC_ESR_SBE ((uint16_t)0x0008) /*!< Start Bit Error */ +#define CEC_ESR_ACKE ((uint16_t)0x0010) /*!< Block Acknowledge Error */ +#define CEC_ESR_LINE ((uint16_t)0x0020) /*!< Line Error */ +#define CEC_ESR_TBTFE ((uint16_t)0x0040) /*!< Tx Block Transfer Finished Error */ + +/******************** Bit definition for CEC_CSR register ******************/ +#define CEC_CSR_TSOM ((uint16_t)0x0001) /*!< Tx Start Of Message */ +#define CEC_CSR_TEOM ((uint16_t)0x0002) /*!< Tx End Of Message */ +#define CEC_CSR_TERR ((uint16_t)0x0004) /*!< Tx Error */ +#define CEC_CSR_TBTRF ((uint16_t)0x0008) /*!< Tx Byte Transfer Request or Block Transfer Finished */ +#define CEC_CSR_RSOM ((uint16_t)0x0010) /*!< Rx Start Of Message */ +#define CEC_CSR_REOM ((uint16_t)0x0020) /*!< Rx End Of Message */ +#define CEC_CSR_RERR ((uint16_t)0x0040) /*!< Rx Error */ +#define CEC_CSR_RBTF ((uint16_t)0x0080) /*!< Rx Block Transfer Finished */ + +/******************** Bit definition for CEC_TXD register ******************/ +#define CEC_TXD_TXD ((uint16_t)0x00FF) /*!< Tx Data register */ + +/******************** Bit definition for CEC_RXD register ******************/ +#define CEC_RXD_RXD ((uint16_t)0x00FF) /*!< Rx Data register */ + +/******************************************************************************/ +/* */ +/* TIM */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for TIM_CR1 register ********************/ +#define TIM_CR1_CEN ((uint16_t)0x0001) /*!< Counter enable */ +#define TIM_CR1_UDIS ((uint16_t)0x0002) /*!< Update disable */ +#define TIM_CR1_URS ((uint16_t)0x0004) /*!< Update request source */ +#define TIM_CR1_OPM ((uint16_t)0x0008) /*!< One pulse mode */ +#define TIM_CR1_DIR ((uint16_t)0x0010) /*!< Direction */ + +#define TIM_CR1_CMS ((uint16_t)0x0060) /*!< CMS[1:0] bits (Center-aligned mode selection) */ +#define TIM_CR1_CMS_0 ((uint16_t)0x0020) /*!< Bit 0 */ +#define TIM_CR1_CMS_1 ((uint16_t)0x0040) /*!< Bit 1 */ + +#define TIM_CR1_ARPE ((uint16_t)0x0080) /*!< Auto-reload preload enable */ + +#define TIM_CR1_CKD ((uint16_t)0x0300) /*!< CKD[1:0] bits (clock division) */ +#define TIM_CR1_CKD_0 ((uint16_t)0x0100) /*!< Bit 0 */ +#define TIM_CR1_CKD_1 ((uint16_t)0x0200) /*!< Bit 1 */ + +/******************* Bit definition for TIM_CR2 register ********************/ +#define TIM_CR2_CCPC ((uint16_t)0x0001) /*!< Capture/Compare Preloaded Control */ +#define TIM_CR2_CCUS ((uint16_t)0x0004) /*!< Capture/Compare Control Update Selection */ +#define TIM_CR2_CCDS ((uint16_t)0x0008) /*!< Capture/Compare DMA Selection */ + +#define TIM_CR2_MMS ((uint16_t)0x0070) /*!< MMS[2:0] bits (Master Mode Selection) */ +#define TIM_CR2_MMS_0 ((uint16_t)0x0010) /*!< Bit 0 */ +#define TIM_CR2_MMS_1 ((uint16_t)0x0020) /*!< Bit 1 */ +#define TIM_CR2_MMS_2 ((uint16_t)0x0040) /*!< Bit 2 */ + +#define TIM_CR2_TI1S ((uint16_t)0x0080) /*!< TI1 Selection */ +#define TIM_CR2_OIS1 ((uint16_t)0x0100) /*!< Output Idle state 1 (OC1 output) */ +#define TIM_CR2_OIS1N ((uint16_t)0x0200) /*!< Output Idle state 1 (OC1N output) */ +#define TIM_CR2_OIS2 ((uint16_t)0x0400) /*!< Output Idle state 2 (OC2 output) */ +#define TIM_CR2_OIS2N ((uint16_t)0x0800) /*!< Output Idle state 2 (OC2N output) */ +#define TIM_CR2_OIS3 ((uint16_t)0x1000) /*!< Output Idle state 3 (OC3 output) */ +#define TIM_CR2_OIS3N ((uint16_t)0x2000) /*!< Output Idle state 3 (OC3N output) */ +#define TIM_CR2_OIS4 ((uint16_t)0x4000) /*!< Output Idle state 4 (OC4 output) */ + +/******************* Bit definition for TIM_SMCR register *******************/ +#define TIM_SMCR_SMS ((uint16_t)0x0007) /*!< SMS[2:0] bits (Slave mode selection) */ +#define TIM_SMCR_SMS_0 ((uint16_t)0x0001) /*!< Bit 0 */ +#define TIM_SMCR_SMS_1 ((uint16_t)0x0002) /*!< Bit 1 */ +#define TIM_SMCR_SMS_2 ((uint16_t)0x0004) /*!< Bit 2 */ + +#define TIM_SMCR_TS ((uint16_t)0x0070) /*!< TS[2:0] bits (Trigger selection) */ +#define TIM_SMCR_TS_0 ((uint16_t)0x0010) /*!< Bit 0 */ +#define TIM_SMCR_TS_1 ((uint16_t)0x0020) /*!< Bit 1 */ +#define TIM_SMCR_TS_2 ((uint16_t)0x0040) /*!< Bit 2 */ + +#define TIM_SMCR_MSM ((uint16_t)0x0080) /*!< Master/slave mode */ + +#define TIM_SMCR_ETF ((uint16_t)0x0F00) /*!< ETF[3:0] bits (External trigger filter) */ +#define TIM_SMCR_ETF_0 ((uint16_t)0x0100) /*!< Bit 0 */ +#define TIM_SMCR_ETF_1 ((uint16_t)0x0200) /*!< Bit 1 */ +#define TIM_SMCR_ETF_2 ((uint16_t)0x0400) /*!< Bit 2 */ +#define TIM_SMCR_ETF_3 ((uint16_t)0x0800) /*!< Bit 3 */ + +#define TIM_SMCR_ETPS ((uint16_t)0x3000) /*!< ETPS[1:0] bits (External trigger prescaler) */ +#define TIM_SMCR_ETPS_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define TIM_SMCR_ETPS_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define TIM_SMCR_ECE ((uint16_t)0x4000) /*!< External clock enable */ +#define TIM_SMCR_ETP ((uint16_t)0x8000) /*!< External trigger polarity */ + +/******************* Bit definition for TIM_DIER register *******************/ +#define TIM_DIER_UIE ((uint16_t)0x0001) /*!< Update interrupt enable */ +#define TIM_DIER_CC1IE ((uint16_t)0x0002) /*!< Capture/Compare 1 interrupt enable */ +#define TIM_DIER_CC2IE ((uint16_t)0x0004) /*!< Capture/Compare 2 interrupt enable */ +#define TIM_DIER_CC3IE ((uint16_t)0x0008) /*!< Capture/Compare 3 interrupt enable */ +#define TIM_DIER_CC4IE ((uint16_t)0x0010) /*!< Capture/Compare 4 interrupt enable */ +#define TIM_DIER_COMIE ((uint16_t)0x0020) /*!< COM interrupt enable */ +#define TIM_DIER_TIE ((uint16_t)0x0040) /*!< Trigger interrupt enable */ +#define TIM_DIER_BIE ((uint16_t)0x0080) /*!< Break interrupt enable */ +#define TIM_DIER_UDE ((uint16_t)0x0100) /*!< Update DMA request enable */ +#define TIM_DIER_CC1DE ((uint16_t)0x0200) /*!< Capture/Compare 1 DMA request enable */ +#define TIM_DIER_CC2DE ((uint16_t)0x0400) /*!< Capture/Compare 2 DMA request enable */ +#define TIM_DIER_CC3DE ((uint16_t)0x0800) /*!< Capture/Compare 3 DMA request enable */ +#define TIM_DIER_CC4DE ((uint16_t)0x1000) /*!< Capture/Compare 4 DMA request enable */ +#define TIM_DIER_COMDE ((uint16_t)0x2000) /*!< COM DMA request enable */ +#define TIM_DIER_TDE ((uint16_t)0x4000) /*!< Trigger DMA request enable */ + +/******************** Bit definition for TIM_SR register ********************/ +#define TIM_SR_UIF ((uint16_t)0x0001) /*!< Update interrupt Flag */ +#define TIM_SR_CC1IF ((uint16_t)0x0002) /*!< Capture/Compare 1 interrupt Flag */ +#define TIM_SR_CC2IF ((uint16_t)0x0004) /*!< Capture/Compare 2 interrupt Flag */ +#define TIM_SR_CC3IF ((uint16_t)0x0008) /*!< Capture/Compare 3 interrupt Flag */ +#define TIM_SR_CC4IF ((uint16_t)0x0010) /*!< Capture/Compare 4 interrupt Flag */ +#define TIM_SR_COMIF ((uint16_t)0x0020) /*!< COM interrupt Flag */ +#define TIM_SR_TIF ((uint16_t)0x0040) /*!< Trigger interrupt Flag */ +#define TIM_SR_BIF ((uint16_t)0x0080) /*!< Break interrupt Flag */ +#define TIM_SR_CC1OF ((uint16_t)0x0200) /*!< Capture/Compare 1 Overcapture Flag */ +#define TIM_SR_CC2OF ((uint16_t)0x0400) /*!< Capture/Compare 2 Overcapture Flag */ +#define TIM_SR_CC3OF ((uint16_t)0x0800) /*!< Capture/Compare 3 Overcapture Flag */ +#define TIM_SR_CC4OF ((uint16_t)0x1000) /*!< Capture/Compare 4 Overcapture Flag */ + +/******************* Bit definition for TIM_EGR register ********************/ +#define TIM_EGR_UG ((uint8_t)0x01) /*!< Update Generation */ +#define TIM_EGR_CC1G ((uint8_t)0x02) /*!< Capture/Compare 1 Generation */ +#define TIM_EGR_CC2G ((uint8_t)0x04) /*!< Capture/Compare 2 Generation */ +#define TIM_EGR_CC3G ((uint8_t)0x08) /*!< Capture/Compare 3 Generation */ +#define TIM_EGR_CC4G ((uint8_t)0x10) /*!< Capture/Compare 4 Generation */ +#define TIM_EGR_COMG ((uint8_t)0x20) /*!< Capture/Compare Control Update Generation */ +#define TIM_EGR_TG ((uint8_t)0x40) /*!< Trigger Generation */ +#define TIM_EGR_BG ((uint8_t)0x80) /*!< Break Generation */ + +/****************** Bit definition for TIM_CCMR1 register *******************/ +#define TIM_CCMR1_CC1S ((uint16_t)0x0003) /*!< CC1S[1:0] bits (Capture/Compare 1 Selection) */ +#define TIM_CCMR1_CC1S_0 ((uint16_t)0x0001) /*!< Bit 0 */ +#define TIM_CCMR1_CC1S_1 ((uint16_t)0x0002) /*!< Bit 1 */ + +#define TIM_CCMR1_OC1FE ((uint16_t)0x0004) /*!< Output Compare 1 Fast enable */ +#define TIM_CCMR1_OC1PE ((uint16_t)0x0008) /*!< Output Compare 1 Preload enable */ + +#define TIM_CCMR1_OC1M ((uint16_t)0x0070) /*!< OC1M[2:0] bits (Output Compare 1 Mode) */ +#define TIM_CCMR1_OC1M_0 ((uint16_t)0x0010) /*!< Bit 0 */ +#define TIM_CCMR1_OC1M_1 ((uint16_t)0x0020) /*!< Bit 1 */ +#define TIM_CCMR1_OC1M_2 ((uint16_t)0x0040) /*!< Bit 2 */ + +#define TIM_CCMR1_OC1CE ((uint16_t)0x0080) /*!< Output Compare 1Clear Enable */ + +#define TIM_CCMR1_CC2S ((uint16_t)0x0300) /*!< CC2S[1:0] bits (Capture/Compare 2 Selection) */ +#define TIM_CCMR1_CC2S_0 ((uint16_t)0x0100) /*!< Bit 0 */ +#define TIM_CCMR1_CC2S_1 ((uint16_t)0x0200) /*!< Bit 1 */ + +#define TIM_CCMR1_OC2FE ((uint16_t)0x0400) /*!< Output Compare 2 Fast enable */ +#define TIM_CCMR1_OC2PE ((uint16_t)0x0800) /*!< Output Compare 2 Preload enable */ + +#define TIM_CCMR1_OC2M ((uint16_t)0x7000) /*!< OC2M[2:0] bits (Output Compare 2 Mode) */ +#define TIM_CCMR1_OC2M_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define TIM_CCMR1_OC2M_1 ((uint16_t)0x2000) /*!< Bit 1 */ +#define TIM_CCMR1_OC2M_2 ((uint16_t)0x4000) /*!< Bit 2 */ + +#define TIM_CCMR1_OC2CE ((uint16_t)0x8000) /*!< Output Compare 2 Clear Enable */ + +/*----------------------------------------------------------------------------*/ + +#define TIM_CCMR1_IC1PSC ((uint16_t)0x000C) /*!< IC1PSC[1:0] bits (Input Capture 1 Prescaler) */ +#define TIM_CCMR1_IC1PSC_0 ((uint16_t)0x0004) /*!< Bit 0 */ +#define TIM_CCMR1_IC1PSC_1 ((uint16_t)0x0008) /*!< Bit 1 */ + +#define TIM_CCMR1_IC1F ((uint16_t)0x00F0) /*!< IC1F[3:0] bits (Input Capture 1 Filter) */ +#define TIM_CCMR1_IC1F_0 ((uint16_t)0x0010) /*!< Bit 0 */ +#define TIM_CCMR1_IC1F_1 ((uint16_t)0x0020) /*!< Bit 1 */ +#define TIM_CCMR1_IC1F_2 ((uint16_t)0x0040) /*!< Bit 2 */ +#define TIM_CCMR1_IC1F_3 ((uint16_t)0x0080) /*!< Bit 3 */ + +#define TIM_CCMR1_IC2PSC ((uint16_t)0x0C00) /*!< IC2PSC[1:0] bits (Input Capture 2 Prescaler) */ +#define TIM_CCMR1_IC2PSC_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define TIM_CCMR1_IC2PSC_1 ((uint16_t)0x0800) /*!< Bit 1 */ + +#define TIM_CCMR1_IC2F ((uint16_t)0xF000) /*!< IC2F[3:0] bits (Input Capture 2 Filter) */ +#define TIM_CCMR1_IC2F_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define TIM_CCMR1_IC2F_1 ((uint16_t)0x2000) /*!< Bit 1 */ +#define TIM_CCMR1_IC2F_2 ((uint16_t)0x4000) /*!< Bit 2 */ +#define TIM_CCMR1_IC2F_3 ((uint16_t)0x8000) /*!< Bit 3 */ + +/****************** Bit definition for TIM_CCMR2 register *******************/ +#define TIM_CCMR2_CC3S ((uint16_t)0x0003) /*!< CC3S[1:0] bits (Capture/Compare 3 Selection) */ +#define TIM_CCMR2_CC3S_0 ((uint16_t)0x0001) /*!< Bit 0 */ +#define TIM_CCMR2_CC3S_1 ((uint16_t)0x0002) /*!< Bit 1 */ + +#define TIM_CCMR2_OC3FE ((uint16_t)0x0004) /*!< Output Compare 3 Fast enable */ +#define TIM_CCMR2_OC3PE ((uint16_t)0x0008) /*!< Output Compare 3 Preload enable */ + +#define TIM_CCMR2_OC3M ((uint16_t)0x0070) /*!< OC3M[2:0] bits (Output Compare 3 Mode) */ +#define TIM_CCMR2_OC3M_0 ((uint16_t)0x0010) /*!< Bit 0 */ +#define TIM_CCMR2_OC3M_1 ((uint16_t)0x0020) /*!< Bit 1 */ +#define TIM_CCMR2_OC3M_2 ((uint16_t)0x0040) /*!< Bit 2 */ + +#define TIM_CCMR2_OC3CE ((uint16_t)0x0080) /*!< Output Compare 3 Clear Enable */ + +#define TIM_CCMR2_CC4S ((uint16_t)0x0300) /*!< CC4S[1:0] bits (Capture/Compare 4 Selection) */ +#define TIM_CCMR2_CC4S_0 ((uint16_t)0x0100) /*!< Bit 0 */ +#define TIM_CCMR2_CC4S_1 ((uint16_t)0x0200) /*!< Bit 1 */ + +#define TIM_CCMR2_OC4FE ((uint16_t)0x0400) /*!< Output Compare 4 Fast enable */ +#define TIM_CCMR2_OC4PE ((uint16_t)0x0800) /*!< Output Compare 4 Preload enable */ + +#define TIM_CCMR2_OC4M ((uint16_t)0x7000) /*!< OC4M[2:0] bits (Output Compare 4 Mode) */ +#define TIM_CCMR2_OC4M_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define TIM_CCMR2_OC4M_1 ((uint16_t)0x2000) /*!< Bit 1 */ +#define TIM_CCMR2_OC4M_2 ((uint16_t)0x4000) /*!< Bit 2 */ + +#define TIM_CCMR2_OC4CE ((uint16_t)0x8000) /*!< Output Compare 4 Clear Enable */ + +/*----------------------------------------------------------------------------*/ + +#define TIM_CCMR2_IC3PSC ((uint16_t)0x000C) /*!< IC3PSC[1:0] bits (Input Capture 3 Prescaler) */ +#define TIM_CCMR2_IC3PSC_0 ((uint16_t)0x0004) /*!< Bit 0 */ +#define TIM_CCMR2_IC3PSC_1 ((uint16_t)0x0008) /*!< Bit 1 */ + +#define TIM_CCMR2_IC3F ((uint16_t)0x00F0) /*!< IC3F[3:0] bits (Input Capture 3 Filter) */ +#define TIM_CCMR2_IC3F_0 ((uint16_t)0x0010) /*!< Bit 0 */ +#define TIM_CCMR2_IC3F_1 ((uint16_t)0x0020) /*!< Bit 1 */ +#define TIM_CCMR2_IC3F_2 ((uint16_t)0x0040) /*!< Bit 2 */ +#define TIM_CCMR2_IC3F_3 ((uint16_t)0x0080) /*!< Bit 3 */ + +#define TIM_CCMR2_IC4PSC ((uint16_t)0x0C00) /*!< IC4PSC[1:0] bits (Input Capture 4 Prescaler) */ +#define TIM_CCMR2_IC4PSC_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define TIM_CCMR2_IC4PSC_1 ((uint16_t)0x0800) /*!< Bit 1 */ + +#define TIM_CCMR2_IC4F ((uint16_t)0xF000) /*!< IC4F[3:0] bits (Input Capture 4 Filter) */ +#define TIM_CCMR2_IC4F_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define TIM_CCMR2_IC4F_1 ((uint16_t)0x2000) /*!< Bit 1 */ +#define TIM_CCMR2_IC4F_2 ((uint16_t)0x4000) /*!< Bit 2 */ +#define TIM_CCMR2_IC4F_3 ((uint16_t)0x8000) /*!< Bit 3 */ + +/******************* Bit definition for TIM_CCER register *******************/ +#define TIM_CCER_CC1E ((uint16_t)0x0001) /*!< Capture/Compare 1 output enable */ +#define TIM_CCER_CC1P ((uint16_t)0x0002) /*!< Capture/Compare 1 output Polarity */ +#define TIM_CCER_CC1NE ((uint16_t)0x0004) /*!< Capture/Compare 1 Complementary output enable */ +#define TIM_CCER_CC1NP ((uint16_t)0x0008) /*!< Capture/Compare 1 Complementary output Polarity */ +#define TIM_CCER_CC2E ((uint16_t)0x0010) /*!< Capture/Compare 2 output enable */ +#define TIM_CCER_CC2P ((uint16_t)0x0020) /*!< Capture/Compare 2 output Polarity */ +#define TIM_CCER_CC2NE ((uint16_t)0x0040) /*!< Capture/Compare 2 Complementary output enable */ +#define TIM_CCER_CC2NP ((uint16_t)0x0080) /*!< Capture/Compare 2 Complementary output Polarity */ +#define TIM_CCER_CC3E ((uint16_t)0x0100) /*!< Capture/Compare 3 output enable */ +#define TIM_CCER_CC3P ((uint16_t)0x0200) /*!< Capture/Compare 3 output Polarity */ +#define TIM_CCER_CC3NE ((uint16_t)0x0400) /*!< Capture/Compare 3 Complementary output enable */ +#define TIM_CCER_CC3NP ((uint16_t)0x0800) /*!< Capture/Compare 3 Complementary output Polarity */ +#define TIM_CCER_CC4E ((uint16_t)0x1000) /*!< Capture/Compare 4 output enable */ +#define TIM_CCER_CC4P ((uint16_t)0x2000) /*!< Capture/Compare 4 output Polarity */ +#define TIM_CCER_CC4NP ((uint16_t)0x8000) /*!< Capture/Compare 4 Complementary output Polarity */ + +/******************* Bit definition for TIM_CNT register ********************/ +#define TIM_CNT_CNT ((uint16_t)0xFFFF) /*!< Counter Value */ + +/******************* Bit definition for TIM_PSC register ********************/ +#define TIM_PSC_PSC ((uint16_t)0xFFFF) /*!< Prescaler Value */ + +/******************* Bit definition for TIM_ARR register ********************/ +#define TIM_ARR_ARR ((uint16_t)0xFFFF) /*!< actual auto-reload Value */ + +/******************* Bit definition for TIM_RCR register ********************/ +#define TIM_RCR_REP ((uint8_t)0xFF) /*!< Repetition Counter Value */ + +/******************* Bit definition for TIM_CCR1 register *******************/ +#define TIM_CCR1_CCR1 ((uint16_t)0xFFFF) /*!< Capture/Compare 1 Value */ + +/******************* Bit definition for TIM_CCR2 register *******************/ +#define TIM_CCR2_CCR2 ((uint16_t)0xFFFF) /*!< Capture/Compare 2 Value */ + +/******************* Bit definition for TIM_CCR3 register *******************/ +#define TIM_CCR3_CCR3 ((uint16_t)0xFFFF) /*!< Capture/Compare 3 Value */ + +/******************* Bit definition for TIM_CCR4 register *******************/ +#define TIM_CCR4_CCR4 ((uint16_t)0xFFFF) /*!< Capture/Compare 4 Value */ + +/******************* Bit definition for TIM_BDTR register *******************/ +#define TIM_BDTR_DTG ((uint16_t)0x00FF) /*!< DTG[0:7] bits (Dead-Time Generator set-up) */ +#define TIM_BDTR_DTG_0 ((uint16_t)0x0001) /*!< Bit 0 */ +#define TIM_BDTR_DTG_1 ((uint16_t)0x0002) /*!< Bit 1 */ +#define TIM_BDTR_DTG_2 ((uint16_t)0x0004) /*!< Bit 2 */ +#define TIM_BDTR_DTG_3 ((uint16_t)0x0008) /*!< Bit 3 */ +#define TIM_BDTR_DTG_4 ((uint16_t)0x0010) /*!< Bit 4 */ +#define TIM_BDTR_DTG_5 ((uint16_t)0x0020) /*!< Bit 5 */ +#define TIM_BDTR_DTG_6 ((uint16_t)0x0040) /*!< Bit 6 */ +#define TIM_BDTR_DTG_7 ((uint16_t)0x0080) /*!< Bit 7 */ + +#define TIM_BDTR_LOCK ((uint16_t)0x0300) /*!< LOCK[1:0] bits (Lock Configuration) */ +#define TIM_BDTR_LOCK_0 ((uint16_t)0x0100) /*!< Bit 0 */ +#define TIM_BDTR_LOCK_1 ((uint16_t)0x0200) /*!< Bit 1 */ + +#define TIM_BDTR_OSSI ((uint16_t)0x0400) /*!< Off-State Selection for Idle mode */ +#define TIM_BDTR_OSSR ((uint16_t)0x0800) /*!< Off-State Selection for Run mode */ +#define TIM_BDTR_BKE ((uint16_t)0x1000) /*!< Break enable */ +#define TIM_BDTR_BKP ((uint16_t)0x2000) /*!< Break Polarity */ +#define TIM_BDTR_AOE ((uint16_t)0x4000) /*!< Automatic Output enable */ +#define TIM_BDTR_MOE ((uint16_t)0x8000) /*!< Main Output enable */ + +/******************* Bit definition for TIM_DCR register ********************/ +#define TIM_DCR_DBA ((uint16_t)0x001F) /*!< DBA[4:0] bits (DMA Base Address) */ +#define TIM_DCR_DBA_0 ((uint16_t)0x0001) /*!< Bit 0 */ +#define TIM_DCR_DBA_1 ((uint16_t)0x0002) /*!< Bit 1 */ +#define TIM_DCR_DBA_2 ((uint16_t)0x0004) /*!< Bit 2 */ +#define TIM_DCR_DBA_3 ((uint16_t)0x0008) /*!< Bit 3 */ +#define TIM_DCR_DBA_4 ((uint16_t)0x0010) /*!< Bit 4 */ + +#define TIM_DCR_DBL ((uint16_t)0x1F00) /*!< DBL[4:0] bits (DMA Burst Length) */ +#define TIM_DCR_DBL_0 ((uint16_t)0x0100) /*!< Bit 0 */ +#define TIM_DCR_DBL_1 ((uint16_t)0x0200) /*!< Bit 1 */ +#define TIM_DCR_DBL_2 ((uint16_t)0x0400) /*!< Bit 2 */ +#define TIM_DCR_DBL_3 ((uint16_t)0x0800) /*!< Bit 3 */ +#define TIM_DCR_DBL_4 ((uint16_t)0x1000) /*!< Bit 4 */ + +/******************* Bit definition for TIM_DMAR register *******************/ +#define TIM_DMAR_DMAB ((uint16_t)0xFFFF) /*!< DMA register for burst accesses */ + +/******************************************************************************/ +/* */ +/* Real-Time Clock */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for RTC_CRH register ********************/ +#define RTC_CRH_SECIE ((uint8_t)0x01) /*!< Second Interrupt Enable */ +#define RTC_CRH_ALRIE ((uint8_t)0x02) /*!< Alarm Interrupt Enable */ +#define RTC_CRH_OWIE ((uint8_t)0x04) /*!< OverfloW Interrupt Enable */ + +/******************* Bit definition for RTC_CRL register ********************/ +#define RTC_CRL_SECF ((uint8_t)0x01) /*!< Second Flag */ +#define RTC_CRL_ALRF ((uint8_t)0x02) /*!< Alarm Flag */ +#define RTC_CRL_OWF ((uint8_t)0x04) /*!< OverfloW Flag */ +#define RTC_CRL_RSF ((uint8_t)0x08) /*!< Registers Synchronized Flag */ +#define RTC_CRL_CNF ((uint8_t)0x10) /*!< Configuration Flag */ +#define RTC_CRL_RTOFF ((uint8_t)0x20) /*!< RTC operation OFF */ + +/******************* Bit definition for RTC_PRLH register *******************/ +#define RTC_PRLH_PRL ((uint16_t)0x000F) /*!< RTC Prescaler Reload Value High */ + +/******************* Bit definition for RTC_PRLL register *******************/ +#define RTC_PRLL_PRL ((uint16_t)0xFFFF) /*!< RTC Prescaler Reload Value Low */ + +/******************* Bit definition for RTC_DIVH register *******************/ +#define RTC_DIVH_RTC_DIV ((uint16_t)0x000F) /*!< RTC Clock Divider High */ + +/******************* Bit definition for RTC_DIVL register *******************/ +#define RTC_DIVL_RTC_DIV ((uint16_t)0xFFFF) /*!< RTC Clock Divider Low */ + +/******************* Bit definition for RTC_CNTH register *******************/ +#define RTC_CNTH_RTC_CNT ((uint16_t)0xFFFF) /*!< RTC Counter High */ + +/******************* Bit definition for RTC_CNTL register *******************/ +#define RTC_CNTL_RTC_CNT ((uint16_t)0xFFFF) /*!< RTC Counter Low */ + +/******************* Bit definition for RTC_ALRH register *******************/ +#define RTC_ALRH_RTC_ALR ((uint16_t)0xFFFF) /*!< RTC Alarm High */ + +/******************* Bit definition for RTC_ALRL register *******************/ +#define RTC_ALRL_RTC_ALR ((uint16_t)0xFFFF) /*!< RTC Alarm Low */ + +/******************************************************************************/ +/* */ +/* Independent WATCHDOG */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for IWDG_KR register ********************/ +#define IWDG_KR_KEY ((uint16_t)0xFFFF) /*!< Key value (write only, read 0000h) */ + +/******************* Bit definition for IWDG_PR register ********************/ +#define IWDG_PR_PR ((uint8_t)0x07) /*!< PR[2:0] (Prescaler divider) */ +#define IWDG_PR_PR_0 ((uint8_t)0x01) /*!< Bit 0 */ +#define IWDG_PR_PR_1 ((uint8_t)0x02) /*!< Bit 1 */ +#define IWDG_PR_PR_2 ((uint8_t)0x04) /*!< Bit 2 */ + +/******************* Bit definition for IWDG_RLR register *******************/ +#define IWDG_RLR_RL ((uint16_t)0x0FFF) /*!< Watchdog counter reload value */ + +/******************* Bit definition for IWDG_SR register ********************/ +#define IWDG_SR_PVU ((uint8_t)0x01) /*!< Watchdog prescaler value update */ +#define IWDG_SR_RVU ((uint8_t)0x02) /*!< Watchdog counter reload value update */ + +/******************************************************************************/ +/* */ +/* Window WATCHDOG */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for WWDG_CR register ********************/ +#define WWDG_CR_T ((uint8_t)0x7F) /*!< T[6:0] bits (7-Bit counter (MSB to LSB)) */ +#define WWDG_CR_T0 ((uint8_t)0x01) /*!< Bit 0 */ +#define WWDG_CR_T1 ((uint8_t)0x02) /*!< Bit 1 */ +#define WWDG_CR_T2 ((uint8_t)0x04) /*!< Bit 2 */ +#define WWDG_CR_T3 ((uint8_t)0x08) /*!< Bit 3 */ +#define WWDG_CR_T4 ((uint8_t)0x10) /*!< Bit 4 */ +#define WWDG_CR_T5 ((uint8_t)0x20) /*!< Bit 5 */ +#define WWDG_CR_T6 ((uint8_t)0x40) /*!< Bit 6 */ + +#define WWDG_CR_WDGA ((uint8_t)0x80) /*!< Activation bit */ + +/******************* Bit definition for WWDG_CFR register *******************/ +#define WWDG_CFR_W ((uint16_t)0x007F) /*!< W[6:0] bits (7-bit window value) */ +#define WWDG_CFR_W0 ((uint16_t)0x0001) /*!< Bit 0 */ +#define WWDG_CFR_W1 ((uint16_t)0x0002) /*!< Bit 1 */ +#define WWDG_CFR_W2 ((uint16_t)0x0004) /*!< Bit 2 */ +#define WWDG_CFR_W3 ((uint16_t)0x0008) /*!< Bit 3 */ +#define WWDG_CFR_W4 ((uint16_t)0x0010) /*!< Bit 4 */ +#define WWDG_CFR_W5 ((uint16_t)0x0020) /*!< Bit 5 */ +#define WWDG_CFR_W6 ((uint16_t)0x0040) /*!< Bit 6 */ + +#define WWDG_CFR_WDGTB ((uint16_t)0x0180) /*!< WDGTB[1:0] bits (Timer Base) */ +#define WWDG_CFR_WDGTB0 ((uint16_t)0x0080) /*!< Bit 0 */ +#define WWDG_CFR_WDGTB1 ((uint16_t)0x0100) /*!< Bit 1 */ + +#define WWDG_CFR_EWI ((uint16_t)0x0200) /*!< Early Wakeup Interrupt */ + +/******************* Bit definition for WWDG_SR register ********************/ +#define WWDG_SR_EWIF ((uint8_t)0x01) /*!< Early Wakeup Interrupt Flag */ + +/******************************************************************************/ +/* */ +/* Flexible Static Memory Controller */ +/* */ +/******************************************************************************/ + +/****************** Bit definition for FSMC_BCR1 register *******************/ +#define FSMC_BCR1_MBKEN ((uint32_t)0x00000001) /*!< Memory bank enable bit */ +#define FSMC_BCR1_MUXEN ((uint32_t)0x00000002) /*!< Address/data multiplexing enable bit */ + +#define FSMC_BCR1_MTYP ((uint32_t)0x0000000C) /*!< MTYP[1:0] bits (Memory type) */ +#define FSMC_BCR1_MTYP_0 ((uint32_t)0x00000004) /*!< Bit 0 */ +#define FSMC_BCR1_MTYP_1 ((uint32_t)0x00000008) /*!< Bit 1 */ + +#define FSMC_BCR1_MWID ((uint32_t)0x00000030) /*!< MWID[1:0] bits (Memory data bus width) */ +#define FSMC_BCR1_MWID_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define FSMC_BCR1_MWID_1 ((uint32_t)0x00000020) /*!< Bit 1 */ + +#define FSMC_BCR1_FACCEN ((uint32_t)0x00000040) /*!< Flash access enable */ +#define FSMC_BCR1_BURSTEN ((uint32_t)0x00000100) /*!< Burst enable bit */ +#define FSMC_BCR1_WAITPOL ((uint32_t)0x00000200) /*!< Wait signal polarity bit */ +#define FSMC_BCR1_WRAPMOD ((uint32_t)0x00000400) /*!< Wrapped burst mode support */ +#define FSMC_BCR1_WAITCFG ((uint32_t)0x00000800) /*!< Wait timing configuration */ +#define FSMC_BCR1_WREN ((uint32_t)0x00001000) /*!< Write enable bit */ +#define FSMC_BCR1_WAITEN ((uint32_t)0x00002000) /*!< Wait enable bit */ +#define FSMC_BCR1_EXTMOD ((uint32_t)0x00004000) /*!< Extended mode enable */ +#define FSMC_BCR1_ASYNCWAIT ((uint32_t)0x00008000) /*!< Asynchronous wait */ +#define FSMC_BCR1_CBURSTRW ((uint32_t)0x00080000) /*!< Write burst enable */ + +/****************** Bit definition for FSMC_BCR2 register *******************/ +#define FSMC_BCR2_MBKEN ((uint32_t)0x00000001) /*!< Memory bank enable bit */ +#define FSMC_BCR2_MUXEN ((uint32_t)0x00000002) /*!< Address/data multiplexing enable bit */ + +#define FSMC_BCR2_MTYP ((uint32_t)0x0000000C) /*!< MTYP[1:0] bits (Memory type) */ +#define FSMC_BCR2_MTYP_0 ((uint32_t)0x00000004) /*!< Bit 0 */ +#define FSMC_BCR2_MTYP_1 ((uint32_t)0x00000008) /*!< Bit 1 */ + +#define FSMC_BCR2_MWID ((uint32_t)0x00000030) /*!< MWID[1:0] bits (Memory data bus width) */ +#define FSMC_BCR2_MWID_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define FSMC_BCR2_MWID_1 ((uint32_t)0x00000020) /*!< Bit 1 */ + +#define FSMC_BCR2_FACCEN ((uint32_t)0x00000040) /*!< Flash access enable */ +#define FSMC_BCR2_BURSTEN ((uint32_t)0x00000100) /*!< Burst enable bit */ +#define FSMC_BCR2_WAITPOL ((uint32_t)0x00000200) /*!< Wait signal polarity bit */ +#define FSMC_BCR2_WRAPMOD ((uint32_t)0x00000400) /*!< Wrapped burst mode support */ +#define FSMC_BCR2_WAITCFG ((uint32_t)0x00000800) /*!< Wait timing configuration */ +#define FSMC_BCR2_WREN ((uint32_t)0x00001000) /*!< Write enable bit */ +#define FSMC_BCR2_WAITEN ((uint32_t)0x00002000) /*!< Wait enable bit */ +#define FSMC_BCR2_EXTMOD ((uint32_t)0x00004000) /*!< Extended mode enable */ +#define FSMC_BCR2_ASYNCWAIT ((uint32_t)0x00008000) /*!< Asynchronous wait */ +#define FSMC_BCR2_CBURSTRW ((uint32_t)0x00080000) /*!< Write burst enable */ + +/****************** Bit definition for FSMC_BCR3 register *******************/ +#define FSMC_BCR3_MBKEN ((uint32_t)0x00000001) /*!< Memory bank enable bit */ +#define FSMC_BCR3_MUXEN ((uint32_t)0x00000002) /*!< Address/data multiplexing enable bit */ + +#define FSMC_BCR3_MTYP ((uint32_t)0x0000000C) /*!< MTYP[1:0] bits (Memory type) */ +#define FSMC_BCR3_MTYP_0 ((uint32_t)0x00000004) /*!< Bit 0 */ +#define FSMC_BCR3_MTYP_1 ((uint32_t)0x00000008) /*!< Bit 1 */ + +#define FSMC_BCR3_MWID ((uint32_t)0x00000030) /*!< MWID[1:0] bits (Memory data bus width) */ +#define FSMC_BCR3_MWID_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define FSMC_BCR3_MWID_1 ((uint32_t)0x00000020) /*!< Bit 1 */ + +#define FSMC_BCR3_FACCEN ((uint32_t)0x00000040) /*!< Flash access enable */ +#define FSMC_BCR3_BURSTEN ((uint32_t)0x00000100) /*!< Burst enable bit */ +#define FSMC_BCR3_WAITPOL ((uint32_t)0x00000200) /*!< Wait signal polarity bit. */ +#define FSMC_BCR3_WRAPMOD ((uint32_t)0x00000400) /*!< Wrapped burst mode support */ +#define FSMC_BCR3_WAITCFG ((uint32_t)0x00000800) /*!< Wait timing configuration */ +#define FSMC_BCR3_WREN ((uint32_t)0x00001000) /*!< Write enable bit */ +#define FSMC_BCR3_WAITEN ((uint32_t)0x00002000) /*!< Wait enable bit */ +#define FSMC_BCR3_EXTMOD ((uint32_t)0x00004000) /*!< Extended mode enable */ +#define FSMC_BCR3_ASYNCWAIT ((uint32_t)0x00008000) /*!< Asynchronous wait */ +#define FSMC_BCR3_CBURSTRW ((uint32_t)0x00080000) /*!< Write burst enable */ + +/****************** Bit definition for FSMC_BCR4 register *******************/ +#define FSMC_BCR4_MBKEN ((uint32_t)0x00000001) /*!< Memory bank enable bit */ +#define FSMC_BCR4_MUXEN ((uint32_t)0x00000002) /*!< Address/data multiplexing enable bit */ + +#define FSMC_BCR4_MTYP ((uint32_t)0x0000000C) /*!< MTYP[1:0] bits (Memory type) */ +#define FSMC_BCR4_MTYP_0 ((uint32_t)0x00000004) /*!< Bit 0 */ +#define FSMC_BCR4_MTYP_1 ((uint32_t)0x00000008) /*!< Bit 1 */ + +#define FSMC_BCR4_MWID ((uint32_t)0x00000030) /*!< MWID[1:0] bits (Memory data bus width) */ +#define FSMC_BCR4_MWID_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define FSMC_BCR4_MWID_1 ((uint32_t)0x00000020) /*!< Bit 1 */ + +#define FSMC_BCR4_FACCEN ((uint32_t)0x00000040) /*!< Flash access enable */ +#define FSMC_BCR4_BURSTEN ((uint32_t)0x00000100) /*!< Burst enable bit */ +#define FSMC_BCR4_WAITPOL ((uint32_t)0x00000200) /*!< Wait signal polarity bit */ +#define FSMC_BCR4_WRAPMOD ((uint32_t)0x00000400) /*!< Wrapped burst mode support */ +#define FSMC_BCR4_WAITCFG ((uint32_t)0x00000800) /*!< Wait timing configuration */ +#define FSMC_BCR4_WREN ((uint32_t)0x00001000) /*!< Write enable bit */ +#define FSMC_BCR4_WAITEN ((uint32_t)0x00002000) /*!< Wait enable bit */ +#define FSMC_BCR4_EXTMOD ((uint32_t)0x00004000) /*!< Extended mode enable */ +#define FSMC_BCR4_ASYNCWAIT ((uint32_t)0x00008000) /*!< Asynchronous wait */ +#define FSMC_BCR4_CBURSTRW ((uint32_t)0x00080000) /*!< Write burst enable */ + +/****************** Bit definition for FSMC_BTR1 register ******************/ +#define FSMC_BTR1_ADDSET ((uint32_t)0x0000000F) /*!< ADDSET[3:0] bits (Address setup phase duration) */ +#define FSMC_BTR1_ADDSET_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define FSMC_BTR1_ADDSET_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define FSMC_BTR1_ADDSET_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define FSMC_BTR1_ADDSET_3 ((uint32_t)0x00000008) /*!< Bit 3 */ + +#define FSMC_BTR1_ADDHLD ((uint32_t)0x000000F0) /*!< ADDHLD[3:0] bits (Address-hold phase duration) */ +#define FSMC_BTR1_ADDHLD_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define FSMC_BTR1_ADDHLD_1 ((uint32_t)0x00000020) /*!< Bit 1 */ +#define FSMC_BTR1_ADDHLD_2 ((uint32_t)0x00000040) /*!< Bit 2 */ +#define FSMC_BTR1_ADDHLD_3 ((uint32_t)0x00000080) /*!< Bit 3 */ + +#define FSMC_BTR1_DATAST ((uint32_t)0x0000FF00) /*!< DATAST [3:0] bits (Data-phase duration) */ +#define FSMC_BTR1_DATAST_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define FSMC_BTR1_DATAST_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define FSMC_BTR1_DATAST_2 ((uint32_t)0x00000400) /*!< Bit 2 */ +#define FSMC_BTR1_DATAST_3 ((uint32_t)0x00000800) /*!< Bit 3 */ + +#define FSMC_BTR1_BUSTURN ((uint32_t)0x000F0000) /*!< BUSTURN[3:0] bits (Bus turnaround phase duration) */ +#define FSMC_BTR1_BUSTURN_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define FSMC_BTR1_BUSTURN_1 ((uint32_t)0x00020000) /*!< Bit 1 */ +#define FSMC_BTR1_BUSTURN_2 ((uint32_t)0x00040000) /*!< Bit 2 */ +#define FSMC_BTR1_BUSTURN_3 ((uint32_t)0x00080000) /*!< Bit 3 */ + +#define FSMC_BTR1_CLKDIV ((uint32_t)0x00F00000) /*!< CLKDIV[3:0] bits (Clock divide ratio) */ +#define FSMC_BTR1_CLKDIV_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define FSMC_BTR1_CLKDIV_1 ((uint32_t)0x00200000) /*!< Bit 1 */ +#define FSMC_BTR1_CLKDIV_2 ((uint32_t)0x00400000) /*!< Bit 2 */ +#define FSMC_BTR1_CLKDIV_3 ((uint32_t)0x00800000) /*!< Bit 3 */ + +#define FSMC_BTR1_DATLAT ((uint32_t)0x0F000000) /*!< DATLA[3:0] bits (Data latency) */ +#define FSMC_BTR1_DATLAT_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define FSMC_BTR1_DATLAT_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define FSMC_BTR1_DATLAT_2 ((uint32_t)0x04000000) /*!< Bit 2 */ +#define FSMC_BTR1_DATLAT_3 ((uint32_t)0x08000000) /*!< Bit 3 */ + +#define FSMC_BTR1_ACCMOD ((uint32_t)0x30000000) /*!< ACCMOD[1:0] bits (Access mode) */ +#define FSMC_BTR1_ACCMOD_0 ((uint32_t)0x10000000) /*!< Bit 0 */ +#define FSMC_BTR1_ACCMOD_1 ((uint32_t)0x20000000) /*!< Bit 1 */ + +/****************** Bit definition for FSMC_BTR2 register *******************/ +#define FSMC_BTR2_ADDSET ((uint32_t)0x0000000F) /*!< ADDSET[3:0] bits (Address setup phase duration) */ +#define FSMC_BTR2_ADDSET_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define FSMC_BTR2_ADDSET_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define FSMC_BTR2_ADDSET_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define FSMC_BTR2_ADDSET_3 ((uint32_t)0x00000008) /*!< Bit 3 */ + +#define FSMC_BTR2_ADDHLD ((uint32_t)0x000000F0) /*!< ADDHLD[3:0] bits (Address-hold phase duration) */ +#define FSMC_BTR2_ADDHLD_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define FSMC_BTR2_ADDHLD_1 ((uint32_t)0x00000020) /*!< Bit 1 */ +#define FSMC_BTR2_ADDHLD_2 ((uint32_t)0x00000040) /*!< Bit 2 */ +#define FSMC_BTR2_ADDHLD_3 ((uint32_t)0x00000080) /*!< Bit 3 */ + +#define FSMC_BTR2_DATAST ((uint32_t)0x0000FF00) /*!< DATAST [3:0] bits (Data-phase duration) */ +#define FSMC_BTR2_DATAST_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define FSMC_BTR2_DATAST_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define FSMC_BTR2_DATAST_2 ((uint32_t)0x00000400) /*!< Bit 2 */ +#define FSMC_BTR2_DATAST_3 ((uint32_t)0x00000800) /*!< Bit 3 */ + +#define FSMC_BTR2_BUSTURN ((uint32_t)0x000F0000) /*!< BUSTURN[3:0] bits (Bus turnaround phase duration) */ +#define FSMC_BTR2_BUSTURN_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define FSMC_BTR2_BUSTURN_1 ((uint32_t)0x00020000) /*!< Bit 1 */ +#define FSMC_BTR2_BUSTURN_2 ((uint32_t)0x00040000) /*!< Bit 2 */ +#define FSMC_BTR2_BUSTURN_3 ((uint32_t)0x00080000) /*!< Bit 3 */ + +#define FSMC_BTR2_CLKDIV ((uint32_t)0x00F00000) /*!< CLKDIV[3:0] bits (Clock divide ratio) */ +#define FSMC_BTR2_CLKDIV_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define FSMC_BTR2_CLKDIV_1 ((uint32_t)0x00200000) /*!< Bit 1 */ +#define FSMC_BTR2_CLKDIV_2 ((uint32_t)0x00400000) /*!< Bit 2 */ +#define FSMC_BTR2_CLKDIV_3 ((uint32_t)0x00800000) /*!< Bit 3 */ + +#define FSMC_BTR2_DATLAT ((uint32_t)0x0F000000) /*!< DATLA[3:0] bits (Data latency) */ +#define FSMC_BTR2_DATLAT_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define FSMC_BTR2_DATLAT_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define FSMC_BTR2_DATLAT_2 ((uint32_t)0x04000000) /*!< Bit 2 */ +#define FSMC_BTR2_DATLAT_3 ((uint32_t)0x08000000) /*!< Bit 3 */ + +#define FSMC_BTR2_ACCMOD ((uint32_t)0x30000000) /*!< ACCMOD[1:0] bits (Access mode) */ +#define FSMC_BTR2_ACCMOD_0 ((uint32_t)0x10000000) /*!< Bit 0 */ +#define FSMC_BTR2_ACCMOD_1 ((uint32_t)0x20000000) /*!< Bit 1 */ + +/******************* Bit definition for FSMC_BTR3 register *******************/ +#define FSMC_BTR3_ADDSET ((uint32_t)0x0000000F) /*!< ADDSET[3:0] bits (Address setup phase duration) */ +#define FSMC_BTR3_ADDSET_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define FSMC_BTR3_ADDSET_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define FSMC_BTR3_ADDSET_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define FSMC_BTR3_ADDSET_3 ((uint32_t)0x00000008) /*!< Bit 3 */ + +#define FSMC_BTR3_ADDHLD ((uint32_t)0x000000F0) /*!< ADDHLD[3:0] bits (Address-hold phase duration) */ +#define FSMC_BTR3_ADDHLD_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define FSMC_BTR3_ADDHLD_1 ((uint32_t)0x00000020) /*!< Bit 1 */ +#define FSMC_BTR3_ADDHLD_2 ((uint32_t)0x00000040) /*!< Bit 2 */ +#define FSMC_BTR3_ADDHLD_3 ((uint32_t)0x00000080) /*!< Bit 3 */ + +#define FSMC_BTR3_DATAST ((uint32_t)0x0000FF00) /*!< DATAST [3:0] bits (Data-phase duration) */ +#define FSMC_BTR3_DATAST_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define FSMC_BTR3_DATAST_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define FSMC_BTR3_DATAST_2 ((uint32_t)0x00000400) /*!< Bit 2 */ +#define FSMC_BTR3_DATAST_3 ((uint32_t)0x00000800) /*!< Bit 3 */ + +#define FSMC_BTR3_BUSTURN ((uint32_t)0x000F0000) /*!< BUSTURN[3:0] bits (Bus turnaround phase duration) */ +#define FSMC_BTR3_BUSTURN_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define FSMC_BTR3_BUSTURN_1 ((uint32_t)0x00020000) /*!< Bit 1 */ +#define FSMC_BTR3_BUSTURN_2 ((uint32_t)0x00040000) /*!< Bit 2 */ +#define FSMC_BTR3_BUSTURN_3 ((uint32_t)0x00080000) /*!< Bit 3 */ + +#define FSMC_BTR3_CLKDIV ((uint32_t)0x00F00000) /*!< CLKDIV[3:0] bits (Clock divide ratio) */ +#define FSMC_BTR3_CLKDIV_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define FSMC_BTR3_CLKDIV_1 ((uint32_t)0x00200000) /*!< Bit 1 */ +#define FSMC_BTR3_CLKDIV_2 ((uint32_t)0x00400000) /*!< Bit 2 */ +#define FSMC_BTR3_CLKDIV_3 ((uint32_t)0x00800000) /*!< Bit 3 */ + +#define FSMC_BTR3_DATLAT ((uint32_t)0x0F000000) /*!< DATLA[3:0] bits (Data latency) */ +#define FSMC_BTR3_DATLAT_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define FSMC_BTR3_DATLAT_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define FSMC_BTR3_DATLAT_2 ((uint32_t)0x04000000) /*!< Bit 2 */ +#define FSMC_BTR3_DATLAT_3 ((uint32_t)0x08000000) /*!< Bit 3 */ + +#define FSMC_BTR3_ACCMOD ((uint32_t)0x30000000) /*!< ACCMOD[1:0] bits (Access mode) */ +#define FSMC_BTR3_ACCMOD_0 ((uint32_t)0x10000000) /*!< Bit 0 */ +#define FSMC_BTR3_ACCMOD_1 ((uint32_t)0x20000000) /*!< Bit 1 */ + +/****************** Bit definition for FSMC_BTR4 register *******************/ +#define FSMC_BTR4_ADDSET ((uint32_t)0x0000000F) /*!< ADDSET[3:0] bits (Address setup phase duration) */ +#define FSMC_BTR4_ADDSET_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define FSMC_BTR4_ADDSET_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define FSMC_BTR4_ADDSET_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define FSMC_BTR4_ADDSET_3 ((uint32_t)0x00000008) /*!< Bit 3 */ + +#define FSMC_BTR4_ADDHLD ((uint32_t)0x000000F0) /*!< ADDHLD[3:0] bits (Address-hold phase duration) */ +#define FSMC_BTR4_ADDHLD_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define FSMC_BTR4_ADDHLD_1 ((uint32_t)0x00000020) /*!< Bit 1 */ +#define FSMC_BTR4_ADDHLD_2 ((uint32_t)0x00000040) /*!< Bit 2 */ +#define FSMC_BTR4_ADDHLD_3 ((uint32_t)0x00000080) /*!< Bit 3 */ + +#define FSMC_BTR4_DATAST ((uint32_t)0x0000FF00) /*!< DATAST [3:0] bits (Data-phase duration) */ +#define FSMC_BTR4_DATAST_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define FSMC_BTR4_DATAST_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define FSMC_BTR4_DATAST_2 ((uint32_t)0x00000400) /*!< Bit 2 */ +#define FSMC_BTR4_DATAST_3 ((uint32_t)0x00000800) /*!< Bit 3 */ + +#define FSMC_BTR4_BUSTURN ((uint32_t)0x000F0000) /*!< BUSTURN[3:0] bits (Bus turnaround phase duration) */ +#define FSMC_BTR4_BUSTURN_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define FSMC_BTR4_BUSTURN_1 ((uint32_t)0x00020000) /*!< Bit 1 */ +#define FSMC_BTR4_BUSTURN_2 ((uint32_t)0x00040000) /*!< Bit 2 */ +#define FSMC_BTR4_BUSTURN_3 ((uint32_t)0x00080000) /*!< Bit 3 */ + +#define FSMC_BTR4_CLKDIV ((uint32_t)0x00F00000) /*!< CLKDIV[3:0] bits (Clock divide ratio) */ +#define FSMC_BTR4_CLKDIV_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define FSMC_BTR4_CLKDIV_1 ((uint32_t)0x00200000) /*!< Bit 1 */ +#define FSMC_BTR4_CLKDIV_2 ((uint32_t)0x00400000) /*!< Bit 2 */ +#define FSMC_BTR4_CLKDIV_3 ((uint32_t)0x00800000) /*!< Bit 3 */ + +#define FSMC_BTR4_DATLAT ((uint32_t)0x0F000000) /*!< DATLA[3:0] bits (Data latency) */ +#define FSMC_BTR4_DATLAT_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define FSMC_BTR4_DATLAT_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define FSMC_BTR4_DATLAT_2 ((uint32_t)0x04000000) /*!< Bit 2 */ +#define FSMC_BTR4_DATLAT_3 ((uint32_t)0x08000000) /*!< Bit 3 */ + +#define FSMC_BTR4_ACCMOD ((uint32_t)0x30000000) /*!< ACCMOD[1:0] bits (Access mode) */ +#define FSMC_BTR4_ACCMOD_0 ((uint32_t)0x10000000) /*!< Bit 0 */ +#define FSMC_BTR4_ACCMOD_1 ((uint32_t)0x20000000) /*!< Bit 1 */ + +/****************** Bit definition for FSMC_BWTR1 register ******************/ +#define FSMC_BWTR1_ADDSET ((uint32_t)0x0000000F) /*!< ADDSET[3:0] bits (Address setup phase duration) */ +#define FSMC_BWTR1_ADDSET_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define FSMC_BWTR1_ADDSET_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define FSMC_BWTR1_ADDSET_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define FSMC_BWTR1_ADDSET_3 ((uint32_t)0x00000008) /*!< Bit 3 */ + +#define FSMC_BWTR1_ADDHLD ((uint32_t)0x000000F0) /*!< ADDHLD[3:0] bits (Address-hold phase duration) */ +#define FSMC_BWTR1_ADDHLD_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define FSMC_BWTR1_ADDHLD_1 ((uint32_t)0x00000020) /*!< Bit 1 */ +#define FSMC_BWTR1_ADDHLD_2 ((uint32_t)0x00000040) /*!< Bit 2 */ +#define FSMC_BWTR1_ADDHLD_3 ((uint32_t)0x00000080) /*!< Bit 3 */ + +#define FSMC_BWTR1_DATAST ((uint32_t)0x0000FF00) /*!< DATAST [3:0] bits (Data-phase duration) */ +#define FSMC_BWTR1_DATAST_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define FSMC_BWTR1_DATAST_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define FSMC_BWTR1_DATAST_2 ((uint32_t)0x00000400) /*!< Bit 2 */ +#define FSMC_BWTR1_DATAST_3 ((uint32_t)0x00000800) /*!< Bit 3 */ + +#define FSMC_BWTR1_CLKDIV ((uint32_t)0x00F00000) /*!< CLKDIV[3:0] bits (Clock divide ratio) */ +#define FSMC_BWTR1_CLKDIV_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define FSMC_BWTR1_CLKDIV_1 ((uint32_t)0x00200000) /*!< Bit 1 */ +#define FSMC_BWTR1_CLKDIV_2 ((uint32_t)0x00400000) /*!< Bit 2 */ +#define FSMC_BWTR1_CLKDIV_3 ((uint32_t)0x00800000) /*!< Bit 3 */ + +#define FSMC_BWTR1_DATLAT ((uint32_t)0x0F000000) /*!< DATLA[3:0] bits (Data latency) */ +#define FSMC_BWTR1_DATLAT_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define FSMC_BWTR1_DATLAT_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define FSMC_BWTR1_DATLAT_2 ((uint32_t)0x04000000) /*!< Bit 2 */ +#define FSMC_BWTR1_DATLAT_3 ((uint32_t)0x08000000) /*!< Bit 3 */ + +#define FSMC_BWTR1_ACCMOD ((uint32_t)0x30000000) /*!< ACCMOD[1:0] bits (Access mode) */ +#define FSMC_BWTR1_ACCMOD_0 ((uint32_t)0x10000000) /*!< Bit 0 */ +#define FSMC_BWTR1_ACCMOD_1 ((uint32_t)0x20000000) /*!< Bit 1 */ + +/****************** Bit definition for FSMC_BWTR2 register ******************/ +#define FSMC_BWTR2_ADDSET ((uint32_t)0x0000000F) /*!< ADDSET[3:0] bits (Address setup phase duration) */ +#define FSMC_BWTR2_ADDSET_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define FSMC_BWTR2_ADDSET_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define FSMC_BWTR2_ADDSET_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define FSMC_BWTR2_ADDSET_3 ((uint32_t)0x00000008) /*!< Bit 3 */ + +#define FSMC_BWTR2_ADDHLD ((uint32_t)0x000000F0) /*!< ADDHLD[3:0] bits (Address-hold phase duration) */ +#define FSMC_BWTR2_ADDHLD_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define FSMC_BWTR2_ADDHLD_1 ((uint32_t)0x00000020) /*!< Bit 1 */ +#define FSMC_BWTR2_ADDHLD_2 ((uint32_t)0x00000040) /*!< Bit 2 */ +#define FSMC_BWTR2_ADDHLD_3 ((uint32_t)0x00000080) /*!< Bit 3 */ + +#define FSMC_BWTR2_DATAST ((uint32_t)0x0000FF00) /*!< DATAST [3:0] bits (Data-phase duration) */ +#define FSMC_BWTR2_DATAST_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define FSMC_BWTR2_DATAST_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define FSMC_BWTR2_DATAST_2 ((uint32_t)0x00000400) /*!< Bit 2 */ +#define FSMC_BWTR2_DATAST_3 ((uint32_t)0x00000800) /*!< Bit 3 */ + +#define FSMC_BWTR2_CLKDIV ((uint32_t)0x00F00000) /*!< CLKDIV[3:0] bits (Clock divide ratio) */ +#define FSMC_BWTR2_CLKDIV_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define FSMC_BWTR2_CLKDIV_1 ((uint32_t)0x00200000) /*!< Bit 1*/ +#define FSMC_BWTR2_CLKDIV_2 ((uint32_t)0x00400000) /*!< Bit 2 */ +#define FSMC_BWTR2_CLKDIV_3 ((uint32_t)0x00800000) /*!< Bit 3 */ + +#define FSMC_BWTR2_DATLAT ((uint32_t)0x0F000000) /*!< DATLA[3:0] bits (Data latency) */ +#define FSMC_BWTR2_DATLAT_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define FSMC_BWTR2_DATLAT_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define FSMC_BWTR2_DATLAT_2 ((uint32_t)0x04000000) /*!< Bit 2 */ +#define FSMC_BWTR2_DATLAT_3 ((uint32_t)0x08000000) /*!< Bit 3 */ + +#define FSMC_BWTR2_ACCMOD ((uint32_t)0x30000000) /*!< ACCMOD[1:0] bits (Access mode) */ +#define FSMC_BWTR2_ACCMOD_0 ((uint32_t)0x10000000) /*!< Bit 0 */ +#define FSMC_BWTR2_ACCMOD_1 ((uint32_t)0x20000000) /*!< Bit 1 */ + +/****************** Bit definition for FSMC_BWTR3 register ******************/ +#define FSMC_BWTR3_ADDSET ((uint32_t)0x0000000F) /*!< ADDSET[3:0] bits (Address setup phase duration) */ +#define FSMC_BWTR3_ADDSET_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define FSMC_BWTR3_ADDSET_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define FSMC_BWTR3_ADDSET_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define FSMC_BWTR3_ADDSET_3 ((uint32_t)0x00000008) /*!< Bit 3 */ + +#define FSMC_BWTR3_ADDHLD ((uint32_t)0x000000F0) /*!< ADDHLD[3:0] bits (Address-hold phase duration) */ +#define FSMC_BWTR3_ADDHLD_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define FSMC_BWTR3_ADDHLD_1 ((uint32_t)0x00000020) /*!< Bit 1 */ +#define FSMC_BWTR3_ADDHLD_2 ((uint32_t)0x00000040) /*!< Bit 2 */ +#define FSMC_BWTR3_ADDHLD_3 ((uint32_t)0x00000080) /*!< Bit 3 */ + +#define FSMC_BWTR3_DATAST ((uint32_t)0x0000FF00) /*!< DATAST [3:0] bits (Data-phase duration) */ +#define FSMC_BWTR3_DATAST_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define FSMC_BWTR3_DATAST_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define FSMC_BWTR3_DATAST_2 ((uint32_t)0x00000400) /*!< Bit 2 */ +#define FSMC_BWTR3_DATAST_3 ((uint32_t)0x00000800) /*!< Bit 3 */ + +#define FSMC_BWTR3_CLKDIV ((uint32_t)0x00F00000) /*!< CLKDIV[3:0] bits (Clock divide ratio) */ +#define FSMC_BWTR3_CLKDIV_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define FSMC_BWTR3_CLKDIV_1 ((uint32_t)0x00200000) /*!< Bit 1 */ +#define FSMC_BWTR3_CLKDIV_2 ((uint32_t)0x00400000) /*!< Bit 2 */ +#define FSMC_BWTR3_CLKDIV_3 ((uint32_t)0x00800000) /*!< Bit 3 */ + +#define FSMC_BWTR3_DATLAT ((uint32_t)0x0F000000) /*!< DATLA[3:0] bits (Data latency) */ +#define FSMC_BWTR3_DATLAT_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define FSMC_BWTR3_DATLAT_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define FSMC_BWTR3_DATLAT_2 ((uint32_t)0x04000000) /*!< Bit 2 */ +#define FSMC_BWTR3_DATLAT_3 ((uint32_t)0x08000000) /*!< Bit 3 */ + +#define FSMC_BWTR3_ACCMOD ((uint32_t)0x30000000) /*!< ACCMOD[1:0] bits (Access mode) */ +#define FSMC_BWTR3_ACCMOD_0 ((uint32_t)0x10000000) /*!< Bit 0 */ +#define FSMC_BWTR3_ACCMOD_1 ((uint32_t)0x20000000) /*!< Bit 1 */ + +/****************** Bit definition for FSMC_BWTR4 register ******************/ +#define FSMC_BWTR4_ADDSET ((uint32_t)0x0000000F) /*!< ADDSET[3:0] bits (Address setup phase duration) */ +#define FSMC_BWTR4_ADDSET_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define FSMC_BWTR4_ADDSET_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define FSMC_BWTR4_ADDSET_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define FSMC_BWTR4_ADDSET_3 ((uint32_t)0x00000008) /*!< Bit 3 */ + +#define FSMC_BWTR4_ADDHLD ((uint32_t)0x000000F0) /*!< ADDHLD[3:0] bits (Address-hold phase duration) */ +#define FSMC_BWTR4_ADDHLD_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define FSMC_BWTR4_ADDHLD_1 ((uint32_t)0x00000020) /*!< Bit 1 */ +#define FSMC_BWTR4_ADDHLD_2 ((uint32_t)0x00000040) /*!< Bit 2 */ +#define FSMC_BWTR4_ADDHLD_3 ((uint32_t)0x00000080) /*!< Bit 3 */ + +#define FSMC_BWTR4_DATAST ((uint32_t)0x0000FF00) /*!< DATAST [3:0] bits (Data-phase duration) */ +#define FSMC_BWTR4_DATAST_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define FSMC_BWTR4_DATAST_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define FSMC_BWTR4_DATAST_2 ((uint32_t)0x00000400) /*!< Bit 2 */ +#define FSMC_BWTR4_DATAST_3 ((uint32_t)0x00000800) /*!< Bit 3 */ + +#define FSMC_BWTR4_CLKDIV ((uint32_t)0x00F00000) /*!< CLKDIV[3:0] bits (Clock divide ratio) */ +#define FSMC_BWTR4_CLKDIV_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define FSMC_BWTR4_CLKDIV_1 ((uint32_t)0x00200000) /*!< Bit 1 */ +#define FSMC_BWTR4_CLKDIV_2 ((uint32_t)0x00400000) /*!< Bit 2 */ +#define FSMC_BWTR4_CLKDIV_3 ((uint32_t)0x00800000) /*!< Bit 3 */ + +#define FSMC_BWTR4_DATLAT ((uint32_t)0x0F000000) /*!< DATLA[3:0] bits (Data latency) */ +#define FSMC_BWTR4_DATLAT_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define FSMC_BWTR4_DATLAT_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define FSMC_BWTR4_DATLAT_2 ((uint32_t)0x04000000) /*!< Bit 2 */ +#define FSMC_BWTR4_DATLAT_3 ((uint32_t)0x08000000) /*!< Bit 3 */ + +#define FSMC_BWTR4_ACCMOD ((uint32_t)0x30000000) /*!< ACCMOD[1:0] bits (Access mode) */ +#define FSMC_BWTR4_ACCMOD_0 ((uint32_t)0x10000000) /*!< Bit 0 */ +#define FSMC_BWTR4_ACCMOD_1 ((uint32_t)0x20000000) /*!< Bit 1 */ + +/****************** Bit definition for FSMC_PCR2 register *******************/ +#define FSMC_PCR2_PWAITEN ((uint32_t)0x00000002) /*!< Wait feature enable bit */ +#define FSMC_PCR2_PBKEN ((uint32_t)0x00000004) /*!< PC Card/NAND Flash memory bank enable bit */ +#define FSMC_PCR2_PTYP ((uint32_t)0x00000008) /*!< Memory type */ + +#define FSMC_PCR2_PWID ((uint32_t)0x00000030) /*!< PWID[1:0] bits (NAND Flash databus width) */ +#define FSMC_PCR2_PWID_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define FSMC_PCR2_PWID_1 ((uint32_t)0x00000020) /*!< Bit 1 */ + +#define FSMC_PCR2_ECCEN ((uint32_t)0x00000040) /*!< ECC computation logic enable bit */ + +#define FSMC_PCR2_TCLR ((uint32_t)0x00001E00) /*!< TCLR[3:0] bits (CLE to RE delay) */ +#define FSMC_PCR2_TCLR_0 ((uint32_t)0x00000200) /*!< Bit 0 */ +#define FSMC_PCR2_TCLR_1 ((uint32_t)0x00000400) /*!< Bit 1 */ +#define FSMC_PCR2_TCLR_2 ((uint32_t)0x00000800) /*!< Bit 2 */ +#define FSMC_PCR2_TCLR_3 ((uint32_t)0x00001000) /*!< Bit 3 */ + +#define FSMC_PCR2_TAR ((uint32_t)0x0001E000) /*!< TAR[3:0] bits (ALE to RE delay) */ +#define FSMC_PCR2_TAR_0 ((uint32_t)0x00002000) /*!< Bit 0 */ +#define FSMC_PCR2_TAR_1 ((uint32_t)0x00004000) /*!< Bit 1 */ +#define FSMC_PCR2_TAR_2 ((uint32_t)0x00008000) /*!< Bit 2 */ +#define FSMC_PCR2_TAR_3 ((uint32_t)0x00010000) /*!< Bit 3 */ + +#define FSMC_PCR2_ECCPS ((uint32_t)0x000E0000) /*!< ECCPS[1:0] bits (ECC page size) */ +#define FSMC_PCR2_ECCPS_0 ((uint32_t)0x00020000) /*!< Bit 0 */ +#define FSMC_PCR2_ECCPS_1 ((uint32_t)0x00040000) /*!< Bit 1 */ +#define FSMC_PCR2_ECCPS_2 ((uint32_t)0x00080000) /*!< Bit 2 */ + +/****************** Bit definition for FSMC_PCR3 register *******************/ +#define FSMC_PCR3_PWAITEN ((uint32_t)0x00000002) /*!< Wait feature enable bit */ +#define FSMC_PCR3_PBKEN ((uint32_t)0x00000004) /*!< PC Card/NAND Flash memory bank enable bit */ +#define FSMC_PCR3_PTYP ((uint32_t)0x00000008) /*!< Memory type */ + +#define FSMC_PCR3_PWID ((uint32_t)0x00000030) /*!< PWID[1:0] bits (NAND Flash databus width) */ +#define FSMC_PCR3_PWID_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define FSMC_PCR3_PWID_1 ((uint32_t)0x00000020) /*!< Bit 1 */ + +#define FSMC_PCR3_ECCEN ((uint32_t)0x00000040) /*!< ECC computation logic enable bit */ + +#define FSMC_PCR3_TCLR ((uint32_t)0x00001E00) /*!< TCLR[3:0] bits (CLE to RE delay) */ +#define FSMC_PCR3_TCLR_0 ((uint32_t)0x00000200) /*!< Bit 0 */ +#define FSMC_PCR3_TCLR_1 ((uint32_t)0x00000400) /*!< Bit 1 */ +#define FSMC_PCR3_TCLR_2 ((uint32_t)0x00000800) /*!< Bit 2 */ +#define FSMC_PCR3_TCLR_3 ((uint32_t)0x00001000) /*!< Bit 3 */ + +#define FSMC_PCR3_TAR ((uint32_t)0x0001E000) /*!< TAR[3:0] bits (ALE to RE delay) */ +#define FSMC_PCR3_TAR_0 ((uint32_t)0x00002000) /*!< Bit 0 */ +#define FSMC_PCR3_TAR_1 ((uint32_t)0x00004000) /*!< Bit 1 */ +#define FSMC_PCR3_TAR_2 ((uint32_t)0x00008000) /*!< Bit 2 */ +#define FSMC_PCR3_TAR_3 ((uint32_t)0x00010000) /*!< Bit 3 */ + +#define FSMC_PCR3_ECCPS ((uint32_t)0x000E0000) /*!< ECCPS[2:0] bits (ECC page size) */ +#define FSMC_PCR3_ECCPS_0 ((uint32_t)0x00020000) /*!< Bit 0 */ +#define FSMC_PCR3_ECCPS_1 ((uint32_t)0x00040000) /*!< Bit 1 */ +#define FSMC_PCR3_ECCPS_2 ((uint32_t)0x00080000) /*!< Bit 2 */ + +/****************** Bit definition for FSMC_PCR4 register *******************/ +#define FSMC_PCR4_PWAITEN ((uint32_t)0x00000002) /*!< Wait feature enable bit */ +#define FSMC_PCR4_PBKEN ((uint32_t)0x00000004) /*!< PC Card/NAND Flash memory bank enable bit */ +#define FSMC_PCR4_PTYP ((uint32_t)0x00000008) /*!< Memory type */ + +#define FSMC_PCR4_PWID ((uint32_t)0x00000030) /*!< PWID[1:0] bits (NAND Flash databus width) */ +#define FSMC_PCR4_PWID_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define FSMC_PCR4_PWID_1 ((uint32_t)0x00000020) /*!< Bit 1 */ + +#define FSMC_PCR4_ECCEN ((uint32_t)0x00000040) /*!< ECC computation logic enable bit */ + +#define FSMC_PCR4_TCLR ((uint32_t)0x00001E00) /*!< TCLR[3:0] bits (CLE to RE delay) */ +#define FSMC_PCR4_TCLR_0 ((uint32_t)0x00000200) /*!< Bit 0 */ +#define FSMC_PCR4_TCLR_1 ((uint32_t)0x00000400) /*!< Bit 1 */ +#define FSMC_PCR4_TCLR_2 ((uint32_t)0x00000800) /*!< Bit 2 */ +#define FSMC_PCR4_TCLR_3 ((uint32_t)0x00001000) /*!< Bit 3 */ + +#define FSMC_PCR4_TAR ((uint32_t)0x0001E000) /*!< TAR[3:0] bits (ALE to RE delay) */ +#define FSMC_PCR4_TAR_0 ((uint32_t)0x00002000) /*!< Bit 0 */ +#define FSMC_PCR4_TAR_1 ((uint32_t)0x00004000) /*!< Bit 1 */ +#define FSMC_PCR4_TAR_2 ((uint32_t)0x00008000) /*!< Bit 2 */ +#define FSMC_PCR4_TAR_3 ((uint32_t)0x00010000) /*!< Bit 3 */ + +#define FSMC_PCR4_ECCPS ((uint32_t)0x000E0000) /*!< ECCPS[2:0] bits (ECC page size) */ +#define FSMC_PCR4_ECCPS_0 ((uint32_t)0x00020000) /*!< Bit 0 */ +#define FSMC_PCR4_ECCPS_1 ((uint32_t)0x00040000) /*!< Bit 1 */ +#define FSMC_PCR4_ECCPS_2 ((uint32_t)0x00080000) /*!< Bit 2 */ + +/******************* Bit definition for FSMC_SR2 register *******************/ +#define FSMC_SR2_IRS ((uint8_t)0x01) /*!< Interrupt Rising Edge status */ +#define FSMC_SR2_ILS ((uint8_t)0x02) /*!< Interrupt Level status */ +#define FSMC_SR2_IFS ((uint8_t)0x04) /*!< Interrupt Falling Edge status */ +#define FSMC_SR2_IREN ((uint8_t)0x08) /*!< Interrupt Rising Edge detection Enable bit */ +#define FSMC_SR2_ILEN ((uint8_t)0x10) /*!< Interrupt Level detection Enable bit */ +#define FSMC_SR2_IFEN ((uint8_t)0x20) /*!< Interrupt Falling Edge detection Enable bit */ +#define FSMC_SR2_FEMPT ((uint8_t)0x40) /*!< FIFO empty */ + +/******************* Bit definition for FSMC_SR3 register *******************/ +#define FSMC_SR3_IRS ((uint8_t)0x01) /*!< Interrupt Rising Edge status */ +#define FSMC_SR3_ILS ((uint8_t)0x02) /*!< Interrupt Level status */ +#define FSMC_SR3_IFS ((uint8_t)0x04) /*!< Interrupt Falling Edge status */ +#define FSMC_SR3_IREN ((uint8_t)0x08) /*!< Interrupt Rising Edge detection Enable bit */ +#define FSMC_SR3_ILEN ((uint8_t)0x10) /*!< Interrupt Level detection Enable bit */ +#define FSMC_SR3_IFEN ((uint8_t)0x20) /*!< Interrupt Falling Edge detection Enable bit */ +#define FSMC_SR3_FEMPT ((uint8_t)0x40) /*!< FIFO empty */ + +/******************* Bit definition for FSMC_SR4 register *******************/ +#define FSMC_SR4_IRS ((uint8_t)0x01) /*!< Interrupt Rising Edge status */ +#define FSMC_SR4_ILS ((uint8_t)0x02) /*!< Interrupt Level status */ +#define FSMC_SR4_IFS ((uint8_t)0x04) /*!< Interrupt Falling Edge status */ +#define FSMC_SR4_IREN ((uint8_t)0x08) /*!< Interrupt Rising Edge detection Enable bit */ +#define FSMC_SR4_ILEN ((uint8_t)0x10) /*!< Interrupt Level detection Enable bit */ +#define FSMC_SR4_IFEN ((uint8_t)0x20) /*!< Interrupt Falling Edge detection Enable bit */ +#define FSMC_SR4_FEMPT ((uint8_t)0x40) /*!< FIFO empty */ + +/****************** Bit definition for FSMC_PMEM2 register ******************/ +#define FSMC_PMEM2_MEMSET2 ((uint32_t)0x000000FF) /*!< MEMSET2[7:0] bits (Common memory 2 setup time) */ +#define FSMC_PMEM2_MEMSET2_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define FSMC_PMEM2_MEMSET2_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define FSMC_PMEM2_MEMSET2_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define FSMC_PMEM2_MEMSET2_3 ((uint32_t)0x00000008) /*!< Bit 3 */ +#define FSMC_PMEM2_MEMSET2_4 ((uint32_t)0x00000010) /*!< Bit 4 */ +#define FSMC_PMEM2_MEMSET2_5 ((uint32_t)0x00000020) /*!< Bit 5 */ +#define FSMC_PMEM2_MEMSET2_6 ((uint32_t)0x00000040) /*!< Bit 6 */ +#define FSMC_PMEM2_MEMSET2_7 ((uint32_t)0x00000080) /*!< Bit 7 */ + +#define FSMC_PMEM2_MEMWAIT2 ((uint32_t)0x0000FF00) /*!< MEMWAIT2[7:0] bits (Common memory 2 wait time) */ +#define FSMC_PMEM2_MEMWAIT2_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define FSMC_PMEM2_MEMWAIT2_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define FSMC_PMEM2_MEMWAIT2_2 ((uint32_t)0x00000400) /*!< Bit 2 */ +#define FSMC_PMEM2_MEMWAIT2_3 ((uint32_t)0x00000800) /*!< Bit 3 */ +#define FSMC_PMEM2_MEMWAIT2_4 ((uint32_t)0x00001000) /*!< Bit 4 */ +#define FSMC_PMEM2_MEMWAIT2_5 ((uint32_t)0x00002000) /*!< Bit 5 */ +#define FSMC_PMEM2_MEMWAIT2_6 ((uint32_t)0x00004000) /*!< Bit 6 */ +#define FSMC_PMEM2_MEMWAIT2_7 ((uint32_t)0x00008000) /*!< Bit 7 */ + +#define FSMC_PMEM2_MEMHOLD2 ((uint32_t)0x00FF0000) /*!< MEMHOLD2[7:0] bits (Common memory 2 hold time) */ +#define FSMC_PMEM2_MEMHOLD2_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define FSMC_PMEM2_MEMHOLD2_1 ((uint32_t)0x00020000) /*!< Bit 1 */ +#define FSMC_PMEM2_MEMHOLD2_2 ((uint32_t)0x00040000) /*!< Bit 2 */ +#define FSMC_PMEM2_MEMHOLD2_3 ((uint32_t)0x00080000) /*!< Bit 3 */ +#define FSMC_PMEM2_MEMHOLD2_4 ((uint32_t)0x00100000) /*!< Bit 4 */ +#define FSMC_PMEM2_MEMHOLD2_5 ((uint32_t)0x00200000) /*!< Bit 5 */ +#define FSMC_PMEM2_MEMHOLD2_6 ((uint32_t)0x00400000) /*!< Bit 6 */ +#define FSMC_PMEM2_MEMHOLD2_7 ((uint32_t)0x00800000) /*!< Bit 7 */ + +#define FSMC_PMEM2_MEMHIZ2 ((uint32_t)0xFF000000) /*!< MEMHIZ2[7:0] bits (Common memory 2 databus HiZ time) */ +#define FSMC_PMEM2_MEMHIZ2_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define FSMC_PMEM2_MEMHIZ2_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define FSMC_PMEM2_MEMHIZ2_2 ((uint32_t)0x04000000) /*!< Bit 2 */ +#define FSMC_PMEM2_MEMHIZ2_3 ((uint32_t)0x08000000) /*!< Bit 3 */ +#define FSMC_PMEM2_MEMHIZ2_4 ((uint32_t)0x10000000) /*!< Bit 4 */ +#define FSMC_PMEM2_MEMHIZ2_5 ((uint32_t)0x20000000) /*!< Bit 5 */ +#define FSMC_PMEM2_MEMHIZ2_6 ((uint32_t)0x40000000) /*!< Bit 6 */ +#define FSMC_PMEM2_MEMHIZ2_7 ((uint32_t)0x80000000) /*!< Bit 7 */ + +/****************** Bit definition for FSMC_PMEM3 register ******************/ +#define FSMC_PMEM3_MEMSET3 ((uint32_t)0x000000FF) /*!< MEMSET3[7:0] bits (Common memory 3 setup time) */ +#define FSMC_PMEM3_MEMSET3_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define FSMC_PMEM3_MEMSET3_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define FSMC_PMEM3_MEMSET3_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define FSMC_PMEM3_MEMSET3_3 ((uint32_t)0x00000008) /*!< Bit 3 */ +#define FSMC_PMEM3_MEMSET3_4 ((uint32_t)0x00000010) /*!< Bit 4 */ +#define FSMC_PMEM3_MEMSET3_5 ((uint32_t)0x00000020) /*!< Bit 5 */ +#define FSMC_PMEM3_MEMSET3_6 ((uint32_t)0x00000040) /*!< Bit 6 */ +#define FSMC_PMEM3_MEMSET3_7 ((uint32_t)0x00000080) /*!< Bit 7 */ + +#define FSMC_PMEM3_MEMWAIT3 ((uint32_t)0x0000FF00) /*!< MEMWAIT3[7:0] bits (Common memory 3 wait time) */ +#define FSMC_PMEM3_MEMWAIT3_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define FSMC_PMEM3_MEMWAIT3_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define FSMC_PMEM3_MEMWAIT3_2 ((uint32_t)0x00000400) /*!< Bit 2 */ +#define FSMC_PMEM3_MEMWAIT3_3 ((uint32_t)0x00000800) /*!< Bit 3 */ +#define FSMC_PMEM3_MEMWAIT3_4 ((uint32_t)0x00001000) /*!< Bit 4 */ +#define FSMC_PMEM3_MEMWAIT3_5 ((uint32_t)0x00002000) /*!< Bit 5 */ +#define FSMC_PMEM3_MEMWAIT3_6 ((uint32_t)0x00004000) /*!< Bit 6 */ +#define FSMC_PMEM3_MEMWAIT3_7 ((uint32_t)0x00008000) /*!< Bit 7 */ + +#define FSMC_PMEM3_MEMHOLD3 ((uint32_t)0x00FF0000) /*!< MEMHOLD3[7:0] bits (Common memory 3 hold time) */ +#define FSMC_PMEM3_MEMHOLD3_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define FSMC_PMEM3_MEMHOLD3_1 ((uint32_t)0x00020000) /*!< Bit 1 */ +#define FSMC_PMEM3_MEMHOLD3_2 ((uint32_t)0x00040000) /*!< Bit 2 */ +#define FSMC_PMEM3_MEMHOLD3_3 ((uint32_t)0x00080000) /*!< Bit 3 */ +#define FSMC_PMEM3_MEMHOLD3_4 ((uint32_t)0x00100000) /*!< Bit 4 */ +#define FSMC_PMEM3_MEMHOLD3_5 ((uint32_t)0x00200000) /*!< Bit 5 */ +#define FSMC_PMEM3_MEMHOLD3_6 ((uint32_t)0x00400000) /*!< Bit 6 */ +#define FSMC_PMEM3_MEMHOLD3_7 ((uint32_t)0x00800000) /*!< Bit 7 */ + +#define FSMC_PMEM3_MEMHIZ3 ((uint32_t)0xFF000000) /*!< MEMHIZ3[7:0] bits (Common memory 3 databus HiZ time) */ +#define FSMC_PMEM3_MEMHIZ3_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define FSMC_PMEM3_MEMHIZ3_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define FSMC_PMEM3_MEMHIZ3_2 ((uint32_t)0x04000000) /*!< Bit 2 */ +#define FSMC_PMEM3_MEMHIZ3_3 ((uint32_t)0x08000000) /*!< Bit 3 */ +#define FSMC_PMEM3_MEMHIZ3_4 ((uint32_t)0x10000000) /*!< Bit 4 */ +#define FSMC_PMEM3_MEMHIZ3_5 ((uint32_t)0x20000000) /*!< Bit 5 */ +#define FSMC_PMEM3_MEMHIZ3_6 ((uint32_t)0x40000000) /*!< Bit 6 */ +#define FSMC_PMEM3_MEMHIZ3_7 ((uint32_t)0x80000000) /*!< Bit 7 */ + +/****************** Bit definition for FSMC_PMEM4 register ******************/ +#define FSMC_PMEM4_MEMSET4 ((uint32_t)0x000000FF) /*!< MEMSET4[7:0] bits (Common memory 4 setup time) */ +#define FSMC_PMEM4_MEMSET4_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define FSMC_PMEM4_MEMSET4_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define FSMC_PMEM4_MEMSET4_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define FSMC_PMEM4_MEMSET4_3 ((uint32_t)0x00000008) /*!< Bit 3 */ +#define FSMC_PMEM4_MEMSET4_4 ((uint32_t)0x00000010) /*!< Bit 4 */ +#define FSMC_PMEM4_MEMSET4_5 ((uint32_t)0x00000020) /*!< Bit 5 */ +#define FSMC_PMEM4_MEMSET4_6 ((uint32_t)0x00000040) /*!< Bit 6 */ +#define FSMC_PMEM4_MEMSET4_7 ((uint32_t)0x00000080) /*!< Bit 7 */ + +#define FSMC_PMEM4_MEMWAIT4 ((uint32_t)0x0000FF00) /*!< MEMWAIT4[7:0] bits (Common memory 4 wait time) */ +#define FSMC_PMEM4_MEMWAIT4_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define FSMC_PMEM4_MEMWAIT4_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define FSMC_PMEM4_MEMWAIT4_2 ((uint32_t)0x00000400) /*!< Bit 2 */ +#define FSMC_PMEM4_MEMWAIT4_3 ((uint32_t)0x00000800) /*!< Bit 3 */ +#define FSMC_PMEM4_MEMWAIT4_4 ((uint32_t)0x00001000) /*!< Bit 4 */ +#define FSMC_PMEM4_MEMWAIT4_5 ((uint32_t)0x00002000) /*!< Bit 5 */ +#define FSMC_PMEM4_MEMWAIT4_6 ((uint32_t)0x00004000) /*!< Bit 6 */ +#define FSMC_PMEM4_MEMWAIT4_7 ((uint32_t)0x00008000) /*!< Bit 7 */ + +#define FSMC_PMEM4_MEMHOLD4 ((uint32_t)0x00FF0000) /*!< MEMHOLD4[7:0] bits (Common memory 4 hold time) */ +#define FSMC_PMEM4_MEMHOLD4_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define FSMC_PMEM4_MEMHOLD4_1 ((uint32_t)0x00020000) /*!< Bit 1 */ +#define FSMC_PMEM4_MEMHOLD4_2 ((uint32_t)0x00040000) /*!< Bit 2 */ +#define FSMC_PMEM4_MEMHOLD4_3 ((uint32_t)0x00080000) /*!< Bit 3 */ +#define FSMC_PMEM4_MEMHOLD4_4 ((uint32_t)0x00100000) /*!< Bit 4 */ +#define FSMC_PMEM4_MEMHOLD4_5 ((uint32_t)0x00200000) /*!< Bit 5 */ +#define FSMC_PMEM4_MEMHOLD4_6 ((uint32_t)0x00400000) /*!< Bit 6 */ +#define FSMC_PMEM4_MEMHOLD4_7 ((uint32_t)0x00800000) /*!< Bit 7 */ + +#define FSMC_PMEM4_MEMHIZ4 ((uint32_t)0xFF000000) /*!< MEMHIZ4[7:0] bits (Common memory 4 databus HiZ time) */ +#define FSMC_PMEM4_MEMHIZ4_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define FSMC_PMEM4_MEMHIZ4_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define FSMC_PMEM4_MEMHIZ4_2 ((uint32_t)0x04000000) /*!< Bit 2 */ +#define FSMC_PMEM4_MEMHIZ4_3 ((uint32_t)0x08000000) /*!< Bit 3 */ +#define FSMC_PMEM4_MEMHIZ4_4 ((uint32_t)0x10000000) /*!< Bit 4 */ +#define FSMC_PMEM4_MEMHIZ4_5 ((uint32_t)0x20000000) /*!< Bit 5 */ +#define FSMC_PMEM4_MEMHIZ4_6 ((uint32_t)0x40000000) /*!< Bit 6 */ +#define FSMC_PMEM4_MEMHIZ4_7 ((uint32_t)0x80000000) /*!< Bit 7 */ + +/****************** Bit definition for FSMC_PATT2 register ******************/ +#define FSMC_PATT2_ATTSET2 ((uint32_t)0x000000FF) /*!< ATTSET2[7:0] bits (Attribute memory 2 setup time) */ +#define FSMC_PATT2_ATTSET2_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define FSMC_PATT2_ATTSET2_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define FSMC_PATT2_ATTSET2_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define FSMC_PATT2_ATTSET2_3 ((uint32_t)0x00000008) /*!< Bit 3 */ +#define FSMC_PATT2_ATTSET2_4 ((uint32_t)0x00000010) /*!< Bit 4 */ +#define FSMC_PATT2_ATTSET2_5 ((uint32_t)0x00000020) /*!< Bit 5 */ +#define FSMC_PATT2_ATTSET2_6 ((uint32_t)0x00000040) /*!< Bit 6 */ +#define FSMC_PATT2_ATTSET2_7 ((uint32_t)0x00000080) /*!< Bit 7 */ + +#define FSMC_PATT2_ATTWAIT2 ((uint32_t)0x0000FF00) /*!< ATTWAIT2[7:0] bits (Attribute memory 2 wait time) */ +#define FSMC_PATT2_ATTWAIT2_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define FSMC_PATT2_ATTWAIT2_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define FSMC_PATT2_ATTWAIT2_2 ((uint32_t)0x00000400) /*!< Bit 2 */ +#define FSMC_PATT2_ATTWAIT2_3 ((uint32_t)0x00000800) /*!< Bit 3 */ +#define FSMC_PATT2_ATTWAIT2_4 ((uint32_t)0x00001000) /*!< Bit 4 */ +#define FSMC_PATT2_ATTWAIT2_5 ((uint32_t)0x00002000) /*!< Bit 5 */ +#define FSMC_PATT2_ATTWAIT2_6 ((uint32_t)0x00004000) /*!< Bit 6 */ +#define FSMC_PATT2_ATTWAIT2_7 ((uint32_t)0x00008000) /*!< Bit 7 */ + +#define FSMC_PATT2_ATTHOLD2 ((uint32_t)0x00FF0000) /*!< ATTHOLD2[7:0] bits (Attribute memory 2 hold time) */ +#define FSMC_PATT2_ATTHOLD2_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define FSMC_PATT2_ATTHOLD2_1 ((uint32_t)0x00020000) /*!< Bit 1 */ +#define FSMC_PATT2_ATTHOLD2_2 ((uint32_t)0x00040000) /*!< Bit 2 */ +#define FSMC_PATT2_ATTHOLD2_3 ((uint32_t)0x00080000) /*!< Bit 3 */ +#define FSMC_PATT2_ATTHOLD2_4 ((uint32_t)0x00100000) /*!< Bit 4 */ +#define FSMC_PATT2_ATTHOLD2_5 ((uint32_t)0x00200000) /*!< Bit 5 */ +#define FSMC_PATT2_ATTHOLD2_6 ((uint32_t)0x00400000) /*!< Bit 6 */ +#define FSMC_PATT2_ATTHOLD2_7 ((uint32_t)0x00800000) /*!< Bit 7 */ + +#define FSMC_PATT2_ATTHIZ2 ((uint32_t)0xFF000000) /*!< ATTHIZ2[7:0] bits (Attribute memory 2 databus HiZ time) */ +#define FSMC_PATT2_ATTHIZ2_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define FSMC_PATT2_ATTHIZ2_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define FSMC_PATT2_ATTHIZ2_2 ((uint32_t)0x04000000) /*!< Bit 2 */ +#define FSMC_PATT2_ATTHIZ2_3 ((uint32_t)0x08000000) /*!< Bit 3 */ +#define FSMC_PATT2_ATTHIZ2_4 ((uint32_t)0x10000000) /*!< Bit 4 */ +#define FSMC_PATT2_ATTHIZ2_5 ((uint32_t)0x20000000) /*!< Bit 5 */ +#define FSMC_PATT2_ATTHIZ2_6 ((uint32_t)0x40000000) /*!< Bit 6 */ +#define FSMC_PATT2_ATTHIZ2_7 ((uint32_t)0x80000000) /*!< Bit 7 */ + +/****************** Bit definition for FSMC_PATT3 register ******************/ +#define FSMC_PATT3_ATTSET3 ((uint32_t)0x000000FF) /*!< ATTSET3[7:0] bits (Attribute memory 3 setup time) */ +#define FSMC_PATT3_ATTSET3_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define FSMC_PATT3_ATTSET3_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define FSMC_PATT3_ATTSET3_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define FSMC_PATT3_ATTSET3_3 ((uint32_t)0x00000008) /*!< Bit 3 */ +#define FSMC_PATT3_ATTSET3_4 ((uint32_t)0x00000010) /*!< Bit 4 */ +#define FSMC_PATT3_ATTSET3_5 ((uint32_t)0x00000020) /*!< Bit 5 */ +#define FSMC_PATT3_ATTSET3_6 ((uint32_t)0x00000040) /*!< Bit 6 */ +#define FSMC_PATT3_ATTSET3_7 ((uint32_t)0x00000080) /*!< Bit 7 */ + +#define FSMC_PATT3_ATTWAIT3 ((uint32_t)0x0000FF00) /*!< ATTWAIT3[7:0] bits (Attribute memory 3 wait time) */ +#define FSMC_PATT3_ATTWAIT3_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define FSMC_PATT3_ATTWAIT3_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define FSMC_PATT3_ATTWAIT3_2 ((uint32_t)0x00000400) /*!< Bit 2 */ +#define FSMC_PATT3_ATTWAIT3_3 ((uint32_t)0x00000800) /*!< Bit 3 */ +#define FSMC_PATT3_ATTWAIT3_4 ((uint32_t)0x00001000) /*!< Bit 4 */ +#define FSMC_PATT3_ATTWAIT3_5 ((uint32_t)0x00002000) /*!< Bit 5 */ +#define FSMC_PATT3_ATTWAIT3_6 ((uint32_t)0x00004000) /*!< Bit 6 */ +#define FSMC_PATT3_ATTWAIT3_7 ((uint32_t)0x00008000) /*!< Bit 7 */ + +#define FSMC_PATT3_ATTHOLD3 ((uint32_t)0x00FF0000) /*!< ATTHOLD3[7:0] bits (Attribute memory 3 hold time) */ +#define FSMC_PATT3_ATTHOLD3_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define FSMC_PATT3_ATTHOLD3_1 ((uint32_t)0x00020000) /*!< Bit 1 */ +#define FSMC_PATT3_ATTHOLD3_2 ((uint32_t)0x00040000) /*!< Bit 2 */ +#define FSMC_PATT3_ATTHOLD3_3 ((uint32_t)0x00080000) /*!< Bit 3 */ +#define FSMC_PATT3_ATTHOLD3_4 ((uint32_t)0x00100000) /*!< Bit 4 */ +#define FSMC_PATT3_ATTHOLD3_5 ((uint32_t)0x00200000) /*!< Bit 5 */ +#define FSMC_PATT3_ATTHOLD3_6 ((uint32_t)0x00400000) /*!< Bit 6 */ +#define FSMC_PATT3_ATTHOLD3_7 ((uint32_t)0x00800000) /*!< Bit 7 */ + +#define FSMC_PATT3_ATTHIZ3 ((uint32_t)0xFF000000) /*!< ATTHIZ3[7:0] bits (Attribute memory 3 databus HiZ time) */ +#define FSMC_PATT3_ATTHIZ3_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define FSMC_PATT3_ATTHIZ3_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define FSMC_PATT3_ATTHIZ3_2 ((uint32_t)0x04000000) /*!< Bit 2 */ +#define FSMC_PATT3_ATTHIZ3_3 ((uint32_t)0x08000000) /*!< Bit 3 */ +#define FSMC_PATT3_ATTHIZ3_4 ((uint32_t)0x10000000) /*!< Bit 4 */ +#define FSMC_PATT3_ATTHIZ3_5 ((uint32_t)0x20000000) /*!< Bit 5 */ +#define FSMC_PATT3_ATTHIZ3_6 ((uint32_t)0x40000000) /*!< Bit 6 */ +#define FSMC_PATT3_ATTHIZ3_7 ((uint32_t)0x80000000) /*!< Bit 7 */ + +/****************** Bit definition for FSMC_PATT4 register ******************/ +#define FSMC_PATT4_ATTSET4 ((uint32_t)0x000000FF) /*!< ATTSET4[7:0] bits (Attribute memory 4 setup time) */ +#define FSMC_PATT4_ATTSET4_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define FSMC_PATT4_ATTSET4_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define FSMC_PATT4_ATTSET4_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define FSMC_PATT4_ATTSET4_3 ((uint32_t)0x00000008) /*!< Bit 3 */ +#define FSMC_PATT4_ATTSET4_4 ((uint32_t)0x00000010) /*!< Bit 4 */ +#define FSMC_PATT4_ATTSET4_5 ((uint32_t)0x00000020) /*!< Bit 5 */ +#define FSMC_PATT4_ATTSET4_6 ((uint32_t)0x00000040) /*!< Bit 6 */ +#define FSMC_PATT4_ATTSET4_7 ((uint32_t)0x00000080) /*!< Bit 7 */ + +#define FSMC_PATT4_ATTWAIT4 ((uint32_t)0x0000FF00) /*!< ATTWAIT4[7:0] bits (Attribute memory 4 wait time) */ +#define FSMC_PATT4_ATTWAIT4_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define FSMC_PATT4_ATTWAIT4_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define FSMC_PATT4_ATTWAIT4_2 ((uint32_t)0x00000400) /*!< Bit 2 */ +#define FSMC_PATT4_ATTWAIT4_3 ((uint32_t)0x00000800) /*!< Bit 3 */ +#define FSMC_PATT4_ATTWAIT4_4 ((uint32_t)0x00001000) /*!< Bit 4 */ +#define FSMC_PATT4_ATTWAIT4_5 ((uint32_t)0x00002000) /*!< Bit 5 */ +#define FSMC_PATT4_ATTWAIT4_6 ((uint32_t)0x00004000) /*!< Bit 6 */ +#define FSMC_PATT4_ATTWAIT4_7 ((uint32_t)0x00008000) /*!< Bit 7 */ + +#define FSMC_PATT4_ATTHOLD4 ((uint32_t)0x00FF0000) /*!< ATTHOLD4[7:0] bits (Attribute memory 4 hold time) */ +#define FSMC_PATT4_ATTHOLD4_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define FSMC_PATT4_ATTHOLD4_1 ((uint32_t)0x00020000) /*!< Bit 1 */ +#define FSMC_PATT4_ATTHOLD4_2 ((uint32_t)0x00040000) /*!< Bit 2 */ +#define FSMC_PATT4_ATTHOLD4_3 ((uint32_t)0x00080000) /*!< Bit 3 */ +#define FSMC_PATT4_ATTHOLD4_4 ((uint32_t)0x00100000) /*!< Bit 4 */ +#define FSMC_PATT4_ATTHOLD4_5 ((uint32_t)0x00200000) /*!< Bit 5 */ +#define FSMC_PATT4_ATTHOLD4_6 ((uint32_t)0x00400000) /*!< Bit 6 */ +#define FSMC_PATT4_ATTHOLD4_7 ((uint32_t)0x00800000) /*!< Bit 7 */ + +#define FSMC_PATT4_ATTHIZ4 ((uint32_t)0xFF000000) /*!< ATTHIZ4[7:0] bits (Attribute memory 4 databus HiZ time) */ +#define FSMC_PATT4_ATTHIZ4_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define FSMC_PATT4_ATTHIZ4_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define FSMC_PATT4_ATTHIZ4_2 ((uint32_t)0x04000000) /*!< Bit 2 */ +#define FSMC_PATT4_ATTHIZ4_3 ((uint32_t)0x08000000) /*!< Bit 3 */ +#define FSMC_PATT4_ATTHIZ4_4 ((uint32_t)0x10000000) /*!< Bit 4 */ +#define FSMC_PATT4_ATTHIZ4_5 ((uint32_t)0x20000000) /*!< Bit 5 */ +#define FSMC_PATT4_ATTHIZ4_6 ((uint32_t)0x40000000) /*!< Bit 6 */ +#define FSMC_PATT4_ATTHIZ4_7 ((uint32_t)0x80000000) /*!< Bit 7 */ + +/****************** Bit definition for FSMC_PIO4 register *******************/ +#define FSMC_PIO4_IOSET4 ((uint32_t)0x000000FF) /*!< IOSET4[7:0] bits (I/O 4 setup time) */ +#define FSMC_PIO4_IOSET4_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define FSMC_PIO4_IOSET4_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define FSMC_PIO4_IOSET4_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define FSMC_PIO4_IOSET4_3 ((uint32_t)0x00000008) /*!< Bit 3 */ +#define FSMC_PIO4_IOSET4_4 ((uint32_t)0x00000010) /*!< Bit 4 */ +#define FSMC_PIO4_IOSET4_5 ((uint32_t)0x00000020) /*!< Bit 5 */ +#define FSMC_PIO4_IOSET4_6 ((uint32_t)0x00000040) /*!< Bit 6 */ +#define FSMC_PIO4_IOSET4_7 ((uint32_t)0x00000080) /*!< Bit 7 */ + +#define FSMC_PIO4_IOWAIT4 ((uint32_t)0x0000FF00) /*!< IOWAIT4[7:0] bits (I/O 4 wait time) */ +#define FSMC_PIO4_IOWAIT4_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define FSMC_PIO4_IOWAIT4_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define FSMC_PIO4_IOWAIT4_2 ((uint32_t)0x00000400) /*!< Bit 2 */ +#define FSMC_PIO4_IOWAIT4_3 ((uint32_t)0x00000800) /*!< Bit 3 */ +#define FSMC_PIO4_IOWAIT4_4 ((uint32_t)0x00001000) /*!< Bit 4 */ +#define FSMC_PIO4_IOWAIT4_5 ((uint32_t)0x00002000) /*!< Bit 5 */ +#define FSMC_PIO4_IOWAIT4_6 ((uint32_t)0x00004000) /*!< Bit 6 */ +#define FSMC_PIO4_IOWAIT4_7 ((uint32_t)0x00008000) /*!< Bit 7 */ + +#define FSMC_PIO4_IOHOLD4 ((uint32_t)0x00FF0000) /*!< IOHOLD4[7:0] bits (I/O 4 hold time) */ +#define FSMC_PIO4_IOHOLD4_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define FSMC_PIO4_IOHOLD4_1 ((uint32_t)0x00020000) /*!< Bit 1 */ +#define FSMC_PIO4_IOHOLD4_2 ((uint32_t)0x00040000) /*!< Bit 2 */ +#define FSMC_PIO4_IOHOLD4_3 ((uint32_t)0x00080000) /*!< Bit 3 */ +#define FSMC_PIO4_IOHOLD4_4 ((uint32_t)0x00100000) /*!< Bit 4 */ +#define FSMC_PIO4_IOHOLD4_5 ((uint32_t)0x00200000) /*!< Bit 5 */ +#define FSMC_PIO4_IOHOLD4_6 ((uint32_t)0x00400000) /*!< Bit 6 */ +#define FSMC_PIO4_IOHOLD4_7 ((uint32_t)0x00800000) /*!< Bit 7 */ + +#define FSMC_PIO4_IOHIZ4 ((uint32_t)0xFF000000) /*!< IOHIZ4[7:0] bits (I/O 4 databus HiZ time) */ +#define FSMC_PIO4_IOHIZ4_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define FSMC_PIO4_IOHIZ4_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define FSMC_PIO4_IOHIZ4_2 ((uint32_t)0x04000000) /*!< Bit 2 */ +#define FSMC_PIO4_IOHIZ4_3 ((uint32_t)0x08000000) /*!< Bit 3 */ +#define FSMC_PIO4_IOHIZ4_4 ((uint32_t)0x10000000) /*!< Bit 4 */ +#define FSMC_PIO4_IOHIZ4_5 ((uint32_t)0x20000000) /*!< Bit 5 */ +#define FSMC_PIO4_IOHIZ4_6 ((uint32_t)0x40000000) /*!< Bit 6 */ +#define FSMC_PIO4_IOHIZ4_7 ((uint32_t)0x80000000) /*!< Bit 7 */ + +/****************** Bit definition for FSMC_ECCR2 register ******************/ +#define FSMC_ECCR2_ECC2 ((uint32_t)0xFFFFFFFF) /*!< ECC result */ + +/****************** Bit definition for FSMC_ECCR3 register ******************/ +#define FSMC_ECCR3_ECC3 ((uint32_t)0xFFFFFFFF) /*!< ECC result */ + +/******************************************************************************/ +/* */ +/* SD host Interface */ +/* */ +/******************************************************************************/ + +/****************** Bit definition for SDIO_POWER register ******************/ +#define SDIO_POWER_PWRCTRL ((uint8_t)0x03) /*!< PWRCTRL[1:0] bits (Power supply control bits) */ +#define SDIO_POWER_PWRCTRL_0 ((uint8_t)0x01) /*!< Bit 0 */ +#define SDIO_POWER_PWRCTRL_1 ((uint8_t)0x02) /*!< Bit 1 */ + +/****************** Bit definition for SDIO_CLKCR register ******************/ +#define SDIO_CLKCR_CLKDIV ((uint16_t)0x00FF) /*!< Clock divide factor */ +#define SDIO_CLKCR_CLKEN ((uint16_t)0x0100) /*!< Clock enable bit */ +#define SDIO_CLKCR_PWRSAV ((uint16_t)0x0200) /*!< Power saving configuration bit */ +#define SDIO_CLKCR_BYPASS ((uint16_t)0x0400) /*!< Clock divider bypass enable bit */ + +#define SDIO_CLKCR_WIDBUS ((uint16_t)0x1800) /*!< WIDBUS[1:0] bits (Wide bus mode enable bit) */ +#define SDIO_CLKCR_WIDBUS_0 ((uint16_t)0x0800) /*!< Bit 0 */ +#define SDIO_CLKCR_WIDBUS_1 ((uint16_t)0x1000) /*!< Bit 1 */ + +#define SDIO_CLKCR_NEGEDGE ((uint16_t)0x2000) /*!< SDIO_CK dephasing selection bit */ +#define SDIO_CLKCR_HWFC_EN ((uint16_t)0x4000) /*!< HW Flow Control enable */ + +/******************* Bit definition for SDIO_ARG register *******************/ +#define SDIO_ARG_CMDARG ((uint32_t)0xFFFFFFFF) /*!< Command argument */ + +/******************* Bit definition for SDIO_CMD register *******************/ +#define SDIO_CMD_CMDINDEX ((uint16_t)0x003F) /*!< Command Index */ + +#define SDIO_CMD_WAITRESP ((uint16_t)0x00C0) /*!< WAITRESP[1:0] bits (Wait for response bits) */ +#define SDIO_CMD_WAITRESP_0 ((uint16_t)0x0040) /*!< Bit 0 */ +#define SDIO_CMD_WAITRESP_1 ((uint16_t)0x0080) /*!< Bit 1 */ + +#define SDIO_CMD_WAITINT ((uint16_t)0x0100) /*!< CPSM Waits for Interrupt Request */ +#define SDIO_CMD_WAITPEND ((uint16_t)0x0200) /*!< CPSM Waits for ends of data transfer (CmdPend internal signal) */ +#define SDIO_CMD_CPSMEN ((uint16_t)0x0400) /*!< Command path state machine (CPSM) Enable bit */ +#define SDIO_CMD_SDIOSUSPEND ((uint16_t)0x0800) /*!< SD I/O suspend command */ +#define SDIO_CMD_ENCMDCOMPL ((uint16_t)0x1000) /*!< Enable CMD completion */ +#define SDIO_CMD_NIEN ((uint16_t)0x2000) /*!< Not Interrupt Enable */ +#define SDIO_CMD_CEATACMD ((uint16_t)0x4000) /*!< CE-ATA command */ + +/***************** Bit definition for SDIO_RESPCMD register *****************/ +#define SDIO_RESPCMD_RESPCMD ((uint8_t)0x3F) /*!< Response command index */ + +/****************** Bit definition for SDIO_RESP0 register ******************/ +#define SDIO_RESP0_CARDSTATUS0 ((uint32_t)0xFFFFFFFF) /*!< Card Status */ + +/****************** Bit definition for SDIO_RESP1 register ******************/ +#define SDIO_RESP1_CARDSTATUS1 ((uint32_t)0xFFFFFFFF) /*!< Card Status */ + +/****************** Bit definition for SDIO_RESP2 register ******************/ +#define SDIO_RESP2_CARDSTATUS2 ((uint32_t)0xFFFFFFFF) /*!< Card Status */ + +/****************** Bit definition for SDIO_RESP3 register ******************/ +#define SDIO_RESP3_CARDSTATUS3 ((uint32_t)0xFFFFFFFF) /*!< Card Status */ + +/****************** Bit definition for SDIO_RESP4 register ******************/ +#define SDIO_RESP4_CARDSTATUS4 ((uint32_t)0xFFFFFFFF) /*!< Card Status */ + +/****************** Bit definition for SDIO_DTIMER register *****************/ +#define SDIO_DTIMER_DATATIME ((uint32_t)0xFFFFFFFF) /*!< Data timeout period. */ + +/****************** Bit definition for SDIO_DLEN register *******************/ +#define SDIO_DLEN_DATALENGTH ((uint32_t)0x01FFFFFF) /*!< Data length value */ + +/****************** Bit definition for SDIO_DCTRL register ******************/ +#define SDIO_DCTRL_DTEN ((uint16_t)0x0001) /*!< Data transfer enabled bit */ +#define SDIO_DCTRL_DTDIR ((uint16_t)0x0002) /*!< Data transfer direction selection */ +#define SDIO_DCTRL_DTMODE ((uint16_t)0x0004) /*!< Data transfer mode selection */ +#define SDIO_DCTRL_DMAEN ((uint16_t)0x0008) /*!< DMA enabled bit */ + +#define SDIO_DCTRL_DBLOCKSIZE ((uint16_t)0x00F0) /*!< DBLOCKSIZE[3:0] bits (Data block size) */ +#define SDIO_DCTRL_DBLOCKSIZE_0 ((uint16_t)0x0010) /*!< Bit 0 */ +#define SDIO_DCTRL_DBLOCKSIZE_1 ((uint16_t)0x0020) /*!< Bit 1 */ +#define SDIO_DCTRL_DBLOCKSIZE_2 ((uint16_t)0x0040) /*!< Bit 2 */ +#define SDIO_DCTRL_DBLOCKSIZE_3 ((uint16_t)0x0080) /*!< Bit 3 */ + +#define SDIO_DCTRL_RWSTART ((uint16_t)0x0100) /*!< Read wait start */ +#define SDIO_DCTRL_RWSTOP ((uint16_t)0x0200) /*!< Read wait stop */ +#define SDIO_DCTRL_RWMOD ((uint16_t)0x0400) /*!< Read wait mode */ +#define SDIO_DCTRL_SDIOEN ((uint16_t)0x0800) /*!< SD I/O enable functions */ + +/****************** Bit definition for SDIO_DCOUNT register *****************/ +#define SDIO_DCOUNT_DATACOUNT ((uint32_t)0x01FFFFFF) /*!< Data count value */ + +/****************** Bit definition for SDIO_STA register ********************/ +#define SDIO_STA_CCRCFAIL ((uint32_t)0x00000001) /*!< Command response received (CRC check failed) */ +#define SDIO_STA_DCRCFAIL ((uint32_t)0x00000002) /*!< Data block sent/received (CRC check failed) */ +#define SDIO_STA_CTIMEOUT ((uint32_t)0x00000004) /*!< Command response timeout */ +#define SDIO_STA_DTIMEOUT ((uint32_t)0x00000008) /*!< Data timeout */ +#define SDIO_STA_TXUNDERR ((uint32_t)0x00000010) /*!< Transmit FIFO underrun error */ +#define SDIO_STA_RXOVERR ((uint32_t)0x00000020) /*!< Received FIFO overrun error */ +#define SDIO_STA_CMDREND ((uint32_t)0x00000040) /*!< Command response received (CRC check passed) */ +#define SDIO_STA_CMDSENT ((uint32_t)0x00000080) /*!< Command sent (no response required) */ +#define SDIO_STA_DATAEND ((uint32_t)0x00000100) /*!< Data end (data counter, SDIDCOUNT, is zero) */ +#define SDIO_STA_STBITERR ((uint32_t)0x00000200) /*!< Start bit not detected on all data signals in wide bus mode */ +#define SDIO_STA_DBCKEND ((uint32_t)0x00000400) /*!< Data block sent/received (CRC check passed) */ +#define SDIO_STA_CMDACT ((uint32_t)0x00000800) /*!< Command transfer in progress */ +#define SDIO_STA_TXACT ((uint32_t)0x00001000) /*!< Data transmit in progress */ +#define SDIO_STA_RXACT ((uint32_t)0x00002000) /*!< Data receive in progress */ +#define SDIO_STA_TXFIFOHE ((uint32_t)0x00004000) /*!< Transmit FIFO Half Empty: at least 8 words can be written into the FIFO */ +#define SDIO_STA_RXFIFOHF ((uint32_t)0x00008000) /*!< Receive FIFO Half Full: there are at least 8 words in the FIFO */ +#define SDIO_STA_TXFIFOF ((uint32_t)0x00010000) /*!< Transmit FIFO full */ +#define SDIO_STA_RXFIFOF ((uint32_t)0x00020000) /*!< Receive FIFO full */ +#define SDIO_STA_TXFIFOE ((uint32_t)0x00040000) /*!< Transmit FIFO empty */ +#define SDIO_STA_RXFIFOE ((uint32_t)0x00080000) /*!< Receive FIFO empty */ +#define SDIO_STA_TXDAVL ((uint32_t)0x00100000) /*!< Data available in transmit FIFO */ +#define SDIO_STA_RXDAVL ((uint32_t)0x00200000) /*!< Data available in receive FIFO */ +#define SDIO_STA_SDIOIT ((uint32_t)0x00400000) /*!< SDIO interrupt received */ +#define SDIO_STA_CEATAEND ((uint32_t)0x00800000) /*!< CE-ATA command completion signal received for CMD61 */ + +/******************* Bit definition for SDIO_ICR register *******************/ +#define SDIO_ICR_CCRCFAILC ((uint32_t)0x00000001) /*!< CCRCFAIL flag clear bit */ +#define SDIO_ICR_DCRCFAILC ((uint32_t)0x00000002) /*!< DCRCFAIL flag clear bit */ +#define SDIO_ICR_CTIMEOUTC ((uint32_t)0x00000004) /*!< CTIMEOUT flag clear bit */ +#define SDIO_ICR_DTIMEOUTC ((uint32_t)0x00000008) /*!< DTIMEOUT flag clear bit */ +#define SDIO_ICR_TXUNDERRC ((uint32_t)0x00000010) /*!< TXUNDERR flag clear bit */ +#define SDIO_ICR_RXOVERRC ((uint32_t)0x00000020) /*!< RXOVERR flag clear bit */ +#define SDIO_ICR_CMDRENDC ((uint32_t)0x00000040) /*!< CMDREND flag clear bit */ +#define SDIO_ICR_CMDSENTC ((uint32_t)0x00000080) /*!< CMDSENT flag clear bit */ +#define SDIO_ICR_DATAENDC ((uint32_t)0x00000100) /*!< DATAEND flag clear bit */ +#define SDIO_ICR_STBITERRC ((uint32_t)0x00000200) /*!< STBITERR flag clear bit */ +#define SDIO_ICR_DBCKENDC ((uint32_t)0x00000400) /*!< DBCKEND flag clear bit */ +#define SDIO_ICR_SDIOITC ((uint32_t)0x00400000) /*!< SDIOIT flag clear bit */ +#define SDIO_ICR_CEATAENDC ((uint32_t)0x00800000) /*!< CEATAEND flag clear bit */ + +/****************** Bit definition for SDIO_MASK register *******************/ +#define SDIO_MASK_CCRCFAILIE ((uint32_t)0x00000001) /*!< Command CRC Fail Interrupt Enable */ +#define SDIO_MASK_DCRCFAILIE ((uint32_t)0x00000002) /*!< Data CRC Fail Interrupt Enable */ +#define SDIO_MASK_CTIMEOUTIE ((uint32_t)0x00000004) /*!< Command TimeOut Interrupt Enable */ +#define SDIO_MASK_DTIMEOUTIE ((uint32_t)0x00000008) /*!< Data TimeOut Interrupt Enable */ +#define SDIO_MASK_TXUNDERRIE ((uint32_t)0x00000010) /*!< Tx FIFO UnderRun Error Interrupt Enable */ +#define SDIO_MASK_RXOVERRIE ((uint32_t)0x00000020) /*!< Rx FIFO OverRun Error Interrupt Enable */ +#define SDIO_MASK_CMDRENDIE ((uint32_t)0x00000040) /*!< Command Response Received Interrupt Enable */ +#define SDIO_MASK_CMDSENTIE ((uint32_t)0x00000080) /*!< Command Sent Interrupt Enable */ +#define SDIO_MASK_DATAENDIE ((uint32_t)0x00000100) /*!< Data End Interrupt Enable */ +#define SDIO_MASK_STBITERRIE ((uint32_t)0x00000200) /*!< Start Bit Error Interrupt Enable */ +#define SDIO_MASK_DBCKENDIE ((uint32_t)0x00000400) /*!< Data Block End Interrupt Enable */ +#define SDIO_MASK_CMDACTIE ((uint32_t)0x00000800) /*!< Command Acting Interrupt Enable */ +#define SDIO_MASK_TXACTIE ((uint32_t)0x00001000) /*!< Data Transmit Acting Interrupt Enable */ +#define SDIO_MASK_RXACTIE ((uint32_t)0x00002000) /*!< Data receive acting interrupt enabled */ +#define SDIO_MASK_TXFIFOHEIE ((uint32_t)0x00004000) /*!< Tx FIFO Half Empty interrupt Enable */ +#define SDIO_MASK_RXFIFOHFIE ((uint32_t)0x00008000) /*!< Rx FIFO Half Full interrupt Enable */ +#define SDIO_MASK_TXFIFOFIE ((uint32_t)0x00010000) /*!< Tx FIFO Full interrupt Enable */ +#define SDIO_MASK_RXFIFOFIE ((uint32_t)0x00020000) /*!< Rx FIFO Full interrupt Enable */ +#define SDIO_MASK_TXFIFOEIE ((uint32_t)0x00040000) /*!< Tx FIFO Empty interrupt Enable */ +#define SDIO_MASK_RXFIFOEIE ((uint32_t)0x00080000) /*!< Rx FIFO Empty interrupt Enable */ +#define SDIO_MASK_TXDAVLIE ((uint32_t)0x00100000) /*!< Data available in Tx FIFO interrupt Enable */ +#define SDIO_MASK_RXDAVLIE ((uint32_t)0x00200000) /*!< Data available in Rx FIFO interrupt Enable */ +#define SDIO_MASK_SDIOITIE ((uint32_t)0x00400000) /*!< SDIO Mode Interrupt Received interrupt Enable */ +#define SDIO_MASK_CEATAENDIE ((uint32_t)0x00800000) /*!< CE-ATA command completion signal received Interrupt Enable */ + +/***************** Bit definition for SDIO_FIFOCNT register *****************/ +#define SDIO_FIFOCNT_FIFOCOUNT ((uint32_t)0x00FFFFFF) /*!< Remaining number of words to be written to or read from the FIFO */ + +/****************** Bit definition for SDIO_FIFO register *******************/ +#define SDIO_FIFO_FIFODATA ((uint32_t)0xFFFFFFFF) /*!< Receive and transmit FIFO data */ + +/******************************************************************************/ +/* */ +/* USB Device FS */ +/* */ +/******************************************************************************/ + +/*!< Endpoint-specific registers */ +/******************* Bit definition for USB_EP0R register *******************/ +#define USB_EP0R_EA ((uint16_t)0x000F) /*!< Endpoint Address */ + +#define USB_EP0R_STAT_TX ((uint16_t)0x0030) /*!< STAT_TX[1:0] bits (Status bits, for transmission transfers) */ +#define USB_EP0R_STAT_TX_0 ((uint16_t)0x0010) /*!< Bit 0 */ +#define USB_EP0R_STAT_TX_1 ((uint16_t)0x0020) /*!< Bit 1 */ + +#define USB_EP0R_DTOG_TX ((uint16_t)0x0040) /*!< Data Toggle, for transmission transfers */ +#define USB_EP0R_CTR_TX ((uint16_t)0x0080) /*!< Correct Transfer for transmission */ +#define USB_EP0R_EP_KIND ((uint16_t)0x0100) /*!< Endpoint Kind */ + +#define USB_EP0R_EP_TYPE ((uint16_t)0x0600) /*!< EP_TYPE[1:0] bits (Endpoint type) */ +#define USB_EP0R_EP_TYPE_0 ((uint16_t)0x0200) /*!< Bit 0 */ +#define USB_EP0R_EP_TYPE_1 ((uint16_t)0x0400) /*!< Bit 1 */ + +#define USB_EP0R_SETUP ((uint16_t)0x0800) /*!< Setup transaction completed */ + +#define USB_EP0R_STAT_RX ((uint16_t)0x3000) /*!< STAT_RX[1:0] bits (Status bits, for reception transfers) */ +#define USB_EP0R_STAT_RX_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define USB_EP0R_STAT_RX_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define USB_EP0R_DTOG_RX ((uint16_t)0x4000) /*!< Data Toggle, for reception transfers */ +#define USB_EP0R_CTR_RX ((uint16_t)0x8000) /*!< Correct Transfer for reception */ + +/******************* Bit definition for USB_EP1R register *******************/ +#define USB_EP1R_EA ((uint16_t)0x000F) /*!< Endpoint Address */ + +#define USB_EP1R_STAT_TX ((uint16_t)0x0030) /*!< STAT_TX[1:0] bits (Status bits, for transmission transfers) */ +#define USB_EP1R_STAT_TX_0 ((uint16_t)0x0010) /*!< Bit 0 */ +#define USB_EP1R_STAT_TX_1 ((uint16_t)0x0020) /*!< Bit 1 */ + +#define USB_EP1R_DTOG_TX ((uint16_t)0x0040) /*!< Data Toggle, for transmission transfers */ +#define USB_EP1R_CTR_TX ((uint16_t)0x0080) /*!< Correct Transfer for transmission */ +#define USB_EP1R_EP_KIND ((uint16_t)0x0100) /*!< Endpoint Kind */ + +#define USB_EP1R_EP_TYPE ((uint16_t)0x0600) /*!< EP_TYPE[1:0] bits (Endpoint type) */ +#define USB_EP1R_EP_TYPE_0 ((uint16_t)0x0200) /*!< Bit 0 */ +#define USB_EP1R_EP_TYPE_1 ((uint16_t)0x0400) /*!< Bit 1 */ + +#define USB_EP1R_SETUP ((uint16_t)0x0800) /*!< Setup transaction completed */ + +#define USB_EP1R_STAT_RX ((uint16_t)0x3000) /*!< STAT_RX[1:0] bits (Status bits, for reception transfers) */ +#define USB_EP1R_STAT_RX_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define USB_EP1R_STAT_RX_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define USB_EP1R_DTOG_RX ((uint16_t)0x4000) /*!< Data Toggle, for reception transfers */ +#define USB_EP1R_CTR_RX ((uint16_t)0x8000) /*!< Correct Transfer for reception */ + +/******************* Bit definition for USB_EP2R register *******************/ +#define USB_EP2R_EA ((uint16_t)0x000F) /*!< Endpoint Address */ + +#define USB_EP2R_STAT_TX ((uint16_t)0x0030) /*!< STAT_TX[1:0] bits (Status bits, for transmission transfers) */ +#define USB_EP2R_STAT_TX_0 ((uint16_t)0x0010) /*!< Bit 0 */ +#define USB_EP2R_STAT_TX_1 ((uint16_t)0x0020) /*!< Bit 1 */ + +#define USB_EP2R_DTOG_TX ((uint16_t)0x0040) /*!< Data Toggle, for transmission transfers */ +#define USB_EP2R_CTR_TX ((uint16_t)0x0080) /*!< Correct Transfer for transmission */ +#define USB_EP2R_EP_KIND ((uint16_t)0x0100) /*!< Endpoint Kind */ + +#define USB_EP2R_EP_TYPE ((uint16_t)0x0600) /*!< EP_TYPE[1:0] bits (Endpoint type) */ +#define USB_EP2R_EP_TYPE_0 ((uint16_t)0x0200) /*!< Bit 0 */ +#define USB_EP2R_EP_TYPE_1 ((uint16_t)0x0400) /*!< Bit 1 */ + +#define USB_EP2R_SETUP ((uint16_t)0x0800) /*!< Setup transaction completed */ + +#define USB_EP2R_STAT_RX ((uint16_t)0x3000) /*!< STAT_RX[1:0] bits (Status bits, for reception transfers) */ +#define USB_EP2R_STAT_RX_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define USB_EP2R_STAT_RX_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define USB_EP2R_DTOG_RX ((uint16_t)0x4000) /*!< Data Toggle, for reception transfers */ +#define USB_EP2R_CTR_RX ((uint16_t)0x8000) /*!< Correct Transfer for reception */ + +/******************* Bit definition for USB_EP3R register *******************/ +#define USB_EP3R_EA ((uint16_t)0x000F) /*!< Endpoint Address */ + +#define USB_EP3R_STAT_TX ((uint16_t)0x0030) /*!< STAT_TX[1:0] bits (Status bits, for transmission transfers) */ +#define USB_EP3R_STAT_TX_0 ((uint16_t)0x0010) /*!< Bit 0 */ +#define USB_EP3R_STAT_TX_1 ((uint16_t)0x0020) /*!< Bit 1 */ + +#define USB_EP3R_DTOG_TX ((uint16_t)0x0040) /*!< Data Toggle, for transmission transfers */ +#define USB_EP3R_CTR_TX ((uint16_t)0x0080) /*!< Correct Transfer for transmission */ +#define USB_EP3R_EP_KIND ((uint16_t)0x0100) /*!< Endpoint Kind */ + +#define USB_EP3R_EP_TYPE ((uint16_t)0x0600) /*!< EP_TYPE[1:0] bits (Endpoint type) */ +#define USB_EP3R_EP_TYPE_0 ((uint16_t)0x0200) /*!< Bit 0 */ +#define USB_EP3R_EP_TYPE_1 ((uint16_t)0x0400) /*!< Bit 1 */ + +#define USB_EP3R_SETUP ((uint16_t)0x0800) /*!< Setup transaction completed */ + +#define USB_EP3R_STAT_RX ((uint16_t)0x3000) /*!< STAT_RX[1:0] bits (Status bits, for reception transfers) */ +#define USB_EP3R_STAT_RX_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define USB_EP3R_STAT_RX_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define USB_EP3R_DTOG_RX ((uint16_t)0x4000) /*!< Data Toggle, for reception transfers */ +#define USB_EP3R_CTR_RX ((uint16_t)0x8000) /*!< Correct Transfer for reception */ + +/******************* Bit definition for USB_EP4R register *******************/ +#define USB_EP4R_EA ((uint16_t)0x000F) /*!< Endpoint Address */ + +#define USB_EP4R_STAT_TX ((uint16_t)0x0030) /*!< STAT_TX[1:0] bits (Status bits, for transmission transfers) */ +#define USB_EP4R_STAT_TX_0 ((uint16_t)0x0010) /*!< Bit 0 */ +#define USB_EP4R_STAT_TX_1 ((uint16_t)0x0020) /*!< Bit 1 */ + +#define USB_EP4R_DTOG_TX ((uint16_t)0x0040) /*!< Data Toggle, for transmission transfers */ +#define USB_EP4R_CTR_TX ((uint16_t)0x0080) /*!< Correct Transfer for transmission */ +#define USB_EP4R_EP_KIND ((uint16_t)0x0100) /*!< Endpoint Kind */ + +#define USB_EP4R_EP_TYPE ((uint16_t)0x0600) /*!< EP_TYPE[1:0] bits (Endpoint type) */ +#define USB_EP4R_EP_TYPE_0 ((uint16_t)0x0200) /*!< Bit 0 */ +#define USB_EP4R_EP_TYPE_1 ((uint16_t)0x0400) /*!< Bit 1 */ + +#define USB_EP4R_SETUP ((uint16_t)0x0800) /*!< Setup transaction completed */ + +#define USB_EP4R_STAT_RX ((uint16_t)0x3000) /*!< STAT_RX[1:0] bits (Status bits, for reception transfers) */ +#define USB_EP4R_STAT_RX_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define USB_EP4R_STAT_RX_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define USB_EP4R_DTOG_RX ((uint16_t)0x4000) /*!< Data Toggle, for reception transfers */ +#define USB_EP4R_CTR_RX ((uint16_t)0x8000) /*!< Correct Transfer for reception */ + +/******************* Bit definition for USB_EP5R register *******************/ +#define USB_EP5R_EA ((uint16_t)0x000F) /*!< Endpoint Address */ + +#define USB_EP5R_STAT_TX ((uint16_t)0x0030) /*!< STAT_TX[1:0] bits (Status bits, for transmission transfers) */ +#define USB_EP5R_STAT_TX_0 ((uint16_t)0x0010) /*!< Bit 0 */ +#define USB_EP5R_STAT_TX_1 ((uint16_t)0x0020) /*!< Bit 1 */ + +#define USB_EP5R_DTOG_TX ((uint16_t)0x0040) /*!< Data Toggle, for transmission transfers */ +#define USB_EP5R_CTR_TX ((uint16_t)0x0080) /*!< Correct Transfer for transmission */ +#define USB_EP5R_EP_KIND ((uint16_t)0x0100) /*!< Endpoint Kind */ + +#define USB_EP5R_EP_TYPE ((uint16_t)0x0600) /*!< EP_TYPE[1:0] bits (Endpoint type) */ +#define USB_EP5R_EP_TYPE_0 ((uint16_t)0x0200) /*!< Bit 0 */ +#define USB_EP5R_EP_TYPE_1 ((uint16_t)0x0400) /*!< Bit 1 */ + +#define USB_EP5R_SETUP ((uint16_t)0x0800) /*!< Setup transaction completed */ + +#define USB_EP5R_STAT_RX ((uint16_t)0x3000) /*!< STAT_RX[1:0] bits (Status bits, for reception transfers) */ +#define USB_EP5R_STAT_RX_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define USB_EP5R_STAT_RX_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define USB_EP5R_DTOG_RX ((uint16_t)0x4000) /*!< Data Toggle, for reception transfers */ +#define USB_EP5R_CTR_RX ((uint16_t)0x8000) /*!< Correct Transfer for reception */ + +/******************* Bit definition for USB_EP6R register *******************/ +#define USB_EP6R_EA ((uint16_t)0x000F) /*!< Endpoint Address */ + +#define USB_EP6R_STAT_TX ((uint16_t)0x0030) /*!< STAT_TX[1:0] bits (Status bits, for transmission transfers) */ +#define USB_EP6R_STAT_TX_0 ((uint16_t)0x0010) /*!< Bit 0 */ +#define USB_EP6R_STAT_TX_1 ((uint16_t)0x0020) /*!< Bit 1 */ + +#define USB_EP6R_DTOG_TX ((uint16_t)0x0040) /*!< Data Toggle, for transmission transfers */ +#define USB_EP6R_CTR_TX ((uint16_t)0x0080) /*!< Correct Transfer for transmission */ +#define USB_EP6R_EP_KIND ((uint16_t)0x0100) /*!< Endpoint Kind */ + +#define USB_EP6R_EP_TYPE ((uint16_t)0x0600) /*!< EP_TYPE[1:0] bits (Endpoint type) */ +#define USB_EP6R_EP_TYPE_0 ((uint16_t)0x0200) /*!< Bit 0 */ +#define USB_EP6R_EP_TYPE_1 ((uint16_t)0x0400) /*!< Bit 1 */ + +#define USB_EP6R_SETUP ((uint16_t)0x0800) /*!< Setup transaction completed */ + +#define USB_EP6R_STAT_RX ((uint16_t)0x3000) /*!< STAT_RX[1:0] bits (Status bits, for reception transfers) */ +#define USB_EP6R_STAT_RX_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define USB_EP6R_STAT_RX_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define USB_EP6R_DTOG_RX ((uint16_t)0x4000) /*!< Data Toggle, for reception transfers */ +#define USB_EP6R_CTR_RX ((uint16_t)0x8000) /*!< Correct Transfer for reception */ + +/******************* Bit definition for USB_EP7R register *******************/ +#define USB_EP7R_EA ((uint16_t)0x000F) /*!< Endpoint Address */ + +#define USB_EP7R_STAT_TX ((uint16_t)0x0030) /*!< STAT_TX[1:0] bits (Status bits, for transmission transfers) */ +#define USB_EP7R_STAT_TX_0 ((uint16_t)0x0010) /*!< Bit 0 */ +#define USB_EP7R_STAT_TX_1 ((uint16_t)0x0020) /*!< Bit 1 */ + +#define USB_EP7R_DTOG_TX ((uint16_t)0x0040) /*!< Data Toggle, for transmission transfers */ +#define USB_EP7R_CTR_TX ((uint16_t)0x0080) /*!< Correct Transfer for transmission */ +#define USB_EP7R_EP_KIND ((uint16_t)0x0100) /*!< Endpoint Kind */ + +#define USB_EP7R_EP_TYPE ((uint16_t)0x0600) /*!< EP_TYPE[1:0] bits (Endpoint type) */ +#define USB_EP7R_EP_TYPE_0 ((uint16_t)0x0200) /*!< Bit 0 */ +#define USB_EP7R_EP_TYPE_1 ((uint16_t)0x0400) /*!< Bit 1 */ + +#define USB_EP7R_SETUP ((uint16_t)0x0800) /*!< Setup transaction completed */ + +#define USB_EP7R_STAT_RX ((uint16_t)0x3000) /*!< STAT_RX[1:0] bits (Status bits, for reception transfers) */ +#define USB_EP7R_STAT_RX_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define USB_EP7R_STAT_RX_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define USB_EP7R_DTOG_RX ((uint16_t)0x4000) /*!< Data Toggle, for reception transfers */ +#define USB_EP7R_CTR_RX ((uint16_t)0x8000) /*!< Correct Transfer for reception */ + +/*!< Common registers */ +/******************* Bit definition for USB_CNTR register *******************/ +#define USB_CNTR_FRES ((uint16_t)0x0001) /*!< Force USB Reset */ +#define USB_CNTR_PDWN ((uint16_t)0x0002) /*!< Power down */ +#define USB_CNTR_LP_MODE ((uint16_t)0x0004) /*!< Low-power mode */ +#define USB_CNTR_FSUSP ((uint16_t)0x0008) /*!< Force suspend */ +#define USB_CNTR_RESUME ((uint16_t)0x0010) /*!< Resume request */ +#define USB_CNTR_ESOFM ((uint16_t)0x0100) /*!< Expected Start Of Frame Interrupt Mask */ +#define USB_CNTR_SOFM ((uint16_t)0x0200) /*!< Start Of Frame Interrupt Mask */ +#define USB_CNTR_RESETM ((uint16_t)0x0400) /*!< RESET Interrupt Mask */ +#define USB_CNTR_SUSPM ((uint16_t)0x0800) /*!< Suspend mode Interrupt Mask */ +#define USB_CNTR_WKUPM ((uint16_t)0x1000) /*!< Wakeup Interrupt Mask */ +#define USB_CNTR_ERRM ((uint16_t)0x2000) /*!< Error Interrupt Mask */ +#define USB_CNTR_PMAOVRM ((uint16_t)0x4000) /*!< Packet Memory Area Over / Underrun Interrupt Mask */ +#define USB_CNTR_CTRM ((uint16_t)0x8000) /*!< Correct Transfer Interrupt Mask */ + +/******************* Bit definition for USB_ISTR register *******************/ +#define USB_ISTR_EP_ID ((uint16_t)0x000F) /*!< Endpoint Identifier */ +#define USB_ISTR_DIR ((uint16_t)0x0010) /*!< Direction of transaction */ +#define USB_ISTR_ESOF ((uint16_t)0x0100) /*!< Expected Start Of Frame */ +#define USB_ISTR_SOF ((uint16_t)0x0200) /*!< Start Of Frame */ +#define USB_ISTR_RESET ((uint16_t)0x0400) /*!< USB RESET request */ +#define USB_ISTR_SUSP ((uint16_t)0x0800) /*!< Suspend mode request */ +#define USB_ISTR_WKUP ((uint16_t)0x1000) /*!< Wake up */ +#define USB_ISTR_ERR ((uint16_t)0x2000) /*!< Error */ +#define USB_ISTR_PMAOVR ((uint16_t)0x4000) /*!< Packet Memory Area Over / Underrun */ +#define USB_ISTR_CTR ((uint16_t)0x8000) /*!< Correct Transfer */ + +/******************* Bit definition for USB_FNR register ********************/ +#define USB_FNR_FN ((uint16_t)0x07FF) /*!< Frame Number */ +#define USB_FNR_LSOF ((uint16_t)0x1800) /*!< Lost SOF */ +#define USB_FNR_LCK ((uint16_t)0x2000) /*!< Locked */ +#define USB_FNR_RXDM ((uint16_t)0x4000) /*!< Receive Data - Line Status */ +#define USB_FNR_RXDP ((uint16_t)0x8000) /*!< Receive Data + Line Status */ + +/****************** Bit definition for USB_DADDR register *******************/ +#define USB_DADDR_ADD ((uint8_t)0x7F) /*!< ADD[6:0] bits (Device Address) */ +#define USB_DADDR_ADD0 ((uint8_t)0x01) /*!< Bit 0 */ +#define USB_DADDR_ADD1 ((uint8_t)0x02) /*!< Bit 1 */ +#define USB_DADDR_ADD2 ((uint8_t)0x04) /*!< Bit 2 */ +#define USB_DADDR_ADD3 ((uint8_t)0x08) /*!< Bit 3 */ +#define USB_DADDR_ADD4 ((uint8_t)0x10) /*!< Bit 4 */ +#define USB_DADDR_ADD5 ((uint8_t)0x20) /*!< Bit 5 */ +#define USB_DADDR_ADD6 ((uint8_t)0x40) /*!< Bit 6 */ + +#define USB_DADDR_EF ((uint8_t)0x80) /*!< Enable Function */ + +/****************** Bit definition for USB_BTABLE register ******************/ +#define USB_BTABLE_BTABLE ((uint16_t)0xFFF8) /*!< Buffer Table */ + +/*!< Buffer descriptor table */ +/***************** Bit definition for USB_ADDR0_TX register *****************/ +#define USB_ADDR0_TX_ADDR0_TX ((uint16_t)0xFFFE) /*!< Transmission Buffer Address 0 */ + +/***************** Bit definition for USB_ADDR1_TX register *****************/ +#define USB_ADDR1_TX_ADDR1_TX ((uint16_t)0xFFFE) /*!< Transmission Buffer Address 1 */ + +/***************** Bit definition for USB_ADDR2_TX register *****************/ +#define USB_ADDR2_TX_ADDR2_TX ((uint16_t)0xFFFE) /*!< Transmission Buffer Address 2 */ + +/***************** Bit definition for USB_ADDR3_TX register *****************/ +#define USB_ADDR3_TX_ADDR3_TX ((uint16_t)0xFFFE) /*!< Transmission Buffer Address 3 */ + +/***************** Bit definition for USB_ADDR4_TX register *****************/ +#define USB_ADDR4_TX_ADDR4_TX ((uint16_t)0xFFFE) /*!< Transmission Buffer Address 4 */ + +/***************** Bit definition for USB_ADDR5_TX register *****************/ +#define USB_ADDR5_TX_ADDR5_TX ((uint16_t)0xFFFE) /*!< Transmission Buffer Address 5 */ + +/***************** Bit definition for USB_ADDR6_TX register *****************/ +#define USB_ADDR6_TX_ADDR6_TX ((uint16_t)0xFFFE) /*!< Transmission Buffer Address 6 */ + +/***************** Bit definition for USB_ADDR7_TX register *****************/ +#define USB_ADDR7_TX_ADDR7_TX ((uint16_t)0xFFFE) /*!< Transmission Buffer Address 7 */ + +/*----------------------------------------------------------------------------*/ + +/***************** Bit definition for USB_COUNT0_TX register ****************/ +#define USB_COUNT0_TX_COUNT0_TX ((uint16_t)0x03FF) /*!< Transmission Byte Count 0 */ + +/***************** Bit definition for USB_COUNT1_TX register ****************/ +#define USB_COUNT1_TX_COUNT1_TX ((uint16_t)0x03FF) /*!< Transmission Byte Count 1 */ + +/***************** Bit definition for USB_COUNT2_TX register ****************/ +#define USB_COUNT2_TX_COUNT2_TX ((uint16_t)0x03FF) /*!< Transmission Byte Count 2 */ + +/***************** Bit definition for USB_COUNT3_TX register ****************/ +#define USB_COUNT3_TX_COUNT3_TX ((uint16_t)0x03FF) /*!< Transmission Byte Count 3 */ + +/***************** Bit definition for USB_COUNT4_TX register ****************/ +#define USB_COUNT4_TX_COUNT4_TX ((uint16_t)0x03FF) /*!< Transmission Byte Count 4 */ + +/***************** Bit definition for USB_COUNT5_TX register ****************/ +#define USB_COUNT5_TX_COUNT5_TX ((uint16_t)0x03FF) /*!< Transmission Byte Count 5 */ + +/***************** Bit definition for USB_COUNT6_TX register ****************/ +#define USB_COUNT6_TX_COUNT6_TX ((uint16_t)0x03FF) /*!< Transmission Byte Count 6 */ + +/***************** Bit definition for USB_COUNT7_TX register ****************/ +#define USB_COUNT7_TX_COUNT7_TX ((uint16_t)0x03FF) /*!< Transmission Byte Count 7 */ + +/*----------------------------------------------------------------------------*/ + +/**************** Bit definition for USB_COUNT0_TX_0 register ***************/ +#define USB_COUNT0_TX_0_COUNT0_TX_0 ((uint32_t)0x000003FF) /*!< Transmission Byte Count 0 (low) */ + +/**************** Bit definition for USB_COUNT0_TX_1 register ***************/ +#define USB_COUNT0_TX_1_COUNT0_TX_1 ((uint32_t)0x03FF0000) /*!< Transmission Byte Count 0 (high) */ + +/**************** Bit definition for USB_COUNT1_TX_0 register ***************/ +#define USB_COUNT1_TX_0_COUNT1_TX_0 ((uint32_t)0x000003FF) /*!< Transmission Byte Count 1 (low) */ + +/**************** Bit definition for USB_COUNT1_TX_1 register ***************/ +#define USB_COUNT1_TX_1_COUNT1_TX_1 ((uint32_t)0x03FF0000) /*!< Transmission Byte Count 1 (high) */ + +/**************** Bit definition for USB_COUNT2_TX_0 register ***************/ +#define USB_COUNT2_TX_0_COUNT2_TX_0 ((uint32_t)0x000003FF) /*!< Transmission Byte Count 2 (low) */ + +/**************** Bit definition for USB_COUNT2_TX_1 register ***************/ +#define USB_COUNT2_TX_1_COUNT2_TX_1 ((uint32_t)0x03FF0000) /*!< Transmission Byte Count 2 (high) */ + +/**************** Bit definition for USB_COUNT3_TX_0 register ***************/ +#define USB_COUNT3_TX_0_COUNT3_TX_0 ((uint16_t)0x000003FF) /*!< Transmission Byte Count 3 (low) */ + +/**************** Bit definition for USB_COUNT3_TX_1 register ***************/ +#define USB_COUNT3_TX_1_COUNT3_TX_1 ((uint16_t)0x03FF0000) /*!< Transmission Byte Count 3 (high) */ + +/**************** Bit definition for USB_COUNT4_TX_0 register ***************/ +#define USB_COUNT4_TX_0_COUNT4_TX_0 ((uint32_t)0x000003FF) /*!< Transmission Byte Count 4 (low) */ + +/**************** Bit definition for USB_COUNT4_TX_1 register ***************/ +#define USB_COUNT4_TX_1_COUNT4_TX_1 ((uint32_t)0x03FF0000) /*!< Transmission Byte Count 4 (high) */ + +/**************** Bit definition for USB_COUNT5_TX_0 register ***************/ +#define USB_COUNT5_TX_0_COUNT5_TX_0 ((uint32_t)0x000003FF) /*!< Transmission Byte Count 5 (low) */ + +/**************** Bit definition for USB_COUNT5_TX_1 register ***************/ +#define USB_COUNT5_TX_1_COUNT5_TX_1 ((uint32_t)0x03FF0000) /*!< Transmission Byte Count 5 (high) */ + +/**************** Bit definition for USB_COUNT6_TX_0 register ***************/ +#define USB_COUNT6_TX_0_COUNT6_TX_0 ((uint32_t)0x000003FF) /*!< Transmission Byte Count 6 (low) */ + +/**************** Bit definition for USB_COUNT6_TX_1 register ***************/ +#define USB_COUNT6_TX_1_COUNT6_TX_1 ((uint32_t)0x03FF0000) /*!< Transmission Byte Count 6 (high) */ + +/**************** Bit definition for USB_COUNT7_TX_0 register ***************/ +#define USB_COUNT7_TX_0_COUNT7_TX_0 ((uint32_t)0x000003FF) /*!< Transmission Byte Count 7 (low) */ + +/**************** Bit definition for USB_COUNT7_TX_1 register ***************/ +#define USB_COUNT7_TX_1_COUNT7_TX_1 ((uint32_t)0x03FF0000) /*!< Transmission Byte Count 7 (high) */ + +/*----------------------------------------------------------------------------*/ + +/***************** Bit definition for USB_ADDR0_RX register *****************/ +#define USB_ADDR0_RX_ADDR0_RX ((uint16_t)0xFFFE) /*!< Reception Buffer Address 0 */ + +/***************** Bit definition for USB_ADDR1_RX register *****************/ +#define USB_ADDR1_RX_ADDR1_RX ((uint16_t)0xFFFE) /*!< Reception Buffer Address 1 */ + +/***************** Bit definition for USB_ADDR2_RX register *****************/ +#define USB_ADDR2_RX_ADDR2_RX ((uint16_t)0xFFFE) /*!< Reception Buffer Address 2 */ + +/***************** Bit definition for USB_ADDR3_RX register *****************/ +#define USB_ADDR3_RX_ADDR3_RX ((uint16_t)0xFFFE) /*!< Reception Buffer Address 3 */ + +/***************** Bit definition for USB_ADDR4_RX register *****************/ +#define USB_ADDR4_RX_ADDR4_RX ((uint16_t)0xFFFE) /*!< Reception Buffer Address 4 */ + +/***************** Bit definition for USB_ADDR5_RX register *****************/ +#define USB_ADDR5_RX_ADDR5_RX ((uint16_t)0xFFFE) /*!< Reception Buffer Address 5 */ + +/***************** Bit definition for USB_ADDR6_RX register *****************/ +#define USB_ADDR6_RX_ADDR6_RX ((uint16_t)0xFFFE) /*!< Reception Buffer Address 6 */ + +/***************** Bit definition for USB_ADDR7_RX register *****************/ +#define USB_ADDR7_RX_ADDR7_RX ((uint16_t)0xFFFE) /*!< Reception Buffer Address 7 */ + +/*----------------------------------------------------------------------------*/ + +/***************** Bit definition for USB_COUNT0_RX register ****************/ +#define USB_COUNT0_RX_COUNT0_RX ((uint16_t)0x03FF) /*!< Reception Byte Count */ + +#define USB_COUNT0_RX_NUM_BLOCK ((uint16_t)0x7C00) /*!< NUM_BLOCK[4:0] bits (Number of blocks) */ +#define USB_COUNT0_RX_NUM_BLOCK_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define USB_COUNT0_RX_NUM_BLOCK_1 ((uint16_t)0x0800) /*!< Bit 1 */ +#define USB_COUNT0_RX_NUM_BLOCK_2 ((uint16_t)0x1000) /*!< Bit 2 */ +#define USB_COUNT0_RX_NUM_BLOCK_3 ((uint16_t)0x2000) /*!< Bit 3 */ +#define USB_COUNT0_RX_NUM_BLOCK_4 ((uint16_t)0x4000) /*!< Bit 4 */ + +#define USB_COUNT0_RX_BLSIZE ((uint16_t)0x8000) /*!< BLock SIZE */ + +/***************** Bit definition for USB_COUNT1_RX register ****************/ +#define USB_COUNT1_RX_COUNT1_RX ((uint16_t)0x03FF) /*!< Reception Byte Count */ + +#define USB_COUNT1_RX_NUM_BLOCK ((uint16_t)0x7C00) /*!< NUM_BLOCK[4:0] bits (Number of blocks) */ +#define USB_COUNT1_RX_NUM_BLOCK_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define USB_COUNT1_RX_NUM_BLOCK_1 ((uint16_t)0x0800) /*!< Bit 1 */ +#define USB_COUNT1_RX_NUM_BLOCK_2 ((uint16_t)0x1000) /*!< Bit 2 */ +#define USB_COUNT1_RX_NUM_BLOCK_3 ((uint16_t)0x2000) /*!< Bit 3 */ +#define USB_COUNT1_RX_NUM_BLOCK_4 ((uint16_t)0x4000) /*!< Bit 4 */ + +#define USB_COUNT1_RX_BLSIZE ((uint16_t)0x8000) /*!< BLock SIZE */ + +/***************** Bit definition for USB_COUNT2_RX register ****************/ +#define USB_COUNT2_RX_COUNT2_RX ((uint16_t)0x03FF) /*!< Reception Byte Count */ + +#define USB_COUNT2_RX_NUM_BLOCK ((uint16_t)0x7C00) /*!< NUM_BLOCK[4:0] bits (Number of blocks) */ +#define USB_COUNT2_RX_NUM_BLOCK_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define USB_COUNT2_RX_NUM_BLOCK_1 ((uint16_t)0x0800) /*!< Bit 1 */ +#define USB_COUNT2_RX_NUM_BLOCK_2 ((uint16_t)0x1000) /*!< Bit 2 */ +#define USB_COUNT2_RX_NUM_BLOCK_3 ((uint16_t)0x2000) /*!< Bit 3 */ +#define USB_COUNT2_RX_NUM_BLOCK_4 ((uint16_t)0x4000) /*!< Bit 4 */ + +#define USB_COUNT2_RX_BLSIZE ((uint16_t)0x8000) /*!< BLock SIZE */ + +/***************** Bit definition for USB_COUNT3_RX register ****************/ +#define USB_COUNT3_RX_COUNT3_RX ((uint16_t)0x03FF) /*!< Reception Byte Count */ + +#define USB_COUNT3_RX_NUM_BLOCK ((uint16_t)0x7C00) /*!< NUM_BLOCK[4:0] bits (Number of blocks) */ +#define USB_COUNT3_RX_NUM_BLOCK_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define USB_COUNT3_RX_NUM_BLOCK_1 ((uint16_t)0x0800) /*!< Bit 1 */ +#define USB_COUNT3_RX_NUM_BLOCK_2 ((uint16_t)0x1000) /*!< Bit 2 */ +#define USB_COUNT3_RX_NUM_BLOCK_3 ((uint16_t)0x2000) /*!< Bit 3 */ +#define USB_COUNT3_RX_NUM_BLOCK_4 ((uint16_t)0x4000) /*!< Bit 4 */ + +#define USB_COUNT3_RX_BLSIZE ((uint16_t)0x8000) /*!< BLock SIZE */ + +/***************** Bit definition for USB_COUNT4_RX register ****************/ +#define USB_COUNT4_RX_COUNT4_RX ((uint16_t)0x03FF) /*!< Reception Byte Count */ + +#define USB_COUNT4_RX_NUM_BLOCK ((uint16_t)0x7C00) /*!< NUM_BLOCK[4:0] bits (Number of blocks) */ +#define USB_COUNT4_RX_NUM_BLOCK_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define USB_COUNT4_RX_NUM_BLOCK_1 ((uint16_t)0x0800) /*!< Bit 1 */ +#define USB_COUNT4_RX_NUM_BLOCK_2 ((uint16_t)0x1000) /*!< Bit 2 */ +#define USB_COUNT4_RX_NUM_BLOCK_3 ((uint16_t)0x2000) /*!< Bit 3 */ +#define USB_COUNT4_RX_NUM_BLOCK_4 ((uint16_t)0x4000) /*!< Bit 4 */ + +#define USB_COUNT4_RX_BLSIZE ((uint16_t)0x8000) /*!< BLock SIZE */ + +/***************** Bit definition for USB_COUNT5_RX register ****************/ +#define USB_COUNT5_RX_COUNT5_RX ((uint16_t)0x03FF) /*!< Reception Byte Count */ + +#define USB_COUNT5_RX_NUM_BLOCK ((uint16_t)0x7C00) /*!< NUM_BLOCK[4:0] bits (Number of blocks) */ +#define USB_COUNT5_RX_NUM_BLOCK_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define USB_COUNT5_RX_NUM_BLOCK_1 ((uint16_t)0x0800) /*!< Bit 1 */ +#define USB_COUNT5_RX_NUM_BLOCK_2 ((uint16_t)0x1000) /*!< Bit 2 */ +#define USB_COUNT5_RX_NUM_BLOCK_3 ((uint16_t)0x2000) /*!< Bit 3 */ +#define USB_COUNT5_RX_NUM_BLOCK_4 ((uint16_t)0x4000) /*!< Bit 4 */ + +#define USB_COUNT5_RX_BLSIZE ((uint16_t)0x8000) /*!< BLock SIZE */ + +/***************** Bit definition for USB_COUNT6_RX register ****************/ +#define USB_COUNT6_RX_COUNT6_RX ((uint16_t)0x03FF) /*!< Reception Byte Count */ + +#define USB_COUNT6_RX_NUM_BLOCK ((uint16_t)0x7C00) /*!< NUM_BLOCK[4:0] bits (Number of blocks) */ +#define USB_COUNT6_RX_NUM_BLOCK_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define USB_COUNT6_RX_NUM_BLOCK_1 ((uint16_t)0x0800) /*!< Bit 1 */ +#define USB_COUNT6_RX_NUM_BLOCK_2 ((uint16_t)0x1000) /*!< Bit 2 */ +#define USB_COUNT6_RX_NUM_BLOCK_3 ((uint16_t)0x2000) /*!< Bit 3 */ +#define USB_COUNT6_RX_NUM_BLOCK_4 ((uint16_t)0x4000) /*!< Bit 4 */ + +#define USB_COUNT6_RX_BLSIZE ((uint16_t)0x8000) /*!< BLock SIZE */ + +/***************** Bit definition for USB_COUNT7_RX register ****************/ +#define USB_COUNT7_RX_COUNT7_RX ((uint16_t)0x03FF) /*!< Reception Byte Count */ + +#define USB_COUNT7_RX_NUM_BLOCK ((uint16_t)0x7C00) /*!< NUM_BLOCK[4:0] bits (Number of blocks) */ +#define USB_COUNT7_RX_NUM_BLOCK_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define USB_COUNT7_RX_NUM_BLOCK_1 ((uint16_t)0x0800) /*!< Bit 1 */ +#define USB_COUNT7_RX_NUM_BLOCK_2 ((uint16_t)0x1000) /*!< Bit 2 */ +#define USB_COUNT7_RX_NUM_BLOCK_3 ((uint16_t)0x2000) /*!< Bit 3 */ +#define USB_COUNT7_RX_NUM_BLOCK_4 ((uint16_t)0x4000) /*!< Bit 4 */ + +#define USB_COUNT7_RX_BLSIZE ((uint16_t)0x8000) /*!< BLock SIZE */ + +/*----------------------------------------------------------------------------*/ + +/**************** Bit definition for USB_COUNT0_RX_0 register ***************/ +#define USB_COUNT0_RX_0_COUNT0_RX_0 ((uint32_t)0x000003FF) /*!< Reception Byte Count (low) */ + +#define USB_COUNT0_RX_0_NUM_BLOCK_0 ((uint32_t)0x00007C00) /*!< NUM_BLOCK_0[4:0] bits (Number of blocks) (low) */ +#define USB_COUNT0_RX_0_NUM_BLOCK_0_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define USB_COUNT0_RX_0_NUM_BLOCK_0_1 ((uint32_t)0x00000800) /*!< Bit 1 */ +#define USB_COUNT0_RX_0_NUM_BLOCK_0_2 ((uint32_t)0x00001000) /*!< Bit 2 */ +#define USB_COUNT0_RX_0_NUM_BLOCK_0_3 ((uint32_t)0x00002000) /*!< Bit 3 */ +#define USB_COUNT0_RX_0_NUM_BLOCK_0_4 ((uint32_t)0x00004000) /*!< Bit 4 */ + +#define USB_COUNT0_RX_0_BLSIZE_0 ((uint32_t)0x00008000) /*!< BLock SIZE (low) */ + +/**************** Bit definition for USB_COUNT0_RX_1 register ***************/ +#define USB_COUNT0_RX_1_COUNT0_RX_1 ((uint32_t)0x03FF0000) /*!< Reception Byte Count (high) */ + +#define USB_COUNT0_RX_1_NUM_BLOCK_1 ((uint32_t)0x7C000000) /*!< NUM_BLOCK_1[4:0] bits (Number of blocks) (high) */ +#define USB_COUNT0_RX_1_NUM_BLOCK_1_0 ((uint32_t)0x04000000) /*!< Bit 1 */ +#define USB_COUNT0_RX_1_NUM_BLOCK_1_1 ((uint32_t)0x08000000) /*!< Bit 1 */ +#define USB_COUNT0_RX_1_NUM_BLOCK_1_2 ((uint32_t)0x10000000) /*!< Bit 2 */ +#define USB_COUNT0_RX_1_NUM_BLOCK_1_3 ((uint32_t)0x20000000) /*!< Bit 3 */ +#define USB_COUNT0_RX_1_NUM_BLOCK_1_4 ((uint32_t)0x40000000) /*!< Bit 4 */ + +#define USB_COUNT0_RX_1_BLSIZE_1 ((uint32_t)0x80000000) /*!< BLock SIZE (high) */ + +/**************** Bit definition for USB_COUNT1_RX_0 register ***************/ +#define USB_COUNT1_RX_0_COUNT1_RX_0 ((uint32_t)0x000003FF) /*!< Reception Byte Count (low) */ + +#define USB_COUNT1_RX_0_NUM_BLOCK_0 ((uint32_t)0x00007C00) /*!< NUM_BLOCK_0[4:0] bits (Number of blocks) (low) */ +#define USB_COUNT1_RX_0_NUM_BLOCK_0_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define USB_COUNT1_RX_0_NUM_BLOCK_0_1 ((uint32_t)0x00000800) /*!< Bit 1 */ +#define USB_COUNT1_RX_0_NUM_BLOCK_0_2 ((uint32_t)0x00001000) /*!< Bit 2 */ +#define USB_COUNT1_RX_0_NUM_BLOCK_0_3 ((uint32_t)0x00002000) /*!< Bit 3 */ +#define USB_COUNT1_RX_0_NUM_BLOCK_0_4 ((uint32_t)0x00004000) /*!< Bit 4 */ + +#define USB_COUNT1_RX_0_BLSIZE_0 ((uint32_t)0x00008000) /*!< BLock SIZE (low) */ + +/**************** Bit definition for USB_COUNT1_RX_1 register ***************/ +#define USB_COUNT1_RX_1_COUNT1_RX_1 ((uint32_t)0x03FF0000) /*!< Reception Byte Count (high) */ + +#define USB_COUNT1_RX_1_NUM_BLOCK_1 ((uint32_t)0x7C000000) /*!< NUM_BLOCK_1[4:0] bits (Number of blocks) (high) */ +#define USB_COUNT1_RX_1_NUM_BLOCK_1_0 ((uint32_t)0x04000000) /*!< Bit 0 */ +#define USB_COUNT1_RX_1_NUM_BLOCK_1_1 ((uint32_t)0x08000000) /*!< Bit 1 */ +#define USB_COUNT1_RX_1_NUM_BLOCK_1_2 ((uint32_t)0x10000000) /*!< Bit 2 */ +#define USB_COUNT1_RX_1_NUM_BLOCK_1_3 ((uint32_t)0x20000000) /*!< Bit 3 */ +#define USB_COUNT1_RX_1_NUM_BLOCK_1_4 ((uint32_t)0x40000000) /*!< Bit 4 */ + +#define USB_COUNT1_RX_1_BLSIZE_1 ((uint32_t)0x80000000) /*!< BLock SIZE (high) */ + +/**************** Bit definition for USB_COUNT2_RX_0 register ***************/ +#define USB_COUNT2_RX_0_COUNT2_RX_0 ((uint32_t)0x000003FF) /*!< Reception Byte Count (low) */ + +#define USB_COUNT2_RX_0_NUM_BLOCK_0 ((uint32_t)0x00007C00) /*!< NUM_BLOCK_0[4:0] bits (Number of blocks) (low) */ +#define USB_COUNT2_RX_0_NUM_BLOCK_0_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define USB_COUNT2_RX_0_NUM_BLOCK_0_1 ((uint32_t)0x00000800) /*!< Bit 1 */ +#define USB_COUNT2_RX_0_NUM_BLOCK_0_2 ((uint32_t)0x00001000) /*!< Bit 2 */ +#define USB_COUNT2_RX_0_NUM_BLOCK_0_3 ((uint32_t)0x00002000) /*!< Bit 3 */ +#define USB_COUNT2_RX_0_NUM_BLOCK_0_4 ((uint32_t)0x00004000) /*!< Bit 4 */ + +#define USB_COUNT2_RX_0_BLSIZE_0 ((uint32_t)0x00008000) /*!< BLock SIZE (low) */ + +/**************** Bit definition for USB_COUNT2_RX_1 register ***************/ +#define USB_COUNT2_RX_1_COUNT2_RX_1 ((uint32_t)0x03FF0000) /*!< Reception Byte Count (high) */ + +#define USB_COUNT2_RX_1_NUM_BLOCK_1 ((uint32_t)0x7C000000) /*!< NUM_BLOCK_1[4:0] bits (Number of blocks) (high) */ +#define USB_COUNT2_RX_1_NUM_BLOCK_1_0 ((uint32_t)0x04000000) /*!< Bit 0 */ +#define USB_COUNT2_RX_1_NUM_BLOCK_1_1 ((uint32_t)0x08000000) /*!< Bit 1 */ +#define USB_COUNT2_RX_1_NUM_BLOCK_1_2 ((uint32_t)0x10000000) /*!< Bit 2 */ +#define USB_COUNT2_RX_1_NUM_BLOCK_1_3 ((uint32_t)0x20000000) /*!< Bit 3 */ +#define USB_COUNT2_RX_1_NUM_BLOCK_1_4 ((uint32_t)0x40000000) /*!< Bit 4 */ + +#define USB_COUNT2_RX_1_BLSIZE_1 ((uint32_t)0x80000000) /*!< BLock SIZE (high) */ + +/**************** Bit definition for USB_COUNT3_RX_0 register ***************/ +#define USB_COUNT3_RX_0_COUNT3_RX_0 ((uint32_t)0x000003FF) /*!< Reception Byte Count (low) */ + +#define USB_COUNT3_RX_0_NUM_BLOCK_0 ((uint32_t)0x00007C00) /*!< NUM_BLOCK_0[4:0] bits (Number of blocks) (low) */ +#define USB_COUNT3_RX_0_NUM_BLOCK_0_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define USB_COUNT3_RX_0_NUM_BLOCK_0_1 ((uint32_t)0x00000800) /*!< Bit 1 */ +#define USB_COUNT3_RX_0_NUM_BLOCK_0_2 ((uint32_t)0x00001000) /*!< Bit 2 */ +#define USB_COUNT3_RX_0_NUM_BLOCK_0_3 ((uint32_t)0x00002000) /*!< Bit 3 */ +#define USB_COUNT3_RX_0_NUM_BLOCK_0_4 ((uint32_t)0x00004000) /*!< Bit 4 */ + +#define USB_COUNT3_RX_0_BLSIZE_0 ((uint32_t)0x00008000) /*!< BLock SIZE (low) */ + +/**************** Bit definition for USB_COUNT3_RX_1 register ***************/ +#define USB_COUNT3_RX_1_COUNT3_RX_1 ((uint32_t)0x03FF0000) /*!< Reception Byte Count (high) */ + +#define USB_COUNT3_RX_1_NUM_BLOCK_1 ((uint32_t)0x7C000000) /*!< NUM_BLOCK_1[4:0] bits (Number of blocks) (high) */ +#define USB_COUNT3_RX_1_NUM_BLOCK_1_0 ((uint32_t)0x04000000) /*!< Bit 0 */ +#define USB_COUNT3_RX_1_NUM_BLOCK_1_1 ((uint32_t)0x08000000) /*!< Bit 1 */ +#define USB_COUNT3_RX_1_NUM_BLOCK_1_2 ((uint32_t)0x10000000) /*!< Bit 2 */ +#define USB_COUNT3_RX_1_NUM_BLOCK_1_3 ((uint32_t)0x20000000) /*!< Bit 3 */ +#define USB_COUNT3_RX_1_NUM_BLOCK_1_4 ((uint32_t)0x40000000) /*!< Bit 4 */ + +#define USB_COUNT3_RX_1_BLSIZE_1 ((uint32_t)0x80000000) /*!< BLock SIZE (high) */ + +/**************** Bit definition for USB_COUNT4_RX_0 register ***************/ +#define USB_COUNT4_RX_0_COUNT4_RX_0 ((uint32_t)0x000003FF) /*!< Reception Byte Count (low) */ + +#define USB_COUNT4_RX_0_NUM_BLOCK_0 ((uint32_t)0x00007C00) /*!< NUM_BLOCK_0[4:0] bits (Number of blocks) (low) */ +#define USB_COUNT4_RX_0_NUM_BLOCK_0_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define USB_COUNT4_RX_0_NUM_BLOCK_0_1 ((uint32_t)0x00000800) /*!< Bit 1 */ +#define USB_COUNT4_RX_0_NUM_BLOCK_0_2 ((uint32_t)0x00001000) /*!< Bit 2 */ +#define USB_COUNT4_RX_0_NUM_BLOCK_0_3 ((uint32_t)0x00002000) /*!< Bit 3 */ +#define USB_COUNT4_RX_0_NUM_BLOCK_0_4 ((uint32_t)0x00004000) /*!< Bit 4 */ + +#define USB_COUNT4_RX_0_BLSIZE_0 ((uint32_t)0x00008000) /*!< BLock SIZE (low) */ + +/**************** Bit definition for USB_COUNT4_RX_1 register ***************/ +#define USB_COUNT4_RX_1_COUNT4_RX_1 ((uint32_t)0x03FF0000) /*!< Reception Byte Count (high) */ + +#define USB_COUNT4_RX_1_NUM_BLOCK_1 ((uint32_t)0x7C000000) /*!< NUM_BLOCK_1[4:0] bits (Number of blocks) (high) */ +#define USB_COUNT4_RX_1_NUM_BLOCK_1_0 ((uint32_t)0x04000000) /*!< Bit 0 */ +#define USB_COUNT4_RX_1_NUM_BLOCK_1_1 ((uint32_t)0x08000000) /*!< Bit 1 */ +#define USB_COUNT4_RX_1_NUM_BLOCK_1_2 ((uint32_t)0x10000000) /*!< Bit 2 */ +#define USB_COUNT4_RX_1_NUM_BLOCK_1_3 ((uint32_t)0x20000000) /*!< Bit 3 */ +#define USB_COUNT4_RX_1_NUM_BLOCK_1_4 ((uint32_t)0x40000000) /*!< Bit 4 */ + +#define USB_COUNT4_RX_1_BLSIZE_1 ((uint32_t)0x80000000) /*!< BLock SIZE (high) */ + +/**************** Bit definition for USB_COUNT5_RX_0 register ***************/ +#define USB_COUNT5_RX_0_COUNT5_RX_0 ((uint32_t)0x000003FF) /*!< Reception Byte Count (low) */ + +#define USB_COUNT5_RX_0_NUM_BLOCK_0 ((uint32_t)0x00007C00) /*!< NUM_BLOCK_0[4:0] bits (Number of blocks) (low) */ +#define USB_COUNT5_RX_0_NUM_BLOCK_0_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define USB_COUNT5_RX_0_NUM_BLOCK_0_1 ((uint32_t)0x00000800) /*!< Bit 1 */ +#define USB_COUNT5_RX_0_NUM_BLOCK_0_2 ((uint32_t)0x00001000) /*!< Bit 2 */ +#define USB_COUNT5_RX_0_NUM_BLOCK_0_3 ((uint32_t)0x00002000) /*!< Bit 3 */ +#define USB_COUNT5_RX_0_NUM_BLOCK_0_4 ((uint32_t)0x00004000) /*!< Bit 4 */ + +#define USB_COUNT5_RX_0_BLSIZE_0 ((uint32_t)0x00008000) /*!< BLock SIZE (low) */ + +/**************** Bit definition for USB_COUNT5_RX_1 register ***************/ +#define USB_COUNT5_RX_1_COUNT5_RX_1 ((uint32_t)0x03FF0000) /*!< Reception Byte Count (high) */ + +#define USB_COUNT5_RX_1_NUM_BLOCK_1 ((uint32_t)0x7C000000) /*!< NUM_BLOCK_1[4:0] bits (Number of blocks) (high) */ +#define USB_COUNT5_RX_1_NUM_BLOCK_1_0 ((uint32_t)0x04000000) /*!< Bit 0 */ +#define USB_COUNT5_RX_1_NUM_BLOCK_1_1 ((uint32_t)0x08000000) /*!< Bit 1 */ +#define USB_COUNT5_RX_1_NUM_BLOCK_1_2 ((uint32_t)0x10000000) /*!< Bit 2 */ +#define USB_COUNT5_RX_1_NUM_BLOCK_1_3 ((uint32_t)0x20000000) /*!< Bit 3 */ +#define USB_COUNT5_RX_1_NUM_BLOCK_1_4 ((uint32_t)0x40000000) /*!< Bit 4 */ + +#define USB_COUNT5_RX_1_BLSIZE_1 ((uint32_t)0x80000000) /*!< BLock SIZE (high) */ + +/*************** Bit definition for USB_COUNT6_RX_0 register ***************/ +#define USB_COUNT6_RX_0_COUNT6_RX_0 ((uint32_t)0x000003FF) /*!< Reception Byte Count (low) */ + +#define USB_COUNT6_RX_0_NUM_BLOCK_0 ((uint32_t)0x00007C00) /*!< NUM_BLOCK_0[4:0] bits (Number of blocks) (low) */ +#define USB_COUNT6_RX_0_NUM_BLOCK_0_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define USB_COUNT6_RX_0_NUM_BLOCK_0_1 ((uint32_t)0x00000800) /*!< Bit 1 */ +#define USB_COUNT6_RX_0_NUM_BLOCK_0_2 ((uint32_t)0x00001000) /*!< Bit 2 */ +#define USB_COUNT6_RX_0_NUM_BLOCK_0_3 ((uint32_t)0x00002000) /*!< Bit 3 */ +#define USB_COUNT6_RX_0_NUM_BLOCK_0_4 ((uint32_t)0x00004000) /*!< Bit 4 */ + +#define USB_COUNT6_RX_0_BLSIZE_0 ((uint32_t)0x00008000) /*!< BLock SIZE (low) */ + +/**************** Bit definition for USB_COUNT6_RX_1 register ***************/ +#define USB_COUNT6_RX_1_COUNT6_RX_1 ((uint32_t)0x03FF0000) /*!< Reception Byte Count (high) */ + +#define USB_COUNT6_RX_1_NUM_BLOCK_1 ((uint32_t)0x7C000000) /*!< NUM_BLOCK_1[4:0] bits (Number of blocks) (high) */ +#define USB_COUNT6_RX_1_NUM_BLOCK_1_0 ((uint32_t)0x04000000) /*!< Bit 0 */ +#define USB_COUNT6_RX_1_NUM_BLOCK_1_1 ((uint32_t)0x08000000) /*!< Bit 1 */ +#define USB_COUNT6_RX_1_NUM_BLOCK_1_2 ((uint32_t)0x10000000) /*!< Bit 2 */ +#define USB_COUNT6_RX_1_NUM_BLOCK_1_3 ((uint32_t)0x20000000) /*!< Bit 3 */ +#define USB_COUNT6_RX_1_NUM_BLOCK_1_4 ((uint32_t)0x40000000) /*!< Bit 4 */ + +#define USB_COUNT6_RX_1_BLSIZE_1 ((uint32_t)0x80000000) /*!< BLock SIZE (high) */ + +/*************** Bit definition for USB_COUNT7_RX_0 register ****************/ +#define USB_COUNT7_RX_0_COUNT7_RX_0 ((uint32_t)0x000003FF) /*!< Reception Byte Count (low) */ + +#define USB_COUNT7_RX_0_NUM_BLOCK_0 ((uint32_t)0x00007C00) /*!< NUM_BLOCK_0[4:0] bits (Number of blocks) (low) */ +#define USB_COUNT7_RX_0_NUM_BLOCK_0_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define USB_COUNT7_RX_0_NUM_BLOCK_0_1 ((uint32_t)0x00000800) /*!< Bit 1 */ +#define USB_COUNT7_RX_0_NUM_BLOCK_0_2 ((uint32_t)0x00001000) /*!< Bit 2 */ +#define USB_COUNT7_RX_0_NUM_BLOCK_0_3 ((uint32_t)0x00002000) /*!< Bit 3 */ +#define USB_COUNT7_RX_0_NUM_BLOCK_0_4 ((uint32_t)0x00004000) /*!< Bit 4 */ + +#define USB_COUNT7_RX_0_BLSIZE_0 ((uint32_t)0x00008000) /*!< BLock SIZE (low) */ + +/*************** Bit definition for USB_COUNT7_RX_1 register ****************/ +#define USB_COUNT7_RX_1_COUNT7_RX_1 ((uint32_t)0x03FF0000) /*!< Reception Byte Count (high) */ + +#define USB_COUNT7_RX_1_NUM_BLOCK_1 ((uint32_t)0x7C000000) /*!< NUM_BLOCK_1[4:0] bits (Number of blocks) (high) */ +#define USB_COUNT7_RX_1_NUM_BLOCK_1_0 ((uint32_t)0x04000000) /*!< Bit 0 */ +#define USB_COUNT7_RX_1_NUM_BLOCK_1_1 ((uint32_t)0x08000000) /*!< Bit 1 */ +#define USB_COUNT7_RX_1_NUM_BLOCK_1_2 ((uint32_t)0x10000000) /*!< Bit 2 */ +#define USB_COUNT7_RX_1_NUM_BLOCK_1_3 ((uint32_t)0x20000000) /*!< Bit 3 */ +#define USB_COUNT7_RX_1_NUM_BLOCK_1_4 ((uint32_t)0x40000000) /*!< Bit 4 */ + +#define USB_COUNT7_RX_1_BLSIZE_1 ((uint32_t)0x80000000) /*!< BLock SIZE (high) */ + +/******************************************************************************/ +/* */ +/* Controller Area Network */ +/* */ +/******************************************************************************/ + +/*!< CAN control and status registers */ +/******************* Bit definition for CAN_MCR register ********************/ +#define CAN_MCR_INRQ ((uint16_t)0x0001) /*!< Initialization Request */ +#define CAN_MCR_SLEEP ((uint16_t)0x0002) /*!< Sleep Mode Request */ +#define CAN_MCR_TXFP ((uint16_t)0x0004) /*!< Transmit FIFO Priority */ +#define CAN_MCR_RFLM ((uint16_t)0x0008) /*!< Receive FIFO Locked Mode */ +#define CAN_MCR_NART ((uint16_t)0x0010) /*!< No Automatic Retransmission */ +#define CAN_MCR_AWUM ((uint16_t)0x0020) /*!< Automatic Wakeup Mode */ +#define CAN_MCR_ABOM ((uint16_t)0x0040) /*!< Automatic Bus-Off Management */ +#define CAN_MCR_TTCM ((uint16_t)0x0080) /*!< Time Triggered Communication Mode */ +#define CAN_MCR_RESET ((uint16_t)0x8000) /*!< CAN software master reset */ + +/******************* Bit definition for CAN_MSR register ********************/ +#define CAN_MSR_INAK ((uint16_t)0x0001) /*!< Initialization Acknowledge */ +#define CAN_MSR_SLAK ((uint16_t)0x0002) /*!< Sleep Acknowledge */ +#define CAN_MSR_ERRI ((uint16_t)0x0004) /*!< Error Interrupt */ +#define CAN_MSR_WKUI ((uint16_t)0x0008) /*!< Wakeup Interrupt */ +#define CAN_MSR_SLAKI ((uint16_t)0x0010) /*!< Sleep Acknowledge Interrupt */ +#define CAN_MSR_TXM ((uint16_t)0x0100) /*!< Transmit Mode */ +#define CAN_MSR_RXM ((uint16_t)0x0200) /*!< Receive Mode */ +#define CAN_MSR_SAMP ((uint16_t)0x0400) /*!< Last Sample Point */ +#define CAN_MSR_RX ((uint16_t)0x0800) /*!< CAN Rx Signal */ + +/******************* Bit definition for CAN_TSR register ********************/ +#define CAN_TSR_RQCP0 ((uint32_t)0x00000001) /*!< Request Completed Mailbox0 */ +#define CAN_TSR_TXOK0 ((uint32_t)0x00000002) /*!< Transmission OK of Mailbox0 */ +#define CAN_TSR_ALST0 ((uint32_t)0x00000004) /*!< Arbitration Lost for Mailbox0 */ +#define CAN_TSR_TERR0 ((uint32_t)0x00000008) /*!< Transmission Error of Mailbox0 */ +#define CAN_TSR_ABRQ0 ((uint32_t)0x00000080) /*!< Abort Request for Mailbox0 */ +#define CAN_TSR_RQCP1 ((uint32_t)0x00000100) /*!< Request Completed Mailbox1 */ +#define CAN_TSR_TXOK1 ((uint32_t)0x00000200) /*!< Transmission OK of Mailbox1 */ +#define CAN_TSR_ALST1 ((uint32_t)0x00000400) /*!< Arbitration Lost for Mailbox1 */ +#define CAN_TSR_TERR1 ((uint32_t)0x00000800) /*!< Transmission Error of Mailbox1 */ +#define CAN_TSR_ABRQ1 ((uint32_t)0x00008000) /*!< Abort Request for Mailbox 1 */ +#define CAN_TSR_RQCP2 ((uint32_t)0x00010000) /*!< Request Completed Mailbox2 */ +#define CAN_TSR_TXOK2 ((uint32_t)0x00020000) /*!< Transmission OK of Mailbox 2 */ +#define CAN_TSR_ALST2 ((uint32_t)0x00040000) /*!< Arbitration Lost for mailbox 2 */ +#define CAN_TSR_TERR2 ((uint32_t)0x00080000) /*!< Transmission Error of Mailbox 2 */ +#define CAN_TSR_ABRQ2 ((uint32_t)0x00800000) /*!< Abort Request for Mailbox 2 */ +#define CAN_TSR_CODE ((uint32_t)0x03000000) /*!< Mailbox Code */ + +#define CAN_TSR_TME ((uint32_t)0x1C000000) /*!< TME[2:0] bits */ +#define CAN_TSR_TME0 ((uint32_t)0x04000000) /*!< Transmit Mailbox 0 Empty */ +#define CAN_TSR_TME1 ((uint32_t)0x08000000) /*!< Transmit Mailbox 1 Empty */ +#define CAN_TSR_TME2 ((uint32_t)0x10000000) /*!< Transmit Mailbox 2 Empty */ + +#define CAN_TSR_LOW ((uint32_t)0xE0000000) /*!< LOW[2:0] bits */ +#define CAN_TSR_LOW0 ((uint32_t)0x20000000) /*!< Lowest Priority Flag for Mailbox 0 */ +#define CAN_TSR_LOW1 ((uint32_t)0x40000000) /*!< Lowest Priority Flag for Mailbox 1 */ +#define CAN_TSR_LOW2 ((uint32_t)0x80000000) /*!< Lowest Priority Flag for Mailbox 2 */ + +/******************* Bit definition for CAN_RF0R register *******************/ +#define CAN_RF0R_FMP0 ((uint8_t)0x03) /*!< FIFO 0 Message Pending */ +#define CAN_RF0R_FULL0 ((uint8_t)0x08) /*!< FIFO 0 Full */ +#define CAN_RF0R_FOVR0 ((uint8_t)0x10) /*!< FIFO 0 Overrun */ +#define CAN_RF0R_RFOM0 ((uint8_t)0x20) /*!< Release FIFO 0 Output Mailbox */ + +/******************* Bit definition for CAN_RF1R register *******************/ +#define CAN_RF1R_FMP1 ((uint8_t)0x03) /*!< FIFO 1 Message Pending */ +#define CAN_RF1R_FULL1 ((uint8_t)0x08) /*!< FIFO 1 Full */ +#define CAN_RF1R_FOVR1 ((uint8_t)0x10) /*!< FIFO 1 Overrun */ +#define CAN_RF1R_RFOM1 ((uint8_t)0x20) /*!< Release FIFO 1 Output Mailbox */ + +/******************** Bit definition for CAN_IER register *******************/ +#define CAN_IER_TMEIE ((uint32_t)0x00000001) /*!< Transmit Mailbox Empty Interrupt Enable */ +#define CAN_IER_FMPIE0 ((uint32_t)0x00000002) /*!< FIFO Message Pending Interrupt Enable */ +#define CAN_IER_FFIE0 ((uint32_t)0x00000004) /*!< FIFO Full Interrupt Enable */ +#define CAN_IER_FOVIE0 ((uint32_t)0x00000008) /*!< FIFO Overrun Interrupt Enable */ +#define CAN_IER_FMPIE1 ((uint32_t)0x00000010) /*!< FIFO Message Pending Interrupt Enable */ +#define CAN_IER_FFIE1 ((uint32_t)0x00000020) /*!< FIFO Full Interrupt Enable */ +#define CAN_IER_FOVIE1 ((uint32_t)0x00000040) /*!< FIFO Overrun Interrupt Enable */ +#define CAN_IER_EWGIE ((uint32_t)0x00000100) /*!< Error Warning Interrupt Enable */ +#define CAN_IER_EPVIE ((uint32_t)0x00000200) /*!< Error Passive Interrupt Enable */ +#define CAN_IER_BOFIE ((uint32_t)0x00000400) /*!< Bus-Off Interrupt Enable */ +#define CAN_IER_LECIE ((uint32_t)0x00000800) /*!< Last Error Code Interrupt Enable */ +#define CAN_IER_ERRIE ((uint32_t)0x00008000) /*!< Error Interrupt Enable */ +#define CAN_IER_WKUIE ((uint32_t)0x00010000) /*!< Wakeup Interrupt Enable */ +#define CAN_IER_SLKIE ((uint32_t)0x00020000) /*!< Sleep Interrupt Enable */ + +/******************** Bit definition for CAN_ESR register *******************/ +#define CAN_ESR_EWGF ((uint32_t)0x00000001) /*!< Error Warning Flag */ +#define CAN_ESR_EPVF ((uint32_t)0x00000002) /*!< Error Passive Flag */ +#define CAN_ESR_BOFF ((uint32_t)0x00000004) /*!< Bus-Off Flag */ + +#define CAN_ESR_LEC ((uint32_t)0x00000070) /*!< LEC[2:0] bits (Last Error Code) */ +#define CAN_ESR_LEC_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define CAN_ESR_LEC_1 ((uint32_t)0x00000020) /*!< Bit 1 */ +#define CAN_ESR_LEC_2 ((uint32_t)0x00000040) /*!< Bit 2 */ + +#define CAN_ESR_TEC ((uint32_t)0x00FF0000) /*!< Least significant byte of the 9-bit Transmit Error Counter */ +#define CAN_ESR_REC ((uint32_t)0xFF000000) /*!< Receive Error Counter */ + +/******************* Bit definition for CAN_BTR register ********************/ +#define CAN_BTR_BRP ((uint32_t)0x000003FF) /*!< Baud Rate Prescaler */ +#define CAN_BTR_TS1 ((uint32_t)0x000F0000) /*!< Time Segment 1 */ +#define CAN_BTR_TS2 ((uint32_t)0x00700000) /*!< Time Segment 2 */ +#define CAN_BTR_SJW ((uint32_t)0x03000000) /*!< Resynchronization Jump Width */ +#define CAN_BTR_LBKM ((uint32_t)0x40000000) /*!< Loop Back Mode (Debug) */ +#define CAN_BTR_SILM ((uint32_t)0x80000000) /*!< Silent Mode */ + +/*!< Mailbox registers */ +/****************** Bit definition for CAN_TI0R register ********************/ +#define CAN_TI0R_TXRQ ((uint32_t)0x00000001) /*!< Transmit Mailbox Request */ +#define CAN_TI0R_RTR ((uint32_t)0x00000002) /*!< Remote Transmission Request */ +#define CAN_TI0R_IDE ((uint32_t)0x00000004) /*!< Identifier Extension */ +#define CAN_TI0R_EXID ((uint32_t)0x001FFFF8) /*!< Extended Identifier */ +#define CAN_TI0R_STID ((uint32_t)0xFFE00000) /*!< Standard Identifier or Extended Identifier */ + +/****************** Bit definition for CAN_TDT0R register *******************/ +#define CAN_TDT0R_DLC ((uint32_t)0x0000000F) /*!< Data Length Code */ +#define CAN_TDT0R_TGT ((uint32_t)0x00000100) /*!< Transmit Global Time */ +#define CAN_TDT0R_TIME ((uint32_t)0xFFFF0000) /*!< Message Time Stamp */ + +/****************** Bit definition for CAN_TDL0R register *******************/ +#define CAN_TDL0R_DATA0 ((uint32_t)0x000000FF) /*!< Data byte 0 */ +#define CAN_TDL0R_DATA1 ((uint32_t)0x0000FF00) /*!< Data byte 1 */ +#define CAN_TDL0R_DATA2 ((uint32_t)0x00FF0000) /*!< Data byte 2 */ +#define CAN_TDL0R_DATA3 ((uint32_t)0xFF000000) /*!< Data byte 3 */ + +/****************** Bit definition for CAN_TDH0R register *******************/ +#define CAN_TDH0R_DATA4 ((uint32_t)0x000000FF) /*!< Data byte 4 */ +#define CAN_TDH0R_DATA5 ((uint32_t)0x0000FF00) /*!< Data byte 5 */ +#define CAN_TDH0R_DATA6 ((uint32_t)0x00FF0000) /*!< Data byte 6 */ +#define CAN_TDH0R_DATA7 ((uint32_t)0xFF000000) /*!< Data byte 7 */ + +/******************* Bit definition for CAN_TI1R register *******************/ +#define CAN_TI1R_TXRQ ((uint32_t)0x00000001) /*!< Transmit Mailbox Request */ +#define CAN_TI1R_RTR ((uint32_t)0x00000002) /*!< Remote Transmission Request */ +#define CAN_TI1R_IDE ((uint32_t)0x00000004) /*!< Identifier Extension */ +#define CAN_TI1R_EXID ((uint32_t)0x001FFFF8) /*!< Extended Identifier */ +#define CAN_TI1R_STID ((uint32_t)0xFFE00000) /*!< Standard Identifier or Extended Identifier */ + +/******************* Bit definition for CAN_TDT1R register ******************/ +#define CAN_TDT1R_DLC ((uint32_t)0x0000000F) /*!< Data Length Code */ +#define CAN_TDT1R_TGT ((uint32_t)0x00000100) /*!< Transmit Global Time */ +#define CAN_TDT1R_TIME ((uint32_t)0xFFFF0000) /*!< Message Time Stamp */ + +/******************* Bit definition for CAN_TDL1R register ******************/ +#define CAN_TDL1R_DATA0 ((uint32_t)0x000000FF) /*!< Data byte 0 */ +#define CAN_TDL1R_DATA1 ((uint32_t)0x0000FF00) /*!< Data byte 1 */ +#define CAN_TDL1R_DATA2 ((uint32_t)0x00FF0000) /*!< Data byte 2 */ +#define CAN_TDL1R_DATA3 ((uint32_t)0xFF000000) /*!< Data byte 3 */ + +/******************* Bit definition for CAN_TDH1R register ******************/ +#define CAN_TDH1R_DATA4 ((uint32_t)0x000000FF) /*!< Data byte 4 */ +#define CAN_TDH1R_DATA5 ((uint32_t)0x0000FF00) /*!< Data byte 5 */ +#define CAN_TDH1R_DATA6 ((uint32_t)0x00FF0000) /*!< Data byte 6 */ +#define CAN_TDH1R_DATA7 ((uint32_t)0xFF000000) /*!< Data byte 7 */ + +/******************* Bit definition for CAN_TI2R register *******************/ +#define CAN_TI2R_TXRQ ((uint32_t)0x00000001) /*!< Transmit Mailbox Request */ +#define CAN_TI2R_RTR ((uint32_t)0x00000002) /*!< Remote Transmission Request */ +#define CAN_TI2R_IDE ((uint32_t)0x00000004) /*!< Identifier Extension */ +#define CAN_TI2R_EXID ((uint32_t)0x001FFFF8) /*!< Extended identifier */ +#define CAN_TI2R_STID ((uint32_t)0xFFE00000) /*!< Standard Identifier or Extended Identifier */ + +/******************* Bit definition for CAN_TDT2R register ******************/ +#define CAN_TDT2R_DLC ((uint32_t)0x0000000F) /*!< Data Length Code */ +#define CAN_TDT2R_TGT ((uint32_t)0x00000100) /*!< Transmit Global Time */ +#define CAN_TDT2R_TIME ((uint32_t)0xFFFF0000) /*!< Message Time Stamp */ + +/******************* Bit definition for CAN_TDL2R register ******************/ +#define CAN_TDL2R_DATA0 ((uint32_t)0x000000FF) /*!< Data byte 0 */ +#define CAN_TDL2R_DATA1 ((uint32_t)0x0000FF00) /*!< Data byte 1 */ +#define CAN_TDL2R_DATA2 ((uint32_t)0x00FF0000) /*!< Data byte 2 */ +#define CAN_TDL2R_DATA3 ((uint32_t)0xFF000000) /*!< Data byte 3 */ + +/******************* Bit definition for CAN_TDH2R register ******************/ +#define CAN_TDH2R_DATA4 ((uint32_t)0x000000FF) /*!< Data byte 4 */ +#define CAN_TDH2R_DATA5 ((uint32_t)0x0000FF00) /*!< Data byte 5 */ +#define CAN_TDH2R_DATA6 ((uint32_t)0x00FF0000) /*!< Data byte 6 */ +#define CAN_TDH2R_DATA7 ((uint32_t)0xFF000000) /*!< Data byte 7 */ + +/******************* Bit definition for CAN_RI0R register *******************/ +#define CAN_RI0R_RTR ((uint32_t)0x00000002) /*!< Remote Transmission Request */ +#define CAN_RI0R_IDE ((uint32_t)0x00000004) /*!< Identifier Extension */ +#define CAN_RI0R_EXID ((uint32_t)0x001FFFF8) /*!< Extended Identifier */ +#define CAN_RI0R_STID ((uint32_t)0xFFE00000) /*!< Standard Identifier or Extended Identifier */ + +/******************* Bit definition for CAN_RDT0R register ******************/ +#define CAN_RDT0R_DLC ((uint32_t)0x0000000F) /*!< Data Length Code */ +#define CAN_RDT0R_FMI ((uint32_t)0x0000FF00) /*!< Filter Match Index */ +#define CAN_RDT0R_TIME ((uint32_t)0xFFFF0000) /*!< Message Time Stamp */ + +/******************* Bit definition for CAN_RDL0R register ******************/ +#define CAN_RDL0R_DATA0 ((uint32_t)0x000000FF) /*!< Data byte 0 */ +#define CAN_RDL0R_DATA1 ((uint32_t)0x0000FF00) /*!< Data byte 1 */ +#define CAN_RDL0R_DATA2 ((uint32_t)0x00FF0000) /*!< Data byte 2 */ +#define CAN_RDL0R_DATA3 ((uint32_t)0xFF000000) /*!< Data byte 3 */ + +/******************* Bit definition for CAN_RDH0R register ******************/ +#define CAN_RDH0R_DATA4 ((uint32_t)0x000000FF) /*!< Data byte 4 */ +#define CAN_RDH0R_DATA5 ((uint32_t)0x0000FF00) /*!< Data byte 5 */ +#define CAN_RDH0R_DATA6 ((uint32_t)0x00FF0000) /*!< Data byte 6 */ +#define CAN_RDH0R_DATA7 ((uint32_t)0xFF000000) /*!< Data byte 7 */ + +/******************* Bit definition for CAN_RI1R register *******************/ +#define CAN_RI1R_RTR ((uint32_t)0x00000002) /*!< Remote Transmission Request */ +#define CAN_RI1R_IDE ((uint32_t)0x00000004) /*!< Identifier Extension */ +#define CAN_RI1R_EXID ((uint32_t)0x001FFFF8) /*!< Extended identifier */ +#define CAN_RI1R_STID ((uint32_t)0xFFE00000) /*!< Standard Identifier or Extended Identifier */ + +/******************* Bit definition for CAN_RDT1R register ******************/ +#define CAN_RDT1R_DLC ((uint32_t)0x0000000F) /*!< Data Length Code */ +#define CAN_RDT1R_FMI ((uint32_t)0x0000FF00) /*!< Filter Match Index */ +#define CAN_RDT1R_TIME ((uint32_t)0xFFFF0000) /*!< Message Time Stamp */ + +/******************* Bit definition for CAN_RDL1R register ******************/ +#define CAN_RDL1R_DATA0 ((uint32_t)0x000000FF) /*!< Data byte 0 */ +#define CAN_RDL1R_DATA1 ((uint32_t)0x0000FF00) /*!< Data byte 1 */ +#define CAN_RDL1R_DATA2 ((uint32_t)0x00FF0000) /*!< Data byte 2 */ +#define CAN_RDL1R_DATA3 ((uint32_t)0xFF000000) /*!< Data byte 3 */ + +/******************* Bit definition for CAN_RDH1R register ******************/ +#define CAN_RDH1R_DATA4 ((uint32_t)0x000000FF) /*!< Data byte 4 */ +#define CAN_RDH1R_DATA5 ((uint32_t)0x0000FF00) /*!< Data byte 5 */ +#define CAN_RDH1R_DATA6 ((uint32_t)0x00FF0000) /*!< Data byte 6 */ +#define CAN_RDH1R_DATA7 ((uint32_t)0xFF000000) /*!< Data byte 7 */ + +/*!< CAN filter registers */ +/******************* Bit definition for CAN_FMR register ********************/ +#define CAN_FMR_FINIT ((uint8_t)0x01) /*!< Filter Init Mode */ + +/******************* Bit definition for CAN_FM1R register *******************/ +#define CAN_FM1R_FBM ((uint16_t)0x3FFF) /*!< Filter Mode */ +#define CAN_FM1R_FBM0 ((uint16_t)0x0001) /*!< Filter Init Mode bit 0 */ +#define CAN_FM1R_FBM1 ((uint16_t)0x0002) /*!< Filter Init Mode bit 1 */ +#define CAN_FM1R_FBM2 ((uint16_t)0x0004) /*!< Filter Init Mode bit 2 */ +#define CAN_FM1R_FBM3 ((uint16_t)0x0008) /*!< Filter Init Mode bit 3 */ +#define CAN_FM1R_FBM4 ((uint16_t)0x0010) /*!< Filter Init Mode bit 4 */ +#define CAN_FM1R_FBM5 ((uint16_t)0x0020) /*!< Filter Init Mode bit 5 */ +#define CAN_FM1R_FBM6 ((uint16_t)0x0040) /*!< Filter Init Mode bit 6 */ +#define CAN_FM1R_FBM7 ((uint16_t)0x0080) /*!< Filter Init Mode bit 7 */ +#define CAN_FM1R_FBM8 ((uint16_t)0x0100) /*!< Filter Init Mode bit 8 */ +#define CAN_FM1R_FBM9 ((uint16_t)0x0200) /*!< Filter Init Mode bit 9 */ +#define CAN_FM1R_FBM10 ((uint16_t)0x0400) /*!< Filter Init Mode bit 10 */ +#define CAN_FM1R_FBM11 ((uint16_t)0x0800) /*!< Filter Init Mode bit 11 */ +#define CAN_FM1R_FBM12 ((uint16_t)0x1000) /*!< Filter Init Mode bit 12 */ +#define CAN_FM1R_FBM13 ((uint16_t)0x2000) /*!< Filter Init Mode bit 13 */ + +/******************* Bit definition for CAN_FS1R register *******************/ +#define CAN_FS1R_FSC ((uint16_t)0x3FFF) /*!< Filter Scale Configuration */ +#define CAN_FS1R_FSC0 ((uint16_t)0x0001) /*!< Filter Scale Configuration bit 0 */ +#define CAN_FS1R_FSC1 ((uint16_t)0x0002) /*!< Filter Scale Configuration bit 1 */ +#define CAN_FS1R_FSC2 ((uint16_t)0x0004) /*!< Filter Scale Configuration bit 2 */ +#define CAN_FS1R_FSC3 ((uint16_t)0x0008) /*!< Filter Scale Configuration bit 3 */ +#define CAN_FS1R_FSC4 ((uint16_t)0x0010) /*!< Filter Scale Configuration bit 4 */ +#define CAN_FS1R_FSC5 ((uint16_t)0x0020) /*!< Filter Scale Configuration bit 5 */ +#define CAN_FS1R_FSC6 ((uint16_t)0x0040) /*!< Filter Scale Configuration bit 6 */ +#define CAN_FS1R_FSC7 ((uint16_t)0x0080) /*!< Filter Scale Configuration bit 7 */ +#define CAN_FS1R_FSC8 ((uint16_t)0x0100) /*!< Filter Scale Configuration bit 8 */ +#define CAN_FS1R_FSC9 ((uint16_t)0x0200) /*!< Filter Scale Configuration bit 9 */ +#define CAN_FS1R_FSC10 ((uint16_t)0x0400) /*!< Filter Scale Configuration bit 10 */ +#define CAN_FS1R_FSC11 ((uint16_t)0x0800) /*!< Filter Scale Configuration bit 11 */ +#define CAN_FS1R_FSC12 ((uint16_t)0x1000) /*!< Filter Scale Configuration bit 12 */ +#define CAN_FS1R_FSC13 ((uint16_t)0x2000) /*!< Filter Scale Configuration bit 13 */ + +/****************** Bit definition for CAN_FFA1R register *******************/ +#define CAN_FFA1R_FFA ((uint16_t)0x3FFF) /*!< Filter FIFO Assignment */ +#define CAN_FFA1R_FFA0 ((uint16_t)0x0001) /*!< Filter FIFO Assignment for Filter 0 */ +#define CAN_FFA1R_FFA1 ((uint16_t)0x0002) /*!< Filter FIFO Assignment for Filter 1 */ +#define CAN_FFA1R_FFA2 ((uint16_t)0x0004) /*!< Filter FIFO Assignment for Filter 2 */ +#define CAN_FFA1R_FFA3 ((uint16_t)0x0008) /*!< Filter FIFO Assignment for Filter 3 */ +#define CAN_FFA1R_FFA4 ((uint16_t)0x0010) /*!< Filter FIFO Assignment for Filter 4 */ +#define CAN_FFA1R_FFA5 ((uint16_t)0x0020) /*!< Filter FIFO Assignment for Filter 5 */ +#define CAN_FFA1R_FFA6 ((uint16_t)0x0040) /*!< Filter FIFO Assignment for Filter 6 */ +#define CAN_FFA1R_FFA7 ((uint16_t)0x0080) /*!< Filter FIFO Assignment for Filter 7 */ +#define CAN_FFA1R_FFA8 ((uint16_t)0x0100) /*!< Filter FIFO Assignment for Filter 8 */ +#define CAN_FFA1R_FFA9 ((uint16_t)0x0200) /*!< Filter FIFO Assignment for Filter 9 */ +#define CAN_FFA1R_FFA10 ((uint16_t)0x0400) /*!< Filter FIFO Assignment for Filter 10 */ +#define CAN_FFA1R_FFA11 ((uint16_t)0x0800) /*!< Filter FIFO Assignment for Filter 11 */ +#define CAN_FFA1R_FFA12 ((uint16_t)0x1000) /*!< Filter FIFO Assignment for Filter 12 */ +#define CAN_FFA1R_FFA13 ((uint16_t)0x2000) /*!< Filter FIFO Assignment for Filter 13 */ + +/******************* Bit definition for CAN_FA1R register *******************/ +#define CAN_FA1R_FACT ((uint16_t)0x3FFF) /*!< Filter Active */ +#define CAN_FA1R_FACT0 ((uint16_t)0x0001) /*!< Filter 0 Active */ +#define CAN_FA1R_FACT1 ((uint16_t)0x0002) /*!< Filter 1 Active */ +#define CAN_FA1R_FACT2 ((uint16_t)0x0004) /*!< Filter 2 Active */ +#define CAN_FA1R_FACT3 ((uint16_t)0x0008) /*!< Filter 3 Active */ +#define CAN_FA1R_FACT4 ((uint16_t)0x0010) /*!< Filter 4 Active */ +#define CAN_FA1R_FACT5 ((uint16_t)0x0020) /*!< Filter 5 Active */ +#define CAN_FA1R_FACT6 ((uint16_t)0x0040) /*!< Filter 6 Active */ +#define CAN_FA1R_FACT7 ((uint16_t)0x0080) /*!< Filter 7 Active */ +#define CAN_FA1R_FACT8 ((uint16_t)0x0100) /*!< Filter 8 Active */ +#define CAN_FA1R_FACT9 ((uint16_t)0x0200) /*!< Filter 9 Active */ +#define CAN_FA1R_FACT10 ((uint16_t)0x0400) /*!< Filter 10 Active */ +#define CAN_FA1R_FACT11 ((uint16_t)0x0800) /*!< Filter 11 Active */ +#define CAN_FA1R_FACT12 ((uint16_t)0x1000) /*!< Filter 12 Active */ +#define CAN_FA1R_FACT13 ((uint16_t)0x2000) /*!< Filter 13 Active */ + +/******************* Bit definition for CAN_F0R1 register *******************/ +#define CAN_F0R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F0R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F0R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F0R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F0R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F0R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F0R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F0R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F0R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F0R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F0R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F0R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F0R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F0R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F0R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F0R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F0R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F0R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F0R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F0R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F0R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F0R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F0R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F0R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F0R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F0R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F0R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F0R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F0R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F0R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F0R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F0R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F1R1 register *******************/ +#define CAN_F1R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F1R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F1R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F1R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F1R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F1R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F1R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F1R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F1R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F1R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F1R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F1R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F1R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F1R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F1R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F1R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F1R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F1R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F1R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F1R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F1R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F1R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F1R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F1R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F1R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F1R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F1R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F1R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F1R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F1R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F1R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F1R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F2R1 register *******************/ +#define CAN_F2R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F2R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F2R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F2R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F2R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F2R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F2R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F2R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F2R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F2R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F2R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F2R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F2R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F2R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F2R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F2R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F2R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F2R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F2R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F2R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F2R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F2R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F2R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F2R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F2R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F2R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F2R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F2R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F2R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F2R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F2R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F2R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F3R1 register *******************/ +#define CAN_F3R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F3R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F3R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F3R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F3R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F3R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F3R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F3R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F3R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F3R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F3R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F3R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F3R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F3R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F3R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F3R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F3R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F3R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F3R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F3R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F3R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F3R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F3R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F3R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F3R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F3R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F3R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F3R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F3R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F3R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F3R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F3R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F4R1 register *******************/ +#define CAN_F4R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F4R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F4R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F4R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F4R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F4R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F4R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F4R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F4R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F4R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F4R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F4R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F4R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F4R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F4R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F4R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F4R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F4R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F4R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F4R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F4R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F4R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F4R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F4R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F4R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F4R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F4R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F4R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F4R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F4R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F4R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F4R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F5R1 register *******************/ +#define CAN_F5R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F5R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F5R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F5R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F5R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F5R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F5R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F5R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F5R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F5R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F5R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F5R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F5R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F5R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F5R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F5R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F5R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F5R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F5R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F5R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F5R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F5R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F5R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F5R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F5R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F5R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F5R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F5R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F5R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F5R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F5R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F5R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F6R1 register *******************/ +#define CAN_F6R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F6R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F6R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F6R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F6R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F6R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F6R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F6R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F6R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F6R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F6R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F6R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F6R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F6R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F6R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F6R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F6R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F6R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F6R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F6R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F6R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F6R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F6R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F6R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F6R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F6R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F6R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F6R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F6R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F6R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F6R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F6R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F7R1 register *******************/ +#define CAN_F7R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F7R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F7R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F7R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F7R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F7R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F7R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F7R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F7R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F7R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F7R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F7R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F7R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F7R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F7R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F7R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F7R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F7R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F7R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F7R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F7R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F7R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F7R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F7R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F7R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F7R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F7R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F7R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F7R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F7R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F7R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F7R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F8R1 register *******************/ +#define CAN_F8R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F8R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F8R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F8R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F8R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F8R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F8R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F8R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F8R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F8R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F8R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F8R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F8R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F8R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F8R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F8R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F8R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F8R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F8R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F8R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F8R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F8R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F8R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F8R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F8R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F8R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F8R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F8R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F8R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F8R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F8R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F8R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F9R1 register *******************/ +#define CAN_F9R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F9R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F9R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F9R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F9R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F9R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F9R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F9R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F9R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F9R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F9R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F9R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F9R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F9R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F9R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F9R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F9R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F9R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F9R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F9R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F9R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F9R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F9R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F9R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F9R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F9R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F9R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F9R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F9R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F9R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F9R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F9R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F10R1 register ******************/ +#define CAN_F10R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F10R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F10R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F10R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F10R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F10R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F10R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F10R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F10R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F10R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F10R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F10R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F10R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F10R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F10R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F10R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F10R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F10R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F10R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F10R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F10R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F10R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F10R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F10R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F10R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F10R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F10R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F10R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F10R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F10R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F10R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F10R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F11R1 register ******************/ +#define CAN_F11R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F11R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F11R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F11R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F11R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F11R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F11R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F11R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F11R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F11R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F11R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F11R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F11R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F11R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F11R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F11R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F11R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F11R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F11R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F11R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F11R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F11R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F11R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F11R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F11R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F11R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F11R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F11R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F11R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F11R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F11R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F11R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F12R1 register ******************/ +#define CAN_F12R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F12R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F12R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F12R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F12R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F12R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F12R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F12R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F12R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F12R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F12R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F12R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F12R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F12R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F12R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F12R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F12R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F12R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F12R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F12R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F12R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F12R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F12R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F12R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F12R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F12R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F12R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F12R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F12R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F12R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F12R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F12R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F13R1 register ******************/ +#define CAN_F13R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F13R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F13R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F13R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F13R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F13R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F13R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F13R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F13R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F13R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F13R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F13R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F13R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F13R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F13R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F13R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F13R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F13R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F13R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F13R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F13R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F13R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F13R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F13R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F13R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F13R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F13R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F13R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F13R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F13R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F13R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F13R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F0R2 register *******************/ +#define CAN_F0R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F0R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F0R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F0R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F0R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F0R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F0R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F0R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F0R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F0R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F0R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F0R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F0R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F0R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F0R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F0R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F0R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F0R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F0R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F0R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F0R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F0R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F0R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F0R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F0R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F0R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F0R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F0R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F0R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F0R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F0R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F0R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F1R2 register *******************/ +#define CAN_F1R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F1R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F1R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F1R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F1R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F1R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F1R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F1R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F1R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F1R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F1R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F1R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F1R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F1R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F1R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F1R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F1R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F1R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F1R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F1R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F1R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F1R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F1R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F1R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F1R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F1R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F1R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F1R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F1R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F1R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F1R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F1R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F2R2 register *******************/ +#define CAN_F2R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F2R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F2R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F2R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F2R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F2R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F2R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F2R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F2R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F2R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F2R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F2R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F2R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F2R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F2R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F2R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F2R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F2R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F2R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F2R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F2R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F2R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F2R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F2R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F2R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F2R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F2R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F2R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F2R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F2R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F2R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F2R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F3R2 register *******************/ +#define CAN_F3R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F3R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F3R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F3R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F3R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F3R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F3R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F3R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F3R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F3R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F3R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F3R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F3R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F3R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F3R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F3R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F3R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F3R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F3R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F3R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F3R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F3R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F3R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F3R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F3R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F3R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F3R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F3R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F3R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F3R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F3R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F3R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F4R2 register *******************/ +#define CAN_F4R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F4R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F4R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F4R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F4R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F4R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F4R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F4R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F4R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F4R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F4R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F4R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F4R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F4R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F4R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F4R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F4R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F4R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F4R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F4R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F4R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F4R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F4R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F4R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F4R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F4R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F4R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F4R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F4R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F4R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F4R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F4R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F5R2 register *******************/ +#define CAN_F5R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F5R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F5R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F5R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F5R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F5R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F5R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F5R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F5R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F5R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F5R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F5R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F5R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F5R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F5R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F5R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F5R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F5R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F5R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F5R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F5R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F5R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F5R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F5R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F5R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F5R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F5R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F5R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F5R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F5R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F5R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F5R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F6R2 register *******************/ +#define CAN_F6R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F6R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F6R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F6R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F6R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F6R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F6R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F6R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F6R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F6R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F6R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F6R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F6R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F6R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F6R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F6R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F6R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F6R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F6R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F6R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F6R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F6R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F6R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F6R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F6R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F6R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F6R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F6R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F6R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F6R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F6R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F6R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F7R2 register *******************/ +#define CAN_F7R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F7R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F7R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F7R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F7R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F7R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F7R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F7R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F7R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F7R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F7R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F7R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F7R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F7R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F7R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F7R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F7R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F7R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F7R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F7R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F7R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F7R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F7R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F7R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F7R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F7R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F7R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F7R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F7R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F7R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F7R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F7R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F8R2 register *******************/ +#define CAN_F8R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F8R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F8R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F8R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F8R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F8R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F8R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F8R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F8R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F8R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F8R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F8R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F8R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F8R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F8R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F8R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F8R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F8R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F8R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F8R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F8R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F8R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F8R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F8R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F8R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F8R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F8R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F8R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F8R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F8R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F8R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F8R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F9R2 register *******************/ +#define CAN_F9R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F9R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F9R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F9R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F9R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F9R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F9R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F9R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F9R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F9R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F9R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F9R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F9R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F9R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F9R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F9R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F9R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F9R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F9R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F9R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F9R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F9R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F9R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F9R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F9R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F9R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F9R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F9R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F9R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F9R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F9R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F9R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F10R2 register ******************/ +#define CAN_F10R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F10R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F10R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F10R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F10R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F10R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F10R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F10R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F10R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F10R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F10R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F10R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F10R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F10R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F10R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F10R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F10R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F10R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F10R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F10R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F10R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F10R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F10R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F10R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F10R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F10R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F10R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F10R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F10R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F10R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F10R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F10R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F11R2 register ******************/ +#define CAN_F11R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F11R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F11R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F11R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F11R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F11R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F11R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F11R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F11R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F11R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F11R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F11R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F11R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F11R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F11R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F11R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F11R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F11R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F11R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F11R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F11R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F11R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F11R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F11R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F11R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F11R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F11R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F11R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F11R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F11R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F11R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F11R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F12R2 register ******************/ +#define CAN_F12R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F12R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F12R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F12R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F12R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F12R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F12R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F12R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F12R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F12R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F12R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F12R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F12R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F12R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F12R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F12R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F12R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F12R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F12R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F12R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F12R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F12R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F12R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F12R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F12R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F12R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F12R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F12R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F12R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F12R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F12R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F12R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************* Bit definition for CAN_F13R2 register ******************/ +#define CAN_F13R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ +#define CAN_F13R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ +#define CAN_F13R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ +#define CAN_F13R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ +#define CAN_F13R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ +#define CAN_F13R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ +#define CAN_F13R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ +#define CAN_F13R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ +#define CAN_F13R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ +#define CAN_F13R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ +#define CAN_F13R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ +#define CAN_F13R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ +#define CAN_F13R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ +#define CAN_F13R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ +#define CAN_F13R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ +#define CAN_F13R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ +#define CAN_F13R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ +#define CAN_F13R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ +#define CAN_F13R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ +#define CAN_F13R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ +#define CAN_F13R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ +#define CAN_F13R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ +#define CAN_F13R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ +#define CAN_F13R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ +#define CAN_F13R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ +#define CAN_F13R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ +#define CAN_F13R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ +#define CAN_F13R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ +#define CAN_F13R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ +#define CAN_F13R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ +#define CAN_F13R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ +#define CAN_F13R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ + +/******************************************************************************/ +/* */ +/* Serial Peripheral Interface */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for SPI_CR1 register ********************/ +#define SPI_CR1_CPHA ((uint16_t)0x0001) /*!< Clock Phase */ +#define SPI_CR1_CPOL ((uint16_t)0x0002) /*!< Clock Polarity */ +#define SPI_CR1_MSTR ((uint16_t)0x0004) /*!< Master Selection */ + +#define SPI_CR1_BR ((uint16_t)0x0038) /*!< BR[2:0] bits (Baud Rate Control) */ +#define SPI_CR1_BR_0 ((uint16_t)0x0008) /*!< Bit 0 */ +#define SPI_CR1_BR_1 ((uint16_t)0x0010) /*!< Bit 1 */ +#define SPI_CR1_BR_2 ((uint16_t)0x0020) /*!< Bit 2 */ + +#define SPI_CR1_SPE ((uint16_t)0x0040) /*!< SPI Enable */ +#define SPI_CR1_LSBFIRST ((uint16_t)0x0080) /*!< Frame Format */ +#define SPI_CR1_SSI ((uint16_t)0x0100) /*!< Internal slave select */ +#define SPI_CR1_SSM ((uint16_t)0x0200) /*!< Software slave management */ +#define SPI_CR1_RXONLY ((uint16_t)0x0400) /*!< Receive only */ +#define SPI_CR1_DFF ((uint16_t)0x0800) /*!< Data Frame Format */ +#define SPI_CR1_CRCNEXT ((uint16_t)0x1000) /*!< Transmit CRC next */ +#define SPI_CR1_CRCEN ((uint16_t)0x2000) /*!< Hardware CRC calculation enable */ +#define SPI_CR1_BIDIOE ((uint16_t)0x4000) /*!< Output enable in bidirectional mode */ +#define SPI_CR1_BIDIMODE ((uint16_t)0x8000) /*!< Bidirectional data mode enable */ + +/******************* Bit definition for SPI_CR2 register ********************/ +#define SPI_CR2_RXDMAEN ((uint8_t)0x01) /*!< Rx Buffer DMA Enable */ +#define SPI_CR2_TXDMAEN ((uint8_t)0x02) /*!< Tx Buffer DMA Enable */ +#define SPI_CR2_SSOE ((uint8_t)0x04) /*!< SS Output Enable */ +#define SPI_CR2_ERRIE ((uint8_t)0x20) /*!< Error Interrupt Enable */ +#define SPI_CR2_RXNEIE ((uint8_t)0x40) /*!< RX buffer Not Empty Interrupt Enable */ +#define SPI_CR2_TXEIE ((uint8_t)0x80) /*!< Tx buffer Empty Interrupt Enable */ + +/******************** Bit definition for SPI_SR register ********************/ +#define SPI_SR_RXNE ((uint8_t)0x01) /*!< Receive buffer Not Empty */ +#define SPI_SR_TXE ((uint8_t)0x02) /*!< Transmit buffer Empty */ +#define SPI_SR_CHSIDE ((uint8_t)0x04) /*!< Channel side */ +#define SPI_SR_UDR ((uint8_t)0x08) /*!< Underrun flag */ +#define SPI_SR_CRCERR ((uint8_t)0x10) /*!< CRC Error flag */ +#define SPI_SR_MODF ((uint8_t)0x20) /*!< Mode fault */ +#define SPI_SR_OVR ((uint8_t)0x40) /*!< Overrun flag */ +#define SPI_SR_BSY ((uint8_t)0x80) /*!< Busy flag */ + +/******************** Bit definition for SPI_DR register ********************/ +#define SPI_DR_DR ((uint16_t)0xFFFF) /*!< Data Register */ + +/******************* Bit definition for SPI_CRCPR register ******************/ +#define SPI_CRCPR_CRCPOLY ((uint16_t)0xFFFF) /*!< CRC polynomial register */ + +/****************** Bit definition for SPI_RXCRCR register ******************/ +#define SPI_RXCRCR_RXCRC ((uint16_t)0xFFFF) /*!< Rx CRC Register */ + +/****************** Bit definition for SPI_TXCRCR register ******************/ +#define SPI_TXCRCR_TXCRC ((uint16_t)0xFFFF) /*!< Tx CRC Register */ + +/****************** Bit definition for SPI_I2SCFGR register *****************/ +#define SPI_I2SCFGR_CHLEN ((uint16_t)0x0001) /*!< Channel length (number of bits per audio channel) */ + +#define SPI_I2SCFGR_DATLEN ((uint16_t)0x0006) /*!< DATLEN[1:0] bits (Data length to be transferred) */ +#define SPI_I2SCFGR_DATLEN_0 ((uint16_t)0x0002) /*!< Bit 0 */ +#define SPI_I2SCFGR_DATLEN_1 ((uint16_t)0x0004) /*!< Bit 1 */ + +#define SPI_I2SCFGR_CKPOL ((uint16_t)0x0008) /*!< steady state clock polarity */ + +#define SPI_I2SCFGR_I2SSTD ((uint16_t)0x0030) /*!< I2SSTD[1:0] bits (I2S standard selection) */ +#define SPI_I2SCFGR_I2SSTD_0 ((uint16_t)0x0010) /*!< Bit 0 */ +#define SPI_I2SCFGR_I2SSTD_1 ((uint16_t)0x0020) /*!< Bit 1 */ + +#define SPI_I2SCFGR_PCMSYNC ((uint16_t)0x0080) /*!< PCM frame synchronization */ + +#define SPI_I2SCFGR_I2SCFG ((uint16_t)0x0300) /*!< I2SCFG[1:0] bits (I2S configuration mode) */ +#define SPI_I2SCFGR_I2SCFG_0 ((uint16_t)0x0100) /*!< Bit 0 */ +#define SPI_I2SCFGR_I2SCFG_1 ((uint16_t)0x0200) /*!< Bit 1 */ + +#define SPI_I2SCFGR_I2SE ((uint16_t)0x0400) /*!< I2S Enable */ +#define SPI_I2SCFGR_I2SMOD ((uint16_t)0x0800) /*!< I2S mode selection */ + +/****************** Bit definition for SPI_I2SPR register *******************/ +#define SPI_I2SPR_I2SDIV ((uint16_t)0x00FF) /*!< I2S Linear prescaler */ +#define SPI_I2SPR_ODD ((uint16_t)0x0100) /*!< Odd factor for the prescaler */ +#define SPI_I2SPR_MCKOE ((uint16_t)0x0200) /*!< Master Clock Output Enable */ + +/******************************************************************************/ +/* */ +/* Inter-integrated Circuit Interface */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for I2C_CR1 register ********************/ +#define I2C_CR1_PE ((uint16_t)0x0001) /*!< Peripheral Enable */ +#define I2C_CR1_SMBUS ((uint16_t)0x0002) /*!< SMBus Mode */ +#define I2C_CR1_SMBTYPE ((uint16_t)0x0008) /*!< SMBus Type */ +#define I2C_CR1_ENARP ((uint16_t)0x0010) /*!< ARP Enable */ +#define I2C_CR1_ENPEC ((uint16_t)0x0020) /*!< PEC Enable */ +#define I2C_CR1_ENGC ((uint16_t)0x0040) /*!< General Call Enable */ +#define I2C_CR1_NOSTRETCH ((uint16_t)0x0080) /*!< Clock Stretching Disable (Slave mode) */ +#define I2C_CR1_START ((uint16_t)0x0100) /*!< Start Generation */ +#define I2C_CR1_STOP ((uint16_t)0x0200) /*!< Stop Generation */ +#define I2C_CR1_ACK ((uint16_t)0x0400) /*!< Acknowledge Enable */ +#define I2C_CR1_POS ((uint16_t)0x0800) /*!< Acknowledge/PEC Position (for data reception) */ +#define I2C_CR1_PEC ((uint16_t)0x1000) /*!< Packet Error Checking */ +#define I2C_CR1_ALERT ((uint16_t)0x2000) /*!< SMBus Alert */ +#define I2C_CR1_SWRST ((uint16_t)0x8000) /*!< Software Reset */ + +/******************* Bit definition for I2C_CR2 register ********************/ +#define I2C_CR2_FREQ ((uint16_t)0x003F) /*!< FREQ[5:0] bits (Peripheral Clock Frequency) */ +#define I2C_CR2_FREQ_0 ((uint16_t)0x0001) /*!< Bit 0 */ +#define I2C_CR2_FREQ_1 ((uint16_t)0x0002) /*!< Bit 1 */ +#define I2C_CR2_FREQ_2 ((uint16_t)0x0004) /*!< Bit 2 */ +#define I2C_CR2_FREQ_3 ((uint16_t)0x0008) /*!< Bit 3 */ +#define I2C_CR2_FREQ_4 ((uint16_t)0x0010) /*!< Bit 4 */ +#define I2C_CR2_FREQ_5 ((uint16_t)0x0020) /*!< Bit 5 */ + +#define I2C_CR2_ITERREN ((uint16_t)0x0100) /*!< Error Interrupt Enable */ +#define I2C_CR2_ITEVTEN ((uint16_t)0x0200) /*!< Event Interrupt Enable */ +#define I2C_CR2_ITBUFEN ((uint16_t)0x0400) /*!< Buffer Interrupt Enable */ +#define I2C_CR2_DMAEN ((uint16_t)0x0800) /*!< DMA Requests Enable */ +#define I2C_CR2_LAST ((uint16_t)0x1000) /*!< DMA Last Transfer */ + +/******************* Bit definition for I2C_OAR1 register *******************/ +#define I2C_OAR1_ADD1_7 ((uint16_t)0x00FE) /*!< Interface Address */ +#define I2C_OAR1_ADD8_9 ((uint16_t)0x0300) /*!< Interface Address */ + +#define I2C_OAR1_ADD0 ((uint16_t)0x0001) /*!< Bit 0 */ +#define I2C_OAR1_ADD1 ((uint16_t)0x0002) /*!< Bit 1 */ +#define I2C_OAR1_ADD2 ((uint16_t)0x0004) /*!< Bit 2 */ +#define I2C_OAR1_ADD3 ((uint16_t)0x0008) /*!< Bit 3 */ +#define I2C_OAR1_ADD4 ((uint16_t)0x0010) /*!< Bit 4 */ +#define I2C_OAR1_ADD5 ((uint16_t)0x0020) /*!< Bit 5 */ +#define I2C_OAR1_ADD6 ((uint16_t)0x0040) /*!< Bit 6 */ +#define I2C_OAR1_ADD7 ((uint16_t)0x0080) /*!< Bit 7 */ +#define I2C_OAR1_ADD8 ((uint16_t)0x0100) /*!< Bit 8 */ +#define I2C_OAR1_ADD9 ((uint16_t)0x0200) /*!< Bit 9 */ + +#define I2C_OAR1_ADDMODE ((uint16_t)0x8000) /*!< Addressing Mode (Slave mode) */ + +/******************* Bit definition for I2C_OAR2 register *******************/ +#define I2C_OAR2_ENDUAL ((uint8_t)0x01) /*!< Dual addressing mode enable */ +#define I2C_OAR2_ADD2 ((uint8_t)0xFE) /*!< Interface address */ + +/******************** Bit definition for I2C_DR register ********************/ +#define I2C_DR_DR ((uint8_t)0xFF) /*!< 8-bit Data Register */ + +/******************* Bit definition for I2C_SR1 register ********************/ +#define I2C_SR1_SB ((uint16_t)0x0001) /*!< Start Bit (Master mode) */ +#define I2C_SR1_ADDR ((uint16_t)0x0002) /*!< Address sent (master mode)/matched (slave mode) */ +#define I2C_SR1_BTF ((uint16_t)0x0004) /*!< Byte Transfer Finished */ +#define I2C_SR1_ADD10 ((uint16_t)0x0008) /*!< 10-bit header sent (Master mode) */ +#define I2C_SR1_STOPF ((uint16_t)0x0010) /*!< Stop detection (Slave mode) */ +#define I2C_SR1_RXNE ((uint16_t)0x0040) /*!< Data Register not Empty (receivers) */ +#define I2C_SR1_TXE ((uint16_t)0x0080) /*!< Data Register Empty (transmitters) */ +#define I2C_SR1_BERR ((uint16_t)0x0100) /*!< Bus Error */ +#define I2C_SR1_ARLO ((uint16_t)0x0200) /*!< Arbitration Lost (master mode) */ +#define I2C_SR1_AF ((uint16_t)0x0400) /*!< Acknowledge Failure */ +#define I2C_SR1_OVR ((uint16_t)0x0800) /*!< Overrun/Underrun */ +#define I2C_SR1_PECERR ((uint16_t)0x1000) /*!< PEC Error in reception */ +#define I2C_SR1_TIMEOUT ((uint16_t)0x4000) /*!< Timeout or Tlow Error */ +#define I2C_SR1_SMBALERT ((uint16_t)0x8000) /*!< SMBus Alert */ + +/******************* Bit definition for I2C_SR2 register ********************/ +#define I2C_SR2_MSL ((uint16_t)0x0001) /*!< Master/Slave */ +#define I2C_SR2_BUSY ((uint16_t)0x0002) /*!< Bus Busy */ +#define I2C_SR2_TRA ((uint16_t)0x0004) /*!< Transmitter/Receiver */ +#define I2C_SR2_GENCALL ((uint16_t)0x0010) /*!< General Call Address (Slave mode) */ +#define I2C_SR2_SMBDEFAULT ((uint16_t)0x0020) /*!< SMBus Device Default Address (Slave mode) */ +#define I2C_SR2_SMBHOST ((uint16_t)0x0040) /*!< SMBus Host Header (Slave mode) */ +#define I2C_SR2_DUALF ((uint16_t)0x0080) /*!< Dual Flag (Slave mode) */ +#define I2C_SR2_PEC ((uint16_t)0xFF00) /*!< Packet Error Checking Register */ + +/******************* Bit definition for I2C_CCR register ********************/ +#define I2C_CCR_CCR ((uint16_t)0x0FFF) /*!< Clock Control Register in Fast/Standard mode (Master mode) */ +#define I2C_CCR_DUTY ((uint16_t)0x4000) /*!< Fast Mode Duty Cycle */ +#define I2C_CCR_FS ((uint16_t)0x8000) /*!< I2C Master Mode Selection */ + +/****************** Bit definition for I2C_TRISE register *******************/ +#define I2C_TRISE_TRISE ((uint8_t)0x3F) /*!< Maximum Rise Time in Fast/Standard mode (Master mode) */ + +/******************************************************************************/ +/* */ +/* Universal Synchronous Asynchronous Receiver Transmitter */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for USART_SR register *******************/ +#define USART_SR_PE ((uint16_t)0x0001) /*!< Parity Error */ +#define USART_SR_FE ((uint16_t)0x0002) /*!< Framing Error */ +#define USART_SR_NE ((uint16_t)0x0004) /*!< Noise Error Flag */ +#define USART_SR_ORE ((uint16_t)0x0008) /*!< OverRun Error */ +#define USART_SR_IDLE ((uint16_t)0x0010) /*!< IDLE line detected */ +#define USART_SR_RXNE ((uint16_t)0x0020) /*!< Read Data Register Not Empty */ +#define USART_SR_TC ((uint16_t)0x0040) /*!< Transmission Complete */ +#define USART_SR_TXE ((uint16_t)0x0080) /*!< Transmit Data Register Empty */ +#define USART_SR_LBD ((uint16_t)0x0100) /*!< LIN Break Detection Flag */ +#define USART_SR_CTS ((uint16_t)0x0200) /*!< CTS Flag */ + +/******************* Bit definition for USART_DR register *******************/ +#define USART_DR_DR ((uint16_t)0x01FF) /*!< Data value */ + +/****************** Bit definition for USART_BRR register *******************/ +#define USART_BRR_DIV_Fraction ((uint16_t)0x000F) /*!< Fraction of USARTDIV */ +#define USART_BRR_DIV_Mantissa ((uint16_t)0xFFF0) /*!< Mantissa of USARTDIV */ + +/****************** Bit definition for USART_CR1 register *******************/ +#define USART_CR1_SBK ((uint16_t)0x0001) /*!< Send Break */ +#define USART_CR1_RWU ((uint16_t)0x0002) /*!< Receiver wakeup */ +#define USART_CR1_RE ((uint16_t)0x0004) /*!< Receiver Enable */ +#define USART_CR1_TE ((uint16_t)0x0008) /*!< Transmitter Enable */ +#define USART_CR1_IDLEIE ((uint16_t)0x0010) /*!< IDLE Interrupt Enable */ +#define USART_CR1_RXNEIE ((uint16_t)0x0020) /*!< RXNE Interrupt Enable */ +#define USART_CR1_TCIE ((uint16_t)0x0040) /*!< Transmission Complete Interrupt Enable */ +#define USART_CR1_TXEIE ((uint16_t)0x0080) /*!< PE Interrupt Enable */ +#define USART_CR1_PEIE ((uint16_t)0x0100) /*!< PE Interrupt Enable */ +#define USART_CR1_PS ((uint16_t)0x0200) /*!< Parity Selection */ +#define USART_CR1_PCE ((uint16_t)0x0400) /*!< Parity Control Enable */ +#define USART_CR1_WAKE ((uint16_t)0x0800) /*!< Wakeup method */ +#define USART_CR1_M ((uint16_t)0x1000) /*!< Word length */ +#define USART_CR1_UE ((uint16_t)0x2000) /*!< USART Enable */ +#define USART_CR1_OVER8 ((uint16_t)0x8000) /*!< USART Oversmapling 8-bits */ + +/****************** Bit definition for USART_CR2 register *******************/ +#define USART_CR2_ADD ((uint16_t)0x000F) /*!< Address of the USART node */ +#define USART_CR2_LBDL ((uint16_t)0x0020) /*!< LIN Break Detection Length */ +#define USART_CR2_LBDIE ((uint16_t)0x0040) /*!< LIN Break Detection Interrupt Enable */ +#define USART_CR2_LBCL ((uint16_t)0x0100) /*!< Last Bit Clock pulse */ +#define USART_CR2_CPHA ((uint16_t)0x0200) /*!< Clock Phase */ +#define USART_CR2_CPOL ((uint16_t)0x0400) /*!< Clock Polarity */ +#define USART_CR2_CLKEN ((uint16_t)0x0800) /*!< Clock Enable */ + +#define USART_CR2_STOP ((uint16_t)0x3000) /*!< STOP[1:0] bits (STOP bits) */ +#define USART_CR2_STOP_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define USART_CR2_STOP_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define USART_CR2_LINEN ((uint16_t)0x4000) /*!< LIN mode enable */ + +/****************** Bit definition for USART_CR3 register *******************/ +#define USART_CR3_EIE ((uint16_t)0x0001) /*!< Error Interrupt Enable */ +#define USART_CR3_IREN ((uint16_t)0x0002) /*!< IrDA mode Enable */ +#define USART_CR3_IRLP ((uint16_t)0x0004) /*!< IrDA Low-Power */ +#define USART_CR3_HDSEL ((uint16_t)0x0008) /*!< Half-Duplex Selection */ +#define USART_CR3_NACK ((uint16_t)0x0010) /*!< Smartcard NACK enable */ +#define USART_CR3_SCEN ((uint16_t)0x0020) /*!< Smartcard mode enable */ +#define USART_CR3_DMAR ((uint16_t)0x0040) /*!< DMA Enable Receiver */ +#define USART_CR3_DMAT ((uint16_t)0x0080) /*!< DMA Enable Transmitter */ +#define USART_CR3_RTSE ((uint16_t)0x0100) /*!< RTS Enable */ +#define USART_CR3_CTSE ((uint16_t)0x0200) /*!< CTS Enable */ +#define USART_CR3_CTSIE ((uint16_t)0x0400) /*!< CTS Interrupt Enable */ +#define USART_CR3_ONEBIT ((uint16_t)0x0800) /*!< One Bit method */ + +/****************** Bit definition for USART_GTPR register ******************/ +#define USART_GTPR_PSC ((uint16_t)0x00FF) /*!< PSC[7:0] bits (Prescaler value) */ +#define USART_GTPR_PSC_0 ((uint16_t)0x0001) /*!< Bit 0 */ +#define USART_GTPR_PSC_1 ((uint16_t)0x0002) /*!< Bit 1 */ +#define USART_GTPR_PSC_2 ((uint16_t)0x0004) /*!< Bit 2 */ +#define USART_GTPR_PSC_3 ((uint16_t)0x0008) /*!< Bit 3 */ +#define USART_GTPR_PSC_4 ((uint16_t)0x0010) /*!< Bit 4 */ +#define USART_GTPR_PSC_5 ((uint16_t)0x0020) /*!< Bit 5 */ +#define USART_GTPR_PSC_6 ((uint16_t)0x0040) /*!< Bit 6 */ +#define USART_GTPR_PSC_7 ((uint16_t)0x0080) /*!< Bit 7 */ + +#define USART_GTPR_GT ((uint16_t)0xFF00) /*!< Guard time value */ + +/******************************************************************************/ +/* */ +/* Debug MCU */ +/* */ +/******************************************************************************/ + +/**************** Bit definition for DBGMCU_IDCODE register *****************/ +#define DBGMCU_IDCODE_DEV_ID ((uint32_t)0x00000FFF) /*!< Device Identifier */ + +#define DBGMCU_IDCODE_REV_ID ((uint32_t)0xFFFF0000) /*!< REV_ID[15:0] bits (Revision Identifier) */ +#define DBGMCU_IDCODE_REV_ID_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define DBGMCU_IDCODE_REV_ID_1 ((uint32_t)0x00020000) /*!< Bit 1 */ +#define DBGMCU_IDCODE_REV_ID_2 ((uint32_t)0x00040000) /*!< Bit 2 */ +#define DBGMCU_IDCODE_REV_ID_3 ((uint32_t)0x00080000) /*!< Bit 3 */ +#define DBGMCU_IDCODE_REV_ID_4 ((uint32_t)0x00100000) /*!< Bit 4 */ +#define DBGMCU_IDCODE_REV_ID_5 ((uint32_t)0x00200000) /*!< Bit 5 */ +#define DBGMCU_IDCODE_REV_ID_6 ((uint32_t)0x00400000) /*!< Bit 6 */ +#define DBGMCU_IDCODE_REV_ID_7 ((uint32_t)0x00800000) /*!< Bit 7 */ +#define DBGMCU_IDCODE_REV_ID_8 ((uint32_t)0x01000000) /*!< Bit 8 */ +#define DBGMCU_IDCODE_REV_ID_9 ((uint32_t)0x02000000) /*!< Bit 9 */ +#define DBGMCU_IDCODE_REV_ID_10 ((uint32_t)0x04000000) /*!< Bit 10 */ +#define DBGMCU_IDCODE_REV_ID_11 ((uint32_t)0x08000000) /*!< Bit 11 */ +#define DBGMCU_IDCODE_REV_ID_12 ((uint32_t)0x10000000) /*!< Bit 12 */ +#define DBGMCU_IDCODE_REV_ID_13 ((uint32_t)0x20000000) /*!< Bit 13 */ +#define DBGMCU_IDCODE_REV_ID_14 ((uint32_t)0x40000000) /*!< Bit 14 */ +#define DBGMCU_IDCODE_REV_ID_15 ((uint32_t)0x80000000) /*!< Bit 15 */ + +/****************** Bit definition for DBGMCU_CR register *******************/ +#define DBGMCU_CR_DBG_SLEEP ((uint32_t)0x00000001) /*!< Debug Sleep Mode */ +#define DBGMCU_CR_DBG_STOP ((uint32_t)0x00000002) /*!< Debug Stop Mode */ +#define DBGMCU_CR_DBG_STANDBY ((uint32_t)0x00000004) /*!< Debug Standby mode */ +#define DBGMCU_CR_TRACE_IOEN ((uint32_t)0x00000020) /*!< Trace Pin Assignment Control */ + +#define DBGMCU_CR_TRACE_MODE ((uint32_t)0x000000C0) /*!< TRACE_MODE[1:0] bits (Trace Pin Assignment Control) */ +#define DBGMCU_CR_TRACE_MODE_0 ((uint32_t)0x00000040) /*!< Bit 0 */ +#define DBGMCU_CR_TRACE_MODE_1 ((uint32_t)0x00000080) /*!< Bit 1 */ + +#define DBGMCU_CR_DBG_IWDG_STOP ((uint32_t)0x00000100) /*!< Debug Independent Watchdog stopped when Core is halted */ +#define DBGMCU_CR_DBG_WWDG_STOP ((uint32_t)0x00000200) /*!< Debug Window Watchdog stopped when Core is halted */ +#define DBGMCU_CR_DBG_TIM1_STOP ((uint32_t)0x00000400) /*!< TIM1 counter stopped when core is halted */ +#define DBGMCU_CR_DBG_TIM2_STOP ((uint32_t)0x00000800) /*!< TIM2 counter stopped when core is halted */ +#define DBGMCU_CR_DBG_TIM3_STOP ((uint32_t)0x00001000) /*!< TIM3 counter stopped when core is halted */ +#define DBGMCU_CR_DBG_TIM4_STOP ((uint32_t)0x00002000) /*!< TIM4 counter stopped when core is halted */ +#define DBGMCU_CR_DBG_CAN1_STOP ((uint32_t)0x00004000) /*!< Debug CAN1 stopped when Core is halted */ +#define DBGMCU_CR_DBG_I2C1_SMBUS_TIMEOUT ((uint32_t)0x00008000) /*!< SMBUS timeout mode stopped when Core is halted */ +#define DBGMCU_CR_DBG_I2C2_SMBUS_TIMEOUT ((uint32_t)0x00010000) /*!< SMBUS timeout mode stopped when Core is halted */ +#define DBGMCU_CR_DBG_TIM8_STOP ((uint32_t)0x00020000) /*!< TIM8 counter stopped when core is halted */ +#define DBGMCU_CR_DBG_TIM5_STOP ((uint32_t)0x00040000) /*!< TIM5 counter stopped when core is halted */ +#define DBGMCU_CR_DBG_TIM6_STOP ((uint32_t)0x00080000) /*!< TIM6 counter stopped when core is halted */ +#define DBGMCU_CR_DBG_TIM7_STOP ((uint32_t)0x00100000) /*!< TIM7 counter stopped when core is halted */ +#define DBGMCU_CR_DBG_CAN2_STOP ((uint32_t)0x00200000) /*!< Debug CAN2 stopped when Core is halted */ +#define DBGMCU_CR_DBG_TIM15_STOP ((uint32_t)0x00400000) /*!< Debug TIM15 stopped when Core is halted */ +#define DBGMCU_CR_DBG_TIM16_STOP ((uint32_t)0x00800000) /*!< Debug TIM16 stopped when Core is halted */ +#define DBGMCU_CR_DBG_TIM17_STOP ((uint32_t)0x01000000) /*!< Debug TIM17 stopped when Core is halted */ +#define DBGMCU_CR_DBG_TIM12_STOP ((uint32_t)0x02000000) /*!< Debug TIM12 stopped when Core is halted */ +#define DBGMCU_CR_DBG_TIM13_STOP ((uint32_t)0x04000000) /*!< Debug TIM13 stopped when Core is halted */ +#define DBGMCU_CR_DBG_TIM14_STOP ((uint32_t)0x08000000) /*!< Debug TIM14 stopped when Core is halted */ +#define DBGMCU_CR_DBG_TIM9_STOP ((uint32_t)0x10000000) /*!< Debug TIM9 stopped when Core is halted */ +#define DBGMCU_CR_DBG_TIM10_STOP ((uint32_t)0x20000000) /*!< Debug TIM10 stopped when Core is halted */ +#define DBGMCU_CR_DBG_TIM11_STOP ((uint32_t)0x40000000) /*!< Debug TIM11 stopped when Core is halted */ + +/******************************************************************************/ +/* */ +/* FLASH and Option Bytes Registers */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for FLASH_ACR register ******************/ +#define FLASH_ACR_LATENCY ((uint8_t)0x03) /*!< LATENCY[2:0] bits (Latency) */ +#define FLASH_ACR_LATENCY_0 ((uint8_t)0x00) /*!< Bit 0 */ +#define FLASH_ACR_LATENCY_1 ((uint8_t)0x01) /*!< Bit 0 */ +#define FLASH_ACR_LATENCY_2 ((uint8_t)0x02) /*!< Bit 1 */ + +#define FLASH_ACR_HLFCYA ((uint8_t)0x08) /*!< Flash Half Cycle Access Enable */ +#define FLASH_ACR_PRFTBE ((uint8_t)0x10) /*!< Prefetch Buffer Enable */ +#define FLASH_ACR_PRFTBS ((uint8_t)0x20) /*!< Prefetch Buffer Status */ + +/****************** Bit definition for FLASH_KEYR register ******************/ +#define FLASH_KEYR_FKEYR ((uint32_t)0xFFFFFFFF) /*!< FPEC Key */ + +/***************** Bit definition for FLASH_OPTKEYR register ****************/ +#define FLASH_OPTKEYR_OPTKEYR ((uint32_t)0xFFFFFFFF) /*!< Option Byte Key */ + +/****************** Bit definition for FLASH_SR register *******************/ +#define FLASH_SR_BSY ((uint8_t)0x01) /*!< Busy */ +#define FLASH_SR_PGERR ((uint8_t)0x04) /*!< Programming Error */ +#define FLASH_SR_WRPRTERR ((uint8_t)0x10) /*!< Write Protection Error */ +#define FLASH_SR_EOP ((uint8_t)0x20) /*!< End of operation */ + +/******************* Bit definition for FLASH_CR register *******************/ +#define FLASH_CR_PG ((uint16_t)0x0001) /*!< Programming */ +#define FLASH_CR_PER ((uint16_t)0x0002) /*!< Page Erase */ +#define FLASH_CR_MER ((uint16_t)0x0004) /*!< Mass Erase */ +#define FLASH_CR_OPTPG ((uint16_t)0x0010) /*!< Option Byte Programming */ +#define FLASH_CR_OPTER ((uint16_t)0x0020) /*!< Option Byte Erase */ +#define FLASH_CR_STRT ((uint16_t)0x0040) /*!< Start */ +#define FLASH_CR_LOCK ((uint16_t)0x0080) /*!< Lock */ +#define FLASH_CR_OPTWRE ((uint16_t)0x0200) /*!< Option Bytes Write Enable */ +#define FLASH_CR_ERRIE ((uint16_t)0x0400) /*!< Error Interrupt Enable */ +#define FLASH_CR_EOPIE ((uint16_t)0x1000) /*!< End of operation interrupt enable */ + +/******************* Bit definition for FLASH_AR register *******************/ +#define FLASH_AR_FAR ((uint32_t)0xFFFFFFFF) /*!< Flash Address */ + +/****************** Bit definition for FLASH_OBR register *******************/ +#define FLASH_OBR_OPTERR ((uint16_t)0x0001) /*!< Option Byte Error */ +#define FLASH_OBR_RDPRT ((uint16_t)0x0002) /*!< Read protection */ + +#define FLASH_OBR_USER ((uint16_t)0x03FC) /*!< User Option Bytes */ +#define FLASH_OBR_WDG_SW ((uint16_t)0x0004) /*!< WDG_SW */ +#define FLASH_OBR_nRST_STOP ((uint16_t)0x0008) /*!< nRST_STOP */ +#define FLASH_OBR_nRST_STDBY ((uint16_t)0x0010) /*!< nRST_STDBY */ +#define FLASH_OBR_BFB2 ((uint16_t)0x0020) /*!< BFB2 */ + +/****************** Bit definition for FLASH_WRPR register ******************/ +#define FLASH_WRPR_WRP ((uint32_t)0xFFFFFFFF) /*!< Write Protect */ + +/*----------------------------------------------------------------------------*/ + +/****************** Bit definition for FLASH_RDP register *******************/ +#define FLASH_RDP_RDP ((uint32_t)0x000000FF) /*!< Read protection option byte */ +#define FLASH_RDP_nRDP ((uint32_t)0x0000FF00) /*!< Read protection complemented option byte */ + +/****************** Bit definition for FLASH_USER register ******************/ +#define FLASH_USER_USER ((uint32_t)0x00FF0000) /*!< User option byte */ +#define FLASH_USER_nUSER ((uint32_t)0xFF000000) /*!< User complemented option byte */ + +/****************** Bit definition for FLASH_Data0 register *****************/ +#define FLASH_Data0_Data0 ((uint32_t)0x000000FF) /*!< User data storage option byte */ +#define FLASH_Data0_nData0 ((uint32_t)0x0000FF00) /*!< User data storage complemented option byte */ + +/****************** Bit definition for FLASH_Data1 register *****************/ +#define FLASH_Data1_Data1 ((uint32_t)0x00FF0000) /*!< User data storage option byte */ +#define FLASH_Data1_nData1 ((uint32_t)0xFF000000) /*!< User data storage complemented option byte */ + +/****************** Bit definition for FLASH_WRP0 register ******************/ +#define FLASH_WRP0_WRP0 ((uint32_t)0x000000FF) /*!< Flash memory write protection option bytes */ +#define FLASH_WRP0_nWRP0 ((uint32_t)0x0000FF00) /*!< Flash memory write protection complemented option bytes */ + +/****************** Bit definition for FLASH_WRP1 register ******************/ +#define FLASH_WRP1_WRP1 ((uint32_t)0x00FF0000) /*!< Flash memory write protection option bytes */ +#define FLASH_WRP1_nWRP1 ((uint32_t)0xFF000000) /*!< Flash memory write protection complemented option bytes */ + +/****************** Bit definition for FLASH_WRP2 register ******************/ +#define FLASH_WRP2_WRP2 ((uint32_t)0x000000FF) /*!< Flash memory write protection option bytes */ +#define FLASH_WRP2_nWRP2 ((uint32_t)0x0000FF00) /*!< Flash memory write protection complemented option bytes */ + +/****************** Bit definition for FLASH_WRP3 register ******************/ +#define FLASH_WRP3_WRP3 ((uint32_t)0x00FF0000) /*!< Flash memory write protection option bytes */ +#define FLASH_WRP3_nWRP3 ((uint32_t)0xFF000000) /*!< Flash memory write protection complemented option bytes */ + +#ifdef STM32F10X_CL +/******************************************************************************/ +/* Ethernet MAC Registers bits definitions */ +/******************************************************************************/ +/* Bit definition for Ethernet MAC Control Register register */ +#define ETH_MACCR_WD ((uint32_t)0x00800000) /* Watchdog disable */ +#define ETH_MACCR_JD ((uint32_t)0x00400000) /* Jabber disable */ +#define ETH_MACCR_IFG ((uint32_t)0x000E0000) /* Inter-frame gap */ + #define ETH_MACCR_IFG_96Bit ((uint32_t)0x00000000) /* Minimum IFG between frames during transmission is 96Bit */ + #define ETH_MACCR_IFG_88Bit ((uint32_t)0x00020000) /* Minimum IFG between frames during transmission is 88Bit */ + #define ETH_MACCR_IFG_80Bit ((uint32_t)0x00040000) /* Minimum IFG between frames during transmission is 80Bit */ + #define ETH_MACCR_IFG_72Bit ((uint32_t)0x00060000) /* Minimum IFG between frames during transmission is 72Bit */ + #define ETH_MACCR_IFG_64Bit ((uint32_t)0x00080000) /* Minimum IFG between frames during transmission is 64Bit */ + #define ETH_MACCR_IFG_56Bit ((uint32_t)0x000A0000) /* Minimum IFG between frames during transmission is 56Bit */ + #define ETH_MACCR_IFG_48Bit ((uint32_t)0x000C0000) /* Minimum IFG between frames during transmission is 48Bit */ + #define ETH_MACCR_IFG_40Bit ((uint32_t)0x000E0000) /* Minimum IFG between frames during transmission is 40Bit */ +#define ETH_MACCR_CSD ((uint32_t)0x00010000) /* Carrier sense disable (during transmission) */ +#define ETH_MACCR_FES ((uint32_t)0x00004000) /* Fast ethernet speed */ +#define ETH_MACCR_ROD ((uint32_t)0x00002000) /* Receive own disable */ +#define ETH_MACCR_LM ((uint32_t)0x00001000) /* loopback mode */ +#define ETH_MACCR_DM ((uint32_t)0x00000800) /* Duplex mode */ +#define ETH_MACCR_IPCO ((uint32_t)0x00000400) /* IP Checksum offload */ +#define ETH_MACCR_RD ((uint32_t)0x00000200) /* Retry disable */ +#define ETH_MACCR_APCS ((uint32_t)0x00000080) /* Automatic Pad/CRC stripping */ +#define ETH_MACCR_BL ((uint32_t)0x00000060) /* Back-off limit: random integer number (r) of slot time delays before rescheduling + a transmission attempt during retries after a collision: 0 =< r <2^k */ + #define ETH_MACCR_BL_10 ((uint32_t)0x00000000) /* k = min (n, 10) */ + #define ETH_MACCR_BL_8 ((uint32_t)0x00000020) /* k = min (n, 8) */ + #define ETH_MACCR_BL_4 ((uint32_t)0x00000040) /* k = min (n, 4) */ + #define ETH_MACCR_BL_1 ((uint32_t)0x00000060) /* k = min (n, 1) */ +#define ETH_MACCR_DC ((uint32_t)0x00000010) /* Defferal check */ +#define ETH_MACCR_TE ((uint32_t)0x00000008) /* Transmitter enable */ +#define ETH_MACCR_RE ((uint32_t)0x00000004) /* Receiver enable */ + +/* Bit definition for Ethernet MAC Frame Filter Register */ +#define ETH_MACFFR_RA ((uint32_t)0x80000000) /* Receive all */ +#define ETH_MACFFR_HPF ((uint32_t)0x00000400) /* Hash or perfect filter */ +#define ETH_MACFFR_SAF ((uint32_t)0x00000200) /* Source address filter enable */ +#define ETH_MACFFR_SAIF ((uint32_t)0x00000100) /* SA inverse filtering */ +#define ETH_MACFFR_PCF ((uint32_t)0x000000C0) /* Pass control frames: 3 cases */ + #define ETH_MACFFR_PCF_BlockAll ((uint32_t)0x00000040) /* MAC filters all control frames from reaching the application */ + #define ETH_MACFFR_PCF_ForwardAll ((uint32_t)0x00000080) /* MAC forwards all control frames to application even if they fail the Address Filter */ + #define ETH_MACFFR_PCF_ForwardPassedAddrFilter ((uint32_t)0x000000C0) /* MAC forwards control frames that pass the Address Filter. */ +#define ETH_MACFFR_BFD ((uint32_t)0x00000020) /* Broadcast frame disable */ +#define ETH_MACFFR_PAM ((uint32_t)0x00000010) /* Pass all mutlicast */ +#define ETH_MACFFR_DAIF ((uint32_t)0x00000008) /* DA Inverse filtering */ +#define ETH_MACFFR_HM ((uint32_t)0x00000004) /* Hash multicast */ +#define ETH_MACFFR_HU ((uint32_t)0x00000002) /* Hash unicast */ +#define ETH_MACFFR_PM ((uint32_t)0x00000001) /* Promiscuous mode */ + +/* Bit definition for Ethernet MAC Hash Table High Register */ +#define ETH_MACHTHR_HTH ((uint32_t)0xFFFFFFFF) /* Hash table high */ + +/* Bit definition for Ethernet MAC Hash Table Low Register */ +#define ETH_MACHTLR_HTL ((uint32_t)0xFFFFFFFF) /* Hash table low */ + +/* Bit definition for Ethernet MAC MII Address Register */ +#define ETH_MACMIIAR_PA ((uint32_t)0x0000F800) /* Physical layer address */ +#define ETH_MACMIIAR_MR ((uint32_t)0x000007C0) /* MII register in the selected PHY */ +#define ETH_MACMIIAR_CR ((uint32_t)0x0000001C) /* CR clock range: 6 cases */ + #define ETH_MACMIIAR_CR_Div42 ((uint32_t)0x00000000) /* HCLK:60-72 MHz; MDC clock= HCLK/42 */ + #define ETH_MACMIIAR_CR_Div16 ((uint32_t)0x00000008) /* HCLK:20-35 MHz; MDC clock= HCLK/16 */ + #define ETH_MACMIIAR_CR_Div26 ((uint32_t)0x0000000C) /* HCLK:35-60 MHz; MDC clock= HCLK/26 */ +#define ETH_MACMIIAR_MW ((uint32_t)0x00000002) /* MII write */ +#define ETH_MACMIIAR_MB ((uint32_t)0x00000001) /* MII busy */ + +/* Bit definition for Ethernet MAC MII Data Register */ +#define ETH_MACMIIDR_MD ((uint32_t)0x0000FFFF) /* MII data: read/write data from/to PHY */ + +/* Bit definition for Ethernet MAC Flow Control Register */ +#define ETH_MACFCR_PT ((uint32_t)0xFFFF0000) /* Pause time */ +#define ETH_MACFCR_ZQPD ((uint32_t)0x00000080) /* Zero-quanta pause disable */ +#define ETH_MACFCR_PLT ((uint32_t)0x00000030) /* Pause low threshold: 4 cases */ + #define ETH_MACFCR_PLT_Minus4 ((uint32_t)0x00000000) /* Pause time minus 4 slot times */ + #define ETH_MACFCR_PLT_Minus28 ((uint32_t)0x00000010) /* Pause time minus 28 slot times */ + #define ETH_MACFCR_PLT_Minus144 ((uint32_t)0x00000020) /* Pause time minus 144 slot times */ + #define ETH_MACFCR_PLT_Minus256 ((uint32_t)0x00000030) /* Pause time minus 256 slot times */ +#define ETH_MACFCR_UPFD ((uint32_t)0x00000008) /* Unicast pause frame detect */ +#define ETH_MACFCR_RFCE ((uint32_t)0x00000004) /* Receive flow control enable */ +#define ETH_MACFCR_TFCE ((uint32_t)0x00000002) /* Transmit flow control enable */ +#define ETH_MACFCR_FCBBPA ((uint32_t)0x00000001) /* Flow control busy/backpressure activate */ + +/* Bit definition for Ethernet MAC VLAN Tag Register */ +#define ETH_MACVLANTR_VLANTC ((uint32_t)0x00010000) /* 12-bit VLAN tag comparison */ +#define ETH_MACVLANTR_VLANTI ((uint32_t)0x0000FFFF) /* VLAN tag identifier (for receive frames) */ + +/* Bit definition for Ethernet MAC Remote Wake-UpFrame Filter Register */ +#define ETH_MACRWUFFR_D ((uint32_t)0xFFFFFFFF) /* Wake-up frame filter register data */ +/* Eight sequential Writes to this address (offset 0x28) will write all Wake-UpFrame Filter Registers. + Eight sequential Reads from this address (offset 0x28) will read all Wake-UpFrame Filter Registers. */ +/* Wake-UpFrame Filter Reg0 : Filter 0 Byte Mask + Wake-UpFrame Filter Reg1 : Filter 1 Byte Mask + Wake-UpFrame Filter Reg2 : Filter 2 Byte Mask + Wake-UpFrame Filter Reg3 : Filter 3 Byte Mask + Wake-UpFrame Filter Reg4 : RSVD - Filter3 Command - RSVD - Filter2 Command - + RSVD - Filter1 Command - RSVD - Filter0 Command + Wake-UpFrame Filter Re5 : Filter3 Offset - Filter2 Offset - Filter1 Offset - Filter0 Offset + Wake-UpFrame Filter Re6 : Filter1 CRC16 - Filter0 CRC16 + Wake-UpFrame Filter Re7 : Filter3 CRC16 - Filter2 CRC16 */ + +/* Bit definition for Ethernet MAC PMT Control and Status Register */ +#define ETH_MACPMTCSR_WFFRPR ((uint32_t)0x80000000) /* Wake-Up Frame Filter Register Pointer Reset */ +#define ETH_MACPMTCSR_GU ((uint32_t)0x00000200) /* Global Unicast */ +#define ETH_MACPMTCSR_WFR ((uint32_t)0x00000040) /* Wake-Up Frame Received */ +#define ETH_MACPMTCSR_MPR ((uint32_t)0x00000020) /* Magic Packet Received */ +#define ETH_MACPMTCSR_WFE ((uint32_t)0x00000004) /* Wake-Up Frame Enable */ +#define ETH_MACPMTCSR_MPE ((uint32_t)0x00000002) /* Magic Packet Enable */ +#define ETH_MACPMTCSR_PD ((uint32_t)0x00000001) /* Power Down */ + +/* Bit definition for Ethernet MAC Status Register */ +#define ETH_MACSR_TSTS ((uint32_t)0x00000200) /* Time stamp trigger status */ +#define ETH_MACSR_MMCTS ((uint32_t)0x00000040) /* MMC transmit status */ +#define ETH_MACSR_MMMCRS ((uint32_t)0x00000020) /* MMC receive status */ +#define ETH_MACSR_MMCS ((uint32_t)0x00000010) /* MMC status */ +#define ETH_MACSR_PMTS ((uint32_t)0x00000008) /* PMT status */ + +/* Bit definition for Ethernet MAC Interrupt Mask Register */ +#define ETH_MACIMR_TSTIM ((uint32_t)0x00000200) /* Time stamp trigger interrupt mask */ +#define ETH_MACIMR_PMTIM ((uint32_t)0x00000008) /* PMT interrupt mask */ + +/* Bit definition for Ethernet MAC Address0 High Register */ +#define ETH_MACA0HR_MACA0H ((uint32_t)0x0000FFFF) /* MAC address0 high */ + +/* Bit definition for Ethernet MAC Address0 Low Register */ +#define ETH_MACA0LR_MACA0L ((uint32_t)0xFFFFFFFF) /* MAC address0 low */ + +/* Bit definition for Ethernet MAC Address1 High Register */ +#define ETH_MACA1HR_AE ((uint32_t)0x80000000) /* Address enable */ +#define ETH_MACA1HR_SA ((uint32_t)0x40000000) /* Source address */ +#define ETH_MACA1HR_MBC ((uint32_t)0x3F000000) /* Mask byte control: bits to mask for comparison of the MAC Address bytes */ + #define ETH_MACA1HR_MBC_HBits15_8 ((uint32_t)0x20000000) /* Mask MAC Address high reg bits [15:8] */ + #define ETH_MACA1HR_MBC_HBits7_0 ((uint32_t)0x10000000) /* Mask MAC Address high reg bits [7:0] */ + #define ETH_MACA1HR_MBC_LBits31_24 ((uint32_t)0x08000000) /* Mask MAC Address low reg bits [31:24] */ + #define ETH_MACA1HR_MBC_LBits23_16 ((uint32_t)0x04000000) /* Mask MAC Address low reg bits [23:16] */ + #define ETH_MACA1HR_MBC_LBits15_8 ((uint32_t)0x02000000) /* Mask MAC Address low reg bits [15:8] */ + #define ETH_MACA1HR_MBC_LBits7_0 ((uint32_t)0x01000000) /* Mask MAC Address low reg bits [7:0] */ +#define ETH_MACA1HR_MACA1H ((uint32_t)0x0000FFFF) /* MAC address1 high */ + +/* Bit definition for Ethernet MAC Address1 Low Register */ +#define ETH_MACA1LR_MACA1L ((uint32_t)0xFFFFFFFF) /* MAC address1 low */ + +/* Bit definition for Ethernet MAC Address2 High Register */ +#define ETH_MACA2HR_AE ((uint32_t)0x80000000) /* Address enable */ +#define ETH_MACA2HR_SA ((uint32_t)0x40000000) /* Source address */ +#define ETH_MACA2HR_MBC ((uint32_t)0x3F000000) /* Mask byte control */ + #define ETH_MACA2HR_MBC_HBits15_8 ((uint32_t)0x20000000) /* Mask MAC Address high reg bits [15:8] */ + #define ETH_MACA2HR_MBC_HBits7_0 ((uint32_t)0x10000000) /* Mask MAC Address high reg bits [7:0] */ + #define ETH_MACA2HR_MBC_LBits31_24 ((uint32_t)0x08000000) /* Mask MAC Address low reg bits [31:24] */ + #define ETH_MACA2HR_MBC_LBits23_16 ((uint32_t)0x04000000) /* Mask MAC Address low reg bits [23:16] */ + #define ETH_MACA2HR_MBC_LBits15_8 ((uint32_t)0x02000000) /* Mask MAC Address low reg bits [15:8] */ + #define ETH_MACA2HR_MBC_LBits7_0 ((uint32_t)0x01000000) /* Mask MAC Address low reg bits [70] */ +#define ETH_MACA2HR_MACA2H ((uint32_t)0x0000FFFF) /* MAC address1 high */ + +/* Bit definition for Ethernet MAC Address2 Low Register */ +#define ETH_MACA2LR_MACA2L ((uint32_t)0xFFFFFFFF) /* MAC address2 low */ + +/* Bit definition for Ethernet MAC Address3 High Register */ +#define ETH_MACA3HR_AE ((uint32_t)0x80000000) /* Address enable */ +#define ETH_MACA3HR_SA ((uint32_t)0x40000000) /* Source address */ +#define ETH_MACA3HR_MBC ((uint32_t)0x3F000000) /* Mask byte control */ + #define ETH_MACA3HR_MBC_HBits15_8 ((uint32_t)0x20000000) /* Mask MAC Address high reg bits [15:8] */ + #define ETH_MACA3HR_MBC_HBits7_0 ((uint32_t)0x10000000) /* Mask MAC Address high reg bits [7:0] */ + #define ETH_MACA3HR_MBC_LBits31_24 ((uint32_t)0x08000000) /* Mask MAC Address low reg bits [31:24] */ + #define ETH_MACA3HR_MBC_LBits23_16 ((uint32_t)0x04000000) /* Mask MAC Address low reg bits [23:16] */ + #define ETH_MACA3HR_MBC_LBits15_8 ((uint32_t)0x02000000) /* Mask MAC Address low reg bits [15:8] */ + #define ETH_MACA3HR_MBC_LBits7_0 ((uint32_t)0x01000000) /* Mask MAC Address low reg bits [70] */ +#define ETH_MACA3HR_MACA3H ((uint32_t)0x0000FFFF) /* MAC address3 high */ + +/* Bit definition for Ethernet MAC Address3 Low Register */ +#define ETH_MACA3LR_MACA3L ((uint32_t)0xFFFFFFFF) /* MAC address3 low */ + +/******************************************************************************/ +/* Ethernet MMC Registers bits definition */ +/******************************************************************************/ + +/* Bit definition for Ethernet MMC Contol Register */ +#define ETH_MMCCR_MCF ((uint32_t)0x00000008) /* MMC Counter Freeze */ +#define ETH_MMCCR_ROR ((uint32_t)0x00000004) /* Reset on Read */ +#define ETH_MMCCR_CSR ((uint32_t)0x00000002) /* Counter Stop Rollover */ +#define ETH_MMCCR_CR ((uint32_t)0x00000001) /* Counters Reset */ + +/* Bit definition for Ethernet MMC Receive Interrupt Register */ +#define ETH_MMCRIR_RGUFS ((uint32_t)0x00020000) /* Set when Rx good unicast frames counter reaches half the maximum value */ +#define ETH_MMCRIR_RFAES ((uint32_t)0x00000040) /* Set when Rx alignment error counter reaches half the maximum value */ +#define ETH_MMCRIR_RFCES ((uint32_t)0x00000020) /* Set when Rx crc error counter reaches half the maximum value */ + +/* Bit definition for Ethernet MMC Transmit Interrupt Register */ +#define ETH_MMCTIR_TGFS ((uint32_t)0x00200000) /* Set when Tx good frame count counter reaches half the maximum value */ +#define ETH_MMCTIR_TGFMSCS ((uint32_t)0x00008000) /* Set when Tx good multi col counter reaches half the maximum value */ +#define ETH_MMCTIR_TGFSCS ((uint32_t)0x00004000) /* Set when Tx good single col counter reaches half the maximum value */ + +/* Bit definition for Ethernet MMC Receive Interrupt Mask Register */ +#define ETH_MMCRIMR_RGUFM ((uint32_t)0x00020000) /* Mask the interrupt when Rx good unicast frames counter reaches half the maximum value */ +#define ETH_MMCRIMR_RFAEM ((uint32_t)0x00000040) /* Mask the interrupt when when Rx alignment error counter reaches half the maximum value */ +#define ETH_MMCRIMR_RFCEM ((uint32_t)0x00000020) /* Mask the interrupt when Rx crc error counter reaches half the maximum value */ + +/* Bit definition for Ethernet MMC Transmit Interrupt Mask Register */ +#define ETH_MMCTIMR_TGFM ((uint32_t)0x00200000) /* Mask the interrupt when Tx good frame count counter reaches half the maximum value */ +#define ETH_MMCTIMR_TGFMSCM ((uint32_t)0x00008000) /* Mask the interrupt when Tx good multi col counter reaches half the maximum value */ +#define ETH_MMCTIMR_TGFSCM ((uint32_t)0x00004000) /* Mask the interrupt when Tx good single col counter reaches half the maximum value */ + +/* Bit definition for Ethernet MMC Transmitted Good Frames after Single Collision Counter Register */ +#define ETH_MMCTGFSCCR_TGFSCC ((uint32_t)0xFFFFFFFF) /* Number of successfully transmitted frames after a single collision in Half-duplex mode. */ + +/* Bit definition for Ethernet MMC Transmitted Good Frames after More than a Single Collision Counter Register */ +#define ETH_MMCTGFMSCCR_TGFMSCC ((uint32_t)0xFFFFFFFF) /* Number of successfully transmitted frames after more than a single collision in Half-duplex mode. */ + +/* Bit definition for Ethernet MMC Transmitted Good Frames Counter Register */ +#define ETH_MMCTGFCR_TGFC ((uint32_t)0xFFFFFFFF) /* Number of good frames transmitted. */ + +/* Bit definition for Ethernet MMC Received Frames with CRC Error Counter Register */ +#define ETH_MMCRFCECR_RFCEC ((uint32_t)0xFFFFFFFF) /* Number of frames received with CRC error. */ + +/* Bit definition for Ethernet MMC Received Frames with Alignement Error Counter Register */ +#define ETH_MMCRFAECR_RFAEC ((uint32_t)0xFFFFFFFF) /* Number of frames received with alignment (dribble) error */ + +/* Bit definition for Ethernet MMC Received Good Unicast Frames Counter Register */ +#define ETH_MMCRGUFCR_RGUFC ((uint32_t)0xFFFFFFFF) /* Number of good unicast frames received. */ + +/******************************************************************************/ +/* Ethernet PTP Registers bits definition */ +/******************************************************************************/ + +/* Bit definition for Ethernet PTP Time Stamp Contol Register */ +#define ETH_PTPTSCR_TSARU ((uint32_t)0x00000020) /* Addend register update */ +#define ETH_PTPTSCR_TSITE ((uint32_t)0x00000010) /* Time stamp interrupt trigger enable */ +#define ETH_PTPTSCR_TSSTU ((uint32_t)0x00000008) /* Time stamp update */ +#define ETH_PTPTSCR_TSSTI ((uint32_t)0x00000004) /* Time stamp initialize */ +#define ETH_PTPTSCR_TSFCU ((uint32_t)0x00000002) /* Time stamp fine or coarse update */ +#define ETH_PTPTSCR_TSE ((uint32_t)0x00000001) /* Time stamp enable */ + +/* Bit definition for Ethernet PTP Sub-Second Increment Register */ +#define ETH_PTPSSIR_STSSI ((uint32_t)0x000000FF) /* System time Sub-second increment value */ + +/* Bit definition for Ethernet PTP Time Stamp High Register */ +#define ETH_PTPTSHR_STS ((uint32_t)0xFFFFFFFF) /* System Time second */ + +/* Bit definition for Ethernet PTP Time Stamp Low Register */ +#define ETH_PTPTSLR_STPNS ((uint32_t)0x80000000) /* System Time Positive or negative time */ +#define ETH_PTPTSLR_STSS ((uint32_t)0x7FFFFFFF) /* System Time sub-seconds */ + +/* Bit definition for Ethernet PTP Time Stamp High Update Register */ +#define ETH_PTPTSHUR_TSUS ((uint32_t)0xFFFFFFFF) /* Time stamp update seconds */ + +/* Bit definition for Ethernet PTP Time Stamp Low Update Register */ +#define ETH_PTPTSLUR_TSUPNS ((uint32_t)0x80000000) /* Time stamp update Positive or negative time */ +#define ETH_PTPTSLUR_TSUSS ((uint32_t)0x7FFFFFFF) /* Time stamp update sub-seconds */ + +/* Bit definition for Ethernet PTP Time Stamp Addend Register */ +#define ETH_PTPTSAR_TSA ((uint32_t)0xFFFFFFFF) /* Time stamp addend */ + +/* Bit definition for Ethernet PTP Target Time High Register */ +#define ETH_PTPTTHR_TTSH ((uint32_t)0xFFFFFFFF) /* Target time stamp high */ + +/* Bit definition for Ethernet PTP Target Time Low Register */ +#define ETH_PTPTTLR_TTSL ((uint32_t)0xFFFFFFFF) /* Target time stamp low */ + +/******************************************************************************/ +/* Ethernet DMA Registers bits definition */ +/******************************************************************************/ + +/* Bit definition for Ethernet DMA Bus Mode Register */ +#define ETH_DMABMR_AAB ((uint32_t)0x02000000) /* Address-Aligned beats */ +#define ETH_DMABMR_FPM ((uint32_t)0x01000000) /* 4xPBL mode */ +#define ETH_DMABMR_USP ((uint32_t)0x00800000) /* Use separate PBL */ +#define ETH_DMABMR_RDP ((uint32_t)0x007E0000) /* RxDMA PBL */ + #define ETH_DMABMR_RDP_1Beat ((uint32_t)0x00020000) /* maximum number of beats to be transferred in one RxDMA transaction is 1 */ + #define ETH_DMABMR_RDP_2Beat ((uint32_t)0x00040000) /* maximum number of beats to be transferred in one RxDMA transaction is 2 */ + #define ETH_DMABMR_RDP_4Beat ((uint32_t)0x00080000) /* maximum number of beats to be transferred in one RxDMA transaction is 4 */ + #define ETH_DMABMR_RDP_8Beat ((uint32_t)0x00100000) /* maximum number of beats to be transferred in one RxDMA transaction is 8 */ + #define ETH_DMABMR_RDP_16Beat ((uint32_t)0x00200000) /* maximum number of beats to be transferred in one RxDMA transaction is 16 */ + #define ETH_DMABMR_RDP_32Beat ((uint32_t)0x00400000) /* maximum number of beats to be transferred in one RxDMA transaction is 32 */ + #define ETH_DMABMR_RDP_4xPBL_4Beat ((uint32_t)0x01020000) /* maximum number of beats to be transferred in one RxDMA transaction is 4 */ + #define ETH_DMABMR_RDP_4xPBL_8Beat ((uint32_t)0x01040000) /* maximum number of beats to be transferred in one RxDMA transaction is 8 */ + #define ETH_DMABMR_RDP_4xPBL_16Beat ((uint32_t)0x01080000) /* maximum number of beats to be transferred in one RxDMA transaction is 16 */ + #define ETH_DMABMR_RDP_4xPBL_32Beat ((uint32_t)0x01100000) /* maximum number of beats to be transferred in one RxDMA transaction is 32 */ + #define ETH_DMABMR_RDP_4xPBL_64Beat ((uint32_t)0x01200000) /* maximum number of beats to be transferred in one RxDMA transaction is 64 */ + #define ETH_DMABMR_RDP_4xPBL_128Beat ((uint32_t)0x01400000) /* maximum number of beats to be transferred in one RxDMA transaction is 128 */ +#define ETH_DMABMR_FB ((uint32_t)0x00010000) /* Fixed Burst */ +#define ETH_DMABMR_RTPR ((uint32_t)0x0000C000) /* Rx Tx priority ratio */ + #define ETH_DMABMR_RTPR_1_1 ((uint32_t)0x00000000) /* Rx Tx priority ratio */ + #define ETH_DMABMR_RTPR_2_1 ((uint32_t)0x00004000) /* Rx Tx priority ratio */ + #define ETH_DMABMR_RTPR_3_1 ((uint32_t)0x00008000) /* Rx Tx priority ratio */ + #define ETH_DMABMR_RTPR_4_1 ((uint32_t)0x0000C000) /* Rx Tx priority ratio */ +#define ETH_DMABMR_PBL ((uint32_t)0x00003F00) /* Programmable burst length */ + #define ETH_DMABMR_PBL_1Beat ((uint32_t)0x00000100) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 1 */ + #define ETH_DMABMR_PBL_2Beat ((uint32_t)0x00000200) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 2 */ + #define ETH_DMABMR_PBL_4Beat ((uint32_t)0x00000400) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 4 */ + #define ETH_DMABMR_PBL_8Beat ((uint32_t)0x00000800) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 8 */ + #define ETH_DMABMR_PBL_16Beat ((uint32_t)0x00001000) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 16 */ + #define ETH_DMABMR_PBL_32Beat ((uint32_t)0x00002000) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 32 */ + #define ETH_DMABMR_PBL_4xPBL_4Beat ((uint32_t)0x01000100) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 4 */ + #define ETH_DMABMR_PBL_4xPBL_8Beat ((uint32_t)0x01000200) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 8 */ + #define ETH_DMABMR_PBL_4xPBL_16Beat ((uint32_t)0x01000400) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 16 */ + #define ETH_DMABMR_PBL_4xPBL_32Beat ((uint32_t)0x01000800) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 32 */ + #define ETH_DMABMR_PBL_4xPBL_64Beat ((uint32_t)0x01001000) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 64 */ + #define ETH_DMABMR_PBL_4xPBL_128Beat ((uint32_t)0x01002000) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 128 */ +#define ETH_DMABMR_DSL ((uint32_t)0x0000007C) /* Descriptor Skip Length */ +#define ETH_DMABMR_DA ((uint32_t)0x00000002) /* DMA arbitration scheme */ +#define ETH_DMABMR_SR ((uint32_t)0x00000001) /* Software reset */ + +/* Bit definition for Ethernet DMA Transmit Poll Demand Register */ +#define ETH_DMATPDR_TPD ((uint32_t)0xFFFFFFFF) /* Transmit poll demand */ + +/* Bit definition for Ethernet DMA Receive Poll Demand Register */ +#define ETH_DMARPDR_RPD ((uint32_t)0xFFFFFFFF) /* Receive poll demand */ + +/* Bit definition for Ethernet DMA Receive Descriptor List Address Register */ +#define ETH_DMARDLAR_SRL ((uint32_t)0xFFFFFFFF) /* Start of receive list */ + +/* Bit definition for Ethernet DMA Transmit Descriptor List Address Register */ +#define ETH_DMATDLAR_STL ((uint32_t)0xFFFFFFFF) /* Start of transmit list */ + +/* Bit definition for Ethernet DMA Status Register */ +#define ETH_DMASR_TSTS ((uint32_t)0x20000000) /* Time-stamp trigger status */ +#define ETH_DMASR_PMTS ((uint32_t)0x10000000) /* PMT status */ +#define ETH_DMASR_MMCS ((uint32_t)0x08000000) /* MMC status */ +#define ETH_DMASR_EBS ((uint32_t)0x03800000) /* Error bits status */ + /* combination with EBS[2:0] for GetFlagStatus function */ + #define ETH_DMASR_EBS_DescAccess ((uint32_t)0x02000000) /* Error bits 0-data buffer, 1-desc. access */ + #define ETH_DMASR_EBS_ReadTransf ((uint32_t)0x01000000) /* Error bits 0-write trnsf, 1-read transfr */ + #define ETH_DMASR_EBS_DataTransfTx ((uint32_t)0x00800000) /* Error bits 0-Rx DMA, 1-Tx DMA */ +#define ETH_DMASR_TPS ((uint32_t)0x00700000) /* Transmit process state */ + #define ETH_DMASR_TPS_Stopped ((uint32_t)0x00000000) /* Stopped - Reset or Stop Tx Command issued */ + #define ETH_DMASR_TPS_Fetching ((uint32_t)0x00100000) /* Running - fetching the Tx descriptor */ + #define ETH_DMASR_TPS_Waiting ((uint32_t)0x00200000) /* Running - waiting for status */ + #define ETH_DMASR_TPS_Reading ((uint32_t)0x00300000) /* Running - reading the data from host memory */ + #define ETH_DMASR_TPS_Suspended ((uint32_t)0x00600000) /* Suspended - Tx Descriptor unavailabe */ + #define ETH_DMASR_TPS_Closing ((uint32_t)0x00700000) /* Running - closing Rx descriptor */ +#define ETH_DMASR_RPS ((uint32_t)0x000E0000) /* Receive process state */ + #define ETH_DMASR_RPS_Stopped ((uint32_t)0x00000000) /* Stopped - Reset or Stop Rx Command issued */ + #define ETH_DMASR_RPS_Fetching ((uint32_t)0x00020000) /* Running - fetching the Rx descriptor */ + #define ETH_DMASR_RPS_Waiting ((uint32_t)0x00060000) /* Running - waiting for packet */ + #define ETH_DMASR_RPS_Suspended ((uint32_t)0x00080000) /* Suspended - Rx Descriptor unavailable */ + #define ETH_DMASR_RPS_Closing ((uint32_t)0x000A0000) /* Running - closing descriptor */ + #define ETH_DMASR_RPS_Queuing ((uint32_t)0x000E0000) /* Running - queuing the recieve frame into host memory */ +#define ETH_DMASR_NIS ((uint32_t)0x00010000) /* Normal interrupt summary */ +#define ETH_DMASR_AIS ((uint32_t)0x00008000) /* Abnormal interrupt summary */ +#define ETH_DMASR_ERS ((uint32_t)0x00004000) /* Early receive status */ +#define ETH_DMASR_FBES ((uint32_t)0x00002000) /* Fatal bus error status */ +#define ETH_DMASR_ETS ((uint32_t)0x00000400) /* Early transmit status */ +#define ETH_DMASR_RWTS ((uint32_t)0x00000200) /* Receive watchdog timeout status */ +#define ETH_DMASR_RPSS ((uint32_t)0x00000100) /* Receive process stopped status */ +#define ETH_DMASR_RBUS ((uint32_t)0x00000080) /* Receive buffer unavailable status */ +#define ETH_DMASR_RS ((uint32_t)0x00000040) /* Receive status */ +#define ETH_DMASR_TUS ((uint32_t)0x00000020) /* Transmit underflow status */ +#define ETH_DMASR_ROS ((uint32_t)0x00000010) /* Receive overflow status */ +#define ETH_DMASR_TJTS ((uint32_t)0x00000008) /* Transmit jabber timeout status */ +#define ETH_DMASR_TBUS ((uint32_t)0x00000004) /* Transmit buffer unavailable status */ +#define ETH_DMASR_TPSS ((uint32_t)0x00000002) /* Transmit process stopped status */ +#define ETH_DMASR_TS ((uint32_t)0x00000001) /* Transmit status */ + +/* Bit definition for Ethernet DMA Operation Mode Register */ +#define ETH_DMAOMR_DTCEFD ((uint32_t)0x04000000) /* Disable Dropping of TCP/IP checksum error frames */ +#define ETH_DMAOMR_RSF ((uint32_t)0x02000000) /* Receive store and forward */ +#define ETH_DMAOMR_DFRF ((uint32_t)0x01000000) /* Disable flushing of received frames */ +#define ETH_DMAOMR_TSF ((uint32_t)0x00200000) /* Transmit store and forward */ +#define ETH_DMAOMR_FTF ((uint32_t)0x00100000) /* Flush transmit FIFO */ +#define ETH_DMAOMR_TTC ((uint32_t)0x0001C000) /* Transmit threshold control */ + #define ETH_DMAOMR_TTC_64Bytes ((uint32_t)0x00000000) /* threshold level of the MTL Transmit FIFO is 64 Bytes */ + #define ETH_DMAOMR_TTC_128Bytes ((uint32_t)0x00004000) /* threshold level of the MTL Transmit FIFO is 128 Bytes */ + #define ETH_DMAOMR_TTC_192Bytes ((uint32_t)0x00008000) /* threshold level of the MTL Transmit FIFO is 192 Bytes */ + #define ETH_DMAOMR_TTC_256Bytes ((uint32_t)0x0000C000) /* threshold level of the MTL Transmit FIFO is 256 Bytes */ + #define ETH_DMAOMR_TTC_40Bytes ((uint32_t)0x00010000) /* threshold level of the MTL Transmit FIFO is 40 Bytes */ + #define ETH_DMAOMR_TTC_32Bytes ((uint32_t)0x00014000) /* threshold level of the MTL Transmit FIFO is 32 Bytes */ + #define ETH_DMAOMR_TTC_24Bytes ((uint32_t)0x00018000) /* threshold level of the MTL Transmit FIFO is 24 Bytes */ + #define ETH_DMAOMR_TTC_16Bytes ((uint32_t)0x0001C000) /* threshold level of the MTL Transmit FIFO is 16 Bytes */ +#define ETH_DMAOMR_ST ((uint32_t)0x00002000) /* Start/stop transmission command */ +#define ETH_DMAOMR_FEF ((uint32_t)0x00000080) /* Forward error frames */ +#define ETH_DMAOMR_FUGF ((uint32_t)0x00000040) /* Forward undersized good frames */ +#define ETH_DMAOMR_RTC ((uint32_t)0x00000018) /* receive threshold control */ + #define ETH_DMAOMR_RTC_64Bytes ((uint32_t)0x00000000) /* threshold level of the MTL Receive FIFO is 64 Bytes */ + #define ETH_DMAOMR_RTC_32Bytes ((uint32_t)0x00000008) /* threshold level of the MTL Receive FIFO is 32 Bytes */ + #define ETH_DMAOMR_RTC_96Bytes ((uint32_t)0x00000010) /* threshold level of the MTL Receive FIFO is 96 Bytes */ + #define ETH_DMAOMR_RTC_128Bytes ((uint32_t)0x00000018) /* threshold level of the MTL Receive FIFO is 128 Bytes */ +#define ETH_DMAOMR_OSF ((uint32_t)0x00000004) /* operate on second frame */ +#define ETH_DMAOMR_SR ((uint32_t)0x00000002) /* Start/stop receive */ + +/* Bit definition for Ethernet DMA Interrupt Enable Register */ +#define ETH_DMAIER_NISE ((uint32_t)0x00010000) /* Normal interrupt summary enable */ +#define ETH_DMAIER_AISE ((uint32_t)0x00008000) /* Abnormal interrupt summary enable */ +#define ETH_DMAIER_ERIE ((uint32_t)0x00004000) /* Early receive interrupt enable */ +#define ETH_DMAIER_FBEIE ((uint32_t)0x00002000) /* Fatal bus error interrupt enable */ +#define ETH_DMAIER_ETIE ((uint32_t)0x00000400) /* Early transmit interrupt enable */ +#define ETH_DMAIER_RWTIE ((uint32_t)0x00000200) /* Receive watchdog timeout interrupt enable */ +#define ETH_DMAIER_RPSIE ((uint32_t)0x00000100) /* Receive process stopped interrupt enable */ +#define ETH_DMAIER_RBUIE ((uint32_t)0x00000080) /* Receive buffer unavailable interrupt enable */ +#define ETH_DMAIER_RIE ((uint32_t)0x00000040) /* Receive interrupt enable */ +#define ETH_DMAIER_TUIE ((uint32_t)0x00000020) /* Transmit Underflow interrupt enable */ +#define ETH_DMAIER_ROIE ((uint32_t)0x00000010) /* Receive Overflow interrupt enable */ +#define ETH_DMAIER_TJTIE ((uint32_t)0x00000008) /* Transmit jabber timeout interrupt enable */ +#define ETH_DMAIER_TBUIE ((uint32_t)0x00000004) /* Transmit buffer unavailable interrupt enable */ +#define ETH_DMAIER_TPSIE ((uint32_t)0x00000002) /* Transmit process stopped interrupt enable */ +#define ETH_DMAIER_TIE ((uint32_t)0x00000001) /* Transmit interrupt enable */ + +/* Bit definition for Ethernet DMA Missed Frame and Buffer Overflow Counter Register */ +#define ETH_DMAMFBOCR_OFOC ((uint32_t)0x10000000) /* Overflow bit for FIFO overflow counter */ +#define ETH_DMAMFBOCR_MFA ((uint32_t)0x0FFE0000) /* Number of frames missed by the application */ +#define ETH_DMAMFBOCR_OMFC ((uint32_t)0x00010000) /* Overflow bit for missed frame counter */ +#define ETH_DMAMFBOCR_MFC ((uint32_t)0x0000FFFF) /* Number of frames missed by the controller */ + +/* Bit definition for Ethernet DMA Current Host Transmit Descriptor Register */ +#define ETH_DMACHTDR_HTDAP ((uint32_t)0xFFFFFFFF) /* Host transmit descriptor address pointer */ + +/* Bit definition for Ethernet DMA Current Host Receive Descriptor Register */ +#define ETH_DMACHRDR_HRDAP ((uint32_t)0xFFFFFFFF) /* Host receive descriptor address pointer */ + +/* Bit definition for Ethernet DMA Current Host Transmit Buffer Address Register */ +#define ETH_DMACHTBAR_HTBAP ((uint32_t)0xFFFFFFFF) /* Host transmit buffer address pointer */ + +/* Bit definition for Ethernet DMA Current Host Receive Buffer Address Register */ +#define ETH_DMACHRBAR_HRBAP ((uint32_t)0xFFFFFFFF) /* Host receive buffer address pointer */ +#endif /* STM32F10X_CL */ + +/** + * @} + */ + + /** + * @} + */ + +#ifdef USE_STDPERIPH_DRIVER + #include "stm32f10x_conf.h" +#endif + +/** @addtogroup Exported_macro + * @{ + */ + +#define SET_BIT(REG, BIT) ((REG) |= (BIT)) + +#define CLEAR_BIT(REG, BIT) ((REG) &= ~(BIT)) + +#define READ_BIT(REG, BIT) ((REG) & (BIT)) + +#define CLEAR_REG(REG) ((REG) = (0x0)) + +#define WRITE_REG(REG, VAL) ((REG) = (VAL)) + +#define READ_REG(REG) ((REG)) + +#define MODIFY_REG(REG, CLEARMASK, SETMASK) WRITE_REG((REG), (((READ_REG(REG)) & (~(CLEARMASK))) | (SETMASK))) + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F10x_H */ + +/** + * @} + */ + + /** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/system_stm32f10x.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/system_stm32f10x.c new file mode 100644 index 0000000..6fb4579 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/system_stm32f10x.c @@ -0,0 +1,1094 @@ +/** + ****************************************************************************** + * @file system_stm32f10x.c + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief CMSIS Cortex-M3 Device Peripheral Access Layer System Source File. + * + * 1. This file provides two functions and one global variable to be called from + * user application: + * - SystemInit(): Setups the system clock (System clock source, PLL Multiplier + * factors, AHB/APBx prescalers and Flash settings). + * This function is called at startup just after reset and + * before branch to main program. This call is made inside + * the "startup_stm32f10x_xx.s" file. + * + * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used + * by the user application to setup the SysTick + * timer or configure other parameters. + * + * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must + * be called whenever the core clock is changed + * during program execution. + * + * 2. After each device reset the HSI (8 MHz) is used as system clock source. + * Then SystemInit() function is called, in "startup_stm32f10x_xx.s" file, to + * configure the system clock before to branch to main program. + * + * 3. If the system clock source selected by user fails to startup, the SystemInit() + * function will do nothing and HSI still used as system clock source. User can + * add some code to deal with this issue inside the SetSysClock() function. + * + * 4. The default value of HSE crystal is set to 8 MHz (or 25 MHz, depedning on + * the product used), refer to "HSE_VALUE" define in "stm32f10x.h" file. + * When HSE is used as system clock source, directly or through PLL, and you + * are using different crystal you have to adapt the HSE value to your own + * configuration. + * + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f10x_system + * @{ + */ + +/** @addtogroup STM32F10x_System_Private_Includes + * @{ + */ + +#include "stm32f10x.h" + +/** + * @} + */ + +/** @addtogroup STM32F10x_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F10x_System_Private_Defines + * @{ + */ + +/*!< Uncomment the line corresponding to the desired System clock (SYSCLK) + frequency (after reset the HSI is used as SYSCLK source) + + IMPORTANT NOTE: + ============== + 1. After each device reset the HSI is used as System clock source. + + 2. Please make sure that the selected System clock doesn't exceed your device's + maximum frequency. + + 3. If none of the define below is enabled, the HSI is used as System clock + source. + + 4. The System clock configuration functions provided within this file assume that: + - For Low, Medium and High density Value line devices an external 8MHz + crystal is used to drive the System clock. + - For Low, Medium and High density devices an external 8MHz crystal is + used to drive the System clock. + - For Connectivity line devices an external 25MHz crystal is used to drive + the System clock. + If you are using different crystal you have to adapt those functions accordingly. + */ + +#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL) +/* #define SYSCLK_FREQ_HSE HSE_VALUE */ + #define SYSCLK_FREQ_24MHz 24000000 +#else +/* #define SYSCLK_FREQ_HSE HSE_VALUE */ +/* #define SYSCLK_FREQ_24MHz 24000000 */ +/* #define SYSCLK_FREQ_36MHz 36000000 */ +/* #define SYSCLK_FREQ_48MHz 48000000 */ +/* #define SYSCLK_FREQ_56MHz 56000000 */ +#define SYSCLK_FREQ_72MHz 72000000 +#endif + +/*!< Uncomment the following line if you need to use external SRAM mounted + on STM3210E-EVAL board (STM32 High density and XL-density devices) or on + STM32100E-EVAL board (STM32 High-density value line devices) as data memory */ +#if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (defined STM32F10X_HD_VL) +/* #define DATA_IN_ExtSRAM */ +#endif + +/*!< Uncomment the following line if you need to relocate your vector Table in + Internal SRAM. */ +/* #define VECT_TAB_SRAM */ +#define VECT_TAB_OFFSET 0x0 /*!< Vector Table base offset field. + This value must be a multiple of 0x200. */ + + +/** + * @} + */ + +/** @addtogroup STM32F10x_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F10x_System_Private_Variables + * @{ + */ + +/******************************************************************************* +* Clock Definitions +*******************************************************************************/ +#ifdef SYSCLK_FREQ_HSE + uint32_t SystemCoreClock = SYSCLK_FREQ_HSE; /*!< System Clock Frequency (Core Clock) */ +#elif defined SYSCLK_FREQ_24MHz + uint32_t SystemCoreClock = SYSCLK_FREQ_24MHz; /*!< System Clock Frequency (Core Clock) */ +#elif defined SYSCLK_FREQ_36MHz + uint32_t SystemCoreClock = SYSCLK_FREQ_36MHz; /*!< System Clock Frequency (Core Clock) */ +#elif defined SYSCLK_FREQ_48MHz + uint32_t SystemCoreClock = SYSCLK_FREQ_48MHz; /*!< System Clock Frequency (Core Clock) */ +#elif defined SYSCLK_FREQ_56MHz + uint32_t SystemCoreClock = SYSCLK_FREQ_56MHz; /*!< System Clock Frequency (Core Clock) */ +#elif defined SYSCLK_FREQ_72MHz + uint32_t SystemCoreClock = SYSCLK_FREQ_72MHz; /*!< System Clock Frequency (Core Clock) */ +#else /*!< HSI Selected as System Clock source */ + uint32_t SystemCoreClock = HSI_VALUE; /*!< System Clock Frequency (Core Clock) */ +#endif + +__I uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; +/** + * @} + */ + +/** @addtogroup STM32F10x_System_Private_FunctionPrototypes + * @{ + */ + +static void SetSysClock(void); + +#ifdef SYSCLK_FREQ_HSE + static void SetSysClockToHSE(void); +#elif defined SYSCLK_FREQ_24MHz + static void SetSysClockTo24(void); +#elif defined SYSCLK_FREQ_36MHz + static void SetSysClockTo36(void); +#elif defined SYSCLK_FREQ_48MHz + static void SetSysClockTo48(void); +#elif defined SYSCLK_FREQ_56MHz + static void SetSysClockTo56(void); +#elif defined SYSCLK_FREQ_72MHz + static void SetSysClockTo72(void); +#endif + +#ifdef DATA_IN_ExtSRAM + static void SystemInit_ExtMemCtl(void); +#endif /* DATA_IN_ExtSRAM */ + +/** + * @} + */ + +/** @addtogroup STM32F10x_System_Private_Functions + * @{ + */ + +/** + * @brief Setup the microcontroller system + * Initialize the Embedded Flash Interface, the PLL and update the + * SystemCoreClock variable. + * @note This function should be used only after reset. + * @param None + * @retval None + */ +void SystemInit (void) +{ + /* Reset the RCC clock configuration to the default reset state(for debug purpose) */ + /* Set HSION bit */ + RCC->CR |= (uint32_t)0x00000001; + + /* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */ +#ifndef STM32F10X_CL + RCC->CFGR &= (uint32_t)0xF8FF0000; +#else + RCC->CFGR &= (uint32_t)0xF0FF0000; +#endif /* STM32F10X_CL */ + + /* Reset HSEON, CSSON and PLLON bits */ + RCC->CR &= (uint32_t)0xFEF6FFFF; + + /* Reset HSEBYP bit */ + RCC->CR &= (uint32_t)0xFFFBFFFF; + + /* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */ + RCC->CFGR &= (uint32_t)0xFF80FFFF; + +#ifdef STM32F10X_CL + /* Reset PLL2ON and PLL3ON bits */ + RCC->CR &= (uint32_t)0xEBFFFFFF; + + /* Disable all interrupts and clear pending bits */ + RCC->CIR = 0x00FF0000; + + /* Reset CFGR2 register */ + RCC->CFGR2 = 0x00000000; +#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || (defined STM32F10X_HD_VL) + /* Disable all interrupts and clear pending bits */ + RCC->CIR = 0x009F0000; + + /* Reset CFGR2 register */ + RCC->CFGR2 = 0x00000000; +#else + /* Disable all interrupts and clear pending bits */ + RCC->CIR = 0x009F0000; +#endif /* STM32F10X_CL */ + +#if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (defined STM32F10X_HD_VL) + #ifdef DATA_IN_ExtSRAM + SystemInit_ExtMemCtl(); + #endif /* DATA_IN_ExtSRAM */ +#endif + + /* Configure the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers */ + /* Configure the Flash Latency cycles and enable prefetch buffer */ + SetSysClock(); + +#ifdef VECT_TAB_SRAM + SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */ +#else + SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */ +#endif +} + +/** + * @brief Update SystemCoreClock variable according to Clock Register Values. + * The SystemCoreClock variable contains the core clock (HCLK), it can + * be used by the user application to setup the SysTick timer or configure + * other parameters. + * + * @note Each time the core clock (HCLK) changes, this function must be called + * to update SystemCoreClock variable value. Otherwise, any configuration + * based on this variable will be incorrect. + * + * @note - The system frequency computed by this function is not the real + * frequency in the chip. It is calculated based on the predefined + * constant and the selected clock source: + * + * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) + * + * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) + * + * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) + * or HSI_VALUE(*) multiplied by the PLL factors. + * + * (*) HSI_VALUE is a constant defined in stm32f1xx.h file (default value + * 8 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * + * (**) HSE_VALUE is a constant defined in stm32f1xx.h file (default value + * 8 MHz or 25 MHz, depedning on the product used), user has to ensure + * that HSE_VALUE is same as the real frequency of the crystal used. + * Otherwise, this function may have wrong result. + * + * - The result of this function could be not correct when using fractional + * value for HSE crystal. + * @param None + * @retval None + */ +void SystemCoreClockUpdate (void) +{ + uint32_t tmp = 0, pllmull = 0, pllsource = 0; + +#ifdef STM32F10X_CL + uint32_t prediv1source = 0, prediv1factor = 0, prediv2factor = 0, pll2mull = 0; +#endif /* STM32F10X_CL */ + +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || (defined STM32F10X_HD_VL) + uint32_t prediv1factor = 0; +#endif /* STM32F10X_LD_VL or STM32F10X_MD_VL or STM32F10X_HD_VL */ + + /* Get SYSCLK source -------------------------------------------------------*/ + tmp = RCC->CFGR & RCC_CFGR_SWS; + + switch (tmp) + { + case 0x00: /* HSI used as system clock */ + SystemCoreClock = HSI_VALUE; + break; + case 0x04: /* HSE used as system clock */ + SystemCoreClock = HSE_VALUE; + break; + case 0x08: /* PLL used as system clock */ + + /* Get PLL clock source and multiplication factor ----------------------*/ + pllmull = RCC->CFGR & RCC_CFGR_PLLMULL; + pllsource = RCC->CFGR & RCC_CFGR_PLLSRC; + +#ifndef STM32F10X_CL + pllmull = ( pllmull >> 18) + 2; + + if (pllsource == 0x00) + { + /* HSI oscillator clock divided by 2 selected as PLL clock entry */ + SystemCoreClock = (HSI_VALUE >> 1) * pllmull; + } + else + { + #if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || (defined STM32F10X_HD_VL) + prediv1factor = (RCC->CFGR2 & RCC_CFGR2_PREDIV1) + 1; + /* HSE oscillator clock selected as PREDIV1 clock entry */ + SystemCoreClock = (HSE_VALUE / prediv1factor) * pllmull; + #else + /* HSE selected as PLL clock entry */ + if ((RCC->CFGR & RCC_CFGR_PLLXTPRE) != (uint32_t)RESET) + {/* HSE oscillator clock divided by 2 */ + SystemCoreClock = (HSE_VALUE >> 1) * pllmull; + } + else + { + SystemCoreClock = HSE_VALUE * pllmull; + } + #endif + } +#else + pllmull = pllmull >> 18; + + if (pllmull != 0x0D) + { + pllmull += 2; + } + else + { /* PLL multiplication factor = PLL input clock * 6.5 */ + pllmull = 13 / 2; + } + + if (pllsource == 0x00) + { + /* HSI oscillator clock divided by 2 selected as PLL clock entry */ + SystemCoreClock = (HSI_VALUE >> 1) * pllmull; + } + else + {/* PREDIV1 selected as PLL clock entry */ + + /* Get PREDIV1 clock source and division factor */ + prediv1source = RCC->CFGR2 & RCC_CFGR2_PREDIV1SRC; + prediv1factor = (RCC->CFGR2 & RCC_CFGR2_PREDIV1) + 1; + + if (prediv1source == 0) + { + /* HSE oscillator clock selected as PREDIV1 clock entry */ + SystemCoreClock = (HSE_VALUE / prediv1factor) * pllmull; + } + else + {/* PLL2 clock selected as PREDIV1 clock entry */ + + /* Get PREDIV2 division factor and PLL2 multiplication factor */ + prediv2factor = ((RCC->CFGR2 & RCC_CFGR2_PREDIV2) >> 4) + 1; + pll2mull = ((RCC->CFGR2 & RCC_CFGR2_PLL2MUL) >> 8 ) + 2; + SystemCoreClock = (((HSE_VALUE / prediv2factor) * pll2mull) / prediv1factor) * pllmull; + } + } +#endif /* STM32F10X_CL */ + break; + + default: + SystemCoreClock = HSI_VALUE; + break; + } + + /* Compute HCLK clock frequency ----------------*/ + /* Get HCLK prescaler */ + tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; + /* HCLK clock frequency */ + SystemCoreClock >>= tmp; +} + +/** + * @brief Configures the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers. + * @param None + * @retval None + */ +static void SetSysClock(void) +{ +#ifdef SYSCLK_FREQ_HSE + SetSysClockToHSE(); +#elif defined SYSCLK_FREQ_24MHz + SetSysClockTo24(); +#elif defined SYSCLK_FREQ_36MHz + SetSysClockTo36(); +#elif defined SYSCLK_FREQ_48MHz + SetSysClockTo48(); +#elif defined SYSCLK_FREQ_56MHz + SetSysClockTo56(); +#elif defined SYSCLK_FREQ_72MHz + SetSysClockTo72(); +#endif + + /* If none of the define above is enabled, the HSI is used as System clock + source (default after reset) */ +} + +/** + * @brief Setup the external memory controller. Called in startup_stm32f10x.s + * before jump to __main + * @param None + * @retval None + */ +#ifdef DATA_IN_ExtSRAM +/** + * @brief Setup the external memory controller. + * Called in startup_stm32f10x_xx.s/.c before jump to main. + * This function configures the external SRAM mounted on STM3210E-EVAL + * board (STM32 High density devices). This SRAM will be used as program + * data memory (including heap and stack). + * @param None + * @retval None + */ +void SystemInit_ExtMemCtl(void) +{ +/*!< FSMC Bank1 NOR/SRAM3 is used for the STM3210E-EVAL, if another Bank is + required, then adjust the Register Addresses */ + + /* Enable FSMC clock */ + RCC->AHBENR = 0x00000114; + + /* Enable GPIOD, GPIOE, GPIOF and GPIOG clocks */ + RCC->APB2ENR = 0x000001E0; + +/* --------------- SRAM Data lines, NOE and NWE configuration ---------------*/ +/*---------------- SRAM Address lines configuration -------------------------*/ +/*---------------- NOE and NWE configuration --------------------------------*/ +/*---------------- NE3 configuration ----------------------------------------*/ +/*---------------- NBL0, NBL1 configuration ---------------------------------*/ + + GPIOD->CRL = 0x44BB44BB; + GPIOD->CRH = 0xBBBBBBBB; + + GPIOE->CRL = 0xB44444BB; + GPIOE->CRH = 0xBBBBBBBB; + + GPIOF->CRL = 0x44BBBBBB; + GPIOF->CRH = 0xBBBB4444; + + GPIOG->CRL = 0x44BBBBBB; + GPIOG->CRH = 0x44444B44; + +/*---------------- FSMC Configuration ---------------------------------------*/ +/*---------------- Enable FSMC Bank1_SRAM Bank ------------------------------*/ + + FSMC_Bank1->BTCR[4] = 0x00001011; + FSMC_Bank1->BTCR[5] = 0x00000200; +} +#endif /* DATA_IN_ExtSRAM */ + +#ifdef SYSCLK_FREQ_HSE +/** + * @brief Selects HSE as System clock source and configure HCLK, PCLK2 + * and PCLK1 prescalers. + * @note This function should be used only after reset. + * @param None + * @retval None + */ +static void SetSysClockToHSE(void) +{ + __IO uint32_t StartUpCounter = 0, HSEStatus = 0; + + /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/ + /* Enable HSE */ + RCC->CR |= ((uint32_t)RCC_CR_HSEON); + + /* Wait till HSE is ready and if Time out is reached exit */ + do + { + HSEStatus = RCC->CR & RCC_CR_HSERDY; + StartUpCounter++; + } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); + + if ((RCC->CR & RCC_CR_HSERDY) != RESET) + { + HSEStatus = (uint32_t)0x01; + } + else + { + HSEStatus = (uint32_t)0x00; + } + + if (HSEStatus == (uint32_t)0x01) + { + +#if !defined STM32F10X_LD_VL && !defined STM32F10X_MD_VL && !defined STM32F10X_HD_VL + /* Enable Prefetch Buffer */ + FLASH->ACR |= FLASH_ACR_PRFTBE; + + /* Flash 0 wait state */ + FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY); + +#ifndef STM32F10X_CL + FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_0; +#else + if (HSE_VALUE <= 24000000) + { + FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_0; + } + else + { + FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_1; + } +#endif /* STM32F10X_CL */ +#endif + + /* HCLK = SYSCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; + + /* PCLK2 = HCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; + + /* PCLK1 = HCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV1; + + /* Select HSE as system clock source */ + RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); + RCC->CFGR |= (uint32_t)RCC_CFGR_SW_HSE; + + /* Wait till HSE is used as system clock source */ + while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x04) + { + } + } + else + { /* If HSE fails to start-up, the application will have wrong clock + configuration. User can add here some code to deal with this error */ + } +} +#elif defined SYSCLK_FREQ_24MHz +/** + * @brief Sets System clock frequency to 24MHz and configure HCLK, PCLK2 + * and PCLK1 prescalers. + * @note This function should be used only after reset. + * @param None + * @retval None + */ +static void SetSysClockTo24(void) +{ + __IO uint32_t StartUpCounter = 0, HSEStatus = 0; + + /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/ + /* Enable HSE */ + RCC->CR |= ((uint32_t)RCC_CR_HSEON); + + /* Wait till HSE is ready and if Time out is reached exit */ + do + { + HSEStatus = RCC->CR & RCC_CR_HSERDY; + StartUpCounter++; + } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); + + if ((RCC->CR & RCC_CR_HSERDY) != RESET) + { + HSEStatus = (uint32_t)0x01; + } + else + { + HSEStatus = (uint32_t)0x00; + } + + if (HSEStatus == (uint32_t)0x01) + { +#if !defined STM32F10X_LD_VL && !defined STM32F10X_MD_VL && !defined STM32F10X_HD_VL + /* Enable Prefetch Buffer */ + FLASH->ACR |= FLASH_ACR_PRFTBE; + + /* Flash 0 wait state */ + FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY); + FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_0; +#endif + + /* HCLK = SYSCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; + + /* PCLK2 = HCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; + + /* PCLK1 = HCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV1; + +#ifdef STM32F10X_CL + /* Configure PLLs ------------------------------------------------------*/ + /* PLL configuration: PLLCLK = PREDIV1 * 6 = 24 MHz */ + RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL); + RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | + RCC_CFGR_PLLMULL6); + + /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */ + /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 10 = 4 MHz */ + RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL | + RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC); + RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 | + RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV10); + + /* Enable PLL2 */ + RCC->CR |= RCC_CR_PLL2ON; + /* Wait till PLL2 is ready */ + while((RCC->CR & RCC_CR_PLL2RDY) == 0) + { + } +#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) + /* PLL configuration: = (HSE / 2) * 6 = 24 MHz */ + RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL)); + RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1_Div2 | RCC_CFGR_PLLMULL6); +#else + /* PLL configuration: = (HSE / 2) * 6 = 24 MHz */ + RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL)); + RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLXTPRE_HSE_Div2 | RCC_CFGR_PLLMULL6); +#endif /* STM32F10X_CL */ + + /* Enable PLL */ + RCC->CR |= RCC_CR_PLLON; + + /* Wait till PLL is ready */ + while((RCC->CR & RCC_CR_PLLRDY) == 0) + { + } + + /* Select PLL as system clock source */ + RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); + RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL; + + /* Wait till PLL is used as system clock source */ + while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08) + { + } + } + else + { /* If HSE fails to start-up, the application will have wrong clock + configuration. User can add here some code to deal with this error */ + } +} +#elif defined SYSCLK_FREQ_36MHz +/** + * @brief Sets System clock frequency to 36MHz and configure HCLK, PCLK2 + * and PCLK1 prescalers. + * @note This function should be used only after reset. + * @param None + * @retval None + */ +static void SetSysClockTo36(void) +{ + __IO uint32_t StartUpCounter = 0, HSEStatus = 0; + + /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/ + /* Enable HSE */ + RCC->CR |= ((uint32_t)RCC_CR_HSEON); + + /* Wait till HSE is ready and if Time out is reached exit */ + do + { + HSEStatus = RCC->CR & RCC_CR_HSERDY; + StartUpCounter++; + } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); + + if ((RCC->CR & RCC_CR_HSERDY) != RESET) + { + HSEStatus = (uint32_t)0x01; + } + else + { + HSEStatus = (uint32_t)0x00; + } + + if (HSEStatus == (uint32_t)0x01) + { + /* Enable Prefetch Buffer */ + FLASH->ACR |= FLASH_ACR_PRFTBE; + + /* Flash 1 wait state */ + FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY); + FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_1; + + /* HCLK = SYSCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; + + /* PCLK2 = HCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; + + /* PCLK1 = HCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV1; + +#ifdef STM32F10X_CL + /* Configure PLLs ------------------------------------------------------*/ + + /* PLL configuration: PLLCLK = PREDIV1 * 9 = 36 MHz */ + RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL); + RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | + RCC_CFGR_PLLMULL9); + + /*!< PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */ + /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 10 = 4 MHz */ + + RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL | + RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC); + RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 | + RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV10); + + /* Enable PLL2 */ + RCC->CR |= RCC_CR_PLL2ON; + /* Wait till PLL2 is ready */ + while((RCC->CR & RCC_CR_PLL2RDY) == 0) + { + } + +#else + /* PLL configuration: PLLCLK = (HSE / 2) * 9 = 36 MHz */ + RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL)); + RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLXTPRE_HSE_Div2 | RCC_CFGR_PLLMULL9); +#endif /* STM32F10X_CL */ + + /* Enable PLL */ + RCC->CR |= RCC_CR_PLLON; + + /* Wait till PLL is ready */ + while((RCC->CR & RCC_CR_PLLRDY) == 0) + { + } + + /* Select PLL as system clock source */ + RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); + RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL; + + /* Wait till PLL is used as system clock source */ + while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08) + { + } + } + else + { /* If HSE fails to start-up, the application will have wrong clock + configuration. User can add here some code to deal with this error */ + } +} +#elif defined SYSCLK_FREQ_48MHz +/** + * @brief Sets System clock frequency to 48MHz and configure HCLK, PCLK2 + * and PCLK1 prescalers. + * @note This function should be used only after reset. + * @param None + * @retval None + */ +static void SetSysClockTo48(void) +{ + __IO uint32_t StartUpCounter = 0, HSEStatus = 0; + + /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/ + /* Enable HSE */ + RCC->CR |= ((uint32_t)RCC_CR_HSEON); + + /* Wait till HSE is ready and if Time out is reached exit */ + do + { + HSEStatus = RCC->CR & RCC_CR_HSERDY; + StartUpCounter++; + } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); + + if ((RCC->CR & RCC_CR_HSERDY) != RESET) + { + HSEStatus = (uint32_t)0x01; + } + else + { + HSEStatus = (uint32_t)0x00; + } + + if (HSEStatus == (uint32_t)0x01) + { + /* Enable Prefetch Buffer */ + FLASH->ACR |= FLASH_ACR_PRFTBE; + + /* Flash 1 wait state */ + FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY); + FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_1; + + /* HCLK = SYSCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; + + /* PCLK2 = HCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; + + /* PCLK1 = HCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2; + +#ifdef STM32F10X_CL + /* Configure PLLs ------------------------------------------------------*/ + /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */ + /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */ + + RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL | + RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC); + RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 | + RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5); + + /* Enable PLL2 */ + RCC->CR |= RCC_CR_PLL2ON; + /* Wait till PLL2 is ready */ + while((RCC->CR & RCC_CR_PLL2RDY) == 0) + { + } + + + /* PLL configuration: PLLCLK = PREDIV1 * 6 = 48 MHz */ + RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL); + RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | + RCC_CFGR_PLLMULL6); +#else + /* PLL configuration: PLLCLK = HSE * 6 = 48 MHz */ + RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL)); + RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL6); +#endif /* STM32F10X_CL */ + + /* Enable PLL */ + RCC->CR |= RCC_CR_PLLON; + + /* Wait till PLL is ready */ + while((RCC->CR & RCC_CR_PLLRDY) == 0) + { + } + + /* Select PLL as system clock source */ + RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); + RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL; + + /* Wait till PLL is used as system clock source */ + while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08) + { + } + } + else + { /* If HSE fails to start-up, the application will have wrong clock + configuration. User can add here some code to deal with this error */ + } +} + +#elif defined SYSCLK_FREQ_56MHz +/** + * @brief Sets System clock frequency to 56MHz and configure HCLK, PCLK2 + * and PCLK1 prescalers. + * @note This function should be used only after reset. + * @param None + * @retval None + */ +static void SetSysClockTo56(void) +{ + __IO uint32_t StartUpCounter = 0, HSEStatus = 0; + + /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/ + /* Enable HSE */ + RCC->CR |= ((uint32_t)RCC_CR_HSEON); + + /* Wait till HSE is ready and if Time out is reached exit */ + do + { + HSEStatus = RCC->CR & RCC_CR_HSERDY; + StartUpCounter++; + } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); + + if ((RCC->CR & RCC_CR_HSERDY) != RESET) + { + HSEStatus = (uint32_t)0x01; + } + else + { + HSEStatus = (uint32_t)0x00; + } + + if (HSEStatus == (uint32_t)0x01) + { + /* Enable Prefetch Buffer */ + FLASH->ACR |= FLASH_ACR_PRFTBE; + + /* Flash 2 wait state */ + FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY); + FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2; + + /* HCLK = SYSCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; + + /* PCLK2 = HCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; + + /* PCLK1 = HCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2; + +#ifdef STM32F10X_CL + /* Configure PLLs ------------------------------------------------------*/ + /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */ + /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */ + + RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL | + RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC); + RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 | + RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5); + + /* Enable PLL2 */ + RCC->CR |= RCC_CR_PLL2ON; + /* Wait till PLL2 is ready */ + while((RCC->CR & RCC_CR_PLL2RDY) == 0) + { + } + + + /* PLL configuration: PLLCLK = PREDIV1 * 7 = 56 MHz */ + RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL); + RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | + RCC_CFGR_PLLMULL7); +#else + /* PLL configuration: PLLCLK = HSE * 7 = 56 MHz */ + RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL)); + RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL7); + +#endif /* STM32F10X_CL */ + + /* Enable PLL */ + RCC->CR |= RCC_CR_PLLON; + + /* Wait till PLL is ready */ + while((RCC->CR & RCC_CR_PLLRDY) == 0) + { + } + + /* Select PLL as system clock source */ + RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); + RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL; + + /* Wait till PLL is used as system clock source */ + while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08) + { + } + } + else + { /* If HSE fails to start-up, the application will have wrong clock + configuration. User can add here some code to deal with this error */ + } +} + +#elif defined SYSCLK_FREQ_72MHz +/** + * @brief Sets System clock frequency to 72MHz and configure HCLK, PCLK2 + * and PCLK1 prescalers. + * @note This function should be used only after reset. + * @param None + * @retval None + */ +static void SetSysClockTo72(void) +{ + __IO uint32_t StartUpCounter = 0, HSEStatus = 0; + + /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/ + /* Enable HSE */ + RCC->CR |= ((uint32_t)RCC_CR_HSEON); + + /* Wait till HSE is ready and if Time out is reached exit */ + do + { + HSEStatus = RCC->CR & RCC_CR_HSERDY; + StartUpCounter++; + } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); + + if ((RCC->CR & RCC_CR_HSERDY) != RESET) + { + HSEStatus = (uint32_t)0x01; + } + else + { + HSEStatus = (uint32_t)0x00; + } + + if (HSEStatus == (uint32_t)0x01) + { + /* Enable Prefetch Buffer */ + FLASH->ACR |= FLASH_ACR_PRFTBE; + + /* Flash 2 wait state */ + FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY); + FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2; + + + /* HCLK = SYSCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; + + /* PCLK2 = HCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; + + /* PCLK1 = HCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2; + +#ifdef STM32F10X_CL + /* Configure PLLs ------------------------------------------------------*/ + /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */ + /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */ + + RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL | + RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC); + RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 | + RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5); + + /* Enable PLL2 */ + RCC->CR |= RCC_CR_PLL2ON; + /* Wait till PLL2 is ready */ + while((RCC->CR & RCC_CR_PLL2RDY) == 0) + { + } + + + /* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */ + RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL); + RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | + RCC_CFGR_PLLMULL9); +#else + /* PLL configuration: PLLCLK = HSE * 9 = 72 MHz */ + RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | + RCC_CFGR_PLLMULL)); + RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9); +#endif /* STM32F10X_CL */ + + /* Enable PLL */ + RCC->CR |= RCC_CR_PLLON; + + /* Wait till PLL is ready */ + while((RCC->CR & RCC_CR_PLLRDY) == 0) + { + } + + /* Select PLL as system clock source */ + RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); + RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL; + + /* Wait till PLL is used as system clock source */ + while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08) + { + } + } + else + { /* If HSE fails to start-up, the application will have wrong clock + configuration. User can add here some code to deal with this error */ + } +} +#endif + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/system_stm32f10x.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/system_stm32f10x.h new file mode 100644 index 0000000..739f332 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/system_stm32f10x.h @@ -0,0 +1,98 @@ +/** + ****************************************************************************** + * @file system_stm32f10x.h + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief CMSIS Cortex-M3 Device Peripheral Access Layer System Header File. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f10x_system + * @{ + */ + +/** + * @brief Define to prevent recursive inclusion + */ +#ifndef __SYSTEM_STM32F10X_H +#define __SYSTEM_STM32F10X_H + +#ifdef __cplusplus + extern "C" { +#endif + +/** @addtogroup STM32F10x_System_Includes + * @{ + */ + +/** + * @} + */ + + +/** @addtogroup STM32F10x_System_Exported_types + * @{ + */ + +extern uint32_t SystemCoreClock; /*!< System Clock Frequency (Core Clock) */ + +/** + * @} + */ + +/** @addtogroup STM32F10x_System_Exported_Constants + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F10x_System_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F10x_System_Exported_Functions + * @{ + */ + +extern void SystemInit(void); +extern void SystemCoreClockUpdate(void); +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /*__SYSTEM_STM32F10X_H */ + +/** + * @} + */ + +/** + * @} + */ +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CMSIS debug support.htm b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CMSIS debug support.htm new file mode 100644 index 0000000..efda685 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CMSIS debug support.htm @@ -0,0 +1,243 @@ + + + +CMSIS Debug Support + + + + + + + + +

CMSIS Debug Support

+ +
+ +

Cortex-M3 ITM Debug Access

+

+ The Cortex-M3 incorporates the Instrumented Trace Macrocell (ITM) that provides together with + the Serial Viewer Output trace capabilities for the microcontroller system. The ITM has + 32 communication channels which are able to transmit 32 / 16 / 8 bit values; two ITM + communication channels are used by CMSIS to output the following information: +

+
    +
  • ITM Channel 0: used for printf-style output via the debug interface.
  • +
  • ITM Channel 31: is reserved for RTOS kernel awareness debugging.
  • +
+ +

Debug IN / OUT functions

+

CMSIS provides following debug functions:

+
    +
  • ITM_SendChar (uses ITM channel 0)
  • +
  • ITM_ReceiveChar (uses global variable)
  • +
  • ITM_CheckChar (uses global variable)
  • +
+ +

ITM_SendChar

+

+ ITM_SendChar is used to transmit a character over ITM channel 0 from + the microcontroller system to the debug system.
+ Only a 8 bit value is transmitted. +

+
+static __INLINE uint32_t ITM_SendChar (uint32_t ch)
+{
+  /* check if debugger connected and ITM channel enabled for tracing */
+  if ((CoreDebug->DEMCR & CoreDebug_DEMCR_TRCENA)  &&
+      (ITM->TCR & ITM_TCR_ITMENA)                  &&
+      (ITM->TER & (1UL << 0))  ) 
+  {
+    while (ITM->PORT[0].u32 == 0);
+    ITM->PORT[0].u8 = (uint8_t)ch;
+  }  
+  return (ch);
+}
+ +

ITM_ReceiveChar

+

+ ITM communication channel is only capable for OUT direction. For IN direction + a globel variable is used. A simple mechansim detects if a character is received. + The project to test need to be build with debug information. +

+ +

+ The globale variable ITM_RxBuffer is used to transmit a 8 bit value from debug system + to microcontroller system. ITM_RxBuffer is 32 bit wide to enshure a proper handshake. +

+
+extern volatile int ITM_RxBuffer;                    /* variable to receive characters                             */
+
+

+ A dedicated bit pattern is used to determin if ITM_RxBuffer is empty + or contains a valid value. +

+
+#define             ITM_RXBUFFER_EMPTY    0x5AA55AA5 /* value identifying ITM_RxBuffer is ready for next character */
+
+

+ ITM_ReceiveChar is used to receive a 8 bit value from the debug system. The function is nonblocking. + It returns the received character or '-1' if no character was available. +

+
+static __INLINE int ITM_ReceiveChar (void) {
+  int ch = -1;                               /* no character available */
+
+  if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) {
+    ch = ITM_RxBuffer;
+    ITM_RxBuffer = ITM_RXBUFFER_EMPTY;       /* ready for next character */
+  }
+  
+  return (ch); 
+}
+
+ +

ITM_CheckChar

+

+ ITM_CheckChar is used to check if a character is received. +

+
+static __INLINE int ITM_CheckChar (void) {
+
+  if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) {
+    return (0);                                 /* no character available */
+  } else {
+    return (1);                                 /*    character available */
+  }
+}
+ + +

ITM Debug Support in uVision

+

+ uVision uses in a debug session the Debug (printf) Viewer window to + display the debug data. +

+

Direction microcontroller system -> uVision:

+
    +
  • + Characters received via ITM communication channel 0 are written in a printf style + to Debug (printf) Viewer window. +
  • +
+ +

Direction uVision -> microcontroller system:

+
    +
  • Check if ITM_RxBuffer variable is available (only performed once).
  • +
  • Read character from Debug (printf) Viewer window.
  • +
  • If ITM_RxBuffer empty write character to ITM_RxBuffer.
  • +
+ +

Note

+
    +
  • Current solution does not use a buffer machanism for trasmitting the characters.

    +
  • +
+ +

RTX Kernel awareness in uVision

+

+ uVision / RTX are using a simple and efficient solution for RTX Kernel awareness. + No format overhead is necessary.
+ uVsion debugger decodes the RTX events via the 32 / 16 / 8 bit ITM write access + to ITM communication channel 31. +

+ +

Following RTX events are traced:

+
    +
  • Task Create / Delete event +
      +
    1. 32 bit access. Task start address is transmitted
    2. +
    3. 16 bit access. Task ID and Create/Delete flag are transmitted
      + High byte holds Create/Delete flag, Low byte holds TASK ID. +
    4. +
    +
  • +
  • Task switch event +
      +
    1. 8 bit access. Task ID of current task is transmitted
    2. +
    +
  • +
+ +

Note

+
    +
  • Other RTOS information could be retrieved via memory read access in a polling mode manner.

    +
  • +
+ + +

 

+ +
+ +

Copyright © KEIL - An ARM Company.
+All rights reserved.
+Visit our web site at www.keil.com. +

+ + + + \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CMSIS_changes.htm b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CMSIS_changes.htm new file mode 100644 index 0000000..162ffcc --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CMSIS_changes.htm @@ -0,0 +1,320 @@ + + + +CMSIS Changes + + + + + + + + +

Changes to CMSIS version V1.20

+ +
+ +

1. Removed CMSIS Middelware packages

+

+ CMSIS Middleware is on hold from ARM side until a agreement between all CMSIS partners is found. +

+ +

2. SystemFrequency renamed to SystemCoreClock

+

+ The variable name SystemCoreClock is more precise than SystemFrequency + because the variable holds the clock value at which the core is running. +

+ +

3. Changed startup concept

+

+ The old startup concept (calling SystemInit_ExtMemCtl from startup file and calling SystemInit + from main) has the weakness that it does not work for controllers which need a already + configuerd clock system to configure the external memory controller. +

+ +

Changed startup concept

+
    +
  • + SystemInit() is called from startup file before premain. +
  • +
  • + SystemInit() configures the clock system and also configures + an existing external memory controller. +
  • +
  • + SystemInit() must not use global variables. +
  • +
  • + SystemCoreClock is initialized with a correct predefined value. +
  • +
  • + Additional function void SystemCoreClockUpdate (void) is provided.
    + SystemCoreClockUpdate() updates the variable SystemCoreClock + and must be called whenever the core clock is changed.
    + SystemCoreClockUpdate() evaluates the clock register settings and calculates + the current core clock. +
  • +
+ + +

4. Advanced Debug Functions

+

+ ITM communication channel is only capable for OUT direction. To allow also communication for + IN direction a simple concept is provided. +

+
    +
  • + Global variable volatile int ITM_RxBuffer used for IN data. +
  • +
  • + Function int ITM_CheckChar (void) checks if a new character is available. +
  • +
  • + Function int ITM_ReceiveChar (void) retrieves the new character. +
  • +
+ +

+ For detailed explanation see file CMSIS debug support.htm. +

+ + +

5. Core Register Bit Definitions

+

+ Files core_cm3.h and core_cm0.h contain now bit definitions for Core Registers. The name for the + defines correspond with the Cortex-M Technical Reference Manual. +

+

+ e.g. SysTick structure with bit definitions +

+
+/** @addtogroup CMSIS_CM3_SysTick CMSIS CM3 SysTick
+  memory mapped structure for SysTick
+  @{
+ */
+typedef struct
+{
+  __IO uint32_t CTRL;                         /*!< Offset: 0x00  SysTick Control and Status Register */
+  __IO uint32_t LOAD;                         /*!< Offset: 0x04  SysTick Reload Value Register       */
+  __IO uint32_t VAL;                          /*!< Offset: 0x08  SysTick Current Value Register      */
+  __I  uint32_t CALIB;                        /*!< Offset: 0x0C  SysTick Calibration Register        */
+} SysTick_Type;
+
+/* SysTick Control / Status Register Definitions */
+#define SysTick_CTRL_COUNTFLAG_Pos         16                                             /*!< SysTick CTRL: COUNTFLAG Position */
+#define SysTick_CTRL_COUNTFLAG_Msk         (1ul << SysTick_CTRL_COUNTFLAG_Pos)            /*!< SysTick CTRL: COUNTFLAG Mask */
+
+#define SysTick_CTRL_CLKSOURCE_Pos          2                                             /*!< SysTick CTRL: CLKSOURCE Position */
+#define SysTick_CTRL_CLKSOURCE_Msk         (1ul << SysTick_CTRL_CLKSOURCE_Pos)            /*!< SysTick CTRL: CLKSOURCE Mask */
+
+#define SysTick_CTRL_TICKINT_Pos            1                                             /*!< SysTick CTRL: TICKINT Position */
+#define SysTick_CTRL_TICKINT_Msk           (1ul << SysTick_CTRL_TICKINT_Pos)              /*!< SysTick CTRL: TICKINT Mask */
+
+#define SysTick_CTRL_ENABLE_Pos             0                                             /*!< 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             0                                             /*!< 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             0                                             /*!< 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            31                                             /*!< SysTick CALIB: NOREF Position */
+#define SysTick_CALIB_NOREF_Msk            (1ul << SysTick_CALIB_NOREF_Pos)               /*!< SysTick CALIB: NOREF Mask */
+
+#define SysTick_CALIB_SKEW_Pos             30                                             /*!< SysTick CALIB: SKEW Position */
+#define SysTick_CALIB_SKEW_Msk             (1ul << SysTick_CALIB_SKEW_Pos)                /*!< SysTick CALIB: SKEW Mask */
+
+#define SysTick_CALIB_TENMS_Pos             0                                             /*!< SysTick CALIB: TENMS Position */
+#define SysTick_CALIB_TENMS_Msk            (0xFFFFFFul << SysTick_VAL_CURRENT_Pos)        /*!< SysTick CALIB: TENMS Mask */
+/*@}*/ /* end of group CMSIS_CM3_SysTick */
+ +

7. DoxyGen Tags

+

+ DoxyGen tags in files core_cm3.[c,h] and core_cm0.[c,h] are reworked to create proper documentation + using DoxyGen. +

+ +

8. Folder Structure

+

+ The folder structure is changed to differentiate the single support packages. +

+ +
    +
  • CM0
  • +
  • CM3 +
      +
    • CoreSupport
    • +
    • DeviceSupport
    • +
        +
      • Vendor +
          +
        • Device +
            +
          • Startup +
              +
            • Toolchain
            • +
            • Toolchain
            • +
            • ...
            • +
            +
          • +
          +
        • +
        • Device
        • +
        • ...
        • +
        +
      • +
      • Vendor
      • +
      • ...
      • +
      + +
    • Example +
        +
      • Toolchain +
          +
        • Device
        • +
        • Device
        • +
        • ...
        • +
        +
      • +
      • Toolchain
      • +
      • ...
      • +
      +
    • +
    +
  • + +
  • Documentation
  • +
+ +

9. Open Points

+

+ Following points need to be clarified and solved: +

+
    +
  • +

    + Equivalent C and Assembler startup files. +

    +

    + Is there a need for having C startup files although assembler startup files are + very efficient and do not need to be changed? +

    +

  • +
  • +

    + Placing of HEAP in external RAM. +

    +

    + It must be possible to place HEAP in external RAM if the device supports an + external memory controller. +

    +
  • +
  • +

    + Placing of STACK /HEAP. +

    +

    + STACK should always be placed at the end of internal RAM. +

    +

    + If HEAP is placed in internal RAM than it should be placed after RW ZI section. +

    +
  • +
  • +

    + Removing core_cm3.c and core_cm0.c. +

    +

    + On a long term the functions in core_cm3.c and core_cm0.c must be replaced with + appropriate compiler intrinsics. +

    +
  • +
+ + +

10. Limitations

+

+ The following limitations are not covered with the current CMSIS version: +

+
    +
  • + No C startup files for ARM toolchain are provided. +
  • +
  • + No C startup files for GNU toolchain are provided. +
  • +
  • + No C startup files for IAR toolchain are provided. +
  • +
  • + No Tasking projects are provided yet. +
  • +
diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/Documentation/CMSIS_Core.htm b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/Documentation/CMSIS_Core.htm new file mode 100644 index 0000000..6fd131e --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/Documentation/CMSIS_Core.htm @@ -0,0 +1,1337 @@ + + + + CMSIS: Cortex Microcontroller Software Interface Standard + + + +

Cortex Microcontroller Software Interface Standard

+ +

This file describes the Cortex Microcontroller Software Interface Standard (CMSIS).

+

Version: 1.30 - 30. October 2009

+ +

Information in this file, the accompany manuals, and software is
+ Copyright © ARM Ltd.
All rights reserved. +

+ +
+ +

Revision History

+
    +
  • Version 1.00: initial release.
  • +
  • Version 1.01: added __LDREXx, __STREXx, and __CLREX.
  • +
  • Version 1.02: added Cortex-M0.
  • +
  • Version 1.10: second review.
  • +
  • Version 1.20: third review.
  • +
  • Version 1.30 PRE-RELEASE: reworked Startup Concept, additional Debug Functionality.
  • +
  • Version 1.30 2nd PRE-RELEASE: changed folder structure, added doxyGen comments, added Bit definitions.
  • +
  • Version 1.30: updated Device Support Packages.
  • +
+ +
+ +

Contents

+ +
    +
  1. About
  2. +
  3. Coding Rules and Conventions
  4. +
  5. CMSIS Files
  6. +
  7. Core Peripheral Access Layer
  8. +
  9. CMSIS Example
  10. +
+ +

About

+ +

+ The Cortex Microcontroller Software Interface Standard (CMSIS) answers the challenges + that are faced when software components are deployed to physical microcontroller devices based on a + Cortex-M0 or Cortex-M3 processor. The CMSIS will be also expanded to future Cortex-M + processor cores (the term Cortex-M is used to indicate that). The CMSIS is defined in close co-operation + with various silicon and software vendors and provides a common approach to interface to peripherals, + real-time operating systems, and middleware components. +

+ +

ARM provides as part of the CMSIS the following software layers that are +available for various compiler implementations:

+
    +
  • Core Peripheral Access Layer: contains name definitions, + address definitions and helper functions to + access core registers and peripherals. It defines also a device + independent interface for RTOS Kernels that includes debug channel + definitions.
  • +
+ +

These software layers are expanded by Silicon partners with:

+
    +
  • Device Peripheral Access Layer: provides definitions + for all device peripherals
  • +
  • Access Functions for Peripherals (optional): provides + additional helper functions for peripherals
  • +
+ +

CMSIS defines for a Cortex-M Microcontroller System:

+
    +
  • A common way to access peripheral registers + and a common way to define exception vectors.
  • +
  • The register names of the Core + Peripherals and the names of the Core + Exception Vectors.
  • +
  • An device independent interface for RTOS Kernels including a debug + channel.
  • +
+ +

+ By using CMSIS compliant software components, the user can easier re-use template code. + CMSIS is intended to enable the combination of software components from multiple middleware vendors. +

+ +

Coding Rules and Conventions

+ +

+ The following section describes the coding rules and conventions used in the CMSIS + implementation. It contains also information about data types and version number information. +

+ +

Essentials

+
    +
  • The CMSIS C code conforms to MISRA 2004 rules. In case of MISRA violations, + there are disable and enable sequences for PC-LINT inserted.
  • +
  • ANSI standard data types defined in the ANSI C header file + <stdint.h> are used.
  • +
  • #define constants that include expressions must be enclosed by + parenthesis.
  • +
  • Variables and parameters have a complete data type.
  • +
  • All functions in the Core Peripheral Access Layer are + re-entrant.
  • +
  • The Core Peripheral Access Layer has no blocking code + (which means that wait/query loops are done at other software layers).
  • +
  • For each exception/interrupt there is definition for: +
      +
    • an exception/interrupt handler with the postfix _Handler + (for exceptions) or _IRQHandler (for interrupts).
    • +
    • a default exception/interrupt handler (weak definition) that contains an endless loop.
    • +
    • a #define of the interrupt number with the postfix _IRQn.
    • +
  • +
+ +

Recommendations

+ +

The CMSIS recommends the following conventions for identifiers.

+
    +
  • CAPITAL names to identify Core Registers, Peripheral Registers, and CPU Instructions.
  • +
  • CamelCase names to identify peripherals access functions and interrupts.
  • +
  • PERIPHERAL_ prefix to identify functions that belong to specify peripherals.
  • +
  • Doxygen comments for all functions are included as described under Function Comments below.
  • +
+ +Comments + +
    +
  • Comments use the ANSI C90 style (/* comment */) or C++ style + (// comment). It is assumed that the programming tools support today + consistently the C++ comment style.
  • +
  • Function Comments provide for each function the following information: +
      +
    • one-line brief function overview.
    • +
    • detailed parameter explanation.
    • +
    • detailed information about return values.
    • +
    • detailed description of the actual function.
    • +
    +

    Doxygen Example:

    +
    +/** 
    + * @brief  Enable Interrupt in NVIC Interrupt Controller
    + * @param  IRQn  interrupt number that specifies the interrupt
    + * @return none.
    + * Enable the specified interrupt in the NVIC Interrupt Controller.
    + * Other settings of the interrupt such as priority are not affected.
    + */
    +
  • +
+ +

Data Types and IO Type Qualifiers

+ +

+ The Cortex-M HAL uses the standard types from the standard ANSI C header file + <stdint.h>. IO Type Qualifiers are used to specify the access + to peripheral variables. IO Type Qualifiers are indented to be used for automatic generation of + debug information of peripheral registers. +

+ + + + + + + + + + + + + + + + + + + + + + + + +
IO Type Qualifier#defineDescription
__Ivolatile constRead access only
__OvolatileWrite access only
__IOvolatileRead and write access
+ +

CMSIS Version Number

+

+ File core_cm3.h contains the version number of the CMSIS with the following define: +

+ +
+#define __CM3_CMSIS_VERSION_MAIN  (0x01)      /* [31:16] main version       */
+#define __CM3_CMSIS_VERSION_SUB   (0x30)      /* [15:0]  sub version        */
+#define __CM3_CMSIS_VERSION       ((__CM3_CMSIS_VERSION_MAIN << 16) | __CM3_CMSIS_VERSION_SUB)
+ +

+ File core_cm0.h contains the version number of the CMSIS with the following define: +

+ +
+#define __CM0_CMSIS_VERSION_MAIN  (0x01)      /* [31:16] main version       */
+#define __CM0_CMSIS_VERSION_SUB   (0x30)      /* [15:0]  sub version        */
+#define __CM0_CMSIS_VERSION       ((__CM0_CMSIS_VERSION_MAIN << 16) | __CM0_CMSIS_VERSION_SUB)
+ + +

CMSIS Cortex Core

+

+ File core_cm3.h contains the type of the CMSIS Cortex-M with the following define: +

+ +
+#define __CORTEX_M                (0x03)
+ +

+ File core_cm0.h contains the type of the CMSIS Cortex-M with the following define: +

+ +
+#define __CORTEX_M                (0x00)
+ + +

CMSIS Files

+

+ This section describes the Files provided in context with the CMSIS to access the Cortex-M + hardware and peripherals. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileProviderDescription
device.hDevice specific (provided by silicon partner)Defines the peripherals for the actual device. The file may use + several other include files to define the peripherals of the actual device.
core_cm0.hARM (for RealView ARMCC, IAR, and GNU GCC)Defines the core peripherals for the Cortex-M0 CPU and core peripherals.
core_cm3.hARM (for RealView ARMCC, IAR, and GNU GCC)Defines the core peripherals for the Cortex-M3 CPU and core peripherals.
core_cm0.cARM (for RealView ARMCC, IAR, and GNU GCC)Provides helper functions that access core registers.
core_cm3.cARM (for RealView ARMCC, IAR, and GNU GCC)Provides helper functions that access core registers.
startup_deviceARM (adapted by compiler partner / silicon partner)Provides the Cortex-M startup code and the complete (device specific) Interrupt Vector Table
system_deviceARM (adapted by silicon partner)Provides a device specific configuration file for the device. It configures the device initializes + typically the oscillator (PLL) that is part of the microcontroller device
+ +

device.h

+ +

+ The file device.h is provided by the silicon vendor and is the + central include file that the application programmer is using in + the C source code. This file contains: +

+
    +
  • +

    Interrupt Number Definition: provides interrupt numbers + (IRQn) for all core and device specific exceptions and interrupts.

    +
  • +
  • +

    Configuration for core_cm0.h / core_cm3.h: reflects the + actual configuration of the Cortex-M processor that is part of the actual + device. As such the file core_cm0.h / core_cm3.h is included that + implements access to processor registers and core peripherals.

    +
  • +
  • +

    Device Peripheral Access Layer: provides definitions + for all device peripherals. It contains all data structures and the address + mapping for the device specific peripherals.

    +
  • +
  • Access Functions for Peripherals (optional): provides + additional helper functions for peripherals that are useful for programming + of these peripherals. Access Functions may be provided as inline functions + or can be extern references to a device specific library provided by the + silicon vendor.
  • +
+ + +

Interrupt Number Definition

+ +

To access the device specific interrupts the device.h file defines IRQn +numbers for the complete device using a enum typedef as shown below:

+
+typedef enum IRQn
+{
+/******  Cortex-M3 Processor Exceptions/Interrupt Numbers ************************************************/
+  NonMaskableInt_IRQn             = -14,      /*!< 2 Non Maskable Interrupt                              */
+  HardFault_IRQn                  = -13,      /*!< 3 Cortex-M3 Hard Fault Interrupt                      */
+  MemoryManagement_IRQn           = -12,      /*!< 4 Cortex-M3 Memory Management Interrupt               */
+  BusFault_IRQn                   = -11,      /*!< 5 Cortex-M3 Bus Fault Interrupt                       */
+  UsageFault_IRQn                 = -10,      /*!< 6 Cortex-M3 Usage Fault Interrupt                     */
+  SVCall_IRQn                     = -5,       /*!< 11 Cortex-M3 SV Call Interrupt                        */
+  DebugMonitor_IRQn               = -4,       /*!< 12 Cortex-M3 Debug Monitor Interrupt                  */
+  PendSV_IRQn                     = -2,       /*!< 14 Cortex-M3 Pend SV Interrupt                        */
+  SysTick_IRQn                    = -1,       /*!< 15 Cortex-M3 System Tick Interrupt                    */
+/******  STM32 specific Interrupt Numbers ****************************************************************/
+  WWDG_STM_IRQn                   = 0,        /*!< Window WatchDog Interrupt                             */
+  PVD_STM_IRQn                    = 1,        /*!< PVD through EXTI Line detection Interrupt             */
+  :
+  :
+  } IRQn_Type;
+ + +

Configuration for core_cm0.h / core_cm3.h

+

+ The Cortex-M core configuration options which are defined for each device implementation. Some + configuration options are reflected in the CMSIS layer using the #define settings described below. +

+

+ To access core peripherals file device.h includes file core_cm0.h / core_cm3.h. + Several features in core_cm0.h / core_cm3.h are configured by the following defines that must be + defined before #include <core_cm0.h> / #include <core_cm3.h> + preprocessor command. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#defineFileValueDescription
__NVIC_PRIO_BITScore_cm0.h(2)Number of priority bits implemented in the NVIC (device specific)
__NVIC_PRIO_BITScore_cm3.h(2 ... 8)Number of priority bits implemented in the NVIC (device specific)
__MPU_PRESENTcore_cm0.h, core_cm3.h(0, 1)Defines if an MPU is present or not
__Vendor_SysTickConfigcore_cm0.h, core_cm3.h(1)When this define is setup to 1, the SysTickConfig function + in core_cm3.h is excluded. In this case the device.h + file must contain a vendor specific implementation of this function.
+ + +

Device Peripheral Access Layer

+

+ Each peripheral uses a prefix which consists of <device abbreviation>_ + and <peripheral name>_ to identify peripheral registers that access this + specific peripheral. The intention of this is to avoid name collisions caused + due to short names. If more than one peripheral of the same type exists, + identifiers have a postfix (digit or letter). For example: +

+
    +
  • <device abbreviation>_UART_Type: defines the generic register layout for all UART channels in a device. +
    +typedef struct
    +{
    +  union {
    +  __I  uint8_t  RBR;                     /*!< Offset: 0x000   Receiver Buffer Register    */
    +  __O  uint8_t  THR;                     /*!< Offset: 0x000   Transmit Holding Register   */
    +  __IO uint8_t  DLL;                     /*!< Offset: 0x000   Divisor Latch LSB           */
    +       uint32_t RESERVED0;
    +  };
    +  union {
    +  __IO uint8_t  DLM;                     /*!< Offset: 0x004   Divisor Latch MSB           */
    +  __IO uint32_t IER;                     /*!< Offset: 0x004   Interrupt Enable Register   */
    +  };
    +  union {
    +  __I  uint32_t IIR;                     /*!< Offset: 0x008   Interrupt ID Register       */
    +  __O  uint8_t  FCR;                     /*!< Offset: 0x008   FIFO Control Register       */
    +  };
    +  __IO uint8_t  LCR;                     /*!< Offset: 0x00C   Line Control Register       */
    +       uint8_t  RESERVED1[7];
    +  __I  uint8_t  LSR;                     /*!< Offset: 0x014   Line Status Register        */
    +       uint8_t  RESERVED2[7];
    +  __IO uint8_t  SCR;                     /*!< Offset: 0x01C   Scratch Pad Register        */
    +       uint8_t  RESERVED3[3];
    +  __IO uint32_t ACR;                     /*!< Offset: 0x020   Autobaud Control Register   */
    +  __IO uint8_t  ICR;                     /*!< Offset: 0x024   IrDA Control Register       */
    +       uint8_t  RESERVED4[3];
    +  __IO uint8_t  FDR;                     /*!< Offset: 0x028   Fractional Divider Register */
    +       uint8_t  RESERVED5[7];
    +  __IO uint8_t  TER;                     /*!< Offset: 0x030   Transmit Enable Register    */
    +       uint8_t  RESERVED6[39];
    +  __I  uint8_t  FIFOLVL;                 /*!< Offset: 0x058   FIFO Level Register         */
    +} LPC_UART_TypeDef;
    +
  • +
  • <device abbreviation>_UART1: is a pointer to a register structure that refers to a specific UART. + For example UART1->DR is the data register of UART1. +
    +#define LPC_UART2             ((LPC_UART_TypeDef      *) LPC_UART2_BASE    )
    +#define LPC_UART3             ((LPC_UART_TypeDef      *) LPC_UART3_BASE    )
    +
  • +
+ +
Minimal Requiements
+

+ To access the peripheral registers and related function in a device the files device.h + and core_cm0.h / core_cm3.h defines as a minimum: +

+
    +
  • The Register Layout Typedef for each peripheral that defines all register names. + Names that start with RESERVE are used to introduce space into the structure to adjust the addresses of + the peripheral registers. For example: +
    +typedef struct {
    +  __IO uint32_t CTRL;      /* SysTick Control and Status Register */
    +  __IO uint32_t LOAD;      /* SysTick Reload Value Register       */
    +  __IO uint32_t VAL;       /* SysTick Current Value Register      */
    +  __I  uint32_t CALIB;     /* SysTick Calibration Register        */
    +  } SysTick_Type;
    +
  • + +
  • + Base Address for each peripheral (in case of multiple peripherals + that use the same register layout typedef multiple base addresses are defined). For example: +
    +#define SysTick_BASE (SCS_BASE + 0x0010)            /* SysTick Base Address */
    +
  • + +
  • + Access Definition for each peripheral (in case of multiple peripherals that use + the same register layout typedef multiple access definitions exist, i.e. LPC_UART0, + LPC_UART2). For Example: +
    +#define SysTick ((SysTick_Type *) SysTick_BASE)     /* SysTick access definition */
    +
  • +
+ +

+ These definitions allow to access the peripheral registers from user code with simple assignments like: +

+
SysTick->CTRL = 0;
+ +
Optional Features
+

In addition the device.h file may define:

+
    +
  • + #define constants that simplify access to the peripheral registers. + These constant define bit-positions or other specific patterns are that required for the + programming of the peripheral registers. The identifiers used start with + <device abbreviation>_ and <peripheral name>_. + It is recommended to use CAPITAL letters for such #define constants. +
  • +
  • + Functions that perform more complex functions with the peripheral (i.e. status query before + a sending register is accessed). Again these function start with + <device abbreviation>_ and <peripheral name>_. +
  • +
+ +

core_cm0.h and core_cm0.c

+

+ File core_cm0.h describes the data structures for the Cortex-M0 core peripherals and does + the address mapping of this structures. It also provides basic access to the Cortex-M0 core registers + and core peripherals with efficient functions (defined as static inline). +

+

+ File core_cm0.c defines several helper functions that access processor registers. +

+

Together these files implement the Core Peripheral Access Layer for a Cortex-M0.

+ +

core_cm3.h and core_cm3.c

+

+ File core_cm3.h describes the data structures for the Cortex-M3 core peripherals and does + the address mapping of this structures. It also provides basic access to the Cortex-M3 core registers + and core peripherals with efficient functions (defined as static inline). +

+

+ File core_cm3.c defines several helper functions that access processor registers. +

+

Together these files implement the Core Peripheral Access Layer for a Cortex-M3.

+ +

startup_device

+

+ A template file for startup_device is provided by ARM for each supported + compiler. It is adapted by the silicon vendor to include interrupt vectors for all device specific + interrupt handlers. Each interrupt handler is defined as weak function + to an dummy handler. Therefore the interrupt handler can be directly used in application software + without any requirements to adapt the startup_device file. +

+

+ The following exception names are fixed and define the start of the vector table for a Cortex-M0: +

+
+__Vectors       DCD     __initial_sp              ; Top of Stack
+                DCD     Reset_Handler             ; Reset Handler
+                DCD     NMI_Handler               ; NMI Handler
+                DCD     HardFault_Handler         ; Hard Fault Handler
+                DCD     0                         ; Reserved
+                DCD     0                         ; Reserved
+                DCD     0                         ; Reserved
+                DCD     0                         ; Reserved
+                DCD     0                         ; Reserved
+                DCD     0                         ; Reserved
+                DCD     0                         ; Reserved
+                DCD     SVC_Handler               ; SVCall Handler
+                DCD     0                         ; Reserved
+                DCD     0                         ; Reserved
+                DCD     PendSV_Handler            ; PendSV Handler
+                DCD     SysTick_Handler           ; SysTick Handler
+ +

+ The following exception names are fixed and define the start of the vector table for a Cortex-M3: +

+
+__Vectors       DCD     __initial_sp              ; Top of Stack
+                DCD     Reset_Handler             ; Reset Handler
+                DCD     NMI_Handler               ; NMI Handler
+                DCD     HardFault_Handler         ; Hard Fault Handler
+                DCD     MemManage_Handler         ; MPU Fault Handler
+                DCD     BusFault_Handler          ; Bus Fault Handler
+                DCD     UsageFault_Handler        ; Usage Fault Handler
+                DCD     0                         ; Reserved
+                DCD     0                         ; Reserved
+                DCD     0                         ; Reserved
+                DCD     0                         ; Reserved
+                DCD     SVC_Handler               ; SVCall Handler
+                DCD     DebugMon_Handler          ; Debug Monitor Handler
+                DCD     0                         ; Reserved
+                DCD     PendSV_Handler            ; PendSV Handler
+                DCD     SysTick_Handler           ; SysTick Handler
+ +

+ In the following examples for device specific interrupts are shown: +

+
+; External Interrupts
+                DCD     WWDG_IRQHandler           ; Window Watchdog
+                DCD     PVD_IRQHandler            ; PVD through EXTI Line detect
+                DCD     TAMPER_IRQHandler         ; Tamper
+ +

+ Device specific interrupts must have a dummy function that can be overwritten in user code. + Below is an example for this dummy function. +

+
+Default_Handler PROC
+                EXPORT WWDG_IRQHandler   [WEAK]
+                EXPORT PVD_IRQHandler    [WEAK]
+                EXPORT TAMPER_IRQHandler [WEAK]
+                :
+                :
+                WWDG_IRQHandler
+                PVD_IRQHandler
+                TAMPER_IRQHandler
+                :
+                :
+                B .
+                ENDP
+ +

+ The user application may simply define an interrupt handler function by using the handler name + as shown below. +

+
+void WWDG_IRQHandler(void)
+{
+  :
+  :
+}
+ + +

system_device.c

+

+ A template file for system_device.c is provided by ARM but adapted by + the silicon vendor to match their actual device. As a minimum requirement + this file must provide a device specific system configuration function and a global variable + that contains the system frequency. It configures the device and initializes typically the + oscillator (PLL) that is part of the microcontroller device. +

+

+ The file system_device.c must provide + as a minimum requirement the SystemInit function as shown below. +

+ + + + + + + + + + + + + + + + +
Function DefinitionDescription
void SystemInit (void)Setup the microcontroller system. Typically this function configures the + oscillator (PLL) that is part of the microcontroller device. For systems + with variable clock speed it also updates the variable SystemCoreClock.
+ SystemInit is called from startup_device file.
void SystemCoreClockUpdate (void)Updates the variable SystemCoreClock and must be called whenever the + core clock is changed during program execution. SystemCoreClockUpdate() + evaluates the clock register settings and calculates the current core clock. +
+ +

+ Also part of the file system_device.c + is the variable SystemCoreClock which contains the current CPU clock speed shown below. +

+ + + + + + + + + + + + +
Variable DefinitionDescription
uint32_t SystemCoreClockContains the system core clock (which is the system clock frequency supplied + to the SysTick timer and the processor core clock). This variable can be + used by the user application to setup the SysTick timer or configure other + parameters. It may also be used by debugger to query the frequency of the + debug timer or configure the trace clock speed.
+ SystemCoreClock is initialized with a correct predefined value.

+ The compiler must be configured to avoid the removal of this variable in + case that the application program is not using it. It is important for + debug systems that the variable is physically present in memory so that + it can be examined to configure the debugger.
+ +

Note

+
    +
  • The above definitions are the minimum requirements for the file + system_device.c. This + file may export more functions or variables that provide a more flexible + configuration of the microcontroller system.

    +
  • +
+ + +

Core Peripheral Access Layer

+ +

Cortex-M Core Register Access

+

+ The following functions are defined in core_cm0.h / core_cm3.h + and provide access to Cortex-M core registers. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Function DefinitionCoreCore RegisterDescription
void __enable_irq (void)M0, M3PRIMASK = 0Global Interrupt enable (using the instruction CPSIE + i)
void __disable_irq (void)M0, M3PRIMASK = 1Global Interrupt disable (using the instruction + CPSID i)
void __set_PRIMASK (uint32_t value)M0, M3PRIMASK = valueAssign value to Priority Mask Register (using the instruction + MSR)
uint32_t __get_PRIMASK (void)M0, M3return PRIMASKReturn Priority Mask Register (using the instruction + MRS)
void __enable_fault_irq (void)M3FAULTMASK = 0Global Fault exception and Interrupt enable (using the + instruction CPSIE + f)
void __disable_fault_irq (void)M3FAULTMASK = 1Global Fault exception and Interrupt disable (using the + instruction CPSID f)
void __set_FAULTMASK (uint32_t value)M3FAULTMASK = valueAssign value to Fault Mask Register (using the instruction + MSR)
uint32_t __get_FAULTMASK (void)M3return FAULTMASKReturn Fault Mask Register (using the instruction MRS)
void __set_BASEPRI (uint32_t value)M3BASEPRI = valueSet Base Priority (using the instruction MSR)
uiuint32_t __get_BASEPRI (void)M3return BASEPRIReturn Base Priority (using the instruction MRS)
void __set_CONTROL (uint32_t value)M0, M3CONTROL = valueSet CONTROL register value (using the instruction MSR)
uint32_t __get_CONTROL (void)M0, M3return CONTROLReturn Control Register Value (using the instruction + MRS)
void __set_PSP (uint32_t TopOfProcStack)M0, M3PSP = TopOfProcStackSet Process Stack Pointer value (using the instruction + MSR)
uint32_t __get_PSP (void)M0, M3return PSPReturn Process Stack Pointer (using the instruction MRS)
void __set_MSP (uint32_t TopOfMainStack)M0, M3MSP = TopOfMainStackSet Main Stack Pointer (using the instruction MSR)
uint32_t __get_MSP (void)M0, M3return MSPReturn Main Stack Pointer (using the instruction MRS)
+ +

Cortex-M Instruction Access

+

+ The following functions are defined in core_cm0.h / core_cm3.hand + generate specific Cortex-M instructions. The functions are implemented in the file + core_cm0.c / core_cm3.c. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameCoreGenerated CPU InstructionDescription
void __NOP (void)M0, M3NOPNo Operation
void __WFI (void)M0, M3WFIWait for Interrupt
void __WFE (void)M0, M3WFEWait for Event
void __SEV (void)M0, M3SEVSet Event
void __ISB (void)M0, M3ISBInstruction Synchronization Barrier
void __DSB (void)M0, M3DSBData Synchronization Barrier
void __DMB (void)M0, M3DMBData Memory Barrier
uint32_t __REV (uint32_t value)M0, M3REVReverse byte order in integer value.
uint32_t __REV16 (uint16_t value)M0, M3REV16Reverse byte order in unsigned short value.
sint32_t __REVSH (sint16_t value)M0, M3REVSHReverse byte order in signed short value with sign extension to integer.
uint32_t __RBIT (uint32_t value)M3RBITReverse bit order of value
uint8_t __LDREXB (uint8_t *addr)M3LDREXBLoad exclusive byte
uint16_t __LDREXH (uint16_t *addr)M3LDREXHLoad exclusive half-word
uint32_t __LDREXW (uint32_t *addr)M3LDREXWLoad exclusive word
uint32_t __STREXB (uint8_t value, uint8_t *addr)M3STREXBStore exclusive byte
uint32_t __STREXB (uint16_t value, uint16_t *addr)M3STREXHStore exclusive half-word
uint32_t __STREXB (uint32_t value, uint32_t *addr)M3STREXWStore exclusive word
void __CLREX (void)M3CLREXRemove the exclusive lock created by __LDREXB, __LDREXH, or __LDREXW
+ + +

NVIC Access Functions

+

+ The CMSIS provides access to the NVIC via the register interface structure and several helper + functions that simplify the setup of the NVIC. The CMSIS HAL uses IRQ numbers (IRQn) to + identify the interrupts. The first device interrupt has the IRQn value 0. Therefore negative + IRQn values are used for processor core exceptions. +

+

+ For the IRQn values of core exceptions the file device.h provides + the following enum names. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Core Exception enum ValueCoreIRQnDescription
NonMaskableInt_IRQnM0, M3-14Cortex-M Non Maskable Interrupt
HardFault_IRQnM0, M3-13Cortex-M Hard Fault Interrupt
MemoryManagement_IRQnM3-12Cortex-M Memory Management Interrupt
BusFault_IRQnM3-11Cortex-M Bus Fault Interrupt
UsageFault_IRQnM3-10Cortex-M Usage Fault Interrupt
SVCall_IRQnM0, M3-5Cortex-M SV Call Interrupt
DebugMonitor_IRQnM3-4Cortex-M Debug Monitor Interrupt
PendSV_IRQnM0, M3-2Cortex-M Pend SV Interrupt
SysTick_IRQnM0, M3-1Cortex-M System Tick Interrupt
+ +

The following functions simplify the setup of the NVIC. +The functions are defined as static inline.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameCoreParameterDescription
void NVIC_SetPriorityGrouping (uint32_t PriorityGroup)M3Priority Grouping ValueSet the Priority Grouping (Groups . Subgroups)
uint32_t NVIC_GetPriorityGrouping (void)M3(void)Get the Priority Grouping (Groups . Subgroups)
void NVIC_EnableIRQ (IRQn_Type IRQn)M0, M3IRQ NumberEnable IRQn
void NVIC_DisableIRQ (IRQn_Type IRQn)M0, M3IRQ NumberDisable IRQn
uint32_t NVIC_GetPendingIRQ (IRQn_Type IRQn)M0, M3IRQ NumberReturn 1 if IRQn is pending else 0
void NVIC_SetPendingIRQ (IRQn_Type IRQn)M0, M3IRQ NumberSet IRQn Pending
void NVIC_ClearPendingIRQ (IRQn_Type IRQn)M0, M3IRQ NumberClear IRQn Pending Status
uint32_t NVIC_GetActive (IRQn_Type IRQn)M3IRQ NumberReturn 1 if IRQn is active else 0
void NVIC_SetPriority (IRQn_Type IRQn, uint32_t priority)M0, M3IRQ Number, PrioritySet Priority for IRQn
+ (not threadsafe for Cortex-M0)
uint32_t NVIC_GetPriority (IRQn_Type IRQn)M0, M3IRQ NumberGet Priority for IRQn
uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority)M3IRQ Number, Priority Group, Preemptive Priority, Sub PriorityEncode priority for given group, preemptive and sub priority
NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* pPreemptPriority, uint32_t* pSubPriority)M3IRQ Number, Priority, pointer to Priority Group, pointer to Preemptive Priority, pointer to Sub PriorityDeccode given priority to group, preemptive and sub priority
void NVIC_SystemReset (void)M0, M3(void)Resets the System
+

Note

+
    +
  • The processor exceptions have negative enum values. Device specific interrupts + have positive enum values and start with 0. The values are defined in + device.h file. +

    +
  • +
  • The values for PreemptPriority and SubPriority + used in functions NVIC_EncodePriority and NVIC_DecodePriority + depend on the available __NVIC_PRIO_BITS implemented in the NVIC. +

    +
  • +
+ + +

SysTick Configuration Function

+ +

The following function is used to configure the SysTick timer and start the +SysTick interrupt.

+ + + + + + + + + + + + + + +
NameParameterDescription
uint32_t SysTickConfig + (uint32_t ticks)ticks is SysTick counter reload valueSetup the SysTick timer and enable the SysTick interrupt. After this + call the SysTick timer creates interrupts with the specified time + interval.
+
+ Return: 0 when successful, 1 on failure.
+
+ + +

Cortex-M3 ITM Debug Access

+ +

The Cortex-M3 incorporates the Instrumented Trace Macrocell (ITM) that +provides together with the Serial Viewer Output trace capabilities for the +microcontroller system. The ITM has 32 communication channels; two ITM +communication channels are used by CMSIS to output the following information:

+
    +
  • ITM Channel 0: implements the ITM_SendChar function + which can be used for printf-style output via the debug interface.
  • +
  • ITM Channel 31: is reserved for the RTOS kernel and can be used for + kernel awareness debugging.
  • +
+

Note

+
    +
  • The ITM channel 31 is selected for the RTOS kernel since some kernels + may use the Privileged level for program execution. ITM + channels have 4 groups with 8 channels each, whereby each group can be + configured for access rights in the Unprivileged level. The ITM channel 0 + may be therefore enabled for the user task whereas ITM channel 31 may be + accessible only in Privileged level from the RTOS kernel itself.

    +
  • +
+ +

The prototype of the ITM_SendChar routine is shown in the +table below.

+ + + + + + + + + + + + + + +
NameParameterDescription
void uint32_t ITM_SendChar(uint32_t chr)character to outputThe function outputs a character via the ITM channel 0. The + function returns when no debugger is connected that has booked the + output. It is blocking when a debugger is connected, but the + previous character send is not transmitted.

+ Return: the input character 'chr'.
+ +

+ Example for the usage of the ITM Channel 31 for RTOS Kernels: +

+
+  // check if debugger connected and ITM channel enabled for tracing
+  if ((CoreDebug->DEMCR & CoreDebug_DEMCR_TRCENA) &&
+  (ITM->TCR & ITM_TCR_ITMENA) &&
+  (ITM->TER & (1UL << 31))) {
+    // transmit trace data
+    while (ITM->PORT31_U32 == 0);
+    ITM->PORT[31].u8 = task_id;      // id of next task
+    while (ITM->PORT[31].u32 == 0);
+    ITM->PORT[31].u32 = task_status; // status information
+  }
+ + +

Cortex-M3 additional Debug Access

+ +

CMSIS provides additional debug functions to enlarge the Cortex-M3 Debug Access. +Data can be transmitted via a certain global buffer variable towards the target system.

+ +

The buffer variable and the prototypes of the additional functions are shown in the +table below.

+ + + + + + + + + + + + + + + + + + + + + + + + +
NameParameterDescription
extern volatile int ITM_RxBuffer Buffer to transmit data towards debug system.

+ Value 0x5AA55AA5 indicates that buffer is empty.
int ITM_ReceiveChar (void)noneThe nonblocking functions returns the character stored in + ITM_RxBuffer.

+ Return: -1 indicates that no character was received.
int ITM_CheckChar (void)noneThe function checks if a character is available in ITM_RxBuffer.

+ Return: 1 indicates that a character is available, 0 indicates that + no character is available.
+ + +

CMSIS Example

+

+ The following section shows a typical example for using the CMSIS layer in user applications. + The example is based on a STM32F10x Device. +

+
+#include "stm32f10x.h"
+
+volatile uint32_t msTicks;                       /* timeTicks counter */
+
+void SysTick_Handler(void) {
+  msTicks++;                                     /* increment timeTicks counter */
+}
+
+__INLINE static void Delay (uint32_t dlyTicks) {
+  uint32_t curTicks = msTicks;
+
+  while ((msTicks - curTicks) < dlyTicks);
+}
+
+__INLINE static void LED_Config(void) {
+  ;                                              /* Configure the LEDs */
+}
+
+__INLINE static void LED_On (uint32_t led) {
+  ;                                              /* Turn On  LED */
+}
+
+__INLINE static void LED_Off (uint32_t led) {
+  ;                                              /* Turn Off LED */
+}
+
+int main (void) {
+  if (SysTick_Config (SystemCoreClock / 1000)) { /* Setup SysTick for 1 msec interrupts */
+    ;                                            /* Handle Error */
+    while (1);
+  }
+  
+  LED_Config();                                  /* configure the LEDs */                            
+ 
+  while(1) {
+    LED_On (0x100);                              /* Turn  on the LED   */
+    Delay (100);                                 /* delay  100 Msec    */
+    LED_Off (0x100);                             /* Turn off the LED   */
+    Delay (100);                                 /* delay  100 Msec    */
+  }
+}
+ + + \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/License.doc b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/License.doc new file mode 100644 index 0000000..b6b8ace Binary files /dev/null and b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/License.doc differ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/Release_Notes.html b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/Release_Notes.html new file mode 100644 index 0000000..633e42e --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/Release_Notes.html @@ -0,0 +1,342 @@ + + + + + + + + + + + + +Release Notes for STM32F10x Standard Peripherals Library Drivers + + + + + +
+


+

+
+ + + + + + +
+ + + + + + + + + +
Back to Release page
+

Release +Notes for STM32F10x Standard Peripherals Library Drivers +(StdPeriph_Driver)

+

Copyright 2011 STMicroelectronics

+

+
+

 

+ + + + + + +
+

Contents

+
    +
  1. STM32F10x Standard Peripherals Library +Drivers update History
  2. +
  3. License
  4. +
+ + +

STM32F10x Standard +Peripherals Library Drivers  update History


+

V3.5.0 / 11-March-2011

+

Main +Changes

+ +
    +
  • stm32f10x_can.h/.c files:
  • +
      +
    • Add 5 new functions
    • +
        +
      • 3 +new functions controlling the counter errors: CAN_GetLastErrorCode(), +CAN_GetReceiveErrorCounter() and CAN_GetLSBTransmitErrorCounter().
      • +
      +
        +
      • 1 new function to select the CAN operating mode: CAN_OperatingModeRequest().
      • +
      +
        +
      • 1 new function to support CAN TT mode: CAN_TTComModeCmd().
        +
      • +
      +
    • CAN_TransmitStatus() function updated to support all CAN transmit intermediate states
      +
    • +
    +
  • stm32f10x_i2c.h/.c files:
  • +
      +
    • Add 1 new function:
    • +
        +
      • I2C_NACKPositionConfig(): +This function configures the same bit (POS) as I2C_PECPositionConfig() +but is intended to be used in I2C mode while I2C_PECPositionConfig() is +intended to used in SMBUS mode.
      • +
      +
    +
  • stm32f10x_tim.h/.c files:
  • +
      +
    • Change the TIM_DMABurstLength_xBytes definitions to TIM_DMABurstLength_xTansfers
      +
    • +
    + + +
+ +

3.4.0 +- 10/15/2010

+ +
    +
  1. General
  2. +
+ +
    +
  • Add support for STM32F10x High-density value line devices.
  • +
+ +
    +
  1. STM32F10x_StdPeriph_Driver
  2. +
+ + +
    + +
  • stm32f10x_bkp.h/.c
  • +
      +
    • Delete BKP registers definition from stm32f10x_bkp.c and use defines within stm32f10x.h file.
    • +
    +
  • stm32f10x_can.h/.c
  • +
      +
    • Delete CAN registers definition from stm32f10x_can.c and use defines within stm32f10x.h file.
      +
    • +
    • Update the wording of some defines and Asserts macro.
      +
    • +
    • CAN_GetFlagStatus() +and CAN_ClearFlag() functions: updated to support new flags (were not +supported in previous version). These flags are:  CAN_FLAG_RQCP0, +CAN_FLAG_RQCP1, CAN_FLAG_RQCP2, CAN_FLAG_FMP1, CAN_FLAG_FF1, +CAN_FLAG_FOV1, CAN_FLAG_FMP0, CAN_FLAG_FF0,   CAN_FLAG_FOV0, +CAN_FLAG_WKU, CAN_FLAG_SLAK and CAN_FLAG_LEC.
      +
    • +
    • CAN_GetITStatus() +function: add a check of the interrupt enable bit before getting the +status of corresponding interrupt pending bit.
      +
    • +
    • CAN_ClearITPendingBit() function: correct the procedure to clear the interrupt pending bit.
      +
    • +
    +
  • stm32f10x_crc.h/.c
  • +
      +
    • Delete CRC registers definition from stm32f10x_crc.c and use defines within stm32f10x.h file.
    • +
    +
  • stm32f10x_dac.h/.c
  • +
      +
    • Delete DAC registers definition from stm32f10x_dac.c and use defines within stm32f10x.h file.
    • +
    +
  • stm32f10x_dbgmcu.h/.c
  • +
      +
    • Delete DBGMCU registers definition from stm32f10x_dbgmcu.c and use defines within stm32f10x.h file.
    • +
    +
  • stm32f10x_dma.h/.c
  • +
      +
    • Delete DMA registers definition from stm32f10x_dma.c and use defines within stm32f10x.h file.
    • +
    • Add new function "void DMA_SetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx, uint16_t DataNumber);"
      +
    • +
    +
  • stm32f10x_flash.h/.c
  • +
      +
    • FLASH functions (Erase and Program) updated to always clear the "PG", "MER" and "PER" bits even in case of TimeOut Error.
    • +
    +
  • stm32f10x_fsmc.h/.c
  • +
      +
    • Add new member "FSMC_AsynchronousWait" in "FSMC_NORSRAMInitTypeDef" structure.
    • +
    +
  • stm32f10x_gpio.h/.c
  • +
      +
    • GPIO_PinRemapConfig() function: add new values for GPIO_Remap parameter, to support new remap for TIM6, TIM7 and DAC DMA requests, TIM12 and DAC Triggers / DMA2_Channel5 Interrupt mapping.
    • +
    +
  • stm32f10x_pwr.h/.c
  • +
      +
    • Delete PWR registers definition from stm32f10x_pwr.c and use defines within stm32f10x.h and core_cm3.h files.
    • +
    +
  • stm32f10x_rtc.h/.c
  • +
      +
    • Delete RTC registers definition from stm32f10x_rtc.c and use defines within stm32f10x.h file.
    • +
    +
  • stm32f10x_spi.h/.c
  • +
      +
    • Add new definition for I2S Audio Clock frequencies "I2S_AudioFreq_192k".
    • +
    +
  • stm32f10x_tim.h/.c
  • +
    • Add new definition for TIM Input Capture Polarity "TIM_ICPolarity_BothEdge".
    + +
+ +

3.3.0 +- 04/16/2010

+ +
  1. General
+
  • Add support for STM32F10x XL-density devices.
  • I2C driver: events description and management enhancement.
+
  1. STM32F10x_StdPeriph_Driver
+
  • stm32f10x_dbgmcu.h/.c
    • DBGMCU_Config() function: add new values DBGMCU_TIMx_STOP (x: 9..14) for DBGMCU_Periph parameter.
  • stm32f10x_flash.h/.c: +updated to support Bank2 of XL-density devices (up to 1MByte of Flash +memory). For more details, refer to the description provided within +stm32f10x_flash.c file.
  • stm32f10x_gpio.h/.c
    • GPIO_PinRemapConfig() function: add new values for GPIO_Remap parameter, to support new remap for FSMC_NADV pin and TIM9..11,13,14.
  • stm32f10x_i2c.h/.c: I2C events description and management enhancement.
    • I2C_CheckEvent() +function: updated to check whether the last event contains the +I2C_EVENT  (instead of check whether the last event is equal to +I2C_EVENT)
    • Add +detailed description of I2C events and how to manage them using the +functions provided by this driver. For more information, refer to +stm32f10x_i2c.h and stm32f10x_i2c.c files.
  • stm32f10x_rcc.h/.c: updated to support TIM9..TIM14 APB clock and reset configuration
  • stm32f10x_tim.h/.c: updated to support new Timers TIM9..TIM14.
  • stm32f10x_sdio.h: 
    • SDIO_SetSDIOReadWaitMode() function: correct values of SDIO_ReadWaitMode parameter
      change
        +#define +SDIO_ReadWaitMode_CLK               +  ((uint32_t)0x00000000)
        #define +SDIO_ReadWaitMode_DATA2             +((uint32_t)0x00000001)
      by
        #define +SDIO_ReadWaitMode_CLK               +  ((uint32_t)0x00000001)
        #define +SDIO_ReadWaitMode_DATA2             +((uint32_t)0x00000000)
+

3.2.0 +- 03/01/2010

+
    +
  1. General
  2. +
+
    + +
  • Add support +for STM32 Low-density Value line (STM32F100x4/6) and +Medium-density Value line (STM32F100x8/B) devices.
  • +
  • Almost +peripherals drivers were updated to support Value +line devices features
  • +
  • Drivers limitations fix and enhancements.
  • + +
+
    +
  1. STM32F10x_StdPeriph_Driver
  2. +
+
    +
  • Add new +firmware driver for CEC peripheral: stm32f10x_cec.h and stm32f10x_cec.c
  • +
  • Timers drivers stm32f10x_tim.h/.c: add support for new General Purpose Timers: TIM15, TIM16 and TIM17.
  • +
  • RCC driver: add support for new Value peripherals: HDMI-CEC, TIM15, TIM16 and TIM17.
  • +
  • GPIO driver: add new remap parameters for TIM1, TIM15, TIM16, TIM17 and HDMI-CEC: GPIO_Remap_TIM1_DMA, GPIO_Remap_TIM15, GPIO_Remap_TIM16, GPIO_Remap_TIM17, GPIO_Remap_CEC.
  • +
  • USART +driver: add support for Oversampling by 8 mode and onebit method. 2 +functions has been added: USART_OverSampling8Cmd() and +USART_OneBitMethodCmd().
    +
  • +
  • DAC +driver: add new functions handling the DAC under run feature: +DAC_ITConfig(), DAC_GetFlagStatus(), DAC_ClearFlag(), DAC_GetITStatus() +and DAC_ClearITPendingBit().
  • +
  • DBGMCU driver: add new parameters for TIM15, TIM16 and TIM17: DBGMCU_TIM15_STOP, DBGMCU_TIM16_STOP, DBGMCU_TIM17_STOP.
    +
  • +
  • FLASH +driver: the FLASH_EraseOptionBytes() function updated. This is now just +erasing the option bytes without modifying the RDP status either +enabled or disabled.
  • +
  • PWR +driver: the PWR_EnterSTOPMode() function updated. When woken up from +STOP mode, this function resets again the SLEEPDEEP bit in the +Cortex-M3 System Control register to allow Sleep mode entering.
  • + + +
+

License

+

The +enclosed firmware and all the related documentation are not covered by +a License Agreement, if you need such License you can contact your +local STMicroelectronics office.

+

THE +PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS +WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO +SAVE TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR +ANY DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY +CLAIMS ARISING FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY +CUSTOMERS OF THE CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH +THEIR PRODUCTS.

+

 

+
+
+

For +complete documentation on STM32(CORTEX M3) 32-Bit Microcontrollers +visit www.st.com/STM32

+
+

+
+
+

 

+
+ \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/misc.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/misc.h new file mode 100644 index 0000000..7d401ca --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/misc.h @@ -0,0 +1,220 @@ +/** + ****************************************************************************** + * @file misc.h + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief This file contains all the functions prototypes for the miscellaneous + * firmware library functions (add-on to CMSIS functions). + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __MISC_H +#define __MISC_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup MISC + * @{ + */ + +/** @defgroup MISC_Exported_Types + * @{ + */ + +/** + * @brief NVIC Init Structure definition + */ + +typedef struct +{ + uint8_t NVIC_IRQChannel; /*!< Specifies the IRQ channel to be enabled or disabled. + This parameter can be a value of @ref IRQn_Type + (For the complete STM32 Devices IRQ Channels list, please + refer to stm32f10x.h file) */ + + uint8_t NVIC_IRQChannelPreemptionPriority; /*!< Specifies the pre-emption priority for the IRQ channel + specified in NVIC_IRQChannel. This parameter can be a value + between 0 and 15 as described in the table @ref NVIC_Priority_Table */ + + uint8_t NVIC_IRQChannelSubPriority; /*!< Specifies the subpriority level for the IRQ channel specified + in NVIC_IRQChannel. This parameter can be a value + between 0 and 15 as described in the table @ref NVIC_Priority_Table */ + + FunctionalState NVIC_IRQChannelCmd; /*!< Specifies whether the IRQ channel defined in NVIC_IRQChannel + will be enabled or disabled. + This parameter can be set either to ENABLE or DISABLE */ +} NVIC_InitTypeDef; + +/** + * @} + */ + +/** @defgroup NVIC_Priority_Table + * @{ + */ + +/** +@code + The table below gives the allowed values of the pre-emption priority and subpriority according + to the Priority Grouping configuration performed by NVIC_PriorityGroupConfig function + ============================================================================================================================ + NVIC_PriorityGroup | NVIC_IRQChannelPreemptionPriority | NVIC_IRQChannelSubPriority | Description + ============================================================================================================================ + NVIC_PriorityGroup_0 | 0 | 0-15 | 0 bits for pre-emption priority + | | | 4 bits for subpriority + ---------------------------------------------------------------------------------------------------------------------------- + NVIC_PriorityGroup_1 | 0-1 | 0-7 | 1 bits for pre-emption priority + | | | 3 bits for subpriority + ---------------------------------------------------------------------------------------------------------------------------- + NVIC_PriorityGroup_2 | 0-3 | 0-3 | 2 bits for pre-emption priority + | | | 2 bits for subpriority + ---------------------------------------------------------------------------------------------------------------------------- + NVIC_PriorityGroup_3 | 0-7 | 0-1 | 3 bits for pre-emption priority + | | | 1 bits for subpriority + ---------------------------------------------------------------------------------------------------------------------------- + NVIC_PriorityGroup_4 | 0-15 | 0 | 4 bits for pre-emption priority + | | | 0 bits for subpriority + ============================================================================================================================ +@endcode +*/ + +/** + * @} + */ + +/** @defgroup MISC_Exported_Constants + * @{ + */ + +/** @defgroup Vector_Table_Base + * @{ + */ + +#define NVIC_VectTab_RAM ((uint32_t)0x20000000) +#define NVIC_VectTab_FLASH ((uint32_t)0x08000000) +#define IS_NVIC_VECTTAB(VECTTAB) (((VECTTAB) == NVIC_VectTab_RAM) || \ + ((VECTTAB) == NVIC_VectTab_FLASH)) +/** + * @} + */ + +/** @defgroup System_Low_Power + * @{ + */ + +#define NVIC_LP_SEVONPEND ((uint8_t)0x10) +#define NVIC_LP_SLEEPDEEP ((uint8_t)0x04) +#define NVIC_LP_SLEEPONEXIT ((uint8_t)0x02) +#define IS_NVIC_LP(LP) (((LP) == NVIC_LP_SEVONPEND) || \ + ((LP) == NVIC_LP_SLEEPDEEP) || \ + ((LP) == NVIC_LP_SLEEPONEXIT)) +/** + * @} + */ + +/** @defgroup Preemption_Priority_Group + * @{ + */ + +#define NVIC_PriorityGroup_0 ((uint32_t)0x700) /*!< 0 bits for pre-emption priority + 4 bits for subpriority */ +#define NVIC_PriorityGroup_1 ((uint32_t)0x600) /*!< 1 bits for pre-emption priority + 3 bits for subpriority */ +#define NVIC_PriorityGroup_2 ((uint32_t)0x500) /*!< 2 bits for pre-emption priority + 2 bits for subpriority */ +#define NVIC_PriorityGroup_3 ((uint32_t)0x400) /*!< 3 bits for pre-emption priority + 1 bits for subpriority */ +#define NVIC_PriorityGroup_4 ((uint32_t)0x300) /*!< 4 bits for pre-emption priority + 0 bits for subpriority */ + +#define IS_NVIC_PRIORITY_GROUP(GROUP) (((GROUP) == NVIC_PriorityGroup_0) || \ + ((GROUP) == NVIC_PriorityGroup_1) || \ + ((GROUP) == NVIC_PriorityGroup_2) || \ + ((GROUP) == NVIC_PriorityGroup_3) || \ + ((GROUP) == NVIC_PriorityGroup_4)) + +#define IS_NVIC_PREEMPTION_PRIORITY(PRIORITY) ((PRIORITY) < 0x10) + +#define IS_NVIC_SUB_PRIORITY(PRIORITY) ((PRIORITY) < 0x10) + +#define IS_NVIC_OFFSET(OFFSET) ((OFFSET) < 0x000FFFFF) + +/** + * @} + */ + +/** @defgroup SysTick_clock_source + * @{ + */ + +#define SysTick_CLKSource_HCLK_Div8 ((uint32_t)0xFFFFFFFB) +#define SysTick_CLKSource_HCLK ((uint32_t)0x00000004) +#define IS_SYSTICK_CLK_SOURCE(SOURCE) (((SOURCE) == SysTick_CLKSource_HCLK) || \ + ((SOURCE) == SysTick_CLKSource_HCLK_Div8)) +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup MISC_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup MISC_Exported_Functions + * @{ + */ + +void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup); +void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct); +void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset); +void NVIC_SystemLPConfig(uint8_t LowPowerMode, FunctionalState NewState); +void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource); + +#ifdef __cplusplus +} +#endif + +#endif /* __MISC_H */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_adc.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_adc.h new file mode 100644 index 0000000..d1b2653 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_adc.h @@ -0,0 +1,483 @@ +/** + ****************************************************************************** + * @file stm32f10x_adc.h + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief This file contains all the functions prototypes for the ADC firmware + * library. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_ADC_H +#define __STM32F10x_ADC_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup ADC + * @{ + */ + +/** @defgroup ADC_Exported_Types + * @{ + */ + +/** + * @brief ADC Init structure definition + */ + +typedef struct +{ + uint32_t ADC_Mode; /*!< Configures the ADC to operate in independent or + dual mode. + This parameter can be a value of @ref ADC_mode */ + + FunctionalState ADC_ScanConvMode; /*!< Specifies whether the conversion is performed in + Scan (multichannels) or Single (one channel) mode. + This parameter can be set to ENABLE or DISABLE */ + + FunctionalState ADC_ContinuousConvMode; /*!< Specifies whether the conversion is performed in + Continuous or Single mode. + This parameter can be set to ENABLE or DISABLE. */ + + uint32_t ADC_ExternalTrigConv; /*!< Defines the external trigger used to start the analog + to digital conversion of regular channels. This parameter + can be a value of @ref ADC_external_trigger_sources_for_regular_channels_conversion */ + + uint32_t ADC_DataAlign; /*!< Specifies whether the ADC data alignment is left or right. + This parameter can be a value of @ref ADC_data_align */ + + uint8_t ADC_NbrOfChannel; /*!< Specifies the number of ADC channels that will be converted + using the sequencer for regular channel group. + This parameter must range from 1 to 16. */ +}ADC_InitTypeDef; +/** + * @} + */ + +/** @defgroup ADC_Exported_Constants + * @{ + */ + +#define IS_ADC_ALL_PERIPH(PERIPH) (((PERIPH) == ADC1) || \ + ((PERIPH) == ADC2) || \ + ((PERIPH) == ADC3)) + +#define IS_ADC_DMA_PERIPH(PERIPH) (((PERIPH) == ADC1) || \ + ((PERIPH) == ADC3)) + +/** @defgroup ADC_mode + * @{ + */ + +#define ADC_Mode_Independent ((uint32_t)0x00000000) +#define ADC_Mode_RegInjecSimult ((uint32_t)0x00010000) +#define ADC_Mode_RegSimult_AlterTrig ((uint32_t)0x00020000) +#define ADC_Mode_InjecSimult_FastInterl ((uint32_t)0x00030000) +#define ADC_Mode_InjecSimult_SlowInterl ((uint32_t)0x00040000) +#define ADC_Mode_InjecSimult ((uint32_t)0x00050000) +#define ADC_Mode_RegSimult ((uint32_t)0x00060000) +#define ADC_Mode_FastInterl ((uint32_t)0x00070000) +#define ADC_Mode_SlowInterl ((uint32_t)0x00080000) +#define ADC_Mode_AlterTrig ((uint32_t)0x00090000) + +#define IS_ADC_MODE(MODE) (((MODE) == ADC_Mode_Independent) || \ + ((MODE) == ADC_Mode_RegInjecSimult) || \ + ((MODE) == ADC_Mode_RegSimult_AlterTrig) || \ + ((MODE) == ADC_Mode_InjecSimult_FastInterl) || \ + ((MODE) == ADC_Mode_InjecSimult_SlowInterl) || \ + ((MODE) == ADC_Mode_InjecSimult) || \ + ((MODE) == ADC_Mode_RegSimult) || \ + ((MODE) == ADC_Mode_FastInterl) || \ + ((MODE) == ADC_Mode_SlowInterl) || \ + ((MODE) == ADC_Mode_AlterTrig)) +/** + * @} + */ + +/** @defgroup ADC_external_trigger_sources_for_regular_channels_conversion + * @{ + */ + +#define ADC_ExternalTrigConv_T1_CC1 ((uint32_t)0x00000000) /*!< For ADC1 and ADC2 */ +#define ADC_ExternalTrigConv_T1_CC2 ((uint32_t)0x00020000) /*!< For ADC1 and ADC2 */ +#define ADC_ExternalTrigConv_T2_CC2 ((uint32_t)0x00060000) /*!< For ADC1 and ADC2 */ +#define ADC_ExternalTrigConv_T3_TRGO ((uint32_t)0x00080000) /*!< For ADC1 and ADC2 */ +#define ADC_ExternalTrigConv_T4_CC4 ((uint32_t)0x000A0000) /*!< For ADC1 and ADC2 */ +#define ADC_ExternalTrigConv_Ext_IT11_TIM8_TRGO ((uint32_t)0x000C0000) /*!< For ADC1 and ADC2 */ + +#define ADC_ExternalTrigConv_T1_CC3 ((uint32_t)0x00040000) /*!< For ADC1, ADC2 and ADC3 */ +#define ADC_ExternalTrigConv_None ((uint32_t)0x000E0000) /*!< For ADC1, ADC2 and ADC3 */ + +#define ADC_ExternalTrigConv_T3_CC1 ((uint32_t)0x00000000) /*!< For ADC3 only */ +#define ADC_ExternalTrigConv_T2_CC3 ((uint32_t)0x00020000) /*!< For ADC3 only */ +#define ADC_ExternalTrigConv_T8_CC1 ((uint32_t)0x00060000) /*!< For ADC3 only */ +#define ADC_ExternalTrigConv_T8_TRGO ((uint32_t)0x00080000) /*!< For ADC3 only */ +#define ADC_ExternalTrigConv_T5_CC1 ((uint32_t)0x000A0000) /*!< For ADC3 only */ +#define ADC_ExternalTrigConv_T5_CC3 ((uint32_t)0x000C0000) /*!< For ADC3 only */ + +#define IS_ADC_EXT_TRIG(REGTRIG) (((REGTRIG) == ADC_ExternalTrigConv_T1_CC1) || \ + ((REGTRIG) == ADC_ExternalTrigConv_T1_CC2) || \ + ((REGTRIG) == ADC_ExternalTrigConv_T1_CC3) || \ + ((REGTRIG) == ADC_ExternalTrigConv_T2_CC2) || \ + ((REGTRIG) == ADC_ExternalTrigConv_T3_TRGO) || \ + ((REGTRIG) == ADC_ExternalTrigConv_T4_CC4) || \ + ((REGTRIG) == ADC_ExternalTrigConv_Ext_IT11_TIM8_TRGO) || \ + ((REGTRIG) == ADC_ExternalTrigConv_None) || \ + ((REGTRIG) == ADC_ExternalTrigConv_T3_CC1) || \ + ((REGTRIG) == ADC_ExternalTrigConv_T2_CC3) || \ + ((REGTRIG) == ADC_ExternalTrigConv_T8_CC1) || \ + ((REGTRIG) == ADC_ExternalTrigConv_T8_TRGO) || \ + ((REGTRIG) == ADC_ExternalTrigConv_T5_CC1) || \ + ((REGTRIG) == ADC_ExternalTrigConv_T5_CC3)) +/** + * @} + */ + +/** @defgroup ADC_data_align + * @{ + */ + +#define ADC_DataAlign_Right ((uint32_t)0x00000000) +#define ADC_DataAlign_Left ((uint32_t)0x00000800) +#define IS_ADC_DATA_ALIGN(ALIGN) (((ALIGN) == ADC_DataAlign_Right) || \ + ((ALIGN) == ADC_DataAlign_Left)) +/** + * @} + */ + +/** @defgroup ADC_channels + * @{ + */ + +#define ADC_Channel_0 ((uint8_t)0x00) +#define ADC_Channel_1 ((uint8_t)0x01) +#define ADC_Channel_2 ((uint8_t)0x02) +#define ADC_Channel_3 ((uint8_t)0x03) +#define ADC_Channel_4 ((uint8_t)0x04) +#define ADC_Channel_5 ((uint8_t)0x05) +#define ADC_Channel_6 ((uint8_t)0x06) +#define ADC_Channel_7 ((uint8_t)0x07) +#define ADC_Channel_8 ((uint8_t)0x08) +#define ADC_Channel_9 ((uint8_t)0x09) +#define ADC_Channel_10 ((uint8_t)0x0A) +#define ADC_Channel_11 ((uint8_t)0x0B) +#define ADC_Channel_12 ((uint8_t)0x0C) +#define ADC_Channel_13 ((uint8_t)0x0D) +#define ADC_Channel_14 ((uint8_t)0x0E) +#define ADC_Channel_15 ((uint8_t)0x0F) +#define ADC_Channel_16 ((uint8_t)0x10) +#define ADC_Channel_17 ((uint8_t)0x11) + +#define ADC_Channel_TempSensor ((uint8_t)ADC_Channel_16) +#define ADC_Channel_Vrefint ((uint8_t)ADC_Channel_17) + +#define IS_ADC_CHANNEL(CHANNEL) (((CHANNEL) == ADC_Channel_0) || ((CHANNEL) == ADC_Channel_1) || \ + ((CHANNEL) == ADC_Channel_2) || ((CHANNEL) == ADC_Channel_3) || \ + ((CHANNEL) == ADC_Channel_4) || ((CHANNEL) == ADC_Channel_5) || \ + ((CHANNEL) == ADC_Channel_6) || ((CHANNEL) == ADC_Channel_7) || \ + ((CHANNEL) == ADC_Channel_8) || ((CHANNEL) == ADC_Channel_9) || \ + ((CHANNEL) == ADC_Channel_10) || ((CHANNEL) == ADC_Channel_11) || \ + ((CHANNEL) == ADC_Channel_12) || ((CHANNEL) == ADC_Channel_13) || \ + ((CHANNEL) == ADC_Channel_14) || ((CHANNEL) == ADC_Channel_15) || \ + ((CHANNEL) == ADC_Channel_16) || ((CHANNEL) == ADC_Channel_17)) +/** + * @} + */ + +/** @defgroup ADC_sampling_time + * @{ + */ + +#define ADC_SampleTime_1Cycles5 ((uint8_t)0x00) +#define ADC_SampleTime_7Cycles5 ((uint8_t)0x01) +#define ADC_SampleTime_13Cycles5 ((uint8_t)0x02) +#define ADC_SampleTime_28Cycles5 ((uint8_t)0x03) +#define ADC_SampleTime_41Cycles5 ((uint8_t)0x04) +#define ADC_SampleTime_55Cycles5 ((uint8_t)0x05) +#define ADC_SampleTime_71Cycles5 ((uint8_t)0x06) +#define ADC_SampleTime_239Cycles5 ((uint8_t)0x07) +#define IS_ADC_SAMPLE_TIME(TIME) (((TIME) == ADC_SampleTime_1Cycles5) || \ + ((TIME) == ADC_SampleTime_7Cycles5) || \ + ((TIME) == ADC_SampleTime_13Cycles5) || \ + ((TIME) == ADC_SampleTime_28Cycles5) || \ + ((TIME) == ADC_SampleTime_41Cycles5) || \ + ((TIME) == ADC_SampleTime_55Cycles5) || \ + ((TIME) == ADC_SampleTime_71Cycles5) || \ + ((TIME) == ADC_SampleTime_239Cycles5)) +/** + * @} + */ + +/** @defgroup ADC_external_trigger_sources_for_injected_channels_conversion + * @{ + */ + +#define ADC_ExternalTrigInjecConv_T2_TRGO ((uint32_t)0x00002000) /*!< For ADC1 and ADC2 */ +#define ADC_ExternalTrigInjecConv_T2_CC1 ((uint32_t)0x00003000) /*!< For ADC1 and ADC2 */ +#define ADC_ExternalTrigInjecConv_T3_CC4 ((uint32_t)0x00004000) /*!< For ADC1 and ADC2 */ +#define ADC_ExternalTrigInjecConv_T4_TRGO ((uint32_t)0x00005000) /*!< For ADC1 and ADC2 */ +#define ADC_ExternalTrigInjecConv_Ext_IT15_TIM8_CC4 ((uint32_t)0x00006000) /*!< For ADC1 and ADC2 */ + +#define ADC_ExternalTrigInjecConv_T1_TRGO ((uint32_t)0x00000000) /*!< For ADC1, ADC2 and ADC3 */ +#define ADC_ExternalTrigInjecConv_T1_CC4 ((uint32_t)0x00001000) /*!< For ADC1, ADC2 and ADC3 */ +#define ADC_ExternalTrigInjecConv_None ((uint32_t)0x00007000) /*!< For ADC1, ADC2 and ADC3 */ + +#define ADC_ExternalTrigInjecConv_T4_CC3 ((uint32_t)0x00002000) /*!< For ADC3 only */ +#define ADC_ExternalTrigInjecConv_T8_CC2 ((uint32_t)0x00003000) /*!< For ADC3 only */ +#define ADC_ExternalTrigInjecConv_T8_CC4 ((uint32_t)0x00004000) /*!< For ADC3 only */ +#define ADC_ExternalTrigInjecConv_T5_TRGO ((uint32_t)0x00005000) /*!< For ADC3 only */ +#define ADC_ExternalTrigInjecConv_T5_CC4 ((uint32_t)0x00006000) /*!< For ADC3 only */ + +#define IS_ADC_EXT_INJEC_TRIG(INJTRIG) (((INJTRIG) == ADC_ExternalTrigInjecConv_T1_TRGO) || \ + ((INJTRIG) == ADC_ExternalTrigInjecConv_T1_CC4) || \ + ((INJTRIG) == ADC_ExternalTrigInjecConv_T2_TRGO) || \ + ((INJTRIG) == ADC_ExternalTrigInjecConv_T2_CC1) || \ + ((INJTRIG) == ADC_ExternalTrigInjecConv_T3_CC4) || \ + ((INJTRIG) == ADC_ExternalTrigInjecConv_T4_TRGO) || \ + ((INJTRIG) == ADC_ExternalTrigInjecConv_Ext_IT15_TIM8_CC4) || \ + ((INJTRIG) == ADC_ExternalTrigInjecConv_None) || \ + ((INJTRIG) == ADC_ExternalTrigInjecConv_T4_CC3) || \ + ((INJTRIG) == ADC_ExternalTrigInjecConv_T8_CC2) || \ + ((INJTRIG) == ADC_ExternalTrigInjecConv_T8_CC4) || \ + ((INJTRIG) == ADC_ExternalTrigInjecConv_T5_TRGO) || \ + ((INJTRIG) == ADC_ExternalTrigInjecConv_T5_CC4)) +/** + * @} + */ + +/** @defgroup ADC_injected_channel_selection + * @{ + */ + +#define ADC_InjectedChannel_1 ((uint8_t)0x14) +#define ADC_InjectedChannel_2 ((uint8_t)0x18) +#define ADC_InjectedChannel_3 ((uint8_t)0x1C) +#define ADC_InjectedChannel_4 ((uint8_t)0x20) +#define IS_ADC_INJECTED_CHANNEL(CHANNEL) (((CHANNEL) == ADC_InjectedChannel_1) || \ + ((CHANNEL) == ADC_InjectedChannel_2) || \ + ((CHANNEL) == ADC_InjectedChannel_3) || \ + ((CHANNEL) == ADC_InjectedChannel_4)) +/** + * @} + */ + +/** @defgroup ADC_analog_watchdog_selection + * @{ + */ + +#define ADC_AnalogWatchdog_SingleRegEnable ((uint32_t)0x00800200) +#define ADC_AnalogWatchdog_SingleInjecEnable ((uint32_t)0x00400200) +#define ADC_AnalogWatchdog_SingleRegOrInjecEnable ((uint32_t)0x00C00200) +#define ADC_AnalogWatchdog_AllRegEnable ((uint32_t)0x00800000) +#define ADC_AnalogWatchdog_AllInjecEnable ((uint32_t)0x00400000) +#define ADC_AnalogWatchdog_AllRegAllInjecEnable ((uint32_t)0x00C00000) +#define ADC_AnalogWatchdog_None ((uint32_t)0x00000000) + +#define IS_ADC_ANALOG_WATCHDOG(WATCHDOG) (((WATCHDOG) == ADC_AnalogWatchdog_SingleRegEnable) || \ + ((WATCHDOG) == ADC_AnalogWatchdog_SingleInjecEnable) || \ + ((WATCHDOG) == ADC_AnalogWatchdog_SingleRegOrInjecEnable) || \ + ((WATCHDOG) == ADC_AnalogWatchdog_AllRegEnable) || \ + ((WATCHDOG) == ADC_AnalogWatchdog_AllInjecEnable) || \ + ((WATCHDOG) == ADC_AnalogWatchdog_AllRegAllInjecEnable) || \ + ((WATCHDOG) == ADC_AnalogWatchdog_None)) +/** + * @} + */ + +/** @defgroup ADC_interrupts_definition + * @{ + */ + +#define ADC_IT_EOC ((uint16_t)0x0220) +#define ADC_IT_AWD ((uint16_t)0x0140) +#define ADC_IT_JEOC ((uint16_t)0x0480) + +#define IS_ADC_IT(IT) ((((IT) & (uint16_t)0xF81F) == 0x00) && ((IT) != 0x00)) + +#define IS_ADC_GET_IT(IT) (((IT) == ADC_IT_EOC) || ((IT) == ADC_IT_AWD) || \ + ((IT) == ADC_IT_JEOC)) +/** + * @} + */ + +/** @defgroup ADC_flags_definition + * @{ + */ + +#define ADC_FLAG_AWD ((uint8_t)0x01) +#define ADC_FLAG_EOC ((uint8_t)0x02) +#define ADC_FLAG_JEOC ((uint8_t)0x04) +#define ADC_FLAG_JSTRT ((uint8_t)0x08) +#define ADC_FLAG_STRT ((uint8_t)0x10) +#define IS_ADC_CLEAR_FLAG(FLAG) ((((FLAG) & (uint8_t)0xE0) == 0x00) && ((FLAG) != 0x00)) +#define IS_ADC_GET_FLAG(FLAG) (((FLAG) == ADC_FLAG_AWD) || ((FLAG) == ADC_FLAG_EOC) || \ + ((FLAG) == ADC_FLAG_JEOC) || ((FLAG)== ADC_FLAG_JSTRT) || \ + ((FLAG) == ADC_FLAG_STRT)) +/** + * @} + */ + +/** @defgroup ADC_thresholds + * @{ + */ + +#define IS_ADC_THRESHOLD(THRESHOLD) ((THRESHOLD) <= 0xFFF) + +/** + * @} + */ + +/** @defgroup ADC_injected_offset + * @{ + */ + +#define IS_ADC_OFFSET(OFFSET) ((OFFSET) <= 0xFFF) + +/** + * @} + */ + +/** @defgroup ADC_injected_length + * @{ + */ + +#define IS_ADC_INJECTED_LENGTH(LENGTH) (((LENGTH) >= 0x1) && ((LENGTH) <= 0x4)) + +/** + * @} + */ + +/** @defgroup ADC_injected_rank + * @{ + */ + +#define IS_ADC_INJECTED_RANK(RANK) (((RANK) >= 0x1) && ((RANK) <= 0x4)) + +/** + * @} + */ + + +/** @defgroup ADC_regular_length + * @{ + */ + +#define IS_ADC_REGULAR_LENGTH(LENGTH) (((LENGTH) >= 0x1) && ((LENGTH) <= 0x10)) +/** + * @} + */ + +/** @defgroup ADC_regular_rank + * @{ + */ + +#define IS_ADC_REGULAR_RANK(RANK) (((RANK) >= 0x1) && ((RANK) <= 0x10)) + +/** + * @} + */ + +/** @defgroup ADC_regular_discontinuous_mode_number + * @{ + */ + +#define IS_ADC_REGULAR_DISC_NUMBER(NUMBER) (((NUMBER) >= 0x1) && ((NUMBER) <= 0x8)) + +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup ADC_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup ADC_Exported_Functions + * @{ + */ + +void ADC_DeInit(ADC_TypeDef* ADCx); +void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct); +void ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct); +void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState); +void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState); +void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState); +void ADC_ResetCalibration(ADC_TypeDef* ADCx); +FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx); +void ADC_StartCalibration(ADC_TypeDef* ADCx); +FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx); +void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState); +FlagStatus ADC_GetSoftwareStartConvStatus(ADC_TypeDef* ADCx); +void ADC_DiscModeChannelCountConfig(ADC_TypeDef* ADCx, uint8_t Number); +void ADC_DiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState); +void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime); +void ADC_ExternalTrigConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState); +uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx); +uint32_t ADC_GetDualModeConversionValue(void); +void ADC_AutoInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState); +void ADC_InjectedDiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState); +void ADC_ExternalTrigInjectedConvConfig(ADC_TypeDef* ADCx, uint32_t ADC_ExternalTrigInjecConv); +void ADC_ExternalTrigInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState); +void ADC_SoftwareStartInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState); +FlagStatus ADC_GetSoftwareStartInjectedConvCmdStatus(ADC_TypeDef* ADCx); +void ADC_InjectedChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime); +void ADC_InjectedSequencerLengthConfig(ADC_TypeDef* ADCx, uint8_t Length); +void ADC_SetInjectedOffset(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel, uint16_t Offset); +uint16_t ADC_GetInjectedConversionValue(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel); +void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx, uint32_t ADC_AnalogWatchdog); +void ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef* ADCx, uint16_t HighThreshold, uint16_t LowThreshold); +void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel); +void ADC_TempSensorVrefintCmd(FunctionalState NewState); +FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG); +void ADC_ClearFlag(ADC_TypeDef* ADCx, uint8_t ADC_FLAG); +ITStatus ADC_GetITStatus(ADC_TypeDef* ADCx, uint16_t ADC_IT); +void ADC_ClearITPendingBit(ADC_TypeDef* ADCx, uint16_t ADC_IT); + +#ifdef __cplusplus +} +#endif + +#endif /*__STM32F10x_ADC_H */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_bkp.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_bkp.h new file mode 100644 index 0000000..b620753 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_bkp.h @@ -0,0 +1,195 @@ +/** + ****************************************************************************** + * @file stm32f10x_bkp.h + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief This file contains all the functions prototypes for the BKP firmware + * library. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_BKP_H +#define __STM32F10x_BKP_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup BKP + * @{ + */ + +/** @defgroup BKP_Exported_Types + * @{ + */ + +/** + * @} + */ + +/** @defgroup BKP_Exported_Constants + * @{ + */ + +/** @defgroup Tamper_Pin_active_level + * @{ + */ + +#define BKP_TamperPinLevel_High ((uint16_t)0x0000) +#define BKP_TamperPinLevel_Low ((uint16_t)0x0001) +#define IS_BKP_TAMPER_PIN_LEVEL(LEVEL) (((LEVEL) == BKP_TamperPinLevel_High) || \ + ((LEVEL) == BKP_TamperPinLevel_Low)) +/** + * @} + */ + +/** @defgroup RTC_output_source_to_output_on_the_Tamper_pin + * @{ + */ + +#define BKP_RTCOutputSource_None ((uint16_t)0x0000) +#define BKP_RTCOutputSource_CalibClock ((uint16_t)0x0080) +#define BKP_RTCOutputSource_Alarm ((uint16_t)0x0100) +#define BKP_RTCOutputSource_Second ((uint16_t)0x0300) +#define IS_BKP_RTC_OUTPUT_SOURCE(SOURCE) (((SOURCE) == BKP_RTCOutputSource_None) || \ + ((SOURCE) == BKP_RTCOutputSource_CalibClock) || \ + ((SOURCE) == BKP_RTCOutputSource_Alarm) || \ + ((SOURCE) == BKP_RTCOutputSource_Second)) +/** + * @} + */ + +/** @defgroup Data_Backup_Register + * @{ + */ + +#define BKP_DR1 ((uint16_t)0x0004) +#define BKP_DR2 ((uint16_t)0x0008) +#define BKP_DR3 ((uint16_t)0x000C) +#define BKP_DR4 ((uint16_t)0x0010) +#define BKP_DR5 ((uint16_t)0x0014) +#define BKP_DR6 ((uint16_t)0x0018) +#define BKP_DR7 ((uint16_t)0x001C) +#define BKP_DR8 ((uint16_t)0x0020) +#define BKP_DR9 ((uint16_t)0x0024) +#define BKP_DR10 ((uint16_t)0x0028) +#define BKP_DR11 ((uint16_t)0x0040) +#define BKP_DR12 ((uint16_t)0x0044) +#define BKP_DR13 ((uint16_t)0x0048) +#define BKP_DR14 ((uint16_t)0x004C) +#define BKP_DR15 ((uint16_t)0x0050) +#define BKP_DR16 ((uint16_t)0x0054) +#define BKP_DR17 ((uint16_t)0x0058) +#define BKP_DR18 ((uint16_t)0x005C) +#define BKP_DR19 ((uint16_t)0x0060) +#define BKP_DR20 ((uint16_t)0x0064) +#define BKP_DR21 ((uint16_t)0x0068) +#define BKP_DR22 ((uint16_t)0x006C) +#define BKP_DR23 ((uint16_t)0x0070) +#define BKP_DR24 ((uint16_t)0x0074) +#define BKP_DR25 ((uint16_t)0x0078) +#define BKP_DR26 ((uint16_t)0x007C) +#define BKP_DR27 ((uint16_t)0x0080) +#define BKP_DR28 ((uint16_t)0x0084) +#define BKP_DR29 ((uint16_t)0x0088) +#define BKP_DR30 ((uint16_t)0x008C) +#define BKP_DR31 ((uint16_t)0x0090) +#define BKP_DR32 ((uint16_t)0x0094) +#define BKP_DR33 ((uint16_t)0x0098) +#define BKP_DR34 ((uint16_t)0x009C) +#define BKP_DR35 ((uint16_t)0x00A0) +#define BKP_DR36 ((uint16_t)0x00A4) +#define BKP_DR37 ((uint16_t)0x00A8) +#define BKP_DR38 ((uint16_t)0x00AC) +#define BKP_DR39 ((uint16_t)0x00B0) +#define BKP_DR40 ((uint16_t)0x00B4) +#define BKP_DR41 ((uint16_t)0x00B8) +#define BKP_DR42 ((uint16_t)0x00BC) + +#define IS_BKP_DR(DR) (((DR) == BKP_DR1) || ((DR) == BKP_DR2) || ((DR) == BKP_DR3) || \ + ((DR) == BKP_DR4) || ((DR) == BKP_DR5) || ((DR) == BKP_DR6) || \ + ((DR) == BKP_DR7) || ((DR) == BKP_DR8) || ((DR) == BKP_DR9) || \ + ((DR) == BKP_DR10) || ((DR) == BKP_DR11) || ((DR) == BKP_DR12) || \ + ((DR) == BKP_DR13) || ((DR) == BKP_DR14) || ((DR) == BKP_DR15) || \ + ((DR) == BKP_DR16) || ((DR) == BKP_DR17) || ((DR) == BKP_DR18) || \ + ((DR) == BKP_DR19) || ((DR) == BKP_DR20) || ((DR) == BKP_DR21) || \ + ((DR) == BKP_DR22) || ((DR) == BKP_DR23) || ((DR) == BKP_DR24) || \ + ((DR) == BKP_DR25) || ((DR) == BKP_DR26) || ((DR) == BKP_DR27) || \ + ((DR) == BKP_DR28) || ((DR) == BKP_DR29) || ((DR) == BKP_DR30) || \ + ((DR) == BKP_DR31) || ((DR) == BKP_DR32) || ((DR) == BKP_DR33) || \ + ((DR) == BKP_DR34) || ((DR) == BKP_DR35) || ((DR) == BKP_DR36) || \ + ((DR) == BKP_DR37) || ((DR) == BKP_DR38) || ((DR) == BKP_DR39) || \ + ((DR) == BKP_DR40) || ((DR) == BKP_DR41) || ((DR) == BKP_DR42)) + +#define IS_BKP_CALIBRATION_VALUE(VALUE) ((VALUE) <= 0x7F) +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup BKP_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup BKP_Exported_Functions + * @{ + */ + +void BKP_DeInit(void); +void BKP_TamperPinLevelConfig(uint16_t BKP_TamperPinLevel); +void BKP_TamperPinCmd(FunctionalState NewState); +void BKP_ITConfig(FunctionalState NewState); +void BKP_RTCOutputConfig(uint16_t BKP_RTCOutputSource); +void BKP_SetRTCCalibrationValue(uint8_t CalibrationValue); +void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data); +uint16_t BKP_ReadBackupRegister(uint16_t BKP_DR); +FlagStatus BKP_GetFlagStatus(void); +void BKP_ClearFlag(void); +ITStatus BKP_GetITStatus(void); +void BKP_ClearITPendingBit(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F10x_BKP_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_can.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_can.h new file mode 100644 index 0000000..648f747 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_can.h @@ -0,0 +1,697 @@ +/** + ****************************************************************************** + * @file stm32f10x_can.h + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief This file contains all the functions prototypes for the CAN firmware + * library. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_CAN_H +#define __STM32F10x_CAN_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup CAN + * @{ + */ + +/** @defgroup CAN_Exported_Types + * @{ + */ + +#define IS_CAN_ALL_PERIPH(PERIPH) (((PERIPH) == CAN1) || \ + ((PERIPH) == CAN2)) + +/** + * @brief CAN init structure definition + */ + +typedef struct +{ + uint16_t CAN_Prescaler; /*!< Specifies the length of a time quantum. + It ranges from 1 to 1024. */ + + uint8_t CAN_Mode; /*!< Specifies the CAN operating mode. + This parameter can be a value of + @ref CAN_operating_mode */ + + uint8_t CAN_SJW; /*!< Specifies the maximum number of time quanta + the CAN hardware is allowed to lengthen or + shorten a bit to perform resynchronization. + This parameter can be a value of + @ref CAN_synchronisation_jump_width */ + + uint8_t CAN_BS1; /*!< Specifies the number of time quanta in Bit + Segment 1. This parameter can be a value of + @ref CAN_time_quantum_in_bit_segment_1 */ + + uint8_t CAN_BS2; /*!< Specifies the number of time quanta in Bit + Segment 2. + This parameter can be a value of + @ref CAN_time_quantum_in_bit_segment_2 */ + + FunctionalState CAN_TTCM; /*!< Enable or disable the time triggered + communication mode. This parameter can be set + either to ENABLE or DISABLE. */ + + FunctionalState CAN_ABOM; /*!< Enable or disable the automatic bus-off + management. This parameter can be set either + to ENABLE or DISABLE. */ + + FunctionalState CAN_AWUM; /*!< Enable or disable the automatic wake-up mode. + This parameter can be set either to ENABLE or + DISABLE. */ + + FunctionalState CAN_NART; /*!< Enable or disable the no-automatic + retransmission mode. This parameter can be + set either to ENABLE or DISABLE. */ + + FunctionalState CAN_RFLM; /*!< Enable or disable the Receive FIFO Locked mode. + This parameter can be set either to ENABLE + or DISABLE. */ + + FunctionalState CAN_TXFP; /*!< Enable or disable the transmit FIFO priority. + This parameter can be set either to ENABLE + or DISABLE. */ +} CAN_InitTypeDef; + +/** + * @brief CAN filter init structure definition + */ + +typedef struct +{ + uint16_t CAN_FilterIdHigh; /*!< Specifies the filter identification number (MSBs for a 32-bit + configuration, first one for a 16-bit configuration). + This parameter can be a value between 0x0000 and 0xFFFF */ + + uint16_t CAN_FilterIdLow; /*!< Specifies the filter identification number (LSBs for a 32-bit + configuration, second one for a 16-bit configuration). + This parameter can be a value between 0x0000 and 0xFFFF */ + + uint16_t CAN_FilterMaskIdHigh; /*!< Specifies the filter mask number or identification number, + according to the mode (MSBs for a 32-bit configuration, + first one for a 16-bit configuration). + This parameter can be a value between 0x0000 and 0xFFFF */ + + uint16_t CAN_FilterMaskIdLow; /*!< Specifies the filter mask number or identification number, + according to the mode (LSBs for a 32-bit configuration, + second one for a 16-bit configuration). + This parameter can be a value between 0x0000 and 0xFFFF */ + + uint16_t CAN_FilterFIFOAssignment; /*!< Specifies the FIFO (0 or 1) which will be assigned to the filter. + This parameter can be a value of @ref CAN_filter_FIFO */ + + uint8_t CAN_FilterNumber; /*!< Specifies the filter which will be initialized. It ranges from 0 to 13. */ + + uint8_t CAN_FilterMode; /*!< Specifies the filter mode to be initialized. + This parameter can be a value of @ref CAN_filter_mode */ + + uint8_t CAN_FilterScale; /*!< Specifies the filter scale. + This parameter can be a value of @ref CAN_filter_scale */ + + FunctionalState CAN_FilterActivation; /*!< Enable or disable the filter. + This parameter can be set either to ENABLE or DISABLE. */ +} CAN_FilterInitTypeDef; + +/** + * @brief CAN Tx message structure definition + */ + +typedef struct +{ + uint32_t StdId; /*!< Specifies the standard identifier. + This parameter can be a value between 0 to 0x7FF. */ + + uint32_t ExtId; /*!< Specifies the extended identifier. + This parameter can be a value between 0 to 0x1FFFFFFF. */ + + uint8_t IDE; /*!< Specifies the type of identifier for the message that + will be transmitted. This parameter can be a value + of @ref CAN_identifier_type */ + + uint8_t RTR; /*!< Specifies the type of frame for the message that will + be transmitted. This parameter can be a value of + @ref CAN_remote_transmission_request */ + + uint8_t DLC; /*!< Specifies the length of the frame that will be + transmitted. This parameter can be a value between + 0 to 8 */ + + uint8_t Data[8]; /*!< Contains the data to be transmitted. It ranges from 0 + to 0xFF. */ +} CanTxMsg; + +/** + * @brief CAN Rx message structure definition + */ + +typedef struct +{ + uint32_t StdId; /*!< Specifies the standard identifier. + This parameter can be a value between 0 to 0x7FF. */ + + uint32_t ExtId; /*!< Specifies the extended identifier. + This parameter can be a value between 0 to 0x1FFFFFFF. */ + + uint8_t IDE; /*!< Specifies the type of identifier for the message that + will be received. This parameter can be a value of + @ref CAN_identifier_type */ + + uint8_t RTR; /*!< Specifies the type of frame for the received message. + This parameter can be a value of + @ref CAN_remote_transmission_request */ + + uint8_t DLC; /*!< Specifies the length of the frame that will be received. + This parameter can be a value between 0 to 8 */ + + uint8_t Data[8]; /*!< Contains the data to be received. It ranges from 0 to + 0xFF. */ + + uint8_t FMI; /*!< Specifies the index of the filter the message stored in + the mailbox passes through. This parameter can be a + value between 0 to 0xFF */ +} CanRxMsg; + +/** + * @} + */ + +/** @defgroup CAN_Exported_Constants + * @{ + */ + +/** @defgroup CAN_sleep_constants + * @{ + */ + +#define CAN_InitStatus_Failed ((uint8_t)0x00) /*!< CAN initialization failed */ +#define CAN_InitStatus_Success ((uint8_t)0x01) /*!< CAN initialization OK */ + +/** + * @} + */ + +/** @defgroup CAN_Mode + * @{ + */ + +#define CAN_Mode_Normal ((uint8_t)0x00) /*!< normal mode */ +#define CAN_Mode_LoopBack ((uint8_t)0x01) /*!< loopback mode */ +#define CAN_Mode_Silent ((uint8_t)0x02) /*!< silent mode */ +#define CAN_Mode_Silent_LoopBack ((uint8_t)0x03) /*!< loopback combined with silent mode */ + +#define IS_CAN_MODE(MODE) (((MODE) == CAN_Mode_Normal) || \ + ((MODE) == CAN_Mode_LoopBack)|| \ + ((MODE) == CAN_Mode_Silent) || \ + ((MODE) == CAN_Mode_Silent_LoopBack)) +/** + * @} + */ + + +/** + * @defgroup CAN_Operating_Mode + * @{ + */ +#define CAN_OperatingMode_Initialization ((uint8_t)0x00) /*!< Initialization mode */ +#define CAN_OperatingMode_Normal ((uint8_t)0x01) /*!< Normal mode */ +#define CAN_OperatingMode_Sleep ((uint8_t)0x02) /*!< sleep mode */ + + +#define IS_CAN_OPERATING_MODE(MODE) (((MODE) == CAN_OperatingMode_Initialization) ||\ + ((MODE) == CAN_OperatingMode_Normal)|| \ + ((MODE) == CAN_OperatingMode_Sleep)) +/** + * @} + */ + +/** + * @defgroup CAN_Mode_Status + * @{ + */ + +#define CAN_ModeStatus_Failed ((uint8_t)0x00) /*!< CAN entering the specific mode failed */ +#define CAN_ModeStatus_Success ((uint8_t)!CAN_ModeStatus_Failed) /*!< CAN entering the specific mode Succeed */ + + +/** + * @} + */ + +/** @defgroup CAN_synchronisation_jump_width + * @{ + */ + +#define CAN_SJW_1tq ((uint8_t)0x00) /*!< 1 time quantum */ +#define CAN_SJW_2tq ((uint8_t)0x01) /*!< 2 time quantum */ +#define CAN_SJW_3tq ((uint8_t)0x02) /*!< 3 time quantum */ +#define CAN_SJW_4tq ((uint8_t)0x03) /*!< 4 time quantum */ + +#define IS_CAN_SJW(SJW) (((SJW) == CAN_SJW_1tq) || ((SJW) == CAN_SJW_2tq)|| \ + ((SJW) == CAN_SJW_3tq) || ((SJW) == CAN_SJW_4tq)) +/** + * @} + */ + +/** @defgroup CAN_time_quantum_in_bit_segment_1 + * @{ + */ + +#define CAN_BS1_1tq ((uint8_t)0x00) /*!< 1 time quantum */ +#define CAN_BS1_2tq ((uint8_t)0x01) /*!< 2 time quantum */ +#define CAN_BS1_3tq ((uint8_t)0x02) /*!< 3 time quantum */ +#define CAN_BS1_4tq ((uint8_t)0x03) /*!< 4 time quantum */ +#define CAN_BS1_5tq ((uint8_t)0x04) /*!< 5 time quantum */ +#define CAN_BS1_6tq ((uint8_t)0x05) /*!< 6 time quantum */ +#define CAN_BS1_7tq ((uint8_t)0x06) /*!< 7 time quantum */ +#define CAN_BS1_8tq ((uint8_t)0x07) /*!< 8 time quantum */ +#define CAN_BS1_9tq ((uint8_t)0x08) /*!< 9 time quantum */ +#define CAN_BS1_10tq ((uint8_t)0x09) /*!< 10 time quantum */ +#define CAN_BS1_11tq ((uint8_t)0x0A) /*!< 11 time quantum */ +#define CAN_BS1_12tq ((uint8_t)0x0B) /*!< 12 time quantum */ +#define CAN_BS1_13tq ((uint8_t)0x0C) /*!< 13 time quantum */ +#define CAN_BS1_14tq ((uint8_t)0x0D) /*!< 14 time quantum */ +#define CAN_BS1_15tq ((uint8_t)0x0E) /*!< 15 time quantum */ +#define CAN_BS1_16tq ((uint8_t)0x0F) /*!< 16 time quantum */ + +#define IS_CAN_BS1(BS1) ((BS1) <= CAN_BS1_16tq) +/** + * @} + */ + +/** @defgroup CAN_time_quantum_in_bit_segment_2 + * @{ + */ + +#define CAN_BS2_1tq ((uint8_t)0x00) /*!< 1 time quantum */ +#define CAN_BS2_2tq ((uint8_t)0x01) /*!< 2 time quantum */ +#define CAN_BS2_3tq ((uint8_t)0x02) /*!< 3 time quantum */ +#define CAN_BS2_4tq ((uint8_t)0x03) /*!< 4 time quantum */ +#define CAN_BS2_5tq ((uint8_t)0x04) /*!< 5 time quantum */ +#define CAN_BS2_6tq ((uint8_t)0x05) /*!< 6 time quantum */ +#define CAN_BS2_7tq ((uint8_t)0x06) /*!< 7 time quantum */ +#define CAN_BS2_8tq ((uint8_t)0x07) /*!< 8 time quantum */ + +#define IS_CAN_BS2(BS2) ((BS2) <= CAN_BS2_8tq) + +/** + * @} + */ + +/** @defgroup CAN_clock_prescaler + * @{ + */ + +#define IS_CAN_PRESCALER(PRESCALER) (((PRESCALER) >= 1) && ((PRESCALER) <= 1024)) + +/** + * @} + */ + +/** @defgroup CAN_filter_number + * @{ + */ +#ifndef STM32F10X_CL + #define IS_CAN_FILTER_NUMBER(NUMBER) ((NUMBER) <= 13) +#else + #define IS_CAN_FILTER_NUMBER(NUMBER) ((NUMBER) <= 27) +#endif /* STM32F10X_CL */ +/** + * @} + */ + +/** @defgroup CAN_filter_mode + * @{ + */ + +#define CAN_FilterMode_IdMask ((uint8_t)0x00) /*!< identifier/mask mode */ +#define CAN_FilterMode_IdList ((uint8_t)0x01) /*!< identifier list mode */ + +#define IS_CAN_FILTER_MODE(MODE) (((MODE) == CAN_FilterMode_IdMask) || \ + ((MODE) == CAN_FilterMode_IdList)) +/** + * @} + */ + +/** @defgroup CAN_filter_scale + * @{ + */ + +#define CAN_FilterScale_16bit ((uint8_t)0x00) /*!< Two 16-bit filters */ +#define CAN_FilterScale_32bit ((uint8_t)0x01) /*!< One 32-bit filter */ + +#define IS_CAN_FILTER_SCALE(SCALE) (((SCALE) == CAN_FilterScale_16bit) || \ + ((SCALE) == CAN_FilterScale_32bit)) + +/** + * @} + */ + +/** @defgroup CAN_filter_FIFO + * @{ + */ + +#define CAN_Filter_FIFO0 ((uint8_t)0x00) /*!< Filter FIFO 0 assignment for filter x */ +#define CAN_Filter_FIFO1 ((uint8_t)0x01) /*!< Filter FIFO 1 assignment for filter x */ +#define IS_CAN_FILTER_FIFO(FIFO) (((FIFO) == CAN_FilterFIFO0) || \ + ((FIFO) == CAN_FilterFIFO1)) +/** + * @} + */ + +/** @defgroup Start_bank_filter_for_slave_CAN + * @{ + */ +#define IS_CAN_BANKNUMBER(BANKNUMBER) (((BANKNUMBER) >= 1) && ((BANKNUMBER) <= 27)) +/** + * @} + */ + +/** @defgroup CAN_Tx + * @{ + */ + +#define IS_CAN_TRANSMITMAILBOX(TRANSMITMAILBOX) ((TRANSMITMAILBOX) <= ((uint8_t)0x02)) +#define IS_CAN_STDID(STDID) ((STDID) <= ((uint32_t)0x7FF)) +#define IS_CAN_EXTID(EXTID) ((EXTID) <= ((uint32_t)0x1FFFFFFF)) +#define IS_CAN_DLC(DLC) ((DLC) <= ((uint8_t)0x08)) + +/** + * @} + */ + +/** @defgroup CAN_identifier_type + * @{ + */ + +#define CAN_Id_Standard ((uint32_t)0x00000000) /*!< Standard Id */ +#define CAN_Id_Extended ((uint32_t)0x00000004) /*!< Extended Id */ +#define IS_CAN_IDTYPE(IDTYPE) (((IDTYPE) == CAN_Id_Standard) || \ + ((IDTYPE) == CAN_Id_Extended)) +/** + * @} + */ + +/** @defgroup CAN_remote_transmission_request + * @{ + */ + +#define CAN_RTR_Data ((uint32_t)0x00000000) /*!< Data frame */ +#define CAN_RTR_Remote ((uint32_t)0x00000002) /*!< Remote frame */ +#define IS_CAN_RTR(RTR) (((RTR) == CAN_RTR_Data) || ((RTR) == CAN_RTR_Remote)) + +/** + * @} + */ + +/** @defgroup CAN_transmit_constants + * @{ + */ + +#define CAN_TxStatus_Failed ((uint8_t)0x00)/*!< CAN transmission failed */ +#define CAN_TxStatus_Ok ((uint8_t)0x01) /*!< CAN transmission succeeded */ +#define CAN_TxStatus_Pending ((uint8_t)0x02) /*!< CAN transmission pending */ +#define CAN_TxStatus_NoMailBox ((uint8_t)0x04) /*!< CAN cell did not provide an empty mailbox */ + +/** + * @} + */ + +/** @defgroup CAN_receive_FIFO_number_constants + * @{ + */ + +#define CAN_FIFO0 ((uint8_t)0x00) /*!< CAN FIFO 0 used to receive */ +#define CAN_FIFO1 ((uint8_t)0x01) /*!< CAN FIFO 1 used to receive */ + +#define IS_CAN_FIFO(FIFO) (((FIFO) == CAN_FIFO0) || ((FIFO) == CAN_FIFO1)) + +/** + * @} + */ + +/** @defgroup CAN_sleep_constants + * @{ + */ + +#define CAN_Sleep_Failed ((uint8_t)0x00) /*!< CAN did not enter the sleep mode */ +#define CAN_Sleep_Ok ((uint8_t)0x01) /*!< CAN entered the sleep mode */ + +/** + * @} + */ + +/** @defgroup CAN_wake_up_constants + * @{ + */ + +#define CAN_WakeUp_Failed ((uint8_t)0x00) /*!< CAN did not leave the sleep mode */ +#define CAN_WakeUp_Ok ((uint8_t)0x01) /*!< CAN leaved the sleep mode */ + +/** + * @} + */ + +/** + * @defgroup CAN_Error_Code_constants + * @{ + */ + +#define CAN_ErrorCode_NoErr ((uint8_t)0x00) /*!< No Error */ +#define CAN_ErrorCode_StuffErr ((uint8_t)0x10) /*!< Stuff Error */ +#define CAN_ErrorCode_FormErr ((uint8_t)0x20) /*!< Form Error */ +#define CAN_ErrorCode_ACKErr ((uint8_t)0x30) /*!< Acknowledgment Error */ +#define CAN_ErrorCode_BitRecessiveErr ((uint8_t)0x40) /*!< Bit Recessive Error */ +#define CAN_ErrorCode_BitDominantErr ((uint8_t)0x50) /*!< Bit Dominant Error */ +#define CAN_ErrorCode_CRCErr ((uint8_t)0x60) /*!< CRC Error */ +#define CAN_ErrorCode_SoftwareSetErr ((uint8_t)0x70) /*!< Software Set Error */ + + +/** + * @} + */ + +/** @defgroup CAN_flags + * @{ + */ +/* If the flag is 0x3XXXXXXX, it means that it can be used with CAN_GetFlagStatus() + and CAN_ClearFlag() functions. */ +/* If the flag is 0x1XXXXXXX, it means that it can only be used with CAN_GetFlagStatus() function. */ + +/* Transmit Flags */ +#define CAN_FLAG_RQCP0 ((uint32_t)0x38000001) /*!< Request MailBox0 Flag */ +#define CAN_FLAG_RQCP1 ((uint32_t)0x38000100) /*!< Request MailBox1 Flag */ +#define CAN_FLAG_RQCP2 ((uint32_t)0x38010000) /*!< Request MailBox2 Flag */ + +/* Receive Flags */ +#define CAN_FLAG_FMP0 ((uint32_t)0x12000003) /*!< FIFO 0 Message Pending Flag */ +#define CAN_FLAG_FF0 ((uint32_t)0x32000008) /*!< FIFO 0 Full Flag */ +#define CAN_FLAG_FOV0 ((uint32_t)0x32000010) /*!< FIFO 0 Overrun Flag */ +#define CAN_FLAG_FMP1 ((uint32_t)0x14000003) /*!< FIFO 1 Message Pending Flag */ +#define CAN_FLAG_FF1 ((uint32_t)0x34000008) /*!< FIFO 1 Full Flag */ +#define CAN_FLAG_FOV1 ((uint32_t)0x34000010) /*!< FIFO 1 Overrun Flag */ + +/* Operating Mode Flags */ +#define CAN_FLAG_WKU ((uint32_t)0x31000008) /*!< Wake up Flag */ +#define CAN_FLAG_SLAK ((uint32_t)0x31000012) /*!< Sleep acknowledge Flag */ +/* Note: When SLAK intterupt is disabled (SLKIE=0), no polling on SLAKI is possible. + In this case the SLAK bit can be polled.*/ + +/* Error Flags */ +#define CAN_FLAG_EWG ((uint32_t)0x10F00001) /*!< Error Warning Flag */ +#define CAN_FLAG_EPV ((uint32_t)0x10F00002) /*!< Error Passive Flag */ +#define CAN_FLAG_BOF ((uint32_t)0x10F00004) /*!< Bus-Off Flag */ +#define CAN_FLAG_LEC ((uint32_t)0x30F00070) /*!< Last error code Flag */ + +#define IS_CAN_GET_FLAG(FLAG) (((FLAG) == CAN_FLAG_LEC) || ((FLAG) == CAN_FLAG_BOF) || \ + ((FLAG) == CAN_FLAG_EPV) || ((FLAG) == CAN_FLAG_EWG) || \ + ((FLAG) == CAN_FLAG_WKU) || ((FLAG) == CAN_FLAG_FOV0) || \ + ((FLAG) == CAN_FLAG_FF0) || ((FLAG) == CAN_FLAG_FMP0) || \ + ((FLAG) == CAN_FLAG_FOV1) || ((FLAG) == CAN_FLAG_FF1) || \ + ((FLAG) == CAN_FLAG_FMP1) || ((FLAG) == CAN_FLAG_RQCP2) || \ + ((FLAG) == CAN_FLAG_RQCP1)|| ((FLAG) == CAN_FLAG_RQCP0) || \ + ((FLAG) == CAN_FLAG_SLAK )) + +#define IS_CAN_CLEAR_FLAG(FLAG)(((FLAG) == CAN_FLAG_LEC) || ((FLAG) == CAN_FLAG_RQCP2) || \ + ((FLAG) == CAN_FLAG_RQCP1) || ((FLAG) == CAN_FLAG_RQCP0) || \ + ((FLAG) == CAN_FLAG_FF0) || ((FLAG) == CAN_FLAG_FOV0) ||\ + ((FLAG) == CAN_FLAG_FF1) || ((FLAG) == CAN_FLAG_FOV1) || \ + ((FLAG) == CAN_FLAG_WKU) || ((FLAG) == CAN_FLAG_SLAK)) +/** + * @} + */ + + +/** @defgroup CAN_interrupts + * @{ + */ + + + +#define CAN_IT_TME ((uint32_t)0x00000001) /*!< Transmit mailbox empty Interrupt*/ + +/* Receive Interrupts */ +#define CAN_IT_FMP0 ((uint32_t)0x00000002) /*!< FIFO 0 message pending Interrupt*/ +#define CAN_IT_FF0 ((uint32_t)0x00000004) /*!< FIFO 0 full Interrupt*/ +#define CAN_IT_FOV0 ((uint32_t)0x00000008) /*!< FIFO 0 overrun Interrupt*/ +#define CAN_IT_FMP1 ((uint32_t)0x00000010) /*!< FIFO 1 message pending Interrupt*/ +#define CAN_IT_FF1 ((uint32_t)0x00000020) /*!< FIFO 1 full Interrupt*/ +#define CAN_IT_FOV1 ((uint32_t)0x00000040) /*!< FIFO 1 overrun Interrupt*/ + +/* Operating Mode Interrupts */ +#define CAN_IT_WKU ((uint32_t)0x00010000) /*!< Wake-up Interrupt*/ +#define CAN_IT_SLK ((uint32_t)0x00020000) /*!< Sleep acknowledge Interrupt*/ + +/* Error Interrupts */ +#define CAN_IT_EWG ((uint32_t)0x00000100) /*!< Error warning Interrupt*/ +#define CAN_IT_EPV ((uint32_t)0x00000200) /*!< Error passive Interrupt*/ +#define CAN_IT_BOF ((uint32_t)0x00000400) /*!< Bus-off Interrupt*/ +#define CAN_IT_LEC ((uint32_t)0x00000800) /*!< Last error code Interrupt*/ +#define CAN_IT_ERR ((uint32_t)0x00008000) /*!< Error Interrupt*/ + +/* Flags named as Interrupts : kept only for FW compatibility */ +#define CAN_IT_RQCP0 CAN_IT_TME +#define CAN_IT_RQCP1 CAN_IT_TME +#define CAN_IT_RQCP2 CAN_IT_TME + + +#define IS_CAN_IT(IT) (((IT) == CAN_IT_TME) || ((IT) == CAN_IT_FMP0) ||\ + ((IT) == CAN_IT_FF0) || ((IT) == CAN_IT_FOV0) ||\ + ((IT) == CAN_IT_FMP1) || ((IT) == CAN_IT_FF1) ||\ + ((IT) == CAN_IT_FOV1) || ((IT) == CAN_IT_EWG) ||\ + ((IT) == CAN_IT_EPV) || ((IT) == CAN_IT_BOF) ||\ + ((IT) == CAN_IT_LEC) || ((IT) == CAN_IT_ERR) ||\ + ((IT) == CAN_IT_WKU) || ((IT) == CAN_IT_SLK)) + +#define IS_CAN_CLEAR_IT(IT) (((IT) == CAN_IT_TME) || ((IT) == CAN_IT_FF0) ||\ + ((IT) == CAN_IT_FOV0)|| ((IT) == CAN_IT_FF1) ||\ + ((IT) == CAN_IT_FOV1)|| ((IT) == CAN_IT_EWG) ||\ + ((IT) == CAN_IT_EPV) || ((IT) == CAN_IT_BOF) ||\ + ((IT) == CAN_IT_LEC) || ((IT) == CAN_IT_ERR) ||\ + ((IT) == CAN_IT_WKU) || ((IT) == CAN_IT_SLK)) + +/** + * @} + */ + +/** @defgroup CAN_Legacy + * @{ + */ +#define CANINITFAILED CAN_InitStatus_Failed +#define CANINITOK CAN_InitStatus_Success +#define CAN_FilterFIFO0 CAN_Filter_FIFO0 +#define CAN_FilterFIFO1 CAN_Filter_FIFO1 +#define CAN_ID_STD CAN_Id_Standard +#define CAN_ID_EXT CAN_Id_Extended +#define CAN_RTR_DATA CAN_RTR_Data +#define CAN_RTR_REMOTE CAN_RTR_Remote +#define CANTXFAILE CAN_TxStatus_Failed +#define CANTXOK CAN_TxStatus_Ok +#define CANTXPENDING CAN_TxStatus_Pending +#define CAN_NO_MB CAN_TxStatus_NoMailBox +#define CANSLEEPFAILED CAN_Sleep_Failed +#define CANSLEEPOK CAN_Sleep_Ok +#define CANWAKEUPFAILED CAN_WakeUp_Failed +#define CANWAKEUPOK CAN_WakeUp_Ok + +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup CAN_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup CAN_Exported_Functions + * @{ + */ +/* Function used to set the CAN configuration to the default reset state *****/ +void CAN_DeInit(CAN_TypeDef* CANx); + +/* Initialization and Configuration functions *********************************/ +uint8_t CAN_Init(CAN_TypeDef* CANx, CAN_InitTypeDef* CAN_InitStruct); +void CAN_FilterInit(CAN_FilterInitTypeDef* CAN_FilterInitStruct); +void CAN_StructInit(CAN_InitTypeDef* CAN_InitStruct); +void CAN_SlaveStartBank(uint8_t CAN_BankNumber); +void CAN_DBGFreeze(CAN_TypeDef* CANx, FunctionalState NewState); +void CAN_TTComModeCmd(CAN_TypeDef* CANx, FunctionalState NewState); + +/* Transmit functions *********************************************************/ +uint8_t CAN_Transmit(CAN_TypeDef* CANx, CanTxMsg* TxMessage); +uint8_t CAN_TransmitStatus(CAN_TypeDef* CANx, uint8_t TransmitMailbox); +void CAN_CancelTransmit(CAN_TypeDef* CANx, uint8_t Mailbox); + +/* Receive functions **********************************************************/ +void CAN_Receive(CAN_TypeDef* CANx, uint8_t FIFONumber, CanRxMsg* RxMessage); +void CAN_FIFORelease(CAN_TypeDef* CANx, uint8_t FIFONumber); +uint8_t CAN_MessagePending(CAN_TypeDef* CANx, uint8_t FIFONumber); + + +/* Operation modes functions **************************************************/ +uint8_t CAN_OperatingModeRequest(CAN_TypeDef* CANx, uint8_t CAN_OperatingMode); +uint8_t CAN_Sleep(CAN_TypeDef* CANx); +uint8_t CAN_WakeUp(CAN_TypeDef* CANx); + +/* Error management functions *************************************************/ +uint8_t CAN_GetLastErrorCode(CAN_TypeDef* CANx); +uint8_t CAN_GetReceiveErrorCounter(CAN_TypeDef* CANx); +uint8_t CAN_GetLSBTransmitErrorCounter(CAN_TypeDef* CANx); + +/* Interrupts and flags management functions **********************************/ +void CAN_ITConfig(CAN_TypeDef* CANx, uint32_t CAN_IT, FunctionalState NewState); +FlagStatus CAN_GetFlagStatus(CAN_TypeDef* CANx, uint32_t CAN_FLAG); +void CAN_ClearFlag(CAN_TypeDef* CANx, uint32_t CAN_FLAG); +ITStatus CAN_GetITStatus(CAN_TypeDef* CANx, uint32_t CAN_IT); +void CAN_ClearITPendingBit(CAN_TypeDef* CANx, uint32_t CAN_IT); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F10x_CAN_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_cec.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_cec.h new file mode 100644 index 0000000..a3f8fc7 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_cec.h @@ -0,0 +1,210 @@ +/** + ****************************************************************************** + * @file stm32f10x_cec.h + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief This file contains all the functions prototypes for the CEC firmware + * library. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_CEC_H +#define __STM32F10x_CEC_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup CEC + * @{ + */ + + +/** @defgroup CEC_Exported_Types + * @{ + */ + +/** + * @brief CEC Init structure definition + */ +typedef struct +{ + uint16_t CEC_BitTimingMode; /*!< Configures the CEC Bit Timing Error Mode. + This parameter can be a value of @ref CEC_BitTiming_Mode */ + uint16_t CEC_BitPeriodMode; /*!< Configures the CEC Bit Period Error Mode. + This parameter can be a value of @ref CEC_BitPeriod_Mode */ +}CEC_InitTypeDef; + +/** + * @} + */ + +/** @defgroup CEC_Exported_Constants + * @{ + */ + +/** @defgroup CEC_BitTiming_Mode + * @{ + */ +#define CEC_BitTimingStdMode ((uint16_t)0x00) /*!< Bit timing error Standard Mode */ +#define CEC_BitTimingErrFreeMode CEC_CFGR_BTEM /*!< Bit timing error Free Mode */ + +#define IS_CEC_BIT_TIMING_ERROR_MODE(MODE) (((MODE) == CEC_BitTimingStdMode) || \ + ((MODE) == CEC_BitTimingErrFreeMode)) +/** + * @} + */ + +/** @defgroup CEC_BitPeriod_Mode + * @{ + */ +#define CEC_BitPeriodStdMode ((uint16_t)0x00) /*!< Bit period error Standard Mode */ +#define CEC_BitPeriodFlexibleMode CEC_CFGR_BPEM /*!< Bit period error Flexible Mode */ + +#define IS_CEC_BIT_PERIOD_ERROR_MODE(MODE) (((MODE) == CEC_BitPeriodStdMode) || \ + ((MODE) == CEC_BitPeriodFlexibleMode)) +/** + * @} + */ + + +/** @defgroup CEC_interrupts_definition + * @{ + */ +#define CEC_IT_TERR CEC_CSR_TERR +#define CEC_IT_TBTRF CEC_CSR_TBTRF +#define CEC_IT_RERR CEC_CSR_RERR +#define CEC_IT_RBTF CEC_CSR_RBTF +#define IS_CEC_GET_IT(IT) (((IT) == CEC_IT_TERR) || ((IT) == CEC_IT_TBTRF) || \ + ((IT) == CEC_IT_RERR) || ((IT) == CEC_IT_RBTF)) +/** + * @} + */ + + +/** @defgroup CEC_Own_Address + * @{ + */ +#define IS_CEC_ADDRESS(ADDRESS) ((ADDRESS) < 0x10) +/** + * @} + */ + +/** @defgroup CEC_Prescaler + * @{ + */ +#define IS_CEC_PRESCALER(PRESCALER) ((PRESCALER) <= 0x3FFF) + +/** + * @} + */ + +/** @defgroup CEC_flags_definition + * @{ + */ + +/** + * @brief ESR register flags + */ +#define CEC_FLAG_BTE ((uint32_t)0x10010000) +#define CEC_FLAG_BPE ((uint32_t)0x10020000) +#define CEC_FLAG_RBTFE ((uint32_t)0x10040000) +#define CEC_FLAG_SBE ((uint32_t)0x10080000) +#define CEC_FLAG_ACKE ((uint32_t)0x10100000) +#define CEC_FLAG_LINE ((uint32_t)0x10200000) +#define CEC_FLAG_TBTFE ((uint32_t)0x10400000) + +/** + * @brief CSR register flags + */ +#define CEC_FLAG_TEOM ((uint32_t)0x00000002) +#define CEC_FLAG_TERR ((uint32_t)0x00000004) +#define CEC_FLAG_TBTRF ((uint32_t)0x00000008) +#define CEC_FLAG_RSOM ((uint32_t)0x00000010) +#define CEC_FLAG_REOM ((uint32_t)0x00000020) +#define CEC_FLAG_RERR ((uint32_t)0x00000040) +#define CEC_FLAG_RBTF ((uint32_t)0x00000080) + +#define IS_CEC_CLEAR_FLAG(FLAG) ((((FLAG) & (uint32_t)0xFFFFFF03) == 0x00) && ((FLAG) != 0x00)) + +#define IS_CEC_GET_FLAG(FLAG) (((FLAG) == CEC_FLAG_BTE) || ((FLAG) == CEC_FLAG_BPE) || \ + ((FLAG) == CEC_FLAG_RBTFE) || ((FLAG)== CEC_FLAG_SBE) || \ + ((FLAG) == CEC_FLAG_ACKE) || ((FLAG) == CEC_FLAG_LINE) || \ + ((FLAG) == CEC_FLAG_TBTFE) || ((FLAG) == CEC_FLAG_TEOM) || \ + ((FLAG) == CEC_FLAG_TERR) || ((FLAG) == CEC_FLAG_TBTRF) || \ + ((FLAG) == CEC_FLAG_RSOM) || ((FLAG) == CEC_FLAG_REOM) || \ + ((FLAG) == CEC_FLAG_RERR) || ((FLAG) == CEC_FLAG_RBTF)) + +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup CEC_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup CEC_Exported_Functions + * @{ + */ +void CEC_DeInit(void); +void CEC_Init(CEC_InitTypeDef* CEC_InitStruct); +void CEC_Cmd(FunctionalState NewState); +void CEC_ITConfig(FunctionalState NewState); +void CEC_OwnAddressConfig(uint8_t CEC_OwnAddress); +void CEC_SetPrescaler(uint16_t CEC_Prescaler); +void CEC_SendDataByte(uint8_t Data); +uint8_t CEC_ReceiveDataByte(void); +void CEC_StartOfMessage(void); +void CEC_EndOfMessageCmd(FunctionalState NewState); +FlagStatus CEC_GetFlagStatus(uint32_t CEC_FLAG); +void CEC_ClearFlag(uint32_t CEC_FLAG); +ITStatus CEC_GetITStatus(uint8_t CEC_IT); +void CEC_ClearITPendingBit(uint16_t CEC_IT); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F10x_CEC_H */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_crc.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_crc.h new file mode 100644 index 0000000..658a51c --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_crc.h @@ -0,0 +1,94 @@ +/** + ****************************************************************************** + * @file stm32f10x_crc.h + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief This file contains all the functions prototypes for the CRC firmware + * library. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_CRC_H +#define __STM32F10x_CRC_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup CRC + * @{ + */ + +/** @defgroup CRC_Exported_Types + * @{ + */ + +/** + * @} + */ + +/** @defgroup CRC_Exported_Constants + * @{ + */ + +/** + * @} + */ + +/** @defgroup CRC_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup CRC_Exported_Functions + * @{ + */ + +void CRC_ResetDR(void); +uint32_t CRC_CalcCRC(uint32_t Data); +uint32_t CRC_CalcBlockCRC(uint32_t pBuffer[], uint32_t BufferLength); +uint32_t CRC_GetCRC(void); +void CRC_SetIDRegister(uint8_t IDValue); +uint8_t CRC_GetIDRegister(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F10x_CRC_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_dac.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_dac.h new file mode 100644 index 0000000..7106164 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_dac.h @@ -0,0 +1,317 @@ +/** + ****************************************************************************** + * @file stm32f10x_dac.h + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief This file contains all the functions prototypes for the DAC firmware + * library. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_DAC_H +#define __STM32F10x_DAC_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup DAC + * @{ + */ + +/** @defgroup DAC_Exported_Types + * @{ + */ + +/** + * @brief DAC Init structure definition + */ + +typedef struct +{ + uint32_t DAC_Trigger; /*!< Specifies the external trigger for the selected DAC channel. + This parameter can be a value of @ref DAC_trigger_selection */ + + uint32_t DAC_WaveGeneration; /*!< Specifies whether DAC channel noise waves or triangle waves + are generated, or whether no wave is generated. + This parameter can be a value of @ref DAC_wave_generation */ + + uint32_t DAC_LFSRUnmask_TriangleAmplitude; /*!< Specifies the LFSR mask for noise wave generation or + the maximum amplitude triangle generation for the DAC channel. + This parameter can be a value of @ref DAC_lfsrunmask_triangleamplitude */ + + uint32_t DAC_OutputBuffer; /*!< Specifies whether the DAC channel output buffer is enabled or disabled. + This parameter can be a value of @ref DAC_output_buffer */ +}DAC_InitTypeDef; + +/** + * @} + */ + +/** @defgroup DAC_Exported_Constants + * @{ + */ + +/** @defgroup DAC_trigger_selection + * @{ + */ + +#define DAC_Trigger_None ((uint32_t)0x00000000) /*!< Conversion is automatic once the DAC1_DHRxxxx register + has been loaded, and not by external trigger */ +#define DAC_Trigger_T6_TRGO ((uint32_t)0x00000004) /*!< TIM6 TRGO selected as external conversion trigger for DAC channel */ +#define DAC_Trigger_T8_TRGO ((uint32_t)0x0000000C) /*!< TIM8 TRGO selected as external conversion trigger for DAC channel + only in High-density devices*/ +#define DAC_Trigger_T3_TRGO ((uint32_t)0x0000000C) /*!< TIM8 TRGO selected as external conversion trigger for DAC channel + only in Connectivity line, Medium-density and Low-density Value Line devices */ +#define DAC_Trigger_T7_TRGO ((uint32_t)0x00000014) /*!< TIM7 TRGO selected as external conversion trigger for DAC channel */ +#define DAC_Trigger_T5_TRGO ((uint32_t)0x0000001C) /*!< TIM5 TRGO selected as external conversion trigger for DAC channel */ +#define DAC_Trigger_T15_TRGO ((uint32_t)0x0000001C) /*!< TIM15 TRGO selected as external conversion trigger for DAC channel + only in Medium-density and Low-density Value Line devices*/ +#define DAC_Trigger_T2_TRGO ((uint32_t)0x00000024) /*!< TIM2 TRGO selected as external conversion trigger for DAC channel */ +#define DAC_Trigger_T4_TRGO ((uint32_t)0x0000002C) /*!< TIM4 TRGO selected as external conversion trigger for DAC channel */ +#define DAC_Trigger_Ext_IT9 ((uint32_t)0x00000034) /*!< EXTI Line9 event selected as external conversion trigger for DAC channel */ +#define DAC_Trigger_Software ((uint32_t)0x0000003C) /*!< Conversion started by software trigger for DAC channel */ + +#define IS_DAC_TRIGGER(TRIGGER) (((TRIGGER) == DAC_Trigger_None) || \ + ((TRIGGER) == DAC_Trigger_T6_TRGO) || \ + ((TRIGGER) == DAC_Trigger_T8_TRGO) || \ + ((TRIGGER) == DAC_Trigger_T7_TRGO) || \ + ((TRIGGER) == DAC_Trigger_T5_TRGO) || \ + ((TRIGGER) == DAC_Trigger_T2_TRGO) || \ + ((TRIGGER) == DAC_Trigger_T4_TRGO) || \ + ((TRIGGER) == DAC_Trigger_Ext_IT9) || \ + ((TRIGGER) == DAC_Trigger_Software)) + +/** + * @} + */ + +/** @defgroup DAC_wave_generation + * @{ + */ + +#define DAC_WaveGeneration_None ((uint32_t)0x00000000) +#define DAC_WaveGeneration_Noise ((uint32_t)0x00000040) +#define DAC_WaveGeneration_Triangle ((uint32_t)0x00000080) +#define IS_DAC_GENERATE_WAVE(WAVE) (((WAVE) == DAC_WaveGeneration_None) || \ + ((WAVE) == DAC_WaveGeneration_Noise) || \ + ((WAVE) == DAC_WaveGeneration_Triangle)) +/** + * @} + */ + +/** @defgroup DAC_lfsrunmask_triangleamplitude + * @{ + */ + +#define DAC_LFSRUnmask_Bit0 ((uint32_t)0x00000000) /*!< Unmask DAC channel LFSR bit0 for noise wave generation */ +#define DAC_LFSRUnmask_Bits1_0 ((uint32_t)0x00000100) /*!< Unmask DAC channel LFSR bit[1:0] for noise wave generation */ +#define DAC_LFSRUnmask_Bits2_0 ((uint32_t)0x00000200) /*!< Unmask DAC channel LFSR bit[2:0] for noise wave generation */ +#define DAC_LFSRUnmask_Bits3_0 ((uint32_t)0x00000300) /*!< Unmask DAC channel LFSR bit[3:0] for noise wave generation */ +#define DAC_LFSRUnmask_Bits4_0 ((uint32_t)0x00000400) /*!< Unmask DAC channel LFSR bit[4:0] for noise wave generation */ +#define DAC_LFSRUnmask_Bits5_0 ((uint32_t)0x00000500) /*!< Unmask DAC channel LFSR bit[5:0] for noise wave generation */ +#define DAC_LFSRUnmask_Bits6_0 ((uint32_t)0x00000600) /*!< Unmask DAC channel LFSR bit[6:0] for noise wave generation */ +#define DAC_LFSRUnmask_Bits7_0 ((uint32_t)0x00000700) /*!< Unmask DAC channel LFSR bit[7:0] for noise wave generation */ +#define DAC_LFSRUnmask_Bits8_0 ((uint32_t)0x00000800) /*!< Unmask DAC channel LFSR bit[8:0] for noise wave generation */ +#define DAC_LFSRUnmask_Bits9_0 ((uint32_t)0x00000900) /*!< Unmask DAC channel LFSR bit[9:0] for noise wave generation */ +#define DAC_LFSRUnmask_Bits10_0 ((uint32_t)0x00000A00) /*!< Unmask DAC channel LFSR bit[10:0] for noise wave generation */ +#define DAC_LFSRUnmask_Bits11_0 ((uint32_t)0x00000B00) /*!< Unmask DAC channel LFSR bit[11:0] for noise wave generation */ +#define DAC_TriangleAmplitude_1 ((uint32_t)0x00000000) /*!< Select max triangle amplitude of 1 */ +#define DAC_TriangleAmplitude_3 ((uint32_t)0x00000100) /*!< Select max triangle amplitude of 3 */ +#define DAC_TriangleAmplitude_7 ((uint32_t)0x00000200) /*!< Select max triangle amplitude of 7 */ +#define DAC_TriangleAmplitude_15 ((uint32_t)0x00000300) /*!< Select max triangle amplitude of 15 */ +#define DAC_TriangleAmplitude_31 ((uint32_t)0x00000400) /*!< Select max triangle amplitude of 31 */ +#define DAC_TriangleAmplitude_63 ((uint32_t)0x00000500) /*!< Select max triangle amplitude of 63 */ +#define DAC_TriangleAmplitude_127 ((uint32_t)0x00000600) /*!< Select max triangle amplitude of 127 */ +#define DAC_TriangleAmplitude_255 ((uint32_t)0x00000700) /*!< Select max triangle amplitude of 255 */ +#define DAC_TriangleAmplitude_511 ((uint32_t)0x00000800) /*!< Select max triangle amplitude of 511 */ +#define DAC_TriangleAmplitude_1023 ((uint32_t)0x00000900) /*!< Select max triangle amplitude of 1023 */ +#define DAC_TriangleAmplitude_2047 ((uint32_t)0x00000A00) /*!< Select max triangle amplitude of 2047 */ +#define DAC_TriangleAmplitude_4095 ((uint32_t)0x00000B00) /*!< Select max triangle amplitude of 4095 */ + +#define IS_DAC_LFSR_UNMASK_TRIANGLE_AMPLITUDE(VALUE) (((VALUE) == DAC_LFSRUnmask_Bit0) || \ + ((VALUE) == DAC_LFSRUnmask_Bits1_0) || \ + ((VALUE) == DAC_LFSRUnmask_Bits2_0) || \ + ((VALUE) == DAC_LFSRUnmask_Bits3_0) || \ + ((VALUE) == DAC_LFSRUnmask_Bits4_0) || \ + ((VALUE) == DAC_LFSRUnmask_Bits5_0) || \ + ((VALUE) == DAC_LFSRUnmask_Bits6_0) || \ + ((VALUE) == DAC_LFSRUnmask_Bits7_0) || \ + ((VALUE) == DAC_LFSRUnmask_Bits8_0) || \ + ((VALUE) == DAC_LFSRUnmask_Bits9_0) || \ + ((VALUE) == DAC_LFSRUnmask_Bits10_0) || \ + ((VALUE) == DAC_LFSRUnmask_Bits11_0) || \ + ((VALUE) == DAC_TriangleAmplitude_1) || \ + ((VALUE) == DAC_TriangleAmplitude_3) || \ + ((VALUE) == DAC_TriangleAmplitude_7) || \ + ((VALUE) == DAC_TriangleAmplitude_15) || \ + ((VALUE) == DAC_TriangleAmplitude_31) || \ + ((VALUE) == DAC_TriangleAmplitude_63) || \ + ((VALUE) == DAC_TriangleAmplitude_127) || \ + ((VALUE) == DAC_TriangleAmplitude_255) || \ + ((VALUE) == DAC_TriangleAmplitude_511) || \ + ((VALUE) == DAC_TriangleAmplitude_1023) || \ + ((VALUE) == DAC_TriangleAmplitude_2047) || \ + ((VALUE) == DAC_TriangleAmplitude_4095)) +/** + * @} + */ + +/** @defgroup DAC_output_buffer + * @{ + */ + +#define DAC_OutputBuffer_Enable ((uint32_t)0x00000000) +#define DAC_OutputBuffer_Disable ((uint32_t)0x00000002) +#define IS_DAC_OUTPUT_BUFFER_STATE(STATE) (((STATE) == DAC_OutputBuffer_Enable) || \ + ((STATE) == DAC_OutputBuffer_Disable)) +/** + * @} + */ + +/** @defgroup DAC_Channel_selection + * @{ + */ + +#define DAC_Channel_1 ((uint32_t)0x00000000) +#define DAC_Channel_2 ((uint32_t)0x00000010) +#define IS_DAC_CHANNEL(CHANNEL) (((CHANNEL) == DAC_Channel_1) || \ + ((CHANNEL) == DAC_Channel_2)) +/** + * @} + */ + +/** @defgroup DAC_data_alignment + * @{ + */ + +#define DAC_Align_12b_R ((uint32_t)0x00000000) +#define DAC_Align_12b_L ((uint32_t)0x00000004) +#define DAC_Align_8b_R ((uint32_t)0x00000008) +#define IS_DAC_ALIGN(ALIGN) (((ALIGN) == DAC_Align_12b_R) || \ + ((ALIGN) == DAC_Align_12b_L) || \ + ((ALIGN) == DAC_Align_8b_R)) +/** + * @} + */ + +/** @defgroup DAC_wave_generation + * @{ + */ + +#define DAC_Wave_Noise ((uint32_t)0x00000040) +#define DAC_Wave_Triangle ((uint32_t)0x00000080) +#define IS_DAC_WAVE(WAVE) (((WAVE) == DAC_Wave_Noise) || \ + ((WAVE) == DAC_Wave_Triangle)) +/** + * @} + */ + +/** @defgroup DAC_data + * @{ + */ + +#define IS_DAC_DATA(DATA) ((DATA) <= 0xFFF0) +/** + * @} + */ +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) +/** @defgroup DAC_interrupts_definition + * @{ + */ + +#define DAC_IT_DMAUDR ((uint32_t)0x00002000) +#define IS_DAC_IT(IT) (((IT) == DAC_IT_DMAUDR)) + +/** + * @} + */ + +/** @defgroup DAC_flags_definition + * @{ + */ + +#define DAC_FLAG_DMAUDR ((uint32_t)0x00002000) +#define IS_DAC_FLAG(FLAG) (((FLAG) == DAC_FLAG_DMAUDR)) + +/** + * @} + */ +#endif + +/** + * @} + */ + +/** @defgroup DAC_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup DAC_Exported_Functions + * @{ + */ + +void DAC_DeInit(void); +void DAC_Init(uint32_t DAC_Channel, DAC_InitTypeDef* DAC_InitStruct); +void DAC_StructInit(DAC_InitTypeDef* DAC_InitStruct); +void DAC_Cmd(uint32_t DAC_Channel, FunctionalState NewState); +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) +void DAC_ITConfig(uint32_t DAC_Channel, uint32_t DAC_IT, FunctionalState NewState); +#endif +void DAC_DMACmd(uint32_t DAC_Channel, FunctionalState NewState); +void DAC_SoftwareTriggerCmd(uint32_t DAC_Channel, FunctionalState NewState); +void DAC_DualSoftwareTriggerCmd(FunctionalState NewState); +void DAC_WaveGenerationCmd(uint32_t DAC_Channel, uint32_t DAC_Wave, FunctionalState NewState); +void DAC_SetChannel1Data(uint32_t DAC_Align, uint16_t Data); +void DAC_SetChannel2Data(uint32_t DAC_Align, uint16_t Data); +void DAC_SetDualChannelData(uint32_t DAC_Align, uint16_t Data2, uint16_t Data1); +uint16_t DAC_GetDataOutputValue(uint32_t DAC_Channel); +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) +FlagStatus DAC_GetFlagStatus(uint32_t DAC_Channel, uint32_t DAC_FLAG); +void DAC_ClearFlag(uint32_t DAC_Channel, uint32_t DAC_FLAG); +ITStatus DAC_GetITStatus(uint32_t DAC_Channel, uint32_t DAC_IT); +void DAC_ClearITPendingBit(uint32_t DAC_Channel, uint32_t DAC_IT); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /*__STM32F10x_DAC_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_dbgmcu.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_dbgmcu.h new file mode 100644 index 0000000..1e6a68a --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_dbgmcu.h @@ -0,0 +1,119 @@ +/** + ****************************************************************************** + * @file stm32f10x_dbgmcu.h + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief This file contains all the functions prototypes for the DBGMCU + * firmware library. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_DBGMCU_H +#define __STM32F10x_DBGMCU_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup DBGMCU + * @{ + */ + +/** @defgroup DBGMCU_Exported_Types + * @{ + */ + +/** + * @} + */ + +/** @defgroup DBGMCU_Exported_Constants + * @{ + */ + +#define DBGMCU_SLEEP ((uint32_t)0x00000001) +#define DBGMCU_STOP ((uint32_t)0x00000002) +#define DBGMCU_STANDBY ((uint32_t)0x00000004) +#define DBGMCU_IWDG_STOP ((uint32_t)0x00000100) +#define DBGMCU_WWDG_STOP ((uint32_t)0x00000200) +#define DBGMCU_TIM1_STOP ((uint32_t)0x00000400) +#define DBGMCU_TIM2_STOP ((uint32_t)0x00000800) +#define DBGMCU_TIM3_STOP ((uint32_t)0x00001000) +#define DBGMCU_TIM4_STOP ((uint32_t)0x00002000) +#define DBGMCU_CAN1_STOP ((uint32_t)0x00004000) +#define DBGMCU_I2C1_SMBUS_TIMEOUT ((uint32_t)0x00008000) +#define DBGMCU_I2C2_SMBUS_TIMEOUT ((uint32_t)0x00010000) +#define DBGMCU_TIM8_STOP ((uint32_t)0x00020000) +#define DBGMCU_TIM5_STOP ((uint32_t)0x00040000) +#define DBGMCU_TIM6_STOP ((uint32_t)0x00080000) +#define DBGMCU_TIM7_STOP ((uint32_t)0x00100000) +#define DBGMCU_CAN2_STOP ((uint32_t)0x00200000) +#define DBGMCU_TIM15_STOP ((uint32_t)0x00400000) +#define DBGMCU_TIM16_STOP ((uint32_t)0x00800000) +#define DBGMCU_TIM17_STOP ((uint32_t)0x01000000) +#define DBGMCU_TIM12_STOP ((uint32_t)0x02000000) +#define DBGMCU_TIM13_STOP ((uint32_t)0x04000000) +#define DBGMCU_TIM14_STOP ((uint32_t)0x08000000) +#define DBGMCU_TIM9_STOP ((uint32_t)0x10000000) +#define DBGMCU_TIM10_STOP ((uint32_t)0x20000000) +#define DBGMCU_TIM11_STOP ((uint32_t)0x40000000) + +#define IS_DBGMCU_PERIPH(PERIPH) ((((PERIPH) & 0x800000F8) == 0x00) && ((PERIPH) != 0x00)) +/** + * @} + */ + +/** @defgroup DBGMCU_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup DBGMCU_Exported_Functions + * @{ + */ + +uint32_t DBGMCU_GetREVID(void); +uint32_t DBGMCU_GetDEVID(void); +void DBGMCU_Config(uint32_t DBGMCU_Periph, FunctionalState NewState); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F10x_DBGMCU_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_dma.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_dma.h new file mode 100644 index 0000000..b5dc6a8 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_dma.h @@ -0,0 +1,439 @@ +/** + ****************************************************************************** + * @file stm32f10x_dma.h + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief This file contains all the functions prototypes for the DMA firmware + * library. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_DMA_H +#define __STM32F10x_DMA_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup DMA + * @{ + */ + +/** @defgroup DMA_Exported_Types + * @{ + */ + +/** + * @brief DMA Init structure definition + */ + +typedef struct +{ + uint32_t DMA_PeripheralBaseAddr; /*!< Specifies the peripheral base address for DMAy Channelx. */ + + uint32_t DMA_MemoryBaseAddr; /*!< Specifies the memory base address for DMAy Channelx. */ + + uint32_t DMA_DIR; /*!< Specifies if the peripheral is the source or destination. + This parameter can be a value of @ref DMA_data_transfer_direction */ + + uint32_t DMA_BufferSize; /*!< Specifies the buffer size, in data unit, of the specified Channel. + The data unit is equal to the configuration set in DMA_PeripheralDataSize + or DMA_MemoryDataSize members depending in the transfer direction. */ + + uint32_t DMA_PeripheralInc; /*!< Specifies whether the Peripheral address register is incremented or not. + This parameter can be a value of @ref DMA_peripheral_incremented_mode */ + + uint32_t DMA_MemoryInc; /*!< Specifies whether the memory address register is incremented or not. + This parameter can be a value of @ref DMA_memory_incremented_mode */ + + uint32_t DMA_PeripheralDataSize; /*!< Specifies the Peripheral data width. + This parameter can be a value of @ref DMA_peripheral_data_size */ + + uint32_t DMA_MemoryDataSize; /*!< Specifies the Memory data width. + This parameter can be a value of @ref DMA_memory_data_size */ + + uint32_t DMA_Mode; /*!< Specifies the operation mode of the DMAy Channelx. + This parameter can be a value of @ref DMA_circular_normal_mode. + @note: The circular buffer mode cannot be used if the memory-to-memory + data transfer is configured on the selected Channel */ + + uint32_t DMA_Priority; /*!< Specifies the software priority for the DMAy Channelx. + This parameter can be a value of @ref DMA_priority_level */ + + uint32_t DMA_M2M; /*!< Specifies if the DMAy Channelx will be used in memory-to-memory transfer. + This parameter can be a value of @ref DMA_memory_to_memory */ +}DMA_InitTypeDef; + +/** + * @} + */ + +/** @defgroup DMA_Exported_Constants + * @{ + */ + +#define IS_DMA_ALL_PERIPH(PERIPH) (((PERIPH) == DMA1_Channel1) || \ + ((PERIPH) == DMA1_Channel2) || \ + ((PERIPH) == DMA1_Channel3) || \ + ((PERIPH) == DMA1_Channel4) || \ + ((PERIPH) == DMA1_Channel5) || \ + ((PERIPH) == DMA1_Channel6) || \ + ((PERIPH) == DMA1_Channel7) || \ + ((PERIPH) == DMA2_Channel1) || \ + ((PERIPH) == DMA2_Channel2) || \ + ((PERIPH) == DMA2_Channel3) || \ + ((PERIPH) == DMA2_Channel4) || \ + ((PERIPH) == DMA2_Channel5)) + +/** @defgroup DMA_data_transfer_direction + * @{ + */ + +#define DMA_DIR_PeripheralDST ((uint32_t)0x00000010) +#define DMA_DIR_PeripheralSRC ((uint32_t)0x00000000) +#define IS_DMA_DIR(DIR) (((DIR) == DMA_DIR_PeripheralDST) || \ + ((DIR) == DMA_DIR_PeripheralSRC)) +/** + * @} + */ + +/** @defgroup DMA_peripheral_incremented_mode + * @{ + */ + +#define DMA_PeripheralInc_Enable ((uint32_t)0x00000040) +#define DMA_PeripheralInc_Disable ((uint32_t)0x00000000) +#define IS_DMA_PERIPHERAL_INC_STATE(STATE) (((STATE) == DMA_PeripheralInc_Enable) || \ + ((STATE) == DMA_PeripheralInc_Disable)) +/** + * @} + */ + +/** @defgroup DMA_memory_incremented_mode + * @{ + */ + +#define DMA_MemoryInc_Enable ((uint32_t)0x00000080) +#define DMA_MemoryInc_Disable ((uint32_t)0x00000000) +#define IS_DMA_MEMORY_INC_STATE(STATE) (((STATE) == DMA_MemoryInc_Enable) || \ + ((STATE) == DMA_MemoryInc_Disable)) +/** + * @} + */ + +/** @defgroup DMA_peripheral_data_size + * @{ + */ + +#define DMA_PeripheralDataSize_Byte ((uint32_t)0x00000000) +#define DMA_PeripheralDataSize_HalfWord ((uint32_t)0x00000100) +#define DMA_PeripheralDataSize_Word ((uint32_t)0x00000200) +#define IS_DMA_PERIPHERAL_DATA_SIZE(SIZE) (((SIZE) == DMA_PeripheralDataSize_Byte) || \ + ((SIZE) == DMA_PeripheralDataSize_HalfWord) || \ + ((SIZE) == DMA_PeripheralDataSize_Word)) +/** + * @} + */ + +/** @defgroup DMA_memory_data_size + * @{ + */ + +#define DMA_MemoryDataSize_Byte ((uint32_t)0x00000000) +#define DMA_MemoryDataSize_HalfWord ((uint32_t)0x00000400) +#define DMA_MemoryDataSize_Word ((uint32_t)0x00000800) +#define IS_DMA_MEMORY_DATA_SIZE(SIZE) (((SIZE) == DMA_MemoryDataSize_Byte) || \ + ((SIZE) == DMA_MemoryDataSize_HalfWord) || \ + ((SIZE) == DMA_MemoryDataSize_Word)) +/** + * @} + */ + +/** @defgroup DMA_circular_normal_mode + * @{ + */ + +#define DMA_Mode_Circular ((uint32_t)0x00000020) +#define DMA_Mode_Normal ((uint32_t)0x00000000) +#define IS_DMA_MODE(MODE) (((MODE) == DMA_Mode_Circular) || ((MODE) == DMA_Mode_Normal)) +/** + * @} + */ + +/** @defgroup DMA_priority_level + * @{ + */ + +#define DMA_Priority_VeryHigh ((uint32_t)0x00003000) +#define DMA_Priority_High ((uint32_t)0x00002000) +#define DMA_Priority_Medium ((uint32_t)0x00001000) +#define DMA_Priority_Low ((uint32_t)0x00000000) +#define IS_DMA_PRIORITY(PRIORITY) (((PRIORITY) == DMA_Priority_VeryHigh) || \ + ((PRIORITY) == DMA_Priority_High) || \ + ((PRIORITY) == DMA_Priority_Medium) || \ + ((PRIORITY) == DMA_Priority_Low)) +/** + * @} + */ + +/** @defgroup DMA_memory_to_memory + * @{ + */ + +#define DMA_M2M_Enable ((uint32_t)0x00004000) +#define DMA_M2M_Disable ((uint32_t)0x00000000) +#define IS_DMA_M2M_STATE(STATE) (((STATE) == DMA_M2M_Enable) || ((STATE) == DMA_M2M_Disable)) + +/** + * @} + */ + +/** @defgroup DMA_interrupts_definition + * @{ + */ + +#define DMA_IT_TC ((uint32_t)0x00000002) +#define DMA_IT_HT ((uint32_t)0x00000004) +#define DMA_IT_TE ((uint32_t)0x00000008) +#define IS_DMA_CONFIG_IT(IT) ((((IT) & 0xFFFFFFF1) == 0x00) && ((IT) != 0x00)) + +#define DMA1_IT_GL1 ((uint32_t)0x00000001) +#define DMA1_IT_TC1 ((uint32_t)0x00000002) +#define DMA1_IT_HT1 ((uint32_t)0x00000004) +#define DMA1_IT_TE1 ((uint32_t)0x00000008) +#define DMA1_IT_GL2 ((uint32_t)0x00000010) +#define DMA1_IT_TC2 ((uint32_t)0x00000020) +#define DMA1_IT_HT2 ((uint32_t)0x00000040) +#define DMA1_IT_TE2 ((uint32_t)0x00000080) +#define DMA1_IT_GL3 ((uint32_t)0x00000100) +#define DMA1_IT_TC3 ((uint32_t)0x00000200) +#define DMA1_IT_HT3 ((uint32_t)0x00000400) +#define DMA1_IT_TE3 ((uint32_t)0x00000800) +#define DMA1_IT_GL4 ((uint32_t)0x00001000) +#define DMA1_IT_TC4 ((uint32_t)0x00002000) +#define DMA1_IT_HT4 ((uint32_t)0x00004000) +#define DMA1_IT_TE4 ((uint32_t)0x00008000) +#define DMA1_IT_GL5 ((uint32_t)0x00010000) +#define DMA1_IT_TC5 ((uint32_t)0x00020000) +#define DMA1_IT_HT5 ((uint32_t)0x00040000) +#define DMA1_IT_TE5 ((uint32_t)0x00080000) +#define DMA1_IT_GL6 ((uint32_t)0x00100000) +#define DMA1_IT_TC6 ((uint32_t)0x00200000) +#define DMA1_IT_HT6 ((uint32_t)0x00400000) +#define DMA1_IT_TE6 ((uint32_t)0x00800000) +#define DMA1_IT_GL7 ((uint32_t)0x01000000) +#define DMA1_IT_TC7 ((uint32_t)0x02000000) +#define DMA1_IT_HT7 ((uint32_t)0x04000000) +#define DMA1_IT_TE7 ((uint32_t)0x08000000) + +#define DMA2_IT_GL1 ((uint32_t)0x10000001) +#define DMA2_IT_TC1 ((uint32_t)0x10000002) +#define DMA2_IT_HT1 ((uint32_t)0x10000004) +#define DMA2_IT_TE1 ((uint32_t)0x10000008) +#define DMA2_IT_GL2 ((uint32_t)0x10000010) +#define DMA2_IT_TC2 ((uint32_t)0x10000020) +#define DMA2_IT_HT2 ((uint32_t)0x10000040) +#define DMA2_IT_TE2 ((uint32_t)0x10000080) +#define DMA2_IT_GL3 ((uint32_t)0x10000100) +#define DMA2_IT_TC3 ((uint32_t)0x10000200) +#define DMA2_IT_HT3 ((uint32_t)0x10000400) +#define DMA2_IT_TE3 ((uint32_t)0x10000800) +#define DMA2_IT_GL4 ((uint32_t)0x10001000) +#define DMA2_IT_TC4 ((uint32_t)0x10002000) +#define DMA2_IT_HT4 ((uint32_t)0x10004000) +#define DMA2_IT_TE4 ((uint32_t)0x10008000) +#define DMA2_IT_GL5 ((uint32_t)0x10010000) +#define DMA2_IT_TC5 ((uint32_t)0x10020000) +#define DMA2_IT_HT5 ((uint32_t)0x10040000) +#define DMA2_IT_TE5 ((uint32_t)0x10080000) + +#define IS_DMA_CLEAR_IT(IT) (((((IT) & 0xF0000000) == 0x00) || (((IT) & 0xEFF00000) == 0x00)) && ((IT) != 0x00)) + +#define IS_DMA_GET_IT(IT) (((IT) == DMA1_IT_GL1) || ((IT) == DMA1_IT_TC1) || \ + ((IT) == DMA1_IT_HT1) || ((IT) == DMA1_IT_TE1) || \ + ((IT) == DMA1_IT_GL2) || ((IT) == DMA1_IT_TC2) || \ + ((IT) == DMA1_IT_HT2) || ((IT) == DMA1_IT_TE2) || \ + ((IT) == DMA1_IT_GL3) || ((IT) == DMA1_IT_TC3) || \ + ((IT) == DMA1_IT_HT3) || ((IT) == DMA1_IT_TE3) || \ + ((IT) == DMA1_IT_GL4) || ((IT) == DMA1_IT_TC4) || \ + ((IT) == DMA1_IT_HT4) || ((IT) == DMA1_IT_TE4) || \ + ((IT) == DMA1_IT_GL5) || ((IT) == DMA1_IT_TC5) || \ + ((IT) == DMA1_IT_HT5) || ((IT) == DMA1_IT_TE5) || \ + ((IT) == DMA1_IT_GL6) || ((IT) == DMA1_IT_TC6) || \ + ((IT) == DMA1_IT_HT6) || ((IT) == DMA1_IT_TE6) || \ + ((IT) == DMA1_IT_GL7) || ((IT) == DMA1_IT_TC7) || \ + ((IT) == DMA1_IT_HT7) || ((IT) == DMA1_IT_TE7) || \ + ((IT) == DMA2_IT_GL1) || ((IT) == DMA2_IT_TC1) || \ + ((IT) == DMA2_IT_HT1) || ((IT) == DMA2_IT_TE1) || \ + ((IT) == DMA2_IT_GL2) || ((IT) == DMA2_IT_TC2) || \ + ((IT) == DMA2_IT_HT2) || ((IT) == DMA2_IT_TE2) || \ + ((IT) == DMA2_IT_GL3) || ((IT) == DMA2_IT_TC3) || \ + ((IT) == DMA2_IT_HT3) || ((IT) == DMA2_IT_TE3) || \ + ((IT) == DMA2_IT_GL4) || ((IT) == DMA2_IT_TC4) || \ + ((IT) == DMA2_IT_HT4) || ((IT) == DMA2_IT_TE4) || \ + ((IT) == DMA2_IT_GL5) || ((IT) == DMA2_IT_TC5) || \ + ((IT) == DMA2_IT_HT5) || ((IT) == DMA2_IT_TE5)) + +/** + * @} + */ + +/** @defgroup DMA_flags_definition + * @{ + */ +#define DMA1_FLAG_GL1 ((uint32_t)0x00000001) +#define DMA1_FLAG_TC1 ((uint32_t)0x00000002) +#define DMA1_FLAG_HT1 ((uint32_t)0x00000004) +#define DMA1_FLAG_TE1 ((uint32_t)0x00000008) +#define DMA1_FLAG_GL2 ((uint32_t)0x00000010) +#define DMA1_FLAG_TC2 ((uint32_t)0x00000020) +#define DMA1_FLAG_HT2 ((uint32_t)0x00000040) +#define DMA1_FLAG_TE2 ((uint32_t)0x00000080) +#define DMA1_FLAG_GL3 ((uint32_t)0x00000100) +#define DMA1_FLAG_TC3 ((uint32_t)0x00000200) +#define DMA1_FLAG_HT3 ((uint32_t)0x00000400) +#define DMA1_FLAG_TE3 ((uint32_t)0x00000800) +#define DMA1_FLAG_GL4 ((uint32_t)0x00001000) +#define DMA1_FLAG_TC4 ((uint32_t)0x00002000) +#define DMA1_FLAG_HT4 ((uint32_t)0x00004000) +#define DMA1_FLAG_TE4 ((uint32_t)0x00008000) +#define DMA1_FLAG_GL5 ((uint32_t)0x00010000) +#define DMA1_FLAG_TC5 ((uint32_t)0x00020000) +#define DMA1_FLAG_HT5 ((uint32_t)0x00040000) +#define DMA1_FLAG_TE5 ((uint32_t)0x00080000) +#define DMA1_FLAG_GL6 ((uint32_t)0x00100000) +#define DMA1_FLAG_TC6 ((uint32_t)0x00200000) +#define DMA1_FLAG_HT6 ((uint32_t)0x00400000) +#define DMA1_FLAG_TE6 ((uint32_t)0x00800000) +#define DMA1_FLAG_GL7 ((uint32_t)0x01000000) +#define DMA1_FLAG_TC7 ((uint32_t)0x02000000) +#define DMA1_FLAG_HT7 ((uint32_t)0x04000000) +#define DMA1_FLAG_TE7 ((uint32_t)0x08000000) + +#define DMA2_FLAG_GL1 ((uint32_t)0x10000001) +#define DMA2_FLAG_TC1 ((uint32_t)0x10000002) +#define DMA2_FLAG_HT1 ((uint32_t)0x10000004) +#define DMA2_FLAG_TE1 ((uint32_t)0x10000008) +#define DMA2_FLAG_GL2 ((uint32_t)0x10000010) +#define DMA2_FLAG_TC2 ((uint32_t)0x10000020) +#define DMA2_FLAG_HT2 ((uint32_t)0x10000040) +#define DMA2_FLAG_TE2 ((uint32_t)0x10000080) +#define DMA2_FLAG_GL3 ((uint32_t)0x10000100) +#define DMA2_FLAG_TC3 ((uint32_t)0x10000200) +#define DMA2_FLAG_HT3 ((uint32_t)0x10000400) +#define DMA2_FLAG_TE3 ((uint32_t)0x10000800) +#define DMA2_FLAG_GL4 ((uint32_t)0x10001000) +#define DMA2_FLAG_TC4 ((uint32_t)0x10002000) +#define DMA2_FLAG_HT4 ((uint32_t)0x10004000) +#define DMA2_FLAG_TE4 ((uint32_t)0x10008000) +#define DMA2_FLAG_GL5 ((uint32_t)0x10010000) +#define DMA2_FLAG_TC5 ((uint32_t)0x10020000) +#define DMA2_FLAG_HT5 ((uint32_t)0x10040000) +#define DMA2_FLAG_TE5 ((uint32_t)0x10080000) + +#define IS_DMA_CLEAR_FLAG(FLAG) (((((FLAG) & 0xF0000000) == 0x00) || (((FLAG) & 0xEFF00000) == 0x00)) && ((FLAG) != 0x00)) + +#define IS_DMA_GET_FLAG(FLAG) (((FLAG) == DMA1_FLAG_GL1) || ((FLAG) == DMA1_FLAG_TC1) || \ + ((FLAG) == DMA1_FLAG_HT1) || ((FLAG) == DMA1_FLAG_TE1) || \ + ((FLAG) == DMA1_FLAG_GL2) || ((FLAG) == DMA1_FLAG_TC2) || \ + ((FLAG) == DMA1_FLAG_HT2) || ((FLAG) == DMA1_FLAG_TE2) || \ + ((FLAG) == DMA1_FLAG_GL3) || ((FLAG) == DMA1_FLAG_TC3) || \ + ((FLAG) == DMA1_FLAG_HT3) || ((FLAG) == DMA1_FLAG_TE3) || \ + ((FLAG) == DMA1_FLAG_GL4) || ((FLAG) == DMA1_FLAG_TC4) || \ + ((FLAG) == DMA1_FLAG_HT4) || ((FLAG) == DMA1_FLAG_TE4) || \ + ((FLAG) == DMA1_FLAG_GL5) || ((FLAG) == DMA1_FLAG_TC5) || \ + ((FLAG) == DMA1_FLAG_HT5) || ((FLAG) == DMA1_FLAG_TE5) || \ + ((FLAG) == DMA1_FLAG_GL6) || ((FLAG) == DMA1_FLAG_TC6) || \ + ((FLAG) == DMA1_FLAG_HT6) || ((FLAG) == DMA1_FLAG_TE6) || \ + ((FLAG) == DMA1_FLAG_GL7) || ((FLAG) == DMA1_FLAG_TC7) || \ + ((FLAG) == DMA1_FLAG_HT7) || ((FLAG) == DMA1_FLAG_TE7) || \ + ((FLAG) == DMA2_FLAG_GL1) || ((FLAG) == DMA2_FLAG_TC1) || \ + ((FLAG) == DMA2_FLAG_HT1) || ((FLAG) == DMA2_FLAG_TE1) || \ + ((FLAG) == DMA2_FLAG_GL2) || ((FLAG) == DMA2_FLAG_TC2) || \ + ((FLAG) == DMA2_FLAG_HT2) || ((FLAG) == DMA2_FLAG_TE2) || \ + ((FLAG) == DMA2_FLAG_GL3) || ((FLAG) == DMA2_FLAG_TC3) || \ + ((FLAG) == DMA2_FLAG_HT3) || ((FLAG) == DMA2_FLAG_TE3) || \ + ((FLAG) == DMA2_FLAG_GL4) || ((FLAG) == DMA2_FLAG_TC4) || \ + ((FLAG) == DMA2_FLAG_HT4) || ((FLAG) == DMA2_FLAG_TE4) || \ + ((FLAG) == DMA2_FLAG_GL5) || ((FLAG) == DMA2_FLAG_TC5) || \ + ((FLAG) == DMA2_FLAG_HT5) || ((FLAG) == DMA2_FLAG_TE5)) +/** + * @} + */ + +/** @defgroup DMA_Buffer_Size + * @{ + */ + +#define IS_DMA_BUFFER_SIZE(SIZE) (((SIZE) >= 0x1) && ((SIZE) < 0x10000)) + +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup DMA_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup DMA_Exported_Functions + * @{ + */ + +void DMA_DeInit(DMA_Channel_TypeDef* DMAy_Channelx); +void DMA_Init(DMA_Channel_TypeDef* DMAy_Channelx, DMA_InitTypeDef* DMA_InitStruct); +void DMA_StructInit(DMA_InitTypeDef* DMA_InitStruct); +void DMA_Cmd(DMA_Channel_TypeDef* DMAy_Channelx, FunctionalState NewState); +void DMA_ITConfig(DMA_Channel_TypeDef* DMAy_Channelx, uint32_t DMA_IT, FunctionalState NewState); +void DMA_SetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx, uint16_t DataNumber); +uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx); +FlagStatus DMA_GetFlagStatus(uint32_t DMAy_FLAG); +void DMA_ClearFlag(uint32_t DMAy_FLAG); +ITStatus DMA_GetITStatus(uint32_t DMAy_IT); +void DMA_ClearITPendingBit(uint32_t DMAy_IT); + +#ifdef __cplusplus +} +#endif + +#endif /*__STM32F10x_DMA_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_exti.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_exti.h new file mode 100644 index 0000000..a1ab7d0 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_exti.h @@ -0,0 +1,184 @@ +/** + ****************************************************************************** + * @file stm32f10x_exti.h + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief This file contains all the functions prototypes for the EXTI firmware + * library. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_EXTI_H +#define __STM32F10x_EXTI_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup EXTI + * @{ + */ + +/** @defgroup EXTI_Exported_Types + * @{ + */ + +/** + * @brief EXTI mode enumeration + */ + +typedef enum +{ + EXTI_Mode_Interrupt = 0x00, + EXTI_Mode_Event = 0x04 +}EXTIMode_TypeDef; + +#define IS_EXTI_MODE(MODE) (((MODE) == EXTI_Mode_Interrupt) || ((MODE) == EXTI_Mode_Event)) + +/** + * @brief EXTI Trigger enumeration + */ + +typedef enum +{ + EXTI_Trigger_Rising = 0x08, + EXTI_Trigger_Falling = 0x0C, + EXTI_Trigger_Rising_Falling = 0x10 +}EXTITrigger_TypeDef; + +#define IS_EXTI_TRIGGER(TRIGGER) (((TRIGGER) == EXTI_Trigger_Rising) || \ + ((TRIGGER) == EXTI_Trigger_Falling) || \ + ((TRIGGER) == EXTI_Trigger_Rising_Falling)) +/** + * @brief EXTI Init Structure definition + */ + +typedef struct +{ + uint32_t EXTI_Line; /*!< Specifies the EXTI lines to be enabled or disabled. + This parameter can be any combination of @ref EXTI_Lines */ + + EXTIMode_TypeDef EXTI_Mode; /*!< Specifies the mode for the EXTI lines. + This parameter can be a value of @ref EXTIMode_TypeDef */ + + EXTITrigger_TypeDef EXTI_Trigger; /*!< Specifies the trigger signal active edge for the EXTI lines. + This parameter can be a value of @ref EXTIMode_TypeDef */ + + FunctionalState EXTI_LineCmd; /*!< Specifies the new state of the selected EXTI lines. + This parameter can be set either to ENABLE or DISABLE */ +}EXTI_InitTypeDef; + +/** + * @} + */ + +/** @defgroup EXTI_Exported_Constants + * @{ + */ + +/** @defgroup EXTI_Lines + * @{ + */ + +#define EXTI_Line0 ((uint32_t)0x00001) /*!< External interrupt line 0 */ +#define EXTI_Line1 ((uint32_t)0x00002) /*!< External interrupt line 1 */ +#define EXTI_Line2 ((uint32_t)0x00004) /*!< External interrupt line 2 */ +#define EXTI_Line3 ((uint32_t)0x00008) /*!< External interrupt line 3 */ +#define EXTI_Line4 ((uint32_t)0x00010) /*!< External interrupt line 4 */ +#define EXTI_Line5 ((uint32_t)0x00020) /*!< External interrupt line 5 */ +#define EXTI_Line6 ((uint32_t)0x00040) /*!< External interrupt line 6 */ +#define EXTI_Line7 ((uint32_t)0x00080) /*!< External interrupt line 7 */ +#define EXTI_Line8 ((uint32_t)0x00100) /*!< External interrupt line 8 */ +#define EXTI_Line9 ((uint32_t)0x00200) /*!< External interrupt line 9 */ +#define EXTI_Line10 ((uint32_t)0x00400) /*!< External interrupt line 10 */ +#define EXTI_Line11 ((uint32_t)0x00800) /*!< External interrupt line 11 */ +#define EXTI_Line12 ((uint32_t)0x01000) /*!< External interrupt line 12 */ +#define EXTI_Line13 ((uint32_t)0x02000) /*!< External interrupt line 13 */ +#define EXTI_Line14 ((uint32_t)0x04000) /*!< External interrupt line 14 */ +#define EXTI_Line15 ((uint32_t)0x08000) /*!< External interrupt line 15 */ +#define EXTI_Line16 ((uint32_t)0x10000) /*!< External interrupt line 16 Connected to the PVD Output */ +#define EXTI_Line17 ((uint32_t)0x20000) /*!< External interrupt line 17 Connected to the RTC Alarm event */ +#define EXTI_Line18 ((uint32_t)0x40000) /*!< External interrupt line 18 Connected to the USB Device/USB OTG FS + Wakeup from suspend event */ +#define EXTI_Line19 ((uint32_t)0x80000) /*!< External interrupt line 19 Connected to the Ethernet Wakeup event */ + +#define IS_EXTI_LINE(LINE) ((((LINE) & (uint32_t)0xFFF00000) == 0x00) && ((LINE) != (uint16_t)0x00)) +#define IS_GET_EXTI_LINE(LINE) (((LINE) == EXTI_Line0) || ((LINE) == EXTI_Line1) || \ + ((LINE) == EXTI_Line2) || ((LINE) == EXTI_Line3) || \ + ((LINE) == EXTI_Line4) || ((LINE) == EXTI_Line5) || \ + ((LINE) == EXTI_Line6) || ((LINE) == EXTI_Line7) || \ + ((LINE) == EXTI_Line8) || ((LINE) == EXTI_Line9) || \ + ((LINE) == EXTI_Line10) || ((LINE) == EXTI_Line11) || \ + ((LINE) == EXTI_Line12) || ((LINE) == EXTI_Line13) || \ + ((LINE) == EXTI_Line14) || ((LINE) == EXTI_Line15) || \ + ((LINE) == EXTI_Line16) || ((LINE) == EXTI_Line17) || \ + ((LINE) == EXTI_Line18) || ((LINE) == EXTI_Line19)) + + +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup EXTI_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup EXTI_Exported_Functions + * @{ + */ + +void EXTI_DeInit(void); +void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct); +void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct); +void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line); +FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line); +void EXTI_ClearFlag(uint32_t EXTI_Line); +ITStatus EXTI_GetITStatus(uint32_t EXTI_Line); +void EXTI_ClearITPendingBit(uint32_t EXTI_Line); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F10x_EXTI_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_flash.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_flash.h new file mode 100644 index 0000000..f46d4e8 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_flash.h @@ -0,0 +1,426 @@ +/** + ****************************************************************************** + * @file stm32f10x_flash.h + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief This file contains all the functions prototypes for the FLASH + * firmware library. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_FLASH_H +#define __STM32F10x_FLASH_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup FLASH + * @{ + */ + +/** @defgroup FLASH_Exported_Types + * @{ + */ + +/** + * @brief FLASH Status + */ + +typedef enum +{ + FLASH_BUSY = 1, + FLASH_ERROR_PG, + FLASH_ERROR_WRP, + FLASH_COMPLETE, + FLASH_TIMEOUT +}FLASH_Status; + +/** + * @} + */ + +/** @defgroup FLASH_Exported_Constants + * @{ + */ + +/** @defgroup Flash_Latency + * @{ + */ + +#define FLASH_Latency_0 ((uint32_t)0x00000000) /*!< FLASH Zero Latency cycle */ +#define FLASH_Latency_1 ((uint32_t)0x00000001) /*!< FLASH One Latency cycle */ +#define FLASH_Latency_2 ((uint32_t)0x00000002) /*!< FLASH Two Latency cycles */ +#define IS_FLASH_LATENCY(LATENCY) (((LATENCY) == FLASH_Latency_0) || \ + ((LATENCY) == FLASH_Latency_1) || \ + ((LATENCY) == FLASH_Latency_2)) +/** + * @} + */ + +/** @defgroup Half_Cycle_Enable_Disable + * @{ + */ + +#define FLASH_HalfCycleAccess_Enable ((uint32_t)0x00000008) /*!< FLASH Half Cycle Enable */ +#define FLASH_HalfCycleAccess_Disable ((uint32_t)0x00000000) /*!< FLASH Half Cycle Disable */ +#define IS_FLASH_HALFCYCLEACCESS_STATE(STATE) (((STATE) == FLASH_HalfCycleAccess_Enable) || \ + ((STATE) == FLASH_HalfCycleAccess_Disable)) +/** + * @} + */ + +/** @defgroup Prefetch_Buffer_Enable_Disable + * @{ + */ + +#define FLASH_PrefetchBuffer_Enable ((uint32_t)0x00000010) /*!< FLASH Prefetch Buffer Enable */ +#define FLASH_PrefetchBuffer_Disable ((uint32_t)0x00000000) /*!< FLASH Prefetch Buffer Disable */ +#define IS_FLASH_PREFETCHBUFFER_STATE(STATE) (((STATE) == FLASH_PrefetchBuffer_Enable) || \ + ((STATE) == FLASH_PrefetchBuffer_Disable)) +/** + * @} + */ + +/** @defgroup Option_Bytes_Write_Protection + * @{ + */ + +/* Values to be used with STM32 Low and Medium density devices */ +#define FLASH_WRProt_Pages0to3 ((uint32_t)0x00000001) /*!< STM32 Low and Medium density devices: Write protection of page 0 to 3 */ +#define FLASH_WRProt_Pages4to7 ((uint32_t)0x00000002) /*!< STM32 Low and Medium density devices: Write protection of page 4 to 7 */ +#define FLASH_WRProt_Pages8to11 ((uint32_t)0x00000004) /*!< STM32 Low and Medium density devices: Write protection of page 8 to 11 */ +#define FLASH_WRProt_Pages12to15 ((uint32_t)0x00000008) /*!< STM32 Low and Medium density devices: Write protection of page 12 to 15 */ +#define FLASH_WRProt_Pages16to19 ((uint32_t)0x00000010) /*!< STM32 Low and Medium density devices: Write protection of page 16 to 19 */ +#define FLASH_WRProt_Pages20to23 ((uint32_t)0x00000020) /*!< STM32 Low and Medium density devices: Write protection of page 20 to 23 */ +#define FLASH_WRProt_Pages24to27 ((uint32_t)0x00000040) /*!< STM32 Low and Medium density devices: Write protection of page 24 to 27 */ +#define FLASH_WRProt_Pages28to31 ((uint32_t)0x00000080) /*!< STM32 Low and Medium density devices: Write protection of page 28 to 31 */ + +/* Values to be used with STM32 Medium-density devices */ +#define FLASH_WRProt_Pages32to35 ((uint32_t)0x00000100) /*!< STM32 Medium-density devices: Write protection of page 32 to 35 */ +#define FLASH_WRProt_Pages36to39 ((uint32_t)0x00000200) /*!< STM32 Medium-density devices: Write protection of page 36 to 39 */ +#define FLASH_WRProt_Pages40to43 ((uint32_t)0x00000400) /*!< STM32 Medium-density devices: Write protection of page 40 to 43 */ +#define FLASH_WRProt_Pages44to47 ((uint32_t)0x00000800) /*!< STM32 Medium-density devices: Write protection of page 44 to 47 */ +#define FLASH_WRProt_Pages48to51 ((uint32_t)0x00001000) /*!< STM32 Medium-density devices: Write protection of page 48 to 51 */ +#define FLASH_WRProt_Pages52to55 ((uint32_t)0x00002000) /*!< STM32 Medium-density devices: Write protection of page 52 to 55 */ +#define FLASH_WRProt_Pages56to59 ((uint32_t)0x00004000) /*!< STM32 Medium-density devices: Write protection of page 56 to 59 */ +#define FLASH_WRProt_Pages60to63 ((uint32_t)0x00008000) /*!< STM32 Medium-density devices: Write protection of page 60 to 63 */ +#define FLASH_WRProt_Pages64to67 ((uint32_t)0x00010000) /*!< STM32 Medium-density devices: Write protection of page 64 to 67 */ +#define FLASH_WRProt_Pages68to71 ((uint32_t)0x00020000) /*!< STM32 Medium-density devices: Write protection of page 68 to 71 */ +#define FLASH_WRProt_Pages72to75 ((uint32_t)0x00040000) /*!< STM32 Medium-density devices: Write protection of page 72 to 75 */ +#define FLASH_WRProt_Pages76to79 ((uint32_t)0x00080000) /*!< STM32 Medium-density devices: Write protection of page 76 to 79 */ +#define FLASH_WRProt_Pages80to83 ((uint32_t)0x00100000) /*!< STM32 Medium-density devices: Write protection of page 80 to 83 */ +#define FLASH_WRProt_Pages84to87 ((uint32_t)0x00200000) /*!< STM32 Medium-density devices: Write protection of page 84 to 87 */ +#define FLASH_WRProt_Pages88to91 ((uint32_t)0x00400000) /*!< STM32 Medium-density devices: Write protection of page 88 to 91 */ +#define FLASH_WRProt_Pages92to95 ((uint32_t)0x00800000) /*!< STM32 Medium-density devices: Write protection of page 92 to 95 */ +#define FLASH_WRProt_Pages96to99 ((uint32_t)0x01000000) /*!< STM32 Medium-density devices: Write protection of page 96 to 99 */ +#define FLASH_WRProt_Pages100to103 ((uint32_t)0x02000000) /*!< STM32 Medium-density devices: Write protection of page 100 to 103 */ +#define FLASH_WRProt_Pages104to107 ((uint32_t)0x04000000) /*!< STM32 Medium-density devices: Write protection of page 104 to 107 */ +#define FLASH_WRProt_Pages108to111 ((uint32_t)0x08000000) /*!< STM32 Medium-density devices: Write protection of page 108 to 111 */ +#define FLASH_WRProt_Pages112to115 ((uint32_t)0x10000000) /*!< STM32 Medium-density devices: Write protection of page 112 to 115 */ +#define FLASH_WRProt_Pages116to119 ((uint32_t)0x20000000) /*!< STM32 Medium-density devices: Write protection of page 115 to 119 */ +#define FLASH_WRProt_Pages120to123 ((uint32_t)0x40000000) /*!< STM32 Medium-density devices: Write protection of page 120 to 123 */ +#define FLASH_WRProt_Pages124to127 ((uint32_t)0x80000000) /*!< STM32 Medium-density devices: Write protection of page 124 to 127 */ + +/* Values to be used with STM32 High-density and STM32F10X Connectivity line devices */ +#define FLASH_WRProt_Pages0to1 ((uint32_t)0x00000001) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 0 to 1 */ +#define FLASH_WRProt_Pages2to3 ((uint32_t)0x00000002) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 2 to 3 */ +#define FLASH_WRProt_Pages4to5 ((uint32_t)0x00000004) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 4 to 5 */ +#define FLASH_WRProt_Pages6to7 ((uint32_t)0x00000008) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 6 to 7 */ +#define FLASH_WRProt_Pages8to9 ((uint32_t)0x00000010) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 8 to 9 */ +#define FLASH_WRProt_Pages10to11 ((uint32_t)0x00000020) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 10 to 11 */ +#define FLASH_WRProt_Pages12to13 ((uint32_t)0x00000040) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 12 to 13 */ +#define FLASH_WRProt_Pages14to15 ((uint32_t)0x00000080) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 14 to 15 */ +#define FLASH_WRProt_Pages16to17 ((uint32_t)0x00000100) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 16 to 17 */ +#define FLASH_WRProt_Pages18to19 ((uint32_t)0x00000200) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 18 to 19 */ +#define FLASH_WRProt_Pages20to21 ((uint32_t)0x00000400) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 20 to 21 */ +#define FLASH_WRProt_Pages22to23 ((uint32_t)0x00000800) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 22 to 23 */ +#define FLASH_WRProt_Pages24to25 ((uint32_t)0x00001000) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 24 to 25 */ +#define FLASH_WRProt_Pages26to27 ((uint32_t)0x00002000) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 26 to 27 */ +#define FLASH_WRProt_Pages28to29 ((uint32_t)0x00004000) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 28 to 29 */ +#define FLASH_WRProt_Pages30to31 ((uint32_t)0x00008000) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 30 to 31 */ +#define FLASH_WRProt_Pages32to33 ((uint32_t)0x00010000) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 32 to 33 */ +#define FLASH_WRProt_Pages34to35 ((uint32_t)0x00020000) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 34 to 35 */ +#define FLASH_WRProt_Pages36to37 ((uint32_t)0x00040000) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 36 to 37 */ +#define FLASH_WRProt_Pages38to39 ((uint32_t)0x00080000) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 38 to 39 */ +#define FLASH_WRProt_Pages40to41 ((uint32_t)0x00100000) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 40 to 41 */ +#define FLASH_WRProt_Pages42to43 ((uint32_t)0x00200000) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 42 to 43 */ +#define FLASH_WRProt_Pages44to45 ((uint32_t)0x00400000) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 44 to 45 */ +#define FLASH_WRProt_Pages46to47 ((uint32_t)0x00800000) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 46 to 47 */ +#define FLASH_WRProt_Pages48to49 ((uint32_t)0x01000000) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 48 to 49 */ +#define FLASH_WRProt_Pages50to51 ((uint32_t)0x02000000) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 50 to 51 */ +#define FLASH_WRProt_Pages52to53 ((uint32_t)0x04000000) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 52 to 53 */ +#define FLASH_WRProt_Pages54to55 ((uint32_t)0x08000000) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 54 to 55 */ +#define FLASH_WRProt_Pages56to57 ((uint32_t)0x10000000) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 56 to 57 */ +#define FLASH_WRProt_Pages58to59 ((uint32_t)0x20000000) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 58 to 59 */ +#define FLASH_WRProt_Pages60to61 ((uint32_t)0x40000000) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 60 to 61 */ +#define FLASH_WRProt_Pages62to127 ((uint32_t)0x80000000) /*!< STM32 Connectivity line devices: Write protection of page 62 to 127 */ +#define FLASH_WRProt_Pages62to255 ((uint32_t)0x80000000) /*!< STM32 Medium-density devices: Write protection of page 62 to 255 */ +#define FLASH_WRProt_Pages62to511 ((uint32_t)0x80000000) /*!< STM32 XL-density devices: Write protection of page 62 to 511 */ + +#define FLASH_WRProt_AllPages ((uint32_t)0xFFFFFFFF) /*!< Write protection of all Pages */ + +#define IS_FLASH_WRPROT_PAGE(PAGE) (((PAGE) != 0x00000000)) + +#define IS_FLASH_ADDRESS(ADDRESS) (((ADDRESS) >= 0x08000000) && ((ADDRESS) < 0x080FFFFF)) + +#define IS_OB_DATA_ADDRESS(ADDRESS) (((ADDRESS) == 0x1FFFF804) || ((ADDRESS) == 0x1FFFF806)) + +/** + * @} + */ + +/** @defgroup Option_Bytes_IWatchdog + * @{ + */ + +#define OB_IWDG_SW ((uint16_t)0x0001) /*!< Software IWDG selected */ +#define OB_IWDG_HW ((uint16_t)0x0000) /*!< Hardware IWDG selected */ +#define IS_OB_IWDG_SOURCE(SOURCE) (((SOURCE) == OB_IWDG_SW) || ((SOURCE) == OB_IWDG_HW)) + +/** + * @} + */ + +/** @defgroup Option_Bytes_nRST_STOP + * @{ + */ + +#define OB_STOP_NoRST ((uint16_t)0x0002) /*!< No reset generated when entering in STOP */ +#define OB_STOP_RST ((uint16_t)0x0000) /*!< Reset generated when entering in STOP */ +#define IS_OB_STOP_SOURCE(SOURCE) (((SOURCE) == OB_STOP_NoRST) || ((SOURCE) == OB_STOP_RST)) + +/** + * @} + */ + +/** @defgroup Option_Bytes_nRST_STDBY + * @{ + */ + +#define OB_STDBY_NoRST ((uint16_t)0x0004) /*!< No reset generated when entering in STANDBY */ +#define OB_STDBY_RST ((uint16_t)0x0000) /*!< Reset generated when entering in STANDBY */ +#define IS_OB_STDBY_SOURCE(SOURCE) (((SOURCE) == OB_STDBY_NoRST) || ((SOURCE) == OB_STDBY_RST)) + +#ifdef STM32F10X_XL +/** + * @} + */ +/** @defgroup FLASH_Boot + * @{ + */ +#define FLASH_BOOT_Bank1 ((uint16_t)0x0000) /*!< At startup, if boot pins are set in boot from user Flash position + and this parameter is selected the device will boot from Bank1(Default) */ +#define FLASH_BOOT_Bank2 ((uint16_t)0x0001) /*!< At startup, if boot pins are set in boot from user Flash position + and this parameter is selected the device will boot from Bank 2 or Bank 1, + depending on the activation of the bank */ +#define IS_FLASH_BOOT(BOOT) (((BOOT) == FLASH_BOOT_Bank1) || ((BOOT) == FLASH_BOOT_Bank2)) +#endif +/** + * @} + */ +/** @defgroup FLASH_Interrupts + * @{ + */ +#ifdef STM32F10X_XL +#define FLASH_IT_BANK2_ERROR ((uint32_t)0x80000400) /*!< FPEC BANK2 error interrupt source */ +#define FLASH_IT_BANK2_EOP ((uint32_t)0x80001000) /*!< End of FLASH BANK2 Operation Interrupt source */ + +#define FLASH_IT_BANK1_ERROR FLASH_IT_ERROR /*!< FPEC BANK1 error interrupt source */ +#define FLASH_IT_BANK1_EOP FLASH_IT_EOP /*!< End of FLASH BANK1 Operation Interrupt source */ + +#define FLASH_IT_ERROR ((uint32_t)0x00000400) /*!< FPEC BANK1 error interrupt source */ +#define FLASH_IT_EOP ((uint32_t)0x00001000) /*!< End of FLASH BANK1 Operation Interrupt source */ +#define IS_FLASH_IT(IT) ((((IT) & (uint32_t)0x7FFFEBFF) == 0x00000000) && (((IT) != 0x00000000))) +#else +#define FLASH_IT_ERROR ((uint32_t)0x00000400) /*!< FPEC error interrupt source */ +#define FLASH_IT_EOP ((uint32_t)0x00001000) /*!< End of FLASH Operation Interrupt source */ +#define FLASH_IT_BANK1_ERROR FLASH_IT_ERROR /*!< FPEC BANK1 error interrupt source */ +#define FLASH_IT_BANK1_EOP FLASH_IT_EOP /*!< End of FLASH BANK1 Operation Interrupt source */ + +#define IS_FLASH_IT(IT) ((((IT) & (uint32_t)0xFFFFEBFF) == 0x00000000) && (((IT) != 0x00000000))) +#endif + +/** + * @} + */ + +/** @defgroup FLASH_Flags + * @{ + */ +#ifdef STM32F10X_XL +#define FLASH_FLAG_BANK2_BSY ((uint32_t)0x80000001) /*!< FLASH BANK2 Busy flag */ +#define FLASH_FLAG_BANK2_EOP ((uint32_t)0x80000020) /*!< FLASH BANK2 End of Operation flag */ +#define FLASH_FLAG_BANK2_PGERR ((uint32_t)0x80000004) /*!< FLASH BANK2 Program error flag */ +#define FLASH_FLAG_BANK2_WRPRTERR ((uint32_t)0x80000010) /*!< FLASH BANK2 Write protected error flag */ + +#define FLASH_FLAG_BANK1_BSY FLASH_FLAG_BSY /*!< FLASH BANK1 Busy flag*/ +#define FLASH_FLAG_BANK1_EOP FLASH_FLAG_EOP /*!< FLASH BANK1 End of Operation flag */ +#define FLASH_FLAG_BANK1_PGERR FLASH_FLAG_PGERR /*!< FLASH BANK1 Program error flag */ +#define FLASH_FLAG_BANK1_WRPRTERR FLASH_FLAG_WRPRTERR /*!< FLASH BANK1 Write protected error flag */ + +#define FLASH_FLAG_BSY ((uint32_t)0x00000001) /*!< FLASH Busy flag */ +#define FLASH_FLAG_EOP ((uint32_t)0x00000020) /*!< FLASH End of Operation flag */ +#define FLASH_FLAG_PGERR ((uint32_t)0x00000004) /*!< FLASH Program error flag */ +#define FLASH_FLAG_WRPRTERR ((uint32_t)0x00000010) /*!< FLASH Write protected error flag */ +#define FLASH_FLAG_OPTERR ((uint32_t)0x00000001) /*!< FLASH Option Byte error flag */ + +#define IS_FLASH_CLEAR_FLAG(FLAG) ((((FLAG) & (uint32_t)0x7FFFFFCA) == 0x00000000) && ((FLAG) != 0x00000000)) +#define IS_FLASH_GET_FLAG(FLAG) (((FLAG) == FLASH_FLAG_BSY) || ((FLAG) == FLASH_FLAG_EOP) || \ + ((FLAG) == FLASH_FLAG_PGERR) || ((FLAG) == FLASH_FLAG_WRPRTERR) || \ + ((FLAG) == FLASH_FLAG_OPTERR)|| \ + ((FLAG) == FLASH_FLAG_BANK1_BSY) || ((FLAG) == FLASH_FLAG_BANK1_EOP) || \ + ((FLAG) == FLASH_FLAG_BANK1_PGERR) || ((FLAG) == FLASH_FLAG_BANK1_WRPRTERR) || \ + ((FLAG) == FLASH_FLAG_BANK2_BSY) || ((FLAG) == FLASH_FLAG_BANK2_EOP) || \ + ((FLAG) == FLASH_FLAG_BANK2_PGERR) || ((FLAG) == FLASH_FLAG_BANK2_WRPRTERR)) +#else +#define FLASH_FLAG_BSY ((uint32_t)0x00000001) /*!< FLASH Busy flag */ +#define FLASH_FLAG_EOP ((uint32_t)0x00000020) /*!< FLASH End of Operation flag */ +#define FLASH_FLAG_PGERR ((uint32_t)0x00000004) /*!< FLASH Program error flag */ +#define FLASH_FLAG_WRPRTERR ((uint32_t)0x00000010) /*!< FLASH Write protected error flag */ +#define FLASH_FLAG_OPTERR ((uint32_t)0x00000001) /*!< FLASH Option Byte error flag */ + +#define FLASH_FLAG_BANK1_BSY FLASH_FLAG_BSY /*!< FLASH BANK1 Busy flag*/ +#define FLASH_FLAG_BANK1_EOP FLASH_FLAG_EOP /*!< FLASH BANK1 End of Operation flag */ +#define FLASH_FLAG_BANK1_PGERR FLASH_FLAG_PGERR /*!< FLASH BANK1 Program error flag */ +#define FLASH_FLAG_BANK1_WRPRTERR FLASH_FLAG_WRPRTERR /*!< FLASH BANK1 Write protected error flag */ + +#define IS_FLASH_CLEAR_FLAG(FLAG) ((((FLAG) & (uint32_t)0xFFFFFFCA) == 0x00000000) && ((FLAG) != 0x00000000)) +#define IS_FLASH_GET_FLAG(FLAG) (((FLAG) == FLASH_FLAG_BSY) || ((FLAG) == FLASH_FLAG_EOP) || \ + ((FLAG) == FLASH_FLAG_PGERR) || ((FLAG) == FLASH_FLAG_WRPRTERR) || \ + ((FLAG) == FLASH_FLAG_BANK1_BSY) || ((FLAG) == FLASH_FLAG_BANK1_EOP) || \ + ((FLAG) == FLASH_FLAG_BANK1_PGERR) || ((FLAG) == FLASH_FLAG_BANK1_WRPRTERR) || \ + ((FLAG) == FLASH_FLAG_OPTERR)) +#endif + +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup FLASH_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup FLASH_Exported_Functions + * @{ + */ + +/*------------ Functions used for all STM32F10x devices -----*/ +void FLASH_SetLatency(uint32_t FLASH_Latency); +void FLASH_HalfCycleAccessCmd(uint32_t FLASH_HalfCycleAccess); +void FLASH_PrefetchBufferCmd(uint32_t FLASH_PrefetchBuffer); +void FLASH_Unlock(void); +void FLASH_Lock(void); +FLASH_Status FLASH_ErasePage(uint32_t Page_Address); +FLASH_Status FLASH_EraseAllPages(void); +FLASH_Status FLASH_EraseOptionBytes(void); +FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data); +FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data); +FLASH_Status FLASH_ProgramOptionByteData(uint32_t Address, uint8_t Data); +FLASH_Status FLASH_EnableWriteProtection(uint32_t FLASH_Pages); +FLASH_Status FLASH_ReadOutProtection(FunctionalState NewState); +FLASH_Status FLASH_UserOptionByteConfig(uint16_t OB_IWDG, uint16_t OB_STOP, uint16_t OB_STDBY); +uint32_t FLASH_GetUserOptionByte(void); +uint32_t FLASH_GetWriteProtectionOptionByte(void); +FlagStatus FLASH_GetReadOutProtectionStatus(void); +FlagStatus FLASH_GetPrefetchBufferStatus(void); +void FLASH_ITConfig(uint32_t FLASH_IT, FunctionalState NewState); +FlagStatus FLASH_GetFlagStatus(uint32_t FLASH_FLAG); +void FLASH_ClearFlag(uint32_t FLASH_FLAG); +FLASH_Status FLASH_GetStatus(void); +FLASH_Status FLASH_WaitForLastOperation(uint32_t Timeout); + +/*------------ New function used for all STM32F10x devices -----*/ +void FLASH_UnlockBank1(void); +void FLASH_LockBank1(void); +FLASH_Status FLASH_EraseAllBank1Pages(void); +FLASH_Status FLASH_GetBank1Status(void); +FLASH_Status FLASH_WaitForLastBank1Operation(uint32_t Timeout); + +#ifdef STM32F10X_XL +/*---- New Functions used only with STM32F10x_XL density devices -----*/ +void FLASH_UnlockBank2(void); +void FLASH_LockBank2(void); +FLASH_Status FLASH_EraseAllBank2Pages(void); +FLASH_Status FLASH_GetBank2Status(void); +FLASH_Status FLASH_WaitForLastBank2Operation(uint32_t Timeout); +FLASH_Status FLASH_BootConfig(uint16_t FLASH_BOOT); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F10x_FLASH_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_fsmc.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_fsmc.h new file mode 100644 index 0000000..ee707e7 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_fsmc.h @@ -0,0 +1,733 @@ +/** + ****************************************************************************** + * @file stm32f10x_fsmc.h + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief This file contains all the functions prototypes for the FSMC firmware + * library. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_FSMC_H +#define __STM32F10x_FSMC_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup FSMC + * @{ + */ + +/** @defgroup FSMC_Exported_Types + * @{ + */ + +/** + * @brief Timing parameters For NOR/SRAM Banks + */ + +typedef struct +{ + uint32_t FSMC_AddressSetupTime; /*!< Defines the number of HCLK cycles to configure + the duration of the address setup time. + This parameter can be a value between 0 and 0xF. + @note: It is not used with synchronous NOR Flash memories. */ + + uint32_t FSMC_AddressHoldTime; /*!< Defines the number of HCLK cycles to configure + the duration of the address hold time. + This parameter can be a value between 0 and 0xF. + @note: It is not used with synchronous NOR Flash memories.*/ + + uint32_t FSMC_DataSetupTime; /*!< Defines the number of HCLK cycles to configure + the duration of the data setup time. + This parameter can be a value between 0 and 0xFF. + @note: It is used for SRAMs, ROMs and asynchronous multiplexed NOR Flash memories. */ + + uint32_t FSMC_BusTurnAroundDuration; /*!< Defines the number of HCLK cycles to configure + the duration of the bus turnaround. + This parameter can be a value between 0 and 0xF. + @note: It is only used for multiplexed NOR Flash memories. */ + + uint32_t FSMC_CLKDivision; /*!< Defines the period of CLK clock output signal, expressed in number of HCLK cycles. + This parameter can be a value between 1 and 0xF. + @note: This parameter is not used for asynchronous NOR Flash, SRAM or ROM accesses. */ + + uint32_t FSMC_DataLatency; /*!< Defines the number of memory clock cycles to issue + to the memory before getting the first data. + The value of this parameter depends on the memory type as shown below: + - It must be set to 0 in case of a CRAM + - It is don't care in asynchronous NOR, SRAM or ROM accesses + - It may assume a value between 0 and 0xF in NOR Flash memories + with synchronous burst mode enable */ + + uint32_t FSMC_AccessMode; /*!< Specifies the asynchronous access mode. + This parameter can be a value of @ref FSMC_Access_Mode */ +}FSMC_NORSRAMTimingInitTypeDef; + +/** + * @brief FSMC NOR/SRAM Init structure definition + */ + +typedef struct +{ + uint32_t FSMC_Bank; /*!< Specifies the NOR/SRAM memory bank that will be used. + This parameter can be a value of @ref FSMC_NORSRAM_Bank */ + + uint32_t FSMC_DataAddressMux; /*!< Specifies whether the address and data values are + multiplexed on the databus or not. + This parameter can be a value of @ref FSMC_Data_Address_Bus_Multiplexing */ + + uint32_t FSMC_MemoryType; /*!< Specifies the type of external memory attached to + the corresponding memory bank. + This parameter can be a value of @ref FSMC_Memory_Type */ + + uint32_t FSMC_MemoryDataWidth; /*!< Specifies the external memory device width. + This parameter can be a value of @ref FSMC_Data_Width */ + + uint32_t FSMC_BurstAccessMode; /*!< Enables or disables the burst access mode for Flash memory, + valid only with synchronous burst Flash memories. + This parameter can be a value of @ref FSMC_Burst_Access_Mode */ + + uint32_t FSMC_AsynchronousWait; /*!< Enables or disables wait signal during asynchronous transfers, + valid only with asynchronous Flash memories. + This parameter can be a value of @ref FSMC_AsynchronousWait */ + + uint32_t FSMC_WaitSignalPolarity; /*!< Specifies the wait signal polarity, valid only when accessing + the Flash memory in burst mode. + This parameter can be a value of @ref FSMC_Wait_Signal_Polarity */ + + uint32_t FSMC_WrapMode; /*!< Enables or disables the Wrapped burst access mode for Flash + memory, valid only when accessing Flash memories in burst mode. + This parameter can be a value of @ref FSMC_Wrap_Mode */ + + uint32_t FSMC_WaitSignalActive; /*!< Specifies if the wait signal is asserted by the memory one + clock cycle before the wait state or during the wait state, + valid only when accessing memories in burst mode. + This parameter can be a value of @ref FSMC_Wait_Timing */ + + uint32_t FSMC_WriteOperation; /*!< Enables or disables the write operation in the selected bank by the FSMC. + This parameter can be a value of @ref FSMC_Write_Operation */ + + uint32_t FSMC_WaitSignal; /*!< Enables or disables the wait-state insertion via wait + signal, valid for Flash memory access in burst mode. + This parameter can be a value of @ref FSMC_Wait_Signal */ + + uint32_t FSMC_ExtendedMode; /*!< Enables or disables the extended mode. + This parameter can be a value of @ref FSMC_Extended_Mode */ + + uint32_t FSMC_WriteBurst; /*!< Enables or disables the write burst operation. + This parameter can be a value of @ref FSMC_Write_Burst */ + + FSMC_NORSRAMTimingInitTypeDef* FSMC_ReadWriteTimingStruct; /*!< Timing Parameters for write and read access if the ExtendedMode is not used*/ + + FSMC_NORSRAMTimingInitTypeDef* FSMC_WriteTimingStruct; /*!< Timing Parameters for write access if the ExtendedMode is used*/ +}FSMC_NORSRAMInitTypeDef; + +/** + * @brief Timing parameters For FSMC NAND and PCCARD Banks + */ + +typedef struct +{ + uint32_t FSMC_SetupTime; /*!< Defines the number of HCLK cycles to setup address before + the command assertion for NAND-Flash read or write access + to common/Attribute or I/O memory space (depending on + the memory space timing to be configured). + This parameter can be a value between 0 and 0xFF.*/ + + uint32_t FSMC_WaitSetupTime; /*!< Defines the minimum number of HCLK cycles to assert the + command for NAND-Flash read or write access to + common/Attribute or I/O memory space (depending on the + memory space timing to be configured). + This parameter can be a number between 0x00 and 0xFF */ + + uint32_t FSMC_HoldSetupTime; /*!< Defines the number of HCLK clock cycles to hold address + (and data for write access) after the command deassertion + for NAND-Flash read or write access to common/Attribute + or I/O memory space (depending on the memory space timing + to be configured). + This parameter can be a number between 0x00 and 0xFF */ + + uint32_t FSMC_HiZSetupTime; /*!< Defines the number of HCLK clock cycles during which the + databus is kept in HiZ after the start of a NAND-Flash + write access to common/Attribute or I/O memory space (depending + on the memory space timing to be configured). + This parameter can be a number between 0x00 and 0xFF */ +}FSMC_NAND_PCCARDTimingInitTypeDef; + +/** + * @brief FSMC NAND Init structure definition + */ + +typedef struct +{ + uint32_t FSMC_Bank; /*!< Specifies the NAND memory bank that will be used. + This parameter can be a value of @ref FSMC_NAND_Bank */ + + uint32_t FSMC_Waitfeature; /*!< Enables or disables the Wait feature for the NAND Memory Bank. + This parameter can be any value of @ref FSMC_Wait_feature */ + + uint32_t FSMC_MemoryDataWidth; /*!< Specifies the external memory device width. + This parameter can be any value of @ref FSMC_Data_Width */ + + uint32_t FSMC_ECC; /*!< Enables or disables the ECC computation. + This parameter can be any value of @ref FSMC_ECC */ + + uint32_t FSMC_ECCPageSize; /*!< Defines the page size for the extended ECC. + This parameter can be any value of @ref FSMC_ECC_Page_Size */ + + uint32_t FSMC_TCLRSetupTime; /*!< Defines the number of HCLK cycles to configure the + delay between CLE low and RE low. + This parameter can be a value between 0 and 0xFF. */ + + uint32_t FSMC_TARSetupTime; /*!< Defines the number of HCLK cycles to configure the + delay between ALE low and RE low. + This parameter can be a number between 0x0 and 0xFF */ + + FSMC_NAND_PCCARDTimingInitTypeDef* FSMC_CommonSpaceTimingStruct; /*!< FSMC Common Space Timing */ + + FSMC_NAND_PCCARDTimingInitTypeDef* FSMC_AttributeSpaceTimingStruct; /*!< FSMC Attribute Space Timing */ +}FSMC_NANDInitTypeDef; + +/** + * @brief FSMC PCCARD Init structure definition + */ + +typedef struct +{ + uint32_t FSMC_Waitfeature; /*!< Enables or disables the Wait feature for the Memory Bank. + This parameter can be any value of @ref FSMC_Wait_feature */ + + uint32_t FSMC_TCLRSetupTime; /*!< Defines the number of HCLK cycles to configure the + delay between CLE low and RE low. + This parameter can be a value between 0 and 0xFF. */ + + uint32_t FSMC_TARSetupTime; /*!< Defines the number of HCLK cycles to configure the + delay between ALE low and RE low. + This parameter can be a number between 0x0 and 0xFF */ + + + FSMC_NAND_PCCARDTimingInitTypeDef* FSMC_CommonSpaceTimingStruct; /*!< FSMC Common Space Timing */ + + FSMC_NAND_PCCARDTimingInitTypeDef* FSMC_AttributeSpaceTimingStruct; /*!< FSMC Attribute Space Timing */ + + FSMC_NAND_PCCARDTimingInitTypeDef* FSMC_IOSpaceTimingStruct; /*!< FSMC IO Space Timing */ +}FSMC_PCCARDInitTypeDef; + +/** + * @} + */ + +/** @defgroup FSMC_Exported_Constants + * @{ + */ + +/** @defgroup FSMC_NORSRAM_Bank + * @{ + */ +#define FSMC_Bank1_NORSRAM1 ((uint32_t)0x00000000) +#define FSMC_Bank1_NORSRAM2 ((uint32_t)0x00000002) +#define FSMC_Bank1_NORSRAM3 ((uint32_t)0x00000004) +#define FSMC_Bank1_NORSRAM4 ((uint32_t)0x00000006) +/** + * @} + */ + +/** @defgroup FSMC_NAND_Bank + * @{ + */ +#define FSMC_Bank2_NAND ((uint32_t)0x00000010) +#define FSMC_Bank3_NAND ((uint32_t)0x00000100) +/** + * @} + */ + +/** @defgroup FSMC_PCCARD_Bank + * @{ + */ +#define FSMC_Bank4_PCCARD ((uint32_t)0x00001000) +/** + * @} + */ + +#define IS_FSMC_NORSRAM_BANK(BANK) (((BANK) == FSMC_Bank1_NORSRAM1) || \ + ((BANK) == FSMC_Bank1_NORSRAM2) || \ + ((BANK) == FSMC_Bank1_NORSRAM3) || \ + ((BANK) == FSMC_Bank1_NORSRAM4)) + +#define IS_FSMC_NAND_BANK(BANK) (((BANK) == FSMC_Bank2_NAND) || \ + ((BANK) == FSMC_Bank3_NAND)) + +#define IS_FSMC_GETFLAG_BANK(BANK) (((BANK) == FSMC_Bank2_NAND) || \ + ((BANK) == FSMC_Bank3_NAND) || \ + ((BANK) == FSMC_Bank4_PCCARD)) + +#define IS_FSMC_IT_BANK(BANK) (((BANK) == FSMC_Bank2_NAND) || \ + ((BANK) == FSMC_Bank3_NAND) || \ + ((BANK) == FSMC_Bank4_PCCARD)) + +/** @defgroup NOR_SRAM_Controller + * @{ + */ + +/** @defgroup FSMC_Data_Address_Bus_Multiplexing + * @{ + */ + +#define FSMC_DataAddressMux_Disable ((uint32_t)0x00000000) +#define FSMC_DataAddressMux_Enable ((uint32_t)0x00000002) +#define IS_FSMC_MUX(MUX) (((MUX) == FSMC_DataAddressMux_Disable) || \ + ((MUX) == FSMC_DataAddressMux_Enable)) + +/** + * @} + */ + +/** @defgroup FSMC_Memory_Type + * @{ + */ + +#define FSMC_MemoryType_SRAM ((uint32_t)0x00000000) +#define FSMC_MemoryType_PSRAM ((uint32_t)0x00000004) +#define FSMC_MemoryType_NOR ((uint32_t)0x00000008) +#define IS_FSMC_MEMORY(MEMORY) (((MEMORY) == FSMC_MemoryType_SRAM) || \ + ((MEMORY) == FSMC_MemoryType_PSRAM)|| \ + ((MEMORY) == FSMC_MemoryType_NOR)) + +/** + * @} + */ + +/** @defgroup FSMC_Data_Width + * @{ + */ + +#define FSMC_MemoryDataWidth_8b ((uint32_t)0x00000000) +#define FSMC_MemoryDataWidth_16b ((uint32_t)0x00000010) +#define IS_FSMC_MEMORY_WIDTH(WIDTH) (((WIDTH) == FSMC_MemoryDataWidth_8b) || \ + ((WIDTH) == FSMC_MemoryDataWidth_16b)) + +/** + * @} + */ + +/** @defgroup FSMC_Burst_Access_Mode + * @{ + */ + +#define FSMC_BurstAccessMode_Disable ((uint32_t)0x00000000) +#define FSMC_BurstAccessMode_Enable ((uint32_t)0x00000100) +#define IS_FSMC_BURSTMODE(STATE) (((STATE) == FSMC_BurstAccessMode_Disable) || \ + ((STATE) == FSMC_BurstAccessMode_Enable)) +/** + * @} + */ + +/** @defgroup FSMC_AsynchronousWait + * @{ + */ +#define FSMC_AsynchronousWait_Disable ((uint32_t)0x00000000) +#define FSMC_AsynchronousWait_Enable ((uint32_t)0x00008000) +#define IS_FSMC_ASYNWAIT(STATE) (((STATE) == FSMC_AsynchronousWait_Disable) || \ + ((STATE) == FSMC_AsynchronousWait_Enable)) + +/** + * @} + */ + +/** @defgroup FSMC_Wait_Signal_Polarity + * @{ + */ + +#define FSMC_WaitSignalPolarity_Low ((uint32_t)0x00000000) +#define FSMC_WaitSignalPolarity_High ((uint32_t)0x00000200) +#define IS_FSMC_WAIT_POLARITY(POLARITY) (((POLARITY) == FSMC_WaitSignalPolarity_Low) || \ + ((POLARITY) == FSMC_WaitSignalPolarity_High)) + +/** + * @} + */ + +/** @defgroup FSMC_Wrap_Mode + * @{ + */ + +#define FSMC_WrapMode_Disable ((uint32_t)0x00000000) +#define FSMC_WrapMode_Enable ((uint32_t)0x00000400) +#define IS_FSMC_WRAP_MODE(MODE) (((MODE) == FSMC_WrapMode_Disable) || \ + ((MODE) == FSMC_WrapMode_Enable)) + +/** + * @} + */ + +/** @defgroup FSMC_Wait_Timing + * @{ + */ + +#define FSMC_WaitSignalActive_BeforeWaitState ((uint32_t)0x00000000) +#define FSMC_WaitSignalActive_DuringWaitState ((uint32_t)0x00000800) +#define IS_FSMC_WAIT_SIGNAL_ACTIVE(ACTIVE) (((ACTIVE) == FSMC_WaitSignalActive_BeforeWaitState) || \ + ((ACTIVE) == FSMC_WaitSignalActive_DuringWaitState)) + +/** + * @} + */ + +/** @defgroup FSMC_Write_Operation + * @{ + */ + +#define FSMC_WriteOperation_Disable ((uint32_t)0x00000000) +#define FSMC_WriteOperation_Enable ((uint32_t)0x00001000) +#define IS_FSMC_WRITE_OPERATION(OPERATION) (((OPERATION) == FSMC_WriteOperation_Disable) || \ + ((OPERATION) == FSMC_WriteOperation_Enable)) + +/** + * @} + */ + +/** @defgroup FSMC_Wait_Signal + * @{ + */ + +#define FSMC_WaitSignal_Disable ((uint32_t)0x00000000) +#define FSMC_WaitSignal_Enable ((uint32_t)0x00002000) +#define IS_FSMC_WAITE_SIGNAL(SIGNAL) (((SIGNAL) == FSMC_WaitSignal_Disable) || \ + ((SIGNAL) == FSMC_WaitSignal_Enable)) +/** + * @} + */ + +/** @defgroup FSMC_Extended_Mode + * @{ + */ + +#define FSMC_ExtendedMode_Disable ((uint32_t)0x00000000) +#define FSMC_ExtendedMode_Enable ((uint32_t)0x00004000) + +#define IS_FSMC_EXTENDED_MODE(MODE) (((MODE) == FSMC_ExtendedMode_Disable) || \ + ((MODE) == FSMC_ExtendedMode_Enable)) + +/** + * @} + */ + +/** @defgroup FSMC_Write_Burst + * @{ + */ + +#define FSMC_WriteBurst_Disable ((uint32_t)0x00000000) +#define FSMC_WriteBurst_Enable ((uint32_t)0x00080000) +#define IS_FSMC_WRITE_BURST(BURST) (((BURST) == FSMC_WriteBurst_Disable) || \ + ((BURST) == FSMC_WriteBurst_Enable)) +/** + * @} + */ + +/** @defgroup FSMC_Address_Setup_Time + * @{ + */ + +#define IS_FSMC_ADDRESS_SETUP_TIME(TIME) ((TIME) <= 0xF) + +/** + * @} + */ + +/** @defgroup FSMC_Address_Hold_Time + * @{ + */ + +#define IS_FSMC_ADDRESS_HOLD_TIME(TIME) ((TIME) <= 0xF) + +/** + * @} + */ + +/** @defgroup FSMC_Data_Setup_Time + * @{ + */ + +#define IS_FSMC_DATASETUP_TIME(TIME) (((TIME) > 0) && ((TIME) <= 0xFF)) + +/** + * @} + */ + +/** @defgroup FSMC_Bus_Turn_around_Duration + * @{ + */ + +#define IS_FSMC_TURNAROUND_TIME(TIME) ((TIME) <= 0xF) + +/** + * @} + */ + +/** @defgroup FSMC_CLK_Division + * @{ + */ + +#define IS_FSMC_CLK_DIV(DIV) ((DIV) <= 0xF) + +/** + * @} + */ + +/** @defgroup FSMC_Data_Latency + * @{ + */ + +#define IS_FSMC_DATA_LATENCY(LATENCY) ((LATENCY) <= 0xF) + +/** + * @} + */ + +/** @defgroup FSMC_Access_Mode + * @{ + */ + +#define FSMC_AccessMode_A ((uint32_t)0x00000000) +#define FSMC_AccessMode_B ((uint32_t)0x10000000) +#define FSMC_AccessMode_C ((uint32_t)0x20000000) +#define FSMC_AccessMode_D ((uint32_t)0x30000000) +#define IS_FSMC_ACCESS_MODE(MODE) (((MODE) == FSMC_AccessMode_A) || \ + ((MODE) == FSMC_AccessMode_B) || \ + ((MODE) == FSMC_AccessMode_C) || \ + ((MODE) == FSMC_AccessMode_D)) + +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup NAND_PCCARD_Controller + * @{ + */ + +/** @defgroup FSMC_Wait_feature + * @{ + */ + +#define FSMC_Waitfeature_Disable ((uint32_t)0x00000000) +#define FSMC_Waitfeature_Enable ((uint32_t)0x00000002) +#define IS_FSMC_WAIT_FEATURE(FEATURE) (((FEATURE) == FSMC_Waitfeature_Disable) || \ + ((FEATURE) == FSMC_Waitfeature_Enable)) + +/** + * @} + */ + + +/** @defgroup FSMC_ECC + * @{ + */ + +#define FSMC_ECC_Disable ((uint32_t)0x00000000) +#define FSMC_ECC_Enable ((uint32_t)0x00000040) +#define IS_FSMC_ECC_STATE(STATE) (((STATE) == FSMC_ECC_Disable) || \ + ((STATE) == FSMC_ECC_Enable)) + +/** + * @} + */ + +/** @defgroup FSMC_ECC_Page_Size + * @{ + */ + +#define FSMC_ECCPageSize_256Bytes ((uint32_t)0x00000000) +#define FSMC_ECCPageSize_512Bytes ((uint32_t)0x00020000) +#define FSMC_ECCPageSize_1024Bytes ((uint32_t)0x00040000) +#define FSMC_ECCPageSize_2048Bytes ((uint32_t)0x00060000) +#define FSMC_ECCPageSize_4096Bytes ((uint32_t)0x00080000) +#define FSMC_ECCPageSize_8192Bytes ((uint32_t)0x000A0000) +#define IS_FSMC_ECCPAGE_SIZE(SIZE) (((SIZE) == FSMC_ECCPageSize_256Bytes) || \ + ((SIZE) == FSMC_ECCPageSize_512Bytes) || \ + ((SIZE) == FSMC_ECCPageSize_1024Bytes) || \ + ((SIZE) == FSMC_ECCPageSize_2048Bytes) || \ + ((SIZE) == FSMC_ECCPageSize_4096Bytes) || \ + ((SIZE) == FSMC_ECCPageSize_8192Bytes)) + +/** + * @} + */ + +/** @defgroup FSMC_TCLR_Setup_Time + * @{ + */ + +#define IS_FSMC_TCLR_TIME(TIME) ((TIME) <= 0xFF) + +/** + * @} + */ + +/** @defgroup FSMC_TAR_Setup_Time + * @{ + */ + +#define IS_FSMC_TAR_TIME(TIME) ((TIME) <= 0xFF) + +/** + * @} + */ + +/** @defgroup FSMC_Setup_Time + * @{ + */ + +#define IS_FSMC_SETUP_TIME(TIME) ((TIME) <= 0xFF) + +/** + * @} + */ + +/** @defgroup FSMC_Wait_Setup_Time + * @{ + */ + +#define IS_FSMC_WAIT_TIME(TIME) ((TIME) <= 0xFF) + +/** + * @} + */ + +/** @defgroup FSMC_Hold_Setup_Time + * @{ + */ + +#define IS_FSMC_HOLD_TIME(TIME) ((TIME) <= 0xFF) + +/** + * @} + */ + +/** @defgroup FSMC_HiZ_Setup_Time + * @{ + */ + +#define IS_FSMC_HIZ_TIME(TIME) ((TIME) <= 0xFF) + +/** + * @} + */ + +/** @defgroup FSMC_Interrupt_sources + * @{ + */ + +#define FSMC_IT_RisingEdge ((uint32_t)0x00000008) +#define FSMC_IT_Level ((uint32_t)0x00000010) +#define FSMC_IT_FallingEdge ((uint32_t)0x00000020) +#define IS_FSMC_IT(IT) ((((IT) & (uint32_t)0xFFFFFFC7) == 0x00000000) && ((IT) != 0x00000000)) +#define IS_FSMC_GET_IT(IT) (((IT) == FSMC_IT_RisingEdge) || \ + ((IT) == FSMC_IT_Level) || \ + ((IT) == FSMC_IT_FallingEdge)) +/** + * @} + */ + +/** @defgroup FSMC_Flags + * @{ + */ + +#define FSMC_FLAG_RisingEdge ((uint32_t)0x00000001) +#define FSMC_FLAG_Level ((uint32_t)0x00000002) +#define FSMC_FLAG_FallingEdge ((uint32_t)0x00000004) +#define FSMC_FLAG_FEMPT ((uint32_t)0x00000040) +#define IS_FSMC_GET_FLAG(FLAG) (((FLAG) == FSMC_FLAG_RisingEdge) || \ + ((FLAG) == FSMC_FLAG_Level) || \ + ((FLAG) == FSMC_FLAG_FallingEdge) || \ + ((FLAG) == FSMC_FLAG_FEMPT)) + +#define IS_FSMC_CLEAR_FLAG(FLAG) ((((FLAG) & (uint32_t)0xFFFFFFF8) == 0x00000000) && ((FLAG) != 0x00000000)) + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup FSMC_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup FSMC_Exported_Functions + * @{ + */ + +void FSMC_NORSRAMDeInit(uint32_t FSMC_Bank); +void FSMC_NANDDeInit(uint32_t FSMC_Bank); +void FSMC_PCCARDDeInit(void); +void FSMC_NORSRAMInit(FSMC_NORSRAMInitTypeDef* FSMC_NORSRAMInitStruct); +void FSMC_NANDInit(FSMC_NANDInitTypeDef* FSMC_NANDInitStruct); +void FSMC_PCCARDInit(FSMC_PCCARDInitTypeDef* FSMC_PCCARDInitStruct); +void FSMC_NORSRAMStructInit(FSMC_NORSRAMInitTypeDef* FSMC_NORSRAMInitStruct); +void FSMC_NANDStructInit(FSMC_NANDInitTypeDef* FSMC_NANDInitStruct); +void FSMC_PCCARDStructInit(FSMC_PCCARDInitTypeDef* FSMC_PCCARDInitStruct); +void FSMC_NORSRAMCmd(uint32_t FSMC_Bank, FunctionalState NewState); +void FSMC_NANDCmd(uint32_t FSMC_Bank, FunctionalState NewState); +void FSMC_PCCARDCmd(FunctionalState NewState); +void FSMC_NANDECCCmd(uint32_t FSMC_Bank, FunctionalState NewState); +uint32_t FSMC_GetECC(uint32_t FSMC_Bank); +void FSMC_ITConfig(uint32_t FSMC_Bank, uint32_t FSMC_IT, FunctionalState NewState); +FlagStatus FSMC_GetFlagStatus(uint32_t FSMC_Bank, uint32_t FSMC_FLAG); +void FSMC_ClearFlag(uint32_t FSMC_Bank, uint32_t FSMC_FLAG); +ITStatus FSMC_GetITStatus(uint32_t FSMC_Bank, uint32_t FSMC_IT); +void FSMC_ClearITPendingBit(uint32_t FSMC_Bank, uint32_t FSMC_IT); + +#ifdef __cplusplus +} +#endif + +#endif /*__STM32F10x_FSMC_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_gpio.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_gpio.h new file mode 100644 index 0000000..b8aa49a --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_gpio.h @@ -0,0 +1,385 @@ +/** + ****************************************************************************** + * @file stm32f10x_gpio.h + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief This file contains all the functions prototypes for the GPIO + * firmware library. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_GPIO_H +#define __STM32F10x_GPIO_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup GPIO + * @{ + */ + +/** @defgroup GPIO_Exported_Types + * @{ + */ + +#define IS_GPIO_ALL_PERIPH(PERIPH) (((PERIPH) == GPIOA) || \ + ((PERIPH) == GPIOB) || \ + ((PERIPH) == GPIOC) || \ + ((PERIPH) == GPIOD) || \ + ((PERIPH) == GPIOE) || \ + ((PERIPH) == GPIOF) || \ + ((PERIPH) == GPIOG)) + +/** + * @brief Output Maximum frequency selection + */ + +typedef enum +{ + GPIO_Speed_10MHz = 1, + GPIO_Speed_2MHz, + GPIO_Speed_50MHz +}GPIOSpeed_TypeDef; +#define IS_GPIO_SPEED(SPEED) (((SPEED) == GPIO_Speed_10MHz) || ((SPEED) == GPIO_Speed_2MHz) || \ + ((SPEED) == GPIO_Speed_50MHz)) + +/** + * @brief Configuration Mode enumeration + */ + +typedef enum +{ GPIO_Mode_AIN = 0x0, + GPIO_Mode_IN_FLOATING = 0x04, + GPIO_Mode_IPD = 0x28, + GPIO_Mode_IPU = 0x48, + GPIO_Mode_Out_OD = 0x14, + GPIO_Mode_Out_PP = 0x10, + GPIO_Mode_AF_OD = 0x1C, + GPIO_Mode_AF_PP = 0x18 +}GPIOMode_TypeDef; + +#define IS_GPIO_MODE(MODE) (((MODE) == GPIO_Mode_AIN) || ((MODE) == GPIO_Mode_IN_FLOATING) || \ + ((MODE) == GPIO_Mode_IPD) || ((MODE) == GPIO_Mode_IPU) || \ + ((MODE) == GPIO_Mode_Out_OD) || ((MODE) == GPIO_Mode_Out_PP) || \ + ((MODE) == GPIO_Mode_AF_OD) || ((MODE) == GPIO_Mode_AF_PP)) + +/** + * @brief GPIO Init structure definition + */ + +typedef struct +{ + uint16_t GPIO_Pin; /*!< Specifies the GPIO pins to be configured. + This parameter can be any value of @ref GPIO_pins_define */ + + GPIOSpeed_TypeDef GPIO_Speed; /*!< Specifies the speed for the selected pins. + This parameter can be a value of @ref GPIOSpeed_TypeDef */ + + GPIOMode_TypeDef GPIO_Mode; /*!< Specifies the operating mode for the selected pins. + This parameter can be a value of @ref GPIOMode_TypeDef */ +}GPIO_InitTypeDef; + + +/** + * @brief Bit_SET and Bit_RESET enumeration + */ + +typedef enum +{ Bit_RESET = 0, + Bit_SET +}BitAction; + +#define IS_GPIO_BIT_ACTION(ACTION) (((ACTION) == Bit_RESET) || ((ACTION) == Bit_SET)) + +/** + * @} + */ + +/** @defgroup GPIO_Exported_Constants + * @{ + */ + +/** @defgroup GPIO_pins_define + * @{ + */ + +#define GPIO_Pin_0 ((uint16_t)0x0001) /*!< Pin 0 selected */ +#define GPIO_Pin_1 ((uint16_t)0x0002) /*!< Pin 1 selected */ +#define GPIO_Pin_2 ((uint16_t)0x0004) /*!< Pin 2 selected */ +#define GPIO_Pin_3 ((uint16_t)0x0008) /*!< Pin 3 selected */ +#define GPIO_Pin_4 ((uint16_t)0x0010) /*!< Pin 4 selected */ +#define GPIO_Pin_5 ((uint16_t)0x0020) /*!< Pin 5 selected */ +#define GPIO_Pin_6 ((uint16_t)0x0040) /*!< Pin 6 selected */ +#define GPIO_Pin_7 ((uint16_t)0x0080) /*!< Pin 7 selected */ +#define GPIO_Pin_8 ((uint16_t)0x0100) /*!< Pin 8 selected */ +#define GPIO_Pin_9 ((uint16_t)0x0200) /*!< Pin 9 selected */ +#define GPIO_Pin_10 ((uint16_t)0x0400) /*!< Pin 10 selected */ +#define GPIO_Pin_11 ((uint16_t)0x0800) /*!< Pin 11 selected */ +#define GPIO_Pin_12 ((uint16_t)0x1000) /*!< Pin 12 selected */ +#define GPIO_Pin_13 ((uint16_t)0x2000) /*!< Pin 13 selected */ +#define GPIO_Pin_14 ((uint16_t)0x4000) /*!< Pin 14 selected */ +#define GPIO_Pin_15 ((uint16_t)0x8000) /*!< Pin 15 selected */ +#define GPIO_Pin_All ((uint16_t)0xFFFF) /*!< All pins selected */ + +#define IS_GPIO_PIN(PIN) ((((PIN) & (uint16_t)0x00) == 0x00) && ((PIN) != (uint16_t)0x00)) + +#define IS_GET_GPIO_PIN(PIN) (((PIN) == GPIO_Pin_0) || \ + ((PIN) == GPIO_Pin_1) || \ + ((PIN) == GPIO_Pin_2) || \ + ((PIN) == GPIO_Pin_3) || \ + ((PIN) == GPIO_Pin_4) || \ + ((PIN) == GPIO_Pin_5) || \ + ((PIN) == GPIO_Pin_6) || \ + ((PIN) == GPIO_Pin_7) || \ + ((PIN) == GPIO_Pin_8) || \ + ((PIN) == GPIO_Pin_9) || \ + ((PIN) == GPIO_Pin_10) || \ + ((PIN) == GPIO_Pin_11) || \ + ((PIN) == GPIO_Pin_12) || \ + ((PIN) == GPIO_Pin_13) || \ + ((PIN) == GPIO_Pin_14) || \ + ((PIN) == GPIO_Pin_15)) + +/** + * @} + */ + +/** @defgroup GPIO_Remap_define + * @{ + */ + +#define GPIO_Remap_SPI1 ((uint32_t)0x00000001) /*!< SPI1 Alternate Function mapping */ +#define GPIO_Remap_I2C1 ((uint32_t)0x00000002) /*!< I2C1 Alternate Function mapping */ +#define GPIO_Remap_USART1 ((uint32_t)0x00000004) /*!< USART1 Alternate Function mapping */ +#define GPIO_Remap_USART2 ((uint32_t)0x00000008) /*!< USART2 Alternate Function mapping */ +#define GPIO_PartialRemap_USART3 ((uint32_t)0x00140010) /*!< USART3 Partial Alternate Function mapping */ +#define GPIO_FullRemap_USART3 ((uint32_t)0x00140030) /*!< USART3 Full Alternate Function mapping */ +#define GPIO_PartialRemap_TIM1 ((uint32_t)0x00160040) /*!< TIM1 Partial Alternate Function mapping */ +#define GPIO_FullRemap_TIM1 ((uint32_t)0x001600C0) /*!< TIM1 Full Alternate Function mapping */ +#define GPIO_PartialRemap1_TIM2 ((uint32_t)0x00180100) /*!< TIM2 Partial1 Alternate Function mapping */ +#define GPIO_PartialRemap2_TIM2 ((uint32_t)0x00180200) /*!< TIM2 Partial2 Alternate Function mapping */ +#define GPIO_FullRemap_TIM2 ((uint32_t)0x00180300) /*!< TIM2 Full Alternate Function mapping */ +#define GPIO_PartialRemap_TIM3 ((uint32_t)0x001A0800) /*!< TIM3 Partial Alternate Function mapping */ +#define GPIO_FullRemap_TIM3 ((uint32_t)0x001A0C00) /*!< TIM3 Full Alternate Function mapping */ +#define GPIO_Remap_TIM4 ((uint32_t)0x00001000) /*!< TIM4 Alternate Function mapping */ +#define GPIO_Remap1_CAN1 ((uint32_t)0x001D4000) /*!< CAN1 Alternate Function mapping */ +#define GPIO_Remap2_CAN1 ((uint32_t)0x001D6000) /*!< CAN1 Alternate Function mapping */ +#define GPIO_Remap_PD01 ((uint32_t)0x00008000) /*!< PD01 Alternate Function mapping */ +#define GPIO_Remap_TIM5CH4_LSI ((uint32_t)0x00200001) /*!< LSI connected to TIM5 Channel4 input capture for calibration */ +#define GPIO_Remap_ADC1_ETRGINJ ((uint32_t)0x00200002) /*!< ADC1 External Trigger Injected Conversion remapping */ +#define GPIO_Remap_ADC1_ETRGREG ((uint32_t)0x00200004) /*!< ADC1 External Trigger Regular Conversion remapping */ +#define GPIO_Remap_ADC2_ETRGINJ ((uint32_t)0x00200008) /*!< ADC2 External Trigger Injected Conversion remapping */ +#define GPIO_Remap_ADC2_ETRGREG ((uint32_t)0x00200010) /*!< ADC2 External Trigger Regular Conversion remapping */ +#define GPIO_Remap_ETH ((uint32_t)0x00200020) /*!< Ethernet remapping (only for Connectivity line devices) */ +#define GPIO_Remap_CAN2 ((uint32_t)0x00200040) /*!< CAN2 remapping (only for Connectivity line devices) */ +#define GPIO_Remap_SWJ_NoJTRST ((uint32_t)0x00300100) /*!< Full SWJ Enabled (JTAG-DP + SW-DP) but without JTRST */ +#define GPIO_Remap_SWJ_JTAGDisable ((uint32_t)0x00300200) /*!< JTAG-DP Disabled and SW-DP Enabled */ +#define GPIO_Remap_SWJ_Disable ((uint32_t)0x00300400) /*!< Full SWJ Disabled (JTAG-DP + SW-DP) */ +#define GPIO_Remap_SPI3 ((uint32_t)0x00201100) /*!< SPI3/I2S3 Alternate Function mapping (only for Connectivity line devices) */ +#define GPIO_Remap_TIM2ITR1_PTP_SOF ((uint32_t)0x00202000) /*!< Ethernet PTP output or USB OTG SOF (Start of Frame) connected + to TIM2 Internal Trigger 1 for calibration + (only for Connectivity line devices) */ +#define GPIO_Remap_PTP_PPS ((uint32_t)0x00204000) /*!< Ethernet MAC PPS_PTS output on PB05 (only for Connectivity line devices) */ + +#define GPIO_Remap_TIM15 ((uint32_t)0x80000001) /*!< TIM15 Alternate Function mapping (only for Value line devices) */ +#define GPIO_Remap_TIM16 ((uint32_t)0x80000002) /*!< TIM16 Alternate Function mapping (only for Value line devices) */ +#define GPIO_Remap_TIM17 ((uint32_t)0x80000004) /*!< TIM17 Alternate Function mapping (only for Value line devices) */ +#define GPIO_Remap_CEC ((uint32_t)0x80000008) /*!< CEC Alternate Function mapping (only for Value line devices) */ +#define GPIO_Remap_TIM1_DMA ((uint32_t)0x80000010) /*!< TIM1 DMA requests mapping (only for Value line devices) */ + +#define GPIO_Remap_TIM9 ((uint32_t)0x80000020) /*!< TIM9 Alternate Function mapping (only for XL-density devices) */ +#define GPIO_Remap_TIM10 ((uint32_t)0x80000040) /*!< TIM10 Alternate Function mapping (only for XL-density devices) */ +#define GPIO_Remap_TIM11 ((uint32_t)0x80000080) /*!< TIM11 Alternate Function mapping (only for XL-density devices) */ +#define GPIO_Remap_TIM13 ((uint32_t)0x80000100) /*!< TIM13 Alternate Function mapping (only for High density Value line and XL-density devices) */ +#define GPIO_Remap_TIM14 ((uint32_t)0x80000200) /*!< TIM14 Alternate Function mapping (only for High density Value line and XL-density devices) */ +#define GPIO_Remap_FSMC_NADV ((uint32_t)0x80000400) /*!< FSMC_NADV Alternate Function mapping (only for High density Value line and XL-density devices) */ + +#define GPIO_Remap_TIM67_DAC_DMA ((uint32_t)0x80000800) /*!< TIM6/TIM7 and DAC DMA requests remapping (only for High density Value line devices) */ +#define GPIO_Remap_TIM12 ((uint32_t)0x80001000) /*!< TIM12 Alternate Function mapping (only for High density Value line devices) */ +#define GPIO_Remap_MISC ((uint32_t)0x80002000) /*!< Miscellaneous Remap (DMA2 Channel5 Position and DAC Trigger remapping, + only for High density Value line devices) */ + +#define IS_GPIO_REMAP(REMAP) (((REMAP) == GPIO_Remap_SPI1) || ((REMAP) == GPIO_Remap_I2C1) || \ + ((REMAP) == GPIO_Remap_USART1) || ((REMAP) == GPIO_Remap_USART2) || \ + ((REMAP) == GPIO_PartialRemap_USART3) || ((REMAP) == GPIO_FullRemap_USART3) || \ + ((REMAP) == GPIO_PartialRemap_TIM1) || ((REMAP) == GPIO_FullRemap_TIM1) || \ + ((REMAP) == GPIO_PartialRemap1_TIM2) || ((REMAP) == GPIO_PartialRemap2_TIM2) || \ + ((REMAP) == GPIO_FullRemap_TIM2) || ((REMAP) == GPIO_PartialRemap_TIM3) || \ + ((REMAP) == GPIO_FullRemap_TIM3) || ((REMAP) == GPIO_Remap_TIM4) || \ + ((REMAP) == GPIO_Remap1_CAN1) || ((REMAP) == GPIO_Remap2_CAN1) || \ + ((REMAP) == GPIO_Remap_PD01) || ((REMAP) == GPIO_Remap_TIM5CH4_LSI) || \ + ((REMAP) == GPIO_Remap_ADC1_ETRGINJ) ||((REMAP) == GPIO_Remap_ADC1_ETRGREG) || \ + ((REMAP) == GPIO_Remap_ADC2_ETRGINJ) ||((REMAP) == GPIO_Remap_ADC2_ETRGREG) || \ + ((REMAP) == GPIO_Remap_ETH) ||((REMAP) == GPIO_Remap_CAN2) || \ + ((REMAP) == GPIO_Remap_SWJ_NoJTRST) || ((REMAP) == GPIO_Remap_SWJ_JTAGDisable) || \ + ((REMAP) == GPIO_Remap_SWJ_Disable)|| ((REMAP) == GPIO_Remap_SPI3) || \ + ((REMAP) == GPIO_Remap_TIM2ITR1_PTP_SOF) || ((REMAP) == GPIO_Remap_PTP_PPS) || \ + ((REMAP) == GPIO_Remap_TIM15) || ((REMAP) == GPIO_Remap_TIM16) || \ + ((REMAP) == GPIO_Remap_TIM17) || ((REMAP) == GPIO_Remap_CEC) || \ + ((REMAP) == GPIO_Remap_TIM1_DMA) || ((REMAP) == GPIO_Remap_TIM9) || \ + ((REMAP) == GPIO_Remap_TIM10) || ((REMAP) == GPIO_Remap_TIM11) || \ + ((REMAP) == GPIO_Remap_TIM13) || ((REMAP) == GPIO_Remap_TIM14) || \ + ((REMAP) == GPIO_Remap_FSMC_NADV) || ((REMAP) == GPIO_Remap_TIM67_DAC_DMA) || \ + ((REMAP) == GPIO_Remap_TIM12) || ((REMAP) == GPIO_Remap_MISC)) + +/** + * @} + */ + +/** @defgroup GPIO_Port_Sources + * @{ + */ + +#define GPIO_PortSourceGPIOA ((uint8_t)0x00) +#define GPIO_PortSourceGPIOB ((uint8_t)0x01) +#define GPIO_PortSourceGPIOC ((uint8_t)0x02) +#define GPIO_PortSourceGPIOD ((uint8_t)0x03) +#define GPIO_PortSourceGPIOE ((uint8_t)0x04) +#define GPIO_PortSourceGPIOF ((uint8_t)0x05) +#define GPIO_PortSourceGPIOG ((uint8_t)0x06) +#define IS_GPIO_EVENTOUT_PORT_SOURCE(PORTSOURCE) (((PORTSOURCE) == GPIO_PortSourceGPIOA) || \ + ((PORTSOURCE) == GPIO_PortSourceGPIOB) || \ + ((PORTSOURCE) == GPIO_PortSourceGPIOC) || \ + ((PORTSOURCE) == GPIO_PortSourceGPIOD) || \ + ((PORTSOURCE) == GPIO_PortSourceGPIOE)) + +#define IS_GPIO_EXTI_PORT_SOURCE(PORTSOURCE) (((PORTSOURCE) == GPIO_PortSourceGPIOA) || \ + ((PORTSOURCE) == GPIO_PortSourceGPIOB) || \ + ((PORTSOURCE) == GPIO_PortSourceGPIOC) || \ + ((PORTSOURCE) == GPIO_PortSourceGPIOD) || \ + ((PORTSOURCE) == GPIO_PortSourceGPIOE) || \ + ((PORTSOURCE) == GPIO_PortSourceGPIOF) || \ + ((PORTSOURCE) == GPIO_PortSourceGPIOG)) + +/** + * @} + */ + +/** @defgroup GPIO_Pin_sources + * @{ + */ + +#define GPIO_PinSource0 ((uint8_t)0x00) +#define GPIO_PinSource1 ((uint8_t)0x01) +#define GPIO_PinSource2 ((uint8_t)0x02) +#define GPIO_PinSource3 ((uint8_t)0x03) +#define GPIO_PinSource4 ((uint8_t)0x04) +#define GPIO_PinSource5 ((uint8_t)0x05) +#define GPIO_PinSource6 ((uint8_t)0x06) +#define GPIO_PinSource7 ((uint8_t)0x07) +#define GPIO_PinSource8 ((uint8_t)0x08) +#define GPIO_PinSource9 ((uint8_t)0x09) +#define GPIO_PinSource10 ((uint8_t)0x0A) +#define GPIO_PinSource11 ((uint8_t)0x0B) +#define GPIO_PinSource12 ((uint8_t)0x0C) +#define GPIO_PinSource13 ((uint8_t)0x0D) +#define GPIO_PinSource14 ((uint8_t)0x0E) +#define GPIO_PinSource15 ((uint8_t)0x0F) + +#define IS_GPIO_PIN_SOURCE(PINSOURCE) (((PINSOURCE) == GPIO_PinSource0) || \ + ((PINSOURCE) == GPIO_PinSource1) || \ + ((PINSOURCE) == GPIO_PinSource2) || \ + ((PINSOURCE) == GPIO_PinSource3) || \ + ((PINSOURCE) == GPIO_PinSource4) || \ + ((PINSOURCE) == GPIO_PinSource5) || \ + ((PINSOURCE) == GPIO_PinSource6) || \ + ((PINSOURCE) == GPIO_PinSource7) || \ + ((PINSOURCE) == GPIO_PinSource8) || \ + ((PINSOURCE) == GPIO_PinSource9) || \ + ((PINSOURCE) == GPIO_PinSource10) || \ + ((PINSOURCE) == GPIO_PinSource11) || \ + ((PINSOURCE) == GPIO_PinSource12) || \ + ((PINSOURCE) == GPIO_PinSource13) || \ + ((PINSOURCE) == GPIO_PinSource14) || \ + ((PINSOURCE) == GPIO_PinSource15)) + +/** + * @} + */ + +/** @defgroup Ethernet_Media_Interface + * @{ + */ +#define GPIO_ETH_MediaInterface_MII ((u32)0x00000000) +#define GPIO_ETH_MediaInterface_RMII ((u32)0x00000001) + +#define IS_GPIO_ETH_MEDIA_INTERFACE(INTERFACE) (((INTERFACE) == GPIO_ETH_MediaInterface_MII) || \ + ((INTERFACE) == GPIO_ETH_MediaInterface_RMII)) + +/** + * @} + */ +/** + * @} + */ + +/** @defgroup GPIO_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup GPIO_Exported_Functions + * @{ + */ + +void GPIO_DeInit(GPIO_TypeDef* GPIOx); +void GPIO_AFIODeInit(void); +void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct); +void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct); +uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); +uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx); +uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); +uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx); +void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); +void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); +void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal); +void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal); +void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); +void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource); +void GPIO_EventOutputCmd(FunctionalState NewState); +void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState); +void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource); +void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F10x_GPIO_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_i2c.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_i2c.h new file mode 100644 index 0000000..2d42e5c --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_i2c.h @@ -0,0 +1,684 @@ +/** + ****************************************************************************** + * @file stm32f10x_i2c.h + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief This file contains all the functions prototypes for the I2C firmware + * library. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_I2C_H +#define __STM32F10x_I2C_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup I2C + * @{ + */ + +/** @defgroup I2C_Exported_Types + * @{ + */ + +/** + * @brief I2C Init structure definition + */ + +typedef struct +{ + uint32_t I2C_ClockSpeed; /*!< Specifies the clock frequency. + This parameter must be set to a value lower than 400kHz */ + + uint16_t I2C_Mode; /*!< Specifies the I2C mode. + This parameter can be a value of @ref I2C_mode */ + + uint16_t I2C_DutyCycle; /*!< Specifies the I2C fast mode duty cycle. + This parameter can be a value of @ref I2C_duty_cycle_in_fast_mode */ + + uint16_t I2C_OwnAddress1; /*!< Specifies the first device own address. + This parameter can be a 7-bit or 10-bit address. */ + + uint16_t I2C_Ack; /*!< Enables or disables the acknowledgement. + This parameter can be a value of @ref I2C_acknowledgement */ + + uint16_t I2C_AcknowledgedAddress; /*!< Specifies if 7-bit or 10-bit address is acknowledged. + This parameter can be a value of @ref I2C_acknowledged_address */ +}I2C_InitTypeDef; + +/** + * @} + */ + + +/** @defgroup I2C_Exported_Constants + * @{ + */ + +#define IS_I2C_ALL_PERIPH(PERIPH) (((PERIPH) == I2C1) || \ + ((PERIPH) == I2C2)) +/** @defgroup I2C_mode + * @{ + */ + +#define I2C_Mode_I2C ((uint16_t)0x0000) +#define I2C_Mode_SMBusDevice ((uint16_t)0x0002) +#define I2C_Mode_SMBusHost ((uint16_t)0x000A) +#define IS_I2C_MODE(MODE) (((MODE) == I2C_Mode_I2C) || \ + ((MODE) == I2C_Mode_SMBusDevice) || \ + ((MODE) == I2C_Mode_SMBusHost)) +/** + * @} + */ + +/** @defgroup I2C_duty_cycle_in_fast_mode + * @{ + */ + +#define I2C_DutyCycle_16_9 ((uint16_t)0x4000) /*!< I2C fast mode Tlow/Thigh = 16/9 */ +#define I2C_DutyCycle_2 ((uint16_t)0xBFFF) /*!< I2C fast mode Tlow/Thigh = 2 */ +#define IS_I2C_DUTY_CYCLE(CYCLE) (((CYCLE) == I2C_DutyCycle_16_9) || \ + ((CYCLE) == I2C_DutyCycle_2)) +/** + * @} + */ + +/** @defgroup I2C_acknowledgement + * @{ + */ + +#define I2C_Ack_Enable ((uint16_t)0x0400) +#define I2C_Ack_Disable ((uint16_t)0x0000) +#define IS_I2C_ACK_STATE(STATE) (((STATE) == I2C_Ack_Enable) || \ + ((STATE) == I2C_Ack_Disable)) +/** + * @} + */ + +/** @defgroup I2C_transfer_direction + * @{ + */ + +#define I2C_Direction_Transmitter ((uint8_t)0x00) +#define I2C_Direction_Receiver ((uint8_t)0x01) +#define IS_I2C_DIRECTION(DIRECTION) (((DIRECTION) == I2C_Direction_Transmitter) || \ + ((DIRECTION) == I2C_Direction_Receiver)) +/** + * @} + */ + +/** @defgroup I2C_acknowledged_address + * @{ + */ + +#define I2C_AcknowledgedAddress_7bit ((uint16_t)0x4000) +#define I2C_AcknowledgedAddress_10bit ((uint16_t)0xC000) +#define IS_I2C_ACKNOWLEDGE_ADDRESS(ADDRESS) (((ADDRESS) == I2C_AcknowledgedAddress_7bit) || \ + ((ADDRESS) == I2C_AcknowledgedAddress_10bit)) +/** + * @} + */ + +/** @defgroup I2C_registers + * @{ + */ + +#define I2C_Register_CR1 ((uint8_t)0x00) +#define I2C_Register_CR2 ((uint8_t)0x04) +#define I2C_Register_OAR1 ((uint8_t)0x08) +#define I2C_Register_OAR2 ((uint8_t)0x0C) +#define I2C_Register_DR ((uint8_t)0x10) +#define I2C_Register_SR1 ((uint8_t)0x14) +#define I2C_Register_SR2 ((uint8_t)0x18) +#define I2C_Register_CCR ((uint8_t)0x1C) +#define I2C_Register_TRISE ((uint8_t)0x20) +#define IS_I2C_REGISTER(REGISTER) (((REGISTER) == I2C_Register_CR1) || \ + ((REGISTER) == I2C_Register_CR2) || \ + ((REGISTER) == I2C_Register_OAR1) || \ + ((REGISTER) == I2C_Register_OAR2) || \ + ((REGISTER) == I2C_Register_DR) || \ + ((REGISTER) == I2C_Register_SR1) || \ + ((REGISTER) == I2C_Register_SR2) || \ + ((REGISTER) == I2C_Register_CCR) || \ + ((REGISTER) == I2C_Register_TRISE)) +/** + * @} + */ + +/** @defgroup I2C_SMBus_alert_pin_level + * @{ + */ + +#define I2C_SMBusAlert_Low ((uint16_t)0x2000) +#define I2C_SMBusAlert_High ((uint16_t)0xDFFF) +#define IS_I2C_SMBUS_ALERT(ALERT) (((ALERT) == I2C_SMBusAlert_Low) || \ + ((ALERT) == I2C_SMBusAlert_High)) +/** + * @} + */ + +/** @defgroup I2C_PEC_position + * @{ + */ + +#define I2C_PECPosition_Next ((uint16_t)0x0800) +#define I2C_PECPosition_Current ((uint16_t)0xF7FF) +#define IS_I2C_PEC_POSITION(POSITION) (((POSITION) == I2C_PECPosition_Next) || \ + ((POSITION) == I2C_PECPosition_Current)) +/** + * @} + */ + +/** @defgroup I2C_NCAK_position + * @{ + */ + +#define I2C_NACKPosition_Next ((uint16_t)0x0800) +#define I2C_NACKPosition_Current ((uint16_t)0xF7FF) +#define IS_I2C_NACK_POSITION(POSITION) (((POSITION) == I2C_NACKPosition_Next) || \ + ((POSITION) == I2C_NACKPosition_Current)) +/** + * @} + */ + +/** @defgroup I2C_interrupts_definition + * @{ + */ + +#define I2C_IT_BUF ((uint16_t)0x0400) +#define I2C_IT_EVT ((uint16_t)0x0200) +#define I2C_IT_ERR ((uint16_t)0x0100) +#define IS_I2C_CONFIG_IT(IT) ((((IT) & (uint16_t)0xF8FF) == 0x00) && ((IT) != 0x00)) +/** + * @} + */ + +/** @defgroup I2C_interrupts_definition + * @{ + */ + +#define I2C_IT_SMBALERT ((uint32_t)0x01008000) +#define I2C_IT_TIMEOUT ((uint32_t)0x01004000) +#define I2C_IT_PECERR ((uint32_t)0x01001000) +#define I2C_IT_OVR ((uint32_t)0x01000800) +#define I2C_IT_AF ((uint32_t)0x01000400) +#define I2C_IT_ARLO ((uint32_t)0x01000200) +#define I2C_IT_BERR ((uint32_t)0x01000100) +#define I2C_IT_TXE ((uint32_t)0x06000080) +#define I2C_IT_RXNE ((uint32_t)0x06000040) +#define I2C_IT_STOPF ((uint32_t)0x02000010) +#define I2C_IT_ADD10 ((uint32_t)0x02000008) +#define I2C_IT_BTF ((uint32_t)0x02000004) +#define I2C_IT_ADDR ((uint32_t)0x02000002) +#define I2C_IT_SB ((uint32_t)0x02000001) + +#define IS_I2C_CLEAR_IT(IT) ((((IT) & (uint16_t)0x20FF) == 0x00) && ((IT) != (uint16_t)0x00)) + +#define IS_I2C_GET_IT(IT) (((IT) == I2C_IT_SMBALERT) || ((IT) == I2C_IT_TIMEOUT) || \ + ((IT) == I2C_IT_PECERR) || ((IT) == I2C_IT_OVR) || \ + ((IT) == I2C_IT_AF) || ((IT) == I2C_IT_ARLO) || \ + ((IT) == I2C_IT_BERR) || ((IT) == I2C_IT_TXE) || \ + ((IT) == I2C_IT_RXNE) || ((IT) == I2C_IT_STOPF) || \ + ((IT) == I2C_IT_ADD10) || ((IT) == I2C_IT_BTF) || \ + ((IT) == I2C_IT_ADDR) || ((IT) == I2C_IT_SB)) +/** + * @} + */ + +/** @defgroup I2C_flags_definition + * @{ + */ + +/** + * @brief SR2 register flags + */ + +#define I2C_FLAG_DUALF ((uint32_t)0x00800000) +#define I2C_FLAG_SMBHOST ((uint32_t)0x00400000) +#define I2C_FLAG_SMBDEFAULT ((uint32_t)0x00200000) +#define I2C_FLAG_GENCALL ((uint32_t)0x00100000) +#define I2C_FLAG_TRA ((uint32_t)0x00040000) +#define I2C_FLAG_BUSY ((uint32_t)0x00020000) +#define I2C_FLAG_MSL ((uint32_t)0x00010000) + +/** + * @brief SR1 register flags + */ + +#define I2C_FLAG_SMBALERT ((uint32_t)0x10008000) +#define I2C_FLAG_TIMEOUT ((uint32_t)0x10004000) +#define I2C_FLAG_PECERR ((uint32_t)0x10001000) +#define I2C_FLAG_OVR ((uint32_t)0x10000800) +#define I2C_FLAG_AF ((uint32_t)0x10000400) +#define I2C_FLAG_ARLO ((uint32_t)0x10000200) +#define I2C_FLAG_BERR ((uint32_t)0x10000100) +#define I2C_FLAG_TXE ((uint32_t)0x10000080) +#define I2C_FLAG_RXNE ((uint32_t)0x10000040) +#define I2C_FLAG_STOPF ((uint32_t)0x10000010) +#define I2C_FLAG_ADD10 ((uint32_t)0x10000008) +#define I2C_FLAG_BTF ((uint32_t)0x10000004) +#define I2C_FLAG_ADDR ((uint32_t)0x10000002) +#define I2C_FLAG_SB ((uint32_t)0x10000001) + +#define IS_I2C_CLEAR_FLAG(FLAG) ((((FLAG) & (uint16_t)0x20FF) == 0x00) && ((FLAG) != (uint16_t)0x00)) + +#define IS_I2C_GET_FLAG(FLAG) (((FLAG) == I2C_FLAG_DUALF) || ((FLAG) == I2C_FLAG_SMBHOST) || \ + ((FLAG) == I2C_FLAG_SMBDEFAULT) || ((FLAG) == I2C_FLAG_GENCALL) || \ + ((FLAG) == I2C_FLAG_TRA) || ((FLAG) == I2C_FLAG_BUSY) || \ + ((FLAG) == I2C_FLAG_MSL) || ((FLAG) == I2C_FLAG_SMBALERT) || \ + ((FLAG) == I2C_FLAG_TIMEOUT) || ((FLAG) == I2C_FLAG_PECERR) || \ + ((FLAG) == I2C_FLAG_OVR) || ((FLAG) == I2C_FLAG_AF) || \ + ((FLAG) == I2C_FLAG_ARLO) || ((FLAG) == I2C_FLAG_BERR) || \ + ((FLAG) == I2C_FLAG_TXE) || ((FLAG) == I2C_FLAG_RXNE) || \ + ((FLAG) == I2C_FLAG_STOPF) || ((FLAG) == I2C_FLAG_ADD10) || \ + ((FLAG) == I2C_FLAG_BTF) || ((FLAG) == I2C_FLAG_ADDR) || \ + ((FLAG) == I2C_FLAG_SB)) +/** + * @} + */ + +/** @defgroup I2C_Events + * @{ + */ + +/*======================================== + + I2C Master Events (Events grouped in order of communication) + ==========================================*/ +/** + * @brief Communication start + * + * After sending the START condition (I2C_GenerateSTART() function) the master + * has to wait for this event. It means that the Start condition has been correctly + * released on the I2C bus (the bus is free, no other devices is communicating). + * + */ +/* --EV5 */ +#define I2C_EVENT_MASTER_MODE_SELECT ((uint32_t)0x00030001) /* BUSY, MSL and SB flag */ + +/** + * @brief Address Acknowledge + * + * After checking on EV5 (start condition correctly released on the bus), the + * master sends the address of the slave(s) with which it will communicate + * (I2C_Send7bitAddress() function, it also determines the direction of the communication: + * Master transmitter or Receiver). Then the master has to wait that a slave acknowledges + * his address. If an acknowledge is sent on the bus, one of the following events will + * be set: + * + * 1) In case of Master Receiver (7-bit addressing): the I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED + * event is set. + * + * 2) In case of Master Transmitter (7-bit addressing): the I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED + * is set + * + * 3) In case of 10-Bit addressing mode, the master (just after generating the START + * and checking on EV5) has to send the header of 10-bit addressing mode (I2C_SendData() + * function). Then master should wait on EV9. It means that the 10-bit addressing + * header has been correctly sent on the bus. Then master should send the second part of + * the 10-bit address (LSB) using the function I2C_Send7bitAddress(). Then master + * should wait for event EV6. + * + */ + +/* --EV6 */ +#define I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED ((uint32_t)0x00070082) /* BUSY, MSL, ADDR, TXE and TRA flags */ +#define I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED ((uint32_t)0x00030002) /* BUSY, MSL and ADDR flags */ +/* --EV9 */ +#define I2C_EVENT_MASTER_MODE_ADDRESS10 ((uint32_t)0x00030008) /* BUSY, MSL and ADD10 flags */ + +/** + * @brief Communication events + * + * If a communication is established (START condition generated and slave address + * acknowledged) then the master has to check on one of the following events for + * communication procedures: + * + * 1) Master Receiver mode: The master has to wait on the event EV7 then to read + * the data received from the slave (I2C_ReceiveData() function). + * + * 2) Master Transmitter mode: The master has to send data (I2C_SendData() + * function) then to wait on event EV8 or EV8_2. + * These two events are similar: + * - EV8 means that the data has been written in the data register and is + * being shifted out. + * - EV8_2 means that the data has been physically shifted out and output + * on the bus. + * In most cases, using EV8 is sufficient for the application. + * Using EV8_2 leads to a slower communication but ensure more reliable test. + * EV8_2 is also more suitable than EV8 for testing on the last data transmission + * (before Stop condition generation). + * + * @note In case the user software does not guarantee that this event EV7 is + * managed before the current byte end of transfer, then user may check on EV7 + * and BTF flag at the same time (ie. (I2C_EVENT_MASTER_BYTE_RECEIVED | I2C_FLAG_BTF)). + * In this case the communication may be slower. + * + */ + +/* Master RECEIVER mode -----------------------------*/ +/* --EV7 */ +#define I2C_EVENT_MASTER_BYTE_RECEIVED ((uint32_t)0x00030040) /* BUSY, MSL and RXNE flags */ + +/* Master TRANSMITTER mode --------------------------*/ +/* --EV8 */ +#define I2C_EVENT_MASTER_BYTE_TRANSMITTING ((uint32_t)0x00070080) /* TRA, BUSY, MSL, TXE flags */ +/* --EV8_2 */ +#define I2C_EVENT_MASTER_BYTE_TRANSMITTED ((uint32_t)0x00070084) /* TRA, BUSY, MSL, TXE and BTF flags */ + + +/*======================================== + + I2C Slave Events (Events grouped in order of communication) + ==========================================*/ + +/** + * @brief Communication start events + * + * Wait on one of these events at the start of the communication. It means that + * the I2C peripheral detected a Start condition on the bus (generated by master + * device) followed by the peripheral address. The peripheral generates an ACK + * condition on the bus (if the acknowledge feature is enabled through function + * I2C_AcknowledgeConfig()) and the events listed above are set : + * + * 1) In normal case (only one address managed by the slave), when the address + * sent by the master matches the own address of the peripheral (configured by + * I2C_OwnAddress1 field) the I2C_EVENT_SLAVE_XXX_ADDRESS_MATCHED event is set + * (where XXX could be TRANSMITTER or RECEIVER). + * + * 2) In case the address sent by the master matches the second address of the + * peripheral (configured by the function I2C_OwnAddress2Config() and enabled + * by the function I2C_DualAddressCmd()) the events I2C_EVENT_SLAVE_XXX_SECONDADDRESS_MATCHED + * (where XXX could be TRANSMITTER or RECEIVER) are set. + * + * 3) In case the address sent by the master is General Call (address 0x00) and + * if the General Call is enabled for the peripheral (using function I2C_GeneralCallCmd()) + * the following event is set I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED. + * + */ + +/* --EV1 (all the events below are variants of EV1) */ +/* 1) Case of One Single Address managed by the slave */ +#define I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED ((uint32_t)0x00020002) /* BUSY and ADDR flags */ +#define I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED ((uint32_t)0x00060082) /* TRA, BUSY, TXE and ADDR flags */ + +/* 2) Case of Dual address managed by the slave */ +#define I2C_EVENT_SLAVE_RECEIVER_SECONDADDRESS_MATCHED ((uint32_t)0x00820000) /* DUALF and BUSY flags */ +#define I2C_EVENT_SLAVE_TRANSMITTER_SECONDADDRESS_MATCHED ((uint32_t)0x00860080) /* DUALF, TRA, BUSY and TXE flags */ + +/* 3) Case of General Call enabled for the slave */ +#define I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED ((uint32_t)0x00120000) /* GENCALL and BUSY flags */ + +/** + * @brief Communication events + * + * Wait on one of these events when EV1 has already been checked and: + * + * - Slave RECEIVER mode: + * - EV2: When the application is expecting a data byte to be received. + * - EV4: When the application is expecting the end of the communication: master + * sends a stop condition and data transmission is stopped. + * + * - Slave Transmitter mode: + * - EV3: When a byte has been transmitted by the slave and the application is expecting + * the end of the byte transmission. The two events I2C_EVENT_SLAVE_BYTE_TRANSMITTED and + * I2C_EVENT_SLAVE_BYTE_TRANSMITTING are similar. The second one can optionally be + * used when the user software doesn't guarantee the EV3 is managed before the + * current byte end of transfer. + * - EV3_2: When the master sends a NACK in order to tell slave that data transmission + * shall end (before sending the STOP condition). In this case slave has to stop sending + * data bytes and expect a Stop condition on the bus. + * + * @note In case the user software does not guarantee that the event EV2 is + * managed before the current byte end of transfer, then user may check on EV2 + * and BTF flag at the same time (ie. (I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_FLAG_BTF)). + * In this case the communication may be slower. + * + */ + +/* Slave RECEIVER mode --------------------------*/ +/* --EV2 */ +#define I2C_EVENT_SLAVE_BYTE_RECEIVED ((uint32_t)0x00020040) /* BUSY and RXNE flags */ +/* --EV4 */ +#define I2C_EVENT_SLAVE_STOP_DETECTED ((uint32_t)0x00000010) /* STOPF flag */ + +/* Slave TRANSMITTER mode -----------------------*/ +/* --EV3 */ +#define I2C_EVENT_SLAVE_BYTE_TRANSMITTED ((uint32_t)0x00060084) /* TRA, BUSY, TXE and BTF flags */ +#define I2C_EVENT_SLAVE_BYTE_TRANSMITTING ((uint32_t)0x00060080) /* TRA, BUSY and TXE flags */ +/* --EV3_2 */ +#define I2C_EVENT_SLAVE_ACK_FAILURE ((uint32_t)0x00000400) /* AF flag */ + +/*=========================== End of Events Description ==========================================*/ + +#define IS_I2C_EVENT(EVENT) (((EVENT) == I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED) || \ + ((EVENT) == I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED) || \ + ((EVENT) == I2C_EVENT_SLAVE_TRANSMITTER_SECONDADDRESS_MATCHED) || \ + ((EVENT) == I2C_EVENT_SLAVE_RECEIVER_SECONDADDRESS_MATCHED) || \ + ((EVENT) == I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED) || \ + ((EVENT) == I2C_EVENT_SLAVE_BYTE_RECEIVED) || \ + ((EVENT) == (I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_FLAG_DUALF)) || \ + ((EVENT) == (I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_FLAG_GENCALL)) || \ + ((EVENT) == I2C_EVENT_SLAVE_BYTE_TRANSMITTED) || \ + ((EVENT) == (I2C_EVENT_SLAVE_BYTE_TRANSMITTED | I2C_FLAG_DUALF)) || \ + ((EVENT) == (I2C_EVENT_SLAVE_BYTE_TRANSMITTED | I2C_FLAG_GENCALL)) || \ + ((EVENT) == I2C_EVENT_SLAVE_STOP_DETECTED) || \ + ((EVENT) == I2C_EVENT_MASTER_MODE_SELECT) || \ + ((EVENT) == I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED) || \ + ((EVENT) == I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED) || \ + ((EVENT) == I2C_EVENT_MASTER_BYTE_RECEIVED) || \ + ((EVENT) == I2C_EVENT_MASTER_BYTE_TRANSMITTED) || \ + ((EVENT) == I2C_EVENT_MASTER_BYTE_TRANSMITTING) || \ + ((EVENT) == I2C_EVENT_MASTER_MODE_ADDRESS10) || \ + ((EVENT) == I2C_EVENT_SLAVE_ACK_FAILURE)) +/** + * @} + */ + +/** @defgroup I2C_own_address1 + * @{ + */ + +#define IS_I2C_OWN_ADDRESS1(ADDRESS1) ((ADDRESS1) <= 0x3FF) +/** + * @} + */ + +/** @defgroup I2C_clock_speed + * @{ + */ + +#define IS_I2C_CLOCK_SPEED(SPEED) (((SPEED) >= 0x1) && ((SPEED) <= 400000)) +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup I2C_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup I2C_Exported_Functions + * @{ + */ + +void I2C_DeInit(I2C_TypeDef* I2Cx); +void I2C_Init(I2C_TypeDef* I2Cx, I2C_InitTypeDef* I2C_InitStruct); +void I2C_StructInit(I2C_InitTypeDef* I2C_InitStruct); +void I2C_Cmd(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_DMACmd(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_DMALastTransferCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_GenerateSTART(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_GenerateSTOP(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_AcknowledgeConfig(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_OwnAddress2Config(I2C_TypeDef* I2Cx, uint8_t Address); +void I2C_DualAddressCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_GeneralCallCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_ITConfig(I2C_TypeDef* I2Cx, uint16_t I2C_IT, FunctionalState NewState); +void I2C_SendData(I2C_TypeDef* I2Cx, uint8_t Data); +uint8_t I2C_ReceiveData(I2C_TypeDef* I2Cx); +void I2C_Send7bitAddress(I2C_TypeDef* I2Cx, uint8_t Address, uint8_t I2C_Direction); +uint16_t I2C_ReadRegister(I2C_TypeDef* I2Cx, uint8_t I2C_Register); +void I2C_SoftwareResetCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_NACKPositionConfig(I2C_TypeDef* I2Cx, uint16_t I2C_NACKPosition); +void I2C_SMBusAlertConfig(I2C_TypeDef* I2Cx, uint16_t I2C_SMBusAlert); +void I2C_TransmitPEC(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_PECPositionConfig(I2C_TypeDef* I2Cx, uint16_t I2C_PECPosition); +void I2C_CalculatePEC(I2C_TypeDef* I2Cx, FunctionalState NewState); +uint8_t I2C_GetPEC(I2C_TypeDef* I2Cx); +void I2C_ARPCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_StretchClockCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_FastModeDutyCycleConfig(I2C_TypeDef* I2Cx, uint16_t I2C_DutyCycle); + +/** + * @brief + **************************************************************************************** + * + * I2C State Monitoring Functions + * + **************************************************************************************** + * This I2C driver provides three different ways for I2C state monitoring + * depending on the application requirements and constraints: + * + * + * 1) Basic state monitoring: + * Using I2C_CheckEvent() function: + * It compares the status registers (SR1 and SR2) content to a given event + * (can be the combination of one or more flags). + * It returns SUCCESS if the current status includes the given flags + * and returns ERROR if one or more flags are missing in the current status. + * - When to use: + * - This function is suitable for most applications as well as for startup + * activity since the events are fully described in the product reference manual + * (RM0008). + * - It is also suitable for users who need to define their own events. + * - Limitations: + * - If an error occurs (ie. error flags are set besides to the monitored flags), + * the I2C_CheckEvent() function may return SUCCESS despite the communication + * hold or corrupted real state. + * In this case, it is advised to use error interrupts to monitor the error + * events and handle them in the interrupt IRQ handler. + * + * @note + * For error management, it is advised to use the following functions: + * - I2C_ITConfig() to configure and enable the error interrupts (I2C_IT_ERR). + * - I2Cx_ER_IRQHandler() which is called when the error interrupt occurs. + * Where x is the peripheral instance (I2C1, I2C2 ...) + * - I2C_GetFlagStatus() or I2C_GetITStatus() to be called into I2Cx_ER_IRQHandler() + * in order to determine which error occurred. + * - I2C_ClearFlag() or I2C_ClearITPendingBit() and/or I2C_SoftwareResetCmd() + * and/or I2C_GenerateStop() in order to clear the error flag and source, + * and return to correct communication status. + * + * + * 2) Advanced state monitoring: + * Using the function I2C_GetLastEvent() which returns the image of both status + * registers in a single word (uint32_t) (Status Register 2 value is shifted left + * by 16 bits and concatenated to Status Register 1). + * - When to use: + * - This function is suitable for the same applications above but it allows to + * overcome the limitations of I2C_GetFlagStatus() function (see below). + * The returned value could be compared to events already defined in the + * library (stm32f10x_i2c.h) or to custom values defined by user. + * - This function is suitable when multiple flags are monitored at the same time. + * - At the opposite of I2C_CheckEvent() function, this function allows user to + * choose when an event is accepted (when all events flags are set and no + * other flags are set or just when the needed flags are set like + * I2C_CheckEvent() function). + * - Limitations: + * - User may need to define his own events. + * - Same remark concerning the error management is applicable for this + * function if user decides to check only regular communication flags (and + * ignores error flags). + * + * + * 3) Flag-based state monitoring: + * Using the function I2C_GetFlagStatus() which simply returns the status of + * one single flag (ie. I2C_FLAG_RXNE ...). + * - When to use: + * - This function could be used for specific applications or in debug phase. + * - It is suitable when only one flag checking is needed (most I2C events + * are monitored through multiple flags). + * - Limitations: + * - When calling this function, the Status register is accessed. Some flags are + * cleared when the status register is accessed. So checking the status + * of one Flag, may clear other ones. + * - Function may need to be called twice or more in order to monitor one + * single event. + * + */ + +/** + * + * 1) Basic state monitoring + ******************************************************************************* + */ +ErrorStatus I2C_CheckEvent(I2C_TypeDef* I2Cx, uint32_t I2C_EVENT); +/** + * + * 2) Advanced state monitoring + ******************************************************************************* + */ +uint32_t I2C_GetLastEvent(I2C_TypeDef* I2Cx); +/** + * + * 3) Flag-based state monitoring + ******************************************************************************* + */ +FlagStatus I2C_GetFlagStatus(I2C_TypeDef* I2Cx, uint32_t I2C_FLAG); +/** + * + ******************************************************************************* + */ + +void I2C_ClearFlag(I2C_TypeDef* I2Cx, uint32_t I2C_FLAG); +ITStatus I2C_GetITStatus(I2C_TypeDef* I2Cx, uint32_t I2C_IT); +void I2C_ClearITPendingBit(I2C_TypeDef* I2Cx, uint32_t I2C_IT); + +#ifdef __cplusplus +} +#endif + +#endif /*__STM32F10x_I2C_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_iwdg.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_iwdg.h new file mode 100644 index 0000000..7f5ab76 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_iwdg.h @@ -0,0 +1,140 @@ +/** + ****************************************************************************** + * @file stm32f10x_iwdg.h + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief This file contains all the functions prototypes for the IWDG + * firmware library. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_IWDG_H +#define __STM32F10x_IWDG_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup IWDG + * @{ + */ + +/** @defgroup IWDG_Exported_Types + * @{ + */ + +/** + * @} + */ + +/** @defgroup IWDG_Exported_Constants + * @{ + */ + +/** @defgroup IWDG_WriteAccess + * @{ + */ + +#define IWDG_WriteAccess_Enable ((uint16_t)0x5555) +#define IWDG_WriteAccess_Disable ((uint16_t)0x0000) +#define IS_IWDG_WRITE_ACCESS(ACCESS) (((ACCESS) == IWDG_WriteAccess_Enable) || \ + ((ACCESS) == IWDG_WriteAccess_Disable)) +/** + * @} + */ + +/** @defgroup IWDG_prescaler + * @{ + */ + +#define IWDG_Prescaler_4 ((uint8_t)0x00) +#define IWDG_Prescaler_8 ((uint8_t)0x01) +#define IWDG_Prescaler_16 ((uint8_t)0x02) +#define IWDG_Prescaler_32 ((uint8_t)0x03) +#define IWDG_Prescaler_64 ((uint8_t)0x04) +#define IWDG_Prescaler_128 ((uint8_t)0x05) +#define IWDG_Prescaler_256 ((uint8_t)0x06) +#define IS_IWDG_PRESCALER(PRESCALER) (((PRESCALER) == IWDG_Prescaler_4) || \ + ((PRESCALER) == IWDG_Prescaler_8) || \ + ((PRESCALER) == IWDG_Prescaler_16) || \ + ((PRESCALER) == IWDG_Prescaler_32) || \ + ((PRESCALER) == IWDG_Prescaler_64) || \ + ((PRESCALER) == IWDG_Prescaler_128)|| \ + ((PRESCALER) == IWDG_Prescaler_256)) +/** + * @} + */ + +/** @defgroup IWDG_Flag + * @{ + */ + +#define IWDG_FLAG_PVU ((uint16_t)0x0001) +#define IWDG_FLAG_RVU ((uint16_t)0x0002) +#define IS_IWDG_FLAG(FLAG) (((FLAG) == IWDG_FLAG_PVU) || ((FLAG) == IWDG_FLAG_RVU)) +#define IS_IWDG_RELOAD(RELOAD) ((RELOAD) <= 0xFFF) +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup IWDG_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup IWDG_Exported_Functions + * @{ + */ + +void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess); +void IWDG_SetPrescaler(uint8_t IWDG_Prescaler); +void IWDG_SetReload(uint16_t Reload); +void IWDG_ReloadCounter(void); +void IWDG_Enable(void); +FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F10x_IWDG_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_pwr.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_pwr.h new file mode 100644 index 0000000..76e6ce9 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_pwr.h @@ -0,0 +1,156 @@ +/** + ****************************************************************************** + * @file stm32f10x_pwr.h + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief This file contains all the functions prototypes for the PWR firmware + * library. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_PWR_H +#define __STM32F10x_PWR_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup PWR + * @{ + */ + +/** @defgroup PWR_Exported_Types + * @{ + */ + +/** + * @} + */ + +/** @defgroup PWR_Exported_Constants + * @{ + */ + +/** @defgroup PVD_detection_level + * @{ + */ + +#define PWR_PVDLevel_2V2 ((uint32_t)0x00000000) +#define PWR_PVDLevel_2V3 ((uint32_t)0x00000020) +#define PWR_PVDLevel_2V4 ((uint32_t)0x00000040) +#define PWR_PVDLevel_2V5 ((uint32_t)0x00000060) +#define PWR_PVDLevel_2V6 ((uint32_t)0x00000080) +#define PWR_PVDLevel_2V7 ((uint32_t)0x000000A0) +#define PWR_PVDLevel_2V8 ((uint32_t)0x000000C0) +#define PWR_PVDLevel_2V9 ((uint32_t)0x000000E0) +#define IS_PWR_PVD_LEVEL(LEVEL) (((LEVEL) == PWR_PVDLevel_2V2) || ((LEVEL) == PWR_PVDLevel_2V3)|| \ + ((LEVEL) == PWR_PVDLevel_2V4) || ((LEVEL) == PWR_PVDLevel_2V5)|| \ + ((LEVEL) == PWR_PVDLevel_2V6) || ((LEVEL) == PWR_PVDLevel_2V7)|| \ + ((LEVEL) == PWR_PVDLevel_2V8) || ((LEVEL) == PWR_PVDLevel_2V9)) +/** + * @} + */ + +/** @defgroup Regulator_state_is_STOP_mode + * @{ + */ + +#define PWR_Regulator_ON ((uint32_t)0x00000000) +#define PWR_Regulator_LowPower ((uint32_t)0x00000001) +#define IS_PWR_REGULATOR(REGULATOR) (((REGULATOR) == PWR_Regulator_ON) || \ + ((REGULATOR) == PWR_Regulator_LowPower)) +/** + * @} + */ + +/** @defgroup STOP_mode_entry + * @{ + */ + +#define PWR_STOPEntry_WFI ((uint8_t)0x01) +#define PWR_STOPEntry_WFE ((uint8_t)0x02) +#define IS_PWR_STOP_ENTRY(ENTRY) (((ENTRY) == PWR_STOPEntry_WFI) || ((ENTRY) == PWR_STOPEntry_WFE)) + +/** + * @} + */ + +/** @defgroup PWR_Flag + * @{ + */ + +#define PWR_FLAG_WU ((uint32_t)0x00000001) +#define PWR_FLAG_SB ((uint32_t)0x00000002) +#define PWR_FLAG_PVDO ((uint32_t)0x00000004) +#define IS_PWR_GET_FLAG(FLAG) (((FLAG) == PWR_FLAG_WU) || ((FLAG) == PWR_FLAG_SB) || \ + ((FLAG) == PWR_FLAG_PVDO)) + +#define IS_PWR_CLEAR_FLAG(FLAG) (((FLAG) == PWR_FLAG_WU) || ((FLAG) == PWR_FLAG_SB)) +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup PWR_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup PWR_Exported_Functions + * @{ + */ + +void PWR_DeInit(void); +void PWR_BackupAccessCmd(FunctionalState NewState); +void PWR_PVDCmd(FunctionalState NewState); +void PWR_PVDLevelConfig(uint32_t PWR_PVDLevel); +void PWR_WakeUpPinCmd(FunctionalState NewState); +void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry); +void PWR_EnterSTANDBYMode(void); +FlagStatus PWR_GetFlagStatus(uint32_t PWR_FLAG); +void PWR_ClearFlag(uint32_t PWR_FLAG); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F10x_PWR_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_rcc.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_rcc.h new file mode 100644 index 0000000..b3b7d82 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_rcc.h @@ -0,0 +1,727 @@ +/** + ****************************************************************************** + * @file stm32f10x_rcc.h + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief This file contains all the functions prototypes for the RCC firmware + * library. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_RCC_H +#define __STM32F10x_RCC_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup RCC + * @{ + */ + +/** @defgroup RCC_Exported_Types + * @{ + */ + +typedef struct +{ + uint32_t SYSCLK_Frequency; /*!< returns SYSCLK clock frequency expressed in Hz */ + uint32_t HCLK_Frequency; /*!< returns HCLK clock frequency expressed in Hz */ + uint32_t PCLK1_Frequency; /*!< returns PCLK1 clock frequency expressed in Hz */ + uint32_t PCLK2_Frequency; /*!< returns PCLK2 clock frequency expressed in Hz */ + uint32_t ADCCLK_Frequency; /*!< returns ADCCLK clock frequency expressed in Hz */ +}RCC_ClocksTypeDef; + +/** + * @} + */ + +/** @defgroup RCC_Exported_Constants + * @{ + */ + +/** @defgroup HSE_configuration + * @{ + */ + +#define RCC_HSE_OFF ((uint32_t)0x00000000) +#define RCC_HSE_ON ((uint32_t)0x00010000) +#define RCC_HSE_Bypass ((uint32_t)0x00040000) +#define IS_RCC_HSE(HSE) (((HSE) == RCC_HSE_OFF) || ((HSE) == RCC_HSE_ON) || \ + ((HSE) == RCC_HSE_Bypass)) + +/** + * @} + */ + +/** @defgroup PLL_entry_clock_source + * @{ + */ + +#define RCC_PLLSource_HSI_Div2 ((uint32_t)0x00000000) + +#if !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD_VL) && !defined (STM32F10X_CL) + #define RCC_PLLSource_HSE_Div1 ((uint32_t)0x00010000) + #define RCC_PLLSource_HSE_Div2 ((uint32_t)0x00030000) + #define IS_RCC_PLL_SOURCE(SOURCE) (((SOURCE) == RCC_PLLSource_HSI_Div2) || \ + ((SOURCE) == RCC_PLLSource_HSE_Div1) || \ + ((SOURCE) == RCC_PLLSource_HSE_Div2)) +#else + #define RCC_PLLSource_PREDIV1 ((uint32_t)0x00010000) + #define IS_RCC_PLL_SOURCE(SOURCE) (((SOURCE) == RCC_PLLSource_HSI_Div2) || \ + ((SOURCE) == RCC_PLLSource_PREDIV1)) +#endif /* STM32F10X_CL */ + +/** + * @} + */ + +/** @defgroup PLL_multiplication_factor + * @{ + */ +#ifndef STM32F10X_CL + #define RCC_PLLMul_2 ((uint32_t)0x00000000) + #define RCC_PLLMul_3 ((uint32_t)0x00040000) + #define RCC_PLLMul_4 ((uint32_t)0x00080000) + #define RCC_PLLMul_5 ((uint32_t)0x000C0000) + #define RCC_PLLMul_6 ((uint32_t)0x00100000) + #define RCC_PLLMul_7 ((uint32_t)0x00140000) + #define RCC_PLLMul_8 ((uint32_t)0x00180000) + #define RCC_PLLMul_9 ((uint32_t)0x001C0000) + #define RCC_PLLMul_10 ((uint32_t)0x00200000) + #define RCC_PLLMul_11 ((uint32_t)0x00240000) + #define RCC_PLLMul_12 ((uint32_t)0x00280000) + #define RCC_PLLMul_13 ((uint32_t)0x002C0000) + #define RCC_PLLMul_14 ((uint32_t)0x00300000) + #define RCC_PLLMul_15 ((uint32_t)0x00340000) + #define RCC_PLLMul_16 ((uint32_t)0x00380000) + #define IS_RCC_PLL_MUL(MUL) (((MUL) == RCC_PLLMul_2) || ((MUL) == RCC_PLLMul_3) || \ + ((MUL) == RCC_PLLMul_4) || ((MUL) == RCC_PLLMul_5) || \ + ((MUL) == RCC_PLLMul_6) || ((MUL) == RCC_PLLMul_7) || \ + ((MUL) == RCC_PLLMul_8) || ((MUL) == RCC_PLLMul_9) || \ + ((MUL) == RCC_PLLMul_10) || ((MUL) == RCC_PLLMul_11) || \ + ((MUL) == RCC_PLLMul_12) || ((MUL) == RCC_PLLMul_13) || \ + ((MUL) == RCC_PLLMul_14) || ((MUL) == RCC_PLLMul_15) || \ + ((MUL) == RCC_PLLMul_16)) + +#else + #define RCC_PLLMul_4 ((uint32_t)0x00080000) + #define RCC_PLLMul_5 ((uint32_t)0x000C0000) + #define RCC_PLLMul_6 ((uint32_t)0x00100000) + #define RCC_PLLMul_7 ((uint32_t)0x00140000) + #define RCC_PLLMul_8 ((uint32_t)0x00180000) + #define RCC_PLLMul_9 ((uint32_t)0x001C0000) + #define RCC_PLLMul_6_5 ((uint32_t)0x00340000) + + #define IS_RCC_PLL_MUL(MUL) (((MUL) == RCC_PLLMul_4) || ((MUL) == RCC_PLLMul_5) || \ + ((MUL) == RCC_PLLMul_6) || ((MUL) == RCC_PLLMul_7) || \ + ((MUL) == RCC_PLLMul_8) || ((MUL) == RCC_PLLMul_9) || \ + ((MUL) == RCC_PLLMul_6_5)) +#endif /* STM32F10X_CL */ +/** + * @} + */ + +/** @defgroup PREDIV1_division_factor + * @{ + */ +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) || defined (STM32F10X_CL) + #define RCC_PREDIV1_Div1 ((uint32_t)0x00000000) + #define RCC_PREDIV1_Div2 ((uint32_t)0x00000001) + #define RCC_PREDIV1_Div3 ((uint32_t)0x00000002) + #define RCC_PREDIV1_Div4 ((uint32_t)0x00000003) + #define RCC_PREDIV1_Div5 ((uint32_t)0x00000004) + #define RCC_PREDIV1_Div6 ((uint32_t)0x00000005) + #define RCC_PREDIV1_Div7 ((uint32_t)0x00000006) + #define RCC_PREDIV1_Div8 ((uint32_t)0x00000007) + #define RCC_PREDIV1_Div9 ((uint32_t)0x00000008) + #define RCC_PREDIV1_Div10 ((uint32_t)0x00000009) + #define RCC_PREDIV1_Div11 ((uint32_t)0x0000000A) + #define RCC_PREDIV1_Div12 ((uint32_t)0x0000000B) + #define RCC_PREDIV1_Div13 ((uint32_t)0x0000000C) + #define RCC_PREDIV1_Div14 ((uint32_t)0x0000000D) + #define RCC_PREDIV1_Div15 ((uint32_t)0x0000000E) + #define RCC_PREDIV1_Div16 ((uint32_t)0x0000000F) + + #define IS_RCC_PREDIV1(PREDIV1) (((PREDIV1) == RCC_PREDIV1_Div1) || ((PREDIV1) == RCC_PREDIV1_Div2) || \ + ((PREDIV1) == RCC_PREDIV1_Div3) || ((PREDIV1) == RCC_PREDIV1_Div4) || \ + ((PREDIV1) == RCC_PREDIV1_Div5) || ((PREDIV1) == RCC_PREDIV1_Div6) || \ + ((PREDIV1) == RCC_PREDIV1_Div7) || ((PREDIV1) == RCC_PREDIV1_Div8) || \ + ((PREDIV1) == RCC_PREDIV1_Div9) || ((PREDIV1) == RCC_PREDIV1_Div10) || \ + ((PREDIV1) == RCC_PREDIV1_Div11) || ((PREDIV1) == RCC_PREDIV1_Div12) || \ + ((PREDIV1) == RCC_PREDIV1_Div13) || ((PREDIV1) == RCC_PREDIV1_Div14) || \ + ((PREDIV1) == RCC_PREDIV1_Div15) || ((PREDIV1) == RCC_PREDIV1_Div16)) +#endif +/** + * @} + */ + + +/** @defgroup PREDIV1_clock_source + * @{ + */ +#ifdef STM32F10X_CL +/* PREDIV1 clock source (for STM32 connectivity line devices) */ + #define RCC_PREDIV1_Source_HSE ((uint32_t)0x00000000) + #define RCC_PREDIV1_Source_PLL2 ((uint32_t)0x00010000) + + #define IS_RCC_PREDIV1_SOURCE(SOURCE) (((SOURCE) == RCC_PREDIV1_Source_HSE) || \ + ((SOURCE) == RCC_PREDIV1_Source_PLL2)) +#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) +/* PREDIV1 clock source (for STM32 Value line devices) */ + #define RCC_PREDIV1_Source_HSE ((uint32_t)0x00000000) + + #define IS_RCC_PREDIV1_SOURCE(SOURCE) (((SOURCE) == RCC_PREDIV1_Source_HSE)) +#endif +/** + * @} + */ + +#ifdef STM32F10X_CL +/** @defgroup PREDIV2_division_factor + * @{ + */ + + #define RCC_PREDIV2_Div1 ((uint32_t)0x00000000) + #define RCC_PREDIV2_Div2 ((uint32_t)0x00000010) + #define RCC_PREDIV2_Div3 ((uint32_t)0x00000020) + #define RCC_PREDIV2_Div4 ((uint32_t)0x00000030) + #define RCC_PREDIV2_Div5 ((uint32_t)0x00000040) + #define RCC_PREDIV2_Div6 ((uint32_t)0x00000050) + #define RCC_PREDIV2_Div7 ((uint32_t)0x00000060) + #define RCC_PREDIV2_Div8 ((uint32_t)0x00000070) + #define RCC_PREDIV2_Div9 ((uint32_t)0x00000080) + #define RCC_PREDIV2_Div10 ((uint32_t)0x00000090) + #define RCC_PREDIV2_Div11 ((uint32_t)0x000000A0) + #define RCC_PREDIV2_Div12 ((uint32_t)0x000000B0) + #define RCC_PREDIV2_Div13 ((uint32_t)0x000000C0) + #define RCC_PREDIV2_Div14 ((uint32_t)0x000000D0) + #define RCC_PREDIV2_Div15 ((uint32_t)0x000000E0) + #define RCC_PREDIV2_Div16 ((uint32_t)0x000000F0) + + #define IS_RCC_PREDIV2(PREDIV2) (((PREDIV2) == RCC_PREDIV2_Div1) || ((PREDIV2) == RCC_PREDIV2_Div2) || \ + ((PREDIV2) == RCC_PREDIV2_Div3) || ((PREDIV2) == RCC_PREDIV2_Div4) || \ + ((PREDIV2) == RCC_PREDIV2_Div5) || ((PREDIV2) == RCC_PREDIV2_Div6) || \ + ((PREDIV2) == RCC_PREDIV2_Div7) || ((PREDIV2) == RCC_PREDIV2_Div8) || \ + ((PREDIV2) == RCC_PREDIV2_Div9) || ((PREDIV2) == RCC_PREDIV2_Div10) || \ + ((PREDIV2) == RCC_PREDIV2_Div11) || ((PREDIV2) == RCC_PREDIV2_Div12) || \ + ((PREDIV2) == RCC_PREDIV2_Div13) || ((PREDIV2) == RCC_PREDIV2_Div14) || \ + ((PREDIV2) == RCC_PREDIV2_Div15) || ((PREDIV2) == RCC_PREDIV2_Div16)) +/** + * @} + */ + + +/** @defgroup PLL2_multiplication_factor + * @{ + */ + + #define RCC_PLL2Mul_8 ((uint32_t)0x00000600) + #define RCC_PLL2Mul_9 ((uint32_t)0x00000700) + #define RCC_PLL2Mul_10 ((uint32_t)0x00000800) + #define RCC_PLL2Mul_11 ((uint32_t)0x00000900) + #define RCC_PLL2Mul_12 ((uint32_t)0x00000A00) + #define RCC_PLL2Mul_13 ((uint32_t)0x00000B00) + #define RCC_PLL2Mul_14 ((uint32_t)0x00000C00) + #define RCC_PLL2Mul_16 ((uint32_t)0x00000E00) + #define RCC_PLL2Mul_20 ((uint32_t)0x00000F00) + + #define IS_RCC_PLL2_MUL(MUL) (((MUL) == RCC_PLL2Mul_8) || ((MUL) == RCC_PLL2Mul_9) || \ + ((MUL) == RCC_PLL2Mul_10) || ((MUL) == RCC_PLL2Mul_11) || \ + ((MUL) == RCC_PLL2Mul_12) || ((MUL) == RCC_PLL2Mul_13) || \ + ((MUL) == RCC_PLL2Mul_14) || ((MUL) == RCC_PLL2Mul_16) || \ + ((MUL) == RCC_PLL2Mul_20)) +/** + * @} + */ + + +/** @defgroup PLL3_multiplication_factor + * @{ + */ + + #define RCC_PLL3Mul_8 ((uint32_t)0x00006000) + #define RCC_PLL3Mul_9 ((uint32_t)0x00007000) + #define RCC_PLL3Mul_10 ((uint32_t)0x00008000) + #define RCC_PLL3Mul_11 ((uint32_t)0x00009000) + #define RCC_PLL3Mul_12 ((uint32_t)0x0000A000) + #define RCC_PLL3Mul_13 ((uint32_t)0x0000B000) + #define RCC_PLL3Mul_14 ((uint32_t)0x0000C000) + #define RCC_PLL3Mul_16 ((uint32_t)0x0000E000) + #define RCC_PLL3Mul_20 ((uint32_t)0x0000F000) + + #define IS_RCC_PLL3_MUL(MUL) (((MUL) == RCC_PLL3Mul_8) || ((MUL) == RCC_PLL3Mul_9) || \ + ((MUL) == RCC_PLL3Mul_10) || ((MUL) == RCC_PLL3Mul_11) || \ + ((MUL) == RCC_PLL3Mul_12) || ((MUL) == RCC_PLL3Mul_13) || \ + ((MUL) == RCC_PLL3Mul_14) || ((MUL) == RCC_PLL3Mul_16) || \ + ((MUL) == RCC_PLL3Mul_20)) +/** + * @} + */ + +#endif /* STM32F10X_CL */ + + +/** @defgroup System_clock_source + * @{ + */ + +#define RCC_SYSCLKSource_HSI ((uint32_t)0x00000000) +#define RCC_SYSCLKSource_HSE ((uint32_t)0x00000001) +#define RCC_SYSCLKSource_PLLCLK ((uint32_t)0x00000002) +#define IS_RCC_SYSCLK_SOURCE(SOURCE) (((SOURCE) == RCC_SYSCLKSource_HSI) || \ + ((SOURCE) == RCC_SYSCLKSource_HSE) || \ + ((SOURCE) == RCC_SYSCLKSource_PLLCLK)) +/** + * @} + */ + +/** @defgroup AHB_clock_source + * @{ + */ + +#define RCC_SYSCLK_Div1 ((uint32_t)0x00000000) +#define RCC_SYSCLK_Div2 ((uint32_t)0x00000080) +#define RCC_SYSCLK_Div4 ((uint32_t)0x00000090) +#define RCC_SYSCLK_Div8 ((uint32_t)0x000000A0) +#define RCC_SYSCLK_Div16 ((uint32_t)0x000000B0) +#define RCC_SYSCLK_Div64 ((uint32_t)0x000000C0) +#define RCC_SYSCLK_Div128 ((uint32_t)0x000000D0) +#define RCC_SYSCLK_Div256 ((uint32_t)0x000000E0) +#define RCC_SYSCLK_Div512 ((uint32_t)0x000000F0) +#define IS_RCC_HCLK(HCLK) (((HCLK) == RCC_SYSCLK_Div1) || ((HCLK) == RCC_SYSCLK_Div2) || \ + ((HCLK) == RCC_SYSCLK_Div4) || ((HCLK) == RCC_SYSCLK_Div8) || \ + ((HCLK) == RCC_SYSCLK_Div16) || ((HCLK) == RCC_SYSCLK_Div64) || \ + ((HCLK) == RCC_SYSCLK_Div128) || ((HCLK) == RCC_SYSCLK_Div256) || \ + ((HCLK) == RCC_SYSCLK_Div512)) +/** + * @} + */ + +/** @defgroup APB1_APB2_clock_source + * @{ + */ + +#define RCC_HCLK_Div1 ((uint32_t)0x00000000) +#define RCC_HCLK_Div2 ((uint32_t)0x00000400) +#define RCC_HCLK_Div4 ((uint32_t)0x00000500) +#define RCC_HCLK_Div8 ((uint32_t)0x00000600) +#define RCC_HCLK_Div16 ((uint32_t)0x00000700) +#define IS_RCC_PCLK(PCLK) (((PCLK) == RCC_HCLK_Div1) || ((PCLK) == RCC_HCLK_Div2) || \ + ((PCLK) == RCC_HCLK_Div4) || ((PCLK) == RCC_HCLK_Div8) || \ + ((PCLK) == RCC_HCLK_Div16)) +/** + * @} + */ + +/** @defgroup RCC_Interrupt_source + * @{ + */ + +#define RCC_IT_LSIRDY ((uint8_t)0x01) +#define RCC_IT_LSERDY ((uint8_t)0x02) +#define RCC_IT_HSIRDY ((uint8_t)0x04) +#define RCC_IT_HSERDY ((uint8_t)0x08) +#define RCC_IT_PLLRDY ((uint8_t)0x10) +#define RCC_IT_CSS ((uint8_t)0x80) + +#ifndef STM32F10X_CL + #define IS_RCC_IT(IT) ((((IT) & (uint8_t)0xE0) == 0x00) && ((IT) != 0x00)) + #define IS_RCC_GET_IT(IT) (((IT) == RCC_IT_LSIRDY) || ((IT) == RCC_IT_LSERDY) || \ + ((IT) == RCC_IT_HSIRDY) || ((IT) == RCC_IT_HSERDY) || \ + ((IT) == RCC_IT_PLLRDY) || ((IT) == RCC_IT_CSS)) + #define IS_RCC_CLEAR_IT(IT) ((((IT) & (uint8_t)0x60) == 0x00) && ((IT) != 0x00)) +#else + #define RCC_IT_PLL2RDY ((uint8_t)0x20) + #define RCC_IT_PLL3RDY ((uint8_t)0x40) + #define IS_RCC_IT(IT) ((((IT) & (uint8_t)0x80) == 0x00) && ((IT) != 0x00)) + #define IS_RCC_GET_IT(IT) (((IT) == RCC_IT_LSIRDY) || ((IT) == RCC_IT_LSERDY) || \ + ((IT) == RCC_IT_HSIRDY) || ((IT) == RCC_IT_HSERDY) || \ + ((IT) == RCC_IT_PLLRDY) || ((IT) == RCC_IT_CSS) || \ + ((IT) == RCC_IT_PLL2RDY) || ((IT) == RCC_IT_PLL3RDY)) + #define IS_RCC_CLEAR_IT(IT) ((IT) != 0x00) +#endif /* STM32F10X_CL */ + + +/** + * @} + */ + +#ifndef STM32F10X_CL +/** @defgroup USB_Device_clock_source + * @{ + */ + + #define RCC_USBCLKSource_PLLCLK_1Div5 ((uint8_t)0x00) + #define RCC_USBCLKSource_PLLCLK_Div1 ((uint8_t)0x01) + + #define IS_RCC_USBCLK_SOURCE(SOURCE) (((SOURCE) == RCC_USBCLKSource_PLLCLK_1Div5) || \ + ((SOURCE) == RCC_USBCLKSource_PLLCLK_Div1)) +/** + * @} + */ +#else +/** @defgroup USB_OTG_FS_clock_source + * @{ + */ + #define RCC_OTGFSCLKSource_PLLVCO_Div3 ((uint8_t)0x00) + #define RCC_OTGFSCLKSource_PLLVCO_Div2 ((uint8_t)0x01) + + #define IS_RCC_OTGFSCLK_SOURCE(SOURCE) (((SOURCE) == RCC_OTGFSCLKSource_PLLVCO_Div3) || \ + ((SOURCE) == RCC_OTGFSCLKSource_PLLVCO_Div2)) +/** + * @} + */ +#endif /* STM32F10X_CL */ + + +#ifdef STM32F10X_CL +/** @defgroup I2S2_clock_source + * @{ + */ + #define RCC_I2S2CLKSource_SYSCLK ((uint8_t)0x00) + #define RCC_I2S2CLKSource_PLL3_VCO ((uint8_t)0x01) + + #define IS_RCC_I2S2CLK_SOURCE(SOURCE) (((SOURCE) == RCC_I2S2CLKSource_SYSCLK) || \ + ((SOURCE) == RCC_I2S2CLKSource_PLL3_VCO)) +/** + * @} + */ + +/** @defgroup I2S3_clock_source + * @{ + */ + #define RCC_I2S3CLKSource_SYSCLK ((uint8_t)0x00) + #define RCC_I2S3CLKSource_PLL3_VCO ((uint8_t)0x01) + + #define IS_RCC_I2S3CLK_SOURCE(SOURCE) (((SOURCE) == RCC_I2S3CLKSource_SYSCLK) || \ + ((SOURCE) == RCC_I2S3CLKSource_PLL3_VCO)) +/** + * @} + */ +#endif /* STM32F10X_CL */ + + +/** @defgroup ADC_clock_source + * @{ + */ + +#define RCC_PCLK2_Div2 ((uint32_t)0x00000000) +#define RCC_PCLK2_Div4 ((uint32_t)0x00004000) +#define RCC_PCLK2_Div6 ((uint32_t)0x00008000) +#define RCC_PCLK2_Div8 ((uint32_t)0x0000C000) +#define IS_RCC_ADCCLK(ADCCLK) (((ADCCLK) == RCC_PCLK2_Div2) || ((ADCCLK) == RCC_PCLK2_Div4) || \ + ((ADCCLK) == RCC_PCLK2_Div6) || ((ADCCLK) == RCC_PCLK2_Div8)) +/** + * @} + */ + +/** @defgroup LSE_configuration + * @{ + */ + +#define RCC_LSE_OFF ((uint8_t)0x00) +#define RCC_LSE_ON ((uint8_t)0x01) +#define RCC_LSE_Bypass ((uint8_t)0x04) +#define IS_RCC_LSE(LSE) (((LSE) == RCC_LSE_OFF) || ((LSE) == RCC_LSE_ON) || \ + ((LSE) == RCC_LSE_Bypass)) +/** + * @} + */ + +/** @defgroup RTC_clock_source + * @{ + */ + +#define RCC_RTCCLKSource_LSE ((uint32_t)0x00000100) +#define RCC_RTCCLKSource_LSI ((uint32_t)0x00000200) +#define RCC_RTCCLKSource_HSE_Div128 ((uint32_t)0x00000300) +#define IS_RCC_RTCCLK_SOURCE(SOURCE) (((SOURCE) == RCC_RTCCLKSource_LSE) || \ + ((SOURCE) == RCC_RTCCLKSource_LSI) || \ + ((SOURCE) == RCC_RTCCLKSource_HSE_Div128)) +/** + * @} + */ + +/** @defgroup AHB_peripheral + * @{ + */ + +#define RCC_AHBPeriph_DMA1 ((uint32_t)0x00000001) +#define RCC_AHBPeriph_DMA2 ((uint32_t)0x00000002) +#define RCC_AHBPeriph_SRAM ((uint32_t)0x00000004) +#define RCC_AHBPeriph_FLITF ((uint32_t)0x00000010) +#define RCC_AHBPeriph_CRC ((uint32_t)0x00000040) + +#ifndef STM32F10X_CL + #define RCC_AHBPeriph_FSMC ((uint32_t)0x00000100) + #define RCC_AHBPeriph_SDIO ((uint32_t)0x00000400) + #define IS_RCC_AHB_PERIPH(PERIPH) ((((PERIPH) & 0xFFFFFAA8) == 0x00) && ((PERIPH) != 0x00)) +#else + #define RCC_AHBPeriph_OTG_FS ((uint32_t)0x00001000) + #define RCC_AHBPeriph_ETH_MAC ((uint32_t)0x00004000) + #define RCC_AHBPeriph_ETH_MAC_Tx ((uint32_t)0x00008000) + #define RCC_AHBPeriph_ETH_MAC_Rx ((uint32_t)0x00010000) + + #define IS_RCC_AHB_PERIPH(PERIPH) ((((PERIPH) & 0xFFFE2FA8) == 0x00) && ((PERIPH) != 0x00)) + #define IS_RCC_AHB_PERIPH_RESET(PERIPH) ((((PERIPH) & 0xFFFFAFFF) == 0x00) && ((PERIPH) != 0x00)) +#endif /* STM32F10X_CL */ +/** + * @} + */ + +/** @defgroup APB2_peripheral + * @{ + */ + +#define RCC_APB2Periph_AFIO ((uint32_t)0x00000001) +#define RCC_APB2Periph_GPIOA ((uint32_t)0x00000004) +#define RCC_APB2Periph_GPIOB ((uint32_t)0x00000008) +#define RCC_APB2Periph_GPIOC ((uint32_t)0x00000010) +#define RCC_APB2Periph_GPIOD ((uint32_t)0x00000020) +#define RCC_APB2Periph_GPIOE ((uint32_t)0x00000040) +#define RCC_APB2Periph_GPIOF ((uint32_t)0x00000080) +#define RCC_APB2Periph_GPIOG ((uint32_t)0x00000100) +#define RCC_APB2Periph_ADC1 ((uint32_t)0x00000200) +#define RCC_APB2Periph_ADC2 ((uint32_t)0x00000400) +#define RCC_APB2Periph_TIM1 ((uint32_t)0x00000800) +#define RCC_APB2Periph_SPI1 ((uint32_t)0x00001000) +#define RCC_APB2Periph_TIM8 ((uint32_t)0x00002000) +#define RCC_APB2Periph_USART1 ((uint32_t)0x00004000) +#define RCC_APB2Periph_ADC3 ((uint32_t)0x00008000) +#define RCC_APB2Periph_TIM15 ((uint32_t)0x00010000) +#define RCC_APB2Periph_TIM16 ((uint32_t)0x00020000) +#define RCC_APB2Periph_TIM17 ((uint32_t)0x00040000) +#define RCC_APB2Periph_TIM9 ((uint32_t)0x00080000) +#define RCC_APB2Periph_TIM10 ((uint32_t)0x00100000) +#define RCC_APB2Periph_TIM11 ((uint32_t)0x00200000) + +#define IS_RCC_APB2_PERIPH(PERIPH) ((((PERIPH) & 0xFFC00002) == 0x00) && ((PERIPH) != 0x00)) +/** + * @} + */ + +/** @defgroup APB1_peripheral + * @{ + */ + +#define RCC_APB1Periph_TIM2 ((uint32_t)0x00000001) +#define RCC_APB1Periph_TIM3 ((uint32_t)0x00000002) +#define RCC_APB1Periph_TIM4 ((uint32_t)0x00000004) +#define RCC_APB1Periph_TIM5 ((uint32_t)0x00000008) +#define RCC_APB1Periph_TIM6 ((uint32_t)0x00000010) +#define RCC_APB1Periph_TIM7 ((uint32_t)0x00000020) +#define RCC_APB1Periph_TIM12 ((uint32_t)0x00000040) +#define RCC_APB1Periph_TIM13 ((uint32_t)0x00000080) +#define RCC_APB1Periph_TIM14 ((uint32_t)0x00000100) +#define RCC_APB1Periph_WWDG ((uint32_t)0x00000800) +#define RCC_APB1Periph_SPI2 ((uint32_t)0x00004000) +#define RCC_APB1Periph_SPI3 ((uint32_t)0x00008000) +#define RCC_APB1Periph_USART2 ((uint32_t)0x00020000) +#define RCC_APB1Periph_USART3 ((uint32_t)0x00040000) +#define RCC_APB1Periph_UART4 ((uint32_t)0x00080000) +#define RCC_APB1Periph_UART5 ((uint32_t)0x00100000) +#define RCC_APB1Periph_I2C1 ((uint32_t)0x00200000) +#define RCC_APB1Periph_I2C2 ((uint32_t)0x00400000) +#define RCC_APB1Periph_USB ((uint32_t)0x00800000) +#define RCC_APB1Periph_CAN1 ((uint32_t)0x02000000) +#define RCC_APB1Periph_CAN2 ((uint32_t)0x04000000) +#define RCC_APB1Periph_BKP ((uint32_t)0x08000000) +#define RCC_APB1Periph_PWR ((uint32_t)0x10000000) +#define RCC_APB1Periph_DAC ((uint32_t)0x20000000) +#define RCC_APB1Periph_CEC ((uint32_t)0x40000000) + +#define IS_RCC_APB1_PERIPH(PERIPH) ((((PERIPH) & 0x81013600) == 0x00) && ((PERIPH) != 0x00)) + +/** + * @} + */ + +/** @defgroup Clock_source_to_output_on_MCO_pin + * @{ + */ + +#define RCC_MCO_NoClock ((uint8_t)0x00) +#define RCC_MCO_SYSCLK ((uint8_t)0x04) +#define RCC_MCO_HSI ((uint8_t)0x05) +#define RCC_MCO_HSE ((uint8_t)0x06) +#define RCC_MCO_PLLCLK_Div2 ((uint8_t)0x07) + +#ifndef STM32F10X_CL + #define IS_RCC_MCO(MCO) (((MCO) == RCC_MCO_NoClock) || ((MCO) == RCC_MCO_HSI) || \ + ((MCO) == RCC_MCO_SYSCLK) || ((MCO) == RCC_MCO_HSE) || \ + ((MCO) == RCC_MCO_PLLCLK_Div2)) +#else + #define RCC_MCO_PLL2CLK ((uint8_t)0x08) + #define RCC_MCO_PLL3CLK_Div2 ((uint8_t)0x09) + #define RCC_MCO_XT1 ((uint8_t)0x0A) + #define RCC_MCO_PLL3CLK ((uint8_t)0x0B) + + #define IS_RCC_MCO(MCO) (((MCO) == RCC_MCO_NoClock) || ((MCO) == RCC_MCO_HSI) || \ + ((MCO) == RCC_MCO_SYSCLK) || ((MCO) == RCC_MCO_HSE) || \ + ((MCO) == RCC_MCO_PLLCLK_Div2) || ((MCO) == RCC_MCO_PLL2CLK) || \ + ((MCO) == RCC_MCO_PLL3CLK_Div2) || ((MCO) == RCC_MCO_XT1) || \ + ((MCO) == RCC_MCO_PLL3CLK)) +#endif /* STM32F10X_CL */ + +/** + * @} + */ + +/** @defgroup RCC_Flag + * @{ + */ + +#define RCC_FLAG_HSIRDY ((uint8_t)0x21) +#define RCC_FLAG_HSERDY ((uint8_t)0x31) +#define RCC_FLAG_PLLRDY ((uint8_t)0x39) +#define RCC_FLAG_LSERDY ((uint8_t)0x41) +#define RCC_FLAG_LSIRDY ((uint8_t)0x61) +#define RCC_FLAG_PINRST ((uint8_t)0x7A) +#define RCC_FLAG_PORRST ((uint8_t)0x7B) +#define RCC_FLAG_SFTRST ((uint8_t)0x7C) +#define RCC_FLAG_IWDGRST ((uint8_t)0x7D) +#define RCC_FLAG_WWDGRST ((uint8_t)0x7E) +#define RCC_FLAG_LPWRRST ((uint8_t)0x7F) + +#ifndef STM32F10X_CL + #define IS_RCC_FLAG(FLAG) (((FLAG) == RCC_FLAG_HSIRDY) || ((FLAG) == RCC_FLAG_HSERDY) || \ + ((FLAG) == RCC_FLAG_PLLRDY) || ((FLAG) == RCC_FLAG_LSERDY) || \ + ((FLAG) == RCC_FLAG_LSIRDY) || ((FLAG) == RCC_FLAG_PINRST) || \ + ((FLAG) == RCC_FLAG_PORRST) || ((FLAG) == RCC_FLAG_SFTRST) || \ + ((FLAG) == RCC_FLAG_IWDGRST)|| ((FLAG) == RCC_FLAG_WWDGRST)|| \ + ((FLAG) == RCC_FLAG_LPWRRST)) +#else + #define RCC_FLAG_PLL2RDY ((uint8_t)0x3B) + #define RCC_FLAG_PLL3RDY ((uint8_t)0x3D) + #define IS_RCC_FLAG(FLAG) (((FLAG) == RCC_FLAG_HSIRDY) || ((FLAG) == RCC_FLAG_HSERDY) || \ + ((FLAG) == RCC_FLAG_PLLRDY) || ((FLAG) == RCC_FLAG_LSERDY) || \ + ((FLAG) == RCC_FLAG_PLL2RDY) || ((FLAG) == RCC_FLAG_PLL3RDY) || \ + ((FLAG) == RCC_FLAG_LSIRDY) || ((FLAG) == RCC_FLAG_PINRST) || \ + ((FLAG) == RCC_FLAG_PORRST) || ((FLAG) == RCC_FLAG_SFTRST) || \ + ((FLAG) == RCC_FLAG_IWDGRST)|| ((FLAG) == RCC_FLAG_WWDGRST)|| \ + ((FLAG) == RCC_FLAG_LPWRRST)) +#endif /* STM32F10X_CL */ + +#define IS_RCC_CALIBRATION_VALUE(VALUE) ((VALUE) <= 0x1F) +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup RCC_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup RCC_Exported_Functions + * @{ + */ + +void RCC_DeInit(void); +void RCC_HSEConfig(uint32_t RCC_HSE); +ErrorStatus RCC_WaitForHSEStartUp(void); +void RCC_AdjustHSICalibrationValue(uint8_t HSICalibrationValue); +void RCC_HSICmd(FunctionalState NewState); +void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul); +void RCC_PLLCmd(FunctionalState NewState); + +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) || defined (STM32F10X_CL) + void RCC_PREDIV1Config(uint32_t RCC_PREDIV1_Source, uint32_t RCC_PREDIV1_Div); +#endif + +#ifdef STM32F10X_CL + void RCC_PREDIV2Config(uint32_t RCC_PREDIV2_Div); + void RCC_PLL2Config(uint32_t RCC_PLL2Mul); + void RCC_PLL2Cmd(FunctionalState NewState); + void RCC_PLL3Config(uint32_t RCC_PLL3Mul); + void RCC_PLL3Cmd(FunctionalState NewState); +#endif /* STM32F10X_CL */ + +void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource); +uint8_t RCC_GetSYSCLKSource(void); +void RCC_HCLKConfig(uint32_t RCC_SYSCLK); +void RCC_PCLK1Config(uint32_t RCC_HCLK); +void RCC_PCLK2Config(uint32_t RCC_HCLK); +void RCC_ITConfig(uint8_t RCC_IT, FunctionalState NewState); + +#ifndef STM32F10X_CL + void RCC_USBCLKConfig(uint32_t RCC_USBCLKSource); +#else + void RCC_OTGFSCLKConfig(uint32_t RCC_OTGFSCLKSource); +#endif /* STM32F10X_CL */ + +void RCC_ADCCLKConfig(uint32_t RCC_PCLK2); + +#ifdef STM32F10X_CL + void RCC_I2S2CLKConfig(uint32_t RCC_I2S2CLKSource); + void RCC_I2S3CLKConfig(uint32_t RCC_I2S3CLKSource); +#endif /* STM32F10X_CL */ + +void RCC_LSEConfig(uint8_t RCC_LSE); +void RCC_LSICmd(FunctionalState NewState); +void RCC_RTCCLKConfig(uint32_t RCC_RTCCLKSource); +void RCC_RTCCLKCmd(FunctionalState NewState); +void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks); +void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState); +void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState); +void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState); + +#ifdef STM32F10X_CL +void RCC_AHBPeriphResetCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState); +#endif /* STM32F10X_CL */ + +void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState); +void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState); +void RCC_BackupResetCmd(FunctionalState NewState); +void RCC_ClockSecuritySystemCmd(FunctionalState NewState); +void RCC_MCOConfig(uint8_t RCC_MCO); +FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG); +void RCC_ClearFlag(void); +ITStatus RCC_GetITStatus(uint8_t RCC_IT); +void RCC_ClearITPendingBit(uint8_t RCC_IT); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F10x_RCC_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_rtc.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_rtc.h new file mode 100644 index 0000000..214a589 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_rtc.h @@ -0,0 +1,135 @@ +/** + ****************************************************************************** + * @file stm32f10x_rtc.h + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief This file contains all the functions prototypes for the RTC firmware + * library. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_RTC_H +#define __STM32F10x_RTC_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup RTC + * @{ + */ + +/** @defgroup RTC_Exported_Types + * @{ + */ + +/** + * @} + */ + +/** @defgroup RTC_Exported_Constants + * @{ + */ + +/** @defgroup RTC_interrupts_define + * @{ + */ + +#define RTC_IT_OW ((uint16_t)0x0004) /*!< Overflow interrupt */ +#define RTC_IT_ALR ((uint16_t)0x0002) /*!< Alarm interrupt */ +#define RTC_IT_SEC ((uint16_t)0x0001) /*!< Second interrupt */ +#define IS_RTC_IT(IT) ((((IT) & (uint16_t)0xFFF8) == 0x00) && ((IT) != 0x00)) +#define IS_RTC_GET_IT(IT) (((IT) == RTC_IT_OW) || ((IT) == RTC_IT_ALR) || \ + ((IT) == RTC_IT_SEC)) +/** + * @} + */ + +/** @defgroup RTC_interrupts_flags + * @{ + */ + +#define RTC_FLAG_RTOFF ((uint16_t)0x0020) /*!< RTC Operation OFF flag */ +#define RTC_FLAG_RSF ((uint16_t)0x0008) /*!< Registers Synchronized flag */ +#define RTC_FLAG_OW ((uint16_t)0x0004) /*!< Overflow flag */ +#define RTC_FLAG_ALR ((uint16_t)0x0002) /*!< Alarm flag */ +#define RTC_FLAG_SEC ((uint16_t)0x0001) /*!< Second flag */ +#define IS_RTC_CLEAR_FLAG(FLAG) ((((FLAG) & (uint16_t)0xFFF0) == 0x00) && ((FLAG) != 0x00)) +#define IS_RTC_GET_FLAG(FLAG) (((FLAG) == RTC_FLAG_RTOFF) || ((FLAG) == RTC_FLAG_RSF) || \ + ((FLAG) == RTC_FLAG_OW) || ((FLAG) == RTC_FLAG_ALR) || \ + ((FLAG) == RTC_FLAG_SEC)) +#define IS_RTC_PRESCALER(PRESCALER) ((PRESCALER) <= 0xFFFFF) + +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup RTC_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup RTC_Exported_Functions + * @{ + */ + +void RTC_ITConfig(uint16_t RTC_IT, FunctionalState NewState); +void RTC_EnterConfigMode(void); +void RTC_ExitConfigMode(void); +uint32_t RTC_GetCounter(void); +void RTC_SetCounter(uint32_t CounterValue); +void RTC_SetPrescaler(uint32_t PrescalerValue); +void RTC_SetAlarm(uint32_t AlarmValue); +uint32_t RTC_GetDivider(void); +void RTC_WaitForLastTask(void); +void RTC_WaitForSynchro(void); +FlagStatus RTC_GetFlagStatus(uint16_t RTC_FLAG); +void RTC_ClearFlag(uint16_t RTC_FLAG); +ITStatus RTC_GetITStatus(uint16_t RTC_IT); +void RTC_ClearITPendingBit(uint16_t RTC_IT); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F10x_RTC_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_sdio.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_sdio.h new file mode 100644 index 0000000..40cfded --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_sdio.h @@ -0,0 +1,531 @@ +/** + ****************************************************************************** + * @file stm32f10x_sdio.h + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief This file contains all the functions prototypes for the SDIO firmware + * library. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_SDIO_H +#define __STM32F10x_SDIO_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup SDIO + * @{ + */ + +/** @defgroup SDIO_Exported_Types + * @{ + */ + +typedef struct +{ + uint32_t SDIO_ClockEdge; /*!< Specifies the clock transition on which the bit capture is made. + This parameter can be a value of @ref SDIO_Clock_Edge */ + + uint32_t SDIO_ClockBypass; /*!< Specifies whether the SDIO Clock divider bypass is + enabled or disabled. + This parameter can be a value of @ref SDIO_Clock_Bypass */ + + uint32_t SDIO_ClockPowerSave; /*!< Specifies whether SDIO Clock output is enabled or + disabled when the bus is idle. + This parameter can be a value of @ref SDIO_Clock_Power_Save */ + + uint32_t SDIO_BusWide; /*!< Specifies the SDIO bus width. + This parameter can be a value of @ref SDIO_Bus_Wide */ + + uint32_t SDIO_HardwareFlowControl; /*!< Specifies whether the SDIO hardware flow control is enabled or disabled. + This parameter can be a value of @ref SDIO_Hardware_Flow_Control */ + + uint8_t SDIO_ClockDiv; /*!< Specifies the clock frequency of the SDIO controller. + This parameter can be a value between 0x00 and 0xFF. */ + +} SDIO_InitTypeDef; + +typedef struct +{ + uint32_t SDIO_Argument; /*!< Specifies the SDIO command argument which is sent + to a card as part of a command message. If a command + contains an argument, it must be loaded into this register + before writing the command to the command register */ + + uint32_t SDIO_CmdIndex; /*!< Specifies the SDIO command index. It must be lower than 0x40. */ + + uint32_t SDIO_Response; /*!< Specifies the SDIO response type. + This parameter can be a value of @ref SDIO_Response_Type */ + + uint32_t SDIO_Wait; /*!< Specifies whether SDIO wait-for-interrupt request is enabled or disabled. + This parameter can be a value of @ref SDIO_Wait_Interrupt_State */ + + uint32_t SDIO_CPSM; /*!< Specifies whether SDIO Command path state machine (CPSM) + is enabled or disabled. + This parameter can be a value of @ref SDIO_CPSM_State */ +} SDIO_CmdInitTypeDef; + +typedef struct +{ + uint32_t SDIO_DataTimeOut; /*!< Specifies the data timeout period in card bus clock periods. */ + + uint32_t SDIO_DataLength; /*!< Specifies the number of data bytes to be transferred. */ + + uint32_t SDIO_DataBlockSize; /*!< Specifies the data block size for block transfer. + This parameter can be a value of @ref SDIO_Data_Block_Size */ + + uint32_t SDIO_TransferDir; /*!< Specifies the data transfer direction, whether the transfer + is a read or write. + This parameter can be a value of @ref SDIO_Transfer_Direction */ + + uint32_t SDIO_TransferMode; /*!< Specifies whether data transfer is in stream or block mode. + This parameter can be a value of @ref SDIO_Transfer_Type */ + + uint32_t SDIO_DPSM; /*!< Specifies whether SDIO Data path state machine (DPSM) + is enabled or disabled. + This parameter can be a value of @ref SDIO_DPSM_State */ +} SDIO_DataInitTypeDef; + +/** + * @} + */ + +/** @defgroup SDIO_Exported_Constants + * @{ + */ + +/** @defgroup SDIO_Clock_Edge + * @{ + */ + +#define SDIO_ClockEdge_Rising ((uint32_t)0x00000000) +#define SDIO_ClockEdge_Falling ((uint32_t)0x00002000) +#define IS_SDIO_CLOCK_EDGE(EDGE) (((EDGE) == SDIO_ClockEdge_Rising) || \ + ((EDGE) == SDIO_ClockEdge_Falling)) +/** + * @} + */ + +/** @defgroup SDIO_Clock_Bypass + * @{ + */ + +#define SDIO_ClockBypass_Disable ((uint32_t)0x00000000) +#define SDIO_ClockBypass_Enable ((uint32_t)0x00000400) +#define IS_SDIO_CLOCK_BYPASS(BYPASS) (((BYPASS) == SDIO_ClockBypass_Disable) || \ + ((BYPASS) == SDIO_ClockBypass_Enable)) +/** + * @} + */ + +/** @defgroup SDIO_Clock_Power_Save + * @{ + */ + +#define SDIO_ClockPowerSave_Disable ((uint32_t)0x00000000) +#define SDIO_ClockPowerSave_Enable ((uint32_t)0x00000200) +#define IS_SDIO_CLOCK_POWER_SAVE(SAVE) (((SAVE) == SDIO_ClockPowerSave_Disable) || \ + ((SAVE) == SDIO_ClockPowerSave_Enable)) +/** + * @} + */ + +/** @defgroup SDIO_Bus_Wide + * @{ + */ + +#define SDIO_BusWide_1b ((uint32_t)0x00000000) +#define SDIO_BusWide_4b ((uint32_t)0x00000800) +#define SDIO_BusWide_8b ((uint32_t)0x00001000) +#define IS_SDIO_BUS_WIDE(WIDE) (((WIDE) == SDIO_BusWide_1b) || ((WIDE) == SDIO_BusWide_4b) || \ + ((WIDE) == SDIO_BusWide_8b)) + +/** + * @} + */ + +/** @defgroup SDIO_Hardware_Flow_Control + * @{ + */ + +#define SDIO_HardwareFlowControl_Disable ((uint32_t)0x00000000) +#define SDIO_HardwareFlowControl_Enable ((uint32_t)0x00004000) +#define IS_SDIO_HARDWARE_FLOW_CONTROL(CONTROL) (((CONTROL) == SDIO_HardwareFlowControl_Disable) || \ + ((CONTROL) == SDIO_HardwareFlowControl_Enable)) +/** + * @} + */ + +/** @defgroup SDIO_Power_State + * @{ + */ + +#define SDIO_PowerState_OFF ((uint32_t)0x00000000) +#define SDIO_PowerState_ON ((uint32_t)0x00000003) +#define IS_SDIO_POWER_STATE(STATE) (((STATE) == SDIO_PowerState_OFF) || ((STATE) == SDIO_PowerState_ON)) +/** + * @} + */ + + +/** @defgroup SDIO_Interrupt_sources + * @{ + */ + +#define SDIO_IT_CCRCFAIL ((uint32_t)0x00000001) +#define SDIO_IT_DCRCFAIL ((uint32_t)0x00000002) +#define SDIO_IT_CTIMEOUT ((uint32_t)0x00000004) +#define SDIO_IT_DTIMEOUT ((uint32_t)0x00000008) +#define SDIO_IT_TXUNDERR ((uint32_t)0x00000010) +#define SDIO_IT_RXOVERR ((uint32_t)0x00000020) +#define SDIO_IT_CMDREND ((uint32_t)0x00000040) +#define SDIO_IT_CMDSENT ((uint32_t)0x00000080) +#define SDIO_IT_DATAEND ((uint32_t)0x00000100) +#define SDIO_IT_STBITERR ((uint32_t)0x00000200) +#define SDIO_IT_DBCKEND ((uint32_t)0x00000400) +#define SDIO_IT_CMDACT ((uint32_t)0x00000800) +#define SDIO_IT_TXACT ((uint32_t)0x00001000) +#define SDIO_IT_RXACT ((uint32_t)0x00002000) +#define SDIO_IT_TXFIFOHE ((uint32_t)0x00004000) +#define SDIO_IT_RXFIFOHF ((uint32_t)0x00008000) +#define SDIO_IT_TXFIFOF ((uint32_t)0x00010000) +#define SDIO_IT_RXFIFOF ((uint32_t)0x00020000) +#define SDIO_IT_TXFIFOE ((uint32_t)0x00040000) +#define SDIO_IT_RXFIFOE ((uint32_t)0x00080000) +#define SDIO_IT_TXDAVL ((uint32_t)0x00100000) +#define SDIO_IT_RXDAVL ((uint32_t)0x00200000) +#define SDIO_IT_SDIOIT ((uint32_t)0x00400000) +#define SDIO_IT_CEATAEND ((uint32_t)0x00800000) +#define IS_SDIO_IT(IT) ((((IT) & (uint32_t)0xFF000000) == 0x00) && ((IT) != (uint32_t)0x00)) +/** + * @} + */ + +/** @defgroup SDIO_Command_Index + * @{ + */ + +#define IS_SDIO_CMD_INDEX(INDEX) ((INDEX) < 0x40) +/** + * @} + */ + +/** @defgroup SDIO_Response_Type + * @{ + */ + +#define SDIO_Response_No ((uint32_t)0x00000000) +#define SDIO_Response_Short ((uint32_t)0x00000040) +#define SDIO_Response_Long ((uint32_t)0x000000C0) +#define IS_SDIO_RESPONSE(RESPONSE) (((RESPONSE) == SDIO_Response_No) || \ + ((RESPONSE) == SDIO_Response_Short) || \ + ((RESPONSE) == SDIO_Response_Long)) +/** + * @} + */ + +/** @defgroup SDIO_Wait_Interrupt_State + * @{ + */ + +#define SDIO_Wait_No ((uint32_t)0x00000000) /*!< SDIO No Wait, TimeOut is enabled */ +#define SDIO_Wait_IT ((uint32_t)0x00000100) /*!< SDIO Wait Interrupt Request */ +#define SDIO_Wait_Pend ((uint32_t)0x00000200) /*!< SDIO Wait End of transfer */ +#define IS_SDIO_WAIT(WAIT) (((WAIT) == SDIO_Wait_No) || ((WAIT) == SDIO_Wait_IT) || \ + ((WAIT) == SDIO_Wait_Pend)) +/** + * @} + */ + +/** @defgroup SDIO_CPSM_State + * @{ + */ + +#define SDIO_CPSM_Disable ((uint32_t)0x00000000) +#define SDIO_CPSM_Enable ((uint32_t)0x00000400) +#define IS_SDIO_CPSM(CPSM) (((CPSM) == SDIO_CPSM_Enable) || ((CPSM) == SDIO_CPSM_Disable)) +/** + * @} + */ + +/** @defgroup SDIO_Response_Registers + * @{ + */ + +#define SDIO_RESP1 ((uint32_t)0x00000000) +#define SDIO_RESP2 ((uint32_t)0x00000004) +#define SDIO_RESP3 ((uint32_t)0x00000008) +#define SDIO_RESP4 ((uint32_t)0x0000000C) +#define IS_SDIO_RESP(RESP) (((RESP) == SDIO_RESP1) || ((RESP) == SDIO_RESP2) || \ + ((RESP) == SDIO_RESP3) || ((RESP) == SDIO_RESP4)) +/** + * @} + */ + +/** @defgroup SDIO_Data_Length + * @{ + */ + +#define IS_SDIO_DATA_LENGTH(LENGTH) ((LENGTH) <= 0x01FFFFFF) +/** + * @} + */ + +/** @defgroup SDIO_Data_Block_Size + * @{ + */ + +#define SDIO_DataBlockSize_1b ((uint32_t)0x00000000) +#define SDIO_DataBlockSize_2b ((uint32_t)0x00000010) +#define SDIO_DataBlockSize_4b ((uint32_t)0x00000020) +#define SDIO_DataBlockSize_8b ((uint32_t)0x00000030) +#define SDIO_DataBlockSize_16b ((uint32_t)0x00000040) +#define SDIO_DataBlockSize_32b ((uint32_t)0x00000050) +#define SDIO_DataBlockSize_64b ((uint32_t)0x00000060) +#define SDIO_DataBlockSize_128b ((uint32_t)0x00000070) +#define SDIO_DataBlockSize_256b ((uint32_t)0x00000080) +#define SDIO_DataBlockSize_512b ((uint32_t)0x00000090) +#define SDIO_DataBlockSize_1024b ((uint32_t)0x000000A0) +#define SDIO_DataBlockSize_2048b ((uint32_t)0x000000B0) +#define SDIO_DataBlockSize_4096b ((uint32_t)0x000000C0) +#define SDIO_DataBlockSize_8192b ((uint32_t)0x000000D0) +#define SDIO_DataBlockSize_16384b ((uint32_t)0x000000E0) +#define IS_SDIO_BLOCK_SIZE(SIZE) (((SIZE) == SDIO_DataBlockSize_1b) || \ + ((SIZE) == SDIO_DataBlockSize_2b) || \ + ((SIZE) == SDIO_DataBlockSize_4b) || \ + ((SIZE) == SDIO_DataBlockSize_8b) || \ + ((SIZE) == SDIO_DataBlockSize_16b) || \ + ((SIZE) == SDIO_DataBlockSize_32b) || \ + ((SIZE) == SDIO_DataBlockSize_64b) || \ + ((SIZE) == SDIO_DataBlockSize_128b) || \ + ((SIZE) == SDIO_DataBlockSize_256b) || \ + ((SIZE) == SDIO_DataBlockSize_512b) || \ + ((SIZE) == SDIO_DataBlockSize_1024b) || \ + ((SIZE) == SDIO_DataBlockSize_2048b) || \ + ((SIZE) == SDIO_DataBlockSize_4096b) || \ + ((SIZE) == SDIO_DataBlockSize_8192b) || \ + ((SIZE) == SDIO_DataBlockSize_16384b)) +/** + * @} + */ + +/** @defgroup SDIO_Transfer_Direction + * @{ + */ + +#define SDIO_TransferDir_ToCard ((uint32_t)0x00000000) +#define SDIO_TransferDir_ToSDIO ((uint32_t)0x00000002) +#define IS_SDIO_TRANSFER_DIR(DIR) (((DIR) == SDIO_TransferDir_ToCard) || \ + ((DIR) == SDIO_TransferDir_ToSDIO)) +/** + * @} + */ + +/** @defgroup SDIO_Transfer_Type + * @{ + */ + +#define SDIO_TransferMode_Block ((uint32_t)0x00000000) +#define SDIO_TransferMode_Stream ((uint32_t)0x00000004) +#define IS_SDIO_TRANSFER_MODE(MODE) (((MODE) == SDIO_TransferMode_Stream) || \ + ((MODE) == SDIO_TransferMode_Block)) +/** + * @} + */ + +/** @defgroup SDIO_DPSM_State + * @{ + */ + +#define SDIO_DPSM_Disable ((uint32_t)0x00000000) +#define SDIO_DPSM_Enable ((uint32_t)0x00000001) +#define IS_SDIO_DPSM(DPSM) (((DPSM) == SDIO_DPSM_Enable) || ((DPSM) == SDIO_DPSM_Disable)) +/** + * @} + */ + +/** @defgroup SDIO_Flags + * @{ + */ + +#define SDIO_FLAG_CCRCFAIL ((uint32_t)0x00000001) +#define SDIO_FLAG_DCRCFAIL ((uint32_t)0x00000002) +#define SDIO_FLAG_CTIMEOUT ((uint32_t)0x00000004) +#define SDIO_FLAG_DTIMEOUT ((uint32_t)0x00000008) +#define SDIO_FLAG_TXUNDERR ((uint32_t)0x00000010) +#define SDIO_FLAG_RXOVERR ((uint32_t)0x00000020) +#define SDIO_FLAG_CMDREND ((uint32_t)0x00000040) +#define SDIO_FLAG_CMDSENT ((uint32_t)0x00000080) +#define SDIO_FLAG_DATAEND ((uint32_t)0x00000100) +#define SDIO_FLAG_STBITERR ((uint32_t)0x00000200) +#define SDIO_FLAG_DBCKEND ((uint32_t)0x00000400) +#define SDIO_FLAG_CMDACT ((uint32_t)0x00000800) +#define SDIO_FLAG_TXACT ((uint32_t)0x00001000) +#define SDIO_FLAG_RXACT ((uint32_t)0x00002000) +#define SDIO_FLAG_TXFIFOHE ((uint32_t)0x00004000) +#define SDIO_FLAG_RXFIFOHF ((uint32_t)0x00008000) +#define SDIO_FLAG_TXFIFOF ((uint32_t)0x00010000) +#define SDIO_FLAG_RXFIFOF ((uint32_t)0x00020000) +#define SDIO_FLAG_TXFIFOE ((uint32_t)0x00040000) +#define SDIO_FLAG_RXFIFOE ((uint32_t)0x00080000) +#define SDIO_FLAG_TXDAVL ((uint32_t)0x00100000) +#define SDIO_FLAG_RXDAVL ((uint32_t)0x00200000) +#define SDIO_FLAG_SDIOIT ((uint32_t)0x00400000) +#define SDIO_FLAG_CEATAEND ((uint32_t)0x00800000) +#define IS_SDIO_FLAG(FLAG) (((FLAG) == SDIO_FLAG_CCRCFAIL) || \ + ((FLAG) == SDIO_FLAG_DCRCFAIL) || \ + ((FLAG) == SDIO_FLAG_CTIMEOUT) || \ + ((FLAG) == SDIO_FLAG_DTIMEOUT) || \ + ((FLAG) == SDIO_FLAG_TXUNDERR) || \ + ((FLAG) == SDIO_FLAG_RXOVERR) || \ + ((FLAG) == SDIO_FLAG_CMDREND) || \ + ((FLAG) == SDIO_FLAG_CMDSENT) || \ + ((FLAG) == SDIO_FLAG_DATAEND) || \ + ((FLAG) == SDIO_FLAG_STBITERR) || \ + ((FLAG) == SDIO_FLAG_DBCKEND) || \ + ((FLAG) == SDIO_FLAG_CMDACT) || \ + ((FLAG) == SDIO_FLAG_TXACT) || \ + ((FLAG) == SDIO_FLAG_RXACT) || \ + ((FLAG) == SDIO_FLAG_TXFIFOHE) || \ + ((FLAG) == SDIO_FLAG_RXFIFOHF) || \ + ((FLAG) == SDIO_FLAG_TXFIFOF) || \ + ((FLAG) == SDIO_FLAG_RXFIFOF) || \ + ((FLAG) == SDIO_FLAG_TXFIFOE) || \ + ((FLAG) == SDIO_FLAG_RXFIFOE) || \ + ((FLAG) == SDIO_FLAG_TXDAVL) || \ + ((FLAG) == SDIO_FLAG_RXDAVL) || \ + ((FLAG) == SDIO_FLAG_SDIOIT) || \ + ((FLAG) == SDIO_FLAG_CEATAEND)) + +#define IS_SDIO_CLEAR_FLAG(FLAG) ((((FLAG) & (uint32_t)0xFF3FF800) == 0x00) && ((FLAG) != (uint32_t)0x00)) + +#define IS_SDIO_GET_IT(IT) (((IT) == SDIO_IT_CCRCFAIL) || \ + ((IT) == SDIO_IT_DCRCFAIL) || \ + ((IT) == SDIO_IT_CTIMEOUT) || \ + ((IT) == SDIO_IT_DTIMEOUT) || \ + ((IT) == SDIO_IT_TXUNDERR) || \ + ((IT) == SDIO_IT_RXOVERR) || \ + ((IT) == SDIO_IT_CMDREND) || \ + ((IT) == SDIO_IT_CMDSENT) || \ + ((IT) == SDIO_IT_DATAEND) || \ + ((IT) == SDIO_IT_STBITERR) || \ + ((IT) == SDIO_IT_DBCKEND) || \ + ((IT) == SDIO_IT_CMDACT) || \ + ((IT) == SDIO_IT_TXACT) || \ + ((IT) == SDIO_IT_RXACT) || \ + ((IT) == SDIO_IT_TXFIFOHE) || \ + ((IT) == SDIO_IT_RXFIFOHF) || \ + ((IT) == SDIO_IT_TXFIFOF) || \ + ((IT) == SDIO_IT_RXFIFOF) || \ + ((IT) == SDIO_IT_TXFIFOE) || \ + ((IT) == SDIO_IT_RXFIFOE) || \ + ((IT) == SDIO_IT_TXDAVL) || \ + ((IT) == SDIO_IT_RXDAVL) || \ + ((IT) == SDIO_IT_SDIOIT) || \ + ((IT) == SDIO_IT_CEATAEND)) + +#define IS_SDIO_CLEAR_IT(IT) ((((IT) & (uint32_t)0xFF3FF800) == 0x00) && ((IT) != (uint32_t)0x00)) + +/** + * @} + */ + +/** @defgroup SDIO_Read_Wait_Mode + * @{ + */ + +#define SDIO_ReadWaitMode_CLK ((uint32_t)0x00000001) +#define SDIO_ReadWaitMode_DATA2 ((uint32_t)0x00000000) +#define IS_SDIO_READWAIT_MODE(MODE) (((MODE) == SDIO_ReadWaitMode_CLK) || \ + ((MODE) == SDIO_ReadWaitMode_DATA2)) +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup SDIO_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup SDIO_Exported_Functions + * @{ + */ + +void SDIO_DeInit(void); +void SDIO_Init(SDIO_InitTypeDef* SDIO_InitStruct); +void SDIO_StructInit(SDIO_InitTypeDef* SDIO_InitStruct); +void SDIO_ClockCmd(FunctionalState NewState); +void SDIO_SetPowerState(uint32_t SDIO_PowerState); +uint32_t SDIO_GetPowerState(void); +void SDIO_ITConfig(uint32_t SDIO_IT, FunctionalState NewState); +void SDIO_DMACmd(FunctionalState NewState); +void SDIO_SendCommand(SDIO_CmdInitTypeDef *SDIO_CmdInitStruct); +void SDIO_CmdStructInit(SDIO_CmdInitTypeDef* SDIO_CmdInitStruct); +uint8_t SDIO_GetCommandResponse(void); +uint32_t SDIO_GetResponse(uint32_t SDIO_RESP); +void SDIO_DataConfig(SDIO_DataInitTypeDef* SDIO_DataInitStruct); +void SDIO_DataStructInit(SDIO_DataInitTypeDef* SDIO_DataInitStruct); +uint32_t SDIO_GetDataCounter(void); +uint32_t SDIO_ReadData(void); +void SDIO_WriteData(uint32_t Data); +uint32_t SDIO_GetFIFOCount(void); +void SDIO_StartSDIOReadWait(FunctionalState NewState); +void SDIO_StopSDIOReadWait(FunctionalState NewState); +void SDIO_SetSDIOReadWaitMode(uint32_t SDIO_ReadWaitMode); +void SDIO_SetSDIOOperation(FunctionalState NewState); +void SDIO_SendSDIOSuspendCmd(FunctionalState NewState); +void SDIO_CommandCompletionCmd(FunctionalState NewState); +void SDIO_CEATAITCmd(FunctionalState NewState); +void SDIO_SendCEATACmd(FunctionalState NewState); +FlagStatus SDIO_GetFlagStatus(uint32_t SDIO_FLAG); +void SDIO_ClearFlag(uint32_t SDIO_FLAG); +ITStatus SDIO_GetITStatus(uint32_t SDIO_IT); +void SDIO_ClearITPendingBit(uint32_t SDIO_IT); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F10x_SDIO_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_spi.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_spi.h new file mode 100644 index 0000000..6056c4c --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_spi.h @@ -0,0 +1,487 @@ +/** + ****************************************************************************** + * @file stm32f10x_spi.h + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief This file contains all the functions prototypes for the SPI firmware + * library. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_SPI_H +#define __STM32F10x_SPI_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup SPI + * @{ + */ + +/** @defgroup SPI_Exported_Types + * @{ + */ + +/** + * @brief SPI Init structure definition + */ + +typedef struct +{ + uint16_t SPI_Direction; /*!< Specifies the SPI unidirectional or bidirectional data mode. + This parameter can be a value of @ref SPI_data_direction */ + + uint16_t SPI_Mode; /*!< Specifies the SPI operating mode. + This parameter can be a value of @ref SPI_mode */ + + uint16_t SPI_DataSize; /*!< Specifies the SPI data size. + This parameter can be a value of @ref SPI_data_size */ + + uint16_t SPI_CPOL; /*!< Specifies the serial clock steady state. + This parameter can be a value of @ref SPI_Clock_Polarity */ + + uint16_t SPI_CPHA; /*!< Specifies the clock active edge for the bit capture. + This parameter can be a value of @ref SPI_Clock_Phase */ + + uint16_t SPI_NSS; /*!< Specifies whether the NSS signal is managed by + hardware (NSS pin) or by software using the SSI bit. + This parameter can be a value of @ref SPI_Slave_Select_management */ + + uint16_t SPI_BaudRatePrescaler; /*!< Specifies the Baud Rate prescaler value which will be + used to configure the transmit and receive SCK clock. + This parameter can be a value of @ref SPI_BaudRate_Prescaler. + @note The communication clock is derived from the master + clock. The slave clock does not need to be set. */ + + uint16_t SPI_FirstBit; /*!< Specifies whether data transfers start from MSB or LSB bit. + This parameter can be a value of @ref SPI_MSB_LSB_transmission */ + + uint16_t SPI_CRCPolynomial; /*!< Specifies the polynomial used for the CRC calculation. */ +}SPI_InitTypeDef; + +/** + * @brief I2S Init structure definition + */ + +typedef struct +{ + + uint16_t I2S_Mode; /*!< Specifies the I2S operating mode. + This parameter can be a value of @ref I2S_Mode */ + + uint16_t I2S_Standard; /*!< Specifies the standard used for the I2S communication. + This parameter can be a value of @ref I2S_Standard */ + + uint16_t I2S_DataFormat; /*!< Specifies the data format for the I2S communication. + This parameter can be a value of @ref I2S_Data_Format */ + + uint16_t I2S_MCLKOutput; /*!< Specifies whether the I2S MCLK output is enabled or not. + This parameter can be a value of @ref I2S_MCLK_Output */ + + uint32_t I2S_AudioFreq; /*!< Specifies the frequency selected for the I2S communication. + This parameter can be a value of @ref I2S_Audio_Frequency */ + + uint16_t I2S_CPOL; /*!< Specifies the idle state of the I2S clock. + This parameter can be a value of @ref I2S_Clock_Polarity */ +}I2S_InitTypeDef; + +/** + * @} + */ + +/** @defgroup SPI_Exported_Constants + * @{ + */ + +#define IS_SPI_ALL_PERIPH(PERIPH) (((PERIPH) == SPI1) || \ + ((PERIPH) == SPI2) || \ + ((PERIPH) == SPI3)) + +#define IS_SPI_23_PERIPH(PERIPH) (((PERIPH) == SPI2) || \ + ((PERIPH) == SPI3)) + +/** @defgroup SPI_data_direction + * @{ + */ + +#define SPI_Direction_2Lines_FullDuplex ((uint16_t)0x0000) +#define SPI_Direction_2Lines_RxOnly ((uint16_t)0x0400) +#define SPI_Direction_1Line_Rx ((uint16_t)0x8000) +#define SPI_Direction_1Line_Tx ((uint16_t)0xC000) +#define IS_SPI_DIRECTION_MODE(MODE) (((MODE) == SPI_Direction_2Lines_FullDuplex) || \ + ((MODE) == SPI_Direction_2Lines_RxOnly) || \ + ((MODE) == SPI_Direction_1Line_Rx) || \ + ((MODE) == SPI_Direction_1Line_Tx)) +/** + * @} + */ + +/** @defgroup SPI_mode + * @{ + */ + +#define SPI_Mode_Master ((uint16_t)0x0104) +#define SPI_Mode_Slave ((uint16_t)0x0000) +#define IS_SPI_MODE(MODE) (((MODE) == SPI_Mode_Master) || \ + ((MODE) == SPI_Mode_Slave)) +/** + * @} + */ + +/** @defgroup SPI_data_size + * @{ + */ + +#define SPI_DataSize_16b ((uint16_t)0x0800) +#define SPI_DataSize_8b ((uint16_t)0x0000) +#define IS_SPI_DATASIZE(DATASIZE) (((DATASIZE) == SPI_DataSize_16b) || \ + ((DATASIZE) == SPI_DataSize_8b)) +/** + * @} + */ + +/** @defgroup SPI_Clock_Polarity + * @{ + */ + +#define SPI_CPOL_Low ((uint16_t)0x0000) +#define SPI_CPOL_High ((uint16_t)0x0002) +#define IS_SPI_CPOL(CPOL) (((CPOL) == SPI_CPOL_Low) || \ + ((CPOL) == SPI_CPOL_High)) +/** + * @} + */ + +/** @defgroup SPI_Clock_Phase + * @{ + */ + +#define SPI_CPHA_1Edge ((uint16_t)0x0000) +#define SPI_CPHA_2Edge ((uint16_t)0x0001) +#define IS_SPI_CPHA(CPHA) (((CPHA) == SPI_CPHA_1Edge) || \ + ((CPHA) == SPI_CPHA_2Edge)) +/** + * @} + */ + +/** @defgroup SPI_Slave_Select_management + * @{ + */ + +#define SPI_NSS_Soft ((uint16_t)0x0200) +#define SPI_NSS_Hard ((uint16_t)0x0000) +#define IS_SPI_NSS(NSS) (((NSS) == SPI_NSS_Soft) || \ + ((NSS) == SPI_NSS_Hard)) +/** + * @} + */ + +/** @defgroup SPI_BaudRate_Prescaler + * @{ + */ + +#define SPI_BaudRatePrescaler_2 ((uint16_t)0x0000) +#define SPI_BaudRatePrescaler_4 ((uint16_t)0x0008) +#define SPI_BaudRatePrescaler_8 ((uint16_t)0x0010) +#define SPI_BaudRatePrescaler_16 ((uint16_t)0x0018) +#define SPI_BaudRatePrescaler_32 ((uint16_t)0x0020) +#define SPI_BaudRatePrescaler_64 ((uint16_t)0x0028) +#define SPI_BaudRatePrescaler_128 ((uint16_t)0x0030) +#define SPI_BaudRatePrescaler_256 ((uint16_t)0x0038) +#define IS_SPI_BAUDRATE_PRESCALER(PRESCALER) (((PRESCALER) == SPI_BaudRatePrescaler_2) || \ + ((PRESCALER) == SPI_BaudRatePrescaler_4) || \ + ((PRESCALER) == SPI_BaudRatePrescaler_8) || \ + ((PRESCALER) == SPI_BaudRatePrescaler_16) || \ + ((PRESCALER) == SPI_BaudRatePrescaler_32) || \ + ((PRESCALER) == SPI_BaudRatePrescaler_64) || \ + ((PRESCALER) == SPI_BaudRatePrescaler_128) || \ + ((PRESCALER) == SPI_BaudRatePrescaler_256)) +/** + * @} + */ + +/** @defgroup SPI_MSB_LSB_transmission + * @{ + */ + +#define SPI_FirstBit_MSB ((uint16_t)0x0000) +#define SPI_FirstBit_LSB ((uint16_t)0x0080) +#define IS_SPI_FIRST_BIT(BIT) (((BIT) == SPI_FirstBit_MSB) || \ + ((BIT) == SPI_FirstBit_LSB)) +/** + * @} + */ + +/** @defgroup I2S_Mode + * @{ + */ + +#define I2S_Mode_SlaveTx ((uint16_t)0x0000) +#define I2S_Mode_SlaveRx ((uint16_t)0x0100) +#define I2S_Mode_MasterTx ((uint16_t)0x0200) +#define I2S_Mode_MasterRx ((uint16_t)0x0300) +#define IS_I2S_MODE(MODE) (((MODE) == I2S_Mode_SlaveTx) || \ + ((MODE) == I2S_Mode_SlaveRx) || \ + ((MODE) == I2S_Mode_MasterTx) || \ + ((MODE) == I2S_Mode_MasterRx) ) +/** + * @} + */ + +/** @defgroup I2S_Standard + * @{ + */ + +#define I2S_Standard_Phillips ((uint16_t)0x0000) +#define I2S_Standard_MSB ((uint16_t)0x0010) +#define I2S_Standard_LSB ((uint16_t)0x0020) +#define I2S_Standard_PCMShort ((uint16_t)0x0030) +#define I2S_Standard_PCMLong ((uint16_t)0x00B0) +#define IS_I2S_STANDARD(STANDARD) (((STANDARD) == I2S_Standard_Phillips) || \ + ((STANDARD) == I2S_Standard_MSB) || \ + ((STANDARD) == I2S_Standard_LSB) || \ + ((STANDARD) == I2S_Standard_PCMShort) || \ + ((STANDARD) == I2S_Standard_PCMLong)) +/** + * @} + */ + +/** @defgroup I2S_Data_Format + * @{ + */ + +#define I2S_DataFormat_16b ((uint16_t)0x0000) +#define I2S_DataFormat_16bextended ((uint16_t)0x0001) +#define I2S_DataFormat_24b ((uint16_t)0x0003) +#define I2S_DataFormat_32b ((uint16_t)0x0005) +#define IS_I2S_DATA_FORMAT(FORMAT) (((FORMAT) == I2S_DataFormat_16b) || \ + ((FORMAT) == I2S_DataFormat_16bextended) || \ + ((FORMAT) == I2S_DataFormat_24b) || \ + ((FORMAT) == I2S_DataFormat_32b)) +/** + * @} + */ + +/** @defgroup I2S_MCLK_Output + * @{ + */ + +#define I2S_MCLKOutput_Enable ((uint16_t)0x0200) +#define I2S_MCLKOutput_Disable ((uint16_t)0x0000) +#define IS_I2S_MCLK_OUTPUT(OUTPUT) (((OUTPUT) == I2S_MCLKOutput_Enable) || \ + ((OUTPUT) == I2S_MCLKOutput_Disable)) +/** + * @} + */ + +/** @defgroup I2S_Audio_Frequency + * @{ + */ + +#define I2S_AudioFreq_192k ((uint32_t)192000) +#define I2S_AudioFreq_96k ((uint32_t)96000) +#define I2S_AudioFreq_48k ((uint32_t)48000) +#define I2S_AudioFreq_44k ((uint32_t)44100) +#define I2S_AudioFreq_32k ((uint32_t)32000) +#define I2S_AudioFreq_22k ((uint32_t)22050) +#define I2S_AudioFreq_16k ((uint32_t)16000) +#define I2S_AudioFreq_11k ((uint32_t)11025) +#define I2S_AudioFreq_8k ((uint32_t)8000) +#define I2S_AudioFreq_Default ((uint32_t)2) + +#define IS_I2S_AUDIO_FREQ(FREQ) ((((FREQ) >= I2S_AudioFreq_8k) && \ + ((FREQ) <= I2S_AudioFreq_192k)) || \ + ((FREQ) == I2S_AudioFreq_Default)) +/** + * @} + */ + +/** @defgroup I2S_Clock_Polarity + * @{ + */ + +#define I2S_CPOL_Low ((uint16_t)0x0000) +#define I2S_CPOL_High ((uint16_t)0x0008) +#define IS_I2S_CPOL(CPOL) (((CPOL) == I2S_CPOL_Low) || \ + ((CPOL) == I2S_CPOL_High)) +/** + * @} + */ + +/** @defgroup SPI_I2S_DMA_transfer_requests + * @{ + */ + +#define SPI_I2S_DMAReq_Tx ((uint16_t)0x0002) +#define SPI_I2S_DMAReq_Rx ((uint16_t)0x0001) +#define IS_SPI_I2S_DMAREQ(DMAREQ) ((((DMAREQ) & (uint16_t)0xFFFC) == 0x00) && ((DMAREQ) != 0x00)) +/** + * @} + */ + +/** @defgroup SPI_NSS_internal_software_management + * @{ + */ + +#define SPI_NSSInternalSoft_Set ((uint16_t)0x0100) +#define SPI_NSSInternalSoft_Reset ((uint16_t)0xFEFF) +#define IS_SPI_NSS_INTERNAL(INTERNAL) (((INTERNAL) == SPI_NSSInternalSoft_Set) || \ + ((INTERNAL) == SPI_NSSInternalSoft_Reset)) +/** + * @} + */ + +/** @defgroup SPI_CRC_Transmit_Receive + * @{ + */ + +#define SPI_CRC_Tx ((uint8_t)0x00) +#define SPI_CRC_Rx ((uint8_t)0x01) +#define IS_SPI_CRC(CRC) (((CRC) == SPI_CRC_Tx) || ((CRC) == SPI_CRC_Rx)) +/** + * @} + */ + +/** @defgroup SPI_direction_transmit_receive + * @{ + */ + +#define SPI_Direction_Rx ((uint16_t)0xBFFF) +#define SPI_Direction_Tx ((uint16_t)0x4000) +#define IS_SPI_DIRECTION(DIRECTION) (((DIRECTION) == SPI_Direction_Rx) || \ + ((DIRECTION) == SPI_Direction_Tx)) +/** + * @} + */ + +/** @defgroup SPI_I2S_interrupts_definition + * @{ + */ + +#define SPI_I2S_IT_TXE ((uint8_t)0x71) +#define SPI_I2S_IT_RXNE ((uint8_t)0x60) +#define SPI_I2S_IT_ERR ((uint8_t)0x50) +#define IS_SPI_I2S_CONFIG_IT(IT) (((IT) == SPI_I2S_IT_TXE) || \ + ((IT) == SPI_I2S_IT_RXNE) || \ + ((IT) == SPI_I2S_IT_ERR)) +#define SPI_I2S_IT_OVR ((uint8_t)0x56) +#define SPI_IT_MODF ((uint8_t)0x55) +#define SPI_IT_CRCERR ((uint8_t)0x54) +#define I2S_IT_UDR ((uint8_t)0x53) +#define IS_SPI_I2S_CLEAR_IT(IT) (((IT) == SPI_IT_CRCERR)) +#define IS_SPI_I2S_GET_IT(IT) (((IT) == SPI_I2S_IT_RXNE) || ((IT) == SPI_I2S_IT_TXE) || \ + ((IT) == I2S_IT_UDR) || ((IT) == SPI_IT_CRCERR) || \ + ((IT) == SPI_IT_MODF) || ((IT) == SPI_I2S_IT_OVR)) +/** + * @} + */ + +/** @defgroup SPI_I2S_flags_definition + * @{ + */ + +#define SPI_I2S_FLAG_RXNE ((uint16_t)0x0001) +#define SPI_I2S_FLAG_TXE ((uint16_t)0x0002) +#define I2S_FLAG_CHSIDE ((uint16_t)0x0004) +#define I2S_FLAG_UDR ((uint16_t)0x0008) +#define SPI_FLAG_CRCERR ((uint16_t)0x0010) +#define SPI_FLAG_MODF ((uint16_t)0x0020) +#define SPI_I2S_FLAG_OVR ((uint16_t)0x0040) +#define SPI_I2S_FLAG_BSY ((uint16_t)0x0080) +#define IS_SPI_I2S_CLEAR_FLAG(FLAG) (((FLAG) == SPI_FLAG_CRCERR)) +#define IS_SPI_I2S_GET_FLAG(FLAG) (((FLAG) == SPI_I2S_FLAG_BSY) || ((FLAG) == SPI_I2S_FLAG_OVR) || \ + ((FLAG) == SPI_FLAG_MODF) || ((FLAG) == SPI_FLAG_CRCERR) || \ + ((FLAG) == I2S_FLAG_UDR) || ((FLAG) == I2S_FLAG_CHSIDE) || \ + ((FLAG) == SPI_I2S_FLAG_TXE) || ((FLAG) == SPI_I2S_FLAG_RXNE)) +/** + * @} + */ + +/** @defgroup SPI_CRC_polynomial + * @{ + */ + +#define IS_SPI_CRC_POLYNOMIAL(POLYNOMIAL) ((POLYNOMIAL) >= 0x1) +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup SPI_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup SPI_Exported_Functions + * @{ + */ + +void SPI_I2S_DeInit(SPI_TypeDef* SPIx); +void SPI_Init(SPI_TypeDef* SPIx, SPI_InitTypeDef* SPI_InitStruct); +void I2S_Init(SPI_TypeDef* SPIx, I2S_InitTypeDef* I2S_InitStruct); +void SPI_StructInit(SPI_InitTypeDef* SPI_InitStruct); +void I2S_StructInit(I2S_InitTypeDef* I2S_InitStruct); +void SPI_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState); +void I2S_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState); +void SPI_I2S_ITConfig(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT, FunctionalState NewState); +void SPI_I2S_DMACmd(SPI_TypeDef* SPIx, uint16_t SPI_I2S_DMAReq, FunctionalState NewState); +void SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data); +uint16_t SPI_I2S_ReceiveData(SPI_TypeDef* SPIx); +void SPI_NSSInternalSoftwareConfig(SPI_TypeDef* SPIx, uint16_t SPI_NSSInternalSoft); +void SPI_SSOutputCmd(SPI_TypeDef* SPIx, FunctionalState NewState); +void SPI_DataSizeConfig(SPI_TypeDef* SPIx, uint16_t SPI_DataSize); +void SPI_TransmitCRC(SPI_TypeDef* SPIx); +void SPI_CalculateCRC(SPI_TypeDef* SPIx, FunctionalState NewState); +uint16_t SPI_GetCRC(SPI_TypeDef* SPIx, uint8_t SPI_CRC); +uint16_t SPI_GetCRCPolynomial(SPI_TypeDef* SPIx); +void SPI_BiDirectionalLineConfig(SPI_TypeDef* SPIx, uint16_t SPI_Direction); +FlagStatus SPI_I2S_GetFlagStatus(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG); +void SPI_I2S_ClearFlag(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG); +ITStatus SPI_I2S_GetITStatus(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT); +void SPI_I2S_ClearITPendingBit(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT); + +#ifdef __cplusplus +} +#endif + +#endif /*__STM32F10x_SPI_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_tim.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_tim.h new file mode 100644 index 0000000..cd7ac3e --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_tim.h @@ -0,0 +1,1164 @@ +/** + ****************************************************************************** + * @file stm32f10x_tim.h + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief This file contains all the functions prototypes for the TIM firmware + * library. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_TIM_H +#define __STM32F10x_TIM_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup TIM + * @{ + */ + +/** @defgroup TIM_Exported_Types + * @{ + */ + +/** + * @brief TIM Time Base Init structure definition + * @note This structure is used with all TIMx except for TIM6 and TIM7. + */ + +typedef struct +{ + uint16_t TIM_Prescaler; /*!< Specifies the prescaler value used to divide the TIM clock. + This parameter can be a number between 0x0000 and 0xFFFF */ + + uint16_t TIM_CounterMode; /*!< Specifies the counter mode. + This parameter can be a value of @ref TIM_Counter_Mode */ + + uint16_t TIM_Period; /*!< Specifies the period value to be loaded into the active + Auto-Reload Register at the next update event. + This parameter must be a number between 0x0000 and 0xFFFF. */ + + uint16_t TIM_ClockDivision; /*!< Specifies the clock division. + This parameter can be a value of @ref TIM_Clock_Division_CKD */ + + uint8_t TIM_RepetitionCounter; /*!< Specifies the repetition counter value. Each time the RCR downcounter + reaches zero, an update event is generated and counting restarts + from the RCR value (N). + This means in PWM mode that (N+1) corresponds to: + - the number of PWM periods in edge-aligned mode + - the number of half PWM period in center-aligned mode + This parameter must be a number between 0x00 and 0xFF. + @note This parameter is valid only for TIM1 and TIM8. */ +} TIM_TimeBaseInitTypeDef; + +/** + * @brief TIM Output Compare Init structure definition + */ + +typedef struct +{ + uint16_t TIM_OCMode; /*!< Specifies the TIM mode. + This parameter can be a value of @ref TIM_Output_Compare_and_PWM_modes */ + + uint16_t TIM_OutputState; /*!< Specifies the TIM Output Compare state. + This parameter can be a value of @ref TIM_Output_Compare_state */ + + uint16_t TIM_OutputNState; /*!< Specifies the TIM complementary Output Compare state. + This parameter can be a value of @ref TIM_Output_Compare_N_state + @note This parameter is valid only for TIM1 and TIM8. */ + + uint16_t TIM_Pulse; /*!< Specifies the pulse value to be loaded into the Capture Compare Register. + This parameter can be a number between 0x0000 and 0xFFFF */ + + uint16_t TIM_OCPolarity; /*!< Specifies the output polarity. + This parameter can be a value of @ref TIM_Output_Compare_Polarity */ + + uint16_t TIM_OCNPolarity; /*!< Specifies the complementary output polarity. + This parameter can be a value of @ref TIM_Output_Compare_N_Polarity + @note This parameter is valid only for TIM1 and TIM8. */ + + uint16_t TIM_OCIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. + This parameter can be a value of @ref TIM_Output_Compare_Idle_State + @note This parameter is valid only for TIM1 and TIM8. */ + + uint16_t TIM_OCNIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. + This parameter can be a value of @ref TIM_Output_Compare_N_Idle_State + @note This parameter is valid only for TIM1 and TIM8. */ +} TIM_OCInitTypeDef; + +/** + * @brief TIM Input Capture Init structure definition + */ + +typedef struct +{ + + uint16_t TIM_Channel; /*!< Specifies the TIM channel. + This parameter can be a value of @ref TIM_Channel */ + + uint16_t TIM_ICPolarity; /*!< Specifies the active edge of the input signal. + This parameter can be a value of @ref TIM_Input_Capture_Polarity */ + + uint16_t TIM_ICSelection; /*!< Specifies the input. + This parameter can be a value of @ref TIM_Input_Capture_Selection */ + + uint16_t TIM_ICPrescaler; /*!< Specifies the Input Capture Prescaler. + This parameter can be a value of @ref TIM_Input_Capture_Prescaler */ + + uint16_t TIM_ICFilter; /*!< Specifies the input capture filter. + This parameter can be a number between 0x0 and 0xF */ +} TIM_ICInitTypeDef; + +/** + * @brief BDTR structure definition + * @note This structure is used only with TIM1 and TIM8. + */ + +typedef struct +{ + + uint16_t TIM_OSSRState; /*!< Specifies the Off-State selection used in Run mode. + This parameter can be a value of @ref OSSR_Off_State_Selection_for_Run_mode_state */ + + uint16_t TIM_OSSIState; /*!< Specifies the Off-State used in Idle state. + This parameter can be a value of @ref OSSI_Off_State_Selection_for_Idle_mode_state */ + + uint16_t TIM_LOCKLevel; /*!< Specifies the LOCK level parameters. + This parameter can be a value of @ref Lock_level */ + + uint16_t TIM_DeadTime; /*!< Specifies the delay time between the switching-off and the + switching-on of the outputs. + This parameter can be a number between 0x00 and 0xFF */ + + uint16_t TIM_Break; /*!< Specifies whether the TIM Break input is enabled or not. + This parameter can be a value of @ref Break_Input_enable_disable */ + + uint16_t TIM_BreakPolarity; /*!< Specifies the TIM Break Input pin polarity. + This parameter can be a value of @ref Break_Polarity */ + + uint16_t TIM_AutomaticOutput; /*!< Specifies whether the TIM Automatic Output feature is enabled or not. + This parameter can be a value of @ref TIM_AOE_Bit_Set_Reset */ +} TIM_BDTRInitTypeDef; + +/** @defgroup TIM_Exported_constants + * @{ + */ + +#define IS_TIM_ALL_PERIPH(PERIPH) (((PERIPH) == TIM1) || \ + ((PERIPH) == TIM2) || \ + ((PERIPH) == TIM3) || \ + ((PERIPH) == TIM4) || \ + ((PERIPH) == TIM5) || \ + ((PERIPH) == TIM6) || \ + ((PERIPH) == TIM7) || \ + ((PERIPH) == TIM8) || \ + ((PERIPH) == TIM9) || \ + ((PERIPH) == TIM10)|| \ + ((PERIPH) == TIM11)|| \ + ((PERIPH) == TIM12)|| \ + ((PERIPH) == TIM13)|| \ + ((PERIPH) == TIM14)|| \ + ((PERIPH) == TIM15)|| \ + ((PERIPH) == TIM16)|| \ + ((PERIPH) == TIM17)) + +/* LIST1: TIM 1 and 8 */ +#define IS_TIM_LIST1_PERIPH(PERIPH) (((PERIPH) == TIM1) || \ + ((PERIPH) == TIM8)) + +/* LIST2: TIM 1, 8, 15 16 and 17 */ +#define IS_TIM_LIST2_PERIPH(PERIPH) (((PERIPH) == TIM1) || \ + ((PERIPH) == TIM8) || \ + ((PERIPH) == TIM15)|| \ + ((PERIPH) == TIM16)|| \ + ((PERIPH) == TIM17)) + +/* LIST3: TIM 1, 2, 3, 4, 5 and 8 */ +#define IS_TIM_LIST3_PERIPH(PERIPH) (((PERIPH) == TIM1) || \ + ((PERIPH) == TIM2) || \ + ((PERIPH) == TIM3) || \ + ((PERIPH) == TIM4) || \ + ((PERIPH) == TIM5) || \ + ((PERIPH) == TIM8)) + +/* LIST4: TIM 1, 2, 3, 4, 5, 8, 15, 16 and 17 */ +#define IS_TIM_LIST4_PERIPH(PERIPH) (((PERIPH) == TIM1) || \ + ((PERIPH) == TIM2) || \ + ((PERIPH) == TIM3) || \ + ((PERIPH) == TIM4) || \ + ((PERIPH) == TIM5) || \ + ((PERIPH) == TIM8) || \ + ((PERIPH) == TIM15)|| \ + ((PERIPH) == TIM16)|| \ + ((PERIPH) == TIM17)) + +/* LIST5: TIM 1, 2, 3, 4, 5, 8 and 15 */ +#define IS_TIM_LIST5_PERIPH(PERIPH) (((PERIPH) == TIM1) || \ + ((PERIPH) == TIM2) || \ + ((PERIPH) == TIM3) || \ + ((PERIPH) == TIM4) || \ + ((PERIPH) == TIM5) || \ + ((PERIPH) == TIM8) || \ + ((PERIPH) == TIM15)) + +/* LIST6: TIM 1, 2, 3, 4, 5, 8, 9, 12 and 15 */ +#define IS_TIM_LIST6_PERIPH(PERIPH) (((PERIPH) == TIM1) || \ + ((PERIPH) == TIM2) || \ + ((PERIPH) == TIM3) || \ + ((PERIPH) == TIM4) || \ + ((PERIPH) == TIM5) || \ + ((PERIPH) == TIM8) || \ + ((PERIPH) == TIM9) || \ + ((PERIPH) == TIM12)|| \ + ((PERIPH) == TIM15)) + +/* LIST7: TIM 1, 2, 3, 4, 5, 6, 7, 8, 9, 12 and 15 */ +#define IS_TIM_LIST7_PERIPH(PERIPH) (((PERIPH) == TIM1) || \ + ((PERIPH) == TIM2) || \ + ((PERIPH) == TIM3) || \ + ((PERIPH) == TIM4) || \ + ((PERIPH) == TIM5) || \ + ((PERIPH) == TIM6) || \ + ((PERIPH) == TIM7) || \ + ((PERIPH) == TIM8) || \ + ((PERIPH) == TIM9) || \ + ((PERIPH) == TIM12)|| \ + ((PERIPH) == TIM15)) + +/* LIST8: TIM 1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13, 14, 15, 16 and 17 */ +#define IS_TIM_LIST8_PERIPH(PERIPH) (((PERIPH) == TIM1) || \ + ((PERIPH) == TIM2) || \ + ((PERIPH) == TIM3) || \ + ((PERIPH) == TIM4) || \ + ((PERIPH) == TIM5) || \ + ((PERIPH) == TIM8) || \ + ((PERIPH) == TIM9) || \ + ((PERIPH) == TIM10)|| \ + ((PERIPH) == TIM11)|| \ + ((PERIPH) == TIM12)|| \ + ((PERIPH) == TIM13)|| \ + ((PERIPH) == TIM14)|| \ + ((PERIPH) == TIM15)|| \ + ((PERIPH) == TIM16)|| \ + ((PERIPH) == TIM17)) + +/* LIST9: TIM 1, 2, 3, 4, 5, 6, 7, 8, 15, 16, and 17 */ +#define IS_TIM_LIST9_PERIPH(PERIPH) (((PERIPH) == TIM1) || \ + ((PERIPH) == TIM2) || \ + ((PERIPH) == TIM3) || \ + ((PERIPH) == TIM4) || \ + ((PERIPH) == TIM5) || \ + ((PERIPH) == TIM6) || \ + ((PERIPH) == TIM7) || \ + ((PERIPH) == TIM8) || \ + ((PERIPH) == TIM15)|| \ + ((PERIPH) == TIM16)|| \ + ((PERIPH) == TIM17)) + +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_and_PWM_modes + * @{ + */ + +#define TIM_OCMode_Timing ((uint16_t)0x0000) +#define TIM_OCMode_Active ((uint16_t)0x0010) +#define TIM_OCMode_Inactive ((uint16_t)0x0020) +#define TIM_OCMode_Toggle ((uint16_t)0x0030) +#define TIM_OCMode_PWM1 ((uint16_t)0x0060) +#define TIM_OCMode_PWM2 ((uint16_t)0x0070) +#define IS_TIM_OC_MODE(MODE) (((MODE) == TIM_OCMode_Timing) || \ + ((MODE) == TIM_OCMode_Active) || \ + ((MODE) == TIM_OCMode_Inactive) || \ + ((MODE) == TIM_OCMode_Toggle)|| \ + ((MODE) == TIM_OCMode_PWM1) || \ + ((MODE) == TIM_OCMode_PWM2)) +#define IS_TIM_OCM(MODE) (((MODE) == TIM_OCMode_Timing) || \ + ((MODE) == TIM_OCMode_Active) || \ + ((MODE) == TIM_OCMode_Inactive) || \ + ((MODE) == TIM_OCMode_Toggle)|| \ + ((MODE) == TIM_OCMode_PWM1) || \ + ((MODE) == TIM_OCMode_PWM2) || \ + ((MODE) == TIM_ForcedAction_Active) || \ + ((MODE) == TIM_ForcedAction_InActive)) +/** + * @} + */ + +/** @defgroup TIM_One_Pulse_Mode + * @{ + */ + +#define TIM_OPMode_Single ((uint16_t)0x0008) +#define TIM_OPMode_Repetitive ((uint16_t)0x0000) +#define IS_TIM_OPM_MODE(MODE) (((MODE) == TIM_OPMode_Single) || \ + ((MODE) == TIM_OPMode_Repetitive)) +/** + * @} + */ + +/** @defgroup TIM_Channel + * @{ + */ + +#define TIM_Channel_1 ((uint16_t)0x0000) +#define TIM_Channel_2 ((uint16_t)0x0004) +#define TIM_Channel_3 ((uint16_t)0x0008) +#define TIM_Channel_4 ((uint16_t)0x000C) +#define IS_TIM_CHANNEL(CHANNEL) (((CHANNEL) == TIM_Channel_1) || \ + ((CHANNEL) == TIM_Channel_2) || \ + ((CHANNEL) == TIM_Channel_3) || \ + ((CHANNEL) == TIM_Channel_4)) +#define IS_TIM_PWMI_CHANNEL(CHANNEL) (((CHANNEL) == TIM_Channel_1) || \ + ((CHANNEL) == TIM_Channel_2)) +#define IS_TIM_COMPLEMENTARY_CHANNEL(CHANNEL) (((CHANNEL) == TIM_Channel_1) || \ + ((CHANNEL) == TIM_Channel_2) || \ + ((CHANNEL) == TIM_Channel_3)) +/** + * @} + */ + +/** @defgroup TIM_Clock_Division_CKD + * @{ + */ + +#define TIM_CKD_DIV1 ((uint16_t)0x0000) +#define TIM_CKD_DIV2 ((uint16_t)0x0100) +#define TIM_CKD_DIV4 ((uint16_t)0x0200) +#define IS_TIM_CKD_DIV(DIV) (((DIV) == TIM_CKD_DIV1) || \ + ((DIV) == TIM_CKD_DIV2) || \ + ((DIV) == TIM_CKD_DIV4)) +/** + * @} + */ + +/** @defgroup TIM_Counter_Mode + * @{ + */ + +#define TIM_CounterMode_Up ((uint16_t)0x0000) +#define TIM_CounterMode_Down ((uint16_t)0x0010) +#define TIM_CounterMode_CenterAligned1 ((uint16_t)0x0020) +#define TIM_CounterMode_CenterAligned2 ((uint16_t)0x0040) +#define TIM_CounterMode_CenterAligned3 ((uint16_t)0x0060) +#define IS_TIM_COUNTER_MODE(MODE) (((MODE) == TIM_CounterMode_Up) || \ + ((MODE) == TIM_CounterMode_Down) || \ + ((MODE) == TIM_CounterMode_CenterAligned1) || \ + ((MODE) == TIM_CounterMode_CenterAligned2) || \ + ((MODE) == TIM_CounterMode_CenterAligned3)) +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_Polarity + * @{ + */ + +#define TIM_OCPolarity_High ((uint16_t)0x0000) +#define TIM_OCPolarity_Low ((uint16_t)0x0002) +#define IS_TIM_OC_POLARITY(POLARITY) (((POLARITY) == TIM_OCPolarity_High) || \ + ((POLARITY) == TIM_OCPolarity_Low)) +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_N_Polarity + * @{ + */ + +#define TIM_OCNPolarity_High ((uint16_t)0x0000) +#define TIM_OCNPolarity_Low ((uint16_t)0x0008) +#define IS_TIM_OCN_POLARITY(POLARITY) (((POLARITY) == TIM_OCNPolarity_High) || \ + ((POLARITY) == TIM_OCNPolarity_Low)) +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_state + * @{ + */ + +#define TIM_OutputState_Disable ((uint16_t)0x0000) +#define TIM_OutputState_Enable ((uint16_t)0x0001) +#define IS_TIM_OUTPUT_STATE(STATE) (((STATE) == TIM_OutputState_Disable) || \ + ((STATE) == TIM_OutputState_Enable)) +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_N_state + * @{ + */ + +#define TIM_OutputNState_Disable ((uint16_t)0x0000) +#define TIM_OutputNState_Enable ((uint16_t)0x0004) +#define IS_TIM_OUTPUTN_STATE(STATE) (((STATE) == TIM_OutputNState_Disable) || \ + ((STATE) == TIM_OutputNState_Enable)) +/** + * @} + */ + +/** @defgroup TIM_Capture_Compare_state + * @{ + */ + +#define TIM_CCx_Enable ((uint16_t)0x0001) +#define TIM_CCx_Disable ((uint16_t)0x0000) +#define IS_TIM_CCX(CCX) (((CCX) == TIM_CCx_Enable) || \ + ((CCX) == TIM_CCx_Disable)) +/** + * @} + */ + +/** @defgroup TIM_Capture_Compare_N_state + * @{ + */ + +#define TIM_CCxN_Enable ((uint16_t)0x0004) +#define TIM_CCxN_Disable ((uint16_t)0x0000) +#define IS_TIM_CCXN(CCXN) (((CCXN) == TIM_CCxN_Enable) || \ + ((CCXN) == TIM_CCxN_Disable)) +/** + * @} + */ + +/** @defgroup Break_Input_enable_disable + * @{ + */ + +#define TIM_Break_Enable ((uint16_t)0x1000) +#define TIM_Break_Disable ((uint16_t)0x0000) +#define IS_TIM_BREAK_STATE(STATE) (((STATE) == TIM_Break_Enable) || \ + ((STATE) == TIM_Break_Disable)) +/** + * @} + */ + +/** @defgroup Break_Polarity + * @{ + */ + +#define TIM_BreakPolarity_Low ((uint16_t)0x0000) +#define TIM_BreakPolarity_High ((uint16_t)0x2000) +#define IS_TIM_BREAK_POLARITY(POLARITY) (((POLARITY) == TIM_BreakPolarity_Low) || \ + ((POLARITY) == TIM_BreakPolarity_High)) +/** + * @} + */ + +/** @defgroup TIM_AOE_Bit_Set_Reset + * @{ + */ + +#define TIM_AutomaticOutput_Enable ((uint16_t)0x4000) +#define TIM_AutomaticOutput_Disable ((uint16_t)0x0000) +#define IS_TIM_AUTOMATIC_OUTPUT_STATE(STATE) (((STATE) == TIM_AutomaticOutput_Enable) || \ + ((STATE) == TIM_AutomaticOutput_Disable)) +/** + * @} + */ + +/** @defgroup Lock_level + * @{ + */ + +#define TIM_LOCKLevel_OFF ((uint16_t)0x0000) +#define TIM_LOCKLevel_1 ((uint16_t)0x0100) +#define TIM_LOCKLevel_2 ((uint16_t)0x0200) +#define TIM_LOCKLevel_3 ((uint16_t)0x0300) +#define IS_TIM_LOCK_LEVEL(LEVEL) (((LEVEL) == TIM_LOCKLevel_OFF) || \ + ((LEVEL) == TIM_LOCKLevel_1) || \ + ((LEVEL) == TIM_LOCKLevel_2) || \ + ((LEVEL) == TIM_LOCKLevel_3)) +/** + * @} + */ + +/** @defgroup OSSI_Off_State_Selection_for_Idle_mode_state + * @{ + */ + +#define TIM_OSSIState_Enable ((uint16_t)0x0400) +#define TIM_OSSIState_Disable ((uint16_t)0x0000) +#define IS_TIM_OSSI_STATE(STATE) (((STATE) == TIM_OSSIState_Enable) || \ + ((STATE) == TIM_OSSIState_Disable)) +/** + * @} + */ + +/** @defgroup OSSR_Off_State_Selection_for_Run_mode_state + * @{ + */ + +#define TIM_OSSRState_Enable ((uint16_t)0x0800) +#define TIM_OSSRState_Disable ((uint16_t)0x0000) +#define IS_TIM_OSSR_STATE(STATE) (((STATE) == TIM_OSSRState_Enable) || \ + ((STATE) == TIM_OSSRState_Disable)) +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_Idle_State + * @{ + */ + +#define TIM_OCIdleState_Set ((uint16_t)0x0100) +#define TIM_OCIdleState_Reset ((uint16_t)0x0000) +#define IS_TIM_OCIDLE_STATE(STATE) (((STATE) == TIM_OCIdleState_Set) || \ + ((STATE) == TIM_OCIdleState_Reset)) +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_N_Idle_State + * @{ + */ + +#define TIM_OCNIdleState_Set ((uint16_t)0x0200) +#define TIM_OCNIdleState_Reset ((uint16_t)0x0000) +#define IS_TIM_OCNIDLE_STATE(STATE) (((STATE) == TIM_OCNIdleState_Set) || \ + ((STATE) == TIM_OCNIdleState_Reset)) +/** + * @} + */ + +/** @defgroup TIM_Input_Capture_Polarity + * @{ + */ + +#define TIM_ICPolarity_Rising ((uint16_t)0x0000) +#define TIM_ICPolarity_Falling ((uint16_t)0x0002) +#define TIM_ICPolarity_BothEdge ((uint16_t)0x000A) +#define IS_TIM_IC_POLARITY(POLARITY) (((POLARITY) == TIM_ICPolarity_Rising) || \ + ((POLARITY) == TIM_ICPolarity_Falling)) +#define IS_TIM_IC_POLARITY_LITE(POLARITY) (((POLARITY) == TIM_ICPolarity_Rising) || \ + ((POLARITY) == TIM_ICPolarity_Falling)|| \ + ((POLARITY) == TIM_ICPolarity_BothEdge)) +/** + * @} + */ + +/** @defgroup TIM_Input_Capture_Selection + * @{ + */ + +#define TIM_ICSelection_DirectTI ((uint16_t)0x0001) /*!< TIM Input 1, 2, 3 or 4 is selected to be + connected to IC1, IC2, IC3 or IC4, respectively */ +#define TIM_ICSelection_IndirectTI ((uint16_t)0x0002) /*!< TIM Input 1, 2, 3 or 4 is selected to be + connected to IC2, IC1, IC4 or IC3, respectively. */ +#define TIM_ICSelection_TRC ((uint16_t)0x0003) /*!< TIM Input 1, 2, 3 or 4 is selected to be connected to TRC. */ +#define IS_TIM_IC_SELECTION(SELECTION) (((SELECTION) == TIM_ICSelection_DirectTI) || \ + ((SELECTION) == TIM_ICSelection_IndirectTI) || \ + ((SELECTION) == TIM_ICSelection_TRC)) +/** + * @} + */ + +/** @defgroup TIM_Input_Capture_Prescaler + * @{ + */ + +#define TIM_ICPSC_DIV1 ((uint16_t)0x0000) /*!< Capture performed each time an edge is detected on the capture input. */ +#define TIM_ICPSC_DIV2 ((uint16_t)0x0004) /*!< Capture performed once every 2 events. */ +#define TIM_ICPSC_DIV4 ((uint16_t)0x0008) /*!< Capture performed once every 4 events. */ +#define TIM_ICPSC_DIV8 ((uint16_t)0x000C) /*!< Capture performed once every 8 events. */ +#define IS_TIM_IC_PRESCALER(PRESCALER) (((PRESCALER) == TIM_ICPSC_DIV1) || \ + ((PRESCALER) == TIM_ICPSC_DIV2) || \ + ((PRESCALER) == TIM_ICPSC_DIV4) || \ + ((PRESCALER) == TIM_ICPSC_DIV8)) +/** + * @} + */ + +/** @defgroup TIM_interrupt_sources + * @{ + */ + +#define TIM_IT_Update ((uint16_t)0x0001) +#define TIM_IT_CC1 ((uint16_t)0x0002) +#define TIM_IT_CC2 ((uint16_t)0x0004) +#define TIM_IT_CC3 ((uint16_t)0x0008) +#define TIM_IT_CC4 ((uint16_t)0x0010) +#define TIM_IT_COM ((uint16_t)0x0020) +#define TIM_IT_Trigger ((uint16_t)0x0040) +#define TIM_IT_Break ((uint16_t)0x0080) +#define IS_TIM_IT(IT) ((((IT) & (uint16_t)0xFF00) == 0x0000) && ((IT) != 0x0000)) + +#define IS_TIM_GET_IT(IT) (((IT) == TIM_IT_Update) || \ + ((IT) == TIM_IT_CC1) || \ + ((IT) == TIM_IT_CC2) || \ + ((IT) == TIM_IT_CC3) || \ + ((IT) == TIM_IT_CC4) || \ + ((IT) == TIM_IT_COM) || \ + ((IT) == TIM_IT_Trigger) || \ + ((IT) == TIM_IT_Break)) +/** + * @} + */ + +/** @defgroup TIM_DMA_Base_address + * @{ + */ + +#define TIM_DMABase_CR1 ((uint16_t)0x0000) +#define TIM_DMABase_CR2 ((uint16_t)0x0001) +#define TIM_DMABase_SMCR ((uint16_t)0x0002) +#define TIM_DMABase_DIER ((uint16_t)0x0003) +#define TIM_DMABase_SR ((uint16_t)0x0004) +#define TIM_DMABase_EGR ((uint16_t)0x0005) +#define TIM_DMABase_CCMR1 ((uint16_t)0x0006) +#define TIM_DMABase_CCMR2 ((uint16_t)0x0007) +#define TIM_DMABase_CCER ((uint16_t)0x0008) +#define TIM_DMABase_CNT ((uint16_t)0x0009) +#define TIM_DMABase_PSC ((uint16_t)0x000A) +#define TIM_DMABase_ARR ((uint16_t)0x000B) +#define TIM_DMABase_RCR ((uint16_t)0x000C) +#define TIM_DMABase_CCR1 ((uint16_t)0x000D) +#define TIM_DMABase_CCR2 ((uint16_t)0x000E) +#define TIM_DMABase_CCR3 ((uint16_t)0x000F) +#define TIM_DMABase_CCR4 ((uint16_t)0x0010) +#define TIM_DMABase_BDTR ((uint16_t)0x0011) +#define TIM_DMABase_DCR ((uint16_t)0x0012) +#define IS_TIM_DMA_BASE(BASE) (((BASE) == TIM_DMABase_CR1) || \ + ((BASE) == TIM_DMABase_CR2) || \ + ((BASE) == TIM_DMABase_SMCR) || \ + ((BASE) == TIM_DMABase_DIER) || \ + ((BASE) == TIM_DMABase_SR) || \ + ((BASE) == TIM_DMABase_EGR) || \ + ((BASE) == TIM_DMABase_CCMR1) || \ + ((BASE) == TIM_DMABase_CCMR2) || \ + ((BASE) == TIM_DMABase_CCER) || \ + ((BASE) == TIM_DMABase_CNT) || \ + ((BASE) == TIM_DMABase_PSC) || \ + ((BASE) == TIM_DMABase_ARR) || \ + ((BASE) == TIM_DMABase_RCR) || \ + ((BASE) == TIM_DMABase_CCR1) || \ + ((BASE) == TIM_DMABase_CCR2) || \ + ((BASE) == TIM_DMABase_CCR3) || \ + ((BASE) == TIM_DMABase_CCR4) || \ + ((BASE) == TIM_DMABase_BDTR) || \ + ((BASE) == TIM_DMABase_DCR)) +/** + * @} + */ + +/** @defgroup TIM_DMA_Burst_Length + * @{ + */ + +#define TIM_DMABurstLength_1Transfer ((uint16_t)0x0000) +#define TIM_DMABurstLength_2Transfers ((uint16_t)0x0100) +#define TIM_DMABurstLength_3Transfers ((uint16_t)0x0200) +#define TIM_DMABurstLength_4Transfers ((uint16_t)0x0300) +#define TIM_DMABurstLength_5Transfers ((uint16_t)0x0400) +#define TIM_DMABurstLength_6Transfers ((uint16_t)0x0500) +#define TIM_DMABurstLength_7Transfers ((uint16_t)0x0600) +#define TIM_DMABurstLength_8Transfers ((uint16_t)0x0700) +#define TIM_DMABurstLength_9Transfers ((uint16_t)0x0800) +#define TIM_DMABurstLength_10Transfers ((uint16_t)0x0900) +#define TIM_DMABurstLength_11Transfers ((uint16_t)0x0A00) +#define TIM_DMABurstLength_12Transfers ((uint16_t)0x0B00) +#define TIM_DMABurstLength_13Transfers ((uint16_t)0x0C00) +#define TIM_DMABurstLength_14Transfers ((uint16_t)0x0D00) +#define TIM_DMABurstLength_15Transfers ((uint16_t)0x0E00) +#define TIM_DMABurstLength_16Transfers ((uint16_t)0x0F00) +#define TIM_DMABurstLength_17Transfers ((uint16_t)0x1000) +#define TIM_DMABurstLength_18Transfers ((uint16_t)0x1100) +#define IS_TIM_DMA_LENGTH(LENGTH) (((LENGTH) == TIM_DMABurstLength_1Transfer) || \ + ((LENGTH) == TIM_DMABurstLength_2Transfers) || \ + ((LENGTH) == TIM_DMABurstLength_3Transfers) || \ + ((LENGTH) == TIM_DMABurstLength_4Transfers) || \ + ((LENGTH) == TIM_DMABurstLength_5Transfers) || \ + ((LENGTH) == TIM_DMABurstLength_6Transfers) || \ + ((LENGTH) == TIM_DMABurstLength_7Transfers) || \ + ((LENGTH) == TIM_DMABurstLength_8Transfers) || \ + ((LENGTH) == TIM_DMABurstLength_9Transfers) || \ + ((LENGTH) == TIM_DMABurstLength_10Transfers) || \ + ((LENGTH) == TIM_DMABurstLength_11Transfers) || \ + ((LENGTH) == TIM_DMABurstLength_12Transfers) || \ + ((LENGTH) == TIM_DMABurstLength_13Transfers) || \ + ((LENGTH) == TIM_DMABurstLength_14Transfers) || \ + ((LENGTH) == TIM_DMABurstLength_15Transfers) || \ + ((LENGTH) == TIM_DMABurstLength_16Transfers) || \ + ((LENGTH) == TIM_DMABurstLength_17Transfers) || \ + ((LENGTH) == TIM_DMABurstLength_18Transfers)) +/** + * @} + */ + +/** @defgroup TIM_DMA_sources + * @{ + */ + +#define TIM_DMA_Update ((uint16_t)0x0100) +#define TIM_DMA_CC1 ((uint16_t)0x0200) +#define TIM_DMA_CC2 ((uint16_t)0x0400) +#define TIM_DMA_CC3 ((uint16_t)0x0800) +#define TIM_DMA_CC4 ((uint16_t)0x1000) +#define TIM_DMA_COM ((uint16_t)0x2000) +#define TIM_DMA_Trigger ((uint16_t)0x4000) +#define IS_TIM_DMA_SOURCE(SOURCE) ((((SOURCE) & (uint16_t)0x80FF) == 0x0000) && ((SOURCE) != 0x0000)) + +/** + * @} + */ + +/** @defgroup TIM_External_Trigger_Prescaler + * @{ + */ + +#define TIM_ExtTRGPSC_OFF ((uint16_t)0x0000) +#define TIM_ExtTRGPSC_DIV2 ((uint16_t)0x1000) +#define TIM_ExtTRGPSC_DIV4 ((uint16_t)0x2000) +#define TIM_ExtTRGPSC_DIV8 ((uint16_t)0x3000) +#define IS_TIM_EXT_PRESCALER(PRESCALER) (((PRESCALER) == TIM_ExtTRGPSC_OFF) || \ + ((PRESCALER) == TIM_ExtTRGPSC_DIV2) || \ + ((PRESCALER) == TIM_ExtTRGPSC_DIV4) || \ + ((PRESCALER) == TIM_ExtTRGPSC_DIV8)) +/** + * @} + */ + +/** @defgroup TIM_Internal_Trigger_Selection + * @{ + */ + +#define TIM_TS_ITR0 ((uint16_t)0x0000) +#define TIM_TS_ITR1 ((uint16_t)0x0010) +#define TIM_TS_ITR2 ((uint16_t)0x0020) +#define TIM_TS_ITR3 ((uint16_t)0x0030) +#define TIM_TS_TI1F_ED ((uint16_t)0x0040) +#define TIM_TS_TI1FP1 ((uint16_t)0x0050) +#define TIM_TS_TI2FP2 ((uint16_t)0x0060) +#define TIM_TS_ETRF ((uint16_t)0x0070) +#define IS_TIM_TRIGGER_SELECTION(SELECTION) (((SELECTION) == TIM_TS_ITR0) || \ + ((SELECTION) == TIM_TS_ITR1) || \ + ((SELECTION) == TIM_TS_ITR2) || \ + ((SELECTION) == TIM_TS_ITR3) || \ + ((SELECTION) == TIM_TS_TI1F_ED) || \ + ((SELECTION) == TIM_TS_TI1FP1) || \ + ((SELECTION) == TIM_TS_TI2FP2) || \ + ((SELECTION) == TIM_TS_ETRF)) +#define IS_TIM_INTERNAL_TRIGGER_SELECTION(SELECTION) (((SELECTION) == TIM_TS_ITR0) || \ + ((SELECTION) == TIM_TS_ITR1) || \ + ((SELECTION) == TIM_TS_ITR2) || \ + ((SELECTION) == TIM_TS_ITR3)) +/** + * @} + */ + +/** @defgroup TIM_TIx_External_Clock_Source + * @{ + */ + +#define TIM_TIxExternalCLK1Source_TI1 ((uint16_t)0x0050) +#define TIM_TIxExternalCLK1Source_TI2 ((uint16_t)0x0060) +#define TIM_TIxExternalCLK1Source_TI1ED ((uint16_t)0x0040) +#define IS_TIM_TIXCLK_SOURCE(SOURCE) (((SOURCE) == TIM_TIxExternalCLK1Source_TI1) || \ + ((SOURCE) == TIM_TIxExternalCLK1Source_TI2) || \ + ((SOURCE) == TIM_TIxExternalCLK1Source_TI1ED)) +/** + * @} + */ + +/** @defgroup TIM_External_Trigger_Polarity + * @{ + */ +#define TIM_ExtTRGPolarity_Inverted ((uint16_t)0x8000) +#define TIM_ExtTRGPolarity_NonInverted ((uint16_t)0x0000) +#define IS_TIM_EXT_POLARITY(POLARITY) (((POLARITY) == TIM_ExtTRGPolarity_Inverted) || \ + ((POLARITY) == TIM_ExtTRGPolarity_NonInverted)) +/** + * @} + */ + +/** @defgroup TIM_Prescaler_Reload_Mode + * @{ + */ + +#define TIM_PSCReloadMode_Update ((uint16_t)0x0000) +#define TIM_PSCReloadMode_Immediate ((uint16_t)0x0001) +#define IS_TIM_PRESCALER_RELOAD(RELOAD) (((RELOAD) == TIM_PSCReloadMode_Update) || \ + ((RELOAD) == TIM_PSCReloadMode_Immediate)) +/** + * @} + */ + +/** @defgroup TIM_Forced_Action + * @{ + */ + +#define TIM_ForcedAction_Active ((uint16_t)0x0050) +#define TIM_ForcedAction_InActive ((uint16_t)0x0040) +#define IS_TIM_FORCED_ACTION(ACTION) (((ACTION) == TIM_ForcedAction_Active) || \ + ((ACTION) == TIM_ForcedAction_InActive)) +/** + * @} + */ + +/** @defgroup TIM_Encoder_Mode + * @{ + */ + +#define TIM_EncoderMode_TI1 ((uint16_t)0x0001) +#define TIM_EncoderMode_TI2 ((uint16_t)0x0002) +#define TIM_EncoderMode_TI12 ((uint16_t)0x0003) +#define IS_TIM_ENCODER_MODE(MODE) (((MODE) == TIM_EncoderMode_TI1) || \ + ((MODE) == TIM_EncoderMode_TI2) || \ + ((MODE) == TIM_EncoderMode_TI12)) +/** + * @} + */ + + +/** @defgroup TIM_Event_Source + * @{ + */ + +#define TIM_EventSource_Update ((uint16_t)0x0001) +#define TIM_EventSource_CC1 ((uint16_t)0x0002) +#define TIM_EventSource_CC2 ((uint16_t)0x0004) +#define TIM_EventSource_CC3 ((uint16_t)0x0008) +#define TIM_EventSource_CC4 ((uint16_t)0x0010) +#define TIM_EventSource_COM ((uint16_t)0x0020) +#define TIM_EventSource_Trigger ((uint16_t)0x0040) +#define TIM_EventSource_Break ((uint16_t)0x0080) +#define IS_TIM_EVENT_SOURCE(SOURCE) ((((SOURCE) & (uint16_t)0xFF00) == 0x0000) && ((SOURCE) != 0x0000)) + +/** + * @} + */ + +/** @defgroup TIM_Update_Source + * @{ + */ + +#define TIM_UpdateSource_Global ((uint16_t)0x0000) /*!< Source of update is the counter overflow/underflow + or the setting of UG bit, or an update generation + through the slave mode controller. */ +#define TIM_UpdateSource_Regular ((uint16_t)0x0001) /*!< Source of update is counter overflow/underflow. */ +#define IS_TIM_UPDATE_SOURCE(SOURCE) (((SOURCE) == TIM_UpdateSource_Global) || \ + ((SOURCE) == TIM_UpdateSource_Regular)) +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_Preload_State + * @{ + */ + +#define TIM_OCPreload_Enable ((uint16_t)0x0008) +#define TIM_OCPreload_Disable ((uint16_t)0x0000) +#define IS_TIM_OCPRELOAD_STATE(STATE) (((STATE) == TIM_OCPreload_Enable) || \ + ((STATE) == TIM_OCPreload_Disable)) +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_Fast_State + * @{ + */ + +#define TIM_OCFast_Enable ((uint16_t)0x0004) +#define TIM_OCFast_Disable ((uint16_t)0x0000) +#define IS_TIM_OCFAST_STATE(STATE) (((STATE) == TIM_OCFast_Enable) || \ + ((STATE) == TIM_OCFast_Disable)) + +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_Clear_State + * @{ + */ + +#define TIM_OCClear_Enable ((uint16_t)0x0080) +#define TIM_OCClear_Disable ((uint16_t)0x0000) +#define IS_TIM_OCCLEAR_STATE(STATE) (((STATE) == TIM_OCClear_Enable) || \ + ((STATE) == TIM_OCClear_Disable)) +/** + * @} + */ + +/** @defgroup TIM_Trigger_Output_Source + * @{ + */ + +#define TIM_TRGOSource_Reset ((uint16_t)0x0000) +#define TIM_TRGOSource_Enable ((uint16_t)0x0010) +#define TIM_TRGOSource_Update ((uint16_t)0x0020) +#define TIM_TRGOSource_OC1 ((uint16_t)0x0030) +#define TIM_TRGOSource_OC1Ref ((uint16_t)0x0040) +#define TIM_TRGOSource_OC2Ref ((uint16_t)0x0050) +#define TIM_TRGOSource_OC3Ref ((uint16_t)0x0060) +#define TIM_TRGOSource_OC4Ref ((uint16_t)0x0070) +#define IS_TIM_TRGO_SOURCE(SOURCE) (((SOURCE) == TIM_TRGOSource_Reset) || \ + ((SOURCE) == TIM_TRGOSource_Enable) || \ + ((SOURCE) == TIM_TRGOSource_Update) || \ + ((SOURCE) == TIM_TRGOSource_OC1) || \ + ((SOURCE) == TIM_TRGOSource_OC1Ref) || \ + ((SOURCE) == TIM_TRGOSource_OC2Ref) || \ + ((SOURCE) == TIM_TRGOSource_OC3Ref) || \ + ((SOURCE) == TIM_TRGOSource_OC4Ref)) +/** + * @} + */ + +/** @defgroup TIM_Slave_Mode + * @{ + */ + +#define TIM_SlaveMode_Reset ((uint16_t)0x0004) +#define TIM_SlaveMode_Gated ((uint16_t)0x0005) +#define TIM_SlaveMode_Trigger ((uint16_t)0x0006) +#define TIM_SlaveMode_External1 ((uint16_t)0x0007) +#define IS_TIM_SLAVE_MODE(MODE) (((MODE) == TIM_SlaveMode_Reset) || \ + ((MODE) == TIM_SlaveMode_Gated) || \ + ((MODE) == TIM_SlaveMode_Trigger) || \ + ((MODE) == TIM_SlaveMode_External1)) +/** + * @} + */ + +/** @defgroup TIM_Master_Slave_Mode + * @{ + */ + +#define TIM_MasterSlaveMode_Enable ((uint16_t)0x0080) +#define TIM_MasterSlaveMode_Disable ((uint16_t)0x0000) +#define IS_TIM_MSM_STATE(STATE) (((STATE) == TIM_MasterSlaveMode_Enable) || \ + ((STATE) == TIM_MasterSlaveMode_Disable)) +/** + * @} + */ + +/** @defgroup TIM_Flags + * @{ + */ + +#define TIM_FLAG_Update ((uint16_t)0x0001) +#define TIM_FLAG_CC1 ((uint16_t)0x0002) +#define TIM_FLAG_CC2 ((uint16_t)0x0004) +#define TIM_FLAG_CC3 ((uint16_t)0x0008) +#define TIM_FLAG_CC4 ((uint16_t)0x0010) +#define TIM_FLAG_COM ((uint16_t)0x0020) +#define TIM_FLAG_Trigger ((uint16_t)0x0040) +#define TIM_FLAG_Break ((uint16_t)0x0080) +#define TIM_FLAG_CC1OF ((uint16_t)0x0200) +#define TIM_FLAG_CC2OF ((uint16_t)0x0400) +#define TIM_FLAG_CC3OF ((uint16_t)0x0800) +#define TIM_FLAG_CC4OF ((uint16_t)0x1000) +#define IS_TIM_GET_FLAG(FLAG) (((FLAG) == TIM_FLAG_Update) || \ + ((FLAG) == TIM_FLAG_CC1) || \ + ((FLAG) == TIM_FLAG_CC2) || \ + ((FLAG) == TIM_FLAG_CC3) || \ + ((FLAG) == TIM_FLAG_CC4) || \ + ((FLAG) == TIM_FLAG_COM) || \ + ((FLAG) == TIM_FLAG_Trigger) || \ + ((FLAG) == TIM_FLAG_Break) || \ + ((FLAG) == TIM_FLAG_CC1OF) || \ + ((FLAG) == TIM_FLAG_CC2OF) || \ + ((FLAG) == TIM_FLAG_CC3OF) || \ + ((FLAG) == TIM_FLAG_CC4OF)) + + +#define IS_TIM_CLEAR_FLAG(TIM_FLAG) ((((TIM_FLAG) & (uint16_t)0xE100) == 0x0000) && ((TIM_FLAG) != 0x0000)) +/** + * @} + */ + +/** @defgroup TIM_Input_Capture_Filer_Value + * @{ + */ + +#define IS_TIM_IC_FILTER(ICFILTER) ((ICFILTER) <= 0xF) +/** + * @} + */ + +/** @defgroup TIM_External_Trigger_Filter + * @{ + */ + +#define IS_TIM_EXT_FILTER(EXTFILTER) ((EXTFILTER) <= 0xF) +/** + * @} + */ + +/** @defgroup TIM_Legacy + * @{ + */ + +#define TIM_DMABurstLength_1Byte TIM_DMABurstLength_1Transfer +#define TIM_DMABurstLength_2Bytes TIM_DMABurstLength_2Transfers +#define TIM_DMABurstLength_3Bytes TIM_DMABurstLength_3Transfers +#define TIM_DMABurstLength_4Bytes TIM_DMABurstLength_4Transfers +#define TIM_DMABurstLength_5Bytes TIM_DMABurstLength_5Transfers +#define TIM_DMABurstLength_6Bytes TIM_DMABurstLength_6Transfers +#define TIM_DMABurstLength_7Bytes TIM_DMABurstLength_7Transfers +#define TIM_DMABurstLength_8Bytes TIM_DMABurstLength_8Transfers +#define TIM_DMABurstLength_9Bytes TIM_DMABurstLength_9Transfers +#define TIM_DMABurstLength_10Bytes TIM_DMABurstLength_10Transfers +#define TIM_DMABurstLength_11Bytes TIM_DMABurstLength_11Transfers +#define TIM_DMABurstLength_12Bytes TIM_DMABurstLength_12Transfers +#define TIM_DMABurstLength_13Bytes TIM_DMABurstLength_13Transfers +#define TIM_DMABurstLength_14Bytes TIM_DMABurstLength_14Transfers +#define TIM_DMABurstLength_15Bytes TIM_DMABurstLength_15Transfers +#define TIM_DMABurstLength_16Bytes TIM_DMABurstLength_16Transfers +#define TIM_DMABurstLength_17Bytes TIM_DMABurstLength_17Transfers +#define TIM_DMABurstLength_18Bytes TIM_DMABurstLength_18Transfers +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup TIM_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions + * @{ + */ + +void TIM_DeInit(TIM_TypeDef* TIMx); +void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct); +void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct); +void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct); +void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct); +void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct); +void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct); +void TIM_PWMIConfig(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct); +void TIM_BDTRConfig(TIM_TypeDef* TIMx, TIM_BDTRInitTypeDef *TIM_BDTRInitStruct); +void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct); +void TIM_OCStructInit(TIM_OCInitTypeDef* TIM_OCInitStruct); +void TIM_ICStructInit(TIM_ICInitTypeDef* TIM_ICInitStruct); +void TIM_BDTRStructInit(TIM_BDTRInitTypeDef* TIM_BDTRInitStruct); +void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState); +void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState); +void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState); +void TIM_GenerateEvent(TIM_TypeDef* TIMx, uint16_t TIM_EventSource); +void TIM_DMAConfig(TIM_TypeDef* TIMx, uint16_t TIM_DMABase, uint16_t TIM_DMABurstLength); +void TIM_DMACmd(TIM_TypeDef* TIMx, uint16_t TIM_DMASource, FunctionalState NewState); +void TIM_InternalClockConfig(TIM_TypeDef* TIMx); +void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource); +void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource, + uint16_t TIM_ICPolarity, uint16_t ICFilter); +void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, + uint16_t ExtTRGFilter); +void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, + uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter); +void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, + uint16_t ExtTRGFilter); +void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode); +void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode); +void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource); +void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode, + uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity); +void TIM_ForcedOC1Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction); +void TIM_ForcedOC2Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction); +void TIM_ForcedOC3Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction); +void TIM_ForcedOC4Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction); +void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState); +void TIM_SelectCOM(TIM_TypeDef* TIMx, FunctionalState NewState); +void TIM_SelectCCDMA(TIM_TypeDef* TIMx, FunctionalState NewState); +void TIM_CCPreloadControl(TIM_TypeDef* TIMx, FunctionalState NewState); +void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); +void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); +void TIM_OC3PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); +void TIM_OC4PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); +void TIM_OC1FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast); +void TIM_OC2FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast); +void TIM_OC3FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast); +void TIM_OC4FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast); +void TIM_ClearOC1Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear); +void TIM_ClearOC2Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear); +void TIM_ClearOC3Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear); +void TIM_ClearOC4Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear); +void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity); +void TIM_OC1NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity); +void TIM_OC2PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity); +void TIM_OC2NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity); +void TIM_OC3PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity); +void TIM_OC3NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity); +void TIM_OC4PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity); +void TIM_CCxCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCx); +void TIM_CCxNCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCxN); +void TIM_SelectOCxM(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode); +void TIM_UpdateDisableConfig(TIM_TypeDef* TIMx, FunctionalState NewState); +void TIM_UpdateRequestConfig(TIM_TypeDef* TIMx, uint16_t TIM_UpdateSource); +void TIM_SelectHallSensor(TIM_TypeDef* TIMx, FunctionalState NewState); +void TIM_SelectOnePulseMode(TIM_TypeDef* TIMx, uint16_t TIM_OPMode); +void TIM_SelectOutputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_TRGOSource); +void TIM_SelectSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_SlaveMode); +void TIM_SelectMasterSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_MasterSlaveMode); +void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter); +void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint16_t Autoreload); +void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1); +void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2); +void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3); +void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4); +void TIM_SetIC1Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC); +void TIM_SetIC2Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC); +void TIM_SetIC3Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC); +void TIM_SetIC4Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC); +void TIM_SetClockDivision(TIM_TypeDef* TIMx, uint16_t TIM_CKD); +uint16_t TIM_GetCapture1(TIM_TypeDef* TIMx); +uint16_t TIM_GetCapture2(TIM_TypeDef* TIMx); +uint16_t TIM_GetCapture3(TIM_TypeDef* TIMx); +uint16_t TIM_GetCapture4(TIM_TypeDef* TIMx); +uint16_t TIM_GetCounter(TIM_TypeDef* TIMx); +uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx); +FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG); +void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG); +ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT); +void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT); + +#ifdef __cplusplus +} +#endif + +#endif /*__STM32F10x_TIM_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_usart.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_usart.h new file mode 100644 index 0000000..61ae249 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_usart.h @@ -0,0 +1,412 @@ +/** + ****************************************************************************** + * @file stm32f10x_usart.h + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief This file contains all the functions prototypes for the USART + * firmware library. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_USART_H +#define __STM32F10x_USART_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup USART + * @{ + */ + +/** @defgroup USART_Exported_Types + * @{ + */ + +/** + * @brief USART Init Structure definition + */ + +typedef struct +{ + uint32_t USART_BaudRate; /*!< This member configures the USART communication baud rate. + The baud rate is computed using the following formula: + - IntegerDivider = ((PCLKx) / (16 * (USART_InitStruct->USART_BaudRate))) + - FractionalDivider = ((IntegerDivider - ((u32) IntegerDivider)) * 16) + 0.5 */ + + uint16_t USART_WordLength; /*!< Specifies the number of data bits transmitted or received in a frame. + This parameter can be a value of @ref USART_Word_Length */ + + uint16_t USART_StopBits; /*!< Specifies the number of stop bits transmitted. + This parameter can be a value of @ref USART_Stop_Bits */ + + uint16_t USART_Parity; /*!< Specifies the parity mode. + This parameter can be a value of @ref USART_Parity + @note When parity is enabled, the computed parity is inserted + at the MSB position of the transmitted data (9th bit when + the word length is set to 9 data bits; 8th bit when the + word length is set to 8 data bits). */ + + uint16_t USART_Mode; /*!< Specifies wether the Receive or Transmit mode is enabled or disabled. + This parameter can be a value of @ref USART_Mode */ + + uint16_t USART_HardwareFlowControl; /*!< Specifies wether the hardware flow control mode is enabled + or disabled. + This parameter can be a value of @ref USART_Hardware_Flow_Control */ +} USART_InitTypeDef; + +/** + * @brief USART Clock Init Structure definition + */ + +typedef struct +{ + + uint16_t USART_Clock; /*!< Specifies whether the USART clock is enabled or disabled. + This parameter can be a value of @ref USART_Clock */ + + uint16_t USART_CPOL; /*!< Specifies the steady state value of the serial clock. + This parameter can be a value of @ref USART_Clock_Polarity */ + + uint16_t USART_CPHA; /*!< Specifies the clock transition on which the bit capture is made. + This parameter can be a value of @ref USART_Clock_Phase */ + + uint16_t USART_LastBit; /*!< Specifies whether the clock pulse corresponding to the last transmitted + data bit (MSB) has to be output on the SCLK pin in synchronous mode. + This parameter can be a value of @ref USART_Last_Bit */ +} USART_ClockInitTypeDef; + +/** + * @} + */ + +/** @defgroup USART_Exported_Constants + * @{ + */ + +#define IS_USART_ALL_PERIPH(PERIPH) (((PERIPH) == USART1) || \ + ((PERIPH) == USART2) || \ + ((PERIPH) == USART3) || \ + ((PERIPH) == UART4) || \ + ((PERIPH) == UART5)) + +#define IS_USART_123_PERIPH(PERIPH) (((PERIPH) == USART1) || \ + ((PERIPH) == USART2) || \ + ((PERIPH) == USART3)) + +#define IS_USART_1234_PERIPH(PERIPH) (((PERIPH) == USART1) || \ + ((PERIPH) == USART2) || \ + ((PERIPH) == USART3) || \ + ((PERIPH) == UART4)) +/** @defgroup USART_Word_Length + * @{ + */ + +#define USART_WordLength_8b ((uint16_t)0x0000) +#define USART_WordLength_9b ((uint16_t)0x1000) + +#define IS_USART_WORD_LENGTH(LENGTH) (((LENGTH) == USART_WordLength_8b) || \ + ((LENGTH) == USART_WordLength_9b)) +/** + * @} + */ + +/** @defgroup USART_Stop_Bits + * @{ + */ + +#define USART_StopBits_1 ((uint16_t)0x0000) +#define USART_StopBits_0_5 ((uint16_t)0x1000) +#define USART_StopBits_2 ((uint16_t)0x2000) +#define USART_StopBits_1_5 ((uint16_t)0x3000) +#define IS_USART_STOPBITS(STOPBITS) (((STOPBITS) == USART_StopBits_1) || \ + ((STOPBITS) == USART_StopBits_0_5) || \ + ((STOPBITS) == USART_StopBits_2) || \ + ((STOPBITS) == USART_StopBits_1_5)) +/** + * @} + */ + +/** @defgroup USART_Parity + * @{ + */ + +#define USART_Parity_No ((uint16_t)0x0000) +#define USART_Parity_Even ((uint16_t)0x0400) +#define USART_Parity_Odd ((uint16_t)0x0600) +#define IS_USART_PARITY(PARITY) (((PARITY) == USART_Parity_No) || \ + ((PARITY) == USART_Parity_Even) || \ + ((PARITY) == USART_Parity_Odd)) +/** + * @} + */ + +/** @defgroup USART_Mode + * @{ + */ + +#define USART_Mode_Rx ((uint16_t)0x0004) +#define USART_Mode_Tx ((uint16_t)0x0008) +#define IS_USART_MODE(MODE) ((((MODE) & (uint16_t)0xFFF3) == 0x00) && ((MODE) != (uint16_t)0x00)) +/** + * @} + */ + +/** @defgroup USART_Hardware_Flow_Control + * @{ + */ +#define USART_HardwareFlowControl_None ((uint16_t)0x0000) +#define USART_HardwareFlowControl_RTS ((uint16_t)0x0100) +#define USART_HardwareFlowControl_CTS ((uint16_t)0x0200) +#define USART_HardwareFlowControl_RTS_CTS ((uint16_t)0x0300) +#define IS_USART_HARDWARE_FLOW_CONTROL(CONTROL)\ + (((CONTROL) == USART_HardwareFlowControl_None) || \ + ((CONTROL) == USART_HardwareFlowControl_RTS) || \ + ((CONTROL) == USART_HardwareFlowControl_CTS) || \ + ((CONTROL) == USART_HardwareFlowControl_RTS_CTS)) +/** + * @} + */ + +/** @defgroup USART_Clock + * @{ + */ +#define USART_Clock_Disable ((uint16_t)0x0000) +#define USART_Clock_Enable ((uint16_t)0x0800) +#define IS_USART_CLOCK(CLOCK) (((CLOCK) == USART_Clock_Disable) || \ + ((CLOCK) == USART_Clock_Enable)) +/** + * @} + */ + +/** @defgroup USART_Clock_Polarity + * @{ + */ + +#define USART_CPOL_Low ((uint16_t)0x0000) +#define USART_CPOL_High ((uint16_t)0x0400) +#define IS_USART_CPOL(CPOL) (((CPOL) == USART_CPOL_Low) || ((CPOL) == USART_CPOL_High)) + +/** + * @} + */ + +/** @defgroup USART_Clock_Phase + * @{ + */ + +#define USART_CPHA_1Edge ((uint16_t)0x0000) +#define USART_CPHA_2Edge ((uint16_t)0x0200) +#define IS_USART_CPHA(CPHA) (((CPHA) == USART_CPHA_1Edge) || ((CPHA) == USART_CPHA_2Edge)) + +/** + * @} + */ + +/** @defgroup USART_Last_Bit + * @{ + */ + +#define USART_LastBit_Disable ((uint16_t)0x0000) +#define USART_LastBit_Enable ((uint16_t)0x0100) +#define IS_USART_LASTBIT(LASTBIT) (((LASTBIT) == USART_LastBit_Disable) || \ + ((LASTBIT) == USART_LastBit_Enable)) +/** + * @} + */ + +/** @defgroup USART_Interrupt_definition + * @{ + */ + +#define USART_IT_PE ((uint16_t)0x0028) +#define USART_IT_TXE ((uint16_t)0x0727) +#define USART_IT_TC ((uint16_t)0x0626) +#define USART_IT_RXNE ((uint16_t)0x0525) +#define USART_IT_IDLE ((uint16_t)0x0424) +#define USART_IT_LBD ((uint16_t)0x0846) +#define USART_IT_CTS ((uint16_t)0x096A) +#define USART_IT_ERR ((uint16_t)0x0060) +#define USART_IT_ORE ((uint16_t)0x0360) +#define USART_IT_NE ((uint16_t)0x0260) +#define USART_IT_FE ((uint16_t)0x0160) +#define IS_USART_CONFIG_IT(IT) (((IT) == USART_IT_PE) || ((IT) == USART_IT_TXE) || \ + ((IT) == USART_IT_TC) || ((IT) == USART_IT_RXNE) || \ + ((IT) == USART_IT_IDLE) || ((IT) == USART_IT_LBD) || \ + ((IT) == USART_IT_CTS) || ((IT) == USART_IT_ERR)) +#define IS_USART_GET_IT(IT) (((IT) == USART_IT_PE) || ((IT) == USART_IT_TXE) || \ + ((IT) == USART_IT_TC) || ((IT) == USART_IT_RXNE) || \ + ((IT) == USART_IT_IDLE) || ((IT) == USART_IT_LBD) || \ + ((IT) == USART_IT_CTS) || ((IT) == USART_IT_ORE) || \ + ((IT) == USART_IT_NE) || ((IT) == USART_IT_FE)) +#define IS_USART_CLEAR_IT(IT) (((IT) == USART_IT_TC) || ((IT) == USART_IT_RXNE) || \ + ((IT) == USART_IT_LBD) || ((IT) == USART_IT_CTS)) +/** + * @} + */ + +/** @defgroup USART_DMA_Requests + * @{ + */ + +#define USART_DMAReq_Tx ((uint16_t)0x0080) +#define USART_DMAReq_Rx ((uint16_t)0x0040) +#define IS_USART_DMAREQ(DMAREQ) ((((DMAREQ) & (uint16_t)0xFF3F) == 0x00) && ((DMAREQ) != (uint16_t)0x00)) + +/** + * @} + */ + +/** @defgroup USART_WakeUp_methods + * @{ + */ + +#define USART_WakeUp_IdleLine ((uint16_t)0x0000) +#define USART_WakeUp_AddressMark ((uint16_t)0x0800) +#define IS_USART_WAKEUP(WAKEUP) (((WAKEUP) == USART_WakeUp_IdleLine) || \ + ((WAKEUP) == USART_WakeUp_AddressMark)) +/** + * @} + */ + +/** @defgroup USART_LIN_Break_Detection_Length + * @{ + */ + +#define USART_LINBreakDetectLength_10b ((uint16_t)0x0000) +#define USART_LINBreakDetectLength_11b ((uint16_t)0x0020) +#define IS_USART_LIN_BREAK_DETECT_LENGTH(LENGTH) \ + (((LENGTH) == USART_LINBreakDetectLength_10b) || \ + ((LENGTH) == USART_LINBreakDetectLength_11b)) +/** + * @} + */ + +/** @defgroup USART_IrDA_Low_Power + * @{ + */ + +#define USART_IrDAMode_LowPower ((uint16_t)0x0004) +#define USART_IrDAMode_Normal ((uint16_t)0x0000) +#define IS_USART_IRDA_MODE(MODE) (((MODE) == USART_IrDAMode_LowPower) || \ + ((MODE) == USART_IrDAMode_Normal)) +/** + * @} + */ + +/** @defgroup USART_Flags + * @{ + */ + +#define USART_FLAG_CTS ((uint16_t)0x0200) +#define USART_FLAG_LBD ((uint16_t)0x0100) +#define USART_FLAG_TXE ((uint16_t)0x0080) +#define USART_FLAG_TC ((uint16_t)0x0040) +#define USART_FLAG_RXNE ((uint16_t)0x0020) +#define USART_FLAG_IDLE ((uint16_t)0x0010) +#define USART_FLAG_ORE ((uint16_t)0x0008) +#define USART_FLAG_NE ((uint16_t)0x0004) +#define USART_FLAG_FE ((uint16_t)0x0002) +#define USART_FLAG_PE ((uint16_t)0x0001) +#define IS_USART_FLAG(FLAG) (((FLAG) == USART_FLAG_PE) || ((FLAG) == USART_FLAG_TXE) || \ + ((FLAG) == USART_FLAG_TC) || ((FLAG) == USART_FLAG_RXNE) || \ + ((FLAG) == USART_FLAG_IDLE) || ((FLAG) == USART_FLAG_LBD) || \ + ((FLAG) == USART_FLAG_CTS) || ((FLAG) == USART_FLAG_ORE) || \ + ((FLAG) == USART_FLAG_NE) || ((FLAG) == USART_FLAG_FE)) + +#define IS_USART_CLEAR_FLAG(FLAG) ((((FLAG) & (uint16_t)0xFC9F) == 0x00) && ((FLAG) != (uint16_t)0x00)) +#define IS_USART_PERIPH_FLAG(PERIPH, USART_FLAG) ((((*(uint32_t*)&(PERIPH)) != UART4_BASE) &&\ + ((*(uint32_t*)&(PERIPH)) != UART5_BASE)) \ + || ((USART_FLAG) != USART_FLAG_CTS)) +#define IS_USART_BAUDRATE(BAUDRATE) (((BAUDRATE) > 0) && ((BAUDRATE) < 0x0044AA21)) +#define IS_USART_ADDRESS(ADDRESS) ((ADDRESS) <= 0xF) +#define IS_USART_DATA(DATA) ((DATA) <= 0x1FF) + +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup USART_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup USART_Exported_Functions + * @{ + */ + +void USART_DeInit(USART_TypeDef* USARTx); +void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct); +void USART_StructInit(USART_InitTypeDef* USART_InitStruct); +void USART_ClockInit(USART_TypeDef* USARTx, USART_ClockInitTypeDef* USART_ClockInitStruct); +void USART_ClockStructInit(USART_ClockInitTypeDef* USART_ClockInitStruct); +void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState); +void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState); +void USART_DMACmd(USART_TypeDef* USARTx, uint16_t USART_DMAReq, FunctionalState NewState); +void USART_SetAddress(USART_TypeDef* USARTx, uint8_t USART_Address); +void USART_WakeUpConfig(USART_TypeDef* USARTx, uint16_t USART_WakeUp); +void USART_ReceiverWakeUpCmd(USART_TypeDef* USARTx, FunctionalState NewState); +void USART_LINBreakDetectLengthConfig(USART_TypeDef* USARTx, uint16_t USART_LINBreakDetectLength); +void USART_LINCmd(USART_TypeDef* USARTx, FunctionalState NewState); +void USART_SendData(USART_TypeDef* USARTx, uint16_t Data); +uint16_t USART_ReceiveData(USART_TypeDef* USARTx); +void USART_SendBreak(USART_TypeDef* USARTx); +void USART_SetGuardTime(USART_TypeDef* USARTx, uint8_t USART_GuardTime); +void USART_SetPrescaler(USART_TypeDef* USARTx, uint8_t USART_Prescaler); +void USART_SmartCardCmd(USART_TypeDef* USARTx, FunctionalState NewState); +void USART_SmartCardNACKCmd(USART_TypeDef* USARTx, FunctionalState NewState); +void USART_HalfDuplexCmd(USART_TypeDef* USARTx, FunctionalState NewState); +void USART_OverSampling8Cmd(USART_TypeDef* USARTx, FunctionalState NewState); +void USART_OneBitMethodCmd(USART_TypeDef* USARTx, FunctionalState NewState); +void USART_IrDAConfig(USART_TypeDef* USARTx, uint16_t USART_IrDAMode); +void USART_IrDACmd(USART_TypeDef* USARTx, FunctionalState NewState); +FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG); +void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG); +ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT); +void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F10x_USART_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_wwdg.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_wwdg.h new file mode 100644 index 0000000..cd573da --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_wwdg.h @@ -0,0 +1,115 @@ +/** + ****************************************************************************** + * @file stm32f10x_wwdg.h + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief This file contains all the functions prototypes for the WWDG firmware + * library. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_WWDG_H +#define __STM32F10x_WWDG_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup WWDG + * @{ + */ + +/** @defgroup WWDG_Exported_Types + * @{ + */ + +/** + * @} + */ + +/** @defgroup WWDG_Exported_Constants + * @{ + */ + +/** @defgroup WWDG_Prescaler + * @{ + */ + +#define WWDG_Prescaler_1 ((uint32_t)0x00000000) +#define WWDG_Prescaler_2 ((uint32_t)0x00000080) +#define WWDG_Prescaler_4 ((uint32_t)0x00000100) +#define WWDG_Prescaler_8 ((uint32_t)0x00000180) +#define IS_WWDG_PRESCALER(PRESCALER) (((PRESCALER) == WWDG_Prescaler_1) || \ + ((PRESCALER) == WWDG_Prescaler_2) || \ + ((PRESCALER) == WWDG_Prescaler_4) || \ + ((PRESCALER) == WWDG_Prescaler_8)) +#define IS_WWDG_WINDOW_VALUE(VALUE) ((VALUE) <= 0x7F) +#define IS_WWDG_COUNTER(COUNTER) (((COUNTER) >= 0x40) && ((COUNTER) <= 0x7F)) + +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup WWDG_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup WWDG_Exported_Functions + * @{ + */ + +void WWDG_DeInit(void); +void WWDG_SetPrescaler(uint32_t WWDG_Prescaler); +void WWDG_SetWindowValue(uint8_t WindowValue); +void WWDG_EnableIT(void); +void WWDG_SetCounter(uint8_t Counter); +void WWDG_Enable(uint8_t Counter); +FlagStatus WWDG_GetFlagStatus(void); +void WWDG_ClearFlag(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F10x_WWDG_H */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/misc.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/misc.c new file mode 100644 index 0000000..ec9165f --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/misc.c @@ -0,0 +1,225 @@ +/** + ****************************************************************************** + * @file misc.c + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief This file provides all the miscellaneous firmware functions (add-on + * to CMSIS functions). + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "misc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup MISC + * @brief MISC driver modules + * @{ + */ + +/** @defgroup MISC_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup MISC_Private_Defines + * @{ + */ + +#define AIRCR_VECTKEY_MASK ((uint32_t)0x05FA0000) +/** + * @} + */ + +/** @defgroup MISC_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup MISC_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup MISC_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup MISC_Private_Functions + * @{ + */ + +/** + * @brief Configures the priority grouping: pre-emption priority and subpriority. + * @param NVIC_PriorityGroup: specifies the priority grouping bits length. + * This parameter can be one of the following values: + * @arg NVIC_PriorityGroup_0: 0 bits for pre-emption priority + * 4 bits for subpriority + * @arg NVIC_PriorityGroup_1: 1 bits for pre-emption priority + * 3 bits for subpriority + * @arg NVIC_PriorityGroup_2: 2 bits for pre-emption priority + * 2 bits for subpriority + * @arg NVIC_PriorityGroup_3: 3 bits for pre-emption priority + * 1 bits for subpriority + * @arg NVIC_PriorityGroup_4: 4 bits for pre-emption priority + * 0 bits for subpriority + * @retval None + */ +void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup) +{ + /* Check the parameters */ + assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup)); + + /* Set the PRIGROUP[10:8] bits according to NVIC_PriorityGroup value */ + SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup; +} + +/** + * @brief Initializes the NVIC peripheral according to the specified + * parameters in the NVIC_InitStruct. + * @param NVIC_InitStruct: pointer to a NVIC_InitTypeDef structure that contains + * the configuration information for the specified NVIC peripheral. + * @retval None + */ +void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct) +{ + uint32_t tmppriority = 0x00, tmppre = 0x00, tmpsub = 0x0F; + + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NVIC_InitStruct->NVIC_IRQChannelCmd)); + assert_param(IS_NVIC_PREEMPTION_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority)); + assert_param(IS_NVIC_SUB_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelSubPriority)); + + if (NVIC_InitStruct->NVIC_IRQChannelCmd != DISABLE) + { + /* Compute the Corresponding IRQ Priority --------------------------------*/ + tmppriority = (0x700 - ((SCB->AIRCR) & (uint32_t)0x700))>> 0x08; + tmppre = (0x4 - tmppriority); + tmpsub = tmpsub >> tmppriority; + + tmppriority = (uint32_t)NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority << tmppre; + tmppriority |= NVIC_InitStruct->NVIC_IRQChannelSubPriority & tmpsub; + tmppriority = tmppriority << 0x04; + + NVIC->IP[NVIC_InitStruct->NVIC_IRQChannel] = tmppriority; + + /* Enable the Selected IRQ Channels --------------------------------------*/ + NVIC->ISER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] = + (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F); + } + else + { + /* Disable the Selected IRQ Channels -------------------------------------*/ + NVIC->ICER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] = + (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F); + } +} + +/** + * @brief Sets the vector table location and Offset. + * @param NVIC_VectTab: specifies if the vector table is in RAM or FLASH memory. + * This parameter can be one of the following values: + * @arg NVIC_VectTab_RAM + * @arg NVIC_VectTab_FLASH + * @param Offset: Vector Table base offset field. This value must be a multiple + * of 0x200. + * @retval None + */ +void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset) +{ + /* Check the parameters */ + assert_param(IS_NVIC_VECTTAB(NVIC_VectTab)); + assert_param(IS_NVIC_OFFSET(Offset)); + + SCB->VTOR = NVIC_VectTab | (Offset & (uint32_t)0x1FFFFF80); +} + +/** + * @brief Selects the condition for the system to enter low power mode. + * @param LowPowerMode: Specifies the new mode for the system to enter low power mode. + * This parameter can be one of the following values: + * @arg NVIC_LP_SEVONPEND + * @arg NVIC_LP_SLEEPDEEP + * @arg NVIC_LP_SLEEPONEXIT + * @param NewState: new state of LP condition. This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void NVIC_SystemLPConfig(uint8_t LowPowerMode, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_NVIC_LP(LowPowerMode)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + SCB->SCR |= LowPowerMode; + } + else + { + SCB->SCR &= (uint32_t)(~(uint32_t)LowPowerMode); + } +} + +/** + * @brief Configures the SysTick clock source. + * @param SysTick_CLKSource: specifies the SysTick clock source. + * This parameter can be one of the following values: + * @arg SysTick_CLKSource_HCLK_Div8: AHB clock divided by 8 selected as SysTick clock source. + * @arg SysTick_CLKSource_HCLK: AHB clock selected as SysTick clock source. + * @retval None + */ +void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource) +{ + /* Check the parameters */ + assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource)); + if (SysTick_CLKSource == SysTick_CLKSource_HCLK) + { + SysTick->CTRL |= SysTick_CLKSource_HCLK; + } + else + { + SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8; + } +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_adc.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_adc.c new file mode 100644 index 0000000..916a096 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_adc.c @@ -0,0 +1,1307 @@ +/** + ****************************************************************************** + * @file stm32f10x_adc.c + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief This file provides all the ADC firmware functions. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_adc.h" +#include "stm32f10x_rcc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup ADC + * @brief ADC driver modules + * @{ + */ + +/** @defgroup ADC_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup ADC_Private_Defines + * @{ + */ + +/* ADC DISCNUM mask */ +#define CR1_DISCNUM_Reset ((uint32_t)0xFFFF1FFF) + +/* ADC DISCEN mask */ +#define CR1_DISCEN_Set ((uint32_t)0x00000800) +#define CR1_DISCEN_Reset ((uint32_t)0xFFFFF7FF) + +/* ADC JAUTO mask */ +#define CR1_JAUTO_Set ((uint32_t)0x00000400) +#define CR1_JAUTO_Reset ((uint32_t)0xFFFFFBFF) + +/* ADC JDISCEN mask */ +#define CR1_JDISCEN_Set ((uint32_t)0x00001000) +#define CR1_JDISCEN_Reset ((uint32_t)0xFFFFEFFF) + +/* ADC AWDCH mask */ +#define CR1_AWDCH_Reset ((uint32_t)0xFFFFFFE0) + +/* ADC Analog watchdog enable mode mask */ +#define CR1_AWDMode_Reset ((uint32_t)0xFF3FFDFF) + +/* CR1 register Mask */ +#define CR1_CLEAR_Mask ((uint32_t)0xFFF0FEFF) + +/* ADC ADON mask */ +#define CR2_ADON_Set ((uint32_t)0x00000001) +#define CR2_ADON_Reset ((uint32_t)0xFFFFFFFE) + +/* ADC DMA mask */ +#define CR2_DMA_Set ((uint32_t)0x00000100) +#define CR2_DMA_Reset ((uint32_t)0xFFFFFEFF) + +/* ADC RSTCAL mask */ +#define CR2_RSTCAL_Set ((uint32_t)0x00000008) + +/* ADC CAL mask */ +#define CR2_CAL_Set ((uint32_t)0x00000004) + +/* ADC SWSTART mask */ +#define CR2_SWSTART_Set ((uint32_t)0x00400000) + +/* ADC EXTTRIG mask */ +#define CR2_EXTTRIG_Set ((uint32_t)0x00100000) +#define CR2_EXTTRIG_Reset ((uint32_t)0xFFEFFFFF) + +/* ADC Software start mask */ +#define CR2_EXTTRIG_SWSTART_Set ((uint32_t)0x00500000) +#define CR2_EXTTRIG_SWSTART_Reset ((uint32_t)0xFFAFFFFF) + +/* ADC JEXTSEL mask */ +#define CR2_JEXTSEL_Reset ((uint32_t)0xFFFF8FFF) + +/* ADC JEXTTRIG mask */ +#define CR2_JEXTTRIG_Set ((uint32_t)0x00008000) +#define CR2_JEXTTRIG_Reset ((uint32_t)0xFFFF7FFF) + +/* ADC JSWSTART mask */ +#define CR2_JSWSTART_Set ((uint32_t)0x00200000) + +/* ADC injected software start mask */ +#define CR2_JEXTTRIG_JSWSTART_Set ((uint32_t)0x00208000) +#define CR2_JEXTTRIG_JSWSTART_Reset ((uint32_t)0xFFDF7FFF) + +/* ADC TSPD mask */ +#define CR2_TSVREFE_Set ((uint32_t)0x00800000) +#define CR2_TSVREFE_Reset ((uint32_t)0xFF7FFFFF) + +/* CR2 register Mask */ +#define CR2_CLEAR_Mask ((uint32_t)0xFFF1F7FD) + +/* ADC SQx mask */ +#define SQR3_SQ_Set ((uint32_t)0x0000001F) +#define SQR2_SQ_Set ((uint32_t)0x0000001F) +#define SQR1_SQ_Set ((uint32_t)0x0000001F) + +/* SQR1 register Mask */ +#define SQR1_CLEAR_Mask ((uint32_t)0xFF0FFFFF) + +/* ADC JSQx mask */ +#define JSQR_JSQ_Set ((uint32_t)0x0000001F) + +/* ADC JL mask */ +#define JSQR_JL_Set ((uint32_t)0x00300000) +#define JSQR_JL_Reset ((uint32_t)0xFFCFFFFF) + +/* ADC SMPx mask */ +#define SMPR1_SMP_Set ((uint32_t)0x00000007) +#define SMPR2_SMP_Set ((uint32_t)0x00000007) + +/* ADC JDRx registers offset */ +#define JDR_Offset ((uint8_t)0x28) + +/* ADC1 DR register base address */ +#define DR_ADDRESS ((uint32_t)0x4001244C) + +/** + * @} + */ + +/** @defgroup ADC_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup ADC_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup ADC_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup ADC_Private_Functions + * @{ + */ + +/** + * @brief Deinitializes the ADCx peripheral registers to their default reset values. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @retval None + */ +void ADC_DeInit(ADC_TypeDef* ADCx) +{ + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + + if (ADCx == ADC1) + { + /* Enable ADC1 reset state */ + RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1, ENABLE); + /* Release ADC1 from reset state */ + RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1, DISABLE); + } + else if (ADCx == ADC2) + { + /* Enable ADC2 reset state */ + RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC2, ENABLE); + /* Release ADC2 from reset state */ + RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC2, DISABLE); + } + else + { + if (ADCx == ADC3) + { + /* Enable ADC3 reset state */ + RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC3, ENABLE); + /* Release ADC3 from reset state */ + RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC3, DISABLE); + } + } +} + +/** + * @brief Initializes the ADCx peripheral according to the specified parameters + * in the ADC_InitStruct. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param ADC_InitStruct: pointer to an ADC_InitTypeDef structure that contains + * the configuration information for the specified ADC peripheral. + * @retval None + */ +void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct) +{ + uint32_t tmpreg1 = 0; + uint8_t tmpreg2 = 0; + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_MODE(ADC_InitStruct->ADC_Mode)); + assert_param(IS_FUNCTIONAL_STATE(ADC_InitStruct->ADC_ScanConvMode)); + assert_param(IS_FUNCTIONAL_STATE(ADC_InitStruct->ADC_ContinuousConvMode)); + assert_param(IS_ADC_EXT_TRIG(ADC_InitStruct->ADC_ExternalTrigConv)); + assert_param(IS_ADC_DATA_ALIGN(ADC_InitStruct->ADC_DataAlign)); + assert_param(IS_ADC_REGULAR_LENGTH(ADC_InitStruct->ADC_NbrOfChannel)); + + /*---------------------------- ADCx CR1 Configuration -----------------*/ + /* Get the ADCx CR1 value */ + tmpreg1 = ADCx->CR1; + /* Clear DUALMOD and SCAN bits */ + tmpreg1 &= CR1_CLEAR_Mask; + /* Configure ADCx: Dual mode and scan conversion mode */ + /* Set DUALMOD bits according to ADC_Mode value */ + /* Set SCAN bit according to ADC_ScanConvMode value */ + tmpreg1 |= (uint32_t)(ADC_InitStruct->ADC_Mode | ((uint32_t)ADC_InitStruct->ADC_ScanConvMode << 8)); + /* Write to ADCx CR1 */ + ADCx->CR1 = tmpreg1; + + /*---------------------------- ADCx CR2 Configuration -----------------*/ + /* Get the ADCx CR2 value */ + tmpreg1 = ADCx->CR2; + /* Clear CONT, ALIGN and EXTSEL bits */ + tmpreg1 &= CR2_CLEAR_Mask; + /* Configure ADCx: external trigger event and continuous conversion mode */ + /* Set ALIGN bit according to ADC_DataAlign value */ + /* Set EXTSEL bits according to ADC_ExternalTrigConv value */ + /* Set CONT bit according to ADC_ContinuousConvMode value */ + tmpreg1 |= (uint32_t)(ADC_InitStruct->ADC_DataAlign | ADC_InitStruct->ADC_ExternalTrigConv | + ((uint32_t)ADC_InitStruct->ADC_ContinuousConvMode << 1)); + /* Write to ADCx CR2 */ + ADCx->CR2 = tmpreg1; + + /*---------------------------- ADCx SQR1 Configuration -----------------*/ + /* Get the ADCx SQR1 value */ + tmpreg1 = ADCx->SQR1; + /* Clear L bits */ + tmpreg1 &= SQR1_CLEAR_Mask; + /* Configure ADCx: regular channel sequence length */ + /* Set L bits according to ADC_NbrOfChannel value */ + tmpreg2 |= (uint8_t) (ADC_InitStruct->ADC_NbrOfChannel - (uint8_t)1); + tmpreg1 |= (uint32_t)tmpreg2 << 20; + /* Write to ADCx SQR1 */ + ADCx->SQR1 = tmpreg1; +} + +/** + * @brief Fills each ADC_InitStruct member with its default value. + * @param ADC_InitStruct : pointer to an ADC_InitTypeDef structure which will be initialized. + * @retval None + */ +void ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct) +{ + /* Reset ADC init structure parameters values */ + /* Initialize the ADC_Mode member */ + ADC_InitStruct->ADC_Mode = ADC_Mode_Independent; + /* initialize the ADC_ScanConvMode member */ + ADC_InitStruct->ADC_ScanConvMode = DISABLE; + /* Initialize the ADC_ContinuousConvMode member */ + ADC_InitStruct->ADC_ContinuousConvMode = DISABLE; + /* Initialize the ADC_ExternalTrigConv member */ + ADC_InitStruct->ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1; + /* Initialize the ADC_DataAlign member */ + ADC_InitStruct->ADC_DataAlign = ADC_DataAlign_Right; + /* Initialize the ADC_NbrOfChannel member */ + ADC_InitStruct->ADC_NbrOfChannel = 1; +} + +/** + * @brief Enables or disables the specified ADC peripheral. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param NewState: new state of the ADCx peripheral. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Set the ADON bit to wake up the ADC from power down mode */ + ADCx->CR2 |= CR2_ADON_Set; + } + else + { + /* Disable the selected ADC peripheral */ + ADCx->CR2 &= CR2_ADON_Reset; + } +} + +/** + * @brief Enables or disables the specified ADC DMA request. + * @param ADCx: where x can be 1 or 3 to select the ADC peripheral. + * Note: ADC2 hasn't a DMA capability. + * @param NewState: new state of the selected ADC DMA transfer. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_ADC_DMA_PERIPH(ADCx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected ADC DMA request */ + ADCx->CR2 |= CR2_DMA_Set; + } + else + { + /* Disable the selected ADC DMA request */ + ADCx->CR2 &= CR2_DMA_Reset; + } +} + +/** + * @brief Enables or disables the specified ADC interrupts. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param ADC_IT: specifies the ADC interrupt sources to be enabled or disabled. + * This parameter can be any combination of the following values: + * @arg ADC_IT_EOC: End of conversion interrupt mask + * @arg ADC_IT_AWD: Analog watchdog interrupt mask + * @arg ADC_IT_JEOC: End of injected conversion interrupt mask + * @param NewState: new state of the specified ADC interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState) +{ + uint8_t itmask = 0; + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + assert_param(IS_ADC_IT(ADC_IT)); + /* Get the ADC IT index */ + itmask = (uint8_t)ADC_IT; + if (NewState != DISABLE) + { + /* Enable the selected ADC interrupts */ + ADCx->CR1 |= itmask; + } + else + { + /* Disable the selected ADC interrupts */ + ADCx->CR1 &= (~(uint32_t)itmask); + } +} + +/** + * @brief Resets the selected ADC calibration registers. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @retval None + */ +void ADC_ResetCalibration(ADC_TypeDef* ADCx) +{ + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + /* Resets the selected ADC calibration registers */ + ADCx->CR2 |= CR2_RSTCAL_Set; +} + +/** + * @brief Gets the selected ADC reset calibration registers status. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @retval The new state of ADC reset calibration registers (SET or RESET). + */ +FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + /* Check the status of RSTCAL bit */ + if ((ADCx->CR2 & CR2_RSTCAL_Set) != (uint32_t)RESET) + { + /* RSTCAL bit is set */ + bitstatus = SET; + } + else + { + /* RSTCAL bit is reset */ + bitstatus = RESET; + } + /* Return the RSTCAL bit status */ + return bitstatus; +} + +/** + * @brief Starts the selected ADC calibration process. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @retval None + */ +void ADC_StartCalibration(ADC_TypeDef* ADCx) +{ + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + /* Enable the selected ADC calibration process */ + ADCx->CR2 |= CR2_CAL_Set; +} + +/** + * @brief Gets the selected ADC calibration status. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @retval The new state of ADC calibration (SET or RESET). + */ +FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + /* Check the status of CAL bit */ + if ((ADCx->CR2 & CR2_CAL_Set) != (uint32_t)RESET) + { + /* CAL bit is set: calibration on going */ + bitstatus = SET; + } + else + { + /* CAL bit is reset: end of calibration */ + bitstatus = RESET; + } + /* Return the CAL bit status */ + return bitstatus; +} + +/** + * @brief Enables or disables the selected ADC software start conversion . + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param NewState: new state of the selected ADC software start conversion. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected ADC conversion on external event and start the selected + ADC conversion */ + ADCx->CR2 |= CR2_EXTTRIG_SWSTART_Set; + } + else + { + /* Disable the selected ADC conversion on external event and stop the selected + ADC conversion */ + ADCx->CR2 &= CR2_EXTTRIG_SWSTART_Reset; + } +} + +/** + * @brief Gets the selected ADC Software start conversion Status. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @retval The new state of ADC software start conversion (SET or RESET). + */ +FlagStatus ADC_GetSoftwareStartConvStatus(ADC_TypeDef* ADCx) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + /* Check the status of SWSTART bit */ + if ((ADCx->CR2 & CR2_SWSTART_Set) != (uint32_t)RESET) + { + /* SWSTART bit is set */ + bitstatus = SET; + } + else + { + /* SWSTART bit is reset */ + bitstatus = RESET; + } + /* Return the SWSTART bit status */ + return bitstatus; +} + +/** + * @brief Configures the discontinuous mode for the selected ADC regular + * group channel. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param Number: specifies the discontinuous mode regular channel + * count value. This number must be between 1 and 8. + * @retval None + */ +void ADC_DiscModeChannelCountConfig(ADC_TypeDef* ADCx, uint8_t Number) +{ + uint32_t tmpreg1 = 0; + uint32_t tmpreg2 = 0; + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_REGULAR_DISC_NUMBER(Number)); + /* Get the old register value */ + tmpreg1 = ADCx->CR1; + /* Clear the old discontinuous mode channel count */ + tmpreg1 &= CR1_DISCNUM_Reset; + /* Set the discontinuous mode channel count */ + tmpreg2 = Number - 1; + tmpreg1 |= tmpreg2 << 13; + /* Store the new register value */ + ADCx->CR1 = tmpreg1; +} + +/** + * @brief Enables or disables the discontinuous mode on regular group + * channel for the specified ADC + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param NewState: new state of the selected ADC discontinuous mode + * on regular group channel. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void ADC_DiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected ADC regular discontinuous mode */ + ADCx->CR1 |= CR1_DISCEN_Set; + } + else + { + /* Disable the selected ADC regular discontinuous mode */ + ADCx->CR1 &= CR1_DISCEN_Reset; + } +} + +/** + * @brief Configures for the selected ADC regular channel its corresponding + * rank in the sequencer and its sample time. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param ADC_Channel: the ADC channel to configure. + * This parameter can be one of the following values: + * @arg ADC_Channel_0: ADC Channel0 selected + * @arg ADC_Channel_1: ADC Channel1 selected + * @arg ADC_Channel_2: ADC Channel2 selected + * @arg ADC_Channel_3: ADC Channel3 selected + * @arg ADC_Channel_4: ADC Channel4 selected + * @arg ADC_Channel_5: ADC Channel5 selected + * @arg ADC_Channel_6: ADC Channel6 selected + * @arg ADC_Channel_7: ADC Channel7 selected + * @arg ADC_Channel_8: ADC Channel8 selected + * @arg ADC_Channel_9: ADC Channel9 selected + * @arg ADC_Channel_10: ADC Channel10 selected + * @arg ADC_Channel_11: ADC Channel11 selected + * @arg ADC_Channel_12: ADC Channel12 selected + * @arg ADC_Channel_13: ADC Channel13 selected + * @arg ADC_Channel_14: ADC Channel14 selected + * @arg ADC_Channel_15: ADC Channel15 selected + * @arg ADC_Channel_16: ADC Channel16 selected + * @arg ADC_Channel_17: ADC Channel17 selected + * @param Rank: The rank in the regular group sequencer. This parameter must be between 1 to 16. + * @param ADC_SampleTime: The sample time value to be set for the selected channel. + * This parameter can be one of the following values: + * @arg ADC_SampleTime_1Cycles5: Sample time equal to 1.5 cycles + * @arg ADC_SampleTime_7Cycles5: Sample time equal to 7.5 cycles + * @arg ADC_SampleTime_13Cycles5: Sample time equal to 13.5 cycles + * @arg ADC_SampleTime_28Cycles5: Sample time equal to 28.5 cycles + * @arg ADC_SampleTime_41Cycles5: Sample time equal to 41.5 cycles + * @arg ADC_SampleTime_55Cycles5: Sample time equal to 55.5 cycles + * @arg ADC_SampleTime_71Cycles5: Sample time equal to 71.5 cycles + * @arg ADC_SampleTime_239Cycles5: Sample time equal to 239.5 cycles + * @retval None + */ +void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime) +{ + uint32_t tmpreg1 = 0, tmpreg2 = 0; + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_CHANNEL(ADC_Channel)); + assert_param(IS_ADC_REGULAR_RANK(Rank)); + assert_param(IS_ADC_SAMPLE_TIME(ADC_SampleTime)); + /* if ADC_Channel_10 ... ADC_Channel_17 is selected */ + if (ADC_Channel > ADC_Channel_9) + { + /* Get the old register value */ + tmpreg1 = ADCx->SMPR1; + /* Calculate the mask to clear */ + tmpreg2 = SMPR1_SMP_Set << (3 * (ADC_Channel - 10)); + /* Clear the old channel sample time */ + tmpreg1 &= ~tmpreg2; + /* Calculate the mask to set */ + tmpreg2 = (uint32_t)ADC_SampleTime << (3 * (ADC_Channel - 10)); + /* Set the new channel sample time */ + tmpreg1 |= tmpreg2; + /* Store the new register value */ + ADCx->SMPR1 = tmpreg1; + } + else /* ADC_Channel include in ADC_Channel_[0..9] */ + { + /* Get the old register value */ + tmpreg1 = ADCx->SMPR2; + /* Calculate the mask to clear */ + tmpreg2 = SMPR2_SMP_Set << (3 * ADC_Channel); + /* Clear the old channel sample time */ + tmpreg1 &= ~tmpreg2; + /* Calculate the mask to set */ + tmpreg2 = (uint32_t)ADC_SampleTime << (3 * ADC_Channel); + /* Set the new channel sample time */ + tmpreg1 |= tmpreg2; + /* Store the new register value */ + ADCx->SMPR2 = tmpreg1; + } + /* For Rank 1 to 6 */ + if (Rank < 7) + { + /* Get the old register value */ + tmpreg1 = ADCx->SQR3; + /* Calculate the mask to clear */ + tmpreg2 = SQR3_SQ_Set << (5 * (Rank - 1)); + /* Clear the old SQx bits for the selected rank */ + tmpreg1 &= ~tmpreg2; + /* Calculate the mask to set */ + tmpreg2 = (uint32_t)ADC_Channel << (5 * (Rank - 1)); + /* Set the SQx bits for the selected rank */ + tmpreg1 |= tmpreg2; + /* Store the new register value */ + ADCx->SQR3 = tmpreg1; + } + /* For Rank 7 to 12 */ + else if (Rank < 13) + { + /* Get the old register value */ + tmpreg1 = ADCx->SQR2; + /* Calculate the mask to clear */ + tmpreg2 = SQR2_SQ_Set << (5 * (Rank - 7)); + /* Clear the old SQx bits for the selected rank */ + tmpreg1 &= ~tmpreg2; + /* Calculate the mask to set */ + tmpreg2 = (uint32_t)ADC_Channel << (5 * (Rank - 7)); + /* Set the SQx bits for the selected rank */ + tmpreg1 |= tmpreg2; + /* Store the new register value */ + ADCx->SQR2 = tmpreg1; + } + /* For Rank 13 to 16 */ + else + { + /* Get the old register value */ + tmpreg1 = ADCx->SQR1; + /* Calculate the mask to clear */ + tmpreg2 = SQR1_SQ_Set << (5 * (Rank - 13)); + /* Clear the old SQx bits for the selected rank */ + tmpreg1 &= ~tmpreg2; + /* Calculate the mask to set */ + tmpreg2 = (uint32_t)ADC_Channel << (5 * (Rank - 13)); + /* Set the SQx bits for the selected rank */ + tmpreg1 |= tmpreg2; + /* Store the new register value */ + ADCx->SQR1 = tmpreg1; + } +} + +/** + * @brief Enables or disables the ADCx conversion through external trigger. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param NewState: new state of the selected ADC external trigger start of conversion. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void ADC_ExternalTrigConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected ADC conversion on external event */ + ADCx->CR2 |= CR2_EXTTRIG_Set; + } + else + { + /* Disable the selected ADC conversion on external event */ + ADCx->CR2 &= CR2_EXTTRIG_Reset; + } +} + +/** + * @brief Returns the last ADCx conversion result data for regular channel. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @retval The Data conversion value. + */ +uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx) +{ + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + /* Return the selected ADC conversion value */ + return (uint16_t) ADCx->DR; +} + +/** + * @brief Returns the last ADC1 and ADC2 conversion result data in dual mode. + * @retval The Data conversion value. + */ +uint32_t ADC_GetDualModeConversionValue(void) +{ + /* Return the dual mode conversion value */ + return (*(__IO uint32_t *) DR_ADDRESS); +} + +/** + * @brief Enables or disables the selected ADC automatic injected group + * conversion after regular one. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param NewState: new state of the selected ADC auto injected conversion + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void ADC_AutoInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected ADC automatic injected group conversion */ + ADCx->CR1 |= CR1_JAUTO_Set; + } + else + { + /* Disable the selected ADC automatic injected group conversion */ + ADCx->CR1 &= CR1_JAUTO_Reset; + } +} + +/** + * @brief Enables or disables the discontinuous mode for injected group + * channel for the specified ADC + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param NewState: new state of the selected ADC discontinuous mode + * on injected group channel. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void ADC_InjectedDiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected ADC injected discontinuous mode */ + ADCx->CR1 |= CR1_JDISCEN_Set; + } + else + { + /* Disable the selected ADC injected discontinuous mode */ + ADCx->CR1 &= CR1_JDISCEN_Reset; + } +} + +/** + * @brief Configures the ADCx external trigger for injected channels conversion. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param ADC_ExternalTrigInjecConv: specifies the ADC trigger to start injected conversion. + * This parameter can be one of the following values: + * @arg ADC_ExternalTrigInjecConv_T1_TRGO: Timer1 TRGO event selected (for ADC1, ADC2 and ADC3) + * @arg ADC_ExternalTrigInjecConv_T1_CC4: Timer1 capture compare4 selected (for ADC1, ADC2 and ADC3) + * @arg ADC_ExternalTrigInjecConv_T2_TRGO: Timer2 TRGO event selected (for ADC1 and ADC2) + * @arg ADC_ExternalTrigInjecConv_T2_CC1: Timer2 capture compare1 selected (for ADC1 and ADC2) + * @arg ADC_ExternalTrigInjecConv_T3_CC4: Timer3 capture compare4 selected (for ADC1 and ADC2) + * @arg ADC_ExternalTrigInjecConv_T4_TRGO: Timer4 TRGO event selected (for ADC1 and ADC2) + * @arg ADC_ExternalTrigInjecConv_Ext_IT15_TIM8_CC4: External interrupt line 15 or Timer8 + * capture compare4 event selected (for ADC1 and ADC2) + * @arg ADC_ExternalTrigInjecConv_T4_CC3: Timer4 capture compare3 selected (for ADC3 only) + * @arg ADC_ExternalTrigInjecConv_T8_CC2: Timer8 capture compare2 selected (for ADC3 only) + * @arg ADC_ExternalTrigInjecConv_T8_CC4: Timer8 capture compare4 selected (for ADC3 only) + * @arg ADC_ExternalTrigInjecConv_T5_TRGO: Timer5 TRGO event selected (for ADC3 only) + * @arg ADC_ExternalTrigInjecConv_T5_CC4: Timer5 capture compare4 selected (for ADC3 only) + * @arg ADC_ExternalTrigInjecConv_None: Injected conversion started by software and not + * by external trigger (for ADC1, ADC2 and ADC3) + * @retval None + */ +void ADC_ExternalTrigInjectedConvConfig(ADC_TypeDef* ADCx, uint32_t ADC_ExternalTrigInjecConv) +{ + uint32_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_EXT_INJEC_TRIG(ADC_ExternalTrigInjecConv)); + /* Get the old register value */ + tmpreg = ADCx->CR2; + /* Clear the old external event selection for injected group */ + tmpreg &= CR2_JEXTSEL_Reset; + /* Set the external event selection for injected group */ + tmpreg |= ADC_ExternalTrigInjecConv; + /* Store the new register value */ + ADCx->CR2 = tmpreg; +} + +/** + * @brief Enables or disables the ADCx injected channels conversion through + * external trigger + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param NewState: new state of the selected ADC external trigger start of + * injected conversion. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void ADC_ExternalTrigInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected ADC external event selection for injected group */ + ADCx->CR2 |= CR2_JEXTTRIG_Set; + } + else + { + /* Disable the selected ADC external event selection for injected group */ + ADCx->CR2 &= CR2_JEXTTRIG_Reset; + } +} + +/** + * @brief Enables or disables the selected ADC start of the injected + * channels conversion. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param NewState: new state of the selected ADC software start injected conversion. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void ADC_SoftwareStartInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected ADC conversion for injected group on external event and start the selected + ADC injected conversion */ + ADCx->CR2 |= CR2_JEXTTRIG_JSWSTART_Set; + } + else + { + /* Disable the selected ADC conversion on external event for injected group and stop the selected + ADC injected conversion */ + ADCx->CR2 &= CR2_JEXTTRIG_JSWSTART_Reset; + } +} + +/** + * @brief Gets the selected ADC Software start injected conversion Status. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @retval The new state of ADC software start injected conversion (SET or RESET). + */ +FlagStatus ADC_GetSoftwareStartInjectedConvCmdStatus(ADC_TypeDef* ADCx) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + /* Check the status of JSWSTART bit */ + if ((ADCx->CR2 & CR2_JSWSTART_Set) != (uint32_t)RESET) + { + /* JSWSTART bit is set */ + bitstatus = SET; + } + else + { + /* JSWSTART bit is reset */ + bitstatus = RESET; + } + /* Return the JSWSTART bit status */ + return bitstatus; +} + +/** + * @brief Configures for the selected ADC injected channel its corresponding + * rank in the sequencer and its sample time. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param ADC_Channel: the ADC channel to configure. + * This parameter can be one of the following values: + * @arg ADC_Channel_0: ADC Channel0 selected + * @arg ADC_Channel_1: ADC Channel1 selected + * @arg ADC_Channel_2: ADC Channel2 selected + * @arg ADC_Channel_3: ADC Channel3 selected + * @arg ADC_Channel_4: ADC Channel4 selected + * @arg ADC_Channel_5: ADC Channel5 selected + * @arg ADC_Channel_6: ADC Channel6 selected + * @arg ADC_Channel_7: ADC Channel7 selected + * @arg ADC_Channel_8: ADC Channel8 selected + * @arg ADC_Channel_9: ADC Channel9 selected + * @arg ADC_Channel_10: ADC Channel10 selected + * @arg ADC_Channel_11: ADC Channel11 selected + * @arg ADC_Channel_12: ADC Channel12 selected + * @arg ADC_Channel_13: ADC Channel13 selected + * @arg ADC_Channel_14: ADC Channel14 selected + * @arg ADC_Channel_15: ADC Channel15 selected + * @arg ADC_Channel_16: ADC Channel16 selected + * @arg ADC_Channel_17: ADC Channel17 selected + * @param Rank: The rank in the injected group sequencer. This parameter must be between 1 and 4. + * @param ADC_SampleTime: The sample time value to be set for the selected channel. + * This parameter can be one of the following values: + * @arg ADC_SampleTime_1Cycles5: Sample time equal to 1.5 cycles + * @arg ADC_SampleTime_7Cycles5: Sample time equal to 7.5 cycles + * @arg ADC_SampleTime_13Cycles5: Sample time equal to 13.5 cycles + * @arg ADC_SampleTime_28Cycles5: Sample time equal to 28.5 cycles + * @arg ADC_SampleTime_41Cycles5: Sample time equal to 41.5 cycles + * @arg ADC_SampleTime_55Cycles5: Sample time equal to 55.5 cycles + * @arg ADC_SampleTime_71Cycles5: Sample time equal to 71.5 cycles + * @arg ADC_SampleTime_239Cycles5: Sample time equal to 239.5 cycles + * @retval None + */ +void ADC_InjectedChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime) +{ + uint32_t tmpreg1 = 0, tmpreg2 = 0, tmpreg3 = 0; + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_CHANNEL(ADC_Channel)); + assert_param(IS_ADC_INJECTED_RANK(Rank)); + assert_param(IS_ADC_SAMPLE_TIME(ADC_SampleTime)); + /* if ADC_Channel_10 ... ADC_Channel_17 is selected */ + if (ADC_Channel > ADC_Channel_9) + { + /* Get the old register value */ + tmpreg1 = ADCx->SMPR1; + /* Calculate the mask to clear */ + tmpreg2 = SMPR1_SMP_Set << (3*(ADC_Channel - 10)); + /* Clear the old channel sample time */ + tmpreg1 &= ~tmpreg2; + /* Calculate the mask to set */ + tmpreg2 = (uint32_t)ADC_SampleTime << (3*(ADC_Channel - 10)); + /* Set the new channel sample time */ + tmpreg1 |= tmpreg2; + /* Store the new register value */ + ADCx->SMPR1 = tmpreg1; + } + else /* ADC_Channel include in ADC_Channel_[0..9] */ + { + /* Get the old register value */ + tmpreg1 = ADCx->SMPR2; + /* Calculate the mask to clear */ + tmpreg2 = SMPR2_SMP_Set << (3 * ADC_Channel); + /* Clear the old channel sample time */ + tmpreg1 &= ~tmpreg2; + /* Calculate the mask to set */ + tmpreg2 = (uint32_t)ADC_SampleTime << (3 * ADC_Channel); + /* Set the new channel sample time */ + tmpreg1 |= tmpreg2; + /* Store the new register value */ + ADCx->SMPR2 = tmpreg1; + } + /* Rank configuration */ + /* Get the old register value */ + tmpreg1 = ADCx->JSQR; + /* Get JL value: Number = JL+1 */ + tmpreg3 = (tmpreg1 & JSQR_JL_Set)>> 20; + /* Calculate the mask to clear: ((Rank-1)+(4-JL-1)) */ + tmpreg2 = JSQR_JSQ_Set << (5 * (uint8_t)((Rank + 3) - (tmpreg3 + 1))); + /* Clear the old JSQx bits for the selected rank */ + tmpreg1 &= ~tmpreg2; + /* Calculate the mask to set: ((Rank-1)+(4-JL-1)) */ + tmpreg2 = (uint32_t)ADC_Channel << (5 * (uint8_t)((Rank + 3) - (tmpreg3 + 1))); + /* Set the JSQx bits for the selected rank */ + tmpreg1 |= tmpreg2; + /* Store the new register value */ + ADCx->JSQR = tmpreg1; +} + +/** + * @brief Configures the sequencer length for injected channels + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param Length: The sequencer length. + * This parameter must be a number between 1 to 4. + * @retval None + */ +void ADC_InjectedSequencerLengthConfig(ADC_TypeDef* ADCx, uint8_t Length) +{ + uint32_t tmpreg1 = 0; + uint32_t tmpreg2 = 0; + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_INJECTED_LENGTH(Length)); + + /* Get the old register value */ + tmpreg1 = ADCx->JSQR; + /* Clear the old injected sequnence lenght JL bits */ + tmpreg1 &= JSQR_JL_Reset; + /* Set the injected sequnence lenght JL bits */ + tmpreg2 = Length - 1; + tmpreg1 |= tmpreg2 << 20; + /* Store the new register value */ + ADCx->JSQR = tmpreg1; +} + +/** + * @brief Set the injected channels conversion value offset + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param ADC_InjectedChannel: the ADC injected channel to set its offset. + * This parameter can be one of the following values: + * @arg ADC_InjectedChannel_1: Injected Channel1 selected + * @arg ADC_InjectedChannel_2: Injected Channel2 selected + * @arg ADC_InjectedChannel_3: Injected Channel3 selected + * @arg ADC_InjectedChannel_4: Injected Channel4 selected + * @param Offset: the offset value for the selected ADC injected channel + * This parameter must be a 12bit value. + * @retval None + */ +void ADC_SetInjectedOffset(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel, uint16_t Offset) +{ + __IO uint32_t tmp = 0; + + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_INJECTED_CHANNEL(ADC_InjectedChannel)); + assert_param(IS_ADC_OFFSET(Offset)); + + tmp = (uint32_t)ADCx; + tmp += ADC_InjectedChannel; + + /* Set the selected injected channel data offset */ + *(__IO uint32_t *) tmp = (uint32_t)Offset; +} + +/** + * @brief Returns the ADC injected channel conversion result + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param ADC_InjectedChannel: the converted ADC injected channel. + * This parameter can be one of the following values: + * @arg ADC_InjectedChannel_1: Injected Channel1 selected + * @arg ADC_InjectedChannel_2: Injected Channel2 selected + * @arg ADC_InjectedChannel_3: Injected Channel3 selected + * @arg ADC_InjectedChannel_4: Injected Channel4 selected + * @retval The Data conversion value. + */ +uint16_t ADC_GetInjectedConversionValue(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel) +{ + __IO uint32_t tmp = 0; + + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_INJECTED_CHANNEL(ADC_InjectedChannel)); + + tmp = (uint32_t)ADCx; + tmp += ADC_InjectedChannel + JDR_Offset; + + /* Returns the selected injected channel conversion data value */ + return (uint16_t) (*(__IO uint32_t*) tmp); +} + +/** + * @brief Enables or disables the analog watchdog on single/all regular + * or injected channels + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param ADC_AnalogWatchdog: the ADC analog watchdog configuration. + * This parameter can be one of the following values: + * @arg ADC_AnalogWatchdog_SingleRegEnable: Analog watchdog on a single regular channel + * @arg ADC_AnalogWatchdog_SingleInjecEnable: Analog watchdog on a single injected channel + * @arg ADC_AnalogWatchdog_SingleRegOrInjecEnable: Analog watchdog on a single regular or injected channel + * @arg ADC_AnalogWatchdog_AllRegEnable: Analog watchdog on all regular channel + * @arg ADC_AnalogWatchdog_AllInjecEnable: Analog watchdog on all injected channel + * @arg ADC_AnalogWatchdog_AllRegAllInjecEnable: Analog watchdog on all regular and injected channels + * @arg ADC_AnalogWatchdog_None: No channel guarded by the analog watchdog + * @retval None + */ +void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx, uint32_t ADC_AnalogWatchdog) +{ + uint32_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_ANALOG_WATCHDOG(ADC_AnalogWatchdog)); + /* Get the old register value */ + tmpreg = ADCx->CR1; + /* Clear AWDEN, AWDENJ and AWDSGL bits */ + tmpreg &= CR1_AWDMode_Reset; + /* Set the analog watchdog enable mode */ + tmpreg |= ADC_AnalogWatchdog; + /* Store the new register value */ + ADCx->CR1 = tmpreg; +} + +/** + * @brief Configures the high and low thresholds of the analog watchdog. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param HighThreshold: the ADC analog watchdog High threshold value. + * This parameter must be a 12bit value. + * @param LowThreshold: the ADC analog watchdog Low threshold value. + * This parameter must be a 12bit value. + * @retval None + */ +void ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef* ADCx, uint16_t HighThreshold, + uint16_t LowThreshold) +{ + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_THRESHOLD(HighThreshold)); + assert_param(IS_ADC_THRESHOLD(LowThreshold)); + /* Set the ADCx high threshold */ + ADCx->HTR = HighThreshold; + /* Set the ADCx low threshold */ + ADCx->LTR = LowThreshold; +} + +/** + * @brief Configures the analog watchdog guarded single channel + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param ADC_Channel: the ADC channel to configure for the analog watchdog. + * This parameter can be one of the following values: + * @arg ADC_Channel_0: ADC Channel0 selected + * @arg ADC_Channel_1: ADC Channel1 selected + * @arg ADC_Channel_2: ADC Channel2 selected + * @arg ADC_Channel_3: ADC Channel3 selected + * @arg ADC_Channel_4: ADC Channel4 selected + * @arg ADC_Channel_5: ADC Channel5 selected + * @arg ADC_Channel_6: ADC Channel6 selected + * @arg ADC_Channel_7: ADC Channel7 selected + * @arg ADC_Channel_8: ADC Channel8 selected + * @arg ADC_Channel_9: ADC Channel9 selected + * @arg ADC_Channel_10: ADC Channel10 selected + * @arg ADC_Channel_11: ADC Channel11 selected + * @arg ADC_Channel_12: ADC Channel12 selected + * @arg ADC_Channel_13: ADC Channel13 selected + * @arg ADC_Channel_14: ADC Channel14 selected + * @arg ADC_Channel_15: ADC Channel15 selected + * @arg ADC_Channel_16: ADC Channel16 selected + * @arg ADC_Channel_17: ADC Channel17 selected + * @retval None + */ +void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel) +{ + uint32_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_CHANNEL(ADC_Channel)); + /* Get the old register value */ + tmpreg = ADCx->CR1; + /* Clear the Analog watchdog channel select bits */ + tmpreg &= CR1_AWDCH_Reset; + /* Set the Analog watchdog channel */ + tmpreg |= ADC_Channel; + /* Store the new register value */ + ADCx->CR1 = tmpreg; +} + +/** + * @brief Enables or disables the temperature sensor and Vrefint channel. + * @param NewState: new state of the temperature sensor. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void ADC_TempSensorVrefintCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the temperature sensor and Vrefint channel*/ + ADC1->CR2 |= CR2_TSVREFE_Set; + } + else + { + /* Disable the temperature sensor and Vrefint channel*/ + ADC1->CR2 &= CR2_TSVREFE_Reset; + } +} + +/** + * @brief Checks whether the specified ADC flag is set or not. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param ADC_FLAG: specifies the flag to check. + * This parameter can be one of the following values: + * @arg ADC_FLAG_AWD: Analog watchdog flag + * @arg ADC_FLAG_EOC: End of conversion flag + * @arg ADC_FLAG_JEOC: End of injected group conversion flag + * @arg ADC_FLAG_JSTRT: Start of injected group conversion flag + * @arg ADC_FLAG_STRT: Start of regular group conversion flag + * @retval The new state of ADC_FLAG (SET or RESET). + */ +FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_GET_FLAG(ADC_FLAG)); + /* Check the status of the specified ADC flag */ + if ((ADCx->SR & ADC_FLAG) != (uint8_t)RESET) + { + /* ADC_FLAG is set */ + bitstatus = SET; + } + else + { + /* ADC_FLAG is reset */ + bitstatus = RESET; + } + /* Return the ADC_FLAG status */ + return bitstatus; +} + +/** + * @brief Clears the ADCx's pending flags. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param ADC_FLAG: specifies the flag to clear. + * This parameter can be any combination of the following values: + * @arg ADC_FLAG_AWD: Analog watchdog flag + * @arg ADC_FLAG_EOC: End of conversion flag + * @arg ADC_FLAG_JEOC: End of injected group conversion flag + * @arg ADC_FLAG_JSTRT: Start of injected group conversion flag + * @arg ADC_FLAG_STRT: Start of regular group conversion flag + * @retval None + */ +void ADC_ClearFlag(ADC_TypeDef* ADCx, uint8_t ADC_FLAG) +{ + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_CLEAR_FLAG(ADC_FLAG)); + /* Clear the selected ADC flags */ + ADCx->SR = ~(uint32_t)ADC_FLAG; +} + +/** + * @brief Checks whether the specified ADC interrupt has occurred or not. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param ADC_IT: specifies the ADC interrupt source to check. + * This parameter can be one of the following values: + * @arg ADC_IT_EOC: End of conversion interrupt mask + * @arg ADC_IT_AWD: Analog watchdog interrupt mask + * @arg ADC_IT_JEOC: End of injected conversion interrupt mask + * @retval The new state of ADC_IT (SET or RESET). + */ +ITStatus ADC_GetITStatus(ADC_TypeDef* ADCx, uint16_t ADC_IT) +{ + ITStatus bitstatus = RESET; + uint32_t itmask = 0, enablestatus = 0; + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_GET_IT(ADC_IT)); + /* Get the ADC IT index */ + itmask = ADC_IT >> 8; + /* Get the ADC_IT enable bit status */ + enablestatus = (ADCx->CR1 & (uint8_t)ADC_IT) ; + /* Check the status of the specified ADC interrupt */ + if (((ADCx->SR & itmask) != (uint32_t)RESET) && enablestatus) + { + /* ADC_IT is set */ + bitstatus = SET; + } + else + { + /* ADC_IT is reset */ + bitstatus = RESET; + } + /* Return the ADC_IT status */ + return bitstatus; +} + +/** + * @brief Clears the ADCx's interrupt pending bits. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param ADC_IT: specifies the ADC interrupt pending bit to clear. + * This parameter can be any combination of the following values: + * @arg ADC_IT_EOC: End of conversion interrupt mask + * @arg ADC_IT_AWD: Analog watchdog interrupt mask + * @arg ADC_IT_JEOC: End of injected conversion interrupt mask + * @retval None + */ +void ADC_ClearITPendingBit(ADC_TypeDef* ADCx, uint16_t ADC_IT) +{ + uint8_t itmask = 0; + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_IT(ADC_IT)); + /* Get the ADC IT index */ + itmask = (uint8_t)(ADC_IT >> 8); + /* Clear the selected ADC interrupt pending bits */ + ADCx->SR = ~(uint32_t)itmask; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_bkp.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_bkp.c new file mode 100644 index 0000000..3004b9e --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_bkp.c @@ -0,0 +1,308 @@ +/** + ****************************************************************************** + * @file stm32f10x_bkp.c + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief This file provides all the BKP firmware functions. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_bkp.h" +#include "stm32f10x_rcc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup BKP + * @brief BKP driver modules + * @{ + */ + +/** @defgroup BKP_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup BKP_Private_Defines + * @{ + */ + +/* ------------ BKP registers bit address in the alias region --------------- */ +#define BKP_OFFSET (BKP_BASE - PERIPH_BASE) + +/* --- CR Register ----*/ + +/* Alias word address of TPAL bit */ +#define CR_OFFSET (BKP_OFFSET + 0x30) +#define TPAL_BitNumber 0x01 +#define CR_TPAL_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (TPAL_BitNumber * 4)) + +/* Alias word address of TPE bit */ +#define TPE_BitNumber 0x00 +#define CR_TPE_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (TPE_BitNumber * 4)) + +/* --- CSR Register ---*/ + +/* Alias word address of TPIE bit */ +#define CSR_OFFSET (BKP_OFFSET + 0x34) +#define TPIE_BitNumber 0x02 +#define CSR_TPIE_BB (PERIPH_BB_BASE + (CSR_OFFSET * 32) + (TPIE_BitNumber * 4)) + +/* Alias word address of TIF bit */ +#define TIF_BitNumber 0x09 +#define CSR_TIF_BB (PERIPH_BB_BASE + (CSR_OFFSET * 32) + (TIF_BitNumber * 4)) + +/* Alias word address of TEF bit */ +#define TEF_BitNumber 0x08 +#define CSR_TEF_BB (PERIPH_BB_BASE + (CSR_OFFSET * 32) + (TEF_BitNumber * 4)) + +/* ---------------------- BKP registers bit mask ------------------------ */ + +/* RTCCR register bit mask */ +#define RTCCR_CAL_MASK ((uint16_t)0xFF80) +#define RTCCR_MASK ((uint16_t)0xFC7F) + +/** + * @} + */ + + +/** @defgroup BKP_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup BKP_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup BKP_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup BKP_Private_Functions + * @{ + */ + +/** + * @brief Deinitializes the BKP peripheral registers to their default reset values. + * @param None + * @retval None + */ +void BKP_DeInit(void) +{ + RCC_BackupResetCmd(ENABLE); + RCC_BackupResetCmd(DISABLE); +} + +/** + * @brief Configures the Tamper Pin active level. + * @param BKP_TamperPinLevel: specifies the Tamper Pin active level. + * This parameter can be one of the following values: + * @arg BKP_TamperPinLevel_High: Tamper pin active on high level + * @arg BKP_TamperPinLevel_Low: Tamper pin active on low level + * @retval None + */ +void BKP_TamperPinLevelConfig(uint16_t BKP_TamperPinLevel) +{ + /* Check the parameters */ + assert_param(IS_BKP_TAMPER_PIN_LEVEL(BKP_TamperPinLevel)); + *(__IO uint32_t *) CR_TPAL_BB = BKP_TamperPinLevel; +} + +/** + * @brief Enables or disables the Tamper Pin activation. + * @param NewState: new state of the Tamper Pin activation. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void BKP_TamperPinCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + *(__IO uint32_t *) CR_TPE_BB = (uint32_t)NewState; +} + +/** + * @brief Enables or disables the Tamper Pin Interrupt. + * @param NewState: new state of the Tamper Pin Interrupt. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void BKP_ITConfig(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + *(__IO uint32_t *) CSR_TPIE_BB = (uint32_t)NewState; +} + +/** + * @brief Select the RTC output source to output on the Tamper pin. + * @param BKP_RTCOutputSource: specifies the RTC output source. + * This parameter can be one of the following values: + * @arg BKP_RTCOutputSource_None: no RTC output on the Tamper pin. + * @arg BKP_RTCOutputSource_CalibClock: output the RTC clock with frequency + * divided by 64 on the Tamper pin. + * @arg BKP_RTCOutputSource_Alarm: output the RTC Alarm pulse signal on + * the Tamper pin. + * @arg BKP_RTCOutputSource_Second: output the RTC Second pulse signal on + * the Tamper pin. + * @retval None + */ +void BKP_RTCOutputConfig(uint16_t BKP_RTCOutputSource) +{ + uint16_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_BKP_RTC_OUTPUT_SOURCE(BKP_RTCOutputSource)); + tmpreg = BKP->RTCCR; + /* Clear CCO, ASOE and ASOS bits */ + tmpreg &= RTCCR_MASK; + + /* Set CCO, ASOE and ASOS bits according to BKP_RTCOutputSource value */ + tmpreg |= BKP_RTCOutputSource; + /* Store the new value */ + BKP->RTCCR = tmpreg; +} + +/** + * @brief Sets RTC Clock Calibration value. + * @param CalibrationValue: specifies the RTC Clock Calibration value. + * This parameter must be a number between 0 and 0x7F. + * @retval None + */ +void BKP_SetRTCCalibrationValue(uint8_t CalibrationValue) +{ + uint16_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_BKP_CALIBRATION_VALUE(CalibrationValue)); + tmpreg = BKP->RTCCR; + /* Clear CAL[6:0] bits */ + tmpreg &= RTCCR_CAL_MASK; + /* Set CAL[6:0] bits according to CalibrationValue value */ + tmpreg |= CalibrationValue; + /* Store the new value */ + BKP->RTCCR = tmpreg; +} + +/** + * @brief Writes user data to the specified Data Backup Register. + * @param BKP_DR: specifies the Data Backup Register. + * This parameter can be BKP_DRx where x:[1, 42] + * @param Data: data to write + * @retval None + */ +void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data) +{ + __IO uint32_t tmp = 0; + + /* Check the parameters */ + assert_param(IS_BKP_DR(BKP_DR)); + + tmp = (uint32_t)BKP_BASE; + tmp += BKP_DR; + + *(__IO uint32_t *) tmp = Data; +} + +/** + * @brief Reads data from the specified Data Backup Register. + * @param BKP_DR: specifies the Data Backup Register. + * This parameter can be BKP_DRx where x:[1, 42] + * @retval The content of the specified Data Backup Register + */ +uint16_t BKP_ReadBackupRegister(uint16_t BKP_DR) +{ + __IO uint32_t tmp = 0; + + /* Check the parameters */ + assert_param(IS_BKP_DR(BKP_DR)); + + tmp = (uint32_t)BKP_BASE; + tmp += BKP_DR; + + return (*(__IO uint16_t *) tmp); +} + +/** + * @brief Checks whether the Tamper Pin Event flag is set or not. + * @param None + * @retval The new state of the Tamper Pin Event flag (SET or RESET). + */ +FlagStatus BKP_GetFlagStatus(void) +{ + return (FlagStatus)(*(__IO uint32_t *) CSR_TEF_BB); +} + +/** + * @brief Clears Tamper Pin Event pending flag. + * @param None + * @retval None + */ +void BKP_ClearFlag(void) +{ + /* Set CTE bit to clear Tamper Pin Event flag */ + BKP->CSR |= BKP_CSR_CTE; +} + +/** + * @brief Checks whether the Tamper Pin Interrupt has occurred or not. + * @param None + * @retval The new state of the Tamper Pin Interrupt (SET or RESET). + */ +ITStatus BKP_GetITStatus(void) +{ + return (ITStatus)(*(__IO uint32_t *) CSR_TIF_BB); +} + +/** + * @brief Clears Tamper Pin Interrupt pending bit. + * @param None + * @retval None + */ +void BKP_ClearITPendingBit(void) +{ + /* Set CTI bit to clear Tamper Pin Interrupt pending bit */ + BKP->CSR |= BKP_CSR_CTI; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_can.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_can.c new file mode 100644 index 0000000..607d692 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_can.c @@ -0,0 +1,1415 @@ +/** + ****************************************************************************** + * @file stm32f10x_can.c + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief This file provides all the CAN firmware functions. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_can.h" +#include "stm32f10x_rcc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup CAN + * @brief CAN driver modules + * @{ + */ + +/** @defgroup CAN_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup CAN_Private_Defines + * @{ + */ + +/* CAN Master Control Register bits */ + +#define MCR_DBF ((uint32_t)0x00010000) /* software master reset */ + +/* CAN Mailbox Transmit Request */ +#define TMIDxR_TXRQ ((uint32_t)0x00000001) /* Transmit mailbox request */ + +/* CAN Filter Master Register bits */ +#define FMR_FINIT ((uint32_t)0x00000001) /* Filter init mode */ + +/* Time out for INAK bit */ +#define INAK_TIMEOUT ((uint32_t)0x0000FFFF) +/* Time out for SLAK bit */ +#define SLAK_TIMEOUT ((uint32_t)0x0000FFFF) + + + +/* Flags in TSR register */ +#define CAN_FLAGS_TSR ((uint32_t)0x08000000) +/* Flags in RF1R register */ +#define CAN_FLAGS_RF1R ((uint32_t)0x04000000) +/* Flags in RF0R register */ +#define CAN_FLAGS_RF0R ((uint32_t)0x02000000) +/* Flags in MSR register */ +#define CAN_FLAGS_MSR ((uint32_t)0x01000000) +/* Flags in ESR register */ +#define CAN_FLAGS_ESR ((uint32_t)0x00F00000) + +/* Mailboxes definition */ +#define CAN_TXMAILBOX_0 ((uint8_t)0x00) +#define CAN_TXMAILBOX_1 ((uint8_t)0x01) +#define CAN_TXMAILBOX_2 ((uint8_t)0x02) + + + +#define CAN_MODE_MASK ((uint32_t) 0x00000003) +/** + * @} + */ + +/** @defgroup CAN_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup CAN_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup CAN_Private_FunctionPrototypes + * @{ + */ + +static ITStatus CheckITStatus(uint32_t CAN_Reg, uint32_t It_Bit); + +/** + * @} + */ + +/** @defgroup CAN_Private_Functions + * @{ + */ + +/** + * @brief Deinitializes the CAN peripheral registers to their default reset values. + * @param CANx: where x can be 1 or 2 to select the CAN peripheral. + * @retval None. + */ +void CAN_DeInit(CAN_TypeDef* CANx) +{ + /* Check the parameters */ + assert_param(IS_CAN_ALL_PERIPH(CANx)); + + if (CANx == CAN1) + { + /* Enable CAN1 reset state */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_CAN1, ENABLE); + /* Release CAN1 from reset state */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_CAN1, DISABLE); + } + else + { + /* Enable CAN2 reset state */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_CAN2, ENABLE); + /* Release CAN2 from reset state */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_CAN2, DISABLE); + } +} + +/** + * @brief Initializes the CAN peripheral according to the specified + * parameters in the CAN_InitStruct. + * @param CANx: where x can be 1 or 2 to to select the CAN + * peripheral. + * @param CAN_InitStruct: pointer to a CAN_InitTypeDef structure that + * contains the configuration information for the + * CAN peripheral. + * @retval Constant indicates initialization succeed which will be + * CAN_InitStatus_Failed or CAN_InitStatus_Success. + */ +uint8_t CAN_Init(CAN_TypeDef* CANx, CAN_InitTypeDef* CAN_InitStruct) +{ + uint8_t InitStatus = CAN_InitStatus_Failed; + uint32_t wait_ack = 0x00000000; + /* Check the parameters */ + assert_param(IS_CAN_ALL_PERIPH(CANx)); + assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_TTCM)); + assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_ABOM)); + assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_AWUM)); + assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_NART)); + assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_RFLM)); + assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_TXFP)); + assert_param(IS_CAN_MODE(CAN_InitStruct->CAN_Mode)); + assert_param(IS_CAN_SJW(CAN_InitStruct->CAN_SJW)); + assert_param(IS_CAN_BS1(CAN_InitStruct->CAN_BS1)); + assert_param(IS_CAN_BS2(CAN_InitStruct->CAN_BS2)); + assert_param(IS_CAN_PRESCALER(CAN_InitStruct->CAN_Prescaler)); + + /* Exit from sleep mode */ + CANx->MCR &= (~(uint32_t)CAN_MCR_SLEEP); + + /* Request initialisation */ + CANx->MCR |= CAN_MCR_INRQ ; + + /* Wait the acknowledge */ + while (((CANx->MSR & CAN_MSR_INAK) != CAN_MSR_INAK) && (wait_ack != INAK_TIMEOUT)) + { + wait_ack++; + } + + /* Check acknowledge */ + if ((CANx->MSR & CAN_MSR_INAK) != CAN_MSR_INAK) + { + InitStatus = CAN_InitStatus_Failed; + } + else + { + /* Set the time triggered communication mode */ + if (CAN_InitStruct->CAN_TTCM == ENABLE) + { + CANx->MCR |= CAN_MCR_TTCM; + } + else + { + CANx->MCR &= ~(uint32_t)CAN_MCR_TTCM; + } + + /* Set the automatic bus-off management */ + if (CAN_InitStruct->CAN_ABOM == ENABLE) + { + CANx->MCR |= CAN_MCR_ABOM; + } + else + { + CANx->MCR &= ~(uint32_t)CAN_MCR_ABOM; + } + + /* Set the automatic wake-up mode */ + if (CAN_InitStruct->CAN_AWUM == ENABLE) + { + CANx->MCR |= CAN_MCR_AWUM; + } + else + { + CANx->MCR &= ~(uint32_t)CAN_MCR_AWUM; + } + + /* Set the no automatic retransmission */ + if (CAN_InitStruct->CAN_NART == ENABLE) + { + CANx->MCR |= CAN_MCR_NART; + } + else + { + CANx->MCR &= ~(uint32_t)CAN_MCR_NART; + } + + /* Set the receive FIFO locked mode */ + if (CAN_InitStruct->CAN_RFLM == ENABLE) + { + CANx->MCR |= CAN_MCR_RFLM; + } + else + { + CANx->MCR &= ~(uint32_t)CAN_MCR_RFLM; + } + + /* Set the transmit FIFO priority */ + if (CAN_InitStruct->CAN_TXFP == ENABLE) + { + CANx->MCR |= CAN_MCR_TXFP; + } + else + { + CANx->MCR &= ~(uint32_t)CAN_MCR_TXFP; + } + + /* Set the bit timing register */ + CANx->BTR = (uint32_t)((uint32_t)CAN_InitStruct->CAN_Mode << 30) | \ + ((uint32_t)CAN_InitStruct->CAN_SJW << 24) | \ + ((uint32_t)CAN_InitStruct->CAN_BS1 << 16) | \ + ((uint32_t)CAN_InitStruct->CAN_BS2 << 20) | \ + ((uint32_t)CAN_InitStruct->CAN_Prescaler - 1); + + /* Request leave initialisation */ + CANx->MCR &= ~(uint32_t)CAN_MCR_INRQ; + + /* Wait the acknowledge */ + wait_ack = 0; + + while (((CANx->MSR & CAN_MSR_INAK) == CAN_MSR_INAK) && (wait_ack != INAK_TIMEOUT)) + { + wait_ack++; + } + + /* ...and check acknowledged */ + if ((CANx->MSR & CAN_MSR_INAK) == CAN_MSR_INAK) + { + InitStatus = CAN_InitStatus_Failed; + } + else + { + InitStatus = CAN_InitStatus_Success ; + } + } + + /* At this step, return the status of initialization */ + return InitStatus; +} + +/** + * @brief Initializes the CAN peripheral according to the specified + * parameters in the CAN_FilterInitStruct. + * @param CAN_FilterInitStruct: pointer to a CAN_FilterInitTypeDef + * structure that contains the configuration + * information. + * @retval None. + */ +void CAN_FilterInit(CAN_FilterInitTypeDef* CAN_FilterInitStruct) +{ + uint32_t filter_number_bit_pos = 0; + /* Check the parameters */ + assert_param(IS_CAN_FILTER_NUMBER(CAN_FilterInitStruct->CAN_FilterNumber)); + assert_param(IS_CAN_FILTER_MODE(CAN_FilterInitStruct->CAN_FilterMode)); + assert_param(IS_CAN_FILTER_SCALE(CAN_FilterInitStruct->CAN_FilterScale)); + assert_param(IS_CAN_FILTER_FIFO(CAN_FilterInitStruct->CAN_FilterFIFOAssignment)); + assert_param(IS_FUNCTIONAL_STATE(CAN_FilterInitStruct->CAN_FilterActivation)); + + filter_number_bit_pos = ((uint32_t)1) << CAN_FilterInitStruct->CAN_FilterNumber; + + /* Initialisation mode for the filter */ + CAN1->FMR |= FMR_FINIT; + + /* Filter Deactivation */ + CAN1->FA1R &= ~(uint32_t)filter_number_bit_pos; + + /* Filter Scale */ + if (CAN_FilterInitStruct->CAN_FilterScale == CAN_FilterScale_16bit) + { + /* 16-bit scale for the filter */ + CAN1->FS1R &= ~(uint32_t)filter_number_bit_pos; + + /* First 16-bit identifier and First 16-bit mask */ + /* Or First 16-bit identifier and Second 16-bit identifier */ + CAN1->sFilterRegister[CAN_FilterInitStruct->CAN_FilterNumber].FR1 = + ((0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterMaskIdLow) << 16) | + (0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterIdLow); + + /* Second 16-bit identifier and Second 16-bit mask */ + /* Or Third 16-bit identifier and Fourth 16-bit identifier */ + CAN1->sFilterRegister[CAN_FilterInitStruct->CAN_FilterNumber].FR2 = + ((0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterMaskIdHigh) << 16) | + (0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterIdHigh); + } + + if (CAN_FilterInitStruct->CAN_FilterScale == CAN_FilterScale_32bit) + { + /* 32-bit scale for the filter */ + CAN1->FS1R |= filter_number_bit_pos; + /* 32-bit identifier or First 32-bit identifier */ + CAN1->sFilterRegister[CAN_FilterInitStruct->CAN_FilterNumber].FR1 = + ((0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterIdHigh) << 16) | + (0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterIdLow); + /* 32-bit mask or Second 32-bit identifier */ + CAN1->sFilterRegister[CAN_FilterInitStruct->CAN_FilterNumber].FR2 = + ((0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterMaskIdHigh) << 16) | + (0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterMaskIdLow); + } + + /* Filter Mode */ + if (CAN_FilterInitStruct->CAN_FilterMode == CAN_FilterMode_IdMask) + { + /*Id/Mask mode for the filter*/ + CAN1->FM1R &= ~(uint32_t)filter_number_bit_pos; + } + else /* CAN_FilterInitStruct->CAN_FilterMode == CAN_FilterMode_IdList */ + { + /*Identifier list mode for the filter*/ + CAN1->FM1R |= (uint32_t)filter_number_bit_pos; + } + + /* Filter FIFO assignment */ + if (CAN_FilterInitStruct->CAN_FilterFIFOAssignment == CAN_Filter_FIFO0) + { + /* FIFO 0 assignation for the filter */ + CAN1->FFA1R &= ~(uint32_t)filter_number_bit_pos; + } + + if (CAN_FilterInitStruct->CAN_FilterFIFOAssignment == CAN_Filter_FIFO1) + { + /* FIFO 1 assignation for the filter */ + CAN1->FFA1R |= (uint32_t)filter_number_bit_pos; + } + + /* Filter activation */ + if (CAN_FilterInitStruct->CAN_FilterActivation == ENABLE) + { + CAN1->FA1R |= filter_number_bit_pos; + } + + /* Leave the initialisation mode for the filter */ + CAN1->FMR &= ~FMR_FINIT; +} + +/** + * @brief Fills each CAN_InitStruct member with its default value. + * @param CAN_InitStruct: pointer to a CAN_InitTypeDef structure which + * will be initialized. + * @retval None. + */ +void CAN_StructInit(CAN_InitTypeDef* CAN_InitStruct) +{ + /* Reset CAN init structure parameters values */ + + /* Initialize the time triggered communication mode */ + CAN_InitStruct->CAN_TTCM = DISABLE; + + /* Initialize the automatic bus-off management */ + CAN_InitStruct->CAN_ABOM = DISABLE; + + /* Initialize the automatic wake-up mode */ + CAN_InitStruct->CAN_AWUM = DISABLE; + + /* Initialize the no automatic retransmission */ + CAN_InitStruct->CAN_NART = DISABLE; + + /* Initialize the receive FIFO locked mode */ + CAN_InitStruct->CAN_RFLM = DISABLE; + + /* Initialize the transmit FIFO priority */ + CAN_InitStruct->CAN_TXFP = DISABLE; + + /* Initialize the CAN_Mode member */ + CAN_InitStruct->CAN_Mode = CAN_Mode_Normal; + + /* Initialize the CAN_SJW member */ + CAN_InitStruct->CAN_SJW = CAN_SJW_1tq; + + /* Initialize the CAN_BS1 member */ + CAN_InitStruct->CAN_BS1 = CAN_BS1_4tq; + + /* Initialize the CAN_BS2 member */ + CAN_InitStruct->CAN_BS2 = CAN_BS2_3tq; + + /* Initialize the CAN_Prescaler member */ + CAN_InitStruct->CAN_Prescaler = 1; +} + +/** + * @brief Select the start bank filter for slave CAN. + * @note This function applies only to STM32 Connectivity line devices. + * @param CAN_BankNumber: Select the start slave bank filter from 1..27. + * @retval None. + */ +void CAN_SlaveStartBank(uint8_t CAN_BankNumber) +{ + /* Check the parameters */ + assert_param(IS_CAN_BANKNUMBER(CAN_BankNumber)); + + /* Enter Initialisation mode for the filter */ + CAN1->FMR |= FMR_FINIT; + + /* Select the start slave bank */ + CAN1->FMR &= (uint32_t)0xFFFFC0F1 ; + CAN1->FMR |= (uint32_t)(CAN_BankNumber)<<8; + + /* Leave Initialisation mode for the filter */ + CAN1->FMR &= ~FMR_FINIT; +} + +/** + * @brief Enables or disables the DBG Freeze for CAN. + * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. + * @param NewState: new state of the CAN peripheral. This parameter can + * be: ENABLE or DISABLE. + * @retval None. + */ +void CAN_DBGFreeze(CAN_TypeDef* CANx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_CAN_ALL_PERIPH(CANx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable Debug Freeze */ + CANx->MCR |= MCR_DBF; + } + else + { + /* Disable Debug Freeze */ + CANx->MCR &= ~MCR_DBF; + } +} + + +/** + * @brief Enables or disabes the CAN Time TriggerOperation communication mode. + * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. + * @param NewState : Mode new state , can be one of @ref FunctionalState. + * @note when enabled, Time stamp (TIME[15:0]) value is sent in the last + * two data bytes of the 8-byte message: TIME[7:0] in data byte 6 + * and TIME[15:8] in data byte 7 + * @note DLC must be programmed as 8 in order Time Stamp (2 bytes) to be + * sent over the CAN bus. + * @retval None + */ +void CAN_TTComModeCmd(CAN_TypeDef* CANx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_CAN_ALL_PERIPH(CANx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the TTCM mode */ + CANx->MCR |= CAN_MCR_TTCM; + + /* Set TGT bits */ + CANx->sTxMailBox[0].TDTR |= ((uint32_t)CAN_TDT0R_TGT); + CANx->sTxMailBox[1].TDTR |= ((uint32_t)CAN_TDT1R_TGT); + CANx->sTxMailBox[2].TDTR |= ((uint32_t)CAN_TDT2R_TGT); + } + else + { + /* Disable the TTCM mode */ + CANx->MCR &= (uint32_t)(~(uint32_t)CAN_MCR_TTCM); + + /* Reset TGT bits */ + CANx->sTxMailBox[0].TDTR &= ((uint32_t)~CAN_TDT0R_TGT); + CANx->sTxMailBox[1].TDTR &= ((uint32_t)~CAN_TDT1R_TGT); + CANx->sTxMailBox[2].TDTR &= ((uint32_t)~CAN_TDT2R_TGT); + } +} +/** + * @brief Initiates the transmission of a message. + * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. + * @param TxMessage: pointer to a structure which contains CAN Id, CAN + * DLC and CAN data. + * @retval The number of the mailbox that is used for transmission + * or CAN_TxStatus_NoMailBox if there is no empty mailbox. + */ +uint8_t CAN_Transmit(CAN_TypeDef* CANx, CanTxMsg* TxMessage) +{ + uint8_t transmit_mailbox = 0; + /* Check the parameters */ + assert_param(IS_CAN_ALL_PERIPH(CANx)); + assert_param(IS_CAN_IDTYPE(TxMessage->IDE)); + assert_param(IS_CAN_RTR(TxMessage->RTR)); + assert_param(IS_CAN_DLC(TxMessage->DLC)); + + /* Select one empty transmit mailbox */ + if ((CANx->TSR&CAN_TSR_TME0) == CAN_TSR_TME0) + { + transmit_mailbox = 0; + } + else if ((CANx->TSR&CAN_TSR_TME1) == CAN_TSR_TME1) + { + transmit_mailbox = 1; + } + else if ((CANx->TSR&CAN_TSR_TME2) == CAN_TSR_TME2) + { + transmit_mailbox = 2; + } + else + { + transmit_mailbox = CAN_TxStatus_NoMailBox; + } + + if (transmit_mailbox != CAN_TxStatus_NoMailBox) + { + /* Set up the Id */ + CANx->sTxMailBox[transmit_mailbox].TIR &= TMIDxR_TXRQ; + if (TxMessage->IDE == CAN_Id_Standard) + { + assert_param(IS_CAN_STDID(TxMessage->StdId)); + CANx->sTxMailBox[transmit_mailbox].TIR |= ((TxMessage->StdId << 21) | \ + TxMessage->RTR); + } + else + { + assert_param(IS_CAN_EXTID(TxMessage->ExtId)); + CANx->sTxMailBox[transmit_mailbox].TIR |= ((TxMessage->ExtId << 3) | \ + TxMessage->IDE | \ + TxMessage->RTR); + } + + /* Set up the DLC */ + TxMessage->DLC &= (uint8_t)0x0000000F; + CANx->sTxMailBox[transmit_mailbox].TDTR &= (uint32_t)0xFFFFFFF0; + CANx->sTxMailBox[transmit_mailbox].TDTR |= TxMessage->DLC; + + /* Set up the data field */ + CANx->sTxMailBox[transmit_mailbox].TDLR = (((uint32_t)TxMessage->Data[3] << 24) | + ((uint32_t)TxMessage->Data[2] << 16) | + ((uint32_t)TxMessage->Data[1] << 8) | + ((uint32_t)TxMessage->Data[0])); + CANx->sTxMailBox[transmit_mailbox].TDHR = (((uint32_t)TxMessage->Data[7] << 24) | + ((uint32_t)TxMessage->Data[6] << 16) | + ((uint32_t)TxMessage->Data[5] << 8) | + ((uint32_t)TxMessage->Data[4])); + /* Request transmission */ + CANx->sTxMailBox[transmit_mailbox].TIR |= TMIDxR_TXRQ; + } + return transmit_mailbox; +} + +/** + * @brief Checks the transmission of a message. + * @param CANx: where x can be 1 or 2 to to select the + * CAN peripheral. + * @param TransmitMailbox: the number of the mailbox that is used for + * transmission. + * @retval CAN_TxStatus_Ok if the CAN driver transmits the message, CAN_TxStatus_Failed + * in an other case. + */ +uint8_t CAN_TransmitStatus(CAN_TypeDef* CANx, uint8_t TransmitMailbox) +{ + uint32_t state = 0; + + /* Check the parameters */ + assert_param(IS_CAN_ALL_PERIPH(CANx)); + assert_param(IS_CAN_TRANSMITMAILBOX(TransmitMailbox)); + + switch (TransmitMailbox) + { + case (CAN_TXMAILBOX_0): + state = CANx->TSR & (CAN_TSR_RQCP0 | CAN_TSR_TXOK0 | CAN_TSR_TME0); + break; + case (CAN_TXMAILBOX_1): + state = CANx->TSR & (CAN_TSR_RQCP1 | CAN_TSR_TXOK1 | CAN_TSR_TME1); + break; + case (CAN_TXMAILBOX_2): + state = CANx->TSR & (CAN_TSR_RQCP2 | CAN_TSR_TXOK2 | CAN_TSR_TME2); + break; + default: + state = CAN_TxStatus_Failed; + break; + } + switch (state) + { + /* transmit pending */ + case (0x0): state = CAN_TxStatus_Pending; + break; + /* transmit failed */ + case (CAN_TSR_RQCP0 | CAN_TSR_TME0): state = CAN_TxStatus_Failed; + break; + case (CAN_TSR_RQCP1 | CAN_TSR_TME1): state = CAN_TxStatus_Failed; + break; + case (CAN_TSR_RQCP2 | CAN_TSR_TME2): state = CAN_TxStatus_Failed; + break; + /* transmit succeeded */ + case (CAN_TSR_RQCP0 | CAN_TSR_TXOK0 | CAN_TSR_TME0):state = CAN_TxStatus_Ok; + break; + case (CAN_TSR_RQCP1 | CAN_TSR_TXOK1 | CAN_TSR_TME1):state = CAN_TxStatus_Ok; + break; + case (CAN_TSR_RQCP2 | CAN_TSR_TXOK2 | CAN_TSR_TME2):state = CAN_TxStatus_Ok; + break; + default: state = CAN_TxStatus_Failed; + break; + } + return (uint8_t) state; +} + +/** + * @brief Cancels a transmit request. + * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. + * @param Mailbox: Mailbox number. + * @retval None. + */ +void CAN_CancelTransmit(CAN_TypeDef* CANx, uint8_t Mailbox) +{ + /* Check the parameters */ + assert_param(IS_CAN_ALL_PERIPH(CANx)); + assert_param(IS_CAN_TRANSMITMAILBOX(Mailbox)); + /* abort transmission */ + switch (Mailbox) + { + case (CAN_TXMAILBOX_0): CANx->TSR |= CAN_TSR_ABRQ0; + break; + case (CAN_TXMAILBOX_1): CANx->TSR |= CAN_TSR_ABRQ1; + break; + case (CAN_TXMAILBOX_2): CANx->TSR |= CAN_TSR_ABRQ2; + break; + default: + break; + } +} + + +/** + * @brief Receives a message. + * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. + * @param FIFONumber: Receive FIFO number, CAN_FIFO0 or CAN_FIFO1. + * @param RxMessage: pointer to a structure receive message which contains + * CAN Id, CAN DLC, CAN datas and FMI number. + * @retval None. + */ +void CAN_Receive(CAN_TypeDef* CANx, uint8_t FIFONumber, CanRxMsg* RxMessage) +{ + /* Check the parameters */ + assert_param(IS_CAN_ALL_PERIPH(CANx)); + assert_param(IS_CAN_FIFO(FIFONumber)); + /* Get the Id */ + RxMessage->IDE = (uint8_t)0x04 & CANx->sFIFOMailBox[FIFONumber].RIR; + if (RxMessage->IDE == CAN_Id_Standard) + { + RxMessage->StdId = (uint32_t)0x000007FF & (CANx->sFIFOMailBox[FIFONumber].RIR >> 21); + } + else + { + RxMessage->ExtId = (uint32_t)0x1FFFFFFF & (CANx->sFIFOMailBox[FIFONumber].RIR >> 3); + } + + RxMessage->RTR = (uint8_t)0x02 & CANx->sFIFOMailBox[FIFONumber].RIR; + /* Get the DLC */ + RxMessage->DLC = (uint8_t)0x0F & CANx->sFIFOMailBox[FIFONumber].RDTR; + /* Get the FMI */ + RxMessage->FMI = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDTR >> 8); + /* Get the data field */ + RxMessage->Data[0] = (uint8_t)0xFF & CANx->sFIFOMailBox[FIFONumber].RDLR; + RxMessage->Data[1] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDLR >> 8); + RxMessage->Data[2] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDLR >> 16); + RxMessage->Data[3] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDLR >> 24); + RxMessage->Data[4] = (uint8_t)0xFF & CANx->sFIFOMailBox[FIFONumber].RDHR; + RxMessage->Data[5] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDHR >> 8); + RxMessage->Data[6] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDHR >> 16); + RxMessage->Data[7] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDHR >> 24); + /* Release the FIFO */ + /* Release FIFO0 */ + if (FIFONumber == CAN_FIFO0) + { + CANx->RF0R |= CAN_RF0R_RFOM0; + } + /* Release FIFO1 */ + else /* FIFONumber == CAN_FIFO1 */ + { + CANx->RF1R |= CAN_RF1R_RFOM1; + } +} + +/** + * @brief Releases the specified FIFO. + * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. + * @param FIFONumber: FIFO to release, CAN_FIFO0 or CAN_FIFO1. + * @retval None. + */ +void CAN_FIFORelease(CAN_TypeDef* CANx, uint8_t FIFONumber) +{ + /* Check the parameters */ + assert_param(IS_CAN_ALL_PERIPH(CANx)); + assert_param(IS_CAN_FIFO(FIFONumber)); + /* Release FIFO0 */ + if (FIFONumber == CAN_FIFO0) + { + CANx->RF0R |= CAN_RF0R_RFOM0; + } + /* Release FIFO1 */ + else /* FIFONumber == CAN_FIFO1 */ + { + CANx->RF1R |= CAN_RF1R_RFOM1; + } +} + +/** + * @brief Returns the number of pending messages. + * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. + * @param FIFONumber: Receive FIFO number, CAN_FIFO0 or CAN_FIFO1. + * @retval NbMessage : which is the number of pending message. + */ +uint8_t CAN_MessagePending(CAN_TypeDef* CANx, uint8_t FIFONumber) +{ + uint8_t message_pending=0; + /* Check the parameters */ + assert_param(IS_CAN_ALL_PERIPH(CANx)); + assert_param(IS_CAN_FIFO(FIFONumber)); + if (FIFONumber == CAN_FIFO0) + { + message_pending = (uint8_t)(CANx->RF0R&(uint32_t)0x03); + } + else if (FIFONumber == CAN_FIFO1) + { + message_pending = (uint8_t)(CANx->RF1R&(uint32_t)0x03); + } + else + { + message_pending = 0; + } + return message_pending; +} + + +/** + * @brief Select the CAN Operation mode. + * @param CAN_OperatingMode : CAN Operating Mode. This parameter can be one + * of @ref CAN_OperatingMode_TypeDef enumeration. + * @retval status of the requested mode which can be + * - CAN_ModeStatus_Failed CAN failed entering the specific mode + * - CAN_ModeStatus_Success CAN Succeed entering the specific mode + + */ +uint8_t CAN_OperatingModeRequest(CAN_TypeDef* CANx, uint8_t CAN_OperatingMode) +{ + uint8_t status = CAN_ModeStatus_Failed; + + /* Timeout for INAK or also for SLAK bits*/ + uint32_t timeout = INAK_TIMEOUT; + + /* Check the parameters */ + assert_param(IS_CAN_ALL_PERIPH(CANx)); + assert_param(IS_CAN_OPERATING_MODE(CAN_OperatingMode)); + + if (CAN_OperatingMode == CAN_OperatingMode_Initialization) + { + /* Request initialisation */ + CANx->MCR = (uint32_t)((CANx->MCR & (uint32_t)(~(uint32_t)CAN_MCR_SLEEP)) | CAN_MCR_INRQ); + + /* Wait the acknowledge */ + while (((CANx->MSR & CAN_MODE_MASK) != CAN_MSR_INAK) && (timeout != 0)) + { + timeout--; + } + if ((CANx->MSR & CAN_MODE_MASK) != CAN_MSR_INAK) + { + status = CAN_ModeStatus_Failed; + } + else + { + status = CAN_ModeStatus_Success; + } + } + else if (CAN_OperatingMode == CAN_OperatingMode_Normal) + { + /* Request leave initialisation and sleep mode and enter Normal mode */ + CANx->MCR &= (uint32_t)(~(CAN_MCR_SLEEP|CAN_MCR_INRQ)); + + /* Wait the acknowledge */ + while (((CANx->MSR & CAN_MODE_MASK) != 0) && (timeout!=0)) + { + timeout--; + } + if ((CANx->MSR & CAN_MODE_MASK) != 0) + { + status = CAN_ModeStatus_Failed; + } + else + { + status = CAN_ModeStatus_Success; + } + } + else if (CAN_OperatingMode == CAN_OperatingMode_Sleep) + { + /* Request Sleep mode */ + CANx->MCR = (uint32_t)((CANx->MCR & (uint32_t)(~(uint32_t)CAN_MCR_INRQ)) | CAN_MCR_SLEEP); + + /* Wait the acknowledge */ + while (((CANx->MSR & CAN_MODE_MASK) != CAN_MSR_SLAK) && (timeout!=0)) + { + timeout--; + } + if ((CANx->MSR & CAN_MODE_MASK) != CAN_MSR_SLAK) + { + status = CAN_ModeStatus_Failed; + } + else + { + status = CAN_ModeStatus_Success; + } + } + else + { + status = CAN_ModeStatus_Failed; + } + + return (uint8_t) status; +} + +/** + * @brief Enters the low power mode. + * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. + * @retval status: CAN_Sleep_Ok if sleep entered, CAN_Sleep_Failed in an + * other case. + */ +uint8_t CAN_Sleep(CAN_TypeDef* CANx) +{ + uint8_t sleepstatus = CAN_Sleep_Failed; + + /* Check the parameters */ + assert_param(IS_CAN_ALL_PERIPH(CANx)); + + /* Request Sleep mode */ + CANx->MCR = (((CANx->MCR) & (uint32_t)(~(uint32_t)CAN_MCR_INRQ)) | CAN_MCR_SLEEP); + + /* Sleep mode status */ + if ((CANx->MSR & (CAN_MSR_SLAK|CAN_MSR_INAK)) == CAN_MSR_SLAK) + { + /* Sleep mode not entered */ + sleepstatus = CAN_Sleep_Ok; + } + /* return sleep mode status */ + return (uint8_t)sleepstatus; +} + +/** + * @brief Wakes the CAN up. + * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. + * @retval status: CAN_WakeUp_Ok if sleep mode left, CAN_WakeUp_Failed in an + * other case. + */ +uint8_t CAN_WakeUp(CAN_TypeDef* CANx) +{ + uint32_t wait_slak = SLAK_TIMEOUT; + uint8_t wakeupstatus = CAN_WakeUp_Failed; + + /* Check the parameters */ + assert_param(IS_CAN_ALL_PERIPH(CANx)); + + /* Wake up request */ + CANx->MCR &= ~(uint32_t)CAN_MCR_SLEEP; + + /* Sleep mode status */ + while(((CANx->MSR & CAN_MSR_SLAK) == CAN_MSR_SLAK)&&(wait_slak!=0x00)) + { + wait_slak--; + } + if((CANx->MSR & CAN_MSR_SLAK) != CAN_MSR_SLAK) + { + /* wake up done : Sleep mode exited */ + wakeupstatus = CAN_WakeUp_Ok; + } + /* return wakeup status */ + return (uint8_t)wakeupstatus; +} + + +/** + * @brief Returns the CANx's last error code (LEC). + * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. + * @retval CAN_ErrorCode: specifies the Error code : + * - CAN_ERRORCODE_NoErr No Error + * - CAN_ERRORCODE_StuffErr Stuff Error + * - CAN_ERRORCODE_FormErr Form Error + * - CAN_ERRORCODE_ACKErr Acknowledgment Error + * - CAN_ERRORCODE_BitRecessiveErr Bit Recessive Error + * - CAN_ERRORCODE_BitDominantErr Bit Dominant Error + * - CAN_ERRORCODE_CRCErr CRC Error + * - CAN_ERRORCODE_SoftwareSetErr Software Set Error + */ + +uint8_t CAN_GetLastErrorCode(CAN_TypeDef* CANx) +{ + uint8_t errorcode=0; + + /* Check the parameters */ + assert_param(IS_CAN_ALL_PERIPH(CANx)); + + /* Get the error code*/ + errorcode = (((uint8_t)CANx->ESR) & (uint8_t)CAN_ESR_LEC); + + /* Return the error code*/ + return errorcode; +} +/** + * @brief Returns the CANx Receive Error Counter (REC). + * @note In case of an error during reception, this counter is incremented + * by 1 or by 8 depending on the error condition as defined by the CAN + * standard. After every successful reception, the counter is + * decremented by 1 or reset to 120 if its value was higher than 128. + * When the counter value exceeds 127, the CAN controller enters the + * error passive state. + * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. + * @retval CAN Receive Error Counter. + */ +uint8_t CAN_GetReceiveErrorCounter(CAN_TypeDef* CANx) +{ + uint8_t counter=0; + + /* Check the parameters */ + assert_param(IS_CAN_ALL_PERIPH(CANx)); + + /* Get the Receive Error Counter*/ + counter = (uint8_t)((CANx->ESR & CAN_ESR_REC)>> 24); + + /* Return the Receive Error Counter*/ + return counter; +} + + +/** + * @brief Returns the LSB of the 9-bit CANx Transmit Error Counter(TEC). + * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. + * @retval LSB of the 9-bit CAN Transmit Error Counter. + */ +uint8_t CAN_GetLSBTransmitErrorCounter(CAN_TypeDef* CANx) +{ + uint8_t counter=0; + + /* Check the parameters */ + assert_param(IS_CAN_ALL_PERIPH(CANx)); + + /* Get the LSB of the 9-bit CANx Transmit Error Counter(TEC) */ + counter = (uint8_t)((CANx->ESR & CAN_ESR_TEC)>> 16); + + /* Return the LSB of the 9-bit CANx Transmit Error Counter(TEC) */ + return counter; +} + + +/** + * @brief Enables or disables the specified CANx interrupts. + * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. + * @param CAN_IT: specifies the CAN interrupt sources to be enabled or disabled. + * This parameter can be: + * - CAN_IT_TME, + * - CAN_IT_FMP0, + * - CAN_IT_FF0, + * - CAN_IT_FOV0, + * - CAN_IT_FMP1, + * - CAN_IT_FF1, + * - CAN_IT_FOV1, + * - CAN_IT_EWG, + * - CAN_IT_EPV, + * - CAN_IT_LEC, + * - CAN_IT_ERR, + * - CAN_IT_WKU or + * - CAN_IT_SLK. + * @param NewState: new state of the CAN interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval None. + */ +void CAN_ITConfig(CAN_TypeDef* CANx, uint32_t CAN_IT, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_CAN_ALL_PERIPH(CANx)); + assert_param(IS_CAN_IT(CAN_IT)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected CANx interrupt */ + CANx->IER |= CAN_IT; + } + else + { + /* Disable the selected CANx interrupt */ + CANx->IER &= ~CAN_IT; + } +} +/** + * @brief Checks whether the specified CAN flag is set or not. + * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. + * @param CAN_FLAG: specifies the flag to check. + * This parameter can be one of the following flags: + * - CAN_FLAG_EWG + * - CAN_FLAG_EPV + * - CAN_FLAG_BOF + * - CAN_FLAG_RQCP0 + * - CAN_FLAG_RQCP1 + * - CAN_FLAG_RQCP2 + * - CAN_FLAG_FMP1 + * - CAN_FLAG_FF1 + * - CAN_FLAG_FOV1 + * - CAN_FLAG_FMP0 + * - CAN_FLAG_FF0 + * - CAN_FLAG_FOV0 + * - CAN_FLAG_WKU + * - CAN_FLAG_SLAK + * - CAN_FLAG_LEC + * @retval The new state of CAN_FLAG (SET or RESET). + */ +FlagStatus CAN_GetFlagStatus(CAN_TypeDef* CANx, uint32_t CAN_FLAG) +{ + FlagStatus bitstatus = RESET; + + /* Check the parameters */ + assert_param(IS_CAN_ALL_PERIPH(CANx)); + assert_param(IS_CAN_GET_FLAG(CAN_FLAG)); + + + if((CAN_FLAG & CAN_FLAGS_ESR) != (uint32_t)RESET) + { + /* Check the status of the specified CAN flag */ + if ((CANx->ESR & (CAN_FLAG & 0x000FFFFF)) != (uint32_t)RESET) + { + /* CAN_FLAG is set */ + bitstatus = SET; + } + else + { + /* CAN_FLAG is reset */ + bitstatus = RESET; + } + } + else if((CAN_FLAG & CAN_FLAGS_MSR) != (uint32_t)RESET) + { + /* Check the status of the specified CAN flag */ + if ((CANx->MSR & (CAN_FLAG & 0x000FFFFF)) != (uint32_t)RESET) + { + /* CAN_FLAG is set */ + bitstatus = SET; + } + else + { + /* CAN_FLAG is reset */ + bitstatus = RESET; + } + } + else if((CAN_FLAG & CAN_FLAGS_TSR) != (uint32_t)RESET) + { + /* Check the status of the specified CAN flag */ + if ((CANx->TSR & (CAN_FLAG & 0x000FFFFF)) != (uint32_t)RESET) + { + /* CAN_FLAG is set */ + bitstatus = SET; + } + else + { + /* CAN_FLAG is reset */ + bitstatus = RESET; + } + } + else if((CAN_FLAG & CAN_FLAGS_RF0R) != (uint32_t)RESET) + { + /* Check the status of the specified CAN flag */ + if ((CANx->RF0R & (CAN_FLAG & 0x000FFFFF)) != (uint32_t)RESET) + { + /* CAN_FLAG is set */ + bitstatus = SET; + } + else + { + /* CAN_FLAG is reset */ + bitstatus = RESET; + } + } + else /* If(CAN_FLAG & CAN_FLAGS_RF1R != (uint32_t)RESET) */ + { + /* Check the status of the specified CAN flag */ + if ((uint32_t)(CANx->RF1R & (CAN_FLAG & 0x000FFFFF)) != (uint32_t)RESET) + { + /* CAN_FLAG is set */ + bitstatus = SET; + } + else + { + /* CAN_FLAG is reset */ + bitstatus = RESET; + } + } + /* Return the CAN_FLAG status */ + return bitstatus; +} + +/** + * @brief Clears the CAN's pending flags. + * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. + * @param CAN_FLAG: specifies the flag to clear. + * This parameter can be one of the following flags: + * - CAN_FLAG_RQCP0 + * - CAN_FLAG_RQCP1 + * - CAN_FLAG_RQCP2 + * - CAN_FLAG_FF1 + * - CAN_FLAG_FOV1 + * - CAN_FLAG_FF0 + * - CAN_FLAG_FOV0 + * - CAN_FLAG_WKU + * - CAN_FLAG_SLAK + * - CAN_FLAG_LEC + * @retval None. + */ +void CAN_ClearFlag(CAN_TypeDef* CANx, uint32_t CAN_FLAG) +{ + uint32_t flagtmp=0; + /* Check the parameters */ + assert_param(IS_CAN_ALL_PERIPH(CANx)); + assert_param(IS_CAN_CLEAR_FLAG(CAN_FLAG)); + + if (CAN_FLAG == CAN_FLAG_LEC) /* ESR register */ + { + /* Clear the selected CAN flags */ + CANx->ESR = (uint32_t)RESET; + } + else /* MSR or TSR or RF0R or RF1R */ + { + flagtmp = CAN_FLAG & 0x000FFFFF; + + if ((CAN_FLAG & CAN_FLAGS_RF0R)!=(uint32_t)RESET) + { + /* Receive Flags */ + CANx->RF0R = (uint32_t)(flagtmp); + } + else if ((CAN_FLAG & CAN_FLAGS_RF1R)!=(uint32_t)RESET) + { + /* Receive Flags */ + CANx->RF1R = (uint32_t)(flagtmp); + } + else if ((CAN_FLAG & CAN_FLAGS_TSR)!=(uint32_t)RESET) + { + /* Transmit Flags */ + CANx->TSR = (uint32_t)(flagtmp); + } + else /* If((CAN_FLAG & CAN_FLAGS_MSR)!=(uint32_t)RESET) */ + { + /* Operating mode Flags */ + CANx->MSR = (uint32_t)(flagtmp); + } + } +} + +/** + * @brief Checks whether the specified CANx interrupt has occurred or not. + * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. + * @param CAN_IT: specifies the CAN interrupt source to check. + * This parameter can be one of the following flags: + * - CAN_IT_TME + * - CAN_IT_FMP0 + * - CAN_IT_FF0 + * - CAN_IT_FOV0 + * - CAN_IT_FMP1 + * - CAN_IT_FF1 + * - CAN_IT_FOV1 + * - CAN_IT_WKU + * - CAN_IT_SLK + * - CAN_IT_EWG + * - CAN_IT_EPV + * - CAN_IT_BOF + * - CAN_IT_LEC + * - CAN_IT_ERR + * @retval The current state of CAN_IT (SET or RESET). + */ +ITStatus CAN_GetITStatus(CAN_TypeDef* CANx, uint32_t CAN_IT) +{ + ITStatus itstatus = RESET; + /* Check the parameters */ + assert_param(IS_CAN_ALL_PERIPH(CANx)); + assert_param(IS_CAN_IT(CAN_IT)); + + /* check the enable interrupt bit */ + if((CANx->IER & CAN_IT) != RESET) + { + /* in case the Interrupt is enabled, .... */ + switch (CAN_IT) + { + case CAN_IT_TME: + /* Check CAN_TSR_RQCPx bits */ + itstatus = CheckITStatus(CANx->TSR, CAN_TSR_RQCP0|CAN_TSR_RQCP1|CAN_TSR_RQCP2); + break; + case CAN_IT_FMP0: + /* Check CAN_RF0R_FMP0 bit */ + itstatus = CheckITStatus(CANx->RF0R, CAN_RF0R_FMP0); + break; + case CAN_IT_FF0: + /* Check CAN_RF0R_FULL0 bit */ + itstatus = CheckITStatus(CANx->RF0R, CAN_RF0R_FULL0); + break; + case CAN_IT_FOV0: + /* Check CAN_RF0R_FOVR0 bit */ + itstatus = CheckITStatus(CANx->RF0R, CAN_RF0R_FOVR0); + break; + case CAN_IT_FMP1: + /* Check CAN_RF1R_FMP1 bit */ + itstatus = CheckITStatus(CANx->RF1R, CAN_RF1R_FMP1); + break; + case CAN_IT_FF1: + /* Check CAN_RF1R_FULL1 bit */ + itstatus = CheckITStatus(CANx->RF1R, CAN_RF1R_FULL1); + break; + case CAN_IT_FOV1: + /* Check CAN_RF1R_FOVR1 bit */ + itstatus = CheckITStatus(CANx->RF1R, CAN_RF1R_FOVR1); + break; + case CAN_IT_WKU: + /* Check CAN_MSR_WKUI bit */ + itstatus = CheckITStatus(CANx->MSR, CAN_MSR_WKUI); + break; + case CAN_IT_SLK: + /* Check CAN_MSR_SLAKI bit */ + itstatus = CheckITStatus(CANx->MSR, CAN_MSR_SLAKI); + break; + case CAN_IT_EWG: + /* Check CAN_ESR_EWGF bit */ + itstatus = CheckITStatus(CANx->ESR, CAN_ESR_EWGF); + break; + case CAN_IT_EPV: + /* Check CAN_ESR_EPVF bit */ + itstatus = CheckITStatus(CANx->ESR, CAN_ESR_EPVF); + break; + case CAN_IT_BOF: + /* Check CAN_ESR_BOFF bit */ + itstatus = CheckITStatus(CANx->ESR, CAN_ESR_BOFF); + break; + case CAN_IT_LEC: + /* Check CAN_ESR_LEC bit */ + itstatus = CheckITStatus(CANx->ESR, CAN_ESR_LEC); + break; + case CAN_IT_ERR: + /* Check CAN_MSR_ERRI bit */ + itstatus = CheckITStatus(CANx->MSR, CAN_MSR_ERRI); + break; + default : + /* in case of error, return RESET */ + itstatus = RESET; + break; + } + } + else + { + /* in case the Interrupt is not enabled, return RESET */ + itstatus = RESET; + } + + /* Return the CAN_IT status */ + return itstatus; +} + +/** + * @brief Clears the CANx's interrupt pending bits. + * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. + * @param CAN_IT: specifies the interrupt pending bit to clear. + * - CAN_IT_TME + * - CAN_IT_FF0 + * - CAN_IT_FOV0 + * - CAN_IT_FF1 + * - CAN_IT_FOV1 + * - CAN_IT_WKU + * - CAN_IT_SLK + * - CAN_IT_EWG + * - CAN_IT_EPV + * - CAN_IT_BOF + * - CAN_IT_LEC + * - CAN_IT_ERR + * @retval None. + */ +void CAN_ClearITPendingBit(CAN_TypeDef* CANx, uint32_t CAN_IT) +{ + /* Check the parameters */ + assert_param(IS_CAN_ALL_PERIPH(CANx)); + assert_param(IS_CAN_CLEAR_IT(CAN_IT)); + + switch (CAN_IT) + { + case CAN_IT_TME: + /* Clear CAN_TSR_RQCPx (rc_w1)*/ + CANx->TSR = CAN_TSR_RQCP0|CAN_TSR_RQCP1|CAN_TSR_RQCP2; + break; + case CAN_IT_FF0: + /* Clear CAN_RF0R_FULL0 (rc_w1)*/ + CANx->RF0R = CAN_RF0R_FULL0; + break; + case CAN_IT_FOV0: + /* Clear CAN_RF0R_FOVR0 (rc_w1)*/ + CANx->RF0R = CAN_RF0R_FOVR0; + break; + case CAN_IT_FF1: + /* Clear CAN_RF1R_FULL1 (rc_w1)*/ + CANx->RF1R = CAN_RF1R_FULL1; + break; + case CAN_IT_FOV1: + /* Clear CAN_RF1R_FOVR1 (rc_w1)*/ + CANx->RF1R = CAN_RF1R_FOVR1; + break; + case CAN_IT_WKU: + /* Clear CAN_MSR_WKUI (rc_w1)*/ + CANx->MSR = CAN_MSR_WKUI; + break; + case CAN_IT_SLK: + /* Clear CAN_MSR_SLAKI (rc_w1)*/ + CANx->MSR = CAN_MSR_SLAKI; + break; + case CAN_IT_EWG: + /* Clear CAN_MSR_ERRI (rc_w1) */ + CANx->MSR = CAN_MSR_ERRI; + /* Note : the corresponding Flag is cleared by hardware depending + of the CAN Bus status*/ + break; + case CAN_IT_EPV: + /* Clear CAN_MSR_ERRI (rc_w1) */ + CANx->MSR = CAN_MSR_ERRI; + /* Note : the corresponding Flag is cleared by hardware depending + of the CAN Bus status*/ + break; + case CAN_IT_BOF: + /* Clear CAN_MSR_ERRI (rc_w1) */ + CANx->MSR = CAN_MSR_ERRI; + /* Note : the corresponding Flag is cleared by hardware depending + of the CAN Bus status*/ + break; + case CAN_IT_LEC: + /* Clear LEC bits */ + CANx->ESR = RESET; + /* Clear CAN_MSR_ERRI (rc_w1) */ + CANx->MSR = CAN_MSR_ERRI; + break; + case CAN_IT_ERR: + /*Clear LEC bits */ + CANx->ESR = RESET; + /* Clear CAN_MSR_ERRI (rc_w1) */ + CANx->MSR = CAN_MSR_ERRI; + /* Note : BOFF, EPVF and EWGF Flags are cleared by hardware depending + of the CAN Bus status*/ + break; + default : + break; + } +} + +/** + * @brief Checks whether the CAN interrupt has occurred or not. + * @param CAN_Reg: specifies the CAN interrupt register to check. + * @param It_Bit: specifies the interrupt source bit to check. + * @retval The new state of the CAN Interrupt (SET or RESET). + */ +static ITStatus CheckITStatus(uint32_t CAN_Reg, uint32_t It_Bit) +{ + ITStatus pendingbitstatus = RESET; + + if ((CAN_Reg & It_Bit) != (uint32_t)RESET) + { + /* CAN_IT is set */ + pendingbitstatus = SET; + } + else + { + /* CAN_IT is reset */ + pendingbitstatus = RESET; + } + return pendingbitstatus; +} + + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_cec.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_cec.c new file mode 100644 index 0000000..08b501a --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_cec.c @@ -0,0 +1,433 @@ +/** + ****************************************************************************** + * @file stm32f10x_cec.c + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief This file provides all the CEC firmware functions. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_cec.h" +#include "stm32f10x_rcc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup CEC + * @brief CEC driver modules + * @{ + */ + +/** @defgroup CEC_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + + +/** @defgroup CEC_Private_Defines + * @{ + */ + +/* ------------ CEC registers bit address in the alias region ----------- */ +#define CEC_OFFSET (CEC_BASE - PERIPH_BASE) + +/* --- CFGR Register ---*/ + +/* Alias word address of PE bit */ +#define CFGR_OFFSET (CEC_OFFSET + 0x00) +#define PE_BitNumber 0x00 +#define CFGR_PE_BB (PERIPH_BB_BASE + (CFGR_OFFSET * 32) + (PE_BitNumber * 4)) + +/* Alias word address of IE bit */ +#define IE_BitNumber 0x01 +#define CFGR_IE_BB (PERIPH_BB_BASE + (CFGR_OFFSET * 32) + (IE_BitNumber * 4)) + +/* --- CSR Register ---*/ + +/* Alias word address of TSOM bit */ +#define CSR_OFFSET (CEC_OFFSET + 0x10) +#define TSOM_BitNumber 0x00 +#define CSR_TSOM_BB (PERIPH_BB_BASE + (CSR_OFFSET * 32) + (TSOM_BitNumber * 4)) + +/* Alias word address of TEOM bit */ +#define TEOM_BitNumber 0x01 +#define CSR_TEOM_BB (PERIPH_BB_BASE + (CSR_OFFSET * 32) + (TEOM_BitNumber * 4)) + +#define CFGR_CLEAR_Mask (uint8_t)(0xF3) /* CFGR register Mask */ +#define FLAG_Mask ((uint32_t)0x00FFFFFF) /* CEC FLAG mask */ + +/** + * @} + */ + + +/** @defgroup CEC_Private_Macros + * @{ + */ + +/** + * @} + */ + + +/** @defgroup CEC_Private_Variables + * @{ + */ + +/** + * @} + */ + + +/** @defgroup CEC_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + + +/** @defgroup CEC_Private_Functions + * @{ + */ + +/** + * @brief Deinitializes the CEC peripheral registers to their default reset + * values. + * @param None + * @retval None + */ +void CEC_DeInit(void) +{ + /* Enable CEC reset state */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_CEC, ENABLE); + /* Release CEC from reset state */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_CEC, DISABLE); +} + + +/** + * @brief Initializes the CEC peripheral according to the specified + * parameters in the CEC_InitStruct. + * @param CEC_InitStruct: pointer to an CEC_InitTypeDef structure that + * contains the configuration information for the specified + * CEC peripheral. + * @retval None + */ +void CEC_Init(CEC_InitTypeDef* CEC_InitStruct) +{ + uint16_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_CEC_BIT_TIMING_ERROR_MODE(CEC_InitStruct->CEC_BitTimingMode)); + assert_param(IS_CEC_BIT_PERIOD_ERROR_MODE(CEC_InitStruct->CEC_BitPeriodMode)); + + /*---------------------------- CEC CFGR Configuration -----------------*/ + /* Get the CEC CFGR value */ + tmpreg = CEC->CFGR; + + /* Clear BTEM and BPEM bits */ + tmpreg &= CFGR_CLEAR_Mask; + + /* Configure CEC: Bit Timing Error and Bit Period Error */ + tmpreg |= (uint16_t)(CEC_InitStruct->CEC_BitTimingMode | CEC_InitStruct->CEC_BitPeriodMode); + + /* Write to CEC CFGR register*/ + CEC->CFGR = tmpreg; + +} + +/** + * @brief Enables or disables the specified CEC peripheral. + * @param NewState: new state of the CEC peripheral. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void CEC_Cmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) CFGR_PE_BB = (uint32_t)NewState; + + if(NewState == DISABLE) + { + /* Wait until the PE bit is cleared by hardware (Idle Line detected) */ + while((CEC->CFGR & CEC_CFGR_PE) != (uint32_t)RESET) + { + } + } +} + +/** + * @brief Enables or disables the CEC interrupt. + * @param NewState: new state of the CEC interrupt. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void CEC_ITConfig(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) CFGR_IE_BB = (uint32_t)NewState; +} + +/** + * @brief Defines the Own Address of the CEC device. + * @param CEC_OwnAddress: The CEC own address + * @retval None + */ +void CEC_OwnAddressConfig(uint8_t CEC_OwnAddress) +{ + /* Check the parameters */ + assert_param(IS_CEC_ADDRESS(CEC_OwnAddress)); + + /* Set the CEC own address */ + CEC->OAR = CEC_OwnAddress; +} + +/** + * @brief Sets the CEC prescaler value. + * @param CEC_Prescaler: CEC prescaler new value + * @retval None + */ +void CEC_SetPrescaler(uint16_t CEC_Prescaler) +{ + /* Check the parameters */ + assert_param(IS_CEC_PRESCALER(CEC_Prescaler)); + + /* Set the Prescaler value*/ + CEC->PRES = CEC_Prescaler; +} + +/** + * @brief Transmits single data through the CEC peripheral. + * @param Data: the data to transmit. + * @retval None + */ +void CEC_SendDataByte(uint8_t Data) +{ + /* Transmit Data */ + CEC->TXD = Data ; +} + + +/** + * @brief Returns the most recent received data by the CEC peripheral. + * @param None + * @retval The received data. + */ +uint8_t CEC_ReceiveDataByte(void) +{ + /* Receive Data */ + return (uint8_t)(CEC->RXD); +} + +/** + * @brief Starts a new message. + * @param None + * @retval None + */ +void CEC_StartOfMessage(void) +{ + /* Starts of new message */ + *(__IO uint32_t *) CSR_TSOM_BB = (uint32_t)0x1; +} + +/** + * @brief Transmits message with or without an EOM bit. + * @param NewState: new state of the CEC Tx End Of Message. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void CEC_EndOfMessageCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + /* The data byte will be transmitted with or without an EOM bit*/ + *(__IO uint32_t *) CSR_TEOM_BB = (uint32_t)NewState; +} + +/** + * @brief Gets the CEC flag status + * @param CEC_FLAG: specifies the CEC flag to check. + * This parameter can be one of the following values: + * @arg CEC_FLAG_BTE: Bit Timing Error + * @arg CEC_FLAG_BPE: Bit Period Error + * @arg CEC_FLAG_RBTFE: Rx Block Transfer Finished Error + * @arg CEC_FLAG_SBE: Start Bit Error + * @arg CEC_FLAG_ACKE: Block Acknowledge Error + * @arg CEC_FLAG_LINE: Line Error + * @arg CEC_FLAG_TBTFE: Tx Block Transfer Finished Error + * @arg CEC_FLAG_TEOM: Tx End Of Message + * @arg CEC_FLAG_TERR: Tx Error + * @arg CEC_FLAG_TBTRF: Tx Byte Transfer Request or Block Transfer Finished + * @arg CEC_FLAG_RSOM: Rx Start Of Message + * @arg CEC_FLAG_REOM: Rx End Of Message + * @arg CEC_FLAG_RERR: Rx Error + * @arg CEC_FLAG_RBTF: Rx Byte/Block Transfer Finished + * @retval The new state of CEC_FLAG (SET or RESET) + */ +FlagStatus CEC_GetFlagStatus(uint32_t CEC_FLAG) +{ + FlagStatus bitstatus = RESET; + uint32_t cecreg = 0, cecbase = 0; + + /* Check the parameters */ + assert_param(IS_CEC_GET_FLAG(CEC_FLAG)); + + /* Get the CEC peripheral base address */ + cecbase = (uint32_t)(CEC_BASE); + + /* Read flag register index */ + cecreg = CEC_FLAG >> 28; + + /* Get bit[23:0] of the flag */ + CEC_FLAG &= FLAG_Mask; + + if(cecreg != 0) + { + /* Flag in CEC ESR Register */ + CEC_FLAG = (uint32_t)(CEC_FLAG >> 16); + + /* Get the CEC ESR register address */ + cecbase += 0xC; + } + else + { + /* Get the CEC CSR register address */ + cecbase += 0x10; + } + + if(((*(__IO uint32_t *)cecbase) & CEC_FLAG) != (uint32_t)RESET) + { + /* CEC_FLAG is set */ + bitstatus = SET; + } + else + { + /* CEC_FLAG is reset */ + bitstatus = RESET; + } + + /* Return the CEC_FLAG status */ + return bitstatus; +} + +/** + * @brief Clears the CEC's pending flags. + * @param CEC_FLAG: specifies the flag to clear. + * This parameter can be any combination of the following values: + * @arg CEC_FLAG_TERR: Tx Error + * @arg CEC_FLAG_TBTRF: Tx Byte Transfer Request or Block Transfer Finished + * @arg CEC_FLAG_RSOM: Rx Start Of Message + * @arg CEC_FLAG_REOM: Rx End Of Message + * @arg CEC_FLAG_RERR: Rx Error + * @arg CEC_FLAG_RBTF: Rx Byte/Block Transfer Finished + * @retval None + */ +void CEC_ClearFlag(uint32_t CEC_FLAG) +{ + uint32_t tmp = 0x0; + + /* Check the parameters */ + assert_param(IS_CEC_CLEAR_FLAG(CEC_FLAG)); + + tmp = CEC->CSR & 0x2; + + /* Clear the selected CEC flags */ + CEC->CSR &= (uint32_t)(((~(uint32_t)CEC_FLAG) & 0xFFFFFFFC) | tmp); +} + +/** + * @brief Checks whether the specified CEC interrupt has occurred or not. + * @param CEC_IT: specifies the CEC interrupt source to check. + * This parameter can be one of the following values: + * @arg CEC_IT_TERR: Tx Error + * @arg CEC_IT_TBTF: Tx Block Transfer Finished + * @arg CEC_IT_RERR: Rx Error + * @arg CEC_IT_RBTF: Rx Block Transfer Finished + * @retval The new state of CEC_IT (SET or RESET). + */ +ITStatus CEC_GetITStatus(uint8_t CEC_IT) +{ + ITStatus bitstatus = RESET; + uint32_t enablestatus = 0; + + /* Check the parameters */ + assert_param(IS_CEC_GET_IT(CEC_IT)); + + /* Get the CEC IT enable bit status */ + enablestatus = (CEC->CFGR & (uint8_t)CEC_CFGR_IE) ; + + /* Check the status of the specified CEC interrupt */ + if (((CEC->CSR & CEC_IT) != (uint32_t)RESET) && enablestatus) + { + /* CEC_IT is set */ + bitstatus = SET; + } + else + { + /* CEC_IT is reset */ + bitstatus = RESET; + } + /* Return the CEC_IT status */ + return bitstatus; +} + +/** + * @brief Clears the CEC's interrupt pending bits. + * @param CEC_IT: specifies the CEC interrupt pending bit to clear. + * This parameter can be any combination of the following values: + * @arg CEC_IT_TERR: Tx Error + * @arg CEC_IT_TBTF: Tx Block Transfer Finished + * @arg CEC_IT_RERR: Rx Error + * @arg CEC_IT_RBTF: Rx Block Transfer Finished + * @retval None + */ +void CEC_ClearITPendingBit(uint16_t CEC_IT) +{ + uint32_t tmp = 0x0; + + /* Check the parameters */ + assert_param(IS_CEC_GET_IT(CEC_IT)); + + tmp = CEC->CSR & 0x2; + + /* Clear the selected CEC interrupt pending bits */ + CEC->CSR &= (uint32_t)(((~(uint32_t)CEC_IT) & 0xFFFFFFFC) | tmp); +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_crc.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_crc.c new file mode 100644 index 0000000..ef0c047 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_crc.c @@ -0,0 +1,160 @@ +/** + ****************************************************************************** + * @file stm32f10x_crc.c + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief This file provides all the CRC firmware functions. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_crc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup CRC + * @brief CRC driver modules + * @{ + */ + +/** @defgroup CRC_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup CRC_Private_Defines + * @{ + */ + +/** + * @} + */ + +/** @defgroup CRC_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup CRC_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup CRC_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup CRC_Private_Functions + * @{ + */ + +/** + * @brief Resets the CRC Data register (DR). + * @param None + * @retval None + */ +void CRC_ResetDR(void) +{ + /* Reset CRC generator */ + CRC->CR = CRC_CR_RESET; +} + +/** + * @brief Computes the 32-bit CRC of a given data word(32-bit). + * @param Data: data word(32-bit) to compute its CRC + * @retval 32-bit CRC + */ +uint32_t CRC_CalcCRC(uint32_t Data) +{ + CRC->DR = Data; + + return (CRC->DR); +} + +/** + * @brief Computes the 32-bit CRC of a given buffer of data word(32-bit). + * @param pBuffer: pointer to the buffer containing the data to be computed + * @param BufferLength: length of the buffer to be computed + * @retval 32-bit CRC + */ +uint32_t CRC_CalcBlockCRC(uint32_t pBuffer[], uint32_t BufferLength) +{ + uint32_t index = 0; + + for(index = 0; index < BufferLength; index++) + { + CRC->DR = pBuffer[index]; + } + return (CRC->DR); +} + +/** + * @brief Returns the current CRC value. + * @param None + * @retval 32-bit CRC + */ +uint32_t CRC_GetCRC(void) +{ + return (CRC->DR); +} + +/** + * @brief Stores a 8-bit data in the Independent Data(ID) register. + * @param IDValue: 8-bit value to be stored in the ID register + * @retval None + */ +void CRC_SetIDRegister(uint8_t IDValue) +{ + CRC->IDR = IDValue; +} + +/** + * @brief Returns the 8-bit data stored in the Independent Data(ID) register + * @param None + * @retval 8-bit value of the ID register + */ +uint8_t CRC_GetIDRegister(void) +{ + return (CRC->IDR); +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_dac.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_dac.c new file mode 100644 index 0000000..025b8e2 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_dac.c @@ -0,0 +1,571 @@ +/** + ****************************************************************************** + * @file stm32f10x_dac.c + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief This file provides all the DAC firmware functions. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_dac.h" +#include "stm32f10x_rcc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup DAC + * @brief DAC driver modules + * @{ + */ + +/** @defgroup DAC_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup DAC_Private_Defines + * @{ + */ + +/* CR register Mask */ +#define CR_CLEAR_MASK ((uint32_t)0x00000FFE) + +/* DAC Dual Channels SWTRIG masks */ +#define DUAL_SWTRIG_SET ((uint32_t)0x00000003) +#define DUAL_SWTRIG_RESET ((uint32_t)0xFFFFFFFC) + +/* DHR registers offsets */ +#define DHR12R1_OFFSET ((uint32_t)0x00000008) +#define DHR12R2_OFFSET ((uint32_t)0x00000014) +#define DHR12RD_OFFSET ((uint32_t)0x00000020) + +/* DOR register offset */ +#define DOR_OFFSET ((uint32_t)0x0000002C) +/** + * @} + */ + +/** @defgroup DAC_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup DAC_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup DAC_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup DAC_Private_Functions + * @{ + */ + +/** + * @brief Deinitializes the DAC peripheral registers to their default reset values. + * @param None + * @retval None + */ +void DAC_DeInit(void) +{ + /* Enable DAC reset state */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_DAC, ENABLE); + /* Release DAC from reset state */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_DAC, DISABLE); +} + +/** + * @brief Initializes the DAC peripheral according to the specified + * parameters in the DAC_InitStruct. + * @param DAC_Channel: the selected DAC channel. + * This parameter can be one of the following values: + * @arg DAC_Channel_1: DAC Channel1 selected + * @arg DAC_Channel_2: DAC Channel2 selected + * @param DAC_InitStruct: pointer to a DAC_InitTypeDef structure that + * contains the configuration information for the specified DAC channel. + * @retval None + */ +void DAC_Init(uint32_t DAC_Channel, DAC_InitTypeDef* DAC_InitStruct) +{ + uint32_t tmpreg1 = 0, tmpreg2 = 0; + /* Check the DAC parameters */ + assert_param(IS_DAC_TRIGGER(DAC_InitStruct->DAC_Trigger)); + assert_param(IS_DAC_GENERATE_WAVE(DAC_InitStruct->DAC_WaveGeneration)); + assert_param(IS_DAC_LFSR_UNMASK_TRIANGLE_AMPLITUDE(DAC_InitStruct->DAC_LFSRUnmask_TriangleAmplitude)); + assert_param(IS_DAC_OUTPUT_BUFFER_STATE(DAC_InitStruct->DAC_OutputBuffer)); +/*---------------------------- DAC CR Configuration --------------------------*/ + /* Get the DAC CR value */ + tmpreg1 = DAC->CR; + /* Clear BOFFx, TENx, TSELx, WAVEx and MAMPx bits */ + tmpreg1 &= ~(CR_CLEAR_MASK << DAC_Channel); + /* Configure for the selected DAC channel: buffer output, trigger, wave generation, + mask/amplitude for wave generation */ + /* Set TSELx and TENx bits according to DAC_Trigger value */ + /* Set WAVEx bits according to DAC_WaveGeneration value */ + /* Set MAMPx bits according to DAC_LFSRUnmask_TriangleAmplitude value */ + /* Set BOFFx bit according to DAC_OutputBuffer value */ + tmpreg2 = (DAC_InitStruct->DAC_Trigger | DAC_InitStruct->DAC_WaveGeneration | + DAC_InitStruct->DAC_LFSRUnmask_TriangleAmplitude | DAC_InitStruct->DAC_OutputBuffer); + /* Calculate CR register value depending on DAC_Channel */ + tmpreg1 |= tmpreg2 << DAC_Channel; + /* Write to DAC CR */ + DAC->CR = tmpreg1; +} + +/** + * @brief Fills each DAC_InitStruct member with its default value. + * @param DAC_InitStruct : pointer to a DAC_InitTypeDef structure which will + * be initialized. + * @retval None + */ +void DAC_StructInit(DAC_InitTypeDef* DAC_InitStruct) +{ +/*--------------- Reset DAC init structure parameters values -----------------*/ + /* Initialize the DAC_Trigger member */ + DAC_InitStruct->DAC_Trigger = DAC_Trigger_None; + /* Initialize the DAC_WaveGeneration member */ + DAC_InitStruct->DAC_WaveGeneration = DAC_WaveGeneration_None; + /* Initialize the DAC_LFSRUnmask_TriangleAmplitude member */ + DAC_InitStruct->DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0; + /* Initialize the DAC_OutputBuffer member */ + DAC_InitStruct->DAC_OutputBuffer = DAC_OutputBuffer_Enable; +} + +/** + * @brief Enables or disables the specified DAC channel. + * @param DAC_Channel: the selected DAC channel. + * This parameter can be one of the following values: + * @arg DAC_Channel_1: DAC Channel1 selected + * @arg DAC_Channel_2: DAC Channel2 selected + * @param NewState: new state of the DAC channel. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void DAC_Cmd(uint32_t DAC_Channel, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_DAC_CHANNEL(DAC_Channel)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected DAC channel */ + DAC->CR |= (DAC_CR_EN1 << DAC_Channel); + } + else + { + /* Disable the selected DAC channel */ + DAC->CR &= ~(DAC_CR_EN1 << DAC_Channel); + } +} +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) +/** + * @brief Enables or disables the specified DAC interrupts. + * @param DAC_Channel: the selected DAC channel. + * This parameter can be one of the following values: + * @arg DAC_Channel_1: DAC Channel1 selected + * @arg DAC_Channel_2: DAC Channel2 selected + * @param DAC_IT: specifies the DAC interrupt sources to be enabled or disabled. + * This parameter can be the following values: + * @arg DAC_IT_DMAUDR: DMA underrun interrupt mask + * @param NewState: new state of the specified DAC interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void DAC_ITConfig(uint32_t DAC_Channel, uint32_t DAC_IT, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_DAC_CHANNEL(DAC_Channel)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + assert_param(IS_DAC_IT(DAC_IT)); + + if (NewState != DISABLE) + { + /* Enable the selected DAC interrupts */ + DAC->CR |= (DAC_IT << DAC_Channel); + } + else + { + /* Disable the selected DAC interrupts */ + DAC->CR &= (~(uint32_t)(DAC_IT << DAC_Channel)); + } +} +#endif + +/** + * @brief Enables or disables the specified DAC channel DMA request. + * @param DAC_Channel: the selected DAC channel. + * This parameter can be one of the following values: + * @arg DAC_Channel_1: DAC Channel1 selected + * @arg DAC_Channel_2: DAC Channel2 selected + * @param NewState: new state of the selected DAC channel DMA request. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void DAC_DMACmd(uint32_t DAC_Channel, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_DAC_CHANNEL(DAC_Channel)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected DAC channel DMA request */ + DAC->CR |= (DAC_CR_DMAEN1 << DAC_Channel); + } + else + { + /* Disable the selected DAC channel DMA request */ + DAC->CR &= ~(DAC_CR_DMAEN1 << DAC_Channel); + } +} + +/** + * @brief Enables or disables the selected DAC channel software trigger. + * @param DAC_Channel: the selected DAC channel. + * This parameter can be one of the following values: + * @arg DAC_Channel_1: DAC Channel1 selected + * @arg DAC_Channel_2: DAC Channel2 selected + * @param NewState: new state of the selected DAC channel software trigger. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void DAC_SoftwareTriggerCmd(uint32_t DAC_Channel, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_DAC_CHANNEL(DAC_Channel)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable software trigger for the selected DAC channel */ + DAC->SWTRIGR |= (uint32_t)DAC_SWTRIGR_SWTRIG1 << (DAC_Channel >> 4); + } + else + { + /* Disable software trigger for the selected DAC channel */ + DAC->SWTRIGR &= ~((uint32_t)DAC_SWTRIGR_SWTRIG1 << (DAC_Channel >> 4)); + } +} + +/** + * @brief Enables or disables simultaneously the two DAC channels software + * triggers. + * @param NewState: new state of the DAC channels software triggers. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void DAC_DualSoftwareTriggerCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable software trigger for both DAC channels */ + DAC->SWTRIGR |= DUAL_SWTRIG_SET ; + } + else + { + /* Disable software trigger for both DAC channels */ + DAC->SWTRIGR &= DUAL_SWTRIG_RESET; + } +} + +/** + * @brief Enables or disables the selected DAC channel wave generation. + * @param DAC_Channel: the selected DAC channel. + * This parameter can be one of the following values: + * @arg DAC_Channel_1: DAC Channel1 selected + * @arg DAC_Channel_2: DAC Channel2 selected + * @param DAC_Wave: Specifies the wave type to enable or disable. + * This parameter can be one of the following values: + * @arg DAC_Wave_Noise: noise wave generation + * @arg DAC_Wave_Triangle: triangle wave generation + * @param NewState: new state of the selected DAC channel wave generation. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void DAC_WaveGenerationCmd(uint32_t DAC_Channel, uint32_t DAC_Wave, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_DAC_CHANNEL(DAC_Channel)); + assert_param(IS_DAC_WAVE(DAC_Wave)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected wave generation for the selected DAC channel */ + DAC->CR |= DAC_Wave << DAC_Channel; + } + else + { + /* Disable the selected wave generation for the selected DAC channel */ + DAC->CR &= ~(DAC_Wave << DAC_Channel); + } +} + +/** + * @brief Set the specified data holding register value for DAC channel1. + * @param DAC_Align: Specifies the data alignment for DAC channel1. + * This parameter can be one of the following values: + * @arg DAC_Align_8b_R: 8bit right data alignment selected + * @arg DAC_Align_12b_L: 12bit left data alignment selected + * @arg DAC_Align_12b_R: 12bit right data alignment selected + * @param Data : Data to be loaded in the selected data holding register. + * @retval None + */ +void DAC_SetChannel1Data(uint32_t DAC_Align, uint16_t Data) +{ + __IO uint32_t tmp = 0; + + /* Check the parameters */ + assert_param(IS_DAC_ALIGN(DAC_Align)); + assert_param(IS_DAC_DATA(Data)); + + tmp = (uint32_t)DAC_BASE; + tmp += DHR12R1_OFFSET + DAC_Align; + + /* Set the DAC channel1 selected data holding register */ + *(__IO uint32_t *) tmp = Data; +} + +/** + * @brief Set the specified data holding register value for DAC channel2. + * @param DAC_Align: Specifies the data alignment for DAC channel2. + * This parameter can be one of the following values: + * @arg DAC_Align_8b_R: 8bit right data alignment selected + * @arg DAC_Align_12b_L: 12bit left data alignment selected + * @arg DAC_Align_12b_R: 12bit right data alignment selected + * @param Data : Data to be loaded in the selected data holding register. + * @retval None + */ +void DAC_SetChannel2Data(uint32_t DAC_Align, uint16_t Data) +{ + __IO uint32_t tmp = 0; + + /* Check the parameters */ + assert_param(IS_DAC_ALIGN(DAC_Align)); + assert_param(IS_DAC_DATA(Data)); + + tmp = (uint32_t)DAC_BASE; + tmp += DHR12R2_OFFSET + DAC_Align; + + /* Set the DAC channel2 selected data holding register */ + *(__IO uint32_t *)tmp = Data; +} + +/** + * @brief Set the specified data holding register value for dual channel + * DAC. + * @param DAC_Align: Specifies the data alignment for dual channel DAC. + * This parameter can be one of the following values: + * @arg DAC_Align_8b_R: 8bit right data alignment selected + * @arg DAC_Align_12b_L: 12bit left data alignment selected + * @arg DAC_Align_12b_R: 12bit right data alignment selected + * @param Data2: Data for DAC Channel2 to be loaded in the selected data + * holding register. + * @param Data1: Data for DAC Channel1 to be loaded in the selected data + * holding register. + * @retval None + */ +void DAC_SetDualChannelData(uint32_t DAC_Align, uint16_t Data2, uint16_t Data1) +{ + uint32_t data = 0, tmp = 0; + + /* Check the parameters */ + assert_param(IS_DAC_ALIGN(DAC_Align)); + assert_param(IS_DAC_DATA(Data1)); + assert_param(IS_DAC_DATA(Data2)); + + /* Calculate and set dual DAC data holding register value */ + if (DAC_Align == DAC_Align_8b_R) + { + data = ((uint32_t)Data2 << 8) | Data1; + } + else + { + data = ((uint32_t)Data2 << 16) | Data1; + } + + tmp = (uint32_t)DAC_BASE; + tmp += DHR12RD_OFFSET + DAC_Align; + + /* Set the dual DAC selected data holding register */ + *(__IO uint32_t *)tmp = data; +} + +/** + * @brief Returns the last data output value of the selected DAC channel. + * @param DAC_Channel: the selected DAC channel. + * This parameter can be one of the following values: + * @arg DAC_Channel_1: DAC Channel1 selected + * @arg DAC_Channel_2: DAC Channel2 selected + * @retval The selected DAC channel data output value. + */ +uint16_t DAC_GetDataOutputValue(uint32_t DAC_Channel) +{ + __IO uint32_t tmp = 0; + + /* Check the parameters */ + assert_param(IS_DAC_CHANNEL(DAC_Channel)); + + tmp = (uint32_t) DAC_BASE ; + tmp += DOR_OFFSET + ((uint32_t)DAC_Channel >> 2); + + /* Returns the DAC channel data output register value */ + return (uint16_t) (*(__IO uint32_t*) tmp); +} + +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) +/** + * @brief Checks whether the specified DAC flag is set or not. + * @param DAC_Channel: thee selected DAC channel. + * This parameter can be one of the following values: + * @arg DAC_Channel_1: DAC Channel1 selected + * @arg DAC_Channel_2: DAC Channel2 selected + * @param DAC_FLAG: specifies the flag to check. + * This parameter can be only of the following value: + * @arg DAC_FLAG_DMAUDR: DMA underrun flag + * @retval The new state of DAC_FLAG (SET or RESET). + */ +FlagStatus DAC_GetFlagStatus(uint32_t DAC_Channel, uint32_t DAC_FLAG) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_DAC_CHANNEL(DAC_Channel)); + assert_param(IS_DAC_FLAG(DAC_FLAG)); + + /* Check the status of the specified DAC flag */ + if ((DAC->SR & (DAC_FLAG << DAC_Channel)) != (uint8_t)RESET) + { + /* DAC_FLAG is set */ + bitstatus = SET; + } + else + { + /* DAC_FLAG is reset */ + bitstatus = RESET; + } + /* Return the DAC_FLAG status */ + return bitstatus; +} + +/** + * @brief Clears the DAC channelx's pending flags. + * @param DAC_Channel: the selected DAC channel. + * This parameter can be one of the following values: + * @arg DAC_Channel_1: DAC Channel1 selected + * @arg DAC_Channel_2: DAC Channel2 selected + * @param DAC_FLAG: specifies the flag to clear. + * This parameter can be of the following value: + * @arg DAC_FLAG_DMAUDR: DMA underrun flag + * @retval None + */ +void DAC_ClearFlag(uint32_t DAC_Channel, uint32_t DAC_FLAG) +{ + /* Check the parameters */ + assert_param(IS_DAC_CHANNEL(DAC_Channel)); + assert_param(IS_DAC_FLAG(DAC_FLAG)); + + /* Clear the selected DAC flags */ + DAC->SR = (DAC_FLAG << DAC_Channel); +} + +/** + * @brief Checks whether the specified DAC interrupt has occurred or not. + * @param DAC_Channel: the selected DAC channel. + * This parameter can be one of the following values: + * @arg DAC_Channel_1: DAC Channel1 selected + * @arg DAC_Channel_2: DAC Channel2 selected + * @param DAC_IT: specifies the DAC interrupt source to check. + * This parameter can be the following values: + * @arg DAC_IT_DMAUDR: DMA underrun interrupt mask + * @retval The new state of DAC_IT (SET or RESET). + */ +ITStatus DAC_GetITStatus(uint32_t DAC_Channel, uint32_t DAC_IT) +{ + ITStatus bitstatus = RESET; + uint32_t enablestatus = 0; + + /* Check the parameters */ + assert_param(IS_DAC_CHANNEL(DAC_Channel)); + assert_param(IS_DAC_IT(DAC_IT)); + + /* Get the DAC_IT enable bit status */ + enablestatus = (DAC->CR & (DAC_IT << DAC_Channel)) ; + + /* Check the status of the specified DAC interrupt */ + if (((DAC->SR & (DAC_IT << DAC_Channel)) != (uint32_t)RESET) && enablestatus) + { + /* DAC_IT is set */ + bitstatus = SET; + } + else + { + /* DAC_IT is reset */ + bitstatus = RESET; + } + /* Return the DAC_IT status */ + return bitstatus; +} + +/** + * @brief Clears the DAC channelx's interrupt pending bits. + * @param DAC_Channel: the selected DAC channel. + * This parameter can be one of the following values: + * @arg DAC_Channel_1: DAC Channel1 selected + * @arg DAC_Channel_2: DAC Channel2 selected + * @param DAC_IT: specifies the DAC interrupt pending bit to clear. + * This parameter can be the following values: + * @arg DAC_IT_DMAUDR: DMA underrun interrupt mask + * @retval None + */ +void DAC_ClearITPendingBit(uint32_t DAC_Channel, uint32_t DAC_IT) +{ + /* Check the parameters */ + assert_param(IS_DAC_CHANNEL(DAC_Channel)); + assert_param(IS_DAC_IT(DAC_IT)); + + /* Clear the selected DAC interrupt pending bits */ + DAC->SR = (DAC_IT << DAC_Channel); +} +#endif + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_dbgmcu.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_dbgmcu.c new file mode 100644 index 0000000..d34307b --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_dbgmcu.c @@ -0,0 +1,162 @@ +/** + ****************************************************************************** + * @file stm32f10x_dbgmcu.c + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief This file provides all the DBGMCU firmware functions. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_dbgmcu.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup DBGMCU + * @brief DBGMCU driver modules + * @{ + */ + +/** @defgroup DBGMCU_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup DBGMCU_Private_Defines + * @{ + */ + +#define IDCODE_DEVID_MASK ((uint32_t)0x00000FFF) +/** + * @} + */ + +/** @defgroup DBGMCU_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup DBGMCU_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup DBGMCU_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup DBGMCU_Private_Functions + * @{ + */ + +/** + * @brief Returns the device revision identifier. + * @param None + * @retval Device revision identifier + */ +uint32_t DBGMCU_GetREVID(void) +{ + return(DBGMCU->IDCODE >> 16); +} + +/** + * @brief Returns the device identifier. + * @param None + * @retval Device identifier + */ +uint32_t DBGMCU_GetDEVID(void) +{ + return(DBGMCU->IDCODE & IDCODE_DEVID_MASK); +} + +/** + * @brief Configures the specified peripheral and low power mode behavior + * when the MCU under Debug mode. + * @param DBGMCU_Periph: specifies the peripheral and low power mode. + * This parameter can be any combination of the following values: + * @arg DBGMCU_SLEEP: Keep debugger connection during SLEEP mode + * @arg DBGMCU_STOP: Keep debugger connection during STOP mode + * @arg DBGMCU_STANDBY: Keep debugger connection during STANDBY mode + * @arg DBGMCU_IWDG_STOP: Debug IWDG stopped when Core is halted + * @arg DBGMCU_WWDG_STOP: Debug WWDG stopped when Core is halted + * @arg DBGMCU_TIM1_STOP: TIM1 counter stopped when Core is halted + * @arg DBGMCU_TIM2_STOP: TIM2 counter stopped when Core is halted + * @arg DBGMCU_TIM3_STOP: TIM3 counter stopped when Core is halted + * @arg DBGMCU_TIM4_STOP: TIM4 counter stopped when Core is halted + * @arg DBGMCU_CAN1_STOP: Debug CAN2 stopped when Core is halted + * @arg DBGMCU_I2C1_SMBUS_TIMEOUT: I2C1 SMBUS timeout mode stopped when Core is halted + * @arg DBGMCU_I2C2_SMBUS_TIMEOUT: I2C2 SMBUS timeout mode stopped when Core is halted + * @arg DBGMCU_TIM5_STOP: TIM5 counter stopped when Core is halted + * @arg DBGMCU_TIM6_STOP: TIM6 counter stopped when Core is halted + * @arg DBGMCU_TIM7_STOP: TIM7 counter stopped when Core is halted + * @arg DBGMCU_TIM8_STOP: TIM8 counter stopped when Core is halted + * @arg DBGMCU_CAN2_STOP: Debug CAN2 stopped when Core is halted + * @arg DBGMCU_TIM15_STOP: TIM15 counter stopped when Core is halted + * @arg DBGMCU_TIM16_STOP: TIM16 counter stopped when Core is halted + * @arg DBGMCU_TIM17_STOP: TIM17 counter stopped when Core is halted + * @arg DBGMCU_TIM9_STOP: TIM9 counter stopped when Core is halted + * @arg DBGMCU_TIM10_STOP: TIM10 counter stopped when Core is halted + * @arg DBGMCU_TIM11_STOP: TIM11 counter stopped when Core is halted + * @arg DBGMCU_TIM12_STOP: TIM12 counter stopped when Core is halted + * @arg DBGMCU_TIM13_STOP: TIM13 counter stopped when Core is halted + * @arg DBGMCU_TIM14_STOP: TIM14 counter stopped when Core is halted + * @param NewState: new state of the specified peripheral in Debug mode. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void DBGMCU_Config(uint32_t DBGMCU_Periph, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_DBGMCU_PERIPH(DBGMCU_Periph)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + DBGMCU->CR |= DBGMCU_Periph; + } + else + { + DBGMCU->CR &= ~DBGMCU_Periph; + } +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_dma.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_dma.c new file mode 100644 index 0000000..0c86f90 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_dma.c @@ -0,0 +1,714 @@ +/** + ****************************************************************************** + * @file stm32f10x_dma.c + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief This file provides all the DMA firmware functions. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_dma.h" +#include "stm32f10x_rcc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup DMA + * @brief DMA driver modules + * @{ + */ + +/** @defgroup DMA_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ + +/** @defgroup DMA_Private_Defines + * @{ + */ + + +/* DMA1 Channelx interrupt pending bit masks */ +#define DMA1_Channel1_IT_Mask ((uint32_t)(DMA_ISR_GIF1 | DMA_ISR_TCIF1 | DMA_ISR_HTIF1 | DMA_ISR_TEIF1)) +#define DMA1_Channel2_IT_Mask ((uint32_t)(DMA_ISR_GIF2 | DMA_ISR_TCIF2 | DMA_ISR_HTIF2 | DMA_ISR_TEIF2)) +#define DMA1_Channel3_IT_Mask ((uint32_t)(DMA_ISR_GIF3 | DMA_ISR_TCIF3 | DMA_ISR_HTIF3 | DMA_ISR_TEIF3)) +#define DMA1_Channel4_IT_Mask ((uint32_t)(DMA_ISR_GIF4 | DMA_ISR_TCIF4 | DMA_ISR_HTIF4 | DMA_ISR_TEIF4)) +#define DMA1_Channel5_IT_Mask ((uint32_t)(DMA_ISR_GIF5 | DMA_ISR_TCIF5 | DMA_ISR_HTIF5 | DMA_ISR_TEIF5)) +#define DMA1_Channel6_IT_Mask ((uint32_t)(DMA_ISR_GIF6 | DMA_ISR_TCIF6 | DMA_ISR_HTIF6 | DMA_ISR_TEIF6)) +#define DMA1_Channel7_IT_Mask ((uint32_t)(DMA_ISR_GIF7 | DMA_ISR_TCIF7 | DMA_ISR_HTIF7 | DMA_ISR_TEIF7)) + +/* DMA2 Channelx interrupt pending bit masks */ +#define DMA2_Channel1_IT_Mask ((uint32_t)(DMA_ISR_GIF1 | DMA_ISR_TCIF1 | DMA_ISR_HTIF1 | DMA_ISR_TEIF1)) +#define DMA2_Channel2_IT_Mask ((uint32_t)(DMA_ISR_GIF2 | DMA_ISR_TCIF2 | DMA_ISR_HTIF2 | DMA_ISR_TEIF2)) +#define DMA2_Channel3_IT_Mask ((uint32_t)(DMA_ISR_GIF3 | DMA_ISR_TCIF3 | DMA_ISR_HTIF3 | DMA_ISR_TEIF3)) +#define DMA2_Channel4_IT_Mask ((uint32_t)(DMA_ISR_GIF4 | DMA_ISR_TCIF4 | DMA_ISR_HTIF4 | DMA_ISR_TEIF4)) +#define DMA2_Channel5_IT_Mask ((uint32_t)(DMA_ISR_GIF5 | DMA_ISR_TCIF5 | DMA_ISR_HTIF5 | DMA_ISR_TEIF5)) + +/* DMA2 FLAG mask */ +#define FLAG_Mask ((uint32_t)0x10000000) + +/* DMA registers Masks */ +#define CCR_CLEAR_Mask ((uint32_t)0xFFFF800F) + +/** + * @} + */ + +/** @defgroup DMA_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup DMA_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup DMA_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup DMA_Private_Functions + * @{ + */ + +/** + * @brief Deinitializes the DMAy Channelx registers to their default reset + * values. + * @param DMAy_Channelx: where y can be 1 or 2 to select the DMA and + * x can be 1 to 7 for DMA1 and 1 to 5 for DMA2 to select the DMA Channel. + * @retval None + */ +void DMA_DeInit(DMA_Channel_TypeDef* DMAy_Channelx) +{ + /* Check the parameters */ + assert_param(IS_DMA_ALL_PERIPH(DMAy_Channelx)); + + /* Disable the selected DMAy Channelx */ + DMAy_Channelx->CCR &= (uint16_t)(~DMA_CCR1_EN); + + /* Reset DMAy Channelx control register */ + DMAy_Channelx->CCR = 0; + + /* Reset DMAy Channelx remaining bytes register */ + DMAy_Channelx->CNDTR = 0; + + /* Reset DMAy Channelx peripheral address register */ + DMAy_Channelx->CPAR = 0; + + /* Reset DMAy Channelx memory address register */ + DMAy_Channelx->CMAR = 0; + + if (DMAy_Channelx == DMA1_Channel1) + { + /* Reset interrupt pending bits for DMA1 Channel1 */ + DMA1->IFCR |= DMA1_Channel1_IT_Mask; + } + else if (DMAy_Channelx == DMA1_Channel2) + { + /* Reset interrupt pending bits for DMA1 Channel2 */ + DMA1->IFCR |= DMA1_Channel2_IT_Mask; + } + else if (DMAy_Channelx == DMA1_Channel3) + { + /* Reset interrupt pending bits for DMA1 Channel3 */ + DMA1->IFCR |= DMA1_Channel3_IT_Mask; + } + else if (DMAy_Channelx == DMA1_Channel4) + { + /* Reset interrupt pending bits for DMA1 Channel4 */ + DMA1->IFCR |= DMA1_Channel4_IT_Mask; + } + else if (DMAy_Channelx == DMA1_Channel5) + { + /* Reset interrupt pending bits for DMA1 Channel5 */ + DMA1->IFCR |= DMA1_Channel5_IT_Mask; + } + else if (DMAy_Channelx == DMA1_Channel6) + { + /* Reset interrupt pending bits for DMA1 Channel6 */ + DMA1->IFCR |= DMA1_Channel6_IT_Mask; + } + else if (DMAy_Channelx == DMA1_Channel7) + { + /* Reset interrupt pending bits for DMA1 Channel7 */ + DMA1->IFCR |= DMA1_Channel7_IT_Mask; + } + else if (DMAy_Channelx == DMA2_Channel1) + { + /* Reset interrupt pending bits for DMA2 Channel1 */ + DMA2->IFCR |= DMA2_Channel1_IT_Mask; + } + else if (DMAy_Channelx == DMA2_Channel2) + { + /* Reset interrupt pending bits for DMA2 Channel2 */ + DMA2->IFCR |= DMA2_Channel2_IT_Mask; + } + else if (DMAy_Channelx == DMA2_Channel3) + { + /* Reset interrupt pending bits for DMA2 Channel3 */ + DMA2->IFCR |= DMA2_Channel3_IT_Mask; + } + else if (DMAy_Channelx == DMA2_Channel4) + { + /* Reset interrupt pending bits for DMA2 Channel4 */ + DMA2->IFCR |= DMA2_Channel4_IT_Mask; + } + else + { + if (DMAy_Channelx == DMA2_Channel5) + { + /* Reset interrupt pending bits for DMA2 Channel5 */ + DMA2->IFCR |= DMA2_Channel5_IT_Mask; + } + } +} + +/** + * @brief Initializes the DMAy Channelx according to the specified + * parameters in the DMA_InitStruct. + * @param DMAy_Channelx: where y can be 1 or 2 to select the DMA and + * x can be 1 to 7 for DMA1 and 1 to 5 for DMA2 to select the DMA Channel. + * @param DMA_InitStruct: pointer to a DMA_InitTypeDef structure that + * contains the configuration information for the specified DMA Channel. + * @retval None + */ +void DMA_Init(DMA_Channel_TypeDef* DMAy_Channelx, DMA_InitTypeDef* DMA_InitStruct) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_DMA_ALL_PERIPH(DMAy_Channelx)); + assert_param(IS_DMA_DIR(DMA_InitStruct->DMA_DIR)); + assert_param(IS_DMA_BUFFER_SIZE(DMA_InitStruct->DMA_BufferSize)); + assert_param(IS_DMA_PERIPHERAL_INC_STATE(DMA_InitStruct->DMA_PeripheralInc)); + assert_param(IS_DMA_MEMORY_INC_STATE(DMA_InitStruct->DMA_MemoryInc)); + assert_param(IS_DMA_PERIPHERAL_DATA_SIZE(DMA_InitStruct->DMA_PeripheralDataSize)); + assert_param(IS_DMA_MEMORY_DATA_SIZE(DMA_InitStruct->DMA_MemoryDataSize)); + assert_param(IS_DMA_MODE(DMA_InitStruct->DMA_Mode)); + assert_param(IS_DMA_PRIORITY(DMA_InitStruct->DMA_Priority)); + assert_param(IS_DMA_M2M_STATE(DMA_InitStruct->DMA_M2M)); + +/*--------------------------- DMAy Channelx CCR Configuration -----------------*/ + /* Get the DMAy_Channelx CCR value */ + tmpreg = DMAy_Channelx->CCR; + /* Clear MEM2MEM, PL, MSIZE, PSIZE, MINC, PINC, CIRC and DIR bits */ + tmpreg &= CCR_CLEAR_Mask; + /* Configure DMAy Channelx: data transfer, data size, priority level and mode */ + /* Set DIR bit according to DMA_DIR value */ + /* Set CIRC bit according to DMA_Mode value */ + /* Set PINC bit according to DMA_PeripheralInc value */ + /* Set MINC bit according to DMA_MemoryInc value */ + /* Set PSIZE bits according to DMA_PeripheralDataSize value */ + /* Set MSIZE bits according to DMA_MemoryDataSize value */ + /* Set PL bits according to DMA_Priority value */ + /* Set the MEM2MEM bit according to DMA_M2M value */ + tmpreg |= DMA_InitStruct->DMA_DIR | DMA_InitStruct->DMA_Mode | + DMA_InitStruct->DMA_PeripheralInc | DMA_InitStruct->DMA_MemoryInc | + DMA_InitStruct->DMA_PeripheralDataSize | DMA_InitStruct->DMA_MemoryDataSize | + DMA_InitStruct->DMA_Priority | DMA_InitStruct->DMA_M2M; + + /* Write to DMAy Channelx CCR */ + DMAy_Channelx->CCR = tmpreg; + +/*--------------------------- DMAy Channelx CNDTR Configuration ---------------*/ + /* Write to DMAy Channelx CNDTR */ + DMAy_Channelx->CNDTR = DMA_InitStruct->DMA_BufferSize; + +/*--------------------------- DMAy Channelx CPAR Configuration ----------------*/ + /* Write to DMAy Channelx CPAR */ + DMAy_Channelx->CPAR = DMA_InitStruct->DMA_PeripheralBaseAddr; + +/*--------------------------- DMAy Channelx CMAR Configuration ----------------*/ + /* Write to DMAy Channelx CMAR */ + DMAy_Channelx->CMAR = DMA_InitStruct->DMA_MemoryBaseAddr; +} + +/** + * @brief Fills each DMA_InitStruct member with its default value. + * @param DMA_InitStruct : pointer to a DMA_InitTypeDef structure which will + * be initialized. + * @retval None + */ +void DMA_StructInit(DMA_InitTypeDef* DMA_InitStruct) +{ +/*-------------- Reset DMA init structure parameters values ------------------*/ + /* Initialize the DMA_PeripheralBaseAddr member */ + DMA_InitStruct->DMA_PeripheralBaseAddr = 0; + /* Initialize the DMA_MemoryBaseAddr member */ + DMA_InitStruct->DMA_MemoryBaseAddr = 0; + /* Initialize the DMA_DIR member */ + DMA_InitStruct->DMA_DIR = DMA_DIR_PeripheralSRC; + /* Initialize the DMA_BufferSize member */ + DMA_InitStruct->DMA_BufferSize = 0; + /* Initialize the DMA_PeripheralInc member */ + DMA_InitStruct->DMA_PeripheralInc = DMA_PeripheralInc_Disable; + /* Initialize the DMA_MemoryInc member */ + DMA_InitStruct->DMA_MemoryInc = DMA_MemoryInc_Disable; + /* Initialize the DMA_PeripheralDataSize member */ + DMA_InitStruct->DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; + /* Initialize the DMA_MemoryDataSize member */ + DMA_InitStruct->DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; + /* Initialize the DMA_Mode member */ + DMA_InitStruct->DMA_Mode = DMA_Mode_Normal; + /* Initialize the DMA_Priority member */ + DMA_InitStruct->DMA_Priority = DMA_Priority_Low; + /* Initialize the DMA_M2M member */ + DMA_InitStruct->DMA_M2M = DMA_M2M_Disable; +} + +/** + * @brief Enables or disables the specified DMAy Channelx. + * @param DMAy_Channelx: where y can be 1 or 2 to select the DMA and + * x can be 1 to 7 for DMA1 and 1 to 5 for DMA2 to select the DMA Channel. + * @param NewState: new state of the DMAy Channelx. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void DMA_Cmd(DMA_Channel_TypeDef* DMAy_Channelx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_DMA_ALL_PERIPH(DMAy_Channelx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected DMAy Channelx */ + DMAy_Channelx->CCR |= DMA_CCR1_EN; + } + else + { + /* Disable the selected DMAy Channelx */ + DMAy_Channelx->CCR &= (uint16_t)(~DMA_CCR1_EN); + } +} + +/** + * @brief Enables or disables the specified DMAy Channelx interrupts. + * @param DMAy_Channelx: where y can be 1 or 2 to select the DMA and + * x can be 1 to 7 for DMA1 and 1 to 5 for DMA2 to select the DMA Channel. + * @param DMA_IT: specifies the DMA interrupts sources to be enabled + * or disabled. + * This parameter can be any combination of the following values: + * @arg DMA_IT_TC: Transfer complete interrupt mask + * @arg DMA_IT_HT: Half transfer interrupt mask + * @arg DMA_IT_TE: Transfer error interrupt mask + * @param NewState: new state of the specified DMA interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void DMA_ITConfig(DMA_Channel_TypeDef* DMAy_Channelx, uint32_t DMA_IT, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_DMA_ALL_PERIPH(DMAy_Channelx)); + assert_param(IS_DMA_CONFIG_IT(DMA_IT)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected DMA interrupts */ + DMAy_Channelx->CCR |= DMA_IT; + } + else + { + /* Disable the selected DMA interrupts */ + DMAy_Channelx->CCR &= ~DMA_IT; + } +} + +/** + * @brief Sets the number of data units in the current DMAy Channelx transfer. + * @param DMAy_Channelx: where y can be 1 or 2 to select the DMA and + * x can be 1 to 7 for DMA1 and 1 to 5 for DMA2 to select the DMA Channel. + * @param DataNumber: The number of data units in the current DMAy Channelx + * transfer. + * @note This function can only be used when the DMAy_Channelx is disabled. + * @retval None. + */ +void DMA_SetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx, uint16_t DataNumber) +{ + /* Check the parameters */ + assert_param(IS_DMA_ALL_PERIPH(DMAy_Channelx)); + +/*--------------------------- DMAy Channelx CNDTR Configuration ---------------*/ + /* Write to DMAy Channelx CNDTR */ + DMAy_Channelx->CNDTR = DataNumber; +} + +/** + * @brief Returns the number of remaining data units in the current + * DMAy Channelx transfer. + * @param DMAy_Channelx: where y can be 1 or 2 to select the DMA and + * x can be 1 to 7 for DMA1 and 1 to 5 for DMA2 to select the DMA Channel. + * @retval The number of remaining data units in the current DMAy Channelx + * transfer. + */ +uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx) +{ + /* Check the parameters */ + assert_param(IS_DMA_ALL_PERIPH(DMAy_Channelx)); + /* Return the number of remaining data units for DMAy Channelx */ + return ((uint16_t)(DMAy_Channelx->CNDTR)); +} + +/** + * @brief Checks whether the specified DMAy Channelx flag is set or not. + * @param DMAy_FLAG: specifies the flag to check. + * This parameter can be one of the following values: + * @arg DMA1_FLAG_GL1: DMA1 Channel1 global flag. + * @arg DMA1_FLAG_TC1: DMA1 Channel1 transfer complete flag. + * @arg DMA1_FLAG_HT1: DMA1 Channel1 half transfer flag. + * @arg DMA1_FLAG_TE1: DMA1 Channel1 transfer error flag. + * @arg DMA1_FLAG_GL2: DMA1 Channel2 global flag. + * @arg DMA1_FLAG_TC2: DMA1 Channel2 transfer complete flag. + * @arg DMA1_FLAG_HT2: DMA1 Channel2 half transfer flag. + * @arg DMA1_FLAG_TE2: DMA1 Channel2 transfer error flag. + * @arg DMA1_FLAG_GL3: DMA1 Channel3 global flag. + * @arg DMA1_FLAG_TC3: DMA1 Channel3 transfer complete flag. + * @arg DMA1_FLAG_HT3: DMA1 Channel3 half transfer flag. + * @arg DMA1_FLAG_TE3: DMA1 Channel3 transfer error flag. + * @arg DMA1_FLAG_GL4: DMA1 Channel4 global flag. + * @arg DMA1_FLAG_TC4: DMA1 Channel4 transfer complete flag. + * @arg DMA1_FLAG_HT4: DMA1 Channel4 half transfer flag. + * @arg DMA1_FLAG_TE4: DMA1 Channel4 transfer error flag. + * @arg DMA1_FLAG_GL5: DMA1 Channel5 global flag. + * @arg DMA1_FLAG_TC5: DMA1 Channel5 transfer complete flag. + * @arg DMA1_FLAG_HT5: DMA1 Channel5 half transfer flag. + * @arg DMA1_FLAG_TE5: DMA1 Channel5 transfer error flag. + * @arg DMA1_FLAG_GL6: DMA1 Channel6 global flag. + * @arg DMA1_FLAG_TC6: DMA1 Channel6 transfer complete flag. + * @arg DMA1_FLAG_HT6: DMA1 Channel6 half transfer flag. + * @arg DMA1_FLAG_TE6: DMA1 Channel6 transfer error flag. + * @arg DMA1_FLAG_GL7: DMA1 Channel7 global flag. + * @arg DMA1_FLAG_TC7: DMA1 Channel7 transfer complete flag. + * @arg DMA1_FLAG_HT7: DMA1 Channel7 half transfer flag. + * @arg DMA1_FLAG_TE7: DMA1 Channel7 transfer error flag. + * @arg DMA2_FLAG_GL1: DMA2 Channel1 global flag. + * @arg DMA2_FLAG_TC1: DMA2 Channel1 transfer complete flag. + * @arg DMA2_FLAG_HT1: DMA2 Channel1 half transfer flag. + * @arg DMA2_FLAG_TE1: DMA2 Channel1 transfer error flag. + * @arg DMA2_FLAG_GL2: DMA2 Channel2 global flag. + * @arg DMA2_FLAG_TC2: DMA2 Channel2 transfer complete flag. + * @arg DMA2_FLAG_HT2: DMA2 Channel2 half transfer flag. + * @arg DMA2_FLAG_TE2: DMA2 Channel2 transfer error flag. + * @arg DMA2_FLAG_GL3: DMA2 Channel3 global flag. + * @arg DMA2_FLAG_TC3: DMA2 Channel3 transfer complete flag. + * @arg DMA2_FLAG_HT3: DMA2 Channel3 half transfer flag. + * @arg DMA2_FLAG_TE3: DMA2 Channel3 transfer error flag. + * @arg DMA2_FLAG_GL4: DMA2 Channel4 global flag. + * @arg DMA2_FLAG_TC4: DMA2 Channel4 transfer complete flag. + * @arg DMA2_FLAG_HT4: DMA2 Channel4 half transfer flag. + * @arg DMA2_FLAG_TE4: DMA2 Channel4 transfer error flag. + * @arg DMA2_FLAG_GL5: DMA2 Channel5 global flag. + * @arg DMA2_FLAG_TC5: DMA2 Channel5 transfer complete flag. + * @arg DMA2_FLAG_HT5: DMA2 Channel5 half transfer flag. + * @arg DMA2_FLAG_TE5: DMA2 Channel5 transfer error flag. + * @retval The new state of DMAy_FLAG (SET or RESET). + */ +FlagStatus DMA_GetFlagStatus(uint32_t DMAy_FLAG) +{ + FlagStatus bitstatus = RESET; + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_DMA_GET_FLAG(DMAy_FLAG)); + + /* Calculate the used DMAy */ + if ((DMAy_FLAG & FLAG_Mask) != (uint32_t)RESET) + { + /* Get DMA2 ISR register value */ + tmpreg = DMA2->ISR ; + } + else + { + /* Get DMA1 ISR register value */ + tmpreg = DMA1->ISR ; + } + + /* Check the status of the specified DMAy flag */ + if ((tmpreg & DMAy_FLAG) != (uint32_t)RESET) + { + /* DMAy_FLAG is set */ + bitstatus = SET; + } + else + { + /* DMAy_FLAG is reset */ + bitstatus = RESET; + } + + /* Return the DMAy_FLAG status */ + return bitstatus; +} + +/** + * @brief Clears the DMAy Channelx's pending flags. + * @param DMAy_FLAG: specifies the flag to clear. + * This parameter can be any combination (for the same DMA) of the following values: + * @arg DMA1_FLAG_GL1: DMA1 Channel1 global flag. + * @arg DMA1_FLAG_TC1: DMA1 Channel1 transfer complete flag. + * @arg DMA1_FLAG_HT1: DMA1 Channel1 half transfer flag. + * @arg DMA1_FLAG_TE1: DMA1 Channel1 transfer error flag. + * @arg DMA1_FLAG_GL2: DMA1 Channel2 global flag. + * @arg DMA1_FLAG_TC2: DMA1 Channel2 transfer complete flag. + * @arg DMA1_FLAG_HT2: DMA1 Channel2 half transfer flag. + * @arg DMA1_FLAG_TE2: DMA1 Channel2 transfer error flag. + * @arg DMA1_FLAG_GL3: DMA1 Channel3 global flag. + * @arg DMA1_FLAG_TC3: DMA1 Channel3 transfer complete flag. + * @arg DMA1_FLAG_HT3: DMA1 Channel3 half transfer flag. + * @arg DMA1_FLAG_TE3: DMA1 Channel3 transfer error flag. + * @arg DMA1_FLAG_GL4: DMA1 Channel4 global flag. + * @arg DMA1_FLAG_TC4: DMA1 Channel4 transfer complete flag. + * @arg DMA1_FLAG_HT4: DMA1 Channel4 half transfer flag. + * @arg DMA1_FLAG_TE4: DMA1 Channel4 transfer error flag. + * @arg DMA1_FLAG_GL5: DMA1 Channel5 global flag. + * @arg DMA1_FLAG_TC5: DMA1 Channel5 transfer complete flag. + * @arg DMA1_FLAG_HT5: DMA1 Channel5 half transfer flag. + * @arg DMA1_FLAG_TE5: DMA1 Channel5 transfer error flag. + * @arg DMA1_FLAG_GL6: DMA1 Channel6 global flag. + * @arg DMA1_FLAG_TC6: DMA1 Channel6 transfer complete flag. + * @arg DMA1_FLAG_HT6: DMA1 Channel6 half transfer flag. + * @arg DMA1_FLAG_TE6: DMA1 Channel6 transfer error flag. + * @arg DMA1_FLAG_GL7: DMA1 Channel7 global flag. + * @arg DMA1_FLAG_TC7: DMA1 Channel7 transfer complete flag. + * @arg DMA1_FLAG_HT7: DMA1 Channel7 half transfer flag. + * @arg DMA1_FLAG_TE7: DMA1 Channel7 transfer error flag. + * @arg DMA2_FLAG_GL1: DMA2 Channel1 global flag. + * @arg DMA2_FLAG_TC1: DMA2 Channel1 transfer complete flag. + * @arg DMA2_FLAG_HT1: DMA2 Channel1 half transfer flag. + * @arg DMA2_FLAG_TE1: DMA2 Channel1 transfer error flag. + * @arg DMA2_FLAG_GL2: DMA2 Channel2 global flag. + * @arg DMA2_FLAG_TC2: DMA2 Channel2 transfer complete flag. + * @arg DMA2_FLAG_HT2: DMA2 Channel2 half transfer flag. + * @arg DMA2_FLAG_TE2: DMA2 Channel2 transfer error flag. + * @arg DMA2_FLAG_GL3: DMA2 Channel3 global flag. + * @arg DMA2_FLAG_TC3: DMA2 Channel3 transfer complete flag. + * @arg DMA2_FLAG_HT3: DMA2 Channel3 half transfer flag. + * @arg DMA2_FLAG_TE3: DMA2 Channel3 transfer error flag. + * @arg DMA2_FLAG_GL4: DMA2 Channel4 global flag. + * @arg DMA2_FLAG_TC4: DMA2 Channel4 transfer complete flag. + * @arg DMA2_FLAG_HT4: DMA2 Channel4 half transfer flag. + * @arg DMA2_FLAG_TE4: DMA2 Channel4 transfer error flag. + * @arg DMA2_FLAG_GL5: DMA2 Channel5 global flag. + * @arg DMA2_FLAG_TC5: DMA2 Channel5 transfer complete flag. + * @arg DMA2_FLAG_HT5: DMA2 Channel5 half transfer flag. + * @arg DMA2_FLAG_TE5: DMA2 Channel5 transfer error flag. + * @retval None + */ +void DMA_ClearFlag(uint32_t DMAy_FLAG) +{ + /* Check the parameters */ + assert_param(IS_DMA_CLEAR_FLAG(DMAy_FLAG)); + + /* Calculate the used DMAy */ + if ((DMAy_FLAG & FLAG_Mask) != (uint32_t)RESET) + { + /* Clear the selected DMAy flags */ + DMA2->IFCR = DMAy_FLAG; + } + else + { + /* Clear the selected DMAy flags */ + DMA1->IFCR = DMAy_FLAG; + } +} + +/** + * @brief Checks whether the specified DMAy Channelx interrupt has occurred or not. + * @param DMAy_IT: specifies the DMAy interrupt source to check. + * This parameter can be one of the following values: + * @arg DMA1_IT_GL1: DMA1 Channel1 global interrupt. + * @arg DMA1_IT_TC1: DMA1 Channel1 transfer complete interrupt. + * @arg DMA1_IT_HT1: DMA1 Channel1 half transfer interrupt. + * @arg DMA1_IT_TE1: DMA1 Channel1 transfer error interrupt. + * @arg DMA1_IT_GL2: DMA1 Channel2 global interrupt. + * @arg DMA1_IT_TC2: DMA1 Channel2 transfer complete interrupt. + * @arg DMA1_IT_HT2: DMA1 Channel2 half transfer interrupt. + * @arg DMA1_IT_TE2: DMA1 Channel2 transfer error interrupt. + * @arg DMA1_IT_GL3: DMA1 Channel3 global interrupt. + * @arg DMA1_IT_TC3: DMA1 Channel3 transfer complete interrupt. + * @arg DMA1_IT_HT3: DMA1 Channel3 half transfer interrupt. + * @arg DMA1_IT_TE3: DMA1 Channel3 transfer error interrupt. + * @arg DMA1_IT_GL4: DMA1 Channel4 global interrupt. + * @arg DMA1_IT_TC4: DMA1 Channel4 transfer complete interrupt. + * @arg DMA1_IT_HT4: DMA1 Channel4 half transfer interrupt. + * @arg DMA1_IT_TE4: DMA1 Channel4 transfer error interrupt. + * @arg DMA1_IT_GL5: DMA1 Channel5 global interrupt. + * @arg DMA1_IT_TC5: DMA1 Channel5 transfer complete interrupt. + * @arg DMA1_IT_HT5: DMA1 Channel5 half transfer interrupt. + * @arg DMA1_IT_TE5: DMA1 Channel5 transfer error interrupt. + * @arg DMA1_IT_GL6: DMA1 Channel6 global interrupt. + * @arg DMA1_IT_TC6: DMA1 Channel6 transfer complete interrupt. + * @arg DMA1_IT_HT6: DMA1 Channel6 half transfer interrupt. + * @arg DMA1_IT_TE6: DMA1 Channel6 transfer error interrupt. + * @arg DMA1_IT_GL7: DMA1 Channel7 global interrupt. + * @arg DMA1_IT_TC7: DMA1 Channel7 transfer complete interrupt. + * @arg DMA1_IT_HT7: DMA1 Channel7 half transfer interrupt. + * @arg DMA1_IT_TE7: DMA1 Channel7 transfer error interrupt. + * @arg DMA2_IT_GL1: DMA2 Channel1 global interrupt. + * @arg DMA2_IT_TC1: DMA2 Channel1 transfer complete interrupt. + * @arg DMA2_IT_HT1: DMA2 Channel1 half transfer interrupt. + * @arg DMA2_IT_TE1: DMA2 Channel1 transfer error interrupt. + * @arg DMA2_IT_GL2: DMA2 Channel2 global interrupt. + * @arg DMA2_IT_TC2: DMA2 Channel2 transfer complete interrupt. + * @arg DMA2_IT_HT2: DMA2 Channel2 half transfer interrupt. + * @arg DMA2_IT_TE2: DMA2 Channel2 transfer error interrupt. + * @arg DMA2_IT_GL3: DMA2 Channel3 global interrupt. + * @arg DMA2_IT_TC3: DMA2 Channel3 transfer complete interrupt. + * @arg DMA2_IT_HT3: DMA2 Channel3 half transfer interrupt. + * @arg DMA2_IT_TE3: DMA2 Channel3 transfer error interrupt. + * @arg DMA2_IT_GL4: DMA2 Channel4 global interrupt. + * @arg DMA2_IT_TC4: DMA2 Channel4 transfer complete interrupt. + * @arg DMA2_IT_HT4: DMA2 Channel4 half transfer interrupt. + * @arg DMA2_IT_TE4: DMA2 Channel4 transfer error interrupt. + * @arg DMA2_IT_GL5: DMA2 Channel5 global interrupt. + * @arg DMA2_IT_TC5: DMA2 Channel5 transfer complete interrupt. + * @arg DMA2_IT_HT5: DMA2 Channel5 half transfer interrupt. + * @arg DMA2_IT_TE5: DMA2 Channel5 transfer error interrupt. + * @retval The new state of DMAy_IT (SET or RESET). + */ +ITStatus DMA_GetITStatus(uint32_t DMAy_IT) +{ + ITStatus bitstatus = RESET; + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_DMA_GET_IT(DMAy_IT)); + + /* Calculate the used DMA */ + if ((DMAy_IT & FLAG_Mask) != (uint32_t)RESET) + { + /* Get DMA2 ISR register value */ + tmpreg = DMA2->ISR; + } + else + { + /* Get DMA1 ISR register value */ + tmpreg = DMA1->ISR; + } + + /* Check the status of the specified DMAy interrupt */ + if ((tmpreg & DMAy_IT) != (uint32_t)RESET) + { + /* DMAy_IT is set */ + bitstatus = SET; + } + else + { + /* DMAy_IT is reset */ + bitstatus = RESET; + } + /* Return the DMA_IT status */ + return bitstatus; +} + +/** + * @brief Clears the DMAy Channelx's interrupt pending bits. + * @param DMAy_IT: specifies the DMAy interrupt pending bit to clear. + * This parameter can be any combination (for the same DMA) of the following values: + * @arg DMA1_IT_GL1: DMA1 Channel1 global interrupt. + * @arg DMA1_IT_TC1: DMA1 Channel1 transfer complete interrupt. + * @arg DMA1_IT_HT1: DMA1 Channel1 half transfer interrupt. + * @arg DMA1_IT_TE1: DMA1 Channel1 transfer error interrupt. + * @arg DMA1_IT_GL2: DMA1 Channel2 global interrupt. + * @arg DMA1_IT_TC2: DMA1 Channel2 transfer complete interrupt. + * @arg DMA1_IT_HT2: DMA1 Channel2 half transfer interrupt. + * @arg DMA1_IT_TE2: DMA1 Channel2 transfer error interrupt. + * @arg DMA1_IT_GL3: DMA1 Channel3 global interrupt. + * @arg DMA1_IT_TC3: DMA1 Channel3 transfer complete interrupt. + * @arg DMA1_IT_HT3: DMA1 Channel3 half transfer interrupt. + * @arg DMA1_IT_TE3: DMA1 Channel3 transfer error interrupt. + * @arg DMA1_IT_GL4: DMA1 Channel4 global interrupt. + * @arg DMA1_IT_TC4: DMA1 Channel4 transfer complete interrupt. + * @arg DMA1_IT_HT4: DMA1 Channel4 half transfer interrupt. + * @arg DMA1_IT_TE4: DMA1 Channel4 transfer error interrupt. + * @arg DMA1_IT_GL5: DMA1 Channel5 global interrupt. + * @arg DMA1_IT_TC5: DMA1 Channel5 transfer complete interrupt. + * @arg DMA1_IT_HT5: DMA1 Channel5 half transfer interrupt. + * @arg DMA1_IT_TE5: DMA1 Channel5 transfer error interrupt. + * @arg DMA1_IT_GL6: DMA1 Channel6 global interrupt. + * @arg DMA1_IT_TC6: DMA1 Channel6 transfer complete interrupt. + * @arg DMA1_IT_HT6: DMA1 Channel6 half transfer interrupt. + * @arg DMA1_IT_TE6: DMA1 Channel6 transfer error interrupt. + * @arg DMA1_IT_GL7: DMA1 Channel7 global interrupt. + * @arg DMA1_IT_TC7: DMA1 Channel7 transfer complete interrupt. + * @arg DMA1_IT_HT7: DMA1 Channel7 half transfer interrupt. + * @arg DMA1_IT_TE7: DMA1 Channel7 transfer error interrupt. + * @arg DMA2_IT_GL1: DMA2 Channel1 global interrupt. + * @arg DMA2_IT_TC1: DMA2 Channel1 transfer complete interrupt. + * @arg DMA2_IT_HT1: DMA2 Channel1 half transfer interrupt. + * @arg DMA2_IT_TE1: DMA2 Channel1 transfer error interrupt. + * @arg DMA2_IT_GL2: DMA2 Channel2 global interrupt. + * @arg DMA2_IT_TC2: DMA2 Channel2 transfer complete interrupt. + * @arg DMA2_IT_HT2: DMA2 Channel2 half transfer interrupt. + * @arg DMA2_IT_TE2: DMA2 Channel2 transfer error interrupt. + * @arg DMA2_IT_GL3: DMA2 Channel3 global interrupt. + * @arg DMA2_IT_TC3: DMA2 Channel3 transfer complete interrupt. + * @arg DMA2_IT_HT3: DMA2 Channel3 half transfer interrupt. + * @arg DMA2_IT_TE3: DMA2 Channel3 transfer error interrupt. + * @arg DMA2_IT_GL4: DMA2 Channel4 global interrupt. + * @arg DMA2_IT_TC4: DMA2 Channel4 transfer complete interrupt. + * @arg DMA2_IT_HT4: DMA2 Channel4 half transfer interrupt. + * @arg DMA2_IT_TE4: DMA2 Channel4 transfer error interrupt. + * @arg DMA2_IT_GL5: DMA2 Channel5 global interrupt. + * @arg DMA2_IT_TC5: DMA2 Channel5 transfer complete interrupt. + * @arg DMA2_IT_HT5: DMA2 Channel5 half transfer interrupt. + * @arg DMA2_IT_TE5: DMA2 Channel5 transfer error interrupt. + * @retval None + */ +void DMA_ClearITPendingBit(uint32_t DMAy_IT) +{ + /* Check the parameters */ + assert_param(IS_DMA_CLEAR_IT(DMAy_IT)); + + /* Calculate the used DMAy */ + if ((DMAy_IT & FLAG_Mask) != (uint32_t)RESET) + { + /* Clear the selected DMAy interrupt pending bits */ + DMA2->IFCR = DMAy_IT; + } + else + { + /* Clear the selected DMAy interrupt pending bits */ + DMA1->IFCR = DMAy_IT; + } +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_exti.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_exti.c new file mode 100644 index 0000000..ab73462 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_exti.c @@ -0,0 +1,269 @@ +/** + ****************************************************************************** + * @file stm32f10x_exti.c + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief This file provides all the EXTI firmware functions. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_exti.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup EXTI + * @brief EXTI driver modules + * @{ + */ + +/** @defgroup EXTI_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup EXTI_Private_Defines + * @{ + */ + +#define EXTI_LINENONE ((uint32_t)0x00000) /* No interrupt selected */ + +/** + * @} + */ + +/** @defgroup EXTI_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup EXTI_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup EXTI_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup EXTI_Private_Functions + * @{ + */ + +/** + * @brief Deinitializes the EXTI peripheral registers to their default reset values. + * @param None + * @retval None + */ +void EXTI_DeInit(void) +{ + EXTI->IMR = 0x00000000; + EXTI->EMR = 0x00000000; + EXTI->RTSR = 0x00000000; + EXTI->FTSR = 0x00000000; + EXTI->PR = 0x000FFFFF; +} + +/** + * @brief Initializes the EXTI peripheral according to the specified + * parameters in the EXTI_InitStruct. + * @param EXTI_InitStruct: pointer to a EXTI_InitTypeDef structure + * that contains the configuration information for the EXTI peripheral. + * @retval None + */ +void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct) +{ + uint32_t tmp = 0; + + /* Check the parameters */ + assert_param(IS_EXTI_MODE(EXTI_InitStruct->EXTI_Mode)); + assert_param(IS_EXTI_TRIGGER(EXTI_InitStruct->EXTI_Trigger)); + assert_param(IS_EXTI_LINE(EXTI_InitStruct->EXTI_Line)); + assert_param(IS_FUNCTIONAL_STATE(EXTI_InitStruct->EXTI_LineCmd)); + + tmp = (uint32_t)EXTI_BASE; + + if (EXTI_InitStruct->EXTI_LineCmd != DISABLE) + { + /* Clear EXTI line configuration */ + EXTI->IMR &= ~EXTI_InitStruct->EXTI_Line; + EXTI->EMR &= ~EXTI_InitStruct->EXTI_Line; + + tmp += EXTI_InitStruct->EXTI_Mode; + + *(__IO uint32_t *) tmp |= EXTI_InitStruct->EXTI_Line; + + /* Clear Rising Falling edge configuration */ + EXTI->RTSR &= ~EXTI_InitStruct->EXTI_Line; + EXTI->FTSR &= ~EXTI_InitStruct->EXTI_Line; + + /* Select the trigger for the selected external interrupts */ + if (EXTI_InitStruct->EXTI_Trigger == EXTI_Trigger_Rising_Falling) + { + /* Rising Falling edge */ + EXTI->RTSR |= EXTI_InitStruct->EXTI_Line; + EXTI->FTSR |= EXTI_InitStruct->EXTI_Line; + } + else + { + tmp = (uint32_t)EXTI_BASE; + tmp += EXTI_InitStruct->EXTI_Trigger; + + *(__IO uint32_t *) tmp |= EXTI_InitStruct->EXTI_Line; + } + } + else + { + tmp += EXTI_InitStruct->EXTI_Mode; + + /* Disable the selected external lines */ + *(__IO uint32_t *) tmp &= ~EXTI_InitStruct->EXTI_Line; + } +} + +/** + * @brief Fills each EXTI_InitStruct member with its reset value. + * @param EXTI_InitStruct: pointer to a EXTI_InitTypeDef structure which will + * be initialized. + * @retval None + */ +void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct) +{ + EXTI_InitStruct->EXTI_Line = EXTI_LINENONE; + EXTI_InitStruct->EXTI_Mode = EXTI_Mode_Interrupt; + EXTI_InitStruct->EXTI_Trigger = EXTI_Trigger_Falling; + EXTI_InitStruct->EXTI_LineCmd = DISABLE; +} + +/** + * @brief Generates a Software interrupt. + * @param EXTI_Line: specifies the EXTI lines to be enabled or disabled. + * This parameter can be any combination of EXTI_Linex where x can be (0..19). + * @retval None + */ +void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line) +{ + /* Check the parameters */ + assert_param(IS_EXTI_LINE(EXTI_Line)); + + EXTI->SWIER |= EXTI_Line; +} + +/** + * @brief Checks whether the specified EXTI line flag is set or not. + * @param EXTI_Line: specifies the EXTI line flag to check. + * This parameter can be: + * @arg EXTI_Linex: External interrupt line x where x(0..19) + * @retval The new state of EXTI_Line (SET or RESET). + */ +FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_GET_EXTI_LINE(EXTI_Line)); + + if ((EXTI->PR & EXTI_Line) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Clears the EXTI's line pending flags. + * @param EXTI_Line: specifies the EXTI lines flags to clear. + * This parameter can be any combination of EXTI_Linex where x can be (0..19). + * @retval None + */ +void EXTI_ClearFlag(uint32_t EXTI_Line) +{ + /* Check the parameters */ + assert_param(IS_EXTI_LINE(EXTI_Line)); + + EXTI->PR = EXTI_Line; +} + +/** + * @brief Checks whether the specified EXTI line is asserted or not. + * @param EXTI_Line: specifies the EXTI line to check. + * This parameter can be: + * @arg EXTI_Linex: External interrupt line x where x(0..19) + * @retval The new state of EXTI_Line (SET or RESET). + */ +ITStatus EXTI_GetITStatus(uint32_t EXTI_Line) +{ + ITStatus bitstatus = RESET; + uint32_t enablestatus = 0; + /* Check the parameters */ + assert_param(IS_GET_EXTI_LINE(EXTI_Line)); + + enablestatus = EXTI->IMR & EXTI_Line; + if (((EXTI->PR & EXTI_Line) != (uint32_t)RESET) && (enablestatus != (uint32_t)RESET)) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Clears the EXTI's line pending bits. + * @param EXTI_Line: specifies the EXTI lines to clear. + * This parameter can be any combination of EXTI_Linex where x can be (0..19). + * @retval None + */ +void EXTI_ClearITPendingBit(uint32_t EXTI_Line) +{ + /* Check the parameters */ + assert_param(IS_EXTI_LINE(EXTI_Line)); + + EXTI->PR = EXTI_Line; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_flash.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_flash.c new file mode 100644 index 0000000..f6c7bf1 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_flash.c @@ -0,0 +1,1684 @@ +/** + ****************************************************************************** + * @file stm32f10x_flash.c + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief This file provides all the FLASH firmware functions. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_flash.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup FLASH + * @brief FLASH driver modules + * @{ + */ + +/** @defgroup FLASH_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup FLASH_Private_Defines + * @{ + */ + +/* Flash Access Control Register bits */ +#define ACR_LATENCY_Mask ((uint32_t)0x00000038) +#define ACR_HLFCYA_Mask ((uint32_t)0xFFFFFFF7) +#define ACR_PRFTBE_Mask ((uint32_t)0xFFFFFFEF) + +/* Flash Access Control Register bits */ +#define ACR_PRFTBS_Mask ((uint32_t)0x00000020) + +/* Flash Control Register bits */ +#define CR_PG_Set ((uint32_t)0x00000001) +#define CR_PG_Reset ((uint32_t)0x00001FFE) +#define CR_PER_Set ((uint32_t)0x00000002) +#define CR_PER_Reset ((uint32_t)0x00001FFD) +#define CR_MER_Set ((uint32_t)0x00000004) +#define CR_MER_Reset ((uint32_t)0x00001FFB) +#define CR_OPTPG_Set ((uint32_t)0x00000010) +#define CR_OPTPG_Reset ((uint32_t)0x00001FEF) +#define CR_OPTER_Set ((uint32_t)0x00000020) +#define CR_OPTER_Reset ((uint32_t)0x00001FDF) +#define CR_STRT_Set ((uint32_t)0x00000040) +#define CR_LOCK_Set ((uint32_t)0x00000080) + +/* FLASH Mask */ +#define RDPRT_Mask ((uint32_t)0x00000002) +#define WRP0_Mask ((uint32_t)0x000000FF) +#define WRP1_Mask ((uint32_t)0x0000FF00) +#define WRP2_Mask ((uint32_t)0x00FF0000) +#define WRP3_Mask ((uint32_t)0xFF000000) +#define OB_USER_BFB2 ((uint16_t)0x0008) + +/* FLASH Keys */ +#define RDP_Key ((uint16_t)0x00A5) +#define FLASH_KEY1 ((uint32_t)0x45670123) +#define FLASH_KEY2 ((uint32_t)0xCDEF89AB) + +/* FLASH BANK address */ +#define FLASH_BANK1_END_ADDRESS ((uint32_t)0x807FFFF) + +/* Delay definition */ +#define EraseTimeout ((uint32_t)0x000B0000) +#define ProgramTimeout ((uint32_t)0x00002000) +/** + * @} + */ + +/** @defgroup FLASH_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup FLASH_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup FLASH_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup FLASH_Private_Functions + * @{ + */ + +/** +@code + + This driver provides functions to configure and program the Flash memory of all STM32F10x devices, + including the latest STM32F10x_XL density devices. + + STM32F10x_XL devices feature up to 1 Mbyte with dual bank architecture for read-while-write (RWW) capability: + - bank1: fixed size of 512 Kbytes (256 pages of 2Kbytes each) + - bank2: up to 512 Kbytes (up to 256 pages of 2Kbytes each) + While other STM32F10x devices features only one bank with memory up to 512 Kbytes. + + In version V3.3.0, some functions were updated and new ones were added to support + STM32F10x_XL devices. Thus some functions manages all devices, while other are + dedicated for XL devices only. + + The table below presents the list of available functions depending on the used STM32F10x devices. + + *************************************************** + * Legacy functions used for all STM32F10x devices * + *************************************************** + +----------------------------------------------------------------------------------------------------------------------------------+ + | Functions prototypes |STM32F10x_XL|Other STM32F10x| Comments | + | | devices | devices | | + |----------------------------------------------------------------------------------------------------------------------------------| + |FLASH_SetLatency | Yes | Yes | No change | + |----------------------------------------------------------------------------------------------------------------------------------| + |FLASH_HalfCycleAccessCmd | Yes | Yes | No change | + |----------------------------------------------------------------------------------------------------------------------------------| + |FLASH_PrefetchBufferCmd | Yes | Yes | No change | + |----------------------------------------------------------------------------------------------------------------------------------| + |FLASH_Unlock | Yes | Yes | - For STM32F10X_XL devices: unlock Bank1 and Bank2. | + | | | | - For other devices: unlock Bank1 and it is equivalent | + | | | | to FLASH_UnlockBank1 function. | + |----------------------------------------------------------------------------------------------------------------------------------| + |FLASH_Lock | Yes | Yes | - For STM32F10X_XL devices: lock Bank1 and Bank2. | + | | | | - For other devices: lock Bank1 and it is equivalent | + | | | | to FLASH_LockBank1 function. | + |----------------------------------------------------------------------------------------------------------------------------------| + |FLASH_ErasePage | Yes | Yes | - For STM32F10x_XL devices: erase a page in Bank1 and Bank2 | + | | | | - For other devices: erase a page in Bank1 | + |----------------------------------------------------------------------------------------------------------------------------------| + |FLASH_EraseAllPages | Yes | Yes | - For STM32F10x_XL devices: erase all pages in Bank1 and Bank2 | + | | | | - For other devices: erase all pages in Bank1 | + |----------------------------------------------------------------------------------------------------------------------------------| + |FLASH_EraseOptionBytes | Yes | Yes | No change | + |----------------------------------------------------------------------------------------------------------------------------------| + |FLASH_ProgramWord | Yes | Yes | Updated to program up to 1MByte (depending on the used device) | + |----------------------------------------------------------------------------------------------------------------------------------| + |FLASH_ProgramHalfWord | Yes | Yes | Updated to program up to 1MByte (depending on the used device) | + |----------------------------------------------------------------------------------------------------------------------------------| + |FLASH_ProgramOptionByteData | Yes | Yes | No change | + |----------------------------------------------------------------------------------------------------------------------------------| + |FLASH_EnableWriteProtection | Yes | Yes | No change | + |----------------------------------------------------------------------------------------------------------------------------------| + |FLASH_ReadOutProtection | Yes | Yes | No change | + |----------------------------------------------------------------------------------------------------------------------------------| + |FLASH_UserOptionByteConfig | Yes | Yes | No change | + |----------------------------------------------------------------------------------------------------------------------------------| + |FLASH_GetUserOptionByte | Yes | Yes | No change | + |----------------------------------------------------------------------------------------------------------------------------------| + |FLASH_GetWriteProtectionOptionByte | Yes | Yes | No change | + |----------------------------------------------------------------------------------------------------------------------------------| + |FLASH_GetReadOutProtectionStatus | Yes | Yes | No change | + |----------------------------------------------------------------------------------------------------------------------------------| + |FLASH_GetPrefetchBufferStatus | Yes | Yes | No change | + |----------------------------------------------------------------------------------------------------------------------------------| + |FLASH_ITConfig | Yes | Yes | - For STM32F10x_XL devices: enable Bank1 and Bank2's interrupts| + | | | | - For other devices: enable Bank1's interrupts | + |----------------------------------------------------------------------------------------------------------------------------------| + |FLASH_GetFlagStatus | Yes | Yes | - For STM32F10x_XL devices: return Bank1 and Bank2's flag status| + | | | | - For other devices: return Bank1's flag status | + |----------------------------------------------------------------------------------------------------------------------------------| + |FLASH_ClearFlag | Yes | Yes | - For STM32F10x_XL devices: clear Bank1 and Bank2's flag | + | | | | - For other devices: clear Bank1's flag | + |----------------------------------------------------------------------------------------------------------------------------------| + |FLASH_GetStatus | Yes | Yes | - Return the status of Bank1 (for all devices) | + | | | | equivalent to FLASH_GetBank1Status function | + |----------------------------------------------------------------------------------------------------------------------------------| + |FLASH_WaitForLastOperation | Yes | Yes | - Wait for Bank1 last operation (for all devices) | + | | | | equivalent to: FLASH_WaitForLastBank1Operation function | + +----------------------------------------------------------------------------------------------------------------------------------+ + + ************************************************************************************************************************ + * New functions used for all STM32F10x devices to manage Bank1: * + * - These functions are mainly useful for STM32F10x_XL density devices, to have separate control for Bank1 and bank2 * + * - For other devices, these functions are optional (covered by functions listed above) * + ************************************************************************************************************************ + +----------------------------------------------------------------------------------------------------------------------------------+ + | Functions prototypes |STM32F10x_XL|Other STM32F10x| Comments | + | | devices | devices | | + |----------------------------------------------------------------------------------------------------------------------------------| + | FLASH_UnlockBank1 | Yes | Yes | - Unlock Bank1 | + |----------------------------------------------------------------------------------------------------------------------------------| + |FLASH_LockBank1 | Yes | Yes | - Lock Bank1 | + |----------------------------------------------------------------------------------------------------------------------------------| + | FLASH_EraseAllBank1Pages | Yes | Yes | - Erase all pages in Bank1 | + |----------------------------------------------------------------------------------------------------------------------------------| + | FLASH_GetBank1Status | Yes | Yes | - Return the status of Bank1 | + |----------------------------------------------------------------------------------------------------------------------------------| + | FLASH_WaitForLastBank1Operation | Yes | Yes | - Wait for Bank1 last operation | + +----------------------------------------------------------------------------------------------------------------------------------+ + + ***************************************************************************** + * New Functions used only with STM32F10x_XL density devices to manage Bank2 * + ***************************************************************************** + +----------------------------------------------------------------------------------------------------------------------------------+ + | Functions prototypes |STM32F10x_XL|Other STM32F10x| Comments | + | | devices | devices | | + |----------------------------------------------------------------------------------------------------------------------------------| + | FLASH_UnlockBank2 | Yes | No | - Unlock Bank2 | + |----------------------------------------------------------------------------------------------------------------------------------| + |FLASH_LockBank2 | Yes | No | - Lock Bank2 | + |----------------------------------------------------------------------------------------------------------------------------------| + | FLASH_EraseAllBank2Pages | Yes | No | - Erase all pages in Bank2 | + |----------------------------------------------------------------------------------------------------------------------------------| + | FLASH_GetBank2Status | Yes | No | - Return the status of Bank2 | + |----------------------------------------------------------------------------------------------------------------------------------| + | FLASH_WaitForLastBank2Operation | Yes | No | - Wait for Bank2 last operation | + |----------------------------------------------------------------------------------------------------------------------------------| + | FLASH_BootConfig | Yes | No | - Configure to boot from Bank1 or Bank2 | + +----------------------------------------------------------------------------------------------------------------------------------+ +@endcode +*/ + + +/** + * @brief Sets the code latency value. + * @note This function can be used for all STM32F10x devices. + * @param FLASH_Latency: specifies the FLASH Latency value. + * This parameter can be one of the following values: + * @arg FLASH_Latency_0: FLASH Zero Latency cycle + * @arg FLASH_Latency_1: FLASH One Latency cycle + * @arg FLASH_Latency_2: FLASH Two Latency cycles + * @retval None + */ +void FLASH_SetLatency(uint32_t FLASH_Latency) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_FLASH_LATENCY(FLASH_Latency)); + + /* Read the ACR register */ + tmpreg = FLASH->ACR; + + /* Sets the Latency value */ + tmpreg &= ACR_LATENCY_Mask; + tmpreg |= FLASH_Latency; + + /* Write the ACR register */ + FLASH->ACR = tmpreg; +} + +/** + * @brief Enables or disables the Half cycle flash access. + * @note This function can be used for all STM32F10x devices. + * @param FLASH_HalfCycleAccess: specifies the FLASH Half cycle Access mode. + * This parameter can be one of the following values: + * @arg FLASH_HalfCycleAccess_Enable: FLASH Half Cycle Enable + * @arg FLASH_HalfCycleAccess_Disable: FLASH Half Cycle Disable + * @retval None + */ +void FLASH_HalfCycleAccessCmd(uint32_t FLASH_HalfCycleAccess) +{ + /* Check the parameters */ + assert_param(IS_FLASH_HALFCYCLEACCESS_STATE(FLASH_HalfCycleAccess)); + + /* Enable or disable the Half cycle access */ + FLASH->ACR &= ACR_HLFCYA_Mask; + FLASH->ACR |= FLASH_HalfCycleAccess; +} + +/** + * @brief Enables or disables the Prefetch Buffer. + * @note This function can be used for all STM32F10x devices. + * @param FLASH_PrefetchBuffer: specifies the Prefetch buffer status. + * This parameter can be one of the following values: + * @arg FLASH_PrefetchBuffer_Enable: FLASH Prefetch Buffer Enable + * @arg FLASH_PrefetchBuffer_Disable: FLASH Prefetch Buffer Disable + * @retval None + */ +void FLASH_PrefetchBufferCmd(uint32_t FLASH_PrefetchBuffer) +{ + /* Check the parameters */ + assert_param(IS_FLASH_PREFETCHBUFFER_STATE(FLASH_PrefetchBuffer)); + + /* Enable or disable the Prefetch Buffer */ + FLASH->ACR &= ACR_PRFTBE_Mask; + FLASH->ACR |= FLASH_PrefetchBuffer; +} + +/** + * @brief Unlocks the FLASH Program Erase Controller. + * @note This function can be used for all STM32F10x devices. + * - For STM32F10X_XL devices this function unlocks Bank1 and Bank2. + * - For all other devices it unlocks Bank1 and it is equivalent + * to FLASH_UnlockBank1 function.. + * @param None + * @retval None + */ +void FLASH_Unlock(void) +{ + /* Authorize the FPEC of Bank1 Access */ + FLASH->KEYR = FLASH_KEY1; + FLASH->KEYR = FLASH_KEY2; + +#ifdef STM32F10X_XL + /* Authorize the FPEC of Bank2 Access */ + FLASH->KEYR2 = FLASH_KEY1; + FLASH->KEYR2 = FLASH_KEY2; +#endif /* STM32F10X_XL */ +} +/** + * @brief Unlocks the FLASH Bank1 Program Erase Controller. + * @note This function can be used for all STM32F10x devices. + * - For STM32F10X_XL devices this function unlocks Bank1. + * - For all other devices it unlocks Bank1 and it is + * equivalent to FLASH_Unlock function. + * @param None + * @retval None + */ +void FLASH_UnlockBank1(void) +{ + /* Authorize the FPEC of Bank1 Access */ + FLASH->KEYR = FLASH_KEY1; + FLASH->KEYR = FLASH_KEY2; +} + +#ifdef STM32F10X_XL +/** + * @brief Unlocks the FLASH Bank2 Program Erase Controller. + * @note This function can be used only for STM32F10X_XL density devices. + * @param None + * @retval None + */ +void FLASH_UnlockBank2(void) +{ + /* Authorize the FPEC of Bank2 Access */ + FLASH->KEYR2 = FLASH_KEY1; + FLASH->KEYR2 = FLASH_KEY2; + +} +#endif /* STM32F10X_XL */ + +/** + * @brief Locks the FLASH Program Erase Controller. + * @note This function can be used for all STM32F10x devices. + * - For STM32F10X_XL devices this function Locks Bank1 and Bank2. + * - For all other devices it Locks Bank1 and it is equivalent + * to FLASH_LockBank1 function. + * @param None + * @retval None + */ +void FLASH_Lock(void) +{ + /* Set the Lock Bit to lock the FPEC and the CR of Bank1 */ + FLASH->CR |= CR_LOCK_Set; + +#ifdef STM32F10X_XL + /* Set the Lock Bit to lock the FPEC and the CR of Bank2 */ + FLASH->CR2 |= CR_LOCK_Set; +#endif /* STM32F10X_XL */ +} + +/** + * @brief Locks the FLASH Bank1 Program Erase Controller. + * @note this function can be used for all STM32F10x devices. + * - For STM32F10X_XL devices this function Locks Bank1. + * - For all other devices it Locks Bank1 and it is equivalent + * to FLASH_Lock function. + * @param None + * @retval None + */ +void FLASH_LockBank1(void) +{ + /* Set the Lock Bit to lock the FPEC and the CR of Bank1 */ + FLASH->CR |= CR_LOCK_Set; +} + +#ifdef STM32F10X_XL +/** + * @brief Locks the FLASH Bank2 Program Erase Controller. + * @note This function can be used only for STM32F10X_XL density devices. + * @param None + * @retval None + */ +void FLASH_LockBank2(void) +{ + /* Set the Lock Bit to lock the FPEC and the CR of Bank2 */ + FLASH->CR2 |= CR_LOCK_Set; +} +#endif /* STM32F10X_XL */ + +/** + * @brief Erases a specified FLASH page. + * @note This function can be used for all STM32F10x devices. + * @param Page_Address: The page address to be erased. + * @retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_ErasePage(uint32_t Page_Address) +{ + FLASH_Status status = FLASH_COMPLETE; + /* Check the parameters */ + assert_param(IS_FLASH_ADDRESS(Page_Address)); + +#ifdef STM32F10X_XL + if(Page_Address < FLASH_BANK1_END_ADDRESS) + { + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastBank1Operation(EraseTimeout); + if(status == FLASH_COMPLETE) + { + /* if the previous operation is completed, proceed to erase the page */ + FLASH->CR|= CR_PER_Set; + FLASH->AR = Page_Address; + FLASH->CR|= CR_STRT_Set; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastBank1Operation(EraseTimeout); + + /* Disable the PER Bit */ + FLASH->CR &= CR_PER_Reset; + } + } + else + { + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastBank2Operation(EraseTimeout); + if(status == FLASH_COMPLETE) + { + /* if the previous operation is completed, proceed to erase the page */ + FLASH->CR2|= CR_PER_Set; + FLASH->AR2 = Page_Address; + FLASH->CR2|= CR_STRT_Set; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastBank2Operation(EraseTimeout); + + /* Disable the PER Bit */ + FLASH->CR2 &= CR_PER_Reset; + } + } +#else + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(EraseTimeout); + + if(status == FLASH_COMPLETE) + { + /* if the previous operation is completed, proceed to erase the page */ + FLASH->CR|= CR_PER_Set; + FLASH->AR = Page_Address; + FLASH->CR|= CR_STRT_Set; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(EraseTimeout); + + /* Disable the PER Bit */ + FLASH->CR &= CR_PER_Reset; + } +#endif /* STM32F10X_XL */ + + /* Return the Erase Status */ + return status; +} + +/** + * @brief Erases all FLASH pages. + * @note This function can be used for all STM32F10x devices. + * @param None + * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_EraseAllPages(void) +{ + FLASH_Status status = FLASH_COMPLETE; + +#ifdef STM32F10X_XL + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastBank1Operation(EraseTimeout); + + if(status == FLASH_COMPLETE) + { + /* if the previous operation is completed, proceed to erase all pages */ + FLASH->CR |= CR_MER_Set; + FLASH->CR |= CR_STRT_Set; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastBank1Operation(EraseTimeout); + + /* Disable the MER Bit */ + FLASH->CR &= CR_MER_Reset; + } + if(status == FLASH_COMPLETE) + { + /* if the previous operation is completed, proceed to erase all pages */ + FLASH->CR2 |= CR_MER_Set; + FLASH->CR2 |= CR_STRT_Set; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastBank2Operation(EraseTimeout); + + /* Disable the MER Bit */ + FLASH->CR2 &= CR_MER_Reset; + } +#else + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(EraseTimeout); + if(status == FLASH_COMPLETE) + { + /* if the previous operation is completed, proceed to erase all pages */ + FLASH->CR |= CR_MER_Set; + FLASH->CR |= CR_STRT_Set; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(EraseTimeout); + + /* Disable the MER Bit */ + FLASH->CR &= CR_MER_Reset; + } +#endif /* STM32F10X_XL */ + + /* Return the Erase Status */ + return status; +} + +/** + * @brief Erases all Bank1 FLASH pages. + * @note This function can be used for all STM32F10x devices. + * - For STM32F10X_XL devices this function erases all Bank1 pages. + * - For all other devices it erases all Bank1 pages and it is equivalent + * to FLASH_EraseAllPages function. + * @param None + * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_EraseAllBank1Pages(void) +{ + FLASH_Status status = FLASH_COMPLETE; + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastBank1Operation(EraseTimeout); + + if(status == FLASH_COMPLETE) + { + /* if the previous operation is completed, proceed to erase all pages */ + FLASH->CR |= CR_MER_Set; + FLASH->CR |= CR_STRT_Set; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastBank1Operation(EraseTimeout); + + /* Disable the MER Bit */ + FLASH->CR &= CR_MER_Reset; + } + /* Return the Erase Status */ + return status; +} + +#ifdef STM32F10X_XL +/** + * @brief Erases all Bank2 FLASH pages. + * @note This function can be used only for STM32F10x_XL density devices. + * @param None + * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_EraseAllBank2Pages(void) +{ + FLASH_Status status = FLASH_COMPLETE; + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastBank2Operation(EraseTimeout); + + if(status == FLASH_COMPLETE) + { + /* if the previous operation is completed, proceed to erase all pages */ + FLASH->CR2 |= CR_MER_Set; + FLASH->CR2 |= CR_STRT_Set; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastBank2Operation(EraseTimeout); + + /* Disable the MER Bit */ + FLASH->CR2 &= CR_MER_Reset; + } + /* Return the Erase Status */ + return status; +} +#endif /* STM32F10X_XL */ + +/** + * @brief Erases the FLASH option bytes. + * @note This functions erases all option bytes except the Read protection (RDP). + * @note This function can be used for all STM32F10x devices. + * @param None + * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_EraseOptionBytes(void) +{ + uint16_t rdptmp = RDP_Key; + + FLASH_Status status = FLASH_COMPLETE; + + /* Get the actual read protection Option Byte value */ + if(FLASH_GetReadOutProtectionStatus() != RESET) + { + rdptmp = 0x00; + } + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(EraseTimeout); + if(status == FLASH_COMPLETE) + { + /* Authorize the small information block programming */ + FLASH->OPTKEYR = FLASH_KEY1; + FLASH->OPTKEYR = FLASH_KEY2; + + /* if the previous operation is completed, proceed to erase the option bytes */ + FLASH->CR |= CR_OPTER_Set; + FLASH->CR |= CR_STRT_Set; + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(EraseTimeout); + + if(status == FLASH_COMPLETE) + { + /* if the erase operation is completed, disable the OPTER Bit */ + FLASH->CR &= CR_OPTER_Reset; + + /* Enable the Option Bytes Programming operation */ + FLASH->CR |= CR_OPTPG_Set; + /* Restore the last read protection Option Byte value */ + OB->RDP = (uint16_t)rdptmp; + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + + if(status != FLASH_TIMEOUT) + { + /* if the program operation is completed, disable the OPTPG Bit */ + FLASH->CR &= CR_OPTPG_Reset; + } + } + else + { + if (status != FLASH_TIMEOUT) + { + /* Disable the OPTPG Bit */ + FLASH->CR &= CR_OPTPG_Reset; + } + } + } + /* Return the erase status */ + return status; +} + +/** + * @brief Programs a word at a specified address. + * @note This function can be used for all STM32F10x devices. + * @param Address: specifies the address to be programmed. + * @param Data: specifies the data to be programmed. + * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data) +{ + FLASH_Status status = FLASH_COMPLETE; + __IO uint32_t tmp = 0; + + /* Check the parameters */ + assert_param(IS_FLASH_ADDRESS(Address)); + +#ifdef STM32F10X_XL + if(Address < FLASH_BANK1_END_ADDRESS - 2) + { + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastBank1Operation(ProgramTimeout); + if(status == FLASH_COMPLETE) + { + /* if the previous operation is completed, proceed to program the new first + half word */ + FLASH->CR |= CR_PG_Set; + + *(__IO uint16_t*)Address = (uint16_t)Data; + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + + if(status == FLASH_COMPLETE) + { + /* if the previous operation is completed, proceed to program the new second + half word */ + tmp = Address + 2; + + *(__IO uint16_t*) tmp = Data >> 16; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + + /* Disable the PG Bit */ + FLASH->CR &= CR_PG_Reset; + } + else + { + /* Disable the PG Bit */ + FLASH->CR &= CR_PG_Reset; + } + } + } + else if(Address == (FLASH_BANK1_END_ADDRESS - 1)) + { + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastBank1Operation(ProgramTimeout); + + if(status == FLASH_COMPLETE) + { + /* if the previous operation is completed, proceed to program the new first + half word */ + FLASH->CR |= CR_PG_Set; + + *(__IO uint16_t*)Address = (uint16_t)Data; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastBank1Operation(ProgramTimeout); + + /* Disable the PG Bit */ + FLASH->CR &= CR_PG_Reset; + } + else + { + /* Disable the PG Bit */ + FLASH->CR &= CR_PG_Reset; + } + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastBank2Operation(ProgramTimeout); + + if(status == FLASH_COMPLETE) + { + /* if the previous operation is completed, proceed to program the new second + half word */ + FLASH->CR2 |= CR_PG_Set; + tmp = Address + 2; + + *(__IO uint16_t*) tmp = Data >> 16; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastBank2Operation(ProgramTimeout); + + /* Disable the PG Bit */ + FLASH->CR2 &= CR_PG_Reset; + } + else + { + /* Disable the PG Bit */ + FLASH->CR2 &= CR_PG_Reset; + } + } + else + { + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastBank2Operation(ProgramTimeout); + + if(status == FLASH_COMPLETE) + { + /* if the previous operation is completed, proceed to program the new first + half word */ + FLASH->CR2 |= CR_PG_Set; + + *(__IO uint16_t*)Address = (uint16_t)Data; + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastBank2Operation(ProgramTimeout); + + if(status == FLASH_COMPLETE) + { + /* if the previous operation is completed, proceed to program the new second + half word */ + tmp = Address + 2; + + *(__IO uint16_t*) tmp = Data >> 16; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastBank2Operation(ProgramTimeout); + + /* Disable the PG Bit */ + FLASH->CR2 &= CR_PG_Reset; + } + else + { + /* Disable the PG Bit */ + FLASH->CR2 &= CR_PG_Reset; + } + } + } +#else + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + + if(status == FLASH_COMPLETE) + { + /* if the previous operation is completed, proceed to program the new first + half word */ + FLASH->CR |= CR_PG_Set; + + *(__IO uint16_t*)Address = (uint16_t)Data; + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + + if(status == FLASH_COMPLETE) + { + /* if the previous operation is completed, proceed to program the new second + half word */ + tmp = Address + 2; + + *(__IO uint16_t*) tmp = Data >> 16; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + + /* Disable the PG Bit */ + FLASH->CR &= CR_PG_Reset; + } + else + { + /* Disable the PG Bit */ + FLASH->CR &= CR_PG_Reset; + } + } +#endif /* STM32F10X_XL */ + + /* Return the Program Status */ + return status; +} + +/** + * @brief Programs a half word at a specified address. + * @note This function can be used for all STM32F10x devices. + * @param Address: specifies the address to be programmed. + * @param Data: specifies the data to be programmed. + * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data) +{ + FLASH_Status status = FLASH_COMPLETE; + /* Check the parameters */ + assert_param(IS_FLASH_ADDRESS(Address)); + +#ifdef STM32F10X_XL + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + + if(Address < FLASH_BANK1_END_ADDRESS) + { + if(status == FLASH_COMPLETE) + { + /* if the previous operation is completed, proceed to program the new data */ + FLASH->CR |= CR_PG_Set; + + *(__IO uint16_t*)Address = Data; + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastBank1Operation(ProgramTimeout); + + /* Disable the PG Bit */ + FLASH->CR &= CR_PG_Reset; + } + } + else + { + if(status == FLASH_COMPLETE) + { + /* if the previous operation is completed, proceed to program the new data */ + FLASH->CR2 |= CR_PG_Set; + + *(__IO uint16_t*)Address = Data; + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastBank2Operation(ProgramTimeout); + + /* Disable the PG Bit */ + FLASH->CR2 &= CR_PG_Reset; + } + } +#else + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + + if(status == FLASH_COMPLETE) + { + /* if the previous operation is completed, proceed to program the new data */ + FLASH->CR |= CR_PG_Set; + + *(__IO uint16_t*)Address = Data; + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + + /* Disable the PG Bit */ + FLASH->CR &= CR_PG_Reset; + } +#endif /* STM32F10X_XL */ + + /* Return the Program Status */ + return status; +} + +/** + * @brief Programs a half word at a specified Option Byte Data address. + * @note This function can be used for all STM32F10x devices. + * @param Address: specifies the address to be programmed. + * This parameter can be 0x1FFFF804 or 0x1FFFF806. + * @param Data: specifies the data to be programmed. + * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_ProgramOptionByteData(uint32_t Address, uint8_t Data) +{ + FLASH_Status status = FLASH_COMPLETE; + /* Check the parameters */ + assert_param(IS_OB_DATA_ADDRESS(Address)); + status = FLASH_WaitForLastOperation(ProgramTimeout); + + if(status == FLASH_COMPLETE) + { + /* Authorize the small information block programming */ + FLASH->OPTKEYR = FLASH_KEY1; + FLASH->OPTKEYR = FLASH_KEY2; + /* Enables the Option Bytes Programming operation */ + FLASH->CR |= CR_OPTPG_Set; + *(__IO uint16_t*)Address = Data; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + if(status != FLASH_TIMEOUT) + { + /* if the program operation is completed, disable the OPTPG Bit */ + FLASH->CR &= CR_OPTPG_Reset; + } + } + /* Return the Option Byte Data Program Status */ + return status; +} + +/** + * @brief Write protects the desired pages + * @note This function can be used for all STM32F10x devices. + * @param FLASH_Pages: specifies the address of the pages to be write protected. + * This parameter can be: + * @arg For @b STM32_Low-density_devices: value between FLASH_WRProt_Pages0to3 and FLASH_WRProt_Pages28to31 + * @arg For @b STM32_Medium-density_devices: value between FLASH_WRProt_Pages0to3 + * and FLASH_WRProt_Pages124to127 + * @arg For @b STM32_High-density_devices: value between FLASH_WRProt_Pages0to1 and + * FLASH_WRProt_Pages60to61 or FLASH_WRProt_Pages62to255 + * @arg For @b STM32_Connectivity_line_devices: value between FLASH_WRProt_Pages0to1 and + * FLASH_WRProt_Pages60to61 or FLASH_WRProt_Pages62to127 + * @arg For @b STM32_XL-density_devices: value between FLASH_WRProt_Pages0to1 and + * FLASH_WRProt_Pages60to61 or FLASH_WRProt_Pages62to511 + * @arg FLASH_WRProt_AllPages + * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_EnableWriteProtection(uint32_t FLASH_Pages) +{ + uint16_t WRP0_Data = 0xFFFF, WRP1_Data = 0xFFFF, WRP2_Data = 0xFFFF, WRP3_Data = 0xFFFF; + + FLASH_Status status = FLASH_COMPLETE; + + /* Check the parameters */ + assert_param(IS_FLASH_WRPROT_PAGE(FLASH_Pages)); + + FLASH_Pages = (uint32_t)(~FLASH_Pages); + WRP0_Data = (uint16_t)(FLASH_Pages & WRP0_Mask); + WRP1_Data = (uint16_t)((FLASH_Pages & WRP1_Mask) >> 8); + WRP2_Data = (uint16_t)((FLASH_Pages & WRP2_Mask) >> 16); + WRP3_Data = (uint16_t)((FLASH_Pages & WRP3_Mask) >> 24); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + + if(status == FLASH_COMPLETE) + { + /* Authorizes the small information block programming */ + FLASH->OPTKEYR = FLASH_KEY1; + FLASH->OPTKEYR = FLASH_KEY2; + FLASH->CR |= CR_OPTPG_Set; + if(WRP0_Data != 0xFF) + { + OB->WRP0 = WRP0_Data; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + } + if((status == FLASH_COMPLETE) && (WRP1_Data != 0xFF)) + { + OB->WRP1 = WRP1_Data; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + } + if((status == FLASH_COMPLETE) && (WRP2_Data != 0xFF)) + { + OB->WRP2 = WRP2_Data; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + } + + if((status == FLASH_COMPLETE)&& (WRP3_Data != 0xFF)) + { + OB->WRP3 = WRP3_Data; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + } + + if(status != FLASH_TIMEOUT) + { + /* if the program operation is completed, disable the OPTPG Bit */ + FLASH->CR &= CR_OPTPG_Reset; + } + } + /* Return the write protection operation Status */ + return status; +} + +/** + * @brief Enables or disables the read out protection. + * @note If the user has already programmed the other option bytes before calling + * this function, he must re-program them since this function erases all option bytes. + * @note This function can be used for all STM32F10x devices. + * @param Newstate: new state of the ReadOut Protection. + * This parameter can be: ENABLE or DISABLE. + * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_ReadOutProtection(FunctionalState NewState) +{ + FLASH_Status status = FLASH_COMPLETE; + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + status = FLASH_WaitForLastOperation(EraseTimeout); + if(status == FLASH_COMPLETE) + { + /* Authorizes the small information block programming */ + FLASH->OPTKEYR = FLASH_KEY1; + FLASH->OPTKEYR = FLASH_KEY2; + FLASH->CR |= CR_OPTER_Set; + FLASH->CR |= CR_STRT_Set; + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(EraseTimeout); + if(status == FLASH_COMPLETE) + { + /* if the erase operation is completed, disable the OPTER Bit */ + FLASH->CR &= CR_OPTER_Reset; + /* Enable the Option Bytes Programming operation */ + FLASH->CR |= CR_OPTPG_Set; + if(NewState != DISABLE) + { + OB->RDP = 0x00; + } + else + { + OB->RDP = RDP_Key; + } + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(EraseTimeout); + + if(status != FLASH_TIMEOUT) + { + /* if the program operation is completed, disable the OPTPG Bit */ + FLASH->CR &= CR_OPTPG_Reset; + } + } + else + { + if(status != FLASH_TIMEOUT) + { + /* Disable the OPTER Bit */ + FLASH->CR &= CR_OPTER_Reset; + } + } + } + /* Return the protection operation Status */ + return status; +} + +/** + * @brief Programs the FLASH User Option Byte: IWDG_SW / RST_STOP / RST_STDBY. + * @note This function can be used for all STM32F10x devices. + * @param OB_IWDG: Selects the IWDG mode + * This parameter can be one of the following values: + * @arg OB_IWDG_SW: Software IWDG selected + * @arg OB_IWDG_HW: Hardware IWDG selected + * @param OB_STOP: Reset event when entering STOP mode. + * This parameter can be one of the following values: + * @arg OB_STOP_NoRST: No reset generated when entering in STOP + * @arg OB_STOP_RST: Reset generated when entering in STOP + * @param OB_STDBY: Reset event when entering Standby mode. + * This parameter can be one of the following values: + * @arg OB_STDBY_NoRST: No reset generated when entering in STANDBY + * @arg OB_STDBY_RST: Reset generated when entering in STANDBY + * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_UserOptionByteConfig(uint16_t OB_IWDG, uint16_t OB_STOP, uint16_t OB_STDBY) +{ + FLASH_Status status = FLASH_COMPLETE; + + /* Check the parameters */ + assert_param(IS_OB_IWDG_SOURCE(OB_IWDG)); + assert_param(IS_OB_STOP_SOURCE(OB_STOP)); + assert_param(IS_OB_STDBY_SOURCE(OB_STDBY)); + + /* Authorize the small information block programming */ + FLASH->OPTKEYR = FLASH_KEY1; + FLASH->OPTKEYR = FLASH_KEY2; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + + if(status == FLASH_COMPLETE) + { + /* Enable the Option Bytes Programming operation */ + FLASH->CR |= CR_OPTPG_Set; + + OB->USER = OB_IWDG | (uint16_t)(OB_STOP | (uint16_t)(OB_STDBY | ((uint16_t)0xF8))); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + if(status != FLASH_TIMEOUT) + { + /* if the program operation is completed, disable the OPTPG Bit */ + FLASH->CR &= CR_OPTPG_Reset; + } + } + /* Return the Option Byte program Status */ + return status; +} + +#ifdef STM32F10X_XL +/** + * @brief Configures to boot from Bank1 or Bank2. + * @note This function can be used only for STM32F10x_XL density devices. + * @param FLASH_BOOT: select the FLASH Bank to boot from. + * This parameter can be one of the following values: + * @arg FLASH_BOOT_Bank1: At startup, if boot pins are set in boot from user Flash + * position and this parameter is selected the device will boot from Bank1(Default). + * @arg FLASH_BOOT_Bank2: At startup, if boot pins are set in boot from user Flash + * position and this parameter is selected the device will boot from Bank2 or Bank1, + * depending on the activation of the bank. The active banks are checked in + * the following order: Bank2, followed by Bank1. + * The active bank is recognized by the value programmed at the base address + * of the respective bank (corresponding to the initial stack pointer value + * in the interrupt vector table). + * For more information, please refer to AN2606 from www.st.com. + * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_BootConfig(uint16_t FLASH_BOOT) +{ + FLASH_Status status = FLASH_COMPLETE; + assert_param(IS_FLASH_BOOT(FLASH_BOOT)); + /* Authorize the small information block programming */ + FLASH->OPTKEYR = FLASH_KEY1; + FLASH->OPTKEYR = FLASH_KEY2; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + + if(status == FLASH_COMPLETE) + { + /* Enable the Option Bytes Programming operation */ + FLASH->CR |= CR_OPTPG_Set; + + if(FLASH_BOOT == FLASH_BOOT_Bank1) + { + OB->USER |= OB_USER_BFB2; + } + else + { + OB->USER &= (uint16_t)(~(uint16_t)(OB_USER_BFB2)); + } + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + if(status != FLASH_TIMEOUT) + { + /* if the program operation is completed, disable the OPTPG Bit */ + FLASH->CR &= CR_OPTPG_Reset; + } + } + /* Return the Option Byte program Status */ + return status; +} +#endif /* STM32F10X_XL */ + +/** + * @brief Returns the FLASH User Option Bytes values. + * @note This function can be used for all STM32F10x devices. + * @param None + * @retval The FLASH User Option Bytes values:IWDG_SW(Bit0), RST_STOP(Bit1) + * and RST_STDBY(Bit2). + */ +uint32_t FLASH_GetUserOptionByte(void) +{ + /* Return the User Option Byte */ + return (uint32_t)(FLASH->OBR >> 2); +} + +/** + * @brief Returns the FLASH Write Protection Option Bytes Register value. + * @note This function can be used for all STM32F10x devices. + * @param None + * @retval The FLASH Write Protection Option Bytes Register value + */ +uint32_t FLASH_GetWriteProtectionOptionByte(void) +{ + /* Return the Flash write protection Register value */ + return (uint32_t)(FLASH->WRPR); +} + +/** + * @brief Checks whether the FLASH Read Out Protection Status is set or not. + * @note This function can be used for all STM32F10x devices. + * @param None + * @retval FLASH ReadOut Protection Status(SET or RESET) + */ +FlagStatus FLASH_GetReadOutProtectionStatus(void) +{ + FlagStatus readoutstatus = RESET; + if ((FLASH->OBR & RDPRT_Mask) != (uint32_t)RESET) + { + readoutstatus = SET; + } + else + { + readoutstatus = RESET; + } + return readoutstatus; +} + +/** + * @brief Checks whether the FLASH Prefetch Buffer status is set or not. + * @note This function can be used for all STM32F10x devices. + * @param None + * @retval FLASH Prefetch Buffer Status (SET or RESET). + */ +FlagStatus FLASH_GetPrefetchBufferStatus(void) +{ + FlagStatus bitstatus = RESET; + + if ((FLASH->ACR & ACR_PRFTBS_Mask) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + /* Return the new state of FLASH Prefetch Buffer Status (SET or RESET) */ + return bitstatus; +} + +/** + * @brief Enables or disables the specified FLASH interrupts. + * @note This function can be used for all STM32F10x devices. + * - For STM32F10X_XL devices, enables or disables the specified FLASH interrupts + for Bank1 and Bank2. + * - For other devices it enables or disables the specified FLASH interrupts for Bank1. + * @param FLASH_IT: specifies the FLASH interrupt sources to be enabled or disabled. + * This parameter can be any combination of the following values: + * @arg FLASH_IT_ERROR: FLASH Error Interrupt + * @arg FLASH_IT_EOP: FLASH end of operation Interrupt + * @param NewState: new state of the specified Flash interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void FLASH_ITConfig(uint32_t FLASH_IT, FunctionalState NewState) +{ +#ifdef STM32F10X_XL + /* Check the parameters */ + assert_param(IS_FLASH_IT(FLASH_IT)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if((FLASH_IT & 0x80000000) != 0x0) + { + if(NewState != DISABLE) + { + /* Enable the interrupt sources */ + FLASH->CR2 |= (FLASH_IT & 0x7FFFFFFF); + } + else + { + /* Disable the interrupt sources */ + FLASH->CR2 &= ~(uint32_t)(FLASH_IT & 0x7FFFFFFF); + } + } + else + { + if(NewState != DISABLE) + { + /* Enable the interrupt sources */ + FLASH->CR |= FLASH_IT; + } + else + { + /* Disable the interrupt sources */ + FLASH->CR &= ~(uint32_t)FLASH_IT; + } + } +#else + /* Check the parameters */ + assert_param(IS_FLASH_IT(FLASH_IT)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if(NewState != DISABLE) + { + /* Enable the interrupt sources */ + FLASH->CR |= FLASH_IT; + } + else + { + /* Disable the interrupt sources */ + FLASH->CR &= ~(uint32_t)FLASH_IT; + } +#endif /* STM32F10X_XL */ +} + +/** + * @brief Checks whether the specified FLASH flag is set or not. + * @note This function can be used for all STM32F10x devices. + * - For STM32F10X_XL devices, this function checks whether the specified + * Bank1 or Bank2 flag is set or not. + * - For other devices, it checks whether the specified Bank1 flag is + * set or not. + * @param FLASH_FLAG: specifies the FLASH flag to check. + * This parameter can be one of the following values: + * @arg FLASH_FLAG_BSY: FLASH Busy flag + * @arg FLASH_FLAG_PGERR: FLASH Program error flag + * @arg FLASH_FLAG_WRPRTERR: FLASH Write protected error flag + * @arg FLASH_FLAG_EOP: FLASH End of Operation flag + * @arg FLASH_FLAG_OPTERR: FLASH Option Byte error flag + * @retval The new state of FLASH_FLAG (SET or RESET). + */ +FlagStatus FLASH_GetFlagStatus(uint32_t FLASH_FLAG) +{ + FlagStatus bitstatus = RESET; + +#ifdef STM32F10X_XL + /* Check the parameters */ + assert_param(IS_FLASH_GET_FLAG(FLASH_FLAG)) ; + if(FLASH_FLAG == FLASH_FLAG_OPTERR) + { + if((FLASH->OBR & FLASH_FLAG_OPTERR) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + } + else + { + if((FLASH_FLAG & 0x80000000) != 0x0) + { + if((FLASH->SR2 & FLASH_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + } + else + { + if((FLASH->SR & FLASH_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + } + } +#else + /* Check the parameters */ + assert_param(IS_FLASH_GET_FLAG(FLASH_FLAG)) ; + if(FLASH_FLAG == FLASH_FLAG_OPTERR) + { + if((FLASH->OBR & FLASH_FLAG_OPTERR) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + } + else + { + if((FLASH->SR & FLASH_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + } +#endif /* STM32F10X_XL */ + + /* Return the new state of FLASH_FLAG (SET or RESET) */ + return bitstatus; +} + +/** + * @brief Clears the FLASH's pending flags. + * @note This function can be used for all STM32F10x devices. + * - For STM32F10X_XL devices, this function clears Bank1 or Bank2’s pending flags + * - For other devices, it clears Bank1’s pending flags. + * @param FLASH_FLAG: specifies the FLASH flags to clear. + * This parameter can be any combination of the following values: + * @arg FLASH_FLAG_PGERR: FLASH Program error flag + * @arg FLASH_FLAG_WRPRTERR: FLASH Write protected error flag + * @arg FLASH_FLAG_EOP: FLASH End of Operation flag + * @retval None + */ +void FLASH_ClearFlag(uint32_t FLASH_FLAG) +{ +#ifdef STM32F10X_XL + /* Check the parameters */ + assert_param(IS_FLASH_CLEAR_FLAG(FLASH_FLAG)) ; + + if((FLASH_FLAG & 0x80000000) != 0x0) + { + /* Clear the flags */ + FLASH->SR2 = FLASH_FLAG; + } + else + { + /* Clear the flags */ + FLASH->SR = FLASH_FLAG; + } + +#else + /* Check the parameters */ + assert_param(IS_FLASH_CLEAR_FLAG(FLASH_FLAG)) ; + + /* Clear the flags */ + FLASH->SR = FLASH_FLAG; +#endif /* STM32F10X_XL */ +} + +/** + * @brief Returns the FLASH Status. + * @note This function can be used for all STM32F10x devices, it is equivalent + * to FLASH_GetBank1Status function. + * @param None + * @retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PG, + * FLASH_ERROR_WRP or FLASH_COMPLETE + */ +FLASH_Status FLASH_GetStatus(void) +{ + FLASH_Status flashstatus = FLASH_COMPLETE; + + if((FLASH->SR & FLASH_FLAG_BSY) == FLASH_FLAG_BSY) + { + flashstatus = FLASH_BUSY; + } + else + { + if((FLASH->SR & FLASH_FLAG_PGERR) != 0) + { + flashstatus = FLASH_ERROR_PG; + } + else + { + if((FLASH->SR & FLASH_FLAG_WRPRTERR) != 0 ) + { + flashstatus = FLASH_ERROR_WRP; + } + else + { + flashstatus = FLASH_COMPLETE; + } + } + } + /* Return the Flash Status */ + return flashstatus; +} + +/** + * @brief Returns the FLASH Bank1 Status. + * @note This function can be used for all STM32F10x devices, it is equivalent + * to FLASH_GetStatus function. + * @param None + * @retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PG, + * FLASH_ERROR_WRP or FLASH_COMPLETE + */ +FLASH_Status FLASH_GetBank1Status(void) +{ + FLASH_Status flashstatus = FLASH_COMPLETE; + + if((FLASH->SR & FLASH_FLAG_BANK1_BSY) == FLASH_FLAG_BSY) + { + flashstatus = FLASH_BUSY; + } + else + { + if((FLASH->SR & FLASH_FLAG_BANK1_PGERR) != 0) + { + flashstatus = FLASH_ERROR_PG; + } + else + { + if((FLASH->SR & FLASH_FLAG_BANK1_WRPRTERR) != 0 ) + { + flashstatus = FLASH_ERROR_WRP; + } + else + { + flashstatus = FLASH_COMPLETE; + } + } + } + /* Return the Flash Status */ + return flashstatus; +} + +#ifdef STM32F10X_XL +/** + * @brief Returns the FLASH Bank2 Status. + * @note This function can be used for STM32F10x_XL density devices. + * @param None + * @retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PG, + * FLASH_ERROR_WRP or FLASH_COMPLETE + */ +FLASH_Status FLASH_GetBank2Status(void) +{ + FLASH_Status flashstatus = FLASH_COMPLETE; + + if((FLASH->SR2 & (FLASH_FLAG_BANK2_BSY & 0x7FFFFFFF)) == (FLASH_FLAG_BANK2_BSY & 0x7FFFFFFF)) + { + flashstatus = FLASH_BUSY; + } + else + { + if((FLASH->SR2 & (FLASH_FLAG_BANK2_PGERR & 0x7FFFFFFF)) != 0) + { + flashstatus = FLASH_ERROR_PG; + } + else + { + if((FLASH->SR2 & (FLASH_FLAG_BANK2_WRPRTERR & 0x7FFFFFFF)) != 0 ) + { + flashstatus = FLASH_ERROR_WRP; + } + else + { + flashstatus = FLASH_COMPLETE; + } + } + } + /* Return the Flash Status */ + return flashstatus; +} +#endif /* STM32F10X_XL */ +/** + * @brief Waits for a Flash operation to complete or a TIMEOUT to occur. + * @note This function can be used for all STM32F10x devices, + * it is equivalent to FLASH_WaitForLastBank1Operation. + * - For STM32F10X_XL devices this function waits for a Bank1 Flash operation + * to complete or a TIMEOUT to occur. + * - For all other devices it waits for a Flash operation to complete + * or a TIMEOUT to occur. + * @param Timeout: FLASH programming Timeout + * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_WaitForLastOperation(uint32_t Timeout) +{ + FLASH_Status status = FLASH_COMPLETE; + + /* Check for the Flash Status */ + status = FLASH_GetBank1Status(); + /* Wait for a Flash operation to complete or a TIMEOUT to occur */ + while((status == FLASH_BUSY) && (Timeout != 0x00)) + { + status = FLASH_GetBank1Status(); + Timeout--; + } + if(Timeout == 0x00 ) + { + status = FLASH_TIMEOUT; + } + /* Return the operation status */ + return status; +} + +/** + * @brief Waits for a Flash operation on Bank1 to complete or a TIMEOUT to occur. + * @note This function can be used for all STM32F10x devices, + * it is equivalent to FLASH_WaitForLastOperation. + * @param Timeout: FLASH programming Timeout + * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_WaitForLastBank1Operation(uint32_t Timeout) +{ + FLASH_Status status = FLASH_COMPLETE; + + /* Check for the Flash Status */ + status = FLASH_GetBank1Status(); + /* Wait for a Flash operation to complete or a TIMEOUT to occur */ + while((status == FLASH_FLAG_BANK1_BSY) && (Timeout != 0x00)) + { + status = FLASH_GetBank1Status(); + Timeout--; + } + if(Timeout == 0x00 ) + { + status = FLASH_TIMEOUT; + } + /* Return the operation status */ + return status; +} + +#ifdef STM32F10X_XL +/** + * @brief Waits for a Flash operation on Bank2 to complete or a TIMEOUT to occur. + * @note This function can be used only for STM32F10x_XL density devices. + * @param Timeout: FLASH programming Timeout + * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_WaitForLastBank2Operation(uint32_t Timeout) +{ + FLASH_Status status = FLASH_COMPLETE; + + /* Check for the Flash Status */ + status = FLASH_GetBank2Status(); + /* Wait for a Flash operation to complete or a TIMEOUT to occur */ + while((status == (FLASH_FLAG_BANK2_BSY & 0x7FFFFFFF)) && (Timeout != 0x00)) + { + status = FLASH_GetBank2Status(); + Timeout--; + } + if(Timeout == 0x00 ) + { + status = FLASH_TIMEOUT; + } + /* Return the operation status */ + return status; +} +#endif /* STM32F10X_XL */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_fsmc.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_fsmc.c new file mode 100644 index 0000000..c75137c --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_fsmc.c @@ -0,0 +1,866 @@ +/** + ****************************************************************************** + * @file stm32f10x_fsmc.c + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief This file provides all the FSMC firmware functions. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_fsmc.h" +#include "stm32f10x_rcc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup FSMC + * @brief FSMC driver modules + * @{ + */ + +/** @defgroup FSMC_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ + +/** @defgroup FSMC_Private_Defines + * @{ + */ + +/* --------------------- FSMC registers bit mask ---------------------------- */ + +/* FSMC BCRx Mask */ +#define BCR_MBKEN_Set ((uint32_t)0x00000001) +#define BCR_MBKEN_Reset ((uint32_t)0x000FFFFE) +#define BCR_FACCEN_Set ((uint32_t)0x00000040) + +/* FSMC PCRx Mask */ +#define PCR_PBKEN_Set ((uint32_t)0x00000004) +#define PCR_PBKEN_Reset ((uint32_t)0x000FFFFB) +#define PCR_ECCEN_Set ((uint32_t)0x00000040) +#define PCR_ECCEN_Reset ((uint32_t)0x000FFFBF) +#define PCR_MemoryType_NAND ((uint32_t)0x00000008) +/** + * @} + */ + +/** @defgroup FSMC_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup FSMC_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup FSMC_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup FSMC_Private_Functions + * @{ + */ + +/** + * @brief Deinitializes the FSMC NOR/SRAM Banks registers to their default + * reset values. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank1_NORSRAM1: FSMC Bank1 NOR/SRAM1 + * @arg FSMC_Bank1_NORSRAM2: FSMC Bank1 NOR/SRAM2 + * @arg FSMC_Bank1_NORSRAM3: FSMC Bank1 NOR/SRAM3 + * @arg FSMC_Bank1_NORSRAM4: FSMC Bank1 NOR/SRAM4 + * @retval None + */ +void FSMC_NORSRAMDeInit(uint32_t FSMC_Bank) +{ + /* Check the parameter */ + assert_param(IS_FSMC_NORSRAM_BANK(FSMC_Bank)); + + /* FSMC_Bank1_NORSRAM1 */ + if(FSMC_Bank == FSMC_Bank1_NORSRAM1) + { + FSMC_Bank1->BTCR[FSMC_Bank] = 0x000030DB; + } + /* FSMC_Bank1_NORSRAM2, FSMC_Bank1_NORSRAM3 or FSMC_Bank1_NORSRAM4 */ + else + { + FSMC_Bank1->BTCR[FSMC_Bank] = 0x000030D2; + } + FSMC_Bank1->BTCR[FSMC_Bank + 1] = 0x0FFFFFFF; + FSMC_Bank1E->BWTR[FSMC_Bank] = 0x0FFFFFFF; +} + +/** + * @brief Deinitializes the FSMC NAND Banks registers to their default reset values. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND + * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND + * @retval None + */ +void FSMC_NANDDeInit(uint32_t FSMC_Bank) +{ + /* Check the parameter */ + assert_param(IS_FSMC_NAND_BANK(FSMC_Bank)); + + if(FSMC_Bank == FSMC_Bank2_NAND) + { + /* Set the FSMC_Bank2 registers to their reset values */ + FSMC_Bank2->PCR2 = 0x00000018; + FSMC_Bank2->SR2 = 0x00000040; + FSMC_Bank2->PMEM2 = 0xFCFCFCFC; + FSMC_Bank2->PATT2 = 0xFCFCFCFC; + } + /* FSMC_Bank3_NAND */ + else + { + /* Set the FSMC_Bank3 registers to their reset values */ + FSMC_Bank3->PCR3 = 0x00000018; + FSMC_Bank3->SR3 = 0x00000040; + FSMC_Bank3->PMEM3 = 0xFCFCFCFC; + FSMC_Bank3->PATT3 = 0xFCFCFCFC; + } +} + +/** + * @brief Deinitializes the FSMC PCCARD Bank registers to their default reset values. + * @param None + * @retval None + */ +void FSMC_PCCARDDeInit(void) +{ + /* Set the FSMC_Bank4 registers to their reset values */ + FSMC_Bank4->PCR4 = 0x00000018; + FSMC_Bank4->SR4 = 0x00000000; + FSMC_Bank4->PMEM4 = 0xFCFCFCFC; + FSMC_Bank4->PATT4 = 0xFCFCFCFC; + FSMC_Bank4->PIO4 = 0xFCFCFCFC; +} + +/** + * @brief Initializes the FSMC NOR/SRAM Banks according to the specified + * parameters in the FSMC_NORSRAMInitStruct. + * @param FSMC_NORSRAMInitStruct : pointer to a FSMC_NORSRAMInitTypeDef + * structure that contains the configuration information for + * the FSMC NOR/SRAM specified Banks. + * @retval None + */ +void FSMC_NORSRAMInit(FSMC_NORSRAMInitTypeDef* FSMC_NORSRAMInitStruct) +{ + /* Check the parameters */ + assert_param(IS_FSMC_NORSRAM_BANK(FSMC_NORSRAMInitStruct->FSMC_Bank)); + assert_param(IS_FSMC_MUX(FSMC_NORSRAMInitStruct->FSMC_DataAddressMux)); + assert_param(IS_FSMC_MEMORY(FSMC_NORSRAMInitStruct->FSMC_MemoryType)); + assert_param(IS_FSMC_MEMORY_WIDTH(FSMC_NORSRAMInitStruct->FSMC_MemoryDataWidth)); + assert_param(IS_FSMC_BURSTMODE(FSMC_NORSRAMInitStruct->FSMC_BurstAccessMode)); + assert_param(IS_FSMC_ASYNWAIT(FSMC_NORSRAMInitStruct->FSMC_AsynchronousWait)); + assert_param(IS_FSMC_WAIT_POLARITY(FSMC_NORSRAMInitStruct->FSMC_WaitSignalPolarity)); + assert_param(IS_FSMC_WRAP_MODE(FSMC_NORSRAMInitStruct->FSMC_WrapMode)); + assert_param(IS_FSMC_WAIT_SIGNAL_ACTIVE(FSMC_NORSRAMInitStruct->FSMC_WaitSignalActive)); + assert_param(IS_FSMC_WRITE_OPERATION(FSMC_NORSRAMInitStruct->FSMC_WriteOperation)); + assert_param(IS_FSMC_WAITE_SIGNAL(FSMC_NORSRAMInitStruct->FSMC_WaitSignal)); + assert_param(IS_FSMC_EXTENDED_MODE(FSMC_NORSRAMInitStruct->FSMC_ExtendedMode)); + assert_param(IS_FSMC_WRITE_BURST(FSMC_NORSRAMInitStruct->FSMC_WriteBurst)); + assert_param(IS_FSMC_ADDRESS_SETUP_TIME(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressSetupTime)); + assert_param(IS_FSMC_ADDRESS_HOLD_TIME(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressHoldTime)); + assert_param(IS_FSMC_DATASETUP_TIME(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataSetupTime)); + assert_param(IS_FSMC_TURNAROUND_TIME(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_BusTurnAroundDuration)); + assert_param(IS_FSMC_CLK_DIV(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_CLKDivision)); + assert_param(IS_FSMC_DATA_LATENCY(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataLatency)); + assert_param(IS_FSMC_ACCESS_MODE(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AccessMode)); + + /* Bank1 NOR/SRAM control register configuration */ + FSMC_Bank1->BTCR[FSMC_NORSRAMInitStruct->FSMC_Bank] = + (uint32_t)FSMC_NORSRAMInitStruct->FSMC_DataAddressMux | + FSMC_NORSRAMInitStruct->FSMC_MemoryType | + FSMC_NORSRAMInitStruct->FSMC_MemoryDataWidth | + FSMC_NORSRAMInitStruct->FSMC_BurstAccessMode | + FSMC_NORSRAMInitStruct->FSMC_AsynchronousWait | + FSMC_NORSRAMInitStruct->FSMC_WaitSignalPolarity | + FSMC_NORSRAMInitStruct->FSMC_WrapMode | + FSMC_NORSRAMInitStruct->FSMC_WaitSignalActive | + FSMC_NORSRAMInitStruct->FSMC_WriteOperation | + FSMC_NORSRAMInitStruct->FSMC_WaitSignal | + FSMC_NORSRAMInitStruct->FSMC_ExtendedMode | + FSMC_NORSRAMInitStruct->FSMC_WriteBurst; + + if(FSMC_NORSRAMInitStruct->FSMC_MemoryType == FSMC_MemoryType_NOR) + { + FSMC_Bank1->BTCR[FSMC_NORSRAMInitStruct->FSMC_Bank] |= (uint32_t)BCR_FACCEN_Set; + } + + /* Bank1 NOR/SRAM timing register configuration */ + FSMC_Bank1->BTCR[FSMC_NORSRAMInitStruct->FSMC_Bank+1] = + (uint32_t)FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressSetupTime | + (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressHoldTime << 4) | + (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataSetupTime << 8) | + (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_BusTurnAroundDuration << 16) | + (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_CLKDivision << 20) | + (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataLatency << 24) | + FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AccessMode; + + + /* Bank1 NOR/SRAM timing register for write configuration, if extended mode is used */ + if(FSMC_NORSRAMInitStruct->FSMC_ExtendedMode == FSMC_ExtendedMode_Enable) + { + assert_param(IS_FSMC_ADDRESS_SETUP_TIME(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressSetupTime)); + assert_param(IS_FSMC_ADDRESS_HOLD_TIME(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressHoldTime)); + assert_param(IS_FSMC_DATASETUP_TIME(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_DataSetupTime)); + assert_param(IS_FSMC_CLK_DIV(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_CLKDivision)); + assert_param(IS_FSMC_DATA_LATENCY(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_DataLatency)); + assert_param(IS_FSMC_ACCESS_MODE(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AccessMode)); + FSMC_Bank1E->BWTR[FSMC_NORSRAMInitStruct->FSMC_Bank] = + (uint32_t)FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressSetupTime | + (FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressHoldTime << 4 )| + (FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_DataSetupTime << 8) | + (FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_CLKDivision << 20) | + (FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_DataLatency << 24) | + FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AccessMode; + } + else + { + FSMC_Bank1E->BWTR[FSMC_NORSRAMInitStruct->FSMC_Bank] = 0x0FFFFFFF; + } +} + +/** + * @brief Initializes the FSMC NAND Banks according to the specified + * parameters in the FSMC_NANDInitStruct. + * @param FSMC_NANDInitStruct : pointer to a FSMC_NANDInitTypeDef + * structure that contains the configuration information for the FSMC + * NAND specified Banks. + * @retval None + */ +void FSMC_NANDInit(FSMC_NANDInitTypeDef* FSMC_NANDInitStruct) +{ + uint32_t tmppcr = 0x00000000, tmppmem = 0x00000000, tmppatt = 0x00000000; + + /* Check the parameters */ + assert_param( IS_FSMC_NAND_BANK(FSMC_NANDInitStruct->FSMC_Bank)); + assert_param( IS_FSMC_WAIT_FEATURE(FSMC_NANDInitStruct->FSMC_Waitfeature)); + assert_param( IS_FSMC_MEMORY_WIDTH(FSMC_NANDInitStruct->FSMC_MemoryDataWidth)); + assert_param( IS_FSMC_ECC_STATE(FSMC_NANDInitStruct->FSMC_ECC)); + assert_param( IS_FSMC_ECCPAGE_SIZE(FSMC_NANDInitStruct->FSMC_ECCPageSize)); + assert_param( IS_FSMC_TCLR_TIME(FSMC_NANDInitStruct->FSMC_TCLRSetupTime)); + assert_param( IS_FSMC_TAR_TIME(FSMC_NANDInitStruct->FSMC_TARSetupTime)); + assert_param(IS_FSMC_SETUP_TIME(FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_SetupTime)); + assert_param(IS_FSMC_WAIT_TIME(FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_WaitSetupTime)); + assert_param(IS_FSMC_HOLD_TIME(FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HoldSetupTime)); + assert_param(IS_FSMC_HIZ_TIME(FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HiZSetupTime)); + assert_param(IS_FSMC_SETUP_TIME(FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_SetupTime)); + assert_param(IS_FSMC_WAIT_TIME(FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_WaitSetupTime)); + assert_param(IS_FSMC_HOLD_TIME(FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HoldSetupTime)); + assert_param(IS_FSMC_HIZ_TIME(FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HiZSetupTime)); + + /* Set the tmppcr value according to FSMC_NANDInitStruct parameters */ + tmppcr = (uint32_t)FSMC_NANDInitStruct->FSMC_Waitfeature | + PCR_MemoryType_NAND | + FSMC_NANDInitStruct->FSMC_MemoryDataWidth | + FSMC_NANDInitStruct->FSMC_ECC | + FSMC_NANDInitStruct->FSMC_ECCPageSize | + (FSMC_NANDInitStruct->FSMC_TCLRSetupTime << 9 )| + (FSMC_NANDInitStruct->FSMC_TARSetupTime << 13); + + /* Set tmppmem value according to FSMC_CommonSpaceTimingStructure parameters */ + tmppmem = (uint32_t)FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_SetupTime | + (FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_WaitSetupTime << 8) | + (FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HoldSetupTime << 16)| + (FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HiZSetupTime << 24); + + /* Set tmppatt value according to FSMC_AttributeSpaceTimingStructure parameters */ + tmppatt = (uint32_t)FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_SetupTime | + (FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_WaitSetupTime << 8) | + (FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HoldSetupTime << 16)| + (FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HiZSetupTime << 24); + + if(FSMC_NANDInitStruct->FSMC_Bank == FSMC_Bank2_NAND) + { + /* FSMC_Bank2_NAND registers configuration */ + FSMC_Bank2->PCR2 = tmppcr; + FSMC_Bank2->PMEM2 = tmppmem; + FSMC_Bank2->PATT2 = tmppatt; + } + else + { + /* FSMC_Bank3_NAND registers configuration */ + FSMC_Bank3->PCR3 = tmppcr; + FSMC_Bank3->PMEM3 = tmppmem; + FSMC_Bank3->PATT3 = tmppatt; + } +} + +/** + * @brief Initializes the FSMC PCCARD Bank according to the specified + * parameters in the FSMC_PCCARDInitStruct. + * @param FSMC_PCCARDInitStruct : pointer to a FSMC_PCCARDInitTypeDef + * structure that contains the configuration information for the FSMC + * PCCARD Bank. + * @retval None + */ +void FSMC_PCCARDInit(FSMC_PCCARDInitTypeDef* FSMC_PCCARDInitStruct) +{ + /* Check the parameters */ + assert_param(IS_FSMC_WAIT_FEATURE(FSMC_PCCARDInitStruct->FSMC_Waitfeature)); + assert_param(IS_FSMC_TCLR_TIME(FSMC_PCCARDInitStruct->FSMC_TCLRSetupTime)); + assert_param(IS_FSMC_TAR_TIME(FSMC_PCCARDInitStruct->FSMC_TARSetupTime)); + + assert_param(IS_FSMC_SETUP_TIME(FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_SetupTime)); + assert_param(IS_FSMC_WAIT_TIME(FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_WaitSetupTime)); + assert_param(IS_FSMC_HOLD_TIME(FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HoldSetupTime)); + assert_param(IS_FSMC_HIZ_TIME(FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HiZSetupTime)); + + assert_param(IS_FSMC_SETUP_TIME(FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_SetupTime)); + assert_param(IS_FSMC_WAIT_TIME(FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_WaitSetupTime)); + assert_param(IS_FSMC_HOLD_TIME(FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HoldSetupTime)); + assert_param(IS_FSMC_HIZ_TIME(FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HiZSetupTime)); + assert_param(IS_FSMC_SETUP_TIME(FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_SetupTime)); + assert_param(IS_FSMC_WAIT_TIME(FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_WaitSetupTime)); + assert_param(IS_FSMC_HOLD_TIME(FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_HoldSetupTime)); + assert_param(IS_FSMC_HIZ_TIME(FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_HiZSetupTime)); + + /* Set the PCR4 register value according to FSMC_PCCARDInitStruct parameters */ + FSMC_Bank4->PCR4 = (uint32_t)FSMC_PCCARDInitStruct->FSMC_Waitfeature | + FSMC_MemoryDataWidth_16b | + (FSMC_PCCARDInitStruct->FSMC_TCLRSetupTime << 9) | + (FSMC_PCCARDInitStruct->FSMC_TARSetupTime << 13); + + /* Set PMEM4 register value according to FSMC_CommonSpaceTimingStructure parameters */ + FSMC_Bank4->PMEM4 = (uint32_t)FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_SetupTime | + (FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_WaitSetupTime << 8) | + (FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HoldSetupTime << 16)| + (FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HiZSetupTime << 24); + + /* Set PATT4 register value according to FSMC_AttributeSpaceTimingStructure parameters */ + FSMC_Bank4->PATT4 = (uint32_t)FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_SetupTime | + (FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_WaitSetupTime << 8) | + (FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HoldSetupTime << 16)| + (FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HiZSetupTime << 24); + + /* Set PIO4 register value according to FSMC_IOSpaceTimingStructure parameters */ + FSMC_Bank4->PIO4 = (uint32_t)FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_SetupTime | + (FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_WaitSetupTime << 8) | + (FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_HoldSetupTime << 16)| + (FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_HiZSetupTime << 24); +} + +/** + * @brief Fills each FSMC_NORSRAMInitStruct member with its default value. + * @param FSMC_NORSRAMInitStruct: pointer to a FSMC_NORSRAMInitTypeDef + * structure which will be initialized. + * @retval None + */ +void FSMC_NORSRAMStructInit(FSMC_NORSRAMInitTypeDef* FSMC_NORSRAMInitStruct) +{ + /* Reset NOR/SRAM Init structure parameters values */ + FSMC_NORSRAMInitStruct->FSMC_Bank = FSMC_Bank1_NORSRAM1; + FSMC_NORSRAMInitStruct->FSMC_DataAddressMux = FSMC_DataAddressMux_Enable; + FSMC_NORSRAMInitStruct->FSMC_MemoryType = FSMC_MemoryType_SRAM; + FSMC_NORSRAMInitStruct->FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b; + FSMC_NORSRAMInitStruct->FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; + FSMC_NORSRAMInitStruct->FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable; + FSMC_NORSRAMInitStruct->FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; + FSMC_NORSRAMInitStruct->FSMC_WrapMode = FSMC_WrapMode_Disable; + FSMC_NORSRAMInitStruct->FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; + FSMC_NORSRAMInitStruct->FSMC_WriteOperation = FSMC_WriteOperation_Enable; + FSMC_NORSRAMInitStruct->FSMC_WaitSignal = FSMC_WaitSignal_Enable; + FSMC_NORSRAMInitStruct->FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; + FSMC_NORSRAMInitStruct->FSMC_WriteBurst = FSMC_WriteBurst_Disable; + FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressSetupTime = 0xF; + FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressHoldTime = 0xF; + FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataSetupTime = 0xFF; + FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_BusTurnAroundDuration = 0xF; + FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_CLKDivision = 0xF; + FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataLatency = 0xF; + FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AccessMode = FSMC_AccessMode_A; + FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressSetupTime = 0xF; + FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressHoldTime = 0xF; + FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_DataSetupTime = 0xFF; + FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_BusTurnAroundDuration = 0xF; + FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_CLKDivision = 0xF; + FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_DataLatency = 0xF; + FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AccessMode = FSMC_AccessMode_A; +} + +/** + * @brief Fills each FSMC_NANDInitStruct member with its default value. + * @param FSMC_NANDInitStruct: pointer to a FSMC_NANDInitTypeDef + * structure which will be initialized. + * @retval None + */ +void FSMC_NANDStructInit(FSMC_NANDInitTypeDef* FSMC_NANDInitStruct) +{ + /* Reset NAND Init structure parameters values */ + FSMC_NANDInitStruct->FSMC_Bank = FSMC_Bank2_NAND; + FSMC_NANDInitStruct->FSMC_Waitfeature = FSMC_Waitfeature_Disable; + FSMC_NANDInitStruct->FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b; + FSMC_NANDInitStruct->FSMC_ECC = FSMC_ECC_Disable; + FSMC_NANDInitStruct->FSMC_ECCPageSize = FSMC_ECCPageSize_256Bytes; + FSMC_NANDInitStruct->FSMC_TCLRSetupTime = 0x0; + FSMC_NANDInitStruct->FSMC_TARSetupTime = 0x0; + FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_SetupTime = 0xFC; + FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_WaitSetupTime = 0xFC; + FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HoldSetupTime = 0xFC; + FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HiZSetupTime = 0xFC; + FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_SetupTime = 0xFC; + FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_WaitSetupTime = 0xFC; + FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HoldSetupTime = 0xFC; + FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HiZSetupTime = 0xFC; +} + +/** + * @brief Fills each FSMC_PCCARDInitStruct member with its default value. + * @param FSMC_PCCARDInitStruct: pointer to a FSMC_PCCARDInitTypeDef + * structure which will be initialized. + * @retval None + */ +void FSMC_PCCARDStructInit(FSMC_PCCARDInitTypeDef* FSMC_PCCARDInitStruct) +{ + /* Reset PCCARD Init structure parameters values */ + FSMC_PCCARDInitStruct->FSMC_Waitfeature = FSMC_Waitfeature_Disable; + FSMC_PCCARDInitStruct->FSMC_TCLRSetupTime = 0x0; + FSMC_PCCARDInitStruct->FSMC_TARSetupTime = 0x0; + FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_SetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_WaitSetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HoldSetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HiZSetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_SetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_WaitSetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HoldSetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HiZSetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_SetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_WaitSetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_HoldSetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_HiZSetupTime = 0xFC; +} + +/** + * @brief Enables or disables the specified NOR/SRAM Memory Bank. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank1_NORSRAM1: FSMC Bank1 NOR/SRAM1 + * @arg FSMC_Bank1_NORSRAM2: FSMC Bank1 NOR/SRAM2 + * @arg FSMC_Bank1_NORSRAM3: FSMC Bank1 NOR/SRAM3 + * @arg FSMC_Bank1_NORSRAM4: FSMC Bank1 NOR/SRAM4 + * @param NewState: new state of the FSMC_Bank. This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void FSMC_NORSRAMCmd(uint32_t FSMC_Bank, FunctionalState NewState) +{ + assert_param(IS_FSMC_NORSRAM_BANK(FSMC_Bank)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected NOR/SRAM Bank by setting the PBKEN bit in the BCRx register */ + FSMC_Bank1->BTCR[FSMC_Bank] |= BCR_MBKEN_Set; + } + else + { + /* Disable the selected NOR/SRAM Bank by clearing the PBKEN bit in the BCRx register */ + FSMC_Bank1->BTCR[FSMC_Bank] &= BCR_MBKEN_Reset; + } +} + +/** + * @brief Enables or disables the specified NAND Memory Bank. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND + * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND + * @param NewState: new state of the FSMC_Bank. This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void FSMC_NANDCmd(uint32_t FSMC_Bank, FunctionalState NewState) +{ + assert_param(IS_FSMC_NAND_BANK(FSMC_Bank)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected NAND Bank by setting the PBKEN bit in the PCRx register */ + if(FSMC_Bank == FSMC_Bank2_NAND) + { + FSMC_Bank2->PCR2 |= PCR_PBKEN_Set; + } + else + { + FSMC_Bank3->PCR3 |= PCR_PBKEN_Set; + } + } + else + { + /* Disable the selected NAND Bank by clearing the PBKEN bit in the PCRx register */ + if(FSMC_Bank == FSMC_Bank2_NAND) + { + FSMC_Bank2->PCR2 &= PCR_PBKEN_Reset; + } + else + { + FSMC_Bank3->PCR3 &= PCR_PBKEN_Reset; + } + } +} + +/** + * @brief Enables or disables the PCCARD Memory Bank. + * @param NewState: new state of the PCCARD Memory Bank. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void FSMC_PCCARDCmd(FunctionalState NewState) +{ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the PCCARD Bank by setting the PBKEN bit in the PCR4 register */ + FSMC_Bank4->PCR4 |= PCR_PBKEN_Set; + } + else + { + /* Disable the PCCARD Bank by clearing the PBKEN bit in the PCR4 register */ + FSMC_Bank4->PCR4 &= PCR_PBKEN_Reset; + } +} + +/** + * @brief Enables or disables the FSMC NAND ECC feature. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND + * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND + * @param NewState: new state of the FSMC NAND ECC feature. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void FSMC_NANDECCCmd(uint32_t FSMC_Bank, FunctionalState NewState) +{ + assert_param(IS_FSMC_NAND_BANK(FSMC_Bank)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected NAND Bank ECC function by setting the ECCEN bit in the PCRx register */ + if(FSMC_Bank == FSMC_Bank2_NAND) + { + FSMC_Bank2->PCR2 |= PCR_ECCEN_Set; + } + else + { + FSMC_Bank3->PCR3 |= PCR_ECCEN_Set; + } + } + else + { + /* Disable the selected NAND Bank ECC function by clearing the ECCEN bit in the PCRx register */ + if(FSMC_Bank == FSMC_Bank2_NAND) + { + FSMC_Bank2->PCR2 &= PCR_ECCEN_Reset; + } + else + { + FSMC_Bank3->PCR3 &= PCR_ECCEN_Reset; + } + } +} + +/** + * @brief Returns the error correction code register value. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND + * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND + * @retval The Error Correction Code (ECC) value. + */ +uint32_t FSMC_GetECC(uint32_t FSMC_Bank) +{ + uint32_t eccval = 0x00000000; + + if(FSMC_Bank == FSMC_Bank2_NAND) + { + /* Get the ECCR2 register value */ + eccval = FSMC_Bank2->ECCR2; + } + else + { + /* Get the ECCR3 register value */ + eccval = FSMC_Bank3->ECCR3; + } + /* Return the error correction code value */ + return(eccval); +} + +/** + * @brief Enables or disables the specified FSMC interrupts. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND + * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND + * @arg FSMC_Bank4_PCCARD: FSMC Bank4 PCCARD + * @param FSMC_IT: specifies the FSMC interrupt sources to be enabled or disabled. + * This parameter can be any combination of the following values: + * @arg FSMC_IT_RisingEdge: Rising edge detection interrupt. + * @arg FSMC_IT_Level: Level edge detection interrupt. + * @arg FSMC_IT_FallingEdge: Falling edge detection interrupt. + * @param NewState: new state of the specified FSMC interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void FSMC_ITConfig(uint32_t FSMC_Bank, uint32_t FSMC_IT, FunctionalState NewState) +{ + assert_param(IS_FSMC_IT_BANK(FSMC_Bank)); + assert_param(IS_FSMC_IT(FSMC_IT)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected FSMC_Bank2 interrupts */ + if(FSMC_Bank == FSMC_Bank2_NAND) + { + FSMC_Bank2->SR2 |= FSMC_IT; + } + /* Enable the selected FSMC_Bank3 interrupts */ + else if (FSMC_Bank == FSMC_Bank3_NAND) + { + FSMC_Bank3->SR3 |= FSMC_IT; + } + /* Enable the selected FSMC_Bank4 interrupts */ + else + { + FSMC_Bank4->SR4 |= FSMC_IT; + } + } + else + { + /* Disable the selected FSMC_Bank2 interrupts */ + if(FSMC_Bank == FSMC_Bank2_NAND) + { + + FSMC_Bank2->SR2 &= (uint32_t)~FSMC_IT; + } + /* Disable the selected FSMC_Bank3 interrupts */ + else if (FSMC_Bank == FSMC_Bank3_NAND) + { + FSMC_Bank3->SR3 &= (uint32_t)~FSMC_IT; + } + /* Disable the selected FSMC_Bank4 interrupts */ + else + { + FSMC_Bank4->SR4 &= (uint32_t)~FSMC_IT; + } + } +} + +/** + * @brief Checks whether the specified FSMC flag is set or not. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND + * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND + * @arg FSMC_Bank4_PCCARD: FSMC Bank4 PCCARD + * @param FSMC_FLAG: specifies the flag to check. + * This parameter can be one of the following values: + * @arg FSMC_FLAG_RisingEdge: Rising egde detection Flag. + * @arg FSMC_FLAG_Level: Level detection Flag. + * @arg FSMC_FLAG_FallingEdge: Falling egde detection Flag. + * @arg FSMC_FLAG_FEMPT: Fifo empty Flag. + * @retval The new state of FSMC_FLAG (SET or RESET). + */ +FlagStatus FSMC_GetFlagStatus(uint32_t FSMC_Bank, uint32_t FSMC_FLAG) +{ + FlagStatus bitstatus = RESET; + uint32_t tmpsr = 0x00000000; + + /* Check the parameters */ + assert_param(IS_FSMC_GETFLAG_BANK(FSMC_Bank)); + assert_param(IS_FSMC_GET_FLAG(FSMC_FLAG)); + + if(FSMC_Bank == FSMC_Bank2_NAND) + { + tmpsr = FSMC_Bank2->SR2; + } + else if(FSMC_Bank == FSMC_Bank3_NAND) + { + tmpsr = FSMC_Bank3->SR3; + } + /* FSMC_Bank4_PCCARD*/ + else + { + tmpsr = FSMC_Bank4->SR4; + } + + /* Get the flag status */ + if ((tmpsr & FSMC_FLAG) != (uint16_t)RESET ) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + /* Return the flag status */ + return bitstatus; +} + +/** + * @brief Clears the FSMC's pending flags. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND + * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND + * @arg FSMC_Bank4_PCCARD: FSMC Bank4 PCCARD + * @param FSMC_FLAG: specifies the flag to clear. + * This parameter can be any combination of the following values: + * @arg FSMC_FLAG_RisingEdge: Rising egde detection Flag. + * @arg FSMC_FLAG_Level: Level detection Flag. + * @arg FSMC_FLAG_FallingEdge: Falling egde detection Flag. + * @retval None + */ +void FSMC_ClearFlag(uint32_t FSMC_Bank, uint32_t FSMC_FLAG) +{ + /* Check the parameters */ + assert_param(IS_FSMC_GETFLAG_BANK(FSMC_Bank)); + assert_param(IS_FSMC_CLEAR_FLAG(FSMC_FLAG)) ; + + if(FSMC_Bank == FSMC_Bank2_NAND) + { + FSMC_Bank2->SR2 &= ~FSMC_FLAG; + } + else if(FSMC_Bank == FSMC_Bank3_NAND) + { + FSMC_Bank3->SR3 &= ~FSMC_FLAG; + } + /* FSMC_Bank4_PCCARD*/ + else + { + FSMC_Bank4->SR4 &= ~FSMC_FLAG; + } +} + +/** + * @brief Checks whether the specified FSMC interrupt has occurred or not. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND + * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND + * @arg FSMC_Bank4_PCCARD: FSMC Bank4 PCCARD + * @param FSMC_IT: specifies the FSMC interrupt source to check. + * This parameter can be one of the following values: + * @arg FSMC_IT_RisingEdge: Rising edge detection interrupt. + * @arg FSMC_IT_Level: Level edge detection interrupt. + * @arg FSMC_IT_FallingEdge: Falling edge detection interrupt. + * @retval The new state of FSMC_IT (SET or RESET). + */ +ITStatus FSMC_GetITStatus(uint32_t FSMC_Bank, uint32_t FSMC_IT) +{ + ITStatus bitstatus = RESET; + uint32_t tmpsr = 0x0, itstatus = 0x0, itenable = 0x0; + + /* Check the parameters */ + assert_param(IS_FSMC_IT_BANK(FSMC_Bank)); + assert_param(IS_FSMC_GET_IT(FSMC_IT)); + + if(FSMC_Bank == FSMC_Bank2_NAND) + { + tmpsr = FSMC_Bank2->SR2; + } + else if(FSMC_Bank == FSMC_Bank3_NAND) + { + tmpsr = FSMC_Bank3->SR3; + } + /* FSMC_Bank4_PCCARD*/ + else + { + tmpsr = FSMC_Bank4->SR4; + } + + itstatus = tmpsr & FSMC_IT; + + itenable = tmpsr & (FSMC_IT >> 3); + if ((itstatus != (uint32_t)RESET) && (itenable != (uint32_t)RESET)) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Clears the FSMC's interrupt pending bits. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND + * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND + * @arg FSMC_Bank4_PCCARD: FSMC Bank4 PCCARD + * @param FSMC_IT: specifies the interrupt pending bit to clear. + * This parameter can be any combination of the following values: + * @arg FSMC_IT_RisingEdge: Rising edge detection interrupt. + * @arg FSMC_IT_Level: Level edge detection interrupt. + * @arg FSMC_IT_FallingEdge: Falling edge detection interrupt. + * @retval None + */ +void FSMC_ClearITPendingBit(uint32_t FSMC_Bank, uint32_t FSMC_IT) +{ + /* Check the parameters */ + assert_param(IS_FSMC_IT_BANK(FSMC_Bank)); + assert_param(IS_FSMC_IT(FSMC_IT)); + + if(FSMC_Bank == FSMC_Bank2_NAND) + { + FSMC_Bank2->SR2 &= ~(FSMC_IT >> 3); + } + else if(FSMC_Bank == FSMC_Bank3_NAND) + { + FSMC_Bank3->SR3 &= ~(FSMC_IT >> 3); + } + /* FSMC_Bank4_PCCARD*/ + else + { + FSMC_Bank4->SR4 &= ~(FSMC_IT >> 3); + } +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_gpio.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_gpio.c new file mode 100644 index 0000000..93dbcd7 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_gpio.c @@ -0,0 +1,650 @@ +/** + ****************************************************************************** + * @file stm32f10x_gpio.c + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief This file provides all the GPIO firmware functions. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_gpio.h" +#include "stm32f10x_rcc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup GPIO + * @brief GPIO driver modules + * @{ + */ + +/** @defgroup GPIO_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup GPIO_Private_Defines + * @{ + */ + +/* ------------ RCC registers bit address in the alias region ----------------*/ +#define AFIO_OFFSET (AFIO_BASE - PERIPH_BASE) + +/* --- EVENTCR Register -----*/ + +/* Alias word address of EVOE bit */ +#define EVCR_OFFSET (AFIO_OFFSET + 0x00) +#define EVOE_BitNumber ((uint8_t)0x07) +#define EVCR_EVOE_BB (PERIPH_BB_BASE + (EVCR_OFFSET * 32) + (EVOE_BitNumber * 4)) + + +/* --- MAPR Register ---*/ +/* Alias word address of MII_RMII_SEL bit */ +#define MAPR_OFFSET (AFIO_OFFSET + 0x04) +#define MII_RMII_SEL_BitNumber ((u8)0x17) +#define MAPR_MII_RMII_SEL_BB (PERIPH_BB_BASE + (MAPR_OFFSET * 32) + (MII_RMII_SEL_BitNumber * 4)) + + +#define EVCR_PORTPINCONFIG_MASK ((uint16_t)0xFF80) +#define LSB_MASK ((uint16_t)0xFFFF) +#define DBGAFR_POSITION_MASK ((uint32_t)0x000F0000) +#define DBGAFR_SWJCFG_MASK ((uint32_t)0xF0FFFFFF) +#define DBGAFR_LOCATION_MASK ((uint32_t)0x00200000) +#define DBGAFR_NUMBITS_MASK ((uint32_t)0x00100000) +/** + * @} + */ + +/** @defgroup GPIO_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup GPIO_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup GPIO_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup GPIO_Private_Functions + * @{ + */ + +/** + * @brief Deinitializes the GPIOx peripheral registers to their default reset values. + * @param GPIOx: where x can be (A..G) to select the GPIO peripheral. + * @retval None + */ +void GPIO_DeInit(GPIO_TypeDef* GPIOx) +{ + /* Check the parameters */ + assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); + + if (GPIOx == GPIOA) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, DISABLE); + } + else if (GPIOx == GPIOB) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB, DISABLE); + } + else if (GPIOx == GPIOC) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC, DISABLE); + } + else if (GPIOx == GPIOD) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOD, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOD, DISABLE); + } + else if (GPIOx == GPIOE) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOE, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOE, DISABLE); + } + else if (GPIOx == GPIOF) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOF, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOF, DISABLE); + } + else + { + if (GPIOx == GPIOG) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOG, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOG, DISABLE); + } + } +} + +/** + * @brief Deinitializes the Alternate Functions (remap, event control + * and EXTI configuration) registers to their default reset values. + * @param None + * @retval None + */ +void GPIO_AFIODeInit(void) +{ + RCC_APB2PeriphResetCmd(RCC_APB2Periph_AFIO, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_AFIO, DISABLE); +} + +/** + * @brief Initializes the GPIOx peripheral according to the specified + * parameters in the GPIO_InitStruct. + * @param GPIOx: where x can be (A..G) to select the GPIO peripheral. + * @param GPIO_InitStruct: pointer to a GPIO_InitTypeDef structure that + * contains the configuration information for the specified GPIO peripheral. + * @retval None + */ +void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct) +{ + uint32_t currentmode = 0x00, currentpin = 0x00, pinpos = 0x00, pos = 0x00; + uint32_t tmpreg = 0x00, pinmask = 0x00; + /* Check the parameters */ + assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); + assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode)); + assert_param(IS_GPIO_PIN(GPIO_InitStruct->GPIO_Pin)); + +/*---------------------------- GPIO Mode Configuration -----------------------*/ + currentmode = ((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x0F); + if ((((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x10)) != 0x00) + { + /* Check the parameters */ + assert_param(IS_GPIO_SPEED(GPIO_InitStruct->GPIO_Speed)); + /* Output mode */ + currentmode |= (uint32_t)GPIO_InitStruct->GPIO_Speed; + } +/*---------------------------- GPIO CRL Configuration ------------------------*/ + /* Configure the eight low port pins */ + if (((uint32_t)GPIO_InitStruct->GPIO_Pin & ((uint32_t)0x00FF)) != 0x00) + { + tmpreg = GPIOx->CRL; + for (pinpos = 0x00; pinpos < 0x08; pinpos++) + { + pos = ((uint32_t)0x01) << pinpos; + /* Get the port pins position */ + currentpin = (GPIO_InitStruct->GPIO_Pin) & pos; + if (currentpin == pos) + { + pos = pinpos << 2; + /* Clear the corresponding low control register bits */ + pinmask = ((uint32_t)0x0F) << pos; + tmpreg &= ~pinmask; + /* Write the mode configuration in the corresponding bits */ + tmpreg |= (currentmode << pos); + /* Reset the corresponding ODR bit */ + if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD) + { + GPIOx->BRR = (((uint32_t)0x01) << pinpos); + } + else + { + /* Set the corresponding ODR bit */ + if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU) + { + GPIOx->BSRR = (((uint32_t)0x01) << pinpos); + } + } + } + } + GPIOx->CRL = tmpreg; + } +/*---------------------------- GPIO CRH Configuration ------------------------*/ + /* Configure the eight high port pins */ + if (GPIO_InitStruct->GPIO_Pin > 0x00FF) + { + tmpreg = GPIOx->CRH; + for (pinpos = 0x00; pinpos < 0x08; pinpos++) + { + pos = (((uint32_t)0x01) << (pinpos + 0x08)); + /* Get the port pins position */ + currentpin = ((GPIO_InitStruct->GPIO_Pin) & pos); + if (currentpin == pos) + { + pos = pinpos << 2; + /* Clear the corresponding high control register bits */ + pinmask = ((uint32_t)0x0F) << pos; + tmpreg &= ~pinmask; + /* Write the mode configuration in the corresponding bits */ + tmpreg |= (currentmode << pos); + /* Reset the corresponding ODR bit */ + if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD) + { + GPIOx->BRR = (((uint32_t)0x01) << (pinpos + 0x08)); + } + /* Set the corresponding ODR bit */ + if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU) + { + GPIOx->BSRR = (((uint32_t)0x01) << (pinpos + 0x08)); + } + } + } + GPIOx->CRH = tmpreg; + } +} + +/** + * @brief Fills each GPIO_InitStruct member with its default value. + * @param GPIO_InitStruct : pointer to a GPIO_InitTypeDef structure which will + * be initialized. + * @retval None + */ +void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct) +{ + /* Reset GPIO init structure parameters values */ + GPIO_InitStruct->GPIO_Pin = GPIO_Pin_All; + GPIO_InitStruct->GPIO_Speed = GPIO_Speed_2MHz; + GPIO_InitStruct->GPIO_Mode = GPIO_Mode_IN_FLOATING; +} + +/** + * @brief Reads the specified input port pin. + * @param GPIOx: where x can be (A..G) to select the GPIO peripheral. + * @param GPIO_Pin: specifies the port bit to read. + * This parameter can be GPIO_Pin_x where x can be (0..15). + * @retval The input port pin value. + */ +uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) +{ + uint8_t bitstatus = 0x00; + + /* Check the parameters */ + assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); + assert_param(IS_GET_GPIO_PIN(GPIO_Pin)); + + if ((GPIOx->IDR & GPIO_Pin) != (uint32_t)Bit_RESET) + { + bitstatus = (uint8_t)Bit_SET; + } + else + { + bitstatus = (uint8_t)Bit_RESET; + } + return bitstatus; +} + +/** + * @brief Reads the specified GPIO input data port. + * @param GPIOx: where x can be (A..G) to select the GPIO peripheral. + * @retval GPIO input data port value. + */ +uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx) +{ + /* Check the parameters */ + assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); + + return ((uint16_t)GPIOx->IDR); +} + +/** + * @brief Reads the specified output data port bit. + * @param GPIOx: where x can be (A..G) to select the GPIO peripheral. + * @param GPIO_Pin: specifies the port bit to read. + * This parameter can be GPIO_Pin_x where x can be (0..15). + * @retval The output port pin value. + */ +uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) +{ + uint8_t bitstatus = 0x00; + /* Check the parameters */ + assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); + assert_param(IS_GET_GPIO_PIN(GPIO_Pin)); + + if ((GPIOx->ODR & GPIO_Pin) != (uint32_t)Bit_RESET) + { + bitstatus = (uint8_t)Bit_SET; + } + else + { + bitstatus = (uint8_t)Bit_RESET; + } + return bitstatus; +} + +/** + * @brief Reads the specified GPIO output data port. + * @param GPIOx: where x can be (A..G) to select the GPIO peripheral. + * @retval GPIO output data port value. + */ +uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx) +{ + /* Check the parameters */ + assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); + + return ((uint16_t)GPIOx->ODR); +} + +/** + * @brief Sets the selected data port bits. + * @param GPIOx: where x can be (A..G) to select the GPIO peripheral. + * @param GPIO_Pin: specifies the port bits to be written. + * This parameter can be any combination of GPIO_Pin_x where x can be (0..15). + * @retval None + */ +void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) +{ + /* Check the parameters */ + assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); + assert_param(IS_GPIO_PIN(GPIO_Pin)); + + GPIOx->BSRR = GPIO_Pin; +} + +/** + * @brief Clears the selected data port bits. + * @param GPIOx: where x can be (A..G) to select the GPIO peripheral. + * @param GPIO_Pin: specifies the port bits to be written. + * This parameter can be any combination of GPIO_Pin_x where x can be (0..15). + * @retval None + */ +void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) +{ + /* Check the parameters */ + assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); + assert_param(IS_GPIO_PIN(GPIO_Pin)); + + GPIOx->BRR = GPIO_Pin; +} + +/** + * @brief Sets or clears the selected data port bit. + * @param GPIOx: where x can be (A..G) to select the GPIO peripheral. + * @param GPIO_Pin: specifies the port bit to be written. + * This parameter can be one of GPIO_Pin_x where x can be (0..15). + * @param BitVal: specifies the value to be written to the selected bit. + * This parameter can be one of the BitAction enum values: + * @arg Bit_RESET: to clear the port pin + * @arg Bit_SET: to set the port pin + * @retval None + */ +void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal) +{ + /* Check the parameters */ + assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); + assert_param(IS_GET_GPIO_PIN(GPIO_Pin)); + assert_param(IS_GPIO_BIT_ACTION(BitVal)); + + if (BitVal != Bit_RESET) + { + GPIOx->BSRR = GPIO_Pin; + } + else + { + GPIOx->BRR = GPIO_Pin; + } +} + +/** + * @brief Writes data to the specified GPIO data port. + * @param GPIOx: where x can be (A..G) to select the GPIO peripheral. + * @param PortVal: specifies the value to be written to the port output data register. + * @retval None + */ +void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal) +{ + /* Check the parameters */ + assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); + + GPIOx->ODR = PortVal; +} + +/** + * @brief Locks GPIO Pins configuration registers. + * @param GPIOx: where x can be (A..G) to select the GPIO peripheral. + * @param GPIO_Pin: specifies the port bit to be written. + * This parameter can be any combination of GPIO_Pin_x where x can be (0..15). + * @retval None + */ +void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) +{ + uint32_t tmp = 0x00010000; + + /* Check the parameters */ + assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); + assert_param(IS_GPIO_PIN(GPIO_Pin)); + + tmp |= GPIO_Pin; + /* Set LCKK bit */ + GPIOx->LCKR = tmp; + /* Reset LCKK bit */ + GPIOx->LCKR = GPIO_Pin; + /* Set LCKK bit */ + GPIOx->LCKR = tmp; + /* Read LCKK bit*/ + tmp = GPIOx->LCKR; + /* Read LCKK bit*/ + tmp = GPIOx->LCKR; +} + +/** + * @brief Selects the GPIO pin used as Event output. + * @param GPIO_PortSource: selects the GPIO port to be used as source + * for Event output. + * This parameter can be GPIO_PortSourceGPIOx where x can be (A..E). + * @param GPIO_PinSource: specifies the pin for the Event output. + * This parameter can be GPIO_PinSourcex where x can be (0..15). + * @retval None + */ +void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource) +{ + uint32_t tmpreg = 0x00; + /* Check the parameters */ + assert_param(IS_GPIO_EVENTOUT_PORT_SOURCE(GPIO_PortSource)); + assert_param(IS_GPIO_PIN_SOURCE(GPIO_PinSource)); + + tmpreg = AFIO->EVCR; + /* Clear the PORT[6:4] and PIN[3:0] bits */ + tmpreg &= EVCR_PORTPINCONFIG_MASK; + tmpreg |= (uint32_t)GPIO_PortSource << 0x04; + tmpreg |= GPIO_PinSource; + AFIO->EVCR = tmpreg; +} + +/** + * @brief Enables or disables the Event Output. + * @param NewState: new state of the Event output. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void GPIO_EventOutputCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) EVCR_EVOE_BB = (uint32_t)NewState; +} + +/** + * @brief Changes the mapping of the specified pin. + * @param GPIO_Remap: selects the pin to remap. + * This parameter can be one of the following values: + * @arg GPIO_Remap_SPI1 : SPI1 Alternate Function mapping + * @arg GPIO_Remap_I2C1 : I2C1 Alternate Function mapping + * @arg GPIO_Remap_USART1 : USART1 Alternate Function mapping + * @arg GPIO_Remap_USART2 : USART2 Alternate Function mapping + * @arg GPIO_PartialRemap_USART3 : USART3 Partial Alternate Function mapping + * @arg GPIO_FullRemap_USART3 : USART3 Full Alternate Function mapping + * @arg GPIO_PartialRemap_TIM1 : TIM1 Partial Alternate Function mapping + * @arg GPIO_FullRemap_TIM1 : TIM1 Full Alternate Function mapping + * @arg GPIO_PartialRemap1_TIM2 : TIM2 Partial1 Alternate Function mapping + * @arg GPIO_PartialRemap2_TIM2 : TIM2 Partial2 Alternate Function mapping + * @arg GPIO_FullRemap_TIM2 : TIM2 Full Alternate Function mapping + * @arg GPIO_PartialRemap_TIM3 : TIM3 Partial Alternate Function mapping + * @arg GPIO_FullRemap_TIM3 : TIM3 Full Alternate Function mapping + * @arg GPIO_Remap_TIM4 : TIM4 Alternate Function mapping + * @arg GPIO_Remap1_CAN1 : CAN1 Alternate Function mapping + * @arg GPIO_Remap2_CAN1 : CAN1 Alternate Function mapping + * @arg GPIO_Remap_PD01 : PD01 Alternate Function mapping + * @arg GPIO_Remap_TIM5CH4_LSI : LSI connected to TIM5 Channel4 input capture for calibration + * @arg GPIO_Remap_ADC1_ETRGINJ : ADC1 External Trigger Injected Conversion remapping + * @arg GPIO_Remap_ADC1_ETRGREG : ADC1 External Trigger Regular Conversion remapping + * @arg GPIO_Remap_ADC2_ETRGINJ : ADC2 External Trigger Injected Conversion remapping + * @arg GPIO_Remap_ADC2_ETRGREG : ADC2 External Trigger Regular Conversion remapping + * @arg GPIO_Remap_ETH : Ethernet remapping (only for Connectivity line devices) + * @arg GPIO_Remap_CAN2 : CAN2 remapping (only for Connectivity line devices) + * @arg GPIO_Remap_SWJ_NoJTRST : Full SWJ Enabled (JTAG-DP + SW-DP) but without JTRST + * @arg GPIO_Remap_SWJ_JTAGDisable : JTAG-DP Disabled and SW-DP Enabled + * @arg GPIO_Remap_SWJ_Disable : Full SWJ Disabled (JTAG-DP + SW-DP) + * @arg GPIO_Remap_SPI3 : SPI3/I2S3 Alternate Function mapping (only for Connectivity line devices) + * When the SPI3/I2S3 is remapped using this function, the SWJ is configured + * to Full SWJ Enabled (JTAG-DP + SW-DP) but without JTRST. + * @arg GPIO_Remap_TIM2ITR1_PTP_SOF : Ethernet PTP output or USB OTG SOF (Start of Frame) connected + * to TIM2 Internal Trigger 1 for calibration (only for Connectivity line devices) + * If the GPIO_Remap_TIM2ITR1_PTP_SOF is enabled the TIM2 ITR1 is connected to + * Ethernet PTP output. When Reset TIM2 ITR1 is connected to USB OTG SOF output. + * @arg GPIO_Remap_PTP_PPS : Ethernet MAC PPS_PTS output on PB05 (only for Connectivity line devices) + * @arg GPIO_Remap_TIM15 : TIM15 Alternate Function mapping (only for Value line devices) + * @arg GPIO_Remap_TIM16 : TIM16 Alternate Function mapping (only for Value line devices) + * @arg GPIO_Remap_TIM17 : TIM17 Alternate Function mapping (only for Value line devices) + * @arg GPIO_Remap_CEC : CEC Alternate Function mapping (only for Value line devices) + * @arg GPIO_Remap_TIM1_DMA : TIM1 DMA requests mapping (only for Value line devices) + * @arg GPIO_Remap_TIM9 : TIM9 Alternate Function mapping (only for XL-density devices) + * @arg GPIO_Remap_TIM10 : TIM10 Alternate Function mapping (only for XL-density devices) + * @arg GPIO_Remap_TIM11 : TIM11 Alternate Function mapping (only for XL-density devices) + * @arg GPIO_Remap_TIM13 : TIM13 Alternate Function mapping (only for High density Value line and XL-density devices) + * @arg GPIO_Remap_TIM14 : TIM14 Alternate Function mapping (only for High density Value line and XL-density devices) + * @arg GPIO_Remap_FSMC_NADV : FSMC_NADV Alternate Function mapping (only for High density Value line and XL-density devices) + * @arg GPIO_Remap_TIM67_DAC_DMA : TIM6/TIM7 and DAC DMA requests remapping (only for High density Value line devices) + * @arg GPIO_Remap_TIM12 : TIM12 Alternate Function mapping (only for High density Value line devices) + * @arg GPIO_Remap_MISC : Miscellaneous Remap (DMA2 Channel5 Position and DAC Trigger remapping, + * only for High density Value line devices) + * @param NewState: new state of the port pin remapping. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState) +{ + uint32_t tmp = 0x00, tmp1 = 0x00, tmpreg = 0x00, tmpmask = 0x00; + + /* Check the parameters */ + assert_param(IS_GPIO_REMAP(GPIO_Remap)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if((GPIO_Remap & 0x80000000) == 0x80000000) + { + tmpreg = AFIO->MAPR2; + } + else + { + tmpreg = AFIO->MAPR; + } + + tmpmask = (GPIO_Remap & DBGAFR_POSITION_MASK) >> 0x10; + tmp = GPIO_Remap & LSB_MASK; + + if ((GPIO_Remap & (DBGAFR_LOCATION_MASK | DBGAFR_NUMBITS_MASK)) == (DBGAFR_LOCATION_MASK | DBGAFR_NUMBITS_MASK)) + { + tmpreg &= DBGAFR_SWJCFG_MASK; + AFIO->MAPR &= DBGAFR_SWJCFG_MASK; + } + else if ((GPIO_Remap & DBGAFR_NUMBITS_MASK) == DBGAFR_NUMBITS_MASK) + { + tmp1 = ((uint32_t)0x03) << tmpmask; + tmpreg &= ~tmp1; + tmpreg |= ~DBGAFR_SWJCFG_MASK; + } + else + { + tmpreg &= ~(tmp << ((GPIO_Remap >> 0x15)*0x10)); + tmpreg |= ~DBGAFR_SWJCFG_MASK; + } + + if (NewState != DISABLE) + { + tmpreg |= (tmp << ((GPIO_Remap >> 0x15)*0x10)); + } + + if((GPIO_Remap & 0x80000000) == 0x80000000) + { + AFIO->MAPR2 = tmpreg; + } + else + { + AFIO->MAPR = tmpreg; + } +} + +/** + * @brief Selects the GPIO pin used as EXTI Line. + * @param GPIO_PortSource: selects the GPIO port to be used as source for EXTI lines. + * This parameter can be GPIO_PortSourceGPIOx where x can be (A..G). + * @param GPIO_PinSource: specifies the EXTI line to be configured. + * This parameter can be GPIO_PinSourcex where x can be (0..15). + * @retval None + */ +void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource) +{ + uint32_t tmp = 0x00; + /* Check the parameters */ + assert_param(IS_GPIO_EXTI_PORT_SOURCE(GPIO_PortSource)); + assert_param(IS_GPIO_PIN_SOURCE(GPIO_PinSource)); + + tmp = ((uint32_t)0x0F) << (0x04 * (GPIO_PinSource & (uint8_t)0x03)); + AFIO->EXTICR[GPIO_PinSource >> 0x02] &= ~tmp; + AFIO->EXTICR[GPIO_PinSource >> 0x02] |= (((uint32_t)GPIO_PortSource) << (0x04 * (GPIO_PinSource & (uint8_t)0x03))); +} + +/** + * @brief Selects the Ethernet media interface. + * @note This function applies only to STM32 Connectivity line devices. + * @param GPIO_ETH_MediaInterface: specifies the Media Interface mode. + * This parameter can be one of the following values: + * @arg GPIO_ETH_MediaInterface_MII: MII mode + * @arg GPIO_ETH_MediaInterface_RMII: RMII mode + * @retval None + */ +void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface) +{ + assert_param(IS_GPIO_ETH_MEDIA_INTERFACE(GPIO_ETH_MediaInterface)); + + /* Configure MII_RMII selection bit */ + *(__IO uint32_t *) MAPR_MII_RMII_SEL_BB = GPIO_ETH_MediaInterface; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_i2c.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_i2c.c new file mode 100644 index 0000000..8896726 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_i2c.c @@ -0,0 +1,1331 @@ +/** + ****************************************************************************** + * @file stm32f10x_i2c.c + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief This file provides all the I2C firmware functions. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_i2c.h" +#include "stm32f10x_rcc.h" + + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup I2C + * @brief I2C driver modules + * @{ + */ + +/** @defgroup I2C_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup I2C_Private_Defines + * @{ + */ + +/* I2C SPE mask */ +#define CR1_PE_Set ((uint16_t)0x0001) +#define CR1_PE_Reset ((uint16_t)0xFFFE) + +/* I2C START mask */ +#define CR1_START_Set ((uint16_t)0x0100) +#define CR1_START_Reset ((uint16_t)0xFEFF) + +/* I2C STOP mask */ +#define CR1_STOP_Set ((uint16_t)0x0200) +#define CR1_STOP_Reset ((uint16_t)0xFDFF) + +/* I2C ACK mask */ +#define CR1_ACK_Set ((uint16_t)0x0400) +#define CR1_ACK_Reset ((uint16_t)0xFBFF) + +/* I2C ENGC mask */ +#define CR1_ENGC_Set ((uint16_t)0x0040) +#define CR1_ENGC_Reset ((uint16_t)0xFFBF) + +/* I2C SWRST mask */ +#define CR1_SWRST_Set ((uint16_t)0x8000) +#define CR1_SWRST_Reset ((uint16_t)0x7FFF) + +/* I2C PEC mask */ +#define CR1_PEC_Set ((uint16_t)0x1000) +#define CR1_PEC_Reset ((uint16_t)0xEFFF) + +/* I2C ENPEC mask */ +#define CR1_ENPEC_Set ((uint16_t)0x0020) +#define CR1_ENPEC_Reset ((uint16_t)0xFFDF) + +/* I2C ENARP mask */ +#define CR1_ENARP_Set ((uint16_t)0x0010) +#define CR1_ENARP_Reset ((uint16_t)0xFFEF) + +/* I2C NOSTRETCH mask */ +#define CR1_NOSTRETCH_Set ((uint16_t)0x0080) +#define CR1_NOSTRETCH_Reset ((uint16_t)0xFF7F) + +/* I2C registers Masks */ +#define CR1_CLEAR_Mask ((uint16_t)0xFBF5) + +/* I2C DMAEN mask */ +#define CR2_DMAEN_Set ((uint16_t)0x0800) +#define CR2_DMAEN_Reset ((uint16_t)0xF7FF) + +/* I2C LAST mask */ +#define CR2_LAST_Set ((uint16_t)0x1000) +#define CR2_LAST_Reset ((uint16_t)0xEFFF) + +/* I2C FREQ mask */ +#define CR2_FREQ_Reset ((uint16_t)0xFFC0) + +/* I2C ADD0 mask */ +#define OAR1_ADD0_Set ((uint16_t)0x0001) +#define OAR1_ADD0_Reset ((uint16_t)0xFFFE) + +/* I2C ENDUAL mask */ +#define OAR2_ENDUAL_Set ((uint16_t)0x0001) +#define OAR2_ENDUAL_Reset ((uint16_t)0xFFFE) + +/* I2C ADD2 mask */ +#define OAR2_ADD2_Reset ((uint16_t)0xFF01) + +/* I2C F/S mask */ +#define CCR_FS_Set ((uint16_t)0x8000) + +/* I2C CCR mask */ +#define CCR_CCR_Set ((uint16_t)0x0FFF) + +/* I2C FLAG mask */ +#define FLAG_Mask ((uint32_t)0x00FFFFFF) + +/* I2C Interrupt Enable mask */ +#define ITEN_Mask ((uint32_t)0x07000000) + +/** + * @} + */ + +/** @defgroup I2C_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup I2C_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup I2C_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup I2C_Private_Functions + * @{ + */ + +/** + * @brief Deinitializes the I2Cx peripheral registers to their default reset values. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @retval None + */ +void I2C_DeInit(I2C_TypeDef* I2Cx) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + + if (I2Cx == I2C1) + { + /* Enable I2C1 reset state */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, ENABLE); + /* Release I2C1 from reset state */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, DISABLE); + } + else + { + /* Enable I2C2 reset state */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C2, ENABLE); + /* Release I2C2 from reset state */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C2, DISABLE); + } +} + +/** + * @brief Initializes the I2Cx peripheral according to the specified + * parameters in the I2C_InitStruct. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param I2C_InitStruct: pointer to a I2C_InitTypeDef structure that + * contains the configuration information for the specified I2C peripheral. + * @retval None + */ +void I2C_Init(I2C_TypeDef* I2Cx, I2C_InitTypeDef* I2C_InitStruct) +{ + uint16_t tmpreg = 0, freqrange = 0; + uint16_t result = 0x04; + uint32_t pclk1 = 8000000; + RCC_ClocksTypeDef rcc_clocks; + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_I2C_CLOCK_SPEED(I2C_InitStruct->I2C_ClockSpeed)); + assert_param(IS_I2C_MODE(I2C_InitStruct->I2C_Mode)); + assert_param(IS_I2C_DUTY_CYCLE(I2C_InitStruct->I2C_DutyCycle)); + assert_param(IS_I2C_OWN_ADDRESS1(I2C_InitStruct->I2C_OwnAddress1)); + assert_param(IS_I2C_ACK_STATE(I2C_InitStruct->I2C_Ack)); + assert_param(IS_I2C_ACKNOWLEDGE_ADDRESS(I2C_InitStruct->I2C_AcknowledgedAddress)); + +/*---------------------------- I2Cx CR2 Configuration ------------------------*/ + /* Get the I2Cx CR2 value */ + tmpreg = I2Cx->CR2; + /* Clear frequency FREQ[5:0] bits */ + tmpreg &= CR2_FREQ_Reset; + /* Get pclk1 frequency value */ + RCC_GetClocksFreq(&rcc_clocks); + pclk1 = rcc_clocks.PCLK1_Frequency; + /* Set frequency bits depending on pclk1 value */ + freqrange = (uint16_t)(pclk1 / 1000000); + tmpreg |= freqrange; + /* Write to I2Cx CR2 */ + I2Cx->CR2 = tmpreg; + +/*---------------------------- I2Cx CCR Configuration ------------------------*/ + /* Disable the selected I2C peripheral to configure TRISE */ + I2Cx->CR1 &= CR1_PE_Reset; + /* Reset tmpreg value */ + /* Clear F/S, DUTY and CCR[11:0] bits */ + tmpreg = 0; + + /* Configure speed in standard mode */ + if (I2C_InitStruct->I2C_ClockSpeed <= 100000) + { + /* Standard mode speed calculate */ + result = (uint16_t)(pclk1 / (I2C_InitStruct->I2C_ClockSpeed << 1)); + /* Test if CCR value is under 0x4*/ + if (result < 0x04) + { + /* Set minimum allowed value */ + result = 0x04; + } + /* Set speed value for standard mode */ + tmpreg |= result; + /* Set Maximum Rise Time for standard mode */ + I2Cx->TRISE = freqrange + 1; + } + /* Configure speed in fast mode */ + else /*(I2C_InitStruct->I2C_ClockSpeed <= 400000)*/ + { + if (I2C_InitStruct->I2C_DutyCycle == I2C_DutyCycle_2) + { + /* Fast mode speed calculate: Tlow/Thigh = 2 */ + result = (uint16_t)(pclk1 / (I2C_InitStruct->I2C_ClockSpeed * 3)); + } + else /*I2C_InitStruct->I2C_DutyCycle == I2C_DutyCycle_16_9*/ + { + /* Fast mode speed calculate: Tlow/Thigh = 16/9 */ + result = (uint16_t)(pclk1 / (I2C_InitStruct->I2C_ClockSpeed * 25)); + /* Set DUTY bit */ + result |= I2C_DutyCycle_16_9; + } + + /* Test if CCR value is under 0x1*/ + if ((result & CCR_CCR_Set) == 0) + { + /* Set minimum allowed value */ + result |= (uint16_t)0x0001; + } + /* Set speed value and set F/S bit for fast mode */ + tmpreg |= (uint16_t)(result | CCR_FS_Set); + /* Set Maximum Rise Time for fast mode */ + I2Cx->TRISE = (uint16_t)(((freqrange * (uint16_t)300) / (uint16_t)1000) + (uint16_t)1); + } + + /* Write to I2Cx CCR */ + I2Cx->CCR = tmpreg; + /* Enable the selected I2C peripheral */ + I2Cx->CR1 |= CR1_PE_Set; + +/*---------------------------- I2Cx CR1 Configuration ------------------------*/ + /* Get the I2Cx CR1 value */ + tmpreg = I2Cx->CR1; + /* Clear ACK, SMBTYPE and SMBUS bits */ + tmpreg &= CR1_CLEAR_Mask; + /* Configure I2Cx: mode and acknowledgement */ + /* Set SMBTYPE and SMBUS bits according to I2C_Mode value */ + /* Set ACK bit according to I2C_Ack value */ + tmpreg |= (uint16_t)((uint32_t)I2C_InitStruct->I2C_Mode | I2C_InitStruct->I2C_Ack); + /* Write to I2Cx CR1 */ + I2Cx->CR1 = tmpreg; + +/*---------------------------- I2Cx OAR1 Configuration -----------------------*/ + /* Set I2Cx Own Address1 and acknowledged address */ + I2Cx->OAR1 = (I2C_InitStruct->I2C_AcknowledgedAddress | I2C_InitStruct->I2C_OwnAddress1); +} + +/** + * @brief Fills each I2C_InitStruct member with its default value. + * @param I2C_InitStruct: pointer to an I2C_InitTypeDef structure which will be initialized. + * @retval None + */ +void I2C_StructInit(I2C_InitTypeDef* I2C_InitStruct) +{ +/*---------------- Reset I2C init structure parameters values ----------------*/ + /* initialize the I2C_ClockSpeed member */ + I2C_InitStruct->I2C_ClockSpeed = 5000; + /* Initialize the I2C_Mode member */ + I2C_InitStruct->I2C_Mode = I2C_Mode_I2C; + /* Initialize the I2C_DutyCycle member */ + I2C_InitStruct->I2C_DutyCycle = I2C_DutyCycle_2; + /* Initialize the I2C_OwnAddress1 member */ + I2C_InitStruct->I2C_OwnAddress1 = 0; + /* Initialize the I2C_Ack member */ + I2C_InitStruct->I2C_Ack = I2C_Ack_Disable; + /* Initialize the I2C_AcknowledgedAddress member */ + I2C_InitStruct->I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; +} + +/** + * @brief Enables or disables the specified I2C peripheral. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param NewState: new state of the I2Cx peripheral. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void I2C_Cmd(I2C_TypeDef* I2Cx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected I2C peripheral */ + I2Cx->CR1 |= CR1_PE_Set; + } + else + { + /* Disable the selected I2C peripheral */ + I2Cx->CR1 &= CR1_PE_Reset; + } +} + +/** + * @brief Enables or disables the specified I2C DMA requests. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param NewState: new state of the I2C DMA transfer. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void I2C_DMACmd(I2C_TypeDef* I2Cx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected I2C DMA requests */ + I2Cx->CR2 |= CR2_DMAEN_Set; + } + else + { + /* Disable the selected I2C DMA requests */ + I2Cx->CR2 &= CR2_DMAEN_Reset; + } +} + +/** + * @brief Specifies if the next DMA transfer will be the last one. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param NewState: new state of the I2C DMA last transfer. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void I2C_DMALastTransferCmd(I2C_TypeDef* I2Cx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Next DMA transfer is the last transfer */ + I2Cx->CR2 |= CR2_LAST_Set; + } + else + { + /* Next DMA transfer is not the last transfer */ + I2Cx->CR2 &= CR2_LAST_Reset; + } +} + +/** + * @brief Generates I2Cx communication START condition. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param NewState: new state of the I2C START condition generation. + * This parameter can be: ENABLE or DISABLE. + * @retval None. + */ +void I2C_GenerateSTART(I2C_TypeDef* I2Cx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Generate a START condition */ + I2Cx->CR1 |= CR1_START_Set; + } + else + { + /* Disable the START condition generation */ + I2Cx->CR1 &= CR1_START_Reset; + } +} + +/** + * @brief Generates I2Cx communication STOP condition. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param NewState: new state of the I2C STOP condition generation. + * This parameter can be: ENABLE or DISABLE. + * @retval None. + */ +void I2C_GenerateSTOP(I2C_TypeDef* I2Cx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Generate a STOP condition */ + I2Cx->CR1 |= CR1_STOP_Set; + } + else + { + /* Disable the STOP condition generation */ + I2Cx->CR1 &= CR1_STOP_Reset; + } +} + +/** + * @brief Enables or disables the specified I2C acknowledge feature. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param NewState: new state of the I2C Acknowledgement. + * This parameter can be: ENABLE or DISABLE. + * @retval None. + */ +void I2C_AcknowledgeConfig(I2C_TypeDef* I2Cx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the acknowledgement */ + I2Cx->CR1 |= CR1_ACK_Set; + } + else + { + /* Disable the acknowledgement */ + I2Cx->CR1 &= CR1_ACK_Reset; + } +} + +/** + * @brief Configures the specified I2C own address2. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param Address: specifies the 7bit I2C own address2. + * @retval None. + */ +void I2C_OwnAddress2Config(I2C_TypeDef* I2Cx, uint8_t Address) +{ + uint16_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + + /* Get the old register value */ + tmpreg = I2Cx->OAR2; + + /* Reset I2Cx Own address2 bit [7:1] */ + tmpreg &= OAR2_ADD2_Reset; + + /* Set I2Cx Own address2 */ + tmpreg |= (uint16_t)((uint16_t)Address & (uint16_t)0x00FE); + + /* Store the new register value */ + I2Cx->OAR2 = tmpreg; +} + +/** + * @brief Enables or disables the specified I2C dual addressing mode. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param NewState: new state of the I2C dual addressing mode. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void I2C_DualAddressCmd(I2C_TypeDef* I2Cx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable dual addressing mode */ + I2Cx->OAR2 |= OAR2_ENDUAL_Set; + } + else + { + /* Disable dual addressing mode */ + I2Cx->OAR2 &= OAR2_ENDUAL_Reset; + } +} + +/** + * @brief Enables or disables the specified I2C general call feature. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param NewState: new state of the I2C General call. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void I2C_GeneralCallCmd(I2C_TypeDef* I2Cx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable generall call */ + I2Cx->CR1 |= CR1_ENGC_Set; + } + else + { + /* Disable generall call */ + I2Cx->CR1 &= CR1_ENGC_Reset; + } +} + +/** + * @brief Enables or disables the specified I2C interrupts. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param I2C_IT: specifies the I2C interrupts sources to be enabled or disabled. + * This parameter can be any combination of the following values: + * @arg I2C_IT_BUF: Buffer interrupt mask + * @arg I2C_IT_EVT: Event interrupt mask + * @arg I2C_IT_ERR: Error interrupt mask + * @param NewState: new state of the specified I2C interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void I2C_ITConfig(I2C_TypeDef* I2Cx, uint16_t I2C_IT, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + assert_param(IS_I2C_CONFIG_IT(I2C_IT)); + + if (NewState != DISABLE) + { + /* Enable the selected I2C interrupts */ + I2Cx->CR2 |= I2C_IT; + } + else + { + /* Disable the selected I2C interrupts */ + I2Cx->CR2 &= (uint16_t)~I2C_IT; + } +} + +/** + * @brief Sends a data byte through the I2Cx peripheral. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param Data: Byte to be transmitted.. + * @retval None + */ +void I2C_SendData(I2C_TypeDef* I2Cx, uint8_t Data) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + /* Write in the DR register the data to be sent */ + I2Cx->DR = Data; +} + +/** + * @brief Returns the most recent received data by the I2Cx peripheral. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @retval The value of the received data. + */ +uint8_t I2C_ReceiveData(I2C_TypeDef* I2Cx) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + /* Return the data in the DR register */ + return (uint8_t)I2Cx->DR; +} + +/** + * @brief Transmits the address byte to select the slave device. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param Address: specifies the slave address which will be transmitted + * @param I2C_Direction: specifies whether the I2C device will be a + * Transmitter or a Receiver. This parameter can be one of the following values + * @arg I2C_Direction_Transmitter: Transmitter mode + * @arg I2C_Direction_Receiver: Receiver mode + * @retval None. + */ +void I2C_Send7bitAddress(I2C_TypeDef* I2Cx, uint8_t Address, uint8_t I2C_Direction) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_I2C_DIRECTION(I2C_Direction)); + /* Test on the direction to set/reset the read/write bit */ + if (I2C_Direction != I2C_Direction_Transmitter) + { + /* Set the address bit0 for read */ + Address |= OAR1_ADD0_Set; + } + else + { + /* Reset the address bit0 for write */ + Address &= OAR1_ADD0_Reset; + } + /* Send the address */ + I2Cx->DR = Address; +} + +/** + * @brief Reads the specified I2C register and returns its value. + * @param I2C_Register: specifies the register to read. + * This parameter can be one of the following values: + * @arg I2C_Register_CR1: CR1 register. + * @arg I2C_Register_CR2: CR2 register. + * @arg I2C_Register_OAR1: OAR1 register. + * @arg I2C_Register_OAR2: OAR2 register. + * @arg I2C_Register_DR: DR register. + * @arg I2C_Register_SR1: SR1 register. + * @arg I2C_Register_SR2: SR2 register. + * @arg I2C_Register_CCR: CCR register. + * @arg I2C_Register_TRISE: TRISE register. + * @retval The value of the read register. + */ +uint16_t I2C_ReadRegister(I2C_TypeDef* I2Cx, uint8_t I2C_Register) +{ + __IO uint32_t tmp = 0; + + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_I2C_REGISTER(I2C_Register)); + + tmp = (uint32_t) I2Cx; + tmp += I2C_Register; + + /* Return the selected register value */ + return (*(__IO uint16_t *) tmp); +} + +/** + * @brief Enables or disables the specified I2C software reset. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param NewState: new state of the I2C software reset. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void I2C_SoftwareResetCmd(I2C_TypeDef* I2Cx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Peripheral under reset */ + I2Cx->CR1 |= CR1_SWRST_Set; + } + else + { + /* Peripheral not under reset */ + I2Cx->CR1 &= CR1_SWRST_Reset; + } +} + +/** + * @brief Selects the specified I2C NACK position in master receiver mode. + * This function is useful in I2C Master Receiver mode when the number + * of data to be received is equal to 2. In this case, this function + * should be called (with parameter I2C_NACKPosition_Next) before data + * reception starts,as described in the 2-byte reception procedure + * recommended in Reference Manual in Section: Master receiver. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param I2C_NACKPosition: specifies the NACK position. + * This parameter can be one of the following values: + * @arg I2C_NACKPosition_Next: indicates that the next byte will be the last + * received byte. + * @arg I2C_NACKPosition_Current: indicates that current byte is the last + * received byte. + * + * @note This function configures the same bit (POS) as I2C_PECPositionConfig() + * but is intended to be used in I2C mode while I2C_PECPositionConfig() + * is intended to used in SMBUS mode. + * + * @retval None + */ +void I2C_NACKPositionConfig(I2C_TypeDef* I2Cx, uint16_t I2C_NACKPosition) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_I2C_NACK_POSITION(I2C_NACKPosition)); + + /* Check the input parameter */ + if (I2C_NACKPosition == I2C_NACKPosition_Next) + { + /* Next byte in shift register is the last received byte */ + I2Cx->CR1 |= I2C_NACKPosition_Next; + } + else + { + /* Current byte in shift register is the last received byte */ + I2Cx->CR1 &= I2C_NACKPosition_Current; + } +} + +/** + * @brief Drives the SMBusAlert pin high or low for the specified I2C. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param I2C_SMBusAlert: specifies SMBAlert pin level. + * This parameter can be one of the following values: + * @arg I2C_SMBusAlert_Low: SMBAlert pin driven low + * @arg I2C_SMBusAlert_High: SMBAlert pin driven high + * @retval None + */ +void I2C_SMBusAlertConfig(I2C_TypeDef* I2Cx, uint16_t I2C_SMBusAlert) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_I2C_SMBUS_ALERT(I2C_SMBusAlert)); + if (I2C_SMBusAlert == I2C_SMBusAlert_Low) + { + /* Drive the SMBusAlert pin Low */ + I2Cx->CR1 |= I2C_SMBusAlert_Low; + } + else + { + /* Drive the SMBusAlert pin High */ + I2Cx->CR1 &= I2C_SMBusAlert_High; + } +} + +/** + * @brief Enables or disables the specified I2C PEC transfer. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param NewState: new state of the I2C PEC transmission. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void I2C_TransmitPEC(I2C_TypeDef* I2Cx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected I2C PEC transmission */ + I2Cx->CR1 |= CR1_PEC_Set; + } + else + { + /* Disable the selected I2C PEC transmission */ + I2Cx->CR1 &= CR1_PEC_Reset; + } +} + +/** + * @brief Selects the specified I2C PEC position. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param I2C_PECPosition: specifies the PEC position. + * This parameter can be one of the following values: + * @arg I2C_PECPosition_Next: indicates that the next byte is PEC + * @arg I2C_PECPosition_Current: indicates that current byte is PEC + * + * @note This function configures the same bit (POS) as I2C_NACKPositionConfig() + * but is intended to be used in SMBUS mode while I2C_NACKPositionConfig() + * is intended to used in I2C mode. + * + * @retval None + */ +void I2C_PECPositionConfig(I2C_TypeDef* I2Cx, uint16_t I2C_PECPosition) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_I2C_PEC_POSITION(I2C_PECPosition)); + if (I2C_PECPosition == I2C_PECPosition_Next) + { + /* Next byte in shift register is PEC */ + I2Cx->CR1 |= I2C_PECPosition_Next; + } + else + { + /* Current byte in shift register is PEC */ + I2Cx->CR1 &= I2C_PECPosition_Current; + } +} + +/** + * @brief Enables or disables the PEC value calculation of the transferred bytes. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param NewState: new state of the I2Cx PEC value calculation. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void I2C_CalculatePEC(I2C_TypeDef* I2Cx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected I2C PEC calculation */ + I2Cx->CR1 |= CR1_ENPEC_Set; + } + else + { + /* Disable the selected I2C PEC calculation */ + I2Cx->CR1 &= CR1_ENPEC_Reset; + } +} + +/** + * @brief Returns the PEC value for the specified I2C. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @retval The PEC value. + */ +uint8_t I2C_GetPEC(I2C_TypeDef* I2Cx) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + /* Return the selected I2C PEC value */ + return ((I2Cx->SR2) >> 8); +} + +/** + * @brief Enables or disables the specified I2C ARP. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param NewState: new state of the I2Cx ARP. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void I2C_ARPCmd(I2C_TypeDef* I2Cx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected I2C ARP */ + I2Cx->CR1 |= CR1_ENARP_Set; + } + else + { + /* Disable the selected I2C ARP */ + I2Cx->CR1 &= CR1_ENARP_Reset; + } +} + +/** + * @brief Enables or disables the specified I2C Clock stretching. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param NewState: new state of the I2Cx Clock stretching. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void I2C_StretchClockCmd(I2C_TypeDef* I2Cx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState == DISABLE) + { + /* Enable the selected I2C Clock stretching */ + I2Cx->CR1 |= CR1_NOSTRETCH_Set; + } + else + { + /* Disable the selected I2C Clock stretching */ + I2Cx->CR1 &= CR1_NOSTRETCH_Reset; + } +} + +/** + * @brief Selects the specified I2C fast mode duty cycle. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param I2C_DutyCycle: specifies the fast mode duty cycle. + * This parameter can be one of the following values: + * @arg I2C_DutyCycle_2: I2C fast mode Tlow/Thigh = 2 + * @arg I2C_DutyCycle_16_9: I2C fast mode Tlow/Thigh = 16/9 + * @retval None + */ +void I2C_FastModeDutyCycleConfig(I2C_TypeDef* I2Cx, uint16_t I2C_DutyCycle) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_I2C_DUTY_CYCLE(I2C_DutyCycle)); + if (I2C_DutyCycle != I2C_DutyCycle_16_9) + { + /* I2C fast mode Tlow/Thigh=2 */ + I2Cx->CCR &= I2C_DutyCycle_2; + } + else + { + /* I2C fast mode Tlow/Thigh=16/9 */ + I2Cx->CCR |= I2C_DutyCycle_16_9; + } +} + + + +/** + * @brief + **************************************************************************************** + * + * I2C State Monitoring Functions + * + **************************************************************************************** + * This I2C driver provides three different ways for I2C state monitoring + * depending on the application requirements and constraints: + * + * + * 1) Basic state monitoring: + * Using I2C_CheckEvent() function: + * It compares the status registers (SR1 and SR2) content to a given event + * (can be the combination of one or more flags). + * It returns SUCCESS if the current status includes the given flags + * and returns ERROR if one or more flags are missing in the current status. + * - When to use: + * - This function is suitable for most applications as well as for startup + * activity since the events are fully described in the product reference manual + * (RM0008). + * - It is also suitable for users who need to define their own events. + * - Limitations: + * - If an error occurs (ie. error flags are set besides to the monitored flags), + * the I2C_CheckEvent() function may return SUCCESS despite the communication + * hold or corrupted real state. + * In this case, it is advised to use error interrupts to monitor the error + * events and handle them in the interrupt IRQ handler. + * + * @note + * For error management, it is advised to use the following functions: + * - I2C_ITConfig() to configure and enable the error interrupts (I2C_IT_ERR). + * - I2Cx_ER_IRQHandler() which is called when the error interrupt occurs. + * Where x is the peripheral instance (I2C1, I2C2 ...) + * - I2C_GetFlagStatus() or I2C_GetITStatus() to be called into I2Cx_ER_IRQHandler() + * in order to determine which error occured. + * - I2C_ClearFlag() or I2C_ClearITPendingBit() and/or I2C_SoftwareResetCmd() + * and/or I2C_GenerateStop() in order to clear the error flag and source, + * and return to correct communication status. + * + * + * 2) Advanced state monitoring: + * Using the function I2C_GetLastEvent() which returns the image of both status + * registers in a single word (uint32_t) (Status Register 2 value is shifted left + * by 16 bits and concatenated to Status Register 1). + * - When to use: + * - This function is suitable for the same applications above but it allows to + * overcome the mentioned limitation of I2C_GetFlagStatus() function. + * The returned value could be compared to events already defined in the + * library (stm32f10x_i2c.h) or to custom values defined by user. + * - This function is suitable when multiple flags are monitored at the same time. + * - At the opposite of I2C_CheckEvent() function, this function allows user to + * choose when an event is accepted (when all events flags are set and no + * other flags are set or just when the needed flags are set like + * I2C_CheckEvent() function). + * - Limitations: + * - User may need to define his own events. + * - Same remark concerning the error management is applicable for this + * function if user decides to check only regular communication flags (and + * ignores error flags). + * + * + * 3) Flag-based state monitoring: + * Using the function I2C_GetFlagStatus() which simply returns the status of + * one single flag (ie. I2C_FLAG_RXNE ...). + * - When to use: + * - This function could be used for specific applications or in debug phase. + * - It is suitable when only one flag checking is needed (most I2C events + * are monitored through multiple flags). + * - Limitations: + * - When calling this function, the Status register is accessed. Some flags are + * cleared when the status register is accessed. So checking the status + * of one Flag, may clear other ones. + * - Function may need to be called twice or more in order to monitor one + * single event. + * + * For detailed description of Events, please refer to section I2C_Events in + * stm32f10x_i2c.h file. + * + */ + +/** + * + * 1) Basic state monitoring + ******************************************************************************* + */ + +/** + * @brief Checks whether the last I2Cx Event is equal to the one passed + * as parameter. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param I2C_EVENT: specifies the event to be checked. + * This parameter can be one of the following values: + * @arg I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED : EV1 + * @arg I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED : EV1 + * @arg I2C_EVENT_SLAVE_TRANSMITTER_SECONDADDRESS_MATCHED : EV1 + * @arg I2C_EVENT_SLAVE_RECEIVER_SECONDADDRESS_MATCHED : EV1 + * @arg I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED : EV1 + * @arg I2C_EVENT_SLAVE_BYTE_RECEIVED : EV2 + * @arg (I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_FLAG_DUALF) : EV2 + * @arg (I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_FLAG_GENCALL) : EV2 + * @arg I2C_EVENT_SLAVE_BYTE_TRANSMITTED : EV3 + * @arg (I2C_EVENT_SLAVE_BYTE_TRANSMITTED | I2C_FLAG_DUALF) : EV3 + * @arg (I2C_EVENT_SLAVE_BYTE_TRANSMITTED | I2C_FLAG_GENCALL) : EV3 + * @arg I2C_EVENT_SLAVE_ACK_FAILURE : EV3_2 + * @arg I2C_EVENT_SLAVE_STOP_DETECTED : EV4 + * @arg I2C_EVENT_MASTER_MODE_SELECT : EV5 + * @arg I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED : EV6 + * @arg I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED : EV6 + * @arg I2C_EVENT_MASTER_BYTE_RECEIVED : EV7 + * @arg I2C_EVENT_MASTER_BYTE_TRANSMITTING : EV8 + * @arg I2C_EVENT_MASTER_BYTE_TRANSMITTED : EV8_2 + * @arg I2C_EVENT_MASTER_MODE_ADDRESS10 : EV9 + * + * @note: For detailed description of Events, please refer to section + * I2C_Events in stm32f10x_i2c.h file. + * + * @retval An ErrorStatus enumeration value: + * - SUCCESS: Last event is equal to the I2C_EVENT + * - ERROR: Last event is different from the I2C_EVENT + */ +ErrorStatus I2C_CheckEvent(I2C_TypeDef* I2Cx, uint32_t I2C_EVENT) +{ + uint32_t lastevent = 0; + uint32_t flag1 = 0, flag2 = 0; + ErrorStatus status = ERROR; + + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_I2C_EVENT(I2C_EVENT)); + + /* Read the I2Cx status register */ + flag1 = I2Cx->SR1; + flag2 = I2Cx->SR2; + flag2 = flag2 << 16; + + /* Get the last event value from I2C status register */ + lastevent = (flag1 | flag2) & FLAG_Mask; + + /* Check whether the last event contains the I2C_EVENT */ + if ((lastevent & I2C_EVENT) == I2C_EVENT) + { + /* SUCCESS: last event is equal to I2C_EVENT */ + status = SUCCESS; + } + else + { + /* ERROR: last event is different from I2C_EVENT */ + status = ERROR; + } + /* Return status */ + return status; +} + +/** + * + * 2) Advanced state monitoring + ******************************************************************************* + */ + +/** + * @brief Returns the last I2Cx Event. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * + * @note: For detailed description of Events, please refer to section + * I2C_Events in stm32f10x_i2c.h file. + * + * @retval The last event + */ +uint32_t I2C_GetLastEvent(I2C_TypeDef* I2Cx) +{ + uint32_t lastevent = 0; + uint32_t flag1 = 0, flag2 = 0; + + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + + /* Read the I2Cx status register */ + flag1 = I2Cx->SR1; + flag2 = I2Cx->SR2; + flag2 = flag2 << 16; + + /* Get the last event value from I2C status register */ + lastevent = (flag1 | flag2) & FLAG_Mask; + + /* Return status */ + return lastevent; +} + +/** + * + * 3) Flag-based state monitoring + ******************************************************************************* + */ + +/** + * @brief Checks whether the specified I2C flag is set or not. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param I2C_FLAG: specifies the flag to check. + * This parameter can be one of the following values: + * @arg I2C_FLAG_DUALF: Dual flag (Slave mode) + * @arg I2C_FLAG_SMBHOST: SMBus host header (Slave mode) + * @arg I2C_FLAG_SMBDEFAULT: SMBus default header (Slave mode) + * @arg I2C_FLAG_GENCALL: General call header flag (Slave mode) + * @arg I2C_FLAG_TRA: Transmitter/Receiver flag + * @arg I2C_FLAG_BUSY: Bus busy flag + * @arg I2C_FLAG_MSL: Master/Slave flag + * @arg I2C_FLAG_SMBALERT: SMBus Alert flag + * @arg I2C_FLAG_TIMEOUT: Timeout or Tlow error flag + * @arg I2C_FLAG_PECERR: PEC error in reception flag + * @arg I2C_FLAG_OVR: Overrun/Underrun flag (Slave mode) + * @arg I2C_FLAG_AF: Acknowledge failure flag + * @arg I2C_FLAG_ARLO: Arbitration lost flag (Master mode) + * @arg I2C_FLAG_BERR: Bus error flag + * @arg I2C_FLAG_TXE: Data register empty flag (Transmitter) + * @arg I2C_FLAG_RXNE: Data register not empty (Receiver) flag + * @arg I2C_FLAG_STOPF: Stop detection flag (Slave mode) + * @arg I2C_FLAG_ADD10: 10-bit header sent flag (Master mode) + * @arg I2C_FLAG_BTF: Byte transfer finished flag + * @arg I2C_FLAG_ADDR: Address sent flag (Master mode) "ADSL" + * Address matched flag (Slave mode)"ENDA" + * @arg I2C_FLAG_SB: Start bit flag (Master mode) + * @retval The new state of I2C_FLAG (SET or RESET). + */ +FlagStatus I2C_GetFlagStatus(I2C_TypeDef* I2Cx, uint32_t I2C_FLAG) +{ + FlagStatus bitstatus = RESET; + __IO uint32_t i2creg = 0, i2cxbase = 0; + + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_I2C_GET_FLAG(I2C_FLAG)); + + /* Get the I2Cx peripheral base address */ + i2cxbase = (uint32_t)I2Cx; + + /* Read flag register index */ + i2creg = I2C_FLAG >> 28; + + /* Get bit[23:0] of the flag */ + I2C_FLAG &= FLAG_Mask; + + if(i2creg != 0) + { + /* Get the I2Cx SR1 register address */ + i2cxbase += 0x14; + } + else + { + /* Flag in I2Cx SR2 Register */ + I2C_FLAG = (uint32_t)(I2C_FLAG >> 16); + /* Get the I2Cx SR2 register address */ + i2cxbase += 0x18; + } + + if(((*(__IO uint32_t *)i2cxbase) & I2C_FLAG) != (uint32_t)RESET) + { + /* I2C_FLAG is set */ + bitstatus = SET; + } + else + { + /* I2C_FLAG is reset */ + bitstatus = RESET; + } + + /* Return the I2C_FLAG status */ + return bitstatus; +} + + + +/** + * @brief Clears the I2Cx's pending flags. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param I2C_FLAG: specifies the flag to clear. + * This parameter can be any combination of the following values: + * @arg I2C_FLAG_SMBALERT: SMBus Alert flag + * @arg I2C_FLAG_TIMEOUT: Timeout or Tlow error flag + * @arg I2C_FLAG_PECERR: PEC error in reception flag + * @arg I2C_FLAG_OVR: Overrun/Underrun flag (Slave mode) + * @arg I2C_FLAG_AF: Acknowledge failure flag + * @arg I2C_FLAG_ARLO: Arbitration lost flag (Master mode) + * @arg I2C_FLAG_BERR: Bus error flag + * + * @note + * - STOPF (STOP detection) is cleared by software sequence: a read operation + * to I2C_SR1 register (I2C_GetFlagStatus()) followed by a write operation + * to I2C_CR1 register (I2C_Cmd() to re-enable the I2C peripheral). + * - ADD10 (10-bit header sent) is cleared by software sequence: a read + * operation to I2C_SR1 (I2C_GetFlagStatus()) followed by writing the + * second byte of the address in DR register. + * - BTF (Byte Transfer Finished) is cleared by software sequence: a read + * operation to I2C_SR1 register (I2C_GetFlagStatus()) followed by a + * read/write to I2C_DR register (I2C_SendData()). + * - ADDR (Address sent) is cleared by software sequence: a read operation to + * I2C_SR1 register (I2C_GetFlagStatus()) followed by a read operation to + * I2C_SR2 register ((void)(I2Cx->SR2)). + * - SB (Start Bit) is cleared software sequence: a read operation to I2C_SR1 + * register (I2C_GetFlagStatus()) followed by a write operation to I2C_DR + * register (I2C_SendData()). + * @retval None + */ +void I2C_ClearFlag(I2C_TypeDef* I2Cx, uint32_t I2C_FLAG) +{ + uint32_t flagpos = 0; + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_I2C_CLEAR_FLAG(I2C_FLAG)); + /* Get the I2C flag position */ + flagpos = I2C_FLAG & FLAG_Mask; + /* Clear the selected I2C flag */ + I2Cx->SR1 = (uint16_t)~flagpos; +} + +/** + * @brief Checks whether the specified I2C interrupt has occurred or not. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param I2C_IT: specifies the interrupt source to check. + * This parameter can be one of the following values: + * @arg I2C_IT_SMBALERT: SMBus Alert flag + * @arg I2C_IT_TIMEOUT: Timeout or Tlow error flag + * @arg I2C_IT_PECERR: PEC error in reception flag + * @arg I2C_IT_OVR: Overrun/Underrun flag (Slave mode) + * @arg I2C_IT_AF: Acknowledge failure flag + * @arg I2C_IT_ARLO: Arbitration lost flag (Master mode) + * @arg I2C_IT_BERR: Bus error flag + * @arg I2C_IT_TXE: Data register empty flag (Transmitter) + * @arg I2C_IT_RXNE: Data register not empty (Receiver) flag + * @arg I2C_IT_STOPF: Stop detection flag (Slave mode) + * @arg I2C_IT_ADD10: 10-bit header sent flag (Master mode) + * @arg I2C_IT_BTF: Byte transfer finished flag + * @arg I2C_IT_ADDR: Address sent flag (Master mode) "ADSL" + * Address matched flag (Slave mode)"ENDAD" + * @arg I2C_IT_SB: Start bit flag (Master mode) + * @retval The new state of I2C_IT (SET or RESET). + */ +ITStatus I2C_GetITStatus(I2C_TypeDef* I2Cx, uint32_t I2C_IT) +{ + ITStatus bitstatus = RESET; + uint32_t enablestatus = 0; + + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_I2C_GET_IT(I2C_IT)); + + /* Check if the interrupt source is enabled or not */ + enablestatus = (uint32_t)(((I2C_IT & ITEN_Mask) >> 16) & (I2Cx->CR2)) ; + + /* Get bit[23:0] of the flag */ + I2C_IT &= FLAG_Mask; + + /* Check the status of the specified I2C flag */ + if (((I2Cx->SR1 & I2C_IT) != (uint32_t)RESET) && enablestatus) + { + /* I2C_IT is set */ + bitstatus = SET; + } + else + { + /* I2C_IT is reset */ + bitstatus = RESET; + } + /* Return the I2C_IT status */ + return bitstatus; +} + +/** + * @brief Clears the I2Cx’s interrupt pending bits. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param I2C_IT: specifies the interrupt pending bit to clear. + * This parameter can be any combination of the following values: + * @arg I2C_IT_SMBALERT: SMBus Alert interrupt + * @arg I2C_IT_TIMEOUT: Timeout or Tlow error interrupt + * @arg I2C_IT_PECERR: PEC error in reception interrupt + * @arg I2C_IT_OVR: Overrun/Underrun interrupt (Slave mode) + * @arg I2C_IT_AF: Acknowledge failure interrupt + * @arg I2C_IT_ARLO: Arbitration lost interrupt (Master mode) + * @arg I2C_IT_BERR: Bus error interrupt + * + * @note + * - STOPF (STOP detection) is cleared by software sequence: a read operation + * to I2C_SR1 register (I2C_GetITStatus()) followed by a write operation to + * I2C_CR1 register (I2C_Cmd() to re-enable the I2C peripheral). + * - ADD10 (10-bit header sent) is cleared by software sequence: a read + * operation to I2C_SR1 (I2C_GetITStatus()) followed by writing the second + * byte of the address in I2C_DR register. + * - BTF (Byte Transfer Finished) is cleared by software sequence: a read + * operation to I2C_SR1 register (I2C_GetITStatus()) followed by a + * read/write to I2C_DR register (I2C_SendData()). + * - ADDR (Address sent) is cleared by software sequence: a read operation to + * I2C_SR1 register (I2C_GetITStatus()) followed by a read operation to + * I2C_SR2 register ((void)(I2Cx->SR2)). + * - SB (Start Bit) is cleared by software sequence: a read operation to + * I2C_SR1 register (I2C_GetITStatus()) followed by a write operation to + * I2C_DR register (I2C_SendData()). + * @retval None + */ +void I2C_ClearITPendingBit(I2C_TypeDef* I2Cx, uint32_t I2C_IT) +{ + uint32_t flagpos = 0; + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_I2C_CLEAR_IT(I2C_IT)); + /* Get the I2C flag position */ + flagpos = I2C_IT & FLAG_Mask; + /* Clear the selected I2C flag */ + I2Cx->SR1 = (uint16_t)~flagpos; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_iwdg.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_iwdg.c new file mode 100644 index 0000000..9d3b0e8 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_iwdg.c @@ -0,0 +1,190 @@ +/** + ****************************************************************************** + * @file stm32f10x_iwdg.c + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief This file provides all the IWDG firmware functions. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_iwdg.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup IWDG + * @brief IWDG driver modules + * @{ + */ + +/** @defgroup IWDG_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup IWDG_Private_Defines + * @{ + */ + +/* ---------------------- IWDG registers bit mask ----------------------------*/ + +/* KR register bit mask */ +#define KR_KEY_Reload ((uint16_t)0xAAAA) +#define KR_KEY_Enable ((uint16_t)0xCCCC) + +/** + * @} + */ + +/** @defgroup IWDG_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup IWDG_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup IWDG_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup IWDG_Private_Functions + * @{ + */ + +/** + * @brief Enables or disables write access to IWDG_PR and IWDG_RLR registers. + * @param IWDG_WriteAccess: new state of write access to IWDG_PR and IWDG_RLR registers. + * This parameter can be one of the following values: + * @arg IWDG_WriteAccess_Enable: Enable write access to IWDG_PR and IWDG_RLR registers + * @arg IWDG_WriteAccess_Disable: Disable write access to IWDG_PR and IWDG_RLR registers + * @retval None + */ +void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess) +{ + /* Check the parameters */ + assert_param(IS_IWDG_WRITE_ACCESS(IWDG_WriteAccess)); + IWDG->KR = IWDG_WriteAccess; +} + +/** + * @brief Sets IWDG Prescaler value. + * @param IWDG_Prescaler: specifies the IWDG Prescaler value. + * This parameter can be one of the following values: + * @arg IWDG_Prescaler_4: IWDG prescaler set to 4 + * @arg IWDG_Prescaler_8: IWDG prescaler set to 8 + * @arg IWDG_Prescaler_16: IWDG prescaler set to 16 + * @arg IWDG_Prescaler_32: IWDG prescaler set to 32 + * @arg IWDG_Prescaler_64: IWDG prescaler set to 64 + * @arg IWDG_Prescaler_128: IWDG prescaler set to 128 + * @arg IWDG_Prescaler_256: IWDG prescaler set to 256 + * @retval None + */ +void IWDG_SetPrescaler(uint8_t IWDG_Prescaler) +{ + /* Check the parameters */ + assert_param(IS_IWDG_PRESCALER(IWDG_Prescaler)); + IWDG->PR = IWDG_Prescaler; +} + +/** + * @brief Sets IWDG Reload value. + * @param Reload: specifies the IWDG Reload value. + * This parameter must be a number between 0 and 0x0FFF. + * @retval None + */ +void IWDG_SetReload(uint16_t Reload) +{ + /* Check the parameters */ + assert_param(IS_IWDG_RELOAD(Reload)); + IWDG->RLR = Reload; +} + +/** + * @brief Reloads IWDG counter with value defined in the reload register + * (write access to IWDG_PR and IWDG_RLR registers disabled). + * @param None + * @retval None + */ +void IWDG_ReloadCounter(void) +{ + IWDG->KR = KR_KEY_Reload; +} + +/** + * @brief Enables IWDG (write access to IWDG_PR and IWDG_RLR registers disabled). + * @param None + * @retval None + */ +void IWDG_Enable(void) +{ + IWDG->KR = KR_KEY_Enable; +} + +/** + * @brief Checks whether the specified IWDG flag is set or not. + * @param IWDG_FLAG: specifies the flag to check. + * This parameter can be one of the following values: + * @arg IWDG_FLAG_PVU: Prescaler Value Update on going + * @arg IWDG_FLAG_RVU: Reload Value Update on going + * @retval The new state of IWDG_FLAG (SET or RESET). + */ +FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_IWDG_FLAG(IWDG_FLAG)); + if ((IWDG->SR & IWDG_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + /* Return the flag status */ + return bitstatus; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_pwr.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_pwr.c new file mode 100644 index 0000000..147bf0f --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_pwr.c @@ -0,0 +1,307 @@ +/** + ****************************************************************************** + * @file stm32f10x_pwr.c + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief This file provides all the PWR firmware functions. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_pwr.h" +#include "stm32f10x_rcc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup PWR + * @brief PWR driver modules + * @{ + */ + +/** @defgroup PWR_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup PWR_Private_Defines + * @{ + */ + +/* --------- PWR registers bit address in the alias region ---------- */ +#define PWR_OFFSET (PWR_BASE - PERIPH_BASE) + +/* --- CR Register ---*/ + +/* Alias word address of DBP bit */ +#define CR_OFFSET (PWR_OFFSET + 0x00) +#define DBP_BitNumber 0x08 +#define CR_DBP_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (DBP_BitNumber * 4)) + +/* Alias word address of PVDE bit */ +#define PVDE_BitNumber 0x04 +#define CR_PVDE_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (PVDE_BitNumber * 4)) + +/* --- CSR Register ---*/ + +/* Alias word address of EWUP bit */ +#define CSR_OFFSET (PWR_OFFSET + 0x04) +#define EWUP_BitNumber 0x08 +#define CSR_EWUP_BB (PERIPH_BB_BASE + (CSR_OFFSET * 32) + (EWUP_BitNumber * 4)) + +/* ------------------ PWR registers bit mask ------------------------ */ + +/* CR register bit mask */ +#define CR_DS_MASK ((uint32_t)0xFFFFFFFC) +#define CR_PLS_MASK ((uint32_t)0xFFFFFF1F) + + +/** + * @} + */ + +/** @defgroup PWR_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup PWR_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup PWR_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup PWR_Private_Functions + * @{ + */ + +/** + * @brief Deinitializes the PWR peripheral registers to their default reset values. + * @param None + * @retval None + */ +void PWR_DeInit(void) +{ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_PWR, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_PWR, DISABLE); +} + +/** + * @brief Enables or disables access to the RTC and backup registers. + * @param NewState: new state of the access to the RTC and backup registers. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void PWR_BackupAccessCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + *(__IO uint32_t *) CR_DBP_BB = (uint32_t)NewState; +} + +/** + * @brief Enables or disables the Power Voltage Detector(PVD). + * @param NewState: new state of the PVD. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void PWR_PVDCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + *(__IO uint32_t *) CR_PVDE_BB = (uint32_t)NewState; +} + +/** + * @brief Configures the voltage threshold detected by the Power Voltage Detector(PVD). + * @param PWR_PVDLevel: specifies the PVD detection level + * This parameter can be one of the following values: + * @arg PWR_PVDLevel_2V2: PVD detection level set to 2.2V + * @arg PWR_PVDLevel_2V3: PVD detection level set to 2.3V + * @arg PWR_PVDLevel_2V4: PVD detection level set to 2.4V + * @arg PWR_PVDLevel_2V5: PVD detection level set to 2.5V + * @arg PWR_PVDLevel_2V6: PVD detection level set to 2.6V + * @arg PWR_PVDLevel_2V7: PVD detection level set to 2.7V + * @arg PWR_PVDLevel_2V8: PVD detection level set to 2.8V + * @arg PWR_PVDLevel_2V9: PVD detection level set to 2.9V + * @retval None + */ +void PWR_PVDLevelConfig(uint32_t PWR_PVDLevel) +{ + uint32_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_PWR_PVD_LEVEL(PWR_PVDLevel)); + tmpreg = PWR->CR; + /* Clear PLS[7:5] bits */ + tmpreg &= CR_PLS_MASK; + /* Set PLS[7:5] bits according to PWR_PVDLevel value */ + tmpreg |= PWR_PVDLevel; + /* Store the new value */ + PWR->CR = tmpreg; +} + +/** + * @brief Enables or disables the WakeUp Pin functionality. + * @param NewState: new state of the WakeUp Pin functionality. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void PWR_WakeUpPinCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + *(__IO uint32_t *) CSR_EWUP_BB = (uint32_t)NewState; +} + +/** + * @brief Enters STOP mode. + * @param PWR_Regulator: specifies the regulator state in STOP mode. + * This parameter can be one of the following values: + * @arg PWR_Regulator_ON: STOP mode with regulator ON + * @arg PWR_Regulator_LowPower: STOP mode with regulator in low power mode + * @param PWR_STOPEntry: specifies if STOP mode in entered with WFI or WFE instruction. + * This parameter can be one of the following values: + * @arg PWR_STOPEntry_WFI: enter STOP mode with WFI instruction + * @arg PWR_STOPEntry_WFE: enter STOP mode with WFE instruction + * @retval None + */ +void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry) +{ + uint32_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_PWR_REGULATOR(PWR_Regulator)); + assert_param(IS_PWR_STOP_ENTRY(PWR_STOPEntry)); + + /* Select the regulator state in STOP mode ---------------------------------*/ + tmpreg = PWR->CR; + /* Clear PDDS and LPDS bits */ + tmpreg &= CR_DS_MASK; + /* Set LPDS bit according to PWR_Regulator value */ + tmpreg |= PWR_Regulator; + /* Store the new value */ + PWR->CR = tmpreg; + /* Set SLEEPDEEP bit of Cortex System Control Register */ + SCB->SCR |= SCB_SCR_SLEEPDEEP; + + /* Select STOP mode entry --------------------------------------------------*/ + if(PWR_STOPEntry == PWR_STOPEntry_WFI) + { + /* Request Wait For Interrupt */ + __WFI(); + } + else + { + /* Request Wait For Event */ + __WFE(); + } + + /* Reset SLEEPDEEP bit of Cortex System Control Register */ + SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP); +} + +/** + * @brief Enters STANDBY mode. + * @param None + * @retval None + */ +void PWR_EnterSTANDBYMode(void) +{ + /* Clear Wake-up flag */ + PWR->CR |= PWR_CR_CWUF; + /* Select STANDBY mode */ + PWR->CR |= PWR_CR_PDDS; + /* Set SLEEPDEEP bit of Cortex System Control Register */ + SCB->SCR |= SCB_SCR_SLEEPDEEP; +/* This option is used to ensure that store operations are completed */ +#if defined ( __CC_ARM ) + __force_stores(); +#endif + /* Request Wait For Interrupt */ + __WFI(); +} + +/** + * @brief Checks whether the specified PWR flag is set or not. + * @param PWR_FLAG: specifies the flag to check. + * This parameter can be one of the following values: + * @arg PWR_FLAG_WU: Wake Up flag + * @arg PWR_FLAG_SB: StandBy flag + * @arg PWR_FLAG_PVDO: PVD Output + * @retval The new state of PWR_FLAG (SET or RESET). + */ +FlagStatus PWR_GetFlagStatus(uint32_t PWR_FLAG) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_PWR_GET_FLAG(PWR_FLAG)); + + if ((PWR->CSR & PWR_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + /* Return the flag status */ + return bitstatus; +} + +/** + * @brief Clears the PWR's pending flags. + * @param PWR_FLAG: specifies the flag to clear. + * This parameter can be one of the following values: + * @arg PWR_FLAG_WU: Wake Up flag + * @arg PWR_FLAG_SB: StandBy flag + * @retval None + */ +void PWR_ClearFlag(uint32_t PWR_FLAG) +{ + /* Check the parameters */ + assert_param(IS_PWR_CLEAR_FLAG(PWR_FLAG)); + + PWR->CR |= PWR_FLAG << 2; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_rcc.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_rcc.c new file mode 100644 index 0000000..4b2ec1f --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_rcc.c @@ -0,0 +1,1470 @@ +/** + ****************************************************************************** + * @file stm32f10x_rcc.c + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief This file provides all the RCC firmware functions. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_rcc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup RCC + * @brief RCC driver modules + * @{ + */ + +/** @defgroup RCC_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup RCC_Private_Defines + * @{ + */ + +/* ------------ RCC registers bit address in the alias region ----------- */ +#define RCC_OFFSET (RCC_BASE - PERIPH_BASE) + +/* --- CR Register ---*/ + +/* Alias word address of HSION bit */ +#define CR_OFFSET (RCC_OFFSET + 0x00) +#define HSION_BitNumber 0x00 +#define CR_HSION_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (HSION_BitNumber * 4)) + +/* Alias word address of PLLON bit */ +#define PLLON_BitNumber 0x18 +#define CR_PLLON_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (PLLON_BitNumber * 4)) + +#ifdef STM32F10X_CL + /* Alias word address of PLL2ON bit */ + #define PLL2ON_BitNumber 0x1A + #define CR_PLL2ON_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (PLL2ON_BitNumber * 4)) + + /* Alias word address of PLL3ON bit */ + #define PLL3ON_BitNumber 0x1C + #define CR_PLL3ON_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (PLL3ON_BitNumber * 4)) +#endif /* STM32F10X_CL */ + +/* Alias word address of CSSON bit */ +#define CSSON_BitNumber 0x13 +#define CR_CSSON_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (CSSON_BitNumber * 4)) + +/* --- CFGR Register ---*/ + +/* Alias word address of USBPRE bit */ +#define CFGR_OFFSET (RCC_OFFSET + 0x04) + +#ifndef STM32F10X_CL + #define USBPRE_BitNumber 0x16 + #define CFGR_USBPRE_BB (PERIPH_BB_BASE + (CFGR_OFFSET * 32) + (USBPRE_BitNumber * 4)) +#else + #define OTGFSPRE_BitNumber 0x16 + #define CFGR_OTGFSPRE_BB (PERIPH_BB_BASE + (CFGR_OFFSET * 32) + (OTGFSPRE_BitNumber * 4)) +#endif /* STM32F10X_CL */ + +/* --- BDCR Register ---*/ + +/* Alias word address of RTCEN bit */ +#define BDCR_OFFSET (RCC_OFFSET + 0x20) +#define RTCEN_BitNumber 0x0F +#define BDCR_RTCEN_BB (PERIPH_BB_BASE + (BDCR_OFFSET * 32) + (RTCEN_BitNumber * 4)) + +/* Alias word address of BDRST bit */ +#define BDRST_BitNumber 0x10 +#define BDCR_BDRST_BB (PERIPH_BB_BASE + (BDCR_OFFSET * 32) + (BDRST_BitNumber * 4)) + +/* --- CSR Register ---*/ + +/* Alias word address of LSION bit */ +#define CSR_OFFSET (RCC_OFFSET + 0x24) +#define LSION_BitNumber 0x00 +#define CSR_LSION_BB (PERIPH_BB_BASE + (CSR_OFFSET * 32) + (LSION_BitNumber * 4)) + +#ifdef STM32F10X_CL +/* --- CFGR2 Register ---*/ + + /* Alias word address of I2S2SRC bit */ + #define CFGR2_OFFSET (RCC_OFFSET + 0x2C) + #define I2S2SRC_BitNumber 0x11 + #define CFGR2_I2S2SRC_BB (PERIPH_BB_BASE + (CFGR2_OFFSET * 32) + (I2S2SRC_BitNumber * 4)) + + /* Alias word address of I2S3SRC bit */ + #define I2S3SRC_BitNumber 0x12 + #define CFGR2_I2S3SRC_BB (PERIPH_BB_BASE + (CFGR2_OFFSET * 32) + (I2S3SRC_BitNumber * 4)) +#endif /* STM32F10X_CL */ + +/* ---------------------- RCC registers bit mask ------------------------ */ + +/* CR register bit mask */ +#define CR_HSEBYP_Reset ((uint32_t)0xFFFBFFFF) +#define CR_HSEBYP_Set ((uint32_t)0x00040000) +#define CR_HSEON_Reset ((uint32_t)0xFFFEFFFF) +#define CR_HSEON_Set ((uint32_t)0x00010000) +#define CR_HSITRIM_Mask ((uint32_t)0xFFFFFF07) + +/* CFGR register bit mask */ +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) || defined (STM32F10X_CL) + #define CFGR_PLL_Mask ((uint32_t)0xFFC2FFFF) +#else + #define CFGR_PLL_Mask ((uint32_t)0xFFC0FFFF) +#endif /* STM32F10X_CL */ + +#define CFGR_PLLMull_Mask ((uint32_t)0x003C0000) +#define CFGR_PLLSRC_Mask ((uint32_t)0x00010000) +#define CFGR_PLLXTPRE_Mask ((uint32_t)0x00020000) +#define CFGR_SWS_Mask ((uint32_t)0x0000000C) +#define CFGR_SW_Mask ((uint32_t)0xFFFFFFFC) +#define CFGR_HPRE_Reset_Mask ((uint32_t)0xFFFFFF0F) +#define CFGR_HPRE_Set_Mask ((uint32_t)0x000000F0) +#define CFGR_PPRE1_Reset_Mask ((uint32_t)0xFFFFF8FF) +#define CFGR_PPRE1_Set_Mask ((uint32_t)0x00000700) +#define CFGR_PPRE2_Reset_Mask ((uint32_t)0xFFFFC7FF) +#define CFGR_PPRE2_Set_Mask ((uint32_t)0x00003800) +#define CFGR_ADCPRE_Reset_Mask ((uint32_t)0xFFFF3FFF) +#define CFGR_ADCPRE_Set_Mask ((uint32_t)0x0000C000) + +/* CSR register bit mask */ +#define CSR_RMVF_Set ((uint32_t)0x01000000) + +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) || defined (STM32F10X_CL) +/* CFGR2 register bit mask */ + #define CFGR2_PREDIV1SRC ((uint32_t)0x00010000) + #define CFGR2_PREDIV1 ((uint32_t)0x0000000F) +#endif +#ifdef STM32F10X_CL + #define CFGR2_PREDIV2 ((uint32_t)0x000000F0) + #define CFGR2_PLL2MUL ((uint32_t)0x00000F00) + #define CFGR2_PLL3MUL ((uint32_t)0x0000F000) +#endif /* STM32F10X_CL */ + +/* RCC Flag Mask */ +#define FLAG_Mask ((uint8_t)0x1F) + +/* CIR register byte 2 (Bits[15:8]) base address */ +#define CIR_BYTE2_ADDRESS ((uint32_t)0x40021009) + +/* CIR register byte 3 (Bits[23:16]) base address */ +#define CIR_BYTE3_ADDRESS ((uint32_t)0x4002100A) + +/* CFGR register byte 4 (Bits[31:24]) base address */ +#define CFGR_BYTE4_ADDRESS ((uint32_t)0x40021007) + +/* BDCR register base address */ +#define BDCR_ADDRESS (PERIPH_BASE + BDCR_OFFSET) + +/** + * @} + */ + +/** @defgroup RCC_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup RCC_Private_Variables + * @{ + */ + +static __I uint8_t APBAHBPrescTable[16] = {0, 0, 0, 0, 1, 2, 3, 4, 1, 2, 3, 4, 6, 7, 8, 9}; +static __I uint8_t ADCPrescTable[4] = {2, 4, 6, 8}; + +/** + * @} + */ + +/** @defgroup RCC_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup RCC_Private_Functions + * @{ + */ + +/** + * @brief Resets the RCC clock configuration to the default reset state. + * @param None + * @retval None + */ +void RCC_DeInit(void) +{ + /* Set HSION bit */ + RCC->CR |= (uint32_t)0x00000001; + + /* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */ +#ifndef STM32F10X_CL + RCC->CFGR &= (uint32_t)0xF8FF0000; +#else + RCC->CFGR &= (uint32_t)0xF0FF0000; +#endif /* STM32F10X_CL */ + + /* Reset HSEON, CSSON and PLLON bits */ + RCC->CR &= (uint32_t)0xFEF6FFFF; + + /* Reset HSEBYP bit */ + RCC->CR &= (uint32_t)0xFFFBFFFF; + + /* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */ + RCC->CFGR &= (uint32_t)0xFF80FFFF; + +#ifdef STM32F10X_CL + /* Reset PLL2ON and PLL3ON bits */ + RCC->CR &= (uint32_t)0xEBFFFFFF; + + /* Disable all interrupts and clear pending bits */ + RCC->CIR = 0x00FF0000; + + /* Reset CFGR2 register */ + RCC->CFGR2 = 0x00000000; +#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) + /* Disable all interrupts and clear pending bits */ + RCC->CIR = 0x009F0000; + + /* Reset CFGR2 register */ + RCC->CFGR2 = 0x00000000; +#else + /* Disable all interrupts and clear pending bits */ + RCC->CIR = 0x009F0000; +#endif /* STM32F10X_CL */ + +} + +/** + * @brief Configures the External High Speed oscillator (HSE). + * @note HSE can not be stopped if it is used directly or through the PLL as system clock. + * @param RCC_HSE: specifies the new state of the HSE. + * This parameter can be one of the following values: + * @arg RCC_HSE_OFF: HSE oscillator OFF + * @arg RCC_HSE_ON: HSE oscillator ON + * @arg RCC_HSE_Bypass: HSE oscillator bypassed with external clock + * @retval None + */ +void RCC_HSEConfig(uint32_t RCC_HSE) +{ + /* Check the parameters */ + assert_param(IS_RCC_HSE(RCC_HSE)); + /* Reset HSEON and HSEBYP bits before configuring the HSE ------------------*/ + /* Reset HSEON bit */ + RCC->CR &= CR_HSEON_Reset; + /* Reset HSEBYP bit */ + RCC->CR &= CR_HSEBYP_Reset; + /* Configure HSE (RCC_HSE_OFF is already covered by the code section above) */ + switch(RCC_HSE) + { + case RCC_HSE_ON: + /* Set HSEON bit */ + RCC->CR |= CR_HSEON_Set; + break; + + case RCC_HSE_Bypass: + /* Set HSEBYP and HSEON bits */ + RCC->CR |= CR_HSEBYP_Set | CR_HSEON_Set; + break; + + default: + break; + } +} + +/** + * @brief Waits for HSE start-up. + * @param None + * @retval An ErrorStatus enumuration value: + * - SUCCESS: HSE oscillator is stable and ready to use + * - ERROR: HSE oscillator not yet ready + */ +ErrorStatus RCC_WaitForHSEStartUp(void) +{ + __IO uint32_t StartUpCounter = 0; + ErrorStatus status = ERROR; + FlagStatus HSEStatus = RESET; + + /* Wait till HSE is ready and if Time out is reached exit */ + do + { + HSEStatus = RCC_GetFlagStatus(RCC_FLAG_HSERDY); + StartUpCounter++; + } while((StartUpCounter != HSE_STARTUP_TIMEOUT) && (HSEStatus == RESET)); + + if (RCC_GetFlagStatus(RCC_FLAG_HSERDY) != RESET) + { + status = SUCCESS; + } + else + { + status = ERROR; + } + return (status); +} + +/** + * @brief Adjusts the Internal High Speed oscillator (HSI) calibration value. + * @param HSICalibrationValue: specifies the calibration trimming value. + * This parameter must be a number between 0 and 0x1F. + * @retval None + */ +void RCC_AdjustHSICalibrationValue(uint8_t HSICalibrationValue) +{ + uint32_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_RCC_CALIBRATION_VALUE(HSICalibrationValue)); + tmpreg = RCC->CR; + /* Clear HSITRIM[4:0] bits */ + tmpreg &= CR_HSITRIM_Mask; + /* Set the HSITRIM[4:0] bits according to HSICalibrationValue value */ + tmpreg |= (uint32_t)HSICalibrationValue << 3; + /* Store the new value */ + RCC->CR = tmpreg; +} + +/** + * @brief Enables or disables the Internal High Speed oscillator (HSI). + * @note HSI can not be stopped if it is used directly or through the PLL as system clock. + * @param NewState: new state of the HSI. This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_HSICmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + *(__IO uint32_t *) CR_HSION_BB = (uint32_t)NewState; +} + +/** + * @brief Configures the PLL clock source and multiplication factor. + * @note This function must be used only when the PLL is disabled. + * @param RCC_PLLSource: specifies the PLL entry clock source. + * For @b STM32_Connectivity_line_devices or @b STM32_Value_line_devices, + * this parameter can be one of the following values: + * @arg RCC_PLLSource_HSI_Div2: HSI oscillator clock divided by 2 selected as PLL clock entry + * @arg RCC_PLLSource_PREDIV1: PREDIV1 clock selected as PLL clock entry + * For @b other_STM32_devices, this parameter can be one of the following values: + * @arg RCC_PLLSource_HSI_Div2: HSI oscillator clock divided by 2 selected as PLL clock entry + * @arg RCC_PLLSource_HSE_Div1: HSE oscillator clock selected as PLL clock entry + * @arg RCC_PLLSource_HSE_Div2: HSE oscillator clock divided by 2 selected as PLL clock entry + * @param RCC_PLLMul: specifies the PLL multiplication factor. + * For @b STM32_Connectivity_line_devices, this parameter can be RCC_PLLMul_x where x:{[4,9], 6_5} + * For @b other_STM32_devices, this parameter can be RCC_PLLMul_x where x:[2,16] + * @retval None + */ +void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_RCC_PLL_SOURCE(RCC_PLLSource)); + assert_param(IS_RCC_PLL_MUL(RCC_PLLMul)); + + tmpreg = RCC->CFGR; + /* Clear PLLSRC, PLLXTPRE and PLLMUL[3:0] bits */ + tmpreg &= CFGR_PLL_Mask; + /* Set the PLL configuration bits */ + tmpreg |= RCC_PLLSource | RCC_PLLMul; + /* Store the new value */ + RCC->CFGR = tmpreg; +} + +/** + * @brief Enables or disables the PLL. + * @note The PLL can not be disabled if it is used as system clock. + * @param NewState: new state of the PLL. This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_PLLCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) CR_PLLON_BB = (uint32_t)NewState; +} + +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) || defined (STM32F10X_CL) +/** + * @brief Configures the PREDIV1 division factor. + * @note + * - This function must be used only when the PLL is disabled. + * - This function applies only to STM32 Connectivity line and Value line + * devices. + * @param RCC_PREDIV1_Source: specifies the PREDIV1 clock source. + * This parameter can be one of the following values: + * @arg RCC_PREDIV1_Source_HSE: HSE selected as PREDIV1 clock + * @arg RCC_PREDIV1_Source_PLL2: PLL2 selected as PREDIV1 clock + * @note + * For @b STM32_Value_line_devices this parameter is always RCC_PREDIV1_Source_HSE + * @param RCC_PREDIV1_Div: specifies the PREDIV1 clock division factor. + * This parameter can be RCC_PREDIV1_Divx where x:[1,16] + * @retval None + */ +void RCC_PREDIV1Config(uint32_t RCC_PREDIV1_Source, uint32_t RCC_PREDIV1_Div) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_RCC_PREDIV1_SOURCE(RCC_PREDIV1_Source)); + assert_param(IS_RCC_PREDIV1(RCC_PREDIV1_Div)); + + tmpreg = RCC->CFGR2; + /* Clear PREDIV1[3:0] and PREDIV1SRC bits */ + tmpreg &= ~(CFGR2_PREDIV1 | CFGR2_PREDIV1SRC); + /* Set the PREDIV1 clock source and division factor */ + tmpreg |= RCC_PREDIV1_Source | RCC_PREDIV1_Div ; + /* Store the new value */ + RCC->CFGR2 = tmpreg; +} +#endif + +#ifdef STM32F10X_CL +/** + * @brief Configures the PREDIV2 division factor. + * @note + * - This function must be used only when both PLL2 and PLL3 are disabled. + * - This function applies only to STM32 Connectivity line devices. + * @param RCC_PREDIV2_Div: specifies the PREDIV2 clock division factor. + * This parameter can be RCC_PREDIV2_Divx where x:[1,16] + * @retval None + */ +void RCC_PREDIV2Config(uint32_t RCC_PREDIV2_Div) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_RCC_PREDIV2(RCC_PREDIV2_Div)); + + tmpreg = RCC->CFGR2; + /* Clear PREDIV2[3:0] bits */ + tmpreg &= ~CFGR2_PREDIV2; + /* Set the PREDIV2 division factor */ + tmpreg |= RCC_PREDIV2_Div; + /* Store the new value */ + RCC->CFGR2 = tmpreg; +} + +/** + * @brief Configures the PLL2 multiplication factor. + * @note + * - This function must be used only when the PLL2 is disabled. + * - This function applies only to STM32 Connectivity line devices. + * @param RCC_PLL2Mul: specifies the PLL2 multiplication factor. + * This parameter can be RCC_PLL2Mul_x where x:{[8,14], 16, 20} + * @retval None + */ +void RCC_PLL2Config(uint32_t RCC_PLL2Mul) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_RCC_PLL2_MUL(RCC_PLL2Mul)); + + tmpreg = RCC->CFGR2; + /* Clear PLL2Mul[3:0] bits */ + tmpreg &= ~CFGR2_PLL2MUL; + /* Set the PLL2 configuration bits */ + tmpreg |= RCC_PLL2Mul; + /* Store the new value */ + RCC->CFGR2 = tmpreg; +} + + +/** + * @brief Enables or disables the PLL2. + * @note + * - The PLL2 can not be disabled if it is used indirectly as system clock + * (i.e. it is used as PLL clock entry that is used as System clock). + * - This function applies only to STM32 Connectivity line devices. + * @param NewState: new state of the PLL2. This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_PLL2Cmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) CR_PLL2ON_BB = (uint32_t)NewState; +} + + +/** + * @brief Configures the PLL3 multiplication factor. + * @note + * - This function must be used only when the PLL3 is disabled. + * - This function applies only to STM32 Connectivity line devices. + * @param RCC_PLL3Mul: specifies the PLL3 multiplication factor. + * This parameter can be RCC_PLL3Mul_x where x:{[8,14], 16, 20} + * @retval None + */ +void RCC_PLL3Config(uint32_t RCC_PLL3Mul) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_RCC_PLL3_MUL(RCC_PLL3Mul)); + + tmpreg = RCC->CFGR2; + /* Clear PLL3Mul[3:0] bits */ + tmpreg &= ~CFGR2_PLL3MUL; + /* Set the PLL3 configuration bits */ + tmpreg |= RCC_PLL3Mul; + /* Store the new value */ + RCC->CFGR2 = tmpreg; +} + + +/** + * @brief Enables or disables the PLL3. + * @note This function applies only to STM32 Connectivity line devices. + * @param NewState: new state of the PLL3. This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_PLL3Cmd(FunctionalState NewState) +{ + /* Check the parameters */ + + assert_param(IS_FUNCTIONAL_STATE(NewState)); + *(__IO uint32_t *) CR_PLL3ON_BB = (uint32_t)NewState; +} +#endif /* STM32F10X_CL */ + +/** + * @brief Configures the system clock (SYSCLK). + * @param RCC_SYSCLKSource: specifies the clock source used as system clock. + * This parameter can be one of the following values: + * @arg RCC_SYSCLKSource_HSI: HSI selected as system clock + * @arg RCC_SYSCLKSource_HSE: HSE selected as system clock + * @arg RCC_SYSCLKSource_PLLCLK: PLL selected as system clock + * @retval None + */ +void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource) +{ + uint32_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_RCC_SYSCLK_SOURCE(RCC_SYSCLKSource)); + tmpreg = RCC->CFGR; + /* Clear SW[1:0] bits */ + tmpreg &= CFGR_SW_Mask; + /* Set SW[1:0] bits according to RCC_SYSCLKSource value */ + tmpreg |= RCC_SYSCLKSource; + /* Store the new value */ + RCC->CFGR = tmpreg; +} + +/** + * @brief Returns the clock source used as system clock. + * @param None + * @retval The clock source used as system clock. The returned value can + * be one of the following: + * - 0x00: HSI used as system clock + * - 0x04: HSE used as system clock + * - 0x08: PLL used as system clock + */ +uint8_t RCC_GetSYSCLKSource(void) +{ + return ((uint8_t)(RCC->CFGR & CFGR_SWS_Mask)); +} + +/** + * @brief Configures the AHB clock (HCLK). + * @param RCC_SYSCLK: defines the AHB clock divider. This clock is derived from + * the system clock (SYSCLK). + * This parameter can be one of the following values: + * @arg RCC_SYSCLK_Div1: AHB clock = SYSCLK + * @arg RCC_SYSCLK_Div2: AHB clock = SYSCLK/2 + * @arg RCC_SYSCLK_Div4: AHB clock = SYSCLK/4 + * @arg RCC_SYSCLK_Div8: AHB clock = SYSCLK/8 + * @arg RCC_SYSCLK_Div16: AHB clock = SYSCLK/16 + * @arg RCC_SYSCLK_Div64: AHB clock = SYSCLK/64 + * @arg RCC_SYSCLK_Div128: AHB clock = SYSCLK/128 + * @arg RCC_SYSCLK_Div256: AHB clock = SYSCLK/256 + * @arg RCC_SYSCLK_Div512: AHB clock = SYSCLK/512 + * @retval None + */ +void RCC_HCLKConfig(uint32_t RCC_SYSCLK) +{ + uint32_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_RCC_HCLK(RCC_SYSCLK)); + tmpreg = RCC->CFGR; + /* Clear HPRE[3:0] bits */ + tmpreg &= CFGR_HPRE_Reset_Mask; + /* Set HPRE[3:0] bits according to RCC_SYSCLK value */ + tmpreg |= RCC_SYSCLK; + /* Store the new value */ + RCC->CFGR = tmpreg; +} + +/** + * @brief Configures the Low Speed APB clock (PCLK1). + * @param RCC_HCLK: defines the APB1 clock divider. This clock is derived from + * the AHB clock (HCLK). + * This parameter can be one of the following values: + * @arg RCC_HCLK_Div1: APB1 clock = HCLK + * @arg RCC_HCLK_Div2: APB1 clock = HCLK/2 + * @arg RCC_HCLK_Div4: APB1 clock = HCLK/4 + * @arg RCC_HCLK_Div8: APB1 clock = HCLK/8 + * @arg RCC_HCLK_Div16: APB1 clock = HCLK/16 + * @retval None + */ +void RCC_PCLK1Config(uint32_t RCC_HCLK) +{ + uint32_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_RCC_PCLK(RCC_HCLK)); + tmpreg = RCC->CFGR; + /* Clear PPRE1[2:0] bits */ + tmpreg &= CFGR_PPRE1_Reset_Mask; + /* Set PPRE1[2:0] bits according to RCC_HCLK value */ + tmpreg |= RCC_HCLK; + /* Store the new value */ + RCC->CFGR = tmpreg; +} + +/** + * @brief Configures the High Speed APB clock (PCLK2). + * @param RCC_HCLK: defines the APB2 clock divider. This clock is derived from + * the AHB clock (HCLK). + * This parameter can be one of the following values: + * @arg RCC_HCLK_Div1: APB2 clock = HCLK + * @arg RCC_HCLK_Div2: APB2 clock = HCLK/2 + * @arg RCC_HCLK_Div4: APB2 clock = HCLK/4 + * @arg RCC_HCLK_Div8: APB2 clock = HCLK/8 + * @arg RCC_HCLK_Div16: APB2 clock = HCLK/16 + * @retval None + */ +void RCC_PCLK2Config(uint32_t RCC_HCLK) +{ + uint32_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_RCC_PCLK(RCC_HCLK)); + tmpreg = RCC->CFGR; + /* Clear PPRE2[2:0] bits */ + tmpreg &= CFGR_PPRE2_Reset_Mask; + /* Set PPRE2[2:0] bits according to RCC_HCLK value */ + tmpreg |= RCC_HCLK << 3; + /* Store the new value */ + RCC->CFGR = tmpreg; +} + +/** + * @brief Enables or disables the specified RCC interrupts. + * @param RCC_IT: specifies the RCC interrupt sources to be enabled or disabled. + * + * For @b STM32_Connectivity_line_devices, this parameter can be any combination + * of the following values + * @arg RCC_IT_LSIRDY: LSI ready interrupt + * @arg RCC_IT_LSERDY: LSE ready interrupt + * @arg RCC_IT_HSIRDY: HSI ready interrupt + * @arg RCC_IT_HSERDY: HSE ready interrupt + * @arg RCC_IT_PLLRDY: PLL ready interrupt + * @arg RCC_IT_PLL2RDY: PLL2 ready interrupt + * @arg RCC_IT_PLL3RDY: PLL3 ready interrupt + * + * For @b other_STM32_devices, this parameter can be any combination of the + * following values + * @arg RCC_IT_LSIRDY: LSI ready interrupt + * @arg RCC_IT_LSERDY: LSE ready interrupt + * @arg RCC_IT_HSIRDY: HSI ready interrupt + * @arg RCC_IT_HSERDY: HSE ready interrupt + * @arg RCC_IT_PLLRDY: PLL ready interrupt + * + * @param NewState: new state of the specified RCC interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_ITConfig(uint8_t RCC_IT, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_RCC_IT(RCC_IT)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Perform Byte access to RCC_CIR bits to enable the selected interrupts */ + *(__IO uint8_t *) CIR_BYTE2_ADDRESS |= RCC_IT; + } + else + { + /* Perform Byte access to RCC_CIR bits to disable the selected interrupts */ + *(__IO uint8_t *) CIR_BYTE2_ADDRESS &= (uint8_t)~RCC_IT; + } +} + +#ifndef STM32F10X_CL +/** + * @brief Configures the USB clock (USBCLK). + * @param RCC_USBCLKSource: specifies the USB clock source. This clock is + * derived from the PLL output. + * This parameter can be one of the following values: + * @arg RCC_USBCLKSource_PLLCLK_1Div5: PLL clock divided by 1,5 selected as USB + * clock source + * @arg RCC_USBCLKSource_PLLCLK_Div1: PLL clock selected as USB clock source + * @retval None + */ +void RCC_USBCLKConfig(uint32_t RCC_USBCLKSource) +{ + /* Check the parameters */ + assert_param(IS_RCC_USBCLK_SOURCE(RCC_USBCLKSource)); + + *(__IO uint32_t *) CFGR_USBPRE_BB = RCC_USBCLKSource; +} +#else +/** + * @brief Configures the USB OTG FS clock (OTGFSCLK). + * This function applies only to STM32 Connectivity line devices. + * @param RCC_OTGFSCLKSource: specifies the USB OTG FS clock source. + * This clock is derived from the PLL output. + * This parameter can be one of the following values: + * @arg RCC_OTGFSCLKSource_PLLVCO_Div3: PLL VCO clock divided by 2 selected as USB OTG FS clock source + * @arg RCC_OTGFSCLKSource_PLLVCO_Div2: PLL VCO clock divided by 2 selected as USB OTG FS clock source + * @retval None + */ +void RCC_OTGFSCLKConfig(uint32_t RCC_OTGFSCLKSource) +{ + /* Check the parameters */ + assert_param(IS_RCC_OTGFSCLK_SOURCE(RCC_OTGFSCLKSource)); + + *(__IO uint32_t *) CFGR_OTGFSPRE_BB = RCC_OTGFSCLKSource; +} +#endif /* STM32F10X_CL */ + +/** + * @brief Configures the ADC clock (ADCCLK). + * @param RCC_PCLK2: defines the ADC clock divider. This clock is derived from + * the APB2 clock (PCLK2). + * This parameter can be one of the following values: + * @arg RCC_PCLK2_Div2: ADC clock = PCLK2/2 + * @arg RCC_PCLK2_Div4: ADC clock = PCLK2/4 + * @arg RCC_PCLK2_Div6: ADC clock = PCLK2/6 + * @arg RCC_PCLK2_Div8: ADC clock = PCLK2/8 + * @retval None + */ +void RCC_ADCCLKConfig(uint32_t RCC_PCLK2) +{ + uint32_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_RCC_ADCCLK(RCC_PCLK2)); + tmpreg = RCC->CFGR; + /* Clear ADCPRE[1:0] bits */ + tmpreg &= CFGR_ADCPRE_Reset_Mask; + /* Set ADCPRE[1:0] bits according to RCC_PCLK2 value */ + tmpreg |= RCC_PCLK2; + /* Store the new value */ + RCC->CFGR = tmpreg; +} + +#ifdef STM32F10X_CL +/** + * @brief Configures the I2S2 clock source(I2S2CLK). + * @note + * - This function must be called before enabling I2S2 APB clock. + * - This function applies only to STM32 Connectivity line devices. + * @param RCC_I2S2CLKSource: specifies the I2S2 clock source. + * This parameter can be one of the following values: + * @arg RCC_I2S2CLKSource_SYSCLK: system clock selected as I2S2 clock entry + * @arg RCC_I2S2CLKSource_PLL3_VCO: PLL3 VCO clock selected as I2S2 clock entry + * @retval None + */ +void RCC_I2S2CLKConfig(uint32_t RCC_I2S2CLKSource) +{ + /* Check the parameters */ + assert_param(IS_RCC_I2S2CLK_SOURCE(RCC_I2S2CLKSource)); + + *(__IO uint32_t *) CFGR2_I2S2SRC_BB = RCC_I2S2CLKSource; +} + +/** + * @brief Configures the I2S3 clock source(I2S2CLK). + * @note + * - This function must be called before enabling I2S3 APB clock. + * - This function applies only to STM32 Connectivity line devices. + * @param RCC_I2S3CLKSource: specifies the I2S3 clock source. + * This parameter can be one of the following values: + * @arg RCC_I2S3CLKSource_SYSCLK: system clock selected as I2S3 clock entry + * @arg RCC_I2S3CLKSource_PLL3_VCO: PLL3 VCO clock selected as I2S3 clock entry + * @retval None + */ +void RCC_I2S3CLKConfig(uint32_t RCC_I2S3CLKSource) +{ + /* Check the parameters */ + assert_param(IS_RCC_I2S3CLK_SOURCE(RCC_I2S3CLKSource)); + + *(__IO uint32_t *) CFGR2_I2S3SRC_BB = RCC_I2S3CLKSource; +} +#endif /* STM32F10X_CL */ + +/** + * @brief Configures the External Low Speed oscillator (LSE). + * @param RCC_LSE: specifies the new state of the LSE. + * This parameter can be one of the following values: + * @arg RCC_LSE_OFF: LSE oscillator OFF + * @arg RCC_LSE_ON: LSE oscillator ON + * @arg RCC_LSE_Bypass: LSE oscillator bypassed with external clock + * @retval None + */ +void RCC_LSEConfig(uint8_t RCC_LSE) +{ + /* Check the parameters */ + assert_param(IS_RCC_LSE(RCC_LSE)); + /* Reset LSEON and LSEBYP bits before configuring the LSE ------------------*/ + /* Reset LSEON bit */ + *(__IO uint8_t *) BDCR_ADDRESS = RCC_LSE_OFF; + /* Reset LSEBYP bit */ + *(__IO uint8_t *) BDCR_ADDRESS = RCC_LSE_OFF; + /* Configure LSE (RCC_LSE_OFF is already covered by the code section above) */ + switch(RCC_LSE) + { + case RCC_LSE_ON: + /* Set LSEON bit */ + *(__IO uint8_t *) BDCR_ADDRESS = RCC_LSE_ON; + break; + + case RCC_LSE_Bypass: + /* Set LSEBYP and LSEON bits */ + *(__IO uint8_t *) BDCR_ADDRESS = RCC_LSE_Bypass | RCC_LSE_ON; + break; + + default: + break; + } +} + +/** + * @brief Enables or disables the Internal Low Speed oscillator (LSI). + * @note LSI can not be disabled if the IWDG is running. + * @param NewState: new state of the LSI. This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_LSICmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + *(__IO uint32_t *) CSR_LSION_BB = (uint32_t)NewState; +} + +/** + * @brief Configures the RTC clock (RTCCLK). + * @note Once the RTC clock is selected it can't be changed unless the Backup domain is reset. + * @param RCC_RTCCLKSource: specifies the RTC clock source. + * This parameter can be one of the following values: + * @arg RCC_RTCCLKSource_LSE: LSE selected as RTC clock + * @arg RCC_RTCCLKSource_LSI: LSI selected as RTC clock + * @arg RCC_RTCCLKSource_HSE_Div128: HSE clock divided by 128 selected as RTC clock + * @retval None + */ +void RCC_RTCCLKConfig(uint32_t RCC_RTCCLKSource) +{ + /* Check the parameters */ + assert_param(IS_RCC_RTCCLK_SOURCE(RCC_RTCCLKSource)); + /* Select the RTC clock source */ + RCC->BDCR |= RCC_RTCCLKSource; +} + +/** + * @brief Enables or disables the RTC clock. + * @note This function must be used only after the RTC clock was selected using the RCC_RTCCLKConfig function. + * @param NewState: new state of the RTC clock. This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_RTCCLKCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + *(__IO uint32_t *) BDCR_RTCEN_BB = (uint32_t)NewState; +} + +/** + * @brief Returns the frequencies of different on chip clocks. + * @param RCC_Clocks: pointer to a RCC_ClocksTypeDef structure which will hold + * the clocks frequencies. + * @note The result of this function could be not correct when using + * fractional value for HSE crystal. + * @retval None + */ +void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks) +{ + uint32_t tmp = 0, pllmull = 0, pllsource = 0, presc = 0; + +#ifdef STM32F10X_CL + uint32_t prediv1source = 0, prediv1factor = 0, prediv2factor = 0, pll2mull = 0; +#endif /* STM32F10X_CL */ + +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) + uint32_t prediv1factor = 0; +#endif + + /* Get SYSCLK source -------------------------------------------------------*/ + tmp = RCC->CFGR & CFGR_SWS_Mask; + + switch (tmp) + { + case 0x00: /* HSI used as system clock */ + RCC_Clocks->SYSCLK_Frequency = HSI_VALUE; + break; + case 0x04: /* HSE used as system clock */ + RCC_Clocks->SYSCLK_Frequency = HSE_VALUE; + break; + case 0x08: /* PLL used as system clock */ + + /* Get PLL clock source and multiplication factor ----------------------*/ + pllmull = RCC->CFGR & CFGR_PLLMull_Mask; + pllsource = RCC->CFGR & CFGR_PLLSRC_Mask; + +#ifndef STM32F10X_CL + pllmull = ( pllmull >> 18) + 2; + + if (pllsource == 0x00) + {/* HSI oscillator clock divided by 2 selected as PLL clock entry */ + RCC_Clocks->SYSCLK_Frequency = (HSI_VALUE >> 1) * pllmull; + } + else + { + #if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) + prediv1factor = (RCC->CFGR2 & CFGR2_PREDIV1) + 1; + /* HSE oscillator clock selected as PREDIV1 clock entry */ + RCC_Clocks->SYSCLK_Frequency = (HSE_VALUE / prediv1factor) * pllmull; + #else + /* HSE selected as PLL clock entry */ + if ((RCC->CFGR & CFGR_PLLXTPRE_Mask) != (uint32_t)RESET) + {/* HSE oscillator clock divided by 2 */ + RCC_Clocks->SYSCLK_Frequency = (HSE_VALUE >> 1) * pllmull; + } + else + { + RCC_Clocks->SYSCLK_Frequency = HSE_VALUE * pllmull; + } + #endif + } +#else + pllmull = pllmull >> 18; + + if (pllmull != 0x0D) + { + pllmull += 2; + } + else + { /* PLL multiplication factor = PLL input clock * 6.5 */ + pllmull = 13 / 2; + } + + if (pllsource == 0x00) + {/* HSI oscillator clock divided by 2 selected as PLL clock entry */ + RCC_Clocks->SYSCLK_Frequency = (HSI_VALUE >> 1) * pllmull; + } + else + {/* PREDIV1 selected as PLL clock entry */ + + /* Get PREDIV1 clock source and division factor */ + prediv1source = RCC->CFGR2 & CFGR2_PREDIV1SRC; + prediv1factor = (RCC->CFGR2 & CFGR2_PREDIV1) + 1; + + if (prediv1source == 0) + { /* HSE oscillator clock selected as PREDIV1 clock entry */ + RCC_Clocks->SYSCLK_Frequency = (HSE_VALUE / prediv1factor) * pllmull; + } + else + {/* PLL2 clock selected as PREDIV1 clock entry */ + + /* Get PREDIV2 division factor and PLL2 multiplication factor */ + prediv2factor = ((RCC->CFGR2 & CFGR2_PREDIV2) >> 4) + 1; + pll2mull = ((RCC->CFGR2 & CFGR2_PLL2MUL) >> 8 ) + 2; + RCC_Clocks->SYSCLK_Frequency = (((HSE_VALUE / prediv2factor) * pll2mull) / prediv1factor) * pllmull; + } + } +#endif /* STM32F10X_CL */ + break; + + default: + RCC_Clocks->SYSCLK_Frequency = HSI_VALUE; + break; + } + + /* Compute HCLK, PCLK1, PCLK2 and ADCCLK clocks frequencies ----------------*/ + /* Get HCLK prescaler */ + tmp = RCC->CFGR & CFGR_HPRE_Set_Mask; + tmp = tmp >> 4; + presc = APBAHBPrescTable[tmp]; + /* HCLK clock frequency */ + RCC_Clocks->HCLK_Frequency = RCC_Clocks->SYSCLK_Frequency >> presc; + /* Get PCLK1 prescaler */ + tmp = RCC->CFGR & CFGR_PPRE1_Set_Mask; + tmp = tmp >> 8; + presc = APBAHBPrescTable[tmp]; + /* PCLK1 clock frequency */ + RCC_Clocks->PCLK1_Frequency = RCC_Clocks->HCLK_Frequency >> presc; + /* Get PCLK2 prescaler */ + tmp = RCC->CFGR & CFGR_PPRE2_Set_Mask; + tmp = tmp >> 11; + presc = APBAHBPrescTable[tmp]; + /* PCLK2 clock frequency */ + RCC_Clocks->PCLK2_Frequency = RCC_Clocks->HCLK_Frequency >> presc; + /* Get ADCCLK prescaler */ + tmp = RCC->CFGR & CFGR_ADCPRE_Set_Mask; + tmp = tmp >> 14; + presc = ADCPrescTable[tmp]; + /* ADCCLK clock frequency */ + RCC_Clocks->ADCCLK_Frequency = RCC_Clocks->PCLK2_Frequency / presc; +} + +/** + * @brief Enables or disables the AHB peripheral clock. + * @param RCC_AHBPeriph: specifies the AHB peripheral to gates its clock. + * + * For @b STM32_Connectivity_line_devices, this parameter can be any combination + * of the following values: + * @arg RCC_AHBPeriph_DMA1 + * @arg RCC_AHBPeriph_DMA2 + * @arg RCC_AHBPeriph_SRAM + * @arg RCC_AHBPeriph_FLITF + * @arg RCC_AHBPeriph_CRC + * @arg RCC_AHBPeriph_OTG_FS + * @arg RCC_AHBPeriph_ETH_MAC + * @arg RCC_AHBPeriph_ETH_MAC_Tx + * @arg RCC_AHBPeriph_ETH_MAC_Rx + * + * For @b other_STM32_devices, this parameter can be any combination of the + * following values: + * @arg RCC_AHBPeriph_DMA1 + * @arg RCC_AHBPeriph_DMA2 + * @arg RCC_AHBPeriph_SRAM + * @arg RCC_AHBPeriph_FLITF + * @arg RCC_AHBPeriph_CRC + * @arg RCC_AHBPeriph_FSMC + * @arg RCC_AHBPeriph_SDIO + * + * @note SRAM and FLITF clock can be disabled only during sleep mode. + * @param NewState: new state of the specified peripheral clock. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_RCC_AHB_PERIPH(RCC_AHBPeriph)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + RCC->AHBENR |= RCC_AHBPeriph; + } + else + { + RCC->AHBENR &= ~RCC_AHBPeriph; + } +} + +/** + * @brief Enables or disables the High Speed APB (APB2) peripheral clock. + * @param RCC_APB2Periph: specifies the APB2 peripheral to gates its clock. + * This parameter can be any combination of the following values: + * @arg RCC_APB2Periph_AFIO, RCC_APB2Periph_GPIOA, RCC_APB2Periph_GPIOB, + * RCC_APB2Periph_GPIOC, RCC_APB2Periph_GPIOD, RCC_APB2Periph_GPIOE, + * RCC_APB2Periph_GPIOF, RCC_APB2Periph_GPIOG, RCC_APB2Periph_ADC1, + * RCC_APB2Periph_ADC2, RCC_APB2Periph_TIM1, RCC_APB2Periph_SPI1, + * RCC_APB2Periph_TIM8, RCC_APB2Periph_USART1, RCC_APB2Periph_ADC3, + * RCC_APB2Periph_TIM15, RCC_APB2Periph_TIM16, RCC_APB2Periph_TIM17, + * RCC_APB2Periph_TIM9, RCC_APB2Periph_TIM10, RCC_APB2Periph_TIM11 + * @param NewState: new state of the specified peripheral clock. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + RCC->APB2ENR |= RCC_APB2Periph; + } + else + { + RCC->APB2ENR &= ~RCC_APB2Periph; + } +} + +/** + * @brief Enables or disables the Low Speed APB (APB1) peripheral clock. + * @param RCC_APB1Periph: specifies the APB1 peripheral to gates its clock. + * This parameter can be any combination of the following values: + * @arg RCC_APB1Periph_TIM2, RCC_APB1Periph_TIM3, RCC_APB1Periph_TIM4, + * RCC_APB1Periph_TIM5, RCC_APB1Periph_TIM6, RCC_APB1Periph_TIM7, + * RCC_APB1Periph_WWDG, RCC_APB1Periph_SPI2, RCC_APB1Periph_SPI3, + * RCC_APB1Periph_USART2, RCC_APB1Periph_USART3, RCC_APB1Periph_USART4, + * RCC_APB1Periph_USART5, RCC_APB1Periph_I2C1, RCC_APB1Periph_I2C2, + * RCC_APB1Periph_USB, RCC_APB1Periph_CAN1, RCC_APB1Periph_BKP, + * RCC_APB1Periph_PWR, RCC_APB1Periph_DAC, RCC_APB1Periph_CEC, + * RCC_APB1Periph_TIM12, RCC_APB1Periph_TIM13, RCC_APB1Periph_TIM14 + * @param NewState: new state of the specified peripheral clock. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_RCC_APB1_PERIPH(RCC_APB1Periph)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + RCC->APB1ENR |= RCC_APB1Periph; + } + else + { + RCC->APB1ENR &= ~RCC_APB1Periph; + } +} + +#ifdef STM32F10X_CL +/** + * @brief Forces or releases AHB peripheral reset. + * @note This function applies only to STM32 Connectivity line devices. + * @param RCC_AHBPeriph: specifies the AHB peripheral to reset. + * This parameter can be any combination of the following values: + * @arg RCC_AHBPeriph_OTG_FS + * @arg RCC_AHBPeriph_ETH_MAC + * @param NewState: new state of the specified peripheral reset. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_AHBPeriphResetCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_RCC_AHB_PERIPH_RESET(RCC_AHBPeriph)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + RCC->AHBRSTR |= RCC_AHBPeriph; + } + else + { + RCC->AHBRSTR &= ~RCC_AHBPeriph; + } +} +#endif /* STM32F10X_CL */ + +/** + * @brief Forces or releases High Speed APB (APB2) peripheral reset. + * @param RCC_APB2Periph: specifies the APB2 peripheral to reset. + * This parameter can be any combination of the following values: + * @arg RCC_APB2Periph_AFIO, RCC_APB2Periph_GPIOA, RCC_APB2Periph_GPIOB, + * RCC_APB2Periph_GPIOC, RCC_APB2Periph_GPIOD, RCC_APB2Periph_GPIOE, + * RCC_APB2Periph_GPIOF, RCC_APB2Periph_GPIOG, RCC_APB2Periph_ADC1, + * RCC_APB2Periph_ADC2, RCC_APB2Periph_TIM1, RCC_APB2Periph_SPI1, + * RCC_APB2Periph_TIM8, RCC_APB2Periph_USART1, RCC_APB2Periph_ADC3, + * RCC_APB2Periph_TIM15, RCC_APB2Periph_TIM16, RCC_APB2Periph_TIM17, + * RCC_APB2Periph_TIM9, RCC_APB2Periph_TIM10, RCC_APB2Periph_TIM11 + * @param NewState: new state of the specified peripheral reset. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + RCC->APB2RSTR |= RCC_APB2Periph; + } + else + { + RCC->APB2RSTR &= ~RCC_APB2Periph; + } +} + +/** + * @brief Forces or releases Low Speed APB (APB1) peripheral reset. + * @param RCC_APB1Periph: specifies the APB1 peripheral to reset. + * This parameter can be any combination of the following values: + * @arg RCC_APB1Periph_TIM2, RCC_APB1Periph_TIM3, RCC_APB1Periph_TIM4, + * RCC_APB1Periph_TIM5, RCC_APB1Periph_TIM6, RCC_APB1Periph_TIM7, + * RCC_APB1Periph_WWDG, RCC_APB1Periph_SPI2, RCC_APB1Periph_SPI3, + * RCC_APB1Periph_USART2, RCC_APB1Periph_USART3, RCC_APB1Periph_USART4, + * RCC_APB1Periph_USART5, RCC_APB1Periph_I2C1, RCC_APB1Periph_I2C2, + * RCC_APB1Periph_USB, RCC_APB1Periph_CAN1, RCC_APB1Periph_BKP, + * RCC_APB1Periph_PWR, RCC_APB1Periph_DAC, RCC_APB1Periph_CEC, + * RCC_APB1Periph_TIM12, RCC_APB1Periph_TIM13, RCC_APB1Periph_TIM14 + * @param NewState: new state of the specified peripheral clock. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_RCC_APB1_PERIPH(RCC_APB1Periph)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + RCC->APB1RSTR |= RCC_APB1Periph; + } + else + { + RCC->APB1RSTR &= ~RCC_APB1Periph; + } +} + +/** + * @brief Forces or releases the Backup domain reset. + * @param NewState: new state of the Backup domain reset. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_BackupResetCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + *(__IO uint32_t *) BDCR_BDRST_BB = (uint32_t)NewState; +} + +/** + * @brief Enables or disables the Clock Security System. + * @param NewState: new state of the Clock Security System.. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_ClockSecuritySystemCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + *(__IO uint32_t *) CR_CSSON_BB = (uint32_t)NewState; +} + +/** + * @brief Selects the clock source to output on MCO pin. + * @param RCC_MCO: specifies the clock source to output. + * + * For @b STM32_Connectivity_line_devices, this parameter can be one of the + * following values: + * @arg RCC_MCO_NoClock: No clock selected + * @arg RCC_MCO_SYSCLK: System clock selected + * @arg RCC_MCO_HSI: HSI oscillator clock selected + * @arg RCC_MCO_HSE: HSE oscillator clock selected + * @arg RCC_MCO_PLLCLK_Div2: PLL clock divided by 2 selected + * @arg RCC_MCO_PLL2CLK: PLL2 clock selected + * @arg RCC_MCO_PLL3CLK_Div2: PLL3 clock divided by 2 selected + * @arg RCC_MCO_XT1: External 3-25 MHz oscillator clock selected + * @arg RCC_MCO_PLL3CLK: PLL3 clock selected + * + * For @b other_STM32_devices, this parameter can be one of the following values: + * @arg RCC_MCO_NoClock: No clock selected + * @arg RCC_MCO_SYSCLK: System clock selected + * @arg RCC_MCO_HSI: HSI oscillator clock selected + * @arg RCC_MCO_HSE: HSE oscillator clock selected + * @arg RCC_MCO_PLLCLK_Div2: PLL clock divided by 2 selected + * + * @retval None + */ +void RCC_MCOConfig(uint8_t RCC_MCO) +{ + /* Check the parameters */ + assert_param(IS_RCC_MCO(RCC_MCO)); + + /* Perform Byte access to MCO bits to select the MCO source */ + *(__IO uint8_t *) CFGR_BYTE4_ADDRESS = RCC_MCO; +} + +/** + * @brief Checks whether the specified RCC flag is set or not. + * @param RCC_FLAG: specifies the flag to check. + * + * For @b STM32_Connectivity_line_devices, this parameter can be one of the + * following values: + * @arg RCC_FLAG_HSIRDY: HSI oscillator clock ready + * @arg RCC_FLAG_HSERDY: HSE oscillator clock ready + * @arg RCC_FLAG_PLLRDY: PLL clock ready + * @arg RCC_FLAG_PLL2RDY: PLL2 clock ready + * @arg RCC_FLAG_PLL3RDY: PLL3 clock ready + * @arg RCC_FLAG_LSERDY: LSE oscillator clock ready + * @arg RCC_FLAG_LSIRDY: LSI oscillator clock ready + * @arg RCC_FLAG_PINRST: Pin reset + * @arg RCC_FLAG_PORRST: POR/PDR reset + * @arg RCC_FLAG_SFTRST: Software reset + * @arg RCC_FLAG_IWDGRST: Independent Watchdog reset + * @arg RCC_FLAG_WWDGRST: Window Watchdog reset + * @arg RCC_FLAG_LPWRRST: Low Power reset + * + * For @b other_STM32_devices, this parameter can be one of the following values: + * @arg RCC_FLAG_HSIRDY: HSI oscillator clock ready + * @arg RCC_FLAG_HSERDY: HSE oscillator clock ready + * @arg RCC_FLAG_PLLRDY: PLL clock ready + * @arg RCC_FLAG_LSERDY: LSE oscillator clock ready + * @arg RCC_FLAG_LSIRDY: LSI oscillator clock ready + * @arg RCC_FLAG_PINRST: Pin reset + * @arg RCC_FLAG_PORRST: POR/PDR reset + * @arg RCC_FLAG_SFTRST: Software reset + * @arg RCC_FLAG_IWDGRST: Independent Watchdog reset + * @arg RCC_FLAG_WWDGRST: Window Watchdog reset + * @arg RCC_FLAG_LPWRRST: Low Power reset + * + * @retval The new state of RCC_FLAG (SET or RESET). + */ +FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG) +{ + uint32_t tmp = 0; + uint32_t statusreg = 0; + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_RCC_FLAG(RCC_FLAG)); + + /* Get the RCC register index */ + tmp = RCC_FLAG >> 5; + if (tmp == 1) /* The flag to check is in CR register */ + { + statusreg = RCC->CR; + } + else if (tmp == 2) /* The flag to check is in BDCR register */ + { + statusreg = RCC->BDCR; + } + else /* The flag to check is in CSR register */ + { + statusreg = RCC->CSR; + } + + /* Get the flag position */ + tmp = RCC_FLAG & FLAG_Mask; + if ((statusreg & ((uint32_t)1 << tmp)) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + /* Return the flag status */ + return bitstatus; +} + +/** + * @brief Clears the RCC reset flags. + * @note The reset flags are: RCC_FLAG_PINRST, RCC_FLAG_PORRST, RCC_FLAG_SFTRST, + * RCC_FLAG_IWDGRST, RCC_FLAG_WWDGRST, RCC_FLAG_LPWRRST + * @param None + * @retval None + */ +void RCC_ClearFlag(void) +{ + /* Set RMVF bit to clear the reset flags */ + RCC->CSR |= CSR_RMVF_Set; +} + +/** + * @brief Checks whether the specified RCC interrupt has occurred or not. + * @param RCC_IT: specifies the RCC interrupt source to check. + * + * For @b STM32_Connectivity_line_devices, this parameter can be one of the + * following values: + * @arg RCC_IT_LSIRDY: LSI ready interrupt + * @arg RCC_IT_LSERDY: LSE ready interrupt + * @arg RCC_IT_HSIRDY: HSI ready interrupt + * @arg RCC_IT_HSERDY: HSE ready interrupt + * @arg RCC_IT_PLLRDY: PLL ready interrupt + * @arg RCC_IT_PLL2RDY: PLL2 ready interrupt + * @arg RCC_IT_PLL3RDY: PLL3 ready interrupt + * @arg RCC_IT_CSS: Clock Security System interrupt + * + * For @b other_STM32_devices, this parameter can be one of the following values: + * @arg RCC_IT_LSIRDY: LSI ready interrupt + * @arg RCC_IT_LSERDY: LSE ready interrupt + * @arg RCC_IT_HSIRDY: HSI ready interrupt + * @arg RCC_IT_HSERDY: HSE ready interrupt + * @arg RCC_IT_PLLRDY: PLL ready interrupt + * @arg RCC_IT_CSS: Clock Security System interrupt + * + * @retval The new state of RCC_IT (SET or RESET). + */ +ITStatus RCC_GetITStatus(uint8_t RCC_IT) +{ + ITStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_RCC_GET_IT(RCC_IT)); + + /* Check the status of the specified RCC interrupt */ + if ((RCC->CIR & RCC_IT) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + /* Return the RCC_IT status */ + return bitstatus; +} + +/** + * @brief Clears the RCC's interrupt pending bits. + * @param RCC_IT: specifies the interrupt pending bit to clear. + * + * For @b STM32_Connectivity_line_devices, this parameter can be any combination + * of the following values: + * @arg RCC_IT_LSIRDY: LSI ready interrupt + * @arg RCC_IT_LSERDY: LSE ready interrupt + * @arg RCC_IT_HSIRDY: HSI ready interrupt + * @arg RCC_IT_HSERDY: HSE ready interrupt + * @arg RCC_IT_PLLRDY: PLL ready interrupt + * @arg RCC_IT_PLL2RDY: PLL2 ready interrupt + * @arg RCC_IT_PLL3RDY: PLL3 ready interrupt + * @arg RCC_IT_CSS: Clock Security System interrupt + * + * For @b other_STM32_devices, this parameter can be any combination of the + * following values: + * @arg RCC_IT_LSIRDY: LSI ready interrupt + * @arg RCC_IT_LSERDY: LSE ready interrupt + * @arg RCC_IT_HSIRDY: HSI ready interrupt + * @arg RCC_IT_HSERDY: HSE ready interrupt + * @arg RCC_IT_PLLRDY: PLL ready interrupt + * + * @arg RCC_IT_CSS: Clock Security System interrupt + * @retval None + */ +void RCC_ClearITPendingBit(uint8_t RCC_IT) +{ + /* Check the parameters */ + assert_param(IS_RCC_CLEAR_IT(RCC_IT)); + + /* Perform Byte access to RCC_CIR[23:16] bits to clear the selected interrupt + pending bits */ + *(__IO uint8_t *) CIR_BYTE3_ADDRESS = RCC_IT; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_rtc.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_rtc.c new file mode 100644 index 0000000..f798d2b --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_rtc.c @@ -0,0 +1,339 @@ +/** + ****************************************************************************** + * @file stm32f10x_rtc.c + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief This file provides all the RTC firmware functions. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_rtc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup RTC + * @brief RTC driver modules + * @{ + */ + +/** @defgroup RTC_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ + +/** @defgroup RTC_Private_Defines + * @{ + */ +#define RTC_LSB_MASK ((uint32_t)0x0000FFFF) /*!< RTC LSB Mask */ +#define PRLH_MSB_MASK ((uint32_t)0x000F0000) /*!< RTC Prescaler MSB Mask */ + +/** + * @} + */ + +/** @defgroup RTC_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup RTC_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup RTC_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup RTC_Private_Functions + * @{ + */ + +/** + * @brief Enables or disables the specified RTC interrupts. + * @param RTC_IT: specifies the RTC interrupts sources to be enabled or disabled. + * This parameter can be any combination of the following values: + * @arg RTC_IT_OW: Overflow interrupt + * @arg RTC_IT_ALR: Alarm interrupt + * @arg RTC_IT_SEC: Second interrupt + * @param NewState: new state of the specified RTC interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RTC_ITConfig(uint16_t RTC_IT, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_RTC_IT(RTC_IT)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + RTC->CRH |= RTC_IT; + } + else + { + RTC->CRH &= (uint16_t)~RTC_IT; + } +} + +/** + * @brief Enters the RTC configuration mode. + * @param None + * @retval None + */ +void RTC_EnterConfigMode(void) +{ + /* Set the CNF flag to enter in the Configuration Mode */ + RTC->CRL |= RTC_CRL_CNF; +} + +/** + * @brief Exits from the RTC configuration mode. + * @param None + * @retval None + */ +void RTC_ExitConfigMode(void) +{ + /* Reset the CNF flag to exit from the Configuration Mode */ + RTC->CRL &= (uint16_t)~((uint16_t)RTC_CRL_CNF); +} + +/** + * @brief Gets the RTC counter value. + * @param None + * @retval RTC counter value. + */ +uint32_t RTC_GetCounter(void) +{ + uint16_t tmp = 0; + tmp = RTC->CNTL; + return (((uint32_t)RTC->CNTH << 16 ) | tmp) ; +} + +/** + * @brief Sets the RTC counter value. + * @param CounterValue: RTC counter new value. + * @retval None + */ +void RTC_SetCounter(uint32_t CounterValue) +{ + RTC_EnterConfigMode(); + /* Set RTC COUNTER MSB word */ + RTC->CNTH = CounterValue >> 16; + /* Set RTC COUNTER LSB word */ + RTC->CNTL = (CounterValue & RTC_LSB_MASK); + RTC_ExitConfigMode(); +} + +/** + * @brief Sets the RTC prescaler value. + * @param PrescalerValue: RTC prescaler new value. + * @retval None + */ +void RTC_SetPrescaler(uint32_t PrescalerValue) +{ + /* Check the parameters */ + assert_param(IS_RTC_PRESCALER(PrescalerValue)); + + RTC_EnterConfigMode(); + /* Set RTC PRESCALER MSB word */ + RTC->PRLH = (PrescalerValue & PRLH_MSB_MASK) >> 16; + /* Set RTC PRESCALER LSB word */ + RTC->PRLL = (PrescalerValue & RTC_LSB_MASK); + RTC_ExitConfigMode(); +} + +/** + * @brief Sets the RTC alarm value. + * @param AlarmValue: RTC alarm new value. + * @retval None + */ +void RTC_SetAlarm(uint32_t AlarmValue) +{ + RTC_EnterConfigMode(); + /* Set the ALARM MSB word */ + RTC->ALRH = AlarmValue >> 16; + /* Set the ALARM LSB word */ + RTC->ALRL = (AlarmValue & RTC_LSB_MASK); + RTC_ExitConfigMode(); +} + +/** + * @brief Gets the RTC divider value. + * @param None + * @retval RTC Divider value. + */ +uint32_t RTC_GetDivider(void) +{ + uint32_t tmp = 0x00; + tmp = ((uint32_t)RTC->DIVH & (uint32_t)0x000F) << 16; + tmp |= RTC->DIVL; + return tmp; +} + +/** + * @brief Waits until last write operation on RTC registers has finished. + * @note This function must be called before any write to RTC registers. + * @param None + * @retval None + */ +void RTC_WaitForLastTask(void) +{ + /* Loop until RTOFF flag is set */ + while ((RTC->CRL & RTC_FLAG_RTOFF) == (uint16_t)RESET) + { + } +} + +/** + * @brief Waits until the RTC registers (RTC_CNT, RTC_ALR and RTC_PRL) + * are synchronized with RTC APB clock. + * @note This function must be called before any read operation after an APB reset + * or an APB clock stop. + * @param None + * @retval None + */ +void RTC_WaitForSynchro(void) +{ + /* Clear RSF flag */ + RTC->CRL &= (uint16_t)~RTC_FLAG_RSF; + /* Loop until RSF flag is set */ + while ((RTC->CRL & RTC_FLAG_RSF) == (uint16_t)RESET) + { + } +} + +/** + * @brief Checks whether the specified RTC flag is set or not. + * @param RTC_FLAG: specifies the flag to check. + * This parameter can be one the following values: + * @arg RTC_FLAG_RTOFF: RTC Operation OFF flag + * @arg RTC_FLAG_RSF: Registers Synchronized flag + * @arg RTC_FLAG_OW: Overflow flag + * @arg RTC_FLAG_ALR: Alarm flag + * @arg RTC_FLAG_SEC: Second flag + * @retval The new state of RTC_FLAG (SET or RESET). + */ +FlagStatus RTC_GetFlagStatus(uint16_t RTC_FLAG) +{ + FlagStatus bitstatus = RESET; + + /* Check the parameters */ + assert_param(IS_RTC_GET_FLAG(RTC_FLAG)); + + if ((RTC->CRL & RTC_FLAG) != (uint16_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Clears the RTC's pending flags. + * @param RTC_FLAG: specifies the flag to clear. + * This parameter can be any combination of the following values: + * @arg RTC_FLAG_RSF: Registers Synchronized flag. This flag is cleared only after + * an APB reset or an APB Clock stop. + * @arg RTC_FLAG_OW: Overflow flag + * @arg RTC_FLAG_ALR: Alarm flag + * @arg RTC_FLAG_SEC: Second flag + * @retval None + */ +void RTC_ClearFlag(uint16_t RTC_FLAG) +{ + /* Check the parameters */ + assert_param(IS_RTC_CLEAR_FLAG(RTC_FLAG)); + + /* Clear the corresponding RTC flag */ + RTC->CRL &= (uint16_t)~RTC_FLAG; +} + +/** + * @brief Checks whether the specified RTC interrupt has occurred or not. + * @param RTC_IT: specifies the RTC interrupts sources to check. + * This parameter can be one of the following values: + * @arg RTC_IT_OW: Overflow interrupt + * @arg RTC_IT_ALR: Alarm interrupt + * @arg RTC_IT_SEC: Second interrupt + * @retval The new state of the RTC_IT (SET or RESET). + */ +ITStatus RTC_GetITStatus(uint16_t RTC_IT) +{ + ITStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_RTC_GET_IT(RTC_IT)); + + bitstatus = (ITStatus)(RTC->CRL & RTC_IT); + if (((RTC->CRH & RTC_IT) != (uint16_t)RESET) && (bitstatus != (uint16_t)RESET)) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Clears the RTC's interrupt pending bits. + * @param RTC_IT: specifies the interrupt pending bit to clear. + * This parameter can be any combination of the following values: + * @arg RTC_IT_OW: Overflow interrupt + * @arg RTC_IT_ALR: Alarm interrupt + * @arg RTC_IT_SEC: Second interrupt + * @retval None + */ +void RTC_ClearITPendingBit(uint16_t RTC_IT) +{ + /* Check the parameters */ + assert_param(IS_RTC_IT(RTC_IT)); + + /* Clear the corresponding RTC pending bit */ + RTC->CRL &= (uint16_t)~RTC_IT; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_sdio.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_sdio.c new file mode 100644 index 0000000..d1870ce --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_sdio.c @@ -0,0 +1,799 @@ +/** + ****************************************************************************** + * @file stm32f10x_sdio.c + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief This file provides all the SDIO firmware functions. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_sdio.h" +#include "stm32f10x_rcc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup SDIO + * @brief SDIO driver modules + * @{ + */ + +/** @defgroup SDIO_Private_TypesDefinitions + * @{ + */ + +/* ------------ SDIO registers bit address in the alias region ----------- */ +#define SDIO_OFFSET (SDIO_BASE - PERIPH_BASE) + +/* --- CLKCR Register ---*/ + +/* Alias word address of CLKEN bit */ +#define CLKCR_OFFSET (SDIO_OFFSET + 0x04) +#define CLKEN_BitNumber 0x08 +#define CLKCR_CLKEN_BB (PERIPH_BB_BASE + (CLKCR_OFFSET * 32) + (CLKEN_BitNumber * 4)) + +/* --- CMD Register ---*/ + +/* Alias word address of SDIOSUSPEND bit */ +#define CMD_OFFSET (SDIO_OFFSET + 0x0C) +#define SDIOSUSPEND_BitNumber 0x0B +#define CMD_SDIOSUSPEND_BB (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (SDIOSUSPEND_BitNumber * 4)) + +/* Alias word address of ENCMDCOMPL bit */ +#define ENCMDCOMPL_BitNumber 0x0C +#define CMD_ENCMDCOMPL_BB (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (ENCMDCOMPL_BitNumber * 4)) + +/* Alias word address of NIEN bit */ +#define NIEN_BitNumber 0x0D +#define CMD_NIEN_BB (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (NIEN_BitNumber * 4)) + +/* Alias word address of ATACMD bit */ +#define ATACMD_BitNumber 0x0E +#define CMD_ATACMD_BB (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (ATACMD_BitNumber * 4)) + +/* --- DCTRL Register ---*/ + +/* Alias word address of DMAEN bit */ +#define DCTRL_OFFSET (SDIO_OFFSET + 0x2C) +#define DMAEN_BitNumber 0x03 +#define DCTRL_DMAEN_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (DMAEN_BitNumber * 4)) + +/* Alias word address of RWSTART bit */ +#define RWSTART_BitNumber 0x08 +#define DCTRL_RWSTART_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (RWSTART_BitNumber * 4)) + +/* Alias word address of RWSTOP bit */ +#define RWSTOP_BitNumber 0x09 +#define DCTRL_RWSTOP_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (RWSTOP_BitNumber * 4)) + +/* Alias word address of RWMOD bit */ +#define RWMOD_BitNumber 0x0A +#define DCTRL_RWMOD_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (RWMOD_BitNumber * 4)) + +/* Alias word address of SDIOEN bit */ +#define SDIOEN_BitNumber 0x0B +#define DCTRL_SDIOEN_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (SDIOEN_BitNumber * 4)) + +/* ---------------------- SDIO registers bit mask ------------------------ */ + +/* --- CLKCR Register ---*/ + +/* CLKCR register clear mask */ +#define CLKCR_CLEAR_MASK ((uint32_t)0xFFFF8100) + +/* --- PWRCTRL Register ---*/ + +/* SDIO PWRCTRL Mask */ +#define PWR_PWRCTRL_MASK ((uint32_t)0xFFFFFFFC) + +/* --- DCTRL Register ---*/ + +/* SDIO DCTRL Clear Mask */ +#define DCTRL_CLEAR_MASK ((uint32_t)0xFFFFFF08) + +/* --- CMD Register ---*/ + +/* CMD Register clear mask */ +#define CMD_CLEAR_MASK ((uint32_t)0xFFFFF800) + +/* SDIO RESP Registers Address */ +#define SDIO_RESP_ADDR ((uint32_t)(SDIO_BASE + 0x14)) + +/** + * @} + */ + +/** @defgroup SDIO_Private_Defines + * @{ + */ + +/** + * @} + */ + +/** @defgroup SDIO_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup SDIO_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup SDIO_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup SDIO_Private_Functions + * @{ + */ + +/** + * @brief Deinitializes the SDIO peripheral registers to their default reset values. + * @param None + * @retval None + */ +void SDIO_DeInit(void) +{ + SDIO->POWER = 0x00000000; + SDIO->CLKCR = 0x00000000; + SDIO->ARG = 0x00000000; + SDIO->CMD = 0x00000000; + SDIO->DTIMER = 0x00000000; + SDIO->DLEN = 0x00000000; + SDIO->DCTRL = 0x00000000; + SDIO->ICR = 0x00C007FF; + SDIO->MASK = 0x00000000; +} + +/** + * @brief Initializes the SDIO peripheral according to the specified + * parameters in the SDIO_InitStruct. + * @param SDIO_InitStruct : pointer to a SDIO_InitTypeDef structure + * that contains the configuration information for the SDIO peripheral. + * @retval None + */ +void SDIO_Init(SDIO_InitTypeDef* SDIO_InitStruct) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_SDIO_CLOCK_EDGE(SDIO_InitStruct->SDIO_ClockEdge)); + assert_param(IS_SDIO_CLOCK_BYPASS(SDIO_InitStruct->SDIO_ClockBypass)); + assert_param(IS_SDIO_CLOCK_POWER_SAVE(SDIO_InitStruct->SDIO_ClockPowerSave)); + assert_param(IS_SDIO_BUS_WIDE(SDIO_InitStruct->SDIO_BusWide)); + assert_param(IS_SDIO_HARDWARE_FLOW_CONTROL(SDIO_InitStruct->SDIO_HardwareFlowControl)); + +/*---------------------------- SDIO CLKCR Configuration ------------------------*/ + /* Get the SDIO CLKCR value */ + tmpreg = SDIO->CLKCR; + + /* Clear CLKDIV, PWRSAV, BYPASS, WIDBUS, NEGEDGE, HWFC_EN bits */ + tmpreg &= CLKCR_CLEAR_MASK; + + /* Set CLKDIV bits according to SDIO_ClockDiv value */ + /* Set PWRSAV bit according to SDIO_ClockPowerSave value */ + /* Set BYPASS bit according to SDIO_ClockBypass value */ + /* Set WIDBUS bits according to SDIO_BusWide value */ + /* Set NEGEDGE bits according to SDIO_ClockEdge value */ + /* Set HWFC_EN bits according to SDIO_HardwareFlowControl value */ + tmpreg |= (SDIO_InitStruct->SDIO_ClockDiv | SDIO_InitStruct->SDIO_ClockPowerSave | + SDIO_InitStruct->SDIO_ClockBypass | SDIO_InitStruct->SDIO_BusWide | + SDIO_InitStruct->SDIO_ClockEdge | SDIO_InitStruct->SDIO_HardwareFlowControl); + + /* Write to SDIO CLKCR */ + SDIO->CLKCR = tmpreg; +} + +/** + * @brief Fills each SDIO_InitStruct member with its default value. + * @param SDIO_InitStruct: pointer to an SDIO_InitTypeDef structure which + * will be initialized. + * @retval None + */ +void SDIO_StructInit(SDIO_InitTypeDef* SDIO_InitStruct) +{ + /* SDIO_InitStruct members default value */ + SDIO_InitStruct->SDIO_ClockDiv = 0x00; + SDIO_InitStruct->SDIO_ClockEdge = SDIO_ClockEdge_Rising; + SDIO_InitStruct->SDIO_ClockBypass = SDIO_ClockBypass_Disable; + SDIO_InitStruct->SDIO_ClockPowerSave = SDIO_ClockPowerSave_Disable; + SDIO_InitStruct->SDIO_BusWide = SDIO_BusWide_1b; + SDIO_InitStruct->SDIO_HardwareFlowControl = SDIO_HardwareFlowControl_Disable; +} + +/** + * @brief Enables or disables the SDIO Clock. + * @param NewState: new state of the SDIO Clock. This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SDIO_ClockCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) CLKCR_CLKEN_BB = (uint32_t)NewState; +} + +/** + * @brief Sets the power status of the controller. + * @param SDIO_PowerState: new state of the Power state. + * This parameter can be one of the following values: + * @arg SDIO_PowerState_OFF + * @arg SDIO_PowerState_ON + * @retval None + */ +void SDIO_SetPowerState(uint32_t SDIO_PowerState) +{ + /* Check the parameters */ + assert_param(IS_SDIO_POWER_STATE(SDIO_PowerState)); + + SDIO->POWER &= PWR_PWRCTRL_MASK; + SDIO->POWER |= SDIO_PowerState; +} + +/** + * @brief Gets the power status of the controller. + * @param None + * @retval Power status of the controller. The returned value can + * be one of the following: + * - 0x00: Power OFF + * - 0x02: Power UP + * - 0x03: Power ON + */ +uint32_t SDIO_GetPowerState(void) +{ + return (SDIO->POWER & (~PWR_PWRCTRL_MASK)); +} + +/** + * @brief Enables or disables the SDIO interrupts. + * @param SDIO_IT: specifies the SDIO interrupt sources to be enabled or disabled. + * This parameter can be one or a combination of the following values: + * @arg SDIO_IT_CCRCFAIL: Command response received (CRC check failed) interrupt + * @arg SDIO_IT_DCRCFAIL: Data block sent/received (CRC check failed) interrupt + * @arg SDIO_IT_CTIMEOUT: Command response timeout interrupt + * @arg SDIO_IT_DTIMEOUT: Data timeout interrupt + * @arg SDIO_IT_TXUNDERR: Transmit FIFO underrun error interrupt + * @arg SDIO_IT_RXOVERR: Received FIFO overrun error interrupt + * @arg SDIO_IT_CMDREND: Command response received (CRC check passed) interrupt + * @arg SDIO_IT_CMDSENT: Command sent (no response required) interrupt + * @arg SDIO_IT_DATAEND: Data end (data counter, SDIDCOUNT, is zero) interrupt + * @arg SDIO_IT_STBITERR: Start bit not detected on all data signals in wide + * bus mode interrupt + * @arg SDIO_IT_DBCKEND: Data block sent/received (CRC check passed) interrupt + * @arg SDIO_IT_CMDACT: Command transfer in progress interrupt + * @arg SDIO_IT_TXACT: Data transmit in progress interrupt + * @arg SDIO_IT_RXACT: Data receive in progress interrupt + * @arg SDIO_IT_TXFIFOHE: Transmit FIFO Half Empty interrupt + * @arg SDIO_IT_RXFIFOHF: Receive FIFO Half Full interrupt + * @arg SDIO_IT_TXFIFOF: Transmit FIFO full interrupt + * @arg SDIO_IT_RXFIFOF: Receive FIFO full interrupt + * @arg SDIO_IT_TXFIFOE: Transmit FIFO empty interrupt + * @arg SDIO_IT_RXFIFOE: Receive FIFO empty interrupt + * @arg SDIO_IT_TXDAVL: Data available in transmit FIFO interrupt + * @arg SDIO_IT_RXDAVL: Data available in receive FIFO interrupt + * @arg SDIO_IT_SDIOIT: SD I/O interrupt received interrupt + * @arg SDIO_IT_CEATAEND: CE-ATA command completion signal received for CMD61 interrupt + * @param NewState: new state of the specified SDIO interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SDIO_ITConfig(uint32_t SDIO_IT, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_SDIO_IT(SDIO_IT)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the SDIO interrupts */ + SDIO->MASK |= SDIO_IT; + } + else + { + /* Disable the SDIO interrupts */ + SDIO->MASK &= ~SDIO_IT; + } +} + +/** + * @brief Enables or disables the SDIO DMA request. + * @param NewState: new state of the selected SDIO DMA request. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SDIO_DMACmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) DCTRL_DMAEN_BB = (uint32_t)NewState; +} + +/** + * @brief Initializes the SDIO Command according to the specified + * parameters in the SDIO_CmdInitStruct and send the command. + * @param SDIO_CmdInitStruct : pointer to a SDIO_CmdInitTypeDef + * structure that contains the configuration information for the SDIO command. + * @retval None + */ +void SDIO_SendCommand(SDIO_CmdInitTypeDef *SDIO_CmdInitStruct) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_SDIO_CMD_INDEX(SDIO_CmdInitStruct->SDIO_CmdIndex)); + assert_param(IS_SDIO_RESPONSE(SDIO_CmdInitStruct->SDIO_Response)); + assert_param(IS_SDIO_WAIT(SDIO_CmdInitStruct->SDIO_Wait)); + assert_param(IS_SDIO_CPSM(SDIO_CmdInitStruct->SDIO_CPSM)); + +/*---------------------------- SDIO ARG Configuration ------------------------*/ + /* Set the SDIO Argument value */ + SDIO->ARG = SDIO_CmdInitStruct->SDIO_Argument; + +/*---------------------------- SDIO CMD Configuration ------------------------*/ + /* Get the SDIO CMD value */ + tmpreg = SDIO->CMD; + /* Clear CMDINDEX, WAITRESP, WAITINT, WAITPEND, CPSMEN bits */ + tmpreg &= CMD_CLEAR_MASK; + /* Set CMDINDEX bits according to SDIO_CmdIndex value */ + /* Set WAITRESP bits according to SDIO_Response value */ + /* Set WAITINT and WAITPEND bits according to SDIO_Wait value */ + /* Set CPSMEN bits according to SDIO_CPSM value */ + tmpreg |= (uint32_t)SDIO_CmdInitStruct->SDIO_CmdIndex | SDIO_CmdInitStruct->SDIO_Response + | SDIO_CmdInitStruct->SDIO_Wait | SDIO_CmdInitStruct->SDIO_CPSM; + + /* Write to SDIO CMD */ + SDIO->CMD = tmpreg; +} + +/** + * @brief Fills each SDIO_CmdInitStruct member with its default value. + * @param SDIO_CmdInitStruct: pointer to an SDIO_CmdInitTypeDef + * structure which will be initialized. + * @retval None + */ +void SDIO_CmdStructInit(SDIO_CmdInitTypeDef* SDIO_CmdInitStruct) +{ + /* SDIO_CmdInitStruct members default value */ + SDIO_CmdInitStruct->SDIO_Argument = 0x00; + SDIO_CmdInitStruct->SDIO_CmdIndex = 0x00; + SDIO_CmdInitStruct->SDIO_Response = SDIO_Response_No; + SDIO_CmdInitStruct->SDIO_Wait = SDIO_Wait_No; + SDIO_CmdInitStruct->SDIO_CPSM = SDIO_CPSM_Disable; +} + +/** + * @brief Returns command index of last command for which response received. + * @param None + * @retval Returns the command index of the last command response received. + */ +uint8_t SDIO_GetCommandResponse(void) +{ + return (uint8_t)(SDIO->RESPCMD); +} + +/** + * @brief Returns response received from the card for the last command. + * @param SDIO_RESP: Specifies the SDIO response register. + * This parameter can be one of the following values: + * @arg SDIO_RESP1: Response Register 1 + * @arg SDIO_RESP2: Response Register 2 + * @arg SDIO_RESP3: Response Register 3 + * @arg SDIO_RESP4: Response Register 4 + * @retval The Corresponding response register value. + */ +uint32_t SDIO_GetResponse(uint32_t SDIO_RESP) +{ + __IO uint32_t tmp = 0; + + /* Check the parameters */ + assert_param(IS_SDIO_RESP(SDIO_RESP)); + + tmp = SDIO_RESP_ADDR + SDIO_RESP; + + return (*(__IO uint32_t *) tmp); +} + +/** + * @brief Initializes the SDIO data path according to the specified + * parameters in the SDIO_DataInitStruct. + * @param SDIO_DataInitStruct : pointer to a SDIO_DataInitTypeDef structure that + * contains the configuration information for the SDIO command. + * @retval None + */ +void SDIO_DataConfig(SDIO_DataInitTypeDef* SDIO_DataInitStruct) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_SDIO_DATA_LENGTH(SDIO_DataInitStruct->SDIO_DataLength)); + assert_param(IS_SDIO_BLOCK_SIZE(SDIO_DataInitStruct->SDIO_DataBlockSize)); + assert_param(IS_SDIO_TRANSFER_DIR(SDIO_DataInitStruct->SDIO_TransferDir)); + assert_param(IS_SDIO_TRANSFER_MODE(SDIO_DataInitStruct->SDIO_TransferMode)); + assert_param(IS_SDIO_DPSM(SDIO_DataInitStruct->SDIO_DPSM)); + +/*---------------------------- SDIO DTIMER Configuration ---------------------*/ + /* Set the SDIO Data TimeOut value */ + SDIO->DTIMER = SDIO_DataInitStruct->SDIO_DataTimeOut; + +/*---------------------------- SDIO DLEN Configuration -----------------------*/ + /* Set the SDIO DataLength value */ + SDIO->DLEN = SDIO_DataInitStruct->SDIO_DataLength; + +/*---------------------------- SDIO DCTRL Configuration ----------------------*/ + /* Get the SDIO DCTRL value */ + tmpreg = SDIO->DCTRL; + /* Clear DEN, DTMODE, DTDIR and DBCKSIZE bits */ + tmpreg &= DCTRL_CLEAR_MASK; + /* Set DEN bit according to SDIO_DPSM value */ + /* Set DTMODE bit according to SDIO_TransferMode value */ + /* Set DTDIR bit according to SDIO_TransferDir value */ + /* Set DBCKSIZE bits according to SDIO_DataBlockSize value */ + tmpreg |= (uint32_t)SDIO_DataInitStruct->SDIO_DataBlockSize | SDIO_DataInitStruct->SDIO_TransferDir + | SDIO_DataInitStruct->SDIO_TransferMode | SDIO_DataInitStruct->SDIO_DPSM; + + /* Write to SDIO DCTRL */ + SDIO->DCTRL = tmpreg; +} + +/** + * @brief Fills each SDIO_DataInitStruct member with its default value. + * @param SDIO_DataInitStruct: pointer to an SDIO_DataInitTypeDef structure which + * will be initialized. + * @retval None + */ +void SDIO_DataStructInit(SDIO_DataInitTypeDef* SDIO_DataInitStruct) +{ + /* SDIO_DataInitStruct members default value */ + SDIO_DataInitStruct->SDIO_DataTimeOut = 0xFFFFFFFF; + SDIO_DataInitStruct->SDIO_DataLength = 0x00; + SDIO_DataInitStruct->SDIO_DataBlockSize = SDIO_DataBlockSize_1b; + SDIO_DataInitStruct->SDIO_TransferDir = SDIO_TransferDir_ToCard; + SDIO_DataInitStruct->SDIO_TransferMode = SDIO_TransferMode_Block; + SDIO_DataInitStruct->SDIO_DPSM = SDIO_DPSM_Disable; +} + +/** + * @brief Returns number of remaining data bytes to be transferred. + * @param None + * @retval Number of remaining data bytes to be transferred + */ +uint32_t SDIO_GetDataCounter(void) +{ + return SDIO->DCOUNT; +} + +/** + * @brief Read one data word from Rx FIFO. + * @param None + * @retval Data received + */ +uint32_t SDIO_ReadData(void) +{ + return SDIO->FIFO; +} + +/** + * @brief Write one data word to Tx FIFO. + * @param Data: 32-bit data word to write. + * @retval None + */ +void SDIO_WriteData(uint32_t Data) +{ + SDIO->FIFO = Data; +} + +/** + * @brief Returns the number of words left to be written to or read from FIFO. + * @param None + * @retval Remaining number of words. + */ +uint32_t SDIO_GetFIFOCount(void) +{ + return SDIO->FIFOCNT; +} + +/** + * @brief Starts the SD I/O Read Wait operation. + * @param NewState: new state of the Start SDIO Read Wait operation. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SDIO_StartSDIOReadWait(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) DCTRL_RWSTART_BB = (uint32_t) NewState; +} + +/** + * @brief Stops the SD I/O Read Wait operation. + * @param NewState: new state of the Stop SDIO Read Wait operation. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SDIO_StopSDIOReadWait(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) DCTRL_RWSTOP_BB = (uint32_t) NewState; +} + +/** + * @brief Sets one of the two options of inserting read wait interval. + * @param SDIO_ReadWaitMode: SD I/O Read Wait operation mode. + * This parameter can be: + * @arg SDIO_ReadWaitMode_CLK: Read Wait control by stopping SDIOCLK + * @arg SDIO_ReadWaitMode_DATA2: Read Wait control using SDIO_DATA2 + * @retval None + */ +void SDIO_SetSDIOReadWaitMode(uint32_t SDIO_ReadWaitMode) +{ + /* Check the parameters */ + assert_param(IS_SDIO_READWAIT_MODE(SDIO_ReadWaitMode)); + + *(__IO uint32_t *) DCTRL_RWMOD_BB = SDIO_ReadWaitMode; +} + +/** + * @brief Enables or disables the SD I/O Mode Operation. + * @param NewState: new state of SDIO specific operation. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SDIO_SetSDIOOperation(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) DCTRL_SDIOEN_BB = (uint32_t)NewState; +} + +/** + * @brief Enables or disables the SD I/O Mode suspend command sending. + * @param NewState: new state of the SD I/O Mode suspend command. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SDIO_SendSDIOSuspendCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) CMD_SDIOSUSPEND_BB = (uint32_t)NewState; +} + +/** + * @brief Enables or disables the command completion signal. + * @param NewState: new state of command completion signal. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SDIO_CommandCompletionCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) CMD_ENCMDCOMPL_BB = (uint32_t)NewState; +} + +/** + * @brief Enables or disables the CE-ATA interrupt. + * @param NewState: new state of CE-ATA interrupt. This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SDIO_CEATAITCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) CMD_NIEN_BB = (uint32_t)((~((uint32_t)NewState)) & ((uint32_t)0x1)); +} + +/** + * @brief Sends CE-ATA command (CMD61). + * @param NewState: new state of CE-ATA command. This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SDIO_SendCEATACmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) CMD_ATACMD_BB = (uint32_t)NewState; +} + +/** + * @brief Checks whether the specified SDIO flag is set or not. + * @param SDIO_FLAG: specifies the flag to check. + * This parameter can be one of the following values: + * @arg SDIO_FLAG_CCRCFAIL: Command response received (CRC check failed) + * @arg SDIO_FLAG_DCRCFAIL: Data block sent/received (CRC check failed) + * @arg SDIO_FLAG_CTIMEOUT: Command response timeout + * @arg SDIO_FLAG_DTIMEOUT: Data timeout + * @arg SDIO_FLAG_TXUNDERR: Transmit FIFO underrun error + * @arg SDIO_FLAG_RXOVERR: Received FIFO overrun error + * @arg SDIO_FLAG_CMDREND: Command response received (CRC check passed) + * @arg SDIO_FLAG_CMDSENT: Command sent (no response required) + * @arg SDIO_FLAG_DATAEND: Data end (data counter, SDIDCOUNT, is zero) + * @arg SDIO_FLAG_STBITERR: Start bit not detected on all data signals in wide + * bus mode. + * @arg SDIO_FLAG_DBCKEND: Data block sent/received (CRC check passed) + * @arg SDIO_FLAG_CMDACT: Command transfer in progress + * @arg SDIO_FLAG_TXACT: Data transmit in progress + * @arg SDIO_FLAG_RXACT: Data receive in progress + * @arg SDIO_FLAG_TXFIFOHE: Transmit FIFO Half Empty + * @arg SDIO_FLAG_RXFIFOHF: Receive FIFO Half Full + * @arg SDIO_FLAG_TXFIFOF: Transmit FIFO full + * @arg SDIO_FLAG_RXFIFOF: Receive FIFO full + * @arg SDIO_FLAG_TXFIFOE: Transmit FIFO empty + * @arg SDIO_FLAG_RXFIFOE: Receive FIFO empty + * @arg SDIO_FLAG_TXDAVL: Data available in transmit FIFO + * @arg SDIO_FLAG_RXDAVL: Data available in receive FIFO + * @arg SDIO_FLAG_SDIOIT: SD I/O interrupt received + * @arg SDIO_FLAG_CEATAEND: CE-ATA command completion signal received for CMD61 + * @retval The new state of SDIO_FLAG (SET or RESET). + */ +FlagStatus SDIO_GetFlagStatus(uint32_t SDIO_FLAG) +{ + FlagStatus bitstatus = RESET; + + /* Check the parameters */ + assert_param(IS_SDIO_FLAG(SDIO_FLAG)); + + if ((SDIO->STA & SDIO_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Clears the SDIO's pending flags. + * @param SDIO_FLAG: specifies the flag to clear. + * This parameter can be one or a combination of the following values: + * @arg SDIO_FLAG_CCRCFAIL: Command response received (CRC check failed) + * @arg SDIO_FLAG_DCRCFAIL: Data block sent/received (CRC check failed) + * @arg SDIO_FLAG_CTIMEOUT: Command response timeout + * @arg SDIO_FLAG_DTIMEOUT: Data timeout + * @arg SDIO_FLAG_TXUNDERR: Transmit FIFO underrun error + * @arg SDIO_FLAG_RXOVERR: Received FIFO overrun error + * @arg SDIO_FLAG_CMDREND: Command response received (CRC check passed) + * @arg SDIO_FLAG_CMDSENT: Command sent (no response required) + * @arg SDIO_FLAG_DATAEND: Data end (data counter, SDIDCOUNT, is zero) + * @arg SDIO_FLAG_STBITERR: Start bit not detected on all data signals in wide + * bus mode + * @arg SDIO_FLAG_DBCKEND: Data block sent/received (CRC check passed) + * @arg SDIO_FLAG_SDIOIT: SD I/O interrupt received + * @arg SDIO_FLAG_CEATAEND: CE-ATA command completion signal received for CMD61 + * @retval None + */ +void SDIO_ClearFlag(uint32_t SDIO_FLAG) +{ + /* Check the parameters */ + assert_param(IS_SDIO_CLEAR_FLAG(SDIO_FLAG)); + + SDIO->ICR = SDIO_FLAG; +} + +/** + * @brief Checks whether the specified SDIO interrupt has occurred or not. + * @param SDIO_IT: specifies the SDIO interrupt source to check. + * This parameter can be one of the following values: + * @arg SDIO_IT_CCRCFAIL: Command response received (CRC check failed) interrupt + * @arg SDIO_IT_DCRCFAIL: Data block sent/received (CRC check failed) interrupt + * @arg SDIO_IT_CTIMEOUT: Command response timeout interrupt + * @arg SDIO_IT_DTIMEOUT: Data timeout interrupt + * @arg SDIO_IT_TXUNDERR: Transmit FIFO underrun error interrupt + * @arg SDIO_IT_RXOVERR: Received FIFO overrun error interrupt + * @arg SDIO_IT_CMDREND: Command response received (CRC check passed) interrupt + * @arg SDIO_IT_CMDSENT: Command sent (no response required) interrupt + * @arg SDIO_IT_DATAEND: Data end (data counter, SDIDCOUNT, is zero) interrupt + * @arg SDIO_IT_STBITERR: Start bit not detected on all data signals in wide + * bus mode interrupt + * @arg SDIO_IT_DBCKEND: Data block sent/received (CRC check passed) interrupt + * @arg SDIO_IT_CMDACT: Command transfer in progress interrupt + * @arg SDIO_IT_TXACT: Data transmit in progress interrupt + * @arg SDIO_IT_RXACT: Data receive in progress interrupt + * @arg SDIO_IT_TXFIFOHE: Transmit FIFO Half Empty interrupt + * @arg SDIO_IT_RXFIFOHF: Receive FIFO Half Full interrupt + * @arg SDIO_IT_TXFIFOF: Transmit FIFO full interrupt + * @arg SDIO_IT_RXFIFOF: Receive FIFO full interrupt + * @arg SDIO_IT_TXFIFOE: Transmit FIFO empty interrupt + * @arg SDIO_IT_RXFIFOE: Receive FIFO empty interrupt + * @arg SDIO_IT_TXDAVL: Data available in transmit FIFO interrupt + * @arg SDIO_IT_RXDAVL: Data available in receive FIFO interrupt + * @arg SDIO_IT_SDIOIT: SD I/O interrupt received interrupt + * @arg SDIO_IT_CEATAEND: CE-ATA command completion signal received for CMD61 interrupt + * @retval The new state of SDIO_IT (SET or RESET). + */ +ITStatus SDIO_GetITStatus(uint32_t SDIO_IT) +{ + ITStatus bitstatus = RESET; + + /* Check the parameters */ + assert_param(IS_SDIO_GET_IT(SDIO_IT)); + if ((SDIO->STA & SDIO_IT) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Clears the SDIO's interrupt pending bits. + * @param SDIO_IT: specifies the interrupt pending bit to clear. + * This parameter can be one or a combination of the following values: + * @arg SDIO_IT_CCRCFAIL: Command response received (CRC check failed) interrupt + * @arg SDIO_IT_DCRCFAIL: Data block sent/received (CRC check failed) interrupt + * @arg SDIO_IT_CTIMEOUT: Command response timeout interrupt + * @arg SDIO_IT_DTIMEOUT: Data timeout interrupt + * @arg SDIO_IT_TXUNDERR: Transmit FIFO underrun error interrupt + * @arg SDIO_IT_RXOVERR: Received FIFO overrun error interrupt + * @arg SDIO_IT_CMDREND: Command response received (CRC check passed) interrupt + * @arg SDIO_IT_CMDSENT: Command sent (no response required) interrupt + * @arg SDIO_IT_DATAEND: Data end (data counter, SDIDCOUNT, is zero) interrupt + * @arg SDIO_IT_STBITERR: Start bit not detected on all data signals in wide + * bus mode interrupt + * @arg SDIO_IT_SDIOIT: SD I/O interrupt received interrupt + * @arg SDIO_IT_CEATAEND: CE-ATA command completion signal received for CMD61 + * @retval None + */ +void SDIO_ClearITPendingBit(uint32_t SDIO_IT) +{ + /* Check the parameters */ + assert_param(IS_SDIO_CLEAR_IT(SDIO_IT)); + + SDIO->ICR = SDIO_IT; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_spi.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_spi.c new file mode 100644 index 0000000..51a9cce --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_spi.c @@ -0,0 +1,908 @@ +/** + ****************************************************************************** + * @file stm32f10x_spi.c + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief This file provides all the SPI firmware functions. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_spi.h" +#include "stm32f10x_rcc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup SPI + * @brief SPI driver modules + * @{ + */ + +/** @defgroup SPI_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + + +/** @defgroup SPI_Private_Defines + * @{ + */ + +/* SPI SPE mask */ +#define CR1_SPE_Set ((uint16_t)0x0040) +#define CR1_SPE_Reset ((uint16_t)0xFFBF) + +/* I2S I2SE mask */ +#define I2SCFGR_I2SE_Set ((uint16_t)0x0400) +#define I2SCFGR_I2SE_Reset ((uint16_t)0xFBFF) + +/* SPI CRCNext mask */ +#define CR1_CRCNext_Set ((uint16_t)0x1000) + +/* SPI CRCEN mask */ +#define CR1_CRCEN_Set ((uint16_t)0x2000) +#define CR1_CRCEN_Reset ((uint16_t)0xDFFF) + +/* SPI SSOE mask */ +#define CR2_SSOE_Set ((uint16_t)0x0004) +#define CR2_SSOE_Reset ((uint16_t)0xFFFB) + +/* SPI registers Masks */ +#define CR1_CLEAR_Mask ((uint16_t)0x3040) +#define I2SCFGR_CLEAR_Mask ((uint16_t)0xF040) + +/* SPI or I2S mode selection masks */ +#define SPI_Mode_Select ((uint16_t)0xF7FF) +#define I2S_Mode_Select ((uint16_t)0x0800) + +/* I2S clock source selection masks */ +#define I2S2_CLOCK_SRC ((uint32_t)(0x00020000)) +#define I2S3_CLOCK_SRC ((uint32_t)(0x00040000)) +#define I2S_MUL_MASK ((uint32_t)(0x0000F000)) +#define I2S_DIV_MASK ((uint32_t)(0x000000F0)) + +/** + * @} + */ + +/** @defgroup SPI_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup SPI_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup SPI_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup SPI_Private_Functions + * @{ + */ + +/** + * @brief Deinitializes the SPIx peripheral registers to their default + * reset values (Affects also the I2Ss). + * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. + * @retval None + */ +void SPI_I2S_DeInit(SPI_TypeDef* SPIx) +{ + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + + if (SPIx == SPI1) + { + /* Enable SPI1 reset state */ + RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1, ENABLE); + /* Release SPI1 from reset state */ + RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1, DISABLE); + } + else if (SPIx == SPI2) + { + /* Enable SPI2 reset state */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2, ENABLE); + /* Release SPI2 from reset state */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2, DISABLE); + } + else + { + if (SPIx == SPI3) + { + /* Enable SPI3 reset state */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI3, ENABLE); + /* Release SPI3 from reset state */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI3, DISABLE); + } + } +} + +/** + * @brief Initializes the SPIx peripheral according to the specified + * parameters in the SPI_InitStruct. + * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. + * @param SPI_InitStruct: pointer to a SPI_InitTypeDef structure that + * contains the configuration information for the specified SPI peripheral. + * @retval None + */ +void SPI_Init(SPI_TypeDef* SPIx, SPI_InitTypeDef* SPI_InitStruct) +{ + uint16_t tmpreg = 0; + + /* check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + + /* Check the SPI parameters */ + assert_param(IS_SPI_DIRECTION_MODE(SPI_InitStruct->SPI_Direction)); + assert_param(IS_SPI_MODE(SPI_InitStruct->SPI_Mode)); + assert_param(IS_SPI_DATASIZE(SPI_InitStruct->SPI_DataSize)); + assert_param(IS_SPI_CPOL(SPI_InitStruct->SPI_CPOL)); + assert_param(IS_SPI_CPHA(SPI_InitStruct->SPI_CPHA)); + assert_param(IS_SPI_NSS(SPI_InitStruct->SPI_NSS)); + assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_InitStruct->SPI_BaudRatePrescaler)); + assert_param(IS_SPI_FIRST_BIT(SPI_InitStruct->SPI_FirstBit)); + assert_param(IS_SPI_CRC_POLYNOMIAL(SPI_InitStruct->SPI_CRCPolynomial)); + +/*---------------------------- SPIx CR1 Configuration ------------------------*/ + /* Get the SPIx CR1 value */ + tmpreg = SPIx->CR1; + /* Clear BIDIMode, BIDIOE, RxONLY, SSM, SSI, LSBFirst, BR, MSTR, CPOL and CPHA bits */ + tmpreg &= CR1_CLEAR_Mask; + /* Configure SPIx: direction, NSS management, first transmitted bit, BaudRate prescaler + master/salve mode, CPOL and CPHA */ + /* Set BIDImode, BIDIOE and RxONLY bits according to SPI_Direction value */ + /* Set SSM, SSI and MSTR bits according to SPI_Mode and SPI_NSS values */ + /* Set LSBFirst bit according to SPI_FirstBit value */ + /* Set BR bits according to SPI_BaudRatePrescaler value */ + /* Set CPOL bit according to SPI_CPOL value */ + /* Set CPHA bit according to SPI_CPHA value */ + tmpreg |= (uint16_t)((uint32_t)SPI_InitStruct->SPI_Direction | SPI_InitStruct->SPI_Mode | + SPI_InitStruct->SPI_DataSize | SPI_InitStruct->SPI_CPOL | + SPI_InitStruct->SPI_CPHA | SPI_InitStruct->SPI_NSS | + SPI_InitStruct->SPI_BaudRatePrescaler | SPI_InitStruct->SPI_FirstBit); + /* Write to SPIx CR1 */ + SPIx->CR1 = tmpreg; + + /* Activate the SPI mode (Reset I2SMOD bit in I2SCFGR register) */ + SPIx->I2SCFGR &= SPI_Mode_Select; + +/*---------------------------- SPIx CRCPOLY Configuration --------------------*/ + /* Write to SPIx CRCPOLY */ + SPIx->CRCPR = SPI_InitStruct->SPI_CRCPolynomial; +} + +/** + * @brief Initializes the SPIx peripheral according to the specified + * parameters in the I2S_InitStruct. + * @param SPIx: where x can be 2 or 3 to select the SPI peripheral + * (configured in I2S mode). + * @param I2S_InitStruct: pointer to an I2S_InitTypeDef structure that + * contains the configuration information for the specified SPI peripheral + * configured in I2S mode. + * @note + * The function calculates the optimal prescaler needed to obtain the most + * accurate audio frequency (depending on the I2S clock source, the PLL values + * and the product configuration). But in case the prescaler value is greater + * than 511, the default value (0x02) will be configured instead. * + * @retval None + */ +void I2S_Init(SPI_TypeDef* SPIx, I2S_InitTypeDef* I2S_InitStruct) +{ + uint16_t tmpreg = 0, i2sdiv = 2, i2sodd = 0, packetlength = 1; + uint32_t tmp = 0; + RCC_ClocksTypeDef RCC_Clocks; + uint32_t sourceclock = 0; + + /* Check the I2S parameters */ + assert_param(IS_SPI_23_PERIPH(SPIx)); + assert_param(IS_I2S_MODE(I2S_InitStruct->I2S_Mode)); + assert_param(IS_I2S_STANDARD(I2S_InitStruct->I2S_Standard)); + assert_param(IS_I2S_DATA_FORMAT(I2S_InitStruct->I2S_DataFormat)); + assert_param(IS_I2S_MCLK_OUTPUT(I2S_InitStruct->I2S_MCLKOutput)); + assert_param(IS_I2S_AUDIO_FREQ(I2S_InitStruct->I2S_AudioFreq)); + assert_param(IS_I2S_CPOL(I2S_InitStruct->I2S_CPOL)); + +/*----------------------- SPIx I2SCFGR & I2SPR Configuration -----------------*/ + /* Clear I2SMOD, I2SE, I2SCFG, PCMSYNC, I2SSTD, CKPOL, DATLEN and CHLEN bits */ + SPIx->I2SCFGR &= I2SCFGR_CLEAR_Mask; + SPIx->I2SPR = 0x0002; + + /* Get the I2SCFGR register value */ + tmpreg = SPIx->I2SCFGR; + + /* If the default value has to be written, reinitialize i2sdiv and i2sodd*/ + if(I2S_InitStruct->I2S_AudioFreq == I2S_AudioFreq_Default) + { + i2sodd = (uint16_t)0; + i2sdiv = (uint16_t)2; + } + /* If the requested audio frequency is not the default, compute the prescaler */ + else + { + /* Check the frame length (For the Prescaler computing) */ + if(I2S_InitStruct->I2S_DataFormat == I2S_DataFormat_16b) + { + /* Packet length is 16 bits */ + packetlength = 1; + } + else + { + /* Packet length is 32 bits */ + packetlength = 2; + } + + /* Get the I2S clock source mask depending on the peripheral number */ + if(((uint32_t)SPIx) == SPI2_BASE) + { + /* The mask is relative to I2S2 */ + tmp = I2S2_CLOCK_SRC; + } + else + { + /* The mask is relative to I2S3 */ + tmp = I2S3_CLOCK_SRC; + } + + /* Check the I2S clock source configuration depending on the Device: + Only Connectivity line devices have the PLL3 VCO clock */ +#ifdef STM32F10X_CL + if((RCC->CFGR2 & tmp) != 0) + { + /* Get the configuration bits of RCC PLL3 multiplier */ + tmp = (uint32_t)((RCC->CFGR2 & I2S_MUL_MASK) >> 12); + + /* Get the value of the PLL3 multiplier */ + if((tmp > 5) && (tmp < 15)) + { + /* Multiplier is between 8 and 14 (value 15 is forbidden) */ + tmp += 2; + } + else + { + if (tmp == 15) + { + /* Multiplier is 20 */ + tmp = 20; + } + } + /* Get the PREDIV2 value */ + sourceclock = (uint32_t)(((RCC->CFGR2 & I2S_DIV_MASK) >> 4) + 1); + + /* Calculate the Source Clock frequency based on PLL3 and PREDIV2 values */ + sourceclock = (uint32_t) ((HSE_Value / sourceclock) * tmp * 2); + } + else + { + /* I2S Clock source is System clock: Get System Clock frequency */ + RCC_GetClocksFreq(&RCC_Clocks); + + /* Get the source clock value: based on System Clock value */ + sourceclock = RCC_Clocks.SYSCLK_Frequency; + } +#else /* STM32F10X_HD */ + /* I2S Clock source is System clock: Get System Clock frequency */ + RCC_GetClocksFreq(&RCC_Clocks); + + /* Get the source clock value: based on System Clock value */ + sourceclock = RCC_Clocks.SYSCLK_Frequency; +#endif /* STM32F10X_CL */ + + /* Compute the Real divider depending on the MCLK output state with a floating point */ + if(I2S_InitStruct->I2S_MCLKOutput == I2S_MCLKOutput_Enable) + { + /* MCLK output is enabled */ + tmp = (uint16_t)(((((sourceclock / 256) * 10) / I2S_InitStruct->I2S_AudioFreq)) + 5); + } + else + { + /* MCLK output is disabled */ + tmp = (uint16_t)(((((sourceclock / (32 * packetlength)) *10 ) / I2S_InitStruct->I2S_AudioFreq)) + 5); + } + + /* Remove the floating point */ + tmp = tmp / 10; + + /* Check the parity of the divider */ + i2sodd = (uint16_t)(tmp & (uint16_t)0x0001); + + /* Compute the i2sdiv prescaler */ + i2sdiv = (uint16_t)((tmp - i2sodd) / 2); + + /* Get the Mask for the Odd bit (SPI_I2SPR[8]) register */ + i2sodd = (uint16_t) (i2sodd << 8); + } + + /* Test if the divider is 1 or 0 or greater than 0xFF */ + if ((i2sdiv < 2) || (i2sdiv > 0xFF)) + { + /* Set the default values */ + i2sdiv = 2; + i2sodd = 0; + } + + /* Write to SPIx I2SPR register the computed value */ + SPIx->I2SPR = (uint16_t)(i2sdiv | (uint16_t)(i2sodd | (uint16_t)I2S_InitStruct->I2S_MCLKOutput)); + + /* Configure the I2S with the SPI_InitStruct values */ + tmpreg |= (uint16_t)(I2S_Mode_Select | (uint16_t)(I2S_InitStruct->I2S_Mode | \ + (uint16_t)(I2S_InitStruct->I2S_Standard | (uint16_t)(I2S_InitStruct->I2S_DataFormat | \ + (uint16_t)I2S_InitStruct->I2S_CPOL)))); + + /* Write to SPIx I2SCFGR */ + SPIx->I2SCFGR = tmpreg; +} + +/** + * @brief Fills each SPI_InitStruct member with its default value. + * @param SPI_InitStruct : pointer to a SPI_InitTypeDef structure which will be initialized. + * @retval None + */ +void SPI_StructInit(SPI_InitTypeDef* SPI_InitStruct) +{ +/*--------------- Reset SPI init structure parameters values -----------------*/ + /* Initialize the SPI_Direction member */ + SPI_InitStruct->SPI_Direction = SPI_Direction_2Lines_FullDuplex; + /* initialize the SPI_Mode member */ + SPI_InitStruct->SPI_Mode = SPI_Mode_Slave; + /* initialize the SPI_DataSize member */ + SPI_InitStruct->SPI_DataSize = SPI_DataSize_8b; + /* Initialize the SPI_CPOL member */ + SPI_InitStruct->SPI_CPOL = SPI_CPOL_Low; + /* Initialize the SPI_CPHA member */ + SPI_InitStruct->SPI_CPHA = SPI_CPHA_1Edge; + /* Initialize the SPI_NSS member */ + SPI_InitStruct->SPI_NSS = SPI_NSS_Hard; + /* Initialize the SPI_BaudRatePrescaler member */ + SPI_InitStruct->SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2; + /* Initialize the SPI_FirstBit member */ + SPI_InitStruct->SPI_FirstBit = SPI_FirstBit_MSB; + /* Initialize the SPI_CRCPolynomial member */ + SPI_InitStruct->SPI_CRCPolynomial = 7; +} + +/** + * @brief Fills each I2S_InitStruct member with its default value. + * @param I2S_InitStruct : pointer to a I2S_InitTypeDef structure which will be initialized. + * @retval None + */ +void I2S_StructInit(I2S_InitTypeDef* I2S_InitStruct) +{ +/*--------------- Reset I2S init structure parameters values -----------------*/ + /* Initialize the I2S_Mode member */ + I2S_InitStruct->I2S_Mode = I2S_Mode_SlaveTx; + + /* Initialize the I2S_Standard member */ + I2S_InitStruct->I2S_Standard = I2S_Standard_Phillips; + + /* Initialize the I2S_DataFormat member */ + I2S_InitStruct->I2S_DataFormat = I2S_DataFormat_16b; + + /* Initialize the I2S_MCLKOutput member */ + I2S_InitStruct->I2S_MCLKOutput = I2S_MCLKOutput_Disable; + + /* Initialize the I2S_AudioFreq member */ + I2S_InitStruct->I2S_AudioFreq = I2S_AudioFreq_Default; + + /* Initialize the I2S_CPOL member */ + I2S_InitStruct->I2S_CPOL = I2S_CPOL_Low; +} + +/** + * @brief Enables or disables the specified SPI peripheral. + * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. + * @param NewState: new state of the SPIx peripheral. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SPI_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected SPI peripheral */ + SPIx->CR1 |= CR1_SPE_Set; + } + else + { + /* Disable the selected SPI peripheral */ + SPIx->CR1 &= CR1_SPE_Reset; + } +} + +/** + * @brief Enables or disables the specified SPI peripheral (in I2S mode). + * @param SPIx: where x can be 2 or 3 to select the SPI peripheral. + * @param NewState: new state of the SPIx peripheral. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void I2S_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_SPI_23_PERIPH(SPIx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected SPI peripheral (in I2S mode) */ + SPIx->I2SCFGR |= I2SCFGR_I2SE_Set; + } + else + { + /* Disable the selected SPI peripheral (in I2S mode) */ + SPIx->I2SCFGR &= I2SCFGR_I2SE_Reset; + } +} + +/** + * @brief Enables or disables the specified SPI/I2S interrupts. + * @param SPIx: where x can be + * - 1, 2 or 3 in SPI mode + * - 2 or 3 in I2S mode + * @param SPI_I2S_IT: specifies the SPI/I2S interrupt source to be enabled or disabled. + * This parameter can be one of the following values: + * @arg SPI_I2S_IT_TXE: Tx buffer empty interrupt mask + * @arg SPI_I2S_IT_RXNE: Rx buffer not empty interrupt mask + * @arg SPI_I2S_IT_ERR: Error interrupt mask + * @param NewState: new state of the specified SPI/I2S interrupt. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SPI_I2S_ITConfig(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT, FunctionalState NewState) +{ + uint16_t itpos = 0, itmask = 0 ; + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + assert_param(IS_SPI_I2S_CONFIG_IT(SPI_I2S_IT)); + + /* Get the SPI/I2S IT index */ + itpos = SPI_I2S_IT >> 4; + + /* Set the IT mask */ + itmask = (uint16_t)1 << (uint16_t)itpos; + + if (NewState != DISABLE) + { + /* Enable the selected SPI/I2S interrupt */ + SPIx->CR2 |= itmask; + } + else + { + /* Disable the selected SPI/I2S interrupt */ + SPIx->CR2 &= (uint16_t)~itmask; + } +} + +/** + * @brief Enables or disables the SPIx/I2Sx DMA interface. + * @param SPIx: where x can be + * - 1, 2 or 3 in SPI mode + * - 2 or 3 in I2S mode + * @param SPI_I2S_DMAReq: specifies the SPI/I2S DMA transfer request to be enabled or disabled. + * This parameter can be any combination of the following values: + * @arg SPI_I2S_DMAReq_Tx: Tx buffer DMA transfer request + * @arg SPI_I2S_DMAReq_Rx: Rx buffer DMA transfer request + * @param NewState: new state of the selected SPI/I2S DMA transfer request. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SPI_I2S_DMACmd(SPI_TypeDef* SPIx, uint16_t SPI_I2S_DMAReq, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + assert_param(IS_SPI_I2S_DMAREQ(SPI_I2S_DMAReq)); + if (NewState != DISABLE) + { + /* Enable the selected SPI/I2S DMA requests */ + SPIx->CR2 |= SPI_I2S_DMAReq; + } + else + { + /* Disable the selected SPI/I2S DMA requests */ + SPIx->CR2 &= (uint16_t)~SPI_I2S_DMAReq; + } +} + +/** + * @brief Transmits a Data through the SPIx/I2Sx peripheral. + * @param SPIx: where x can be + * - 1, 2 or 3 in SPI mode + * - 2 or 3 in I2S mode + * @param Data : Data to be transmitted. + * @retval None + */ +void SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data) +{ + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + + /* Write in the DR register the data to be sent */ + SPIx->DR = Data; +} + +/** + * @brief Returns the most recent received data by the SPIx/I2Sx peripheral. + * @param SPIx: where x can be + * - 1, 2 or 3 in SPI mode + * - 2 or 3 in I2S mode + * @retval The value of the received data. + */ +uint16_t SPI_I2S_ReceiveData(SPI_TypeDef* SPIx) +{ + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + + /* Return the data in the DR register */ + return SPIx->DR; +} + +/** + * @brief Configures internally by software the NSS pin for the selected SPI. + * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. + * @param SPI_NSSInternalSoft: specifies the SPI NSS internal state. + * This parameter can be one of the following values: + * @arg SPI_NSSInternalSoft_Set: Set NSS pin internally + * @arg SPI_NSSInternalSoft_Reset: Reset NSS pin internally + * @retval None + */ +void SPI_NSSInternalSoftwareConfig(SPI_TypeDef* SPIx, uint16_t SPI_NSSInternalSoft) +{ + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + assert_param(IS_SPI_NSS_INTERNAL(SPI_NSSInternalSoft)); + if (SPI_NSSInternalSoft != SPI_NSSInternalSoft_Reset) + { + /* Set NSS pin internally by software */ + SPIx->CR1 |= SPI_NSSInternalSoft_Set; + } + else + { + /* Reset NSS pin internally by software */ + SPIx->CR1 &= SPI_NSSInternalSoft_Reset; + } +} + +/** + * @brief Enables or disables the SS output for the selected SPI. + * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. + * @param NewState: new state of the SPIx SS output. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SPI_SSOutputCmd(SPI_TypeDef* SPIx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected SPI SS output */ + SPIx->CR2 |= CR2_SSOE_Set; + } + else + { + /* Disable the selected SPI SS output */ + SPIx->CR2 &= CR2_SSOE_Reset; + } +} + +/** + * @brief Configures the data size for the selected SPI. + * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. + * @param SPI_DataSize: specifies the SPI data size. + * This parameter can be one of the following values: + * @arg SPI_DataSize_16b: Set data frame format to 16bit + * @arg SPI_DataSize_8b: Set data frame format to 8bit + * @retval None + */ +void SPI_DataSizeConfig(SPI_TypeDef* SPIx, uint16_t SPI_DataSize) +{ + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + assert_param(IS_SPI_DATASIZE(SPI_DataSize)); + /* Clear DFF bit */ + SPIx->CR1 &= (uint16_t)~SPI_DataSize_16b; + /* Set new DFF bit value */ + SPIx->CR1 |= SPI_DataSize; +} + +/** + * @brief Transmit the SPIx CRC value. + * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. + * @retval None + */ +void SPI_TransmitCRC(SPI_TypeDef* SPIx) +{ + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + + /* Enable the selected SPI CRC transmission */ + SPIx->CR1 |= CR1_CRCNext_Set; +} + +/** + * @brief Enables or disables the CRC value calculation of the transferred bytes. + * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. + * @param NewState: new state of the SPIx CRC value calculation. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SPI_CalculateCRC(SPI_TypeDef* SPIx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected SPI CRC calculation */ + SPIx->CR1 |= CR1_CRCEN_Set; + } + else + { + /* Disable the selected SPI CRC calculation */ + SPIx->CR1 &= CR1_CRCEN_Reset; + } +} + +/** + * @brief Returns the transmit or the receive CRC register value for the specified SPI. + * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. + * @param SPI_CRC: specifies the CRC register to be read. + * This parameter can be one of the following values: + * @arg SPI_CRC_Tx: Selects Tx CRC register + * @arg SPI_CRC_Rx: Selects Rx CRC register + * @retval The selected CRC register value.. + */ +uint16_t SPI_GetCRC(SPI_TypeDef* SPIx, uint8_t SPI_CRC) +{ + uint16_t crcreg = 0; + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + assert_param(IS_SPI_CRC(SPI_CRC)); + if (SPI_CRC != SPI_CRC_Rx) + { + /* Get the Tx CRC register */ + crcreg = SPIx->TXCRCR; + } + else + { + /* Get the Rx CRC register */ + crcreg = SPIx->RXCRCR; + } + /* Return the selected CRC register */ + return crcreg; +} + +/** + * @brief Returns the CRC Polynomial register value for the specified SPI. + * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. + * @retval The CRC Polynomial register value. + */ +uint16_t SPI_GetCRCPolynomial(SPI_TypeDef* SPIx) +{ + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + + /* Return the CRC polynomial register */ + return SPIx->CRCPR; +} + +/** + * @brief Selects the data transfer direction in bi-directional mode for the specified SPI. + * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. + * @param SPI_Direction: specifies the data transfer direction in bi-directional mode. + * This parameter can be one of the following values: + * @arg SPI_Direction_Tx: Selects Tx transmission direction + * @arg SPI_Direction_Rx: Selects Rx receive direction + * @retval None + */ +void SPI_BiDirectionalLineConfig(SPI_TypeDef* SPIx, uint16_t SPI_Direction) +{ + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + assert_param(IS_SPI_DIRECTION(SPI_Direction)); + if (SPI_Direction == SPI_Direction_Tx) + { + /* Set the Tx only mode */ + SPIx->CR1 |= SPI_Direction_Tx; + } + else + { + /* Set the Rx only mode */ + SPIx->CR1 &= SPI_Direction_Rx; + } +} + +/** + * @brief Checks whether the specified SPI/I2S flag is set or not. + * @param SPIx: where x can be + * - 1, 2 or 3 in SPI mode + * - 2 or 3 in I2S mode + * @param SPI_I2S_FLAG: specifies the SPI/I2S flag to check. + * This parameter can be one of the following values: + * @arg SPI_I2S_FLAG_TXE: Transmit buffer empty flag. + * @arg SPI_I2S_FLAG_RXNE: Receive buffer not empty flag. + * @arg SPI_I2S_FLAG_BSY: Busy flag. + * @arg SPI_I2S_FLAG_OVR: Overrun flag. + * @arg SPI_FLAG_MODF: Mode Fault flag. + * @arg SPI_FLAG_CRCERR: CRC Error flag. + * @arg I2S_FLAG_UDR: Underrun Error flag. + * @arg I2S_FLAG_CHSIDE: Channel Side flag. + * @retval The new state of SPI_I2S_FLAG (SET or RESET). + */ +FlagStatus SPI_I2S_GetFlagStatus(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + assert_param(IS_SPI_I2S_GET_FLAG(SPI_I2S_FLAG)); + /* Check the status of the specified SPI/I2S flag */ + if ((SPIx->SR & SPI_I2S_FLAG) != (uint16_t)RESET) + { + /* SPI_I2S_FLAG is set */ + bitstatus = SET; + } + else + { + /* SPI_I2S_FLAG is reset */ + bitstatus = RESET; + } + /* Return the SPI_I2S_FLAG status */ + return bitstatus; +} + +/** + * @brief Clears the SPIx CRC Error (CRCERR) flag. + * @param SPIx: where x can be + * - 1, 2 or 3 in SPI mode + * @param SPI_I2S_FLAG: specifies the SPI flag to clear. + * This function clears only CRCERR flag. + * @note + * - OVR (OverRun error) flag is cleared by software sequence: a read + * operation to SPI_DR register (SPI_I2S_ReceiveData()) followed by a read + * operation to SPI_SR register (SPI_I2S_GetFlagStatus()). + * - UDR (UnderRun error) flag is cleared by a read operation to + * SPI_SR register (SPI_I2S_GetFlagStatus()). + * - MODF (Mode Fault) flag is cleared by software sequence: a read/write + * operation to SPI_SR register (SPI_I2S_GetFlagStatus()) followed by a + * write operation to SPI_CR1 register (SPI_Cmd() to enable the SPI). + * @retval None + */ +void SPI_I2S_ClearFlag(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG) +{ + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + assert_param(IS_SPI_I2S_CLEAR_FLAG(SPI_I2S_FLAG)); + + /* Clear the selected SPI CRC Error (CRCERR) flag */ + SPIx->SR = (uint16_t)~SPI_I2S_FLAG; +} + +/** + * @brief Checks whether the specified SPI/I2S interrupt has occurred or not. + * @param SPIx: where x can be + * - 1, 2 or 3 in SPI mode + * - 2 or 3 in I2S mode + * @param SPI_I2S_IT: specifies the SPI/I2S interrupt source to check. + * This parameter can be one of the following values: + * @arg SPI_I2S_IT_TXE: Transmit buffer empty interrupt. + * @arg SPI_I2S_IT_RXNE: Receive buffer not empty interrupt. + * @arg SPI_I2S_IT_OVR: Overrun interrupt. + * @arg SPI_IT_MODF: Mode Fault interrupt. + * @arg SPI_IT_CRCERR: CRC Error interrupt. + * @arg I2S_IT_UDR: Underrun Error interrupt. + * @retval The new state of SPI_I2S_IT (SET or RESET). + */ +ITStatus SPI_I2S_GetITStatus(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT) +{ + ITStatus bitstatus = RESET; + uint16_t itpos = 0, itmask = 0, enablestatus = 0; + + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + assert_param(IS_SPI_I2S_GET_IT(SPI_I2S_IT)); + + /* Get the SPI/I2S IT index */ + itpos = 0x01 << (SPI_I2S_IT & 0x0F); + + /* Get the SPI/I2S IT mask */ + itmask = SPI_I2S_IT >> 4; + + /* Set the IT mask */ + itmask = 0x01 << itmask; + + /* Get the SPI_I2S_IT enable bit status */ + enablestatus = (SPIx->CR2 & itmask) ; + + /* Check the status of the specified SPI/I2S interrupt */ + if (((SPIx->SR & itpos) != (uint16_t)RESET) && enablestatus) + { + /* SPI_I2S_IT is set */ + bitstatus = SET; + } + else + { + /* SPI_I2S_IT is reset */ + bitstatus = RESET; + } + /* Return the SPI_I2S_IT status */ + return bitstatus; +} + +/** + * @brief Clears the SPIx CRC Error (CRCERR) interrupt pending bit. + * @param SPIx: where x can be + * - 1, 2 or 3 in SPI mode + * @param SPI_I2S_IT: specifies the SPI interrupt pending bit to clear. + * This function clears only CRCERR interrupt pending bit. + * @note + * - OVR (OverRun Error) interrupt pending bit is cleared by software + * sequence: a read operation to SPI_DR register (SPI_I2S_ReceiveData()) + * followed by a read operation to SPI_SR register (SPI_I2S_GetITStatus()). + * - UDR (UnderRun Error) interrupt pending bit is cleared by a read + * operation to SPI_SR register (SPI_I2S_GetITStatus()). + * - MODF (Mode Fault) interrupt pending bit is cleared by software sequence: + * a read/write operation to SPI_SR register (SPI_I2S_GetITStatus()) + * followed by a write operation to SPI_CR1 register (SPI_Cmd() to enable + * the SPI). + * @retval None + */ +void SPI_I2S_ClearITPendingBit(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT) +{ + uint16_t itpos = 0; + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + assert_param(IS_SPI_I2S_CLEAR_IT(SPI_I2S_IT)); + + /* Get the SPI IT index */ + itpos = 0x01 << (SPI_I2S_IT & 0x0F); + + /* Clear the selected SPI CRC Error (CRCERR) interrupt pending bit */ + SPIx->SR = (uint16_t)~itpos; +} +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_tim.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_tim.c new file mode 100644 index 0000000..81c8484 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_tim.c @@ -0,0 +1,2890 @@ +/** + ****************************************************************************** + * @file stm32f10x_tim.c + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief This file provides all the TIM firmware functions. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_tim.h" +#include "stm32f10x_rcc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup TIM + * @brief TIM driver modules + * @{ + */ + +/** @defgroup TIM_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup TIM_Private_Defines + * @{ + */ + +/* ---------------------- TIM registers bit mask ------------------------ */ +#define SMCR_ETR_Mask ((uint16_t)0x00FF) +#define CCMR_Offset ((uint16_t)0x0018) +#define CCER_CCE_Set ((uint16_t)0x0001) +#define CCER_CCNE_Set ((uint16_t)0x0004) + +/** + * @} + */ + +/** @defgroup TIM_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup TIM_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup TIM_Private_FunctionPrototypes + * @{ + */ + +static void TI1_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, + uint16_t TIM_ICFilter); +static void TI2_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, + uint16_t TIM_ICFilter); +static void TI3_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, + uint16_t TIM_ICFilter); +static void TI4_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, + uint16_t TIM_ICFilter); +/** + * @} + */ + +/** @defgroup TIM_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup TIM_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup TIM_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup TIM_Private_Functions + * @{ + */ + +/** + * @brief Deinitializes the TIMx peripheral registers to their default reset values. + * @param TIMx: where x can be 1 to 17 to select the TIM peripheral. + * @retval None + */ +void TIM_DeInit(TIM_TypeDef* TIMx) +{ + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + + if (TIMx == TIM1) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM1, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM1, DISABLE); + } + else if (TIMx == TIM2) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM2, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM2, DISABLE); + } + else if (TIMx == TIM3) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM3, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM3, DISABLE); + } + else if (TIMx == TIM4) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM4, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM4, DISABLE); + } + else if (TIMx == TIM5) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM5, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM5, DISABLE); + } + else if (TIMx == TIM6) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM6, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM6, DISABLE); + } + else if (TIMx == TIM7) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM7, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM7, DISABLE); + } + else if (TIMx == TIM8) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM8, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM8, DISABLE); + } + else if (TIMx == TIM9) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM9, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM9, DISABLE); + } + else if (TIMx == TIM10) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM10, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM10, DISABLE); + } + else if (TIMx == TIM11) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM11, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM11, DISABLE); + } + else if (TIMx == TIM12) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM12, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM12, DISABLE); + } + else if (TIMx == TIM13) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM13, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM13, DISABLE); + } + else if (TIMx == TIM14) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM14, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM14, DISABLE); + } + else if (TIMx == TIM15) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM15, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM15, DISABLE); + } + else if (TIMx == TIM16) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM16, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM16, DISABLE); + } + else + { + if (TIMx == TIM17) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM17, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM17, DISABLE); + } + } +} + +/** + * @brief Initializes the TIMx Time Base Unit peripheral according to + * the specified parameters in the TIM_TimeBaseInitStruct. + * @param TIMx: where x can be 1 to 17 to select the TIM peripheral. + * @param TIM_TimeBaseInitStruct: pointer to a TIM_TimeBaseInitTypeDef + * structure that contains the configuration information for the + * specified TIM peripheral. + * @retval None + */ +void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct) +{ + uint16_t tmpcr1 = 0; + + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + assert_param(IS_TIM_COUNTER_MODE(TIM_TimeBaseInitStruct->TIM_CounterMode)); + assert_param(IS_TIM_CKD_DIV(TIM_TimeBaseInitStruct->TIM_ClockDivision)); + + tmpcr1 = TIMx->CR1; + + if((TIMx == TIM1) || (TIMx == TIM8)|| (TIMx == TIM2) || (TIMx == TIM3)|| + (TIMx == TIM4) || (TIMx == TIM5)) + { + /* Select the Counter Mode */ + tmpcr1 &= (uint16_t)(~((uint16_t)(TIM_CR1_DIR | TIM_CR1_CMS))); + tmpcr1 |= (uint32_t)TIM_TimeBaseInitStruct->TIM_CounterMode; + } + + if((TIMx != TIM6) && (TIMx != TIM7)) + { + /* Set the clock division */ + tmpcr1 &= (uint16_t)(~((uint16_t)TIM_CR1_CKD)); + tmpcr1 |= (uint32_t)TIM_TimeBaseInitStruct->TIM_ClockDivision; + } + + TIMx->CR1 = tmpcr1; + + /* Set the Autoreload value */ + TIMx->ARR = TIM_TimeBaseInitStruct->TIM_Period ; + + /* Set the Prescaler value */ + TIMx->PSC = TIM_TimeBaseInitStruct->TIM_Prescaler; + + if ((TIMx == TIM1) || (TIMx == TIM8)|| (TIMx == TIM15)|| (TIMx == TIM16) || (TIMx == TIM17)) + { + /* Set the Repetition Counter value */ + TIMx->RCR = TIM_TimeBaseInitStruct->TIM_RepetitionCounter; + } + + /* Generate an update event to reload the Prescaler and the Repetition counter + values immediately */ + TIMx->EGR = TIM_PSCReloadMode_Immediate; +} + +/** + * @brief Initializes the TIMx Channel1 according to the specified + * parameters in the TIM_OCInitStruct. + * @param TIMx: where x can be 1 to 17 except 6 and 7 to select the TIM peripheral. + * @param TIM_OCInitStruct: pointer to a TIM_OCInitTypeDef structure + * that contains the configuration information for the specified TIM peripheral. + * @retval None + */ +void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct) +{ + uint16_t tmpccmrx = 0, tmpccer = 0, tmpcr2 = 0; + + /* Check the parameters */ + assert_param(IS_TIM_LIST8_PERIPH(TIMx)); + assert_param(IS_TIM_OC_MODE(TIM_OCInitStruct->TIM_OCMode)); + assert_param(IS_TIM_OUTPUT_STATE(TIM_OCInitStruct->TIM_OutputState)); + assert_param(IS_TIM_OC_POLARITY(TIM_OCInitStruct->TIM_OCPolarity)); + /* Disable the Channel 1: Reset the CC1E Bit */ + TIMx->CCER &= (uint16_t)(~(uint16_t)TIM_CCER_CC1E); + /* Get the TIMx CCER register value */ + tmpccer = TIMx->CCER; + /* Get the TIMx CR2 register value */ + tmpcr2 = TIMx->CR2; + + /* Get the TIMx CCMR1 register value */ + tmpccmrx = TIMx->CCMR1; + + /* Reset the Output Compare Mode Bits */ + tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CCMR1_OC1M)); + tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CCMR1_CC1S)); + + /* Select the Output Compare Mode */ + tmpccmrx |= TIM_OCInitStruct->TIM_OCMode; + + /* Reset the Output Polarity level */ + tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC1P)); + /* Set the Output Compare Polarity */ + tmpccer |= TIM_OCInitStruct->TIM_OCPolarity; + + /* Set the Output State */ + tmpccer |= TIM_OCInitStruct->TIM_OutputState; + + if((TIMx == TIM1) || (TIMx == TIM8)|| (TIMx == TIM15)|| + (TIMx == TIM16)|| (TIMx == TIM17)) + { + assert_param(IS_TIM_OUTPUTN_STATE(TIM_OCInitStruct->TIM_OutputNState)); + assert_param(IS_TIM_OCN_POLARITY(TIM_OCInitStruct->TIM_OCNPolarity)); + assert_param(IS_TIM_OCNIDLE_STATE(TIM_OCInitStruct->TIM_OCNIdleState)); + assert_param(IS_TIM_OCIDLE_STATE(TIM_OCInitStruct->TIM_OCIdleState)); + + /* Reset the Output N Polarity level */ + tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC1NP)); + /* Set the Output N Polarity */ + tmpccer |= TIM_OCInitStruct->TIM_OCNPolarity; + + /* Reset the Output N State */ + tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC1NE)); + /* Set the Output N State */ + tmpccer |= TIM_OCInitStruct->TIM_OutputNState; + + /* Reset the Output Compare and Output Compare N IDLE State */ + tmpcr2 &= (uint16_t)(~((uint16_t)TIM_CR2_OIS1)); + tmpcr2 &= (uint16_t)(~((uint16_t)TIM_CR2_OIS1N)); + + /* Set the Output Idle state */ + tmpcr2 |= TIM_OCInitStruct->TIM_OCIdleState; + /* Set the Output N Idle state */ + tmpcr2 |= TIM_OCInitStruct->TIM_OCNIdleState; + } + /* Write to TIMx CR2 */ + TIMx->CR2 = tmpcr2; + + /* Write to TIMx CCMR1 */ + TIMx->CCMR1 = tmpccmrx; + + /* Set the Capture Compare Register value */ + TIMx->CCR1 = TIM_OCInitStruct->TIM_Pulse; + + /* Write to TIMx CCER */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Initializes the TIMx Channel2 according to the specified + * parameters in the TIM_OCInitStruct. + * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 12 or 15 to select + * the TIM peripheral. + * @param TIM_OCInitStruct: pointer to a TIM_OCInitTypeDef structure + * that contains the configuration information for the specified TIM peripheral. + * @retval None + */ +void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct) +{ + uint16_t tmpccmrx = 0, tmpccer = 0, tmpcr2 = 0; + + /* Check the parameters */ + assert_param(IS_TIM_LIST6_PERIPH(TIMx)); + assert_param(IS_TIM_OC_MODE(TIM_OCInitStruct->TIM_OCMode)); + assert_param(IS_TIM_OUTPUT_STATE(TIM_OCInitStruct->TIM_OutputState)); + assert_param(IS_TIM_OC_POLARITY(TIM_OCInitStruct->TIM_OCPolarity)); + /* Disable the Channel 2: Reset the CC2E Bit */ + TIMx->CCER &= (uint16_t)(~((uint16_t)TIM_CCER_CC2E)); + + /* Get the TIMx CCER register value */ + tmpccer = TIMx->CCER; + /* Get the TIMx CR2 register value */ + tmpcr2 = TIMx->CR2; + + /* Get the TIMx CCMR1 register value */ + tmpccmrx = TIMx->CCMR1; + + /* Reset the Output Compare mode and Capture/Compare selection Bits */ + tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CCMR1_OC2M)); + tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CCMR1_CC2S)); + + /* Select the Output Compare Mode */ + tmpccmrx |= (uint16_t)(TIM_OCInitStruct->TIM_OCMode << 8); + + /* Reset the Output Polarity level */ + tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC2P)); + /* Set the Output Compare Polarity */ + tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCPolarity << 4); + + /* Set the Output State */ + tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputState << 4); + + if((TIMx == TIM1) || (TIMx == TIM8)) + { + assert_param(IS_TIM_OUTPUTN_STATE(TIM_OCInitStruct->TIM_OutputNState)); + assert_param(IS_TIM_OCN_POLARITY(TIM_OCInitStruct->TIM_OCNPolarity)); + assert_param(IS_TIM_OCNIDLE_STATE(TIM_OCInitStruct->TIM_OCNIdleState)); + assert_param(IS_TIM_OCIDLE_STATE(TIM_OCInitStruct->TIM_OCIdleState)); + + /* Reset the Output N Polarity level */ + tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC2NP)); + /* Set the Output N Polarity */ + tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCNPolarity << 4); + + /* Reset the Output N State */ + tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC2NE)); + /* Set the Output N State */ + tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputNState << 4); + + /* Reset the Output Compare and Output Compare N IDLE State */ + tmpcr2 &= (uint16_t)(~((uint16_t)TIM_CR2_OIS2)); + tmpcr2 &= (uint16_t)(~((uint16_t)TIM_CR2_OIS2N)); + + /* Set the Output Idle state */ + tmpcr2 |= (uint16_t)(TIM_OCInitStruct->TIM_OCIdleState << 2); + /* Set the Output N Idle state */ + tmpcr2 |= (uint16_t)(TIM_OCInitStruct->TIM_OCNIdleState << 2); + } + /* Write to TIMx CR2 */ + TIMx->CR2 = tmpcr2; + + /* Write to TIMx CCMR1 */ + TIMx->CCMR1 = tmpccmrx; + + /* Set the Capture Compare Register value */ + TIMx->CCR2 = TIM_OCInitStruct->TIM_Pulse; + + /* Write to TIMx CCER */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Initializes the TIMx Channel3 according to the specified + * parameters in the TIM_OCInitStruct. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_OCInitStruct: pointer to a TIM_OCInitTypeDef structure + * that contains the configuration information for the specified TIM peripheral. + * @retval None + */ +void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct) +{ + uint16_t tmpccmrx = 0, tmpccer = 0, tmpcr2 = 0; + + /* Check the parameters */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + assert_param(IS_TIM_OC_MODE(TIM_OCInitStruct->TIM_OCMode)); + assert_param(IS_TIM_OUTPUT_STATE(TIM_OCInitStruct->TIM_OutputState)); + assert_param(IS_TIM_OC_POLARITY(TIM_OCInitStruct->TIM_OCPolarity)); + /* Disable the Channel 2: Reset the CC2E Bit */ + TIMx->CCER &= (uint16_t)(~((uint16_t)TIM_CCER_CC3E)); + + /* Get the TIMx CCER register value */ + tmpccer = TIMx->CCER; + /* Get the TIMx CR2 register value */ + tmpcr2 = TIMx->CR2; + + /* Get the TIMx CCMR2 register value */ + tmpccmrx = TIMx->CCMR2; + + /* Reset the Output Compare mode and Capture/Compare selection Bits */ + tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CCMR2_OC3M)); + tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CCMR2_CC3S)); + /* Select the Output Compare Mode */ + tmpccmrx |= TIM_OCInitStruct->TIM_OCMode; + + /* Reset the Output Polarity level */ + tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC3P)); + /* Set the Output Compare Polarity */ + tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCPolarity << 8); + + /* Set the Output State */ + tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputState << 8); + + if((TIMx == TIM1) || (TIMx == TIM8)) + { + assert_param(IS_TIM_OUTPUTN_STATE(TIM_OCInitStruct->TIM_OutputNState)); + assert_param(IS_TIM_OCN_POLARITY(TIM_OCInitStruct->TIM_OCNPolarity)); + assert_param(IS_TIM_OCNIDLE_STATE(TIM_OCInitStruct->TIM_OCNIdleState)); + assert_param(IS_TIM_OCIDLE_STATE(TIM_OCInitStruct->TIM_OCIdleState)); + + /* Reset the Output N Polarity level */ + tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC3NP)); + /* Set the Output N Polarity */ + tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCNPolarity << 8); + /* Reset the Output N State */ + tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC3NE)); + + /* Set the Output N State */ + tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputNState << 8); + /* Reset the Output Compare and Output Compare N IDLE State */ + tmpcr2 &= (uint16_t)(~((uint16_t)TIM_CR2_OIS3)); + tmpcr2 &= (uint16_t)(~((uint16_t)TIM_CR2_OIS3N)); + /* Set the Output Idle state */ + tmpcr2 |= (uint16_t)(TIM_OCInitStruct->TIM_OCIdleState << 4); + /* Set the Output N Idle state */ + tmpcr2 |= (uint16_t)(TIM_OCInitStruct->TIM_OCNIdleState << 4); + } + /* Write to TIMx CR2 */ + TIMx->CR2 = tmpcr2; + + /* Write to TIMx CCMR2 */ + TIMx->CCMR2 = tmpccmrx; + + /* Set the Capture Compare Register value */ + TIMx->CCR3 = TIM_OCInitStruct->TIM_Pulse; + + /* Write to TIMx CCER */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Initializes the TIMx Channel4 according to the specified + * parameters in the TIM_OCInitStruct. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_OCInitStruct: pointer to a TIM_OCInitTypeDef structure + * that contains the configuration information for the specified TIM peripheral. + * @retval None + */ +void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct) +{ + uint16_t tmpccmrx = 0, tmpccer = 0, tmpcr2 = 0; + + /* Check the parameters */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + assert_param(IS_TIM_OC_MODE(TIM_OCInitStruct->TIM_OCMode)); + assert_param(IS_TIM_OUTPUT_STATE(TIM_OCInitStruct->TIM_OutputState)); + assert_param(IS_TIM_OC_POLARITY(TIM_OCInitStruct->TIM_OCPolarity)); + /* Disable the Channel 2: Reset the CC4E Bit */ + TIMx->CCER &= (uint16_t)(~((uint16_t)TIM_CCER_CC4E)); + + /* Get the TIMx CCER register value */ + tmpccer = TIMx->CCER; + /* Get the TIMx CR2 register value */ + tmpcr2 = TIMx->CR2; + + /* Get the TIMx CCMR2 register value */ + tmpccmrx = TIMx->CCMR2; + + /* Reset the Output Compare mode and Capture/Compare selection Bits */ + tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CCMR2_OC4M)); + tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CCMR2_CC4S)); + + /* Select the Output Compare Mode */ + tmpccmrx |= (uint16_t)(TIM_OCInitStruct->TIM_OCMode << 8); + + /* Reset the Output Polarity level */ + tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC4P)); + /* Set the Output Compare Polarity */ + tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCPolarity << 12); + + /* Set the Output State */ + tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputState << 12); + + if((TIMx == TIM1) || (TIMx == TIM8)) + { + assert_param(IS_TIM_OCIDLE_STATE(TIM_OCInitStruct->TIM_OCIdleState)); + /* Reset the Output Compare IDLE State */ + tmpcr2 &= (uint16_t)(~((uint16_t)TIM_CR2_OIS4)); + /* Set the Output Idle state */ + tmpcr2 |= (uint16_t)(TIM_OCInitStruct->TIM_OCIdleState << 6); + } + /* Write to TIMx CR2 */ + TIMx->CR2 = tmpcr2; + + /* Write to TIMx CCMR2 */ + TIMx->CCMR2 = tmpccmrx; + + /* Set the Capture Compare Register value */ + TIMx->CCR4 = TIM_OCInitStruct->TIM_Pulse; + + /* Write to TIMx CCER */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Initializes the TIM peripheral according to the specified + * parameters in the TIM_ICInitStruct. + * @param TIMx: where x can be 1 to 17 except 6 and 7 to select the TIM peripheral. + * @param TIM_ICInitStruct: pointer to a TIM_ICInitTypeDef structure + * that contains the configuration information for the specified TIM peripheral. + * @retval None + */ +void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct) +{ + /* Check the parameters */ + assert_param(IS_TIM_CHANNEL(TIM_ICInitStruct->TIM_Channel)); + assert_param(IS_TIM_IC_SELECTION(TIM_ICInitStruct->TIM_ICSelection)); + assert_param(IS_TIM_IC_PRESCALER(TIM_ICInitStruct->TIM_ICPrescaler)); + assert_param(IS_TIM_IC_FILTER(TIM_ICInitStruct->TIM_ICFilter)); + + if((TIMx == TIM1) || (TIMx == TIM8) || (TIMx == TIM2) || (TIMx == TIM3) || + (TIMx == TIM4) ||(TIMx == TIM5)) + { + assert_param(IS_TIM_IC_POLARITY(TIM_ICInitStruct->TIM_ICPolarity)); + } + else + { + assert_param(IS_TIM_IC_POLARITY_LITE(TIM_ICInitStruct->TIM_ICPolarity)); + } + if (TIM_ICInitStruct->TIM_Channel == TIM_Channel_1) + { + assert_param(IS_TIM_LIST8_PERIPH(TIMx)); + /* TI1 Configuration */ + TI1_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, + TIM_ICInitStruct->TIM_ICSelection, + TIM_ICInitStruct->TIM_ICFilter); + /* Set the Input Capture Prescaler value */ + TIM_SetIC1Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); + } + else if (TIM_ICInitStruct->TIM_Channel == TIM_Channel_2) + { + assert_param(IS_TIM_LIST6_PERIPH(TIMx)); + /* TI2 Configuration */ + TI2_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, + TIM_ICInitStruct->TIM_ICSelection, + TIM_ICInitStruct->TIM_ICFilter); + /* Set the Input Capture Prescaler value */ + TIM_SetIC2Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); + } + else if (TIM_ICInitStruct->TIM_Channel == TIM_Channel_3) + { + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + /* TI3 Configuration */ + TI3_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, + TIM_ICInitStruct->TIM_ICSelection, + TIM_ICInitStruct->TIM_ICFilter); + /* Set the Input Capture Prescaler value */ + TIM_SetIC3Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); + } + else + { + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + /* TI4 Configuration */ + TI4_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, + TIM_ICInitStruct->TIM_ICSelection, + TIM_ICInitStruct->TIM_ICFilter); + /* Set the Input Capture Prescaler value */ + TIM_SetIC4Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); + } +} + +/** + * @brief Configures the TIM peripheral according to the specified + * parameters in the TIM_ICInitStruct to measure an external PWM signal. + * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 12 or 15 to select the TIM peripheral. + * @param TIM_ICInitStruct: pointer to a TIM_ICInitTypeDef structure + * that contains the configuration information for the specified TIM peripheral. + * @retval None + */ +void TIM_PWMIConfig(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct) +{ + uint16_t icoppositepolarity = TIM_ICPolarity_Rising; + uint16_t icoppositeselection = TIM_ICSelection_DirectTI; + /* Check the parameters */ + assert_param(IS_TIM_LIST6_PERIPH(TIMx)); + /* Select the Opposite Input Polarity */ + if (TIM_ICInitStruct->TIM_ICPolarity == TIM_ICPolarity_Rising) + { + icoppositepolarity = TIM_ICPolarity_Falling; + } + else + { + icoppositepolarity = TIM_ICPolarity_Rising; + } + /* Select the Opposite Input */ + if (TIM_ICInitStruct->TIM_ICSelection == TIM_ICSelection_DirectTI) + { + icoppositeselection = TIM_ICSelection_IndirectTI; + } + else + { + icoppositeselection = TIM_ICSelection_DirectTI; + } + if (TIM_ICInitStruct->TIM_Channel == TIM_Channel_1) + { + /* TI1 Configuration */ + TI1_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, TIM_ICInitStruct->TIM_ICSelection, + TIM_ICInitStruct->TIM_ICFilter); + /* Set the Input Capture Prescaler value */ + TIM_SetIC1Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); + /* TI2 Configuration */ + TI2_Config(TIMx, icoppositepolarity, icoppositeselection, TIM_ICInitStruct->TIM_ICFilter); + /* Set the Input Capture Prescaler value */ + TIM_SetIC2Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); + } + else + { + /* TI2 Configuration */ + TI2_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, TIM_ICInitStruct->TIM_ICSelection, + TIM_ICInitStruct->TIM_ICFilter); + /* Set the Input Capture Prescaler value */ + TIM_SetIC2Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); + /* TI1 Configuration */ + TI1_Config(TIMx, icoppositepolarity, icoppositeselection, TIM_ICInitStruct->TIM_ICFilter); + /* Set the Input Capture Prescaler value */ + TIM_SetIC1Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); + } +} + +/** + * @brief Configures the: Break feature, dead time, Lock level, the OSSI, + * the OSSR State and the AOE(automatic output enable). + * @param TIMx: where x can be 1 or 8 to select the TIM + * @param TIM_BDTRInitStruct: pointer to a TIM_BDTRInitTypeDef structure that + * contains the BDTR Register configuration information for the TIM peripheral. + * @retval None + */ +void TIM_BDTRConfig(TIM_TypeDef* TIMx, TIM_BDTRInitTypeDef *TIM_BDTRInitStruct) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST2_PERIPH(TIMx)); + assert_param(IS_TIM_OSSR_STATE(TIM_BDTRInitStruct->TIM_OSSRState)); + assert_param(IS_TIM_OSSI_STATE(TIM_BDTRInitStruct->TIM_OSSIState)); + assert_param(IS_TIM_LOCK_LEVEL(TIM_BDTRInitStruct->TIM_LOCKLevel)); + assert_param(IS_TIM_BREAK_STATE(TIM_BDTRInitStruct->TIM_Break)); + assert_param(IS_TIM_BREAK_POLARITY(TIM_BDTRInitStruct->TIM_BreakPolarity)); + assert_param(IS_TIM_AUTOMATIC_OUTPUT_STATE(TIM_BDTRInitStruct->TIM_AutomaticOutput)); + /* Set the Lock level, the Break enable Bit and the Ploarity, the OSSR State, + the OSSI State, the dead time value and the Automatic Output Enable Bit */ + TIMx->BDTR = (uint32_t)TIM_BDTRInitStruct->TIM_OSSRState | TIM_BDTRInitStruct->TIM_OSSIState | + TIM_BDTRInitStruct->TIM_LOCKLevel | TIM_BDTRInitStruct->TIM_DeadTime | + TIM_BDTRInitStruct->TIM_Break | TIM_BDTRInitStruct->TIM_BreakPolarity | + TIM_BDTRInitStruct->TIM_AutomaticOutput; +} + +/** + * @brief Fills each TIM_TimeBaseInitStruct member with its default value. + * @param TIM_TimeBaseInitStruct : pointer to a TIM_TimeBaseInitTypeDef + * structure which will be initialized. + * @retval None + */ +void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct) +{ + /* Set the default configuration */ + TIM_TimeBaseInitStruct->TIM_Period = 0xFFFF; + TIM_TimeBaseInitStruct->TIM_Prescaler = 0x0000; + TIM_TimeBaseInitStruct->TIM_ClockDivision = TIM_CKD_DIV1; + TIM_TimeBaseInitStruct->TIM_CounterMode = TIM_CounterMode_Up; + TIM_TimeBaseInitStruct->TIM_RepetitionCounter = 0x0000; +} + +/** + * @brief Fills each TIM_OCInitStruct member with its default value. + * @param TIM_OCInitStruct : pointer to a TIM_OCInitTypeDef structure which will + * be initialized. + * @retval None + */ +void TIM_OCStructInit(TIM_OCInitTypeDef* TIM_OCInitStruct) +{ + /* Set the default configuration */ + TIM_OCInitStruct->TIM_OCMode = TIM_OCMode_Timing; + TIM_OCInitStruct->TIM_OutputState = TIM_OutputState_Disable; + TIM_OCInitStruct->TIM_OutputNState = TIM_OutputNState_Disable; + TIM_OCInitStruct->TIM_Pulse = 0x0000; + TIM_OCInitStruct->TIM_OCPolarity = TIM_OCPolarity_High; + TIM_OCInitStruct->TIM_OCNPolarity = TIM_OCPolarity_High; + TIM_OCInitStruct->TIM_OCIdleState = TIM_OCIdleState_Reset; + TIM_OCInitStruct->TIM_OCNIdleState = TIM_OCNIdleState_Reset; +} + +/** + * @brief Fills each TIM_ICInitStruct member with its default value. + * @param TIM_ICInitStruct: pointer to a TIM_ICInitTypeDef structure which will + * be initialized. + * @retval None + */ +void TIM_ICStructInit(TIM_ICInitTypeDef* TIM_ICInitStruct) +{ + /* Set the default configuration */ + TIM_ICInitStruct->TIM_Channel = TIM_Channel_1; + TIM_ICInitStruct->TIM_ICPolarity = TIM_ICPolarity_Rising; + TIM_ICInitStruct->TIM_ICSelection = TIM_ICSelection_DirectTI; + TIM_ICInitStruct->TIM_ICPrescaler = TIM_ICPSC_DIV1; + TIM_ICInitStruct->TIM_ICFilter = 0x00; +} + +/** + * @brief Fills each TIM_BDTRInitStruct member with its default value. + * @param TIM_BDTRInitStruct: pointer to a TIM_BDTRInitTypeDef structure which + * will be initialized. + * @retval None + */ +void TIM_BDTRStructInit(TIM_BDTRInitTypeDef* TIM_BDTRInitStruct) +{ + /* Set the default configuration */ + TIM_BDTRInitStruct->TIM_OSSRState = TIM_OSSRState_Disable; + TIM_BDTRInitStruct->TIM_OSSIState = TIM_OSSIState_Disable; + TIM_BDTRInitStruct->TIM_LOCKLevel = TIM_LOCKLevel_OFF; + TIM_BDTRInitStruct->TIM_DeadTime = 0x00; + TIM_BDTRInitStruct->TIM_Break = TIM_Break_Disable; + TIM_BDTRInitStruct->TIM_BreakPolarity = TIM_BreakPolarity_Low; + TIM_BDTRInitStruct->TIM_AutomaticOutput = TIM_AutomaticOutput_Disable; +} + +/** + * @brief Enables or disables the specified TIM peripheral. + * @param TIMx: where x can be 1 to 17 to select the TIMx peripheral. + * @param NewState: new state of the TIMx peripheral. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the TIM Counter */ + TIMx->CR1 |= TIM_CR1_CEN; + } + else + { + /* Disable the TIM Counter */ + TIMx->CR1 &= (uint16_t)(~((uint16_t)TIM_CR1_CEN)); + } +} + +/** + * @brief Enables or disables the TIM peripheral Main Outputs. + * @param TIMx: where x can be 1, 8, 15, 16 or 17 to select the TIMx peripheral. + * @param NewState: new state of the TIM peripheral Main Outputs. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST2_PERIPH(TIMx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the TIM Main Output */ + TIMx->BDTR |= TIM_BDTR_MOE; + } + else + { + /* Disable the TIM Main Output */ + TIMx->BDTR &= (uint16_t)(~((uint16_t)TIM_BDTR_MOE)); + } +} + +/** + * @brief Enables or disables the specified TIM interrupts. + * @param TIMx: where x can be 1 to 17 to select the TIMx peripheral. + * @param TIM_IT: specifies the TIM interrupts sources to be enabled or disabled. + * This parameter can be any combination of the following values: + * @arg TIM_IT_Update: TIM update Interrupt source + * @arg TIM_IT_CC1: TIM Capture Compare 1 Interrupt source + * @arg TIM_IT_CC2: TIM Capture Compare 2 Interrupt source + * @arg TIM_IT_CC3: TIM Capture Compare 3 Interrupt source + * @arg TIM_IT_CC4: TIM Capture Compare 4 Interrupt source + * @arg TIM_IT_COM: TIM Commutation Interrupt source + * @arg TIM_IT_Trigger: TIM Trigger Interrupt source + * @arg TIM_IT_Break: TIM Break Interrupt source + * @note + * - TIM6 and TIM7 can only generate an update interrupt. + * - TIM9, TIM12 and TIM15 can have only TIM_IT_Update, TIM_IT_CC1, + * TIM_IT_CC2 or TIM_IT_Trigger. + * - TIM10, TIM11, TIM13, TIM14, TIM16 and TIM17 can have TIM_IT_Update or TIM_IT_CC1. + * - TIM_IT_Break is used only with TIM1, TIM8 and TIM15. + * - TIM_IT_COM is used only with TIM1, TIM8, TIM15, TIM16 and TIM17. + * @param NewState: new state of the TIM interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + assert_param(IS_TIM_IT(TIM_IT)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the Interrupt sources */ + TIMx->DIER |= TIM_IT; + } + else + { + /* Disable the Interrupt sources */ + TIMx->DIER &= (uint16_t)~TIM_IT; + } +} + +/** + * @brief Configures the TIMx event to be generate by software. + * @param TIMx: where x can be 1 to 17 to select the TIM peripheral. + * @param TIM_EventSource: specifies the event source. + * This parameter can be one or more of the following values: + * @arg TIM_EventSource_Update: Timer update Event source + * @arg TIM_EventSource_CC1: Timer Capture Compare 1 Event source + * @arg TIM_EventSource_CC2: Timer Capture Compare 2 Event source + * @arg TIM_EventSource_CC3: Timer Capture Compare 3 Event source + * @arg TIM_EventSource_CC4: Timer Capture Compare 4 Event source + * @arg TIM_EventSource_COM: Timer COM event source + * @arg TIM_EventSource_Trigger: Timer Trigger Event source + * @arg TIM_EventSource_Break: Timer Break event source + * @note + * - TIM6 and TIM7 can only generate an update event. + * - TIM_EventSource_COM and TIM_EventSource_Break are used only with TIM1 and TIM8. + * @retval None + */ +void TIM_GenerateEvent(TIM_TypeDef* TIMx, uint16_t TIM_EventSource) +{ + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + assert_param(IS_TIM_EVENT_SOURCE(TIM_EventSource)); + + /* Set the event sources */ + TIMx->EGR = TIM_EventSource; +} + +/** + * @brief Configures the TIMx's DMA interface. + * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 15, 16 or 17 to select + * the TIM peripheral. + * @param TIM_DMABase: DMA Base address. + * This parameter can be one of the following values: + * @arg TIM_DMABase_CR, TIM_DMABase_CR2, TIM_DMABase_SMCR, + * TIM_DMABase_DIER, TIM1_DMABase_SR, TIM_DMABase_EGR, + * TIM_DMABase_CCMR1, TIM_DMABase_CCMR2, TIM_DMABase_CCER, + * TIM_DMABase_CNT, TIM_DMABase_PSC, TIM_DMABase_ARR, + * TIM_DMABase_RCR, TIM_DMABase_CCR1, TIM_DMABase_CCR2, + * TIM_DMABase_CCR3, TIM_DMABase_CCR4, TIM_DMABase_BDTR, + * TIM_DMABase_DCR. + * @param TIM_DMABurstLength: DMA Burst length. + * This parameter can be one value between: + * TIM_DMABurstLength_1Transfer and TIM_DMABurstLength_18Transfers. + * @retval None + */ +void TIM_DMAConfig(TIM_TypeDef* TIMx, uint16_t TIM_DMABase, uint16_t TIM_DMABurstLength) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST4_PERIPH(TIMx)); + assert_param(IS_TIM_DMA_BASE(TIM_DMABase)); + assert_param(IS_TIM_DMA_LENGTH(TIM_DMABurstLength)); + /* Set the DMA Base and the DMA Burst Length */ + TIMx->DCR = TIM_DMABase | TIM_DMABurstLength; +} + +/** + * @brief Enables or disables the TIMx's DMA Requests. + * @param TIMx: where x can be 1, 2, 3, 4, 5, 6, 7, 8, 15, 16 or 17 + * to select the TIM peripheral. + * @param TIM_DMASource: specifies the DMA Request sources. + * This parameter can be any combination of the following values: + * @arg TIM_DMA_Update: TIM update Interrupt source + * @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source + * @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source + * @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source + * @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source + * @arg TIM_DMA_COM: TIM Commutation DMA source + * @arg TIM_DMA_Trigger: TIM Trigger DMA source + * @param NewState: new state of the DMA Request sources. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void TIM_DMACmd(TIM_TypeDef* TIMx, uint16_t TIM_DMASource, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST9_PERIPH(TIMx)); + assert_param(IS_TIM_DMA_SOURCE(TIM_DMASource)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the DMA sources */ + TIMx->DIER |= TIM_DMASource; + } + else + { + /* Disable the DMA sources */ + TIMx->DIER &= (uint16_t)~TIM_DMASource; + } +} + +/** + * @brief Configures the TIMx internal Clock + * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 12 or 15 + * to select the TIM peripheral. + * @retval None + */ +void TIM_InternalClockConfig(TIM_TypeDef* TIMx) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST6_PERIPH(TIMx)); + /* Disable slave mode to clock the prescaler directly with the internal clock */ + TIMx->SMCR &= (uint16_t)(~((uint16_t)TIM_SMCR_SMS)); +} + +/** + * @brief Configures the TIMx Internal Trigger as External Clock + * @param TIMx: where x can be 1, 2, 3, 4, 5, 9, 12 or 15 to select the TIM peripheral. + * @param TIM_ITRSource: Trigger source. + * This parameter can be one of the following values: + * @param TIM_TS_ITR0: Internal Trigger 0 + * @param TIM_TS_ITR1: Internal Trigger 1 + * @param TIM_TS_ITR2: Internal Trigger 2 + * @param TIM_TS_ITR3: Internal Trigger 3 + * @retval None + */ +void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST6_PERIPH(TIMx)); + assert_param(IS_TIM_INTERNAL_TRIGGER_SELECTION(TIM_InputTriggerSource)); + /* Select the Internal Trigger */ + TIM_SelectInputTrigger(TIMx, TIM_InputTriggerSource); + /* Select the External clock mode1 */ + TIMx->SMCR |= TIM_SlaveMode_External1; +} + +/** + * @brief Configures the TIMx Trigger as External Clock + * @param TIMx: where x can be 1, 2, 3, 4, 5, 9, 12 or 15 to select the TIM peripheral. + * @param TIM_TIxExternalCLKSource: Trigger source. + * This parameter can be one of the following values: + * @arg TIM_TIxExternalCLK1Source_TI1ED: TI1 Edge Detector + * @arg TIM_TIxExternalCLK1Source_TI1: Filtered Timer Input 1 + * @arg TIM_TIxExternalCLK1Source_TI2: Filtered Timer Input 2 + * @param TIM_ICPolarity: specifies the TIx Polarity. + * This parameter can be one of the following values: + * @arg TIM_ICPolarity_Rising + * @arg TIM_ICPolarity_Falling + * @param ICFilter : specifies the filter value. + * This parameter must be a value between 0x0 and 0xF. + * @retval None + */ +void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource, + uint16_t TIM_ICPolarity, uint16_t ICFilter) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST6_PERIPH(TIMx)); + assert_param(IS_TIM_TIXCLK_SOURCE(TIM_TIxExternalCLKSource)); + assert_param(IS_TIM_IC_POLARITY(TIM_ICPolarity)); + assert_param(IS_TIM_IC_FILTER(ICFilter)); + /* Configure the Timer Input Clock Source */ + if (TIM_TIxExternalCLKSource == TIM_TIxExternalCLK1Source_TI2) + { + TI2_Config(TIMx, TIM_ICPolarity, TIM_ICSelection_DirectTI, ICFilter); + } + else + { + TI1_Config(TIMx, TIM_ICPolarity, TIM_ICSelection_DirectTI, ICFilter); + } + /* Select the Trigger source */ + TIM_SelectInputTrigger(TIMx, TIM_TIxExternalCLKSource); + /* Select the External clock mode1 */ + TIMx->SMCR |= TIM_SlaveMode_External1; +} + +/** + * @brief Configures the External clock Mode1 + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_ExtTRGPrescaler: The external Trigger Prescaler. + * This parameter can be one of the following values: + * @arg TIM_ExtTRGPSC_OFF: ETRP Prescaler OFF. + * @arg TIM_ExtTRGPSC_DIV2: ETRP frequency divided by 2. + * @arg TIM_ExtTRGPSC_DIV4: ETRP frequency divided by 4. + * @arg TIM_ExtTRGPSC_DIV8: ETRP frequency divided by 8. + * @param TIM_ExtTRGPolarity: The external Trigger Polarity. + * This parameter can be one of the following values: + * @arg TIM_ExtTRGPolarity_Inverted: active low or falling edge active. + * @arg TIM_ExtTRGPolarity_NonInverted: active high or rising edge active. + * @param ExtTRGFilter: External Trigger Filter. + * This parameter must be a value between 0x00 and 0x0F + * @retval None + */ +void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, + uint16_t ExtTRGFilter) +{ + uint16_t tmpsmcr = 0; + /* Check the parameters */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + assert_param(IS_TIM_EXT_PRESCALER(TIM_ExtTRGPrescaler)); + assert_param(IS_TIM_EXT_POLARITY(TIM_ExtTRGPolarity)); + assert_param(IS_TIM_EXT_FILTER(ExtTRGFilter)); + /* Configure the ETR Clock source */ + TIM_ETRConfig(TIMx, TIM_ExtTRGPrescaler, TIM_ExtTRGPolarity, ExtTRGFilter); + + /* Get the TIMx SMCR register value */ + tmpsmcr = TIMx->SMCR; + /* Reset the SMS Bits */ + tmpsmcr &= (uint16_t)(~((uint16_t)TIM_SMCR_SMS)); + /* Select the External clock mode1 */ + tmpsmcr |= TIM_SlaveMode_External1; + /* Select the Trigger selection : ETRF */ + tmpsmcr &= (uint16_t)(~((uint16_t)TIM_SMCR_TS)); + tmpsmcr |= TIM_TS_ETRF; + /* Write to TIMx SMCR */ + TIMx->SMCR = tmpsmcr; +} + +/** + * @brief Configures the External clock Mode2 + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_ExtTRGPrescaler: The external Trigger Prescaler. + * This parameter can be one of the following values: + * @arg TIM_ExtTRGPSC_OFF: ETRP Prescaler OFF. + * @arg TIM_ExtTRGPSC_DIV2: ETRP frequency divided by 2. + * @arg TIM_ExtTRGPSC_DIV4: ETRP frequency divided by 4. + * @arg TIM_ExtTRGPSC_DIV8: ETRP frequency divided by 8. + * @param TIM_ExtTRGPolarity: The external Trigger Polarity. + * This parameter can be one of the following values: + * @arg TIM_ExtTRGPolarity_Inverted: active low or falling edge active. + * @arg TIM_ExtTRGPolarity_NonInverted: active high or rising edge active. + * @param ExtTRGFilter: External Trigger Filter. + * This parameter must be a value between 0x00 and 0x0F + * @retval None + */ +void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, + uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + assert_param(IS_TIM_EXT_PRESCALER(TIM_ExtTRGPrescaler)); + assert_param(IS_TIM_EXT_POLARITY(TIM_ExtTRGPolarity)); + assert_param(IS_TIM_EXT_FILTER(ExtTRGFilter)); + /* Configure the ETR Clock source */ + TIM_ETRConfig(TIMx, TIM_ExtTRGPrescaler, TIM_ExtTRGPolarity, ExtTRGFilter); + /* Enable the External clock mode2 */ + TIMx->SMCR |= TIM_SMCR_ECE; +} + +/** + * @brief Configures the TIMx External Trigger (ETR). + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_ExtTRGPrescaler: The external Trigger Prescaler. + * This parameter can be one of the following values: + * @arg TIM_ExtTRGPSC_OFF: ETRP Prescaler OFF. + * @arg TIM_ExtTRGPSC_DIV2: ETRP frequency divided by 2. + * @arg TIM_ExtTRGPSC_DIV4: ETRP frequency divided by 4. + * @arg TIM_ExtTRGPSC_DIV8: ETRP frequency divided by 8. + * @param TIM_ExtTRGPolarity: The external Trigger Polarity. + * This parameter can be one of the following values: + * @arg TIM_ExtTRGPolarity_Inverted: active low or falling edge active. + * @arg TIM_ExtTRGPolarity_NonInverted: active high or rising edge active. + * @param ExtTRGFilter: External Trigger Filter. + * This parameter must be a value between 0x00 and 0x0F + * @retval None + */ +void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, + uint16_t ExtTRGFilter) +{ + uint16_t tmpsmcr = 0; + /* Check the parameters */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + assert_param(IS_TIM_EXT_PRESCALER(TIM_ExtTRGPrescaler)); + assert_param(IS_TIM_EXT_POLARITY(TIM_ExtTRGPolarity)); + assert_param(IS_TIM_EXT_FILTER(ExtTRGFilter)); + tmpsmcr = TIMx->SMCR; + /* Reset the ETR Bits */ + tmpsmcr &= SMCR_ETR_Mask; + /* Set the Prescaler, the Filter value and the Polarity */ + tmpsmcr |= (uint16_t)(TIM_ExtTRGPrescaler | (uint16_t)(TIM_ExtTRGPolarity | (uint16_t)(ExtTRGFilter << (uint16_t)8))); + /* Write to TIMx SMCR */ + TIMx->SMCR = tmpsmcr; +} + +/** + * @brief Configures the TIMx Prescaler. + * @param TIMx: where x can be 1 to 17 to select the TIM peripheral. + * @param Prescaler: specifies the Prescaler Register value + * @param TIM_PSCReloadMode: specifies the TIM Prescaler Reload mode + * This parameter can be one of the following values: + * @arg TIM_PSCReloadMode_Update: The Prescaler is loaded at the update event. + * @arg TIM_PSCReloadMode_Immediate: The Prescaler is loaded immediately. + * @retval None + */ +void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode) +{ + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + assert_param(IS_TIM_PRESCALER_RELOAD(TIM_PSCReloadMode)); + /* Set the Prescaler value */ + TIMx->PSC = Prescaler; + /* Set or reset the UG Bit */ + TIMx->EGR = TIM_PSCReloadMode; +} + +/** + * @brief Specifies the TIMx Counter Mode to be used. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_CounterMode: specifies the Counter Mode to be used + * This parameter can be one of the following values: + * @arg TIM_CounterMode_Up: TIM Up Counting Mode + * @arg TIM_CounterMode_Down: TIM Down Counting Mode + * @arg TIM_CounterMode_CenterAligned1: TIM Center Aligned Mode1 + * @arg TIM_CounterMode_CenterAligned2: TIM Center Aligned Mode2 + * @arg TIM_CounterMode_CenterAligned3: TIM Center Aligned Mode3 + * @retval None + */ +void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode) +{ + uint16_t tmpcr1 = 0; + /* Check the parameters */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + assert_param(IS_TIM_COUNTER_MODE(TIM_CounterMode)); + tmpcr1 = TIMx->CR1; + /* Reset the CMS and DIR Bits */ + tmpcr1 &= (uint16_t)(~((uint16_t)(TIM_CR1_DIR | TIM_CR1_CMS))); + /* Set the Counter Mode */ + tmpcr1 |= TIM_CounterMode; + /* Write to TIMx CR1 register */ + TIMx->CR1 = tmpcr1; +} + +/** + * @brief Selects the Input Trigger source + * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 12 or 15 to select the TIM peripheral. + * @param TIM_InputTriggerSource: The Input Trigger source. + * This parameter can be one of the following values: + * @arg TIM_TS_ITR0: Internal Trigger 0 + * @arg TIM_TS_ITR1: Internal Trigger 1 + * @arg TIM_TS_ITR2: Internal Trigger 2 + * @arg TIM_TS_ITR3: Internal Trigger 3 + * @arg TIM_TS_TI1F_ED: TI1 Edge Detector + * @arg TIM_TS_TI1FP1: Filtered Timer Input 1 + * @arg TIM_TS_TI2FP2: Filtered Timer Input 2 + * @arg TIM_TS_ETRF: External Trigger input + * @retval None + */ +void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource) +{ + uint16_t tmpsmcr = 0; + /* Check the parameters */ + assert_param(IS_TIM_LIST6_PERIPH(TIMx)); + assert_param(IS_TIM_TRIGGER_SELECTION(TIM_InputTriggerSource)); + /* Get the TIMx SMCR register value */ + tmpsmcr = TIMx->SMCR; + /* Reset the TS Bits */ + tmpsmcr &= (uint16_t)(~((uint16_t)TIM_SMCR_TS)); + /* Set the Input Trigger source */ + tmpsmcr |= TIM_InputTriggerSource; + /* Write to TIMx SMCR */ + TIMx->SMCR = tmpsmcr; +} + +/** + * @brief Configures the TIMx Encoder Interface. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_EncoderMode: specifies the TIMx Encoder Mode. + * This parameter can be one of the following values: + * @arg TIM_EncoderMode_TI1: Counter counts on TI1FP1 edge depending on TI2FP2 level. + * @arg TIM_EncoderMode_TI2: Counter counts on TI2FP2 edge depending on TI1FP1 level. + * @arg TIM_EncoderMode_TI12: Counter counts on both TI1FP1 and TI2FP2 edges depending + * on the level of the other input. + * @param TIM_IC1Polarity: specifies the IC1 Polarity + * This parameter can be one of the following values: + * @arg TIM_ICPolarity_Falling: IC Falling edge. + * @arg TIM_ICPolarity_Rising: IC Rising edge. + * @param TIM_IC2Polarity: specifies the IC2 Polarity + * This parameter can be one of the following values: + * @arg TIM_ICPolarity_Falling: IC Falling edge. + * @arg TIM_ICPolarity_Rising: IC Rising edge. + * @retval None + */ +void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode, + uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity) +{ + uint16_t tmpsmcr = 0; + uint16_t tmpccmr1 = 0; + uint16_t tmpccer = 0; + + /* Check the parameters */ + assert_param(IS_TIM_LIST5_PERIPH(TIMx)); + assert_param(IS_TIM_ENCODER_MODE(TIM_EncoderMode)); + assert_param(IS_TIM_IC_POLARITY(TIM_IC1Polarity)); + assert_param(IS_TIM_IC_POLARITY(TIM_IC2Polarity)); + + /* Get the TIMx SMCR register value */ + tmpsmcr = TIMx->SMCR; + + /* Get the TIMx CCMR1 register value */ + tmpccmr1 = TIMx->CCMR1; + + /* Get the TIMx CCER register value */ + tmpccer = TIMx->CCER; + + /* Set the encoder Mode */ + tmpsmcr &= (uint16_t)(~((uint16_t)TIM_SMCR_SMS)); + tmpsmcr |= TIM_EncoderMode; + + /* Select the Capture Compare 1 and the Capture Compare 2 as input */ + tmpccmr1 &= (uint16_t)(((uint16_t)~((uint16_t)TIM_CCMR1_CC1S)) & (uint16_t)(~((uint16_t)TIM_CCMR1_CC2S))); + tmpccmr1 |= TIM_CCMR1_CC1S_0 | TIM_CCMR1_CC2S_0; + + /* Set the TI1 and the TI2 Polarities */ + tmpccer &= (uint16_t)(((uint16_t)~((uint16_t)TIM_CCER_CC1P)) & ((uint16_t)~((uint16_t)TIM_CCER_CC2P))); + tmpccer |= (uint16_t)(TIM_IC1Polarity | (uint16_t)(TIM_IC2Polarity << (uint16_t)4)); + + /* Write to TIMx SMCR */ + TIMx->SMCR = tmpsmcr; + /* Write to TIMx CCMR1 */ + TIMx->CCMR1 = tmpccmr1; + /* Write to TIMx CCER */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Forces the TIMx output 1 waveform to active or inactive level. + * @param TIMx: where x can be 1 to 17 except 6 and 7 to select the TIM peripheral. + * @param TIM_ForcedAction: specifies the forced Action to be set to the output waveform. + * This parameter can be one of the following values: + * @arg TIM_ForcedAction_Active: Force active level on OC1REF + * @arg TIM_ForcedAction_InActive: Force inactive level on OC1REF. + * @retval None + */ +void TIM_ForcedOC1Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction) +{ + uint16_t tmpccmr1 = 0; + /* Check the parameters */ + assert_param(IS_TIM_LIST8_PERIPH(TIMx)); + assert_param(IS_TIM_FORCED_ACTION(TIM_ForcedAction)); + tmpccmr1 = TIMx->CCMR1; + /* Reset the OC1M Bits */ + tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC1M); + /* Configure The Forced output Mode */ + tmpccmr1 |= TIM_ForcedAction; + /* Write to TIMx CCMR1 register */ + TIMx->CCMR1 = tmpccmr1; +} + +/** + * @brief Forces the TIMx output 2 waveform to active or inactive level. + * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 12 or 15 to select the TIM peripheral. + * @param TIM_ForcedAction: specifies the forced Action to be set to the output waveform. + * This parameter can be one of the following values: + * @arg TIM_ForcedAction_Active: Force active level on OC2REF + * @arg TIM_ForcedAction_InActive: Force inactive level on OC2REF. + * @retval None + */ +void TIM_ForcedOC2Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction) +{ + uint16_t tmpccmr1 = 0; + /* Check the parameters */ + assert_param(IS_TIM_LIST6_PERIPH(TIMx)); + assert_param(IS_TIM_FORCED_ACTION(TIM_ForcedAction)); + tmpccmr1 = TIMx->CCMR1; + /* Reset the OC2M Bits */ + tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC2M); + /* Configure The Forced output Mode */ + tmpccmr1 |= (uint16_t)(TIM_ForcedAction << 8); + /* Write to TIMx CCMR1 register */ + TIMx->CCMR1 = tmpccmr1; +} + +/** + * @brief Forces the TIMx output 3 waveform to active or inactive level. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_ForcedAction: specifies the forced Action to be set to the output waveform. + * This parameter can be one of the following values: + * @arg TIM_ForcedAction_Active: Force active level on OC3REF + * @arg TIM_ForcedAction_InActive: Force inactive level on OC3REF. + * @retval None + */ +void TIM_ForcedOC3Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction) +{ + uint16_t tmpccmr2 = 0; + /* Check the parameters */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + assert_param(IS_TIM_FORCED_ACTION(TIM_ForcedAction)); + tmpccmr2 = TIMx->CCMR2; + /* Reset the OC1M Bits */ + tmpccmr2 &= (uint16_t)~((uint16_t)TIM_CCMR2_OC3M); + /* Configure The Forced output Mode */ + tmpccmr2 |= TIM_ForcedAction; + /* Write to TIMx CCMR2 register */ + TIMx->CCMR2 = tmpccmr2; +} + +/** + * @brief Forces the TIMx output 4 waveform to active or inactive level. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_ForcedAction: specifies the forced Action to be set to the output waveform. + * This parameter can be one of the following values: + * @arg TIM_ForcedAction_Active: Force active level on OC4REF + * @arg TIM_ForcedAction_InActive: Force inactive level on OC4REF. + * @retval None + */ +void TIM_ForcedOC4Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction) +{ + uint16_t tmpccmr2 = 0; + /* Check the parameters */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + assert_param(IS_TIM_FORCED_ACTION(TIM_ForcedAction)); + tmpccmr2 = TIMx->CCMR2; + /* Reset the OC2M Bits */ + tmpccmr2 &= (uint16_t)~((uint16_t)TIM_CCMR2_OC4M); + /* Configure The Forced output Mode */ + tmpccmr2 |= (uint16_t)(TIM_ForcedAction << 8); + /* Write to TIMx CCMR2 register */ + TIMx->CCMR2 = tmpccmr2; +} + +/** + * @brief Enables or disables TIMx peripheral Preload register on ARR. + * @param TIMx: where x can be 1 to 17 to select the TIM peripheral. + * @param NewState: new state of the TIMx peripheral Preload register + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Set the ARR Preload Bit */ + TIMx->CR1 |= TIM_CR1_ARPE; + } + else + { + /* Reset the ARR Preload Bit */ + TIMx->CR1 &= (uint16_t)~((uint16_t)TIM_CR1_ARPE); + } +} + +/** + * @brief Selects the TIM peripheral Commutation event. + * @param TIMx: where x can be 1, 8, 15, 16 or 17 to select the TIMx peripheral + * @param NewState: new state of the Commutation event. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void TIM_SelectCOM(TIM_TypeDef* TIMx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST2_PERIPH(TIMx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Set the COM Bit */ + TIMx->CR2 |= TIM_CR2_CCUS; + } + else + { + /* Reset the COM Bit */ + TIMx->CR2 &= (uint16_t)~((uint16_t)TIM_CR2_CCUS); + } +} + +/** + * @brief Selects the TIMx peripheral Capture Compare DMA source. + * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 15, 16 or 17 to select + * the TIM peripheral. + * @param NewState: new state of the Capture Compare DMA source + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void TIM_SelectCCDMA(TIM_TypeDef* TIMx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST4_PERIPH(TIMx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Set the CCDS Bit */ + TIMx->CR2 |= TIM_CR2_CCDS; + } + else + { + /* Reset the CCDS Bit */ + TIMx->CR2 &= (uint16_t)~((uint16_t)TIM_CR2_CCDS); + } +} + +/** + * @brief Sets or Resets the TIM peripheral Capture Compare Preload Control bit. + * @param TIMx: where x can be 1, 2, 3, 4, 5, 8 or 15 + * to select the TIMx peripheral + * @param NewState: new state of the Capture Compare Preload Control bit + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void TIM_CCPreloadControl(TIM_TypeDef* TIMx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST5_PERIPH(TIMx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Set the CCPC Bit */ + TIMx->CR2 |= TIM_CR2_CCPC; + } + else + { + /* Reset the CCPC Bit */ + TIMx->CR2 &= (uint16_t)~((uint16_t)TIM_CR2_CCPC); + } +} + +/** + * @brief Enables or disables the TIMx peripheral Preload register on CCR1. + * @param TIMx: where x can be 1 to 17 except 6 and 7 to select the TIM peripheral. + * @param TIM_OCPreload: new state of the TIMx peripheral Preload register + * This parameter can be one of the following values: + * @arg TIM_OCPreload_Enable + * @arg TIM_OCPreload_Disable + * @retval None + */ +void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload) +{ + uint16_t tmpccmr1 = 0; + /* Check the parameters */ + assert_param(IS_TIM_LIST8_PERIPH(TIMx)); + assert_param(IS_TIM_OCPRELOAD_STATE(TIM_OCPreload)); + tmpccmr1 = TIMx->CCMR1; + /* Reset the OC1PE Bit */ + tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC1PE); + /* Enable or Disable the Output Compare Preload feature */ + tmpccmr1 |= TIM_OCPreload; + /* Write to TIMx CCMR1 register */ + TIMx->CCMR1 = tmpccmr1; +} + +/** + * @brief Enables or disables the TIMx peripheral Preload register on CCR2. + * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 12 or 15 to select + * the TIM peripheral. + * @param TIM_OCPreload: new state of the TIMx peripheral Preload register + * This parameter can be one of the following values: + * @arg TIM_OCPreload_Enable + * @arg TIM_OCPreload_Disable + * @retval None + */ +void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload) +{ + uint16_t tmpccmr1 = 0; + /* Check the parameters */ + assert_param(IS_TIM_LIST6_PERIPH(TIMx)); + assert_param(IS_TIM_OCPRELOAD_STATE(TIM_OCPreload)); + tmpccmr1 = TIMx->CCMR1; + /* Reset the OC2PE Bit */ + tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC2PE); + /* Enable or Disable the Output Compare Preload feature */ + tmpccmr1 |= (uint16_t)(TIM_OCPreload << 8); + /* Write to TIMx CCMR1 register */ + TIMx->CCMR1 = tmpccmr1; +} + +/** + * @brief Enables or disables the TIMx peripheral Preload register on CCR3. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_OCPreload: new state of the TIMx peripheral Preload register + * This parameter can be one of the following values: + * @arg TIM_OCPreload_Enable + * @arg TIM_OCPreload_Disable + * @retval None + */ +void TIM_OC3PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload) +{ + uint16_t tmpccmr2 = 0; + /* Check the parameters */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + assert_param(IS_TIM_OCPRELOAD_STATE(TIM_OCPreload)); + tmpccmr2 = TIMx->CCMR2; + /* Reset the OC3PE Bit */ + tmpccmr2 &= (uint16_t)~((uint16_t)TIM_CCMR2_OC3PE); + /* Enable or Disable the Output Compare Preload feature */ + tmpccmr2 |= TIM_OCPreload; + /* Write to TIMx CCMR2 register */ + TIMx->CCMR2 = tmpccmr2; +} + +/** + * @brief Enables or disables the TIMx peripheral Preload register on CCR4. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_OCPreload: new state of the TIMx peripheral Preload register + * This parameter can be one of the following values: + * @arg TIM_OCPreload_Enable + * @arg TIM_OCPreload_Disable + * @retval None + */ +void TIM_OC4PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload) +{ + uint16_t tmpccmr2 = 0; + /* Check the parameters */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + assert_param(IS_TIM_OCPRELOAD_STATE(TIM_OCPreload)); + tmpccmr2 = TIMx->CCMR2; + /* Reset the OC4PE Bit */ + tmpccmr2 &= (uint16_t)~((uint16_t)TIM_CCMR2_OC4PE); + /* Enable or Disable the Output Compare Preload feature */ + tmpccmr2 |= (uint16_t)(TIM_OCPreload << 8); + /* Write to TIMx CCMR2 register */ + TIMx->CCMR2 = tmpccmr2; +} + +/** + * @brief Configures the TIMx Output Compare 1 Fast feature. + * @param TIMx: where x can be 1 to 17 except 6 and 7 to select the TIM peripheral. + * @param TIM_OCFast: new state of the Output Compare Fast Enable Bit. + * This parameter can be one of the following values: + * @arg TIM_OCFast_Enable: TIM output compare fast enable + * @arg TIM_OCFast_Disable: TIM output compare fast disable + * @retval None + */ +void TIM_OC1FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast) +{ + uint16_t tmpccmr1 = 0; + /* Check the parameters */ + assert_param(IS_TIM_LIST8_PERIPH(TIMx)); + assert_param(IS_TIM_OCFAST_STATE(TIM_OCFast)); + /* Get the TIMx CCMR1 register value */ + tmpccmr1 = TIMx->CCMR1; + /* Reset the OC1FE Bit */ + tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC1FE); + /* Enable or Disable the Output Compare Fast Bit */ + tmpccmr1 |= TIM_OCFast; + /* Write to TIMx CCMR1 */ + TIMx->CCMR1 = tmpccmr1; +} + +/** + * @brief Configures the TIMx Output Compare 2 Fast feature. + * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 12 or 15 to select + * the TIM peripheral. + * @param TIM_OCFast: new state of the Output Compare Fast Enable Bit. + * This parameter can be one of the following values: + * @arg TIM_OCFast_Enable: TIM output compare fast enable + * @arg TIM_OCFast_Disable: TIM output compare fast disable + * @retval None + */ +void TIM_OC2FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast) +{ + uint16_t tmpccmr1 = 0; + /* Check the parameters */ + assert_param(IS_TIM_LIST6_PERIPH(TIMx)); + assert_param(IS_TIM_OCFAST_STATE(TIM_OCFast)); + /* Get the TIMx CCMR1 register value */ + tmpccmr1 = TIMx->CCMR1; + /* Reset the OC2FE Bit */ + tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC2FE); + /* Enable or Disable the Output Compare Fast Bit */ + tmpccmr1 |= (uint16_t)(TIM_OCFast << 8); + /* Write to TIMx CCMR1 */ + TIMx->CCMR1 = tmpccmr1; +} + +/** + * @brief Configures the TIMx Output Compare 3 Fast feature. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_OCFast: new state of the Output Compare Fast Enable Bit. + * This parameter can be one of the following values: + * @arg TIM_OCFast_Enable: TIM output compare fast enable + * @arg TIM_OCFast_Disable: TIM output compare fast disable + * @retval None + */ +void TIM_OC3FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast) +{ + uint16_t tmpccmr2 = 0; + /* Check the parameters */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + assert_param(IS_TIM_OCFAST_STATE(TIM_OCFast)); + /* Get the TIMx CCMR2 register value */ + tmpccmr2 = TIMx->CCMR2; + /* Reset the OC3FE Bit */ + tmpccmr2 &= (uint16_t)~((uint16_t)TIM_CCMR2_OC3FE); + /* Enable or Disable the Output Compare Fast Bit */ + tmpccmr2 |= TIM_OCFast; + /* Write to TIMx CCMR2 */ + TIMx->CCMR2 = tmpccmr2; +} + +/** + * @brief Configures the TIMx Output Compare 4 Fast feature. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_OCFast: new state of the Output Compare Fast Enable Bit. + * This parameter can be one of the following values: + * @arg TIM_OCFast_Enable: TIM output compare fast enable + * @arg TIM_OCFast_Disable: TIM output compare fast disable + * @retval None + */ +void TIM_OC4FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast) +{ + uint16_t tmpccmr2 = 0; + /* Check the parameters */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + assert_param(IS_TIM_OCFAST_STATE(TIM_OCFast)); + /* Get the TIMx CCMR2 register value */ + tmpccmr2 = TIMx->CCMR2; + /* Reset the OC4FE Bit */ + tmpccmr2 &= (uint16_t)~((uint16_t)TIM_CCMR2_OC4FE); + /* Enable or Disable the Output Compare Fast Bit */ + tmpccmr2 |= (uint16_t)(TIM_OCFast << 8); + /* Write to TIMx CCMR2 */ + TIMx->CCMR2 = tmpccmr2; +} + +/** + * @brief Clears or safeguards the OCREF1 signal on an external event + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_OCClear: new state of the Output Compare Clear Enable Bit. + * This parameter can be one of the following values: + * @arg TIM_OCClear_Enable: TIM Output clear enable + * @arg TIM_OCClear_Disable: TIM Output clear disable + * @retval None + */ +void TIM_ClearOC1Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear) +{ + uint16_t tmpccmr1 = 0; + /* Check the parameters */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + assert_param(IS_TIM_OCCLEAR_STATE(TIM_OCClear)); + + tmpccmr1 = TIMx->CCMR1; + + /* Reset the OC1CE Bit */ + tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC1CE); + /* Enable or Disable the Output Compare Clear Bit */ + tmpccmr1 |= TIM_OCClear; + /* Write to TIMx CCMR1 register */ + TIMx->CCMR1 = tmpccmr1; +} + +/** + * @brief Clears or safeguards the OCREF2 signal on an external event + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_OCClear: new state of the Output Compare Clear Enable Bit. + * This parameter can be one of the following values: + * @arg TIM_OCClear_Enable: TIM Output clear enable + * @arg TIM_OCClear_Disable: TIM Output clear disable + * @retval None + */ +void TIM_ClearOC2Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear) +{ + uint16_t tmpccmr1 = 0; + /* Check the parameters */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + assert_param(IS_TIM_OCCLEAR_STATE(TIM_OCClear)); + tmpccmr1 = TIMx->CCMR1; + /* Reset the OC2CE Bit */ + tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC2CE); + /* Enable or Disable the Output Compare Clear Bit */ + tmpccmr1 |= (uint16_t)(TIM_OCClear << 8); + /* Write to TIMx CCMR1 register */ + TIMx->CCMR1 = tmpccmr1; +} + +/** + * @brief Clears or safeguards the OCREF3 signal on an external event + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_OCClear: new state of the Output Compare Clear Enable Bit. + * This parameter can be one of the following values: + * @arg TIM_OCClear_Enable: TIM Output clear enable + * @arg TIM_OCClear_Disable: TIM Output clear disable + * @retval None + */ +void TIM_ClearOC3Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear) +{ + uint16_t tmpccmr2 = 0; + /* Check the parameters */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + assert_param(IS_TIM_OCCLEAR_STATE(TIM_OCClear)); + tmpccmr2 = TIMx->CCMR2; + /* Reset the OC3CE Bit */ + tmpccmr2 &= (uint16_t)~((uint16_t)TIM_CCMR2_OC3CE); + /* Enable or Disable the Output Compare Clear Bit */ + tmpccmr2 |= TIM_OCClear; + /* Write to TIMx CCMR2 register */ + TIMx->CCMR2 = tmpccmr2; +} + +/** + * @brief Clears or safeguards the OCREF4 signal on an external event + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_OCClear: new state of the Output Compare Clear Enable Bit. + * This parameter can be one of the following values: + * @arg TIM_OCClear_Enable: TIM Output clear enable + * @arg TIM_OCClear_Disable: TIM Output clear disable + * @retval None + */ +void TIM_ClearOC4Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear) +{ + uint16_t tmpccmr2 = 0; + /* Check the parameters */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + assert_param(IS_TIM_OCCLEAR_STATE(TIM_OCClear)); + tmpccmr2 = TIMx->CCMR2; + /* Reset the OC4CE Bit */ + tmpccmr2 &= (uint16_t)~((uint16_t)TIM_CCMR2_OC4CE); + /* Enable or Disable the Output Compare Clear Bit */ + tmpccmr2 |= (uint16_t)(TIM_OCClear << 8); + /* Write to TIMx CCMR2 register */ + TIMx->CCMR2 = tmpccmr2; +} + +/** + * @brief Configures the TIMx channel 1 polarity. + * @param TIMx: where x can be 1 to 17 except 6 and 7 to select the TIM peripheral. + * @param TIM_OCPolarity: specifies the OC1 Polarity + * This parameter can be one of the following values: + * @arg TIM_OCPolarity_High: Output Compare active high + * @arg TIM_OCPolarity_Low: Output Compare active low + * @retval None + */ +void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity) +{ + uint16_t tmpccer = 0; + /* Check the parameters */ + assert_param(IS_TIM_LIST8_PERIPH(TIMx)); + assert_param(IS_TIM_OC_POLARITY(TIM_OCPolarity)); + tmpccer = TIMx->CCER; + /* Set or Reset the CC1P Bit */ + tmpccer &= (uint16_t)~((uint16_t)TIM_CCER_CC1P); + tmpccer |= TIM_OCPolarity; + /* Write to TIMx CCER register */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Configures the TIMx Channel 1N polarity. + * @param TIMx: where x can be 1, 8, 15, 16 or 17 to select the TIM peripheral. + * @param TIM_OCNPolarity: specifies the OC1N Polarity + * This parameter can be one of the following values: + * @arg TIM_OCNPolarity_High: Output Compare active high + * @arg TIM_OCNPolarity_Low: Output Compare active low + * @retval None + */ +void TIM_OC1NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity) +{ + uint16_t tmpccer = 0; + /* Check the parameters */ + assert_param(IS_TIM_LIST2_PERIPH(TIMx)); + assert_param(IS_TIM_OCN_POLARITY(TIM_OCNPolarity)); + + tmpccer = TIMx->CCER; + /* Set or Reset the CC1NP Bit */ + tmpccer &= (uint16_t)~((uint16_t)TIM_CCER_CC1NP); + tmpccer |= TIM_OCNPolarity; + /* Write to TIMx CCER register */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Configures the TIMx channel 2 polarity. + * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 12 or 15 to select the TIM peripheral. + * @param TIM_OCPolarity: specifies the OC2 Polarity + * This parameter can be one of the following values: + * @arg TIM_OCPolarity_High: Output Compare active high + * @arg TIM_OCPolarity_Low: Output Compare active low + * @retval None + */ +void TIM_OC2PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity) +{ + uint16_t tmpccer = 0; + /* Check the parameters */ + assert_param(IS_TIM_LIST6_PERIPH(TIMx)); + assert_param(IS_TIM_OC_POLARITY(TIM_OCPolarity)); + tmpccer = TIMx->CCER; + /* Set or Reset the CC2P Bit */ + tmpccer &= (uint16_t)~((uint16_t)TIM_CCER_CC2P); + tmpccer |= (uint16_t)(TIM_OCPolarity << 4); + /* Write to TIMx CCER register */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Configures the TIMx Channel 2N polarity. + * @param TIMx: where x can be 1 or 8 to select the TIM peripheral. + * @param TIM_OCNPolarity: specifies the OC2N Polarity + * This parameter can be one of the following values: + * @arg TIM_OCNPolarity_High: Output Compare active high + * @arg TIM_OCNPolarity_Low: Output Compare active low + * @retval None + */ +void TIM_OC2NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity) +{ + uint16_t tmpccer = 0; + /* Check the parameters */ + assert_param(IS_TIM_LIST1_PERIPH(TIMx)); + assert_param(IS_TIM_OCN_POLARITY(TIM_OCNPolarity)); + + tmpccer = TIMx->CCER; + /* Set or Reset the CC2NP Bit */ + tmpccer &= (uint16_t)~((uint16_t)TIM_CCER_CC2NP); + tmpccer |= (uint16_t)(TIM_OCNPolarity << 4); + /* Write to TIMx CCER register */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Configures the TIMx channel 3 polarity. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_OCPolarity: specifies the OC3 Polarity + * This parameter can be one of the following values: + * @arg TIM_OCPolarity_High: Output Compare active high + * @arg TIM_OCPolarity_Low: Output Compare active low + * @retval None + */ +void TIM_OC3PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity) +{ + uint16_t tmpccer = 0; + /* Check the parameters */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + assert_param(IS_TIM_OC_POLARITY(TIM_OCPolarity)); + tmpccer = TIMx->CCER; + /* Set or Reset the CC3P Bit */ + tmpccer &= (uint16_t)~((uint16_t)TIM_CCER_CC3P); + tmpccer |= (uint16_t)(TIM_OCPolarity << 8); + /* Write to TIMx CCER register */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Configures the TIMx Channel 3N polarity. + * @param TIMx: where x can be 1 or 8 to select the TIM peripheral. + * @param TIM_OCNPolarity: specifies the OC3N Polarity + * This parameter can be one of the following values: + * @arg TIM_OCNPolarity_High: Output Compare active high + * @arg TIM_OCNPolarity_Low: Output Compare active low + * @retval None + */ +void TIM_OC3NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity) +{ + uint16_t tmpccer = 0; + + /* Check the parameters */ + assert_param(IS_TIM_LIST1_PERIPH(TIMx)); + assert_param(IS_TIM_OCN_POLARITY(TIM_OCNPolarity)); + + tmpccer = TIMx->CCER; + /* Set or Reset the CC3NP Bit */ + tmpccer &= (uint16_t)~((uint16_t)TIM_CCER_CC3NP); + tmpccer |= (uint16_t)(TIM_OCNPolarity << 8); + /* Write to TIMx CCER register */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Configures the TIMx channel 4 polarity. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_OCPolarity: specifies the OC4 Polarity + * This parameter can be one of the following values: + * @arg TIM_OCPolarity_High: Output Compare active high + * @arg TIM_OCPolarity_Low: Output Compare active low + * @retval None + */ +void TIM_OC4PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity) +{ + uint16_t tmpccer = 0; + /* Check the parameters */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + assert_param(IS_TIM_OC_POLARITY(TIM_OCPolarity)); + tmpccer = TIMx->CCER; + /* Set or Reset the CC4P Bit */ + tmpccer &= (uint16_t)~((uint16_t)TIM_CCER_CC4P); + tmpccer |= (uint16_t)(TIM_OCPolarity << 12); + /* Write to TIMx CCER register */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Enables or disables the TIM Capture Compare Channel x. + * @param TIMx: where x can be 1 to 17 except 6 and 7 to select the TIM peripheral. + * @param TIM_Channel: specifies the TIM Channel + * This parameter can be one of the following values: + * @arg TIM_Channel_1: TIM Channel 1 + * @arg TIM_Channel_2: TIM Channel 2 + * @arg TIM_Channel_3: TIM Channel 3 + * @arg TIM_Channel_4: TIM Channel 4 + * @param TIM_CCx: specifies the TIM Channel CCxE bit new state. + * This parameter can be: TIM_CCx_Enable or TIM_CCx_Disable. + * @retval None + */ +void TIM_CCxCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCx) +{ + uint16_t tmp = 0; + + /* Check the parameters */ + assert_param(IS_TIM_LIST8_PERIPH(TIMx)); + assert_param(IS_TIM_CHANNEL(TIM_Channel)); + assert_param(IS_TIM_CCX(TIM_CCx)); + + tmp = CCER_CCE_Set << TIM_Channel; + + /* Reset the CCxE Bit */ + TIMx->CCER &= (uint16_t)~ tmp; + + /* Set or reset the CCxE Bit */ + TIMx->CCER |= (uint16_t)(TIM_CCx << TIM_Channel); +} + +/** + * @brief Enables or disables the TIM Capture Compare Channel xN. + * @param TIMx: where x can be 1, 8, 15, 16 or 17 to select the TIM peripheral. + * @param TIM_Channel: specifies the TIM Channel + * This parameter can be one of the following values: + * @arg TIM_Channel_1: TIM Channel 1 + * @arg TIM_Channel_2: TIM Channel 2 + * @arg TIM_Channel_3: TIM Channel 3 + * @param TIM_CCxN: specifies the TIM Channel CCxNE bit new state. + * This parameter can be: TIM_CCxN_Enable or TIM_CCxN_Disable. + * @retval None + */ +void TIM_CCxNCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCxN) +{ + uint16_t tmp = 0; + + /* Check the parameters */ + assert_param(IS_TIM_LIST2_PERIPH(TIMx)); + assert_param(IS_TIM_COMPLEMENTARY_CHANNEL(TIM_Channel)); + assert_param(IS_TIM_CCXN(TIM_CCxN)); + + tmp = CCER_CCNE_Set << TIM_Channel; + + /* Reset the CCxNE Bit */ + TIMx->CCER &= (uint16_t) ~tmp; + + /* Set or reset the CCxNE Bit */ + TIMx->CCER |= (uint16_t)(TIM_CCxN << TIM_Channel); +} + +/** + * @brief Selects the TIM Output Compare Mode. + * @note This function disables the selected channel before changing the Output + * Compare Mode. + * User has to enable this channel using TIM_CCxCmd and TIM_CCxNCmd functions. + * @param TIMx: where x can be 1 to 17 except 6 and 7 to select the TIM peripheral. + * @param TIM_Channel: specifies the TIM Channel + * This parameter can be one of the following values: + * @arg TIM_Channel_1: TIM Channel 1 + * @arg TIM_Channel_2: TIM Channel 2 + * @arg TIM_Channel_3: TIM Channel 3 + * @arg TIM_Channel_4: TIM Channel 4 + * @param TIM_OCMode: specifies the TIM Output Compare Mode. + * This parameter can be one of the following values: + * @arg TIM_OCMode_Timing + * @arg TIM_OCMode_Active + * @arg TIM_OCMode_Toggle + * @arg TIM_OCMode_PWM1 + * @arg TIM_OCMode_PWM2 + * @arg TIM_ForcedAction_Active + * @arg TIM_ForcedAction_InActive + * @retval None + */ +void TIM_SelectOCxM(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode) +{ + uint32_t tmp = 0; + uint16_t tmp1 = 0; + + /* Check the parameters */ + assert_param(IS_TIM_LIST8_PERIPH(TIMx)); + assert_param(IS_TIM_CHANNEL(TIM_Channel)); + assert_param(IS_TIM_OCM(TIM_OCMode)); + + tmp = (uint32_t) TIMx; + tmp += CCMR_Offset; + + tmp1 = CCER_CCE_Set << (uint16_t)TIM_Channel; + + /* Disable the Channel: Reset the CCxE Bit */ + TIMx->CCER &= (uint16_t) ~tmp1; + + if((TIM_Channel == TIM_Channel_1) ||(TIM_Channel == TIM_Channel_3)) + { + tmp += (TIM_Channel>>1); + + /* Reset the OCxM bits in the CCMRx register */ + *(__IO uint32_t *) tmp &= (uint32_t)~((uint32_t)TIM_CCMR1_OC1M); + + /* Configure the OCxM bits in the CCMRx register */ + *(__IO uint32_t *) tmp |= TIM_OCMode; + } + else + { + tmp += (uint16_t)(TIM_Channel - (uint16_t)4)>> (uint16_t)1; + + /* Reset the OCxM bits in the CCMRx register */ + *(__IO uint32_t *) tmp &= (uint32_t)~((uint32_t)TIM_CCMR1_OC2M); + + /* Configure the OCxM bits in the CCMRx register */ + *(__IO uint32_t *) tmp |= (uint16_t)(TIM_OCMode << 8); + } +} + +/** + * @brief Enables or Disables the TIMx Update event. + * @param TIMx: where x can be 1 to 17 to select the TIM peripheral. + * @param NewState: new state of the TIMx UDIS bit + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void TIM_UpdateDisableConfig(TIM_TypeDef* TIMx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Set the Update Disable Bit */ + TIMx->CR1 |= TIM_CR1_UDIS; + } + else + { + /* Reset the Update Disable Bit */ + TIMx->CR1 &= (uint16_t)~((uint16_t)TIM_CR1_UDIS); + } +} + +/** + * @brief Configures the TIMx Update Request Interrupt source. + * @param TIMx: where x can be 1 to 17 to select the TIM peripheral. + * @param TIM_UpdateSource: specifies the Update source. + * This parameter can be one of the following values: + * @arg TIM_UpdateSource_Regular: Source of update is the counter overflow/underflow + or the setting of UG bit, or an update generation + through the slave mode controller. + * @arg TIM_UpdateSource_Global: Source of update is counter overflow/underflow. + * @retval None + */ +void TIM_UpdateRequestConfig(TIM_TypeDef* TIMx, uint16_t TIM_UpdateSource) +{ + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + assert_param(IS_TIM_UPDATE_SOURCE(TIM_UpdateSource)); + if (TIM_UpdateSource != TIM_UpdateSource_Global) + { + /* Set the URS Bit */ + TIMx->CR1 |= TIM_CR1_URS; + } + else + { + /* Reset the URS Bit */ + TIMx->CR1 &= (uint16_t)~((uint16_t)TIM_CR1_URS); + } +} + +/** + * @brief Enables or disables the TIMx's Hall sensor interface. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param NewState: new state of the TIMx Hall sensor interface. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void TIM_SelectHallSensor(TIM_TypeDef* TIMx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST6_PERIPH(TIMx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Set the TI1S Bit */ + TIMx->CR2 |= TIM_CR2_TI1S; + } + else + { + /* Reset the TI1S Bit */ + TIMx->CR2 &= (uint16_t)~((uint16_t)TIM_CR2_TI1S); + } +} + +/** + * @brief Selects the TIMx's One Pulse Mode. + * @param TIMx: where x can be 1 to 17 to select the TIM peripheral. + * @param TIM_OPMode: specifies the OPM Mode to be used. + * This parameter can be one of the following values: + * @arg TIM_OPMode_Single + * @arg TIM_OPMode_Repetitive + * @retval None + */ +void TIM_SelectOnePulseMode(TIM_TypeDef* TIMx, uint16_t TIM_OPMode) +{ + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + assert_param(IS_TIM_OPM_MODE(TIM_OPMode)); + /* Reset the OPM Bit */ + TIMx->CR1 &= (uint16_t)~((uint16_t)TIM_CR1_OPM); + /* Configure the OPM Mode */ + TIMx->CR1 |= TIM_OPMode; +} + +/** + * @brief Selects the TIMx Trigger Output Mode. + * @param TIMx: where x can be 1, 2, 3, 4, 5, 6, 7, 8, 9, 12 or 15 to select the TIM peripheral. + * @param TIM_TRGOSource: specifies the Trigger Output source. + * This paramter can be one of the following values: + * + * - For all TIMx + * @arg TIM_TRGOSource_Reset: The UG bit in the TIM_EGR register is used as the trigger output (TRGO). + * @arg TIM_TRGOSource_Enable: The Counter Enable CEN is used as the trigger output (TRGO). + * @arg TIM_TRGOSource_Update: The update event is selected as the trigger output (TRGO). + * + * - For all TIMx except TIM6 and TIM7 + * @arg TIM_TRGOSource_OC1: The trigger output sends a positive pulse when the CC1IF flag + * is to be set, as soon as a capture or compare match occurs (TRGO). + * @arg TIM_TRGOSource_OC1Ref: OC1REF signal is used as the trigger output (TRGO). + * @arg TIM_TRGOSource_OC2Ref: OC2REF signal is used as the trigger output (TRGO). + * @arg TIM_TRGOSource_OC3Ref: OC3REF signal is used as the trigger output (TRGO). + * @arg TIM_TRGOSource_OC4Ref: OC4REF signal is used as the trigger output (TRGO). + * + * @retval None + */ +void TIM_SelectOutputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_TRGOSource) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST7_PERIPH(TIMx)); + assert_param(IS_TIM_TRGO_SOURCE(TIM_TRGOSource)); + /* Reset the MMS Bits */ + TIMx->CR2 &= (uint16_t)~((uint16_t)TIM_CR2_MMS); + /* Select the TRGO source */ + TIMx->CR2 |= TIM_TRGOSource; +} + +/** + * @brief Selects the TIMx Slave Mode. + * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 12 or 15 to select the TIM peripheral. + * @param TIM_SlaveMode: specifies the Timer Slave Mode. + * This parameter can be one of the following values: + * @arg TIM_SlaveMode_Reset: Rising edge of the selected trigger signal (TRGI) re-initializes + * the counter and triggers an update of the registers. + * @arg TIM_SlaveMode_Gated: The counter clock is enabled when the trigger signal (TRGI) is high. + * @arg TIM_SlaveMode_Trigger: The counter starts at a rising edge of the trigger TRGI. + * @arg TIM_SlaveMode_External1: Rising edges of the selected trigger (TRGI) clock the counter. + * @retval None + */ +void TIM_SelectSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_SlaveMode) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST6_PERIPH(TIMx)); + assert_param(IS_TIM_SLAVE_MODE(TIM_SlaveMode)); + /* Reset the SMS Bits */ + TIMx->SMCR &= (uint16_t)~((uint16_t)TIM_SMCR_SMS); + /* Select the Slave Mode */ + TIMx->SMCR |= TIM_SlaveMode; +} + +/** + * @brief Sets or Resets the TIMx Master/Slave Mode. + * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 12 or 15 to select the TIM peripheral. + * @param TIM_MasterSlaveMode: specifies the Timer Master Slave Mode. + * This parameter can be one of the following values: + * @arg TIM_MasterSlaveMode_Enable: synchronization between the current timer + * and its slaves (through TRGO). + * @arg TIM_MasterSlaveMode_Disable: No action + * @retval None + */ +void TIM_SelectMasterSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_MasterSlaveMode) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST6_PERIPH(TIMx)); + assert_param(IS_TIM_MSM_STATE(TIM_MasterSlaveMode)); + /* Reset the MSM Bit */ + TIMx->SMCR &= (uint16_t)~((uint16_t)TIM_SMCR_MSM); + + /* Set or Reset the MSM Bit */ + TIMx->SMCR |= TIM_MasterSlaveMode; +} + +/** + * @brief Sets the TIMx Counter Register value + * @param TIMx: where x can be 1 to 17 to select the TIM peripheral. + * @param Counter: specifies the Counter register new value. + * @retval None + */ +void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter) +{ + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + /* Set the Counter Register value */ + TIMx->CNT = Counter; +} + +/** + * @brief Sets the TIMx Autoreload Register value + * @param TIMx: where x can be 1 to 17 to select the TIM peripheral. + * @param Autoreload: specifies the Autoreload register new value. + * @retval None + */ +void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint16_t Autoreload) +{ + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + /* Set the Autoreload Register value */ + TIMx->ARR = Autoreload; +} + +/** + * @brief Sets the TIMx Capture Compare1 Register value + * @param TIMx: where x can be 1 to 17 except 6 and 7 to select the TIM peripheral. + * @param Compare1: specifies the Capture Compare1 register new value. + * @retval None + */ +void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST8_PERIPH(TIMx)); + /* Set the Capture Compare1 Register value */ + TIMx->CCR1 = Compare1; +} + +/** + * @brief Sets the TIMx Capture Compare2 Register value + * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 12 or 15 to select the TIM peripheral. + * @param Compare2: specifies the Capture Compare2 register new value. + * @retval None + */ +void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST6_PERIPH(TIMx)); + /* Set the Capture Compare2 Register value */ + TIMx->CCR2 = Compare2; +} + +/** + * @brief Sets the TIMx Capture Compare3 Register value + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param Compare3: specifies the Capture Compare3 register new value. + * @retval None + */ +void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + /* Set the Capture Compare3 Register value */ + TIMx->CCR3 = Compare3; +} + +/** + * @brief Sets the TIMx Capture Compare4 Register value + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param Compare4: specifies the Capture Compare4 register new value. + * @retval None + */ +void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + /* Set the Capture Compare4 Register value */ + TIMx->CCR4 = Compare4; +} + +/** + * @brief Sets the TIMx Input Capture 1 prescaler. + * @param TIMx: where x can be 1 to 17 except 6 and 7 to select the TIM peripheral. + * @param TIM_ICPSC: specifies the Input Capture1 prescaler new value. + * This parameter can be one of the following values: + * @arg TIM_ICPSC_DIV1: no prescaler + * @arg TIM_ICPSC_DIV2: capture is done once every 2 events + * @arg TIM_ICPSC_DIV4: capture is done once every 4 events + * @arg TIM_ICPSC_DIV8: capture is done once every 8 events + * @retval None + */ +void TIM_SetIC1Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST8_PERIPH(TIMx)); + assert_param(IS_TIM_IC_PRESCALER(TIM_ICPSC)); + /* Reset the IC1PSC Bits */ + TIMx->CCMR1 &= (uint16_t)~((uint16_t)TIM_CCMR1_IC1PSC); + /* Set the IC1PSC value */ + TIMx->CCMR1 |= TIM_ICPSC; +} + +/** + * @brief Sets the TIMx Input Capture 2 prescaler. + * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 12 or 15 to select the TIM peripheral. + * @param TIM_ICPSC: specifies the Input Capture2 prescaler new value. + * This parameter can be one of the following values: + * @arg TIM_ICPSC_DIV1: no prescaler + * @arg TIM_ICPSC_DIV2: capture is done once every 2 events + * @arg TIM_ICPSC_DIV4: capture is done once every 4 events + * @arg TIM_ICPSC_DIV8: capture is done once every 8 events + * @retval None + */ +void TIM_SetIC2Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST6_PERIPH(TIMx)); + assert_param(IS_TIM_IC_PRESCALER(TIM_ICPSC)); + /* Reset the IC2PSC Bits */ + TIMx->CCMR1 &= (uint16_t)~((uint16_t)TIM_CCMR1_IC2PSC); + /* Set the IC2PSC value */ + TIMx->CCMR1 |= (uint16_t)(TIM_ICPSC << 8); +} + +/** + * @brief Sets the TIMx Input Capture 3 prescaler. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_ICPSC: specifies the Input Capture3 prescaler new value. + * This parameter can be one of the following values: + * @arg TIM_ICPSC_DIV1: no prescaler + * @arg TIM_ICPSC_DIV2: capture is done once every 2 events + * @arg TIM_ICPSC_DIV4: capture is done once every 4 events + * @arg TIM_ICPSC_DIV8: capture is done once every 8 events + * @retval None + */ +void TIM_SetIC3Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + assert_param(IS_TIM_IC_PRESCALER(TIM_ICPSC)); + /* Reset the IC3PSC Bits */ + TIMx->CCMR2 &= (uint16_t)~((uint16_t)TIM_CCMR2_IC3PSC); + /* Set the IC3PSC value */ + TIMx->CCMR2 |= TIM_ICPSC; +} + +/** + * @brief Sets the TIMx Input Capture 4 prescaler. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_ICPSC: specifies the Input Capture4 prescaler new value. + * This parameter can be one of the following values: + * @arg TIM_ICPSC_DIV1: no prescaler + * @arg TIM_ICPSC_DIV2: capture is done once every 2 events + * @arg TIM_ICPSC_DIV4: capture is done once every 4 events + * @arg TIM_ICPSC_DIV8: capture is done once every 8 events + * @retval None + */ +void TIM_SetIC4Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + assert_param(IS_TIM_IC_PRESCALER(TIM_ICPSC)); + /* Reset the IC4PSC Bits */ + TIMx->CCMR2 &= (uint16_t)~((uint16_t)TIM_CCMR2_IC4PSC); + /* Set the IC4PSC value */ + TIMx->CCMR2 |= (uint16_t)(TIM_ICPSC << 8); +} + +/** + * @brief Sets the TIMx Clock Division value. + * @param TIMx: where x can be 1 to 17 except 6 and 7 to select + * the TIM peripheral. + * @param TIM_CKD: specifies the clock division value. + * This parameter can be one of the following value: + * @arg TIM_CKD_DIV1: TDTS = Tck_tim + * @arg TIM_CKD_DIV2: TDTS = 2*Tck_tim + * @arg TIM_CKD_DIV4: TDTS = 4*Tck_tim + * @retval None + */ +void TIM_SetClockDivision(TIM_TypeDef* TIMx, uint16_t TIM_CKD) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST8_PERIPH(TIMx)); + assert_param(IS_TIM_CKD_DIV(TIM_CKD)); + /* Reset the CKD Bits */ + TIMx->CR1 &= (uint16_t)~((uint16_t)TIM_CR1_CKD); + /* Set the CKD value */ + TIMx->CR1 |= TIM_CKD; +} + +/** + * @brief Gets the TIMx Input Capture 1 value. + * @param TIMx: where x can be 1 to 17 except 6 and 7 to select the TIM peripheral. + * @retval Capture Compare 1 Register value. + */ +uint16_t TIM_GetCapture1(TIM_TypeDef* TIMx) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST8_PERIPH(TIMx)); + /* Get the Capture 1 Register value */ + return TIMx->CCR1; +} + +/** + * @brief Gets the TIMx Input Capture 2 value. + * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 12 or 15 to select the TIM peripheral. + * @retval Capture Compare 2 Register value. + */ +uint16_t TIM_GetCapture2(TIM_TypeDef* TIMx) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST6_PERIPH(TIMx)); + /* Get the Capture 2 Register value */ + return TIMx->CCR2; +} + +/** + * @brief Gets the TIMx Input Capture 3 value. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @retval Capture Compare 3 Register value. + */ +uint16_t TIM_GetCapture3(TIM_TypeDef* TIMx) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + /* Get the Capture 3 Register value */ + return TIMx->CCR3; +} + +/** + * @brief Gets the TIMx Input Capture 4 value. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @retval Capture Compare 4 Register value. + */ +uint16_t TIM_GetCapture4(TIM_TypeDef* TIMx) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + /* Get the Capture 4 Register value */ + return TIMx->CCR4; +} + +/** + * @brief Gets the TIMx Counter value. + * @param TIMx: where x can be 1 to 17 to select the TIM peripheral. + * @retval Counter Register value. + */ +uint16_t TIM_GetCounter(TIM_TypeDef* TIMx) +{ + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + /* Get the Counter Register value */ + return TIMx->CNT; +} + +/** + * @brief Gets the TIMx Prescaler value. + * @param TIMx: where x can be 1 to 17 to select the TIM peripheral. + * @retval Prescaler Register value. + */ +uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx) +{ + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + /* Get the Prescaler Register value */ + return TIMx->PSC; +} + +/** + * @brief Checks whether the specified TIM flag is set or not. + * @param TIMx: where x can be 1 to 17 to select the TIM peripheral. + * @param TIM_FLAG: specifies the flag to check. + * This parameter can be one of the following values: + * @arg TIM_FLAG_Update: TIM update Flag + * @arg TIM_FLAG_CC1: TIM Capture Compare 1 Flag + * @arg TIM_FLAG_CC2: TIM Capture Compare 2 Flag + * @arg TIM_FLAG_CC3: TIM Capture Compare 3 Flag + * @arg TIM_FLAG_CC4: TIM Capture Compare 4 Flag + * @arg TIM_FLAG_COM: TIM Commutation Flag + * @arg TIM_FLAG_Trigger: TIM Trigger Flag + * @arg TIM_FLAG_Break: TIM Break Flag + * @arg TIM_FLAG_CC1OF: TIM Capture Compare 1 overcapture Flag + * @arg TIM_FLAG_CC2OF: TIM Capture Compare 2 overcapture Flag + * @arg TIM_FLAG_CC3OF: TIM Capture Compare 3 overcapture Flag + * @arg TIM_FLAG_CC4OF: TIM Capture Compare 4 overcapture Flag + * @note + * - TIM6 and TIM7 can have only one update flag. + * - TIM9, TIM12 and TIM15 can have only TIM_FLAG_Update, TIM_FLAG_CC1, + * TIM_FLAG_CC2 or TIM_FLAG_Trigger. + * - TIM10, TIM11, TIM13, TIM14, TIM16 and TIM17 can have TIM_FLAG_Update or TIM_FLAG_CC1. + * - TIM_FLAG_Break is used only with TIM1, TIM8 and TIM15. + * - TIM_FLAG_COM is used only with TIM1, TIM8, TIM15, TIM16 and TIM17. + * @retval The new state of TIM_FLAG (SET or RESET). + */ +FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG) +{ + ITStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + assert_param(IS_TIM_GET_FLAG(TIM_FLAG)); + + if ((TIMx->SR & TIM_FLAG) != (uint16_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Clears the TIMx's pending flags. + * @param TIMx: where x can be 1 to 17 to select the TIM peripheral. + * @param TIM_FLAG: specifies the flag bit to clear. + * This parameter can be any combination of the following values: + * @arg TIM_FLAG_Update: TIM update Flag + * @arg TIM_FLAG_CC1: TIM Capture Compare 1 Flag + * @arg TIM_FLAG_CC2: TIM Capture Compare 2 Flag + * @arg TIM_FLAG_CC3: TIM Capture Compare 3 Flag + * @arg TIM_FLAG_CC4: TIM Capture Compare 4 Flag + * @arg TIM_FLAG_COM: TIM Commutation Flag + * @arg TIM_FLAG_Trigger: TIM Trigger Flag + * @arg TIM_FLAG_Break: TIM Break Flag + * @arg TIM_FLAG_CC1OF: TIM Capture Compare 1 overcapture Flag + * @arg TIM_FLAG_CC2OF: TIM Capture Compare 2 overcapture Flag + * @arg TIM_FLAG_CC3OF: TIM Capture Compare 3 overcapture Flag + * @arg TIM_FLAG_CC4OF: TIM Capture Compare 4 overcapture Flag + * @note + * - TIM6 and TIM7 can have only one update flag. + * - TIM9, TIM12 and TIM15 can have only TIM_FLAG_Update, TIM_FLAG_CC1, + * TIM_FLAG_CC2 or TIM_FLAG_Trigger. + * - TIM10, TIM11, TIM13, TIM14, TIM16 and TIM17 can have TIM_FLAG_Update or TIM_FLAG_CC1. + * - TIM_FLAG_Break is used only with TIM1, TIM8 and TIM15. + * - TIM_FLAG_COM is used only with TIM1, TIM8, TIM15, TIM16 and TIM17. + * @retval None + */ +void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG) +{ + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + assert_param(IS_TIM_CLEAR_FLAG(TIM_FLAG)); + + /* Clear the flags */ + TIMx->SR = (uint16_t)~TIM_FLAG; +} + +/** + * @brief Checks whether the TIM interrupt has occurred or not. + * @param TIMx: where x can be 1 to 17 to select the TIM peripheral. + * @param TIM_IT: specifies the TIM interrupt source to check. + * This parameter can be one of the following values: + * @arg TIM_IT_Update: TIM update Interrupt source + * @arg TIM_IT_CC1: TIM Capture Compare 1 Interrupt source + * @arg TIM_IT_CC2: TIM Capture Compare 2 Interrupt source + * @arg TIM_IT_CC3: TIM Capture Compare 3 Interrupt source + * @arg TIM_IT_CC4: TIM Capture Compare 4 Interrupt source + * @arg TIM_IT_COM: TIM Commutation Interrupt source + * @arg TIM_IT_Trigger: TIM Trigger Interrupt source + * @arg TIM_IT_Break: TIM Break Interrupt source + * @note + * - TIM6 and TIM7 can generate only an update interrupt. + * - TIM9, TIM12 and TIM15 can have only TIM_IT_Update, TIM_IT_CC1, + * TIM_IT_CC2 or TIM_IT_Trigger. + * - TIM10, TIM11, TIM13, TIM14, TIM16 and TIM17 can have TIM_IT_Update or TIM_IT_CC1. + * - TIM_IT_Break is used only with TIM1, TIM8 and TIM15. + * - TIM_IT_COM is used only with TIM1, TIM8, TIM15, TIM16 and TIM17. + * @retval The new state of the TIM_IT(SET or RESET). + */ +ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT) +{ + ITStatus bitstatus = RESET; + uint16_t itstatus = 0x0, itenable = 0x0; + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + assert_param(IS_TIM_GET_IT(TIM_IT)); + + itstatus = TIMx->SR & TIM_IT; + + itenable = TIMx->DIER & TIM_IT; + if ((itstatus != (uint16_t)RESET) && (itenable != (uint16_t)RESET)) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Clears the TIMx's interrupt pending bits. + * @param TIMx: where x can be 1 to 17 to select the TIM peripheral. + * @param TIM_IT: specifies the pending bit to clear. + * This parameter can be any combination of the following values: + * @arg TIM_IT_Update: TIM1 update Interrupt source + * @arg TIM_IT_CC1: TIM Capture Compare 1 Interrupt source + * @arg TIM_IT_CC2: TIM Capture Compare 2 Interrupt source + * @arg TIM_IT_CC3: TIM Capture Compare 3 Interrupt source + * @arg TIM_IT_CC4: TIM Capture Compare 4 Interrupt source + * @arg TIM_IT_COM: TIM Commutation Interrupt source + * @arg TIM_IT_Trigger: TIM Trigger Interrupt source + * @arg TIM_IT_Break: TIM Break Interrupt source + * @note + * - TIM6 and TIM7 can generate only an update interrupt. + * - TIM9, TIM12 and TIM15 can have only TIM_IT_Update, TIM_IT_CC1, + * TIM_IT_CC2 or TIM_IT_Trigger. + * - TIM10, TIM11, TIM13, TIM14, TIM16 and TIM17 can have TIM_IT_Update or TIM_IT_CC1. + * - TIM_IT_Break is used only with TIM1, TIM8 and TIM15. + * - TIM_IT_COM is used only with TIM1, TIM8, TIM15, TIM16 and TIM17. + * @retval None + */ +void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT) +{ + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + assert_param(IS_TIM_IT(TIM_IT)); + /* Clear the IT pending Bit */ + TIMx->SR = (uint16_t)~TIM_IT; +} + +/** + * @brief Configure the TI1 as Input. + * @param TIMx: where x can be 1 to 17 except 6 and 7 to select the TIM peripheral. + * @param TIM_ICPolarity : The Input Polarity. + * This parameter can be one of the following values: + * @arg TIM_ICPolarity_Rising + * @arg TIM_ICPolarity_Falling + * @param TIM_ICSelection: specifies the input to be used. + * This parameter can be one of the following values: + * @arg TIM_ICSelection_DirectTI: TIM Input 1 is selected to be connected to IC1. + * @arg TIM_ICSelection_IndirectTI: TIM Input 1 is selected to be connected to IC2. + * @arg TIM_ICSelection_TRC: TIM Input 1 is selected to be connected to TRC. + * @param TIM_ICFilter: Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * @retval None + */ +static void TI1_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, + uint16_t TIM_ICFilter) +{ + uint16_t tmpccmr1 = 0, tmpccer = 0; + /* Disable the Channel 1: Reset the CC1E Bit */ + TIMx->CCER &= (uint16_t)~((uint16_t)TIM_CCER_CC1E); + tmpccmr1 = TIMx->CCMR1; + tmpccer = TIMx->CCER; + /* Select the Input and set the filter */ + tmpccmr1 &= (uint16_t)(((uint16_t)~((uint16_t)TIM_CCMR1_CC1S)) & ((uint16_t)~((uint16_t)TIM_CCMR1_IC1F))); + tmpccmr1 |= (uint16_t)(TIM_ICSelection | (uint16_t)(TIM_ICFilter << (uint16_t)4)); + + if((TIMx == TIM1) || (TIMx == TIM8) || (TIMx == TIM2) || (TIMx == TIM3) || + (TIMx == TIM4) ||(TIMx == TIM5)) + { + /* Select the Polarity and set the CC1E Bit */ + tmpccer &= (uint16_t)~((uint16_t)(TIM_CCER_CC1P)); + tmpccer |= (uint16_t)(TIM_ICPolarity | (uint16_t)TIM_CCER_CC1E); + } + else + { + /* Select the Polarity and set the CC1E Bit */ + tmpccer &= (uint16_t)~((uint16_t)(TIM_CCER_CC1P | TIM_CCER_CC1NP)); + tmpccer |= (uint16_t)(TIM_ICPolarity | (uint16_t)TIM_CCER_CC1E); + } + + /* Write to TIMx CCMR1 and CCER registers */ + TIMx->CCMR1 = tmpccmr1; + TIMx->CCER = tmpccer; +} + +/** + * @brief Configure the TI2 as Input. + * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 12 or 15 to select the TIM peripheral. + * @param TIM_ICPolarity : The Input Polarity. + * This parameter can be one of the following values: + * @arg TIM_ICPolarity_Rising + * @arg TIM_ICPolarity_Falling + * @param TIM_ICSelection: specifies the input to be used. + * This parameter can be one of the following values: + * @arg TIM_ICSelection_DirectTI: TIM Input 2 is selected to be connected to IC2. + * @arg TIM_ICSelection_IndirectTI: TIM Input 2 is selected to be connected to IC1. + * @arg TIM_ICSelection_TRC: TIM Input 2 is selected to be connected to TRC. + * @param TIM_ICFilter: Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * @retval None + */ +static void TI2_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, + uint16_t TIM_ICFilter) +{ + uint16_t tmpccmr1 = 0, tmpccer = 0, tmp = 0; + /* Disable the Channel 2: Reset the CC2E Bit */ + TIMx->CCER &= (uint16_t)~((uint16_t)TIM_CCER_CC2E); + tmpccmr1 = TIMx->CCMR1; + tmpccer = TIMx->CCER; + tmp = (uint16_t)(TIM_ICPolarity << 4); + /* Select the Input and set the filter */ + tmpccmr1 &= (uint16_t)(((uint16_t)~((uint16_t)TIM_CCMR1_CC2S)) & ((uint16_t)~((uint16_t)TIM_CCMR1_IC2F))); + tmpccmr1 |= (uint16_t)(TIM_ICFilter << 12); + tmpccmr1 |= (uint16_t)(TIM_ICSelection << 8); + + if((TIMx == TIM1) || (TIMx == TIM8) || (TIMx == TIM2) || (TIMx == TIM3) || + (TIMx == TIM4) ||(TIMx == TIM5)) + { + /* Select the Polarity and set the CC2E Bit */ + tmpccer &= (uint16_t)~((uint16_t)(TIM_CCER_CC2P)); + tmpccer |= (uint16_t)(tmp | (uint16_t)TIM_CCER_CC2E); + } + else + { + /* Select the Polarity and set the CC2E Bit */ + tmpccer &= (uint16_t)~((uint16_t)(TIM_CCER_CC2P | TIM_CCER_CC2NP)); + tmpccer |= (uint16_t)(TIM_ICPolarity | (uint16_t)TIM_CCER_CC2E); + } + + /* Write to TIMx CCMR1 and CCER registers */ + TIMx->CCMR1 = tmpccmr1 ; + TIMx->CCER = tmpccer; +} + +/** + * @brief Configure the TI3 as Input. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_ICPolarity : The Input Polarity. + * This parameter can be one of the following values: + * @arg TIM_ICPolarity_Rising + * @arg TIM_ICPolarity_Falling + * @param TIM_ICSelection: specifies the input to be used. + * This parameter can be one of the following values: + * @arg TIM_ICSelection_DirectTI: TIM Input 3 is selected to be connected to IC3. + * @arg TIM_ICSelection_IndirectTI: TIM Input 3 is selected to be connected to IC4. + * @arg TIM_ICSelection_TRC: TIM Input 3 is selected to be connected to TRC. + * @param TIM_ICFilter: Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * @retval None + */ +static void TI3_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, + uint16_t TIM_ICFilter) +{ + uint16_t tmpccmr2 = 0, tmpccer = 0, tmp = 0; + /* Disable the Channel 3: Reset the CC3E Bit */ + TIMx->CCER &= (uint16_t)~((uint16_t)TIM_CCER_CC3E); + tmpccmr2 = TIMx->CCMR2; + tmpccer = TIMx->CCER; + tmp = (uint16_t)(TIM_ICPolarity << 8); + /* Select the Input and set the filter */ + tmpccmr2 &= (uint16_t)(((uint16_t)~((uint16_t)TIM_CCMR2_CC3S)) & ((uint16_t)~((uint16_t)TIM_CCMR2_IC3F))); + tmpccmr2 |= (uint16_t)(TIM_ICSelection | (uint16_t)(TIM_ICFilter << (uint16_t)4)); + + if((TIMx == TIM1) || (TIMx == TIM8) || (TIMx == TIM2) || (TIMx == TIM3) || + (TIMx == TIM4) ||(TIMx == TIM5)) + { + /* Select the Polarity and set the CC3E Bit */ + tmpccer &= (uint16_t)~((uint16_t)(TIM_CCER_CC3P)); + tmpccer |= (uint16_t)(tmp | (uint16_t)TIM_CCER_CC3E); + } + else + { + /* Select the Polarity and set the CC3E Bit */ + tmpccer &= (uint16_t)~((uint16_t)(TIM_CCER_CC3P | TIM_CCER_CC3NP)); + tmpccer |= (uint16_t)(TIM_ICPolarity | (uint16_t)TIM_CCER_CC3E); + } + + /* Write to TIMx CCMR2 and CCER registers */ + TIMx->CCMR2 = tmpccmr2; + TIMx->CCER = tmpccer; +} + +/** + * @brief Configure the TI4 as Input. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_ICPolarity : The Input Polarity. + * This parameter can be one of the following values: + * @arg TIM_ICPolarity_Rising + * @arg TIM_ICPolarity_Falling + * @param TIM_ICSelection: specifies the input to be used. + * This parameter can be one of the following values: + * @arg TIM_ICSelection_DirectTI: TIM Input 4 is selected to be connected to IC4. + * @arg TIM_ICSelection_IndirectTI: TIM Input 4 is selected to be connected to IC3. + * @arg TIM_ICSelection_TRC: TIM Input 4 is selected to be connected to TRC. + * @param TIM_ICFilter: Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * @retval None + */ +static void TI4_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, + uint16_t TIM_ICFilter) +{ + uint16_t tmpccmr2 = 0, tmpccer = 0, tmp = 0; + + /* Disable the Channel 4: Reset the CC4E Bit */ + TIMx->CCER &= (uint16_t)~((uint16_t)TIM_CCER_CC4E); + tmpccmr2 = TIMx->CCMR2; + tmpccer = TIMx->CCER; + tmp = (uint16_t)(TIM_ICPolarity << 12); + /* Select the Input and set the filter */ + tmpccmr2 &= (uint16_t)((uint16_t)(~(uint16_t)TIM_CCMR2_CC4S) & ((uint16_t)~((uint16_t)TIM_CCMR2_IC4F))); + tmpccmr2 |= (uint16_t)(TIM_ICSelection << 8); + tmpccmr2 |= (uint16_t)(TIM_ICFilter << 12); + + if((TIMx == TIM1) || (TIMx == TIM8) || (TIMx == TIM2) || (TIMx == TIM3) || + (TIMx == TIM4) ||(TIMx == TIM5)) + { + /* Select the Polarity and set the CC4E Bit */ + tmpccer &= (uint16_t)~((uint16_t)(TIM_CCER_CC4P)); + tmpccer |= (uint16_t)(tmp | (uint16_t)TIM_CCER_CC4E); + } + else + { + /* Select the Polarity and set the CC4E Bit */ + tmpccer &= (uint16_t)~((uint16_t)(TIM_CCER_CC3P | TIM_CCER_CC4NP)); + tmpccer |= (uint16_t)(TIM_ICPolarity | (uint16_t)TIM_CCER_CC4E); + } + /* Write to TIMx CCMR2 and CCER registers */ + TIMx->CCMR2 = tmpccmr2; + TIMx->CCER = tmpccer; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_usart.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_usart.c new file mode 100644 index 0000000..a3f16f1 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_usart.c @@ -0,0 +1,1058 @@ +/** + ****************************************************************************** + * @file stm32f10x_usart.c + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief This file provides all the USART firmware functions. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_usart.h" +#include "stm32f10x_rcc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup USART + * @brief USART driver modules + * @{ + */ + +/** @defgroup USART_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup USART_Private_Defines + * @{ + */ + +#define CR1_UE_Set ((uint16_t)0x2000) /*!< USART Enable Mask */ +#define CR1_UE_Reset ((uint16_t)0xDFFF) /*!< USART Disable Mask */ + +#define CR1_WAKE_Mask ((uint16_t)0xF7FF) /*!< USART WakeUp Method Mask */ + +#define CR1_RWU_Set ((uint16_t)0x0002) /*!< USART mute mode Enable Mask */ +#define CR1_RWU_Reset ((uint16_t)0xFFFD) /*!< USART mute mode Enable Mask */ +#define CR1_SBK_Set ((uint16_t)0x0001) /*!< USART Break Character send Mask */ +#define CR1_CLEAR_Mask ((uint16_t)0xE9F3) /*!< USART CR1 Mask */ +#define CR2_Address_Mask ((uint16_t)0xFFF0) /*!< USART address Mask */ + +#define CR2_LINEN_Set ((uint16_t)0x4000) /*!< USART LIN Enable Mask */ +#define CR2_LINEN_Reset ((uint16_t)0xBFFF) /*!< USART LIN Disable Mask */ + +#define CR2_LBDL_Mask ((uint16_t)0xFFDF) /*!< USART LIN Break detection Mask */ +#define CR2_STOP_CLEAR_Mask ((uint16_t)0xCFFF) /*!< USART CR2 STOP Bits Mask */ +#define CR2_CLOCK_CLEAR_Mask ((uint16_t)0xF0FF) /*!< USART CR2 Clock Mask */ + +#define CR3_SCEN_Set ((uint16_t)0x0020) /*!< USART SC Enable Mask */ +#define CR3_SCEN_Reset ((uint16_t)0xFFDF) /*!< USART SC Disable Mask */ + +#define CR3_NACK_Set ((uint16_t)0x0010) /*!< USART SC NACK Enable Mask */ +#define CR3_NACK_Reset ((uint16_t)0xFFEF) /*!< USART SC NACK Disable Mask */ + +#define CR3_HDSEL_Set ((uint16_t)0x0008) /*!< USART Half-Duplex Enable Mask */ +#define CR3_HDSEL_Reset ((uint16_t)0xFFF7) /*!< USART Half-Duplex Disable Mask */ + +#define CR3_IRLP_Mask ((uint16_t)0xFFFB) /*!< USART IrDA LowPower mode Mask */ +#define CR3_CLEAR_Mask ((uint16_t)0xFCFF) /*!< USART CR3 Mask */ + +#define CR3_IREN_Set ((uint16_t)0x0002) /*!< USART IrDA Enable Mask */ +#define CR3_IREN_Reset ((uint16_t)0xFFFD) /*!< USART IrDA Disable Mask */ +#define GTPR_LSB_Mask ((uint16_t)0x00FF) /*!< Guard Time Register LSB Mask */ +#define GTPR_MSB_Mask ((uint16_t)0xFF00) /*!< Guard Time Register MSB Mask */ +#define IT_Mask ((uint16_t)0x001F) /*!< USART Interrupt Mask */ + +/* USART OverSampling-8 Mask */ +#define CR1_OVER8_Set ((u16)0x8000) /* USART OVER8 mode Enable Mask */ +#define CR1_OVER8_Reset ((u16)0x7FFF) /* USART OVER8 mode Disable Mask */ + +/* USART One Bit Sampling Mask */ +#define CR3_ONEBITE_Set ((u16)0x0800) /* USART ONEBITE mode Enable Mask */ +#define CR3_ONEBITE_Reset ((u16)0xF7FF) /* USART ONEBITE mode Disable Mask */ + +/** + * @} + */ + +/** @defgroup USART_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup USART_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup USART_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup USART_Private_Functions + * @{ + */ + +/** + * @brief Deinitializes the USARTx peripheral registers to their default reset values. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @retval None + */ +void USART_DeInit(USART_TypeDef* USARTx) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + + if (USARTx == USART1) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, DISABLE); + } + else if (USARTx == USART2) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2, DISABLE); + } + else if (USARTx == USART3) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, DISABLE); + } + else if (USARTx == UART4) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART4, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART4, DISABLE); + } + else + { + if (USARTx == UART5) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART5, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART5, DISABLE); + } + } +} + +/** + * @brief Initializes the USARTx peripheral according to the specified + * parameters in the USART_InitStruct . + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param USART_InitStruct: pointer to a USART_InitTypeDef structure + * that contains the configuration information for the specified USART + * peripheral. + * @retval None + */ +void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct) +{ + uint32_t tmpreg = 0x00, apbclock = 0x00; + uint32_t integerdivider = 0x00; + uint32_t fractionaldivider = 0x00; + uint32_t usartxbase = 0; + RCC_ClocksTypeDef RCC_ClocksStatus; + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_USART_BAUDRATE(USART_InitStruct->USART_BaudRate)); + assert_param(IS_USART_WORD_LENGTH(USART_InitStruct->USART_WordLength)); + assert_param(IS_USART_STOPBITS(USART_InitStruct->USART_StopBits)); + assert_param(IS_USART_PARITY(USART_InitStruct->USART_Parity)); + assert_param(IS_USART_MODE(USART_InitStruct->USART_Mode)); + assert_param(IS_USART_HARDWARE_FLOW_CONTROL(USART_InitStruct->USART_HardwareFlowControl)); + /* The hardware flow control is available only for USART1, USART2 and USART3 */ + if (USART_InitStruct->USART_HardwareFlowControl != USART_HardwareFlowControl_None) + { + assert_param(IS_USART_123_PERIPH(USARTx)); + } + + usartxbase = (uint32_t)USARTx; + +/*---------------------------- USART CR2 Configuration -----------------------*/ + tmpreg = USARTx->CR2; + /* Clear STOP[13:12] bits */ + tmpreg &= CR2_STOP_CLEAR_Mask; + /* Configure the USART Stop Bits, Clock, CPOL, CPHA and LastBit ------------*/ + /* Set STOP[13:12] bits according to USART_StopBits value */ + tmpreg |= (uint32_t)USART_InitStruct->USART_StopBits; + + /* Write to USART CR2 */ + USARTx->CR2 = (uint16_t)tmpreg; + +/*---------------------------- USART CR1 Configuration -----------------------*/ + tmpreg = USARTx->CR1; + /* Clear M, PCE, PS, TE and RE bits */ + tmpreg &= CR1_CLEAR_Mask; + /* Configure the USART Word Length, Parity and mode ----------------------- */ + /* Set the M bits according to USART_WordLength value */ + /* Set PCE and PS bits according to USART_Parity value */ + /* Set TE and RE bits according to USART_Mode value */ + tmpreg |= (uint32_t)USART_InitStruct->USART_WordLength | USART_InitStruct->USART_Parity | + USART_InitStruct->USART_Mode; + /* Write to USART CR1 */ + USARTx->CR1 = (uint16_t)tmpreg; + +/*---------------------------- USART CR3 Configuration -----------------------*/ + tmpreg = USARTx->CR3; + /* Clear CTSE and RTSE bits */ + tmpreg &= CR3_CLEAR_Mask; + /* Configure the USART HFC -------------------------------------------------*/ + /* Set CTSE and RTSE bits according to USART_HardwareFlowControl value */ + tmpreg |= USART_InitStruct->USART_HardwareFlowControl; + /* Write to USART CR3 */ + USARTx->CR3 = (uint16_t)tmpreg; + +/*---------------------------- USART BRR Configuration -----------------------*/ + /* Configure the USART Baud Rate -------------------------------------------*/ + RCC_GetClocksFreq(&RCC_ClocksStatus); + if (usartxbase == USART1_BASE) + { + apbclock = RCC_ClocksStatus.PCLK2_Frequency; + } + else + { + apbclock = RCC_ClocksStatus.PCLK1_Frequency; + } + + /* Determine the integer part */ + if ((USARTx->CR1 & CR1_OVER8_Set) != 0) + { + /* Integer part computing in case Oversampling mode is 8 Samples */ + integerdivider = ((25 * apbclock) / (2 * (USART_InitStruct->USART_BaudRate))); + } + else /* if ((USARTx->CR1 & CR1_OVER8_Set) == 0) */ + { + /* Integer part computing in case Oversampling mode is 16 Samples */ + integerdivider = ((25 * apbclock) / (4 * (USART_InitStruct->USART_BaudRate))); + } + tmpreg = (integerdivider / 100) << 4; + + /* Determine the fractional part */ + fractionaldivider = integerdivider - (100 * (tmpreg >> 4)); + + /* Implement the fractional part in the register */ + if ((USARTx->CR1 & CR1_OVER8_Set) != 0) + { + tmpreg |= ((((fractionaldivider * 8) + 50) / 100)) & ((uint8_t)0x07); + } + else /* if ((USARTx->CR1 & CR1_OVER8_Set) == 0) */ + { + tmpreg |= ((((fractionaldivider * 16) + 50) / 100)) & ((uint8_t)0x0F); + } + + /* Write to USART BRR */ + USARTx->BRR = (uint16_t)tmpreg; +} + +/** + * @brief Fills each USART_InitStruct member with its default value. + * @param USART_InitStruct: pointer to a USART_InitTypeDef structure + * which will be initialized. + * @retval None + */ +void USART_StructInit(USART_InitTypeDef* USART_InitStruct) +{ + /* USART_InitStruct members default value */ + USART_InitStruct->USART_BaudRate = 9600; + USART_InitStruct->USART_WordLength = USART_WordLength_8b; + USART_InitStruct->USART_StopBits = USART_StopBits_1; + USART_InitStruct->USART_Parity = USART_Parity_No ; + USART_InitStruct->USART_Mode = USART_Mode_Rx | USART_Mode_Tx; + USART_InitStruct->USART_HardwareFlowControl = USART_HardwareFlowControl_None; +} + +/** + * @brief Initializes the USARTx peripheral Clock according to the + * specified parameters in the USART_ClockInitStruct . + * @param USARTx: where x can be 1, 2, 3 to select the USART peripheral. + * @param USART_ClockInitStruct: pointer to a USART_ClockInitTypeDef + * structure that contains the configuration information for the specified + * USART peripheral. + * @note The Smart Card and Synchronous modes are not available for UART4 and UART5. + * @retval None + */ +void USART_ClockInit(USART_TypeDef* USARTx, USART_ClockInitTypeDef* USART_ClockInitStruct) +{ + uint32_t tmpreg = 0x00; + /* Check the parameters */ + assert_param(IS_USART_123_PERIPH(USARTx)); + assert_param(IS_USART_CLOCK(USART_ClockInitStruct->USART_Clock)); + assert_param(IS_USART_CPOL(USART_ClockInitStruct->USART_CPOL)); + assert_param(IS_USART_CPHA(USART_ClockInitStruct->USART_CPHA)); + assert_param(IS_USART_LASTBIT(USART_ClockInitStruct->USART_LastBit)); + +/*---------------------------- USART CR2 Configuration -----------------------*/ + tmpreg = USARTx->CR2; + /* Clear CLKEN, CPOL, CPHA and LBCL bits */ + tmpreg &= CR2_CLOCK_CLEAR_Mask; + /* Configure the USART Clock, CPOL, CPHA and LastBit ------------*/ + /* Set CLKEN bit according to USART_Clock value */ + /* Set CPOL bit according to USART_CPOL value */ + /* Set CPHA bit according to USART_CPHA value */ + /* Set LBCL bit according to USART_LastBit value */ + tmpreg |= (uint32_t)USART_ClockInitStruct->USART_Clock | USART_ClockInitStruct->USART_CPOL | + USART_ClockInitStruct->USART_CPHA | USART_ClockInitStruct->USART_LastBit; + /* Write to USART CR2 */ + USARTx->CR2 = (uint16_t)tmpreg; +} + +/** + * @brief Fills each USART_ClockInitStruct member with its default value. + * @param USART_ClockInitStruct: pointer to a USART_ClockInitTypeDef + * structure which will be initialized. + * @retval None + */ +void USART_ClockStructInit(USART_ClockInitTypeDef* USART_ClockInitStruct) +{ + /* USART_ClockInitStruct members default value */ + USART_ClockInitStruct->USART_Clock = USART_Clock_Disable; + USART_ClockInitStruct->USART_CPOL = USART_CPOL_Low; + USART_ClockInitStruct->USART_CPHA = USART_CPHA_1Edge; + USART_ClockInitStruct->USART_LastBit = USART_LastBit_Disable; +} + +/** + * @brief Enables or disables the specified USART peripheral. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param NewState: new state of the USARTx peripheral. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected USART by setting the UE bit in the CR1 register */ + USARTx->CR1 |= CR1_UE_Set; + } + else + { + /* Disable the selected USART by clearing the UE bit in the CR1 register */ + USARTx->CR1 &= CR1_UE_Reset; + } +} + +/** + * @brief Enables or disables the specified USART interrupts. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param USART_IT: specifies the USART interrupt sources to be enabled or disabled. + * This parameter can be one of the following values: + * @arg USART_IT_CTS: CTS change interrupt (not available for UART4 and UART5) + * @arg USART_IT_LBD: LIN Break detection interrupt + * @arg USART_IT_TXE: Transmit Data Register empty interrupt + * @arg USART_IT_TC: Transmission complete interrupt + * @arg USART_IT_RXNE: Receive Data register not empty interrupt + * @arg USART_IT_IDLE: Idle line detection interrupt + * @arg USART_IT_PE: Parity Error interrupt + * @arg USART_IT_ERR: Error interrupt(Frame error, noise error, overrun error) + * @param NewState: new state of the specified USARTx interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState) +{ + uint32_t usartreg = 0x00, itpos = 0x00, itmask = 0x00; + uint32_t usartxbase = 0x00; + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_USART_CONFIG_IT(USART_IT)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + /* The CTS interrupt is not available for UART4 and UART5 */ + if (USART_IT == USART_IT_CTS) + { + assert_param(IS_USART_123_PERIPH(USARTx)); + } + + usartxbase = (uint32_t)USARTx; + + /* Get the USART register index */ + usartreg = (((uint8_t)USART_IT) >> 0x05); + + /* Get the interrupt position */ + itpos = USART_IT & IT_Mask; + itmask = (((uint32_t)0x01) << itpos); + + if (usartreg == 0x01) /* The IT is in CR1 register */ + { + usartxbase += 0x0C; + } + else if (usartreg == 0x02) /* The IT is in CR2 register */ + { + usartxbase += 0x10; + } + else /* The IT is in CR3 register */ + { + usartxbase += 0x14; + } + if (NewState != DISABLE) + { + *(__IO uint32_t*)usartxbase |= itmask; + } + else + { + *(__IO uint32_t*)usartxbase &= ~itmask; + } +} + +/** + * @brief Enables or disables the USART’s DMA interface. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param USART_DMAReq: specifies the DMA request. + * This parameter can be any combination of the following values: + * @arg USART_DMAReq_Tx: USART DMA transmit request + * @arg USART_DMAReq_Rx: USART DMA receive request + * @param NewState: new state of the DMA Request sources. + * This parameter can be: ENABLE or DISABLE. + * @note The DMA mode is not available for UART5 except in the STM32 + * High density value line devices(STM32F10X_HD_VL). + * @retval None + */ +void USART_DMACmd(USART_TypeDef* USARTx, uint16_t USART_DMAReq, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_USART_DMAREQ(USART_DMAReq)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the DMA transfer for selected requests by setting the DMAT and/or + DMAR bits in the USART CR3 register */ + USARTx->CR3 |= USART_DMAReq; + } + else + { + /* Disable the DMA transfer for selected requests by clearing the DMAT and/or + DMAR bits in the USART CR3 register */ + USARTx->CR3 &= (uint16_t)~USART_DMAReq; + } +} + +/** + * @brief Sets the address of the USART node. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param USART_Address: Indicates the address of the USART node. + * @retval None + */ +void USART_SetAddress(USART_TypeDef* USARTx, uint8_t USART_Address) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_USART_ADDRESS(USART_Address)); + + /* Clear the USART address */ + USARTx->CR2 &= CR2_Address_Mask; + /* Set the USART address node */ + USARTx->CR2 |= USART_Address; +} + +/** + * @brief Selects the USART WakeUp method. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param USART_WakeUp: specifies the USART wakeup method. + * This parameter can be one of the following values: + * @arg USART_WakeUp_IdleLine: WakeUp by an idle line detection + * @arg USART_WakeUp_AddressMark: WakeUp by an address mark + * @retval None + */ +void USART_WakeUpConfig(USART_TypeDef* USARTx, uint16_t USART_WakeUp) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_USART_WAKEUP(USART_WakeUp)); + + USARTx->CR1 &= CR1_WAKE_Mask; + USARTx->CR1 |= USART_WakeUp; +} + +/** + * @brief Determines if the USART is in mute mode or not. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param NewState: new state of the USART mute mode. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void USART_ReceiverWakeUpCmd(USART_TypeDef* USARTx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the USART mute mode by setting the RWU bit in the CR1 register */ + USARTx->CR1 |= CR1_RWU_Set; + } + else + { + /* Disable the USART mute mode by clearing the RWU bit in the CR1 register */ + USARTx->CR1 &= CR1_RWU_Reset; + } +} + +/** + * @brief Sets the USART LIN Break detection length. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param USART_LINBreakDetectLength: specifies the LIN break detection length. + * This parameter can be one of the following values: + * @arg USART_LINBreakDetectLength_10b: 10-bit break detection + * @arg USART_LINBreakDetectLength_11b: 11-bit break detection + * @retval None + */ +void USART_LINBreakDetectLengthConfig(USART_TypeDef* USARTx, uint16_t USART_LINBreakDetectLength) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_USART_LIN_BREAK_DETECT_LENGTH(USART_LINBreakDetectLength)); + + USARTx->CR2 &= CR2_LBDL_Mask; + USARTx->CR2 |= USART_LINBreakDetectLength; +} + +/** + * @brief Enables or disables the USART’s LIN mode. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param NewState: new state of the USART LIN mode. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void USART_LINCmd(USART_TypeDef* USARTx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the LIN mode by setting the LINEN bit in the CR2 register */ + USARTx->CR2 |= CR2_LINEN_Set; + } + else + { + /* Disable the LIN mode by clearing the LINEN bit in the CR2 register */ + USARTx->CR2 &= CR2_LINEN_Reset; + } +} + +/** + * @brief Transmits single data through the USARTx peripheral. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param Data: the data to transmit. + * @retval None + */ +void USART_SendData(USART_TypeDef* USARTx, uint16_t Data) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_USART_DATA(Data)); + + /* Transmit Data */ + USARTx->DR = (Data & (uint16_t)0x01FF); +} + +/** + * @brief Returns the most recent received data by the USARTx peripheral. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @retval The received data. + */ +uint16_t USART_ReceiveData(USART_TypeDef* USARTx) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + + /* Receive Data */ + return (uint16_t)(USARTx->DR & (uint16_t)0x01FF); +} + +/** + * @brief Transmits break characters. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @retval None + */ +void USART_SendBreak(USART_TypeDef* USARTx) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + + /* Send break characters */ + USARTx->CR1 |= CR1_SBK_Set; +} + +/** + * @brief Sets the specified USART guard time. + * @param USARTx: where x can be 1, 2 or 3 to select the USART peripheral. + * @param USART_GuardTime: specifies the guard time. + * @note The guard time bits are not available for UART4 and UART5. + * @retval None + */ +void USART_SetGuardTime(USART_TypeDef* USARTx, uint8_t USART_GuardTime) +{ + /* Check the parameters */ + assert_param(IS_USART_123_PERIPH(USARTx)); + + /* Clear the USART Guard time */ + USARTx->GTPR &= GTPR_LSB_Mask; + /* Set the USART guard time */ + USARTx->GTPR |= (uint16_t)((uint16_t)USART_GuardTime << 0x08); +} + +/** + * @brief Sets the system clock prescaler. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param USART_Prescaler: specifies the prescaler clock. + * @note The function is used for IrDA mode with UART4 and UART5. + * @retval None + */ +void USART_SetPrescaler(USART_TypeDef* USARTx, uint8_t USART_Prescaler) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + + /* Clear the USART prescaler */ + USARTx->GTPR &= GTPR_MSB_Mask; + /* Set the USART prescaler */ + USARTx->GTPR |= USART_Prescaler; +} + +/** + * @brief Enables or disables the USART’s Smart Card mode. + * @param USARTx: where x can be 1, 2 or 3 to select the USART peripheral. + * @param NewState: new state of the Smart Card mode. + * This parameter can be: ENABLE or DISABLE. + * @note The Smart Card mode is not available for UART4 and UART5. + * @retval None + */ +void USART_SmartCardCmd(USART_TypeDef* USARTx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_USART_123_PERIPH(USARTx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the SC mode by setting the SCEN bit in the CR3 register */ + USARTx->CR3 |= CR3_SCEN_Set; + } + else + { + /* Disable the SC mode by clearing the SCEN bit in the CR3 register */ + USARTx->CR3 &= CR3_SCEN_Reset; + } +} + +/** + * @brief Enables or disables NACK transmission. + * @param USARTx: where x can be 1, 2 or 3 to select the USART peripheral. + * @param NewState: new state of the NACK transmission. + * This parameter can be: ENABLE or DISABLE. + * @note The Smart Card mode is not available for UART4 and UART5. + * @retval None + */ +void USART_SmartCardNACKCmd(USART_TypeDef* USARTx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_USART_123_PERIPH(USARTx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the NACK transmission by setting the NACK bit in the CR3 register */ + USARTx->CR3 |= CR3_NACK_Set; + } + else + { + /* Disable the NACK transmission by clearing the NACK bit in the CR3 register */ + USARTx->CR3 &= CR3_NACK_Reset; + } +} + +/** + * @brief Enables or disables the USART’s Half Duplex communication. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param NewState: new state of the USART Communication. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void USART_HalfDuplexCmd(USART_TypeDef* USARTx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the Half-Duplex mode by setting the HDSEL bit in the CR3 register */ + USARTx->CR3 |= CR3_HDSEL_Set; + } + else + { + /* Disable the Half-Duplex mode by clearing the HDSEL bit in the CR3 register */ + USARTx->CR3 &= CR3_HDSEL_Reset; + } +} + + +/** + * @brief Enables or disables the USART's 8x oversampling mode. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param NewState: new state of the USART one bit sampling method. + * This parameter can be: ENABLE or DISABLE. + * @note + * This function has to be called before calling USART_Init() + * function in order to have correct baudrate Divider value. + * @retval None + */ +void USART_OverSampling8Cmd(USART_TypeDef* USARTx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the 8x Oversampling mode by setting the OVER8 bit in the CR1 register */ + USARTx->CR1 |= CR1_OVER8_Set; + } + else + { + /* Disable the 8x Oversampling mode by clearing the OVER8 bit in the CR1 register */ + USARTx->CR1 &= CR1_OVER8_Reset; + } +} + +/** + * @brief Enables or disables the USART's one bit sampling method. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param NewState: new state of the USART one bit sampling method. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void USART_OneBitMethodCmd(USART_TypeDef* USARTx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the one bit method by setting the ONEBITE bit in the CR3 register */ + USARTx->CR3 |= CR3_ONEBITE_Set; + } + else + { + /* Disable tthe one bit method by clearing the ONEBITE bit in the CR3 register */ + USARTx->CR3 &= CR3_ONEBITE_Reset; + } +} + +/** + * @brief Configures the USART's IrDA interface. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param USART_IrDAMode: specifies the IrDA mode. + * This parameter can be one of the following values: + * @arg USART_IrDAMode_LowPower + * @arg USART_IrDAMode_Normal + * @retval None + */ +void USART_IrDAConfig(USART_TypeDef* USARTx, uint16_t USART_IrDAMode) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_USART_IRDA_MODE(USART_IrDAMode)); + + USARTx->CR3 &= CR3_IRLP_Mask; + USARTx->CR3 |= USART_IrDAMode; +} + +/** + * @brief Enables or disables the USART's IrDA interface. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param NewState: new state of the IrDA mode. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void USART_IrDACmd(USART_TypeDef* USARTx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the IrDA mode by setting the IREN bit in the CR3 register */ + USARTx->CR3 |= CR3_IREN_Set; + } + else + { + /* Disable the IrDA mode by clearing the IREN bit in the CR3 register */ + USARTx->CR3 &= CR3_IREN_Reset; + } +} + +/** + * @brief Checks whether the specified USART flag is set or not. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param USART_FLAG: specifies the flag to check. + * This parameter can be one of the following values: + * @arg USART_FLAG_CTS: CTS Change flag (not available for UART4 and UART5) + * @arg USART_FLAG_LBD: LIN Break detection flag + * @arg USART_FLAG_TXE: Transmit data register empty flag + * @arg USART_FLAG_TC: Transmission Complete flag + * @arg USART_FLAG_RXNE: Receive data register not empty flag + * @arg USART_FLAG_IDLE: Idle Line detection flag + * @arg USART_FLAG_ORE: OverRun Error flag + * @arg USART_FLAG_NE: Noise Error flag + * @arg USART_FLAG_FE: Framing Error flag + * @arg USART_FLAG_PE: Parity Error flag + * @retval The new state of USART_FLAG (SET or RESET). + */ +FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_USART_FLAG(USART_FLAG)); + /* The CTS flag is not available for UART4 and UART5 */ + if (USART_FLAG == USART_FLAG_CTS) + { + assert_param(IS_USART_123_PERIPH(USARTx)); + } + + if ((USARTx->SR & USART_FLAG) != (uint16_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Clears the USARTx's pending flags. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param USART_FLAG: specifies the flag to clear. + * This parameter can be any combination of the following values: + * @arg USART_FLAG_CTS: CTS Change flag (not available for UART4 and UART5). + * @arg USART_FLAG_LBD: LIN Break detection flag. + * @arg USART_FLAG_TC: Transmission Complete flag. + * @arg USART_FLAG_RXNE: Receive data register not empty flag. + * + * @note + * - PE (Parity error), FE (Framing error), NE (Noise error), ORE (OverRun + * error) and IDLE (Idle line detected) flags are cleared by software + * sequence: a read operation to USART_SR register (USART_GetFlagStatus()) + * followed by a read operation to USART_DR register (USART_ReceiveData()). + * - RXNE flag can be also cleared by a read to the USART_DR register + * (USART_ReceiveData()). + * - TC flag can be also cleared by software sequence: a read operation to + * USART_SR register (USART_GetFlagStatus()) followed by a write operation + * to USART_DR register (USART_SendData()). + * - TXE flag is cleared only by a write to the USART_DR register + * (USART_SendData()). + * @retval None + */ +void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_USART_CLEAR_FLAG(USART_FLAG)); + /* The CTS flag is not available for UART4 and UART5 */ + if ((USART_FLAG & USART_FLAG_CTS) == USART_FLAG_CTS) + { + assert_param(IS_USART_123_PERIPH(USARTx)); + } + + USARTx->SR = (uint16_t)~USART_FLAG; +} + +/** + * @brief Checks whether the specified USART interrupt has occurred or not. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param USART_IT: specifies the USART interrupt source to check. + * This parameter can be one of the following values: + * @arg USART_IT_CTS: CTS change interrupt (not available for UART4 and UART5) + * @arg USART_IT_LBD: LIN Break detection interrupt + * @arg USART_IT_TXE: Tansmit Data Register empty interrupt + * @arg USART_IT_TC: Transmission complete interrupt + * @arg USART_IT_RXNE: Receive Data register not empty interrupt + * @arg USART_IT_IDLE: Idle line detection interrupt + * @arg USART_IT_ORE: OverRun Error interrupt + * @arg USART_IT_NE: Noise Error interrupt + * @arg USART_IT_FE: Framing Error interrupt + * @arg USART_IT_PE: Parity Error interrupt + * @retval The new state of USART_IT (SET or RESET). + */ +ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT) +{ + uint32_t bitpos = 0x00, itmask = 0x00, usartreg = 0x00; + ITStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_USART_GET_IT(USART_IT)); + /* The CTS interrupt is not available for UART4 and UART5 */ + if (USART_IT == USART_IT_CTS) + { + assert_param(IS_USART_123_PERIPH(USARTx)); + } + + /* Get the USART register index */ + usartreg = (((uint8_t)USART_IT) >> 0x05); + /* Get the interrupt position */ + itmask = USART_IT & IT_Mask; + itmask = (uint32_t)0x01 << itmask; + + if (usartreg == 0x01) /* The IT is in CR1 register */ + { + itmask &= USARTx->CR1; + } + else if (usartreg == 0x02) /* The IT is in CR2 register */ + { + itmask &= USARTx->CR2; + } + else /* The IT is in CR3 register */ + { + itmask &= USARTx->CR3; + } + + bitpos = USART_IT >> 0x08; + bitpos = (uint32_t)0x01 << bitpos; + bitpos &= USARTx->SR; + if ((itmask != (uint16_t)RESET)&&(bitpos != (uint16_t)RESET)) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/** + * @brief Clears the USARTx's interrupt pending bits. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param USART_IT: specifies the interrupt pending bit to clear. + * This parameter can be one of the following values: + * @arg USART_IT_CTS: CTS change interrupt (not available for UART4 and UART5) + * @arg USART_IT_LBD: LIN Break detection interrupt + * @arg USART_IT_TC: Transmission complete interrupt. + * @arg USART_IT_RXNE: Receive Data register not empty interrupt. + * + * @note + * - PE (Parity error), FE (Framing error), NE (Noise error), ORE (OverRun + * error) and IDLE (Idle line detected) pending bits are cleared by + * software sequence: a read operation to USART_SR register + * (USART_GetITStatus()) followed by a read operation to USART_DR register + * (USART_ReceiveData()). + * - RXNE pending bit can be also cleared by a read to the USART_DR register + * (USART_ReceiveData()). + * - TC pending bit can be also cleared by software sequence: a read + * operation to USART_SR register (USART_GetITStatus()) followed by a write + * operation to USART_DR register (USART_SendData()). + * - TXE pending bit is cleared only by a write to the USART_DR register + * (USART_SendData()). + * @retval None + */ +void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT) +{ + uint16_t bitpos = 0x00, itmask = 0x00; + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_USART_CLEAR_IT(USART_IT)); + /* The CTS interrupt is not available for UART4 and UART5 */ + if (USART_IT == USART_IT_CTS) + { + assert_param(IS_USART_123_PERIPH(USARTx)); + } + + bitpos = USART_IT >> 0x08; + itmask = ((uint16_t)0x01 << (uint16_t)bitpos); + USARTx->SR = (uint16_t)~itmask; +} +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_wwdg.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_wwdg.c new file mode 100644 index 0000000..77a7ce5 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_wwdg.c @@ -0,0 +1,224 @@ +/** + ****************************************************************************** + * @file stm32f10x_wwdg.c + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief This file provides all the WWDG firmware functions. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_wwdg.h" +#include "stm32f10x_rcc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup WWDG + * @brief WWDG driver modules + * @{ + */ + +/** @defgroup WWDG_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup WWDG_Private_Defines + * @{ + */ + +/* ----------- WWDG registers bit address in the alias region ----------- */ +#define WWDG_OFFSET (WWDG_BASE - PERIPH_BASE) + +/* Alias word address of EWI bit */ +#define CFR_OFFSET (WWDG_OFFSET + 0x04) +#define EWI_BitNumber 0x09 +#define CFR_EWI_BB (PERIPH_BB_BASE + (CFR_OFFSET * 32) + (EWI_BitNumber * 4)) + +/* --------------------- WWDG registers bit mask ------------------------ */ + +/* CR register bit mask */ +#define CR_WDGA_Set ((uint32_t)0x00000080) + +/* CFR register bit mask */ +#define CFR_WDGTB_Mask ((uint32_t)0xFFFFFE7F) +#define CFR_W_Mask ((uint32_t)0xFFFFFF80) +#define BIT_Mask ((uint8_t)0x7F) + +/** + * @} + */ + +/** @defgroup WWDG_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup WWDG_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup WWDG_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup WWDG_Private_Functions + * @{ + */ + +/** + * @brief Deinitializes the WWDG peripheral registers to their default reset values. + * @param None + * @retval None + */ +void WWDG_DeInit(void) +{ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_WWDG, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_WWDG, DISABLE); +} + +/** + * @brief Sets the WWDG Prescaler. + * @param WWDG_Prescaler: specifies the WWDG Prescaler. + * This parameter can be one of the following values: + * @arg WWDG_Prescaler_1: WWDG counter clock = (PCLK1/4096)/1 + * @arg WWDG_Prescaler_2: WWDG counter clock = (PCLK1/4096)/2 + * @arg WWDG_Prescaler_4: WWDG counter clock = (PCLK1/4096)/4 + * @arg WWDG_Prescaler_8: WWDG counter clock = (PCLK1/4096)/8 + * @retval None + */ +void WWDG_SetPrescaler(uint32_t WWDG_Prescaler) +{ + uint32_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_WWDG_PRESCALER(WWDG_Prescaler)); + /* Clear WDGTB[1:0] bits */ + tmpreg = WWDG->CFR & CFR_WDGTB_Mask; + /* Set WDGTB[1:0] bits according to WWDG_Prescaler value */ + tmpreg |= WWDG_Prescaler; + /* Store the new value */ + WWDG->CFR = tmpreg; +} + +/** + * @brief Sets the WWDG window value. + * @param WindowValue: specifies the window value to be compared to the downcounter. + * This parameter value must be lower than 0x80. + * @retval None + */ +void WWDG_SetWindowValue(uint8_t WindowValue) +{ + __IO uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_WWDG_WINDOW_VALUE(WindowValue)); + /* Clear W[6:0] bits */ + + tmpreg = WWDG->CFR & CFR_W_Mask; + + /* Set W[6:0] bits according to WindowValue value */ + tmpreg |= WindowValue & (uint32_t) BIT_Mask; + + /* Store the new value */ + WWDG->CFR = tmpreg; +} + +/** + * @brief Enables the WWDG Early Wakeup interrupt(EWI). + * @param None + * @retval None + */ +void WWDG_EnableIT(void) +{ + *(__IO uint32_t *) CFR_EWI_BB = (uint32_t)ENABLE; +} + +/** + * @brief Sets the WWDG counter value. + * @param Counter: specifies the watchdog counter value. + * This parameter must be a number between 0x40 and 0x7F. + * @retval None + */ +void WWDG_SetCounter(uint8_t Counter) +{ + /* Check the parameters */ + assert_param(IS_WWDG_COUNTER(Counter)); + /* Write to T[6:0] bits to configure the counter value, no need to do + a read-modify-write; writing a 0 to WDGA bit does nothing */ + WWDG->CR = Counter & BIT_Mask; +} + +/** + * @brief Enables WWDG and load the counter value. + * @param Counter: specifies the watchdog counter value. + * This parameter must be a number between 0x40 and 0x7F. + * @retval None + */ +void WWDG_Enable(uint8_t Counter) +{ + /* Check the parameters */ + assert_param(IS_WWDG_COUNTER(Counter)); + WWDG->CR = CR_WDGA_Set | Counter; +} + +/** + * @brief Checks whether the Early Wakeup interrupt flag is set or not. + * @param None + * @retval The new state of the Early Wakeup interrupt flag (SET or RESET) + */ +FlagStatus WWDG_GetFlagStatus(void) +{ + return (FlagStatus)(WWDG->SR); +} + +/** + * @brief Clears Early Wakeup interrupt flag. + * @param None + * @retval None + */ +void WWDG_ClearFlag(void) +{ + WWDG->SR = (uint32_t)RESET; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Makefile b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Makefile new file mode 100644 index 0000000..440e36f --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/STM32F10x_StdPeriph_Lib_V3.5.0/Makefile @@ -0,0 +1,69 @@ +# STM support library + +STM32_STDPERIPH_INC = Libraries/STM32F10x_StdPeriph_Driver/inc/ +CORE_DIR = Libraries/CMSIS/CM3/CoreSupport/ +DEVICE_SUPPORT_DIR = Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x + +SRC_DIR = Libraries/STM32F10x_StdPeriph_Driver/src/ + +INCLUDE_DIRS = \ +-I$(DEVICE_SUPPORT_DIR) \ +-I$(CORE_DIR) \ +-I$(STM32_STDPERIPH_INC) \ + + +OBJ_DIR = Libraries/STM32F10x_StdPeriph_Driver/obj + +CROSS_COMPILE = arm-none-eabi- + +CC = $(CROSS_COMPILE)gcc +CCFLAGS = -c -O2 -g -fno-common -mcpu=cortex-m3 -mthumb -DUSE_FULL_ASSERT $(INCLUDE_DIRS) -I. -Wall -Werror -D"assert_param(expr)=((void)0)" + +AR = $(CROSS_COMPILE)ar +ARFLAGS = rs + +OBJECTS = \ +misc.o \ +stm32f10x_adc.o \ +stm32f10x_bkp.o \ +stm32f10x_can.o \ +stm32f10x_cec.o \ +stm32f10x_crc.o \ +stm32f10x_dac.o \ +stm32f10x_dbgmcu.o \ +stm32f10x_dma.o \ +stm32f10x_exti.o \ +stm32f10x_flash.o \ +stm32f10x_fsmc.o \ +stm32f10x_gpio.o \ +stm32f10x_i2c.o \ +stm32f10x_iwdg.o \ +stm32f10x_pwr.o \ +stm32f10x_rcc.o \ +stm32f10x_rtc.o \ +stm32f10x_sdio.o \ +stm32f10x_spi.o \ +stm32f10x_tim.o \ +stm32f10x_usart.o \ +stm32f10x_wwdg.o + +LIBRARY = libSTM_StdPeriph.a + +vpath %.c $(SRC_DIR) +vpath %.o $(OBJ_DIR) + +all: $(LIBRARY) + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +clean: + rm -rf $(LIBRARY) $(OBJ_DIR) + +$(OBJ_DIR): + mkdir -p $@ + +.PHONY: all clean diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/hsb-mrts/.cproject b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/hsb-mrts/.cproject new file mode 100644 index 0000000..a7b9a50 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/hsb-mrts/.cproject @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + make + + All + true + true + true + + + + + + + + + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/hsb-mrts/.project b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/hsb-mrts/.project new file mode 100644 index 0000000..9862bd2 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/hsb-mrts/.project @@ -0,0 +1,29 @@ + + + hsb-mrts + + + FreeRTOS + STM32F10x_StdPeriph_Lib_V3.5.0 + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + fr.ac6.mcu.ide.core.MCUProjectNature + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/hsb-mrts/.settings/language.settings.xml b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/hsb-mrts/.settings/language.settings.xml new file mode 100644 index 0000000..20d9403 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/hsb-mrts/.settings/language.settings.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/hsb-mrts/Makefile b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/hsb-mrts/Makefile new file mode 100644 index 0000000..534e384 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/hsb-mrts/Makefile @@ -0,0 +1,135 @@ +ifndef EXECUTABLE + +# Define release version for Adremo firmware here +S0_RELEASE_PRODUCT = \""S0\"" +S0_RELEASE_MAJOR = 0 +S0_RELEASE_MINOR = 1 +S0_RELEASE_BRANCH = 0 +S0_RELEASE_REVISION = 0 + + +# Main objects (not to be added in the library) +OBJECTS_MAIN = \ +main.o + +# Objects to be build for both the simulation and real target +OBJECTS_GEN = \ +\ +system_stm32f10x.o \ +sysmem.o \ +startup_stm32.o \ +\ +freeRTOSFixes.o \ +heap_4.o\ +list.o \ +port.o \ +queue.o \ +tasks.o \ +timers.o + +STM32_STDPERIPH_ROOT = ../STM32F10x_StdPeriph_Lib_V3.5.0 +STM32_STDPERIPH_INC = ../STM32F10x_StdPeriph_Lib_V3.5.0/inc +STM32_DEVICE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x +STM32_CORE_SUPPORT_DIR = ../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport +FREERTOS_DIR = ../FreeRTOS/Source/include +FREERTOS_PORT_DIR = ../FreeRTOS/Source/portable/GCC/ARM_CM3 + +LINKER_SCRIPTS_DIR = linker +LINKER_SCRIPT = LinkerScript.ld +STARTER_SCRIPT_DIR = startup + +RELEASE_DEFINES = \ +-DRELEASE_PRODUCT=$(RELEASE_PRODUCT) \ +-DRELEASE_MAJOR=$(RELEASE_MAJOR) \ +-DRELEASE_MINOR=$(RELEASE_MINOR) \ +-DRELEASE_BRANCH=$(RELEASE_BRANCH) \ +-DRELEASE_REVISION=$(RELEASE_REVISION) \ + +INCLUDES = \ +-Iinc \ +-I$(STM32_STDPERIPH_INC) \ +-I$(FREERTOS_DIR) \ +-I$(FREERTOS_PORT_DIR) \ +-I$(STM32_DEVICE_SUPPORT_DIR) \ +-I$(STM32_CORE_SUPPORT_DIR) + +all: release +release: export RELEASE_PRODUCT := $(S0_RELEASE_PRODUCT) +release: export RELEASE_MAJOR := $(S0_RELEASE_MAJOR) +release: export RELEASE_MINOR := $(S0_RELEASE_MINOR) +release: export RELEASE_BRANCH := $(S0_RELEASE_BRANCH) +release: export RELEASE_REVISION := $(S0_RELEASE_REVISION) +release: export OBJ_DIR := obj_release/ +release: export OBJECTS := $(OBJECTS_GEN) +release: export OBJECTS_MAIN := $(OBJECTS_MAIN) +release: export CROSS_COMPILE := arm-none-eabi- +release: export CCFLAGS := -c -O2 -Wall -g -lc -lm -fno-common -mcpu=cortex-m3 -mthumb $(RELEASE_DEFINES) $(INCLUDES) +release: export ASFLAGS := -g -mapcs-32 +release: export LDFLAGS := -g -nostartfiles -mcpu=cortex-m3 -mthumb -T$(LINKER_SCRIPTS_DIR)/$(LINKER_SCRIPT) -Wl,-Map=hsb_mrts_release.map +release: export LDARCHIVES := -L. -L$(STM32_STDPERIPH_ROOT) -lSTM_StdPeriph -lhsb_mrts_release +release: export ARFLAGS := ru +release: export OBJCOPYFLAGS := -O binary +release: export OBJDUMPFLAGS := -x --syms -S +release: export EXECUTABLE := hsb_mrts_release.out +release: export BINFILE := hsb_mrts_release.bin +release: export LIBRARY := libhsb_mrts_release.a +release: export LISTFILE := hsb_mrts_release.list +release: ;@$(MAKE) + + +clean: + rm -f hsb_mrts_release.out hsb_mrts_release.map hsb_mrts_release.bin hsb_mrts_release.list hsb_mrts_release.map libhsb_mrts_release.a + rm -rf obj_release + +flash: + st-flash write hsdb_mrts_release.bin 0x8000000 + +doc: + doxygen 0322-Adremo.dox + +.PHONY: all clean doc flash + +else + +vpath %.c \ +src \ +startup \ +../FreeRTOS/Source \ +../FreeRTOS/Source/portable/GCC/ARM_CM3 \ +../FreeRTOS/Source/portable/MemMang \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x \ +../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport + +vpath %.s \ +startup +vpath %.o \ +obj_release + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +AR = $(CROSS_COMPILE)ar +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump + +$(BINFILE): $(EXECUTABLE) + $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + $(OBJDUMP) $(OBJDUMPFLAGS) $< > $(LISTFILE) + cp $@ ../$@ + +$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS_MAIN) $(LIBRARY) + $(LD) $(LDFLAGS) $(addprefix $(OBJ_DIR)/, $(OBJECTS_MAIN)) $(LDARCHIVES) -o $@ + +$(LIBRARY): $(OBJ_DIR) $(OBJECTS) | $(OBJ_DIR) + $(AR) $(ARFLAGS) $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) + +%.o: %.c + $(CC) $(CCFLAGS) $< -o $(OBJ_DIR)/$@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $(OBJ_DIR)/$@ + +$(OBJ_DIR): + mkdir -p $@ + +endif \ No newline at end of file diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/hsb-mrts/inc/FreeRTOSConfig.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/hsb-mrts/inc/FreeRTOSConfig.h new file mode 100644 index 0000000..fb59bdc --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/hsb-mrts/inc/FreeRTOSConfig.h @@ -0,0 +1,116 @@ +// ----------------------------------------------------------------------------- +/// @file FreeRTOSConfig.h +/// @brief File description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision$ +/// $Author$ +/// $Date$ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @defgroup {group_name} {group_description} +/// Description + +/// @file FreeRTOSConfig.h +/// @ingroup {group_name} + + +#ifndef FREERTOSCONFIG_H_ +#define FREERTOSCONFIG_H_ + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + +#define configUSE_PREEMPTION 1 +#define configUSE_IDLE_HOOK 0 +#define configUSE_TICK_HOOK 1 +#define configCPU_CLOCK_HZ ( ( unsigned long ) 62500000 ) +#define configTICK_RATE_HZ ( ( TickType_t ) 1000 ) +#define configMAX_PRIORITIES ( 5 ) +#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 128 ) +#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 30 * 1024 ) ) +#define configMAX_TASK_NAME_LEN ( 16 ) +#define configUSE_TRACE_FACILITY 1 +#define configUSE_16_BIT_TICKS 0 +#define configIDLE_SHOULD_YIELD 1 + +/* Co-routine definitions. */ +#define configUSE_CO_ROUTINES 0 +#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) + +#define configUSE_MUTEXES 1 +#define configUSE_COUNTING_SEMAPHORES 0 +#define configUSE_ALTERNATIVE_API 0 +#define configCHECK_FOR_STACK_OVERFLOW 2 +#define configUSE_RECURSIVE_MUTEXES 1 +#define configQUEUE_REGISTRY_SIZE 0 +#define configGENERATE_RUN_TIME_STATS 1 + +/* Set the following definitions to 1 to include the API function, or zero +to exclude the API function. */ + +#define INCLUDE_vTaskPrioritySet 1 +#define INCLUDE_uxTaskPriorityGet 1 +#define INCLUDE_vTaskDelete 1 +#define INCLUDE_vTaskCleanUpResources 0 +#define INCLUDE_vTaskSuspend 1 +#define INCLUDE_vTaskDelayUntil 1 +#define INCLUDE_vTaskDelay 1 + +/* This demo makes use of one or more example stats formatting functions. These +format the raw data provided by the uxTaskGetSystemState() function in to human +readable ASCII form. See the notes in the implementation of vTaskList() within +FreeRTOS/Source/tasks.c for limitations. */ +#define configUSE_STATS_FORMATTING_FUNCTIONS 1 + +/* This is the raw value as per the Cortex-M3 NVIC. Values can be 255 +(lowest) to 0 (1?) (highest). */ +#define configKERNEL_INTERRUPT_PRIORITY 255 +/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!! +See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */ +#define configMAX_SYSCALL_INTERRUPT_PRIORITY 191 /* equivalent to 0xb0, or priority 11. */ + + +/* This is the value being used as per the ST library which permits 16 +priority values, 0 to 15. This must correspond to the +configKERNEL_INTERRUPT_PRIORITY setting. Here 15 corresponds to the lowest +NVIC value of 255. */ +#define configLIBRARY_KERNEL_INTERRUPT_PRIORITY 15 + +// ----------------------------------------------------------------------------- +// Type definitions. +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + +/*----------------------------------------------------------- + * Macros required to setup the timer for the run time stats. + *-----------------------------------------------------------*/ +/* The run time stats time base just uses the existing high frequency timer +test clock. All these macros do is clear and return the high frequency +interrupt count respectively. */ +extern unsigned long ulRunTimeStatsClock; +#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() ulRunTimeStatsClock = 0 +#define portGET_RUN_TIME_COUNTER_VALUE() ulRunTimeStatsClock + +#endif /* FREERTOSCONFIG_H_ */ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/hsb-mrts/inc/freeRTOSFixes.h b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/hsb-mrts/inc/freeRTOSFixes.h new file mode 100644 index 0000000..1b798d4 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/hsb-mrts/inc/freeRTOSFixes.h @@ -0,0 +1,57 @@ +// ----------------------------------------------------------------------------- +/// @file freeRTOSFixes.h +/// @brief File description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision$ +/// $Author$ +/// $Date$ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @defgroup {group_name} {group_description} +/// Description + +/// @file freeRTOSFixes.h +/// @ingroup {group_name} + + +#ifndef FREERTOSFIXES_H_ +#define FREERTOSFIXES_H_ + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + +#include "FreeRTOS.h" +#include "task.h" + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Type definitions. +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + +void OS_logTaskInfo(xTaskHandle taskHandle); + + +#endif /* FREERTOSFIXES_H_ */ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/hsb-mrts/linker/LinkerScript.ld b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/hsb-mrts/linker/LinkerScript.ld new file mode 100644 index 0000000..2de5144 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/hsb-mrts/linker/LinkerScript.ld @@ -0,0 +1,204 @@ +/* +****************************************************************************** +** +** File : LinkerScript.ld +** +** Author : Auto-generated by Ac6 System Workbench +** +** Abstract : Linker script for STM32F107VCTx Device from STM32F1 series +** 64Kbytes RAM +** 256Kbytes ROM +** +** Set heap size, stack size and stack location according +** to application requirements. +** +** Set memory bank area and size if external memory is used. +** +** Target : STMicroelectronics STM32 +** +** Distribution: The file is distributed “as is,” without any warranty +** of any kind. +** +***************************************************************************** +** @attention +** +**

© COPYRIGHT(c) 2017 Ac6

+** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** 1. Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** 3. Neither the name of Ac6 nor the names of its contributors +** may be used to endorse or promote products derived from this software +** without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +***************************************************************************** +*/ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = 0x20010000; /* end of RAM */ + +_Min_Heap_Size = 0; /* required amount of heap */ +_Min_Stack_Size = 0x400; /* required amount of stack */ + +/* Memories definition */ +MEMORY +{ + RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K + ROM (rx) : ORIGIN = 0x8000000, LENGTH = 256K +} + +/* Sections */ +SECTIONS +{ + /* The startup code into ROM memory */ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } >ROM + + /* The program code and other data into ROM memory */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + } >ROM + + /* Constant data into ROM memory*/ + .rodata : + { + . = ALIGN(4); + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + . = ALIGN(4); + } >ROM + + .ARM.extab : { + . = ALIGN(4); + *(.ARM.extab* .gnu.linkonce.armextab.*) + . = ALIGN(4); + } >ROM + + .ARM : { + . = ALIGN(4); + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + . = ALIGN(4); + } >ROM + + .preinit_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + . = ALIGN(4); + } >ROM + + .init_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + . = ALIGN(4); + } >ROM + + .fini_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + . = ALIGN(4); + } >ROM + + /* Used by the startup to initialize data */ + _sidata = LOADADDR(.data); + + /* Initialized data sections into RAM memory */ + .data : + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + } >RAM AT> ROM + + + /* Uninitialized data section into RAM memory */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM + + /* User_heap_stack section, used to check that there is enough RAM left */ + ._user_heap_stack : + { + . = ALIGN(8); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(8); + } >RAM + + + + /* Remove information from the compiler libraries */ +/* /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } +*/ + + .ARM.attributes 0 : { *(.ARM.attributes) } + +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/hsb-mrts/mrts.xml b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/hsb-mrts/mrts.xml new file mode 100644 index 0000000..a447b54 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/hsb-mrts/mrts.xml @@ -0,0 +1,19 @@ + + + + + + + + +]> + + + + mrts + SWD + ST-Link + stm32f107vctx + + diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/hsb-mrts/src/freeRTOSFixes.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/hsb-mrts/src/freeRTOSFixes.c new file mode 100644 index 0000000..20bb301 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/hsb-mrts/src/freeRTOSFixes.c @@ -0,0 +1,109 @@ +// ----------------------------------------------------------------------------- +/// @file freeRTOSFixes.c +/// @brief Description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision$ +/// $Author$ +/// $Date$ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @file freeRTOSFixes.c +/// @ingroup {group_name} + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + +#include +#include +#include + +#include "freeRTOSFixes.h" + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Type definitions +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// File-scope variables +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function definitions +// ----------------------------------------------------------------------------- + +void _init(void) {return;} + +void OS_logTaskInfo(xTaskHandle taskHandle) +{ + unsigned portBASE_TYPE highWaterMark; + char text[128]; + + snprintf(text, sizeof(text), "Task %s\n", pcTaskGetTaskName(taskHandle)); +// Shell_sendString(text); + + highWaterMark = uxTaskGetStackHighWaterMark(taskHandle); +// snprintf(text, sizeof(text), "Stack high water mark : %lu long words\n", highWaterMark); +// Shell_sendString(text); +} + +// Implementation for libc, needed for printf related functions. +caddr_t _sbrk(int incr) +{ + extern char _end; + static char* heap_end; + char* prev_heap_end; + + if(heap_end == 0) + { + heap_end = &_end; + } + + prev_heap_end = heap_end; + heap_end += incr; + return (caddr_t)prev_heap_end; +} + +// Stack overflow hook +void vApplicationStackOverflowHook(xTaskHandle xTask, signed portCHAR* pcTaskName) +{ +// Logger_fatal(FATALCODE_STACKOVERFLOW); +} + +// Malloc failed hook +void vApplicationMallocFailedHook(void) +{ +// Logger_fatal(FATALCODE_MALLOCFAILED); +} + +// Assert for StdPeriph library +void assert_failed(uint8_t* file, uint32_t line) +{ +// Logger_log((char*)file, "", line, LOGTYPE_ERROR, "assert failed"); +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/hsb-mrts/src/main.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/hsb-mrts/src/main.c new file mode 100644 index 0000000..596f3b9 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/hsb-mrts/src/main.c @@ -0,0 +1,85 @@ +// ----------------------------------------------------------------------------- +/// @file main.c +/// @brief Description +// ----------------------------------------------------------------------------- +// Micro-Key bv +// Industrieweg 28, 9804 TG Noordhorn +// Postbus 92, 9800 AB Zuidhorn +// The Netherlands +// Tel: +31 594 503020 +// Fax: +31 594 505825 +// Email: support@microkey.nl +// Web: www.microkey.nl +// ----------------------------------------------------------------------------- +/// $Revision$ +/// $Author$ +/// $Date$ +// (c) 2017 Micro-Key bv +// ----------------------------------------------------------------------------- + +/// @file main.c +/// @ingroup {group_name} + + +// ----------------------------------------------------------------------------- +// Include files +// ----------------------------------------------------------------------------- + +// FreeRTOS includes +#include "FreeRTOS.h" +#include "task.h" + +#include "freeRTOSFixes.h" + +// ----------------------------------------------------------------------------- +// Constant and macro definitions +// ----------------------------------------------------------------------------- + +/* The time between cycles of the 'check' functionality (defined within the +tick hook. */ +#define mainCHECK_DELAY ( ( TickType_t ) 5000 / portTICK_PERIOD_MS ) + +// ----------------------------------------------------------------------------- +// Type definitions +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// File-scope variables +// ----------------------------------------------------------------------------- + +/* Variable that counts at 20KHz to provide the time base for the run time +stats. */ +unsigned long ulRunTimeStatsClock = 0UL; + +// ----------------------------------------------------------------------------- +// Function declarations +// ----------------------------------------------------------------------------- + + + +// ----------------------------------------------------------------------------- +// Function definitions +// ----------------------------------------------------------------------------- + + + +int main (void) +{ + + + /* Start the scheduler. */ + vTaskStartScheduler(); + + /* Will only get here if there was insufficient memory to create the idle + task. The idle task is created within vTaskStartScheduler(). */ + for( ;; ); + + + return -1; +} + +void vApplicationTickHook () +{ + +} diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/hsb-mrts/startup/startup_stm32.s b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/hsb-mrts/startup/startup_stm32.s new file mode 100644 index 0000000..a6ec1c0 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/hsb-mrts/startup/startup_stm32.s @@ -0,0 +1,246 @@ +/** + ****************************************************************************** + * @file startup_stm32.s + * @author Ac6 + * @version V1.0.0 + * @date 12-June-2014 + ****************************************************************************** + */ + + .syntax unified + .cpu cortex-m3 + .thumb + +.global g_pfnVectors +.global Default_Handler + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss + +.equ BootRAM, 0xF1E0F85F +/** + * @brief This is the code that gets called when the processor first + * starts execution following a reset event. Only the absolutely + * necessary set is performed, after which the application + * supplied main() routine is called. + * @param None + * @retval : None +*/ + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + +/* Copy the data segment initializers from flash to SRAM */ + movs r1, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r3, =_sidata + ldr r3, [r3, r1] + str r3, [r0, r1] + adds r1, r1, #4 + +LoopCopyDataInit: + ldr r0, =_sdata + ldr r3, =_edata + adds r2, r0, r1 + cmp r2, r3 + bcc CopyDataInit + ldr r2, =_sbss + b LoopFillZerobss +/* Zero fill the bss segment. */ +FillZerobss: + movs r3, #0 + str r3, [r2] + adds r2, r2, #4 + +LoopFillZerobss: + ldr r3, = _ebss + cmp r2, r3 + bcc FillZerobss + +/* Call the clock system intitialization function.*/ + bl SystemInit +/* Call static constructors */ + bl __libc_init_array +/* Call the application's entry point.*/ + bl main + +LoopForever: + b LoopForever + +.size Reset_Handler, .-Reset_Handler + +/** + * @brief This is the code that gets called when the processor receives an + * unexpected interrupt. This simply enters an infinite loop, preserving + * the system state for examination by a debugger. + * + * @param None + * @retval : None +*/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + .size Default_Handler, .-Default_Handler +/****************************************************************************** +* +* The minimal vector table for a Cortex-M. Note that the proper constructs +* must be placed on this to ensure that it ends up at physical address +* 0x0000.0000. +* +******************************************************************************/ + .section .isr_vector,"a",%progbits + .type g_pfnVectors, %object + .size g_pfnVectors, .-g_pfnVectors + +g_pfnVectors: + .word _estack + .word Reset_Handler + .word NMI_Handler + .word HardFault_Handler + .word MemManage_Handler + .word BusFault_Handler + .word UsageFault_Handler + .word 0 + .word 0 + .word 0 + .word 0 + .word SVC_Handler + .word DebugMon_Handler + .word 0 + .word PendSV_Handler + .word SysTick_Handler + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + +/******************************************************************************* +* +* Provide weak aliases for each Exception handler to the Default_Handler. +* As they are weak aliases, any function with the same name will override +* this definition. +* +*******************************************************************************/ + + .weak NMI_Handler + .thumb_set NMI_Handler,Default_Handler + + .weak HardFault_Handler + .thumb_set HardFault_Handler,Default_Handler + + .weak MemManage_Handler + .thumb_set MemManage_Handler,Default_Handler + + .weak BusFault_Handler + .thumb_set BusFault_Handler,Default_Handler + + .weak UsageFault_Handler + .thumb_set UsageFault_Handler,Default_Handler + + .weak SVC_Handler + .thumb_set SVC_Handler,Default_Handler + + .weak DebugMon_Handler + .thumb_set DebugMon_Handler,Default_Handler + + .weak PendSV_Handler + .thumb_set PendSV_Handler,Default_Handler + + .weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler + + .weak SystemInit + +/************************ (C) COPYRIGHT Ac6 *****END OF FILE****/ diff --git a/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/hsb-mrts/startup/sysmem.c b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/hsb-mrts/startup/sysmem.c new file mode 100644 index 0000000..bd95902 --- /dev/null +++ b/S - Software/0 - HSB MRTS Kathode-MCP/3 - Implementation/0 - Code/hsb-mrts/startup/sysmem.c @@ -0,0 +1,82 @@ +/** +***************************************************************************** +** +** File : sysmem.c +** +** Author : Ac6 +** +** Abstract : System Workbench Minimal System Memory calls file +** +** For more information about which c-functions +** need which of these lowlevel functions +** please consult the Newlib libc-manual +** +** Environment : System Workbench for MCU +** +** Distribution: The file is distributed “as is,” without any warranty +** of any kind. +** +***************************************************************************** +** +**

© COPYRIGHT(c) 2014 Ac6

+** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** 1. Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** 3. Neither the name of Ac6 nor the names of its contributors +** may be used to endorse or promote products derived from this software +** without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +***************************************************************************** +*/ + +/* Includes */ +#include +#include + +/* Variables */ +extern int errno; +register char * stack_ptr asm("sp"); + +/* Functions */ + +/** + _sbrk + Increase program data space. Malloc and related functions depend on this +**/ +caddr_t _sbrk(int incr) +{ + extern char end asm("end"); + static char *heap_end; + char *prev_heap_end; + + if (heap_end == 0) + heap_end = &end; + + prev_heap_end = heap_end; + if (heap_end + incr > stack_ptr) + { + errno = ENOMEM; + return (caddr_t) -1; + } + + heap_end += incr; + + return (caddr_t) prev_heap_end; +} +